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:
Diffstat (limited to 'source')
-rw-r--r--source/CMakeLists.txt4
-rw-r--r--source/Makefile98
-rw-r--r--source/SConscript5
-rw-r--r--source/blender/CMakeLists.txt9
-rw-r--r--source/blender/Makefile2
-rw-r--r--source/blender/SConscript1
-rw-r--r--source/blender/avi/CMakeLists.txt4
-rw-r--r--source/blender/avi/SConscript3
-rw-r--r--source/blender/avi/intern/avi.c7
-rw-r--r--source/blender/blenfont/BLF_api.h50
-rw-r--r--source/blender/blenfont/CMakeLists.txt15
-rw-r--r--source/blender/blenfont/Makefile4
-rw-r--r--source/blender/blenfont/SConscript10
-rw-r--r--source/blender/blenfont/intern/blf.c121
-rw-r--r--source/blender/blenfont/intern/blf_dir.c5
-rw-r--r--source/blender/blenfont/intern/blf_font.c293
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c348
-rw-r--r--source/blender/blenfont/intern/blf_internal.h3
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h78
-rw-r--r--source/blender/blenfont/intern/blf_lang.c55
-rw-r--r--source/blender/blenkernel/BKE_action.h87
-rw-r--r--source/blender/blenkernel/BKE_anim.h11
-rw-r--r--source/blender/blenkernel/BKE_animsys.h33
-rw-r--r--source/blender/blenkernel/BKE_armature.h7
-rw-r--r--source/blender/blenkernel/BKE_blender.h3
-rw-r--r--source/blender/blenkernel/BKE_boids.h60
-rw-r--r--source/blender/blenkernel/BKE_brush.h12
-rw-r--r--source/blender/blenkernel/BKE_cloth.h11
-rw-r--r--source/blender/blenkernel/BKE_collision.h2
-rw-r--r--source/blender/blenkernel/BKE_colortools.h12
-rw-r--r--source/blender/blenkernel/BKE_constraint.h7
-rw-r--r--source/blender/blenkernel/BKE_context.h43
-rw-r--r--source/blender/blenkernel/BKE_curve.h4
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h18
-rw-r--r--source/blender/blenkernel/BKE_effect.h2
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h61
-rw-r--r--source/blender/blenkernel/BKE_fluidsim.h44
-rw-r--r--source/blender/blenkernel/BKE_global.h49
-rw-r--r--source/blender/blenkernel/BKE_group.h1
-rw-r--r--source/blender/blenkernel/BKE_image.h3
-rw-r--r--source/blender/blenkernel/BKE_key.h5
-rw-r--r--source/blender/blenkernel/BKE_library.h5
-rw-r--r--source/blender/blenkernel/BKE_mball.h1
-rw-r--r--source/blender/blenkernel/BKE_modifier.h9
-rw-r--r--source/blender/blenkernel/BKE_multires.h8
-rw-r--r--source/blender/blenkernel/BKE_nla.h100
-rw-r--r--source/blender/blenkernel/BKE_node.h22
-rw-r--r--source/blender/blenkernel/BKE_object.h10
-rw-r--r--source/blender/blenkernel/BKE_packedFile.h55
-rw-r--r--source/blender/blenkernel/BKE_paint.h (renamed from source/blender/blenkernel/BKE_sculpt.h)44
-rw-r--r--source/blender/blenkernel/BKE_particle.h210
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h222
-rw-r--r--source/blender/blenkernel/BKE_property.h1
-rw-r--r--source/blender/blenkernel/BKE_report.h36
-rw-r--r--source/blender/blenkernel/BKE_sca.h1
-rw-r--r--source/blender/blenkernel/BKE_scene.h13
-rw-r--r--source/blender/blenkernel/BKE_screen.h49
-rw-r--r--source/blender/blenkernel/BKE_sequence.h13
-rw-r--r--source/blender/blenkernel/BKE_shrinkwrap.h4
-rw-r--r--source/blender/blenkernel/BKE_sketch.h157
-rw-r--r--source/blender/blenkernel/BKE_smoke.h46
-rw-r--r--source/blender/blenkernel/BKE_softbody.h7
-rw-r--r--source/blender/blenkernel/BKE_sound.h49
-rw-r--r--source/blender/blenkernel/BKE_text.h14
-rw-r--r--source/blender/blenkernel/BKE_texture.h12
-rw-r--r--source/blender/blenkernel/BKE_unit.h68
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h58
-rw-r--r--source/blender/blenkernel/BKE_writeavi.h5
-rw-r--r--source/blender/blenkernel/BKE_writeffmpeg.h25
-rw-r--r--source/blender/blenkernel/BKE_writeframeserver.h3
-rw-r--r--source/blender/blenkernel/CMakeLists.txt46
-rw-r--r--source/blender/blenkernel/SConscript12
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c3
-rw-r--r--source/blender/blenkernel/intern/Makefile10
-rw-r--r--source/blender/blenkernel/intern/action.c451
-rw-r--r--source/blender/blenkernel/intern/anim.c126
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c1044
-rw-r--r--source/blender/blenkernel/intern/armature.c519
-rw-r--r--source/blender/blenkernel/intern/blender.c30
-rw-r--r--source/blender/blenkernel/intern/boids.c1546
-rw-r--r--source/blender/blenkernel/intern/booleanops.c2
-rw-r--r--source/blender/blenkernel/intern/brush.c188
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c43
-rw-r--r--source/blender/blenkernel/intern/cloth.c223
-rw-r--r--source/blender/blenkernel/intern/collision.c47
-rw-r--r--source/blender/blenkernel/intern/colortools.c89
-rw-r--r--source/blender/blenkernel/intern/constraint.c125
-rw-r--r--source/blender/blenkernel/intern/context.c190
-rw-r--r--source/blender/blenkernel/intern/curve.c769
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c231
-rw-r--r--source/blender/blenkernel/intern/displist.c90
-rw-r--r--source/blender/blenkernel/intern/effect.c31
-rw-r--r--source/blender/blenkernel/intern/exotic.c48
-rw-r--r--source/blender/blenkernel/intern/fcurve.c1192
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c34
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c1197
-rw-r--r--source/blender/blenkernel/intern/font.c17
-rw-r--r--source/blender/blenkernel/intern/gpencil.c7
-rw-r--r--source/blender/blenkernel/intern/group.c10
-rw-r--r--source/blender/blenkernel/intern/idprop.c2
-rw-r--r--source/blender/blenkernel/intern/image.c416
-rw-r--r--source/blender/blenkernel/intern/implicit.c122
-rw-r--r--source/blender/blenkernel/intern/ipo.c163
-rw-r--r--source/blender/blenkernel/intern/key.c128
-rw-r--r--source/blender/blenkernel/intern/lattice.c136
-rw-r--r--source/blender/blenkernel/intern/library.c253
-rw-r--r--source/blender/blenkernel/intern/material.c151
-rw-r--r--source/blender/blenkernel/intern/mball.c51
-rw-r--r--source/blender/blenkernel/intern/mesh.c14
-rw-r--r--source/blender/blenkernel/intern/modifier.c400
-rw-r--r--source/blender/blenkernel/intern/multires.c35
-rw-r--r--source/blender/blenkernel/intern/nla.c1540
-rw-r--r--source/blender/blenkernel/intern/node.c41
-rw-r--r--source/blender/blenkernel/intern/object.c397
-rw-r--r--source/blender/blenkernel/intern/packedFile.c262
-rw-r--r--source/blender/blenkernel/intern/paint.c194
-rw-r--r--source/blender/blenkernel/intern/particle.c2145
-rw-r--r--source/blender/blenkernel/intern/particle_system.c2980
-rw-r--r--source/blender/blenkernel/intern/pointcache.c2206
-rw-r--r--source/blender/blenkernel/intern/property.c64
-rw-r--r--source/blender/blenkernel/intern/report.c25
-rw-r--r--source/blender/blenkernel/intern/sca.c59
-rw-r--r--source/blender/blenkernel/intern/scene.c271
-rw-r--r--source/blender/blenkernel/intern/screen.c52
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c6
-rw-r--r--source/blender/blenkernel/intern/sequence.c213
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c2
-rw-r--r--source/blender/blenkernel/intern/sketch.c600
-rw-r--r--source/blender/blenkernel/intern/smoke.c1399
-rw-r--r--source/blender/blenkernel/intern/softbody.c470
-rw-r--r--source/blender/blenkernel/intern/sound.c517
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c1
-rw-r--r--source/blender/blenkernel/intern/text.c188
-rw-r--r--source/blender/blenkernel/intern/texture.c134
-rw-r--r--source/blender/blenkernel/intern/unit.c585
-rw-r--r--source/blender/blenkernel/intern/world.c17
-rw-r--r--source/blender/blenkernel/intern/writeavi.c5
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c357
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c2
-rw-r--r--source/blender/blenkernel/nla_private.h85
-rw-r--r--source/blender/blenlib/BLI_arithb.h167
-rw-r--r--source/blender/blenlib/BLI_bfile.h138
-rw-r--r--source/blender/blenlib/BLI_dlrbTree.h101
-rw-r--r--source/blender/blenlib/BLI_editVert.h3
-rw-r--r--source/blender/blenlib/BLI_fileops.h5
-rw-r--r--source/blender/blenlib/BLI_ghash.h8
-rw-r--r--source/blender/blenlib/BLI_graph.h1
-rw-r--r--source/blender/blenlib/BLI_kdopbvh.h8
-rw-r--r--source/blender/blenlib/BLI_kdtree.h6
-rw-r--r--source/blender/blenlib/BLI_listbase.h4
-rw-r--r--source/blender/blenlib/BLI_storage_types.h5
-rw-r--r--source/blender/blenlib/BLI_util.h14
-rw-r--r--source/blender/blenlib/BLI_vfontdata.h13
-rw-r--r--source/blender/blenlib/BLI_voxel.h41
-rw-r--r--source/blender/blenlib/BLI_winstuff.h50
-rw-r--r--source/blender/blenlib/CMakeLists.txt13
-rw-r--r--source/blender/blenlib/MTC_matrixops.h162
-rw-r--r--source/blender/blenlib/SConscript5
-rw-r--r--source/blender/blenlib/intern/BLI_bfile.c236
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c152
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c113
-rw-r--r--source/blender/blenlib/intern/BLI_mempool.c5
-rw-r--r--source/blender/blenlib/intern/DLRB_tree.c353
-rw-r--r--source/blender/blenlib/intern/arithb.c879
-rw-r--r--source/blender/blenlib/intern/boxpack2d.c59
-rw-r--r--source/blender/blenlib/intern/bpath.c36
-rw-r--r--source/blender/blenlib/intern/fileops.c66
-rw-r--r--source/blender/blenlib/intern/freetypefont.c7
-rw-r--r--source/blender/blenlib/intern/graph.c6
-rw-r--r--source/blender/blenlib/intern/listbase.c18
-rw-r--r--source/blender/blenlib/intern/matrixops.c438
-rw-r--r--source/blender/blenlib/intern/noise.c12
-rw-r--r--source/blender/blenlib/intern/psfont.c2126
-rw-r--r--source/blender/blenlib/intern/storage.c74
-rw-r--r--source/blender/blenlib/intern/threads.c21
-rw-r--r--source/blender/blenlib/intern/util.c272
-rw-r--r--source/blender/blenlib/intern/vectorops.c166
-rw-r--r--source/blender/blenlib/intern/voxel.c198
-rw-r--r--source/blender/blenloader/BLO_readfile.h19
-rw-r--r--source/blender/blenloader/BLO_sys_types.h2
-rw-r--r--source/blender/blenloader/CMakeLists.txt10
-rw-r--r--source/blender/blenloader/SConscript4
-rw-r--r--source/blender/blenloader/intern/Makefile1
-rw-r--r--source/blender/blenloader/intern/readblenentry.c26
-rw-r--r--source/blender/blenloader/intern/readfile.c1396
-rw-r--r--source/blender/blenloader/intern/readfile.h3
-rw-r--r--source/blender/blenloader/intern/writefile.c399
-rw-r--r--source/blender/blenpluginapi/CMakeLists.txt6
-rw-r--r--source/blender/blenpluginapi/SConscript2
-rw-r--r--source/blender/editors/CMakeLists.txt57
-rw-r--r--source/blender/editors/Makefile41
-rw-r--r--source/blender/editors/SConscript4
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c2337
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c (renamed from source/blender/editors/animation/anim_channels.c)764
-rw-r--r--source/blender/editors/animation/anim_deps.c86
-rw-r--r--source/blender/editors/animation/anim_draw.c100
-rw-r--r--source/blender/editors/animation/anim_filter.c1048
-rw-r--r--source/blender/editors/animation/anim_intern.h30
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c29
-rw-r--r--source/blender/editors/animation/anim_markers.c10
-rw-r--r--source/blender/editors/animation/anim_ops.c51
-rw-r--r--source/blender/editors/animation/drivers.c80
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c679
-rw-r--r--source/blender/editors/animation/keyframes_draw.c766
-rw-r--r--source/blender/editors/animation/keyframes_edit.c65
-rw-r--r--source/blender/editors/animation/keyframes_general.c207
-rw-r--r--source/blender/editors/animation/keyframing.c560
-rw-r--r--source/blender/editors/animation/keyingsets.c335
-rw-r--r--source/blender/editors/armature/BIF_retarget.h2
-rw-r--r--source/blender/editors/armature/armature_intern.h65
-rw-r--r--source/blender/editors/armature/armature_ops.c149
-rw-r--r--source/blender/editors/armature/editarmature.c966
-rw-r--r--source/blender/editors/armature/editarmature_generate.c26
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c20
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c1729
-rw-r--r--source/blender/editors/armature/meshlaplacian.c32
-rw-r--r--source/blender/editors/armature/poseSlide.c936
-rw-r--r--source/blender/editors/armature/poselib.c107
-rw-r--r--source/blender/editors/armature/poseobject.c1705
-rw-r--r--source/blender/editors/armature/reeb.c3
-rw-r--r--source/blender/editors/armature/reeb.h1
-rw-r--r--source/blender/editors/curve/curve_intern.h5
-rw-r--r--source/blender/editors/curve/curve_ops.c26
-rw-r--r--source/blender/editors/curve/editcurve.c457
-rw-r--r--source/blender/editors/curve/editfont.c43
-rw-r--r--source/blender/editors/datafiles/B.blend.c5696
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c11238
-rw-r--r--source/blender/editors/datafiles/preview.blend.c31917
-rw-r--r--source/blender/editors/datafiles/splash.png.c (renamed from source/blender/editors/datafiles/splash.jpg.c)6
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c381
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c281
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c1724
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h32
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c86
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c1434
-rw-r--r--source/blender/editors/include/BIF_gl.h27
-rw-r--r--source/blender/editors/include/BIF_glutil.h7
-rw-r--r--source/blender/editors/include/BIF_transform.h165
-rw-r--r--source/blender/editors/include/ED_anim_api.h238
-rw-r--r--source/blender/editors/include/ED_armature.h35
-rw-r--r--source/blender/editors/include/ED_curve.h3
-rw-r--r--source/blender/editors/include/ED_datafiles.h4
-rw-r--r--source/blender/editors/include/ED_fileselect.h38
-rw-r--r--source/blender/editors/include/ED_fluidsim.h2
-rw-r--r--source/blender/editors/include/ED_gpencil.h36
-rw-r--r--source/blender/editors/include/ED_image.h3
-rw-r--r--source/blender/editors/include/ED_info.h (renamed from source/gameengine/Expressions/KX_Python_dynamic.h)20
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h81
-rw-r--r--source/blender/editors/include/ED_keyframes_edit.h4
-rw-r--r--source/blender/editors/include/ED_keyframing.h41
-rw-r--r--source/blender/editors/include/ED_markers.h2
-rw-r--r--source/blender/editors/include/ED_mball.h45
-rw-r--r--source/blender/editors/include/ED_mesh.h65
-rw-r--r--source/blender/editors/include/ED_node.h14
-rw-r--r--source/blender/editors/include/ED_object.h24
-rw-r--r--source/blender/editors/include/ED_particle.h11
-rw-r--r--source/blender/editors/include/ED_physics.h (renamed from source/blender/editors/include/ED_pointcache.h)3
-rw-r--r--source/blender/editors/include/ED_previewrender.h7
-rw-r--r--source/blender/editors/include/ED_retopo.h (renamed from source/blender/editors/include/BIF_retopo.h)5
-rw-r--r--source/blender/editors/include/ED_screen.h19
-rw-r--r--source/blender/editors/include/ED_screen_types.h18
-rw-r--r--source/blender/editors/include/ED_sculpt.h2
-rw-r--r--source/blender/editors/include/ED_sound.h35
-rw-r--r--source/blender/editors/include/ED_space_api.h2
-rw-r--r--source/blender/editors/include/ED_transform.h151
-rw-r--r--source/blender/editors/include/ED_util.h1
-rw-r--r--source/blender/editors/include/ED_view3d.h3
-rw-r--r--source/blender/editors/include/UI_icons.h38
-rw-r--r--source/blender/editors/include/UI_interface.h123
-rw-r--r--source/blender/editors/include/UI_view2d.h17
-rw-r--r--source/blender/editors/interface/Makefile1
-rw-r--r--source/blender/editors/interface/SConscript1
-rw-r--r--source/blender/editors/interface/interface.c371
-rw-r--r--source/blender/editors/interface/interface_anim.c181
-rw-r--r--source/blender/editors/interface/interface_draw.c12
-rw-r--r--source/blender/editors/interface/interface_handlers.c466
-rw-r--r--source/blender/editors/interface/interface_icons.c41
-rw-r--r--source/blender/editors/interface/interface_intern.h39
-rw-r--r--source/blender/editors/interface/interface_layout.c495
-rw-r--r--source/blender/editors/interface/interface_panel.c96
-rw-r--r--source/blender/editors/interface/interface_regions.c1052
-rw-r--r--source/blender/editors/interface/interface_style.c44
-rw-r--r--source/blender/editors/interface/interface_templates.c1582
-rw-r--r--source/blender/editors/interface/interface_utils.c948
-rw-r--r--source/blender/editors/interface/interface_widgets.c427
-rw-r--r--source/blender/editors/interface/keyval.c540
-rw-r--r--source/blender/editors/interface/resources.c81
-rw-r--r--source/blender/editors/interface/view2d.c518
-rw-r--r--source/blender/editors/interface/view2d_ops.c149
-rw-r--r--source/blender/editors/mesh/editdeform.c1110
-rw-r--r--source/blender/editors/mesh/editmesh.c229
-rw-r--r--source/blender/editors/mesh/editmesh_add.c124
-rw-r--r--source/blender/editors/mesh/editmesh_loop.c25
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c673
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c3276
-rw-r--r--source/blender/editors/mesh/loopcut.c451
-rw-r--r--source/blender/editors/mesh/mesh_intern.h41
-rw-r--r--source/blender/editors/mesh/mesh_layers.c411
-rw-r--r--source/blender/editors/mesh/mesh_ops.c288
-rw-r--r--source/blender/editors/mesh/meshtools.c533
-rw-r--r--source/blender/editors/metaball/Makefile56
-rw-r--r--source/blender/editors/metaball/SConscript11
-rw-r--r--source/blender/editors/metaball/mball_edit.c686
-rw-r--r--source/blender/editors/metaball/mball_intern.h47
-rw-r--r--source/blender/editors/metaball/mball_ops.c74
-rw-r--r--source/blender/editors/object/Makefile1
-rw-r--r--source/blender/editors/object/SConscript2
-rw-r--r--source/blender/editors/object/editconstraint.c1086
-rw-r--r--source/blender/editors/object/object_add.c1490
-rw-r--r--source/blender/editors/object/object_constraint.c1450
-rw-r--r--source/blender/editors/object/object_edit.c5098
-rw-r--r--source/blender/editors/object/object_group.c (renamed from source/blender/editors/object/editgroup.c)193
-rw-r--r--source/blender/editors/object/object_hook.c608
-rw-r--r--source/blender/editors/object/object_intern.h127
-rw-r--r--source/blender/editors/object/object_lattice.c (renamed from source/blender/editors/object/editlattice.c)183
-rw-r--r--source/blender/editors/object/object_modifier.c670
-rw-r--r--source/blender/editors/object/object_ops.c165
-rw-r--r--source/blender/editors/object/object_relations.c1773
-rw-r--r--source/blender/editors/object/object_select.c1026
-rw-r--r--source/blender/editors/object/object_shapekey.c (renamed from source/blender/editors/object/editkey.c)203
-rw-r--r--source/blender/editors/object/object_transform.c926
-rw-r--r--source/blender/editors/object/object_vgroup.c1321
-rw-r--r--source/blender/editors/physics/ed_fluidsim.c144
-rw-r--r--source/blender/editors/physics/ed_pointcache.c209
-rw-r--r--source/blender/editors/physics/editparticle.c2377
-rw-r--r--source/blender/editors/physics/physics_boids.c430
-rw-r--r--source/blender/editors/preview/previewrender.c194
-rw-r--r--source/blender/editors/screen/CMakeLists.txt42
-rw-r--r--source/blender/editors/screen/Makefile5
-rw-r--r--source/blender/editors/screen/SConscript2
-rw-r--r--source/blender/editors/screen/area.c393
-rw-r--r--source/blender/editors/screen/glutil.c25
-rw-r--r--source/blender/editors/screen/screen_context.c72
-rw-r--r--source/blender/editors/screen/screen_edit.c138
-rw-r--r--source/blender/editors/screen/screen_intern.h1
-rw-r--r--source/blender/editors/screen/screen_ops.c962
-rw-r--r--source/blender/editors/screen/screendump.c26
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c194
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h29
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c149
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c330
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c54
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c986
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c1283
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h4
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_stroke.c274
-rw-r--r--source/blender/editors/sound/Makefile51
-rw-r--r--source/blender/editors/sound/SConscript14
-rw-r--r--source/blender/editors/sound/sound_intern.h37
-rw-r--r--source/blender/editors/sound/sound_ops.c293
-rw-r--r--source/blender/editors/space_action/action_draw.c991
-rw-r--r--source/blender/editors/space_action/action_edit.c391
-rw-r--r--source/blender/editors/space_action/action_header.c1651
-rw-r--r--source/blender/editors/space_action/action_intern.h40
-rw-r--r--source/blender/editors/space_action/action_ops.c105
-rw-r--r--source/blender/editors/space_action/action_select.c193
-rw-r--r--source/blender/editors/space_action/space_action.c29
-rw-r--r--source/blender/editors/space_api/spacetypes.c23
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c143
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c107
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h23
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c738
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c181
-rw-r--r--source/blender/editors/space_console/Makefile52
-rw-r--r--source/blender/editors/space_console/SConscript22
-rw-r--r--source/blender/editors/space_console/console_draw.c348
-rw-r--r--source/blender/editors/space_console/console_intern.h82
-rw-r--r--source/blender/editors/space_console/console_ops.c801
-rw-r--r--source/blender/editors/space_console/console_report.c420
-rw-r--r--source/blender/editors/space_console/space_console.c380
-rw-r--r--source/blender/editors/space_file/Makefile4
-rw-r--r--source/blender/editors/space_file/SConscript2
-rw-r--r--source/blender/editors/space_file/file_draw.c555
-rw-r--r--source/blender/editors/space_file/file_header.c187
-rw-r--r--source/blender/editors/space_file/file_intern.h35
-rw-r--r--source/blender/editors/space_file/file_ops.c718
-rw-r--r--source/blender/editors/space_file/file_panels.c237
-rw-r--r--source/blender/editors/space_file/filelist.c483
-rw-r--r--source/blender/editors/space_file/filelist.h19
-rw-r--r--source/blender/editors/space_file/filesel.c275
-rw-r--r--source/blender/editors/space_file/fsmenu.c112
-rw-r--r--source/blender/editors/space_file/fsmenu.h13
-rw-r--r--source/blender/editors/space_file/space_file.c297
-rw-r--r--source/blender/editors/space_file/writeimage.c5
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c700
-rw-r--r--source/blender/editors/space_graph/graph_draw.c622
-rw-r--r--source/blender/editors/space_graph/graph_edit.c483
-rw-r--r--source/blender/editors/space_graph/graph_header.c259
-rw-r--r--source/blender/editors/space_graph/graph_intern.h66
-rw-r--r--source/blender/editors/space_graph/graph_ops.c159
-rw-r--r--source/blender/editors/space_graph/graph_select.c109
-rw-r--r--source/blender/editors/space_graph/graph_utils.c288
-rw-r--r--source/blender/editors/space_graph/space_graph.c69
-rw-r--r--source/blender/editors/space_image/Makefile4
-rw-r--r--source/blender/editors/space_image/SConscript2
-rw-r--r--source/blender/editors/space_image/image_buttons.c818
-rw-r--r--source/blender/editors/space_image/image_draw.c90
-rw-r--r--source/blender/editors/space_image/image_header.c533
-rw-r--r--source/blender/editors/space_image/image_intern.h1
-rw-r--r--source/blender/editors/space_image/image_ops.c223
-rw-r--r--source/blender/editors/space_image/image_render.c2
-rw-r--r--source/blender/editors/space_image/space_image.c98
-rw-r--r--source/blender/editors/space_info/info_header.c507
-rw-r--r--source/blender/editors/space_info/info_intern.h10
-rw-r--r--source/blender/editors/space_info/info_ops.c397
-rw-r--r--source/blender/editors/space_info/info_stats.c434
-rw-r--r--source/blender/editors/space_info/space_info.c67
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c19
-rw-r--r--source/blender/editors/space_logic/logic_header.c6
-rw-r--r--source/blender/editors/space_logic/logic_window.c461
-rw-r--r--source/blender/editors/space_logic/space_logic.c27
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c477
-rw-r--r--source/blender/editors/space_nla/nla_channels.c457
-rw-r--r--source/blender/editors/space_nla/nla_draw.c909
-rw-r--r--source/blender/editors/space_nla/nla_edit.c1600
-rw-r--r--source/blender/editors/space_nla/nla_header.c229
-rw-r--r--source/blender/editors/space_nla/nla_intern.h101
-rw-r--r--source/blender/editors/space_nla/nla_ops.c307
-rw-r--r--source/blender/editors/space_nla/nla_select.c614
-rw-r--r--source/blender/editors/space_nla/space_nla.c359
-rw-r--r--source/blender/editors/space_node/SConscript2
-rw-r--r--source/blender/editors/space_node/drawnode.c2445
-rw-r--r--source/blender/editors/space_node/node_draw.c214
-rw-r--r--source/blender/editors/space_node/node_edit.c426
-rw-r--r--source/blender/editors/space_node/node_header.c658
-rw-r--r--source/blender/editors/space_node/node_intern.h16
-rw-r--r--source/blender/editors/space_node/node_ops.c23
-rw-r--r--source/blender/editors/space_node/node_select.c134
-rw-r--r--source/blender/editors/space_node/node_state.c10
-rw-r--r--source/blender/editors/space_node/space_node.c73
-rw-r--r--source/blender/editors/space_outliner/outliner.c1805
-rw-r--r--source/blender/editors/space_outliner/outliner_header.c10
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h24
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c51
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c15
-rw-r--r--source/blender/editors/space_script/script_edit.c8
-rw-r--r--source/blender/editors/space_script/script_ops.c4
-rw-r--r--source/blender/editors/space_script/space_script.c4
-rw-r--r--source/blender/editors/space_sequencer/Makefile1
-rw-r--r--source/blender/editors/space_sequencer/SConscript1
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c186
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c11
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c115
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c133
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h4
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c23
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c34
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c15
-rw-r--r--source/blender/editors/space_sound/space_sound.c4
-rw-r--r--source/blender/editors/space_text/space_text.c50
-rw-r--r--source/blender/editors/space_text/text_draw.c240
-rw-r--r--source/blender/editors/space_text/text_header.c15
-rw-r--r--source/blender/editors/space_text/text_intern.h5
-rw-r--r--source/blender/editors/space_text/text_ops.c219
-rw-r--r--source/blender/editors/space_text/text_python.c12
-rw-r--r--source/blender/editors/space_time/space_time.c145
-rw-r--r--source/blender/editors/space_time/time_header.c612
-rw-r--r--source/blender/editors/space_time/time_ops.c4
-rw-r--r--source/blender/editors/space_userpref/Makefile55
-rw-r--r--source/blender/editors/space_userpref/SConscript14
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c188
-rw-r--r--source/blender/editors/space_userpref/userpref_intern.h34
-rw-r--r--source/blender/editors/space_userpref/userpref_ops.c33
-rw-r--r--source/blender/editors/space_view3d/Makefile5
-rw-r--r--source/blender/editors/space_view3d/SConscript2
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c222
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c11
-rw-r--r--source/blender/editors/space_view3d/drawobject.c1233
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c426
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c338
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c764
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c235
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c343
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c3728
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h24
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c87
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c227
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c41
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c209
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c950
-rw-r--r--source/blender/editors/transform/transform.c2407
-rw-r--r--source/blender/editors/transform/transform.h102
-rw-r--r--source/blender/editors/transform/transform_constraints.c207
-rw-r--r--source/blender/editors/transform/transform_conversions.c1563
-rw-r--r--source/blender/editors/transform/transform_generics.c717
-rw-r--r--source/blender/editors/transform/transform_input.c106
-rw-r--r--source/blender/editors/transform/transform_manipulator.c1124
-rw-r--r--source/blender/editors/transform/transform_ndofinput.c10
-rw-r--r--source/blender/editors/transform/transform_ops.c294
-rw-r--r--source/blender/editors/transform/transform_orientations.c70
-rw-r--r--source/blender/editors/transform/transform_snap.c3
-rw-r--r--source/blender/editors/util/editmode_undo.c17
-rw-r--r--source/blender/editors/util/undo.c89
-rw-r--r--source/blender/editors/util/util_intern.h1
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c33
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c171
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c80
-rw-r--r--source/blender/gpu/CMakeLists.txt4
-rw-r--r--source/blender/gpu/GPU_draw.h15
-rw-r--r--source/blender/gpu/GPU_extensions.h3
-rw-r--r--source/blender/gpu/GPU_material.h2
-rw-r--r--source/blender/gpu/SConscript4
-rw-r--r--source/blender/gpu/intern/Makefile1
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c4
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c148
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c76
-rw-r--r--source/blender/gpu/intern/gpu_material.c46
-rw-r--r--source/blender/ikplugin/BIK_api.h93
-rw-r--r--source/blender/ikplugin/CMakeLists.txt35
-rw-r--r--source/blender/ikplugin/Makefile31
-rw-r--r--source/blender/ikplugin/SConscript9
-rw-r--r--source/blender/ikplugin/intern/Makefile49
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c140
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.h60
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c527
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.h47
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp1786
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.h52
-rw-r--r--source/blender/imbuf/CMakeLists.txt28
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h18
-rw-r--r--source/blender/imbuf/SConscript2
-rw-r--r--source/blender/imbuf/intern/IMB_targa.h2
-rw-r--r--source/blender/imbuf/intern/anim.c36
-rw-r--r--source/blender/imbuf/intern/anim5.c16
-rw-r--r--source/blender/imbuf/intern/cineon/CMakeLists.txt16
-rw-r--r--source/blender/imbuf/intern/cineon/SConscript2
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt18
-rw-r--r--source/blender/imbuf/intern/dds/SConscript2
-rw-r--r--source/blender/imbuf/intern/divers.c54
-rw-r--r--source/blender/imbuf/intern/filter.c88
-rw-r--r--source/blender/imbuf/intern/hamx.c10
-rw-r--r--source/blender/imbuf/intern/iff.c7
-rw-r--r--source/blender/imbuf/intern/iris.c312
-rw-r--r--source/blender/imbuf/intern/jp2.c4
-rw-r--r--source/blender/imbuf/intern/openexr/CMakeLists.txt20
-rw-r--r--source/blender/imbuf/intern/openexr/Makefile3
-rw-r--r--source/blender/imbuf/intern/openexr/SConscript4
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp1
-rw-r--r--source/blender/imbuf/intern/readimage.c4
-rw-r--r--source/blender/imbuf/intern/targa.c71
-rw-r--r--source/blender/imbuf/intern/thumbs.c20
-rw-r--r--source/blender/imbuf/intern/util.c3
-rw-r--r--source/blender/imbuf/intern/writeimage.c8
-rw-r--r--source/blender/makesdna/DNA_ID.h65
-rw-r--r--source/blender/makesdna/DNA_action_types.h153
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h50
-rw-r--r--source/blender/makesdna/DNA_anim_types.h292
-rw-r--r--source/blender/makesdna/DNA_armature_types.h8
-rw-r--r--source/blender/makesdna/DNA_boid_types.h223
-rw-r--r--source/blender/makesdna/DNA_brush_types.h29
-rw-r--r--source/blender/makesdna/DNA_camera_types.h3
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h2
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h57
-rw-r--r--source/blender/makesdna/DNA_curve_types.h74
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h4
-rw-r--r--source/blender/makesdna/DNA_image_types.h7
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h6
-rw-r--r--source/blender/makesdna/DNA_material_types.h86
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h2
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h7
-rw-r--r--source/blender/makesdna/DNA_meta_types.h21
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h42
-rw-r--r--source/blender/makesdna/DNA_node_types.h2
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim.h11
-rw-r--r--source/blender/makesdna/DNA_object_force.h75
-rw-r--r--source/blender/makesdna/DNA_object_types.h59
-rw-r--r--source/blender/makesdna/DNA_particle_types.h169
-rw-r--r--source/blender/makesdna/DNA_property_types.h7
-rw-r--r--source/blender/makesdna/DNA_scene_types.h260
-rw-r--r--source/blender/makesdna/DNA_screen_types.h21
-rw-r--r--source/blender/makesdna/DNA_scriptlink_types.h79
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h20
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h6
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h123
-rw-r--r--source/blender/makesdna/DNA_sound_types.h157
-rw-r--r--source/blender/makesdna/DNA_space_types.h211
-rw-r--r--source/blender/makesdna/DNA_texture_types.h148
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h37
-rw-r--r--source/blender/makesdna/DNA_view2d_types.h16
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h9
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h130
-rw-r--r--source/blender/makesdna/DNA_world_types.h24
-rw-r--r--source/blender/makesdna/SConscript2
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt6
-rw-r--r--source/blender/makesdna/intern/SConscript3
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c5
-rw-r--r--source/blender/makesdna/intern/makesdna.c16
-rw-r--r--source/blender/makesrna/RNA_access.h119
-rw-r--r--source/blender/makesrna/RNA_define.h36
-rw-r--r--source/blender/makesrna/RNA_enum_types.h15
-rw-r--r--source/blender/makesrna/RNA_types.h120
-rw-r--r--source/blender/makesrna/SConscript35
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt57
-rw-r--r--source/blender/makesrna/intern/Makefile15
-rw-r--r--source/blender/makesrna/intern/SConscript44
-rw-r--r--source/blender/makesrna/intern/makesrna.c418
-rw-r--r--source/blender/makesrna/intern/rna_ID.c30
-rw-r--r--source/blender/makesrna/intern/rna_access.c932
-rw-r--r--source/blender/makesrna/intern/rna_action.c26
-rw-r--r--source/blender/makesrna/intern/rna_action_api.c80
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c4
-rw-r--r--source/blender/makesrna/intern/rna_animation.c68
-rw-r--r--source/blender/makesrna/intern/rna_animation_api.c89
-rw-r--r--source/blender/makesrna/intern/rna_armature.c686
-rw-r--r--source/blender/makesrna/intern/rna_boid.c618
-rw-r--r--source/blender/makesrna/intern/rna_brush.c181
-rw-r--r--source/blender/makesrna/intern/rna_camera.c7
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c74
-rw-r--r--source/blender/makesrna/intern/rna_color.c10
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c336
-rw-r--r--source/blender/makesrna/intern/rna_context.c64
-rw-r--r--source/blender/makesrna/intern/rna_curve.c339
-rw-r--r--source/blender/makesrna/intern/rna_define.c531
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c306
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c146
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c252
-rw-r--r--source/blender/makesrna/intern/rna_group.c6
-rw-r--r--source/blender/makesrna/intern/rna_image.c195
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c82
-rw-r--r--source/blender/makesrna/intern/rna_internal.h33
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h34
-rw-r--r--source/blender/makesrna/intern/rna_key.c95
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c108
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c119
-rw-r--r--source/blender/makesrna/intern/rna_main.c89
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c133
-rw-r--r--source/blender/makesrna/intern/rna_material.c790
-rw-r--r--source/blender/makesrna/intern/rna_material_api.c126
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c502
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c296
-rw-r--r--source/blender/makesrna/intern/rna_meta.c90
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c656
-rw-r--r--source/blender/makesrna/intern/rna_nla.c488
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c627
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h7
-rw-r--r--source/blender/makesrna/intern/rna_object.c636
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c397
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c753
-rw-r--r--source/blender/makesrna/intern/rna_packedfile.c7
-rw-r--r--source/blender/makesrna/intern/rna_particle.c1369
-rw-r--r--source/blender/makesrna/intern/rna_pose.c938
-rw-r--r--source/blender/makesrna/intern/rna_pose_api.c (renamed from source/blender/makesrna/intern/rna_scriptlink.c)28
-rw-r--r--source/blender/makesrna/intern/rna_property.c24
-rw-r--r--source/blender/makesrna/intern/rna_render.c410
-rw-r--r--source/blender/makesrna/intern/rna_rna.c279
-rw-r--r--source/blender/makesrna/intern/rna_scene.c1433
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c156
-rw-r--r--source/blender/makesrna/intern/rna_screen.c61
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c523
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c68
-rw-r--r--source/blender/makesrna/intern/rna_sequence.c147
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c280
-rw-r--r--source/blender/makesrna/intern/rna_sound.c176
-rw-r--r--source/blender/makesrna/intern/rna_space.c905
-rw-r--r--source/blender/makesrna/intern/rna_test.c188
-rw-r--r--source/blender/makesrna/intern/rna_text.c8
-rw-r--r--source/blender/makesrna/intern/rna_text_api.c49
-rw-r--r--source/blender/makesrna/intern/rna_texture.c603
-rw-r--r--source/blender/makesrna/intern/rna_timeline.c2
-rw-r--r--source/blender/makesrna/intern/rna_ui.c252
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c90
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c993
-rw-r--r--source/blender/makesrna/intern/rna_vpaint.c86
-rw-r--r--source/blender/makesrna/intern/rna_wm.c137
-rw-r--r--source/blender/makesrna/intern/rna_world.c129
-rw-r--r--source/blender/nodes/CMP_node.h7
-rw-r--r--source/blender/nodes/CMakeLists.txt27
-rw-r--r--source/blender/nodes/SConscript10
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c132
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c174
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c145
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c23
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_levels.c337
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c6
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c44
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile1
-rw-r--r--source/blender/nodes/intern/CMP_util.c26
-rw-r--r--source/blender/nodes/intern/CMP_util.h5
-rw-r--r--source/blender/nodes/intern/Makefile1
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile1
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c2
-rw-r--r--source/blender/nodes/intern/TEX_nodes/Makefile1
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_at.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_bricks.c20
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_checker.c16
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_compose.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_coord.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_curves.c13
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_decompose.c18
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_distance.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c12
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_image.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_invert.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_math.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c10
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_output.c133
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_proc.c86
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_rotate.c23
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_scale.c16
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_texture.c9
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_translate.c16
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c16
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c10
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_viewer.c2
-rw-r--r--source/blender/nodes/intern/TEX_util.c116
-rw-r--r--source/blender/nodes/intern/TEX_util.h24
-rw-r--r--source/blender/python/BPY_extern.h13
-rw-r--r--source/blender/python/CMakeLists.txt16
-rw-r--r--source/blender/python/SConscript8
-rw-r--r--source/blender/python/epy_doc_gen.py317
-rw-r--r--source/blender/python/generic/BGL.c14
-rw-r--r--[-rwxr-xr-x]source/blender/python/generic/BGL.h16
-rw-r--r--source/blender/python/generic/Geometry.c22
-rw-r--r--source/blender/python/generic/Geometry.h2
-rw-r--r--source/blender/python/generic/Makefile2
-rw-r--r--source/blender/python/generic/Mathutils.c84
-rw-r--r--source/blender/python/generic/Mathutils.h13
-rw-r--r--source/blender/python/generic/bpy_internal_import.c28
-rw-r--r--source/blender/python/generic/bpy_internal_import.h10
-rw-r--r--source/blender/python/generic/euler.c129
-rw-r--r--source/blender/python/generic/euler.h6
-rw-r--r--source/blender/python/generic/matrix.c294
-rw-r--r--source/blender/python/generic/matrix.h5
-rw-r--r--source/blender/python/generic/quat.c158
-rw-r--r--source/blender/python/generic/quat.h6
-rw-r--r--source/blender/python/generic/vector.c982
-rw-r--r--source/blender/python/generic/vector.h6
-rw-r--r--source/blender/python/intern/Makefile2
-rw-r--r--source/blender/python/intern/bpy_array.c515
-rw-r--r--source/blender/python/intern/bpy_compat.h120
-rw-r--r--source/blender/python/intern/bpy_interface.c447
-rw-r--r--source/blender/python/intern/bpy_operator.c214
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c132
-rw-r--r--source/blender/python/intern/bpy_rna.c2316
-rw-r--r--source/blender/python/intern/bpy_rna.h28
-rw-r--r--source/blender/python/intern/bpy_scriptlink.c73
-rw-r--r--source/blender/python/intern/bpy_ui.c504
-rw-r--r--source/blender/python/intern/bpy_util.c83
-rw-r--r--source/blender/python/intern/bpy_util.h12
-rw-r--r--source/blender/python/intern/stubs.c2
-rw-r--r--source/blender/quicktime/CMakeLists.txt24
-rw-r--r--source/blender/quicktime/SConscript4
-rw-r--r--source/blender/readblenfile/CMakeLists.txt2
-rw-r--r--source/blender/readblenfile/SConscript2
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c1
-rw-r--r--source/blender/render/CMakeLists.txt16
-rw-r--r--source/blender/render/SConscript4
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h56
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h6
-rw-r--r--source/blender/render/intern/include/pointdensity.h44
-rw-r--r--source/blender/render/intern/include/render_types.h47
-rw-r--r--source/blender/render/intern/include/shading.h7
-rw-r--r--source/blender/render/intern/include/texture.h1
-rw-r--r--source/blender/render/intern/include/volume_precache.h (renamed from source/gameengine/Expressions/KX_Python_static.h)15
-rw-r--r--source/blender/render/intern/include/volumetric.h47
-rw-r--r--source/blender/render/intern/include/voxeldata.h45
-rw-r--r--source/blender/render/intern/source/Makefile3
-rw-r--r--source/blender/render/intern/source/convertblender.c482
-rw-r--r--source/blender/render/intern/source/envmap.c80
-rw-r--r--source/blender/render/intern/source/imagetexture.c948
-rw-r--r--source/blender/render/intern/source/initrender.c5
-rw-r--r--source/blender/render/intern/source/occlusion.c23
-rw-r--r--source/blender/render/intern/source/pipeline.c383
-rw-r--r--source/blender/render/intern/source/pixelshading.c34
-rw-r--r--source/blender/render/intern/source/pointdensity.c485
-rw-r--r--source/blender/render/intern/source/rayshade.c94
-rw-r--r--source/blender/render/intern/source/raytrace.c2
-rw-r--r--source/blender/render/intern/source/rendercore.c19
-rw-r--r--source/blender/render/intern/source/shadbuf.c20
-rw-r--r--source/blender/render/intern/source/shadeinput.c134
-rw-r--r--source/blender/render/intern/source/shadeoutput.c23
-rw-r--r--source/blender/render/intern/source/sss.c19
-rw-r--r--source/blender/render/intern/source/strand.c12
-rw-r--r--source/blender/render/intern/source/texture.c767
-rw-r--r--source/blender/render/intern/source/volume_precache.c746
-rw-r--r--source/blender/render/intern/source/volumetric.c750
-rw-r--r--source/blender/render/intern/source/voxeldata.c344
-rw-r--r--source/blender/render/intern/source/zbuf.c52
-rw-r--r--source/blender/windowmanager/CMakeLists.txt46
-rw-r--r--source/blender/windowmanager/WM_api.h66
-rw-r--r--source/blender/windowmanager/WM_types.h76
-rw-r--r--source/blender/windowmanager/intern/Makefile3
-rw-r--r--source/blender/windowmanager/intern/wm.c42
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c13
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c4
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c439
-rw-r--r--source/blender/windowmanager/intern/wm_files.c100
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c2
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c66
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c57
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c179
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c883
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c2
-rw-r--r--source/blender/windowmanager/intern/wm_window.c287
-rw-r--r--source/blender/windowmanager/wm.h4
-rw-r--r--source/blender/windowmanager/wm_event_system.h2
-rw-r--r--source/blender/windowmanager/wm_event_types.h18
-rw-r--r--source/blender/windowmanager/wm_window.h2
-rw-r--r--source/blenderplayer/CMakeLists.txt144
-rw-r--r--source/blenderplayer/bad_level_call_stubs/CMakeLists.txt40
-rw-r--r--source/blenderplayer/bad_level_call_stubs/Makefile45
-rw-r--r--source/blenderplayer/bad_level_call_stubs/SConscript13
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c201
-rw-r--r--source/creator/CMakeLists.txt596
-rw-r--r--source/creator/Makefile1
-rw-r--r--source/creator/SConscript5
-rw-r--r--source/creator/creator.c141
-rw-r--r--source/darwin/Makefile5
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp114
-rw-r--r--source/gameengine/BlenderRoutines/CMakeLists.txt72
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp2
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.h11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp35
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp13
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h11
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderSystem.h12
-rw-r--r--source/gameengine/BlenderRoutines/Makefile4
-rw-r--r--source/gameengine/BlenderRoutines/SConscript13
-rw-r--r--source/gameengine/CMakeLists.txt2
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp580
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.h36
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.cpp265
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.h89
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp461
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.h91
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.cpp447
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.h117
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp494
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.h56
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp151
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.h4
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.h7
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.h9
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.h6
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp460
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.h32
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp4
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.h6
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.h6
-rw-r--r--source/gameengine/Converter/BL_SkinMeshObject.cpp4
-rw-r--r--source/gameengine/Converter/BL_SkinMeshObject.h9
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.h7
-rw-r--r--source/gameengine/Converter/CMakeLists.txt77
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp2
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.h16
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp101
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h27
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp209
-rw-r--r--source/gameengine/Converter/KX_ConvertProperties.cpp10
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp37
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.h1
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp2
-rw-r--r--source/gameengine/Converter/Makefile5
-rw-r--r--source/gameengine/Converter/SConscript6
-rw-r--r--source/gameengine/Expressions/BoolValue.cpp3
-rw-r--r--source/gameengine/Expressions/BoolValue.h7
-rw-r--r--source/gameengine/Expressions/CMakeLists.txt15
-rw-r--r--source/gameengine/Expressions/ConstExpr.h7
-rw-r--r--source/gameengine/Expressions/EmptyValue.h7
-rw-r--r--source/gameengine/Expressions/ErrorValue.h7
-rw-r--r--source/gameengine/Expressions/Expression.h13
-rw-r--r--source/gameengine/Expressions/FloatValue.h6
-rw-r--r--source/gameengine/Expressions/IdentifierExpr.h7
-rw-r--r--source/gameengine/Expressions/IfExpr.h7
-rw-r--r--source/gameengine/Expressions/InputParser.h8
-rw-r--r--source/gameengine/Expressions/IntValue.cpp2
-rw-r--r--source/gameengine/Expressions/IntValue.h6
-rw-r--r--source/gameengine/Expressions/KX_HashedPtr.h11
-rw-r--r--source/gameengine/Expressions/KX_Python.h11
-rw-r--r--source/gameengine/Expressions/ListValue.cpp81
-rw-r--r--source/gameengine/Expressions/ListValue.h5
-rw-r--r--source/gameengine/Expressions/Operator1Expr.h7
-rw-r--r--source/gameengine/Expressions/Operator2Expr.h8
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp744
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h330
-rw-r--r--source/gameengine/Expressions/SConscript9
-rw-r--r--source/gameengine/Expressions/StringValue.h9
-rw-r--r--source/gameengine/Expressions/Value.cpp145
-rw-r--r--source/gameengine/Expressions/Value.h37
-rw-r--r--source/gameengine/Expressions/VectorValue.h7
-rw-r--r--source/gameengine/Expressions/VoidValue.h7
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt23
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.cpp68
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.h13
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.h10
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.cpp82
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.h12
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysEventManager.h5
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.h12
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.cpp62
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.h (renamed from source/blender/blenlib/MTC_vectorops.h)45
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.cpp139
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.h15
-rw-r--r--source/gameengine/GameLogic/SCA_EventManager.h11
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.cpp5
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.h14
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.h38
-rw-r--r--source/gameengine/GameLogic/SCA_IController.cpp153
-rw-r--r--source/gameengine/GameLogic/SCA_IController.h12
-rw-r--r--source/gameengine/GameLogic/SCA_IInputDevice.h10
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.cpp93
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.h10
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.cpp116
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.h21
-rw-r--r--source/gameengine/GameLogic/SCA_IScene.h13
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp237
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.h22
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.h6
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp329
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.h28
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.cpp252
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.h28
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.cpp1
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_MouseManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.cpp82
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.h15
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.h6
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.h10
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.cpp38
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.h9
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.cpp113
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.h16
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.cpp157
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.h19
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp137
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.h6
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp155
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.h17
-rw-r--r--source/gameengine/GameLogic/SCA_RandomEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.h11
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.cpp92
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.h14
-rw-r--r--source/gameengine/GameLogic/SCA_TimeEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.h5
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.cpp37
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.h10
-rw-r--r--source/gameengine/GameLogic/SConscript13
-rw-r--r--source/gameengine/GamePlayer/CMakeLists.txt2
-rw-r--r--source/gameengine/GamePlayer/common/CMakeLists.txt86
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Engine.cpp11
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Engine.h3
-rw-r--r--source/gameengine/GamePlayer/common/Makefile3
-rw-r--r--source/gameengine/GamePlayer/common/SConscript8
-rw-r--r--source/gameengine/GamePlayer/common/unix/Makefile2
-rw-r--r--source/gameengine/GamePlayer/common/windows/Makefile1
-rw-r--r--source/gameengine/GamePlayer/ghost/CMakeLists.txt78
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp45
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.h3
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp11
-rw-r--r--source/gameengine/GamePlayer/ghost/Makefile1
-rw-r--r--source/gameengine/GamePlayer/ghost/SConscript12
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.cpp2
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.h7
-rw-r--r--source/gameengine/Ketsji/BL_Material.h11
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp67
-rw-r--r--source/gameengine/Ketsji/BL_Shader.h26
-rw-r--r--source/gameengine/Ketsji/BL_Texture.h6
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt90
-rw-r--r--source/gameengine/Ketsji/KXNetwork/CMakeLists.txt20
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp128
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h14
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp131
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h16
-rw-r--r--source/gameengine/Ketsji/KXNetwork/SConscript8
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.cpp205
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.h85
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp76
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h16
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h7
-rw-r--r--source/gameengine/Ketsji/KX_CDActuator.cpp320
-rw-r--r--source/gameengine/Ketsji/KX_CDActuator.h106
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp191
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h10
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.cpp210
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.h20
-rw-r--r--source/gameengine/Ketsji/KX_CameraIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_ClientObjectInfo.h7
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.cpp387
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.h29
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.cpp68
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.h5
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp41
-rw-r--r--source/gameengine/Ketsji/KX_Dome.h11
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.h8
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.cpp108
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.h12
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp480
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h58
-rw-r--r--source/gameengine/Ketsji/KX_IInterpolator.h11
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.h6
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.h7
-rw-r--r--source/gameengine/Ketsji/KX_IScalarInterpolator.h11
-rw-r--r--source/gameengine/Ketsji/KX_ISceneConverter.h14
-rw-r--r--source/gameengine/Ketsji/KX_ISystem.h11
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp317
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.h38
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp77
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h14
-rw-r--r--source/gameengine/Ketsji/KX_Light.cpp90
-rw-r--r--source/gameengine/Ketsji/KX_Light.h6
-rw-r--r--source/gameengine/Ketsji/KX_LightIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_MaterialIpoController.h7
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.cpp91
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.h4
-rw-r--r--source/gameengine/Ketsji/KX_MotionState.h10
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.cpp130
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.h22
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.cpp85
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.h15
-rw-r--r--source/gameengine/Ketsji/KX_ObColorIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp380
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.h30
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.cpp96
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.h12
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp75
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h6
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.cpp67
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.h2
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp79
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.h12
-rw-r--r--source/gameengine/Ketsji/KX_PositionInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp51
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.cpp12
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h23
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp359
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp239
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp97
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.h4
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.cpp102
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.h13
-rw-r--r--source/gameengine/Ketsji/KX_RayCast.h14
-rw-r--r--source/gameengine/Ketsji/KX_RayEventManager.h7
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.cpp116
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.h14
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp254
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h26
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp88
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.h13
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp41
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h6
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp94
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h14
-rw-r--r--source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h7
-rw-r--r--source/gameengine/Ketsji/KX_SG_NodeRelationships.h19
-rw-r--r--source/gameengine/Ketsji/KX_ScalarInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_ScalingInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp336
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h58
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp193
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.h23
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp751
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.h81
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.cpp102
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.h11
-rw-r--r--source/gameengine/Ketsji/KX_TimeCategoryLogger.h6
-rw-r--r--source/gameengine/Ketsji/KX_TimeLogger.h11
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.h6
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp150
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.h25
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.cpp178
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.h18
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp68
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.h5
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.cpp102
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.h3
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.cpp76
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.h13
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.h11
-rw-r--r--source/gameengine/Ketsji/KX_WorldIpoController.h7
-rw-r--r--source/gameengine/Ketsji/Makefile6
-rw-r--r--source/gameengine/Ketsji/SConscript16
-rw-r--r--source/gameengine/Makefile2
-rw-r--r--source/gameengine/Network/CMakeLists.txt8
-rw-r--r--source/gameengine/Network/LoopBackNetwork/CMakeLists.txt8
-rw-r--r--source/gameengine/Network/LoopBackNetwork/SConscript2
-rw-r--r--source/gameengine/Network/NG_NetworkDeviceInterface.h7
-rw-r--r--source/gameengine/Network/NG_NetworkMessage.h11
-rw-r--r--source/gameengine/Network/NG_NetworkObject.h11
-rw-r--r--source/gameengine/Network/NG_NetworkScene.h13
-rw-r--r--source/gameengine/Network/SConscript2
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt35
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.h6
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp401
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h30
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h6
-rw-r--r--source/gameengine/Physics/Bullet/Makefile1
-rw-r--r--source/gameengine/Physics/Bullet/SConscript8
-rw-r--r--source/gameengine/Physics/Dummy/CMakeLists.txt4
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h6
-rw-r--r--source/gameengine/Physics/Dummy/Makefile2
-rw-r--r--source/gameengine/Physics/Dummy/SConscript2
-rw-r--r--source/gameengine/Physics/common/CMakeLists.txt6
-rw-r--r--source/gameengine/Physics/common/Makefile3
-rw-r--r--source/gameengine/Physics/common/PHY_IController.h11
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IMotionState.h14
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h6
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h18
-rw-r--r--source/gameengine/Physics/common/PHY_IVehicle.h11
-rw-r--r--source/gameengine/Physics/common/SConscript7
-rw-r--r--source/gameengine/PyDoc/API_intro.py2
-rw-r--r--source/gameengine/PyDoc/GameLogic.py9
-rw-r--r--source/gameengine/PyDoc/GameTypes.py465
-rw-r--r--source/gameengine/PyDoc/SConscript7
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt18
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.h11
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.cpp9
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_Deformer.h17
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h19
-rw-r--r--source/gameengine/Rasterizer/RAS_ICanvas.h11
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp18
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.h19
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h12
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h11
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.h23
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.cpp12
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.h18
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt24
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript7
-rw-r--r--source/gameengine/Rasterizer/RAS_Polygon.cpp15
-rw-r--r--source/gameengine/Rasterizer/RAS_Polygon.h11
-rw-r--r--source/gameengine/Rasterizer/RAS_Rect.h10
-rw-r--r--source/gameengine/Rasterizer/RAS_TexVert.h10
-rw-r--r--source/gameengine/Rasterizer/SConscript7
-rw-r--r--source/gameengine/SceneGraph/CMakeLists.txt4
-rw-r--r--source/gameengine/SceneGraph/SConscript7
-rw-r--r--source/gameengine/SceneGraph/SG_BBox.h10
-rw-r--r--source/gameengine/SceneGraph/SG_Controller.h6
-rw-r--r--source/gameengine/SceneGraph/SG_DList.h90
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.h7
-rw-r--r--source/gameengine/SceneGraph/SG_Node.h7
-rw-r--r--source/gameengine/SceneGraph/SG_ParentRelation.h8
-rw-r--r--source/gameengine/SceneGraph/SG_QList.h7
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.h7
-rw-r--r--source/gameengine/SceneGraph/SG_Tree.h13
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt51
-rw-r--r--source/gameengine/VideoTexture/Exception.cpp8
-rw-r--r--source/gameengine/VideoTexture/FilterBlueScreen.cpp26
-rw-r--r--source/gameengine/VideoTexture/FilterColor.cpp26
-rw-r--r--source/gameengine/VideoTexture/FilterNormal.cpp10
-rw-r--r--source/gameengine/VideoTexture/FilterSource.cpp18
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp8
-rw-r--r--source/gameengine/VideoTexture/ImageBuff.cpp6
-rw-r--r--source/gameengine/VideoTexture/ImageMix.cpp6
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp28
-rw-r--r--source/gameengine/VideoTexture/ImageViewport.cpp22
-rw-r--r--source/gameengine/VideoTexture/Makefile1
-rw-r--r--source/gameengine/VideoTexture/SConscript18
-rw-r--r--source/gameengine/VideoTexture/Texture.cpp6
-rw-r--r--source/gameengine/VideoTexture/VideoBase.cpp4
-rw-r--r--source/gameengine/VideoTexture/VideoFFmpeg.cpp16
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp11
-rw-r--r--source/icons/SConscript2
-rw-r--r--source/kernel/CMakeLists.txt10
-rw-r--r--source/kernel/SConscript2
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.cpp2
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.h1
-rw-r--r--source/nan_compile.mk146
-rw-r--r--source/nan_definitions.mk138
-rw-r--r--source/nan_link.mk46
-rw-r--r--source/nan_warn.mk51
1189 files changed, 153093 insertions, 100542 deletions
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 4764caddf6a..4adc51bcb15 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -28,9 +28,9 @@ ADD_SUBDIRECTORY(blender)
ADD_SUBDIRECTORY(kernel)
IF(WITH_GAMEENGINE)
- ADD_SUBDIRECTORY(gameengine)
+ ADD_SUBDIRECTORY(gameengine)
ENDIF(WITH_GAMEENGINE)
IF(WINDOWS)
- ADD_SUBDIRECTORY(icons)
+ ADD_SUBDIRECTORY(icons)
ENDIF(WINDOWS)
diff --git a/source/Makefile b/source/Makefile
index 62eb25acbc1..dab037d1749 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -75,15 +75,14 @@ endif
# 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_BSP)/lib/$(DEBUG_DIR)libbsp.a
GRPLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a
-GRPLIB += $(NAN_SOUNDSYSTEM)/lib/$(DEBUG_DIR)libSoundSystem.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/radiosity/$(DEBUG_DIR)libradiosity.a
# nlin: the reason that some libraries appear more than once below is
# to handle circular dependencies in linking among libraries... some
@@ -107,6 +106,29 @@ 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 += $(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
+COMLIB += $(NAN_SAMPLERATE)/lib/$(DEBUG_DIR)libsamplerate.a
+COMLIB += $(NAN_LZO)/lib/$(DEBUG_DIR)libminilzo.a
+COMLIB += $(NAN_LZMA)/lib/$(DEBUG_DIR)liblzma.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
ifneq ($(NAN_NO_KETSJI),true)
COMLIB += $(OCGDIR)/gameengine/bloutines/$(DEBUG_DIR)libbloutines.a
@@ -115,8 +137,6 @@ ifneq ($(NAN_NO_KETSJI),true)
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/fuzzics/$(DEBUG_DIR)libfuzzics.a
- COMLIB += $(NAN_QHULL)/lib/libqhull.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
@@ -221,8 +241,8 @@ 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_node/$(DEBUG_DIR)libed_node.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_preview/$(DEBUG_DIR)libed_preview.a
@@ -230,6 +250,7 @@ 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
@@ -241,6 +262,10 @@ 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/python/$(DEBUG_DIR)libpython.a
PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
@@ -248,6 +273,7 @@ PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
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
@@ -348,74 +374,38 @@ ifeq ($(OS),solaris)
SPLIB += $(NAN_ZLIB)/lib/libz.a
endif
-# OpenAL libs are already compiled as shared code!
-
-# Some vars to keep the rest of this section mostly readable
-# in an 80 char term
-SOUNDSYSTEM = $(OCGDIR)/intern/SoundSystem/$(DEBUG_DIR)libSoundSystem.a
-DUMMYSOUND = $(OCGDIR)/intern/DummySoundSystem/$(DEBUG_DIR)libDummySoundSystem.a
-OPENALSOUND = $(OCGDIR)/intern/OpenALSoundSystem/$(DEBUG_DIR)libOpenALSoundSystem.a
-SDLSOUND = $(OCGDIR)/intern/SDLSoundSystem/$(DEBUG_DIR)libSDLSoundSystem.a
-
-# Some kooky logic going on here ...
-ifeq ($(NAN_NO_OPENAL), true)
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(SOUNDSYSTEM)
-else
+ifeq ($(WITH_OPENAL),true)
ifeq ($(OS),$(findstring $(OS), "freebsd linux windows"))
ifeq ($(CPU),$(findstring $(CPU), "i386 powerpc x86_64 parisc64"))
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(OPENALSOUND)
- NAN_SND_LIBS += $(SDLSOUND)
NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- NAN_SND_LIBS += $(SOUNDSYSTEM)
else
ifeq ($(OS),windows)
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(OPENALSOUND)
- NAN_SND_LIBS += $(SDLSOUND)
NAN_SND_LIBS += $(NAN_OPENAL)/lib/openal_static.lib
- NAN_SND_LIBS += $(SOUNDSYSTEM)
- else
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(SOUNDSYSTEM)
endif
endif
else
ifeq ($(OS),darwin)
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(OPENALSOUND)
NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- NAN_SND_LIBS += $(SOUNDSYSTEM)
else
ifeq ($(OS), solaris)
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(OPENALSOUND)
- NAN_SND_LIBS += $(SDLSOUND)
NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- NAN_SND_LIBS += $(SOUNDSYSTEM)
- else
- ifeq ($(OS), irix)
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(SDLSOUND)
- NAN_SND_LIBS += $(SOUNDSYSTEM)
- else
- NAN_SND_LIBS = $(SOUNDSYSTEM)
- NAN_SND_LIBS += $(DUMMYSOUND)
- NAN_SND_LIBS += $(SOUNDSYSTEM)
- endif
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"))
+ NAN_SND_LIBS += $(NAN_SNDFILELIBS)
+ endif
+endif
+
ifeq ($(OS),windows)
# Might need to change this to $(NAN_MOZILLA_LIB)/nspr4.lib
diff --git a/source/SConscript b/source/SConscript
index d3a9373b4d8..e4e89671653 100644
--- a/source/SConscript
+++ b/source/SConscript
@@ -6,6 +6,9 @@ SConscript(['blender/SConscript',
'creator/SConscript'])
if env['WITH_BF_GAMEENGINE']:
SConscript (['gameengine/SConscript'])
-
+
+if env['WITH_BF_PLAYER']:
+ SConscript (['blenderplayer/bad_level_call_stubs/SConscript'])
+
if env['OURPLATFORM'] in ('win64-vc', 'win32-vc', 'win32-mingw'):
SConscript (['icons/SConscript'])
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index a9e3d50211f..99297714fd2 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -40,20 +40,21 @@ ADD_SUBDIRECTORY(makesrna)
ADD_SUBDIRECTORY(readblenfile)
ADD_SUBDIRECTORY(render)
ADD_SUBDIRECTORY(blenfont)
+ADD_SUBDIRECTORY(ikplugin)
IF(WITH_OPENEXR)
- ADD_SUBDIRECTORY(imbuf/intern/openexr)
+ ADD_SUBDIRECTORY(imbuf/intern/openexr)
ENDIF(WITH_OPENEXR)
IF(WITH_DDS)
- ADD_SUBDIRECTORY(imbuf/intern/dds)
+ ADD_SUBDIRECTORY(imbuf/intern/dds)
ENDIF(WITH_DDS)
IF(WITH_QUICKTIME)
- ADD_SUBDIRECTORY(quicktime)
+ ADD_SUBDIRECTORY(quicktime)
ENDIF(WITH_QUICKTIME)
IF(WITH_PYTHON)
- ADD_SUBDIRECTORY(python)
+ ADD_SUBDIRECTORY(python)
ENDIF(WITH_PYTHON)
diff --git a/source/blender/Makefile b/source/blender/Makefile
index 31636f838c3..6bc874c3c93 100644
--- a/source/blender/Makefile
+++ b/source/blender/Makefile
@@ -34,7 +34,7 @@ DIRS = windowmanager editors blenloader readblenfile
DIRS += avi imbuf render blenlib blenkernel blenpluginapi
DIRS += makesdna makesrna
DIRS += python nodes gpu
-DIRS += blenfont
+DIRS += blenfont ikplugin
ifeq ($(WITH_QUICKTIME), true)
DIRS += quicktime
diff --git a/source/blender/SConscript b/source/blender/SConscript
index a064850c170..af2c81a3b45 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -16,6 +16,7 @@ SConscript(['avi/SConscript',
'readblenfile/SConscript',
'render/SConscript',
'nodes/SConscript',
+ 'ikplugin/SConscript',
'windowmanager/SConscript',
'blenfont/SConscript'])
diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt
index 4738ea14292..4e48b689055 100644
--- a/source/blender/avi/CMakeLists.txt
+++ b/source/blender/avi/CMakeLists.txt
@@ -27,8 +27,8 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../../../intern/guardedalloc
- ${JPEG_INC}
+ . ../../../intern/guardedalloc
+ ${JPEG_INC}
)
BLENDERLIB(bf_avi "${SRC}" "${INC}")
diff --git a/source/blender/avi/SConscript b/source/blender/avi/SConscript
index f6e5b787b58..0bf8c3c74db 100644
--- a/source/blender/avi/SConscript
+++ b/source/blender/avi/SConscript
@@ -1,5 +1,4 @@
#!/usr/bin/python
-#Import ('extra_includes')
Import ('env')
sources = env.Glob('intern/*.c')
@@ -7,4 +6,4 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc'
incs += ' ' + env['BF_JPEG_INC']
-env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core'], priority = [185] )
+env.BlenderLib ('bf_avi', sources, Split(incs), [], libtype=['core','player'], priority = [190,120] )
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 386597c6d85..005c05dec1d 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -214,6 +214,7 @@ int AVI_is_avi (char *name) {
AviMovie movie;
AviMainHeader header;
AviBitmapInfoHeader bheader;
+ int movie_tracks = 0;
DEBUG("opening movie\n");
@@ -303,6 +304,7 @@ int AVI_is_avi (char *name) {
fclose(movie.fp);
return 0;
}
+ movie_tracks++;
}
movie.streams[temp].sh.Flags = GET_FCC (movie.fp);
@@ -394,7 +396,10 @@ int AVI_is_avi (char *name) {
MEM_freeN(movie.streams);
fclose(movie.fp);
- return 1;
+
+ /* at least one video track is needed */
+ return (movie_tracks != 0);
+
}
AviError AVI_open_movie (char *name, AviMovie *movie) {
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index 2ee31a17fa6..760b7059bc7 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -71,6 +71,18 @@ float BLF_width(char *str);
float BLF_height(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(char *str, float *width, float *height);
+
+/*
+ * For fixed width fonts only, returns the width of a
+ * character.
+ */
+float BLF_fixed_width(void);
+
+/*
* and this two function return the width and height
* of the string, using the default font and both value
* are multiplied by the aspect of the font.
@@ -79,13 +91,17 @@ float BLF_width_default(char *str);
float BLF_height_default(char *str);
/*
+ * set rotation for default font
+ */
+void BLF_default_rotation(float angle);
+
+/*
* By default, rotation and clipping are disable and
* have to be enable/disable using BLF_enable/disable.
*/
void BLF_rotation(float angle);
void BLF_clipping(float xmin, float ymin, float xmax, float ymax);
void BLF_blur(int size);
-void BLF_kerning(float space);
void BLF_enable(int option);
void BLF_disable(int option);
@@ -106,6 +122,28 @@ void BLF_shadow(int level, float r, float g, float b, float a);
void BLF_shadow_offset(int x, int y);
/*
+ * Set the buffer, size and number of channels to draw, one thing to take care is call
+ * this function with NULL pointer when we finish, for example:
+ * BLF_buffer(my_fbuf, my_cbuf, 100, 100, 4);
+ *
+ * ... set color, position and draw ...
+ *
+ * BLF_buffer(NULL, NULL, 0, 0, 0);
+ */
+void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch);
+
+/*
+ * Set the color to be used for text.
+ */
+void BLF_buffer_col(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(char *str);
+
+/*
* Search the path directory to the locale files, this try all
* the case for Linux, Win and Mac.
*/
@@ -132,13 +170,7 @@ void BLF_dir_free(char **dirs, int count);
/* font->flags. */
#define BLF_ROTATION (1<<0)
#define BLF_CLIPPING (1<<1)
-#define BLF_FONT_KERNING (1<<2)
-#define BLF_USER_KERNING (1<<3)
-#define BLF_SHADOW (1<<4)
-#define BLF_OVERLAP_CHAR (1<<5)
-
-/* font->mode. */
-#define BLF_MODE_TEXTURE 0
-#define BLF_MODE_BITMAP 1
+#define BLF_SHADOW (1<<2)
+#define BLF_KERNING_DEFAULT (1<<3)
#endif /* BLF_API_H */
diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt
index aef655ca0d1..9b7e950526d 100644
--- a/source/blender/blenfont/CMakeLists.txt
+++ b/source/blender/blenfont/CMakeLists.txt
@@ -25,15 +25,18 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- ../../../intern/guardedalloc ../blenlib ../makesdna ../editors/include
- ../blenkernel ../../../extern/glew/include .
- ${FTGL_INC}
- ${FREETYPE_INC}
- ${GETTEXT_INC}
+ ../../../intern/guardedalloc ../blenlib ../makesdna ../editors/include
+ ../blenkernel ../../../extern/glew/include .
+ ${FREETYPE_INCLUDE_DIRS}
)
+IF(WITH_INTERNATIONAL)
+ SET(INC ${INC} ${GETTEXT_INC})
+ ADD_DEFINITIONS(-DINTERNATIONAL)
+ENDIF(WITH_INTERNATIONAL)
+
IF(WIN32)
- ADD_DEFINITIONS(-D_WIN32 -DUSE_GETTEXT_DLL)
+ ADD_DEFINITIONS(-D_WIN32 -DUSE_GETTEXT_DLL)
ENDIF(WIN32)
BLENDERLIB(bf_blenfont "${SRC}" "${INC}")
diff --git a/source/blender/blenfont/Makefile b/source/blender/blenfont/Makefile
index 70dd2e5052b..be62c87cbf4 100644
--- a/source/blender/blenfont/Makefile
+++ b/source/blender/blenfont/Makefile
@@ -28,3 +28,7 @@ SOURCEDIR = source/blender/blenfont
DIRS = intern
include nan_subdirs.mk
+
+ifeq ($(INTERNATIONAL), true)
+ CPPFLAGS += -DINTERNATIONAL
+endif
diff --git a/source/blender/blenfont/SConscript b/source/blender/blenfont/SConscript
index fa6fa19a9ef..91edc46ba8b 100644
--- a/source/blender/blenfont/SConscript
+++ b/source/blender/blenfont/SConscript
@@ -9,9 +9,13 @@ incs += ' #/extern/glew/include'
incs += ' ' + env['BF_FREETYPE_INC']
incs += ' ' + env['BF_GETTEXT_INC']
-defs = ''
+defs = []
if sys.platform == 'win32':
- defs += ' _WIN32 USE_GETTEXT_DLL'
+ defs.append('_WIN32')
+ defs.append('USE_GETTEXT_DLL')
-env.BlenderLib ( 'bf_blenfont', sources, Split(incs), Split(defs), libtype=['core'], priority=[210] )
+if env['WITH_BF_INTERNATIONAL']:
+ defs.append('INTERNATIONAL')
+
+env.BlenderLib ( 'bf_blenfont', sources, Split(incs), Split(defs), libtype=['core','player'], priority=[210,210] )
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index 9dad5a4bfa0..db88d84d0b5 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -102,7 +102,7 @@ void BLF_exit(void)
blf_font_exit();
}
-int blf_search(char *name)
+static int blf_search(char *name)
{
FontBLF *font;
int i;
@@ -321,6 +321,18 @@ void BLF_draw_default(float x, float y, float z, char *str)
}
}
+void BLF_default_rotation(float angle)
+{
+
+ if (global_font_default>=0) {
+ global_font[global_font_default]->angle= angle;
+ if(angle)
+ global_font[global_font_default]->flags |= BLF_ROTATION;
+ else
+ global_font[global_font_default]->flags &= ~BLF_ROTATION;
+ }
+}
+
void BLF_draw(char *str)
{
FontBLF *font;
@@ -329,40 +341,24 @@ void BLF_draw(char *str)
* The pixmap alignment hack is handle
* in BLF_position (old ui_rasterpos_safe).
*/
-
font= global_font[global_font_cur];
if (font) {
- if (font->mode == BLF_MODE_BITMAP) {
- glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
- glPushAttrib(GL_ENABLE_BIT);
- glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
- glPixelStorei( GL_UNPACK_ALIGNMENT, 1);
- glDisable(GL_BLEND);
- glRasterPos3f(font->pos[0], font->pos[1], font->pos[2]);
-
- blf_font_draw(font, str);
-
- glPopAttrib();
- glPopClientAttrib();
- }
- else {
- glEnable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ 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);
+ glPushMatrix();
+ glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
+ glScalef(font->aspect, font->aspect, 1.0);
- 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);
- blf_font_draw(font, str);
+ blf_font_draw(font, str);
- glPopMatrix();
- glDisable(GL_BLEND);
- glDisable(GL_TEXTURE_2D);
- }
+ glPopMatrix();
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
}
}
@@ -375,6 +371,15 @@ void BLF_boundbox(char *str, rctf *box)
blf_font_boundbox(font, str, box);
}
+void BLF_width_and_height(char *str, float *width, float *height)
+{
+ FontBLF *font;
+
+ font= global_font[global_font_cur];
+ if (font)
+ blf_font_width_and_height(font, str, width, height);
+}
+
float BLF_width(char *str)
{
FontBLF *font;
@@ -385,6 +390,16 @@ float BLF_width(char *str)
return(0.0f);
}
+float BLF_fixed_width(void)
+{
+ FontBLF *font;
+
+ font= global_font[global_font_cur];
+ if (font)
+ return(blf_font_fixed_width(font));
+ return(0.0f);
+}
+
float BLF_width_default(char *str)
{
FontBLF *font;
@@ -483,45 +498,63 @@ void BLF_clipping(float xmin, float ymin, float xmax, float ymax)
}
}
-void BLF_mode(int mode)
+void BLF_shadow(int level, float r, float g, float b, float a)
{
FontBLF *font;
font= global_font[global_font_cur];
- if (font)
- font->mode= mode;
+ if (font) {
+ font->shadow= level;
+ font->shadow_col[0]= r;
+ font->shadow_col[1]= g;
+ font->shadow_col[2]= b;
+ font->shadow_col[3]= a;
+ }
}
-void BLF_kerning(float space)
+void BLF_shadow_offset(int x, int y)
{
FontBLF *font;
font= global_font[global_font_cur];
- if (font)
- font->kerning= space;
+ if (font) {
+ font->shadow_x= x;
+ font->shadow_y= y;
+ }
}
-void BLF_shadow(int level, float r, float g, float b, float a)
+void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch)
{
FontBLF *font;
font= global_font[global_font_cur];
if (font) {
- font->shadow= level;
- font->shadow_col[0]= r;
- font->shadow_col[1]= g;
- font->shadow_col[2]= b;
- font->shadow_col[3]= a;
+ font->b_fbuf= fbuf;
+ font->b_cbuf= cbuf;
+ font->bw= w;
+ font->bh= h;
+ font->bch= nch;
}
}
-void BLF_shadow_offset(int x, int y)
+void BLF_buffer_col(float r, float g, float b, float a)
{
FontBLF *font;
font= global_font[global_font_cur];
if (font) {
- font->shadow_x= x;
- font->shadow_y= y;
+ font->b_col[0]= r;
+ font->b_col[1]= g;
+ font->b_col[2]= b;
+ font->b_col[3]= a;
}
}
+
+void BLF_draw_buffer(char *str)
+{
+ FontBLF *font;
+
+ font= global_font[global_font_cur];
+ if (font)
+ blf_font_buffer(font, str);
+}
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index 92dfe8457b0..aac6cd7d2fc 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -51,7 +51,7 @@
static ListBase global_font_dir= { NULL, NULL };
-DirBLF *blf_dir_find(const char *path)
+static DirBLF *blf_dir_find(const char *path)
{
DirBLF *p;
@@ -153,7 +153,8 @@ char *blf_dir_search(char *file)
int blf_dir_split(const char *str, char *file, int *size)
{
- char *s, i, len;
+ int i, len;
+ char *s;
/* Window, Linux or Mac, this is always / */
s= strrchr(str, '/');
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index a3c5232cc76..8721e49f06b 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -100,9 +100,9 @@ void blf_font_draw(FontBLF *font, char *str)
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index, g_prev_index;
- float pen_x, pen_y, old_pen_x;
- int i, has_kerning;
+ FT_UInt glyph_index;
+ int pen_x, pen_y;
+ int i, has_kerning, st;
if (!font->glyph_cache)
return;
@@ -112,64 +112,192 @@ void blf_font_draw(FontBLF *font, char *str)
pen_y= 0;
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- g_prev_index= 0;
while (str[i]) {
c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
- glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_search(font->glyph_cache, c);
- if (!g)
+ if (!g) {
+ glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_add(font, glyph_index, c);
+ }
/* if we don't found a glyph, skip it. */
if (!g)
continue;
- /*
- * This happen if we change the mode of the
- * font, we don't drop the glyph cache, so it's
- * possible that some glyph don't have the
- * bitmap or texture information.
- */
- if (font->mode == BLF_MODE_BITMAP && (!g->bitmap_data))
- g= blf_glyph_add(font, glyph_index, c);
- else if (font->mode == BLF_MODE_TEXTURE && (!g->tex_data))
+ 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, char *str)
+{
+ unsigned char *data, *cbuf;
+ unsigned int c;
+ GlyphBLF *g, *g_prev;
+ FT_Vector delta;
+ FT_UInt glyph_index;
+ float a, *fbuf;
+ int pen_x, pen_y, y, x, yb, diff;
+ int i, has_kerning, st, chx, chy;
+
+ if (!font->glyph_cache)
+ return;
+
+ i= 0;
+ pen_x= (int)font->pos[0];
+ pen_y= (int)font->pos[1];
+ has_kerning= FT_HAS_KERNING(font->face);
+ g_prev= NULL;
+
+ while (str[i]) {
+ c= blf_utf8_next((unsigned char *)str, &i);
+ if (c == 0)
+ break;
+
+ g= blf_glyph_search(font->glyph_cache, c);
+ if (!g) {
+ glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_add(font, glyph_index, c);
+ }
- if ((font->flags & BLF_FONT_KERNING) && has_kerning && g_prev) {
- old_pen_x= pen_x;
+ /* if we don't found a glyph, skip it. */
+ if (!g)
+ continue;
+
+ if (has_kerning && g_prev) {
delta.x= 0;
delta.y= 0;
- if (FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta) == 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;
+ }
+
+ chx= pen_x + ((int)g->pos_x);
+ diff= g->height - ((int)g->pos_y);
+ if (diff > 0) {
+ if (g->pitch < 0)
+ pen_y += diff;
+ else
+ pen_y -= diff;
+ }
+ else if (diff < 0) {
+ if (g->pitch < 0)
+ pen_y -= diff;
+ else
+ pen_y += diff;
+ }
- if (font->flags & BLF_OVERLAP_CHAR) {
- if (pen_x < old_pen_x)
- pen_x= old_pen_x;
+ if (g->pitch < 0)
+ chy= pen_y - ((int)g->pos_y);
+ else
+ chy= pen_y + ((int)g->pos_y);
+
+ if (font->b_fbuf) {
+ if (chx >= 0 && chx < font->bw && pen_y >= 0 && pen_y < font->bh) {
+ if (g->pitch < 0)
+ yb= 0;
+ else
+ yb= g->height-1;
+
+ for (y= 0; y < g->height; y++) {
+ for (x= 0; x < g->width; x++) {
+ fbuf= font->b_fbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw));
+ data= g->bitmap + x + (yb * g->pitch);
+ a= data[0]/255.0f;
+
+ if (a == 1.0) {
+ fbuf[0]= font->b_col[0];
+ fbuf[1]= font->b_col[1];
+ fbuf[2]= font->b_col[2];
+ }
+ else {
+ fbuf[0]= (font->b_col[0]*a) + (fbuf[0] * (1-a));
+ fbuf[1]= (font->b_col[1]*a) + (fbuf[1] * (1-a));
+ fbuf[2]= (font->b_col[2]*a) + (fbuf[2] * (1-a));
+ }
+ }
+
+ if (g->pitch < 0)
+ yb++;
+ else
+ yb--;
}
}
}
- if (font->flags & BLF_USER_KERNING) {
- old_pen_x= pen_x;
- pen_x += font->kerning;
-
- if (font->flags & BLF_OVERLAP_CHAR) {
- if (pen_x < old_pen_x)
- pen_x= old_pen_x;
+ if (font->b_cbuf) {
+ if (chx >= 0 && chx < font->bw && pen_y >= 0 && pen_y < font->bh) {
+ if (g->pitch < 0)
+ yb= 0;
+ else
+ yb= g->height-1;
+
+ for (y= 0; y < g->height; y++) {
+ for (x= 0; x < g->width; x++) {
+ cbuf= font->b_cbuf + font->bch * ((chx + x) + ((pen_y + y)*font->bw));
+ data= g->bitmap + x + (yb * g->pitch);
+ a= data[0];
+
+ if (a == 256) {
+ cbuf[0]= font->b_col[0];
+ cbuf[1]= font->b_col[1];
+ cbuf[2]= font->b_col[2];
+ }
+ else {
+ cbuf[0]= (font->b_col[0]*a) + (cbuf[0] * (256-a));
+ cbuf[1]= (font->b_col[1]*a) + (cbuf[1] * (256-a));
+ cbuf[2]= (font->b_col[2]*a) + (cbuf[2] * (256-a));
+ }
+ }
+
+ if (g->pitch < 0)
+ yb++;
+ else
+ yb--;
+ }
}
}
- /* do not return this loop if clipped, we want every character tested */
- blf_glyph_render(font, g, pen_x, pen_y);
+ if (diff > 0) {
+ if (g->pitch < 0)
+ pen_x -= diff;
+ else
+ pen_y += diff;
+ }
+ else if (diff < 0) {
+ if (g->pitch < 0)
+ pen_x += diff;
+ else
+ pen_y -= diff;
+ }
pen_x += g->advance;
g_prev= g;
- g_prev_index= glyph_index;
}
}
@@ -178,10 +306,10 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index, g_prev_index;
+ FT_UInt glyph_index;
rctf gbox;
- float pen_x, pen_y, old_pen_x;
- int i, has_kerning;
+ int pen_x, pen_y;
+ int i, has_kerning, st;
if (!font->glyph_cache)
return;
@@ -196,60 +324,37 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
pen_y= 0;
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- g_prev_index= 0;
while (str[i]) {
c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
- glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_search(font->glyph_cache, c);
- if (!g)
+ if (!g) {
+ glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_add(font, glyph_index, c);
+ }
/* if we don't found a glyph, skip it. */
if (!g)
continue;
- /*
- * This happen if we change the mode of the
- * font, we don't drop the glyph cache, so it's
- * possible that some glyph don't have the
- * bitmap or texture information.
- */
- if (font->mode == BLF_MODE_BITMAP && (!g->bitmap_data))
- g= blf_glyph_add(font, glyph_index, c);
- else if (font->mode == BLF_MODE_TEXTURE && (!g->tex_data))
- g= blf_glyph_add(font, glyph_index, c);
-
- if ((font->flags & BLF_FONT_KERNING) && has_kerning && g_prev) {
- old_pen_x= pen_x;
+ if (has_kerning && g_prev) {
delta.x= 0;
delta.y= 0;
- if (FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta) == 0) {
- pen_x += delta.x >> 6;
+ 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 (font->flags & BLF_OVERLAP_CHAR) {
- if (pen_x < old_pen_x)
- pen_x= old_pen_x;
- }
- }
- }
-
- if (font->flags & BLF_USER_KERNING) {
- old_pen_x= pen_x;
- pen_x += font->kerning;
-
- if (font->flags & BLF_OVERLAP_CHAR) {
- if (pen_x < old_pen_x)
- pen_x= old_pen_x;
- }
+ if (st == 0)
+ pen_x += delta.x >> 6;
}
- gbox.xmin= g->box.xmin + pen_x;
- gbox.xmax= g->box.xmax + pen_x;
+ gbox.xmin= pen_x;
+ gbox.xmax= pen_x + g->advance;
gbox.ymin= g->box.ymin + pen_y;
gbox.ymax= g->box.ymax + pen_y;
@@ -265,7 +370,6 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
pen_x += g->advance;
g_prev= g;
- g_prev_index= glyph_index;
}
if (box->xmin > box->xmax) {
@@ -276,6 +380,17 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
}
}
+void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height)
+{
+ rctf box;
+
+ if (font->glyph_cache) {
+ blf_font_boundbox(font, str, &box);
+ *width= ((box.xmax - box.xmin) * font->aspect);
+ *height= ((box.ymax - box.ymin) * font->aspect);
+ }
+}
+
float blf_font_width(FontBLF *font, char *str)
{
rctf box;
@@ -298,6 +413,27 @@ float blf_font_height(FontBLF *font, char *str)
return((box.ymax - box.ymin) * font->aspect);
}
+float blf_font_fixed_width(FontBLF *font)
+{
+ GlyphBLF *g;
+ FT_UInt glyph_index;
+ unsigned int c = ' ';
+
+ if (!font->glyph_cache)
+ return 0.0f;
+
+ glyph_index= FT_Get_Char_Index(font->face, c);
+ g= blf_glyph_search(font->glyph_cache, c);
+ if (!g)
+ g= blf_glyph_add(font, glyph_index, c);
+
+ /* if we don't find the glyph. */
+ if (!g)
+ return 0.0f;
+
+ return g->advance;
+}
+
void blf_font_free(FontBLF *font)
{
GlyphCacheBLF *gc;
@@ -317,9 +453,8 @@ void blf_font_free(FontBLF *font)
MEM_freeN(font);
}
-void blf_font_fill(FontBLF *font)
+static void blf_font_fill(FontBLF *font)
{
- font->mode= BLF_MODE_TEXTURE;
font->aspect= 1.0f;
font->pos[0]= 0.0f;
font->pos[1]= 0.0f;
@@ -329,15 +464,23 @@ void blf_font_fill(FontBLF *font)
font->clip_rec.xmax= 0.0f;
font->clip_rec.ymin= 0.0f;
font->clip_rec.ymax= 0.0f;
- font->flags= BLF_USER_KERNING | BLF_FONT_KERNING;
+ font->flags= 0;
font->dpi= 0;
font->size= 0;
- font->kerning= 0.0f;
font->cache.first= NULL;
font->cache.last= NULL;
font->glyph_cache= NULL;
font->blur= 0;
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&font->max_tex_size);
+ font->max_tex_size= -1;
+ font->b_fbuf= NULL;
+ font->b_cbuf= NULL;
+ font->bw= 0;
+ font->bh= 0;
+ font->bch= 0;
+ font->b_col[0]= 0;
+ font->b_col[1]= 0;
+ font->b_col[2]= 0;
+ font->b_col[3]= 0;
}
FontBLF *blf_font_new(char *name, char *filename)
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index a637774d7bf..7d1e43a38df 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -136,7 +136,7 @@ void blf_glyph_cache_free(GlyphCacheBLF *gc)
MEM_freeN(gc);
}
-void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
+static void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
{
int tot_mem, i;
unsigned char *buf;
@@ -189,35 +189,20 @@ GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
return(NULL);
}
-GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
+GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
{
FT_GlyphSlot slot;
- GlyphCacheBLF *gc;
GlyphBLF *g;
- GlyphTextureBLF *gt;
FT_Error err;
FT_Bitmap bitmap;
FT_BBox bbox;
unsigned int key;
- int do_new;
g= blf_glyph_search(font->glyph_cache, c);
-
- /* The glyph can be add on Bitmap mode, so we have the
- * glyph, but not the texture data.
- */
- if (g && g->tex_data)
+ if (g)
return(g);
- else if (g)
- do_new= 0;
- else
- do_new= 1;
-
- if (font->flags & BLF_FONT_KERNING)
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_BITMAP);
- else
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
+ err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
if (err)
return(NULL);
@@ -228,164 +213,33 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
return(NULL);
- if (do_new) {
- g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
- g->next= NULL;
- g->prev= NULL;
- g->tex_data= NULL;
- g->bitmap_data= NULL;
- g->c= c;
- }
-
- gt= (GlyphTextureBLF *)MEM_mallocN(sizeof(GlyphTextureBLF), "blf_glyph_texture_add");
- gc= font->glyph_cache;
-
- if (gc->cur_tex == -1) {
- blf_glyph_cache_texture(font, gc);
- gc->x_offs= gc->pad;
- gc->y_offs= gc->pad;
- }
-
- if (gc->x_offs > (gc->p2_width - gc->max_glyph_width)) {
- gc->x_offs= gc->pad;
- gc->y_offs += gc->max_glyph_height;
-
- if (gc->y_offs > (gc->p2_height - gc->max_glyph_height)) {
- gc->y_offs= gc->pad;
- blf_glyph_cache_texture(font, gc);
- }
- }
-
- bitmap= slot->bitmap;
- gt->tex= gc->textures[gc->cur_tex];
-
- gt->xoff= gc->x_offs;
- gt->yoff= gc->y_offs;
- gt->width= bitmap.width;
- gt->height= bitmap.rows;
-
- if (gt->width && gt->height) {
- glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
- glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
- glBindTexture(GL_TEXTURE_2D, gt->tex);
- glTexSubImage2D(GL_TEXTURE_2D, 0, gt->xoff, gt->yoff, gt->width, gt->height, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer);
- glPopClientAttrib();
- }
-
- g->advance= ((float)slot->advance.x) / 64.0f;
- gt->pos_x= slot->bitmap_left;
- gt->pos_y= slot->bitmap_top;
-
- FT_Outline_Get_CBox(&(slot->outline), &bbox);
- g->box.xmin= ((float)bbox.xMin) / 64.0f;
- g->box.xmax= ((float)bbox.xMax) / 64.0f;
- g->box.ymin= ((float)bbox.yMin) / 64.0f;
- g->box.ymax= ((float)bbox.yMax) / 64.0f;
-
- gt->uv[0][0]= ((float)gt->xoff) / ((float)gc->p2_width);
- gt->uv[0][1]= ((float)gt->yoff) / ((float)gc->p2_height);
- gt->uv[1][0]= ((float)(gt->xoff + gt->width)) / ((float)gc->p2_width);
- gt->uv[1][1]= ((float)(gt->yoff + gt->height)) / ((float)gc->p2_height);
-
- /* update the x offset for the next glyph. */
- gc->x_offs += (int)(g->box.xmax - g->box.xmin + gc->pad);
-
- if (do_new) {
- key= blf_hash(g->c);
- BLI_addhead(&(gc->bucket[key]), g);
- gc->rem_glyphs--;
- }
-
- /* and attach the texture information. */
- g->tex_data= gt;
-
- return(g);
-}
-
-GlyphBLF *blf_glyph_bitmap_add(FontBLF *font, FT_UInt index, unsigned int c)
-{
- FT_GlyphSlot slot;
- GlyphCacheBLF *gc;
- GlyphBLF *g;
- GlyphBitmapBLF *gt;
- FT_Error err;
- FT_Bitmap bitmap;
- FT_BBox bbox;
- unsigned char *dest, *src;
- unsigned int key, y;
- unsigned int src_width, src_height, src_pitch;
- int do_new;
-
- g= blf_glyph_search(font->glyph_cache, c);
-
- /*
- * The glyph can be add on Texture mode, so we have the
- * glyph, but not the bitmap data.
- */
- if (g && g->bitmap_data)
- return(g);
- else if (g)
- do_new= 0;
- else
- do_new= 1;
-
- if (font->flags & BLF_FONT_KERNING)
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_BITMAP);
- else
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
-
- if (err)
- return(NULL);
-
- /* get the glyph. */
- slot= font->face->glyph;
-
- err= FT_Render_Glyph(slot, FT_RENDER_MODE_MONO);
- if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
- return(NULL);
-
- if (do_new) {
- g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
- g->next= NULL;
- g->prev= NULL;
- g->tex_data= NULL;
- g->bitmap_data= NULL;
- g->c= c;
- }
-
- gt= (GlyphBitmapBLF *)MEM_mallocN(sizeof(GlyphBitmapBLF), "blf_glyph_bitmap_add");
- gc= font->glyph_cache;
-
+ g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
+ g->next= NULL;
+ g->prev= NULL;
+ g->c= c;
+ g->idx= index;
+ g->tex= 0;
+ g->build_tex= 0;
+ g->bitmap= NULL;
+ g->xoff= -1;
+ g->yoff= -1;
+ g->uv[0][0]= 0.0f;
+ g->uv[0][1]= 0.0f;
+ g->uv[1][0]= 0.0f;
+ g->uv[1][1]= 0.0f;
bitmap= slot->bitmap;
+ g->width= bitmap.width;
+ g->height= bitmap.rows;
- src_width= bitmap.width;
- src_height= bitmap.rows;
- src_pitch= bitmap.pitch;
-
- gt->width= src_width;
- gt->height= src_height;
- gt->pitch= src_pitch;
- gt->image= NULL;
-
- if (gt->width && gt->height) {
- gt->image= (unsigned char *)malloc(gt->pitch * gt->height);
-
- dest= gt->image + ((gt->height - 1) * gt->pitch);
- src= bitmap.buffer;
-
- for (y= 0; y < src_height; ++y) {
- memcpy((void *)dest, (void *)src, src_pitch);
- dest -= gt->pitch;
- src += src_pitch;
- }
+ if (g->width && g->height) {
+ g->bitmap= (unsigned char *)MEM_mallocN(g->width * g->height, "glyph bitmap");
+ memcpy((void *)g->bitmap, (void *)bitmap.buffer, g->width * g->height);
}
g->advance= ((float)slot->advance.x) / 64.0f;
- gt->pos_x= slot->bitmap_left;
- gt->pos_y= ((int)src_height) - slot->bitmap_top;
+ g->pos_x= slot->bitmap_left;
+ g->pos_y= slot->bitmap_top;
+ g->pitch= slot->bitmap.pitch;
FT_Outline_Get_CBox(&(slot->outline), &bbox);
g->box.xmin= ((float)bbox.xMin) / 64.0f;
@@ -393,39 +247,18 @@ GlyphBLF *blf_glyph_bitmap_add(FontBLF *font, FT_UInt index, unsigned int c)
g->box.ymin= ((float)bbox.yMin) / 64.0f;
g->box.ymax= ((float)bbox.yMax) / 64.0f;
- if (do_new) {
- key= blf_hash(g->c);
- BLI_addhead(&(gc->bucket[key]), g);
- gc->rem_glyphs--;
- }
-
- /* and attach the bitmap information. */
- g->bitmap_data= gt;
-
+ key= blf_hash(g->c);
+ BLI_addhead(&(font->glyph_cache->bucket[key]), g);
return(g);
}
-GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
-{
- if (font->mode == BLF_MODE_BITMAP)
- return(blf_glyph_bitmap_add(font, index, c));
- return(blf_glyph_texture_add(font, index, c));
-}
-
void blf_glyph_free(GlyphBLF *g)
{
- if (g->tex_data)
- MEM_freeN(g->tex_data);
-
- if (g->bitmap_data) {
- if (g->bitmap_data->image)
- free((void *)g->bitmap_data->image);
- MEM_freeN(g->bitmap_data);
- }
-
/* don't need free the texture, the GlyphCache already
* have a list of all the texture and free it.
*/
+ if (g->bitmap)
+ MEM_freeN(g->bitmap);
MEM_freeN(g);
}
@@ -490,16 +323,65 @@ static void blf_texture3_draw(float uv[2][2], float x1, float y1, float x2, floa
glColor4fv(color);
}
-int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
+int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
{
- GlyphTextureBLF *gt;
+ GlyphCacheBLF *gc;
GLint cur_tex;
float dx, dx1;
float y1, y2;
float xo, yo;
float color[4];
- gt= g->tex_data;
+ if ((!g->width) || (!g->height))
+ return(1);
+
+ if (g->build_tex == 0) {
+ gc= font->glyph_cache;
+
+ if (font->max_tex_size == -1)
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint *)&font->max_tex_size);
+
+ if (gc->cur_tex == -1) {
+ blf_glyph_cache_texture(font, gc);
+ gc->x_offs= gc->pad;
+ gc->y_offs= gc->pad;
+ }
+
+ if (gc->x_offs > (gc->p2_width - gc->max_glyph_width)) {
+ gc->x_offs= gc->pad;
+ gc->y_offs += gc->max_glyph_height;
+
+ if (gc->y_offs > (gc->p2_height - gc->max_glyph_height)) {
+ gc->y_offs= gc->pad;
+ blf_glyph_cache_texture(font, gc);
+ }
+ }
+
+ g->tex= gc->textures[gc->cur_tex];
+ g->xoff= gc->x_offs;
+ g->yoff= gc->y_offs;
+
+ glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ glBindTexture(GL_TEXTURE_2D, g->tex);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, g->xoff, g->yoff, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, g->bitmap);
+ glPopClientAttrib();
+
+ g->uv[0][0]= ((float)g->xoff) / ((float)gc->p2_width);
+ g->uv[0][1]= ((float)g->yoff) / ((float)gc->p2_height);
+ g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)gc->p2_width);
+ g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)gc->p2_height);
+
+ /* update the x offset for the next glyph. */
+ gc->x_offs += (int)(g->box.xmax - g->box.xmin + gc->pad);
+
+ gc->rem_glyphs--;
+ g->build_tex= 1;
+ }
+
xo= 0.0f;
yo= 0.0f;
@@ -510,10 +392,10 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
y += font->shadow_y;
}
- dx= floor(x + gt->pos_x);
- dx1= dx + gt->width;
- y1= y + gt->pos_y;
- y2= y + gt->pos_y - gt->height;
+ dx= floor(x + g->pos_x);
+ dx1= dx + g->width;
+ y1= y + g->pos_y;
+ y2= y + g->pos_y - g->height;
if (font->flags & BLF_CLIPPING) {
if (!BLI_in_rctf(&font->clip_rec, dx + font->pos[0], y1 + font->pos[1]))
@@ -527,70 +409,36 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
}
glGetIntegerv(GL_TEXTURE_2D_BINDING_EXT, &cur_tex);
- if (cur_tex != gt->tex)
- glBindTexture(GL_TEXTURE_2D, gt->tex);
+ if (cur_tex != g->tex)
+ glBindTexture(GL_TEXTURE_2D, g->tex);
if (font->flags & BLF_SHADOW) {
glGetFloatv(GL_CURRENT_COLOR, color);
glColor4fv(font->shadow_col);
if (font->shadow == 3)
- blf_texture3_draw(gt->uv, dx, y1, dx1, y2);
+ blf_texture3_draw(g->uv, dx, y1, dx1, y2);
else if (font->shadow == 5)
- blf_texture5_draw(gt->uv, dx, y1, dx1, y2);
+ blf_texture5_draw(g->uv, dx, y1, dx1, y2);
else
- blf_texture_draw(gt->uv, dx, y1, dx1, y2);
+ blf_texture_draw(g->uv, dx, y1, dx1, y2);
glColor4fv(color);
x= xo;
y= yo;
- dx= floor(x + gt->pos_x);
- dx1= dx + gt->width;
- y1= y + gt->pos_y;
- y2= y + gt->pos_y - gt->height;
+ dx= floor(x + g->pos_x);
+ dx1= dx + g->width;
+ y1= y + g->pos_y;
+ y2= y + g->pos_y - g->height;
}
if (font->blur==3)
- blf_texture3_draw(gt->uv, dx, y1, dx1, y2);
+ blf_texture3_draw(g->uv, dx, y1, dx1, y2);
else if (font->blur==5)
- blf_texture5_draw(gt->uv, dx, y1, dx1, y2);
+ blf_texture5_draw(g->uv, dx, y1, dx1, y2);
else
- blf_texture_draw(gt->uv, dx, y1, dx1, y2);
-
- return(1);
-}
-
-int blf_glyph_bitmap_render(FontBLF *font, GlyphBLF *g, float x, float y)
-{
- GlyphBitmapBLF *gt;
- GLubyte null_bitmap= 0;
-
- gt= g->bitmap_data;
- if (!gt->image)
- return(1);
-
- if (font->flags & BLF_CLIPPING) {
- if (!BLI_in_rctf(&font->clip_rec, x + font->pos[0], y + font->pos[1]))
- return(0);
- if (!BLI_in_rctf(&font->clip_rec, x + font->pos[0], y + gt->height + font->pos[1]))
- return(0);
- if (!BLI_in_rctf(&font->clip_rec, x + gt->width + font->pos[0], y + gt->height + font->pos[1]))
- return(0);
- if (!BLI_in_rctf(&font->clip_rec, x + gt->width + font->pos[0], y + font->pos[1]))
- return(0);
- }
+ blf_texture_draw(g->uv, dx, y1, dx1, y2);
- glBitmap(0, 0, 0.0, 0.0, x + font->pos[0], y - font->pos[1], (const GLubyte *)&null_bitmap);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, gt->pitch * 8);
- glBitmap(gt->width, gt->height, 0.0, gt->pos_y, 0.0, 0.0, (const GLubyte *)gt->image);
- glBitmap(0, 0, 0.0, 0.0, -x - font->pos[0], -y + font->pos[1], (const GLubyte *)&null_bitmap);
return(1);
}
-
-int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
-{
- if (font->mode == BLF_MODE_BITMAP)
- return(blf_glyph_bitmap_render(font, g, x, y));
- return(blf_glyph_texture_render(font, g, x, y));
-}
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index c9bdc428ebb..2a69b8652ea 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -45,9 +45,12 @@ void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_s
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);
+float blf_font_fixed_width(FontBLF *font);
void blf_font_free(FontBLF *font);
GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi);
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index 5382ac19aae..fb4a2e6a9e5 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -78,7 +78,22 @@ typedef struct GlyphCacheBLF {
float descender;
} GlyphCacheBLF;
-typedef struct GlyphTextureBLF {
+typedef struct GlyphBLF {
+ struct GlyphBLF *next;
+ struct GlyphBLF *prev;
+
+ /* and the character, as UTF8 */
+ unsigned int c;
+
+ /* freetype2 index, to speed-up the search. */
+ FT_UInt idx;
+
+ /* glyph box. */
+ rctf box;
+
+ /* advance size. */
+ float advance;
+
/* texture id where this glyph is store. */
GLuint tex;
@@ -86,9 +101,15 @@ typedef struct GlyphTextureBLF {
int xoff;
int yoff;
+ /* Bitmap data, from freetype. Take care that this
+ * can be NULL.
+ */
+ unsigned char *bitmap;
+
/* glyph width and height. */
int width;
int height;
+ int pitch;
/* uv coords. */
float uv[2][2];
@@ -99,38 +120,9 @@ typedef struct GlyphTextureBLF {
*/
float pos_x;
float pos_y;
-} GlyphTextureBLF;
-
-typedef struct GlyphBitmapBLF {
- /* image data. */
- unsigned char *image;
-
- int width;
- int height;
- int pitch;
-
- float pos_x;
- float pos_y;
-} GlyphBitmapBLF;
-
-typedef struct GlyphBLF {
- struct GlyphBLF *next;
- struct GlyphBLF *prev;
-
- /* and the character, as UTF8 */
- unsigned int c;
-
- /* glyph box. */
- rctf box;
- /* advance size. */
- float advance;
-
- /* texture information. */
- GlyphTextureBLF *tex_data;
-
- /* bitmap information. */
- GlyphBitmapBLF *bitmap_data;
+ /* with value of zero mean that we need build the texture. */
+ short build_tex;
} GlyphBLF;
typedef struct FontBLF {
@@ -140,9 +132,6 @@ typedef struct FontBLF {
/* filename or NULL. */
char *filename;
- /* draw mode, texture or bitmap. */
- int mode;
-
/* aspect ratio or scale. */
float aspect;
@@ -177,9 +166,6 @@ typedef struct FontBLF {
/* font size. */
int size;
- /* kerning space, user setting. */
- float kerning;
-
/* max texture size. */
int max_tex_size;
@@ -194,6 +180,22 @@ typedef struct FontBLF {
/* freetype2 face. */
FT_Face face;
+
+ /* for draw to buffer, always set this to NULL after finish! */
+ float *b_fbuf;
+
+ /* the same but unsigned char */
+ unsigned char *b_cbuf;
+
+ /* buffer size. */
+ unsigned int bw;
+ unsigned int bh;
+
+ /* number of channels. */
+ int bch;
+
+ /* and the color, the alphas is get from the glyph! */
+ float b_col[4];
} FontBLF;
typedef struct DirBLF {
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 024172d6db4..ed684eda46f 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -60,17 +60,14 @@ char global_messagepath[1024];
char global_language[32];
char global_encoding_name[32];
-
-void BLF_lang_init(void)
+#if defined(__APPLE__)
+void BLF_lang_init(void) /* Apple Only, todo - use BLI_gethome_folder */
{
-#ifdef __APPLE__
char *bundlepath;
-#endif
strcpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT);
/* set messagepath directory */
-
#ifndef LOCALEDIR
#define LOCALEDIR "/usr/share/locale"
#endif
@@ -81,44 +78,52 @@ void BLF_lang_init(void)
BLI_make_file_string("/", global_messagepath, BLI_gethome(), ".blender/locale");
if (!BLI_exist(global_messagepath)) { /* locale not in home dir */
-#ifdef WIN32
- BLI_make_file_string("/", global_messagepath, BLI_gethome(), "/locale");
- if (!BLI_exist(global_messagepath)) {
-#endif
-#ifdef __APPLE__
/* message catalogs are stored inside the application bundle */
bundlepath= BLI_getbundle();
strcpy(global_messagepath, bundlepath);
strcat(global_messagepath, "/Contents/Resources/locale");
if (!BLI_exist(global_messagepath)) { /* locale not in bundle (now that's odd..) */
-#endif
strcpy(global_messagepath, LOCALEDIR);
if (!BLI_exist(global_messagepath)) { /* locale not in LOCALEDIR */
strcpy(global_messagepath, "message"); /* old compatibility as last */
}
-#ifdef WIN32
}
-#endif
-#ifdef __APPLE__
- }
-#endif
}
}
}
-
-void BLF_lang_set(const char *str)
+#elif defined(_WIN32)
+void BLF_lang_init(void) /* Windows Only, todo - use BLI_gethome_folder */
{
-#if defined (_WIN32) || defined(__APPLE__)
- char envstr[12];
+ strcpy(global_encoding_name, SYSTEM_ENCODING_DEFAULT);
+
+ strcpy(global_messagepath, ".blender/locale");
+
+ if (!BLI_exist(global_messagepath)) { /* locale not in current dir */
+ BLI_make_file_string("/", global_messagepath, BLI_gethome(), ".blender/locale");
- sprintf(envstr, "LANG=%s", str);
- envstr[strlen(envstr)]= '\0';
-#ifdef _WIN32
- gettext_putenv(envstr);
+ if (!BLI_exist(global_messagepath)) { /* locale not in home dir */
+ BLI_make_file_string("/", global_messagepath, BLI_gethome(), "/locale");
+ }
+ }
+}
#else
- putenv(envstr);
+void BLF_lang_init(void) /* not win or mac */
+{
+ char *messagepath= BLI_gethome_folder("locale", BLI_GETHOME_ALL);
+
+ if(messagepath)
+ strncpy(global_messagepath, messagepath, sizeof(global_messagepath));
+ else
+ global_messagepath[0]= '\0';
+
+}
#endif
+
+void BLF_lang_set(const char *str)
+{
+#if defined (_WIN32) || defined(__APPLE__)
+ BLI_setenv("LANG", str);
#else
char *locreturn= setlocale(LC_ALL, str);
if (locreturn == NULL) {
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index f0796697670..17b56864d1e 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -1,6 +1,6 @@
/* BKE_action.h May 2001
*
- * Blender kernel action functionality
+ * Blender kernel action and pose functionality
*
* Reevan McKay
*
@@ -26,7 +26,7 @@
* All rights reserved.
*
* Contributor(s): Full recode, Ton Roosendaal, Crete 2005
- * Full recode, Joshua Leung, 2009
+ * Full recode, Joshua Leung, 2009
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -41,6 +41,7 @@ struct bAction;
struct bActionGroup;
struct FCurve;
struct bPose;
+struct bItasc;
struct bPoseChannel;
struct Object;
struct Scene;
@@ -51,7 +52,7 @@ struct ID;
extern "C" {
#endif
-/* Action API ----------------- */
+/* Action Lib Stuff ----------------- */
/* Allocate a new bAction with the given name */
struct bAction *add_empty_action(const char name[]);
@@ -65,11 +66,42 @@ void free_action(struct bAction *act);
// XXX is this needed?
void make_local_action(struct bAction *act);
+
+/* Action API ----------------- */
+
+/* types of transforms applied to the given item
+ * - these are the return falgs for action_get_item_transforms()
+ */
+typedef enum eAction_TransformFlags {
+ /* location */
+ ACT_TRANS_LOC = (1<<0),
+ /* rotation */
+ ACT_TRANS_ROT = (1<<1),
+ /* scaling */
+ ACT_TRANS_SCALE = (1<<2),
+
+ /* all flags */
+ ACT_TRANS_ALL = (ACT_TRANS_LOC|ACT_TRANS_ROT|ACT_TRANS_SCALE),
+} eAction_TransformFlags;
+
+/* Return flags indicating which transforms the given object/posechannel has
+ * - if 'curves' is provided, a list of links to these curves are also returned
+ * whose nodes WILL NEED FREEING
+ */
+short action_get_item_transforms(struct bAction *act, struct Object *ob, struct bPoseChannel *pchan, ListBase *curves);
+
+
/* Some kind of bounding box operation on the action */
-void calc_action_range(const struct bAction *act, float *start, float *end, int incl_hidden);
+void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers);
+
+/* Does action have any motion data at all? */
+short action_has_motion(const struct bAction *act);
/* Action Groups API ----------------- */
+/* Get the active action-group for an Action */
+struct bActionGroup *get_active_actiongroup(struct bAction *act);
+
/* Make the given Action Group the active one */
void set_active_action_group(struct bAction *act, struct bActionGroup *agrp, short select);
@@ -100,8 +132,7 @@ void free_pose(struct bPose *pose);
* Allocate a new pose on the heap, and copy the src pose and it's channels
* into the new pose. *dst is set to the newly allocated structure, and assumed to be NULL.
*/
-void copy_pose(struct bPose **dst, struct bPose *src,
- int copyconstraints);
+void copy_pose(struct bPose **dst, struct bPose *src, int copyconstraints);
@@ -109,9 +140,8 @@ void copy_pose(struct bPose **dst, struct bPose *src,
* Return a pointer to the pose channel of the given name
* from this pose.
*/
-struct bPoseChannel *get_pose_channel(const struct bPose *pose,
- const char *name);
-
+struct bPoseChannel *get_pose_channel(const struct bPose *pose, const char *name);
+
/**
* Return a pointer to the active pose channel from this Object.
* (Note: Object, not bPose is used here, as we need layer info from Armature)
@@ -123,38 +153,45 @@ struct bPoseChannel *get_active_posechannel(struct Object *ob);
* already exists in this pose - if not a new one is
* allocated and initialized.
*/
-struct bPoseChannel *verify_pose_channel(struct bPose* pose,
- const char* name);
+struct bPoseChannel *verify_pose_channel(struct bPose* pose, const char* name);
+
+/* Copy the data from the action-pose (src) into the pose */
+void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
/* sets constraint flags */
void update_pose_constraint_flags(struct bPose *pose);
+/* return the name of structure pointed by pose->ikparam */
+const char *get_ikparam_name(struct bPose *pose);
+
+/* allocate and initialize pose->ikparam according to pose->iksolver */
+void init_pose_ikparam(struct bPose *pose);
+
+/* initialize a bItasc structure with default value */
+void init_pose_itasc(struct bItasc *itasc);
+
/* clears BONE_UNKEYED flags for frame changing */
// XXX to be depreceated for a more general solution in animsys...
void framechange_poses_clear_unkeyed(void);
+/* Bone Groups API --------------------- */
+
+/* Adds a new bone-group */
+void pose_add_group(struct Object *ob);
+
+/* Remove the active bone-group */
+void pose_remove_group(struct Object *ob);
+
+/* Assorted Evaluation ----------------- */
+
/* Used for the Action Constraint */
void what_does_obaction(struct Scene *scene, struct Object *ob, struct Object *workob, struct bPose *pose, struct bAction *act, char groupname[], float cframe);
-/* exported for game engine */
-void game_blend_poses(struct bPose *dst, struct bPose *src, float srcweight/*, short mode*/); /* was blend_poses */
-void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
-
/* for proxy */
void copy_pose_result(struct bPose *to, struct bPose *from);
/* clear all transforms */
void rest_pose(struct bPose *pose);
-/* map global time (frame nr) to strip converted time, doesn't clip */
-float get_action_frame(struct Object *ob, float cframe);
-/* map strip time to global time (frame nr) */
-float get_action_frame_inv(struct Object *ob, float cframe);
-
-
-/* functions used by the game engine */
-void game_copy_pose(struct bPose **dst, struct bPose *src);
-void game_free_pose(struct bPose *pose);
-
#ifdef __cplusplus
};
#endif
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index 5ea511738ad..32c5ff81740 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -39,19 +39,12 @@ struct PartEff;
struct Scene;
struct ListBase;
-typedef struct DupliObject {
- struct DupliObject *next, *prev;
- struct Object *ob;
- unsigned int origlay;
- int index, no_draw, type, animated;
- float mat[4][4], omat[4][4];
- float orco[3], uv[2];
-} DupliObject;
+#include "DNA_object_types.h"
void free_path(struct Path *path);
void calc_curvepath(struct Object *ob);
int interval_test(int min, int max, int p1, int cycl);
-int where_on_path(struct Object *ob, float ctime, float *vec, float *dir);
+int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius);
struct ListBase *object_duplilist(struct Scene *sce, struct Object *ob);
void free_object_duplilist(struct ListBase *lb);
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index b45917e6ca1..cc5b4dfdcaf 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -1,5 +1,28 @@
-/* Testing code for new animation system in 2.5
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (original author)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#ifndef BKE_ANIM_SYS_H
@@ -32,6 +55,9 @@ void BKE_free_animdata(struct ID *id);
/* Copy AnimData */
struct AnimData *BKE_copy_animdata(struct AnimData *adt);
+/* Make Local */
+void BKE_animdata_make_local(struct AnimData *adt);
+
/* ************************************* */
/* KeyingSets API */
@@ -43,6 +69,9 @@ void BKE_keyingset_add_destination(struct KeyingSet *ks, struct ID *id, const ch
struct KS_Path *BKE_keyingset_find_destination(struct KeyingSet *ks, struct ID *id, const char group_name[], const char rna_path[], int array_index, int group_mode);
+/* Copy all KeyingSets in the given list */
+void BKE_keyingsets_copy(struct ListBase *newlist, struct ListBase *list);
+
/* Free data for KeyingSet but not set itself */
void BKE_keyingset_free(struct KeyingSet *ks);
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 0595134f5c9..8dbd2721fb9 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -74,7 +74,6 @@ struct bArmature *add_armature(char *name);
struct bArmature *get_armature(struct Object *ob);
void free_boneChildren(struct Bone *bone);
void free_bones (struct bArmature *arm);
-void unlink_armature(struct bArmature *arm);
void free_armature(struct bArmature *arm);
void make_local_armature(struct bArmature *arm);
struct bArmature *copy_armature(struct bArmature *arm);
@@ -90,6 +89,7 @@ void where_is_armature (struct bArmature *arm);
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);
/* 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);
@@ -103,11 +103,6 @@ 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]);
-/* Animation functions */
-struct PoseTree *ik_tree_to_posetree(struct Object *ob, struct Bone *bone);
-void solve_posetree(PoseTree *tree);
-void free_posetree(PoseTree *tree);
-
/* B-Bone support */
typedef struct Mat4 {
float mat[4][4];
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 795c7585b9c..d60737d62fe 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -43,7 +43,7 @@ struct bContext;
struct ReportList;
#define BLENDER_VERSION 250
-#define BLENDER_SUBVERSION 0
+#define BLENDER_SUBVERSION 3
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
@@ -71,6 +71,7 @@ void pushpop_test(void);
/* global undo */
extern void BKE_write_undo(struct bContext *C, char *name);
extern void BKE_undo_step(struct bContext *C, int step);
+extern void BKE_undo_name(struct bContext *C, 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_boids.h b/source/blender/blenkernel/BKE_boids.h
new file mode 100644
index 00000000000..fb65c9c8920
--- /dev/null
+++ b/source/blender/blenkernel/BKE_boids.h
@@ -0,0 +1,60 @@
+/* BKE_particle.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_BOIDS_H
+#define BKE_BOIDS_H
+
+#include "DNA_boid_types.h"
+
+typedef struct BoidBrainData {
+ struct ParticleSimulationData *sim;
+ struct ParticleSettings *part;
+ float timestep, cfra, dfra;
+ float wanted_co[3], wanted_speed;
+
+ /* Goal stuff */
+ struct Object *goal_ob;
+ float goal_co[3];
+ float goal_nor[3];
+ float goal_priority;
+} BoidBrainData;
+
+void boids_precalc_rules(struct ParticleSettings *part, float cfra);
+void boid_brain(BoidBrainData *bbd, int p, struct ParticleData *pa);
+void boid_body(BoidBrainData *bbd, struct ParticleData *pa);
+void boid_default_settings(BoidSettings *boids);
+BoidRule *boid_new_rule(int type);
+BoidState *boid_new_state(BoidSettings *boids);
+BoidState *boid_duplicate_state(BoidSettings *boids, BoidState *state);
+void boid_free_settings(BoidSettings *boids);
+BoidSettings *boid_copy_settings(BoidSettings *boids);
+BoidState *boid_get_current_state(BoidSettings *boids);
+#endif
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index 9eb0b15aed4..f302618e60d 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -38,16 +38,15 @@ struct Scene;
struct wmOperator;
/* datablock functions */
-struct Brush *add_brush(char *name);
+struct Brush *add_brush(const char *name);
struct Brush *copy_brush(struct Brush *brush);
void make_local_brush(struct Brush *brush);
void free_brush(struct Brush *brush);
/* brush library operations used by different paint panels */
-struct Brush **current_brush_source(struct Scene *sce);
-int brush_set_nr(struct Brush **current_brush, int nr);
+int brush_set_nr(struct Brush **current_brush, int nr, const char *name);
int brush_delete(struct Brush **current_brush);
-void brush_check_exists(struct Brush **brush);
+void brush_check_exists(struct Brush **brush, const char *name);
void brush_toggled_fake_user(struct Brush *brush);
int brush_texture_set_nr(struct Brush *brush, int nr);
int brush_texture_delete(struct Brush *brush);
@@ -61,11 +60,10 @@ typedef enum {
BRUSH_PRESET_MAX
} BrushCurvePreset;
void brush_curve_preset(struct Brush *b, BrushCurvePreset preset);
-float brush_curve_strength(struct Brush *br, float p, const float len);
+float brush_curve_strength_clamp(struct Brush *br, float p, const float len);
+float brush_curve_strength(struct Brush *br, float p, const float len); /* used for sculpt */
/* sampling */
-float brush_sample_falloff(struct Brush *brush, float dist);
-float brush_sample_falloff_noalpha(struct Brush *brush, float dist);
void brush_sample_tex(struct Brush *brush, float *xy, float *rgba);
void brush_imbuf_new(struct Brush *brush, short flt, short texfalloff, int size,
struct ImBuf **imbuf);
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index e09be838f06..e5b3adbd0c0 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -46,6 +46,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "BKE_collision.h"
@@ -64,8 +65,7 @@ struct CollisionTree;
#elif defined (__sun) || defined (__sun__)
# define DO_INLINE
#else
-# define DO_INLINE inline
-# define LINUX
+# define DO_INLINE static inline
#endif
#define CLOTH_MAX_THREAD 2
@@ -176,7 +176,8 @@ typedef enum
CLOTH_SIMSETTINGS_FLAG_GOAL = ( 1 << 3 ), // we have goals enabled
CLOTH_SIMSETTINGS_FLAG_TEARING = ( 1 << 4 ),// true if tearing is enabled
CLOTH_SIMSETTINGS_FLAG_SCALING = ( 1 << 8 ), /* is advanced scaling active? */
- CLOTH_SIMSETTINGS_FLAG_CCACHE_EDIT = (1 << 12) /* edit cache in editmode */
+ CLOTH_SIMSETTINGS_FLAG_CCACHE_EDIT = (1 << 12), /* edit cache in editmode */
+ CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS = (1 << 13) /* don't allow spring compression */
} CLOTH_SIMSETTINGS_FLAGS;
/* COLLISION FLAGS */
@@ -244,10 +245,6 @@ void cloth_update_normals ( ClothVertex *verts, int nVerts, MFace *face, int tot
void bvhtree_update_from_cloth ( ClothModifierData *clmd, int moving );
void bvhselftree_update_from_cloth ( ClothModifierData *clmd, int moving );
-// needed for editmesh.c
-void cloth_write_cache ( Object *ob, ClothModifierData *clmd, float framenr );
-int cloth_read_cache ( Object *ob, ClothModifierData *clmd, float framenr );
-
// needed for button_object.c
void cloth_clear_cache ( Object *ob, ClothModifierData *clmd, float framenr );
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
index e4eed084a3d..e0df75f41b9 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -139,7 +139,7 @@ void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3],
/////////////////////////////////////////////////
// used in effect.c
/////////////////////////////////////////////////
-CollisionModifierData **get_collisionobjects(struct Scene *scene, Object *self, int *numcollobj);
+Object **get_collisionobjects(struct Scene *scene, Object *self, int *numcollobj);
/////////////////////////////////////////////////
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index 6f6c4a834df..c83a260690b 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -33,7 +33,16 @@ struct CurveMapping;
struct CurveMap;
struct ImBuf;
struct rctf;
-
+
+void gamma_correct_rec709(float *c, float gamma);
+void gamma_correct(float *c, float gamma);
+float srgb_to_linearrgb(float c);
+float linearrgb_to_srgb(float c);
+void color_manage_linearize(float *col_to, float *col_from);
+
+void floatbuf_to_srgb_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 w);
+
struct CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, float maxy);
void curvemapping_free(struct CurveMapping *cumap);
struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
@@ -60,5 +69,6 @@ void curvemapping_initialize(struct CurveMapping *cumap);
void curvemapping_table_RGBA(struct CurveMapping *cumap, float **array, int *size);
void colorcorrection_do_ibuf(struct ImBuf *ibuf, const char *profile);
+
#endif
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h
index 6e69906b71d..126816f5a95 100644
--- a/source/blender/blenkernel/BKE_constraint.h
+++ b/source/blender/blenkernel/BKE_constraint.h
@@ -38,6 +38,9 @@ struct Scene;
struct bPoseChannel;
/* ---------------------------------------------------------------------------- */
+#ifdef __cplusplus
+extern "C" {
+#endif
/* special struct for use in constraint evaluation */
typedef struct bConstraintOb {
@@ -49,6 +52,7 @@ typedef struct bConstraintOb {
float startmat[4][4]; /* original matrix (before constraint solving) */
short type; /* type of owner */
+ short rotOrder; /* rotation order for constraint owner (as defined in eEulerRotationOrders in BLI_arithb.h) */
} bConstraintOb;
/* ---------------------------------------------------------------------------- */
@@ -130,6 +134,9 @@ void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan,
void get_constraint_target_matrix(struct bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime);
void solve_constraints(struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index f536e117b7b..09e13c2930e 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -86,6 +86,25 @@ typedef struct bContextStore {
int used;
} bContextStore;
+/* for the conrtext's rna mode enum
+ * keep aligned with data_mode_strings in context.c */
+enum {
+ CTX_MODE_EDIT_MESH = 0,
+ CTX_MODE_EDIT_CURVE,
+ CTX_MODE_EDIT_SURFACE,
+ CTX_MODE_EDIT_TEXT,
+ CTX_MODE_EDIT_ARMATURE,
+ CTX_MODE_EDIT_METABALL,
+ CTX_MODE_EDIT_LATTICE,
+ CTX_MODE_POSE,
+ CTX_MODE_SCULPT,
+ CTX_MODE_PAINT_WEIGHT,
+ CTX_MODE_PAINT_VERTEX,
+ CTX_MODE_PAINT_TEXTURE,
+ CTX_MODE_PARTICLE,
+ CTX_MODE_OBJECT
+};
+
/* Context */
bContext *CTX_create(void);
@@ -101,6 +120,10 @@ bContextStore *CTX_store_copy(bContextStore *store);
void CTX_store_free(bContextStore *store);
void CTX_store_free_list(ListBase *contexts);
+/* need to store if python is initialized or not */
+int CTX_py_init_get(bContext *C);
+void CTX_py_init_set(bContext *C, int value);
+
/* Window Manager Context */
struct wmWindowManager *CTX_wm_manager(const bContext *C);
@@ -111,11 +134,25 @@ struct SpaceLink *CTX_wm_space_data(const bContext *C);
struct ARegion *CTX_wm_region(const bContext *C);
void *CTX_wm_region_data(const bContext *C);
struct ARegion *CTX_wm_menu(const bContext *C);
+struct ReportList *CTX_wm_reports(const bContext *C);
struct View3D *CTX_wm_view3d(const bContext *C);
struct RegionView3D *CTX_wm_region_view3d(const bContext *C);
struct SpaceText *CTX_wm_space_text(const bContext *C);
struct SpaceImage *CTX_wm_space_image(const bContext *C);
+struct SpaceConsole *CTX_wm_space_console(const bContext *C);
+struct SpaceButs *CTX_wm_space_buts(const bContext *C);
+struct SpaceFile *CTX_wm_space_file(const bContext *C);
+struct SpaceSeq *CTX_wm_space_seq(const bContext *C);
+struct SpaceOops *CTX_wm_space_outliner(const bContext *C);
+struct SpaceNla *CTX_wm_space_nla(const bContext *C);
+struct SpaceTime *CTX_wm_space_time(const bContext *C);
+struct SpaceNode *CTX_wm_space_node(const bContext *C);
+struct SpaceLogic *CTX_wm_space_logic(const bContext *C);
+struct SpaceIpo *CTX_wm_space_graph(const bContext *C);
+struct SpaceAction *CTX_wm_space_action(const bContext *C);
+struct SpaceInfo *CTX_wm_space_info(const bContext *C);
+struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C);
void CTX_wm_manager_set(bContext *C, struct wmWindowManager *wm);
void CTX_wm_window_set(bContext *C, struct wmWindow *win);
@@ -174,6 +211,9 @@ 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);
+int CTX_data_mode_enum(const bContext *C);
+
void CTX_data_main_set(bContext *C, struct Main *bmain);
void CTX_data_scene_set(bContext *C, struct Scene *bmain);
@@ -186,6 +226,9 @@ int CTX_data_selected_bases(const bContext *C, ListBase *list);
int CTX_data_visible_objects(const bContext *C, ListBase *list);
int CTX_data_visible_bases(const bContext *C, ListBase *list);
+int CTX_data_selectable_objects(const bContext *C, ListBase *list);
+int CTX_data_selectable_bases(const bContext *C, ListBase *list);
+
struct Object *CTX_data_active_object(const bContext *C);
struct Base *CTX_data_active_base(const bContext *C);
struct Object *CTX_data_edit_object(const bContext *C);
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index e5a8df1a932..78a2f13a7cc 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -47,7 +47,7 @@ struct BevList;
#define SEGMENTSU(nu) ( ((nu)->flagu & CU_CYCLIC) ? (nu)->pntsu : (nu)->pntsu-1 )
#define SEGMENTSV(nu) ( ((nu)->flagv & CU_CYCLIC) ? (nu)->pntsv : (nu)->pntsv-1 )
-#define CU_DO_TILT(cu, nu) (((nu->type & CU_2D) && (cu->flag & CU_3D)==0) ? 0 : 1)
+#define CU_DO_TILT(cu, nu) (((nu->flag & CU_2D) && (cu->flag & CU_3D)==0) ? 0 : 1)
#define CU_DO_RADIUS(cu, nu) ((CU_DO_TILT(cu, nu) || cu->bevobj || cu->ext1!=0.0 || cu->ext2!=0.0) ? 1:0)
@@ -72,7 +72,7 @@ void minmaxNurb( struct Nurb *nu, float *min, float *max);
void makeknots( struct Nurb *nu, short uv);
void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride);
-void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu);
+void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_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);
float *make_orco_surf( struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index 70b6c1d13f4..17a4749f704 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -32,6 +32,8 @@
#define DEPS_DEBUG
*/
+struct ID;
+struct Main;
struct Scene;
struct DagNodeQueue;
struct DagForest;
@@ -94,18 +96,24 @@ void draw_all_deps(void);
/* ********** API *************** */
/* Note that the DAG never executes changes in Objects, only sets flags in Objects */
+ /* (re)-create dependency graph for scene */
void DAG_scene_sort(struct Scene *sce);
/* flag all objects that need recalc because they're animated */
void DAG_scene_update_flags(struct Scene *sce, unsigned int lay);
- /* flag all objects that need recalc because they're animated, influencing this object only */
-void DAG_object_update_flags(struct Scene *sce, struct Object *ob, unsigned int lay);
-
/* flushes all recalc flags in objects down the dependency tree */
void DAG_scene_flush_update(struct Scene *sce, unsigned int lay, int time);
- /* flushes all recalc flags for this object down the dependency tree */
-void DAG_object_flush_update(struct Scene *sce, struct Object *ob, short flag);
+ /* 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);
+ /* when setting manual RECALC flags, call this afterwards */
+void DAG_ids_flush_update(int time);
+
+ /* (re)-create dependency graph for armature pose */
void DAG_pose_sort(struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index fd065978800..e21e83bf5cf 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -41,6 +41,8 @@ struct Particle;
struct Group;
struct RNG;
+struct PartDeflect *object_add_collision_fields(void);
+
typedef struct pEffectorCache {
struct pEffectorCache *next, *prev;
Object *ob;
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index 9b8a2990fe5..94d0864024b 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -1,12 +1,33 @@
-/* Testing code for new animation system in 2.5
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#ifndef BKE_FCURVE_H
#define BKE_FCURVE_H
-//struct ListBase;
-
struct FCurve;
struct FModifier;
struct ChannelDriver;
@@ -14,6 +35,8 @@ struct DriverTarget;
struct BezTriple;
+#include "DNA_curve_types.h"
+
/* ************** Keyframe Tools ***************** */
// XXX this stuff is defined in BKE_ipo.h too, so maybe skip for now?
@@ -54,8 +77,8 @@ typedef struct FModifierTypeInfo {
short size; /* size in bytes of the struct */
short acttype; /* eFMI_Action_Types */
short requires; /* eFMI_Requirement_Flags */
- char name[32]; /* name of modifier in interface */
- char structName[32]; /* name of struct for SDNA */
+ char name[64]; /* name of modifier in interface */
+ char structName[64]; /* name of struct for SDNA */
/* data management function pointers - special handling */
/* free any data that is allocated separately (optional) */
@@ -104,14 +127,20 @@ FModifierTypeInfo *get_fmodifier_typeinfo(int type);
/* ---------------------- */
-struct FModifier *fcurve_add_modifier(struct FCurve *fcu, int type);
-void fcurve_copy_modifiers(ListBase *dst, ListBase *src);
-void fcurve_remove_modifier(struct FCurve *fcu, struct FModifier *fcm);
-void fcurve_free_modifiers(struct FCurve *fcu);
-void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end);
+struct FModifier *add_fmodifier(ListBase *modifiers, int type);
+void copy_fmodifiers(ListBase *dst, ListBase *src);
+void remove_fmodifier(ListBase *modifiers, struct FModifier *fcm);
+void free_fmodifiers(ListBase *modifiers);
+
+struct FModifier *find_active_fmodifier(ListBase *modifiers);
+void set_active_fmodifier(ListBase *modifiers, struct FModifier *fcm);
+
+short list_has_suitable_fmodifier(ListBase *modifiers, int mtype, short acttype);
-struct FModifier *fcurve_find_active_modifier(struct FCurve *fcu);
-void fcurve_set_active_modifier(struct FCurve *fcu, struct FModifier *fcm);
+float evaluate_time_fmodifiers(ListBase *modifiers, struct FCurve *fcu, float cvalue, float evaltime);
+void evaluate_value_fmodifiers(ListBase *modifiers, struct FCurve *fcu, float *cvalue, float evaltime);
+
+void fcurve_bake_modifiers(struct FCurve *fcu, int start, int end);
/* ************** F-Curves API ******************** */
@@ -126,8 +155,10 @@ void copy_fcurves(ListBase *dst, ListBase *src);
/* find matching F-Curve in the given list of F-Curves */
struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int array_index);
-/* test if there is a keyframe at cfra */
-short on_keyframe_fcurve(struct FCurve *fcu, float cfra);
+/* Binary search algorithm for finding where to 'insert' BezTriple with given frame number.
+ * Returns the index to insert at (data already at that index will be offset if replace is 0)
+ */
+int binarysearch_bezt_index(struct BezTriple array[], float frame, int arraylen, short *replace);
/* get the time extents for F-Curve */
void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h
index 93358fcf7e8..145ae48e732 100644
--- a/source/blender/blenkernel/BKE_fluidsim.h
+++ b/source/blender/blenkernel/BKE_fluidsim.h
@@ -1,6 +1,5 @@
/**
- * BKE_fluidsim.h
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -28,29 +27,40 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "DNA_modifier_types.h"
-#include "DNA_object_fluidsim.h" // N_T
-#include "DNA_object_types.h"
+#ifndef BKE_FLUIDSIM_H
+#define BKE_FLUIDSIM_H
-#include "BKE_DerivedMesh.h"
+struct Object;
+struct Scene;
+struct FluidsimModifierData;
+struct DerivedMesh;
+struct MVert;
/* old interface */
-FluidsimSettings *fluidsimSettingsNew(Object *srcob);
-
-void initElbeemMesh(Scene *scene, Object *ob, int *numVertices, float **vertices, int *numTriangles, int **triangles, int useGlobalCoords, int modifierIndex);
+struct FluidsimSettings *fluidsimSettingsNew(struct Object *srcob);
+void initElbeemMesh(struct Scene *scene, struct Object *ob,
+ int *numVertices, float **vertices,
+ int *numTriangles, int **triangles,
+ int useGlobalCoords, int modifierIndex);
/* new fluid-modifier interface */
-void fluidsim_init(FluidsimModifierData *fluidmd);
-void fluidsim_free(FluidsimModifierData *fluidmd);
+void fluidsim_init(struct FluidsimModifierData *fluidmd);
+void fluidsim_free(struct FluidsimModifierData *fluidmd);
-DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams);
-void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename);
-DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+struct DerivedMesh *fluidsim_read_cache(struct Object *ob, struct DerivedMesh *orgdm,
+ struct FluidsimModifierData *fluidmd, int framenr, int useRenderParams);
+void fluidsim_read_vel_cache(struct FluidsimModifierData *fluidmd, struct DerivedMesh *dm,
+ char *filename);
+struct DerivedMesh *fluidsimModifier_do(struct FluidsimModifierData *fluidmd,
+ struct Scene *scene, struct Object *ob, struct DerivedMesh *dm,
+ int useRenderParams, int isFinalCalc);
-// get bounding box of mesh
-void fluid_get_bb(MVert *mvert, int totvert, float obmat[][4],
- /*RET*/ float start[3], /*RET*/ float size[3] );
+/* bounding box & memory estimate */
+void fluid_get_bb(struct MVert *mvert, int totvert, float obmat[][4],
+ float start[3], float size[3]);
+void fluid_estimate_memory(struct Object *ob, struct FluidsimSettings *fss, char *value);
+#endif
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 4b7ddf43647..5d0b89220d5 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -44,7 +44,6 @@ extern "C" {
/* forwards */
struct Main;
struct Object;
-struct bSoundListener;
struct BME_Glob;
typedef struct Global {
@@ -93,9 +92,6 @@ typedef struct Global {
/* save the allowed windowstate of blender when using -W or -w */
int windowstate;
- /* Janco's playing ground */
- struct bSoundListener* listener;
-
/* ndof device found ? */
int ndofdevice;
@@ -116,52 +112,39 @@ typedef struct Global {
#define G_FACESELECT (1 << 8)
-#define G_VERTEXPAINT (1 << 10)
-
#define G_DEBUG (1 << 12)
#define G_DOSCRIPTLINKS (1 << 13)
-#define G_WEIGHTPAINT (1 << 15)
-#define G_TEXTUREPAINT (1 << 16)
/* #define G_NOFROZEN (1 << 17) also removed */
#define G_GREASEPENCIL (1 << 17)
-#define G_SCULPTMODE (1 << 29)
-#define G_PARTICLEEDIT (1 << 30)
-
/* #define G_AUTOMATKEYS (1 << 30) also removed */
-#define G_HIDDENHANDLES (1 << 31) /* used for curves only */
-
-/* macro for testing face select mode
- * Texture paint could be removed since selected faces are not used
- * however hiding faces is useful */
-#define FACESEL_PAINT_TEST ((G.f&G_FACESELECT) && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT)))
/* G.fileflags */
#define G_AUTOPACK (1 << 0)
#define G_FILE_COMPRESS (1 << 1)
#define G_FILE_AUTOPLAY (1 << 2)
-#define G_FILE_ENABLE_ALL_FRAMES (1 << 3)
-#define G_FILE_SHOW_DEBUG_PROPS (1 << 4)
-#define G_FILE_SHOW_FRAMERATE (1 << 5)
-#define G_FILE_SHOW_PROFILE (1 << 6)
+#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_LOCK (1 << 7)
#define G_FILE_SIGN (1 << 8)
#define G_FIle_PUBLISH (1 << 9)
#define G_FILE_NO_UI (1 << 10)
-#define G_FILE_GAME_TO_IPO (1 << 11)
-#define G_FILE_GAME_MAT (1 << 12)
-#define G_FILE_DISPLAY_LISTS (1 << 13)
-#define G_FILE_SHOW_PHYSICS (1 << 14)
-#define G_FILE_GAME_MAT_GLSL (1 << 15)
-#define G_FILE_GLSL_NO_LIGHTS (1 << 16)
-#define G_FILE_GLSL_NO_SHADERS (1 << 17)
-#define G_FILE_GLSL_NO_SHADOWS (1 << 18)
-#define G_FILE_GLSL_NO_RAMPS (1 << 19)
-#define G_FILE_GLSL_NO_NODES (1 << 20)
-#define G_FILE_GLSL_NO_EXTRA_TEX (1 << 21)
-#define G_FILE_IGNORE_DEPRECATION_WARNINGS (1 << 22)
+#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_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_SHADERS (1 << 17) /* deprecated */
+#define G_FILE_GLSL_NO_SHADOWS (1 << 18) /* deprecated */
+#define G_FILE_GLSL_NO_RAMPS (1 << 19) /* deprecated */
+#define G_FILE_GLSL_NO_NODES (1 << 20) /* deprecated */
+#define G_FILE_GLSL_NO_EXTRA_TEX (1 << 21) /* deprecated */
+#define G_FILE_IGNORE_DEPRECATION_WARNINGS (1 << 22) /* deprecated */
/* G.windowstate */
#define G_WINDOWSTATE_USERDEF 0
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index 35084aabadf..b66ddf13527 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -41,6 +41,7 @@ void free_group_object(struct GroupObject *go);
void free_group(struct Group *group);
void unlink_group(struct Group *group);
struct Group *add_group(char *name);
+struct Group *copy_group(struct Group *group);
void add_to_group(struct Group *group, struct Object *ob);
int rem_from_group(struct Group *group, struct Object *ob);
struct Group *find_group(struct Object *ob, struct Group *group);
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 816baa20467..47ab6f324d3 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -125,6 +125,9 @@ void BKE_image_assign_ibuf(struct Image *ima, struct ImBuf *ibuf);
/* called on frame change or before render */
void BKE_image_user_calc_imanr(struct ImageUser *iuser, int cfra, int fieldnr);
+/* produce image export path */
+int BKE_get_image_export_path(struct Image *im, const char *dest_dir, char *abs, int abs_size, char *rel, int rel_size);
+
/* fix things in ImageUser when new image gets assigned */
void BKE_image_user_new_image(struct Image *ima, struct ImageUser *iuser);
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index e2f9dff6226..4bfa6a41099 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -52,8 +52,9 @@ struct Key *copy_key(struct Key *key);
void make_local_key(struct Key *key);
void sort_keys(struct Key *key);
-void set_four_ipo(float d, float *data, int type);
-void set_afgeleide_four_ipo(float d, float *data, int type);
+void key_curve_position_weights(float t, float *data, int type);
+void key_curve_tangent_weights(float t, float *data, int type);
+void key_curve_normal_weights(float t, float *data, int type);
/* only exported to curve.c! */
void cp_cu_key(struct Curve *cu, struct KeyBlock *kb, int start, int end);
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index ce182267b93..0e978128cf6 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -46,6 +46,9 @@ void *copy_libblock(void *rt);
void id_lib_extern(struct ID *id);
void id_us_plus(struct ID *id);
void id_us_min(struct ID *id);
+int id_make_local(struct ID *id, int test);
+int id_copy(struct ID *id, struct ID **newid, int test);
+int id_unlink(struct ID *id, int test);
int check_for_dupid(struct ListBase *lb, struct ID *id, char *name);
int new_id(struct ListBase *lb, struct ID *id, const char *name);
@@ -58,6 +61,7 @@ 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);
void splitIDname(char *name, char *left, int *nr);
void rename_id(struct ID *id, char *name);
@@ -73,6 +77,7 @@ void IPOnames_to_pupstring(char **str, char *title, char *extraops, struct ListB
void flag_listbase_ids(ListBase *lb, short flag, short value);
void flag_all_listbases_ids(short flag, short value);
+void recalc_all_library_objects(struct Main *main);
void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowManager *) );
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index ba78aa0682d..ff9ac693ba8 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -164,6 +164,7 @@ struct MetaBall *copy_mball(struct MetaBall *mb);
void make_local_mball(struct MetaBall *mb);
void tex_space_mball(struct Object *ob);
float *make_orco_mball(struct Object *ob);
+void copy_mball_properties(struct Scene *scene, struct Object *active_object);
struct Object *find_basis_mball(struct Scene *scene, struct Object *ob);
int is_basis_mball(struct Object *ob);
void metaball_polygonize(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 4065cbb7007..27c75126026 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -33,6 +33,7 @@
#include "DNA_modifier_types.h" /* needed for all enum typdefs */
#include "BKE_customdata.h"
+struct ID;
struct EditMesh;
struct DerivedMesh;
struct DagForest;
@@ -62,7 +63,7 @@ typedef enum {
* used for particles modifier that doesn't actually modify the object
* unless it's a mesh and can be exploded -> curve can also emit particles
*/
- eModifierTypeType_DeformOrConstruct
+ eModifierTypeType_DeformOrConstruct,
} ModifierTypeType;
typedef enum {
@@ -87,6 +88,12 @@ typedef enum {
/* For modifiers that support pointcache, so we can check to see if it has files we need to deal with
*/
eModifierTypeFlag_UsesPointCache = (1<<6),
+
+ /* For physics modifiers, max one per type */
+ eModifierTypeFlag_Single = (1<<7),
+
+ /* Some modifier can't be added manually by user */
+ eModifierTypeFlag_NoUserAdd = (1<<8)
} ModifierTypeFlag;
typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 6558212519f..a331479cad1 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -35,10 +35,12 @@ struct Object;
typedef struct MultiresSubsurf {
struct MultiresModifierData *mmd;
- struct Mesh *me;
+ struct Object *ob;
+ int local_mmd;
} MultiresSubsurf;
/* MultiresDM */
+struct Object *MultiresDM_get_object(struct DerivedMesh *dm);
struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm);
struct DerivedMesh *MultiresDM_new(struct MultiresSubsurf *, struct DerivedMesh*, int, int, int);
void *MultiresDM_get_vertnorm(struct DerivedMesh *);
@@ -58,8 +60,8 @@ void multires_mark_as_modified(struct Object *ob);
void multires_force_update(struct Object *ob);
-struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
- struct Mesh *, int, int);
+struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, int local_mmd, struct DerivedMesh*,
+ struct Object *, int, int);
struct MultiresModifierData *find_multires_modifier(struct Object *ob);
int multiresModifier_switch_level(struct Object *, const int);
diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h
index 230096d7ea7..989043c1d67 100644
--- a/source/blender/blenkernel/BKE_nla.h
+++ b/source/blender/blenkernel/BKE_nla.h
@@ -17,12 +17,12 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Joshua Leung (full recode)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -30,15 +30,93 @@
#ifndef BKE_NLA_H
#define BKE_NLA_H
-struct bActionStrip;
-struct ListBase;
-struct Object;
+struct AnimData;
+struct NlaStrip;
+struct NlaTrack;
+struct bAction;
+
+/* ----------------------------- */
+/* Data Management */
+
+void free_nlastrip(ListBase *strips, struct NlaStrip *strip);
+void free_nlatrack(ListBase *tracks, struct NlaTrack *nlt);
+void free_nladata(ListBase *tracks);
+
+struct NlaStrip *copy_nlastrip(struct NlaStrip *strip);
+struct NlaTrack *copy_nlatrack(struct NlaTrack *nlt);
+void copy_nladata(ListBase *dst, ListBase *src);
+
+struct NlaTrack *add_nlatrack(struct AnimData *adt, struct NlaTrack *prev);
+struct NlaStrip *add_nlastrip(struct bAction *act);
+struct NlaStrip *add_nlastrip_to_stack(struct AnimData *adt, struct bAction *act);
+
+/* ----------------------------- */
+/* API */
+
+short BKE_nlastrips_has_space(ListBase *strips, float start, float end);
+void BKE_nlastrips_sort_strips(ListBase *strips);
+
+short BKE_nlastrips_add_strip(ListBase *strips, struct NlaStrip *strip);
+
+
+void BKE_nlastrips_make_metas(ListBase *strips, short temp);
+void BKE_nlastrips_clear_metas(ListBase *strips, short onlySel, short onlyTemp);
+void BKE_nlastrips_clear_metastrip(ListBase *strips, struct NlaStrip *strip);
+short BKE_nlameta_add_strip(struct NlaStrip *mstrip, struct NlaStrip *strip);
+void BKE_nlameta_flush_transforms(struct NlaStrip *mstrip);
+
+/* ............ */
+
+struct NlaTrack *BKE_nlatrack_find_active(ListBase *tracks);
+void BKE_nlatrack_set_active(ListBase *tracks, struct NlaTrack *nlt);
+
+void BKE_nlatrack_solo_toggle(struct AnimData *adt, struct NlaTrack *nlt);
+
+short BKE_nlatrack_has_space(struct NlaTrack *nlt, float start, float end);
+void BKE_nlatrack_sort_strips(struct NlaTrack *nlt);
+
+short BKE_nlatrack_add_strip(struct NlaTrack *nlt, struct NlaStrip *strip);
+
+/* ............ */
+
+struct NlaStrip *BKE_nlastrip_find_active(struct NlaTrack *nlt);
+void BKE_nlastrip_set_active(struct AnimData *adt, struct NlaStrip *strip);
+
+short BKE_nlastrip_within_bounds(struct NlaStrip *strip, float min, float max);
+
+void BKE_nlastrip_validate_name(struct AnimData *adt, struct NlaStrip *strip);
+
+/* ............ */
+
+short BKE_nlatrack_has_animated_strips(struct NlaTrack *nlt);
+short BKE_nlatracks_have_animated_strips(ListBase *tracks);
+void BKE_nlastrip_validate_fcurves(struct NlaStrip *strip);
+
+void BKE_nla_validate_state(struct AnimData *adt);
+
+/* ............ */
+
+void BKE_nla_action_pushdown(struct AnimData *adt);
+
+short BKE_nla_tweakmode_enter(struct AnimData *adt);
+void BKE_nla_tweakmode_exit(struct AnimData *adt);
+
+/* ----------------------------- */
+/* Time Mapping */
+
+/* time mapping conversion modes */
+enum {
+ /* convert from global time to strip time - for evaluation */
+ NLATIME_CONVERT_EVAL = 0,
+ /* convert from global time to strip time - for editing corrections */
+ // XXX old 0 invert
+ NLATIME_CONVERT_UNMAP,
+ /* convert from strip time to global time */
+ // xxx old 1 invert
+ NLATIME_CONVERT_MAP,
+} eNlaTime_ConvertModes;
+
+float BKE_nla_tweakedit_remap(struct AnimData *adt, float cframe, short mode);
-void free_actionstrip (struct bActionStrip* strip);
-void free_nlastrips (struct ListBase *nlalist);
-void copy_nlastrips (struct ListBase *dst, struct ListBase *src);
-void copy_actionstrip (struct bActionStrip **dst, struct bActionStrip **src);
-void find_stridechannel(struct Object *ob, struct bActionStrip *strip);
-struct bActionStrip *convert_action_to_strip (struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 87ee8f9cab3..ea1707c19bf 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -42,15 +42,17 @@ struct bNode;
struct bNodeLink;
struct bNodeSocket;
struct bNodeStack;
-struct uiBlock;
+struct uiLayout;
struct rctf;
struct ListBase;
struct RenderData;
struct Scene;
+struct Main;
struct Tex;
struct GPUMaterial;
struct GPUNode;
struct GPUNodeStack;
+struct PointerRNA;
/* ************** NODE TYPE DEFINITIONS ***** */
@@ -81,7 +83,7 @@ typedef struct bNodeType {
void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
/* this line is set on startup of blender */
- int (*butfunc)(struct uiBlock *, struct bNodeTree *, struct bNode *, struct rctf *);
+ void (*uifunc)(struct uiLayout *, struct PointerRNA *ptr);
void (*initfunc)(struct bNode *);
void (*freestoragefunc)(struct bNode *);
@@ -324,7 +326,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
#define CMP_NODE_COMBYUVA 234
#define CMP_NODE_DIFF_MATTE 235
#define CMP_NODE_COLOR_SPILL 236
-#define CMP_NODE_CHROMA 237
+#define CMP_NODE_CHROMA_MATTE 237
#define CMP_NODE_CHANNEL_MATTE 238
#define CMP_NODE_FLIP 239
#define CMP_NODE_SPLITVIEWER 240
@@ -344,6 +346,9 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
#define CMP_NODE_DBLUR 254
#define CMP_NODE_BILATERALBLUR 255
#define CMP_NODE_PREMULKEY 256
+#define CMP_NODE_DIST_MATTE 257
+#define CMP_NODE_VIEW_LEVELS 258
+#define CMP_NODE_COLOR_MATTE 259
#define CMP_NODE_GLARE 301
#define CMP_NODE_TONEMAP 302
@@ -420,10 +425,9 @@ extern struct ListBase node_all_textures;
/* API */
int ntreeTexTagAnimated(struct bNodeTree *ntree);
-void ntreeTexUpdatePreviews( struct bNodeTree* nodetree );
-void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, char do_preview, short thread, struct Tex *tex, short which_output, int cfra);
+void ntreeTexSetPreviewFlag(int);
+void ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, short thread, struct Tex *tex, short which_output, int cfra);
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
-void ntreeTexAssignIndex(struct bNodeTree *ntree, struct bNode *node);
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
@@ -432,4 +436,8 @@ char* ntreeTexOutputMenu(struct bNodeTree *ntree);
void init_nodesystem(void);
void free_nodesystem(void);
+/**/
+
+void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
+
#endif
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 3d71193f37a..1cb6efeb838 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -98,11 +98,6 @@ void object_to_mat4(struct Object *ob, float mat[][4]);
void set_no_parent_ipo(int val);
-void disable_where_script(short on);
-int during_script(void);
-void disable_where_scriptlink(short on);
-int during_scriptlink(void);
-
void where_is_object_time(struct Scene *scene, struct Object *ob, float ctime);
void where_is_object(struct Scene *scene, struct Object *ob);
void where_is_object_simul(struct Scene *scene, struct Object *ob);
@@ -120,6 +115,11 @@ void object_handle_update(struct Scene *scene, struct Object *ob);
float give_timeoffset(struct Object *ob);
int give_obdata_texspace(struct Object *ob, int **texflag, float **loc, float **size, float **rot);
+
+int object_insert_ptcache(struct Object *ob);
+// void object_delete_ptcache(struct Object *ob, int index);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_packedFile.h b/source/blender/blenkernel/BKE_packedFile.h
index 2d5acc51b7b..b6513bede99 100644
--- a/source/blender/blenkernel/BKE_packedFile.h
+++ b/source/blender/blenkernel/BKE_packedFile.h
@@ -31,31 +31,42 @@
#ifndef BKE_PACKEDFILE_H
#define BKE_PACKEDFILE_H
-#define RET_OK 0
-#define RET_ERROR 1
+#define RET_OK 0
+#define RET_ERROR 1
-struct PackedFile;
-struct VFont;
-struct bSample;
struct bSound;
struct Image;
+struct Main;
+struct PackedFile;
+struct ReportList;
+struct VFont;
+
+/* pack */
+struct PackedFile *newPackedFile(struct ReportList *reports, char *filename);
+struct PackedFile *newPackedFileMemory(void *mem, int memlen);
+
+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 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);
+
+/* free */
+void freePackedFile(struct PackedFile *pf);
+
+/* info */
+int countPackedFiles(struct Main *bmain);
+int checkPackedFile(char *filename, struct PackedFile *pf);
+
+/* read */
+int seekPackedFile(struct PackedFile *pf, int offset, int whence);
+void rewindPackedFile(struct PackedFile *pf);
+int readPackedFile(struct PackedFile *pf, void *data, int size);
-struct PackedFile * newPackedFile(char * filename);
-struct PackedFile * newPackedFileMemory(void *mem, int memlen);
-
-int seekPackedFile(struct PackedFile * pf, int offset, int whence);
-void rewindPackedFile(struct PackedFile * pf);
-int readPackedFile(struct PackedFile * pf, void * data, int size);
-int countPackedFiles(void);
-void freePackedFile(struct PackedFile * pf);
-void packAll(void);
-int writePackedFile(char * filename, struct PackedFile *pf, int guimode);
-int checkPackedFile(char * filename, struct PackedFile * pf);
-char * unpackFile(char * abs_name, char * local_name, struct PackedFile * pf, int how);
-int unpackVFont(struct VFont * vfont, int how);
-int unpackSample(struct bSample *sample, int how);
-int unpackImage(struct Image * ima, int how);
-void unpackAll(int how);
-
#endif
diff --git a/source/blender/blenkernel/BKE_sculpt.h b/source/blender/blenkernel/BKE_paint.h
index 08db1ac632e..7dc9e4499c6 100644
--- a/source/blender/blenkernel/BKE_sculpt.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -1,6 +1,4 @@
/*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -17,7 +15,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2007 by Nicholas Bishop
+ * The Original Code is Copyright (C) 2009 by Nicholas Bishop
* All rights reserved.
*
* The Original Code is: all of this file.
@@ -25,17 +23,42 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- */
+ */
-#ifndef BKE_SCULPT_H
-#define BKE_SCULPT_H
+#ifndef BKE_PAINT_H
+#define BKE_PAINT_H
+struct Brush;
struct MFace;
struct MultireModifierData;
struct MVert;
-struct Sculpt;
+struct Object;
+struct Paint;
+struct Scene;
struct StrokeCache;
+extern const char PAINT_CURSOR_SCULPT[3];
+extern const char PAINT_CURSOR_VERTEX_PAINT[3];
+extern const char PAINT_CURSOR_WEIGHT_PAINT[3];
+extern const char PAINT_CURSOR_TEXTURE_PAINT[3];
+
+void paint_init(struct Paint *p, const char col[3]);
+void free_paint(struct Paint *p);
+void copy_paint(struct Paint *orig, struct Paint *new);
+
+struct Paint *paint_get_active(struct Scene *sce);
+struct Brush *paint_brush(struct Paint *paint);
+void paint_brush_set(struct Paint *paint, struct Brush *br);
+void paint_brush_slot_add(struct Paint *p);
+void paint_brush_slot_remove(struct Paint *p);
+
+/* testing face select mode
+ * Texture paint could be removed since selected faces are not used
+ * however hiding faces is useful */
+int paint_facesel_test(struct Object *ob);
+
+/* Session data (mode-specific) */
+
typedef struct SculptSession {
struct ProjVert *projverts;
@@ -59,13 +82,14 @@ typedef struct SculptSession {
/* Used to cache the render of the active texture */
unsigned int texcache_side, *texcache, texcache_actual;
- void *cursor; /* wm handle */
+ /* Layer brush persistence between strokes */
+ float (*mesh_co_orig)[3]; /* Copy of the mesh vertices' locations */
+ float *layer_disps; /* Displacements for each vertex */
struct SculptStroke *stroke;
-
struct StrokeCache *cache;
} SculptSession;
-void sculptsession_free(struct Sculpt *sculpt);
+void free_sculptsession(SculptSession **);
#endif
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 0ecd71fc4a3..5850ddaca08 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -55,6 +55,29 @@ struct IpoCurve;
struct LinkNode;
struct KDTree;
struct RNG;
+struct SurfaceModifierData;
+struct BVHTreeRay;
+struct BVHTreeRayHit;
+
+#define PARTICLE_P ParticleData *pa; int p
+#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 PSYS_FRAND_COUNT 1024
+#define PSYS_FRAND(seed) psys->frand[(seed) % PSYS_FRAND_COUNT]
+
+/* fast but sure way to get the modifier*/
+#define PARTICLE_PSMD ParticleSystemModifierData *psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys)
+
+/* common stuff that many particle functions need */
+typedef struct ParticleSimulationData {
+ struct Scene *scene;
+ struct Object *ob;
+ struct ParticleSystem *psys;
+ struct ParticleSystemModifierData *psmd;
+ float timestep;
+} ParticleSimulationData;
typedef struct ParticleEffectorCache {
struct ParticleEffectorCache *next, *prev;
@@ -91,19 +114,10 @@ typedef struct ParticleTexture{
float ivel; /* used in reset */
float time, life, exist, size; /* used in init */
float pvel[3]; /* used in physics */
- float length, clump, kink, rough; /* used in path caching */
+ float length, clump, kink, effector;/* used in path caching */
+ float rough1, rough2, roughe; /* used in path caching */
} ParticleTexture;
-typedef struct BoidVecFunc{
- void (*Addf)(float *v, float *v1, float *v2);
- void (*Subf)(float *v, float *v1, float *v2);
- void (*Mulf)(float *v, float f);
- float (*Length)(float *v);
- float (*Normalize)(float *v);
- float (*Inpf)(float *v1, float *v2);
- void (*Copyf)(float *v1, float *v2);
-} BoidVecFunc;
-
typedef struct ParticleSeam{
float v0[3], v1[3];
float nor[3], dir[3], tan[3];
@@ -115,53 +129,14 @@ typedef struct ParticleCacheKey{
float vel[3];
float rot[4];
float col[3];
+ float time;
int steps;
} ParticleCacheKey;
-typedef struct ParticleEditKey{
- float *co;
- float *vel;
- float *rot;
- float *time;
-
- float world_co[3];
- float length;
- short flag;
-} ParticleEditKey;
-
-typedef struct ParticleUndo {
- struct ParticleUndo *next, *prev;
- struct ParticleEditKey **keys;
- struct KDTree *emitter_field;
- struct ParticleData *particles;
- float *emitter_cosnos;
- int totpart, totkeys;
- char name[64];
-} ParticleUndo;
-
-typedef struct ParticleEdit {
- ListBase undo;
- struct ParticleUndo *curundo;
-
- ParticleEditKey **keys;
- int totkeys;
-
- int *mirror_cache;
-
- struct KDTree *emitter_field;
- float *emitter_cosnos;
-
- char sel_col[3];
- char nosel_col[3];
-} ParticleEdit;
-
typedef struct ParticleThreadContext {
/* shared */
- struct Scene *scene;
- struct Object *ob;
+ struct ParticleSimulationData sim;
struct DerivedMesh *dm;
- struct ParticleSystemModifierData *psmd;
- struct ParticleSystem *psys;
struct Material *ma;
/* distribution */
@@ -205,37 +180,52 @@ typedef struct ParticleBillboardData
int lock, num;
int totnum;
short align, uv_split, anim, split_offset;
-}
-ParticleBillboardData;
+} ParticleBillboardData;
+
+/* container for moving data between deflet_particle and particle_intersect_face */
+typedef struct ParticleCollision
+{
+ struct Object *ob, *ob_t; // collided and current objects
+ struct CollisionModifierData *md; // collision modifier for ob_t;
+ float nor[3]; // normal at collision point
+ float vel[3]; // velocity of collision point
+ float co1[3], co2[3]; // ray start and end points
+ float ray_len; // original length of co2-co1, needed for collision time evaluation
+ float t; // time of previous collision, needed for substracting face velocity
+} ParticleCollision;
+
+typedef struct ParticleDrawData {
+ float *vdata, *vd; /* vertice data */
+ float *ndata, *nd; /* normal data */
+ float *cdata, *cd; /* color data */
+ float *vedata, *ved; /* velocity data */
+ float *ma_r, *ma_g, *ma_b;
+ int tot_vec_size, flag;
+ int totpoint, totve;
+} ParticleDrawData;
+
+#define PARTICLE_DRAW_DATA_UPDATED 1
/* ----------- functions needed outside particlesystem ---------------- */
/* particle.c */
int count_particles(struct ParticleSystem *psys);
int count_particles_mod(struct ParticleSystem *psys, int totgr, int cur);
-int psys_count_keys(struct ParticleSystem *psys);
-char *psys_menu_string(struct Object *ob, int for_sb);
struct ParticleSystem *psys_get_current(struct Object *ob);
+/* for rna */
short psys_get_current_num(struct Object *ob);
+void psys_set_current_num(Object *ob, int index);
struct Object *psys_find_object(struct Scene *scene, struct ParticleSystem *psys);
-//struct ParticleSystem *psys_get(struct Object *ob, int index);
-struct ParticleData *psys_get_selected_particle(struct ParticleSystem *psys, int *index);
-struct ParticleKey *psys_get_selected_key(struct ParticleSystem *psys, int pa_index, int *key_index);
-void psys_change_act(void *ob_v, void *act_v);
-struct Object *psys_get_lattice(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
-void psys_disable_all(struct Object *ob);
-void psys_enable_all(struct Object *ob);
-int psys_ob_has_hair(struct Object *ob);
+
+struct Object *psys_get_lattice(struct ParticleSimulationData *sim);
+
int psys_in_edit_mode(struct Scene *scene, struct ParticleSystem *psys);
int psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);
+/* free */
void psys_free_settings(struct ParticleSettings *part);
-void free_child_path_cache(struct ParticleSystem *psys);
-void psys_free_path_cache(struct ParticleSystem *psys);
-void free_hair(struct ParticleSystem *psys, int softbody);
-void free_keyed_keys(struct ParticleSystem *psys);
+void psys_free_path_cache(struct ParticleSystem *psys, struct PTCacheEdit *edit);
void psys_free(struct Object * ob, struct ParticleSystem * psys);
-void psys_free_children(struct ParticleSystem *psys);
void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset);
void psys_render_restore(struct Object *ob, struct ParticleSystem *psys);
@@ -250,85 +240,91 @@ 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);
+void object_add_particle_system(struct Scene *scene, struct Object *ob);
+void object_remove_particle_system(struct Scene *scene, struct Object *ob);
struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
-int psys_count_autocache(struct Scene *scene, struct ParticleSettings *part);
void psys_flush_particle_settings(struct Scene *scene, struct ParticleSettings *part, int recalc);
void make_local_particlesettings(struct ParticleSettings *part);
-struct LinkNode *psys_using_settings(struct Scene *scene, struct ParticleSettings *part, int flush_update);
-void psys_changed_type(struct ParticleSystem *psys);
void psys_reset(struct ParticleSystem *psys, int mode);
-void psys_find_parents(struct Object *ob, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys);
+void psys_find_parents(struct ParticleSimulationData *sim);
-void psys_cache_paths(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate);
-void psys_cache_child_paths(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate);
-void psys_update_world_cos(struct Object *ob, struct ParticleSystem *psys);
+void psys_cache_paths(struct ParticleSimulationData *sim, float cfra);
+void psys_cache_edit_paths(struct Scene *scene, struct Object *ob, struct PTCacheEdit *edit, float cfra);
+void psys_cache_child_paths(struct ParticleSimulationData *sim, float cfra, int editupdate);
int do_guide(struct Scene *scene, struct ParticleKey *state, int pa_num, float time, struct ListBase *lb);
-float psys_get_size(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
-float psys_get_timestep(struct ParticleSettings *part);
-float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra);
+float psys_get_timestep(struct ParticleSimulationData *sim);
+float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *birthtime, float *dietime);
float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle *cpa, float cfra, float *pa_time);
-void psys_get_particle_on_path(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, int pa_num, struct ParticleKey *state, int vel);
-int psys_get_particle_state(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, int p, struct ParticleKey *state, int always);
+void psys_get_particle_on_path(struct ParticleSimulationData *sim, int pa_num, struct ParticleKey *state, int vel);
+int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct ParticleKey *state, int always);
+
+/* for anim.c */
void psys_get_dupli_texture(struct Object *ob, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, float *uv, float *orco);
-void psys_get_dupli_path_transform(struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[][4], float *scale);
+void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[][4], float *scale);
-ParticleThread *psys_threads_create(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
-int psys_threads_init_distribution(ParticleThread *threads, struct Scene *scene, struct DerivedMesh *dm, int from);
-int psys_threads_init_path(ParticleThread *threads, struct Scene *scene, float cfra, int editupdate);
+ParticleThread *psys_threads_create(struct ParticleSimulationData *sim);
void psys_threads_free(ParticleThread *threads);
-void psys_thread_distribute_particle(ParticleThread *thread, struct ParticleData *pa, struct ChildParticle *cpa, int p);
-void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i);
-
void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]);
/* particle_system.c */
-int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
-void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, struct Object **target_ob, struct ParticleSystem **target_psys);
+struct ParticleSystem *psys_get_target_system(struct Object *ob, struct ParticleTarget *pt);
+void psys_count_keyed_targets(struct ParticleSimulationData *sim);
+//void psys_get_reactor_target(struct ParticleSimulationData *sim, struct Object **target_ob, struct ParticleSystem **target_psys);
-void psys_init_effectors(struct Scene *scene, struct Object *obsrc, struct Group *group, struct ParticleSystem *psys);
-void psys_end_effectors(struct ParticleSystem *psys);
+int psys_update_effectors(ParticleSimulationData *sim, float cfra, int precalc);
-void psys_get_pointcache_start_end(struct Scene *scene, struct ParticleSystem *psys, int *sfra, int *efra);
+void psys_make_temp_pointcache(struct Object *ob, struct ParticleSystem *psys);
+void psys_get_pointcache_start_end(struct Scene *scene, ParticleSystem *psys, int *sfra, int *efra);
+
+void psys_check_boid_data(struct ParticleSystem *psys);
void particle_system_update(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
/* ----------- functions needed only inside particlesystem ------------ */
/* particle.c */
+void psys_disable_all(struct Object *ob);
+void psys_enable_all(struct Object *ob);
+
+void free_hair(struct Object *ob, struct ParticleSystem *psys, int dynamics);
+void free_keyed_keys(struct ParticleSystem *psys);
+void psys_free_particles(struct ParticleSystem *psys);
+void psys_free_children(struct ParticleSystem *psys);
+
void psys_interpolate_particle(short type, struct ParticleKey keys[4], float dt, struct ParticleKey *result, int velocity);
-void psys_key_to_object(struct Object *ob, struct ParticleKey *key, float imat[][4]);
-//void psys_key_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
-//void psys_key_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
-//void psys_face_mat(struct DerivedMesh *dm, struct ParticleData *pa, float mat[][4]);
void psys_vec_rot_to_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
-//void psys_vec_rot_from_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
+void psys_free_pdd(struct ParticleSystem *psys);
+
float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
-void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
+void psys_get_texture(struct ParticleSimulationData *sim, struct Material *ma, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float (*orcodata)[3], float *uv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
float psys_particle_value_from_verts(struct DerivedMesh *dm, short from, struct ParticleData *pa, float *values);
-float psys_interpolate_value_from_verts(struct DerivedMesh *dm, short from, int index, float *fw, float *values);
void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
+/* only in edisparticle.c*/
int psys_intersect_dm(struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_uv, float *face_minmax, float *pa_minmax, float radius, float *ipoint);
+/* BLI_bvhtree_ray_cast callback */
+void particle_intersect_face(void *userdata, int index, const struct BVHTreeRay *ray, struct BVHTreeRayHit *hit);
void psys_particle_on_dm(struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
/* particle_system.c */
-void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);
+void initialize_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, int p);
-void do_effectors(int pa_no, struct ParticleData *pa, struct ParticleKey *state, struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, float *texco, float *force_field, float *vel,float framestep, float cfra);
+int effector_find_co(struct Scene *scene, float *pco, struct SurfaceModifierData *sur, struct Object *ob, struct PartDeflect *pd, float *co, float *nor, float *vel, int *index);
+void do_effectors(struct ParticleSimulationData *sim, int pa_no, struct ParticleData *pa, struct ParticleKey *state, float *texco, float *force_field, float *vel,float framestep, float cfra);
+void psys_end_effectors(struct ParticleSystem *psys);
void psys_calc_dmcache(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, float *fw, struct LinkNode *node);
-void reset_particle(struct Scene *scene, struct ParticleData *pa, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd, struct Object *ob,
- float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot);
+void reset_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, float dtime, float cfra);
/* psys_reset */
@@ -343,12 +339,6 @@ void reset_particle(struct Scene *scene, struct ParticleData *pa, struct Particl
#define PSYS_EC_PARTICLE 4
#define PSYS_EC_REACTOR 8
-/* ParticleEditKey->flag */
-#define PEK_SELECT 1
-#define PEK_TO_SELECT 2
-#define PEK_TAG 4
-#define PEK_HIDE 8
-
/* index_dmcache */
#define DMCACHE_NOTFOUND -1
#define DMCACHE_ISCHILD -2
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index b79357edf36..5ae10d736fd 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -30,6 +30,8 @@
#define BKE_POINTCACHE_H
#include "DNA_ID.h"
+#include "DNA_object_force.h"
+#include "DNA_boid_types.h"
#include "MEM_guardedalloc.h"
@@ -55,9 +57,11 @@
#define PTCACHE_FILE_WRITE 1
/* PTCacheID types */
-#define PTCACHE_TYPE_SOFTBODY 0
-#define PTCACHE_TYPE_PARTICLES 1
-#define PTCACHE_TYPE_CLOTH 2
+#define PTCACHE_TYPE_SOFTBODY 0
+#define PTCACHE_TYPE_PARTICLES 1
+#define PTCACHE_TYPE_CLOTH 2
+#define PTCACHE_TYPE_SMOKE_DOMAIN 3
+#define PTCACHE_TYPE_SMOKE_HIGHRES 4
/* PTCache read return code */
#define PTCACHE_READ_EXACT 1
@@ -69,53 +73,80 @@ struct Object;
struct Scene;
struct SoftBody;
struct ParticleSystem;
+struct ParticleKey;
struct ClothModifierData;
+struct SmokeModifierData;
struct PointCache;
struct ListBase;
+/* temp structure for read/write */
+typedef struct PTCacheData {
+ int index;
+ float loc[3];
+ float vel[3];
+ float rot[4];
+ float ave[3];
+ float size;
+ float times[3];
+ struct BoidData boids;
+} PTCacheData;
+
typedef struct PTCacheFile {
FILE *fp;
+
+ int totpoint, type;
+ unsigned int data_types;
+
+ struct PTCacheData data;
+ void *cur[BPHYS_TOT_DATA];
} PTCacheFile;
+#define PTCACHE_VEL_PER_SEC 1
+
typedef struct PTCacheID {
struct PTCacheID *next, *prev;
+ struct Scene *scene;
struct Object *ob;
- void *data;
+ void *calldata;
int type;
int stack_index;
+ int flag;
- struct PointCache *cache;
-} PTCacheID;
+ /* flags defined in DNA_object_force.h */
+ unsigned int data_types, info_types;
-typedef struct PTCacheWriter {
- struct PTCacheID *pid;
- int cfra;
- int totelem;
-
- float *(*elem_ptr)(int index, void *calldata);
- void *calldata;
-} PTCacheWriter;
+ /* copies point data to cache data */
+ int (*write_elem)(int index, void *calldata, void **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);
-typedef struct PTCacheReader {
- struct Scene *scene;
- struct PTCacheID *pid;
- float cfra;
- int totelem;
+ /* total number of simulated points */
+ int (*totpoint)(void *calldata);
+ /* number of points written for current cache frame (currently not used) */
+ int (*totwrite)(void *calldata);
- void (*set_elem)(int index, void *calldata, float *data);
- void (*interpolate_elem)(int index, void *calldata, float frs_sec, float cfra, int cfra1, int cfra2, float *data1, float *data2);
- void *calldata;
+ int (*write_header)(PTCacheFile *pf);
+ int (*read_header)(PTCacheFile *pf);
- int allow_interpolate;
- int allow_old;
- int *old_frame;
-} PTCacheReader;
+ struct PointCache *cache;
+ /* used for setting the current cache from ptcaches list */
+ struct PointCache **cache_ptr;
+ struct ListBase *ptcaches;
+} PTCacheID;
typedef struct PTCacheBaker {
struct Scene *scene;
int bake;
int render;
+ int anim_init;
+ int quick_step;
struct PTCacheID *pid;
int (*break_test)(void *data);
void *break_data;
@@ -123,45 +154,150 @@ typedef struct PTCacheBaker {
void *progresscontext;
} PTCacheBaker;
-/* Creating ID's */
+/* PTCacheEditKey->flag */
+#define PEK_SELECT 1
+#define PEK_TAG 2
+#define PEK_HIDE 4
+#define PEK_USE_WCO 8
+
+typedef struct PTCacheEditKey{
+ float *co;
+ float *vel;
+ float *rot;
+ float *time;
+
+ float world_co[3];
+ float ftime;
+ float length;
+ short flag;
+} PTCacheEditKey;
+
+/* PTCacheEditPoint->flag */
+#define PEP_TAG 1
+#define PEP_EDIT_RECALC 2
+#define PEP_TRANSFORM 4
+#define PEP_HIDE 8
+
+typedef struct PTCacheEditPoint {
+ struct PTCacheEditKey *keys;
+ int totkey;
+ short flag;
+} PTCacheEditPoint;
+
+typedef struct PTCacheUndo {
+ struct PTCacheUndo *next, *prev;
+ struct PTCacheEditPoint *points;
+
+ /* particles stuff */
+ struct ParticleData *particles;
+ struct KDTree *emitter_field;
+ float *emitter_cosnos;
+ int psys_flag;
+
+ /* cache stuff */
+ struct ListBase mem_cache;
+
+ int totpoint;
+ char name[64];
+} PTCacheUndo;
+
+typedef struct PTCacheEdit {
+ ListBase undo;
+ struct PTCacheUndo *curundo;
+ PTCacheEditPoint *points;
+
+ struct PTCacheID pid;
+
+ /* particles stuff */
+ struct ParticleSystem *psys;
+ struct ParticleData *particles;
+ struct KDTree *emitter_field;
+ float *emitter_cosnos;
+ int *mirror_cache;
+
+ struct ParticleCacheKey **pathcache; /* path cache (runtime) */
+ ListBase pathcachebufs;
+
+ int totpoint, totframes, totcached, edited;
+
+ char sel_col[3];
+ char nosel_col[3];
+} PTCacheEdit;
+
+/* Particle functions */
+void BKE_ptcache_make_particle_key(struct ParticleKey *key, int index, void **data, float time);
+
+/**************** Creating ID's ****************************/
void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb);
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);
-/* Global funcs */
+/***************** Global funcs ****************************/
void BKE_ptcache_remove(void);
-/* ID specific functions */
+/************ ID specific functions ************************/
void BKE_ptcache_id_clear(PTCacheID *id, int mode, 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);
int BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode);
-/* File reading/writing */
-PTCacheFile *BKE_ptcache_file_open(PTCacheID *id, int mode, int cfra);
-void BKE_ptcache_file_close(PTCacheFile *pf);
-int BKE_ptcache_file_read_floats(PTCacheFile *pf, float *f, int tot);
-int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot);
+void BKE_ptcache_update_info(PTCacheID *pid);
+
+/*********** General cache reading/writing ******************/
-/* General cache reading/writing */
-int BKE_ptcache_read_cache(PTCacheReader *reader);
-int BKE_ptcache_write_cache(PTCacheWriter *writer);
+/* Size of cache data type. */
+int BKE_ptcache_data_size(int data_type);
-/* Continue physics */
+/* Memory cache read/write helpers. */
+void BKE_ptcache_mem_init_pointers(struct PTCacheMem *pm);
+void BKE_ptcache_mem_incr_pointers(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);
+
+/* Copy a specific data type from point data to cache data. */
+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);
+
+/* Main cache writing call. */
+int BKE_ptcache_write_cache(PTCacheID *pid, int cfra);
+
+/****************** Continue physics ***************/
void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable);
int BKE_ptcache_get_continue_physics(void);
-/* Point Cache */
-struct PointCache *BKE_ptcache_add(void);
+/******************* Allocate & free ***************/
+struct PointCache *BKE_ptcache_add(struct ListBase *ptcaches);
+void BKE_ptcache_free_mem(struct ListBase *mem_cache);
void BKE_ptcache_free(struct PointCache *cache);
-struct PointCache *BKE_ptcache_copy(struct PointCache *cache);
+void BKE_ptcache_free_list(struct ListBase *ptcaches);
+struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct ListBase *ptcaches_old);
+
+/********************** Baking *********************/
-/* Baking */
-void BKE_ptcache_autocache_all(struct Scene *scene);
+/* Bakes cache with cache_step sized jumps in time, not accurate but very fast. */
+void BKE_ptcache_quick_cache_all(struct Scene *scene);
+
+/* Bake cache or simulate to current frame with settings defined in the baker. */
void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
+
+/* Convert disk cache to memory cache. */
+void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
+
+/* Convert memory cache to disk cache. */
+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);
+/* Loads simulation from external (disk) cache files. */
+void BKE_ptcache_load_external(struct PTCacheID *pid);
+
#endif
diff --git a/source/blender/blenkernel/BKE_property.h b/source/blender/blenkernel/BKE_property.h
index 6af1deda727..78a9ecddaac 100644
--- a/source/blender/blenkernel/BKE_property.h
+++ b/source/blender/blenkernel/BKE_property.h
@@ -41,6 +41,7 @@ struct bProperty *copy_property(struct bProperty *prop);
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);
void set_ob_property(struct Object *ob, struct bProperty *propc);
int compare_property(struct bProperty *prop, char *str);
diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h
index 21221026b8b..1d72b1c81f0 100644
--- a/source/blender/blenkernel/BKE_report.h
+++ b/source/blender/blenkernel/BKE_report.h
@@ -32,38 +32,14 @@
extern "C" {
#endif
-#include "DNA_listBase.h"
+#include "DNA_windowmanager_types.h"
-/* Reporting Information and Errors */
-
-typedef enum ReportType {
- RPT_DEBUG = 0,
- RPT_INFO = 1000,
- RPT_WARNING = 2000,
- RPT_ERROR = 3000,
- RPT_ERROR_INVALID_INPUT = 3001,
- RPT_ERROR_INVALID_CONTEXT = 3002,
- RPT_ERROR_OUT_OF_MEMORY = 3003
-} ReportType;
-
-enum ReportListFlags {
- RPT_PRINT = 1,
- RPT_STORE = 2,
-};
-
-typedef struct Report {
- struct Report *next, *prev;
- ReportType type;
- char *typestr;
- char *message;
-} Report;
+/* Reporting Information and Errors
+ *
+ * These functions also accept NULL in case no error reporting
+ * is needed. */
-typedef struct ReportList {
- ListBase list;
- ReportType printlevel;
- ReportType storelevel;
- int flag;
-} ReportList;
+/* report structures are stored in DNA */
void BKE_reports_init(ReportList *reports, int flag);
void BKE_reports_clear(ReportList *reports);
diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h
index 22c4f39148a..1b8e61f136f 100644
--- a/source/blender/blenkernel/BKE_sca.h
+++ b/source/blender/blenkernel/BKE_sca.h
@@ -47,7 +47,6 @@ void unlink_actuators(struct ListBase *lb);
void free_actuator(struct bActuator *act);
void free_actuators(struct ListBase *lb);
-void free_text_controllers(struct Text *txt);
void free_sensor(struct bSensor *sens);
void free_sensors(struct ListBase *lb);
struct bSensor *copy_sensor(struct bSensor *sens);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 9bb246f88cc..686fc265de0 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -40,6 +40,12 @@ struct AviCodecData;
struct QuicktimeCodecData;
struct RenderData;
struct Text;
+struct Main;
+
+#define SCE_COPY_EMPTY 0
+#define SCE_COPY_LINK_OB 1
+#define SCE_COPY_LINK_DATA 2
+#define SCE_COPY_FULL 3
/* note; doesn't work when scene is empty */
#define SETLOOPER(s, b) sce= s, b= (Base*)sce->base.first; b; b= (Base*)(b->next?b->next:sce->set?(sce=sce->set)->base.first:NULL)
@@ -48,13 +54,16 @@ struct Text;
void free_avicodecdata(struct AviCodecData *acd);
void free_qtcodecdata(struct QuicktimeCodecData *acd);
-void free_scene(struct Scene *me);
+void free_scene(struct Scene *sce);
struct Scene *add_scene(char *name);
struct Base *object_in_scene(struct Object *ob, struct Scene *sce);
void set_scene_bg(struct Scene *sce);
void set_scene_name(char *name);
+struct Scene *copy_scene(struct Main *bmain, 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);
struct Object *scene_find_camera(struct Scene *sc);
@@ -75,7 +84,5 @@ 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);
-void free_dome_warp_text(struct Text *txt);
-
#endif
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 750f4fba7e6..ee04d4f47bc 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -46,10 +46,8 @@ struct wmWindow;
struct wmWindowManager;
struct uiLayout;
struct uiMenuItem;
-struct StructRNA;
-struct PointerRNA;
-struct FunctionRNA;
-struct ParameterList;
+
+#include "RNA_types.h"
/* spacetype has everything stored to get an editor working, it gets initialized via
ED_spacetypes_init() in editors/area/spacetypes.c */
@@ -91,6 +89,9 @@ typedef struct SpaceType {
/* region type definitions */
ListBase regiontypes;
+ /* tool shelf definitions */
+ ListBase toolshelf;
+
/* read and write... */
/* default keymaps to add */
@@ -139,7 +140,7 @@ typedef struct ARegionType {
/* menu type definitions */
ListBase menutypes;
-
+
/* hardcoded constraints, smaller than these values region is not visible */
int minsizex, minsizey;
/* default keymaps to add */
@@ -166,11 +167,8 @@ typedef struct PanelType {
/* draw entirely, view changes should be handled here */
void (*draw)(const struct bContext *, struct Panel *);
- /* python integration */
- void *py_data;
- struct StructRNA *py_srna;
- int (*py_call)(struct PointerRNA *, struct FunctionRNA *, struct ParameterList *);
- void (*py_free)(void *py_data);
+ /* RNA integration */
+ ExtensionRNA ext;
} PanelType;
/* header types */
@@ -184,13 +182,16 @@ typedef struct HeaderType {
/* draw entirely, view changes should be handled here */
void (*draw)(const struct bContext *, struct Header *);
- /* python integration */
- void *py_data;
- struct StructRNA *py_srna;
- int (*py_call)(struct PointerRNA *, struct FunctionRNA *, struct ParameterList *);
- void (*py_free)(void *py_data);
+ /* RNA integration */
+ ExtensionRNA ext;
} HeaderType;
+typedef struct Header {
+ struct HeaderType *type; /* runtime */
+ struct uiLayout *layout; /* runtime for drawing */
+} Header;
+
+
/* menu types */
typedef struct MenuType {
@@ -205,13 +206,15 @@ typedef struct MenuType {
/* draw entirely, view changes should be handled here */
void (*draw)(const struct bContext *, struct Menu *);
- /* python integration */
- void *py_data;
- struct StructRNA *py_srna;
- int (*py_call)(struct PointerRNA *, struct FunctionRNA *, struct ParameterList *);
- void (*py_free)(void *py_data);
+ /* RNA integration */
+ ExtensionRNA ext;
} MenuType;
+typedef struct Menu {
+ struct MenuType *type; /* runtime */
+ struct uiLayout *layout; /* runtime for drawing */
+} Menu;
+
/* spacetypes */
struct SpaceType *BKE_spacetype_from_id(int spaceid);
struct ARegionType *BKE_regiontype_from_id(struct SpaceType *st, int regionid);
@@ -227,11 +230,11 @@ void BKE_spacedata_copyfirst(ListBase *lb1, ListBase *lb2);
/* area/regions */
struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
void BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
+void BKE_screen_area_free(struct ScrArea *sa);
-void BKE_screen_area_free(struct ScrArea *sa);
-
+/* screen */
void free_screen(struct bScreen *sc);
-
+unsigned int BKE_screen_visible_layers(struct bScreen *screen);
#endif
diff --git a/source/blender/blenkernel/BKE_sequence.h b/source/blender/blenkernel/BKE_sequence.h
index 65a3b0216fe..f72617c8312 100644
--- a/source/blender/blenkernel/BKE_sequence.h
+++ b/source/blender/blenkernel/BKE_sequence.h
@@ -37,6 +37,7 @@ struct Strip;
struct StripElem;
struct ImBuf;
struct Scene;
+struct bContext;
#define MAXSEQ 32
@@ -44,7 +45,6 @@ struct Scene;
#define BUILD_SEQAR_COUNT_CURRENT 1
#define BUILD_SEQAR_COUNT_CHILDREN 2
-
/* sequence iterator */
typedef struct SeqIterator {
@@ -137,9 +137,9 @@ struct SeqEffectHandle {
/* sequence.c */
// extern
-void seq_free_sequence(struct Editing *ed, struct Sequence *seq);
+void seq_free_sequence(struct Scene *scene, struct Sequence *seq);
void seq_free_strip(struct Strip *strip);
-void seq_free_editing(struct Editing *ed);
+void seq_free_editing(struct Scene *scene);
struct Editing *seq_give_editing(struct Scene *scene, int alloc);
char *give_seqname(struct Sequence *seq);
struct ImBuf *give_ibuf_seq(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
@@ -181,5 +181,10 @@ int check_single_seq(struct Sequence *seq);
void fix_single_seq(struct Sequence *seq);
int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test);
-void free_imbuf_seq(struct ListBase * seqbasep);
+void free_imbuf_seq(struct ListBase * seqbasep, int check_mem_usage);
+
+void seq_update_sound(struct Sequence *seq);
+
+void clear_scene_in_allseqs(struct Scene *sce);
+
diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index eb0e3c4ef00..5b413ae4e44 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -115,9 +115,9 @@ typedef struct ShrinkwrapCalcData
int vgroup; //Vertex group num
struct DerivedMesh *target; //mesh we are shrinking to
- SpaceTransform local2target; //transform to move bettwem local and target space
+ SpaceTransform local2target; //transform to move between local and target space
- float keepDist; //Distance to kept from target (units are in local space)
+ float keepDist; //Distance to keep above target surface (units are in local space)
} ShrinkwrapCalcData;
diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h
new file mode 100644
index 00000000000..424dd5c9f80
--- /dev/null
+++ b/source/blender/blenkernel/BKE_sketch.h
@@ -0,0 +1,157 @@
+/**
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef BKE_SKETCH_H
+#define BKE_SKETCH_H
+
+typedef enum SK_PType
+{
+ PT_CONTINUOUS,
+ PT_EXACT,
+} SK_PType;
+
+typedef enum SK_PMode
+{
+ PT_SNAP,
+ PT_PROJECT,
+} SK_PMode;
+
+typedef struct SK_Point
+{
+ float p[3];
+ short p2d[2];
+ float no[3];
+ float size;
+ SK_PType type;
+ SK_PMode mode;
+} SK_Point;
+
+typedef struct SK_Stroke
+{
+ struct SK_Stroke *next, *prev;
+
+ SK_Point *points;
+ int nb_points;
+ int buf_size;
+ int selected;
+} SK_Stroke;
+
+#define SK_OVERDRAW_LIMIT 5
+
+typedef struct SK_Overdraw
+{
+ SK_Stroke *target;
+ int start, end;
+ int count;
+} SK_Overdraw;
+
+#define SK_Stroke_BUFFER_INIT_SIZE 20
+
+typedef struct SK_DrawData
+{
+ short mval[2];
+ short previous_mval[2];
+ SK_PType type;
+} SK_DrawData;
+
+typedef struct SK_Intersection
+{
+ struct SK_Intersection *next, *prev;
+ SK_Stroke *stroke;
+ int before;
+ int after;
+ int gesture_index;
+ float p[3];
+ float lambda; /* used for sorting intersection points */
+} SK_Intersection;
+
+typedef struct SK_Sketch
+{
+ ListBase strokes;
+ ListBase depth_peels;
+ SK_Stroke *active_stroke;
+ SK_Stroke *gesture;
+ SK_Point next_point;
+ SK_Overdraw over;
+} SK_Sketch;
+
+
+typedef struct SK_Gesture {
+ SK_Stroke *stk;
+ SK_Stroke *segments;
+
+ ListBase intersections;
+ ListBase self_intersections;
+
+ int nb_self_intersections;
+ int nb_intersections;
+ int nb_segments;
+} SK_Gesture;
+
+
+/************************************************/
+
+void freeSketch(SK_Sketch *sketch);
+SK_Sketch* createSketch();
+
+void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk);
+
+void sk_freeStroke(SK_Stroke *stk);
+SK_Stroke* sk_createStroke();
+
+SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
+
+void sk_allocStrokeBuffer(SK_Stroke *stk);
+void sk_shrinkStrokeBuffer(SK_Stroke *stk);
+void sk_growStrokeBuffer(SK_Stroke *stk);
+void sk_growStrokeBufferN(SK_Stroke *stk, int n);
+
+void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n);
+void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n);
+void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt);
+void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end);
+
+void sk_trimStroke(SK_Stroke *stk, int start, int end);
+void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3]);
+void sk_polygonizeStroke(SK_Stroke *stk, int start, int end);
+void sk_flattenStroke(SK_Stroke *stk, int start, int end);
+void sk_reverseStroke(SK_Stroke *stk);
+
+void sk_filterLastContinuousStroke(SK_Stroke *stk);
+void sk_filterStroke(SK_Stroke *stk, int start, int end);
+
+void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no);
+void sk_copyPoint(SK_Point *dst, SK_Point *src);
+
+int sk_stroke_filtermval(SK_DrawData *dd);
+void sk_endContinuousStroke(SK_Stroke *stk);
+
+void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk);
+
+void sk_initDrawData(SK_DrawData *dd, short mval[2]);
+
+void sk_deleteSelectedStrokes(SK_Sketch *sketch);
+void sk_selectAllSketch(SK_Sketch *sketch, int mode);
+
+#endif
diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h
new file mode 100644
index 00000000000..0f8e9c5edf5
--- /dev/null
+++ b/source/blender/blenkernel/BKE_smoke.h
@@ -0,0 +1,46 @@
+/**
+ * BKE_smoke.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Daniel Genrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_SMOKE_H_
+#define BKE_SMOKE_H_
+
+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_free (struct SmokeModifierData *smd);
+void smokeModifier_reset(struct SmokeModifierData *smd);
+void smokeModifier_reset_turbulence(struct SmokeModifierData *smd);
+void smokeModifier_createType(struct SmokeModifierData *smd);
+
+long long smoke_get_mem_req(int xres, int yres, int zres, int amplify);
+
+#endif /* BKE_SMOKE_H_ */
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index 05a9bfb0ca9..d8053281ceb 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -44,7 +44,9 @@ typedef struct BodyPoint {
float choke,choke2,frozen;
float colball;
short flag;
- char octantflag;
+ //char octantflag;
+ float mass;
+ float springweight;
} BodyPoint;
/* allocates and initializes general main data */
@@ -66,8 +68,5 @@ extern void sbObjectToSoftbody(struct Object *ob);
/* pass NULL to unlink again */
extern void sbSetInterruptCallBack(int (*f)(void));
-/* writing to cache for bake editing */
-extern void sbWriteCache(struct Object *ob, int framenr);
-
#endif
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index f3bed467c3a..cbce4663d6f 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -1,7 +1,7 @@
/**
* sound.h (mar-2001 nzc)
- *
- * $Id$
+ *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -33,20 +33,47 @@
struct PackedFile;
struct bSound;
-struct bSample;
+struct bContext;
struct ListBase;
+struct Main;
-/* bad bad global... */
-extern struct ListBase *samples;
+void sound_init();
-void sound_free_all_samples(void);
+void sound_exit();
-/* void *sound_get_listener(void); implemented in src!also declared there now */
+struct bSound* sound_new_file(struct Main *main, char* filename);
-void sound_set_packedfile(struct bSample* sample, struct PackedFile* pf);
-struct PackedFile* sound_find_packedfile(struct bSound* sound);
-void sound_free_sample(struct bSample* sample);
-void sound_free_sound(struct bSound* sound);
+// XXX unused currently
+#if 0
+struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source);
+struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end);
#endif
+void sound_delete(struct bContext *C, struct bSound* sound);
+
+void sound_cache(struct bSound* sound, int ignore);
+
+void sound_delete_cache(struct bSound* sound);
+
+void sound_load(struct Main *main, struct bSound* sound);
+
+void sound_free(struct bSound* sound);
+
+void sound_unlink(struct bContext *C, struct bSound* sound);
+
+struct SoundHandle* sound_new_handle(struct Scene *scene, struct bSound* sound, int startframe, int endframe, int frameskip);
+
+void sound_delete_handle(struct Scene *scene, struct SoundHandle *handle);
+
+void sound_update_playing(struct bContext *C);
+
+void sound_scrub(struct bContext *C);
+
+#ifdef AUD_CAPI
+AUD_Device* sound_mixdown(struct Scene *scene, AUD_Specs specs, int start, int end, float volume);
+#endif
+
+void sound_stop_all(struct bContext *C);
+
+#endif
diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h
index d288c0b6516..185e32ecdfa 100644
--- a/source/blender/blenkernel/BKE_text.h
+++ b/source/blender/blenkernel/BKE_text.h
@@ -35,6 +35,7 @@
extern "C" {
#endif
+struct Main;
struct Text;
struct TextLine;
struct SpaceText;
@@ -46,6 +47,9 @@ struct Text* add_empty_text (char *name);
int reopen_text (struct Text *text);
struct Text* add_text (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);
char* txt_to_buf (struct Text *text);
void txt_clean_text (struct Text *text);
@@ -72,7 +76,7 @@ void txt_delete_selected (struct Text *text);
void txt_sel_all (struct Text *text);
void txt_sel_line (struct Text *text);
char* txt_sel_to_buf (struct Text *text);
-void txt_insert_buf (struct Text *text, char *in_buffer);
+void txt_insert_buf (struct Text *text, const char *in_buffer);
void txt_print_undo (struct Text *text);
void txt_undo_add_toop (struct Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc);
void txt_do_undo (struct Text *text);
@@ -100,6 +104,14 @@ struct TextMarker *txt_next_marker (struct Text *text, struct TextMarker *marke
struct TextMarker *txt_prev_marker_color (struct Text *text, struct TextMarker *marker);
struct TextMarker *txt_next_marker_color (struct Text *text, struct TextMarker *marker);
+/* utility functions, could be moved somewhere more generic but are python/text related */
+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);
+
+
/* Undo opcodes */
/* Simple main cursor movement */
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index a1600ce5473..a9862ba586b 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -40,6 +40,8 @@ struct ColorBand;
struct HaloRen;
struct TexMapping;
struct EnvMap;
+struct PointDensity;
+struct VoxelData;
/* in ColorBand struct */
#define MAXCOLORBAND 32
@@ -75,6 +77,16 @@ void BKE_free_envmap(struct EnvMap *env);
struct EnvMap *BKE_add_envmap(void);
struct EnvMap *BKE_copy_envmap(struct EnvMap *env);
+void BKE_free_pointdensitydata(struct PointDensity *pd);
+void BKE_free_pointdensity(struct PointDensity *pd);
+struct PointDensity *BKE_add_pointdensity(void);
+struct PointDensity *BKE_copy_pointdensity(struct PointDensity *pd);
+
+void BKE_free_voxeldatadata(struct VoxelData *vd);
+void BKE_free_voxeldata(struct VoxelData *vd);
+struct VoxelData *BKE_add_voxeldata(void);
+struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd);
+
int BKE_texture_dependsOnTime(const struct Tex *texture);
#endif
diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h
new file mode 100644
index 00000000000..5d5f8cddf47
--- /dev/null
+++ b/source/blender/blenkernel/BKE_unit.h
@@ -0,0 +1,68 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_UNIT_H
+#define BKE_UNIT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* in all cases the value is assumed to be scaled by the user preference */
+
+/* humanly readable representation of a value in units (used for button drawing) */
+void bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, int split, int pad);
+
+/* replace units with values, used before python button evaluation */
+int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pref, int system, int type);
+
+/* the size of the unit used for this value (used for calculating the ckickstep) */
+double bUnit_ClosestScalar(double value, int system, int type);
+
+/* base scale for these units */
+double bUnit_BaseScalar(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);
+
+/* aligned with PropertyUnit */
+#define B_UNIT_NONE 0
+#define B_UNIT_LENGTH 1
+#define B_UNIT_AREA 2
+#define B_UNIT_VOLUME 3
+#define B_UNIT_MASS 4
+#define B_UNIT_ROTATION 5
+#define B_UNIT_TIME 6
+#define B_UNIT_VELOCITY 7
+#define B_UNIT_ACCELERATION 8
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BKE_UNIT_H */
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 419f0f5beeb..7d8cb41db82 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -62,11 +62,6 @@
#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; }
-/* string compare */
-#define STREQ(str, a) ( strcmp((str), (a))==0 )
-#define STREQ2(str, a, b) ( STREQ(str, a) || STREQ(str, b) )
-#define STREQ3(str, a, b, c) ( STREQ2(str, a, b) || STREQ(str, c) )
-
/* min/max */
#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
@@ -92,8 +87,6 @@
if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
-#define MINSIZE(val, size) ( ((val)>=0.0) ? (((val)<(size)) ? (size): (val)) : ( ((val)>(-size)) ? (-size) : (val)))
-
/* some math and copy defines */
#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
@@ -114,6 +107,7 @@
#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] )
@@ -128,6 +122,7 @@
#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)
@@ -198,5 +193,54 @@
#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)
+
#endif
diff --git a/source/blender/blenkernel/BKE_writeavi.h b/source/blender/blenkernel/BKE_writeavi.h
index cae1f25d0d8..4ef63b069c2 100644
--- a/source/blender/blenkernel/BKE_writeavi.h
+++ b/source/blender/blenkernel/BKE_writeavi.h
@@ -37,13 +37,14 @@ extern "C" {
/* generic blender movie support, could move to own module */
struct RenderData;
-void start_avi(struct RenderData *rd, int rectx, int recty);
+struct Scene;
+void start_avi(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
void end_avi(void);
void append_avi(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
void makeavistring (struct RenderData *rd, char *string);
typedef struct bMovieHandle {
- void (*start_movie)(struct RenderData *rd, int rectx, int recty);
+ void (*start_movie)(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
void (*append_movie)(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
void (*end_movie)(void);
int (*get_next_frame)(struct RenderData *rd); /* optional */
diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h
index dba3944a58d..07e0e01ef7e 100644
--- a/source/blender/blenkernel/BKE_writeffmpeg.h
+++ b/source/blender/blenkernel/BKE_writeffmpeg.h
@@ -46,19 +46,30 @@ extern "C" {
#define FFMPEG_MKV 9
#define FFMPEG_OGG 10
-#define FFMPEG_PRESET_NONE 0
-#define FFMPEG_PRESET_DVD 1
-#define FFMPEG_PRESET_SVCD 2
-#define FFMPEG_PRESET_VCD 3
-#define FFMPEG_PRESET_DV 4
-#define FFMPEG_PRESET_H264 5
+#define FFMPEG_PRESET_NONE 0
+#define FFMPEG_PRESET_DVD 1
+#define FFMPEG_PRESET_SVCD 2
+#define FFMPEG_PRESET_VCD 3
+#define FFMPEG_PRESET_DV 4
+#define FFMPEG_PRESET_H264 5
+#define FFMPEG_PRESET_THEORA 6
+#define FFMPEG_PRESET_XVID 7
+struct IDProperty;
struct RenderData;
+struct Scene;
-extern void start_ffmpeg(struct RenderData *rd, int rectx, int recty);
+extern void start_ffmpeg(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
extern void end_ffmpeg(void);
extern void append_ffmpeg(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
+extern void ffmpeg_set_preset(struct RenderData *rd, int preset);
+extern void ffmpeg_verify_image_type(struct RenderData *rd);
+
+extern struct IDProperty *ffmpeg_property_add(struct RenderData *Rd, char *type, int opt_index, int parent_index);
+extern int ffmpeg_property_add_string(struct RenderData *rd, const char *type, const char *str);
+extern void ffmpeg_property_del(struct RenderData *rd, void *type, void *prop_);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_writeframeserver.h b/source/blender/blenkernel/BKE_writeframeserver.h
index e870cbb865d..6a38abe977f 100644
--- a/source/blender/blenkernel/BKE_writeframeserver.h
+++ b/source/blender/blenkernel/BKE_writeframeserver.h
@@ -33,8 +33,9 @@ extern "C" {
#endif
struct RenderData;
+struct Scene;
-extern void start_frameserver(struct RenderData *rd, int rectx, int recty);
+extern void start_frameserver(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
extern void end_frameserver(void);
extern void append_frameserver(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
extern int frameserver_loop(struct RenderData *rd);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index ebe0ea74c28..3473950ab3a 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -27,51 +27,57 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../../../intern/guardedalloc ../editors/include ../blenlib ../makesdna
- ../render/extern/include ../../../intern/decimation/extern
- ../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
- ../../../intern/iksolver/extern ../blenloader ../quicktime
- ../../../extern/bullet2/src
- ../nodes ../../../extern/glew/include ../gpu ../makesrna
- ../../../intern/bsp/extern
- ${SDL_INC}
- ${ZLIB_INC}
+ . ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna
+ ../render/extern/include ../../../intern/decimation/extern
+ ../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
+ ../../../intern/iksolver/extern ../blenloader ../ikplugin
+ ../nodes ../../../extern/glew/include ../gpu ../makesrna ../../../intern/smoke/extern
+ ../../../intern/bsp/extern ../blenfont
+ ../../../intern/audaspace/intern
+ ../../../extern/lzo/minilzo
+ ../../../extern/lzma
+ ${ZLIB_INC}
)
+IF(WITH_BULLET)
+ SET(INC ${INC} ../../../extern/bullet2/src)
+ ADD_DEFINITIONS(-DUSE_BULLET)
+ENDIF(WITH_BULLET)
+
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
+ ADD_DEFINITIONS(-DWITH_OPENJPEG)
ENDIF(WITH_OPENJPEG)
IF(WITH_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
ENDIF(WITH_DDS)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
+ SET(INC ${INC} ../python ${PYTHON_INC})
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
IF(NOT WITH_ELBEEM)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
ENDIF(NOT WITH_ELBEEM)
IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
+ SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
BLENDERLIB(bf_blenkernel "${SRC}" "${INC}")
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index dbc990d0613..944667e2963 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -3,13 +3,17 @@ Import ('env')
sources = env.Glob('intern/*.c')
-incs = '. #/intern/guardedalloc ../editors/include ../blenlib ../makesdna'
+incs = '. #/intern/guardedalloc #/intern/memutil ../editors/include ../blenlib ../blenfont ../makesdna'
incs += ' ../render/extern/include #/intern/decimation/extern ../makesrna'
-incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes'
+incs += ' ../imbuf ../ikplugin ../avi #/intern/elbeem/extern ../nodes'
incs += ' #/intern/iksolver/extern ../blenloader'
incs += ' #/extern/bullet2/src'
incs += ' #/intern/opennl/extern #/intern/bsp/extern'
incs += ' ../gpu #/extern/glew/include'
+incs += ' #/intern/smoke/extern'
+incs += ' #/extern/lzo/minilzo'
+incs += ' #/extern/lzma'
+incs += ' #/intern/audaspace/intern'
incs += ' ' + env['BF_OPENGL_INC']
incs += ' ' + env['BF_ZLIB_INC']
@@ -50,7 +54,7 @@ if env['WITH_BF_QUICKTIME']:
incs += ' ' + env['BF_QUICKTIME_INC']
if env['WITH_BF_BULLET']:
- defs.append('WITH_BULLET')
+ defs.append('USE_BULLET')
if env['BF_NO_ELBEEM']:
defs.append('DISABLE_ELBEEM')
@@ -61,4 +65,4 @@ if env['WITH_BF_LCMS']:
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'], priority = [165] )
+env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25] )
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 090f256ab9f..43b9a63a2c1 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -72,6 +72,7 @@
#include "BKE_modifier.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_subsurf.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -2076,7 +2077,7 @@ static void clear_mesh_caches(Object *ob)
static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
{
Object *obact = scene->basact?scene->basact->object:NULL;
- int editing = (FACESEL_PAINT_TEST)|(G.f & G_PARTICLEEDIT);
+ int editing = paint_facesel_test(ob);
int needMapping = editing && (ob==obact);
float min[3], max[3];
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
index a6a5066b574..f16b57c8469 100644
--- a/source/blender/blenkernel/intern/Makefile
+++ b/source/blender/blenkernel/intern/Makefile
@@ -41,14 +41,18 @@ 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
# also avi is used
CPPFLAGS += -I../../avi
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
@@ -68,6 +72,7 @@ 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
@@ -86,6 +91,10 @@ CPPFLAGS += -I$(NAN_BULLET2)/include
CPPFLAGS += -I$(NAN_FREETYPE)/include
CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
+# lzo and lzma, for pointcache
+CPPFLAGS += -I$(NAN_LZO)/minilzo
+CPPFLAGS += -I$(NAN_LZMA)
+
ifeq ($(WITH_FFMPEG),true)
CPPFLAGS += -DWITH_FFMPEG
CPPFLAGS += $(NAN_FFMPEGCFLAGS)
@@ -107,3 +116,4 @@ ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -I../../quicktime
CPPFLAGS += -DWITH_QUICKTIME
endif
+
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index f7e15cef4c4..4cfd35a494d 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -21,6 +21,7 @@
* All rights reserved.
*
* Contributor(s): Full recode, Ton Roosendaal, Crete 2005
+ * Full recode, Joshua Leung, 2009
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -31,7 +32,8 @@
#include <string.h>
#include <math.h>
-#include <stdlib.h> /* for NULL */
+#include <stdlib.h>
+#include <stddef.h>
#include "MEM_guardedalloc.h"
@@ -60,6 +62,7 @@
#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
+#include "BIK_api.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -68,8 +71,6 @@
#include "RNA_access.h"
#include "RNA_types.h"
-//XXX #include "nla.h"
-
/* *********************** NOTE ON POSE AND ACTION **********************
- Pose is the local (object level) component of armature. The current
@@ -212,6 +213,7 @@ bAction *copy_action (bAction *src)
return dst;
}
+/* *************** Action Groups *************** */
/* Get the active action-group for an Action */
bActionGroup *get_active_actiongroup (bAction *act)
@@ -404,14 +406,15 @@ bActionGroup *action_groups_find_named (bAction *act, const char name[])
return NULL;
}
-/* ************************ Pose channels *************** */
+/* *************** Pose channels *************** */
/* usually used within a loop, so we got a N^2 slowdown */
bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
{
bPoseChannel *chan;
-
- if (pose==NULL) return NULL;
+
+ if (ELEM(NULL, pose, name) || (name[0] == 0))
+ return NULL;
for (chan=pose->chanbase.first; chan; chan=chan->next) {
if (chan->name[0] == name[0]) {
@@ -449,7 +452,7 @@ bPoseChannel *verify_pose_channel(bPose* pose, const char* name)
chan->limitmin[0]= chan->limitmin[1]= chan->limitmin[2]= -180.0f;
chan->limitmax[0]= chan->limitmax[1]= chan->limitmax[2]= 180.0f;
chan->stiffness[0]= chan->stiffness[1]= chan->stiffness[2]= 0.0f;
-
+ chan->ikrotweight = chan->iklinweight = 0.0f;
Mat4One(chan->constinv);
BLI_addtail(&pose->chanbase, chan);
@@ -475,7 +478,18 @@ bPoseChannel *get_active_posechannel (Object *ob)
return NULL;
}
-
+const char *get_ikparam_name(bPose *pose)
+{
+ if (pose) {
+ switch (pose->iksolver) {
+ case IKSOLVER_LEGACY:
+ return NULL;
+ case IKSOLVER_ITASC:
+ return "bItasc";
+ }
+ }
+ return NULL;
+}
/* dst should be freed already, makes entire duplicate */
void copy_pose (bPose **dst, bPose *src, int copycon)
{
@@ -497,7 +511,10 @@ void copy_pose (bPose **dst, bPose *src, int copycon)
outPose= MEM_callocN(sizeof(bPose), "pose");
BLI_duplicatelist(&outPose->chanbase, &src->chanbase);
-
+ outPose->iksolver = src->iksolver;
+ outPose->ikdata = NULL;
+ outPose->ikparam = MEM_dupallocN(src->ikparam);
+
if (copycon) {
for (pchan=outPose->chanbase.first; pchan; pchan=pchan->next) {
copy_constraints(&listb, &pchan->constraints); // copy_constraints NULLs listb
@@ -509,6 +526,39 @@ void copy_pose (bPose **dst, bPose *src, int copycon)
*dst=outPose;
}
+void init_pose_itasc(bItasc *itasc)
+{
+ if (itasc) {
+ itasc->iksolver = IKSOLVER_ITASC;
+ itasc->minstep = 0.01f;
+ itasc->maxstep = 0.06f;
+ itasc->numiter = 100;
+ itasc->numstep = 4;
+ itasc->precision = 0.005f;
+ itasc->flag = ITASC_AUTO_STEP|ITASC_INITIAL_REITERATION|ITASC_SIMULATION;
+ itasc->feedback = 20.f;
+ itasc->maxvel = 50.f;
+ itasc->solver = ITASC_SOLVER_SDLS;
+ itasc->dampmax = 0.5;
+ itasc->dampeps = 0.15;
+ }
+}
+void init_pose_ikparam(bPose *pose)
+{
+ bItasc *itasc;
+ switch (pose->iksolver) {
+ case IKSOLVER_ITASC:
+ itasc = MEM_callocN(sizeof(bItasc), "itasc");
+ init_pose_itasc(itasc);
+ pose->ikparam = itasc;
+ break;
+ case IKSOLVER_LEGACY:
+ default:
+ pose->ikparam = NULL;
+ break;
+ }
+}
+
void free_pose_channels(bPose *pose)
{
bPoseChannel *pchan;
@@ -532,133 +582,15 @@ void free_pose(bPose *pose)
/* free pose-groups */
if (pose->agroups.first)
BLI_freelistN(&pose->agroups);
-
- /* free pose */
- MEM_freeN(pose);
- }
-}
-
-void game_copy_pose(bPose **dst, bPose *src)
-{
- bPose *out;
- bPoseChannel *pchan, *outpchan;
- GHash *ghash;
-
- /* the game engine copies the current armature pose and then swaps
- * the object pose pointer. this makes it possible to change poses
- * without affecting the original blender data. */
-
- if (!src) {
- *dst=NULL;
- return;
- }
- else if (*dst==src) {
- printf("copy_pose source and target are the same\n");
- *dst=NULL;
- return;
- }
-
- out= MEM_dupallocN(src);
- out->agroups.first= out->agroups.last= NULL;
- BLI_duplicatelist(&out->chanbase, &src->chanbase);
-
- /* remap pointers */
- ghash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
-
- pchan= src->chanbase.first;
- outpchan= out->chanbase.first;
- for (; pchan; pchan=pchan->next, outpchan=outpchan->next)
- BLI_ghash_insert(ghash, pchan, outpchan);
-
- for (pchan=out->chanbase.first; pchan; pchan=pchan->next) {
- pchan->parent= BLI_ghash_lookup(ghash, pchan->parent);
- pchan->child= BLI_ghash_lookup(ghash, pchan->child);
- pchan->path= NULL;
- }
-
- BLI_ghash_free(ghash, NULL, NULL);
-
- *dst=out;
-}
-
-/* Only allowed for Poses with identical channels */
-void game_blend_poses(bPose *dst, bPose *src, float srcweight/*, short mode*/)
-{
- short mode= ACTSTRIPMODE_BLEND;
-
- bPoseChannel *dchan;
- const bPoseChannel *schan;
- bConstraint *dcon, *scon;
- float dstweight;
- int i;
-
- switch (mode){
- case ACTSTRIPMODE_BLEND:
- dstweight = 1.0F - srcweight;
- break;
- case ACTSTRIPMODE_ADD:
- dstweight = 1.0F;
- break;
- default :
- dstweight = 1.0F;
- }
-
- schan= src->chanbase.first;
- for (dchan = dst->chanbase.first; dchan; dchan=dchan->next, schan= schan->next){
- if (schan->flag & (POSE_ROT|POSE_LOC|POSE_SIZE)) {
- /* replaced quat->matrix->quat conversion with decent quaternion interpol (ton) */
-
- /* Do the transformation blend */
- if (schan->flag & POSE_ROT) {
- /* quat interpolation done separate */
- if (schan->rotmode == PCHAN_ROT_QUAT) {
- float dquat[4], squat[4];
-
- QUATCOPY(dquat, dchan->quat);
- QUATCOPY(squat, schan->quat);
- if (mode==ACTSTRIPMODE_BLEND)
- QuatInterpol(dchan->quat, dquat, squat, srcweight);
- else {
- QuatMulFac(squat, srcweight);
- QuatMul(dchan->quat, dquat, squat);
- }
-
- NormalQuat(dchan->quat);
- }
- }
+ /* free IK solver state */
+ BIK_clear_data(pose);
- for (i=0; i<3; i++) {
- /* blending for loc and scale are pretty self-explanatory... */
- if (schan->flag & POSE_LOC)
- dchan->loc[i] = (dchan->loc[i]*dstweight) + (schan->loc[i]*srcweight);
- if (schan->flag & POSE_SIZE)
- dchan->size[i] = 1.0f + ((dchan->size[i]-1.0f)*dstweight) + ((schan->size[i]-1.0f)*srcweight);
-
- /* euler-rotation interpolation done here instead... */
- // FIXME: are these results decent?
- if ((schan->flag & POSE_ROT) && (schan->rotmode))
- dchan->eul[i] = (dchan->eul[i]*dstweight) + (schan->eul[i]*srcweight);
- }
- dchan->flag |= schan->flag;
- }
- for(dcon= dchan->constraints.first, scon= schan->constraints.first; dcon && scon; dcon= dcon->next, scon= scon->next) {
- /* no 'add' option for constraint blending */
- dcon->enforce= dcon->enforce*(1.0f-srcweight) + scon->enforce*srcweight;
- }
- }
-
- /* this pose is now in src time */
- dst->ctime= src->ctime;
-}
+ /* free IK solver param */
+ if (pose->ikparam)
+ MEM_freeN(pose->ikparam);
-void game_free_pose(bPose *pose)
-{
- if (pose) {
- /* we don't free constraints, those are owned by the original pose */
- if(pose->chanbase.first)
- BLI_freelistN(&pose->chanbase);
-
+ /* free pose */
MEM_freeN(pose);
}
}
@@ -765,83 +697,87 @@ void framechange_poses_clear_unkeyed(void)
}
}
-/* ************************ END Pose channels *************** */
-
-/* ************** time ****************** */
+/* ************************** Bone Groups ************************** */
-static bActionStrip *get_active_strip(Object *ob)
+/* Adds a new bone-group */
+void pose_add_group (Object *ob)
{
-#if 0 // XXX old animation system
- bActionStrip *strip;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bActionGroup *grp;
- if(ob->action==NULL)
- return NULL;
-
- for (strip=ob->nlastrips.first; strip; strip=strip->next)
- if(strip->flag & ACTSTRIP_ACTIVE)
- break;
+ if (ELEM(NULL, ob, ob->pose))
+ return;
- if(strip && strip->act==ob->action)
- return strip;
-#endif // XXX old animation system
-
- return NULL;
+ grp= MEM_callocN(sizeof(bActionGroup), "PoseGroup");
+ strcpy(grp->name, "Group");
+ BLI_addtail(&pose->agroups, grp);
+ BLI_uniquename(&pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), 32);
+
+ pose->active_group= BLI_countlist(&pose->agroups);
}
-/* non clipped mapping of strip */
-static float get_actionstrip_frame(bActionStrip *strip, float cframe, int invert)
+/* Remove the active bone-group */
+void pose_remove_group (Object *ob)
{
- float length, actlength, repeat, scale;
-
- if (strip->repeat == 0.0f) strip->repeat = 1.0f;
- repeat = (strip->flag & ACTSTRIP_USESTRIDE) ? (1.0f) : (strip->repeat);
-
- if (strip->scale == 0.0f) strip->scale= 1.0f;
- scale = (float)fabs(strip->scale); /* scale must be positive (for now) */
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bActionGroup *grp = NULL;
+ bPoseChannel *pchan;
- actlength = strip->actend-strip->actstart;
- if (actlength == 0.0f) actlength = 1.0f;
- length = repeat * scale * actlength;
+ /* sanity checks */
+ if (ELEM(NULL, ob, pose))
+ return;
+ if (pose->active_group <= 0)
+ return;
- /* invert = convert action-strip time to global time */
- if (invert)
- return length*(cframe - strip->actstart)/(repeat*actlength) + strip->start;
- else
- return repeat*actlength*(cframe - strip->start)/length + strip->actstart;
+ /* get group to remove */
+ grp= BLI_findlink(&pose->agroups, pose->active_group-1);
+ if (grp) {
+ /* adjust group references (the trouble of using indices!):
+ * - firstly, make sure nothing references it
+ * - also, make sure that those after this item get corrected
+ */
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->agrp_index == pose->active_group)
+ pchan->agrp_index= 0;
+ else if (pchan->agrp_index > pose->active_group)
+ pchan->agrp_index--;
+ }
+
+ /* now, remove it from the pose */
+ BLI_freelinkN(&pose->agroups, grp);
+ pose->active_group= 0;
+ }
}
-/* if the conditions match, it converts current time to strip time */
-float get_action_frame(Object *ob, float cframe)
-{
- bActionStrip *strip= get_active_strip(ob);
-
- if(strip)
- return get_actionstrip_frame(strip, cframe, 0);
- return cframe;
-}
+/* ************** F-Curve Utilities for Actions ****************** */
-/* inverted, strip time to current time */
-float get_action_frame_inv(Object *ob, float cframe)
+/* Check if the given action has any keyframes */
+short action_has_motion(const bAction *act)
{
- bActionStrip *strip= get_active_strip(ob);
+ FCurve *fcu;
+
+ /* return on the first F-Curve that has some keyframes/samples defined */
+ if (act) {
+ for (fcu= act->curves.first; fcu; fcu= fcu->next) {
+ if (fcu->totvert)
+ return 1;
+ }
+ }
- if(strip)
- return get_actionstrip_frame(strip, cframe, 1);
- return cframe;
+ /* nothing found */
+ return 0;
}
-
-
-
/* Calculate the extents of given action */
-void calc_action_range(const bAction *act, float *start, float *end, int incl_hidden)
+void calc_action_range(const bAction *act, float *start, float *end, short incl_modifiers)
{
FCurve *fcu;
float min=999999999.0f, max=-999999999.0f;
- short foundvert=0;
+ short foundvert=0, foundmod=0;
if (act) {
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
+ /* if curve has keyframes, consider them first */
if (fcu->totvert) {
float nmin, nmax;
@@ -854,10 +790,53 @@ void calc_action_range(const bAction *act, float *start, float *end, int incl_hi
foundvert= 1;
}
+
+ /* if incl_modifiers is enabled, need to consider modifiers too
+ * - only really care about the last modifier
+ */
+ if ((incl_modifiers) && (fcu->modifiers.last)) {
+ FModifier *fcm= fcu->modifiers.last;
+
+ /* only use the maximum sensible limits of the modifiers if they are more extreme */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_LIMITS: /* Limits F-Modifier */
+ {
+ FMod_Limits *fmd= (FMod_Limits *)fcm->data;
+
+ if (fmd->flag & FCM_LIMIT_XMIN) {
+ min= MIN2(min, fmd->rect.xmin);
+ }
+ if (fmd->flag & FCM_LIMIT_XMAX) {
+ max= MAX2(max, fmd->rect.xmax);
+ }
+ }
+ break;
+
+ case FMODIFIER_TYPE_CYCLES: /* Cycles F-Modifier */
+ {
+ FMod_Cycles *fmd= (FMod_Cycles *)fcm->data;
+
+ if (fmd->before_mode != FCM_EXTRAPOLATE_NONE)
+ min= MINAFRAMEF;
+ if (fmd->after_mode != FCM_EXTRAPOLATE_NONE)
+ max= MAXFRAMEF;
+ }
+ break;
+
+ // TODO: function modifier may need some special limits
+
+ default: /* all other standard modifiers are on the infinite range... */
+ min= MINAFRAMEF;
+ max= MAXFRAMEF;
+ break;
+ }
+
+ foundmod= 1;
+ }
}
}
- if (foundvert) {
+ if (foundvert || foundmod) {
if(min==max) max+= 1.0f;
*start= min;
*end= max;
@@ -868,6 +847,98 @@ void calc_action_range(const bAction *act, float *start, float *end, int incl_hi
}
}
+/* Return flags indicating which transforms the given object/posechannel has
+ * - if 'curves' is provided, a list of links to these curves are also returned
+ */
+short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan, ListBase *curves)
+{
+ PointerRNA ptr;
+ FCurve *fcu;
+ char *basePath=NULL;
+ short flags=0;
+
+ /* build PointerRNA from provided data to obtain the paths to use */
+ if (pchan)
+ RNA_pointer_create((ID *)ob, &RNA_PoseChannel, pchan, &ptr);
+ else if (ob)
+ RNA_id_pointer_create((ID *)ob, &ptr);
+ else
+ return 0;
+
+ /* get the basic path to the properties of interest */
+ basePath= RNA_path_from_ID_to_struct(&ptr);
+ if (basePath == NULL)
+ return 0;
+
+ /* search F-Curves for the given properties
+ * - we cannot use the groups, since they may not be grouped in that way...
+ */
+ for (fcu= act->curves.first; fcu; fcu= fcu->next) {
+ char *bPtr=NULL, *pPtr=NULL;
+
+ /* if enough flags have been found, we can stop checking unless we're also getting the curves */
+ if ((flags == ACT_TRANS_ALL) && (curves == NULL))
+ break;
+
+ /* just in case... */
+ if (fcu->rna_path == NULL)
+ continue;
+
+ /* step 1: check for matching base path */
+ bPtr= strstr(fcu->rna_path, basePath);
+
+ if (bPtr) {
+ /* step 2: check for some property with transforms
+ * - to speed things up, only check for the ones not yet found
+ * unless we're getting the curves too
+ * - if we're getting the curves, the BLI_genericNodeN() creates a LinkData
+ * node wrapping the F-Curve, which then gets added to the list
+ * - once a match has been found, the curve cannot possibly be any other one
+ */
+ if ((curves) || (flags & ACT_TRANS_LOC) == 0) {
+ pPtr= strstr(fcu->rna_path, "location");
+ if ((pPtr) && (pPtr >= bPtr)) {
+ flags |= ACT_TRANS_LOC;
+
+ if (curves)
+ BLI_addtail(curves, BLI_genericNodeN(fcu));
+ continue;
+ }
+ }
+
+ if ((curves) || (flags & ACT_TRANS_SCALE) == 0) {
+ pPtr= strstr(fcu->rna_path, "scale");
+ if ((pPtr) && (pPtr >= bPtr)) {
+ flags |= ACT_TRANS_SCALE;
+
+ if (curves)
+ BLI_addtail(curves, BLI_genericNodeN(fcu));
+ continue;
+ }
+ }
+
+ if ((curves) || (flags & ACT_TRANS_ROT) == 0) {
+ pPtr= strstr(fcu->rna_path, "rotation");
+ if ((pPtr) && (pPtr >= bPtr)) {
+ flags |= ACT_TRANS_ROT;
+
+ if (curves)
+ BLI_addtail(curves, BLI_genericNodeN(fcu));
+ continue;
+ }
+ }
+ }
+ }
+
+ /* free basePath */
+ MEM_freeN(basePath);
+
+ /* return flags found */
+ return flags;
+}
+
+/* ************** Pose Management Tools ****************** */
+
/* Copy the data from the action-pose (src) into the pose */
/* both args are assumed to be valid */
/* exported to game engine */
@@ -1117,7 +1188,7 @@ typedef struct NlaIpoChannel {
int type;
} NlaIpoChannel;
-void extract_ipochannels_from_action(ListBase *lb, ID *id, bAction *act, const char *name, float ctime)
+static void extract_ipochannels_from_action(ListBase *lb, ID *id, bAction *act, const char *name, float ctime)
{
bActionChannel *achan= get_action_channel(act, name);
IpoCurve *icu;
@@ -1210,7 +1281,7 @@ static void blend_ipochannels(ListBase *dst, ListBase *src, float srcweight, int
}
}
-int execute_ipochannels(ListBase *lb)
+static int execute_ipochannels(ListBase *lb)
{
NlaIpoChannel *nic;
int count = 0;
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 1aceca454d2..e943d92a0b5 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -87,15 +87,16 @@ void free_path(Path *path)
void calc_curvepath(Object *ob)
{
BevList *bl;
- BevPoint *bevp, *bevpn, *bevpfirst, *bevplast, *tempbevp;
+ BevPoint *bevp, *bevpn, *bevpfirst, *bevplast;
+ PathPoint *pp;
Curve *cu;
Nurb *nu;
Path *path;
- float *fp, *dist, *maxdist, x, y, z;
+ float *fp, *dist, *maxdist, xyz[3];
float fac, d=0, fac1, fac2;
int a, tot, cycl=0;
- float *ft;
+
/* in a path vertices are with equal differences: path->len = number of verts */
/* NOW WITH BEVELCURVE!!! */
@@ -132,19 +133,12 @@ void calc_curvepath(Object *ob)
*fp= 0;
for(a=0; a<tot; a++) {
fp++;
- if(cycl && a==tot-1) {
- x= bevpfirst->x - bevp->x;
- y= bevpfirst->y - bevp->y;
- z= bevpfirst->z - bevp->z;
- }
- else {
- tempbevp = bevp+1;
- x= (tempbevp)->x - bevp->x;
- y= (tempbevp)->y - bevp->y;
- z= (tempbevp)->z - bevp->z;
- }
- *fp= *(fp-1)+ (float)sqrt(x*x+y*y+z*z);
+ if(cycl && a==tot-1)
+ VecSubf(xyz, bevpfirst->vec, bevp->vec);
+ else
+ VecSubf(xyz, (bevp+1)->vec, bevp->vec);
+ *fp= *(fp-1)+VecLength(xyz);
bevp++;
}
@@ -152,7 +146,7 @@ void calc_curvepath(Object *ob)
/* the path verts in path->data */
/* now also with TILT value */
- ft= path->data = (float *)MEM_callocN(16*path->len, "pathdata");
+ 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
bevp= bevpfirst;
bevpn= bevp+1;
@@ -182,13 +176,13 @@ void calc_curvepath(Object *ob)
fac1= fac2/fac1;
fac2= 1.0f-fac1;
- ft[0]= fac1*bevp->x+ fac2*(bevpn)->x;
- ft[1]= fac1*bevp->y+ fac2*(bevpn)->y;
- ft[2]= fac1*bevp->z+ fac2*(bevpn)->z;
- ft[3]= fac1*bevp->alfa+ fac2*(bevpn)->alfa;
+ VecLerpf(pp->vec, bevp->vec, bevpn->vec, fac2);
+ pp->vec[3]= fac1*bevp->alfa + fac2*bevpn->alfa;
+ pp->radius= fac1*bevp->radius + fac2*bevpn->radius;
+ QuatInterpol(pp->quat, bevp->quat, bevpn->quat, fac2);
+ NormalQuat(pp->quat);
- ft+= 4;
-
+ pp++;
}
MEM_freeN(dist);
@@ -212,13 +206,14 @@ int interval_test(int min, int max, int p1, int cycl)
/* warning, *vec needs FOUR items! */
/* ctime is normalized range <0-1> */
-int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK */
+int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius) /* returns OK */
{
Curve *cu;
Nurb *nu;
BevList *bl;
Path *path;
- float *fp, *p0, *p1, *p2, *p3, fac;
+ PathPoint *pp, *p0, *p1, *p2, *p3;
+ float fac;
float data[4];
int cycl=0, s0, s1, s2, s3;
@@ -229,7 +224,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
return 0;
}
path= cu->path;
- fp= path->data;
+ pp= path->data;
/* test for cyclic */
bl= cu->bev.first;
@@ -248,19 +243,19 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
s2= interval_test(0, path->len-1-cycl, s1+1, cycl);
s3= interval_test(0, path->len-1-cycl, s1+2, cycl);
- p0= fp + 4*s0;
- p1= fp + 4*s1;
- p2= fp + 4*s2;
- p3= fp + 4*s3;
+ p0= pp + s0;
+ p1= pp + s1;
+ p2= pp + s2;
+ p3= pp + s3;
/* note, commented out for follow constraint */
//if(cu->flag & CU_FOLLOW) {
- set_afgeleide_four_ipo(1.0f-fac, data, KEY_BSPLINE);
+ key_curve_tangent_weights(1.0f-fac, data, KEY_BSPLINE);
- dir[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ;
- dir[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ;
- dir[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + data[3]*p3[2] ;
+ dir[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + data[2]*p2->vec[0] + data[3]*p3->vec[0] ;
+ dir[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + data[3]*p3->vec[1] ;
+ dir[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + data[3]*p3->vec[2] ;
/* make compatible with vectoquat */
dir[0]= -dir[0];
@@ -271,16 +266,35 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
nu= cu->nurb.first;
/* make sure that first and last frame are included in the vectors here */
- if((nu->type & 7)==CU_POLY) set_four_ipo(1.0f-fac, data, KEY_LINEAR);
- else if((nu->type & 7)==CU_BEZIER) set_four_ipo(1.0f-fac, data, KEY_LINEAR);
- else if(s0==s1 || p2==p3) set_four_ipo(1.0f-fac, data, KEY_CARDINAL);
- else set_four_ipo(1.0f-fac, data, KEY_BSPLINE);
-
- vec[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ;
- vec[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ;
- vec[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + data[3]*p3[2] ;
+ if(nu->type == CU_POLY) key_curve_position_weights(1.0f-fac, data, KEY_LINEAR);
+ else if(nu->type == CU_BEZIER) key_curve_position_weights(1.0f-fac, data, KEY_LINEAR);
+ else if(s0==s1 || p2==p3) key_curve_position_weights(1.0f-fac, data, KEY_CARDINAL);
+ else key_curve_position_weights(1.0f-fac, data, KEY_BSPLINE);
+
+ vec[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + data[2]*p2->vec[0] + data[3]*p3->vec[0] ; /* X */
+ 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];
+
+ totfac= data[0]+data[1];
+ QuatInterpol(q1, p0->quat, p1->quat, data[0] / totfac);
+ NormalQuat(q1);
+
+ totfac= data[2]+data[3];
+ QuatInterpol(q2, p2->quat, p3->quat, data[2] / totfac);
+ NormalQuat(q2);
+
+ totfac = data[0]+data[1]+data[2]+data[3];
+ QuatInterpol(quat, q1, q2, (data[0]+data[1]) / totfac);
+ NormalQuat(quat);
+ }
- vec[3]= data[0]*p0[3] + data[1]*p1[3] + data[2]*p2[3] + data[3]*p3[3] ;
+ if(radius)
+ *radius= data[0]*p0->radius + data[1]*p1->radius + data[2]*p2->radius + data[3]*p3->radius;
return 1;
}
@@ -752,12 +766,12 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
GroupObject *go;
Object *ob=0, **oblist=0, obcopy, *obcopylist=0;
DupliObject *dob;
+ ParticleSimulationData sim = {scene, par, psys, psys_get_modifier(par, psys)};
ParticleSettings *part;
ParticleData *pa;
ChildParticle *cpa=0;
ParticleKey state;
ParticleCacheKey *cache;
- ParticleSystemModifierData *psmd;
float ctime, pa_time, scale = 1.0f;
float tmat[4][4], mat[4][4], pamat[4][4], size=0.0;
float (*obmat)[4], (*oldobmat)[4];
@@ -770,7 +784,6 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
if(level>MAX_DUPLI_RECUR) return;
part=psys->part;
- psmd= psys_get_modifier(par, psys);
if(part==0)
return;
@@ -786,8 +799,9 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
BLI_srandom(31415926 + psys->seed);
lay= scene->lay;
- if((part->draw_as == PART_DRAW_OB && part->dup_ob) ||
- (part->draw_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first)) {
+ if((psys->renderdata || part->draw_as==PART_DRAW_REND) &&
+ ((part->ren_as == PART_DRAW_OB && part->dup_ob) ||
+ (part->ren_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first))) {
/* if we have a hair particle system, use the path cache */
if(part->type == PART_HAIR) {
@@ -801,10 +815,10 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
totpart = psys->totcached;
}
- psys->lattice = psys_get_lattice(scene, par, psys);
+ psys->lattice = psys_get_lattice(&sim);
/* gather list of objects or single object */
- if(part->draw_as==PART_DRAW_GR) {
+ if(part->ren_as==PART_DRAW_GR) {
group_handle_recalc_and_update(scene, par, part->dup_group);
for(go=part->dup_group->gobject.first; go; go=go->next)
@@ -850,7 +864,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
size = psys_get_child_size(psys, cpa, ctime, 0);
}
- if(part->draw_as==PART_DRAW_GR) {
+ if(part->ren_as==PART_DRAW_GR) {
/* for groups, pick the object based on settings */
if(part->draw&PART_DRAW_RAND_GR)
b= BLI_rand() % totgroup;
@@ -872,11 +886,11 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
/* hair we handle separate and compute transform based on hair keys */
if(a < totpart) {
cache = psys->pathcache[a];
- psys_get_dupli_path_transform(par, psys, psmd, pa, 0, cache, pamat, &scale);
+ psys_get_dupli_path_transform(&sim, pa, 0, cache, pamat, &scale);
}
else {
cache = psys->childcache[a-totpart];
- psys_get_dupli_path_transform(par, psys, psmd, 0, cpa, cache, pamat, &scale);
+ psys_get_dupli_path_transform(&sim, 0, cpa, cache, pamat, &scale);
}
VECCOPY(pamat[3], cache->co);
@@ -886,7 +900,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
else {
/* first key */
state.time = ctime;
- if(psys_get_particle_state(scene, par, psys, a, &state, 0) == 0)
+ if(psys_get_particle_state(&sim, a, &state, 0) == 0)
continue;
QuatToMat4(state.rot, pamat);
@@ -894,7 +908,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
pamat[3][3]= 1.0f;
}
- if(part->draw_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
+ if(part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
for(go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) {
Mat4MulMat4(tmat, oblist[b]->obmat, pamat);
Mat4MulFloat3((float *)tmat, size*scale);
@@ -906,7 +920,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
dob= new_dupli_object(lb, go->ob, mat, par->lay, counter, OB_DUPLIPARTS, animated);
Mat4CpyMat4(dob->omat, obcopylist[b].obmat);
if(G.rendering)
- psys_get_dupli_texture(par, part, psmd, pa, cpa, dob->uv, dob->orco);
+ psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
}
}
else {
@@ -925,12 +939,12 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
dob= new_dupli_object(lb, ob, mat, ob->lay, counter, OB_DUPLIPARTS, animated);
Mat4CpyMat4(dob->omat, oldobmat);
if(G.rendering)
- psys_get_dupli_texture(par, part, psmd, pa, cpa, dob->uv, dob->orco);
+ psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
}
}
/* restore objects since they were changed in where_is_object_time */
- if(part->draw_as==PART_DRAW_GR) {
+ if(part->ren_as==PART_DRAW_GR) {
for(a=0; a<totgroup; a++)
*(oblist[a])= obcopylist[a];
}
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 441e17f3318..ca16c62436b 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -1,10 +1,37 @@
-/* Testing code for new animation system in 2.5
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#include <stdio.h>
#include <string.h>
#include <stddef.h>
+#include <float.h>
+#include <math.h>
#include "MEM_guardedalloc.h"
@@ -12,9 +39,13 @@
#include "BLI_arithb.h"
#include "BLI_dynstr.h"
+#include "DNA_anim_types.h"
+#include "DNA_scene_types.h"
+
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
+#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_utildefines.h"
@@ -22,7 +53,7 @@
#include "RNA_access.h"
#include "RNA_types.h"
-#include "DNA_anim_types.h"
+#include "nla_private.h"
/* ***************************************** */
/* AnimData API */
@@ -41,7 +72,7 @@ static short id_has_animdata (ID *id)
switch (GS(id->name)) {
/* has AnimData */
case ID_OB:
- case ID_CU:
+ case ID_MB: case ID_CU: case ID_AR:
case ID_KE:
case ID_PA:
case ID_MA: case ID_TE: case ID_NT:
@@ -90,8 +121,15 @@ AnimData *BKE_id_add_animdata (ID *id)
IdAdtTemplate *iat= (IdAdtTemplate *)id;
/* check if there's already AnimData, in which case, don't add */
- if (iat->adt == NULL)
- iat->adt= MEM_callocN(sizeof(AnimData), "AnimData");
+ if (iat->adt == NULL) {
+ AnimData *adt;
+
+ /* add animdata */
+ adt= iat->adt= MEM_callocN(sizeof(AnimData), "AnimData");
+
+ /* set default settings */
+ adt->act_influence= 1.0f;
+ }
return iat->adt;
}
@@ -116,7 +154,13 @@ void BKE_free_animdata (ID *id)
/* unlink action (don't free, as it's in its own list) */
if (adt->action)
adt->action->id.us--;
+ /* same goes for the temporarily displaced action */
+ if (adt->tmpact)
+ adt->tmpact->id.us--;
+ /* free nla data */
+ free_nladata(&adt->nla_tracks);
+
/* free drivers - stored as a list of F-Curves */
free_fcurves(&adt->drivers);
@@ -146,9 +190,10 @@ AnimData *BKE_copy_animdata (AnimData *adt)
// XXX review this... it might not be optimal behaviour yet...
//id_us_plus((ID *)dadt->action);
dadt->action= copy_action(adt->action);
+ dadt->tmpact= copy_action(adt->tmpact);
/* duplicate NLA data */
- // XXX todo...
+ copy_nladata(&dadt->nla_tracks, &adt->nla_tracks);
/* duplicate drivers (F-Curves) */
copy_fcurves(&dadt->drivers, &adt->drivers);
@@ -160,14 +205,119 @@ AnimData *BKE_copy_animdata (AnimData *adt)
return dadt;
}
-/* *********************************** */
-/* KeyingSet API */
+/* Make Local -------------------------------------------- */
+
+static void make_local_strips(ListBase *strips)
+{
+ NlaStrip *strip;
-/* NOTES:
- * It is very likely that there will be two copies of the api - one for internal use,
- * and one 'operator' based wrapper of the internal API, which should allow for access
- * from Python/scripts so that riggers can automate the creation of KeyingSets for their rigs.
+ for (strip=strips->first; strip; strip=strip->next) {
+ if (strip->act) make_local_action(strip->act);
+ //if (strip->remap && strip->remap->target) make_local_action(strip->remap->target);
+
+ make_local_strips(&strip->strips);
+ }
+}
+
+/* Use local copy instead of linked copy of various ID-blocks */
+void BKE_animdata_make_local(AnimData *adt)
+{
+ NlaTrack *nlt;
+
+ /* Actions - Active and Temp */
+ if (adt->action) make_local_action(adt->action);
+ if (adt->tmpact) make_local_action(adt->tmpact);
+ /* Remaps */
+ if (adt->remap && adt->remap->target) make_local_action(adt->remap->target);
+
+ /* Drivers */
+ // TODO: need to remap the ID-targets too?
+
+ /* NLA Data */
+ for (nlt=adt->nla_tracks.first; nlt; nlt=nlt->next)
+ make_local_strips(&nlt->strips);
+}
+
+/* Path Validation -------------------------------------------- */
+
+#if 0
+/* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate */
+static char *rna_path_rename_fix (ID *owner_id, PointerRNA *modPtr, char *newName, char *oldpath)
+{
+ return oldpath; // FIXME!!!
+}
+
+/* Check RNA-Paths for a list of F-Curves */
+static void fcurves_path_rename_fix (ID *owner_id, PointerRNA *modPtr, char *newName, ListBase *curves)
+{
+ FCurve *fcu;
+
+ /* we need to check every curve... */
+ for (fcu= curves->first; fcu; fcu= fcu->next) {
+ /* firstly, handle the F-Curve's own path */
+ fcu->rna_path= rna_path_rename_fix(owner_id, modPtr, newName, fcu->rna_path);
+
+ /* driver? */
+ if (fcu->driver) {
+ ChannelDriver *driver= fcu->driver;
+ DriverTarget *dtar;
+
+ /* driver targets */
+ for (dtar= driver->targets.first; dtar; dtar=dtar->next) {
+ dtat->rna_path= rna_path_rename_fix(owner_id, modPtr, newName, dtar->rna_path);
+ }
+ }
+ }
+}
+
+/* Fix all RNA-Paths for Actions linked to NLA Strips */
+static void nlastrips_path_rename_fix (ID *owner_id, PointerRNA *modPtr, char *newName, ListBase *strips)
+{
+ NlaStrip *strip;
+
+ /* recursively check strips, fixing only actions... */
+ for (strip= strips->first; strip; strip= strip->next) {
+ /* fix strip's action */
+ if (strip->act)
+ fcurves_path_rename_fix(owner_id, modPtr, newName, &strip->act->curves);
+ /* ignore own F-Curves, since those are local... */
+
+ /* check sub-strips (if metas) */
+ nlastrips_path_rename_fix(owner_id, modPtr, newName, &strip->strips);
+ }
+}
+
+/* Fix all RNA-Paths in the AnimData block used by the given ID block
+ * - the pointer of interest must not have had its new name assigned already, otherwise
+ * path matching for this will never work
*/
+void BKE_animdata_fix_paths_rename (ID *owner_id, PointerRNA *modPtr, char *newName)
+{
+ AnimData *adt= BKE_animdata_from_id(owner_id);
+ NlaTrack *nlt;
+
+ /* if no AnimData, no need to proceed */
+ if (ELEM4(NULL, owner_id, adt, modPtr, newName))
+ return;
+
+ /* Active action and temp action */
+ if (adt->action)
+ fcurves_path_rename_fix(owner_id, modPtr, newName, &adt->action->curves);
+ if (adt->tmpact)
+ fcurves_path_rename_fix(owner_id, modPtr, newName, &adt->tmpact->curves);
+
+ /* Drivers - Drivers are really F-Curves */
+ fcurves_path_rename_fix(owner_id, modPtr, newName, &adt->drivers);
+
+ /* NLA Data - Animation Data for Strips */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+
+ }
+}
+#endif
+
+/* *********************************** */
+/* KeyingSet API */
/* Finding Tools --------------------------- */
@@ -201,7 +351,7 @@ KS_Path *BKE_keyingset_find_destination (KeyingSet *ks, ID *id, const char group
if ((ksp->rna_path==0) || strcmp(rna_path, ksp->rna_path))
eq_path= 0;
- /* index */
+ /* index - need to compare whole-array setting too... */
if (ksp->array_index != array_index)
eq_index= 0;
@@ -232,7 +382,7 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho
if (name)
BLI_snprintf(ks->name, 64, name);
else
- strcpy(ks->name, "Keying Set");
+ strcpy(ks->name, "KeyingSet");
ks->flag= flag;
ks->keyingflag= keyingflag;
@@ -241,7 +391,7 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho
BLI_addtail(list, ks);
/* make sure KeyingSet has a unique name (this helps with identification) */
- BLI_uniquename(list, ks, "Keying Set", ' ', offsetof(KeyingSet, name), 64);
+ BLI_uniquename(list, ks, "KeyingSet", '.', offsetof(KeyingSet, name), 64);
/* return new KeyingSet for further editing */
return ks;
@@ -255,18 +405,25 @@ void BKE_keyingset_add_destination (KeyingSet *ks, ID *id, const char group_name
KS_Path *ksp;
/* sanity checks */
- if ELEM(NULL, ks, rna_path)
+ if ELEM(NULL, ks, rna_path) {
+ printf("ERROR: no Keying Set and/or RNA Path to add destination with \n");
return;
+ }
/* ID is optional for relative KeyingSets, but is necessary for absolute KeyingSets */
if (id == NULL) {
- if (ks->flag & KEYINGSET_ABSOLUTE)
+ if (ks->flag & KEYINGSET_ABSOLUTE) {
+ printf("ERROR: No ID provided for absolute destination. \n");
return;
+ }
}
/* don't add if there is already a matching KS_Path in the KeyingSet */
- if (BKE_keyingset_find_destination(ks, id, group_name, rna_path, array_index, groupmode))
+ if (BKE_keyingset_find_destination(ks, id, group_name, rna_path, array_index, groupmode)) {
+ if (G.f & G_DEBUG)
+ printf("ERROR: destination already exists in Keying Set \n");
return;
+ }
/* allocate a new KeyingSet Path */
ksp= MEM_callocN(sizeof(KS_Path), "KeyingSet Path");
@@ -298,6 +455,21 @@ void BKE_keyingset_add_destination (KeyingSet *ks, ID *id, const char group_name
BLI_addtail(&ks->paths, ksp);
}
+/* Copy all KeyingSets in the given list */
+void BKE_keyingsets_copy(ListBase *newlist, ListBase *list)
+{
+ KeyingSet *ksn;
+ KS_Path *kspn;
+
+ BLI_duplicatelist(newlist, list);
+
+ for(ksn=newlist->first; ksn; ksn=ksn->next) {
+ BLI_duplicatelist(&ksn->paths, &ksn->paths);
+
+ for(kspn=ksn->paths.first; kspn; kspn=kspn->next)
+ kspn->rna_path= MEM_dupallocN(kspn->rna_path);
+ }
+}
/* Freeing Tools --------------------------- */
@@ -352,13 +524,13 @@ void BKE_keyingsets_free (ListBase *list)
* - path: original path string (as stored in F-Curve data)
* - dst: destination string to write data to
*/
-short animsys_remap_path (AnimMapper *remap, char *path, char **dst)
+static short animsys_remap_path (AnimMapper *remap, char *path, char **dst)
{
/* is there a valid remapping table to use? */
- if (remap) {
+ //if (remap) {
/* find a matching entry... to use to remap */
// ...TODO...
- }
+ //}
/* nothing suitable found, so just set dst to look at path (i.e. no alloc/free needed) */
*dst= path;
@@ -381,19 +553,19 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i
switch (RNA_property_type(prop))
{
case PROP_BOOLEAN:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(&new_ptr, prop))
RNA_property_boolean_set_index(&new_ptr, prop, array_index, (int)value);
else
RNA_property_boolean_set(&new_ptr, prop, (int)value);
break;
case PROP_INT:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(&new_ptr, prop))
RNA_property_int_set_index(&new_ptr, prop, array_index, (int)value);
else
RNA_property_int_set(&new_ptr, prop, (int)value);
break;
case PROP_FLOAT:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(&new_ptr, prop))
RNA_property_float_set_index(&new_ptr, prop, array_index, value);
else
RNA_property_float_set(&new_ptr, prop, value);
@@ -455,11 +627,14 @@ static void animsys_evaluate_fcurves (PointerRNA *ptr, ListBase *list, AnimMappe
/* calculate then execute each curve */
for (fcu= list->first; fcu; fcu= fcu->next)
{
- /* check if this curve should be skipped */
- if ((fcu->flag & (FCURVE_MUTED|FCURVE_DISABLED)) == 0)
- {
- calculate_fcurve(fcu, ctime);
- animsys_execute_fcurve(ptr, remap, fcu);
+ /* check if this F-Curve doesn't belong to a muted group */
+ if ((fcu->grp == NULL) || (fcu->grp->flag & AGRP_MUTED)==0) {
+ /* check if this curve should be skipped */
+ if ((fcu->flag & (FCURVE_MUTED|FCURVE_DISABLED)) == 0)
+ {
+ calculate_fcurve(fcu, ctime);
+ animsys_execute_fcurve(ptr, remap, fcu);
+ }
}
}
}
@@ -481,7 +656,6 @@ static void animsys_evaluate_drivers (PointerRNA *ptr, AnimData *adt, float ctim
short ok= 0;
/* check if this driver's curve should be skipped */
- // FIXME: maybe we shouldn't check for muted, though that would make things more confusing, as there's already too many ways to disable?
if ((fcu->flag & (FCURVE_MUTED|FCURVE_DISABLED)) == 0)
{
/* check if driver itself is tagged for recalculation */
@@ -514,6 +688,10 @@ void animsys_evaluate_action_group (PointerRNA *ptr, bAction *act, bActionGroup
if ELEM(NULL, act, agrp) return;
if ((remap) && (remap->target != act)) remap= NULL;
+ /* if group is muted, don't evaluated any of the F-Curve */
+ if (agrp->flag & AGRP_MUTED)
+ return;
+
/* calculate then execute each curve */
for (fcu= agrp->channels.first; (fcu) && (fcu->grp == agrp); fcu= fcu->next)
{
@@ -540,152 +718,603 @@ void animsys_evaluate_action (PointerRNA *ptr, bAction *act, AnimMapper *remap,
/* ***************************************** */
/* NLA System - Evaluation */
-/* used for list of strips to accumulate at current time */
-typedef struct NlaEvalStrip {
- struct NlaEvalStrip *next, *prev;
-
- NlaTrack *track; /* track that this strip belongs to */
- NlaStrip *strip; /* strip that's being used */
- NlaStrip *sblend; /* strip that's being blended towards (if applicable) */
-
- short track_index; /* the index of the track within the list */
- short strip_mode; /* which end of the strip are we looking at */
-} NlaEvalStrip;
-
-/* bNlaEvalStrip->strip_mode */
-enum {
- NES_TIME_BEFORE = -1,
- NES_TIME_WITHIN,
- NES_TIME_AFTER,
- NES_TIME_AFTER_BLEND
-} eNlaEvalStrip_StripMode;
+/* calculate influence of strip based for given frame based on blendin/out values */
+static float nlastrip_get_influence (NlaStrip *strip, float cframe)
+{
+ /* sanity checks - normalise the blendin/out values? */
+ strip->blendin= (float)fabs(strip->blendin);
+ strip->blendout= (float)fabs(strip->blendout);
+
+ /* result depends on where frame is in respect to blendin/out values */
+ if (IS_EQ(strip->blendin, 0)==0 && (cframe <= (strip->start + strip->blendin))) {
+ /* there is some blend-in */
+ return (float)fabs(cframe - strip->start) / (strip->blendin);
+ }
+ else if (IS_EQ(strip->blendout, 0)==0 && (cframe >= (strip->end - strip->blendout))) {
+ /* there is some blend-out */
+ return (float)fabs(strip->end - cframe) / (strip->blendout);
+ }
+ else {
+ /* in the middle of the strip, we should be full strength */
+ return 1.0f;
+ }
+}
+/* evaluate the evaluation time and influence for the strip, storing the results in the strip */
+static void nlastrip_evaluate_controls (NlaStrip *strip, float ctime)
+{
+ /* firstly, analytically generate values for influence and time (if applicable) */
+ if ((strip->flag & NLASTRIP_FLAG_USR_TIME) == 0)
+ strip->strip_time= nlastrip_get_frame(strip, ctime, NLATIME_CONVERT_EVAL);
+ if ((strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) == 0)
+ strip->influence= nlastrip_get_influence(strip, ctime);
+
+ /* now strip's evaluate F-Curves for these settings (if applicable) */
+ if (strip->fcurves.first) {
+ PointerRNA strip_ptr;
+
+ /* create RNA-pointer needed to set values */
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
+
+ /* execute these settings as per normal */
+ animsys_evaluate_fcurves(&strip_ptr, &strip->fcurves, NULL, ctime);
+ }
+}
-/* temp channel for accumulating data from NLA (avoids needing to clear all values first) */
-// TODO: maybe this will be used as the 'cache' stuff needed for editable values too?
-typedef struct NlaEvalChannel {
- struct NlaEvalChannel *next, *prev;
+/* gets the strip active at the current time for a list of strips for evaluation purposes */
+NlaEvalStrip *nlastrips_ctime_get_strip (ListBase *list, ListBase *strips, short index, float ctime)
+{
+ NlaStrip *strip, *estrip=NULL;
+ NlaEvalStrip *nes;
+ short side= 0;
- char *path; /* ready-to-use path (i.e. remapped already) */
- int array_index; /* if applicable... */
+ /* loop over strips, checking if they fall within the range */
+ for (strip= strips->first; strip; strip= strip->next) {
+ /* check if current time occurs within this strip */
+ if (IN_RANGE_INCL(ctime, strip->start, strip->end)) {
+ /* this strip is active, so try to use it */
+ estrip= strip;
+ side= NES_TIME_WITHIN;
+ break;
+ }
+
+ /* if time occurred before current strip... */
+ if (ctime < strip->start) {
+ if (strip == strips->first) {
+ /* before first strip - only try to use it if it extends backwards in time too */
+ if (strip->extendmode == NLASTRIP_EXTEND_HOLD)
+ estrip= strip;
+
+ /* side is 'before' regardless of whether there's a useful strip */
+ side= NES_TIME_BEFORE;
+ }
+ else {
+ /* before next strip - previous strip has ended, but next hasn't begun,
+ * so blending mode depends on whether strip is being held or not...
+ * - only occurs when no transition strip added, otherwise the transition would have
+ * been picked up above...
+ */
+ strip= strip->prev;
+
+ if (strip->extendmode != NLASTRIP_EXTEND_NOTHING)
+ estrip= strip;
+ side= NES_TIME_AFTER;
+ }
+ break;
+ }
+
+ /* if time occurred after current strip... */
+ if (ctime > strip->end) {
+ /* only if this is the last strip should we do anything, and only if that is being held */
+ if (strip == strips->last) {
+ if (strip->extendmode != NLASTRIP_EXTEND_NOTHING)
+ estrip= strip;
+
+ side= NES_TIME_AFTER;
+ break;
+ }
+
+ /* otherwise, skip... as the 'before' case will catch it more elegantly! */
+ }
+ }
- float value; /* value of this channel */
-} NlaEvalChannel;
-
+ /* check if a valid strip was found
+ * - must not be muted (i.e. will have contribution
+ */
+ if ((estrip == NULL) || (estrip->flag & NLASTRIP_FLAG_MUTED))
+ return NULL;
+
+ /* if ctime was not within the boundaries of the strip, clamp! */
+ switch (side) {
+ case NES_TIME_BEFORE: /* extend first frame only */
+ ctime= estrip->start;
+ break;
+ case NES_TIME_AFTER: /* extend last frame only */
+ ctime= estrip->end;
+ break;
+ }
+
+ /* evaluate strip's evaluation controls
+ * - skip if no influence (i.e. same effect as muting the strip)
+ * - negative influence is not supported yet... how would that be defined?
+ */
+ // TODO: this sounds a bit hacky having a few isolated F-Curves stuck on some data it operates on...
+ nlastrip_evaluate_controls(estrip, ctime);
+ if (estrip->influence <= 0.0f)
+ return NULL;
+
+ /* check if strip has valid data to evaluate,
+ * and/or perform any additional type-specific actions
+ */
+ switch (estrip->type) {
+ case NLASTRIP_TYPE_CLIP:
+ /* clip must have some action to evaluate */
+ if (estrip->act == NULL)
+ return NULL;
+ break;
+ case NLASTRIP_TYPE_TRANSITION:
+ /* there must be strips to transition from and to (i.e. prev and next required) */
+ if (ELEM(NULL, estrip->prev, estrip->next))
+ return NULL;
+
+ /* evaluate controls for the relevant extents of the bordering strips... */
+ nlastrip_evaluate_controls(estrip->prev, estrip->start);
+ nlastrip_evaluate_controls(estrip->next, estrip->end);
+ break;
+ }
+
+ /* add to list of strips we need to evaluate */
+ nes= MEM_callocN(sizeof(NlaEvalStrip), "NlaEvalStrip");
+
+ nes->strip= estrip;
+ nes->strip_mode= side;
+ nes->track_index= index;
+ nes->strip_time= estrip->strip_time;
+
+ if (list)
+ BLI_addtail(list, nes);
+
+ return nes;
+}
/* ---------------------- */
-/* evaluate the F-Curves controlling settings for the NLA-strips (currently, not relinkable) */
-static void nlastrip_evaluate_fcurves (NlaStrip *strip, float ctime)
+/* find an NlaEvalChannel that matches the given criteria
+ * - ptr and prop are the RNA data to find a match for
+ */
+static NlaEvalChannel *nlaevalchan_find_match (ListBase *channels, PointerRNA *ptr, PropertyRNA *prop, int array_index)
+{
+ NlaEvalChannel *nec;
+
+ /* sanity check */
+ if (channels == NULL)
+ return NULL;
+
+ /* loop through existing channels, checking for a channel which affects the same property */
+ for (nec= channels->first; nec; nec= nec->next) {
+ /* - comparing the PointerRNA's is done by comparing the pointers
+ * to the actual struct the property resides in, since that all the
+ * other data stored in PointerRNA cannot allow us to definitively
+ * identify the data
+ */
+ if ((nec->ptr.data == ptr->data) && (nec->prop == prop) && (nec->index == array_index))
+ return nec;
+ }
+
+ /* not found */
+ return NULL;
+}
+
+/* verify that an appropriate NlaEvalChannel for this F-Curve exists */
+static NlaEvalChannel *nlaevalchan_verify (PointerRNA *ptr, ListBase *channels, NlaEvalStrip *nes, FCurve *fcu, short *newChan)
{
- //PointerRNA actstrip_ptr;
- //FCurve *fcu;
+ NlaEvalChannel *nec;
+ NlaStrip *strip= nes->strip;
+ PropertyRNA *prop;
+ PointerRNA new_ptr;
+ char *path = NULL;
+ short free_path=0;
+
+ /* sanity checks */
+ if (channels == NULL)
+ return NULL;
+
+ /* get RNA pointer+property info from F-Curve for more convenient handling */
+ /* get path, remapped as appropriate to work in its new environment */
+ free_path= animsys_remap_path(strip->remap, fcu->rna_path, &path);
- /* create RNA-pointer needed to set values */
- //RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &actstrip_ptr);
+ /* a valid property must be available, and it must be animateable */
+ if (RNA_path_resolve(ptr, path, &new_ptr, &prop) == 0) {
+ if (G.f & G_DEBUG) printf("NLA Strip Eval: Cannot resolve path \n");
+ return NULL;
+ }
+ /* only ok if animateable */
+ else if (RNA_property_animateable(&new_ptr, prop) == 0) {
+ if (G.f & G_DEBUG) printf("NLA Strip Eval: Property not animateable \n");
+ return NULL;
+ }
+
+ /* try to find a match */
+ nec= nlaevalchan_find_match(channels, &new_ptr, prop, fcu->array_index);
+
+ /* allocate a new struct for this if none found */
+ if (nec == NULL) {
+ nec= MEM_callocN(sizeof(NlaEvalChannel), "NlaEvalChannel");
+ *newChan= 1;
+ BLI_addtail(channels, nec);
+
+ nec->ptr= new_ptr;
+ nec->prop= prop;
+ nec->index= fcu->array_index;
+ }
+ else
+ *newChan= 0;
- /* execute these settings as per normal */
- //animsys_evaluate_fcurves(&actstrip_ptr, &strip->fcurves, NULL, ctime);
+ /* we can now return */
+ return nec;
}
+/* accumulate (i.e. blend) the given value on to the channel it affects */
+static void nlaevalchan_accumulate (NlaEvalChannel *nec, NlaEvalStrip *nes, short newChan, float value)
+{
+ NlaStrip *strip= nes->strip;
+ short blendmode= strip->blendmode;
+ float inf= strip->influence;
+
+ /* if channel is new, just store value regardless of blending factors, etc. */
+ if (newChan) {
+ nec->value= value;
+ return;
+ }
+
+ /* if this is being performed as part of transition evaluation, incorporate
+ * an additional weighting factor for the influence
+ */
+ if (nes->strip_mode == NES_TIME_TRANSITION_END)
+ inf *= nes->strip_time;
+
+ /* premultiply the value by the weighting factor */
+ if (IS_EQ(inf, 0)) return;
+ value *= inf;
+
+ /* perform blending */
+ switch (blendmode) {
+ case NLASTRIP_MODE_ADD:
+ /* simply add the scaled value on to the stack */
+ nec->value += value;
+ break;
+
+ case NLASTRIP_MODE_SUBTRACT:
+ /* simply subtract the scaled value from the stack */
+ nec->value -= value;
+ break;
+
+ case NLASTRIP_MODE_MULTIPLY:
+ /* multiply the scaled value with the stack */
+ nec->value *= value;
+ break;
+
+ case NLASTRIP_MODE_REPLACE:
+ default: // TODO: do we really want to blend by default? it seems more uses might prefer add...
+ /* do linear interpolation
+ * - the influence of the accumulated data (elsewhere, that is called dstweight)
+ * is 1 - influence, since the strip's influence is srcweight
+ */
+ nec->value= nec->value * (1.0f - inf) + value;
+ break;
+ }
+}
-/* gets the strip active at the current time for a track */
-static void nlatrack_ctime_get_strip (ListBase *list, NlaTrack *nlt, short index, float ctime)
+/* accumulate the results of a temporary buffer with the results of the full-buffer */
+static void nlaevalchan_buffers_accumulate (ListBase *channels, ListBase *tmp_buffer, NlaEvalStrip *nes)
{
- NlaStrip *strip, *astrip=NULL, *bstrip=NULL;
- NlaEvalStrip *nes;
- short side= 0;
+ NlaEvalChannel *nec, *necn, *necd;
- /* skip if track is muted */
- if (nlt->flag & NLATRACK_MUTED)
+ /* optimise - abort if no channels */
+ if (tmp_buffer->first == NULL)
return;
- /* loop over strips, checking if they fall within the range */
- for (strip= nlt->strips.first; strip; strip= strip->next) {
- /* only consider if:
- * - current time occurs within strip's extents
- * - current time occurs before strip (if it is the first)
- * - current time occurs after strip (if hold is on)
- * - current time occurs between strips (1st of those isn't holding) - blend!
+ /* accumulate results in tmp_channels buffer to the accumulation buffer */
+ for (nec= tmp_buffer->first; nec; nec= necn) {
+ /* get pointer to next channel in case we remove the current channel from the temp-buffer */
+ necn= nec->next;
+
+ /* try to find an existing matching channel for this setting in the accumulation buffer */
+ necd= nlaevalchan_find_match(channels, &nec->ptr, nec->prop, nec->index);
+
+ /* if there was a matching channel already in the buffer, accumulate to it,
+ * otherwise, add the current channel to the buffer for efficiency
*/
- if (IN_RANGE(ctime, strip->start, strip->end)) {
- astrip= strip;
- side= NES_TIME_WITHIN;
- break;
+ if (necd)
+ nlaevalchan_accumulate(necd, nes, 0, nec->value);
+ else {
+ BLI_remlink(tmp_buffer, nec);
+ BLI_addtail(channels, nec);
}
- else if (ctime < strip->start) {
- if (strip == nlt->strips.first) {
- astrip= strip;
- side= NES_TIME_BEFORE;
- break;
- }
- else {
- astrip= strip->prev;
-
- if (astrip->flag & NLASTRIP_HOLDLASTFRAME) {
- side= NES_TIME_AFTER;
- break;
- }
- else {
- bstrip= strip;
- side= NES_TIME_AFTER_BLEND;
- break;
- }
- }
+ }
+
+ /* free temp-channels that haven't been assimilated into the buffer */
+ BLI_freelistN(tmp_buffer);
+}
+
+/* ---------------------- */
+/* F-Modifier stack joining/separation utilities - should we generalise these for BLI_listbase.h interface? */
+
+/* Temporarily join two lists of modifiers together, storing the result in a third list */
+static void nlaeval_fmodifiers_join_stacks (ListBase *result, ListBase *list1, ListBase *list2)
+{
+ FModifier *fcm1, *fcm2;
+
+ /* if list1 is invalid... */
+ if ELEM(NULL, list1, list1->first) {
+ if (list2 && list2->first) {
+ result->first= list2->first;
+ result->last= list2->last;
}
}
+ /* if list 2 is invalid... */
+ else if ELEM(NULL, list2, list2->first) {
+ result->first= list1->first;
+ result->last= list1->last;
+ }
+ else {
+ /* list1 should be added first, and list2 second, with the endpoints of these being the endpoints for result
+ * - the original lists must be left unchanged though, as we need that fact for restoring
+ */
+ result->first= list1->first;
+ result->last= list2->last;
+
+ fcm1= list1->last;
+ fcm2= list2->first;
+
+ fcm1->next= fcm2;
+ fcm2->prev= fcm1;
+ }
+}
+
+/* Split two temporary lists of modifiers */
+static void nlaeval_fmodifiers_split_stacks (ListBase *list1, ListBase *list2)
+{
+ FModifier *fcm1, *fcm2;
- /* check if strip has been found (and whether it has data worth considering) */
- if (ELEM(NULL, astrip, astrip->act))
+ /* if list1/2 is invalid... just skip */
+ if ELEM(NULL, list1, list2)
return;
- if (astrip->flag & NLASTRIP_MUTE)
+ if ELEM(NULL, list1->first, list2->first)
return;
+
+ /* get endpoints */
+ fcm1= list1->last;
+ fcm2= list2->first;
+
+ /* clear their links */
+ fcm1->next= NULL;
+ fcm2->prev= NULL;
+}
+
+/* ---------------------- */
+
+/* evaluate action-clip strip */
+static void nlastrip_evaluate_actionclip (PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes)
+{
+ ListBase tmp_modifiers = {NULL, NULL};
+ NlaStrip *strip= nes->strip;
+ FCurve *fcu;
+ float evaltime;
- /* check if blending between strips */
- if (side == NES_TIME_AFTER_BLEND) {
- /* blending between strips... so calculate influence+act_time of both */
- nlastrip_evaluate_fcurves(astrip, ctime);
- nlastrip_evaluate_fcurves(bstrip, ctime);
+ /* join this strip's modifiers to the parent's modifiers (own modifiers first) */
+ nlaeval_fmodifiers_join_stacks(&tmp_modifiers, &strip->modifiers, modifiers);
+
+ /* evaluate strip's modifiers which modify time to evaluate the base curves at */
+ evaltime= evaluate_time_fmodifiers(&tmp_modifiers, NULL, 0.0f, strip->strip_time);
+
+ /* evaluate all the F-Curves in the action, saving the relevant pointers to data that will need to be used */
+ for (fcu= strip->act->curves.first; fcu; fcu= fcu->next) {
+ NlaEvalChannel *nec;
+ float value = 0.0f;
+ short newChan = -1;
- if ((astrip->influence <= 0.0f) && (bstrip->influence <= 0.0f))
- return;
+ /* check if this curve should be skipped */
+ if (fcu->flag & (FCURVE_MUTED|FCURVE_DISABLED))
+ continue;
+ if ((fcu->grp) && (fcu->grp->flag & AGRP_MUTED))
+ continue;
+
+ /* evaluate the F-Curve's value for the time given in the strip
+ * NOTE: we use the modified time here, since strip's F-Curve Modifiers are applied on top of this
+ */
+ value= evaluate_fcurve(fcu, evaltime);
+
+ /* apply strip's F-Curve Modifiers on this value
+ * NOTE: we apply the strip's original evaluation time not the modified one (as per standard F-Curve eval)
+ */
+ evaluate_value_fmodifiers(&tmp_modifiers, fcu, &value, strip->strip_time);
+
+
+ /* get an NLA evaluation channel to work with, and accumulate the evaluated value with the value(s)
+ * stored in this channel if it has been used already
+ */
+ nec= nlaevalchan_verify(ptr, channels, nes, fcu, &newChan);
+ if (nec)
+ nlaevalchan_accumulate(nec, nes, newChan, value);
+ }
+
+ /* unlink this strip's modifiers from the parent's modifiers again */
+ nlaeval_fmodifiers_split_stacks(&strip->modifiers, modifiers);
+}
+
+/* evaluate transition strip */
+static void nlastrip_evaluate_transition (PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes)
+{
+ ListBase tmp_channels = {NULL, NULL};
+ ListBase tmp_modifiers = {NULL, NULL};
+ NlaEvalStrip tmp_nes;
+ NlaStrip *s1, *s2;
+
+ /* join this strip's modifiers to the parent's modifiers (own modifiers first) */
+ nlaeval_fmodifiers_join_stacks(&tmp_modifiers, &nes->strip->modifiers, modifiers);
+
+ /* get the two strips to operate on
+ * - we use the endpoints of the strips directly flanking our strip
+ * using these as the endpoints of the transition (destination and source)
+ * - these should have already been determined to be valid...
+ * - if this strip is being played in reverse, we need to swap these endpoints
+ * otherwise they will be interpolated wrong
+ */
+ if (nes->strip->flag & NLASTRIP_FLAG_REVERSE) {
+ s1= nes->strip->next;
+ s2= nes->strip->prev;
}
else {
- /* calculate/set the influence+act_time of this strip - don't consider if 0 influence */
- nlastrip_evaluate_fcurves(astrip, ctime);
-
- if (astrip->influence <= 0.0f)
- return;
+ s1= nes->strip->prev;
+ s2= nes->strip->next;
}
+ /* prepare template for 'evaluation strip'
+ * - based on the transition strip's evaluation strip data
+ * - strip_mode is NES_TIME_TRANSITION_* based on which endpoint
+ * - strip_time is the 'normalised' (i.e. in-strip) time for evaluation,
+ * which doubles up as an additional weighting factor for the strip influences
+ * which allows us to appear to be 'interpolating' between the two extremes
+ */
+ tmp_nes= *nes;
+
+ /* evaluate these strips into a temp-buffer (tmp_channels) */
+ // FIXME: modifier evalation here needs some work...
+ /* first strip */
+ tmp_nes.strip_mode= NES_TIME_TRANSITION_START;
+ tmp_nes.strip= s1;
+ nlastrip_evaluate(ptr, &tmp_channels, &tmp_modifiers, &tmp_nes);
- /* allocate new eval-strip for this strip + add to stack */
- nes= MEM_callocN(sizeof(NlaEvalStrip), "NlaEvalStrip");
+ /* second strip */
+ tmp_nes.strip_mode= NES_TIME_TRANSITION_END;
+ tmp_nes.strip= s2;
+ nlastrip_evaluate(ptr, &tmp_channels, &tmp_modifiers, &tmp_nes);
- nes->track= nlt;
- nes->strip= astrip;
- nes->sblend= bstrip;
- nes->track_index= index;
- nes->strip_mode= side;
- BLI_addtail(list, nes);
+ /* assumulate temp-buffer and full-buffer, using the 'real' strip */
+ nlaevalchan_buffers_accumulate(channels, &tmp_channels, nes);
+
+ /* unlink this strip's modifiers from the parent's modifiers again */
+ nlaeval_fmodifiers_split_stacks(&nes->strip->modifiers, modifiers);
}
-/* ---------------------- */
+/* evaluate meta-strip */
+static void nlastrip_evaluate_meta (PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes)
+{
+ ListBase tmp_channels = {NULL, NULL};
+ ListBase tmp_modifiers = {NULL, NULL};
+ NlaStrip *strip= nes->strip;
+ NlaEvalStrip *tmp_nes;
+ float evaltime;
+
+ /* meta-strip was calculated normally to have some time to be evaluated at
+ * and here we 'look inside' the meta strip, treating it as a decorated window to
+ * it's child strips, which get evaluated as if they were some tracks on a strip
+ * (but with some extra modifiers to apply).
+ *
+ * NOTE: keep this in sync with animsys_evaluate_nla()
+ */
+
+ /* join this strip's modifiers to the parent's modifiers (own modifiers first) */
+ nlaeval_fmodifiers_join_stacks(&tmp_modifiers, &strip->modifiers, modifiers);
+
+ /* find the child-strip to evaluate */
+ evaltime= (nes->strip_time * (strip->end - strip->start)) + strip->start;
+ tmp_nes= nlastrips_ctime_get_strip(NULL, &strip->strips, -1, evaltime);
+ if (tmp_nes == NULL)
+ return;
+
+ /* evaluate child-strip into tmp_channels buffer before accumulating
+ * in the accumulation buffer
+ */
+ nlastrip_evaluate(ptr, &tmp_channels, &tmp_modifiers, tmp_nes);
+
+ /* assumulate temp-buffer and full-buffer, using the 'real' strip */
+ nlaevalchan_buffers_accumulate(channels, &tmp_channels, nes);
+
+ /* free temp eval-strip */
+ MEM_freeN(tmp_nes);
+
+ /* unlink this strip's modifiers from the parent's modifiers again */
+ nlaeval_fmodifiers_split_stacks(&strip->modifiers, modifiers);
+}
/* evaluates the given evaluation strip */
-// FIXME: will we need the evaluation cache table set up to blend stuff in?
-// TODO: only evaluate here, but flush in one go using the accumulated channels at end...
-static void nlastrip_ctime_evaluate (ListBase *channels, NlaEvalStrip *nes, float ctime)
+void nlastrip_evaluate (PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes)
{
- // 1. (in old code) was to extract 'IPO-channels' from actions
- // 2. blend between the 'accumulated' data, and the new data
+ NlaStrip *strip= nes->strip;
+
+ /* to prevent potential infinite recursion problems (i.e. transition strip, beside meta strip containing a transition
+ * several levels deep inside it), we tag the current strip as being evaluated, and clear this when we leave
+ */
+ // TODO: be careful with this flag, since some edit tools may be running and have set this while animplayback was running
+ if (strip->flag & NLASTRIP_FLAG_EDIT_TOUCHED)
+ return;
+ strip->flag |= NLASTRIP_FLAG_EDIT_TOUCHED;
+
+ /* actions to take depend on the type of strip */
+ switch (strip->type) {
+ case NLASTRIP_TYPE_CLIP: /* action-clip */
+ nlastrip_evaluate_actionclip(ptr, channels, modifiers, nes);
+ break;
+ case NLASTRIP_TYPE_TRANSITION: /* transition */
+ nlastrip_evaluate_transition(ptr, channels, modifiers, nes);
+ break;
+ case NLASTRIP_TYPE_META: /* meta */
+ nlastrip_evaluate_meta(ptr, channels, modifiers, nes);
+ break;
+ }
+
+ /* clear temp recursion safe-check */
+ strip->flag &= ~NLASTRIP_FLAG_EDIT_TOUCHED;
}
/* write the accumulated settings to */
-static void nladata_flush_channels (PointerRNA *ptr, ListBase *channels)
+void nladata_flush_channels (ListBase *channels)
{
+ NlaEvalChannel *nec;
+
+ /* sanity checks */
+ if (channels == NULL)
+ return;
+ /* for each channel with accumulated values, write its value on the property it affects */
+ for (nec= channels->first; nec; nec= nec->next) {
+ PointerRNA *ptr= &nec->ptr;
+ PropertyRNA *prop= nec->prop;
+ int array_index= nec->index;
+ float value= nec->value;
+
+ /* write values - see animsys_write_rna_setting() to sync the code */
+ switch (RNA_property_type(prop))
+ {
+ case PROP_BOOLEAN:
+ if (RNA_property_array_length(ptr, prop))
+ RNA_property_boolean_set_index(ptr, prop, array_index, (int)value);
+ else
+ RNA_property_boolean_set(ptr, prop, (int)value);
+ break;
+ case PROP_INT:
+ if (RNA_property_array_length(ptr, prop))
+ RNA_property_int_set_index(ptr, prop, array_index, (int)value);
+ else
+ RNA_property_int_set(ptr, prop, (int)value);
+ break;
+ case PROP_FLOAT:
+ if (RNA_property_array_length(ptr, prop))
+ RNA_property_float_set_index(ptr, prop, array_index, value);
+ else
+ RNA_property_float_set(ptr, prop, value);
+ break;
+ case PROP_ENUM:
+ RNA_property_enum_set(ptr, prop, (int)value);
+ break;
+ default:
+ // can't do anything with other types of property....
+ break;
+ }
+ }
}
/* ---------------------- */
@@ -696,16 +1325,76 @@ static void nladata_flush_channels (PointerRNA *ptr, 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;
ListBase estrips= {NULL, NULL};
ListBase echannels= {NULL, NULL};
NlaEvalStrip *nes;
+ // TODO: need to zero out all channels used, otherwise we have problems with threadsafety
+ // and also when the user jumps between different times instead of moving sequentially...
+
/* 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++)
- nlatrack_ctime_get_strip(&estrips, nlt, track_index, ctime);
+ 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 */
+ if ((adt->flag & ADT_NLA_EDIT_ON) && (nlt->flag & NLATRACK_DISABLED))
+ break;
+
+ /* skip if we're only considering a track tagged 'solo' */
+ if ((adt->flag & ADT_NLA_SOLO_TRACK) && (nlt->flag & NLATRACK_SOLO)==0)
+ continue;
+ /* skip if track is muted */
+ if (nlt->flag & NLATRACK_MUTED)
+ continue;
+
+ /* if this track has strips (but maybe they won't be suitable), set has_strips
+ * - used for mainly for still allowing normal action evaluation...
+ */
+ if (nlt->strips.first)
+ has_strips= 1;
+
+ /* otherwise, get strip to evaluate for this channel */
+ nes= nlastrips_ctime_get_strip(&estrips, &nlt->strips, track_index, ctime);
+ if (nes) nes->track= nlt;
+ }
+
+ /* add 'active' Action (may be tweaking track) as last strip to evaluate in NLA stack
+ * - only do this if we're not exclusively evaluating the 'solo' NLA-track
+ */
+ if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) {
+ /* if there are strips, evaluate action as per NLA rules */
+ if (has_strips) {
+ /* 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;
+
+ /* 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);
+ }
+ else {
+ /* special case - evaluate as if there isn't any NLA data */
+ // TODO: this is really just a stop-gap measure...
+ animsys_evaluate_action(ptr, adt->action, adt->remap, ctime);
+ return;
+ }
+ }
/* only continue if there are strips to evaluate */
if (estrips.first == NULL)
@@ -714,10 +1403,10 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* 2. for each strip, evaluate then accumulate on top of existing channels, but don't set values yet */
for (nes= estrips.first; nes; nes= nes->next)
- nlastrip_ctime_evaluate(&echannels, nes, ctime);
+ nlastrip_evaluate(ptr, &echannels, NULL, nes);
/* 3. flush effects of accumulating channels in NLA to the actual data they affect */
- nladata_flush_channels(ptr, &echannels);
+ nladata_flush_channels(&echannels);
/* 4. free temporary evaluation data */
BLI_freelistN(&estrips);
@@ -799,17 +1488,19 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
* - NLA before Active Action, as Active Action behaves as 'tweaking track'
* that overrides 'rough' work in NLA
*/
+ // TODO: need to double check that this all works correctly
if ((recalc & ADT_RECALC_ANIM) || (adt->recalc & ADT_RECALC_ANIM))
{
/* evaluate NLA data */
if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF))
{
+ /* evaluate NLA-stack
+ * - active action is evaluated as part of the NLA stack as the last item
+ */
animsys_evaluate_nla(&id_ptr, adt, ctime);
}
-
- /* evaluate Action data */
- // FIXME: what if the solo track was not tweaking one, then nla-solo should be checked too?
- if (adt->action)
+ /* evaluate Active Action only */
+ else if (adt->action)
animsys_evaluate_action(&id_ptr, adt->action, adt->remap, ctime);
/* reset tag */
@@ -845,23 +1536,42 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
* 'local' (i.e. belonging in the nearest ID-block that setting is related to, not a
* standard 'root') block are overridden by a larger 'user'
*/
-// TODO: we currently go over entire 'main' database...
void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
{
ID *id;
if (G.f & G_DEBUG)
printf("Evaluate all animation - %f \n", ctime);
-
- /* macro for less typing */
-#define EVAL_ANIM_IDS(first, flag) \
+
+ /* macro 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?
+ */
+#define EVAL_ANIM_IDS(first, aflag) \
for (id= first; id; id= id->next) { \
AnimData *adt= BKE_animdata_from_id(id); \
- BKE_animsys_evaluate_animdata(id, adt, ctime, flag); \
+ if ( (id->us > 1) || (id->us && !(id->flag & LIB_FAKEUSER)) ) \
+ 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,
+ * which should ultimately be empty, since it is not possible for now to have any animation
+ * without some actions, and drivers wouldn't get affected by any state changes
+ *
+ * however, if there are some curves, we will need to make sure that their 'ctime' property gets
+ * set correctly, so this optimisation must be skipped in that case...
+ */
+ if ((main->action.first == NULL) && (main->curve.first == NULL)) {
+ if (G.f & G_DEBUG)
+ printf("\tNo Actions, so no animation needs to be evaluated...\n");
+
+ return;
}
/* nodes */
- // TODO...
+ EVAL_ANIM_IDS(main->nodetree.first, ADT_RECALC_ANIM);
/* textures */
EVAL_ANIM_IDS(main->tex.first, ADT_RECALC_ANIM);
@@ -876,10 +1586,32 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
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 */
- // TODO...
+ /* 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);
+ }
+
+ /* armatures */
+ EVAL_ANIM_IDS(main->armature.first, ADT_RECALC_ANIM);
/* meshes */
// TODO...
@@ -897,7 +1629,19 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM);
/* scenes */
- EVAL_ANIM_IDS(main->scene.first, ADT_RECALC_ANIM);
+ 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);
+ }
}
/* ***************************************** */
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 1b930a74449..b2368451414 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -66,10 +66,8 @@
#include "BKE_object.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
-
-//XXX #include "BIF_editdeform.h"
-
-#include "IK_solver.h"
+#include "BIK_api.h"
+#include "BKE_sketch.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -83,6 +81,7 @@ bArmature *add_armature(char *name)
arm= alloc_libblock (&G.main->armature, ID_AR, name);
arm->deformflag = ARM_DEF_VGROUP|ARM_DEF_ENVELOPE;
+ arm->flag = ARM_COL_CUSTOM; /* custom bone-group colors */
arm->layer= 1;
return arm;
}
@@ -130,7 +129,6 @@ void free_bones (bArmature *arm)
void free_armature(bArmature *arm)
{
if (arm) {
- /* unlink_armature(arm);*/
free_bones(arm);
/* free editmode data */
@@ -140,6 +138,12 @@ void free_armature(bArmature *arm)
MEM_freeN(arm->edbo);
arm->edbo= NULL;
}
+
+ /* free sketch */
+ if (arm->sketch) {
+ freeSketch(arm->sketch);
+ arm->sketch = NULL;
+ }
}
}
@@ -661,10 +665,10 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
if(bone->segments > MAX_BBONE_SUBDIV)
bone->segments= MAX_BBONE_SUBDIV;
- forward_diff_bezier(0.0, h1[0], h2[0], 0.0, data[0], MAX_BBONE_SUBDIV, 4);
- forward_diff_bezier(0.0, h1[1], length + h2[1], length, data[0]+1, MAX_BBONE_SUBDIV, 4);
- forward_diff_bezier(0.0, h1[2], h2[2], 0.0, data[0]+2, MAX_BBONE_SUBDIV, 4);
- forward_diff_bezier(roll1, roll1 + 0.390464f*(roll2-roll1), roll2 - 0.390464f*(roll2-roll1), roll2, data[0]+3, MAX_BBONE_SUBDIV, 4);
+ forward_diff_bezier(0.0, h1[0], h2[0], 0.0, data[0], MAX_BBONE_SUBDIV, 4*sizeof(float));
+ forward_diff_bezier(0.0, h1[1], length + h2[1], length, data[0]+1, MAX_BBONE_SUBDIV, 4*sizeof(float));
+ forward_diff_bezier(0.0, h1[2], h2[2], 0.0, data[0]+2, MAX_BBONE_SUBDIV, 4*sizeof(float));
+ forward_diff_bezier(roll1, roll1 + 0.390464f*(roll2-roll1), roll2 - 0.390464f*(roll2-roll1), roll2, data[0]+3, MAX_BBONE_SUBDIV, 4*sizeof(float));
equalize_bezier(data[0], bone->segments); // note: does stride 4!
@@ -1564,409 +1568,10 @@ void armature_rebuild_pose(Object *ob, bArmature *arm)
DAG_pose_sort(ob);
ob->pose->flag &= ~POSE_RECALC;
+ ob->pose->flag |= POSE_WAS_REBUILT;
}
-/* ********************** THE IK SOLVER ******************* */
-
-
-
-/* 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)
-{
- bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
- PoseTree *tree;
- PoseTarget *target;
- bConstraint *con;
- bKinematicConstraint *data= NULL;
- int a, segcount= 0, size, newsize, *oldparent, parent;
-
- /* find IK constraint, and validate it */
- for(con= pchan_tip->constraints.first; con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
- data=(bKinematicConstraint*)con->data;
- if (data->flag & CONSTRAINT_IK_AUTO) break;
- if (data->tar==NULL) continue;
- if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
- if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) break;
- }
- }
- if(con==NULL) return;
-
- /* exclude tip from chain? */
- if(!(data->flag & CONSTRAINT_IK_TIP))
- pchan_tip= pchan_tip->parent;
-
- /* Find the chain's root & count the segments needed */
- for (curchan = pchan_tip; curchan; curchan=curchan->parent){
- pchan_root = curchan;
-
- curchan->flag |= POSE_CHAIN; // don't forget to clear this
- chanlist[segcount]=curchan;
- segcount++;
-
- if(segcount==data->rootbone || segcount>255) break; // 255 is weak
- }
- if (!segcount) return;
-
- /* setup the chain data */
-
- /* we make tree-IK, unless all existing targets are in this chain */
- for(tree= pchan_root->iktree.first; tree; tree= tree->next) {
- for(target= tree->targets.first; target; target= target->next) {
- curchan= tree->pchan[target->tip];
- if(curchan->flag & POSE_CHAIN)
- curchan->flag &= ~POSE_CHAIN;
- else
- break;
- }
- if(target) break;
- }
-
- /* create a target */
- target= MEM_callocN(sizeof(PoseTarget), "posetarget");
- target->con= con;
- pchan_tip->flag &= ~POSE_CHAIN;
-
- if(tree==NULL) {
- /* make new tree */
- tree= MEM_callocN(sizeof(PoseTree), "posetree");
-
- tree->iterations= data->iterations;
- tree->totchannel= segcount;
- tree->stretch = (data->flag & CONSTRAINT_IK_STRETCH);
-
- tree->pchan= MEM_callocN(segcount*sizeof(void*), "ik tree pchan");
- tree->parent= MEM_callocN(segcount*sizeof(int), "ik tree parent");
- for(a=0; a<segcount; a++) {
- tree->pchan[a]= chanlist[segcount-a-1];
- tree->parent[a]= a-1;
- }
- target->tip= segcount-1;
-
- /* AND! link the tree to the root */
- BLI_addtail(&pchan_root->iktree, tree);
- }
- else {
- tree->iterations= MAX2(data->iterations, tree->iterations);
- tree->stretch= tree->stretch && !(data->flag & CONSTRAINT_IK_STRETCH);
-
- /* skip common pose channels and add remaining*/
- size= MIN2(segcount, tree->totchannel);
- for(a=0; a<size && tree->pchan[a]==chanlist[segcount-a-1]; a++);
- parent= a-1;
-
- segcount= segcount-a;
- target->tip= tree->totchannel + segcount - 1;
-
- if (segcount > 0) {
- /* resize array */
- newsize= tree->totchannel + segcount;
- oldchan= tree->pchan;
- oldparent= tree->parent;
-
- tree->pchan= MEM_callocN(newsize*sizeof(void*), "ik tree pchan");
- tree->parent= MEM_callocN(newsize*sizeof(int), "ik tree parent");
- memcpy(tree->pchan, oldchan, sizeof(void*)*tree->totchannel);
- memcpy(tree->parent, oldparent, sizeof(int)*tree->totchannel);
- MEM_freeN(oldchan);
- MEM_freeN(oldparent);
-
- /* add new pose channels at the end, in reverse order */
- for(a=0; a<segcount; a++) {
- tree->pchan[tree->totchannel+a]= chanlist[segcount-a-1];
- tree->parent[tree->totchannel+a]= tree->totchannel+a-1;
- }
- tree->parent[tree->totchannel]= parent;
-
- tree->totchannel= newsize;
- }
-
- /* move tree to end of list, for correct evaluation order */
- BLI_remlink(&pchan_root->iktree, tree);
- BLI_addtail(&pchan_root->iktree, tree);
- }
-
- /* add target to the tree */
- BLI_addtail(&tree->targets, target);
-}
-
-/* called from within the core where_is_pose loop, all animsystems and constraints
-were executed & assigned. Now as last we do an IK pass */
-static void execute_posetree(Object *ob, PoseTree *tree)
-{
- float R_parmat[3][3], identity[3][3];
- float iR_parmat[3][3];
- float R_bonemat[3][3];
- float goalrot[3][3], goalpos[3];
- float rootmat[4][4], imat[4][4];
- float goal[4][4], goalinv[4][4];
- float irest_basis[3][3], full_basis[3][3];
- float end_pose[4][4], world_pose[4][4];
- float length, basis[3][3], rest_basis[3][3], start[3], *ikstretch=NULL;
- float resultinf=0.0f;
- int a, flag, hasstretch=0, resultblend=0;
- bPoseChannel *pchan;
- IK_Segment *seg, *parent, **iktree, *iktarget;
- IK_Solver *solver;
- PoseTarget *target;
- bKinematicConstraint *data, *poleangledata=NULL;
- Bone *bone;
-
- if (tree->totchannel == 0)
- return;
-
- iktree= MEM_mallocN(sizeof(void*)*tree->totchannel, "ik tree");
-
- for(a=0; a<tree->totchannel; a++) {
- pchan= tree->pchan[a];
- bone= pchan->bone;
-
- /* set DoF flag */
- flag= 0;
- if(!(pchan->ikflag & BONE_IK_NO_XDOF) && !(pchan->ikflag & BONE_IK_NO_XDOF_TEMP))
- flag |= IK_XDOF;
- if(!(pchan->ikflag & BONE_IK_NO_YDOF) && !(pchan->ikflag & BONE_IK_NO_YDOF_TEMP))
- flag |= IK_YDOF;
- if(!(pchan->ikflag & BONE_IK_NO_ZDOF) && !(pchan->ikflag & BONE_IK_NO_ZDOF_TEMP))
- flag |= IK_ZDOF;
-
- if(tree->stretch && (pchan->ikstretch > 0.0)) {
- flag |= IK_TRANS_YDOF;
- hasstretch = 1;
- }
-
- seg= iktree[a]= IK_CreateSegment(flag);
-
- /* find parent */
- if(a == 0)
- parent= NULL;
- else
- parent= iktree[tree->parent[a]];
-
- IK_SetParent(seg, parent);
-
- /* get the matrix that transforms from prevbone into this bone */
- Mat3CpyMat4(R_bonemat, pchan->pose_mat);
-
- /* gather transformations for this IK segment */
-
- if (pchan->parent)
- Mat3CpyMat4(R_parmat, pchan->parent->pose_mat);
- else
- Mat3One(R_parmat);
-
- /* bone offset */
- if (pchan->parent && (a > 0))
- VecSubf(start, pchan->pose_head, pchan->parent->pose_tail);
- else
- /* only root bone (a = 0) has no parent */
- start[0]= start[1]= start[2]= 0.0f;
-
- /* change length based on bone size */
- length= bone->length*VecLength(R_bonemat[1]);
-
- /* compute rest basis and its inverse */
- Mat3CpyMat3(rest_basis, bone->bone_mat);
- Mat3CpyMat3(irest_basis, bone->bone_mat);
- Mat3Transp(irest_basis);
-
- /* compute basis with rest_basis removed */
- Mat3Inv(iR_parmat, R_parmat);
- Mat3MulMat3(full_basis, iR_parmat, R_bonemat);
- Mat3MulMat3(basis, irest_basis, full_basis);
-
- /* basis must be pure rotation */
- Mat3Ortho(basis);
-
- /* transform offset into local bone space */
- Mat3Ortho(iR_parmat);
- Mat3MulVecfl(iR_parmat, start);
-
- IK_SetTransform(seg, start, rest_basis, basis, length);
-
- if (pchan->ikflag & BONE_IK_XLIMIT)
- IK_SetLimit(seg, IK_X, pchan->limitmin[0], pchan->limitmax[0]);
- if (pchan->ikflag & BONE_IK_YLIMIT)
- IK_SetLimit(seg, IK_Y, pchan->limitmin[1], pchan->limitmax[1]);
- if (pchan->ikflag & BONE_IK_ZLIMIT)
- IK_SetLimit(seg, IK_Z, pchan->limitmin[2], pchan->limitmax[2]);
-
- IK_SetStiffness(seg, IK_X, pchan->stiffness[0]);
- IK_SetStiffness(seg, IK_Y, pchan->stiffness[1]);
- IK_SetStiffness(seg, IK_Z, pchan->stiffness[2]);
-
- if(tree->stretch && (pchan->ikstretch > 0.0f)) {
- float ikstretch = pchan->ikstretch*pchan->ikstretch;
- IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0f-ikstretch, 0.99f));
- IK_SetLimit(seg, IK_TRANS_Y, 0.001f, 1e10);
- }
- }
-
- solver= IK_CreateSolver(iktree[0]);
-
- /* set solver goals */
-
- /* first set the goal inverse transform, assuming the root of tree was done ok! */
- pchan= tree->pchan[0];
- if (pchan->parent)
- /* transform goal by parent mat, so this rotation is not part of the
- segment's basis. otherwise rotation limits do not work on the
- local transform of the segment itself. */
- Mat4CpyMat4(rootmat, pchan->parent->pose_mat);
- else
- Mat4One(rootmat);
- VECCOPY(rootmat[3], pchan->pose_head);
-
- Mat4MulMat4 (imat, rootmat, ob->obmat);
- Mat4Invert (goalinv, imat);
-
- for (target=tree->targets.first; target; target=target->next) {
- float polepos[3];
- int poleconstrain= 0;
-
- data= (bKinematicConstraint*)target->con->data;
-
- /* 1.0=ctime, we pass on object for auto-ik (owner-type here is object, even though
- * strictly speaking, it is a posechannel)
- */
- get_constraint_target_matrix(target->con, 0, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
-
- /* and set and transform goal */
- Mat4MulMat4(goal, rootmat, goalinv);
-
- VECCOPY(goalpos, goal[3]);
- Mat3CpyMat4(goalrot, goal);
-
- /* same for pole vector target */
- if(data->poletar) {
- get_constraint_target_matrix(target->con, 1, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
-
- if(data->flag & CONSTRAINT_IK_SETANGLE) {
- /* don't solve IK when we are setting the pole angle */
- break;
- }
- else {
- Mat4MulMat4(goal, rootmat, goalinv);
- VECCOPY(polepos, goal[3]);
- poleconstrain= 1;
-
- /* for pole targets, we blend the result of the ik solver
- * instead of the target position, otherwise we can't get
- * a smooth transition */
- resultblend= 1;
- resultinf= target->con->enforce;
-
- if(data->flag & CONSTRAINT_IK_GETANGLE) {
- poleangledata= data;
- data->flag &= ~CONSTRAINT_IK_GETANGLE;
- }
- }
- }
-
- /* do we need blending? */
- if (!resultblend && target->con->enforce!=1.0f) {
- float q1[4], q2[4], q[4];
- float fac= target->con->enforce;
- float mfac= 1.0f-fac;
-
- pchan= tree->pchan[target->tip];
-
- /* end effector in world space */
- Mat4CpyMat4(end_pose, pchan->pose_mat);
- VECCOPY(end_pose[3], pchan->pose_tail);
- Mat4MulSerie(world_pose, goalinv, ob->obmat, end_pose, 0, 0, 0, 0, 0);
-
- /* blend position */
- goalpos[0]= fac*goalpos[0] + mfac*world_pose[3][0];
- goalpos[1]= fac*goalpos[1] + mfac*world_pose[3][1];
- goalpos[2]= fac*goalpos[2] + mfac*world_pose[3][2];
-
- /* blend rotation */
- Mat3ToQuat(goalrot, q1);
- Mat4ToQuat(world_pose, q2);
- QuatInterpol(q, q1, q2, mfac);
- QuatToMat3(q, goalrot);
- }
-
- iktarget= iktree[target->tip];
-
- if(data->weight != 0.0f) {
- if(poleconstrain)
- IK_SolverSetPoleVectorConstraint(solver, iktarget, goalpos,
- polepos, data->poleangle*(float)M_PI/180.0f, (poleangledata == data));
- IK_SolverAddGoal(solver, iktarget, goalpos, data->weight);
- }
- if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0f))
- if((data->flag & CONSTRAINT_IK_AUTO)==0)
- IK_SolverAddGoalOrientation(solver, iktarget, goalrot,
- data->orientweight);
- }
-
- /* solve */
- IK_Solve(solver, 0.0f, tree->iterations);
-
- if(poleangledata)
- poleangledata->poleangle= IK_SolverGetPoleAngle(solver)*180.0f/(float)M_PI;
-
- IK_FreeSolver(solver);
-
- /* gather basis changes */
- tree->basis_change= MEM_mallocN(sizeof(float[3][3])*tree->totchannel, "ik basis change");
- if(hasstretch)
- ikstretch= MEM_mallocN(sizeof(float)*tree->totchannel, "ik stretch");
-
- for(a=0; a<tree->totchannel; a++) {
- IK_GetBasisChange(iktree[a], tree->basis_change[a]);
-
- if(hasstretch) {
- /* have to compensate for scaling received from parent */
- float parentstretch, stretch;
-
- pchan= tree->pchan[a];
- parentstretch= (tree->parent[a] >= 0)? ikstretch[tree->parent[a]]: 1.0f;
-
- if(tree->stretch && (pchan->ikstretch > 0.0f)) {
- float trans[3], length;
-
- IK_GetTranslationChange(iktree[a], trans);
- length= pchan->bone->length*VecLength(pchan->pose_mat[1]);
-
- ikstretch[a]= (length == 0.0f)? 1.0f: (trans[1]+length)/length;
- }
- else
- ikstretch[a] = 1.0f;
-
- stretch= (parentstretch == 0.0f)? 1.0f: ikstretch[a]/parentstretch;
-
- VecMulf(tree->basis_change[a][0], stretch);
- VecMulf(tree->basis_change[a][1], stretch);
- VecMulf(tree->basis_change[a][2], stretch);
- }
-
- if(resultblend && resultinf!=1.0f) {
- Mat3One(identity);
- Mat3BlendMat3(tree->basis_change[a], identity,
- tree->basis_change[a], resultinf);
- }
-
- IK_FreeSegment(iktree[a]);
- }
-
- MEM_freeN(iktree);
- if(ikstretch) MEM_freeN(ikstretch);
-}
-
-void free_posetree(PoseTree *tree)
-{
- BLI_freelistN(&tree->targets);
- if(tree->pchan) MEM_freeN(tree->pchan);
- if(tree->parent) MEM_freeN(tree->parent);
- if(tree->basis_change) MEM_freeN(tree->basis_change);
- MEM_freeN(tree);
-}
-
/* ********************** THE POSE SOLVER ******************* */
@@ -1981,10 +1586,14 @@ void chan_calc_mat(bPoseChannel *chan)
/* get scaling matrix */
SizeToMat3(chan->size, smat);
- /* rotations may either be quats or eulers (no rotation modes for now...) */
- if (chan->rotmode) {
- /* euler rotations (will cause gimble lock... no rotation order to solve that yet) */
- EulToMat3(chan->eul, rmat);
+ /* rotations may either be quats, eulers (with various rotation orders), or axis-angle */
+ if (chan->rotmode > 0) {
+ /* euler rotations (will cause gimble lock, but this can be alleviated a bit with rotation orders) */
+ EulOToMat3(chan->eul, chan->rotmode, rmat);
+ }
+ else if (chan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis-angle - stored in quaternion data, but not really that great for 3D-changing orientations */
+ AxisAngleToMat3(&chan->quat[1], chan->quat[0], rmat);
}
else {
/* quats are normalised before use to eliminate scaling issues */
@@ -2003,41 +1612,6 @@ void chan_calc_mat(bPoseChannel *chan)
}
}
-/* transform from bone(b) to bone(b+1), store in chan_mat */
-static void make_dmats(bPoseChannel *pchan)
-{
- if (pchan->parent) {
- float iR_parmat[4][4];
- Mat4Invert(iR_parmat, pchan->parent->pose_mat);
- Mat4MulMat4(pchan->chan_mat, pchan->pose_mat, iR_parmat); // delta mat
- }
- else Mat4CpyMat4(pchan->chan_mat, pchan->pose_mat);
-}
-
-/* applies IK matrix to pchan, IK is done separated */
-/* formula: pose_mat(b) = pose_mat(b-1) * diffmat(b-1, b) * ik_mat(b) */
-/* to make this work, the diffmats have to be precalculated! Stored in chan_mat */
-static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[][3]) // nr = to detect if this is first bone
-{
- float vec[3], ikmat[4][4];
-
- Mat4CpyMat3(ikmat, ik_mat);
-
- if (pchan->parent)
- Mat4MulSerie(pchan->pose_mat, pchan->parent->pose_mat, pchan->chan_mat, ikmat, NULL, NULL, NULL, NULL, NULL);
- else
- Mat4MulMat4(pchan->pose_mat, ikmat, pchan->chan_mat);
-
- /* calculate head */
- VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
- /* calculate tail */
- VECCOPY(vec, pchan->pose_mat[1]);
- VecMulf(vec, pchan->bone->length);
- VecAddf(pchan->pose_tail, pchan->pose_head, vec);
-
- pchan->flag |= POSE_DONE;
-}
-
/* NLA strip modifiers */
static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseChannel *pchan)
{
@@ -2163,7 +1737,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
/* The main armature solver, does all constraints excluding IK */
/* pchan is validated, as having bone and parent pointer */
-static void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
+void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
{
Bone *bone, *parbone;
bPoseChannel *parchan;
@@ -2207,7 +1781,7 @@ static void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, fl
Mat4MulSerie(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], vec[3];
+ float orthmat[4][4];
/* get the official transform, but we only use the vector from it (optimize...) */
Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
@@ -2303,48 +1877,27 @@ void where_is_pose (Scene *scene, Object *ob)
else {
Mat4Invert(ob->imat, ob->obmat); // imat is needed
- /* 1. construct the PoseTrees, clear flags */
+ /* 1. clear flags */
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- pchan->flag &= ~(POSE_DONE|POSE_CHAIN);
- if(pchan->constflag & PCHAN_HAS_IK) // flag is set on editing constraints
- initialize_posetree(ob, pchan); // will attach it to root!
+ pchan->flag &= ~(POSE_DONE|POSE_CHAIN|POSE_IKTREE);
}
-
- /* 2. the main loop, channels are already hierarchical sorted from root to children */
+ /* 2. construct the IK tree */
+ BIK_initialize_tree(scene, ob, ctime);
+
+ /* 3. the main loop, channels are already hierarchical sorted from root to children */
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- /* 3. if we find an IK root, we handle it separated */
- if(pchan->iktree.first) {
- while(pchan->iktree.first) {
- PoseTree *tree= pchan->iktree.first;
- int a;
-
- /* 4. walk over the tree for regular solving */
- for(a=0; a<tree->totchannel; a++) {
- if(!(tree->pchan[a]->flag & POSE_DONE)) // successive trees can set the flag
- where_is_pose_bone(scene, ob, tree->pchan[a], ctime);
- }
- /* 5. execute the IK solver */
- execute_posetree(ob, tree);
-
- /* 6. apply the differences to the channels,
- we need to calculate the original differences first */
- for(a=0; a<tree->totchannel; a++)
- make_dmats(tree->pchan[a]);
-
- for(a=0; a<tree->totchannel; a++)
- /* sets POSE_DONE */
- where_is_ik_bone(tree->pchan[a], tree->basis_change[a]);
-
- /* 7. and free */
- BLI_remlink(&pchan->iktree, tree);
- free_posetree(tree);
- }
+ /* 4. if we find an IK root, we handle it separated */
+ if(pchan->flag & POSE_IKTREE) {
+ BIK_execute_tree(scene, ob, pchan, ctime);
}
+ /* 5. otherwise just call the normal solver */
else if(!(pchan->flag & POSE_DONE)) {
where_is_pose_bone(scene, ob, pchan, ctime);
}
}
+ /* 6. release the IK tree */
+ BIK_release_tree(scene, ob, ctime);
}
/* calculating deform matrices */
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index d3d21018c1c..f261b020717 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -176,8 +176,6 @@ void pushpop_test()
void free_blender(void)
{
/* samples are in a global list..., also sets G.main->sound->sample NULL */
- sound_free_all_samples();
-
free_main(G.main);
G.main= NULL;
@@ -228,7 +226,7 @@ static void clear_global(void)
G.main= NULL;
- G.f &= ~(G_WEIGHTPAINT + G_VERTEXPAINT + G_FACESELECT + G_PARTICLEEDIT);
+ G.f &= ~(G_FACESELECT);
}
/* make sure path names are correct for OS */
@@ -330,9 +328,6 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
MEM_freeN(bfd->user);
}
- /* samples is a global list... */
- sound_free_all_samples();
-
/* case G_FILE_NO_UI or no screens in file */
if(mode) {
/* leave entire context further unaltered? */
@@ -387,10 +382,6 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
/* now tag update flags, to ensure deformers get calculated on redraw */
DAG_scene_update_flags(CTX_data_scene(C), CTX_data_scene(C)->lay);
- if (G.f & G_DOSCRIPTLINKS) {
- /* there's an onload scriptlink to execute in screenmain */
-// XXX mainqenter(ONLOAD_SCRIPT, 1);
- }
if (G.sce != filename) /* these are the same at times, should never copy to the same location */
strcpy(G.sce, filename);
@@ -635,8 +626,7 @@ void BKE_write_undo(bContext *C, char *name)
}
}
-/* 1= an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation
- * Note, ALWAYS call sound_initialize_sounds after BKE_undo_step() */
+/* 1= an undo, -1 is a redo. we have to make sure 'curundo' remains at current situation */
void BKE_undo_step(bContext *C, int step)
{
@@ -692,6 +682,22 @@ void BKE_undo_number(bContext *C, int nr)
BKE_undo_step(C, 0);
}
+/* go back to the last occurance of name in stack */
+void BKE_undo_name(bContext *C, const char *name)
+{
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev) {
+ if(strcmp(name, uel->name)==0)
+ break;
+ }
+ if(uel && uel->prev) {
+ curundo= uel->prev;
+ BKE_undo_step(C, 0);
+ }
+}
+
+
char *BKE_undo_menu_string(void)
{
UndoElem *uel;
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
new file mode 100644
index 00000000000..7c3f3a7876f
--- /dev/null
+++ b/source/blender/blenkernel/intern/boids.c
@@ -0,0 +1,1546 @@
+/* boids.c
+ *
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_particle_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_boid_types.h"
+#include "DNA_listBase.h"
+
+#include "BLI_rand.h"
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_kdtree.h"
+#include "BLI_kdopbvh.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"
+
+typedef struct BoidValues {
+ float max_speed, max_acc;
+ float max_ave, min_speed;
+ float personal_space, jump_speed;
+} 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)
+{
+ return 0;
+}
+
+static int rule_goal_avoid(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ BoidRuleGoalAvoid *gabr = (BoidRuleGoalAvoid*) rule;
+ BoidSettings *boids = bbd->part->boids;
+ ParticleEffectorCache *ec;
+ Object *priority_ob = NULL;
+ BoidParticle *bpa = pa->boid;
+ float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
+ float mul = (rule->type == eBoidRuleType_Avoid ? 1.0 : -1.0);
+ float priority = 0.0f, len = 0.0f;
+ int ret = 0;
+
+ /* first find out goal/predator with highest priority */
+ /* if rule->ob specified use it */
+ if(gabr->ob && (rule->type != eBoidRuleType_Goal || gabr->ob != bpa->ground)) {
+ PartDeflect *pd = gabr->ob->pd;
+ float vec_to_part[3];
+
+ if(pd && pd->forcefield == PFIELD_BOID) {
+ effector_find_co(bbd->sim->scene, pa->prev_state.co, NULL, gabr->ob, pd, loc, vec, NULL, NULL);
+
+ VecSubf(vec_to_part, pa->prev_state.co, loc);
+
+ priority = mul * pd->f_strength * effector_falloff(pd, vec, vec_to_part);
+ }
+ else
+ priority = 1.0;
+
+ priority = 1.0;
+ priority_ob = gabr->ob;
+ }
+ else for(ec=bbd->sim->psys->effectors.first; ec; ec=ec->next) {
+ if(ec->type & PSYS_EC_EFFECTOR) {
+ Object *eob = ec->ob;
+ PartDeflect *pd = eob->pd;
+
+ /* skip current object */
+ if(rule->type == eBoidRuleType_Goal && eob == bpa->ground)
+ continue;
+
+ if(pd->forcefield == PFIELD_BOID && mul * pd->f_strength > 0.0f) {
+ float vec_to_part[3], temp;
+
+ effector_find_co(bbd->sim->scene, pa->prev_state.co, NULL, eob, pd, loc, vec, NULL, NULL);
+
+ VecSubf(vec_to_part, pa->prev_state.co, loc);
+
+ temp = mul * pd->f_strength * effector_falloff(pd, vec, vec_to_part);
+
+ if(temp == 0.0f)
+ ; /* do nothing */
+ else if(temp > priority) {
+ priority = temp;
+ priority_ob = eob;
+ len = VecLength(vec_to_part);
+ }
+ /* choose closest object with same priority */
+ else if(temp == priority) {
+ float len2 = VecLength(vec_to_part);
+
+ if(len2 < len) {
+ priority_ob = eob;
+ len = len2;
+ }
+ }
+ }
+ }
+ }
+
+ /* then use that effector */
+ if(priority > (rule->type==eBoidRuleType_Avoid ? gabr->fear_factor : 0.0f)) { /* with avoid, factor is "fear factor" */
+ Object *eob = priority_ob;
+ PartDeflect *pd = eob->pd;
+ float vec_to_part[3];
+ float surface = 0.0f;
+ float nor[3];
+
+ if(gabr->options & BRULE_GOAL_AVOID_PREDICT) {
+ /* estimate future location of target */
+ surface = (float)effector_find_co(bbd->sim->scene, pa->prev_state.co, NULL, eob, pd, loc, nor, vec, NULL);
+
+ VecSubf(vec_to_part, pa->prev_state.co, loc);
+ len = Normalize(vec_to_part);
+
+ VecMulf(vec, len / (val->max_speed * bbd->timestep));
+ VecAddf(loc, loc, vec);
+ VecSubf(vec_to_part, pa->prev_state.co, loc);
+ }
+ else {
+ surface = (float)effector_find_co(bbd->sim->scene, pa->prev_state.co, NULL, eob, pd, loc, nor, NULL, NULL);
+
+ VecSubf(vec_to_part, pa->prev_state.co, loc);
+ len = VecLength(vec_to_part);
+ }
+
+ if(rule->type == eBoidRuleType_Goal && boids->options & BOID_ALLOW_CLIMB && surface!=0.0f) {
+ if(!bbd->goal_ob || bbd->goal_priority < priority) {
+ bbd->goal_ob = eob;
+ VECCOPY(bbd->goal_co, loc);
+ VECCOPY(bbd->goal_nor, nor);
+ }
+ }
+ else if(rule->type == eBoidRuleType_Avoid && bpa->data.mode == eBoidMode_Climbing &&
+ priority > 2.0f * gabr->fear_factor) {
+ /* detach from surface and try to fly away from danger */
+ VECCOPY(vec_to_part, bpa->gravity);
+ VecMulf(vec_to_part, -1.0f);
+ }
+
+ VECCOPY(bbd->wanted_co, vec_to_part);
+ VecMulf(bbd->wanted_co, mul);
+
+ bbd->wanted_speed = val->max_speed * priority;
+
+ /* with goals factor is approach velocity factor */
+ if(rule->type == eBoidRuleType_Goal && boids->landing_smoothness > 0.0f) {
+ float len2 = 2.0f*VecLength(pa->prev_state.vel);
+
+ surface *= pa->size * boids->height;
+
+ if(len2 > 0.0f && len - surface < len2) {
+ len2 = (len - surface)/len2;
+ bbd->wanted_speed *= pow(len2, boids->landing_smoothness);
+ }
+ }
+
+ ret = 1;
+ }
+
+ return ret;
+}
+
+static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ BoidRuleAvoidCollision *acbr = (BoidRuleAvoidCollision*) rule;
+ KDTreeNearest *ptn = NULL;
+ ParticleEffectorCache *ec;
+ ParticleTarget *pt;
+ BoidParticle *bpa = pa->boid;
+ float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
+ float co1[3], vel1[3], co2[3], vel2[3];
+ float len, t, inp, t_min = 2.0f;
+ int n, neighbors = 0, nearest = 0;
+ int ret = 0;
+
+ //check deflector objects first
+ if(acbr->options & BRULE_ACOLL_WITH_DEFLECTORS) {
+ ParticleCollision col;
+ BVHTreeRayHit hit;
+ float radius = val->personal_space * pa->size, ray_dir[3];
+
+ VECCOPY(col.co1, pa->prev_state.co);
+ VecAddf(col.co2, pa->prev_state.co, pa->prev_state.vel);
+ VecSubf(ray_dir, col.co2, col.co1);
+ VecMulf(ray_dir, acbr->look_ahead);
+ col.t = 0.0f;
+ hit.index = -1;
+ hit.dist = col.ray_len = VecLength(ray_dir);
+
+ /* find out closest deflector object */
+ for(ec=bbd->sim->psys->effectors.first; ec; ec=ec->next) {
+ if(ec->type & PSYS_EC_DEFLECT) {
+ Object *eob = ec->ob;
+
+ /* don't check with current ground object */
+ if(eob == bpa->ground)
+ continue;
+
+ col.md = ( CollisionModifierData * ) ( modifiers_findByType ( eob, eModifierType_Collision ) );
+ col.ob_t = eob;
+
+ if(col.md && col.md->bvhtree)
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ }
+ }
+ /* then avoid that object */
+ if(hit.index>=0) {
+ /* TODO: not totally happy with this part */
+ t = hit.dist/col.ray_len;
+
+ VECCOPY(bbd->wanted_co, col.nor);
+
+ VecMulf(bbd->wanted_co, (1.0f - t) * val->personal_space * pa->size);
+
+ bbd->wanted_speed = sqrt(t) * VecLength(pa->prev_state.vel);
+
+ return 1;
+ }
+ }
+
+ //check boids in own system
+ if(acbr->options & BRULE_ACOLL_WITH_BOIDS)
+ {
+ neighbors = BLI_kdtree_range_search(bbd->sim->psys->tree, acbr->look_ahead * VecLength(pa->prev_state.vel), pa->prev_state.co, pa->prev_state.ave, &ptn);
+ if(neighbors > 1) for(n=1; n<neighbors; n++) {
+ VECCOPY(co1, pa->prev_state.co);
+ VECCOPY(vel1, pa->prev_state.vel);
+ VECCOPY(co2, (bbd->sim->psys->particles + ptn[n].index)->prev_state.co);
+ VECCOPY(vel2, (bbd->sim->psys->particles + ptn[n].index)->prev_state.vel);
+
+ VecSubf(loc, co1, co2);
+
+ VecSubf(vec, vel1, vel2);
+
+ inp = Inpf(vec,vec);
+
+ /* velocities not parallel */
+ if(inp != 0.0f) {
+ t = -Inpf(loc, vec)/inp;
+ /* cpa is not too far in the future so investigate further */
+ if(t > 0.0f && t < t_min) {
+ VECADDFAC(co1, co1, vel1, t);
+ VECADDFAC(co2, co2, vel2, t);
+
+ VecSubf(vec, co2, co1);
+
+ len = Normalize(vec);
+
+ /* distance of cpa is close enough */
+ if(len < 2.0f * val->personal_space * pa->size) {
+ t_min = t;
+
+ VecMulf(vec, VecLength(vel1));
+ VecMulf(vec, (2.0f - t)/2.0f);
+ VecSubf(bbd->wanted_co, vel1, vec);
+ bbd->wanted_speed = VecLength(bbd->wanted_co);
+ ret = 1;
+ }
+ }
+ }
+ }
+ }
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+
+ /* check boids in other systems */
+ for(pt=bbd->sim->psys->targets.first; pt; pt=pt->next) {
+ ParticleSystem *epsys = psys_get_target_system(bbd->sim->ob, pt);
+
+ if(epsys) {
+ neighbors = BLI_kdtree_range_search(epsys->tree, acbr->look_ahead * VecLength(pa->prev_state.vel), pa->prev_state.co, pa->prev_state.ave, &ptn);
+ if(neighbors > 0) for(n=0; n<neighbors; n++) {
+ VECCOPY(co1, pa->prev_state.co);
+ VECCOPY(vel1, pa->prev_state.vel);
+ VECCOPY(co2, (epsys->particles + ptn[n].index)->prev_state.co);
+ VECCOPY(vel2, (epsys->particles + ptn[n].index)->prev_state.vel);
+
+ VecSubf(loc, co1, co2);
+
+ VecSubf(vec, vel1, vel2);
+
+ inp = Inpf(vec,vec);
+
+ /* velocities not parallel */
+ if(inp != 0.0f) {
+ t = -Inpf(loc, vec)/inp;
+ /* cpa is not too far in the future so investigate further */
+ if(t > 0.0f && t < t_min) {
+ VECADDFAC(co1, co1, vel1, t);
+ VECADDFAC(co2, co2, vel2, t);
+
+ VecSubf(vec, co2, co1);
+
+ len = Normalize(vec);
+
+ /* distance of cpa is close enough */
+ if(len < 2.0f * val->personal_space * pa->size) {
+ t_min = t;
+
+ VecMulf(vec, VecLength(vel1));
+ VecMulf(vec, (2.0f - t)/2.0f);
+ VecSubf(bbd->wanted_co, vel1, vec);
+ bbd->wanted_speed = VecLength(bbd->wanted_co);
+ ret = 1;
+ }
+ }
+ }
+ }
+
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+ }
+ }
+
+
+ if(ptn && nearest==0)
+ MEM_freeN(ptn);
+
+ return ret;
+}
+static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ KDTreeNearest *ptn = NULL;
+ ParticleTarget *pt;
+ float len = 2.0f * val->personal_space * pa->size + 1.0f;
+ float vec[3] = {0.0f, 0.0f, 0.0f};
+ int neighbors = BLI_kdtree_range_search(bbd->sim->psys->tree, 2.0f * val->personal_space * pa->size, pa->prev_state.co, NULL, &ptn);
+ int ret = 0;
+
+ if(neighbors > 1 && ptn[1].dist!=0.0f) {
+ VecSubf(vec, pa->prev_state.co, bbd->sim->psys->particles[ptn[1].index].state.co);
+ VecMulf(vec, (2.0f * val->personal_space * pa->size - ptn[1].dist) / ptn[1].dist);
+ VecAddf(bbd->wanted_co, bbd->wanted_co, vec);
+ bbd->wanted_speed = val->max_speed;
+ len = ptn[1].dist;
+ ret = 1;
+ }
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+
+ /* check other boid systems */
+ for(pt=bbd->sim->psys->targets.first; pt; pt=pt->next) {
+ ParticleSystem *epsys = psys_get_target_system(bbd->sim->ob, pt);
+
+ if(epsys) {
+ neighbors = BLI_kdtree_range_search(epsys->tree, 2.0f * val->personal_space * pa->size, pa->prev_state.co, NULL, &ptn);
+
+ if(neighbors > 0 && ptn[0].dist < len) {
+ VecSubf(vec, pa->prev_state.co, ptn[0].co);
+ VecMulf(vec, (2.0f * val->personal_space * pa->size - ptn[0].dist) / ptn[1].dist);
+ VecAddf(bbd->wanted_co, bbd->wanted_co, vec);
+ bbd->wanted_speed = val->max_speed;
+ len = ptn[0].dist;
+ ret = 1;
+ }
+
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+ }
+ }
+ return ret;
+}
+static int rule_flock(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ KDTreeNearest ptn[11];
+ float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
+ int neighbors = BLI_kdtree_find_n_nearest(bbd->sim->psys->tree, 11, pa->state.co, pa->prev_state.ave, ptn);
+ int n;
+ int ret = 0;
+
+ if(neighbors > 1) {
+ for(n=1; n<neighbors; n++) {
+ VecAddf(loc, loc, bbd->sim->psys->particles[ptn[n].index].prev_state.co);
+ VecAddf(vec, vec, bbd->sim->psys->particles[ptn[n].index].prev_state.vel);
+ }
+
+ VecMulf(loc, 1.0f/((float)neighbors - 1.0f));
+ VecMulf(vec, 1.0f/((float)neighbors - 1.0f));
+
+ VecSubf(loc, loc, pa->prev_state.co);
+ VecSubf(vec, vec, pa->prev_state.vel);
+
+ VecAddf(bbd->wanted_co, bbd->wanted_co, vec);
+ VecAddf(bbd->wanted_co, bbd->wanted_co, loc);
+ bbd->wanted_speed = VecLength(bbd->wanted_co);
+
+ ret = 1;
+ }
+ return ret;
+}
+static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ BoidRuleFollowLeader *flbr = (BoidRuleFollowLeader*) rule;
+ float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
+ float mul, len;
+ int n = (flbr->queue_size <= 1) ? bbd->sim->psys->totpart : flbr->queue_size;
+ int i, ret = 0, p = pa - bbd->sim->psys->particles;
+
+ if(flbr->ob) {
+ float vec2[3], t;
+
+ /* first check we're not blocking the leader*/
+ VecSubf(vec, flbr->loc, flbr->oloc);
+ VecMulf(vec, 1.0f/bbd->timestep);
+
+ VecSubf(loc, pa->prev_state.co, flbr->oloc);
+
+ mul = Inpf(vec, vec);
+
+ /* leader is not moving */
+ if(mul < 0.01) {
+ len = VecLength(loc);
+ /* too close to leader */
+ if(len < 2.0f * val->personal_space * pa->size) {
+ VECCOPY(bbd->wanted_co, loc);
+ bbd->wanted_speed = val->max_speed;
+ return 1;
+ }
+ }
+ else {
+ t = Inpf(loc, vec)/mul;
+
+ /* possible blocking of leader in near future */
+ if(t > 0.0f && t < 3.0f) {
+ VECCOPY(vec2, vec);
+ VecMulf(vec2, t);
+
+ VecSubf(vec2, loc, vec2);
+
+ len = VecLength(vec2);
+
+ if(len < 2.0f * val->personal_space * pa->size) {
+ VECCOPY(bbd->wanted_co, vec2);
+ bbd->wanted_speed = val->max_speed * (3.0f - t)/3.0f;
+ return 1;
+ }
+ }
+ }
+
+ /* not blocking so try to follow leader */
+ if(p && flbr->options & BRULE_LEADER_IN_LINE) {
+ VECCOPY(vec, bbd->sim->psys->particles[p-1].prev_state.vel);
+ VECCOPY(loc, bbd->sim->psys->particles[p-1].prev_state.co);
+ }
+ else {
+ VECCOPY(loc, flbr->oloc);
+ VecSubf(vec, flbr->loc, flbr->oloc);
+ VecMulf(vec, 1.0/bbd->timestep);
+ }
+
+ /* fac is seconds behind leader */
+ VECADDFAC(loc, loc, vec, -flbr->distance);
+
+ VecSubf(bbd->wanted_co, loc, pa->prev_state.co);
+ bbd->wanted_speed = VecLength(bbd->wanted_co);
+
+ ret = 1;
+ }
+ else if(p % n) {
+ float vec2[3], t, t_min = 3.0f;
+
+ /* first check we're not blocking any leaders */
+ for(i = 0; i< bbd->sim->psys->totpart; i+=n){
+ VECCOPY(vec, bbd->sim->psys->particles[i].prev_state.vel);
+
+ VecSubf(loc, pa->prev_state.co, bbd->sim->psys->particles[i].prev_state.co);
+
+ mul = Inpf(vec, vec);
+
+ /* leader is not moving */
+ if(mul < 0.01) {
+ len = VecLength(loc);
+ /* too close to leader */
+ if(len < 2.0f * val->personal_space * pa->size) {
+ VECCOPY(bbd->wanted_co, loc);
+ bbd->wanted_speed = val->max_speed;
+ return 1;
+ }
+ }
+ else {
+ t = Inpf(loc, vec)/mul;
+
+ /* possible blocking of leader in near future */
+ if(t > 0.0f && t < t_min) {
+ VECCOPY(vec2, vec);
+ VecMulf(vec2, t);
+
+ VecSubf(vec2, loc, vec2);
+
+ len = VecLength(vec2);
+
+ if(len < 2.0f * val->personal_space * pa->size) {
+ t_min = t;
+ VECCOPY(bbd->wanted_co, loc);
+ bbd->wanted_speed = val->max_speed * (3.0f - t)/3.0f;
+ ret = 1;
+ }
+ }
+ }
+ }
+
+ if(ret) return 1;
+
+ /* not blocking so try to follow leader */
+ if(flbr->options & BRULE_LEADER_IN_LINE) {
+ VECCOPY(vec, bbd->sim->psys->particles[p-1].prev_state.vel);
+ VECCOPY(loc, bbd->sim->psys->particles[p-1].prev_state.co);
+ }
+ else {
+ VECCOPY(vec, bbd->sim->psys->particles[p - p%n].prev_state.vel);
+ VECCOPY(loc, bbd->sim->psys->particles[p - p%n].prev_state.co);
+ }
+
+ /* fac is seconds behind leader */
+ VECADDFAC(loc, loc, vec, -flbr->distance);
+
+ VecSubf(bbd->wanted_co, loc, pa->prev_state.co);
+ bbd->wanted_speed = VecLength(bbd->wanted_co);
+
+ ret = 1;
+ }
+
+ return ret;
+}
+static int rule_average_speed(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ BoidParticle *bpa = pa->boid;
+ BoidRuleAverageSpeed *asbr = (BoidRuleAverageSpeed*)rule;
+ float vec[3] = {0.0f, 0.0f, 0.0f};
+
+ if(asbr->wander > 0.0f) {
+ /* abuse pa->r_ave for wandering */
+ bpa->wander[0] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+ bpa->wander[1] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+ bpa->wander[2] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+
+ Normalize(bpa->wander);
+
+ VECCOPY(vec, bpa->wander);
+
+ QuatMulVecf(pa->prev_state.rot, vec);
+
+ VECCOPY(bbd->wanted_co, pa->prev_state.ave);
+
+ VecMulf(bbd->wanted_co, 1.1f);
+
+ VecAddf(bbd->wanted_co, bbd->wanted_co, vec);
+
+ /* leveling */
+ if(asbr->level > 0.0f) {
+ Projf(vec, bbd->wanted_co, bbd->sim->psys->part->acc);
+ VecMulf(vec, asbr->level);
+ VecSubf(bbd->wanted_co, bbd->wanted_co, vec);
+ }
+ }
+ else {
+ VECCOPY(bbd->wanted_co, pa->prev_state.ave);
+
+ /* may happen at birth */
+ if(Inp2f(bbd->wanted_co,bbd->wanted_co)==0.0f) {
+ bbd->wanted_co[0] = 2.0f*(0.5f - BLI_frand());
+ bbd->wanted_co[1] = 2.0f*(0.5f - BLI_frand());
+ bbd->wanted_co[2] = 2.0f*(0.5f - BLI_frand());
+ }
+
+ /* leveling */
+ if(asbr->level > 0.0f) {
+ Projf(vec, bbd->wanted_co, bbd->sim->psys->part->acc);
+ VecMulf(vec, asbr->level);
+ VecSubf(bbd->wanted_co, bbd->wanted_co, vec);
+ }
+
+ }
+ bbd->wanted_speed = asbr->speed * val->max_speed;
+
+ return 1;
+}
+static int rule_fight(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+{
+ BoidRuleFight *fbr = (BoidRuleFight*)rule;
+ KDTreeNearest *ptn = NULL;
+ ParticleTarget *pt;
+ ParticleData *epars;
+ ParticleData *enemy_pa = NULL;
+ BoidParticle *bpa;
+ /* friends & enemies */
+ float closest_enemy[3] = {0.0f,0.0f,0.0f};
+ float closest_dist = fbr->distance + 1.0f;
+ float f_strength = 0.0f, e_strength = 0.0f;
+ float health = 0.0f;
+ int n, ret = 0;
+
+ /* calculate own group strength */
+ int neighbors = BLI_kdtree_range_search(bbd->sim->psys->tree, fbr->distance, pa->prev_state.co, NULL, &ptn);
+ for(n=0; n<neighbors; n++) {
+ bpa = bbd->sim->psys->particles[ptn[n].index].boid;
+ health += bpa->data.health;
+ }
+
+ f_strength += bbd->part->boids->strength * health;
+
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+
+ /* add other friendlies and calculate enemy strength and find closest enemy */
+ for(pt=bbd->sim->psys->targets.first; pt; pt=pt->next) {
+ ParticleSystem *epsys = psys_get_target_system(bbd->sim->ob, pt);
+ if(epsys) {
+ epars = epsys->particles;
+
+ neighbors = BLI_kdtree_range_search(epsys->tree, fbr->distance, pa->prev_state.co, NULL, &ptn);
+
+ health = 0.0f;
+
+ for(n=0; n<neighbors; n++) {
+ bpa = epars[ptn[n].index].boid;
+ health += bpa->data.health;
+
+ if(n==0 && pt->mode==PTARGET_MODE_ENEMY && ptn[n].dist < closest_dist) {
+ VECCOPY(closest_enemy, ptn[n].co);
+ closest_dist = ptn[n].dist;
+ enemy_pa = epars + ptn[n].index;
+ }
+ }
+ if(pt->mode==PTARGET_MODE_ENEMY)
+ e_strength += epsys->part->boids->strength * health;
+ else if(pt->mode==PTARGET_MODE_FRIEND)
+ f_strength += epsys->part->boids->strength * health;
+
+ if(ptn){ MEM_freeN(ptn); ptn=NULL; }
+ }
+ }
+ /* decide action if enemy presence found */
+ if(e_strength > 0.0f) {
+ VecSubf(bbd->wanted_co, closest_enemy, pa->prev_state.co);
+
+ /* attack if in range */
+ if(closest_dist <= bbd->part->boids->range + pa->size + enemy_pa->size) {
+ float damage = BLI_frand();
+ float enemy_dir[3] = {bbd->wanted_co[0],bbd->wanted_co[1],bbd->wanted_co[2]};
+
+ Normalize(enemy_dir);
+
+ /* fight mode */
+ bbd->wanted_speed = 0.0f;
+
+ /* must face enemy to fight */
+ if(Inpf(pa->prev_state.ave, enemy_dir)>0.5f) {
+ bpa = enemy_pa->boid;
+ bpa->data.health -= bbd->part->boids->strength * bbd->timestep * ((1.0f-bbd->part->boids->accuracy)*damage + bbd->part->boids->accuracy);
+ }
+ }
+ else {
+ /* approach mode */
+ bbd->wanted_speed = val->max_speed;
+ }
+
+ /* check if boid doesn't want to fight */
+ bpa = pa->boid;
+ if(bpa->data.health/bbd->part->boids->health * bbd->part->boids->aggression < e_strength / f_strength) {
+ /* decide to flee */
+ if(closest_dist < fbr->flee_distance * fbr->distance) {
+ VecMulf(bbd->wanted_co, -1.0f);
+ bbd->wanted_speed = val->max_speed;
+ }
+ else { /* wait for better odds */
+ bbd->wanted_speed = 0.0f;
+ }
+ }
+
+ ret = 1;
+ }
+
+ return ret;
+}
+
+typedef int (*boid_rule_cb)(BoidRule *rule, BoidBrainData *data, BoidValues *val, ParticleData *pa);
+
+static boid_rule_cb boid_rules[] = {
+ rule_none,
+ rule_goal_avoid,
+ rule_goal_avoid,
+ rule_avoid_collision,
+ rule_separate,
+ rule_flock,
+ rule_follow_leader,
+ rule_average_speed,
+ rule_fight,
+ //rule_help,
+ //rule_protect,
+ //rule_hide,
+ //rule_follow_path,
+ //rule_follow_wall
+};
+
+static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData *pa)
+{
+ BoidParticle *bpa = pa->boid;
+
+ if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)) {
+ val->max_speed = boids->land_max_speed * bpa->data.health/boids->health;
+ val->max_acc = boids->land_max_acc * val->max_speed;
+ val->max_ave = boids->land_max_ave * M_PI * bpa->data.health/boids->health;
+ val->min_speed = 0.0f; /* no minimum speed on land */
+ val->personal_space = boids->land_personal_space;
+ val->jump_speed = boids->land_jump_speed * bpa->data.health/boids->health;
+ }
+ else {
+ val->max_speed = boids->air_max_speed * bpa->data.health/boids->health;
+ val->max_acc = boids->air_max_acc * val->max_speed;
+ val->max_ave = boids->air_max_ave * M_PI * bpa->data.health/boids->health;
+ val->min_speed = boids->air_min_speed * boids->air_max_speed;
+ val->personal_space = boids->air_personal_space;
+ val->jump_speed = 0.0f; /* no jumping in air */
+ }
+}
+static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *ground_co, float *ground_nor)
+{
+ BoidParticle *bpa = pa->boid;
+
+ if(bpa->data.mode == eBoidMode_Climbing) {
+ SurfaceModifierData *surmd = NULL;
+ float x[3], v[3];
+
+ surmd = (SurfaceModifierData *)modifiers_findByType ( bpa->ground, eModifierType_Surface );
+
+ /* take surface velocity into account */
+ effector_find_co(bbd->sim->scene, pa->state.co, surmd, NULL, NULL, x, NULL, v, NULL);
+ VecAddf(x, x, v);
+
+ /* get actual position on surface */
+ effector_find_co(bbd->sim->scene, x, surmd, NULL, NULL, ground_co, ground_nor, NULL, NULL);
+
+ return bpa->ground;
+ }
+ else {
+ float zvec[3] = {0.0f, 0.0f, 2000.0f};
+ ParticleCollision col;
+ BVHTreeRayHit hit;
+ ParticleEffectorCache *ec;
+ float radius = 0.0f, t, ray_dir[3];
+
+ VECCOPY(col.co1, pa->state.co);
+ VECCOPY(col.co2, pa->state.co);
+ VecAddf(col.co1, col.co1, zvec);
+ VecSubf(col.co2, col.co2, zvec);
+ VecSubf(ray_dir, col.co2, col.co1);
+ col.t = 0.0f;
+ hit.index = -1;
+ hit.dist = col.ray_len = VecLength(ray_dir);
+
+ /* find out upmost deflector object */
+ for(ec=bbd->sim->psys->effectors.first; ec; ec=ec->next) {
+ if(ec->type & PSYS_EC_DEFLECT) {
+ Object *eob = ec->ob;
+
+ col.md = ( CollisionModifierData * ) ( modifiers_findByType ( eob, eModifierType_Collision ) );
+ col.ob_t = eob;
+
+ if(col.md && col.md->bvhtree)
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ }
+ }
+ /* then use that object */
+ if(hit.index>=0) {
+ t = hit.dist/col.ray_len;
+ VecLerpf(ground_co, col.co1, col.co2, t);
+ VECCOPY(ground_nor, col.nor);
+ Normalize(ground_nor);
+ return col.ob;
+ }
+ else {
+ /* default to z=0 */
+ VECCOPY(ground_co, pa->state.co);
+ ground_co[2] = 0;
+ ground_nor[0] = ground_nor[1] = 0.0f;
+ ground_nor[2] = 1.0f;
+ return NULL;
+ }
+ }
+}
+static int boid_rule_applies(ParticleData *pa, BoidSettings *boids, BoidRule *rule)
+{
+ BoidParticle *bpa = pa->boid;
+
+ if(rule==NULL)
+ return 0;
+
+ if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing) && rule->flag & BOIDRULE_ON_LAND)
+ return 1;
+
+ if(bpa->data.mode==eBoidMode_InAir && rule->flag & BOIDRULE_IN_AIR)
+ return 1;
+
+ return 0;
+}
+void boids_precalc_rules(ParticleSettings *part, float cfra)
+{
+ BoidState *state = part->boids->states.first;
+ BoidRule *rule;
+ for(; state; state=state->next) {
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ if(rule->type==eBoidRuleType_FollowLeader) {
+ BoidRuleFollowLeader *flbr = (BoidRuleFollowLeader*) rule;
+
+ if(flbr->ob && flbr->cfra != cfra) {
+ /* save object locations for velocity calculations */
+ VECCOPY(flbr->oloc, flbr->loc);
+ VECCOPY(flbr->loc, flbr->ob->obmat[3]);
+ flbr->cfra = cfra;
+ }
+ }
+ }
+ }
+}
+static void boid_climb(BoidSettings *boids, ParticleData *pa, float *surface_co, float *surface_nor)
+{
+ BoidParticle *bpa = pa->boid;
+ float nor[3], vel[3];
+ VECCOPY(nor, surface_nor);
+
+ /* gather apparent gravity */
+ VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0);
+ Normalize(bpa->gravity);
+
+ /* raise boid it's size from surface */
+ VecMulf(nor, pa->size * boids->height);
+ VecAddf(pa->state.co, surface_co, nor);
+
+ /* remove normal component from velocity */
+ Projf(vel, pa->state.vel, surface_nor);
+ VecSubf(pa->state.vel, pa->state.vel, vel);
+}
+static float boid_goal_signed_dist(float *boid_co, float *goal_co, float *goal_nor)
+{
+ float vec[3];
+
+ VecSubf(vec, boid_co, goal_co);
+
+ return Inpf(vec, goal_nor);
+}
+/* wanted_co is relative to boid location */
+static int apply_boid_rule(BoidBrainData *bbd, BoidRule *rule, BoidValues *val, ParticleData *pa, float fuzziness)
+{
+ if(rule==NULL)
+ return 0;
+
+ if(boid_rule_applies(pa, bbd->part->boids, rule)==0)
+ return 0;
+
+ if(boid_rules[rule->type](rule, bbd, val, pa)==0)
+ return 0;
+
+ if(fuzziness < 0.0f || VecLenCompare(bbd->wanted_co, pa->prev_state.vel, fuzziness * VecLength(pa->prev_state.vel))==0)
+ return 1;
+ else
+ return 0;
+}
+static BoidState *get_boid_state(BoidSettings *boids, ParticleData *pa) {
+ BoidState *state = boids->states.first;
+ BoidParticle *bpa = pa->boid;
+
+ for(; state; state=state->next) {
+ if(state->id==bpa->data.state_id)
+ return state;
+ }
+
+ /* for some reason particle isn't at a valid state */
+ state = boids->states.first;
+ if(state)
+ bpa->data.state_id = state->id;
+
+ return state;
+}
+//static int boid_condition_is_true(BoidCondition *cond) {
+// /* TODO */
+// return 0;
+//}
+
+/* determines the velocity the boid wants to have */
+void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa)
+{
+ BoidRule *rule;
+ BoidSettings *boids = bbd->part->boids;
+ BoidValues val;
+ BoidState *state = get_boid_state(boids, pa);
+ BoidParticle *bpa = pa->boid;
+ int rand;
+ //BoidCondition *cond;
+
+ if(bpa->data.health <= 0.0f) {
+ pa->alive = PARS_DYING;
+ return;
+ }
+
+ //planned for near future
+ //cond = state->conditions.first;
+ //for(; cond; cond=cond->next) {
+ // if(boid_condition_is_true(cond)) {
+ // pa->boid->state_id = cond->state_id;
+ // state = get_boid_state(boids, pa);
+ // break; /* only first true condition is used */
+ // }
+ //}
+
+ bbd->wanted_co[0]=bbd->wanted_co[1]=bbd->wanted_co[2]=bbd->wanted_speed=0.0f;
+
+ /* create random seed for every particle & frame */
+ BLI_srandom(bbd->sim->psys->seed + p);
+ rand = BLI_rand();
+ BLI_srandom((int)bbd->cfra + rand);
+
+ set_boid_values(&val, bbd->part->boids, pa);
+
+ /* go through rules */
+ switch(state->ruleset_type) {
+ case eBoidRulesetType_Fuzzy:
+ {
+ for(rule = state->rules.first; rule; rule = rule->next) {
+ if(apply_boid_rule(bbd, rule, &val, pa, state->rule_fuzziness))
+ break; /* only first nonzero rule that comes through fuzzy rule is applied */
+ }
+ break;
+ }
+ case eBoidRulesetType_Random:
+ {
+ /* use random rule for each particle (allways same for same particle though) */
+ rule = BLI_findlink(&state->rules, rand % BLI_countlist(&state->rules));
+
+ apply_boid_rule(bbd, rule, &val, pa, -1.0);
+ }
+ case eBoidRulesetType_Average:
+ {
+ float wanted_co[3] = {0.0f, 0.0f, 0.0f}, wanted_speed = 0.0f;
+ int n = 0;
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ if(apply_boid_rule(bbd, rule, &val, pa, -1.0f)) {
+ VecAddf(wanted_co, wanted_co, bbd->wanted_co);
+ wanted_speed += bbd->wanted_speed;
+ n++;
+ bbd->wanted_co[0]=bbd->wanted_co[1]=bbd->wanted_co[2]=bbd->wanted_speed=0.0f;
+ }
+ }
+
+ if(n > 1) {
+ VecMulf(wanted_co, 1.0f/(float)n);
+ wanted_speed /= (float)n;
+ }
+
+ VECCOPY(bbd->wanted_co, wanted_co);
+ bbd->wanted_speed = wanted_speed;
+ break;
+ }
+
+ }
+
+ /* decide on jumping & liftoff */
+ if(bpa->data.mode == eBoidMode_OnLand) {
+ /* fuzziness makes boids capable of misjudgement */
+ float mul = 1.0 + state->rule_fuzziness;
+
+ if(boids->options & BOID_ALLOW_FLIGHT && bbd->wanted_co[2] > 0.0f) {
+ float cvel[3], dir[3];
+
+ VECCOPY(dir, pa->prev_state.ave);
+ Normalize2(dir);
+
+ VECCOPY(cvel, bbd->wanted_co);
+ Normalize2(cvel);
+
+ if(Inp2f(cvel, dir) > 0.95 / mul)
+ bpa->data.mode = eBoidMode_Liftoff;
+ }
+ else if(val.jump_speed > 0.0f) {
+ float jump_v[3];
+ int jump = 0;
+
+ /* jump to get to a location */
+ if(bbd->wanted_co[2] > 0.0f) {
+ float cvel[3], dir[3];
+ float z_v, ground_v, cur_v;
+ float len;
+
+ VECCOPY(dir, pa->prev_state.ave);
+ Normalize2(dir);
+
+ VECCOPY(cvel, bbd->wanted_co);
+ Normalize2(cvel);
+
+ len = Vec2Length(pa->prev_state.vel);
+
+ /* first of all, are we going in a suitable direction? */
+ /* or at a suitably slow speed */
+ if(Inp2f(cvel, dir) > 0.95f / mul || len <= state->rule_fuzziness) {
+ /* try to reach goal at highest point of the parabolic path */
+ cur_v = Vec2Length(pa->prev_state.vel);
+ z_v = sasqrt(-2.0f * bbd->part->acc[2] * bbd->wanted_co[2]);
+ ground_v = Vec2Length(bbd->wanted_co)*sasqrt(-0.5f * bbd->part->acc[2] / bbd->wanted_co[2]);
+
+ len = sasqrt((ground_v-cur_v)*(ground_v-cur_v) + z_v*z_v);
+
+ if(len < val.jump_speed * mul || bbd->part->boids->options & BOID_ALLOW_FLIGHT) {
+ jump = 1;
+
+ len = MIN2(len, val.jump_speed);
+
+ VECCOPY(jump_v, dir);
+ jump_v[2] = z_v;
+ VecMulf(jump_v, ground_v);
+
+ Normalize(jump_v);
+ VecMulf(jump_v, len);
+ Vec2Addf(jump_v, jump_v, pa->prev_state.vel);
+ }
+ }
+ }
+
+ /* jump to go faster */
+ if(jump == 0 && val.jump_speed > val.max_speed && bbd->wanted_speed > val.max_speed) {
+
+ }
+
+ if(jump) {
+ VECCOPY(pa->prev_state.vel, jump_v);
+ bpa->data.mode = eBoidMode_Falling;
+ }
+ }
+ }
+}
+/* tries to realize the wanted velocity taking all constraints into account */
+void boid_body(BoidBrainData *bbd, ParticleData *pa)
+{
+ BoidSettings *boids = bbd->part->boids;
+ BoidParticle *bpa = pa->boid;
+ BoidValues val;
+ float acc[3] = {0.0f, 0.0f, 0.0f}, tan_acc[3], nor_acc[3];
+ float dvec[3], bvec[3];
+ float new_dir[3], new_speed;
+ float old_dir[3], old_speed;
+ float wanted_dir[3];
+ float q[4], mat[3][3]; /* rotation */
+ float ground_co[3] = {0.0f, 0.0f, 0.0f}, ground_nor[3] = {0.0f, 0.0f, 1.0f};
+ float force[3] = {0.0f, 0.0f, 0.0f}, tvel[3] = {0.0f, 0.0f, 1.0f};
+ float pa_mass=bbd->part->mass, dtime=bbd->dfra*bbd->timestep;
+ int p = pa - bbd->sim->psys->particles;
+
+ set_boid_values(&val, boids, pa);
+
+ /* make sure there's something in new velocity, location & rotation */
+ copy_particle_key(&pa->state,&pa->prev_state,0);
+
+ if(bbd->part->flag & PART_SIZEMASS)
+ pa_mass*=pa->size;
+
+ /* if boids can't fly they fall to the ground */
+ if((boids->options & BOID_ALLOW_FLIGHT)==0 && ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)==0 && bbd->part->acc[2] != 0.0f)
+ bpa->data.mode = eBoidMode_Falling;
+
+ if(bpa->data.mode == eBoidMode_Falling) {
+ /* Falling boids are only effected by gravity. */
+ acc[2] = bbd->part->acc[2];
+ }
+ else {
+ /* figure out acceleration */
+ float landing_level = 2.0f;
+ float level = landing_level + 1.0f;
+ float new_vel[3];
+
+ if(bpa->data.mode == eBoidMode_Liftoff) {
+ bpa->data.mode = eBoidMode_InAir;
+ bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
+ }
+ else if(bpa->data.mode == eBoidMode_InAir && boids->options & BOID_ALLOW_LAND) {
+ /* auto-leveling & landing if close to ground */
+
+ bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
+
+ /* level = how many particle sizes above ground */
+ level = (pa->prev_state.co[2] - ground_co[2])/(2.0f * pa->size) - 0.5;
+
+ landing_level = - boids->landing_smoothness * pa->prev_state.vel[2] * pa_mass;
+
+ if(pa->prev_state.vel[2] < 0.0f) {
+ if(level < 1.0f) {
+ bbd->wanted_co[0] = bbd->wanted_co[1] = bbd->wanted_co[2] = 0.0f;
+ bbd->wanted_speed = 0.0f;
+ bpa->data.mode = eBoidMode_Falling;
+ }
+ else if(level < landing_level) {
+ bbd->wanted_speed *= (level - 1.0f)/landing_level;
+ bbd->wanted_co[2] *= (level - 1.0f)/landing_level;
+ }
+ }
+ }
+
+ VECCOPY(old_dir, pa->prev_state.ave);
+ VECCOPY(wanted_dir, bbd->wanted_co);
+ new_speed = Normalize(wanted_dir);
+
+ /* first check if we have valid direction we want to go towards */
+ if(new_speed == 0.0f) {
+ VECCOPY(new_dir, old_dir);
+ }
+ else {
+ float old_dir2[2], wanted_dir2[2], nor[3], angle;
+ Vec2Copyf(old_dir2, old_dir);
+ Normalize2(old_dir2);
+ Vec2Copyf(wanted_dir2, wanted_dir);
+ Normalize2(wanted_dir2);
+
+ /* choose random direction to turn if wanted velocity */
+ /* is directly behind regardless of z-coordinate */
+ if(Inp2f(old_dir2, wanted_dir2) < -0.99f) {
+ wanted_dir[0] = 2.0f*(0.5f - BLI_frand());
+ wanted_dir[1] = 2.0f*(0.5f - BLI_frand());
+ wanted_dir[2] = 2.0f*(0.5f - BLI_frand());
+ Normalize(wanted_dir);
+ }
+
+ /* constrain direction with maximum angular velocity */
+ angle = saacos(Inpf(old_dir, wanted_dir));
+ angle = MIN2(angle, val.max_ave);
+
+ Crossf(nor, old_dir, wanted_dir);
+ VecRotToQuat(nor, angle, q);
+ VECCOPY(new_dir, old_dir);
+ QuatMulVecf(q, new_dir);
+ Normalize(new_dir);
+
+ /* save direction in case resulting velocity too small */
+ VecRotToQuat(nor, angle*dtime, q);
+ VECCOPY(pa->state.ave, old_dir);
+ QuatMulVecf(q, pa->state.ave);
+ Normalize(pa->state.ave);
+ }
+
+ /* constrain speed with maximum acceleration */
+ old_speed = VecLength(pa->prev_state.vel);
+
+ if(bbd->wanted_speed < old_speed)
+ new_speed = MAX2(bbd->wanted_speed, old_speed - val.max_acc);
+ else
+ new_speed = MIN2(bbd->wanted_speed, old_speed + val.max_acc);
+
+ /* combine direction and speed */
+ VECCOPY(new_vel, new_dir);
+ VecMulf(new_vel, new_speed);
+
+ /* maintain minimum flying velocity if not landing */
+ if(level >= landing_level) {
+ float len2 = Inp2f(new_vel,new_vel);
+ float root;
+
+ len2 = MAX2(len2, val.min_speed*val.min_speed);
+ root = sasqrt(new_speed*new_speed - len2);
+
+ new_vel[2] = new_vel[2] < 0.0f ? -root : root;
+
+ Normalize2(new_vel);
+ Vec2Mulf(new_vel, sasqrt(len2));
+ }
+
+ /* finally constrain speed to max speed */
+ new_speed = Normalize(new_vel);
+ VecMulf(new_vel, MIN2(new_speed, val.max_speed));
+
+ /* get acceleration from difference of velocities */
+ VecSubf(acc, new_vel, pa->prev_state.vel);
+
+ /* break acceleration to components */
+ Projf(tan_acc, acc, pa->prev_state.ave);
+ VecSubf(nor_acc, acc, tan_acc);
+ }
+
+ /* account for effectors */
+ do_effectors(bbd->sim, p, pa, &pa->state, pa->state.co, force, tvel, bbd->dfra, bbd->cfra);
+
+ if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)) {
+ float length = Normalize(force);
+
+ length = MAX2(0.0f, length - boids->land_stick_force);
+
+ VecMulf(force, length);
+ }
+
+ VecAddf(acc, acc, force);
+
+ /* store smoothed acceleration for nice banking etc. */
+ VECADDFAC(bpa->data.acc, bpa->data.acc, acc, dtime);
+ VecMulf(bpa->data.acc, 1.0f / (1.0f + dtime));
+
+ /* integrate new location & velocity */
+
+ /* by regarding the acceleration as a force at this stage we*/
+ /* can get better control allthough it's a bit unphysical */
+ VecMulf(acc, 1.0f/pa_mass);
+
+ VECCOPY(dvec, acc);
+ VecMulf(dvec, dtime*dtime*0.5f);
+
+ VECCOPY(bvec, pa->prev_state.vel);
+ VecMulf(bvec, dtime);
+ VecAddf(dvec, dvec, bvec);
+ VecAddf(pa->state.co, pa->state.co, dvec);
+
+ VECADDFAC(pa->state.vel, pa->state.vel, acc, dtime);
+
+ if(bpa->data.mode != eBoidMode_InAir)
+ bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
+
+ /* change modes, constrain movement & keep track of down vector */
+ switch(bpa->data.mode) {
+ case eBoidMode_InAir:
+ {
+ float grav[3] = {0.0f, 0.0f, bbd->part->acc[2] < 0.0f ? -1.0f : 0.0f};
+
+ /* don't take forward acceleration into account (better banking) */
+ if(Inpf(bpa->data.acc, pa->state.vel) > 0.0f) {
+ Projf(dvec, bpa->data.acc, pa->state.vel);
+ VecSubf(dvec, bpa->data.acc, dvec);
+ }
+ else {
+ VECCOPY(dvec, bpa->data.acc);
+ }
+
+ /* gather apparent gravity */
+ VECADDFAC(bpa->gravity, grav, dvec, -boids->banking);
+ Normalize(bpa->gravity);
+
+ /* stick boid on goal when close enough */
+ if(bbd->goal_ob && boid_goal_signed_dist(pa->state.co, bbd->goal_co, bbd->goal_nor) <= pa->size * boids->height) {
+ bpa->data.mode = eBoidMode_Climbing;
+ bpa->ground = bbd->goal_ob;
+ boid_find_ground(bbd, pa, ground_co, ground_nor);
+ boid_climb(boids, pa, ground_co, ground_nor);
+ }
+ /* land boid when belowg ground */
+ else if(boids->options & BOID_ALLOW_LAND && pa->state.co[2] <= ground_co[2] + pa->size * boids->height) {
+ pa->state.co[2] = ground_co[2] + pa->size * boids->height;
+ pa->state.vel[2] = 0.0f;
+ bpa->data.mode = eBoidMode_OnLand;
+ }
+ break;
+ }
+ case eBoidMode_Falling:
+ {
+ float grav[3] = {0.0f, 0.0f, bbd->part->acc[2] < 0.0f ? -1.0f : 0.0f};
+
+ /* gather apparent gravity */
+ VECADDFAC(bpa->gravity, bpa->gravity, grav, dtime);
+ Normalize(bpa->gravity);
+
+ if(boids->options & BOID_ALLOW_LAND) {
+ /* stick boid on goal when close enough */
+ if(bbd->goal_ob && boid_goal_signed_dist(pa->state.co, bbd->goal_co, bbd->goal_nor) <= pa->size * boids->height) {
+ bpa->data.mode = eBoidMode_Climbing;
+ bpa->ground = bbd->goal_ob;
+ boid_find_ground(bbd, pa, ground_co, ground_nor);
+ boid_climb(boids, pa, ground_co, ground_nor);
+ }
+ /* land boid when really near ground */
+ else if(pa->state.co[2] <= ground_co[2] + 1.01 * pa->size * boids->height){
+ pa->state.co[2] = ground_co[2] + pa->size * boids->height;
+ pa->state.vel[2] = 0.0f;
+ bpa->data.mode = eBoidMode_OnLand;
+ }
+ /* if we're falling, can fly and want to go upwards lets fly */
+ else if(boids->options & BOID_ALLOW_FLIGHT && bbd->wanted_co[2] > 0.0f)
+ bpa->data.mode = eBoidMode_InAir;
+ }
+ else
+ bpa->data.mode = eBoidMode_InAir;
+ break;
+ }
+ case eBoidMode_Climbing:
+ {
+ boid_climb(boids, pa, ground_co, ground_nor);
+ //float nor[3];
+ //VECCOPY(nor, ground_nor);
+
+ ///* gather apparent gravity to r_ve */
+ //VECADDFAC(pa->r_ve, pa->r_ve, ground_nor, -1.0);
+ //Normalize(pa->r_ve);
+
+ ///* raise boid it's size from surface */
+ //VecMulf(nor, pa->size * boids->height);
+ //VecAddf(pa->state.co, ground_co, nor);
+
+ ///* remove normal component from velocity */
+ //Projf(v, pa->state.vel, ground_nor);
+ //VecSubf(pa->state.vel, pa->state.vel, v);
+ break;
+ }
+ case eBoidMode_OnLand:
+ {
+ /* stick boid on goal when close enough */
+ if(bbd->goal_ob && boid_goal_signed_dist(pa->state.co, bbd->goal_co, bbd->goal_nor) <= pa->size * boids->height) {
+ bpa->data.mode = eBoidMode_Climbing;
+ bpa->ground = bbd->goal_ob;
+ boid_find_ground(bbd, pa, ground_co, ground_nor);
+ boid_climb(boids, pa, ground_co, ground_nor);
+ }
+ /* ground is too far away so boid falls */
+ else if(pa->state.co[2]-ground_co[2] > 1.1 * pa->size * boids->height)
+ bpa->data.mode = eBoidMode_Falling;
+ else {
+ /* constrain to surface */
+ pa->state.co[2] = ground_co[2] + pa->size * boids->height;
+ pa->state.vel[2] = 0.0f;
+ }
+
+ if(boids->banking > 0.0f) {
+ float grav[3];
+ /* Don't take gravity's strength in to account, */
+ /* otherwise amount of banking is hard to control. */
+ VECCOPY(grav, ground_nor);
+ VecMulf(grav, -1.0f);
+
+ Projf(dvec, bpa->data.acc, pa->state.vel);
+ VecSubf(dvec, bpa->data.acc, dvec);
+
+ /* gather apparent gravity */
+ VECADDFAC(bpa->gravity, grav, dvec, -boids->banking);
+ Normalize(bpa->gravity);
+ }
+ else {
+ /* gather negative surface normal */
+ VECADDFAC(bpa->gravity, bpa->gravity, ground_nor, -1.0f);
+ Normalize(bpa->gravity);
+ }
+ break;
+ }
+ }
+
+ /* save direction to state.ave unless the boid is falling */
+ /* (boids can't effect their direction when falling) */
+ if(bpa->data.mode!=eBoidMode_Falling && VecLength(pa->state.vel) > 0.1*pa->size) {
+ VECCOPY(pa->state.ave, pa->state.vel);
+ Normalize(pa->state.ave);
+ }
+
+ /* apply damping */
+ if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing))
+ VecMulf(pa->state.vel, 1.0f - 0.2f*bbd->part->dampfac);
+
+ /* calculate rotation matrix based on forward & down vectors */
+ if(bpa->data.mode == eBoidMode_InAir) {
+ VECCOPY(mat[0], pa->state.ave);
+
+ Projf(dvec, bpa->gravity, pa->state.ave);
+ VecSubf(mat[2], bpa->gravity, dvec);
+ Normalize(mat[2]);
+ }
+ else {
+ Projf(dvec, pa->state.ave, bpa->gravity);
+ VecSubf(mat[0], pa->state.ave, dvec);
+ Normalize(mat[0]);
+
+ VECCOPY(mat[2], bpa->gravity);
+ }
+ VecMulf(mat[2], -1.0f);
+ Crossf(mat[1], mat[2], mat[0]);
+
+ /* apply rotation */
+ Mat3ToQuat_is_ok(mat, q);
+ QuatCopy(pa->state.rot, q);
+}
+
+BoidRule *boid_new_rule(int type)
+{
+ BoidRule *rule = NULL;
+ if(type <= 0)
+ return NULL;
+
+ switch(type) {
+ case eBoidRuleType_Goal:
+ case eBoidRuleType_Avoid:
+ rule = MEM_callocN(sizeof(BoidRuleGoalAvoid), "BoidRuleGoalAvoid");
+ break;
+ case eBoidRuleType_AvoidCollision:
+ rule = MEM_callocN(sizeof(BoidRuleAvoidCollision), "BoidRuleAvoidCollision");
+ ((BoidRuleAvoidCollision*)rule)->look_ahead = 2.0f;
+ break;
+ case eBoidRuleType_FollowLeader:
+ rule = MEM_callocN(sizeof(BoidRuleFollowLeader), "BoidRuleFollowLeader");
+ ((BoidRuleFollowLeader*)rule)->distance = 1.0f;
+ break;
+ case eBoidRuleType_AverageSpeed:
+ rule = MEM_callocN(sizeof(BoidRuleAverageSpeed), "BoidRuleAverageSpeed");
+ ((BoidRuleAverageSpeed*)rule)->speed = 0.5f;
+ break;
+ case eBoidRuleType_Fight:
+ rule = MEM_callocN(sizeof(BoidRuleFight), "BoidRuleFight");
+ ((BoidRuleFight*)rule)->distance = 100.0f;
+ ((BoidRuleFight*)rule)->flee_distance = 100.0f;
+ break;
+ default:
+ rule = MEM_callocN(sizeof(BoidRule), "BoidRule");
+ break;
+ }
+
+ rule->type = type;
+ rule->flag |= BOIDRULE_IN_AIR|BOIDRULE_ON_LAND;
+ strcpy(rule->name, boidrule_type_items[type-1].name);
+
+ return rule;
+}
+void boid_default_settings(BoidSettings *boids)
+{
+ boids->air_max_speed = 10.0f;
+ boids->air_max_acc = 0.5f;
+ boids->air_max_ave = 0.5f;
+ boids->air_personal_space = 1.0f;
+
+ boids->land_max_speed = 5.0f;
+ boids->land_max_acc = 0.5f;
+ boids->land_max_ave = 0.5f;
+ boids->land_personal_space = 1.0f;
+
+ boids->options = BOID_ALLOW_FLIGHT;
+
+ boids->landing_smoothness = 3.0f;
+ boids->banking = 1.0f;
+ boids->height = 1.0f;
+
+ boids->health = 1.0f;
+ boids->accuracy = 1.0f;
+ boids->aggression = 2.0f;
+ boids->range = 1.0f;
+ boids->strength = 0.1f;
+}
+
+BoidState *boid_new_state(BoidSettings *boids)
+{
+ BoidState *state = MEM_callocN(sizeof(BoidState), "BoidState");
+
+ state->id = boids->last_state_id++;
+ if(state->id)
+ sprintf(state->name, "State %i", state->id);
+ else
+ strcpy(state->name, "State");
+
+ state->rule_fuzziness = 0.5;
+ state->volume = 1.0f;
+ state->channels |= ~0;
+
+ return state;
+}
+
+BoidState *boid_duplicate_state(BoidSettings *boids, BoidState *state) {
+ BoidState *staten = MEM_dupallocN(state);
+
+ BLI_duplicatelist(&staten->rules, &state->rules);
+ BLI_duplicatelist(&staten->conditions, &state->conditions);
+ BLI_duplicatelist(&staten->actions, &state->actions);
+
+ staten->id = boids->last_state_id++;
+
+ return staten;
+}
+void boid_free_settings(BoidSettings *boids)
+{
+ if(boids) {
+ BoidState *state = boids->states.first;
+
+ for(; state; state=state->next) {
+ BLI_freelistN(&state->rules);
+ BLI_freelistN(&state->conditions);
+ BLI_freelistN(&state->actions);
+ }
+
+ BLI_freelistN(&boids->states);
+
+ MEM_freeN(boids);
+ }
+}
+BoidSettings *boid_copy_settings(BoidSettings *boids)
+{
+ BoidSettings *nboids = NULL;
+
+ if(boids) {
+ BoidState *state;
+ BoidState *nstate;
+
+ nboids = MEM_dupallocN(boids);
+
+ BLI_duplicatelist(&nboids->states, &boids->states);
+
+ state = boids->states.first;
+ nstate = nboids->states.first;
+ for(; state; state=state->next, nstate=nstate->next) {
+ BLI_duplicatelist(&nstate->rules, &state->rules);
+ BLI_duplicatelist(&nstate->conditions, &state->conditions);
+ BLI_duplicatelist(&nstate->actions, &state->actions);
+ }
+ }
+
+ return nboids;
+}
+BoidState *boid_get_current_state(BoidSettings *boids)
+{
+ BoidState *state = boids->states.first;
+
+ for(; state; state=state->next) {
+ if(state->flag & BOIDSTATE_CURRENT)
+ break;
+ }
+
+ return state;
+}
+
diff --git a/source/blender/blenkernel/intern/booleanops.c b/source/blender/blenkernel/intern/booleanops.c
index eb3aefe7ee6..5f0697f06ce 100644
--- a/source/blender/blenkernel/intern/booleanops.c
+++ b/source/blender/blenkernel/intern/booleanops.c
@@ -589,7 +589,7 @@ int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type)
MEM_freeN(mat);
/* update dag */
- DAG_object_flush_update(scene, ob_new, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob_new->id, OB_RECALC_DATA);
return 1;
}
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 30a35cbe91c..115d31b587c 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -35,6 +35,7 @@
#include "DNA_brush_types.h"
#include "DNA_color_types.h"
#include "DNA_image_types.h"
+#include "DNA_object_types.h"
#include "DNA_texture_types.h"
#include "DNA_scene_types.h"
#include "DNA_windowmanager_types.h"
@@ -43,6 +44,7 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_rand.h"
#include "BKE_brush.h"
#include "BKE_colortools.h"
@@ -50,6 +52,7 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_paint.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -61,7 +64,7 @@
/* Datablock add/copy/free/make_local */
-Brush *add_brush(char *name)
+Brush *add_brush(const char *name)
{
Brush *brush;
@@ -73,8 +76,10 @@ Brush *add_brush(char *name)
brush->alpha= 0.2f;
brush->size= 25;
brush->spacing= 10.0f;
+ brush->smooth_stroke_radius= 75;
+ brush->smooth_stroke_factor= 0.9;
brush->rate= 0.1f;
- brush->innerradius= 0.5f;
+ brush->jitter= 0.0f;
brush->clone.alpha= 0.5;
brush->sculpt_tool = SCULPT_TOOL_DRAW;
@@ -152,7 +157,7 @@ void make_local_brush(Brush *brush)
}
for(scene= G.main->scene.first; scene; scene=scene->id.next)
- if(scene->toolsettings->imapaint.brush==brush) {
+ if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
if(scene->id.lib) lib= 1;
else local= 1;
}
@@ -174,9 +179,9 @@ void make_local_brush(Brush *brush)
brushn->id.flag |= LIB_FAKEUSER;
for(scene= G.main->scene.first; scene; scene=scene->id.next)
- if(scene->toolsettings->imapaint.brush==brush)
+ if(paint_brush(&scene->toolsettings->imapaint.paint)==brush)
if(scene->id.lib==0) {
- scene->toolsettings->imapaint.brush= brushn;
+ paint_brush_set(&scene->toolsettings->imapaint.paint, brushn);
brushn->id.us++;
brush->id.us--;
}
@@ -185,20 +190,7 @@ void make_local_brush(Brush *brush)
/* Library Operations */
-Brush **current_brush_source(Scene *sce)
-{
- if(G.f & G_SCULPTMODE)
- return &sce->toolsettings->sculpt->brush;
- else if(G.f & G_VERTEXPAINT)
- return &sce->toolsettings->vpaint->brush;
- else if(G.f & G_WEIGHTPAINT)
- return &sce->toolsettings->wpaint->brush;
- else if(G.f & G_TEXTUREPAINT)
- return &sce->toolsettings->imapaint.brush;
- return NULL;
-}
-
-int brush_set_nr(Brush **current_brush, int nr)
+int brush_set_nr(Brush **current_brush, int nr, const char *name)
{
ID *idtest, *id;
@@ -207,7 +199,7 @@ int brush_set_nr(Brush **current_brush, int nr)
if(idtest==0) { /* new brush */
if(id) idtest= (ID *)copy_brush((Brush *)id);
- else idtest= (ID *)add_brush("Brush");
+ else idtest= (ID *)add_brush(name);
idtest->us--;
}
if(idtest!=id) {
@@ -300,6 +292,13 @@ void brush_curve_preset(Brush *b, BrushCurvePreset preset)
curvemapping_changed(b->curve, 0);
}
+static MTex *brush_active_texture(Brush *brush)
+{
+ if(brush && brush->texact >= 0)
+ return brush->mtex[brush->texact];
+ return NULL;
+}
+
int brush_texture_set_nr(Brush *brush, int nr)
{
ID *idtest, *id=NULL;
@@ -374,60 +373,13 @@ int brush_clone_image_delete(Brush *brush)
return 0;
}
-void brush_check_exists(Brush **brush)
+void brush_check_exists(Brush **brush, const char *name)
{
if(*brush==NULL)
- brush_set_nr(brush, 1);
+ brush_set_nr(brush, 1, name);
}
/* Brush Sampling */
-
-/*static float taylor_approx_cos(float f)
-{
- f = f*f;
- f = 1.0f - f/2.0f + f*f/24.0f;
- return f;
-}*/
-
-float brush_sample_falloff(Brush *brush, float dist)
-{
- float a, outer, inner;
-
- outer = brush->size >> 1;
- inner = outer*brush->innerradius;
-
- if (dist <= inner) {
- return brush->alpha;
- }
- else if ((dist < outer) && (inner < outer)) {
- a = sqrt((dist - inner)/(outer - inner));
- return (1 - a)*brush->alpha;
-
- /* formula used by sculpt, with taylor approx
- a = 0.5f*(taylor_approx_cos(3.0f*(dist - inner)/(outer - inner)) + 1.0f);
- return a*brush->alpha; */
- }
- else
- return 0.0f;
-}
-
-float brush_sample_falloff_noalpha(Brush *brush, float dist)
-{
- float outer, inner;
-
- outer = brush->size >> 1;
- inner = outer*brush->innerradius;
-
- if (dist <= inner) {
- return 1.0f;
- }
- else if ((dist < outer) && (inner < outer)) {
- return 1.0f - sqrt((dist - inner)/(outer - inner));
- }
- else
- return 0.0f;
-}
-
void brush_sample_tex(Brush *brush, float *xy, float *rgba)
{
MTex *mtex= brush->mtex[brush->texact];
@@ -465,6 +417,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
ImBuf *ibuf;
float xy[2], dist, rgba[4], *dstf;
int x, y, rowbytes, xoff, yoff, imbflag;
+ int maxsize = brush->size >> 1;
char *dst, crgb[3];
imbflag= (flt)? IB_rectfloat: IB_rect;
@@ -489,7 +442,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
VECCOPY(dstf, brush->rgb);
- dstf[3]= brush_sample_falloff(brush, dist);
+ dstf[3]= brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize);
}
else if (texfall == 1) {
brush_sample_tex(brush, xy, dstf);
@@ -502,7 +455,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dstf[0] = rgba[0]*brush->rgb[0];
dstf[1] = rgba[1]*brush->rgb[1];
dstf[2] = rgba[2]*brush->rgb[2];
- dstf[3] = rgba[3]*brush_sample_falloff(brush, dist);
+ dstf[3] = rgba[3]*brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize);
}
}
}
@@ -525,7 +478,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dst[0]= crgb[0];
dst[1]= crgb[1];
dst[2]= crgb[2];
- dst[3]= FTOCHAR(brush_sample_falloff(brush, dist));
+ dst[3]= FTOCHAR(brush->alpha*brush_curve_strength(brush, dist, maxsize));
}
else if (texfall == 1) {
brush_sample_tex(brush, xy, rgba);
@@ -541,7 +494,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int size, ImBuf **o
dst[0] = FTOCHAR(rgba[0]*brush->rgb[0]);
dst[1] = FTOCHAR(rgba[1]*brush->rgb[1]);
dst[2] = FTOCHAR(rgba[2]*brush->rgb[2]);
- dst[3] = FTOCHAR(rgba[3]*brush_sample_falloff(brush, dist));
+ dst[3] = FTOCHAR(rgba[3]*brush->alpha*brush_curve_strength_clamp(brush, dist, maxsize));
}
}
}
@@ -561,7 +514,7 @@ typedef struct BrushPainterCache {
int lastsize;
float lastalpha;
- float lastinnerradius;
+ float lastjitter;
ImBuf *ibuf;
ImBuf *texibuf;
@@ -586,7 +539,7 @@ struct BrushPainter {
float startsize;
float startalpha;
- float startinnerradius;
+ float startjitter;
float startspacing;
BrushPainterCache cache;
@@ -602,7 +555,7 @@ BrushPainter *brush_painter_new(Brush *brush)
painter->startsize = brush->size;
painter->startalpha = brush->alpha;
- painter->startinnerradius = brush->innerradius;
+ painter->startjitter = brush->jitter;
painter->startspacing = brush->spacing;
return painter;
@@ -636,7 +589,7 @@ void brush_painter_free(BrushPainter *painter)
brush->size = painter->startsize;
brush->alpha = painter->startalpha;
- brush->innerradius = painter->startinnerradius;
+ brush->jitter = painter->startjitter;
brush->spacing = painter->startspacing;
if (painter->cache.ibuf) IMB_freeImBuf(painter->cache.ibuf);
@@ -730,7 +683,7 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
}
}
-void brush_painter_fixed_tex_partial_update(BrushPainter *painter, float *pos)
+static void brush_painter_fixed_tex_partial_update(BrushPainter *painter, float *pos)
{
Brush *brush= painter->brush;
BrushPainterCache *cache= &painter->cache;
@@ -792,7 +745,7 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
short flt;
if ((brush->size != cache->lastsize) || (brush->alpha != cache->lastalpha)
- || (brush->innerradius != cache->lastinnerradius)) {
+ || (brush->jitter != cache->lastjitter)) {
if (cache->ibuf) {
IMB_freeImBuf(cache->ibuf);
cache->ibuf= NULL;
@@ -817,7 +770,7 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
cache->lastsize= brush->size;
cache->lastalpha= brush->alpha;
- cache->lastinnerradius= brush->innerradius;
+ cache->lastjitter= brush->jitter;
}
else if ((brush->flag & BRUSH_FIXED_TEX) && mtex && mtex->tex) {
int dx = (int)painter->lastpaintpos[0] - (int)pos[0];
@@ -839,20 +792,34 @@ static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pres
brush->alpha = MAX2(0.0, painter->startalpha*pressure);
if (brush->flag & BRUSH_SIZE_PRESSURE)
brush->size = MAX2(1.0, painter->startsize*pressure);
- if (brush->flag & BRUSH_RAD_PRESSURE)
- brush->innerradius = MAX2(0.0, painter->startinnerradius*pressure);
+ if (brush->flag & BRUSH_JITTER_PRESSURE)
+ brush->jitter = MAX2(0.0, painter->startjitter*pressure);
if (brush->flag & BRUSH_SPACING_PRESSURE)
brush->spacing = MAX2(1.0, painter->startspacing*(1.5f-pressure));
}
+static void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
+{
+ if(brush->jitter){
+ jitterpos[0] = pos[0] + ((BLI_frand()-0.5f) * brush->size * brush->jitter * 2);
+ jitterpos[1] = pos[1] + ((BLI_frand()-0.5f) * brush->size * brush->jitter * 2);
+ }
+ else {
+ VECCOPY2D(jitterpos, pos);
+ }
+}
+
int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, double time, float pressure, void *user)
{
Brush *brush= painter->brush;
int totpaintops= 0;
- if (pressure == 0.0f)
- pressure = 1.0f; /* zero pressure == not using tablet */
-
+ if (pressure == 0.0f) {
+ if(painter->lastpressure) // XXX - hack, operator misses
+ pressure= painter->lastpressure;
+ else
+ pressure = 1.0f; /* zero pressure == not using tablet */
+ }
if (painter->firsttouch) {
/* paint exactly once on first touch */
painter->startpaintpos[0]= pos[0];
@@ -903,7 +870,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
}
#endif
else {
- float startdistance, spacing, step, paintpos[2], dmousepos[2];
+ float startdistance, spacing, step, paintpos[2], dmousepos[2], finalpos[2];
float t, len, press;
/* compute brush spacing adapted to brush size, spacing may depend
@@ -928,11 +895,13 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
brush_apply_pressure(painter, brush, press);
spacing= MAX2(1.0f, brush->size)*brush->spacing*0.01f;
+ brush_jitter_pos(brush, paintpos, finalpos);
+
if (painter->cache.enabled)
- brush_painter_refresh_cache(painter, paintpos);
+ brush_painter_refresh_cache(painter, finalpos);
totpaintops +=
- func(user, painter->cache.ibuf, painter->lastpaintpos, paintpos);
+ func(user, painter->cache.ibuf, painter->lastpaintpos, finalpos);
painter->lastpaintpos[0]= paintpos[0];
painter->lastpaintpos[1]= paintpos[1];
@@ -955,10 +924,14 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
while (painter->accumtime >= brush->rate) {
brush_apply_pressure(painter, brush, pressure);
+
+ brush_jitter_pos(brush, pos, finalpos);
+
if (painter->cache.enabled)
- brush_painter_refresh_cache(painter, paintpos);
+ brush_painter_refresh_cache(painter, finalpos);
+
totpaintops +=
- func(user, painter->cache.ibuf, painter->lastmousepos, pos);
+ func(user, painter->cache.ibuf, painter->lastmousepos, finalpos);
painter->accumtime -= brush->rate;
}
@@ -972,17 +945,30 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
brush->alpha = painter->startalpha;
brush->size = painter->startsize;
- brush->innerradius = painter->startinnerradius;
+ brush->jitter = painter->startjitter;
brush->spacing = painter->startspacing;
return totpaintops;
}
/* Uses the brush curve control to find a strength value between 0 and 1 */
+float brush_curve_strength_clamp(Brush *br, float p, const float len)
+{
+ if(p >= len) p= 1.0f;
+ else p= p/len;
+
+ p= curvemapping_evaluateF(br->curve, 0, p);
+ if(p < 0.0) p= 0.0f;
+ else if(p > 1.0f) p= 1.0f;
+ return p;
+}
+/* same as above but can return negative values if the curve enables
+ * used for sculpt only */
float brush_curve_strength(Brush *br, float p, const float len)
{
- if(p > len) p= len;
- return curvemapping_evaluateF(br->curve, 0, p/len);
+ if(p >= len) p= 1.0f;
+ else p= p/len;
+ return curvemapping_evaluateF(br->curve, 0, p);
}
/* TODO: should probably be unified with BrushPainter stuff? */
@@ -1049,7 +1035,7 @@ static struct ImBuf *brush_gen_radial_control_imbuf(Brush *br)
for(i=0; i<side; ++i) {
for(j=0; j<side; ++j) {
float magn= sqrt(pow(i - half, 2) + pow(j - half, 2));
- im->rect_float[i*side + j]= brush_curve_strength(br, magn, half);
+ im->rect_float[i*side + j]= brush_curve_strength_clamp(br, magn, half);
}
}
@@ -1077,8 +1063,11 @@ void brush_radial_control_invoke(wmOperator *op, Brush *br, float size_weight)
original_value = br->size * size_weight;
else if(mode == WM_RADIALCONTROL_STRENGTH)
original_value = br->alpha;
- else if(mode == WM_RADIALCONTROL_ANGLE)
- original_value = br->rot;
+ else if(mode == WM_RADIALCONTROL_ANGLE) {
+ MTex *mtex = brush_active_texture(br);
+ if(mtex)
+ original_value = mtex->rot;
+ }
RNA_float_set(op->ptr, "initial_value", original_value);
op->customdata = brush_gen_radial_control_imbuf(br);
@@ -1094,8 +1083,11 @@ int brush_radial_control_exec(wmOperator *op, Brush *br, float size_weight)
br->size = new_value * size_weight;
else if(mode == WM_RADIALCONTROL_STRENGTH)
br->alpha = new_value;
- else if(mode == WM_RADIALCONTROL_ANGLE)
- br->rot = new_value * conv;
+ else if(mode == WM_RADIALCONTROL_ANGLE) {
+ MTex *mtex = brush_active_texture(br);
+ if(mtex)
+ mtex->rot = new_value * conv;
+ }
return OPERATOR_FINISHED;
}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 57ef920f75b..b20da0962a7 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1220,7 +1220,7 @@ void CDDM_calc_edges(DerivedMesh *dm)
BLI_edgehashIterator_free(ehi);
/* free old CustomData and assign new one */
- CustomData_free(&dm->edgeData, dm->numVertData);
+ CustomData_free(&dm->edgeData, dm->numEdgeData);
dm->edgeData = edgeData;
dm->numEdgeData = numEdges;
@@ -1288,6 +1288,7 @@ typedef struct MultiresDM {
CDDerivedMesh cddm;
MultiresModifierData *mmd;
+ int local_mmd;
int lvl, totlvl;
float (*orco)[3];
@@ -1297,7 +1298,7 @@ typedef struct MultiresDM {
IndexNode *vert_face_map_mem, *vert_edge_map_mem;
int *face_offsets;
- Mesh *me;
+ Object *ob;
int modified;
void (*update)(DerivedMesh*);
@@ -1309,14 +1310,19 @@ static void MultiresDM_release(DerivedMesh *dm)
int mvert_layer;
/* Before freeing, need to update the displacement map */
- if(dm->needsFree && mrdm->modified)
- mrdm->update(dm);
+ if(dm->needsFree && mrdm->modified) {
+ /* Check that mmd still exists */
+ if(!mrdm->local_mmd && BLI_findindex(&mrdm->ob->modifiers, mrdm->mmd) < 0)
+ mrdm->mmd = NULL;
+ if(mrdm->mmd)
+ mrdm->update(dm);
+ }
/* If the MVert data is being used as the sculpt undo store, don't free it */
mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
if(mvert_layer != -1) {
CustomDataLayer *cd = &dm->vertData.layers[mvert_layer];
- if(cd->data == mrdm->mmd->undo_verts)
+ if(mrdm->mmd && cd->data == mrdm->mmd->undo_verts)
cd->flag |= CD_FLAG_NOFREE;
}
@@ -1348,7 +1354,8 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts
dm = &mrdm->cddm.dm;
mrdm->mmd = ms->mmd;
- mrdm->me = ms->me;
+ mrdm->ob = ms->ob;
+ mrdm->local_mmd = ms->local_mmd;
if(dm) {
MDisps *disps;
@@ -1391,7 +1398,12 @@ DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts
Mesh *MultiresDM_get_mesh(DerivedMesh *dm)
{
- return ((MultiresDM*)dm)->me;
+ return get_mesh(((MultiresDM*)dm)->ob);
+}
+
+Object *MultiresDM_get_object(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->ob;
}
void *MultiresDM_get_orco(DerivedMesh *dm)
@@ -1428,10 +1440,11 @@ void MultiresDM_set_update(DerivedMesh *dm, void (*update)(DerivedMesh*))
ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
{
MultiresDM *mrdm = (MultiresDM*)dm;
+ Mesh *me = mrdm->ob->data;
if(!mrdm->vert_face_map)
- create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, mrdm->me->mface,
- mrdm->me->totvert, mrdm->me->totface);
+ create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, me->mface,
+ me->totvert, me->totface);
return mrdm->vert_face_map;
}
@@ -1439,10 +1452,11 @@ ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
ListBase *MultiresDM_get_vert_edge_map(DerivedMesh *dm)
{
MultiresDM *mrdm = (MultiresDM*)dm;
+ Mesh *me = mrdm->ob->data;
if(!mrdm->vert_edge_map)
- create_vert_edge_map(&mrdm->vert_edge_map, &mrdm->vert_edge_map_mem, mrdm->me->medge,
- mrdm->me->totvert, mrdm->me->totedge);
+ create_vert_edge_map(&mrdm->vert_edge_map, &mrdm->vert_edge_map_mem, me->medge,
+ me->totvert, me->totedge);
return mrdm->vert_edge_map;
}
@@ -1450,6 +1464,7 @@ ListBase *MultiresDM_get_vert_edge_map(DerivedMesh *dm)
int *MultiresDM_get_face_offsets(DerivedMesh *dm)
{
MultiresDM *mrdm = (MultiresDM*)dm;
+ Mesh *me = mrdm->ob->data;
int i, accum = 0;
if(!mrdm->face_offsets) {
@@ -1457,11 +1472,11 @@ int *MultiresDM_get_face_offsets(DerivedMesh *dm)
int area = len * len;
int t = 1 + len * 3 + area * 3, q = t + len + area;
- mrdm->face_offsets = MEM_callocN(sizeof(int) * mrdm->me->totface, "mrdm face offsets");
- for(i = 0; i < mrdm->me->totface; ++i) {
+ mrdm->face_offsets = MEM_callocN(sizeof(int) * me->totface, "mrdm face offsets");
+ for(i = 0; i < me->totface; ++i) {
mrdm->face_offsets[i] = accum;
- accum += (mrdm->me->mface[i].v4 ? q : t);
+ accum += (me->mface[i].v4 ? q : t);
}
}
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index e98d7bb01a4..5cfbd5c18dc 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -33,6 +33,7 @@
#include "DNA_mesh_types.h"
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
+#include "DNA_particle_types.h"
#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
@@ -42,6 +43,7 @@
#include "BKE_object.h"
#include "BKE_modifier.h"
#include "BKE_utildefines.h"
+#include "BKE_particle.h"
#include "BKE_pointcache.h"
@@ -93,7 +95,7 @@ static CM_SOLVER_DEF solvers [] =
static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm );
static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first);
-int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
+static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm );
@@ -153,7 +155,7 @@ void cloth_init ( ClothModifierData *clmd )
clmd->sim_parms->goalfrict = 0.0f;
}
-BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float epsilon)
+static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float epsilon)
{
unsigned int i;
BVHTree *bvhtree;
@@ -194,7 +196,7 @@ BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float epsilon)
return bvhtree;
}
-BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon)
+static BVHTree *bvhtree_build_from_cloth (ClothModifierData *clmd, float epsilon)
{
unsigned int i;
BVHTree *bvhtree;
@@ -338,44 +340,6 @@ void bvhselftree_update_from_cloth(ClothModifierData *clmd, int moving)
}
}
-int modifiers_indexInObject(Object *ob, ModifierData *md_seek);
-
-int cloth_read_cache(Object *ob, ClothModifierData *clmd, float framenr)
-{
- PTCacheID pid;
- PTCacheFile *pf;
- Cloth *cloth = clmd->clothObject;
- unsigned int a, ret = 1;
-
- if(!cloth)
- return 0;
-
- BKE_ptcache_id_from_cloth(&pid, ob, clmd);
- pf = BKE_ptcache_file_open(&pid, PTCACHE_FILE_READ, framenr);
- if(pf) {
- for(a = 0; a < cloth->numverts; a++) {
- if(!BKE_ptcache_file_read_floats(pf, cloth->verts[a].x, 3)) {
- ret = 0;
- break;
- }
- if(!BKE_ptcache_file_read_floats(pf, cloth->verts[a].xconst, 3)) {
- ret = 0;
- break;
- }
- if(!BKE_ptcache_file_read_floats(pf, cloth->verts[a].v, 3)) {
- ret = 0;
- break;
- }
- }
-
- BKE_ptcache_file_close(pf);
- }
- else
- ret = 0;
-
- return ret;
-}
-
void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr)
{
PTCacheID pid;
@@ -383,36 +347,12 @@ void cloth_clear_cache(Object *ob, ClothModifierData *clmd, float framenr)
BKE_ptcache_id_from_cloth(&pid, ob, clmd);
// don't do anything as long as we're in editmode!
- if(pid.cache->flag & PTCACHE_BAKE_EDIT_ACTIVE)
+ if(pid.cache->edit && ob->mode & OB_MODE_PARTICLE_EDIT)
return;
BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_AFTER, framenr);
}
-void cloth_write_cache(Object *ob, ClothModifierData *clmd, float framenr)
-{
- Cloth *cloth = clmd->clothObject;
- PTCacheID pid;
- PTCacheFile *pf;
- unsigned int a;
-
- if(!cloth)
- return;
-
- BKE_ptcache_id_from_cloth(&pid, ob, clmd);
- pf = BKE_ptcache_file_open(&pid, PTCACHE_FILE_WRITE, framenr);
- if(!pf)
- return;
-
- for(a = 0; a < cloth->numverts; a++) {
- BKE_ptcache_file_write_floats(pf, cloth->verts[a].x, 3);
- BKE_ptcache_file_write_floats(pf, cloth->verts[a].xconst, 3);
- BKE_ptcache_file_write_floats(pf, cloth->verts[a].v, 3);
- }
-
- BKE_ptcache_file_close(pf);
-}
-
static int do_init_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *result, int framenr)
{
PointCache *cache;
@@ -486,6 +426,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
PTCacheID pid;
float timescale;
int framedelta, framenr, startframe, endframe;
+ int cache_result;
clmd->scene= scene; /* nice to pass on later :) */
framenr= (int)scene->r.cfra;
@@ -499,6 +440,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(!result) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
return dm;
}
@@ -510,6 +452,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(result->getNumVerts(result) != clmd->clothObject->numverts) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
return result;
}
}
@@ -521,6 +464,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(BKE_ptcache_get_continue_physics()) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
/* do simulation */
if(!do_init_cloth(ob, clmd, result, framenr))
@@ -536,6 +480,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(framenr < startframe) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
return result;
}
else if(framenr > endframe) {
@@ -551,52 +496,61 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(!do_init_cloth(ob, clmd, result, framenr))
return result;
- /* try to read from cache */
- if(cloth_read_cache(ob, clmd, framenr)) {
- cache->flag |= PTCACHE_SIMULATION_VALID;
+ if(framenr == startframe) {
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+ do_init_cloth(ob, clmd, result, framenr);
cache->simframe= framenr;
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ return result;
+ }
+
+ /* try to read from cache */
+ cache_result = BKE_ptcache_read_cache(&pid, (float)framenr, scene->r.frs_sec);
+ if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
implicit_set_positions(clmd);
cloth_to_object (ob, clmd, result);
+ cache->simframe= framenr;
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+
+ if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
+ BKE_ptcache_write_cache(&pid, framenr);
+
return result;
}
+ else if(cache_result==PTCACHE_READ_OLD) {
+ implicit_set_positions(clmd);
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ }
else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
/* if baked and nothing in cache, do nothing */
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
return result;
}
- if(framenr == startframe) {
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe= framenr;
-
- /* don't write cache on first frame, but on second frame write
- * cache for frame 1 and 2 */
- }
- else if(framedelta == 1) {
- /* if on second frame, write cache for first frame */
- if(framenr == startframe+1)
- cloth_write_cache(ob, clmd, startframe);
+ /* 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);
- /* do simulation */
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe= framenr;
+ clmd->sim_parms->timescale *= framenr - cache->simframe;
- if(!do_step_cloth(ob, clmd, result, framenr)) {
- cache->flag &= ~PTCACHE_SIMULATION_VALID;
- cache->simframe= 0;
- }
- else
- cloth_write_cache(ob, clmd, framenr);
+ /* do simulation */
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->simframe= framenr;
- cloth_to_object (ob, clmd, result);
- }
- else {
+ if(!do_step_cloth(ob, clmd, result, framenr)) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->last_exact= 0;
}
+ else
+ BKE_ptcache_write_cache(&pid, framenr);
+
+ cloth_to_object (ob, clmd, result);
return result;
}
@@ -1044,7 +998,7 @@ int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned in
return 0;
}
-void cloth_free_errorsprings(Cloth *cloth, EdgeHash *edgehash, LinkNode **edgelist)
+static void cloth_free_errorsprings(Cloth *cloth, EdgeHash *edgehash, LinkNode **edgelist)
{
unsigned int i = 0;
@@ -1077,7 +1031,7 @@ void cloth_free_errorsprings(Cloth *cloth, EdgeHash *edgehash, LinkNode **edgeli
BLI_edgehash_free ( cloth->edgehash, NULL );
}
-int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
+static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
{
Cloth *cloth = clmd->clothObject;
ClothSpring *spring = NULL, *tspring = NULL, *tspring2 = NULL;
@@ -1206,25 +1160,66 @@ int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
BLI_linklist_prepend ( &cloth->springs, spring );
}
- // bending springs
- search2 = cloth->springs;
- for ( i = struct_springs; i < struct_springs+shear_springs; i++ )
- {
- if ( !search2 )
- break;
+ if(numfaces) {
+ // bending springs
+ search2 = cloth->springs;
+ for ( i = struct_springs; i < struct_springs+shear_springs; i++ )
+ {
+ if ( !search2 )
+ break;
+
+ tspring2 = search2->link;
+ search = edgelist[tspring2->kl];
+ while ( search )
+ {
+ tspring = search->link;
+ index2 = ( ( tspring->ij==tspring2->kl ) ? ( tspring->kl ) : ( tspring->ij ) );
+
+ // check for existing spring
+ // check also if startpoint is equal to endpoint
+ if ( !BLI_edgehash_haskey ( edgehash, MIN2(tspring2->ij, index2), MAX2(tspring2->ij, index2) )
+ && ( index2!=tspring2->ij ) )
+ {
+ spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
+
+ if(!spring)
+ {
+ cloth_free_errorsprings(cloth, edgehash, edgelist);
+ return 0;
+ }
+
+ spring->ij = MIN2(tspring2->ij, index2);
+ spring->kl = MAX2(tspring2->ij, index2);
+ VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
+ spring->restlen = sqrt ( INPR ( temp, temp ) );
+ spring->type = CLOTH_SPRING_TYPE_BENDING;
+ spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
+ BLI_edgehash_insert ( edgehash, spring->ij, spring->kl, NULL );
+ bend_springs++;
- tspring2 = search2->link;
- search = edgelist[tspring2->kl];
- while ( search )
+ BLI_linklist_prepend ( &cloth->springs, spring );
+ }
+ search = search->next;
+ }
+ search2 = search2->next;
+ }
+ }
+ else if(struct_springs > 2) {
+ /* bending springs for hair strands */
+ /* The current algorightm only goes through the edges in order of the mesh edges list */
+ /* and makes springs between the outer vert of edges sharing a vertice. This works just */
+ /* fine for hair, but not for user generated string meshes. This could/should be later */
+ /* extended to work with non-ordered edges so that it can be used for general "rope */
+ /* dynamics" without the need for the vertices or edges to be ordered through the length*/
+ /* of the strands. -jahka */
+ search = cloth->springs;
+ search2 = search->next;
+ while(search && search2)
{
tspring = search->link;
- index2 = ( ( tspring->ij==tspring2->kl ) ? ( tspring->kl ) : ( tspring->ij ) );
-
- // check for existing spring
- // check also if startpoint is equal to endpoint
- if ( !BLI_edgehash_haskey ( edgehash, MIN2(tspring2->ij, index2), MAX2(tspring2->ij, index2) )
- && ( index2!=tspring2->ij ) )
- {
+ tspring2 = search2->link;
+
+ if(tspring->ij == tspring2->kl) {
spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" );
if(!spring)
@@ -1233,20 +1228,20 @@ int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
return 0;
}
- spring->ij = MIN2(tspring2->ij, index2);
- spring->kl = MAX2(tspring2->ij, index2);
+ spring->ij = tspring2->ij;
+ spring->kl = tspring->kl;
VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x );
spring->restlen = sqrt ( INPR ( temp, temp ) );
spring->type = CLOTH_SPRING_TYPE_BENDING;
spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
- BLI_edgehash_insert ( edgehash, spring->ij, spring->kl, NULL );
bend_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
}
+
search = search->next;
+ search2 = search2->next;
}
- search2 = search2->next;
}
/* insert other near springs in edgehash AFTER bending springs are calculated (for selfcolls) */
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index c122145c98f..aa4aae2422c 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -313,7 +313,7 @@ gsl_poly_solve_quadratic (double a, double b, double c,
* See Bridson et al. "Robust Treatment of Collision, Contact and Friction for Cloth Animation"
* page 4, left column
*/
-int cloth_get_collision_time ( double a[3], double b[3], double c[3], double d[3], double e[3], double f[3], double solution[3] )
+static int cloth_get_collision_time ( double a[3], double b[3], double c[3], double d[3], double e[3], double f[3], double solution[3] )
{
int num_sols = 0;
@@ -427,7 +427,7 @@ int cloth_get_collision_time ( double a[3], double b[3], double c[3], double d[3
// w3 is not perfect
-void collision_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 )
+static void collision_compute_barycentric ( float pv[3], float p1[3], float p2[3], float p3[3], float *w1, float *w2, float *w3 )
{
double tempV1[3], tempV2[3], tempV4[3];
double a,b,c,d,e,f;
@@ -591,7 +591,7 @@ CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap
ClothModifierData *clmd = ( ClothModifierData * ) md1;
CollisionModifierData *collmd = ( CollisionModifierData * ) md2;
MFace *face1=NULL, *face2 = NULL;
-#ifdef WITH_BULLET
+#ifdef USE_BULLET
ClothVertex *verts1 = clmd->clothObject->verts;
#endif
double distance = 0;
@@ -669,7 +669,7 @@ CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap
break;
}
-#ifdef WITH_BULLET
+#ifdef USE_BULLET
// calc distance + normal
distance = plNearestPoints (
verts1[collpair->ap1].txold, verts1[collpair->ap2].txold, verts1[collpair->ap3].txold, collmd->current_x[collpair->bp1].co, collmd->current_x[collpair->bp2].co, collmd->current_x[collpair->bp3].co, collpair->pa,collpair->pb,collpair->vector );
@@ -726,7 +726,7 @@ CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap
return collpair;
}
-int cloth_collision_response_moving( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
+static int cloth_collision_response_moving( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
{
int result = 0;
Cloth *cloth1;
@@ -891,7 +891,7 @@ static void findClosestPointsEE(float *x1, float *x2, float *x3, float *x4, floa
}
// calculates the distance of 2 edges
-float edgedge_distance(float np11[3], float np12[3], float np21[3], float np22[3], float *out_a1, float *out_a2, float *out_normal)
+static float edgedge_distance(float np11[3], float np12[3], float np21[3], float np22[3], float *out_a1, float *out_a2, float *out_normal)
{
float line1[3], line2[3], cross[3];
float length;
@@ -1065,7 +1065,7 @@ float edgedge_distance(float np11[3], float np12[3], float np21[3], float np22[3
return 0;
}
-int cloth_collision_moving_edges ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair )
+static int cloth_collision_moving_edges ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair )
{
EdgeCollPair edgecollpair;
Cloth *cloth1=NULL;
@@ -1275,7 +1275,7 @@ int cloth_collision_moving_edges ( ClothModifierData *clmd, CollisionModifierDat
return result;
}
-int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
+static int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
{
Cloth *cloth1;
cloth1 = clmd->clothObject;
@@ -1296,15 +1296,15 @@ int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierData *col
// return all collision objects in scene
// collision object will exclude self
-CollisionModifierData **get_collisionobjects(Scene *scene, Object *self, int *numcollobj)
+Object **get_collisionobjects(Scene *scene, Object *self, int *numcollobj)
{
Base *base=NULL;
- CollisionModifierData **objs = NULL;
+ Object **objs = NULL;
Object *coll_ob = NULL;
CollisionModifierData *collmd = NULL;
int numobj = 0, maxobj = 100;
- objs = MEM_callocN(sizeof(CollisionModifierData *)*maxobj, "CollisionObjectsArray");
+ objs = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray");
// check all collision objects
for ( base = scene->base.first; base; base = base->next )
{
@@ -1330,16 +1330,16 @@ CollisionModifierData **get_collisionobjects(Scene *scene, Object *self, int *nu
{
// realloc
int oldmax = maxobj;
- CollisionModifierData **tmp;
+ Object **tmp;
maxobj *= 2;
- tmp = MEM_callocN(sizeof(CollisionModifierData *)*maxobj, "CollisionObjectsArray");
- memcpy(tmp, objs, sizeof(CollisionModifierData *)*oldmax);
+ tmp = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray");
+ memcpy(tmp, objs, sizeof(Object *)*oldmax);
MEM_freeN(objs);
objs = tmp;
}
- objs[numobj] = collmd;
+ objs[numobj] = coll_ob;
numobj++;
}
else
@@ -1374,15 +1374,15 @@ CollisionModifierData **get_collisionobjects(Scene *scene, Object *self, int *nu
{
// realloc
int oldmax = maxobj;
- CollisionModifierData **tmp;
+ Object **tmp;
maxobj *= 2;
- tmp = MEM_callocN(sizeof(CollisionModifierData *)*maxobj, "CollisionObjectsArray");
- memcpy(tmp, objs, sizeof(CollisionModifierData *)*oldmax);
+ tmp = MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray");
+ memcpy(tmp, objs, sizeof(Object *)*oldmax);
MEM_freeN(objs);
objs = tmp;
}
- objs[numobj] = collmd;
+ objs[numobj] = coll_ob;
numobj++;
}
}
@@ -1392,7 +1392,7 @@ CollisionModifierData **get_collisionobjects(Scene *scene, Object *self, int *nu
return objs;
}
-void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair **collisions, CollPair **collisions_index, int numresult, BVHTreeOverlap *overlap)
+static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair **collisions, CollPair **collisions_index, int numresult, BVHTreeOverlap *overlap)
{
int i;
@@ -1405,7 +1405,7 @@ void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModi
}
}
-int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair *collisions, CollPair *collisions_index)
+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;
@@ -1459,7 +1459,7 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
int rounds = 0; // result counts applied collisions; ic is for debug output;
ClothVertex *verts = NULL;
int ret = 0, ret2 = 0;
- CollisionModifierData **collobjs = NULL;
+ Object **collobjs = NULL;
int numcollobj = 0;
if ( ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ ) || ! ( ( ( Cloth * ) clmd->clothObject )->bvhtree ) )
@@ -1498,7 +1498,8 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
// check all collision objects
for(i = 0; i < numcollobj; i++)
{
- CollisionModifierData *collmd = collobjs[i];
+ Object *collob= collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData*)modifiers_findByType(collob, eModifierType_Collision);
BVHTreeOverlap *overlap = NULL;
int result = 0;
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index e8716aba296..8cd64ae2ece 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -58,6 +58,91 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+/* ********************************* color transforms ********************************* */
+
+/*Transform linear RGB values to nonlinear RGB values. Rec.
+ 709 is ITU-R Recommendation BT. 709 (1990) ``Basic
+ Parameter Values for the HDTV Standard for the Studio and
+ for International Programme Exchange'', formerly CCIR Rec.
+ 709.*/
+void gamma_correct_rec709(float *c, float gamma)
+{
+ /* Rec. 709 gamma correction. */
+ const float cc = 0.018f;
+
+ if (*c < cc)
+ *c *= ((1.099f * (float)powf(cc, gamma)) - 0.099f) * (1.0f/cc);
+ else
+ *c = (1.099f * (float)powf(*c, gamma)) - 0.099f;
+}
+
+void gamma_correct(float *c, float gamma)
+{
+ *c = powf((*c), gamma);
+}
+
+float srgb_to_linearrgb(float c)
+{
+ if (c < 0.04045f)
+ return (c < 0.0f)? 0.0f: c*(1.0f/12.92f);
+ else
+ return powf((c + 0.055f)*(1.0f/1.055f), 2.4f);
+}
+
+float linearrgb_to_srgb(float c)
+{
+ if (c < 0.0031308f)
+ return (c < 0.0f)? 0.0f: c * 12.92f;
+ else
+ return 1.055f * powf(c, 1.0f/2.4f) - 0.055f;
+}
+
+/* utility function convert an RGB triplet from sRGB to linear RGB color space */
+void color_manage_linearize(float *col_to, float *col_from)
+{
+ col_to[0] = srgb_to_linearrgb(col_from[0]);
+ col_to[1] = srgb_to_linearrgb(col_from[1]);
+ col_to[2] = srgb_to_linearrgb(col_from[2]);
+}
+
+void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+{
+ int x, y;
+ float *rf= rectf;
+ float srgb[3];
+ unsigned char *rc= rectc;
+
+ for(y=y1; y<y2; y++) {
+ for(x=x1; x<x2; x++, rf+=4, rc+=4) {
+ srgb[0]= linearrgb_to_srgb(rf[0]);
+ srgb[1]= linearrgb_to_srgb(rf[1]);
+ srgb[2]= linearrgb_to_srgb(rf[2]);
+
+ rc[0]= FTOCHAR(srgb[0]);
+ rc[1]= FTOCHAR(srgb[1]);
+ rc[2]= FTOCHAR(srgb[2]);
+ rc[3]= FTOCHAR(rf[3]);
+ }
+ }
+}
+
+void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+{
+ int x, y;
+ float *rf= rectf;
+ unsigned char *rc= rectc;
+
+ for(y=y1; y<y2; y++) {
+ for(x=x1; x<x2; x++, rf+=4, rc+=4) {
+ rc[0]= FTOCHAR(rf[0]);
+ rc[1]= FTOCHAR(rf[1]);
+ rc[2]= FTOCHAR(rf[2]);
+ rc[3]= FTOCHAR(rf[3]);
+ }
+ }
+}
+
+
/* ********************************* color curve ********************* */
/* ***************** operations on full struct ************* */
@@ -417,8 +502,8 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr)
for(a=0; a<cuma->totpoint-1; a++, fp += 2*CM_RESOL) {
correct_bezpart(bezt[a].vec[1], bezt[a].vec[2], bezt[a+1].vec[0], bezt[a+1].vec[1]);
- forward_diff_bezier(bezt[a].vec[1][0], bezt[a].vec[2][0], bezt[a+1].vec[0][0], bezt[a+1].vec[1][0], fp, CM_RESOL-1, 2);
- forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2);
+ forward_diff_bezier(bezt[a].vec[1][0], bezt[a].vec[2][0], bezt[a+1].vec[0][0], bezt[a+1].vec[1][0], fp, CM_RESOL-1, 2*sizeof(float));
+ forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2*sizeof(float));
}
/* store first and last handle for extrapolation, unit length */
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 88e73a00ba7..b8d6b333674 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -121,6 +121,7 @@ bConstraintOb *constraints_make_evalob (Scene *scene, Object *ob, void *subdata,
if (ob) {
cob->ob = ob;
cob->type = datatype;
+ cob->rotOrder = EULER_ORDER_DEFAULT; // TODO: when objects have rotation order too, use that
Mat4CpyMat4(cob->matrix, ob->obmat);
}
else
@@ -137,6 +138,15 @@ bConstraintOb *constraints_make_evalob (Scene *scene, Object *ob, void *subdata,
cob->pchan = (bPoseChannel *)subdata;
cob->type = datatype;
+ if (cob->pchan->rotmode > 0) {
+ /* should be some type of Euler order */
+ cob->rotOrder= cob->pchan->rotmode;
+ }
+ else {
+ /* Quats, so eulers should just use default order */
+ cob->rotOrder= EULER_ORDER_DEFAULT;
+ }
+
/* matrix in world-space */
Mat4MulMat4(cob->matrix, cob->pchan->pose_mat, ob->obmat);
}
@@ -664,6 +674,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
* (Hopefully all compilers will be happy with the lines with just a space on them. Those are
* really just to help this code easier to read)
*/
+// TODO: cope with getting rotation order...
#define SINGLETARGET_GET_TARS(con, datatar, datasubtarget, ct, list) \
{ \
ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
@@ -674,9 +685,17 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
ct->flag= CONSTRAINT_TAR_TEMP; \
\
if (ct->tar) { \
- if ((ct->tar->type==OB_ARMATURE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_BONE; \
- else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_VERT; \
- else ct->type = CONSTRAINT_OBTYPE_OBJECT; \
+ if ((ct->tar->type==OB_ARMATURE) && (ct->subtarget[0])) { \
+ bPoseChannel *pchan= get_pose_channel(ct->tar->pose, ct->subtarget); \
+ ct->type = CONSTRAINT_OBTYPE_BONE; \
+ ct->rotOrder= pchan->rotmode; \
+ }\
+ else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) { \
+ ct->type = CONSTRAINT_OBTYPE_VERT; \
+ } \
+ else {\
+ ct->type = CONSTRAINT_OBTYPE_OBJECT; \
+ } \
} \
\
BLI_addtail(list, ct); \
@@ -687,6 +706,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
* (Hopefully all compilers will be happy with the lines with just a space on them. Those are
* really just to help this code easier to read)
*/
+// TODO: cope with getting rotation order...
#define SINGLETARGETNS_GET_TARS(con, datatar, ct, list) \
{ \
ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
@@ -795,11 +815,11 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* extract components of both matrices */
VECCOPY(loc, ct->matrix[3]);
- Mat4ToEul(ct->matrix, eul);
+ Mat4ToEulO(ct->matrix, eul, ct->rotOrder);
Mat4ToSize(ct->matrix, size);
VECCOPY(loco, invmat[3]);
- Mat4ToEul(invmat, eulo);
+ Mat4ToEulO(invmat, eulo, cob->rotOrder);
Mat4ToSize(invmat, sizo);
/* disable channels not enabled */
@@ -814,8 +834,8 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
/* make new target mat and offset mat */
- LocEulSizeToMat4(ct->matrix, loc, eul, size);
- LocEulSizeToMat4(invmat, loco, eulo, sizo);
+ LocEulOSizeToMat4(ct->matrix, loc, eul, size, ct->rotOrder);
+ LocEulOSizeToMat4(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
@@ -1033,6 +1053,7 @@ static void kinematic_new_data (void *cdata)
data->weight= (float)1.0;
data->orientweight= (float)1.0;
data->iterations = 500;
+ data->dist= (float)1.0;
data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_STRETCH|CONSTRAINT_IK_POS;
}
@@ -1150,7 +1171,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
- float q[4], vec[4], dir[3], quat[4], x1;
+ float q[4], vec[4], dir[3], quat[4], radius, x1;
float totmat[4][4];
float curvetime;
@@ -1162,21 +1183,33 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
*/
/* only happens on reload file, but violates depsgraph still... fix! */
- if (cu->path==NULL || cu->path->data==NULL)
+ if (cu->path==NULL || cu->path->data==NULL)
makeDispListCurveTypes(cob->scene, ct->tar, 0);
if (cu->path && cu->path->data) {
- curvetime= bsystem_time(cob->scene, ct->tar, (float)ctime, 0.0) - data->offset;
-
-#if 0 // XXX old animation system
- if (calc_ipo_spec(cu->ipo, CU_SPEED, &curvetime)==0) {
- curvetime /= cu->pathlen;
+ if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
+ /* animated position along curve depending on time */
+ if (cob->scene)
+ curvetime= bsystem_time(cob->scene, ct->tar, ctime, 0.0) - data->offset;
+ else
+ curvetime= ctime - data->offset;
+
+ /* ctime is now a proper var setting of Curve which gets set by Animato like any other var that's animated,
+ * but this will only work if it actually is animated...
+ *
+ * we firstly calculate the modulus of cu->ctime/cu->pathlen to clamp ctime within the 0.0 to 1.0 times pathlen
+ * range, then divide this (the modulus) by pathlen to get a value between 0.0 and 1.0
+ */
+ curvetime= fmod(cu->ctime, cu->pathlen) / cu->pathlen;
CLAMP(curvetime, 0.0, 1.0);
}
-#endif // XXX old animation system
+ else {
+ /* fixed position along curve */
+ curvetime= data->offset; // XXX might need a more sensible value
+ }
- if ( where_on_path(ct->tar, curvetime, vec, dir) ) {
- if (data->followflag) {
+ if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, &radius) ) {
+ if (data->followflag & FOLLOWPATH_FOLLOW) {
vectoquat(dir, (short) data->trackflag, (short) data->upflag, quat);
Normalize(dir);
@@ -1189,6 +1222,14 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
QuatToMat4(quat, totmat);
}
+
+ if (data->followflag & FOLLOWPATH_RADIUS) {
+ float tmat[4][4], rmat[4][4];
+ Mat4Scale(tmat, radius);
+ Mat4MulMat4(rmat, totmat, tmat);
+ Mat4CpyMat4(totmat, rmat);
+ }
+
VECCOPY(totmat[3], vec);
Mat4MulSerie(ct->matrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
@@ -1206,7 +1247,8 @@ static void followpath_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct)) {
float obmat[4][4];
- float size[3], obsize[3];
+ float size[3];
+ bFollowPathConstraint *data= con->data;
/* get Object local transform (loc/rot/size) to determine transformation from path */
//object_to_mat4(ob, obmat);
@@ -1219,13 +1261,17 @@ static void followpath_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
Mat4MulSerie(cob->matrix, ct->matrix, obmat, NULL, NULL, NULL, NULL, NULL, NULL);
/* un-apply scaling caused by path */
- Mat4ToSize(cob->matrix, obsize);
- if (obsize[0])
- VecMulf(cob->matrix[0], size[0] / obsize[0]);
- if (obsize[1])
- VecMulf(cob->matrix[1], size[1] / obsize[1]);
- if (obsize[2])
- VecMulf(cob->matrix[2], size[2] / obsize[2]);
+ if ((data->followflag & FOLLOWPATH_RADIUS)==0) { /* XXX - assume that scale correction means that radius will have some scale error in it - Campbell */
+ float obsize[3];
+
+ Mat4ToSize(cob->matrix, obsize);
+ if (obsize[0])
+ VecMulf(cob->matrix[0], size[0] / obsize[0]);
+ if (obsize[1])
+ VecMulf(cob->matrix[1], size[1] / obsize[1]);
+ if (obsize[2])
+ VecMulf(cob->matrix[2], size[2] / obsize[2]);
+ }
}
}
@@ -1304,7 +1350,7 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
VECCOPY(loc, cob->matrix[3]);
Mat4ToSize(cob->matrix, size);
- Mat4ToEul(cob->matrix, eul);
+ Mat4ToEulO(cob->matrix, eul, cob->rotOrder);
/* eulers: radians to degrees! */
eul[0] = (float)(eul[0] / M_PI * 180);
@@ -1339,7 +1385,7 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
eul[1] = (float)(eul[1] / 180 * M_PI);
eul[2] = (float)(eul[2] / 180 * M_PI);
- LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ LocEulOSizeToMat4(cob->matrix, loc, eul, size, cob->rotOrder);
}
static bConstraintTypeInfo CTI_ROTLIMIT = {
@@ -1546,14 +1592,15 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
VECCOPY(loc, cob->matrix[3]);
Mat4ToSize(cob->matrix, size);
- Mat4ToEul(ct->matrix, eul);
- Mat4ToEul(cob->matrix, obeul);
+ /* to allow compatible rotations, must get both rotations in the order of the owner... */
+ Mat4ToEulO(ct->matrix, eul, cob->rotOrder);
+ Mat4ToEulO(cob->matrix, obeul, cob->rotOrder);
if ((data->flag & ROTLIKE_X)==0)
eul[0] = obeul[0];
else {
if (data->flag & ROTLIKE_OFFSET)
- euler_rot(eul, obeul[0], 'x');
+ eulerO_rot(eul, obeul[0], 'x', cob->rotOrder);
if (data->flag & ROTLIKE_X_INVERT)
eul[0] *= -1;
@@ -1563,7 +1610,7 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
eul[1] = obeul[1];
else {
if (data->flag & ROTLIKE_OFFSET)
- euler_rot(eul, obeul[1], 'y');
+ eulerO_rot(eul, obeul[1], 'y', cob->rotOrder);
if (data->flag & ROTLIKE_Y_INVERT)
eul[1] *= -1;
@@ -1573,14 +1620,14 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
eul[2] = obeul[2];
else {
if (data->flag & ROTLIKE_OFFSET)
- euler_rot(eul, obeul[2], 'z');
+ eulerO_rot(eul, obeul[2], 'z', cob->rotOrder);
if (data->flag & ROTLIKE_Z_INVERT)
eul[2] *= -1;
}
compatible_eul(eul, obeul);
- LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ LocEulOSizeToMat4(cob->matrix, loc, eul, size, cob->rotOrder);
}
}
@@ -2843,7 +2890,7 @@ static void clampto_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
*/
/* only happens on reload file, but violates depsgraph still... fix! */
- if (cu->path==NULL || cu->path->data==NULL)
+ if (cu->path==NULL || cu->path->data==NULL)
makeDispListCurveTypes(cob->scene, ct->tar, 0);
}
@@ -2954,7 +3001,7 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
}
/* 3. position on curve */
- if (where_on_path(ct->tar, curvetime, vec, dir) ) {
+ if (where_on_path(ct->tar, curvetime, vec, dir, NULL, NULL) ) {
Mat4One(totmat);
VECCOPY(totmat[3], vec);
@@ -3036,7 +3083,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
Mat4ToSize(ct->matrix, dvec);
break;
case 1: /* rotation (convert to degrees first) */
- Mat4ToEul(ct->matrix, dvec);
+ Mat4ToEulO(ct->matrix, dvec, cob->rotOrder);
for (i=0; i<3; i++)
dvec[i] = (float)(dvec[i] / M_PI * 180);
break;
@@ -3047,7 +3094,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
/* extract components of owner's matrix */
VECCOPY(loc, cob->matrix[3]);
- Mat4ToEul(cob->matrix, eul);
+ Mat4ToEulO(cob->matrix, eul, cob->rotOrder);
Mat4ToSize(cob->matrix, size);
/* determine where in range current transforms lie */
@@ -3102,7 +3149,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
}
/* apply to matrix */
- LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ LocEulOSizeToMat4(cob->matrix, loc, eul, size, cob->rotOrder);
}
}
@@ -3597,7 +3644,7 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
/* these we can skip completely (invalid constraints...) */
if (cti == NULL) continue;
- if (con->flag & CONSTRAINT_DISABLE) continue;
+ if (con->flag & (CONSTRAINT_DISABLE|CONSTRAINT_OFF)) continue;
/* these constraints can't be evaluated anyway */
if (cti->evaluate_constraint == NULL) continue;
/* influence == 0 should be ignored */
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 90880e354ec..bbfe077c15e 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -34,6 +34,7 @@
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_object_types.h"
#include "RNA_access.h"
@@ -43,6 +44,7 @@
#include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_screen.h"
+#include "BKE_global.h"
#include <string.h>
@@ -68,6 +70,7 @@ struct bContext {
struct Scene *scene;
int recursion;
+ int py_init; /* true if python is initialized */
} data;
/* data evaluation */
@@ -162,6 +165,16 @@ void CTX_store_free_list(ListBase *contexts)
}
}
+/* is python initialied? */
+int CTX_py_init_get(bContext *C)
+{
+ return C->data.py_init;
+}
+void CTX_py_init_set(bContext *C, int value)
+{
+ C->data.py_init= value;
+}
+
/* window manager context */
wmWindowManager *CTX_wm_manager(const bContext *C)
@@ -204,6 +217,14 @@ struct ARegion *CTX_wm_menu(const bContext *C)
return C->wm.menu;
}
+struct ReportList *CTX_wm_reports(const bContext *C)
+{
+ if (C->wm.manager)
+ return &(C->wm.manager->reports);
+
+ return NULL;
+}
+
View3D *CTX_wm_view3d(const bContext *C)
{
if(C->wm.area && C->wm.area->spacetype==SPACE_VIEW3D)
@@ -226,6 +247,13 @@ struct SpaceText *CTX_wm_space_text(const bContext *C)
return NULL;
}
+struct SpaceConsole *CTX_wm_space_console(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_CONSOLE)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
struct SpaceImage *CTX_wm_space_image(const bContext *C)
{
if(C->wm.area && C->wm.area->spacetype==SPACE_IMAGE)
@@ -233,6 +261,90 @@ struct SpaceImage *CTX_wm_space_image(const bContext *C)
return NULL;
}
+struct SpaceButs *CTX_wm_space_buts(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_BUTS)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceFile *CTX_wm_space_file(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_FILE)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceSeq *CTX_wm_space_seq(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_SEQ)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceOops *CTX_wm_space_outliner(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_OUTLINER)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceNla *CTX_wm_space_nla(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_NLA)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceTime *CTX_wm_space_time(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_TIME)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceNode *CTX_wm_space_node(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_NODE)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceLogic *CTX_wm_space_logic(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_LOGIC)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceIpo *CTX_wm_space_graph(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_IPO)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceAction *CTX_wm_space_action(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_ACTION)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceInfo *CTX_wm_space_info(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_INFO)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
+struct SpaceUserPref *CTX_wm_space_userpref(const bContext *C)
+{
+ if(C->wm.area && C->wm.area->spacetype==SPACE_USERPREF)
+ return C->wm.area->spacedata.first;
+ return NULL;
+}
+
void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
{
C->wm.manager= wm;
@@ -358,6 +470,9 @@ static int ctx_data_collection_get(const bContext *C, const char *member, ListBa
return 1;
}
+ list->first= NULL;
+ list->last= NULL;
+
return 0;
}
@@ -375,7 +490,7 @@ PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, Stru
{
PointerRNA ptr = CTX_data_pointer_get(C, member);
- if(ptr.data && ptr.type == type)
+ if(ptr.data && RNA_struct_is_a(ptr.type, type))
return ptr;
return PointerRNA_NULL;
@@ -553,6 +668,69 @@ Scene *CTX_data_scene(const bContext *C)
return C->data.scene;
}
+int CTX_data_mode_enum(const bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+
+ if(obedit) {
+ switch(obedit->type) {
+ case OB_MESH:
+ return CTX_MODE_EDIT_MESH;
+ case OB_CURVE:
+ return CTX_MODE_EDIT_CURVE;
+ case OB_SURF:
+ return CTX_MODE_EDIT_SURFACE;
+ case OB_FONT:
+ return CTX_MODE_EDIT_TEXT;
+ case OB_ARMATURE:
+ return CTX_MODE_EDIT_ARMATURE;
+ case OB_MBALL:
+ return CTX_MODE_EDIT_METABALL;
+ case OB_LATTICE:
+ return CTX_MODE_EDIT_LATTICE;
+ }
+ }
+ else {
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob) {
+ if(ob->mode & OB_MODE_POSE) return CTX_MODE_POSE;
+ else if(ob->mode & OB_MODE_SCULPT) return CTX_MODE_SCULPT;
+ else if(ob->mode & OB_MODE_WEIGHT_PAINT) return CTX_MODE_PAINT_WEIGHT;
+ else if(ob->mode & OB_MODE_VERTEX_PAINT) return CTX_MODE_PAINT_VERTEX;
+ else if(ob->mode & OB_MODE_TEXTURE_PAINT) return CTX_MODE_PAINT_TEXTURE;
+ else if(ob->mode & OB_MODE_PARTICLE_EDIT) return CTX_MODE_PARTICLE;
+ }
+ }
+
+ return CTX_MODE_OBJECT;
+}
+
+
+/* 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[] = {
+ "mesh_edit",
+ "curve_edit",
+ "surface_edit",
+ "text_edit",
+ "armature_edit",
+ "mball_edit",
+ "lattice_edit",
+ "posemode",
+ "sculpt_mode",
+ "weightpaint",
+ "vertexpaint",
+ "texturepaint",
+ "particlemode",
+ "objectmode",
+ 0
+};
+char *CTX_data_mode_string(const bContext *C)
+{
+ return data_mode_strings[CTX_data_mode_enum(C)];
+}
+
void CTX_data_scene_set(bContext *C, Scene *scene)
{
C->data.scene= scene;
@@ -603,6 +781,16 @@ int CTX_data_visible_bases(const bContext *C, ListBase *list)
return ctx_data_collection_get(C, "visible_bases", list);
}
+int CTX_data_selectable_objects(const bContext *C, ListBase *list)
+{
+ return ctx_data_collection_get(C, "selectable_objects", list);
+}
+
+int CTX_data_selectable_bases(const bContext *C, ListBase *list)
+{
+ return ctx_data_collection_get(C, "selectable_bases", list);
+}
+
struct Object *CTX_data_active_object(const bContext *C)
{
return ctx_data_pointer_get(C, "active_object");
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 7dd868278f4..2ce877bd847 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -65,11 +65,10 @@
#include "BKE_object.h"
#include "BKE_utildefines.h" // VECCOPY
-
/* globals */
/* local */
-int cu_isectLL(float *v1, float *v2, float *v3, float *v4,
+static int cu_isectLL(float *v1, float *v2, float *v3, float *v4,
short cox, short coy,
float *labda, float *mu, float *vec);
@@ -137,7 +136,7 @@ Curve *add_curve(char *name, int type)
cu= alloc_libblock(&G.main->curve, ID_CU, name);
cu->size[0]= cu->size[1]= cu->size[2]= 1.0;
- cu->flag= CU_FRONT+CU_BACK;
+ cu->flag= CU_FRONT|CU_BACK|CU_PATH_RADIUS;
cu->pathlen= 100;
cu->resolu= cu->resolv= 12;
cu->width= 1.0;
@@ -470,8 +469,11 @@ void test2DNurb(Nurb *nu)
BezTriple *bezt;
BPoint *bp;
int a;
+
+ if((nu->flag & CU_2D)==0)
+ return;
- if( nu->type== CU_BEZIER+CU_2D ) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -481,7 +483,7 @@ void test2DNurb(Nurb *nu)
bezt++;
}
}
- else if(nu->type & CU_2D) {
+ else {
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
@@ -497,7 +499,7 @@ void minmaxNurb(Nurb *nu, float *min, float *max)
BPoint *bp;
int a;
- if( (nu->type & 7)==CU_BEZIER ) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -594,7 +596,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
void makeknots(Nurb *nu, short uv)
{
- if( (nu->type & 7)==CU_NURBS ) {
+ if(nu->type == CU_NURBS) {
if(uv == 1) {
if(nu->knotsu) MEM_freeN(nu->knotsu);
if(check_valid_nurb_u(nu)) {
@@ -850,7 +852,7 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
MEM_freeN(jend);
}
-void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu)
+void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, int resolu, int stride)
/* coord_array has to be 3*4*pntsu*resolu in size and zero-ed
* tilt_array and radius_array will be written to if valid */
{
@@ -934,10 +936,10 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
}
}
- coord_fp+= 3;
+ coord_fp = (float *)(((char *)coord_fp) + stride);
- if (tilt_fp) tilt_fp++;
- if (radius_fp) radius_fp++;
+ if (tilt_fp) tilt_fp = (float *)(((char *)tilt_fp) + stride);
+ if (radius_fp) radius_fp = (float *)(((char *)radius_fp) + stride);
u+= ustep;
}
@@ -968,12 +970,31 @@ void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int i
for(a=0; a<=it; a++) {
*p= q0;
- p+= stride;
+ p = (float *)(((char *)p)+stride);
q0+= q1;
q1+= q2;
q2+= q3;
}
-}
+}
+
+static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float *p3, float *p, int it, int stride)
+{
+ /* note that these are not purpendicular to the curve
+ * they need to be rotated for this,
+ *
+ * This could also be optimized like forward_diff_bezier */
+ int a;
+ for(a=0; a<=it; a++) {
+ float t = (float)a / (float)it;
+
+ int i;
+ for(i=0; i<3; i++) {
+ p[i]= (-6*t + 6)*p0[i] + (18*t - 12)*p1[i] + (-18*t + 6)*p2[i] + (6*t)*p3[i];
+ }
+ Normalize(p);
+ p = (float *)(((char *)p)+stride);
+ }
+}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -1342,7 +1363,7 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp)
}
}
-int cu_isectLL(float *v1, float *v2, float *v3, float *v4, short cox, short coy, float *labda, float *mu, float *vec)
+static int cu_isectLL(float *v1, float *v2, float *v3, float *v4, short cox, short coy, float *labda, float *mu, float *vec)
{
/* return:
-1: colliniar
@@ -1387,8 +1408,8 @@ static short bevelinside(BevList *bl1,BevList *bl2)
/* take first vertex of possible hole */
bevp= (BevPoint *)(bl2+1);
- hvec1[0]= bevp->x;
- hvec1[1]= bevp->y;
+ hvec1[0]= bevp->vec[0];
+ hvec1[1]= bevp->vec[1];
hvec1[2]= 0.0;
VECCOPY(hvec2,hvec1);
hvec2[0]+=1000;
@@ -1401,16 +1422,16 @@ static short bevelinside(BevList *bl1,BevList *bl2)
prevbevp= bevp+(nr-1);
while(nr--) {
- min= prevbevp->y;
- max= bevp->y;
+ min= prevbevp->vec[0];
+ max= bevp->vec[1];
if(max<min) {
min= max;
- max= prevbevp->y;
+ max= prevbevp->vec[1];
}
if(min!=max) {
if(min<=hvec1[1] && max>=hvec1[1]) {
/* there's a transition, calc intersection point */
- mode= cu_isectLL(&(prevbevp->x),&(bevp->x),hvec1,hvec2,0,1,&lab,&mu,vec);
+ mode= cu_isectLL(prevbevp->vec, bevp->vec, hvec1, hvec2, 0, 1, &lab, &mu, vec);
/* if lab==0.0 or lab==1.0 then the edge intersects exactly a transition
only allow for one situation: we choose lab= 1.0
*/
@@ -1483,12 +1504,15 @@ static void calc_bevel_sin_cos(float x1, float y1, float x2, float y2, float *si
}
-static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, int resolu)
+static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *tilt_array, float *radius_array, int resolu, int stride)
{
BezTriple *pprev, *next, *last;
float fac, dfac, t[4];
int a;
+ if(tilt_array==NULL && radius_array==NULL)
+ return;
+
last= nu->bezt+(nu->pntsu-1);
/* returns a point */
@@ -1511,11 +1535,13 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
for(a=0; a<resolu; a++, fac+= dfac) {
if (tilt_array) {
if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */
- tilt_array[a] = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
+ *tilt_array = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
} else {
- set_four_ipo(fac, t, nu->tilt_interp);
- tilt_array[a]= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa;
+ key_curve_position_weights(fac, t, nu->tilt_interp);
+ *tilt_array= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa;
}
+
+ tilt_array = (float *)(((char *)tilt_array) + stride);
}
if (radius_array) {
@@ -1523,19 +1549,363 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
/* Support 2.47 ease interp
* Note! - this only takes the 2 points into account,
* giving much more localized results to changes in radius, sometimes you want that */
- radius_array[a] = prevbezt->radius + (bezt->radius - prevbezt->radius)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
+ *radius_array = prevbezt->radius + (bezt->radius - prevbezt->radius)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
} else {
/* reuse interpolation from tilt if we can */
if (tilt_array==NULL || nu->tilt_interp != nu->radius_interp) {
- set_four_ipo(fac, t, nu->radius_interp);
+ key_curve_position_weights(fac, t, nu->radius_interp);
}
- radius_array[a]= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius;
+ *radius_array= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius;
+ }
+
+ radius_array = (float *)(((char *)radius_array) + stride);
+ }
+ }
+}
+
+/* make_bevel_list_3D_* funcs, at a minimum these must
+ * fill in the bezp->quat and bezp->dir values */
+
+/* correct non-cyclic cases by copying direction and rotation
+ * values onto the first & last end-points */
+static void bevel_list_cyclic_fix(BevList *bl)
+{
+ BevPoint *bevp, *bevp1;
+
+ bevp= (BevPoint *)(bl+1);
+ bevp1= bevp+1;
+ QUATCOPY(bevp->quat, bevp1->quat);
+ VECCOPY(bevp->dir, bevp1->dir);
+ VECCOPY(bevp->tan, bevp1->tan);
+ bevp= (BevPoint *)(bl+1);
+ bevp+= (bl->nr-1);
+ bevp1= bevp-1;
+ QUATCOPY(bevp->quat, bevp1->quat);
+ VECCOPY(bevp->dir, bevp1->dir);
+ VECCOPY(bevp->tan, bevp1->tan);
+}
+/* utility for make_bevel_list_3D_* funcs */
+static void bevel_list_calc_bisect(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0;
+ int nr;
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+ /* totally simple */
+ VecBisect3(bevp1->dir, bevp0->vec, bevp1->vec, bevp2->vec);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+}
+static void bevel_list_flip_tangents(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0;
+ int nr;
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+ if(RAD2DEG(VecAngle2(bevp0->tan, bevp1->tan)) > 90)
+ VecNegf(bevp1->tan);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+}
+/* apply user tilt */
+static void bevel_list_apply_tilt(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0;
+ int nr;
+ float q[4];
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+ AxisAngleToQuat(q, bevp1->dir, bevp1->alfa);
+ QuatMul(bevp1->quat, q, bevp1->quat);
+ NormalQuat(bevp1->quat);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+}
+/* smooth quats, this function should be optimized, it can get slow with many iterations. */
+static void bevel_list_smooth(BevList *bl, int smooth_iter)
+{
+ BevPoint *bevp2, *bevp1, *bevp0;
+ int nr;
+
+ float q[4];
+ float bevp0_quat[4];
+ int a;
+
+ for(a=0; a < smooth_iter; a++) {
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+
+ if(bl->poly== -1) { /* check its not cyclic */
+ /* skip the first point */
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ nr--;
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ nr--;
+
+ }
+
+ QUATCOPY(bevp0_quat, bevp0->quat);
+
+ while(nr--) {
+ /* interpolate quats */
+ float zaxis[3] = {0,0,1}, cross[3], q2[4];
+ QuatInterpol(q, bevp0_quat, bevp2->quat, 0.5);
+ NormalQuat(q);
+
+ QuatMulVecf(q, zaxis);
+ Crossf(cross, zaxis, bevp1->dir);
+ AxisAngleToQuat(q2, cross, NormalizedVecAngle2(zaxis, bevp1->dir));
+ NormalQuat(q2);
+
+ QUATCOPY(bevp0_quat, bevp1->quat);
+ QuatMul(q, q2, q);
+ QuatInterpol(bevp1->quat, bevp1->quat, q, 0.5);
+ NormalQuat(bevp1->quat);
+
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+ }
+}
+
+static void make_bevel_list_3D_zup(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0; /* standard for all make_bevel_list_3D_* funcs */
+ int nr;
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+ /* totally simple */
+ VecBisect3(bevp1->dir, bevp0->vec, bevp1->vec, bevp2->vec);
+ vectoquat(bevp1->dir, 5, 1, bevp1->quat);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+}
+
+static void make_bevel_list_3D_minimum_twist(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0; /* standard for all make_bevel_list_3D_* funcs */
+ int nr;
+ float q[4];
+
+ float cross_tmp[3];
+
+ bevel_list_calc_bisect(bl);
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+
+ if(nr+4 > bl->nr) { /* first time and second time, otherwise first point adjusts last */
+ vectoquat(bevp1->dir, 5, 1, bevp1->quat);
+ }
+ else {
+ float angle= NormalizedVecAngle2(bevp0->dir, bevp1->dir);
+
+ if(angle > 0.0f) { /* otherwise we can keep as is */
+ Crossf(cross_tmp, bevp0->dir, bevp1->dir);
+ AxisAngleToQuat(q, cross_tmp, angle);
+ QuatMul(bevp1->quat, q, bevp0->quat);
}
+ else {
+ QUATCOPY(bevp1->quat, bevp0->quat);
+ }
+ }
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+
+ if(bl->poly != -1) { /* check for cyclic */
+
+ /* Need to correct for the start/end points not matching
+ * do this by calculating the tilt angle difference, then apply
+ * the rotation gradually over the entire curve
+ *
+ * note that the split is between last and second last, rather then first/last as youd expect.
+ *
+ * real order is like this
+ * 0,1,2,3,4 --> 1,2,3,4,0
+ *
+ * this is why we compare last with second last
+ * */
+ float vec_1[3]= {0,1,0}, vec_2[3]= {0,1,0}, angle, ang_fac, cross_tmp[3];
+
+ BevPoint *bevp_first;
+ BevPoint *bevp_last;
+
+
+ bevp_first= (BevPoint *)(bl+1);
+ bevp_first+= bl->nr-1;
+ bevp_last = bevp_first;
+ bevp_last--;
+
+ /* quats and vec's are normalized, should not need to re-normalize */
+ QuatMulVecf(bevp_first->quat, vec_1);
+ QuatMulVecf(bevp_last->quat, vec_2);
+ Normalize(vec_1);
+ Normalize(vec_2);
+
+ /* align the vector, can avoid this and it looks 98% OK but
+ * better to align the angle quat roll's before comparing */
+ {
+ Crossf(cross_tmp, bevp_last->dir, bevp_first->dir);
+ angle = NormalizedVecAngle2(bevp_first->dir, bevp_last->dir);
+ AxisAngleToQuat(q, cross_tmp, angle);
+ QuatMulVecf(q, vec_2);
}
+
+ angle= NormalizedVecAngle2(vec_1, vec_2);
+
+ /* flip rotation if needs be */
+ Crossf(cross_tmp, vec_1, vec_2);
+ Normalize(cross_tmp);
+ if(NormalizedVecAngle2(bevp_first->dir, cross_tmp) < 90/(180.0/M_PI))
+ angle = -angle;
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+ ang_fac= angle * (1.0f-((float)nr/bl->nr)); /* also works */
+
+ AxisAngleToQuat(q, bevp1->dir, ang_fac);
+ QuatMul(bevp1->quat, q, bevp1->quat);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+ }
+}
+
+static void make_bevel_list_3D_tangent(BevList *bl)
+{
+ BevPoint *bevp2, *bevp1, *bevp0; /* standard for all make_bevel_list_3D_* funcs */
+ int nr;
+
+ float bevp0_tan[3], cross_tmp[3];
+
+ bevel_list_calc_bisect(bl);
+ if(bl->poly== -1) /* check its not cyclic */
+ bevel_list_cyclic_fix(bl); // XXX - run this now so tangents will be right before doing the flipping
+ bevel_list_flip_tangents(bl);
+
+ /* correct the tangents */
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ nr= bl->nr;
+ while(nr--) {
+
+ Crossf(cross_tmp, bevp1->tan, bevp1->dir);
+ Crossf(bevp1->tan, cross_tmp, bevp1->dir);
+ Normalize(bevp1->tan);
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
+ }
+
+
+ /* now for the real twist calc */
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
+
+ VECCOPY(bevp0_tan, bevp0->tan);
+
+ nr= bl->nr;
+ while(nr--) {
+
+ /* make perpendicular, modify tan in place, is ok */
+ float cross_tmp[3];
+ float zero[3] = {0,0,0};
+
+ Crossf(cross_tmp, bevp1->tan, bevp1->dir);
+ Normalize(cross_tmp);
+ triatoquat(zero, cross_tmp, bevp1->tan, bevp1->quat); /* XXX - could be faster */
+
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
}
}
+static void make_bevel_list_3D(BevList *bl, int smooth_iter, int twist_mode)
+{
+ switch(twist_mode) {
+ case CU_TWIST_TANGENT:
+ make_bevel_list_3D_tangent(bl);
+ break;
+ case CU_TWIST_MINIMUM:
+ make_bevel_list_3D_minimum_twist(bl);
+ break;
+ default: /* CU_TWIST_Z_UP default, pre 2.49c */
+ make_bevel_list_3D_zup(bl);
+ }
+
+ if(bl->poly== -1) /* check its not cyclic */
+ bevel_list_cyclic_fix(bl);
+
+ if(smooth_iter)
+ bevel_list_smooth(bl, smooth_iter);
+
+ bevel_list_apply_tilt(bl);
+}
+
+
+
void makeBevelList(Object *ob)
{
/*
@@ -1550,9 +1920,7 @@ void makeBevelList(Object *ob)
BPoint *bp;
BevList *bl, *blnew, *blnext;
BevPoint *bevp, *bevp2, *bevp1 = NULL, *bevp0;
- float min, inp, x1, x2, y1, y2, vec[3];
- float *coord_array, *tilt_array=NULL, *radius_array=NULL, *coord_fp, *tilt_fp=NULL, *radius_fp=NULL;
- float *v1, *v2;
+ float min, inp, x1, x2, y1, y2;
struct bevelsort *sortdata, *sd, *sd1;
int a, b, nr, poly, resolu, len=0;
int do_tilt, do_radius;
@@ -1587,7 +1955,7 @@ void makeBevelList(Object *ob)
else
resolu= nu->resolu;
- if((nu->type & 7)==CU_POLY) {
+ if(nu->type == CU_POLY) {
len= nu->pntsu;
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList2");
BLI_addtail(&(cu->bev), bl);
@@ -1595,22 +1963,20 @@ void makeBevelList(Object *ob)
if(nu->flagu & CU_CYCLIC) bl->poly= 0;
else bl->poly= -1;
bl->nr= len;
- bl->flag= 0;
+ bl->dupe_nr= 0;
bevp= (BevPoint *)(bl+1);
bp= nu->bp;
while(len--) {
- bevp->x= bp->vec[0];
- bevp->y= bp->vec[1];
- bevp->z= bp->vec[2];
+ VECCOPY(bevp->vec, bp->vec);
bevp->alfa= bp->alfa;
bevp->radius= bp->radius;
- bevp->f1= SELECT;
+ bevp->split_tag= TRUE;
bevp++;
bp++;
}
}
- else if((nu->type & 7)==CU_BEZIER) {
+ else if(nu->type == CU_BEZIER) {
len= resolu*(nu->pntsu+ (nu->flagu & CU_CYCLIC) -1)+1; /* in case last point is not cyclic */
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelBPoints");
@@ -1631,139 +1997,81 @@ void makeBevelList(Object *ob)
bezt++;
}
- coord_array= coord_fp= MEM_mallocN(3*sizeof(float)*(resolu+1), "makeBevelCoords");
-
- if(do_tilt)
- tilt_array= tilt_fp= MEM_callocN(sizeof(float)*(resolu+1), "makeBevelTilt");
-
- if (do_radius)
- radius_array= radius_fp= MEM_callocN(sizeof(float)*(resolu+1), "nakeBevelRadius");
-
while(a--) {
if(prevbezt->h2==HD_VECT && bezt->h1==HD_VECT) {
-
- bevp->x= prevbezt->vec[1][0];
- bevp->y= prevbezt->vec[1][1];
- bevp->z= prevbezt->vec[1][2];
+
+ VECCOPY(bevp->vec, prevbezt->vec[1]);
bevp->alfa= prevbezt->alfa;
bevp->radius= prevbezt->radius;
- bevp->f1= SELECT;
- bevp->f2= 0;
+ bevp->split_tag= TRUE;
+ bevp->dupe_tag= FALSE;
bevp++;
bl->nr++;
- bl->flag= 1;
+ bl->dupe_nr= 1;
}
else {
- v1= prevbezt->vec[1];
- v2= bezt->vec[0];
-
/* always do all three, to prevent data hanging around */
- forward_diff_bezier(v1[0], v1[3], v2[0], v2[3], coord_array, resolu, 3);
- forward_diff_bezier(v1[1], v1[4], v2[1], v2[4], coord_array+1, resolu, 3);
- forward_diff_bezier(v1[2], v1[5], v2[2], v2[5], coord_array+2, resolu, 3);
+ int j;
- if (do_tilt || do_radius)
- alfa_bezpart(prevbezt, bezt, nu, tilt_array, radius_array, resolu);
+ /* BevPoint must stay aligned to 4 so sizeof(BevPoint)/sizeof(float) works */
+ for(j=0; j<3; j++) {
+ forward_diff_bezier( prevbezt->vec[1][j], prevbezt->vec[2][j],
+ bezt->vec[0][j], bezt->vec[1][j],
+ &(bevp->vec[j]), resolu, sizeof(BevPoint));
+ }
+
+ /* if both arrays are NULL do nothiong */
+ alfa_bezpart( prevbezt, bezt, nu,
+ do_tilt ? &bevp->alfa : NULL,
+ do_radius ? &bevp->radius : NULL,
+ resolu, sizeof(BevPoint));
+
+ if(cu->twist_mode==CU_TWIST_TANGENT) {
+ forward_diff_bezier_cotangent(
+ prevbezt->vec[1], prevbezt->vec[2],
+ bezt->vec[0], bezt->vec[1],
+ bevp->tan, resolu, sizeof(BevPoint));
+ }
+
/* indicate with handlecodes double points */
if(prevbezt->h1==prevbezt->h2) {
- if(prevbezt->h1==0 || prevbezt->h1==HD_VECT) bevp->f1= SELECT;
+ if(prevbezt->h1==0 || prevbezt->h1==HD_VECT) bevp->split_tag= TRUE;
}
else {
- if(prevbezt->h1==0 || prevbezt->h1==HD_VECT) bevp->f1= SELECT;
- else if(prevbezt->h2==0 || prevbezt->h2==HD_VECT) bevp->f1= SELECT;
- }
-
- nr= resolu;
-
- coord_fp = coord_array;
- tilt_fp = tilt_array;
- radius_fp = radius_array;
-
- while(nr--) {
- bevp->x= coord_fp[0];
- bevp->y= coord_fp[1];
- bevp->z= coord_fp[2];
- coord_fp+=3;
-
- if (do_tilt) {
- bevp->alfa= *tilt_fp;
- tilt_fp++;
- }
-
- if (do_radius) {
- bevp->radius= *radius_fp;
- radius_fp++;
- }
- bevp++;
+ if(prevbezt->h1==0 || prevbezt->h1==HD_VECT) bevp->split_tag= TRUE;
+ else if(prevbezt->h2==0 || prevbezt->h2==HD_VECT) bevp->split_tag= TRUE;
}
bl->nr+= resolu;
-
+ bevp+= resolu;
}
prevbezt= bezt;
bezt++;
}
- MEM_freeN(coord_array);
- if (do_tilt) MEM_freeN(tilt_array);
- if (do_radius) MEM_freeN(radius_array);
- coord_array = tilt_array = radius_array = NULL;
-
if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic: endpoint */
- bevp->x= prevbezt->vec[1][0];
- bevp->y= prevbezt->vec[1][1];
- bevp->z= prevbezt->vec[1][2];
+ VECCOPY(bevp->vec, prevbezt->vec[1]);
bevp->alfa= prevbezt->alfa;
bevp->radius= prevbezt->radius;
bl->nr++;
}
}
- else if((nu->type & 7)==CU_NURBS) {
+ else if(nu->type == CU_NURBS) {
if(nu->pntsv==1) {
len= (resolu*SEGMENTSU(nu));
bl= MEM_callocN(sizeof(BevList)+len*sizeof(BevPoint), "makeBevelList3");
BLI_addtail(&(cu->bev), bl);
bl->nr= len;
- bl->flag= 0;
+ bl->dupe_nr= 0;
if(nu->flagu & CU_CYCLIC) bl->poly= 0;
else bl->poly= -1;
bevp= (BevPoint *)(bl+1);
-
- coord_array= coord_fp= MEM_callocN(3*sizeof(float)*len, "makeBevelCoords"); /* has to be zero-ed */
-
- if(do_tilt)
- tilt_array= tilt_fp= MEM_callocN(sizeof(float)*len, "makeBevelTilt");
- if (do_radius)
- radius_array= radius_fp= MEM_callocN(sizeof(float)*len, "nakeBevelRadius");
-
- makeNurbcurve(nu, coord_array, tilt_array, radius_array, resolu);
-
- while(len--) {
- bevp->x= coord_fp[0];
- bevp->y= coord_fp[1];
- bevp->z= coord_fp[2];
- coord_fp+=3;
-
- if (do_tilt) {
- bevp->alfa= *tilt_fp;
- tilt_fp++;
- }
-
- if (do_radius) {
- bevp->radius= *radius_fp;
- radius_fp++;
- }
-
-
- bevp->f1= bevp->f2= 0;
- bevp++;
- }
- MEM_freeN(coord_array);
- if (do_tilt) MEM_freeN(tilt_array);
- if (do_radius) MEM_freeN(radius_array);
- coord_array = tilt_array = radius_array = NULL;
+ makeNurbcurve( nu, &bevp->vec[0],
+ do_tilt ? &bevp->alfa : NULL,
+ do_radius ? &bevp->radius : NULL,
+ resolu, sizeof(BevPoint));
}
}
}
@@ -1779,11 +2087,11 @@ void makeBevelList(Object *ob)
bevp0= bevp1+(nr-1);
nr--;
while(nr--) {
- if( fabs(bevp0->x-bevp1->x)<0.00001 ) {
- if( fabs(bevp0->y-bevp1->y)<0.00001 ) {
- if( fabs(bevp0->z-bevp1->z)<0.00001 ) {
- bevp0->f2= SELECT;
- bl->flag++;
+ if( fabs(bevp0->vec[0]-bevp1->vec[0])<0.00001 ) {
+ if( fabs(bevp0->vec[1]-bevp1->vec[1])<0.00001 ) {
+ if( fabs(bevp0->vec[2]-bevp1->vec[2])<0.00001 ) {
+ bevp0->dupe_tag= TRUE;
+ bl->dupe_nr++;
}
}
}
@@ -1796,8 +2104,8 @@ void makeBevelList(Object *ob)
bl= cu->bev.first;
while(bl) {
blnext= bl->next;
- if(bl->nr && bl->flag) {
- nr= bl->nr- bl->flag+1; /* +1 because vectorbezier sets flag too */
+ if(bl->nr && bl->dupe_nr) {
+ nr= bl->nr- bl->dupe_nr+1; /* +1 because vectorbezier sets flag too */
blnew= MEM_mallocN(sizeof(BevList)+nr*sizeof(BevPoint), "makeBevelList4");
memcpy(blnew, bl, sizeof(BevList));
blnew->nr= 0;
@@ -1807,7 +2115,7 @@ void makeBevelList(Object *ob)
bevp1= (BevPoint *)(blnew+1);
nr= bl->nr;
while(nr--) {
- if(bevp0->f2==0) {
+ if(bevp0->dupe_tag==0) {
memcpy(bevp1, bevp0, sizeof(BevPoint));
bevp1++;
blnew->nr++;
@@ -1815,19 +2123,19 @@ void makeBevelList(Object *ob)
bevp0++;
}
MEM_freeN(bl);
- blnew->flag= 0;
+ blnew->dupe_nr= 0;
}
bl= blnext;
}
- /* STEP 3: COUNT POLYS TELLEN AND AUTOHOLE */
+ /* STEP 3: POLYS COUNT AND AUTOHOLE */
bl= cu->bev.first;
poly= 0;
while(bl) {
if(bl->nr && bl->poly>=0) {
poly++;
bl->poly= poly;
- bl->gat= 0; /* 'gat' is dutch for hole */
+ bl->hole= 0;
}
bl= bl->next;
}
@@ -1844,8 +2152,8 @@ void makeBevelList(Object *ob)
bevp= (BevPoint *)(bl+1);
nr= bl->nr;
while(nr--) {
- if(min>bevp->x) {
- min= bevp->x;
+ if(min>bevp->vec[0]) {
+ min= bevp->vec[0];
bevp1= bevp;
}
bevp++;
@@ -1860,8 +2168,7 @@ void makeBevelList(Object *ob)
if(bevp1== bevp) bevp2= (BevPoint *)(bl+1);
else bevp2= bevp1+1;
- inp= (bevp1->x- bevp0->x)*(bevp0->y- bevp2->y)
- +(bevp0->y- bevp1->y)*(bevp0->x- bevp2->x);
+ inp= (bevp1->vec[0]- bevp0->vec[0]) * (bevp0->vec[1]- bevp2->vec[1]) + (bevp0->vec[1]- bevp1->vec[1]) * (bevp0->vec[0]- bevp2->vec[0]);
if(inp>0.0) sd->dir= 1;
else sd->dir= 0;
@@ -1879,7 +2186,7 @@ void makeBevelList(Object *ob)
sd1= sortdata+ (a-1);
for(b=a-1; b>=0; b--, sd1--) { /* all polys to the left */
if(bevelinside(sd1->bl, bl)) {
- bl->gat= 1- sd1->bl->gat;
+ bl->hole= 1- sd1->bl->hole;
break;
}
}
@@ -1889,7 +2196,7 @@ void makeBevelList(Object *ob)
if((cu->flag & CU_3D)==0) {
sd= sortdata;
for(a=0; a<poly; a++, sd++) {
- if(sd->bl->gat==sd->dir) {
+ if(sd->bl->hole==sd->dir) {
bl= sd->bl;
bevp1= (BevPoint *)(bl+1);
bevp2= bevp1+ (bl->nr-1);
@@ -1905,104 +2212,90 @@ void makeBevelList(Object *ob)
MEM_freeN(sortdata);
}
- /* STEP 4: COSINES */
- bl= cu->bev.first;
- while(bl) {
-
- if(bl->nr==2) { /* 2 pnt, treat separate */
- bevp2= (BevPoint *)(bl+1);
- bevp1= bevp2+1;
+ /* STEP 4: 2D-COSINES or 3D ORIENTATION */
+ if((cu->flag & CU_3D)==0) { /* 3D */
+ bl= cu->bev.first;
+ while(bl) {
- x1= bevp1->x- bevp2->x;
- y1= bevp1->y- bevp2->y;
+ if(bl->nr < 2) {
+ /* do nothing */
+ }
+ else if(bl->nr==2) { /* 2 pnt, treat separate */
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+1;
- calc_bevel_sin_cos(x1, y1, -x1, -y1, &(bevp1->sina), &(bevp1->cosa));
- bevp2->sina= bevp1->sina;
- bevp2->cosa= bevp1->cosa;
+ x1= bevp1->vec[0]- bevp2->vec[0];
+ y1= bevp1->vec[1]- bevp2->vec[1];
- if(cu->flag & CU_3D) { /* 3D */
- float quat[4], q[4];
-
- vec[0]= bevp1->x - bevp2->x;
- vec[1]= bevp1->y - bevp2->y;
- vec[2]= bevp1->z - bevp2->z;
-
- vectoquat(vec, 5, 1, quat);
-
- Normalize(vec);
- q[0]= (float)cos(0.5*bevp1->alfa);
- x1= (float)sin(0.5*bevp1->alfa);
- q[1]= x1*vec[0];
- q[2]= x1*vec[1];
- q[3]= x1*vec[2];
- QuatMul(quat, q, quat);
-
- QuatToMat3(quat, bevp1->mat);
- Mat3CpyMat3(bevp2->mat, bevp1->mat);
+ calc_bevel_sin_cos(x1, y1, -x1, -y1, &(bevp1->sina), &(bevp1->cosa));
+ bevp2->sina= bevp1->sina;
+ bevp2->cosa= bevp1->cosa;
}
+ else {
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+(bl->nr-1);
+ bevp0= bevp1-1;
- }
- else if(bl->nr>2) {
- bevp2= (BevPoint *)(bl+1);
- bevp1= bevp2+(bl->nr-1);
- bevp0= bevp1-1;
+ nr= bl->nr;
+ while(nr--) {
+ x1= bevp1->vec[0]- bevp0->vec[0];
+ x2= bevp1->vec[0]- bevp2->vec[0];
+ y1= bevp1->vec[1]- bevp0->vec[1];
+ y2= bevp1->vec[1]- bevp2->vec[1];
-
- nr= bl->nr;
-
- while(nr--) {
-
- if(cu->flag & CU_3D) { /* 3D */
- float quat[4], q[4];
-
- vec[0]= bevp2->x - bevp0->x;
- vec[1]= bevp2->y - bevp0->y;
- vec[2]= bevp2->z - bevp0->z;
-
- Normalize(vec);
+ calc_bevel_sin_cos(x1, y1, x2, y2, &(bevp1->sina), &(bevp1->cosa));
- vectoquat(vec, 5, 1, quat);
-
- q[0]= (float)cos(0.5*bevp1->alfa);
- x1= (float)sin(0.5*bevp1->alfa);
- q[1]= x1*vec[0];
- q[2]= x1*vec[1];
- q[3]= x1*vec[2];
- QuatMul(quat, q, quat);
-
- QuatToMat3(quat, bevp1->mat);
+ bevp0= bevp1;
+ bevp1= bevp2;
+ bevp2++;
}
-
- x1= bevp1->x- bevp0->x;
- x2= bevp1->x- bevp2->x;
- y1= bevp1->y- bevp0->y;
- y2= bevp1->y- bevp2->y;
-
- calc_bevel_sin_cos(x1, y1, x2, y2, &(bevp1->sina), &(bevp1->cosa));
-
-
- bevp0= bevp1;
- bevp1= bevp2;
- bevp2++;
- }
- /* correct non-cyclic cases */
- if(bl->poly== -1) {
- if(bl->nr>2) {
+
+ /* correct non-cyclic cases */
+ if(bl->poly== -1) {
bevp= (BevPoint *)(bl+1);
bevp1= bevp+1;
bevp->sina= bevp1->sina;
bevp->cosa= bevp1->cosa;
- Mat3CpyMat3(bevp->mat, bevp1->mat);
bevp= (BevPoint *)(bl+1);
bevp+= (bl->nr-1);
bevp1= bevp-1;
bevp->sina= bevp1->sina;
bevp->cosa= bevp1->cosa;
- Mat3CpyMat3(bevp->mat, bevp1->mat);
}
}
+ bl= bl->next;
+ }
+ }
+ else { /* 3D Curves */
+ bl= cu->bev.first;
+ while(bl) {
+
+ if(bl->nr < 2) {
+ /* do nothing */
+ }
+ else if(bl->nr==2) { /* 2 pnt, treat separate */
+ float q[4];
+
+ bevp2= (BevPoint *)(bl+1);
+ bevp1= bevp2+1;
+
+ /* simple quat/dir */
+ VecSubf(bevp1->dir, bevp1->vec, bevp2->vec);
+ Normalize(bevp1->dir);
+
+ vectoquat(bevp1->dir, 5, 1, bevp1->quat);
+
+ AxisAngleToQuat(q, bevp1->dir, bevp1->alfa);
+ QuatMul(bevp1->quat, q, bevp1->quat);
+ NormalQuat(bevp1->quat);
+ VECCOPY(bevp2->dir, bevp1->dir);
+ QUATCOPY(bevp2->quat, bevp1->quat);
+ }
+ else {
+ make_bevel_list_3D(bl, (int)(resolu*cu->twist_smooth), cu->twist_mode);
+ }
+ bl= bl->next;
}
- bl= bl->next;
}
}
@@ -2207,7 +2500,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */
BezTriple *bezt, *prev, *next;
short a;
- if((nu->type & 7)!=CU_BEZIER) return;
+ if(nu->type != CU_BEZIER) return;
if(nu->pntsu<2) return;
a= nu->pntsu;
@@ -2242,7 +2535,7 @@ void testhandlesNurb(Nurb *nu)
BezTriple *bezt;
short flag, a;
- if((nu->type & 7)!=CU_BEZIER) return;
+ if(nu->type != CU_BEZIER) return;
bezt= nu->bezt;
a= nu->pntsu;
@@ -2370,7 +2663,7 @@ void sethandlesNurb(ListBase *editnurb, short code)
if(code==1 || code==2) {
nu= editnurb->first;
while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -2400,7 +2693,7 @@ void sethandlesNurb(ListBase *editnurb, short code)
} else {
/* Toggle */
while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -2417,7 +2710,7 @@ void sethandlesNurb(ListBase *editnurb, short code)
}
nu= editnurb->first;
while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -2465,7 +2758,7 @@ void switchdirectionNurb(Nurb *nu)
if(nu->pntsu==1 && nu->pntsv==1) return;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt1= nu->bezt;
bezt2= bezt1+(a-1);
@@ -2504,7 +2797,7 @@ void switchdirectionNurb(Nurb *nu)
bp1++;
bp2--;
}
- if((nu->type & 7)==CU_NURBS) {
+ if(nu->type == CU_NURBS) {
/* inverse knots */
a= KNOTSU(nu);
fp1= nu->knotsu;
@@ -2567,7 +2860,7 @@ float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
co = cos[0];
for (nu=lb->first; nu; nu=nu->next) {
- if ((nu->type & 7)==CU_BEZIER) {
+ if (nu->type == CU_BEZIER) {
BezTriple *bezt = nu->bezt;
for (i=0; i<nu->pntsu; i++,bezt++) {
@@ -2594,7 +2887,7 @@ void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
int i;
for (nu=lb->first; nu; nu=nu->next) {
- if ((nu->type & 7)==CU_BEZIER) {
+ if (nu->type == CU_BEZIER) {
BezTriple *bezt = nu->bezt;
for (i=0; i<nu->pntsu; i++,bezt++) {
@@ -2616,7 +2909,7 @@ int check_valid_nurb_u( struct Nurb *nu )
{
if (nu==NULL) return 0;
if (nu->pntsu <= 1) return 0;
- if ((nu->type & 7)!=CU_NURBS) return 1; /* not a nurb, lets assume its valid */
+ if (nu->type != CU_NURBS) return 1; /* not a nurb, lets assume its valid */
if (nu->pntsu < nu->orderu) return 0;
if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagu>>1) & 2)) { /* Bezier U Endpoints */
@@ -2630,7 +2923,7 @@ int check_valid_nurb_v( struct Nurb *nu)
{
if (nu==NULL) return 0;
if (nu->pntsv <= 1) return 0;
- if ((nu->type & 7)!=CU_NURBS) return 1; /* not a nurb, lets assume its valid */
+ if (nu->type != CU_NURBS) return 1; /* not a nurb, lets assume its valid */
if (nu->pntsv < nu->orderv) return 0;
if (((nu->flag & CU_CYCLIC)==0) && ((nu->flagv>>1) & 2)) { /* Bezier V Endpoints */
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index b57b8b7a6da..4c2b2f3ec12 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -39,6 +39,7 @@
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
+#include "DNA_boid_types.h"
#include "DNA_curve_types.h"
#include "DNA_camera_types.h"
#include "DNA_ID.h"
@@ -60,6 +61,7 @@
#include "DNA_space_types.h"
#include "DNA_view2d_types.h"
#include "DNA_view3d_types.h"
+#include "DNA_windowmanager_types.h"
#include "BLI_ghash.h"
@@ -76,6 +78,7 @@
#include "BKE_pointcache.h"
#include "BKE_utildefines.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "MEM_guardedalloc.h"
@@ -555,60 +558,81 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
GroupObject *go;
for(; psys; psys=psys->next) {
+ BoidRule *rule = NULL;
+ BoidState *state = NULL;
+ ParticleSimulationData sim = {scene, ob, psys, NULL};
ParticleSettings *part= psys->part;
dag_add_relation(dag, node, node, DAG_RL_OB_DATA, "Particle-Object Relation");
- if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
+ if(!psys_check_enabled(ob, psys))
continue;
- if(part->phystype==PART_PHYS_KEYED && psys->keyed_ob &&
- BLI_findlink(&psys->keyed_ob->particlesystem,psys->keyed_psys-1)) {
- node2 = dag_get_node(dag, psys->keyed_ob);
- dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA, "Particle Keyed Physics");
+ if(ELEM(part->phystype,PART_PHYS_KEYED,PART_PHYS_BOIDS)) {
+ ParticleTarget *pt = psys->targets.first;
+
+ for(; pt; pt=pt->next) {
+ if(pt->ob && BLI_findlink(&pt->ob->particlesystem, pt->psys-1)) {
+ node2 = dag_get_node(dag, pt->ob);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Particle Targets");
+ }
+ }
}
- if(part->draw_as == PART_DRAW_OB && part->dup_ob) {
+ if(part->ren_as == PART_DRAW_OB && part->dup_ob) {
node2 = dag_get_node(dag, part->dup_ob);
dag_add_relation(dag, node, node2, DAG_RL_OB_OB, "Particle Object Visualisation");
if(part->dup_ob->type == OB_MBALL)
dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA, "Particle Object Visualisation");
}
- if(part->draw_as == PART_DRAW_GR && part->dup_group) {
+ if(part->ren_as == PART_DRAW_GR && part->dup_group) {
for(go=part->dup_group->gobject.first; go; go=go->next) {
node2 = dag_get_node(dag, go->ob);
dag_add_relation(dag, node, node2, DAG_RL_OB_OB, "Particle Group Visualisation");
}
}
- if(psys->effectors.first)
- psys_end_effectors(psys);
- psys_init_effectors(scene, ob, psys->part->eff_group, psys);
+ psys_update_effectors(&sim, 0.0, 0);
- if(psys->effectors.first) {
- for(nec= psys->effectors.first; nec; nec= nec->next) {
- Object *ob1= nec->ob;
+ for(nec= psys->effectors.first; nec; nec= nec->next) {
+ Object *ob1= nec->ob;
- if(nec->type & PSYS_EC_EFFECTOR) {
- node2 = dag_get_node(dag, ob1);
- if(ob1->pd->forcefield==PFIELD_GUIDE)
- dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Particle Field");
- else
- dag_add_relation(dag, node2, node, DAG_RL_OB_DATA, "Particle Field");
- }
- else if(nec->type & PSYS_EC_DEFLECT) {
- node2 = dag_get_node(dag, ob1);
- dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Particle Collision");
- }
- else if(nec->type & PSYS_EC_PARTICLE) {
- node2 = dag_get_node(dag, ob1);
- dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA, "Particle Field");
- }
-
- if(nec->type & PSYS_EC_REACTOR) {
- node2 = dag_get_node(dag, ob1);
- dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA, "Particle Reactor");
+ if(nec->type & PSYS_EC_EFFECTOR) {
+ node2 = dag_get_node(dag, ob1);
+ if(ob1->pd->forcefield==PFIELD_GUIDE)
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Particle Field");
+ else
+ dag_add_relation(dag, node2, node, DAG_RL_OB_DATA, "Particle Field");
+ }
+ else if(nec->type & PSYS_EC_DEFLECT) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Particle Collision");
+ }
+ else if(nec->type & PSYS_EC_PARTICLE) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA, "Particle Field");
+ }
+
+ if(nec->type & PSYS_EC_REACTOR) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA, "Particle Reactor");
+ }
+ }
+
+ if(part->boids) {
+ for(state = part->boids->states.first; state; state=state->next) {
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ Object *ruleob = NULL;
+ if(rule->type==eBoidRuleType_Avoid)
+ ruleob = ((BoidRuleGoalAvoid*)rule)->ob;
+ else if(rule->type==eBoidRuleType_FollowLeader)
+ ruleob = ((BoidRuleFollowLeader*)rule)->ob;
+
+ if(ruleob) {
+ node2 = dag_get_node(dag, ruleob);
+ dag_add_relation(dag, node2, node, DAG_RL_OB_DATA, "Boid Rule");
+ }
}
}
}
@@ -1975,8 +1999,6 @@ static void dag_object_time_update_flags(Object *ob)
}
}
- if(ob->scriptlink.totscript) ob->recalc |= OB_RECALC_OB;
-
if(ob->parent) {
/* motion path or bone child */
if(ob->parent->type==OB_CURVE || ob->parent->type==OB_ARMATURE) ob->recalc |= OB_RECALC_OB;
@@ -2063,7 +2085,6 @@ 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(Scene *scene, unsigned int lay)
{
@@ -2122,43 +2143,106 @@ void DAG_scene_update_flags(Scene *scene, unsigned int lay)
}
+static void dag_current_scene_layers(Main *bmain, Scene **sce, unsigned int *lay)
+{
+ wmWindowManager *wm;
+ wmWindow *win;
+
+ /* only one scene supported currently, making more scenes work
+ correctly requires changes beyond just the dependency graph */
+
+ *sce= NULL;
+ *lay= 0;
+
+ if((wm= bmain->wm.first)) {
+ /* if we have a windowmanager, look into windows */
+ for(win=wm->windows.first; win; win=win->next) {
+ if(win->screen) {
+ if(!*sce) *sce= win->screen->scene;
+ *lay |= BKE_screen_visible_layers(win->screen);
+ }
+ }
+ }
+ else {
+ /* if not, use the first sce */
+ *sce= bmain->scene.first;
+ if(*sce) *lay= (*sce)->lay;
+
+ /* XXX for background mode, we should get the scen
+ from somewhere, for the -S option, but it's in
+ the context, how to get it here? */
+ }
+}
+
+void DAG_ids_flush_update(int time)
+{
+ Main *bmain= G.main;
+ Scene *sce;
+ unsigned int lay;
+
+ dag_current_scene_layers(bmain, &sce, &lay);
+
+ if(sce)
+ DAG_scene_flush_update(sce, lay, time);
+}
-/* flag this object and all its relations to recalc */
-/* if you need to do more objects, tag object yourself and
- use DAG_scene_flush_update() in end */
-void DAG_object_flush_update(Scene *sce, Object *ob, short flag)
+void DAG_id_flush_update(ID *id, short flag)
{
-
- if(ob==NULL || sce->theDag==NULL) return;
+ Main *bmain= G.main;
+ Scene *sce;
+ Object *obt, *ob= NULL;
+ short idtype;
+ unsigned int lay;
- ob->recalc |= flag;
- BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
-
- /* all users of this ob->data should be checked */
- /* BUT! displists for curves are still only on cu */
- if(flag & OB_RECALC_DATA) {
- if(ob->type!=OB_CURVE && ob->type!=OB_SURF) {
- ID *id= ob->data;
- if(id && id->us>1) {
- /* except when there's a key and shapes are locked */
- if(ob_get_key(ob) && (ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)));
- else {
- Object *obt;
- for (obt=G.main->object.first; obt; obt= obt->id.next) {
- if (obt != ob && obt->data==ob->data) {
- obt->recalc |= OB_RECALC_DATA;
- BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
- }
- }
+ dag_current_scene_layers(bmain, &sce, &lay);
+
+ if(!id || !sce || !sce->theDag)
+ return;
+
+ /* set flags & pointcache for object */
+ if(GS(id->name) == ID_OB) {
+ ob= (Object*)id;
+ ob->recalc |= flag;
+ BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
+
+ if(flag & OB_RECALC_DATA) {
+ /* all users of this ob->data should be checked */
+ id= ob->data;
+
+ /* no point in trying in this cases */
+ if(!id || id->us <= 1)
+ id= NULL;
+ /* curves and surfaces only need to mark one object, since
+ otherwise cu->displist would be computed multiple times */
+ else if(ob->type==OB_CURVE || ob->type==OB_SURF)
+ id= NULL;
+ /* also for locked shape keys we make an exception */
+ else if(ob_get_key(ob) && (ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)))
+ id= NULL;
+ }
+ }
+
+ /* set flags & pointcache for object data */
+ if(id) {
+ idtype= GS(id->name);
+
+ if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) {
+ for(obt=bmain->object.first; obt; obt= obt->id.next) {
+ if(!(ob && obt == ob) && obt->data == id) {
+ obt->recalc |= OB_RECALC_DATA;
+ BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
+
+ /* for these we only flag one object, otherwise cu->displist
+ would be computed multiple times */
+ if(obt->type==OB_CURVE || obt->type==OB_SURF)
+ break;
}
}
}
}
-
-// XXX if(G.curscreen)
-// DAG_scene_flush_update(sce, dag_screen_view3d_layers(), 0);
-// else
- DAG_scene_flush_update(sce, sce->lay, 0);
+
+ /* flush to other objects that depend on this one */
+ DAG_scene_flush_update(sce, lay, 0);
}
/* recursively descends tree, each node only checked once */
@@ -2193,10 +2277,25 @@ static int parent_check_node(DagNode *node, int curtime)
/* all nodes that influence this object get tagged, for calculating the exact
position of this object at a given timeframe */
-void DAG_object_update_flags(Scene *sce, Object *ob, unsigned int lay)
+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)
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 736165a8a98..266a528dc57 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -315,13 +315,23 @@ static void init_fastshade_shadeinput(Render *re)
static Render *fastshade_get_render(Scene *scene)
{
- Render *re= RE_GetRender("_Shade View_");
- if(re==NULL) {
- re= RE_NewRender("_Shade View_");
-
- RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */
+ // XXX 2.5: this crashes combined with previewrender
+ // due to global R so disabled for now
+#if 0
+ /* XXX ugly global still, but we can't do preview while rendering */
+ if(G.rendering==0) {
+
+ Render *re= RE_GetRender("_Shade View_");
+ if(re==NULL) {
+ re= RE_NewRender("_Shade View_");
+
+ RE_Database_Baking(re, scene, 0, 0); /* 0= no faces */
+ }
+ return re;
}
- return re;
+#endif
+
+ return NULL;
}
/* called on file reading */
@@ -611,18 +621,20 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
void shadeMeshMCol(Scene *scene, Object *ob, Mesh *me)
{
+ Render *re= fastshade_get_render(scene);
int a;
char *cp;
unsigned int *mcol= (unsigned int*)me->mcol;
- Render *re= fastshade_get_render(scene);
- mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
- me->mcol= (MCol*)mcol;
+ if(re) {
+ mesh_create_shadedColors(re, ob, 1, &mcol, NULL);
+ me->mcol= (MCol*)mcol;
- /* swap bytes */
- for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
- SWAP(char, cp[0], cp[3]);
- SWAP(char, cp[1], cp[2]);
+ /* swap bytes */
+ for(cp= (char *)me->mcol, a= 4*me->totface; a>0; a--, cp+=4) {
+ SWAP(char, cp[0], cp[3]);
+ SWAP(char, cp[1], cp[2]);
+ }
}
}
@@ -641,6 +653,8 @@ void shadeDispList(Scene *scene, Base *base)
int a, need_orco;
re= fastshade_get_render(scene);
+ if(re==NULL)
+ return;
dl = find_displist(&ob->disp, DL_VERTCOL);
if (dl) {
@@ -807,7 +821,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
DispList *dl;
BezTriple *bezt, *prevbezt;
BPoint *bp;
- float *data, *v1, *v2;
+ float *data;
int a, len, resolu;
nu= nubase->first;
@@ -820,7 +834,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
resolu= nu->resolu;
if(!check_valid_nurb_u(nu));
- else if((nu->type & 7)==CU_BEZIER) {
+ else if(nu->type == CU_BEZIER) {
/* count */
len= 0;
@@ -872,11 +886,15 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
data+= 3;
}
else {
- v1= prevbezt->vec[1];
- v2= bezt->vec[0];
- forward_diff_bezier(v1[0], v1[3], v2[0], v2[3], data, resolu, 3);
- forward_diff_bezier(v1[1], v1[4], v2[1], v2[4], data+1, resolu, 3);
- forward_diff_bezier(v1[2], v1[5], v2[2], v2[5], data+2, resolu, 3);
+ int j;
+ for(j=0; j<3; j++) {
+ forward_diff_bezier( prevbezt->vec[1][j],
+ prevbezt->vec[2][j],
+ bezt->vec[0][j],
+ bezt->vec[1][j],
+ data+j, resolu, 3*sizeof(float));
+ }
+
data+= 3*resolu;
}
@@ -888,7 +906,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
bezt++;
}
}
- else if((nu->type & 7)==CU_NURBS) {
+ else if(nu->type == CU_NURBS) {
len= (resolu*SEGMENTSU(nu));
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
@@ -903,9 +921,9 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
data= dl->verts;
if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
- makeNurbcurve(nu, data, NULL, NULL, resolu);
+ makeNurbcurve(nu, data, NULL, NULL, resolu, 3*sizeof(float));
}
- else if((nu->type & 7)==CU_POLY) {
+ else if(nu->type == CU_POLY) {
len= nu->pntsu;
dl= MEM_callocN(sizeof(DispList), "makeDispListpoly");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
@@ -1113,7 +1131,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
}
-void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
+static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
{
if(cu->flag & CU_3D) return;
@@ -1410,7 +1428,7 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, int forRende
if(nu->flagu & CU_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
- makeNurbcurve(nu, data, NULL, NULL, nu->resolu);
+ makeNurbcurve(nu, data, NULL, NULL, nu->resolu, 3*sizeof(float));
}
else {
len= (nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv);
@@ -1525,9 +1543,9 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
bevp= (BevPoint *)(bl+1);
data= dl->verts;
while(a--) {
- data[0]= bevp->x+widfac*bevp->sina;
- data[1]= bevp->y+widfac*bevp->cosa;
- data[2]= bevp->z;
+ data[0]= bevp->vec[0]+widfac*bevp->sina;
+ data[1]= bevp->vec[1]+widfac*bevp->cosa;
+ data[2]= bevp->vec[2];
bevp++;
data+=3;
}
@@ -1567,7 +1585,7 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
fac = calc_taper(scene, cu->taperobj, a, bl->nr);
}
- if (bevp->f1) {
+ if (bevp->split_tag) {
dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
}
@@ -1581,16 +1599,16 @@ void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
vec[1]= fp1[2];
vec[2]= 0.0;
- Mat3MulVecfl(bevp->mat, vec);
+ QuatMulVecf(bevp->quat, vec);
- data[0]= bevp->x+ fac*vec[0];
- data[1]= bevp->y+ fac*vec[1];
- data[2]= bevp->z+ fac*vec[2];
+ data[0]= bevp->vec[0] + fac*vec[0];
+ data[1]= bevp->vec[1] + fac*vec[1];
+ data[2]= bevp->vec[2] + fac*vec[2];
}
else {
- data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
- data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
- data[2]= bevp->z+ fac*fp1[2];
+ data[0]= bevp->vec[0] + fac*(widfac+fp1[1])*bevp->sina;
+ data[1]= bevp->vec[1] + fac*(widfac+fp1[1])*bevp->cosa;
+ data[2]= bevp->vec[2] + fac*fp1[2];
}
}
}
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index eaa2d541638..acf906e3163 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -56,6 +56,8 @@
#include "BLI_jitter.h"
#include "BLI_rand.h"
+#include "PIL_time.h"
+
#include "BKE_action.h"
#include "BKE_anim.h" /* needed for where_on_path */
#include "BKE_armature.h"
@@ -93,6 +95,21 @@
//XXX #include "BIF_screen.h"
+PartDeflect *object_add_collision_fields(void)
+{
+ PartDeflect *pd;
+
+ pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect");
+
+ pd->pdef_sbdamp = 0.1f;
+ pd->pdef_sbift = 0.2f;
+ pd->pdef_sboft = 0.02f;
+ pd->seed = ((unsigned int)(ceil(PIL_check_seconds_timer()))+1) % 128;
+ pd->f_strength = 1.0f;
+
+ return pd;
+}
+
/* temporal struct, used for reading return of mesh_get_mapped_verts_nors() */
typedef struct VeNoCo {
@@ -241,10 +258,10 @@ static void eff_tri_ray_hit(void *userdata, int index, const BVHTreeRay *ray, BV
// get visibility of a wind ray
static float eff_calc_visibility(Scene *scene, Object *ob, float *co, float *dir)
{
- CollisionModifierData **collobjs = NULL;
+ Object **collobjs = NULL;
int numcollobj = 0, i;
float norm[3], len = 0.0;
- float visibility = 1.0;
+ float visibility = 1.0, absorption = 0.0;
collobjs = get_collisionobjects(scene, ob, &numcollobj);
@@ -258,7 +275,8 @@ static float eff_calc_visibility(Scene *scene, Object *ob, float *co, float *dir
// check all collision objects
for(i = 0; i < numcollobj; i++)
{
- CollisionModifierData *collmd = collobjs[i];
+ Object *collob= collobjs[i];
+ CollisionModifierData *collmd = (CollisionModifierData*)modifiers_findByType(collob, eModifierType_Collision);
if(collmd->bvhtree)
{
@@ -270,8 +288,10 @@ static float eff_calc_visibility(Scene *scene, Object *ob, float *co, float *dir
// check if the way is blocked
if(BLI_bvhtree_ray_cast(collmd->bvhtree, co, norm, 0.0f, &hit, eff_tri_ray_hit, NULL)>=0)
{
+ absorption= (collob->pd)? collob->pd->absorption: 0.0f;
+
// visibility is only between 0 and 1, calculated from 1-absorption
- visibility *= MAX2(0.0, MIN2(1.0, (1.0-((float)collmd->absorption)*0.01)));
+ visibility *= CLAMPIS(1.0f-absorption, 0.0f, 1.0f);
if(visibility <= 0.0f)
break;
@@ -488,6 +508,9 @@ void do_physical_effector(Scene *scene, Object *ob, float *opco, short type, flo
VecAddf(field,field,mag_vec);
break;
}
+ case PFIELD_BOID:
+ /* Boid field is handled completely in boids code. */
+ break;
}
}
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 4e7e76dfae3..8827897a509 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -334,7 +334,7 @@ static void read_stl_mesh_ascii(Scene *scene, char *str)
*/
numtenthousand = 1;
vertdata = malloc(numtenthousand*3*30000*sizeof(float)); // uses realloc!
- if (!vertdata); STLALLOCERROR;
+ if (!vertdata) { STLALLOCERROR; }
linenum = 1;
/* Get rid of the first line */
@@ -357,7 +357,7 @@ static void read_stl_mesh_ascii(Scene *scene, char *str)
++numtenthousand;
vertdata = realloc(vertdata,
numtenthousand*3*30000*sizeof(float));
- if (!vertdata); STLALLOCERROR;
+ if (!vertdata) { STLALLOCERROR; }
}
/* Don't read normal, but check line for proper syntax anyway
@@ -1415,11 +1415,6 @@ static void displist_to_mesh(Scene *scene, DispList *dlfirst)
return;
}
- if(totcol>16) {
- //XXX error("Found more than 16 different colors");
- totcol= 16;
- }
-
vec[0]= (min[0]+max[0])/2;
vec[1]= (min[1]+max[1])/2;
vec[2]= (min[2]+max[2])/2;
@@ -1433,6 +1428,7 @@ static void displist_to_mesh(Scene *scene, DispList *dlfirst)
/* colors */
if(totcol) {
ob->mat= MEM_callocN(sizeof(void *)*totcol, "ob->mat");
+ ob->matbits= MEM_callocN(sizeof(char)*totcol, "ob->matbits");
me->mat= MEM_callocN(sizeof(void *)*totcol, "me->mat");
me->totcol= totcol;
ob->totcol= (unsigned char) me->totcol;
@@ -1482,7 +1478,7 @@ static void displist_to_mesh(Scene *scene, DispList *dlfirst)
dl= dlfirst;
while(dl) {
- colnr= (dl->col>15 ? 15: dl->col);
+ colnr= dl->col;
if(colnr) colnr--;
if(dl->type==DL_SURF) {
@@ -1691,7 +1687,7 @@ static void displist_to_objects(Scene *scene, ListBase *lbase)
if(totvert==0) {
- if(ivsurf==0) ; //XXX error("Found no data");
+ if(ivsurf==0) {}; //XXX error("Found no data");
if(lbase->first) BLI_freelistN(lbase);
return;
@@ -1904,16 +1900,15 @@ void write_stl(Scene *scene, char *str)
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
if(BLI_testextensie(str,".stl")==0) strcat(str, ".stl");
- if (!during_script()) {
- if (BLI_exists(str))
- ; //XXX if(saveover(str)==0)
- //XXX return;
+ if (BLI_exists(str)) {
+ ; //XXX if(saveover(str)==0)
+ //XXX return;
}
fpSTL= fopen(str, "wb");
if(fpSTL==NULL) {
- if (!during_script()) ; //XXX error("Can't write file");
+ //XXX error("Can't write file");
return;
}
strcpy(temp_dir, str);
@@ -2237,11 +2232,11 @@ void write_vrml(Scene *scene, char *str)
if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
if(BLI_testextensie(str,".wrl")==0) strcat(str, ".wrl");
- //XXX saveover() if(!during_script() && saveover(str)==0) return;
+ //XXX saveover() if(saveover(str)==0) return;
fp= fopen(str, "w");
- if(fp==NULL && !during_script()) {
+ if(fp==NULL) {
//XXX error("Can't write file");
return;
}
@@ -2548,15 +2543,15 @@ void write_dxf(struct Scene *scene, char *str)
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
if(BLI_testextensie(str,".dxf")==0) strcat(str, ".dxf");
- if (!during_script()) {
- if (BLI_exists(str))
- ; //XXX if(saveover(str)==0)
- // return;
+
+ if (BLI_exists(str)) {
+ ; //XXX if(saveover(str)==0)
+ // return;
}
fp= fopen(str, "w");
- if(fp==NULL && !during_script()) {
+ if(fp==NULL) {
//XXX error("Can't write file");
return;
}
@@ -2804,8 +2799,11 @@ static void dxf_add_mat (Object *ob, Mesh *me, float color[3], char *layer)
if (!me) return;
- if(ob) ob->mat= MEM_callocN(sizeof(void *)*1, "ob->mat");
- if(ob) ob->actcol= 1;
+ if(ob) {
+ ob->mat= MEM_callocN(sizeof(void *)*1, "ob->mat");
+ ob->matbits= MEM_callocN(sizeof(char)*1, "ob->matbits");
+ ob->actcol= 1;
+ }
me->totcol= 1;
me->mat= MEM_callocN(sizeof(void *)*1, "me->mat");
@@ -4053,7 +4051,6 @@ static void dxf_read(Scene *scene, char *filename)
ob->type= OB_MESH;
ob->dt= OB_SHADED;
- if(U.flag & USER_MAT_ON_OB) ob->colbits= -1;
ob->trackflag= OB_POSY;
ob->upflag= OB_POSZ;
@@ -4072,9 +4069,10 @@ static void dxf_read(Scene *scene, char *filename)
VECCOPY(ob->rot, obrot);
ob->mat= MEM_callocN(sizeof(void *)*1, "ob->mat");
+ ob->matbits= MEM_callocN(sizeof(char)*1, "ob->matbits");
ob->totcol= (unsigned char) ((Mesh*)ob->data)->totcol;
ob->actcol= 1;
-
+
/* note: materials are either linked to mesh or object, if both then
you have to increase user counts. below line is not needed.
I leave it commented out here as warning (ton) */
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index ad8115ba9aa..0ecd1fe912b 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1,5 +1,30 @@
-/* Testing code for new animation system in 2.5
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
@@ -31,7 +56,7 @@
#include "RNA_types.h"
#ifndef DISABLE_PYTHON
-#include "BPY_extern.h" /* for BPY_pydriver_eval() */
+#include "BPY_extern.h"
#endif
#define SMALL -1.0e-10
@@ -59,7 +84,7 @@ void free_fcurve (FCurve *fcu)
/* free extra data - i.e. modifiers, and driver */
fcurve_free_driver(fcu);
- fcurve_free_modifiers(fcu);
+ free_fmodifiers(&fcu->modifiers);
/* free f-curve itself */
MEM_freeN(fcu);
@@ -115,7 +140,7 @@ FCurve *copy_fcurve (FCurve *fcu)
fcu_d->driver= fcurve_copy_driver(fcu_d->driver);
/* copy modifiers */
- fcurve_copy_modifiers(&fcu_d->modifiers, &fcu->modifiers);
+ copy_fmodifiers(&fcu_d->modifiers, &fcu->modifiers);
/* return new data */
return fcu_d;
@@ -175,18 +200,83 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array
return NULL;
}
-short on_keyframe_fcurve(FCurve *fcu, float cfra)
-{
- BezTriple *bezt;
- unsigned i;
+/* threshold for binary-searching keyframes - threshold here should be good enough for now, but should become userpref */
+#define BEZT_BINARYSEARCH_THRESH 0.00001f
- bezt= fcu->bezt;
- for (i=0; i<fcu->totvert; i++, bezt++) {
- if (IS_EQ(bezt->vec[1][0], cfra))
- return 1;
+/* Binary search algorithm for finding where to insert BezTriple. (for use by insert_bezt_fcurve)
+ * Returns the index to insert at (data already at that index will be offset if replace is 0)
+ */
+int binarysearch_bezt_index (BezTriple array[], float frame, int arraylen, short *replace)
+{
+ int start=0, end=arraylen;
+ int loopbreaker= 0, maxloop= arraylen * 2;
+
+ /* initialise replace-flag first */
+ *replace= 0;
+
+ /* sneaky optimisations (don't go through searching process if...):
+ * - keyframe to be added is to be added out of current bounds
+ * - keyframe to be added would replace one of the existing ones on bounds
+ */
+ if ((arraylen <= 0) || (array == NULL)) {
+ printf("Warning: binarysearch_bezt_index() encountered invalid array \n");
+ return 0;
+ }
+ else {
+ /* check whether to add before/after/on */
+ float framenum;
+
+ /* 'First' Keyframe (when only one keyframe, this case is used) */
+ framenum= array[0].vec[1][0];
+ if (IS_EQT(frame, framenum, BEZT_BINARYSEARCH_THRESH)) {
+ *replace = 1;
+ return 0;
+ }
+ else if (frame < framenum)
+ return 0;
+
+ /* 'Last' Keyframe */
+ framenum= array[(arraylen-1)].vec[1][0];
+ if (IS_EQT(frame, framenum, BEZT_BINARYSEARCH_THRESH)) {
+ *replace= 1;
+ return (arraylen - 1);
+ }
+ else if (frame > framenum)
+ return arraylen;
}
- return 0;
+
+ /* most of the time, this loop is just to find where to put it
+ * 'loopbreaker' is just here to prevent infinite loops
+ */
+ for (loopbreaker=0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) {
+ /* compute and get midpoint */
+ int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */
+ float midfra= array[mid].vec[1][0];
+
+ /* check if exactly equal to midpoint */
+ if (IS_EQT(frame, midfra, BEZT_BINARYSEARCH_THRESH)) {
+ *replace = 1;
+ return mid;
+ }
+
+ /* repeat in upper/lower half */
+ if (frame > midfra)
+ start= mid + 1;
+ else if (frame < midfra)
+ end= mid - 1;
+ }
+
+ /* print error if loop-limit exceeded */
+ if (loopbreaker == (maxloop-1)) {
+ printf("Error: binarysearch_bezt_index() was taking too long \n");
+
+ // include debug info
+ printf("\tround = %d: start = %d, end = %d, arraylen = %d \n", loopbreaker, start, end, arraylen);
+ }
+
+ /* not found, so return where to place it */
+ return start;
}
/* Calculate the extents of F-Curve's data */
@@ -687,19 +777,19 @@ float driver_get_target_value (ChannelDriver *driver, DriverTarget *dtar)
if (RNA_path_resolve(&id_ptr, path, &ptr, &prop)) {
switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(&ptr, prop))
value= (float)RNA_property_boolean_get_index(&ptr, prop, index);
else
value= (float)RNA_property_boolean_get(&ptr, prop);
break;
case PROP_INT:
- if (RNA_property_array_length(prop))
+ 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);
break;
case PROP_FLOAT:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(&ptr, prop))
value= RNA_property_float_get_index(&ptr, prop, index);
else
value= RNA_property_float_get(&ptr, prop);
@@ -711,6 +801,8 @@ float driver_get_target_value (ChannelDriver *driver, DriverTarget *dtar)
break;
}
}
+ else if (G.f & G_DEBUG)
+ printf("Driver Evaluation Error: cannot resolve target for %s -> %s \n", id->name, path);
return value;
}
@@ -903,7 +995,7 @@ void correct_bezpart (float *v1, float *v2, float *v3, float *v4)
}
/* find root ('zero') */
-int findzero (float x, float q0, float q1, float q2, float q3, float *o)
+static int findzero (float x, float q0, float q1, float q2, float q3, float *o)
{
double c0, c1, c2, c3, a, b, c, p, q, d, t, phi;
int nr= 0;
@@ -997,7 +1089,7 @@ int findzero (float x, float q0, float q1, float q2, float q3, float *o)
}
}
-void berekeny (float f1, float f2, float f3, float f4, float *o, int b)
+static void berekeny (float f1, float f2, float f3, float f4, float *o, int b)
{
float t, c0, c1, c2, c3;
int a;
@@ -1013,7 +1105,8 @@ void berekeny (float f1, float f2, float f3, float f4, float *o, int b)
}
}
-void berekenx (float *f, float *o, int b)
+#if 0
+static void berekenx (float *f, float *o, int b)
{
float t, c0, c1, c2, c3;
int a;
@@ -1028,6 +1121,7 @@ void berekenx (float *f, float *o, int b)
o[a]= c0 + t*c1 + t*t*c2 + t*t*t*c3;
}
}
+#endif
/* -------------------------- */
@@ -1245,1016 +1339,6 @@ static float fcurve_eval_samples (FCurve *fcu, FPoint *fpts, float evaltime)
return cvalue;
}
-/* ******************************** F-Curve Modifiers ********************************* */
-
-/* Template --------------------------- */
-
-/* Each modifier defines a set of functions, which will be called at the appropriate
- * times. In addition to this, each modifier should have a type-info struct, where
- * its functions are attached for use.
- */
-
-/* Template for type-info data:
- * - make a copy of this when creating new modifiers, and just change the functions
- * pointed to as necessary
- * - although the naming of functions doesn't matter, it would help for code
- * readability, to follow the same naming convention as is presented here
- * - any functions that a constraint doesn't need to define, don't define
- * for such cases, just use NULL
- * - these should be defined after all the functions have been defined, so that
- * forward-definitions/prototypes don't need to be used!
- * - keep this copy #if-def'd so that future constraints can get based off this
- */
-#if 0
-static FModifierTypeInfo FMI_MODNAME = {
- FMODIFIER_TYPE_MODNAME, /* type */
- sizeof(FMod_ModName), /* size */
- FMI_TYPE_SOME_ACTION, /* action type */
- FMI_REQUIRES_SOME_REQUIREMENT, /* requirements */
- "Modifier Name", /* name */
- "FMod_ModName", /* struct name */
- fcm_modname_free, /* free data */
- fcm_modname_relink, /* relink data */
- fcm_modname_copy, /* copy data */
- fcm_modname_new_data, /* new data */
- fcm_modname_verify, /* verify */
- fcm_modname_time, /* evaluate time */
- fcm_modname_evaluate /* evaluate */
-};
-#endif
-
-/* Generator F-Curve Modifier --------------------------- */
-
-/* Generators available:
- * 1) simple polynomial generator:
- * - Exanded form - (y = C[0]*(x^(n)) + C[1]*(x^(n-1)) + ... + C[n])
- * - Factorised form - (y = (C[0][0]*x + C[0][1]) * (C[1][0]*x + C[1][1]) * ... * (C[n][0]*x + C[n][1]))
- * 2) simple builin 'functions':
- * of the form (y = C[0] * fn( C[1]*x + C[2] ) + C[3])
- * where fn() can be any one of:
- * sin, cos, tan, ln, sqrt
- * 3) expression...
- */
-
-static void fcm_generator_free (FModifier *fcm)
-{
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- /* free polynomial coefficients array */
- if (data->coefficients)
- MEM_freeN(data->coefficients);
-}
-
-static void fcm_generator_copy (FModifier *fcm, FModifier *src)
-{
- FMod_Generator *gen= (FMod_Generator *)fcm->data;
- FMod_Generator *ogen= (FMod_Generator *)src->data;
-
- /* copy coefficients array? */
- if (ogen->coefficients)
- gen->coefficients= MEM_dupallocN(ogen->coefficients);
-}
-
-static void fcm_generator_new_data (void *mdata)
-{
- FMod_Generator *data= (FMod_Generator *)mdata;
- float *cp;
-
- /* set default generator to be linear 0-1 (gradient = 1, y-offset = 0) */
- data->poly_order= 1;
- data->arraysize= 2;
- cp= data->coefficients= MEM_callocN(sizeof(float)*2, "FMod_Generator_Coefs");
- cp[0] = 0; // y-offset
- cp[1] = 1; // gradient
-}
-
-static void fcm_generator_verify (FModifier *fcm)
-{
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- /* requirements depend on mode */
- switch (data->mode) {
- case FCM_GENERATOR_POLYNOMIAL: /* expanded polynomial expression */
- {
- /* arraysize needs to be order+1, so resize if not */
- if (data->arraysize != (data->poly_order+1)) {
- float *nc;
-
- /* make new coefficients array, and copy over as much data as can fit */
- nc= MEM_callocN(sizeof(float)*(data->poly_order+1), "FMod_Generator_Coefs");
-
- if (data->coefficients) {
- if (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);
-
- /* free the old data */
- MEM_freeN(data->coefficients);
- }
-
- /* set the new data */
- data->coefficients= nc;
- data->arraysize= data->poly_order+1;
- }
- }
- break;
-
- case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* expanded polynomial expression */
- {
- /* arraysize needs to be 2*order, so resize if not */
- if (data->arraysize != (data->poly_order * 2)) {
- float *nc;
-
- /* make new coefficients array, and copy over as much data as can fit */
- nc= MEM_callocN(sizeof(float)*(data->poly_order*2), "FMod_Generator_Coefs");
-
- if (data->coefficients) {
- if (data->arraysize > (data->poly_order * 2))
- memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order * 2));
- else
- memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
-
- /* free the old data */
- MEM_freeN(data->coefficients);
- }
-
- /* set the new data */
- data->coefficients= nc;
- data->arraysize= data->poly_order * 2;
- }
- }
- break;
-
- case FCM_GENERATOR_FUNCTION: /* builtin function */
- {
- /* arraysize needs to be 4*/
- if (data->arraysize != 4) {
- float *nc;
-
- /* free the old data */
- if (data->coefficients)
- MEM_freeN(data->coefficients);
-
- /* make new coefficients array, and init using default values */
- nc= data->coefficients= MEM_callocN(sizeof(float)*4, "FMod_Generator_Coefs");
- data->arraysize= 4;
-
- nc[0]= 1.0f;
- nc[1]= 1.0f;
- nc[2]= 0.0f;
- nc[3]= 0.0f;
- }
- }
- break;
- }
-}
-
-static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- /* behaviour depends on mode
- * NOTE: the data in its default state is fine too
- */
- switch (data->mode) {
- case FCM_GENERATOR_POLYNOMIAL: /* expanded polynomial expression */
- {
- /* we overwrite cvalue with the sum of the polynomial */
- float *powers = MEM_callocN(sizeof(float)*data->arraysize, "Poly Powers");
- float value= 0.0f;
- unsigned int i;
-
- /* for each x^n, precalculate value based on previous one first... this should be
- * faster that calling pow() for each entry
- */
- for (i=0; i < data->arraysize; i++) {
- /* first entry is x^0 = 1, otherwise, calculate based on previous */
- if (i)
- powers[i]= powers[i-1] * evaltime;
- else
- powers[0]= 1;
- }
-
- /* for each coefficient, add to value, which we'll write to *cvalue in one go */
- for (i=0; i < data->arraysize; i++)
- value += data->coefficients[i] * powers[i];
-
- /* only if something changed, write *cvalue in one go */
- if (data->poly_order) {
- if (data->flag & FCM_GENERATOR_ADDITIVE)
- *cvalue += value;
- else
- *cvalue= value;
- }
-
- /* cleanup */
- if (powers)
- MEM_freeN(powers);
- }
- break;
-
- case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* factorised polynomial */
- {
- float value= 1.0f, *cp=NULL;
- 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++)
- value *= (cp[0]*evaltime + cp[1]);
-
- /* only if something changed, write *cvalue in one go */
- if (data->poly_order) {
- if (data->flag & FCM_GENERATOR_ADDITIVE)
- *cvalue += value;
- else
- *cvalue= value;
- }
- }
- break;
-
- case FCM_GENERATOR_FUNCTION: /* builtin function */
- {
- double arg= data->coefficients[1]*evaltime + data->coefficients[2];
- double (*fn)(double v) = NULL;
-
- /* get function pointer to the func to use:
- * WARNING: must perform special argument validation hereto guard against crashes
- */
- switch (data->func_type)
- {
- /* simple ones */
- case FCM_GENERATOR_FN_SIN: /* sine wave */
- fn= sin;
- break;
- case FCM_GENERATOR_FN_COS: /* cosine wave */
- fn= cos;
- break;
-
- /* validation required */
- case FCM_GENERATOR_FN_TAN: /* tangent wave */
- {
- /* check that argument is not on one of the discontinuities (i.e. 90deg, 270 deg, etc) */
- if IS_EQ(fmod((arg - M_PI_2), M_PI), 0.0) {
- if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
- *cvalue = 0.0f; /* no value possible here */
- }
- else
- fn= tan;
- }
- break;
- case FCM_GENERATOR_FN_LN: /* natural log */
- {
- /* check that value is greater than 1? */
- if (arg > 1.0f) {
- fn= log;
- }
- else {
- if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
- *cvalue = 0.0f; /* no value possible here */
- }
- }
- break;
- case FCM_GENERATOR_FN_SQRT: /* square root */
- {
- /* no negative numbers */
- if (arg > 0.0f) {
- fn= sqrt;
- }
- else {
- if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
- *cvalue = 0.0f; /* no value possible here */
- }
- }
- break;
-
- default:
- printf("Invalid Function-Generator for F-Modifier - %d \n", data->func_type);
- }
-
- /* execute function callback to set value if appropriate */
- if (fn) {
- float value= (float)(data->coefficients[0]*fn(arg) + data->coefficients[3]);
-
- if (data->flag & FCM_GENERATOR_ADDITIVE)
- *cvalue += value;
- else
- *cvalue= value;
- }
- }
- break;
-
-#ifndef DISABLE_PYTHON
- case FCM_GENERATOR_EXPRESSION: /* py-expression */
- // TODO...
- break;
-#endif /* DISABLE_PYTHON */
- }
-}
-
-static FModifierTypeInfo FMI_GENERATOR = {
- FMODIFIER_TYPE_GENERATOR, /* type */
- sizeof(FMod_Generator), /* size */
- FMI_TYPE_GENERATE_CURVE, /* action type */
- FMI_REQUIRES_NOTHING, /* requirements */
- "Generator", /* name */
- "FMod_Generator", /* struct name */
- fcm_generator_free, /* free data */
- fcm_generator_copy, /* copy data */
- fcm_generator_new_data, /* new data */
- fcm_generator_verify, /* verify */
- NULL, /* evaluate time */
- fcm_generator_evaluate /* evaluate */
-};
-
-/* Envelope F-Curve Modifier --------------------------- */
-
-static void fcm_envelope_free (FModifier *fcm)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm->data;
-
- /* free envelope data array */
- if (env->data)
- MEM_freeN(env->data);
-}
-
-static void fcm_envelope_copy (FModifier *fcm, FModifier *src)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm->data;
- FMod_Envelope *oenv= (FMod_Envelope *)src->data;
-
- /* copy envelope data array */
- if (oenv->data)
- env->data= MEM_dupallocN(oenv->data);
-}
-
-static void fcm_envelope_new_data (void *mdata)
-{
- FMod_Envelope *env= (FMod_Envelope *)mdata;
-
- /* set default min/max ranges */
- env->min= -1.0f;
- env->max= 1.0f;
-}
-
-static void fcm_envelope_verify (FModifier *fcm)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm->data;
-
- /* if the are points, perform bubble-sort on them, as user may have changed the order */
- if (env->data) {
- // XXX todo...
- }
-}
-
-static void fcm_envelope_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm->data;
- FCM_EnvelopeData *fed, *prevfed, *lastfed;
- float min=0.0f, max=0.0f, fac=0.0f;
- int a;
-
- /* get pointers */
- if (env->data == NULL) return;
- prevfed= env->data;
- fed= prevfed + 1;
- lastfed= prevfed + (env->totvert-1);
-
- /* get min/max values for envelope at evaluation time (relative to mid-value) */
- if (prevfed->time >= evaltime) {
- /* before or on first sample, so just extend value */
- min= prevfed->min;
- max= prevfed->max;
- }
- else if (lastfed->time <= evaltime) {
- /* after or on last sample, so just extend value */
- min= lastfed->min;
- max= lastfed->max;
- }
- else {
- /* evaltime occurs somewhere between segments */
- // TODO: implement binary search for this to make it faster?
- for (a=0; prevfed && fed && (a < env->totvert-1); a++, prevfed=fed, fed++) {
- /* evaltime occurs within the interval defined by these two envelope points */
- if ((prevfed->time <= evaltime) && (fed->time >= evaltime)) {
- float afac, bfac, diff;
-
- diff= fed->time - prevfed->time;
- afac= (evaltime - prevfed->time) / diff;
- bfac= (fed->time - evaltime) / diff;
-
- min= bfac*prevfed->min + afac*fed->min;
- max= bfac*prevfed->max + afac*fed->max;
-
- break;
- }
- }
- }
-
- /* adjust *cvalue
- * - fac is the ratio of how the current y-value corresponds to the reference range
- * - thus, the new value is found by mapping the old range to the new!
- */
- fac= (*cvalue - (env->midval + env->min)) / (env->max - env->min);
- *cvalue= min + fac*(max - min);
-}
-
-static FModifierTypeInfo FMI_ENVELOPE = {
- FMODIFIER_TYPE_ENVELOPE, /* type */
- sizeof(FMod_Envelope), /* size */
- FMI_TYPE_REPLACE_VALUES, /* action type */
- 0, /* requirements */
- "Envelope", /* name */
- "FMod_Envelope", /* struct name */
- fcm_envelope_free, /* free data */
- fcm_envelope_copy, /* copy data */
- fcm_envelope_new_data, /* new data */
- fcm_envelope_verify, /* verify */
- NULL, /* evaluate time */
- fcm_envelope_evaluate /* evaluate */
-};
-
-/* Cycles F-Curve Modifier --------------------------- */
-
-/* This modifier changes evaltime to something that exists within the curve's frame-range,
- * then re-evaluates modifier stack up to this point using the new time. This re-entrant behaviour
- * is very likely to be more time-consuming than the original approach... (which was tighly integrated into
- * the calculation code...).
- *
- * NOTE: this needs to be at the start of the stack to be of use, as it needs to know the extents of the keyframes/sample-data
- * Possible TODO - store length of cycle information that can be initialised from the extents of the keyframes/sample-data, and adjusted
- * as appropriate
- */
-
-/* temp data used during evaluation */
-typedef struct tFCMED_Cycles {
- float cycyofs; /* y-offset to apply */
-} tFCMED_Cycles;
-
-static void fcm_cycles_new_data (void *mdata)
-{
- FMod_Cycles *data= (FMod_Cycles *)mdata;
-
- /* turn on cycles by default */
- data->before_mode= data->after_mode= FCM_EXTRAPOLATE_CYCLIC;
-}
-
-static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float 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;
-
- /* check if modifier is first in stack, otherwise disable ourself... */
- // FIXME...
- if (fcm->prev) {
- fcm->flag |= FMODIFIER_FLAG_DISABLED;
- return evaltime;
- }
-
- /* calculate new evaltime due to cyclic interpolation */
- if (fcu && fcu->bezt) {
- BezTriple *prevbezt= fcu->bezt;
- BezTriple *lastbezt= prevbezt + fcu->totvert-1;
-
- prevkey[0]= prevbezt->vec[1][0];
- prevkey[1]= prevbezt->vec[1][1];
-
- lastkey[0]= lastbezt->vec[1][0];
- lastkey[1]= lastbezt->vec[1][1];
- }
- else if (fcu && fcu->fpt) {
- FPoint *prevfpt= fcu->fpt;
- FPoint *lastfpt= prevfpt + fcu->totvert-1;
-
- prevkey[0]= prevfpt->vec[0];
- prevkey[1]= prevfpt->vec[1];
-
- lastkey[0]= lastfpt->vec[0];
- lastkey[1]= lastfpt->vec[1];
- }
- else
- return evaltime;
-
- /* check if modifier will do anything
- * 1) if in data range, definitely don't do anything
- * 2) if before first frame or after last frame, make sure some cycling is in use
- */
- if (evaltime < prevkey[0]) {
- if (data->before_mode) {
- side= -1;
- mode= data->before_mode;
- cycles= data->before_cycles;
- }
- }
- else if (evaltime > lastkey[0]) {
- if (data->after_mode) {
- side= 1;
- mode= data->after_mode;
- cycles= data->after_cycles;
- }
- }
- if ELEM(0, side, mode)
- return evaltime;
-
- /* 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];
-
- /* calculate period and amplitude (total height) of a cycle */
- cycdx= lastkey[0] - prevkey[0];
- cycdy= lastkey[1] - prevkey[1];
-
- /* check if cycle is infinitely small, to be point of being impossible to use */
- if (cycdx == 0)
- return evaltime;
-
- /* calculate the 'number' of the cycle */
- cycle= ((float)side * (evaltime - ofs) / cycdx);
-
- /* check that cyclic is still enabled for the specified time */
- if (cycles == 0) {
- /* catch this case so that we don't exit when we have cycles=0
- * as this indicates infinite cycles...
- */
- }
- else if (cycle > (cycles+1)) {
- /* we are too far away from range to evaluate
- * TODO: but we should still hold last value...
- */
- return evaltime;
- }
-
- /* check if 'cyclic extrapolation', and thus calculate y-offset for this cycle */
- if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
- cycyofs = (float)floor((evaltime - ofs) / cycdx);
- cycyofs *= cycdy;
- }
-
- /* calculate where in the cycle we are (overwrite evaltime to reflect this) */
- if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle) % 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));
- else
- evaltime= (float)(lastkey[0] - fmod(evaltime-ofs, cycdx));
- }
- else {
- /* the cycle is played normally... */
- evaltime= (float)(fmod(evaltime-ofs, cycdx) + ofs);
- }
- if (evaltime < ofs) evaltime += cycdx;
- }
-
- /* store temp data if needed */
- if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
- tFCMED_Cycles *edata;
-
- /* for now, this is just a float, but we could get more stuff... */
- fcm->edata= edata= MEM_callocN(sizeof(tFCMED_Cycles), "tFCMED_Cycles");
- edata->cycyofs= cycyofs;
- }
-
- /* return the new frame to evaluate */
- return evaltime;
-}
-
-static void fcm_cycles_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
- tFCMED_Cycles *edata= (tFCMED_Cycles *)fcm->edata;
-
- /* use temp data */
- if (edata) {
- /* add cyclic offset - no need to check for now, otherwise the data wouldn't exist! */
- *cvalue += edata->cycyofs;
-
- /* free temp data */
- MEM_freeN(edata);
- fcm->edata= NULL;
- }
-}
-
-static FModifierTypeInfo FMI_CYCLES = {
- FMODIFIER_TYPE_CYCLES, /* type */
- sizeof(FMod_Cycles), /* size */
- FMI_TYPE_EXTRAPOLATION, /* action type */
- FMI_REQUIRES_ORIGINAL_DATA, /* requirements */
- "Cycles", /* name */
- "FMod_Cycles", /* struct name */
- NULL, /* free data */
- NULL, /* copy data */
- fcm_cycles_new_data, /* new data */
- NULL /*fcm_cycles_verify*/, /* verify */
- fcm_cycles_time, /* evaluate time */
- fcm_cycles_evaluate /* evaluate */
-};
-
-/* Noise F-Curve Modifier --------------------------- */
-
-static void fcm_noise_new_data (void *mdata)
-{
- FMod_Noise *data= (FMod_Noise *)mdata;
-
- /* defaults */
- data->size= 1.0f;
- data->strength= 1.0f;
- data->phase= 1.0f;
- data->depth = 0;
- data->modification = FCM_NOISE_MODIF_REPLACE;
-}
-
-static void fcm_noise_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
- FMod_Noise *data= (FMod_Noise *)fcm->data;
- float noise;
-
- noise = BLI_turbulence(data->size, evaltime, data->phase, 0.f, data->depth);
-
- switch (data->modification) {
- case FCM_NOISE_MODIF_ADD:
- *cvalue= *cvalue + noise * data->strength;
- break;
- case FCM_NOISE_MODIF_SUBTRACT:
- *cvalue= *cvalue - noise * data->strength;
- break;
- case FCM_NOISE_MODIF_MULTIPLY:
- *cvalue= *cvalue * noise * data->strength;
- break;
- case FCM_NOISE_MODIF_REPLACE:
- default:
- *cvalue= *cvalue + (noise - 0.5f) * data->strength;
- break;
- }
-}
-
-static FModifierTypeInfo FMI_NOISE = {
- FMODIFIER_TYPE_NOISE, /* type */
- sizeof(FMod_Noise), /* size */
- FMI_TYPE_REPLACE_VALUES, /* action type */
- 0, /* requirements */
- "Noise", /* name */
- "FMod_Noise", /* struct name */
- NULL, /* free data */
- NULL, /* copy data */
- fcm_noise_new_data, /* new data */
- NULL /*fcm_noise_verify*/, /* verify */
- NULL, /* evaluate time */
- fcm_noise_evaluate /* evaluate */
-};
-
-/* Filter F-Curve Modifier --------------------------- */
-
-#if 0 // XXX not yet implemented
-static FModifierTypeInfo FMI_FILTER = {
- FMODIFIER_TYPE_FILTER, /* type */
- sizeof(FMod_Filter), /* size */
- FMI_TYPE_REPLACE_VALUES, /* action type */
- 0, /* requirements */
- "Filter", /* name */
- "FMod_Filter", /* struct name */
- NULL, /* free data */
- NULL, /* copy data */
- NULL, /* new data */
- NULL /*fcm_filter_verify*/, /* verify */
- NULL, /* evlauate time */
- fcm_filter_evaluate /* evaluate */
-};
-#endif // XXX not yet implemented
-
-
-/* Python F-Curve Modifier --------------------------- */
-
-static void fcm_python_free (FModifier *fcm)
-{
- FMod_Python *data= (FMod_Python *)fcm->data;
-
- /* id-properties */
- IDP_FreeProperty(data->prop);
- MEM_freeN(data->prop);
-}
-
-static void fcm_python_new_data (void *mdata)
-{
- FMod_Python *data= (FMod_Python *)mdata;
-
- /* everything should be set correctly by calloc, except for the prop->type constant.*/
- data->prop = MEM_callocN(sizeof(IDProperty), "PyFModifierProps");
- data->prop->type = IDP_GROUP;
-}
-
-static void fcm_python_copy (FModifier *fcm, FModifier *src)
-{
- FMod_Python *pymod = (FMod_Python *)fcm->data;
- FMod_Python *opymod = (FMod_Python *)src->data;
-
- pymod->prop = IDP_CopyProperty(opymod->prop);
-}
-
-static void fcm_python_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
-#ifndef DISABLE_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 */
-}
-
-static FModifierTypeInfo FMI_PYTHON = {
- FMODIFIER_TYPE_PYTHON, /* type */
- sizeof(FMod_Python), /* size */
- FMI_TYPE_GENERATE_CURVE, /* action type */
- FMI_REQUIRES_RUNTIME_CHECK, /* requirements */
- "Python", /* name */
- "FMod_Python", /* struct name */
- fcm_python_free, /* free data */
- fcm_python_copy, /* copy data */
- fcm_python_new_data, /* new data */
- NULL /*fcm_python_verify*/, /* verify */
- NULL /*fcm_python_time*/, /* evaluate time */
- fcm_python_evaluate /* evaluate */
-};
-
-
-/* Limits F-Curve Modifier --------------------------- */
-
-static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
-{
- FMod_Limits *data= (FMod_Limits *)fcm->data;
-
- /* check for the time limits */
- if ((data->flag & FCM_LIMIT_XMIN) && (evaltime < data->rect.xmin))
- return data->rect.xmin;
- if ((data->flag & FCM_LIMIT_XMAX) && (evaltime > data->rect.xmax))
- return data->rect.xmax;
-
- /* modifier doesn't change time */
- return evaltime;
-}
-
-static void fcm_limits_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
-{
- FMod_Limits *data= (FMod_Limits *)fcm->data;
-
- /* value limits now */
- if ((data->flag & FCM_LIMIT_YMIN) && (*cvalue < data->rect.ymin))
- *cvalue= data->rect.ymin;
- if ((data->flag & FCM_LIMIT_YMAX) && (*cvalue > data->rect.ymax))
- *cvalue= data->rect.ymax;
-}
-
-static FModifierTypeInfo FMI_LIMITS = {
- FMODIFIER_TYPE_LIMITS, /* type */
- sizeof(FMod_Limits), /* size */
- FMI_TYPE_GENERATE_CURVE, /* action type */ /* XXX... err... */
- FMI_REQUIRES_RUNTIME_CHECK, /* requirements */
- "Limits", /* name */
- "FMod_Limits", /* struct name */
- NULL, /* free data */
- NULL, /* copy data */
- NULL, /* new data */
- NULL, /* verify */
- fcm_limits_time, /* evaluate time */
- fcm_limits_evaluate /* evaluate */
-};
-
-/* F-Curve Modifier API --------------------------- */
-/* All of the F-Curve Modifier api functions use FModifierTypeInfo structs to carry out
- * and operations that involve F-Curve modifier specific code.
- */
-
-/* These globals only ever get directly accessed in this file */
-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 ()
-{
- fmodifiersTypeInfo[0]= NULL; /* 'Null' F-Curve Modifier */
- fmodifiersTypeInfo[1]= &FMI_GENERATOR; /* Generator F-Curve Modifier */
- fmodifiersTypeInfo[2]= &FMI_ENVELOPE; /* Envelope F-Curve Modifier */
- fmodifiersTypeInfo[3]= &FMI_CYCLES; /* Cycles F-Curve Modifier */
- fmodifiersTypeInfo[4]= &FMI_NOISE; /* Apply-Noise F-Curve Modifier */
- fmodifiersTypeInfo[5]= NULL/*&FMI_FILTER*/; /* Filter F-Curve Modifier */ // XXX unimplemented
- fmodifiersTypeInfo[6]= &FMI_PYTHON; /* Custom Python F-Curve Modifier */
- fmodifiersTypeInfo[7]= &FMI_LIMITS; /* Limits F-Curve Modifier */
-}
-
-/* This function should be used for getting the appropriate type-info when only
- * a F-Curve modifier type is known
- */
-FModifierTypeInfo *get_fmodifier_typeinfo (int type)
-{
- /* initialise the type-info list? */
- if (FMI_INIT) {
- fmods_init_typeinfo();
- FMI_INIT = 0;
- }
-
- /* only return for valid types */
- if ( (type >= FMODIFIER_TYPE_NULL) &&
- (type <= FMODIFIER_NUM_TYPES ) )
- {
- /* there shouldn't be any segfaults here... */
- return fmodifiersTypeInfo[type];
- }
- else {
- printf("No valid F-Curve Modifier type-info data available. Type = %i \n", type);
- }
-
- return NULL;
-}
-
-/* This function should always be used to get the appropriate type-info, as it
- * has checks which prevent segfaults in some weird cases.
- */
-FModifierTypeInfo *fmodifier_get_typeinfo (FModifier *fcm)
-{
- /* only return typeinfo for valid modifiers */
- if (fcm)
- return get_fmodifier_typeinfo(fcm->type);
- else
- return NULL;
-}
-
-/* API --------------------------- */
-
-/* Add a new F-Curve Modifier to the given F-Curve of a certain type */
-FModifier *fcurve_add_modifier (FCurve *fcu, int type)
-{
- FModifierTypeInfo *fmi= get_fmodifier_typeinfo(type);
- FModifier *fcm;
-
- /* sanity checks */
- if ELEM(NULL, fcu, fmi)
- return NULL;
-
- /* special checks for whether modifier can be added */
- if ((fcu->modifiers.first) && (type == FMODIFIER_TYPE_CYCLES)) {
- /* cycles modifier must be first in stack, so for now, don't add if it can't be */
- // TODO: perhaps there is some better way, but for now,
- printf("Error: Cannot add 'Cycles' modifier to F-Curve, as 'Cycles' modifier can only be first in stack. \n");
- return NULL;
- }
-
- /* add modifier itself */
- fcm= MEM_callocN(sizeof(FModifier), "F-Curve Modifier");
- fcm->type = type;
- fcm->flag = FMODIFIER_FLAG_EXPANDED;
- BLI_addtail(&fcu->modifiers, fcm);
-
- /* 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);
-
- /* return modifier for further editing */
- return fcm;
-}
-
-/* Duplicate all of the F-Curve Modifiers in the Modifier stacks */
-void fcurve_copy_modifiers (ListBase *dst, ListBase *src)
-{
- FModifier *fcm, *srcfcm;
-
- if ELEM(NULL, dst, src)
- return;
-
- dst->first= dst->last= NULL;
- BLI_duplicatelist(dst, src);
-
- for (fcm=dst->first, srcfcm=src->first; fcm && srcfcm; srcfcm=srcfcm->next, fcm=fcm->next) {
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* make a new copy of the F-Modifier's data */
- fcm->data = MEM_dupallocN(fcm->data);
-
- /* only do specific constraints if required */
- if (fmi && fmi->copy_data)
- fmi->copy_data(fcm, srcfcm);
- }
-}
-
-/* Remove and free the given F-Curve Modifier from the given F-Curve's stack */
-void fcurve_remove_modifier (FCurve *fcu, FModifier *fcm)
-{
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* sanity check */
- if (fcm == NULL)
- return;
-
- /* free modifier's special data (stored inside fcm->data) */
- if (fcm->data) {
- if (fmi && fmi->free_data)
- fmi->free_data(fcm);
-
- /* free modifier's data (fcm->data) */
- MEM_freeN(fcm->data);
- }
-
- /* remove modifier from stack */
- if (fcu)
- BLI_freelinkN(&fcu->modifiers, fcm);
- else {
- // XXX this case can probably be removed some day, as it shouldn't happen...
- printf("fcurve_remove_modifier() - no fcurve \n");
- MEM_freeN(fcm);
- }
-}
-
-/* Remove all of a given F-Curve's modifiers */
-void fcurve_free_modifiers (FCurve *fcu)
-{
- FModifier *fcm, *fmn;
-
- /* sanity check */
- if (fcu == NULL)
- return;
-
- /* free each modifier in order - modifier is unlinked from list and freed */
- for (fcm= fcu->modifiers.first; fcm; fcm= fmn) {
- fmn= fcm->next;
- fcurve_remove_modifier(fcu, fcm);
- }
-}
-
-/* Bake modifiers for given F-Curve to curve sample data, in the frame range defined
- * by start and end (inclusive).
- */
-void fcurve_bake_modifiers (FCurve *fcu, int start, int end)
-{
- ChannelDriver *driver;
-
- /* sanity checks */
- // TODO: make these tests report errors using reports not printf's
- if ELEM(NULL, fcu, fcu->modifiers.first) {
- printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
- return;
- }
-
- /* temporarily, disable driver while we sample, so that they don't influence the outcome */
- driver= fcu->driver;
- fcu->driver= NULL;
-
- /* bake the modifiers, by sampling the curve at each frame */
- fcurve_store_samples(fcu, NULL, start, end, fcurve_samplingcb_evalcurve);
-
- /* free the modifiers now */
- fcurve_free_modifiers(fcu);
-
- /* restore driver */
- fcu->driver= driver;
-}
-
-/* Find the active F-Curve Modifier */
-FModifier *fcurve_find_active_modifier (FCurve *fcu)
-{
- FModifier *fcm;
-
- /* sanity checks */
- if ELEM(NULL, fcu, fcu->modifiers.first)
- return NULL;
-
- /* loop over modifiers until 'active' one is found */
- for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
- if (fcm->flag & FMODIFIER_FLAG_ACTIVE)
- return fcm;
- }
-
- /* no modifier is active */
- return NULL;
-}
-
-/* Set the active F-Curve Modifier */
-void fcurve_set_active_modifier (FCurve *fcu, FModifier *fcm)
-{
- FModifier *fm;
-
- /* sanity checks */
- if ELEM(NULL, fcu, fcu->modifiers.first)
- return;
-
- /* deactivate all, and set current one active */
- for (fm= fcu->modifiers.first; fm; fm= fm->next)
- fm->flag &= ~FMODIFIER_FLAG_ACTIVE;
-
- /* make given modifier active */
- if (fcm)
- fcm->flag |= FMODIFIER_FLAG_ACTIVE;
-}
-
/* ***************************** F-Curve - Evaluation ********************************* */
/* Evaluate and return the value of the given F-Curve at the specified frame ("evaltime")
@@ -2262,7 +1346,6 @@ void fcurve_set_active_modifier (FCurve *fcu, FModifier *fcm)
*/
float evaluate_fcurve (FCurve *fcu, float evaltime)
{
- FModifier *fcm;
float cvalue= 0.0f;
float devaltime;
@@ -2275,28 +1358,8 @@ float evaluate_fcurve (FCurve *fcu, float evaltime)
evaltime= cvalue= evaluate_driver(fcu->driver, evaltime);
}
- /* evaluate time modifications imposed by some F-Curve Modifiers
- * - this step acts as an optimisation to prevent the F-Curve stack being evaluated
- * several times by modifiers requesting the time be modified, as the final result
- * would have required using the modified time
- * - modifiers only ever recieve the unmodified time, as subsequent modifiers should be
- * working on the 'global' result of the modified curve, not some localised segment,
- * so nevaltime gets set to whatever the last time-modifying modifier likes...
- * - we start from the end of the stack, as only the last one matters for now
- */
- devaltime= evaltime;
-
- for (fcm= fcu->modifiers.last; fcm; fcm= fcm->prev) {
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* only evaluate if there's a callback for this */
- // TODO: implement the 'influence' control feature...
- if (fmi && fmi->evaluate_modifier_time) {
- if ((fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED)) == 0)
- devaltime= fmi->evaluate_modifier_time(fcu, fcm, cvalue, evaltime);
- break;
- }
- }
+ /* evaluate modifiers which modify time to evaluate the base curve at */
+ devaltime= evaluate_time_fmodifiers(&fcu->modifiers, fcu, cvalue, evaltime);
/* evaluate curve-data
* - 'devaltime' instead of 'evaltime', as this is the time that the last time-modifying
@@ -2308,16 +1371,7 @@ float evaluate_fcurve (FCurve *fcu, float evaltime)
cvalue= fcurve_eval_samples(fcu, fcu->fpt, devaltime);
/* evaluate modifiers */
- for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* only evaluate if there's a callback for this */
- // TODO: implement the 'influence' control feature...
- if (fmi && fmi->evaluate_modifier) {
- if ((fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED)) == 0)
- fmi->evaluate_modifier(fcu, fcm, &cvalue, evaltime);
- }
- }
+ evaluate_value_fmodifiers(&fcu->modifiers, fcu, &cvalue, evaltime);
/* if curve can only have integral values, perform truncation (i.e. drop the decimal part)
* here so that the curve can be sampled correctly
@@ -2330,10 +1384,16 @@ float evaluate_fcurve (FCurve *fcu, float evaltime)
}
/* Calculate the value of the given F-Curve at the given frame, and set its curval */
-// TODO: will this be necessary?
void calculate_fcurve (FCurve *fcu, float ctime)
{
- /* calculate and set curval (evaluates driver too) */
- fcu->curval= evaluate_fcurve(fcu, ctime);
+ /* only calculate + set curval (overriding the existing value) if curve has
+ * any data which warrants this...
+ */
+ if ( (fcu->totvert) || (fcu->driver && !(fcu->driver->flag & DRIVER_FLAG_INVALID)) ||
+ list_has_suitable_fmodifier(&fcu->modifiers, 0, FMI_TYPE_GENERATE_CURVE) )
+ {
+ /* calculate and set curval (evaluates driver too if necessary) */
+ fcu->curval= evaluate_fcurve(fcu, ctime);
+ }
}
diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c
index 54008185f72..aa163b821c8 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -34,7 +34,9 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_object_fluidsim.h"
#include "DNA_object_force.h" // for pointcache
+#include "DNA_object_types.h"
#include "DNA_particle_types.h"
#include "DNA_scene_types.h" // N_T
@@ -78,12 +80,13 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
if(!fss)
return;
- fss->type = OB_FSBND_NOSLIP;
+ fss->fmd = fluidmd;
+ fss->type = OB_FLUIDSIM_ENABLE;
fss->show_advancedoptions = 0;
- fss->resolutionxyz = 50;
- fss->previewresxyz = 25;
- fss->realsize = 0.03;
+ fss->resolutionxyz = 65;
+ fss->previewresxyz = 45;
+ fss->realsize = 0.5;
fss->guiDisplayMode = 2; // preview
fss->renderDisplayMode = 3; // render
@@ -96,7 +99,7 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
fss->gravy = 0.0;
fss->gravz = -9.81;
fss->animStart = 0.0;
- fss->animEnd = 0.30;
+ fss->animEnd = 4.0;
fss->gstar = 0.005; // used as normgstar
fss->maxRefine = -1;
// maxRefine is set according to resolutionxyz during bake
@@ -112,15 +115,15 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
// no bounding box needed
// todo - reuse default init from elbeem!
- fss->typeFlags = 0;
+ fss->typeFlags = OB_FSBND_PARTSLIP;
fss->domainNovecgen = 0;
fss->volumeInitType = 1; // volume
- fss->partSlipValue = 0.0;
+ fss->partSlipValue = 0.2;
fss->generateTracers = 0;
fss->generateParticles = 0.0;
fss->surfaceSmoothing = 1.0;
- fss->surfaceSubdivs = 1.0;
+ fss->surfaceSubdivs = 0.0;
fss->particleInfSize = 0.0;
fss->particleInfAlpha = 0.0;
@@ -657,5 +660,20 @@ void initElbeemMesh(struct Scene *scene, struct Object *ob,
dm->release(dm);
}
+void fluid_estimate_memory(Object *ob, FluidsimSettings *fss, char *value)
+{
+ Mesh *mesh;
+
+ value[0]= '\0';
+
+ if(ob->type == OB_MESH) {
+ /* use mesh bounding box and object scaling */
+ mesh= ob->data;
+
+ fluid_get_bb(mesh->mvert, mesh->totvert, ob->obmat, fss->bbStart, fss->bbSize);
+ elbeemEstimateMemreq(fss->resolutionxyz, fss->bbSize[0],fss->bbSize[1],fss->bbSize[2], fss->maxRefine, value);
+ }
+}
+
#endif // DISABLE_ELBEEM
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
new file mode 100644
index 00000000000..64558d0b456
--- /dev/null
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -0,0 +1,1197 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+#include <math.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <float.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_anim_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_noise.h"
+
+#include "BKE_fcurve.h"
+#include "BKE_curve.h"
+#include "BKE_global.h"
+#include "BKE_idprop.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#ifndef DISABLE_PYTHON
+#include "BPY_extern.h" /* for BPY_pydriver_eval() */
+#endif
+
+#define SMALL -1.0e-10
+#define SELECT 1
+
+/* ******************************** F-Modifiers ********************************* */
+
+/* Info ------------------------------- */
+
+/* F-Modifiers are modifiers which operate on F-Curves. However, they can also be defined
+ * on NLA-Strips to affect all of the F-Curves referenced by the NLA-Strip.
+ */
+
+/* Template --------------------------- */
+
+/* Each modifier defines a set of functions, which will be called at the appropriate
+ * times. In addition to this, each modifier should have a type-info struct, where
+ * its functions are attached for use.
+ */
+
+/* Template for type-info data:
+ * - make a copy of this when creating new modifiers, and just change the functions
+ * pointed to as necessary
+ * - although the naming of functions doesn't matter, it would help for code
+ * readability, to follow the same naming convention as is presented here
+ * - any functions that a constraint doesn't need to define, don't define
+ * for such cases, just use NULL
+ * - these should be defined after all the functions have been defined, so that
+ * forward-definitions/prototypes don't need to be used!
+ * - keep this copy #if-def'd so that future constraints can get based off this
+ */
+#if 0
+static FModifierTypeInfo FMI_MODNAME = {
+ FMODIFIER_TYPE_MODNAME, /* type */
+ sizeof(FMod_ModName), /* size */
+ FMI_TYPE_SOME_ACTION, /* action type */
+ FMI_REQUIRES_SOME_REQUIREMENT, /* requirements */
+ "Modifier Name", /* name */
+ "FMod_ModName", /* struct name */
+ fcm_modname_free, /* free data */
+ fcm_modname_relink, /* relink data */
+ fcm_modname_copy, /* copy data */
+ fcm_modname_new_data, /* new data */
+ fcm_modname_verify, /* verify */
+ fcm_modname_time, /* evaluate time */
+ fcm_modname_evaluate /* evaluate */
+};
+#endif
+
+/* Generator F-Curve Modifier --------------------------- */
+
+/* Generators available:
+ * 1) simple polynomial generator:
+ * - Exanded form - (y = C[0]*(x^(n)) + C[1]*(x^(n-1)) + ... + C[n])
+ * - Factorised form - (y = (C[0][0]*x + C[0][1]) * (C[1][0]*x + C[1][1]) * ... * (C[n][0]*x + C[n][1]))
+ */
+
+static void fcm_generator_free (FModifier *fcm)
+{
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ /* free polynomial coefficients array */
+ if (data->coefficients)
+ MEM_freeN(data->coefficients);
+}
+
+static void fcm_generator_copy (FModifier *fcm, FModifier *src)
+{
+ FMod_Generator *gen= (FMod_Generator *)fcm->data;
+ FMod_Generator *ogen= (FMod_Generator *)src->data;
+
+ /* copy coefficients array? */
+ if (ogen->coefficients)
+ gen->coefficients= MEM_dupallocN(ogen->coefficients);
+}
+
+static void fcm_generator_new_data (void *mdata)
+{
+ FMod_Generator *data= (FMod_Generator *)mdata;
+ float *cp;
+
+ /* set default generator to be linear 0-1 (gradient = 1, y-offset = 0) */
+ data->poly_order= 1;
+ data->arraysize= 2;
+ cp= data->coefficients= MEM_callocN(sizeof(float)*2, "FMod_Generator_Coefs");
+ cp[0] = 0; // y-offset
+ cp[1] = 1; // gradient
+}
+
+static void fcm_generator_verify (FModifier *fcm)
+{
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ /* requirements depend on mode */
+ switch (data->mode) {
+ case FCM_GENERATOR_POLYNOMIAL: /* expanded polynomial expression */
+ {
+ /* arraysize needs to be order+1, so resize if not */
+ if (data->arraysize != (data->poly_order+1)) {
+ float *nc;
+
+ /* make new coefficients array, and copy over as much data as can fit */
+ nc= MEM_callocN(sizeof(float)*(data->poly_order+1), "FMod_Generator_Coefs");
+
+ if (data->coefficients) {
+ if (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);
+
+ /* free the old data */
+ MEM_freeN(data->coefficients);
+ }
+
+ /* set the new data */
+ data->coefficients= nc;
+ data->arraysize= data->poly_order+1;
+ }
+ }
+ break;
+
+ case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* expanded polynomial expression */
+ {
+ /* arraysize needs to be 2*order, so resize if not */
+ if (data->arraysize != (data->poly_order * 2)) {
+ float *nc;
+
+ /* make new coefficients array, and copy over as much data as can fit */
+ nc= MEM_callocN(sizeof(float)*(data->poly_order*2), "FMod_Generator_Coefs");
+
+ if (data->coefficients) {
+ if (data->arraysize > (data->poly_order * 2))
+ memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order * 2));
+ else
+ memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
+
+ /* free the old data */
+ MEM_freeN(data->coefficients);
+ }
+
+ /* set the new data */
+ data->coefficients= nc;
+ data->arraysize= data->poly_order * 2;
+ }
+ }
+ break;
+ }
+}
+
+static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ /* behaviour depends on mode
+ * NOTE: the data in its default state is fine too
+ */
+ switch (data->mode) {
+ case FCM_GENERATOR_POLYNOMIAL: /* expanded polynomial expression */
+ {
+ /* we overwrite cvalue with the sum of the polynomial */
+ float *powers = MEM_callocN(sizeof(float)*data->arraysize, "Poly Powers");
+ float value= 0.0f;
+ unsigned int i;
+
+ /* for each x^n, precalculate value based on previous one first... this should be
+ * faster that calling pow() for each entry
+ */
+ for (i=0; i < data->arraysize; i++) {
+ /* first entry is x^0 = 1, otherwise, calculate based on previous */
+ if (i)
+ powers[i]= powers[i-1] * evaltime;
+ else
+ powers[0]= 1;
+ }
+
+ /* for each coefficient, add to value, which we'll write to *cvalue in one go */
+ for (i=0; i < data->arraysize; i++)
+ value += data->coefficients[i] * powers[i];
+
+ /* only if something changed, write *cvalue in one go */
+ if (data->poly_order) {
+ if (data->flag & FCM_GENERATOR_ADDITIVE)
+ *cvalue += value;
+ else
+ *cvalue= value;
+ }
+
+ /* cleanup */
+ if (powers)
+ MEM_freeN(powers);
+ }
+ break;
+
+ case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* factorised polynomial */
+ {
+ float value= 1.0f, *cp=NULL;
+ 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++)
+ value *= (cp[0]*evaltime + cp[1]);
+
+ /* only if something changed, write *cvalue in one go */
+ if (data->poly_order) {
+ if (data->flag & FCM_GENERATOR_ADDITIVE)
+ *cvalue += value;
+ else
+ *cvalue= value;
+ }
+ }
+ break;
+ }
+}
+
+static FModifierTypeInfo FMI_GENERATOR = {
+ FMODIFIER_TYPE_GENERATOR, /* type */
+ sizeof(FMod_Generator), /* size */
+ FMI_TYPE_GENERATE_CURVE, /* action type */
+ FMI_REQUIRES_NOTHING, /* requirements */
+ "Generator", /* name */
+ "FMod_Generator", /* struct name */
+ fcm_generator_free, /* free data */
+ fcm_generator_copy, /* copy data */
+ fcm_generator_new_data, /* new data */
+ fcm_generator_verify, /* verify */
+ NULL, /* evaluate time */
+ fcm_generator_evaluate /* evaluate */
+};
+
+/* Built-In Function Generator F-Curve Modifier --------------------------- */
+
+/* This uses the general equation for equations:
+ * y = amplitude * fn(phase_multiplier*x + phase_offset) + y_offset
+ *
+ * where amplitude, phase_multiplier/offset, y_offset are user-defined coefficients,
+ * x is the evaluation 'time', and 'y' is the resultant value
+ *
+ * Functions available are
+ * sin, cos, tan, sinc (normalised sin), natural log, square root
+ */
+
+static void fcm_fn_generator_new_data (void *mdata)
+{
+ FMod_FunctionGenerator *data= (FMod_FunctionGenerator *)mdata;
+
+ /* set amplitude and phase multiplier to 1.0f so that something is generated */
+ data->amplitude= 1.0f;
+ data->phase_multiplier= 1.0f;
+}
+
+/* Unary 'normalised sine' function
+ * y = sin(PI + x) / (PI * x),
+ * except for x = 0 when y = 1.
+ */
+static double sinc (double x)
+{
+ if (fabs(x) < 0.0001)
+ return 1.0;
+ else
+ return sin(M_PI * x) / (M_PI * x);
+}
+
+static void fcm_fn_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ FMod_FunctionGenerator *data= (FMod_FunctionGenerator *)fcm->data;
+ double arg= data->phase_multiplier*evaltime + data->phase_offset;
+ double (*fn)(double v) = NULL;
+
+ /* get function pointer to the func to use:
+ * WARNING: must perform special argument validation hereto guard against crashes
+ */
+ switch (data->type)
+ {
+ /* simple ones */
+ case FCM_GENERATOR_FN_SIN: /* sine wave */
+ fn= sin;
+ break;
+ case FCM_GENERATOR_FN_COS: /* cosine wave */
+ fn= cos;
+ break;
+ case FCM_GENERATOR_FN_SINC: /* normalised sine wave */
+ fn= sinc;
+ break;
+
+ /* validation required */
+ case FCM_GENERATOR_FN_TAN: /* tangent wave */
+ {
+ /* check that argument is not on one of the discontinuities (i.e. 90deg, 270 deg, etc) */
+ if IS_EQ(fmod((arg - M_PI_2), M_PI), 0.0) {
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ *cvalue = 0.0f; /* no value possible here */
+ }
+ else
+ fn= tan;
+ }
+ break;
+ case FCM_GENERATOR_FN_LN: /* natural log */
+ {
+ /* check that value is greater than 1? */
+ if (arg > 1.0f) {
+ fn= log;
+ }
+ else {
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ *cvalue = 0.0f; /* no value possible here */
+ }
+ }
+ break;
+ case FCM_GENERATOR_FN_SQRT: /* square root */
+ {
+ /* no negative numbers */
+ if (arg > 0.0f) {
+ fn= sqrt;
+ }
+ else {
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ *cvalue = 0.0f; /* no value possible here */
+ }
+ }
+ break;
+
+ default:
+ printf("Invalid Function-Generator for F-Modifier - %d \n", data->type);
+ }
+
+ /* execute function callback to set value if appropriate */
+ if (fn) {
+ float value= (float)(data->amplitude*fn(arg) + data->value_offset);
+
+ if (data->flag & FCM_GENERATOR_ADDITIVE)
+ *cvalue += value;
+ else
+ *cvalue= value;
+ }
+}
+
+static FModifierTypeInfo FMI_FN_GENERATOR = {
+ FMODIFIER_TYPE_FN_GENERATOR, /* type */
+ sizeof(FMod_FunctionGenerator), /* size */
+ FMI_TYPE_GENERATE_CURVE, /* action type */
+ FMI_REQUIRES_NOTHING, /* requirements */
+ "Built-In Function", /* name */
+ "FMod_FunctionGenerator", /* struct name */
+ NULL, /* free data */
+ NULL, /* copy data */
+ fcm_fn_generator_new_data, /* new data */
+ NULL, /* verify */
+ NULL, /* evaluate time */
+ fcm_fn_generator_evaluate /* evaluate */
+};
+
+/* Envelope F-Curve Modifier --------------------------- */
+
+static void fcm_envelope_free (FModifier *fcm)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm->data;
+
+ /* free envelope data array */
+ if (env->data)
+ MEM_freeN(env->data);
+}
+
+static void fcm_envelope_copy (FModifier *fcm, FModifier *src)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm->data;
+ FMod_Envelope *oenv= (FMod_Envelope *)src->data;
+
+ /* copy envelope data array */
+ if (oenv->data)
+ env->data= MEM_dupallocN(oenv->data);
+}
+
+static void fcm_envelope_new_data (void *mdata)
+{
+ FMod_Envelope *env= (FMod_Envelope *)mdata;
+
+ /* set default min/max ranges */
+ env->min= -1.0f;
+ env->max= 1.0f;
+}
+
+static void fcm_envelope_verify (FModifier *fcm)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm->data;
+
+ /* if the are points, perform bubble-sort on them, as user may have changed the order */
+ if (env->data) {
+ // XXX todo...
+ }
+}
+
+static void fcm_envelope_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm->data;
+ FCM_EnvelopeData *fed, *prevfed, *lastfed;
+ float min=0.0f, max=0.0f, fac=0.0f;
+ int a;
+
+ /* get pointers */
+ if (env->data == NULL) return;
+ prevfed= env->data;
+ fed= prevfed + 1;
+ lastfed= prevfed + (env->totvert-1);
+
+ /* get min/max values for envelope at evaluation time (relative to mid-value) */
+ if (prevfed->time >= evaltime) {
+ /* before or on first sample, so just extend value */
+ min= prevfed->min;
+ max= prevfed->max;
+ }
+ else if (lastfed->time <= evaltime) {
+ /* after or on last sample, so just extend value */
+ min= lastfed->min;
+ max= lastfed->max;
+ }
+ else {
+ /* evaltime occurs somewhere between segments */
+ // TODO: implement binary search for this to make it faster?
+ for (a=0; prevfed && fed && (a < env->totvert-1); a++, prevfed=fed, fed++) {
+ /* evaltime occurs within the interval defined by these two envelope points */
+ if ((prevfed->time <= evaltime) && (fed->time >= evaltime)) {
+ float afac, bfac, diff;
+
+ diff= fed->time - prevfed->time;
+ afac= (evaltime - prevfed->time) / diff;
+ bfac= (fed->time - evaltime) / diff;
+
+ min= bfac*prevfed->min + afac*fed->min;
+ max= bfac*prevfed->max + afac*fed->max;
+
+ break;
+ }
+ }
+ }
+
+ /* adjust *cvalue
+ * - fac is the ratio of how the current y-value corresponds to the reference range
+ * - thus, the new value is found by mapping the old range to the new!
+ */
+ fac= (*cvalue - (env->midval + env->min)) / (env->max - env->min);
+ *cvalue= min + fac*(max - min);
+}
+
+static FModifierTypeInfo FMI_ENVELOPE = {
+ FMODIFIER_TYPE_ENVELOPE, /* type */
+ sizeof(FMod_Envelope), /* size */
+ FMI_TYPE_REPLACE_VALUES, /* action type */
+ 0, /* requirements */
+ "Envelope", /* name */
+ "FMod_Envelope", /* struct name */
+ fcm_envelope_free, /* free data */
+ fcm_envelope_copy, /* copy data */
+ fcm_envelope_new_data, /* new data */
+ fcm_envelope_verify, /* verify */
+ NULL, /* evaluate time */
+ fcm_envelope_evaluate /* evaluate */
+};
+
+/* Cycles F-Curve Modifier --------------------------- */
+
+/* This modifier changes evaltime to something that exists within the curve's frame-range,
+ * then re-evaluates modifier stack up to this point using the new time. This re-entrant behaviour
+ * is very likely to be more time-consuming than the original approach... (which was tighly integrated into
+ * the calculation code...).
+ *
+ * NOTE: this needs to be at the start of the stack to be of use, as it needs to know the extents of the keyframes/sample-data
+ * Possible TODO - store length of cycle information that can be initialised from the extents of the keyframes/sample-data, and adjusted
+ * as appropriate
+ */
+
+/* temp data used during evaluation */
+typedef struct tFCMED_Cycles {
+ float cycyofs; /* y-offset to apply */
+} tFCMED_Cycles;
+
+static void fcm_cycles_new_data (void *mdata)
+{
+ FMod_Cycles *data= (FMod_Cycles *)mdata;
+
+ /* turn on cycles by default */
+ data->before_mode= data->after_mode= FCM_EXTRAPOLATE_CYCLIC;
+}
+
+static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float 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;
+
+ /* check if modifier is first in stack, otherwise disable ourself... */
+ // FIXME...
+ if (fcm->prev) {
+ fcm->flag |= FMODIFIER_FLAG_DISABLED;
+ return evaltime;
+ }
+
+ /* calculate new evaltime due to cyclic interpolation */
+ if (fcu && fcu->bezt) {
+ BezTriple *prevbezt= fcu->bezt;
+ BezTriple *lastbezt= prevbezt + fcu->totvert-1;
+
+ prevkey[0]= prevbezt->vec[1][0];
+ prevkey[1]= prevbezt->vec[1][1];
+
+ lastkey[0]= lastbezt->vec[1][0];
+ lastkey[1]= lastbezt->vec[1][1];
+ }
+ else if (fcu && fcu->fpt) {
+ FPoint *prevfpt= fcu->fpt;
+ FPoint *lastfpt= prevfpt + fcu->totvert-1;
+
+ prevkey[0]= prevfpt->vec[0];
+ prevkey[1]= prevfpt->vec[1];
+
+ lastkey[0]= lastfpt->vec[0];
+ lastkey[1]= lastfpt->vec[1];
+ }
+ else
+ return evaltime;
+
+ /* check if modifier will do anything
+ * 1) if in data range, definitely don't do anything
+ * 2) if before first frame or after last frame, make sure some cycling is in use
+ */
+ if (evaltime < prevkey[0]) {
+ if (data->before_mode) {
+ side= -1;
+ mode= data->before_mode;
+ cycles= data->before_cycles;
+ }
+ }
+ else if (evaltime > lastkey[0]) {
+ if (data->after_mode) {
+ side= 1;
+ mode= data->after_mode;
+ cycles= data->after_cycles;
+ }
+ }
+ if ELEM(0, side, mode)
+ return evaltime;
+
+ /* 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];
+
+ /* calculate period and amplitude (total height) of a cycle */
+ cycdx= lastkey[0] - prevkey[0];
+ cycdy= lastkey[1] - prevkey[1];
+
+ /* check if cycle is infinitely small, to be point of being impossible to use */
+ if (cycdx == 0)
+ return evaltime;
+
+ /* calculate the 'number' of the cycle */
+ cycle= ((float)side * (evaltime - ofs) / cycdx);
+
+ /* check that cyclic is still enabled for the specified time */
+ if (cycles == 0) {
+ /* catch this case so that we don't exit when we have cycles=0
+ * as this indicates infinite cycles...
+ */
+ }
+ else if (cycle > (cycles+1)) {
+ /* we are too far away from range to evaluate
+ * TODO: but we should still hold last value...
+ */
+ return evaltime;
+ }
+
+ /* check if 'cyclic extrapolation', and thus calculate y-offset for this cycle */
+ if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
+ cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ cycyofs *= cycdy;
+ }
+
+ /* calculate where in the cycle we are (overwrite evaltime to reflect this) */
+ if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle) % 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));
+ else
+ evaltime= (float)(lastkey[0] - fmod(evaltime-ofs, cycdx));
+ }
+ else {
+ /* the cycle is played normally... */
+ evaltime= (float)(fmod(evaltime-ofs, cycdx) + ofs);
+ }
+ if (evaltime < ofs) evaltime += cycdx;
+ }
+
+ /* store temp data if needed */
+ if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
+ tFCMED_Cycles *edata;
+
+ /* for now, this is just a float, but we could get more stuff... */
+ fcm->edata= edata= MEM_callocN(sizeof(tFCMED_Cycles), "tFCMED_Cycles");
+ edata->cycyofs= cycyofs;
+ }
+
+ /* return the new frame to evaluate */
+ return evaltime;
+}
+
+static void fcm_cycles_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ tFCMED_Cycles *edata= (tFCMED_Cycles *)fcm->edata;
+
+ /* use temp data */
+ if (edata) {
+ /* add cyclic offset - no need to check for now, otherwise the data wouldn't exist! */
+ *cvalue += edata->cycyofs;
+
+ /* free temp data */
+ MEM_freeN(edata);
+ fcm->edata= NULL;
+ }
+}
+
+static FModifierTypeInfo FMI_CYCLES = {
+ FMODIFIER_TYPE_CYCLES, /* type */
+ sizeof(FMod_Cycles), /* size */
+ FMI_TYPE_EXTRAPOLATION, /* action type */
+ FMI_REQUIRES_ORIGINAL_DATA, /* requirements */
+ "Cycles", /* name */
+ "FMod_Cycles", /* struct name */
+ NULL, /* free data */
+ NULL, /* copy data */
+ fcm_cycles_new_data, /* new data */
+ NULL /*fcm_cycles_verify*/, /* verify */
+ fcm_cycles_time, /* evaluate time */
+ fcm_cycles_evaluate /* evaluate */
+};
+
+/* Noise F-Curve Modifier --------------------------- */
+
+static void fcm_noise_new_data (void *mdata)
+{
+ FMod_Noise *data= (FMod_Noise *)mdata;
+
+ /* defaults */
+ data->size= 1.0f;
+ data->strength= 1.0f;
+ data->phase= 1.0f;
+ data->depth = 0;
+ data->modification = FCM_NOISE_MODIF_REPLACE;
+}
+
+static void fcm_noise_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ FMod_Noise *data= (FMod_Noise *)fcm->data;
+ float noise;
+
+ noise = BLI_turbulence(data->size, evaltime, data->phase, 0.f, data->depth);
+
+ switch (data->modification) {
+ case FCM_NOISE_MODIF_ADD:
+ *cvalue= *cvalue + noise * data->strength;
+ break;
+ case FCM_NOISE_MODIF_SUBTRACT:
+ *cvalue= *cvalue - noise * data->strength;
+ break;
+ case FCM_NOISE_MODIF_MULTIPLY:
+ *cvalue= *cvalue * noise * data->strength;
+ break;
+ case FCM_NOISE_MODIF_REPLACE:
+ default:
+ *cvalue= *cvalue + (noise - 0.5f) * data->strength;
+ break;
+ }
+}
+
+static FModifierTypeInfo FMI_NOISE = {
+ FMODIFIER_TYPE_NOISE, /* type */
+ sizeof(FMod_Noise), /* size */
+ FMI_TYPE_REPLACE_VALUES, /* action type */
+ 0, /* requirements */
+ "Noise", /* name */
+ "FMod_Noise", /* struct name */
+ NULL, /* free data */
+ NULL, /* copy data */
+ fcm_noise_new_data, /* new data */
+ NULL /*fcm_noise_verify*/, /* verify */
+ NULL, /* evaluate time */
+ fcm_noise_evaluate /* evaluate */
+};
+
+/* Filter F-Curve Modifier --------------------------- */
+
+#if 0 // XXX not yet implemented
+static FModifierTypeInfo FMI_FILTER = {
+ FMODIFIER_TYPE_FILTER, /* type */
+ sizeof(FMod_Filter), /* size */
+ FMI_TYPE_REPLACE_VALUES, /* action type */
+ 0, /* requirements */
+ "Filter", /* name */
+ "FMod_Filter", /* struct name */
+ NULL, /* free data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ NULL /*fcm_filter_verify*/, /* verify */
+ NULL, /* evlauate time */
+ fcm_filter_evaluate /* evaluate */
+};
+#endif // XXX not yet implemented
+
+
+/* Python F-Curve Modifier --------------------------- */
+
+static void fcm_python_free (FModifier *fcm)
+{
+ FMod_Python *data= (FMod_Python *)fcm->data;
+
+ /* id-properties */
+ IDP_FreeProperty(data->prop);
+ MEM_freeN(data->prop);
+}
+
+static void fcm_python_new_data (void *mdata)
+{
+ FMod_Python *data= (FMod_Python *)mdata;
+
+ /* everything should be set correctly by calloc, except for the prop->type constant.*/
+ data->prop = MEM_callocN(sizeof(IDProperty), "PyFModifierProps");
+ data->prop->type = IDP_GROUP;
+}
+
+static void fcm_python_copy (FModifier *fcm, FModifier *src)
+{
+ FMod_Python *pymod = (FMod_Python *)fcm->data;
+ FMod_Python *opymod = (FMod_Python *)src->data;
+
+ pymod->prop = IDP_CopyProperty(opymod->prop);
+}
+
+static void fcm_python_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+#ifndef DISABLE_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 */
+}
+
+static FModifierTypeInfo FMI_PYTHON = {
+ FMODIFIER_TYPE_PYTHON, /* type */
+ sizeof(FMod_Python), /* size */
+ FMI_TYPE_GENERATE_CURVE, /* action type */
+ FMI_REQUIRES_RUNTIME_CHECK, /* requirements */
+ "Python", /* name */
+ "FMod_Python", /* struct name */
+ fcm_python_free, /* free data */
+ fcm_python_copy, /* copy data */
+ fcm_python_new_data, /* new data */
+ NULL /*fcm_python_verify*/, /* verify */
+ NULL /*fcm_python_time*/, /* evaluate time */
+ fcm_python_evaluate /* evaluate */
+};
+
+
+/* Limits F-Curve Modifier --------------------------- */
+
+static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+{
+ FMod_Limits *data= (FMod_Limits *)fcm->data;
+
+ /* check for the time limits */
+ if ((data->flag & FCM_LIMIT_XMIN) && (evaltime < data->rect.xmin))
+ return data->rect.xmin;
+ if ((data->flag & FCM_LIMIT_XMAX) && (evaltime > data->rect.xmax))
+ return data->rect.xmax;
+
+ /* modifier doesn't change time */
+ return evaltime;
+}
+
+static void fcm_limits_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+{
+ FMod_Limits *data= (FMod_Limits *)fcm->data;
+
+ /* value limits now */
+ if ((data->flag & FCM_LIMIT_YMIN) && (*cvalue < data->rect.ymin))
+ *cvalue= data->rect.ymin;
+ if ((data->flag & FCM_LIMIT_YMAX) && (*cvalue > data->rect.ymax))
+ *cvalue= data->rect.ymax;
+}
+
+static FModifierTypeInfo FMI_LIMITS = {
+ FMODIFIER_TYPE_LIMITS, /* type */
+ sizeof(FMod_Limits), /* size */
+ FMI_TYPE_GENERATE_CURVE, /* action type */ /* XXX... err... */
+ FMI_REQUIRES_RUNTIME_CHECK, /* requirements */
+ "Limits", /* name */
+ "FMod_Limits", /* struct name */
+ NULL, /* free data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ NULL, /* verify */
+ fcm_limits_time, /* evaluate time */
+ fcm_limits_evaluate /* evaluate */
+};
+
+/* F-Curve Modifier API --------------------------- */
+/* All of the F-Curve Modifier api functions use FModifierTypeInfo structs to carry out
+ * and operations that involve F-Curve modifier specific code.
+ */
+
+/* These globals only ever get directly accessed in this file */
+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 ()
+{
+ fmodifiersTypeInfo[0]= NULL; /* 'Null' F-Curve Modifier */
+ fmodifiersTypeInfo[1]= &FMI_GENERATOR; /* Generator F-Curve Modifier */
+ fmodifiersTypeInfo[2]= &FMI_FN_GENERATOR; /* Built-In Function Generator F-Curve Modifier */
+ fmodifiersTypeInfo[3]= &FMI_ENVELOPE; /* Envelope F-Curve Modifier */
+ fmodifiersTypeInfo[4]= &FMI_CYCLES; /* Cycles F-Curve Modifier */
+ fmodifiersTypeInfo[5]= &FMI_NOISE; /* Apply-Noise F-Curve Modifier */
+ fmodifiersTypeInfo[6]= NULL/*&FMI_FILTER*/; /* Filter F-Curve Modifier */ // XXX unimplemented
+ fmodifiersTypeInfo[7]= &FMI_PYTHON; /* Custom Python F-Curve Modifier */
+ fmodifiersTypeInfo[8]= &FMI_LIMITS; /* Limits F-Curve Modifier */
+}
+
+/* This function should be used for getting the appropriate type-info when only
+ * a F-Curve modifier type is known
+ */
+FModifierTypeInfo *get_fmodifier_typeinfo (int type)
+{
+ /* initialise the type-info list? */
+ if (FMI_INIT) {
+ fmods_init_typeinfo();
+ FMI_INIT = 0;
+ }
+
+ /* only return for valid types */
+ if ( (type >= FMODIFIER_TYPE_NULL) &&
+ (type <= FMODIFIER_NUM_TYPES ) )
+ {
+ /* there shouldn't be any segfaults here... */
+ return fmodifiersTypeInfo[type];
+ }
+ else {
+ printf("No valid F-Curve Modifier type-info data available. Type = %i \n", type);
+ }
+
+ return NULL;
+}
+
+/* This function should always be used to get the appropriate type-info, as it
+ * has checks which prevent segfaults in some weird cases.
+ */
+FModifierTypeInfo *fmodifier_get_typeinfo (FModifier *fcm)
+{
+ /* only return typeinfo for valid modifiers */
+ if (fcm)
+ return get_fmodifier_typeinfo(fcm->type);
+ else
+ return NULL;
+}
+
+/* API --------------------------- */
+
+/* Add a new F-Curve Modifier to the given F-Curve of a certain type */
+FModifier *add_fmodifier (ListBase *modifiers, int type)
+{
+ FModifierTypeInfo *fmi= get_fmodifier_typeinfo(type);
+ FModifier *fcm;
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, fmi)
+ return NULL;
+
+ /* special checks for whether modifier can be added */
+ if ((modifiers->first) && (type == FMODIFIER_TYPE_CYCLES)) {
+ /* cycles modifier must be first in stack, so for now, don't add if it can't be */
+ // TODO: perhaps there is some better way, but for now,
+ printf("Error: Cannot add 'Cycles' modifier to F-Curve, as 'Cycles' modifier can only be first in stack. \n");
+ return NULL;
+ }
+
+ /* add modifier itself */
+ fcm= MEM_callocN(sizeof(FModifier), "F-Curve Modifier");
+ fcm->type = type;
+ fcm->flag = FMODIFIER_FLAG_EXPANDED;
+ BLI_addtail(modifiers, fcm);
+
+ /* 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);
+
+ /* return modifier for further editing */
+ return fcm;
+}
+
+/* Duplicate all of the F-Modifiers in the Modifier stacks */
+void copy_fmodifiers (ListBase *dst, ListBase *src)
+{
+ FModifier *fcm, *srcfcm;
+
+ if ELEM(NULL, dst, src)
+ return;
+
+ dst->first= dst->last= NULL;
+ BLI_duplicatelist(dst, src);
+
+ for (fcm=dst->first, srcfcm=src->first; fcm && srcfcm; srcfcm=srcfcm->next, fcm=fcm->next) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* make a new copy of the F-Modifier's data */
+ fcm->data = MEM_dupallocN(fcm->data);
+
+ /* only do specific constraints if required */
+ if (fmi && fmi->copy_data)
+ fmi->copy_data(fcm, srcfcm);
+ }
+}
+
+/* Remove and free the given F-Modifier from the given stack */
+void remove_fmodifier (ListBase *modifiers, FModifier *fcm)
+{
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* sanity check */
+ if (fcm == NULL)
+ return;
+
+ /* free modifier's special data (stored inside fcm->data) */
+ if (fcm->data) {
+ if (fmi && fmi->free_data)
+ fmi->free_data(fcm);
+
+ /* free modifier's data (fcm->data) */
+ MEM_freeN(fcm->data);
+ }
+
+ /* remove modifier from stack */
+ if (modifiers)
+ BLI_freelinkN(modifiers, fcm);
+ else {
+ // XXX this case can probably be removed some day, as it shouldn't happen...
+ printf("remove_fmodifier() - no modifier stack given \n");
+ MEM_freeN(fcm);
+ }
+}
+
+/* Remove all of a given F-Curve's modifiers */
+void free_fmodifiers (ListBase *modifiers)
+{
+ FModifier *fcm, *fmn;
+
+ /* sanity check */
+ if (modifiers == NULL)
+ return;
+
+ /* free each modifier in order - modifier is unlinked from list and freed */
+ for (fcm= modifiers->first; fcm; fcm= fmn) {
+ fmn= fcm->next;
+ remove_fmodifier(modifiers, fcm);
+ }
+}
+
+/* Find the active F-Modifier */
+FModifier *find_active_fmodifier (ListBase *modifiers)
+{
+ FModifier *fcm;
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, modifiers->first)
+ return NULL;
+
+ /* loop over modifiers until 'active' one is found */
+ for (fcm= modifiers->first; fcm; fcm= fcm->next) {
+ if (fcm->flag & FMODIFIER_FLAG_ACTIVE)
+ return fcm;
+ }
+
+ /* no modifier is active */
+ return NULL;
+}
+
+/* Set the active F-Modifier */
+void set_active_fmodifier (ListBase *modifiers, FModifier *fcm)
+{
+ FModifier *fm;
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, modifiers->first)
+ return;
+
+ /* deactivate all, and set current one active */
+ for (fm= modifiers->first; fm; fm= fm->next)
+ fm->flag &= ~FMODIFIER_FLAG_ACTIVE;
+
+ /* make given modifier active */
+ if (fcm)
+ fcm->flag |= FMODIFIER_FLAG_ACTIVE;
+}
+
+/* Do we have any modifiers which match certain criteria
+ * - mtype - type of modifier (if 0, doesn't matter)
+ * - acttype - type of action to perform (if -1, doesn't matter)
+ */
+short list_has_suitable_fmodifier (ListBase *modifiers, int mtype, short acttype)
+{
+ FModifier *fcm;
+
+ /* if there are no specific filtering criteria, just skip */
+ if ((mtype == 0) && (acttype == 0))
+ return (modifiers && modifiers->first);
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, modifiers->first)
+ return 0;
+
+ /* find the first mdifier fitting these criteria */
+ for (fcm= modifiers->first; fcm; fcm= fcm->next) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+ short mOk=1, aOk=1; /* by default 1, so that when only one test, won't fail */
+
+ /* check if applicable ones are fullfilled */
+ if (mtype)
+ mOk= (fcm->type == mtype);
+ if (acttype > -1)
+ aOk= (fmi->acttype == acttype);
+
+ /* if both are ok, we've found a hit */
+ if (mOk && aOk)
+ return 1;
+ }
+
+ /* no matches */
+ return 0;
+}
+
+/* Evaluation API --------------------------- */
+
+/* evaluate time modifications imposed by some F-Curve Modifiers
+ * - this step acts as an optimisation to prevent the F-Curve stack being evaluated
+ * several times by modifiers requesting the time be modified, as the final result
+ * would have required using the modified time
+ * - modifiers only ever recieve the unmodified time, as subsequent modifiers should be
+ * working on the 'global' result of the modified curve, not some localised segment,
+ * so nevaltime gets set to whatever the last time-modifying modifier likes...
+ * - we start from the end of the stack, as only the last one matters for now
+ */
+float evaluate_time_fmodifiers (ListBase *modifiers, FCurve *fcu, float cvalue, float evaltime)
+{
+ FModifier *fcm;
+ float m_evaltime= evaltime;
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, modifiers->last)
+ return evaltime;
+
+ /* find the first modifier from end of stack that modifies time, and calculate the time the modifier
+ * would calculate time at
+ */
+ for (fcm= modifiers->last; fcm; fcm= fcm->prev) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* only evaluate if there's a callback for this */
+ // TODO: implement the 'influence' control feature...
+ if (fmi && fmi->evaluate_modifier_time) {
+ if ((fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED)) == 0)
+ m_evaltime= fmi->evaluate_modifier_time(fcu, fcm, cvalue, evaltime);
+ break;
+ }
+ }
+
+ /* return the modified evaltime */
+ return m_evaltime;
+}
+
+/* Evalautes the given set of F-Curve Modifiers using the given data
+ * Should only be called after evaluate_time_fmodifiers() has been called...
+ */
+void evaluate_value_fmodifiers (ListBase *modifiers, FCurve *fcu, float *cvalue, float evaltime)
+{
+ FModifier *fcm;
+
+ /* sanity checks */
+ if ELEM(NULL, modifiers, modifiers->first)
+ return;
+
+ /* evaluate modifiers */
+ for (fcm= modifiers->first; fcm; fcm= fcm->next) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* only evaluate if there's a callback for this */
+ // TODO: implement the 'influence' control feature...
+ if (fmi && fmi->evaluate_modifier) {
+ if ((fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED)) == 0)
+ fmi->evaluate_modifier(fcu, fcm, cvalue, evaltime);
+ }
+ }
+}
+
+/* ---------- */
+
+/* Bake modifiers for given F-Curve to curve sample data, in the frame range defined
+ * by start and end (inclusive).
+ */
+void fcurve_bake_modifiers (FCurve *fcu, int start, int end)
+{
+ ChannelDriver *driver;
+
+ /* sanity checks */
+ // TODO: make these tests report errors using reports not printf's
+ if ELEM(NULL, fcu, fcu->modifiers.first) {
+ printf("Error: No F-Curve with F-Curve Modifiers to Bake\n");
+ return;
+ }
+
+ /* temporarily, disable driver while we sample, so that they don't influence the outcome */
+ driver= fcu->driver;
+ fcu->driver= NULL;
+
+ /* bake the modifiers, by sampling the curve at each frame */
+ fcurve_store_samples(fcu, NULL, start, end, fcurve_samplingcb_evalcurve);
+
+ /* free the modifiers now */
+ free_fmodifiers(&fcu->modifiers);
+
+ /* restore driver */
+ fcu->driver= driver;
+}
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 60a7ffc28d9..4e05bf45d3d 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -129,7 +129,7 @@ wcsleninu8(wchar_t *src)
}
int
-utf8slen(char *src)
+static utf8slen(char *src)
{
int size = 0, index = 0;
unsigned char c;
@@ -333,11 +333,11 @@ static VFontData *vfont_get_data(VFont *vfont)
BLI_addtail(&ttfdata, tmpfnt);
}
} else {
- pf= newPackedFile(vfont->name);
+ pf= newPackedFile(NULL, vfont->name);
if(!tmpfnt)
{
- tpf= newPackedFile(vfont->name);
+ tpf= newPackedFile(NULL, vfont->name);
// Add temporary packed file to globals
tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
@@ -385,8 +385,8 @@ VFont *load_vfont(char *name)
strcpy(dir, name);
BLI_splitdirstring(dir, filename);
- pf= newPackedFile(name);
- tpf= newPackedFile(name);
+ pf= newPackedFile(NULL, name);
+ tpf= newPackedFile(NULL, name);
is_builtin= 0;
}
@@ -462,7 +462,7 @@ static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, i
nu2->resolu= cu->resolu;
nu2->bezt = NULL;
nu2->knotsu = nu2->knotsv = NULL;
- nu2->flag= 0;
+ nu2->flag= CU_2D;
nu2->charidx = charidx+1000;
if (mat_nr > 0) nu2->mat_nr= mat_nr-1;
nu2->pntsu = 4;
@@ -495,7 +495,6 @@ static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, i
nu2->bp[3].vec[2] = 0;
nu2->bp[3].vec[3] = 1.0;
- nu2->type = CU_2D;
BLI_addtail(&(cu->nurb), nu2);
}
@@ -1040,8 +1039,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
/* calc the right loc AND the right rot separately */
/* vec, tvec need 4 items */
- where_on_path(cu->textoncurve, ctime, vec, tvec);
- where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec);
+ where_on_path(cu->textoncurve, ctime, vec, tvec, NULL, NULL);
+ where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec, NULL, NULL);
VecMulf(vec, sizefac);
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index dd8f44c71d5..43c4137e73e 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -214,6 +214,11 @@ bGPdata *gpencil_data_addnew (char name[])
/* initial settings */
gpd->flag = (GP_DATA_DISPINFO|GP_DATA_EXPAND);
+ /* for now, stick to view is also enabled by default
+ * since this is more useful...
+ */
+ gpd->flag |= GP_DATA_VIEWALIGN;
+
return gpd;
}
@@ -308,7 +313,7 @@ bGPdata *gpencil_data_duplicate (bGPdata *src)
void gpencil_frame_delete_laststroke (bGPDlayer *gpl, bGPDframe *gpf)
{
bGPDstroke *gps= (gpf) ? gpf->strokes.last : NULL;
- int cfra = 1; // XXX FIXME!!!
+ int cfra = (gpf) ? gpf->framenum : 0; /* assume that the current frame was not locked */
/* error checking */
if (ELEM(NULL, gpf, gps))
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 6fffbd794ef..6bb47bc0f0f 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -142,6 +142,16 @@ Group *add_group(char *name)
return group;
}
+Group *copy_group(Group *group)
+{
+ Group *groupn;
+
+ groupn= MEM_dupallocN(group);
+ BLI_duplicatelist(&groupn->gobject, &group->gobject);
+
+ return groupn;
+}
+
/* external */
void add_to_group(Group *group, Object *ob)
{
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index 54366aadd92..3cff82f522a 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -167,7 +167,7 @@ void IDP_ResizeIDPArray(IDProperty *prop, int newlen)
for (i=newlen; i<prop->len; i++) {
IDP_FreeProperty(GETPROP(prop, i));
}
- memcpy(newarr, prop->data.pointer, newlen*prop->len*sizeof(IDProperty));
+ memcpy(newarr, prop->data.pointer, newlen*sizeof(IDProperty));
}
if(prop->data.pointer)
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 8eef9984c92..9953540bbcf 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -38,6 +38,11 @@
#include <time.h>
+#ifdef _WIN32
+#define open _open
+#define close _close
+#endif
+
#include "MEM_guardedalloc.h"
#include "IMB_imbuf_types.h"
@@ -73,6 +78,8 @@
//XXX #include "BIF_editseq.h"
+#include "BLF_api.h"
+
#include "PIL_time.h"
#include "RE_pipeline.h"
@@ -253,6 +260,10 @@ void free_image(Image *ima)
if (ima->preview) {
BKE_previewimg_free(&ima->preview);
}
+ if (ima->render_text) {
+ MEM_freeN(ima->render_text);
+ ima->render_text= NULL;
+ }
}
/* only image block itself */
@@ -266,7 +277,7 @@ static Image *image_alloc(const char *name, short source, short type)
ima->xrep= ima->yrep= 1;
ima->aspx= ima->aspy= 1.0;
- ima->gen_x= 256; ima->gen_y= 256;
+ ima->gen_x= 1024; ima->gen_y= 1024;
ima->gen_type= 1; /* no defines yet? */
ima->source= source;
@@ -452,19 +463,19 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
* easy to tweak like this, speed isn't really that much of an issue in this situation... */
/* checkers */
- for(y=0; y<ibuf->y; y++) {
- dark = pow(-1, floor(y / checkerwidth));
+ for(y=0; y<height; y++) {
+ dark = powf(-1.0f, floorf(y / checkerwidth));
- for(x=0; x<ibuf->x; x++) {
+ for(x=0; x<width; x++) {
if (x % checkerwidth == 0) dark *= -1;
if (floatbuf) {
if (dark > 0) {
- rect_float[0] = rect_float[1] = rect_float[2] = 0.25;
- rect_float[3] = 1.0;
+ rect_float[0] = rect_float[1] = rect_float[2] = 0.25f;
+ rect_float[3] = 1.0f;
} else {
- rect_float[0] = rect_float[1] = rect_float[2] = 0.58;
- rect_float[3] = 1.0;
+ rect_float[0] = rect_float[1] = rect_float[2] = 0.58f;
+ rect_float[3] = 1.0f;
}
rect_float+=4;
}
@@ -485,11 +496,11 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
if (floatbuf) rect_float= (float*)ibuf->rect_float;
else rect= (unsigned char*)ibuf->rect;
- for(y=0; y<ibuf->y; y++) {
- hoffs = 0.125 * floor(y / checkerwidth);
+ for(y=0; y<height; y++) {
+ hoffs = 0.125f * floorf(y / checkerwidth);
- for(x=0; x<ibuf->x; x++) {
- h = 0.125 * floor(x / checkerwidth);
+ for(x=0; x<width; x++) {
+ h = 0.125f * floorf(x / checkerwidth);
if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) &&
(fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) {
@@ -497,19 +508,19 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 1) ||
(fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) {
- hue = fmod(fabs(h-hoffs), 1.0);
+ hue = fmodf(fabs(h-hoffs), 1.0f);
hsv_to_rgb(hue, s, v, &r, &g, &b);
if (floatbuf) {
rect_float[0]= r;
rect_float[1]= g;
rect_float[2]= b;
- rect_float[3]= 1.0;
+ rect_float[3]= 1.0f;
}
else {
- rect[0]= (char)(r * 255.0);
- rect[1]= (char)(g * 255.0);
- rect[2]= (char)(b * 255.0);
+ rect[0]= (char)(r * 255.0f);
+ rect[1]= (char)(g * 255.0f);
+ rect[2]= (char)(b * 255.0f);
rect[3]= 255;
}
}
@@ -522,8 +533,15 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
}
}
} else { /* blank image */
- for(y=0; y<ibuf->y; y++) {
- for(x=0; x<ibuf->x; x++) {
+ char ccol[4];
+
+ ccol[0]= (char)(color[0]*255.0f);
+ ccol[1]= (char)(color[1]*255.0f);
+ ccol[2]= (char)(color[2]*255.0f);
+ ccol[3]= (char)(color[3]*255.0f);
+
+ for(y=0; y<height; y++) {
+ for(x=0; x<width; x++) {
if (floatbuf) {
rect_float[0]= color[0];
rect_float[1]= color[1];
@@ -532,10 +550,10 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho
rect_float+=4;
}
else {
- rect[0]= (char)(color[0] * 255.0);
- rect[1]= (char)(color[1] * 255.0);
- rect[2]= (char)(color[2] * 255.0);
- rect[3]= (char)(color[3] * 255.0);
+ rect[0]= ccol[0];
+ rect[1]= ccol[1];
+ rect[2]= ccol[2];
+ rect[3]= ccol[3];
rect+=4;
}
}
@@ -856,6 +874,9 @@ int BKE_imtype_is_movie(int imtype)
case R_AVICODEC:
case R_QUICKTIME:
case R_FFMPEG:
+ case R_H264:
+ case R_THEORA:
+ case R_XVID:
case R_FRAMESERVER:
return 1;
}
@@ -866,7 +887,7 @@ void BKE_add_image_extension(Scene *scene, char *string, int imtype)
{
char *extension="";
- if(scene->r.imtype== R_IRIS) {
+ if(imtype== R_IRIS) {
if(!BLI_testextensie(string, ".rgb"))
extension= ".rgb";
}
@@ -878,7 +899,7 @@ void BKE_add_image_extension(Scene *scene, char *string, int imtype)
if(!BLI_testextensie(string, ".hdr"))
extension= ".hdr";
}
- else if(imtype==R_PNG || imtype==R_FFMPEG) {
+ else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
if(!BLI_testextensie(string, ".png"))
extension= ".png";
}
@@ -964,7 +985,6 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
if (do_prefix) strcpy(stamp_data->file, "File <untitled>");
else strcpy(stamp_data->file, "<untitled>");
}
- stamp_data->note[0] = '\0';
} else {
stamp_data->file[0] = '\0';
}
@@ -1032,8 +1052,8 @@ 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\n", 1 + (int) log10(scene->r.efra));
- else sprintf(format, "%%0%di\n", 1 + (int) log10(scene->r.efra));
+ 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));
sprintf (stamp_data->frame, format, scene->r.cfra);
} else {
stamp_data->frame[0] = '\0';
@@ -1069,131 +1089,172 @@ 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
+static void stamp_font_begin(int size)
+{
+ static int mono= -1;
+
+ if (mono == -1)
+ mono= BLF_load_mem("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_set(mono);
+ BLF_aspect(1.0);
+ BLF_size(size, 72);
+}
+
void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels)
{
-#if 0
-// XXX
-// This go back when BLF_draw_buffer is implemented - Diego
struct StampData stamp_data;
-
- int x=1,y=1;
- int font_height;
- int text_width;
- int text_pad;
- struct BMF_Font *font;
+ float w, h, pad;
+ int x, y;
if (!rect && !rectf)
return;
stampdata(scene, &stamp_data, 1);
-
- switch (scene->r.stamp_font_id) {
- case 1: /* tiny */
- font = BMF_GetFont(BMF_kHelveticaBold8);
- break;
- case 2: /* small */
- font = BMF_GetFont(BMF_kHelveticaBold10);
- break;
- case 3: /* medium */
- font = BMF_GetFont(BMF_kScreen12);
- break;
- case 0: /* large - default */
- font = BMF_GetFont(BMF_kScreen15);
- break;
- case 4: /* huge */
- font = BMF_GetFont(BMF_kHelveticaBold14);
- break;
- default:
- font = NULL;
- break;
- }
-
- font_height = BMF_GetFontHeight(font);
- /* All texts get halfspace+1 pixel on each side and 1 pix
- above and below as padding against their backing rectangles */
- text_pad = BMF_GetStringWidth(font, " ");
-
- x = 1; /* Inits for everyone, text position, so 1 for padding, not 0 */
- y = height - font_height - 1; /* Also inits for everyone, notice padding pixel */
-
+ stamp_font_begin(12);
+
+ BLF_buffer(rectf, rect, width, height, channels);
+ BLF_buffer_col(scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0);
+ pad= BLF_width("--");
+
+ x= 0;
+ y= height;
+
if (stamp_data.file[0]) {
/* Top left corner */
- text_width = BMF_GetStringWidth(font, stamp_data.file);
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.file, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
- y -= font_height+2; /* Top and bottom 1 pix padding each */
+ BLF_width_and_height(stamp_data.file, &w, &h);
+ y -= h;
+
+ /* also a little of space to the background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+3);
+
+ /* and draw the text. */
+ BLF_position(x, y, 0.0);
+ BLF_draw_buffer(stamp_data.file);
+
+ /* the extra pixel for background. */
+ y -= 4;
}
/* Top left corner, below File */
if (stamp_data.note[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.note);
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.note, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
- y -= font_height+2; /* Top and bottom 1 pix padding each */
+ BLF_width_and_height(stamp_data.note, &w, &h);
+ y -= h;
+
+ /* and space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-2, w+3, y+h+2);
+
+ BLF_position(x, y+1, 0.0);
+ BLF_draw_buffer(stamp_data.note);
+
+ /* the extra pixel for background. */
+ y -= 4;
}
/* Top left corner, below File (or Note) */
if (stamp_data.date[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.date);
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.date, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
+ BLF_width_and_height(stamp_data.date, &w, &h);
+ y -= h;
+
+ /* and space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3);
+
+ BLF_position(x, y, 0.0);
+ BLF_draw_buffer(stamp_data.date);
}
+ x= 0;
+ y= 0;
+
/* Bottom left corner, leaving space for timing */
if (stamp_data.marker[0]) {
- x = 1;
- y = font_height+2+1; /* 2 for padding in TIME|FRAME fields below and 1 for padding in this one */
- text_width = BMF_GetStringWidth(font, stamp_data.marker);
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.marker, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
+ BLF_width_and_height(stamp_data.marker, &w, &h);
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+3);
+
+ /* and pad the text. */
+ BLF_position(x, y+3, 0.0);
+ BLF_draw_buffer(stamp_data.marker);
+
+ /* space width. */
+ x += w + pad;
}
/* Left bottom corner */
if (stamp_data.time[0]) {
- x = 1;
- y = 1;
- text_width = BMF_GetStringWidth(font, stamp_data.time);
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.time, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
- x += text_width+text_pad+2; /* Both sides have 1 pix additional padding each */
+ BLF_width_and_height(stamp_data.time, &w, &h);
+
+ /* extra space for background */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
+
+ /* and pad the text. */
+ BLF_position(x, y+3, 0.0);
+ BLF_draw_buffer(stamp_data.time);
+
+ /* space width. */
+ x += w + pad;
}
if (stamp_data.frame[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.frame);
- /* Left bottom corner (after SMPTE if exists) */
- if (!stamp_data.time[0]) x = 1;
- y = 1;
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.frame, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
+ BLF_width_and_height(stamp_data.frame, &w, &h);
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
+
+ /* and pad the text. */
+ BLF_position(x, y+3, 0.0);
+
+ BLF_draw_buffer(stamp_data.frame);
+
+ /* space width. */
+ x += w + pad;
}
if (stamp_data.camera[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.camera);
- /* Center of bottom edge */
- x = (width/2) - (BMF_GetStringWidth(font, stamp_data.camera)/2);
- y = 1;
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.camera, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
+ BLF_width_and_height(stamp_data.camera, &w, &h);
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
+ BLF_position(x, y+3, 0.0);
+ BLF_draw_buffer(stamp_data.camera);
}
if (stamp_data.scene[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.scene);
- /* Bottom right corner */
- x = width - (text_width+1+text_pad);
- y = 1;
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.scene, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
+ BLF_width_and_height(stamp_data.scene, &w, &h);
+
+ /* Bottom right corner, with an extra space because blenfont is too strict! */
+ x= width - w - 2;
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+3);
+
+ /* and pad the text. */
+ BLF_position(x, y+3, 0.0);
+ BLF_draw_buffer(stamp_data.scene);
}
if (stamp_data.strip[0]) {
- text_width = BMF_GetStringWidth(font, stamp_data.strip);
- /* Top right corner */
- x = width - (text_width+1+text_pad);
- y = height - font_height - 1;
- buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
- BMF_DrawStringBuf(font, stamp_data.strip, x+(text_pad/2), y, scene->r.fg_stamp, rect, rectf, width, height, channels);
- }
-#endif // 0 XXX
+ BLF_width_and_height(stamp_data.scene, &w, &h);
+
+ /* Top right corner, with an extra space because blenfont is too strict! */
+ x= width - w - pad;
+ y= height - h;
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+3);
+
+ BLF_position(x, y, 0.0);
+ BLF_draw_buffer(stamp_data.strip);
+ }
+
+ /* cleanup the buffer. */
+ BLF_buffer(NULL, NULL, 0, 0, 0);
}
void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf)
@@ -1226,7 +1287,7 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
else if ((imtype==R_RADHDR)) {
ibuf->ftype= RADHDR;
}
- else if (imtype==R_PNG || imtype==R_FFMPEG) {
+ else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
ibuf->ftype= PNG;
}
#ifdef WITH_DDS
@@ -1301,7 +1362,7 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
BLI_make_existing_file(name);
- if(scene->r.scemode & R_STAMP_INFO)
+ if(scene->r.stamp & R_STAMP_ALL)
BKE_stamp_info(scene, ibuf);
ok = IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat);
@@ -1411,9 +1472,11 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
iuser->ok= 1;
break;
case IMA_SIGNAL_SRC_CHANGE:
- if(ima->type==IMA_TYPE_MULTILAYER)
- image_free_buffers(ima);
- else if(ima->source==IMA_SRC_GENERATED) {
+ if(ima->type == IMA_TYPE_UV_TEST)
+ if(ima->source != IMA_SRC_GENERATED)
+ ima->type= IMA_TYPE_IMAGE;
+
+ if(ima->source==IMA_SRC_GENERATED) {
if(ima->gen_x==0 || ima->gen_y==0) {
ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
if(ibuf) {
@@ -1422,6 +1485,9 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
}
}
}
+
+ image_free_buffers(ima);
+
ima->ok= 1;
if(iuser)
iuser->ok= 1;
@@ -1431,7 +1497,7 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
/* try to repack file */
if(ima->packedfile) {
PackedFile *pf;
- pf = newPackedFile(ima->name);
+ pf = newPackedFile(NULL, ima->name);
if (pf) {
freePackedFile(ima->packedfile);
ima->packedfile = pf;
@@ -1750,7 +1816,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
/* make packed file for autopack */
if ((ima->packedfile == NULL) && (G.fileflags & G_AUTOPACK))
- ima->packedfile = newPackedFile(str);
+ ima->packedfile = newPackedFile(NULL, str);
}
if(ima->flag & IMA_DO_PREMUL)
@@ -1812,7 +1878,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser)
Render *re= NULL;
RenderResult *rr= NULL;
- if(iuser->scene) {
+ if(iuser && iuser->scene) {
re= RE_GetRender(iuser->scene->id.name);
rr= RE_GetResult(re);
}
@@ -2029,8 +2095,8 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
else if(ima->source == IMA_SRC_GENERATED) {
/* generated is: ibuf is allocated dynamically */
/* UV testgrid or black or solid etc */
- if(ima->gen_x==0) ima->gen_x= 256;
- if(ima->gen_y==0) ima->gen_y= 256;
+ if(ima->gen_x==0) ima->gen_x= 1024;
+ if(ima->gen_y==0) ima->gen_y= 1024;
ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 0, ima->gen_type, color);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
ima->ok= IMA_OK_LOADED;
@@ -2109,3 +2175,103 @@ void BKE_image_user_calc_imanr(ImageUser *iuser, int cfra, int fieldnr)
}
}
+/*
+ Produce image export path.
+
+ Fails returning 0 if image filename is empty or if destination path
+ matches image path (i.e. both are the same file).
+
+ Trailing slash in dest_dir is optional.
+
+ Logic:
+
+ - if an image is "below" current .blend file directory, rebuild the
+ same dir structure in dest_dir
+
+ For example //textures/foo/bar.png becomes
+ [dest_dir]/textures/foo/bar.png.
+
+ - if an image is not "below" current .blend file directory,
+ disregard it's path and copy it in the same directory where 3D file
+ goes.
+
+ For example //../foo/bar.png becomes [dest_dir]/bar.png.
+
+ This logic will help ensure that all image paths are relative and
+ that a user gets his images in one place. It'll also provide
+ consistent behaviour across exporters.
+ */
+int BKE_get_image_export_path(struct Image *im, const char *dest_dir, char *abs, int abs_size, char *rel, int rel_size)
+{
+ char path[FILE_MAX];
+ char dir[FILE_MAX];
+ char base[FILE_MAX];
+ char blend_dir[FILE_MAX]; /* directory, where current .blend file resides */
+ char dest_path[FILE_MAX];
+ char rel_dir[FILE_MAX];
+ int len;
+
+ if (abs)
+ abs[0]= 0;
+
+ if (rel)
+ rel[0]= 0;
+
+ BLI_split_dirfile_basic(G.sce, blend_dir, NULL);
+
+ if (!strlen(im->name)) {
+ if (G.f & G_DEBUG) printf("Invalid image type.\n");
+ return 0;
+ }
+
+ BLI_strncpy(path, im->name, sizeof(path));
+
+ /* expand "//" in filename and get absolute path */
+ BLI_convertstringcode(path, G.sce);
+
+ /* get the directory part */
+ BLI_split_dirfile_basic(path, dir, base);
+
+ len= strlen(blend_dir);
+
+ rel_dir[0] = 0;
+
+ /* if image is "below" current .blend file directory */
+ if (!strncmp(path, blend_dir, len)) {
+
+ /* if image is _in_ current .blend file directory */
+ if (!strcmp(dir, blend_dir)) {
+ BLI_join_dirfile(dest_path, dest_dir, base);
+ }
+ /* "below" */
+ else {
+ /* rel = image_path_dir - blend_dir */
+ BLI_strncpy(rel_dir, dir + len, sizeof(rel_dir));
+
+ BLI_join_dirfile(dest_path, dest_dir, rel_dir);
+ BLI_join_dirfile(dest_path, dest_path, base);
+ }
+
+ }
+ /* image is out of current directory */
+ else {
+ BLI_join_dirfile(dest_path, dest_dir, base);
+ }
+
+ if (abs)
+ BLI_strncpy(abs, dest_path, abs_size);
+
+ if (rel) {
+ strncat(rel, rel_dir, rel_size);
+ strncat(rel, base, rel_size);
+ }
+
+ /* return 2 if src=dest */
+ if (!strcmp(path, dest_path)) {
+ if (G.f & G_DEBUG) printf("%s and %s are the same file\n", path, dest_path);
+ return 2;
+ }
+
+ return 1;
+}
+
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index 40c98c1d9cc..ae2acd6aef7 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -43,7 +43,7 @@
#include <windows.h>
static LARGE_INTEGER _itstart, _itend;
static LARGE_INTEGER ifreq;
-void itstart(void)
+static void itstart(void)
{
static int first = 1;
if(first) {
@@ -52,7 +52,7 @@ void itstart(void)
}
QueryPerformanceCounter(&_itstart);
}
-void itend(void)
+static void itend(void)
{
QueryPerformanceCounter(&_itend);
}
@@ -74,7 +74,7 @@ double itval()
{
gettimeofday(&_itstart, &itz);
}
-void itend(void)
+static void itend(void)
{
gettimeofday(&_itend,&itz);
}
@@ -155,7 +155,7 @@ DO_INLINE void mul_fvectorT_fvectorS(float to[3][3], float vectorA[3], float vec
/* printf vector[3] on console: for debug output */
-void print_fvector(float m3[3])
+static void print_fvector(float m3[3])
{
printf("%f\n%f\n%f\n\n",m3[0],m3[1],m3[2]);
}
@@ -297,7 +297,7 @@ DO_INLINE void sub_lfvector_lfvector(float (*to)[3], float (*fLongVectorA)[3], f
// 3x3 matrix
///////////////////////////
/* printf 3x3 matrix on console: for debug output */
-void print_fmatrix(float m3[3][3])
+static void print_fmatrix(float m3[3][3])
{
printf("%f\t%f\t%f\n",m3[0][0],m3[0][1],m3[0][2]);
printf("%f\t%f\t%f\n",m3[1][0],m3[1][1],m3[1][2]);
@@ -496,7 +496,8 @@ DO_INLINE void mulsub_fmatrix_fvector(float to[3], float matrix[3][3], float fro
// SPARSE SYMMETRIC big matrix with 3x3 matrix entries
///////////////////////////
/* printf a big matrix on console: for debug output */
-void print_bfmatrix(fmatrix3x3 *m3)
+#if 0
+static void print_bfmatrix(fmatrix3x3 *m3)
{
unsigned int i = 0;
@@ -505,6 +506,8 @@ void print_bfmatrix(fmatrix3x3 *m3)
print_fmatrix(m3[i].m);
}
}
+#endif
+
/* create big matrix */
DO_INLINE fmatrix3x3 *create_bfmatrix(unsigned int verts, unsigned int springs)
{
@@ -887,7 +890,7 @@ DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
}
}
-int cg_filtered(lfVector *ldV, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S)
+static int cg_filtered(lfVector *ldV, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S)
{
// Solves for unknown X in equation AX=B
unsigned int conjgrad_loopcount=0, conjgrad_looplimit=100;
@@ -970,7 +973,7 @@ DO_INLINE void BuildPPinv(fmatrix3x3 *lA, fmatrix3x3 *P, fmatrix3x3 *Pinv)
}
/*
// version 1.3
-int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv)
+static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv)
{
unsigned int numverts = lA[0].vcount, iterations = 0, conjgrad_looplimit=100;
float delta0 = 0, deltaNew = 0, deltaOld = 0, alpha = 0;
@@ -1038,7 +1041,7 @@ int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fma
}
*/
// version 1.4
-int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *bigI)
+static int cg_filtered_pre(lfVector *dv, fmatrix3x3 *lA, lfVector *lB, lfVector *z, fmatrix3x3 *S, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *bigI)
{
unsigned int numverts = lA[0].vcount, iterations = 0, conjgrad_looplimit=100;
float delta0 = 0, deltaNew = 0, deltaOld = 0, alpha = 0, tol = 0;
@@ -1183,7 +1186,8 @@ DO_INLINE void dfdx_spring(float to[3][3], float dir[3],float length,float L,fl
//return ( (I-outerprod(dir,dir))*Min(1.0f,rest/length) - I) * -k;
mul_fvectorT_fvector(to, dir, dir);
sub_fmatrix_fmatrix(to, I, to);
- mul_fmatrix_S(to, (((L/length)> 1.0f) ? (1.0f): (L/length)));
+
+ mul_fmatrix_S(to, (L/length));
sub_fmatrix_fmatrix(to, to, I);
mul_fmatrix_S(to, -k);
}
@@ -1218,6 +1222,8 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
float nulldfdx[3][3]={ {0,0,0}, {0,0,0}, {0,0,0}};
float scaling = 0.0;
+
+ int no_compress = clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
VECCOPY(s->f, nullf);
cp_fmatrix(s->dfdx, nulldfdx);
@@ -1254,7 +1260,7 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
// calculate force of structural + shear springs
if((s->type & CLOTH_SPRING_TYPE_STRUCTURAL) || (s->type & CLOTH_SPRING_TYPE_SHEAR))
{
- if(length > L) // only on elonglation
+ if(length > L || no_compress)
{
s->flags |= CLOTH_SPRING_FLAG_NEEDED;
@@ -1388,11 +1394,88 @@ static void CalcFloat4( float *v1, float *v2, float *v3, float *v4, float *n)
n[2]= n1[0]*n2[1]-n1[1]*n2[0];
}
-float calculateVertexWindForce(float wind[3], float vertexnormal[3])
+static float calculateVertexWindForce(float wind[3], float vertexnormal[3])
{
return (INPR(wind, vertexnormal));
}
+typedef struct HairGridVert {
+ float velocity[3];
+ float density;
+} HairGridVert;
+/* Smoothing of hair velocities:
+ * adapted from
+ Volumetric Methods for Simulation and Rendering of Hair
+ by Lena Petrovic, Mark Henne and John Anderson
+ * Pixar Technical Memo #06-08, Pixar Animation Studios
+ */
+static void hair_velocity_smoothing(float smoothfac, lfVector *lF, lfVector *lX, lfVector *lV, int numverts)
+{
+ /* TODO: this is an initial implementation and should be made much better in due time */
+
+ /* 10x10x10 grid gives nice initial results */
+ HairGridVert grid[10][10][10];
+ float gmin[3], gmax[3], density;
+ int v = 0;
+ int i = 0;
+ int j = 0;
+ int k = 0;
+
+ INIT_MINMAX(gmin, gmax);
+
+ for(i = 0; i < numverts; i++)
+ DO_MINMAX(lX[i], gmin, gmax);
+
+ /* initialize grid */
+ for(i = 0; i < 10; i++) {
+ for(j = 0; j < 10; j++) {
+ for(k = 0; k < 10; k++) {
+ grid[i][j][k].velocity[0] = 0.0f;
+ grid[i][j][k].velocity[1] = 0.0f;
+ grid[i][j][k].velocity[2] = 0.0f;
+ grid[i][j][k].density = 0.0f;
+ }
+ }
+ }
+
+ /* gather velocities & density */
+ for(v = 0; v < numverts; v++) {
+ i = (int)( (lX[v][0] - gmin[0]) / (gmax[0] - gmin[0]) * 9.99f );
+ j = (int)( (lX[v][1] - gmin[1]) / (gmax[1] - gmin[1]) * 9.99f );
+ k = (int)( (lX[v][2] - gmin[2]) / (gmax[2] - gmin[2]) * 9.99f );
+
+ grid[i][j][k].velocity[0] += lV[v][0];
+ grid[i][j][k].velocity[1] += lV[v][1];
+ grid[i][j][k].velocity[2] += lV[v][2];
+ grid[i][j][k].density += 1.0f;
+ }
+
+ /* divide velocity with density */
+ for(i = 0; i < 10; i++) {
+ for(j = 0; j < 10; j++) {
+ for(k = 0; k < 10; k++) {
+ density = grid[i][j][k].density;
+ if(density > 0.0f) {
+ grid[i][j][k].velocity[0] /= density;
+ grid[i][j][k].velocity[1] /= density;
+ grid[i][j][k].velocity[2] /= density;
+ }
+ }
+ }
+ }
+
+ /* calculate forces */
+ for(v = 0; v < numverts; v++) {
+ i = (int)( (lX[v][0] - gmin[0]) / (gmax[0] - gmin[0]) * 9.99f );
+ j = (int)( (lX[v][1] - gmin[1]) / (gmax[1] - gmin[1]) * 9.99f );
+ k = (int)( (lX[v][2] - gmin[2]) / (gmax[2] - gmin[2]) * 9.99f );
+
+ /* 2.0f is an experimental value that seems to give good results */
+ lF[v][0] += 2.0f * smoothfac * (grid[i][j][k].velocity[0] - lV[v][0]);
+ lF[v][1] += 2.0f * smoothfac * (grid[i][j][k].velocity[1] - lV[v][1]);
+ lF[v][2] += 2.0f * smoothfac * (grid[i][j][k].velocity[2] - lV[v][2]);
+ }
+}
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)
{
/* Collect forces and derivatives: F,dFdX,dFdV */
@@ -1416,6 +1499,9 @@ static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF,
init_lfvector(lF, gravity, numverts);
+ if(clmd->sim_parms->velocity_smooth > 0.0f)
+ hair_velocity_smoothing(clmd->sim_parms->velocity_smooth, lF, lX, lV, numverts);
+
/* multiply lF with mass matrix
// force = mass * acceleration (in this case: gravity)
*/
@@ -1511,7 +1597,7 @@ static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF,
// printf("\n");
}
-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 *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)
{
unsigned int numverts = dFdV[0].vcount;
@@ -1600,6 +1686,10 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase
if(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED)
{
+ float temp = clmd->sim_parms->stepsPerFrame;
+ /* not too nice hack, but collisions need this correction -jahka */
+ clmd->sim_parms->stepsPerFrame /= clmd->sim_parms->timescale;
+
// collisions
// itstart();
@@ -1614,7 +1704,7 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase
// call collision function
// TODO: check if "step" or "step+dt" is correct - dg
- result = cloth_bvh_objcollision(ob, clmd, step, dt);
+ result = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale);
// correct velocity again, just to be sure we had to change it due to adaptive collisions
for(i = 0; i < numverts; i++)
@@ -1637,6 +1727,9 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase
}
}
+ /* restore original stepsPerFrame */
+ clmd->sim_parms->stepsPerFrame = temp;
+
// X = Xnew;
cp_lfvector(id->X, id->Xnew, numverts);
@@ -1654,7 +1747,6 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase
simulate_implicit_euler(id->Vnew, id->X, id->V, id->F, id->dFdV, id->dFdX, dt / 2.0f, id->A, id->B, id->dV, id->S, id->z, id->olddV, id->P, id->Pinv, id->M, id->bigI);
}
-
}
else
{
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 54618813a0b..dd7904b4782 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -58,6 +58,7 @@
#include "DNA_key_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_particle_types.h"
@@ -85,6 +86,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
@@ -158,7 +160,7 @@ static AdrBit2Path ma_mode_bits[]= {
// {MA_SHADOW, "shadow", 0},
// {MA_SHLESS, "shadeless", 0},
// ...
- {MA_RAYTRANSP, "raytrace_transparency.enabled", 0},
+ {MA_RAYTRANSP, "transparency", 0},
{MA_RAYMIRROR, "raytrace_mirror.enabled", 0},
// {MA_HALO, "type", MA_TYPE_HALO}
};
@@ -294,8 +296,8 @@ static char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
case AC_EUL_Z:
*array_index= 2; return "euler_rotation";
- case -1: // XXX special case for rotation drivers... until eulers are added...
- *array_index= 0; return "rotation";
+ case -1: /* special case for euler-rotations used by old drivers */
+ *array_index= 0; return "euler_rotation";
case AC_LOC_X:
*array_index= 0; return "location";
@@ -818,13 +820,17 @@ 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...
*/
-char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], int *array_index)
+static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], int *array_index)
{
DynStr *path= BLI_dynstr_new();
char *propname=NULL, *rpath=NULL;
char buf[512];
int dummy_index= 0;
+ /* hack: if constname is set, we can only be dealing with an Constraint curve */
+ if (constname)
+ blocktype= ID_CO;
+
/* get property name based on blocktype */
switch (blocktype) {
case ID_OB: /* object */
@@ -840,7 +846,7 @@ char *get_rna_access (int blocktype, int adrcode, char actname[], char constname
break;
case ID_CO: /* constraint */
- propname= constraint_adrcodes_to_paths(adrcode, &dummy_index);
+ propname= constraint_adrcodes_to_paths(adrcode, &dummy_index);
break;
case ID_TE: /* texture */
@@ -870,7 +876,10 @@ char *get_rna_access (int blocktype, int adrcode, char actname[], char constname
/* XXX problematic blocktypes */
case ID_CU: /* curve */
- propname= "speed"; // XXX this was a 'dummy curve' that didn't really correspond to any real var...
+ /* this used to be a 'dummy' curve which got evaluated on the fly...
+ * now we've got real var for this!
+ */
+ propname= "eval_time";
break;
case ID_SEQ: /* sequencer strip */
@@ -1014,12 +1023,11 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver)
dtar->rna_path= get_rna_access(ID_PO, AC_SIZE_Z, idriver->name, NULL, &dtar->array_index);
break;
- case OB_ROT_X: /* rotation - we need to be careful with this... XXX (another reason why we need eulers) */
+ case OB_ROT_X: /* rotation - we need to be careful with this... */
case OB_ROT_Y:
case OB_ROT_Z:
{
- // XXX this is not yet a 1:1 map, since we'd need euler rotations to make this work nicely (unless we make some hacks)
- // XXX -1 here is a special hack...
+ /* -1 here, not rotation code, since old system didn't have eulers */
dtar->rna_path= get_rna_access(ID_PO, -1, idriver->name, NULL, NULL);
dtar->array_index= idriver->adrcode - OB_ROT_X;
}
@@ -1144,7 +1152,7 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha
/* Add a new FModifier (Cyclic) instead of setting extend value
* as that's the new equivilant of that option.
*/
- FModifier *fcm= fcurve_add_modifier(fcu, FMODIFIER_TYPE_CYCLES);
+ FModifier *fcm= add_fmodifier(&fcu->modifiers, FMODIFIER_TYPE_CYCLES);
FMod_Cycles *data= (FMod_Cycles *)fcm->data;
/* if 'offset' one is in use, set appropriate settings */
@@ -1206,6 +1214,9 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha
/* interpolation can only be constant... */
dst->ipo= BEZT_IPO_CONST;
+ /* 'hide' flag is now used for keytype - only 'keyframes' existed before */
+ dst->hide= BEZT_KEYTYPE_KEYFRAME;
+
/* correct values, by checking if the flag of interest is set */
if ( ((int)(dst->vec[1][1])) & (abp->bit) )
dst->vec[0][1]= dst->vec[1][1]= dst->vec[2][1] = 1.0f;
@@ -1256,6 +1267,9 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha
if (icu->ipo != IPO_MIXED)
dst->ipo= icu->ipo;
+ /* 'hide' flag is now used for keytype - only 'keyframes' existed before */
+ dst->hide= BEZT_KEYTYPE_KEYFRAME;
+
/* correct values for euler rotation curves - they were degrees/10 */
// XXX for now, just make them into radians as RNA sets/reads directly in that form
if ( ((icu->blocktype == ID_OB) && ELEM3(icu->adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) ||
@@ -1267,6 +1281,26 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha
dst->vec[1][1] *= fac;
dst->vec[2][1] *= fac;
}
+
+ /* correct times for rotation drivers
+ * - need to go from degrees to radians...
+ * - there's only really 1 target to worry about
+ */
+ if (fcu->driver && fcu->driver->targets.first) {
+ DriverTarget *dtar= fcu->driver->targets.first;
+
+ /* since drivers could only be for objects, we should just check for 'rotation' being
+ * in the name of the path given
+ * - WARNING: this will break if we encounter a bone or object explictly named in that way...
+ */
+ if ((dtar && dtar->rna_path) && strstr(dtar->rna_path, "rotation")) {
+ const float fac= (float)M_PI / 180.0f;
+
+ dst->vec[0][0] *= fac;
+ dst->vec[1][0] *= fac;
+ dst->vec[2][0] *= fac;
+ }
+ }
}
/* free this data now */
@@ -1463,6 +1497,87 @@ static void action_to_animdata (ID *id, bAction *act)
action_to_animato(act, &adt->action->groups, &adt->action->curves, &adt->drivers);
}
+/* ------------------------- */
+
+// TODO:
+// - NLA group duplicators info
+// - NLA curve/stride modifiers...
+
+/* Convert NLA-Strip to new system */
+static void nlastrips_to_animdata (ID *id, ListBase *strips)
+{
+ AnimData *adt= BKE_animdata_from_id(id);
+ NlaTrack *nlt = NULL;
+ NlaStrip *strip;
+ bActionStrip *as, *asn;
+
+ /* for each one of the original strips, convert to a new strip and free the old... */
+ for (as= strips->first; as; as= asn) {
+ asn= as->next;
+
+ /* this old strip is only worth something if it had an action... */
+ if (as->act) {
+ /* convert Action data (if not yet converted), storing the results in the same Action */
+ action_to_animato(as->act, &as->act->groups, &as->act->curves, &adt->drivers);
+
+ /* create a new-style NLA-strip which references this Action, then copy over relevant settings */
+ {
+ /* init a new strip, and assign the action to it
+ * - no need to muck around with the user-counts, since this is just
+ * passing over the ref to the new owner, not creating an additional ref
+ */
+ strip= MEM_callocN(sizeof(NlaStrip), "NlaStrip");
+ strip->act= as->act;
+
+ /* endpoints */
+ strip->start= as->start;
+ strip->end= as->end;
+ strip->actstart= as->actstart;
+ strip->actend= as->actend;
+
+ /* action reuse */
+ strip->repeat= as->repeat;
+ strip->scale= as->scale;
+ if (as->flag & ACTSTRIP_LOCK_ACTION) strip->flag |= NLASTRIP_FLAG_SYNC_LENGTH;
+
+ /* blending */
+ strip->blendin= as->blendin;
+ strip->blendout= as->blendout;
+ strip->blendmode= (as->mode==ACTSTRIPMODE_ADD) ? NLASTRIP_MODE_ADD : NLASTRIP_MODE_REPLACE;
+ if (as->flag & ACTSTRIP_AUTO_BLENDS) strip->flag |= NLASTRIP_FLAG_AUTO_BLENDS;
+
+ /* assorted setting flags */
+ if (as->flag & ACTSTRIP_SELECT) strip->flag |= NLASTRIP_FLAG_SELECT;
+ if (as->flag & ACTSTRIP_ACTIVE) strip->flag |= NLASTRIP_FLAG_ACTIVE;
+
+ if (as->flag & ACTSTRIP_MUTE) strip->flag |= NLASTRIP_FLAG_MUTED;
+ if (as->flag & ACTSTRIP_REVERSE) strip->flag |= NLASTRIP_FLAG_REVERSE;
+
+ /* by default, we now always extrapolate, while in the past this was optional */
+ if ((as->flag & ACTSTRIP_HOLDLASTFRAME)==0)
+ strip->extendmode= NLASTRIP_EXTEND_NOTHING;
+ }
+
+ /* try to add this strip to the current NLA-Track (i.e. the 'last' one on the stack atm) */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* trying to add to the current failed (no space),
+ * so add a new track to the stack, and add to that...
+ */
+ nlt= add_nlatrack(adt, NULL);
+ BKE_nlatrack_add_strip(nlt, strip);
+ }
+ }
+
+ /* modifiers */
+ // FIXME: for now, we just free them...
+ if (as->modifiers.first)
+ BLI_freelistN(&as->modifiers);
+
+ /* free the old strip */
+ BLI_freelinkN(strips, as);
+ }
+}
+
/* *************************************************** */
/* External API - Only Called from do_versions() */
@@ -1509,7 +1624,30 @@ void do_versions_ipos_to_animato(Main *main)
if (G.f & G_DEBUG) printf("\tconverting ob %s \n", id->name+2);
/* check if object has any animation data */
- if ((ob->ipo) || (ob->action) || (ob->nlastrips.first)) {
+ if (ob->nlastrips.first) {
+ /* Add AnimData block */
+ adt= BKE_id_add_animdata(id);
+
+ /* IPO first to take into any non-NLA'd Object Animation */
+ if (ob->ipo) {
+ ipo_to_animdata(id, ob->ipo, NULL, NULL);
+
+ ob->ipo->id.us--;
+ ob->ipo= NULL;
+ }
+
+ /* Action is skipped since it'll be used by some strip in the NLA anyway,
+ * causing errors with evaluation in the new evaluation pipeline
+ */
+ if (ob->action) {
+ ob->action->id.us--;
+ ob->action= NULL;
+ }
+
+ /* finally NLA */
+ nlastrips_to_animdata(id, &ob->nlastrips);
+ }
+ else if ((ob->ipo) || (ob->action)) {
/* Add AnimData block */
adt= BKE_id_add_animdata(id);
@@ -1530,9 +1668,6 @@ void do_versions_ipos_to_animato(Main *main)
ob->ipo->id.us--;
ob->ipo= NULL;
}
-
- /* finally NLA */
- // XXX todo... for now, new NLA code not hooked up yet, so keep old stuff (but not for too long!)
}
/* check PoseChannels for constraints with local data */
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 595ba37e09c..39f9ed808fd 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -266,66 +266,91 @@ void sort_keys(Key *key)
/**************** do the key ****************/
+void key_curve_position_weights(float t, float *data, int type)
+{
+ float t2, t3, fc;
+
+ if(type==KEY_LINEAR) {
+ data[0]= 0.0f;
+ data[1]= -t + 1.0f;
+ data[2]= t;
+ data[3]= 0.0f;
+ }
+ else if(type==KEY_CARDINAL) {
+ t2= t*t;
+ t3= t2*t;
+ fc= 0.71f;
+
+ data[0]= -fc*t3 + 2.0f*fc*t2 - fc*t;
+ data[1]= (2.0f-fc)*t3 + (fc-3.0f)*t2 + 1.0f;
+ data[2]= (fc-2.0f)*t3 + (3.0f-2.0f*fc)*t2 + fc*t;
+ data[3]= fc*t3 - fc*t2;
+ }
+ else if(type==KEY_BSPLINE) {
+ t2= t*t;
+ t3= t2*t;
+
+ data[0]= -0.16666666f*t3 + 0.5f*t2 - 0.5f*t + 0.16666666f;
+ data[1]= 0.5f*t3 - t2 + 0.6666666f;
+ data[2]= -0.5f*t3 + 0.5f*t2 + 0.5f*t + 0.16666666f;
+ data[3]= 0.16666666f*t3;
+ }
+}
-void set_four_ipo(float d, float *data, int type)
+/* first derivative */
+void key_curve_tangent_weights(float t, float *data, int type)
{
- float d2, d3, fc;
+ float t2, fc;
if(type==KEY_LINEAR) {
data[0]= 0.0f;
- data[1]= 1.0f-d;
- data[2]= d;
+ data[1]= -1.0f;
+ data[2]= 1.0f;
data[3]= 0.0f;
}
- else {
- d2= d*d;
- d3= d2*d;
+ else if(type==KEY_CARDINAL) {
+ t2= t*t;
+ fc= 0.71f;
- if(type==KEY_CARDINAL) {
-
- fc= 0.71f;
-
- data[0]= -fc*d3 +2.0f*fc*d2 -fc*d;
- data[1]= (2.0f-fc)*d3 +(fc-3.0f)*d2 +1.0f;
- data[2]= (fc-2.0f)*d3 +(3.0f-2.0f*fc)*d2 +fc*d;
- data[3]= fc*d3 -fc*d2;
- }
- else if(type==KEY_BSPLINE) {
+ data[0]= -3.0f*fc*t2 +4.0f*fc*t - fc;
+ data[1]= 3.0f*(2.0f-fc)*t2 +2.0f*(fc-3.0f)*t;
+ data[2]= 3.0f*(fc-2.0f)*t2 +2.0f*(3.0f-2.0f*fc)*t + fc;
+ data[3]= 3.0f*fc*t2 -2.0f*fc*t;
+ }
+ else if(type==KEY_BSPLINE) {
+ t2= t*t;
- data[0]= -0.16666666f*d3 +0.5f*d2 -0.5f*d +0.16666666f;
- data[1]= 0.5f*d3 -d2 +0.6666666f;
- data[2]= -0.5f*d3 +0.5f*d2 +0.5f*d +0.16666666f;
- data[3]= 0.16666666f*d3 ;
- }
+ data[0]= -0.5f*t2 + t - 0.5f;
+ data[1]= 1.5f*t2 - 2.0f*t;
+ data[2]= -1.5f*t2 + t + 0.5f;
+ data[3]= 0.5f*t2;
}
}
-void set_afgeleide_four_ipo(float d, float *data, int type)
+/* second derivative */
+void key_curve_normal_weights(float t, float *data, int type)
{
- float d2, fc;
+ float fc;
if(type==KEY_LINEAR) {
-
+ data[0]= 0.0f;
+ data[1]= 0.0f;
+ data[2]= 0.0f;
+ data[3]= 0.0f;
}
- else {
- d2= d*d;
+ else if(type==KEY_CARDINAL) {
+ fc= 0.71f;
- if(type==KEY_CARDINAL) {
-
- fc= 0.71f;
-
- data[0]= -3.0f*fc*d2 +4.0f*fc*d -fc;
- data[1]= 3.0f*(2.0f-fc)*d2 +2.0f*(fc-3.0f)*d;
- data[2]= 3.0f*(fc-2.0f)*d2 +2.0f*(3.0f-2.0f*fc)*d +fc;
- data[3]= 3.0f*fc*d2 -2.0f*fc*d;
- }
- else if(type==KEY_BSPLINE) {
-
- data[0]= -0.16666666f*3.0f*d2 +d -0.5f;
- data[1]= 1.5f*d2 -2.0f*d;
- data[2]= -1.5f*d2 +d +0.5f;
- data[3]= 0.16666666f*3.0f*d2 ;
- }
+ data[0]= -6.0f*fc*t + 4.0f*fc;
+ data[1]= 6.0f*(2.0f-fc)*t + 2.0f*(fc-3.0f);
+ data[2]= 6.0f*(fc-2.0f)*t + 2.0f*(3.0f-2.0f*fc);
+ data[3]= 6.0f*fc*t - 2.0f*fc;
+ }
+ else if(type==KEY_BSPLINE) {
+ data[0]= -1.0f*t + 1.0f;
+ data[1]= 3.0f*t - 2.0f;
+ data[2]= -3.0f*t + 1.0f;
+ data[3]= 1.0f*t;
}
}
@@ -436,10 +461,10 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
/* interpolation */
- set_four_ipo(d, t, k[1]->type);
+ key_curve_position_weights(d, t, k[1]->type);
if(k[1]->type != k[2]->type) {
- set_four_ipo(d, fval, k[2]->type);
+ key_curve_position_weights(d, fval, k[2]->type);
temp= 1.0f-d;
t[0]= temp*t[0]+ d*fval[0];
@@ -1382,18 +1407,11 @@ int do_ob_key(Scene *scene, Object *ob)
return 1;
}
else {
-#if 0 // XXX old animation system
- // NOTE: this stuff was NEVER reliable at all...
- if(ob->ipoflag & OB_ACTION_KEY)
- do_all_object_actions(scene, ob);
- else {
- calc_ipo(key->ipo, bsystem_time(scene, ob, scene->r.cfra, 0.0));
- execute_ipo((ID *)key, key->ipo);
- }
-#endif // XXX old animation system
/* do shapekey local drivers */
float ctime= (float)scene->r.cfra; // XXX this needs to be checked
- if (G.f & G_DEBUG) printf("ob %s - do shapekey (%s) drivers \n", ob->id.name+2, key->id.name+2);
+
+ if (G.f & G_DEBUG)
+ printf("ob %s - do shapekey (%s) drivers \n", ob->id.name+2, key->id.name+2);
BKE_animsys_evaluate_animdata(&key->id, key->adt, ctime, ADT_RECALC_DRIVERS);
if(ob->type==OB_MESH) return do_mesh_key(scene, ob, ob->data);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 5cf52d09314..730a12bea09 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -232,8 +232,8 @@ void free_lattice(Lattice *lt)
if(lt->def) MEM_freeN(lt->def);
if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
if(lt->editlatt) {
- if(lt->def) MEM_freeN(lt->def);
- if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+ if(lt->editlatt->def) MEM_freeN(lt->editlatt->def);
+ if(lt->editlatt->dvert) free_dverts(lt->editlatt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
MEM_freeN(lt->editlatt);
}
}
@@ -364,7 +364,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
u= (vec[0]-lt->fu)/lt->du;
ui= (int)floor(u);
u -= ui;
- set_four_ipo(u, tu, lt->typeu);
+ key_curve_position_weights(u, tu, lt->typeu);
}
else {
tu[0]= tu[2]= tu[3]= 0.0; tu[1]= 1.0;
@@ -375,7 +375,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
v= (vec[1]-lt->fv)/lt->dv;
vi= (int)floor(v);
v -= vi;
- set_four_ipo(v, tv, lt->typev);
+ key_curve_position_weights(v, tv, lt->typev);
}
else {
tv[0]= tv[2]= tv[3]= 0.0; tv[1]= 1.0;
@@ -386,7 +386,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
w= (vec[2]-lt->fw)/lt->dw;
wi= (int)floor(w);
w -= wi;
- set_four_ipo(w, tw, lt->typew);
+ key_curve_position_weights(w, tw, lt->typew);
}
else {
tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0;
@@ -472,7 +472,7 @@ static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd, int dloc
}
/* this makes sure we can extend for non-cyclic. *vec needs 4 items! */
-static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir) /* returns OK */
+static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius) /* returns OK */
{
Curve *cu= ob->data;
BevList *bl;
@@ -490,21 +490,25 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir)
else ctime1= ctime;
/* vec needs 4 items */
- if(where_on_path(ob, ctime1, vec, dir)) {
+ if(where_on_path(ob, ctime1, vec, dir, quat, radius)) {
if(cycl==0) {
Path *path= cu->path;
float dvec[3];
if(ctime < 0.0) {
- VecSubf(dvec, path->data+4, path->data);
+ VecSubf(dvec, path->data[1].vec, path->data[0].vec);
VecMulf(dvec, ctime*(float)path->len);
VECADD(vec, vec, dvec);
+ if(quat) QUATCOPY(quat, path->data[0].quat);
+ if(radius) *radius= path->data[0].radius;
}
else if(ctime > 1.0) {
- VecSubf(dvec, path->data+4*path->len-4, path->data+4*path->len-8);
+ VecSubf(dvec, path->data[path->len-1].vec, path->data[path->len-2].vec);
VecMulf(dvec, (ctime-1.0)*(float)path->len);
VECADD(vec, vec, dvec);
+ if(quat) QUATCOPY(quat, path->data[path->len-1].quat);
+ if(radius) *radius= path->data[path->len-1].radius;
}
}
return 1;
@@ -520,7 +524,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir)
static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, CurveDeform *cd, float *quatp)
{
Curve *cu= par->data;
- float fac, loc[4], dir[3], cent[3];
+ float fac, loc[4], dir[3], cent[3], radius;
short upflag, index;
if(axis==MOD_CURVE_POSX || axis==MOD_CURVE_NEGX) {
@@ -575,7 +579,7 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
}
#endif // XXX old animation system
- if( where_on_path_deform(par, fac, loc, dir)) { /* returns OK */
+ if( where_on_path_deform(par, fac, loc, dir, NULL, &radius)) { /* returns OK */
float q[4], mat[3][3], quat[4];
if(cd->no_rot_axis) /* set by caller */
@@ -595,7 +599,14 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
QuatMul(quat, q, quat);
}
QuatToMat3(quat, mat);
-
+
+ if(cu->flag & CU_PATH_RADIUS) {
+ float tmat[3][3], rmat[3][3];
+ Mat3Scale(tmat, radius);
+ Mat3MulMat3(rmat, mat, tmat);
+ Mat3CpyMat3(mat, rmat);
+ }
+
/* local rotation */
Mat3MulVecfl(mat, cent);
@@ -817,59 +828,68 @@ void outside_lattice(Lattice *lt)
int u, v, w;
float fac1, du=0.0, dv=0.0, dw=0.0;
- bp= lt->def;
+ if(lt->flag & LT_OUTSIDE) {
+ bp= lt->def;
- if(lt->pntsu>1) du= 1.0f/((float)lt->pntsu-1);
- if(lt->pntsv>1) dv= 1.0f/((float)lt->pntsv-1);
- if(lt->pntsw>1) dw= 1.0f/((float)lt->pntsw-1);
-
- for(w=0; w<lt->pntsw; w++) {
-
- for(v=0; v<lt->pntsv; v++) {
-
- for(u=0; u<lt->pntsu; u++, bp++) {
- if(u==0 || v==0 || w==0 || u==lt->pntsu-1 || v==lt->pntsv-1 || w==lt->pntsw-1);
- else {
-
- bp->hide= 1;
- bp->f1 &= ~SELECT;
-
- /* u extrema */
- bp1= latt_bp(lt, 0, v, w);
- bp2= latt_bp(lt, lt->pntsu-1, v, w);
-
- fac1= du*u;
- bp->vec[0]= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
- bp->vec[1]= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
- bp->vec[2]= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
-
- /* v extrema */
- bp1= latt_bp(lt, u, 0, w);
- bp2= latt_bp(lt, u, lt->pntsv-1, w);
-
- fac1= dv*v;
- bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
- bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
- bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
-
- /* w extrema */
- bp1= latt_bp(lt, u, v, 0);
- bp2= latt_bp(lt, u, v, lt->pntsw-1);
-
- fac1= dw*w;
- bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
- bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
- bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
-
- VecMulf(bp->vec, 0.3333333f);
+ if(lt->pntsu>1) du= 1.0f/((float)lt->pntsu-1);
+ if(lt->pntsv>1) dv= 1.0f/((float)lt->pntsv-1);
+ if(lt->pntsw>1) dw= 1.0f/((float)lt->pntsw-1);
+
+ for(w=0; w<lt->pntsw; w++) {
+
+ for(v=0; v<lt->pntsv; v++) {
+
+ for(u=0; u<lt->pntsu; u++, bp++) {
+ if(u==0 || v==0 || w==0 || u==lt->pntsu-1 || v==lt->pntsv-1 || w==lt->pntsw-1);
+ else {
+ bp->hide= 1;
+ bp->f1 &= ~SELECT;
+
+ /* u extrema */
+ bp1= latt_bp(lt, 0, v, w);
+ bp2= latt_bp(lt, lt->pntsu-1, v, w);
+
+ fac1= du*u;
+ bp->vec[0]= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
+ bp->vec[1]= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
+ bp->vec[2]= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
+
+ /* v extrema */
+ bp1= latt_bp(lt, u, 0, w);
+ bp2= latt_bp(lt, u, lt->pntsv-1, w);
+
+ fac1= dv*v;
+ bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
+ bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
+ bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
+
+ /* w extrema */
+ bp1= latt_bp(lt, u, v, 0);
+ bp2= latt_bp(lt, u, v, lt->pntsw-1);
+
+ fac1= dw*w;
+ bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
+ bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
+ bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
+
+ VecMulf(bp->vec, 0.3333333f);
+
+ }
}
+
}
}
-
}
-
+ else {
+ bp= lt->def;
+
+ for(w=0; w<lt->pntsw; w++)
+ for(v=0; v<lt->pntsv; v++)
+ for(u=0; u<lt->pntsu; u++, bp++)
+ bp->hide= 0;
+ }
}
float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 90ab4e05d44..45869a317e8 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -119,6 +119,13 @@
#define MAX_IDPUP 60 /* was 24 */
+/* GS reads the memory pointed at in a specific ordering.
+ only use this definition, makes little and big endian systems
+ work fine, in conjunction with MAKE_ID */
+
+/* from blendef: */
+#define GS(a) (*((short *)(a)))
+
/* ************* general ************************ */
void id_lib_extern(ID *id)
@@ -148,6 +155,220 @@ void id_us_min(ID *id)
id->us--;
}
+int id_make_local(ID *id, int test)
+{
+ if(id->flag & LIB_INDIRECT)
+ return 0;
+
+ switch(GS(id->name)) {
+ case ID_SCE:
+ return 0; /* not implemented */
+ case ID_LI:
+ return 0; /* can't be linked */
+ case ID_OB:
+ if(!test) make_local_object((Object*)id);
+ return 1;
+ case ID_ME:
+ if(!test) {
+ make_local_mesh((Mesh*)id);
+ make_local_key(((Mesh*)id)->key);
+ }
+ return 1;
+ case ID_CU:
+ if(!test) {
+ make_local_curve((Curve*)id);
+ make_local_key(((Curve*)id)->key);
+ }
+ return 1;
+ case ID_MB:
+ if(!test) make_local_mball((MetaBall*)id);
+ return 1;
+ case ID_MA:
+ if(!test) make_local_material((Material*)id);
+ return 1;
+ case ID_TE:
+ if(!test) make_local_texture((Tex*)id);
+ return 1;
+ case ID_IM:
+ return 0; /* not implemented */
+ case ID_WV:
+ return 0; /* deprecated */
+ case ID_LT:
+ if(!test) {
+ make_local_lattice((Lattice*)id);
+ make_local_key(((Lattice*)id)->key);
+ }
+ return 1;
+ case ID_LA:
+ if(!test) make_local_lamp((Lamp*)id);
+ return 1;
+ case ID_CA:
+ if(!test) make_local_camera((Camera*)id);
+ return 1;
+ case ID_IP:
+ return 0; /* deprecated */
+ case ID_KE:
+ if(!test) make_local_key((Key*)id);
+ return 1;
+ case ID_WO:
+ if(!test) make_local_world((World*)id);
+ return 1;
+ case ID_SCR:
+ return 0; /* can't be linked */
+ case ID_VF:
+ return 0; /* not implemented */
+ case ID_TXT:
+ return 0; /* not implemented */
+ case ID_SCRIPT:
+ return 0; /* deprecated */
+ case ID_SO:
+ return 0; /* not implemented */
+ case ID_GR:
+ return 0; /* not implemented */
+ case ID_AR:
+ if(!test) make_local_armature((bArmature*)id);
+ return 1;
+ case ID_AC:
+ if(!test) make_local_action((bAction*)id);
+ return 1;
+ case ID_NT:
+ return 0; /* not implemented */
+ case ID_BR:
+ if(!test) make_local_brush((Brush*)id);
+ return 1;
+ case ID_PA:
+ if(!test) make_local_particlesettings((ParticleSettings*)id);
+ return 1;
+ case ID_WM:
+ return 0; /* can't be linked */
+ case ID_GD:
+ return 0; /* not implemented */
+ }
+
+ return 0;
+}
+
+int id_copy(ID *id, ID **newid, int test)
+{
+ if(!test) *newid= NULL;
+
+ /* conventions:
+ * - make shallow copy, only this ID block
+ * - id.us of the new ID is set to 1 */
+ switch(GS(id->name)) {
+ case ID_SCE:
+ return 0; /* can't be copied from here */
+ case ID_LI:
+ return 0; /* can't be copied from here */
+ case ID_OB:
+ if(!test) *newid= (ID*)copy_object((Object*)id);
+ return 1;
+ case ID_ME:
+ if(!test) *newid= (ID*)copy_mesh((Mesh*)id);
+ return 1;
+ case ID_CU:
+ if(!test) *newid= (ID*)copy_curve((Curve*)id);
+ return 1;
+ case ID_MB:
+ if(!test) *newid= (ID*)copy_mball((MetaBall*)id);
+ return 1;
+ case ID_MA:
+ if(!test) *newid= (ID*)copy_material((Material*)id);
+ return 1;
+ case ID_TE:
+ if(!test) *newid= (ID*)copy_texture((Tex*)id);
+ return 1;
+ case ID_IM:
+ return 0; /* not implemented */
+ case ID_WV:
+ return 0; /* deprecated */
+ case ID_LT:
+ if(!test) *newid= (ID*)copy_lattice((Lattice*)id);
+ return 1;
+ case ID_LA:
+ if(!test) *newid= (ID*)copy_lamp((Lamp*)id);
+ return 1;
+ case ID_CA:
+ if(!test) *newid= (ID*)copy_camera((Camera*)id);
+ return 1;
+ case ID_IP:
+ return 0; /* deprecated */
+ case ID_KE:
+ if(!test) *newid= (ID*)copy_key((Key*)id);
+ return 1;
+ case ID_WO:
+ if(!test) *newid= (ID*)copy_world((World*)id);
+ return 1;
+ case ID_SCR:
+ return 0; /* can't be copied from here */
+ case ID_VF:
+ return 0; /* not implemented */
+ case ID_TXT:
+ if(!test) *newid= (ID*)copy_text((Text*)id);
+ return 1;
+ case ID_SCRIPT:
+ return 0; /* deprecated */
+ case ID_SO:
+ return 0; /* not implemented */
+ case ID_GR:
+ if(!test) *newid= (ID*)copy_group((Group*)id);
+ return 1;
+ case ID_AR:
+ if(!test) *newid= (ID*)copy_armature((bArmature*)id);
+ return 1;
+ case ID_AC:
+ if(!test) *newid= (ID*)copy_action((bAction*)id);
+ return 1;
+ case ID_NT:
+ if(!test) *newid= (ID*)ntreeCopyTree((bNodeTree*)id, 0);
+ return 1;
+ case ID_BR:
+ if(!test) *newid= (ID*)copy_brush((Brush*)id);
+ return 1;
+ case ID_PA:
+ if(!test) *newid= (ID*)psys_copy_settings((ParticleSettings*)id);
+ return 1;
+ case ID_WM:
+ return 0; /* can't be copied from here */
+ case ID_GD:
+ return 0; /* not implemented */
+ }
+
+ return 0;
+}
+
+int id_unlink(ID *id, int test)
+{
+ Main *mainlib= G.main;
+ ListBase *lb;
+
+ switch(GS(id->name)) {
+ case ID_TXT:
+ if(test) return 1;
+ unlink_text(mainlib, (Text*)id);
+ break;
+ case ID_GR:
+ if(test) return 1;
+ unlink_group((Group*)id);
+ break;
+ case ID_OB:
+ if(test) return 1;
+ unlink_object(NULL, (Object*)id);
+ break;
+ }
+
+ if(id->us == 0) {
+ if(test) return 1;
+
+ lb= wich_libbase(mainlib, GS(id->name));
+ free_libblock(lb, id);
+
+ return 1;
+ }
+
+ return 0;
+}
+
ListBase *wich_libbase(Main *mainlib, short type)
{
switch( type ) {
@@ -234,6 +455,15 @@ void flag_all_listbases_ids(short flag, short value)
while(a--) flag_listbase_ids(lbarray[a], flag, value);
}
+void recalc_all_library_objects(Main *main)
+{
+ Object *ob;
+
+ /* flag for full recalc */
+ for(ob=main->object.first; ob; ob=ob->id.next)
+ if(ob->id.lib)
+ ob->recalc |= OB_RECALC;
+}
/* note: MAX_LIBARRAY define should match this code */
int set_listbasepointers(Main *main, ListBase **lb)
@@ -409,13 +639,6 @@ void *alloc_libblock(ListBase *lb, short type, const char *name)
return id;
}
-/* GS reads the memory pointed at in a specific ordering.
- only use this definition, makes little and big endian systems
- work fine, in conjunction with MAKE_ID */
-
-/* from blendef: */
-#define GS(a) (*((short *)(a)))
-
/* by spec, animdata is first item after ID */
/* we still read ->adt itself, to ensure compiler warns when it doesnt exist */
static void id_copy_animdata(ID *id)
@@ -567,7 +790,7 @@ void free_libblock(ListBase *lb, void *idv)
//XXX free_script((Script *)id);
break;
case ID_SO:
- sound_free_sound((bSound *)id);
+ sound_free((bSound*)id);
break;
case ID_GR:
free_group((Group *)id);
@@ -1030,6 +1253,20 @@ static void lib_indirect_test_id(ID *id)
}
}
+void tag_main(struct Main *mainvar, int tag)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ ID *id;
+ 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;
+ }
+ }
+}
/* if lib!=NULL, only all from lib local */
void all_local(Library *lib, int untagged_only)
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 57b88bb0b3f..1667bd97102 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -43,6 +43,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
@@ -79,10 +80,6 @@ void free_material(Material *ma)
{
MTex *mtex;
int a;
-
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&ma->scriptlink);
-#endif
for(a=0; a<MAX_MTEX; a++) {
mtex= ma->mtex[a];
@@ -162,9 +159,9 @@ void init_material(Material *ma)
ma->sss_radius[0]= 1.0f;
ma->sss_radius[1]= 1.0f;
ma->sss_radius[2]= 1.0f;
- ma->sss_col[0]= 0.8f;
- ma->sss_col[1]= 0.8f;
- ma->sss_col[2]= 0.8f;
+ ma->sss_col[0]= 1.0f;
+ ma->sss_col[1]= 1.0f;
+ ma->sss_col[2]= 1.0f;
ma->sss_error= 0.05f;
ma->sss_scale= 0.1f;
ma->sss_ior= 1.3f;
@@ -173,7 +170,22 @@ void init_material(Material *ma)
ma->sss_front= 1.0f;
ma->sss_back= 1.0f;
- ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR;
+ ma->vol.density = 1.0f;
+ ma->vol.emission = 0.0f;
+ ma->vol.absorption = 1.0f;
+ ma->vol.scattering = 1.0f;
+ ma->vol.emission_col[0] = ma->vol.emission_col[1] = ma->vol.emission_col[2] = 1.0f;
+ ma->vol.absorption_col[0] = ma->vol.absorption_col[1] = ma->vol.absorption_col[2] = 0.0f;
+ ma->vol.density_scale = 1.0f;
+ ma->vol.depth_cutoff = 0.01f;
+ ma->vol.stepsize_type = MA_VOL_STEP_RANDOMIZED;
+ ma->vol.stepsize = 0.2f;
+ ma->vol.shade_stepsize = 0.2f;
+ ma->vol.shade_type = MA_VOL_SHADE_SINGLE;
+ ma->vol.shadeflag |= MA_VOL_PRECACHESHADING;
+ ma->vol.precache_resolution = 50;
+
+ ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RAYBIAS|MA_TANGENT_STR|MA_ZTRANSP;
ma->preview = NULL;
}
@@ -209,10 +221,6 @@ Material *copy_material(Material *ma)
id_us_plus((ID *)man->mtex[a]->tex);
}
}
-
-#ifndef DISABLE_PYTHON
- BPY_copy_scriptlink(&ma->scriptlink);
-#endif
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
@@ -445,7 +453,7 @@ Material *give_current_material(Object *ob, int act)
if(act>ob->totcol) act= ob->totcol;
else if(act<=0) act= 1;
- if( BTST(ob->colbits, act-1) ) { /* in object */
+ if(ob->matbits[act-1]) { /* in object */
ma= ob->mat[act-1];
}
else { /* in data */
@@ -473,7 +481,7 @@ ID *material_from(Object *ob, int act)
if(ob->totcol==0) return ob->data;
if(act==0) act= 1;
- if( BTST(ob->colbits, act-1) ) return (ID *)ob;
+ if(ob->matbits[act-1]) return (ID *)ob;
else return ob->data;
}
@@ -498,6 +506,7 @@ void test_object_materials(ID *id)
Curve *cu;
MetaBall *mb;
Material **newmatar;
+ char *newmatbits;
int totcol=0;
if(id==0) return;
@@ -524,16 +533,22 @@ void test_object_materials(ID *id)
if(totcol==0) {
if(ob->totcol) {
MEM_freeN(ob->mat);
- ob->mat= 0;
+ 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;
@@ -547,6 +562,7 @@ void test_object_materials(ID *id)
void assign_material(Object *ob, Material *ma, int act)
{
Material *mao, **matar, ***matarar;
+ char *matbits;
short *totcolp;
if(act>MAXMAT) return;
@@ -559,29 +575,41 @@ void assign_material(Object *ob, Material *ma, int act)
if(totcolp==0 || matarar==0) return;
- if( act > *totcolp) {
+ if(act > *totcolp) {
matar= MEM_callocN(sizeof(void *)*act, "matarray1");
- if( *totcolp) {
- memcpy(matar, *matarar, sizeof(void *)*( *totcolp ));
+
+ if(*totcolp) {
+ memcpy(matar, *matarar, sizeof(void *)*(*totcolp));
MEM_freeN(*matarar);
}
+
*matarar= matar;
*totcolp= act;
}
if(act > ob->totcol) {
matar= MEM_callocN(sizeof(void *)*act, "matarray2");
+ matbits= MEM_callocN(sizeof(char)*act, "matbits1");
if( ob->totcol) {
memcpy(matar, ob->mat, sizeof(void *)*( ob->totcol ));
+ memcpy(matbits, ob->matbits, sizeof(char)*(*totcolp));
MEM_freeN(ob->mat);
+ MEM_freeN(ob->matbits);
}
ob->mat= matar;
+ ob->matbits= matbits;
ob->totcol= act;
+
+ /* copy object/mesh linking, or assign based on userpref */
+ if(ob->actcol)
+ ob->matbits[act-1]= ob->matbits[ob->actcol-1];
+ else
+ ob->matbits[act-1]= (U.flag & USER_MAT_ON_OB)? 1: 0;
}
/* do it */
- if( BTST(ob->colbits, act-1) ) { /* in object */
+ if(ob->matbits[act-1]) { /* in object */
mao= ob->mat[act-1];
if(mao) mao->id.us--;
ob->mat[act-1]= ma;
@@ -591,7 +619,9 @@ void assign_material(Object *ob, Material *ma, int act)
if(mao) mao->id.us--;
(*matarar)[act-1]= ma;
}
- id_us_plus((ID *)ma);
+
+ if(ma)
+ id_us_plus((ID *)ma);
test_object_materials(ob->data);
}
@@ -623,19 +653,7 @@ void object_add_material_slot(Object *ob)
if(ob->totcol>=MAXMAT) return;
ma= give_current_material(ob, ob->actcol);
- if(ma==NULL)
- ma= add_material("Material");
- else
- ma= copy_material(ma);
-
- ma->id.us= 0; /* eeh... */
-
- if(ob->actcol) {
- if( BTST(ob->colbits, ob->actcol-1) ) {
- ob->colbits= BSET(ob->colbits, ob->totcol);
- }
- }
-
+
assign_material(ob, ma, ob->totcol+1);
ob->actcol= ob->totcol;
}
@@ -660,6 +678,7 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
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
}
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
@@ -674,9 +693,6 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
if(needtang) ma->mode |= MA_NORMAP_TANG;
else ma->mode &= ~MA_NORMAP_TANG;
- if(r_mode & R_RADIO)
- if(ma->mode & MA_RADIO) needuv= 1;
-
if(ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
needuv= 1;
if(r_mode & R_OSA) ma->texco |= TEXCO_OSA; /* for texfaces */
@@ -685,7 +701,7 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
/* since the raytracer doesnt recalc O structs for each ray, we have to preset them all */
if(r_mode & R_RAYTRACE) {
- if(ma->mode & (MA_RAYMIRROR|MA_RAYTRANSP|MA_SHADOW_TRA)) {
+ if((ma->mode & (MA_RAYMIRROR|MA_SHADOW_TRA)) || ((ma->mode && MA_TRANSP) && (ma->mode & MA_RAYTRANSP))) {
ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM;
if(r_mode & R_OSA) ma->texco |= TEXCO_OSA;
}
@@ -880,9 +896,8 @@ void object_remove_material_slot(Object *ob)
if(mao) mao->id.us--;
}
- for(a=ob->actcol; a<ob->totcol; a++) {
+ for(a=ob->actcol; a<ob->totcol; a++)
(*matarar)[a-1]= (*matarar)[a];
- }
(*totcolp)--;
if(*totcolp==0) {
@@ -900,13 +915,18 @@ void object_remove_material_slot(Object *ob)
mao= obt->mat[actcol-1];
if(mao) mao->id.us--;
- for(a=actcol; a<obt->totcol; a++) obt->mat[a-1]= obt->mat[a];
+ for(a=actcol; a<obt->totcol; a++) {
+ obt->mat[a-1]= obt->mat[a];
+ obt->matbits[a-1]= obt->matbits[a];
+ }
obt->totcol--;
if(obt->actcol > obt->totcol) obt->actcol= obt->totcol;
if(obt->totcol==0) {
MEM_freeN(obt->mat);
+ MEM_freeN(obt->matbits);
obt->mat= 0;
+ obt->matbits= NULL;
}
}
obt= obt->id.next;
@@ -1011,15 +1031,15 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
}
break;
case MA_RAMP_DARK:
- tmp= fac*col[0];
- if(tmp < *r) *r= tmp;
- if(g) {
- tmp= fac*col[1];
- if(tmp < *g) *g= tmp;
- tmp= fac*col[2];
- if(tmp < *b) *b= tmp;
- }
- break;
+ tmp=col[0]+((1-col[0])*facm);
+ if(tmp < *r) *r= tmp;
+ if(g) {
+ tmp=col[1]+((1-col[1])*facm);
+ if(tmp < *g) *g= tmp;
+ tmp=col[2]+((1-col[2])*facm);
+ if(tmp < *b) *b= tmp;
+ }
+ break;
case MA_RAMP_LIGHT:
tmp= fac*col[0];
if(tmp > *r) *r= tmp;
@@ -1149,8 +1169,37 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
}
}
break;
- }
-
+ case MA_RAMP_SOFT:
+ if (g){
+ float scr, scg, scb;
+
+ /* first calculate non-fac based Screen mix */
+ scr = 1.0 - ((1.0 - col[0])) * (1.0 - *r);
+ scg = 1.0 - ((1.0 - col[1])) * (1.0 - *g);
+ scb = 1.0 - ((1.0 - col[2])) * (1.0 - *b);
+
+ *r = facm*(*r) + fac*(((1.0 - *r) * col[0] * (*r)) + (*r * scr));
+ *g = facm*(*g) + fac*(((1.0 - *g) * col[1] * (*g)) + (*g * scg));
+ *b = facm*(*b) + fac*(((1.0 - *b) * col[2] * (*b)) + (*b * scb));
+ }
+ break;
+ case MA_RAMP_LINEAR:
+ if (col[0] > 0.5)
+ *r = *r + fac*(2*(col[0]-0.5));
+ else
+ *r = *r + fac*(2*(col[0]) - 1);
+ if (g){
+ if (col[1] > 0.5)
+ *g = *g + fac*(2*(col[1]-0.5));
+ else
+ *g = *g + fac*(2*(col[1]) -1);
+ if (col[2] > 0.5)
+ *b = *b + fac*(2*(col[2]-0.5));
+ else
+ *b = *b + fac*(2*(col[2]) - 1);
+ }
+ break;
+ }
}
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 74d56e81a87..3ca7dac4bc9 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -55,6 +55,7 @@
#include "BKE_main.h"
/* #include "BKE_object.h" */
+#include "BKE_animsys.h"
#include "BKE_scene.h"
#include "BKE_blender.h"
#include "BKE_library.h"
@@ -68,10 +69,10 @@
/* Global variables */
-float thresh= 0.6f;
-int totelem=0;
-MetaElem **mainb;
-octal_tree *metaball_tree = NULL;
+static float thresh= 0.6f;
+static int totelem=0;
+static MetaElem **mainb;
+static octal_tree *metaball_tree = NULL;
/* Functions */
void unlink_mball(MetaBall *mb)
@@ -90,6 +91,7 @@ void free_mball(MetaBall *mb)
{
unlink_mball(mb);
+ if(mb->adt) BKE_free_animdata((ID *)mb);
if(mb->mat) MEM_freeN(mb->mat);
if(mb->bb) MEM_freeN(mb->bb);
BLI_freelistN(&mb->elems);
@@ -278,6 +280,47 @@ int is_basis_mball(Object *ob)
return 1;
}
+/* \brief copy some properties from object to other metaball object with same base name
+ *
+ * When some properties (wiresize, threshold, update flags) of metaball are changed, then this properties
+ * are copied to all metaballs in same "group" (metaballs with same base name: MBall,
+ * MBall.001, MBall.002, etc). The most important is to copy properties to the base metaball,
+ * because this metaball influence polygonisation of metaballs. */
+void copy_mball_properties(Scene *scene, Object *active_object)
+{
+ Base *base;
+ Object *ob;
+ MetaBall *active_mball = (MetaBall*)active_object->data;
+ int basisnr, obnr;
+ char basisname[32], obname[32];
+
+ splitIDname(active_object->id.name+2, basisname, &basisnr);
+
+ /* XXX recursion check, see scene.c, just too simple code this next_object() */
+ if(F_ERROR==next_object(scene, 0, 0, 0))
+ return;
+
+ while(next_object(scene, 1, &base, &ob)) {
+ if (ob->type==OB_MBALL) {
+ if(ob!=active_object){
+ splitIDname(ob->id.name+2, obname, &obnr);
+
+ /* Object ob has to be in same "group" ... it means, that it has to have
+ * same base of its name */
+ if(strcmp(obname, basisname)==0){
+ MetaBall *mb= ob->data;
+
+ /* Copy properties from selected/edited metaball */
+ mb->wiresize= active_mball->wiresize;
+ mb->rendersize= active_mball->rendersize;
+ mb->thresh= active_mball->thresh;
+ mb->flag= active_mball->flag;
+ }
+ }
+ }
+ }
+}
+
/** \brief This function finds basic MetaBall.
*
* Basic MetaBall doesn't include any number at the end of
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 3facf975992..431543f8dbd 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -542,7 +542,8 @@ void set_mesh(Object *ob, Mesh *me)
if(ob->type==OB_MESH) {
old= ob->data;
- old->id.us--;
+ if (old)
+ old->id.us--;
ob->data= me;
id_us_plus((ID *)me);
}
@@ -795,6 +796,8 @@ void nurbs_to_mesh(Object *ob)
dl= cu->disp.first;
while(dl) {
+ int smooth= dl->rt & CU_SMOOTH ? 1 : 0;
+
if(dl->type==DL_SEGM) {
startvert= vertcount;
a= dl->parts*dl->nr;
@@ -811,6 +814,7 @@ void nurbs_to_mesh(Object *ob)
for(b=1; b<dl->nr; b++) {
mface->v1= startvert+ofs+b-1;
mface->v2= startvert+ofs+b;
+ if(smooth) mface->flag |= ME_SMOOTH;
mface++;
}
}
@@ -835,6 +839,7 @@ void nurbs_to_mesh(Object *ob)
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++;
}
}
@@ -860,6 +865,7 @@ void nurbs_to_mesh(Object *ob)
mface->v4= 0;
test_index_face(mface, NULL, 0, 3);
+ if(smooth) mface->flag |= ME_SMOOTH;
mface++;
index+= 3;
}
@@ -907,6 +913,8 @@ void nurbs_to_mesh(Object *ob)
mface->v4= p2;
mface->mat_nr= (unsigned char)dl->col;
test_index_face(mface, NULL, 0, 4);
+
+ if(smooth) mface->flag |= ME_SMOOTH;
mface++;
p4= p3;
@@ -970,7 +978,7 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
}
}
-// XXX do this in caller DAG_object_flush_update(scene, meshOb, OB_RECALC_DATA);
+// 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)
@@ -1258,7 +1266,7 @@ void mesh_pmv_revert(Object *ob, Mesh *me)
MEM_freeN(me->pv->vert_map);
me->pv->vert_map= NULL;
-// XXX do this in caller DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+// XXX do this in caller DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 1a6f57e75c4..b9b9ea6b4f3 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -58,23 +58,27 @@
#include "DNA_cloth_types.h"
#include "DNA_curve_types.h"
#include "DNA_effect_types.h"
+#include "DNA_group_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_fluidsim.h"
#include "DNA_object_force.h"
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
#include "DNA_texture_types.h"
#include "BLI_editVert.h"
-#include "MTC_matrixops.h"
-#include "MTC_vectorops.h"
+
+
#include "BKE_main.h"
#include "BKE_anim.h"
+#include "BKE_action.h"
#include "BKE_bmesh.h"
// XXX #include "BKE_booleanops.h"
#include "BKE_cloth.h"
@@ -95,6 +99,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
+#include "BKE_smoke.h"
#include "BKE_softbody.h"
#include "BKE_subsurf.h"
#include "BKE_texture.h"
@@ -209,7 +214,7 @@ static void curveModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->name, cmd->name, 32);
}
-CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask curveModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CurveModifierData *cmd = (CurveModifierData *)md;
CustomDataMask dataMask = 0;
@@ -285,7 +290,7 @@ static void latticeModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tlmd->name, lmd->name, 32);
}
-CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask latticeModifier_requiredDataMask(Object *ob, ModifierData *md)
{
LatticeModifierData *lmd = (LatticeModifierData *)md;
CustomDataMask dataMask = 0;
@@ -1099,7 +1104,7 @@ static void arrayModifier_updateDepgraph(ModifierData *md, DagForest *forest, Sc
}
}
-float vertarray_size(MVert *mvert, int numVerts, int axis)
+static float vertarray_size(MVert *mvert, int numVerts, int axis)
{
int i;
float min_co, max_co;
@@ -1185,7 +1190,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(amd->end_cap && amd->end_cap != ob)
end_cap = mesh_get_derived_final(scene, amd->end_cap, CD_MASK_MESH);
- MTC_Mat4One(offset);
+ Mat4One(offset);
indexMap = MEM_callocN(sizeof(*indexMap) * dm->getNumVerts(dm),
"indexmap");
@@ -1207,14 +1212,14 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
float result_mat[4][4];
if(ob)
- MTC_Mat4Invert(obinv, ob->obmat);
+ Mat4Invert(obinv, ob->obmat);
else
- MTC_Mat4One(obinv);
+ Mat4One(obinv);
- MTC_Mat4MulSerie(result_mat, offset,
+ Mat4MulSerie(result_mat, offset,
obinv, amd->offset_ob->obmat,
NULL, NULL, NULL, NULL, NULL);
- MTC_Mat4CpyMat4(offset, result_mat);
+ Mat4CpyMat4(offset, result_mat);
}
if(amd->fit_type == MOD_ARR_FITCURVE && amd->curve_ob) {
@@ -1239,7 +1244,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
prescribed length */
if(amd->fit_type == MOD_ARR_FITLENGTH
|| amd->fit_type == MOD_ARR_FITCURVE) {
- float dist = sqrt(MTC_dot3Float(offset[3], offset[3]));
+ float dist = sqrt(Inpf(offset[3], offset[3]));
if(dist > 1e-6f)
/* this gives length = first copy start to last copy end
@@ -1272,11 +1277,11 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
result = CDDM_from_template(dm, finalVerts, finalEdges, finalFaces);
/* calculate the offset matrix of the final copy (for merging) */
- MTC_Mat4One(final_offset);
+ Mat4One(final_offset);
for(j=0; j < count - 1; j++) {
- MTC_Mat4MulMat4(tmp_mat, final_offset, offset);
- MTC_Mat4CpyMat4(final_offset, tmp_mat);
+ Mat4MulMat4(tmp_mat, final_offset, offset);
+ Mat4CpyMat4(final_offset, tmp_mat);
}
numVerts = numEdges = numFaces = 0;
@@ -1312,7 +1317,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if((count > 1) && (amd->flags & MOD_ARR_MERGE)) {
float tmp_co[3];
VECCOPY(tmp_co, mv->co);
- MTC_Mat4MulVecfl(offset, tmp_co);
+ Mat4MulVecfl(offset, tmp_co);
for(j = 0; j < maxVerts; j++) {
/* if vertex already merged, don't use it */
@@ -1327,7 +1332,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(amd->flags & MOD_ARR_MERGEFINAL) {
VECCOPY(tmp_co, inMV->co);
inMV = &src_mvert[i];
- MTC_Mat4MulVecfl(final_offset, tmp_co);
+ Mat4MulVecfl(final_offset, tmp_co);
if(VecLenCompare(tmp_co, inMV->co, amd->merge_dist))
indexMap[i].merge_final = 1;
}
@@ -1345,7 +1350,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
*mv2 = *mv;
numVerts++;
- MTC_Mat4MulVecfl(offset, co);
+ Mat4MulVecfl(offset, co);
VECCOPY(mv2->co, co);
}
} else if(indexMap[i].merge != i && indexMap[i].merge_final) {
@@ -1766,7 +1771,7 @@ static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest, S
/* finds the best possible flipped name. For renaming; check for unique names afterwards */
/* if strip_number: removes number extensions */
-void vertgroup_flip_name (char *name, int strip_number)
+static void vertgroup_flip_name (char *name, int strip_number)
{
int len;
char prefix[128]={""}; /* The part before the facing */
@@ -3177,7 +3182,7 @@ static void tag_and_count_extra_edges(SmoothMesh *mesh, float split_angle,
/* we know the edge has 2 faces, so check the angle */
SmoothFace *face1 = edge->faces->link;
SmoothFace *face2 = edge->faces->next->link;
- float edge_angle_cos = MTC_dot3Float(face1->normal,
+ float edge_angle_cos = Inpf(face1->normal,
face2->normal);
if(edge_angle_cos < threshold) {
@@ -3396,7 +3401,7 @@ static void bevelModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32);
}
-CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask bevelModifier_requiredDataMask(Object *ob, ModifierData *md)
{
BevelModifierData *bmd = (BevelModifierData *)md;
CustomDataMask dataMask = 0;
@@ -3476,7 +3481,7 @@ static void displaceModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
}
-CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask displaceModifier_requiredDataMask(Object *ob, ModifierData *md)
{
DisplaceModifierData *dmd = (DisplaceModifierData *)md;
CustomDataMask dataMask = 0;
@@ -3820,7 +3825,7 @@ static void uvprojectModifier_copyData(ModifierData *md, ModifierData *target)
tumd->aspecty = umd->aspecty;
}
-CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask uvprojectModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@@ -4046,11 +4051,11 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
/* find the projector which the face points at most directly
* (projector normal with largest dot product is best)
*/
- best_dot = MTC_dot3Float(projectors[0].normal, face_no);
+ best_dot = Inpf(projectors[0].normal, face_no);
best_projector = &projectors[0];
for(j = 1; j < num_projectors; ++j) {
- float tmp_dot = MTC_dot3Float(projectors[j].normal,
+ float tmp_dot = Inpf(projectors[j].normal,
face_no);
if(tmp_dot > best_dot) {
best_dot = tmp_dot;
@@ -4273,7 +4278,7 @@ static void smoothModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tsmd->defgrp_name, smd->defgrp_name, 32);
}
-int smoothModifier_isDisabled(ModifierData *md)
+static int smoothModifier_isDisabled(ModifierData *md)
{
SmoothModifierData *smd = (SmoothModifierData*) md;
short flag;
@@ -4286,7 +4291,7 @@ int smoothModifier_isDisabled(ModifierData *md)
return 0;
}
-CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask smoothModifier_requiredDataMask(Object *ob, ModifierData *md)
{
SmoothModifierData *smd = (SmoothModifierData *)md;
CustomDataMask dataMask = 0;
@@ -4503,7 +4508,7 @@ static void castModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->defgrp_name, cmd->defgrp_name, 32);
}
-int castModifier_isDisabled(ModifierData *md)
+static int castModifier_isDisabled(ModifierData *md)
{
CastModifierData *cmd = (CastModifierData*) md;
short flag;
@@ -4515,7 +4520,7 @@ int castModifier_isDisabled(ModifierData *md)
return 0;
}
-CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask castModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CastModifierData *cmd = (CastModifierData *)md;
CustomDataMask dataMask = 0;
@@ -5068,7 +5073,7 @@ static void waveModifier_initData(ModifierData *md)
wmd->map_object = NULL;
wmd->height= 0.5f;
wmd->width= 1.5f;
- wmd->speed= 0.5f;
+ wmd->speed= 0.25f;
wmd->narrow= 1.5f;
wmd->lifetime= 0.0f;
wmd->damp= 10.0f;
@@ -5146,7 +5151,7 @@ static void waveModifier_updateDepgraph(
}
}
-CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask waveModifier_requiredDataMask(Object *ob, ModifierData *md)
{
WaveModifierData *wmd = (WaveModifierData *)md;
CustomDataMask dataMask = 0;
@@ -5482,7 +5487,7 @@ static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
}
-CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask armatureModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@@ -5594,9 +5599,10 @@ static void hookModifier_copyData(ModifierData *md, ModifierData *target)
thmd->indexar = MEM_dupallocN(hmd->indexar);
memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
strncpy(thmd->name, hmd->name, 32);
+ strncpy(thmd->subtarget, hmd->subtarget, 32);
}
-CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
{
HookModifierData *hmd = (HookModifierData *)md;
CustomDataMask dataMask = 0;
@@ -5638,9 +5644,11 @@ static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Sce
if (hmd->object) {
DagNode *curNode = dag_get_node(forest, hmd->object);
-
- dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA,
- "Hook Modifier");
+
+ if (hmd->subtarget[0])
+ dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA|DAG_RL_DATA_DATA, "Hook Modifier");
+ else
+ dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, "Hook Modifier");
}
}
@@ -5649,12 +5657,22 @@ static void hookModifier_deformVerts(
float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
{
HookModifierData *hmd = (HookModifierData*) md;
- float vec[3], mat[4][4];
+ bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
+ float vec[3], mat[4][4], dmat[4][4];
int i;
DerivedMesh *dm = derivedData;
-
+
+ /* get world-space matrix of target, corrected for the space the verts are in */
+ if (hmd->subtarget[0] && pchan) {
+ /* bone target if there's a matching pose-channel */
+ Mat4MulMat4(dmat, pchan->pose_mat, hmd->object->obmat);
+ }
+ else {
+ /* just object target */
+ Mat4CpyMat4(dmat, hmd->object->obmat);
+ }
Mat4Invert(ob->imat, ob->obmat);
- Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv,
+ Mat4MulSerie(mat, ob->imat, dmat, hmd->parentinv,
NULL, NULL, NULL, NULL, NULL);
/* vertex indices? */
@@ -5711,7 +5729,8 @@ static void hookModifier_deformVerts(
}
}
}
- } else { /* vertex group hook */
+ }
+ else if(hmd->name[0]) { /* vertex group hook */
bDeformGroup *curdef;
Mesh *me = ob->data;
int index = 0;
@@ -5786,6 +5805,79 @@ static int softbodyModifier_dependsOnTime(ModifierData *md)
return 1;
}
+/* Smoke */
+
+static void smokeModifier_initData(ModifierData *md)
+{
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ smd->domain = NULL;
+ smd->flow = NULL;
+ smd->coll = NULL;
+ smd->type = 0;
+ smd->time = -1;
+}
+
+static void smokeModifier_freeData(ModifierData *md)
+{
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ smokeModifier_free (smd);
+}
+
+static void smokeModifier_deformVerts(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+{
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+ DerivedMesh *dm = NULL;
+
+ if(derivedData) dm = derivedData;
+ else if(ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
+ else return;
+
+ CDDM_apply_vert_coords(dm, vertexCos);
+ CDDM_calc_normals(dm);
+
+ smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc);
+
+ if(dm != derivedData) dm->release(dm);
+}
+
+static int smokeModifier_dependsOnTime(ModifierData *md)
+{
+ return 1;
+}
+
+static void smokeModifier_updateDepgraph(
+ ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
+ DagNode *obNode)
+{
+ /*SmokeModifierData *smd = (SmokeModifierData *) md;
+ if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
+ {
+ if(smd->domain->fluid_group)
+ {
+ GroupObject *go = NULL;
+
+ for(go = smd->domain->fluid_group->gobject.first; go; go = go->next)
+ {
+ if(go->ob)
+ {
+ SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke);
+
+ // check for initialized smoke object
+ if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow)
+ {
+ DagNode *curNode = dag_get_node(forest, go->ob);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow");
+ }
+ }
+ }
+ }
+ }
+ */
+}
/* Cloth */
@@ -5795,7 +5887,7 @@ static void clothModifier_initData(ModifierData *md)
clmd->sim_parms = MEM_callocN(sizeof(ClothSimSettings), "cloth sim parms");
clmd->coll_parms = MEM_callocN(sizeof(ClothCollSettings), "cloth coll parms");
- clmd->point_cache = BKE_ptcache_add();
+ clmd->point_cache = BKE_ptcache_add(&clmd->ptcaches);
/* check for alloc failing */
if(!clmd->sim_parms || !clmd->coll_parms || !clmd->point_cache)
@@ -5855,7 +5947,7 @@ static void clothModifier_updateDepgraph(
}
}
-CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask clothModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = 0;
@@ -5874,12 +5966,13 @@ static void clothModifier_copyData(ModifierData *md, ModifierData *target)
MEM_freeN(tclmd->sim_parms);
if(tclmd->coll_parms)
MEM_freeN(tclmd->coll_parms);
- if(tclmd->point_cache)
- BKE_ptcache_free(tclmd->point_cache);
+
+ BKE_ptcache_free_list(&tclmd->ptcaches);
+ tclmd->point_cache = NULL;
tclmd->sim_parms = MEM_dupallocN(clmd->sim_parms);
tclmd->coll_parms = MEM_dupallocN(clmd->coll_parms);
- tclmd->point_cache = BKE_ptcache_copy(clmd->point_cache);
+ tclmd->point_cache = BKE_ptcache_copy_list(&tclmd->ptcaches, &clmd->ptcaches);
tclmd->clothObject = NULL;
}
@@ -5903,8 +5996,9 @@ static void clothModifier_freeData(ModifierData *md)
MEM_freeN(clmd->sim_parms);
if(clmd->coll_parms)
MEM_freeN(clmd->coll_parms);
- if(clmd->point_cache)
- BKE_ptcache_free(clmd->point_cache);
+
+ BKE_ptcache_free_list(&clmd->ptcaches);
+ clmd->point_cache = NULL;
}
}
@@ -6112,9 +6206,14 @@ static void surfaceModifier_freeData(ModifierData *md)
MEM_freeN(surmd->bvhtree);
}
- if(surmd->dm)
- surmd->dm->release(surmd->dm);
+ surmd->dm->release(surmd->dm);
+
+ if(surmd->x)
+ MEM_freeN(surmd->x);
+ if(surmd->v)
+ MEM_freeN(surmd->v);
+
surmd->bvhtree = NULL;
surmd->dm = NULL;
}
@@ -6127,7 +6226,7 @@ static int surfaceModifier_dependsOnTime(ModifierData *md)
static void surfaceModifier_deformVerts(
ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+ float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
{
SurfaceModifierData *surmd = (SurfaceModifierData*) md;
unsigned int numverts = 0, i = 0;
@@ -6147,14 +6246,47 @@ static void surfaceModifier_deformVerts(
if(surmd->dm)
{
+ int init = 0;
+ float *vec;
+ MVert *x, *v;
+
CDDM_apply_vert_coords(surmd->dm, vertexCos);
CDDM_calc_normals(surmd->dm);
numverts = surmd->dm->getNumVerts ( surmd->dm );
- /* convert to global coordinates */
- for(i = 0; i<numverts; i++)
- Mat4MulVecfl(ob->obmat, CDDM_get_vert(surmd->dm, i)->co);
+ if(numverts != surmd->numverts || surmd->x == NULL || surmd->v == NULL || md->scene->r.cfra != surmd->cfra+1) {
+ if(surmd->x) {
+ MEM_freeN(surmd->x);
+ surmd->x = NULL;
+ }
+ if(surmd->v) {
+ MEM_freeN(surmd->v);
+ surmd->v = NULL;
+ }
+
+ surmd->x = MEM_callocN(numverts * sizeof(MVert), "MVert");
+ surmd->v = MEM_callocN(numverts * sizeof(MVert), "MVert");
+
+ surmd->numverts = numverts;
+
+ init = 1;
+ }
+
+ /* convert to global coordinates and calculate velocity */
+ for(i = 0, x = surmd->x, v = surmd->v; i<numverts; i++, x++, v++) {
+ vec = CDDM_get_vert(surmd->dm, i)->co;
+ Mat4MulVecfl(ob->obmat, vec);
+
+ if(init)
+ v->co[0] = v->co[1] = v->co[2] = 0.0f;
+ else
+ VecSubf(v->co, vec, x->co);
+
+ VecCopyf(x->co, vec);
+ }
+
+ surmd->cfra = md->scene->r.cfra;
if(surmd->bvhtree)
free_bvhtree_from_mesh(surmd->bvhtree);
@@ -6239,7 +6371,7 @@ static DerivedMesh *booleanModifier_applyModifier(
return derivedData;
}
-CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask booleanModifier_requiredDataMask(Object *ob, ModifierData *md)
{
CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
@@ -6287,7 +6419,7 @@ static void particleSystemModifier_copyData(ModifierData *md, ModifierData *targ
tpsmd->psys = psmd->psys;
}
-CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
CustomDataMask dataMask = 0;
@@ -6295,6 +6427,9 @@ CustomDataMask particleSystemModifier_requiredDataMask(Object *ob, ModifierData
MTex *mtex;
int i;
+ if(!psmd->psys->part)
+ return 0;
+
ma= give_current_material(ob, psmd->psys->part->omat);
if(ma) {
for(i=0; i<MAX_MTEX; i++) {
@@ -6386,6 +6521,7 @@ static void particleSystemModifier_deformVerts(
}
if(psys){
+ psmd->flag &= ~eParticleSystemFlag_psys_updated;
particle_system_update(md->scene, ob, psys);
psmd->flag |= eParticleSystemFlag_psys_updated;
psmd->flag &= ~eParticleSystemFlag_DM_changed;
@@ -6417,6 +6553,8 @@ static void particleInstanceModifier_initData(ModifierData *md)
pimd->flag = eParticleInstanceFlag_Parents|eParticleInstanceFlag_Unborn|
eParticleInstanceFlag_Alive|eParticleInstanceFlag_Dead;
pimd->psys = 1;
+ pimd->position = 1.0f;
+ pimd->axis = 2;
}
static void particleInstanceModifier_copyData(ModifierData *md, ModifierData *target)
@@ -6427,6 +6565,8 @@ static void particleInstanceModifier_copyData(ModifierData *md, ModifierData *ta
tpimd->ob = pimd->ob;
tpimd->psys = pimd->psys;
tpimd->flag = pimd->flag;
+ tpimd->position = pimd->position;
+ tpimd->random_position = pimd->random_position;
}
static int particleInstanceModifier_dependsOnTime(ModifierData *md)
@@ -6461,13 +6601,15 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
{
DerivedMesh *dm = derivedData, *result;
ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
+ ParticleSimulationData sim;
ParticleSystem * psys=0;
ParticleData *pa=0, *pars=0;
MFace *mface, *orig_mface;
MVert *mvert, *orig_mvert;
int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0;
- short track=ob->trackflag%3, trackneg;
+ short track=ob->trackflag%3, trackneg, axis = pimd->axis;
float max_co=0.0, min_co=0.0, temp_co[3], cross[3];
+ float *size=NULL;
trackneg=((ob->trackflag>2)?1:0);
@@ -6494,6 +6636,30 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
if(totpart==0)
return derivedData;
+ sim.scene = md->scene;
+ sim.ob = pimd->ob;
+ sim.psys = psys;
+ sim.psmd = psys_get_modifier(pimd->ob, psys);
+
+ if(pimd->flag & eParticleInstanceFlag_UseSize) {
+ int p;
+ float *si;
+ si = size = MEM_callocN(totpart * sizeof(float), "particle size array");
+
+ if(pimd->flag & eParticleInstanceFlag_Parents) {
+ for(p=0, pa= psys->particles; p<psys->totpart; p++, pa++, si++)
+ *si = pa->size;
+ }
+
+ if(pimd->flag & eParticleInstanceFlag_Children) {
+ ChildParticle *cpa = psys->child;
+
+ for(p=0; p<psys->totchild; p++, cpa++, si++) {
+ *si = psys_get_child_size(psys, cpa, 0.0f, NULL);
+ }
+ }
+ }
+
pars=psys->particles;
totvert=dm->getNumVerts(dm);
@@ -6502,9 +6668,9 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
maxvert=totvert*totpart;
maxface=totface*totpart;
- psys->lattice=psys_get_lattice(md->scene, ob, psys);
+ psys->lattice=psys_get_lattice(&sim);
- if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)){
+ if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED){
float min_r[3], max_r[3];
INIT_MINMAX(min_r, max_r);
@@ -6529,40 +6695,57 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
/*change orientation based on object trackflag*/
VECCOPY(temp_co,mv->co);
- mv->co[0]=temp_co[track];
- mv->co[1]=temp_co[(track+1)%3];
- mv->co[2]=temp_co[(track+2)%3];
+ mv->co[axis]=temp_co[track];
+ mv->co[(axis+1)%3]=temp_co[(track+1)%3];
+ mv->co[(axis+2)%3]=temp_co[(track+2)%3];
+
+ if((psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & PTCACHE_BAKED) && pimd->flag & eParticleInstanceFlag_Path){
+ float ran = 0.0f;
+ if(pimd->random_position != 0.0f) {
+ BLI_srandom(psys->seed + (i/totvert)%totpart);
+ ran = pimd->random_position * BLI_frand();
+ }
- if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) && pimd->flag & eParticleInstanceFlag_Path){
- state.time=(mv->co[0]-min_co)/(max_co-min_co);
- if(trackneg)
- state.time=1.0f-state.time;
- psys_get_particle_on_path(md->scene, pimd->ob, psys,first_particle + i/totvert, &state,1);
+ if(pimd->flag & eParticleInstanceFlag_KeepShape) {
+ state.time = pimd->position * (1.0f - ran);
+ }
+ else {
+ state.time=(mv->co[axis]-min_co)/(max_co-min_co) * pimd->position * (1.0f - ran);
- mv->co[0] = 0.0;
+ if(trackneg)
+ state.time=1.0f-state.time;
+
+ mv->co[axis] = 0.0;
+ }
+
+ psys_get_particle_on_path(&sim, first_particle + i/totvert, &state,1);
Normalize(state.vel);
- if(state.vel[0] < -0.9999 || state.vel[0] > 0.9999) {
- state.rot[0] = 1.0;
+ /* TODO: incremental rotations somehow */
+ if(state.vel[axis] < -0.9999 || state.vel[axis] > 0.9999) {
+ state.rot[0] = 1;
state.rot[1] = state.rot[2] = state.rot[3] = 0.0f;
}
else {
- /* a cross product of state.vel and a unit vector in x-direction */
- cross[0] = 0.0f;
- cross[1] = -state.vel[2];
- cross[2] = state.vel[1];
+ float temp[3] = {0.0f,0.0f,0.0f};
+ temp[axis] = 1.0f;
+
+ Crossf(cross, temp, state.vel);
- /* state.vel[0] is the only component surviving from a dot product with a vector in x-direction*/
- VecRotToQuat(cross,saacos(state.vel[0]),state.rot);
+ /* state.vel[axis] is the only component surviving from a dot product with the axis */
+ VecRotToQuat(cross,saacos(state.vel[axis]),state.rot);
}
+
}
else{
state.time=-1.0;
- psys_get_particle_state(md->scene, pimd->ob, psys, i/totvert, &state,1);
+ psys_get_particle_state(&sim, first_particle + i/totvert, &state,1);
}
QuatMulVecf(state.rot,mv->co);
+ if(pimd->flag & eParticleInstanceFlag_UseSize)
+ VecMulf(mv->co, size[i/totvert]);
VECADD(mv->co,mv->co,state.co);
}
@@ -6615,6 +6798,9 @@ static DerivedMesh * particleInstanceModifier_applyModifier(
psys->lattice= NULL;
}
+ if(size)
+ MEM_freeN(size);
+
return result;
}
static DerivedMesh *particleInstanceModifier_applyModifierEM(
@@ -6652,7 +6838,7 @@ static int explodeModifier_dependsOnTime(ModifierData *md)
{
return 1;
}
-CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask explodeModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ExplodeModifierData *emd= (ExplodeModifierData*) md;
CustomDataMask dataMask = 0;
@@ -7236,6 +7422,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
DerivedMesh *explode, *dm=to_explode;
MFace *mf=0;
ParticleSettings *part=psmd->psys->part;
+ ParticleSimulationData sim = {scene, ob, psmd->psys, psmd};
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
EdgeHash *vertpahash;
@@ -7251,12 +7438,12 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
totvert= dm->getNumVerts(dm);
totpart= psmd->psys->totpart;
- timestep= psys_get_timestep(part);
+ timestep= psys_get_timestep(&sim);
- if(part->flag & PART_GLOB_TIME)
+ //if(part->flag & PART_GLOB_TIME)
cfra=bsystem_time(scene, 0,(float)scene->r.cfra,0.0);
- else
- cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0);
+ //else
+ // cfra=bsystem_time(scene, ob,(float)scene->r.cfra,0.0);
/* hash table for vertice <-> particle relations */
vertpahash= BLI_edgehash_new();
@@ -7294,7 +7481,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
/* getting back to object space */
Mat4Invert(imat,ob->obmat);
- psmd->psys->lattice = psys_get_lattice(scene, ob, psmd->psys);
+ psmd->psys->lattice = psys_get_lattice(&sim);
/* duplicate & displace vertices */
ehi= BLI_edgehashIterator_new(vertpahash);
@@ -7322,7 +7509,7 @@ static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
Mat4MulVecfl(ob->obmat,loc0);
state.time=cfra;
- psys_get_particle_state(scene, ob, psmd->psys, i, &state,1);
+ psys_get_particle_state(&sim, i, &state, 1);
vertco=CDDM_get_vert(explode,v)->co;
@@ -7411,7 +7598,7 @@ static DerivedMesh * explodeModifier_applyModifier(
{
DerivedMesh *dm = derivedData;
ExplodeModifierData *emd= (ExplodeModifierData*) md;
- ParticleSystemModifierData *psmd=explodeModifier_findPrecedingParticlesystem(ob,md);;
+ ParticleSystemModifierData *psmd=explodeModifier_findPrecedingParticlesystem(ob,md);
if(psmd){
ParticleSystem * psys=psmd->psys;
@@ -7566,7 +7753,7 @@ static void meshdeformModifier_copyData(ModifierData *md, ModifierData *target)
tmmd->object = mmd->object;
}
-CustomDataMask meshdeformModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask meshdeformModifier_requiredDataMask(Object *ob, ModifierData *md)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
CustomDataMask dataMask = 0;
@@ -7891,14 +8078,13 @@ static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob,
int useRenderParams, int isFinalCalc)
{
MultiresModifierData *mmd = (MultiresModifierData*)md;
- Mesh *me = get_mesh(ob);
DerivedMesh *final;
/* TODO: for now just skip a level1 mesh */
if(mmd->lvl == 1)
return dm;
- final = multires_dm_create_from_derived(mmd, dm, me, useRenderParams, isFinalCalc);
+ final = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc);
if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) {
int i;
MVert *dst = CDDM_get_verts(final);
@@ -7947,7 +8133,7 @@ static void shrinkwrapModifier_copyData(ModifierData *md, ModifierData *target)
tsmd->subsurfLevels = smd->subsurfLevels;
}
-CustomDataMask shrinkwrapModifier_requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask shrinkwrapModifier_requiredDataMask(Object *ob, ModifierData *md)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
CustomDataMask dataMask = 0;
@@ -8324,6 +8510,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->initData = smoothModifier_initData;
mti->copyData = smoothModifier_copyData;
mti->requiredDataMask = smoothModifier_requiredDataMask;
+ mti->isDisabled = smoothModifier_isDisabled;
mti->deformVerts = smoothModifier_deformVerts;
mti->deformVertsEM = smoothModifier_deformVertsEM;
@@ -8334,6 +8521,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->initData = castModifier_initData;
mti->copyData = castModifier_copyData;
mti->requiredDataMask = castModifier_requiredDataMask;
+ mti->isDisabled = castModifier_isDisabled;
mti->foreachObjectLink = castModifier_foreachObjectLink;
mti->updateDepgraph = castModifier_updateDepgraph;
mti->deformVerts = castModifier_deformVerts;
@@ -8384,15 +8572,28 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti = INIT_TYPE(Softbody);
mti->type = eModifierTypeType_OnlyDeform;
mti->flags = eModifierTypeFlag_AcceptsCVs
- | eModifierTypeFlag_RequiresOriginalData;
+ | eModifierTypeFlag_RequiresOriginalData
+ | eModifierTypeFlag_Single;
mti->deformVerts = softbodyModifier_deformVerts;
mti->dependsOnTime = softbodyModifier_dependsOnTime;
+
+ mti = INIT_TYPE(Smoke);
+ mti->type = eModifierTypeType_OnlyDeform;
+ mti->initData = smokeModifier_initData;
+ mti->freeData = smokeModifier_freeData;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_UsesPointCache
+ | eModifierTypeFlag_Single;
+ mti->deformVerts = smokeModifier_deformVerts;
+ mti->dependsOnTime = smokeModifier_dependsOnTime;
+ mti->updateDepgraph = smokeModifier_updateDepgraph;
mti = INIT_TYPE(Cloth);
mti->type = eModifierTypeType_Nonconstructive;
mti->initData = clothModifier_initData;
mti->flags = eModifierTypeFlag_AcceptsMesh
- | eModifierTypeFlag_UsesPointCache;
+ | eModifierTypeFlag_UsesPointCache
+ | eModifierTypeFlag_Single;
mti->dependsOnTime = clothModifier_dependsOnTime;
mti->freeData = clothModifier_freeData;
mti->requiredDataMask = clothModifier_requiredDataMask;
@@ -8403,7 +8604,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti = INIT_TYPE(Collision);
mti->type = eModifierTypeType_OnlyDeform;
mti->initData = collisionModifier_initData;
- mti->flags = eModifierTypeFlag_AcceptsMesh;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_Single;
mti->dependsOnTime = collisionModifier_dependsOnTime;
mti->freeData = collisionModifier_freeData;
mti->deformVerts = collisionModifier_deformVerts;
@@ -8412,7 +8614,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti = INIT_TYPE(Surface);
mti->type = eModifierTypeType_OnlyDeform;
mti->initData = surfaceModifier_initData;
- mti->flags = eModifierTypeFlag_AcceptsMesh;
+ mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_NoUserAdd;
mti->dependsOnTime = surfaceModifier_dependsOnTime;
mti->freeData = surfaceModifier_freeData;
mti->deformVerts = surfaceModifier_deformVerts;
@@ -8486,7 +8688,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti = INIT_TYPE(Fluidsim);
mti->type = eModifierTypeType_Nonconstructive
- | eModifierTypeFlag_RequiresOriginalData;
+ | eModifierTypeFlag_RequiresOriginalData
+ | eModifierTypeFlag_Single;
mti->flags = eModifierTypeFlag_AcceptsMesh;
mti->initData = fluidsimModifier_initData;
mti->freeData = fluidsimModifier_freeData;
@@ -8943,19 +9146,6 @@ int modifiers_indexInObject(Object *ob, ModifierData *md_seek)
return i;
}
-int modifiers_usesPointCache(Object *ob)
-{
- ModifierData *md = ob->modifiers.first;
-
- for (; md; md=md->next) {
- ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (mti->flags & eModifierTypeFlag_UsesPointCache) {
- return 1;
- }
- }
- return 0;
-}
-
void modifier_freeTemporaryData(ModifierData *md)
{
if(md->type == eModifierType_Armature) {
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 5def910ddef..e7159b82d49 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -83,7 +83,7 @@ int multiresModifier_switch_level(Object *ob, const int distance)
mmd->lvl += distance;
if(mmd->lvl < 1) mmd->lvl = 1;
else if(mmd->lvl > mmd->totlvl) mmd->lvl = mmd->totlvl;
- /* XXX: DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ /* XXX: DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
object_handle_update(ob);*/
return 1;
}
@@ -101,7 +101,7 @@ void multiresModifier_join(Object *ob)
/* First find the highest level of subdivision */
base = FIRSTBASE;
while(base) {
- if(TESTBASELIB_BGMODE(base) && base->object->type==OB_MESH) {
+ if(TESTBASELIB_BGMODE(v3d, base) && base->object->type==OB_MESH) {
ModifierData *md;
for(md = base->object->modifiers.first; md; md = md->next) {
if(md->type == eModifierType_Multires) {
@@ -124,7 +124,7 @@ void multiresModifier_join(Object *ob)
/* Subdivide all the displacements to the highest level */
base = FIRSTBASE;
while(base) {
- if(TESTBASELIB_BGMODE(base) && base->object->type==OB_MESH) {
+ if(TESTBASELIB_BGMODE(v3d, base) && base->object->type==OB_MESH) {
ModifierData *md = NULL;
MultiresModifierData *mmd = NULL;
@@ -204,10 +204,11 @@ static void VecAddUf(float a[3], float b[3])
a[2] += b[2];
}
-static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int lvl, int totlvl,
+static void multires_subdisp(DerivedMesh *orig, Object *ob, DerivedMesh *final, int lvl, int totlvl,
int totsubvert, int totsubedge, int totsubface, int addverts)
{
DerivedMesh *mrdm;
+ Mesh *me = ob->data;
MultiresModifierData mmd_sub;
MVert *mvs = CDDM_get_verts(final);
MVert *mvd, *mvd_f1, *mvs_f1, *mvd_f3, *mvd_f4;
@@ -220,8 +221,9 @@ static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, in
int skip = multires_side_tot[totlvl - lvl] - 1;
int i, j, k;
+ memset(&mmd_sub, 0, sizeof(MultiresModifierData));
mmd_sub.lvl = mmd_sub.totlvl = totlvl;
- mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
+ mrdm = multires_dm_create_from_derived(&mmd_sub, 1, orig, ob, 0, 0);
mvd = CDDM_get_verts(mrdm);
/* Need to map from ccg to mrdm */
@@ -394,7 +396,7 @@ static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, in
}
}
- final->needsFree = 1;
+ final->needsFree = 1;
final->release(final);
mrdm->needsFree = 1;
MultiresDM_mark_as_modified(mrdm);
@@ -465,8 +467,10 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
MultiresModifierData mmd_sub;
orig = CDDM_from_mesh(me, NULL);
+ memset(&mmd_sub, 0, sizeof(MultiresModifierData));
mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
- mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
+ mmd_sub.simple = simple;
+ mrdm = multires_dm_create_from_derived(&mmd_sub, 1, orig, ob, 0, 0);
totsubvert = mrdm->getNumVerts(mrdm);
totsubedge = mrdm->getNumEdges(mrdm);
totsubface = mrdm->getNumFaces(mrdm);
@@ -495,7 +499,7 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int dista
orig = CDDM_from_mesh(me, NULL);
- multires_subdisp(orig, me, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
+ multires_subdisp(orig, ob, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
orig->needsFree = 1;
orig->release(orig);
@@ -592,7 +596,7 @@ static void find_displacer_edges(MultiresDisplacer *d, DerivedMesh *dm, Displace
}
/* Returns in out the corners [0-3] that use v1 and v2 */
-void find_face_corners(MFace *f, int v1, int v2, int out[2])
+static void find_face_corners(MFace *f, int v1, int v2, int out[2])
{
int i, end = f->v4 ? 4 : 3;
@@ -1164,9 +1168,11 @@ static void multiresModifier_disp_run(DerivedMesh *dm, MVert *subco, int invert)
static void multiresModifier_update(DerivedMesh *dm)
{
+ Object *ob;
Mesh *me;
MDisps *mdisps;
+ ob = MultiresDM_get_object(dm);
me = MultiresDM_get_mesh(dm);
mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
@@ -1187,7 +1193,7 @@ static void multiresModifier_update(DerivedMesh *dm)
(includes older displacements but not new sculpts) */
mmd.totlvl = totlvl;
mmd.lvl = lvl;
- subco_dm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+ subco_dm = multires_dm_create_from_derived(&mmd, 1, orig, ob, 0, 0);
cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
/* Subtract the original vertex cos from the new vertex cos */
@@ -1197,7 +1203,7 @@ static void multiresModifier_update(DerivedMesh *dm)
final = multires_subdisp_pre(dm, totlvl - lvl, 0);
- multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
+ multires_subdisp(orig, ob, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
dm->getNumFaces(dm), 1);
subco_dm->release(subco_dm);
@@ -1224,7 +1230,7 @@ void multires_force_update(Object *ob)
}
}
-struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Mesh *me,
+struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
int useRenderParams, int isFinalCalc)
{
SubsurfModifierData smd;
@@ -1233,7 +1239,8 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D
int i;
ms.mmd = mmd;
- ms.me = me;
+ ms.ob = ob;
+ ms.local_mmd = local_mmd;
memset(&smd, 0, sizeof(SubsurfModifierData));
smd.levels = smd.renderLevels = mmd->lvl - 1;
@@ -1252,7 +1259,7 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, D
***************************/
/* Does not actually free lvl itself */
-void multires_free_level(MultiresLevel *lvl)
+static void multires_free_level(MultiresLevel *lvl)
{
if(lvl) {
if(lvl->faces) MEM_freeN(lvl->faces);
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index dc2bf26759f..83ee71bfe40 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -17,171 +17,1531 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Joshua Leung (full recode)
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
-#include "DNA_space_types.h"
-#include "DNA_nla_types.h"
+#include "DNA_anim_types.h"
#include "DNA_action_types.h"
-#include "DNA_ID.h"
-#include "DNA_ipo_types.h"
-#include "DNA_object_types.h"
-#include "BKE_nla.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_fcurve.h"
+#include "BKE_nla.h"
#include "BKE_blender.h"
#include "BKE_library.h"
-#include "BKE_object.h" /* for convert_action_to_strip(ob) */
+#include "BKE_object.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "nla_private.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-/* NOTE: in group.c the strips get copied for group-nla override, this assumes
- that strips are one single block, without additional data to be copied */
-void copy_actionstrip (bActionStrip **dst, bActionStrip **src){
- bActionStrip *dstrip;
- bActionStrip *sstrip = *src;
+/* *************************************************** */
+/* Data Management */
- if (!*src){
- *dst=NULL;
+/* Freeing ------------------------------------------- */
+
+/* Remove the given NLA strip from the NLA track it occupies, free the strip's data,
+ * and the strip itself.
+ */
+void free_nlastrip (ListBase *strips, NlaStrip *strip)
+{
+ NlaStrip *cs, *csn;
+
+ /* sanity checks */
+ if (strip == NULL)
return;
+
+ /* free child-strips */
+ for (cs= strip->strips.first; cs; cs= csn) {
+ csn= cs->next;
+ free_nlastrip(&strip->strips, cs);
}
+
+ /* remove reference to action */
+ if (strip->act)
+ strip->act->id.us--;
+
+ /* free remapping info */
+ //if (strip->remap)
+ // BKE_animremap_free();
+
+ /* free own F-Curves */
+ free_fcurves(&strip->fcurves);
+
+ /* free own F-Modifiers */
+ free_fmodifiers(&strip->modifiers);
+
+ /* free the strip itself */
+ if (strips)
+ BLI_freelinkN(strips, strip);
+ else
+ MEM_freeN(strip);
+}
- *dst = MEM_dupallocN(sstrip);
+/* Remove the given NLA track from the set of NLA tracks, free the track's data,
+ * and the track itself.
+ */
+void free_nlatrack (ListBase *tracks, NlaTrack *nlt)
+{
+ NlaStrip *strip, *stripn;
+
+ /* sanity checks */
+ if (nlt == NULL)
+ return;
+
+ /* free strips */
+ for (strip= nlt->strips.first; strip; strip= stripn) {
+ stripn= strip->next;
+ free_nlastrip(&nlt->strips, strip);
+ }
+
+ /* free NLA track itself now */
+ if (tracks)
+ BLI_freelinkN(tracks, nlt);
+ else
+ MEM_freeN(nlt);
+}
+
+/* Free the elements of type NLA Tracks provided in the given list, but do not free
+ * the list itself since that is not free-standing
+ */
+void free_nladata (ListBase *tracks)
+{
+ NlaTrack *nlt, *nltn;
+
+ /* sanity checks */
+ if ELEM(NULL, tracks, tracks->first)
+ return;
+
+ /* free tracks one by one */
+ for (nlt= tracks->first; nlt; nlt= nltn) {
+ nltn= nlt->next;
+ free_nlatrack(tracks, nlt);
+ }
+
+ /* clear the list's pointers to be safe */
+ tracks->first= tracks->last= NULL;
+}
- dstrip = *dst;
- if (dstrip->act)
- dstrip->act->id.us++;
+/* Copying ------------------------------------------- */
- if (dstrip->ipo)
- dstrip->ipo->id.us++;
+/* Copy NLA strip */
+NlaStrip *copy_nlastrip (NlaStrip *strip)
+{
+ NlaStrip *strip_d;
+ NlaStrip *cs, *cs_d;
+
+ /* sanity check */
+ if (strip == NULL)
+ return NULL;
+
+ /* make a copy */
+ strip_d= MEM_dupallocN(strip);
+ strip_d->next= strip_d->prev= NULL;
- if (dstrip->modifiers.first) {
- BLI_duplicatelist (&dstrip->modifiers, &sstrip->modifiers);
+ /* increase user-count of action */
+ if (strip_d->act)
+ strip_d->act->id.us++;
+
+ /* copy F-Curves and modifiers */
+ copy_fcurves(&strip_d->fcurves, &strip->fcurves);
+ copy_fmodifiers(&strip_d->modifiers, &strip->modifiers);
+
+ /* make a copy of all the child-strips, one at a time */
+ strip_d->strips.first= strip_d->strips.last= NULL;
+
+ for (cs= strip->strips.first; cs; cs= cs->next) {
+ cs_d= copy_nlastrip(cs);
+ BLI_addtail(&strip_d->strips, cs_d);
}
+ /* return the strip */
+ return strip_d;
}
-void copy_nlastrips (ListBase *dst, ListBase *src)
+/* Copy NLA Track */
+NlaTrack *copy_nlatrack (NlaTrack *nlt)
{
- bActionStrip *strip;
+ NlaStrip *strip, *strip_d;
+ NlaTrack *nlt_d;
+
+ /* sanity check */
+ if (nlt == NULL)
+ return NULL;
+
+ /* make a copy */
+ nlt_d= MEM_dupallocN(nlt);
+ nlt_d->next= nlt_d->prev= NULL;
+
+ /* make a copy of all the strips, one at a time */
+ nlt_d->strips.first= nlt_d->strips.last= NULL;
+
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ strip_d= copy_nlastrip(strip);
+ BLI_addtail(&nlt_d->strips, strip_d);
+ }
+
+ /* return the copy */
+ return nlt_d;
+}
- dst->first=dst->last=NULL;
+/* Copy all NLA data */
+void copy_nladata (ListBase *dst, ListBase *src)
+{
+ NlaTrack *nlt, *nlt_d;
+
+ /* sanity checks */
+ if ELEM(NULL, dst, src)
+ return;
+
+ /* copy each NLA-track, one at a time */
+ for (nlt= src->first; nlt; nlt= nlt->next) {
+ /* make a copy, and add the copy to the destination list */
+ nlt_d= copy_nlatrack(nlt);
+ BLI_addtail(dst, nlt_d);
+ }
+}
- BLI_duplicatelist (dst, src);
+/* Adding ------------------------------------------- */
- /* Update specific data */
- if (!dst->first)
- return;
+/* Add a NLA Track to the given AnimData
+ * - prev: NLA-Track to add the new one after
+ */
+NlaTrack *add_nlatrack (AnimData *adt, NlaTrack *prev)
+{
+ NlaTrack *nlt;
+
+ /* sanity checks */
+ if (adt == NULL)
+ return NULL;
+
+ /* allocate new track */
+ nlt= MEM_callocN(sizeof(NlaTrack), "NlaTrack");
+
+ /* set settings requiring the track to not be part of the stack yet */
+ nlt->flag = NLATRACK_SELECTED;
+ nlt->index= BLI_countlist(&adt->nla_tracks);
+
+ /* add track to stack, and make it the active one */
+ if (prev)
+ BLI_insertlinkafter(&adt->nla_tracks, prev, nlt);
+ else
+ BLI_addtail(&adt->nla_tracks, nlt);
+ BKE_nlatrack_set_active(&adt->nla_tracks, nlt);
+
+ /* must have unique name, but we need to seed this */
+ sprintf(nlt->name, "NlaTrack");
+ BLI_uniquename(&adt->nla_tracks, nlt, "NlaTrack", '.', offsetof(NlaTrack, name), 64);
+
+ /* return the new track */
+ return nlt;
+}
+
+/* Add a NLA Strip referencing the given Action */
+NlaStrip *add_nlastrip (bAction *act)
+{
+ NlaStrip *strip;
+
+ /* sanity checks */
+ if (act == NULL)
+ return NULL;
+
+ /* allocate new strip */
+ strip= MEM_callocN(sizeof(NlaStrip), "NlaStrip");
+
+ /* generic settings
+ * - selected flag to highlight this to the user
+ * - auto-blends to ensure that blend in/out values are automatically
+ * determined by overlaps of strips
+ * - (XXX) synchronisation of strip-length in accordance with changes to action-length
+ * is not done though, since this should only really happens in editmode for strips now
+ * though this decision is still subject to further review...
+ */
+ strip->flag = NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_AUTO_BLENDS;
+
+ /* assign the action reference */
+ strip->act= act;
+ id_us_plus(&act->id);
+
+ /* determine initial range
+ * - strip length cannot be 0... ever...
+ */
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
+
+ strip->start = strip->actstart;
+ strip->end = (IS_EQ(strip->actstart, strip->actend)) ? (strip->actstart + 1.0f): (strip->actend);
+
+ /* strip should be referenced as-is */
+ strip->scale= 1.0f;
+ strip->repeat = 1.0f;
+
+ /* return the new strip */
+ return strip;
+}
+
+/* Add new NLA-strip to the top of the NLA stack - i.e. into the last track if space, or a new one otherwise */
+NlaStrip *add_nlastrip_to_stack (AnimData *adt, bAction *act)
+{
+ NlaStrip *strip;
+ NlaTrack *nlt;
+
+ /* sanity checks */
+ if ELEM(NULL, adt, act)
+ return NULL;
+
+ /* create a new NLA strip */
+ strip= add_nlastrip(act);
+ if (strip == NULL)
+ return NULL;
+
+ /* firstly try adding strip to last track, but if that fails, add to a new track */
+ if (BKE_nlatrack_add_strip(adt->nla_tracks.last, strip) == 0) {
+ /* trying to add to the last track failed (no track or no space),
+ * so add a new track to the stack, and add to that...
+ */
+ nlt= add_nlatrack(adt, NULL);
+ BKE_nlatrack_add_strip(nlt, strip);
+ }
+
+ /* automatically name it too */
+ BKE_nlastrip_validate_name(adt, strip);
+
+ /* returns the strip added */
+ return strip;
+}
+
+/* *************************************************** */
+/* NLA Evaluation <-> Editing Stuff */
+
+/* Strip Mapping ------------------------------------- */
- for (strip = dst->first; strip; strip=strip->next){
- if (strip->act)
- strip->act->id.us++;
- if (strip->ipo)
- strip->ipo->id.us++;
- if (strip->modifiers.first) {
- ListBase listb;
- BLI_duplicatelist (&listb, &strip->modifiers);
- strip->modifiers= listb;
+/* non clipped mapping for strip-time <-> global time (for Action-Clips)
+ * invert = convert action-strip time to global time
+ */
+static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short mode)
+{
+ float actlength, repeat, scale;
+
+ /* get number of repeats */
+ if (IS_EQ(strip->repeat, 0.0f)) strip->repeat = 1.0f;
+ repeat = strip->repeat;
+
+ /* scaling */
+ if (IS_EQ(strip->scale, 0.0f)) strip->scale= 1.0f;
+ scale = (float)fabs(strip->scale); /* scale must be positive - we've got a special flag for reversing */
+
+ /* length of referenced action */
+ actlength = strip->actend - strip->actstart;
+ if (IS_EQ(actlength, 0.0f)) actlength = 1.0f;
+
+ /* reversed = play strip backwards */
+ if (strip->flag & NLASTRIP_FLAG_REVERSE) {
+ // FIXME: this won't work right with Graph Editor?
+ if (mode == NLATIME_CONVERT_MAP) {
+ return strip->end - scale*(cframe - strip->actstart);
+ }
+ else if (mode == NLATIME_CONVERT_UNMAP) {
+ int repeatsNum = (int)((cframe - strip->start) / (actlength * scale));
+
+ /* this method doesn't clip the values to lie within the action range only
+ * - the '(repeatsNum * actlength * scale)' compensates for the fmod(...)
+ * - the fmod(...) works in the same way as for eval
+ */
+ return strip->actend - (repeatsNum * actlength * scale)
+ - (fmod(cframe - strip->start, actlength*scale) / scale);
+ }
+ else /* if (mode == NLATIME_CONVERT_EVAL) */{
+ if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
+ /* this case prevents the motion snapping back to the first frame at the end of the strip
+ * by catching the case where repeats is a whole number, which means that the end of the strip
+ * could also be interpreted as the end of the start of a repeat
+ */
+ return strip->actstart;
+ }
+ else {
+ /* - the 'fmod(..., actlength*scale)' is needed to get the repeats working
+ * - the '/ scale' is needed to ensure that scaling influences the timing within the repeat
+ */
+ return strip->actend - fmod(cframe - strip->start, actlength*scale) / scale;
+ }
+ }
+ }
+ else {
+ if (mode == NLATIME_CONVERT_MAP) {
+ return strip->start + scale*(cframe - strip->actstart);
+ }
+ else if (mode == NLATIME_CONVERT_UNMAP) {
+ int repeatsNum = (int)((cframe - strip->start) / (actlength * scale));
+
+ /* this method doesn't clip the values to lie within the action range only
+ * - the '(repeatsNum * actlength * scale)' compensates for the fmod(...)
+ * - the fmod(...) works in the same way as for eval
+ */
+ return strip->actstart + (repeatsNum * actlength * scale)
+ + (fmod(cframe - strip->start, actlength*scale) / scale);
+ }
+ else /* if (mode == NLATIME_CONVERT_EVAL) */{
+ if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
+ /* this case prevents the motion snapping back to the first frame at the end of the strip
+ * by catching the case where repeats is a whole number, which means that the end of the strip
+ * could also be interpreted as the end of the start of a repeat
+ */
+ return strip->actend;
+ }
+ else {
+ /* - the 'fmod(..., actlength*scale)' is needed to get the repeats working
+ * - the '/ scale' is needed to ensure that scaling influences the timing within the repeat
+ */
+ return strip->actstart + fmod(cframe - strip->start, actlength*scale) / scale;
+ }
}
}
}
-/* from editnla, for convert_action_to_strip -- no UI code so should be ok here.. */
-void find_stridechannel(Object *ob, bActionStrip *strip)
+/* non clipped mapping for strip-time <-> global time (for Transitions)
+ * invert = convert action-strip time to global time
+ */
+static float nlastrip_get_frame_transition (NlaStrip *strip, float cframe, short mode)
{
- if(ob && ob->pose) {
- bPoseChannel *pchan;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next)
- if(pchan->flag & POSE_STRIDE)
- break;
- if(pchan)
- BLI_strncpy(strip->stridechannel, pchan->name, 32);
+ float length;
+
+ /* length of strip */
+ length= strip->end - strip->start;
+
+ /* reversed = play strip backwards */
+ if (strip->flag & NLASTRIP_FLAG_REVERSE) {
+ if (mode == NLATIME_CONVERT_MAP)
+ return strip->end - (length * cframe);
+ else
+ return (strip->end - cframe) / length;
+ }
+ else {
+ if (mode == NLATIME_CONVERT_MAP)
+ return (length * cframe) + strip->start;
else
- strip->stridechannel[0]= 0;
+ return (cframe - strip->start) / length;
}
}
-//called by convert_nla / bpy api with an object with the action to be converted to a new strip
-bActionStrip *convert_action_to_strip (Object *ob)
+/* non clipped mapping for strip-time <-> global time
+ * mode = eNlaTime_ConvertModes[] -> NLATIME_CONVERT_*
+ *
+ * only secure for 'internal' (i.e. within AnimSys evaluation) operations,
+ * but should not be directly relied on for stuff which interacts with editors
+ */
+float nlastrip_get_frame (NlaStrip *strip, float cframe, short mode)
+{
+ switch (strip->type) {
+ case NLASTRIP_TYPE_META: /* meta - for now, does the same as transition (is really just an empty container) */
+ case NLASTRIP_TYPE_TRANSITION: /* transition */
+ return nlastrip_get_frame_transition(strip, cframe, mode);
+
+ case NLASTRIP_TYPE_CLIP: /* action-clip (default) */
+ default:
+ return nlastrip_get_frame_actionclip(strip, cframe, mode);
+ }
+}
+
+
+/* Non clipped mapping for strip-time <-> global time
+ * mode = eNlaTime_ConvertModesp[] -> NLATIME_CONVERT_*
+ *
+ * Public API method - perform this mapping using the given AnimData block
+ * and perform any necessary sanity checks on the value
+ */
+float BKE_nla_tweakedit_remap (AnimData *adt, float cframe, short mode)
+{
+ NlaStrip *strip;
+
+ /* sanity checks
+ * - obviously we've got to have some starting data
+ * - when not in tweakmode, the active Action does not have any scaling applied :)
+ * - when in tweakmode, if the no-mapping flag is set, do not map
+ */
+ if ((adt == NULL) || (adt->flag & ADT_NLA_EDIT_ON)==0 || (adt->flag & ADT_NLA_EDIT_NOMAP))
+ return cframe;
+
+ /* if the active-strip info has been stored already, access this, otherwise look this up
+ * and store for (very probable) future usage
+ */
+ if (adt->actstrip == NULL) {
+ NlaTrack *nlt= BKE_nlatrack_find_active(&adt->nla_tracks);
+ adt->actstrip= BKE_nlastrip_find_active(nlt);
+ }
+ strip= adt->actstrip;
+
+ /* sanity checks
+ * - in rare cases, we may not be able to find this strip for some reason (internal error)
+ * - for now, if the user has defined a curve to control the time, this correction cannot be performed
+ * reliably...
+ */
+ if ((strip == NULL) || (strip->flag & NLASTRIP_FLAG_USR_TIME))
+ return cframe;
+
+ /* perform the correction now... */
+ return nlastrip_get_frame(strip, cframe, mode);
+}
+
+/* *************************************************** */
+/* NLA API */
+
+/* List of Strips ------------------------------------ */
+/* (these functions are used for NLA-Tracks and also for nested/meta-strips) */
+
+/* Check if there is any space in the given list to add the given strip */
+short BKE_nlastrips_has_space (ListBase *strips, float start, float end)
+{
+ NlaStrip *strip;
+
+ /* sanity checks */
+ if ((strips == NULL) || IS_EQ(start, end))
+ return 0;
+ if (start > end) {
+ puts("BKE_nlastrips_has_space() error... start and end arguments swapped");
+ SWAP(float, start, end);
+ }
+
+ /* loop over NLA strips checking for any overlaps with this area... */
+ for (strip= strips->first; strip; strip= strip->next) {
+ /* 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)
+ return 1;
+
+ /* if the end of the strip is greater than either of the boundaries, the range
+ * must fall within the extents of the strip
+ */
+ if ((strip->end > start) || (strip->end > end))
+ return 0;
+ }
+
+ /* if we are still here, we haven't encountered any overlapping strips */
+ return 1;
+}
+
+/* Rearrange the strips in the track so that they are always in order
+ * (usually only needed after a strip has been moved)
+ */
+void BKE_nlastrips_sort_strips (ListBase *strips)
{
- bActionStrip *nstrip;
+ ListBase tmp = {NULL, NULL};
+ NlaStrip *strip, *sstrip, *stripn;
+
+ /* sanity checks */
+ if ELEM(NULL, strips, strips->first)
+ return;
+
+ /* we simply perform insertion sort on this list, since it is assumed that per track,
+ * there are only likely to be at most 5-10 strips
+ */
+ for (strip= strips->first; strip; strip= stripn) {
+ short not_added = 1;
+
+ stripn= strip->next;
+
+ /* remove this strip from the list, and add it to the new list, searching from the end of
+ * the list, assuming that the lists are in order
+ */
+ BLI_remlink(strips, strip);
+
+ for (sstrip= tmp.last; sstrip; sstrip= sstrip->prev) {
+ /* check if add after */
+ if (sstrip->end <= strip->start) {
+ BLI_insertlinkafter(&tmp, sstrip, strip);
+ not_added= 0;
+ break;
+ }
+ }
+
+ /* add before first? */
+ if (not_added)
+ BLI_addhead(&tmp, strip);
+ }
+
+ /* reassign the start and end points of the strips */
+ strips->first= tmp.first;
+ strips->last= tmp.last;
+}
- /* Make new actionstrip */
- nstrip = MEM_callocN(sizeof(bActionStrip), "bActionStrip");
+/* Add the given NLA-Strip to the given list of strips, assuming that it
+ * isn't currently a member of another list
+ */
+short BKE_nlastrips_add_strip (ListBase *strips, NlaStrip *strip)
+{
+ NlaStrip *ns;
+ short not_added = 1;
+
+ /* sanity checks */
+ if ELEM(NULL, strips, strip)
+ return 0;
+
+ /* check if any space to add */
+ if (BKE_nlastrips_has_space(strips, strip->start, strip->end)==0)
+ return 0;
+
+ /* 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) {
+ BLI_insertlinkbefore(strips, ns, strip);
+ not_added= 0;
+ break;
+ }
+ }
+ if (not_added) {
+ /* just add to the end of the list of the strips then... */
+ BLI_addtail(strips, strip);
+ }
+
+ /* added... */
+ return 1;
+}
+
+
+/* Meta-Strips ------------------------------------ */
+
+/* Convert 'islands' (i.e. continuous string of) selected strips to be
+ * contained within 'Meta-Strips' which act as strips which contain strips.
+ * temp: are the meta-strips to be created 'temporary' ones used for transforms?
+ */
+void BKE_nlastrips_make_metas (ListBase *strips, short temp)
+{
+ NlaStrip *mstrip = NULL;
+ NlaStrip *strip, *stripn;
+
+ /* sanity checks */
+ if ELEM(NULL, strips, strips->first)
+ return;
+
+ /* group all continuous chains of selected strips into meta-strips */
+ for (strip= strips->first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* if there is an existing meta-strip, add this strip to it, otherwise, create a new one */
+ if (mstrip == NULL) {
+ /* add a new meta-strip, and add it before the current strip that it will replace... */
+ mstrip= MEM_callocN(sizeof(NlaStrip), "Meta-NlaStrip");
+ mstrip->type = NLASTRIP_TYPE_META;
+ BLI_insertlinkbefore(strips, strip, mstrip);
+
+ /* set flags */
+ mstrip->flag = NLASTRIP_FLAG_SELECT;
+
+ /* set temp flag if appropriate (i.e. for transform-type editing) */
+ if (temp)
+ mstrip->flag |= NLASTRIP_FLAG_TEMP_META;
+
+ /* set default repeat/scale values to prevent warnings */
+ mstrip->repeat= mstrip->scale= 1.0f;
+
+ /* make its start frame be set to the start frame of the current strip */
+ mstrip->start= strip->start;
+ }
+
+ /* remove the selected strips from the track, and add to the meta */
+ BLI_remlink(strips, strip);
+ BLI_addtail(&mstrip->strips, strip);
- /* Link the action to the nstrip */
- nstrip->act = ob->action;
- id_us_plus(&nstrip->act->id);
- calc_action_range(nstrip->act, &nstrip->actstart, &nstrip->actend, 1);
- nstrip->start = nstrip->actstart;
- nstrip->end = nstrip->actend;
- nstrip->flag = ACTSTRIP_SELECT|ACTSTRIP_LOCK_ACTION;
+ /* expand the meta's dimensions to include the newly added strip- i.e. its last frame */
+ mstrip->end= strip->end;
+ }
+ else {
+ /* current strip wasn't selected, so the end of 'island' of selected strips has been reached,
+ * so stop adding strips to the current meta
+ */
+ mstrip= NULL;
+ }
+ }
+}
+
+/* Split a meta-strip into a set of normal strips */
+void BKE_nlastrips_clear_metastrip (ListBase *strips, NlaStrip *strip)
+{
+ NlaStrip *cs, *csn;
+
+ /* sanity check */
+ if ELEM(NULL, strips, strip)
+ return;
+
+ /* move each one of the meta-strip's children before the meta-strip
+ * in the list of strips after unlinking them from the meta-strip
+ */
+ for (cs= strip->strips.first; cs; cs= csn) {
+ csn= cs->next;
+ BLI_remlink(&strip->strips, cs);
+ BLI_insertlinkbefore(strips, strip, cs);
+ }
+
+ /* free the meta-strip now */
+ BLI_freelinkN(strips, strip);
+}
+
+/* Remove meta-strips (i.e. flatten the list of strips) from the top-level of the list of strips
+ * sel: only consider selected meta-strips, otherwise all meta-strips are removed
+ * onlyTemp: only remove the 'temporary' meta-strips used for transforms
+ */
+void BKE_nlastrips_clear_metas (ListBase *strips, short onlySel, short onlyTemp)
+{
+ NlaStrip *strip, *stripn;
+
+ /* sanity checks */
+ if ELEM(NULL, strips, strips->first)
+ return;
+
+ /* remove meta-strips fitting the criteria of the arguments */
+ for (strip= strips->first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ /* check if strip is a meta-strip */
+ if (strip->type == NLASTRIP_TYPE_META) {
+ /* if check if selection and 'temporary-only' considerations are met */
+ if ((onlySel==0) || (strip->flag & NLASTRIP_FLAG_SELECT)) {
+ if ((!onlyTemp) || (strip->flag & NLASTRIP_FLAG_TEMP_META)) {
+ BKE_nlastrips_clear_metastrip(strips, strip);
+ }
+ }
+ }
+ }
+}
+
+/* Add the given NLA-Strip to the given Meta-Strip, assuming that the
+ * strip isn't attached to anyy list of strips
+ */
+short BKE_nlameta_add_strip (NlaStrip *mstrip, NlaStrip *strip)
+{
+ /* sanity checks */
+ if ELEM(NULL, mstrip, strip)
+ return 0;
+
+ /* firstly, check if the meta-strip has space for this */
+ if (BKE_nlastrips_has_space(&mstrip->strips, strip->start, strip->end) == 0)
+ return 0;
+
+ /* check if this would need to be added to the ends of the meta,
+ * and subsequently, if the neighbouring strips allow us enough room
+ */
+ if (strip->start < mstrip->start) {
+ /* check if strip to the left (if it exists) ends before the
+ * start of the strip we're trying to add
+ */
+ if ((mstrip->prev == NULL) || (mstrip->prev->end <= strip->start)) {
+ /* add strip to start of meta's list, and expand dimensions */
+ BLI_addhead(&mstrip->strips, strip);
+ mstrip->start= strip->start;
- find_stridechannel(ob, nstrip);
- //set_active_strip(ob, nstrip); /* is in editnla as does UI calls */
+ return 1;
+ }
+ else /* failed... no room before */
+ return 0;
+ }
+ else if (strip->end > mstrip->end) {
+ /* check if strip to the right (if it exists) starts before the
+ * end of the strip we're trying to add
+ */
+ if ((mstrip->next == NULL) || (mstrip->next->start >= strip->end)) {
+ /* add strip to end of meta's list, and expand dimensions */
+ BLI_addtail(&mstrip->strips, strip);
+ mstrip->end= strip->end;
- nstrip->repeat = 1.0;
+ return 1;
+ }
+ else /* failed... no room after */
+ return 0;
+ }
+ else {
+ /* just try to add to the meta-strip (no dimension changes needed) */
+ return BKE_nlastrips_add_strip(&mstrip->strips, strip);
+ }
+}
- if(ob->nlastrips.first == NULL)
- ob->nlaflag |= OB_NLA_OVERRIDE;
+/* Adjust the settings of NLA-Strips contained within a Meta-Strip (recursively),
+ * until the Meta-Strips children all fit within the Meta-Strip's new dimensions
+ */
+void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
+{
+ NlaStrip *strip;
+ float oStart, oEnd, offset;
+ float oLen, nLen;
+ short scaleChanged= 0;
+
+ /* sanity checks
+ * - strip must exist
+ * - strip must be a meta-strip with some contents
+ */
+ if ELEM(NULL, mstrip, mstrip->strips.first)
+ return;
+ if (mstrip->type != NLASTRIP_TYPE_META)
+ return;
+
+ /* get the original start/end points, and calculate the start-frame offset
+ * - these are simply the start/end frames of the child strips,
+ * since we assume they weren't transformed yet
+ */
+ oStart= ((NlaStrip *)mstrip->strips.first)->start;
+ oEnd= ((NlaStrip *)mstrip->strips.last)->end;
+ offset= mstrip->start - oStart;
- BLI_addtail(&ob->nlastrips, nstrip);
- return nstrip; /* is created, malloced etc. here so is safe to just return the pointer?
- this is needed for setting this active in UI, and probably useful for API too */
+ /* optimisation:
+ * don't flush if nothing changed yet
+ * TODO: maybe we need a flag to say always flush?
+ */
+ if (IS_EQ(oStart, mstrip->start) && IS_EQ(oEnd, mstrip->end))
+ return;
+ /* check if scale changed */
+ oLen = oEnd - oStart;
+ nLen = mstrip->end - mstrip->start;
+ if (IS_EQ(nLen, oLen) == 0)
+ scaleChanged= 1;
+
+ /* for each child-strip, calculate new start/end points based on this new info */
+ for (strip= mstrip->strips.first; strip; strip= strip->next) {
+ if (scaleChanged) {
+ PointerRNA ptr;
+ float p1, p2, nStart, nEnd;
+
+ /* compute positions of endpoints relative to old extents of strip */
+ p1= (strip->start - oStart) / oLen;
+ p2= (strip->end - oStart) / oLen;
+
+ /* compute the new strip endpoints using the proportions */
+ nStart= (p1 * nLen) + mstrip->start;
+ nEnd= (p2 * nLen) + mstrip->start;
+
+ /* firstly, apply the new positions manually, then apply using RNA
+ * - first time is to make sure no truncation errors from one endpoint not being
+ * set yet occur
+ * - second time is to make sure scale is computed properly...
+ */
+ strip->start= nStart;
+ strip->end= nEnd;
+
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &ptr);
+ RNA_float_set(&ptr, "start_frame", nStart);
+ RNA_float_set(&ptr, "end_frame", nEnd);
+ }
+ else {
+ /* just apply the changes in offset to both ends of the strip */
+ strip->start += offset;
+ strip->end += offset;
+ }
+
+ /* finally, make sure the strip's children (if it is a meta-itself), get updated */
+ BKE_nlameta_flush_transforms(strip);
+ }
}
+/* NLA-Tracks ---------------------------------------- */
+
+/* Find the active NLA-track for the given stack */
+NlaTrack *BKE_nlatrack_find_active (ListBase *tracks)
+{
+ NlaTrack *nlt;
+
+ /* sanity check */
+ if ELEM(NULL, tracks, tracks->first)
+ return NULL;
+
+ /* try to find the first active track */
+ for (nlt= tracks->first; nlt; nlt= nlt->next) {
+ if (nlt->flag & NLATRACK_ACTIVE)
+ return nlt;
+ }
+
+ /* none found */
+ return NULL;
+}
-/* not strip itself! */
-void free_actionstrip(bActionStrip* strip)
+/* Toggle the 'solo' setting for the given NLA-track, making sure that it is the only one
+ * that has this status in its AnimData block.
+ */
+void BKE_nlatrack_solo_toggle (AnimData *adt, NlaTrack *nlt)
{
- if (!strip)
+ NlaTrack *nt;
+
+ /* sanity check */
+ if ELEM(NULL, adt, adt->nla_tracks.first)
return;
+
+ /* firstly, make sure 'solo' flag for all tracks is disabled */
+ for (nt= adt->nla_tracks.first; nt; nt= nt->next) {
+ if (nt != nlt)
+ nt->flag &= ~NLATRACK_SOLO;
+ }
+
+ /* now, enable 'solo' for the given track if appropriate */
+ if (nlt) {
+ /* toggle solo status */
+ nlt->flag ^= NLATRACK_SOLO;
+
+ /* set or clear solo-status on AnimData */
+ if (nlt->flag & NLATRACK_SOLO)
+ adt->flag |= ADT_NLA_SOLO_TRACK;
+ else
+ adt->flag &= ~ADT_NLA_SOLO_TRACK;
+ }
+ else
+ adt->flag &= ~ADT_NLA_SOLO_TRACK;
+}
- if (strip->act){
- strip->act->id.us--;
- strip->act = NULL;
+/* Make the given NLA-track the active one for the given stack. If no track is provided,
+ * this function can be used to simply deactivate all the NLA tracks in the given stack too.
+ */
+void BKE_nlatrack_set_active (ListBase *tracks, NlaTrack *nlt_a)
+{
+ NlaTrack *nlt;
+
+ /* sanity check */
+ if ELEM(NULL, tracks, tracks->first)
+ return;
+
+ /* deactive all the rest */
+ for (nlt= tracks->first; nlt; nlt= nlt->next)
+ nlt->flag &= ~NLATRACK_ACTIVE;
+
+ /* set the given one as the active one */
+ if (nlt_a)
+ nlt_a->flag |= NLATRACK_ACTIVE;
+}
+
+/* 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))
+ return 0;
+ if (start > end) {
+ puts("BKE_nlatrack_has_space() error... start and end arguments swapped");
+ SWAP(float, start, end);
+ }
+
+ /* check if there's any space left in the track for a strip of the given length */
+ return BKE_nlastrips_has_space(&nlt->strips, start, end);
+}
+
+/* Rearrange the strips in the track so that they are always in order
+ * (usually only needed after a strip has been moved)
+ */
+void BKE_nlatrack_sort_strips (NlaTrack *nlt)
+{
+ /* sanity checks */
+ if ELEM(NULL, nlt, nlt->strips.first)
+ return;
+
+ /* sort the strips with a more generic function */
+ BKE_nlastrips_sort_strips(&nlt->strips);
+}
+
+/* Add the given NLA-Strip to the given NLA-Track, assuming that it
+ * isn't currently attached to another one
+ */
+short BKE_nlatrack_add_strip (NlaTrack *nlt, NlaStrip *strip)
+{
+ /* sanity checks */
+ if ELEM(NULL, nlt, strip)
+ return 0;
+
+ /* try to add the strip to the track using a more generic function */
+ return BKE_nlastrips_add_strip(&nlt->strips, strip);
+}
+
+/* NLA Strips -------------------------------------- */
+
+/* Find the active NLA-strip within the given track */
+NlaStrip *BKE_nlastrip_find_active (NlaTrack *nlt)
+{
+ NlaStrip *strip;
+
+ /* sanity check */
+ if ELEM(NULL, nlt, nlt->strips.first)
+ return NULL;
+
+ /* try to find the first active strip */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (strip->flag & NLASTRIP_FLAG_ACTIVE)
+ return strip;
+ }
+
+ /* none found */
+ return NULL;
+}
+
+/* Make the given NLA-Strip the active one within the given block */
+void BKE_nlastrip_set_active (AnimData *adt, NlaStrip *strip)
+{
+ NlaTrack *nlt;
+ NlaStrip *nls;
+
+ /* sanity checks */
+ if (adt == NULL)
+ return;
+
+ /* loop over tracks, deactivating*/
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ for (nls= nlt->strips.first; nls; nls= nls->next) {
+ if (nls != strip)
+ nls->flag &= ~NLASTRIP_FLAG_ACTIVE;
+ else
+ nls->flag |= NLASTRIP_FLAG_ACTIVE;
+ }
}
- if (strip->ipo){
- strip->ipo->id.us--;
- strip->ipo = NULL;
+}
+
+
+/* Does the given NLA-strip fall within the given bounds (times)? */
+short BKE_nlastrip_within_bounds (NlaStrip *strip, float min, float max)
+{
+ const float stripLen= (strip) ? strip->end - strip->start : 0.0f;
+ const float boundsLen= (float)fabs(max - min);
+
+ /* sanity checks */
+ if ((strip == NULL) || IS_EQ(stripLen, 0.0f) || IS_EQ(boundsLen, 0.0f))
+ return 0;
+
+ /* only ok if at least part of the strip is within the bounding window
+ * - first 2 cases cover when the strip length is less than the bounding area
+ * - second 2 cases cover when the strip length is greater than the bounding area
+ */
+ if ( (stripLen < boundsLen) &&
+ !(IN_RANGE(strip->start, min, max) ||
+ IN_RANGE(strip->end, min, max)) )
+ {
+ return 0;
}
- if (strip->modifiers.first) {
- BLI_freelistN(&strip->modifiers);
+ if ( (stripLen > boundsLen) &&
+ !(IN_RANGE(min, strip->start, strip->end) ||
+ IN_RANGE(max, strip->start, strip->end)) )
+ {
+ return 0;
+ }
+
+ /* should be ok! */
+ return 1;
+}
+
+/* Is the given NLA-strip the first one to occur for the given AnimData block */
+// TODO: make this an api method if necesary, but need to add prefix first
+static short nlastrip_is_first (AnimData *adt, NlaStrip *strip)
+{
+ NlaTrack *nlt;
+ NlaStrip *ns;
+
+ /* sanity checks */
+ if ELEM(NULL, adt, strip)
+ return 0;
+
+ /* check if strip has any strips before it */
+ if (strip->prev)
+ return 0;
+
+ /* check other tracks to see if they have a strip that's earlier */
+ // TODO: or should we check that the strip's track is also the first?
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ /* only check the first strip, assuming that they're all in order */
+ ns= nlt->strips.first;
+ if (ns) {
+ if (ns->start < strip->start)
+ return 0;
+ }
+ }
+
+ /* should be first now */
+ return 1;
+}
+
+/* Animated Strips ------------------------------------------- */
+
+/* Check if the given NLA-Track has any strips with own F-Curves */
+short BKE_nlatrack_has_animated_strips (NlaTrack *nlt)
+{
+ NlaStrip *strip;
+
+ /* sanity checks */
+ if ELEM(NULL, nlt, nlt->strips.first)
+ return 0;
+
+ /* check each strip for F-Curves only (don't care about whether the flags are set) */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (strip->fcurves.first)
+ return 1;
}
+ /* none found */
+ return 0;
}
-void free_nlastrips (ListBase *nlalist)
+/* Check if given NLA-Tracks have any strips with own F-Curves */
+short BKE_nlatracks_have_animated_strips (ListBase *tracks)
{
- bActionStrip *strip;
+ NlaTrack *nlt;
+
+ /* sanity checks */
+ if ELEM(NULL, tracks, tracks->first)
+ return 0;
+
+ /* check each track, stopping on the first hit */
+ for (nlt= tracks->first; nlt; nlt= nlt->next) {
+ if (BKE_nlatrack_has_animated_strips(nlt))
+ return 1;
+ }
+
+ /* none found */
+ return 0;
+}
- if (!nlalist->first)
+/* Validate the NLA-Strips 'control' F-Curves based on the flags set*/
+void BKE_nlastrip_validate_fcurves (NlaStrip *strip)
+{
+ FCurve *fcu;
+
+ /* sanity checks */
+ if (strip == NULL)
return;
+
+ /* if controlling influence... */
+ if (strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) {
+ /* try to get F-Curve */
+ fcu= list_find_fcurve(&strip->fcurves, "influence", 0);
+
+ /* add one if not found */
+ if (fcu == NULL) {
+ /* make new F-Curve */
+ fcu= MEM_callocN(sizeof(FCurve), "NlaStrip FCurve");
+ BLI_addtail(&strip->fcurves, fcu);
+
+ /* set default flags */
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+
+ /* store path - make copy, and store that */
+ fcu->rna_path= BLI_strdupn("influence", 9);
+
+ // TODO: insert a few keyframes to ensure default behaviour?
+ }
+ }
+
+ /* if controlling time... */
+ if (strip->flag & NLASTRIP_FLAG_USR_TIME) {
+ /* try to get F-Curve */
+ fcu= list_find_fcurve(&strip->fcurves, "strip_time", 0);
+
+ /* add one if not found */
+ if (fcu == NULL) {
+ /* make new F-Curve */
+ fcu= MEM_callocN(sizeof(FCurve), "NlaStrip FCurve");
+ BLI_addtail(&strip->fcurves, fcu);
+
+ /* set default flags */
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+
+ /* store path - make copy, and store that */
+ fcu->rna_path= BLI_strdupn("strip_time", 10);
+
+ // TODO: insert a few keyframes to ensure default behaviour?
+ }
+ }
+}
- /* Do any specific freeing */
- for (strip=nlalist->first; strip; strip=strip->next)
+/* Sanity Validation ------------------------------------ */
+
+/* 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,
+ * not just a single track.
+ */
+void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip)
+{
+ GHash *gh;
+ NlaStrip *tstrip;
+ NlaTrack *nlt;
+
+ /* sanity checks */
+ if ELEM(NULL, adt, strip)
+ return;
+
+ /* give strip a default name if none already */
+ if (strip->name[0]==0) {
+ switch (strip->type) {
+ case NLASTRIP_TYPE_CLIP: /* act-clip */
+ sprintf(strip->name, "Act: %s", (strip->act)?(strip->act->id.name+2):("<None>"));
+ break;
+ case NLASTRIP_TYPE_TRANSITION: /* transition */
+ sprintf(strip->name, "Transition");
+ break;
+ case NLASTRIP_TYPE_META: /* meta */
+ sprintf(strip->name, "Meta");
+ break;
+ default:
+ sprintf(strip->name, "NLA Strip");
+ break;
+ }
+ }
+
+ /* build a hash-table of all the strips in the tracks
+ * - this is easier than iterating over all the tracks+strips hierarchy everytime
+ * (and probably faster)
+ */
+ gh= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
+
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ for (tstrip= nlt->strips.first; tstrip; tstrip= tstrip->next) {
+ /* don't add the strip of interest */
+ if (tstrip == strip)
+ continue;
+
+ /* use the name of the strip as the key, and the strip as the value, since we're mostly interested in the keys */
+ BLI_ghash_insert(gh, tstrip->name, tstrip);
+ }
+ }
+
+ /* 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 = strchr(strip->name, '.');
+ if (dot) *dot=0;
+
+ /* Try different possibilities */
+ for (number = 1; number <= 999; number++) {
+ /* assemble alternative name */
+ BLI_snprintf(tempname, 128, "%s%c%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;
+ }
+ }
+ }
+
+ /* free the hash... */
+ BLI_ghash_free(gh, NULL, NULL);
+}
+
+/* ---- */
+
+/* Get strips which overlap the given one at the start/end of its range
+ * - strip: strip that we're finding overlaps for
+ * - track: nla-track that the overlapping strips should be found from
+ * - start, end: frames for the offending endpoints
+ */
+static void nlastrip_get_endpoint_overlaps (NlaStrip *strip, NlaTrack *track, float **start, float **end)
+{
+ NlaStrip *nls;
+
+ /* find strips that overlap over the start/end of the given strip,
+ * but which don't cover the entire length
+ */
+ // TODO: this scheme could get quite slow for doing this on many strips...
+ for (nls= track->strips.first; nls; nls= nls->next) {
+ /* check if strip overlaps (extends over or exactly on) the entire range of the strip we're validating */
+ if ((nls->start <= strip->start) && (nls->end >= strip->end)) {
+ *start= NULL;
+ *end= NULL;
+ return;
+ }
+
+ /* check if strip doesn't even occur anywhere near... */
+ if (nls->end < strip->start)
+ continue; /* skip checking this strip... not worthy of mention */
+ if (nls->start > strip->end)
+ return; /* the range we're after has already passed */
+
+ /* if this strip is not part of an island of continuous strips, it can be used
+ * - this check needs to be done for each end of the strip we try and use...
+ */
+ if ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) {
+ if ((nls->end > strip->start) && (nls->end < strip->end))
+ *start= &nls->end;
+ }
+ if ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) {
+ if ((nls->start < strip->end) && (nls->start > strip->start))
+ *end= &nls->start;
+ }
+ }
+}
+
+/* Determine auto-blending for the given strip */
+void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls)
+{
+ float *ps=NULL, *pe=NULL;
+ float *ns=NULL, *ne=NULL;
+
+ /* sanity checks */
+ if ELEM(NULL, nls, nlt)
+ return;
+ if ((nlt->prev == NULL) && (nlt->next == NULL))
+ return;
+ if ((nls->flag & NLASTRIP_FLAG_AUTO_BLENDS)==0)
+ return;
+
+ /* get test ranges */
+ if (nlt->prev)
+ nlastrip_get_endpoint_overlaps(nls, nlt->prev, &ps, &pe);
+ if (nlt->next)
+ nlastrip_get_endpoint_overlaps(nls, nlt->next, &ns, &ne);
+
+ /* set overlaps for this strip
+ * - don't use the values obtained though if the end in question
+ * is directly followed/preceeded by another strip, forming an
+ * 'island' of continuous strips
+ */
+ if ( (ps || ns) && ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) )
{
- free_actionstrip (strip);
- };
+ /* start overlaps - pick the largest overlap */
+ if ( ((ps && ns) && (*ps > *ns)) || (ps) )
+ nls->blendin= *ps - nls->start;
+ else
+ nls->blendin= *ns - nls->start;
+ }
+ else /* no overlap allowed/needed */
+ nls->blendin= 0.0f;
+
+ if ( (pe || ne) && ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) )
+ {
+ /* end overlaps - pick the largest overlap */
+ if ( ((pe && ne) && (*pe > *ne)) || (pe) )
+ nls->blendout= nls->end - *pe;
+ else
+ nls->blendout= nls->end - *ne;
+ }
+ else /* no overlap allowed/needed */
+ nls->blendout= 0.0f;
+}
- /* Free the whole list */
- BLI_freelistN(nlalist);
+/* Ensure that auto-blending and other settings are set correctly */
+void BKE_nla_validate_state (AnimData *adt)
+{
+ NlaStrip *strip, *fstrip=NULL;
+ NlaTrack *nlt;
+
+ /* sanity checks */
+ if ELEM(NULL, adt, adt->nla_tracks.first)
+ return;
+
+ /* adjust blending values for auto-blending, and also do an initial pass to find the earliest strip */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* auto-blending first */
+ BKE_nlastrip_validate_autoblends(nlt, strip);
+
+ /* extend mode - find first strip */
+ if ((fstrip == NULL) || (strip->start < fstrip->start))
+ fstrip= strip;
+ }
+ }
+
+ /* second pass over the strips to adjust the extend-mode to fix any problems */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* apart from 'nothing' option which user has to explicitly choose, we don't really know if
+ * we should be overwriting the extend setting (but assume that's what the user wanted)
+ */
+ // TODO: 1 solution is to tie this in with auto-blending...
+ if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
+ if (strip == fstrip)
+ strip->extendmode= NLASTRIP_EXTEND_HOLD;
+ else
+ strip->extendmode= NLASTRIP_EXTEND_HOLD_FORWARD;
+ }
+ }
+ }
}
+
+/* Core Tools ------------------------------------------- */
+
+/* For the given AnimData block, add the active action to the NLA
+ * stack (i.e. 'push-down' action). The UI should only allow this
+ * for normal editing only (i.e. not in editmode for some strip's action),
+ * so no checks for this are performed.
+ */
+// TODO: maybe we should have checks for this too...
+void BKE_nla_action_pushdown (AnimData *adt)
+{
+ NlaStrip *strip;
+
+ /* sanity checks */
+ // TODO: need to report the error for this
+ if ELEM(NULL, adt, adt->action)
+ return;
+
+ /* if the action is empty, we also shouldn't try to add to stack,
+ * as that will cause us grief down the track
+ */
+ // TODO: what about modifiers?
+ if (action_has_motion(adt->action) == 0) {
+ printf("BKE_nla_action_pushdown(): action has no data \n");
+ return;
+ }
+
+ /* add a new NLA strip to the track, which references the active action */
+ strip= add_nlastrip_to_stack(adt, adt->action);
+
+ /* 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--;
+ adt->action= NULL;
+
+ /* if the strip is the first one in the track it lives in, check if there
+ * are strips in any other tracks that may be before this, and set the extend
+ * mode accordingly
+ */
+ if (nlastrip_is_first(adt, strip) == 0) {
+ /* not first, so extend mode can only be NLASTRIP_EXTEND_HOLD_FORWARD not NLASTRIP_EXTEND_HOLD,
+ * so that it doesn't override strips in previous tracks
+ */
+ // FIXME: this needs to be more automated, since user can rearrange strips
+ strip->extendmode= NLASTRIP_EXTEND_HOLD_FORWARD;
+ }
+
+ /* make strip the active one... */
+ BKE_nlastrip_set_active(adt, strip);
+ }
+}
+
+
+/* Find the active strip + track combo, and set them up as the tweaking track,
+ * and return if successful or not.
+ */
+short BKE_nla_tweakmode_enter (AnimData *adt)
+{
+ NlaTrack *nlt, *activeTrack=NULL;
+ NlaStrip *strip, *activeStrip=NULL;
+
+ /* verify that data is valid */
+ if ELEM(NULL, adt, adt->nla_tracks.first)
+ return 0;
+
+ /* if block is already in tweakmode, just leave, but we should report
+ * that this block is in tweakmode (as our returncode)
+ */
+ if (adt->flag & ADT_NLA_EDIT_ON)
+ return 1;
+
+ /* go over the tracks, finding the active one, and its active strip
+ * - if we cannot find both, then there's nothing to do
+ */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ /* check if active */
+ if (nlt->flag & NLATRACK_ACTIVE) {
+ /* store reference to this active track */
+ activeTrack= nlt;
+
+ /* now try to find active strip */
+ activeStrip= BKE_nlastrip_find_active(nlt);
+ break;
+ }
+ }
+ if ELEM3(NULL, activeTrack, activeStrip, activeStrip->act) {
+ printf("NLA tweakmode enter - neither active requirement found \n");
+ return 0;
+ }
+
+ /* go over all the tracks up to the active one, tagging each strip that uses the same
+ * action as the active strip, but leaving everything else alone
+ */
+ for (nlt= activeTrack->prev; nlt; nlt= nlt->prev) {
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (strip->act == activeStrip->act)
+ strip->flag |= NLASTRIP_FLAG_TWEAKUSER;
+ else
+ strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER;
+ }
+ }
+
+
+ /* go over all the tracks after AND INCLUDING the active one, tagging them as being disabled
+ * - the active track needs to also be tagged, otherwise, it'll overlap with the tweaks going on
+ */
+ for (nlt= activeTrack; nlt; nlt= nlt->next)
+ nlt->flag |= NLATRACK_DISABLED;
+
+ /* handle AnimData level changes:
+ * - 'real' active action to temp storage (no need to change user-counts)
+ * - action of active strip set to be the 'active action', and have its usercount incremented
+ * - editing-flag for this AnimData block should also get turned on (for more efficient restoring)
+ * - take note of the active strip for mapping-correction of keyframes in the action being edited
+ */
+ adt->tmpact= adt->action;
+ adt->action= activeStrip->act;
+ adt->actstrip= activeStrip;
+ id_us_plus(&activeStrip->act->id);
+ adt->flag |= ADT_NLA_EDIT_ON;
+
+ /* done! */
+ return 1;
+}
+
+/* Exit tweakmode for this AnimData block */
+void BKE_nla_tweakmode_exit (AnimData *adt)
+{
+ NlaStrip *strip;
+ NlaTrack *nlt;
+
+ /* verify that data is valid */
+ if ELEM(NULL, adt, adt->nla_tracks.first)
+ return;
+
+ /* hopefully the flag is correct - skip if not on */
+ if ((adt->flag & ADT_NLA_EDIT_ON) == 0)
+ return;
+
+ // TODO: need to sync the user-strip with the new state of the action!
+
+ /* for all Tracks, clear the 'disabled' flag
+ * for all Strips, clear the 'tweak-user' flag
+ */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ nlt->flag &= ~NLATRACK_DISABLED;
+
+ for (strip= nlt->strips.first; strip; strip= strip->next)
+ strip->flag &= ~NLASTRIP_FLAG_TWEAKUSER;
+ }
+
+ /* handle AnimData level changes:
+ * - 'temporary' active action needs its usercount decreased, since we're removing this reference
+ * - 'real' active action is restored from storage
+ * - storage pointer gets cleared (to avoid having bad notes hanging around)
+ * - editing-flag for this AnimData block should also get turned off
+ * - clear pointer to active strip
+ */
+ if (adt->action) adt->action->id.us--;
+ adt->action= adt->tmpact;
+ adt->tmpact= NULL;
+ adt->actstrip= NULL;
+ adt->flag &= ~ADT_NLA_EDIT_ON;
+}
+
+/* *************************************************** */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 0f42ba0d2e2..90ea53d4364 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -950,9 +950,6 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
if(ntype->initfunc!=NULL)
ntype->initfunc(node);
- if(type==TEX_NODE_OUTPUT)
- ntreeTexAssignIndex(ntree, node);
-
nodeAddSockets(node, ntype);
return node;
@@ -1021,9 +1018,6 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
nnode->new_node= NULL;
nnode->preview= NULL;
- if(node->type==TEX_NODE_OUTPUT)
- ntreeTexAssignIndex(ntree, node);
-
return nnode;
}
@@ -2603,7 +2597,7 @@ void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
if(outsocket_exists(lnode->new_node, lsock->new_sock)) {
lsock->new_sock->ns.data= lsock->ns.data;
lsock->ns.data= NULL;
- lsock->new_sock= NULL;
+ lsock->new_sock= NULL;
}
}
}
@@ -2938,6 +2932,7 @@ static void registerCompositNodes(ListBase *ntypelist)
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);
@@ -2977,7 +2972,9 @@ static void registerCompositNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &cmp_node_premulkey);
nodeRegisterType(ntypelist, &cmp_node_diff_matte);
- nodeRegisterType(ntypelist, &cmp_node_chroma);
+ 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);
@@ -3112,3 +3109,29 @@ void free_nodesystem(void)
BLI_freelistN(&node_all_shaders);
BLI_freelistN(&node_all_textures);
}
+
+/* called from unlink_scene, when deleting a scene goes over all scenes
+ * other than the input, checks if they have render layer nodes referencing
+ * the to-be-deleted scene, and resets them to NULL. */
+
+/* XXX needs to get current scene then! */
+void clear_scene_in_nodes(Main *bmain, Scene *sce)
+{
+ Scene *sce1;
+ bNode *node;
+
+ for(sce1= bmain->scene.first; sce1; sce1=sce1->id.next) {
+ if(sce1!=sce) {
+ if(sce1->nodetree) {
+ for(node= sce1->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS) {
+ Scene *nodesce= (Scene *)node->id;
+
+ if (nodesce==sce) node->id = NULL;
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 81bd78f1851..c98e2d5970b 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -42,6 +42,7 @@
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
+#include "DNA_boid_types.h"
#include "DNA_camera_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
@@ -90,6 +91,7 @@
#include "BKE_constraint.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
+#include "BKE_fcurve.h"
#include "BKE_group.h"
#include "BKE_icons.h"
#include "BKE_key.h"
@@ -99,6 +101,7 @@
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_property.h"
@@ -220,6 +223,34 @@ void object_free_display(Object *ob)
freedisplist(&ob->disp);
}
+void free_sculptsession(SculptSession **ssp)
+{
+ if(ssp && *ssp) {
+ SculptSession *ss = *ssp;
+ if(ss->projverts)
+ MEM_freeN(ss->projverts);
+
+ if(ss->fmap)
+ MEM_freeN(ss->fmap);
+
+ if(ss->fmap_mem)
+ MEM_freeN(ss->fmap_mem);
+
+ if(ss->texcache)
+ MEM_freeN(ss->texcache);
+
+ if(ss->layer_disps)
+ MEM_freeN(ss->layer_disps);
+
+ if(ss->mesh_co_orig)
+ MEM_freeN(ss->mesh_co_orig);
+
+ MEM_freeN(ss);
+
+ *ssp = NULL;
+ }
+}
+
/* do not free object itself */
void free_object(Object *ob)
{
@@ -243,7 +274,9 @@ void free_object(Object *ob)
if(ob->mat[a]) ob->mat[a]->id.us--;
}
if(ob->mat) MEM_freeN(ob->mat);
+ if(ob->matbits) MEM_freeN(ob->matbits);
ob->mat= 0;
+ ob->matbits= 0;
if(ob->bb) MEM_freeN(ob->bb);
ob->bb= 0;
if(ob->path) free_path(ob->path);
@@ -251,6 +284,7 @@ void free_object(Object *ob)
if(ob->adt) BKE_free_animdata((ID *)ob);
if(ob->poselib) ob->poselib->id.us--;
if(ob->dup_group) ob->dup_group->id.us--;
+ if(ob->gpd) ob->gpd->id.us--;
if(ob->defbase.first)
BLI_freelistN(&ob->defbase);
if(ob->pose)
@@ -263,10 +297,6 @@ void free_object(Object *ob)
free_actuators(&ob->actuators);
free_constraints(&ob->constraints);
-
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&ob->scriptlink);
-#endif
if(ob->pd){
if(ob->pd->tex)
@@ -276,6 +306,10 @@ void free_object(Object *ob)
if(ob->soft) sbFree(ob->soft);
if(ob->bsoft) bsbFree(ob->bsoft);
if(ob->gpulamp.first) GPU_lamp_free(ob);
+
+ free_sculptsession(&ob->sculpt);
+
+ if(ob->pc_ids.first) BLI_freelistN(&ob->pc_ids);
}
static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
@@ -427,17 +461,16 @@ void unlink_object(Scene *scene, Object *ob)
if(obt->particlesystem.first) {
ParticleSystem *tpsys= obt->particlesystem.first;
for(; tpsys; tpsys=tpsys->next) {
- if(tpsys->keyed_ob==ob) {
- ParticleSystem *psys= BLI_findlink(&ob->particlesystem,tpsys->keyed_psys-1);
+ BoidState *state = NULL;
+ BoidRule *rule = NULL;
- if(psys && psys->keyed_ob) {
- tpsys->keyed_ob= psys->keyed_ob;
- tpsys->keyed_psys= psys->keyed_psys;
+ ParticleTarget *pt = tpsys->targets.first;
+ for(; pt; pt=pt->next) {
+ if(pt->ob==ob) {
+ pt->ob = NULL;
+ obt->recalc |= OB_RECALC_DATA;
+ break;
}
- else
- tpsys->keyed_ob= NULL;
-
- obt->recalc |= OB_RECALC_DATA;
}
if(tpsys->target_ob==ob) {
@@ -448,14 +481,30 @@ void unlink_object(Scene *scene, Object *ob)
if(tpsys->part->dup_ob==ob)
tpsys->part->dup_ob= NULL;
- if(tpsys->part->flag&PART_STICKY) {
+ if(tpsys->part->phystype==PART_PHYS_BOIDS) {
ParticleData *pa;
+ BoidParticle *bpa;
int p;
for(p=0,pa=tpsys->particles; p<tpsys->totpart; p++,pa++) {
- if(pa->stick_ob==ob) {
- pa->stick_ob= 0;
- pa->flag &= ~PARS_STICKY;
+ bpa = pa->boid;
+ if(bpa->ground == ob)
+ bpa->ground = NULL;
+ }
+ }
+ if(tpsys->part->boids) {
+ for(state = tpsys->part->boids->states.first; state; state=state->next) {
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ if(rule->type==eBoidRuleType_Avoid) {
+ BoidRuleGoalAvoid *gabr = (BoidRuleGoalAvoid*)rule;
+ if(gabr->ob==ob)
+ gabr->ob= NULL;
+ }
+ else if(rule->type==eBoidRuleType_FollowLeader) {
+ BoidRuleFollowLeader *flbr = (BoidRuleFollowLeader*)rule;
+ if(flbr->ob==ob)
+ flbr->ob= NULL;
+ }
}
}
}
@@ -627,10 +676,7 @@ Camera *copy_camera(Camera *cam)
camn= copy_libblock(cam);
camn->adt= BKE_copy_animdata(cam->adt);
-
-#ifndef DISABLE_PYTHON
- BPY_copy_scriptlink(&camn->scriptlink);
-#endif
+
return camn;
}
@@ -716,7 +762,7 @@ void *add_lamp(char *name)
la->r= la->g= la->b= la->k= 1.0f;
la->haint= la->energy= 1.0f;
- la->dist= 20.0f;
+ la->dist= 25.0f;
la->spotsize= 45.0f;
la->spotblend= 0.15f;
la->att2= 1.0f;
@@ -735,7 +781,7 @@ void *add_lamp(char *name)
la->ray_samp_method = LA_SAMP_HALTON;
la->adapt_thresh = 0.001f;
la->preview=NULL;
- la->falloff_type = LA_FALLOFF_INVLINEAR;
+ la->falloff_type = LA_FALLOFF_INVSQUARE;
la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f);
la->sun_effect_type = 0;
la->horizon_brightness = 1.0;
@@ -779,9 +825,7 @@ Lamp *copy_lamp(Lamp *la)
#endif // XXX old animation system
if (la->preview) lan->preview = BKE_previewimg_copy(la->preview);
-#ifndef DISABLE_PYTHON
- BPY_copy_scriptlink(&la->scriptlink);
-#endif
+
return lan;
}
@@ -839,9 +883,6 @@ void make_local_lamp(Lamp *la)
void free_camera(Camera *ca)
{
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&ca->scriptlink);
-#endif
BKE_free_animdata((ID *)ca);
}
@@ -850,11 +891,6 @@ void free_lamp(Lamp *la)
MTex *mtex;
int a;
- /* scriptlinks */
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&la->scriptlink);
-#endif
-
for(a=0; a<MAX_MTEX; a++) {
mtex= la->mtex[a];
if(mtex && mtex->tex) mtex->tex->id.us--;
@@ -945,7 +981,6 @@ Object *add_only_object(int type, char *name)
Mat4One(ob->parentinv);
Mat4One(ob->obmat);
ob->dt= OB_SHADED;
- if(U.flag & USER_MAT_ON_OB) ob->colbits= -1;
ob->empty_drawtype= OB_ARROWS;
ob->empty_drawsize= 1.0;
@@ -984,6 +1019,8 @@ Object *add_only_object(int type, char *name)
ob->fluidsimFlag = 0;
ob->fluidsimSettings = NULL;
+ ob->pc_ids.first = ob->pc_ids.last = NULL;
+
return ob;
}
@@ -1025,7 +1062,7 @@ SoftBody *copy_softbody(SoftBody *sb)
sbn->scratch= NULL;
- sbn->pointcache= BKE_ptcache_copy(sb->pointcache);
+ sbn->pointcache= BKE_ptcache_copy_list(&sbn->ptcaches, &sb->ptcaches);
return sbn;
}
@@ -1045,23 +1082,44 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys)
{
ParticleSystem *psysn;
ParticleData *pa;
- int a;
+ int p;
psysn= MEM_dupallocN(psys);
psysn->particles= MEM_dupallocN(psys->particles);
psysn->child= MEM_dupallocN(psys->child);
- for(a=0, pa=psysn->particles; a<psysn->totpart; a++, pa++) {
- if(pa->hair)
- pa->hair= MEM_dupallocN(pa->hair);
- if(pa->keys)
- pa->keys= MEM_dupallocN(pa->keys);
+ if(psys->part->type == PART_HAIR) {
+ for(p=0, pa=psysn->particles; p<psysn->totpart; p++, pa++)
+ pa->hair = MEM_dupallocN(pa->hair);
+ }
+
+ if(psysn->particles->keys || psysn->particles->boid) {
+ ParticleKey *key = psysn->particles->keys;
+ BoidParticle *boid = psysn->particles->boid;
+
+ if(key)
+ key = MEM_dupallocN(key);
+
+ if(boid)
+ boid = MEM_dupallocN(boid);
+
+ for(p=0, pa=psysn->particles; p<psysn->totpart; p++, pa++) {
+ if(boid)
+ pa->boid = boid++;
+ if(key) {
+ pa->keys = key;
+ key += pa->totkey;
+ }
+ }
}
- if(psys->soft) {
- psysn->soft= copy_softbody(psys->soft);
- psysn->soft->particles = psysn;
+ if(psys->clmd) {
+ ClothModifierData *nclmd = (ClothModifierData *)modifier_new(eModifierType_Cloth);
+ modifier_copyData((ModifierData*)psys->clmd, (ModifierData*)nclmd);
+ psys->hair_in_dm = psys->hair_out_dm = NULL;
}
+
+ BLI_duplicatelist(&psysn->targets, &psys->targets);
psysn->pathcache= NULL;
psysn->childcache= NULL;
@@ -1073,7 +1131,7 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys)
psysn->reactevents.first = psysn->reactevents.last = NULL;
psysn->renderdata = NULL;
- psysn->pointcache= BKE_ptcache_copy(psys->pointcache);
+ psysn->pointcache= BKE_ptcache_copy_list(&psysn->ptcaches, &psys->ptcaches);
id_us_plus((ID *)psysn->part);
@@ -1168,6 +1226,7 @@ Object *copy_object(Object *ob)
if(ob->totcol) {
obn->mat= MEM_dupallocN(ob->mat);
+ obn->matbits= MEM_dupallocN(ob->matbits);
}
if(ob->bb) obn->bb= MEM_dupallocN(ob->bb);
@@ -1181,9 +1240,7 @@ Object *copy_object(Object *ob)
modifier_copyData(md, nmd);
BLI_addtail(&obn->modifiers, nmd);
}
-#ifndef DISABLE_PYTHON
- BPY_copy_scriptlink(&ob->scriptlink);
-#endif
+
obn->prop.first = obn->prop.last = NULL;
copy_properties(&obn->prop, &ob->prop);
@@ -1198,18 +1255,15 @@ Object *copy_object(Object *ob)
armature_rebuild_pose(obn, obn->data);
}
copy_defgroups(&obn->defbase, &ob->defbase);
-#if 0 // XXX old animation system
- copy_nlastrips(&obn->nlastrips, &ob->nlastrips);
-#endif // XXX old animation system
copy_constraints(&obn->constraints, &ob->constraints);
+ obn->mode = 0;
+ obn->sculpt = NULL;
+
/* increase user numbers */
id_us_plus((ID *)obn->data);
-#if 0 // XXX old animation system
- id_us_plus((ID *)obn->ipo);
- id_us_plus((ID *)obn->action);
-#endif // XXX old animation system
id_us_plus((ID *)obn->dup_group);
+ // FIXME: add this for animdata too...
for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
@@ -1229,7 +1283,8 @@ Object *copy_object(Object *ob)
obn->derivedFinal = NULL;
obn->gpulamp.first = obn->gpulamp.last = NULL;
-
+ obn->pc_ids.first = obn->pc_ids.last = NULL;
+
return obn;
}
@@ -1325,7 +1380,18 @@ void make_local_object(Object *ob)
expand_local_object(ob);
}
-/* returns true if the Object data is a from an external blend file (libdata) */
+/*
+ * Returns true if the Object is a from an external blend file (libdata)
+ */
+int object_is_libdata(Object *ob)
+{
+ if (!ob) return 0;
+ if (ob->proxy) return 0;
+ if (ob->id.lib) return 1;
+ return 0;
+}
+
+/* Returns true if the Object data is a from an external blend file (libdata) */
int object_data_is_libdata(Object *ob)
{
if(!ob) return 0;
@@ -1340,7 +1406,7 @@ int object_data_is_libdata(Object *ob)
/* *************** PROXY **************** */
/* when you make proxy, ensure the exposed layers are extern */
-void armature_set_id_extern(Object *ob)
+static void armature_set_id_extern(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -1387,11 +1453,32 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->parent= target->parent; /* libdata */
Mat4CpyMat4(ob->parentinv, target->parentinv);
-#if 0 // XXX old animation system
- ob->ipo= target->ipo; /* libdata */
-#endif // XXX old animation system
- /* skip constraints, constraintchannels, nla? */
+ /* copy animdata stuff - drivers only for now... */
+ if ((target->adt) && (target->adt->drivers.first)) {
+ FCurve *fcu;
+
+ /* add new animdata block */
+ ob->adt= BKE_id_add_animdata(&ob->id);
+
+ /* make a copy of all the drivers (for now), then correct any links that need fixing */
+ copy_fcurves(&ob->adt->drivers, &target->adt->drivers);
+
+ for (fcu= ob->adt->drivers.first; fcu; fcu= fcu->next) {
+ ChannelDriver *driver= fcu->driver;
+ DriverTarget *dtar;
+
+ for (dtar= driver->targets.first; dtar; dtar= dtar->next) {
+ if ((Object *)dtar->id == target)
+ dtar->id= (ID *)ob;
+ else
+ id_lib_extern((ID *)dtar->id);
+ }
+ }
+ }
+
+ /* skip constraints? */
+ // FIXME: this is considered by many as a bug
/* set object type and link to data */
ob->type= target->type;
@@ -1401,7 +1488,9 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
/* copy material and index information */
ob->actcol= ob->totcol= 0;
if(ob->mat) MEM_freeN(ob->mat);
+ if(ob->matbits) MEM_freeN(ob->matbits);
ob->mat = NULL;
+ ob->matbits= NULL;
if ((target->totcol) && (target->mat) && ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) { //XXX OB_SUPPORT_MATERIAL
int i;
ob->colbits = target->colbits;
@@ -1410,6 +1499,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->totcol= target->totcol;
ob->mat = MEM_dupallocN(target->mat);
+ ob->matbits = MEM_dupallocN(target->matbits);
for(i=0; i<target->totcol; i++) {
/* dont need to run test_object_materials since we know this object is new and not used elsewhere */
id_us_plus((ID *)ob->mat[i]);
@@ -1424,6 +1514,9 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
armature_set_id_extern(ob);
}
+
+ /* copy drawtype info */
+ ob->dt= target->dt;
}
@@ -1460,13 +1553,11 @@ float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
cfra+= bluroffs+fieldoffs;
/* global time */
- cfra*= scene->r.framelen;
+ if (scene)
+ cfra*= scene->r.framelen;
#if 0 // XXX old animation system
if (ob) {
- if (no_speed_curve==0 && ob->ipo)
- cfra= calc_ipo_time(ob->ipo, cfra);
-
/* ofset frames */
if ((ob->ipoflag & OB_OFFS_PARENT) && (ob->partype & PARSLOW)==0)
cfra-= give_timeoffset(ob);
@@ -1481,29 +1572,22 @@ float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
void object_scale_to_mat3(Object *ob, float mat[][3])
{
float vec[3];
- if(ob->ipo) {
- vec[0]= ob->size[0]+ob->dsize[0];
- vec[1]= ob->size[1]+ob->dsize[1];
- vec[2]= ob->size[2]+ob->dsize[2];
- SizeToMat3(vec, mat);
- }
- else {
- SizeToMat3(ob->size, mat);
- }
+
+ vec[0]= ob->size[0]+ob->dsize[0];
+ vec[1]= ob->size[1]+ob->dsize[1];
+ vec[2]= ob->size[2]+ob->dsize[2];
+ SizeToMat3(vec, mat);
}
+// TODO: this should take rotation orders into account later...
void object_rot_to_mat3(Object *ob, float mat[][3])
{
float vec[3];
- if(ob->ipo) {
- vec[0]= ob->rot[0]+ob->drot[0];
- vec[1]= ob->rot[1]+ob->drot[1];
- vec[2]= ob->rot[2]+ob->drot[2];
- EulToMat3(vec, mat);
- }
- else {
- EulToMat3(ob->rot, mat);
- }
+
+ vec[0]= ob->rot[0]+ob->drot[0];
+ vec[1]= ob->rot[1]+ob->drot[1];
+ vec[2]= ob->rot[2]+ob->drot[2];
+ EulToMat3(vec, mat);
}
void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
@@ -1518,13 +1602,8 @@ void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
/* rot */
/* Quats arnt used yet */
/*if(ob->transflag & OB_QUAT) {
- if(ob->ipo) {
- QuatMul(q1, ob->quat, ob->dquat);
- QuatToMat3(q1, rmat);
- }
- else {
- QuatToMat3(ob->quat, rmat);
- }
+ QuatMul(q1, ob->quat, ob->dquat);
+ QuatToMat3(q1, rmat);
}
else {*/
object_rot_to_mat3(ob, rmat);
@@ -1540,12 +1619,9 @@ void object_to_mat4(Object *ob, float mat[][4])
Mat4CpyMat3(mat, tmat);
- VECCOPY(mat[3], ob->loc);
- if(ob->ipo) {
- mat[3][0]+= ob->dloc[0];
- mat[3][1]+= ob->dloc[1];
- mat[3][2]+= ob->dloc[2];
- }
+ mat[3][0]= ob->loc[0] + ob->dloc[0];
+ mat[3][1]= ob->loc[1] + ob->dloc[1];
+ mat[3][2]= ob->loc[2] + ob->dloc[2];
}
int enable_cu_speed= 1;
@@ -1553,7 +1629,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], x1, ctime;
+ float q[4], vec[4], dir[3], quat[4], radius, x1, ctime;
float timeoffs = 0.0, sf_orig = 0.0;
Mat4One(mat);
@@ -1575,14 +1651,14 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
}
/* catch exceptions: curve paths used as a duplicator */
else if(enable_cu_speed) {
- ctime= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0);
-
-#if 0 // XXX old animation system
- if(calc_ipo_spec(cu->ipo, CU_SPEED, &ctime)==0) {
- ctime /= cu->pathlen;
- CLAMP(ctime, 0.0, 1.0);
- }
-#endif // XXX old animation system
+ /* ctime is now a proper var setting of Curve which gets set by Animato like any other var that's animated,
+ * but this will only work if it actually is animated...
+ *
+ * we firstly calculate the modulus of cu->ctime/cu->pathlen to clamp ctime within the 0.0 to 1.0 times pathlen
+ * range, then divide this (the modulus) by pathlen to get a value between 0.0 and 1.0
+ */
+ ctime= fmod(cu->ctime, cu->pathlen) / cu->pathlen;
+ CLAMP(ctime, 0.0, 1.0);
}
else {
ctime= scene->r.cfra - give_timeoffset(ob);
@@ -1601,7 +1677,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
/* vec: 4 items! */
- if( where_on_path(par, ctime, vec, dir) ) {
+ if( where_on_path(par, ctime, vec, dir, NULL, &radius) ) {
if(cu->flag & CU_FOLLOW) {
vectoquat(dir, ob->trackflag, ob->upflag, quat);
@@ -1618,6 +1694,13 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
QuatToMat4(quat, mat);
}
+ if(cu->flag & CU_PATH_RADIUS) {
+ float tmat[4][4], rmat[4][4];
+ Mat4Scale(tmat, radius);
+ Mat4MulMat4(rmat, mat, tmat);
+ Mat4CpyMat4(mat, rmat);
+ }
+
VECCOPY(mat[3], vec);
}
@@ -1715,7 +1798,7 @@ static void give_parvert(Object *par, int nr, float *vec)
count= 0;
while(nu && !found) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -1806,26 +1889,6 @@ void set_no_parent_ipo(int val)
no_parent_ipo= val;
}
-static int during_script_flag=0;
-void disable_where_script(short on)
-{
- during_script_flag= on;
-}
-
-int during_script(void) {
- return during_script_flag;
-}
-
-static int during_scriptlink_flag=0;
-void disable_where_scriptlink(short on)
-{
- during_scriptlink_flag= on;
-}
-
-int during_scriptlink(void) {
- return during_scriptlink_flag;
-}
-
void where_is_object_time(Scene *scene, Object *ob, float ctime)
{
float *fp1, *fp2, slowmat[4][4] = MAT4_UNITY;
@@ -1925,11 +1988,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
constraints_clear_evalob(cob);
}
-#ifndef DISABLE_PYTHON
- if(ob->scriptlink.totscript && !during_script()) {
- if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_REDRAW);
- }
-#endif
/* set negative scale flag in object */
Crossf(vec, ob->obmat[0], ob->obmat[1]);
@@ -2301,9 +2359,6 @@ void object_handle_update(Scene *scene, Object *ob)
}
else
where_is_object(scene, ob);
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBJECTUPDATE);
-#endif
}
if(ob->recalc & OB_RECALC_DATA) {
@@ -2357,10 +2412,17 @@ void object_handle_update(Scene *scene, Object *ob)
if(ob->particlesystem.first) {
ParticleSystem *tpsys, *psys;
DerivedMesh *dm;
+ ob->transflag &= ~OB_DUPLIPARTS;
psys= ob->particlesystem.first;
while(psys) {
if(psys_check_enabled(ob, psys)) {
+ /* check use of dupli objects here */
+ if(psys->part && psys->part->draw_as == PART_DRAW_REND &&
+ ((psys->part->ren_as == PART_DRAW_OB && psys->part->dup_ob)
+ || (psys->part->ren_as == PART_DRAW_GR && psys->part->dup_group)))
+ ob->transflag |= OB_DUPLIPARTS;
+
particle_system_update(scene, ob, psys);
psys= psys->next;
}
@@ -2385,9 +2447,6 @@ void object_handle_update(Scene *scene, Object *ob)
psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated;
}
}
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBDATAUPDATE);
-#endif
}
/* the no-group proxy case, we call update */
@@ -2482,3 +2541,61 @@ int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3
return result;
}
+
+static int pc_cmp(void *a, void *b)
+{
+ LinkData *ad = a, *bd = b;
+ if(GET_INT_FROM_POINTER(ad->data) > GET_INT_FROM_POINTER(bd->data))
+ return 1;
+ else return 0;
+}
+
+int object_insert_ptcache(Object *ob)
+{
+ LinkData *link = NULL;
+ int i = 0;
+
+ BLI_sortlist(&ob->pc_ids, pc_cmp);
+
+ for(link=ob->pc_ids.first, i = 0; link; link=link->next, i++)
+ {
+ int index = GET_INT_FROM_POINTER(link->data);
+
+ if(i < index)
+ break;
+ }
+
+ link = MEM_callocN(sizeof(LinkData), "PCLink");
+ link->data = SET_INT_IN_POINTER(i);
+ BLI_addtail(&ob->pc_ids, link);
+
+ return i;
+}
+
+#if 0
+static int pc_findindex(ListBase *listbase, int index)
+{
+ LinkData *link= NULL;
+ int number= 0;
+
+ if (listbase == NULL) return -1;
+
+ link= listbase->first;
+ while (link) {
+ if ((int)link->data == index)
+ return number;
+
+ number++;
+ link= link->next;
+ }
+
+ return -1;
+}
+
+void object_delete_ptcache(Object *ob, int index)
+{
+ int list_index = pc_findindex(&ob->pc_ids, index);
+ LinkData *link = BLI_findlink(&ob->pc_ids, list_index);
+ BLI_freelinkN(&ob->pc_ids, link);
+}
+#endif
diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c
index 22e4e8a8309..0de97b9c703 100644
--- a/source/blender/blenkernel/intern/packedFile.c
+++ b/source/blender/blenkernel/intern/packedFile.c
@@ -61,8 +61,17 @@
#include "BKE_image.h"
#include "BKE_font.h"
#include "BKE_packedFile.h"
+#include "BKE_report.h"
-int seekPackedFile(PackedFile * pf, int offset, int whence)
+#ifdef _WIN32
+#define open _open
+#define close _close
+#define read _read
+#define write _write
+#endif
+
+
+int seekPackedFile(PackedFile *pf, int offset, int whence)
{
int oldseek = -1, seek = 0;
@@ -92,12 +101,12 @@ int seekPackedFile(PackedFile * pf, int offset, int whence)
return(oldseek);
}
-void rewindPackedFile(PackedFile * pf)
+void rewindPackedFile(PackedFile *pf)
{
seekPackedFile(pf, 0, SEEK_SET);
}
-int readPackedFile(PackedFile * pf, void * data, int size)
+int readPackedFile(PackedFile *pf, void *data, int size)
{
if ((pf != NULL) && (size >= 0) && (data != NULL)) {
if (size + pf->seek > pf->size) {
@@ -118,66 +127,54 @@ int readPackedFile(PackedFile * pf, void * data, int size)
return(size);
}
-int countPackedFiles()
+int countPackedFiles(Main *bmain)
{
- int count = 0;
Image *ima;
VFont *vf;
- bSample *sample;
+ bSound *sound;
+ int count = 0;
// let's check if there are packed files...
- ima = G.main->image.first;
- while (ima) {
- if (ima->packedfile) {
+ for(ima=bmain->image.first; ima; ima=ima->id.next)
+ if(ima->packedfile)
count++;
- }
- ima= ima->id.next;
- }
- vf = G.main->vfont.first;
- while (vf) {
- if (vf->packedfile) {
+ for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+ if(vf->packedfile)
count++;
- }
- vf = vf->id.next;
- }
- sample = samples->first;
- while (sample) {
- if (sample->packedfile) {
+ for(sound=bmain->sound.first; sound; sound=sound->id.next)
+ if(sound->packedfile)
count++;
- }
- sample = sample->id.next;
- }
- return(count);
+ return count;
}
-void freePackedFile(PackedFile * pf)
+void freePackedFile(PackedFile *pf)
{
- if (pf) {
+ if(pf) {
MEM_freeN(pf->data);
MEM_freeN(pf);
- } else {
- printf("freePackedFile: Trying to free a NULL pointer\n");
}
+ else
+ printf("freePackedFile: Trying to free a NULL pointer\n");
}
-PackedFile * newPackedFileMemory(void *mem, int memlen)
+PackedFile *newPackedFileMemory(void *mem, int memlen)
{
- PackedFile * pf = MEM_callocN(sizeof(*pf), "PackedFile");
+ PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
pf->data = mem;
pf->size = memlen;
return pf;
}
-PackedFile * newPackedFile(char * filename)
+PackedFile *newPackedFile(ReportList *reports, char *filename)
{
- PackedFile * pf = NULL;
+ PackedFile *pf = NULL;
int file, filelen;
char name[FILE_MAXDIR+FILE_MAXFILE];
- void * data;
+ void *data;
//XXX waitcursor(1);
@@ -191,7 +188,7 @@ PackedFile * newPackedFile(char * filename)
file= open(name, O_BINARY|O_RDONLY);
if (file <= 0) {
- // error("Can't open file: %s", name);
+ BKE_reportf(reports, RPT_ERROR, "Can't open file: %s", name);
} else {
filelen = BLI_filesize(file);
@@ -214,36 +211,23 @@ PackedFile * newPackedFile(char * filename)
return (pf);
}
-void packAll()
+void packAll(Main *bmain, ReportList *reports)
{
Image *ima;
VFont *vf;
- bSample *sample;
-
- ima = G.main->image.first;
- while (ima) {
- if (ima->packedfile == NULL) {
- ima->packedfile = newPackedFile(ima->name);
- }
- ima= ima->id.next;
- }
-
- vf = G.main->vfont.first;
- while (vf) {
- if (vf->packedfile == NULL) {
- vf->packedfile = newPackedFile(vf->name);
- }
- vf = vf->id.next;
- }
+ bSound *sound;
+ for(ima=bmain->image.first; ima; ima=ima->id.next)
+ if(ima->packedfile == NULL)
+ ima->packedfile = newPackedFile(reports, ima->name);
- sample = samples->first;
- while (sample) {
- if (sample->packedfile == NULL) {
- sound_set_packedfile(sample, newPackedFile(sample->name));
- }
- sample = sample->id.next;
- }
+ for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+ if(vf->packedfile == NULL)
+ vf->packedfile = newPackedFile(reports, vf->name);
+
+ for(sound=bmain->sound.first; sound; sound=sound->id.next)
+ if(sound->packedfile == NULL)
+ sound->packedfile = newPackedFile(reports, sound->name);
}
@@ -252,10 +236,10 @@ void packAll()
// attempt to create a function that generates an unique filename
// this will work when all funtions in fileops.c understand relative filenames...
-char * find_new_name(char * name)
+static char *find_new_name(char *name)
{
char tempname[FILE_MAXDIR + FILE_MAXFILE];
- char * newname;
+ char *newname;
if (fop_exists(name)) {
for (number = 1; number <= 999; number++) {
@@ -274,13 +258,13 @@ char * find_new_name(char * name)
*/
-int writePackedFile(char * filename, PackedFile *pf, int guimode)
+int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int guimode)
{
int file, number, remove_tmp = FALSE;
int ret_value = RET_OK;
char name[FILE_MAXDIR + FILE_MAXFILE];
char tempname[FILE_MAXDIR + FILE_MAXFILE];
-/* void * data; */
+/* void *data; */
if (guimode); //XXX waitcursor(1);
@@ -305,23 +289,23 @@ int writePackedFile(char * filename, PackedFile *pf, int guimode)
file = open(name, O_BINARY + O_WRONLY + O_CREAT + O_TRUNC, 0666);
if (file >= 0) {
if (write(file, pf->data, pf->size) != pf->size) {
- if(guimode) ; //XXX error("Error writing file: %s", name);
+ BKE_reportf(reports, RPT_ERROR, "Error writing file: %s", name);
ret_value = RET_ERROR;
}
close(file);
} else {
- if(guimode); //XXX error("Error creating file: %s", name);
+ BKE_reportf(reports, RPT_ERROR, "Error creating file: %s", name);
ret_value = RET_ERROR;
}
if (remove_tmp) {
if (ret_value == RET_ERROR) {
if (BLI_rename(tempname, name) != 0) {
- if(guimode); //XXX error("Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
+ BKE_reportf(reports, RPT_ERROR, "Error restoring tempfile. Check files: '%s' '%s'", tempname, name);
}
} else {
if (BLI_delete(tempname, 0, 0) != 0) {
- if(guimode); //XXX error("Error deleting '%s' (ignored)");
+ BKE_reportf(reports, RPT_ERROR, "Error deleting '%s' (ignored)", tempname);
}
}
}
@@ -342,7 +326,7 @@ PF_NOFILE - the original file doens't exist
*/
-int checkPackedFile(char * filename, PackedFile * pf)
+int checkPackedFile(char *filename, PackedFile *pf)
{
struct stat st;
int ret_val, i, len, file;
@@ -382,6 +366,8 @@ int checkPackedFile(char * filename, PackedFile * pf)
}
}
}
+
+ close(file);
}
}
@@ -390,68 +376,21 @@ int checkPackedFile(char * filename, PackedFile * pf)
/*
-unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
-If how == PF_ASK it offers the user a couple of options what to do with the packed file.
+ unpackFile() looks at the existing files (abs_name, local_name) and a packed file.
-It returns a char * to the existing file name / new file name or NULL when
+It returns a char *to the existing file name / new file name or NULL when
there was an error or when the user desides to cancel the operation.
*/
-char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
+char *unpackFile(ReportList *reports, char *abs_name, char *local_name, PackedFile *pf, int how)
{
- char menu[6 * (FILE_MAXDIR + FILE_MAXFILE + 100)];
- char line[FILE_MAXDIR + FILE_MAXFILE + 100];
- char * newname = NULL, * temp = NULL;
+ char *newname = NULL, *temp = NULL;
// char newabs[FILE_MAXDIR + FILE_MAXFILE];
// char newlocal[FILE_MAXDIR + FILE_MAXFILE];
if (pf != NULL) {
- if (how == PF_ASK) {
- sprintf(menu, "UnPack file%%t|Remove Pack %%x%d", PF_REMOVE);
-
- if (strcmp(abs_name, local_name)) {
- switch (checkPackedFile(local_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "|Create %s%%x%d", local_name, PF_WRITE_LOCAL);
- strcat(menu, line);
- break;
- case PF_EQUAL:
- sprintf(line, "|Use %s (identical)%%x%d", local_name, PF_USE_LOCAL);
- strcat(menu, line);
- break;
- case PF_DIFFERS:
- sprintf(line, "|Use %s (differs)%%x%d", local_name, PF_USE_LOCAL);
- strcat(menu, line);
- sprintf(line, "|Overwrite %s%%x%d", local_name, PF_WRITE_LOCAL);
- strcat(menu, line);
- break;
- }
- // sprintf(line, "|%%x%d", PF_INVALID);
- // strcat(menu, line);
- }
-
- switch (checkPackedFile(abs_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "|Create %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
- strcat(menu, line);
- break;
- case PF_EQUAL:
- sprintf(line, "|Use %s (identical)%%x%d", abs_name, PF_USE_ORIGINAL);
- strcat(menu, line);
- break;
- case PF_DIFFERS:
- sprintf(line, "|Use %s (differs)%%x%d", abs_name, PF_USE_ORIGINAL);
- strcat(menu, line);
- sprintf(line, "|Overwrite %s%%x%d", abs_name, PF_WRITE_ORIGINAL);
- strcat(menu, line);
- break;
- }
-
- //XXX how = pupmenu(menu);
- }
-
switch (how) {
case -1:
case PF_KEEP:
@@ -467,7 +406,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
}
// else fall through and create it
case PF_WRITE_LOCAL:
- if (writePackedFile(local_name, pf, 1) == RET_OK) {
+ if (writePackedFile(reports, local_name, pf, 1) == RET_OK) {
temp = local_name;
}
break;
@@ -479,7 +418,7 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
}
// else fall through and create it
case PF_WRITE_ORIGINAL:
- if (writePackedFile(abs_name, pf, 1) == RET_OK) {
+ if (writePackedFile(reports, abs_name, pf, 1) == RET_OK) {
temp = abs_name;
}
break;
@@ -498,10 +437,10 @@ char *unpackFile(char * abs_name, char * local_name, PackedFile * pf, int how)
}
-int unpackVFont(VFont * vfont, int how)
+int unpackVFont(ReportList *reports, VFont *vfont, int how)
{
char localname[FILE_MAXDIR + FILE_MAXFILE], fi[FILE_MAXFILE];
- char * newname;
+ char *newname;
int ret_value = RET_ERROR;
if (vfont != NULL) {
@@ -510,7 +449,7 @@ int unpackVFont(VFont * vfont, int how)
sprintf(localname, "//fonts/%s", fi);
- newname = unpackFile(vfont->name, localname, vfont->packedfile, how);
+ newname = unpackFile(reports, vfont->name, localname, vfont->packedfile, how);
if (newname != NULL) {
ret_value = RET_OK;
freePackedFile(vfont->packedfile);
@@ -523,28 +462,26 @@ int unpackVFont(VFont * vfont, int how)
return (ret_value);
}
-int unpackSample(bSample *sample, int how)
+int unpackSound(ReportList *reports, bSound *sound, int how)
{
char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
- char * newname;
+ char *newname;
int ret_value = RET_ERROR;
- PackedFile *pf;
-
- if (sample != NULL) {
- strcpy(localname, sample->name);
+
+ if (sound != NULL) {
+ strcpy(localname, sound->name);
BLI_splitdirstring(localname, fi);
- sprintf(localname, "//samples/%s", fi);
-
- newname = unpackFile(sample->name, localname, sample->packedfile, how);
+ sprintf(localname, "//sounds/%s", fi);
+
+ newname = unpackFile(reports, sound->name, localname, sound->packedfile, how);
if (newname != NULL) {
- strcpy(sample->name, newname);
+ strcpy(sound->name, newname);
MEM_freeN(newname);
- pf = sample->packedfile;
- // because samples and sounds can point to the
- // same packedfile we have to check them all
- sound_set_packedfile(sample, NULL);
- freePackedFile(pf);
+ freePackedFile(sound->packedfile);
+ sound->packedfile = 0;
+
+ sound_load(NULL, sound);
ret_value = RET_OK;
}
@@ -553,10 +490,10 @@ int unpackSample(bSample *sample, int how)
return(ret_value);
}
-int unpackImage(Image * ima, int how)
+int unpackImage(ReportList *reports, Image *ima, int how)
{
char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
- char * newname;
+ char *newname;
int ret_value = RET_ERROR;
if (ima != NULL) {
@@ -564,7 +501,7 @@ int unpackImage(Image * ima, int how)
BLI_splitdirstring(localname, fi);
sprintf(localname, "//textures/%s", fi);
- newname = unpackFile(ima->name, localname, ima->packedfile, how);
+ newname = unpackFile(reports, ima->name, localname, ima->packedfile, how);
if (newname != NULL) {
ret_value = RET_OK;
freePackedFile(ima->packedfile);
@@ -578,33 +515,22 @@ int unpackImage(Image * ima, int how)
return(ret_value);
}
-void unpackAll(int how)
+void unpackAll(Main *bmain, ReportList *reports, int how)
{
Image *ima;
VFont *vf;
- bSample *sample;
-
- ima = G.main->image.first;
- while (ima) {
- if (ima->packedfile) {
- unpackImage(ima, how);
- }
- ima= ima->id.next;
- }
-
- vf = G.main->vfont.first;
- while (vf) {
- if (vf->packedfile) {
- unpackVFont(vf, how);
- }
- vf = vf->id.next;
- }
+ bSound *sound;
- sample = samples->first;
- while (sample) {
- if (sample->packedfile) {
- unpackSample(sample, how);
- }
- sample = sample->id.next;
- }
+ for(ima=bmain->image.first; ima; ima=ima->id.next)
+ if(ima->packedfile)
+ unpackImage(reports, ima, how);
+
+ for(vf=bmain->vfont.first; vf; vf=vf->id.next)
+ if(vf->packedfile)
+ unpackVFont(reports, vf, how);
+
+ for(sound=bmain->sound.first; sound; sound=sound->id.next)
+ if(sound->packedfile)
+ unpackSound(reports, sound, how);
}
+
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
new file mode 100644
index 00000000000..f17d2fbdcac
--- /dev/null
+++ b/source/blender/blenkernel/intern/paint.c
@@ -0,0 +1,194 @@
+/*
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_brush_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_brush.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_paint.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+const char PAINT_CURSOR_SCULPT[3] = {255, 100, 100};
+const char PAINT_CURSOR_VERTEX_PAINT[3] = {255, 255, 255};
+const char PAINT_CURSOR_WEIGHT_PAINT[3] = {200, 200, 255};
+const char PAINT_CURSOR_TEXTURE_PAINT[3] = {255, 255, 255};
+
+Paint *paint_get_active(Scene *sce)
+{
+ if(sce) {
+ ToolSettings *ts = sce->toolsettings;
+
+ if(sce->basact && sce->basact->object) {
+ switch(sce->basact->object->mode) {
+ case OB_MODE_SCULPT:
+ return &ts->sculpt->paint;
+ case OB_MODE_VERTEX_PAINT:
+ return &ts->vpaint->paint;
+ case OB_MODE_WEIGHT_PAINT:
+ return &ts->wpaint->paint;
+ case OB_MODE_TEXTURE_PAINT:
+ return &ts->imapaint.paint;
+ }
+ }
+
+ /* default to image paint */
+ return &ts->imapaint.paint;
+ }
+
+ return NULL;
+}
+
+Brush *paint_brush(Paint *p)
+{
+ return p && p->brushes ? p->brushes[p->active_brush_index] : NULL;
+}
+
+void paint_brush_set(Paint *p, Brush *br)
+{
+ if(p && !br) {
+ /* Setting to NULL removes the current slot */
+ paint_brush_slot_remove(p);
+ }
+ else if(p) {
+ int found = 0;
+
+ if(p->brushes) {
+ int i;
+
+ /* See if there's already a slot with the brush */
+ for(i = 0; i < p->brush_count; ++i) {
+ if(p->brushes[i] == br) {
+ p->active_brush_index = i;
+ found = 1;
+ break;
+ }
+ }
+
+ }
+
+ if(!found) {
+ paint_brush_slot_add(p);
+ id_us_plus(&br->id);
+ }
+
+ /* Make sure the current slot is the new brush */
+ p->brushes[p->active_brush_index] = br;
+ }
+}
+
+static void paint_brush_slots_alloc(Paint *p, const int count)
+{
+ p->brush_count = count;
+ if(count == 0)
+ p->brushes = NULL;
+ else
+ p->brushes = MEM_callocN(sizeof(Brush*) * count, "Brush slots");
+}
+
+void paint_brush_slot_add(Paint *p)
+{
+ if(p) {
+ Brush **orig = p->brushes;
+ int orig_count = p->brushes ? p->brush_count : 0;
+
+ /* Increase size of brush slot array */
+ paint_brush_slots_alloc(p, orig_count + 1);
+ if(orig) {
+ memcpy(p->brushes, orig, sizeof(Brush*) * orig_count);
+ MEM_freeN(orig);
+ }
+
+ p->active_brush_index = orig_count;
+ }
+}
+
+void paint_brush_slot_remove(Paint *p)
+{
+ if(p && p->brushes) {
+ Brush **orig = p->brushes;
+ int src, dst;
+
+ /* Decrease size of brush slot array */
+ paint_brush_slots_alloc(p, p->brush_count - 1);
+ if(p->brushes) {
+ for(src = 0, dst = 0; dst < p->brush_count; ++src) {
+ if(src != p->active_brush_index) {
+ p->brushes[dst] = orig[src];
+ ++dst;
+ }
+ }
+ }
+ MEM_freeN(orig);
+
+ if(p->active_brush_index >= p->brush_count)
+ p->active_brush_index = p->brush_count - 1;
+ if(p->active_brush_index < 0)
+ p->active_brush_index = 0;
+ }
+}
+
+int paint_facesel_test(Object *ob)
+{
+ return (G.f&G_FACESELECT) && (ob && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)));
+
+}
+
+void paint_init(Paint *p, const char col[3])
+{
+ Brush *brush;
+
+ /* If there's no brush, create one */
+ brush = paint_brush(p);
+ brush_check_exists(&brush, "Brush");
+ paint_brush_set(p, brush);
+
+ memcpy(p->paint_cursor_col, col, 3);
+ p->paint_cursor_col[3] = 128;
+}
+
+void free_paint(Paint *paint)
+{
+ if(paint->brushes)
+ MEM_freeN(paint->brushes);
+}
+
+void copy_paint(Paint *orig, Paint *new)
+{
+ if(orig->brushes) {
+ int i;
+ new->brushes = MEM_dupallocN(orig->brushes);
+ for(i = 0; i < orig->brush_count; ++i)
+ id_us_plus((ID *)new->brushes[i]);
+ }
+}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 5b3720cd6b0..e18e7f54e49 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
+#include "DNA_boid_types.h"
#include "DNA_particle_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -58,6 +59,8 @@
#include "BKE_anim.h"
+#include "BKE_boids.h"
+#include "BKE_cloth.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_lattice.h"
@@ -66,7 +69,7 @@
#include "BKE_particle.h"
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
-#include "BKE_softbody.h"
+#include "BKE_cloth.h"
#include "BKE_material.h"
#include "BKE_key.h"
#include "BKE_library.h"
@@ -78,79 +81,41 @@
#include "RE_render_ext.h"
-static void key_from_object(Object *ob, ParticleKey *key);
static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index,
float *fuv, float *orco, ParticleTexture *ptex, int event);
+static void get_child_modifier_parameters(ParticleSettings *part, ParticleThreadContext *ctx,
+ ChildParticle *cpa, short cpa_from, int cpa_num, float *cpa_fuv, float *orco, ParticleTexture *ptex);
+static void do_child_modifiers(ParticleSimulationData *sim,
+ ParticleTexture *ptex, ParticleKey *par, float *par_rot, ChildParticle *cpa,
+ float *orco, float mat[4][4], ParticleKey *state, float t);
/* few helpers for countall etc. */
int count_particles(ParticleSystem *psys){
ParticleSettings *part=psys->part;
- ParticleData *pa;
- int tot=0,p;
+ PARTICLE_P;
+ int tot=0;
- for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ LOOP_SHOWN_PARTICLES {
if(pa->alive == PARS_KILLED);
else if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0);
else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0);
- else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP));
else tot++;
}
return tot;
}
int count_particles_mod(ParticleSystem *psys, int totgr, int cur){
ParticleSettings *part=psys->part;
- ParticleData *pa;
- int tot=0,p;
+ PARTICLE_P;
+ int tot=0;
- for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ LOOP_SHOWN_PARTICLES {
if(pa->alive == PARS_KILLED);
else if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0);
else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0);
- else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP));
else if(p%totgr==cur) tot++;
}
return tot;
}
-int psys_count_keys(ParticleSystem *psys)
-{
- ParticleData *pa;
- int i, totpart=psys->totpart, totkey=0;
-
- for(i=0, pa=psys->particles; i<totpart; i++, pa++)
- totkey += pa->totkey;
-
- return totkey;
-}
-/* remember to free the pointer returned from this! */
-char *psys_menu_string(Object *ob, int for_sb)
-{
- ParticleSystem *psys;
- DynStr *ds;
- char *str, num[6];
- int i;
-
- ds = BLI_dynstr_new();
-
- if(for_sb)
- BLI_dynstr_append(ds, "|Object%x-1");
-
- for(i=0,psys=ob->particlesystem.first; psys; i++,psys=psys->next){
-
- BLI_dynstr_append(ds, "|");
- sprintf(num,"%i. ",i+1);
- BLI_dynstr_append(ds, num);
- BLI_dynstr_append(ds, psys->part->id.name+2);
- sprintf(num,"%%x%i",i+1);
- BLI_dynstr_append(ds, num);
- }
-
- str = BLI_dynstr_get_cstring(ds);
-
- BLI_dynstr_free(ds);
-
- return str;
-}
-
/* we allocate path cache memory in chunks instead of a big continguous
* chunk, windows' memory allocater fails to find big blocks of memory often */
@@ -222,6 +187,20 @@ short psys_get_current_num(Object *ob)
return i;
}
+void psys_set_current_num(Object *ob, int index)
+{
+ ParticleSystem *psys;
+ short i;
+
+ if(ob==0) return;
+
+ for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++) {
+ if(i == index)
+ psys->flag |= PSYS_CURRENT;
+ else
+ psys->flag &= ~PSYS_CURRENT;
+ }
+}
Object *psys_find_object(Scene *scene, ParticleSystem *psys)
{
Base *base = scene->base.first;
@@ -236,55 +215,13 @@ Object *psys_find_object(Scene *scene, ParticleSystem *psys)
return NULL;
}
-int psys_count_autocache(Scene *scene, ParticleSettings *part)
-{
- Base *base = scene->base.first;
- ParticleSystem *psys;
- PTCacheID pid;
- int autocache_count= 0;
-
- for(base = scene->base.first; base; base = base->next) {
- for(psys = base->object->particlesystem.first; psys; psys=psys->next) {
- if(part && psys->part != part)
- continue;
-
- BKE_ptcache_id_from_particles(&pid, base->object, psys);
-
- if((psys->pointcache->flag & PTCACHE_BAKED)
- || (psys->pointcache->flag & PTCACHE_AUTOCACHE)==0)
- continue;
-
- if((psys->pointcache->flag & PTCACHE_OUTDATED)
- || BKE_ptcache_id_exist(&pid, CFRA)==0)
- autocache_count++;
- }
- }
- return autocache_count;
-}
-/* change object's active particle system */
-void psys_change_act(void *ob_v, void *act_v)
-{
- Object *ob = ob_v;
- ParticleSystem *npsys, *psys;
- short act = *((short*)act_v)-1;
-
- if(act>=0){
- npsys=BLI_findlink(&ob->particlesystem,act);
- psys=psys_get_current(ob);
-
- if(psys)
- psys->flag &= ~PSYS_CURRENT;
- if(npsys)
- npsys->flag |= PSYS_CURRENT;
- }
-}
-Object *psys_get_lattice(Scene *scene, Object *ob, ParticleSystem *psys)
+Object *psys_get_lattice(ParticleSimulationData *sim)
{
Object *lattice=0;
- if(psys_in_edit_mode(scene, psys)==0){
+ if(psys_in_edit_mode(sim->scene, sim->psys)==0){
- ModifierData *md = (ModifierData*)psys_get_modifier(ob,psys);
+ ModifierData *md = (ModifierData*)psys_get_modifier(sim->ob, sim->psys);
for(; md; md=md->next){
if(md->type==eModifierType_Lattice){
@@ -313,26 +250,26 @@ void psys_enable_all(Object *ob)
for(; psys; psys=psys->next)
psys->flag &= ~PSYS_DISABLED;
}
-int psys_ob_has_hair(Object *ob)
+int psys_in_edit_mode(Scene *scene, ParticleSystem *psys)
{
- ParticleSystem *psys = ob->particlesystem.first;
-
- for(; psys; psys=psys->next)
- if(psys->part->type == PART_HAIR)
- return 1;
-
- return 0;
+ return (scene->basact && (scene->basact->object->mode & OB_MODE_PARTICLE_EDIT) && psys==psys_get_current((scene->basact)->object) && (psys->edit || psys->pointcache->edit));
}
-int psys_in_edit_mode(Scene *scene, ParticleSystem *psys)
+static void psys_create_frand(ParticleSystem *psys)
{
- return ((G.f & G_PARTICLEEDIT) && psys==psys_get_current((scene->basact)->object) && psys->edit);
+ int i;
+ float *rand = psys->frand = MEM_callocN(PSYS_FRAND_COUNT * sizeof(float), "particle randoms");
+
+ BLI_srandom(psys->seed);
+
+ for(i=0; i<1024; i++, rand++)
+ *rand = BLI_frand();
}
int psys_check_enabled(Object *ob, ParticleSystem *psys)
{
ParticleSystemModifierData *psmd;
Mesh *me;
- if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE)
+ if(psys->flag & PSYS_DISABLED || psys->flag & PSYS_DELETE || !psys->part)
return 0;
if(ob->type == OB_MESH) {
@@ -348,6 +285,14 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
}
else if(!(psmd->modifier.mode & eModifierMode_Realtime))
return 0;
+
+ /* perhaps not the perfect place, but we have to be sure the rands are there before usage */
+ if(!psys->frand)
+ psys_create_frand(psys);
+ else if(psys->recalc & PSYS_RECALC_RESET) {
+ MEM_freeN(psys->frand);
+ psys_create_frand(psys);
+ }
return 1;
}
@@ -361,39 +306,65 @@ void psys_free_settings(ParticleSettings *part)
MEM_freeN(part->pd);
part->pd = NULL;
}
+
if(part->pd2) {
MEM_freeN(part->pd2);
part->pd2 = NULL;
}
+
+ boid_free_settings(part->boids);
}
-void free_hair(ParticleSystem *psys, int softbody)
+void free_hair(Object *ob, ParticleSystem *psys, int dynamics)
{
- ParticleData *pa;
- int i, totpart=psys->totpart;
+ PARTICLE_P;
+
+ if(psys->part->type != PART_HAIR)
+ return;
- for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ LOOP_PARTICLES {
if(pa->hair)
MEM_freeN(pa->hair);
pa->hair = NULL;
+ pa->totkey = 0;
}
psys->flag &= ~PSYS_HAIR_DONE;
- if(softbody && psys->soft) {
- sbFree(psys->soft);
- psys->soft = NULL;
+ if(psys->clmd) {
+ if(dynamics) {
+ BKE_ptcache_free_list(&psys->ptcaches);
+ psys->clmd->point_cache = psys->pointcache = NULL;
+ psys->clmd->ptcaches.first = psys->clmd->ptcaches.first = NULL;
+
+ modifier_free((ModifierData*)psys->clmd);
+
+ psys->clmd = NULL;
+ }
+ else {
+ cloth_free_modifier(ob, psys->clmd);
+ }
}
+
+ if(psys->hair_in_dm)
+ psys->hair_in_dm->release(psys->hair_in_dm);
+ psys->hair_in_dm = NULL;
+
+ if(psys->hair_out_dm)
+ psys->hair_out_dm->release(psys->hair_out_dm);
+ psys->hair_out_dm = NULL;
}
void free_keyed_keys(ParticleSystem *psys)
{
- ParticleData *pa;
- int i;
+ PARTICLE_P;
+
+ if(psys->part->type == PART_HAIR)
+ return;
if(psys->particles && psys->particles->keys) {
MEM_freeN(psys->particles->keys);
- for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++) {
+ LOOP_PARTICLES {
if(pa->keys) {
pa->keys= NULL;
pa->totkey= 0;
@@ -401,19 +372,26 @@ void free_keyed_keys(ParticleSystem *psys)
}
}
}
-void free_child_path_cache(ParticleSystem *psys)
+static void free_child_path_cache(ParticleSystem *psys)
{
psys_free_path_cache_buffers(psys->childcache, &psys->childcachebufs);
psys->childcache = NULL;
psys->totchildcache = 0;
}
-void psys_free_path_cache(ParticleSystem *psys)
+void psys_free_path_cache(ParticleSystem *psys, PTCacheEdit *edit)
{
- psys_free_path_cache_buffers(psys->pathcache, &psys->pathcachebufs);
- psys->pathcache= NULL;
- psys->totcached= 0;
+ if(edit) {
+ psys_free_path_cache_buffers(edit->pathcache, &edit->pathcachebufs);
+ edit->pathcache= NULL;
+ edit->totcached= 0;
+ }
+ if(psys) {
+ psys_free_path_cache_buffers(psys->pathcache, &psys->pathcachebufs);
+ psys->pathcache= NULL;
+ psys->totcached= 0;
- free_child_path_cache(psys);
+ free_child_path_cache(psys);
+ }
}
void psys_free_children(ParticleSystem *psys)
{
@@ -425,6 +403,47 @@ void psys_free_children(ParticleSystem *psys)
free_child_path_cache(psys);
}
+void psys_free_particles(ParticleSystem *psys)
+{
+ PARTICLE_P;
+
+ if(psys->particles) {
+ if(psys->part->type==PART_HAIR) {
+ LOOP_PARTICLES {
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ }
+ }
+
+ if(psys->particles->keys)
+ MEM_freeN(psys->particles->keys);
+
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+
+ MEM_freeN(psys->particles);
+ psys->particles= NULL;
+ psys->totpart= 0;
+ }
+}
+void psys_free_pdd(ParticleSystem *psys)
+{
+ if(psys->pdd->cdata)
+ MEM_freeN(psys->pdd->cdata);
+ psys->pdd->cdata = NULL;
+
+ if(psys->pdd->vdata)
+ MEM_freeN(psys->pdd->vdata);
+ psys->pdd->vdata = NULL;
+
+ if(psys->pdd->ndata)
+ MEM_freeN(psys->pdd->ndata);
+ psys->pdd->ndata = NULL;
+
+ if(psys->pdd->vedata)
+ MEM_freeN(psys->pdd->vedata);
+ psys->pdd->vedata = NULL;
+}
/* free everything */
void psys_free(Object *ob, ParticleSystem * psys)
{
@@ -432,23 +451,14 @@ void psys_free(Object *ob, ParticleSystem * psys)
int nr = 0;
ParticleSystem * tpsys;
- if(ob->particlesystem.first == NULL && G.f & G_PARTICLEEDIT)
- G.f &= ~G_PARTICLEEDIT;
-
- psys_free_path_cache(psys);
+ psys_free_path_cache(psys, NULL);
- free_hair(psys, 1);
+ free_hair(ob, psys, 1);
- free_keyed_keys(psys);
+ psys_free_particles(psys);
if(psys->edit && psys->free_edit)
- psys->free_edit(psys);
-
- if(psys->particles){
- MEM_freeN(psys->particles);
- psys->particles = 0;
- psys->totpart = 0;
- }
+ psys->free_edit(psys->edit);
if(psys->child){
MEM_freeN(psys->child);
@@ -463,7 +473,7 @@ void psys_free(Object *ob, ParticleSystem * psys)
for(tpsys=ob->particlesystem.first; tpsys; tpsys=tpsys->next){
if(tpsys->part)
{
- if(ELEM(tpsys->part->draw_as,PART_DRAW_OB,PART_DRAW_GR))
+ if(ELEM(tpsys->part->ren_as,PART_DRAW_OB,PART_DRAW_GR))
{
nr++;
break;
@@ -479,16 +489,29 @@ void psys_free(Object *ob, ParticleSystem * psys)
psys->part=0;
}
- if(psys->reactevents.first)
- BLI_freelistN(&psys->reactevents);
-
- if(psys->pointcache)
- BKE_ptcache_free(psys->pointcache);
+ BKE_ptcache_free_list(&psys->ptcaches);
+ psys->pointcache = NULL;
+ BLI_freelistN(&psys->targets);
+ BLI_freelistN(&psys->reactevents);
+
+ BLI_kdtree_free(psys->tree);
+
+ if(psys->frand)
+ MEM_freeN(psys->frand);
+
+ if(psys->pdd) {
+ psys_free_pdd(psys);
+ MEM_freeN(psys->pdd);
+ }
+
MEM_freeN(psys);
}
}
+/************************************************/
+/* Rendering */
+/************************************************/
/* these functions move away particle data and bring it back after
* rendering, to make different render settings possible without
* removing the previous data. this should be solved properly once */
@@ -502,6 +525,7 @@ typedef struct ParticleRenderData {
ChildParticle *child;
ParticleCacheKey **pathcache;
ParticleCacheKey **childcache;
+ ListBase pathcachebufs, childcachebufs;
int totchild, totcached, totchildcache;
DerivedMesh *dm;
int totdmvert, totdmedge, totdmface;
@@ -588,8 +612,12 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float
data->child= psys->child;
data->totchild= psys->totchild;
data->pathcache= psys->pathcache;
+ data->pathcachebufs.first = psys->pathcachebufs.first;
+ data->pathcachebufs.last = psys->pathcachebufs.last;
data->totcached= psys->totcached;
data->childcache= psys->childcache;
+ data->childcachebufs.first = psys->childcachebufs.first;
+ data->childcachebufs.last = psys->childcachebufs.last;
data->totchildcache= psys->totchildcache;
if(psmd->dm)
@@ -602,6 +630,8 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float
psys->pathcache= NULL;
psys->childcache= NULL;
psys->totchild= psys->totcached= psys->totchildcache= 0;
+ psys->pathcachebufs.first = psys->pathcachebufs.last = NULL;
+ psys->childcachebufs.first = psys->childcachebufs.last = NULL;
Mat4CpyMat4(data->winmat, winmat);
Mat4MulMat4(data->viewmat, ob->obmat, viewmat);
@@ -631,7 +661,7 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
psmd->dm->release(psmd->dm);
}
- psys_free_path_cache(psys);
+ psys_free_path_cache(psys, NULL);
if(psys->child){
MEM_freeN(psys->child);
@@ -642,8 +672,12 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
psys->child= data->child;
psys->totchild= data->totchild;
psys->pathcache= data->pathcache;
+ psys->pathcachebufs.first = data->pathcachebufs.first;
+ psys->pathcachebufs.last = data->pathcachebufs.last;
psys->totcached= data->totcached;
psys->childcache= data->childcache;
+ psys->childcachebufs.first = data->childcachebufs.first;
+ psys->childcachebufs.last = data->childcachebufs.last;
psys->totchildcache= data->totchildcache;
psmd->dm= data->dm;
@@ -662,24 +696,24 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
{
DerivedMesh *dm= ctx->dm;
- Mesh *me= (Mesh*)(ctx->ob->data);
+ Mesh *me= (Mesh*)(ctx->sim.ob->data);
MFace *mf, *mface;
MVert *mvert;
ParticleRenderData *data;
ParticleRenderElem *elems, *elem;
- ParticleSettings *part= ctx->psys->part;
+ ParticleSettings *part= ctx->sim.psys->part;
float *facearea, (*facecenter)[3], size[3], fac, powrate, scaleclamp;
float co1[3], co2[3], co3[3], co4[3], lambda, arearatio, t, area, viewport;
double vprate;
int *origindex, *facetotvert;
int a, b, totorigface, totface, newtot, skipped;
- if(part->draw_as!=PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
+ if(part->ren_as!=PART_DRAW_PATH || !(part->draw & PART_DRAW_REN_STRAND))
return tot;
- if(!ctx->psys->renderdata)
+ if(!ctx->sim.psys->renderdata)
return tot;
- data= ctx->psys->renderdata;
+ data= ctx->sim.psys->renderdata;
if(data->timeoffset)
return 0;
if(!(part->simplify_flag & PART_SIMPLIFY_ENABLE))
@@ -756,7 +790,7 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
/* set simplification parameters per original face */
for(a=0, elem=elems; a<totorigface; a++, elem++) {
- area = psys_render_projected_area(ctx->psys, facecenter[a], facearea[a], vprate, &viewport);
+ area = psys_render_projected_area(ctx->sim.psys, facecenter[a], facearea[a], vprate, &viewport);
arearatio= fac*area/facearea[a];
if((arearatio < 1.0f || viewport < 1.0f) && elem->totchild) {
@@ -885,7 +919,7 @@ int psys_render_simplify_params(ParticleSystem *psys, ChildParticle *cpa, float
}
/************************************************/
-/* Interpolated Particles */
+/* Interpolation */
/************************************************/
static float interpolate_particle_value(float v1, float v2, float v3, float v4, float *w, int four)
{
@@ -911,7 +945,7 @@ void psys_interpolate_particle(short type, ParticleKey keys[4], float dt, Partic
VecfCubicInterpol(keys[1].co, keys[1].vel, keys[2].co, keys[2].vel, dt, result->co, result->vel);
}
else {
- set_four_ipo(dt, t, type);
+ key_curve_position_weights(dt, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, result->co);
@@ -919,12 +953,12 @@ void psys_interpolate_particle(short type, ParticleKey keys[4], float dt, Partic
float temp[3];
if(dt>0.999f){
- set_four_ipo(dt-0.001f, t, type);
+ key_curve_position_weights(dt-0.001f, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
VECSUB(result->vel, result->co, temp);
}
else{
- set_four_ipo(dt+0.001f, t, type);
+ key_curve_position_weights(dt+0.001f, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
VECSUB(result->vel, temp, result->co);
}
@@ -934,6 +968,267 @@ void psys_interpolate_particle(short type, ParticleKey keys[4], float dt, Partic
+typedef struct ParticleInterpolationData {
+ HairKey *hkey[2];
+
+ DerivedMesh *dm;
+ MVert *mvert[2];
+
+ int keyed;
+ ParticleKey *kkey[2];
+
+ PointCache *cache;
+
+ PTCacheEditPoint *epoint;
+ PTCacheEditKey *ekey[2];
+
+ float birthtime, dietime;
+ int bspline;
+} ParticleInterpolationData;
+/* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */
+static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, int index, float t, ParticleKey *key1, ParticleKey *key2)
+{
+ static PTCacheMem *pm = NULL; /* not thread safe */
+
+ if(index < 0) { /* initialize */
+ pm = cache->mem_cache.first;
+
+ if(pm)
+ pm = pm->next;
+ }
+ else {
+ if(pm) {
+ while(pm && pm->next && (float)pm->frame < t)
+ pm = pm->next;
+
+ BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] : index, pm->data, (float)pm->frame);
+ BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] : index, pm->prev->data, (float)pm->prev->frame);
+ }
+ else if(cache->mem_cache.first) {
+ PTCacheMem *pm2 = cache->mem_cache.first;
+ BKE_ptcache_make_particle_key(key2, pm2->index_array ? pm2->index_array[index] : index, pm2->data, (float)pm2->frame);
+ copy_particle_key(key1, key2, 1);
+ }
+ }
+}
+static void init_particle_interpolation(Object *ob, ParticleSystem *psys, ParticleData *pa, ParticleInterpolationData *pind)
+{
+
+ if(pind->epoint) {
+ PTCacheEditPoint *point = pind->epoint;
+
+ pind->ekey[0] = point->keys;
+ pind->ekey[1] = point->totkey > 1 ? point->keys + 1 : NULL;
+
+ pind->birthtime = *(point->keys->time);
+ pind->dietime = *((point->keys + point->totkey - 1)->time);
+ }
+ else if(pind->keyed) {
+ ParticleKey *key = pa->keys;
+ pind->kkey[0] = key;
+ pind->kkey[1] = pa->totkey > 1 ? key + 1 : NULL;
+
+ pind->birthtime = key->time;
+ pind->dietime = (key + pa->totkey - 1)->time;
+ }
+ else if(pind->cache) {
+ get_pointcache_keys_for_time(ob, pind->cache, -1, 0.0f, NULL, NULL);
+
+ pind->birthtime = pa ? pa->time : pind->cache->startframe;
+ pind->dietime = pa ? pa->dietime : pind->cache->endframe;
+ }
+ else {
+ HairKey *key = pa->hair;
+ pind->hkey[0] = key;
+ pind->hkey[1] = key + 1;
+
+ pind->birthtime = key->time;
+ pind->dietime = (key + pa->totkey - 1)->time;
+
+ if(pind->dm) {
+ pind->mvert[0] = CDDM_get_vert(pind->dm, pa->hair_index);
+ pind->mvert[1] = pind->mvert[0] + 1;
+ }
+ }
+}
+static void edit_to_particle(ParticleKey *key, PTCacheEditKey *ekey)
+{
+ VECCOPY(key->co, ekey->co);
+ if(ekey->vel) {
+ VECCOPY(key->vel, ekey->vel);
+ }
+ key->time = *(ekey->time);
+}
+static void hair_to_particle(ParticleKey *key, HairKey *hkey)
+{
+ VECCOPY(key->co, hkey->co);
+ key->time = hkey->time;
+}
+
+static void mvert_to_particle(ParticleKey *key, MVert *mvert, HairKey *hkey)
+{
+ VECCOPY(key->co, mvert->co);
+ key->time = hkey->time;
+}
+
+static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, float frs_sec, ParticleInterpolationData *pind, ParticleKey *result)
+{
+ PTCacheEditPoint *point = pind->epoint;
+ ParticleKey keys[4];
+ int point_vel = (point && point->keys->vel);
+ float real_t, dfra, keytime;
+
+ /* interpret timing and find keys */
+ if(point) {
+ if(result->time < 0.0f)
+ real_t = -result->time;
+ else
+ real_t = *(pind->ekey[0]->time) + t * (*(pind->ekey[0][point->totkey-1].time) - *(pind->ekey[0]->time));
+
+ while(*(pind->ekey[1]->time) < real_t)
+ pind->ekey[1]++;
+
+ pind->ekey[0] = pind->ekey[1] - 1;
+ }
+ else if(pind->keyed) {
+ /* we have only one key, so let's use that */
+ if(pind->kkey[1]==NULL) {
+ copy_particle_key(result, pind->kkey[0], 1);
+ return;
+ }
+
+ if(result->time < 0.0f)
+ real_t = -result->time;
+ else
+ real_t = pind->kkey[0]->time + t * (pind->kkey[0][pa->totkey-1].time - pind->kkey[0]->time);
+
+ if(psys->part->phystype==PART_PHYS_KEYED && psys->flag & PSYS_KEYED_TIMING) {
+ ParticleTarget *pt = psys->targets.first;
+
+ pt=pt->next;
+
+ while(pt && pa->time + pt->time < real_t)
+ pt= pt->next;
+
+ if(pt) {
+ pt=pt->prev;
+
+ if(pa->time + pt->time + pt->duration > real_t)
+ real_t = pa->time + pt->time;
+ }
+ else
+ real_t = pa->time + ((ParticleTarget*)psys->targets.last)->time;
+ }
+
+ CLAMP(real_t, pa->time, pa->dietime);
+
+ while(pind->kkey[1]->time < real_t)
+ pind->kkey[1]++;
+
+ pind->kkey[0] = pind->kkey[1] - 1;
+ }
+ else if(pind->cache) {
+ if(result->time < 0.0f) /* flag for time in frames */
+ real_t = -result->time;
+ else
+ real_t = pa->time + t * (pa->dietime - pa->time);
+ }
+ else {
+ if(result->time < 0.0f)
+ real_t = -result->time;
+ else
+ real_t = pind->hkey[0]->time + t * (pind->hkey[0][pa->totkey-1].time - pind->hkey[0]->time);
+
+ while(pind->hkey[1]->time < real_t) {
+ pind->hkey[1]++;
+ pind->mvert[1]++;
+ }
+
+ pind->hkey[0] = pind->hkey[1] - 1;
+ }
+
+ /* set actual interpolation keys */
+ if(point) {
+ edit_to_particle(keys + 1, pind->ekey[0]);
+ edit_to_particle(keys + 2, pind->ekey[1]);
+ }
+ else if(pind->dm) {
+ pind->mvert[0] = pind->mvert[1] - 1;
+ mvert_to_particle(keys + 1, pind->mvert[0], pind->hkey[0]);
+ mvert_to_particle(keys + 2, pind->mvert[1], pind->hkey[1]);
+ }
+ else if(pind->keyed) {
+ memcpy(keys + 1, pind->kkey[0], sizeof(ParticleKey));
+ memcpy(keys + 2, pind->kkey[1], sizeof(ParticleKey));
+ }
+ else if(pind->cache) {
+ get_pointcache_keys_for_time(NULL, pind->cache, p, real_t, keys+1, keys+2);
+ }
+ else {
+ hair_to_particle(keys + 1, pind->hkey[0]);
+ hair_to_particle(keys + 2, pind->hkey[1]);
+ }
+
+ /* set secondary interpolation keys for hair */
+ if(!pind->keyed && !pind->cache && !point_vel) {
+ if(point) {
+ if(pind->ekey[0] != point->keys)
+ edit_to_particle(keys, pind->ekey[0] - 1);
+ else
+ edit_to_particle(keys, pind->ekey[0]);
+ }
+ else if(pind->dm) {
+ if(pind->hkey[0] != pa->hair)
+ mvert_to_particle(keys, pind->mvert[0] - 1, pind->hkey[0] - 1);
+ else
+ mvert_to_particle(keys, pind->mvert[0], pind->hkey[0]);
+ }
+ else {
+ if(pind->hkey[0] != pa->hair)
+ hair_to_particle(keys, pind->hkey[0] - 1);
+ else
+ hair_to_particle(keys, pind->hkey[0]);
+ }
+
+ if(point) {
+ if(pind->ekey[1] != point->keys + point->totkey - 1)
+ edit_to_particle(keys + 3, pind->ekey[1] + 1);
+ else
+ edit_to_particle(keys + 3, pind->ekey[1]);
+ }
+ else if(pind->dm) {
+ if(pind->hkey[1] != pa->hair + pa->totkey - 1)
+ mvert_to_particle(keys + 3, pind->mvert[1] + 1, pind->hkey[1] + 1);
+ else
+ mvert_to_particle(keys + 3, pind->mvert[1], pind->hkey[1]);
+ }
+ else {
+ if(pind->hkey[1] != pa->hair + pa->totkey - 1)
+ hair_to_particle(keys + 3, pind->hkey[1] + 1);
+ else
+ hair_to_particle(keys + 3, pind->hkey[1]);
+ }
+ }
+
+ dfra = keys[2].time - keys[1].time;
+ keytime = (real_t - keys[1].time) / dfra;
+
+ /* convert velocity to timestep size */
+ if(pind->keyed || pind->cache || point_vel){
+ VecMulf(keys[1].vel, dfra / frs_sec);
+ VecMulf(keys[2].vel, dfra / frs_sec);
+ QuatInterpol(result->rot,keys[1].rot,keys[2].rot,keytime);
+ }
+
+ /* now we should have in chronologiacl order k1<=k2<=t<=k3<=k4 with keytime between [0,1]->[k2,k3] (k1 & k4 used for cardinal & bspline interpolation)*/
+ psys_interpolate_particle((pind->keyed || pind->cache || point_vel) ? -1 /* signal for cubic interpolation */
+ : (pind->bspline ? KEY_BSPLINE : KEY_CARDINAL)
+ ,keys, keytime, result, 1);
+
+ /* the velocity needs to be converted back from cubic interpolation */
+ if(pind->keyed || pind->cache || point_vel)
+ VecMulf(result->vel, frs_sec / dfra);
+}
/************************************************/
/* Particles on a dm */
/************************************************/
@@ -1117,7 +1412,7 @@ void psys_interpolate_mcol(MCol *mcol, int quad, float *w, MCol *mc)
}
}
-float psys_interpolate_value_from_verts(DerivedMesh *dm, short from, int index, float *fw, float *values)
+static float psys_interpolate_value_from_verts(DerivedMesh *dm, short from, int index, float *fw, float *values)
{
if(values==0 || index==-1)
return 0.0;
@@ -1384,7 +1679,7 @@ ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
}
}
}
- return 0;
+ return NULL;
}
/************************************************/
/* Particles on a shape */
@@ -1434,16 +1729,6 @@ void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int in
/************************************************/
/* Path Cache */
/************************************************/
-static void hair_to_particle(ParticleKey *key, HairKey *hkey)
-{
- VECCOPY(key->co, hkey->co);
- key->time = hkey->time;
-}
-static void bp_to_particle(ParticleKey *key, BodyPoint *bp, HairKey *hkey)
-{
- VECCOPY(key->co, bp->pos);
- key->time = hkey->time;
-}
static float vert_weight(MDeformVert *dvert, int group)
{
MDeformWeight *dw;
@@ -1621,7 +1906,7 @@ int do_guide(Scene *scene, ParticleKey *state, int pa_num, float time, ListBase
ParticleKey key, par;
float effect[3]={0.0,0.0,0.0}, distance, f_force, mindist, totforce=0.0;
- float guidevec[4], guidedir[3], rot2[4], temp[3], angle, pa_loc[3], pa_zero[3]={0.0f,0.0f,0.0f};
+ float guidevec[4], guidedir[3], rot2[4], radius, temp[3], angle, pa_loc[3], pa_zero[3]={0.0f,0.0f,0.0f};
float veffect[3]={0.0,0.0,0.0}, guidetime;
effect[0]=effect[1]=effect[2]=0.0;
@@ -1664,9 +1949,9 @@ int do_guide(Scene *scene, ParticleKey *state, int pa_num, float time, ListBase
}
if(pd->flag & PFIELD_GUIDE_PATH_ADD)
- where_on_path(eob, f_force*guidetime, guidevec, guidedir);
+ where_on_path(eob, f_force*guidetime, guidevec, guidedir, NULL, &radius);
else
- where_on_path(eob, guidetime, guidevec, guidedir);
+ where_on_path(eob, guidetime, guidevec, guidedir, NULL, &radius);
Mat4MulVecfl(ec->ob->obmat,guidevec);
Mat4Mul3Vecfl(ec->ob->obmat,guidedir);
@@ -1696,10 +1981,12 @@ int do_guide(Scene *scene, ParticleKey *state, int pa_num, float time, ListBase
/* curve taper */
if(cu->taperobj)
VecMulf(pa_loc, calc_taper(scene, cu->taperobj, (int)(f_force*guidetime*100.0), 100));
- /* TODO */
- //else{
- ///* curve size*/
- //}
+
+ else{ /* curve size*/
+ if(cu->flag & CU_PATH_RADIUS) {
+ VecMulf(pa_loc, radius);
+ }
+ }
par.co[0]=par.co[1]=par.co[2]=0.0f;
VECCOPY(key.co,pa_loc);
do_prekink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, pd->kink, pd->kink_axis, 0);
@@ -1730,7 +2017,7 @@ int do_guide(Scene *scene, ParticleKey *state, int pa_num, float time, ListBase
}
return 0;
}
-static void do_rough(float *loc, float t, float fac, float size, float thres, ParticleKey *state)
+static void do_rough(float *loc, float mat[4][4], float t, float fac, float size, float thres, ParticleKey *state)
{
float rough[3];
float rco[3];
@@ -1743,34 +2030,26 @@ static void do_rough(float *loc, float t, float fac, float size, float thres, Pa
rough[0]=-1.0f+2.0f*BLI_gTurbulence(size, rco[0], rco[1], rco[2], 2,0,2);
rough[1]=-1.0f+2.0f*BLI_gTurbulence(size, rco[1], rco[2], rco[0], 2,0,2);
rough[2]=-1.0f+2.0f*BLI_gTurbulence(size, rco[2], rco[0], rco[1], 2,0,2);
- VECADDFAC(state->co,state->co,rough,fac);
+
+ VECADDFAC(state->co,state->co,mat[0],fac*rough[0]);
+ VECADDFAC(state->co,state->co,mat[1],fac*rough[1]);
+ VECADDFAC(state->co,state->co,mat[2],fac*rough[2]);
}
-static void do_rough_end(float *loc, float t, float fac, float shape, ParticleKey *state, ParticleKey *par)
+static void do_rough_end(float *loc, float mat[4][4], float t, float fac, float shape, ParticleKey *state)
{
- float rough[3], rnor[3];
+ float rough[2];
float roughfac;
roughfac=fac*(float)pow((double)t,shape);
VECCOPY(rough,loc);
rough[0]=-1.0f+2.0f*rough[0];
rough[1]=-1.0f+2.0f*rough[1];
- rough[2]=-1.0f+2.0f*rough[2];
VecMulf(rough,roughfac);
-
- if(par){
- VECCOPY(rnor,par->vel);
- }
- else{
- VECCOPY(rnor,state->vel);
- }
- Normalize(rnor);
- Projf(rnor,rough,rnor);
- VECSUB(rough,rough,rnor);
-
- VECADD(state->co,state->co,rough);
+ VECADDFAC(state->co,state->co,mat[0],rough[0]);
+ VECADDFAC(state->co,state->co,mat[1],rough[1]);
}
-static void do_path_effectors(Scene *scene, Object *ob, ParticleSystem *psys, 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 *rootco, float effector, float dfra, float cfra, float *length, float *vec)
{
float force[3] = {0.0f,0.0f,0.0f}, vel[3] = {0.0f,0.0f,0.0f};
ParticleKey eff_key;
@@ -1780,10 +2059,10 @@ static void do_path_effectors(Scene *scene, Object *ob, ParticleSystem *psys, in
VECCOPY(eff_key.vel,(ca-1)->vel);
QUATCOPY(eff_key.rot,(ca-1)->rot);
- pa= psys->particles+i;
- do_effectors(i, pa, &eff_key, scene, ob, psys, rootco, force, vel, dfra, cfra);
+ pa= sim->psys->particles+i;
+ do_effectors(sim, i, pa, &eff_key, rootco, force, vel, dfra, cfra);
- VecMulf(force, effector*pow((float)k / (float)steps, 100.0f * psys->part->eff_hair) / (float)steps);
+ VecMulf(force, effector*pow((float)k / (float)steps, 100.0f * sim->psys->part->eff_hair) / (float)steps);
VecAddf(force, force, vec);
@@ -1829,7 +2108,11 @@ float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
{
float *vg=0;
- if(psys->vgroup[vgroup]){
+ if(vgroup < 0) {
+ /* hair dynamics pinning vgroup */
+
+ }
+ else if(psys->vgroup[vgroup]){
MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
if(dvert){
int totvert=dm->getNumVerts(dm), i;
@@ -1846,12 +2129,12 @@ float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
}
return vg;
}
-void psys_find_parents(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys)
+void psys_find_parents(ParticleSimulationData *sim)
{
- ParticleSettings *part=psys->part;
+ ParticleSettings *part=sim->psys->part;
KDTree *tree;
ChildParticle *cpa;
- int p, totparent,totchild=psys->totchild;
+ int p, totparent,totchild=sim->psys->totchild;
float co[3], orco[3];
int from=PART_FROM_FACE;
totparent=(int)(totchild*part->parents*0.3);
@@ -1861,15 +2144,15 @@ void psys_find_parents(Object *ob, ParticleSystemModifierData *psmd, ParticleSys
tree=BLI_kdtree_new(totparent);
- for(p=0,cpa=psys->child; p<totparent; p++,cpa++){
- psys_particle_on_emitter(psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
+ for(p=0,cpa=sim->psys->child; p<totparent; p++,cpa++){
+ psys_particle_on_emitter(sim->psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
BLI_kdtree_insert(tree, p, orco, NULL);
}
BLI_kdtree_balance(tree);
for(; p<totchild; p++,cpa++){
- psys_particle_on_emitter(psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
+ psys_particle_on_emitter(sim->psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0,orco,0);
cpa->parent=BLI_kdtree_find_nearest(tree, orco, NULL, NULL);
}
@@ -1907,11 +2190,11 @@ static void get_strand_normal(Material *ma, float *surfnor, float surfdist, floa
VECCOPY(nor, vnor);
}
-int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, int editupdate)
+static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, int editupdate)
{
ParticleThreadContext *ctx= threads[0].ctx;
- Object *ob= ctx->ob;
- ParticleSystem *psys= ctx->psys;
+/* Object *ob= ctx->sim.ob; */
+ ParticleSystem *psys= ctx->sim.psys;
ParticleSettings *part = psys->part;
ParticleEditSettings *pset = &scene->toolsettings->particle;
int totparent=0, between=0;
@@ -1921,7 +2204,7 @@ int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, in
/*---start figuring out what is actually wanted---*/
if(psys_in_edit_mode(scene, psys))
- if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_SHOW_CHILD)==0)
+ if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_DRAW_PART)==0)
totchild=0;
if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
@@ -1944,10 +2227,10 @@ int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, in
if(totchild==0) return 0;
/* init random number generator */
- if(ctx->psys->part->flag & PART_ANIM_BRANCHING)
- seed= 31415926 + ctx->psys->seed + (int)cfra;
+ if(ctx->sim.psys->part->flag & PART_ANIM_BRANCHING)
+ seed= 31415926 + ctx->sim.psys->seed + (int)cfra;
else
- seed= 31415926 + ctx->psys->seed;
+ seed= 31415926 + ctx->sim.psys->seed;
if(part->flag & PART_BRANCHING || ctx->editupdate || totchild < 10000)
totthread= 1;
@@ -1965,7 +2248,7 @@ int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, in
ctx->parent_pass= 0;
ctx->cfra= cfra;
- psys->lattice = psys_get_lattice(scene, ob, psys);
+ psys->lattice = psys_get_lattice(&ctx->sim);
/* cache all relevant vertex groups if they exist */
if(part->from!=PART_FROM_PARTICLE){
@@ -1991,11 +2274,11 @@ int psys_threads_init_path(ParticleThread *threads, Scene *scene, float cfra, in
}
/* note: this function must be thread safe, except for branching! */
-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 *keys, int i)
{
ParticleThreadContext *ctx= thread->ctx;
- Object *ob= ctx->ob;
- ParticleSystem *psys = ctx->psys;
+ Object *ob= ctx->sim.ob;
+ ParticleSystem *psys = ctx->sim.psys;
ParticleSettings *part = psys->part;
ParticleCacheKey **cache= psys->childcache;
ParticleCacheKey **pcache= psys->pathcache;
@@ -2003,13 +2286,11 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
ParticleData *pa=NULL;
ParticleTexture ptex;
float *cpa_fuv=0, *par_rot=0;
- float co[3], orco[3], ornor[3], t, rough_t, cpa_1st[3], dvec[3];
- float branch_begin, branch_end, branch_prob, branchfac, rough_rand;
- float pa_rough1, pa_rough2, pa_roughe;
- float length, pa_length, pa_clump, pa_kink, pa_effector;
- float max_length = 1.0f, cur_length = 0.0f;
+ 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 length, max_length = 1.0f, cur_length = 0.0f;
float eff_length, eff_vec[3];
- int k, cpa_num, guided = 0;
+ int k, cpa_num;
short cpa_from;
if(part->flag & PART_BRANCHING) {
@@ -2039,7 +2320,7 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
needupdate= 0;
w= 0;
while(w<4 && cpa->pa[w]>=0) {
- if(psys->particles[cpa->pa[w]].flag & PARS_EDIT_RECALC) {
+ if(psys->edit->points[cpa->pa[w]].flag & PEP_EDIT_RECALC) {
needupdate= 1;
break;
}
@@ -2063,22 +2344,26 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
cpa_num = cpa->num;
foffset= cpa->foffset;
- if(part->childtype == PART_CHILD_FACES)
- foffset = -(2.0f + part->childspread);
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
- psys_particle_on_emitter(ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,0);
+ 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);
+ Mat4MulVecfl(ob->obmat,cpa_1st);
+ }
+
+ pa = psys->particles + cpa->parent;
- /* 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);
- Mat4MulVecfl(ob->obmat,cpa_1st);
+ 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)) {
- if(!(psys->particles[cpa->parent].flag & PARS_EDIT_RECALC))
+ if(!(psys->edit->points[cpa->parent].flag & PEP_EDIT_RECALC))
return;
memset(keys, 0, sizeof(*keys)*(ctx->steps+1));
@@ -2094,7 +2379,9 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
cpa_num=pa->num;
cpa_fuv=pa->fuv;
- psys_particle_on_emitter(ctx->psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
+ 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;
@@ -2109,43 +2396,13 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
#endif // XXX old animation system
/* get different child parameters from textures & vgroups */
- ptex.length=part->length*(1.0f - part->randlength*cpa->rand[0]);
- ptex.clump=1.0;
- ptex.kink=1.0;
- ptex.rough= 1.0;
- ptex.exist= 1.0;
+ get_child_modifier_parameters(part, ctx, cpa, cpa_from, cpa_num, cpa_fuv, orco, &ptex);
- get_cpa_texture(ctx->dm,ctx->ma,cpa_num,cpa_fuv,orco,&ptex,
- MAP_PA_DENS|MAP_PA_LENGTH|MAP_PA_CLUMP|MAP_PA_KINK|MAP_PA_ROUGH);
-
- pa_length=ptex.length;
- pa_clump=ptex.clump;
- pa_kink=ptex.kink;
- pa_rough1=ptex.rough;
- pa_rough2=ptex.rough;
- pa_roughe=ptex.rough;
- pa_effector= 1.0f;
-
- if(ptex.exist < cpa->rand[1]) {
+ if(ptex.exist < PSYS_FRAND(i + 24)) {
keys->steps = -1;
return;
}
- if(ctx->vg_length)
- pa_length*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_length);
- if(ctx->vg_clump)
- pa_clump*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_clump);
- if(ctx->vg_kink)
- pa_kink*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_kink);
- if(ctx->vg_rough1)
- pa_rough1*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough1);
- if(ctx->vg_rough2)
- pa_rough2*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough2);
- if(ctx->vg_roughe)
- pa_roughe*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_roughe);
- if(ctx->vg_effector)
- pa_effector*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_effector);
-
/* create the child path */
for(k=0,state=keys; k<=ctx->steps; k++,state++){
if(ctx->between){
@@ -2169,12 +2426,14 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
key[w]++;
w++;
}
- 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->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);
+ }
+ /* apply offset for correct positioning */
+ VECADD(state->co,state->co,cpa_1st);
}
- /* apply offset for correct positioning */
- VECADD(state->co,state->co,cpa_1st);
}
else{
/* offset the child from the parent position */
@@ -2188,7 +2447,7 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
if(part->flag & PART_CHILD_EFFECT) {
for(k=0,state=keys; k<=ctx->steps; k++,state++) {
if(k) {
- do_path_effectors(ctx->scene, ob, psys, cpa->pa[0], state, k, ctx->steps, keys->co, pa_effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
+ do_path_effectors(&ctx->sim, cpa->pa[0], state, k, ctx->steps, keys->co, ptex.effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
}
else {
VecSubf(eff_vec,(state+1)->co,state->co);
@@ -2214,67 +2473,50 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
}
/* apply different deformations to the child path */
- if(part->flag & PART_CHILD_EFFECT)
- /* state is safe to cast, since only co and vel are used */
- guided = do_guide(ctx->scene, (ParticleKey*)state, cpa->parent, t, &(psys->effectors));
-
- if(guided==0){
- if(part->kink)
- do_prekink((ParticleKey*)state, (ParticleKey*)par, par_rot, t,
- part->kink_freq * pa_kink, part->kink_shape, part->kink_amp, part->kink, part->kink_axis, ob->obmat);
-
- do_clump((ParticleKey*)state, (ParticleKey*)par, t, part->clumpfac, part->clumppow, pa_clump);
- }
-
- if(part->flag & PART_BRANCHING && ctx->between == 0 && part->flag & PART_ANIM_BRANCHING)
- rough_t = t * rough_rand;
- else
- rough_t = t;
-
- if(part->rough1 != 0.0 && pa_rough1 != 0.0)
- do_rough(orco, rough_t, pa_rough1*part->rough1, part->rough1_size, 0.0, (ParticleKey*)state);
+ do_child_modifiers(&ctx->sim, &ptex, (ParticleKey *)par, par_rot, cpa, orco, hairmat, (ParticleKey *)state, t);
- if(part->rough2 != 0.0 && pa_rough2 != 0.0)
- do_rough(cpa->rand, rough_t, pa_rough2*part->rough2, part->rough2_size, part->rough2_thres, (ParticleKey*)state);
-
- if(part->rough_end != 0.0 && pa_roughe != 0.0)
- do_rough_end(cpa->rand, rough_t, pa_roughe*part->rough_end, part->rough_end_shape, (ParticleKey*)state, (ParticleKey*)par);
+ /* 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;
- 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);
- }
- }
- }
+ /* 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)
- VecLerpf(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 */
- VecLerpf(state->co, (cache[i - psys->totpart] + k)->co, state->co, branchfac);
- }
+ // if(i<psys->totpart)
+ // VecLerpf(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 */
+ // VecLerpf(state->co, (cache[i - psys->totpart] + k)->co, state->co, branchfac);
+ //}
/* we have to correct velocity because of kink & clump */
if(k>1){
@@ -2288,20 +2530,12 @@ void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa,
/* check if path needs to be cut before actual end of data points */
if(k){
VECSUB(dvec,state->co,(state-1)->co);
- if(part->flag&PART_ABS_LENGTH)
- length=VecLength(dvec);
- else
- length=1.0f/(float)ctx->steps;
-
+ length=1.0f/(float)ctx->steps;
k=check_path_length(k,keys,state,max_length,&cur_length,length,dvec);
}
else{
/* initialize length calculation */
- if(part->flag&PART_ABS_LENGTH)
- max_length= part->abslength*pa_length;
- else
- max_length= pa_length;
-
+ max_length= ptex.length;
cur_length= 0.0f;
}
@@ -2316,7 +2550,7 @@ static void *exec_child_path_cache(void *data)
{
ParticleThread *thread= (ParticleThread*)data;
ParticleThreadContext *ctx= thread->ctx;
- ParticleSystem *psys= ctx->psys;
+ ParticleSystem *psys= ctx->sim.psys;
ParticleCacheKey **cache= psys->childcache;
ChildParticle *cpa;
int i, totchild= ctx->totchild, first= 0;
@@ -2333,18 +2567,21 @@ static void *exec_child_path_cache(void *data)
return 0;
}
-void psys_cache_child_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupdate)
{
- ParticleSettings *part = psys->part;
+ ParticleSettings *part = sim->psys->part;
ParticleThread *pthreads;
ParticleThreadContext *ctx;
ParticleCacheKey **cache;
ListBase threads;
int i, totchild, totparent, totthread;
- pthreads= psys_threads_create(scene, ob, psys);
+ if(sim->psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
+ pthreads= psys_threads_create(sim);
- if(!psys_threads_init_path(pthreads, scene, cfra, editupdate)) {
+ if(!psys_threads_init_path(pthreads, sim->scene, cfra, editupdate)) {
psys_threads_free(pthreads);
return;
}
@@ -2353,14 +2590,14 @@ void psys_cache_child_paths(Scene *scene, Object *ob, ParticleSystem *psys, floa
totchild= ctx->totchild;
totparent= ctx->totparent;
- if(editupdate && psys->childcache && !(part->flag & PART_BRANCHING) && totchild == psys->totchildcache) {
- cache = psys->childcache;
+ if(editupdate && sim->psys->childcache && !(part->flag & PART_BRANCHING) && totchild == sim->psys->totchildcache) {
+ cache = sim->psys->childcache;
}
else {
/* clear out old and create new empty path cache */
- free_child_path_cache(psys);
- psys->childcache= psys_alloc_path_cache_buffers(&psys->childcachebufs, totchild, ctx->steps+1);
- psys->totchildcache = totchild;
+ free_child_path_cache(sim->psys);
+ sim->psys->childcache= psys_alloc_path_cache_buffers(&sim->psys->childcachebufs, totchild, ctx->steps+1);
+ sim->psys->totchildcache = totchild;
}
totthread= pthreads[0].tot;
@@ -2394,329 +2631,206 @@ void psys_cache_child_paths(Scene *scene, Object *ob, ParticleSystem *psys, floa
psys_threads_free(pthreads);
}
-
/* 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. */
/* -Cached path data is also used to determine cut position for the editmode tool. */
-void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+void psys_cache_paths(ParticleSimulationData *sim, float cfra)
{
- ParticleCacheKey *ca, **cache=psys->pathcache;
- ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
- ParticleEditSettings *pset = &scene->toolsettings->particle;
+ PARTICLE_PSMD;
+ ParticleEditSettings *pset = &sim->scene->toolsettings->particle;
+ ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
-
- ParticleData *pa;
- ParticleKey keys[4], result, *kkey[2] = {NULL, NULL};
- HairKey *hkey[2] = {NULL, NULL};
-
- ParticleEdit *edit = 0;
- ParticleEditKey *ekey = 0;
+ ParticleCacheKey *ca, **cache= psys->pathcache;
- SoftBody *soft = 0;
- BodyPoint *bp[2] = {NULL, NULL};
+ DerivedMesh *hair_dm = psys->hair_out_dm;
+
+ ParticleKey result;
Material *ma;
+ ParticleInterpolationData pind;
+
+ PARTICLE_P;
float birthtime = 0.0, dietime = 0.0;
- float t, time = 0.0, keytime = 0.0, dfra = 1.0, frs_sec = scene->r.frs_sec;
- float col[3] = {0.5f, 0.5f, 0.5f};
+ float t, time = 0.0, dfra = 1.0, frs_sec = sim->scene->r.frs_sec;
+ float col[4] = {0.5f, 0.5f, 0.5f, 1.0f};
float prev_tangent[3], hairmat[4][4];
- int k,i;
- int steps = (int)pow(2.0, (double)psys->part->draw_step);
+ float rotmat[3][3];
+ int k;
+ int steps = (int)pow(2.0, (double)(psys->renderdata ? part->ren_step : part->draw_step));
int totpart = psys->totpart;
- float sel_col[3];
- float nosel_col[3];
float length, vec[3];
float *vg_effector= NULL, effector=0.0f;
- float *vg_length= NULL, pa_length=1.0f, max_length=1.0f, cur_length=0.0f;
- float len, dvec[3];
+ float *vg_length= NULL, pa_length=1.0f;
+ int keyed, baked;
/* we don't have anything valid to create paths from so let's quit here */
- if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0)
+ if((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0)
return;
- if(psys->renderdata) {
- steps = (int)pow(2.0, (double)psys->part->ren_step);
- }
- else if(psys_in_edit_mode(scene, psys)) {
- edit=psys->edit;
-
- //timed = edit->draw_timed;
+ if(psys_in_edit_mode(sim->scene, psys))
+ if(psys->renderdata==0 && (psys->edit==NULL || pset->flag & PE_DRAW_PART)==0)
+ return;
+
+ BLI_srandom(psys->seed);
- if(pset->brushtype == PE_BRUSH_WEIGHT) {
- sel_col[0] = sel_col[1] = sel_col[2] = 1.0f;
- nosel_col[0] = nosel_col[1] = nosel_col[2] = 0.0f;
- }
- else{
- sel_col[0] = (float)edit->sel_col[0] / 255.0f;
- sel_col[1] = (float)edit->sel_col[1] / 255.0f;
- sel_col[2] = (float)edit->sel_col[2] / 255.0f;
- nosel_col[0] = (float)edit->nosel_col[0] / 255.0f;
- nosel_col[1] = (float)edit->nosel_col[1] / 255.0f;
- nosel_col[2] = (float)edit->nosel_col[2] / 255.0f;
- }
- }
+ keyed = psys->flag & PSYS_KEYED;
+ baked = !hair_dm && psys->pointcache->flag & PTCACHE_BAKED;
- if(editupdate && psys->pathcache && totpart == psys->totcached) {
- cache = psys->pathcache;
- }
- else {
- /* clear out old and create new empty path cache */
- psys_free_path_cache(psys);
- cache= psys_alloc_path_cache_buffers(&psys->pathcachebufs, totpart, steps+1);
- psys->pathcache= cache;
- }
+ /* clear out old and create new empty path cache */
+ psys_free_path_cache(psys, psys->edit);
+ cache= psys->pathcache= psys_alloc_path_cache_buffers(&psys->pathcachebufs, totpart, steps+1);
- if(edit==NULL && psys->soft && psys->softflag & OB_SB_ENABLE) {
- soft = psys->soft;
- if(!soft->bpoint)
- soft= NULL;
- }
-
- psys->lattice = psys_get_lattice(scene, ob, psys);
- ma= give_current_material(ob, psys->part->omat);
+ psys->lattice = psys_get_lattice(sim);
+ ma= give_current_material(sim->ob, psys->part->omat);
if(ma && (psys->part->draw & PART_DRAW_MAT_COL))
VECCOPY(col, &ma->r)
-
- if(psys->part->from!=PART_FROM_PARTICLE) {
+
+ if(psys->part->from!=PART_FROM_PARTICLE && !(psys->flag & PSYS_GLOBAL_HAIR)) {
if(!(psys->part->flag & PART_CHILD_EFFECT))
vg_effector = psys_cache_vgroup(psmd->dm, psys, PSYS_VG_EFFECTOR);
- if(!edit && !psys->totchild)
+ if(!psys->totchild)
vg_length = psys_cache_vgroup(psmd->dm, psys, PSYS_VG_LENGTH);
}
/*---first main loop: create all actual particles' paths---*/
- for(i=0,pa=psys->particles; i<totpart; i++, pa++){
- if(psys && edit==NULL && (pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST)) {
- if(soft)
- bp[0] += pa->totkey; /* TODO use of initialized value? */
- continue;
- }
-
- if(editupdate && !(pa->flag & PARS_EDIT_RECALC)) continue;
- else memset(cache[i], 0, sizeof(*cache[i])*(steps+1));
-
- if(!edit && !psys->totchild) {
- pa_length = part->length * (1.0f - part->randlength*pa->r_ave[0]);
+ LOOP_SHOWN_PARTICLES {
+ if(!psys->totchild) {
+ BLI_srandom(psys->seed + p);
+ pa_length = 1.0f - part->randlength * BLI_frand();
if(vg_length)
pa_length *= psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_length);
}
- cache[i]->steps = steps;
+ pind.keyed = keyed;
+ pind.cache = baked ? psys->pointcache : NULL;
+ pind.epoint = NULL;
+ pind.bspline = (psys->part->flag & PART_HAIR_BSPLINE);
+ pind.dm = hair_dm;
+
+ memset(cache[p], 0, sizeof(*cache[p])*(steps+1));
- if(edit)
- ekey = edit->keys[i];
+ cache[p]->steps = steps;
/*--get the first data points--*/
- if(psys->flag & PSYS_KEYED) {
- kkey[0] = pa->keys;
- kkey[1] = kkey[0] + 1;
+ init_particle_interpolation(sim->ob, sim->psys, pa, &pind);
+
+ /* hairmat is needed for for non-hair particle too so we get proper rotations */
+ psys_mat_hair_to_global(sim->ob, psmd->dm, psys->part->from, pa, hairmat);
+ VECCOPY(rotmat[0], hairmat[2]);
+ VECCOPY(rotmat[1], hairmat[1]);
+ VECCOPY(rotmat[2], hairmat[0]);
- birthtime = kkey[0]->time;
- dietime = kkey[0][pa->totkey-1].time;
+ if(part->draw & PART_ABS_PATH_TIME) {
+ birthtime = MAX2(pind.birthtime, part->path_start);
+ dietime = MIN2(pind.dietime, part->path_end);
}
else {
- hkey[0] = pa->hair;
- hkey[1] = hkey[0] + 1;
-
- birthtime = hkey[0]->time;
- dietime = hkey[0][pa->totkey-1].time;
-
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+ float tb = pind.birthtime;
+ birthtime = tb + part->path_start * (pind.dietime - tb);
+ dietime = tb + part->path_end * (pind.dietime - tb);
}
- if(soft){
- bp[0] = soft->bpoint + pa->bpi;
- bp[1] = bp[0] + 1;
+ if(birthtime >= dietime) {
+ cache[p]->steps = -1;
+ continue;
}
+ dietime = birthtime + pa_length * (dietime - birthtime);
+
/*--interpolate actual path from data points--*/
- for(k=0, ca=cache[i]; k<=steps; k++, ca++){
+ for(k=0, ca=cache[p]; k<=steps; k++, ca++){
time = (float)k / (float)steps;
t = birthtime + time * (dietime - birthtime);
- if(psys->flag & PSYS_KEYED) {
- while(kkey[1]->time < t) {
- kkey[1]++;
- }
-
- kkey[0] = kkey[1] - 1;
- }
- else {
- while(hkey[1]->time < t) {
- hkey[1]++;
- bp[1]++;
- }
-
- hkey[0] = hkey[1] - 1;
- }
-
- if(soft) {
- bp[0] = bp[1] - 1;
- bp_to_particle(keys + 1, bp[0], hkey[0]);
- bp_to_particle(keys + 2, bp[1], hkey[1]);
- }
- else if(psys->flag & PSYS_KEYED) {
- memcpy(keys + 1, kkey[0], sizeof(ParticleKey));
- memcpy(keys + 2, kkey[1], sizeof(ParticleKey));
- }
- else {
- hair_to_particle(keys + 1, hkey[0]);
- hair_to_particle(keys + 2, hkey[1]);
- }
-
-
- if((psys->flag & PSYS_KEYED)==0) {
- if(soft) {
- if(hkey[0] != pa->hair)
- bp_to_particle(keys, bp[0] - 1, hkey[0] - 1);
- else
- bp_to_particle(keys, bp[0], hkey[0]);
- }
- else {
- if(hkey[0] != pa->hair)
- hair_to_particle(keys, hkey[0] - 1);
- else
- hair_to_particle(keys, hkey[0]);
- }
-
- if(soft) {
- if(hkey[1] != pa->hair + pa->totkey - 1)
- bp_to_particle(keys + 3, bp[1] + 1, hkey[1] + 1);
- else
- bp_to_particle(keys + 3, bp[1], hkey[1]);
- }
- else {
- if(hkey[1] != pa->hair + pa->totkey - 1)
- hair_to_particle(keys + 3, hkey[1] + 1);
- else
- hair_to_particle(keys + 3, hkey[1]);
- }
- }
-
- dfra = keys[2].time - keys[1].time;
-
- keytime = (t - keys[1].time) / dfra;
+ result.time = -t;
- /* convert velocity to timestep size */
- if(psys->flag & PSYS_KEYED){
- VecMulf(keys[1].vel, dfra / frs_sec);
- VecMulf(keys[2].vel, dfra / frs_sec);
- }
-
- /* now we should have in chronologiacl order k1<=k2<=t<=k3<=k4 with keytime between [0,1]->[k2,k3] (k1 & k4 used for cardinal & bspline interpolation)*/
- psys_interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */
- : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL)
- ,keys, keytime, &result, 0);
+ do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, &result);
- /* the velocity needs to be converted back from cubic interpolation */
- if(psys->flag & PSYS_KEYED){
- VecMulf(result.vel, frs_sec / dfra);
- }
- else if(soft==NULL) { /* softbody and keyed are allready in global space */
+ /* dynamic hair is in object space */
+ /* keyed and baked are allready in global space */
+ if(hair_dm)
+ Mat4MulVecfl(sim->ob->obmat, result.co);
+ else if(!keyed && !baked && !(psys->flag & PSYS_GLOBAL_HAIR))
Mat4MulVecfl(hairmat, result.co);
- }
VECCOPY(ca->co, result.co);
-
- /* selection coloring in edit mode */
- if(edit){
- if(pset->brushtype==PE_BRUSH_WEIGHT){
- if(k==steps)
- VecLerpf(ca->col, nosel_col, sel_col, hkey[0]->weight);
- else
- VecLerpf(ca->col, nosel_col, sel_col,
- (1.0f - keytime) * hkey[0]->weight + keytime * hkey[1]->weight);
- }
- else{
- if((ekey + (hkey[0] - pa->hair))->flag & PEK_SELECT){
- if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){
- VECCOPY(ca->col, sel_col);
- }
- else{
- VecLerpf(ca->col, sel_col, nosel_col, keytime);
- }
- }
- else{
- if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){
- VecLerpf(ca->col, nosel_col, sel_col, keytime);
- }
- else{
- VECCOPY(ca->col, nosel_col);
- }
- }
- }
- }
- else{
- VECCOPY(ca->col, col);
- }
+ VECCOPY(ca->col, col);
}
- /*--modify paths--*/
+ /*--modify paths and calculate rotation & velocity--*/
- VecSubf(vec,(cache[i]+1)->co,cache[i]->co);
+ VecSubf(vec,(cache[p]+1)->co,cache[p]->co);
length = VecLength(vec);
effector= 1.0f;
if(vg_effector)
effector*= psys_particle_value_from_verts(psmd->dm,psys->part->from,pa,vg_effector);
- for(k=0, ca=cache[i]; k<=steps; k++, ca++) {
+ for(k=0, ca=cache[p]; k<=steps; k++, ca++) {
+ if(!(psys->flag & PSYS_GLOBAL_HAIR)) {
/* apply effectors */
- if(!(psys->part->flag & PART_CHILD_EFFECT) && edit==0 && k)
- do_path_effectors(scene, ob, psys, i, ca, k, steps, cache[i]->co, effector, dfra, cfra, &length, vec);
-
- /* apply guide curves to path data */
- if(edit==0 && psys->effectors.first && (psys->part->flag & PART_CHILD_EFFECT)==0)
- /* ca is safe to cast, since only co and vel are used */
- do_guide(scene, (ParticleKey*)ca, i, (float)k/(float)steps, &psys->effectors);
+ if(!(psys->part->flag & PART_CHILD_EFFECT) && k)
+ do_path_effectors(sim, p, ca, k, steps, cache[p]->co, effector, dfra, cfra, &length, vec);
- /* apply lattice */
- if(psys->lattice && edit==0)
- calc_latt_deform(psys->lattice, ca->co, 1.0f);
+ /* apply guide curves to path data */
+ if(psys->effectors.first && (psys->part->flag & PART_CHILD_EFFECT)==0)
+ /* ca is safe to cast, since only co and vel are used */
+ do_guide(sim->scene, (ParticleKey*)ca, p, (float)k/(float)steps, &psys->effectors);
- /* figure out rotation */
-
- if(k) {
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- VECSUB(tangent, ca->co, (ca - 1)->co);
+ /* apply lattice */
+ if(psys->lattice)
+ calc_latt_deform(psys->lattice, ca->co, 1.0f);
- vectoquat(tangent, OB_POSX, OB_POSZ, (ca-1)->rot);
+ /* figure out rotation */
+
+ 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);
+ VECCOPY(prev_tangent, tangent);
+ Normalize(prev_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 */
+ Mat3ToQuat_is_ok(rotmat, (ca-1)->rot);
+ }
+ else {
+ VECSUB(tangent, ca->co, (ca - 1)->co);
+ Normalize(tangent);
- VECCOPY(prev_tangent, tangent);
- Normalize(prev_tangent);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- Normalize(tangent);
+ cosangle= Inpf(tangent, prev_tangent);
- cosangle= Inpf(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);
+ Crossf(normal, prev_tangent, tangent);
+ VecRotToQuat(normal, angle, q);
+ QuatMul((ca - 1)->rot, q, (ca - 2)->rot);
+ }
- /* 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);
- Crossf(normal, prev_tangent, tangent);
- VecRotToQuat(normal, angle, q);
- QuatMul((ca - 1)->rot, q, (ca - 2)->rot);
+ VECCOPY(prev_tangent, tangent);
}
- VECCOPY(prev_tangent, tangent);
+ if(k == steps)
+ QUATCOPY(ca->rot, (ca - 1)->rot);
}
- if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
}
-
/* set velocity */
@@ -2728,28 +2842,6 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra
}
}
-
- if(!edit && !psys->totchild) {
- /* check if path needs to be cut before actual end of data points */
- if(k){
- VECSUB(dvec,ca->co,(ca-1)->co);
- if(part->flag&PART_ABS_LENGTH)
- len=VecLength(dvec);
- else
- len=1.0f/(float)steps;
-
- k=check_path_length(k,cache[i],ca,max_length,&cur_length,len,dvec);
- }
- else{
- /* initialize length calculation */
- if(part->flag&PART_ABS_LENGTH)
- max_length= part->abslength*pa_length;
- else
- max_length= pa_length;
-
- cur_length= 0.0f;
- }
- }
}
}
@@ -2766,6 +2858,123 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra
if(vg_length)
MEM_freeN(vg_length);
}
+void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cfra)
+{
+ ParticleCacheKey *ca, **cache= edit->pathcache;
+ ParticleEditSettings *pset = &scene->toolsettings->particle;
+
+ PTCacheEditPoint *point = edit->points;
+ PTCacheEditKey *ekey = NULL;
+
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
+ ParticleData *pa = psys ? psys->particles : NULL;
+
+ ParticleInterpolationData pind;
+ ParticleKey result;
+
+ float birthtime = 0.0, dietime = 0.0;
+ float t, time = 0.0, keytime = 0.0, frs_sec;
+ float hairmat[4][4];
+ int k,i;
+ int steps = (int)pow(2.0, (double)pset->draw_step);
+ int totpart = edit->totpoint;
+ float sel_col[3];
+ float nosel_col[3];
+
+ steps = MAX2(steps, 4);
+
+ if(!cache || edit->totpoint != edit->totcached) {
+ /* clear out old and create new empty path cache */
+ psys_free_path_cache(edit->psys, edit);
+ cache= edit->pathcache= psys_alloc_path_cache_buffers(&edit->pathcachebufs, totpart, steps+1);
+ }
+
+ frs_sec = (psys || edit->pid.flag & PTCACHE_VEL_PER_SEC) ? 25.0f : 1.0f;
+
+ sel_col[0] = (float)edit->sel_col[0] / 255.0f;
+ sel_col[1] = (float)edit->sel_col[1] / 255.0f;
+ sel_col[2] = (float)edit->sel_col[2] / 255.0f;
+ nosel_col[0] = (float)edit->nosel_col[0] / 255.0f;
+ nosel_col[1] = (float)edit->nosel_col[1] / 255.0f;
+ nosel_col[2] = (float)edit->nosel_col[2] / 255.0f;
+
+ /*---first main loop: create all actual particles' paths---*/
+ for(i=0; i<totpart; i++, pa+=pa?1:0, point++){
+ if(edit->totcached && !(point->flag & PEP_EDIT_RECALC))
+ continue;
+
+ ekey = point->keys;
+
+ pind.keyed = 0;
+ pind.cache = NULL;
+ pind.epoint = point;
+ pind.bspline = psys ? (psys->part->flag & PART_HAIR_BSPLINE) : 0;
+ pind.dm = NULL;
+
+ memset(cache[i], 0, sizeof(*cache[i])*(steps+1));
+
+ cache[i]->steps = steps;
+
+ /*--get the first data points--*/
+ init_particle_interpolation(ob, psys, pa, &pind);
+
+ if(psys)
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+
+ birthtime = pind.birthtime;
+ dietime = pind.dietime;
+
+ if(birthtime >= dietime) {
+ cache[i]->steps = -1;
+ continue;
+ }
+
+ /*--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);
+
+ /* non-hair points are allready in global space */
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR))
+ Mat4MulVecfl(hairmat, result.co);
+
+ VECCOPY(ca->co, result.co);
+
+ ca->vel[0] = ca->vel[1] = 0.0f;
+ ca->vel[1] = 1.0f;
+
+ /* selection coloring in edit mode */
+ if((ekey + (pind.ekey[0] - point->keys))->flag & PEK_SELECT){
+ if((ekey + (pind.ekey[1] - point->keys))->flag & PEK_SELECT){
+ VECCOPY(ca->col, sel_col);
+ }
+ else{
+ keytime = (t - (*pind.ekey[0]->time))/((*pind.ekey[1]->time) - (*pind.ekey[0]->time));
+ VecLerpf(ca->col, sel_col, nosel_col, keytime);
+ }
+ }
+ else{
+ if((ekey + (pind.ekey[1] - point->keys))->flag & PEK_SELECT){
+ keytime = (t - (*pind.ekey[0]->time))/((*pind.ekey[1]->time) - (*pind.ekey[0]->time));
+ VecLerpf(ca->col, nosel_col, sel_col, keytime);
+ }
+ else{
+ VECCOPY(ca->col, nosel_col);
+ }
+ }
+
+ ca->time = t;
+ }
+ }
+
+ edit->totcached = totpart;
+}
/************************************************/
/* Particle Key handling */
/************************************************/
@@ -2778,15 +2987,6 @@ void copy_particle_key(ParticleKey *to, ParticleKey *from, int time){
memcpy(to,from,sizeof(ParticleKey));
to->time=to_time;
}
- /*
- VECCOPY(to->co,from->co);
- VECCOPY(to->vel,from->vel);
- QUATCOPY(to->rot,from->rot);
- if(time)
- to->time=from->time;
- to->flag=from->flag;
- to->sbw=from->sbw;
- */
}
void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, float *time){
if(loc) VECCOPY(loc,key->co);
@@ -2795,23 +2995,7 @@ void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, flo
if(time) *time=key->time;
}
/*-------changing particle keys from space to another-------*/
-void psys_key_to_object(Object *ob, ParticleKey *key, float imat[][4]){
- float q[4], imat2[4][4];
-
- if(imat==0){
- Mat4Invert(imat2,ob->obmat);
- imat=imat2;
- }
-
- VECADD(key->vel,key->vel,key->co);
-
- Mat4MulVecfl(imat,key->co);
- Mat4MulVecfl(imat,key->vel);
- Mat4ToQuat(imat,q);
-
- VECSUB(key->vel,key->vel,key->co);
- QuatMul(key->rot,q,key->rot);
-}
+#if 0
static void key_from_object(Object *ob, ParticleKey *key){
float q[4];
@@ -2824,6 +3008,7 @@ static void key_from_object(Object *ob, ParticleKey *key){
VECSUB(key->vel,key->vel,key->co);
QuatMul(key->rot,q,key->rot);
}
+#endif
static void triatomat(float *v1, float *v2, float *v3, float (*uv)[2], float mat[][4])
{
@@ -2940,17 +3125,78 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
/************************************************/
/* ParticleSettings handling */
/************************************************/
+void object_add_particle_system(Scene *scene, Object *ob)
+{
+ ParticleSystem *psys;
+ ModifierData *md;
+ ParticleSystemModifierData *psmd;
+
+ if(!ob || ob->type != OB_MESH)
+ return;
+
+ psys = ob->particlesystem.first;
+ for(; psys; psys=psys->next)
+ psys->flag &= ~PSYS_CURRENT;
+
+ psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+ psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
+ BLI_addtail(&ob->particlesystem, psys);
+
+ psys->part = psys_new_settings("ParticleSettings", NULL);
+
+ if(BLI_countlist(&ob->particlesystem)>1)
+ sprintf(psys->name, "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
+ else
+ strcpy(psys->name, "ParticleSystem");
+
+ md= modifier_new(eModifierType_ParticleSystem);
+ sprintf(md->name, "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
+ psmd= (ParticleSystemModifierData*) md;
+ psmd->psys=psys;
+ BLI_addtail(&ob->modifiers, md);
+
+ psys->totpart=0;
+ psys->flag = PSYS_ENABLED|PSYS_CURRENT;
+ psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
+
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+}
+void object_remove_particle_system(Scene *scene, Object *ob)
+{
+ ParticleSystem *psys = psys_get_current(ob);
+ ParticleSystemModifierData *psmd;
+
+ if(!psys)
+ return;
+
+ /* clear modifier */
+ psmd= psys_get_modifier(ob, psys);
+ BLI_remlink(&ob->modifiers, psmd);
+ modifier_free((ModifierData *)psmd);
+
+ /* clear particle system */
+ BLI_remlink(&ob->particlesystem, psys);
+ psys_free(ob,psys);
+
+ if(ob->particlesystem.first)
+ ((ParticleSystem *) ob->particlesystem.first)->flag |= PSYS_CURRENT;
+
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+}
static void default_particle_settings(ParticleSettings *part)
{
int i;
part->type= PART_EMITTER;
part->distr= PART_DISTR_JIT;
- part->draw_as=PART_DRAW_DOT;
+ part->draw_as = PART_DRAW_REND;
+ part->ren_as = PART_DRAW_HALO;
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->flag=PART_REACT_MULTIPLE|PART_HAIR_GEOMETRY|PART_EDISTR|PART_TRAND;
part->sta= 1.0;
part->end= 100.0;
@@ -2959,8 +3205,6 @@ static void default_particle_settings(ParticleSettings *part)
part->totpart= 1000;
part->grid_res= 10;
part->timetweak= 1.0;
- part->keyed_time= 0.5;
- //part->userjit;
part->integrator= PART_INT_MIDPOINT;
part->phystype= PART_PHYS_NEWTON;
@@ -2974,19 +3218,13 @@ static void default_particle_settings(ParticleSettings *part)
part->reactevent= PART_EVENT_DEATH;
part->disp=100;
part->from= PART_FROM_FACE;
- part->length= 1.0;
- part->nbetween= 4;
- part->boidneighbours= 5;
- part->max_vel = 10.0f;
- part->average_vel = 0.3f;
- part->max_tan_acc = 0.2f;
- part->max_lat_acc = 1.0f;
+ part->normfac= 1.0f;
part->reactshape=1.0f;
part->mass=1.0;
- part->size=1.0;
+ part->size=0.05;
part->childsize=1.0;
part->child_nbr=10;
@@ -3001,15 +3239,19 @@ static void default_particle_settings(ParticleSettings *part)
part->rough2_size=1.0;
part->rough_end_shape=1.0;
+ part->clength=1.0f;
+ part->clength_thres=0.0f;
+
+ part->draw= PART_DRAW_EMITTER|PART_DRAW_MAT_COL;
part->draw_line[0]=0.5;
+ part->path_start = 0.0f;
+ part->path_end = 1.0f;
- part->banking=1.0;
- part->max_bank=1.0;
+ part->keyed_loops = 1;
+
+ for(i=0; i<10; i++)
+ part->effector_weight[i]=1.0f;
- for(i=0; i<BOID_TOT_RULES; i++){
- part->boidrule[i]=(char)i;
- part->boidfac[i]=0.5;
- }
#if 0 // XXX old animation system
part->ipo = NULL;
@@ -3026,6 +3268,9 @@ ParticleSettings *psys_new_settings(char *name, Main *main)
{
ParticleSettings *part;
+ if(main==NULL)
+ main = G.main;
+
part= alloc_libblock(&main->particle, ID_PA, name);
default_particle_settings(part);
@@ -3040,6 +3285,8 @@ ParticleSettings *psys_copy_settings(ParticleSettings *part)
partn= copy_libblock(part);
if(partn->pd) partn->pd= MEM_dupallocN(part->pd);
if(partn->pd2) partn->pd2= MEM_dupallocN(part->pd2);
+
+ partn->boids = boid_copy_settings(part->boids);
return partn;
}
@@ -3116,45 +3363,10 @@ void psys_flush_particle_settings(Scene *scene, ParticleSettings *part, int reca
}
}
if(flush)
- DAG_object_flush_update(scene, base->object, OB_RECALC_DATA);
+ DAG_id_flush_update(&base->object->id, OB_RECALC_DATA);
}
}
-LinkNode *psys_using_settings(struct Scene *scene, ParticleSettings *part, int flush_update)
-{
- Object *ob, *tob;
- ParticleSystem *psys, *tpsys;
- LinkNode *node= NULL;
- int found;
-
- /* update all that have same particle settings */
- for(ob=G.main->object.first; ob; ob=ob->id.next) {
- found= 0;
-
- for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- if(psys->part == part) {
- BLI_linklist_append(&node, psys);
- found++;
- }
- else if(psys->part->type == PART_REACTOR){
- tob= (psys->target_ob)? psys->target_ob: ob;
- tpsys= BLI_findlink(&tob->particlesystem, psys->target_psys-1);
-
- if(tpsys && tpsys->part==part) {
- BLI_linklist_append(&node, tpsys);
- found++;
- }
- }
- }
-
- if(flush_update && found)
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- }
-
- return node;
-}
-
-
/************************************************/
/* Textures */
/************************************************/
@@ -3235,7 +3447,7 @@ static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float
if((event & mtex->pmapto) & MAP_PA_KINK)
ptex->kink= texture_value_blend(def,ptex->kink,value,var,blend,neg & MAP_PA_KINK);
if((event & mtex->pmapto) & MAP_PA_ROUGH)
- ptex->rough= texture_value_blend(def,ptex->rough,value,var,blend,neg & MAP_PA_ROUGH);
+ ptex->rough1= ptex->rough2= ptex->roughe= texture_value_blend(def,ptex->rough1,value,var,blend,neg & MAP_PA_ROUGH);
if((event & mtex->pmapto) & MAP_PA_DENS)
ptex->exist= texture_value_blend(def,ptex->exist,value,var,blend,neg & MAP_PA_DENS);
}
@@ -3244,10 +3456,14 @@ static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float
if(event & MAP_PA_LENGTH) { CLAMP(ptex->length,0.0,1.0); }
if(event & MAP_PA_CLUMP) { CLAMP(ptex->clump,0.0,1.0); }
if(event & MAP_PA_KINK) { CLAMP(ptex->kink,0.0,1.0); }
- if(event & MAP_PA_ROUGH) { CLAMP(ptex->rough,0.0,1.0); }
+ if(event & MAP_PA_ROUGH) {
+ CLAMP(ptex->rough1,0.0,1.0);
+ CLAMP(ptex->rough2,0.0,1.0);
+ CLAMP(ptex->roughe,0.0,1.0);
+ }
if(event & MAP_PA_DENS) { CLAMP(ptex->exist,0.0,1.0); }
}
-void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd, ParticleSystem *psys, ParticleData *pa, ParticleTexture *ptex, int event)
+void psys_get_texture(ParticleSimulationData *sim, Material *ma, ParticleData *pa, ParticleTexture *ptex, int event)
{
MTex *mtex;
int m;
@@ -3262,14 +3478,14 @@ void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd
short blend=mtex->blendtype;
short neg=mtex->pmaptoneg;
- if((mtex->texco & TEXCO_UV) && ELEM(psys->part->from, PART_FROM_FACE, PART_FROM_VOLUME)) {
- if(!get_particle_uv(psmd->dm, pa, 0, pa->fuv, mtex->uvname, texco)) {
+ if((mtex->texco & TEXCO_UV) && ELEM(sim->psys->part->from, PART_FROM_FACE, PART_FROM_VOLUME)) {
+ if(!get_particle_uv(sim->psmd->dm, pa, 0, pa->fuv, mtex->uvname, texco)) {
/* failed to get uv's, let's try orco's */
- psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
+ psys_particle_on_emitter(sim->psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
}
}
else {
- psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
+ psys_particle_on_emitter(sim->psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
}
externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
@@ -3314,43 +3530,16 @@ void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd
/************************************************/
/* Particle State */
/************************************************/
-float psys_get_timestep(ParticleSettings *part)
+float psys_get_timestep(ParticleSimulationData *sim)
{
- return 0.04f*part->timetweak;
-}
-/* part->size should be updated with possible ipo effection before this is called */
-float psys_get_size(Object *ob, Material *ma, ParticleSystemModifierData *psmd, IpoCurve *icu_size, ParticleSystem *psys, ParticleSettings *part, ParticleData *pa, float *vg_size)
-{
- ParticleTexture ptex;
- float size=1.0f;
-
- if(ma && part->from!=PART_FROM_PARTICLE){
- ptex.size=size;
- psys_get_texture(ob,ma,psmd,psys,pa,&ptex,MAP_PA_SIZE);
- size=ptex.size;
- }
-
-#if 0 // XXX old animation system
- if(icu_size){
- calc_icu(icu_size,pa->time);
- size*=icu_size->curval;
- }
-#endif // XXX old animation system
-
- if(vg_size)
- size*=psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_size);
-
- if(part->randsize!=0.0)
- size*= 1.0f - part->randsize*pa->sizemul;
-
- return size*part->size;
+ return 0.04f * sim->psys->part->timetweak;
}
-float psys_get_child_time(ParticleSystem *psys, ChildParticle *cpa, float cfra)
+float psys_get_child_time(ParticleSystem *psys, ChildParticle *cpa, float cfra, float *birthtime, float *dietime)
{
ParticleSettings *part = psys->part;
+ float time, life;
if(part->childtype==PART_CHILD_FACES){
- float time;
int w=0;
time=0.0;
while(w<4 && cpa->pa[w]>=0){
@@ -3358,12 +3547,21 @@ float psys_get_child_time(ParticleSystem *psys, ChildParticle *cpa, float cfra)
w++;
}
- return (cfra-time)/(part->lifetime*(1.0f-part->randlife*cpa->rand[1]));
+ life = part->lifetime * (1.0f - part->randlife * PSYS_FRAND(cpa - psys->child + 25));
}
else{
ParticleData *pa = psys->particles + cpa->parent;
- return (cfra-pa->time)/pa->lifetime;
+
+ time = pa->time;
+ life = pa->lifetime;
}
+
+ if(birthtime)
+ *birthtime = time;
+ if(dietime)
+ *dietime = time+life;
+
+ return (cfra-time)/life;
}
float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float cfra, float *pa_time)
{
@@ -3380,7 +3578,7 @@ float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float cfra,
if(pa_time)
time=*pa_time;
else
- time=psys_get_child_time(psys,cpa,cfra);
+ time=psys_get_child_time(psys,cpa,cfra,NULL,NULL);
/* correction for lifetime */
calc_ipo(part->ipo, 100*time);
@@ -3398,32 +3596,100 @@ float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float cfra,
size*=part->childsize;
if(part->childrandsize!=0.0)
- size *= 1.0f - part->childrandsize*cpa->rand[2];
+ size *= 1.0f - part->childrandsize * PSYS_FRAND(cpa - psys->child + 26);
return size;
}
+static void get_child_modifier_parameters(ParticleSettings *part, ParticleThreadContext *ctx, ChildParticle *cpa, short cpa_from, int cpa_num, float *cpa_fuv, float *orco, ParticleTexture *ptex)
+{
+ ParticleSystem *psys = ctx->sim.psys;
+ int i = cpa - psys->child;
+
+ ptex->length= 1.0f - part->randlength * PSYS_FRAND(i + 26);
+ ptex->clump=1.0;
+ ptex->kink=1.0;
+ ptex->rough1= 1.0;
+ ptex->rough2= 1.0;
+ ptex->roughe= 1.0;
+ ptex->exist= 1.0;
+ ptex->effector= 1.0;
+
+ ptex->length*= part->clength_thres < PSYS_FRAND(i + 27) ? part->clength : 1.0f;
+
+ get_cpa_texture(ctx->dm,ctx->ma,cpa_num,cpa_fuv,orco,ptex,
+ MAP_PA_DENS|MAP_PA_LENGTH|MAP_PA_CLUMP|MAP_PA_KINK|MAP_PA_ROUGH);
+
+
+ if(ptex->exist < PSYS_FRAND(i + 24))
+ return;
+
+ if(ctx->vg_length)
+ ptex->length*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_length);
+ if(ctx->vg_clump)
+ ptex->clump*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_clump);
+ if(ctx->vg_kink)
+ ptex->kink*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_kink);
+ if(ctx->vg_rough1)
+ ptex->rough1*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough1);
+ if(ctx->vg_rough2)
+ ptex->rough2*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_rough2);
+ if(ctx->vg_roughe)
+ ptex->roughe*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_roughe);
+ if(ctx->vg_effector)
+ ptex->effector*=psys_interpolate_value_from_verts(ctx->dm,cpa_from,cpa_num,cpa_fuv,ctx->vg_effector);
+}
+static void do_child_modifiers(ParticleSimulationData *sim, ParticleTexture *ptex, ParticleKey *par, float *par_rot, ChildParticle *cpa, float *orco, float mat[4][4], ParticleKey *state, float t)
+{
+ ParticleSettings *part = sim->psys->part;
+ int i = cpa - sim->psys->child;
+ int guided = 0;
+
+ if(part->flag & PART_CHILD_EFFECT)
+ /* state is safe to cast, since only co and vel are used */
+ guided = do_guide(sim->scene, (ParticleKey*)state, cpa->parent, t, &(sim->psys->effectors));
+
+ 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);
+ }
+
+ 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(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(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);
+}
/* get's hair (or keyed) particles state at the "path time" specified in state->time */
-void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, int p, ParticleKey *state, int vel)
+void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *state, int vel)
{
- ParticleSettings *part = psys->part;
- ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
- Material *ma = give_current_material(ob, part->omat);
+ PARTICLE_PSMD;
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = sim->psys->part;
+ Material *ma = give_current_material(sim->ob, part->omat);
ParticleData *pa;
ChildParticle *cpa;
ParticleTexture ptex;
- ParticleKey *kkey[2] = {NULL, NULL};
- HairKey *hkey[2] = {NULL, NULL};
- ParticleKey *par=0, keys[4];
+ ParticleKey *par=0, keys[4], tstate;
+ ParticleThreadContext ctx; /* fake thread context for child modifiers */
+ ParticleInterpolationData pind;
- float t, real_t, dfra, keytime, frs_sec = scene->r.frs_sec;
+ float t, frs_sec = sim->scene->r.frs_sec;
float co[3], orco[3];
float hairmat[4][4];
- float pa_clump = 0.0, pa_kink = 0.0;
int totparent = 0;
int totpart = psys->totpart;
int totchild = psys->totchild;
short between = 0, edit = 0;
+ int keyed = part->phystype & PART_PHYS_KEYED && psys->flag & PSYS_KEYED;
+ int cached = !keyed && part->type != PART_HAIR;
+
float *cpa_fuv; int cpa_num; short cpa_from;
//if(psys_in_edit_mode(scene, psys)){
@@ -3432,123 +3698,26 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
// edit=1;
//}
- /* user want's cubic interpolation but only without sb it possible */
- //if(interpolation==PART_INTER_CUBIC && baked && psys->softflag==OB_SB_ENABLE)
- // interpolation=PART_INTER_BSPLINE;
- //else if(baked==0) /* it doesn't make sense to use other types for keyed */
- // interpolation=PART_INTER_CUBIC;
-
t=state->time;
CLAMP(t, 0.0, 1.0);
if(p<totpart){
pa = psys->particles + p;
-
- if(pa->alive==PARS_DEAD && part->flag & PART_STICKY && pa->flag & PARS_STICKY && pa->stick_ob){
- copy_particle_key(state,&pa->state,0);
- key_from_object(pa->stick_ob,state);
- return;
- }
-
- if(psys->flag & PSYS_KEYED) {
- kkey[0] = pa->keys;
- kkey[1] = kkey[0] + 1;
-
- real_t = kkey[0]->time + t * (kkey[0][pa->totkey-1].time - kkey[0]->time);
- }
- else {
- hkey[0] = pa->hair;
- hkey[1] = pa->hair + 1;
-
- real_t = hkey[0]->time + (hkey[0][pa->totkey-1].time - hkey[0]->time) * t;
- }
-
- if(psys->flag & PSYS_KEYED) {
- while(kkey[1]->time < real_t) {
- kkey[1]++;
- }
- kkey[0] = kkey[1] - 1;
-
- memcpy(keys + 1, kkey[0], sizeof(ParticleKey));
- memcpy(keys + 2, kkey[1], sizeof(ParticleKey));
- }
- else {
- while(hkey[1]->time < real_t)
- hkey[1]++;
-
- hkey[0] = hkey[1] - 1;
-
- hair_to_particle(keys + 1, hkey[0]);
- hair_to_particle(keys + 2, hkey[1]);
- }
-
- if((psys->flag & PSYS_KEYED)==0) {
- //if(soft){
- // if(key[0] != sbel.keys)
- // DB_copy_key(&k1,key[0]-1);
- // else
- // DB_copy_key(&k1,&k2);
- //}
- //else{
- if(hkey[0] != pa->hair)
- hair_to_particle(keys, hkey[0] - 1);
- else
- hair_to_particle(keys, hkey[0]);
- //}
-
- //if(soft){
- // if(key[1] != sbel.keys + sbel.totkey-1)
- // DB_copy_key(&k4,key[1]+1);
- // else
- // DB_copy_key(&k4,&k3);
- //}
- //else {
- if(hkey[1] != pa->hair + pa->totkey - 1)
- hair_to_particle(keys + 3, hkey[1] + 1);
- else
- hair_to_particle(keys + 3, hkey[1]);
- }
- //}
-
- //psys_get_particle_on_path(scene, bsys,p,t,bkey,ckey[0]);
-
- //if(part->rotfrom==PART_ROT_KEYS)
- // QuatInterpol(state->rot,k2.rot,k3.rot,keytime);
- //else{
- // /* TODO: different rotations */
- // float nvel[3];
- // VECCOPY(nvel,state->vel);
- // VecMulf(nvel,-1.0f);
- // vectoquat(nvel, OB_POSX, OB_POSZ, state->rot);
- //}
-
- dfra = keys[2].time - keys[1].time;
-
- keytime = (real_t - keys[1].time) / dfra;
-
- /* convert velocity to timestep size */
- if(psys->flag & PSYS_KEYED){
- VecMulf(keys[1].vel, dfra / frs_sec);
- VecMulf(keys[2].vel, dfra / frs_sec);
- QuatInterpol(state->rot,keys[1].rot,keys[2].rot,keytime);
- }
-
- psys_interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */
- : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL)
- ,keys, keytime, state, 1);
-
- /* the velocity needs to be converted back from cubic interpolation */
- if(psys->flag & PSYS_KEYED){
- VecMulf(state->vel, frs_sec / dfra);
- }
- else {
+ pind.keyed = keyed;
+ pind.cache = cached ? psys->pointcache : NULL;
+ pind.epoint = NULL;
+ pind.dm = psys->hair_out_dm;
+ init_particle_interpolation(sim->ob, psys, pa, &pind);
+ do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, state);
+
+ if(!keyed && !cached) {
if((pa->flag & PARS_REKEY)==0) {
- psys_mat_hair_to_global(ob, psmd->dm, part->from, pa, hairmat);
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, part->from, pa, hairmat);
Mat4MulVecfl(hairmat, state->co);
Mat4Mul3Vecfl(hairmat, state->vel);
if(psys->effectors.first && (part->flag & PART_CHILD_GUIDE)==0) {
- do_guide(scene, state, p, state->time, &psys->effectors);
+ do_guide(sim->scene, state, p, state->time, &psys->effectors);
/* TODO: proper velocity handling */
}
@@ -3559,8 +3728,11 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
}
else if(totchild){
//Mat4Invert(imat,ob->obmat);
-
+
cpa=psys->child+p-totpart;
+
+ if(state->time < 0.0f)
+ 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);
@@ -3577,8 +3749,8 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
/* get parent states */
while(w<4 && cpa->pa[w]>=0){
- keys[w].time = t;
- psys_get_particle_on_path(scene, ob, psys, cpa->pa[w], keys+w, 1);
+ keys[w].time = state->time;
+ psys_get_particle_on_path(sim, cpa->pa[w], keys+w, 1);
w++;
}
@@ -3586,8 +3758,6 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
cpa_num=cpa->num;
foffset= cpa->foffset;
- if(part->childtype == PART_CHILD_FACES)
- foffset = -(2.0f + part->childspread);
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
@@ -3598,13 +3768,16 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
//Mat4MulVecfl(ob->obmat,cpa_1st);
+ pa = psys->particles + cpa->parent;
+
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+
pa=0;
}
else{
/* get the parent state */
-
- keys->time = t;
- psys_get_particle_on_path(scene, ob, psys, cpa->parent, keys,1);
+ keys->time = state->time;
+ psys_get_particle_on_path(sim, cpa->parent, keys,1);
/* get the original coordinates (orco) for texture usage */
pa=psys->particles+cpa->parent;
@@ -3614,6 +3787,8 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
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);
}
/* correct child ipo timing */
@@ -3625,15 +3800,11 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
#endif // XXX old animation system
/* get different child parameters from textures & vgroups */
- ptex.clump=1.0;
- ptex.kink=1.0;
-
- get_cpa_texture(psmd->dm,ma,cpa_num,cpa_fuv,orco,&ptex,MAP_PA_CLUMP|MAP_PA_KINK);
-
- pa_clump=ptex.clump;
- pa_kink=ptex.kink;
-
- /* TODO: vertex groups */
+ memset(&ctx, 0, sizeof(ParticleThreadContext));
+ ctx.dm = psmd->dm;
+ ctx.ma = ma;
+ /* TODO: assign vertex groups */
+ get_child_modifier_parameters(part, &ctx, cpa, cpa_from, cpa_num, cpa_fuv, orco, &ptex);
if(between){
int w=0;
@@ -3661,181 +3832,158 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i
}
par = keys;
- //if(totparent){
- // if(p-totpart>=totparent){
- // key.time=t;
- // psys_get_particle_on_path(ob,psys,totpart+cpa->parent,&key,1);
- // bti->convert_dynamic_key(bsys,&key,par,cpar);
- // }
- // else
- // par=0;
- //}
- //else
- // DB_get_key_on_path(bsys,cpa->parent,t,par,cpar);
-
- /* apply different deformations to the child path */
- if(part->kink)
- do_prekink(state, par, par->rot, t, part->kink_freq * pa_kink, part->kink_shape,
- part->kink_amp, part->kink, part->kink_axis, ob->obmat);
-
- do_clump(state, par, t, part->clumpfac, part->clumppow, 1.0f);
- if(part->rough1 != 0.0)
- do_rough(orco, t, part->rough1, part->rough1_size, 0.0, state);
+ if(vel)
+ copy_particle_key(&tstate, state, 1);
- if(part->rough2 != 0.0)
- do_rough(cpa->rand, t, part->rough2, part->rough2_size, part->rough2_thres, state);
-
- if(part->rough_end != 0.0)
- do_rough_end(cpa->rand, t, part->rough_end, part->rough_end_shape, state, par);
+ /* apply different deformations to the child path */
+ do_child_modifiers(sim, &ptex, par, par->rot, cpa, orco, hairmat, state, t);
+
+ /* try to estimate correct velocity */
+ if(vel){
+ ParticleKey tstate;
+ float length = VecLength(state->vel);
+
+ if(t>=0.001f){
+ tstate.time=t-0.001f;
+ psys_get_particle_on_path(sim,p,&tstate,0);
+ VECSUB(state->vel,state->co,tstate.co);
+ Normalize(state->vel);
+ }
+ else{
+ tstate.time=t+0.001f;
+ psys_get_particle_on_path(sim,p,&tstate,0);
+ VECSUB(state->vel,tstate.co,state->co);
+ Normalize(state->vel);
+ }
- //if(vel){
- // if(t>=0.001f){
- // tstate.time=t-0.001f;
- // psys_get_particle_on_path(scene,ob,psys,p,&tstate,0);
- // VECSUB(state->vel,state->co,tstate.co);
- // }
- // else{
- // tstate.time=t+0.001f;
- // psys_get_particle_on_path(scene, ob,psys,p,&tstate,0);
- // VECSUB(state->vel,tstate.co,state->co);
- // }
- //}
+ VecMulf(state->vel, length);
+ }
}
}
/* gets particle's state at a time, returns 1 if particle exists and can be seen and 0 if not */
-int psys_get_particle_state(struct Scene *scene, Object *ob, ParticleSystem *psys, int p, ParticleKey *state, int always){
- ParticleSettings *part=psys->part;
- ParticleData *pa=0;
+int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *state, int always){
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
+ ParticleData *pa = NULL;
+ ChildParticle *cpa = NULL;
float cfra;
- int totpart=psys->totpart, between=0;
+ int totpart = psys->totpart;
/* negative time means "use current time" */
- if(state->time>0)
- cfra=state->time;
- else
- cfra= bsystem_time(scene, 0, (float)scene->r.cfra,0.0);
+ cfra = state->time > 0 ? state->time : bsystem_time(sim->scene, 0, (float)sim->scene->r.cfra, 0.0);
- if(psys->totchild && p>=totpart){
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- between=1;
+ if(p>=totpart){
+ if(!psys->totchild)
+ return 0;
+
+ if(part->from != PART_FROM_PARTICLE && part->childtype == PART_CHILD_FACES){
+ if(!(psys->flag & PSYS_KEYED))
+ return 0;
+
+ cpa = psys->child + p - totpart;
+
+ state->time = psys_get_child_time(psys, cpa, cfra, NULL, NULL);
+
+ if(!always)
+ if((state->time < 0.0 && !(part->flag & PART_UNBORN))
+ || (state->time > 1.0 && !(part->flag & PART_DIED)))
+ return 0;
+
+ state->time= (cfra - (part->sta + (part->end - part->sta) * PSYS_FRAND(p + 23))) / (part->lifetime * PSYS_FRAND(p + 24));
+
+ psys_get_particle_on_path(sim, p, state,1);
+ return 1;
+ }
+ else {
+ cpa = sim->psys->child + p - totpart;
+ pa = sim->psys->particles + cpa->parent;
}
- else
- pa=psys->particles+(psys->child+p-totpart)->parent;
}
- else
- pa=psys->particles+p;
+ else {
+ pa = sim->psys->particles + p;
+ }
- if(between){
- state->time = psys_get_child_time(psys,&psys->child[p-totpart],cfra);
+ if(pa) {
+ if(pa->alive == PARS_KILLED) return 0;
- if(always==0)
- if((state->time<0.0 && (part->flag & PART_UNBORN)==0)
- || (state->time>1.0 && (part->flag & PART_DIED)==0))
- return 0;
- }
- else{
- if(pa->alive==PARS_KILLED) return 0;
- if(always==0)
+ if(!always)
if((pa->alive==PARS_UNBORN && (part->flag & PART_UNBORN)==0)
|| (pa->alive==PARS_DEAD && (part->flag & PART_DIED)==0))
return 0;
- }
- if(psys->flag & PSYS_KEYED){
- if(between){
- ChildParticle *cpa=psys->child+p-totpart;
- state->time= (cfra-(part->sta+(part->end-part->sta)*cpa->rand[0]))/(part->lifetime*cpa->rand[1]);
- }
- else
- state->time= (cfra-pa->time)/(pa->dietime-pa->time);
+ state->time = MIN2(state->time, pa->dietime);
+ }
- psys_get_particle_on_path(scene, ob, psys, p, state,1);
+ if(sim->psys->flag & PSYS_KEYED){
+ state->time= -cfra;
+ psys_get_particle_on_path(sim, p, state,1);
return 1;
}
else{
- if(between)
- return 0; /* currently not supported */
- else if(psys->totchild && p>=psys->totpart){
- ChildParticle *cpa=psys->child+p-psys->totpart;
- ParticleKey *key1, skey;
+ if(cpa){
+ ParticleKey *key1;
float t = (cfra - pa->time + pa->loop * pa->lifetime) / pa->lifetime;
- pa = psys->particles + cpa->parent;
-
- if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob) {
- key1 = &skey;
- copy_particle_key(key1,&pa->state,0);
- key_from_object(pa->stick_ob,key1);
- }
- else {
- key1=&pa->state;
- }
-
+ key1=&pa->state;
offset_child(cpa, key1, 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,ob->obmat);
+ 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);
if(psys->lattice)
- calc_latt_deform(psys->lattice, state->co,1.0f);
+ calc_latt_deform(sim->psys->lattice, state->co,1.0f);
}
else{
- if (pa) { /* TODO PARTICLE - should this ever be NULL? - Campbell */
- if(pa->state.time==state->time || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED))
- copy_particle_key(state, &pa->state, 1);
- else if(pa->prev_state.time==state->time)
- copy_particle_key(state, &pa->prev_state, 1);
- else {
- /* let's interpolate to try to be as accurate as possible */
- if(pa->state.time + 1.0f > state->time && pa->prev_state.time - 1.0f < state->time) {
- ParticleKey keys[4];
- float dfra, keytime, frs_sec = scene->r.frs_sec;
+ if(pa->state.time==state->time || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED))
+ copy_particle_key(state, &pa->state, 1);
+ else if(pa->prev_state.time==state->time)
+ copy_particle_key(state, &pa->prev_state, 1);
+ else {
+ /* let's interpolate to try to be as accurate as possible */
+ if(pa->state.time + 1.0f > state->time && pa->prev_state.time - 1.0f < state->time) {
+ ParticleKey keys[4];
+ float dfra, keytime, frs_sec = sim->scene->r.frs_sec;
- 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);
+ 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);
- }
- else {
- copy_particle_key(keys+1, &pa->prev_state, 1);
- copy_particle_key(keys+2, &pa->state, 1);
+ VECADDFAC(state->co, state->co, state->vel, (state->time-pa->state.time)/frs_sec);
+ }
+ else {
+ copy_particle_key(keys+1, &pa->prev_state, 1);
+ copy_particle_key(keys+2, &pa->state, 1);
- dfra = keys[2].time - keys[1].time;
+ dfra = keys[2].time - keys[1].time;
- keytime = (state->time - keys[1].time) / dfra;
+ keytime = (state->time - keys[1].time) / dfra;
- /* convert velocity to timestep size */
- VecMulf(keys[1].vel, dfra / frs_sec);
- VecMulf(keys[2].vel, dfra / frs_sec);
-
- psys_interpolate_particle(-1, keys, keytime, state, 1);
-
- /* convert back to real velocity */
- VecMulf(state->vel, frs_sec / dfra);
+ /* convert velocity to timestep size */
+ VecMulf(keys[1].vel, dfra / frs_sec);
+ VecMulf(keys[2].vel, dfra / frs_sec);
+
+ psys_interpolate_particle(-1, keys, keytime, state, 1);
+
+ /* convert back to real velocity */
+ VecMulf(state->vel, frs_sec / dfra);
- VecLerpf(state->ave, keys[1].ave, keys[2].ave, keytime);
- QuatInterpol(state->rot, keys[1].rot, keys[2].rot, keytime);
- }
- }
- 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);
+ VecLerpf(state->ave, keys[1].ave, keys[2].ave, keytime);
+ QuatInterpol(state->rot, keys[1].rot, keys[2].rot, keytime);
}
}
-
- if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob){
- key_from_object(pa->stick_ob,state);
+ 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);
}
-
- if(psys->lattice)
- calc_latt_deform(psys->lattice, state->co,1.0f);
}
+
+ if(sim->psys->lattice)
+ calc_latt_deform(sim->psys->lattice, state->co,1.0f);
}
return 1;
@@ -3891,8 +4039,11 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo
}
}
-void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
+void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
{
+ Object *ob = sim->ob;
+ ParticleSystem *psys = sim->psys;
+ ParticleSystemModifierData *psmd = sim->psmd;
float loc[3], nor[3], vec[3], side[3], len, obrotmat[4][4], qmat[4][4];
float xvec[3] = {-1.0, 0.0, 0.0}, q[4];
@@ -3900,7 +4051,7 @@ void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSys
len= Normalize(vec);
if(pa)
- psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
+ psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
else
psys_particle_on_emitter(psmd,
(psys->part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 97b1956bba9..1b6d56e6459 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -37,6 +37,7 @@
#include "MEM_guardedalloc.h"
+#include "DNA_boid_types.h"
#include "DNA_particle_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -49,6 +50,7 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
#include "DNA_ipo_types.h" // XXX old animation system stuff... to be removed!
+#include "DNA_listBase.h"
#include "BLI_rand.h"
#include "BLI_jitter.h"
@@ -60,6 +62,7 @@
#include "BLI_threads.h"
#include "BKE_anim.h"
+#include "BKE_boids.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_collision.h"
#include "BKE_displist.h"
@@ -70,7 +73,7 @@
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_material.h"
-#include "BKE_softbody.h"
+#include "BKE_cloth.h"
#include "BKE_depsgraph.h"
#include "BKE_lattice.h"
#include "BKE_pointcache.h"
@@ -111,10 +114,7 @@ static int get_current_display_percentage(ParticleSystem *psys)
return 100;
if(part->phystype==PART_PHYS_KEYED){
- if(psys->flag & PSYS_FIRST_KEYED)
- return psys->part->disp;
- else
- return 100;
+ return psys->part->disp;
}
else
return psys->part->disp;
@@ -122,22 +122,11 @@ static int get_current_display_percentage(ParticleSystem *psys)
void psys_reset(ParticleSystem *psys, int mode)
{
- ParticleSettings *part= psys->part;
- ParticleData *pa;
- int i;
+ PARTICLE_P;
if(ELEM(mode, PSYS_RESET_ALL, PSYS_RESET_DEPSGRAPH)) {
- if(mode == PSYS_RESET_ALL || !(part->type == PART_HAIR && (psys->flag & PSYS_EDITED))) {
- if(psys->particles) {
- if(psys->particles->keys)
- MEM_freeN(psys->particles->keys);
-
- for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++)
- if(pa->hair) MEM_freeN(pa->hair);
-
- MEM_freeN(psys->particles);
- psys->particles= NULL;
- }
+ if(mode == PSYS_RESET_ALL || !(psys->flag & PSYS_EDITED)) {
+ psys_free_particles(psys);
psys->totpart= 0;
psys->totkeyed= 0;
@@ -145,14 +134,17 @@ void psys_reset(ParticleSystem *psys, int mode)
if(psys->reactevents.first)
BLI_freelistN(&psys->reactevents);
+
+ if(psys->edit && psys->free_edit) {
+ psys->free_edit(psys->edit);
+ psys->edit = NULL;
+ psys->free_edit = NULL;
+ }
}
}
else if(mode == PSYS_RESET_CACHE_MISS) {
/* set all particles to be skipped */
- ParticleData *pa = psys->particles;
- int p=0;
-
- for(; p<psys->totpart; p++, pa++)
+ LOOP_PARTICLES
pa->flag |= PARS_NO_DISP;
}
@@ -165,60 +157,81 @@ void psys_reset(ParticleSystem *psys, int mode)
psys->totchild= 0;
/* reset path cache */
- psys_free_path_cache(psys);
+ psys_free_path_cache(psys, psys->edit);
/* reset point cache */
psys->pointcache->flag &= ~PTCACHE_SIMULATION_VALID;
psys->pointcache->simframe= 0;
}
-static void realloc_particles(Object *ob, ParticleSystem *psys, int new_totpart)
+static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
{
- ParticleData *newpars = 0, *pa;
- int i, totpart, totsaved = 0;
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
+ ParticleData *newpars = NULL;
+ BoidParticle *newboids = NULL;
+ PARTICLE_P;
+ int totpart, totsaved = 0;
if(new_totpart<0) {
- if(psys->part->distr==PART_DISTR_GRID && psys->part->from != PART_FROM_VERT) {
- totpart= psys->part->grid_res;
+ if(part->distr==PART_DISTR_GRID && part->from != PART_FROM_VERT) {
+ totpart= part->grid_res;
totpart*=totpart*totpart;
}
else
- totpart=psys->part->totpart;
+ totpart=part->totpart;
}
else
totpart=new_totpart;
- if(totpart)
+ if(totpart && totpart != psys->totpart) {
newpars= MEM_callocN(totpart*sizeof(ParticleData), "particles");
- if(psys->particles) {
- totsaved=MIN2(psys->totpart,totpart);
- /*save old pars*/
- if(totsaved)
- memcpy(newpars,psys->particles,totsaved*sizeof(ParticleData));
-
- if(psys->particles->keys)
- MEM_freeN(psys->particles->keys);
-
- for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++)
- if(pa->keys) {
- pa->keys= NULL;
- pa->totkey= 0;
+
+ if(psys->particles) {
+ totsaved=MIN2(psys->totpart,totpart);
+ /*save old pars*/
+ if(totsaved) {
+ memcpy(newpars,psys->particles,totsaved*sizeof(ParticleData));
+
+ if(psys->particles->boid)
+ memcpy(newboids, psys->particles->boid, totsaved*sizeof(BoidParticle));
}
- for(i=totsaved, pa=psys->particles+totsaved; i<psys->totpart; i++, pa++)
- if(pa->hair) MEM_freeN(pa->hair);
+ if(psys->particles->keys)
+ MEM_freeN(psys->particles->keys);
- MEM_freeN(psys->particles);
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+
+ for(p=0, pa=newpars; p<totsaved; p++, pa++) {
+ if(pa->keys) {
+ pa->keys= NULL;
+ pa->totkey= 0;
+ }
+ }
+
+ for(p=totsaved, pa=psys->particles+totsaved; p<psys->totpart; p++, pa++)
+ if(pa->hair) MEM_freeN(pa->hair);
+
+ MEM_freeN(psys->particles);
+ psys_free_pdd(psys);
+ }
+
+ psys->particles=newpars;
+
+ if(newboids) {
+ LOOP_PARTICLES
+ pa->boid = newboids++;
+ }
+
+ psys->totpart=totpart;
}
- psys->particles=newpars;
if(psys->child) {
MEM_freeN(psys->child);
psys->child=0;
psys->totchild=0;
}
-
- psys->totpart=totpart;
}
static int get_psys_child_number(struct Scene *scene, ParticleSystem *psys)
@@ -265,8 +278,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
each original elements can reference its derived elements
*/
Mesh *me= (Mesh*)ob->data;
- ParticleData *pa= 0;
- int p;
+ PARTICLE_P;
/* CACHE LOCATIONS */
if(!dm->deformedOnly) {
@@ -303,7 +315,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
}
/* cache the verts/faces! */
- for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++) {
+ LOOP_PARTICLES {
if(psys->part->from == PART_FROM_VERT) {
if(nodearray[pa->num])
pa->num_dmcache= GET_INT_FROM_POINTER(nodearray[pa->num]->link);
@@ -323,7 +335,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
* should know to use the num or num_dmcache, set the num_dmcache to
* an invalid value, just incase */
- for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++)
+ LOOP_PARTICLES
pa->num_dmcache = -1;
}
}
@@ -596,13 +608,13 @@ static int binary_search_distribution(float *sum, int n, float value)
/* note: this function must be thread safe, for from == PART_FROM_CHILD */
#define ONLY_WORKING_WITH_PA_VERTS 0
-void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p)
+static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p)
{
ParticleThreadContext *ctx= thread->ctx;
- Object *ob= ctx->ob;
+ Object *ob= ctx->sim.ob;
DerivedMesh *dm= ctx->dm;
ParticleData *tpa;
- ParticleSettings *part= ctx->psys->part;
+/* ParticleSettings *part= ctx->sim.psys->part; */
float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
float cur_d, min_d, randu, randv;
int from= ctx->from;
@@ -615,7 +627,6 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
pa->num= ctx->index[p];
pa->fuv[0] = 1.0f;
pa->fuv[1] = pa->fuv[2] = pa->fuv[3] = 0.0;
- //pa->verts[0] = pa->verts[1] = pa->verts[2] = 0;
#if ONLY_WORKING_WITH_PA_VERTS
if(ctx->tree){
@@ -643,7 +654,6 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
ctx->jitoff[i] = fmod(ctx->jitoff[i],(float)ctx->jitlevel);
psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mface->v4, pa->fuv);
ctx->jitoff[i]++;
- //ctx->jitoff[i]=(float)fmod(ctx->jitoff[i]+ctx->maxweight/ctx->weight[i],(float)ctx->jitlevel);
break;
case PART_DISTR_RAND:
randu= rng_getFloat(thread->rng);
@@ -653,12 +663,6 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
}
pa->foffset= 0.0f;
- /*
- pa->verts[0] = mface->v1;
- pa->verts[1] = mface->v2;
- pa->verts[2] = mface->v3;
- */
-
/* experimental */
if(from==PART_FROM_VOLUME){
MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
@@ -714,10 +718,6 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
}
}
else if(from == PART_FROM_PARTICLE) {
- //pa->verts[0]=0; /* not applicable */
- //pa->verts[1]=0;
- //pa->verts[2]=0;
-
tpa=ctx->tpars+ctx->index[p];
pa->num=ctx->index[p];
pa->fuv[0]=tpa->fuv[0];
@@ -733,42 +733,30 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
cpa->num=0;
cpa->fuv[0]=cpa->fuv[1]=cpa->fuv[2]=cpa->fuv[3]=0.0f;
cpa->pa[0]=cpa->pa[1]=cpa->pa[2]=cpa->pa[3]=0;
- cpa->rand[0]=cpa->rand[1]=cpa->rand[2]=0.0f;
return;
}
mf= dm->getFaceData(dm, ctx->index[p], CD_MFACE);
- //switch(distr){
- // case PART_DISTR_JIT:
- // i=index[p];
- // psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mf->v4, cpa->fuv);
- // ctx->jitoff[i]=(float)fmod(ctx->jitoff[i]+ctx->maxweight/ctx->weight[i],(float)ctx->jitlevel);
- // break;
- // case PART_DISTR_RAND:
- randu= rng_getFloat(thread->rng);
- randv= rng_getFloat(thread->rng);
- psys_uv_to_w(randu, randv, mf->v4, cpa->fuv);
- // break;
- //}
+ randu= rng_getFloat(thread->rng);
+ randv= rng_getFloat(thread->rng);
+ psys_uv_to_w(randu, randv, mf->v4, cpa->fuv);
- cpa->rand[0] = rng_getFloat(thread->rng);
- cpa->rand[1] = rng_getFloat(thread->rng);
- cpa->rand[2] = rng_getFloat(thread->rng);
cpa->num = ctx->index[p];
if(ctx->tree){
KDTreeNearest ptn[10];
- int w,maxw, do_seams;
+ int w,maxw;//, do_seams;
float maxd,mind,dd,totw=0.0;
int parent[10];
float pweight[10];
- do_seams= (part->flag&PART_CHILD_SEAMS && ctx->seams);
+ /*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);
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,(do_seams)?10:4,orco1,ornor1,ptn);
+ maxw = BLI_kdtree_find_n_nearest(ctx->tree,4,orco1,ornor1,ptn);
maxd=ptn[maxw-1].dist;
mind=ptn[0].dist;
@@ -778,70 +766,68 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
for(w=0; w<maxw; w++){
parent[w]=ptn[w].index;
pweight[w]=(float)pow(2.0,(double)(-6.0f*ptn[w].dist/maxd));
- //pweight[w]= (1.0f - ptn[w].dist*ptn[w].dist/(maxd*maxd));
- //pweight[w] *= pweight[w];
}
for(;w<10; w++){
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++){
- VecSubf(temp,co1,seam->v0);
- inp=Inpf(temp,seam->dir)/seam->length2;
- if(inp<0.0f){
- cur_len=VecLenf(co1,seam->v0);
- }
- else if(inp>1.0f){
- cur_len=VecLenf(co1,seam->v1);
- }
- else{
- VecCopyf(temp2,seam->dir);
- VecMulf(temp2,inp);
- cur_len=VecLenf(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;
-
- VecCopyf(temp,seam->v0);
-
- if(near_vert){
- if(near_vert==-1)
- VecSubf(tan,co1,seam->v0);
- else{
- VecSubf(tan,co1,seam->v1);
- VecCopyf(temp,seam->v1);
- }
-
- Normalize(tan);
- }
- else{
- VecCopyf(tan,seam->tan);
- VecSubf(temp2,co1,temp);
- if(Inpf(tan,temp2)<0.0f)
- VecNegf(tan);
- }
- for(w=0; w<maxw; w++){
- VecSubf(temp2,ptn[w].co,temp);
- if(Inpf(tan,temp2)<0.0f){
- 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++){
+ // VecSubf(temp,co1,seam->v0);
+ // inp=Inpf(temp,seam->dir)/seam->length2;
+ // if(inp<0.0f){
+ // cur_len=VecLenf(co1,seam->v0);
+ // }
+ // else if(inp>1.0f){
+ // cur_len=VecLenf(co1,seam->v1);
+ // }
+ // else{
+ // VecCopyf(temp2,seam->dir);
+ // VecMulf(temp2,inp);
+ // cur_len=VecLenf(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;
+ //
+ // VecCopyf(temp,seam->v0);
+ //
+ // if(near_vert){
+ // if(near_vert==-1)
+ // VecSubf(tan,co1,seam->v0);
+ // else{
+ // VecSubf(tan,co1,seam->v1);
+ // VecCopyf(temp,seam->v1);
+ // }
+
+ // Normalize(tan);
+ // }
+ // else{
+ // VecCopyf(tan,seam->tan);
+ // VecSubf(temp2,co1,temp);
+ // if(Inpf(tan,temp2)<0.0f)
+ // VecNegf(tan);
+ // }
+ // for(w=0; w<maxw; w++){
+ // VecSubf(temp2,ptn[w].co,temp);
+ // if(Inpf(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){
@@ -867,7 +853,7 @@ void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, C
static void *exec_distribution(void *data)
{
ParticleThread *thread= (ParticleThread*)data;
- ParticleSystem *psys= thread->ctx->psys;
+ ParticleSystem *psys= thread->ctx->sim.psys;
ParticleData *pa;
ChildParticle *cpa;
int p, totpart;
@@ -934,11 +920,11 @@ static int compare_orig_index(const void *p1, const void *p2)
/* 6. and we're done! */
/* This is to denote functionality that does not yet work with mesh - only derived mesh */
-int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, DerivedMesh *finaldm, int from)
+static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, DerivedMesh *finaldm, int from)
{
ParticleThreadContext *ctx= threads[0].ctx;
- Object *ob= ctx->ob;
- ParticleSystem *psys= ctx->psys;
+ Object *ob= ctx->sim.ob;
+ ParticleSystem *psys= ctx->sim.psys;
Object *tob;
ParticleData *pa=0, *tpars= 0;
ParticleSettings *part;
@@ -990,49 +976,49 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
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);
+ //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++;
+ // 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];
+ // 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){
- VecCopyf(cur_seam->v0,(mvert+ed->v1)->co);
- VecCopyf(cur_seam->v1,(mvert+ed->v2)->co);
+ // for(p=0, ed=medge; p<totedge; p++,ed++){
+ // if(ed->flag&ME_SEAM){
+ // VecCopyf(cur_seam->v0,(mvert+ed->v1)->co);
+ // VecCopyf(cur_seam->v1,(mvert+ed->v2)->co);
- VecSubf(cur_seam->dir,cur_seam->v1,cur_seam->v0);
+ // VecSubf(cur_seam->dir,cur_seam->v1,cur_seam->v0);
- cur_seam->length2=VecLength(cur_seam->dir);
- cur_seam->length2*=cur_seam->length2;
+ // cur_seam->length2=VecLength(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]);
+ // 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]);
- VecAddf(cur_seam->nor,temp,temp2);
- Normalize(cur_seam->nor);
+ // VecAddf(cur_seam->nor,temp,temp2);
+ // Normalize(cur_seam->nor);
- Crossf(cur_seam->tan,cur_seam->dir,cur_seam->nor);
+ // Crossf(cur_seam->tan,cur_seam->dir,cur_seam->nor);
- Normalize(cur_seam->tan);
+ // Normalize(cur_seam->tan);
- cur_seam++;
- }
- }
- }
-
- }
+ // cur_seam++;
+ // }
+ // }
+ // }
+ //
+ //}
}
else{
/* no need to figure out distribution */
@@ -1054,10 +1040,6 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
length=VecLength(cpa->fuv);
}
- cpa->rand[0]=BLI_frand();
- cpa->rand[1]=BLI_frand();
- cpa->rand[2]=BLI_frand();
-
cpa->num=-1;
}
}
@@ -1336,7 +1318,6 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
jitlevel= totpart/tot;
if(part->flag & PART_EDISTR) jitlevel*= 2; /* looks better in general, not very scietific */
if(jitlevel<3) jitlevel= 3;
- //if(jitlevel>100) jitlevel= 100;
}
jit= MEM_callocN((2+ jitlevel*2)*sizeof(float), "jit");
@@ -1355,7 +1336,7 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
ctx->tree= tree;
ctx->seams= seams;
ctx->totseam= totseam;
- ctx->psys= psys;
+ ctx->sim.psys= psys;
ctx->index= index;
ctx->jit= jit;
ctx->jitlevel= jitlevel;
@@ -1376,7 +1357,7 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
if(!children || psys->totchild < 10000)
totthread= 1;
- seed= 31415926 + ctx->psys->seed;
+ seed= 31415926 + ctx->sim.psys->seed;
for(i=0; i<totthread; i++) {
threads[i].rng= rng_new(seed);
threads[i].tot= totthread;
@@ -1385,16 +1366,17 @@ int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, Derive
return 1;
}
-static void distribute_particles_on_dm(DerivedMesh *finaldm, Scene *scene, Object *ob, ParticleSystem *psys, int from)
+static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
{
+ DerivedMesh *finaldm = sim->psmd->dm;
ListBase threads;
ParticleThread *pthreads;
ParticleThreadContext *ctx;
int i, totthread;
- pthreads= psys_threads_create(scene, ob, psys);
+ pthreads= psys_threads_create(sim);
- if(!psys_threads_init_distribution(pthreads, scene, finaldm, from)) {
+ if(!psys_threads_init_distribution(pthreads, sim->scene, finaldm, from)) {
psys_threads_free(pthreads);
return;
}
@@ -1411,7 +1393,7 @@ static void distribute_particles_on_dm(DerivedMesh *finaldm, Scene *scene, Objec
else
exec_distribution(&pthreads[0]);
- psys_calc_dmcache(ob, finaldm, psys);
+ psys_calc_dmcache(sim->ob, finaldm, sim->psys);
ctx= pthreads[0].ctx;
if(ctx->dm != finaldm)
@@ -1421,41 +1403,40 @@ static void distribute_particles_on_dm(DerivedMesh *finaldm, Scene *scene, Objec
}
/* ready for future use, to emit particles without geometry */
-static void distribute_particles_on_shape(Object *ob, ParticleSystem *psys, int from)
+static void distribute_particles_on_shape(ParticleSimulationData *sim, int from)
{
- ParticleData *pa;
- int totpart=psys->totpart, p;
+ ParticleSystem *psys = sim->psys;
+ PARTICLE_P;
fprintf(stderr,"Shape emission not yet possible!\n");
- for(p=0,pa=psys->particles; p<totpart; p++,pa++){
+ LOOP_PARTICLES {
pa->fuv[0]=pa->fuv[1]=pa->fuv[2]=pa->fuv[3]= 0.0;
pa->foffset= 0.0f;
pa->num= -1;
}
}
-static void distribute_particles(Scene *scene, Object *ob, ParticleSystem *psys, int from)
+static void distribute_particles(ParticleSimulationData *sim, int from)
{
- ParticleSystemModifierData *psmd=0;
+ PARTICLE_PSMD;
int distr_error=0;
- psmd=psys_get_modifier(ob,psys);
if(psmd){
if(psmd->dm)
- distribute_particles_on_dm(psmd->dm, scene, ob, psys, from);
+ distribute_particles_on_dm(sim, from);
else
distr_error=1;
}
else
- distribute_particles_on_shape(ob,psys,from);
+ distribute_particles_on_shape(sim, from);
if(distr_error){
- ParticleData *pa;
- int totpart=psys->totpart, p;
+ ParticleSystem *psys = sim->psys;
+ PARTICLE_P;
fprintf(stderr,"Particle distribution error!\n");
- for(p=0,pa=psys->particles; p<totpart; p++,pa++){
+ LOOP_PARTICLES {
pa->fuv[0]=pa->fuv[1]=pa->fuv[2]=pa->fuv[3]= 0.0;
pa->foffset= 0.0f;
pa->num= -1;
@@ -1464,26 +1445,23 @@ static void distribute_particles(Scene *scene, Object *ob, ParticleSystem *psys,
}
/* threaded child particle distribution and path caching */
-ParticleThread *psys_threads_create(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys)
+ParticleThread *psys_threads_create(ParticleSimulationData *sim)
{
ParticleThread *threads;
ParticleThreadContext *ctx;
int i, totthread;
- if(scene->r.mode & R_FIXED_THREADS)
- totthread= scene->r.threads;
+ if(sim->scene->r.mode & R_FIXED_THREADS)
+ totthread= sim->scene->r.threads;
else
totthread= BLI_system_thread_count();
threads= MEM_callocN(sizeof(ParticleThread)*totthread, "ParticleThread");
ctx= MEM_callocN(sizeof(ParticleThreadContext), "ParticleThreadContext");
- ctx->scene= scene;
- ctx->ob= ob;
- ctx->psys= psys;
- ctx->psmd= psys_get_modifier(ob, psys);
- ctx->dm= ctx->psmd->dm;
- ctx->ma= give_current_material(ob, psys->part->omat);
+ ctx->sim = *sim;
+ ctx->dm= ctx->sim.psmd->dm;
+ ctx->ma= give_current_material(sim->ob, sim->psys->part->omat);
memset(threads, 0, sizeof(ParticleThread)*totthread);
@@ -1515,9 +1493,9 @@ void psys_threads_free(ParticleThread *threads)
if(ctx->vg_roughe)
MEM_freeN(ctx->vg_roughe);
- if(ctx->psys->lattice){
- end_latt_deform(ctx->psys->lattice);
- ctx->psys->lattice= NULL;
+ if(ctx->sim.psys->lattice){
+ end_latt_deform(ctx->sim.psys->lattice);
+ ctx->sim.psys->lattice= NULL;
}
/* distribution */
@@ -1543,37 +1521,34 @@ void psys_threads_free(ParticleThread *threads)
}
/* set particle parameters that don't change during particle's life */
-void initialize_particle(ParticleData *pa, int p, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd)
+void initialize_particle(ParticleSimulationData *sim, ParticleData *pa, int p)
{
- ParticleSettings *part;
+ ParticleSettings *part = sim->psys->part;
ParticleTexture ptex;
Material *ma=0;
//IpoCurve *icu=0; // XXX old animation system
int totpart;
- float rand,length;
- part=psys->part;
-
- totpart=psys->totpart;
+ totpart=sim->psys->totpart;
ptex.life=ptex.size=ptex.exist=ptex.length=1.0;
ptex.time=(float)p/(float)totpart;
- BLI_srandom(psys->seed+p);
+ BLI_srandom(sim->psys->seed + p + 125);
if(part->from!=PART_FROM_PARTICLE && part->type!=PART_FLUID){
- ma=give_current_material(ob,part->omat);
+ ma=give_current_material(sim->ob,part->omat);
/* TODO: needs some work to make most blendtypes generally usefull */
- psys_get_texture(ob,ma,psmd,psys,pa,&ptex,MAP_PA_INIT);
+ psys_get_texture(sim,ma,pa,&ptex,MAP_PA_INIT);
}
pa->lifetime= part->lifetime*ptex.life;
if(part->type==PART_HAIR)
pa->time= 0.0f;
- else if(part->type==PART_REACTOR && (part->flag&PART_REACT_STA_END)==0)
- pa->time= 300000.0f; /* max frame */
+ //else if(part->type==PART_REACTOR && (part->flag&PART_REACT_STA_END)==0)
+ // pa->time= 300000.0f; /* max frame */
else{
//icu=find_ipocurve(psys->part->ipo,PART_EMIT_TIME);
//if(icu){
@@ -1597,45 +1572,14 @@ void initialize_particle(ParticleData *pa, int p, Object *ob, ParticleSystem *ps
}
#endif // XXX old animation system
- /* need to get every rand even if we don't use them so that randoms don't affect each other */
- rand= BLI_frand();
if(part->randlife!=0.0)
- pa->lifetime*= 1.0f - part->randlife*rand;
+ pa->lifetime*= 1.0f - part->randlife * BLI_frand();
}
pa->dietime= pa->time+pa->lifetime;
- pa->sizemul= BLI_frand();
-
- rand= BLI_frand();
-
- /* while loops are to have a spherical distribution (avoid cubic distribution) */
- length=2.0f;
- while(length>1.0){
- pa->r_ve[0]=2.0f*(BLI_frand()-0.5f);
- pa->r_ve[1]=2.0f*(BLI_frand()-0.5f);
- pa->r_ve[2]=2.0f*(BLI_frand()-0.5f);
- length=VecLength(pa->r_ve);
- }
-
- length=2.0f;
- while(length>1.0){
- pa->r_ave[0]=2.0f*(BLI_frand()-0.5f);
- pa->r_ave[1]=2.0f*(BLI_frand()-0.5f);
- pa->r_ave[2]=2.0f*(BLI_frand()-0.5f);
- length=VecLength(pa->r_ave);
- }
-
- pa->r_rot[0]=2.0f*(BLI_frand()-0.5f);
- pa->r_rot[1]=2.0f*(BLI_frand()-0.5f);
- pa->r_rot[2]=2.0f*(BLI_frand()-0.5f);
- pa->r_rot[3]=2.0f*(BLI_frand()-0.5f);
-
- NormalQuat(pa->r_rot);
-
if(part->type!=PART_HAIR && part->distr!=PART_DISTR_GRID && part->from != PART_FROM_VERT){
- /* any unique random number will do (r_ave[0]) */
- if(ptex.exist < 0.5*(1.0+pa->r_ave[0]))
+ if(ptex.exist < BLI_frand())
pa->flag |= PARS_UNEXIST;
else
pa->flag &= ~PARS_UNEXIST;
@@ -1646,14 +1590,14 @@ void initialize_particle(ParticleData *pa, int p, Object *ob, ParticleSystem *ps
/* usage other than straight after distribute has to handle this index by itself - jahka*/
//pa->num_dmcache = DMCACHE_NOTFOUND; /* assume we dont have a derived mesh face */
}
-static void initialize_all_particles(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd)
+static void initialize_all_particles(ParticleSimulationData *sim)
{
//IpoCurve *icu=0; // XXX old animation system
- ParticleData *pa;
- int p, totpart=psys->totpart;
+ ParticleSystem *psys = sim->psys;
+ PARTICLE_P;
- for(p=0, pa=psys->particles; p<totpart; p++, pa++)
- initialize_particle(pa,p,ob,psys,psmd);
+ LOOP_PARTICLES
+ initialize_particle(sim, pa, p);
if(psys->part->type != PART_FLUID) {
#if 0 // XXX old animation system
@@ -1710,73 +1654,81 @@ static void initialize_all_particles(Object *ob, ParticleSystem *psys, ParticleS
}
}
/* sets particle to the emitter surface with initial velocity & rotation */
-void reset_particle(Scene *scene, ParticleData *pa, ParticleSystem *psys, ParticleSystemModifierData *psmd, Object *ob,
- float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot)
+void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime, float cfra)
{
+ Object *ob = sim->ob;
+ ParticleSystem *psys = sim->psys;
ParticleSettings *part;
ParticleTexture ptex;
ParticleKey state;
//IpoCurve *icu=0; // XXX old animation system
- float fac, phasefac, nor[3]={0,0,0},loc[3],tloc[3],vel[3]={0.0,0.0,0.0},rot[4],q2[4];
+ float fac, phasefac, nor[3]={0,0,0},loc[3],vel[3]={0.0,0.0,0.0},rot[4],q2[4];
float r_vel[3],r_ave[3],r_rot[4],p_vel[3]={0.0,0.0,0.0};
float x_vec[3]={1.0,0.0,0.0}, utan[3]={0.0,1.0,0.0}, vtan[3]={0.0,0.0,1.0}, rot_vec[3]={0.0,0.0,0.0};
- float q_phase[4];
+ float q_phase[4], r_phase;
+ int p = pa - psys->particles;
part=psys->part;
ptex.ivel=1.0;
+
+ /* we need to get every random even if they're not used so that they don't effect eachother */
+ r_vel[0] = 2.0f * (PSYS_FRAND(p + 10) - 0.5f);
+ r_vel[1] = 2.0f * (PSYS_FRAND(p + 11) - 0.5f);
+ r_vel[2] = 2.0f * (PSYS_FRAND(p + 12) - 0.5f);
+
+ r_ave[0] = 2.0f * (PSYS_FRAND(p + 13) - 0.5f);
+ r_ave[1] = 2.0f * (PSYS_FRAND(p + 14) - 0.5f);
+ r_ave[2] = 2.0f * (PSYS_FRAND(p + 15) - 0.5f);
+
+ r_rot[0] = 2.0f * (PSYS_FRAND(p + 16) - 0.5f);
+ r_rot[1] = 2.0f * (PSYS_FRAND(p + 17) - 0.5f);
+ r_rot[2] = 2.0f * (PSYS_FRAND(p + 18) - 0.5f);
+ r_rot[3] = 2.0f * (PSYS_FRAND(p + 19) - 0.5f);
+ NormalQuat(r_rot);
+
+ r_phase = PSYS_FRAND(p + 20);
if(part->from==PART_FROM_PARTICLE){
- Object *tob;
- ParticleSystem *tpsys=0;
+ ParticleSimulationData tsim = {sim->scene, psys->target_ob ? psys->target_ob : ob, NULL, NULL};
float speed;
- tob=psys->target_ob;
- if(tob==0)
- tob=ob;
-
- tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
+ tsim.psys = BLI_findlink(&tsim.ob->particlesystem, sim->psys->target_psys-1);
state.time = pa->time;
if(pa->num == -1)
memset(&state, 0, sizeof(state));
else
- psys_get_particle_state(scene, tob,tpsys,pa->num,&state,1);
- psys_get_from_key(&state,loc,nor,rot,0);
+ psys_get_particle_state(&tsim, pa->num, &state, 1);
+ psys_get_from_key(&state, loc, nor, rot, 0);
- QuatMulVecf(rot,vtan);
- QuatMulVecf(rot,utan);
- VECCOPY(r_vel,pa->r_ve);
- VECCOPY(r_rot,pa->r_rot);
- VECCOPY(r_ave,pa->r_ave);
+ QuatMulVecf(rot, vtan);
+ QuatMulVecf(rot, utan);
- VECCOPY(p_vel,state.vel);
+ VECCOPY(p_vel, state.vel);
speed=Normalize(p_vel);
- VecMulf(p_vel,Inpf(pa->r_ve,p_vel));
- VECSUB(p_vel,pa->r_ve,p_vel);
+ VecMulf(p_vel, Inpf(r_vel, p_vel));
+ VECSUB(p_vel, r_vel, p_vel);
Normalize(p_vel);
- VecMulf(p_vel,speed);
+ VecMulf(p_vel, speed);
- VECCOPY(pa->fuv,loc); /* abusing pa->fuv (not used for "from particle") for storing emit location */
+ VECCOPY(pa->fuv, loc); /* abusing pa->fuv (not used for "from particle") for storing emit location */
}
else{
/* get precise emitter matrix if particle is born */
- if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= psys->cfra)
- where_is_object_time(scene, ob,pa->time);
+ if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= sim->psys->cfra)
+ where_is_object_time(sim->scene, sim->ob, pa->time);
/* get birth location from object */
if(part->tanfac!=0.0)
- psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
+ psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
else
- psys_particle_on_emitter(psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
-
- /* save local coordinates for later */
- VECCOPY(tloc,loc);
+ psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
/* get possible textural influence */
- psys_get_texture(ob,give_current_material(ob,part->omat),psmd,psys,pa,&ptex,MAP_PA_IVEL);
+ psys_get_texture(sim, give_current_material(sim->ob,part->omat), pa, &ptex, MAP_PA_IVEL);
- if(vg_vel && pa->num != -1)
- ptex.ivel*=psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_vel);
+ //if(vg_vel && pa->num != -1)
+ // ptex.ivel*=psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_vel);
/* particles live in global space so */
/* let's convert: */
@@ -1784,21 +1736,18 @@ void reset_particle(Scene *scene, ParticleData *pa, ParticleSystem *psys, Partic
Mat4MulVecfl(ob->obmat,loc);
/* -normal */
- VECADD(nor,tloc,nor);
- Mat4MulVecfl(ob->obmat,nor);
- VECSUB(nor,nor,loc);
+ Mat4Mul3Vecfl(ob->obmat,nor);
Normalize(nor);
/* -tangent */
if(part->tanfac!=0.0){
- float phase=vg_rot?2.0f*(psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
+ //float phase=vg_rot?2.0f*(psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
+ float phase=0.0f;
VecMulf(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
fac=-(float)sin(M_PI*(part->tanphase+phase));
VECADDFAC(vtan,vtan,utan,fac);
- VECADD(vtan,tloc,vtan);
- Mat4MulVecfl(ob->obmat,vtan);
- VECSUB(vtan,vtan,loc);
+ Mat4Mul3Vecfl(ob->obmat,vtan);
VECCOPY(utan,nor);
VecMulf(utan,Inpf(vtan,nor));
@@ -1810,143 +1759,179 @@ void reset_particle(Scene *scene, ParticleData *pa, ParticleSystem *psys, Partic
/* -velocity */
if(part->randfac!=0.0){
- VECADD(r_vel,tloc,pa->r_ve);
- Mat4MulVecfl(ob->obmat,r_vel);
- VECSUB(r_vel,r_vel,loc);
+ Mat4Mul3Vecfl(ob->obmat,r_vel);
Normalize(r_vel);
}
/* -angular velocity */
if(part->avemode==PART_AVE_RAND){
- VECADD(r_ave,tloc,pa->r_ave);
- Mat4MulVecfl(ob->obmat,r_ave);
- VECSUB(r_ave,r_ave,loc);
+ Mat4Mul3Vecfl(ob->obmat,r_ave);
Normalize(r_ave);
}
/* -rotation */
if(part->randrotfac != 0.0f){
- QUATCOPY(r_rot,pa->r_rot);
Mat4ToQuat(ob->obmat,rot);
QuatMul(r_rot,r_rot,rot);
}
}
- /* conversion done so now we apply new: */
- /* -velocity from: */
- /* *reactions */
- if(dtime>0.0f){
- VECSUB(vel,pa->state.vel,pa->prev_state.vel);
- }
-
- /* *emitter velocity */
- if(dtime!=0.0 && part->obfac!=0.0){
- VECSUB(vel,loc,pa->state.co);
- VecMulf(vel,part->obfac/dtime);
- }
-
- /* *emitter normal */
- if(part->normfac!=0.0)
- VECADDFAC(vel,vel,nor,part->normfac);
-
- /* *emitter tangent */
- if(part->tanfac!=0.0)
- VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_tan):1.0f));
+ if(part->phystype==PART_PHYS_BOIDS) {
+ BoidParticle *bpa = pa->boid;
+ float dvec[3], q[4], mat[3][3];
- /* *texture */
- /* TODO */
+ VECCOPY(pa->state.co,loc);
- /* *random */
- if(part->randfac!=0.0)
- VECADDFAC(vel,vel,r_vel,part->randfac);
+ /* boids don't get any initial velocity */
+ pa->state.vel[0]=pa->state.vel[1]=pa->state.vel[2]=0.0f;
- /* *particle */
- if(part->partfac!=0.0)
- VECADDFAC(vel,vel,p_vel,part->partfac);
+ /* boids store direction in ave */
+ if(fabs(nor[2])==1.0f) {
+ VecSubf(pa->state.ave, loc, ob->obmat[3]);
+ Normalize(pa->state.ave);
+ }
+ else {
+ VECCOPY(pa->state.ave, nor);
+ }
+ /* and gravity in r_ve */
+ bpa->gravity[0] = bpa->gravity[1] = 0.0f;
+ bpa->gravity[2] = -1.0f;
+ if(part->acc[2]!=0.0f)
+ bpa->gravity[2] = part->acc[2];
+
+ /* calculate rotation matrix */
+ Projf(dvec, r_vel, pa->state.ave);
+ VecSubf(mat[0], pa->state.ave, dvec);
+ Normalize(mat[0]);
+ VECCOPY(mat[2], r_vel);
+ VecMulf(mat[2], -1.0f);
+ Normalize(mat[2]);
+ Crossf(mat[1], mat[2], mat[0]);
+
+ /* apply rotation */
+ Mat3ToQuat_is_ok(mat, q);
+ QuatCopy(pa->state.rot, q);
-#if 0 // XXX old animation system
- icu=find_ipocurve(psys->part->ipo,PART_EMIT_VEL);
- if(icu){
- calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
- ptex.ivel*=icu->curval;
+ bpa->data.health = part->boids->health;
+ bpa->data.mode = eBoidMode_InAir;
+ bpa->data.state_id = ((BoidState*)part->boids->states.first)->id;
+ bpa->data.acc[0]=bpa->data.acc[1]=bpa->data.acc[2]=0.0f;
}
-#endif // XXX old animation system
-
- VecMulf(vel,ptex.ivel);
-
- VECCOPY(pa->state.vel,vel);
-
- /* -location from emitter */
- VECCOPY(pa->state.co,loc);
+ else {
+ /* conversion done so now we apply new: */
+ /* -velocity from: */
- /* -rotation */
- pa->state.rot[0]=1.0;
- pa->state.rot[1]=pa->state.rot[2]=pa->state.rot[3]=0.0;
+ /* *reactions */
+ if(dtime>0.0f){
+ VECSUB(vel,pa->state.vel,pa->prev_state.vel);
+ }
- if(part->rotmode){
- /* create vector into which rotation is aligned */
- switch(part->rotmode){
- case PART_ROT_NOR:
- VecCopyf(rot_vec, nor);
- break;
- case PART_ROT_VEL:
- VecCopyf(rot_vec, vel);
- break;
- case PART_ROT_GLOB_X:
- case PART_ROT_GLOB_Y:
- case PART_ROT_GLOB_Z:
- rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
- break;
- case PART_ROT_OB_X:
- case PART_ROT_OB_Y:
- case PART_ROT_OB_Z:
- VecCopyf(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
- break;
+ /* *emitter velocity */
+ if(dtime!=0.0 && part->obfac!=0.0){
+ VECSUB(vel,loc,pa->state.co);
+ VecMulf(vel,part->obfac/dtime);
}
- /* create rotation quat */
- VecNegf(rot_vec);
- vectoquat(rot_vec, OB_POSX, OB_POSZ, q2);
+ /* *emitter normal */
+ if(part->normfac!=0.0)
+ VECADDFAC(vel,vel,nor,part->normfac);
+
+ /* *emitter tangent */
+ if(sim->psmd && part->tanfac!=0.0)
+ VECADDFAC(vel,vel,vtan,part->tanfac);
+ //VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_tan):1.0f));
- /* randomize rotation quat */
- if(part->randrotfac!=0.0f)
- QuatInterpol(rot, q2, r_rot, part->randrotfac);
- else
- QuatCopy(rot,q2);
+ /* *texture */
+ /* TODO */
- /* rotation phase */
- phasefac = part->phasefac;
- if(part->randphasefac != 0.0f) /* abuse r_ave[0] as a random number */
- phasefac += part->randphasefac * pa->r_ave[0];
- VecRotToQuat(x_vec, phasefac*(float)M_PI, q_phase);
+ /* *random */
+ if(part->randfac!=0.0)
+ VECADDFAC(vel,vel,r_vel,part->randfac);
- /* combine base rotation & phase */
- QuatMul(pa->state.rot, rot, q_phase);
- }
+ /* *particle */
+ if(part->partfac!=0.0)
+ VECADDFAC(vel,vel,p_vel,part->partfac);
+
+ //icu=find_ipocurve(psys->part->ipo,PART_EMIT_VEL);
+ //if(icu){
+ // calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
+ // ptex.ivel*=icu->curval;
+ //}
- /* -angular velocity */
+ VecMulf(vel,ptex.ivel);
+
+ VECCOPY(pa->state.vel,vel);
- pa->state.ave[0] = pa->state.ave[1] = pa->state.ave[2] = 0.0;
+ /* -location from emitter */
+ VECCOPY(pa->state.co,loc);
- if(part->avemode){
- switch(part->avemode){
- case PART_AVE_SPIN:
- VECCOPY(pa->state.ave,vel);
- break;
- case PART_AVE_RAND:
- VECCOPY(pa->state.ave,r_ave);
- break;
+ /* -rotation */
+ pa->state.rot[0]=1.0;
+ pa->state.rot[1]=pa->state.rot[2]=pa->state.rot[3]=0.0;
+
+ if(part->rotmode){
+ /* create vector into which rotation is aligned */
+ switch(part->rotmode){
+ case PART_ROT_NOR:
+ VecCopyf(rot_vec, nor);
+ break;
+ case PART_ROT_VEL:
+ VecCopyf(rot_vec, vel);
+ break;
+ case PART_ROT_GLOB_X:
+ case PART_ROT_GLOB_Y:
+ case PART_ROT_GLOB_Z:
+ rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
+ break;
+ case PART_ROT_OB_X:
+ case PART_ROT_OB_Y:
+ case PART_ROT_OB_Z:
+ VecCopyf(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
+ break;
+ }
+
+ /* create rotation quat */
+ VecNegf(rot_vec);
+ vectoquat(rot_vec, OB_POSX, OB_POSZ, q2);
+
+ /* randomize rotation quat */
+ if(part->randrotfac!=0.0f)
+ QuatInterpol(rot, q2, r_rot, part->randrotfac);
+ else
+ QuatCopy(rot,q2);
+
+ /* rotation phase */
+ phasefac = part->phasefac;
+ if(part->randphasefac != 0.0f)
+ phasefac += part->randphasefac * r_phase;
+ VecRotToQuat(x_vec, phasefac*(float)M_PI, q_phase);
+
+ /* combine base rotation & phase */
+ QuatMul(pa->state.rot, rot, q_phase);
}
- Normalize(pa->state.ave);
- VecMulf(pa->state.ave,part->avefac);
-#if 0 // XXX old animation system
- icu=find_ipocurve(psys->part->ipo,PART_EMIT_AVE);
- if(icu){
- calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
- VecMulf(pa->state.ave,icu->curval);
+ /* -angular velocity */
+
+ pa->state.ave[0] = pa->state.ave[1] = pa->state.ave[2] = 0.0;
+
+ if(part->avemode){
+ switch(part->avemode){
+ case PART_AVE_SPIN:
+ VECCOPY(pa->state.ave,vel);
+ break;
+ case PART_AVE_RAND:
+ VECCOPY(pa->state.ave,r_ave);
+ break;
+ }
+ Normalize(pa->state.ave);
+ VecMulf(pa->state.ave,part->avefac);
+
+ //icu=find_ipocurve(psys->part->ipo,PART_EMIT_AVE);
+ //if(icu){
+ // calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
+ // VecMulf(pa->state.ave,icu->curval);
+ //}
}
-#endif // XXX old animation system
}
pa->dietime = pa->time + pa->lifetime;
@@ -1955,86 +1940,75 @@ void reset_particle(Scene *scene, ParticleData *pa, ParticleSystem *psys, Partic
pa->alive = PARS_UNBORN;
pa->state.time = cfra;
-
- pa->stick_ob = 0;
- pa->flag &= ~PARS_STICKY;
}
-static void reset_all_particles(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float dtime, float cfra, int from)
+static void reset_all_particles(ParticleSimulationData *sim, float dtime, float cfra, int from)
{
ParticleData *pa;
- int p, totpart=psys->totpart;
- float *vg_vel=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_VEL);
- float *vg_tan=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_TAN);
- float *vg_rot=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROT);
+ int p, totpart=sim->psys->totpart;
+ //float *vg_vel=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_VEL);
+ //float *vg_tan=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_TAN);
+ //float *vg_rot=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_ROT);
- for(p=from, pa=psys->particles+from; p<totpart; p++, pa++)
- reset_particle(scene, pa, psys, psmd, ob, dtime, cfra, vg_vel, vg_tan, vg_rot);
+ for(p=from, pa=sim->psys->particles+from; p<totpart; p++, pa++)
+ reset_particle(sim, pa, dtime, cfra);
- if(vg_vel)
- MEM_freeN(vg_vel);
+ //if(vg_vel)
+ // MEM_freeN(vg_vel);
}
/************************************************/
-/* Keyed particles */
+/* Particle targets */
/************************************************/
-/* a bit of an unintuitive function :) counts objects in a keyed chain and returns 1 if some of them were selected (used in drawing) */
-int psys_count_keyed_targets(Object *ob, ParticleSystem *psys)
+ParticleSystem *psys_get_target_system(Object *ob, ParticleTarget *pt)
{
- ParticleSystem *kpsys=psys,*tpsys;
- ParticleSettings *tpart;
- Object *kob=ob,*tob;
- int select=ob->flag&SELECT;
- short totkeyed=0;
- Base *base;
+ ParticleSystem *psys = NULL;
- ListBase lb;
- lb.first=lb.last=0;
-
- tob=psys->keyed_ob;
- while(tob){
- if((tpsys=BLI_findlink(&tob->particlesystem,kpsys->keyed_psys-1))){
- tpart=tpsys->part;
-
- if(tpart->phystype==PART_PHYS_KEYED){
- if(lb.first){
- for(base=lb.first;base;base=base->next){
- if(tob==base->object){
- fprintf(stderr,"Error: loop in keyed chain!\n");
- BLI_freelistN(&lb);
- return select;
- }
- }
- }
- base=MEM_callocN(sizeof(Base), "keyed base");
- base->object=tob;
- BLI_addtail(&lb,base);
-
- if(tob->flag&SELECT)
- select++;
- kob=tob;
- kpsys=tpsys;
- tob=tpsys->keyed_ob;
- totkeyed++;
- }
- else{
- tob=0;
- totkeyed++;
- }
+ if(pt->ob == NULL || pt->ob == ob)
+ psys = BLI_findlink(&ob->particlesystem, pt->psys-1);
+ else
+ psys = BLI_findlink(&pt->ob->particlesystem, pt->psys-1);
+
+ if(psys)
+ pt->flag |= PTARGET_VALID;
+ else
+ pt->flag &= ~PTARGET_VALID;
+
+ return psys;
+}
+/************************************************/
+/* Keyed particles */
+/************************************************/
+/* Counts valid keyed targets */
+void psys_count_keyed_targets(ParticleSimulationData *sim)
+{
+ ParticleSystem *psys = sim->psys, *kpsys;
+ ParticleTarget *pt = psys->targets.first;
+ int keys_valid = 1;
+ psys->totkeyed = 0;
+
+ for(; pt; pt=pt->next) {
+ kpsys = psys_get_target_system(sim->ob, pt);
+
+ if(kpsys && kpsys->totpart) {
+ psys->totkeyed += keys_valid;
+ if(psys->flag & PSYS_KEYED_TIMING && pt->duration != 0.0f)
+ psys->totkeyed += 1;
+ }
+ else {
+ keys_valid = 0;
}
- else
- tob=0;
}
- psys->totkeyed=totkeyed;
- BLI_freelistN(&lb);
- return select;
+
+ psys->totkeyed *= psys->flag & PSYS_KEYED_TIMING ? 1 : psys->part->keyed_loops;
}
-static void set_keyed_keys(Scene *scene, Object *ob, ParticleSystem *psys)
+static void set_keyed_keys(ParticleSimulationData *sim)
{
- Object *kob = ob;
- ParticleSystem *kpsys = psys;
- ParticleData *pa;
- int totpart = psys->totpart, i, k, totkeys = psys->totkeyed + 1;
- float prevtime, nexttime, keyedtime;
+ ParticleSystem *psys = sim->psys;
+ ParticleSimulationData ksim = {sim->scene, NULL, NULL, NULL};
+ ParticleTarget *pt;
+ PARTICLE_P;
+ ParticleKey *key;
+ int totpart = psys->totpart, k, totkeys = psys->totkeyed;
/* no proper targets so let's clear and bail out */
if(psys->totkeyed==0) {
@@ -2046,43 +2020,46 @@ static void set_keyed_keys(Scene *scene, Object *ob, ParticleSystem *psys)
if(totpart && psys->particles->totkey != totkeys) {
free_keyed_keys(psys);
- psys->particles->keys = MEM_callocN(psys->totpart*totkeys*sizeof(ParticleKey), "Keyed keys");
- psys->particles->totkey = totkeys;
+ key = MEM_callocN(totpart*totkeys*sizeof(ParticleKey), "Keyed keys");
- for(i=1, pa=psys->particles+1; i<totpart; i++,pa++){
- pa->keys = (pa-1)->keys + totkeys;
+ LOOP_PARTICLES {
+ pa->keys = key;
pa->totkey = totkeys;
+ key += totkeys;
}
}
psys->flag &= ~PSYS_KEYED;
+
+ pt = psys->targets.first;
for(k=0; k<totkeys; k++) {
- for(i=0,pa=psys->particles; i<totpart; i++, pa++) {
- (pa->keys + k)->time = -1.0; /* use current time */
+ ksim.ob = pt->ob ? pt->ob : sim->ob;
+ ksim.psys = BLI_findlink(&ksim.ob->particlesystem, pt->psys - 1);
- if(kpsys->totpart > 0)
- psys_get_particle_state(scene, kob, kpsys, i%kpsys->totpart, pa->keys + k, 1);
+ LOOP_PARTICLES {
+ key = pa->keys + k;
+ key->time = -1.0; /* use current time */
- if(k==0)
- pa->keys->time = pa->time;
- else if(k==totkeys-1)
- (pa->keys + k)->time = pa->time + pa->lifetime;
- else{
- if(psys->flag & PSYS_KEYED_TIME){
- prevtime = (pa->keys + k - 1)->time;
- nexttime = pa->time + pa->lifetime;
- keyedtime = kpsys->part->keyed_time;
- (pa->keys + k)->time = (1.0f - keyedtime) * prevtime + keyedtime * nexttime;
+ psys_get_particle_state(&ksim, p%ksim.psys->totpart, key, 1);
+
+ if(psys->flag & PSYS_KEYED_TIMING){
+ key->time = pa->time + pt->time;
+ if(pt->duration != 0.0f && k+1 < totkeys) {
+ copy_particle_key(key+1, key, 1);
+ (key+1)->time = pa->time + pt->time + pt->duration;
}
- else
- (pa->keys+k)->time = pa->time + (float)k / (float)(totkeys - 1) * pa->lifetime;
}
+ else if(totkeys > 1)
+ key->time = pa->time + (float)k / (float)(totkeys - 1) * pa->lifetime;
+ else
+ key->time = pa->time;
}
- if(kpsys->keyed_ob){
- kob = kpsys->keyed_ob;
- kpsys = BLI_findlink(&kob->particlesystem, kpsys->keyed_psys - 1);
- }
+
+ if(psys->flag & PSYS_KEYED_TIMING && pt->duration!=0.0f)
+ k++;
+
+ pt = (pt->next && pt->next->flag & PTARGET_VALID)? pt->next : psys->targets.first;
}
psys->flag |= PSYS_KEYED;
@@ -2090,114 +2067,131 @@ static void set_keyed_keys(Scene *scene, Object *ob, ParticleSystem *psys)
/************************************************/
/* Reactors */
/************************************************/
-static void push_reaction(Object* ob, ParticleSystem *psys, int pa_num, int event, ParticleKey *state)
+//static void push_reaction(ParticleSimulationData *sim, int pa_num, int event, ParticleKey *state)
+//{
+// Object *rob;
+// ParticleSystem *rpsys;
+// ParticleSettings *rpart;
+// ParticleData *pa;
+// ListBase *lb=&sim->psys->effectors;
+// ParticleEffectorCache *ec;
+// ParticleReactEvent *re;
+//
+// if(lb->first) for(ec = lb->first; ec; ec= ec->next){
+// if(ec->type & PSYS_EC_REACTOR){
+// /* all validity checks already done in add_to_effectors */
+// rob=ec->ob;
+// rpsys=BLI_findlink(&rob->particlesystem,ec->psys_nbr);
+// rpart=rpsys->part;
+// if(rpsys->part->reactevent==event){
+// pa=sim->psys->particles+pa_num;
+// re= MEM_callocN(sizeof(ParticleReactEvent), "react event");
+// re->event=event;
+// re->pa_num = pa_num;
+// re->ob = sim->ob;
+// re->psys = sim->psys;
+// re->size = pa->size;
+// copy_particle_key(&re->state,state,1);
+//
+// switch(event){
+// case PART_EVENT_DEATH:
+// re->time=pa->dietime;
+// break;
+// case PART_EVENT_COLLIDE:
+// re->time=state->time;
+// break;
+// case PART_EVENT_NEAR:
+// re->time=state->time;
+// break;
+// }
+//
+// BLI_addtail(&rpsys->reactevents, re);
+// }
+// }
+// }
+//}
+//static void react_to_events(ParticleSystem *psys, int pa_num)
+//{
+// ParticleSettings *part=psys->part;
+// ParticleData *pa=psys->particles+pa_num;
+// ParticleReactEvent *re=psys->reactevents.first;
+// int birth=0;
+// float dist=0.0f;
+//
+// for(re=psys->reactevents.first; re; re=re->next){
+// birth=0;
+// if(part->from==PART_FROM_PARTICLE){
+// if(pa->num==re->pa_num && pa->alive==PARS_UNBORN){
+// if(re->event==PART_EVENT_NEAR){
+// ParticleData *tpa = re->psys->particles+re->pa_num;
+// float pa_time=tpa->time + pa->foffset*tpa->lifetime;
+// if(re->time >= pa_time){
+// pa->time=pa_time;
+// pa->dietime=pa->time+pa->lifetime;
+// }
+// }
+// else{
+// pa->time=re->time;
+// pa->dietime=pa->time+pa->lifetime;
+// }
+// }
+// }
+// else{
+// dist=VecLenf(pa->state.co, re->state.co);
+// if(dist <= re->size){
+// if(pa->alive==PARS_UNBORN){
+// pa->time=re->time;
+// pa->dietime=pa->time+pa->lifetime;
+// birth=1;
+// }
+// if(birth || part->flag&PART_REACT_MULTIPLE){
+// float vec[3];
+// VECSUB(vec,pa->state.co, re->state.co);
+// if(birth==0)
+// VecMulf(vec,(float)pow(1.0f-dist/re->size,part->reactshape));
+// VECADDFAC(pa->state.vel,pa->state.vel,vec,part->reactfac);
+// VECADDFAC(pa->state.vel,pa->state.vel,re->state.vel,part->partfac);
+// }
+// if(birth)
+// VecMulf(pa->state.vel,(float)pow(1.0f-dist/re->size,part->reactshape));
+// }
+// }
+// }
+//}
+//void psys_get_reactor_target(ParticleSimulationData *sim, Object **target_ob, ParticleSystem **target_psys)
+//{
+// Object *tob;
+//
+// tob = sim->psys->target_ob ? sim->psys->target_ob : sim->ob;
+//
+// *target_psys = BLI_findlink(&tob->particlesystem, sim->psys->target_psys-1);
+// if(*target_psys)
+// *target_ob=tob;
+// else
+// *target_ob=0;
+//}
+/************************************************/
+/* Point Cache */
+/************************************************/
+void psys_make_temp_pointcache(Object *ob, ParticleSystem *psys)
{
- Object *rob;
- ParticleSystem *rpsys;
- ParticleSettings *rpart;
- ParticleData *pa;
- ListBase *lb=&psys->effectors;
- ParticleEffectorCache *ec;
- ParticleReactEvent *re;
-
- if(lb->first) for(ec = lb->first; ec; ec= ec->next){
- if(ec->type & PSYS_EC_REACTOR){
- /* all validity checks already done in add_to_effectors */
- rob=ec->ob;
- rpsys=BLI_findlink(&rob->particlesystem,ec->psys_nbr);
- rpart=rpsys->part;
- if(rpsys->part->reactevent==event){
- pa=psys->particles+pa_num;
- re= MEM_callocN(sizeof(ParticleReactEvent), "react event");
- re->event=event;
- re->pa_num = pa_num;
- re->ob = ob;
- re->psys = psys;
- re->size = pa->size;
- copy_particle_key(&re->state,state,1);
-
- switch(event){
- case PART_EVENT_DEATH:
- re->time=pa->dietime;
- break;
- case PART_EVENT_COLLIDE:
- re->time=state->time;
- break;
- case PART_EVENT_NEAR:
- re->time=state->time;
- break;
- }
+ PointCache *cache = psys->pointcache;
+ PTCacheID pid;
- BLI_addtail(&rpsys->reactevents, re);
- }
- }
- }
-}
-static void react_to_events(ParticleSystem *psys, int pa_num)
-{
- ParticleSettings *part=psys->part;
- ParticleData *pa=psys->particles+pa_num;
- ParticleReactEvent *re=psys->reactevents.first;
- int birth=0;
- float dist=0.0f;
-
- for(re=psys->reactevents.first; re; re=re->next){
- birth=0;
- if(part->from==PART_FROM_PARTICLE){
- if(pa->num==re->pa_num && pa->alive==PARS_UNBORN){
- if(re->event==PART_EVENT_NEAR){
- ParticleData *tpa = re->psys->particles+re->pa_num;
- float pa_time=tpa->time + pa->foffset*tpa->lifetime;
- if(re->time >= pa_time){
- pa->time=pa_time;
- pa->dietime=pa->time+pa->lifetime;
- }
- }
- else{
- pa->time=re->time;
- pa->dietime=pa->time+pa->lifetime;
- }
- }
- }
- else{
- dist=VecLenf(pa->state.co, re->state.co);
- if(dist <= re->size){
- if(pa->alive==PARS_UNBORN){
- pa->time=re->time;
- pa->dietime=pa->time+pa->lifetime;
- birth=1;
- }
- if(birth || part->flag&PART_REACT_MULTIPLE){
- float vec[3];
- VECSUB(vec,pa->state.co, re->state.co);
- if(birth==0)
- VecMulf(vec,(float)pow(1.0f-dist/re->size,part->reactshape));
- VECADDFAC(pa->state.vel,pa->state.vel,vec,part->reactfac);
- VECADDFAC(pa->state.vel,pa->state.vel,re->state.vel,part->partfac);
- }
- if(birth)
- VecMulf(pa->state.vel,(float)pow(1.0f-dist/re->size,part->reactshape));
- }
- }
- }
+ if((cache->flag & PTCACHE_DISK_CACHE)==0 || cache->mem_cache.first)
+ return;
+
+ BKE_ptcache_id_from_particles(&pid, ob, psys);
+
+ BKE_ptcache_disk_to_mem(&pid);
}
-void psys_get_reactor_target(Object *ob, ParticleSystem *psys, Object **target_ob, ParticleSystem **target_psys)
+static void psys_clear_temp_pointcache(ParticleSystem *psys)
{
- Object *tob;
+ if((psys->pointcache->flag & PTCACHE_DISK_CACHE)==0)
+ return;
- tob=psys->target_ob;
- if(tob==0)
- tob=ob;
-
- *target_psys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
- if(*target_psys)
- *target_ob=tob;
- else
- *target_ob=0;
+ BKE_ptcache_free_mem(&psys->pointcache->mem_cache);
}
-/************************************************/
-/* Point Cache */
-/************************************************/
void psys_get_pointcache_start_end(Scene *scene, ParticleSystem *psys, int *sfra, int *efra)
{
ParticleSettings *part = psys->part;
@@ -2205,82 +2199,31 @@ void psys_get_pointcache_start_end(Scene *scene, ParticleSystem *psys, int *sfra
*sfra = MAX2(1, (int)part->sta);
*efra = MIN2((int)(part->end + part->lifetime + 1.0), scene->r.efra);
}
-static float *particle_state_ptr(int index, void *psys_ptr)
-{
- ParticleSystem *psys= psys_ptr;
-
- return (float *)(&(psys->particles+index)->state);
-}
-static void particle_read_state(int index, void *psys_ptr, float *data)
-{
- ParticleSystem *psys= psys_ptr;
- ParticleData *pa = psys->particles + index;
- ParticleKey *key = (ParticleKey *)data;
- if(key->time > pa->state.time)
- copy_particle_key(&pa->prev_state, &pa->state, 1);
-
- copy_particle_key(&pa->state, key, 1);
-}
-static void particle_cache_interpolate(int index, void *psys_ptr, float frs_sec, float cfra, int cfra1, int cfra2, float *data1, float *data2)
-{
- ParticleSystem *psys= psys_ptr;
- ParticleData *pa = psys->particles + index;
- ParticleKey keys[4];
- float dfra;
-
- keys[1] = *((ParticleKey*)data1);
- keys[2] = *((ParticleKey*)data2);
-
- dfra = keys[2].time - keys[1].time;
-
- VecMulf(keys[1].vel, dfra / frs_sec);
- VecMulf(keys[2].vel, dfra / frs_sec);
-
- psys_interpolate_particle(-1, keys, (keys[1].time - cfra) / dfra, &pa->state, 1);
-
- VecMulf(pa->state.vel, frs_sec / dfra);
-}
-static void write_particles_to_cache(Object *ob, ParticleSystem *psys, int cfra)
+/************************************************/
+/* Effectors */
+/************************************************/
+static void update_particle_tree(ParticleSystem *psys)
{
- PTCacheWriter writer;
- PTCacheID pid;
-
- BKE_ptcache_id_from_particles(&pid, ob, psys);
-
- writer.calldata = psys;
- writer.cfra = cfra;
- writer.elem_ptr = particle_state_ptr;
- writer.pid = &pid;
- writer.totelem = psys->totpart;
+ if(psys) {
+ PARTICLE_P;
- BKE_ptcache_write_cache(&writer);
-}
+ if(!psys->tree || psys->tree_frame != psys->cfra) {
+
+ BLI_kdtree_free(psys->tree);
-static int get_particles_from_cache(Scene *scene, Object *ob, ParticleSystem *psys, float cfra, int allow_interpolate, int allow_old, int *old_frame)
-{
- PTCacheReader reader;
- PTCacheID pid;
-
- BKE_ptcache_id_from_particles(&pid, ob, psys);
+ psys->tree = BLI_kdtree_new(psys->totpart);
+
+ LOOP_SHOWN_PARTICLES {
+ if(pa->alive == PARS_ALIVE)
+ BLI_kdtree_insert(psys->tree, p, pa->state.co, NULL);
+ }
+ BLI_kdtree_balance(psys->tree);
- reader.allow_interpolate = allow_interpolate;
- reader.allow_old = allow_old;
- reader.calldata = psys;
- reader.cfra = cfra;
- reader.interpolate_elem = particle_cache_interpolate;
- reader.old_frame = old_frame;
- reader.pid = &pid;
- reader.scene = scene;
- reader.set_elem = particle_read_state;
- reader.totelem = psys->totpart;
-
- return BKE_ptcache_read_cache(&reader);
+ psys->tree_frame = psys->cfra;
+ }
+ }
}
-
-/************************************************/
-/* Effectors */
-/************************************************/
static void do_texture_effector(Tex *tex, short mode, short is_2d, float nabla, short object, float *pa_co, float obmat[4][4], float force_val, float falloff, float *field)
{
TexResult result[4];
@@ -2290,7 +2233,7 @@ static void do_texture_effector(Tex *tex, short mode, short is_2d, float nabla,
result[0].nor = result[1].nor = result[2].nor = result[3].nor = 0;
- strength= force_val*falloff;///(float)pow((double)distance,(double)power);
+ strength= force_val*falloff;
VECCOPY(tex_co,pa_co);
@@ -2353,19 +2296,19 @@ static void do_texture_effector(Tex *tex, short mode, short is_2d, float nabla,
VecAddf(field,field,mag_vec);
}
-static void add_to_effectors(ListBase *lb, Scene *scene, Object *ob, Object *obsrc, ParticleSystem *psys)
+static void add_to_effectors(ParticleSimulationData *sim, ListBase *lb, Object *ob)
{
ParticleEffectorCache *ec;
PartDeflect *pd= ob->pd;
short type=0,i;
- if(pd && ob != obsrc){
+ if(pd && ob != sim->ob){
if(pd->forcefield == PFIELD_GUIDE) {
if(ob->type==OB_CURVE) {
Curve *cu= ob->data;
if(cu->flag & CU_PATH) {
if(cu->path==NULL || cu->path->data==NULL)
- makeDispListCurveTypes(scene, ob, 0);
+ makeDispListCurveTypes(sim->scene, ob, 0);
if(cu->path && cu->path->data) {
type |= PSYS_EC_EFFECTOR;
}
@@ -2399,11 +2342,13 @@ static void add_to_effectors(ListBase *lb, Scene *scene, Object *ob, Object *obs
if(ob->particlesystem.first){
ParticleSystem *epsys=ob->particlesystem.first;
ParticleSettings *epart=0;
- Object *tob;
+ //Object *tob;
for(i=0; epsys; epsys=epsys->next,i++){
+ if(!psys_check_enabled(ob, epsys))
+ continue;
type=0;
- if(epsys!=psys || (psys->part->flag & PART_SELF_EFFECT)){
+ if(epsys!=sim->psys || (sim->psys->part->flag & PART_SELF_EFFECT)){
epart=epsys->part;
if((epsys->part->pd && epsys->part->pd->forcefield)
@@ -2412,13 +2357,13 @@ static void add_to_effectors(ListBase *lb, Scene *scene, Object *ob, Object *obs
type=PSYS_EC_PARTICLE;
}
- if(epart->type==PART_REACTOR) {
- tob=epsys->target_ob;
- if(tob==0)
- tob=ob;
- if(BLI_findlink(&tob->particlesystem,epsys->target_psys-1)==psys)
- type|=PSYS_EC_REACTOR;
- }
+ //if(epart->type==PART_REACTOR) {
+ // tob=epsys->target_ob;
+ // if(tob==0)
+ // tob=ob;
+ // if(BLI_findlink(&tob->particlesystem,epsys->target_psys-1)==sim->psys)
+ // type|=PSYS_EC_REACTOR;
+ //}
if(type){
ec= MEM_callocN(sizeof(ParticleEffectorCache), "effector cache");
@@ -2436,29 +2381,29 @@ static void add_to_effectors(ListBase *lb, Scene *scene, Object *ob, Object *obs
}
}
-static void psys_init_effectors_recurs(Scene *scene, Object *ob, Object *obsrc, ParticleSystem *psys, ListBase *listb, int level)
+static void psys_init_effectors_recurs(ParticleSimulationData *sim, Object *ob, ListBase *listb, int level)
{
Group *group;
GroupObject *go;
- unsigned int layer= obsrc->lay;
+ unsigned int layer= sim->ob->lay;
if(level>MAX_DUPLI_RECUR) return;
if(ob->lay & layer) {
if(ob->pd || ob->particlesystem.first)
- add_to_effectors(listb, scene, ob, obsrc, psys);
+ add_to_effectors(sim, listb, ob);
if(ob->dup_group) {
group= ob->dup_group;
for(go= group->gobject.first; go; go= go->next)
- psys_init_effectors_recurs(scene, go->ob, obsrc, psys, listb, level+1);
+ psys_init_effectors_recurs(sim, go->ob, listb, level+1);
}
}
}
-void psys_init_effectors(Scene *scene, Object *obsrc, Group *group, ParticleSystem *psys)
+static void psys_init_effectors(ParticleSimulationData *sim, Group *group)
{
- ListBase *listb= &psys->effectors;
+ ListBase *listb= &sim->psys->effectors;
Base *base;
listb->first=listb->last=0;
@@ -2467,11 +2412,11 @@ void psys_init_effectors(Scene *scene, Object *obsrc, Group *group, ParticleSyst
GroupObject *go;
for(go= group->gobject.first; go; go= go->next)
- psys_init_effectors_recurs(scene, go->ob, obsrc, psys, listb, 0);
+ psys_init_effectors_recurs(sim, go->ob, listb, 0);
}
else {
- for(base = scene->base.first; base; base= base->next)
- psys_init_effectors_recurs(scene, base->object, obsrc, psys, listb, 0);
+ for(base = sim->scene->base.first; base; base= base->next)
+ psys_init_effectors_recurs(sim, base->object, listb, 0);
}
}
@@ -2480,41 +2425,42 @@ void psys_end_effectors(ParticleSystem *psys)
/* NOTE:
ec->ob is not valid in here anymore! - dg
*/
- ListBase *lb=&psys->effectors;
- if(lb->first) {
- ParticleEffectorCache *ec;
- for(ec= lb->first; ec; ec= ec->next){
- if(ec->distances)
- MEM_freeN(ec->distances);
+ ParticleEffectorCache *ec = psys->effectors.first;
- if(ec->locations)
- MEM_freeN(ec->locations);
+ for(; ec; ec= ec->next){
+ if(ec->distances)
+ MEM_freeN(ec->distances);
- if(ec->face_minmax)
- MEM_freeN(ec->face_minmax);
+ if(ec->locations)
+ MEM_freeN(ec->locations);
- if(ec->vert_cos)
- MEM_freeN(ec->vert_cos);
+ if(ec->face_minmax)
+ MEM_freeN(ec->face_minmax);
- if(ec->tree)
- BLI_kdtree_free(ec->tree);
-
- if(ec->rng)
- rng_free(ec->rng);
- }
+ if(ec->vert_cos)
+ MEM_freeN(ec->vert_cos);
- BLI_freelistN(lb);
+ if(ec->tree)
+ BLI_kdtree_free(ec->tree);
+
+ if(ec->rng)
+ rng_free(ec->rng);
}
+
+ BLI_freelistN(&psys->effectors);
}
-static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra)
+/* precalcs effectors and returns 1 if there were any collision object
+ * so collision checks can be avoided as quickly as possible */
+static int precalc_effectors(ParticleSimulationData *sim, float cfra)
{
+ ParticleSystem *psys = sim->psys;
ListBase *lb=&psys->effectors;
ParticleEffectorCache *ec;
ParticleSettings *part=psys->part;
- ParticleData *pa;
- float vec2[3],loc[3],*co=0;
- int p,totpart;
+ PARTICLE_P;
+ int totpart, collision = 0;
+ float vec2[3],loc[3],radius,*co=0;
for(ec= lb->first; ec; ec= ec->next) {
PartDeflect *pd= ec->ob->pd;
@@ -2524,7 +2470,7 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa
&& part->phystype!=PART_PHYS_BOIDS) {
float vec[4];
- where_on_path(ec->ob, 0.0, vec, vec2);
+ where_on_path(ec->ob, 0.0, vec, vec2, NULL, &radius);
Mat4MulVecfl(ec->ob->obmat,vec);
Mat4Mul3Vecfl(ec->ob->obmat,vec2);
@@ -2532,20 +2478,22 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa
QUATCOPY(ec->firstloc,vec);
VECCOPY(ec->firstdir,vec2);
+ /* TODO - use 'radius' to adjust the effector */
+
totpart=psys->totpart;
if(totpart){
ec->distances=MEM_callocN(totpart*sizeof(float),"particle distances");
ec->locations=MEM_callocN(totpart*3*sizeof(float),"particle locations");
- for(p=0,pa=psys->particles; p<totpart; p++, pa++){
+ LOOP_PARTICLES {
if(part->from == PART_FROM_PARTICLE) {
VECCOPY(loc, pa->fuv);
}
else
- psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,0,0);
+ psys_particle_on_emitter(sim->psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,0,0);
- Mat4MulVecfl(ob->obmat,loc);
+ Mat4MulVecfl(sim->ob->obmat,loc);
ec->distances[p]=VecLenf(loc,vec);
VECSUB(loc,loc,vec);
VECCOPY(ec->locations+3*p,loc);
@@ -2553,11 +2501,10 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa
}
}
else if(ec->type==PSYS_EC_PARTICLE){
- Object *eob = ec->ob;
- ParticleSystem *epsys = BLI_findlink(&eob->particlesystem,ec->psys_nbr);
- ParticleSettings *epart = epsys->part;
+ ParticleSimulationData esim = {sim->scene, ec->ob, BLI_findlink(&ec->ob->particlesystem, ec->psys_nbr), NULL};
+ ParticleSettings *epart = esim.psys->part;
ParticleData *epa;
- int p, totepart = epsys->totpart;
+ int p, totepart = esim.psys->totpart;
if(psys->part->phystype==PART_PHYS_BOIDS){
ParticleKey state;
@@ -2570,8 +2517,8 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa
tree=BLI_kdtree_new(totepart);
ec->tree=tree;
- for(p=0, epa=epsys->particles; p<totepart; p++,epa++)
- if(epa->alive==PARS_ALIVE && psys_get_particle_state(scene, eob,epsys,p,&state,0))
+ for(p=0, epa=esim.psys->particles; p<totepart; p++,epa++)
+ if(epa->alive==PARS_ALIVE && psys_get_particle_state(&esim,p,&state,0))
BLI_kdtree_insert(tree, p, state.co, NULL);
BLI_kdtree_balance(tree);
@@ -2581,28 +2528,115 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa
}
else if(ec->type==PSYS_EC_DEFLECT) {
CollisionModifierData *collmd = ( CollisionModifierData * ) ( modifiers_findByType ( ec->ob, eModifierType_Collision ) );
- if(collmd)
+ if(collmd) {
collision_move_object(collmd, 1.0, 0.0);
+ collision = 1;
+ }
}
}
+
+ return collision;
+}
+
+/* updates particle effectors and returns if any collision objects were found */
+int psys_update_effectors(ParticleSimulationData *sim, float cfra, int precalc)
+{
+ psys_end_effectors(sim->psys);
+ psys_init_effectors(sim, sim->psys->part->eff_group);
+ return (precalc ? precalc_effectors(sim, cfra) : 0);
}
+int effector_find_co(Scene *scene, float *pco, SurfaceModifierData *sur, Object *ob, PartDeflect *pd, float *co, float *nor, float *vel, int *index)
+{
+ SurfaceModifierData *surmd = NULL;
+ int ret = 0;
+
+ if(sur)
+ surmd = sur;
+ else if(pd && pd->flag&PFIELD_SURFACE)
+ {
+ surmd = (SurfaceModifierData *)modifiers_findByType ( ob, eModifierType_Surface );
+ }
+
+ if(surmd) {
+ /* closest point in the object surface is an effector */
+ BVHTreeNearest nearest;
+
+ nearest.index = -1;
+ nearest.dist = FLT_MAX;
+
+ BLI_bvhtree_find_nearest(surmd->bvhtree->tree, pco, &nearest, surmd->bvhtree->nearest_callback, surmd->bvhtree);
+
+ if(nearest.index != -1) {
+ VECCOPY(co, nearest.co);
+ if(nor) {
+ VECCOPY(nor, nearest.no);
+ }
+
+ if(vel) {
+ MFace *mface = CDDM_get_face(surmd->dm, nearest.index);
+
+ VECCOPY(vel, surmd->v[mface->v1].co);
+ VecAddf(vel, vel, surmd->v[mface->v2].co);
+ VecAddf(vel, vel, surmd->v[mface->v3].co);
+ if(mface->v4)
+ VecAddf(vel, vel, surmd->v[mface->v4].co);
+
+ VecMulf(vel, mface->v4 ? 0.25f : 0.333f);
+ }
+
+ if(index)
+ *index = nearest.index;
+
+ ret = 1;
+ }
+ else {
+ co[0] = co[1] = co[2] = 0.0f;
+
+ if(nor)
+ nor[0] = nor[1] = nor[2] = 0.0f;
+
+ if(vel)
+ vel[0] = vel[1] = vel[2] = 0.0f;
+ }
+ }
+ else {
+ /* use center of object for distance calculus */
+ VECCOPY(co, ob->obmat[3]);
+ if(nor) {
+ VECCOPY(nor, ob->obmat[2]);
+ }
+
+ if(vel) {
+ Object obcopy = *ob;
+
+ VECCOPY(vel, ob->obmat[3]);
+
+ where_is_object_time(scene, ob, scene->r.cfra - 1.0);
+
+ VecSubf(vel, vel, ob->obmat[3]);
+
+ *ob = obcopy;
+ }
+ }
+
+ return ret;
+}
/* calculate forces that all effectors apply to a particle*/
-void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Scene *scene, Object *ob, ParticleSystem *psys, float *rootco, float *force_field, float *vel,float framestep, float cfra)
+void do_effectors(ParticleSimulationData *sim, int pa_no, ParticleData *pa, ParticleKey *state, float *rootco, float *force_field, float *vel,float framestep, float cfra)
{
Object *eob;
- ParticleSystem *epsys;
+ ParticleSystem *psys = sim->psys;
ParticleSettings *epart;
ParticleData *epa;
ParticleKey estate;
PartDeflect *pd;
- SurfaceModifierData *surmd = NULL;
ListBase *lb=&psys->effectors;
ParticleEffectorCache *ec;
- float distance, vec_to_part[3];
- float falloff, charge = 0.0f;
- int p;
+ float distance, vec_to_part[3], pco[3], co[3];
+ float falloff, charge = 0.0f, strength;
+ int p, face_index=-1;
/* check all effector objects for interaction */
if(lb->first){
@@ -2623,107 +2657,98 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Scene *scene,
if(ec->type & PSYS_EC_EFFECTOR){
pd=eob->pd;
if(psys->part->type!=PART_HAIR && psys->part->integrator)
- where_is_object_time(scene, eob,cfra);
+ where_is_object_time(sim->scene, eob, cfra);
if(pd && pd->flag&PFIELD_SURFACE) {
- surmd = (SurfaceModifierData *)modifiers_findByType ( eob, eModifierType_Surface );
- }
- if(surmd) {
- /* closest point in the object surface is an effector */
- BVHTreeNearest nearest;
float velocity[3];
-
- nearest.index = -1;
- nearest.dist = FLT_MAX;
-
/* using velocity corrected location allows for easier sliding over effector surface */
VecCopyf(velocity, state->vel);
- VecMulf(velocity, psys_get_timestep(psys->part));
- VecAddf(vec_to_part, state->co, velocity);
-
- BLI_bvhtree_find_nearest(surmd->bvhtree->tree, vec_to_part, &nearest, surmd->bvhtree->nearest_callback, surmd->bvhtree);
-
- if(nearest.index != -1) {
- VecSubf(vec_to_part, state->co, nearest.co);
- }
- else
- vec_to_part[0] = vec_to_part[1] = vec_to_part[2] = 0.0f;
+ VecMulf(velocity, psys_get_timestep(sim));
+ VecAddf(pco, state->co, velocity);
}
else
- /* use center of object for distance calculus */
- VecSubf(vec_to_part, state->co, eob->obmat[3]);
+ VECCOPY(pco, state->co);
+
+ effector_find_co(sim->scene, pco, NULL, eob, pd, co, NULL, NULL, &face_index);
+
+ VecSubf(vec_to_part, state->co, co);
distance = VecLength(vec_to_part);
falloff=effector_falloff(pd,eob->obmat[2],vec_to_part);
+ strength = pd->f_strength * psys->part->effector_weight[0] * psys->part->effector_weight[pd->forcefield];
+
if(falloff<=0.0f)
; /* don't do anything */
else if(pd->forcefield==PFIELD_TEXTURE) {
do_texture_effector(pd->tex, pd->tex_mode, pd->flag&PFIELD_TEX_2D, pd->tex_nabla,
pd->flag & PFIELD_TEX_OBJECT, (pd->flag & PFIELD_TEX_ROOTCO) ? rootco : state->co, eob->obmat,
- pd->f_strength, falloff, force_field);
+ strength, falloff, force_field);
} else {
- do_physical_effector(scene, eob, state->co, pd->forcefield,pd->f_strength,distance,
+ do_physical_effector(sim->scene, eob, state->co, pd->forcefield,strength,distance,
falloff,0.0,pd->f_damp,eob->obmat[2],vec_to_part,
state->vel,force_field,pd->flag&PFIELD_PLANAR,ec->rng,pd->f_noise,charge,pa->size);
}
}
if(ec->type & PSYS_EC_PARTICLE){
+ ParticleSimulationData esim = {sim->scene, eob, BLI_findlink(&eob->particlesystem,ec->psys_nbr), NULL};
int totepart, i;
- epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
- epart= epsys->part;
- pd=epart->pd;
- totepart= epsys->totpart;
+
+ epart = esim.psys->part;
+ pd = epart->pd;
+ totepart = esim.psys->totpart;
if(totepart <= 0)
continue;
if(pd && pd->forcefield==PFIELD_HARMONIC){
/* every particle is mapped to only one harmonic effector particle */
- p= pa_no%epsys->totpart;
+ p= pa_no%esim.psys->totpart;
totepart= p+1;
}
else{
p=0;
}
- epsys->lattice= psys_get_lattice(scene, ob, psys);
+ esim.psys->lattice= psys_get_lattice(sim);
for(; p<totepart; p++){
/* particle skips itself as effector */
- if(epsys==psys && p == pa_no) continue;
+ if(esim.psys == psys && p == pa_no) continue;
- epa = epsys->particles + p;
- estate.time=cfra;
- if(psys_get_particle_state(scene, eob,epsys,p,&estate,0)){
+ epa = esim.psys->particles + p;
+ estate.time = cfra;
+ if(psys_get_particle_state(&esim, p, &estate, 0)){
VECSUB(vec_to_part, state->co, estate.co);
distance = VecLength(vec_to_part);
for(i=0, pd = epart->pd; i<2; i++,pd = epart->pd2) {
if(pd==NULL || pd->forcefield==0) continue;
- falloff=effector_falloff(pd,estate.vel,vec_to_part);
+ falloff = effector_falloff(pd, estate.vel, vec_to_part);
+
+ strength = pd->f_strength * psys->part->effector_weight[0] * psys->part->effector_weight[pd->forcefield];
if(falloff<=0.0f)
; /* don't do anything */
else
- do_physical_effector(scene, eob, state->co, pd->forcefield,pd->f_strength,distance,
+ do_physical_effector(sim->scene, eob, state->co, pd->forcefield,strength,distance,
falloff,epart->size,pd->f_damp,estate.vel,vec_to_part,
state->vel,force_field,0, ec->rng, pd->f_noise,charge,pa->size);
}
}
else if(pd && pd->forcefield==PFIELD_HARMONIC && cfra-framestep <= epa->dietime && cfra>epa->dietime){
/* first step after key release */
- psys_get_particle_state(scene, eob,epsys,p,&estate,1);
- VECADD(vel,vel,estate.vel);
+ psys_get_particle_state(&esim, p, &estate, 1);
+ VECADD(vel, vel, estate.vel);
/* TODO: add rotation handling here too */
}
}
- if(epsys->lattice){
- end_latt_deform(epsys->lattice);
- epsys->lattice= NULL;
+ if(esim.psys->lattice){
+ end_latt_deform(esim.psys->lattice);
+ esim.psys->lattice= NULL;
}
}
}
@@ -2734,11 +2759,14 @@ void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Scene *scene,
/* Newtonian physics */
/************************************************/
/* gathers all forces that effect particles and calculates a new state for the particle */
-static void apply_particle_forces(Scene *scene, int pa_no, ParticleData *pa, Object *ob, ParticleSystem *psys, ParticleSettings *part, float timestep, float dfra, float cfra)
+static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra, float cfra)
{
+ ParticleSettings *part = sim->psys->part;
+ ParticleData *pa = sim->psys->particles + p;
ParticleKey states[5], tkey;
+ float timestep = psys_get_timestep(sim);
float force[3],tvel[3],dx[4][3],dv[4][3];
- float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=psys->cfra;
+ float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=sim->psys->cfra;
int i, steps=1;
/* maintain angular velocity */
@@ -2766,7 +2794,7 @@ static void apply_particle_forces(Scene *scene, int pa_no, ParticleData *pa, Obj
tvel[0]=tvel[1]=tvel[2]=0.0;
/* add effectors */
if(part->type != PART_HAIR)
- do_effectors(pa_no,pa,states+i,scene, ob, psys,states->co,force,tvel,dfra,fra);
+ do_effectors(sim, p, pa, states+i, states->co, force, tvel, dfra, fra);
/* calculate air-particle interaction */
if(part->dragfac!=0.0f){
@@ -2799,7 +2827,7 @@ static void apply_particle_forces(Scene *scene, int pa_no, ParticleData *pa, Obj
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=psys->cfra+0.5f*dfra;
+ fra=sim->psys->cfra+0.5f*dfra;
}
else{
VECADDFAC(pa->state.co,states->co,states[1].vel,dtime);
@@ -2816,7 +2844,7 @@ static void apply_particle_forces(Scene *scene, int pa_no, ParticleData *pa, Obj
VECADDFAC(states[1].co,states->co,dx[0],0.5f);
VECADDFAC(states[1].vel,states->vel,dv[0],0.5f);
- fra=psys->cfra+0.5f*dfra;
+ fra=sim->psys->cfra+0.5f*dfra;
break;
case 1:
VECADDFAC(dx[1],states->vel,dv[0],0.5f);
@@ -2870,7 +2898,7 @@ static void apply_particle_forces(Scene *scene, int pa_no, ParticleData *pa, Obj
tkey.time=pa->state.time;
if(part->type != PART_HAIR) {
- if(do_guide(scene, &tkey, pa_no, time, &psys->effectors)) {
+ if(do_guide(sim->scene, &tkey, p, time, &sim->psys->effectors)) {
VECCOPY(pa->state.co,tkey.co);
/* guides don't produce valid velocity */
VECSUB(pa->state.vel,tkey.co,pa->prev_state.co);
@@ -3060,20 +3088,7 @@ int psys_intersect_dm(Scene *scene, Object *ob, DerivedMesh *dm, float *vert_cos
return intersect;
}
-/* container for moving data between deflet_particle and particle_intersect_face */
-typedef struct ParticleCollision
-{
- struct Object *ob, *ob_t; // collided and current objects
- struct CollisionModifierData *md; // collision modifier for ob_t;
- float nor[3]; // normal at collision point
- float vel[3]; // velocity of collision point
- float co1[3], co2[3]; // ray start and end points
- float ray_len; // original length of co2-co1, needed for collision time evaluation
- float t; // time of previous collision, needed for substracting face velocity
-}
-ParticleCollision;
-
-static void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
{
ParticleCollision *col = (ParticleCollision *) userdata;
MFace *face = col->md->mfaces + index;
@@ -3147,21 +3162,32 @@ static void particle_intersect_face(void *userdata, int index, const BVHTreeRay
/* angular momentum <-> linear momentum and swept sphere - mesh collisions */
/* 1. check for all possible deflectors for closest intersection on particle path */
/* 2. if deflection was found kill the particle or calculate new coordinates */
-static void deflect_particle(Scene *scene, Object *pob, ParticleSystemModifierData *psmd, ParticleSystem *psys, ParticleSettings *part, ParticleData *pa, int p, float timestep, float dfra, float cfra){
- Object *ob = NULL;
- ListBase *lb=&psys->effectors;
+static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, float cfra){
+ Object *ob = NULL, *skip_ob = NULL;
+ ParticleSettings *part = sim->psys->part;
+ ListBase *lb=&sim->psys->effectors;
ParticleEffectorCache *ec;
ParticleKey reaction_state;
ParticleCollision col;
+ ParticleData *pa = sim->psys->particles + p;
BVHTreeRayHit hit;
float ray_dir[3], zerovec[3]={0.0,0.0,0.0};
- float radius = ((part->flag & PART_SIZE_DEFL)?pa->size:0.0f);
+ float radius = ((part->flag & PART_SIZE_DEFL)?pa->size:0.0f), boid_z = 0.0f;
+ float timestep = psys_get_timestep(sim);
int deflections=0, max_deflections=10;
VECCOPY(col.co1, pa->prev_state.co);
VECCOPY(col.co2, pa->state.co);
col.t = 0.0f;
+ /* override for boids */
+ if(part->phystype == PART_PHYS_BOIDS) {
+ BoidParticle *bpa = pa->boid;
+ radius = pa->size;
+ boid_z = pa->state.co[2];
+ skip_ob = bpa->ground;
+ }
+
/* 10 iterations to catch multiple deflections */
if(lb->first) while(deflections < max_deflections){
/* 1. */
@@ -3179,13 +3205,17 @@ static void deflect_particle(Scene *scene, Object *pob, ParticleSystemModifierDa
if(ec->type & PSYS_EC_DEFLECT){
ob= ec->ob;
- if(part->type!=PART_HAIR)
- where_is_object_time(scene, ob,cfra);
+ /* for boids: don't check with current ground object */
+ if(ob==skip_ob)
+ continue;
/* particles should not collide with emitter at birth */
- if(ob==pob && pa->time < cfra && pa->time >= psys->cfra)
+ if(ob==sim->ob && pa->time < cfra && pa->time >= sim->psys->cfra)
continue;
+ if(part->type!=PART_HAIR)
+ where_is_object_time(sim->scene, sim->ob, cfra);
+
col.md = ( CollisionModifierData * ) ( modifiers_findByType ( ec->ob, eModifierType_Collision ) );
col.ob_t = ob;
@@ -3225,12 +3255,7 @@ static void deflect_particle(Scene *scene, Object *pob, ParticleSystemModifierDa
deflections=max_deflections;
/* store for reactors */
- copy_particle_key(&reaction_state,&pa->state,0);
-
- if(part->flag & PART_STICKY){
- pa->stick_ob=ob;
- pa->flag |= PARS_STICKY;
- }
+ copy_particle_key(&reaction_state, &pa->state, 0);
}
else {
float nor_vec[3], tan_vec[3], tan_vel[3], vel[3];
@@ -3317,10 +3342,18 @@ static void deflect_particle(Scene *scene, Object *pob, ParticleSystemModifierDa
/* make sure we don't hit the current face again */
VECADDFAC(co, co, col.nor, (through ? -0.0001f : 0.0001f));
+ if(part->phystype == PART_PHYS_BOIDS && part->boids->options & BOID_ALLOW_LAND) {
+ BoidParticle *bpa = pa->boid;
+ if(bpa->data.mode == eBoidMode_OnLand || co[2] <= boid_z) {
+ co[2] = boid_z;
+ vel[2] = 0.0f;
+ }
+ }
+
/* store state for reactors */
- VECCOPY(reaction_state.co, co);
- VecLerpf(reaction_state.vel, pa->prev_state.vel, pa->state.vel, dt);
- QuatInterpol(reaction_state.rot, pa->prev_state.rot, pa->state.rot, dt);
+ //VECCOPY(reaction_state.co, co);
+ //VecLerpf(reaction_state.vel, pa->prev_state.vel, pa->state.vel, dt);
+ //QuatInterpol(reaction_state.rot, pa->prev_state.rot, pa->state.rot, dt);
/* set coordinates for next iteration */
VECCOPY(col.co1, co);
@@ -3342,660 +3375,257 @@ static void deflect_particle(Scene *scene, Object *pob, ParticleSystemModifierDa
}
deflections++;
- reaction_state.time = cfra - (1.0f - dt) * dfra;
- push_reaction(col.ob, psys, p, PART_EVENT_COLLIDE, &reaction_state);
+ //reaction_state.time = cfra - (1.0f - dt) * dfra;
+ //push_reaction(col.ob, psys, p, PART_EVENT_COLLIDE, &reaction_state);
}
else
return;
}
}
/************************************************/
-/* Boid physics */
+/* Hair */
/************************************************/
-static int boid_see_mesh(ListBase *lb, Scene *scene, Object *pob, ParticleSystem *psys, float *vec1, float *vec2, float *loc, float *nor, float cfra)
+/* check if path cache or children need updating and do it if needed */
+static void psys_update_path_cache(ParticleSimulationData *sim, float cfra)
{
- Object *ob, *min_ob;
- DerivedMesh *dm;
- MFace *mface;
- MVert *mvert;
- ParticleEffectorCache *ec;
- ParticleSystemModifierData *psmd=psys_get_modifier(pob,psys);
- float imat[4][4];
- float co1[3], co2[3], min_w[4], min_d;
- int min_face=0, intersect=0;
-
- if(lb->first){
- intersect=0;
- min_d=20000.0;
- min_ob=NULL;
- for(ec=lb->first; ec; ec=ec->next){
- if(ec->type & PSYS_EC_DEFLECT){
- ob= ec->ob;
-
- if(psys->part->type!=PART_HAIR)
- where_is_object_time(scene, ob,cfra);
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
+ ParticleEditSettings *pset = &sim->scene->toolsettings->particle;
+ int distr=0, alloc=0, skip=0;
- if(ob==pob)
- dm=psmd->dm;
- else
- dm=0;
+ if((psys->part->childtype && psys->totchild != get_psys_tot_child(sim->scene, psys)) || psys->recalc&PSYS_RECALC_RESET)
+ alloc=1;
- VECCOPY(co1,vec1);
- VECCOPY(co2,vec2);
+ if(alloc || psys->recalc&PSYS_RECALC_CHILD || (psys->vgroup[PSYS_VG_DENSITY] && (sim->ob && sim->ob->mode & OB_MODE_WEIGHT_PAINT)))
+ distr=1;
- if(ec->vert_cos==0){
- /* convert particle coordinates to object coordinates */
- Mat4Invert(imat,ob->obmat);
+ if(distr){
+ if(alloc)
+ realloc_particles(sim, sim->psys->totpart);
- Mat4MulVecfl(imat,co1);
- Mat4MulVecfl(imat,co2);
- }
+ if(get_psys_tot_child(sim->scene, psys)) {
+ /* don't generate children while computing the hair keys */
+ if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
+ distribute_particles(sim, PART_FROM_CHILD);
- if(psys_intersect_dm(scene,ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w,ec->face_minmax,0,0,0))
- min_ob=ob;
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0)
+ psys_find_parents(sim);
}
}
- if(min_ob){
- ob=min_ob;
-
- if(ob==pob){
- dm=psmd->dm;
- }
- else{
- psys_disable_all(ob);
-
- dm=mesh_get_derived_final(scene, ob, 0);
- if(dm==0)
- dm=mesh_get_derived_deform(scene, ob, 0);
+ }
- psys_enable_all(ob);
- }
+ if((part->type==PART_HAIR || psys->flag&PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0)
+ skip = 1; /* only hair, keyed and baked stuff can have paths */
+ else if(part->ren_as != PART_DRAW_PATH)
+ skip = 1; /* particle visualization must be set as path */
+ else if(!psys->renderdata) {
+ if(part->draw_as != PART_DRAW_REND)
+ skip = 1; /* draw visualization */
+ else if(psys->pointcache->flag & PTCACHE_BAKING)
+ skip = 1; /* no need to cache paths while baking dynamics */
+ else if(psys_in_edit_mode(sim->scene, psys)) {
+ if((pset->flag & PE_DRAW_PART)==0)
+ skip = 1;
+ else if(part->childtype==0 && (psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED)==0)
+ skip = 1; /* in edit mode paths are needed for child particles and dynamic hair */
+ }
+ }
- mface=dm->getFaceDataArray(dm,CD_MFACE);
- mface+=min_face;
- mvert=dm->getVertDataArray(dm,CD_MVERT);
+ if(!skip) {
+ psys_cache_paths(sim, cfra);
- /* get deflection point & normal */
- psys_interpolate_face(mvert,mface,0,0,min_w,loc,nor,0,0,0,0);
+ /* for render, child particle paths are computed on the fly */
+ if(part->childtype) {
+ if(!psys->totchild)
+ skip = 1;
+ else if((psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DONE)==0)
+ skip = 1;
- VECADD(nor,nor,loc);
- Mat4MulVecfl(ob->obmat,loc);
- Mat4MulVecfl(ob->obmat,nor);
- VECSUB(nor,nor,loc);
- return 1;
+ if(!skip)
+ psys_cache_child_paths(sim, cfra, 0);
}
}
- return 0;
-}
-/* vector calculus functions in 2d vs. 3d */
-static void set_boid_vec_func(BoidVecFunc *bvf, int is_2d)
-{
- if(is_2d){
- bvf->Addf = Vec2Addf;
- bvf->Subf = Vec2Subf;
- bvf->Mulf = Vec2Mulf;
- bvf->Length = Vec2Length;
- bvf->Normalize = Normalize2;
- bvf->Inpf = Inp2f;
- bvf->Copyf = Vec2Copyf;
- }
- else{
- bvf->Addf = VecAddf;
- bvf->Subf = VecSubf;
- bvf->Mulf = VecMulf;
- bvf->Length = VecLength;
- bvf->Normalize = Normalize;
- bvf->Inpf = Inpf;
- bvf->Copyf = VecCopyf;
- }
+ else if(psys->pathcache)
+ psys_free_path_cache(psys, NULL);
}
-/* boids have limited processing capability so once there's too much information (acceleration) no more is processed */
-static int add_boid_acc(BoidVecFunc *bvf, float lat_max, float tan_max, float *lat_accu, float *tan_accu, float *acc, float *dvec, float *vel)
+
+static void do_hair_dynamics(ParticleSimulationData *sim)
{
- static float tangent[3];
- static float tan_length;
+ ParticleSystem *psys = sim->psys;
+ DerivedMesh *dm = psys->hair_in_dm;
+ MVert *mvert = NULL;
+ MEdge *medge = NULL;
+ MDeformVert *dvert = NULL;
+ HairKey *key;
+ PARTICLE_P;
+ int totpoint = 0;
+ int totedge;
+ int k;
+ float hairmat[4][4];
- if(vel){
- bvf->Copyf(tangent,vel);
- tan_length=bvf->Normalize(tangent);
- return 1;
+ if(!psys->clmd) {
+ psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
+ psys->clmd->sim_parms->goalspring = 0.0f;
+ psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL|CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
+ psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
}
- else{
- float cur_tan, cur_lat;
- float tan_acc[3], lat_acc[3];
- int ret=0;
-
- bvf->Copyf(tan_acc,tangent);
- if(tan_length>0.0){
- bvf->Mulf(tan_acc,Inpf(tangent,dvec));
+ /* create a dm from hair vertices */
+ LOOP_PARTICLES
+ totpoint += pa->totkey;
- bvf->Subf(lat_acc,dvec,tan_acc);
- }
- else{
- bvf->Copyf(tan_acc,dvec);
- lat_acc[0]=lat_acc[1]=lat_acc[2]=0.0f;
- *lat_accu=lat_max;
- }
+ totedge = totpoint;
+ totpoint += psys->totpart;
- cur_tan=bvf->Length(tan_acc);
- cur_lat=bvf->Length(lat_acc);
-
- /* add tangential acceleration */
- if(*lat_accu+cur_lat<=lat_max){
- bvf->Addf(acc,acc,lat_acc);
- *lat_accu+=cur_lat;
- ret=1;
- }
- else{
- bvf->Mulf(lat_acc,(lat_max-*lat_accu)/cur_lat);
- bvf->Addf(acc,acc,lat_acc);
- *lat_accu=lat_max;
- }
-
- /* add lateral acceleration */
- if(*tan_accu+cur_tan<=tan_max){
- bvf->Addf(acc,acc,tan_acc);
- *tan_accu+=cur_tan;
- ret=1;
- }
- else{
- bvf->Mulf(tan_acc,(tan_max-*tan_accu)/cur_tan);
- bvf->Addf(acc,acc,tan_acc);
- *tan_accu=tan_max;
- }
+ if(dm && (totpoint != dm->getNumVerts(dm) || totedge != dm->getNumEdges(dm))) {
+ dm->release(dm);
+ dm = psys->hair_in_dm = NULL;
+ }
- return ret;
+ if(!dm) {
+ dm = psys->hair_in_dm = CDDM_new(totpoint, totedge, 0);
+ DM_add_vert_layer(dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
}
-}
-/* determines the acceleration that the boid tries to acchieve */
-static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Scene *scene, Object *ob, ParticleSystem *psys, ParticleSettings *part, KDTree *tree, float timestep, float cfra, float *acc)
-{
- ParticleData *pars=psys->particles;
- KDTreeNearest ptn[MAX_BOIDNEIGHBOURS+1];
- ParticleEffectorCache *ec=0;
- float dvec[3]={0.0,0.0,0.0}, ob_co[3], ob_nor[3];
- float avoid[3]={0.0,0.0,0.0}, velocity[3]={0.0,0.0,0.0}, center[3]={0.0,0.0,0.0};
- float cubedist[MAX_BOIDNEIGHBOURS+1];
- int i, n, neighbours=0, near, not_finished=1;
-
- float cur_vel;
- float lat_accu=0.0f, max_lat_acc=part->max_vel*part->max_lat_acc;
- float tan_accu=0.0f, max_tan_acc=part->max_vel*part->max_tan_acc;
- float avg_vel=part->average_vel*part->max_vel;
-
- acc[0]=acc[1]=acc[2]=0.0f;
- /* the +1 neighbour is because boid itself is in the tree */
- neighbours=BLI_kdtree_find_n_nearest(tree,part->boidneighbours+1,pa->state.co,NULL,ptn);
-
- for(n=1; n<neighbours; n++){
- cubedist[n]=(float)pow((double)(ptn[n].dist/pa->size),3.0);
- cubedist[n]=1.0f/MAX2(cubedist[n],1.0f);
- }
-
- /* initialize tangent */
- add_boid_acc(bvf,0.0,0.0,0,0,0,0,pa->state.vel);
-
- for(i=0; i<BOID_TOT_RULES && not_finished; i++){
- switch(part->boidrule[i]){
- case BOID_COLLIDE:
- /* collision avoidance */
- bvf->Copyf(dvec,pa->prev_state.vel);
- bvf->Mulf(dvec,5.0f);
- bvf->Addf(dvec,dvec,pa->prev_state.co);
- if(boid_see_mesh(&psys->effectors,scene, ob,psys,pa->prev_state.co,dvec,ob_co,ob_nor,cfra)){
- float probelen = bvf->Length(dvec);
- float proj;
- float oblen;
-
- Normalize(ob_nor);
- proj = bvf->Inpf(ob_nor,pa->prev_state.vel);
-
- bvf->Subf(dvec,pa->prev_state.co,ob_co);
- oblen=bvf->Length(dvec);
-
- bvf->Copyf(dvec,ob_nor);
- bvf->Mulf(dvec,-proj);
- bvf->Mulf(dvec,((probelen/oblen)-1.0f)*100.0f*part->boidfac[BOID_COLLIDE]);
-
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- break;
- case BOID_AVOID:
- /* predator avoidance */
- if(psys->effectors.first){
- for(ec=psys->effectors.first; ec; ec=ec->next){
- if(ec->type & PSYS_EC_EFFECTOR){
- Object *eob = ec->ob;
- PartDeflect *pd = eob->pd;
-
- if(pd->forcefield==PFIELD_FORCE && pd->f_strength<0.0){
- float distance;
- VECSUB(dvec,eob->obmat[3],pa->prev_state.co);
-
- distance=Normalize(dvec);
-
- if(part->flag & PART_DIE_ON_COL && distance < pd->mindist){
- pa->alive = PARS_DYING;
- pa->dietime=cfra;
- i=BOID_TOT_RULES;
- break;
- }
-
- if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
- ;
- else{
- bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
-
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- }
- }
- else if(ec->type & PSYS_EC_PARTICLE){
- Object *eob = ec->ob;
- ParticleSystem *epsys;
- ParticleSettings *epart;
- ParticleKey state;
- PartDeflect *pd;
- KDTreeNearest ptn2[MAX_BOIDNEIGHBOURS];
- int totepart, p, count;
- float distance;
- epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
- epart= epsys->part;
- pd= epart->pd;
- totepart= epsys->totpart;
-
- if(pd->forcefield==PFIELD_FORCE && pd->f_strength<0.0 && ec->tree){
- count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->prev_state.co,NULL,ptn2);
- for(p=0; p<count; p++){
- state.time=-1.0;
- if(psys_get_particle_state(scene, eob,epsys,ptn2[p].index,&state,0)){
- VECSUB(dvec, state.co, pa->prev_state.co);
-
- distance = Normalize(dvec);
-
- if(part->flag & PART_DIE_ON_COL && distance < (epsys->particles+ptn2[p].index)->size){
- pa->alive = PARS_DYING;
- pa->dietime=cfra;
- i=BOID_TOT_RULES;
- break;
- }
-
- if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
- ;
- else{
- bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
-
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- }
- }
- }
- }
- }
- }
- break;
- case BOID_CROWD:
- /* crowd avoidance */
- near=0;
- for(n=1; n<neighbours; n++){
- if(ptn[n].dist<2.0f*pa->size){
- if(ptn[n].dist!=0.0f) {
- bvf->Subf(dvec,pa->prev_state.co,pars[ptn[n].index].state.co);
- bvf->Mulf(dvec,(2.0f*pa->size-ptn[n].dist)/ptn[n].dist);
- bvf->Addf(avoid,avoid,dvec);
- near++;
- }
- }
- /* ptn[] is distance ordered so no need to check others */
- else break;
- }
- if(near){
- bvf->Mulf(avoid,part->boidfac[BOID_CROWD]*2.0f/timestep);
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,avoid,0);
- }
- break;
- case BOID_CENTER:
- /* flock centering */
- if(neighbours>1){
- for(n=1; n<neighbours; n++){
- bvf->Addf(center,center,pars[ptn[n].index].state.co);
- }
- bvf->Mulf(center,1.0f/((float)neighbours-1.0f));
+ mvert = CDDM_get_verts(dm);
+ medge = CDDM_get_edges(dm);
+ dvert = DM_get_vert_data_layer(dm, CD_MDEFORMVERT);
- bvf->Subf(dvec,center,pa->prev_state.co);
+ psys->clmd->sim_parms->vgroup_mass = 1;
- bvf->Mulf(dvec,part->boidfac[BOID_CENTER]*2.0f);
+ /* make vgroup for pin roots etc.. */
+ psys->particles->hair_index = 1;
+ LOOP_PARTICLES {
+ if(p)
+ pa->hair_index = (pa-1)->hair_index + (pa-1)->totkey + 1;
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- break;
- case BOID_AV_VEL:
- /* average velocity */
- cur_vel=bvf->Length(pa->prev_state.vel);
- if(cur_vel>0.0){
- bvf->Copyf(dvec,pa->prev_state.vel);
- bvf->Mulf(dvec,part->boidfac[BOID_AV_VEL]*(avg_vel-cur_vel)/cur_vel);
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- break;
- case BOID_VEL_MATCH:
- /* velocity matching */
- if(neighbours>1){
- for(n=1; n<neighbours; n++){
- bvf->Copyf(dvec,pars[ptn[n].index].state.vel);
- bvf->Mulf(dvec,cubedist[n]);
- bvf->Addf(velocity,velocity,dvec);
- }
- bvf->Mulf(velocity,1.0f/((float)neighbours-1.0f));
+ psys_mat_hair_to_object(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
- bvf->Subf(dvec,velocity,pa->prev_state.vel);
-
- bvf->Mulf(dvec,part->boidfac[BOID_VEL_MATCH]);
+ for(k=0, key=pa->hair; k<pa->totkey; k++,key++) {
+
+ /* create fake root before actual root to resist bending */
+ if(k==0) {
+ float temp[3];
+ VECSUB(temp, key->co, (key+1)->co);
+ VECCOPY(mvert->co, key->co);
+ VECADD(mvert->co, mvert->co, temp);
+ Mat4MulVecfl(hairmat, mvert->co);
+ mvert++;
+
+ medge->v1 = pa->hair_index - 1;
+ medge->v2 = pa->hair_index;
+ medge++;
+
+ if(dvert) {
+ if(!dvert->totweight) {
+ dvert->dw = MEM_callocN (sizeof(MDeformWeight), "deformWeight");
+ dvert->totweight = 1;
+ }
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ dvert->dw->weight = 1.0f;
+ dvert++;
}
- break;
- case BOID_GOAL:
- /* goal seeking */
- if(psys->effectors.first){
- for(ec=psys->effectors.first; ec; ec=ec->next){
- if(ec->type & PSYS_EC_EFFECTOR){
- Object *eob = ec->ob;
- PartDeflect *pd = eob->pd;
- float temp[4];
-
- if(pd->forcefield==PFIELD_FORCE && pd->f_strength>0.0){
- float distance;
- VECSUB(dvec,eob->obmat[3],pa->prev_state.co);
-
- distance=Normalize(dvec);
-
- if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
- ;
- else{
- VecMulf(dvec,pd->f_strength*part->boidfac[BOID_GOAL]/(float)pow((double)distance,(double)pd->f_power));
-
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- }
- else if(pd->forcefield==PFIELD_GUIDE){
- float distance;
-
- where_on_path(eob, (cfra-pa->time)/pa->lifetime, temp, dvec);
-
- VECSUB(dvec,temp,pa->prev_state.co);
-
- distance=Normalize(dvec);
+ }
- if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
- ;
- else{
- VecMulf(dvec,pd->f_strength*part->boidfac[BOID_GOAL]/(float)pow((double)distance,(double)pd->f_power));
+ VECCOPY(mvert->co, key->co);
+ Mat4MulVecfl(hairmat, mvert->co);
+ mvert++;
+
+ if(k) {
+ medge->v1 = pa->hair_index + k - 1;
+ medge->v2 = pa->hair_index + k;
+ medge++;
+ }
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- }
- }
- else if(ec->type & PSYS_EC_PARTICLE){
- Object *eob = ec->ob;
- ParticleSystem *epsys;
- ParticleSettings *epart;
- ParticleKey state;
- PartDeflect *pd;
- KDTreeNearest ptn2[MAX_BOIDNEIGHBOURS];
- int totepart, p, count;
- float distance;
- epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
- epart= epsys->part;
- pd= epart->pd;
- totepart= epsys->totpart;
-
- if(pd->forcefield==PFIELD_FORCE && pd->f_strength>0.0 && ec->tree){
- count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->prev_state.co,NULL,ptn2);
- for(p=0; p<count; p++){
- state.time=-1.0;
- if(psys_get_particle_state(scene, eob,epsys,ptn2[p].index,&state,0)){
- VECSUB(dvec, state.co, pa->prev_state.co);
-
- distance = Normalize(dvec);
-
- if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
- ;
- else{
- bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
-
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- }
- }
- }
- }
- }
+ if(dvert) {
+ if(!dvert->totweight) {
+ dvert->dw = MEM_callocN (sizeof(MDeformWeight), "deformWeight");
+ dvert->totweight = 1;
}
- break;
- case BOID_LEVEL:
- /* level flight */
- if((part->flag & PART_BOIDS_2D)==0){
- dvec[0]=dvec[1]=0.0;
- dvec[2]=-pa->prev_state.vel[2];
-
- VecMulf(dvec,part->boidfac[BOID_LEVEL]);
- not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
- }
- break;
- }
- }
-}
-/* tries to realize the wanted acceleration */
-static void boid_body(Scene *scene, BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys, ParticleSettings *part, float timestep, float *acc)
-{
- float dvec[3], bvec[3], length, max_vel=part->max_vel;
- float q2[4], q[4];
- float g=9.81f, pa_mass=part->mass;
- float yvec[3]={0.0,1.0,0.0}, zvec[3]={0.0,0.0,-1.0}, bank;
-
- /* apply new velocity, location & rotation */
- copy_particle_key(&pa->state,&pa->prev_state,0);
- if(part->flag & PART_SIZEMASS)
- pa_mass*=pa->size;
-
- /* by regarding the acceleration as a force at this stage we*/
- /* can get better controll allthough it's a bit unphysical */
- bvf->Mulf(acc,1.0f/pa_mass);
-
- bvf->Copyf(dvec,acc);
- bvf->Mulf(dvec,timestep*timestep*0.5f);
-
- bvf->Copyf(bvec,pa->state.vel);
- bvf->Mulf(bvec,timestep);
- bvf->Addf(dvec,dvec,bvec);
- bvf->Addf(pa->state.co,pa->state.co,dvec);
-
- /* air speed from wind and vortex effectors */
- if(psys->effectors.first) {
- ParticleEffectorCache *ec;
- for(ec=psys->effectors.first; ec; ec=ec->next) {
- if(ec->type & PSYS_EC_EFFECTOR) {
- Object *eob = ec->ob;
- PartDeflect *pd = eob->pd;
- float direction[3], vec_to_part[3];
- float falloff;
-
- if(pd->f_strength != 0.0f) {
- VecCopyf(direction, eob->obmat[2]);
- VecSubf(vec_to_part, pa->state.co, eob->obmat[3]);
-
- falloff=effector_falloff(pd, direction, vec_to_part);
-
- switch(pd->forcefield) {
- case PFIELD_WIND:
- if(falloff <= 0.0f)
- ; /* don't do anything */
- else {
- Normalize(direction);
- VecMulf(direction, pd->f_strength * falloff);
- bvf->Addf(pa->state.co, pa->state.co, direction);
- }
- break;
- case PFIELD_VORTEX:
- {
- float distance, mag_vec[3];
- Crossf(mag_vec, direction, vec_to_part);
- Normalize(mag_vec);
-
- distance = VecLength(vec_to_part);
-
- VecMulf(mag_vec, pd->f_strength * distance * falloff);
- bvf->Addf(pa->state.co, pa->state.co, mag_vec);
- break;
- }
- }
- }
+ /* no special reason for the 0.5 */
+ /* just seems like a nice value from experiments */
+ dvert->dw->weight = k ? 0.5f : 1.0f;
+ dvert++;
}
}
}
+ if(psys->hair_out_dm)
+ psys->hair_out_dm->release(psys->hair_out_dm);
- if((part->flag & PART_BOIDS_2D)==0 && pa->prev_state.vel[0]!=0.0 && pa->prev_state.vel[0]!=0.0 && pa->prev_state.vel[0]!=0.0){
- Crossf(yvec,pa->state.vel,zvec);
+ psys->clmd->point_cache = psys->pointcache;
- Normalize(yvec);
-
- bank=Inpf(yvec,acc);
-
- bank=-(float)atan((double)(bank/g));
+ psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, 0, 0);
+}
+static void hair_step(ParticleSimulationData *sim, float cfra)
+{
+ ParticleSystem *psys = sim->psys;
+/* ParticleSettings *part = psys->part; */
+ PARTICLE_P;
+ float disp = (float)get_current_display_percentage(psys)/100.0f;
- bank*=part->banking;
+ BLI_srandom(psys->seed);
- bank-=pa->bank;
- if(bank>M_PI*part->max_bank){
- bank=pa->bank+(float)M_PI*part->max_bank;
- }
- else if(bank<-M_PI*part->max_bank){
- bank=pa->bank-(float)M_PI*part->max_bank;
- }
+ LOOP_PARTICLES {
+ if(PSYS_FRAND(p) > disp)
+ pa->flag |= PARS_NO_DISP;
else
- bank+=pa->bank;
-
- pa->bank=bank;
- }
- else{
- bank=0.0;
+ pa->flag &= ~PARS_NO_DISP;
}
+ if(psys->recalc & PSYS_RECALC_RESET) {
+ /* need this for changing subsurf levels */
+ psys_calc_dmcache(sim->ob, sim->psmd->dm, psys);
- VecRotToQuat(pa->state.vel,bank,q);
-
- VECCOPY(dvec,pa->state.vel);
- VecNegf(dvec);
- vectoquat(dvec, OB_POSX, OB_POSZ, q2);
-
- QuatMul(pa->state.rot,q,q2);
-
- bvf->Mulf(acc,timestep);
- bvf->Addf(pa->state.vel,pa->state.vel,acc);
-
- if(part->flag & PART_BOIDS_2D){
- pa->state.vel[2]=0.0;
- pa->state.co[2]=part->groundz;
-
- if(psys->keyed_ob && (psys->keyed_ob->type == OB_MESH)){
- Object *zob=psys->keyed_ob;
- int min_face;
- float co1[3],co2[3],min_d=2.0,min_w[4],imat[4][4];
- VECCOPY(co1,pa->state.co);
- VECCOPY(co2,pa->state.co);
-
- co1[2]=1000.0f;
- co2[2]=-1000.0f;
-
- Mat4Invert(imat,zob->obmat);
- Mat4MulVecfl(imat,co1);
- Mat4MulVecfl(imat,co2);
-
- if(psys_intersect_dm(scene,zob,0,0,co1,co2,&min_d,&min_face,min_w,0,0,0,0)){
- DerivedMesh *dm;
- MFace *mface;
- MVert *mvert;
- float loc[3],nor[3],q1[4];
-
- psys_disable_all(zob);
- dm=mesh_get_derived_final(scene, zob, 0);
- psys_enable_all(zob);
-
- mface=dm->getFaceDataArray(dm,CD_MFACE);
- mface+=min_face;
- mvert=dm->getVertDataArray(dm,CD_MVERT);
-
- /* get deflection point & normal */
- psys_interpolate_face(mvert,mface,0,0,min_w,loc,nor,0,0,0,0);
-
- Mat4MulVecfl(zob->obmat,loc);
- Mat4Mul3Vecfl(zob->obmat,nor);
-
- Normalize(nor);
-
- VECCOPY(pa->state.co,loc);
-
- zvec[2]=1.0;
-
- Crossf(loc,zvec,nor);
-
- bank=VecLength(loc);
- if(bank>0.0){
- bank=saasin(bank);
+ if(psys->clmd)
+ cloth_free_modifier(sim->ob, psys->clmd);
+ }
- VecRotToQuat(loc,bank,q);
+ /* dynamics with cloth simulation */
+ if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS)
+ do_hair_dynamics(sim);
- QUATCOPY(q1,pa->state.rot);
+ psys_update_effectors(sim, cfra, 1);
- QuatMul(pa->state.rot,q,q1);
- }
- }
- }
- }
+ psys_update_path_cache(sim, cfra);
- length=bvf->Length(pa->state.vel);
- if(length > max_vel)
- bvf->Mulf(pa->state.vel,max_vel/length);
+ psys->flag |= PSYS_HAIR_UPDATED;
}
-/************************************************/
-/* Hair */
-/************************************************/
-static void save_hair(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
- ParticleData *pa;
- HairKey *key;
+
+static void save_hair(ParticleSimulationData *sim, float cfra){
+ Object *ob = sim->ob;
+ ParticleSystem *psys = sim->psys;
+ HairKey *key, *root;
+ PARTICLE_P;
int totpart;
- int i;
- Mat4Invert(ob->imat,ob->obmat);
+ Mat4Invert(ob->imat, ob->obmat);
- psys->lattice= psys_get_lattice(scene, ob, psys);
+ psys->lattice= psys_get_lattice(sim);
if(psys->totpart==0) return;
totpart=psys->totpart;
/* save new keys for elements if needed */
- for(i=0,pa=psys->particles; i<totpart; i++,pa++) {
+ LOOP_PARTICLES {
/* first time alloc */
if(pa->totkey==0 || pa->hair==NULL) {
pa->hair = MEM_callocN((psys->part->hair_step + 1) * sizeof(HairKey), "HairKeys");
pa->totkey = 0;
}
- key = pa->hair + pa->totkey;
+ key = root = pa->hair;
+ key += pa->totkey;
/* convert from global to geometry space */
VecCopyf(key->co, pa->state.co);
Mat4MulVecfl(ob->imat, key->co);
if(pa->totkey) {
- VECSUB(key->co, key->co, pa->hair->co);
- psys_vec_rot_to_face(psmd->dm, pa, key->co);
+ VECSUB(key->co, key->co, root->co);
+ psys_vec_rot_to_face(sim->psmd->dm, pa, key->co);
}
key->time = pa->state.time;
@@ -4006,24 +3636,24 @@ static void save_hair(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSy
/* root is always in the origin of hair space so we set it to be so after the last key is saved*/
if(pa->totkey == psys->part->hair_step + 1)
- pa->hair->co[0] = pa->hair->co[1] = pa->hair->co[2] = 0.0f;
+ root->co[0] = root->co[1] = root->co[2] = 0.0f;
}
}
/************************************************/
/* System Core */
/************************************************/
/* unbaked particles are calculated dynamically */
-static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra,
- float *vg_vel, float *vg_tan, float *vg_rot, float *vg_size)
+static void dynamics_step(ParticleSimulationData *sim, float cfra)
{
- ParticleData *pa;
+ ParticleSystem *psys = sim->psys;
ParticleSettings *part=psys->part;
KDTree *tree=0;
- BoidVecFunc bvf;
IpoCurve *icu_esize= NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system
- Material *ma=give_current_material(ob,part->omat);
+/* Material *ma=give_current_material(sim->ob, part->omat); */
+ BoidBrainData bbd;
+ PARTICLE_P;
float timestep;
- int p, totpart;
+ int totpart, check_collisions = 0;
/* current time */
float ctime, ipotime; // XXX old animation system
/* frame & time changes */
@@ -4035,7 +3665,7 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
totpart=psys->totpart;
- timestep=psys_get_timestep(part);
+ timestep=psys_get_timestep(sim);
dtime= dfra*timestep;
ctime= cfra*timestep;
ipotime= cfra; // XXX old animation system
@@ -4049,12 +3679,10 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
if(dfra<0.0){
float *vg_size=0;
- if(part->type==PART_REACTOR)
- vg_size=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
-
- for(p=0, pa=psys->particles; p<totpart; p++,pa++){
- if(pa->flag & PARS_UNEXIST) continue;
+ //if(part->type==PART_REACTOR)
+ // vg_size=psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE);
+ LOOP_EXISTING_PARTICLES {
/* set correct ipo timing */
#if 0 // XXX old animation system
if((part->flag&PART_ABS_TIME)==0 && part->ipo){
@@ -4063,13 +3691,15 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
execute_ipo((ID *)part, part->ipo);
}
#endif // XXX old animation system
- pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+ pa->size = part->size;
+ if(part->randsize > 0.0)
+ pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
- reset_particle(scene, pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot);
+ reset_particle(sim, pa, dtime, cfra);
- if(cfra>pa->time && part->flag & PART_LOOP && part->type!=PART_HAIR){
- pa->loop=(short)((cfra-pa->time)/pa->lifetime);
- pa->alive=PARS_UNBORN;
+ if(cfra > pa->time && part->flag & PART_LOOP && part->type!=PART_HAIR){
+ pa->loop = (short)((cfra-pa->time)/pa->lifetime);
+ pa->alive = PARS_UNBORN;
}
else{
pa->loop = 0;
@@ -4090,33 +3720,29 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
}
else{
BLI_srandom(31415926 + (int)cfra + psys->seed);
-
- /* update effectors */
- if(psys->effectors.first)
- psys_end_effectors(psys);
- psys_init_effectors(scene, ob, part->eff_group, psys);
-
- if(psys->effectors.first)
- precalc_effectors(scene, ob,psys,psmd,cfra);
+ psys_update_effectors(sim, cfra, 1);
if(part->phystype==PART_PHYS_BOIDS){
- /* create particle tree for fast inter-particle comparisons */
- tree=BLI_kdtree_new(totpart);
- for(p=0, pa=psys->particles; p<totpart; p++,pa++){
- if(pa->flag & (PARS_NO_DISP+PARS_UNEXIST) || pa->alive!=PARS_ALIVE)
- continue;
+ ParticleTarget *pt = psys->targets.first;
+ bbd.sim = sim;
+ bbd.part = part;
+ bbd.cfra = cfra;
+ bbd.dfra = dfra;
+ bbd.timestep = timestep;
+
+ update_particle_tree(psys);
+
+ boids_precalc_rules(part, cfra);
- BLI_kdtree_insert(tree, p, pa->state.co, NULL);
+ for(; pt; pt=pt->next) {
+ if(pt->ob)
+ update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1));
}
- BLI_kdtree_balance(tree);
- set_boid_vec_func(&bvf,part->flag&PART_BOIDS_2D);
}
/* main loop: calculate physics for all particles */
- for(p=0, pa=psys->particles; p<totpart; p++,pa++){
- if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue;
-
+ LOOP_SHOWN_PARTICLES {
copy_particle_key(&pa->prev_state,&pa->state,1);
/* set correct ipo timing */
@@ -4127,23 +3753,19 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
execute_ipo((ID *)part, part->ipo);
}
#endif // XXX old animation system
- pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+ //update_particle_settings(psys, part, &tpart, pa);
- /* 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);
+ pa->size = part->size;
+ 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 + pa->loop * pa->lifetime;
dietime = birthtime + pa->lifetime;
- /* allways reset particles to emitter before birth */
- if(pa->alive==PARS_UNBORN
- || pa->alive==PARS_KILLED
- || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED)
- || birthtime >= psys->cfra){
- reset_particle(scene, pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot);
- }
-
pa_dfra = dfra;
pa_dtime = dtime;
@@ -4156,6 +3778,7 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
}
else if(birthtime <= cfra && birthtime >= psys->cfra){
/* particle is born some time between this and last step*/
+ reset_particle(sim, pa, dtime, cfra);
pa->alive = PARS_ALIVE;
pa_dfra = cfra - birthtime;
pa_dtime = pa_dfra*timestep;
@@ -4164,49 +3787,54 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
/* nothing to be done when particle is dead */
}
+ /* only reset unborn particles if they're shown */
+ if(pa->alive==PARS_UNBORN && part->flag & PART_UNBORN)
+ reset_particle(sim, pa, dtime, cfra);
if(dfra>0.0 && ELEM(pa->alive,PARS_ALIVE,PARS_DYING)){
switch(part->phystype){
case PART_PHYS_NEWTON:
/* do global forces & effectors */
- apply_particle_forces(scene, p, pa, ob, psys, part, timestep,pa_dfra,cfra);
+ apply_particle_forces(sim, p, pa_dfra, cfra);
/* deflection */
- deflect_particle(scene, ob,psmd,psys,part,pa,p,timestep,pa_dfra,cfra);
+ if(check_collisions)
+ deflect_particle(sim, p, pa_dfra, cfra);
/* rotations */
- rotate_particle(part,pa,pa_dfra,timestep);
+ rotate_particle(part, pa, pa_dfra, timestep);
break;
case PART_PHYS_BOIDS:
{
- float acc[3];
- boid_brain(&bvf, pa, scene, ob, psys, part, tree, timestep,cfra,acc);
- if(pa->alive != PARS_DYING)
- boid_body(scene, &bvf,pa,psys,part,timestep,acc);
+ bbd.goal_ob = NULL;
+ boid_brain(&bbd, p, pa);
+ if(pa->alive != PARS_DYING) {
+ boid_body(&bbd, pa);
+
+ /* deflection */
+ deflect_particle(sim, p, pa_dfra, cfra);
+ }
break;
}
}
if(pa->alive == PARS_DYING){
- push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state);
+ //push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state);
if(part->flag & PART_LOOP && part->type!=PART_HAIR){
pa->loop++;
- reset_particle(scene, pa,psys,psmd,ob,0.0,cfra,vg_vel,vg_tan,vg_rot);
+ reset_particle(sim, pa, 0.0, cfra);
pa->alive=PARS_ALIVE;
}
else{
pa->alive=PARS_DEAD;
pa->state.time=pa->dietime;
-
- if(pa->flag&PARS_STICKY)
- psys_key_to_object(pa->stick_ob,&pa->state,0);
}
}
else
pa->state.time=cfra;
- push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state);
+ //push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state);
}
}
}
@@ -4217,131 +3845,26 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic
BLI_kdtree_free(tree);
}
-/* check if path cache or children need updating and do it if needed */
-static void psys_update_path_cache(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
-{
- ParticleSettings *part=psys->part;
- ParticleEditSettings *pset=&scene->toolsettings->particle;
- int distr=0,alloc=0;
-
- if((psys->part->childtype && psys->totchild != get_psys_tot_child(scene, psys)) || psys->recalc&PSYS_RECALC_RESET)
- alloc=1;
-
- if(alloc || psys->recalc&PSYS_RECALC_RESET || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT)))
- distr=1;
-
- if(distr){
- if(alloc)
- realloc_particles(ob,psys,psys->totpart);
-
- if(get_psys_tot_child(scene, psys)) {
- /* don't generate children while computing the hair keys */
- if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
- distribute_particles(scene, ob, psys, PART_FROM_CHILD);
-
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0)
- psys_find_parents(ob,psmd,psys);
- }
- }
- }
-
- if((part->type==PART_HAIR || psys->flag&PSYS_KEYED) && ( psys_in_edit_mode(scene, psys) || (part->type==PART_HAIR
- || (part->ren_as == PART_DRAW_PATH && (part->draw_as == PART_DRAW_REND || psys->renderdata))))){
-
- psys_cache_paths(scene, ob, psys, cfra, 0);
-
- /* for render, child particle paths are computed on the fly */
- if(part->childtype) {
- if(((psys->totchild!=0)) || (psys_in_edit_mode(scene, psys) && (pset->flag&PE_SHOW_CHILD)))
- if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE))
- psys_cache_child_paths(scene, ob, psys, cfra, 0);
- }
- }
- else if(psys->pathcache)
- psys_free_path_cache(psys);
-}
-
-/* calculate and store key locations in world coordinates */
-void psys_update_world_cos(Object *ob, ParticleSystem *psys)
-{
- ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
- ParticleData *pa;
- ParticleEditKey *key;
- int i, k, totpart;
- float hairmat[4][4];
-
- if(psys==0 || psys->edit==0)
- return;
-
- totpart= psys->totpart;
-
- for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
-
- for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++) {
- VECCOPY(key->world_co,key->co);
- Mat4MulVecfl(hairmat, key->world_co);
- }
- }
-}
-
-static void hair_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
-{
- ParticleSettings *part = psys->part;
- ParticleData *pa;
- int p;
- float disp = (float)get_current_display_percentage(psys)/50.0f-1.0f;
-
- for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++){
- if(pa->r_rot[0] > disp)
- pa->flag |= PARS_NO_DISP;
- else
- pa->flag &= ~PARS_NO_DISP;
- }
-
- if(psys->recalc & PSYS_RECALC_RESET)
- /* need this for changing subsurf levels */
- psys_calc_dmcache(ob, psmd->dm, psys);
-
- if(psys->effectors.first)
- psys_end_effectors(psys);
-
- psys_init_effectors(scene, ob, part->eff_group, psys);
- if(psys->effectors.first)
- precalc_effectors(scene, ob,psys,psmd,cfra);
-
- if(psys_in_edit_mode(scene, psys))
- psys_update_world_cos(ob, psys);
-
- psys_update_path_cache(scene, ob,psmd,psys,cfra);
-}
-
/* updates cached particles' alive & other flags etc..*/
-static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+static void cached_step(ParticleSimulationData *sim, float cfra)
{
- ParticleSettings *part=psys->part;
- ParticleData *pa;
- ParticleKey state;
- IpoCurve *icu_esize= NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system
- Material *ma=give_current_material(ob,part->omat);
- int p;
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
+ IpoCurve *icu_esize = NULL; //=find_ipocurve(part->ipo,PART_EMIT_SIZE); // XXX old animation system
+/* Material *ma = give_current_material(sim->ob,part->omat); */
+ PARTICLE_P;
float disp, birthtime, dietime, *vg_size= NULL; // XXX ipotime=cfra
+ BLI_srandom(psys->seed);
+
if(part->from!=PART_FROM_PARTICLE)
- vg_size= psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
+ vg_size= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE);
- if(psys->effectors.first)
- psys_end_effectors(psys);
+ psys_update_effectors(sim, cfra, 1);
- //if(part->flag & (PART_BAKED_GUIDES+PART_BAKED_DEATHS)){
- psys_init_effectors(scene, ob, part->eff_group, psys);
- if(psys->effectors.first)
- precalc_effectors(scene, ob,psys,psmd,cfra);
- //}
-
- disp= (float)get_current_display_percentage(psys)/50.0f-1.0f;
+ disp= (float)get_current_display_percentage(psys)/100.0f;
- for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++){
+ LOOP_PARTICLES {
#if 0 // XXX old animation system
if((part->flag&PART_ABS_TIME)==0 && part->ipo){
ipotime=100.0f*(cfra-pa->time)/pa->lifetime;
@@ -4349,9 +3872,13 @@ static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *ps
execute_ipo((ID *)part, part->ipo);
}
#endif // XXX old animation system
- pa->size= psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+ //update_settings_with_particle(psys, part, pa);
+
+ pa->size = part->size;
+ if(part->randsize > 0.0)
+ pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
- psys->lattice= psys_get_lattice(scene, ob, psys);
+ psys->lattice= psys_get_lattice(sim);
if(part->flag & PART_LOOP && part->type!=PART_HAIR)
pa->loop = (short)((cfra - pa->time) / pa->lifetime);
@@ -4362,22 +3889,16 @@ static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *ps
dietime = birthtime + (1 + pa->loop) * (pa->dietime - pa->time);
/* update alive status and push events */
- if(pa->time > cfra)
+ if(pa->time > cfra) {
pa->alive = PARS_UNBORN;
+ if(part->flag & PART_UNBORN && (psys->pointcache->flag & PTCACHE_EXTERNAL) == 0)
+ reset_particle(sim, pa, 0.0f, cfra);
+ }
else if(dietime <= cfra){
- if(dietime > psys->cfra){
- state.time = pa->dietime;
- psys_get_particle_state(scene, ob,psys,p,&state,1);
- push_reaction(ob,psys,p,PART_EVENT_DEATH,&state);
- }
pa->alive = PARS_DEAD;
}
else{
pa->alive = PARS_ALIVE;
- state.time = cfra;
- psys_get_particle_state(scene, ob,psys,p,&state,1);
- state.time = cfra;
- push_reaction(ob,psys,p,PART_EVENT_NEAR,&state);
}
if(psys->lattice){
@@ -4385,38 +3906,41 @@ static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *ps
psys->lattice= NULL;
}
- if(pa->r_rot[0] > disp)
+ if(PSYS_FRAND(p) > disp)
pa->flag |= PARS_NO_DISP;
else
pa->flag &= ~PARS_NO_DISP;
}
/* make sure that children are up to date */
- if(psys->part->childtype && psys->totchild != get_psys_tot_child(scene, psys)) {
- realloc_particles(ob, psys, psys->totpart);
- distribute_particles(scene, ob, psys, PART_FROM_CHILD);
+ if(psys->part->childtype && psys->totchild != get_psys_tot_child(sim->scene, psys)) {
+ realloc_particles(sim, psys->totpart);
+ distribute_particles(sim, PART_FROM_CHILD);
}
+ psys_update_path_cache(sim, cfra);
+
if(vg_size)
MEM_freeN(vg_size);
}
-void psys_changed_type(ParticleSystem *psys)
+static void psys_changed_type(ParticleSimulationData *sim)
{
- ParticleSettings *part;
+ ParticleSettings *part = sim->psys->part;
+ PTCacheID pid;
- part= psys->part;
+ BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys);
/* system type has changed so set sensible defaults and clear non applicable flags */
if(part->from == PART_FROM_PARTICLE) {
- if(part->type != PART_REACTOR)
- part->from = PART_FROM_FACE;
+ //if(part->type != PART_REACTOR)
+ part->from = PART_FROM_FACE;
if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT)
part->distr = PART_DISTR_JIT;
}
- if(psys->part->phystype != PART_PHYS_KEYED)
- psys->flag &= ~PSYS_KEYED;
+ if(part->phystype != PART_PHYS_KEYED)
+ sim->psys->flag &= ~PSYS_KEYED;
if(part->type == PART_HAIR) {
if(ELEM4(part->ren_as, PART_DRAW_NOT, PART_DRAW_PATH, PART_DRAW_OB, PART_DRAW_GR)==0)
@@ -4424,17 +3948,80 @@ void psys_changed_type(ParticleSystem *psys)
if(ELEM3(part->draw_as, PART_DRAW_NOT, PART_DRAW_REND, PART_DRAW_PATH)==0)
part->draw_as = PART_DRAW_REND;
+
+ CLAMP(part->path_start, 0.0f, 100.0f);
+ CLAMP(part->path_end, 0.0f, 100.0f);
+
+ BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0);
}
- else
- free_hair(psys, 1);
+ else {
+ free_hair(sim->ob, sim->psys, 1);
- psys->softflag= 0;
+ CLAMP(part->path_start, 0.0f, MAX2(100.0f, part->end + part->lifetime));
+ CLAMP(part->path_end, 0.0f, MAX2(100.0f, part->end + part->lifetime));
+ }
- psys_reset(psys, PSYS_RESET_ALL);
+ psys_reset(sim->psys, PSYS_RESET_ALL);
}
+void psys_check_boid_data(ParticleSystem *psys)
+{
+ BoidParticle *bpa;
+ PARTICLE_P;
+
+ pa = psys->particles;
+
+ if(!pa)
+ return;
+
+ if(psys->part && psys->part->phystype==PART_PHYS_BOIDS) {
+ if(!pa->boid) {
+ bpa = MEM_callocN(psys->totpart * sizeof(BoidParticle), "Boid Data");
+
+ LOOP_PARTICLES
+ pa->boid = bpa++;
+ }
+ }
+ else if(pa->boid){
+ MEM_freeN(pa->boid);
+ LOOP_PARTICLES
+ pa->boid = NULL;
+ }
+}
+static void psys_changed_physics(ParticleSimulationData *sim)
+{
+ ParticleSettings *part = sim->psys->part;
+
+ if(ELEM(part->phystype, PART_PHYS_NO, PART_PHYS_KEYED)) {
+ PTCacheID pid;
+ BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys);
+ BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0);
+ }
+ else {
+ free_keyed_keys(sim->psys);
+ sim->psys->flag &= ~PSYS_KEYED;
+ }
+
+ if(part->phystype == PART_PHYS_BOIDS && part->boids == NULL) {
+ BoidState *state;
+
+ psys_check_boid_data(sim->psys);
-static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys, int cfra)
+ part->boids = MEM_callocN(sizeof(BoidSettings), "Boid Settings");
+ boid_default_settings(part->boids);
+
+ state = boid_new_state(part->boids);
+ BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Separate));
+ BLI_addtail(&state->rules, boid_new_rule(eBoidRuleType_Flock));
+
+ ((BoidRule*)state->rules.first)->flag |= BOIDRULE_CURRENT;
+
+ state->flag |= BOIDSTATE_CURRENT;
+ BLI_addtail(&part->boids->states, state);
+ }
+}
+static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
{
+ ParticleSystem *psys = sim->psys;
if(psys->particles){
MEM_freeN(psys->particles);
psys->particles = 0;
@@ -4444,7 +4031,7 @@ static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys,
/* fluid sim particle import handling, actual loading of particles from file */
#ifndef DISABLE_ELBEEM
{
- FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
+ FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(sim->ob, eModifierType_Fluidsim);
if( fluidmd && fluidmd->fss) {
FluidsimSettings *fss= fluidmd->fss;
@@ -4454,7 +4041,7 @@ static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys,
char *suffix2 = ".gz";
char filename[256];
char debugStrBuffer[256];
- int curFrame = scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
+ int curFrame = sim->scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
int p, j, numFileParts, totpart;
int readMask, activeParts = 0, fileParts = 0;
gzFile gzf;
@@ -4482,11 +4069,11 @@ static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys,
part->totpart= totpart;
part->sta=part->end = 1.0f;
- part->lifetime = scene->r.efra + 1;
+ part->lifetime = sim->scene->r.efra + 1;
/* initialize particles */
- realloc_particles(ob, psys, part->totpart);
- initialize_all_particles(ob, psys, 0);
+ realloc_particles(sim, part->totpart);
+ initialize_all_particles(sim);
// set up reading mask
readMask = fss->typeFlags;
@@ -4542,29 +4129,29 @@ static void particles_fluid_step(Scene *scene, Object *ob, ParticleSystem *psys,
/* Calculates the next state for all particles of the system */
/* In particles code most fra-ending are frames, time-ending are fra*timestep (seconds)*/
-static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra)
+static void system_step(ParticleSimulationData *sim, float cfra)
{
- ParticleSettings *part;
- ParticleData *pa;
- PointCache *cache;
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
+ PointCache *cache = psys->pointcache;
PTCacheID pid;
- int totpart, oldtotpart, totchild, oldtotchild, p;
+ PARTICLE_P;
+ int totpart, oldtotpart, totchild, oldtotchild;
float disp, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0;
int init= 0, distr= 0, alloc= 0, usecache= 0, only_children_changed= 0;
- int framenr, framedelta, startframe, endframe, old_framenr;
+ int framenr, framedelta, startframe, endframe;
- part= psys->part;
- cache= psys->pointcache;
-
- framenr= (int)scene->r.cfra;
+ framenr= (int)sim->scene->r.cfra;
framedelta= framenr - cache->simframe;
/* set suitable cache range automatically */
- if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0)
- psys_get_pointcache_start_end(scene, psys, &cache->startframe, &cache->endframe);
+ if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0 && !(psys->flag & PSYS_HAIR_DYNAMICS))
+ psys_get_pointcache_start_end(sim->scene, sim->psys, &cache->startframe, &cache->endframe);
- BKE_ptcache_id_from_particles(&pid, ob, psys);
- BKE_ptcache_id_time(&pid, scene, 0.0f, &startframe, &endframe, NULL);
+ BKE_ptcache_id_from_particles(&pid, sim->ob, psys);
+ BKE_ptcache_id_time(&pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
+
+ psys_clear_temp_pointcache(sim->psys);
/* update ipo's */
#if 0 // XXX old animation system
@@ -4576,14 +4163,14 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
/* hair if it's already done is handled separate */
if(part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DONE)) {
- hair_step(scene, ob, psmd, psys, cfra);
+ hair_step(sim, cfra);
psys->cfra = cfra;
psys->recalc = 0;
return;
}
/* fluid is also handled separate */
else if(part->type == PART_FLUID) {
- particles_fluid_step(scene, ob, psys, framenr);
+ particles_fluid_step(sim, framenr);
psys->cfra = cfra;
psys->recalc = 0;
return;
@@ -4614,15 +4201,16 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
oldtotpart = psys->totpart;
oldtotchild = psys->totchild;
- if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT)
+ if(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;
- totchild = get_psys_tot_child(scene, psys);
+ totchild = get_psys_tot_child(sim->scene, psys);
- if(oldtotpart != totpart || (psys->part->childtype && oldtotchild != totchild)) {
+ if(oldtotpart != totpart || oldtotchild != totchild) {
only_children_changed = (oldtotpart == totpart);
- realloc_particles(ob, psys, totpart);
alloc = 1;
distr= 1;
init= 1;
@@ -4636,70 +4224,59 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
if(init) {
if(distr) {
if(alloc) {
- realloc_particles(ob, psys, totpart);
+ realloc_particles(sim, totpart);
- if(usecache)
+ if(usecache && !only_children_changed) {
BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0);
+ BKE_ptcache_id_from_particles(&pid, sim->ob, psys);
+ }
}
- distribute_particles(scene, ob, psys, part->from);
+ if(!only_children_changed)
+ distribute_particles(sim, part->from);
if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE))
/* don't generate children while growing hair - waste of time */
psys_free_children(psys);
- else if(get_psys_tot_child(scene, psys))
- distribute_particles(scene, ob, psys, PART_FROM_CHILD);
+ else if(get_psys_tot_child(sim->scene, psys))
+ distribute_particles(sim, PART_FROM_CHILD);
}
- if(only_children_changed==0) {
+ if(!only_children_changed) {
free_keyed_keys(psys);
- initialize_all_particles(ob, psys, psmd);
+ initialize_all_particles(sim);
if(alloc) {
- reset_all_particles(scene, ob, psys, psmd, 0.0, cfra, oldtotpart);
+ reset_all_particles(sim, 0.0, cfra, oldtotpart);
}
}
/* flag for possible explode modifiers after this system */
- psmd->flag |= eParticleSystemFlag_Pars;
+ sim->psmd->flag |= eParticleSystemFlag_Pars;
}
/* try to read from the cache */
if(usecache) {
- int result = get_particles_from_cache(scene, ob, psys, (float)framenr, 0, 1, &old_framenr);
+ int result = BKE_ptcache_read_cache(&pid, cfra, sim->scene->r.frs_sec);
- if(result == PTCACHE_READ_EXACT) {
- //if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) {
- // psys_count_keyed_targets(ob,psys);
- // set_keyed_keys(scene, ob, psys);
- //}
-
- cached_step(scene, ob, psmd, psys, cfra);
+ if(result == PTCACHE_READ_EXACT || result == PTCACHE_READ_INTERPOLATED) {
+ cached_step(sim, cfra);
psys->cfra=cfra;
psys->recalc = 0;
- //if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) {
- // psys_update_path_cache(scene, ob, psmd, psys, framenr);
- //}
-
cache->simframe= framenr;
cache->flag |= PTCACHE_SIMULATION_VALID;
- if(cache->flag & PTCACHE_OUTDATED)
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_FREE);
+ if(result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
+ BKE_ptcache_write_cache(&pid, (int)cfra);
return;
}
- else if((cache->flag & PTCACHE_AUTOCACHE)==0 && result==PTCACHE_READ_OLD) {
- /* clear cache after current frame */
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_FREE);
-
- /* set old cfra */
- psys->cfra = (float)old_framenr;
-
- for(p=0, pa=psys->particles; p<totpart; p++, pa++) {
+ else if(result==PTCACHE_READ_OLD) {
+ psys->cfra = (float)cache->simframe;
+ LOOP_PARTICLES {
/* update alive status */
if(pa->time > psys->cfra)
pa->alive = PARS_UNBORN;
@@ -4709,21 +4286,12 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
pa->alive = PARS_ALIVE;
}
}
- else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
+ else if(sim->ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
psys_reset(psys, PSYS_RESET_CACHE_MISS);
psys->cfra=cfra;
psys->recalc = 0;
return;
}
-
- if(framenr != startframe && framedelta != 1 && cache->flag & PTCACHE_AUTOCACHE) {
- //psys_reset(psys, PSYS_RESET_CACHE_MISS);
- /* make sure cache is recalculated */
- BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_FRAME, (int)cfra);
- psys->cfra = cfra;
- psys->recalc = 0;
- return;
- }
}
else {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
@@ -4733,24 +4301,25 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
/* if on second frame, write cache for first frame */
if(usecache && psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- write_particles_to_cache(ob, psys, startframe);
+ BKE_ptcache_write_cache(&pid, startframe);
- if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED)
- psys_count_keyed_targets(ob,psys);
+ if(part->phystype==PART_PHYS_KEYED)
+ psys_count_keyed_targets(sim);
/* initialize vertex groups */
if(part->from!=PART_FROM_PARTICLE) {
- vg_vel= psys_cache_vgroup(psmd->dm,psys,PSYS_VG_VEL);
- vg_tan= psys_cache_vgroup(psmd->dm,psys,PSYS_VG_TAN);
- vg_rot= psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROT);
- vg_size= psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
+ vg_vel= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_VEL);
+ vg_tan= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_TAN);
+ vg_rot= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_ROT);
+ vg_size= psys_cache_vgroup(sim->psmd->dm,psys,PSYS_VG_SIZE);
}
/* set particles to be not calculated TODO: can't work with pointcache */
- disp= (float)get_current_display_percentage(psys)/50.0f-1.0f;
+ disp= (float)get_current_display_percentage(psys)/100.0f;
- for(p=0, pa=psys->particles; p<totpart; p++,pa++){
- if(pa->r_rot[0] > disp)
+ BLI_srandom(psys->seed);
+ LOOP_PARTICLES {
+ if(PSYS_FRAND(p) > disp)
pa->flag |= PARS_NO_DISP;
else
pa->flag &= ~PARS_NO_DISP;
@@ -4766,7 +4335,7 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
for(dframe=-totframesback; dframe<=0; dframe++) {
/* ok now we're all set so let's go */
- dynamics_step(scene, ob, psys, psmd, cfra+dframe, vg_vel, vg_tan, vg_rot, vg_size);
+ dynamics_step(sim, cfra+dframe);
psys->cfra = cfra+dframe;
}
}
@@ -4779,15 +4348,15 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
/* only write cache starting from second frame */
if(usecache && framenr != startframe)
- write_particles_to_cache(ob, psys, framenr);
+ BKE_ptcache_write_cache(&pid, (int)cfra);
/* for keyed particles the path is allways known so it can be drawn */
- if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED){
- set_keyed_keys(scene, ob, psys);
- psys_update_path_cache(scene, ob, psmd, psys,(int)cfra);
+ if(part->phystype==PART_PHYS_KEYED) {
+ set_keyed_keys(sim);
+ psys_update_path_cache(sim,(int)cfra);
}
else if(psys->pathcache)
- psys_free_path_cache(psys);
+ psys_free_path_cache(psys, NULL);
/* cleanup */
if(vg_vel) MEM_freeN(vg_vel);
@@ -4801,39 +4370,9 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle
}
}
-static void psys_to_softbody(Scene *scene, Object *ob, ParticleSystem *psys)
-{
- SoftBody *sb;
- short softflag;
-
- if(!(psys->softflag & OB_SB_ENABLE))
- return;
-
- /* let's replace the object's own softbody with the particle softbody */
- /* a temporary solution before cloth simulation is implemented, jahka */
-
- /* save these */
- sb= ob->soft;
- softflag= ob->softflag;
-
- /* swich to new ones */
- ob->soft= psys->soft;
- ob->softflag= psys->softflag;
-
- /* do softbody */
- sbObjectStep(scene, ob, (float)scene->r.cfra, NULL, psys_count_keys(psys));
-
- /* return things back to normal */
- psys->soft= ob->soft;
- psys->softflag= ob->softflag;
-
- ob->soft= sb;
- ob->softflag= softflag;
-}
-
static int hair_needs_recalc(ParticleSystem *psys)
{
- if((psys->flag & PSYS_EDITED)==0 &&
+ if(!(psys->flag & PSYS_EDITED) && (!psys->edit || !psys->edit->edited) &&
((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET)) {
return 1;
}
@@ -4844,54 +4383,55 @@ static int hair_needs_recalc(ParticleSystem *psys)
/* main particle update call, checks that things are ok on the large scale before actual particle calculations */
void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
{
- ParticleSystemModifierData *psmd;
+ ParticleSimulationData sim = {scene, ob, psys, NULL};
float cfra;
+ /* drawdata is outdated after ANY change */
+ if(psys->pdd) psys->pdd->flag &= ~PARTICLE_DRAW_DATA_UPDATED;
+
if(!psys_check_enabled(ob, psys))
return;
cfra= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0f);
- psmd= psys_get_modifier(ob, psys);
+ sim.psmd= psys_get_modifier(ob, psys);
/* system was already updated from modifier stack */
- if(psmd->flag & eParticleSystemFlag_psys_updated) {
- psmd->flag &= ~eParticleSystemFlag_psys_updated;
+ if(sim.psmd->flag & eParticleSystemFlag_psys_updated) {
+ sim.psmd->flag &= ~eParticleSystemFlag_psys_updated;
/* make sure it really was updated to cfra */
if(psys->cfra == cfra)
return;
}
- if(!psmd->dm)
+ if(!sim.psmd->dm)
return;
if(psys->recalc & PSYS_RECALC_TYPE)
- psys_changed_type(psys);
+ psys_changed_type(&sim);
+ else if(psys->recalc & PSYS_RECALC_PHYS)
+ psys_changed_physics(&sim);
/* (re-)create hair */
if(psys->part->type==PART_HAIR && hair_needs_recalc(psys)) {
float hcfra=0.0f;
int i;
- free_hair(psys, 0);
+ free_hair(ob, psys, 0);
/* first step is negative so particles get killed and reset */
psys->cfra= 1.0f;
for(i=0; i<=psys->part->hair_step; i++){
hcfra=100.0f*(float)i/(float)psys->part->hair_step;
- system_step(scene, ob, psys, psmd, hcfra);
- save_hair(scene, ob, psys, psmd, hcfra);
+ system_step(&sim, hcfra);
+ save_hair(&sim, hcfra);
}
psys->flag |= PSYS_HAIR_DONE;
}
- /* handle softbody hair */
- if(psys->part->type==PART_HAIR && psys->soft)
- psys_to_softbody(scene, ob, psys);
-
/* the main particle system step */
- system_step(scene, ob, psys, psmd, cfra);
+ system_step(&sim, cfra);
/* save matrix for duplicators */
Mat4Invert(psys->imat, ob->obmat);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index b514ac026fb..e5f89727ab8 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -39,6 +39,7 @@
#include "DNA_object_force.h"
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
#include "BLI_blenlib.h"
@@ -52,71 +53,857 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "BKE_smoke.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
+#include "BIK_api.h"
#include "BLI_blenlib.h"
+/* both in intern */
+#include "smoke_API.h"
+#include "minilzo.h"
+
+#include "LzmaLib.h"
+
+
/* needed for directory lookup */
+/* untitled blend's need getpid for a unique name */
#ifndef WIN32
#include <dirent.h>
+#include <unistd.h>
#else
+#include <process.h>
#include "BLI_winstuff.h"
#endif
-/* untitled blend's need getpid for a unique name */
-#ifdef WIN32
-#include <process.h>
-#else
-#include <unistd.h>
-#endif
+static void ptcache_data_to(void **data, int type, int index, void *to);
+static void ptcache_data_from(void **data, int type, void *from);
+
+#define PTCACHE_DATA_FROM(data, type, from) if(data[type]) { memcpy(data[type], from, ptcache_data_size[type]); }
+#define PTCACHE_DATA_TO(data, type, index, to) if(data[type]) { memcpy(to, (char*)data[type] + (index ? index * ptcache_data_size[type] : 0), ptcache_data_size[type]); }
+
+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:
+};
+
+/* Common functions */
+static int ptcache_read_basic_header(PTCacheFile *pf)
+{
+ int error=0;
-#ifdef _WIN32
-#ifndef snprintf
-#define snprintf _snprintf
-#endif
-#endif
+ /* Custom functions should read these basic elements too! */
+ if(!error && !fread(&pf->totpoint, sizeof(int), 1, pf->fp))
+ error = 1;
+
+ if(!error && !fread(&pf->data_types, sizeof(int), 1, pf->fp))
+ error = 1;
-/* Creating ID's */
+ return !error;
+}
+static int ptcache_write_basic_header(PTCacheFile *pf)
+{
+ /* Custom functions should write these basic elements too! */
+ if(!fwrite(&pf->totpoint, sizeof(int), 1, pf->fp))
+ return 0;
+
+ if(!fwrite(&pf->data_types, sizeof(int), 1, pf->fp))
+ return 0;
-void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
+ return 1;
+}
+/* Softbody functions */
+static int ptcache_write_softbody(int index, void *soft_v, void **data)
{
- ParticleSystemModifierData *psmd;
- ModifierData *md;
- int a;
+ SoftBody *soft= soft_v;
+ BodyPoint *bp = soft->bpoint + index;
+
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, bp->pos);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, bp->vec);
+
+ return 1;
+}
+static void ptcache_read_softbody(int index, void *soft_v, void **data, float frs_sec, float cfra, float *old_data)
+{
+ SoftBody *soft= soft_v;
+ BodyPoint *bp = soft->bpoint + index;
+
+ if(old_data) {
+ memcpy(bp->pos, data, 3 * sizeof(float));
+ memcpy(bp->vec, data + 3, 3 * sizeof(float));
+ }
+ else {
+ PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, 0, bp->pos);
+ 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)
+{
+ SoftBody *soft= soft_v;
+ BodyPoint *bp = soft->bpoint + index;
+ ParticleKey keys[4];
+ float dfra;
+
+ if(cfra1 == cfra2)
+ return;
+
+ VECCOPY(keys[1].co, bp->pos);
+ VECCOPY(keys[1].vel, bp->vec);
+
+ if(old_data) {
+ memcpy(keys[2].co, old_data, 3 * sizeof(float));
+ memcpy(keys[2].vel, old_data + 3, 3 * sizeof(float));
+ }
+ else
+ BKE_ptcache_make_particle_key(keys+2, 0, data, cfra2);
+
+ dfra = cfra2 - cfra1;
+
+ VecMulf(keys[1].vel, dfra);
+ VecMulf(keys[2].vel, dfra);
+
+ psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, keys, 1);
+
+ VecMulf(keys->vel, 1.0f / dfra);
+
+ VECCOPY(bp->pos, keys->co);
+ VECCOPY(bp->vec, keys->vel);
+}
+static int ptcache_totpoint_softbody(void *soft_v)
+{
+ SoftBody *soft= soft_v;
+ return soft->totpoint;
+}
+/* Particle functions */
+static int ptcache_write_particle(int index, void *psys_v, void **data)
+{
+ 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};
+
+ 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)
+ return 0;
+ }
+
+ 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);
+
+ if(boid)
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_BOIDS, &boid->data);
+
+ return 1;
+}
+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)
+{
+ 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) {
+ VecSubf(pa->state.vel, pa->state.co, pa->prev_state.co);
+ VecMulf(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
+ }
+ else {
+ VecSubf(pa->state.vel, pa->prev_state.co, pa->state.co);
+ VecMulf(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
+ }
+ }
+
+ /* determine rotation from velocity */
+ if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_ROTATION]) {
+ vectoquat(pa->state.vel, OB_POSX, OB_POSZ, pa->state.rot);
+ }
+}
+static void ptcache_interpolate_particle(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;
+
+ VecMulf(keys[1].vel, dfra / frs_sec);
+ VecMulf(keys[2].vel, dfra / frs_sec);
+
+ psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
+ QuatInterpol(pa->state.rot, keys[1].rot,keys[2].rot, (cfra - cfra1) / dfra);
+
+ VecMulf(pa->state.vel, frs_sec / dfra);
+
+ pa->state.time = cfra;
+}
+static int ptcache_totpoint_particle(void *psys_v)
+{
+ ParticleSystem *psys = psys_v;
+ return psys->totpart;
+}
+static int ptcache_totwrite_particle(void *psys_v)
+{
+ ParticleSystem *psys = psys_v;
+ int totwrite = 0;
+
+ /* TODO for later */
+ //if((psys->part->flag & (PART_UNBORN|PART_DIED))==0) {
+ // ParticleData *pa= psys->particles;
+ // int p, step = psys->pointcache->step;
+
+ // for(p=0; p<psys->totpart; p++,pa++)
+ // totwrite += (pa->time - step > pa->state.time || pa->dietime + step > pa->state.time);
+ //}
+ //else
+ totwrite= psys->totpart;
+
+ 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) {
+// VecSubf(pa->state.vel, pa->state.co, pa->prev_state.co);
+// VecMulf(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
+// }
+// else {
+// VecSubf(pa->state.vel, pa->prev_state.co, pa->state.co);
+// VecMulf(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
+// }
+// }
+//
+// /* determine rotation from velocity */
+// if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_ROTATION]) {
+// vectoquat(pa->state.vel, OB_POSX, OB_POSZ, pa->state.rot);
+// }
+//}
+//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;
+//
+// VecMulf(keys[1].vel, dfra / frs_sec);
+// VecMulf(keys[2].vel, dfra / frs_sec);
+//
+// psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
+// QuatInterpol(pa->state.rot, keys[1].rot,keys[2].rot, (cfra - cfra1) / dfra);
+//
+// VecMulf(pa->state.vel, frs_sec / dfra);
+//
+// pa->state.time = cfra;
+//}
+//
+/* Cloth functions */
+static int ptcache_write_cloth(int index, void *cloth_v, void **data)
+{
+ ClothModifierData *clmd= cloth_v;
+ Cloth *cloth= clmd->clothObject;
+ ClothVertex *vert = cloth->verts + index;
+
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, vert->x);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, vert->v);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_XCONST, vert->xconst);
+
+ return 1;
+}
+static void ptcache_read_cloth(int index, void *cloth_v, void **data, float frs_sec, float cfra, float *old_data)
+{
+ ClothModifierData *clmd= cloth_v;
+ Cloth *cloth= clmd->clothObject;
+ ClothVertex *vert = cloth->verts + index;
+
+ if(old_data) {
+ memcpy(vert->x, data, 3 * sizeof(float));
+ memcpy(vert->xconst, data + 3, 3 * sizeof(float));
+ memcpy(vert->v, data + 6, 3 * sizeof(float));
+ }
+ else {
+ PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, 0, vert->x);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, 0, vert->v);
+ 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)
+{
+ ClothModifierData *clmd= cloth_v;
+ Cloth *cloth= clmd->clothObject;
+ ClothVertex *vert = cloth->verts + index;
+ ParticleKey keys[4];
+ float dfra;
+
+ if(cfra1 == cfra2)
+ return;
+
+ VECCOPY(keys[1].co, vert->x);
+ VECCOPY(keys[1].vel, vert->v);
+
+ if(old_data) {
+ memcpy(keys[2].co, old_data, 3 * sizeof(float));
+ memcpy(keys[2].vel, old_data + 6, 3 * sizeof(float));
+ }
+ else
+ BKE_ptcache_make_particle_key(keys+2, 0, data, cfra2);
+
+ dfra = cfra2 - cfra1;
+
+ VecMulf(keys[1].vel, dfra);
+ VecMulf(keys[2].vel, dfra);
+
+ psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, keys, 1);
+
+ VecMulf(keys->vel, 1.0f / dfra);
+
+ VECCOPY(vert->x, keys->co);
+ VECCOPY(vert->v, keys->vel);
+
+ /* should vert->xconst be interpolated somehow too? - jahka */
+}
+
+static int ptcache_totpoint_cloth(void *cloth_v)
+{
+ ClothModifierData *clmd= cloth_v;
+ return clmd->clothObject->numverts;
+}
+
+/* Creating ID's */
+void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
+{
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->data= sb;
+ 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;
+}
- if(sb->particles) {
- psmd= psys_get_modifier(ob, sb->particles);
- pid->stack_index= modifiers_indexInObject(ob, (ModifierData*)psmd);
+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);
+
+ /* TODO for later */
+ //if((psys->part->flag & (PART_UNBORN|PART_DIED))==0)
+ // pid->data_types|= (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 || psys->part->avemode)
+ 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)
+{
+ SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+ SmokeDomainSettings *sds = smd->domain;
+
+ if(sds->fluid) {
+ return sds->res[0]*sds->res[1]*sds->res[2];
}
- else {
- for(a=0, md=ob->modifiers.first; md; md=md->next, a++) {
- if(md->type == eModifierType_Softbody) {
- pid->stack_index = a;
- break;
- }
+ else
+ return 0;
+}
+
+/* Smoke functions */
+static int ptcache_totpoint_smoke_turbulence(void *smoke_v)
+{
+ 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;
+ LZO_HEAP_ALLOC(wrkmem, LZO1X_MEM_COMPRESS);
+ unsigned int out_len = LZO_OUT_LEN(in_len);
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+ size_t sizeOfIt = 5;
+
+ if(mode == 1) {
+ 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;
+ }
+ else 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;
+ }
+
+ 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)
+{
+ SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+ SmokeDomainSettings *sds = smd->domain;
+
+ if(sds->fluid) {
+ size_t res = sds->res[0]*sds->res[1]*sds->res[2];
+ float dt, dx, *dens, *densold, *heat, *heatold, *vx, *vy, *vz, *vxold, *vyold, *vzold;
+ unsigned char *obstacles;
+ unsigned int in_len = sizeof(float)*(unsigned int)res;
+ unsigned char *out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len)*4, "pointcache_lzo_buffer");
+ int mode = res >= 1000000 ? 2 : 1;
+
+ 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_write(pf, &dt, 1, sizeof(float));
+ ptcache_file_write(pf, &dx, 1, sizeof(float));
+
+ MEM_freeN(out);
+
+ return 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;
+ int res = sds->res[0]*sds->res[1]*sds->res[2];
+ float *dens, *densold, *tcu, *tcv, *tcw;
+ unsigned int in_len = sizeof(float)*(unsigned int)res;
+ unsigned int in_len_big;
+ unsigned char *out;
+ int mode;
+
+ smoke_turbulence_get_res(sds->wt, res_big_array);
+ res_big = res_big_array[0]*res_big_array[1]*res_big_array[2];
+ mode = res_big >= 1000000 ? 2 : 1;
+ in_len_big = sizeof(float) * (unsigned int)res_big;
+
+ 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);
+ 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);
+ MEM_freeN(out);
+
+ return 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;
+ unsigned int out_len = len;
+ unsigned char *in;
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+ size_t sizeOfIt = 5;
+
+ ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char));
+ if(compressed) {
+ ptcache_file_read(pf, &in_len, 1, sizeof(unsigned int));
+ in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer");
+ ptcache_file_read(pf, in, in_len, sizeof(unsigned char));
+
+ if(compressed == 1)
+ r = lzo1x_decompress(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL);
+ else 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);
}
+
+ MEM_freeN(in);
+ }
+ else {
+ ptcache_file_read(pf, result, len, sizeof(unsigned char));
}
+
+ MEM_freeN(props);
+
+ return r;
}
-void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *psys)
+static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
+{
+ SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
+ SmokeDomainSettings *sds = smd->domain;
+
+ if(sds->fluid) {
+ size_t res = sds->res[0]*sds->res[1]*sds->res[2];
+ float dt, dx, *dens, *densold, *heat, *heatold, *vx, *vy, *vz, *vxold, *vyold, *vzold;
+ unsigned char *obstacles;
+ unsigned int out_len = (unsigned int)res * sizeof(float);
+
+ 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_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;
+
+ 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);
+
+ ptcache_compress_read(pf, (unsigned char*)dens, out_len_big);
+ ptcache_compress_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);
+ }
+}
+
+void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
{
- ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+ SmokeDomainSettings *sds = smd->domain;
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->data= psys;
- pid->type= PTCACHE_TYPE_PARTICLES;
- pid->stack_index= modifiers_indexInObject(ob, (ModifierData *)psmd);
- pid->cache= psys->pointcache;
+ 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_totpoint_smoke;
+
+ pid->write_elem= NULL;
+ pid->read_elem= NULL;
+
+ pid->read_stream = ptcache_read_smoke;
+ pid->write_stream = ptcache_write_smoke;
+
+ pid->interpolate_elem= NULL;
+
+ pid->write_header= ptcache_write_basic_header;
+ pid->read_header= ptcache_read_basic_header;
+
+ pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values to make pointcache happy
+ pid->info_types= 0;
+}
+
+void BKE_ptcache_id_from_smoke_turbulence(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_HIGHRES;
+ pid->stack_index= sds->point_cache[1]->index;
+
+ pid->cache= sds->point_cache[1];
+ pid->cache_ptr= &sds->point_cache[1];
+ pid->ptcaches= &sds->ptcaches[1];
+
+ pid->totpoint= pid->totwrite= ptcache_totpoint_smoke_turbulence;
+
+ pid->write_elem= NULL;
+ pid->read_elem= NULL;
+
+ pid->read_stream = ptcache_read_smoke_turbulence;
+ pid->write_stream = ptcache_write_smoke_turbulence;
+
+ pid->interpolate_elem= NULL;
+
+ pid->write_header= ptcache_write_basic_header;
+ pid->read_header= ptcache_read_basic_header;
+
+ pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values tot make pointcache happy
+ pid->info_types= 0;
}
void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *clmd)
@@ -124,10 +911,25 @@ void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *cl
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->data= clmd;
+ pid->calldata= clmd;
pid->type= PTCACHE_TYPE_CLOTH;
- pid->stack_index= modifiers_indexInObject(ob, (ModifierData *)clmd);
+ pid->stack_index= clmd->point_cache->index;
pid->cache= clmd->point_cache;
+ pid->cache_ptr= &clmd->point_cache;
+ pid->ptcaches= &clmd->ptcaches;
+ pid->totpoint= pid->totwrite= ptcache_totpoint_cloth;
+
+ 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_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_XCONST);
+ pid->info_types= 0;
}
void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob)
@@ -145,13 +947,9 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob)
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_particles(pid, ob, psys);
- BLI_addtail(lb, pid);
-
- if(psys->soft) {
+ if(psys->part) {
pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_softbody(pid, ob, psys->soft);
+ BKE_ptcache_id_from_particles(pid, ob, psys);
BLI_addtail(lb, pid);
}
}
@@ -162,9 +960,25 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob)
BKE_ptcache_id_from_cloth(pid, ob, (ClothModifierData*)md);
BLI_addtail(lb, pid);
}
+ if(md->type == eModifierType_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ {
+ 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);
+ }
+ }
}
}
+
+/* File handling */
+
/* Takes an Object ID and returns a unique name
- id: object id
- cfra: frame for the cache, can be negative
@@ -177,11 +991,15 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob)
static int ptcache_path(PTCacheID *pid, char *filename)
{
Library *lib;
- int i;
+ size_t i;
lib= (pid)? pid->ob->id.lib: NULL;
- if (G.relbase_valid || lib) {
+ if(pid->cache->flag & PTCACHE_EXTERNAL) {
+ strcpy(filename, pid->cache->path);
+ return BLI_add_slash(filename); /* new strlen() */
+ }
+ else if (G.relbase_valid || lib) {
char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the file */
char *blendfilename;
@@ -196,15 +1014,14 @@ static int ptcache_path(PTCacheID *pid, char *filename)
snprintf(filename, MAX_PTCACHE_PATH, "//"PTCACHE_PATH"%s", file); /* add blend file name to pointcache dir */
BLI_convertstringcode(filename, blendfilename);
- BLI_add_slash(filename);
- return strlen(filename);
+ return BLI_add_slash(filename); /* new strlen() */
}
/* use the temp path. this is weak but better then not using point cache at all */
/* btempdir is assumed to exist and ALWAYS has a trailing slash */
snprintf(filename, MAX_PTCACHE_PATH, "%s"PTCACHE_PATH"%d", btempdir, abs(getpid()));
- BLI_add_slash(filename);
- return strlen(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)
@@ -215,14 +1032,14 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho
filename[0] = '\0';
newname = filename;
- if (!G.relbase_valid) return 0; /* save blend file before using disk pointcache */
+ if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return 0; /* save blend file before using disk pointcache */
/* start with temp dir */
if (do_path) {
len = ptcache_path(pid, filename);
newname += len;
}
- if(strcmp(pid->cache->name, "")==0) {
+ if(strcmp(pid->cache->name, "")==0 && (pid->cache->flag & PTCACHE_EXTERNAL)==0) {
idname = (pid->ob->id.name+2);
/* convert chars to hex so they are always a valid filename */
while('\0' != *idname) {
@@ -232,14 +1049,26 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho
}
}
else {
- int temp = strlen(pid->cache->name);
+ int temp = (int)strlen(pid->cache->name);
strcpy(newname, pid->cache->name);
newname+=temp;
len += temp;
}
if (do_ext) {
- snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */
+
+ if(pid->cache->index < 0)
+ pid->cache->index = pid->stack_index = object_insert_ptcache(pid->ob);
+
+ if(pid->cache->flag & PTCACHE_EXTERNAL) {
+ if(pid->cache->index >= 0)
+ snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */
+ else
+ snprintf(newname, MAX_PTCACHE_FILE, "_%06d"PTCACHE_EXT, cfra); /* always 6 chars */
+ }
+ else {
+ snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */
+ }
len += 16;
}
@@ -247,7 +1076,7 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho
}
/* youll need to close yourself after! */
-PTCacheFile *BKE_ptcache_file_open(PTCacheID *pid, int mode, int cfra)
+static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
{
PTCacheFile *pf;
FILE *fp = NULL;
@@ -257,7 +1086,7 @@ PTCacheFile *BKE_ptcache_file_open(PTCacheID *pid, int mode, int cfra)
if(pid->ob->id.lib && mode == PTCACHE_FILE_WRITE)
return NULL;
- if (!G.relbase_valid) return NULL; /* save blend file before using disk pointcache */
+ 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);
@@ -280,104 +1109,193 @@ PTCacheFile *BKE_ptcache_file_open(PTCacheID *pid, int mode, int cfra)
return pf;
}
-void BKE_ptcache_file_close(PTCacheFile *pf)
+static void ptcache_file_close(PTCacheFile *pf)
{
fclose(pf->fp);
MEM_freeN(pf);
}
-int BKE_ptcache_file_read_floats(PTCacheFile *pf, float *f, int tot)
+static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size)
+{
+ return (fread(f, size, tot, pf->fp) == tot);
+}
+static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size)
+{
+ return (fwrite(f, size, tot, pf->fp) == tot);
+}
+static int ptcache_file_read_data(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]))
+ return 0;
+ }
+
+ return 1;
+}
+static int ptcache_file_write_data(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]))
+ return 0;
+ }
+
+ return 1;
+}
+static int ptcache_file_read_header_begin(PTCacheFile *pf)
{
- return (fread(f, sizeof(float), tot, pf->fp) == tot);
+ int error=0;
+ char bphysics[8];
+
+ pf->data_types = 0;
+
+ if(fread(bphysics, sizeof(char), 8, pf->fp) != 8)
+ error = 1;
+
+ if(!error && strncmp(bphysics, "BPHYSICS", 8))
+ error = 1;
+
+ if(!error && !fread(&pf->type, sizeof(int), 1, pf->fp))
+ error = 1;
+
+ /* if there was an error set file as it was */
+ if(error)
+ fseek(pf->fp, 0, SEEK_SET);
+
+ return !error;
}
-int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot)
+
+static int ptcache_file_write_header_begin(PTCacheFile *pf)
{
- return (fwrite(f, sizeof(float), tot, pf->fp) == tot);
+ char *bphysics = "BPHYSICS";
+
+ if(fwrite(bphysics, sizeof(char), 8, pf->fp) != 8)
+ return 0;
+
+ if(!fwrite(&pf->type, sizeof(int), 1, pf->fp))
+ return 0;
+
+ return 1;
}
-static int ptcache_pid_elemsize(PTCacheID *pid)
+
+/* Data pointer handling */
+int BKE_ptcache_data_size(int data_type)
{
- if(pid->type==PTCACHE_TYPE_SOFTBODY)
- return 0; // TODO
- else if(pid->type==PTCACHE_TYPE_PARTICLES)
- return sizeof(ParticleKey);
- else if(pid->type==PTCACHE_TYPE_CLOTH)
- return 0; // TODO
+ return ptcache_data_size[data_type];
+}
- return 0;
+static void ptcache_file_init_pointers(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;
}
-static int ptcache_pid_totelem(PTCacheID *pid)
+
+void BKE_ptcache_mem_init_pointers(PTCacheMem *pm)
{
- if(pid->type==PTCACHE_TYPE_SOFTBODY)
- return 0; // TODO
- else if(pid->type==PTCACHE_TYPE_PARTICLES) {
- ParticleSystem *psys = pid->data;
- return psys->totpart;
- }
- else if(pid->type==PTCACHE_TYPE_CLOTH)
- return 0; // TODO
+ int data_types = pm->data_types;
+ int i;
- return 0;
+ for(i=0; i<BPHYS_TOT_DATA; i++)
+ pm->cur[i] = data_types & (1<<i) ? pm->data[i] : NULL;
}
-void ptcache_update_info(PTCacheID *pid)
+void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
{
- PointCache *cache = pid->cache;
- int totframes = 0;
+ int i;
- if(cache->flag & PTCACHE_DISK_CACHE) {
- int cfra = cache->startframe;
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(pm->cur[i])
+ pm->cur[i] = (char*)pm->cur[i] + ptcache_data_size[i];
+ }
+}
+static void ptcache_alloc_data(PTCacheMem *pm)
+{
+ int data_types = pm->data_types;
+ int totpoint = pm->totpoint;
+ int i;
- for(; cfra<=cache->endframe; cfra++) {
- if(BKE_ptcache_id_exist(pid, cfra))
- totframes++;
- }
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(data_types & (1<<i))
+ pm->data[i] = MEM_callocN(totpoint * ptcache_data_size[i], "PTCache Data");
+ }
+}
+static void ptcache_free_data(void *data[])
+{
+ int i;
- sprintf(cache->info, "%i frames on disk.", totframes);
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(data[i])
+ MEM_freeN(data[i]);
}
- else {
- PTCacheMem *pm = cache->mem_cache.first;
- float framesize = 0.0f, bytes = 0.0f;
- int mb;
+}
+static void ptcache_copy_data(void *from[], void *to[])
+{
+ int i;
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(from[i])
+ memcpy(to[i], from[i], ptcache_data_size[i]);
+ }
+}
- if(pm)
- framesize = (float)ptcache_pid_elemsize(pid) * (float)pm->totpoint;
-
- for(; pm; pm=pm->next)
- totframes++;
- bytes = totframes * framesize;
- mb = (bytes > 1024.0f * 1024.0f);
+static int ptcache_pid_old_elemsize(PTCacheID *pid)
+{
+ if(pid->type==PTCACHE_TYPE_SOFTBODY)
+ return 6 * sizeof(float);
+ else if(pid->type==PTCACHE_TYPE_PARTICLES)
+ return sizeof(ParticleKey);
+ else if(pid->type==PTCACHE_TYPE_CLOTH)
+ return 9 * sizeof(float);
- sprintf(cache->info, "%i frames in memory (%.1f %s).",
- totframes,
- bytes / (mb ? 1024.0f * 1024.0f : 1024.0f),
- mb ? "Mb" : "kb");
- }
+ return 0;
}
+
/* reads cache from disk or memory */
/* possible to get old or interpolated result */
-int BKE_ptcache_read_cache(PTCacheReader *reader)
+int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec)
{
- PTCacheID *pid = reader->pid;
PTCacheFile *pf=NULL, *pf2=NULL;
PTCacheMem *pm=NULL, *pm2=NULL;
- int totelem = reader->totelem;
- float cfra = reader->cfra;
+ float old_data1[14], old_data2[14];
int cfrai = (int)cfra;
- int elemsize = ptcache_pid_elemsize(pid);
- int i, incr = elemsize / sizeof(float);
- float frs_sec = reader->scene->r.frs_sec;
+ int old_elemsize = ptcache_pid_old_elemsize(pid);
+ int i;
+
+ int cfra1 = 0, cfra2 = 0;
+ int totpoint = 0, totpoint2 = 0;
+ int *index = &i, *index2 = &i;
+ int use_old = 0, old_frame = 0;
+
+ int ret = 0, error = 0;
- if(totelem == 0)
+ /* nothing to read to */
+ if(pid->totpoint(pid->calldata) == 0)
return 0;
+ if(pid->cache->flag & PTCACHE_READ_INFO) {
+ pid->cache->flag &= ~PTCACHE_READ_INFO;
+ BKE_ptcache_read_cache(pid, 0, frs_sec);
+ }
+
+
/* first check if we have the actual frame cached */
if(cfra == (float)cfrai) {
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- pf= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
+ pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
}
else {
pm = pid->cache->mem_cache.first;
@@ -389,58 +1307,29 @@ int BKE_ptcache_read_cache(PTCacheReader *reader)
}
}
- /* if found, use exact frame */
- if(pf || pm) {
- float *data;
-
- if(pm)
- data = pm->data;
- else
- data = MEM_callocN(elemsize, "pointcache read data");
-
- for(i=0; i<totelem; i++) {
- if(pf) {
- if(!BKE_ptcache_file_read_floats(pf, data, incr)) {
- BKE_ptcache_file_close(pf);
- MEM_freeN(data);
- return 0;
- }
-
- reader->set_elem(i, reader->calldata, data);
- }
- else {
- reader->set_elem(i, reader->calldata, data);
- data += incr;
- }
- }
-
- if(pf) {
- BKE_ptcache_file_close(pf);
- MEM_freeN(data);
- }
-
- return PTCACHE_READ_EXACT;
- }
/* no exact cache frame found so try to find cached frames around cfra */
- if(reader->allow_interpolate || reader->allow_old) {
- int cfra1, cfra2;
-
+ if(!pm && !pf) {
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
pf=NULL;
while(cfrai > pid->cache->startframe && !pf) {
cfrai--;
- pf= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
+ pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
cfra1 = cfrai;
}
- *(reader->old_frame) = cfrai;
+ old_frame = cfrai;
cfrai = (int)cfra;
while(cfrai < pid->cache->endframe && !pf2) {
cfrai++;
- pf2= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
+ pf2= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
cfra2 = cfrai;
}
+
+ if(pf && !pf2) {
+ pf2 = pf;
+ pf = NULL;
+ }
}
else if(pid->cache->mem_cache.first){
pm = pid->cache->mem_cache.first;
@@ -449,167 +1338,370 @@ int BKE_ptcache_read_cache(PTCacheReader *reader)
pm= pm->next;
if(pm) {
- *(reader->old_frame) = pm->frame;
+ old_frame = pm->frame;
cfra1 = pm->frame;
}
pm2 = pid->cache->mem_cache.last;
- while(pm2->prev && pm2->frame > cfra)
- pm2= pm2->prev;
+ if(pm2 && pm2->frame < cfra)
+ pm2 = NULL;
+ else {
+ while(pm2->prev && pm2->prev->frame > cfra)
+ pm2= pm2->prev;
+
+ if(pm2)
+ cfra2 = pm2->frame;
+ }
- if(pm2)
- cfra2 = pm2->frame;
+ if(pm && !pm2) {
+ pm2 = pm;
+ pm = NULL;
+ }
}
+ }
- if(reader->allow_interpolate && ((pf && pf2) || (pm && pm2))) {
- /* interpolate from nearest frames */
- float *data1, *data2;
+ if(!pm && !pm2 && !pf && !pf2)
+ return 0;
- if(pm) {
- data1 = pm->data;
- data2 = pm2->data;
+ 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(pm2) {
+ BKE_ptcache_mem_init_pointers(pm2);
+ totpoint2 = pm2->totpoint;
+ index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
+ }
+ if(pf) {
+ if(ptcache_file_read_header_begin(pf)) {
+ if(pf->type != pid->type) {
+ /* todo report error */
+ ptcache_file_close(pf);
+ pf = NULL;
}
- else {
- data1 = MEM_callocN(elemsize, "pointcache read data1");
- data2 = MEM_callocN(elemsize, "pointcache read data2");
+ else if(pid->read_header(pf)) {
+ ptcache_file_init_pointers(pf);
+ totpoint = pf->totpoint;
+ index = pf->data_types & BPHYS_DATA_INDEX ? &pf->data.index : &i;
}
+ }
+ else {
+ /* fall back to old cache file format */
+ use_old = 1;
+ totpoint = pid->totpoint(pid->calldata);
+ }
+ }
+ if(pf2) {
+ if(ptcache_file_read_header_begin(pf2)) {
+ if(pf2->type != pid->type) {
+ /* todo report error */
+ ptcache_file_close(pf2);
+ pf2 = NULL;
+ }
+ else if(pid->read_header(pf2)) {
+ ptcache_file_init_pointers(pf2);
+ totpoint2 = pf2->totpoint;
+ index2 = pf->data_types & BPHYS_DATA_INDEX ? &pf2->data.index : &i;
+ }
+ }
+ else {
+ /* fall back to old cache file format */
+ use_old = 1;
+ totpoint2 = pid->totpoint(pid->calldata);
+ }
+ }
- for(i=0; i<totelem; i++) {
- if(pf && pf2) {
- if(!BKE_ptcache_file_read_floats(pf, data1, incr)) {
- BKE_ptcache_file_close(pf);
- BKE_ptcache_file_close(pf2);
- MEM_freeN(data1);
- MEM_freeN(data2);
- return 0;
- }
- if(!BKE_ptcache_file_read_floats(pf2, data2, incr)) {
- BKE_ptcache_file_close(pf);
- BKE_ptcache_file_close(pf2);
- MEM_freeN(data1);
- MEM_freeN(data2);
- return 0;
- }
- reader->interpolate_elem(i, reader->calldata, frs_sec, cfra, cfra1, cfra2, data1, data2);
- }
- else {
- reader->interpolate_elem(i, reader->calldata, frs_sec, cfra, cfra1, cfra2, data1, data2);
- data1 += incr;
- data2 += incr;
- }
+ /* don't read old cache if allready simulated past cached frame */
+ if(!pm && !pf && cfra1 && cfra1 <= pid->cache->simframe)
+ error = 1;
+ if(cfra1 && cfra1==cfra2)
+ error = 1;
+
+ if(!error)
+ {
+ if(pf && pid->read_stream) {
+ if(totpoint != pid->totpoint(pid->calldata))
+ error = 1;
+ else
+ {
+ // we have stream writing here
+ pid->read_stream(pf, pid->calldata);
}
+ }
+ }
- if(pf) {
- BKE_ptcache_file_close(pf);
- BKE_ptcache_file_close(pf2);
- MEM_freeN(data1);
- MEM_freeN(data2);
+ totpoint = MIN2(totpoint, pid->totpoint(pid->calldata));
+
+ 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; }
}
- return PTCACHE_READ_INTERPOLATED;
+ if(pm) {
+ BKE_ptcache_mem_incr_pointers(pm);
+ index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? pm->cur[BPHYS_DATA_INDEX] : &i;
+ }
}
- else if(reader->allow_old && (pf || pm)) {
- /* use last valid cache frame */
- float *data;
+ }
- if(pm)
- data = pm->data;
+ if(!error)
+ {
+ if(pf2 && pid->read_stream) {
+ if(totpoint2 != pid->totpoint(pid->calldata))
+ error = 1;
else
- data = MEM_callocN(elemsize, "pointcache read data");
-
- for(i=0; i<totelem; i++) {
- if(pf) {
- if(!BKE_ptcache_file_read_floats(pf, data, incr)) {
- BKE_ptcache_file_close(pf);
- if(pf2)
- BKE_ptcache_file_close(pf2);
- return 0;
- }
- reader->set_elem(i, reader->calldata, data);
+ {
+ // we have stream writing here
+ pid->read_stream(pf2, pid->calldata);
+ }
+ }
+ }
+
+ totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata));
+
+ 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 {
- reader->set_elem(i, reader->calldata, data);
- data += incr;
+ 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; }
}
- if(pf) {
- BKE_ptcache_file_close(pf);
- MEM_freeN(data);
+ if(pm2) {
+ BKE_ptcache_mem_incr_pointers(pm2);
+ index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
}
- if(pf2)
- BKE_ptcache_file_close(pf2);
-
- return PTCACHE_READ_OLD;
}
}
- if(pf)
- BKE_ptcache_file_close(pf);
- if(pf2)
- BKE_ptcache_file_close(pf2);
+ 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 0;
+ if(pf) {
+ ptcache_file_close(pf);
+ pf = NULL;
+ }
+
+ if(pf2) {
+ ptcache_file_close(pf2);
+ pf = NULL;
+ }
+
+ if((pid->cache->flag & PTCACHE_QUICK_CACHE)==0) {
+ cfrai = (int)cfra;
+ /* clear invalid cache frames so that better stuff can be simulated */
+ if(pid->cache->flag & PTCACHE_OUTDATED) {
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, cfrai);
+ }
+ else if(pid->cache->flag & PTCACHE_FRAMES_SKIPPED) {
+ 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));
+ }
+ }
+
+ return (error ? 0 : ret);
}
+/* TODO for later */
+//static void ptcache_make_index_array(PTCacheMem *pm, int totpoint)
+//{
+// int i, *index;
+//
+// if(pm->index_array) {
+// MEM_freeN(pm->index_array);
+// pm->index_array = NULL;
+// }
+//
+// if(!pm->data[BPHYS_DATA_INDEX])
+// return;
+//
+// pm->index_array = MEM_callocN(totpoint * sizeof(int), "PTCacheMem index_array");
+// index = pm->data[BPHYS_DATA_INDEX];
+//
+// for(i=0; i<pm->totpoint; i++, index++)
+// pm->index_array[*index] = i;
+//}
/* writes cache to disk or memory */
-int BKE_ptcache_write_cache(PTCacheWriter *writer)
+int BKE_ptcache_write_cache(PTCacheID *pid, int cfra)
{
- PointCache *cache = writer->pid->cache;
+ PointCache *cache = pid->cache;
PTCacheFile *pf= NULL;
- int elemsize = ptcache_pid_elemsize(writer->pid);
- int i, incr = elemsize / sizeof(float);
+ int i;
+ int totpoint = pid->totpoint(pid->calldata);
+ int add = 0, overwrite = 0;
- if(writer->totelem == 0 || writer->cfra <= 0)
+ if(totpoint == 0 || cfra < 0
+ || (cfra ? pid->data_types == 0 : pid->info_types == 0))
return 0;
if(cache->flag & PTCACHE_DISK_CACHE) {
- pf = BKE_ptcache_file_open(writer->pid, PTCACHE_FILE_WRITE, writer->cfra);
- if(!pf)
- return 0;
+ int efra = cache->endframe;
+
+ if(cfra==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;
+ }
+ else {
+ int ofra;
+ /* 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;
+ }
+ }
- for(i=0; i<writer->totelem; i++)
- BKE_ptcache_file_write_floats(pf, writer->elem_ptr(i, writer->calldata), incr);
+ 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;
+
+ pf->type = pid->type;
+ pf->totpoint = cfra ? totpoint : pid->totwrite(pid->calldata);
+ pf->data_types = cfra ? pid->data_types : pid->info_types;
+
+ if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
+ ptcache_file_close(pf);
+ return 0;
+ }
+
+ ptcache_file_init_pointers(pf);
+
+ 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 && pid->write_elem(i, pid->calldata, pf->cur))
+ if(!ptcache_file_write_data(pf)) {
+ ptcache_file_close(pf);
+ return 0;
+ }
+ }
+ }
}
else {
- PTCacheMem *pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
+ PTCacheMem *pm;
PTCacheMem *pm2;
- float *pmdata;
- pm->data = MEM_callocN(elemsize * writer->totelem, "Pointcache mem data");
- pmdata = pm->data;
+ pm2 = cache->mem_cache.first;
+
+ /* don't write info file in memory */
+ if(cfra==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;
- for(i=0; i<writer->totelem; i++, pmdata+=incr)
- memcpy(pmdata, writer->elem_ptr(i, writer->calldata), elemsize);
+ if(add || overwrite) {
+ if(overwrite)
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, pm2->frame);
- pm->frame = writer->cfra;
- pm->totpoint = writer->totelem;
+ pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- /* find add location */
- pm2 = cache->mem_cache.first;
- if(!pm2)
+ pm->totpoint = pid->totwrite(pid->calldata);
+ pm->data_types = cfra ? pid->data_types : pid->info_types;
+
+ ptcache_alloc_data(pm);
+ BKE_ptcache_mem_init_pointers(pm);
+
+ for(i=0; i<totpoint; i++) {
+ if(pid->write_elem && pid->write_elem(i, pid->calldata, pm->cur))
+ BKE_ptcache_mem_incr_pointers(pm);
+ }
+ //ptcache_make_index_array(pm, pid->totpoint(pid->calldata));
+
+ pm->frame = cfra;
BLI_addtail(&cache->mem_cache, pm);
- else if(pm2->frame == writer->cfra) {
- /* overwrite same frame */
- MEM_freeN(pm2->data);
- pm2->data = pm->data;
- MEM_freeN(pm);
}
- else {
- while(pm2->next && pm2->next->frame < writer->cfra)
- pm2 = pm2->next;
+ }
- BLI_insertlinkafter(&cache->mem_cache, pm2, pm);
+ 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;
}
-
- if(writer->cfra - cache->last_exact == 1)
- cache->last_exact = writer->cfra;
if(pf)
- BKE_ptcache_file_close(pf);
+ ptcache_file_close(pf);
- ptcache_update_info(writer->pid);
+ BKE_ptcache_update_info(pid);
return 1;
}
@@ -617,7 +1709,7 @@ int BKE_ptcache_write_cache(PTCacheWriter *writer)
* mode - PTCACHE_CLEAR_ALL,
*/
-
+/* Clears & resets */
void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
{
int len; /* store the length of the string */
@@ -630,7 +1722,7 @@ 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)
+ if(!pid->cache || pid->cache->flag & PTCACHE_BAKED)
return;
/* don't allow clearing for linked objects */
@@ -664,7 +1756,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 = strlen(de->d_name);
+ 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*/
@@ -688,10 +1780,12 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
PTCacheMem *pm= pid->cache->mem_cache.first;
PTCacheMem *link= NULL;
+ pm= pid->cache->mem_cache.first;
+
if(mode == PTCACHE_CLEAR_ALL) {
pid->cache->last_exact = 0;
for(; pm; pm=pm->next)
- MEM_freeN(pm->data);
+ ptcache_free_data(pm->data);
BLI_freelistN(&pid->cache->mem_cache);
} else {
while(pm) {
@@ -699,7 +1793,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
(mode==PTCACHE_CLEAR_AFTER && pm->frame > cfra) ) {
link = pm;
pm = pm->next;
- MEM_freeN(link->data);
+ ptcache_free_data(link->data);
BLI_freelinkN(&pid->cache->mem_cache, link);
}
else
@@ -721,7 +1815,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
for(; pm; pm=pm->next) {
if(pm->frame == cfra) {
- MEM_freeN(pm->data);
+ ptcache_free_data(pm->data);
BLI_freelinkN(&pid->cache->mem_cache, pm);
break;
}
@@ -730,7 +1824,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
break;
}
- ptcache_update_info(pid);
+ BKE_ptcache_update_info(pid);
}
int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
@@ -762,6 +1856,9 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
PointCache *cache;
float offset, time, nexttime;
+ /* TODO: this has to be sorter out once bsystem_time gets redone, */
+ /* now caches can handle interpolating etc. too - jahka */
+
/* time handling for point cache:
* - simulation time is scaled by result of bsystem_time
* - for offsetting time only time offset is taken into account, since
@@ -798,7 +1895,7 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
{
PointCache *cache;
- int reset, clear, current, after;
+ int reset, clear, after;
if(!pid->cache)
return 0;
@@ -806,23 +1903,17 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
cache= pid->cache;
reset= 0;
clear= 0;
- current= 0;
after= 0;
if(mode == PTCACHE_RESET_DEPSGRAPH) {
if(!(cache->flag & PTCACHE_BAKED) && !BKE_ptcache_get_continue_physics()) {
- if(cache->flag & PTCACHE_AUTOCACHE) {
- reset= 1;
+ if(cache->flag & PTCACHE_QUICK_CACHE)
clear= 1;
- }
- else {
- current= 1;
- after= 1;
- cache->flag |= PTCACHE_OUTDATED;
- }
+
+ after= 1;
}
- else
- cache->flag |= PTCACHE_OUTDATED;
+
+ cache->flag |= PTCACHE_OUTDATED;
}
else if(mode == PTCACHE_RESET_BAKED) {
if(!BKE_ptcache_get_continue_physics()) {
@@ -835,39 +1926,34 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
else if(mode == PTCACHE_RESET_OUTDATED) {
reset = 1;
- if(cache->flag & PTCACHE_OUTDATED)
- if(!(cache->flag & PTCACHE_BAKED))
- clear= 1;
- }
- else if(mode == PTCACHE_RESET_FREE) {
- if(!(cache->flag & PTCACHE_BAKED) && !BKE_ptcache_get_continue_physics()) {
- if((cache->flag & PTCACHE_AUTOCACHE)==0) {
- current= 1;
- after= 1;
- }
+ if(cache->flag & PTCACHE_OUTDATED && !(cache->flag & PTCACHE_BAKED)) {
+ clear= 1;
+ cache->flag &= ~PTCACHE_OUTDATED;
}
}
if(reset) {
- cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_SIMULATION_VALID);
+ cache->flag &= ~(PTCACHE_REDO_NEEDED|PTCACHE_SIMULATION_VALID);
cache->simframe= 0;
cache->last_exact= 0;
if(pid->type == PTCACHE_TYPE_CLOTH)
- cloth_free_modifier(pid->ob, pid->data);
+ cloth_free_modifier(pid->ob, pid->calldata);
else if(pid->type == PTCACHE_TYPE_SOFTBODY)
- sbFreeSimulation(pid->data);
+ sbFreeSimulation(pid->calldata);
else if(pid->type == PTCACHE_TYPE_PARTICLES)
- psys_reset(pid->data, PSYS_RESET_DEPSGRAPH);
+ psys_reset(pid->calldata, PSYS_RESET_DEPSGRAPH);
+ else if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ smokeModifier_reset(pid->calldata);
+ else if(pid->type == PTCACHE_TYPE_SMOKE_HIGHRES)
+ smokeModifier_reset_turbulence(pid->calldata);
}
if(clear)
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- if(after)
+ else if(after)
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, CFRA);
- if(current)
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, CFRA);
- return (reset || clear || current || after);
+ return (reset || clear || after);
}
int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
@@ -886,10 +1972,10 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- /* Baked softbody hair has to be checked first, because we don't want to reset */
- /* particles or softbody in that case -jahka */
- if(psys->soft) {
- BKE_ptcache_id_from_softbody(&pid, ob, psys->soft);
+ /* Baked cloth hair has to be checked first, because we don't want to reset */
+ /* particles or cloth in that case -jahka */
+ 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
@@ -898,7 +1984,7 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
else if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD)
skip = 1;
- if(skip == 0) {
+ if(skip == 0 && psys->part) {
BKE_ptcache_id_from_particles(&pid, ob, psys);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
@@ -909,8 +1995,22 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
BKE_ptcache_id_from_cloth(&pid, ob, (ClothModifierData*)md);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
+ if(md->type == eModifierType_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ {
+ 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);
+ }
+ }
}
+ if (ob->type == OB_ARMATURE)
+ BIK_clear_cache(ob->pose);
+
return reset;
}
@@ -968,7 +2068,7 @@ void BKE_ptcache_set_continue_physics(Scene *scene, int enable)
if(CONTINUE_PHYSICS == 0) {
for(ob=G.main->object.first; ob; ob=ob->id.next)
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
}
@@ -978,48 +2078,118 @@ int BKE_ptcache_get_continue_physics()
return CONTINUE_PHYSICS;
}
-/* Point Cache */
+/* Point Cache handling */
-PointCache *BKE_ptcache_add()
+PointCache *BKE_ptcache_add(ListBase *ptcaches)
{
PointCache *cache;
cache= MEM_callocN(sizeof(PointCache), "PointCache");
cache->startframe= 1;
cache->endframe= 250;
+ cache->step= 10;
+ cache->index = -1;
+
+ BLI_addtail(ptcaches, cache);
return cache;
}
-void BKE_ptcache_free(PointCache *cache)
+void BKE_ptcache_free_mem(ListBase *mem_cache)
{
- PTCacheMem *pm = cache->mem_cache.first;
+ PTCacheMem *pm = mem_cache->first;
+
if(pm) {
- for(; pm; pm=pm->next)
- MEM_freeN(pm->data);
+ for(; pm; pm=pm->next) {
+ ptcache_free_data(pm->data);
+ if(pm->index_array)
+ MEM_freeN(pm->index_array);
+ }
- BLI_freelistN(&cache->mem_cache);
+ BLI_freelistN(mem_cache);
}
-
+}
+void BKE_ptcache_free(PointCache *cache)
+{
+ BKE_ptcache_free_mem(&cache->mem_cache);
+ if(cache->edit && cache->free_edit)
+ cache->free_edit(cache->edit);
MEM_freeN(cache);
}
+void BKE_ptcache_free_list(ListBase *ptcaches)
+{
+ PointCache *cache = ptcaches->first;
-PointCache *BKE_ptcache_copy(PointCache *cache)
+ while(cache) {
+ BLI_remlink(ptcaches, cache);
+ BKE_ptcache_free(cache);
+ cache = ptcaches->first;
+ }
+}
+
+static PointCache *ptcache_copy(PointCache *cache)
{
PointCache *ncache;
ncache= MEM_dupallocN(cache);
+ /* hmm, should these be copied over instead? */
+ ncache->mem_cache.first = NULL;
+ ncache->mem_cache.last = NULL;
+
ncache->flag= 0;
ncache->simframe= 0;
return ncache;
}
+/* returns first point cache */
+PointCache *BKE_ptcache_copy_list(ListBase *ptcaches_new, ListBase *ptcaches_old)
+{
+ PointCache *cache = ptcaches_old->first;
+
+ ptcaches_new->first = ptcaches_new->last = NULL;
+
+ for(; cache; cache=cache->next)
+ BLI_addtail(ptcaches_new, ptcache_copy(cache));
+ return ptcaches_new->first;
+}
/* Baking */
-void BKE_ptcache_autocache_all(Scene *scene)
+static int count_quick_cache(Scene *scene, int *quick_step)
+{
+ Base *base = scene->base.first;
+ PTCacheID *pid;
+ ListBase pidlist;
+ int autocache_count= 0;
+
+ for(base = scene->base.first; base; base = base->next) {
+ if(base->object) {
+ BKE_ptcache_ids_from_object(&pidlist, base->object);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if((pid->cache->flag & PTCACHE_BAKED)
+ || (pid->cache->flag & PTCACHE_QUICK_CACHE)==0)
+ continue;
+
+ if(pid->cache->flag & PTCACHE_OUTDATED || (pid->cache->flag & PTCACHE_SIMULATION_VALID)==0) {
+ if(!autocache_count)
+ *quick_step = pid->cache->step;
+ else
+ *quick_step = MIN2(*quick_step, pid->cache->step);
+
+ autocache_count++;
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+ }
+ }
+
+ return autocache_count;
+}
+void BKE_ptcache_quick_cache_all(Scene *scene)
{
PTCacheBaker baker;
@@ -1030,9 +2200,10 @@ void BKE_ptcache_autocache_all(Scene *scene)
baker.progressbar=NULL;
baker.progresscontext=NULL;
baker.render=0;
+ baker.anim_init = 0;
baker.scene=scene;
- if(psys_count_autocache(scene, NULL))
+ if(count_quick_cache(scene, &baker.quick_step))
BKE_ptcache_make_cache(&baker);
}
@@ -1043,27 +2214,45 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
Base *base;
ListBase pidlist;
PTCacheID *pid = baker->pid;
- PointCache *cache;
+ PointCache *cache = NULL;
float frameleno = scene->r.framelen;
int cfrao = CFRA;
int startframe = MAXFRAME;
- int endframe = CFRA;
+ int endframe = baker->anim_init ? scene->r.sfra : CFRA;
int bake = baker->bake;
int render = baker->render;
+ int step = baker->quick_step;
G.afbreek = 0;
- //printf("Caching physics...");
-
/* set caches to baking mode and figure out start frame */
if(pid) {
/* cache/bake a single object */
cache = pid->cache;
if((cache->flag & PTCACHE_BAKED)==0) {
if(pid->type==PTCACHE_TYPE_PARTICLES)
- psys_get_pointcache_start_end(scene, pid->data, &cache->startframe, &cache->endframe);
+ psys_get_pointcache_start_end(scene, pid->calldata, &cache->startframe, &cache->endframe);
+ else if(pid->type == PTCACHE_TYPE_SMOKE_HIGHRES) {
+ /* get all pids from the object and search for smoke low res */
+ ListBase pidlist2;
+ PTCacheID *pid2;
+ BKE_ptcache_ids_from_object(&pidlist2, pid->ob);
+ for(pid2=pidlist2.first; pid2; pid2=pid2->next) {
+ if(pid2->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ {
+ if(pid2->cache && !(pid2->cache->flag & PTCACHE_BAKED)) {
+ if(bake || pid2->cache->flag & PTCACHE_REDO_NEEDED)
+ BKE_ptcache_id_clear(pid2, PTCACHE_CLEAR_ALL, 0);
+ if(bake) {
+ pid2->cache->flag |= PTCACHE_BAKING;
+ pid2->cache->flag &= ~PTCACHE_BAKED;
+ }
+ }
+ }
+ }
+ }
- if(bake || cache->flag & PTCACHE_OUTDATED)
+ if(bake || cache->flag & PTCACHE_REDO_NEEDED)
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
startframe = MAX2(cache->last_exact, cache->startframe);
@@ -1072,8 +2261,9 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
endframe = cache->endframe;
cache->flag |= PTCACHE_BAKING;
}
- else
+ else {
endframe = MIN2(endframe, cache->endframe);
+ }
cache->flag &= ~PTCACHE_BAKED;
}
@@ -1085,38 +2275,43 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
for(pid=pidlist.first; pid; pid=pid->next) {
cache = pid->cache;
if((cache->flag & PTCACHE_BAKED)==0) {
- if(pid->type==PTCACHE_TYPE_PARTICLES)
- psys_get_pointcache_start_end(scene, pid->data, &cache->startframe, &cache->endframe);
+ if(pid->type==PTCACHE_TYPE_PARTICLES) {
+ ParticleSystem *psys = (ParticleSystem*)pid->calldata;
+ /* skip hair & keyed particles */
+ if(psys->part->type == PART_HAIR || psys->part->phystype == PART_PHYS_KEYED)
+ continue;
+
+ psys_get_pointcache_start_end(scene, pid->calldata, &cache->startframe, &cache->endframe);
+ }
- if(cache->flag & PTCACHE_OUTDATED)
+ if((cache->flag & PTCACHE_REDO_NEEDED || (cache->flag & PTCACHE_SIMULATION_VALID)==0)
+ && ((cache->flag & PTCACHE_QUICK_CACHE)==0 || render || bake))
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
startframe = MIN2(startframe, cache->startframe);
- if(bake) {
- endframe = MAX2(endframe, cache->endframe);
+ if(bake || render) {
cache->flag |= PTCACHE_BAKING;
+
+ if(bake)
+ endframe = MAX2(endframe, cache->endframe);
}
- else if(render)
- cache->flag |= PTCACHE_BAKING;
cache->flag &= ~PTCACHE_BAKED;
}
}
-
BLI_freelistN(&pidlist);
}
CFRA= startframe;
scene->r.framelen = 1.0;
- scene_update_for_newframe(scene, scene->lay);
- for(; CFRA <= endframe; CFRA++) {
- float prog;
+ for(; CFRA <= endframe; CFRA+=step) {
+ int prog;
if(bake)
- prog = (int)(100.0 * (float)(CFRA - startframe)/(float)(endframe-startframe));
+ prog = (int)(100.0f * (float)(CFRA - startframe)/(float)(endframe-startframe));
else
prog = CFRA;
@@ -1133,112 +2328,345 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
/* clear baking flag */
if(pid) {
- cache->flag &= ~(PTCACHE_BAKING|PTCACHE_OUTDATED);
- if(bake)
+ cache->flag &= ~(PTCACHE_BAKING|PTCACHE_REDO_NEEDED);
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ if(bake) {
cache->flag |= PTCACHE_BAKED;
+ /* write info file */
+ if(cache->flag & PTCACHE_DISK_CACHE)
+ BKE_ptcache_write_cache(pid, 0);
+ }
}
else for(base=scene->base.first; base; base= base->next) {
BKE_ptcache_ids_from_object(&pidlist, base->object);
for(pid=pidlist.first; pid; pid=pid->next) {
- cache->flag &= ~(PTCACHE_BAKING|PTCACHE_OUTDATED);
- if(bake)
+ /* skip hair particles */
+ if(pid->type==PTCACHE_TYPE_PARTICLES && ((ParticleSystem*)pid->calldata)->part->type == PART_HAIR)
+ continue;
+
+ cache = pid->cache;
+
+ if(step > 1)
+ cache->flag &= ~(PTCACHE_BAKING|PTCACHE_OUTDATED);
+ else
+ cache->flag &= ~(PTCACHE_BAKING|PTCACHE_REDO_NEEDED);
+
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+
+ if(bake) {
cache->flag |= PTCACHE_BAKED;
+ if(cache->flag & PTCACHE_DISK_CACHE)
+ BKE_ptcache_write_cache(pid, 0);
+ }
}
+ BLI_freelistN(&pidlist);
}
-
- //printf("done!\n");
scene->r.framelen = frameleno;
CFRA = cfrao;
- scene_update_for_newframe(scene, scene->lay);
-}
-void BKE_ptcache_toggle_disk_cache(PTCacheID *pid) {
+ if(bake) /* already on cfra unless baking */
+ scene_update_for_newframe(scene, scene->lay);
+
+ /* TODO: call redraw all windows somehow */
+}
+/* Helpers */
+void BKE_ptcache_disk_to_mem(PTCacheID *pid)
+{
PointCache *cache = pid->cache;
PTCacheFile *pf;
PTCacheMem *pm;
- int totelem=0;
- int float_count=0;
- int tot;
- if (!G.relbase_valid){
- cache->flag &= ~PTCACHE_DISK_CACHE;
- return;
+ int cfra, sfra = cache->startframe, efra = cache->endframe;
+ int i;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+
+ 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);
+
+ 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->data);
+ MEM_freeN(pm);
+ ptcache_file_close(pf);
+
+ return;
+ }
+ ptcache_copy_data(pf->cur, pm->cur);
+ BKE_ptcache_mem_incr_pointers(pm);
+ }
+
+ //ptcache_make_index_array(pm, pid->totpoint(pid->calldata));
+
+ BLI_addtail(&pid->cache->mem_cache, pm);
+
+ ptcache_file_close(pf);
+ }
}
- totelem = ptcache_pid_totelem(pid);
- float_count = ptcache_pid_elemsize(pid) / sizeof(float);
+}
+void BKE_ptcache_mem_to_disk(PTCacheID *pid)
+{
+ PointCache *cache = pid->cache;
+ PTCacheFile *pf;
+ PTCacheMem *pm;
+ int i;
- if(totelem==0 || float_count==0)
- return;
+ pm = cache->mem_cache.first;
- tot = totelem*float_count;
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- /* MEM -> DISK */
- if(cache->flag & PTCACHE_DISK_CACHE) {
- pm = cache->mem_cache.first;
+ for(; pm; pm=pm->next) {
+ pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+ if(pf) {
+ pf->data_types = pm->data_types;
+ pf->totpoint = pm->totpoint;
+ pf->type = pid->type;
- for(; pm; pm=pm->next) {
- pf = BKE_ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
+ BKE_ptcache_mem_init_pointers(pm);
+ ptcache_file_init_pointers(pf);
- if(pf) {
- if(fwrite(pm->data, sizeof(float), tot, pf->fp) != tot) {
+ if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
+ 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)) {
printf("Error writing to disk cache\n");
-
cache->flag &= ~PTCACHE_DISK_CACHE;
- BKE_ptcache_file_close(pf);
+ ptcache_file_close(pf);
return;
}
- BKE_ptcache_file_close(pf);
+ BKE_ptcache_mem_incr_pointers(pm);
}
- else
- printf("Error creating disk cache file\n");
+
+ ptcache_file_close(pf);
+
+ /* write info file */
+ if(cache->flag & PTCACHE_BAKED)
+ BKE_ptcache_write_cache(pid, 0);
}
+ else
+ printf("Error creating disk cache file\n");
+ }
+}
+void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
+{
+ PointCache *cache = pid->cache;
+ int last_exact = cache->last_exact;
+ if (!G.relbase_valid){
cache->flag &= ~PTCACHE_DISK_CACHE;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- cache->flag |= PTCACHE_DISK_CACHE;
+ printf("File must be saved before using disk cache!\n");
+ return;
}
- /* DISK -> MEM */
- else {
- int cfra;
- int sfra = cache->startframe;
- int efra = cache->endframe;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+ if(cache->flag & PTCACHE_DISK_CACHE)
+ BKE_ptcache_mem_to_disk(pid);
+ else
+ BKE_ptcache_disk_to_mem(pid);
- for(cfra=sfra; cfra <= efra; cfra++) {
- pf = BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
+ cache->flag ^= PTCACHE_DISK_CACHE;
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+ cache->flag ^= PTCACHE_DISK_CACHE;
+
+ cache->last_exact = last_exact;
- if(pf) {
- pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- pm->data = MEM_callocN(sizeof(float)*tot, "Pointcache mem data");
+ BKE_ptcache_update_info(pid);
+}
- if(fread(pm->data, sizeof(float), tot, pf->fp)!= tot) {
- printf("Error reading from disk cache\n");
+void BKE_ptcache_load_external(PTCacheID *pid)
+{
+ /*todo*/
+ PointCache *cache = pid->cache;
+ int len; /* store the length of the string */
+ int info = 0;
- 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];
- MEM_freeN(pm->data);
- MEM_freeN(pm);
- BKE_ptcache_file_close(pf);
- return;
+ 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 */
+
+ dir = opendir(path);
+ if (dir==NULL)
+ return;
+
+ if(cache->index >= 0)
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, cache->index);
+ else
+ strcpy(ext, PTCACHE_EXT);
+
+ 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 */
+ 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) {
+ cache->startframe = MIN2(cache->startframe, frame);
+ cache->endframe = MAX2(cache->endframe, frame);
+ }
+ else
+ info = 1;
}
+ }
+ }
+ }
+ closedir(dir);
- pm->frame = cfra;
+ if(cache->startframe != MAXFRAME) {
+ PTCacheFile *pf;
- BLI_addtail(&pid->cache->mem_cache, pm);
+ /* read totpoint from info file (frame 0) */
+ if(info) {
+ pf= ptcache_file_open(pid, PTCACHE_FILE_READ, 0);
+
+ if(pf) {
+ if(ptcache_file_read_header_begin(pf)) {
+ if(pf->type == pid->type && pid->read_header(pf)) {
+ cache->totpoint = pf->totpoint;
+ cache->flag |= PTCACHE_READ_INFO;
+ }
+ else {
+ cache->totpoint = 0;
+ }
+ }
+ ptcache_file_close(pf);
+ }
+ }
+ /* or from any old format cache file */
+ else {
+ float old_data[14];
+ int elemsize = ptcache_pid_old_elemsize(pid);
+ pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cache->startframe);
- BKE_ptcache_file_close(pf);
+ if(pf) {
+ while(ptcache_file_read(pf, old_data, 1, elemsize))
+ cache->totpoint++;
+
+ ptcache_file_close(pf);
}
}
+ }
- cache->flag |= PTCACHE_DISK_CACHE;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- cache->flag &= ~PTCACHE_DISK_CACHE;
+ cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
+
+ BKE_ptcache_update_info(pid);
+}
+
+void BKE_ptcache_update_info(PTCacheID *pid)
+{
+ PointCache *cache = pid->cache;
+ int totframes = 0;
+ char mem_info[64];
+
+ if(cache->flag & PTCACHE_EXTERNAL) {
+ int cfra = cache->startframe;
+
+ for(; cfra<=cache->endframe; cfra++) {
+ if(BKE_ptcache_id_exist(pid, cfra))
+ totframes++;
+ }
+
+ if(totframes && cache->totpoint)
+ sprintf(cache->info, "%i points found!", cache->totpoint);
+ else
+ sprintf(cache->info, "No valid data to read!");
+ return;
+ }
+
+ if(cache->flag & PTCACHE_DISK_CACHE) {
+ int cfra = cache->startframe;
+
+ 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;
+ float framesize = 0.0f, bytes = 0.0f;
+ int mb;
+
+ if(pm)
+ framesize = (float)ptcache_pid_old_elemsize(pid) * (float)pm->totpoint;
+
+ for(; pm; pm=pm->next)
+ totframes++;
+
+ bytes = totframes * framesize;
+
+ mb = (bytes > 1024.0f * 1024.0f);
+
+ sprintf(mem_info, "%i frames in memory (%.1f %s)",
+ totframes,
+ bytes / (mb ? 1024.0f * 1024.0f : 1024.0f),
+ mb ? "Mb" : "kb");
+ }
+
+ if(cache->flag & PTCACHE_OUTDATED) {
+ sprintf(cache->info, "%s, cache is outdated!", mem_info);
+ }
+ else if(cache->flag & PTCACHE_FRAMES_SKIPPED) {
+ sprintf(cache->info, "%s, not exact since frame %i.", mem_info, cache->last_exact);
}
+ else
+ sprintf(cache->info, "%s.", mem_info);
}
diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c
index 261b58454bd..5cae527957b 100644
--- a/source/blender/blenkernel/intern/property.c
+++ b/source/blender/blenkernel/intern/property.c
@@ -33,6 +33,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -99,25 +100,18 @@ void init_property(bProperty *prop)
if(prop->poin && prop->poin != &prop->data) MEM_freeN(prop->poin);
prop->poin= 0;
- prop->otype= prop->type;
prop->data= 0;
switch(prop->type) {
case GPROP_BOOL:
- prop->poin= &prop->data;
- break;
case GPROP_INT:
- prop->poin= &prop->data;
- break;
case GPROP_FLOAT:
+ case GPROP_TIME:
prop->poin= &prop->data;
break;
case GPROP_STRING:
prop->poin= MEM_callocN(MAX_PROPSTRING, "property string");
break;
- case GPROP_TIME:
- prop->poin= &prop->data;
- break;
}
}
@@ -136,6 +130,60 @@ bProperty *new_property(int type)
return prop;
}
+/* used by unique_property() only */
+static bProperty *get_property__internal(bProperty *first, bProperty *self, const char *name)
+{
+ bProperty *p;
+ for(p= first; p; p= p->next) {
+ if (p!=self && (strcmp(p->name, name)==0))
+ return p;
+ }
+ return NULL;
+}
+void unique_property(bProperty *first, bProperty *prop, int force)
+{
+ bProperty *p;
+
+ /* set the first if its not set */
+ if(first==NULL) {
+ first= prop;
+ while(first->prev) {
+ first= first->prev;
+ }
+ }
+
+ if(force) {
+ /* change other names to make them unique */
+ while((p = get_property__internal(first, prop, prop->name))) {
+ unique_property(first, p, 0);
+ }
+ }else {
+ /* change our own name until its unique */
+ if(get_property__internal(first, prop, prop->name)) {
+ /* there is a collision */
+ char new_name[sizeof(prop->name)];
+ char base_name[sizeof(prop->name)];
+ char num[sizeof(prop->name)];
+ int i= 0;
+
+ /* strip numbers */
+ strcpy(base_name, prop->name);
+ for(i= strlen(base_name)-1; (i>=0 && isdigit(base_name[i])); i--) {
+ base_name[i]= '\0';
+ }
+ i= 0;
+
+ do { /* ensure we have enough chars for the new number in the name */
+ sprintf(num, "%d", i++);
+ BLI_strncpy(new_name, base_name, sizeof(prop->name) - strlen(num));
+ strcat(new_name, num);
+ } while(get_property__internal(first, prop, new_name));
+
+ strcpy(prop->name, new_name);
+ }
+ }
+}
+
bProperty *get_ob_property(Object *ob, char *name)
{
bProperty *prop;
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index 116fd069948..e524359d2bc 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -49,6 +49,7 @@ static char *report_type_str(int type)
switch(type) {
case RPT_DEBUG: return "Debug";
case RPT_INFO: return "Info";
+ case RPT_OPERATOR: return "Operator";
case RPT_WARNING: return "Warning";
case RPT_ERROR: return "Error";
case RPT_ERROR_INVALID_INPUT: return "Invalid Input Error";
@@ -65,22 +66,28 @@ void BKE_reports_init(ReportList *reports, int flag)
memset(reports, 0, sizeof(ReportList));
- reports->storelevel= RPT_WARNING;
- reports->printlevel= RPT_WARNING;
+ reports->storelevel= RPT_INFO;
+ reports->printlevel= RPT_INFO;
reports->flag= flag;
}
void BKE_reports_clear(ReportList *reports)
{
- Report *report;
+ Report *report, *report_next;
if(!reports)
return;
- for(report=reports->list.first; report; report=report->next)
+ report= reports->list.first;
+
+ while (report) {
+ report_next= report->next;
MEM_freeN(report->message);
+ MEM_freeN(report);
+ report= report_next;
+ }
- BLI_freelistN(&reports->list);
+ reports->list.first= reports->list.last= NULL;
}
void BKE_report(ReportList *reports, ReportType type, const char *message)
@@ -101,7 +108,7 @@ void BKE_report(ReportList *reports, ReportType type, const char *message)
len= strlen(message);
report->message= MEM_callocN(sizeof(char)*(len+1), "ReportMessage");
memcpy(report->message, message, sizeof(char)*(len+1));
-
+ report->len= len;
BLI_addtail(&reports->list, report);
}
}
@@ -128,7 +135,7 @@ void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
va_end(args);
report->message= BLI_dynstr_get_cstring(ds);
-
+ report->len= BLI_dynstr_get_len(ds);
BLI_dynstr_free(ds);
report->type= type;
@@ -154,6 +161,7 @@ void BKE_reports_prepend(ReportList *reports, const char *prepend)
MEM_freeN(report->message);
report->message= BLI_dynstr_get_cstring(ds);
+ report->len= BLI_dynstr_get_len(ds);
BLI_dynstr_free(ds);
}
@@ -178,6 +186,7 @@ void BKE_reports_prependf(ReportList *reports, const char *prepend, ...)
MEM_freeN(report->message);
report->message= BLI_dynstr_get_cstring(ds);
+ report->len= BLI_dynstr_get_len(ds);
BLI_dynstr_free(ds);
}
@@ -221,7 +230,7 @@ char *BKE_reports_string(ReportList *reports, ReportType level)
DynStr *ds;
char *cstring;
- if(!reports)
+ if(!reports || !reports->list.first)
return NULL;
ds= BLI_dynstr_new();
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index 74d2347ec39..5cd554725ff 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -35,6 +35,8 @@
#include <stdio.h>
#include <string.h>
+#include <float.h>
+
#include "MEM_guardedalloc.h"
#include "DNA_text_types.h"
@@ -50,30 +52,6 @@
#include "BKE_blender.h"
#include "BKE_sca.h"
-//#include "wm_event_types.h"
-
-void free_text_controllers(Text *txt)
-{
- Object *ob;
- bController *cont;
-
- ob= G.main->object.first;
- while(ob) {
- cont= ob->controllers.first;
- while(cont) {
- if(cont->type==CONT_PYTHON) {
- bPythonCont *pc;
-
- pc= cont->data;
- if(pc->text==txt) pc->text= NULL;
- }
- cont= cont->next;
- }
- ob= ob->id.next;
- }
-}
-
-
/* ******************* SENSORS ************************ */
void free_sensor(bSensor *sens)
@@ -150,6 +128,9 @@ void init_sensor(bSensor *sens)
case SENS_PROPERTY:
sens->data= MEM_callocN(sizeof(bPropertySensor), "propsens");
break;
+ case SENS_ARMATURE:
+ sens->data= MEM_callocN(sizeof(bArmatureSensor), "armsens");
+ break;
case SENS_ACTUATOR:
sens->data= MEM_callocN(sizeof(bActuatorSensor), "actsens");
break;
@@ -410,22 +391,25 @@ void init_actuator(bActuator *act)
{
/* also use when actuator changes type */
bObjectActuator *oa;
+ bSoundActuator *sa;
if(act->data) MEM_freeN(act->data);
act->data= 0;
switch(act->type) {
-#ifdef __NLA
case ACT_ACTION:
case ACT_SHAPEACTION:
act->data= MEM_callocN(sizeof(bActionActuator), "actionact");
break;
-#endif
case ACT_SOUND:
- act->data= MEM_callocN(sizeof(bSoundActuator), "soundact");
- break;
- case ACT_CD:
- act->data= MEM_callocN(sizeof(bCDActuator), "cdact");
+ sa = act->data= MEM_callocN(sizeof(bSoundActuator), "soundact");
+ sa->volume = 1.0f;
+ sa->sound3D.rolloff_factor = 1.0f;
+ sa->sound3D.reference_distance = 1.0f;
+ sa->sound3D.max_gain = 1.0f;
+ sa->sound3D.cone_inner_angle = 360.0f;
+ sa->sound3D.cone_outer_angle = 360.0f;
+ sa->sound3D.max_distance = FLT_MAX;
break;
case ACT_OBJECT:
act->data= MEM_callocN(sizeof(bObjectActuator), "objectact");
@@ -474,6 +458,9 @@ void init_actuator(bActuator *act)
case ACT_STATE:
act->data = MEM_callocN(sizeof( bStateActuator ), "state act");
break;
+ case ACT_ARMATURE:
+ act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act");
+ break;
default:
; /* this is very severe... I cannot make any memory for this */
/* logic brick... */
@@ -615,6 +602,8 @@ void sca_remove_ob_poin(Object *obt, Object *ob)
bEditObjectActuator *eoa;
bPropertyActuator *pa;
bMessageActuator *ma;
+ bParentActuator *para;
+ bArmatureActuator *aa;
sens= obt->sensors.first;
while(sens) {
@@ -653,7 +642,15 @@ void sca_remove_ob_poin(Object *obt, Object *ob)
ma= act->data;
if(ma->toObject==ob) ma->toObject= NULL;
break;
-
+ case ACT_PARENT:
+ para = act->data;
+ if (para->ob==ob) para->ob = NULL;
+ break;
+ case ACT_ARMATURE:
+ aa = act->data;
+ if (aa->target == ob) aa->target = NULL;
+ if (aa->subtarget == ob) aa->subtarget = NULL;
+ break;
}
act= act->next;
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 23da5c66850..4de9ff3b6d9 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -54,7 +54,7 @@
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_scriptlink_types.h"
+#include "DNA_screen_types.h"
#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
@@ -76,8 +76,8 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_scene.h"
-#include "BKE_sculpt.h"
#include "BKE_sequence.h"
#include "BKE_world.h"
#include "BKE_utildefines.h"
@@ -126,7 +126,113 @@ void free_qtcodecdata(QuicktimeCodecData *qcd)
}
}
-/* copy_scene moved to src/header_info.c... should be back */
+Scene *copy_scene(Main *bmain, Scene *sce, int type)
+{
+ Scene *scen;
+ ToolSettings *ts;
+ Base *base, *obase;
+
+ if(type == SCE_COPY_EMPTY) {
+ ListBase lb;
+ scen= add_scene(sce->id.name+2);
+
+ lb= scen->r.layers;
+ scen->r= sce->r;
+ scen->r.layers= lb;
+ }
+ else {
+ scen= copy_libblock(sce);
+ BLI_duplicatelist(&(scen->base), &(sce->base));
+
+ clear_id_newpoins();
+
+ 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;
+ scen->theDag= NULL;
+ scen->obedit= NULL;
+ scen->toolsettings= MEM_dupallocN(sce->toolsettings);
+ scen->stats= NULL;
+
+ ts= scen->toolsettings;
+ if(ts) {
+ if(ts->vpaint) {
+ ts->vpaint= MEM_dupallocN(ts->vpaint);
+ ts->vpaint->paintcursor= NULL;
+ ts->vpaint->vpaint_prev= NULL;
+ ts->vpaint->wpaint_prev= NULL;
+ copy_paint(&ts->vpaint->paint, &ts->vpaint->paint);
+ }
+ if(ts->wpaint) {
+ ts->wpaint= MEM_dupallocN(ts->wpaint);
+ ts->wpaint->paintcursor= NULL;
+ ts->wpaint->vpaint_prev= NULL;
+ ts->wpaint->wpaint_prev= NULL;
+ copy_paint(&ts->wpaint->paint, &ts->wpaint->paint);
+ }
+ if(ts->sculpt) {
+ ts->sculpt= MEM_dupallocN(ts->sculpt);
+ copy_paint(&ts->sculpt->paint, &ts->sculpt->paint);
+ }
+
+ copy_paint(&ts->imapaint.paint, &ts->imapaint.paint);
+ ts->imapaint.paintcursor= NULL;
+
+ ts->particle.paintcursor= NULL;
+ }
+
+ BLI_duplicatelist(&(scen->markers), &(sce->markers));
+ BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
+ BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
+ BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
+
+ scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+
+ obase= sce->base.first;
+ base= scen->base.first;
+ while(base) {
+ id_us_plus(&base->object->id);
+ if(obase==sce->basact) scen->basact= base;
+
+ obase= obase->next;
+ base= base->next;
+ }
+ }
+
+ /* make a private copy of the avicodecdata */
+ if(sce->r.avicodecdata) {
+ scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
+ scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
+ scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
+ }
+
+ /* make a private copy of the qtcodecdata */
+ if(sce->r.qtcodecdata) {
+ scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
+ scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
+ }
+
+ /* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations
+ * are done outside of blenkernel with ED_objects_single_users! */
+
+ /* camera */
+ if(type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) {
+ ID_NEW(scen->camera);
+ }
+
+ /* world */
+ if(type == SCE_COPY_FULL) {
+ if(scen->world) {
+ id_us_plus((ID *)scen->world);
+ scen->world= copy_world(scen->world);
+ }
+ }
+
+ return scen;
+}
/* do not free scene itself */
void free_scene(Scene *sce)
@@ -139,13 +245,14 @@ void free_scene(Scene *sce)
base= base->next;
}
/* do not free objects! */
+
+ if(sce->gpd) {
+ sce->gpd->id.us--;
+ sce->gpd= NULL;
+ }
BLI_freelistN(&sce->base);
- seq_free_editing(sce->ed);
-
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&sce->scriptlink);
-#endif
+ seq_free_editing(sce);
BKE_free_animdata((ID *)sce);
BKE_keyingsets_free(&sce->keyingsets);
@@ -171,15 +278,20 @@ void free_scene(Scene *sce)
BLI_freelistN(&sce->r.layers);
if(sce->toolsettings) {
- if(sce->toolsettings->vpaint)
+ if(sce->toolsettings->vpaint) {
+ free_paint(&sce->toolsettings->vpaint->paint);
MEM_freeN(sce->toolsettings->vpaint);
- if(sce->toolsettings->wpaint)
+ }
+ if(sce->toolsettings->wpaint) {
+ free_paint(&sce->toolsettings->wpaint->paint);
MEM_freeN(sce->toolsettings->wpaint);
+ }
if(sce->toolsettings->sculpt) {
- sculptsession_free(sce->toolsettings->sculpt);
+ free_paint(&sce->toolsettings->sculpt->paint);
MEM_freeN(sce->toolsettings->sculpt);
}
-
+ free_paint(&sce->toolsettings->imapaint.paint);
+
MEM_freeN(sce->toolsettings);
sce->toolsettings = NULL;
}
@@ -193,6 +305,9 @@ void free_scene(Scene *sce)
ntreeFreeTree(sce->nodetree);
MEM_freeN(sce->nodetree);
}
+
+ if(sce->stats)
+ MEM_freeN(sce->stats);
}
Scene *add_scene(char *name)
@@ -204,17 +319,17 @@ Scene *add_scene(char *name)
sce= alloc_libblock(&G.main->scene, ID_SCE, name);
sce->lay= 1;
- sce->r.mode= R_GAMMA;
+ sce->r.mode= R_GAMMA|R_OSA|R_SHADOW|R_SSS|R_ENVMAP|R_RAYTRACE;
sce->r.cfra= 1;
sce->r.sfra= 1;
sce->r.efra= 250;
- sce->r.xsch= 320;
- sce->r.ysch= 256;
+ sce->r.xsch= 1920;
+ sce->r.ysch= 1080;
sce->r.xasp= 1;
sce->r.yasp= 1;
- sce->r.xparts= 4;
- sce->r.yparts= 4;
- sce->r.size= 100;
+ sce->r.xparts= 8;
+ sce->r.yparts= 8;
+ sce->r.size= 25;
sce->r.planes= 24;
sce->r.quality= 90;
sce->r.framapto= 100;
@@ -223,26 +338,18 @@ Scene *add_scene(char *name)
sce->r.frs_sec= 25;
sce->r.frs_sec_base= 1;
sce->r.ocres = 128;
+ sce->r.color_mgt_flag |= R_COLOR_MANAGEMENT;
sce->r.bake_mode= 1; /* prevent to include render stuff here */
- sce->r.bake_filter= 2;
+ sce->r.bake_filter= 8;
sce->r.bake_osa= 5;
sce->r.bake_flag= R_BAKE_CLEAR;
sce->r.bake_normal_space= R_BAKE_SPACE_TANGENT;
-
- sce->r.xplay= 640;
- sce->r.yplay= 480;
- sce->r.freqplay= 60;
- sce->r.depth= 32;
+
+ 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;
sce->r.threads= 1;
-
- sce->r.stereomode = 1; // no stereo
- sce->r.domeangle = 180;
- sce->r.domemode = 1;
- sce->r.domeres = 4;
- sce->r.domeresbuf = 1.0f;
- sce->r.dometilt = 0;
sce->r.simplify_subsurf= 6;
sce->r.simplify_particles= 1.0f;
@@ -293,12 +400,17 @@ Scene *add_scene(char *name)
sce->toolsettings->proportional_size = 1.0f;
+
+ sce->unit.scale_length = 1.0f;
+
pset= &sce->toolsettings->particle;
- pset->flag= PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER;
+ pset->flag= PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER|PE_AUTO_VELOCITY;
pset->emitterdist= 0.25f;
pset->totrekey= 5;
pset->totaddkey= 5;
pset->brushtype= PE_BRUSH_NONE;
+ pset->draw_step= 2;
+ pset->fade_frames= 2;
for(a=0; a<PE_TOT_BRUSH; a++) {
pset->brush[a].strength= 50;
pset->brush[a].size= 50;
@@ -307,7 +419,11 @@ Scene *add_scene(char *name)
pset->brush[PE_BRUSH_CUT].strength= 100;
sce->jumpframe = 10;
- sce->audio.mixrate = 44100;
+ sce->r.ffcodecdata.audio_mixrate = 44100;
+
+ sce->audio.distance_model = 2.0;
+ sce->audio.doppler_factor = 1.0;
+ sce->audio.speed_of_sound = 343.3;
strcpy(sce->r.backbuf, "//backbuf");
strcpy(sce->r.pic, U.renderdir);
@@ -318,6 +434,32 @@ Scene *add_scene(char *name)
/* note; in header_info.c the scene copy happens..., if you add more to renderdata it has to be checked there */
scene_add_render_layer(sce);
+ /* game data */
+ sce->gm.stereoflag = STEREO_NOSTEREO;
+ sce->gm.stereomode = STEREO_ANAGLYPH;
+ sce->gm.dome.angle = 180;
+ sce->gm.dome.mode = DOME_FISHEYE;
+ sce->gm.dome.res = 4;
+ sce->gm.dome.resbuf = 1.0f;
+ sce->gm.dome.tilt = 0;
+
+ sce->gm.xplay= 800;
+ sce->gm.yplay= 600;
+ sce->gm.freqplay= 60;
+ sce->gm.depth= 32;
+
+ sce->gm.gravity= 9.8f;
+ sce->gm.physicsEngine= WOPHY_BULLET;
+ sce->gm.mode = 32; //XXX ugly harcoding, still not sure we should drop mode. 32 == 1 << 5 == use_occlusion_culling
+ sce->gm.occlusionRes = 128;
+ sce->gm.ticrate = 60;
+ sce->gm.maxlogicstep = 5;
+ sce->gm.physubstep = 1;
+ sce->gm.maxphystep = 5;
+
+ sce->gm.flag = GAME_DISPLAY_LISTS;
+ sce->gm.matmode = GAME_MAT_MULTITEX;
+
return sce;
}
@@ -377,15 +519,12 @@ void set_scene_bg(Scene *scene)
base->flag |= flag;
/* not too nice... for recovering objects with lost data */
- if(ob->pose==NULL) base->flag &= ~OB_POSEMODE;
+ //if(ob->pose==NULL) base->flag &= ~OB_POSEMODE;
ob->flag= base->flag;
ob->ctime= -1234567.0; /* force ipo to be calculated later */
}
/* no full animation update, this to enable render code to work (render code calls own animation updates) */
-
- /* do we need FRAMECHANGED in set_scene? */
-// if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0);
}
/* called from creator.c */
@@ -403,6 +542,30 @@ void set_scene_name(char *name)
//XXX error("Can't find scene: %s", name);
}
+void unlink_scene(Main *bmain, Scene *sce, Scene *newsce)
+{
+ Scene *sce1;
+ bScreen *sc;
+
+ /* check all sets */
+ for(sce1= bmain->scene.first; sce1; sce1= sce1->id.next)
+ if(sce1->set == sce)
+ sce1->set= NULL;
+
+ /* check all sequences */
+ clear_scene_in_allseqs(sce);
+
+ /* check render layer nodes in other scenes */
+ clear_scene_in_nodes(bmain, sce);
+
+ /* al screens */
+ for(sc= bmain->screen.first; sc; sc= sc->id.next)
+ if(sc->scene == sce)
+ sc->scene= newsce;
+
+ free_libblock(&bmain->scene, sce);
+}
+
/* used by metaballs
* doesnt return the original duplicated object, only dupli's
*/
@@ -644,9 +807,6 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
/* clear animation overrides */
// XXX TODO...
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0);
-#endif
/* sets first, we allow per definition current scene to have dependencies on sets */
for(sce= sce->set; sce; sce= sce->set)
scene_update(sce, lay);
@@ -670,26 +830,6 @@ void scene_add_render_layer(Scene *sce)
srl->passflag= SCE_PASS_COMBINED|SCE_PASS_Z;
}
-void sculptsession_free(Sculpt *sculpt)
-{
- SculptSession *ss= sculpt->session;
- if(ss) {
- if(ss->projverts)
- MEM_freeN(ss->projverts);
-
- if(ss->fmap)
- MEM_freeN(ss->fmap);
-
- if(ss->fmap_mem)
- MEM_freeN(ss->fmap_mem);
-
- if(ss->texcache)
- MEM_freeN(ss->texcache);
- MEM_freeN(ss);
- sculpt->session= NULL;
- }
-}
-
/* render simplification */
int get_render_subsurf_level(RenderData *r, int lvl)
@@ -724,14 +864,3 @@ float get_render_aosss_error(RenderData *r, float error)
return error;
}
-void free_dome_warp_text(struct Text *txt)
-{
- Scene *scene;
-
- scene = G.main->scene.first;
- while(scene) {
- if (scene->r.dometext == txt)
- scene->r.dometext = NULL;
- scene = scene->id.next;
- }
-}
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index e25e4be90c8..661d0da1550 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -33,8 +33,10 @@
#include "MEM_guardedalloc.h"
+#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_view3d_types.h"
#include "BLI_blenlib.h"
@@ -61,16 +63,16 @@ static void spacetype_free(SpaceType *st)
BLI_freelistN(&art->drawcalls);
for(pt= art->paneltypes.first; pt; pt= pt->next)
- if(pt->py_free)
- pt->py_free(pt->py_data);
+ if(pt->ext.free)
+ pt->ext.free(pt->ext.data);
for(ht= art->headertypes.first; ht; ht= ht->next)
- if(ht->py_free)
- ht->py_free(ht->py_data);
+ if(ht->ext.free)
+ ht->ext.free(ht->ext.data);
for(mt= art->menutypes.first; mt; mt= mt->next)
- if(mt->py_free)
- mt->py_free(mt->py_data);
+ if(mt->ext.free)
+ mt->ext.free(mt->ext.data);
BLI_freelistN(&art->paneltypes);
BLI_freelistN(&art->headertypes);
@@ -78,6 +80,8 @@ static void spacetype_free(SpaceType *st)
}
BLI_freelistN(&st->regiontypes);
+ BLI_freelistN(&st->toolshelf);
+
}
void BKE_spacetypes_free(void)
@@ -110,7 +114,7 @@ ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
if(art->regionid==regionid)
return art;
- printf("Error, region type missing in %s\n", st->name);
+ printf("Error, region type missing in - name:\"%s\", id:%d\n", st->name, st->spaceid);
return st->regiontypes.first;
}
@@ -177,6 +181,9 @@ ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar)
else
newar->regiondata= MEM_dupallocN(ar->regiondata);
}
+
+ if(ar->v2d.tab_offset)
+ newar->v2d.tab_offset= MEM_dupallocN(ar->v2d.tab_offset);
newar->panels.first= newar->panels.last= NULL;
BLI_duplicatelist(&newar->panels, &ar->panels);
@@ -269,10 +276,14 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
}
else if(ar->type && ar->type->free)
ar->type->free(ar);
+
+ if(ar->v2d.tab_offset) {
+ MEM_freeN(ar->v2d.tab_offset);
+ ar->v2d.tab_offset= NULL;
+ }
- if(ar) {
+ if(ar)
BLI_freelistN(&ar->panels);
- }
}
/* not area itself */
@@ -289,10 +300,6 @@ void BKE_screen_area_free(ScrArea *sa)
BKE_spacedata_freelist(&sa->spacedata);
BLI_freelistN(&sa->actionzones);
-
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&sa->scriptlink);
-#endif
}
/* don't free screen itself */
@@ -316,4 +323,23 @@ void free_screen(bScreen *sc)
BLI_freelistN(&sc->areabase);
}
+/* for depsgraph */
+unsigned int BKE_screen_visible_layers(bScreen *screen)
+{
+ ScrArea *sa;
+ unsigned int layer= 0;
+
+ if(!screen)
+ return layer;
+
+ /* get all used view3d layers */
+ for(sa= screen->areabase.first; sa; sa= sa->next)
+ if(sa->spacetype==SPACE_VIEW3D)
+ layer |= ((View3D *)sa->spacedata.first)->lay;
+
+ if(!layer)
+ return screen->scene->lay;
+
+ return layer;
+}
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 2ee95ed928e..078258092f7 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -2792,6 +2792,10 @@ void sequence_effect_speed_rebuild_map(Sequence * seq, int force)
if (!(force || seq->len != v->length || !v->frameMap)) {
return;
}
+ if (!seq->seq1) { /* make coverity happy and check for (CID 598)
+ input strip ... */
+ return;
+ }
if (!v->frameMap || v->length != seq->len) {
if (v->frameMap) MEM_freeN(v->frameMap);
@@ -2807,7 +2811,7 @@ void sequence_effect_speed_rebuild_map(Sequence * seq, int force)
/* if there is no IPO, try to make retiming easy by stretching the
strip */
// XXX old animation system - seq
- if (/*!seq->ipo &&*/ seq->seq1 && seq->seq1->enddisp != seq->seq1->start
+ if (/*!seq->ipo &&*/ seq->seq1->enddisp != seq->seq1->start
&& seq->seq1->len != 0) {
fallback_fac = (float) seq->seq1->len /
(float) (seq->seq1->enddisp - seq->seq1->start);
diff --git a/source/blender/blenkernel/intern/sequence.c b/source/blender/blenkernel/intern/sequence.c
index 7fc262b4796..7f3e2789232 100644
--- a/source/blender/blenkernel/intern/sequence.c
+++ b/source/blender/blenkernel/intern/sequence.c
@@ -32,6 +32,7 @@
#include <math.h>
#include "MEM_guardedalloc.h"
+#include "MEM_CacheLimiterC-Api.h"
#include "DNA_listBase.h"
#include "DNA_sequence_types.h"
@@ -51,6 +52,10 @@
#include "BLI_threads.h"
#include <pthread.h>
+#include "BKE_context.h"
+#include "BKE_sound.h"
+#include "AUD_C-API.h"
+
#ifdef WIN32
#define snprintf _snprintf
#endif
@@ -58,7 +63,7 @@
/* **** XXX ******** */
static int seqrectx= 0; /* bad bad global! */
static int seqrecty= 0;
-static void waitcursor() {}
+static void waitcursor(int val) {}
static int blender_test_break() {return 0;}
/* **** XXX ******** */
@@ -177,18 +182,22 @@ void seq_free_strip(Strip *strip)
MEM_freeN(strip);
}
-void seq_free_sequence(Editing *ed, Sequence *seq)
+void seq_free_sequence(Scene *scene, Sequence *seq)
{
+ Editing *ed = scene->ed;
+
if(seq->strip) seq_free_strip(seq->strip);
if(seq->anim) IMB_free_anim(seq->anim);
- //XXX if(seq->hdaudio) sound_close_hdaudio(seq->hdaudio);
- /* XXX if (seq->type & SEQ_EFFECT) {
+ if(seq->sound_handle)
+ sound_delete_handle(scene, seq->sound_handle);
+
+ if (seq->type & SEQ_EFFECT) {
struct SeqEffectHandle sh = get_sequence_effect(seq);
sh.free(seq);
- }*/
+ }
if (ed->act_seq==seq)
ed->act_seq= NULL;
@@ -207,8 +216,9 @@ Editing *seq_give_editing(Scene *scene, int alloc)
return scene->ed;
}
-void seq_free_editing(Editing *ed)
+void seq_free_editing(Scene *scene)
{
+ Editing *ed = scene->ed;
MetaStack *ms;
Sequence *seq;
@@ -216,7 +226,7 @@ void seq_free_editing(Editing *ed)
return;
SEQ_BEGIN(ed, seq) {
- seq_free_sequence(ed, seq);
+ seq_free_sequence(scene, seq);
}
SEQ_END
@@ -443,6 +453,8 @@ void calc_sequence_disp(Sequence *seq)
else if(seq->enddisp-seq->startdisp > 250) {
seq->handsize= (float)((seq->enddisp-seq->startdisp)/25);
}
+
+ seq_update_sound(seq);
}
void calc_sequence(Sequence *seq)
@@ -514,8 +526,8 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq)
char str[FILE_MAXDIR+FILE_MAXFILE];
if (!(seq->type == SEQ_MOVIE || seq->type == SEQ_IMAGE ||
- seq->type == SEQ_HD_SOUND || seq->type == SEQ_RAM_SOUND ||
- seq->type == SEQ_SCENE || seq->type == SEQ_META)) {
+ seq->type == SEQ_SOUND ||
+ seq->type == SEQ_SCENE || seq->type == SEQ_META)) {
return;
}
@@ -557,23 +569,8 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq)
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_HD_SOUND) {
-// XXX if(seq->hdaudio) sound_close_hdaudio(seq->hdaudio);
-// seq->hdaudio = sound_open_hdaudio(str);
-
- if (!seq->hdaudio) {
- return;
- }
-
-// XXX seq->len = sound_hdaudio_get_duration(seq->hdaudio, FPS) - seq->anim_startofs - seq->anim_endofs;
- if (seq->len < 0) {
- seq->len = 0;
- }
- seq->strip->len = seq->len;
- } else if (seq->type == SEQ_RAM_SOUND) {
- seq->len = (int) ( ((float)(seq->sound->streamlen-1)/
- ((float)scene->audio.mixrate*4.0 ))
- * FPS);
+ } else if (seq->type == SEQ_SOUND) {
+ seq->len = AUD_getInfo(seq->sound->handle).length * FPS;
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
if (seq->len < 0) {
@@ -685,15 +682,14 @@ void clear_scene_in_allseqs(Scene *sce)
}
}
-char *give_seqname_by_type(int type)
+static char *give_seqname_by_type(int type)
{
switch(type) {
case SEQ_META: return "Meta";
case SEQ_IMAGE: return "Image";
case SEQ_SCENE: return "Scene";
case SEQ_MOVIE: return "Movie";
- case SEQ_RAM_SOUND: return "Audio (RAM)";
- case SEQ_HD_SOUND: return "Audio (HD)";
+ case SEQ_SOUND: return "Audio";
case SEQ_CROSS: return "Cross";
case SEQ_GAMCROSS: return "Gamma Cross";
case SEQ_ADD: return "Add";
@@ -953,7 +949,7 @@ static TStripElem* alloc_tstripdata(int len, const char * name)
return se;
}
-TStripElem *give_tstripelem(Sequence *seq, int cfra)
+static TStripElem *give_tstripelem(Sequence *seq, int cfra)
{
TStripElem *se;
int nr;
@@ -1070,10 +1066,9 @@ 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_RAM_SOUND
- && seq->type != SEQ_HD_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)
@@ -1302,7 +1297,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
se->ibuf = 0;
}
-void seq_proxy_rebuild(Scene *scene, Sequence * seq)
+static void seq_proxy_rebuild(Scene *scene, Sequence * seq)
{
int cfra;
float rsize = seq->strip->proxy->size;
@@ -2017,7 +2012,8 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
RenderResult rres;
int doseq, rendering= G.rendering;
char scenename[64];
- int sce_valid =sce&& (sce->camera || sce->r.scemode & R_DOSEQ);
+ int have_seq= (sce->r.scemode & R_DOSEQ) && sce->ed && sce->ed->seqbase.first;
+ int sce_valid =sce && (sce->camera || have_seq);
if (se->ibuf == NULL && sce_valid && !build_proxy_run) {
se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
@@ -2038,7 +2034,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
} else if (se->ibuf==NULL && sce_valid) {
/* no need to display a waitcursor on sequencer
scene strips */
- if (!(sce->r.scemode & R_DOSEQ))
+ if (!have_seq)
waitcursor(1);
/* Hack! This function can be called from do_render_seq(), in that case
@@ -2093,7 +2089,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
// XXX
#if 0
if((G.f & G_PLAYANIM)==0 /* bad, is set on do_render_seq */
- && !(sce->r.scemode & R_DOSEQ)
+ && !have_seq
&& !build_proxy_run)
#endif
@@ -2627,7 +2623,7 @@ ImBuf *give_ibuf_seq(Scene *scene, int rectx, int recty, int cfra, int chanshown
}
/* check used when we need to change seq->blend_mode but not to effect or audio strips */
-int seq_can_blend(Sequence *seq)
+static int seq_can_blend(Sequence *seq)
{
if (ELEM4(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE)) {
return 1;
@@ -2753,7 +2749,7 @@ static void *seq_prefetch_thread(void * This_)
return 0;
}
-void seq_start_threads(Scene *scene)
+static void seq_start_threads(Scene *scene)
{
int i;
@@ -2786,7 +2782,7 @@ void seq_start_threads(Scene *scene)
BLI_init_threads(0, 0, 0);
}
-void seq_stop_threads()
+static void seq_stop_threads()
{
PrefetchThread *tslot;
PrefetchQueueElem *e;
@@ -2854,7 +2850,7 @@ void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
pthread_mutex_unlock(&wakeup_lock);
}
-void seq_wait_for_prefetch_ready()
+static void seq_wait_for_prefetch_ready()
{
PrefetchThread *tslot;
@@ -2988,7 +2984,7 @@ static void free_anim_seq(Sequence *seq)
}
}
-void free_imbuf_seq_except(Scene *scene, int cfra)
+static void free_imbuf_seq_except(Scene *scene, int cfra)
{
Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq;
@@ -3038,11 +3034,36 @@ void free_imbuf_seq_except(Scene *scene, int cfra)
SEQ_END
}
-void free_imbuf_seq(ListBase * seqbase)
+void free_imbuf_seq(ListBase * seqbase, int check_mem_usage)
{
Sequence *seq;
TStripElem *se;
int a;
+
+ if (check_mem_usage) {
+ /* Let the cache limitor take care of this (schlaile) */
+ /* While render let's keep all memory available for render
+ (ton)
+ At least if free memory is tight...
+ This can make a big difference in encoding speed
+ (it is around 4 times(!) faster, if we do not waste time
+ on freeing _all_ buffers every time on long timelines...)
+ (schlaile)
+ */
+
+ uintptr_t mem_in_use;
+ uintptr_t mmap_in_use;
+ uintptr_t max;
+
+ mem_in_use= MEM_get_memory_in_use();
+ mmap_in_use= MEM_get_mapped_memory_in_use();
+ max = MEM_CacheLimiter_get_maximum();
+
+ if (max == 0 || mem_in_use + mmap_in_use <= max) {
+ return;
+ }
+ }
+
for(seq= seqbase->first; seq; seq= seq->next) {
if(seq->strip) {
@@ -3075,7 +3096,11 @@ void free_imbuf_seq(ListBase * seqbase)
}
}
if(seq->type==SEQ_META) {
- free_imbuf_seq(&seq->seqbase);
+ free_imbuf_seq(&seq->seqbase, FALSE);
+ }
+ if(seq->type==SEQ_SCENE) {
+ /* FIXME: recurs downwards,
+ but do recurs protection somehow! */
}
}
@@ -3153,7 +3178,7 @@ void free_imbuf_seq()
}
#endif
-void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo)
+static void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo)
{
/* force update of all sequences with this ipo, on ipo changes */
Editing *ed= seq_give_editing(scene, FALSE);
@@ -3173,88 +3198,6 @@ void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo)
SEQ_END
}
-#if 0
-/* bad levell call... */
-void do_render_seq(RenderResult *rr, int cfra)
-{
- static int recurs_depth = 0
- ImBuf *ibuf;
-
- recurs_depth++;
-
- ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0, 100.0);
-
- recurs_depth--;
-
- if(ibuf) {
- if(ibuf->rect_float) {
- if (!rr->rectf)
- rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf");
-
- memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
-
- /* TSK! Since sequence render doesn't free the *rr render result, the old rect32
- can hang around when sequence render has rendered a 32 bits one before */
- if(rr->rect32) {
- MEM_freeN(rr->rect32);
- rr->rect32= NULL;
- }
- }
- else if(ibuf->rect) {
- if (!rr->rect32)
- rr->rect32= MEM_mallocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect");
-
- memcpy(rr->rect32, ibuf->rect, 4*rr->rectx*rr->recty);
-
- /* if (ibuf->zbuf) { */
- /* if (R.rectz) freeN(R.rectz); */
- /* R.rectz = BLI_dupallocN(ibuf->zbuf); */
- /* } */
- }
-
- /* Let the cache limitor take care of this (schlaile) */
- /* While render let's keep all memory available for render
- (ton)
- At least if free memory is tight...
- This can make a big difference in encoding speed
- (it is around 4 times(!) faster, if we do not waste time
- on freeing _all_ buffers every time on long timelines...)
- (schlaile)
- */
- if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
- uintptr_t mem_in_use;
- uintptr_t mmap_in_use;
- uintptr_t max;
-
- mem_in_use= MEM_get_memory_in_use();
- mmap_in_use= MEM_get_mapped_memory_in_use();
- max = MEM_CacheLimiter_get_maximum();
-
- if (max != 0 && mem_in_use + mmap_in_use > max) {
- fprintf(stderr, "Memory in use > maximum memory\n");
- fprintf(stderr, "Cleaning up, please wait...\n"
- "If this happens very often,\n"
- "consider "
- "raising the memcache limit in the "
- "user preferences.\n");
- free_imbuf_seq();
- }
- free_proxy_seq(seq);
- }
- }
- else {
- /* render result is delivered empty in most cases, nevertheless we handle all cases */
- if (rr->rectf)
- memset(rr->rectf, 0, 4*sizeof(float)*rr->rectx*rr->recty);
- else if (rr->rect32)
- memset(rr->rect32, 0, 4*rr->rectx*rr->recty);
- else
- rr->rect32= MEM_callocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect");
- }
-}
-
-#endif
-
/* seq funcs's for transforming internally
notice the difference between start/end and left/right.
@@ -3360,7 +3303,7 @@ void seq_tx_handle_xlimits(Sequence *seq, int leftflag, int rightflag)
}
/* sounds cannot be extended past their endpoints */
- if (seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) {
+ if (seq->type == SEQ_SOUND) {
seq->startstill= 0;
seq->endstill= 0;
}
@@ -3457,3 +3400,15 @@ int shuffle_seq(ListBase * seqbasep, Sequence *test)
return 1;
}
}
+
+void seq_update_sound(struct Sequence *seq)
+{
+ if(seq->type == SEQ_SOUND)
+ {
+ seq->sound_handle->startframe = seq->startdisp;
+ seq->sound_handle->endframe = seq->enddisp;
+ seq->sound_handle->frameskip = seq->startofs + seq->anim_startofs;
+ seq->sound_handle->mute = seq->flag & SEQ_MUTE ? 1 : 0;
+ seq->sound_handle->changed = -1;
+ }
+}
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 27357d92aae..efb7db04029 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -574,7 +574,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
}
}
- //Just to make sure we are not letting any memory behind
+ //Just to make sure we are not leaving any memory behind
assert(ssmd.emCache == NULL);
assert(ssmd.mCache == NULL);
}
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
new file mode 100644
index 00000000000..8deae7e8e10
--- /dev/null
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -0,0 +1,600 @@
+/**
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_sketch.h"
+#include "BKE_utildefines.h"
+
+#include "DNA_userdef_types.h"
+
+void freeSketch(SK_Sketch *sketch)
+{
+ SK_Stroke *stk, *next;
+
+ for (stk = sketch->strokes.first; stk; stk = next)
+ {
+ next = stk->next;
+
+ sk_freeStroke(stk);
+ }
+
+ BLI_freelistN(&sketch->depth_peels);
+
+ MEM_freeN(sketch);
+}
+
+SK_Sketch* createSketch()
+{
+ SK_Sketch *sketch;
+
+ sketch = MEM_callocN(sizeof(SK_Sketch), "SK_Sketch");
+
+ sketch->active_stroke = NULL;
+ sketch->gesture = NULL;
+
+ sketch->strokes.first = NULL;
+ sketch->strokes.last = NULL;
+
+ return sketch;
+}
+
+void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no)
+{
+ if (no)
+ {
+ VECCOPY(pt->no, no);
+ Normalize(pt->no);
+ }
+ else
+ {
+ pt->no[0] = 0;
+ pt->no[1] = 0;
+ pt->no[2] = 1;
+ }
+ pt->p2d[0] = dd->mval[0];
+ pt->p2d[1] = dd->mval[1];
+ /* more init code here */
+}
+
+void sk_copyPoint(SK_Point *dst, SK_Point *src)
+{
+ memcpy(dst, src, sizeof(SK_Point));
+}
+
+void sk_allocStrokeBuffer(SK_Stroke *stk)
+{
+ stk->points = MEM_callocN(sizeof(SK_Point) * stk->buf_size, "SK_Point buffer");
+}
+
+void sk_freeStroke(SK_Stroke *stk)
+{
+ MEM_freeN(stk->points);
+ MEM_freeN(stk);
+}
+
+SK_Stroke* sk_createStroke()
+{
+ SK_Stroke *stk;
+
+ stk = MEM_callocN(sizeof(SK_Stroke), "SK_Stroke");
+
+ stk->selected = 0;
+ stk->nb_points = 0;
+ stk->buf_size = SK_Stroke_BUFFER_INIT_SIZE;
+
+ sk_allocStrokeBuffer(stk);
+
+ return stk;
+}
+
+void sk_shrinkStrokeBuffer(SK_Stroke *stk)
+{
+ if (stk->nb_points < stk->buf_size)
+ {
+ SK_Point *old_points = stk->points;
+
+ stk->buf_size = stk->nb_points;
+
+ sk_allocStrokeBuffer(stk);
+
+ memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
+
+ MEM_freeN(old_points);
+ }
+}
+
+void sk_growStrokeBuffer(SK_Stroke *stk)
+{
+ if (stk->nb_points == stk->buf_size)
+ {
+ SK_Point *old_points = stk->points;
+
+ stk->buf_size *= 2;
+
+ sk_allocStrokeBuffer(stk);
+
+ memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
+
+ MEM_freeN(old_points);
+ }
+}
+
+void sk_growStrokeBufferN(SK_Stroke *stk, int n)
+{
+ if (stk->nb_points + n > stk->buf_size)
+ {
+ SK_Point *old_points = stk->points;
+
+ while (stk->nb_points + n > stk->buf_size)
+ {
+ stk->buf_size *= 2;
+ }
+
+ sk_allocStrokeBuffer(stk);
+
+ memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
+
+ MEM_freeN(old_points);
+ }
+}
+
+
+void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n)
+{
+ memcpy(stk->points + n, pt, sizeof(SK_Point));
+}
+
+void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n)
+{
+ int size = stk->nb_points - n;
+
+ sk_growStrokeBuffer(stk);
+
+ memmove(stk->points + n + 1, stk->points + n, size * sizeof(SK_Point));
+
+ memcpy(stk->points + n, pt, sizeof(SK_Point));
+
+ stk->nb_points++;
+}
+
+void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt)
+{
+ sk_growStrokeBuffer(stk);
+
+ memcpy(stk->points + stk->nb_points, pt, sizeof(SK_Point));
+
+ stk->nb_points++;
+}
+
+void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end)
+{
+ int size = end - start + 1;
+
+ sk_growStrokeBufferN(stk, len - size);
+
+ if (len != size)
+ {
+ int tail_size = stk->nb_points - end + 1;
+
+ memmove(stk->points + start + len, stk->points + end + 1, tail_size * sizeof(SK_Point));
+ }
+
+ memcpy(stk->points + start, pts, len * sizeof(SK_Point));
+
+ stk->nb_points += len - size;
+}
+
+void sk_trimStroke(SK_Stroke *stk, int start, int end)
+{
+ int size = end - start + 1;
+
+ if (start > 0)
+ {
+ memmove(stk->points, stk->points + start, size * sizeof(SK_Point));
+ }
+
+ stk->nb_points = size;
+}
+
+void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3])
+{
+ SK_Point pt1, pt2;
+ SK_Point *prev, *next;
+ float delta_p[3];
+ int i, total;
+
+ total = end - start;
+
+ VecSubf(delta_p, p_end, p_start);
+
+ prev = stk->points + start;
+ next = stk->points + end;
+
+ VECCOPY(pt1.p, p_start);
+ VECCOPY(pt1.no, prev->no);
+ pt1.mode = prev->mode;
+ pt1.type = prev->type;
+
+ VECCOPY(pt2.p, p_end);
+ VECCOPY(pt2.no, next->no);
+ pt2.mode = next->mode;
+ pt2.type = next->type;
+
+ sk_insertStrokePoint(stk, &pt1, start + 1); /* insert after start */
+ sk_insertStrokePoint(stk, &pt2, end + 1); /* insert before end (since end was pushed back already) */
+
+ for (i = 1; i < total; i++)
+ {
+ float delta = (float)i / (float)total;
+ float *p = stk->points[start + 1 + i].p;
+
+ VECCOPY(p, delta_p);
+ VecMulf(p, delta);
+ VecAddf(p, p, p_start);
+ }
+}
+
+void sk_polygonizeStroke(SK_Stroke *stk, int start, int end)
+{
+ int offset;
+ int i;
+
+ /* find first exact points outside of range */
+ for (;start > 0; start--)
+ {
+ if (stk->points[start].type == PT_EXACT)
+ {
+ break;
+ }
+ }
+
+ for (;end < stk->nb_points - 1; end++)
+ {
+ if (stk->points[end].type == PT_EXACT)
+ {
+ break;
+ }
+ }
+
+ offset = start + 1;
+
+ for (i = start + 1; i < end; i++)
+ {
+ if (stk->points[i].type == PT_EXACT)
+ {
+ if (offset != i)
+ {
+ memcpy(stk->points + offset, stk->points + i, sizeof(SK_Point));
+ }
+
+ offset++;
+ }
+ }
+
+ /* some points were removes, move end of array */
+ if (offset < end)
+ {
+ int size = stk->nb_points - end;
+ memmove(stk->points + offset, stk->points + end, size * sizeof(SK_Point));
+ stk->nb_points = offset + size;
+ }
+}
+
+void sk_flattenStroke(SK_Stroke *stk, int start, int end)
+{
+ float normal[3], distance[3];
+ float limit;
+ int i, total;
+
+ total = end - start + 1;
+
+ VECCOPY(normal, stk->points[start].no);
+
+ VecSubf(distance, stk->points[end].p, stk->points[start].p);
+ Projf(normal, distance, normal);
+ limit = Normalize(normal);
+
+ for (i = 1; i < total - 1; i++)
+ {
+ float d = limit * i / total;
+ float offset[3];
+ float *p = stk->points[start + i].p;
+
+ VecSubf(distance, p, stk->points[start].p);
+ Projf(distance, distance, normal);
+
+ VECCOPY(offset, normal);
+ VecMulf(offset, d);
+
+ VecSubf(p, p, distance);
+ VecAddf(p, p, offset);
+ }
+}
+
+void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk)
+{
+ if (sketch->active_stroke == stk)
+ {
+ sketch->active_stroke = NULL;
+ }
+
+ BLI_remlink(&sketch->strokes, stk);
+ sk_freeStroke(stk);
+}
+
+void sk_reverseStroke(SK_Stroke *stk)
+{
+ SK_Point *old_points = stk->points;
+ int i = 0;
+
+ sk_allocStrokeBuffer(stk);
+
+ for (i = 0; i < stk->nb_points; i++)
+ {
+ sk_copyPoint(stk->points + i, old_points + stk->nb_points - 1 - i);
+ }
+
+ MEM_freeN(old_points);
+}
+
+
+/* Ramer-Douglas-Peucker algorithm for line simplification */
+void sk_filterStroke(SK_Stroke *stk, int start, int end)
+{
+ SK_Point *old_points = stk->points;
+ int nb_points = stk->nb_points;
+ char *marked = NULL;
+ char work;
+ int i;
+
+ if (start == -1)
+ {
+ start = 0;
+ end = stk->nb_points - 1;
+ }
+
+ sk_allocStrokeBuffer(stk);
+ stk->nb_points = 0;
+
+ /* adding points before range */
+ for (i = 0; i < start; i++)
+ {
+ sk_appendStrokePoint(stk, old_points + i);
+ }
+
+ marked = MEM_callocN(nb_points, "marked array");
+ marked[start] = 1;
+ marked[end] = 1;
+
+ work = 1;
+
+ /* while still reducing */
+ while (work)
+ {
+ int ls, le;
+ work = 0;
+
+ ls = start;
+ le = start+1;
+
+ /* while not over interval */
+ while (ls < end)
+ {
+ int max_i = 0;
+ short v1[2];
+ float max_dist = 16; /* more than 4 pixels */
+
+ /* find the next marked point */
+ while(marked[le] == 0)
+ {
+ le++;
+ }
+
+ /* perpendicular vector to ls-le */
+ v1[1] = old_points[le].p2d[0] - old_points[ls].p2d[0];
+ v1[0] = old_points[ls].p2d[1] - old_points[le].p2d[1];
+
+
+ for( i = ls + 1; i < le; i++ )
+ {
+ float mul;
+ float dist;
+ short v2[2];
+
+ v2[0] = old_points[i].p2d[0] - old_points[ls].p2d[0];
+ v2[1] = old_points[i].p2d[1] - old_points[ls].p2d[1];
+
+ if (v2[0] == 0 && v2[1] == 0)
+ {
+ continue;
+ }
+
+ mul = (float)(v1[0]*v2[0] + v1[1]*v2[1]) / (float)(v2[0]*v2[0] + v2[1]*v2[1]);
+
+ dist = mul * mul * (v2[0]*v2[0] + v2[1]*v2[1]);
+
+ if (dist > max_dist)
+ {
+ max_dist = dist;
+ max_i = i;
+ }
+ }
+
+ if (max_i != 0)
+ {
+ work = 1;
+ marked[max_i] = 1;
+ }
+
+ ls = le;
+ le = ls + 1;
+ }
+ }
+
+
+ /* adding points after range */
+ for (i = start; i <= end; i++)
+ {
+ if (marked[i])
+ {
+ sk_appendStrokePoint(stk, old_points + i);
+ }
+ }
+
+ MEM_freeN(marked);
+
+ /* adding points after range */
+ for (i = end + 1; i < nb_points; i++)
+ {
+ sk_appendStrokePoint(stk, old_points + i);
+ }
+
+ MEM_freeN(old_points);
+
+ sk_shrinkStrokeBuffer(stk);
+}
+
+
+void sk_filterLastContinuousStroke(SK_Stroke *stk)
+{
+ int start, end;
+
+ end = stk->nb_points -1;
+
+ for (start = end - 1; start > 0 && stk->points[start].type == PT_CONTINUOUS; start--)
+ {
+ /* nothing to do here*/
+ }
+
+ if (end - start > 1)
+ {
+ sk_filterStroke(stk, start, end);
+ }
+}
+
+SK_Point *sk_lastStrokePoint(SK_Stroke *stk)
+{
+ SK_Point *pt = NULL;
+
+ if (stk->nb_points > 0)
+ {
+ pt = stk->points + (stk->nb_points - 1);
+ }
+
+ return pt;
+}
+
+void sk_endContinuousStroke(SK_Stroke *stk)
+{
+ stk->points[stk->nb_points - 1].type = PT_EXACT;
+}
+
+void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk)
+{
+ if (stk)
+ {
+ memcpy(&sketch->next_point, stk->points[stk->nb_points - 1].p, sizeof(SK_Point));
+ }
+}
+
+int sk_stroke_filtermval(SK_DrawData *dd)
+{
+ int retval = 0;
+ if (ABS(dd->mval[0] - dd->previous_mval[0]) + ABS(dd->mval[1] - dd->previous_mval[1]) > U.gp_manhattendist)
+ {
+ retval = 1;
+ }
+
+ return retval;
+}
+
+void sk_initDrawData(SK_DrawData *dd, short mval[2])
+{
+ dd->mval[0] = mval[0];
+ dd->mval[1] = mval[1];
+ dd->previous_mval[0] = -1;
+ dd->previous_mval[1] = -1;
+ dd->type = PT_EXACT;
+}
+
+
+void sk_deleteSelectedStrokes(SK_Sketch *sketch)
+{
+ SK_Stroke *stk, *next;
+
+ for (stk = sketch->strokes.first; stk; stk = next)
+ {
+ next = stk->next;
+
+ if (stk->selected == 1)
+ {
+ sk_removeStroke(sketch, stk);
+ }
+ }
+}
+
+void sk_selectAllSketch(SK_Sketch *sketch, int mode)
+{
+ SK_Stroke *stk = NULL;
+
+ if (mode == -1)
+ {
+ for (stk = sketch->strokes.first; stk; stk = stk->next)
+ {
+ stk->selected = 0;
+ }
+ }
+ else if (mode == 0)
+ {
+ for (stk = sketch->strokes.first; stk; stk = stk->next)
+ {
+ stk->selected = 1;
+ }
+ }
+ else if (mode == 1)
+ {
+ int selected = 1;
+
+ for (stk = sketch->strokes.first; stk; stk = stk->next)
+ {
+ selected &= stk->selected;
+ }
+
+ selected ^= 1;
+
+ for (stk = sketch->strokes.first; stk; stk = stk->next)
+ {
+ stk->selected = selected;
+ }
+ }
+}
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
new file mode 100644
index 00000000000..62463b3d555
--- /dev/null
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -0,0 +1,1399 @@
+/**
+ * smoke.c
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Daniel Genrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* Part of the code copied from elbeem fluid library, copyright by Nils Thuerey */
+
+#include <GL/glew.h>
+
+#include "MEM_guardedalloc.h"
+
+#include <float.h>
+#include <math.h>
+#include "stdio.h"
+#include "string.h" /* memset */
+
+#include "BLI_linklist.h"
+#include "BLI_rand.h"
+#include "BLI_jitter.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+#include "BLI_kdtree.h"
+#include "BLI_kdopbvh.h"
+
+#include "BKE_bvhutils.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_modifier.h"
+#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"
+#include "DNA_lamp_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
+
+#include "smoke_API.h"
+
+#include "BKE_smoke.h"
+
+#ifdef _WIN32
+#include <time.h>
+#include <stdio.h>
+#include <conio.h>
+#include <windows.h>
+
+static LARGE_INTEGER liFrequency;
+static LARGE_INTEGER liStartTime;
+static LARGE_INTEGER liCurrentTime;
+
+static void tstart ( void )
+{
+ QueryPerformanceFrequency ( &liFrequency );
+ QueryPerformanceCounter ( &liStartTime );
+}
+static void tend ( void )
+{
+ QueryPerformanceCounter ( &liCurrentTime );
+}
+static double tval()
+{
+ return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart ));
+}
+#else
+#include <sys/time.h>
+static struct timeval _tstart, _tend;
+static struct timezone tz;
+static void tstart ( void )
+{
+ gettimeofday ( &_tstart, &tz );
+}
+static void tend ( void )
+{
+ gettimeofday ( &_tend,&tz );
+}
+static double tval()
+{
+ double t1, t2;
+ t1 = ( double ) _tstart.tv_sec*1000 + ( double ) _tstart.tv_usec/ ( 1000 );
+ t2 = ( double ) _tend.tv_sec*1000 + ( double ) _tend.tv_usec/ ( 1000 );
+ return t2-t1;
+}
+#endif
+
+struct Object;
+struct Scene;
+struct DerivedMesh;
+struct SmokeModifierData;
+
+// forward declerations
+static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct);
+void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *tris, int numfaces, int numtris, int **tridivs, float cell_len);
+
+#define TRI_UVOFFSET (1./4.)
+
+int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm)
+{
+ if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid)
+ {
+ size_t i;
+ float min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
+ float size[3];
+ MVert *verts = dm->getVertArray(dm);
+ float scale = 0.0;
+ int res;
+
+ res = smd->domain->maxres;
+
+ // get BB of domain
+ for(i = 0; i < dm->getNumVerts(dm); i++)
+ {
+ float tmp[3];
+
+ VECCOPY(tmp, verts[i].co);
+ Mat4MulVecfl(ob->obmat, tmp);
+
+ // min BB
+ min[0] = MIN2(min[0], tmp[0]);
+ min[1] = MIN2(min[1], tmp[1]);
+ min[2] = MIN2(min[2], tmp[2]);
+
+ // max BB
+ max[0] = MAX2(max[0], tmp[0]);
+ max[1] = MAX2(max[1], tmp[1]);
+ max[2] = MAX2(max[2], tmp[2]);
+ }
+
+ VECCOPY(smd->domain->p0, min);
+ VECCOPY(smd->domain->p1, max);
+
+ // calc other res with max_res provided
+ VECSUB(size, max, min);
+
+ // printf("size: %f, %f, %f\n", size[0], size[1], size[2]);
+
+ // prevent crash when initializing a plane as domain
+ if((size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) || (size[2] < FLT_EPSILON))
+ return 0;
+
+ if(size[0] > size[1])
+ {
+ if(size[0] > size[1])
+ {
+ scale = res / size[0];
+ smd->domain->dx = size[0] / res;
+ smd->domain->res[0] = res;
+ smd->domain->res[1] = (int)(size[1] * scale + 0.5);
+ smd->domain->res[2] = (int)(size[2] * scale + 0.5);
+ }
+ else
+ {
+ scale = res / size[1];
+ smd->domain->dx = size[1] / res;
+ smd->domain->res[1] = res;
+ smd->domain->res[0] = (int)(size[0] * scale + 0.5);
+ smd->domain->res[2] = (int)(size[2] * scale + 0.5);
+ }
+ }
+ else
+ {
+ if(size[1] > size[2])
+ {
+ scale = res / size[1];
+ smd->domain->dx = size[1] / res;
+ smd->domain->res[1] = res;
+ smd->domain->res[0] = (int)(size[0] * scale + 0.5);
+ smd->domain->res[2] = (int)(size[2] * scale + 0.5);
+ }
+ else
+ {
+ 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[1] = (int)(size[1] * scale + 0.5);
+ }
+ }
+
+ // printf("smd->domain->dx: %f\n", smd->domain->dx);
+
+ // TODO: put in failsafe if res<=0 - dg
+
+ // printf("res[0]: %d, res[1]: %d, res[2]: %d\n", smd->domain->res[0], smd->domain->res[1], smd->domain->res[2]);
+ // dt max is 0.1
+ smd->domain->fluid = smoke_init(smd->domain->res, smd->domain->p0, 0.1);
+ smd->time = scene->r.cfra;
+
+ if(smd->domain->flags & MOD_SMOKE_HIGHRES)
+ {
+ smd->domain->wt = smoke_turbulence_init(smd->domain->res, smd->domain->amplify + 1, smd->domain->noise);
+ smd->domain->res_wt[0] = smd->domain->res[0] * (smd->domain->amplify + 1);
+ smd->domain->res_wt[1] = smd->domain->res[1] * (smd->domain->amplify + 1);
+ smd->domain->res_wt[2] = smd->domain->res[2] * (smd->domain->amplify + 1);
+ smd->domain->dx_wt = smd->domain->dx / (smd->domain->amplify + 1);
+ // printf("smd->domain->amplify: %d\n", smd->domain->amplify);
+ // printf("(smd->domain->flags & MOD_SMOKE_HIGHRES)\n");
+ }
+
+ if(!smd->domain->shadow)
+ smd->domain->shadow = MEM_callocN(sizeof(float) * smd->domain->res[0] * smd->domain->res[1] * smd->domain->res[2], "SmokeDomainShadow");
+
+ smoke_initBlenderRNA(smd->domain->fluid, &(smd->domain->alpha), &(smd->domain->beta));
+
+ if(smd->domain->wt)
+ {
+ smoke_initWaveletBlenderRNA(smd->domain->wt, &(smd->domain->strength));
+ // printf("smoke_initWaveletBlenderRNA\n");
+ }
+ return 1;
+ }
+ else if((smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow)
+ {
+ // handle flow object here
+ // XXX TODO
+
+ smd->time = scene->r.cfra;
+
+ // update particle lifetime to be one frame
+ // smd->flow->psys->part->lifetime = scene->r.efra + 1;
+/*
+ if(!smd->flow->bvh)
+ {
+ // smd->flow->bvh = MEM_callocN(sizeof(BVHTreeFromMesh), "smoke_bvhfromfaces");
+ // bvhtree_from_mesh_faces(smd->flow->bvh, dm, 0.0, 2, 6);
+
+ // copy obmat
+ // Mat4CpyMat4(smd->flow->mat, ob->obmat);
+ // Mat4CpyMat4(smd->flow->mat_old, ob->obmat);
+ }
+*/
+
+ return 1;
+ }
+ else if((smd->type & MOD_SMOKE_TYPE_COLL))
+ {
+ smd->time = scene->r.cfra;
+
+ // todo: delete this when loading colls work -dg
+ if(!smd->coll)
+ smokeModifier_createType(smd);
+
+ if(!smd->coll->points)
+ {
+ // init collision points
+ SmokeCollSettings *scs = smd->coll;
+ MVert *mvert = dm->getVertArray(dm);
+ MFace *mface = dm->getFaceArray(dm);
+ int i = 0, divs = 0;
+ int *tridivs = NULL;
+ float cell_len = 1.0 / 50.0; // for res = 50
+ int newdivs = 0;
+ int quads = 0, facecounter = 0;
+
+ // copy obmat
+ Mat4CpyMat4(scs->mat, ob->obmat);
+ Mat4CpyMat4(scs->mat_old, ob->obmat);
+
+ // count quads
+ for(i = 0; i < dm->getNumFaces(dm); i++)
+ {
+ if(mface[i].v4)
+ quads++;
+ }
+
+ calcTriangleDivs(ob, mvert, dm->getNumVerts(dm), mface, dm->getNumFaces(dm), dm->getNumFaces(dm) + quads, &tridivs, cell_len);
+
+ // count triangle divisions
+ for(i = 0; i < dm->getNumFaces(dm) + quads; i++)
+ {
+ divs += (tridivs[3 * i] + 1) * (tridivs[3 * i + 1] + 1) * (tridivs[3 * i + 2] + 1);
+ }
+
+ // printf("divs: %d\n", divs);
+
+ scs->points = MEM_callocN(sizeof(float) * (dm->getNumVerts(dm) + divs) * 3, "SmokeCollPoints");
+
+ for(i = 0; i < dm->getNumVerts(dm); i++)
+ {
+ float tmpvec[3];
+ VECCOPY(tmpvec, mvert[i].co);
+ Mat4MulVecfl (ob->obmat, tmpvec);
+ VECCOPY(&scs->points[i * 3], tmpvec);
+ }
+
+ for(i = 0, facecounter = 0; i < dm->getNumFaces(dm); i++)
+ {
+ int again = 0;
+ do
+ {
+ int j, k;
+ int divs1 = tridivs[3 * facecounter + 0];
+ int divs2 = tridivs[3 * facecounter + 1];
+ //int divs3 = tridivs[3 * facecounter + 2];
+ float side1[3], side2[3], trinormorg[3], trinorm[3];
+
+ if(again == 1 && mface[i].v4)
+ {
+ VECSUB(side1, mvert[ mface[i].v3 ].co, mvert[ mface[i].v1 ].co);
+ VECSUB(side2, mvert[ mface[i].v4 ].co, mvert[ mface[i].v1 ].co);
+ }
+ else
+ {
+ VECSUB(side1, mvert[ mface[i].v2 ].co, mvert[ mface[i].v1 ].co);
+ VECSUB(side2, mvert[ mface[i].v3 ].co, mvert[ mface[i].v1 ].co);
+ }
+
+ Crossf(trinormorg, side1, side2);
+ Normalize(trinormorg);
+ VECCOPY(trinorm, trinormorg);
+ VecMulf(trinorm, 0.25 * cell_len);
+
+ for(j = 0; j <= divs1; j++)
+ {
+ for(k = 0; k <= divs2; k++)
+ {
+ float p1[3], p2[3], p3[3], p[3]={0,0,0};
+ const float uf = (float)(j + TRI_UVOFFSET) / (float)(divs1 + 0.0);
+ const float vf = (float)(k + TRI_UVOFFSET) / (float)(divs2 + 0.0);
+ float tmpvec[3];
+
+ if(uf+vf > 1.0)
+ {
+ // printf("bigger - divs1: %d, divs2: %d\n", divs1, divs2);
+ continue;
+ }
+
+ VECCOPY(p1, mvert[ mface[i].v1 ].co);
+ if(again == 1 && mface[i].v4)
+ {
+ VECCOPY(p2, mvert[ mface[i].v3 ].co);
+ VECCOPY(p3, mvert[ mface[i].v4 ].co);
+ }
+ else
+ {
+ VECCOPY(p2, mvert[ mface[i].v2 ].co);
+ VECCOPY(p3, mvert[ mface[i].v3 ].co);
+ }
+
+ VecMulf(p1, (1.0-uf-vf));
+ VecMulf(p2, uf);
+ VecMulf(p3, vf);
+
+ VECADD(p, p1, p2);
+ VECADD(p, p, p3);
+
+ if(newdivs > divs)
+ printf("mem problem\n");
+
+ // mMovPoints.push_back(p + trinorm);
+ VECCOPY(tmpvec, p);
+ VECADD(tmpvec, tmpvec, trinorm);
+ Mat4MulVecfl (ob->obmat, tmpvec);
+ VECCOPY(&scs->points[3 * (dm->getNumVerts(dm) + newdivs)], tmpvec);
+ newdivs++;
+
+ if(newdivs > divs)
+ printf("mem problem\n");
+
+ // mMovPoints.push_back(p - trinorm);
+ VECCOPY(tmpvec, p);
+ VECSUB(tmpvec, tmpvec, trinorm);
+ Mat4MulVecfl (ob->obmat, tmpvec);
+ VECCOPY(&scs->points[3 * (dm->getNumVerts(dm) + newdivs)], tmpvec);
+ newdivs++;
+ }
+ }
+
+ if(again == 0 && mface[i].v4)
+ again++;
+ else
+ again = 0;
+
+ facecounter++;
+
+ } while(again!=0);
+ }
+
+ scs->numpoints = dm->getNumVerts(dm) + newdivs;
+
+ MEM_freeN(tridivs);
+ }
+
+ if(!smd->coll->bvhtree)
+ {
+ smd->coll->bvhtree = NULL; // bvhtree_build_from_smoke ( ob->obmat, dm->getFaceArray(dm), dm->getNumFaces(dm), dm->getVertArray(dm), dm->getNumVerts(dm), 0.0 );
+ }
+ return 1;
+ }
+
+ return 1;
+}
+
+/*! init triangle divisions */
+void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len)
+{
+ // mTriangleDivs1.resize( faces.size() );
+ // mTriangleDivs2.resize( faces.size() );
+ // mTriangleDivs3.resize( faces.size() );
+
+ size_t i = 0, facecounter = 0;
+ float maxscale[3] = {1,1,1}; // = channelFindMaxVf(mcScale);
+ float maxpart = ABS(maxscale[0]);
+ float scaleFac = 0;
+ float fsTri = 0;
+ if(ABS(maxscale[1])>maxpart) maxpart = ABS(maxscale[1]);
+ if(ABS(maxscale[2])>maxpart) maxpart = ABS(maxscale[2]);
+ scaleFac = 1.0 / maxpart;
+ // featureSize = mLevel[mMaxRefine].nodeSize
+ fsTri = cell_len * 0.5 * scaleFac;
+
+ if(*tridivs)
+ MEM_freeN(*tridivs);
+
+ *tridivs = MEM_callocN(sizeof(int) * numtris * 3, "Smoke_Tridivs");
+
+ for(i = 0, facecounter = 0; i < numfaces; i++)
+ {
+ float p0[3], p1[3], p2[3];
+ float side1[3];
+ float side2[3];
+ float side3[3];
+ int divs1=0, divs2=0, divs3=0;
+
+ VECCOPY(p0, verts[faces[i].v1].co);
+ Mat4MulVecfl (ob->obmat, p0);
+ VECCOPY(p1, verts[faces[i].v2].co);
+ Mat4MulVecfl (ob->obmat, p1);
+ VECCOPY(p2, verts[faces[i].v3].co);
+ Mat4MulVecfl (ob->obmat, p2);
+
+ VECSUB(side1, p1, p0);
+ VECSUB(side2, p2, p0);
+ VECSUB(side3, p1, p2);
+
+ if(INPR(side1, side1) > fsTri*fsTri)
+ {
+ float tmp = Normalize(side1);
+ divs1 = (int)ceil(tmp/fsTri);
+ }
+ if(INPR(side2, side2) > fsTri*fsTri)
+ {
+ float tmp = Normalize(side2);
+ divs2 = (int)ceil(tmp/fsTri);
+
+ /*
+ // debug
+ if(i==0)
+ printf("b tmp: %f, fsTri: %f, divs2: %d\n", tmp, fsTri, divs2);
+ */
+ }
+
+ (*tridivs)[3 * facecounter + 0] = divs1;
+ (*tridivs)[3 * facecounter + 1] = divs2;
+ (*tridivs)[3 * facecounter + 2] = divs3;
+
+ // TODO quad case
+ if(faces[i].v4)
+ {
+ divs1=0, divs2=0, divs3=0;
+
+ facecounter++;
+
+ VECCOPY(p0, verts[faces[i].v3].co);
+ Mat4MulVecfl (ob->obmat, p0);
+ VECCOPY(p1, verts[faces[i].v4].co);
+ Mat4MulVecfl (ob->obmat, p1);
+ VECCOPY(p2, verts[faces[i].v1].co);
+ Mat4MulVecfl (ob->obmat, p2);
+
+ VECSUB(side1, p1, p0);
+ VECSUB(side2, p2, p0);
+ VECSUB(side3, p1, p2);
+
+ if(INPR(side1, side1) > fsTri*fsTri)
+ {
+ float tmp = Normalize(side1);
+ divs1 = (int)ceil(tmp/fsTri);
+ }
+ if(INPR(side2, side2) > fsTri*fsTri)
+ {
+ float tmp = Normalize(side2);
+ divs2 = (int)ceil(tmp/fsTri);
+ }
+
+ (*tridivs)[3 * facecounter + 0] = divs1;
+ (*tridivs)[3 * facecounter + 1] = divs2;
+ (*tridivs)[3 * facecounter + 2] = divs3;
+ }
+ facecounter++;
+ }
+}
+
+static void smokeModifier_freeDomain(SmokeModifierData *smd)
+{
+ if(smd->domain)
+ {
+ if(smd->domain->shadow)
+ MEM_freeN(smd->domain->shadow);
+ smd->domain->shadow = NULL;
+
+ if(smd->domain->fluid)
+ smoke_free(smd->domain->fluid);
+
+ if(smd->domain->wt)
+ smoke_turbulence_free(smd->domain->wt);
+
+ 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;
+ }
+}
+
+static void smokeModifier_freeFlow(SmokeModifierData *smd)
+{
+ if(smd->flow)
+ {
+/*
+ if(smd->flow->bvh)
+ {
+ free_bvhtree_from_mesh(smd->flow->bvh);
+ MEM_freeN(smd->flow->bvh);
+ }
+ smd->flow->bvh = NULL;
+*/
+ MEM_freeN(smd->flow);
+ smd->flow = NULL;
+ }
+}
+
+static void smokeModifier_freeCollision(SmokeModifierData *smd)
+{
+ if(smd->coll)
+ {
+ if(smd->coll->points)
+ {
+ MEM_freeN(smd->coll->points);
+ smd->coll->points = NULL;
+ }
+
+ if(smd->coll->bvhtree)
+ {
+ BLI_bvhtree_free(smd->coll->bvhtree);
+ smd->coll->bvhtree = NULL;
+ }
+
+ if(smd->coll->dm)
+ smd->coll->dm->release(smd->coll->dm);
+ smd->coll->dm = NULL;
+
+ MEM_freeN(smd->coll);
+ smd->coll = NULL;
+ }
+}
+
+void smokeModifier_reset_turbulence(struct SmokeModifierData *smd)
+{
+ if(smd && smd->domain && smd->domain->wt)
+ {
+ smoke_turbulence_free(smd->domain->wt);
+ smd->domain->wt = NULL;
+ }
+}
+
+void smokeModifier_reset(struct SmokeModifierData *smd)
+{
+ if(smd)
+ {
+ if(smd->domain)
+ {
+ if(smd->domain->shadow)
+ MEM_freeN(smd->domain->shadow);
+ smd->domain->shadow = NULL;
+
+ if(smd->domain->fluid)
+ {
+ smoke_free(smd->domain->fluid);
+ 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;
+
+ // printf("reset domain end\n");
+ }
+ else if(smd->flow)
+ {
+ /*
+ if(smd->flow->bvh)
+ {
+ free_bvhtree_from_mesh(smd->flow->bvh);
+ MEM_freeN(smd->flow->bvh);
+ }
+ smd->flow->bvh = NULL;
+ */
+ }
+ else if(smd->coll)
+ {
+ if(smd->coll->points)
+ {
+ MEM_freeN(smd->coll->points);
+ smd->coll->points = NULL;
+ }
+
+ if(smd->coll->bvhtree)
+ {
+ BLI_bvhtree_free(smd->coll->bvhtree);
+ smd->coll->bvhtree = NULL;
+ }
+
+ if(smd->coll->dm)
+ smd->coll->dm->release(smd->coll->dm);
+ smd->coll->dm = NULL;
+
+ }
+ }
+}
+
+void smokeModifier_free (SmokeModifierData *smd)
+{
+ if(smd)
+ {
+ smokeModifier_freeDomain(smd);
+ smokeModifier_freeFlow(smd);
+ smokeModifier_freeCollision(smd);
+ }
+}
+
+void smokeModifier_createType(struct SmokeModifierData *smd)
+{
+ if(smd)
+ {
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ {
+ if(smd->domain)
+ smokeModifier_freeDomain(smd);
+
+ smd->domain = MEM_callocN(sizeof(SmokeDomainSettings), "SmokeDomain");
+
+ smd->domain->smd = smd;
+
+ smd->domain->point_cache[0] = BKE_ptcache_add(&(smd->domain->ptcaches[0]));
+ 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;
+
+ /* set some standard values */
+ smd->domain->fluid = NULL;
+ smd->domain->wt = NULL;
+ smd->domain->eff_group = NULL;
+ smd->domain->fluid_group = NULL;
+ smd->domain->coll_group = NULL;
+ smd->domain->maxres = 32;
+ smd->domain->amplify = 1;
+ smd->domain->omega = 1.0;
+ smd->domain->alpha = -0.001;
+ smd->domain->beta = 0.1;
+ smd->domain->flags = MOD_SMOKE_DISSOLVE_LOG;
+ smd->domain->strength = 2.0;
+ smd->domain->noise = MOD_SMOKE_NOISEWAVE;
+ smd->domain->diss_speed = 5;
+ // init 3dview buffer
+ smd->domain->viewsettings = 0;
+ }
+ else if(smd->type & MOD_SMOKE_TYPE_FLOW)
+ {
+ if(smd->flow)
+ smokeModifier_freeFlow(smd);
+
+ smd->flow = MEM_callocN(sizeof(SmokeFlowSettings), "SmokeFlow");
+
+ smd->flow->smd = smd;
+
+ /* set some standard values */
+ smd->flow->density = 1.0;
+ smd->flow->temp = 1.0;
+
+ smd->flow->psys = NULL;
+
+ }
+ else if(smd->type & MOD_SMOKE_TYPE_COLL)
+ {
+ if(smd->coll)
+ smokeModifier_freeCollision(smd);
+
+ smd->coll = MEM_callocN(sizeof(SmokeCollSettings), "SmokeColl");
+
+ smd->coll->smd = smd;
+ smd->coll->points = NULL;
+ smd->coll->numpoints = 0;
+ smd->coll->bvhtree = NULL;
+ smd->coll->dm = NULL;
+ }
+ }
+}
+
+// forward decleration
+static void smoke_calc_transparency(float *result, float *input, float *p0, float *p1, int res[3], float dx, float *light, bresenham_callback cb, float correct);
+static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
+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;
+}
+
+static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
+{
+ SmokeDomainSettings *sds = smd->domain;
+ GroupObject *go = NULL;
+ Base *base = NULL;
+
+ // do flows and fluids
+ if(1)
+ {
+ Object *otherobj = NULL;
+ ModifierData *md = NULL;
+ if(sds->fluid_group) // we use groups since we have 2 domains
+ go = sds->fluid_group->gobject.first;
+ else
+ base = scene->base.first;
+ while(base || go)
+ {
+ otherobj = NULL;
+ if(sds->fluid_group)
+ {
+ if(go->ob)
+ otherobj = go->ob;
+ }
+ else
+ otherobj = base->object;
+ if(!otherobj)
+ {
+ if(sds->fluid_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;
+
+ // check for initialized smoke object
+ if((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow)
+ {
+ // we got nice flow object
+ SmokeFlowSettings *sfs = smd2->flow;
+
+ if(sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected
+ {
+ 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);
+ float *heat = smoke_get_heat(sds->fluid);
+ float *velocity_x = smoke_get_velocity_x(sds->fluid);
+ float *velocity_y = smoke_get_velocity_y(sds->fluid);
+ float *velocity_z = smoke_get_velocity_z(sds->fluid);
+ unsigned char *obstacle = smoke_get_obstacle(sds->fluid);
+ int bigres[3];
+
+ // 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_KILLED) continue;
+ else 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;
+ // VECCOPY(pos, pa->state.co);
+ // Mat4MulVecfl (ob->imat, pos);
+ // 1. get corresponding cell
+ get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, pa->state.co, cell, 0);
+ // check if cell is valid (in the domain boundary)
+ for(i = 0; i < 3; i++)
+ {
+ if((cell[i] > sds->res[i] - 1) || (cell[i] < 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]);
+ if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) && !(obstacle[index] & 2)) // this is inflow
+ {
+ // heat[index] += sfs->temp * 0.1;
+ // density[index] += sfs->density * 0.1;
+ heat[index] = sfs->temp;
+ density[index] = sfs->density;
+
+ /*
+ velocity_x[index] = pa->state.vel[0];
+ velocity_y[index] = pa->state.vel[1];
+ velocity_z[index] = pa->state.vel[2];
+ */
+
+ // obstacle[index] |= 2;
+ // we need different handling for the high-res feature
+ if(bigdensity)
+ {
+ // init all surrounding cells according to amplification, too
+ int i, j, k;
+
+ smoke_turbulence_get_res(smd->domain->wt, bigres);
+
+ for(i = 0; i < smd->domain->amplify + 1; i++)
+ for(j = 0; j < smd->domain->amplify + 1; j++)
+ for(k = 0; k < smd->domain->amplify + 1; k++)
+ {
+ index = smoke_get_index((smd->domain->amplify + 1)* cell[0] + i, bigres[0], (smd->domain->amplify + 1)* cell[1] + j, bigres[1], (smd->domain->amplify + 1)* cell[2] + k);
+ bigdensity[index] = sfs->density;
+ }
+ }
+ }
+ else if(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) // outflow
+ {
+ heat[index] = 0.f;
+ density[index] = 0.f;
+ velocity_x[index] = 0.f;
+ velocity_y[index] = 0.f;
+ velocity_z[index] = 0.f;
+ // we need different handling for the high-res feature
+ if(bigdensity)
+ {
+ // init all surrounding cells according to amplification, too
+ int i, j, k;
+ smoke_turbulence_get_res(smd->domain->wt, bigres);
+
+ for(i = 0; i < smd->domain->amplify + 1; i++)
+ for(j = 0; j < smd->domain->amplify + 1; j++)
+ for(k = 0; k < smd->domain->amplify + 1; k++)
+ {
+ index = smoke_get_index((smd->domain->amplify + 1)* cell[0] + i, bigres[0], (smd->domain->amplify + 1)* cell[1] + j, bigres[1], (smd->domain->amplify + 1)* cell[2] + k);
+ bigdensity[index] = 0.f;
+ }
+ }
+ } // particles loop
+ }
+ }
+ else
+ {
+ /*
+ for()
+ {
+ // no psys
+ BVHTreeNearest nearest;
+ nearest.index = -1;
+ nearest.dist = FLT_MAX;
+
+ BLI_bvhtree_find_nearest(sfs->bvh->tree, pco, &nearest, sfs->bvh->nearest_callback, sfs->bvh);
+ }*/
+ }
+ }
+ }
+ if(sds->fluid_group)
+ go = go->next;
+ else
+ base= base->next;
+ }
+ }
+
+ // do effectors
+ /*
+ if(sds->eff_group)
+ {
+ for(go = sds->eff_group->gobject.first; go; go = go->next)
+ {
+ if(go->ob)
+ {
+ if(ob->pd)
+ {
+
+ }
+ }
+ }
+ }
+ */
+
+ // 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)
+ {
+ // 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)
+{
+ if((smd->type & MOD_SMOKE_TYPE_FLOW))
+ {
+ if(scene->r.cfra >= smd->time)
+ smokeModifier_init(smd, ob, scene, dm);
+
+ if(scene->r.cfra > smd->time)
+ {
+ // XXX TODO
+ smd->time = scene->r.cfra;
+
+ // rigid movement support
+ /*
+ Mat4CpyMat4(smd->flow->mat_old, smd->flow->mat);
+ Mat4CpyMat4(smd->flow->mat, ob->obmat);
+ */
+ }
+ else if(scene->r.cfra < smd->time)
+ {
+ smd->time = scene->r.cfra;
+ smokeModifier_reset(smd);
+ }
+ }
+ else if(smd->type & MOD_SMOKE_TYPE_COLL)
+ {
+ if(scene->r.cfra >= smd->time)
+ smokeModifier_init(smd, ob, scene, dm);
+
+ if(scene->r.cfra > smd->time)
+ {
+ // XXX TODO
+ smd->time = scene->r.cfra;
+
+ if(smd->coll->dm)
+ smd->coll->dm->release(smd->coll->dm);
+
+ smd->coll->dm = CDDM_copy(dm);
+
+ // rigid movement support
+ Mat4CpyMat4(smd->coll->mat_old, smd->coll->mat);
+ Mat4CpyMat4(smd->coll->mat, ob->obmat);
+ }
+ else if(scene->r.cfra < smd->time)
+ {
+ smd->time = scene->r.cfra;
+ smokeModifier_reset(smd);
+ }
+ }
+ else if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ {
+ SmokeDomainSettings *sds = smd->domain;
+ 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;
+
+ framenr = scene->r.cfra;
+
+ // printf("time: %d\n", scene->r.cfra);
+
+ if(framenr == smd->time)
+ return;
+
+ 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)
+ {
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_id_reset(scene, &pid_wt, PTCACHE_RESET_OUTDATED);
+ }
+
+ if(framenr < startframe)
+ return;
+
+ if(framenr > endframe)
+ return;
+
+ if(!smd->domain->fluid && (framenr != startframe))
+ return;
+
+ // printf("startframe: %d, framenr: %d\n", startframe, framenr);
+
+ if(!smokeModifier_init(smd, ob, scene, dm))
+ {
+ 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)
+ {
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->simframe= 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)
+ {
+ cache_wt->flag |= PTCACHE_SIMULATION_VALID;
+ cache_wt->simframe= framenr;
+ }
+ }
+ return;
+ }
+
+ tstart();
+
+ smoke_calc_domain(scene, ob, smd);
+
+ // set new time
+ smd->time = scene->r.cfra;
+
+ /* do simulation */
+
+ // low res
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->simframe= framenr;
+
+ // simulate the actual smoke (c++ code in intern/smoke)
+ // DG: interesting commenting this line + deactivating loading of noise files
+ if(framenr!=startframe)
+ smoke_step(sds->fluid, smd->time);
+
+ // create shadows before writing cache so we get nice shadows for sstartframe, 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);
+
+ BKE_ptcache_write_cache(&pid, framenr);
+
+ if(sds->wt)
+ {
+ if(framenr!=startframe)
+ smoke_turbulence_step(sds->wt, sds->fluid);
+
+ cache_wt->flag |= PTCACHE_SIMULATION_VALID;
+ cache_wt->simframe= framenr;
+ BKE_ptcache_write_cache(&pid_wt, framenr);
+ }
+
+ tend();
+ printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() );
+ }
+}
+
+static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct)
+{
+ const size_t index = smoke_get_index(pixel[0], res[0], pixel[1], res[1], pixel[2]);
+
+ // T_ray *= T_vox
+ *tRay *= exp(input[index]*correct);
+
+ if(result[index] < 0.0f)
+ {
+#pragma omp critical
+ result[index] = *tRay;
+ }
+
+ return *tRay;
+}
+
+long long smoke_get_mem_req(int xres, int yres, int zres, int amplify)
+{
+ int totalCells = xres * yres * zres;
+ int amplifiedCells = totalCells * amplify * amplify * amplify;
+
+ // print out memory requirements
+ long long int coarseSize = sizeof(float) * totalCells * 22 +
+ sizeof(unsigned char) * totalCells;
+
+ long long int fineSize = sizeof(float) * amplifiedCells * 7 + // big grids
+ sizeof(float) * totalCells * 8 + // small grids
+ sizeof(float) * 128 * 128 * 128; // noise tile
+
+ long long int totalMB = (coarseSize + fineSize) / (1024 * 1024);
+
+ return totalMB;
+}
+
+static void bresenham_linie_3D(int x1, int y1, int z1, int x2, int y2, int z2, float *tRay, bresenham_callback cb, float *result, float *input, int res[3], float correct)
+{
+ int dx, dy, dz, i, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2;
+ int pixel[3];
+
+ pixel[0] = x1;
+ pixel[1] = y1;
+ pixel[2] = z1;
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ dz = z2 - z1;
+
+ x_inc = (dx < 0) ? -1 : 1;
+ l = abs(dx);
+ y_inc = (dy < 0) ? -1 : 1;
+ m = abs(dy);
+ z_inc = (dz < 0) ? -1 : 1;
+ n = abs(dz);
+ dx2 = l << 1;
+ dy2 = m << 1;
+ dz2 = n << 1;
+
+ if ((l >= m) && (l >= n)) {
+ err_1 = dy2 - l;
+ err_2 = dz2 - l;
+ for (i = 0; i < l; i++) {
+ if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON)
+ break;
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dx2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dx2;
+ }
+ err_1 += dy2;
+ err_2 += dz2;
+ pixel[0] += x_inc;
+ }
+ } else if ((m >= l) && (m >= n)) {
+ err_1 = dx2 - m;
+ err_2 = dz2 - m;
+ for (i = 0; i < m; i++) {
+ if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON)
+ break;
+ if (err_1 > 0) {
+ pixel[0] += x_inc;
+ err_1 -= dy2;
+ }
+ if (err_2 > 0) {
+ pixel[2] += z_inc;
+ err_2 -= dy2;
+ }
+ err_1 += dx2;
+ err_2 += dz2;
+ pixel[1] += y_inc;
+ }
+ } else {
+ err_1 = dy2 - n;
+ err_2 = dx2 - n;
+ for (i = 0; i < n; i++) {
+ if(cb(result, input, res, pixel, tRay, correct) <= FLT_EPSILON)
+ break;
+ if (err_1 > 0) {
+ pixel[1] += y_inc;
+ err_1 -= dz2;
+ }
+ if (err_2 > 0) {
+ pixel[0] += x_inc;
+ err_2 -= dz2;
+ }
+ err_1 += dy2;
+ err_2 += dx2;
+ pixel[2] += z_inc;
+ }
+ }
+ cb(result, input, res, pixel, tRay, correct);
+}
+
+static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct)
+{
+ float tmp[3];
+
+ VECSUB(tmp, pos, p0);
+ VecMulf(tmp, 1.0 / dx);
+
+ if(correct)
+ {
+ cell[0] = MIN2(res[0] - 1, MAX2(0, (int)floor(tmp[0])));
+ cell[1] = MIN2(res[1] - 1, MAX2(0, (int)floor(tmp[1])));
+ cell[2] = MIN2(res[2] - 1, MAX2(0, (int)floor(tmp[2])));
+ }
+ else
+ {
+ cell[0] = (int)floor(tmp[0]);
+ cell[1] = (int)floor(tmp[1]);
+ cell[2] = (int)floor(tmp[2]);
+ }
+}
+
+static void smoke_calc_transparency(float *result, float *input, float *p0, float *p1, int res[3], float dx, float *light, bresenham_callback cb, float correct)
+{
+ int x, y, z;
+ float bv[6];
+
+ memset(result, -1, sizeof(float)*res[0]*res[1]*res[2]); // x
+ bv[0] = p0[0];
+ bv[1] = p1[0];
+ // y
+ bv[2] = p0[1];
+ bv[3] = p1[1];
+ // z
+ bv[4] = p0[2];
+ bv[5] = p1[2];
+
+#pragma omp parallel for schedule(static) private(y, z)
+ for(x = 0; x < res[0]; x++)
+ for(y = 0; y < res[1]; y++)
+ for(z = 0; z < res[2]; z++)
+ {
+ float voxelCenter[3];
+ size_t index;
+ float pos[3];
+ int cell[3];
+ float tRay = 1.0;
+
+ index = smoke_get_index(x, res[0], y, res[1], z);
+
+ if(result[index] >= 0.0f)
+ continue;
+ voxelCenter[0] = p0[0] + dx * x + dx * 0.5;
+ voxelCenter[1] = p0[1] + dx * y + dx * 0.5;
+ voxelCenter[2] = p0[2] + dx * z + dx * 0.5;
+
+ // get starting position (in voxel coords)
+ if(BLI_bvhtree_bb_raycast(bv, light, voxelCenter, pos) > FLT_EPSILON)
+ {
+ // we're ouside
+ get_cell(p0, res, dx, pos, cell, 1);
+ }
+ else
+ {
+ // we're inside
+ get_cell(p0, res, dx, light, cell, 1);
+ }
+
+ bresenham_linie_3D(cell[0], cell[1], cell[2], x, y, z, &tRay, cb, result, input, res, correct);
+
+ // convention -> from a RGBA float array, use G value for tRay
+// #pragma omp critical
+ result[index] = tRay;
+ }
+}
+
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index bc6b487080c..450a64d72eb 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -58,7 +58,6 @@ variables on the UI for now
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h" /* here is the softbody struct */
-#include "DNA_particle_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -76,13 +75,12 @@ variables on the UI for now
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_object.h"
-#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_pointcache.h"
#include "BKE_modifier.h"
-
+#include "BKE_deform.h"
//XXX #include "BIF_editdeform.h"
//XXX #include "BIF_graphics.h"
#include "PIL_time.h"
@@ -494,32 +492,21 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h
while (base) {
/*Only proceed for mesh object in same layer */
if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) {
- int particles=0;
ob= base->object;
if((vertexowner) && (ob == vertexowner)) {
- if(vertexowner->soft->particles){
- particles=1;
- }
- else {
- /* if vertexowner is given we don't want to check collision with owner object */
- base = base->next;
- continue;
- }
+ /* if vertexowner is given we don't want to check collision with owner object */
+ base = base->next;
+ continue;
}
/*+++ only with deflecting set */
if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == 0) {
DerivedMesh *dm= NULL;
- if(particles) {
- dm = psys_get_modifier(ob,psys_get_current(ob))->dm;
- }
- else {
- if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
- else
- dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
- }
+ if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */
+ dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+ else
+ dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
if(dm){
ccd_Mesh *ccdmesh = ccd_mesh_make(ob, dm);
@@ -866,7 +853,8 @@ static void renew_softbody(Scene *scene, Object *ob, int totpoint, int totspring
bp->frozen = 1.0f;
bp->colball = 0.0f;
bp->flag = 0;
-
+ bp->springweight = 1.0f;
+ bp->mass = sb->nodemass;
}
}
}
@@ -2051,7 +2039,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
BodyPoint *bp1,*bp2;
float dir[3],dvel[3];
- float distance,forcefactor,kd,absvel,projvel;
+ float distance,forcefactor,kd,absvel,projvel,kw;
int ia,ic;
/* prepare depending on which side of the spring we are on */
if (bpi == bs->v1){
@@ -2085,7 +2073,10 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
forcefactor = iks/bs->len;
else
forcefactor = iks;
- forcefactor *= bs->strength;
+ kw = (bp1->springweight+bp2->springweight)/2.0f;
+ kw = kw * kw;
+ kw = kw * kw;
+ forcefactor *= bs->strength * kw;
Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir);
/* do bp1 <--> bp2 viscous */
@@ -2185,14 +2176,14 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
VecMidf(velcenter, bp->vec, obp->vec);
VecSubf(dvel,velcenter,bp->vec);
- VecMulf(dvel,sb->nodemass);
+ VecMulf(dvel,bp->mass);
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
Vec3PlusStVec(bp->force,sb->balldamp,dvel);
/* exploit force(a,b) == -force(b,a) part2/2 */
VecSubf(dvel,velcenter,obp->vec);
- VecMulf(dvel,sb->nodemass);
+ VecMulf(dvel,bp->mass);
Vec3PlusStVec(obp->force,sb->balldamp,dvel);
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
@@ -2237,7 +2228,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
/* gravitation */
if (sb){
float gravity = sb->grav * sb_grav_force_scale(ob);
- bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */
+ bp->force[2]-= gravity*bp->mass; /* individual mass of node here */
}
/* particle field & vortex */
@@ -2549,7 +2540,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
VecMidf(velcenter, bp->vec, obp->vec);
VecSubf(dvel,velcenter,bp->vec);
- VecMulf(dvel,sb->nodemass);
+ VecMulf(dvel,bp->mass);
Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def);
Vec3PlusStVec(bp->force,sb->balldamp,dvel);
@@ -2580,7 +2571,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
/* exploit force(a,b) == -force(b,a) part2/2 */
VecSubf(dvel,velcenter,obp->vec);
- VecMulf(dvel,sb->nodemass);
+ VecMulf(dvel,(bp->mass+obp->mass)/2.0f);
Vec3PlusStVec(obp->force,sb->balldamp,dvel);
Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def);
@@ -2640,8 +2631,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
/* gravitation */
- bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */
- //bp->force[1]-= gravity*sb->nodemass; /* individual mass of node here */
+ bp->force[2]-= gravity*bp->mass; /* individual mass of node here */
/* particle field & vortex */
@@ -2850,11 +2840,20 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f;
aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f;
+ /* old one with homogenous masses */
/* claim a minimum mass for vertex */
+ /*
if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass;
else timeovermass = forcetime/0.009999f;
+ */
for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
+/* now we have individual masses */
+/* claim a minimum mass for vertex */
+ if (bp->mass > 0.009999f) timeovermass = forcetime/bp->mass;
+ else timeovermass = forcetime/0.009999f;
+
+
if(bp->goal < SOFTGOALSNAP){
/* this makes t~ = t */
if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec);
@@ -3228,10 +3227,36 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
/* to proove the concept
this would enable per vertex *mass painting*
- strcpy(name,"SOFTMASS");
- error = get_scalar_from_named_vertexgroup(ob,name, a,&temp);
- if (!error) bp->mass = temp * ob->rangeofmass;
*/
+ /* first set the default */
+ bp->mass = sb->nodemass;
+
+ if (sb->namedVG_Mass[0])
+ {
+ int grp= get_named_vertexgroup_num (ob,sb->namedVG_Mass);
+ /* printf("VGN %s %d \n",sb->namedVG_Mass,grp); */
+ if(grp > -1){
+ get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->mass);
+ bp->mass = bp->mass * sb->nodemass;
+ /* printf("bp->mass %f \n",bp->mass); */
+
+ }
+ }
+ /* first set the default */
+ bp->springweight = 1.0f;
+
+ if (sb->namedVG_Spring_K[0])
+ {
+ int grp= get_named_vertexgroup_num (ob,sb->namedVG_Spring_K);
+ //printf("VGN %s %d \n",sb->namedVG_Spring_K,grp);
+ if(grp > -1){
+ get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->springweight);
+ //printf("bp->springweight %f \n",bp->springweight);
+
+ }
+ }
+
+
}
/* but we only optionally add body edge springs */
@@ -3533,107 +3558,6 @@ static void curve_surf_to_softbody(Scene *scene, Object *ob)
}
}
-
-static void springs_from_particles(Object *ob)
-{
- ParticleSystem *psys;
- ParticleSystemModifierData *psmd=0;
- ParticleData *pa=0;
- HairKey *key=0;
- SoftBody *sb;
- BodyPoint *bp;
- BodySpring *bs;
- int a,k;
- float hairmat[4][4];
-
- if(ob && ob->soft && ob->soft->particles) {
- psys= ob->soft->particles;
- sb= ob->soft;
- psmd = psys_get_modifier(ob, psys);
-
- bp= sb->bpoint;
- for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
- for(k=0, key=pa->hair; k<pa->totkey; k++, bp++, key++) {
- VECCOPY(bp->origS, key->co);
-
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
-
- Mat4MulVecfl(hairmat, bp->origS);
- }
- }
-
- for(a=0, bs=sb->bspring; a<sb->totspring; a++, bs++)
- bs->len= VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
- }
-}
-
-static void particles_to_softbody(Scene *scene, Object *ob)
-{
- SoftBody *sb;
- BodyPoint *bp;
- BodySpring *bs;
- ParticleData *pa;
- HairKey *key;
- ParticleSystem *psys= ob->soft->particles;
- float goalfac;
- int a, k, curpoint;
- int totpoint= psys_count_keys(psys);
- int totedge= totpoint-psys->totpart;
-
- /* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
- renew_softbody(scene, ob, totpoint, totedge);
-
- /* find first BodyPoint index for each particle */
- if(psys->totpart > 0) {
- psys->particles->bpi = 0;
- for(a=1, pa=psys->particles+1; a<psys->totpart; a++, pa++)
- pa->bpi = (pa-1)->bpi + (pa-1)->totkey;
- }
-
- /* we always make body points */
- sb= ob->soft;
- bp= sb->bpoint;
- bs= sb->bspring;
- goalfac= ABS(sb->maxgoal - sb->mingoal);
-
- if((ob->softflag & OB_SB_GOAL)) {
- for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
- for(k=0, key=pa->hair; k<pa->totkey; k++,bp++,key++) {
- if(k) {
- bp->goal= key->weight;
- bp->goal= sb->mingoal + bp->goal*goalfac;
- bp->goal= (float)pow(bp->goal, 4.0f);
- }
- else{
- /* hair roots are allways fixed fully to goal */
- bp->goal= 1.0f;
- }
- }
- }
- }
-
- bp= sb->bpoint;
- curpoint=0;
- for(a=0, pa=psys->particles; a<psys->totpart; a++, curpoint++, pa++) {
- for(k=0; k<pa->totkey-1; k++,bs++,curpoint++) {
- bs->v1=curpoint;
- bs->v2=curpoint+1;
- bs->strength= 1.0;
- bs->order=1;
- }
- }
-
- build_bps_springlist(ob); /* scan for springs attached to bodypoints ONCE */
- /* insert *other second order* springs if desired */
- if(sb->secondspring > 0.0000001f) {
- add_2nd_order_springs(ob,sb->secondspring*10.0); /* exploits the the first run of build_bps_springlist(ob);*/
- build_bps_springlist(ob); /* yes we need to do it again*/
- }
- springs_from_particles(ob); /* write the 'rest'-lenght of the springs */
- if(ob->softflag & OB_SB_SELF)
- calculate_collision_balls(ob);
-}
-
/* copies softbody result back in object */
static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, int local)
{
@@ -3650,66 +3574,6 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts,
}
}
-void sbWriteCache(Object *ob, int framenr)
-{
- SoftBody *sb= ob->soft;
- BodyPoint *bp;
- PTCacheID pid;
- PTCacheFile *pf;
- int a;
-
- if(sb->totpoint == 0)
- return;
-
- BKE_ptcache_id_from_softbody(&pid, ob, sb);
- pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_WRITE, framenr);
- if(!pf)
- return;
-
- for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
- BKE_ptcache_file_write_floats(pf, bp->pos, 3);
-
- for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
- BKE_ptcache_file_write_floats(pf, bp->vec, 3);
-
- BKE_ptcache_file_close(pf);
-}
-
-static int softbody_read_cache(Object *ob, float framenr)
-{
- SoftBody *sb= ob->soft;
- BodyPoint *bp;
- PTCacheID pid;
- PTCacheFile *pf;
- int a;
-
- if(sb->totpoint == 0)
- return 0;
-
- BKE_ptcache_id_from_softbody(&pid, ob, sb);
- pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_READ, framenr);
- if(!pf)
- return 0;
-
- for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) {
- if(!BKE_ptcache_file_read_floats(pf, bp->pos, 3)) {
- BKE_ptcache_file_close(pf);
- return 0;
- }
- }
-
- for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) {
- if(!BKE_ptcache_file_read_floats(pf, bp->vec, 3)) {
- BKE_ptcache_file_close(pf);
- return 0;
- }
- }
-
- BKE_ptcache_file_close(pf);
-
- return 1;
-}
-
/* +++ ************ maintaining scratch *************** */
static void sb_new_scratch(SoftBody *sb)
{
@@ -3769,7 +3633,7 @@ SoftBody *sbNew(Scene *scene)
sb->shearstiff = 1.0f;
sb->solverflags |= SBSO_OLDERR;
- sb->pointcache = BKE_ptcache_add();
+ sb->pointcache = BKE_ptcache_add(&sb->ptcaches);
return sb;
}
@@ -3778,7 +3642,8 @@ SoftBody *sbNew(Scene *scene)
void sbFree(SoftBody *sb)
{
free_softbody_intern(sb);
- BKE_ptcache_free(sb->pointcache);
+ BKE_ptcache_free_list(&sb->ptcaches);
+ sb->pointcache = NULL;
MEM_freeN(sb);
}
@@ -3816,44 +3681,16 @@ void sbSetInterruptCallBack(int (*f)(void))
static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCos)[3], int numVerts)
{
- ParticleSystemModifierData *psmd= NULL;
- ParticleData *pa= NULL;
- HairKey *key= NULL;
BodyPoint *bp;
- float hairmat[4][4];
int a;
- /* update the vertex locations */
- if(sb->particles && sb->particles->totpart>0) {
- psmd= psys_get_modifier(ob,sb->particles);
-
- pa= sb->particles->particles;
- key= pa->hair;
-
- psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
- }
-
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
/* store where goals are now */
VECCOPY(bp->origS, bp->origE);
/* copy the position of the goals at desired end time */
- if(sb->particles) {
- if(key == pa->hair + pa->totkey) {
- pa++;
- key = pa->hair;
-
- psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
- }
- VECCOPY(bp->origE, key->co);
- Mat4MulVecfl(hairmat,bp->origE);
-
- key++;
- }
- else{
- VECCOPY(bp->origE, vertexCos[a]);
- /* vertexCos came from local world, go global */
- Mat4MulVecfl(ob->obmat, bp->origE);
- }
+ VECCOPY(bp->origE, vertexCos[a]);
+ /* vertexCos came from local world, go global */
+ Mat4MulVecfl(ob->obmat, bp->origE);
/* just to be save give bp->origT a defined value
will be calulated in interpolate_exciter()*/
VECCOPY(bp->origT, bp->origE);
@@ -3862,37 +3699,12 @@ static void softbody_update_positions(Object *ob, SoftBody *sb, float (*vertexCo
static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int numVerts)
{
- ParticleSystemModifierData *psmd= NULL;
- HairKey *key= NULL;
- ParticleData *pa= NULL;
BodyPoint *bp;
- float hairmat[4][4];
int a;
- if(sb->particles && sb->particles->totpart>0) {
- psmd= psys_get_modifier(ob, sb->particles);
- pa= sb->particles->particles;
- key= pa->hair;
-
- psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
- }
-
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
- if(sb->particles) {
- if(key == pa->hair + pa->totkey) {
- pa++;
- key = pa->hair;
-
- psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
- }
- VECCOPY(bp->pos, key->co);
- Mat4MulVecfl(hairmat, bp->pos);
- key++;
- }
- else {
- VECCOPY(bp->pos, vertexCos[a]);
- Mat4MulVecfl(ob->obmat, bp->pos); /* yep, sofbody is global coords*/
- }
+ VECCOPY(bp->pos, vertexCos[a]);
+ Mat4MulVecfl(ob->obmat, bp->pos); /* yep, sofbody is global coords*/
VECCOPY(bp->origS, bp->pos);
VECCOPY(bp->origE, bp->pos);
VECCOPY(bp->origT, bp->pos);
@@ -3921,20 +3733,18 @@ static void softbody_reset(Object *ob, SoftBody *sb, float (*vertexCos)[3], int
sb_new_scratch(sb); /* make a new */
sb->scratch->needstobuildcollider=1;
- if((sb->particles)==0) {
- /* copy some info to scratch */
- switch(ob->type) {
- case OB_MESH:
- if (ob->softflag & OB_SB_FACECOLL) mesh_faces_to_scratch(ob);
- break;
- case OB_LATTICE:
- break;
- case OB_CURVE:
- case OB_SURF:
- break;
- default:
- break;
- }
+ /* copy some info to scratch */
+ switch(ob->type) {
+ case OB_MESH:
+ if (ob->softflag & OB_SB_FACECOLL) mesh_faces_to_scratch(ob);
+ break;
+ case OB_LATTICE:
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ break;
+ default:
+ break;
}
}
@@ -4070,13 +3880,12 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
/* simulates one step. framenr is in frames */
void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], int numVerts)
{
- ParticleSystemModifierData *psmd=0;
- ParticleData *pa=0;
SoftBody *sb= ob->soft;
PointCache *cache;
PTCacheID pid;
float dtime, timescale;
int framedelta, framenr, startframe, endframe;
+ int cache_result;
cache= sb->pointcache;
@@ -4091,7 +3900,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
if(sb->bpoint && numVerts != sb->totpoint) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
-
+ cache->last_exact= 0;
return;
}
@@ -4099,6 +3908,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
if(framenr < startframe) {
cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ //cache->last_exact= 0;
return;
}
@@ -4110,25 +3920,20 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
if(sb->bpoint == NULL ||
((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) {
- if(sb->particles){
- particles_to_softbody(scene, ob);
- }
- else {
- switch(ob->type) {
- case OB_MESH:
- mesh_to_softbody(scene, ob);
- break;
- case OB_LATTICE:
- lattice_to_softbody(scene, ob);
- break;
- case OB_CURVE:
- case OB_SURF:
- curve_surf_to_softbody(scene, ob);
- break;
- default:
- renew_softbody(scene, ob, numVerts, 0);
- break;
- }
+ switch(ob->type) {
+ case OB_MESH:
+ mesh_to_softbody(scene, ob);
+ break;
+ case OB_LATTICE:
+ lattice_to_softbody(scene, ob);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ curve_surf_to_softbody(scene, ob);
+ break;
+ default:
+ renew_softbody(scene, ob, numVerts, 0);
+ break;
}
softbody_update_positions(ob, sb, vertexCos, numVerts);
@@ -4146,8 +3951,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
softbody_update_positions(ob, sb, vertexCos, numVerts);
softbody_step(scene, ob, sb, dtime);
- if(sb->particles==0)
- softbody_to_object(ob, vertexCos, numVerts, 0);
+ softbody_to_object(ob, vertexCos, numVerts, 0);
return;
}
@@ -4155,68 +3959,60 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
/* still no points? go away */
if(sb->totpoint==0) return;
- if(sb->particles){
- psmd= psys_get_modifier(ob, sb->particles);
- pa= sb->particles->particles;
+ if(framenr == startframe) {
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+
+ /* first frame, no simulation to do, just set the positions */
+ softbody_update_positions(ob, sb, vertexCos, numVerts);
+
+ cache->simframe= framenr;
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ return;
}
/* try to read from cache */
- if(softbody_read_cache(ob, framenr)) {
- if(sb->particles==0)
- softbody_to_object(ob, vertexCos, numVerts, sb->local);
+ cache_result = BKE_ptcache_read_cache(&pid, framenr, scene->r.frs_sec);
+
+ if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
+ softbody_to_object(ob, vertexCos, numVerts, sb->local);
- cache->flag |= PTCACHE_SIMULATION_VALID;
cache->simframe= framenr;
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+
+ if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
+ BKE_ptcache_write_cache(&pid, framenr);
return;
}
+ else if(cache_result==PTCACHE_READ_OLD) {
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ }
else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
/* if baked and nothing in cache, do nothing */
- if(cache->flag & PTCACHE_SIMULATION_VALID) {
- cache->flag &= ~PTCACHE_SIMULATION_VALID;
- cache->simframe= 0;
- }
-
+ cache->flag &= ~PTCACHE_SIMULATION_VALID;
+ cache->simframe= 0;
+ cache->last_exact= 0;
return;
}
- if(framenr == startframe) {
- /* first frame, no simulation to do, just set the positions */
- softbody_update_positions(ob, sb, vertexCos, numVerts);
+ /* 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);
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe= framenr;
+ softbody_update_positions(ob, sb, vertexCos, numVerts);
- /* don't write cache on first frame, but on second frame write
- * cache for frame 1 and 2 */
- }
- else if(framedelta == 1) {
- /* if on second frame, write cache for first frame */
- if(framenr == startframe+1)
- sbWriteCache(ob, startframe);
+ /* checking time: */
+ dtime = framedelta*timescale;
- softbody_update_positions(ob, sb, vertexCos, numVerts);
+ softbody_step(scene, ob, sb, dtime);
- /* do simulation */
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe= framenr;
-
- /* checking time: */
- dtime = framedelta*timescale;
-
- softbody_step(scene, ob, sb, dtime);
+ softbody_to_object(ob, vertexCos, numVerts, 0);
- if(sb->particles==0)
- softbody_to_object(ob, vertexCos, numVerts, 0);
+ /* do simulation */
+ cache->simframe= framenr;
+ cache->flag |= PTCACHE_SIMULATION_VALID;
- sbWriteCache(ob, framenr);
- }
- else {
- /* time step backwards or too large forward - do nothing */
- if(cache->flag & PTCACHE_SIMULATION_VALID) {
- cache->flag &= ~PTCACHE_SIMULATION_VALID;
- cache->simframe= 0;
- }
- }
+ BKE_ptcache_write_cache(&pid, framenr);
}
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 2c5b49246fb..c6c4a776faf 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -1,6 +1,6 @@
/**
* sound.c (mar-2001 nzc)
- *
+ *
* $Id$
*/
@@ -14,125 +14,470 @@
#include "DNA_scene_types.h"
#include "DNA_sound_types.h"
#include "DNA_packedFile_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+
+#include "AUD_C-API.h"
#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_sound.h"
+#include "BKE_context.h"
+#include "BKE_library.h"
#include "BKE_packedFile.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-ListBase _samples = {0,0}, *samples = &_samples;
+void sound_init()
+{
+ AUD_Specs specs;
+ int device, buffersize;
+
+ device = U.audiodevice;
+ buffersize = U.mixbufsize;
+ specs.channels = U.audiochannels;
+ specs.format = U.audioformat;
+ specs.rate = U.audiorate;
+
+ if(buffersize < 128)
+ buffersize = AUD_DEFAULT_BUFFER_SIZE;
+
+ if(specs.rate < AUD_RATE_8000)
+ specs.rate = AUD_RATE_44100;
+
+ if(specs.format <= AUD_FORMAT_INVALID)
+ specs.format = AUD_FORMAT_S16;
+
+ if(specs.channels <= AUD_CHANNELS_INVALID)
+ specs.channels = AUD_CHANNELS_STEREO;
+
+ if(!AUD_init(device, specs, buffersize))
+ AUD_init(AUD_NULL_DEVICE, specs, buffersize);
+}
-void sound_free_sound(bSound *sound)
+void sound_exit()
{
- /* when sounds have been loaded, but not played, the packedfile was not copied
- to sample block and not freed otherwise */
- if(sound->sample==NULL) {
- if (sound->newpackedfile) {
- freePackedFile(sound->newpackedfile);
- sound->newpackedfile = NULL;
- }
+ AUD_exit();
+}
+
+struct bSound* sound_new_file(struct Main *main, char* filename)
+{
+ bSound* sound = NULL;
+
+ char str[FILE_MAX];
+ int len;
+
+ strcpy(str, filename);
+ BLI_convertstringcode(str, main->name);
+
+ len = strlen(filename);
+ while(len > 0 && filename[len-1] != '/' && filename[len-1] != '\\')
+ len--;
+
+ sound = alloc_libblock(&main->sound, ID_SO, filename+len);
+ strcpy(sound->name, filename);
+// XXX unused currently sound->type = SOUND_TYPE_FILE;
+
+ sound_load(main, sound);
+
+ if(!sound->handle)
+ {
+ free_libblock(&main->sound, sound);
+ sound = NULL;
+ }
+
+ return sound;
+}
+
+// XXX unused currently
+#if 0
+struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source)
+{
+ bSound* sound = NULL;
+
+ char name[25];
+ strcpy(name, "buf_");
+ strcpy(name + 4, source->id.name);
+
+ sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+
+ sound->child_sound = source;
+ sound->type = SOUND_TYPE_BUFFER;
+
+ sound_load(CTX_data_main(C), sound);
+
+ if(!sound->handle)
+ {
+ free_libblock(&CTX_data_main(C)->sound, sound);
+ sound = NULL;
}
- if (sound->stream) free(sound->stream);
+
+ return sound;
}
-void sound_free_sample(bSample *sample)
+struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end)
{
- if (sample) {
- if (sample->data != &sample->fakedata[0] && sample->data != NULL) {
- MEM_freeN(sample->data);
- sample->data = &sample->fakedata[0];
+ bSound* sound = NULL;
+
+ char name[25];
+ strcpy(name, "lim_");
+ strcpy(name + 4, source->id.name);
+
+ sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+
+ sound->child_sound = source;
+ sound->start = start;
+ sound->end = end;
+ sound->type = SOUND_TYPE_LIMITER;
+
+ sound_load(CTX_data_main(C), sound);
+
+ if(!sound->handle)
+ {
+ free_libblock(&CTX_data_main(C)->sound, sound);
+ sound = NULL;
+ }
+
+ return sound;
+}
+#endif
+
+void sound_delete(struct bContext *C, struct bSound* sound)
+{
+ if(sound)
+ {
+ sound_free(sound);
+
+ sound_unlink(C, sound);
+
+ free_libblock(&CTX_data_main(C)->sound, sound);
+ }
+}
+
+void sound_cache(struct bSound* sound, int ignore)
+{
+ if(sound->cache && !ignore)
+ AUD_unload(sound->cache);
+
+ sound->cache = AUD_bufferSound(sound->handle);
+ sound->changed++;
+}
+
+void sound_delete_cache(struct bSound* sound)
+{
+ if(sound->cache)
+ {
+ AUD_unload(sound->cache);
+ sound->cache = NULL;
+ }
+}
+
+void sound_load(struct Main *main, struct bSound* sound)
+{
+ if(sound)
+ {
+ if(sound->handle)
+ {
+ AUD_unload(sound->handle);
+ sound->handle = NULL;
+ }
+
+// XXX unused currently
+#if 0
+ switch(sound->type)
+ {
+ case SOUND_TYPE_FILE:
+#endif
+ {
+ char fullpath[FILE_MAX];
+ char *path;
+
+ /* load sound */
+ PackedFile* pf = sound->packedfile;
+
+ /* dont modify soundact->sound->name, only change a copy */
+ BLI_strncpy(fullpath, sound->name, sizeof(fullpath));
+
+ if(sound->id.lib)
+ path = sound->id.lib->filename;
+ else
+ path = main ? main->name : G.sce;
+
+ BLI_convertstringcode(fullpath, path);
+
+ /* but we need a packed file then */
+ if (pf)
+ sound->handle = AUD_loadBuffer((unsigned char*) pf->data, pf->size);
+ /* or else load it from disk */
+ else
+ sound->handle = AUD_load(fullpath);
+ } // XXX
+// XXX unused currently
+#if 0
+ break;
}
-
- if (sample->packedfile) {
- freePackedFile(sample->packedfile); //FIXME: crashes sometimes
- sample->packedfile = NULL;
+ case SOUND_TYPE_BUFFER:
+ if(sound->child_sound && sound->child_sound->handle)
+ sound->handle = AUD_bufferSound(sound->child_sound->handle);
+ break;
+ case SOUND_TYPE_LIMITER:
+ if(sound->child_sound && sound->child_sound->handle)
+ sound->handle = AUD_limitSound(sound->child_sound, sound->start, sound->end);
+ break;
}
-
- if (sample->alindex != SAMPLE_INVALID) {
-// AUD_free_sample(sample->snd_sample);
- sample->alindex = SAMPLE_INVALID;
+#endif
+ sound->changed++;
+ }
+}
+
+void sound_free(struct bSound* sound)
+{
+ if (sound->packedfile)
+ {
+ freePackedFile(sound->packedfile);
+ sound->packedfile = NULL;
+ }
+
+ if(sound->handle)
+ {
+ AUD_unload(sound->handle);
+ sound->handle = NULL;
+ }
+}
+
+void sound_unlink(struct bContext *C, struct bSound* sound)
+{
+ Scene *scene;
+ SoundHandle *handle;
+
+// XXX unused currently
+#if 0
+ bSound *snd;
+ for(snd = CTX_data_main(C)->sound.first; snd; snd = snd->id.next)
+ {
+ if(snd->child_sound == sound)
+ {
+ snd->child_sound = NULL;
+ if(snd->handle)
+ {
+ AUD_unload(sound->handle);
+ snd->handle = NULL;
+ }
+
+ sound_unlink(C, snd);
}
+ }
+#endif
- sample->type = SAMPLE_INVALID;
+ for(scene = CTX_data_main(C)->scene.first; scene; scene = scene->id.next)
+ {
+ for(handle = scene->sound_handles.first; handle; handle = handle->next)
+ {
+ if(handle->source == sound)
+ {
+ handle->source = NULL;
+ if(handle->handle)
+ AUD_stop(handle->handle);
+ }
+ }
}
}
-/* this is called after file reading or undos */
-void sound_free_all_samples(void)
+struct SoundHandle* sound_new_handle(struct Scene *scene, struct bSound* sound, int startframe, int endframe, int frameskip)
+{
+ ListBase* handles = &scene->sound_handles;
+
+ SoundHandle* handle = MEM_callocN(sizeof(SoundHandle), "sound_handle");
+ handle->source = sound;
+ handle->startframe = startframe;
+ handle->endframe = endframe;
+ handle->frameskip = frameskip;
+ handle->state = AUD_STATUS_INVALID;
+ handle->volume = 1.0f;
+
+ BLI_addtail(handles, handle);
+
+ return handle;
+}
+
+void sound_delete_handle(struct Scene *scene, struct SoundHandle *handle)
{
- bSample *sample;
- bSound *sound;
-
- /* ensure no sample pointers exist, and check packedfile */
- for(sound= G.main->sound.first; sound; sound= sound->id.next) {
- if(sound->sample && sound->sample->packedfile==sound->newpackedfile)
- sound->newpackedfile= NULL;
- sound->sample= NULL;
+ if(handle == NULL)
+ return;
+
+ if(handle->handle)
+ AUD_stop(handle->handle);
+
+ BLI_freelinkN(&scene->sound_handles, handle);
+}
+
+void sound_stop_all(struct bContext *C)
+{
+ SoundHandle *handle;
+
+ for(handle = CTX_data_scene(C)->sound_handles.first; handle; handle = handle->next)
+ {
+ if(handle->state == AUD_STATUS_PLAYING)
+ {
+ AUD_pause(handle->handle);
+ handle->state = AUD_STATUS_PAUSED;
+ }
}
-
- /* now free samples */
- for(sample= samples->first; sample; sample= sample->id.next)
- sound_free_sample(sample);
- BLI_freelistN(samples);
-
-}
-
-void sound_set_packedfile(bSample *sample, PackedFile *pf)
-{
- bSound *sound;
-
- if (sample) {
- sample->packedfile = pf;
- sound = G.main->sound.first;
- while (sound) {
- if (sound->sample == sample) {
- sound->newpackedfile = pf;
- if (pf == NULL) {
- strcpy(sound->name, sample->name);
+}
+
+void sound_update_playing(struct bContext *C)
+{
+ SoundHandle *handle;
+ Scene* scene = CTX_data_scene(C);
+ int cfra = CFRA;
+ float fps = FPS;
+ int action;
+
+ AUD_lock();
+
+ for(handle = scene->sound_handles.first; handle; handle = handle->next)
+ {
+ if(cfra < handle->startframe || cfra >= handle->endframe || handle->mute || (scene->audio.flag & AUDIO_MUTE))
+ {
+ if(handle->state == AUD_STATUS_PLAYING)
+ {
+ AUD_pause(handle->handle);
+ handle->state = AUD_STATUS_PAUSED;
+ }
+ }
+ else
+ {
+ action = 0;
+
+ if(handle->changed != handle->source->changed)
+ {
+ handle->changed = handle->source->changed;
+ action = 3;
+ if(handle->state != AUD_STATUS_INVALID)
+ {
+ AUD_stop(handle->handle);
+ handle->state = AUD_STATUS_INVALID;
+ }
+ }
+ else
+ {
+ if(handle->state != AUD_STATUS_PLAYING)
+ action = 3;
+ else
+ {
+ handle->state = AUD_getStatus(handle->handle);
+ if(handle->state != AUD_STATUS_PLAYING)
+ action = 3;
+ else
+ {
+ float diff = AUD_getPosition(handle->handle) * fps - cfra + handle->startframe;
+ if(diff < 0.0)
+ diff = -diff;
+ if(diff > FPS/2.0)
+ {
+ action = 2;
+ }
+ }
+ }
+ }
+
+ if(action & 1)
+ {
+ if(handle->state == AUD_STATUS_INVALID)
+ {
+ if(handle->source && handle->source->handle)
+ {
+ AUD_Sound* limiter = AUD_limitSound(handle->source->cache ? handle->source->cache : handle->source->handle, handle->frameskip / fps, (handle->frameskip + handle->endframe - handle->startframe)/fps);
+ handle->handle = AUD_play(limiter, 1);
+ AUD_unload(limiter);
+ if(handle->handle)
+ handle->state = AUD_STATUS_PLAYING;
+ if(cfra == handle->startframe)
+ action &= ~2;
+ }
}
+ else
+ if(AUD_resume(handle->handle))
+ handle->state = AUD_STATUS_PLAYING;
+ else
+ handle->state = AUD_STATUS_INVALID;
}
- sound = sound->id.next;
+
+ if(action & 2)
+ AUD_seek(handle->handle, (cfra - handle->startframe) / fps);
}
}
+
+ AUD_unlock();
}
-PackedFile* sound_find_packedfile(bSound *sound)
-{
- bSound *search;
- PackedFile *pf = NULL;
- char soundname[FILE_MAXDIR + FILE_MAXFILE], searchname[FILE_MAXDIR + FILE_MAXFILE];
-
- // convert sound->name to abolute filename
- strcpy(soundname, sound->name);
- BLI_convertstringcode(soundname, G.sce);
-
- search = G.main->sound.first;
- while (search) {
- if (search->sample && search->sample->packedfile) {
- strcpy(searchname, search->sample->name);
- BLI_convertstringcode(searchname, G.sce);
-
- if (BLI_streq(searchname, soundname)) {
- pf = search->sample->packedfile;
- break;
+void sound_scrub(struct bContext *C)
+{
+ SoundHandle *handle;
+ Scene* scene = CTX_data_scene(C);
+ int cfra = CFRA;
+ float fps = FPS;
+
+ if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
+ {
+ AUD_lock();
+
+ for(handle = scene->sound_handles.first; handle; handle = handle->next)
+ {
+ if(cfra >= handle->startframe && cfra < handle->endframe && !handle->mute)
+ {
+ if(handle->source && handle->source->handle)
+ {
+ int frameskip = handle->frameskip + cfra - handle->startframe;
+ AUD_Sound* limiter = AUD_limitSound(handle->source->cache ? handle->source->cache : handle->source->handle, frameskip / fps, (frameskip + 1)/fps);
+ AUD_play(limiter, 0);
+ AUD_unload(limiter);
+ }
}
- }
-
- if (search->newpackedfile) {
- strcpy(searchname, search->name);
- BLI_convertstringcode(searchname, G.sce);
- if (BLI_streq(searchname, soundname)) {
- pf = search->newpackedfile;
- break;
+ }
+
+ AUD_unlock();
+ }
+}
+
+AUD_Device* sound_mixdown(struct Scene *scene, AUD_Specs specs, int start, int end, float volume)
+{
+ AUD_Device* mixdown = AUD_openReadDevice(specs);
+ SoundHandle *handle;
+ float fps = FPS;
+ AUD_Sound *limiter, *delayer;
+ int frameskip, s, e;
+ AUD_Handle* h;
+
+ end++;
+
+ for(handle = scene->sound_handles.first; handle; handle = handle->next)
+ {
+ if(start < handle->endframe && end > handle->startframe && !handle->mute && handle->source && handle->source->handle)
+ {
+ frameskip = handle->frameskip;
+ s = handle->startframe - start;
+ e = handle->frameskip + AUD_MIN(handle->endframe, end) - handle->startframe;
+
+ if(s < 0)
+ {
+ frameskip -= s;
+ s = 0;
}
+
+ limiter = AUD_limitSound(handle->source->handle, frameskip / fps, e / fps);
+ delayer = AUD_delaySound(limiter, s / fps);
+
+ h = AUD_playDevice(mixdown, delayer);
+ AUD_setDeviceSoundVolume(mixdown, h, volume);
+
+ AUD_unload(delayer);
+ AUD_unload(limiter);
}
- search = search->id.next;
}
-
- return (pf);
+
+ return mixdown;
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 15969fc9ab9..6e95fe7ebc7 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -60,6 +60,7 @@
#include "BLI_edgehash.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 8e3d59bbc58..8bf0f6b8bdf 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -37,14 +37,22 @@
#include "BLI_blenlib.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_controller_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "DNA_text_types.h"
-#include "BKE_utildefines.h"
-#include "BKE_text.h"
-#include "BKE_library.h"
+#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_text.h"
+#include "BKE_utildefines.h"
#ifndef DISABLE_PYTHON
#include "BPY_extern.h"
@@ -122,8 +130,10 @@ undo position
static void txt_pop_first(Text *text);
static void txt_pop_last(Text *text);
static void txt_undo_add_op(Text *text, int op);
-static void txt_undo_add_block(Text *text, int op, char *buf);
+static void txt_undo_add_block(Text *text, int op, const char *buf);
static void txt_delete_line(Text *text, TextLine *line);
+static void txt_delete_sel (Text *text);
+static void txt_make_dirty (Text *text);
/***/
@@ -451,6 +461,109 @@ Text *copy_text(Text *ta)
return tan;
}
+void unlink_text(Main *bmain, Text *text)
+{
+ bScreen *scr;
+ ScrArea *area;
+ SpaceLink *sl;
+ Scene *scene;
+ Object *ob;
+ bController *cont;
+ bConstraint *con;
+ short update;
+
+ /* dome */
+ for(scene=bmain->scene.first; scene; scene=scene->id.next)
+ if(scene->r.dometext == text)
+ scene->r.dometext = NULL;
+
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
+ /* game controllers */
+ for(cont=ob->controllers.first; cont; cont=cont->next) {
+ if(cont->type==CONT_PYTHON) {
+ bPythonCont *pc;
+
+ pc= cont->data;
+ if(pc->text==text) pc->text= NULL;
+ }
+ }
+
+ /* pyconstraints */
+ update = 0;
+
+ if(ob->type==OB_ARMATURE && ob->pose) {
+ bPoseChannel *pchan;
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for(con = pchan->constraints.first; con; con=con->next) {
+ if(con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) data->text = NULL;
+ update = 1;
+
+ }
+ }
+ }
+ }
+
+ for(con = ob->constraints.first; con; con=con->next) {
+ if(con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) data->text = NULL;
+ update = 1;
+ }
+ }
+
+ if(update)
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ }
+
+ /* pynodes */
+ // XXX nodeDynamicUnlinkText(&text->id);
+
+ /* text space */
+ for(scr= bmain->screen.first; scr; scr= scr->id.next) {
+ for(area= scr->areabase.first; area; area= area->next) {
+ for(sl= area->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_TEXT) {
+ SpaceText *st= (SpaceText*) sl;
+
+ if(st->text==text) {
+ st->text= NULL;
+ st->top= 0;
+ }
+ }
+ }
+ }
+ }
+
+ text->id.us= 0;
+}
+
+void clear_text(Text *text) /* called directly from rna */
+{
+ int oldstate;
+
+ oldstate = txt_get_undostate( );
+ txt_set_undostate( 1 );
+ txt_sel_all( text );
+ txt_delete_sel(text);
+ txt_set_undostate( oldstate );
+
+ txt_make_dirty(text);
+}
+
+void write_text(Text *text, char *str) /* called directly from rna */
+{
+ int oldstate;
+
+ oldstate = txt_get_undostate( );
+ txt_insert_buf( text, str );
+ txt_move_eof( text, 0 );
+ txt_set_undostate( oldstate );
+
+ txt_make_dirty(text);
+}
+
/*****************************/
/* Editing utility functions */
/*****************************/
@@ -483,17 +596,15 @@ static TextLine *txt_new_line(char *str)
return tmp;
}
-static TextLine *txt_new_linen(char *str, int n)
+static TextLine *txt_new_linen(const char *str, int n)
{
TextLine *tmp;
- if(!str) str= "";
-
tmp= (TextLine *) MEM_mallocN(sizeof(TextLine), "textline");
tmp->line= MEM_mallocN(n+1, "textline_string");
tmp->format= NULL;
- BLI_strncpy(tmp->line, str, n+1);
+ BLI_strncpy(tmp->line, (str)? str: "", n+1);
tmp->len= strlen(tmp->line);
tmp->next= tmp->prev= NULL;
@@ -1228,7 +1339,7 @@ char *txt_sel_to_buf (Text *text)
return buf;
}
-void txt_insert_buf(Text *text, char *in_buffer)
+void txt_insert_buf(Text *text, const char *in_buffer)
{
int i=0, l=0, j, u, len;
TextLine *add;
@@ -1457,7 +1568,7 @@ static void txt_undo_add_op(Text *text, int op)
text->undo_buf[text->undo_pos+1]= 0;
}
-static void txt_undo_add_block(Text *text, int op, char *buf)
+static void txt_undo_add_block(Text *text, int op, const char *buf)
{
int length;
@@ -2721,3 +2832,60 @@ TextMarker *txt_next_marker(Text *text, TextMarker *marker) {
}
return NULL; /* Only if marker==NULL */
}
+
+
+/*******************************/
+/* Character utility functions */
+/*******************************/
+
+int text_check_bracket(char ch)
+{
+ int a;
+ char opens[] = "([{";
+ char close[] = ")]}";
+
+ for(a=0; a<(sizeof(opens)-1); a++) {
+ if(ch==opens[a])
+ return a+1;
+ else if(ch==close[a])
+ return -(a+1);
+ }
+ return 0;
+}
+
+int text_check_delim(char ch)
+{
+ int a;
+ char delims[] = "():\"\' ~!%^&*-+=[]{};/<>|.#\t,";
+
+ for(a=0; a<(sizeof(delims)-1); a++) {
+ if(ch==delims[a])
+ return 1;
+ }
+ return 0;
+}
+
+int text_check_digit(char ch)
+{
+ if(ch < '0') return 0;
+ if(ch <= '9') return 1;
+ return 0;
+}
+
+int text_check_identifier(char ch)
+{
+ if(ch < '0') return 0;
+ if(ch <= '9') return 1;
+ if(ch < 'A') return 0;
+ if(ch <= 'Z' || ch == '_') return 1;
+ if(ch < 'a') return 0;
+ if(ch <= 'z') return 1;
+ return 0;
+}
+
+int text_check_whitespace(char ch)
+{
+ if(ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
+ return 1;
+ return 0;
+}
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 66f7fe8a44b..d7616ec8a9a 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -38,11 +38,12 @@
#include "PIL_dynlib.h"
-#include "MTC_matrixops.h"
+
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_rand.h"
+#include "BLI_kdopbvh.h"
#include "DNA_texture_types.h"
#include "DNA_key_types.h"
@@ -367,9 +368,9 @@ int do_colorband(ColorBand *coba, float in, float out[4])
CLAMP(fac, 0.0f, 1.0f);
if(coba->ipotype==3)
- set_four_ipo(fac, t, KEY_CARDINAL);
+ key_curve_position_weights(fac, t, KEY_CARDINAL);
else
- set_four_ipo(fac, t, KEY_BSPLINE);
+ key_curve_position_weights(fac, t, KEY_BSPLINE);
out[0]= t[3]*cbd3->r +t[2]*cbd2->r +t[1]*cbd1->r +t[0]*cbd0->r;
out[1]= t[3]*cbd3->g +t[2]*cbd2->g +t[1]*cbd1->g +t[0]*cbd0->g;
@@ -417,6 +418,8 @@ void free_texture(Tex *tex)
free_plugin_tex(tex->plugin);
if(tex->coba) MEM_freeN(tex->coba);
if(tex->env) BKE_free_envmap(tex->env);
+ if(tex->pd) BKE_free_pointdensity(tex->pd);
+ if(tex->vd) BKE_free_voxeldata(tex->vd);
BKE_previewimg_free(&tex->preview);
BKE_icon_delete((struct ID*)tex);
tex->id.icon_id = 0;
@@ -435,12 +438,15 @@ void default_tex(Tex *tex)
VarStruct *varstr;
int a;
+ tex->type= TEX_CLOUDS;
tex->stype= 0;
tex->flag= TEX_CHECKER_ODD;
- tex->imaflag= TEX_INTERPOL+TEX_MIPMAP+TEX_USEALPHA;
+ tex->imaflag= TEX_INTERPOL|TEX_MIPMAP|TEX_USEALPHA;
tex->extend= TEX_REPEAT;
tex->cropxmin= tex->cropymin= 0.0;
tex->cropxmax= tex->cropymax= 1.0;
+ tex->texfilter = TXF_EWA;
+ tex->afmax = 8;
tex->xrepeat= tex->yrepeat= 1;
tex->fie_ima= 2;
tex->sfra= 1;
@@ -483,6 +489,16 @@ void default_tex(Tex *tex)
tex->env->depth=0;
}
+ if (tex->pd) {
+ tex->pd->radius = 0.3f;
+ tex->pd->falloff_type = TEX_PD_FALLOFF_STD;
+ }
+
+ if (tex->vd) {
+ tex->vd->resol[0] = tex->vd->resol[1] = tex->vd->resol[2] = 0;
+ tex->vd->interp_type=TEX_VD_LINEAR;
+ tex->vd->file_format=TEX_VD_SMOKE;
+ }
pit = tex->plugin;
if (pit) {
varstr= pit->varstr;
@@ -531,7 +547,7 @@ void default_mtex(MTex *mtex)
mtex->size[1]= 1.0;
mtex->size[2]= 1.0;
mtex->tex= 0;
- mtex->texflag= 0;
+ mtex->texflag= MTEX_NEW_BUMP;
mtex->colormodel= 0;
mtex->r= 1.0;
mtex->g= 0.0;
@@ -540,7 +556,7 @@ void default_mtex(MTex *mtex)
mtex->def_var= 1.0;
mtex->blendtype= MTEX_BLEND;
mtex->colfac= 1.0;
- mtex->norfac= 0.5;
+ mtex->norfac= 1.0;
mtex->varfac= 1.0;
mtex->dispfac=0.2;
mtex->normapspace= MTEX_NSPACE_TANGENT;
@@ -734,9 +750,9 @@ void make_local_texture(Tex *tex)
void autotexname(Tex *tex)
{
- char texstr[20][12]= {"None" , "Clouds" , "Wood", "Marble", "Magic" , "Blend",
+ char texstr[20][15]= {"None" , "Clouds" , "Wood", "Marble", "Magic" , "Blend",
"Stucci", "Noise" , "Image", "Plugin", "EnvMap" , "Musgrave",
- "Voronoi", "DistNoise", "", "", "", "", "", ""};
+ "Voronoi", "DistNoise", "Point Density", "Voxel Data", "", "", "", ""};
Image *ima;
char di[FILE_MAXDIR], fi[FILE_MAXFILE];
@@ -784,7 +800,7 @@ Tex *give_current_texture(Object *ob, int act)
if(act>ob->totcol) act= ob->totcol;
else if(act==0) act= 1;
- if( BTST(ob->colbits, act-1) ) { /* in object */
+ if(ob->matbits[act-1]) { /* in object */
ma= ob->mat[act-1];
}
else { /* in data */
@@ -885,6 +901,106 @@ void BKE_free_envmap(EnvMap *env)
}
/* ------------------------------------------------------------------------- */
+
+PointDensity *BKE_add_pointdensity(void)
+{
+ PointDensity *pd;
+
+ pd= MEM_callocN(sizeof(PointDensity), "pointdensity");
+ pd->flag = 0;
+ pd->radius = 0.3f;
+ pd->falloff_type = TEX_PD_FALLOFF_STD;
+ pd->falloff_softness = 2.0;
+ pd->source = TEX_PD_PSYS;
+ pd->point_tree = NULL;
+ pd->point_data = NULL;
+ pd->noise_size = 0.5f;
+ pd->noise_depth = 1;
+ pd->noise_fac = 1.0f;
+ pd->noise_influence = TEX_PD_NOISE_STATIC;
+ pd->coba = add_colorband(1);
+ pd->speed_scale = 1.0f;
+ pd->totpoints = 0;
+ pd->coba = add_colorband(1);
+ pd->object = NULL;
+ pd->psys = NULL;
+ return pd;
+}
+
+PointDensity *BKE_copy_pointdensity(PointDensity *pd)
+{
+ PointDensity *pdn;
+
+ pdn= MEM_dupallocN(pd);
+ pdn->point_tree = NULL;
+ pdn->point_data = NULL;
+ if(pdn->coba) pdn->coba= MEM_dupallocN(pdn->coba);
+
+ return pdn;
+}
+
+void BKE_free_pointdensitydata(PointDensity *pd)
+{
+ if (pd->point_tree) {
+ BLI_bvhtree_free(pd->point_tree);
+ pd->point_tree = NULL;
+ }
+ if (pd->point_data) {
+ MEM_freeN(pd->point_data);
+ pd->point_data = NULL;
+ }
+ if(pd->coba) MEM_freeN(pd->coba);
+}
+
+void BKE_free_pointdensity(PointDensity *pd)
+{
+ BKE_free_pointdensitydata(pd);
+ MEM_freeN(pd);
+}
+
+
+void BKE_free_voxeldatadata(struct VoxelData *vd)
+{
+ if (vd->dataset) {
+ MEM_freeN(vd->dataset);
+ vd->dataset = NULL;
+ }
+
+}
+
+void BKE_free_voxeldata(struct VoxelData *vd)
+{
+ BKE_free_voxeldatadata(vd);
+ MEM_freeN(vd);
+}
+
+struct VoxelData *BKE_add_voxeldata(void)
+{
+ VoxelData *vd;
+
+ vd= MEM_callocN(sizeof(struct VoxelData), "voxeldata");
+ vd->dataset = NULL;
+ vd->resol[0] = vd->resol[1] = vd->resol[2] = 1;
+ vd->interp_type= TEX_VD_LINEAR;
+ vd->file_format= TEX_VD_SMOKE;
+ vd->int_multiplier = 1.0;
+ vd->object = NULL;
+
+ return vd;
+ }
+
+struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd)
+{
+ VoxelData *vdn;
+
+ vdn= MEM_dupallocN(vd);
+ vdn->dataset = NULL;
+
+ return vdn;
+}
+
+
+/* ------------------------------------------------------------------------- */
int BKE_texture_dependsOnTime(const struct Tex *texture)
{
if(texture->plugin) {
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
new file mode 100644
index 00000000000..1f72c894cc8
--- /dev/null
+++ b/source/blender/blenkernel/intern/unit.c
@@ -0,0 +1,585 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+
+#if defined(WIN32) && (!(defined snprintf))
+#define snprintf _snprintf
+#endif
+
+#define TEMP_STR_SIZE 256
+
+#define SEP_CHR '#'
+#define SEP_STR "#"
+
+#define EUL 0.000001
+
+
+/* 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; /* can be NULL */
+
+ char *name_display; /* can be NULL */
+
+ double scalar;
+ double bias; /* not used yet, needed for converting temperature */
+ int flag;
+} bUnitDef;
+
+#define B_UNIT_DEF_NONE 0
+#define B_UNIT_DEF_SUPPRESS 1 /* Use for units that are not used enough to be translated into for common use */
+
+/* define a single unit */
+typedef struct bUnitCollection {
+ struct bUnitDef *units;
+ int base_unit; /* use for 0.0, or none given */
+ int flag; /* options for this system */
+ int length; /* to quickly find the last item */
+} bUnitCollection;
+
+/* Dummy */
+static struct bUnitDef buDummyDef[] = {
+ {"", NULL, "", NULL, NULL, 1.0, 0.0},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buDummyCollecton = {buDummyDef, 0, 0, sizeof(buDummyDef)};
+
+
+/* Lengths */
+static struct bUnitDef buMetricLenDef[] = {
+ {"kilometer", "kilometers", "km", NULL, "Kilometers", 1000.0, 0.0, B_UNIT_DEF_NONE},
+ {"hectometer", "hectometers", "hm", NULL, "100 Meters", 100.0, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"dekameter", "dekameters", "dkm",NULL, "10 Meters", 10.0, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"meter", "meters", "m", NULL, "Meters", 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"decimetre", "decimetres", "dm", NULL, "10 Centimeters", 0.1, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"centimeter", "centimeters", "cm", NULL, "Centimeters", 0.01, 0.0, B_UNIT_DEF_NONE},
+ {"millimeter", "millimeters", "mm", NULL, "Millimeters", 0.001, 0.0, B_UNIT_DEF_NONE},
+ {"micrometer", "micrometers", "um", "µm", "Micrometers", 0.000001, 0.0, B_UNIT_DEF_NONE}, // micron too?
+
+ /* These get displayed because of float precision problems in the transform header,
+ * could work around, but for now probably people wont use these */
+ /*
+ {"nanometer", "Nanometers", "nm", NULL, 0.000000001, 0.0, B_UNIT_DEF_NONE},
+ {"picometer", "Picometers", "pm", NULL, 0.000000000001, 0.0,B_UNIT_DEF_NONE},
+ */
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricLenCollecton = {buMetricLenDef, 3, 0, sizeof(buMetricLenDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialLenDef[] = {
+ {"mile", "miles", "mi", "m", "Miles", 1609.344, 0.0, B_UNIT_DEF_NONE},
+ {"furlong", "furlongs", "fur", NULL, "Furlongs",201.168, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"chain", "chains", "ch", NULL, "Chains", 0.9144*22.0, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"yard", "yards", "yd", NULL, "Yards", 0.9144, 0.0, B_UNIT_DEF_NONE},
+ {"foot", "feet", "'", "ft", "Feet", 0.3048, 0.0, B_UNIT_DEF_NONE},
+ {"inch", "inches", "\"", "in", "Inches", 0.0254, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"thou", "thous", "mil", NULL, "Thous", 0.0000254, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialLenCollecton = {buImperialLenDef, 4, 0, sizeof(buImperialLenDef)/sizeof(bUnitDef)};
+
+
+/* Time */
+static struct bUnitDef buNaturalTimeDef[] = {
+ /* weeks? - probably not needed for blender */
+ {"day", "days", "d", NULL, "Days", 90000.0, 0.0, B_UNIT_DEF_NONE},
+ {"hour", "hours", "hr", "h", "Hours", 3600.0, 0.0, B_UNIT_DEF_NONE},
+ {"minute", "minutes", "min", "m", "Minutes", 60.0, 0.0, B_UNIT_DEF_NONE},
+ {"second", "seconds", "sec", "s", "Seconds", 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"millisecond", "milliseconds", "ms", NULL, "Milliseconds", 0.001, 0.0 , B_UNIT_DEF_NONE},
+ {"microsecond", "microseconds", "us", NULL, "Microseconds", 0.000001, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0, sizeof(buNaturalTimeDef)/sizeof(bUnitDef)};
+
+#define UNIT_SYSTEM_MAX 3
+static struct bUnitCollection *bUnitSystems[][8] = {
+ {0,0,0,0,0,0,0,0},
+ {0,&buMetricLenCollecton, 0,0,0,0, &buNaturalTimeCollecton,0}, /* metric */
+ {0,&buImperialLenCollecton, 0,0,0,0, &buNaturalTimeCollecton,0}, /* imperial */
+ {0,0,0,0,0,0,0,0}
+};
+
+/* internal, has some option not exposed */
+static bUnitCollection *unit_get_system(int system, int type)
+{
+ return bUnitSystems[system][type]; /* select system to use, metric/imperial/other? */
+}
+
+static bUnitDef *unit_default(bUnitCollection *usys)
+{
+ return &usys->units[usys->base_unit];
+}
+
+static bUnitDef *unit_best_fit(double value, bUnitCollection *usys, bUnitDef *unit_start, int suppress)
+{
+ bUnitDef *unit;
+ double value_abs= value>0.0?value:-value;
+
+ for(unit= unit_start ? unit_start:usys->units; unit->name; unit++) {
+
+ if(suppress && (unit->flag & B_UNIT_DEF_SUPPRESS))
+ continue;
+
+ if (value_abs >= unit->scalar*(1.0-EUL)) /* scale down scalar so 1cm doesnt convert to 10mm because of float error */
+ return unit;
+ }
+
+ return unit_default(usys);
+}
+
+
+
+/* convert into 2 units and 2 values for "2ft, 3inch" syntax */
+static void unit_dual_convert(double value, bUnitCollection *usys,
+ bUnitDef **unit_a, bUnitDef **unit_b, double *value_a, double *value_b)
+{
+ bUnitDef *unit= unit_best_fit(value, usys, NULL, 1);
+
+ *value_a= floor(value/unit->scalar) * unit->scalar;
+ *value_b= value - (*value_a);
+
+ *unit_a= unit;
+ *unit_b= unit_best_fit(*value_b, usys, *unit_a, 1);
+}
+
+static int unit_as_string(char *str, int len_max, double value, int prec, bUnitCollection *usys,
+ /* non exposed options */
+ bUnitDef *unit, char pad)
+{
+ double value_conv;
+ int len, i;
+
+ if(unit) {
+ /* use unit without finding the best one */
+ }
+ else if(value == 0.0) {
+ /* use the default units since there is no way to convert */
+ unit= unit_default(usys);
+ }
+ else {
+ unit= unit_best_fit(value, usys, NULL, 1);
+ }
+
+ value_conv= value/unit->scalar;
+
+ /* Convert to a string */
+ {
+ char conv_str[6] = {'%', '.', '0'+prec, 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
+ len= snprintf(str, len_max, conv_str, (float)value_conv);
+
+ if(len >= len_max)
+ len= len_max;
+ }
+
+ /* Add unit prefix and strip zeros */
+
+ /* replace trailing zero's with spaces
+ * so the number is less complicated but allignment in a button wont
+ * jump about while dragging */
+ i= len-1;
+
+ while(i>0 && str[i]=='0') { /* 4.300 -> 4.3 */
+ str[i--]= pad;
+ }
+
+ if(i>0 && str[i]=='.') { /* 10. -> 10 */
+ str[i--]= pad;
+ }
+
+ /* Now add the suffix */
+ if(i<len_max) {
+ int j=0;
+ i++;
+ while(unit->name_short[j] && (i < len_max)) {
+ str[i++]= unit->name_short[j++];
+ }
+
+ if(pad) {
+ /* this loop only runs if so many zeros were removed that
+ * the unit name only used padded chars,
+ * In that case add padding for the name. */
+
+ while(i<=len+j && (i < len_max)) {
+ str[i++]= pad;
+ }
+ }
+ }
+
+ /* terminate no matter whats done with padding above */
+ if(i >= len_max)
+ i= len_max-1;
+
+ str[i] = '\0';
+ return i;
+}
+
+
+/* Used for drawing number buttons, try keep fast */
+void bUnit_AsString(char *str, int len_max, double value, int prec, int system, int type, int split, int pad)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+
+ if(usys==NULL || usys->units[0].name==NULL)
+ usys= &buDummyCollecton;
+
+ if(split) {
+ int i;
+ bUnitDef *unit_a, *unit_b;
+ double value_a, value_b;
+
+ unit_dual_convert(value, usys, &unit_a, &unit_b, &value_a, &value_b);
+
+ /* 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');
+
+ /* is there enough space for at least 1 char of the next unit? */
+ if(i+2 < len_max) {
+ str[i++]= ' ';
+
+ /* use low precision since this is a smaller unit */
+ unit_as_string(str+i, len_max-i, value_b, prec?1:0, usys, unit_b, '\0');
+ }
+ return;
+ }
+ }
+
+ unit_as_string(str, len_max, value, prec, usys, NULL, pad?' ':'\0');
+}
+
+
+static char *unit_find_str(char *str, char *substr)
+{
+ char *str_found;
+
+ if(substr && substr[0] != '\0') {
+ str_found= strstr(str, substr);
+ if(str_found) {
+ /* previous char cannot be a letter */
+ if (str_found == str || isalpha(*(str_found-1))==0) {
+ /* next char cannot be alphanum */
+ int len_name = strlen(substr);
+
+ if (!isalpha(*(str_found+len_name))) {
+ return str_found;
+ }
+ }
+ }
+
+ }
+ return NULL;
+
+}
+
+/* Note that numbers are added within brackets
+ * ") " - is used to detect numbers we added so we can detect if commas need to be added
+ *
+ * "1m1cm+2mm" - Original value
+ * "1*1#1*0.01#+2*0.001#" - Replace numbers
+ * "1*1,1*0.01 +2*0.001 " - Add comma's if ( - + * / % ^ < > ) not found in between
+ *
+ */
+
+/* not too strict, (- = * /) are most common */
+static int ch_is_op(char op)
+{
+ switch(op) {
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '|':
+ case '&':
+ case '~':
+ case '<':
+ case '>':
+ case '^':
+ case '!':
+ case '=':
+ case '%':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, char *replace_str)
+{
+ char *str_found;
+
+ if((len_max>0) && (str_found= unit_find_str(str, replace_str))) { /* XXX - investigate, does not respect len_max properly */
+ int len, len_num, len_name, len_move, found_ofs;
+
+ found_ofs = (int)(str_found-str);
+
+ len= strlen(str);
+
+ len_name = strlen(replace_str);
+ len_move= (len - (found_ofs+len_name)) + 1; /* 1+ to copy the string terminator */
+ len_num= snprintf(str_tmp, TEMP_STR_SIZE, "*%lg"SEP_STR, unit->scalar/scale_pref); /* # removed later */
+
+ if(len_num > len_max)
+ len_num= len_max;
+
+ if(found_ofs+len_num+len_move > len_max) {
+ /* can't move the whole string, move just as much as will fit */
+ len_move -= (found_ofs+len_num+len_move) - len_max;
+ }
+
+ if(len_move>0) {
+ /* resize the last part of the string */
+ memmove(str_found+len_num, str_found+len_name, len_move); /* may grow or shrink the string */
+ }
+
+ if(found_ofs+len_num > len_max) {
+ /* not even the number will fit into the string, only copy part of it */
+ len_num -= (found_ofs+len_num) - len_max;
+ }
+
+ if(len_num > 0) {
+ /* its possible none of the number could be copied in */
+ memcpy(str_found, str_tmp, len_num); /* without the string terminator */
+ }
+
+ /* since the null terminator wont be moved if the stringlen_max
+ * was not long enough to fit everything in it */
+ str[len_max-1]= '\0';
+ return found_ofs + len_num;
+ }
+ return 0;
+}
+
+static int unit_replace(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit)
+{
+ int ofs= 0;
+ ofs += unit_scale_str(str+ofs, len_max-ofs, str_tmp, scale_pref, unit, unit->name_short);
+ ofs += unit_scale_str(str+ofs, len_max-ofs, str_tmp, scale_pref, unit, unit->name_plural);
+ ofs += unit_scale_str(str+ofs, len_max-ofs, str_tmp, scale_pref, unit, unit->name_alt);
+ ofs += unit_scale_str(str+ofs, len_max-ofs, str_tmp, scale_pref, unit, unit->name);
+ return ofs;
+}
+
+static int unit_find(char *str, bUnitDef *unit)
+{
+ if (unit_find_str(str, unit->name_short)) return 1;
+ if (unit_find_str(str, unit->name_plural)) return 1;
+ if (unit_find_str(str, unit->name_alt)) return 1;
+ if (unit_find_str(str, unit->name)) return 1;
+
+ return 0;
+}
+
+/* make a copy of the string that replaces the units with numbers
+ * this is used before parsing
+ * This is only used when evaluating user input and can afford to be a bit slower
+ *
+ * This is to be used before python evaluation so..
+ * 10.1km -> 10.1*1000.0
+ * ...will be resolved by python.
+ *
+ * values will be split by a comma's
+ * 5'2" -> 5'0.0254, 2*0.3048
+ *
+ * str_prev is optional, when valid it is used to get a base unit when none is set.
+ *
+ * return true of a change was made.
+ */
+int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pref, int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+
+ bUnitDef *unit;
+ char str_tmp[TEMP_STR_SIZE];
+ int change= 0;
+
+ if(usys==NULL || usys->units[0].name==NULL) {
+ return 0;
+ }
+
+
+ { /* make lowercase */
+ int i;
+ char *ch= str;
+
+ for(i=0; (i>=len_max || *ch=='\0'); i++, ch++)
+ if((*ch>='A') && (*ch<='Z'))
+ *ch += ('a'-'A');
+ }
+
+
+ for(unit= usys->units; unit->name; unit++) {
+
+ if(unit->flag & B_UNIT_DEF_SUPPRESS)
+ continue;
+
+ /* incase there are multiple instances */
+ while(unit_replace(str, len_max, str_tmp, scale_pref, unit))
+ change= 1;
+ }
+ unit= NULL;
+
+ {
+ /* try other unit systems now, so we can evaluate imperial when metric is set for eg. */
+ bUnitCollection *usys_iter;
+ int system_iter;
+
+ for(system_iter= 1; system_iter<UNIT_SYSTEM_MAX; system_iter++) {
+ if (system_iter != system) {
+ usys_iter= unit_get_system(system_iter, type);
+ for(unit= usys_iter->units; unit->name; unit++) {
+
+ if((unit->flag & B_UNIT_DEF_SUPPRESS) == 0) {
+ int ofs = 0;
+ /* incase there are multiple instances */
+ while((ofs=unit_replace(str+ofs, len_max-ofs, str_tmp, scale_pref, unit)))
+ change= 1;
+ }
+ }
+ }
+ }
+ }
+ unit= NULL;
+
+ if(change==0) {
+ /* no units given so infer a unit from the previous string or default */
+ if(str_prev) {
+ /* see which units the original value had */
+ for(unit= usys->units; unit->name; unit++) {
+
+ if(unit->flag & B_UNIT_DEF_SUPPRESS)
+ continue;
+
+ if (unit_find(str_prev, unit))
+ break;
+ }
+ }
+
+ if(unit==NULL)
+ unit= unit_default(usys);
+
+ /* add the unit prefix and re-run, use brackets incase there was an expression given */
+ if(snprintf(str_tmp, sizeof(str_tmp), "(%s)%s", str, unit->name) < sizeof(str_tmp)) {
+ strncpy(str, str_tmp, len_max);
+ return bUnit_ReplaceString(str, len_max, NULL, scale_pref, system, type);
+ }
+ else {
+ /* snprintf would not fit into str_tmp, cant do much in this case
+ * check for this because otherwise bUnit_ReplaceString could call its self forever */
+ return 0;
+ }
+
+ }
+
+ /* replace # with commas when there is no operator between it and the next number
+ *
+ * "1*1# 3*100# * 3" -> "1 *1, 3 *100 * 3"
+ *
+ * */
+ {
+ char *str_found= str;
+ char *ch= str;
+
+ while((str_found= strchr(str_found, SEP_CHR))) {
+
+ int op_found= 0;
+ /* any operators after this?*/
+ for(ch= str_found+1; *ch!='\0'; ch++) {
+
+ if(*ch==' ' || *ch=='\t') {
+ /* do nothing */
+ }
+ else if (ch_is_op(*ch) || *ch==',') { /* found an op, no need to insert a ,*/
+ op_found= 1;
+ break;
+ }
+ else { /* found a non-op character */
+ op_found= 0;
+ break;
+ }
+ }
+
+ *str_found++ = op_found ? ' ':',';
+ }
+ }
+
+ // printf("replace %s\n", str);
+ return change;
+}
+
+
+double bUnit_ClosestScalar(double value, int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+ bUnitDef *unit;
+
+ if(usys==NULL)
+ return -1;
+
+ unit= unit_best_fit(value, usys, NULL, 1);
+ if(unit==NULL)
+ return -1;
+
+ return unit->scalar;
+}
+
+double bUnit_BaseScalar(int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+ return unit_default(usys)->scalar;
+}
+
+/* external access */
+void bUnit_GetSystem(void **usys_pt, int *len, int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+ *usys_pt= usys;
+
+ if(usys==NULL) {
+ *len= 0;
+ return;
+ }
+
+ *len= usys->length;
+}
+
+char *bUnit_GetName(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].name;
+}
+char *bUnit_GetNameDisplay(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].name_display;
+}
+
+double bUnit_GetScaler(void *usys_pt, int index)
+{
+ return ((bUnitCollection *)usys_pt)->units[index].scalar;
+}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 7fe129ed6fc..f795c147f54 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -36,7 +36,6 @@
#include "DNA_world_types.h"
#include "DNA_texture_types.h"
-#include "DNA_scriptlink_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_camera_types.h"
@@ -66,10 +65,7 @@ void free_world(World *wrld)
{
MTex *mtex;
int a;
-
-#ifndef DISABLE_PYTHON
- BPY_free_scriptlink(&wrld->scriptlink);
-#endif
+
for(a=0; a<MAX_MTEX; a++) {
mtex= wrld->mtex[a];
if(mtex && mtex->tex) mtex->tex->id.us--;
@@ -94,7 +90,6 @@ World *add_world(char *name)
wrld->skytype= WO_SKYBLEND;
wrld->stardist= 15.0f;
wrld->starsize= 2.0f;
- wrld->gravity= 9.8f;
wrld->exp= 0.0f;
wrld->exposure=wrld->range= 1.0f;
@@ -106,14 +101,7 @@ World *add_world(char *name)
wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
wrld->ao_approx_error= 0.25f;
- wrld->physicsEngine= WOPHY_BULLET;//WOPHY_SUMO; Bullet by default
- wrld->mode = WO_DBVT_CULLING; // DBVT culling by default
- wrld->occlusionRes = 128;
wrld->preview = NULL;
- wrld->ticrate = 60;
- wrld->maxlogicstep = 5;
- wrld->physubstep = 1;
- wrld->maxphystep = 5;
return wrld;
}
@@ -134,9 +122,6 @@ World *copy_world(World *wrld)
}
if (wrld->preview) wrldn->preview = BKE_previewimg_copy(wrld->preview);
-#ifndef DISABLE_PYTHON
- BPY_copy_scriptlink(&wrld->scriptlink);
-#endif
#if 0 // XXX old animation system
id_us_plus((ID *)wrldn->ipo);
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index f84bd690347..7c58a4f9499 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BKE_global.h"
+#include "BKE_utildefines.h"
#include "BKE_writeavi.h"
#include "AVI_avi.h"
@@ -87,7 +88,7 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
}
#endif
#ifdef WITH_FFMPEG
- if (imtype == R_FFMPEG) {
+ if (ELEM4(imtype, R_FFMPEG, R_H264, R_XVID, R_THEORA)) {
mh.start_movie = start_ffmpeg;
mh.append_movie = append_ffmpeg;
mh.end_movie = end_ffmpeg;
@@ -126,7 +127,7 @@ void makeavistring (RenderData *rd, char *string)
}
}
-void start_avi(RenderData *rd, int rectx, int recty)
+void start_avi(struct Scene *scene, RenderData *rd, int rectx, int recty)
{
int x, y;
char name[256];
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 25dc6fa2fd7..1953058fddf 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -65,6 +65,10 @@
#include "DNA_scene_types.h"
+#include "AUD_C-API.h"
+#include "BKE_sound.h"
+#include "BKE_main.h"
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -96,6 +100,8 @@ static int audio_input_frame_size = 0;
static uint8_t* audio_output_buffer = 0;
static int audio_outbuf_size = 0;
+static AUD_Device* audio_mixdown_device = 0;
+
#define FFMPEG_AUTOSPLIT_SIZE 2000000000
/* Delete a picture buffer */
@@ -127,9 +133,8 @@ static int write_audio_frame(void)
c = get_codec_from_stream(audio_stream);
- //XXX audiostream_fill(audio_input_buffer,
- // audio_input_frame_size
- // * sizeof(short) * c->channels);
+ if(audio_mixdown_device)
+ AUD_readDevice(audio_mixdown_device, audio_input_buffer, audio_input_frame_size);
av_init_packet(&pkt);
@@ -143,7 +148,7 @@ static int write_audio_frame(void)
#else
pkt.pts = c->coded_frame->pts;
#endif
- fprintf(stderr, "Audio Frame PTS: %lld\n", pkt.pts);
+ fprintf(stderr, "Audio Frame PTS: %d\n", (int)pkt.pts);
pkt.stream_index = audio_stream->index;
pkt.flags |= PKT_FLAG_KEY;
@@ -260,7 +265,7 @@ static void write_video_frame(RenderData *rd, AVFrame* frame)
#else
packet.pts = c->coded_frame->pts;
#endif
- fprintf(stderr, "Video Frame PTS: %lld\n", packet.pts);
+ fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts);
} else {
fprintf(stderr, "Video Frame PTS: not set\n");
}
@@ -554,7 +559,7 @@ static AVStream* alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContex
c->codec_id = codec_id;
c->codec_type = CODEC_TYPE_AUDIO;
- c->sample_rate = rd->audio.mixrate;
+ c->sample_rate = rd->ffcodecdata.audio_mixrate;
c->bit_rate = ffmpeg_audio_bitrate*1000;
c->channels = 2;
codec = avcodec_find_encoder(c->codec_id);
@@ -608,7 +613,7 @@ static AVStream* alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContex
}
/* essential functions -- start, append, end */
-void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
+static void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
{
/* Handle to the output file */
AVFormatContext* of;
@@ -729,7 +734,7 @@ void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
if (ffmpeg_type == FFMPEG_DV) {
fmt->audio_codec = CODEC_ID_PCM_S16LE;
- if (ffmpeg_multiplex_audio && rd->audio.mixrate != 48000) {
+ if (ffmpeg_multiplex_audio && rd->ffcodecdata.audio_mixrate != 48000) {
G.afbreek = 1;
//XXX error("FFMPEG only supports 48khz / stereo "
// "audio for DV!");
@@ -826,12 +831,21 @@ static void makeffmpegstring(RenderData* rd, char* string) {
}
}
-
-void start_ffmpeg(RenderData *rd, int rectx, int recty)
+void start_ffmpeg(struct Scene *scene, RenderData *rd, int rectx, int recty)
{
ffmpeg_autosplit_count = 0;
start_ffmpeg_impl(rd, rectx, recty);
+
+ if(ffmpeg_multiplex_audio && audio_stream)
+ {
+ AVCodecContext* c = get_codec_from_stream(audio_stream);
+ AUD_Specs specs;
+ specs.channels = c->channels;
+ specs.format = AUD_FORMAT_S16;
+ specs.rate = rd->ffcodecdata.audio_mixrate;
+ audio_mixdown_device = sound_mixdown(scene, specs, rd->sfra, rd->efra, rd->ffcodecdata.audio_volume);
+ }
}
void end_ffmpeg(void);
@@ -884,6 +898,12 @@ void end_ffmpeg(void)
if (audio_stream && video_stream) {
write_audio_frames();
}
+
+ if(audio_mixdown_device)
+ {
+ AUD_closeReadDevice(audio_mixdown_device);
+ audio_mixdown_device = 0;
+ }
if (outfile) {
av_write_trailer(outfile);
@@ -937,5 +957,322 @@ void end_ffmpeg(void)
img_convert_ctx = 0;
}
}
+
+/* properties */
+
+void ffmpeg_property_del(RenderData *rd, void *type, void *prop_)
+{
+ struct IDProperty *prop = (struct IDProperty *) prop_;
+ IDProperty * group;
+
+ if (!rd->ffcodecdata.properties) {
+ return;
+ }
+
+ group = IDP_GetPropertyFromGroup(
+ rd->ffcodecdata.properties, (char*) type);
+ if (group && prop) {
+ IDP_RemFromGroup(group, prop);
+ IDP_FreeProperty(prop);
+ MEM_freeN(prop);
+ }
+}
+
+IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int parent_index)
+{
+ AVCodecContext c;
+ const AVOption * o;
+ const AVOption * parent;
+ IDProperty * group;
+ IDProperty * prop;
+ IDPropertyTemplate val;
+ int idp_type;
+ char name[256];
+
+ avcodec_get_context_defaults(&c);
+
+ o = c.av_class->option + opt_index;
+ parent = c.av_class->option + parent_index;
+
+ if (!rd->ffcodecdata.properties) {
+ IDPropertyTemplate val;
+
+ rd->ffcodecdata.properties
+ = IDP_New(IDP_GROUP, val, "ffmpeg");
+ }
+
+ group = IDP_GetPropertyFromGroup(
+ rd->ffcodecdata.properties, (char*) type);
+
+ if (!group) {
+ IDPropertyTemplate val;
+
+ group = IDP_New(IDP_GROUP, val, (char*) type);
+ IDP_AddToGroup(rd->ffcodecdata.properties, group);
+ }
+
+ if (parent_index) {
+ sprintf(name, "%s:%s", parent->name, o->name);
+ } else {
+ strcpy(name, o->name);
+ }
+
+ fprintf(stderr, "ffmpeg_property_add: %s %d %d %s\n",
+ type, parent_index, opt_index, name);
+
+ prop = IDP_GetPropertyFromGroup(group, name);
+ if (prop) {
+ return prop;
+ }
+
+ switch (o->type) {
+ case FF_OPT_TYPE_INT:
+ case FF_OPT_TYPE_INT64:
+ val.i = o->default_val;
+ idp_type = IDP_INT;
+ break;
+ case FF_OPT_TYPE_DOUBLE:
+ case FF_OPT_TYPE_FLOAT:
+ val.f = o->default_val;
+ idp_type = IDP_FLOAT;
+ break;
+ case FF_OPT_TYPE_STRING:
+ val.str = " ";
+ idp_type = IDP_STRING;
+ break;
+ case FF_OPT_TYPE_CONST:
+ val.i = 1;
+ idp_type = IDP_INT;
+ break;
+ default:
+ return NULL;
+ }
+ prop = IDP_New(idp_type, val, name);
+ IDP_AddToGroup(group, prop);
+ return prop;
+}
+
+/* not all versions of ffmpeg include that, so here we go ... */
+
+static const AVOption *my_av_find_opt(void *v, const char *name,
+ const char *unit, int mask, int flags){
+ AVClass *c= *(AVClass**)v;
+ const AVOption *o= c->option;
+
+ for(;o && o->name; o++){
+ if(!strcmp(o->name, name) &&
+ (!unit || (o->unit && !strcmp(o->unit, unit))) &&
+ (o->flags & mask) == flags )
+ return o;
+ }
+ return NULL;
+}
+
+int ffmpeg_property_add_string(RenderData *rd, const char * type, const char * str)
+{
+ AVCodecContext c;
+ const AVOption * o = 0;
+ const AVOption * p = 0;
+ char name_[128];
+ char * name;
+ char * param;
+ IDProperty * prop;
+
+ avcodec_get_context_defaults(&c);
+
+ strncpy(name_, str, 128);
+
+ name = name_;
+ while (*name == ' ') name++;
+
+ param = strchr(name, ':');
+
+ if (!param) {
+ param = strchr(name, ' ');
+ }
+ if (param) {
+ *param++ = 0;
+ while (*param == ' ') param++;
+ }
+
+ o = my_av_find_opt(&c, name, NULL, 0, 0);
+ if (!o) {
+ return 0;
+ }
+ if (param && o->type == FF_OPT_TYPE_CONST) {
+ return 0;
+ }
+ if (param && o->type != FF_OPT_TYPE_CONST && o->unit) {
+ p = my_av_find_opt(&c, param, o->unit, 0, 0);
+ prop = ffmpeg_property_add(rd,
+ (char*) type, p - c.av_class->option,
+ o - c.av_class->option);
+ } else {
+ prop = ffmpeg_property_add(rd,
+ (char*) type, o - c.av_class->option, 0);
+ }
+
+
+ if (!prop) {
+ return 0;
+ }
+
+ if (param && !p) {
+ switch (prop->type) {
+ case IDP_INT:
+ IDP_Int(prop) = atoi(param);
+ break;
+ case IDP_FLOAT:
+ IDP_Float(prop) = atof(param);
+ break;
+ case IDP_STRING:
+ strncpy(IDP_String(prop), param, prop->len);
+ break;
+ }
+ }
+ return 1;
+}
+
+void ffmpeg_set_preset(RenderData *rd, int preset)
+{
+ int isntsc = (rd->frs_sec != 25);
+
+ switch (preset) {
+ case FFMPEG_PRESET_VCD:
+ rd->ffcodecdata.type = FFMPEG_MPEG1;
+ rd->ffcodecdata.video_bitrate = 1150;
+ rd->xsch = 352;
+ rd->ysch = isntsc ? 240 : 288;
+ rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
+ rd->ffcodecdata.rc_max_rate = 1150;
+ rd->ffcodecdata.rc_min_rate = 1150;
+ rd->ffcodecdata.rc_buffer_size = 40*8;
+ rd->ffcodecdata.mux_packet_size = 2324;
+ rd->ffcodecdata.mux_rate = 2352 * 75 * 8;
+ break;
+
+ case FFMPEG_PRESET_SVCD:
+ rd->ffcodecdata.type = FFMPEG_MPEG2;
+ rd->ffcodecdata.video_bitrate = 2040;
+ rd->xsch = 480;
+ rd->ysch = isntsc ? 480 : 576;
+ rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
+ rd->ffcodecdata.rc_max_rate = 2516;
+ rd->ffcodecdata.rc_min_rate = 0;
+ rd->ffcodecdata.rc_buffer_size = 224*8;
+ rd->ffcodecdata.mux_packet_size = 2324;
+ rd->ffcodecdata.mux_rate = 0;
+ break;
+
+ case FFMPEG_PRESET_DVD:
+ rd->ffcodecdata.type = FFMPEG_MPEG2;
+ rd->ffcodecdata.video_bitrate = 6000;
+ rd->xsch = 720;
+ rd->ysch = isntsc ? 480 : 576;
+ rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
+ rd->ffcodecdata.rc_max_rate = 9000;
+ rd->ffcodecdata.rc_min_rate = 0;
+ rd->ffcodecdata.rc_buffer_size = 224*8;
+ rd->ffcodecdata.mux_packet_size = 2048;
+ rd->ffcodecdata.mux_rate = 10080000;
+ break;
+
+ case FFMPEG_PRESET_DV:
+ rd->ffcodecdata.type = FFMPEG_DV;
+ rd->xsch = 720;
+ rd->ysch = isntsc ? 480 : 576;
+ break;
+
+ case FFMPEG_PRESET_H264:
+ rd->ffcodecdata.type = FFMPEG_AVI;
+ rd->ffcodecdata.codec = CODEC_ID_H264;
+ rd->ffcodecdata.video_bitrate = 6000;
+ rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
+ rd->ffcodecdata.rc_max_rate = 9000;
+ rd->ffcodecdata.rc_min_rate = 0;
+ rd->ffcodecdata.rc_buffer_size = 224*8;
+ rd->ffcodecdata.mux_packet_size = 2048;
+ rd->ffcodecdata.mux_rate = 10080000;
+
+ ffmpeg_property_add_string(rd, "video", "coder:vlc");
+ 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", "me_range:16");
+ 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");
+
+ break;
+
+ case FFMPEG_PRESET_THEORA:
+ case FFMPEG_PRESET_XVID:
+ if(preset == FFMPEG_PRESET_XVID) {
+ rd->ffcodecdata.type = FFMPEG_AVI;
+ rd->ffcodecdata.codec = CODEC_ID_XVID;
+ }
+ else if(preset == FFMPEG_PRESET_THEORA) {
+ rd->ffcodecdata.type = FFMPEG_OGG; // XXX broken
+ rd->ffcodecdata.codec = CODEC_ID_THEORA;
+ }
+
+ rd->ffcodecdata.video_bitrate = 6000;
+ rd->ffcodecdata.gop_size = isntsc ? 18 : 15;
+ rd->ffcodecdata.rc_max_rate = 9000;
+ rd->ffcodecdata.rc_min_rate = 0;
+ rd->ffcodecdata.rc_buffer_size = 224*8;
+ rd->ffcodecdata.mux_packet_size = 2048;
+ rd->ffcodecdata.mux_rate = 10080000;
+ break;
+
+ }
+}
+
+void ffmpeg_verify_image_type(RenderData *rd)
+{
+ int audio= 0;
+
+ if(rd->imtype == R_FFMPEG) {
+ if(rd->ffcodecdata.type <= 0 ||
+ rd->ffcodecdata.codec <= 0 ||
+ rd->ffcodecdata.audio_codec <= 0 ||
+ rd->ffcodecdata.video_bitrate <= 1) {
+
+ rd->ffcodecdata.codec = CODEC_ID_MPEG2VIDEO;
+ ffmpeg_set_preset(rd, FFMPEG_PRESET_DVD);
+ }
+
+ audio= 1;
+ }
+ else if(rd->imtype == R_H264) {
+ if(rd->ffcodecdata.codec != CODEC_ID_H264) {
+ ffmpeg_set_preset(rd, FFMPEG_PRESET_H264);
+ audio= 1;
+ }
+ }
+ else if(rd->imtype == R_XVID) {
+ if(rd->ffcodecdata.codec != CODEC_ID_XVID) {
+ ffmpeg_set_preset(rd, FFMPEG_PRESET_XVID);
+ audio= 1;
+ }
+ }
+ else if(rd->imtype == R_THEORA) {
+ if(rd->ffcodecdata.codec != CODEC_ID_THEORA) {
+ ffmpeg_set_preset(rd, FFMPEG_PRESET_THEORA);
+ audio= 1;
+ }
+ }
+
+ if(audio && rd->ffcodecdata.audio_codec <= 0) {
+ rd->ffcodecdata.audio_codec = CODEC_ID_MP2;
+ rd->ffcodecdata.audio_bitrate = 128;
+ }
+}
+
#endif
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index 2d3a2e6b883..0780cd0dc48 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -101,7 +101,7 @@ static int closesocket(int fd)
}
#endif
-void start_frameserver(RenderData *rd, int rectx, int recty)
+void start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty)
{
struct sockaddr_in addr;
int arg = 1;
diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h
new file mode 100644
index 00000000000..325798f325f
--- /dev/null
+++ b/source/blender/blenkernel/nla_private.h
@@ -0,0 +1,85 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef NLA_PRIVATE
+#define NLA_PRIVATE
+
+/* --------------- NLA Evaluation DataTypes ----------------------- */
+
+/* used for list of strips to accumulate at current time */
+typedef struct NlaEvalStrip {
+ struct NlaEvalStrip *next, *prev;
+
+ NlaTrack *track; /* track that this strip belongs to */
+ NlaStrip *strip; /* strip that's being used */
+
+ short track_index; /* the index of the track within the list */
+ short strip_mode; /* which end of the strip are we looking at */
+
+ float strip_time; /* time at which which strip is being evaluated */
+} NlaEvalStrip;
+
+/* NlaEvalStrip->strip_mode */
+enum {
+ /* standard evaluation */
+ NES_TIME_BEFORE = -1,
+ NES_TIME_WITHIN,
+ NES_TIME_AFTER,
+
+ /* transition-strip evaluations */
+ NES_TIME_TRANSITION_START,
+ NES_TIME_TRANSITION_END,
+} eNlaEvalStrip_StripMode;
+
+
+/* temp channel for accumulating data from NLA (avoids needing to clear all values first) */
+// TODO: maybe this will be used as the 'cache' stuff needed for editable values too?
+typedef struct NlaEvalChannel {
+ struct NlaEvalChannel *next, *prev;
+
+ PointerRNA ptr; /* pointer to struct containing property to use */
+ PropertyRNA *prop; /* RNA-property type to use (should be in the struct given) */
+ int index; /* array index (where applicable) */
+
+ float value; /* value of this channel */
+} NlaEvalChannel;
+
+/* --------------- NLA Functions (not to be used as a proper API) ----------------------- */
+
+/* convert from strip time <-> global time */
+float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode);
+
+/* --------------- NLA Evaluation (very-private stuff) ----------------------- */
+/* these functions are only defined here to avoid problems with the order in which they get defined... */
+
+NlaEvalStrip *nlastrips_ctime_get_strip(ListBase *list, ListBase *strips, short index, float ctime);
+void nlastrip_evaluate(PointerRNA *ptr, ListBase *channels, ListBase *modifiers, NlaEvalStrip *nes);
+void nladata_flush_channels(ListBase *channels);
+
+#endif // NLA_PRIVATE
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h
index 787579250ed..793dab12b83 100644
--- a/source/blender/blenlib/BLI_arithb.h
+++ b/source/blender/blenlib/BLI_arithb.h
@@ -38,6 +38,12 @@
extern "C" {
#endif
+#ifdef WIN32
+#define _USE_MATH_DEFINES
+#endif
+
+#include <math.h>
+
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -54,6 +60,68 @@ extern "C" {
#define M_1_PI 0.318309886183790671538
#endif
+#ifndef M_E
+#define M_E 2.7182818284590452354
+#endif
+#ifndef M_LOG2E
+#define M_LOG2E 1.4426950408889634074
+#endif
+#ifndef M_LOG10E
+#define M_LOG10E 0.43429448190325182765
+#endif
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942
+#endif
+#ifndef M_LN10
+#define M_LN10 2.30258509299404568402
+#endif
+
+#ifndef sqrtf
+#define sqrtf(a) ((float)sqrt(a))
+#endif
+#ifndef powf
+#define powf(a, b) ((float)pow(a, b))
+#endif
+#ifndef cosf
+#define cosf(a) ((float)cos(a))
+#endif
+#ifndef sinf
+#define sinf(a) ((float)sin(a))
+#endif
+#ifndef acosf
+#define acosf(a) ((float)acos(a))
+#endif
+#ifndef asinf
+#define asinf(a) ((float)asin(a))
+#endif
+#ifndef atan2f
+#define atan2f(a, b) ((float)atan2(a, b))
+#endif
+#ifndef tanf
+#define tanf(a) ((float)tan(a))
+#endif
+#ifndef atanf
+#define atanf(a) ((float)atan(a))
+#endif
+#ifndef floorf
+#define floorf(a) ((float)floor(a))
+#endif
+#ifndef ceilf
+#define ceilf(a) ((float)ceil(a))
+#endif
+#ifndef fabsf
+#define fabsf(a) ((float)fabs(a))
+#endif
+#ifndef logf
+#define logf(a) ((float)log(a))
+#endif
+#ifndef expf
+#define expf(a) ((float)exp(a))
+#endif
+#ifndef fmodf
+#define fmodf(a, b) ((float)fmod(a, b))
+#endif
+
#ifdef WIN32
#ifndef FREE_WINDOWS
#define isnan(n) _isnan(n)
@@ -89,6 +157,9 @@ double Sqrt3d(double d);
float saacos(float fac);
float saasin(float fac);
float sasqrt(float fac);
+float saacosf(float fac);
+float saasinf(float fac);
+float sasqrtf(float fac);
int FloatCompare(float *v1, float *v2, float limit);
int FloatCompare4(float *v1, float *v2, float limit);
@@ -103,7 +174,39 @@ void CalcNormShort(short *v1, short *v2, short *v3, float *n);
float power_of_2(float val);
/**
- * @section Euler conversion routines
+ * @section Euler conversion routines (With Custom Order)
+ */
+
+/* Defines for rotation orders
+ * WARNING: must match the ePchan_RotMode in DNA_action_types.h
+ * order matters - types are saved to file!
+ */
+typedef enum eEulerRotationOrders {
+ EULER_ORDER_DEFAULT = 1, /* Blender 'default' (classic) is basically XYZ */
+ EULER_ORDER_XYZ = 1, /* Blender 'default' (classic) - must be as 1 to sync with PoseChannel rotmode */
+ EULER_ORDER_XZY,
+ EULER_ORDER_YXZ,
+ EULER_ORDER_YZX,
+ EULER_ORDER_ZXY,
+ EULER_ORDER_ZYX,
+ /* NOTE: there are about 6 more entries when including duplicated entries too */
+} eEulerRotationOrders;
+
+void EulOToQuat(float eul[3], short order, float quat[4]);
+void QuatToEulO(float quat[4], float eul[3], short order);
+
+void EulOToMat3(float eul[3], short order, float Mat[3][3]);
+void EulOToMat4(float eul[3], short order, float Mat[4][4]);
+
+void Mat3ToEulO(float Mat[3][3], float eul[3], short order);
+void Mat4ToEulO(float Mat[4][4], float eul[3], short order);
+
+void Mat3ToCompatibleEulO(float mat[3][3], float eul[3], float oldrot[3], short order);
+
+void eulerO_rot(float beul[3], float ang, char axis, short order);
+
+/**
+ * @section Euler conversion routines (Blender XYZ)
*/
void EulToMat3(float *eul, float mat[][3]);
@@ -114,11 +217,14 @@ void Mat4ToEul(float tmat[][4],float *eul);
void EulToQuat(float *eul, float *quat);
-void compatible_eul(float *eul, float *oldrot);
-
void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
+
+void compatible_eul(float *eul, float *oldrot);
+void euler_rot(float *beul, float ang, char axis);
+
+
/**
* @section Quaternion arithmetic routines
*/
@@ -145,6 +251,8 @@ void printquat(char *str, float q[4]);
void QuatInterpol(float *result, float *quat1, float *quat2, float t);
void QuatAdd(float *result, float *quat1, float *quat2, float t);
+void QuatToMat3(float *q, float m[][3]);
+void QuatToMat4(float *q, float m[][4]);
/**
* @section matrix multiplication and copying routines
@@ -191,7 +299,7 @@ void Mat3MulMat3(float *m1, float *m3, float *m2);
#endif
void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
void Mat4CpyMat4(float m1[][4], float m2[][4]);
-void Mat4SwapMat4(float *m1, float *m2);
+void Mat4SwapMat4(float m1[][4], float m2[][4]);
void Mat3CpyMat3(float m1[][3], float m2[][3]);
void Mat3MulSerie(float answ[][3],
@@ -212,6 +320,9 @@ void Mat3Clr(float *m);
void Mat3One(float m[][3]);
void Mat4One(float m[][4]);
+void Mat3Scale(float m[][3], float scale);
+void Mat4Scale(float m[][4], float scale);
+
void Mat3Ortho(float mat[][3]);
void Mat4Ortho(float mat[][4]);
@@ -234,8 +345,6 @@ void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
void VecUpMat3old(float *vec, float mat[][3], short axis);
void VecUpMat3(float *vec, float mat[][3], short axis);
-void VecRotToMat3(float *vec, float phi, float mat[][3]);
-void VecRotToMat4(float *vec, float phi, float mat[][4]);
void VecCopyf(float *v1, float *v2);
int VecLen(int *v1, int *v2);
@@ -254,7 +363,9 @@ void printvec4f(char *str, float v[4]);
void VecAddf(float *v, float *v1, float *v2);
void VecSubf(float *v, float *v1, float *v2);
-void VecLerpf(float *target, float *a, float *b, float t);
+void VecMulVecf(float *v, float *v1, float *v2);
+void VecLerpf(float *target, const float *a, const float *b, const float t);
+void VecLerp3f(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]);
void VecMidf(float *v, float *v1, float *v2);
void VecOrthoBasisf(float *v, float *v1, float *v2);
@@ -265,20 +376,35 @@ void Vec2Mulf(float *v1, float f);
void Vec2Addf(float *v, float *v1, float *v2);
void Vec2Subf(float *v, float *v1, float *v2);
void Vec2Copyf(float *v1, float *v2);
-void Vec2Lerpf(float *target, float *a, float *b, float t);
+void Vec2Lerpf(float *target, const float *a, const float *b, const float t);
+void Vec2Lerp3f(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3]);
+
+void AxisAngleToQuat(float q[4], float axis[3], float angle);
+void QuatToAxisAngle(float q[4], float axis[3], float *angle);
+void AxisAngleToEulO(float axis[3], float angle, float eul[3], short order);
+void EulOToAxisAngle(float eul[3], short order, float axis[3], float *angle);
+void AxisAngleToMat3(float axis[3], float angle, float mat[3][3]);
+void AxisAngleToMat4(float axis[3], float angle, float mat[4][4]);
+void Mat3ToAxisAngle(float mat[3][3], float axis[3], float *angle);
+void Mat4ToAxisAngle(float mat[4][4], float axis[3], float *angle);
+
+void Mat3ToVecRot(float mat[3][3], float axis[3], float *angle);
+void Mat4ToVecRot(float mat[4][4], float axis[3], float *angle);
+void VecRotToMat3(float *vec, float phi, float mat[][3]);
+void VecRotToMat4(float *vec, float phi, float mat[][4]);
-void AxisAngleToQuat(float *q, float *axis, float angle);
void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
void vectoquat(float *vec, short axis, short upflag, float *q);
+void Mat3ToQuat_is_ok(float wmat[][3], float *q);
+void VecReflect(float *out, float *v1, float *v2);
+void VecBisect3(float *v, float *v1, float *v2, float *v3);
float VecAngle2(float *v1, float *v2);
float VecAngle3(float *v1, float *v2, float *v3);
float NormalizedVecAngle2(float *v1, float *v2);
-float VecAngle3_2D(float *v1, float *v2, float *v3);
+float Vec2Angle3(float *v1, float *v2, float *v3);
float NormalizedVecAngle2_2D(float *v1, float *v2);
-
-void euler_rot(float *beul, float ang, char axis);
void NormalShortToFloat(float *out, short *in);
void NormalFloatToShort(short *out, float *in);
@@ -330,6 +456,8 @@ void i_window(
#define BLI_CS_REC709 1
#define BLI_CS_CIE 2
+#define RAD2DEG(_rad) ((_rad)*(180.0/M_PI))
+
void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
@@ -339,7 +467,6 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace);
int constrain_rgb(float *r, float *g, float *b);
-void gamma_correct_rgb(float *r, float *g, float *b);
unsigned int hsv_to_cpack(float h, float s, float v);
unsigned int rgb_to_cpack(float r, float g, float b);
void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
@@ -351,11 +478,6 @@ void VecStar(float mat[][3],float *vec);
short EenheidsMat(float mat[][3]);
-void QuatToMat3(float *q, float m[][3]);
-void QuatToMat4(float *q, float m[][4]);
-
-void Mat3ToQuat_is_ok(float wmat[][3], float *q);
-
void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
@@ -364,8 +486,6 @@ void i_rotate(float angle, char axis, float mat[][4]);
-
-
void MinMax3(float *min, float *max, float *vec);
void SizeToMat3(float *size, float mat[][3]);
void SizeToMat4(float *size, float mat[][4]);
@@ -385,8 +505,9 @@ void Mat4ToSize(float mat[][4], float *size);
void triatoquat(float *v1, float *v2, float *v3, float *quat);
-void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
-void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
+void LocEulSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3]);
+void LocEulOSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder);
+void LocQuatSizeToMat4(float mat[4][4], float loc[3], float quat[4], float size[3]);
void tubemap(float x, float y, float z, float *u, float *v);
void spheremap(float x, float y, float z, float *u, float *v);
@@ -408,6 +529,8 @@ int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
+float AngleToLength(const float angle);
+
typedef struct DualQuat {
float quat[4];
float trans[4];
diff --git a/source/blender/blenlib/BLI_bfile.h b/source/blender/blenlib/BLI_bfile.h
new file mode 100644
index 00000000000..92543558a19
--- /dev/null
+++ b/source/blender/blenlib/BLI_bfile.h
@@ -0,0 +1,138 @@
+/*
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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: */
+/* For "symmetry" of flags */
+#define BFILE_NORMAL (0)
+/* No supervision, just translate // if needed, RISKY */
+#define BFILE_RAW (1<<0)
+/* Path is relative to config dirs */
+#define BFILE_CONFIG (1<<1)
+/* Path is for current session temp file */
+#define BFILE_TEMP (1<<2)
+
+/* Config handling, special cases: */
+#define BFILE_USERONLY (1<<3)
+#define BFILE_SYSONLY (1<<4)
+
+/* Compression to apply on close: */
+#define BFILE_GZIP (1<<5)
+
+/**
+ 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 type; /* 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);
+
+/**
+ Open a BFILE* with open()-like syntax.
+ */
+BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags);
+
+/**
+ 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_dlrbTree.h b/source/blender/blenlib/BLI_dlrbTree.h
new file mode 100644
index 00000000000..a17cbbd1993
--- /dev/null
+++ b/source/blender/blenlib/BLI_dlrbTree.h
@@ -0,0 +1,101 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (original author)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BLI_DLRB_TREE_H
+#define BLI_DLRB_TREE_H
+
+/* Double-Linked Red-Black Tree Implementation:
+ *
+ * This is simply a Red-Black Tree implementation whose nodes can later
+ * be arranged + retrieved as elements in a Double-Linked list (i.e. ListBase).
+ * The Red-Black Tree implementation is based on the methods defined by Wikipedia.
+ */
+
+/* ********************************************** */
+/* Data Types and Type Defines */
+
+/* Base Structs --------------------------------- */
+
+/* Basic Layout for a Node */
+typedef struct DLRBT_Node {
+ /* ListBase capabilities */
+ struct DLRBT_Node *next, *prev;
+
+ /* Tree Associativity settings */
+ struct DLRBT_Node *left, *right;
+ struct DLRBT_Node *parent;
+
+ char tree_col;
+ /* ... for nice alignment, next item should usually be a char too... */
+} DLRBT_Node;
+
+/* Red/Black defines for tree_col */
+enum eDLRBT_Colors {
+ DLRBT_BLACK= 0,
+ DLRBT_RED,
+};
+
+/* -------- */
+
+/* The Tree Data */
+typedef struct DLRBT_Tree {
+ /* ListBase capabilities */
+ void *first, *last; /* these should be based on DLRBT_Node-s */
+
+ /* Root Node */
+ void *root; /* this should be based on DLRBT_Node-s */
+} DLRBT_Tree;
+
+/* ********************************************** */
+/* Public API */
+
+/* Create a new tree, and initialise as necessary */
+DLRBT_Tree *BLI_dlrbTree_new(void);
+
+/* Initialises some given trees */
+void BLI_dlrbTree_init(DLRBT_Tree *tree);
+
+/* Free some tree */
+void BLI_dlrbTree_free(DLRBT_Tree *tree);
+
+/* Make sure the tree's Double-Linked list representation is valid */
+void BLI_dlrbTree_linkedlist_sync(DLRBT_Tree *tree);
+
+
+
+/* Balance the tree after the given element has been added to it
+ * (using custom code, in the Binary Tree way).
+ */
+void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node);
+
+/* Remove the given element from the tree and balance again */
+// FIXME: this is not implemented yet...
+void BLI_dlrbTree_remove(DLRBT_Tree *tree, DLRBT_Node *node);
+
+/* ********************************************** */
+
+#endif // BLI_DLRB_TREE_H
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index 758e3d136aa..56a20d8462a 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -125,10 +125,11 @@ typedef struct EditFace
float fp;
} tmp;
float n[3], cent[3];
- unsigned char mat_nr, flag;
+ unsigned char flag;
unsigned char f, f1, h;
unsigned char fast; /* only 0 or 1, for editmesh_fastmalloc */
unsigned char fgonf; /* flag for fgon options */
+ short mat_nr;
void *data; /* custom face data */
} EditFace;
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 146ca16606e..b79920b188b 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -36,8 +36,6 @@
#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);
@@ -53,9 +51,10 @@ int BLI_delete(char *file, int dir, int recursive);
int BLI_move(char *file, char *to);
int BLI_touch(const char *file);
char *BLI_last_slash(const char *string);
-void BLI_add_slash(char *string);
+int BLI_add_slash(char *string);
void BLI_del_slash(char *string);
char *first_slash(char *string);
+const char *BLI_short_filename(const char *string);
/* only for the sane unix world: direct calls to system functions :( */
#ifndef WIN32
diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h
index c77e82f0a2b..c9a8b1b841f 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -32,6 +32,10 @@
#ifndef BLI_GHASH_H
#define BLI_GHASH_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct GHash;
typedef struct GHash GHash;
@@ -125,5 +129,9 @@ int BLI_ghashutil_strcmp (void *a, void *b);
unsigned int BLI_ghashutil_inthash (void *ptr);
int BLI_ghashutil_intcmp(void *a, void *b);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenlib/BLI_graph.h b/source/blender/blenlib/BLI_graph.h
index f4fccfcbb2c..1dd439468f7 100644
--- a/source/blender/blenlib/BLI_graph.h
+++ b/source/blender/blenlib/BLI_graph.h
@@ -88,6 +88,7 @@ typedef struct BArcIterator {
StoppedFct stopped;
float *p, *no;
+ float size;
int length;
int index;
diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h
index e3591a84e98..fe6bc576fbd 100644
--- a/source/blender/blenlib/BLI_kdopbvh.h
+++ b/source/blender/blenlib/BLI_kdopbvh.h
@@ -71,6 +71,8 @@ typedef void (*BVHTree_NearestPointCallback) (void *userdata, int index, const f
/* callback must update hit in case it finds a nearest successful hit */
typedef void (*BVHTree_RayCastCallback) (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit);
+/* callback to range search query */
+typedef void (*BVHTree_RangeQuery) (void *userdata, int index, float squared_dist);
BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis);
void BLI_bvhtree_free(BVHTree *tree);
@@ -93,5 +95,11 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nea
int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float radius, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata);
+float BLI_bvhtree_bb_raycast(float *bv, float *light_start, float *light_end, float *pos);
+
+/* range query */
+int BLI_bvhtree_range_query(BVHTree *tree, const float *co, float radius, BVHTree_RangeQuery callback, void *userdata);
+
+
#endif // BLI_KDOPBVH_H
diff --git a/source/blender/blenlib/BLI_kdtree.h b/source/blender/blenlib/BLI_kdtree.h
index 49c21e424f7..3b1947cf0c9 100644
--- a/source/blender/blenlib/BLI_kdtree.h
+++ b/source/blender/blenlib/BLI_kdtree.h
@@ -52,9 +52,13 @@ void BLI_kdtree_balance(KDTree *tree);
/* Find nearest returns index, and -1 if no node is found.
* Find n nearest returns number of points found, with results in nearest.
- * Normal is optional. */
+ * Normal is optional, but if given will limit results to points in normal direction from co. */
int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest);
int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest);
+/* Range search returns number of points found, with results in nearest */
+/* Normal is optional, but if given will limit results to points in normal direction from co. */
+/* Remember to free nearest after use! */
+int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KDTreeNearest **nearest);
#endif
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h
index d0b106b59c3..21b4c83bd88 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -34,6 +34,7 @@
//#include "DNA_listbase.h"
struct ListBase;
+struct LinkData;
#ifdef __cplusplus
extern "C" {
@@ -56,6 +57,9 @@ int BLI_countlist(struct ListBase *listbase);
void BLI_freelinkN(struct ListBase *listbase, void *vlink);
void BLI_duplicatelist(struct ListBase *list1, struct ListBase *list2); /* copy from 2 to 1 */
+/* create a generic list node containing link to provided data */
+struct LinkData *BLI_genericNodeN(void *data);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index 385aa39e6cb..36d96f6075c 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -55,7 +55,11 @@ struct direntry{
char *string;
mode_t type;
char *relname;
+#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500)
+ struct _stat64 s;
+#else
struct stat s;
+#endif
unsigned int flags;
char size[16];
char mode1[4];
@@ -73,7 +77,6 @@ struct direntry{
#define SELECT 1
#define HIDDEN 1
#define FIRST 1
-#define ACTIVE 2
#define DESELECT 0
#define NOT_YET 0
#define VISIBLE 0
diff --git a/source/blender/blenlib/BLI_util.h b/source/blender/blenlib/BLI_util.h
index 30c9fc353b3..1ce7a8cdb77 100644
--- a/source/blender/blenlib/BLI_util.h
+++ b/source/blender/blenlib/BLI_util.h
@@ -42,7 +42,15 @@ struct ListBase;
struct direntry;
char *BLI_gethome(void);
-char *BLI_gethome_folder(char *folder_name);
+char *BLI_gethome_folder(char *folder_name, int flag);
+
+/* BLI_gethome_folder flag */
+#define BLI_GETHOME_LOCAL 1<<1 /* relative location for portable binaries */
+#define BLI_GETHOME_SYSTEM 1<<2 /* system location, or set from the BLENDERPATH env variable (UNIX only) */
+#define BLI_GETHOME_USER 1<<3 /* home folder ~/.blender */
+#define BLI_GETHOME_ALL (BLI_GETHOME_SYSTEM|BLI_GETHOME_LOCAL|BLI_GETHOME_USER)
+
+void BLI_setenv(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);
@@ -50,6 +58,7 @@ void BLI_make_existing_file(char *name);
void BLI_split_dirfile(char *string, char *dir, char *file);
void BLI_split_dirfile_basic(const char *string, char *dir, char *file);
void BLI_join_dirfile(char *string, const char *dir, const char *file);
+void BLI_getlastdir(const char* dir, char *last, int maxlen);
int BLI_testextensie(const char *str, const char *ext);
void BLI_uniquename(struct ListBase *list, void *vlink, char defname[], char delim, short name_offs, short len);
void BLI_newname(char * name, int add);
@@ -71,6 +80,9 @@ void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds
/* go back one directory */
int BLI_parent_dir(char *path);
+/* return whether directory is root and thus has no parent dir */
+int BLI_has_parent(char *path);
+
/**
* Blender's path code replacement function.
* Bases @a path strings leading with "//" by the
diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h
index bd89959801a..070d8d12c08 100644
--- a/source/blender/blenlib/BLI_vfontdata.h
+++ b/source/blender/blenlib/BLI_vfontdata.h
@@ -67,19 +67,6 @@ struct TmpFont
struct VFont *vfont;
};
-
-/**
- * Construct a new VFontData structure from
- * PostScript font data in a PackedFile.
- *
- * @param pf The font data.
- * @retval A new VFontData structure, or NULL
- * if unable to load.
- */
- VFontData*
-BLI_vfontdata_from_psfont(
- struct PackedFile *pf);
-
/**
* Construct a new VFontData structure from
* Freetype font data in a PackedFile.
diff --git a/source/blender/blenlib/BLI_voxel.h b/source/blender/blenlib/BLI_voxel.h
new file mode 100644
index 00000000000..934bc820259
--- /dev/null
+++ b/source/blender/blenlib/BLI_voxel.h
@@ -0,0 +1,41 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb, Raul Fernandez Hernandez (Farsthary).
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BLI_VOXEL_H
+#define BLI_VOXEL_H
+
+/* find the index number of a voxel, given x/y/z integer coords and resolution vector */
+#define V_I(x, y, z, res) ( (z)*(res)[1]*(res)[0] + (y)*(res)[0] + (x) )
+
+/* all input coordinates must be in bounding box 0.0 - 1.0 */
+float voxel_sample_nearest(float *data, int *res, float *co);
+float voxel_sample_trilinear(float *data, int *res, float *co);
+float voxel_sample_triquadratic(float *data, int *res, float *co);
+float voxel_sample_tricubic(float *data, int *res, float *co, int bspline);
+
+#endif /* BLI_VOXEL_H */
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index 3e1b73e51be..757b3605203 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -28,7 +28,13 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#ifndef __WINSTUFF_H__
+#define __WINSTUFF_H__
+
+#ifndef FREE_WINDOWS
#pragma warning(once: 4761 4305 4244 4018)
+#endif
#define WIN32_LEAN_AND_MEAN
@@ -56,31 +62,13 @@
#undef small
-#ifndef __WINSTUFF_H__
-#define __WINSTUFF_H__
-
- // These definitions are also in arithb for simplicity
+// These definitions are also in arithb for simplicity
#ifdef __cplusplus
extern "C" {
#endif
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-#ifndef M_PI_2
-#define M_PI_2 1.57079632679489661923
-#endif
-#ifndef M_SQRT2
-#define M_SQRT2 1.41421356237309504880
-#endif
-#ifndef M_SQRT1_2
-#define M_SQRT1_2 0.70710678118654752440
-#endif
-#ifndef M_1_PI
-#define M_1_PI 0.318309886183790671538
-#endif
-
+#define _USE_MATH_DEFINES
#define MAXPATHLEN MAX_PATH
#ifndef S_ISREG
@@ -90,10 +78,32 @@ extern "C" {
#define S_ISDIR(x) ((x&S_IFMT) == S_IFDIR)
#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
typedef unsigned int mode_t;
#endif
+/* mingw using _SSIZE_T_ to declare ssize_t type */
+#ifndef _SSIZE_T_
+#define _SSIZE_T_
+/* python uses HAVE_SSIZE_T */
+#ifndef HAVE_SSIZE_T
+#define HAVE_SSIZE_T 1
+typedef long ssize_t;
+#endif
+#endif
+
struct dirent {
int d_ino;
int d_off;
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 334c8e6906b..4ed9eb4b007 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -27,21 +27,20 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../makesdna ../blenkernel ../../../intern/guardedalloc ../include
- ${FREETYPE_INC}
- ${SDL_INC}
- ${ZLIB_INC}
+ . ../makesdna ../blenkernel ../../../intern/guardedalloc ../include
+ ${FREETYPE_INCLUDE_DIRS}
+ ${ZLIB_INC}
)
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
SET(INC
- ${INC}
- ${BINRELOC_INC}
+ ${INC}
+ ${BINRELOC_INC}
)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
+ SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
BLENDERLIB(bf_blenlib "${SRC}" "${INC}")
diff --git a/source/blender/blenlib/MTC_matrixops.h b/source/blender/blenlib/MTC_matrixops.h
deleted file mode 100644
index 2bc644be564..00000000000
--- a/source/blender/blenlib/MTC_matrixops.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * matrixops.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 MATRIXOPS_H
-#define MATRIXOPS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* need rewriting: */
-/**
- * copy the left upp3 3 by 3 of m2 to m1
- */
-void MTC_Mat3CpyMat4(float m1[][3], float m2[][4]);
-
-/* ------------------------------------------------------------------------- */
-/* operations based on 4 by 4 matrices */
-
-/**
- * Copy m1 to m2
- */
-void MTC_Mat4CpyMat4(float m1[][4], float m2[][4]);
-
-/**
- * Multiply all matrices after the first, leave the result in the
- * first argument
- */
-void MTC_Mat4MulSerie(float answ[][4],
- float m1[][4], float m2[][4], float m3[][4],
- float m4[][4], float m5[][4], float m6[][4],
- float m7[][4], float m8[][4]);
-
-/**
- * m1 = m2 matprod m3
- */
-void MTC_Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
-
-/**
- * Do vec^t prod mat, result in vec. Ignore vec[3] (vec is a
- * float[3])
- */
-void MTC_Mat4MulVecfl(float mat[][4], float *vec);
-
-/**
- * Invert mat, result in inverse. Always returns 1
- */
-int MTC_Mat4Invert(float inverse[][4], float mat[][4]);
-
-/**
- * Make the set of mat orthonormal (mat should already be orthogonal)?
- * (doesn't appear to normalize properly?)
- */
-void MTC_Mat4Ortho(float mat[][4]);
-
-/**
- * vec = mat prod vec, result in vec, ignore fourth component entirely
- * (4th component is _not_ accessed!!! vec is 3d)
- */
-void MTC_Mat4Mul3Vecfl(float mat[][4], float *vec);
-
-/**
- * vec = mat prod vec, result in vec
- */
-void MTC_Mat4MulVec4fl(float mat[][4], float *vec);
-
-/**
- * Set <m> to the 4-D unity matrix
- */
-void MTC_Mat4One(float m[][4]);
-
-/**
- * Swap matrices m1 and m2
- */
-void MTC_Mat4SwapMat4(float m1[][4], float m2[][4]);
-
-/**
- * Copy m2 to the top-left 3x3 of m1, don't touch the remaining elements.
- */
-void MTC_Mat4CpyMat3nc(float m1[][4], float m2[][3]);
-
-/**
- * m1 = m2 * m3, but only the top-left 3x3
- */
-void MTC_Mat4MulMat33(float m1[][3], float m2[][4], float m3[][3]);
-
-/* ------------------------------------------------------------------------- */
-/* Operations based on 3 by 3 matrices */
-/**
- * Do vec^t prod mat, result in vec.(vex is 3d)
- */
-void MTC_Mat3MulVecfl(float mat[][3], float *vec);
-
-/**
- * Copy m1 to m2
- */
-void MTC_Mat3CpyMat3(float m1[][3], float m2[][3]);
-
-/**
- * m1 = m2 prod m3
- */
-void MTC_Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
-
-/**
- * vec = vec prod mat
- */
-void MTC_Mat3MulVecd(float mat[][3], double *vec);
-
-/**
- * Guess: invert matrix
- * result goes to m1
- */
-void MTC_Mat3Inv(float m1[][3], float m2[][3]);
-
-/**
- * Sort of a determinant matrix? Doesn't seem very adjoint to me...
- * result goes to m1
- */
-void MTC_Mat3Adj(float m1[][3], float m[][3]);
-
-/**
- * Set <m> to the 3D unity matrix
- */
-void MTC_Mat3One(float m[][3]);
-
-/* ------------------------------------------------------------------------- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* MATRIXOPS_H */
-
diff --git a/source/blender/blenlib/SConscript b/source/blender/blenlib/SConscript
index e0411a6fc80..fc586de5085 100644
--- a/source/blender/blenlib/SConscript
+++ b/source/blender/blenlib/SConscript
@@ -9,9 +9,6 @@ incs += ' ' + env['BF_FREETYPE_INC']
incs += ' ' + env['BF_ZLIB_INC']
defs = ''
-if env['WITH_BF_SDL']:
- incs += ' ' + env['BF_SDL_INC']
-
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
incs += ' ../../../extern/binreloc/include'
@@ -19,4 +16,4 @@ if env['OURPLATFORM'] == 'linux2':
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( 'bf_blenlib', sources, Split(incs), Split(defs), libtype=['core'], priority = [180], compileflags =cflags )
+env.BlenderLib ( 'bf_blenlib', sources, Split(incs), Split(defs), libtype=['core','player'], priority = [363,170], compileflags =cflags )
diff --git a/source/blender/blenlib/intern/BLI_bfile.c b/source/blender/blenlib/intern/BLI_bfile.c
new file mode 100644
index 00000000000..4789df593ef
--- /dev/null
+++ b/source/blender/blenlib/intern/BLI_bfile.c
@@ -0,0 +1,236 @@
+/*
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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>
+
+#ifndef WIN32
+ #include <unistd.h>
+#else
+ #include <io.h>
+#include "BLI_winstuff.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_bfile.h"
+
+// This would provide config paths and their oldest viable version
+// so if there is an uncompatible change, user's old versions are not loaded
+//#include "bfile_tables.h"
+
+/* Internal bfile type flags */
+#define BTF_OPEN (0)
+#define BTF_FOPEN (1<<0)
+#define BTF_READ (1<<1)
+#define BTF_WRITE (1<<2)
+#define BTF_AT_END (1<<3)
+#define BTF_DISCARD (1<<4)
+
+
+void fill_paths(BFILE *bfile, const char *path) {
+ char* source_path = NULL;
+ int bflags = bfile->uflags;
+
+ if(bflags & BFILE_NORMAL || bflags & BFILE_RAW) {
+// bfile->fpath is path with // replaced
+ }
+ if(bflags & BFILE_TEMP) {
+// bfile->fpath is tempdir+path
+ }
+ if(bflags & BFILE_CONFIG) {
+// 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->type & BTF_WRITE && !(bflags & BFILE_RAW)) {
+ /* Generate temp path */
+ // bfile->tpath is fpath+randstring
+ if(!(bfile->type & BTF_DISCARD)) {
+ /* Copy data to tpath */
+ if(source_path) {
+ // copy it from older version or sys version
+ }
+ }
+ } else {
+ bfile->tpath = bfile->fpath;
+ }
+}
+
+BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags) {
+ BFILE *bfile;
+
+ bfile = MEM_mallocN(sizeof(BFILE), "bfile-fopen");
+ bfile->type = BTF_FOPEN;
+ bfile->uflags = bflags;
+
+ /* From fopen() doc, we can guess some logic:
+ r BTF_READ
+ r+ BTF_READ | BTF_WRITE
+ w BTF_DISCARD | BTF_WRITE
+ w+ BTF_DISCARD | BTF_WRITE | BTF_READ
+ a BTF_AT_END | BTF_WRITE
+ a+ BTF_AT_END | BTF_WRITE | BTF_READ
+ */
+ if(strchr(mode, 'r'))
+ bfile->type |= BTF_READ;
+ if(strchr(mode, 'w'))
+ bfile->type |= (BTF_DISCARD | BTF_WRITE);
+ if(strchr(mode, 'a'))
+ bfile->type |= (BTF_AT_END | BTF_WRITE);
+ if(strchr(mode, '+'))
+ bfile->type |= (BTF_READ | BTF_WRITE);
+
+ fill_paths(bfile, path);
+
+ bfile->stream = fopen(bfile->tpath, mode);
+ // detect failed fopen
+ bfile->fd = fileno(bfile->stream);
+ return bfile;
+}
+
+
+BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags) {
+ BFILE *bfile;
+
+ bfile = MEM_mallocN(sizeof(BFILE), "bfile-open");
+ bfile->type = BTF_OPEN;
+ bfile->uflags = bflags;
+
+ /* Easy mapping for open() */
+ if(flags & O_RDONLY)
+ bfile->type |= BTF_READ;
+ if(flags & O_WRONLY)
+ bfile->type |= BTF_WRITE;
+ if(flags & O_RDWR)
+ bfile->type |= (BTF_READ | BTF_WRITE);
+ if(flags & O_APPEND)
+ bfile->type |= BTF_AT_END;
+ if(flags & O_TRUNC)
+ bfile->type |= BTF_DISCARD;
+
+ fill_paths(bfile, pathname);
+
+ bfile->fd = open(bfile->tpath, flags);
+ // detect failed open
+// bfile->stream = fdopen(bfile->fd, XXX); /* MSWindows _fdopen? */
+ 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;
+
+ 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;
+
+ 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->type | BTF_WRITE) &&
+ !(bfile->uflags | BFILE_RAW)) {
+ /* Make sure data is on disk */
+ /* Move to final name if no errors */
+ }
+
+ /* Normal close */
+
+ /* Cleanup */
+ if(bfile->fpath) {
+ MEM_freeN(bfile->fpath);
+ }
+ if(bfile->tpath) {
+ MEM_freeN(bfile->tpath);
+ }
+}
+
+
+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;
+ }
+}
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index 0f8194362c9..48bbfc12370 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -329,7 +329,7 @@ static void sort(BVHNode **a0, int begin, int end, int axis)
bvh_insertionsort(a, begin, end, axis);
}
}
-void sort_along_axis(BVHTree *tree, int start, int end, int axis)
+static void sort_along_axis(BVHTree *tree, int start, int end, int axis)
{
sort(tree->nodes, start, end, axis);
}
@@ -337,7 +337,7 @@ void sort_along_axis(BVHTree *tree, int start, int end, int axis)
//after a call to this function you can expect one of:
// every node to left of a[n] are smaller or equal to it
// every node to the right of a[n] are greater or equal to it
-int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int axis){
+static int partition_nth_element(BVHNode **a, int _begin, int _end, int n, int axis){
int begin = _begin, end = _end, cut;
while(end-begin > 3)
{
@@ -1173,7 +1173,7 @@ static float squared_dist(const float *a, const float *b)
}
//Determines the nearest point of the given node BV. Returns the squared distance to that point.
-static float calc_nearest_point(BVHNearestData *data, BVHNode *node, float *nearest)
+static float calc_nearest_point(const float *proj, BVHNode *node, float *nearest)
{
int i;
const float *bv = node->bv;
@@ -1181,12 +1181,12 @@ static float calc_nearest_point(BVHNearestData *data, BVHNode *node, float *near
//nearest on AABB hull
for(i=0; i != 3; i++, bv += 2)
{
- if(bv[0] > data->proj[i])
+ if(bv[0] > proj[i])
nearest[i] = bv[0];
- else if(bv[1] < data->proj[i])
+ else if(bv[1] < proj[i])
nearest[i] = bv[1];
else
- nearest[i] = data->proj[i];
+ nearest[i] = proj[i];
}
/*
@@ -1208,7 +1208,7 @@ static float calc_nearest_point(BVHNearestData *data, BVHNode *node, float *near
}
}
*/
- return squared_dist(data->co, nearest);
+ return squared_dist(proj, nearest);
}
@@ -1231,7 +1231,7 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
else
{
data->nearest.index = node->index;
- data->nearest.dist = calc_nearest_point(data, node, data->nearest.co);
+ data->nearest.dist = calc_nearest_point(data->proj, node, data->nearest.co);
}
}
else
@@ -1240,12 +1240,12 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
int i;
float nearest[3];
- if(data->proj[ (int)node->main_axis ] <= node->children[0]->bv[(int)node->main_axis*2+1])
+ if(data->proj[ node->main_axis ] <= node->children[0]->bv[node->main_axis*2+1])
{
for(i=0; i != node->totnode; i++)
{
- if( calc_nearest_point(data, node->children[i], nearest) >= data->nearest.dist) continue;
+ if( calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
dfs_find_nearest_dfs(data, node->children[i]);
}
}
@@ -1253,7 +1253,7 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
{
for(i=node->totnode-1; i >= 0 ; i--)
{
- if( calc_nearest_point(data, node->children[i], nearest) >= data->nearest.dist) continue;
+ if( calc_nearest_point(data->proj, node->children[i], nearest) >= data->nearest.dist) continue;
dfs_find_nearest_dfs(data, node->children[i]);
}
}
@@ -1263,7 +1263,7 @@ static void dfs_find_nearest_dfs(BVHNearestData *data, BVHNode *node)
static void dfs_find_nearest_begin(BVHNearestData *data, BVHNode *node)
{
float nearest[3], sdist;
- sdist = calc_nearest_point(data, node, nearest);
+ sdist = calc_nearest_point(data->proj, node, nearest);
if(sdist >= data->nearest.dist) return;
dfs_find_nearest_dfs(data, node);
}
@@ -1301,7 +1301,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
}
current.node = node;
- current.dist = calc_nearest_point(data, node, nearest);
+ current.dist = calc_nearest_point(data->proj, node, nearest);
while(current.dist < data->nearest.dist)
{
@@ -1329,7 +1329,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
}
heap[heap_size].node = current.node->children[i];
- heap[heap_size].dist = calc_nearest_point(data, current.node->children[i], nearest);
+ heap[heap_size].dist = calc_nearest_point(data->proj, current.node->children[i], nearest);
if(heap[heap_size].dist >= data->nearest.dist) continue;
heap_size++;
@@ -1355,6 +1355,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node)
}
#endif
+
int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nearest, BVHTree_NearestPointCallback callback, void *userdata)
{
int i;
@@ -1405,10 +1406,9 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nea
*/
//Determines the distance that the ray must travel to hit the bounding volume of the given node
-static float ray_nearest_hit(BVHRayCastData *data, BVHNode *node)
+static float ray_nearest_hit(BVHRayCastData *data, float *bv)
{
int i;
- const float *bv = node->bv;
float low = 0, upper = data->hit.dist;
@@ -1449,7 +1449,7 @@ static void dfs_raycast(BVHRayCastData *data, BVHNode *node)
//ray-bv is really fast.. and simple tests revealed its worth to test it
//before calling the ray-primitive functions
- float dist = ray_nearest_hit(data, node);
+ float dist = ray_nearest_hit(data, node->bv);
if(dist >= data->hit.dist) return;
if(node->totnode == 0)
@@ -1527,3 +1527,121 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float
return data.hit.index;
}
+float BLI_bvhtree_bb_raycast(float *bv, float *light_start, float *light_end, float *pos)
+{
+ BVHRayCastData data;
+ float dist = 0.0;
+
+ data.hit.dist = FLT_MAX;
+
+ // get light direction
+ data.ray.direction[0] = light_end[0] - light_start[0];
+ data.ray.direction[1] = light_end[1] - light_start[1];
+ data.ray.direction[2] = light_end[2] - light_start[2];
+
+ data.ray.radius = 0.0;
+
+ data.ray.origin[0] = light_start[0];
+ data.ray.origin[1] = light_start[1];
+ data.ray.origin[2] = light_start[2];
+
+ Normalize(data.ray.direction);
+ VECCOPY(data.ray_dot_axis, data.ray.direction);
+
+ dist = ray_nearest_hit(&data, bv);
+
+ if(dist > 0.0)
+ {
+ VECADDFAC(pos, light_start, data.ray.direction, dist);
+ }
+ return dist;
+
+}
+
+/*
+ * Range Query - as request by broken :P
+ *
+ * Allocs and fills an array with the indexs of node that are on the given spherical range (center, radius)
+ * Returns the size of the array.
+ */
+typedef struct RangeQueryData
+{
+ BVHTree *tree;
+ const float *center;
+ float radius; //squared radius
+
+ int hits;
+
+ BVHTree_RangeQuery callback;
+ void *userdata;
+
+
+} RangeQueryData;
+
+
+static void dfs_range_query(RangeQueryData *data, BVHNode *node)
+{
+ if(node->totnode == 0)
+ {
+
+ //Calculate the node min-coords (if the node was a point then this is the point coordinates)
+ float co[3];
+ co[0] = node->bv[0];
+ co[1] = node->bv[2];
+ co[2] = node->bv[4];
+
+ }
+ else
+ {
+ int i;
+ for(i=0; i != node->totnode; i++)
+ {
+ float nearest[3];
+ float dist = calc_nearest_point(data->center, node->children[i], nearest);
+ if(dist < data->radius)
+ {
+ //Its a leaf.. call the callback
+ if(node->children[i]->totnode == 0)
+ {
+ data->hits++;
+ data->callback( data->userdata, node->children[i]->index, dist );
+ }
+ else
+ dfs_range_query( data, node->children[i] );
+ }
+ }
+ }
+}
+
+int BLI_bvhtree_range_query(BVHTree *tree, const float *co, float radius, BVHTree_RangeQuery callback, void *userdata)
+{
+ BVHNode * root = tree->nodes[tree->totleaf];
+
+ RangeQueryData data;
+ data.tree = tree;
+ data.center = co;
+ data.radius = radius*radius;
+ data.hits = 0;
+
+ data.callback = callback;
+ data.userdata = userdata;
+
+ if(root != NULL)
+ {
+ float nearest[3];
+ float dist = calc_nearest_point(data.center, root, nearest);
+ if(dist < data.radius)
+ {
+ //Its a leaf.. call the callback
+ if(root->totnode == 0)
+ {
+ data.hits++;
+ data.callback( data.userdata, root->index, dist );
+ }
+ else
+ dfs_range_query( &data, root );
+ }
+ }
+
+ return data.hits;
+}
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
index 8e8b2e9f0e9..ccf79ed42dc 100644
--- a/source/blender/blenlib/intern/BLI_kdtree.c
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -130,7 +130,7 @@ void BLI_kdtree_balance(KDTree *tree)
tree->root= kdtree_balance(tree->nodes, tree->totnode, 0);
}
-static float squared_distance(float *v1, float *v2, float *n1, float *n2)
+static float squared_distance(float *v2, float *v1, float *n1, float *n2)
{
float d[3], dist;
@@ -140,7 +140,8 @@ static float squared_distance(float *v1, float *v2, float *n1, float *n2)
dist= d[0]*d[0] + d[1]*d[1] + d[2]*d[2];
- if(n1 && n2 && n1[0]*n2[0] + n1[1]*n2[1] + n1[2]*n2[2] < 0.0f)
+ //if(n1 && n2 && n1[0]*n2[0] + n1[1]*n2[1] + n1[2]*n2[2] < 0.0f)
+ if(n2 && d[0]*n2[0] + d[1]*n2[1] + d[2]*n2[2] < 0.0f)
dist *= 10.0f;
return dist;
@@ -336,3 +337,111 @@ int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTree
return found;
}
+static int range_compare(const void * a, const void * b)
+{
+ const KDTreeNearest *kda = a;
+ const KDTreeNearest *kdb = b;
+
+ if(kda->dist < kdb->dist)
+ return -1;
+ else if(kda->dist > kdb->dist)
+ return 1;
+ else
+ return 0;
+}
+static void add_in_range(KDTreeNearest **ptn, int found, int *totfoundstack, int index, float dist, float *co)
+{
+ KDTreeNearest *to;
+
+ if(found+1 > *totfoundstack) {
+ KDTreeNearest *temp=MEM_callocN((*totfoundstack+50)*sizeof(KDTreeNode), "psys_treefoundstack");
+ memcpy(temp, *ptn, *totfoundstack * sizeof(KDTreeNearest));
+ if(*ptn)
+ MEM_freeN(*ptn);
+ *ptn = temp;
+ *totfoundstack+=50;
+ }
+
+ to = (*ptn) + found;
+
+ to->index = index;
+ to->dist = sqrt(dist);
+ VecCopyf(to->co, co);
+}
+int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KDTreeNearest **nearest)
+{
+ KDTreeNode *root, *node=0;
+ KDTreeNode **stack, *defaultstack[100];
+ KDTreeNearest *foundstack=NULL;
+ float range2 = range*range, dist2;
+ int totstack, cur=0, found=0, totfoundstack=0;
+
+ if(!tree || !tree->root)
+ return 0;
+
+ stack= defaultstack;
+ totstack= 100;
+
+ root= tree->root;
+
+ if(co[root->d] + range < root->co[root->d]) {
+ if(root->left)
+ stack[cur++]=root->left;
+ }
+ else if(co[root->d] - range > root->co[root->d]) {
+ if(root->right)
+ stack[cur++]=root->right;
+ }
+ else {
+ dist2 = squared_distance(root->co, co, root->nor, nor);
+ if(dist2 <= range2)
+ add_in_range(&foundstack, found++, &totfoundstack, root->index, dist2, root->co);
+
+ if(root->left)
+ stack[cur++]=root->left;
+ if(root->right)
+ stack[cur++]=root->right;
+ }
+
+ while(cur--) {
+ node=stack[cur];
+
+ if(co[node->d] + range < node->co[node->d]) {
+ if(node->left)
+ stack[cur++]=node->left;
+ }
+ else if(co[node->d] - range > node->co[node->d]) {
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+ else {
+ dist2 = squared_distance(node->co, co, node->nor, nor);
+ if(dist2 <= range2)
+ add_in_range(&foundstack, found++, &totfoundstack, node->index, dist2, node->co);
+
+ if(node->left)
+ stack[cur++]=node->left;
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+
+ if(cur+3 > totstack){
+ KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
+ memcpy(temp,stack,totstack*sizeof(KDTreeNode*));
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+ stack=temp;
+ totstack+=100;
+ }
+ }
+
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+
+ if(found)
+ qsort(foundstack, found, sizeof(KDTreeNearest), range_compare);
+
+ *nearest = foundstack;
+
+ return found;
+}
diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c
index 7ac7b8b1791..485ba7cbd08 100644
--- a/source/blender/blenlib/intern/BLI_mempool.c
+++ b/source/blender/blenlib/intern/BLI_mempool.c
@@ -56,7 +56,10 @@ BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk)
BLI_freenode *lasttail = NULL, *curnode = NULL;
int i,j, maxchunks;
char *addr;
-
+
+ if (esize < sizeof(void*))
+ esize = sizeof(void*);
+
/*allocate the pool structure*/
pool = MEM_mallocN(sizeof(BLI_mempool),"memory pool");
pool->esize = esize;
diff --git a/source/blender/blenlib/intern/DLRB_tree.c b/source/blender/blenlib/intern/DLRB_tree.c
new file mode 100644
index 00000000000..af9774c6afd
--- /dev/null
+++ b/source/blender/blenlib/intern/DLRB_tree.c
@@ -0,0 +1,353 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (original author)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_dlrbTree.h"
+
+#include "DNA_listBase.h"
+
+/* *********************************************** */
+/* Tree API */
+
+/* Create a new tree, and initialise as necessary */
+DLRBT_Tree *BLI_dlrbTree_new (void)
+{
+ /* just allocate for now */
+ return MEM_callocN(sizeof(DLRBT_Tree), "DLRBT_Tree");
+}
+
+/* Just zero out the pointers used */
+void BLI_dlrbTree_init (DLRBT_Tree *tree)
+{
+ if (tree == NULL)
+ return;
+
+ tree->first= tree->last= tree->root= NULL;
+}
+
+/* Helper for traversing tree and freeing sub-nodes */
+static void recursive_tree_free_nodes (DLRBT_Node *node)
+{
+ /* sanity check */
+ if (node == NULL)
+ return;
+
+ /* free child nodes + subtrees */
+ recursive_tree_free_nodes(node->left);
+ recursive_tree_free_nodes(node->right);
+
+ /* free self */
+ MEM_freeN(node);
+}
+
+/* Free the given tree's data but not the tree itself */
+void BLI_dlrbTree_free (DLRBT_Tree *tree)
+{
+ if (tree == NULL)
+ return;
+
+ /* if the list-base stuff is set, just use that (and assume its set),
+ * otherwise, we'll need to traverse the tree...
+ */
+ if (tree->first) {
+ /* free list */
+ BLI_freelistN((ListBase *)tree);
+ }
+ else {
+ /* traverse tree, freeing sub-nodes */
+ recursive_tree_free_nodes(tree->root);
+ }
+
+ /* clear pointers */
+ tree->first= tree->last= tree->root= NULL;
+}
+
+/* ------- */
+
+/* Helper function - used for traversing down the tree from the root to add nodes in order */
+static void linkedlist_sync_add_node (DLRBT_Tree *tree, DLRBT_Node *node)
+{
+ /* sanity checks */
+ if ((tree == NULL) || (node == NULL))
+ return;
+
+ /* add left-node (and its subtree) */
+ linkedlist_sync_add_node(tree, node->left);
+
+ /* now add self
+ * - must remove detach from other links first
+ * (for now, only clear own pointers)
+ */
+ node->prev= node->next= NULL;
+ BLI_addtail((ListBase *)tree, (Link *)node);
+
+ /* finally, add right node (and its subtree) */
+ linkedlist_sync_add_node(tree, node->right);
+}
+
+/* Make sure the tree's Double-Linked list representation is valid */
+void BLI_dlrbTree_linkedlist_sync (DLRBT_Tree *tree)
+{
+ /* sanity checks */
+ if (tree == NULL)
+ return;
+
+ /* clear list-base pointers so that the new list can be added properly */
+ tree->first= tree->last= NULL;
+
+ /* start adding items from the root */
+ linkedlist_sync_add_node(tree, tree->root);
+}
+
+/* *********************************************** */
+/* Tree Relationships Utilities */
+
+/* get the 'grandparent' - the parent of the parent - of the given node */
+static DLRBT_Node *get_grandparent (DLRBT_Node *node)
+{
+ if (node && node->parent)
+ return node->parent->parent;
+ else
+ return NULL;
+}
+
+/* get the 'uncle' - the sibling of the parent - of the given node */
+static DLRBT_Node *get_uncle (DLRBT_Node *node)
+{
+ DLRBT_Node *gpn= get_grandparent(node);
+
+ /* return the child of the grandparent which isn't the node's parent */
+ if (gpn) {
+ if (gpn->left == node->parent)
+ return gpn->right;
+ else
+ return gpn->left;
+ }
+
+ /* not found */
+ return NULL;
+}
+
+/* *********************************************** */
+/* Tree Rotation Utilities */
+
+static void rotate_left (DLRBT_Tree *tree, DLRBT_Node *root)
+{
+ DLRBT_Node **root_slot, *pivot;
+
+ /* pivot is simply the root's right child, to become the root's parent */
+ pivot= root->right;
+ if (pivot == NULL)
+ return;
+
+ if (root->parent) {
+ if (root == root->parent->left)
+ root_slot= &root->parent->left;
+ else
+ root_slot= &root->parent->right;
+ }
+ else
+ root_slot= ((DLRBT_Node**)&tree->root);//&((DLRBT_Node*)tree->root);
+
+ /* - pivot's left child becomes root's right child
+ * - root now becomes pivot's left child
+ */
+ root->right= pivot->left;
+ if (pivot->left) pivot->left->parent= root;
+
+ pivot->left= root;
+ pivot->parent= root->parent;
+ root->parent= pivot;
+
+ /* make the pivot the new root */
+ if (root_slot)
+ *root_slot= pivot;
+}
+
+static void rotate_right (DLRBT_Tree *tree, DLRBT_Node *root)
+{
+ DLRBT_Node **root_slot, *pivot;
+
+ /* pivot is simply the root's left child, to become the root's parent */
+ pivot= root->left;
+ if (pivot == NULL)
+ return;
+
+ if (root->parent) {
+ if (root == root->parent->left)
+ root_slot= &root->parent->left;
+ else
+ root_slot= &root->parent->right;
+ }
+ else
+ root_slot= ((DLRBT_Node**)&tree->root);//&((DLRBT_Node*)tree->root);
+
+ /* - pivot's right child becomes root's left child
+ * - root now becomes pivot's right child
+ */
+ root->left= pivot->right;
+ if (pivot->right) pivot->right->parent= root;
+
+ pivot->right= root;
+ pivot->parent= root->parent;
+ root->parent= pivot;
+
+ /* make the pivot the new root */
+ if (root_slot)
+ *root_slot= pivot;
+}
+
+/* *********************************************** */
+/* Post-Insertion Balancing */
+
+/* forward defines for insertion checks */
+static void insert_check_1(DLRBT_Tree *tree, DLRBT_Node *node);
+static void insert_check_2(DLRBT_Tree *tree, DLRBT_Node *node);
+static void insert_check_3(DLRBT_Tree *tree, DLRBT_Node *node);
+
+/* ----- */
+
+/* W. 1) Root must be black (so that the 2nd-generation can have a black parent) */
+static void insert_check_1 (DLRBT_Tree *tree, DLRBT_Node *node)
+{
+ if (node) {
+ /* if this is the root, just ensure that it is black */
+ if (node->parent == NULL)
+ node->tree_col= DLRBT_BLACK;
+ else
+ insert_check_2(tree, node);
+ }
+}
+
+/* W. 2+3) Parent of node must be black, otherwise recolor and flush */
+static void insert_check_2 (DLRBT_Tree *tree, DLRBT_Node *node)
+{
+ /* if the parent is not black, we need to change that... */
+ if (node && node->parent && node->parent->tree_col) {
+ DLRBT_Node *unc= get_uncle(node);
+
+ /* if uncle and parent are both red, need to change them to black and make
+ * the parent black in order to satisfy the criteria of each node having the
+ * same number of black nodes to its leaves
+ */
+ if (unc && unc->tree_col) {
+ DLRBT_Node *gp= get_grandparent(node);
+
+ /* make the n-1 generation nodes black */
+ node->parent->tree_col= unc->tree_col= DLRBT_BLACK;
+
+ /* - make the grandparent red, so that we maintain alternating red/black property
+ * (it must exist, so no need to check for NULL here),
+ * - as the grandparent may now cause inconsistencies with the rest of the tree,
+ * we must flush up the tree and perform checks/rebalancing/repainting, using the
+ * grandparent as the node of interest
+ */
+ gp->tree_col= DLRBT_RED;
+ insert_check_1(tree, gp);
+ }
+ else {
+ /* we've got an unbalanced branch going down the grandparent to the parent,
+ * so need to perform some rotations to re-balance the tree
+ */
+ insert_check_3(tree, node);
+ }
+ }
+}
+
+/* W. 4+5) Perform rotation on sub-tree containing the 'new' node, then do any */
+static void insert_check_3 (DLRBT_Tree *tree, DLRBT_Node *node)
+{
+ DLRBT_Node *gp= get_grandparent(node);
+
+ /* check that grandparent and node->parent exist (jut in case... really shouldn't happen on a good tree) */
+ if (node && node->parent && gp) {
+ /* a left rotation will switch the roles of node and its parent, assuming that
+ * the parent is the left child of the grandparent... otherwise, rotation direction
+ * should be swapped
+ */
+ if ((node == node->parent->right) && (node->parent == gp->left)) {
+ rotate_left(tree, node);
+ node= node->left;
+ }
+ else if ((node == node->parent->left) && (node->parent == gp->right)) {
+ rotate_right(tree, node);
+ node= node->right;
+ }
+
+ /* fix old parent's color-tagging, and perform rotation on the old parent in the
+ * opposite direction if needed for the current situation
+ * NOTE: in the code above, node pointer is changed to point to the old parent
+ */
+ if (node) {
+ /* get 'new' grandparent (i.e. grandparent for old-parent (node)) */
+ gp= get_grandparent(node);
+
+ /* modify the coloring of the grandparent and parent so that they still satisfy the constraints */
+ node->parent->tree_col= DLRBT_BLACK;
+ gp->tree_col= DLRBT_RED;
+
+ /* if there are several nodes that all form a left chain, do a right rotation to correct this
+ * (or a rotation in the opposite direction if they all form a right chain)
+ */
+ if ((node == node->parent->left) && (node->parent == gp->left))
+ rotate_right(tree, gp);
+ else //if ((node == node->parent->right) && (node->parent == gp->right))
+ rotate_left(tree, gp);
+ }
+ }
+}
+
+/* ----- */
+
+/* Balance the tree after the given element has been added to it
+ * (using custom code, in the Binary Tree way).
+ */
+void BLI_dlrbTree_insert(DLRBT_Tree *tree, DLRBT_Node *node)
+{
+ /* sanity checks */
+ if ((tree == NULL) || (node == NULL))
+ return;
+
+ /* firstly, the node we just added should be red by default */
+ node->tree_col= DLRBT_RED;
+
+ /* start from case 1, an trek through the tail-recursive insertion checks */
+ insert_check_1(tree, node);
+}
+
+/* *********************************************** */
+/* Remove */
+
+// TODO: this hasn't been coded yet, since this functionality was not needed by the author
+
+/* *********************************************** */
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c
index f111e94a141..26bbbf040f3 100644
--- a/source/blender/blenlib/intern/arithb.c
+++ b/source/blender/blenlib/intern/arithb.c
@@ -92,21 +92,41 @@ float sasqrt(float fac)
return (float)sqrt(fac);
}
+float saacosf(float fac)
+{
+ if(fac<= -1.0f) return (float)M_PI;
+ else if(fac>=1.0f) return 0.0f;
+ else return (float)acosf(fac);
+}
+
+float saasinf(float fac)
+{
+ if(fac<= -1.0f) return (float)-M_PI/2.0f;
+ else if(fac>=1.0f) return (float)M_PI/2.0f;
+ else return (float)asinf(fac);
+}
+
+float sasqrtf(float fac)
+{
+ if(fac<=0.0) return 0.0;
+ return (float)sqrtf(fac);
+}
+
float Normalize(float *n)
{
float d;
d= n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
/* A larger value causes normalize errors in a scaled down models with camera xtreme close */
- if(d>1.0e-35F) {
+ if(d>1.0e-35f) {
d= (float)sqrt(d);
n[0]/=d;
n[1]/=d;
n[2]/=d;
} else {
- n[0]=n[1]=n[2]= 0.0;
- d= 0.0;
+ n[0]=n[1]=n[2]= 0.0f;
+ d= 0.0f;
}
return d;
}
@@ -594,17 +614,17 @@ void Mat4CpyMat4(float m1[][4], float m2[][4])
memcpy(m1, m2, 4*4*sizeof(float));
}
-void Mat4SwapMat4(float *m1, float *m2)
+void Mat4SwapMat4(float m1[][4], float m2[][4])
{
float t;
- int i;
+ int i, j;
- for(i=0;i<16;i++) {
- t= *m1;
- *m1= *m2;
- *m2= t;
- m1++;
- m2++;
+ for(i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++) {
+ t = m1[i][j];
+ m1[i][j] = m2[i][j];
+ m2[i][j] = t;
+ }
}
}
@@ -834,6 +854,26 @@ void Mat3One(float m[][3])
m[2][0]= m[2][1]= 0.0;
}
+void Mat4Scale(float m[][4], float scale)
+{
+
+ m[0][0]= m[1][1]= m[2][2]= scale;
+ m[3][3]= 1.0;
+ m[0][1]= m[0][2]= m[0][3]= 0.0;
+ m[1][0]= m[1][2]= m[1][3]= 0.0;
+ m[2][0]= m[2][1]= m[2][3]= 0.0;
+ m[3][0]= m[3][1]= m[3][2]= 0.0;
+}
+
+void Mat3Scale(float m[][3], float scale)
+{
+
+ m[0][0]= m[1][1]= m[2][2]= scale;
+ m[0][1]= m[0][2]= 0.0;
+ m[1][0]= m[1][2]= 0.0;
+ m[2][0]= m[2][1]= 0.0;
+}
+
void Mat4MulVec( float mat[][4], int *vec)
{
int x,y;
@@ -1388,22 +1428,6 @@ void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3])
AxisAngleToQuat(q, axis, angle);
}
-void AxisAngleToQuat(float *q, float *axis, float angle)
-{
- float nor[3];
- float si;
-
- VecCopyf(nor, axis);
- Normalize(nor);
-
- angle /= 2;
- si = (float)sin(angle);
- q[0] = (float)cos(angle);
- q[1] = nor[0] * si;
- q[2] = nor[1] * si;
- q[3] = nor[2] * si;
-}
-
void vectoquat(float *vec, short axis, short upflag, float *q)
{
float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;
@@ -1590,7 +1614,7 @@ void VecUpMat3(float *vec, float mat[][3], short axis)
}
/* A & M Watt, Advanced animation and rendering techniques, 1992 ACM press */
-void QuatInterpolW(float *, float *, float *, float );
+void QuatInterpolW(float *, float *, float *, float ); // XXX why this?
void QuatInterpolW(float *result, float *quat1, float *quat2, float t)
{
@@ -2156,23 +2180,47 @@ void VecSubf(float *v, float *v1, float *v2)
v[2]= v1[2]- v2[2];
}
-void VecLerpf(float *target, float *a, float *b, float t)
+void VecMulVecf(float *v, float *v1, float *v2)
+{
+ v[0] = v1[0] * v2[0];
+ v[1] = v1[1] * v2[1];
+ v[2] = v1[2] * v2[2];
+}
+
+void VecLerpf(float *target, const float *a, const float *b, const float t)
{
- float s = 1.0f-t;
+ const float s = 1.0f-t;
target[0]= s*a[0] + t*b[0];
target[1]= s*a[1] + t*b[1];
target[2]= s*a[2] + t*b[2];
}
-void Vec2Lerpf(float *target, float *a, float *b, float t)
+void Vec2Lerpf(float *target, const float *a, const float *b, const float t)
{
- float s = 1.0f-t;
+ const float s = 1.0f-t;
target[0]= s*a[0] + t*b[0];
target[1]= s*a[1] + t*b[1];
}
+/* weight 3 vectors, (VecWeightf in 2.4x)
+ * 'w' must be unit length but is not a vector, just 3 weights */
+void VecLerp3f(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
+{
+ p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
+ p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
+ p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2];
+}
+
+/* weight 3 2D vectors, (Vec2Weightf in 2.4x)
+ * 'w' must be unit length but is not a vector, just 3 weights */
+void Vec2Lerp3f(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3])
+{
+ p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
+ p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
+}
+
void VecMidf(float *v, float *v1, float *v2)
{
v[0]= 0.5f*(v1[0]+ v2[0]);
@@ -2197,25 +2245,23 @@ void VecNegf(float *v1)
void VecOrthoBasisf(float *v, float *v1, float *v2)
{
- float f = (float)sqrt(v[0]*v[0] + v[1]*v[1]);
+ const float f = (float)sqrt(v[0]*v[0] + v[1]*v[1]);
if (f < 1e-35f) {
// degenerate case
- v1[0] = 0.0f; v1[1] = 1.0f; v1[2] = 0.0f;
- if (v[2] > 0.0f) {
- v2[0] = 1.0f; v2[1] = v2[2] = 0.0f;
- }
- else {
- v2[0] = -1.0f; v2[1] = v2[2] = 0.0f;
- }
+ v1[0] = (v[2] < 0.0f) ? -1.0f : 1.0f;
+ v1[1] = v1[2] = v2[0] = v2[2] = 0.0f;
+ v2[1] = 1.0f;
}
else {
- f = 1.0f/f;
- v1[0] = v[1]*f;
- v1[1] = -v[0]*f;
- v1[2] = 0.0f;
+ const float d= 1.0f/f;
- Crossf(v2, v, v1);
+ v1[0] = v[1]*d;
+ v1[1] = -v[0]*d;
+ v1[2] = 0.0f;
+ v2[0] = -v[2]*v1[1];
+ v2[1] = v[2]*v1[0];
+ v2[2] = v[0]*v1[1] - v[1]*v1[0];
}
}
@@ -2782,6 +2828,241 @@ void MeanValueWeights(float v[][3], int n, float *co, float *w)
/* ************ EULER *************** */
+/* Euler Rotation Order Code:
+ * was adapted from
+ ANSI C code from the article
+ "Euler Angle Conversion"
+ by Ken Shoemake, shoemake@graphics.cis.upenn.edu
+ in "Graphics Gems IV", Academic Press, 1994
+ * for use in Blender
+ */
+
+/* Type for rotation order info - see wiki for derivation details */
+typedef struct RotOrderInfo {
+ short i; /* first axis index */
+ short j; /* second axis index */
+ short k; /* third axis index */
+ short parity; /* parity of axis permuation (even=0, odd=1) - 'n' in original code */
+} RotOrderInfo;
+
+/* Array of info for Rotation Order calculations
+ * WARNING: must be kept in same order as eEulerRotationOrders
+ */
+static RotOrderInfo rotOrders[]= {
+ /* i, j, k, n */
+ {0, 1, 2, 0}, // XYZ
+ {0, 2, 1, 1}, // XZY
+ {1, 0, 2, 1}, // YXZ
+ {1, 2, 0, 0}, // YZX
+ {2, 0, 1, 0}, // ZXY
+ {2, 1, 0, 1} // ZYZ
+};
+
+/* Get relevant pointer to rotation order set from the array
+ * 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])
+
+/* Construct quaternion from Euler angles (in radians). */
+void EulOToQuat(float e[3], short order, float q[4])
+{
+ RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
+ short i=R->i, j=R->j, k=R->k;
+ 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];
+
+ ci = cos(ti); cj = cos(tj); ch = cos(th);
+ si = sin(ti); sj = sin(tj); sh = sin(th);
+
+ cc = ci*ch; cs = ci*sh;
+ sc = si*ch; ss = si*sh;
+
+ a[i] = cj*sc - sj*cs;
+ a[j] = cj*ss + sj*cc;
+ a[k] = cj*cs - sj*sc;
+
+ q[0] = cj*cc + sj*ss;
+ q[1] = a[0];
+ q[2] = a[1];
+ q[3] = a[2];
+
+ if (R->parity) q[j] = -q[j];
+}
+
+/* Convert quaternion to Euler angles (in radians). */
+void QuatToEulO(float q[4], float e[3], short order)
+{
+ float M[3][3];
+
+ QuatToMat3(q, M);
+ Mat3ToEulO(M, e, order);
+}
+
+/* Construct 3x3 matrix from Euler angles (in radians). */
+void EulOToMat3(float e[3], short order, float M[3][3])
+{
+ RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
+ short i=R->i, j=R->j, k=R->k;
+ double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
+
+ if (R->parity) {
+ ti = -e[i]; tj = -e[j]; th = -e[k];
+ }
+ else {
+ ti = e[i]; tj = e[j]; th = e[k];
+ }
+
+ ci = cos(ti); cj = cos(tj); ch = cos(th);
+ si = sin(ti); sj = sin(tj); sh = sin(th);
+
+ cc = ci*ch; cs = ci*sh;
+ sc = si*ch; ss = si*sh;
+
+ M[i][i] = cj*ch; M[j][i] = sj*sc-cs; M[k][i] = sj*cc+ss;
+ M[i][j] = cj*sh; M[j][j] = sj*ss+cc; M[k][j] = sj*cs-sc;
+ M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci;
+}
+
+/* Construct 4x4 matrix from Euler angles (in radians). */
+void EulOToMat4(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) */
+ Mat3Ortho(m);
+ EulOToMat3(e, order, m);
+ Mat4CpyMat3(M, m);
+}
+
+/* Convert 3x3 matrix to Euler angles (in radians). */
+void Mat3ToEulO(float M[3][3], float e[3], short order)
+{
+ RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
+ short i=R->i, j=R->j, k=R->k;
+ 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 Mat4ToEulO(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) */
+ Mat3CpyMat4(m, M);
+ Mat3Ortho(m);
+ Mat3ToEulO(m, e, order);
+}
+
+/* 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)
+{
+ RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
+ short i=R->i, j=R->j, k=R->k;
+ float m[3][3];
+ double cy;
+
+ /* process the matrix first */
+ Mat3CpyMat3(m, M);
+ Mat3Ortho(m);
+
+ cy= sqrt(m[i][i]*m[i][i] + m[i][j]*m[i][j]);
+
+ if (cy > 16*FLT_EPSILON) {
+ e1[i] = atan2(m[j][k], m[k][k]);
+ e1[j] = atan2(-m[i][k], cy);
+ e1[k] = atan2(m[i][j], m[i][i]);
+
+ e2[i] = atan2(-m[j][k], -m[k][k]);
+ e2[j] = atan2(-m[i][k], -cy);
+ e2[k] = atan2(-m[i][j], -m[i][i]);
+ }
+ else {
+ e1[i] = atan2(-m[k][j], m[j][j]);
+ e1[j] = atan2(-m[i][k], cy);
+ e1[k] = 0;
+
+ VecCopyf(e2, e1);
+ }
+
+ if (R->parity) {
+ e1[0] = -e1[0];
+ e1[1] = -e1[1];
+ e1[2] = -e1[2];
+
+ e2[0] = -e2[0];
+ e2[1] = -e2[1];
+ e2[2] = -e2[2];
+ }
+}
+
+/* uses 2 methods to retrieve eulers, and picks the closest */
+void Mat3ToCompatibleEulO(float mat[3][3], float eul[3], float oldrot[3], short order)
+{
+ float eul1[3], eul2[3];
+ float d1, d2;
+
+ mat3_to_eulo2(mat, eul1, eul2, order);
+
+ compatible_eul(eul1, oldrot);
+ compatible_eul(eul2, oldrot);
+
+ d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]);
+ d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]);
+
+ /* return best, which is just the one with lowest difference */
+ if (d1 > d2)
+ VecCopyf(eul, eul2);
+ else
+ VecCopyf(eul, eul1);
+}
+
+/* rotate the given euler by the given angle on the specified axis */
+// NOTE: is this safe to do with different axis orders?
+void eulerO_rot(float beul[3], float ang, char axis, short order)
+{
+ float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+ if (axis=='x')
+ eul[0]= ang;
+ else if (axis=='y')
+ eul[1]= ang;
+ else
+ eul[2]= ang;
+
+ EulOToMat3(eul, order, mat1);
+ EulOToMat3(beul, order, mat2);
+
+ Mat3MulMat3(totmat, mat2, mat1);
+
+ Mat3ToEulO(totmat, beul, order);
+}
+
+/* ************ EULER (old XYZ) *************** */
+
+/* XYZ order */
void EulToMat3( float *eul, float mat[][3])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -2809,6 +3090,7 @@ void EulToMat3( float *eul, float mat[][3])
}
+/* XYZ order */
void EulToMat4( float *eul,float mat[][4])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -2840,6 +3122,7 @@ void EulToMat4( float *eul,float mat[][4])
}
/* 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)
{
float cy, quat[4], mat[3][3];
@@ -2870,6 +3153,7 @@ static void mat3_to_eul2(float tmat[][3], float *eul1, float *eul2)
}
}
+/* XYZ order */
void Mat3ToEul(float tmat[][3], float *eul)
{
float eul1[3], eul2[3];
@@ -2885,6 +3169,7 @@ void Mat3ToEul(float tmat[][3], float *eul)
}
}
+/* XYZ order */
void Mat4ToEul(float tmat[][4], float *eul)
{
float tempMat[3][3];
@@ -2894,6 +3179,7 @@ void Mat4ToEul(float tmat[][4], float *eul)
Mat3ToEul(tempMat, eul);
}
+/* XYZ order */
void QuatToEul(float *quat, float *eul)
{
float mat[3][3];
@@ -2902,7 +3188,7 @@ void QuatToEul(float *quat, float *eul)
Mat3ToEul(mat, eul);
}
-
+/* XYZ order */
void EulToQuat(float *eul, float *quat)
{
float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -2918,6 +3204,261 @@ void EulToQuat(float *eul, float *quat)
quat[3] = cj*cs - sj*sc;
}
+/* XYZ order */
+void euler_rot(float *beul, float ang, char axis)
+{
+ float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+ if(axis=='x') eul[0]= ang;
+ else if(axis=='y') eul[1]= ang;
+ else eul[2]= ang;
+
+ EulToMat3(eul, mat1);
+ EulToMat3(beul, mat2);
+
+ Mat3MulMat3(totmat, mat2, mat1);
+
+ Mat3ToEul(totmat, beul);
+
+}
+
+/* exported to transform.c */
+/* order independent! */
+void compatible_eul(float *eul, float *oldrot)
+{
+ float dx, dy, dz;
+
+ /* correct differences of about 360 degrees first */
+ dx= eul[0] - oldrot[0];
+ dy= eul[1] - oldrot[1];
+ dz= eul[2] - oldrot[2];
+
+ while(fabs(dx) > 5.1) {
+ if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
+ dx= eul[0] - oldrot[0];
+ }
+ while(fabs(dy) > 5.1) {
+ if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
+ dy= eul[1] - oldrot[1];
+ }
+ while(fabs(dz) > 5.1) {
+ if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
+ dz= eul[2] - oldrot[2];
+ }
+
+ /* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */
+ if( fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6 ) {
+ if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
+ }
+ if( fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6 ) {
+ if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
+ }
+ if( fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6 ) {
+ if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
+ }
+
+ /* the method below was there from ancient days... but why! probably because the code sucks :)
+ */
+#if 0
+ /* calc again */
+ dx= eul[0] - oldrot[0];
+ dy= eul[1] - oldrot[1];
+ dz= eul[2] - oldrot[2];
+
+ /* special case, tested for x-z */
+
+ if( (fabs(dx) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dz) > 3.1 ) ) {
+ if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
+ if(eul[1] > 0.0) eul[1]= M_PI - eul[1]; else eul[1]= -M_PI - eul[1];
+ if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
+
+ }
+ else if( (fabs(dx) > 3.1 && fabs(dy) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dy) > 3.1 ) ) {
+ if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
+ if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
+ if(eul[2] > 0.0) eul[2]= M_PI - eul[2]; else eul[2]= -M_PI - eul[2];
+ }
+ else if( (fabs(dy) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dy) > 1.5 && fabs(dz) > 3.1 ) ) {
+ if(eul[0] > 0.0) eul[0]= M_PI - eul[0]; else eul[0]= -M_PI - eul[0];
+ if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
+ if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
+ }
+#endif
+}
+
+/* uses 2 methods to retrieve eulers, and picks the closest */
+/* XYZ order */
+void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot)
+{
+ float eul1[3], eul2[3];
+ float d1, d2;
+
+ mat3_to_eul2(mat, eul1, eul2);
+
+ compatible_eul(eul1, oldrot);
+ compatible_eul(eul2, oldrot);
+
+ d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]);
+ d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]);
+
+ /* return best, which is just the one with lowest difference */
+ if( d1 > d2) {
+ VecCopyf(eul, eul2);
+ }
+ else {
+ VecCopyf(eul, eul1);
+ }
+
+}
+
+/* ************ AXIS ANGLE *************** */
+
+/* Axis angle to Quaternions */
+void AxisAngleToQuat(float q[4], float axis[3], float angle)
+{
+ float nor[3];
+ float si;
+
+ VecCopyf(nor, axis);
+ Normalize(nor);
+
+ angle /= 2;
+ si = (float)sin(angle);
+ q[0] = (float)cos(angle);
+ q[1] = nor[0] * si;
+ q[2] = nor[1] * si;
+ q[3] = nor[2] * si;
+}
+
+/* Quaternions to Axis Angle */
+void QuatToAxisAngle(float q[4], float axis[3], float *angle)
+{
+ float ha, si;
+
+ /* calculate angle/2, and sin(angle/2) */
+ ha= (float)acos(q[0]);
+ si= (float)sin(ha);
+
+ /* from half-angle to angle */
+ *angle= ha * 2;
+
+ /* prevent division by zero for axis conversion */
+ if (fabs(si) < 0.0005)
+ si= 1.0f;
+
+ axis[0]= q[1] / si;
+ axis[1]= q[2] / si;
+ axis[2]= q[3] / si;
+}
+
+/* Axis Angle to Euler Rotation */
+void AxisAngleToEulO(float axis[3], float angle, float eul[3], short order)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation for now... */
+ AxisAngleToQuat(q, axis, angle);
+ QuatToEulO(q, eul, order);
+}
+
+/* Euler Rotation to Axis Angle */
+void EulOToAxisAngle(float eul[3], short order, float axis[3], float *angle)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation for now... */
+ EulOToQuat(eul, order, q);
+ QuatToAxisAngle(q, axis, angle);
+}
+
+/* axis angle to 3x3 matrix - safer version (normalisation of axis performed) */
+void AxisAngleToMat3(float axis[3], float angle, float mat[3][3])
+{
+ float nor[3], nsi[3], co, si, ico;
+
+ /* normalise the axis first (to remove unwanted scaling) */
+ VecCopyf(nor, axis);
+ Normalize(nor);
+
+ /* now convert this to a 3x3 matrix */
+ co= (float)cos(angle);
+ si= (float)sin(angle);
+
+ ico= (1.0f - co);
+ nsi[0]= nor[0]*si;
+ nsi[1]= nor[1]*si;
+ nsi[2]= nor[2]*si;
+
+ mat[0][0] = ((nor[0] * nor[0]) * ico) + co;
+ mat[0][1] = ((nor[0] * nor[1]) * ico) + nsi[2];
+ mat[0][2] = ((nor[0] * nor[2]) * ico) - nsi[1];
+ mat[1][0] = ((nor[0] * nor[1]) * ico) - nsi[2];
+ mat[1][1] = ((nor[1] * nor[1]) * ico) + co;
+ mat[1][2] = ((nor[1] * nor[2]) * ico) + nsi[0];
+ mat[2][0] = ((nor[0] * nor[2]) * ico) + nsi[1];
+ mat[2][1] = ((nor[1] * nor[2]) * ico) - nsi[0];
+ mat[2][2] = ((nor[2] * nor[2]) * ico) + co;
+}
+
+/* axis angle to 4x4 matrix - safer version (normalisation of axis performed) */
+void AxisAngleToMat4(float axis[3], float angle, float mat[4][4])
+{
+ float tmat[3][3];
+
+ AxisAngleToMat3(axis, angle, tmat);
+ Mat4One(mat);
+ Mat4CpyMat3(mat, tmat);
+}
+
+/* 3x3 matrix to axis angle (see Mat4ToVecRot too) */
+void Mat3ToAxisAngle(float mat[3][3], float axis[3], float *angle)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation */
+ // TODO: it would be nicer to go straight there...
+ Mat3ToQuat(mat, q);
+ QuatToAxisAngle(q, axis, angle);
+}
+
+/* 4x4 matrix to axis angle (see Mat4ToVecRot too) */
+void Mat4ToAxisAngle(float mat[4][4], float axis[3], float *angle)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation */
+ // TODO: it would be nicer to go straight there...
+ Mat4ToQuat(mat, q);
+ QuatToAxisAngle(q, axis, angle);
+}
+
+/* ************ AXIS ANGLE (unchecked) *************** */
+// TODO: the following calls should probably be depreceated sometime
+
+/* 3x3 matrix to axis angle */
+void Mat3ToVecRot(float mat[3][3], float axis[3], float *angle)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation */
+ // TODO: it would be nicer to go straight there...
+ Mat3ToQuat(mat, q);
+ QuatToAxisAngle(q, axis, angle);
+}
+
+/* 4x4 matrix to axis angle */
+void Mat4ToVecRot(float mat[4][4], float axis[3], float *angle)
+{
+ float q[4];
+
+ /* use quaternions as intermediate representation */
+ // TODO: it would be nicer to go straight there...
+ Mat4ToQuat(mat, q);
+ QuatToAxisAngle(q, axis, angle);
+}
+
+/* axis angle to 3x3 matrix */
void VecRotToMat3(float *vec, float phi, float mat[][3])
{
/* rotation of phi radials around vec */
@@ -2941,9 +3482,9 @@ void VecRotToMat3(float *vec, float phi, float mat[][3])
mat[2][0]= vz*vx*(1.0f-co)+vy*si;
mat[2][1]= vy*vz*(1.0f-co)-vx*si;
mat[2][2]= vz2+co*(1.0f-vz2);
-
}
+/* axis angle to 4x4 matrix */
void VecRotToMat4(float *vec, float phi, float mat[][4])
{
float tmat[3][3];
@@ -2953,6 +3494,7 @@ void VecRotToMat4(float *vec, float phi, float mat[][4])
Mat4CpyMat3(mat, tmat);
}
+/* axis angle to quaternion */
void VecRotToQuat(float *vec, float phi, float *quat)
{
/* rotation of phi radials around vec */
@@ -2974,6 +3516,43 @@ void VecRotToQuat(float *vec, float phi, float *quat)
}
}
+/* ************ VECTORS *************** */
+
+/* Returns a vector bisecting the angle at v2 formed by v1, v2 and v3 */
+void VecBisect3(float *out, float *v1, float *v2, float *v3)
+{
+ float d_12[3], d_23[3];
+ VecSubf(d_12, v2, v1);
+ VecSubf(d_23, v3, v2);
+ Normalize(d_12);
+ Normalize(d_23);
+ VecAddf(out, d_12, d_23);
+ Normalize(out);
+}
+
+/* Returns a reflection vector from a vector and a normal vector
+reflect = vec - ((2 * DotVecs(vec, mirror)) * mirror)
+*/
+void VecReflect(float *out, float *v1, float *v2)
+{
+ float vec[3], normal[3];
+ float reflect[3] = {0.0f, 0.0f, 0.0f};
+ float dot2;
+
+ VecCopyf(vec, v1);
+ VecCopyf(normal, v2);
+
+ Normalize(normal);
+
+ dot2 = 2 * Inpf(vec, normal);
+
+ reflect[0] = vec[0] - (dot2 * normal[0]);
+ reflect[1] = vec[1] - (dot2 * normal[1]);
+ reflect[2] = vec[2] - (dot2 * normal[2]);
+
+ VecCopyf(out, reflect);
+}
+
/* Return the angle in degrees between vecs 1-2 and 2-3 in degrees
If v1 is a shoulder, v2 is the elbow and v3 is the hand,
this would return the angle at the elbow */
@@ -2986,10 +3565,10 @@ float VecAngle3(float *v1, float *v2, float *v3)
Normalize(vec1);
Normalize(vec2);
- return NormalizedVecAngle2(vec1, vec2) * (float)(180.0/M_PI);
+ return NormalizedVecAngle2(vec1, vec2);
}
-float VecAngle3_2D(float *v1, float *v2, float *v3)
+float Vec2Angle3(float *v1, float *v2, float *v3)
{
float vec1[2], vec2[2];
@@ -3002,7 +3581,7 @@ float VecAngle3_2D(float *v1, float *v2, float *v3)
Normalize2(vec1);
Normalize2(vec2);
- return NormalizedVecAngle2_2D(vec1, vec2) * (float)(180.0/M_PI);
+ return NormalizedVecAngle2_2D(vec1, vec2);
}
/* Return the shortest angle in degrees between the 2 vectors */
@@ -3015,7 +3594,7 @@ float VecAngle2(float *v1, float *v2)
Normalize(vec1);
Normalize(vec2);
- return NormalizedVecAngle2(vec1, vec2)* (float)(180.0/M_PI);
+ return NormalizedVecAngle2(vec1, vec2);
}
float NormalizedVecAngle2(float *v1, float *v2)
@@ -3049,111 +3628,6 @@ float NormalizedVecAngle2_2D(float *v1, float *v2)
return 2.0f*(float)saasin(Vec2Lenf(v2, v1)/2.0f);
}
-void euler_rot(float *beul, float ang, char axis)
-{
- float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-
- eul[0]= eul[1]= eul[2]= 0.0f;
- if(axis=='x') eul[0]= ang;
- else if(axis=='y') eul[1]= ang;
- else eul[2]= ang;
-
- EulToMat3(eul, mat1);
- EulToMat3(beul, mat2);
-
- Mat3MulMat3(totmat, mat2, mat1);
-
- Mat3ToEul(totmat, beul);
-
-}
-
-/* exported to transform.c */
-void compatible_eul(float *eul, float *oldrot)
-{
- float dx, dy, dz;
-
- /* correct differences of about 360 degrees first */
- dx= eul[0] - oldrot[0];
- dy= eul[1] - oldrot[1];
- dz= eul[2] - oldrot[2];
-
- while(fabs(dx) > 5.1) {
- if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
- dx= eul[0] - oldrot[0];
- }
- while(fabs(dy) > 5.1) {
- if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
- dy= eul[1] - oldrot[1];
- }
- while(fabs(dz) > 5.1) {
- if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
- dz= eul[2] - oldrot[2];
- }
-
- /* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */
- if( fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6 ) {
- if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
- }
- if( fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6 ) {
- if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
- }
- if( fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6 ) {
- if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
- }
-
- /* the method below was there from ancient days... but why! probably because the code sucks :)
- */
-#if 0
- /* calc again */
- dx= eul[0] - oldrot[0];
- dy= eul[1] - oldrot[1];
- dz= eul[2] - oldrot[2];
-
- /* special case, tested for x-z */
-
- if( (fabs(dx) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dz) > 3.1 ) ) {
- if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
- if(eul[1] > 0.0) eul[1]= M_PI - eul[1]; else eul[1]= -M_PI - eul[1];
- if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
-
- }
- else if( (fabs(dx) > 3.1 && fabs(dy) > 1.5 ) || ( fabs(dx) > 1.5 && fabs(dy) > 3.1 ) ) {
- if(dx > 0.0) eul[0] -= M_PI; else eul[0]+= M_PI;
- if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
- if(eul[2] > 0.0) eul[2]= M_PI - eul[2]; else eul[2]= -M_PI - eul[2];
- }
- else if( (fabs(dy) > 3.1 && fabs(dz) > 1.5 ) || ( fabs(dy) > 1.5 && fabs(dz) > 3.1 ) ) {
- if(eul[0] > 0.0) eul[0]= M_PI - eul[0]; else eul[0]= -M_PI - eul[0];
- if(dy > 0.0) eul[1] -= M_PI; else eul[1]+= M_PI;
- if(dz > 0.0) eul[2] -= M_PI; else eul[2]+= M_PI;
- }
-#endif
-}
-
-/* uses 2 methods to retrieve eulers, and picks the closest */
-void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot)
-{
- float eul1[3], eul2[3];
- float d1, d2;
-
- mat3_to_eul2(mat, eul1, eul2);
-
- compatible_eul(eul1, oldrot);
- compatible_eul(eul2, oldrot);
-
- d1= (float)fabs(eul1[0]-oldrot[0]) + (float)fabs(eul1[1]-oldrot[1]) + (float)fabs(eul1[2]-oldrot[2]);
- d2= (float)fabs(eul2[0]-oldrot[0]) + (float)fabs(eul2[1]-oldrot[1]) + (float)fabs(eul2[2]-oldrot[2]);
-
- /* return best, which is just the one with lowest difference */
- if( d1 > d2) {
- VecCopyf(eul, eul2);
- }
- else {
- VecCopyf(eul, eul1);
- }
-
-}
-
/* ******************************************** */
void SizeToMat3( float *size, float mat[][3])
@@ -3316,7 +3790,7 @@ float Normalize2(float *n)
d= n[0]*n[0]+n[1]*n[1];
- if(d>1.0e-35F) {
+ if(d>1.0e-35f) {
d= (float)sqrt(d);
n[0]/=d;
n[1]/=d;
@@ -3334,15 +3808,15 @@ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b)
h *= 360.0f;
- if(s==0.0) {
+ if(s==0.0f) {
*r = v;
*g = v;
*b = v;
}
else {
- if(h==360) h = 0;
+ if(h== 360.0f) h = 0.0f;
- h /= 60;
+ h /= 60.0f;
i = (int)floor(h);
f = h - i;
p = v*(1.0f-s);
@@ -3542,33 +4016,10 @@ int constrain_rgb(float *r, float *g, float *b)
if (w > 0) {
*r += w; *g += w; *b += w;
- return 1; /* Colour modified to fit RGB gamut */
+ return 1; /* Color modified to fit RGB gamut */
}
- return 0; /* Colour within RGB gamut */
-}
-
-/*Transform linear RGB values to nonlinear RGB values. Rec.
- 709 is ITU-R Recommendation BT. 709 (1990) ``Basic
- Parameter Values for the HDTV Standard for the Studio and
- for International Programme Exchange'', formerly CCIR Rec.
- 709.*/
-static void gamma_correct(float *c)
-{
- /* Rec. 709 gamma correction. */
- float cc = 0.018f;
-
- if (*c < cc)
- *c *= ((1.099f * (float)pow(cc, 0.45)) - 0.099f) / cc;
- else
- *c = (1.099f * (float)pow(*c, 0.45)) - 0.099f;
-}
-
-void gamma_correct_rgb(float *r, float *g, float *b)
-{
- gamma_correct(r);
- gamma_correct(g);
- gamma_correct(b);
+ return 0; /* Color within RGB gamut */
}
@@ -3659,19 +4110,19 @@ void spheremap(float x, float y, float z, float *u, float *v)
/* proposed api by ton and zr, not used yet */
#if 0
/* ***************** m1 = m2 ***************** */
-void cpy_m3_m3(float m1[][3], float m2[][3])
+static void cpy_m3_m3(float m1[][3], float m2[][3])
{
memcpy(m1[0], m2[0], 9*sizeof(float));
}
/* ***************** m1 = m2 ***************** */
-void cpy_m4_m4(float m1[][4], float m2[][4])
+static void cpy_m4_m4(float m1[][4], float m2[][4])
{
memcpy(m1[0], m2[0], 16*sizeof(float));
}
/* ***************** identity matrix ***************** */
-void ident_m4(float m[][4])
+static void ident_m4(float m[][4])
{
m[0][0]= m[1][1]= m[2][2]= m[3][3]= 1.0;
@@ -3682,7 +4133,7 @@ void ident_m4(float m[][4])
}
/* ***************** m1 = m2 (pre) * m3 (post) ***************** */
-void mul_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
+static void mul_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
{
float m[3][3];
@@ -3702,7 +4153,7 @@ void mul_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
}
/* ***************** m1 = m2 (pre) * m3 (post) ***************** */
-void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
+static void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
{
float m[4][4];
@@ -3730,7 +4181,7 @@ void mul_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
}
/* ***************** m1 = inverse(m2) ***************** */
-void inv_m3_m3(float m1[][3], float m2[][3])
+static void inv_m3_m3(float m1[][3], float m2[][3])
{
short a,b;
float det;
@@ -3753,7 +4204,7 @@ void inv_m3_m3(float m1[][3], float m2[][3])
}
/* ***************** m1 = inverse(m2) ***************** */
-int inv_m4_m4(float inverse[][4], float mat[][4])
+static int inv_m4_m4(float inverse[][4], float mat[][4])
{
int i, j, k;
double temp;
@@ -3806,7 +4257,7 @@ int inv_m4_m4(float inverse[][4], float mat[][4])
}
/* ***************** v1 = v2 * mat ***************** */
-void mul_v3_v3m4(float *v1, float *v2, float mat[][4])
+static void mul_v3_v3m4(float *v1, float *v2, float mat[][4])
{
float x, y;
@@ -4281,7 +4732,7 @@ int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float
VecSubf(c, v3t, v1);
VecSubf(a, v2, v1);
- VecSubf(b, v4t, v3);
+ VecSubf(b, v4t, v3t);
Crossf(ab, a, b);
Crossf(cb, c, b);
@@ -4389,6 +4840,15 @@ static float lambda_cp_line(float p[3], float l1[3], float l2[3])
}
#endif
+/* useful to calculate an even width shell, by taking the angle between 2 planes.
+ * The return value is a scale on the offset.
+ * no angle between planes is 1.0, as the angle between the 2 planes approches 180d
+ * the distance gets very high, 180d would be inf, but this case isn't valid */
+float AngleToLength(const float angle)
+{
+ return (angle < SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle * (M_PI/180.0f)));
+}
+
/* Similar to LineIntersectsTriangleUV, except it operates on a quad and in 2d, assumes point is in quad */
void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv)
{
@@ -4699,7 +5159,8 @@ float PdistVL3Dfl(float *v1, float *v2, float *v3)
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3])
+// TODO: need to have a version that allows for rotation order...
+void LocEulSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -4722,7 +5183,31 @@ void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3])
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3])
+void LocEulOSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder)
+{
+ float rmat[3][3], smat[3][3], tmat[3][3];
+
+ /* initialise new matrix */
+ Mat4One(mat);
+
+ /* make rotation + scaling part */
+ EulOToMat3(eul, rotOrder, rmat);
+ SizeToMat3(size, smat);
+ Mat3MulMat3(tmat, rmat, smat);
+
+ /* copy rot/scale part to output matrix*/
+ Mat4CpyMat3(mat, tmat);
+
+ /* copy location to matrix */
+ mat[3][0] = loc[0];
+ mat[3][1] = loc[1];
+ mat[3][2] = loc[2];
+}
+
+
+/* make a 4x4 matrix out of 3 transform components */
+/* matrices are made in the order: scale * rot * loc */
+void LocQuatSizeToMat4(float mat[4][4], float loc[3], float quat[4], float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -4743,6 +5228,8 @@ void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3
mat[3][2] = loc[2];
}
+/********************************************************/
+
/* Tangents */
/* For normal map tangents we need to detect uv boundaries, and only average
diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c
index db7bae8a91d..7d5e1eec53e 100644
--- a/source/blender/blenlib/intern/boxpack2d.c
+++ b/source/blender/blenlib/intern/boxpack2d.c
@@ -16,28 +16,22 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
+ * Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include <stdlib.h>
+#include <stdlib.h> /* for qsort */
-#include "BKE_utildefines.h"
#include "MEM_guardedalloc.h"
#include "BLI_boxpack2d.h"
-/* BoxPacker ported from Python by Campbell Barton
+/* BoxPacker for backing 2D rectangles into a square
*
* The defined Below are for internal use only */
/* free vert flags */
-#define eul 0.0000001
+#define eul 0.0000001f
#define BLF 1
#define TRF 2
#define TLF 4
@@ -79,6 +73,9 @@
BOXRIGHT(b1)-eul<=BOXLEFT(b2) ||\
BOXTOP(b1)-eul<=BOXBOTTOM(b2) ))
+#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
+#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
+
/* #define BOXDEBUG(b)\
* printf("\tBox Debug i %i, w:%.3f h:%.3f x:%.3f y:%.3f\n",\
* b->index, b->w, b->h, b->x, b->y) */
@@ -141,11 +138,11 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
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 indicies used for sorting verts*/
+ int *vertex_pack_indicies; /*an array of indices used for sorting verts*/
if (!len) {
- *tot_width = 0.0;
- *tot_height = 0.0;
+ *tot_width = 0.0f;
+ *tot_height = 0.0f;
return;
}
@@ -153,8 +150,8 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
qsort(boxarray, len, sizeof(boxPack), box_areasort);
/* 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 indicies");
+ vert = vertarray = MEM_mallocN( len*4*sizeof(boxVert), "boxPack Verts");
+ vertex_pack_indicies = MEM_mallocN( len*3*sizeof(int), "boxPack Indices");
for (box=boxarray, box_index=0, i=0; box_index < len; box_index++, box++) {
@@ -194,11 +191,11 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* Pack the First box!
- * then enter the main boxpacking loop */
+ * then enter the main box-packing loop */
box = boxarray; /* get the first box */
/* First time, no boxes packed */
- box->v[BL]->free = 0; /* Cant use any if these */
+ box->v[BL]->free = 0; /* Can't use any if these */
box->v[BR]->free &= ~(BLF|BRF);
box->v[TL]->free &= ~(BLF|TLF);
@@ -206,9 +203,9 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
*tot_height = box->h;
/* This sets all the vertex locations */
- SET_BOXLEFT(box, 0.0);
- SET_BOXBOTTOM(box, 0.0);
- box->x = box->y = 0.0;
+ SET_BOXLEFT(box, 0.0f);
+ SET_BOXBOTTOM(box, 0.0f);
+ box->x = box->y = 0.0f;
for (i=0; i<3; i++)
vertex_pack_indicies[i] = box->v[i+1]->index;
@@ -219,7 +216,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* Main boxpacking loop */
for (box_index=1; box_index < len; box_index++, box++) {
- /* Sort the verts, these constants are used in sorting */
+ /* These static floatds are used for sorting */
box_width = box->w;
box_height = box->h;
@@ -234,7 +231,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* printf("\ttesting vert %i %i %i %f %f\n", i,
* vert->free, verts_pack_len, vert->x, vert->y); */
- /* This vert has a free quaderent
+ /* This vert has a free quadrant
* Test if we can place the box here
* vert->free & quad_flags[j] - Checks
* */
@@ -266,7 +263,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
isect = 0;
if (/* Constrain boxes to positive X/Y values */
- BOXLEFT(box)<0.0 || BOXBOTTOM(box) < 0.0 ||
+ BOXLEFT(box)<0.0f || BOXBOTTOM(box) < 0.0f ||
/* check for last intersected */
( vert->isect_cache[j] &&
BOXINTERSECT(box, vert->isect_cache[j]) )
@@ -274,13 +271,13 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* Here we check that the last intersected
* box will intersect with this one using
* isect_cache that can store a pointer to a
- * box for each quaderent
+ * box for each quadrant
* big speedup */
isect = 1;
} else {
- /* do a full saech for colliding box
- * this is realy slow, some spacialy divided
- * datastructure would be better */
+ /* do a full search for colliding box
+ * this is really slow, some spacialy divided
+ * data-structure would be better */
for (box_test=boxarray; box_test != box; box_test++) {
if BOXINTERSECT(box, box_test) {
/* Store the last intersecting here as cache
@@ -321,7 +318,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
}
/* Mask free flags for verts that are
- * on the bottom or side so we dont get
+ * on the bottom or side so we don't get
* boxes outside the given rectangle ares
*
* We can do an else/if here because only the first
@@ -392,7 +389,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
verts_pack_len++;
}
}
- /* The Box verts are only used interially
+ /* The Box verts are only used internally
* Update the box x and y since thats what external
* functions will see */
box->x = BOXLEFT(box);
@@ -403,8 +400,8 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
}
}
- /* free all the verts, not realy needed because they shouldebt be
- * touched anymore but accessing the pointers woud crash blender */
+ /* free all the verts, not really needed because they shouldn't be
+ * touched anymore but accessing the pointers would crash blender */
for (box_index=0; box_index < len; box_index++) {
box = boxarray+box_index;
box->v[0] = box->v[1] = box->v[2] = box->v[3] = NULL;
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 85a95fa6e66..cadf8d2bdd1 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -26,6 +26,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* path/file handeling stuff */
+#ifndef WIN32
+ #include <dirent.h>
+ #include <unistd.h>
+#else
+ #include <io.h>
+ #include "BLI_winstuff.h"
+#endif
+
#include "MEM_guardedalloc.h"
#include "DNA_ID.h" /* Library */
@@ -51,25 +69,9 @@
/* for sequence */
//XXX #include "BSE_sequence.h"
//XXX define below from BSE_sequence.h - otherwise potentially odd behaviour
-#define SEQ_HAS_PATH(seq) (seq->type==SEQ_MOVIE || seq->type==SEQ_HD_SOUND || seq->type==SEQ_RAM_SOUND || seq->type==SEQ_IMAGE)
+#define SEQ_HAS_PATH(seq) (seq->type==SEQ_MOVIE || seq->type==SEQ_IMAGE)
-/* path/file handeling stuff */
-#ifndef WIN32
- #include <dirent.h>
- #include <unistd.h>
-#else
- #include "BLI_winstuff.h"
- #include <io.h>
-#endif
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <string.h>
#define FILE_MAX 240
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index ffebd05f2f6..15277c438f4 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -31,27 +31,29 @@
#include <stdio.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
+
#include "zlib.h"
#ifdef WIN32
-#include "BLI_winstuff.h"
#include <io.h>
+#include "BLI_winstuff.h"
#else
#include <unistd.h> // for read close
#include <sys/param.h>
#endif
+
#include "BLI_blenlib.h"
#include "BLI_storage.h"
#include "BLI_fileops.h"
#include "BLI_callbacks.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
#include "BKE_utildefines.h"
-#include <errno.h>
#include "BLO_sys_types.h" // for intptr_t support
@@ -82,20 +84,48 @@ char *BLI_last_slash(const char *string) {
else return lfslash;
}
+static const char *last_slash_len(const char *string, int len) {
+ int a;
+
+ for(a=len-1; a>=0; a--)
+ if(string[a] == '/' || string[a] == '\\')
+ return &string[a];
+
+ return NULL;
+}
+
+const char *BLI_short_filename(const char *string) {
+ const char *ls, *lls;
+
+ ls= last_slash_len(string, strlen(string));
+ if(!ls)
+ return string;
+
+ lls= last_slash_len(string, ls-string);
+
+ if(lls)
+ return lls+1;
+ else
+ return ls+1;
+}
+
/* adds a slash if there isnt one there alredy */
-void BLI_add_slash(char *string) {
+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 */
@@ -153,10 +183,24 @@ int BLI_is_writable(char *filename)
{
int file;
+ /* first try to open without creating */
file = open(filename, O_BINARY | O_RDWR, 0666);
- if (file < 0)
- return 0;
+ if (file < 0) {
+ /* now try to open and create. a test without actually
+ * creating a file would be nice, but how? */
+ file = open(filename, O_BINARY | O_RDWR | O_CREAT, 0666);
+
+ if(file < 0) {
+ return 0;
+ }
+ else {
+ /* success, delete the file we create */
+ close(file);
+ BLI_delete(filename, 0, 0);
+ return 1;
+ }
+ }
else {
close(file);
return 1;
@@ -297,7 +341,7 @@ int BLI_rename(char *from, char *to) {
/* make sure the filenames are different (case insensitive) before removing */
if (BLI_exists(to) && BLI_strcasecmp(from, to))
if(BLI_delete(to, 0, 0)) return 1;
-
+
return rename(from, to);
}
@@ -375,7 +419,7 @@ int BLI_rename(char *from, char *to) {
if (!BLI_exists(from)) return 0;
if (BLI_exists(to)) if(BLI_delete(to, 0, 0)) return 1;
-
+
return rename(from, to);
}
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index bde4b561f26..cb5632df569 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -65,7 +65,7 @@ static FT_Library library;
static FT_Error err;
-void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
+static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
{
// Blender
struct Nurb *nu;
@@ -146,9 +146,10 @@ void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
bezt = (BezTriple*)MEM_callocN((onpoints[j])* sizeof(BezTriple),"objfnt_bezt") ;
BLI_addtail(&che->nurbsbase, nu);
- nu->type= CU_BEZIER+CU_2D;
+ nu->type= CU_BEZIER;
nu->pntsu = onpoints[j];
nu->resolu= 8;
+ nu->flag= CU_2D;
nu->flagu= CU_CYCLIC;
nu->bezt = bezt;
@@ -274,7 +275,7 @@ void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vfd)
}
}
-int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
+static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
{
// Freetype2
FT_Face face;
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index cc15c499290..49a3cad53f1 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -354,7 +354,7 @@ void BLI_ReflagSubgraph(BGraph *graph, int old_subgraph, int new_subgraph)
/*************************************** CYCLE DETECTION ***********************************************/
-int detectCycle(BNode *node, BArc *src_arc)
+static int detectCycle(BNode *node, BArc *src_arc)
{
int value = 0;
@@ -520,7 +520,7 @@ void BLI_calcGraphLength(BGraph *graph)
/********************************* SYMMETRY DETECTION **************************************************/
-void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit);
+static void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit);
void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3])
{
@@ -935,7 +935,7 @@ static void markdownSecondarySymmetry(BGraph *graph, BNode *node, int depth, int
}
}
-void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit)
+static void markdownSymmetryArc(BGraph *graph, BArc *arc, BNode *node, int level, float limit)
{
int i;
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 1064c8ac1bf..b3a4722d6d9 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -347,11 +347,11 @@ void BLI_duplicatelist(ListBase *list1, ListBase *list2) /* copy from 2 to 1 */
{
struct Link *link1, *link2;
+ /* in this order, to ensure it works if list1 == list2 */
+ link2= list2->first;
list1->first= list1->last= 0;
- link2= list2->first;
while(link2) {
-
link1= MEM_dupallocN(link2);
BLI_addtail(list1, link1);
@@ -359,3 +359,17 @@ void BLI_duplicatelist(ListBase *list1, ListBase *list2) /* copy from 2 to 1 */
}
}
+/* create a generic list node containing link to provided data */
+LinkData *BLI_genericNodeN (void *data)
+{
+ LinkData *ld;
+
+ if (data == NULL)
+ return NULL;
+
+ /* create new link, and make it hold the given data */
+ ld= MEM_callocN(sizeof(LinkData), "BLI_genericNodeN()");
+ ld->data= data;
+
+ return ld;
+}
diff --git a/source/blender/blenlib/intern/matrixops.c b/source/blender/blenlib/intern/matrixops.c
deleted file mode 100644
index 0f9fc65f016..00000000000
--- a/source/blender/blenlib/intern/matrixops.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- *
- * Some matrix operations.
- *
- * Always use
- * - vector with x components : float x[3], int x[3], etc
- *
- * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "MTC_matrixops.h"
-#include "MTC_vectorops.h"
-/* ------------------------------------------------------------------------- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if defined(__sun__) || defined( __sun ) || defined (__sparc) || defined (__sparc__)
-#include <strings.h>
-#endif
-
-#define ABS(x) ((x) < 0 ? -(x) : (x))
-#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
-
-void MTC_Mat4CpyMat4(float m1[][4], float m2[][4])
-{
- memcpy(m1, m2, 4*4*sizeof(float));
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4MulSerie(float answ[][4],
- float m1[][4], float m2[][4], float m3[][4],
- float m4[][4], float m5[][4], float m6[][4],
- float m7[][4], float m8[][4])
-{
- float temp[4][4];
-
- if(m1==0 || m2==0) return;
-
- MTC_Mat4MulMat4(answ, m2, m1);
- if(m3) {
- MTC_Mat4MulMat4(temp, m3, answ);
- if(m4) {
- MTC_Mat4MulMat4(answ, m4, temp);
- if(m5) {
- MTC_Mat4MulMat4(temp, m5, answ);
- if(m6) {
- MTC_Mat4MulMat4(answ, m6, temp);
- if(m7) {
- MTC_Mat4MulMat4(temp, m7, answ);
- if(m8) {
- MTC_Mat4MulMat4(answ, m8, temp);
- }
- else MTC_Mat4CpyMat4(answ, temp);
- }
- }
- else MTC_Mat4CpyMat4(answ, temp);
- }
- }
- else MTC_Mat4CpyMat4(answ, temp);
- }
-}
-
-/* ------------------------------------------------------------------------- */
-void MTC_Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4])
-{
- /* matrix product: c[j][k] = a[j][i].b[i][k] */
-
- m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0] + m2[0][3]*m3[3][0];
- m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1] + m2[0][3]*m3[3][1];
- m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2] + m2[0][3]*m3[3][2];
- m1[0][3] = m2[0][0]*m3[0][3] + m2[0][1]*m3[1][3] + m2[0][2]*m3[2][3] + m2[0][3]*m3[3][3];
-
- m1[1][0] = m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0] + m2[1][3]*m3[3][0];
- m1[1][1] = m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1] + m2[1][3]*m3[3][1];
- m1[1][2] = m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2] + m2[1][3]*m3[3][2];
- m1[1][3] = m2[1][0]*m3[0][3] + m2[1][1]*m3[1][3] + m2[1][2]*m3[2][3] + m2[1][3]*m3[3][3];
-
- m1[2][0] = m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0] + m2[2][3]*m3[3][0];
- m1[2][1] = m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1] + m2[2][3]*m3[3][1];
- m1[2][2] = m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2] + m2[2][3]*m3[3][2];
- m1[2][3] = m2[2][0]*m3[0][3] + m2[2][1]*m3[1][3] + m2[2][2]*m3[2][3] + m2[2][3]*m3[3][3];
-
- m1[3][0] = m2[3][0]*m3[0][0] + m2[3][1]*m3[1][0] + m2[3][2]*m3[2][0] + m2[3][3]*m3[3][0];
- m1[3][1] = m2[3][0]*m3[0][1] + m2[3][1]*m3[1][1] + m2[3][2]*m3[2][1] + m2[3][3]*m3[3][1];
- m1[3][2] = m2[3][0]*m3[0][2] + m2[3][1]*m3[1][2] + m2[3][2]*m3[2][2] + m2[3][3]*m3[3][2];
- m1[3][3] = m2[3][0]*m3[0][3] + m2[3][1]*m3[1][3] + m2[3][2]*m3[2][3] + m2[3][3]*m3[3][3];
-
-}
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4MulVecfl(float mat[][4], float *vec)
-{
- float x,y;
-
- x=vec[0];
- y=vec[1];
- vec[0]=x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2] + mat[3][0];
- vec[1]=x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2] + mat[3][1];
- vec[2]=x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
-}
-
-/* ------------------------------------------------------------------------- */
-void MTC_Mat3MulVecfl(float mat[][3], float *vec)
-{
- float x,y;
-
- x=vec[0];
- y=vec[1];
- vec[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2];
- vec[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2];
- vec[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-int MTC_Mat4Invert(float inverse[][4], float mat[][4])
-{
- int i, j, k;
- double temp;
- float tempmat[4][4];
- float max;
- int maxj;
-
- /* Set inverse to identity */
- for (i=0; i<4; i++)
- for (j=0; j<4; j++)
- inverse[i][j] = 0;
- for (i=0; i<4; i++)
- inverse[i][i] = 1;
-
- /* Copy original matrix so we don't mess it up */
- for(i = 0; i < 4; i++)
- for(j = 0; j <4; j++)
- tempmat[i][j] = mat[i][j];
-
- for(i = 0; i < 4; i++) {
- /* Look for row with max pivot */
- max = ABS(tempmat[i][i]);
- maxj = i;
- for(j = i + 1; j < 4; j++) {
- if(ABS(tempmat[j][i]) > max) {
- max = ABS(tempmat[j][i]);
- maxj = j;
- }
- }
- /* Swap rows if necessary */
- if (maxj != i) {
- for( k = 0; k < 4; k++) {
- SWAP(float, tempmat[i][k], tempmat[maxj][k]);
- SWAP(float, inverse[i][k], inverse[maxj][k]);
- }
- }
-
- temp = tempmat[i][i];
- if (temp == 0)
- return 0; /* No non-zero pivot */
- for(k = 0; k < 4; k++) {
- tempmat[i][k] /= temp;
- inverse[i][k] /= temp;
- }
- for(j = 0; j < 4; j++) {
- if(j != i) {
- temp = tempmat[j][i];
- for(k = 0; k < 4; k++) {
- tempmat[j][k] -= tempmat[i][k]*temp;
- inverse[j][k] -= inverse[i][k]*temp;
- }
- }
- }
- }
- return 1;
-}
-
-/* ------------------------------------------------------------------------- */
-void MTC_Mat3CpyMat4(float m1[][3], float m2[][4])
-{
-
- m1[0][0]= m2[0][0];
- m1[0][1]= m2[0][1];
- m1[0][2]= m2[0][2];
-
- m1[1][0]= m2[1][0];
- m1[1][1]= m2[1][1];
- m1[1][2]= m2[1][2];
-
- m1[2][0]= m2[2][0];
- m1[2][1]= m2[2][1];
- m1[2][2]= m2[2][2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat3CpyMat3(float m1[][3], float m2[][3])
-{
- memcpy(m1, m2, 3*3*sizeof(float));
-}
-
-/* ------------------------------------------------------------------------- */
-/* void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]) */
-void MTC_Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3])
-{
- /* be careful about this rewrite... */
- /* m1[i][j] = m2[i][k]*m3[k][j], args are flipped! */
- m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
- m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1];
- m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2];
-
- m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0];
- m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1];
- m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2];
-
- m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0];
- m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1];
- m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
-
-/* m1[0]= m2[0]*m3[0] + m2[1]*m3[3] + m2[2]*m3[6]; */
-/* m1[1]= m2[0]*m3[1] + m2[1]*m3[4] + m2[2]*m3[7]; */
-/* m1[2]= m2[0]*m3[2] + m2[1]*m3[5] + m2[2]*m3[8]; */
-/* m1+=3; */
-/* m2+=3; */
-/* m1[0]= m2[0]*m3[0] + m2[1]*m3[3] + m2[2]*m3[6]; */
-/* m1[1]= m2[0]*m3[1] + m2[1]*m3[4] + m2[2]*m3[7]; */
-/* m1[2]= m2[0]*m3[2] + m2[1]*m3[5] + m2[2]*m3[8]; */
-/* m1+=3; */
-/* m2+=3; */
-/* m1[0]= m2[0]*m3[0] + m2[1]*m3[3] + m2[2]*m3[6]; */
-/* m1[1]= m2[0]*m3[1] + m2[1]*m3[4] + m2[2]*m3[7]; */
-/* m1[2]= m2[0]*m3[2] + m2[1]*m3[5] + m2[2]*m3[8]; */
-} /* end of void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]) */
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4Ortho(float mat[][4])
-{
- float len;
-
- len= MTC_normalize3DF(mat[0]);
- if(len!=0.0) mat[0][3]/= len;
- len= MTC_normalize3DF(mat[1]);
- if(len!=0.0) mat[1][3]/= len;
- len= MTC_normalize3DF(mat[2]);
- if(len!=0.0) mat[2][3]/= len;
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4Mul3Vecfl(float mat[][4], float *vec)
-{
- float x,y;
- /* vec = mat^T dot vec !!! or vec a row, then vec = vec dot mat*/
-
- x= vec[0];
- y= vec[1];
- vec[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2];
- vec[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2];
- vec[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4One(float m[][4])
-{
-
- m[0][0]= m[1][1]= m[2][2]= m[3][3]= 1.0;
- m[0][1]= m[0][2]= m[0][3]= 0.0;
- m[1][0]= m[1][2]= m[1][3]= 0.0;
- m[2][0]= m[2][1]= m[2][3]= 0.0;
- m[3][0]= m[3][1]= m[3][2]= 0.0;
-}
-
-
-/* ------------------------------------------------------------------------- */
-/* Result is a 3-vector!*/
-void MTC_Mat3MulVecd(float mat[][3], double *vec)
-{
- double x,y;
-
- /* vec = mat^T dot vec !!! or vec a row, then vec = vec dot mat*/
- x=vec[0];
- y=vec[1];
- vec[0]= x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2];
- vec[1]= x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2];
- vec[2]= x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat3Inv(float m1[][3], float m2[][3])
-{
- short a,b;
- float det;
-
- /* first adjoint */
- MTC_Mat3Adj(m1,m2);
-
- /* then determinant old mat! */
- det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1])
- -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1])
- +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]);
-
- if(det==0) det=1;
- det= 1/det;
- for(a=0;a<3;a++) {
- for(b=0;b<3;b++) {
- m1[a][b]*=det;
- }
- }
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat3Adj(float m1[][3], float m[][3])
-{
- m1[0][0]=m[1][1]*m[2][2]-m[1][2]*m[2][1];
- m1[0][1]= -m[0][1]*m[2][2]+m[0][2]*m[2][1];
- m1[0][2]=m[0][1]*m[1][2]-m[0][2]*m[1][1];
-
- m1[1][0]= -m[1][0]*m[2][2]+m[1][2]*m[2][0];
- m1[1][1]=m[0][0]*m[2][2]-m[0][2]*m[2][0];
- m1[1][2]= -m[0][0]*m[1][2]+m[0][2]*m[1][0];
-
- m1[2][0]=m[1][0]*m[2][1]-m[1][1]*m[2][0];
- m1[2][1]= -m[0][0]*m[2][1]+m[0][1]*m[2][0];
- m1[2][2]=m[0][0]*m[1][1]-m[0][1]*m[1][0];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat3One(float m[][3])
-{
-
- m[0][0]= m[1][1]= m[2][2]= 1.0;
- m[0][1]= m[0][2]= 0.0;
- m[1][0]= m[1][2]= 0.0;
- m[2][0]= m[2][1]= 0.0;
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4SwapMat4(float m1[][4], float m2[][4])
-{
- float t;
- int i, j;
-
- for(i = 0; i < 4; i++) {
- for (j = 0; j < 4; j++) {
- t = m1[i][j];
- m1[i][j] = m2[i][j];
- m2[i][j] = t;
- }
- }
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4MulVec4fl(float mat[][4], float *vec)
-{
- float x,y,z;
-
- x = vec[0];
- y = vec[1];
- z = vec[2];
- vec[0] = x*mat[0][0] + y*mat[1][0] + z*mat[2][0] + mat[3][0]*vec[3];
- vec[1] = x*mat[0][1] + y*mat[1][1] + z*mat[2][1] + mat[3][1]*vec[3];
- vec[2] = x*mat[0][2] + y*mat[1][2] + z*mat[2][2] + mat[3][2]*vec[3];
- vec[3] = x*mat[0][3] + y*mat[1][3] + z*mat[2][3] + mat[3][3]*vec[3];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4CpyMat3nc(float m1[][4], float m2[][3]) /* no clear */
-{
- m1[0][0]= m2[0][0];
- m1[0][1]= m2[0][1];
- m1[0][2]= m2[0][2];
-
- m1[1][0]= m2[1][0];
- m1[1][1]= m2[1][1];
- m1[1][2]= m2[1][2];
-
- m1[2][0]= m2[2][0];
- m1[2][1]= m2[2][1];
- m1[2][2]= m2[2][2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_Mat4MulMat33(float m1[][3], float m2[][4], float m3[][3])
-{
- /* m1_i_j = m2_i_k * m3_k_j ? */
-
- m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
- m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1];
- m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2];
-
- m1[1][0] = m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0];
- m1[1][1] = m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1];
- m1[1][2] = m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2];
-
- m1[2][0] = m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0];
- m1[2][1] = m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1];
- m1[2][2] = m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
-
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* eof */
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 0bd30a69d05..66e9a65dba5 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -42,9 +42,9 @@
#endif
/* local */
-float noise3_perlin(float vec[3]);
-float turbulence_perlin(float *point, float lofreq, float hifreq);
-float turbulencep(float noisesize, float x, float y, float z, int nr);
+static float noise3_perlin(float vec[3]);
+static float turbulence_perlin(float *point, float lofreq, float hifreq);
+static float turbulencep(float noisesize, float x, float y, float z, int nr);
#define HASHVEC(x,y,z) hashvectf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
@@ -915,7 +915,7 @@ float g[512+2][3]= {
r1 = r0 - 1.;
-float noise3_perlin(float vec[3])
+static float noise3_perlin(float vec[3])
{
int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
@@ -976,7 +976,7 @@ float noise3_perlin(float vec[3])
return 1.5 * lerp(sz, c, d); /* interpolate in z */
}
-float turbulence_perlin(float *point, float lofreq, float hifreq)
+static float turbulence_perlin(float *point, float lofreq, float hifreq)
{
float freq, t, p[3];
@@ -1029,7 +1029,7 @@ float BLI_hnoisep(float noisesize, float x, float y, float z)
return noise3_perlin(vec);
}
-float turbulencep(float noisesize, float x, float y, float z, int nr)
+static float turbulencep(float noisesize, float x, float y, float z, int nr)
{
float vec[3];
diff --git a/source/blender/blenlib/intern/psfont.c b/source/blender/blenlib/intern/psfont.c
deleted file mode 100644
index 269e674a62f..00000000000
--- a/source/blender/blenlib/intern/psfont.c
+++ /dev/null
@@ -1,2126 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
- * fromtype1 - Convert an Adobe type 1 font into .of or .sf format.
- * Paul Haeberli - 1990
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_vfontdata.h"
-#include "BLI_blenlib.h"
-
-#include "DNA_packedFile_types.h"
-#include "DNA_curve_types.h"
-
-#include "BLO_sys_types.h" // for intptr_t support
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
- /* ObjFnt types */
-
-typedef struct chardesc {
- short movex, movey; /* advance */
- short llx, lly; /* bounding box */
- short urx, ury;
- short *data; /* char data */
- intptr_t datalen;
-} chardesc;
-
-typedef struct objfnt {
- struct objfnt *freeaddr; /* if freeaddr != 0, objfnt is one chunck */
- short type;
- short charmin, charmax;
- short my_nchars;
- short scale;
- chardesc *my_chars;
-} objfnt;
-
-#define OFMAGIC 0x93339333
-
-#define TM_TYPE 1
-#define PO_TYPE 2
-#define SP_TYPE 3
-
-/* ops for tmesh characters */
-
-#define TM_BGNTMESH (1)
-#define TM_SWAPTMESH (2)
-#define TM_ENDBGNTMESH (3)
-#define TM_RETENDTMESH (4)
-#define TM_RET (5)
-
-/* ops for poly characters */
-
-#define PO_BGNLOOP (1)
-#define PO_ENDBGNLOOP (2)
-#define PO_RETENDLOOP (3)
-#define PO_RET (4)
-
-/* ops for spline characters */
-
-#define SP_MOVETO (1)
-#define SP_LINETO (2)
-#define SP_CURVETO (3)
-#define SP_CLOSEPATH (4)
-#define SP_RETCLOSEPATH (5)
-#define SP_RET (6)
-
-
-#define MIN_ASCII ' '
-#define MAX_ASCII '~'
-#define NASCII (256 - 32)
-
-#define NOBBOX (30000)
-
-typedef struct pschar {
- char *name;
- int code;
- int prog;
-} pschar;
-
- /***/
-
-#define SKIP 4
-#define LINELEN 2048
-#define NOTHEX (100)
-#define MC1 52845
-#define MC2 22719
-#define MAXSUBRS 4000
-#define MAXCHARS 4000
-#define MAXTRIES 30
-
-/* some local thingies */
-static void rcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
-static void makeobjfont(int savesplines);
-static void drawchar(int c);
-static void runprog(void);
-static int chartoindex(objfnt *fnt, int c);
-static short STDtoISO(short c);
-static char * newfgets(char * s, int n, PackedFile * pf);
-static int readfontmatrix(PackedFile * pf, float mat[2][2]);
-static char mdecrypt(char cipher);
-static void decryptall(void);
-static int decodetype1(PackedFile * pf, char *outname);
-static void fakefopen(void);
-static char *fakefread(int n);
-static void setcharlist(void);
-static void initpcstack(void);
-static char *poppc(void);
-static void initstack(void);
-static void push(int val);
-static int pop(void);
-static void initretstack(void);
-static void retpush(int val);
-static int retpop(void);
-static void subr1(void);
-static void subr2(void);
-static void subr0(void);
-static void append_poly_offset(short ofsx, short ofsy, short * data);
-static void append_spline_offset(short ofsx, short ofsy, short * data);
-static void setwidth(int w, int x);
-static void poly_beginchar(void);
-static void poly_endchar(void);
-static void poly_close(void);
-static void poly_pnt(float x, float y);
-static void spline_beginchar(void);
-static void spline_endchar(void);
-static void spline_close(void);
-static void spline_line(float x0, float y0, float x1, float y1);
-static void spline_curveto(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3);
-static void savestart(int x, int y);
-static void sbpoint( int x, int y);
-static void rmoveto( int x, int y);
-static void drawline(float x0, float y0, float x1, float y1, float dx0, float dy0, float dx1, float dy1);
-static void rlineto( int x, int y);
-static void closepath(void);
-static void bezadapt( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float beztol);
-static void drawbez( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3);
-static int docommand(int cmd);
-
-/* some local vars */
-static int startx, starty;
-static int curx, cury;
-static int nextx, nexty;
-static int delx, dely;
-static int started;
-
-
-/* postscript commands */
-#define HSTEM (1)
-#define VSTEM (3)
-#define VMOVETO (4)
-#define RLINETO (5)
-#define HLINETO (6)
-#define VLINETO (7)
-#define RRCURVETO (8)
-#define CLOSEPATH (9)
-#define CALLSUBR (10)
-#define RETURN (11)
-#define HSBW (13)
-#define ENDCHAR (14)
-#define RMOVETO (21)
-#define HMOVETO (22)
-#define VHCURVETO (30)
-#define HVCURVETO (31)
-#define DOTSECTION (256+0)
-#define VSTEM3 (256+1)
-#define HSTEM3 (256+2)
-#define SEAC (256+6)
-#define SBW (256+7)
-#define DIV (256+12)
-#define CALLOTHERSUBR (256+16)
-#define POP (256+17)
-#define SETCURRENTPOINT (256+33)
-#define WHAT0 (0)
-
-static char oneline[LINELEN];
-static objfnt *fnt;
-
-static unsigned short int mr;
-
-static char *bindat;
-static int datbytes;
-static int firsted;
-static short chardata[20000];
-static int nshorts;
-
-static int thecharwidth, thesidebearing;
-static int npnts, nloops;
-static int nvertpos;
-
-static int fakepos;
-static int fakemax;
-
-static float beztol = 100.0;
-
-/* extern: from libfm */
-
-static char *my_subrs[MAXSUBRS];
-static unsigned int my_sublen[MAXSUBRS];
-static char *my_chars[MAXCHARS];
-static unsigned int my_charlen[MAXCHARS];
-static char *my_charname[MAXCHARS];
-static int my_nsubrs, my_nchars;
-
-static short sidebearing[MAXCHARS];
-static char tok[LINELEN];
-static int sp_npnts, sp_nloops;
-
-/*
- * interpreter globals
- */
-
-
-static float mat[2][2];
-static char *pcstack[100];
-static char *pc;
-static int pcsp;
-static int coordpos;
-static int coordsave[7][2];
-static int incusp;
-static int retstack[1000];
-static int retsp;
-static int stack[1000];
-static int sp;
-static int savesplines = 1;
-
-static pschar ISOcharlist[NASCII] = {
- {"/space", 040, 0},
- {"/exclam", 041, 0},
- {"/quotedbl", 042, 0},
- {"/numbersign", 043, 0},
- {"/dollar", 044, 0},
- {"/percent", 045, 0},
- {"/ampersand", 046, 0},
- {"/quoteright", 047, 0},
-
- {"/parenleft", 050, 0},
- {"/parenright", 051, 0},
- {"/asterisk", 052, 0},
- {"/plus", 053, 0},
- {"/comma", 054, 0},
- {"/hyphen", 055, 0},
- {"/period", 056, 0},
- {"/slash", 057, 0},
-
- {"/zero", 060, 0},
- {"/one", 061, 0},
- {"/two", 062, 0},
- {"/three", 063, 0},
- {"/four", 064, 0},
- {"/five", 065, 0},
- {"/six", 066, 0},
- {"/seven", 067, 0},
-
- {"/eight", 070, 0},
- {"/nine", 071, 0},
- {"/colon", 072, 0},
- {"/semicolon", 073, 0},
- {"/less", 074, 0},
- {"/equal", 075, 0},
- {"/greater", 076, 0},
- {"/question", 077, 0},
-
- {"/at", 0100, 0},
- {"/A", 0101, 0},
- {"/B", 0102, 0},
- {"/C", 0103, 0},
- {"/D", 0104, 0},
- {"/E", 0105, 0},
- {"/F", 0106, 0},
- {"/G", 0107, 0},
-
- {"/H", 0110, 0},
- {"/I", 0111, 0},
- {"/J", 0112, 0},
- {"/K", 0113, 0},
- {"/L", 0114, 0},
- {"/M", 0115, 0},
- {"/N", 0116, 0},
- {"/O", 0117, 0},
-
- {"/P", 0120, 0},
- {"/Q", 0121, 0},
- {"/R", 0122, 0},
- {"/S", 0123, 0},
- {"/T", 0124, 0},
- {"/U", 0125, 0},
- {"/V", 0126, 0},
- {"/W", 0127, 0},
-
- {"/X", 0130, 0},
- {"/Y", 0131, 0},
- {"/Z", 0132, 0},
- {"/bracketleft", 0133, 0},
- {"/backslash", 0134, 0},
- {"/bracketright", 0135, 0},
- {"/asciicircum", 0136, 0},
- {"/underscore", 0137, 0},
-
- {"/quoteleft", 0140, 0},
- {"/a", 0141, 0},
- {"/b", 0142, 0},
- {"/c", 0143, 0},
- {"/d", 0144, 0},
- {"/e", 0145, 0},
- {"/f", 0146, 0},
- {"/g", 0147, 0},
-
- {"/h", 0150, 0},
- {"/i", 0151, 0},
- {"/j", 0152, 0},
- {"/k", 0153, 0},
- {"/l", 0154, 0},
- {"/m", 0155, 0},
- {"/n", 0156, 0},
- {"/o", 0157, 0},
-
- {"/p", 0160, 0},
- {"/q", 0161, 0},
- {"/r", 0162, 0},
- {"/s", 0163, 0},
- {"/t", 0164, 0},
- {"/u", 0165, 0},
- {"/v", 0166, 0},
- {"/w", 0167, 0},
-
- {"/x", 0170, 0},
- {"/y", 0171, 0},
- {"/z", 0172, 0},
- {"/braceleft", 0173, 0},
- {"/bar", 0174, 0},
- {"/braceright", 0175, 0},
- {"/asciitilde", 0176, 0},
- {"/", 0177, 0},
-
-
- /* nonstandard defs */
-
- {"/quotedblleft", 0200, 0},
- {"/quotedblright", 0201, 0},
- {"/quotedblbase", 0202, 0},
- {"/quotesinglbase", 0203, 0},
- {"/guilsinglleft", 0204, 0},
- {"/guilsinglright", 0205, 0},
- {"/endash", 0206, 0},
- {"/dagger", 0207, 0},
-
- {"/daggerdbl", 0210, 0},
- {"/trademark", 0211, 0},
- {"/bullet", 0212, 0},
- {"/perthousand", 0213, 0},
- {"/Lslash", 0214, 0},
- {"/OE", 0215, 0},
- {"/lslash", 0216, 0},
- {"/oe", 0217, 0},
-
- /* endnonstandard defs */
-
- {"/dotlessi", 0220, 0},
- {"/grave", 0221, 0},
- {"/acute", 0222, 0},
- {"/circumflex", 0223, 0},
- {"/tilde", 0224, 0},
- {"/", 0225, 0},
- {"/breve", 0226, 0},
- {"/dotaccent", 0227, 0},
-
- {"/", 0230, 0},
- {"/", 0231, 0},
- {"/ring", 0232, 0},
- {"/", 0233, 0},
- {"/", 0234, 0},
- {"/hungarumlaut", 0235, 0},
- {"/ogonek", 0236, 0},
- {"/caron", 0237, 0},
-
- {"/", 0240, 0},
- {"/exclamdown", 0241, 0},
- {"/cent", 0242, 0},
- {"/sterling", 0243, 0},
- {"/florin", 0244, 0},
- {"/yen", 0245, 0},
- {"/brokenbar", 0246, 0},
- {"/section", 0247, 0},
-
- {"/dieresis", 0250, 0},
- {"/copyright", 0251, 0},
- {"/ordfeminine", 0252, 0},
- {"/guillemotleft", 0253, 0},
- {"/logicalnot", 0254, 0},
- {"/hyphen", 0255, 0},
- {"/registered", 0256, 0},
- {"/macron", 0257, 0},
-
- {"/degree", 0260, 0},
- {"/plusminus", 0261, 0},
- {"/twosuperior", 0262, 0},
- {"/threesuperior", 0263, 0},
- {"/acute", 0264, 0},
- {"/mu", 0265, 0},
- {"/paragraph", 0266, 0},
- {"/periodcentered", 0267, 0},
-
- {"/cedilla", 0270, 0},
- {"/onesuperior", 0271, 0},
- {"/ordmasculine", 0272, 0},
- {"/guillemotright", 0273, 0},
- {"/onequarter", 0274, 0},
- {"/onehalf", 0275, 0},
- {"/threequarters", 0276, 0},
- {"/questiondown", 0277, 0},
-
- {"/Agrave", 0300, 0},
- {"/Aacute", 0301, 0},
- {"/Acircumflex", 0302, 0},
- {"/Atilde", 0303, 0},
- {"/Adieresis", 0304, 0},
- {"/Aring", 0305, 0},
- {"/AE", 0306, 0},
- {"/Ccedilla", 0307, 0},
-
- {"/Egrave", 0310, 0},
- {"/Eacute", 0311, 0},
- {"/Ecircumflex", 0312, 0},
- {"/Edieresis", 0313, 0},
- {"/Igrave", 0314, 0},
- {"/Iacute", 0315, 0},
- {"/Icircumflex", 0316, 0},
- {"/Idieresis", 0317, 0},
-
- {"/Eth", 0320, 0},
- {"/Ntilde", 0321, 0},
- {"/Ograve", 0322, 0},
- {"/Oacute", 0323, 0},
- {"/Ocircumflex", 0324, 0},
- {"/Otilde", 0325, 0},
- {"/Odieresis", 0326, 0},
- {"/multiply", 0327, 0},
-
- {"/Oslash", 0330, 0},
- {"/Ugrave", 0331, 0},
- {"/Uacute", 0332, 0},
- {"/Ucircumflex",0333, 0},
- {"/Udieresis", 0334, 0},
- {"/Yacute", 0335, 0},
- {"/Thorn", 0336, 0},
- {"/germandbls", 0337, 0},
-
- {"/agrave", 0340, 0},
- {"/aacute", 0341, 0},
- {"/acircumflex",0342, 0},
- {"/atilde", 0343, 0},
- {"/adieresis", 0344, 0},
- {"/aring", 0345, 0},
- {"/ae", 0346, 0},
- {"/ccedilla", 0347, 0},
-
- {"/egrave", 0350, 0},
- {"/eacute", 0351, 0},
- {"/ecircumflex", 0352, 0},
- {"/edieresis", 0353, 0},
- {"/igrave", 0354, 0},
- {"/iacute", 0355, 0},
- {"/icircumflex", 0356, 0},
- {"/idieresis", 0357, 0},
-
- {"/eth", 0360, 0},
- {"/ntilde", 0361, 0},
- {"/ograve", 0362, 0},
- {"/oacute", 0363, 0},
- {"/ocircumflex",0364, 0},
- {"/otilde", 0365, 0},
- {"/odieresis", 0366, 0},
- {"/divide", 0367, 0},
-
- {"/oslash", 0370, 0},
- {"/ugrave", 0371, 0},
- {"/uacute", 0372, 0},
- {"/ucircumflex",0373, 0},
- {"/udieresis", 0374, 0},
- {"/yacute", 0375, 0},
- {"/thorn", 0376, 0},
- {"/ydieresis", 0377, 0},
-};
-
-
-static short STDvsISO [][2] = {
- {0341, 0306}, /* AE */
- {0351, 0330}, /* Oslash */
- {0302, 0222}, /* acute */
- {0361, 0346}, /* ae */
- {0306, 0226}, /* breve */
- {0317, 0237}, /* caron */
- {0313, 0270}, /* cedilla */
- {0303, 0223}, /* circumflex */
- {0250, 0244}, /* currency */
- {0310, 0250}, /* dieresis */
- {0307, 0227}, /* dotaccent */
- {0365, 0220}, /* dotlessi */
- {0373, 0337}, /* germandbls */
- {0301, 0221}, /* grave */
- {0315, 0235}, /* hungarumlaut */
- {0055, 0255}, /* hyphen */
- {0305, 0257}, /* macron */
- {0316, 0236}, /* ogenek */
- {0343, 0252}, /* ordfeminine */
- {0353, 0272}, /* ordmasculine */
- {0371, 0370}, /* oslash */
- {0264, 0267}, /* periodcentered */
- {0312, 0232}, /* ring */
- {0304, 0224}, /* tilde */
-};
-
-/* from objfont.c, rest is in lfm_s !!*/
-
-/* START 5.2 */
-
-static int chartoindex(objfnt *fnt, int c)
-{
- if(c<fnt->charmin)
- return -1;
- if(c>fnt->charmax)
- return -1;
- return c-fnt->charmin;
-}
-
-
-static chardesc *getchardesc(objfnt *fnt, int c)
-{
- int index;
-
- index = chartoindex(fnt,c);
- if(index<0)
- return 0;
- return fnt->my_chars+index;
-}
-
-static objfnt *newobjfnt(int type, int charmin, int charmax, int fscale)
-{
- objfnt *fnt;
-
- fnt = (objfnt *)MEM_mallocN(sizeof(objfnt), "newobjfnt");
- fnt->freeaddr = 0;
- fnt->type = type;
- fnt->charmin = charmin;
- fnt->charmax = charmax;
- fnt->my_nchars = fnt->charmax-fnt->charmin+1;
- fnt->scale = fscale;
- fnt->my_chars = (chardesc *)MEM_mallocN(fnt->my_nchars*sizeof(chardesc), "newobjfnt2");
- memset(fnt->my_chars, 0, fnt->my_nchars*sizeof(chardesc));
- return fnt;
-}
-
-
-static void addchardata (objfnt * fnt, int c, short * data, int nshorts)
-{
- int index;
- chardesc *cd;
-
- index = chartoindex(fnt,c);
- if(index<0) {
- fprintf(stderr,"Addchardata bad poop\n");
- return;
- }
- cd = fnt->my_chars+index;
- fnt->freeaddr = 0;
- cd->datalen = nshorts*sizeof(short);
- cd->data = (short *)MEM_mallocN(cd->datalen, "addchardata");
- memcpy(cd->data, data, cd->datalen);
-}
-
-static void addcharmetrics(objfnt *fnt, int c, int movex, int movey)
-{
- int index;
- chardesc *cd;
-
- index = chartoindex(fnt,c);
- if(index<0) {
- fprintf(stderr,"Addcharmetrics bad poop\n");
- return;
- }
- cd = fnt->my_chars+index;
- cd->movex = movex;
- cd->movey = movey;
-}
-
-
-static void fakechar(objfnt *fnt, int c, int width)
-{
- short chardata[1];
-
- chardata[0] = PO_RET;
- addchardata(fnt,c,chardata,1);
- addcharmetrics(fnt,c,width,0);
-}
-
-
-static void freeobjfnt(objfnt * fnt)
-{
- int i;
- chardesc *cd;
-
- cd = fnt->my_chars;
- for(i=0; i<fnt->my_nchars; i++) {
- if(cd->data)
- MEM_freeN(cd->data);
- cd++;
- }
- MEM_freeN(fnt->my_chars);
- MEM_freeN(fnt);
-}
-
-
-/* END 5.2 */
-
-static short STDtoISO(short c)
-{
- short i = (sizeof(STDvsISO) / (2 * sizeof(short))) - 1;
-
- for (;i >= 0; i--){
- if (STDvsISO[i][0] == c) return (STDvsISO[i][1]);
- }
- return(c);
-}
-
-
-/*
- * read the font matrix out of the font file
- *
- */
-
-static char * newfgets(char * s, int n, PackedFile * pf){
- int c;
- char * p;
-
- p = s;
- while (n > 0){
- c = ((char *) pf->data)[pf->seek];
- pf->seek++;
- if (pf->seek > pf->size){
- return (0);
- }
- if (c == 10 || c == 13){
- *p = 0;
- return(s);
- }
- *p++ = c;
- n--;
- }
- *p = 0;
- return(s);
-}
-
-static int readfontmatrix(PackedFile * pf, float mat[2][2])
-{
- char *cptr;
- float a, b, c, d, e, f;
-
- pf->seek = 0;
-
- /* look for the FontMatrix def */
- while(1) {
- if(!newfgets(oneline, LINELEN, pf)) {
- fprintf(stderr,"fromtype1: no FontMatrix found\n");
- return(-1);
- }
- cptr = strchr(oneline,'/');
- if(cptr) {
- if(strncmp(cptr,"/FontMatrix",11) == 0) {
- cptr = strchr(cptr,'[');
- if(!cptr) {
- fprintf(stderr,"fromtype1: bad FontMatrix line\n");
- return(-1);
- }
- sscanf(cptr+1,"%f %f %f %f %f %f\n",&a,&b,&c,&d,&e,&f);
- break;
- }
- }
- }
-
- mat[0][0] = 1000.0*a;
- mat[1][0] = 1000.0*b;
- mat[0][1] = 1000.0*c;
- mat[1][1] = 1000.0*d;
-
- return(0);
-}
-
-/*
- * Decryption support
- *
- *
- */
-static void resetdecrypt(int n)
-{
- mr = n;
-}
-
-
-
-/*
- * decryption subroutines
- *
- */
-
-static char mdecrypt(char cipher)
-{
- char plain;
-
- plain = (cipher^(mr>>8));
- mr = (cipher+mr)*MC1 + MC2;
- return plain;
-}
-
-static void decryptdata(char * cptr, int n)
-{
- while(n--) {
- *cptr = mdecrypt(*cptr);
- cptr++;
- }
-}
-
-static int decryptprogram(char *buf, int len)
-{
- int i;
-
- resetdecrypt(4330);
- for(i=0; i<len; i++) {
- if(i<SKIP) {
- mdecrypt(buf[i]);
- }
- else {
- buf[i-SKIP] = mdecrypt(buf[i]);
- }
- }
- return len-SKIP;
-}
-
-static void decryptall(void)
-{
- int i;
-
- for(i=0; i<my_nsubrs; i++)
- my_sublen[i] = decryptprogram(my_subrs[i],my_sublen[i]);
- for(i=0; i<my_nchars; i++)
- my_charlen[i] = decryptprogram(my_chars[i],my_charlen[i]);
-}
-
-
-/*
- * decode the eexec part of the file
- *
- */
-
-static int decodetype1(PackedFile * pf, char *outname)
-{
- char *hptr, *bptr;
- int i, totlen, hexbytes, c;
- char *hexdat;
- char hextab[256];
-
- /* make hex table */
- if(!firsted) {
- for(i=0; i<256; i++) {
- if(i>='0' && i<='9')
- hextab[i] = i-'0';
- else if(i>='a' && i<='f')
- hextab[i] = 10+i-'a';
- else if(i>='A' && i<='F')
- hextab[i] = 10+i-'A';
- else
- hextab[i] = NOTHEX;
- }
- }
-
- pf->seek = 0;
-
- /* allocate buffers */
- totlen = pf->size;
- hexdat = (char *)MEM_mallocN(totlen, "hexdat");
- bindat = (char *)MEM_mallocN(totlen, "bindat");
-
- /* look for eexec part of file */
- while(1) {
- if(!newfgets(oneline, LINELEN, pf)) {
- fprintf(stderr,"fromtype1: no currentfile eexec found\n");
- return(-1);
- }
- oneline[16] = 0;
- if(strcmp(oneline,"currentfile eexe") == 0)
- break;
- }
-
- /* initialize decryption variables */
- mr = 55665;
-
- /* first byte == 0 for binary data (???) */
-
- c = ((char *) pf->data)[pf->seek];
-
- if (hextab[c] != NOTHEX){
- /* read all the hex bytes into the hex buffer */
- hexbytes = 0;
- while(newfgets(oneline, LINELEN, pf)) {
- hptr = (char *)oneline;
- while(*hptr) {
- if(hextab[(int)*hptr] != NOTHEX)
- hexdat[hexbytes++] = *hptr;
- hptr++;
- }
- }
-
- /* check number of hex bytes */
- if(hexbytes & 1)
- hexbytes--;
- datbytes = hexbytes/2;
-
- /* translate hex data to binary */
- hptr = hexdat;
- bptr = bindat;
- c = datbytes;
- while(c--) {
- *bptr++ = (hextab[(int)hptr[0]]<<4)+hextab[(int)hptr[1]];
- hptr += 2;
- }
-
- /* decrypt the data */
- decryptdata(bindat,datbytes);
-
- } else {
- datbytes = pf->size - pf->seek;
- memcpy(bindat, ((char *) pf->data) + pf->seek, datbytes);
-
- if ((bindat[2] << (8 + bindat[3])) == 0x800){
- /* order data (remove 6 bytes headers) */
- i = datbytes;
- hptr = bptr = bindat + 4;
- hptr += 2;
-
- while (i > 0){
- if (i > 2046) c = 2046;
- else c = i;
-
- memcpy(bptr, hptr, c);
- bptr += 2046;
- hptr += 2046 + 6;
- i -= 2046 + 6;
- datbytes -= 6;
- }
-
- /* decrypt the data */
- decryptdata(bindat+4,datbytes);
- } else{
- decryptdata(bindat+6,datbytes-6);
- }
- }
-
-#ifdef DEBUG
- outf = fopen(outname,"wb");
- fwrite(bindat,datbytes,1,outf);
- fclose(outf);
-#endif
-
- MEM_freeN(hexdat);
-
- return 1;
-}
-
-/*
- * fake file reading funcs
- *
- *
- */
-
-static void fakefopen(void)
-{
- fakepos = 0;
- fakemax = datbytes;
-}
-
-
-static void fakegettoken(char *str)
-{
- int c;
- char *cptr;
- char *start;
-
- start = (char *) str;
- cptr = bindat+fakepos;
- c = *cptr++;
- fakepos++;
- if(c != '\n') {
- while(isspace(c)) {
- c = *cptr++;
- fakepos++;
- }
- while (fakepos<fakemax && !isspace(c)) {
- *str++ = c;
- c = *cptr++;
- fakepos++;
- }
- if(c == '\n')
- fakepos--;
- }
- *str = 0;
- if(fakepos>fakemax) {
- fprintf(stderr,"fromtype1: unexpected eof\n");
- strcpy(start, "end");
- }
-}
-
-static int fakefgets(char *buf,int max)
-{
- char *cptr;
-
- cptr = (char *)(bindat+fakepos);
- while(max--) {
- *buf++ = *cptr;
- fakepos++;
- if(*cptr == 10 || *cptr == 13)
- return 1;
- cptr++;
- if(fakepos>fakemax)
- return 0;
- }
- return 0;
-}
-
-static char *fakefread(int n)
-{
- fakepos += n;
- return bindat+fakepos-n;
-}
-
-static void applymat(float mat[][2], float *x, float *y)
-{
- float tx, ty;
-
- tx = ((*x)*mat[0][0])+((*y)*mat[0][1]);
- ty = ((*x)*mat[1][0])+((*y)*mat[1][1]);
- *x = tx;
- *y = ty;
-}
-
-static void setcharlist(void)
-{
- char *name; /*found;*/
- int i, j;
-
- for(i=0; i<NASCII; i++) ISOcharlist[i].prog = -1;
-
- for(j=0; j<my_nchars; j++) {
- name = my_charname[j];
- if(name) {
- /*found = 0;*/
- for(i=0; i<NASCII; i++) {
- if(ISOcharlist[i].name && (strcmp(name,ISOcharlist[i].name) == 0)){
- ISOcharlist[i].prog = j;
- /*found = 1;*/
- }
- }
- /*if (found == 0) printf("no match found for: %s\n", name);*/
- MEM_freeN(name);
- my_charname[j] = 0;
- }
- }
-}
-
-
-static objfnt * objfnt_from_psfont(PackedFile * pf)
-{
- int i, k, index;
- int nread, namelen;
- char *cptr;
-
- fnt = 0;
- bindat = 0;
-
- /* read the font matrix from the font */
- if (readfontmatrix(pf,mat)) return(0);
-
- /* decode the font data */
- decodetype1(pf, "/usr/tmp/type1.dec");
-
- /* open the input file */
- fakefopen();
-
- /* look for the /Subrs def and get my_nsubrs */
- while(1) {
- if(!fakefgets(oneline,LINELEN)) {
- fprintf(stderr,"fromtype1: no /Subrs found\n");
- my_nsubrs = 0;
- fakefopen();
- break;
- }
- cptr = strchr(oneline,'/');
- if(cptr) {
- if(strncmp(cptr,"/Subrs",6) == 0) {
- my_nsubrs = atoi(cptr+6);
- break;
- }
- }
- }
-
- /* read the Subrs in one by one */
- for(i=0; i<my_nsubrs; i++)
- my_sublen[i] = 0;
- for(i=0; i<my_nsubrs; i++) {
- for(k=0; k<MAXTRIES; k++) {
- fakegettoken(tok);
- if(strcmp(tok,"dup") == 0)
- break;
- }
- if(k == MAXTRIES) {
- fprintf(stderr,"dup for subr %d not found in range\n", i);
- /*exit(1);*/
- }
-
- /* get the Subr index here */
- fakegettoken(tok);
- index = atoi(tok);
-
- /* check to make sure it is in range */
- if(index<0 || index>my_nsubrs) {
- fprintf(stderr,"bad Subr index %d\n",index);
- /*exit(1);*/
- }
-
- /* get the number of bytes to read */
- fakegettoken(tok);
- nread = atoi(tok);
- fakegettoken(tok);
-
- /* read in the subroutine */
- my_sublen[index] = nread;
- my_subrs[index] = fakefread(nread);
- fakegettoken(tok);
- }
-
- /* look for the CharStrings */
- while(1) {
- fakegettoken(tok);
- cptr = strchr(tok,'/');
- if(cptr && strcmp(cptr,"/CharStrings") == 0)
- break;
- }
-
- fakegettoken(tok); /* skip my_ncharscrings */
- fakegettoken(tok); /* skip dict */
- fakegettoken(tok); /* skip dup */
- fakegettoken(tok); /* skip begin */
- fakegettoken(tok); /* skip newline */
-
- /* read the CharStrings one by one */
- my_nchars = 0;
- for(i=0; i<MAXCHARS; i++) {
-
- /* check for end */
- fakegettoken(tok);
- if(strcmp(tok,"end") == 0)
- break;
-
- /* get the char name and allocate space for it */
- namelen = strlen(tok);
- my_charname[i] = (char *)MEM_mallocN(namelen+1, "my_charname");
- strcpy(my_charname[i],tok);
-
- /* get the number of bytes to read */
- fakegettoken(tok);
- nread = atoi(tok);
- fakegettoken(tok);
-
- /* read in the char description */
- my_charlen[i] = nread;
- my_chars[i] = fakefread(nread);
-
- /* skip the end of line */
- fakegettoken(tok);
- fakegettoken(tok);
- my_nchars++;
- }
-
- /* decrypt the character descriptions */
- decryptall();
- setcharlist();
-
- /* make the obj font */
- makeobjfont(savesplines);
-
- if (bindat) MEM_freeN(bindat);
- /* system("rm /usr/tmp/type1.dec"); */
-
- return (fnt);
-}
-
-
-
-
-/*
- * pc stack support
- *
- */
-
-static void initpcstack(void)
-{
- pcsp = 0;
-}
-
-static void pushpc(char *pc)
-{
- pcstack[pcsp] = pc;
- pcsp++;
-}
-
-static char *poppc(void)
-{
- pcsp--;
- if(pcsp<0) {
- fprintf(stderr,"\nYUCK: pc stack under flow\n");
- pcsp = 0;
- return 0;
- }
- return pcstack[pcsp];
-}
-
-/*
- * Data stack support
- *
- */
-
-static void initstack(void)
-{
- sp = 0;
-}
-
-static void push(int val)
-/* int val; */
-{
- stack[sp] = val;
- sp++;
-}
-
-static int pop(void)
-{
- sp--;
- if(sp<0) {
- fprintf(stderr,"\nYUCK: stack under flow\n");
- sp = 0;
- return 0;
- }
- return stack[sp];
-}
-
-/*
- * call/return data stack
- *
- */
-
-static void initretstack(void)
-{
- retsp = 0;
-}
-
-static void retpush(int val)
-/* int val; */
-{
- retstack[retsp] = val;
- retsp++;
-}
-
-static int retpop(void)
-{
- retsp--;
- if(retsp<0) {
- fprintf(stderr,"\nYUCK: ret stack under flow\n");
- retsp = 0;
- return 0;
- }
- return retstack[retsp];
-}
-
-
-/*
- * execute the program:
- *
- *
- */
-
-static void getmove(int *x, int *y)
-{
- *x = delx;
- *y = dely;
- /* printf("ingetmove\n"); */
-}
-
-static void getpos(int *x, int *y)
-{
- *x = curx;
- *y = cury;
-}
-
-static void subr1(void)
-{
- coordpos = 0;
- incusp = 1;
-}
-
-static void subr2(void)
-{
- int x, y;
-
- getmove(&x,&y);
- if(coordpos>=7) {
- fprintf(stderr,"subr2: bad poop\n");
- /*exit(1);*/
- }
- coordsave[coordpos][0] = x;
- coordsave[coordpos][1] = y;
- coordpos++;
-}
-
-static void subr0(void)
-{
- int x0, y0;
- int x1, y1;
- int x2, y2;
- int x3, y3;
- int noise;
-
- pop(); /* xpos, unused */
- pop(); /* ypos, unused */
- noise = pop();
- if(coordpos!=7) {
- fprintf(stderr,"subr0: bad poop\n");
- /*exit(1);*/
- }
- x0 = coordsave[0][0];
- y0 = coordsave[0][1];
-
- x1 = coordsave[1][0]+x0;
- y1 = coordsave[1][1]+y0;
- x2 = coordsave[2][0];
- y2 = coordsave[2][1];
- x3 = coordsave[3][0];
- y3 = coordsave[3][1];
- rcurveto(x1,y1,x1+x2,y1+y2,x1+x2+x3,y1+y2+y3);
- x1 = coordsave[4][0];
- y1 = coordsave[4][1];
- x2 = coordsave[5][0];
- y2 = coordsave[5][1];
- x3 = coordsave[6][0];
- y3 = coordsave[6][1];
- rcurveto(x1,y1,x1+x2,y1+y2,x1+x2+x3,y1+y2+y3);
- getpos(&x0,&y0);
- retpush(y0);
- retpush(x0);
- incusp = 0;
-}
-
-static void append_poly_offset(short ofsx, short ofsy, short * data)
-{
- int nverts;
-
- if (data == 0) return;
-
- while(1) {
- switch(chardata[nshorts++] = *data++) {
- case PO_BGNLOOP:
- nshorts --; /* for the first time */
- break;
- case PO_RETENDLOOP:
- case PO_RET:
- return;
- }
- nverts = chardata[nshorts++] = *data++;
- while(nverts--) {
- chardata[nshorts++] = (*data++) + ofsx;
- chardata[nshorts++] = (*data++) + ofsy;
- }
- }
-}
-
-
-static void append_spline_offset(short ofsx, short ofsy, short * data)
-{
- int nverts = 0;
-
- if (data == 0) return;
-
- while(1) {
- switch(chardata[nshorts++] = *data++) {
- case SP_MOVETO:
- case SP_LINETO:
- nverts = 1;
- break;
- case SP_CURVETO:
- nverts = 3;
- break;
- case SP_RETCLOSEPATH:
- case SP_RET:
- return;
- }
-
- for (; nverts > 0; nverts--) {
- chardata[nshorts++] = (*data++) + ofsx;
- chardata[nshorts++] = (*data++) + ofsy;
- }
- }
-}
-
-
-
-/*
- * graphics follows
- *
- *
- */
-
-
-/* poly output stuff */
-
-static void setwidth(int w, int x)
-{
- thecharwidth = w;
- thesidebearing = x;
-}
-
-static void poly_beginchar(void)
-{
- npnts = 0;
- nloops = 0;
-}
-
-static void poly_endchar(void)
-{
- if(nloops == 0)
- chardata[nshorts++] = PO_RET;
- else
- chardata[nshorts++] = PO_RETENDLOOP;
-}
-
-static void poly_close(void)
-{
- chardata[nvertpos] = npnts;
- npnts = 0;
-}
-
-static void poly_pnt(float x, float y)
-{
- int ix, iy;
-
- applymat(mat,&x,&y);
- ix = floor(x);
- iy = floor(y);
- if(npnts == 0) {
- if(nloops == 0) {
- chardata[nshorts++] = PO_BGNLOOP;
- nvertpos = nshorts++;
- } else {
- chardata[nshorts++] = PO_ENDBGNLOOP;
- nvertpos = nshorts++;
- }
- nloops++;
- }
- chardata[nshorts++] = ix;
- chardata[nshorts++] = iy;
- npnts++;
-
-}
-
-/* spline output stuff */
-
-static void spline_beginchar(void)
-{
- sp_npnts = 0;
- sp_nloops = 0;
-}
-
-static void spline_endchar(void)
-{
- if(sp_nloops == 0)
- chardata[nshorts++] = SP_RET;
- else
- chardata[nshorts++] = SP_RETCLOSEPATH;
-}
-
-static void spline_close(void)
-{
- chardata[nshorts++] = SP_CLOSEPATH;
- sp_npnts = 0;
- sp_nloops = 0;
-}
-
-static void spline_line(float x0, float y0, float x1, float y1)
-{
- applymat(mat,&x0,&y0);
- applymat(mat,&x1,&y1);
-
- if(sp_npnts == 0) {
- chardata[nshorts++] = SP_MOVETO;
- chardata[nshorts++] = floor(x0);
- chardata[nshorts++] = floor(y0);
- sp_npnts++;
- sp_nloops++;
- }
- chardata[nshorts++] = SP_LINETO;
- chardata[nshorts++] = floor(x1);
- chardata[nshorts++] = floor(y1);
- sp_npnts++;
-}
-
-static void spline_curveto(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
-{
- applymat(mat,&x0,&y0);
-
- applymat(mat,&x1,&y1);
- applymat(mat,&x2,&y2);
- applymat(mat,&x3,&y3);
- if(sp_npnts == 0) {
- chardata[nshorts++] = SP_MOVETO;
- chardata[nshorts++] = floor(x0);
- chardata[nshorts++] = floor(y0);
- sp_npnts++;
- sp_nloops++;
- }
- chardata[nshorts++] = SP_CURVETO;
- chardata[nshorts++] = floor(x1);
- chardata[nshorts++] = floor(y1);
- chardata[nshorts++] = floor(x2);
- chardata[nshorts++] = floor(y2);
- chardata[nshorts++] = floor(x3);
- chardata[nshorts++] = floor(y3);
-}
-
-static void savestart(int x, int y)
-{
- startx = x;
- starty = y;
- started = 1;
-}
-
-static void sbpoint( int x, int y)
-{
- curx = x;
- cury = y;
-}
-
-static void rmoveto( int x, int y)
-{
- if(incusp) {
- delx = x;
- dely = y;
- } else {
- curx += x;
- cury += y;
- savestart(curx,cury);
- }
-}
-
-static void drawline(float x0, float y0, float x1, float y1, float dx0, float dy0, float dx1, float dy1)
-{
- if(x0!=x1 || y0!=y1)
- poly_pnt(x1,y1);
-}
-
-
-static void rlineto( int x, int y)
-{
- float dx, dy;
-
- nextx = curx + x;
- nexty = cury + y;
- dx = nextx-curx;
- dy = nexty-cury;
- if (savesplines) spline_line( curx, cury, nextx, nexty);
- else drawline( curx, cury, nextx, nexty,dx,dy,dx,dy);
- curx = nextx;
- cury = nexty;
-}
-
-static void closepath(void)
-{
- float dx, dy;
-
- if(started) {
- dx = startx-curx;
- dy = starty-cury;
- if (savesplines) {
- spline_close();
- } else {
- drawline( curx, cury, startx, starty,dx,dy,dx,dy);
- poly_close();
- }
- started = 0;
- }
-}
-
-static void bezadapt( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float beztol)
-{
- float ax0,ay0,ax1,ay1,ax2,ay2,ax3,ay3;
- float bx0,by0,bx1,by1,bx2,by2,bx3,by3;
- float midx, midy;
- float linx, liny, dx, dy, mag;
-
- midx = (x0+3*x1+3*x2+x3)/8.0;
- midy = (y0+3*y1+3*y2+y3)/8.0;
- linx = (x0+x3)/2.0;
- liny = (y0+y3)/2.0;
- dx = midx-linx;
- dy = midy-liny;
- mag = dx*dx+dy*dy;
- if(mag<(beztol*beztol))
- drawline(x0,y0,x3,y3,x1-x0,y1-y0,x3-x2,y3-y2);
- else {
- ax0 = x0;
- ay0 = y0;
- ax1 = (x0+x1)/2;
- ay1 = (y0+y1)/2;
- ax2 = (x0+2*x1+x2)/4;
- ay2 = (y0+2*y1+y2)/4;
- ax3 = midx;
- ay3 = midy;
- bezadapt(ax0,ay0,ax1,ay1,ax2,ay2,ax3,ay3,beztol);
-
- bx0 = midx;
- by0 = midy;
- bx1 = (x1+2*x2+x3)/4;
- by1 = (y1+2*y2+y3)/4;
- bx2 = (x2+x3)/2;
- by2 = (y2+y3)/2;
- bx3 = x3;
- by3 = y3;
- bezadapt(bx0,by0,bx1,by1,bx2,by2,bx3,by3,beztol);
- }
-}
-
-static void drawbez( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
-{
- bezadapt(x0,y0,x1,y1,x2,y2,x3,y3,beztol);
-}
-
-
-static void rcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3)
-{
- int x0, y0;
- int x1, y1;
- int x2, y2;
- int x3, y3;
-
- x0 = curx;
- y0 = cury;
- x1 = curx+dx1;
- y1 = cury+dy1;
- x2 = curx+dx2;
- y2 = cury+dy2;
- x3 = curx+dx3;
- y3 = cury+dy3;
-
- if (savesplines) {
- spline_curveto( x0, y0, x1, y1, x2, y2, x3, y3);
- } else{
- drawbez( x0, y0, x1, y1, x2, y2, x3, y3);
- }
- curx = x3;
- cury = y3;
-}
-
-/*
- * saveobjfont -
- * save an object font.
- *
- */
-
-/* generic routines */
-
-static void makeobjfont(int savesplines)
-{
- int i, c;
-
- if(savesplines)
- fnt = newobjfnt(SP_TYPE, 32, 32+NASCII-1, 9840);
- else
- fnt = newobjfnt(PO_TYPE, 32, 32+NASCII-1, 9840);
-
- for(i=0; i<NASCII; i++) {
- c = i+32;
- if(ISOcharlist[i].prog>=0) {
- /*printf("decoding %s\n", ISOcharlist[i].name);*/
-
- nshorts = 0;
- drawchar(ISOcharlist[i].prog);
- addchardata(fnt,c,chardata,nshorts);
- addcharmetrics(fnt,c,thecharwidth,0);
- sidebearing[c] = thesidebearing;
- } else if(c == ' ') {
- printf("faking space %d\n",i);
- fakechar(fnt,' ',400);
- }
- }
-}
-
-/*
- * run the character program
- *
- *
- */
-
-static void drawchar(int c)
-{
- if (savesplines) {
- spline_beginchar();
- } else {
- poly_beginchar();
- }
- initstack();
- initpcstack();
- initretstack();
- pc = my_chars[c];
- runprog();
- if (savesplines){
- spline_endchar();
- } else {
- poly_endchar();
- }
-}
-
-static int docommand(int cmd)
-{
- int x, y, w, c1, c2;
- int dx1, dy1;
- int dx2, dy2;
- int dx3, dy3;
- float fdx1, fdy1;
- int i, sub, n;
- char *subpc;
- chardesc *cd;
- short *ndata;
-
- switch(cmd) {
- case WHAT0:
- fprintf(stderr,"\nYUCK: WHAT0\n");
- break;
- case HSTEM:
- pop();
- pop();
- /*printf("hstem: %d %d\n", pop(), pop());*/
- break;
- case VSTEM:
- pop();
- pop();
- /*printf("vstem: %d %d\n", pop(), pop());*/
- break;
- case VMOVETO:
- y = pop();
- rmoveto(0,y);
- break;
- case RLINETO:
- y = pop();
- x = pop();
- rlineto(x,y);
- break;
- case HLINETO:
- x = pop();
- rlineto(x,0);
- break;
- case VLINETO:
- y = pop();
- rlineto(0,y);
- break;
- case RRCURVETO:
- dy3 = pop();
- dx3 = pop();
- dy2 = pop();
- dx2 = pop();
- dy1 = pop();
- dx1 = pop();
- rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3);
- break;
- case CLOSEPATH:
- closepath();
- break;
- case CALLSUBR:
- sub = pop();
- subpc = my_subrs[sub];
- if(!subpc) {
- fprintf(stderr,"\nYUCK no sub addr\n");
- }
- pushpc(pc);
- pc = subpc;
- break;
- case RETURN:
- pc = poppc();
- break;
- case HSBW:
- w = pop();
- x = pop();
- setwidth(w, x);
- sbpoint(x,0);
- break;
- case ENDCHAR:
- closepath();
- break;
- case RMOVETO:
- y = pop();
- x = pop();
- rmoveto(x,y);
- break;
- case HMOVETO:
- x = pop();
- rmoveto(x,0);
- break;
- case VHCURVETO:
- dy3 = 0;
- dx3 = pop();
- dy2 = pop();
- dx2 = pop();
- dy1 = pop();
- dx1 = 0;
- rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3);
- break;
- case HVCURVETO:
- dy3 = pop();
- dx3 = 0;
- dy2 = pop();
- dx2 = pop();
- dy1 = 0;
- dx1 = pop();
- rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3);
- break;
- case DOTSECTION:
- break;
- case VSTEM3:
- /*printf("vstem3\n");*/
- pop();
- pop();
- pop();
- pop();
- pop();
- pop();
- break;
- case HSTEM3:
- /*printf("hstem3\n");*/
- pop();
- pop();
- pop();
- pop();
- pop();
- pop();
- break;
- case SEAC:
- if (0) {
- printf("seac: %3d %3d %3d %3d %3d\n", pop(), pop(), pop(), pop(), pop());
- } else{
- c2 = STDtoISO(pop()); /* accent */
- c1 = STDtoISO(pop()); /* letter */
-
- cd = getchardesc(fnt, c1);
- if (cd) {
- memcpy(chardata, cd->data, cd->datalen);
- nshorts = cd->datalen / sizeof(short);
- }
-
- cd = getchardesc(fnt, c2);
- if (cd && cd->data && cd->datalen) {
- ndata = cd->data;
-
- if (nshorts) {
- if (savesplines) {
- switch (chardata[nshorts - 1]){
- case SP_RET:
- nshorts--;
- break;
- case SP_RETCLOSEPATH:
- chardata[nshorts - 1] = SP_CLOSEPATH;
- break;
- }
- } else {
- switch (chardata[nshorts - 1]){
- case PO_RET:
- printf("PO_RET in character disription ?\n");
- nshorts--;
- break;
- case PO_RETENDLOOP:
- if (ndata[0] == PO_BGNLOOP) {
- chardata[nshorts - 1] = PO_ENDBGNLOOP;
- } else {
- printf("new character doesn't start with PO_BGNLOOP ?\n");
- }
- break;
- }
- }
- }
-
- /* instead of the sidebearing[c1] maybe thesidebearing should be used */
-
- dy1 = pop();
- dx1 = pop() + sidebearing[c1] - sidebearing[c2];
- pop();
-
- fdx1 = dx1;
- fdy1 = dy1;
- applymat(mat, &fdx1, &fdy1);
- dx1 = floor(fdx1);
- dy1 = floor(fdy1);
-
- if (savesplines) {
- append_spline_offset(dx1, dy1, ndata);
- } else{
- append_poly_offset(dx1, dy1, ndata);
- }
-
- /*printf("first: %d %d\n", cd->data[0], cd->data[1]);*/
- }
- fflush(stdout);
- }
- break;
- case SBW:
- w = pop();
- y = pop();
- fprintf(stderr,"sbw: width: %d %d\n",w,y);
- y = pop();
- x = pop();
- fprintf(stderr,"sbw: side: %d %d\n",x,y);
- setwidth(w, x);
- sbpoint(x,y);
- break;
- case DIV:
- x = pop();
- y = pop();
- push(x/y);
- break;
- case CALLOTHERSUBR:
- sub = pop();
- n = pop();
- if(sub == 0)
- subr0();
- else if(sub == 1)
- subr1();
- else if(sub == 2)
- subr2();
- else {
- for(i=0; i<n; i++) {
- retpush(pop());
- }
- }
- break;
- case POP:
- push(retpop());
- break;
- case SETCURRENTPOINT:
- y = pop();
- x = pop();
- sbpoint(x,y);
- break;
- default:
- /*fprintf(stderr,"\nYUCK bad instruction %d\n",cmd);*/
- break;
- }
- if(pc == 0 || cmd == ENDCHAR || cmd == WHAT0 || cmd == SEAC)
- return 0;
- else
- return 1;
-}
-
-
-/*
- * Character interpreter
- *
- */
-
-static void runprog(void)
-{
- int v, w, num, cmd;
-
- while(1) {
- v = *pc++;
- if(v>=0 && v<=31) {
- if(v == 12) {
- w = *pc++;
- cmd = 256+w;
- } else
- cmd = v;
- if(!docommand(cmd)) {
- return;
- }
- } else if(v>=32 && v<=246) {
- num = v-139;
- push(num);
- } else if(v>=247 && v<=250) {
- w = *pc++;
- num = (v-247)*256+w+108;
- push(num);
- } else if(v>=251 && v<=254) {
- w = *pc++;
- num = -(v-251)*256-w-108;
- push(num);
- } else if(v == 255) {
- num = *pc++;
- num <<= 8;
- num |= *pc++;
- num <<= 8;
- num |= *pc++;
- num <<= 8;
- num |= *pc++;
- push(num);
- }
- }
-}
-
-/***/
-
-static VFontData *objfnt_to_vfontdata(objfnt *fnt)
-{
- VFontData *vfd;
- chardesc *cd;
- short *_data, *data;
- int a, i, count, stop, ready, meet;
- short first[2]={0,0}, last[2]={0,0};
- struct Nurb *nu;
- struct BezTriple *bezt, *bez2;
- float scale, dx, dy;
- struct VChar *che;
-
- if (!fnt || (fnt->type!=SP_TYPE)) {
- return NULL;
- }
-
- vfd= MEM_callocN(sizeof(*vfd), "VFontData");
- scale = 10.0/(float)fnt->scale; /* after IRIX 6.2, scaling went wrong */
-
- for (i = 0; i < MAX_VF_CHARS; i++) {
- cd = getchardesc(fnt, i);
- if (cd && cd->data && cd->datalen) {
- che = (VChar *) MEM_callocN(sizeof(VChar), "objfnt_char");
- BLI_addtail(&vfd->characters, che);
- che->index = i;
- che->width = scale * cd->movex;
-
- _data = data = cd->data;
-
- do{
- /* count first */
- _data = data;
- count = 0;
- ready = stop = 0;
-
- do{
- switch(*data++){
- case SP_MOVETO:
- first[0] = data[0];
- first[1] = data[1];
- case SP_LINETO:
- count++;
- last[0] = data[0];
- last[1] = data[1];
- data += 2;
- break;
- case SP_CURVETO:
- count++;
- last[0] = data[4];
- last[1] = data[5];
- data += 6;
- break;
- case SP_RET:
- case SP_RETCLOSEPATH:
- stop = 1;
- ready = 1;
- break;
- case SP_CLOSEPATH:
- stop = 1;
- break;
- }
- } while (!stop);
-
- if ((count>0) && last[0] == first[0] && last[1] == first[1]) meet = 1;
- else meet = 0;
-
- /* is there more than 1 unique point ?*/
-
- if (count - meet > 0) {
- data = _data;
- nu = (Nurb*)MEM_callocN(sizeof(struct Nurb),"objfnt_nurb");
- bezt = (BezTriple*)MEM_callocN((count)* sizeof(BezTriple),"objfnt_bezt") ;
- if (nu != 0 && bezt != 0) {
- BLI_addtail(&che->nurbsbase, nu);
- nu->type= CU_BEZIER+CU_2D;
- nu->pntsu = count;
- nu->resolu= 8;
- nu->flagu= CU_CYCLIC;
- nu->bezt = bezt;
- stop = 0;
-
- /* read points */
- do {
- switch(*data++){
- case SP_MOVETO:
- bezt->vec[1][0] = scale * *data++;
- bezt->vec[1][1] = scale * *data++;
-
- break;
- case SP_LINETO:
- bez2 = bezt++;
- bezt->vec[1][0] = scale * *data++;
- bezt->vec[1][1] = scale * *data++;
- /* vector handles */
- bezt->h1= HD_VECT;
- bez2->h2= HD_VECT;
- dx = (bezt->vec[1][0] - bez2->vec[1][0]) / 3.0;
- dy = (bezt->vec[1][1] - bez2->vec[1][1]) / 3.0;
- bezt->vec[0][0] = bezt->vec[1][0] - dx;
- bezt->vec[0][1] = bezt->vec[1][1] - dy;
- bez2->vec[2][0] = bez2->vec[1][0] + dx;
- bez2->vec[2][1] = bez2->vec[1][1] + dy;
- break;
-
- case SP_CURVETO:
- bezt->vec[2][0] = scale * *data++;
- bezt->vec[2][1] = scale * *data++;
- bezt->h2= HD_ALIGN;
- bezt++;
- bezt->vec[0][0] = scale * *data++;
- bezt->vec[0][1] = scale * *data++;
- bezt->vec[1][0] = scale * *data++;
- bezt->vec[1][1] = scale * *data++;
- bezt->h1= HD_ALIGN;
- break;
-
- case SP_RET:
- case SP_RETCLOSEPATH:
- stop = 1;
- ready = 1;
- break;
- case SP_CLOSEPATH:
- stop = 1;
- break;
- }
- } while (stop == 0);
-
- if (meet) {
- /* copy handles */
- nu->bezt->vec[0][0] = bezt->vec[0][0];
- nu->bezt->vec[0][1] = bezt->vec[0][1];
- /* and forget last point */
- nu->pntsu--;
- }
- else {
- /* vector handles */
- bez2 = nu->bezt;
- dx = (bezt->vec[1][0] - bez2->vec[1][0]) / 3.0;
- dy = (bezt->vec[1][1] - bez2->vec[1][1]) / 3.0;
- bezt->vec[2][0] = bezt->vec[1][0] - dx;
- bezt->vec[2][1] = bezt->vec[1][1] - dy;
- bez2->vec[0][0] = bez2->vec[1][0] + dx;
- bez2->vec[0][1] = bez2->vec[1][1] + dy;
- bezt->h2= bez2->h1= HD_VECT;
- }
-
- /* forbidden handle combinations */
- a= nu->pntsu;
- bezt= nu->bezt;
- while(a--) {
- if(bezt->h1!=HD_ALIGN && bezt->h2==HD_ALIGN) bezt->h2= 0;
- else if(bezt->h2!=HD_ALIGN && bezt->h1==HD_ALIGN) bezt->h1= 0;
- bezt->radius= 1.0f;
- bezt++;
- }
-
- }
- else {
- if (nu) MEM_freeN(nu);
- if (bezt) MEM_freeN(bezt);
- }
- }
- _data = data;
- } while (ready == 0);
- }
- }
-
- return vfd;
-}
-
-VFontData *BLI_vfontdata_from_psfont(PackedFile *pf)
-{
- objfnt *fnt= objfnt_from_psfont(pf);
- VFontData *vfd= NULL;
-
- if (fnt) {
- vfd= objfnt_to_vfontdata(fnt);
- freeobjfnt(fnt);
- }
-
- return vfd;
-}
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index 0ae17a13e43..cdc5cec705f 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -33,13 +33,6 @@
#include <stdio.h>
#include <stdlib.h>
-#ifdef WIN32
-#include "BLI_winstuff.h"
-#include <sys/types.h>
-#include <io.h>
-#include <direct.h>
-#endif
-
#ifndef WIN32
#include <dirent.h>
#endif
@@ -47,13 +40,13 @@
#include <time.h>
#include <sys/stat.h>
-#if defined (__sun__) || defined (__sun) || defined (__sgi)
+#if defined (__sun__) || defined (__sun) || defined (__sgi) || defined (__NetBSD__)
#include <sys/statvfs.h> /* Other modern unix os's should probably use this also */
#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
#include <sys/statfs.h>
#endif
-#if defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__)
+#if defined (__FreeBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#include <sys/mount.h>
#endif
@@ -70,9 +63,6 @@
#include <fcntl.h>
-#if !defined(WIN32)
-#include <sys/mtio.h> /* tape comando's */
-#endif
#include <string.h> /* strcpy etc.. */
#ifndef WIN32
@@ -85,6 +75,14 @@
#include <malloc.h>
#endif
+#ifdef WIN32
+#include <sys/types.h>
+#include <io.h>
+#include <direct.h>
+#include "BLI_winstuff.h"
+#endif
+
+
/* lib includes */
#include "MEM_guardedalloc.h"
@@ -173,7 +171,7 @@ double BLI_diskfree(char *dir)
return (double) (freec*bytesps*sectorspc);
#else
-#if defined (__sun__) || defined (__sun) || defined (__sgi)
+#if defined (__sun__) || defined (__sun) || defined (__sgi) || defined (__NetBSD__)
struct statvfs disk;
#else
struct statfs disk;
@@ -195,7 +193,7 @@ double BLI_diskfree(char *dir)
if (statfs(name, &disk)) return(-1);
#endif
-#if defined (__sun__) || defined (__sun) || defined (__sgi)
+#if defined (__sun__) || defined (__sun) || defined (__sgi) || defined (__NetBSD__)
if (statvfs(name, &disk)) return(-1);
#elif !defined(__FreeBSD__) && !defined(linux) && (defined(__sparc) || defined(__sparc__))
/* WARNING - This may not be supported by geeneric unix os's - Campbell */
@@ -218,7 +216,7 @@ void BLI_builddir(char *dirname, char *relname)
{
struct dirent *fname;
struct dirlink *dlink;
- int rellen, newnum = 0, seen_ = 0, seen__ = 0;
+ int rellen, newnum = 0, len;
char buf[256];
DIR *dir;
@@ -237,22 +235,16 @@ void BLI_builddir(char *dirname, char *relname)
if ( (dir = (DIR *)opendir(".")) ){
while ((fname = (struct dirent*) readdir(dir)) != NULL) {
+ len= strlen(fname->d_name);
- if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0);
+ if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0); /* ignore .file */
+ else if(hide_dot && len && fname->d_name[len-1]=='~'); /* ignore file~ */
+ else if (((fname->d_name[0] == '.') && (fname->d_name[1] == 0) )); /* ignore . */
else {
-
dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
if (dlink){
strcpy(buf+rellen,fname->d_name);
-
dlink->name = BLI_strdup(buf);
-
- if (dlink->name[0] == '.') {
- if (dlink->name[1] == 0) seen_ = 1;
- else if (dlink->name[1] == '.') {
- if (dlink->name[2] == 0) seen__ = 1;
- }
- }
BLI_addhead(dirbase,dlink);
newnum++;
}
@@ -260,30 +252,6 @@ void BLI_builddir(char *dirname, char *relname)
}
if (newnum){
-#ifndef WIN32
- if (seen_ == 0) { /* Cachefs PATCH */
- dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
- strcpy(buf+rellen,"./.");
- dlink->name = BLI_strdup(buf);
- BLI_addhead(dirbase,dlink);
- newnum++;
- }
- if (seen__ == 0) { /* MAC PATCH */
- dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
- strcpy(buf+rellen,"./..");
- dlink->name = BLI_strdup(buf);
- BLI_addhead(dirbase,dlink);
- newnum++;
- }
-#else // WIN32
- if (seen_ == 0) { /* should only happen for root paths like "C:\" */
- dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
- strcpy(buf+rellen,".");
- dlink->name = BLI_strdup(buf);
- BLI_addhead(dirbase,dlink);
- newnum++;
- }
-#endif
if (files) files=(struct direntry *)realloc(files,(totnum+newnum) * sizeof(struct direntry));
else files=(struct direntry *)malloc(newnum * sizeof(struct direntry));
@@ -293,7 +261,13 @@ void BLI_builddir(char *dirname, char *relname)
while(dlink){
memset(&files[actnum], 0 , sizeof(struct direntry));
files[actnum].relname = dlink->name;
+// use 64 bit file size, only needed for WIN32 and WIN64.
+// Excluding other than current MSVC compiler until able to test.
+#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500)
+ _stat64(dlink->name,&files[actnum].s);
+#else
stat(dlink->name,&files[actnum].s);
+#endif
files[actnum].type=files[actnum].s.st_mode;
files[actnum].flags = 0;
totnum++;
@@ -389,7 +363,7 @@ void BLI_adddirstrings()
* will buy us some time until files get bigger than 4GB or until
* everyone starts using __USE_FILE_OFFSET64 or equivalent.
*/
- st_size= (off_t)files[num].s.st_size;
+ st_size= files[num].s.st_size;
if (st_size > 1024*1024*1024) {
sprintf(files[num].size, "%.2f GB", ((double)st_size)/(1024*1024*1024));
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 2812f17d58f..ce9f9adeb90 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -142,10 +142,10 @@ void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot)
tslot->do_thread= do_thread;
tslot->avail= 1;
}
+
+ MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
+ thread_levels++;
}
-
- MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
- thread_levels++;
}
/* amount of available threads */
@@ -235,18 +235,21 @@ void BLI_end_threads(ListBase *threadbase)
{
ThreadSlot *tslot;
- if (threadbase) {
+ /* only needed if there's actually some stuff to end
+ * this way we don't end up decrementing thread_levels on an empty threadbase
+ * */
+ if (threadbase && threadbase->first != NULL) {
for(tslot= threadbase->first; tslot; tslot= tslot->next) {
if(tslot->avail==0) {
pthread_join(tslot->pthread, NULL);
}
}
BLI_freelistN(threadbase);
+
+ thread_levels--;
+ if(thread_levels==0)
+ MEM_set_lock_callback(NULL, NULL);
}
-
- thread_levels--;
- if(thread_levels==0)
- MEM_set_lock_callback(NULL, NULL);
}
void BLI_lock_thread(int type)
@@ -313,7 +316,7 @@ typedef struct WorkParam {
int index;
} WorkParam;
-void *exec_work_fnct(void *v_param)
+static void *exec_work_fnct(void *v_param)
{
WorkParam *p = (WorkParam*)v_param;
void *value;
diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c
index 26f4c2dd415..b1539d22909 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -54,6 +54,8 @@
#include "BKE_utildefines.h"
+
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -75,11 +77,6 @@
#include "BLI_winstuff.h"
-/* for duplicate_defgroup */
-#if !(defined vsnprintf)
-#define vsnprintf _vsnprintf
-#endif
-
#endif
@@ -494,6 +491,21 @@ void BLI_makestringcode(const char *relfile, char *file)
}
}
+int BLI_has_parent(char *path)
+{
+ int len;
+ int slashes = 0;
+ BLI_clean(path);
+ len = BLI_add_slash(path) - 1;
+
+ while (len>=0) {
+ if ((path[len] == '\\') || (path[len] == '/'))
+ slashes++;
+ len--;
+ }
+ return slashes > 1;
+}
+
int BLI_parent_dir(char *path)
{
#ifdef WIN32
@@ -736,6 +748,25 @@ void BLI_splitdirstring(char *di, char *fi)
}
}
+void BLI_getlastdir(const char* dir, char *last, int maxlen)
+{
+ const char *s = dir;
+ const char *lslash = NULL;
+ const char *prevslash = NULL;
+ while (*s) {
+ if ((*s == '\\') || (*s == '/')) {
+ prevslash = lslash;
+ lslash = s;
+ }
+ s++;
+ }
+ if (prevslash) {
+ BLI_strncpy(last, prevslash+1, maxlen);
+ } else {
+ BLI_strncpy(last, dir, maxlen);
+ }
+}
+
char *BLI_gethome(void) {
#if !defined(WIN32)
return getenv("HOME");
@@ -825,98 +856,141 @@ char *BLI_gethome(void) {
#endif
}
-/* this function returns the path to a blender folder, if it exists,
- * trying in this order:
- *
- * path_to_executable/release/folder_name (in svn)
- * ./release/folder_name (in svn)
- * $HOME/.blender/folder_name
- * path_to_executable/.blender/folder_name
- *
- * returns NULL if none is found. */
+/* this function returns the path to a blender folder, if it exists
+ * utility functions for BLI_gethome_folder */
+
+/* #define PATH_DEBUG */ /* for testing paths that are checked */
+
+static int test_data_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
+{
+ char tmppath[FILE_MAXDIR];
+
+ if(path_sep) BLI_join_dirfile(tmppath, path_base, path_sep);
+ else BLI_strncpy(tmppath, path_base, sizeof(tmppath));
+
+ BLI_make_file_string("/", targetpath, tmppath, folder_name);
+
+ if (BLI_exists(targetpath)) {
+#ifdef PATH_DEBUG
+ printf("\tpath found: %s\n", targetpath);
+#endif
+ return 1;
+ }
+ else {
+#ifdef PATH_DEBUG
+ printf("\tpath missing: %s\n", targetpath);
+#endif
+ targetpath[0] = '\0';
+ return 0;
+ }
+}
-char *BLI_gethome_folder(char *folder_name)
+static int gethome_path_local(char *targetpath, char *folder_name)
{
extern char bprogname[]; /* argv[0] from creator.c */
- static char homedir[FILE_MAXDIR] = "";
- static char fulldir[FILE_MAXDIR] = "";
- char tmpdir[FILE_MAXDIR];
char bprogdir[FILE_MAXDIR];
+ char cwd[FILE_MAXDIR];
char *s;
int i;
-
+
+#ifdef PATH_DEBUG
+ printf("gethome_path_local...\n");
+#endif
+
+ /* try release/folder_name (binary relative) */
/* 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 ./.blender/folder_name */
+ if(test_data_path(targetpath, bprogdir, ".blender", folder_name))
+ return 1;
+
+ if(test_data_path(targetpath, bprogdir, "release", folder_name))
+ return 1;
+
+ /* try release/folder_name (CWD relative) */
+ if(test_data_path(targetpath, BLI_getwdN(cwd), "release", folder_name))
+ return 1;
+
+ return 0;
+}
- /* try path_to_executable/release/folder_name (in svn) */
- if (folder_name) {
- BLI_snprintf(tmpdir, sizeof(tmpdir), "release/%s", folder_name);
- BLI_make_file_string("/", fulldir, bprogdir, tmpdir);
- if (BLI_exists(fulldir)) return fulldir;
- else fulldir[0] = '\0';
- }
+static int gethome_path_user(char *targetpath, char *folder_name)
+{
+ char *home_path= BLI_gethome();
- /* try ./release/folder_name (in svn) */
- if(folder_name) {
- BLI_snprintf(fulldir, sizeof(fulldir), "./release/%s", folder_name);
- if (BLI_exists(fulldir)) return fulldir;
- else fulldir[0] = '\0';
- }
+#ifdef PATH_DEBUG
+ printf("gethome_path_user...\n");
+#endif
+
+ /* try $HOME/folder_name */
+ return test_data_path(targetpath, home_path, ".blender", folder_name);
+}
- /* BLI_gethome() can return NULL if env vars are not set */
- s = BLI_gethome();
+static int gethome_path_system(char *targetpath, char *folder_name)
+{
+ extern char blender_path[]; /* unix prefix eg. /usr/share/blender/2.5 creator.c */
+
+ if(!blender_path[0])
+ return 0;
+
+#ifdef PATH_DEBUG
+ printf("gethome_path_system...\n");
+#endif
+
+ /* try $BLENDERPATH/folder_name */
+ return test_data_path(targetpath, blender_path, NULL, folder_name);
+}
- if(!s) { /* bail if no $HOME */
- printf("$HOME is NOT set\n");
- return NULL;
+char *BLI_gethome_folder(char *folder_name, int flag)
+{
+ static char fulldir[FILE_MAXDIR] = "";
+
+ /* first check if this is a redistributable bundle */
+ if(flag & BLI_GETHOME_LOCAL) {
+ if (gethome_path_local(fulldir, folder_name))
+ return fulldir;
}
- if(strstr(s, ".blender"))
- BLI_strncpy(homedir, s, FILE_MAXDIR);
- else
- BLI_make_file_string("/", homedir, s, ".blender");
-
- /* if $HOME/.blender/folder_name exists, return it */
- if(BLI_exists(homedir)) {
- if (folder_name) {
- BLI_make_file_string("/", fulldir, homedir, folder_name);
- if(BLI_exists(fulldir))
- return fulldir;
- }
- else
- return homedir;
- }
- else
- homedir[0] = '\0';
-
- /* using tmpdir to preserve homedir (if) found above:
- * the ideal is to have a home dir with folder_name dir inside
- * it, but if that isn't available, it's possible to
- * have a 'broken' home dir somewhere and a folder_name dir in the
- * svn sources */
- BLI_make_file_string("/", tmpdir, bprogdir, ".blender");
-
- if(BLI_exists(tmpdir)) {
- if(folder_name) {
- BLI_make_file_string("/", fulldir, tmpdir, folder_name);
- if(BLI_exists(fulldir)) {
- BLI_strncpy(homedir, tmpdir, FILE_MAXDIR);
- return fulldir;
- }
- else {
- homedir[0] = '\0';
- fulldir[0] = '\0';
- }
- }
- else return homedir;
+ /* then check if the OS has blender data files installed in a global location */
+ if(flag & BLI_GETHOME_SYSTEM) {
+ if (gethome_path_system(fulldir, folder_name))
+ return fulldir;
}
-
+
+ /* now check the users home dir for data files */
+ if(flag & BLI_GETHOME_USER) {
+ if (gethome_path_user(fulldir, folder_name))
+ return fulldir;
+ }
+
return NULL;
}
+#ifdef PATH_DEBUG
+#undef PATH_DEBUG
+#endif
+
+void BLI_setenv(const char *env, const char*val)
+{
+ /* SGI or free windows */
+#if (defined(__sgi) || ((defined(WIN32) || defined(WIN64)) && defined(FREE_WINDOWS)))
+ char *envstr= malloc(sizeof(char) * (strlen(env) + strlen(val) + 2)); /* one for = another for \0 */
+
+ sprintf(envstr, "%s=%s", env, val);
+ putenv(envstr);
+ free(envstr);
+
+ /* non-free windows */
+#elif (defined(WIN32) || defined(WIN64)) /* not free windows */
+ _putenv_s(env, val);
+#else
+ /* linux/osx/bsd */
+ setenv(env, val, 1);
+#endif
+}
void BLI_clean(char *path)
{
@@ -1241,22 +1315,12 @@ void BLI_split_dirfile(char *string, char *dir, char *file)
/* simple appending of filename to dir, does not check for valid path! */
void BLI_join_dirfile(char *string, const char *dir, const char *file)
{
- int sl_dir = strlen(dir);
- BLI_strncpy(string, dir, FILE_MAX);
- if (sl_dir > FILE_MAX-1) sl_dir = FILE_MAX-1;
+ int sl_dir;
- /* only add seperator if needed */
-#ifdef WIN32
- if (string[sl_dir-1] != '\\') {
- string[sl_dir] = '\\';
- sl_dir++;
- }
-#else
- if (string[sl_dir-1] != '/') {
- string[sl_dir] = '/';
- sl_dir++;
- }
-#endif
+ if(string != dir) /* compare pointers */
+ BLI_strncpy(string, dir, FILE_MAX);
+
+ sl_dir= BLI_add_slash(string);
if (sl_dir <FILE_MAX) {
BLI_strncpy(string + sl_dir, file, FILE_MAX-sl_dir);
@@ -1308,13 +1372,13 @@ void BLI_where_am_i(char *fullname, const char *name)
{
char filename[FILE_MAXDIR+FILE_MAXFILE];
char *path = NULL, *temp;
- int len;
+
#ifdef _WIN32
char *seperator = ";";
- char *slash = "\\";
+ char slash = '\\';
#else
char *seperator = ":";
- char *slash = "/";
+ char slash = '/';
#endif
@@ -1334,11 +1398,13 @@ void BLI_where_am_i(char *fullname, const char *name)
if (name[0] == '.') {
// relative path, prepend cwd
BLI_getwdN(fullname);
- len = strlen(fullname);
- if (len && fullname[len -1] != slash[0]) {
- strcat(fullname, slash);
- }
- strcat(fullname, name);
+
+ // not needed but avoids annoying /./ in name
+ if(name && name[0]=='.' && name[1]==slash)
+ BLI_join_dirfile(fullname, fullname, name+2);
+ else
+ BLI_join_dirfile(fullname, fullname, name);
+
add_win32_extension(fullname);
} else if (BLI_last_slash(name)) {
// full path
@@ -1357,11 +1423,7 @@ void BLI_where_am_i(char *fullname, const char *name)
} else {
strncpy(filename, path, sizeof(filename));
}
- len = strlen(filename);
- if (len && filename[len - 1] != slash[0]) {
- strcat(filename, slash);
- }
- strcat(filename, name);
+ BLI_join_dirfile(fullname, fullname, name);
if (add_win32_extension(filename)) {
strcpy(fullname, filename);
break;
diff --git a/source/blender/blenlib/intern/vectorops.c b/source/blender/blenlib/intern/vectorops.c
deleted file mode 100644
index 3bff5235cfd..00000000000
--- a/source/blender/blenlib/intern/vectorops.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *
- * Some vector operations.
- *
- * Always use
- * - vector with x components : float x[3], int x[3], etc
- *
- * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
- */
-
-/* ------------------------------------------------------------------------- */
-/* General format: op(a, b, c): a = b op c */
-/* Copying is done cp <from, to> */
-/* ------------------------------------------------------------------------- */
-
-#include "MTC_vectorops.h"
-#include <math.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-void MTC_diff3Int(int v1[3], int v2[3], int v3[3])
-{
- v1[0] = v2[0] - v3[0];
- v1[1] = v2[1] - v3[1];
- v1[2] = v2[2] - v3[2];
-}
-
-/* ------------------------------------------------------------------------- */
-void MTC_diff3Float(float v1[3], float v2[3], float v3[3])
-{
- v1[0] = v2[0] - v3[0];
- v1[1] = v2[1] - v3[1];
- v1[2] = v2[2] - v3[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_cross3Int(int v1[3], int v2[3], int v3[3])
-{
- v1[0] = v2[1]*v3[2] - v2[2]*v3[1];
- v1[1] = v2[2]*v3[0] - v2[0]*v3[2];
- v1[2] = v2[0]*v3[1] - v2[1]*v3[0];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_cross3Float(float v1[3], float v2[3], float v3[3])
-{
- v1[0] = v2[1]*v3[2] - v2[2]*v3[1];
- v1[1] = v2[2]*v3[0] - v2[0]*v3[2];
- v1[2] = v2[0]*v3[1] - v2[1]*v3[0];
-}
-/* ------------------------------------------------------------------------- */
-
-void MTC_cross3Double(double v1[3], double v2[3], double v3[3])
-{
- v1[0] = v2[1]*v3[2] - v2[2]*v3[1];
- v1[1] = v2[2]*v3[0] - v2[0]*v3[2];
- v1[2] = v2[0]*v3[1] - v2[1]*v3[0];
-}
-
-/* ------------------------------------------------------------------------- */
-
-int MTC_dot3Int(int v1[3], int v2[3])
-{
- return (v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]);
-}
-
-/* ------------------------------------------------------------------------- */
-
-float MTC_dot3Float(float v1[3], float v2[3])
-{
- return (v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]);
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_cp3Float(float v1[3], float v2[3])
-{
- v2[0] = v1[0];
- v2[1] = v1[1];
- v2[2] = v1[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_cp3FloatInv(float v1[3], float v2[3])
-{
- v2[0] = -v1[0];
- v2[1] = -v1[1];
- v2[2] = -v1[2];
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_swapInt(int *i1, int *i2)
-{
- int swap;
- swap = *i1;
- *i1 = *i2;
- *i2 = swap;
-}
-
-/* ------------------------------------------------------------------------- */
-
-void MTC_diff3DFF(double v1[3], float v2[3], float v3[3])
-{
- v1[0] = v2[0] - v3[0];
- v1[1] = v2[1] - v3[1];
- v1[2] = v2[2] - v3[2];
-}
-
-/* ------------------------------------------------------------------------- */
-float MTC_normalize3DF(float n[3])
-{
- float d;
-
- d= n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
- /* FLT_EPSILON is too large! A larger value causes normalize errors in */
- /* a scaled down utah teapot */
- if(d>0.0000000000001) {
-
- /* d= sqrt(d); This _should_ be sqrt, but internally it's a double*/
- /* anyway. This is safe. */
- d = sqrt(d);
-
- n[0]/=d;
- n[1]/=d;
- n[2]/=d;
- } else {
- n[0]=n[1]=n[2]= 0.0;
- d= 0.0;
- }
- return d;
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* eof */
diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c
new file mode 100644
index 00000000000..7dad854af3a
--- /dev/null
+++ b/source/blender/blenlib/intern/voxel.c
@@ -0,0 +1,198 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb, Raul Fernandez Hernandez (Farsthary).
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include <math.h>
+
+#include "BLI_voxel.h"
+
+#include "BKE_utildefines.h"
+
+
+#if defined( _MSC_VER ) && !defined( __cplusplus )
+# define inline __inline
+#endif // defined( _MSC_VER ) && !defined( __cplusplus )
+
+static inline float D(float *data, int *res, int x, int y, int z)
+{
+ CLAMP(x, 0, res[0]-1);
+ CLAMP(y, 0, res[1]-1);
+ CLAMP(z, 0, res[2]-1);
+ return data[ V_I(x, y, z, res) ];
+}
+
+/* *** nearest neighbour *** */
+/* input coordinates must be in bounding box 0.0 - 1.0 */
+float voxel_sample_nearest(float *data, int *res, float *co)
+{
+ int xi, yi, zi;
+
+ xi = co[0] * res[0];
+ yi = co[1] * res[1];
+ zi = co[2] * res[2];
+
+ return D(data, res, xi, yi, zi);
+}
+
+// returns highest integer <= x as integer (slightly faster than floor())
+inline int FLOORI(float x)
+{
+ const int r = (int)x;
+ return ((x >= 0.f) || (float)r == x) ? r : (r - 1);
+}
+
+// clamp function, cannot use the CLAMPIS macro, it sometimes returns unwanted results apparently related to gcc optimization flag -fstrict-overflow which is enabled at -O2
+// this causes the test (x + 2) < 0 with int x == 2147483647 to return false (x being an integer, x + 2 should wrap around to -2147483647 so the test < 0 should return true, which it doesn't)
+inline int _clamp(int a, int b, int c)
+{
+ return (a < b) ? b : ((a > c) ? c : a);
+}
+
+float voxel_sample_trilinear(float *data, int *res, float *co)
+{
+ if (data) {
+
+ const float xf = co[0] * res[0] - 0.5f;
+ const float yf = co[1] * res[1] - 0.5f;
+ const float zf = co[2] * res[2] - 0.5f;
+
+ const int x = FLOORI(xf), y = FLOORI(yf), z = FLOORI(zf);
+
+ const int xc[2] = {_clamp(x, 0, res[0] - 1), _clamp(x + 1, 0, res[0] - 1)};
+ const int yc[2] = {res[0] * _clamp(y, 0, res[1] - 1), res[0] * _clamp(y + 1, 0, res[1] - 1)};
+ const int zc[2] = {res[0] * res[1] * _clamp(z, 0, res[2] - 1), res[0] * res[1] * _clamp(z + 1, 0, res[2] - 1)};
+
+ const float dx = xf - (float)x;
+ const float dy = yf - (float)y;
+ const float dz = zf - (float)z;
+
+ const float u[2] = {1.f - dx, dx};
+ const float v[2] = {1.f - dy, dy};
+ const float w[2] = {1.f - dz, dz};
+
+ return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] ) )
+ + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] ) );
+
+ }
+ return 0.f;
+}
+
+
+float voxel_sample_triquadratic(float *data, int *res, float *co)
+{
+ if (data) {
+
+ const float xf = co[0] * res[0], yf = co[1] * res[1], zf = co[2] * res[2];
+ const int x = FLOORI(xf), y = FLOORI(yf), z = FLOORI(zf);
+
+ const int xc[3] = {_clamp(x - 1, 0, res[0] - 1), _clamp(x, 0, res[0] - 1), _clamp(x + 1, 0, res[0] - 1)};
+ const int yc[3] = {res[0] * _clamp(y - 1, 0, res[1] - 1), res[0] * _clamp(y, 0, res[1] - 1), res[0] * _clamp(y + 1, 0, res[1] - 1)};
+ const int zc[3] = {res[0] * res[1] * _clamp(z - 1, 0, res[2] - 1), res[0] * res[1] * _clamp(z, 0, res[2] - 1), res[0] * res[1] * _clamp(z + 1, 0, res[2] - 1)};
+
+ const float dx = xf - (float)x, dy = yf - (float)y, dz = zf - (float)z;
+ const float u[3] = {dx*(0.5f*dx - 1.f) + 0.5f, dx*(1.f - dx) + 0.5f, 0.5f*dx*dx};
+ const float v[3] = {dy*(0.5f*dy - 1.f) + 0.5f, dy*(1.f - dy) + 0.5f, 0.5f*dy*dy};
+ const float w[3] = {dz*(0.5f*dz - 1.f) + 0.5f, dz*(1.f - dz) + 0.5f, 0.5f*dz*dz};
+
+ return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] + u[2] * data[xc[2] + yc[0] + zc[0]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] ) )
+ + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] ) )
+ + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] ) );
+
+}
+ return 0.f;
+}
+
+float voxel_sample_tricubic(float *data, int *res, float *co, int bspline)
+{
+ if (data) {
+
+ const float xf = co[0] * res[0] - 0.5f, yf = co[1] * res[1] - 0.5f, zf = co[2] * res[2] - 0.5f;
+ const int x = FLOORI(xf), y = FLOORI(yf), z = FLOORI(zf);
+
+ const int xc[4] = {_clamp(x - 1, 0, res[0] - 1), _clamp(x, 0, res[0] - 1), _clamp(x + 1, 0, res[0] - 1), _clamp(x + 2, 0, res[0] - 1)};
+ const int yc[4] = {res[0] * _clamp(y - 1, 0, res[1] - 1), res[0] * _clamp(y, 0, res[1] - 1), res[0] * _clamp(y + 1, 0, res[1] - 1), res[0] * _clamp(y + 2, 0, res[1] - 1)};
+ const int zc[4] = {res[0] * res[1] * _clamp(z - 1, 0, res[2] - 1), res[0] * res[1] * _clamp(z, 0, res[2] - 1), res[0] * res[1] * _clamp(z + 1, 0, res[2] - 1), res[0] * res[1] * _clamp(z + 2, 0, res[2] - 1)};
+
+ const float dx = xf - (float)x, dy = yf - (float)y, dz = zf - (float)z;
+
+ float u[4], v[4], w[4];
+ if (bspline) { // B-Spline
+ u[0] = (((-1.f/6.f)*dx + 0.5f)*dx - 0.5f)*dx + (1.f/6.f);
+ u[1] = (( 0.5f*dx - 1.f )*dx )*dx + (2.f/3.f);
+ u[2] = (( -0.5f*dx + 0.5f)*dx + 0.5f)*dx + (1.f/6.f);
+ u[3] = ( 1.f/6.f)*dx*dx*dx;
+ v[0] = (((-1.f/6.f)*dy + 0.5f)*dy - 0.5f)*dy + (1.f/6.f);
+ v[1] = (( 0.5f*dy - 1.f )*dy )*dy + (2.f/3.f);
+ v[2] = (( -0.5f*dy + 0.5f)*dy + 0.5f)*dy + (1.f/6.f);
+ v[3] = ( 1.f/6.f)*dy*dy*dy;
+ w[0] = (((-1.f/6.f)*dz + 0.5f)*dz - 0.5f)*dz + (1.f/6.f);
+ w[1] = (( 0.5f*dz - 1.f )*dz )*dz + (2.f/3.f);
+ w[2] = (( -0.5f*dz + 0.5f)*dz + 0.5f)*dz + (1.f/6.f);
+ w[3] = ( 1.f/6.f)*dz*dz*dz;
+ }
+ else { // Catmull-Rom
+ u[0] = ((-0.5f*dx + 1.0f)*dx - 0.5f)*dx;
+ u[1] = (( 1.5f*dx - 2.5f)*dx )*dx + 1.0f;
+ u[2] = ((-1.5f*dx + 2.0f)*dx + 0.5f)*dx;
+ u[3] = (( 0.5f*dx - 0.5f)*dx )*dx;
+ v[0] = ((-0.5f*dy + 1.0f)*dy - 0.5f)*dy;
+ v[1] = (( 1.5f*dy - 2.5f)*dy )*dy + 1.0f;
+ v[2] = ((-1.5f*dy + 2.0f)*dy + 0.5f)*dy;
+ v[3] = (( 0.5f*dy - 0.5f)*dy )*dy;
+ w[0] = ((-0.5f*dz + 1.0f)*dz - 0.5f)*dz;
+ w[1] = (( 1.5f*dz - 2.5f)*dz )*dz + 1.0f;
+ w[2] = ((-1.5f*dz + 2.0f)*dz + 0.5f)*dz;
+ w[3] = (( 0.5f*dz - 0.5f)*dz )*dz;
+ }
+
+ return w[0] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[0]] + u[1] * data[xc[1] + yc[0] + zc[0]] + u[2] * data[xc[2] + yc[0] + zc[0]] + u[3] * data[xc[3] + yc[0] + zc[0]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[0]] + u[1] * data[xc[1] + yc[1] + zc[0]] + u[2] * data[xc[2] + yc[1] + zc[0]] + u[3] * data[xc[3] + yc[1] + zc[0]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[0]] + u[1] * data[xc[1] + yc[2] + zc[0]] + u[2] * data[xc[2] + yc[2] + zc[0]] + u[3] * data[xc[3] + yc[2] + zc[0]] )
+ + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[0]] + u[1] * data[xc[1] + yc[3] + zc[0]] + u[2] * data[xc[2] + yc[3] + zc[0]] + u[3] * data[xc[3] + yc[3] + zc[0]] ) )
+ + w[1] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[1]] + u[1] * data[xc[1] + yc[0] + zc[1]] + u[2] * data[xc[2] + yc[0] + zc[1]] + u[3] * data[xc[3] + yc[0] + zc[1]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[1]] + u[1] * data[xc[1] + yc[1] + zc[1]] + u[2] * data[xc[2] + yc[1] + zc[1]] + u[3] * data[xc[3] + yc[1] + zc[1]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[1]] + u[1] * data[xc[1] + yc[2] + zc[1]] + u[2] * data[xc[2] + yc[2] + zc[1]] + u[3] * data[xc[3] + yc[2] + zc[1]] )
+ + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[1]] + u[1] * data[xc[1] + yc[3] + zc[1]] + u[2] * data[xc[2] + yc[3] + zc[1]] + u[3] * data[xc[3] + yc[3] + zc[1]] ) )
+ + w[2] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[2]] + u[1] * data[xc[1] + yc[0] + zc[2]] + u[2] * data[xc[2] + yc[0] + zc[2]] + u[3] * data[xc[3] + yc[0] + zc[2]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[2]] + u[1] * data[xc[1] + yc[1] + zc[2]] + u[2] * data[xc[2] + yc[1] + zc[2]] + u[3] * data[xc[3] + yc[1] + zc[2]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[2]] + u[1] * data[xc[1] + yc[2] + zc[2]] + u[2] * data[xc[2] + yc[2] + zc[2]] + u[3] * data[xc[3] + yc[2] + zc[2]] )
+ + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[2]] + u[1] * data[xc[1] + yc[3] + zc[2]] + u[2] * data[xc[2] + yc[3] + zc[2]] + u[3] * data[xc[3] + yc[3] + zc[2]] ) )
+ + w[3] * ( v[0] * ( u[0] * data[xc[0] + yc[0] + zc[3]] + u[1] * data[xc[1] + yc[0] + zc[3]] + u[2] * data[xc[2] + yc[0] + zc[3]] + u[3] * data[xc[3] + yc[0] + zc[3]] )
+ + v[1] * ( u[0] * data[xc[0] + yc[1] + zc[3]] + u[1] * data[xc[1] + yc[1] + zc[3]] + u[2] * data[xc[2] + yc[1] + zc[3]] + u[3] * data[xc[3] + yc[1] + zc[3]] )
+ + v[2] * ( u[0] * data[xc[0] + yc[2] + zc[3]] + u[1] * data[xc[1] + yc[2] + zc[3]] + u[2] * data[xc[2] + yc[2] + zc[3]] + u[3] * data[xc[3] + yc[2] + zc[3]] )
+ + v[3] * ( u[0] * data[xc[0] + yc[3] + zc[3]] + u[1] * data[xc[1] + yc[3] + zc[3]] + u[2] * data[xc[2] + yc[3] + zc[3]] + u[3] * data[xc[3] + yc[3] + zc[3]] ) );
+
+ }
+ return 0.f;
+}
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 4fafac29a6f..6e2772efea4 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -36,7 +36,6 @@ extern "C" {
struct bScreen;
struct direntry;
-struct FileList;
struct LinkNode;
struct Main;
struct MemFile;
@@ -45,6 +44,7 @@ struct Scene;
struct SpaceFile;
struct SpaceImaSel;
struct UserDef;
+struct bContext;
typedef struct BlendHandle BlendHandle;
@@ -197,12 +197,23 @@ BLO_blendhandle_close(
/***/
-char *BLO_gethome(void);
+#define GROUP_MAX 32
+
int BLO_has_bfile_extension(char *str);
-void BLO_library_append(BlendHandle **libfiledata, struct direntry* filelist, int totfile,
- char *dir, char* file, short flag, int idcode, struct Main *mainvar, struct Scene *scene, struct ReportList *reports);
+/* return ok when a blenderfile, in dir is the filename,
+ * in group the type of libdata
+ */
+int BLO_is_a_library(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_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag);
+
+/* deprecated */
+#if 0
void BLO_script_library_append(BlendHandle **bh, char *dir, char *name, int idcode, short flag, struct Main *mainvar, struct Scene *scene, struct ReportList *reports);
+#endif
BlendFileData* blo_read_blendafterruntime(int file, char *name, int actualsize, struct ReportList *reports);
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index 49155260b31..4032f778f4b 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -78,7 +78,7 @@ typedef unsigned long uintptr_t;
#define _UINTPTR_T_DEFINED
#endif
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__NetBSD__)
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 1b9c5647702..d31a85ab208 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -27,11 +27,11 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../../../intern/guardedalloc ../blenlib ../blenkernel
- ../makesdna ../readblenfile ../include
- ../python ../../kernel/gen_messaging
- ../render/extern/include
- ${ZLIB_INC}
+ . ../../../intern/guardedalloc ../blenlib ../blenkernel
+ ../makesdna ../readblenfile ../include ../makesrna
+ ../python ../../kernel/gen_messaging
+ ../render/extern/include
+ ${ZLIB_INC}
)
BLENDERLIB(bf_blenloader "${SRC}" "${INC}")
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index 1aeb6bd9b83..88d345290e5 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -5,10 +5,10 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc ../blenlib ../blenkernel'
incs += ' ../makesdna ../readblenfile ../editors/include'
-incs += ' ../render/extern/include'
+incs += ' ../render/extern/include ../makesrna'
incs += ' ' + env['BF_ZLIB_INC']
defs = []
-env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [135, 30] )
+env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [167,30] )
diff --git a/source/blender/blenloader/intern/Makefile b/source/blender/blenloader/intern/Makefile
index 7382dd655b2..f4690fcc066 100644
--- a/source/blender/blenloader/intern/Makefile
+++ b/source/blender/blenloader/intern/Makefile
@@ -54,6 +54,7 @@ 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
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index 1f276913ea8..3d21bb54e2b 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -67,6 +67,10 @@
#include "BLO_sys_types.h" // needed for intptr_t
+#ifdef _WIN32
+#include "BLI_winstuff.h"
+#endif
+
/**
* IDType stuff, I plan to move this
* out into its own file + prefix, and
@@ -95,7 +99,6 @@ static IDType idtypes[]= {
{ ID_IP, "Ipo", IDTYPE_FLAGS_ISLINKABLE},
{ ID_KE, "Key", 0},
{ ID_LA, "Lamp", IDTYPE_FLAGS_ISLINKABLE},
- { ID_LF, "Life", 0},
{ ID_LI, "Library", 0},
{ ID_LT, "Lattice", IDTYPE_FLAGS_ISLINKABLE},
{ ID_MA, "Material", IDTYPE_FLAGS_ISLINKABLE},
@@ -106,7 +109,6 @@ static IDType idtypes[]= {
{ ID_SCE, "Scene", IDTYPE_FLAGS_ISLINKABLE},
{ ID_SCR, "Screen", 0},
{ ID_SEQ, "Sequence", 0},
- { ID_SE, "Sector", 0},
{ ID_SO, "Sound", IDTYPE_FLAGS_ISLINKABLE},
{ ID_TE, "Texture", IDTYPE_FLAGS_ISLINKABLE},
{ ID_TXT, "Text", IDTYPE_FLAGS_ISLINKABLE},
@@ -200,7 +202,7 @@ void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
buf[2]= buf[2]?buf[2]:' ';
buf[3]= buf[3]?buf[3]:' ';
- fprintf(fp, "['%.4s', '%s', %d, %ld ], \n", buf, name, bhead->nr, (intptr_t)bhead->len+sizeof(BHead));
+ fprintf(fp, "['%.4s', '%s', %d, %ld ], \n", buf, name, bhead->nr, (long int)bhead->len+sizeof(BHead));
}
}
fprintf(fp, "]\n");
@@ -331,11 +333,7 @@ BlendFileData *BLO_read_from_file(char *file, ReportList *reports)
fd = blo_openblenderfile(file, reports);
if (fd) {
fd->reports= reports;
- bfd= blo_read_file_internal(fd);
- if (bfd) {
- bfd->type= BLENFILETYPE_BLEND;
- strncpy(bfd->main->name, file, sizeof(bfd->main->name)-1);
- }
+ bfd= blo_read_file_internal(fd, file);
blo_freefiledata(fd);
}
@@ -350,11 +348,7 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, ReportList *reports)
fd = blo_openblendermemory(mem, memsize, reports);
if (fd) {
fd->reports= reports;
- bfd= blo_read_file_internal(fd);
- if (bfd) {
- bfd->type= BLENFILETYPE_BLEND;
- strcpy(bfd->main->name, "");
- }
+ bfd= blo_read_file_internal(fd, "");
blo_freefiledata(fd);
}
@@ -383,11 +377,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
/* makes lookup of existing images in old main */
blo_make_image_pointer_map(fd, oldmain);
- bfd= blo_read_file_internal(fd);
- if (bfd) {
- bfd->type= BLENFILETYPE_BLEND;
- strcpy(bfd->main->name, "");
- }
+ bfd= blo_read_file_internal(fd, "");
/* ensures relinked images are not freed */
blo_end_image_pointer_map(fd, oldmain);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 7921740cbe8..204176f64c3 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -29,11 +29,6 @@
#include "zlib.h"
-#ifdef WIN32
-#include "winsock2.h"
-#include "BLI_winstuff.h"
-#endif
-
#include <limits.h>
#include <stdio.h> // for printf fopen fwrite fclose sprintf FILE
#include <stdlib.h> // for getenv atoi
@@ -46,6 +41,8 @@
#include <sys/param.h> // for MAXPATHLEN
#else
#include <io.h> // for open close read
+#include "winsock2.h"
+#include "BLI_winstuff.h"
#endif
#include "DNA_anim_types.h"
@@ -53,6 +50,7 @@
#include "DNA_armature_types.h"
#include "DNA_ID.h"
#include "DNA_actuator_types.h"
+#include "DNA_boid_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
#include "DNA_cloth_types.h"
@@ -93,6 +91,7 @@
#include "DNA_sdna_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
+#include "DNA_smoke_types.h"
#include "DNA_sound_types.h"
#include "DNA_space_types.h"
#include "DNA_texture_types.h"
@@ -114,6 +113,7 @@
#include "BKE_cloth.h"
#include "BKE_colortools.h"
#include "BKE_constraint.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_deform.h"
@@ -124,7 +124,6 @@
#include "BKE_group.h"
#include "BKE_image.h"
#include "BKE_ipo.h"
-#include "BKE_key.h" //void set_four_ipo
#include "BKE_lattice.h"
#include "BKE_library.h" // for wich_libbase
#include "BKE_main.h" // for Main
@@ -133,6 +132,7 @@
#include "BKE_multires.h"
#include "BKE_node.h" // for tree type defines
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_property.h" // for get_ob_property
@@ -141,12 +141,13 @@
#include "BKE_scene.h"
#include "BKE_softbody.h" // sbNew()
#include "BKE_bullet.h" // bsbNew()
-#include "BKE_sculpt.h"
#include "BKE_sequence.h"
#include "BKE_texture.h" // for open_plugin_tex
#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BKE_idprop.h"
+#include "BKE_sound.h"
+
//XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
//XXX #include "BIF_filelist.h" // badlevel too, where to move this? - elubie
//XXX #include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo
@@ -1065,6 +1066,46 @@ int BLO_has_bfile_extension(char *str)
return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend")||BLI_testextensie(str, ".blend.gz"));
}
+int BLO_is_a_library(char *path, char *dir, char *group)
+{
+ /* return ok when a blenderfile, in dir is the filename,
+ * in group the type of libdata
+ */
+ int len;
+ char *fd;
+
+ strcpy(dir, path);
+ len= strlen(dir);
+ if(len<7) return 0;
+ if( dir[len-1] != '/' && dir[len-1] != '\\') return 0;
+
+ group[0]= 0;
+ dir[len-1]= 0;
+
+ /* Find the last slash */
+ fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
+
+ if(fd==0) return 0;
+ *fd= 0;
+ if(BLO_has_bfile_extension(fd+1)) {
+ /* the last part of the dir is a .blend file, no group follows */
+ *fd= '/'; /* put back the removed slash separating the dir and the .blend file name */
+ }
+ else {
+ char *gp = fd+1; // in case we have a .blend file, gp points to the group
+
+ /* Find the last slash */
+ fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
+ if (!fd || !BLO_has_bfile_extension(fd+1)) return 0;
+
+ /* now we know that we are in a blend file and it is safe to
+ assume that gp actually points to a group */
+ if (BLI_streq("Screen", gp)==0)
+ BLI_strncpy(group, gp, GROUP_MAX);
+ }
+ return 1;
+}
+
/* ************** OLD POINTERS ******************* */
static void *newdataadr(FileData *fd, void *adr) /* only direct databocks */
@@ -1362,20 +1403,17 @@ void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData *fd)
{
- IDProperty **array;
+ IDProperty *array;
int i;
/*since we didn't save the extra buffer, set totallen to len.*/
prop->totallen = prop->len;
prop->data.pointer = newdataadr(fd, prop->data.pointer);
- if (switch_endian) {
- test_pointer_array(fd, prop->data.pointer);
- array= (IDProperty**) prop->data.pointer;
+ array= (IDProperty*) prop->data.pointer;
- for(i=0; i<prop->len; i++)
- IDP_DirectLinkProperty(array[i], switch_endian, fd);
- }
+ for(i=0; i<prop->len; i++)
+ IDP_DirectLinkProperty(&array[i], switch_endian, fd);
}
static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *fd)
@@ -1387,19 +1425,22 @@ static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *f
prop->totallen = prop->len;
prop->data.pointer = newdataadr(fd, prop->data.pointer);
- if (switch_endian) {
- if(prop->subtype == IDP_GROUP) {
- test_pointer_array(fd, prop->data.pointer);
- array= prop->data.pointer;
+ if(prop->subtype == IDP_GROUP) {
+ test_pointer_array(fd, prop->data.pointer);
+ array= prop->data.pointer;
- for(i=0; i<prop->len; i++)
- IDP_DirectLinkProperty(array[i], switch_endian, fd);
- }
- else if(prop->subtype == IDP_DOUBLE) {
+ for(i=0; i<prop->len; i++)
+ IDP_DirectLinkProperty(array[i], switch_endian, fd);
+ }
+ else if(prop->subtype == IDP_DOUBLE) {
+ if (switch_endian) {
for (i=0; i<prop->len; i++) {
SWITCH_LONGINT(((double*)prop->data.pointer)[i]);
}
- } else {
+ }
+ }
+ else {
+ if (switch_endian) {
for (i=0; i<prop->len; i++) {
SWITCH_INT(((int*)prop->data.pointer)[i]);
}
@@ -1564,33 +1605,6 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p
return prv;
}
-/* ************ READ SCRIPTLINK *************** */
-
-static void lib_link_scriptlink(FileData *fd, ID *id, ScriptLink *slink)
-{
- int i;
-
- for(i=0; i<slink->totscript; i++) {
- slink->scripts[i]= newlibadr(fd, id->lib, slink->scripts[i]);
- }
-}
-
-static void direct_link_scriptlink(FileData *fd, ScriptLink *slink)
-{
- slink->scripts= newdataadr(fd, slink->scripts);
- test_pointer_array(fd, (void **)&slink->scripts);
-
- slink->flag= newdataadr(fd, slink->flag);
-
- if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
- int a;
-
- for(a=0; a<slink->totscript; a++) {
- SWITCH_SHORT(slink->flag[a]);
- }
- }
-}
-
/* ************ READ ANIMATION STUFF ***************** */
/* Legacy Data Support (for Version Patching) ----------------------------- */
@@ -1667,10 +1681,26 @@ static void lib_link_constraint_channels(FileData *fd, ID *id, ListBase *chanbas
/* Data Linking ----------------------------- */
+static void lib_link_fmodifiers(FileData *fd, ID *id, ListBase *list)
+{
+ FModifier *fcm;
+
+ for (fcm= list->first; fcm; fcm= fcm->next) {
+ /* data for specific modifiers */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_PYTHON:
+ {
+ FMod_Python *data= (FMod_Python *)fcm->data;
+ data->script = newlibadr(fd, id->lib, data->script);
+ }
+ break;
+ }
+ }
+}
+
static void lib_link_fcurves(FileData *fd, ID *id, ListBase *list)
{
FCurve *fcu;
- FModifier *fcm;
/* relink ID-block references... */
for (fcu= list->first; fcu; fcu= fcu->next) {
@@ -1684,16 +1714,45 @@ static void lib_link_fcurves(FileData *fd, ID *id, ListBase *list)
}
/* modifiers */
- for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
- /* data for specific modifiers */
- switch (fcm->type) {
- case FMODIFIER_TYPE_PYTHON:
- {
- FMod_Python *data= (FMod_Python *)fcm->data;
- data->script = newlibadr(fd, id->lib, data->script);
- }
- break;
+ lib_link_fmodifiers(fd, id, &fcu->modifiers);
+ }
+}
+
+
+/* NOTE: this assumes that link_list has already been called on the list */
+static void direct_link_fmodifiers(FileData *fd, ListBase *list)
+{
+ FModifier *fcm;
+
+ for (fcm= list->first; fcm; fcm= fcm->next) {
+ /* relink general data */
+ fcm->data = newdataadr(fd, fcm->data);
+ fcm->edata= NULL;
+
+ /* do relinking of data for specific types */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_GENERATOR:
+ {
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ data->coefficients= newdataadr(fd, data->coefficients);
}
+ break;
+ case FMODIFIER_TYPE_ENVELOPE:
+ {
+ FMod_Envelope *data= (FMod_Envelope *)fcm->data;
+
+ data->data= newdataadr(fd, data->data);
+ }
+ break;
+ case FMODIFIER_TYPE_PYTHON:
+ {
+ FMod_Python *data= (FMod_Python *)fcm->data;
+
+ data->prop = newdataadr(fd, data->prop);
+ IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+ }
+ break;
}
}
}
@@ -1702,7 +1761,6 @@ static void lib_link_fcurves(FileData *fd, ID *id, ListBase *list)
static void direct_link_fcurves(FileData *fd, ListBase *list)
{
FCurve *fcu;
- FModifier *fcm;
/* link F-Curve data to F-Curve again (non ID-libs) */
for (fcu= list->first; fcu; fcu= fcu->next) {
@@ -1730,37 +1788,7 @@ static void direct_link_fcurves(FileData *fd, ListBase *list)
/* modifiers */
link_list(fd, &fcu->modifiers);
- for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
- /* relink general data */
- fcm->data = newdataadr(fd, fcm->data);
- fcm->edata= NULL;
-
- /* do relinking of data for specific types */
- switch (fcm->type) {
- case FMODIFIER_TYPE_GENERATOR:
- {
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- data->coefficients= newdataadr(fd, data->coefficients);
- }
- break;
- case FMODIFIER_TYPE_ENVELOPE:
- {
- FMod_Envelope *data= (FMod_Envelope *)fcm->data;
-
- data->data= newdataadr(fd, data->data);
- }
- break;
- case FMODIFIER_TYPE_PYTHON:
- {
- FMod_Python *data= (FMod_Python *)fcm->data;
-
- data->prop = newdataadr(fd, data->prop);
- IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
- }
- break;
- }
- }
+ direct_link_fmodifiers(fd, &fcu->modifiers);
}
}
@@ -1812,6 +1840,65 @@ static void direct_link_action(FileData *fd, bAction *act)
}
}
+static void lib_link_nladata_strips(FileData *fd, ID *id, ListBase *list)
+{
+ NlaStrip *strip;
+
+ for (strip= list->first; strip; strip= strip->next) {
+ /* check strip's children */
+ lib_link_nladata_strips(fd, id, &strip->strips);
+
+ /* reassign the counted-reference to action */
+ strip->act = newlibadr_us(fd, id->lib, strip->act);
+ }
+}
+
+static void lib_link_nladata(FileData *fd, ID *id, ListBase *list)
+{
+ NlaTrack *nlt;
+
+ /* we only care about the NLA strips inside the tracks */
+ for (nlt= list->first; nlt; nlt= nlt->next) {
+ lib_link_nladata_strips(fd, id, &nlt->strips);
+ }
+}
+
+/* This handles Animato NLA-Strips linking
+ * NOTE: this assumes that link_list has already been called on the list
+ */
+static void direct_link_nladata_strips(FileData *fd, ListBase *list)
+{
+ NlaStrip *strip;
+
+ for (strip= list->first; strip; strip= strip->next) {
+ /* strip's child strips */
+ link_list(fd, &strip->strips);
+ direct_link_nladata_strips(fd, &strip->strips);
+
+ /* strip's F-Curves */
+ link_list(fd, &strip->fcurves);
+ direct_link_fcurves(fd, &strip->fcurves);
+
+ /* strip's F-Modifiers */
+ link_list(fd, &strip->modifiers);
+ direct_link_fcurves(fd, &strip->modifiers);
+ }
+}
+
+/* NOTE: this assumes that link_list has already been called on the list */
+static void direct_link_nladata(FileData *fd, ListBase *list)
+{
+ NlaTrack *nlt;
+
+ for (nlt= list->first; nlt; nlt= nlt->next) {
+ /* relink list of strips */
+ link_list(fd, &nlt->strips);
+
+ /* relink strip data */
+ direct_link_nladata_strips(fd, &nlt->strips);
+ }
+}
+
/* ------- */
static void lib_link_keyingsets(FileData *fd, ID *id, ListBase *list)
@@ -1854,6 +1941,7 @@ static void lib_link_animdata(FileData *fd, ID *id, AnimData *adt)
/* link action data */
adt->action= newlibadr_us(fd, id->lib, adt->action);
+ adt->tmpact= newlibadr_us(fd, id->lib, adt->tmpact);
/* link drivers */
lib_link_fcurves(fd, id, &adt->drivers);
@@ -1861,7 +1949,7 @@ static void lib_link_animdata(FileData *fd, ID *id, AnimData *adt)
/* overrides don't have lib-link for now, so no need to do anything */
/* link NLA-data */
- // TODO...
+ lib_link_nladata(fd, id, &adt->nla_tracks);
}
static void direct_link_animdata(FileData *fd, AnimData *adt)
@@ -1878,7 +1966,12 @@ static void direct_link_animdata(FileData *fd, AnimData *adt)
// TODO...
/* link NLA-data */
- // TODO...
+ 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;
}
/* ************ READ NODE TREE *************** */
@@ -2091,6 +2184,8 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
data = ((bKinematicConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
data->poletar = newlibadr(fd, id->lib, data->poletar);
+ con->lin_error = 0.f;
+ con->rot_error = 0.f;
}
break;
case CONSTRAINT_TYPE_TRACKTO:
@@ -2238,6 +2333,7 @@ static void lib_link_armature(FileData *fd, Main *main)
while(arm) {
if(arm->id.flag & LIB_NEEDLINK) {
+ if (arm->adt) lib_link_animdata(fd, &arm->id, arm->adt);
arm->id.flag -= LIB_NEEDLINK;
}
arm= arm->id.next;
@@ -2263,6 +2359,8 @@ static void direct_link_armature(FileData *fd, bArmature *arm)
link_list(fd, &arm->bonebase);
arm->edbo= NULL;
+ arm->sketch = NULL;
+ arm->adt= newdataadr(fd, arm->adt);
bone=arm->bonebase.first;
while (bone) {
@@ -2286,8 +2384,6 @@ static void lib_link_camera(FileData *fd, Main *main)
ca->dof_ob= newlibadr_us(fd, ca->id.lib, ca->dof_ob);
- lib_link_scriptlink(fd, &ca->id, &ca->scriptlink);
-
ca->id.flag -= LIB_NEEDLINK;
}
ca= ca->id.next;
@@ -2298,8 +2394,6 @@ static void direct_link_camera(FileData *fd, Camera *ca)
{
ca->adt= newdataadr(fd, ca->adt);
direct_link_animdata(fd, ca->adt);
-
- direct_link_scriptlink(fd, &ca->scriptlink);
}
@@ -2326,8 +2420,6 @@ static void lib_link_lamp(FileData *fd, Main *main)
la->ipo= newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system
- lib_link_scriptlink(fd, &la->id, &la->scriptlink);
-
la->id.flag -= LIB_NEEDLINK;
}
la= la->id.next;
@@ -2340,8 +2432,6 @@ static void direct_link_lamp(FileData *fd, Lamp *la)
la->adt= newdataadr(fd, la->adt);
direct_link_animdata(fd, la->adt);
-
- direct_link_scriptlink(fd, &la->scriptlink);
for(a=0; a<MAX_MTEX; a++) {
la->mtex[a]= newdataadr(fd, la->mtex[a]);
@@ -2441,7 +2531,8 @@ static void lib_link_mball(FileData *fd, Main *main)
mb= main->mball.first;
while(mb) {
if(mb->id.flag & LIB_NEEDLINK) {
-
+ if (mb->adt) lib_link_animdata(fd, &mb->id, mb->adt);
+
for(a=0; a<mb->totcol; a++) mb->mat[a]= newlibadr_us(fd, mb->id.lib, mb->mat[a]);
mb->ipo= newlibadr_us(fd, mb->id.lib, mb->ipo); // XXX depreceated - old animation system
@@ -2454,6 +2545,9 @@ static void lib_link_mball(FileData *fd, Main *main)
static void direct_link_mball(FileData *fd, MetaBall *mb)
{
+ mb->adt= newdataadr(fd, mb->adt);
+ direct_link_animdata(fd, mb->adt);
+
mb->mat= newdataadr(fd, mb->mat);
test_pointer_array(fd, (void **)&mb->mat);
@@ -2462,6 +2556,8 @@ static void direct_link_mball(FileData *fd, MetaBall *mb)
mb->disp.first= mb->disp.last= NULL;
mb->editelems= NULL;
mb->bb= NULL;
+/* mb->edit_elems.first= mb->edit_elems.last= NULL;*/
+ mb->lastelem= NULL;
}
/* ************ READ WORLD ***************** */
@@ -2487,8 +2583,6 @@ static void lib_link_world(FileData *fd, Main *main)
}
}
- lib_link_scriptlink(fd, &wrld->id, &wrld->scriptlink);
-
wrld->id.flag -= LIB_NEEDLINK;
}
wrld= wrld->id.next;
@@ -2501,8 +2595,6 @@ static void direct_link_world(FileData *fd, World *wrld)
wrld->adt= newdataadr(fd, wrld->adt);
direct_link_animdata(fd, wrld->adt);
-
- direct_link_scriptlink(fd, &wrld->scriptlink);
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
@@ -2641,6 +2733,7 @@ static void direct_link_image(FileData *fd, Image *ima)
ima->anim= NULL;
ima->rr= NULL;
ima->repbind= NULL;
+ ima->render_text= newdataadr(fd, ima->render_text);
ima->packedfile = direct_link_packedfile(fd, ima->packedfile);
ima->preview = direct_link_preview_image(fd, ima->preview);
@@ -2768,6 +2861,11 @@ static void lib_link_texture(FileData *fd, Main *main)
tex->ima= newlibadr_us(fd, tex->id.lib, tex->ima);
tex->ipo= newlibadr_us(fd, tex->id.lib, tex->ipo);
if(tex->env) tex->env->object= newlibadr(fd, tex->id.lib, tex->env->object);
+ if(tex->pd) {
+ tex->pd->object= newlibadr(fd, tex->id.lib, tex->pd->object);
+ tex->pd->psys= newlibadr(fd, tex->id.lib, tex->pd->psys);
+ }
+ if(tex->vd) tex->vd->object= newlibadr(fd, tex->id.lib, tex->vd->object);
if(tex->nodetree)
lib_link_ntree(fd, &tex->id, tex->nodetree);
@@ -2800,6 +2898,16 @@ static void direct_link_texture(FileData *fd, Tex *tex)
memset(tex->env->cube, 0, 6*sizeof(void *));
tex->env->ok= 0;
}
+ tex->pd= newdataadr(fd, tex->pd);
+ if(tex->pd) {
+ tex->pd->point_tree = NULL;
+ tex->pd->coba= newdataadr(fd, tex->pd->coba);
+ }
+
+ tex->vd= newdataadr(fd, tex->vd);
+ if(tex->vd) {
+ tex->vd->dataset = NULL;
+ }
tex->nodetree= newdataadr(fd, tex->nodetree);
if(tex->nodetree)
@@ -2839,7 +2947,6 @@ static void lib_link_material(FileData *fd, Main *main)
mtex->object= newlibadr(fd, ma->id.lib, mtex->object);
}
}
- lib_link_scriptlink(fd, &ma->id, &ma->scriptlink);
if(ma->nodetree)
lib_link_ntree(fd, &ma->id, ma->nodetree);
@@ -2864,8 +2971,6 @@ static void direct_link_material(FileData *fd, Material *ma)
ma->ramp_col= newdataadr(fd, ma->ramp_col);
ma->ramp_spec= newdataadr(fd, ma->ramp_spec);
- direct_link_scriptlink(fd, &ma->scriptlink);
-
ma->nodetree= newdataadr(fd, ma->nodetree);
if(ma->nodetree)
direct_link_nodetree(fd, ma->nodetree);
@@ -2880,16 +2985,49 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
{
if((cache->flag & PTCACHE_DISK_CACHE)==0) {
PTCacheMem *pm;
+ int i;
link_list(fd, &cache->mem_cache);
pm = cache->mem_cache.first;
- for(; pm; pm=pm->next)
- pm->data = newdataadr(fd, pm->data);
+ 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]);
+ }
+ }
}
- cache->flag &= ~(PTCACHE_SIMULATION_VALID|PTCACHE_BAKE_EDIT_ACTIVE);
+ else
+ cache->mem_cache.first = cache->mem_cache.last = NULL;
+
+ cache->flag &= ~PTCACHE_SIMULATION_VALID;
cache->simframe= 0;
+ cache->edit= NULL;
+ cache->free_edit= NULL;
+}
+
+static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache)
+{
+ PointCache *cache;
+
+ if(ptcaches->first) {
+ link_list(fd, ptcaches);
+ for(cache=ptcaches->first; cache; cache=cache->next)
+ direct_link_pointcache(fd, cache);
+
+ *ocache = newdataadr(fd, *ocache);
+ }
+ else if(*ocache) {
+ /* old "single" caches need to be linked too */
+ *ocache = newdataadr(fd, *ocache);
+ direct_link_pointcache(fd, *ocache);
+
+ ptcaches->first = ptcaches->last = *ocache;
+ }
}
static void lib_link_particlesettings(FileData *fd, Main *main)
@@ -2906,6 +3044,29 @@ static void lib_link_particlesettings(FileData *fd, Main *main)
part->dup_group = newlibadr(fd, part->id.lib, part->dup_group);
part->eff_group = newlibadr(fd, part->id.lib, part->eff_group);
part->bb_ob = newlibadr(fd, part->id.lib, part->bb_ob);
+ if(part->boids) {
+ BoidState *state = part->boids->states.first;
+ BoidRule *rule;
+ for(; state; state=state->next) {
+ rule = state->rules.first;
+ for(; rule; rule=rule->next)
+ switch(rule->type) {
+ case eBoidRuleType_Goal:
+ case eBoidRuleType_Avoid:
+ {
+ BoidRuleGoalAvoid *brga = (BoidRuleGoalAvoid*)rule;
+ brga->ob = newlibadr(fd, part->id.lib, brga->ob);
+ break;
+ }
+ case eBoidRuleType_FollowLeader:
+ {
+ BoidRuleFollowLeader *brfl = (BoidRuleFollowLeader*)rule;
+ brfl->ob = newlibadr(fd, part->id.lib, brfl->ob);
+ break;
+ }
+ }
+ }
+ }
part->id.flag -= LIB_NEEDLINK;
}
part= part->id.next;
@@ -2917,26 +3078,36 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
part->adt= newdataadr(fd, part->adt);
part->pd= newdataadr(fd, part->pd);
part->pd2= newdataadr(fd, part->pd2);
+
+ part->boids= newdataadr(fd, part->boids);
+
+ if(part->boids) {
+ BoidState *state;
+ link_list(fd, &part->boids->states);
+
+ for(state=part->boids->states.first; state; state=state->next) {
+ link_list(fd, &state->rules);
+ link_list(fd, &state->conditions);
+ link_list(fd, &state->actions);
+ }
+ }
}
static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase *particles)
{
ParticleSystem *psys, *psysnext;
- int a;
for(psys=particles->first; psys; psys=psysnext){
- ParticleData *pa;
-
psysnext= psys->next;
psys->part = newlibadr_us(fd, id->lib, psys->part);
if(psys->part) {
- psys->target_ob = newlibadr(fd, id->lib, psys->target_ob);
- psys->keyed_ob = newlibadr(fd, id->lib, psys->keyed_ob);
+ ParticleTarget *pt = psys->targets.first;
- for(a=0,pa=psys->particles; a<psys->totpart; a++,pa++){
- pa->stick_ob=newlibadr(fd, id->lib, pa->stick_ob);
- }
+ for(; pt; pt=pt->next)
+ pt->ob=newlibadr(fd, id->lib, pt->ob);
+
+ psys->target_ob = newlibadr(fd, id->lib, psys->target_ob);
}
else {
/* particle modifier must be removed before particle system */
@@ -2952,51 +3123,73 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase
static void direct_link_particlesystems(FileData *fd, ListBase *particles)
{
ParticleSystem *psys;
+ ParticleData *pa;
int a;
for(psys=particles->first; psys; psys=psys->next) {
psys->particles=newdataadr(fd,psys->particles);
+
if(psys->particles && psys->particles->hair){
- ParticleData *pa = psys->particles;
- for(a=0; a<psys->totpart; a++, pa++)
+ for(a=0,pa=psys->particles; a<psys->totpart; a++, pa++)
pa->hair=newdataadr(fd,pa->hair);
}
+
if(psys->particles && psys->particles->keys){
- ParticleData *pa = psys->particles;
- for(a=0; a<psys->totpart; a++, pa++) {
+ for(a=0,pa=psys->particles; a<psys->totpart; a++, pa++) {
pa->keys= NULL;
pa->totkey= 0;
}
psys->flag &= ~PSYS_KEYED;
}
+
+ if(psys->particles && psys->particles->boid) {
+ pa = psys->particles;
+ pa->boid = newdataadr(fd, pa->boid);
+ for(a=1,pa++; a<psys->totpart; a++, pa++)
+ pa->boid = (pa-1)->boid + 1;
+ }
+ else {
+ for(a=0,pa=psys->particles; a<psys->totpart; a++, pa++)
+ pa->boid = NULL;
+ }
+
+
psys->child=newdataadr(fd,psys->child);
psys->effectors.first=psys->effectors.last=0;
- psys->soft= newdataadr(fd, psys->soft);
- if(psys->soft) {
- SoftBody *sb = psys->soft;
- sb->particles = psys;
- sb->bpoint= NULL; // init pointers so it gets rebuilt nicely
- sb->bspring= NULL;
- sb->scratch= NULL;
+ link_list(fd, &psys->targets);
- sb->pointcache= newdataadr(fd, sb->pointcache);
- if(sb->pointcache)
- direct_link_pointcache(fd, sb->pointcache);
- }
-
- psys->edit = 0;
+ psys->edit = NULL;
psys->free_edit = NULL;
psys->pathcache = 0;
psys->childcache = 0;
psys->pathcachebufs.first = psys->pathcachebufs.last = 0;
psys->childcachebufs.first = psys->childcachebufs.last = 0;
psys->reactevents.first = psys->reactevents.last = 0;
+ psys->frand = NULL;
+ psys->pdd = NULL;
+
+ direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache);
+
+ if(psys->clmd) {
+ psys->clmd = newdataadr(fd, psys->clmd);
+ psys->clmd->clothObject = NULL;
+
+ psys->clmd->sim_parms= newdataadr(fd, psys->clmd->sim_parms);
+ psys->clmd->coll_parms= newdataadr(fd, psys->clmd->coll_parms);
+
+ if(psys->clmd->sim_parms) {
+ if(psys->clmd->sim_parms->presets > 10)
+ psys->clmd->sim_parms->presets = 0;
+ }
+
+ psys->hair_in_dm = psys->hair_out_dm = NULL;
- psys->pointcache= newdataadr(fd, psys->pointcache);
- if(psys->pointcache)
- direct_link_pointcache(fd, psys->pointcache);
+ psys->clmd->point_cache = psys->pointcache;
+ }
+
+ psys->tree = NULL;
}
return;
}
@@ -3294,11 +3487,13 @@ static void lib_link_object(FileData *fd, Main *main)
if(ob->pose) {
free_pose(ob->pose);
ob->pose= NULL;
- ob->flag &= ~OB_POSEMODE;
+ ob->mode &= ~OB_MODE_POSE;
}
}
for(a=0; a<ob->totcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]);
+ ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd);
+
ob->id.flag -= LIB_NEEDLINK;
/* if id.us==0 a new base will be created later on */
@@ -3355,9 +3550,6 @@ static void lib_link_object(FileData *fd, Main *main)
bSoundActuator *sa= act->data;
sa->sound= newlibadr_us(fd, ob->id.lib, sa->sound);
}
- else if(act->type==ACT_CD) {
- /* bCDActuator *cda= act->data; */
- }
else if(act->type==ACT_GAME) {
/* bGameActuator *ga= act->data; */
}
@@ -3425,6 +3617,11 @@ static void lib_link_object(FileData *fd, Main *main)
else if(act->type==ACT_STATE) {
/* bStateActuator *statea = act->data; */
}
+ else if(act->type==ACT_ARMATURE) {
+ bArmatureActuator *arma= act->data;
+ arma->target= newlibadr(fd, ob->id.lib, arma->target);
+ arma->subtarget= newlibadr(fd, ob->id.lib, arma->subtarget);
+ }
act= act->next;
}
@@ -3434,13 +3631,23 @@ static void lib_link_object(FileData *fd, Main *main)
if(fluidmd && fluidmd->fss)
fluidmd->fss->ipo = newlibadr_us(fd, ob->id.lib, fluidmd->fss->ipo);
}
+
+ {
+ SmokeModifierData *smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
+
+ if(smd && smd->type == MOD_SMOKE_TYPE_DOMAIN && smd->domain)
+ {
+ smd->domain->coll_group = newlibadr_us(fd, ob->id.lib, smd->domain->coll_group);
+ smd->domain->eff_group = newlibadr_us(fd, ob->id.lib, smd->domain->eff_group);
+ smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group);
+ }
+ }
/* texture field */
if(ob->pd)
if(ob->pd->tex)
ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex);
- lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem);
lib_link_modifiers(fd, ob);
}
@@ -3476,6 +3683,10 @@ static void direct_link_pose(FileData *fd, bPose *pose)
pchan->iktree.first= pchan->iktree.last= NULL;
pchan->path= NULL;
}
+ pose->ikdata = NULL;
+ if (pose->ikparam != NULL) {
+ pose->ikparam= newdataadr(fd, pose->ikparam);
+ }
}
static void direct_link_modifiers(FileData *fd, ListBase *lb)
@@ -3509,10 +3720,8 @@ 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);
- clmd->point_cache= newdataadr(fd, clmd->point_cache);
- if(clmd->point_cache)
- direct_link_pointcache(fd, clmd->point_cache);
+ direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache);
if(clmd->sim_parms) {
if(clmd->sim_parms->presets > 10)
@@ -3526,6 +3735,46 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
fluidmd->fss= newdataadr(fd, fluidmd->fss);
fluidmd->fss->meshSurfNormals = 0;
}
+ else if (md->type==eModifierType_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ if(smd->type==MOD_SMOKE_TYPE_DOMAIN)
+ {
+ smd->flow = NULL;
+ smd->coll = NULL;
+ smd->domain = newdataadr(fd, smd->domain);
+ smd->domain->smd = smd;
+
+ smd->domain->fluid = NULL;
+ smd->domain->wt = NULL;
+ smd->domain->shadow = NULL;
+ smd->domain->tex = NULL;
+ smd->domain->tex_shadow = NULL;
+ smd->domain->tex_wt = 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]));
+ }
+ else if(smd->type==MOD_SMOKE_TYPE_FLOW)
+ {
+ smd->domain = NULL;
+ smd->coll = NULL;
+ smd->flow = newdataadr(fd, smd->flow);
+ smd->flow->smd = smd;
+ smd->flow->psys = newdataadr(fd, smd->flow->psys);
+ }
+ else if(smd->type==MOD_SMOKE_TYPE_COLL)
+ {
+ smd->flow = NULL;
+ smd->domain = NULL;
+ smd->coll = NULL;
+ /*
+ smd->coll = newdataadr(fd, smd->coll);
+ smd->coll->points = NULL;
+ smd->coll->numpoints = 0;
+ */
+ }
+ }
else if (md->type==eModifierType_Collision) {
CollisionModifierData *collmd = (CollisionModifierData*) md;
@@ -3557,6 +3806,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
surmd->dm = NULL;
surmd->bvhtree = NULL;
+ surmd->x = NULL;
+ surmd->v = NULL;
+ surmd->numverts = 0;
}
else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
@@ -3637,10 +3889,9 @@ static void direct_link_object(FileData *fd, Object *ob)
link_list(fd, &ob->constraintChannels);
// >>> XXX depreceated - old animation system
- direct_link_scriptlink(fd, &ob->scriptlink);
-
ob->mat= newdataadr(fd, ob->mat);
test_pointer_array(fd, (void **)&ob->mat);
+ ob->matbits= newdataadr(fd, ob->matbits);
/* do it here, below old data gets converted */
direct_link_modifiers(fd, &ob->modifiers);
@@ -3714,9 +3965,7 @@ static void direct_link_object(FileData *fd, Object *ob)
}
}
- sb->pointcache= newdataadr(fd, sb->pointcache);
- if(sb->pointcache)
- direct_link_pointcache(fd, sb->pointcache);
+ direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache);
}
ob->bsoft= newdataadr(fd, ob->bsoft);
ob->fluidsimSettings= newdataadr(fd, ob->fluidsimSettings); /* NT */
@@ -3802,6 +4051,10 @@ static void direct_link_object(FileData *fd, Object *ob)
ob->derivedDeform= NULL;
ob->derivedFinal= NULL;
ob->gpulamp.first= ob->gpulamp.last= NULL;
+ link_list(fd, &ob->pc_ids);
+
+ if(ob->sculpt)
+ ob->sculpt= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
}
/* ************ READ SCENE ***************** */
@@ -3816,6 +4069,14 @@ static void composite_patch(bNodeTree *ntree, Scene *scene)
node->id= &scene->id;
}
+static void link_paint(FileData *fd, Scene *sce, Paint *p)
+{
+ if(p && p->brushes) {
+ int i;
+ for(i = 0; i < p->brush_count; ++i)
+ p->brushes[i]= newlibadr_us(fd, sce->id.lib, p->brushes[i]);
+ }
+}
static void lib_link_scene(FileData *fd, Main *main)
{
@@ -3838,19 +4099,13 @@ static void lib_link_scene(FileData *fd, Main *main)
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);
- sce->toolsettings->imapaint.brush=
- newlibadr_us(fd, sce->id.lib, sce->toolsettings->imapaint.brush);
- if(sce->toolsettings->sculpt)
- sce->toolsettings->sculpt->brush=
- newlibadr_us(fd, sce->id.lib, sce->toolsettings->sculpt->brush);
- if(sce->toolsettings->vpaint)
- sce->toolsettings->vpaint->brush=
- newlibadr_us(fd, sce->id.lib, sce->toolsettings->vpaint->brush);
- if(sce->toolsettings->wpaint)
- sce->toolsettings->wpaint->brush=
- newlibadr_us(fd, sce->id.lib, sce->toolsettings->wpaint->brush);
-
+ link_paint(fd, sce, &sce->toolsettings->sculpt->paint);
+ link_paint(fd, sce, &sce->toolsettings->vpaint->paint);
+ link_paint(fd, sce, &sce->toolsettings->wpaint->paint);
+ link_paint(fd, sce, &sce->toolsettings->imapaint.paint);
+
sce->toolsettings->skgen_template = newlibadr(fd, sce->id.lib, sce->toolsettings->skgen_template);
for(base= sce->base.first; base; base= next) {
@@ -3879,19 +4134,19 @@ static void lib_link_scene(FileData *fd, Main *main)
if(seq->ipo) seq->ipo= newlibadr_us(fd, sce->id.lib, seq->ipo);
if(seq->scene) seq->scene= newlibadr(fd, sce->id.lib, seq->scene);
if(seq->sound) {
- seq->sound= newlibadr(fd, sce->id.lib, seq->sound);
+ if(seq->type == SEQ_HD_SOUND)
+ seq->type = SEQ_SOUND;
+ else
+ seq->sound= newlibadr(fd, sce->id.lib, seq->sound);
if (seq->sound) {
seq->sound->id.us++;
- seq->sound->flags |= SOUND_FLAGS_SEQUENCE;
+ seq->sound_handle= sound_new_handle(sce, seq->sound, seq->startdisp, seq->enddisp, seq->startofs);
}
}
seq->anim= 0;
- seq->hdaudio = 0;
}
SEQ_END
- lib_link_scriptlink(fd, &sce->id, &sce->scriptlink);
-
if(sce->nodetree) {
lib_link_ntree(fd, &sce->id, sce->nodetree);
composite_patch(sce->nodetree, sce);
@@ -3902,7 +4157,8 @@ static void lib_link_scene(FileData *fd, Main *main)
srl->light_override= newlibadr_us(fd, sce->id.lib, srl->light_override);
}
/*Game Settings: Dome Warp Text*/
- sce->r.dometext= newlibadr_us(fd, sce->id.lib, sce->r.dometext);
+// sce->r.dometext= newlibadr_us(fd, sce->id.lib, sce->r.dometext); // XXX deprecated since 2.5
+ sce->gm.dome.warptext= newlibadr_us(fd, sce->id.lib, sce->gm.dome.warptext);
sce->id.flag -= LIB_NEEDLINK;
}
@@ -3922,6 +4178,13 @@ static void link_recurs_seq(FileData *fd, ListBase *lb)
link_recurs_seq(fd, &seq->seqbase);
}
+static void direct_link_paint(FileData *fd, Paint **paint)
+{
+ (*paint)= newdataadr(fd, (*paint));
+ if(*paint)
+ (*paint)->brushes= newdataadr(fd, (*paint)->brushes);
+}
+
static void direct_link_scene(FileData *fd, Scene *sce)
{
Editing *ed;
@@ -3931,7 +4194,10 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->theDag = NULL;
sce->dagisvalid = 0;
sce->obedit= NULL;
-
+ sce->stats= 0;
+
+ memset(&sce->sound_handles, 0, sizeof(sce->sound_handles));
+
/* set users to one by default, not in lib-link, this will increase it for compo nodes */
sce->id.us= 1;
@@ -3947,14 +4213,14 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->toolsettings= newdataadr(fd, sce->toolsettings);
if(sce->toolsettings) {
- sce->toolsettings->vpaint= newdataadr(fd, sce->toolsettings->vpaint);
- sce->toolsettings->wpaint= newdataadr(fd, sce->toolsettings->wpaint);
- sce->toolsettings->sculpt= newdataadr(fd, sce->toolsettings->sculpt);
+ direct_link_paint(fd, (Paint**)&sce->toolsettings->sculpt);
+ direct_link_paint(fd, (Paint**)&sce->toolsettings->vpaint);
+ direct_link_paint(fd, (Paint**)&sce->toolsettings->wpaint);
+
+ sce->toolsettings->imapaint.paint.brushes= newdataadr(fd, sce->toolsettings->imapaint.paint.brushes);
+
sce->toolsettings->imapaint.paintcursor= NULL;
sce->toolsettings->particle.paintcursor= NULL;
-
- if(sce->toolsettings->sculpt)
- sce->toolsettings->sculpt->session= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
}
if(sce->ed) {
@@ -4023,6 +4289,9 @@ static void direct_link_scene(FileData *fd, Scene *sce)
} else {
seq->strip->color_balance = 0;
}
+ if (seq->strip->color_balance) {
+ // seq->strip->color_balance->gui = 0; // XXX - peter, is this relevant in 2.5?
+ }
}
}
SEQ_END
@@ -4066,8 +4335,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
}
}
}
-
- direct_link_scriptlink(fd, &sce->scriptlink);
sce->r.avicodecdata = newdataadr(fd, sce->r.avicodecdata);
if (sce->r.avicodecdata) {
@@ -4117,6 +4384,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
win->timers.first= win->timers.last= NULL;
win->queue.first= win->queue.last= NULL;
win->handlers.first= win->handlers.last= NULL;
+ win->modalhandlers.first= win->modalhandlers.last= NULL;
win->subwindows.first= win->subwindows.last= NULL;
win->gesture.first= win->gesture.last= NULL;
@@ -4129,7 +4397,9 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
wm->keymaps.first= wm->keymaps.last= NULL;
wm->paintcursors.first= wm->paintcursors.last= NULL;
wm->queue.first= wm->queue.last= NULL;
- wm->reports.first= wm->reports.last= NULL;
+ BKE_reports_init(&wm->reports, RPT_STORE);
+
+ wm->jobs.first= wm->jobs.last= NULL;
wm->windrawable= NULL;
wm->initialized= 0;
@@ -4138,11 +4408,14 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
static void lib_link_windowmanager(FileData *fd, Main *main)
{
wmWindowManager *wm;
+ wmWindow *win;
for(wm= main->wm.first; wm; wm= wm->id.next) {
- wmWindow *win;
- for(win= wm->windows.first; win; win= win->next) {
- win->screen= newlibadr(fd, NULL, win->screen);
+ if(wm->id.flag & LIB_NEEDLINK) {
+ for(win= wm->windows.first; win; win= win->next)
+ win->screen= newlibadr(fd, NULL, win->screen);
+
+ wm->id.flag -= LIB_NEEDLINK;
}
}
}
@@ -4220,9 +4493,6 @@ static void lib_link_screen(FileData *fd, Main *main)
sa->full= newlibadr(fd, sc->id.lib, sa->full);
- /* space handler scriptlinks */
- lib_link_scriptlink(fd, &sc->id, &sa->scriptlink);
-
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
@@ -4245,9 +4515,10 @@ static void lib_link_screen(FileData *fd, Main *main)
}
else if(sl->spacetype==SPACE_BUTS) {
SpaceButs *sbuts= (SpaceButs *)sl;
- sbuts->lockpoin= NULL;
sbuts->ri= NULL;
sbuts->pinid= newlibadr(fd, sc->id.lib, sbuts->pinid);
+ sbuts->mainbo= sbuts->mainb;
+ sbuts->mainbuser= sbuts->mainb;
if(main->versionfile<132)
butspace_version_132(sbuts);
}
@@ -4257,6 +4528,8 @@ static void lib_link_screen(FileData *fd, Main *main)
sfile->params= NULL;
sfile->op= NULL;
sfile->layout= NULL;
+ sfile->folders_prev= NULL;
+ sfile->folders_next= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel *)sl;
@@ -4399,16 +4672,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
while(sa) {
SpaceLink *sl;
- if (sa->scriptlink.totscript) {
- /* restore screen area script links */
- ScriptLink *slink = &sa->scriptlink;
- int script_idx;
- for (script_idx = 0; script_idx < slink->totscript; script_idx++) {
- slink->scripts[script_idx] = restore_pointer_by_name(newmain,
- (ID *)slink->scripts[script_idx], 1);
- }
- }
-
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
@@ -4436,7 +4699,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
v3d->layact= v3d->localvd->layact;
MEM_freeN(v3d->localvd);
v3d->localvd= NULL;
- v3d->localview= 0;
}
*/
}
@@ -4464,7 +4726,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
}
else if(sl->spacetype==SPACE_BUTS) {
SpaceButs *sbuts= (SpaceButs *)sl;
- sbuts->lockpoin= NULL;
sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0);
//XXX if (sbuts->ri) sbuts->ri->curtile = 0;
}
@@ -4472,13 +4733,10 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
SpaceFile *sfile= (SpaceFile *)sl;
sfile->files= NULL;
+ sfile->folders_prev= NULL;
+ sfile->folders_next= NULL;
sfile->params= NULL;
sfile->op= NULL;
- /* XXX needs checking - best solve in filesel itself
- if(sfile->libfiledata)
- BLO_blendhandle_close(sfile->libfiledata);
- sfile->libfiledata= 0;
- */
}
else if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel *)sl;
@@ -4583,10 +4841,12 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
rv3d->ri= NULL;
rv3d->sms= NULL;
rv3d->smooth_timer= NULL;
- rv3d->lastmode= 0;
}
}
+ ar->v2d.tab_offset= NULL;
+ ar->v2d.tab_num= 0;
+ ar->v2d.tab_cur= 0;
ar->handlers.first= ar->handlers.last= NULL;
ar->uiblocks.first= ar->uiblocks.last= NULL;
ar->headerstr= NULL;
@@ -4615,6 +4875,10 @@ static void view3d_split_250(View3D *v3d, ListBase *regions)
QUATCOPY(rv3d->viewquat, v3d->viewquat);
}
}
+
+ /* this was not initialized correct always */
+ if(v3d->twtype == 0)
+ v3d->twtype= V3D_MANIP_TRANSLATE;
}
static void direct_link_screen(FileData *fd, bScreen *sc)
@@ -4710,6 +4974,11 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
sipo->ads= newdataadr(fd, sipo->ads);
sipo->ghostCurves.first= sipo->ghostCurves.last= NULL;
}
+ else if (sl->spacetype==SPACE_NLA) {
+ SpaceNla *snla= (SpaceNla*)sl;
+
+ snla->ads= newdataadr(fd, snla->ads);
+ }
else if (sl->spacetype==SPACE_OUTLINER) {
SpaceOops *soops= (SpaceOops*) sl;
@@ -4744,7 +5013,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
}
else if(sl->spacetype==SPACE_LOGIC) {
SpaceLogic *slogic= (SpaceLogic *)sl;
-
+
if(slogic->gpd) {
slogic->gpd= newdataadr(fd, slogic->gpd);
direct_link_gpencil(fd, slogic->gpd);
@@ -4761,6 +5030,20 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
SpaceButs *sbuts= (SpaceButs *)sl;
sbuts->path= NULL;
}
+ else if(sl->spacetype==SPACE_CONSOLE) {
+ SpaceConsole *sconsole= (SpaceConsole *)sl;
+ //ConsoleLine *cl;
+
+ link_list(fd, &sconsole->scrollback);
+ link_list(fd, &sconsole->history);
+
+ //for(cl= sconsole->scrollback.first; cl; cl= cl->next)
+ // cl->line= newdataadr(fd, cl->line);
+
+ //for(cl= sconsole->history.first; cl; cl= cl->next)
+ // cl->line= newdataadr(fd, cl->line);
+
+ }
}
sa->actionzones.first= sa->actionzones.last= NULL;
@@ -4769,9 +5052,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
sa->v2= newdataadr(fd, sa->v2);
sa->v3= newdataadr(fd, sa->v3);
sa->v4= newdataadr(fd, sa->v4);
-
- /* space handler scriptlinks */
- direct_link_scriptlink(fd, &sa->scriptlink);
}
}
@@ -4844,8 +5124,7 @@ static void fix_relpaths_library(const char *basepath, Main *main)
static void direct_link_sound(FileData *fd, bSound *sound)
{
- sound->sample = NULL;
- sound->snd_sound = NULL;
+ sound->handle = NULL;
sound->packedfile = direct_link_packedfile(fd, sound->packedfile);
sound->newpackedfile = direct_link_packedfile(fd, sound->newpackedfile);
@@ -4860,7 +5139,11 @@ static void lib_link_sound(FileData *fd, Main *main)
if(sound->id.flag & LIB_NEEDLINK) {
sound->id.flag -= LIB_NEEDLINK;
sound->ipo= newlibadr_us(fd, sound->id.lib, sound->ipo); // XXX depreceated - old animation system
- sound->stream = 0;
+
+ sound_load(main, sound);
+
+ if(sound->cache)
+ sound_cache(sound, 1);
}
sound= sound->id.next;
}
@@ -5131,6 +5414,9 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead)
bfd->curscene= fg->curscene;
MEM_freeN(fg);
+
+ fd->globalf= bfd->globalf;
+ fd->fileflags= bfd->fileflags;
return blo_nextbhead(fd, bhead);
}
@@ -5522,7 +5808,7 @@ static void alphasort_version_246(FileData *fd, Library *lib, Mesh *me)
tf = ((MTFace*)me->fdata.layers[b].data) + a;
tf->mode &= ~TF_ALPHASORT;
- if(ma && (ma->mode & MA_ZTRA))
+ if(ma && (ma->mode & MA_ZTRANSP))
if(ELEM(tf->transp, TF_ALPHA, TF_ADD) || (texalpha && (tf->transp != TF_CLIP)))
tf->mode |= TF_ALPHASORT;
}
@@ -5544,7 +5830,7 @@ static void area_add_header_region(ScrArea *sa, ListBase *lb)
/* initialise view2d data for header region, to allow panning */
/* is copy from ui_view2d.c */
- ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
ar->v2d.keepofs = V2D_LOCKOFS_Y;
ar->v2d.keeptot = V2D_KEEPTOT_STRICT;
ar->v2d.align = V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y;
@@ -5565,6 +5851,14 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->regiontype= RGN_TYPE_CHANNELS;
ar->alignment= RGN_ALIGN_LEFT;
ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+
+ // for some reason, this doesn't seem to go auto like for NLA...
+ ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
+ BLI_addtail(lb, ar);
+ ar->regiontype= RGN_TYPE_UI;
+ ar->alignment= RGN_ALIGN_RIGHT;
+ ar->v2d.scroll= V2D_SCROLL_RIGHT;
+ ar->v2d.flag = RGN_FLAG_HIDDEN;
break;
case SPACE_ACTION:
@@ -5595,21 +5889,17 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
/* temporarily hide it */
ar->flag = RGN_FLAG_HIDDEN;
break;
-
case SPACE_FILE:
- /* channel (bookmarks/directories) region */
- ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
+ ar= MEM_callocN(sizeof(ARegion), "nodetree area for node");
BLI_addtail(lb, ar);
ar->regiontype= RGN_TYPE_CHANNELS;
ar->alignment= RGN_ALIGN_LEFT;
- ar->v2d.scroll= V2D_SCROLL_RIGHT;
- /* button UI region */
- ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
+
+ ar= MEM_callocN(sizeof(ARegion), "ui area for file");
BLI_addtail(lb, ar);
ar->regiontype= RGN_TYPE_UI;
ar->alignment= RGN_ALIGN_TOP;
break;
-
#if 0
case SPACE_BUTS:
/* context UI region */
@@ -5741,13 +6031,15 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
memcpy(&ar->v2d, &snode->v2d, sizeof(View2D));
ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
- ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
+ ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
break;
}
case SPACE_BUTS:
{
SpaceButs *sbuts= (SpaceButs *)sl;
memcpy(&ar->v2d, &sbuts->v2d, sizeof(View2D));
+
+ ar->v2d.scroll |= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
break;
}
case SPACE_FILE:
@@ -5760,7 +6052,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->regiontype= RGN_TYPE_WINDOW;
ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
- ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
break;
}
case SPACE_TEXT:
@@ -6164,7 +6456,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
if(main->versionfile <= 191) {
- bScreen *sc= main->screen.first;
Object *ob= main->object.first;
Material *ma = main->mat.first;
@@ -6180,22 +6471,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/*ob->quat[1]= 1.0f;*/ /* quats arnt used yet */
ob= ob->id.next;
}
-
- while(sc) {
- ScrArea *sa= sc->areabase.first;
- while(sa) {
- SpaceLink *sl= sa->spacedata.first;
- while(sl) {
- if(sl->spacetype==SPACE_BUTS) {
- SpaceButs *sbuts= (SpaceButs*) sl;
- sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK;
- }
- sl= sl->next;
- }
- sa= sa->next;
- }
- sc= sc->id.next;
- }
}
if(main->versionfile <= 193) {
@@ -8108,7 +8383,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
- simasel->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
+ simasel->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
@@ -8128,20 +8403,20 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* add point caches */
for(ob=main->object.first; ob; ob=ob->id.next) {
if(ob->soft && !ob->soft->pointcache)
- ob->soft->pointcache= BKE_ptcache_add();
+ 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();
+ //if(psys->soft && !psys->soft->pointcache)
+ // psys->soft->pointcache= BKE_ptcache_add(&psys->soft->ptcaches);
if(!psys->pointcache)
- psys->pointcache= BKE_ptcache_add();
+ psys->pointcache= BKE_ptcache_add(&psys->ptcaches);
}
for(md=ob->modifiers.first; md; md=md->next) {
if(md->type==eModifierType_Cloth) {
ClothModifierData *clmd = (ClothModifierData*) md;
if(!clmd->point_cache)
- clmd->point_cache= BKE_ptcache_add();
+ clmd->point_cache= BKE_ptcache_add(&clmd->ptcaches);
}
}
}
@@ -8429,9 +8704,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* create new particle system */
psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
- psys->pointcache = BKE_ptcache_add();
+ psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
- part = psys->part = psys_new_settings("PSys", main);
+ part = psys->part = psys_new_settings("ParticleSettings", main);
/* needed for proper libdata lookup */
oldnewmap_insert(fd->libmap, psys->part, psys->part, 0);
@@ -9007,13 +9282,78 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (main->versionfile < 250) {
bScreen *screen;
Scene *scene;
+ Base *base;
Material *ma;
+ Camera *cam;
Mesh *me;
+ Curve *cu;
Scene *sce;
Tex *tx;
ParticleSettings *part;
Object *ob;
-
+ //PTCacheID *pid;
+ //ListBase pidlist;
+
+ bSound *sound;
+ Sequence *seq;
+ bActuator *act;
+
+ for(sound = main->sound.first; sound; sound = sound->id.next)
+ {
+ if(sound->newpackedfile)
+ {
+ sound->packedfile = sound->newpackedfile;
+ sound->newpackedfile = NULL;
+ }
+ }
+
+ for(ob = main->object.first; ob; ob= ob->id.next) {
+ for(act= ob->actuators.first; act; act= act->next) {
+ if (act->type == ACT_SOUND) {
+ bSoundActuator *sAct = (bSoundActuator*) act->data;
+ if(sAct->sound)
+ {
+ sound = newlibadr(fd, lib, sAct->sound);
+ sAct->flag = sound->flags | SOUND_FLAGS_3D ? ACT_SND_3D_SOUND : 0;
+ sAct->pitch = sound->pitch;
+ sAct->volume = sound->volume;
+ sAct->sound3D.reference_distance = sound->distance;
+ sAct->sound3D.max_gain = sound->max_gain;
+ sAct->sound3D.min_gain = sound->min_gain;
+ sAct->sound3D.rolloff_factor = sound->attenuation;
+ }
+ else
+ {
+ sAct->sound3D.reference_distance = 1.0f;
+ sAct->volume = 1.0f;
+ sAct->sound3D.max_gain = 1.0f;
+ sAct->sound3D.rolloff_factor = 1.0f;
+ }
+ sAct->sound3D.cone_inner_angle = 360.0f;
+ sAct->sound3D.cone_outer_angle = 360.0f;
+ sAct->sound3D.max_distance = FLT_MAX;
+ }
+ }
+ }
+
+ for(scene = main->scene.first; scene; scene = scene->id.next)
+ {
+ if(scene->ed && scene->ed->seqbasep)
+ {
+ for(seq = scene->ed->seqbasep->first; seq; seq = seq->next)
+ {
+ if(seq->type == SEQ_HD_SOUND)
+ {
+ char str[FILE_MAX];
+ BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_convertstringcode(str, G.sce);
+ BLI_convertstringframe(str, scene->r.cfra);
+ seq->sound = sound_new_file(main, str);
+ }
+ }
+ }
+ }
+
for(screen= main->screen.first; screen; screen= screen->id.next) {
do_versions_windowmanager_2_50(screen);
do_versions_gpencil_2_50(main, screen);
@@ -9024,14 +9364,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
*/
//do_versions_ipos_to_animato(main);
- /* struct audio data moved to renderdata */
- for(scene= main->scene.first; scene; scene= scene->id.next) {
- scene->r.audio = scene->audio;
-
- if(!scene->toolsettings->uv_selectmode)
- scene->toolsettings->uv_selectmode= UV_SELECT_VERTEX;
- }
-
/* shader, composit and texture node trees have id.name empty, put something in
* to have them show in RNA viewer and accessible otherwise.
*/
@@ -9043,6 +9375,20 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(sce= main->scene.first; sce; sce= sce->id.next) {
if(sce->nodetree && strlen(sce->nodetree->id.name)==0)
strcpy(sce->nodetree->id.name, "NTComposit Nodetree");
+
+ /* move to cameras */
+ if(sce->r.mode & R_PANORAMA) {
+ for(base=sce->base.first; base; base=base->next) {
+ ob= newlibadr(fd, lib, base->object);
+
+ if(ob->type == OB_CAMERA && !ob->id.lib) {
+ cam= newlibadr(fd, lib, ob->data);
+ cam->flag |= CAM_PANORAMA;
+ }
+ }
+
+ sce->r.mode &= ~R_PANORAMA;
+ }
}
/* and texture trees */
for(tx= main->tex.first; tx; tx= tx->id.next) {
@@ -9070,37 +9416,57 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
part->draw_as = PART_DRAW_REND;
}
}
+ part->path_end = 1.0f;
+ part->clength = 1.0f;
}
/* set old pointcaches to have disk cache flag */
for(ob = main->object.first; ob; ob= ob->id.next) {
- ParticleSystem *psys = ob->particlesystem.first;
- for(; psys; psys=psys->next) {
- if(psys->pointcache)
- psys->pointcache->flag |= PTCACHE_DISK_CACHE;
- }
+ //BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ //for(pid=pidlist.first; pid; pid=pid->next)
+ // pid->cache->flag |= PTCACHE_DISK_CACHE;
+
+ //BLI_freelistN(&pidlist);
+ }
- /* TODO: softbody & cloth caches */
+ /* type was a mixed flag & enum. move the 2d flag elsewhere */
+ for(cu = main->curve.first; cu; cu= cu->id.next) {
+ Nurb *nu;
+
+ for(nu= cu->nurb.first; nu; nu= nu->next) {
+ nu->flag |= (nu->type & CU_2D);
+ nu->type &= CU_TYPE;
+ }
}
}
- /* TODO: should be moved into one of the version blocks once this branch moves to trunk and we can
- bump the version (or sub-version.) */
- {
+ if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 1)) {
Object *ob;
Material *ma;
+ Tex *tex;
Scene *sce;
ToolSettings *ts;
- int i;
+ //PTCacheID *pid;
+ //ListBase pidlist;
+ int i, a;
for(ob = main->object.first; ob; ob = ob->id.next) {
+ //BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ //for(pid=pidlist.first; pid; pid=pid->next) {
+ // if(pid->ptcaches->first == NULL)
+ // pid->ptcaches->first = pid->ptcaches->last = pid->cache;
+ //}
+
+ //BLI_freelistN(&pidlist);
if(ob->type == OB_MESH) {
Mesh *me = newlibadr(fd, lib, ob->data);
void *olddata = ob->data;
ob->data = me;
- if(me && me->mr) {
+ if(me && me->id.lib==NULL && me->mr) { /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */
MultiresLevel *lvl;
ModifierData *md;
MultiresModifierData *mmd;
@@ -9140,7 +9506,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
mmd->lvl = mmd->totlvl;
orig = CDDM_from_mesh(me, NULL);
- dm = multires_dm_create_from_derived(mmd, orig, me, 0, 0);
+ dm = multires_dm_create_from_derived(mmd, 0, orig, ob, 0, 0);
multires_load_old(dm, me->mr);
@@ -9155,22 +9521,208 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->data = olddata;
}
+
+ if(ob->totcol && ob->matbits == NULL) {
+ int a;
+
+ ob->matbits= MEM_callocN(sizeof(char)*ob->totcol, "ob->matbits");
+ for(a=0; a<ob->totcol; a++)
+ ob->matbits[a]= ob->colbits & (1<<a);
+ }
+ }
+
+ /* texture filter */
+ for(tex = main->tex.first; tex; tex = tex->id.next) {
+ if(tex->afmax == 0)
+ tex->afmax= 8;
}
for(ma = main->mat.first; ma; ma = ma->id.next) {
+ if(ma->mode & MA_WIRE) {
+ ma->material_type= MA_TYPE_WIRE;
+ ma->mode &= ~MA_WIRE;
+ }
if(ma->mode & MA_HALO) {
ma->material_type= MA_TYPE_HALO;
ma->mode &= ~MA_HALO;
}
+
+ if(ma->mode & (MA_ZTRANSP|MA_RAYTRANSP)) {
+ ma->mode |= MA_TRANSP;
+ }
+ else {
+ ma->mode |= MA_ZTRANSP;
+ ma->mode &= ~MA_TRANSP;
+ }
+
+ /* set new bump for unused slots */
+ 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 {
+ tex= (Tex*)newlibadr(fd, ma->id.lib, tex);
+ if(tex && tex->type == 0) /* invalid type */
+ ma->mtex[a]->texflag |= MTEX_NEW_BUMP;
+ }
+ }
+ }
+
+ /* volume rendering settings */
+ if (ma->vol.stepsize < 0.0001f) {
+ ma->vol.density = 1.0f;
+ ma->vol.emission = 0.0f;
+ ma->vol.absorption = 1.0f;
+ ma->vol.scattering = 1.0f;
+ ma->vol.emission_col[0] = ma->vol.emission_col[1] = ma->vol.emission_col[2] = 1.0f;
+ ma->vol.absorption_col[0] = ma->vol.absorption_col[1] = ma->vol.absorption_col[2] = 0.0f;
+ ma->vol.density_scale = 1.0f;
+ ma->vol.depth_cutoff = 0.01f;
+ ma->vol.stepsize_type = MA_VOL_STEP_RANDOMIZED;
+ ma->vol.stepsize = 0.2f;
+ ma->vol.shade_stepsize = 0.2f;
+ ma->vol.shade_type = MA_VOL_SHADE_SINGLE;
+ ma->vol.shadeflag |= MA_VOL_PRECACHESHADING;
+ ma->vol.precache_resolution = 50;
+ }
}
for(sce = main->scene.first; sce; sce = sce->id.next) {
ts= sce->toolsettings;
- if(ts->normalsize == 0.0) {
+ if(ts->normalsize == 0.0 || !ts->uv_selectmode || ts->vgroup_weight == 0.0) {
ts->normalsize= 0.1f;
ts->selectmode= SCE_SELECT_VERTEX;
+
+ /* autokeying - setting should be taken from the user-prefs
+ * but the userprefs version may not have correct flags set
+ * (i.e. will result in blank box when enabled)
+ */
ts->autokey_mode= U.autokey_mode;
+ if (ts->autokey_mode == 0)
+ ts->autokey_mode= 2; /* 'add/replace' but not on */
+ ts->uv_selectmode= UV_SELECT_VERTEX;
+ ts->vgroup_weight= 1.0f;
+ }
+
+ /* Game Settings */
+ //Dome
+ sce->gm.dome.angle = sce->r.domeangle;
+ sce->gm.dome.mode = sce->r.domemode;
+ sce->gm.dome.res = sce->r.domeres;
+ sce->gm.dome.resbuf = sce->r.domeresbuf;
+ sce->gm.dome.tilt = sce->r.dometilt;
+ sce->gm.dome.warptext = sce->r.dometext;
+
+ //Stand Alone
+ sce->gm.fullscreen = sce->r.fullscreen;
+ sce->gm.xplay = sce->r.xplay;
+ sce->gm.yplay = sce->r.yplay;
+ sce->gm.freqplay = sce->r.freqplay;
+ sce->gm.depth = sce->r.depth;
+ sce->gm.attrib = sce->r.attrib;
+
+ //Stereo
+ sce->gm.xsch = sce->r.xsch;
+ sce->gm.ysch = sce->r.ysch;
+ sce->gm.stereomode = sce->r.stereomode;
+ /* reassigning stereomode NO_STEREO and DOME to a separeted flag*/
+ if (sce->gm.stereomode == 1){ //1 = STEREO_NOSTEREO
+ sce->gm.stereoflag = STEREO_NOSTEREO;
+ sce->gm.stereomode = STEREO_ANAGLYPH;
+ }
+ else if(sce->gm.stereomode == 8){ //8 = STEREO_DOME
+ sce->gm.stereoflag = STEREO_DOME;
+ sce->gm.stereomode = STEREO_ANAGLYPH;
}
+ else
+ sce->gm.stereoflag = STEREO_ENABLED;
+
+ //Framing
+ sce->gm.framing = sce->framing;
+ sce->gm.xplay = sce->r.xplay;
+ sce->gm.yplay = sce->r.yplay;
+ sce->gm.freqplay= sce->r.freqplay;
+ sce->gm.depth= sce->r.depth;
+
+ //Physic (previously stored in world)
+ sce->gm.gravity =9.8f;
+ sce->gm.physicsEngine= WOPHY_BULLET;// Bullet by default
+ sce->gm.mode = WO_DBVT_CULLING; // DBVT culling by default
+ sce->gm.occlusionRes = 128;
+ sce->gm.ticrate = 60;
+ sce->gm.maxlogicstep = 5;
+ sce->gm.physubstep = 1;
+ sce->gm.maxphystep = 5;
+ }
+ }
+
+ if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 2)) {
+ Scene *sce;
+ Object *ob;
+
+ for(sce = main->scene.first; sce; sce = sce->id.next) {
+ if(fd->fileflags & G_FILE_ENABLE_ALL_FRAMES)
+ sce->gm.flag |= GAME_ENABLE_ALL_FRAMES;
+ if(fd->fileflags & G_FILE_SHOW_DEBUG_PROPS)
+ sce->gm.flag |= GAME_SHOW_DEBUG_PROPS;
+ if(fd->fileflags & G_FILE_SHOW_FRAMERATE)
+ sce->gm.flag |= GAME_SHOW_FRAMERATE;
+ if(fd->fileflags & G_FILE_SHOW_PHYSICS)
+ sce->gm.flag |= GAME_SHOW_PHYSICS;
+ if(fd->fileflags & G_FILE_GLSL_NO_SHADOWS)
+ sce->gm.flag |= GAME_GLSL_NO_SHADOWS;
+ if(fd->fileflags & G_FILE_GLSL_NO_SHADERS)
+ sce->gm.flag |= GAME_GLSL_NO_SHADERS;
+ if(fd->fileflags & G_FILE_GLSL_NO_RAMPS)
+ sce->gm.flag |= GAME_GLSL_NO_RAMPS;
+ if(fd->fileflags & G_FILE_GLSL_NO_NODES)
+ sce->gm.flag |= GAME_GLSL_NO_NODES;
+ if(fd->fileflags & G_FILE_GLSL_NO_EXTRA_TEX)
+ sce->gm.flag |= GAME_GLSL_NO_EXTRA_TEX;
+ if(fd->fileflags & G_FILE_IGNORE_DEPRECATION_WARNINGS)
+ sce->gm.flag |= GAME_IGNORE_DEPRECATION_WARNINGS;
+
+ if(fd->fileflags & G_FILE_GAME_MAT_GLSL)
+ sce->gm.matmode= GAME_MAT_GLSL;
+ else if(fd->fileflags & G_FILE_GAME_MAT)
+ sce->gm.matmode= GAME_MAT_MULTITEX;
+ else
+ sce->gm.matmode= GAME_MAT_TEXFACE;
+
+ sce->gm.flag |= GAME_DISPLAY_LISTS;
+ }
+
+ for(ob = main->object.first; ob; ob = ob->id.next) {
+ if(ob->flag & 8192) // OB_POSEMODE = 8192
+ ob->mode |= OB_MODE_POSE;
+ }
+ }
+
+ /* put 2.50 compatibility code here until next subversion bump */
+ {
+ Scene *sce;
+ Object *ob;
+
+ for(sce = main->scene.first; sce; sce = sce->id.next)
+ if(sce->unit.scale_length == 0.0f)
+ sce->unit.scale_length= 1.0f;
+
+ for(ob = main->object.first; ob; ob = ob->id.next) {
+ FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
+ if (fluidmd) fluidmd->fss->fmd = fluidmd;
+ }
+
+ for(sce= main->scene.first; sce; sce= sce->id.next)
+ {
+ if(sce->audio.main == 0.0)
+ sce->audio.main = 1.0;
+
+ 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;
}
}
@@ -9224,7 +9776,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
// XXX
bfd->user->uifonts.first= bfd->user->uifonts.last= NULL;
bfd->user->uistyles.first= bfd->user->uistyles.last= NULL;
-
+
bhead = blo_nextbhead(fd, bhead);
/* read all attached data */
@@ -9237,7 +9789,7 @@ static BHead *read_userdef(BlendFileData *bfd, FileData *fd, BHead *bhead)
return bhead;
}
-BlendFileData *blo_read_file_internal(FileData *fd)
+BlendFileData *blo_read_file_internal(FileData *fd, char *file)
{
BHead *bhead= blo_firstbhead(fd);
BlendFileData *bfd;
@@ -9248,6 +9800,9 @@ BlendFileData *blo_read_file_internal(FileData *fd)
bfd->main->versionfile= fd->fileversion;
+ bfd->type= BLENFILETYPE_BLEND;
+ strncpy(bfd->main->name, file, sizeof(bfd->main->name)-1);
+
while(bhead) {
switch(bhead->code) {
case DATA:
@@ -9502,12 +10057,27 @@ static void expand_keyingsets(FileData *fd, Main *mainvar, ListBase *list)
}
}
+static void expand_animdata_nlastrips(FileData *fd, Main *mainvar, ListBase *list)
+{
+ NlaStrip *strip;
+
+ for (strip= list->first; strip; strip= strip->next) {
+ /* check child strips */
+ expand_animdata_nlastrips(fd, mainvar, &strip->strips);
+
+ /* relink referenced action */
+ expand_doit(fd, mainvar, strip->act);
+ }
+}
+
static void expand_animdata(FileData *fd, Main *mainvar, AnimData *adt)
{
FCurve *fcd;
+ NlaTrack *nlt;
/* own action */
expand_doit(fd, mainvar, adt->action);
+ expand_doit(fd, mainvar, adt->tmpact);
/* drivers - assume that these F-Curves have driver data to be in this list... */
for (fcd= adt->drivers.first; fcd; fcd= fcd->next) {
@@ -9517,6 +10087,10 @@ static void expand_animdata(FileData *fd, Main *mainvar, AnimData *adt)
for (dtar= driver->targets.first; dtar; dtar= dtar->next)
expand_doit(fd, mainvar, dtar->id);
}
+
+ /* nla-data - referenced actions */
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next)
+ expand_animdata_nlastrips(fd, mainvar, &nlt->strips);
}
static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSettings *part)
@@ -9526,7 +10100,8 @@ static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSetting
expand_doit(fd, mainvar, part->eff_group);
expand_doit(fd, mainvar, part->bb_ob);
- expand_animdata(fd, mainvar, part->adt);
+ if(part->adt)
+ expand_animdata(fd, mainvar, part->adt);
}
static void expand_group(FileData *fd, Main *mainvar, Group *group)
@@ -9650,6 +10225,9 @@ static void expand_mball(FileData *fd, Main *mainvar, MetaBall *mb)
for(a=0; a<mb->totcol; a++) {
expand_doit(fd, mainvar, mb->mat[a]);
}
+
+ if(mb->adt)
+ expand_animdata(fd, mainvar, mb->adt);
}
static void expand_curve(FileData *fd, Main *mainvar, Curve *cu)
@@ -9861,6 +10439,9 @@ static void expand_armature(FileData *fd, Main *mainvar, bArmature *arm)
{
Bone *curBone;
+ if(arm->adt)
+ expand_animdata(fd, mainvar, arm->adt);
+
for (curBone = arm->bonebase.first; curBone; curBone=curBone->next) {
expand_bones(fd, mainvar, curBone);
}
@@ -9895,14 +10476,15 @@ static void expand_modifier(FileData *fd, Main *mainvar, ModifierData *md)
expand_doit(fd, mainvar, dmd->map_object);
expand_doit(fd, mainvar, dmd->texture);
}
-}
-
-static void expand_scriptlink(FileData *fd, Main *mainvar, ScriptLink *slink)
-{
- int i;
-
- for(i=0; i<slink->totscript; i++) {
- expand_doit(fd, mainvar, slink->scripts[i]);
+ else if (md->type==eModifierType_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ if(smd->type==MOD_SMOKE_TYPE_DOMAIN && smd->domain)
+ {
+ expand_doit(fd, mainvar, smd->domain->coll_group);
+ expand_doit(fd, mainvar, smd->domain->fluid_group);
+ expand_doit(fd, mainvar, smd->domain->eff_group);
+ }
}
}
@@ -9928,6 +10510,8 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
expand_doit(fd, mainvar, ob->poselib);
expand_constraints(fd, mainvar, &ob->constraints);
+ expand_doit(fd, mainvar, ob->gpd);
+
// XXX depreceated - old animation system (for version patching only)
expand_doit(fd, mainvar, ob->ipo);
expand_doit(fd, mainvar, ob->action);
@@ -10006,11 +10590,19 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
bObjectActuator *oa= act->data;
expand_doit(fd, mainvar, oa->reference);
}
+ else if(act->type==ACT_ADD_OBJECT) {
+ bAddObjectActuator *aoa= act->data;
+ expand_doit(fd, mainvar, aoa->ob);
+ }
else if(act->type==ACT_SCENE) {
bSceneActuator *sa= act->data;
expand_doit(fd, mainvar, sa->camera);
expand_doit(fd, mainvar, sa->scene);
}
+ else if(act->type==ACT_2DFILTER) {
+ bTwoDFilterActuator *tdfa= act->data;
+ expand_doit(fd, mainvar, tdfa->text);
+ }
else if(act->type==ACT_ACTION) {
bActionActuator *aa= act->data;
expand_doit(fd, mainvar, aa->act);
@@ -10027,13 +10619,20 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
bMessageActuator *ma= act->data;
expand_doit(fd, mainvar, ma->toObject);
}
+ else if(act->type==ACT_PARENT) {
+ bParentActuator *pa= act->data;
+ expand_doit(fd, mainvar, pa->ob);
+ }
+ else if(act->type==ACT_ARMATURE) {
+ bArmatureActuator *arma= act->data;
+ expand_doit(fd, mainvar, arma->target);
+ }
act= act->next;
}
if(ob->pd && ob->pd->tex)
expand_doit(fd, mainvar, ob->pd->tex);
- expand_scriptlink(fd, mainvar, &ob->scriptlink);
}
static void expand_scene(FileData *fd, Main *mainvar, Scene *sce)
@@ -10063,7 +10662,10 @@ static void expand_scene(FileData *fd, Main *mainvar, Scene *sce)
}
if(sce->r.dometext)
- expand_doit(fd, mainvar, sce->r.dometext);
+ expand_doit(fd, mainvar, sce->gm.dome.warptext);
+
+ if(sce->gpd)
+ expand_doit(fd, mainvar, sce->gpd);
}
static void expand_camera(FileData *fd, Main *mainvar, Camera *ca)
@@ -10224,8 +10826,9 @@ static void give_base_to_objects(Main *mainvar, Scene *sce, Library *lib, int is
}
-static void append_named_part(FileData *fd, Main *mainvar, Scene *scene, char *name, int idcode, short flag)
+static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char *name, int idcode, short flag)
{
+ Scene *scene= CTX_data_scene(C);
Object *ob;
Base *base;
BHead *bhead;
@@ -10241,9 +10844,9 @@ static void append_named_part(FileData *fd, Main *mainvar, Scene *scene, char *n
if(strcmp(idname+2, name)==0) {
- id= is_yet_read(fd, mainvar, bhead);
+ id= is_yet_read(fd, mainl, bhead);
if(id==NULL) {
- read_libblock(fd, mainvar, bhead, LIB_TESTEXT, NULL);
+ read_libblock(fd, mainl, bhead, LIB_TESTEXT, NULL);
}
else {
printf("append: already linked\n");
@@ -10254,17 +10857,22 @@ static void append_named_part(FileData *fd, Main *mainvar, Scene *scene, char *n
}
}
- if(idcode==ID_OB) { /* loose object: give a base */
+ if(idcode==ID_OB && scene) { /* loose object: give a base */
base= MEM_callocN( sizeof(Base), "app_nam_part");
BLI_addtail(&scene->base, base);
- if(id==NULL) ob= mainvar->object.last;
+ if(id==NULL) ob= mainl->object.last;
else ob= (Object *)id;
- /* XXX use context to find view3d->lay */
- //if((flag & FILE_ACTIVELAY)) {
- // scene->lay;
- //}
+ /* link at active layer (view3d->lay if in context, else scene->lay */
+ if((flag & FILE_ACTIVELAY)) {
+ View3D *v3d = CTX_wm_view3d(C);
+ if (v3d) {
+ ob->lay = v3d->layact;
+ } else {
+ ob->lay = scene->lay;
+ }
+ }
base->lay= ob->lay;
base->object= ob;
ob->id.us++;
@@ -10283,6 +10891,12 @@ static void append_named_part(FileData *fd, Main *mainvar, Scene *scene, char *n
}
}
+void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, char *name, int idcode, short flag)
+{
+ FileData *fd= (FileData*)(*bh);
+ append_named_part(C, mainl, fd, name, idcode, flag);
+}
+
static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)
{
BHead *bhead;
@@ -10305,11 +10919,10 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)
/* common routine to append/link something from a library */
-static Library* library_append(Main *mainvar, Scene *scene, char* file, char *dir, int idcode,
- int totsel, FileData **fd, struct direntry* filelist, int totfile, short flag)
+static Main* library_append_begin(const bContext *C, FileData **fd, char *dir)
{
+ Main *mainvar= CTX_data_main(C);
Main *mainl;
- Library *curlib;
/* make mains */
blo_split_main(&(*fd)->mainlist, mainvar);
@@ -10319,19 +10932,69 @@ static Library* library_append(Main *mainvar, Scene *scene, char* file, char *di
mainl->versionfile= (*fd)->fileversion; /* needed for do_version */
- curlib= mainl->curlib;
+ return mainl;
+}
+
+Main* BLO_library_append_begin(const bContext *C, BlendHandle** bh, char *dir)
+{
+ FileData *fd= (FileData*)(*bh);
+ return library_append_begin(C, &fd, dir);
+}
+
+static void append_do_cursor(Scene *scene, Library *curlib, short flag)
+{
+ Base *centerbase;
+ Object *ob;
+ float *curs, centerloc[3], vec[3], min[3], max[3];
+ int count= 0;
+
+ /* when not linking (appending)... */
+ if(flag & FILE_LINK)
+ return;
+
+ /* we're not appending at cursor */
+ if((flag & FILE_ATCURSOR) == 0)
+ return;
- if(totsel==0) {
- append_named_part(*fd, mainl, scene, file, idcode, flag);
+ /* find the center of everything appended */
+ INIT_MINMAX(min, max);
+ centerbase= (scene->base.first);
+ while(centerbase) {
+ if(centerbase->object->id.lib==curlib && centerbase->object->parent==NULL) {
+ VECCOPY(vec, centerbase->object->loc);
+ DO_MINMAX(vec, min, max);
+ count++;
+ }
+ centerbase= centerbase->next;
}
- else {
- int a;
- for(a=0; a<totfile; a++) {
- if(filelist[a].flags & ACTIVE) {
- append_named_part(*fd, mainl, scene, filelist[a].relname, idcode, flag);
- }
+ /* we haven't found any objects to move to cursor */
+ if(!count)
+ return;
+
+ /* move from the center of the appended objects to cursor */
+ centerloc[0]= (min[0]+max[0])/2;
+ centerloc[1]= (min[1]+max[1])/2;
+ centerloc[2]= (min[2]+max[2])/2;
+ curs = scene->cursor;
+ VECSUB(centerloc,curs,centerloc);
+
+ /* now translate the center of the objects */
+ centerbase= (scene->base.first);
+ while(centerbase) {
+ if(centerbase->object->id.lib==curlib && centerbase->object->parent==NULL) {
+ ob= centerbase->object;
+ ob->loc[0] += centerloc[0];
+ ob->loc[1] += centerloc[1];
+ ob->loc[2] += centerloc[2];
}
+ centerbase= centerbase->next;
}
+}
+
+static void library_append_end(const bContext *C, Main *mainl, FileData **fd, int idcode, short flag)
+{
+ Main *mainvar= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
/* make main consistant */
expand_main(*fd, mainl);
@@ -10339,6 +11002,7 @@ static Library* library_append(Main *mainvar, Scene *scene, char* file, char *di
/* do this when expand found other libs */
read_libraries(*fd, &(*fd)->mainlist);
+ /* make the lib path relative if required */
if(flag & FILE_STRINGCODE) {
/* use the full path, this could have been read by other library even */
@@ -10356,14 +11020,16 @@ static Library* library_append(Main *mainvar, Scene *scene, char* file, char *di
fix_relpaths_library(G.sce, 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(idcode==ID_GR) {
- if (flag & FILE_LINK) {
- give_base_to_objects(mainvar, scene, NULL, 0);
+ if(scene) {
+ if(idcode==ID_GR) {
+ if (flag & FILE_LINK) {
+ give_base_to_objects(mainvar, scene, NULL, 0);
+ } else {
+ give_base_to_objects(mainvar, scene, mainl->curlib, 1);
+ }
} else {
- give_base_to_objects(mainvar, scene, curlib, 1);
- }
- } else {
- give_base_to_objects(mainvar, scene, NULL, 0);
+ give_base_to_objects(mainvar, scene, NULL, 0);
+ }
}
/* has been removed... erm, why? s..ton) */
/* 20040907: looks like they are give base already in append_named_part(); -Nathan L */
@@ -10375,14 +11041,23 @@ static Library* library_append(Main *mainvar, Scene *scene, char* file, char *di
*fd = NULL;
}
- return curlib;
+ append_do_cursor(scene, mainl->curlib, flag);
+}
+
+void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag)
+{
+ FileData *fd= (FileData*)(*bh);
+ library_append_end(C, mainl, &fd, idcode, flag);
+ *bh= (BlendHandle*)fd;
}
/* this is a version of BLO_library_append needed by the BPython API, so
* scripts can load data from .blend files -- see Blender.Library module.*/
/* append to scene */
/* this should probably be moved into the Python code anyway */
-
+/* 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,
int idcode, short flag, Main *mainvar, Scene *scene, ReportList *reports)
{
@@ -10394,92 +11069,12 @@ void BLO_script_library_append(BlendHandle **bh, char *dir, char *name,
if(fd) fd->reports= NULL;
/* do we need to do this? */
- DAG_scene_sort(scene);
+ if(scene)
+ DAG_scene_sort(scene);
*bh= (BlendHandle*)fd;
}
-
-/* append to scene */
-void BLO_library_append(BlendHandle** bh, struct direntry* filelist, int totfile,
- char *dir, char* file, short flag, int idcode, Main *mainvar, Scene *scene, ReportList *reports)
-{
- FileData *fd= (FileData*)(*bh);
- Library *curlib;
- Base *centerbase;
- Object *ob;
- int a, totsel=0;
-
- /* are there files selected? */
- for(a=0; a<totfile; a++) {
- if(filelist[a].flags & ACTIVE) {
- totsel++;
- }
- }
-
- if(totsel==0) {
- /* is the indicated file in the filelist? */
- if(file[0]) {
- for(a=0; a<totfile; a++) {
- if( strcmp(filelist[a].relname, file)==0) break;
- }
- if(a==totfile) {
- BKE_report(reports, RPT_ERROR, "Wrong indicated name");
- return;
- }
- }
- else {
- BKE_report(reports, RPT_ERROR, "Nothing indicated");
- return;
- }
- }
- /* now we have or selected, or an indicated file */
-
- if(flag & FILE_AUTOSELECT) scene_deselect_all(scene);
-
- fd->reports= reports;
- curlib = library_append(mainvar, scene, file, dir, idcode, totsel, &fd, filelist, totfile,flag );
- if(fd) fd->reports= NULL;
-
- *bh= (BlendHandle*)fd;
-
- /* when not linking (appending)... */
- if((flag & FILE_LINK)==0) {
- if(flag & FILE_ATCURSOR) {
- float *curs, centerloc[3], vec[3], min[3], max[3];
- int count= 0;
-
- INIT_MINMAX(min, max);
-
- centerbase= (scene->base.first);
- while(centerbase) {
- if(centerbase->object->id.lib==curlib && centerbase->object->parent==NULL) {
- VECCOPY(vec, centerbase->object->loc);
- DO_MINMAX(vec, min, max);
- count++;
- }
- centerbase= centerbase->next;
- }
- if(count) {
- centerloc[0]= (min[0]+max[0])/2;
- centerloc[1]= (min[1]+max[1])/2;
- centerloc[2]= (min[2]+max[2])/2;
- curs = scene->cursor;
- VECSUB(centerloc,curs,centerloc);
-
- centerbase= (scene->base.first);
- while(centerbase) {
- if(centerbase->object->id.lib==curlib && centerbase->object->parent==NULL) {
- ob= centerbase->object;
- ob->loc[0] += centerloc[0];
- ob->loc[1] += centerloc[1];
- ob->loc[2] += centerloc[2];
- }
- centerbase= centerbase->next;
- }
- }
- }
- }
-}
+#endif
/* ************* READ LIBRARY ************** */
@@ -10523,9 +11118,10 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
printf("read library: lib %s\n", mainptr->curlib->name);
fd= blo_openblenderfile(mainptr->curlib->filename, &reports);
- fd->reports= basefd->reports;
if (fd) {
+ fd->reports= basefd->reports;
+
if (fd->libmap)
oldnewmap_free(fd->libmap);
@@ -10639,7 +11235,7 @@ BlendFileData *blo_read_blendafterruntime(int file, char *name, int actualsize,
return NULL;
fd->reports= reports;
- bfd= blo_read_file_internal(fd);
+ bfd= blo_read_file_internal(fd, "");
blo_freefiledata(fd);
return bfd;
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index f0e00b75b67..2a0b6c327d3 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -69,6 +69,7 @@ typedef struct FileData {
int fileversion;
int id_name_offs; /* used to retrieve ID names from (bhead+1) */
+ int globalf, fileflags; /* for do_versions patching */
struct OldNewMap *datamap;
struct OldNewMap *globmap;
@@ -107,7 +108,7 @@ struct Main;
void blo_join_main(ListBase *mainlist);
void blo_split_main(ListBase *mainlist, struct Main *main);
-BlendFileData *blo_read_file_internal(FileData *fd);
+BlendFileData *blo_read_file_internal(FileData *fd, char *file);
FileData *blo_openblenderfile(char *name, struct ReportList *reports);
FileData *blo_openblendermemory(void *buffer, int buffersize, struct ReportList *reports);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index ef1e7d70a1e..fda35d28d0e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -72,27 +72,28 @@ Any case: direct data is ALWAYS after the lib block
#include <config.h>
#endif
+#include <math.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
#include "zlib.h"
#ifndef WIN32
#include <unistd.h>
#else
#include "winsock2.h"
-#include "BLI_winstuff.h"
#include <io.h>
#include <process.h> // for getpid
+#include "BLI_winstuff.h"
#endif
-#include <math.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_action_types.h"
#include "DNA_actuator_types.h"
+#include "DNA_boid_types.h"
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
#include "DNA_cloth_types.h"
@@ -129,6 +130,7 @@ Any case: direct data is ALWAYS after the lib block
#include "DNA_sdna_types.h"
#include "DNA_sequence_types.h"
#include "DNA_sensor_types.h"
+#include "DNA_smoke_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
#include "DNA_sound_types.h"
@@ -155,6 +157,7 @@ Any case: direct data is ALWAYS after the lib block
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_packedFile.h" // for packAll
+#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_screen.h" // for waitcursor
#include "BKE_sequence.h"
@@ -404,13 +407,13 @@ static void IDP_WriteIDPArray(IDProperty *prop, void *wd)
{
/*REMEMBER to set totalen to len in the linking code!!*/
if (prop->data.pointer) {
- IDProperty **array = prop->data.pointer;
+ IDProperty *array = prop->data.pointer;
int a;
- writedata(wd, DATA, MEM_allocN_len(prop->data.pointer), prop->data.pointer);
+ writestruct(wd, DATA, "IDProperty", prop->len, array);
for(a=0; a<prop->len; a++)
- IDP_WriteProperty(array[a], wd);
+ IDP_WriteProperty_OnlyData(&array[a], wd);
}
}
@@ -497,12 +500,6 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
writestruct(wd, DATA, "bNodeLink", 1, link);
}
-static void write_scriptlink(WriteData *wd, ScriptLink *slink)
-{
- writedata(wd, DATA, sizeof(void *)*slink->totscript, slink->scripts);
- writedata(wd, DATA, sizeof(short)*slink->totscript, slink->flag);
-}
-
static void current_screen_compat(Main *mainvar, bScreen **screen)
{
wmWindowManager *wm;
@@ -550,19 +547,63 @@ static void write_userdef(WriteData *wd)
}
}
+static void write_boid_state(WriteData *wd, BoidState *state)
+{
+ BoidRule *rule = state->rules.first;
+ //BoidCondition *cond = state->conditions.first;
+
+ writestruct(wd, DATA, "BoidState", 1, state);
+
+ for(; rule; rule=rule->next) {
+ switch(rule->type) {
+ case eBoidRuleType_Goal:
+ case eBoidRuleType_Avoid:
+ writestruct(wd, DATA, "BoidRuleGoalAvoid", 1, rule);
+ break;
+ case eBoidRuleType_AvoidCollision:
+ writestruct(wd, DATA, "BoidRuleAvoidCollision", 1, rule);
+ break;
+ case eBoidRuleType_FollowLeader:
+ writestruct(wd, DATA, "BoidRuleFollowLeader", 1, rule);
+ break;
+ case eBoidRuleType_AverageSpeed:
+ writestruct(wd, DATA, "BoidRuleAverageSpeed", 1, rule);
+ break;
+ case eBoidRuleType_Fight:
+ writestruct(wd, DATA, "BoidRuleFight", 1, rule);
+ break;
+ default:
+ writestruct(wd, DATA, "BoidRule", 1, rule);
+ break;
+ }
+ }
+ //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
-static void write_pointcaches(WriteData *wd, PointCache *cache, int type)
+#define PTCACHE_WRITE_CLOTH 1
+static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
{
- writestruct(wd, DATA, "PointCache", 1, cache);
+ PointCache *cache = ptcaches->first;
+ int i;
+
+ for(; cache; cache=cache->next) {
+ writestruct(wd, DATA, "PointCache", 1, cache);
- if((cache->flag & PTCACHE_DISK_CACHE)==0) {
- PTCacheMem *pm = cache->mem_cache.first;
+ if((cache->flag & PTCACHE_DISK_CACHE)==0) {
+ PTCacheMem *pm = cache->mem_cache.first;
- for(; pm; pm=pm->next) {
- writestruct(wd, DATA, "PTCacheMem", 1, pm);
- if(type==PTCACHE_WRITE_PSYS)
- writestruct(wd, DATA, "ParticleKey", pm->totpoint, pm->data);
+ for(; pm; pm=pm->next) {
+ writestruct(wd, DATA, "PTCacheMem", 1, pm);
+ if(pm->index_array)
+ writedata(wd, DATA, sizeof(int) * pm->totpoint, pm->index_array);
+
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(pm->data[i] && pm->data_types & (1<<i))
+ writedata(wd, DATA, BKE_ptcache_data_size(i) * pm->totpoint, pm->data[i]);
+ }
+ }
}
}
}
@@ -579,6 +620,15 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
if (part->adt) write_animdata(wd, part->adt);
writestruct(wd, DATA, "PartDeflect", 1, part->pd);
writestruct(wd, DATA, "PartDeflect", 1, part->pd2);
+
+ if(part->boids && part->phystype == PART_PHYS_BOIDS) {
+ BoidState *state = part->boids->states.first;
+
+ writestruct(wd, DATA, "BoidSettings", 1, part->boids);
+
+ for(; state; state=state->next)
+ write_boid_state(wd, state);
+ }
}
part= part->id.next;
}
@@ -586,6 +636,7 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
static void write_particlesystems(WriteData *wd, ListBase *particles)
{
ParticleSystem *psys= particles->first;
+ ParticleTarget *pt;
int a;
for(; psys; psys=psys->next) {
@@ -600,11 +651,23 @@ static void write_particlesystems(WriteData *wd, ListBase *particles)
for(a=0; a<psys->totpart; a++, pa++)
writestruct(wd, DATA, "HairKey", pa->totkey, pa->hair);
}
+
+ if(psys->particles->boid && psys->part->phystype == PART_PHYS_BOIDS)
+ writestruct(wd, DATA, "BoidParticle", psys->totpart, psys->particles->boid);
}
+ pt = psys->targets.first;
+ for(; pt; pt=pt->next)
+ writestruct(wd, DATA, "ParticleTarget", 1, pt);
+
if(psys->child) writestruct(wd, DATA, "ChildParticle", psys->totchild ,psys->child);
- writestruct(wd, DATA, "SoftBody", 1, psys->soft);
- if(psys->soft) write_pointcaches(wd, psys->soft->pointcache, PTCACHE_WRITE_PSYS);
- write_pointcaches(wd, psys->pointcache, PTCACHE_WRITE_PSYS);
+
+ if(psys->clmd) {
+ writestruct(wd, DATA, "ClothModifierData", 1, psys->clmd);
+ writestruct(wd, DATA, "ClothSimSettings", 1, psys->clmd->sim_parms);
+ writestruct(wd, DATA, "ClothCollSettings", 1, psys->clmd->coll_parms);
+ }
+
+ write_pointcaches(wd, &psys->ptcaches);
}
}
@@ -649,6 +712,9 @@ static void write_sensors(WriteData *wd, ListBase *lb)
case SENS_PROPERTY:
writestruct(wd, DATA, "bPropertySensor", 1, sens->data);
break;
+ case SENS_ARMATURE:
+ writestruct(wd, DATA, "bArmatureSensor", 1, sens->data);
+ break;
case SENS_ACTUATOR:
writestruct(wd, DATA, "bActuatorSensor", 1, sens->data);
break;
@@ -722,9 +788,6 @@ static void write_actuators(WriteData *wd, ListBase *lb)
case ACT_SOUND:
writestruct(wd, DATA, "bSoundActuator", 1, act->data);
break;
- case ACT_CD:
- writestruct(wd, DATA, "bCDActuator", 1, act->data);
- break;
case ACT_OBJECT:
writestruct(wd, DATA, "bObjectActuator", 1, act->data);
break;
@@ -770,6 +833,9 @@ static void write_actuators(WriteData *wd, ListBase *lb)
case ACT_STATE:
writestruct(wd, DATA, "bStateActuator", 1, act->data);
break;
+ case ACT_ARMATURE:
+ writestruct(wd, DATA, "bArmatureActuator", 1, act->data);
+ break;
default:
; /* error: don't know how to write this file */
}
@@ -778,10 +844,59 @@ 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;
- FModifier *fcm;
for (fcu=fcurves->first; fcu; fcu=fcu->next) {
/* F-Curve */
@@ -812,50 +927,8 @@ static void write_fcurves(WriteData *wd, ListBase *fcurves)
}
}
- /* Modifiers */
- for (fcm= fcu->modifiers.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);
- }
+ /* write F-Modifiers */
+ write_fmodifiers(wd, &fcu->modifiers);
}
}
@@ -906,6 +979,37 @@ static void write_keyingsets(WriteData *wd, ListBase *list)
}
}
+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;
@@ -917,14 +1021,17 @@ static void write_animdata(WriteData *wd, AnimData *adt)
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 */
- // XXX todo...
+ write_nladata(wd, &adt->nla_tracks);
}
static void write_constraints(WriteData *wd, ListBase *conlist)
@@ -992,8 +1099,16 @@ static void write_pose(WriteData *wd, bPose *pose)
for (grp=pose->agroups.first; grp; grp=grp->next)
writestruct(wd, DATA, "bActionGroup", 1, grp);
+ /* write IK param */
+ if (pose->ikparam) {
+ const char *structname = get_ikparam_name(pose);
+ if (structname)
+ writestruct(wd, DATA, structname, 1, pose->ikparam);
+ }
+
/* Write this pose */
writestruct(wd, DATA, "bPose", 1, pose);
+
}
static void write_defgroups(WriteData *wd, ListBase *defbase)
@@ -1004,7 +1119,7 @@ static void write_defgroups(WriteData *wd, ListBase *defbase)
writestruct(wd, DATA, "bDeformGroup", 1, defgroup);
}
-static void write_modifiers(WriteData *wd, ListBase *modbase, int write_undo)
+static void write_modifiers(WriteData *wd, ListBase *modbase)
{
ModifierData *md;
@@ -1025,7 +1140,25 @@ static void write_modifiers(WriteData *wd, ListBase *modbase, int write_undo)
writestruct(wd, DATA, "ClothSimSettings", 1, clmd->sim_parms);
writestruct(wd, DATA, "ClothCollSettings", 1, clmd->coll_parms);
- writestruct(wd, DATA, "PointCache", 1, clmd->point_cache);
+ write_pointcaches(wd, &clmd->ptcaches);
+ }
+ else if(md->type==eModifierType_Smoke) {
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain);
+ 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;
@@ -1058,13 +1191,13 @@ static void write_modifiers(WriteData *wd, ListBase *modbase, int write_undo)
else if (md->type==eModifierType_Multires) {
MultiresModifierData *mmd = (MultiresModifierData*) md;
- if(mmd->undo_verts && write_undo)
+ if(mmd->undo_verts)
writestruct(wd, DATA, "MVert", mmd->undo_verts_tot, mmd->undo_verts);
}
}
}
-static void write_objects(WriteData *wd, ListBase *idbase, int write_undo)
+static void write_objects(WriteData *wd, ListBase *idbase)
{
Object *ob;
@@ -1082,23 +1215,23 @@ static void write_objects(WriteData *wd, ListBase *idbase, int write_undo)
/* direct data */
writedata(wd, DATA, sizeof(void *)*ob->totcol, ob->mat);
+ writedata(wd, DATA, sizeof(char)*ob->totcol, ob->matbits);
/* write_effects(wd, &ob->effect); */ /* not used anymore */
write_properties(wd, &ob->prop);
write_sensors(wd, &ob->sensors);
write_controllers(wd, &ob->controllers);
write_actuators(wd, &ob->actuators);
- write_scriptlink(wd, &ob->scriptlink);
write_pose(wd, ob->pose);
write_defgroups(wd, &ob->defbase);
write_constraints(wd, &ob->constraints);
writestruct(wd, DATA, "PartDeflect", 1, ob->pd);
writestruct(wd, DATA, "SoftBody", 1, ob->soft);
- if(ob->soft) writestruct(wd, DATA, "PointCache", 1, ob->soft->pointcache);
+ if(ob->soft) write_pointcaches(wd, &ob->soft->ptcaches);
writestruct(wd, DATA, "BulletSoftBody", 1, ob->bsoft);
write_particlesystems(wd, &ob->particlesystem);
- write_modifiers(wd, &ob->modifiers, write_undo);
+ write_modifiers(wd, &ob->modifiers);
}
ob= ob->id.next;
}
@@ -1175,9 +1308,6 @@ static void write_cameras(WriteData *wd, ListBase *idbase)
if (cam->id.properties) IDP_WriteProperty(cam->id.properties, wd);
if (cam->adt) write_animdata(wd, cam->adt);
-
- /* direct data */
- write_scriptlink(wd, &cam->scriptlink);
}
cam= cam->id.next;
@@ -1198,6 +1328,7 @@ static void write_mballs(WriteData *wd, ListBase *idbase)
/* direct data */
writedata(wd, DATA, sizeof(void *)*mb->totcol, mb->mat);
+ if (mb->adt) write_animdata(wd, mb->adt);
ml= mb->elems.first;
while(ml) {
@@ -1246,7 +1377,7 @@ static void write_curves(WriteData *wd, ListBase *idbase)
}
nu= cu->nurb.first;
while(nu) {
- if( (nu->type & 7)==CU_BEZIER)
+ if(nu->type == CU_BEZIER)
writestruct(wd, DATA, "BezTriple", nu->pntsu, nu->bezt);
else {
writestruct(wd, DATA, "BPoint", nu->pntsu*nu->pntsv, nu->bp);
@@ -1436,7 +1567,10 @@ static void write_images(WriteData *wd, ListBase *idbase)
write_previews(wd, ima->preview);
- }
+ /* exception: render text only saved in undo files (wd->current) */
+ if (ima->render_text && wd->current)
+ writedata(wd, DATA, IMA_RW_MAXTEXT, ima->render_text);
+ }
ima= ima->id.next;
}
/* flush helps the compression for undo-save */
@@ -1460,6 +1594,11 @@ static void write_textures(WriteData *wd, ListBase *idbase)
if(tex->type == TEX_PLUGIN && tex->plugin) writestruct(wd, DATA, "PluginTex", 1, tex->plugin);
if(tex->coba) writestruct(wd, DATA, "ColorBand", 1, tex->coba);
if(tex->type == TEX_ENVMAP && tex->env) writestruct(wd, DATA, "EnvMap", 1, tex->env);
+ if(tex->type == TEX_POINTDENSITY && tex->pd) {
+ writestruct(wd, DATA, "PointDensity", 1, tex->pd);
+ if(tex->pd->coba) writestruct(wd, DATA, "ColorBand", 1, tex->pd->coba);
+ }
+ if(tex->type == TEX_VOXELDATA && tex->vd) writestruct(wd, DATA, "VoxelData", 1, tex->vd);
/* nodetree is integral part of texture, no libdata */
if(tex->nodetree) {
@@ -1502,8 +1641,6 @@ static void write_materials(WriteData *wd, ListBase *idbase)
if(ma->ramp_col) writestruct(wd, DATA, "ColorBand", 1, ma->ramp_col);
if(ma->ramp_spec) writestruct(wd, DATA, "ColorBand", 1, ma->ramp_spec);
- write_scriptlink(wd, &ma->scriptlink);
-
/* nodetree is integral part of material, no libdata */
if(ma->nodetree) {
writestruct(wd, DATA, "bNodeTree", 1, ma->nodetree);
@@ -1534,8 +1671,6 @@ static void write_worlds(WriteData *wd, ListBase *idbase)
if(wrld->mtex[a]) writestruct(wd, DATA, "MTex", 1, wrld->mtex[a]);
}
- write_scriptlink(wd, &wrld->scriptlink);
-
write_previews(wd, wrld->preview);
}
wrld= wrld->id.next;
@@ -1564,8 +1699,6 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
if(la->curfalloff)
write_curvemapping(wd, la->curfalloff);
- write_scriptlink(wd, &la->scriptlink);
-
write_previews(wd, la->preview);
}
@@ -1573,6 +1706,11 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
}
}
+static void write_paint(WriteData *wd, Paint *p)
+{
+ if(p && p->brushes)
+ writedata(wd, DATA, p->brush_count * sizeof(Brush*), p->brushes);
+}
static void write_scenes(WriteData *wd, ListBase *scebase)
{
@@ -1585,6 +1723,7 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
TimeMarker *marker;
TransformOrientation *ts;
SceneRenderLayer *srl;
+ ToolSettings *tos;
sce= scebase->first;
while(sce) {
@@ -1602,13 +1741,22 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
base= base->next;
}
- writestruct(wd, DATA, "ToolSettings", 1, sce->toolsettings);
- if(sce->toolsettings->vpaint)
- writestruct(wd, DATA, "VPaint", 1, sce->toolsettings->vpaint);
- if(sce->toolsettings->wpaint)
- writestruct(wd, DATA, "VPaint", 1, sce->toolsettings->wpaint);
- if(sce->toolsettings->sculpt)
- writestruct(wd, DATA, "Sculpt", 1, sce->toolsettings->sculpt);
+ tos = sce->toolsettings;
+ writestruct(wd, DATA, "ToolSettings", 1, tos);
+ if(tos->vpaint) {
+ writestruct(wd, DATA, "VPaint", 1, tos->vpaint);
+ write_paint(wd, &tos->vpaint->paint);
+ }
+ if(tos->wpaint) {
+ writestruct(wd, DATA, "VPaint", 1, tos->wpaint);
+ write_paint(wd, &tos->wpaint->paint);
+ }
+ if(tos->sculpt) {
+ writestruct(wd, DATA, "Sculpt", 1, tos->sculpt);
+ write_paint(wd, &tos->sculpt->paint);
+ }
+
+ write_paint(wd, &tos->imapaint.paint);
ed= sce->ed;
if(ed) {
@@ -1677,8 +1825,6 @@ static void write_scenes(WriteData *wd, ListBase *scebase)
}
}
- write_scriptlink(wd, &sce->scriptlink);
-
if (sce->r.avicodecdata) {
writestruct(wd, DATA, "AviCodecData", 1, sce->r.avicodecdata);
if (sce->r.avicodecdata->lpFormat) writedata(wd, DATA, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat);
@@ -1820,9 +1966,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
writestruct(wd, DATA, "Panel", 1, pa);
}
- /* space handler scriptlinks */
- write_scriptlink(wd, &sa->scriptlink);
-
sl= sa->spacedata.first;
while(sl) {
for(ar= sl->regionbase.first; ar; ar= ar->next)
@@ -1893,7 +2036,10 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
writestruct(wd, DATA, "SpaceSound", 1, sl);
}
else if(sl->spacetype==SPACE_NLA){
- writestruct(wd, DATA, "SpaceNla", 1, sl);
+ SpaceNla *snla= (SpaceNla *)sl;
+
+ writestruct(wd, DATA, "SpaceNla", 1, snla);
+ if(snla->ads) writestruct(wd, DATA, "bDopeSheet", 1, snla->ads);
}
else if(sl->spacetype==SPACE_TIME){
writestruct(wd, DATA, "SpaceTime", 1, sl);
@@ -1904,6 +2050,13 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
else if(sl->spacetype==SPACE_LOGIC){
writestruct(wd, DATA, "SpaceLogic", 1, sl);
}
+ else if(sl->spacetype==SPACE_CONSOLE) {
+ writestruct(wd, DATA, "SpaceConsole", 1, sl);
+ }
+ else if(sl->spacetype==SPACE_USERPREF) {
+ writestruct(wd, DATA, "SpaceUserPref", 1, sl);
+ }
+
sl= sl->next;
}
}
@@ -1977,6 +2130,8 @@ static void write_armatures(WriteData *wd, ListBase *idbase)
writestruct(wd, ID_AR, "bArmature", 1, arm);
if (arm->id.properties) IDP_WriteProperty(arm->id.properties, wd);
+ if (arm->adt) write_animdata(wd, arm->adt);
+
/* Direct data */
bone= arm->bonebase.first;
while(bone) {
@@ -2039,45 +2194,21 @@ static void write_texts(WriteData *wd, ListBase *idbase)
static void write_sounds(WriteData *wd, ListBase *idbase)
{
bSound *sound;
- bSample *sample;
PackedFile * pf;
- // set all samples to unsaved status
-
- sample = samples->first; // samples is a global defined in sound.c
- while (sample) {
- sample->flags |= SAMPLE_NEEDS_SAVE;
- sample = sample->id.next;
- }
-
sound= idbase->first;
while(sound) {
if(sound->id.us>0 || wd->current) {
- // do we need to save the packedfile as well ?
- sample = sound->sample;
- if (sample) {
- if (sample->flags & SAMPLE_NEEDS_SAVE) {
- sound->newpackedfile = sample->packedfile;
- sample->flags &= ~SAMPLE_NEEDS_SAVE;
- } else {
- sound->newpackedfile = NULL;
- }
- }
-
/* write LibData */
writestruct(wd, ID_SO, "bSound", 1, sound);
if (sound->id.properties) IDP_WriteProperty(sound->id.properties, wd);
- if (sound->newpackedfile) {
- pf = sound->newpackedfile;
+ if (sound->packedfile) {
+ pf = sound->packedfile;
writestruct(wd, DATA, "PackedFile", 1, pf);
writedata(wd, DATA, pf->size, pf->data);
}
-
- if (sample) {
- sound->newpackedfile = sample->packedfile;
- }
}
sound= sound->id.next;
}
@@ -2221,7 +2352,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil
write_groups (wd, &mainvar->group);
write_armatures(wd, &mainvar->armature);
write_actions (wd, &mainvar->action);
- write_objects (wd, &mainvar->object, (current != NULL));
+ write_objects (wd, &mainvar->object);
write_materials(wd, &mainvar->mat);
write_textures (wd, &mainvar->tex);
write_meshs (wd, &mainvar->mesh);
diff --git a/source/blender/blenpluginapi/CMakeLists.txt b/source/blender/blenpluginapi/CMakeLists.txt
index 856fb931e9d..1c5e2697c01 100644
--- a/source/blender/blenpluginapi/CMakeLists.txt
+++ b/source/blender/blenpluginapi/CMakeLists.txt
@@ -27,12 +27,12 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . .. ../../../intern/guardedalloc ../blenlib ../imbuf ../makesdna
+ . .. ../../../intern/guardedalloc ../blenlib ../imbuf ../makesdna
)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
BLENDERLIB(bf_blenpluginapi "${SRC}" "${INC}")
diff --git a/source/blender/blenpluginapi/SConscript b/source/blender/blenpluginapi/SConscript
index 776c188d73b..af69b4519b4 100644
--- a/source/blender/blenpluginapi/SConscript
+++ b/source/blender/blenpluginapi/SConscript
@@ -11,4 +11,4 @@ if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
incs += ' ' + env['BF_QUICKTIME_INC']
-env.BlenderLib ( libname = 'bf_blenpluginapi', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'player'], priority = [170, 35] )
+env.BlenderLib ( libname = 'bf_blenpluginapi', sources = sources, includes = Split(incs), defines = defs, libtype=['core'], priority = [170] )
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 914fdaa4bc6..d13d7ce2ff2 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -27,56 +27,65 @@
FILE(GLOB SRC */*.c)
SET(INC ../windowmanager
- ../editors/include
- ../../../intern/guardedalloc ../../../intern/memutil
- ../blenlib ../makesdna ../makesrna ../blenkernel
- ../include ../imbuf ../render/extern/include
- ../../../intern/bsp/extern ../radiosity/extern/include
- ../../../intern/decimation/extern ../blenloader ../python
- ../../kernel/gen_system ../../../intern/SoundSystem ../readstreamglue
- ../quicktime ../../../intern/elbeem/extern
- ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include
- ../nodes
- ../gpu
- ../blenfont
- ${SDL_INC}
+ ../editors/include
+ ../../../intern/guardedalloc ../../../intern/memutil
+ ../blenlib ../makesdna ../makesrna ../blenkernel
+ ../include ../imbuf ../render/extern/include
+ ../../../intern/bsp/extern
+ ../../../intern/decimation/extern ../blenloader ../python
+ ../../kernel/gen_system ../readstreamglue
+ ../../../intern/elbeem/extern
+ ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include ../../../intern/smoke/extern
+ ../../../intern/audaspace/intern
+ ../nodes
+ ../gpu
+ ../blenfont
+ ../ikplugin
)
+IF(WITH_GAMEENGINE)
+ ADD_DEFINITIONS(-DGAMEBLENDER)
+ENDIF(WITH_GAMEENGINE)
+
IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
+ ADD_DEFINITIONS(-DINTERNATIONAL)
ENDIF(WITH_INTERNATIONAL)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
+ ADD_DEFINITIONS(-DWITH_OPENJPEG)
ENDIF(WITH_OPENJPEG)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
+IF(NOT WITH_ELBEEM)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_ELBEEM)
+
IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
+ SET(INC ${INC} ${PYTHON_INC})
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
+ SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
# TODO buildinfo
IF(BF_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
+ ADD_DEFINITIONS(-DNAN_BUILDINFO)
ENDIF(BF_BUILDINFO)
BLENDERLIB_NOLIST(bf_editors "${SRC}" "${INC}")
diff --git a/source/blender/editors/Makefile b/source/blender/editors/Makefile
index 62bf612b09d..6a9d695ab0e 100644
--- a/source/blender/editors/Makefile
+++ b/source/blender/editors/Makefile
@@ -1,5 +1,7 @@
+# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
+# vim: tabstop=8
#
-# $Id: Makefile
+# $Id$
#
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -29,6 +31,41 @@
# Bounces make to subdirectories.
SOURCEDIR = source/blender/editors
-DIRS = armature mesh animation object sculpt_paint datafiles transform screen curve gpencil physics preview uvedit space_outliner space_time space_view3d interface util space_api 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
+DIRS = armature \
+ mesh \
+ animation \
+ object \
+ sculpt_paint \
+ datafiles \
+ transform \
+ screen \
+ curve \
+ metaball \
+ gpencil \
+ physics \
+ preview \
+ 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/SConscript b/source/blender/editors/SConscript
index 9baaf7ae7a5..ccffbdb15d5 100644
--- a/source/blender/editors/SConscript
+++ b/source/blender/editors/SConscript
@@ -9,11 +9,13 @@ SConscript(['datafiles/SConscript',
'animation/SConscript',
'armature/SConscript',
'mesh/SConscript',
+ 'metaball/SConscript',
'object/SConscript',
'curve/SConscript',
'gpencil/SConscript',
'physics/SConscript',
'preview/SConscript',
+ 'sound/SConscript',
'space_buttons/SConscript',
'space_file/SConscript',
'space_image/SConscript',
@@ -30,6 +32,8 @@ SConscript(['datafiles/SConscript',
'space_text/SConscript',
'space_sequencer/SConscript',
'space_logic/SConscript',
+ 'space_console/SConscript',
+ 'space_userpref/SConscript',
'transform/SConscript',
'screen/SConscript',
'sculpt_paint/SConscript',
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
new file mode 100644
index 00000000000..7f0f2411bd0
--- /dev/null
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -0,0 +1,2337 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_key.h"
+#include "BKE_material.h"
+#include "BKE_object.h"
+#include "BKE_context.h"
+#include "BKE_utildefines.h"
+
+#include "UI_interface.h"
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h" // XXX move the select modes out of there!
+#include "ED_screen.h"
+#include "ED_space_api.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* *********************************************** */
+// XXX constant defines to be moved elsewhere?
+
+/* extra padding for lengths (to go under scrollers) */
+#define EXTRA_SCROLL_PAD 100.0f
+
+/* size of indent steps */
+#define INDENT_STEP_SIZE 7
+
+/* macros used for type defines */
+ /* get the pointer used for some flag */
+#define GET_ACF_FLAG_PTR(ptr) \
+ { \
+ *type= sizeof((ptr)); \
+ return &(ptr); \
+ }
+
+
+/* XXX */
+extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
+extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
+
+
+/* *********************************************** */
+/* Generic Functions (Type independent) */
+
+/* Draw Backdrop ---------------------------------- */
+
+/* backdrop for top-level widgets (Scene and Object only) */
+static void acf_generic_root_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ View2D *v2d= &ac->ar->v2d;
+ short expanded= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_EXPAND) != 0;
+ short offset= (acf->get_offset) ? acf->get_offset(ac, ale) : 0;
+
+ /* darker blue for top-level widgets */
+ UI_ThemeColor(TH_DOPESHEET_CHANNELOB);
+
+ /* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
+ uiSetRoundBox((expanded)? (1):(1|8));
+ gl_round_box(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
+}
+
+/* backdrop for data expanders under top-level Scene/Object */
+static void acf_generic_dataexpand_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ View2D *v2d= &ac->ar->v2d;
+ short offset= (acf->get_offset) ? acf->get_offset(ac, ale) : 0;
+
+ /* lighter color than top-level widget */
+ UI_ThemeColor(TH_DOPESHEET_CHANNELSUBOB);
+
+ /* no rounded corner - just rectangular box */
+ glRectf(offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc);
+}
+
+/* backdrop for generic channels */
+static void acf_generic_channel_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ View2D *v2d= &ac->ar->v2d;
+ SpaceAction *saction = NULL;
+ bActionGroup *grp = NULL;
+ short indent= (acf->get_indent_level) ? acf->get_indent_level(ac, ale) : 0;
+ short offset= (acf->get_offset) ? acf->get_offset(ac, ale) : 0;
+
+ /* get context info needed... */
+ if ((ac->sa) && (ac->sa->spacetype == SPACE_ACTION))
+ saction= (SpaceAction *)ac->sa->spacedata.first;
+
+ if (ale->type == ANIMTYPE_FCURVE) {
+ FCurve *fcu= (FCurve *)ale->data;
+ grp= fcu->grp;
+ }
+
+ /* set color for normal channels
+ * - use 3 shades of color group/standard color for 3 indention level
+ * - only use group colors if allowed to, and if actually feasible
+ */
+ if ( (saction && !(saction->flag & SACTION_NODRAWGCOLORS)) &&
+ ((grp) && (grp->customCol)) )
+ {
+ char cp[3];
+
+ if (indent == 2) {
+ VECCOPY(cp, grp->cs.solid);
+ }
+ else if (indent == 1) {
+ VECCOPY(cp, grp->cs.select);
+ }
+ else {
+ VECCOPY(cp, grp->cs.active);
+ }
+
+ glColor3ub(cp[0], cp[1], cp[2]);
+ }
+ else // FIXME: what happens when the indention is 1 greater than what it should be (due to grouping)?
+ UI_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40));
+
+ /* no rounded corners - just rectangular box */
+ glRectf(offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc);
+}
+
+/* Indention + Offset ------------------------------------------- */
+
+/* indention level is always the value in the name */
+static short acf_generic_indention_0(bAnimContext *ac, bAnimListElem *ale)
+{
+ return 0;
+}
+static short acf_generic_indention_1(bAnimContext *ac, bAnimListElem *ale)
+{
+ return 1;
+}
+#if 0 // XXX not used
+static short acf_generic_indention_2(bAnimContext *ac, bAnimListElem *ale)
+{
+ return 2;
+}
+#endif
+
+/* indention which varies with the grouping status */
+static short acf_generic_indention_flexible(bAnimContext *ac, bAnimListElem *ale)
+{
+ short indent= 0;
+
+ if (ale->id) {
+ /* special exception for materials and particles */
+ if (ELEM(GS(ale->id->name),ID_MA,ID_PA))
+ indent++;
+ }
+
+ /* grouped F-Curves need extra level of indention */
+ if (ale->type == ANIMTYPE_FCURVE) {
+ FCurve *fcu= (FCurve *)ale->data;
+
+ // TODO: we need some way of specifying that the indention color should be one less...
+ if (fcu->grp)
+ indent++;
+ }
+
+ /* no indention */
+ return indent;
+}
+
+/* basic offset for channels derived from indention */
+static short acf_generic_basic_offset(bAnimContext *ac, bAnimListElem *ale)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+
+ if (acf && acf->get_indent_level)
+ return acf->get_indent_level(ac, ale) * INDENT_STEP_SIZE;
+ else
+ return 0;
+}
+
+/* offset for groups + grouped entities */
+static short acf_generic_group_offset(bAnimContext *ac, bAnimListElem *ale)
+{
+ short offset= acf_generic_basic_offset(ac, ale);
+
+ if (ale->id) {
+ /* special exception for materials and particles */
+ if (ELEM(GS(ale->id->name),ID_MA,ID_PA))
+ offset += 21;
+
+ /* if not in Action Editor mode, groupings must carry some offset too... */
+ else if (ac->datatype != ANIMCONT_ACTION)
+ offset += 14;
+ }
+
+ /* offset is just the normal type - i.e. based on indention */
+ return offset;
+}
+
+/* Name ------------------------------------------- */
+
+/* name for ID block entries */
+static void acf_generic_idblock_name(bAnimListElem *ale, char *name)
+{
+ ID *id= (ID *)ale->data; /* data pointed to should be an ID block */
+
+ /* just copy the name... */
+ if (id && name)
+ strcpy(name, id->name+2);
+}
+
+/* Settings ------------------------------------------- */
+
+/* check if some setting exists for this object-based data-expander (category only) */
+static short acf_generic_dsexpand_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ switch (setting) {
+ /* only expand supported */
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ /* visible - only available in Graph Editor */
+ case ACHANNEL_SETTING_VISIBLE:
+ return ((ac) && (ac->spacetype == SPACE_IPO));
+
+ default:
+ return 0;
+ }
+}
+
+/* get pointer to the setting (category only) */
+static void *acf_generic_dsexpand_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Object *ob= (Object *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(ob->nlaflag); // XXX
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* 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)
+{
+ switch (setting) {
+ /* expand is always supported */
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ /* mute is only supported for NLA */
+ case ACHANNEL_SETTING_MUTE:
+ return ((ac) && (ac->spacetype == SPACE_NLA));
+
+ /* other flags are never supported */
+ default:
+ return 0;
+ }
+}
+
+/* *********************************************** */
+/* Type Specific Functions + Defines */
+
+/* Scene ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_scene_icon(bAnimListElem *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)
+{
+ switch (setting) {
+ /* muted only in NLA */
+ case ACHANNEL_SETTING_MUTE:
+ return ((ac) && (ac->spacetype == SPACE_NLA));
+
+ /* visible only in Graph Editor */
+ case ACHANNEL_SETTING_VISIBLE:
+ return ((ac) && (ac->spacetype == SPACE_IPO));
+
+ /* only select and expand supported otherwise */
+ case ACHANNEL_SETTING_SELECT:
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_scene_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return SCE_DS_SELECTED;
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return SCE_DS_COLLAPSED;
+
+ 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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_scene_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Scene *scene= (Scene *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ GET_ACF_FLAG_PTR(scene->flag);
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(scene->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (scene->adt)
+ GET_ACF_FLAG_PTR(scene->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* scene type define */
+static bAnimChannelType ACF_SCENE =
+{
+ acf_generic_root_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ NULL, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_scene_icon, /* icon */
+
+ acf_scene_setting_valid, /* has setting */
+ acf_scene_setting_flag, /* flag for setting */
+ acf_scene_setting_ptr /* pointer for setting */
+};
+
+/* Object ------------------------------------------- */
+
+static int acf_object_icon(bAnimListElem *ale)
+{
+ Base *base= (Base *)ale->data;
+ Object *ob= base->object;
+
+ /* icon depends on object-type */
+ if (ob->type == OB_ARMATURE)
+ return ICON_ARMATURE_DATA;
+ else
+ return ICON_OBJECT_DATA;
+}
+
+/* name for object */
+static void acf_object_name(bAnimListElem *ale, char *name)
+{
+ Base *base= (Base *)ale->data;
+ Object *ob= base->object;
+
+ /* just copy the name... */
+ if (ob && name)
+ strcpy(name, ob->id.name+2);
+}
+
+/* check if some setting exists for this channel */
+static short acf_object_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ switch (setting) {
+ /* muted only in NLA */
+ case ACHANNEL_SETTING_MUTE:
+ return ((ac) && (ac->spacetype == SPACE_NLA));
+
+ /* visible only in Graph Editor */
+ case ACHANNEL_SETTING_VISIBLE:
+ return ((ac) && (ac->spacetype == SPACE_IPO));
+
+ /* only select and expand supported otherwise */
+ case ACHANNEL_SETTING_SELECT:
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_object_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return SELECT;
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return OB_ADS_COLLAPSED;
+
+ 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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_object_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Base *base= (Base *)ale->data;
+ Object *ob= base->object;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ GET_ACF_FLAG_PTR(ob->flag);
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(ob->nlaflag); // xxx
+
+ case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (ob->adt)
+ GET_ACF_FLAG_PTR(ob->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* object type define */
+static bAnimChannelType ACF_OBJECT =
+{
+ acf_generic_root_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ NULL, /* offset */
+
+ acf_object_name, /* name */
+ acf_object_icon, /* icon */
+
+ acf_object_setting_valid, /* has setting */
+ acf_object_setting_flag, /* flag for setting */
+ acf_object_setting_ptr /* pointer for setting */
+};
+
+/* Group ------------------------------------------- */
+
+/* backdrop for group widget */
+static void acf_group_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ View2D *v2d= &ac->ar->v2d;
+ short expanded= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_EXPAND) != 0;
+ short offset= (acf->get_offset) ? acf->get_offset(ac, ale) : 0;
+
+ /* only for action group channels */
+ if (ale->flag & AGRP_ACTIVE)
+ UI_ThemeColorShade(TH_GROUP_ACTIVE, 10);
+ else
+ UI_ThemeColorShade(TH_GROUP, 20);
+
+ /* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
+ uiSetRoundBox((expanded)? (1):(1|8));
+ gl_round_box(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
+}
+
+/* name for group entries */
+static void acf_group_name(bAnimListElem *ale, char *name)
+{
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+
+ /* just copy the name... */
+ if (agrp && name)
+ strcpy(name, agrp->name);
+}
+
+/* check if some setting exists for this channel */
+static short acf_group_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ /* for now, all settings are supported, though some are only conditionally */
+ switch (setting) {
+ case ACHANNEL_SETTING_VISIBLE: /* Only available in Graph Editor */
+ return ((ac->sa) && (ac->sa->spacetype==SPACE_IPO));
+
+ default: /* always supported */
+ return 1;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_group_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return AGRP_SELECTED;
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return AGRP_EXPANDED;
+
+ case ACHANNEL_SETTING_MUTE: /* muted */
+ return AGRP_MUTED;
+
+ case ACHANNEL_SETTING_PROTECT: /* protected */
+ //*neg= 1; - if we change this to edtiability
+ return AGRP_PROTECTED;
+
+ case ACHANNEL_SETTING_VISIBLE: /* visiblity - graph editor */
+ *neg= 1;
+ return AGRP_NOTVISIBLE;
+ }
+
+ /* this shouldn't happen */
+ return 0;
+}
+
+/* get pointer to the setting */
+static void *acf_group_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+
+ /* all flags are just in agrp->flag for now... */
+ GET_ACF_FLAG_PTR(agrp->flag);
+}
+
+/* group type define */
+static bAnimChannelType ACF_GROUP =
+{
+ acf_group_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ acf_generic_group_offset, /* offset */
+
+ acf_group_name, /* name */
+ NULL, /* icon */
+
+ acf_group_setting_valid, /* has setting */
+ acf_group_setting_flag, /* flag for setting */
+ acf_group_setting_ptr /* pointer for setting */
+};
+
+/* F-Curve ------------------------------------------- */
+
+/* name for fcurve entries */
+static void acf_fcurve_name(bAnimListElem *ale, char *name)
+{
+ getname_anim_fcurve(name, ale->id, ale->data);
+}
+
+/* check if some setting exists for this channel */
+static short acf_fcurve_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ FCurve *fcu= (FCurve *)ale->data;
+
+ switch (setting) {
+ /* unsupported */
+ case ACHANNEL_SETTING_EXPAND: /* F-Curves are not containers */
+ return 0;
+
+ /* conditionally available */
+ case ACHANNEL_SETTING_PROTECT: /* Protection is only valid when there's keyframes */
+ if (fcu->bezt)
+ return 1;
+ else
+ return 0; // NOTE: in this special case, we need to draw ICON_ZOOMOUT
+
+ case ACHANNEL_SETTING_VISIBLE: /* Only available in Graph Editor */
+ return ((ac->sa) && (ac->sa->spacetype==SPACE_IPO));
+
+ /* always available */
+ default:
+ return 1;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_fcurve_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return FCURVE_SELECTED;
+
+ case ACHANNEL_SETTING_MUTE: /* muted */
+ return FCURVE_MUTED;
+
+ case ACHANNEL_SETTING_PROTECT: /* protected */
+ //*neg= 1; - if we change this to edtiability
+ return FCURVE_PROTECTED;
+
+ case ACHANNEL_SETTING_VISIBLE: /* visiblity - graph editor */
+ return FCURVE_VISIBLE;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_fcurve_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ FCurve *fcu= (FCurve *)ale->data;
+
+ /* all flags are just in agrp->flag for now... */
+ GET_ACF_FLAG_PTR(fcu->flag);
+}
+
+/* fcurve type define */
+static bAnimChannelType ACF_FCURVE =
+{
+ acf_generic_channel_backdrop, /* backdrop */
+ acf_generic_indention_flexible, /* indent level */ // xxx rename this to f-curves only?
+ acf_generic_group_offset, /* offset */
+
+ acf_fcurve_name, /* name */
+ NULL, /* icon */
+
+ acf_fcurve_setting_valid, /* has setting */
+ acf_fcurve_setting_flag, /* flag for setting */
+ acf_fcurve_setting_ptr /* pointer for setting */
+};
+
+/* Object Action Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_fillactd_icon(bAnimListElem *ale)
+{
+ return ICON_ACTION;
+}
+
+/* check if some setting exists for this channel */
+static short acf_fillactd_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ switch (setting) {
+ /* only select and expand supported */
+ case ACHANNEL_SETTING_SELECT:
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_fillactd_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return ACT_SELECTED;
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return ACT_COLLAPSED;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_fillactd_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ bAction *act= (bAction *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ GET_ACF_FLAG_PTR(act->flag);
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(act->flag);
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* object action expander type define */
+static bAnimChannelType ACF_FILLACTD =
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_fillactd_icon, /* icon */
+
+ acf_fillactd_setting_valid, /* has setting */
+ acf_fillactd_setting_flag, /* flag for setting */
+ acf_fillactd_setting_ptr /* pointer for setting */
+};
+
+/* Drivers Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_filldrivers_icon(bAnimListElem *ale)
+{
+ return ICON_ANIM_DATA;
+}
+
+static void acf_filldrivers_name(bAnimListElem *ale, char *name)
+{
+ strcpy(name, "Drivers");
+}
+
+/* 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)
+{
+ switch (setting) {
+ /* only expand supported */
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_filldrivers_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return ADT_DRIVERS_COLLAPSED;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_filldrivers_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ AnimData *adt= (AnimData *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(adt->flag);
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* drivers expander type define */
+static bAnimChannelType ACF_FILLDRIVERS =
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_filldrivers_name, /* name */
+ acf_filldrivers_icon, /* icon */
+
+ acf_filldrivers_setting_valid, /* has setting */
+ acf_filldrivers_setting_flag, /* flag for setting */
+ acf_filldrivers_setting_ptr /* pointer for setting */
+};
+
+/* Materials Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_fillmatd_icon(bAnimListElem *ale)
+{
+ return ICON_MATERIAL_DATA;
+}
+
+static void acf_fillmatd_name(bAnimListElem *ale, char *name)
+{
+ strcpy(name, "Materials");
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_fillmatd_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return OB_ADS_SHOWMATS;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* materials expander type define */
+static bAnimChannelType ACF_FILLMATD=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_fillmatd_name, /* name */
+ acf_fillmatd_icon, /* icon */
+
+ acf_generic_dsexpand_setting_valid, /* has setting */
+ acf_fillmatd_setting_flag, /* flag for setting */
+ acf_generic_dsexpand_setting_ptr /* pointer for setting */
+};
+
+/* Particles Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_fillpartd_icon(bAnimListElem *ale)
+{
+ return ICON_PARTICLE_DATA;
+}
+
+static void acf_fillpartd_name(bAnimListElem *ale, char *name)
+{
+ strcpy(name, "Particles");
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_fillpartd_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ *neg= 1;
+ return OB_ADS_SHOWPARTS;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* particles expander type define */
+static bAnimChannelType ACF_FILLPARTD=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_fillpartd_name, /* name */
+ acf_fillpartd_icon, /* icon */
+
+ acf_generic_dsexpand_setting_valid, /* has setting */
+ acf_fillpartd_setting_flag, /* flag for setting */
+ acf_generic_dsexpand_setting_ptr /* pointer for setting */
+};
+
+/* Material Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dsmat_icon(bAnimListElem *ale)
+{
+ return ICON_MATERIAL_DATA;
+}
+
+/* offset for material expanders */
+static short acf_dsmat_offset(bAnimContext *ac, bAnimListElem *ale)
+{
+ return 21;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dsmat_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return MA_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dsmat_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Material *ma= (Material *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(ma->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (ma->adt)
+ GET_ACF_FLAG_PTR(ma->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* material expander type define */
+static bAnimChannelType ACF_DSMAT=
+{
+ acf_generic_channel_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ acf_dsmat_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dsmat_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dsmat_setting_flag, /* flag for setting */
+ acf_dsmat_setting_ptr /* pointer for setting */
+};
+
+/* Lamp Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dslam_icon(bAnimListElem *ale)
+{
+ return ICON_LAMP_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dslam_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return LA_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dslam_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Lamp *la= (Lamp *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(la->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (la->adt)
+ GET_ACF_FLAG_PTR(la->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* lamp expander type define */
+static bAnimChannelType ACF_DSLAM=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dslam_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dslam_setting_flag, /* flag for setting */
+ acf_dslam_setting_ptr /* pointer for setting */
+};
+
+/* Camera Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dscam_icon(bAnimListElem *ale)
+{
+ return ICON_CAMERA_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dscam_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return CAM_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dscam_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Camera *ca= (Camera *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(ca->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (ca->adt)
+ GET_ACF_FLAG_PTR(ca->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* camera expander type define */
+static bAnimChannelType ACF_DSCAM=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dscam_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dscam_setting_flag, /* flag for setting */
+ acf_dscam_setting_ptr /* pointer for setting */
+};
+
+/* Curve Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dscur_icon(bAnimListElem *ale)
+{
+ return ICON_CURVE_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dscur_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return CU_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dscur_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Curve *cu= (Curve *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(cu->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (cu->adt)
+ GET_ACF_FLAG_PTR(cu->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* curve expander type define */
+static bAnimChannelType ACF_DSCUR=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dscur_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dscur_setting_flag, /* flag for setting */
+ acf_dscur_setting_ptr /* pointer for setting */
+};
+
+/* Shape Key Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dsskey_icon(bAnimListElem *ale)
+{
+ return ICON_SHAPEKEY_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dsskey_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return KEYBLOCK_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dsskey_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Key *key= (Key *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(key->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (key->adt)
+ GET_ACF_FLAG_PTR(key->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* shapekey expander type define */
+static bAnimChannelType ACF_DSSKEY=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dsskey_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dsskey_setting_flag, /* flag for setting */
+ acf_dsskey_setting_ptr /* pointer for setting */
+};
+
+/* World Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dswor_icon(bAnimListElem *ale)
+{
+ return ICON_WORLD_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dswor_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return WO_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dswor_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ World *wo= (World *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(wo->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (wo->adt)
+ GET_ACF_FLAG_PTR(wo->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* world expander type define */
+static bAnimChannelType ACF_DSWOR=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dswor_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dswor_setting_flag, /* flag for setting */
+ acf_dswor_setting_ptr /* pointer for setting */
+};
+
+/* Particle Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dspart_icon(bAnimListElem *ale)
+{
+ return ICON_PARTICLE_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dspart_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return PART_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dspart_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ ParticleSettings *part= (ParticleSettings *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(part->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (part->adt)
+ GET_ACF_FLAG_PTR(part->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* particle expander type define */
+static bAnimChannelType ACF_DSPART=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dspart_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dspart_setting_flag, /* flag for setting */
+ acf_dspart_setting_ptr /* pointer for setting */
+};
+
+/* MetaBall Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dsmball_icon(bAnimListElem *ale)
+{
+ return ICON_META_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dsmball_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return MB_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dsmball_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ MetaBall *mb= (MetaBall *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(mb->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (mb->adt)
+ GET_ACF_FLAG_PTR(mb->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* metaball expander type define */
+static bAnimChannelType ACF_DSMBALL=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dsmball_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dsmball_setting_flag, /* flag for setting */
+ acf_dsmball_setting_ptr /* pointer for setting */
+};
+
+/* Armature Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dsarm_icon(bAnimListElem *ale)
+{
+ return ICON_ARMATURE_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dsarm_setting_flag(int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return ARM_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;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dsarm_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ bArmature *arm= (bArmature *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(arm->flag);
+
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (arm->adt)
+ GET_ACF_FLAG_PTR(arm->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* metaball expander type define */
+static bAnimChannelType ACF_DSARM=
+{
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dsarm_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dsarm_setting_flag, /* flag for setting */
+ acf_dsarm_setting_ptr /* pointer for setting */
+};
+
+
+/* ShapeKey Entry ------------------------------------------- */
+// XXX ... this is currently obsolete...
+
+#if 0
+static void dummy_olddraw_shapekeys ()
+{
+ case ANIMTYPE_SHAPEKEY: /* shapekey channel */
+ {
+ KeyBlock *kb = (KeyBlock *)ale->data;
+
+ indent = 0;
+ special = -1;
+
+ offset= (ale->id) ? 21 : 0;
+
+ if (kb->name[0] == '\0')
+ sprintf(name, "Key %d", ale->index);
+ else
+ strcpy(name, kb->name);
+ }
+ break;
+}
+#endif
+
+/* Grease Pencil entries ------------------------------------------- */
+// XXX ... this is currently not restored yet
+
+#if 0
+static void dummy_olddraw_gpencil ()
+{
+ /* determine what needs to be drawn */
+ switch (ale->type) {
+ case ANIMTYPE_GPDATABLOCK: /* gpencil datablock */
+ {
+ bGPdata *gpd = (bGPdata *)ale->data;
+ ScrArea *sa = (ScrArea *)ale->owner;
+
+ indent = 0;
+ group= 3;
+
+ /* 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;
+ }
+
+ switch (sa->spacetype) {
+ case SPACE_VIEW3D:
+ {
+ /* this shouldn't cause any overflow... */
+ //sprintf(name, "3DView:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func..
+ strcpy(name, "3dView");
+ 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_NODE;
+ }
+ 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;
+
+ indent = 0;
+ special = -1;
+ expand = -1;
+ group = 1;
+
+ 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;
+
+ 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);
+ }
+}
+#endif
+
+/* *********************************************** */
+/* Type Registration and General Access */
+
+/* These globals only ever get directly accessed in this file */
+static bAnimChannelType *animchannelTypeInfo[ANIMTYPE_NUM_TYPES];
+static short ACF_INIT= 1; /* when non-zero, the list needs to be updated */
+
+/* Initialise type info definitions */
+void ANIM_init_channel_typeinfo_data (void)
+{
+ int type= 0;
+
+ /* start initialising if necessary... */
+ if (ACF_INIT) {
+ ACF_INIT= 0;
+
+ animchannelTypeInfo[type++]= NULL; /* None */
+ animchannelTypeInfo[type++]= NULL; /* AnimData */
+ animchannelTypeInfo[type++]= NULL; /* Special */
+
+ animchannelTypeInfo[type++]= &ACF_SCENE; /* Scene */
+ animchannelTypeInfo[type++]= &ACF_OBJECT; /* Object */
+ animchannelTypeInfo[type++]= &ACF_GROUP; /* Group */
+ animchannelTypeInfo[type++]= &ACF_FCURVE; /* F-Curve */
+
+ animchannelTypeInfo[type++]= &ACF_FILLACTD; /* Object Action Expander */
+ animchannelTypeInfo[type++]= &ACF_FILLDRIVERS; /* Drivers Expander */
+ animchannelTypeInfo[type++]= &ACF_FILLMATD; /* Materials Expander */
+ animchannelTypeInfo[type++]= &ACF_FILLPARTD; /* Particles Expander */
+
+ animchannelTypeInfo[type++]= &ACF_DSMAT; /* Material Channel */
+ animchannelTypeInfo[type++]= &ACF_DSLAM; /* Lamp Channel */
+ animchannelTypeInfo[type++]= &ACF_DSCAM; /* Camera Channel */
+ animchannelTypeInfo[type++]= &ACF_DSCUR; /* Curve Channel */
+ animchannelTypeInfo[type++]= &ACF_DSSKEY; /* ShapeKey Channel */
+ animchannelTypeInfo[type++]= &ACF_DSWOR; /* World Channel */
+ animchannelTypeInfo[type++]= &ACF_DSPART; /* Particle Channel */
+ animchannelTypeInfo[type++]= &ACF_DSMBALL; /* MetaBall Channel */
+ animchannelTypeInfo[type++]= &ACF_DSARM; /* Armature Channel */
+
+ animchannelTypeInfo[type++]= NULL; /* ShapeKey */ // XXX this is no longer used for now...
+
+ // XXX not restored yet
+ animchannelTypeInfo[type++]= NULL; /* Grease Pencil Datablock */
+ animchannelTypeInfo[type++]= NULL; /* Grease Pencil Layer */
+
+ // TODO: these types still need to be implemented!!!
+ // probably need a few extra flags for these special cases...
+ animchannelTypeInfo[type++]= NULL; /* NLA Track */
+ animchannelTypeInfo[type++]= NULL; /* NLA Action */
+ }
+}
+
+/* Get type info from given channel type */
+bAnimChannelType *ANIM_channel_get_typeinfo (bAnimListElem *ale)
+{
+ /* santiy checks */
+ if (ale == NULL)
+ return NULL;
+
+ /* init the typeinfo if not available yet... */
+ ANIM_init_channel_typeinfo_data();
+
+ /* check if type is in bounds... */
+ if ((ale->type >= 0) && (ale->type < ANIMTYPE_NUM_TYPES))
+ return animchannelTypeInfo[ale->type];
+ else
+ return NULL;
+}
+
+/* --------------------------- */
+
+/* Check if some setting for a channel is enabled
+ * Returns: 1 = On, 0 = Off, -1 = Invalid
+ */
+short ANIM_channel_setting_get (bAnimContext *ac, bAnimListElem *ale, int setting)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+
+ /* 1) check that the setting exists for the current context */
+ if ( (acf) && (!acf->has_setting || acf->has_setting(ac, ale, setting)) )
+ {
+ /* 2) get pointer to check for flag in, and the flag to check for */
+ short negflag, ptrsize;
+ int flag;
+ void *ptr;
+
+ flag= acf->setting_flag(setting, &negflag);
+ ptr= acf->setting_ptr(ale, setting, &ptrsize);
+
+ /* check if flag is enabled */
+ if (ptr && flag) {
+ switch (ptrsize) {
+ case sizeof(int): /* integer pointer for setting */
+ {
+ int *val= (int *)ptr;
+
+ if (negflag)
+ return ((*val) & flag) == 0;
+ else
+ return ((*val) & flag) != 0;
+ }
+ break;
+
+ case sizeof(short): /* short pointer for setting */
+ {
+ short *val= (short *)ptr;
+
+ if (negflag)
+ return ((*val) & flag) == 0;
+ else
+ return ((*val) & flag) != 0;
+ }
+ break;
+
+ case sizeof(char): /* char pointer for setting */
+ {
+ char *val= (char *)ptr;
+
+ if (negflag)
+ return ((*val) & flag) == 0;
+ else
+ return ((*val) & flag) != 0;
+ }
+ break;
+ }
+ }
+ }
+
+ /* not found... */
+ return -1;
+}
+
+
+/* quick macro for use in ANIM_channel_setting_set - set flag for setting according the mode given */
+#define ACF_SETTING_SET(sval, sflag, smode) \
+ {\
+ if (negflag) {\
+ if (smode == ACHANNEL_SETFLAG_TOGGLE) (sval) ^= (sflag); \
+ else if (smode == ACHANNEL_SETFLAG_ADD) (sval) &= ~(sflag); \
+ else (sval) |= (sflag); \
+ } \
+ else {\
+ if (smode == ACHANNEL_SETFLAG_TOGGLE) (sval) ^= (sflag); \
+ else if (smode == ACHANNEL_SETFLAG_ADD) (sval) |= (sflag); \
+ else (sval) &= ~(sflag); \
+ }\
+ }
+
+/* Change value of some setting for a channel
+ * - setting: eAnimChannel_Settings
+ * - mode: eAnimChannels_SetFlag
+ */
+void ANIM_channel_setting_set (bAnimContext *ac, bAnimListElem *ale, int setting, short mode)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+
+ /* 1) check that the setting exists for the current context */
+ if ( (acf) && (!acf->has_setting || acf->has_setting(ac, ale, setting)) )
+ {
+ /* 2) get pointer to check for flag in, and the flag to check for */
+ short negflag, ptrsize;
+ int flag;
+ void *ptr;
+
+ flag= acf->setting_flag(setting, &negflag);
+ ptr= acf->setting_ptr(ale, setting, &ptrsize);
+
+ /* check if flag is enabled */
+ if (ptr && flag) {
+ switch (ptrsize) {
+ case sizeof(int): /* integer pointer for setting */
+ {
+ int *val= (int *)ptr;
+ ACF_SETTING_SET(*val, flag, mode);
+ }
+ break;
+
+ case sizeof(short): /* short pointer for setting */
+ {
+ short *val= (short *)ptr;
+ ACF_SETTING_SET(*val, flag, mode);
+ }
+ break;
+
+ case sizeof(char): /* char pointer for setting */
+ {
+ char *val= (char *)ptr;
+ ACF_SETTING_SET(*val, flag, mode);
+ }
+ break;
+ }
+ }
+ }
+}
+
+/* --------------------------- */
+
+// XXX hardcoded size of icons
+#define ICON_WIDTH 17
+// XXX hardcoded width of sliders
+#define SLIDER_WIDTH 70
+
+/* Draw the given channel */
+// TODO: make this use UI controls for the buttons
+void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ short selected, offset;
+ float y, ymid, ytext;
+
+ /* sanity checks - don't draw anything */
+ if ELEM(NULL, acf, ale)
+ return;
+
+ /* get initial offset */
+ if (acf->get_offset)
+ offset= acf->get_offset(ac, ale);
+ else
+ offset= 0;
+
+ /* calculate appropriate y-coordinates for icon buttons
+ * 7 is hardcoded factor for half-height of icons
+ */
+ y= (ymaxc - yminc)/2 + yminc;
+ ymid= y - 7;
+ /* y-coordinates for text is only 4 down from middle */
+ ytext= y - 4;
+
+ /* check if channel is selected */
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT))
+ selected= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT);
+ else
+ selected= 0;
+
+ /* set blending again, as may not be set in previous step */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ /* step 1) draw backdrop ........................................... */
+ if (acf->draw_backdrop)
+ acf->draw_backdrop(ac, ale, yminc, ymaxc);
+
+ /* step 2) draw expand widget ....................................... */
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_EXPAND)) {
+ /* just skip - drawn as widget now */
+ offset += ICON_WIDTH;
+ }
+
+ /* step 3) draw icon ............................................... */
+ if (acf->icon) {
+ UI_icon_draw(offset, ymid, acf->icon(ale));
+ offset += ICON_WIDTH;
+ }
+
+ /* step 4) draw special toggles .................................
+ * - in Graph Editor, checkboxes for visibility in curves area
+ * - in NLA Editor, glowing dots for solo/not solo...
+ */
+ if (ac->sa) {
+ if ((ac->spacetype == SPACE_IPO) && acf->has_setting(ac, ale, ACHANNEL_SETTING_VISIBLE)) {
+ /* for F-Curves, draw color-preview of curve behind checkbox */
+ if (ale->type == ANIMTYPE_FCURVE) {
+ FCurve *fcu= (FCurve *)ale->data;
+
+ /* F-Curve channels need to have a special 'color code' box drawn, which is colored with whatever
+ * color the curve has stored
+ */
+ glColor3fv(fcu->color);
+
+ /* just a solid color rect
+ * hardcoded 17 pixels width is slightly wider than icon width, so that
+ * there's a slight border around it
+ */
+ glRectf(offset, yminc, offset+17, ymaxc);
+ }
+
+ /* icon is drawn as widget now... */
+ offset += ICON_WIDTH;
+ }
+ else if ((ac->spacetype == SPACE_NLA) && acf->has_setting(ac, ale, ACHANNEL_SETTING_SOLO)) {
+ /* just skip - drawn as widget now */
+ offset += ICON_WIDTH;
+ }
+ }
+
+ /* step 5) draw name ............................................... */
+ if (acf->name) {
+ char name[256]; /* hopefully this will be enough! */
+
+ /* set text color */
+ if (selected)
+ UI_ThemeColor(TH_TEXT_HI);
+ else
+ UI_ThemeColor(TH_TEXT);
+
+ /* get name */
+ acf->name(ale, name);
+
+ offset += 3;
+ UI_DrawString(offset, ytext, name);
+ }
+}
+
+/* ------------------ */
+
+/* callback for widget settings - send notifiers */
+static void achannel_setting_widget_cb(bContext *C, void *poin, void *poin2)
+{
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
+}
+
+/* callback for widget sliders - insert keyframes */
+static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poin)
+{
+ ID *id= (ID *)id_poin;
+ FCurve *fcu= (FCurve *)fcu_poin;
+
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA id_ptr, ptr;
+ PropertyRNA *prop;
+ short flag=0, done=0;
+ float cfra;
+
+ /* get current frame */
+ // NOTE: this will do for now...
+ cfra= (float)CFRA;
+
+ /* get flags for keyframing */
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ flag |= INSERTKEY_NEEDED;
+ if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ flag |= INSERTKEY_MATRIX;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+ flag |= INSERTKEY_REPLACE;
+
+
+ /* get RNA pointer, and resolve the path */
+ RNA_id_pointer_create(id, &id_ptr);
+
+ /* try to resolve the path stored in the F-Curve */
+ if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
+ /* set the special 'replace' flag if on a keyframe */
+ if (fcurve_frame_has_keyframe(fcu, cfra, 0))
+ flag |= INSERTKEY_REPLACE;
+
+ /* insert a keyframe for this F-Curve */
+ done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+
+ if (done)
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
+ }
+}
+
+
+
+/* Draw a widget for some setting */
+static void draw_setting_widget (bAnimContext *ac, bAnimListElem *ale, bAnimChannelType *acf, uiBlock *block, int xpos, int ypos, int setting)
+{
+ short negflag, ptrsize, enabled, butType;
+ int flag, icon;
+ void *ptr;
+ char *tooltip;
+ uiBut *but = NULL;
+
+ /* get the flag and the pointer to that flag */
+ flag= acf->setting_flag(setting, &negflag);
+ ptr= acf->setting_ptr(ale, setting, &ptrsize);
+ enabled= ANIM_channel_setting_get(ac, ale, setting);
+
+ /* get the base icon for the setting */
+ switch (setting) {
+ case ACHANNEL_SETTING_VISIBLE: /* visibility checkboxes */
+ //icon= ((enabled)? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT);
+ icon= ICON_CHECKBOX_DEHLT;
+
+ if (ale->type == ANIMTYPE_FCURVE)
+ tooltip= "F-Curve is visible in Graph Editor for editing.";
+ else
+ tooltip= "F-Curve(s) are visible in Graph Editor for editing.";
+ break;
+
+ case ACHANNEL_SETTING_EXPAND: /* expanded triangle */
+ //icon= ((enabled)? ICON_TRIA_DOWN : ICON_TRIA_RIGHT);
+ icon= ICON_TRIA_RIGHT;
+ tooltip= "Make channels grouped under this channel visible.";
+ break;
+
+ case ACHANNEL_SETTING_SOLO: /* NLA Tracks only */
+ //icon= ((enabled)? ICON_LAYER_ACTIVE : ICON_LAYER_USED);
+ icon= ICON_LAYER_USED;
+ tooltip= "NLA Track is the only one evaluated for the AnimData block it belongs to.";
+ break;
+
+ /* --- */
+
+ case ACHANNEL_SETTING_PROTECT: /* protected lock */
+ // TODO: what about when there's no protect needed?
+ //icon= ((enabled)? ICON_LOCKED : ICON_UNLOCKED);
+ icon= ICON_UNLOCKED;
+ tooltip= "Editability of keyframes for this channel.";
+ break;
+
+ case ACHANNEL_SETTING_MUTE: /* muted eye */
+ //icon= ((enabled)? ICON_MUTE_IPO_ON : ICON_MUTE_IPO_OFF);
+ icon= ICON_MUTE_IPO_OFF;
+
+ if (ale->type == ALE_FCURVE)
+ tooltip= "Does F-Curve contribute to result.";
+ else
+ tooltip= "Do channels contribute to result.";
+ break;
+
+ default:
+ tooltip= NULL;
+ icon= 0;
+ break;
+ }
+
+ /* type of button */
+ if (negflag)
+ butType= ICONTOGN;
+ else
+ butType= ICONTOG;
+
+ /* draw button for setting */
+ if (ptr && flag) {
+ switch (ptrsize) {
+ case sizeof(int): /* integer pointer for setting */
+ but= uiDefIconButBitI(block, butType, flag, 0, icon,
+ xpos, ypos, ICON_WIDTH, ICON_WIDTH, ptr, 0, 0, 0, 0, tooltip);
+ break;
+
+ case sizeof(short): /* short pointer for setting */
+ but= uiDefIconButBitS(block, butType, flag, 0, icon,
+ xpos, ypos, ICON_WIDTH, ICON_WIDTH, ptr, 0, 0, 0, 0, tooltip);
+ break;
+
+ case sizeof(char): /* char pointer for setting */
+ but= uiDefIconButBitC(block, butType, flag, 0, icon,
+ xpos, ypos, ICON_WIDTH, ICON_WIDTH, ptr, 0, 0, 0, 0, tooltip);
+ break;
+ }
+
+ /* set call to send relevant notifiers */
+ // NOTE: for now, we only need to send 'edited'
+ if (but)
+ uiButSetFunc(but, achannel_setting_widget_cb, NULL, NULL);
+ }
+}
+
+/* Draw UI widgets the given channel */
+// TODO: make this use UI controls for the buttons
+void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *block, float yminc, float ymaxc)
+{
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ View2D *v2d= &ac->ar->v2d;
+ float y, ymid, ytext;
+ short offset;
+
+ /* sanity checks - don't draw anything */
+ if ELEM3(NULL, acf, ale, block)
+ return;
+
+ /* get initial offset */
+ if (acf->get_offset)
+ offset= acf->get_offset(ac, ale);
+ else
+ offset= 0;
+
+ /* calculate appropriate y-coordinates for icon buttons
+ * 7 is hardcoded factor for half-height of icons
+ */
+ y= (ymaxc - yminc)/2 + yminc;
+ ymid= y - 7;
+ /* y-coordinates for text is only 4 down from middle */
+ ytext= y - 4;
+
+ /* no button backdrop behind icons */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ /* step 1) draw expand widget ....................................... */
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_EXPAND)) {
+ draw_setting_widget(ac, ale, acf, block, offset, ymid, ACHANNEL_SETTING_EXPAND);
+ offset += ICON_WIDTH;
+ }
+
+ /* step 2) draw icon ............................................... */
+ if (acf->icon) {
+ /* icon is not drawn here (not a widget) */
+ offset += ICON_WIDTH;
+ }
+
+ /* step 3) draw special toggles .................................
+ * - in Graph Editor, checkboxes for visibility in curves area
+ * - in NLA Editor, glowing dots for solo/not solo...
+ */
+ if (ac->sa) {
+ if ((ac->spacetype == SPACE_IPO) && acf->has_setting(ac, ale, ACHANNEL_SETTING_VISIBLE)) {
+ /* visibility toggle */
+ draw_setting_widget(ac, ale, acf, block, offset, ymid, ACHANNEL_SETTING_VISIBLE);
+ offset += ICON_WIDTH;
+ }
+ else if ((ac->spacetype == SPACE_NLA) && acf->has_setting(ac, ale, ACHANNEL_SETTING_SOLO)) {
+ /* 'solo' setting for NLA Tracks */
+ draw_setting_widget(ac, ale, acf, block, offset, ymid, ACHANNEL_SETTING_SOLO);
+ offset += ICON_WIDTH;
+ }
+ }
+
+ /* step 4) draw text... */
+ /* NOTE: this is not done here, since nothing to be clicked on... */
+
+ /* step 5) draw mute+protection toggles + (sliders) ....................... */
+ /* reset offset - now goes from RHS of panel */
+ offset = 0;
+
+ // TODO: when drawing sliders, make those draw instead of these toggles if not enough space
+
+ if (v2d) {
+ short draw_sliders = 0;
+
+ /* check if we need to show the sliders */
+ if ((ac->sa) && ELEM(ac->spacetype, SPACE_ACTION, SPACE_IPO)) {
+ switch (ac->spacetype) {
+ case SPACE_ACTION:
+ {
+ SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
+ draw_sliders= (saction->flag & SACTION_SLIDERS);
+ }
+ break;
+ case SPACE_IPO:
+ {
+ SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
+ draw_sliders= (sipo->flag & SIPO_SLIDERS);
+ }
+ break;
+ }
+ }
+
+ /* check if there's enough space for the toggles if the sliders are drawn too */
+ if ( !(draw_sliders) || ((v2d->mask.xmax-v2d->mask.xmin) > ACHANNEL_BUTTON_WIDTH/2) ) {
+ /* protect... */
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_PROTECT)) {
+ offset += ICON_WIDTH;
+ draw_setting_widget(ac, ale, acf, block, (int)v2d->cur.xmax-offset, ymid, ACHANNEL_SETTING_PROTECT);
+ }
+ /* mute... */
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_MUTE)) {
+ offset += ICON_WIDTH;
+ draw_setting_widget(ac, ale, acf, block, (int)v2d->cur.xmax-offset, ymid, ACHANNEL_SETTING_MUTE);
+ }
+ }
+
+ /* draw slider
+ * - even if we can draw sliders for this view, we must also check that the channel-type supports them
+ * (only only F-Curves really can support them for now)
+ * - to make things easier, we use RNA-autobuts for this so that changes are reflected immediately,
+ * whereever they occurred. BUT, we don't use the layout engine, otherwise we'd get wrong alignment,
+ * and wouldn't be able to auto-keyframe...
+ * - slider should start before the toggles (if they're visible) to keep a clean line down the side
+ */
+ if ((draw_sliders) && (ale->type == ANIMTYPE_FCURVE)) {
+ /* adjust offset */
+ offset += SLIDER_WIDTH;
+
+ /* need backdrop behind sliders... */
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ if (ale->id) { /* Slider using RNA Access -------------------- */
+ FCurve *fcu= (FCurve *)ale->data;
+ PointerRNA id_ptr, ptr;
+ PropertyRNA *prop;
+
+ /* get RNA pointer, and resolve the path */
+ RNA_id_pointer_create(ale->id, &id_ptr);
+
+ /* try to resolve the path */
+ if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
+ uiBut *but;
+
+ /* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
+ but= uiDefAutoButR(block, &ptr, prop, fcu->array_index, "", 0, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
+ uiButSetFunc(but, achannel_setting_slider_cb, ale->id, fcu);
+ }
+ }
+ else { /* Special Slider for stuff without RNA Access ---------- */
+ // TODO: only implement this case when we really need it...
+ }
+ }
+ }
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels_edit.c
index 05d50f98e8e..4afecdb55c0 100644
--- a/source/blender/editors/animation/anim_channels.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -17,11 +17,9 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*
- * The Original Code is: all of this file.
- *
* Contributor(s): Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
@@ -48,6 +46,7 @@
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -55,6 +54,7 @@
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
#include "DNA_userdef_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
@@ -63,9 +63,10 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_depsgraph.h"
-#include "BKE_ipo.h"
+#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
#include "BKE_object.h"
@@ -87,43 +88,16 @@
/* ************************************************************************** */
/* CHANNELS API */
-/* -------------------------- Internal Macros ------------------------------- */
-
-/* set/clear/toggle macro
- * - channel - channel with a 'flag' member that we're setting
- * - smode - 0=clear, 1=set, 2=toggle
- * - sflag - bitflag to set
- */
-#define ACHANNEL_SET_FLAG(channel, smode, sflag) \
- { \
- if (smode == ACHANNEL_SETFLAG_TOGGLE) (channel)->flag ^= (sflag); \
- else if (smode == ACHANNEL_SETFLAG_ADD) (channel)->flag |= (sflag); \
- else (channel)->flag &= ~(sflag); \
- }
-
-/* set/clear/toggle macro, where the flag is negative
- * - channel - channel with a 'flag' member that we're setting
- * - smode - 0=clear, 1=set, 2=toggle
- * - sflag - bitflag to set
- */
-#define ACHANNEL_SET_FLAG_NEG(channel, smode, sflag) \
- { \
- if (smode == ACHANNEL_SETFLAG_TOGGLE) (channel)->flag ^= (sflag); \
- else if (smode == ACHANNEL_SETFLAG_ADD) (channel)->flag &= ~(sflag); \
- else (channel)->flag |= (sflag); \
- }
-
/* -------------------------- Exposed API ----------------------------------- */
/* Set the given animation-channel as the active one for the active context */
-void ANIM_set_active_channel (void *data, short datatype, int filter, void *channel_data, short channel_type)
+void ANIM_set_active_channel (bAnimContext *ac, void *data, short datatype, int filter, void *channel_data, short channel_type)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
/* try to build list of filtered items */
- // XXX we don't need/supply animcontext for now, since in this case, there's nothing really essential there that isn't already covered
- ANIM_animdata_filter(NULL, &anim_data, filter, data, datatype);
+ ANIM_animdata_filter(ac, &anim_data, filter, data, datatype);
if (anim_data.first == NULL)
return;
@@ -149,11 +123,18 @@ void ANIM_set_active_channel (void *data, short datatype, int filter, void *chan
ACHANNEL_SET_FLAG(fcu, ACHANNEL_SETFLAG_CLEAR, FCURVE_ACTIVE);
}
break;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ ACHANNEL_SET_FLAG(nlt, ACHANNEL_SETFLAG_CLEAR, NLATRACK_ACTIVE);
+ }
+ break;
}
}
/* set active flag */
- if (channel_data) {
+ if (channel_data != NULL) {
switch (channel_type) {
case ANIMTYPE_GROUP:
{
@@ -167,6 +148,12 @@ void ANIM_set_active_channel (void *data, short datatype, int filter, void *chan
fcu->flag |= FCURVE_ACTIVE;
}
break;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)channel_data;
+ nlt->flag |= NLATRACK_ACTIVE;
+ }
+ break;
}
}
@@ -217,6 +204,10 @@ void ANIM_deselect_anim_channels (void *data, short datatype, short test, short
if (ale->flag & FCURVE_SELECTED)
sel= ACHANNEL_SETFLAG_CLEAR;
break;
+ case ANIMTYPE_NLATRACK:
+ if (ale->flag & NLATRACK_SELECTED)
+ sel= ACHANNEL_SETFLAG_CLEAR;
+ break;
}
}
}
@@ -263,6 +254,14 @@ void ANIM_deselect_anim_channels (void *data, short datatype, short test, short
fcu->flag &= ~FCURVE_ACTIVE;
}
break;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ ACHANNEL_SET_FLAG(nlt, sel, NLATRACK_SELECTED);
+ nlt->flag &= ~NLATRACK_ACTIVE;
+ }
+ break;
}
}
@@ -273,6 +272,47 @@ void ANIM_deselect_anim_channels (void *data, short datatype, short test, short
/* ************************************************************************** */
/* OPERATORS */
+/* ****************** Operator Utilities ********************************** */
+
+/* poll callback for being in an Animation Editor channels list region */
+int animedit_poll_channels_active (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 */
+ if (ELEM3(sa->spacetype, SPACE_ACTION, SPACE_IPO, SPACE_NLA) == 0)
+ return 0;
+
+ return 1;
+}
+
+/* poll callback for Animation Editor channels list region + not in NLA-tweakmode for NLA */
+int animedit_poll_channels_nla_tweakmode_off (bContext *C)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ Scene *scene = CTX_data_scene(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 */
+ if (ELEM3(sa->spacetype, SPACE_ACTION, SPACE_IPO, SPACE_NLA) == 0)
+ return 0;
+
+ /* NLA TweakMode test */
+ if (sa->spacetype == SPACE_NLA) {
+ if ((scene == NULL) || (scene->flag & SCE_NLA_EDIT_ON))
+ return 0;
+ }
+
+ return 1;
+}
+
/* ****************** Rearrange Channels Operator ******************* */
/* This operator only works for Action Editor mode for now, as having it elsewhere makes things difficult */
@@ -575,8 +615,8 @@ static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
mode= RNA_enum_get(op->ptr, "direction");
rearrange_action_channels(&ac, mode);
- /* set notifier tha things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -652,6 +692,122 @@ void ANIM_OT_channels_move_bottom (wmOperatorType *ot)
#endif // XXX old animation system - needs to be updated for new system...
+/* ******************** Delete Channel Operator *********************** */
+
+static int animchannels_delete_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;
+
+ /* cannot delete in shapekey */
+ if (ac.datatype == ANIMCONT_SHAPEKEY)
+ return OPERATOR_CANCELLED;
+
+
+ /* do groups only first (unless in Drivers mode, where there are none) */
+ if (ac.datatype != ANIMCONT_DRIVERS) {
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* delete selected groups and their associated channels */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* only groups - don't check other types yet, since they may no-longer exist */
+ if (ale->type == ANIMTYPE_GROUP) {
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+ AnimData *adt= ale->adt;
+ FCurve *fcu, *fcn;
+
+ /* skip this group if no AnimData available, as we can't safely remove the F-Curves */
+ if (adt == NULL)
+ continue;
+
+ /* delete all of the Group's F-Curves, but no others */
+ for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcn) {
+ fcn= fcu->next;
+
+ /* remove from group and action, then free */
+ action_groups_remove_channel(adt->action, fcu);
+ free_fcurve(fcu);
+ }
+
+ /* free the group itself */
+ if (adt->action)
+ BLI_freelinkN(&adt->action->groups, agrp);
+ else
+ MEM_freeN(agrp);
+ }
+ }
+
+ /* cleanup */
+ BLI_freelistN(&anim_data);
+ }
+
+ /* now do F-Curves */
+ if (ac.datatype != ANIMCONT_GPENCIL) {
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* delete selected F-Curves */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* only F-Curves, and only if we can identify its parent */
+ if (ale->type == ANIMTYPE_FCURVE) {
+ AnimData *adt= ale->adt;
+ FCurve *fcu= (FCurve *)ale->data;
+
+ /* if no AnimData, we've got nowhere to remove the F-Curve from */
+ if (adt == NULL)
+ continue;
+
+ /* remove from whatever list it came from
+ * - Action Group
+ * - Action
+ * - Drivers
+ * - TODO... some others?
+ */
+ if (fcu->grp)
+ action_groups_remove_channel(adt->action, fcu);
+ else if (adt->action)
+ BLI_remlink(&adt->action->curves, fcu);
+ else if (ac.datatype == ANIMCONT_DRIVERS)
+ BLI_remlink(&adt->drivers, fcu);
+
+ /* free the F-Curve itself */
+ free_fcurve(fcu);
+ }
+ }
+
+ /* cleanup */
+ BLI_freelistN(&anim_data);
+ }
+
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ANIM_OT_channels_delete (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Channels";
+ ot->idname= "ANIM_OT_channels_delete";
+ ot->description= "Delete all selected animation channels.";
+
+ /* api callbacks */
+ ot->exec= animchannels_delete_exec;
+ ot->poll= animedit_poll_channels_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
/* ******************** Toggle Channel Visibility Operator *********************** */
@@ -668,7 +824,7 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* See if we should be making showing all selected or hiding */
@@ -676,21 +832,35 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
if (vis == ACHANNEL_SETFLAG_CLEAR)
break;
- if (ale->flag & FCURVE_VISIBLE)
+ if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_VISIBLE))
+ vis= ACHANNEL_SETFLAG_CLEAR;
+ else if ((ale->type == ANIMTYPE_GROUP) && !(ale->flag & AGRP_NOTVISIBLE))
vis= ACHANNEL_SETFLAG_CLEAR;
}
/* Now set the flags */
for (ale= anim_data.first; ale; ale= ale->next) {
- FCurve *fcu= (FCurve *)ale->data;
- ACHANNEL_SET_FLAG(fcu, vis, FCURVE_VISIBLE);
+ switch (ale->type) {
+ case ANIMTYPE_FCURVE: /* F-Curve */
+ {
+ FCurve *fcu= (FCurve *)ale->data;
+ ACHANNEL_SET_FLAG(fcu, vis, FCURVE_VISIBLE);
+ }
+ break;
+ case ANIMTYPE_GROUP: /* Group */
+ {
+ bActionGroup *agrp= (bActionGroup *)ale->data;
+ ACHANNEL_SET_FLAG_NEG(agrp, vis, AGRP_NOTVISIBLE);
+ }
+ break;
+ }
}
/* cleanup */
BLI_freelistN(&anim_data);
- /* set notifier tha things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -700,6 +870,7 @@ void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Visibility";
ot->idname= "ANIM_OT_channels_visibility_toggle";
+ ot->description= "Toggle visibility in Graph Editor of all selected animation channels.";
/* api callbacks */
ot->exec= animchannels_visibility_toggle_exec;
@@ -711,14 +882,6 @@ void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
/* ********************** Set Flags Operator *********************** */
-enum {
-// ACHANNEL_SETTING_SELECT = 0,
- ACHANNEL_SETTING_PROTECT = 1,
- ACHANNEL_SETTING_MUTE,
- ACHANNEL_SETTING_VISIBLE,
- ACHANNEL_SETTING_EXPAND,
-} eAnimChannel_Settings;
-
/* defines for setting animation-channel flags */
EnumPropertyItem prop_animchannel_setflag_types[] = {
{ACHANNEL_SETFLAG_CLEAR, "DISABLE", 0, "Disable", ""},
@@ -728,6 +891,7 @@ EnumPropertyItem prop_animchannel_setflag_types[] = {
};
/* defines for set animation-channel settings */
+// TODO: could add some more types, but those are really quite dependent on the mode...
EnumPropertyItem prop_animchannel_settings_types[] = {
{ACHANNEL_SETTING_PROTECT, "PROTECT", 0, "Protect", ""},
{ACHANNEL_SETTING_MUTE, "MUTE", 0, "Mute", ""},
@@ -759,171 +923,8 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode,
/* affect selected channels */
for (ale= anim_data.first; ale; ale= ale->next) {
- switch (ale->type) {
- case ANIMTYPE_OBJECT:
- {
- Base *base= (Base *)ale->data;
- Object *ob= base->object;
-
- if (setting == ACHANNEL_SETTING_EXPAND) {
- // XXX - settings should really be moved out of ob->nlaflag
- if (mode == ACHANNEL_SETFLAG_TOGGLE) ob->nlaflag ^= OB_ADS_COLLAPSED;
- else if (mode == ACHANNEL_SETFLAG_ADD) ob->nlaflag &= ~OB_ADS_COLLAPSED;
- else ob->nlaflag |= OB_ADS_COLLAPSED;
- }
- }
- break;
-
- case ANIMTYPE_FILLACTD:
- {
- bAction *act= (bAction *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG_NEG(act, mode, ACT_COLLAPSED);
- }
- }
- }
- break;
- case ANIMTYPE_FILLDRIVERS:
- {
- AnimData *adt= (AnimData *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG_NEG(adt, mode, ADT_DRIVERS_COLLAPSED);
- }
- }
- }
- break;
- case ANIMTYPE_FILLMATD:
- {
- Object *ob= (Object *)ale->data;
-
- // XXX - settings should really be moved out of ob->nlaflag
- if ((onlysel == 0) || (ob->flag & SELECT)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- if (mode == ACHANNEL_SETFLAG_TOGGLE) ob->nlaflag ^= OB_ADS_SHOWMATS;
- else if (mode == ACHANNEL_SETFLAG_ADD) ob->nlaflag |= OB_ADS_SHOWMATS;
- else ob->nlaflag &= ~OB_ADS_SHOWMATS;
- }
- }
- }
- break;
-
- case ANIMTYPE_DSMAT:
- {
- Material *ma= (Material *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(ma, mode, MA_DS_EXPAND);
- }
- }
- }
- break;
- case ANIMTYPE_DSLAM:
- {
- Lamp *la= (Lamp *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(la, mode, LA_DS_EXPAND);
- }
- }
- }
- break;
- case ANIMTYPE_DSCAM:
- {
- Camera *ca= (Camera *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(ca, mode, CAM_DS_EXPAND);
- }
- }
- }
- break;
- case ANIMTYPE_DSCUR:
- {
- Curve *cu= (Curve *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(cu, mode, CU_DS_EXPAND);
- }
- }
- }
- break;
- case ANIMTYPE_DSSKEY:
- {
- Key *key= (Key *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(key, mode, KEYBLOCK_DS_EXPAND);
- }
- }
- }
- break;
- case ANIMTYPE_DSWOR:
- {
- World *wo= (World *)ale->data;
-
- if (ASUBCHANNEL_SEL_OK(ale)) {
- if (setting == ACHANNEL_SETTING_EXPAND) {
- ACHANNEL_SET_FLAG(wo, mode, WO_DS_EXPAND);
- }
- }
- }
- break;
-
- case ANIMTYPE_GROUP:
- {
- bActionGroup *agrp= (bActionGroup *)ale->data;
-
- switch (setting) {
- case ACHANNEL_SETTING_PROTECT:
- ACHANNEL_SET_FLAG(agrp, mode, AGRP_PROTECTED);
- break;
- case ACHANNEL_SETTING_EXPAND:
- ACHANNEL_SET_FLAG(agrp, mode, AGRP_EXPANDED);
- break;
- }
- }
- break;
- case ANIMTYPE_FCURVE:
- {
- FCurve *fcu= (FCurve *)ale->data;
-
- switch (setting) {
- case ACHANNEL_SETTING_MUTE:
- ACHANNEL_SET_FLAG(fcu, mode, FCURVE_MUTED);
- break;
- case ACHANNEL_SETTING_PROTECT:
- ACHANNEL_SET_FLAG(fcu, mode, FCURVE_PROTECTED);
- break;
- case ACHANNEL_SETTING_VISIBLE:
- ACHANNEL_SET_FLAG(fcu, mode, FCURVE_VISIBLE);
- break;
- }
- }
- break;
- case ANIMTYPE_GPLAYER:
- {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
-
- switch (setting) {
- case ACHANNEL_SETTING_MUTE:
- ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_HIDE);
- break;
- case ACHANNEL_SETTING_PROTECT:
- ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_LOCKED);
- break;
- }
- }
- break;
- }
+ /* set the setting in the appropriate way (if available) */
+ ANIM_channel_setting_set(ac, ale, setting, mode);
}
BLI_freelistN(&anim_data);
@@ -947,8 +948,8 @@ static int animchannels_setflag_exec(bContext *C, wmOperator *op)
/* modify setting */
setflag_anim_channels(&ac, setting, mode, 1);
- /* set notifier tha things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -959,11 +960,12 @@ void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
/* identifiers */
ot->name= "Enable Channel Setting";
ot->idname= "ANIM_OT_channels_setting_enable";
+ ot->description= "Enable specified setting on all selected animation channels.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= animchannels_setflag_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -980,11 +982,12 @@ void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
/* identifiers */
ot->name= "Disable Channel Setting";
ot->idname= "ANIM_OT_channels_setting_disable";
+ ot->description= "Disable specified setting on all selected animation channels.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= animchannels_setflag_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1001,11 +1004,12 @@ void ANIM_OT_channels_setting_toggle (wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Channel Setting";
ot->idname= "ANIM_OT_channels_setting_toggle";
+ ot->description= "Toggle specified setting on all selected animation channels.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= animchannels_setflag_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1023,10 +1027,11 @@ void ANIM_OT_channels_editable_toggle (wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Channel Editability";
ot->idname= "ANIM_OT_channels_editable_toggle";
+ ot->description= "Toggle editability of selected channels.";
/* api callbacks */
ot->exec= animchannels_setflag_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1056,8 +1061,8 @@ static int animchannels_expand_exec (bContext *C, wmOperator *op)
/* modify setting */
setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_ADD, onlysel);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -1067,10 +1072,11 @@ void ANIM_OT_channels_expand (wmOperatorType *ot)
/* identifiers */
ot->name= "Expand Channels";
ot->idname= "ANIM_OT_channels_expand";
+ ot->description= "Expand (i.e. open) all selected expandable animation channels.";
/* api callbacks */
ot->exec= animchannels_expand_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1097,8 +1103,8 @@ static int animchannels_collapse_exec (bContext *C, wmOperator *op)
/* modify setting */
setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_CLEAR, onlysel);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -1108,10 +1114,11 @@ void ANIM_OT_channels_collapse (wmOperatorType *ot)
/* identifiers */
ot->name= "Collapse Channels";
ot->idname= "ANIM_OT_channels_collapse";
+ ot->description= "Collapse (i.e. close) all selected expandable animation channels.";
/* api callbacks */
ot->exec= animchannels_collapse_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1136,8 +1143,8 @@ static int animchannels_deselectall_exec(bContext *C, wmOperator *op)
else
ANIM_deselect_anim_channels(ac.data, ac.datatype, 1, ACHANNEL_SETFLAG_ADD);
- /* set notifier tha things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_SELECT, NULL);
return OPERATOR_FINISHED;
}
@@ -1147,10 +1154,11 @@ void ANIM_OT_channels_select_all_toggle (wmOperatorType *ot)
/* identifiers */
ot->name= "Select All";
ot->idname= "ANIM_OT_channels_select_all_toggle";
+ ot->description= "Toggle selection of all animation channels.";
/* api callbacks */
ot->exec= animchannels_deselectall_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_nla_tweakmode_off;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1185,39 +1193,19 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
/* if channel is within border-select region, alter it */
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
- /* only the following types can be selected */
+ /* set selection flags only */
+ ANIM_channel_setting_set(ac, ale, ACHANNEL_SETTING_SELECT, selectmode);
+
+ /* type specific actions */
switch (ale->type) {
- case ANIMTYPE_OBJECT: /* object */
- {
- Base *base= (Base *)ale->data;
- Object *ob= base->object;
-
- ACHANNEL_SET_FLAG(base, selectmode, SELECT);
- ACHANNEL_SET_FLAG(ob, selectmode, SELECT);
- }
- break;
- case ANIMTYPE_GROUP: /* action group */
+ case ANIMTYPE_GROUP:
{
bActionGroup *agrp= (bActionGroup *)ale->data;
- ACHANNEL_SET_FLAG(agrp, selectmode, AGRP_SELECTED);
+ /* always clear active flag after doing this */
agrp->flag &= ~AGRP_ACTIVE;
}
break;
- case ANIMTYPE_FCURVE: /* F-Curve channel */
- {
- FCurve *fcu = (FCurve *)ale->data;
-
- ACHANNEL_SET_FLAG(fcu, selectmode, FCURVE_SELECTED);
- }
- break;
- case ANIMTYPE_GPLAYER: /* grease-pencil layer */
- {
- bGPDlayer *gpl = (bGPDlayer *)ale->data;
-
- ACHANNEL_SET_FLAG(gpl, selectmode, GP_LAYER_SELECT);
- }
- break;
}
}
@@ -1257,6 +1245,9 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op)
/* apply borderselect animation channels */
borderselect_anim_channels(&ac, &rect, selectmode);
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_SELECT, NULL);
+
return OPERATOR_FINISHED;
}
@@ -1265,13 +1256,14 @@ void ANIM_OT_channels_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "ANIM_OT_channels_select_border";
+ ot->description= "Select all animation channels within the specified region.";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= animchannels_borderselect_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_nla_tweakmode_off;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1285,17 +1277,14 @@ void ANIM_OT_channels_select_border(wmOperatorType *ot)
}
/* ******************** Mouse-Click Operator *********************** */
-/* Depending on the channel that was clicked on, the mouse click will activate whichever
- * part of the channel is relevant.
- *
- * NOTE: eventually, this should probably be phased out when many of these things are replaced with buttons
- */
+/* Handle selection changes due to clicking on channels. Settings will get caught by UI code... */
-static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, short selectmode)
+static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
+ int notifierFlags = 0;
/* get the channel that was clicked on */
/* filter channels */
@@ -1309,7 +1298,7 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
printf("Error: animation channel (index = %d) not found in mouse_anim_channels() \n", channel_index);
BLI_freelistN(&anim_data);
- return;
+ return 0;
}
/* selectmode -1 is a special case for ActionGroups only, which selects all of the channels underneath it only... */
@@ -1317,7 +1306,7 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
if ((selectmode == -1) && (ale->type != ANIMTYPE_GROUP)) {
/* normal channels should not behave normally in this case */
BLI_freelistN(&anim_data);
- return;
+ return 0;
}
/* action to take depends on what channel we've got */
@@ -1326,20 +1315,16 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
{
Scene *sce= (Scene *)ale->data;
- if (x < 16) {
- /* toggle expand */
- sce->flag ^= SCE_DS_COLLAPSED;
+ /* set selection status */
+ if (selectmode == SELECT_INVERT) {
+ /* swap select */
+ sce->flag ^= SCE_DS_SELECTED;
}
else {
- /* set selection status */
- if (selectmode == SELECT_INVERT) {
- /* swap select */
- sce->flag ^= SCE_DS_SELECTED;
- }
- else {
- sce->flag |= SCE_DS_SELECTED;
- }
+ sce->flag |= SCE_DS_SELECTED;
}
+
+ notifierFlags |= ND_ANIMCHAN_SELECT;
}
break;
case ANIMTYPE_OBJECT:
@@ -1349,179 +1334,87 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
Base *base= (Base *)ale->data;
Object *ob= base->object;
- if (x < 16) {
- /* toggle expand */
- ob->nlaflag ^= OB_ADS_COLLAPSED; // XXX
+ /* set selection status */
+ if (selectmode == SELECT_INVERT) {
+ /* swap select */
+ base->flag ^= SELECT;
+ ob->flag= base->flag;
}
else {
- /* set selection status */
- if (selectmode == SELECT_INVERT) {
- /* swap select */
- base->flag ^= SELECT;
- ob->flag= base->flag;
- }
- else {
- Base *b;
-
- /* deleselect all */
- for (b= sce->base.first; b; b= b->next) {
- b->flag &= ~SELECT;
- b->object->flag= b->flag;
- }
-
- /* select object now */
- base->flag |= SELECT;
- ob->flag |= SELECT;
+ Base *b;
+
+ /* deleselect all */
+ for (b= sce->base.first; b; b= b->next) {
+ b->flag &= ~SELECT;
+ b->object->flag= b->flag;
}
- /* xxx should be ED_base_object_activate(), but we need context pointer for that... */
- //set_active_base(base);
+ /* select object now */
+ base->flag |= SELECT;
+ ob->flag |= SELECT;
}
- }
- break;
- case ANIMTYPE_FILLACTD:
- {
- bAction *act= (bAction *)ale->data;
- act->flag ^= ACT_COLLAPSED;
- }
- break;
- case ANIMTYPE_FILLDRIVERS:
- {
- AnimData *adt= (AnimData* )ale->data;
- adt->flag ^= ADT_DRIVERS_COLLAPSED;
- }
- break;
- case ANIMTYPE_FILLMATD:
- {
- Object *ob= (Object *)ale->data;
- ob->nlaflag ^= OB_ADS_SHOWMATS; // XXX
- }
- break;
-
- case ANIMTYPE_DSMAT:
- {
- Material *ma= (Material *)ale->data;
- ma->flag ^= MA_DS_EXPAND;
- }
- break;
- case ANIMTYPE_DSLAM:
- {
- Lamp *la= (Lamp *)ale->data;
- la->flag ^= LA_DS_EXPAND;
- }
- break;
- case ANIMTYPE_DSCAM:
- {
- Camera *ca= (Camera *)ale->data;
- ca->flag ^= CAM_DS_EXPAND;
- }
- break;
- case ANIMTYPE_DSCUR:
- {
- Curve *cu= (Curve *)ale->data;
- cu->flag ^= CU_DS_EXPAND;
- }
- break;
- case ANIMTYPE_DSSKEY:
- {
- Key *key= (Key *)ale->data;
- key->flag ^= KEYBLOCK_DS_EXPAND;
- }
- break;
- case ANIMTYPE_DSWOR:
- {
- World *wo= (World *)ale->data;
- wo->flag ^= WO_DS_EXPAND;
+
+ /* xxx should be ED_base_object_activate(), but we need context pointer for that... */
+ //set_active_base(base);
+
+ notifierFlags |= ND_ANIMCHAN_SELECT;
}
break;
case ANIMTYPE_GROUP:
{
bActionGroup *agrp= (bActionGroup *)ale->data;
- short offset= (ELEM3(ac->datatype, ANIMCONT_DOPESHEET, ANIMCONT_FCURVES, ANIMCONT_DRIVERS))? 18 : 0;
- if ((x < (offset+17)) && (agrp->channels.first)) {
- /* toggle expand */
- agrp->flag ^= AGRP_EXPANDED;
+ /* select/deselect group */
+ if (selectmode == SELECT_INVERT) {
+ /* inverse selection status of this group only */
+ agrp->flag ^= AGRP_SELECTED;
}
- else if (x >= (ACHANNEL_NAMEWIDTH-ACHANNEL_BUTTON_WIDTH)) {
- /* toggle protection/locking */
- agrp->flag ^= AGRP_PROTECTED;
+ else if (selectmode == -1) {
+ /* select all in group (and deselect everthing else) */
+ FCurve *fcu;
+
+ /* deselect all other channels */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+
+ /* only select channels in group and group itself */
+ for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next)
+ fcu->flag |= FCURVE_SELECTED;
+ agrp->flag |= AGRP_SELECTED;
}
else {
- /* select/deselect group */
- if (selectmode == SELECT_INVERT) {
- /* inverse selection status of this group only */
- agrp->flag ^= AGRP_SELECTED;
- }
- else if (selectmode == -1) {
- /* select all in group (and deselect everthing else) */
- FCurve *fcu;
-
- /* deselect all other channels */
- ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
-
- /* only select channels in group and group itself */
- for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next)
- fcu->flag |= FCURVE_SELECTED;
- agrp->flag |= AGRP_SELECTED;
- }
- else {
- /* select group by itself */
- ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- agrp->flag |= AGRP_SELECTED;
- }
-
- /* if group is selected now, make group the 'active' one in the visible list */
- if (agrp->flag & AGRP_SELECTED)
- ANIM_set_active_channel(ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP);
+ /* select group by itself */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ agrp->flag |= AGRP_SELECTED;
}
+
+ /* if group is selected now, make group the 'active' one in the visible list */
+ if (agrp->flag & AGRP_SELECTED)
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP);
+
+ notifierFlags |= ND_ANIMCHAN_SELECT;
}
break;
case ANIMTYPE_FCURVE:
{
FCurve *fcu= (FCurve *)ale->data;
- short offset;
-
- if (ac->datatype != ANIMCONT_ACTION) {
- /* for now, special case for materials */
- if (ale->ownertype == ANIMTYPE_DSMAT)
- offset= 21;
- else
- offset= 18;
- }
- else
- offset = 0;
- if (x >= (ACHANNEL_NAMEWIDTH-ACHANNEL_BUTTON_WIDTH)) {
- /* toggle protection (only if there's a toggle there) */
- if (fcu->bezt)
- fcu->flag ^= FCURVE_PROTECTED;
- }
- else if (x >= (ACHANNEL_NAMEWIDTH-2*ACHANNEL_BUTTON_WIDTH)) {
- /* toggle mute */
- fcu->flag ^= FCURVE_MUTED;
- }
- else if ((x < (offset+17)) && (ac->spacetype==SPACE_IPO)) {
- /* toggle visibility */
- fcu->flag ^= FCURVE_VISIBLE;
+ /* select/deselect */
+ if (selectmode == SELECT_INVERT) {
+ /* inverse selection status of this F-Curve only */
+ fcu->flag ^= FCURVE_SELECTED;
}
else {
- /* select/deselect */
- if (selectmode == SELECT_INVERT) {
- /* inverse selection status of this F-Curve only */
- fcu->flag ^= FCURVE_SELECTED;
- }
- else {
- /* select F-Curve by itself */
- ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- fcu->flag |= FCURVE_SELECTED;
- }
-
- /* if F-Curve is selected now, make F-Curve the 'active' one in the visible list */
- if (fcu->flag & FCURVE_SELECTED)
- ANIM_set_active_channel(ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+ /* select F-Curve by itself */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ fcu->flag |= FCURVE_SELECTED;
}
+
+ /* if F-Curve is selected now, make F-Curve the 'active' one in the visible list */
+ if (fcu->flag & FCURVE_SELECTED)
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+
+ notifierFlags |= ND_ANIMCHAN_SELECT;
}
break;
case ANIMTYPE_GPDATABLOCK:
@@ -1530,6 +1423,8 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
/* toggle expand */
gpd->flag ^= GP_DATA_EXPAND;
+
+ notifierFlags |= ND_ANIMCHAN_EDIT;
}
break;
case ANIMTYPE_GPLAYER:
@@ -1568,6 +1463,9 @@ static void mouse_anim_channels (bAnimContext *ac, float x, int channel_index, s
/* free channels */
BLI_freelistN(&anim_data);
+
+ /* return notifier flags */
+ return notifierFlags;
}
/* ------------------- */
@@ -1580,6 +1478,7 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *
ARegion *ar;
View2D *v2d;
int mval[2], channel_index;
+ int notifierFlags = 0;
short selectmode;
float x, y;
@@ -1614,10 +1513,10 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *
UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
/* handle mouse-click in the relevant channel then */
- mouse_anim_channels(&ac, x, channel_index, selectmode);
+ notifierFlags= mouse_anim_channels(&ac, x, channel_index, selectmode);
- /* set notifier tha things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS);
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|notifierFlags, NULL);
return OPERATOR_FINISHED;
}
@@ -1627,10 +1526,11 @@ void ANIM_OT_channels_click (wmOperatorType *ot)
/* identifiers */
ot->name= "Mouse Click on Channels";
ot->idname= "ANIM_OT_channels_click";
+ ot->description= "Handle mouse-clicks over animation channels.";
/* api callbacks */
ot->invoke= animchannels_mouseclick_invoke;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1653,6 +1553,8 @@ void ED_operatortypes_animchannels(void)
WM_operatortype_append(ANIM_OT_channels_setting_disable);
WM_operatortype_append(ANIM_OT_channels_setting_toggle);
+ WM_operatortype_append(ANIM_OT_channels_delete);
+
// XXX does this need to be a separate operator?
WM_operatortype_append(ANIM_OT_channels_editable_toggle);
@@ -1670,7 +1572,7 @@ void ED_operatortypes_animchannels(void)
void ED_keymap_animchannels(wmWindowManager *wm)
{
- ListBase *keymap = WM_keymap_listbase(wm, "Animation_Channels", 0, 0);
+ wmKeyMap *keymap = WM_keymap_find(wm, "Animation_Channels", 0, 0);
/* selection */
/* click-select */
@@ -1686,6 +1588,10 @@ void ED_keymap_animchannels(wmWindowManager *wm)
/* borderselect */
WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", BKEY, KM_PRESS, 0, 0);
+ /* delete */
+ WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ANIM_OT_channels_delete", DELKEY, KM_PRESS, 0, 0);
+
/* 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);
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index 1ff2169bf61..62341a5d6ae 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -43,6 +43,7 @@
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -57,90 +58,15 @@
/* ***************** depsgraph calls and anim updates ************* */
/* ***************** only these can be called from editors ******** */
-/* generic update flush, reads from context Screen (layers) and scene */
-/* this is for compliancy, later it can do all windows etc */
void ED_anim_dag_flush_update(const bContext *C)
{
- Scene *scene= CTX_data_scene(C);
- bScreen *screen= CTX_wm_screen(C);
-
- DAG_scene_flush_update(scene, ED_screen_view3d_layers(screen), 0);
+ DAG_ids_flush_update(0);
}
/* flushes changes from object to all relations in scene */
void ED_anim_object_flush_update(const bContext *C, Object *ob)
{
- Scene *scene= CTX_data_scene(C);
- bScreen *screen= CTX_wm_screen(C);
-
- DAG_object_update_flags(scene, ob, ED_screen_view3d_layers(screen));
-}
-
-
-/* **************************** animation tool notifiers ******************************** */
-
-/* Send notifiers on behalf of animation editing tools, based on various context info
- * - data_changed: eAnimData_Changed
- */
-void ANIM_animdata_send_notifiers (bContext *C, bAnimContext *ac, short data_changed)
-{
- /* types of notifiers to send, depends on the editor context */
- switch (ac->datatype) {
- case ANIMCONT_DOPESHEET: /* dopesheet */
- case ANIMCONT_FCURVES: /* fcurve editor */
- case ANIMCONT_DRIVERS: /* drivers editor */ // XXX probably this will need separate handling, since these are part of dependency system
- {
- /* what action was taken */
- switch (data_changed) {
- case ANIM_CHANGED_KEYFRAMES_VALUES:
- /* keyframe values changed, so transform may have changed */
- // XXX what about other cases? maybe we need general ND_KEYFRAMES or ND_ANIMATION?
- WM_event_add_notifier(C, NC_OBJECT|ND_KEYS|ND_TRANSFORM, NULL);
- break;
- case ANIM_CHANGED_KEYFRAMES_SELECT:
- WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, NULL);
- break;
- case ANIM_CHANGED_CHANNELS:
- // XXX err... check available datatypes in dopesheet first?
- // FIXME: this currently doesn't work (to update own view)
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE|ND_OB_SELECT, ac->scene);
- WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE|ND_BONE_SELECT, NULL);
- break;
- }
-
- // XXX for now, at least update own editor!
- ED_area_tag_redraw(CTX_wm_area(C));
- }
- break;
-
- case ANIMCONT_ACTION: /* action editor */
- {
- Object *obact= CTX_data_active_object(C);
-
- switch (data_changed) {
- case ANIM_CHANGED_KEYFRAMES_VALUES:
- /* keyframe values changed, so transform may have changed */
- // XXX what about other cases? maybe we need general ND_KEYFRAMES or ND_ANIMATION?
- WM_event_add_notifier(C, NC_OBJECT|ND_KEYS|ND_TRANSFORM, obact);
- break;
- case ANIM_CHANGED_KEYFRAMES_SELECT:
- WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obact);
- break;
- case ANIM_CHANGED_CHANNELS:
- // XXX err... check available datatypes in dopesheet first?
- // FIXME: this currently doesn't work (to update own view)
- WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE|ND_BONE_SELECT, obact);
- break;
- }
-
- // XXX for now, at least update own editor!
- ED_area_tag_redraw(CTX_wm_area(C));
- }
- break;
-
- default: /* some other data... just update area for now */
- ED_area_tag_redraw(CTX_wm_area(C));
- }
+ DAG_id_update_flags(&ob->id);
}
/* **************************** pose <-> action syncing ******************************** */
@@ -152,6 +78,10 @@ void ANIM_animdata_send_notifiers (bContext *C, bAnimContext *ac, short data_cha
* 3) Grouping (only for pose to action for now)
*/
+/* XXX OBSOLETE CODE WARNING:
+ * With the Animato system, the code below is somewhat obsolete now...
+ */
+
/* Notifier from Action/Dopesheet (this may be extended to include other things such as Python...)
* Channels in action changed, so update pose channels/groups to reflect changes.
*
@@ -200,6 +130,7 @@ void ANIM_action_to_pose_sync (Object *ob)
*/
void ANIM_pose_to_action_sync (Object *ob, ScrArea *sa)
{
+#if 0 // XXX old animation system
SpaceAction *saction= (SpaceAction *)sa->spacedata.first;
bArmature *arm= (bArmature *)ob->data;
bAction *act= (bAction *)ob->action;
@@ -236,4 +167,5 @@ void ANIM_pose_to_action_sync (Object *ob, ScrArea *sa)
// XXX step 2 needs to be coded still... currently missing action/bone group API to do any more work here...
// XXX step 3 needs to be coded still... it's a messy case to deal with (we'll use the temp indices for this?)
+#endif // XXX old animation system
}
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index c176f20c26b..6388106fdb5 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -43,10 +43,12 @@
#include "BLI_blenlib.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_fcurve.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -165,7 +167,7 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag)
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
- vec[1]= v2d->cur.ymin;
+ vec[1]= v2d->cur.ymin-500.0f; /* XXX arbitrary... want it go to bottom */
glVertex2fv(vec);
vec[1]= v2d->cur.ymax;
@@ -232,102 +234,54 @@ void ANIM_draw_previewrange (const bContext *C, View2D *v2d)
/* *************************************************** */
/* NLA-MAPPING UTILITIES (required for drawing and also editing keyframes) */
-/* Obtain the Object providing NLA-scaling for the given channel (if applicable) */
-Object *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale)
+/* Obtain the AnimData block providing NLA-mapping for the given channel (if applicable) */
+AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale)
{
/* sanity checks */
if (ac == NULL)
return NULL;
/* handling depends on the type of animation-context we've got */
- if (ac->datatype == ANIMCONT_ACTION) {
- /* Action Editor (action mode) or Graph Editor (ipo mode):
- * Only use if editor is not pinned, and active object has action
- */
- if (ac->obact && ac->obact->action) {
- SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
-
- if (saction->pin == 0)
- return ac->obact;
- }
- }
- else if ((ac->datatype == ANIMCONT_DOPESHEET) && (ale)) {
- /* Dopesheet:
- * Only if channel is available, and is owned by an Object with an Action
- */
- if ((ale->id) && (GS(ale->id->name) == ID_OB)) {
- Object *ob= (Object *)ale->id;
-
- if (ob->action)
- return ob;
- }
- }
- // XXX todo: add F-Curves mode (Graph Editor) ...
-
- /* no appropriate object found */
- return NULL;
-}
-
-/* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-scaled' time
- * - the old mapping is stored in a static var, but that shouldn't be too bad as UI drawing
- * (where this is called) is single-threaded anyway
- */
-// XXX was called: map_active_strip()
-void ANIM_nla_mapping_draw(gla2DDrawInfo *di, Object *ob, short restore)
-{
- static rctf stored;
-
- if (restore) {
- /* restore un-mapped coordinates */
- gla2DSetMap(di, &stored);
- }
- else {
- /* set mapped coordinates */
- rctf map;
-
- gla2DGetMap(di, &stored);
- map= stored;
-
- map.xmin= get_action_frame(ob, map.xmin);
- map.xmax= get_action_frame(ob, map.xmax);
-
- if (map.xmin == map.xmax) map.xmax += 1.0f;
- gla2DSetMap(di, &map);
- }
+ if (ale)
+ return ale->adt;
+ else
+ return NULL;
}
/* ------------------- */
-/* helper function for ANIM_nla_mapping_apply_ipocurve() -> "restore", i.e. mapping points back to IPO-time */
+/* helper function for ANIM_nla_mapping_apply_fcurve() -> "restore", i.e. mapping points back to action-time */
static short bezt_nlamapping_restore(BeztEditData *bed, BezTriple *bezt)
{
- /* object providing scaling is stored in 'data', only_keys option is stored in i1 */
- Object *ob= (Object *)bed->data;
+ /* AnimData block providing scaling is stored in 'data', only_keys option is stored in i1 */
+ AnimData *adt= (AnimData *)bed->data;
short only_keys= (short)bed->i1;
/* adjust BezTriple handles only if allowed to */
if (only_keys == 0) {
- bezt->vec[0][0]= get_action_frame(ob, bezt->vec[0][0]);
- bezt->vec[2][0]= get_action_frame(ob, bezt->vec[2][0]);
- }
- bezt->vec[1][0]= get_action_frame(ob, bezt->vec[1][0]);
+ bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], NLATIME_CONVERT_UNMAP);
+ bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], NLATIME_CONVERT_UNMAP);
+ }
+
+ bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], NLATIME_CONVERT_UNMAP);
return 0;
}
-/* helper function for ANIM_nla_mapping_apply_ipocurve() -> "apply", i.e. mapping points to NLA-mapped global time */
+/* helper function for ANIM_nla_mapping_apply_fcurve() -> "apply", i.e. mapping points to NLA-mapped global time */
static short bezt_nlamapping_apply(BeztEditData *bed, BezTriple *bezt)
{
- /* object providing scaling is stored in 'data', only_keys option is stored in i1 */
- Object *ob= (Object *)bed->data;
+ /* AnimData block providing scaling is stored in 'data', only_keys option is stored in i1 */
+ AnimData *adt= (AnimData *)bed->data;
short only_keys= (short)bed->i1;
/* adjust BezTriple handles only if allowed to */
if (only_keys == 0) {
- bezt->vec[0][0]= get_action_frame_inv(ob, bezt->vec[0][0]);
- bezt->vec[2][0]= get_action_frame_inv(ob, bezt->vec[2][0]);
+ bezt->vec[0][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[0][0], NLATIME_CONVERT_MAP);
+ bezt->vec[2][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[2][0], NLATIME_CONVERT_MAP);
}
- bezt->vec[1][0]= get_action_frame_inv(ob, bezt->vec[1][0]);
+
+ bezt->vec[1][0]= BKE_nla_tweakedit_remap(adt, bezt->vec[1][0], NLATIME_CONVERT_MAP);
return 0;
}
@@ -338,17 +292,17 @@ static short bezt_nlamapping_apply(BeztEditData *bed, BezTriple *bezt)
* - restore = whether to map points back to non-mapped time
* - only_keys = whether to only adjust the location of the center point of beztriples
*/
-void ANIM_nla_mapping_apply_fcurve(Object *ob, FCurve *fcu, short restore, short only_keys)
+void ANIM_nla_mapping_apply_fcurve (AnimData *adt, FCurve *fcu, short restore, short only_keys)
{
BeztEditData bed;
BeztEditFunc map_cb;
/* init edit data
- * - ob is stored in 'data'
+ * - AnimData is stored in 'data'
* - only_keys is stored in 'i1'
*/
memset(&bed, 0, sizeof(BeztEditData));
- bed.data= (void *)ob;
+ bed.data= (void *)adt;
bed.i1= (int)only_keys;
/* get editing callback */
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index afad396607b..38b702f81e0 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -17,11 +17,11 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * The Original Code is Copyright (C) 2008 Blender Foundation, Joshua Leung
* All rights reserved.
*
*
- * Contributor(s): Joshua Leung
+ * Contributor(s): Joshua Leung (original author)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -33,15 +33,16 @@
* for cases to ignore.
*
* While this is primarily used for the Action/Dopesheet Editor (and its accessory modes),
- * the IPO Editor also uses this for it's channel list and for determining which curves
- * are being edited.
+ * the Graph Editor also uses this for its channel list and for determining which curves
+ * are being edited. Likewise, the NLA Editor also uses this for its channel list and in
+ * its operators.
*
* Note: much of the original system this was based on was built before the creation of the RNA
* system. In future, it would be interesting to replace some parts of this code with RNA queries,
* however, RNA does not eliminate some of the boiler-plate reduction benefits presented by this
* system, so if any such work does occur, it should only be used for the internals used here...
*
- * -- Joshua Leung, Dec 2008
+ * -- Joshua Leung, Dec 2008 (Last revision July 2009)
*/
#include <string.h>
@@ -51,6 +52,7 @@
#include "DNA_ID.h"
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
@@ -61,7 +63,9 @@
#include "DNA_key_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -72,6 +76,7 @@
#include "BLI_blenlib.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_key.h"
@@ -195,7 +200,7 @@ static short actedit_get_context (bAnimContext *ac, SpaceAction *saction)
}
}
-/* ----------- Private Stuff - IPO Editor ------------- */
+/* ----------- Private Stuff - Graph Editor ------------- */
/* Get data being edited in Graph Editor (depending on current 'mode') */
static short graphedit_get_context (bAnimContext *ac, SpaceIpo *sipo)
@@ -204,6 +209,12 @@ static short graphedit_get_context (bAnimContext *ac, SpaceIpo *sipo)
if (sipo->ads == NULL)
sipo->ads= MEM_callocN(sizeof(bDopeSheet), "GraphEdit DopeSheet");
+ /* set settings for Graph Editor - "Selected = Editable" */
+ if (sipo->flag & SIPO_SELCUVERTSONLY)
+ sipo->ads->filterflag |= ADS_FILTER_SELEDIT;
+ else
+ sipo->ads->filterflag &= ~ADS_FILTER_SELEDIT;
+
/* sync settings with current view status, then return appropriate data */
switch (sipo->mode) {
case SIPO_MODE_ANIMATION: /* Animation F-Curve Editor */
@@ -237,6 +248,26 @@ static short graphedit_get_context (bAnimContext *ac, SpaceIpo *sipo)
}
}
+/* ----------- Private Stuff - NLA Editor ------------- */
+
+/* Get data being edited in Graph Editor (depending on current 'mode') */
+static short nlaedit_get_context (bAnimContext *ac, SpaceNla *snla)
+{
+ /* init dopesheet data if non-existant (i.e. for old files) */
+ if (snla->ads == NULL)
+ snla->ads= MEM_callocN(sizeof(bDopeSheet), "NlaEdit DopeSheet");
+
+ /* sync settings with current view status, then return appropriate data */
+ /* update scene-pointer (no need to check for pinning yet, as not implemented) */
+ snla->ads->source= (ID *)ac->scene;
+ snla->ads->filterflag |= ADS_FILTER_ONLYNLA;
+
+ ac->datatype= ANIMCONT_NLA;
+ ac->data= snla->ads;
+
+ return 1;
+}
+
/* ----------- Public API --------------- */
/* Obtain current anim-data context, given that context info from Blender context has already been set
@@ -264,6 +295,13 @@ short ANIM_animdata_context_getdata (bAnimContext *ac)
ok= graphedit_get_context(ac, sipo);
}
break;
+
+ case SPACE_NLA:
+ {
+ SpaceNla *snla= (SpaceNla *)sa->spacedata.first;
+ ok= nlaedit_get_context(ac, snla);
+ }
+ break;
}
}
@@ -313,11 +351,84 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
/* quick macro to test if AnimData is usable for drivers */
#define ANIMDATA_HAS_DRIVERS(id) ((id)->adt && (id)->adt->drivers.first)
-/* quick macro to test if a anim-channel (F-Curve, Group, etc.) is selected in an acceptable way */
+/* quick macro to test if AnimData is usable for NLA */
+#define ANIMDATA_HAS_NLA(id) ((id)->adt && (id)->adt->nla_tracks.first)
+
+
+/* Quick macro to test for all three avove usability tests, performing the appropriate provided
+ * action for each when the AnimData context is appropriate.
+ *
+ * Priority order for this goes (most important, to least): AnimData blocks, NLA, Drivers, Keyframes.
+ *
+ * For this to work correctly, a standard set of data needs to be available within the scope that this
+ * gets called in:
+ * - ListBase anim_data;
+ * - bDopeSheet *ads;
+ * - bAnimListElem *ale;
+ * - int items;
+ *
+ * - id: ID block which should have an AnimData pointer following it immediately, to use
+ * - adtOk: line or block of code to execute for AnimData-blocks case (usually ANIMDATA_ADD_ANIMDATA)
+ * - nlaOk: line or block of code to execute for NLA case
+ * - driversOk: line or block of code to execute for Drivers case
+ * - keysOk: line or block of code for Keyframes case
+ */
+#define ANIMDATA_FILTER_CASES(id, adtOk, nlaOk, driversOk, keysOk) \
+ {\
+ if ((id)->adt) {\
+ if (!(filter_mode & ANIMFILTER_CURVEVISIBLE) || !((id)->adt->flag & ADT_CURVES_NOT_VISIBLE)) {\
+ if (filter_mode & ANIMFILTER_ANIMDATA) {\
+ adtOk\
+ }\
+ else if (ads->filterflag & ADS_FILTER_ONLYNLA) {\
+ if (ANIMDATA_HAS_NLA(id)) {\
+ nlaOk\
+ }\
+ else if (!(ads->filterflag & ADS_FILTER_NLA_NOACT) && ANIMDATA_HAS_KEYS(id)) {\
+ nlaOk\
+ }\
+ }\
+ else if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {\
+ if (ANIMDATA_HAS_DRIVERS(id)) {\
+ driversOk\
+ }\
+ }\
+ else {\
+ if (ANIMDATA_HAS_KEYS(id)) {\
+ keysOk\
+ }\
+ }\
+ }\
+ }\
+ }
+
+
+/* quick macro to add a pointer to an AnimData block as a channel */
+#define ANIMDATA_ADD_ANIMDATA(id) \
+ {\
+ ale= make_new_animlistelem((id)->adt, ANIMTYPE_ANIMDATA, NULL, ANIMTYPE_NONE, (ID *)id);\
+ if (ale) {\
+ BLI_addtail(anim_data, ale);\
+ items++;\
+ }\
+ }
+
+
+
+/* quick macro to test if an anim-channel (F-Curve, Group, etc.) is selected in an acceptable way */
#define ANIMCHANNEL_SELOK(test_func) \
( !(filter_mode & (ANIMFILTER_SEL|ANIMFILTER_UNSEL)) || \
((filter_mode & ANIMFILTER_SEL) && test_func) || \
((filter_mode & ANIMFILTER_UNSEL) && test_func==0) )
+
+/* quick macro to test if an anim-channel (F-Curve) is selected ok for editing purposes
+ * - _SELEDIT means that only selected curves will have visible+editable keyframes
+ */
+// FIXME: this doesn't work cleanly yet...
+#define ANIMCHANNEL_SELEDITOK(test_func) \
+ ( !(filter_mode & ANIMFILTER_SELEDIT) || \
+ (filter_mode & ANIMFILTER_CHANNELS) || \
+ (test_func) )
/* ----------- 'Private' Stuff --------------- */
@@ -340,6 +451,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->ownertype= ownertype;
ale->id= owner_id;
+ ale->adt= BKE_animdata_from_id(owner_id);
/* do specifics */
switch (datatype) {
@@ -351,6 +463,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= sce;
ale->datatype= ALE_SCE;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_OBJECT:
@@ -362,6 +476,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= ob;
ale->datatype= ALE_OB;
+
+ ale->adt= BKE_animdata_from_id(&ob->id);
}
break;
case ANIMTYPE_FILLACTD:
@@ -395,6 +511,16 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->datatype= ALE_NONE;
}
break;
+ case ANIMTYPE_FILLPARTD:
+ {
+ Object *ob= (Object *)data;
+
+ ale->flag= FILTER_PART_OBJC(ob);
+
+ ale->key_data= NULL;
+ ale->datatype= ALE_NONE;
+ }
+ break;
case ANIMTYPE_DSMAT:
{
@@ -405,6 +531,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_DSLAM:
@@ -416,6 +544,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_DSCAM:
@@ -427,6 +557,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_DSCUR:
@@ -438,6 +570,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_DSSKEY:
@@ -449,6 +583,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
case ANIMTYPE_DSWOR:
@@ -460,6 +596,21 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->key_data= (adt) ? adt->action : NULL;
ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
+ }
+ break;
+ case ANIMTYPE_DSPART:
+ {
+ ParticleSettings *part= (ParticleSettings*)ale->data;
+ AnimData *adt= part->adt;
+
+ ale->flag= FILTER_PART_OBJD(part);
+
+ ale->key_data= (adt) ? adt->action : NULL;
+ ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
}
break;
@@ -494,6 +645,25 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->datatype= ALE_GPFRAME;
}
break;
+
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)data;
+
+ ale->flag= nlt->flag;
+
+ // XXX or should this be done some other way?
+ ale->key_data= &nlt->strips;
+ ale->datatype= ALE_NLASTRIP;
+ }
+ break;
+ case ANIMTYPE_NLAACTION:
+ {
+ /* nothing to include for now... nothing editable from NLA-perspective here */
+ ale->key_data= NULL;
+ ale->datatype= ALE_NONE;
+ }
+ break;
}
}
@@ -519,10 +689,9 @@ static int animdata_filter_fcurves (ListBase *anim_data, FCurve *first, bActionG
/* only work with this channel and its subchannels if it is editable */
if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_FCU(fcu)) {
/* only include this curve if selected in a way consistent with the filtering requirements */
- if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) ) {
+ if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu)) ) {
/* only include if this curve is active */
if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) {
- /* owner/ownertype will be either object or action-channel, depending if it was dopesheet or part of an action */
ale= make_new_animlistelem(fcu, ANIMTYPE_FCURVE, owner, ownertype, owner_id);
if (ale) {
@@ -575,25 +744,30 @@ static int animdata_filter_action (ListBase *anim_data, bAction *act, int filter
* cases when we should include F-Curves inside group:
* - we don't care about visibility
* - group is expanded
- * - we're interested in keyframes, but not if they appear in selected channels
+ * - we just need the F-Curves present
*/
- // XXX what was the selection check here for again?
- if ( (!(filter_mode & ANIMFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) ||
- ( /*ANIMCHANNEL_SELOK(SEL_AGRP(agrp)) &&*/ (filter_mode & ANIMFILTER_CURVESONLY) ) )
+ if ( (!(filter_mode & ANIMFILTER_VISIBLE) || EXPANDED_AGRP(agrp)) || (filter_mode & ANIMFILTER_CURVESONLY) )
{
- if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
- // XXX the 'owner' info here needs review...
- items += animdata_filter_fcurves(anim_data, agrp->channels.first, agrp, owner, ownertype, filter_mode, owner_id);
-
- /* remove group from filtered list if last element is group
- * (i.e. only if group had channels, which were all hidden)
- */
- // XXX this is really hacky... it should be fixed in a much more elegant way!
- if ( (ale) && (anim_data->last == ale) &&
- (ale->data == agrp) && (agrp->channels.first) )
- {
- BLI_freelinkN(anim_data, ale);
- items--;
+ /* for the Graph Editor, curves may be set to not be visible in the view to lessen clutter,
+ * but to do this, we need to check that the group doesn't have it's not-visible flag set preventing
+ * all its sub-curves to be shown
+ */
+ if ( !(filter_mode & ANIMFILTER_CURVEVISIBLE) || !(agrp->flag & AGRP_NOTVISIBLE) )
+ {
+ if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_AGRP(agrp)) {
+ // XXX the 'owner' info here needs review...
+ items += animdata_filter_fcurves(anim_data, agrp->channels.first, agrp, owner, ownertype, filter_mode, owner_id);
+
+ /* remove group from filtered list if last element is group
+ * (i.e. only if group had channels, which were all hidden)
+ */
+ // XXX this is really hacky... it should be fixed in a much more elegant way!
+ if ( (ale) && (anim_data->last == ale) &&
+ (ale->data == agrp) && (agrp->channels.first) )
+ {
+ BLI_freelinkN(anim_data, ale);
+ items--;
+ }
}
}
}
@@ -610,65 +784,77 @@ static int animdata_filter_action (ListBase *anim_data, bAction *act, int filter
return items;
}
-static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int filter_mode, void *owner, short ownertype, ID *owner_id)
+/* Include NLA-Data for NLA-Editor:
+ * - when ANIMFILTER_CHANNELS is used, that means we should be filtering the list for display
+ * Although the evaluation order is from the first track to the last and then apply the Action on top,
+ * we present this in the UI as the Active Action followed by the last track to the first so that we
+ * get the evaluation order presented as per a stack.
+ * - 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 (ListBase *anim_data, AnimData *adt, int filter_mode, void *owner, short ownertype, ID *owner_id)
{
bAnimListElem *ale;
- KeyBlock *kb;
- //FCurve *fcu;
- int i, items=0;
+ NlaTrack *nlt;
+ NlaTrack *first=NULL, *next=NULL;
+ int items = 0;
- /* are we filtering for display or editing */
+ /* if showing channels, include active action */
if (filter_mode & ANIMFILTER_CHANNELS) {
- /* for display - loop over shapekeys, adding ipo-curve references where needed */
- kb= key->block.first;
-
- /* loop through possible shapekeys, manually creating entries */
- for (i= 1; i < key->totkey; i++) {
- ale= MEM_callocN(sizeof(bAnimListElem), "bAnimListElem");
- kb = kb->next; /* do this even on the first try, as the first is 'Basis' (which doesn't get included) */
-
- ale->data= kb;
- ale->type= ANIMTYPE_SHAPEKEY; /* 'abused' usage of this type */
- ale->owner= key;
- ale->ownertype= ANIMTYPE_SHAPEKEY;
- ale->datatype= ALE_NONE;
- ale->index = i;
-
-#if 0 // XXX fixme... old system
- if (key->ipo) {
- for (icu= key->ipo->curve.first; icu; icu=icu->next) {
- if (icu->adrcode == i) {
- ale->key_data= icu;
- ale->datatype= ALE_ICU;
- break;
- }
- }
+ /* there isn't really anything editable here, so skip if need editable */
+ // TODO: currently, selection isn't checked since it doesn't matter
+ if ((filter_mode & ANIMFILTER_FOREDIT) == 0) {
+ /* just add the action track now (this MUST appear for drawing)
+ * - as AnimData may not have an action, we pass a dummy pointer just to get the list elem created, then
+ * overwrite this with the real value - REVIEW THIS...
+ */
+ ale= make_new_animlistelem((void *)(&adt->action), ANIMTYPE_NLAACTION, owner, ownertype, owner_id);
+ ale->data= (adt->action) ? adt->action : NULL;
+
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
}
-#endif // XXX fixme... old system
-
- ale->id= owner_id;
-
- BLI_addtail(anim_data, ale);
- items++;
}
+
+ /* first track to include will be the last one if we're filtering by channels */
+ first= adt->nla_tracks.last;
}
else {
-#if 0 // XXX fixme... old system
- /* loop over ipo curves if present - for editing */
- if (key->ipo) {
- if (filter_mode & ANIMFILTER_IPOKEYS) {
- ale= make_new_animlistelem(key->ipo, ANIMTYPE_IPO, key, ANIMTYPE_SHAPEKEY);
- if (ale) {
- if (owned) ale->id= owner;
- BLI_addtail(anim_data, ale);
- items++;
+ /* first track to include will the the first one (as per normal) */
+ first= adt->nla_tracks.first;
+ }
+
+ /* loop over NLA Tracks - assume that the caller of this has already checked that these should be included */
+ for (nlt= first; nlt; nlt= next) {
+ /* 'next' NLA-Track to use depends on whether we're filtering for drawing or not */
+ if (filter_mode & ANIMFILTER_CHANNELS)
+ next= nlt->prev;
+ else
+ next= nlt->next;
+
+ /* if we're in NLA-tweakmode, don't show this track if it was disabled (due to tweaking) for now
+ * - active track should still get shown though (even though it has disabled flag set)
+ */
+ // FIXME: the channels after should still get drawn, just 'differently', and after an active-action channel
+ if ((adt->flag & ADT_NLA_EDIT_ON) && (nlt->flag & NLATRACK_DISABLED) && !(nlt->flag & NLATRACK_ACTIVE))
+ continue;
+
+ /* only work with this channel and its subchannels if it is editable */
+ if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_NLT(nlt)) {
+ /* only include this track if selected in a way consistent with the filtering requirements */
+ if ( ANIMCHANNEL_SELOK(SEL_NLT(nlt)) ) {
+ /* only include if this track is active */
+ if (!(filter_mode & ANIMFILTER_ACTIVE) || (nlt->flag & NLATRACK_ACTIVE)) {
+ ale= make_new_animlistelem(nlt, ANIMTYPE_NLATRACK, owner, ownertype, owner_id);
+
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
}
}
- else {
- items += animdata_filter_ipocurves(anim_data, key->ipo, filter_mode, key, ANIMTYPE_SHAPEKEY, (owned)?(owner):(NULL));
- }
}
-#endif // XXX fixme... old system
}
/* return the number of items added to the list */
@@ -700,7 +886,7 @@ static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter
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_getactive(sa);
+ gpd= gpencil_data_get_active(sa);
if (gpd == NULL) continue;
/* add gpd as channel too (if for drawing, and it has layers) */
@@ -752,19 +938,19 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads,
/* firstly check that we actuallly have some materials, by gathering all materials in a temp list */
for (a=0; a < ob->totcol; a++) {
Material *ma= give_current_material(ob, a);
+ short ok = 0;
/* for now, if no material returned, skip (this shouldn't confuse the user I hope) */
if (ELEM(NULL, ma, ma->adt))
continue;
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
- if (ANIMDATA_HAS_KEYS(ma) == 0)
- continue;
- }
- else {
- if (ANIMDATA_HAS_DRIVERS(ma) == 0)
- continue;
- }
+ /* check if ok */
+ ANIMDATA_FILTER_CASES(ma,
+ { /* AnimData blocks - do nothing... */ },
+ ok=1;,
+ ok=1;,
+ ok=1;)
+ if (ok == 0) continue;
/* make a temp list elem for this */
ld= MEM_callocN(sizeof(LinkData), "DopeSheet-MaterialCache");
@@ -801,16 +987,13 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads,
}
}
- /* add material's F-Curve or Driver channels? */
+ /* add material's animation data */
if (FILTER_MAT_OBJD(ma) || (filter_mode & ANIMFILTER_CURVESONLY)) {
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
- // XXX the 'owner' info here is still subject to improvement
- items += animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma);
- }
- else {
- // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
- items += animdata_filter_fcurves(anim_data, ma->adt->drivers.first, NULL, ma, ANIMTYPE_DSMAT, filter_mode, (ID *)ma);
- }
+ ANIMDATA_FILTER_CASES(ma,
+ { /* AnimData blocks - do nothing... */ },
+ items += animdata_filter_nla(anim_data, ma->adt, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma);,
+ items += animdata_filter_fcurves(anim_data, ma->adt->drivers.first, NULL, ma, ANIMTYPE_DSMAT, filter_mode, (ID *)ma);,
+ items += animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma);)
}
}
}
@@ -822,6 +1005,60 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads,
return items;
}
+static int animdata_filter_dopesheet_particles (ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
+{
+ bAnimListElem *ale=NULL;
+ Object *ob= base->object;
+ ParticleSystem *psys = ob->particlesystem.first;
+ int items= 0, first = 1;
+
+ for(; psys; psys=psys->next) {
+ short ok = 0;
+
+ if(ELEM(NULL, psys->part, psys->part->adt))
+ continue;
+
+ ANIMDATA_FILTER_CASES(psys->part,
+ { /* AnimData blocks - do nothing... */ },
+ ok=1;,
+ ok=1;,
+ ok=1;)
+ if (ok == 0) continue;
+
+ /* include particles-expand widget? */
+ if (first && (filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(ob, ANIMTYPE_FILLPARTD, base, ANIMTYPE_OBJECT, (ID *)ob);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ first = 0;
+ }
+
+ /* add particle settings? */
+ if (FILTER_PART_OBJC(ob) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ if ((filter_mode & ANIMFILTER_CHANNELS)){
+ ale = make_new_animlistelem(psys->part, ANIMTYPE_DSPART, base, ANIMTYPE_OBJECT, (ID *)psys->part);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ if (FILTER_PART_OBJD(psys->part) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ ANIMDATA_FILTER_CASES(psys->part,
+ { /* AnimData blocks - do nothing... */ },
+ items += animdata_filter_nla(anim_data, psys->part->adt, filter_mode, psys->part, ANIMTYPE_DSPART, (ID *)psys->part);,
+ items += animdata_filter_fcurves(anim_data, psys->part->adt->drivers.first, NULL, psys->part, ANIMTYPE_DSPART, filter_mode, (ID *)psys->part);,
+ items += animdata_filter_action(anim_data, psys->part->adt->action, filter_mode, psys->part, ANIMTYPE_DSPART, (ID *)psys->part);)
+ }
+ }
+ }
+
+ /* return the number of items added to the list */
+ return items;
+}
+
static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
{
bAnimListElem *ale=NULL;
@@ -857,6 +1094,22 @@ static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ad
expanded= FILTER_CUR_OBJD(cu);
}
break;
+ case OB_MBALL: /* ------- MetaBall ---------- */
+ {
+ MetaBall *mb= (MetaBall *)ob->data;
+
+ type= ANIMTYPE_DSMBALL;
+ expanded= FILTER_MBALL_OBJD(mb);
+ }
+ break;
+ case OB_ARMATURE: /* ------- Armature ---------- */
+ {
+ bArmature *arm= (bArmature *)ob->data;
+
+ type= ANIMTYPE_DSARM;
+ expanded= FILTER_ARM_OBJD(arm);
+ }
+ break;
}
/* special exception for drivers instead of action */
@@ -871,15 +1124,12 @@ static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ad
/* add object-data animation channels? */
if ((expanded) || (filter_mode & ANIMFILTER_CURVESONLY)) {
- /* Action or Drivers? */
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
- // XXX the 'owner' info here is still subject to improvement
- items += animdata_filter_action(anim_data, iat->adt->action, filter_mode, iat, type, (ID *)iat);
- }
- else {
- // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
- items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, iat, type, filter_mode, (ID *)iat);
- }
+ /* filtering for channels - nla, drivers, keyframes */
+ ANIMDATA_FILTER_CASES(iat,
+ { /* AnimData blocks - do nothing... */ },
+ items+= animdata_filter_nla(anim_data, iat->adt, filter_mode, iat, type, (ID *)iat);,
+ items+= animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, iat, type, filter_mode, (ID *)iat);,
+ items += animdata_filter_action(anim_data, iat->adt->action, filter_mode, iat, type, (ID *)iat);)
}
/* return the number of items added to the list */
@@ -889,12 +1139,14 @@ static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ad
static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode)
{
bAnimListElem *ale=NULL;
+ AnimData *adt = NULL;
Object *ob= base->object;
Key *key= ob_get_key(ob);
+ short obdata_ok = 0;
int items = 0;
/* add this object as a channel first */
- if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
+ if ((filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) == 0) {
/* check if filtering by selection */
if ANIMCHANNEL_SELOK((base->flag & SELECT)) {
ale= make_new_animlistelem(base, ANIMTYPE_OBJECT, NULL, ANIMTYPE_NONE, NULL);
@@ -906,76 +1158,79 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
}
/* if collapsed, don't go any further (unless adding keyframes only) */
- if ( (EXPANDED_OBJC(ob) == 0) && !(filter_mode & ANIMFILTER_CURVESONLY) )
+ if ( (EXPANDED_OBJC(ob) == 0) && !(filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) )
return items;
- /* Action or Drivers */
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
- /* Action? */
- if (ANIMDATA_HAS_KEYS(ob) /*&& !(ads->filterflag & ADS_FILTER_NOACTS)*/) {
- AnimData *adt= ob->adt;
-
- /* include action-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLACTD, base, ANIMTYPE_OBJECT, (ID *)ob);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
+ /* Action, Drivers, or NLA */
+ if (ob->adt) {
+ adt= ob->adt;
+ ANIMDATA_FILTER_CASES(ob,
+ { /* AnimData blocks - do nothing... */ },
+ { /* nla */
+ /* add NLA tracks */
+ items += animdata_filter_nla(anim_data, adt, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
+ },
+ { /* drivers */
+ /* include drivers-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLDRIVERS, base, ANIMTYPE_OBJECT, (ID *)ob);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
}
- }
-
- /* add F-Curve channels? */
- if (EXPANDED_ACTC(adt->action) || !(filter_mode & ANIMFILTER_CHANNELS)) {
- // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
- items += animdata_filter_action(anim_data, adt->action, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
- }
- }
- }
- else {
- /* Drivers */
- if (ANIMDATA_HAS_DRIVERS(ob)) {
- AnimData *adt= ob->adt;
-
- /* include drivers-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLDRIVERS, base, ANIMTYPE_OBJECT, (ID *)ob);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
+
+ /* add F-Curve channels (drivers are F-Curves) */
+ if (EXPANDED_DRVD(adt) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
+ items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, ob, ANIMTYPE_OBJECT, filter_mode, (ID *)ob);
+ }
+ },
+ { /* action (keyframes) */
+ /* include action-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLACTD, base, ANIMTYPE_OBJECT, (ID *)ob);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add F-Curve channels? */
+ if (EXPANDED_ACTC(adt->action) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
}
}
-
- /* add F-Curve channels (drivers are F-Curves) */
- if (EXPANDED_DRVD(adt) || !(filter_mode & ANIMFILTER_CHANNELS)) {
- // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?)
- items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, ob, ANIMTYPE_OBJECT, filter_mode, (ID *)ob);
- }
- }
+ );
}
+
/* ShapeKeys? */
if ((key) && !(ads->filterflag & ADS_FILTER_NOSHAPEKEYS)) {
- /* Animation or Drivers */
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
- /* include shapekey-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(key, ANIMTYPE_DSSKEY, base, ANIMTYPE_OBJECT, (ID *)ob);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
+ adt= key->adt;
+ ANIMDATA_FILTER_CASES(key,
+ { /* AnimData blocks - do nothing... */ },
+ { /* nla */
+ /* add NLA tracks */
+ items += animdata_filter_nla(anim_data, adt, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
+ },
+ { /* drivers */
+ /* include shapekey-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(key, ANIMTYPE_DSSKEY, base, ANIMTYPE_OBJECT, (ID *)ob);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
}
- }
-
- /* add channels */
- if (FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) {
- items += animdata_filter_shapekey(anim_data, key, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob);
- }
- }
- else {
- /* Drivers */
- if (ANIMDATA_HAS_DRIVERS(key)) {
- AnimData *adt= key->adt;
+ /* add channels */
+ if (FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, key, ANIMTYPE_DSSKEY, filter_mode, (ID *)key);
+ }
+ },
+ { /* action (keyframes) */
/* include shapekey-expand widget? */
if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
ale= make_new_animlistelem(key, ANIMTYPE_DSSKEY, base, ANIMTYPE_OBJECT, (ID *)ob);
@@ -985,15 +1240,13 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
}
}
- /* add F-Curve channels (drivers are F-Curves) */
- if (FILTER_SKE_OBJD(key)/*EXPANDED_DRVD(adt)*/ || !(filter_mode & ANIMFILTER_CHANNELS)) {
- // XXX owner info is messed up now...
- items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, ob, ANIMTYPE_OBJECT, filter_mode, (ID *)key);
+ /* add channels */
+ if (FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, key, ANIMTYPE_DSSKEY, (ID *)key);
}
}
- }
+ );
}
-
/* Materials? */
if ((ob->totcol) && !(ads->filterflag & ADS_FILTER_NOMAT))
@@ -1006,14 +1259,11 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
Camera *ca= (Camera *)ob->data;
if ((ads->filterflag & ADS_FILTER_NOCAM) == 0) {
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
- if (ANIMDATA_HAS_KEYS(ca))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
- else {
- if (ANIMDATA_HAS_DRIVERS(ca))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
+ ANIMDATA_FILTER_CASES(ca,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
}
}
break;
@@ -1022,14 +1272,11 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
Lamp *la= (Lamp *)ob->data;
if ((ads->filterflag & ADS_FILTER_NOLAM) == 0) {
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
- if (ANIMDATA_HAS_KEYS(la))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
- else {
- if (ANIMDATA_HAS_DRIVERS(la))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
+ ANIMDATA_FILTER_CASES(la,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
}
}
break;
@@ -1038,18 +1285,47 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
Curve *cu= (Curve *)ob->data;
if ((ads->filterflag & ADS_FILTER_NOCUR) == 0) {
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) {
- if (ANIMDATA_HAS_KEYS(cu))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
- else {
- if (ANIMDATA_HAS_DRIVERS(cu))
- items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
- }
+ ANIMDATA_FILTER_CASES(cu,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
+ }
+ }
+ break;
+ case OB_MBALL: /* ------- MetaBall ---------- */
+ {
+ MetaBall *mb= (MetaBall *)ob->data;
+
+ if ((ads->filterflag & ADS_FILTER_NOMBA) == 0) {
+ ANIMDATA_FILTER_CASES(mb,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
+ }
+ }
+ break;
+ case OB_ARMATURE: /* ------- Armature ---------- */
+ {
+ bArmature *arm= (bArmature *)ob->data;
+
+ if ((ads->filterflag & ADS_FILTER_NOARM) == 0) {
+ ANIMDATA_FILTER_CASES(arm,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
}
}
break;
}
+ if (obdata_ok)
+ items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode);
+
+ /* particles */
+ if (ob->particlesystem.first && !(ads->filterflag & ADS_FILTER_NOPART))
+ items += animdata_filter_dopesheet_particles(anim_data, ads, base, filter_mode);
/* return the number of items added to the list */
return items;
@@ -1058,11 +1334,12 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B
static int animdata_filter_dopesheet_scene (ListBase *anim_data, bDopeSheet *ads, Scene *sce, int filter_mode)
{
World *wo= sce->world;
+ AnimData *adt= NULL;
bAnimListElem *ale;
int items = 0;
/* add scene as a channel first (even if we aren't showing scenes we still need to show the scene's sub-data */
- if ((filter_mode & ANIMFILTER_CURVESONLY) == 0) {
+ if ((filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) == 0) {
/* check if filtering by selection */
if (ANIMCHANNEL_SELOK( (sce->flag & SCE_DS_SELECTED) )) {
ale= make_new_animlistelem(sce, ANIMTYPE_SCENE, NULL, ANIMTYPE_NONE, NULL);
@@ -1074,77 +1351,63 @@ static int animdata_filter_dopesheet_scene (ListBase *anim_data, bDopeSheet *ads
}
/* if collapsed, don't go any further (unless adding keyframes only) */
- if ( (EXPANDED_SCEC(sce) == 0) && !(filter_mode & ANIMFILTER_CURVESONLY) )
+ if ( (EXPANDED_SCEC(sce) == 0) && !(filter_mode & (ANIMFILTER_CURVESONLY|ANIMFILTER_NLATRACKS)) )
return items;
- /* Action or Drivers */
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
- /* Action? */
- if (ANIMDATA_HAS_KEYS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE)) {
- AnimData *adt= sce->adt;
-
- /* include action-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLACTD, sce, ANIMTYPE_SCENE, (ID *)sce);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
+ /* Action, Drivers, or NLA for Scene */
+ if ((ads->filterflag & ADS_FILTER_NOSCE) == 0) {
+ adt= sce->adt;
+ ANIMDATA_FILTER_CASES(sce,
+ { /* AnimData blocks - do nothing... */ },
+ { /* nla */
+ /* add NLA tracks */
+ items += animdata_filter_nla(anim_data, adt, filter_mode, sce, ANIMTYPE_SCENE, (ID *)sce);
+ },
+ { /* drivers */
+ /* include drivers-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLDRIVERS, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
}
- }
-
- /* add F-Curve channels? */
- if (EXPANDED_ACTC(adt->action) || !(filter_mode & ANIMFILTER_CHANNELS)) {
- items += animdata_filter_action(anim_data, adt->action, filter_mode, sce, ANIMTYPE_SCENE, (ID *)sce);
- }
- }
- }
- else {
- /* Drivers */
- if (ANIMDATA_HAS_DRIVERS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE)) {
- AnimData *adt= sce->adt;
-
- /* include drivers-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLDRIVERS, sce, ANIMTYPE_SCENE, (ID *)sce);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
+
+ /* add F-Curve channels (drivers are F-Curves) */
+ if (EXPANDED_DRVD(adt) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, sce, ANIMTYPE_SCENE, filter_mode, (ID *)sce);
+ }
+ },
+ { /* action */
+ /* include action-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(adt->action, ANIMTYPE_FILLACTD, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add F-Curve channels? */
+ if (EXPANDED_ACTC(adt->action) || !(filter_mode & ANIMFILTER_CHANNELS)) {
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, sce, ANIMTYPE_SCENE, (ID *)sce);
}
}
-
- /* add F-Curve channels (drivers are F-Curves) */
- if (EXPANDED_DRVD(adt) || !(filter_mode & ANIMFILTER_CHANNELS)) {
- items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, sce, ANIMTYPE_SCENE, filter_mode, (ID *)sce);
- }
- }
+ )
}
-
+
/* world */
if ((wo && wo->adt) && !(ads->filterflag & ADS_FILTER_NOWOR)) {
- /* Animation or Drivers */
- if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS) == 0) {
- AnimData *adt= wo->adt;
-
- /* include world-expand widget? */
- if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
- ale= make_new_animlistelem(wo, ANIMTYPE_DSWOR, sce, ANIMTYPE_SCENE, (ID *)sce);
- if (ale) {
- BLI_addtail(anim_data, ale);
- items++;
- }
- }
-
- /* add channels */
- if (FILTER_WOR_SCED(wo) || (filter_mode & ANIMFILTER_CURVESONLY)) {
- items += animdata_filter_action(anim_data, adt->action, filter_mode, wo, ANIMTYPE_DSWOR, (ID *)wo);
- }
- }
- else {
- /* Drivers */
- if (ANIMDATA_HAS_DRIVERS(wo)) {
- AnimData *adt= wo->adt;
-
- /* include shapekey-expand widget? */
+ /* Action, Drivers, or NLA for World */
+ adt= wo->adt;
+ ANIMDATA_FILTER_CASES(wo,
+ { /* AnimData blocks - do nothing... */ },
+ { /* nla */
+ /* add NLA tracks */
+ items += animdata_filter_nla(anim_data, adt, filter_mode, wo, ANIMTYPE_DSWOR, (ID *)wo);
+ },
+ { /* drivers */
+ /* include world-expand widget? */
if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
ale= make_new_animlistelem(wo, ANIMTYPE_DSWOR, sce, ANIMTYPE_SCENE, (ID *)wo);
if (ale) {
@@ -1158,8 +1421,23 @@ static int animdata_filter_dopesheet_scene (ListBase *anim_data, bDopeSheet *ads
// XXX owner info is messed up now...
items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, wo, ANIMTYPE_DSWOR, filter_mode, (ID *)wo);
}
+ },
+ { /* action */
+ /* include world-expand widget? */
+ if ((filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) {
+ ale= make_new_animlistelem(wo, ANIMTYPE_DSWOR, sce, ANIMTYPE_SCENE, (ID *)sce);
+ if (ale) {
+ BLI_addtail(anim_data, ale);
+ items++;
+ }
+ }
+
+ /* add channels */
+ if (FILTER_WOR_SCED(wo) || (filter_mode & ANIMFILTER_CURVESONLY)) {
+ items += animdata_filter_action(anim_data, adt->action, filter_mode, wo, ANIMTYPE_DSWOR, (ID *)wo);
+ }
}
- }
+ )
}
/* return the number of items added to the list */
@@ -1171,6 +1449,7 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
{
Scene *sce= (Scene *)ads->source;
Base *base;
+ bAnimListElem *ale;
int items = 0;
/* check that we do indeed have a scene */
@@ -1182,22 +1461,40 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
/* scene-linked animation */
// TODO: sequencer, composite nodes - are we to include those here too?
{
- short sceOk, worOk;
+ short sceOk= 0, worOk= 0;
/* check filtering-flags if ok */
- if (ads->filterflag) {
- if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {
- sceOk= (ANIMDATA_HAS_DRIVERS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE));
- worOk= ((sce->world) && ANIMDATA_HAS_DRIVERS(sce->world) && !(ads->filterflag & ADS_FILTER_NOWOR));
- }
- else {
- sceOk= (ANIMDATA_HAS_KEYS(sce) && !(ads->filterflag & ADS_FILTER_NOSCE));
- worOk= ((sce->world) && ANIMDATA_HAS_KEYS(sce->world) && !(ads->filterflag & ADS_FILTER_NOWOR));
- }
+ ANIMDATA_FILTER_CASES(sce,
+ {
+ /* 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(sce);
+ sceOk=0;
+ },
+ sceOk= !(ads->filterflag & ADS_FILTER_NOSCE);,
+ sceOk= !(ads->filterflag & ADS_FILTER_NOSCE);,
+ sceOk= !(ads->filterflag & ADS_FILTER_NOSCE);)
+ if (sce->world) {
+ ANIMDATA_FILTER_CASES(sce->world,
+ {
+ /* 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(sce->world);
+ worOk=0;
+ },
+ worOk= !(ads->filterflag & ADS_FILTER_NOWOR);,
+ worOk= !(ads->filterflag & ADS_FILTER_NOWOR);,
+ worOk= !(ads->filterflag & ADS_FILTER_NOWOR);)
}
- else {
- sceOk= (ANIMDATA_HAS_KEYS(sce));
- worOk= ((sce->world) && ANIMDATA_HAS_KEYS(sce->world));
+
+ /* if only F-Curves with visible flags set can be shown, check that
+ * datablocks haven't been set to invisible
+ */
+ if (filter_mode & ANIMFILTER_CURVEVISIBLE) {
+ if ((sce->adt) && (sce->adt->flag & ADT_CURVES_NOT_VISIBLE))
+ sceOk= worOk= 0;
}
/* check if not all bad (i.e. so there is something to show) */
@@ -1214,9 +1511,9 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
if (base->object) {
Object *ob= base->object;
Key *key= ob_get_key(ob);
- short actOk=1, keyOk=1, dataOk=1, matOk=1;
+ short actOk=1, keyOk=1, dataOk=1, matOk=1, partOk=1;
- /* firstly, check if object can be included, by the following fanimors:
+ /* firstly, check if object can be included, by the following factors:
* - if only visible, must check for layer and also viewport visibility
* - if only selected, must check if object is selected
* - there must be animation data to edit
@@ -1230,6 +1527,14 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
if (ob->restrictflag & OB_RESTRICT_VIEW) continue;
}
+ /* if only F-Curves with visible flags set can be shown, check that
+ * datablock hasn't been set to invisible
+ */
+ if (filter_mode & ANIMFILTER_CURVEVISIBLE) {
+ if ((ob->adt) && (ob->adt->flag & ADT_CURVES_NOT_VISIBLE))
+ continue;
+ }
+
/* additionally, dopesheet filtering also affects what objects to consider */
if (ads->filterflag) {
/* check selection and object type filters */
@@ -1239,13 +1544,33 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
}
/* check filters for datatypes */
- if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {
- actOk= (ANIMDATA_HAS_DRIVERS(ob));
- keyOk= ((key) && ANIMDATA_HAS_DRIVERS(key) && !(ads->filterflag & ADS_FILTER_NOSHAPEKEYS));
- }
- else {
- actOk= ANIMDATA_HAS_KEYS(ob);
- keyOk= ((key) && ANIMDATA_HAS_KEYS(key) && !(ads->filterflag & ADS_FILTER_NOSHAPEKEYS));
+ /* object */
+ actOk= 0;
+ keyOk= 0;
+ ANIMDATA_FILTER_CASES(ob,
+ {
+ /* 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(ob);
+ actOk=0;
+ },
+ actOk= 1;,
+ actOk= 1;,
+ actOk= 1;)
+ if (key) {
+ /* shapekeys */
+ ANIMDATA_FILTER_CASES(key,
+ {
+ /* 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(key);
+ keyOk=0;
+ },
+ keyOk= 1;,
+ keyOk= 1;,
+ keyOk= 1;)
}
/* materials - only for geometric types */
@@ -1259,19 +1584,23 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
for (a=0; a < ob->totcol; a++) {
Material *ma= give_current_material(ob, a);
- /* if material has relevant animation data, break */
- if (ads->filterflag & ADS_FILTER_ONLYDRIVERS) {
- if (ANIMDATA_HAS_DRIVERS(ma)) {
- matOk= 1;
- break;
- }
- }
- else {
- if (ANIMDATA_HAS_KEYS(ma)) {
- matOk= 1;
- break;
- }
+ if (ma) {
+ /* if material has relevant animation data, break */
+ ANIMDATA_FILTER_CASES(ma,
+ {
+ /* 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(ma);
+ matOk=0;
+ },
+ matOk= 1;,
+ matOk= 1;,
+ matOk= 1;)
}
+
+ if (matOk)
+ break;
}
}
@@ -1280,19 +1609,86 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
case OB_CAMERA: /* ------- Camera ------------ */
{
Camera *ca= (Camera *)ob->data;
- if (ads->filterflag & ADS_FILTER_ONLYDRIVERS)
- dataOk= (ANIMDATA_HAS_DRIVERS(ca) && !(ads->filterflag & ADS_FILTER_NOCAM));
- else
- dataOk= (ANIMDATA_HAS_KEYS(ca) && !(ads->filterflag & ADS_FILTER_NOCAM));
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(ca,
+ if ((ads->filterflag & ADS_FILTER_NOCAM)==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(ca);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCAM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCAM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCAM);)
}
break;
case OB_LAMP: /* ---------- Lamp ----------- */
{
Lamp *la= (Lamp *)ob->data;
- if (ads->filterflag & ADS_FILTER_ONLYDRIVERS)
- dataOk= (ANIMDATA_HAS_DRIVERS(la) && !(ads->filterflag & ADS_FILTER_NOLAM));
- else
- dataOk= (ANIMDATA_HAS_KEYS(la) && !(ads->filterflag & ADS_FILTER_NOLAM));
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(la,
+ if ((ads->filterflag & ADS_FILTER_NOLAM)==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(la);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAM);)
+ }
+ break;
+ case OB_CURVE: /* ------- Curve ---------- */
+ {
+ Curve *cu= (Curve *)ob->data;
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(cu,
+ if ((ads->filterflag & ADS_FILTER_NOCUR)==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(cu);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCUR);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCUR);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOCUR);)
+ }
+ break;
+ case OB_MBALL: /* ------- MetaBall ---------- */
+ {
+ MetaBall *mb= (MetaBall *)ob->data;
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(mb,
+ if ((ads->filterflag & ADS_FILTER_NOMBA)==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(mb);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);)
+ }
+ break;
+ case OB_ARMATURE: /* ------- Armature ---------- */
+ {
+ bArmature *arm= (bArmature *)ob->data;
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(arm,
+ if ((ads->filterflag & ADS_FILTER_NOARM)==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(arm);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOARM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOARM);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOARM);)
}
break;
default: /* --- other --- */
@@ -1300,8 +1696,33 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
break;
}
+ /* particles */
+ partOk = 0;
+ if (!(ads->filterflag & ADS_FILTER_NOPART) && ob->particlesystem.first) {
+ ParticleSystem *psys = ob->particlesystem.first;
+ for(; psys; psys=psys->next) {
+ if (psys->part) {
+ /* if particlesettings has relevant animation data, break */
+ ANIMDATA_FILTER_CASES(psys->part,
+ {
+ /* 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(psys->part);
+ partOk=0;
+ },
+ partOk= 1;,
+ partOk= 1;,
+ partOk= 1;)
+ }
+
+ if (partOk)
+ break;
+ }
+ }
+
/* check if all bad (i.e. nothing to show) */
- if (!actOk && !keyOk && !dataOk && !matOk)
+ if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
continue;
}
else {
@@ -1346,13 +1767,37 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int
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;
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)
+ if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
continue;
}
@@ -1390,7 +1835,7 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
break;
case ANIMCONT_SHAPEKEY:
- items= animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+ //items= animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
break;
case ANIMCONT_GPENCIL:
@@ -1400,6 +1845,7 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
case ANIMCONT_DOPESHEET:
case ANIMCONT_FCURVES:
case ANIMCONT_DRIVERS:
+ case ANIMCONT_NLA:
items= animdata_filter_dopesheet(anim_data, data, filter_mode);
break;
}
diff --git a/source/blender/editors/animation/anim_intern.h b/source/blender/editors/animation/anim_intern.h
index e903007fbc0..462ef76ea8d 100644
--- a/source/blender/editors/animation/anim_intern.h
+++ b/source/blender/editors/animation/anim_intern.h
@@ -1,18 +1,42 @@
-/* Testing code for 2.5 animation system
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place * Suite 330, Boston, MA 02111*1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009, Blender Foundation, Joshua Leung
+ * This is a new part of Blender (with some old code)
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#ifndef ANIM_INTERN_H
#define ANIM_INTERN_H
-
/* KeyingSets/Keyframing Interface ------------- */
/* list of builtin KeyingSets (defined in keyingsets.c) */
extern ListBase builtin_keyingsets;
+/* for builtin keyingsets - context poll */
short keyingset_context_ok_poll(bContext *C, KeyingSet *ks);
+/* Main KeyingSet operations API call */
short modifykey_get_context_data (bContext *C, ListBase *dsources, KeyingSet *ks);
#endif // ANIM_INTERN_H
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index aecf437a30b..26edf930f0b 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -93,9 +93,8 @@ int geticon_anim_blocktype(short blocktype)
}
/* Write into "name" buffer, the name of the property (retrieved using RNA from the curve's settings)
- * WARNING: name buffer we're writing to cannot exceed 128 chars (check action_draw.c for details)
+ * WARNING: name buffer we're writing to cannot exceed 256 chars (check anim_channels_defines.c for details)
*/
-// TODO: have an extra var to indicate if prop was valid?
void getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
{
/* sanity checks */
@@ -148,26 +147,14 @@ void getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
propname= (char *)RNA_property_ui_name(prop);
/* Array Index - only if applicable */
- if (RNA_property_array_length(prop)) {
- static char *vectoritem[4]= {"X ", "Y ", "Z ", "W "};
- static char *quatitem[4]= {"W ", "X ", "Y ", "Z "};
- static char *coloritem[4]= {"R ", "G ", "B ", "A "};
+ if (RNA_property_array_length(&ptr, prop)) {
+ char c= RNA_property_array_item_char(prop, fcu->array_index);
- int tot= RNA_property_array_length(prop);
- int propsubtype= RNA_property_subtype(prop);
-
- /* get string to use for array index */
- if ((tot == 4) && (propsubtype == PROP_ROTATION))
- arrayname= quatitem[fcu->array_index];
- else if ( (tot <= 4) && ((propsubtype == PROP_VECTOR) || (propsubtype == PROP_ROTATION)) )
- arrayname= vectoritem[fcu->array_index];
- else if ((tot <= 4) && (propsubtype == PROP_COLOR))
- arrayname= coloritem[fcu->array_index];
- else {
- /* we need to write the index to a temp buffer (in py syntax), as it is a number... */
- sprintf(arrayindbuf, "[%d]", fcu->array_index);
- arrayname= &arrayindbuf[0];
- }
+ /* we need to write the index to a temp buffer (in py syntax) */
+ if(c) sprintf(arrayindbuf, "%c ", c);
+ else sprintf(arrayindbuf, "[%d]", fcu->array_index);
+
+ arrayname= &arrayindbuf[0];
}
else {
/* no array index */
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 2abec6b831c..bed534ae070 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -85,6 +85,7 @@ static ListBase *context_get_markers(const bContext *C)
}
/* 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)
{
TimeMarker *marker, *nearest=NULL;
@@ -457,7 +458,7 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, wmEvent *evt)
mm->event_type= evt->type;
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
/* reset frs delta */
RNA_int_set(op->ptr, "frames", 0);
@@ -620,7 +621,7 @@ static void MARKER_OT_move(wmOperatorType *ot)
ot->poll= ED_operator_areaactive;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* rna storage */
RNA_def_int(ot->srna, "frames", 0, INT_MIN, INT_MAX, "Frames", "", INT_MIN, INT_MAX);
@@ -828,6 +829,7 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
/* XXX marker context */
for(marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
+ /* XXX weak... */
switch (event_type) {
case LEFTMOUSE:
if ((marker->flag & SELECT) == 0)
@@ -976,7 +978,7 @@ static void MARKER_OT_delete(wmOperatorType *ot)
/* ************************** registration **********************************/
/* called in screen_ops.c:ED_operatortypes_screen() */
-void ED_marker_operatortypes(void)
+void ED_operatortypes_marker(void)
{
WM_operatortype_append(MARKER_OT_add);
WM_operatortype_append(MARKER_OT_move);
@@ -990,7 +992,7 @@ void ED_marker_operatortypes(void)
/* called in screen_ops.c:ED_keymap_screen() */
void ED_marker_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Markers", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Markers", 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_add", MKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_move", EVT_TWEAK_S, KM_ANY, 0, 0);
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index e899cc1d520..40c5b8893a1 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -56,6 +56,8 @@
#include "ED_markers.h"
#include "ED_screen.h"
+#include "BKE_sound.h"
+
/* ********************** frame change operator ***************************/
/* Set any flags that are necessary to indicate modal time-changing operation */
@@ -67,7 +69,7 @@ static int change_frame_init(bContext *C, wmOperator *op)
return 0;
if (curarea->spacetype == SPACE_TIME) {
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
+ SpaceTime *stime= CTX_wm_space_time(C);
/* timeline displays frame number only when dragging indicator */
// XXX make this more in line with other anim editors?
@@ -83,12 +85,16 @@ static void change_frame_apply(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
int cfra;
- /* get frame, and clamp to MINFRAME */
+ /* get frame, and clamp to MINAFRAME
+ * - not MINFRAME, since it's useful to be able to key a few-frames back
+ */
cfra= RNA_int_get(op->ptr, "frame");
- if (cfra < MINFRAME) cfra= MINFRAME;
+ if (cfra < MINAFRAME) cfra= MINAFRAME;
CFRA= cfra;
+ sound_scrub(C);
+
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
}
@@ -101,7 +107,7 @@ static void change_frame_exit(bContext *C, wmOperator *op)
return;
if (curarea->spacetype == SPACE_TIME) {
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
+ SpaceTime *stime= CTX_wm_space_time(C);
/* timeline displays frame number only when dragging indicator */
// XXX make this more in line with other anim editors?
@@ -119,6 +125,7 @@ static int change_frame_exec(bContext *C, wmOperator *op)
change_frame_apply(C, op);
change_frame_exit(C, op);
+
return OPERATOR_FINISHED;
}
@@ -155,7 +162,7 @@ static int change_frame_invoke(bContext *C, wmOperator *op, wmEvent *event)
change_frame_apply(C, op);
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -186,7 +193,7 @@ static int change_frame_modal(bContext *C, wmOperator *op, wmEvent *event)
/* we check for either mouse-button to end, as checking for ACTIONMOUSE (which is used to init
* the modal op) doesn't work for some reason
*/
- if (event->val==0) {
+ if (event->val==KM_RELEASE) {
change_frame_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -207,9 +214,12 @@ void ANIM_OT_change_frame(wmOperatorType *ot)
ot->invoke= change_frame_invoke;
ot->cancel= change_frame_cancel;
ot->modal= change_frame_modal;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
/* rna */
- RNA_def_int(ot->srna, "frame", 0, 1, MAXFRAME, "Frame", "", 1, MAXFRAME);
+ RNA_def_int(ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME);
}
/* ****************** set preview range operator ****************************/
@@ -317,31 +327,31 @@ static int toggle_time_exec(bContext *C, wmOperator *op)
switch (curarea->spacetype) {
case SPACE_TIME: /* TimeLine */
{
- SpaceTime *stime= (SpaceTime *)CTX_wm_space_data(C);
+ SpaceTime *stime= CTX_wm_space_time(C);
stime->flag ^= TIME_DRAWFRAMES;
}
break;
case SPACE_ACTION: /* Action Editor */
{
- SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C);
+ SpaceAction *saction= CTX_wm_space_action(C);
saction->flag ^= SACTION_DRAWTIME;
}
break;
case SPACE_IPO: /* Graph Editor */
{
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
sipo->flag ^= SIPO_DRAWTIME;
}
break;
case SPACE_NLA: /* NLA Editor */
{
- SpaceNla *snla= (SpaceNla *)CTX_wm_space_data(C);
+ SpaceNla *snla= CTX_wm_space_nla(C);
snla->flag ^= SNLA_DRAWTIME;
}
break;
case SPACE_SEQ: /* Sequencer */
{
- SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C);
+ SpaceSeq *sseq= CTX_wm_space_seq(C);
sseq->flag ^= SEQ_DRAWFRAMES;
}
break;
@@ -371,38 +381,39 @@ void ANIM_OT_time_toggle(wmOperatorType *ot)
void ED_operatortypes_anim(void)
{
+ /* Animation Editors only -------------------------- */
WM_operatortype_append(ANIM_OT_change_frame);
WM_operatortype_append(ANIM_OT_time_toggle);
WM_operatortype_append(ANIM_OT_previewrange_set);
WM_operatortype_append(ANIM_OT_previewrange_clear);
- // XXX this is used all over... maybe for screen instead?
+ /* Entire UI --------------------------------------- */
WM_operatortype_append(ANIM_OT_insert_keyframe);
WM_operatortype_append(ANIM_OT_delete_keyframe);
WM_operatortype_append(ANIM_OT_insert_keyframe_menu);
- //WM_operatortype_append(ANIM_OT_delete_keyframe_menu);
+ WM_operatortype_append(ANIM_OT_delete_keyframe_v3d);
WM_operatortype_append(ANIM_OT_insert_keyframe_button);
WM_operatortype_append(ANIM_OT_delete_keyframe_button);
- WM_operatortype_append(ANIM_OT_delete_keyframe_old); // xxx remove?
+
WM_operatortype_append(ANIM_OT_add_driver_button);
WM_operatortype_append(ANIM_OT_remove_driver_button);
- WM_operatortype_append(ANIM_OT_keyingset_add_new);
- WM_operatortype_append(ANIM_OT_keyingset_add_destination);
+ WM_operatortype_append(ANIM_OT_add_keyingset_button);
+ WM_operatortype_append(ANIM_OT_remove_keyingset_button);
}
void ED_keymap_anim(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Animation", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Animation", 0, 0);
/* frame management */
/* NOTE: 'ACTIONMOUSE' not 'LEFTMOUSE', as user may have swapped mouse-buttons */
- WM_keymap_verify_item(keymap, "ANIM_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ANIM_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "ANIM_OT_time_toggle", TKEY, KM_PRESS, KM_CTRL, 0);
/* preview range */
- WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_set", PKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "ANIM_OT_previewrange_clear", PKEY, KM_PRESS, KM_ALT, 0);
}
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index 9c401289011..8b9224511ba 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -1,5 +1,30 @@
-/* Testing code for 2.5 animation system
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#include <stdio.h>
@@ -94,7 +119,7 @@ FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_ind
fcu->driver= MEM_callocN(sizeof(ChannelDriver), "ChannelDriver");
/* add simple generator modifier for driver so that there is some visible representation */
- fcurve_add_modifier(fcu, FMODIFIER_TYPE_GENERATOR);
+ add_fmodifier(&fcu->modifiers, FMODIFIER_TYPE_GENERATOR);
/* just add F-Curve to end of driver list */
BLI_addtail(&adt->drivers, fcu);
@@ -110,7 +135,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)
+short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short flag, int type)
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -125,6 +150,39 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* create F-Curve with Driver */
fcu= verify_driver_fcurve(id, rna_path, array_index, 1);
+
+ if (fcu && fcu->driver) {
+ fcu->driver->type= type;
+
+ /* fill in current value for python */
+ if (type == DRIVER_TYPE_PYTHON) {
+ PropertyType proptype= RNA_property_type(prop);
+ int array= RNA_property_array_length(&ptr, prop);
+ char *expression= fcu->driver->expression;
+ int val, maxlen= sizeof(fcu->driver->expression);
+ float fval;
+
+ if (proptype == PROP_BOOLEAN) {
+ if(!array) val= RNA_property_boolean_get(&ptr, prop);
+ else val= RNA_property_boolean_get_index(&ptr, prop, array_index);
+
+ BLI_strncpy(expression, (val)? "True": "False", maxlen);
+ }
+ else if (proptype == PROP_INT) {
+ if (!array) val= RNA_property_int_get(&ptr, prop);
+ else val= RNA_property_int_get_index(&ptr, prop, array_index);
+
+ BLI_snprintf(expression, maxlen, "%d", val);
+ }
+ else if (proptype == PROP_FLOAT) {
+ if (!array) fval= RNA_property_float_get(&ptr, prop);
+ else fval= RNA_property_float_get_index(&ptr, prop, array_index);
+
+ BLI_snprintf(expression, maxlen, "%.3f", fval);
+ }
+
+ }
+ }
/* done */
return (fcu != NULL);
@@ -174,7 +232,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
short success= 0;
int a, index, length, all= RNA_boolean_get(op->ptr, "all");
- /* try to insert keyframe using property retrieved from UI */
+ /* try to create driver using property retrieved from UI */
memset(&ptr, 0, sizeof(PointerRNA));
uiAnimContextProperty(C, &ptr, &prop, &index);
@@ -183,7 +241,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
if (path) {
if (all) {
- length= RNA_property_array_length(prop);
+ length= RNA_property_array_length(&ptr, prop);
if (length) index= 0;
else length= 1;
@@ -192,7 +250,7 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
length= 1;
for (a=0; a<length; a++)
- success+= ANIM_add_driver(ptr.id.data, path, index+a, 0);
+ success+= ANIM_add_driver(ptr.id.data, path, index+a, 0, DRIVER_TYPE_PYTHON);
MEM_freeN(path);
}
@@ -223,7 +281,7 @@ void ANIM_OT_add_driver_button (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_boolean(ot->srna, "all", 1, "All", "Insert a keyframe for all element of the array.");
+ RNA_def_boolean(ot->srna, "all", 1, "All", "Create drivers for all elements of the array.");
}
/* Remove Driver Button Operator ------------------------ */
@@ -236,7 +294,7 @@ static int remove_driver_button_exec (bContext *C, wmOperator *op)
short success= 0;
int a, index, length, all= RNA_boolean_get(op->ptr, "all");
- /* try to insert keyframe using property retrieved from UI */
+ /* try to find driver using property retrieved from UI */
memset(&ptr, 0, sizeof(PointerRNA));
uiAnimContextProperty(C, &ptr, &prop, &index);
@@ -245,7 +303,7 @@ static int remove_driver_button_exec (bContext *C, wmOperator *op)
if (path) {
if (all) {
- length= RNA_property_array_length(prop);
+ length= RNA_property_array_length(&ptr, prop);
if(length) index= 0;
else length= 1;
@@ -286,7 +344,7 @@ void ANIM_OT_remove_driver_button (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_boolean(ot->srna, "all", 1, "All", "Delete keyfames from all elements of the array.");
+ RNA_def_boolean(ot->srna, "all", 1, "All", "Delete drivers for all elements of the array.");
}
/* ************************************************** */
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
new file mode 100644
index 00000000000..4aff26105f3
--- /dev/null
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -0,0 +1,679 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation, Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* User-Interface Stuff for F-Modifiers:
+ * This file defines the (C-Coded) templates + editing callbacks needed
+ * by the interface stuff or F-Modifiers, as used by F-Curves in the Graph Editor,
+ * and NLA-Strips in the NLA Editor.
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+#include "BKE_global.h"
+#include "BKE_nla.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+// XXX! --------------------------------
+/* temporary definition for limits of float number buttons (FLT_MAX tends to infinity with old system) */
+#define UI_FLT_MAX 10000.0f
+
+/* ********************************************** */
+
+#define B_REDR 1
+#define B_FMODIFIER_REDRAW 20
+
+/* macro for use here to draw background box and set height */
+// XXX for now, roundbox has it's callback func set to NULL to not intercept events
+#define DRAW_BACKDROP(height) \
+ { \
+ uiDefBut(block, ROUNDBOX, B_REDR, "", -3, yco-height, width+3, height-1, NULL, 5.0, 0.0, 12.0, (float)rb_col, ""); \
+ }
+
+/* callback to verify modifier data */
+static void validate_fmodifier_cb (bContext *C, void *fcm_v, void *dummy)
+{
+ FModifier *fcm= (FModifier *)fcm_v;
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* call the verify callback on the modifier if applicable */
+ if (fmi && fmi->verify_data)
+ fmi->verify_data(fcm);
+}
+
+/* callback to set the active modifier */
+static void activate_fmodifier_cb (bContext *C, void *fmods_v, void *fcm_v)
+{
+ ListBase *modifiers = (ListBase *)fmods_v;
+ FModifier *fcm= (FModifier *)fcm_v;
+
+ /* call API function to set the active modifier for active modifier-stack */
+ set_active_fmodifier(modifiers, fcm);
+}
+
+/* callback to remove the given modifier */
+static void delete_fmodifier_cb (bContext *C, void *fmods_v, void *fcm_v)
+{
+ ListBase *modifiers = (ListBase *)fmods_v;
+ FModifier *fcm= (FModifier *)fcm_v;
+
+ /* remove the given F-Modifier from the active modifier-stack */
+ remove_fmodifier(modifiers, fcm);
+}
+
+/* --------------- */
+
+/* draw settings for generator modifier */
+static void draw_modifier__generator(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+ uiLayout *col, *row;
+ uiBlock *block;
+ uiBut *but;
+ PointerRNA ptr;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierFunctionGenerator, fcm, &ptr);
+
+ /* basic settings (backdrop + mode selector + some padding) */
+ col= uiLayoutColumn(layout, 1);
+ block= uiLayoutGetBlock(layout);
+ uiBlockBeginAlign(block);
+ but= uiDefButR(block, MENU, B_FMODIFIER_REDRAW, NULL, 0, 0, width-30, UI_UNIT_Y, &ptr, "mode", -1, 0, 0, -1, -1, NULL);
+ uiButSetFunc(but, validate_fmodifier_cb, fcm, NULL);
+
+ uiDefButR(block, TOG, B_FMODIFIER_REDRAW, NULL, 0, 0, width-30, UI_UNIT_Y, &ptr, "additive", -1, 0, 0, -1, -1, NULL);
+ uiBlockEndAlign(block);
+
+ /* now add settings for individual modes */
+ switch (data->mode) {
+ case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */
+ {
+ float *cp = NULL;
+ char xval[32];
+ unsigned int i;
+
+ /* draw polynomial order selector */
+ row= uiLayoutRow(layout, 0);
+ block= uiLayoutGetBlock(row);
+ but= uiDefButI(block, NUM, B_FMODIFIER_REDRAW, "Poly Order: ", 10,0,width-30,19, &data->poly_order, 1, 100, 0, 0, "'Order' of the Polynomial - for a polynomial with n terms, 'order' is n-1");
+ uiButSetFunc(but, validate_fmodifier_cb, fcm, NULL);
+
+
+ /* draw controls for each coefficient and a + sign at end of row */
+ row= uiLayoutRow(layout, 1);
+ block= uiLayoutGetBlock(row);
+ uiDefBut(block, LABEL, 1, "y = ", 0, 0, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ cp= data->coefficients;
+ for (i=0; (i < data->arraysize) && (cp); i++, cp++) {
+ /* coefficient */
+ uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 0, 0, 150, 20, cp, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient for polynomial");
+
+ /* 'x' param (and '+' if necessary) */
+ if (i) {
+ if (i == 1)
+ strcpy(xval, "x");
+ else
+ sprintf(xval, "x^%d", i);
+ uiDefBut(block, LABEL, 1, xval, 0, 0, 50, 20, NULL, 0.0, 0.0, 0, 0, "Power of x");
+ }
+
+ if ( (i != (data->arraysize - 1)) || ((i==0) && data->arraysize==2) ) {
+ uiDefBut(block, LABEL, 1, "+", 0,0 , 30, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ /* next coefficient on a new row */
+ row= uiLayoutRow(layout, 1);
+ block= uiLayoutGetBlock(row);
+ }
+ }
+ }
+ break;
+
+ case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* factorised polynomial expression */
+ {
+ float *cp = NULL;
+ unsigned int i;
+
+ /* draw polynomial order selector */
+ row= uiLayoutRow(layout, 0);
+ block= uiLayoutGetBlock(row);
+ but= uiDefButI(block, NUM, B_FMODIFIER_REDRAW, "Poly Order: ", 0,0,width-30,19, &data->poly_order, 1, 100, 0, 0, "'Order' of the Polynomial - for a polynomial with n terms, 'order' is n-1");
+ uiButSetFunc(but, validate_fmodifier_cb, fcm, NULL);
+
+
+ /* draw controls for each pair of coefficients */
+ row= uiLayoutRow(layout, 1);
+ block= uiLayoutGetBlock(row);
+ uiDefBut(block, LABEL, 1, "y=", 0, 0, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ cp= data->coefficients;
+ for (i=0; (i < data->poly_order) && (cp); i++, cp+=2) {
+ /* opening bracket */
+ uiDefBut(block, LABEL, 1, "(", 0, 0, 20, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ /* coefficients */
+ uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 0, 0, 100, 20, cp, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient of x");
+
+ uiDefBut(block, LABEL, 1, "x+", 0, 0, 40, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 0, 0, 100, 20, cp+1, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Second coefficient");
+
+ /* closing bracket and '+' sign */
+ if ( (i != (data->poly_order - 1)) || ((i==0) && data->poly_order==2) ) {
+ uiDefBut(block, LABEL, 1, ") +", 0, 0, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ /* set up new row for the next pair of coefficients*/
+ row= uiLayoutRow(layout, 1);
+ block= uiLayoutGetBlock(row);
+ }
+ else
+ uiDefBut(block, LABEL, 1, ")", 0, 0, 20, 20, NULL, 0.0, 0.0, 0, 0, "");
+ }
+ }
+ break;
+ }
+}
+
+/* --------------- */
+
+/* draw settings for noise modifier */
+static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ uiLayout *col;
+ PointerRNA ptr;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierFunctionGenerator, fcm, &ptr);
+
+ /* add the settings */
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, "", 0, &ptr, "type", 0);
+ uiItemR(col, NULL, 0, &ptr, "additive", UI_ITEM_R_TOGGLE);
+
+ col= uiLayoutColumn(layout, 0); // no grouping for now
+ uiItemR(col, NULL, 0, &ptr, "amplitude", 0);
+ uiItemR(col, NULL, 0, &ptr, "phase_multiplier", 0);
+ uiItemR(col, NULL, 0, &ptr, "phase_offset", 0);
+ uiItemR(col, NULL, 0, &ptr, "value_offset", 0);
+}
+
+/* --------------- */
+
+/* draw settings for cycles modifier */
+static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ uiLayout *split, *col;
+ PointerRNA ptr;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierCycles, fcm, &ptr);
+
+ /* split into 2 columns
+ * NOTE: the mode comboboxes shouldn't get labels, otherwise there isn't enough room
+ */
+ split= uiLayoutSplit(layout, 0.5f);
+
+ /* before range */
+ col= uiLayoutColumn(split, 1);
+ uiItemL(col, "Before:", 0);
+ uiItemR(col, "", 0, &ptr, "before_mode", 0);
+ uiItemR(col, NULL, 0, &ptr, "before_cycles", 0);
+
+ /* after range */
+ col= uiLayoutColumn(split, 1);
+ uiItemL(col, "After:", 0);
+ uiItemR(col, "", 0, &ptr, "after_mode", 0);
+ uiItemR(col, NULL, 0, &ptr, "after_cycles", 0);
+}
+
+/* --------------- */
+
+/* draw settings for noise modifier */
+static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ uiLayout *split, *col;
+ PointerRNA ptr;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr);
+
+ /* blending mode */
+ uiItemR(layout, NULL, 0, &ptr, "modification", 0);
+
+ /* split into 2 columns */
+ split= uiLayoutSplit(layout, 0.5f);
+
+ /* col 1 */
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, NULL, 0, &ptr, "size", 0);
+ uiItemR(col, NULL, 0, &ptr, "strength", 0);
+
+ /* col 2 */
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, NULL, 0, &ptr, "phase", 0);
+ uiItemR(col, NULL, 0, &ptr, "depth", 0);
+}
+
+/* --------------- */
+
+#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001
+
+/* Binary search algorithm for finding where to insert Envelope Data Point.
+ * Returns the index to insert at (data already at that index will be offset if replace is 0)
+ */
+static int binarysearch_fcm_envelopedata_index (FCM_EnvelopeData array[], float frame, int arraylen, short *exists)
+{
+ int start=0, end=arraylen;
+ int loopbreaker= 0, maxloop= arraylen * 2;
+
+ /* initialise exists-flag first */
+ *exists= 0;
+
+ /* sneaky optimisations (don't go through searching process if...):
+ * - keyframe to be added is to be added out of current bounds
+ * - keyframe to be added would replace one of the existing ones on bounds
+ */
+ if ((arraylen <= 0) || (array == NULL)) {
+ printf("Warning: binarysearch_fcm_envelopedata_index() encountered invalid array \n");
+ return 0;
+ }
+ else {
+ /* check whether to add before/after/on */
+ float framenum;
+
+ /* 'First' Point (when only one point, this case is used) */
+ framenum= array[0].time;
+ if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) {
+ *exists = 1;
+ return 0;
+ }
+ else if (frame < framenum)
+ return 0;
+
+ /* 'Last' Point */
+ framenum= array[(arraylen-1)].time;
+ if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) {
+ *exists= 1;
+ return (arraylen - 1);
+ }
+ else if (frame > framenum)
+ return arraylen;
+ }
+
+
+ /* most of the time, this loop is just to find where to put it
+ * - 'loopbreaker' is just here to prevent infinite loops
+ */
+ for (loopbreaker=0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) {
+ /* compute and get midpoint */
+ int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */
+ float midfra= array[mid].time;
+
+ /* check if exactly equal to midpoint */
+ if (IS_EQT(frame, midfra, BINARYSEARCH_FRAMEEQ_THRESH)) {
+ *exists = 1;
+ return mid;
+ }
+
+ /* repeat in upper/lower half */
+ if (frame > midfra)
+ start= mid + 1;
+ else if (frame < midfra)
+ end= mid - 1;
+ }
+
+ /* print error if loop-limit exceeded */
+ if (loopbreaker == (maxloop-1)) {
+ printf("Error: binarysearch_fcm_envelopedata_index() was taking too long \n");
+
+ // include debug info
+ printf("\tround = %d: start = %d, end = %d, arraylen = %d \n", loopbreaker, start, end, arraylen);
+ }
+
+ /* not found, so return where to place it */
+ return start;
+}
+
+/* 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)
+{
+ Scene *scene= CTX_data_scene(C);
+ FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
+ FCM_EnvelopeData *fedn;
+ FCM_EnvelopeData fed;
+
+ /* init template data */
+ fed.min= -1.0f;
+ fed.max= 1.0f;
+ fed.time= (float)scene->r.cfra; // XXX make this int for ease of use?
+ fed.f1= fed.f2= 0;
+
+ /* check that no data exists for the current frame... */
+ if (env->data) {
+ short exists = -1;
+ int i= binarysearch_fcm_envelopedata_index(env->data, (float)(scene->r.cfra), env->totvert, &exists);
+
+ /* binarysearch_...() will set exists by default to 0, so if it is non-zero, that means that the point exists already */
+ if (exists)
+ return;
+
+ /* add new */
+ fedn= MEM_callocN((env->totvert+1)*sizeof(FCM_EnvelopeData), "FCM_EnvelopeData");
+
+ /* add the points that should occur before the point to be pasted */
+ if (i > 0)
+ memcpy(fedn, env->data, i*sizeof(FCM_EnvelopeData));
+
+ /* add point to paste at index i */
+ *(fedn + i)= fed;
+
+ /* add the points that occur after the point to be pasted */
+ if (i < env->totvert)
+ memcpy(fedn+i+1, env->data+i, (env->totvert-i)*sizeof(FCM_EnvelopeData));
+
+ /* replace (+ free) old with new */
+ MEM_freeN(env->data);
+ env->data= fedn;
+
+ env->totvert++;
+ }
+ else {
+ env->data= MEM_callocN(sizeof(FCM_EnvelopeData), "FCM_EnvelopeData");
+ *(env->data)= fed;
+
+ env->totvert= 1;
+ }
+}
+
+/* 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)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
+ FCM_EnvelopeData *fedn;
+ int index= GET_INT_FROM_POINTER(ind_v);
+
+ /* check that no data exists for the current frame... */
+ if (env->totvert > 1) {
+ /* allocate a new smaller array */
+ fedn= MEM_callocN(sizeof(FCM_EnvelopeData)*(env->totvert-1), "FCM_EnvelopeData");
+
+ memcpy(fedn, &env->data, sizeof(FCM_EnvelopeData)*(index));
+ memcpy(&fedn[index], &env->data[index+1], sizeof(FCM_EnvelopeData)*(env->totvert-index-1));
+
+ /* free old array, and set the new */
+ MEM_freeN(env->data);
+ env->data= fedn;
+ env->totvert--;
+ }
+ else {
+ /* just free array, since the only vert was deleted */
+ if (env->data)
+ MEM_freeN(env->data);
+ env->totvert= 0;
+ }
+}
+
+/* draw settings for envelope modifier */
+static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ FMod_Envelope *env= (FMod_Envelope *)fcm->data;
+ FCM_EnvelopeData *fed;
+ uiLayout *col, *row;
+ uiBlock *block;
+ uiBut *but;
+ PointerRNA ptr;
+ int i;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierEnvelope, fcm, &ptr);
+
+ /* general settings */
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, "Envelope:", 0);
+ uiItemR(col, NULL, 0, &ptr, "reference_value", 0);
+
+ row= uiLayoutRow(col, 1);
+ uiItemR(row, "Min", 0, &ptr, "default_minimum", 0);
+ uiItemR(row, "Max", 0, &ptr, "default_maximum", 0);
+
+ /* control points header */
+ // TODO: move this control-point control stuff to using the new special widgets for lists
+ // the current way is far too cramped
+ row= uiLayoutRow(layout, 0);
+ block= uiLayoutGetBlock(row);
+
+ uiDefBut(block, LABEL, 1, "Control Points:", 0, 0, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
+
+ but= uiDefBut(block, BUT, B_FMODIFIER_REDRAW, "Add Point", 0,0,150,19, NULL, 0, 0, 0, 0, "Adds a new control-point to the envelope on the current frame");
+ uiButSetFunc(but, fmod_envelope_addpoint_cb, env, NULL);
+
+ /* control points list */
+ for (i=0, fed=env->data; i < env->totvert; i++, fed++) {
+ /* get a new row to operate on */
+ row= uiLayoutRow(layout, 1);
+ block= uiLayoutGetBlock(row);
+
+ uiBlockBeginAlign(block);
+ but=uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Fra:", 0, 0, 90, 20, &fed->time, -UI_FLT_MAX, UI_FLT_MAX, 10, 1, "Frame that envelope point occurs");
+ uiButSetFunc(but, validate_fmodifier_cb, fcm, NULL);
+
+ uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Min:", 0, 0, 100, 20, &fed->min, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, "Minimum bound of envelope at this point");
+ uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Max:", 0, 0, 100, 20, &fed->max, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, "Maximum bound of envelope at this point");
+
+ but= uiDefIconBut(block, BUT, B_FMODIFIER_REDRAW, ICON_X, 0, 0, 18, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete envelope control point");
+ uiButSetFunc(but, fmod_envelope_deletepoint_cb, env, SET_INT_IN_POINTER(i));
+ uiBlockBeginAlign(block);
+ }
+}
+
+/* --------------- */
+
+/* draw settings for limits modifier */
+static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, short width)
+{
+ uiLayout *split, *col, *row;
+ PointerRNA ptr;
+
+ /* init the RNA-pointer */
+ RNA_pointer_create(id, &RNA_FModifierLimits, fcm, &ptr);
+
+ /* row 1: minimum */
+ {
+ row= uiLayoutRow(layout, 0);
+
+ /* split into 2 columns */
+ split= uiLayoutSplit(layout, 0.5f);
+
+ /* x-minimum */
+ col= uiLayoutColumn(split, 1);
+ uiItemR(col, NULL, 0, &ptr, "use_minimum_x", 0);
+ uiItemR(col, NULL, 0, &ptr, "minimum_x", 0);
+
+ /* y-minimum*/
+ col= uiLayoutColumn(split, 1);
+ uiItemR(col, NULL, 0, &ptr, "use_minimum_y", 0);
+ uiItemR(col, NULL, 0, &ptr, "minimum_y", 0);
+ }
+
+ /* row 2: minimum */
+ {
+ row= uiLayoutRow(layout, 0);
+
+ /* split into 2 columns */
+ split= uiLayoutSplit(layout, 0.5f);
+
+ /* x-minimum */
+ col= uiLayoutColumn(split, 1);
+ uiItemR(col, NULL, 0, &ptr, "use_maximum_x", 0);
+ uiItemR(col, NULL, 0, &ptr, "maximum_x", 0);
+
+ /* y-minimum*/
+ col= uiLayoutColumn(split, 1);
+ uiItemR(col, NULL, 0, &ptr, "use_maximum_y", 0);
+ uiItemR(col, NULL, 0, &ptr, "maximum_y", 0);
+ }
+}
+
+/* --------------- */
+
+
+void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifiers, FModifier *fcm)
+{
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+ uiLayout *box, *row, *subrow;
+ uiBlock *block;
+ uiBut *but;
+ short width= 314;
+
+ /* draw header */
+ {
+ /* get layout-row + UI-block for this */
+ box= uiLayoutBox(layout);
+
+ row= uiLayoutRow(box, 0);
+ block= uiLayoutGetBlock(row); // err...
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ /* left-align -------------------------------------------- */
+ subrow= uiLayoutRow(row, 0);
+ uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT);
+
+ /* expand */
+ uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_EXPANDED, B_REDR, ICON_TRIA_RIGHT, 0, -1, UI_UNIT_X, UI_UNIT_Y, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is expanded.");
+
+ /* checkbox for 'active' status (for now) */
+ but= uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_ACTIVE, B_REDR, ICON_RADIOBUT_OFF, 0, -1, UI_UNIT_X, UI_UNIT_Y, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is active one.");
+ uiButSetFunc(but, activate_fmodifier_cb, modifiers, fcm);
+
+ /* name */
+ if (fmi)
+ uiDefBut(block, LABEL, 1, fmi->name, 0, 0, 150, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "F-Curve Modifier Type. Click to make modifier active one.");
+ else
+ uiDefBut(block, LABEL, 1, "<Unknown Modifier>", 0, 0, 150, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "F-Curve Modifier Type. Click to make modifier active one.");
+
+ /* right-align ------------------------------------------- */
+ subrow= uiLayoutRow(row, 0);
+ uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
+
+ /* 'mute' button */
+ uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_MUTED, B_REDR, ICON_MUTE_IPO_OFF, 0, 0, UI_UNIT_X, UI_UNIT_Y, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is temporarily muted (not evaluated).");
+
+ /* delete button */
+ but= uiDefIconBut(block, BUT, B_REDR, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Delete F-Curve Modifier.");
+ uiButSetFunc(but, delete_fmodifier_cb, modifiers, fcm);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+
+ /* when modifier is expanded, draw settings */
+ if (fcm->flag & FMODIFIER_FLAG_EXPANDED) {
+ /* set up the flexible-box layout which acts as the backdrop for the modifier settings */
+ box= uiLayoutBox(layout);
+
+ /* draw settings for individual modifiers */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_GENERATOR: /* Generator */
+ draw_modifier__generator(box, id, fcm, width);
+ break;
+
+ case FMODIFIER_TYPE_FN_GENERATOR: /* Built-In Function Generator */
+ draw_modifier__fn_generator(box, id, fcm, width);
+ break;
+
+ case FMODIFIER_TYPE_CYCLES: /* Cycles */
+ draw_modifier__cycles(box, id, fcm, width);
+ break;
+
+ case FMODIFIER_TYPE_ENVELOPE: /* Envelope */
+ draw_modifier__envelope(box, id, fcm, width);
+ break;
+
+ case FMODIFIER_TYPE_LIMITS: /* Limits */
+ draw_modifier__limits(box, id, fcm, width);
+ break;
+
+ case FMODIFIER_TYPE_NOISE: /* Noise */
+ draw_modifier__noise(box, id, fcm, width);
+ break;
+
+ default: /* unknown type */
+ break;
+ }
+ }
+}
+
+/* ********************************************** */
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index d0e83eeaec7..e8b25f70b06 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -17,12 +17,12 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*
* The Original Code is: all of this file.
*
- * Contributor(s): Joshua Leung
+ * Contributor(s): Joshua Leung (full recode)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -42,8 +42,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
-
-/* Types --------------------------------------------------------------- */
+#include "BLI_dlrbTree.h"
#include "DNA_listBase.h"
#include "DNA_anim_types.h"
@@ -51,7 +50,6 @@
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
-#include "DNA_ipo_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
@@ -64,6 +62,7 @@
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
#include "DNA_world_types.h"
+#include "DNA_view2d_types.h"
#include "BKE_action.h"
#include "BKE_depsgraph.h"
@@ -75,8 +74,6 @@
#include "BKE_context.h"
#include "BKE_utildefines.h"
-/* Everything from source (BIF, BDR, BSE) ------------------------------ */
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -91,55 +88,103 @@
#include "ED_screen.h"
#include "ED_space_api.h"
-/* *************************** Keyframe Drawing *************************** */
+/* *************************** Keyframe Processing *************************** */
-static void add_bezt_to_keycolumnslist(ListBase *keys, BezTriple *bezt)
+/* Create a ActKeyColumn from a BezTriple */
+static ActKeyColumn *bezt_to_new_actkeycolumn(BezTriple *bezt)
{
- /* The equivalent of add_to_cfra_elem except this version
- * makes ActKeyColumns - one of the two datatypes required
- * for action editor drawing.
- */
- ActKeyColumn *ak, *akn;
+ ActKeyColumn *ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
- if (ELEM(NULL, keys, bezt)) return;
+ /* store settings based on state of BezTriple */
+ ak->cfra= bezt->vec[1][0];
+ ak->sel= BEZSELECTED(bezt) ? SELECT : 0;
+ ak->key_type= BEZKEYTYPE(bezt);
- /* try to any existing key to replace, or where to insert after */
- for (ak= keys->last; ak; ak= ak->prev) {
- /* do because of double keys */
- if (ak->cfra == bezt->vec[1][0]) {
- /* set selection status and 'touched' status */
- if (BEZSELECTED(bezt)) ak->sel = SELECT;
- ak->modified += 1;
-
- return;
+ /* set 'modified', since this is used to identify long keyframes */
+ ak->modified = 1;
+
+ return ak;
+}
+
+/* Add the given BezTriple to the given 'list' of Keyframes */
+static void add_bezt_to_keycolumns_list(DLRBT_Tree *keys, BezTriple *bezt)
+{
+ ActKeyColumn *new_ak=NULL;
+
+ if ELEM(NULL, keys, bezt) return;
+
+ /* if there are no keys already, just add as root */
+ if (keys->root == NULL) {
+ /* just add this as the root, then call the tree-balancing functions to validate */
+ new_ak= bezt_to_new_actkeycolumn(bezt);
+ keys->root= (DLRBT_Node *)new_ak;
+ }
+ else {
+ ActKeyColumn *ak, *akp=NULL, *akn=NULL;
+
+ /* traverse tree to find an existing entry to update the status of,
+ * or a suitable point to add at
+ */
+ for (ak= keys->root; ak; akp= ak, ak= akn) {
+ /* check if this is a match, or whether we go left or right */
+ if (ak->cfra == bezt->vec[1][0]) {
+ /* set selection status and 'touched' status */
+ if (BEZSELECTED(bezt)) ak->sel = SELECT;
+ ak->modified += 1;
+
+ /* for keyframe type, 'proper' keyframes have priority over breakdowns (and other types for now) */
+ if (BEZKEYTYPE(bezt) == BEZT_KEYTYPE_KEYFRAME)
+ ak->key_type= BEZT_KEYTYPE_KEYFRAME;
+
+ /* done... no need to insert */
+ return;
+ }
+ else {
+ ActKeyColumn **aknp= NULL;
+
+ /* check if go left or right, but if not available, add new node */
+ if (ak->cfra < bezt->vec[1][0])
+ aknp= &ak->right;
+ else
+ aknp= &ak->left;
+
+ /* if this does not exist, add a new node, otherwise continue... */
+ if (*aknp == NULL) {
+ /* add a new node representing this, and attach it to the relevant place */
+ new_ak= bezt_to_new_actkeycolumn(bezt);
+ new_ak->parent= ak;
+ *aknp= new_ak;
+ break;
+ }
+ else
+ akn= *aknp;
+ }
}
- else if (ak->cfra < bezt->vec[1][0]) break;
}
- /* add new block */
- akn= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
- if (ak) BLI_insertlinkafter(keys, ak, akn);
- else BLI_addtail(keys, akn);
+ /* now, balance the tree taking into account this newly added node */
+ BLI_dlrbTree_insert(keys, (DLRBT_Node *)new_ak);
+}
+
+
+/* Create a ActKeyColumn for a pair of BezTriples */
+static ActKeyBlock *bezts_to_new_actkeyblock(BezTriple *prev, BezTriple *beztn)
+{
+ ActKeyBlock *ab= MEM_callocN(sizeof(ActKeyBlock), "ActKeyBlock");
- akn->cfra= bezt->vec[1][0];
- akn->modified += 1;
+ ab->start= prev->vec[1][0];
+ ab->end= beztn->vec[1][0];
+ ab->val= beztn->vec[1][1];
- // TODO: handle type = bezt->h1 or bezt->h2
- akn->handle_type= 0;
+ ab->sel= (BEZSELECTED(prev) || BEZSELECTED(beztn)) ? SELECT : 0;
+ ab->modified = 1;
- if (BEZSELECTED(bezt))
- akn->sel = SELECT;
- else
- akn->sel = 0;
+ return ab;
}
-static void add_bezt_to_keyblockslist(ListBase *blocks, FCurve *fcu, int index)
+static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, FCurve *fcu, int index)
{
- /* The equivalent of add_to_cfra_elem except this version
- * makes ActKeyBlocks - one of the two datatypes required
- * for action editor drawing.
- */
- ActKeyBlock *ab, *abn;
+ ActKeyBlock *new_ab= NULL;
BezTriple *beztn=NULL, *prev=NULL;
BezTriple *bezt;
int v;
@@ -148,6 +193,7 @@ static void add_bezt_to_keyblockslist(ListBase *blocks, FCurve *fcu, int index)
beztn= (fcu->bezt + index);
/* we need to go through all beztriples, as they may not be in order (i.e. during transform) */
+ // TODO: this seems to be a bit of a bottleneck
for (v=0, bezt=fcu->bezt; v < fcu->totvert; v++, bezt++) {
/* skip if beztriple is current */
if (v != index) {
@@ -174,115 +220,259 @@ static void add_bezt_to_keyblockslist(ListBase *blocks, FCurve *fcu, int index)
if (IS_EQ(beztn->vec[1][1], beztn->vec[0][1])==0) return;
if (IS_EQ(prev->vec[1][1], prev->vec[2][1])==0) return;
- /* try to find a keyblock that starts on the previous beztriple
- * Note: we can't search from end to try to optimise this as it causes errors there's
- * an A ___ B |---| B situation
- */
- // FIXME: here there is a bug where we are trying to get the summary for the following channels
- // A|--------------|A ______________ B|--------------|B
- // A|------------------------------------------------|A
- // A|----|A|---|A|-----------------------------------|A
- for (ab= blocks->first; ab; ab= ab->next) {
- /* check if alter existing block or add new block */
- if (ab->start == prev->vec[1][0]) {
- /* set selection status and 'touched' status */
- if (BEZSELECTED(beztn)) ab->sel = SELECT;
- ab->modified += 1;
-
- return;
+
+ /* if there are no blocks already, just add as root */
+ if (blocks->root == NULL) {
+ /* just add this as the root, then call the tree-balancing functions to validate */
+ new_ab= bezts_to_new_actkeyblock(prev, beztn);
+ blocks->root= (DLRBT_Node *)new_ab;
+ }
+ else {
+ ActKeyBlock *ab, *abp=NULL, *abn=NULL;
+
+ /* try to find a keyblock that starts on the previous beztriple, and add a new one if none start there
+ * Note: we can't search from end to try to optimise this as it causes errors there's
+ * an A ___ B |---| B situation
+ */
+ // FIXME: here there is a bug where we are trying to get the summary for the following channels
+ // A|--------------|A ______________ B|--------------|B
+ // A|------------------------------------------------|A
+ // A|----|A|---|A|-----------------------------------|A
+ for (ab= blocks->root; ab; abp= ab, ab= abn) {
+ /* check if this is a match, or whether we go left or right */
+ if (ab->start == prev->vec[1][0]) {
+ /* set selection status and 'touched' status */
+ if (BEZSELECTED(beztn)) ab->sel = SELECT;
+ ab->modified += 1;
+
+ /* done... no need to insert */
+ return;
+ }
+ else {
+ ActKeyBlock **abnp= NULL;
+
+ /* check if go left or right, but if not available, add new node */
+ if (ab->start < prev->vec[1][0])
+ abnp= &ab->right;
+ else
+ abnp= &ab->left;
+
+ /* if this does not exist, add a new node, otherwise continue... */
+ if (*abnp == NULL) {
+ /* add a new node representing this, and attach it to the relevant place */
+ new_ab= bezts_to_new_actkeyblock(prev, beztn);
+ new_ab->parent= ab;
+ *abnp= new_ab;
+ break;
+ }
+ else
+ abn= *abnp;
+ }
}
- else if (ab->start < prev->vec[1][0]) break;
}
- /* add new block */
- abn= MEM_callocN(sizeof(ActKeyBlock), "ActKeyBlock");
- if (ab) BLI_insertlinkbefore(blocks, ab, abn);
- else BLI_addtail(blocks, abn);
+ /* now, balance the tree taking into account this newly added node */
+ BLI_dlrbTree_insert(blocks, (DLRBT_Node *)new_ab);
+}
+
+/* --------- */
+
+/* Handle the 'touched' status of ActKeyColumn tree nodes */
+static void set_touched_actkeycolumn (ActKeyColumn *ak)
+{
+ /* sanity check */
+ if (ak == NULL)
+ return;
+
+ /* deal with self first */
+ if (ak->modified) {
+ ak->modified= 0;
+ ak->totcurve++;
+ }
+
+ /* children */
+ set_touched_actkeycolumn(ak->left);
+ set_touched_actkeycolumn(ak->right);
+}
+
+/* Handle the 'touched' status of ActKeyBlock tree nodes */
+static void set_touched_actkeyblock (ActKeyBlock *ab)
+{
+ /* sanity check */
+ if (ab == NULL)
+ return;
+
+ /* deal with self first */
+ if (ab->modified) {
+ ab->modified= 0;
+ ab->totcurve++;
+ }
- abn->start= prev->vec[1][0];
- abn->end= beztn->vec[1][0];
- abn->val= beztn->vec[1][1];
+ /* children */
+ set_touched_actkeyblock(ab->left);
+ set_touched_actkeyblock(ab->right);
+}
+
+/* *************************** Keyframe Drawing *************************** */
+
+/* helper function - find actkeycolumn that occurs on cframe */
+ActKeyColumn *cfra_find_actkeycolumn (ActKeyColumn *ak, float cframe)
+{
+ /* sanity checks */
+ if (ak == NULL)
+ return NULL;
- if (BEZSELECTED(prev) || BEZSELECTED(beztn))
- abn->sel = SELECT;
+ /* check if this is a match, or whether it is in some subtree */
+ if (cframe < ak->cfra)
+ return cfra_find_actkeycolumn(ak->left, cframe);
+ else if (cframe > ak->cfra)
+ return cfra_find_actkeycolumn(ak->right, cframe);
else
- abn->sel = 0;
- abn->modified = 1;
+ return ak; /* match */
}
-/* helper function - find actkeycolumn that occurs on cframe */
-static ActKeyColumn *cfra_find_actkeycolumn (ListBase *keys, float cframe)
+/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */
+// FIXME: this is buggy... next() is ignored completely...
+ActKeyColumn *cfra_find_nearest_next_ak (ActKeyColumn *ak, float cframe, short next)
{
- ActKeyColumn *ak, *ak2;
+ ActKeyColumn *akn= NULL;
- if (keys==NULL)
+ /* sanity checks */
+ if (ak == NULL)
return NULL;
-
- /* search from both ends at the same time, and stop if we find match or if both ends meet */
- for (ak=keys->first, ak2=keys->last; ak && ak2; ak=ak->next, ak2=ak2->prev) {
- /* return whichever end encounters the frame */
- if (ak->cfra == cframe)
- return ak;
- if (ak2->cfra == cframe)
- return ak2;
-
- /* no matches on either end, so return NULL */
- if (ak == ak2)
- return NULL;
- }
- return NULL;
+ /* check if this is a match, or whether it is in some subtree */
+ if (cframe < ak->cfra)
+ akn= cfra_find_nearest_next_ak(ak->left, cframe, next);
+ else if (cframe > ak->cfra)
+ akn= cfra_find_nearest_next_ak(ak->right, cframe, next);
+
+ /* if no match found (or found match), just use the current one */
+ if (akn == NULL)
+ return ak;
+ else
+ return akn;
}
-#if 0 // disabled, as some intel cards have problems with this
-/* Draw a simple diamond shape with a filled in center (in screen space) */
-static void draw_key_but(int x, int y, short w, short h, int sel)
+/* -------- */
+
+/* coordinates for diamond shape */
+static const float _unit_diamond_shape[4][2] = {
+ {0.0f, 1.0f}, /* top vert */
+ {1.0f, 0.0f}, /* mid-right */
+ {0.0f, -1.0f}, /* bottom vert */
+ {-1.0f, 0.0f} /* mid-left */
+};
+
+/* 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)
{
- int xmin= x, ymin= y;
- int xmax= x+w-1, ymax= y+h-1;
- int xc= (xmin+xmax)/2, yc= (ymin+ymax)/2;
-
- /* interior - hardcoded colors (for selected and unselected only) */
- if (sel) glColor3ub(0xF1, 0xCA, 0x13);
- else glColor3ub(0xE9, 0xE9, 0xE9);
-
- glBegin(GL_QUADS);
- glVertex2i(xc, ymin);
- glVertex2i(xmax, yc);
- glVertex2i(xc, ymax);
- glVertex2i(xmin, yc);
- glEnd();
-
-
- /* outline */
- glColor3ub(0, 0, 0);
-
- glBegin(GL_LINE_LOOP);
- glVertex2i(xc, ymin);
- glVertex2i(xmax, yc);
- glVertex2i(xc, ymax);
- glVertex2i(xmin, yc);
- glEnd();
+ static GLuint displist1=0;
+ static GLuint displist2=0;
+
+ /* initialise 2 display lists for diamond shape - one empty, one filled */
+ if (displist1 == 0) {
+ displist1= glGenLists(1);
+ glNewList(displist1, GL_COMPILE);
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2fv(_unit_diamond_shape[0]);
+ glVertex2fv(_unit_diamond_shape[1]);
+ glVertex2fv(_unit_diamond_shape[2]);
+ glVertex2fv(_unit_diamond_shape[3]);
+ glEnd();
+ glEndList();
+ }
+ if (displist2 == 0) {
+ displist2= glGenLists(1);
+ glNewList(displist2, GL_COMPILE);
+
+ glBegin(GL_QUADS);
+ glVertex2fv(_unit_diamond_shape[0]);
+ glVertex2fv(_unit_diamond_shape[1]);
+ glVertex2fv(_unit_diamond_shape[2]);
+ glVertex2fv(_unit_diamond_shape[3]);
+ glEnd();
+ glEndList();
+ }
+
+ /* tweak size of keyframe shape according to type of keyframe
+ * - 'proper' keyframes have key_type=0, so get drawn at full size
+ */
+ hsize -= 0.5f*key_type;
+
+ /* adjust view transform before starting */
+ glTranslatef(x, y, 0.0f);
+ glScalef(1.0f/xscale*hsize, hsize, 1.0f);
+
+ /* anti-aliased lines for more consistent appearance */
+ glEnable(GL_LINE_SMOOTH);
+
+ /* draw! */
+ if ELEM(mode, KEYFRAME_SHAPE_INSIDE, KEYFRAME_SHAPE_BOTH) {
+ /* interior - hardcoded colors (for selected and unselected only) */
+ 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);
+ }
+ 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);
+ }
+ 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);
+ }
+ break;
+ }
+
+ glCallList(displist2);
+ }
+
+ if ELEM(mode, KEYFRAME_SHAPE_FRAME, KEYFRAME_SHAPE_BOTH) {
+ /* exterior - black frame */
+ glColor3ub(0, 0, 0);
+
+ glCallList(displist1);
+ }
+
+ glDisable(GL_LINE_SMOOTH);
+
+ /* restore view transform */
+ glScalef(xscale/hsize, 1.0f/hsize, 1.0);
+ glTranslatef(-x, -y, 0.0f);
}
-#endif
-static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, float ypos)
+static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos)
{
ActKeyColumn *ak;
ActKeyBlock *ab;
+ float xscale;
glEnable(GL_BLEND);
+ /* get View2D scaling factor */
+ UI_view2d_getscale(v2d, &xscale, NULL);
+
/* draw keyblocks */
if (blocks) {
for (ab= blocks->first; ab; ab= ab->next) {
short startCurves, endCurves, totCurves;
/* find out how many curves occur at each keyframe */
- ak= cfra_find_actkeycolumn(keys, ab->start);
+ ak= cfra_find_actkeycolumn((ActKeyColumn *)keys->root, ab->start);
startCurves = (ak)? ak->totcurve: 0;
- ak= cfra_find_actkeycolumn(keys, ab->end);
+ ak= cfra_find_actkeycolumn((ActKeyColumn *)keys->root, ab->end);
endCurves = (ak)? ak->totcurve: 0;
/* only draw keyblock if it appears in at all of the keyframes at lowest end */
@@ -292,18 +482,13 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
totCurves = (startCurves>endCurves)? endCurves: startCurves;
if (ab->totcurve >= totCurves) {
- int sc_xa, sc_xb, sc_ya, sc_yb;
-
- /* get co-ordinates of block */
- gla2DDrawTranslatePt(di, ab->start, ypos, &sc_xa, &sc_ya);
- gla2DDrawTranslatePt(di, ab->end, ypos, &sc_xb, &sc_yb);
-
/* draw block */
if (ab->sel)
UI_ThemeColor4(TH_STRIP_SELECT);
else
UI_ThemeColor4(TH_STRIP);
- glRectf((float)sc_xa, (float)sc_ya-3, (float)sc_xb, (float)sc_yb+5);
+
+ glRectf(ab->start, ypos-5, ab->end, ypos+5);
}
}
}
@@ -311,18 +496,16 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
/* draw keys */
if (keys) {
for (ak= keys->first; ak; ak= ak->next) {
- int sc_x, sc_y;
-
- /* get co-ordinate to draw at */
- gla2DDrawTranslatePt(di, ak->cfra, ypos, &sc_x, &sc_y);
-
- /* draw using icons - old way which is slower but more proven */
- if (ak->sel & SELECT) UI_icon_draw_aspect((float)sc_x-7, (float)sc_y-6, ICON_SPACE2, 1.0f);
- else UI_icon_draw_aspect((float)sc_x-7, (float)sc_y-6, ICON_SPACE3, 1.0f);
+ /* 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
+ */
+ if (IN_RANGE_INCL(ak->cfra, v2d->cur.xmin, v2d->cur.xmax) == 0)
+ continue;
- /* draw using OpenGL - slightly uglier but faster */
- // NOTE: disabled for now, as some intel cards seem to have problems with this
- //draw_key_but(sc_x-5, sc_y-4, 11, 11, (ak->sel & SELECT));
+ /* 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);
}
}
@@ -331,89 +514,122 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
/* *************************** Channel Drawing Funcs *************************** */
-void draw_scene_channel(gla2DDrawInfo *di, ActKeysInc *aki, Scene *sce, float ypos)
+void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos)
{
- ListBase keys = {0, 0};
- ListBase blocks = {0, 0};
-
- scene_to_keylist(sce, &keys, &blocks, aki);
- draw_keylist(di, &keys, &blocks, ypos);
+ DLRBT_Tree keys, blocks;
+
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
+
+ scene_to_keylist(ads, sce, &keys, &blocks);
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
- BLI_freelistN(&keys);
- BLI_freelistN(&blocks);
+ draw_keylist(v2d, &keys, &blocks, ypos);
+
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
}
-void draw_object_channel(gla2DDrawInfo *di, ActKeysInc *aki, Object *ob, float ypos)
+void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos)
{
- ListBase keys = {0, 0};
- ListBase blocks = {0, 0};
-
- ob_to_keylist(ob, &keys, &blocks, aki);
- draw_keylist(di, &keys, &blocks, ypos);
+ DLRBT_Tree keys, blocks;
+
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
+
+ ob_to_keylist(ads, ob, &keys, &blocks);
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
+
+ draw_keylist(v2d, &keys, &blocks, ypos);
- BLI_freelistN(&keys);
- BLI_freelistN(&blocks);
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
}
-void draw_fcurve_channel(gla2DDrawInfo *di, ActKeysInc *aki, FCurve *fcu, float ypos)
+void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos)
{
- ListBase keys = {0, 0};
- ListBase blocks = {0, 0};
-
- fcurve_to_keylist(fcu, &keys, &blocks, aki);
- draw_keylist(di, &keys, &blocks, ypos);
+ DLRBT_Tree keys, blocks;
+
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
+
+ fcurve_to_keylist(adt, fcu, &keys, &blocks);
- BLI_freelistN(&keys);
- BLI_freelistN(&blocks);
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
+
+ draw_keylist(v2d, &keys, &blocks, ypos);
+
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
}
-void draw_agroup_channel(gla2DDrawInfo *di, ActKeysInc *aki, bActionGroup *agrp, float ypos)
+void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float ypos)
{
- ListBase keys = {0, 0};
- ListBase blocks = {0, 0};
-
- agroup_to_keylist(agrp, &keys, &blocks, aki);
- draw_keylist(di, &keys, &blocks, ypos);
+ DLRBT_Tree keys, blocks;
- BLI_freelistN(&keys);
- BLI_freelistN(&blocks);
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
+
+ agroup_to_keylist(adt, agrp, &keys, &blocks);
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
+
+ draw_keylist(v2d, &keys, &blocks, ypos);
+
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
}
-void draw_action_channel(gla2DDrawInfo *di, ActKeysInc *aki, bAction *act, float ypos)
+void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos)
{
- ListBase keys = {0, 0};
- ListBase blocks = {0, 0};
-
- action_to_keylist(act, &keys, &blocks, aki);
- draw_keylist(di, &keys, &blocks, ypos);
+ DLRBT_Tree keys, blocks;
+
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
- BLI_freelistN(&keys);
- BLI_freelistN(&blocks);
+ action_to_keylist(adt, act, &keys, &blocks);
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
+
+ draw_keylist(v2d, &keys, &blocks, ypos);
+
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
}
-void draw_gpl_channel(gla2DDrawInfo *di, ActKeysInc *aki, bGPDlayer *gpl, float ypos)
+void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos)
{
- ListBase keys = {0, 0};
+ DLRBT_Tree keys;
+
+ BLI_dlrbTree_init(&keys);
+
+ gpl_to_keylist(ads, gpl, &keys, NULL);
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
- gpl_to_keylist(gpl, &keys, NULL, aki);
- draw_keylist(di, &keys, NULL, ypos);
- BLI_freelistN(&keys);
+ draw_keylist(v2d, &keys, NULL, ypos);
+
+ BLI_dlrbTree_free(&keys);
}
/* *************************** Keyframe List Conversions *************************** */
-void scene_to_keylist(Scene *sce, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void scene_to_keylist(bDopeSheet *ads, Scene *sce, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
if (sce) {
- bDopeSheet *ads= (aki)? (aki->ads) : NULL;
AnimData *adt;
int filterflag;
/* get filterflag */
if (ads)
filterflag= ads->filterflag;
- else if ((aki) && (aki->actmode == -1)) /* only set like this by NLA */
- filterflag= ADS_FILTER_NLADUMMY;
else
filterflag= 0;
@@ -423,7 +639,7 @@ void scene_to_keylist(Scene *sce, ListBase *keys, ListBase *blocks, ActKeysInc *
// TODO: when we adapt NLA system, this needs to be the NLA-scaled version
if (adt->action)
- action_to_keylist(adt->action, keys, blocks, aki);
+ action_to_keylist(adt, adt->action, keys, blocks);
}
/* world animdata */
@@ -432,17 +648,16 @@ void scene_to_keylist(Scene *sce, ListBase *keys, ListBase *blocks, ActKeysInc *
// TODO: when we adapt NLA system, this needs to be the NLA-scaled version
if (adt->action)
- action_to_keylist(adt->action, keys, blocks, aki);
+ action_to_keylist(adt, adt->action, keys, blocks);
}
}
}
-void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
Key *key= ob_get_key(ob);
if (ob) {
- bDopeSheet *ads= (aki)? (aki->ads) : NULL;
int filterflag;
/* get filterflag */
@@ -453,189 +668,72 @@ void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks, ActKeysInc *aki
/* Add action keyframes */
if (ob->adt && ob->adt->action)
- action_nlascaled_to_keylist(ob, ob->adt->action, keys, blocks, aki);
+ action_to_keylist(ob->adt, ob->adt->action, keys, blocks);
/* Add shapekey keyframes (only if dopesheet allows, if it is available) */
- // TODO: when we adapt NLA system, this needs to be the NLA-scaled version
if ((key && key->adt && key->adt->action) && !(filterflag & ADS_FILTER_NOSHAPEKEYS))
- action_to_keylist(key->adt->action, keys, blocks, aki);
-
-#if 0 // XXX old animation system
- /* Add material keyframes (only if dopesheet allows, if it is available) */
- if ((ob->totcol) && !(filterflag & ADS_FILTER_NOMAT)) {
- short a;
-
- for (a=0; a<ob->totcol; a++) {
- Material *ma= give_current_material(ob, a);
-
- if (ELEM(NULL, ma, ma->ipo) == 0)
- ipo_to_keylist(ma->ipo, keys, blocks, aki);
- }
- }
+ action_to_keylist(key->adt, key->adt->action, keys, blocks);
- /* Add object data keyframes */
- switch (ob->type) {
- case OB_CAMERA: /* ------- Camera ------------ */
- {
- Camera *ca= (Camera *)ob->data;
- if ((ca->ipo) && !(filterflag & ADS_FILTER_NOCAM))
- ipo_to_keylist(ca->ipo, keys, blocks, aki);
- }
- break;
- case OB_LAMP: /* ---------- Lamp ----------- */
- {
- Lamp *la= (Lamp *)ob->data;
- if ((la->ipo) && !(filterflag & ADS_FILTER_NOLAM))
- ipo_to_keylist(la->ipo, keys, blocks, aki);
- }
- break;
- case OB_CURVE: /* ------- Curve ---------- */
- {
- Curve *cu= (Curve *)ob->data;
- if ((cu->ipo) && !(filterflag & ADS_FILTER_NOCUR))
- ipo_to_keylist(cu->ipo, keys, blocks, aki);
- }
- break;
- }
-#endif // XXX old animation system
- }
-}
-
-static short bezt_in_aki_range (ActKeysInc *aki, BezTriple *bezt)
-{
- /* when aki == NULL, we don't care about range */
- if (aki == NULL)
- return 1;
-
- /* if start and end are both 0, then don't care about range */
- if (IS_EQ(aki->start, 0) && IS_EQ(aki->end, 0))
- return 1;
-
- /* if nla-scaling is in effect, apply appropriate scaling adjustments */
-#if 0 // XXX this was from some buggy code... do not port for now
- if (aki->ob) {
- float frame= get_action_frame_inv(aki->ob, bezt->vec[1][0]);
- return IN_RANGE(frame, aki->start, aki->end);
- }
- else {
- /* check if in range */
- return IN_RANGE(bezt->vec[1][0], aki->start, aki->end);
+ // TODO: restore materials, and object data, etc.
}
-#endif // XXX this was from some buggy code... do not port for now
- return 1;
}
-void fcurve_to_keylist(FCurve *fcu, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
BezTriple *bezt;
- ActKeyColumn *ak, *ak2;
- ActKeyBlock *ab, *ab2;
int v;
if (fcu && fcu->totvert && fcu->bezt) {
+ /* apply NLA-mapping (if applicable) */
+ if (adt)
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1);
+
/* loop through beztriples, making ActKeys and ActKeyBlocks */
bezt= fcu->bezt;
for (v=0; v < fcu->totvert; v++, bezt++) {
- /* only if keyframe is in range (optimisation) */
- if (bezt_in_aki_range(aki, bezt)) {
- add_bezt_to_keycolumnslist(keys, bezt);
- if (blocks) add_bezt_to_keyblockslist(blocks, fcu, v);
- }
+ add_bezt_to_keycolumns_list(keys, bezt);
+ if (blocks) add_bezt_to_keyblocks_list(blocks, fcu, v);
}
/* update the number of curves that elements have appeared in */
- if (keys) {
- for (ak=keys->first, ak2=keys->last; ak && ak2; ak=ak->next, ak2=ak2->prev) {
- if (ak->modified) {
- ak->modified = 0;
- ak->totcurve += 1;
- }
-
- if (ak == ak2)
- break;
-
- if (ak2->modified) {
- ak2->modified = 0;
- ak2->totcurve += 1;
- }
- }
- }
- if (blocks) {
- for (ab=blocks->first, ab2=blocks->last; ab && ab2; ab=ab->next, ab2=ab2->prev) {
- if (ab->modified) {
- ab->modified = 0;
- ab->totcurve += 1;
- }
-
- if (ab == ab2)
- break;
-
- if (ab2->modified) {
- ab2->modified = 0;
- ab2->totcurve += 1;
- }
- }
- }
+ // FIXME: this is broken with the new tree structure for now...
+ if (keys)
+ set_touched_actkeycolumn(keys->root);
+ if (blocks)
+ set_touched_actkeyblock(blocks->root);
+
+ /* unapply NLA-mapping if applicable */
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 1);
}
}
-void agroup_to_keylist(bActionGroup *agrp, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void agroup_to_keylist(AnimData *adt, bActionGroup *agrp, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
FCurve *fcu;
if (agrp) {
/* loop through F-Curves */
for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next) {
- fcurve_to_keylist(fcu, keys, blocks, aki);
+ fcurve_to_keylist(adt, fcu, keys, blocks);
}
}
}
-void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void action_to_keylist(AnimData *adt, bAction *act, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
FCurve *fcu;
if (act) {
/* loop through F-Curves */
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
- fcurve_to_keylist(fcu, keys, blocks, aki);
+ fcurve_to_keylist(adt, fcu, keys, blocks);
}
}
}
-void action_nlascaled_to_keylist(Object *ob, bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
-{
- FCurve *fcu;
- Object *oldob= NULL;
-
- /* although apply and clearing NLA-scaling pre-post creating keylist does impact on performance,
- * the effects should be fairly minimal, as we're already going through the keyframes multiple times
- * already for blocks too...
- */
- if (act) {
- /* if 'aki' is provided, store it's current ob to restore later as it might not be the same */
- if (aki) {
- oldob= aki->ob;
- aki->ob= ob;
- }
-
- /* loop through F-Curves
- * - scaling correction only does times for center-points, so should be faster
- */
- for (fcu= act->curves.first; fcu; fcu= fcu->next) {
- ANIM_nla_mapping_apply_fcurve(ob, fcu, 0, 1);
- fcurve_to_keylist(fcu, keys, blocks, aki);
- ANIM_nla_mapping_apply_fcurve(ob, fcu, 1, 1);
- }
-
- /* if 'aki' is provided, restore ob */
- if (aki)
- aki->ob= oldob;
- }
-}
-void gpl_to_keylist(bGPDlayer *gpl, ListBase *keys, ListBase *blocks, ActKeysInc *aki)
+void gpl_to_keylist(bDopeSheet *ads, bGPDlayer *gpl, DLRBT_Tree *keys, DLRBT_Tree *blocks)
{
bGPDframe *gpf;
ActKeyColumn *ak;
@@ -644,11 +742,11 @@ void gpl_to_keylist(bGPDlayer *gpl, ListBase *keys, ListBase *blocks, ActKeysInc
/* 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(keys, ak);
+ BLI_addtail((ListBase *)keys, ak);
ak->cfra= (float)gpf->framenum;
ak->modified = 1;
- ak->handle_type= 0;
+ ak->key_type= 0;
if (gpf->flag & GP_FRAME_SELECT)
ak->sel = SELECT;
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index 8243629b4a6..9666cb115b1 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -128,6 +128,10 @@ static short agrp_keys_bezier_loop(BeztEditData *bed, bActionGroup *agrp, BeztEd
{
FCurve *fcu;
+ /* sanity check */
+ if (agrp == NULL)
+ return 0;
+
/* only iterate over the F-Curves that are in this group */
for (fcu= agrp->channels.first; fcu && fcu->grp==agrp; fcu= fcu->next) {
if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, fcu_cb))
@@ -142,6 +146,10 @@ static short act_keys_bezier_loop(BeztEditData *bed, bAction *act, BeztEditFunc
{
FCurve *fcu;
+ /* sanity check */
+ if (act == NULL)
+ return 0;
+
/* just loop through all F-Curves */
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
if (ANIM_fcurve_keys_bezier_loop(bed, fcu, bezt_ok, bezt_cb, fcu_cb))
@@ -154,6 +162,10 @@ static short act_keys_bezier_loop(BeztEditData *bed, bAction *act, BeztEditFunc
/* This function is used to loop over the keyframe data of an AnimData block */
static short adt_keys_bezier_loop(BeztEditData *bed, AnimData *adt, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag)
{
+ /* sanity check */
+ if (adt == NULL)
+ return 0;
+
/* drivers or actions? */
if (filterflag & ADS_FILTER_ONLYDRIVERS) {
FCurve *fcu;
@@ -178,6 +190,10 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez
{
Key *key= ob_get_key(ob);
+ /* sanity check */
+ if (ob == NULL)
+ return 0;
+
/* firstly, Object's own AnimData */
if (ob->adt)
adt_keys_bezier_loop(bed, ob->adt, bezt_ok, bezt_cb, fcu_cb, filterflag);
@@ -194,7 +210,11 @@ static short ob_keys_bezier_loop(BeztEditData *bed, Object *ob, BeztEditFunc bez
/* This function is used to loop over the keyframe data in a Scene */
static short scene_keys_bezier_loop(BeztEditData *bed, Scene *sce, BeztEditFunc bezt_ok, BeztEditFunc bezt_cb, FcuEditFunc fcu_cb, int filterflag)
{
- World *wo= sce->world;
+ World *wo= (sce) ? sce->world : NULL;
+
+ /* sanity check */
+ if (sce == NULL)
+ return 0;
/* Scene's own animation */
if (sce->adt)
@@ -231,7 +251,7 @@ short ANIM_animchannel_keys_bezier_loop(BeztEditData *bed, bAnimListElem *ale, B
return act_keys_bezier_loop(bed, (bAction *)ale->data, bezt_ok, bezt_cb, fcu_cb);
case ALE_OB: /* object */
- return ob_keys_bezier_loop(bed, (Object *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag);
+ return ob_keys_bezier_loop(bed, (Object *)ale->key_data, bezt_ok, bezt_cb, fcu_cb, filterflag);
case ALE_SCE: /* scene */
return scene_keys_bezier_loop(bed, (Scene *)ale->data, bezt_ok, bezt_cb, fcu_cb, filterflag);
}
@@ -635,7 +655,7 @@ static short set_bezt_bezier(BeztEditData *bed, BezTriple *bezt)
return 0;
}
-/* Set the interpolation type of the selected BezTriples in each IPO curve to the specified one */
+/* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */
// ANIM_editkeyframes_ipocurve_ipotype() !
BeztEditFunc ANIM_editkeyframes_ipo(short code)
{
@@ -649,6 +669,45 @@ BeztEditFunc ANIM_editkeyframes_ipo(short code)
}
}
+/* ------- */
+
+static short set_keytype_keyframe(BeztEditData *bed, BezTriple *bezt)
+{
+ if (bezt->f2 & SELECT)
+ BEZKEYTYPE(bezt)= BEZT_KEYTYPE_KEYFRAME;
+ return 0;
+}
+
+static short set_keytype_breakdown(BeztEditData *bed, BezTriple *bezt)
+{
+ if (bezt->f2 & SELECT)
+ BEZKEYTYPE(bezt)= BEZT_KEYTYPE_BREAKDOWN;
+ return 0;
+}
+
+static short set_keytype_extreme(BeztEditData *bed, BezTriple *bezt)
+{
+ if (bezt->f2 & SELECT)
+ BEZKEYTYPE(bezt)= BEZT_KEYTYPE_EXTREME;
+ return 0;
+}
+
+/* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */
+BeztEditFunc ANIM_editkeyframes_keytype(short code)
+{
+ switch (code) {
+ case BEZT_KEYTYPE_BREAKDOWN: /* breakdown */
+ return set_keytype_breakdown;
+
+ case BEZT_KEYTYPE_EXTREME: /* extreme keyframe */
+ return set_keytype_extreme;
+
+ case BEZT_KEYTYPE_KEYFRAME: /* proper keyframe */
+ default:
+ return set_keytype_keyframe;
+ }
+}
+
/* ******************************************* */
/* Selection */
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index 48ca06fb73d..f13d35c7d4a 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -43,6 +43,8 @@
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
+#include "RNA_access.h"
+
#include "BKE_action.h"
#include "BKE_fcurve.h"
#include "BKE_key.h"
@@ -125,11 +127,11 @@ void duplicate_fcurve_keys(FCurve *fcu)
{
BezTriple *newbezt;
int i;
-
- if (fcu == NULL)
+
+ /* this can only work when there is an F-Curve, and also when there are some BezTriples */
+ if ELEM(NULL, fcu, fcu->bezt)
return;
- // XXX this does not take into account sample data...
for (i=0; i < fcu->totvert; i++) {
/* If a key is selected */
if (fcu->bezt[i].f2 & SELECT) {
@@ -158,7 +160,7 @@ void duplicate_fcurve_keys(FCurve *fcu)
/* **************************************************** */
/* Various Tools */
-/* Basic IPO-Curve 'cleanup' function that removes 'double points' and unnecessary keyframes on linear-segments only */
+/* Basic F-Curve 'cleanup' function that removes 'double points' and unnecessary keyframes on linear-segments only */
void clean_fcurve(FCurve *fcu, float thresh)
{
BezTriple *old_bezts, *bezt, *beztn;
@@ -283,75 +285,145 @@ void smooth_fcurve (FCurve *fcu)
}
}
- /* if any points were selected, allocate tSmooth_Bezt points to work on */
- if (totSel >= 3) {
- tSmooth_Bezt *tarray, *tsb;
-
- /* allocate memory in one go */
- tsb= tarray= MEM_callocN(totSel*sizeof(tSmooth_Bezt), "tSmooth_Bezt Array");
-
- /* populate tarray with data of selected points */
- bezt= fcu->bezt;
- for (i=0, x=0; (i < fcu->totvert) && (x < totSel); i++, bezt++) {
- if (BEZSELECTED(bezt)) {
- /* tsb simply needs pointer to vec, and index */
- tsb->h1 = &bezt->vec[0][1];
- tsb->h2 = &bezt->vec[1][1];
- tsb->h3 = &bezt->vec[2][1];
-
- /* advance to the next tsb to populate */
- if (x < totSel- 1)
- tsb++;
- else
- break;
- }
+ /* if any points were selected, allocate tSmooth_Bezt points to work on */
+ if (totSel >= 3) {
+ tSmooth_Bezt *tarray, *tsb;
+
+ /* allocate memory in one go */
+ tsb= tarray= MEM_callocN(totSel*sizeof(tSmooth_Bezt), "tSmooth_Bezt Array");
+
+ /* populate tarray with data of selected points */
+ bezt= fcu->bezt;
+ for (i=0, x=0; (i < fcu->totvert) && (x < totSel); i++, bezt++) {
+ if (BEZSELECTED(bezt)) {
+ /* tsb simply needs pointer to vec, and index */
+ tsb->h1 = &bezt->vec[0][1];
+ tsb->h2 = &bezt->vec[1][1];
+ tsb->h3 = &bezt->vec[2][1];
+
+ /* advance to the next tsb to populate */
+ if (x < totSel- 1)
+ tsb++;
+ else
+ break;
}
+ }
- /* calculate the new smoothed F-Curve's with weighted averages:
- * - this is done with two passes
- * - uses 5 points for each operation (which stores in the relevant handles)
- * - previous: w/a ratio = 3:5:2:1:1
- * - next: w/a ratio = 1:1:2:5:3
- */
-
- /* round 1: calculate previous and next */
- tsb= tarray;
- for (i=0; i < totSel; i++, tsb++) {
- /* don't touch end points (otherwise, curves slowly explode) */
- if (ELEM(i, 0, (totSel-1)) == 0) {
- const tSmooth_Bezt *tP1 = tsb - 1;
- const tSmooth_Bezt *tP2 = (i-2 > 0) ? (tsb - 2) : (NULL);
- const tSmooth_Bezt *tN1 = tsb + 1;
- const tSmooth_Bezt *tN2 = (i+2 < totSel) ? (tsb + 2) : (NULL);
-
- const float p1 = *tP1->h2;
- const float p2 = (tP2) ? (*tP2->h2) : (*tP1->h2);
- const float c1 = *tsb->h2;
- const float n1 = *tN1->h2;
- const float n2 = (tN2) ? (*tN2->h2) : (*tN1->h2);
+ /* calculate the new smoothed F-Curve's with weighted averages:
+ * - this is done with two passes
+ * - uses 5 points for each operation (which stores in the relevant handles)
+ * - previous: w/a ratio = 3:5:2:1:1
+ * - next: w/a ratio = 1:1:2:5:3
+ */
+
+ /* round 1: calculate previous and next */
+ tsb= tarray;
+ for (i=0; i < totSel; i++, tsb++) {
+ /* don't touch end points (otherwise, curves slowly explode) */
+ if (ELEM(i, 0, (totSel-1)) == 0) {
+ const tSmooth_Bezt *tP1 = tsb - 1;
+ const tSmooth_Bezt *tP2 = (i-2 > 0) ? (tsb - 2) : (NULL);
+ const tSmooth_Bezt *tN1 = tsb + 1;
+ const tSmooth_Bezt *tN2 = (i+2 < totSel) ? (tsb + 2) : (NULL);
+
+ const float p1 = *tP1->h2;
+ const float p2 = (tP2) ? (*tP2->h2) : (*tP1->h2);
+ const float c1 = *tsb->h2;
+ const float n1 = *tN1->h2;
+ const float n2 = (tN2) ? (*tN2->h2) : (*tN1->h2);
+
+ /* calculate previous and next */
+ *tsb->h1= (3*p2 + 5*p1 + 2*c1 + n1 + n2) / 12;
+ *tsb->h3= (p2 + p1 + 2*c1 + 5*n1 + 3*n2) / 12;
+ }
+ }
+
+ /* round 2: calculate new values and reset handles */
+ tsb= tarray;
+ for (i=0; i < totSel; i++, tsb++) {
+ /* calculate new position by averaging handles */
+ *tsb->h2 = (*tsb->h1 + *tsb->h3) / 2;
- /* calculate previous and next */
- *tsb->h1= (3*p2 + 5*p1 + 2*c1 + n1 + n2) / 12;
- *tsb->h3= (p2 + p1 + 2*c1 + 5*n1 + 3*n2) / 12;
+ /* reset handles now */
+ *tsb->h1 = *tsb->h2;
+ *tsb->h3 = *tsb->h2;
}
- }
-
- /* round 2: calculate new values and reset handles */
- tsb= tarray;
- for (i=0; i < totSel; i++, tsb++) {
- /* calculate new position by averaging handles */
- *tsb->h2 = (*tsb->h1 + *tsb->h3) / 2;
- /* reset handles now */
- *tsb->h1 = *tsb->h2;
- *tsb->h3 = *tsb->h2;
+ /* free memory required for tarray */
+ MEM_freeN(tarray);
}
- /* free memory required for tarray */
- MEM_freeN(tarray);
+ /* recalculate handles */
+ calchandles_fcurve(fcu);
}
+
+/* ---------------- */
+
+/* little cache for values... */
+typedef struct tempFrameValCache {
+ float frame, val;
+} tempFrameValCache;
+
+
+/* Evaluates the curves between each selected keyframe on each frame, and keys the value */
+void sample_fcurve (FCurve *fcu)
+{
+ BezTriple *bezt, *start=NULL, *end=NULL;
+ tempFrameValCache *value_cache, *fp;
+ int sfra, range;
+ int i, n, nIndex;
- /* recalculate handles */
+ /* find selected keyframes... once pair has been found, add keyframes */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ /* check if selected, and which end this is */
+ if (BEZSELECTED(bezt)) {
+ if (start) {
+ /* set end */
+ end= bezt;
+
+ /* cache values then add keyframes using these values, as adding
+ * keyframes while sampling will affect the outcome...
+ * - only start sampling+adding from index=1, so that we don't overwrite original keyframe
+ */
+ range= (int)( ceil(end->vec[1][0] - start->vec[1][0]) );
+ sfra= (int)( floor(start->vec[1][0]) );
+
+ if (range) {
+ value_cache= MEM_callocN(sizeof(tempFrameValCache)*range, "IcuFrameValCache");
+
+ /* sample values */
+ for (n=1, fp=value_cache; n<range && fp; n++, fp++) {
+ fp->frame= (float)(sfra + n);
+ fp->val= evaluate_fcurve(fcu, fp->frame);
+ }
+
+ /* add keyframes with these, tagging as 'breakdowns' */
+ for (n=1, fp=value_cache; n<range && fp; n++, fp++) {
+ nIndex= insert_vert_fcurve(fcu, fp->frame, fp->val, 1);
+ BEZKEYTYPE(fcu->bezt + nIndex)= BEZT_KEYTYPE_BREAKDOWN;
+ }
+
+ /* free temp cache */
+ MEM_freeN(value_cache);
+
+ /* as we added keyframes, we need to compensate so that bezt is at the right place */
+ bezt = fcu->bezt + i + range - 1;
+ i += (range - 1);
+ }
+
+ /* bezt was selected, so it now marks the start of a whole new chain to search */
+ start= bezt;
+ end= NULL;
+ }
+ else {
+ /* just set start keyframe */
+ start= bezt;
+ end= NULL;
+ }
+ }
+ }
+
+ /* recalculate channel's handles? */
calchandles_fcurve(fcu);
}
@@ -369,7 +441,6 @@ ListBase animcopybuf = {NULL, NULL};
static float animcopy_firstframe= 999999999.0f;
/* datatype for use in copy/paste buffer */
-// XXX F-Curve editor should use this too
typedef struct tAnimCopybufItem {
struct tAnimCopybufItem *next, *prev;
@@ -528,8 +599,10 @@ short paste_animedit_keys (bAnimContext *ac, ListBase *anim_data)
bezt->vec[1][0] += offset;
bezt->vec[2][0] += offset;
- /* insert the keyframe */
- insert_bezt_fcurve(fcu, bezt);
+ /* 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;
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 90804052370..e3e72a532e2 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -1,5 +1,30 @@
-/* Testing code for 2.5 animation system
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#include <stdio.h>
@@ -29,6 +54,7 @@
#include "BKE_action.h"
#include "BKE_constraint.h"
#include "BKE_fcurve.h"
+#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BKE_context.h"
@@ -150,85 +176,6 @@ FCurve *verify_fcurve (bAction *act, const char group[], const char rna_path[],
/* -------------- BezTriple Insertion -------------------- */
-/* threshold for inserting keyframes - threshold here should be good enough for now, but should become userpref */
-#define BEZT_INSERT_THRESH 0.00001f
-
-/* Binary search algorithm for finding where to insert BezTriple. (for use by insert_bezt_icu)
- * Returns the index to insert at (data already at that index will be offset if replace is 0)
- */
-static int binarysearch_bezt_index (BezTriple array[], float frame, int arraylen, short *replace)
-{
- int start=0, end=arraylen;
- int loopbreaker= 0, maxloop= arraylen * 2;
-
- /* initialise replace-flag first */
- *replace= 0;
-
- /* sneaky optimisations (don't go through searching process if...):
- * - keyframe to be added is to be added out of current bounds
- * - keyframe to be added would replace one of the existing ones on bounds
- */
- if ((arraylen <= 0) || (array == NULL)) {
- printf("Warning: binarysearch_bezt_index() encountered invalid array \n");
- return 0;
- }
- else {
- /* check whether to add before/after/on */
- float framenum;
-
- /* 'First' Keyframe (when only one keyframe, this case is used) */
- framenum= array[0].vec[1][0];
- if (IS_EQT(frame, framenum, BEZT_INSERT_THRESH)) {
- *replace = 1;
- return 0;
- }
- else if (frame < framenum)
- return 0;
-
- /* 'Last' Keyframe */
- framenum= array[(arraylen-1)].vec[1][0];
- if (IS_EQT(frame, framenum, BEZT_INSERT_THRESH)) {
- *replace= 1;
- return (arraylen - 1);
- }
- else if (frame > framenum)
- return arraylen;
- }
-
-
- /* most of the time, this loop is just to find where to put it
- * 'loopbreaker' is just here to prevent infinite loops
- */
- for (loopbreaker=0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) {
- /* compute and get midpoint */
- int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */
- float midfra= array[mid].vec[1][0];
-
- /* check if exactly equal to midpoint */
- if (IS_EQT(frame, midfra, BEZT_INSERT_THRESH)) {
- *replace = 1;
- return mid;
- }
-
- /* repeat in upper/lower half */
- if (frame > midfra)
- start= mid + 1;
- else if (frame < midfra)
- end= mid - 1;
- }
-
- /* print error if loop-limit exceeded */
- if (loopbreaker == (maxloop-1)) {
- printf("Error: binarysearch_bezt_index() was taking too long \n");
-
- // include debug info
- printf("\tround = %d: start = %d, end = %d, arraylen = %d \n", loopbreaker, start, end, arraylen);
- }
-
- /* not found, so return where to place it */
- return start;
-}
-
/* This function adds a given BezTriple to an F-Curve. It will allocate
* memory for the array if needed, and will insert the BezTriple into a
* suitable place in chronological order.
@@ -236,9 +183,8 @@ static int binarysearch_bezt_index (BezTriple array[], float frame, int arraylen
* NOTE: any recalculate of the F-Curve that needs to be done will need to
* be done by the caller.
*/
-int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt)
+int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
{
- BezTriple *newb;
int i= 0;
if (fcu->bezt) {
@@ -247,13 +193,33 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt)
if (replace) {
/* sanity check: 'i' may in rare cases exceed arraylen */
- // FIXME: do not overwrite handletype if just replacing...?
- if ((i >= 0) && (i < fcu->totvert))
- *(fcu->bezt + i) = *bezt;
+ if ((i >= 0) && (i < fcu->totvert)) {
+ /* take care with the handletypes and other info if the replacement flags are set */
+ if (flag & INSERTKEY_REPLACE) {
+ BezTriple *dst= (fcu->bezt + i);
+ float dy= bezt->vec[1][1] - dst->vec[1][1];
+
+ /* just apply delta value change to the handle values */
+ dst->vec[0][1] += dy;
+ dst->vec[1][1] += dy;
+ dst->vec[2][1] += dy;
+
+ // TODO: perform some other operations?
+ }
+ else {
+ char oldKeyType= BEZKEYTYPE(fcu->bezt + i);
+
+ /* just brutally replace the values */
+ *(fcu->bezt + i) = *bezt;
+
+ /* special exception for keyframe type - copy value back so that this info isn't lost */
+ BEZKEYTYPE(fcu->bezt + i)= oldKeyType;
+ }
+ }
}
- else {
- /* add new */
- newb= MEM_callocN((fcu->totvert+1)*sizeof(BezTriple), "beztriple");
+ else if ((flag & INSERTKEY_REPLACE) == 0) {
+ /* insert new - if we're not restricted to replacing keyframes only */
+ BezTriple *newb= MEM_callocN((fcu->totvert+1)*sizeof(BezTriple), "beztriple");
/* add the beztriples that should occur before the beztriple to be pasted (originally in ei->icu) */
if (i > 0)
@@ -266,10 +232,10 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt)
if (i < fcu->totvert)
memcpy(newb+i+1, fcu->bezt+i, (fcu->totvert-i)*sizeof(BezTriple));
- /* replace (+ free) old with new */
+ /* replace (+ free) old with new, only if necessary to do so */
MEM_freeN(fcu->bezt);
fcu->bezt= newb;
-
+
fcu->totvert++;
}
}
@@ -287,13 +253,11 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt)
return i;
}
-/* This function is a wrapper for insert_bezt_icu, and should be used when
- * adding a new keyframe to a curve, when the keyframe doesn't exist anywhere
- * else yet.
- *
- * 'fast' - is only for the python API where importing BVH's would take an extreamly long time.
+/* This function is a wrapper for insert_bezt_fcurve_internal(), and should be used when
+ * adding a new keyframe to a curve, when the keyframe doesn't exist anywhere else yet.
+ * It returns the index at which the keyframe was added.
*/
-void insert_vert_fcurve (FCurve *fcu, float x, float y, short fast)
+int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
{
BezTriple beztr;
int a;
@@ -311,21 +275,22 @@ void insert_vert_fcurve (FCurve *fcu, float x, float y, short fast)
beztr.h1= beztr.h2= HD_AUTO; // XXX what about when we replace an old one?
/* add temp beztriple to keyframes */
- a= insert_bezt_fcurve(fcu, &beztr);
+ a= insert_bezt_fcurve(fcu, &beztr, flag);
/* what if 'a' is a negative index?
* for now, just exit to prevent any segfaults
*/
- if (a < 0) return;
+ if (a < 0) return -1;
/* don't recalculate handles if fast is set
* - this is a hack to make importers faster
- * - we may calculate twice (see editipo_changed(), due to autohandle needing two calculations)
+ * - we may calculate twice (due to autohandle needing to be calculated twice)
*/
- if (!fast) calchandles_fcurve(fcu);
+ if ((flag & INSERTKEY_FAST) == 0)
+ calchandles_fcurve(fcu);
/* set handletype and interpolation */
- if (fcu->totvert > 2) {
+ if ((fcu->totvert > 2) && (flag & INSERTKEY_REPLACE)==0) {
BezTriple *bezt= (fcu->bezt + a);
char h1, h2;
@@ -344,10 +309,14 @@ void insert_vert_fcurve (FCurve *fcu, float x, float y, short fast)
/* don't recalculate handles if fast is set
* - this is a hack to make importers faster
- * - we may calculate twice (see editipo_changed(), due to autohandle needing two calculations)
+ * - we may calculate twice (due to autohandle needing to be calculated twice)
*/
- if (!fast) calchandles_fcurve(fcu);
+ if ((flag & INSERTKEY_FAST) == 0)
+ calchandles_fcurve(fcu);
}
+
+ /* return the index at which the keyframe was added */
+ return a;
}
/* -------------- 'Smarter' Keyframing Functions -------------------- */
@@ -477,19 +446,19 @@ static float setting_get_rna_value (PointerRNA *ptr, PropertyRNA *prop, int inde
switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(ptr, prop))
value= (float)RNA_property_boolean_get_index(ptr, prop, index);
else
value= (float)RNA_property_boolean_get(ptr, prop);
break;
case PROP_INT:
- if (RNA_property_array_length(prop))
+ 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);
break;
case PROP_FLOAT:
- if (RNA_property_array_length(prop))
+ if (RNA_property_array_length(ptr, prop))
value= RNA_property_float_get_index(ptr, prop, index);
else
value= RNA_property_float_get(ptr, prop);
@@ -678,7 +647,7 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
float eul[3];
/* euler-rotation test before standard rotation, as standard rotation does quats */
- Mat4ToEul(tmat, eul);
+ Mat4ToEulO(tmat, eul, pchan->rotmode);
return eul[array_index];
}
else if (strstr(identifier, "rotation")) {
@@ -697,9 +666,125 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
/* ------------------------- Insert Key API ------------------------- */
+/* Secondary Keyframing API call:
+ * Use this when validation of necessary animation data is not necessary, since an RNA-pointer to the necessary
+ * data being keyframed, and a pointer to the F-Curve to use have both been provided.
+ *
+ * The flag argument is used for special settings that alter the behaviour of
+ * 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)
+{
+ float curval= 0.0f;
+
+ /* no F-Curve to add keyframe to? */
+ if (fcu == NULL) {
+ printf("ERROR: no F-Curve to add keyframes to \n");
+ 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");
+ 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");
+ return 0;
+ }
+ if (prop == NULL) {
+ PointerRNA tmp_ptr;
+
+ /* 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>";
+
+ 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);
+ return 0;
+ }
+ else {
+ /* property found, so overwrite 'ptr' to make later code easier */
+ ptr= tmp_ptr;
+ }
+ }
+
+ /* set additional flags for the F-Curve (i.e. only integer values) */
+ fcu->flag &= ~(FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ /* do nothing */
+ break;
+ case PROP_INT:
+ /* do integer (only 'whole' numbers) interpolation between all points */
+ fcu->flag |= FCURVE_INT_VALUES;
+ break;
+ default:
+ /* do 'discrete' (i.e. enum, boolean values which cannot take any intermediate
+ * values at all) interpolation between all points
+ * - however, we must also ensure that evaluated values are only integers still
+ */
+ fcu->flag |= (FCURVE_DISCRETE_VALUES|FCURVE_INT_VALUES);
+ break;
+ }
+
+ /* obtain value to give keyframe */
+ if ( (flag & INSERTKEY_MATRIX) &&
+ (visualkey_can_use(&ptr, prop)) )
+ {
+ /* visual-keying is only available for object and pchan datablocks, as
+ * it works by keyframing using a value extracted from the final matrix
+ * instead of using the kt system to extract a value.
+ */
+ curval= visualkey_get_value(&ptr, prop, fcu->array_index);
+ }
+ else {
+ /* read value from system */
+ curval= setting_get_rna_value(&ptr, prop, fcu->array_index);
+ }
+
+ /* only insert keyframes where they are needed */
+ if (flag & INSERTKEY_NEEDED) {
+ short insert_mode;
+
+ /* check whether this curve really needs a new keyframe */
+ insert_mode= new_key_needed(fcu, cfra, curval);
+
+ /* insert new keyframe at current frame */
+ if (insert_mode)
+ insert_vert_fcurve(fcu, cfra, curval, flag);
+
+ /* delete keyframe immediately before/after newly added */
+ switch (insert_mode) {
+ case KEYNEEDED_DELPREV:
+ delete_fcurve_key(fcu, fcu->totvert-2, 1);
+ break;
+ case KEYNEEDED_DELNEXT:
+ delete_fcurve_key(fcu, 1, 1);
+ break;
+ }
+
+ /* only return success if keyframe added */
+ if (insert_mode)
+ return 1;
+ }
+ else {
+ /* just insert keyframe */
+ insert_vert_fcurve(fcu, cfra, curval, flag);
+
+ /* return success */
+ return 1;
+ }
+
+ /* failed */
+ return 0;
+}
+
/* Main Keyframing API call:
- * Use this when validation of necessary animation data isn't necessary as it
- * already exists. It will insert a keyframe using the current value being keyframed.
+ * Use this when validation of necessary animation data is necessary, since it may not exist yet.
*
* The flag argument is used for special settings that alter the behaviour of
* the keyframe insertion. These include the 'visual' keyframing modes, quick refresh,
@@ -719,102 +804,31 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
}
/* get F-Curve - if no action is provided, keyframe to the default one attached to this ID-block */
- if (act == NULL)
+ if (act == NULL) {
+ AnimData *adt= BKE_animdata_from_id(id);
+
+ /* get action to add F-Curve+keyframe to */
act= verify_adt_action(id, 1);
+
+ /* apply NLA-mapping to frame to use (if applicable) */
+ cfra= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
+ }
fcu= verify_fcurve(act, group, rna_path, array_index, 1);
- /* only continue if we have an F-Curve to add keyframe to */
- if (fcu) {
- float curval= 0.0f;
-
- /* set additional flags for the F-Curve (i.e. only integer values) */
- fcu->flag &= ~(FCURVE_INT_VALUES|FCURVE_DISCRETE_VALUES);
- switch (RNA_property_type(prop)) {
- case PROP_FLOAT:
- /* do nothing */
- break;
- case PROP_INT:
- /* do integer (only 'whole' numbers) interpolation between all points */
- fcu->flag |= FCURVE_INT_VALUES;
- break;
- default:
- /* do 'discrete' (i.e. enum, boolean values which cannot take any intermediate
- * values at all) interpolation between all points
- * - however, we must also ensure that evaluated values are only integers still
- */
- fcu->flag |= (FCURVE_DISCRETE_VALUES|FCURVE_INT_VALUES);
- break;
- }
-
- /* apply special time tweaking */
- // XXX check on this stuff...
- if (GS(id->name) == ID_OB) {
- //Object *ob= (Object *)id;
-
- /* apply NLA-scaling (if applicable) */
- //cfra= get_action_frame(ob, cfra);
-
- /* ancient time-offset cruft */
- //if ( (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)) ) {
- // /* actually frametofloat calc again! */
- // cfra-= give_timeoffset(ob)*scene->r.framelen;
- //}
- }
-
- /* obtain value to give keyframe */
- if ( (flag & INSERTKEY_MATRIX) &&
- (visualkey_can_use(&ptr, prop)) )
- {
- /* visual-keying is only available for object and pchan datablocks, as
- * it works by keyframing using a value extracted from the final matrix
- * instead of using the kt system to extract a value.
- */
- curval= visualkey_get_value(&ptr, prop, array_index);
- }
- else {
- /* read value from system */
- curval= setting_get_rna_value(&ptr, prop, array_index);
- }
+ /* apply special time tweaking */
+ // XXX check on this stuff...
+ if (GS(id->name) == ID_OB) {
+ //Object *ob= (Object *)id;
- /* only insert keyframes where they are needed */
- if (flag & INSERTKEY_NEEDED) {
- short insert_mode;
-
- /* check whether this curve really needs a new keyframe */
- insert_mode= new_key_needed(fcu, cfra, curval);
-
- /* insert new keyframe at current frame */
- if (insert_mode)
- insert_vert_fcurve(fcu, cfra, curval, (flag & INSERTKEY_FAST));
-
- /* delete keyframe immediately before/after newly added */
- switch (insert_mode) {
- case KEYNEEDED_DELPREV:
- delete_fcurve_key(fcu, fcu->totvert-2, 1);
- break;
- case KEYNEEDED_DELNEXT:
- delete_fcurve_key(fcu, 1, 1);
- break;
- }
-
- /* only return success if keyframe added */
- if (insert_mode)
- return 1;
- }
- else {
- /* just insert keyframe */
- insert_vert_fcurve(fcu, cfra, curval, (flag & INSERTKEY_FAST));
-
- /* return success */
- return 1;
- }
+ /* ancient time-offset cruft */
+ //if ( (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)) ) {
+ // /* actually frametofloat calc again! */
+ // cfra-= give_timeoffset(ob)*scene->r.framelen;
+ //}
}
- /* no F-Curve to add keyframes to */
- printf("ERROR: no F-Curve to add keyframes to \n");
-
- /* return failure */
- return 0;
+ /* insert keyframe */
+ return insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
}
/* ************************************************** */
@@ -839,12 +853,26 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
/* if no action is provided, use the default one attached to this ID-block */
AnimData *adt= BKE_animdata_from_id(id);
act= adt->action;
+
+ /* apply NLA-mapping to frame to use (if applicable) */
+ cfra= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
}
/* we don't check the validity of the path here yet, but it should be ok... */
fcu= verify_fcurve(act, group, rna_path, array_index, 0);
- /* only continue if we have an F-Curve to remove keyframes from */
- if (act && fcu) {
+ /* check if F-Curve exists and/or whether it can be edited */
+ if ELEM(NULL, act, fcu) {
+ printf("ERROR: no F-Curve and/or Action to delete keyframe from \n");
+ return 0;
+ }
+ 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");
+ return 0;
+ }
+
+ /* it should be fine to continue now... */
+ {
short found = -1;
int i;
@@ -852,9 +880,6 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
if (GS(id->name) == ID_OB) {
//Object *ob= (Object *)id;
- /* apply NLA-scaling (if applicable) */
- // cfra= get_action_frame(ob, cfra);
-
/* ancient time-offset cruft */
//if ( (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)) ) {
// /* actually frametofloat calc again! */
@@ -900,18 +925,15 @@ static int modify_key_op_poll(bContext *C)
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
+ SpaceOops *so= CTX_wm_space_outliner(C);
/* if no area or active scene */
if (ELEM(NULL, sa, scene))
return 0;
/* if Outliner, only allow in DataBlocks view */
- if (sa->spacetype == SPACE_OUTLINER) {
- SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C);
-
- if ((so->outlinevis != SO_DATABLOCKS))
- return 0;
- }
+ if (so && (so->outlinevis != SO_DATABLOCKS))
+ return 0;
/* TODO: checks for other space types can be added here */
@@ -1016,9 +1038,15 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
pup= uiPupMenuBegin(C, "Insert Keyframe", 0);
layout= uiPupMenuLayout(pup);
- /* active Keying Set */
- uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
- uiItemS(layout);
+ /* active Keying Set
+ * - only include entry if it exists
+ */
+ if (scene->active_keyingset) {
+ uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++);
+ uiItemS(layout);
+ }
+ else
+ i++;
/* user-defined Keying Sets
* - these are listed in the order in which they were defined for the active scene
@@ -1047,7 +1075,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
void ANIM_OT_insert_keyframe_menu (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Insert Keyframe";
+ ot->name= "Insert Keyframe Menu";
ot->idname= "ANIM_OT_insert_keyframe_menu";
/* callbacks */
@@ -1152,7 +1180,7 @@ void ANIM_OT_delete_keyframe (wmOperatorType *ot)
* -- Joshua Leung, Jan 2009
*/
-static int delete_key_old_exec (bContext *C, wmOperator *op)
+static int delete_key_v3d_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1190,15 +1218,15 @@ static int delete_key_old_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_delete_keyframe_old (wmOperatorType *ot)
+void ANIM_OT_delete_keyframe_v3d (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Keyframe";
- ot->idname= "ANIM_OT_delete_keyframe_old";
+ ot->idname= "ANIM_OT_delete_keyframe_v3d";
/* callbacks */
ot->invoke= WM_operator_confirm;
- ot->exec= delete_key_old_exec;
+ ot->exec= delete_key_v3d_exec;
ot->poll= ED_operator_areaactive;
@@ -1218,6 +1246,15 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success= 0;
int a, index, length, all= RNA_boolean_get(op->ptr, "all");
+ short flag = 0;
+
+ /* flags for inserting keyframes */
+ if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ flag |= INSERTKEY_MATRIX;
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ flag |= INSERTKEY_NEEDED;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+ flag |= INSERTKEY_REPLACE;
/* try to insert keyframe using property retrieved from UI */
memset(&ptr, 0, sizeof(PointerRNA));
@@ -1228,7 +1265,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
if (path) {
if (all) {
- length= RNA_property_array_length(prop);
+ length= RNA_property_array_length(&ptr, prop);
if(length) index= 0;
else length= 1;
@@ -1237,10 +1274,17 @@ 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, 0);
+ success+= insert_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, flag);
MEM_freeN(path);
}
+ else if (ptr.type == &RNA_NlaStrip) {
+ /* handle special vars for NLA-strips */
+ 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);
+ }
else {
if (G.f & G_DEBUG)
printf("Button Insert-Key: no path to property \n");
@@ -1269,7 +1313,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
void ANIM_OT_insert_keyframe_button (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Insert Keyframe";
+ ot->name= "Insert Keyframe (Buttons)";
ot->idname= "ANIM_OT_insert_keyframe_button";
/* callbacks */
@@ -1277,7 +1321,7 @@ void ANIM_OT_insert_keyframe_button (wmOperatorType *ot)
ot->poll= modify_key_op_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "all", 1, "All", "Insert a keyframe for all element of the array.");
@@ -1304,7 +1348,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
if (path) {
if (all) {
- length= RNA_property_array_length(prop);
+ length= RNA_property_array_length(&ptr, prop);
if(length) index= 0;
else length= 1;
@@ -1339,7 +1383,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
void ANIM_OT_delete_keyframe_button (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Delete Keyframe";
+ ot->name= "Delete Keyframe (Buttons)";
ot->idname= "ANIM_OT_delete_keyframe_button";
/* callbacks */
@@ -1347,17 +1391,65 @@ void ANIM_OT_delete_keyframe_button (wmOperatorType *ot)
ot->poll= modify_key_op_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "all", 1, "All", "Delete keyfames from all elements of the array.");
}
/* ******************************************* */
+/* AUTO KEYFRAME */
+
+int autokeyframe_cfra_can_key(Scene *scene, ID *id)
+{
+ float cfra= (float)CFRA; // XXX for now, this will do
+
+ /* only filter if auto-key mode requires this */
+ if (IS_AUTOKEY_ON(scene) == 0)
+ return 0;
+
+ if (IS_AUTOKEY_MODE(scene, NORMAL)) {
+ /* can insert anytime we like... */
+ return 1;
+ }
+ else /* REPLACE */ {
+ /* for whole block - only key if there's a keyframe on that frame already
+ * this is a valid assumption when we're blocking + tweaking
+ */
+ return id_frame_has_keyframe(id, cfra, ANIMFILTER_KEYS_LOCAL);
+ }
+}
+
+/* ******************************************* */
/* KEYFRAME DETECTION */
/* --------------- API/Per-Datablock Handling ------------------- */
+/* Checks if some F-Curve has a keyframe for a given frame */
+short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter)
+{
+ /* quick sanity check */
+ if (fcu == NULL)
+ return 0;
+
+ /* we either include all regardless of muting, or only non-muted */
+ if ((filter & ANIMFILTER_KEYS_MUTED) || (fcu->flag & FCURVE_MUTED)==0) {
+ short replace = -1;
+ int i = binarysearch_bezt_index(fcu->bezt, frame, fcu->totvert, &replace);
+
+ /* binarysearch_bezt_index will set replace to be 0 or 1
+ * - obviously, 1 represents a match
+ */
+ if (replace) {
+ /* sanity check: 'i' may in rare cases exceed arraylen */
+ if ((i >= 0) && (i < fcu->totvert))
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/* Checks whether an Action has a keyframe for a given frame
* Since we're only concerned whether a keyframe exists, we can simply loop until a match is found...
*/
@@ -1379,20 +1471,8 @@ short action_frame_has_keyframe (bAction *act, float frame, short filter)
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
/* only check if there are keyframes (currently only of type BezTriple) */
if (fcu->bezt && fcu->totvert) {
- /* we either include all regardless of muting, or only non-muted */
- if ((filter & ANIMFILTER_KEYS_MUTED) || (fcu->flag & FCURVE_MUTED)==0) {
- short replace = -1;
- int i = binarysearch_bezt_index(fcu->bezt, frame, fcu->totvert, &replace);
-
- /* binarysearch_bezt_index will set replace to be 0 or 1
- * - obviously, 1 represents a match
- */
- if (replace) {
- /* sanity check: 'i' may in rare cases exceed arraylen */
- if ((i >= 0) && (i < fcu->totvert))
- return 1;
- }
- }
+ if (fcurve_frame_has_keyframe(fcu, frame, filter))
+ return 1;
}
}
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index 1813c76d0c4..60efcce4e73 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -1,5 +1,30 @@
-/* Testing code for 2.5 animation system
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#include <stdio.h>
@@ -53,139 +78,174 @@
#include "anim_intern.h"
/* ************************************************** */
-/* KEYING SETS - EDITING API */
+/* KEYING SETS - OPERATORS (for use in UI menus) */
-/* Operators ------------------------------------------- */
+/* Add to KeyingSet Button Operator ------------------------ */
-/* These operators are only provided for scripting/macro usage, not for direct
- * calling from the UI since they wrap some of the data-access API code for these
- * (defined in blenkernel) which have quite a few properties.
- */
-
-/* ----- */
-
-static int keyingset_add_destination_exec (bContext *C, wmOperator *op)
+static int add_keyingset_button_exec (bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
+ KeyingSet *ks = NULL;
+ PropertyRNA *prop= NULL;
PointerRNA ptr;
- KeyingSet *ks= NULL;
- ID *id= NULL;
- char rna_path[256], group_name[64]; // xxx
- short groupmode=0, flag=0;
- int array_index=0;
-
- /* get settings from operator properties */
- ptr = RNA_pointer_get(op->ptr, "keyingset");
- if (ptr.data)
- ks= (KeyingSet *)ptr.data;
-
- ptr = RNA_pointer_get(op->ptr, "id");
- if (ptr.data)
- id= (ID *)ptr.data;
-
- groupmode= RNA_enum_get(op->ptr, "grouping_method");
- RNA_string_get(op->ptr, "group_name", group_name);
-
- RNA_string_get(op->ptr, "rna_path", rna_path);
- array_index= RNA_int_get(op->ptr, "array_index");
-
- if (RNA_boolean_get(op->ptr, "entire_array"))
- flag |= KSP_FLAG_WHOLE_ARRAY;
-
- /* if enough args are provided, call API method */
- if (ks) {
- BKE_keyingset_add_destination(ks, id, group_name, rna_path, array_index, flag, groupmode);
- return OPERATOR_FINISHED;
+ char *path = NULL;
+ short success= 0;
+ int index=0, pflag=0;
+ int all= RNA_boolean_get(op->ptr, "all");
+
+ /* verify the Keying Set to use:
+ * - use the active one for now (more control over this can be added later)
+ * - add a new one if it doesn't exist
+ */
+ if (scene->active_keyingset == 0) {
+ short flag=0, keyingflag=0;
+
+ /* validate flags
+ * - absolute KeyingSets should be created by default
+ */
+ flag |= KEYINGSET_ABSOLUTE;
+
+ if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ keyingflag |= INSERTKEY_MATRIX;
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ keyingflag |= INSERTKEY_NEEDED;
+
+ /* call the API func, and set the active keyingset index */
+ ks= BKE_keyingset_add(&scene->keyingsets, "ButtonKeyingSet", flag, keyingflag);
+
+ scene->active_keyingset= BLI_countlist(&scene->keyingsets);
}
- else {
- BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added.");
- return OPERATOR_CANCELLED;
- }
+ else
+ ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
+
+ /* try to add to keyingset using property retrieved from UI */
+ memset(&ptr, 0, sizeof(PointerRNA));
+ uiAnimContextProperty(C, &ptr, &prop, &index);
+
+ /* check if property is able to be added */
+ if (ptr.data && prop && RNA_property_animateable(ptr.data, prop)) {
+ path= RNA_path_from_ID_to_property(&ptr, prop);
+
+ if (path) {
+ /* set flags */
+ if (all)
+ pflag |= KSP_FLAG_WHOLE_ARRAY;
+
+ /* add path to this setting */
+ BKE_keyingset_add_destination(ks, ptr.id.data, NULL, path, index, pflag, KSP_GROUP_KSNAME);
+ success= 1;
+
+ /* free the temp path created */
+ MEM_freeN(path);
+ }
+ }
+
+ if (success) {
+ /* send updates */
+ ED_anim_dag_flush_update(C);
+
+ /* for now, only send ND_KEYS for KeyingSets */
+ WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
+ }
+
+ return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-void ANIM_OT_keyingset_add_destination (wmOperatorType *ot)
+void ANIM_OT_add_keyingset_button (wmOperatorType *ot)
{
- // XXX: this is also defined in rna_animation.c
- static EnumPropertyItem prop_mode_grouping_items[] = {
- {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""},
- {KSP_GROUP_NONE, "NONE", 0, "None", ""},
- {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""},
- {0, NULL, 0, NULL, NULL}};
-
/* identifiers */
- ot->name= "Add Keying Set Destination";
- ot->idname= "ANIM_OT_keyingset_add_destination";
+ ot->name= "Add to Keying Set";
+ ot->idname= "ANIM_OT_add_keyingset_button";
/* callbacks */
- ot->exec= keyingset_add_destination_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* props */
- /* pointers */ // xxx - do we want to directly expose these?
- RNA_def_pointer_runtime(ot->srna, "keyingset", &RNA_KeyingSet, "Keying Set", "Keying Set to add destination to.");
- RNA_def_pointer_runtime(ot->srna, "id", &RNA_ID, "ID", "ID-block for the destination.");
- /* grouping */
- RNA_def_enum(ot->srna, "grouping_method", prop_mode_grouping_items, KSP_GROUP_NAMED, "Grouping Method", "Method used to define which Group-name to use.");
- RNA_def_string(ot->srna, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
- /* rna-path */
- RNA_def_string(ot->srna, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
- RNA_def_int(ot->srna, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX);
- /* flags */
- RNA_def_boolean(ot->srna, "entire_array", 1, "Entire Array", "hen an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used.");
+ ot->exec= add_keyingset_button_exec;
+ //op->poll= ???
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "all", 1, "All", "Add all elements of the array to a Keying Set.");
}
-
-/* ----- */
-static int keyingset_add_new_exec (bContext *C, wmOperator *op)
+/* Remove from KeyingSet Button Operator ------------------------ */
+
+static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
{
- Scene *sce= CTX_data_scene(C);
- KeyingSet *ks= NULL;
- short flag=0, keyingflag=0;
- char name[64];
+ Scene *scene= CTX_data_scene(C);
+ KeyingSet *ks = NULL;
+ PropertyRNA *prop= NULL;
+ PointerRNA ptr;
+ char *path = NULL;
+ short success= 0;
+ int index=0;
- /* get settings from operator properties */
- RNA_string_get(op->ptr, "name", name);
+ /* verify the Keying Set to use:
+ * - use the active one for now (more control over this can be added later)
+ * - return error if it doesn't exist
+ */
+ if (scene->active_keyingset == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No active Keying Set to remove property from");
+ return OPERATOR_CANCELLED;
+ }
+ else
+ ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
- if (RNA_boolean_get(op->ptr, "absolute"))
- flag |= KEYINGSET_ABSOLUTE;
- if (RNA_boolean_get(op->ptr, "insertkey_needed"))
- keyingflag |= INSERTKEY_NEEDED;
- if (RNA_boolean_get(op->ptr, "insertkey_visual"))
- keyingflag |= INSERTKEY_MATRIX;
+ /* try to add to keyingset using property retrieved from UI */
+ memset(&ptr, 0, sizeof(PointerRNA));
+ uiAnimContextProperty(C, &ptr, &prop, &index);
+
+ if (ptr.data && prop) {
+ path= RNA_path_from_ID_to_property(&ptr, prop);
- /* call the API func, and set the active keyingset index */
- ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag);
-
- if (ks) {
- sce->active_keyingset= BLI_countlist(&sce->keyingsets);
- return OPERATOR_FINISHED;
+ if (path) {
+ KS_Path *ksp;
+
+ /* try to find a path matching this description */
+ ksp= BKE_keyingset_find_destination(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);
+
+ success= 1;
+ }
+
+ /* free temp path used */
+ MEM_freeN(path);
+ }
}
- else {
- BKE_report(op->reports, RPT_ERROR, "Keying Set could not be added.");
- return OPERATOR_CANCELLED;
+
+
+ if (success) {
+ /* send updates */
+ ED_anim_dag_flush_update(C);
+
+ /* for now, only send ND_KEYS for KeyingSets */
+ WM_event_add_notifier(C, NC_SCENE|ND_KEYINGSET, NULL);
}
+
+ return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-void ANIM_OT_keyingset_add_new (wmOperatorType *ot)
+void ANIM_OT_remove_keyingset_button (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Add Keying Set";
- ot->idname= "ANIM_OT_keyingset_add_new";
+ ot->name= "Remove from Keying Set";
+ ot->idname= "ANIM_OT_remove_keyingset_button";
/* callbacks */
- ot->exec= keyingset_add_new_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* props */
- /* name */
- RNA_def_string(ot->srna, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
- /* flags */
- RNA_def_boolean(ot->srna, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
- /* keying flags */
- RNA_def_boolean(ot->srna, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
- RNA_def_boolean(ot->srna, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
+ ot->exec= remove_keyingset_button_exec;
+ //op->poll= ???
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ************************************************** */
+/* KEYING SETS - EDITING API */
+
/* UI API --------------------------------------------- */
/* Build menu-string of available keying-sets (allocates memory for string)
@@ -208,7 +268,7 @@ char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit)
BLI_dynstr_append(pupds, " %x0|");
}
else
- BLI_dynstr_append(pupds, "<No Keying Set Active>%x0|");
+ BLI_dynstr_append(pupds, "No Keying Set%x0|");
/* loop through keyingsets, adding them */
for (ks=list->first, i=1; ks; ks=ks->next, i++) {
@@ -710,7 +770,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] =
/* Keying Set - "Rotation" ---------- */
BI_KS_DEFINE_BEGIN("Rotation", 0)
BI_KS_PATHS_BEGIN(1)
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END,
@@ -726,7 +786,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] =
BI_KS_DEFINE_BEGIN("LocRot", 0)
BI_KS_PATHS_BEGIN(2)
BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END,
@@ -734,31 +794,31 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] =
BI_KS_DEFINE_BEGIN("LocRotScale", 0)
BI_KS_PATHS_BEGIN(3)
BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "scale", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END,
/* Keying Sets with Keying Flags ************************* */
/* Keying Set - "VisualLoc" ---------- */
- BI_KS_DEFINE_BEGIN("VisualLoc", 0)
+ BI_KS_DEFINE_BEGIN("VisualLoc", INSERTKEY_MATRIX)
BI_KS_PATHS_BEGIN(1)
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END,
/* Keying Set - "Rotation" ---------- */
- BI_KS_DEFINE_BEGIN("VisualRot", 0)
+ BI_KS_DEFINE_BEGIN("VisualRot", INSERTKEY_MATRIX)
BI_KS_PATHS_BEGIN(1)
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END,
/* Keying Set - "VisualLocRot" ---------- */
- BI_KS_DEFINE_BEGIN("VisualLocRot", 0)
+ BI_KS_DEFINE_BEGIN("VisualLocRot", INSERTKEY_MATRIX)
BI_KS_PATHS_BEGIN(2)
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
- BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM),
+ BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM)
BI_KS_PATHS_END
BI_KS_DEFINE_END
};
@@ -874,7 +934,7 @@ short keyingset_context_ok_poll (bContext *C, KeyingSet *ks)
Object *obact= CTX_data_active_object(C);
/* if in posemode, check if 'pose-channels' requested for in KeyingSet */
- if ((obact && obact->pose) && (obact->flag & OB_POSEMODE)) {
+ if ((obact && obact->pose) && (obact->mode & OB_MODE_POSE)) {
/* check for posechannels */
}
@@ -905,7 +965,7 @@ static short modifykey_get_context_v3d_data (bContext *C, ListBase *dsources, Ke
/* check if the active object is in PoseMode (i.e. only deal with bones) */
// TODO: check with the templates to see what we really need to store
- if ((obact && obact->pose) && (obact->flag & OB_POSEMODE)) {
+ if ((obact && obact->pose) && (obact->mode & OB_MODE_POSE)) {
/* Pose Mode: Selected bones */
#if 0
//set_pose_keys(ob); /* sets pchan->flag to POSE_KEY if bone selected, and clears if not */
@@ -985,6 +1045,7 @@ short modifykey_get_context_data (bContext *C, ListBase *dsources, KeyingSet *ks
*/
int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra)
{
+ Scene *scene= CTX_data_scene(C);
KS_Path *ksp;
int kflag=0, success= 0;
char *groupname= NULL;
@@ -997,7 +1058,7 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
/* suppliment with info from the context */
if (IS_AUTOKEY_FLAG(AUTOMATKEY)) kflag |= INSERTKEY_MATRIX;
if (IS_AUTOKEY_FLAG(INSERTNEEDED)) kflag |= INSERTKEY_NEEDED;
- // if (IS_AUTOKEY_MODE(EDITKEYS)) flag |= INSERTKEY_REPLACE;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS)) kflag |= INSERTKEY_REPLACE;
}
else if (mode == MODIFYKEY_MODE_DELETE)
kflag= 0;
@@ -1022,7 +1083,7 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
* normal non-array entries get keyframed correctly
*/
i= ksp->array_index;
- arraylen= i+1;
+ arraylen= i;
/* get length of array if whole array option is enabled */
if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) {
@@ -1031,9 +1092,13 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
RNA_id_pointer_create(ksp->id, &id_ptr);
if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop) && prop)
- arraylen= RNA_property_array_length(prop);
+ arraylen= RNA_property_array_length(&ptr, prop);
}
+ /* we should do at least one step */
+ if (arraylen == i)
+ arraylen++;
+
/* for each possible index, perform operation
* - assume that arraylen is greater than index
*/
@@ -1060,6 +1125,9 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
case ID_MA: /* Material Keyframes */
WM_event_add_notifier(C, NC_MATERIAL|ND_KEYS, ksp->id);
break;
+ default: /* Any keyframes */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+ break;
}
}
}
@@ -1103,7 +1171,21 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
/* add property stored in KeyingSet Path */
if (BLI_dynstr_get_len(pathds))
BLI_dynstr_append(pathds, ".");
- BLI_dynstr_append(pathds, ksp->rna_path);
+
+ /* apply some further templates? */
+ if ((ksp->templates & KSP_TEMPLATE_PCHAN_ROT) && (cks->pchan)) {
+ /* if this path is exactly "rotation", and the rotation mode is set to eulers,
+ * use "euler_rotation" instead so that rotations will be keyed correctly
+ */
+ if (strcmp(ksp->rna_path, "rotation")==0 && (cks->pchan->rotmode > 0))
+ BLI_dynstr_append(pathds, "euler_rotation");
+ else
+ BLI_dynstr_append(pathds, ksp->rna_path);
+ }
+ else {
+ /* just directly use the path */
+ BLI_dynstr_append(pathds, ksp->rna_path);
+ }
/* convert to C-string */
path= BLI_dynstr_get_cstring(pathds);
@@ -1133,7 +1215,7 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
RNA_id_pointer_create(cks->id, &id_ptr);
if (RNA_path_resolve(&id_ptr, path, &ptr, &prop) && prop)
- arraylen= RNA_property_array_length(prop);
+ arraylen= RNA_property_array_length(&ptr, prop);
}
/* for each possible index, perform operation
@@ -1166,6 +1248,9 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet *
case ID_MA: /* Material Keyframes */
WM_event_add_notifier(C, NC_MATERIAL|ND_KEYS, cks->id);
break;
+ default: /* Any keyframes */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+ break;
}
}
}
diff --git a/source/blender/editors/armature/BIF_retarget.h b/source/blender/editors/armature/BIF_retarget.h
index c39f410424a..d950f073cf0 100644
--- a/source/blender/editors/armature/BIF_retarget.h
+++ b/source/blender/editors/armature/BIF_retarget.h
@@ -152,7 +152,7 @@ typedef struct RigControl {
} RigControl;
void BIF_retargetArc(struct bContext *C, ReebArc *earc, RigGraph *template_rigg);
-RigGraph *RIG_graphFromArmature(struct bContext *C, struct Object *ob, struct bArmature *arm);
+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);
void RIG_freeRigGraph(BGraph *rg);
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 646c75f50bf..6f5a5f44d87 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -33,33 +33,80 @@ struct wmOperatorType;
/* editarmature.c operators */
void ARMATURE_OT_bone_primitive_add(struct wmOperatorType *ot);
-void ARMATURE_OT_bones_align(struct wmOperatorType *ot);
+
+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_parent_set(struct wmOperatorType *ot);
void ARMATURE_OT_parent_clear(struct wmOperatorType *ot);
+
void ARMATURE_OT_select_all_toggle(struct wmOperatorType *ot);
-void ARMATURE_OT_select_invert(struct wmOperatorType *ot);
+void ARMATURE_OT_select_inverse(struct wmOperatorType *ot);
void ARMATURE_OT_select_hierarchy(struct wmOperatorType *ot);
void ARMATURE_OT_select_linked(struct wmOperatorType *ot);
+
void ARMATURE_OT_delete(struct wmOperatorType *ot);
-void ARMATURE_OT_duplicate_selected(struct wmOperatorType *ot);
+void ARMATURE_OT_duplicate(struct wmOperatorType *ot);
void ARMATURE_OT_extrude(struct wmOperatorType *ot);
void ARMATURE_OT_click_extrude(struct wmOperatorType *ot);
+void ARMATURE_OT_fill(struct wmOperatorType *ot);
+void ARMATURE_OT_merge(struct wmOperatorType *ot);
+void ARMATURE_OT_separate(struct wmOperatorType *ot);
+
+void ARMATURE_OT_autoside_names(struct wmOperatorType *ot);
+void ARMATURE_OT_flip_names(struct wmOperatorType *ot);
+void ARMATURE_OT_flags_set(struct wmOperatorType *ot);
+
+void ARMATURE_OT_armature_layers(struct wmOperatorType *ot);
+void ARMATURE_OT_bone_layers(struct wmOperatorType *ot);
+
+/* ******************************************************* */
+/* Pose-Mode Operators */
void POSE_OT_hide(struct wmOperatorType *ot);
void POSE_OT_reveal(struct wmOperatorType *ot);
+
+void POSE_OT_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_copy(struct wmOperatorType *ot);
+void POSE_OT_paste(struct wmOperatorType *ot);
+
void POSE_OT_select_all_toggle(struct wmOperatorType *ot);
-void POSE_OT_select_invert(struct wmOperatorType *ot);
+void POSE_OT_select_inverse(struct wmOperatorType *ot);
void POSE_OT_select_parent(struct wmOperatorType *ot);
void POSE_OT_select_hierarchy(struct wmOperatorType *ot);
void POSE_OT_select_linked(struct wmOperatorType *ot);
+void POSE_OT_select_constraint_target(struct wmOperatorType *ot);
+
+void POSE_OT_groups_menu(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_paths_calculate(struct wmOperatorType *ot);
+void POSE_OT_paths_clear(struct wmOperatorType *ot);
+
+void POSE_OT_autoside_names(struct wmOperatorType *ot);
+void POSE_OT_flip_names(struct wmOperatorType *ot);
+
+void POSE_OT_flags_set(struct wmOperatorType *ot);
+
+void POSE_OT_armature_layers(struct wmOperatorType *ot);
+void POSE_OT_bone_layers(struct wmOperatorType *ot);
+
+/* ******************************************************* */
+/* Etch-A-Ton */
void SKETCH_OT_gesture(struct wmOperatorType *ot);
void SKETCH_OT_delete(struct wmOperatorType *ot);
@@ -69,12 +116,22 @@ void SKETCH_OT_finish_stroke(struct wmOperatorType *ot);
void SKETCH_OT_cancel_stroke(struct wmOperatorType *ot);
void SKETCH_OT_select(struct wmOperatorType *ot);
+/* ******************************************************* */
/* PoseLib */
+
void POSELIB_OT_pose_add(struct wmOperatorType *ot);
void POSELIB_OT_pose_remove(struct wmOperatorType *ot);
void POSELIB_OT_pose_rename(struct wmOperatorType *ot);
void POSELIB_OT_browse_interactive(struct wmOperatorType *ot);
+/* ******************************************************* */
+/* Pose Sliding Tools */
+
+void POSE_OT_push(struct wmOperatorType *ot);
+void POSE_OT_relax(struct wmOperatorType *ot);
+void POSE_OT_breakdown(struct wmOperatorType *ot);
+
+/* ******************************************************* */
/* editarmature.c */
struct bArmature;
struct EditBone;
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 5c31883834c..fae0b093551 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -55,6 +55,7 @@
#include "ED_armature.h"
#include "ED_screen.h"
#include "ED_object.h"
+#include "ED_transform.h"
#include "armature_intern.h"
@@ -110,7 +111,7 @@ void ED_operatortypes_armature(void)
/* EDIT ARMATURE */
WM_operatortype_append(ARMATURE_OT_bone_primitive_add);
- WM_operatortype_append(ARMATURE_OT_bones_align);
+ 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);
@@ -121,14 +122,25 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_parent_clear);
WM_operatortype_append(ARMATURE_OT_select_all_toggle);
- WM_operatortype_append(ARMATURE_OT_select_invert);
+ WM_operatortype_append(ARMATURE_OT_select_inverse);
WM_operatortype_append(ARMATURE_OT_select_hierarchy);
WM_operatortype_append(ARMATURE_OT_select_linked);
WM_operatortype_append(ARMATURE_OT_delete);
- WM_operatortype_append(ARMATURE_OT_duplicate_selected);
+ WM_operatortype_append(ARMATURE_OT_duplicate);
WM_operatortype_append(ARMATURE_OT_extrude);
WM_operatortype_append(ARMATURE_OT_click_extrude);
+ WM_operatortype_append(ARMATURE_OT_fill);
+ WM_operatortype_append(ARMATURE_OT_merge);
+ WM_operatortype_append(ARMATURE_OT_separate);
+
+ WM_operatortype_append(ARMATURE_OT_autoside_names);
+ WM_operatortype_append(ARMATURE_OT_flip_names);
+
+ WM_operatortype_append(ARMATURE_OT_flags_set);
+
+ WM_operatortype_append(ARMATURE_OT_armature_layers);
+ WM_operatortype_append(ARMATURE_OT_bone_layers);
/* SKETCH */
WM_operatortype_append(SKETCH_OT_gesture);
@@ -143,16 +155,39 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_hide);
WM_operatortype_append(POSE_OT_reveal);
+ WM_operatortype_append(POSE_OT_apply);
+
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_copy);
+ WM_operatortype_append(POSE_OT_paste);
+
WM_operatortype_append(POSE_OT_select_all_toggle);
- WM_operatortype_append(POSE_OT_select_invert);
+ WM_operatortype_append(POSE_OT_select_inverse);
WM_operatortype_append(POSE_OT_select_parent);
WM_operatortype_append(POSE_OT_select_hierarchy);
WM_operatortype_append(POSE_OT_select_linked);
+ WM_operatortype_append(POSE_OT_select_constraint_target);
+
+ WM_operatortype_append(POSE_OT_groups_menu);
+ WM_operatortype_append(POSE_OT_group_add);
+ WM_operatortype_append(POSE_OT_group_remove);
+ WM_operatortype_append(POSE_OT_group_assign);
+ WM_operatortype_append(POSE_OT_group_unassign);
+
+ WM_operatortype_append(POSE_OT_paths_calculate);
+ WM_operatortype_append(POSE_OT_paths_clear);
+
+ WM_operatortype_append(POSE_OT_autoside_names);
+ WM_operatortype_append(POSE_OT_flip_names);
+
+ WM_operatortype_append(POSE_OT_flags_set);
+
+ WM_operatortype_append(POSE_OT_armature_layers);
+ WM_operatortype_append(POSE_OT_bone_layers);
/* POSELIB */
WM_operatortype_append(POSELIB_OT_browse_interactive);
@@ -161,21 +196,27 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSELIB_OT_pose_remove);
WM_operatortype_append(POSELIB_OT_pose_rename);
+ /* POSE SLIDING */
+ WM_operatortype_append(POSE_OT_push);
+ WM_operatortype_append(POSE_OT_relax);
+ WM_operatortype_append(POSE_OT_breakdown);
+
/* TESTS */
WM_operatortype_append(ARMATURE_OT_test); // XXX temp test for context iterators... to be removed
}
void ED_keymap_armature(wmWindowManager *wm)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
wmKeymapItem *kmi;
/* Armature ------------------------ */
- keymap= WM_keymap_listbase(wm, "Armature", 0, 0);
+ keymap= WM_keymap_find(wm, "Armature", 0, 0);
+ keymap->poll= ED_operator_editarmature;
/* only set in editmode armature, by space_view3d listener */
// WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_bones_align", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_align", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0);
@@ -188,31 +229,54 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_test", TKEY, KM_PRESS, 0, 0); // XXX temp test for context iterators... to be removed
kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", 0);
kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
RNA_boolean_set(kmi->ptr, "extend", 1);
kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", 0);
kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
RNA_boolean_set(kmi->ptr, "extend", 1);
WM_keymap_add_item(keymap, "ARMATURE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "ARMATURE_OT_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate_selected", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_extrude", EKEY, KM_PRESS, 0, 0);
kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_extrude", EKEY, KM_PRESS, KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "forked", 1);
WM_keymap_add_item(keymap, "ARMATURE_OT_click_extrude", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_fill", FKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_merge", MKEY, KM_PRESS, KM_ALT, 0);
+
+ WM_keymap_add_item(keymap, "ARMATURE_OT_separate", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+
+ /* set flags */
+ kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 2); // toggle
+ kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 1); // enable
+ kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 0); // clear
+
+ /* armature/bone layers */
+ 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);
+
+ /* special transforms: */
+ /* 1) envelope/b-bone size */
+ kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE);
+ /* 2) set roll */
+ kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", RKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "mode", TFM_BONE_ROLL);
/* Armature -> Etch-A-Ton ------------------------ */
WM_keymap_add_item(keymap, "SKETCH_OT_delete", XKEY, KM_PRESS, 0, 0);
@@ -220,43 +284,86 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "SKETCH_OT_cancel_stroke", ESCKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SKETCH_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
+ /* sketch poll checks mode */
+ WM_keymap_add_item(keymap, "SKETCH_OT_gesture", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, 0, 0);
+ kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
+ RNA_boolean_set(kmi->ptr, "snap", 1);
+ WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, 0, 0);
+ kmi = WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, KM_CTRL, 0);
+ RNA_boolean_set(kmi->ptr, "snap", 1);
+
/* Pose ------------------------ */
/* only set in posemode, by space_view3d listener */
- keymap= WM_keymap_listbase(wm, "Pose", 0, 0);
+ keymap= WM_keymap_find(wm, "Pose", 0, 0);
+ keymap->poll= ED_operator_posemode;
+
+ // XXX: set parent is object-based operator, but it should also be available here...
+ WM_keymap_add_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 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);
- RNA_boolean_set(kmi->ptr, "unselected", 1);
+ RNA_boolean_set(kmi->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- /*clear pose*/
+
+ WM_keymap_add_item(keymap, "POSE_OT_apply", AKEY, KM_PRESS, KM_CTRL, 0);
+
+ // TODO: clear pose
WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "flipped", 1);
+
WM_keymap_add_item(keymap, "POSE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "POSE_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0);
kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
- RNA_boolean_set(kmi->ptr, "extend", 0);
kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT);
RNA_boolean_set(kmi->ptr, "extend", 1);
kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
- RNA_boolean_set(kmi->ptr, "extend", 0);
kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD);
RNA_boolean_set(kmi->ptr, "extend", 1);
WM_keymap_add_item(keymap, "POSE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_ik_add", IKEY, KM_PRESS, /*KM_CTRL|*/KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_ik_clear", IKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+
+ WM_keymap_add_item(keymap, "POSE_OT_groups_menu", GKEY, KM_PRESS, KM_CTRL, 0);
+
+ /* set flags */
+ kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 2); // toggle
+ kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 1); // enable
+ kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "mode", 0); // clear
+
+ /* armature/bone layers */
+ 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);
+
+ /* special transforms: */
+ /* 1) envelope/b-bone size */
+ kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE);
+
// XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith
WM_keymap_verify_item(keymap, "ANIM_OT_insert_keyframe_menu", IKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_old", IKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_v3d", IKEY, KM_PRESS, KM_ALT, 0);
/* Pose -> PoseLib ------------- */
/* only set in posemode, by space_view3d listener */
@@ -265,5 +372,11 @@ void ED_keymap_armature(wmWindowManager *wm)
WM_keymap_add_item(keymap, "POSELIB_OT_pose_add", LKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSELIB_OT_pose_remove", LKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "POSELIB_OT_pose_rename", LKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+
+ /* Pose -> Pose Sliding ------------- */
+ /* only set in posemode, by space_view3d listener */
+ WM_keymap_add_item(keymap, "POSE_OT_push", EKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_relax", EKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_breakdown", EKEY, KM_PRESS, KM_SHIFT, 0);
}
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 7155bdd6850..bc210fbcb54 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -72,7 +72,6 @@
#include "PIL_time.h"
#include "BIF_gl.h"
-#include "BIF_transform.h"
#include "BIF_generate.h"
#include "RNA_access.h"
@@ -85,6 +84,7 @@
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_util.h"
#include "ED_view3d.h"
@@ -99,18 +99,13 @@
/* ************* XXX *************** */
static int okee() {return 0;}
-static int pupmenu() {return 0;}
-static void waitcursor() {};
-static void error() {};
-static void error_libdata() {}
-static void BIF_undo_push() {}
-static void adduplicate() {}
+static void BIF_undo_push(const char *msg) {}
/* ************* XXX *************** */
/* **************** tools on Editmode Armature **************** */
/* Sync selection to parent for connected children */
-static void armature_sync_selection(ListBase *edbo)
+void ED_armature_sync_selection(ListBase *edbo)
{
EditBone *ebo;
@@ -244,7 +239,7 @@ static void fix_bonelist_roll (ListBase *bonelist, ListBase *editbonelist)
}
/* put EditMode back in Object */
-void ED_armature_from_edit(Scene *scene, Object *obedit)
+void ED_armature_from_edit(Object *obedit)
{
bArmature *arm= obedit->data;
EditBone *eBone, *neBone;
@@ -345,24 +340,22 @@ void ED_armature_from_edit(Scene *scene, Object *obedit)
armature_rebuild_pose(obt, arm);
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
}
-
-
-void apply_rot_armature (Scene *scene, Object *ob, float mat[3][3])
+void ED_armature_apply_transform(Object *ob, float mat[4][4])
{
EditBone *ebone;
bArmature *arm= ob->data;
- float scale = Mat3ToScalef(mat); /* store the scale of the matrix here to use on envelopes */
+ float scale = Mat4ToScalef(mat); /* store the scale of the matrix here to use on envelopes */
/* Put the armature into editmode */
ED_armature_to_edit(ob);
/* Do the rotations */
for (ebone = arm->edbo->first; ebone; ebone=ebone->next){
- Mat3MulVecfl(mat, ebone->head);
- Mat3MulVecfl(mat, ebone->tail);
+ Mat4MulVecfl(mat, ebone->head);
+ Mat4MulVecfl(mat, ebone->tail);
ebone->rad_head *= scale;
ebone->rad_tail *= scale;
@@ -370,10 +363,11 @@ void apply_rot_armature (Scene *scene, Object *ob, float mat[3][3])
}
/* Turn the list into an armature */
- ED_armature_from_edit(scene, ob);
+ ED_armature_from_edit(ob);
ED_armature_edit_free(ob);
}
+/* exported for use in editors/object/ */
/* 0 == do center, 1 == center new, 2 == center cursor */
void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode)
{
@@ -415,7 +409,7 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode)
}
/* Turn the list into an armature */
- ED_armature_from_edit(scene, ob);
+ ED_armature_from_edit(ob);
/* Adjust object location for new centerpoint */
if(centermode && obedit==NULL) {
@@ -430,25 +424,7 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode)
ED_armature_edit_free(ob);
}
-/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */
-static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
-{
- Object workob, *ob;
-
- /* go through all objects in database */
- for (ob= G.main->object.first; ob; ob= ob->id.next) {
- /* if parent is bone in this armature, apply corrections */
- if ((ob->parent == armob) && (ob->partype == PARBONE)) {
- /* apply current transform from parent (not yet destroyed),
- * then calculate new parent inverse matrix
- */
- ED_object_apply_obmat(ob);
-
- what_does_parent(scene, ob, &workob);
- Mat4Invert(ob->parentinv, workob.obmat);
- }
- }
-}
+/* ---------------------- */
static EditBone *editbone_name_exists (ListBase *edbo, char *name)
{
@@ -490,28 +466,52 @@ void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone)
}
}
+/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */
+static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
+{
+ Object workob, *ob;
+
+ /* go through all objects in database */
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ /* if parent is bone in this armature, apply corrections */
+ if ((ob->parent == armob) && (ob->partype == PARBONE)) {
+ /* apply current transform from parent (not yet destroyed),
+ * then calculate new parent inverse matrix
+ */
+ ED_object_apply_obmat(ob);
+
+ what_does_parent(scene, ob, &workob);
+ Mat4Invert(ob->parentinv, workob.obmat);
+ }
+ }
+}
+
/* set the current pose as the restpose */
-void apply_armature_pose2bones(Scene *scene, Object *obedit)
+static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
{
- bArmature *arm= obedit->data;
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+ bArmature *arm= get_armature(ob);
bPose *pose;
bPoseChannel *pchan;
EditBone *curbone;
/* don't check if editmode (should be done by caller) */
- if (object_data_is_libdata(obedit)) {
- error_libdata();
- return;
+ if (ob->type!=OB_ARMATURE)
+ return OPERATOR_CANCELLED;
+ if (object_data_is_libdata(ob)) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot apply pose to lib-linked armature."); //error_libdata();
+ return OPERATOR_CANCELLED;
}
/* helpful warnings... */
// TODO: add warnings to be careful about actions, applying deforms first, etc.
/* Get editbones of active armature to alter */
- ED_armature_to_edit(obedit);
+ ED_armature_to_edit(ob);
/* get pose of active object and move it out of posemode */
- pose= obedit->pose;
+ pose= ob->pose;
for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
curbone= editbone_name_exists(arm->edbo, pchan->name);
@@ -530,7 +530,7 @@ void apply_armature_pose2bones(Scene *scene, Object *obedit)
/* obtain new auto y-rotation */
VecSubf(delta, curbone->tail, curbone->head);
- vec_roll_to_mat3(delta, 0.0, premat);
+ vec_roll_to_mat3(delta, 0.0f, premat);
Mat3Inv(imat, premat);
/* get pchan 'visual' matrix */
@@ -545,26 +545,46 @@ void apply_armature_pose2bones(Scene *scene, Object *obedit)
}
/* clear transform values for pchan */
- pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0;
- pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0;
- pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1;
+ 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;
/* set anim lock */
curbone->flag |= BONE_UNKEYED;
}
/* convert editbones back to bones */
- ED_armature_from_edit(scene, obedit);
+ ED_armature_from_edit(ob);
/* flush positions of posebones */
- where_is_pose(scene, obedit);
+ where_is_pose(scene, ob);
/* fix parenting of objects which are bone-parented */
- applyarmature_fix_boneparents(scene, obedit);
+ applyarmature_fix_boneparents(scene, ob);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_apply (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Pose as Rest Pose";
+ ot->idname= "POSE_OT_apply";
+ ot->description= "Apply the current pose as the new rest pose.";
- BIF_undo_push("Apply new restpose");
+ /* callbacks */
+ ot->exec= apply_armature_pose2bones_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ---------------------- */
/* Helper function for armature joining - link fixing */
static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChannel *pchan, EditBone *curbone)
@@ -669,116 +689,116 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
}
}
-int join_armature(Scene *scene, View3D *v3d)
+/* join armature exec is exported for use in object->join objects operator... */
+int join_armature_exec(bContext *C, wmOperator *op)
{
- Object *ob= scene->basact->object; // XXX context
- bArmature *arm= ob->data;
- Base *base, *nextbase;
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm= (ob)? ob->data: NULL;
bPose *pose, *opose;
bPoseChannel *pchan, *pchann;
EditBone *curbone;
float mat[4][4], oimat[4][4];
/* Ensure we're not in editmode and that the active object is an armature*/
- if (ob->type!=OB_ARMATURE) return 0;
- if (arm->edbo) return 0;
-
- if (object_data_is_libdata(ob)) {
- error_libdata();
- return 0;
- }
+ if (!ob || ob->type!=OB_ARMATURE)
+ return OPERATOR_CANCELLED;
+ if (!arm || arm->edbo)
+ return OPERATOR_CANCELLED;
/* Get editbones of active armature to add editbones to */
ED_armature_to_edit(ob);
/* get pose of active object and move it out of posemode */
pose= ob->pose;
- ob->flag &= ~OB_POSEMODE;
-
- for (base=FIRSTBASE; base; base=nextbase) {
- nextbase = base->next;
- if (TESTBASE(v3d, base)){
- if ((base->object->type==OB_ARMATURE) && (base->object!=ob)) {
- bArmature *curarm= base->object->data;
-
- /* Make a list of editbones in current armature */
- ED_armature_to_edit(base->object);
-
- /* Get Pose of current armature */
- opose= base->object->pose;
- base->object->flag &= ~OB_POSEMODE;
- BASACT->flag &= ~OB_POSEMODE;
+ ob->mode &= ~OB_MODE_POSE;
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if ((base->object->type==OB_ARMATURE) && (base->object!=ob)) {
+ bArmature *curarm= base->object->data;
+
+ /* Make a list of editbones in current armature */
+ ED_armature_to_edit(base->object);
+
+ /* Get Pose of current armature */
+ opose= base->object->pose;
+ base->object->mode &= ~OB_MODE_POSE;
+ //BASACT->flag &= ~OB_MODE_POSE;
+
+ /* Find the difference matrix */
+ Mat4Invert(oimat, ob->obmat);
+ Mat4MulMat4(mat, base->object->obmat, oimat);
+
+ /* Copy bones and posechannels from the object to the edit armature */
+ for (pchan=opose->chanbase.first; pchan; pchan=pchann) {
+ pchann= pchan->next;
+ curbone= editbone_name_exists(curarm->edbo, pchan->name);
- /* Find the difference matrix */
- Mat4Invert(oimat, ob->obmat);
- Mat4MulMat4(mat, base->object->obmat, oimat);
+ /* Get new name */
+ unique_editbone_name(arm->edbo, curbone->name, NULL);
- /* Copy bones and posechannels from the object to the edit armature */
- for (pchan=opose->chanbase.first; pchan; pchan=pchann) {
- pchann= pchan->next;
- curbone= editbone_name_exists(curarm->edbo, pchan->name);
+ /* Transform the bone */
+ {
+ float premat[4][4];
+ float postmat[4][4];
+ float difmat[4][4];
+ float imat[4][4];
+ float temp[3][3];
+ float delta[3];
- /* Get new name */
- unique_editbone_name(arm->edbo, curbone->name, NULL);
+ /* Get the premat */
+ VecSubf(delta, curbone->tail, curbone->head);
+ vec_roll_to_mat3(delta, curbone->roll, temp);
- /* Transform the bone */
- {
- float premat[4][4];
- float postmat[4][4];
- float difmat[4][4];
- float imat[4][4];
- float temp[3][3];
- float delta[3];
-
- /* Get the premat */
- VecSubf(delta, curbone->tail, curbone->head);
- vec_roll_to_mat3(delta, curbone->roll, temp);
-
- Mat4One(premat); /* Mat4MulMat34 only sets 3x3 part */
- Mat4MulMat34(premat, temp, mat);
-
- Mat4MulVecfl(mat, curbone->head);
- Mat4MulVecfl(mat, curbone->tail);
-
- /* Get the postmat */
- VecSubf(delta, curbone->tail, curbone->head);
- vec_roll_to_mat3(delta, curbone->roll, temp);
- Mat4CpyMat3(postmat, temp);
-
- /* Find the roll */
- Mat4Invert(imat, premat);
- Mat4MulMat4(difmat, postmat, imat);
-
- curbone->roll -= (float)atan2(difmat[2][0], difmat[2][2]);
- }
+ Mat4One(premat); /* Mat4MulMat34 only sets 3x3 part */
+ Mat4MulMat34(premat, temp, mat);
- /* Fix Constraints and Other Links to this Bone and Armature */
- joined_armature_fix_links(ob, base->object, pchan, curbone);
+ Mat4MulVecfl(mat, curbone->head);
+ Mat4MulVecfl(mat, curbone->tail);
- /* Rename pchan */
- BLI_strncpy(pchan->name, curbone->name, sizeof(pchan->name));
+ /* Get the postmat */
+ VecSubf(delta, curbone->tail, curbone->head);
+ vec_roll_to_mat3(delta, curbone->roll, temp);
+ Mat4CpyMat3(postmat, temp);
- /* Jump Ship! */
- BLI_remlink(curarm->edbo, curbone);
- BLI_addtail(arm->edbo, curbone);
+ /* Find the roll */
+ Mat4Invert(imat, premat);
+ Mat4MulMat4(difmat, postmat, imat);
- BLI_remlink(&opose->chanbase, pchan);
- BLI_addtail(&pose->chanbase, pchan);
+ curbone->roll -= (float)atan2(difmat[2][0], difmat[2][2]);
}
- ED_base_object_free_and_unlink(scene, base);
+ /* Fix Constraints and Other Links to this Bone and Armature */
+ joined_armature_fix_links(ob, base->object, pchan, curbone);
+
+ /* Rename pchan */
+ BLI_strncpy(pchan->name, curbone->name, sizeof(pchan->name));
+
+ /* Jump Ship! */
+ BLI_remlink(curarm->edbo, curbone);
+ BLI_addtail(arm->edbo, curbone);
+
+ BLI_remlink(&opose->chanbase, pchan);
+ BLI_addtail(&pose->chanbase, pchan);
}
+
+ ED_base_object_free_and_unlink(scene, base);
}
}
+ CTX_DATA_END;
DAG_scene_sort(scene); // because we removed object(s)
- ED_armature_from_edit(scene, ob);
+ ED_armature_from_edit(ob);
ED_armature_edit_free(ob);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
- return 1;
+ return OPERATOR_FINISHED;
}
+/* ---------------------- */
+
/* Helper function for armature separating - link fixing */
static void separated_armature_fix_links(Object *origArm, Object *newArm)
{
@@ -972,24 +992,27 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel)
}
/* exit editmode (recalculates pchans too) */
- ED_armature_from_edit(scene, ob);
+ ED_armature_from_edit(ob);
ED_armature_edit_free(ob);
}
/* separate selected bones into their armature */
-void separate_armature (Scene *scene, View3D *v3d)
+static int separate_armature_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX get from context
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
Object *oldob, *newob;
- Base *base, *oldbase, *newbase;
+ Base *oldbase, *newbase;
bArmature *arm;
- if ( okee("Separate")==0 ) return;
-
- waitcursor(1);
-
+ /* sanity checks */
+ if (obedit == NULL)
+ return OPERATOR_CANCELLED;
arm= obedit->data;
+ /* set wait cursor in case this takes a while */
+ WM_cursor_wait(1);
+
/* we are going to do this as follows (unlike every other instance of separate):
* 1. exit editmode +posemode for active armature/base. Take note of what this is.
* 2. duplicate base - BASACT is the new one now
@@ -999,27 +1022,24 @@ void separate_armature (Scene *scene, View3D *v3d)
*/
/* 1) only edit-base selected */
- base= FIRSTBASE;
- for (base= FIRSTBASE; base; base= base->next) {
- if (base->lay & v3d->lay) {
- if (base->object==obedit) base->flag |= 1;
- else base->flag &= ~1;
- }
+ // TODO: use context iterators for this?
+ CTX_DATA_BEGIN(C, Base *, base, visible_bases) {
+ if (base->object==obedit) base->flag |= 1;
+ else base->flag &= ~1;
}
+ CTX_DATA_END;
/* 1) store starting settings and exit editmode */
oldob= obedit;
oldbase= BASACT;
- oldob->flag &= ~OB_POSEMODE;
- oldbase->flag &= ~OB_POSEMODE;
+ oldob->mode &= ~OB_MODE_POSE;
+ //oldbase->flag &= ~OB_POSEMODE;
- ED_armature_from_edit(scene, obedit);
+ ED_armature_from_edit(obedit);
ED_armature_edit_free(obedit);
/* 2) duplicate base */
- adduplicate(1, USER_DUP_ARM); /* no transform and zero so do get a linked dupli */
-
- newbase= BASACT; /* basact is set in adduplicate() */
+ newbase= ED_object_add_duplicate(scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
newob= newbase->object;
newbase->flag &= ~SELECT;
@@ -1032,21 +1052,38 @@ void separate_armature (Scene *scene, View3D *v3d)
/* 4) fix links before depsgraph flushes */ // err... or after?
separated_armature_fix_links(oldob, newob);
- DAG_object_flush_update(scene, oldob, OB_RECALC_DATA); /* this is the original one */
- DAG_object_flush_update(scene, newob, OB_RECALC_DATA); /* this is the separated one */
+ 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 */
/* 5) restore original conditions */
obedit= oldob;
- BASACT= oldbase;
- BASACT->flag |= SELECT;
ED_armature_to_edit(obedit);
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, obedit);
+
/* recalc/redraw + cleanup */
- waitcursor(0);
+ WM_cursor_wait(0);
+
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_separate (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Separate Armature";
+ ot->idname= "ARMATURE_OT_separate";
+ ot->description= "Isolate selected bones into a separate armature.";
- BIF_undo_push("Separate Armature");
+ /* callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= separate_armature_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* **************** END tools on Editmode Armature **************** */
@@ -1207,72 +1244,105 @@ static EditBone *editbone_get_child(bArmature *arm, EditBone *pabone, short use_
return chbone;
}
-
-/* used by posemode and editmode */
-void setflag_armature (Scene *scene, short mode)
+/* callback for posemode setflag */
+static int pose_setflag_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX get from context
- Object *ob;
- bArmature *arm;
- int flag;
-
- /* get data */
- if (obedit)
- ob= obedit;
- else if (OBACT)
- ob= OBACT;
- else
- return;
- arm= (bArmature *)ob->data;
+ int flag= RNA_enum_get(op->ptr, "type");
+ int mode= RNA_enum_get(op->ptr, "mode");
- /* get flag to set (sync these with the ones used in eBone_Flag */
- if (mode == 2)
- flag= pupmenu("Disable Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6");
- else if (mode == 1)
- flag= pupmenu("Enable Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6");
- else
- flag= pupmenu("Toggle Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6");
- switch (flag) {
- case 1: flag = BONE_DRAWWIRE; break;
- case 2: flag = BONE_NO_DEFORM; break;
- case 3: flag = BONE_MULT_VG_ENV; break;
- case 4: flag = BONE_HINGE; break;
- case 5: flag = BONE_NO_SCALE; break;
- case 6: flag = BONE_EDITMODE_LOCKED; break;
- default: return;
- }
-
- /* determine which mode armature is in */
- if ((!obedit) && (ob->flag & OB_POSEMODE)) {
- /* deal with pose channels */
- bPoseChannel *pchan;
-
- /* set setting */
- for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
- if (pchan->bone->flag & BONE_SELECTED) {
- bone_setflag(&pchan->bone->flag, flag, mode);
- }
- }
- }
+ /* loop over all selected pchans */
+ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pchans)
+ {
+ bone_setflag(&pchan->bone->flag, flag, mode);
}
- else if (obedit) {
- /* deal with editbones */
- EditBone *curbone;
-
- /* set setting */
- for (curbone= arm->edbo->first; curbone; curbone= curbone->next) {
- if (arm->layer & curbone->layer) {
- if (curbone->flag & BONE_SELECTED) {
- bone_setflag(&curbone->flag, flag, mode);
- }
- }
- }
+ CTX_DATA_END;
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_active_object(C));
+
+ return OPERATOR_FINISHED;
+}
+
+/* callback for editbones setflag */
+static int armature_bones_setflag_exec (bContext *C, wmOperator *op)
+{
+ int flag= RNA_enum_get(op->ptr, "type");
+ int mode= RNA_enum_get(op->ptr, "mode");
+
+ /* loop over all selected pchans */
+ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_bones)
+ {
+ bone_setflag(&ebone->flag, flag, mode);
}
+ CTX_DATA_END;
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_edit_object(C));
+
+ return OPERATOR_FINISHED;
+}
+
+/* settings that can be changed */
+static EnumPropertyItem prop_bone_setting_types[] = {
+ {BONE_DRAWWIRE, "DRAWWIRE", 0, "Draw Wire", ""},
+ {BONE_NO_DEFORM, "DEFORM", 0, "Deform", ""},
+ {BONE_MULT_VG_ENV, "MULT_VG", 0, "Multiply Vertex Groups", ""},
+ {BONE_HINGE, "HINGE", 0, "Hinge", ""},
+ {BONE_NO_SCALE, "NO_SCALE", 0, "No Scale", ""},
+ {BONE_EDITMODE_LOCKED, "LOCKED", 0, "Locked", "(For EditMode only)"},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* ways that settings can be changed */
+static EnumPropertyItem prop_bone_setting_modes[] = {
+ {0, "CLEAR", 0, "Clear", ""},
+ {1, "ENABLE", 0, "Enable", ""},
+ {2, "TOGGLE", 0, "Toggle", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+
+void ARMATURE_OT_flags_set (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Bone Flags";
+ ot->idname= "ARMATURE_OT_flags_set";
+ ot->description= "Set flags for armature bones.";
+
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= armature_bones_setflag_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_bone_setting_types, 0, "Type", "");
+ RNA_def_enum(ot->srna, "mode", prop_bone_setting_modes, 0, "Mode", "");
+}
+
+void POSE_OT_flags_set (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Bone Flags";
+ ot->idname= "POSE_OT_flags_set";
+ ot->description= "Set flags for armature bones.";
- BIF_undo_push("Change Bone Setting");
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= pose_setflag_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_bone_setting_types, 0, "Type", "");
+ RNA_def_enum(ot->srna, "mode", prop_bone_setting_modes, 0, "Mode", "");
}
+
/* **************** END PoseMode & EditMode *************************** */
/* **************** Posemode stuff ********************** */
@@ -1435,7 +1505,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
/* BIF_undo_push("Select connected"); */
@@ -1457,8 +1527,6 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* props */
}
/* does bones and points */
@@ -1601,10 +1669,8 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
/* cancel if nothing selected */
if (CTX_DATA_COUNT(C, selected_bones) == 0)
- return OPERATOR_CANCELLED;
-
- /* if (okee("Erase selected bone(s)")==0) return; */
-
+ return OPERATOR_CANCELLED;
+
/* Select mirrored bones */
if (arm->flag & ARM_MIRROR_EDIT) {
for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
@@ -1668,7 +1734,7 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
WM_event_add_notifier(C, NC_OBJECT, obedit);
@@ -1695,7 +1761,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
* toggle==2: only active tag
* toggle==3: swap (no test)
*/
-void deselectall_armature(Object *obedit, int toggle, int doundo)
+void ED_armature_deselectall(Object *obedit, int toggle, int doundo)
{
bArmature *arm= obedit->data;
EditBone *eBone;
@@ -1742,7 +1808,7 @@ void deselectall_armature(Object *obedit, int toggle, int doundo)
}
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
if (doundo) {
if (sel==1) BIF_undo_push("Select All");
else BIF_undo_push("Deselect All");
@@ -1767,7 +1833,7 @@ void mouse_armature(bContext *C, short mval[2], int extend)
if (nearBone) {
if (!extend)
- deselectall_armature(obedit, 0, 0);
+ ED_armature_deselectall(obedit, 0, 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 */
@@ -1814,7 +1880,7 @@ void mouse_armature(bContext *C, short mval[2], int extend)
nearBone->flag |= selmask;
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
if(nearBone) {
/* then now check for active status */
@@ -1822,7 +1888,7 @@ void mouse_armature(bContext *C, short mval[2], int extend)
if(nearBone->flag & BONE_SELECTED) nearBone->flag |= BONE_ACTIVE;
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
}
}
@@ -1965,7 +2031,7 @@ static EnumPropertyItem prop_calc_roll_types[] = {
static int armature_calc_roll_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- View3D *v3d= (View3D *)CTX_wm_space_data(C);
+ View3D *v3d= CTX_wm_view3d(C);
Object *ob= CTX_data_edit_object(C);
void (*roll_func)(Scene *, View3D *, EditBone *) = NULL;
@@ -2145,7 +2211,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
Mat3MulMat3(totmat, obmat, viewmat);
Mat3Inv(imat, totmat);
- deselectall_armature(obedit, 0, 0);
+ ED_armature_deselectall(obedit, 0, 0);
/* Create a bone */
bone= add_editbone(obedit, "Bone");
@@ -2198,7 +2264,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
to_root= 1;
}
- deselectall_armature(obedit, 0, 0);
+ ED_armature_deselectall(obedit, 0, 0);
/* we re-use code for mirror editing... */
flipbone= NULL;
@@ -2246,7 +2312,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
@@ -2473,6 +2539,8 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, char *name, ListBase *edit
VECCOPY(channew->limitmax, chanold->limitmax);
VECCOPY(channew->stiffness, chanold->stiffness);
channew->ikstretch= chanold->ikstretch;
+ channew->ikrotweight= chanold->ikrotweight;
+ channew->iklinweight= chanold->iklinweight;
/* constraints */
listnew = &channew->constraints;
@@ -2508,7 +2576,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- armature_sync_selection(arm->edbo); // XXX why is this needed?
+ ED_armature_sync_selection(arm->edbo); // XXX why is this needed?
preEditBoneDuplicate(arm->edbo);
@@ -2564,6 +2632,9 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
/* copy transform locks */
channew->protectflag = chanold->protectflag;
+ /* copy rotation mode */
+ channew->rotmode = chanold->rotmode;
+
/* copy bone group */
channew->agrp_index= chanold->agrp_index;
@@ -2573,6 +2644,8 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
VECCOPY(channew->limitmax, chanold->limitmax);
VECCOPY(channew->stiffness, chanold->stiffness);
channew->ikstretch= chanold->ikstretch;
+ channew->ikrotweight= chanold->ikrotweight;
+ channew->iklinweight= chanold->iklinweight;
/* constraints */
listnew = &channew->constraints;
@@ -2645,11 +2718,11 @@ static int armature_duplicate_selected_invoke(bContext *C, wmOperator *op, wmEve
return retv;
}
-void ARMATURE_OT_duplicate_selected(wmOperatorType *ot)
+void ARMATURE_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Duplicate Selected Bone(s)";
- ot->idname= "ARMATURE_OT_duplicate_selected";
+ ot->idname= "ARMATURE_OT_duplicate";
/* api callbacks */
ot->invoke = armature_duplicate_selected_invoke;
@@ -2724,6 +2797,7 @@ static void chains_find_tips (ListBase *edbo, ListBase *list)
}
}
+/* --------------------- */
static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points)
{
@@ -2777,23 +2851,29 @@ static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points)
}
/* bone adding between selected joints */
-void fill_bones_armature(Scene *scene, View3D *v3d)
+static int armature_fill_bones_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX get from context
- bArmature *arm= obedit->data;
- EditBone *ebo, *newbone=NULL;
+ Object *obedit= CTX_data_edit_object(C);
+ 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)
+ return OPERATOR_CANCELLED;
+
/* loop over all bones, and only consider if visible */
- for (ebo= arm->edbo->first; ebo; ebo= ebo->next) {
- if (EBONE_VISIBLE(arm, ebo)) {
- if (!(ebo->flag & BONE_CONNECTED) && (ebo->flag & BONE_ROOTSEL))
- fill_add_joint(ebo, 0, &points);
- if (ebo->flag & BONE_TIPSEL)
- fill_add_joint(ebo, 1, &points);
- }
+ CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones)
+ {
+ if (!(ebone->flag & BONE_CONNECTED) && (ebone->flag & BONE_ROOTSEL))
+ fill_add_joint(ebone, 0, &points);
+ if (ebone->flag & BONE_TIPSEL)
+ fill_add_joint(ebone, 1, &points);
}
+ CTX_DATA_END;
/* the number of joints determines how we fill:
* 1) between joint and cursor (joint=head, cursor=tail)
@@ -2803,8 +2883,8 @@ void fill_bones_armature(Scene *scene, View3D *v3d)
count= BLI_countlist(&points);
if (count == 0) {
- error("No joints selected");
- return;
+ BKE_report(op->reports, RPT_ERROR, "No joints selected");
+ return OPERATOR_CANCELLED;
}
else if (count == 1) {
EditBonePoint *ebp;
@@ -2833,14 +2913,14 @@ void fill_bones_armature(Scene *scene, View3D *v3d)
ebp2= ebp->next;
if ((ebp->head_owner==ebp2->tail_owner) && (ebp->head_owner!=NULL)) {
- error("Same bone selected...");
+ BKE_report(op->reports, RPT_ERROR, "Same bone selected...");
BLI_freelistN(&points);
- return;
+ return OPERATOR_CANCELLED;
}
if ((ebp->tail_owner==ebp2->head_owner) && (ebp->tail_owner!=NULL)) {
- error("Same bone selected...");
+ BKE_report(op->reports, RPT_ERROR, "Same bone selected...");
BLI_freelistN(&points);
- return;
+ return OPERATOR_CANCELLED;
}
/* find which one should be the 'head' */
@@ -2907,19 +2987,35 @@ void fill_bones_armature(Scene *scene, View3D *v3d)
}
else {
// FIXME.. figure out a method for multiple bones
- error("Too many points selected");
+ BKE_report(op->reports, RPT_ERROR, "Too many points selected");
printf("Points selected: %d \n", count);
BLI_freelistN(&points);
- return;
+ return OPERATOR_CANCELLED;
}
/* free points */
BLI_freelistN(&points);
- /* undo + updates */
- BIF_undo_push("Fill Bones");
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_fill (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Fill Between Joints";
+ ot->idname= "ARMATURE_OT_fill";
+ ot->description= "Add bone between selected joint(s) and/or 3D-Cursor.";
+
+ /* callbacks */
+ ot->exec= armature_fill_bones_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* --------------------- */
+
/* this function merges between two bones, removes them and those in-between,
* and adjusts the parent relationships for those in-between
*/
@@ -2989,19 +3085,19 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
}
}
-/* bone merging - has a menu! */
-void merge_armature(Scene *scene)
+
+static int armature_merge_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX get from context
- bArmature *arm= obedit->data;
- short val= 0;
+ Object *obedit= CTX_data_edit_object(C);
+ bArmature *arm= (obedit) ? obedit->data : NULL;
+ short type= RNA_enum_get(op->ptr, "type");
- /* process a menu to determine how to merge */
- // TODO: there's room for more modes of merging stuff...
- val= pupmenu("Merge Selected Bones%t|Within Chains%x1");
- if (val <= 0) return;
+ /* sanity checks */
+ if ELEM(NULL, obedit, arm)
+ return OPERATOR_CANCELLED;
- if (val == 1) {
+ /* for now, there's only really one type of merging that's performed... */
+ if (type == 1) {
/* go down chains, merging bones */
ListBase chains = {NULL, NULL};
LinkData *chain, *nchain;
@@ -3009,7 +3105,7 @@ void merge_armature(Scene *scene)
/* get chains (ends on chains) */
chains_find_tips(arm->edbo, &chains);
- if (chains.first == NULL) return;
+ if (chains.first == NULL) return OPERATOR_CANCELLED;
/* each 'chain' is the last bone in the chain (with no children) */
for (chain= chains.first; chain; chain= nchain) {
@@ -3057,9 +3153,35 @@ void merge_armature(Scene *scene)
BLI_freelistN(&chains);
}
- /* undo + updates */
- armature_sync_selection(arm->edbo);
- BIF_undo_push("Merge Bones");
+ /* updates */
+ ED_armature_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_merge (wmOperatorType *ot)
+{
+ static EnumPropertyItem merge_types[] = {
+ {1, "WITHIN_CHAIN", 0, "Within Chains", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ /* identifiers */
+ ot->name= "Merge Bones";
+ ot->idname= "ARMATURE_OT_merge";
+ ot->description= "Merge continuous chains of selected bones.";
+
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= armature_merge_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", merge_types, 0, "Type", "");
}
/* ************** END Add/Remove stuff in editmode ************ */
@@ -3080,7 +3202,7 @@ void hide_selected_armature_bones(Scene *scene)
}
}
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
BIF_undo_push("Hide Bones");
}
@@ -3100,7 +3222,7 @@ void hide_unselected_armature_bones(Scene *scene)
}
}
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
BIF_undo_push("Hide Unselected Bones");
}
@@ -3118,7 +3240,7 @@ void show_all_armature_bones(Scene *scene)
}
}
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
BIF_undo_push("Reveal Bones");
}
@@ -3251,7 +3373,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
if (totbone==0) return OPERATOR_CANCELLED;
/* Transform the endpoints */
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
return OPERATOR_FINISHED;
}
@@ -3314,7 +3436,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
Mat3MulMat3(totmat, obmat, viewmat);
Mat3Inv(imat, totmat);
- deselectall_armature(obedit, 0, 0);
+ ED_armature_deselectall(obedit, 0, 0);
/* Create a bone */
bone= add_editbone(obedit, name);
@@ -3812,7 +3934,7 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT, ob);
@@ -3839,7 +3961,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* **************** Selections ******************/
-static int armature_select_invert_exec(bContext *C, wmOperator *op)
+static int armature_select_inverse_exec(bContext *C, wmOperator *op)
{
/* Set the flags */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
@@ -3854,15 +3976,15 @@ static int armature_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ARMATURE_OT_select_invert(wmOperatorType *ot)
+void ARMATURE_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Invert Selection";
- ot->idname= "ARMATURE_OT_select_invert";
+ ot->name= "Select Inverse";
+ ot->idname= "ARMATURE_OT_select_inverse";
/* api callbacks */
- ot->exec= armature_select_invert_exec;
+ ot->exec= armature_select_inverse_exec;
ot->poll= ED_operator_editarmature;
/* flags */
@@ -3963,7 +4085,7 @@ static int armature_select_hierarchy_exec(bContext *C, wmOperator *op)
}
}
- armature_sync_selection(arm->edbo);
+ ED_armature_sync_selection(arm->edbo);
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -4114,11 +4236,12 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ARMATURE_OT_bones_align(wmOperatorType *ot)
+void ARMATURE_OT_align(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Align Bones";
- ot->idname= "ARMATURE_OT_bones_align";
+ ot->idname= "ARMATURE_OT_align";
+ ot->description= "Align selected bones to the active bone (or to their parent).";
/* api callbacks */
ot->invoke = WM_operator_confirm;
@@ -4214,10 +4337,10 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
}
/* in weightpaint we select the associated vertex group too */
- if (G.f & G_WEIGHTPAINT) {
+ if (OBACT && OBACT->mode & OB_MODE_WEIGHT_PAINT) {
if (nearBone->flag & BONE_ACTIVE) {
- vertexgroup_select_by_name(OBACT, nearBone->name);
- DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
+ ED_vgroup_select_by_name(OBACT, nearBone->name);
+ DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
}
}
@@ -4306,7 +4429,7 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap)
int a, segments;
struct { Object *armob; void *list; int heat; } *data = datap;
- if(!(G.f & G_WEIGHTPAINT) || !(bone->flag & BONE_HIDDEN_P)) {
+ if(!(ob->mode & OB_MODE_WEIGHT_PAINT) || !(bone->flag & BONE_HIDDEN_P)) {
if (!(bone->flag & BONE_NO_DEFORM)) {
if (data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name))
segments = bone->segments;
@@ -4327,7 +4450,7 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap)
return 0;
}
-static int add_defgroup_unique_bone(Object *ob, Bone *bone, void *data)
+static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
{
/* This group creates a vertex group to ob that has the
* same name as bone (provided the bone is skinnable).
@@ -4335,7 +4458,7 @@ static int add_defgroup_unique_bone(Object *ob, Bone *bone, void *data)
*/
if (!(bone->flag & BONE_NO_DEFORM)) {
if (!get_named_vertexgroup(ob,bone->name)) {
- add_defgroup_name(ob, bone->name);
+ ED_vgroup_add_name(ob, bone->name);
return 1;
}
}
@@ -4371,7 +4494,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
int a, segments;
struct { Object *armob; void *list; int heat; } *data= datap;
- if (!(G.f & G_WEIGHTPAINT) || !(bone->flag & BONE_HIDDEN_P)) {
+ if (!(ob->mode & OB_MODE_WEIGHT_PAINT) || !(bone->flag & BONE_HIDDEN_P)) {
if (!(bone->flag & BONE_NO_DEFORM)) {
if (data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name))
segments = bone->segments;
@@ -4379,7 +4502,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
segments = 1;
if (!(defgroup = get_named_vertexgroup(ob, bone->name)))
- defgroup = add_defgroup_name(ob, bone->name);
+ defgroup = ED_vgroup_add_name(ob, bone->name);
if (data->list != NULL) {
hgroup = (bDeformGroup ***) &data->list;
@@ -4430,17 +4553,17 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
/* add the vert to the deform group if weight!=0.0 */
if (distance!=0.0)
- add_vert_to_defgroup (ob, dgroup, i, distance, WEIGHT_REPLACE);
+ ED_vgroup_vert_add (ob, dgroup, i, distance, WEIGHT_REPLACE);
else
- remove_vert_defgroup (ob, dgroup, i);
+ ED_vgroup_vert_remove (ob, dgroup, i);
/* do same for mirror */
if (dgroupflip && dgroupflip[j] && iflip >= 0) {
if (distance!=0.0)
- add_vert_to_defgroup (ob, dgroupflip[j], iflip, distance,
+ ED_vgroup_vert_add (ob, dgroupflip[j], iflip, distance,
WEIGHT_REPLACE);
else
- remove_vert_defgroup (ob, dgroupflip[j], iflip);
+ ED_vgroup_vert_remove (ob, dgroupflip[j], iflip);
}
}
}
@@ -4470,7 +4593,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
float (*root)[3], (*tip)[3], (*verts)[3];
int *selected;
int numbones, vertsfilled = 0, i, j, segments = 0;
- int wpmode = (G.f & G_WEIGHTPAINT);
+ int wpmode = (ob->mode & OB_MODE_WEIGHT_PAINT);
struct { Object *armob; void *list; int heat; } looper_data;
looper_data.armob = par;
@@ -4619,51 +4742,34 @@ 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)
+void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mode)
{
/* Lets try to create some vertex groups
* based on the bones of the parent armature.
*/
bArmature *arm= par->data;
- short mode;
- /* Prompt the user on whether/how they want the vertex groups
- * added to the child mesh */
- mode= pupmenu("Create Vertex Groups? %t|"
- "Don't Create Groups %x1|"
- "Name Groups %x2|"
- "Create From Envelopes %x3|"
- "Create From Bone Heat %x4|");
-
- mode= 3; // XXX
-
- switch (mode) {
- case 2:
+ if(mode == ARM_GROUPS_NAME) {
/* Traverse the bone list, trying to create empty vertex
* groups cooresponding to the bone.
*/
- bone_looper(ob, arm->bonebase.first, NULL,
- add_defgroup_unique_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, ED_vgroup_add_unique_bone);
+
if (ob->type == OB_MESH)
- create_dverts(ob->data);
-
- break;
-
- case 3:
- case 4:
+ ED_vgroup_data_create(ob->data);
+ }
+ else if(mode == ARM_GROUPS_ENVELOPE || mode == ARM_GROUPS_AUTO) {
/* Traverse the bone list, trying to create vertex groups
* that are populated with the vertices for which the
* bone is closest.
*/
- add_verts_to_dgroups(scene, ob, par, (mode == 4), 0);
- break;
+ add_verts_to_dgroups(scene, ob, par, (mode == ARM_GROUPS_AUTO), 0);
}
}
/* ************* Clear Pose *****************************/
static int pose_clear_scale_exec(bContext *C, wmOperator *op)
{
- Scene *scene = CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
/* only clear those channels that are not locked */
@@ -4680,7 +4786,7 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
@@ -4705,7 +4811,6 @@ void POSE_OT_scale_clear(wmOperatorType *ot)
static int pose_clear_loc_exec(bContext *C, wmOperator *op)
{
- Scene *scene = CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
/* only clear those channels that are not locked */
@@ -4722,7 +4827,7 @@ static int pose_clear_loc_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
@@ -4747,39 +4852,60 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
static int pose_clear_rot_exec(bContext *C, wmOperator *op)
{
- Scene *scene = CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
/* only clear those channels that are not locked */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans) {
- if (pchan->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ)) {
- float eul[3], oldeul[3], quat1[4];
-
- if (pchan->rotmode == PCHAN_ROT_QUAT) {
- QUATCOPY(quat1, pchan->quat);
- QuatToEul(pchan->quat, oldeul);
+ 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->protectflag & OB_LOCK_ROTW) == 0)
+ pchan->quat[0]= (pchan->rotmode == PCHAN_ROT_AXISANGLE) ? 0.0f : 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 {
- VECCOPY(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 == PCHAN_ROT_QUAT) {
- EulToQuat(eul, pchan->quat);
- /* 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)) {
- QuatMulf(pchan->quat, -1.0f);
+ /* perform clamping using euler form (3-components) */
+ float eul[3], oldeul[3], quat1[4];
+
+ if (pchan->rotmode == PCHAN_ROT_QUAT) {
+ QUATCOPY(quat1, pchan->quat);
+ QuatToEul(pchan->quat, oldeul);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ AxisAngleToEulO(&pchan->quat[1], pchan->quat[0], oldeul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ VECCOPY(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 == PCHAN_ROT_QUAT) {
+ EulToQuat(eul, pchan->quat);
+ /* 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)) {
+ QuatMulf(pchan->quat, -1.0f);
+ }
+ }
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ AxisAngleToEulO(&pchan->quat[1], pchan->quat[0], oldeul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ VECCOPY(pchan->eul, eul);
}
- }
- else {
- VECCOPY(pchan->eul, eul);
}
}
else {
@@ -4787,6 +4913,11 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op)
pchan->quat[1]=pchan->quat[2]=pchan->quat[3]= 0.0f;
pchan->quat[0]= 1.0f;
}
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* by default, make rotation of 0 radians around y-axis (roll) */
+ pchan->quat[0]=pchan->quat[1]=pchan->quat[3]= 0.0f;
+ pchan->quat[2]= 1.0f;
+ }
else {
pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
}
@@ -4797,7 +4928,7 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
@@ -4823,7 +4954,7 @@ void POSE_OT_rot_clear(wmOperatorType *ot)
/* ***************** selections ********************** */
-static int pose_select_invert_exec(bContext *C, wmOperator *op)
+static int pose_select_inverse_exec(bContext *C, wmOperator *op)
{
/* Set the flags */
@@ -4838,15 +4969,15 @@ static int pose_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void POSE_OT_select_invert(wmOperatorType *ot)
+void POSE_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Invert Selection";
- ot->idname= "POSE_OT_select_invert";
+ ot->name= "Select Inverse";
+ ot->idname= "POSE_OT_select_inverse";
/* api callbacks */
- ot->exec= pose_select_invert_exec;
+ ot->exec= pose_select_inverse_exec;
ot->poll= ED_operator_posemode;
/* flags */
@@ -5098,9 +5229,9 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, char *oldnam
/* called by UI for renaming a bone */
/* warning: make sure the original bone was not renamed yet! */
/* seems messy, but thats what you get with not using pointers but channel names :) */
-void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep)
+void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
{
- bArmature *arm= ob->data;
+ Object *ob;
char newname[MAXBONENAME];
char oldname[MAXBONENAME];
@@ -5232,48 +5363,109 @@ void armature_bone_rename(Object *ob, char *oldnamep, char *newnamep)
}
}
-/* context editmode object */
-void armature_flip_names(Scene *scene)
+
+static int armature_flip_names_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX get from context
- bArmature *arm= obedit->data;
- EditBone *ebone;
+ Object *ob= CTX_data_edit_object(C);
+ bArmature *arm;
char newname[32];
- for (ebone = arm->edbo->first; ebone; ebone=ebone->next) {
- if (arm->layer & ebone->layer) {
- if (ebone->flag & BONE_SELECTED) {
- BLI_strncpy(newname, ebone->name, sizeof(newname));
- bone_flip_name(newname, 1); // 1 = do strip off number extensions
- armature_bone_rename(obedit, ebone->name, newname);
- }
- }
+ /* paranoia checks */
+ if (ELEM(NULL, ob, ob->pose))
+ return OPERATOR_CANCELLED;
+ arm= ob->data;
+
+ /* loop through selected bones, auto-naming them */
+ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
+ {
+ BLI_strncpy(newname, ebone->name, sizeof(newname));
+ bone_flip_name(newname, 1); // 1 = do strip off number extensions
+ ED_armature_bone_rename(arm, ebone->name, newname);
}
+ CTX_DATA_END;
+
+ /* since we renamed stuff... */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
- BIF_undo_push("Flip names");
+ return OPERATOR_FINISHED;
}
-/* context: edtimode armature */
-void armature_autoside_names(Scene *scene, short axis)
+void ARMATURE_OT_flip_names (wmOperatorType *ot)
{
- Object *obedit= scene->obedit; // XXX get from context
- bArmature *arm= obedit->data;
- EditBone *ebone;
+ /* identifiers */
+ ot->name= "Flip Names";
+ ot->idname= "ARMATURE_OT_flip_names";
+ ot->description= "Flips (and corrects) the names of selected bones.";
+
+ /* api callbacks */
+ ot->exec= armature_flip_names_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+static int armature_autoside_names_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+ bArmature *arm;
char newname[32];
+ short axis= RNA_enum_get(op->ptr, "type");
- for (ebone = arm->edbo->first; ebone; ebone=ebone->next) {
- if (arm->layer & ebone->layer) {
- if (ebone->flag & BONE_SELECTED) {
- BLI_strncpy(newname, ebone->name, sizeof(newname));
- bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]);
- armature_bone_rename(obedit, ebone->name, newname);
- }
- }
+ /* paranoia checks */
+ if (ELEM(NULL, ob, ob->pose))
+ return OPERATOR_CANCELLED;
+ arm= ob->data;
+
+ /* loop through selected bones, auto-naming them */
+ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
+ {
+ BLI_strncpy(newname, ebone->name, sizeof(newname));
+ bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]);
+ ED_armature_bone_rename(arm, ebone->name, newname);
}
+ CTX_DATA_END;
+
+ /* since we renamed stuff... */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_autoside_names (wmOperatorType *ot)
+{
+ static EnumPropertyItem axis_items[]= {
+ {0, "XAXIS", 0, "X-Axis", "Left/Right"},
+ {1, "YAXIS", 0, "Y-Axis", "Front/Back"},
+ {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"},
+ {0, NULL, 0, NULL, NULL}};
- BIF_undo_push("Auto-side name");
+ /* identifiers */
+ ot->name= "AutoName by Axis";
+ ot->idname= "ARMATURE_OT_autoside_names";
+ ot->description= "Automatically renames the selected bones according to which side of the target axis they fall on.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= armature_autoside_names_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* settings */
+ RNA_def_enum(ot->srna, "type", axis_items, 0, "Axis", "Axis tag names with.");
}
+
+
/* if editbone (partial) selected, copy data */
/* context; editmode armature, with mirror editing enabled */
void transform_armature_mirror_update(Object *obedit)
@@ -5499,7 +5691,7 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
if (obedit != NULL)
{
- ED_armature_from_edit(scene, obedit);
+ ED_armature_from_edit(obedit);
ED_armature_edit_free(obedit);
}
diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c
index 6d271375c64..d327ed34839 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -30,6 +30,7 @@
#include <string.h>
#include <math.h>
+#include <float.h>
#include "MEM_guardedalloc.h"
@@ -285,6 +286,8 @@ EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *
EditBone *lastBone = NULL;
EditBone *child = NULL;
EditBone *parent = NULL;
+ float *normal = NULL;
+ float size_buffer = 1.2;
int bone_start = 0;
int end = iter->length;
int index;
@@ -294,6 +297,13 @@ EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *
parent = addEditBone(arm, "Bone");
VECCOPY(parent->head, iter->p);
+ if (iter->size > 0)
+ {
+ parent->rad_head = iter->size * size_buffer;
+ }
+
+ normal = iter->no;
+
index = next_subdividion(toolsettings, iter, bone_start, end, parent->head, parent->tail);
while (index != -1)
{
@@ -304,21 +314,33 @@ EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *
child->parent = parent;
child->flag |= BONE_CONNECTED;
+ if (iter->size > 0)
+ {
+ child->rad_head = iter->size * size_buffer;
+ parent->rad_tail = iter->size * size_buffer;
+ }
+
/* going to next bone, fix parent */
Mat4MulVecfl(invmat, parent->tail);
Mat4MulVecfl(invmat, parent->head);
- setBoneRollFromNormal(parent, iter->no, invmat, tmat);
+ setBoneRollFromNormal(parent, normal, invmat, tmat);
parent = child; // new child is next parent
bone_start = index; // start next bone from current index
+ normal = iter->no; /* use normal at head, not tail */
+
index = next_subdividion(toolsettings, iter, bone_start, end, parent->head, parent->tail);
}
iter->tail(iter);
VECCOPY(parent->tail, iter->p);
-
+ if (iter->size > 0)
+ {
+ parent->rad_tail = iter->size * size_buffer;
+ }
+
/* fix last bone */
Mat4MulVecfl(invmat, parent->tail);
Mat4MulVecfl(invmat, parent->head);
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index 68e8b45e7d2..4d65059c4c6 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -466,12 +466,12 @@ static void renameTemplateBone(char *name, char *template_name, ListBase *editbo
{
if (template_name[i+1] == 'S' || template_name[i+1] == 's')
{
- j += sprintf(name + j, side_string);
+ j += sprintf(name + j, "%s", side_string);
i++;
}
else if (template_name[i+1] == 'N' || template_name[i+1] == 'n')
{
- j += sprintf(name + j, num_string);
+ j += sprintf(name + j, "%s", num_string);
i++;
}
else
@@ -1538,7 +1538,7 @@ void RIG_printGraph(RigGraph *rg)
/*******************************************************************************************************/
-RigGraph *RIG_graphFromArmature(bContext *C, Object *ob, bArmature *arm)
+RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm)
{
Object *obedit = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
@@ -2139,15 +2139,15 @@ static MemoNode * solveJoints(MemoNode *table, BArcIterator *iter, float **vec_c
MemoNode *min_node = NULL;
float *vec0 = vec_cache[previous];
float *vec1 = vec_cache[current];
- float min_weight;
- int min_next;
+ float min_weight= 0.0f;
+ int min_next= 0;
int next;
for (next = current + 1; next <= nb_positions - (joints_left - 1); next++)
{
MemoNode *next_node;
float *vec2 = vec_cache[next];
- float weight = 0;
+ float weight = 0.0f;
/* ADD WEIGHT OF PREVIOUS - CURRENT - NEXT triple */
weight = calcCostAngleLengthDistance(iter, vec_cache, edge, vec0, vec1, vec2, current, next, angle_weight, length_weight, distance_weight);
@@ -2716,7 +2716,6 @@ static void finishRetarget(RigGraph *rigg)
static void adjustGraphs(bContext *C, RigGraph *rigg)
{
- Scene *scene = CTX_data_scene(C);
bArmature *arm= rigg->ob->data;
RigArc *arc;
@@ -2732,14 +2731,13 @@ static void adjustGraphs(bContext *C, RigGraph *rigg)
/* Turn the list into an armature */
arm->edbo = rigg->editbones;
- ED_armature_from_edit(scene, rigg->ob);
+ ED_armature_from_edit(rigg->ob);
ED_undo_push(C, "Retarget Skeleton");
}
static void retargetGraphs(bContext *C, RigGraph *rigg)
{
- Scene *scene = CTX_data_scene(C);
bArmature *arm= rigg->ob->data;
ReebGraph *reebg = rigg->link_mesh;
RigNode *inode;
@@ -2762,7 +2760,7 @@ static void retargetGraphs(bContext *C, RigGraph *rigg)
/* Turn the list into an armature */
arm->edbo = rigg->editbones;
- ED_armature_from_edit(scene, rigg->ob);
+ ED_armature_from_edit(rigg->ob);
}
char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index)
@@ -2824,7 +2822,7 @@ void BIF_retargetArmature(bContext *C)
ReebGraph *reebg;
double start_time, end_time;
double gstart_time, gend_time;
- double reeb_time, rig_time, retarget_time, total_time;
+ double reeb_time, rig_time=0.0, retarget_time=0.0, total_time;
gstart_time = start_time = PIL_check_seconds_timer();
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index fb030b91ce1..74876691dac 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -49,6 +49,7 @@
#include "BKE_object.h"
#include "BKE_anim.h"
#include "BKE_context.h"
+#include "BKE_sketch.h"
#include "ED_view3d.h"
#include "ED_screen.h"
@@ -65,7 +66,7 @@
#include "BIF_generate.h"
//#include "BIF_interface.h"
-#include "BIF_transform.h"
+#include "ED_transform.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -74,73 +75,21 @@
//#include "mydevice.h"
#include "reeb.h"
-typedef enum SK_PType
-{
- PT_CONTINUOUS,
- PT_EXACT,
-} SK_PType;
-
-typedef enum SK_PMode
-{
- PT_SNAP,
- PT_PROJECT,
-} SK_PMode;
-
-typedef struct SK_Point
-{
- float p[3];
- float no[3];
- SK_PType type;
- SK_PMode mode;
-} SK_Point;
-
-typedef struct SK_Stroke
-{
- struct SK_Stroke *next, *prev;
-
- SK_Point *points;
- int nb_points;
- int buf_size;
- int selected;
-} SK_Stroke;
-#define SK_OVERDRAW_LIMIT 5
-typedef struct SK_Overdraw
-{
- SK_Stroke *target;
- int start, end;
- int count;
-} SK_Overdraw;
+typedef int (*GestureDetectFct)(bContext*, SK_Gesture*, SK_Sketch *);
+typedef void (*GestureApplyFct)(bContext*, SK_Gesture*, SK_Sketch *);
-#define SK_Stroke_BUFFER_INIT_SIZE 20
+typedef struct SK_GestureAction {
+ char name[64];
+ GestureDetectFct detect;
+ GestureApplyFct apply;
+} SK_GestureAction;
-typedef struct SK_DrawData
-{
- short mval[2];
- short previous_mval[2];
- SK_PType type;
-} SK_DrawData;
+SK_Point boneSnap;
+int LAST_SNAP_POINT_VALID = 0;
+float LAST_SNAP_POINT[3];
-typedef struct SK_Intersection
-{
- struct SK_Intersection *next, *prev;
- SK_Stroke *stroke;
- int before;
- int after;
- int gesture_index;
- float p[3];
- float lambda; /* used for sorting intersection points */
-} SK_Intersection;
-
-typedef struct SK_Sketch
-{
- ListBase strokes;
- SK_Stroke *active_stroke;
- SK_Stroke *gesture;
- SK_Point next_point;
- SK_Overdraw over;
-} SK_Sketch;
typedef struct SK_StrokeIterator {
HeadFct head;
@@ -150,9 +99,10 @@ typedef struct SK_StrokeIterator {
NextNFct nextN;
PreviousFct previous;
StoppedFct stopped;
-
+
float *p, *no;
-
+ float size;
+
int length;
int index;
/*********************************/
@@ -162,41 +112,12 @@ typedef struct SK_StrokeIterator {
int stride;
} SK_StrokeIterator;
-typedef struct SK_Gesture {
- SK_Stroke *stk;
- SK_Stroke *segments;
-
- ListBase intersections;
- ListBase self_intersections;
-
- int nb_self_intersections;
- int nb_intersections;
- int nb_segments;
-} SK_Gesture;
-
-typedef int (*GestureDetectFct)(bContext*, SK_Gesture*, SK_Sketch *);
-typedef void (*GestureApplyFct)(bContext*, SK_Gesture*, SK_Sketch *);
-
-typedef struct SK_GestureAction {
- char name[64];
- GestureDetectFct detect;
- GestureApplyFct apply;
-} SK_GestureAction;
-
-SK_Sketch *GLOBAL_sketch = NULL;
-SK_Point boneSnap;
-int LAST_SNAP_POINT_VALID = 0;
-float LAST_SNAP_POINT[3];
-
/******************** PROTOTYPES ******************************/
void initStrokeIterator(BArcIterator *iter, SK_Stroke *stk, int start, int end);
void sk_deleteSelectedStrokes(SK_Sketch *sketch);
-void sk_freeStroke(SK_Stroke *stk);
-void sk_freeSketch(SK_Sketch *sketch);
-
SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
@@ -214,6 +135,8 @@ void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
int sk_detectConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
void sk_applyConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
+SK_Sketch* contextSketch(const bContext *c, int create);
+SK_Sketch* viewcontextSketch(ViewContext *vc, int create);
void sk_resetOverdraw(SK_Sketch *sketch);
int sk_hasOverdraw(SK_Sketch *sketch, SK_Stroke *stk);
@@ -239,7 +162,7 @@ int TEMPLATES_CURRENT = 0;
GHash *TEMPLATES_HASH = NULL;
RigGraph *TEMPLATE_RIGG = NULL;
-void BIF_makeListTemplates(bContext *C)
+void BIF_makeListTemplates(const bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
@@ -251,19 +174,19 @@ void BIF_makeListTemplates(bContext *C)
{
BLI_ghash_free(TEMPLATES_HASH, NULL, NULL);
}
-
+
TEMPLATES_HASH = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp);
TEMPLATES_CURRENT = 0;
for ( base = FIRSTBASE; base; base = base->next )
{
Object *ob = base->object;
-
+
if (ob != obedit && ob->type == OB_ARMATURE)
{
index++;
BLI_ghash_insert(TEMPLATES_HASH, SET_INT_IN_POINTER(index), ob);
-
+
if (ob == ts->skgen_template)
{
TEMPLATES_CURRENT = index;
@@ -272,39 +195,39 @@ void BIF_makeListTemplates(bContext *C)
}
}
-char *BIF_listTemplates(bContext *C)
+char *BIF_listTemplates(const bContext *C)
{
GHashIterator ghi;
char menu_header[] = "Template%t|None%x0|";
char *p;
-
+
if (TEMPLATES_MENU != NULL)
{
MEM_freeN(TEMPLATES_MENU);
}
-
+
TEMPLATES_MENU = MEM_callocN(sizeof(char) * (BLI_ghash_size(TEMPLATES_HASH) * 32 + 30), "skeleton template menu");
-
+
p = TEMPLATES_MENU;
-
+
p += sprintf(TEMPLATES_MENU, "%s", menu_header);
-
+
BLI_ghashIterator_init(&ghi, TEMPLATES_HASH);
-
+
while (!BLI_ghashIterator_isDone(&ghi))
{
Object *ob = BLI_ghashIterator_getValue(&ghi);
int key = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&ghi));
-
+
p += sprintf(p, "|%s%%x%i", ob->id.name+2, key);
-
+
BLI_ghashIterator_step(&ghi);
}
-
+
return TEMPLATES_MENU;
}
-int BIF_currentTemplate(bContext *C)
+int BIF_currentTemplate(const bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -312,33 +235,33 @@ int BIF_currentTemplate(bContext *C)
{
GHashIterator ghi;
BLI_ghashIterator_init(&ghi, TEMPLATES_HASH);
-
+
while (!BLI_ghashIterator_isDone(&ghi))
{
Object *ob = BLI_ghashIterator_getValue(&ghi);
int key = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(&ghi));
-
+
if (ob == ts->skgen_template)
{
TEMPLATES_CURRENT = key;
break;
}
-
+
BLI_ghashIterator_step(&ghi);
}
}
-
+
return TEMPLATES_CURRENT;
}
-RigGraph* sk_makeTemplateGraph(bContext *C, Object *ob)
+RigGraph* sk_makeTemplateGraph(const bContext *C, Object *ob)
{
Object *obedit = CTX_data_edit_object(C);
if (ob == obedit)
{
return NULL;
}
-
+
if (ob != NULL)
{
if (TEMPLATE_RIGG && TEMPLATE_RIGG->ob != ob)
@@ -346,39 +269,39 @@ RigGraph* sk_makeTemplateGraph(bContext *C, Object *ob)
RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
TEMPLATE_RIGG = NULL;
}
-
+
if (TEMPLATE_RIGG == NULL)
{
bArmature *arm;
arm = ob->data;
-
+
TEMPLATE_RIGG = RIG_graphFromArmature(C, ob, arm);
}
}
-
+
return TEMPLATE_RIGG;
}
-int BIF_nbJointsTemplate(bContext *C)
+int BIF_nbJointsTemplate(const bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
RigGraph *rg = sk_makeTemplateGraph(C, ts->skgen_template);
-
+
if (rg)
{
return RIG_nbJoints(rg);
}
else
{
- return -1;
+ return -1;
}
}
-char * BIF_nameBoneTemplate(bContext *C)
+char * BIF_nameBoneTemplate(const bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
- SK_Sketch *stk = GLOBAL_sketch;
+ SK_Sketch *stk = contextSketch(C, 1);
RigGraph *rg;
int index = 0;
@@ -386,9 +309,9 @@ char * BIF_nameBoneTemplate(bContext *C)
{
index = stk->active_stroke->nb_points;
}
-
+
rg = sk_makeTemplateGraph(C, ts->skgen_template);
-
+
if (rg == NULL)
{
return "";
@@ -404,13 +327,13 @@ void BIF_freeTemplates(bContext *C)
MEM_freeN(TEMPLATES_MENU);
TEMPLATES_MENU = NULL;
}
-
+
if (TEMPLATES_HASH != NULL)
{
BLI_ghash_free(TEMPLATES_HASH, NULL, NULL);
TEMPLATES_HASH = NULL;
}
-
+
if (TEMPLATE_RIGG != NULL)
{
RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
@@ -428,14 +351,14 @@ void BIF_setTemplate(bContext *C, int index)
else
{
ts->skgen_template = NULL;
-
+
if (TEMPLATE_RIGG != NULL)
{
RIG_freeRigGraph((BGraph*)TEMPLATE_RIGG);
}
TEMPLATE_RIGG = NULL;
}
-}
+}
/*********************** CONVERSION ***************************/
@@ -456,7 +379,7 @@ void sk_autoname(bContext *C, ReebArc *arc)
char *side = ts->skgen_side_string;
int valid = 0;
int caps = 0;
-
+
if (BLI_streq(side, ""))
{
valid = 1;
@@ -471,7 +394,7 @@ void sk_autoname(bContext *C, ReebArc *arc)
valid = 1;
caps = 0;
}
-
+
if (valid)
{
if (arc->head->p[0] < 0)
@@ -490,14 +413,14 @@ void sk_autoname(bContext *C, ReebArc *arc)
ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3])
{
ReebNode *node;
-
+
node = MEM_callocN(sizeof(ReebNode), "reeb node");
VECCOPY(node->p, pt->p);
Mat4MulVecfl(imat, node->p);
-
+
VECCOPY(node->no, pt->no);
Mat3MulVecfl(tmat, node->no);
-
+
return node;
}
@@ -505,14 +428,14 @@ ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
{
ReebArc *arc;
int i;
-
+
arc = MEM_callocN(sizeof(ReebArc), "reeb arc");
arc->head = sk_pointToNode(stk->points, imat, tmat);
arc->tail = sk_pointToNode(sk_lastStrokePoint(stk), imat, tmat);
-
+
arc->bcount = stk->nb_points - 2; /* first and last are nodes, don't count */
arc->buckets = MEM_callocN(sizeof(EmbedBucket) * arc->bcount, "Buckets");
-
+
for (i = 0; i < arc->bcount; i++)
{
VECCOPY(arc->buckets[i].p, stk->points[i + 1].p);
@@ -521,7 +444,7 @@ ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
VECCOPY(arc->buckets[i].no, stk->points[i + 1].no);
Mat3MulVecfl(tmat, arc->buckets[i].no);
}
-
+
return arc;
}
@@ -533,22 +456,22 @@ void sk_retargetStroke(bContext *C, SK_Stroke *stk)
float tmat[3][3];
ReebArc *arc;
RigGraph *rg;
-
+
Mat4Invert(imat, obedit->obmat);
-
+
Mat3CpyMat4(tmat, obedit->obmat);
Mat3Transp(tmat);
arc = sk_strokeToArc(stk, imat, tmat);
-
+
sk_autoname(C, arc);
-
+
rg = sk_makeTemplateGraph(C, ts->skgen_template);
BIF_retargetArc(C, arc, rg);
-
+
sk_autoname(C, NULL);
-
+
MEM_freeN(arc->head);
MEM_freeN(arc->tail);
REEB_freeArc((BArc*)arc);
@@ -556,474 +479,119 @@ void sk_retargetStroke(bContext *C, SK_Stroke *stk)
/**************************************************************/
-void sk_freeSketch(SK_Sketch *sketch)
+void sk_cancelStroke(SK_Sketch *sketch)
{
- SK_Stroke *stk, *next;
-
- for (stk = sketch->strokes.first; stk; stk = next)
+ if (sketch->active_stroke != NULL)
{
- next = stk->next;
-
- sk_freeStroke(stk);
+ sk_resetOverdraw(sketch);
+ sk_removeStroke(sketch, sketch->active_stroke);
}
-
- MEM_freeN(sketch);
}
-SK_Sketch* sk_createSketch()
-{
- SK_Sketch *sketch;
-
- sketch = MEM_callocN(sizeof(SK_Sketch), "SK_Sketch");
-
- sketch->active_stroke = NULL;
- sketch->gesture = NULL;
-
- sketch->strokes.first = NULL;
- sketch->strokes.last = NULL;
-
- return sketch;
-}
-void sk_initPoint(bContext *C, SK_Point *pt)
+float sk_clampPointSize(SK_Point *pt, float size)
{
- ARegion *ar = CTX_wm_region(C);
- RegionView3D *rv3d = ar->regiondata;
-
- VECCOPY(pt->no, rv3d->viewinv[2]);
- Normalize(pt->no);
- /* more init code here */
+ return MAX2(size * pt->size, size / 2);
}
-void sk_copyPoint(SK_Point *dst, SK_Point *src)
+void sk_drawPoint(GLUquadric *quad, SK_Point *pt, float size)
{
- memcpy(dst, src, sizeof(SK_Point));
+ glTranslatef(pt->p[0], pt->p[1], pt->p[2]);
+ gluSphere(quad, sk_clampPointSize(pt, size), 8, 8);
}
-void sk_allocStrokeBuffer(SK_Stroke *stk)
+void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size)
{
- stk->points = MEM_callocN(sizeof(SK_Point) * stk->buf_size, "SK_Point buffer");
-}
+ float vec1[3], vec2[3] = {0, 0, 1}, axis[3];
+ float angle, length;
-void sk_freeStroke(SK_Stroke *stk)
-{
- MEM_freeN(stk->points);
- MEM_freeN(stk);
-}
+ VecSubf(vec1, pt1->p, pt0->p);
+ length = Normalize(vec1);
+ Crossf(axis, vec2, vec1);
-SK_Stroke* sk_createStroke()
-{
- SK_Stroke *stk;
-
- stk = MEM_callocN(sizeof(SK_Stroke), "SK_Stroke");
-
- stk->selected = 0;
- stk->nb_points = 0;
- stk->buf_size = SK_Stroke_BUFFER_INIT_SIZE;
-
- sk_allocStrokeBuffer(stk);
-
- return stk;
-}
-
-void sk_shrinkStrokeBuffer(SK_Stroke *stk)
-{
- if (stk->nb_points < stk->buf_size)
+ if (VecIsNull(axis))
{
- SK_Point *old_points = stk->points;
-
- stk->buf_size = stk->nb_points;
-
- sk_allocStrokeBuffer(stk);
-
- memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
-
- MEM_freeN(old_points);
+ axis[1] = 1;
}
-}
-void sk_growStrokeBuffer(SK_Stroke *stk)
-{
- if (stk->nb_points == stk->buf_size)
- {
- SK_Point *old_points = stk->points;
-
- stk->buf_size *= 2;
-
- sk_allocStrokeBuffer(stk);
-
- memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
-
- MEM_freeN(old_points);
- }
-}
+ angle = NormalizedVecAngle2(vec2, vec1);
-void sk_growStrokeBufferN(SK_Stroke *stk, int n)
-{
- if (stk->nb_points + n > stk->buf_size)
- {
- SK_Point *old_points = stk->points;
-
- while (stk->nb_points + n > stk->buf_size)
- {
- stk->buf_size *= 2;
- }
-
- sk_allocStrokeBuffer(stk);
-
- memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points);
-
- MEM_freeN(old_points);
- }
-}
-
-
-void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n)
-{
- memcpy(stk->points + n, pt, sizeof(SK_Point));
-}
+ glRotatef(angle * 180 / M_PI + 180, axis[0], axis[1], axis[2]);
-void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n)
-{
- int size = stk->nb_points - n;
-
- sk_growStrokeBuffer(stk);
-
- memmove(stk->points + n + 1, stk->points + n, size * sizeof(SK_Point));
-
- memcpy(stk->points + n, pt, sizeof(SK_Point));
-
- stk->nb_points++;
+ gluCylinder(quad, sk_clampPointSize(pt1, size), sk_clampPointSize(pt0, size), length, 8, 8);
}
-void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt)
+void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height)
{
- sk_growStrokeBuffer(stk);
-
- memcpy(stk->points + stk->nb_points, pt, sizeof(SK_Point));
+ float vec2[3] = {0, 0, 1}, axis[3];
+ float angle;
- stk->nb_points++;
-}
+ glPushMatrix();
-void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end)
-{
- int size = end - start + 1;
-
- sk_growStrokeBufferN(stk, len - size);
-
- if (len != size)
- {
- int tail_size = stk->nb_points - end + 1;
-
- memmove(stk->points + start + len, stk->points + end + 1, tail_size * sizeof(SK_Point));
- }
-
- memcpy(stk->points + start, pts, len * sizeof(SK_Point));
-
- stk->nb_points += len - size;
-}
+ Crossf(axis, vec2, pt->no);
-void sk_trimStroke(SK_Stroke *stk, int start, int end)
-{
- int size = end - start + 1;
-
- if (start > 0)
+ if (VecIsNull(axis))
{
- memmove(stk->points, stk->points + start, size * sizeof(SK_Point));
+ axis[1] = 1;
}
-
- stk->nb_points = size;
-}
-void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3])
-{
- SK_Point pt1, pt2;
- SK_Point *prev, *next;
- float delta_p[3];
- int i, total;
-
- total = end - start;
+ angle = NormalizedVecAngle2(vec2, pt->no);
- VecSubf(delta_p, p_end, p_start);
-
- prev = stk->points + start;
- next = stk->points + end;
-
- VECCOPY(pt1.p, p_start);
- VECCOPY(pt1.no, prev->no);
- pt1.mode = prev->mode;
- pt1.type = prev->type;
-
- VECCOPY(pt2.p, p_end);
- VECCOPY(pt2.no, next->no);
- pt2.mode = next->mode;
- pt2.type = next->type;
-
- sk_insertStrokePoint(stk, &pt1, start + 1); /* insert after start */
- sk_insertStrokePoint(stk, &pt2, end + 1); /* insert before end (since end was pushed back already) */
-
- for (i = 1; i < total; i++)
- {
- float delta = (float)i / (float)total;
- float *p = stk->points[start + 1 + i].p;
+ glRotatef(angle * 180 / M_PI, axis[0], axis[1], axis[2]);
- VECCOPY(p, delta_p);
- VecMulf(p, delta);
- VecAddf(p, p, p_start);
- }
-}
+ glColor3f(0, 1, 1);
+ gluCylinder(quad, sk_clampPointSize(pt, size), 0, sk_clampPointSize(pt, height), 10, 2);
-void sk_polygonizeStroke(SK_Stroke *stk, int start, int end)
-{
- int offset;
- int i;
-
- /* find first exact points outside of range */
- for (;start > 0; start--)
- {
- if (stk->points[start].type == PT_EXACT)
- {
- break;
- }
- }
-
- for (;end < stk->nb_points - 1; end++)
- {
- if (stk->points[end].type == PT_EXACT)
- {
- break;
- }
- }
-
- offset = start + 1;
-
- for (i = start + 1; i < end; i++)
- {
- if (stk->points[i].type == PT_EXACT)
- {
- if (offset != i)
- {
- memcpy(stk->points + offset, stk->points + i, sizeof(SK_Point));
- }
-
- offset++;
- }
- }
-
- /* some points were removes, move end of array */
- if (offset < end)
- {
- int size = stk->nb_points - end;
- memmove(stk->points + offset, stk->points + end, size * sizeof(SK_Point));
- stk->nb_points = offset + size;
- }
-}
-
-void sk_flattenStroke(SK_Stroke *stk, int start, int end)
-{
- float normal[3], distance[3];
- float limit;
- int i, total;
-
- total = end - start + 1;
-
- VECCOPY(normal, stk->points[start].no);
-
- VecSubf(distance, stk->points[end].p, stk->points[start].p);
- Projf(normal, distance, normal);
- limit = Normalize(normal);
-
- for (i = 1; i < total - 1; i++)
- {
- float d = limit * i / total;
- float offset[3];
- float *p = stk->points[start + i].p;
-
- VecSubf(distance, p, stk->points[start].p);
- Projf(distance, distance, normal);
-
- VECCOPY(offset, normal);
- VecMulf(offset, d);
-
- VecSubf(p, p, distance);
- VecAddf(p, p, offset);
- }
-}
-
-void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk)
-{
- if (sketch->active_stroke == stk)
- {
- sketch->active_stroke = NULL;
- }
-
- BLI_remlink(&sketch->strokes, stk);
- sk_freeStroke(stk);
-}
-
-void sk_reverseStroke(SK_Stroke *stk)
-{
- SK_Point *old_points = stk->points;
- int i = 0;
-
- sk_allocStrokeBuffer(stk);
-
- for (i = 0; i < stk->nb_points; i++)
- {
- sk_copyPoint(stk->points + i, old_points + stk->nb_points - 1 - i);
- }
-
- MEM_freeN(old_points);
-}
-
-
-void sk_cancelStroke(SK_Sketch *sketch)
-{
- if (sketch->active_stroke != NULL)
- {
- sk_resetOverdraw(sketch);
- sk_removeStroke(sketch, sketch->active_stroke);
- }
-}
-
-/* Apply reverse Chaikin filter to simplify the polyline
- * */
-void sk_filterStroke(SK_Stroke *stk, int start, int end)
-{
- SK_Point *old_points = stk->points;
- int nb_points = stk->nb_points;
- int i, j;
-
- return;
-
- if (start == -1)
- {
- start = 0;
- end = stk->nb_points - 1;
- }
-
- sk_allocStrokeBuffer(stk);
- stk->nb_points = 0;
-
- /* adding points before range */
- for (i = 0; i < start; i++)
- {
- sk_appendStrokePoint(stk, old_points + i);
- }
-
- for (i = start, j = start; i <= end; i++)
- {
- if (i - j == 3)
- {
- SK_Point pt;
- float vec[3];
-
- sk_copyPoint(&pt, &old_points[j+1]);
-
- pt.p[0] = 0;
- pt.p[1] = 0;
- pt.p[2] = 0;
-
- VECCOPY(vec, old_points[j].p);
- VecMulf(vec, -0.25);
- VecAddf(pt.p, pt.p, vec);
-
- VECCOPY(vec, old_points[j+1].p);
- VecMulf(vec, 0.75);
- VecAddf(pt.p, pt.p, vec);
-
- VECCOPY(vec, old_points[j+2].p);
- VecMulf(vec, 0.75);
- VecAddf(pt.p, pt.p, vec);
-
- VECCOPY(vec, old_points[j+3].p);
- VecMulf(vec, -0.25);
- VecAddf(pt.p, pt.p, vec);
-
- sk_appendStrokePoint(stk, &pt);
-
- j += 2;
- }
-
- /* this might be uneeded when filtering last continuous stroke */
- if (old_points[i].type == PT_EXACT)
- {
- sk_appendStrokePoint(stk, old_points + i);
- j = i;
- }
- }
-
- /* adding points after range */
- for (i = end + 1; i < nb_points; i++)
- {
- sk_appendStrokePoint(stk, old_points + i);
- }
-
- MEM_freeN(old_points);
-
- sk_shrinkStrokeBuffer(stk);
-}
-
-void sk_filterLastContinuousStroke(SK_Stroke *stk)
-{
- int start, end;
-
- end = stk->nb_points -1;
-
- for (start = end - 1; start > 0 && stk->points[start].type == PT_CONTINUOUS; start--)
- {
- /* nothing to do here*/
- }
-
- if (end - start > 1)
- {
- sk_filterStroke(stk, start, end);
- }
-}
-
-SK_Point *sk_lastStrokePoint(SK_Stroke *stk)
-{
- SK_Point *pt = NULL;
-
- if (stk->nb_points > 0)
- {
- pt = stk->points + (stk->nb_points - 1);
- }
-
- return pt;
+ glPopMatrix();
}
void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end)
{
float rgb[3];
int i;
-
+ GLUquadric *quad = gluNewQuadric();
+ gluQuadricNormals(quad, GLU_SMOOTH);
+
if (id != -1)
{
glLoadName(id);
-
- glBegin(GL_LINE_STRIP);
-
+
for (i = 0; i < stk->nb_points; i++)
{
- glVertex3fv(stk->points[i].p);
+ glPushMatrix();
+
+ sk_drawPoint(quad, stk->points + i, 0.1);
+
+ if (i > 0)
+ {
+ sk_drawEdge(quad, stk->points + i - 1, stk->points + i, 0.1);
+ }
+
+ glPopMatrix();
}
-
- glEnd();
-
+
}
else
{
float d_rgb[3] = {1, 1, 1};
-
+
VECCOPY(rgb, color);
VecSubf(d_rgb, d_rgb, rgb);
VecMulf(d_rgb, 1.0f / (float)stk->nb_points);
-
- glBegin(GL_LINE_STRIP);
for (i = 0; i < stk->nb_points; i++)
{
+ SK_Point *pt = stk->points + i;
+
+ glPushMatrix();
+
+ if (pt->type == PT_EXACT)
+ {
+ glColor3f(0, 0, 0);
+ sk_drawPoint(quad, pt, 0.15);
+ sk_drawNormal(quad, pt, 0.05, 0.9);
+ }
+
if (i >= start && i <= end)
{
glColor3f(0.3, 0.3, 0.3);
@@ -1032,99 +600,78 @@ void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end)
{
glColor3fv(rgb);
}
- glVertex3fv(stk->points[i].p);
- VecAddf(rgb, rgb, d_rgb);
- }
-
- glEnd();
-#if 0
- glColor3f(0, 0, 1);
- glBegin(GL_LINES);
+ if (pt->type != PT_EXACT)
+ {
- for (i = 0; i < stk->nb_points; i++)
- {
- float *p = stk->points[i].p;
- float *no = stk->points[i].no;
- glVertex3fv(p);
- glVertex3f(p[0] + no[0], p[1] + no[1], p[2] + no[2]);
- }
-
- glEnd();
-#endif
+ sk_drawPoint(quad, pt, 0.1);
+ }
- glColor3f(0, 0, 0);
- glBegin(GL_POINTS);
-
- for (i = 0; i < stk->nb_points; i++)
- {
- if (stk->points[i].type == PT_EXACT)
+ if (i > 0)
{
- glVertex3fv(stk->points[i].p);
+ sk_drawEdge(quad, pt - 1, pt, 0.1);
}
+
+ glPopMatrix();
+
+ VecAddf(rgb, rgb, d_rgb);
}
-
- glEnd();
}
-// glColor3f(1, 1, 1);
-// glBegin(GL_POINTS);
-//
-// for (i = 0; i < stk->nb_points; i++)
-// {
-// if (stk->points[i].type == PT_CONTINUOUS)
-// {
-// glVertex3fv(stk->points[i].p);
-// }
-// }
-//
-// glEnd();
+ gluDeleteQuadric(quad);
}
void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, NextSubdivisionFunc next_subdividion)
{
+ SK_Stroke *stk = ((SK_StrokeIterator*)iter)->stroke;
float head[3], tail[3];
int bone_start = 0;
int end = iter->length;
int index;
+ GLUquadric *quad = gluNewQuadric();
+ gluQuadricNormals(quad, GLU_SMOOTH);
iter->head(iter);
VECCOPY(head, iter->p);
-
- glColor3f(0, 1, 0);
- glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE) * 2);
- glBegin(GL_POINTS);
-
+
index = next_subdividion(toolsettings, iter, bone_start, end, head, tail);
while (index != -1)
{
- glVertex3fv(tail);
-
+ SK_Point *pt = stk->points + index;
+
+ glPushMatrix();
+
+ glColor3f(0, 1, 0);
+ sk_drawPoint(quad, pt, 0.15);
+
+ sk_drawNormal(quad, pt, 0.05, 0.9);
+
+ glPopMatrix();
+
VECCOPY(head, tail);
bone_start = index; // start next bone from current index
index = next_subdividion(toolsettings, iter, bone_start, end, head, tail);
}
-
- glEnd();
- glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
+
+ gluDeleteQuadric(quad);
}
void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
{
int head_index = -1;
int i;
-
+
if (toolsettings->bone_sketching_convert == SK_CONVERT_RETARGET)
{
return;
}
-
+
for (i = 0; i < stk->nb_points; i++)
{
SK_Point *pt = stk->points + i;
-
+
if (pt->type == PT_EXACT || i == stk->nb_points - 1) /* stop on exact or on last point */
{
if (head_index == -1)
@@ -1137,7 +684,7 @@ void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
{
SK_StrokeIterator sk_iter;
BArcIterator *iter = (BArcIterator*)&sk_iter;
-
+
initStrokeIterator(iter, stk, head_index, i);
if (toolsettings->bone_sketching_convert == SK_CONVERT_CUT_ADAPTATIVE)
@@ -1152,13 +699,13 @@ void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
{
drawSubdividedStrokeBy(toolsettings, iter, nextFixedSubdivision);
}
-
+
}
head_index = i;
}
}
- }
+ }
}
SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *dist, int *index, int all_pts)
@@ -1166,23 +713,23 @@ SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *di
ARegion *ar = CTX_wm_region(C);
SK_Point *pt = NULL;
int i;
-
+
for (i = 0; i < stk->nb_points; i++)
{
if (all_pts || stk->points[i].type == PT_EXACT)
{
short pval[2];
int pdist;
-
+
project_short_noclip(ar, stk->points[i].p, pval);
-
+
pdist = ABS(pval[0] - mval[0]) + ABS(pval[1] - mval[1]);
-
+
if (pdist < *dist)
{
*dist = pdist;
pt = stk->points + i;
-
+
if (index != NULL)
{
*index = i;
@@ -1190,7 +737,7 @@ SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *di
}
}
}
-
+
return pt;
}
@@ -1199,21 +746,21 @@ SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short
ARegion *ar = CTX_wm_region(C);
SK_Point *pt = NULL;
EditBone *bone;
-
+
for (bone = ebones->first; bone; bone = bone->next)
{
float vec[3];
short pval[2];
int pdist;
-
+
if ((bone->flag & BONE_CONNECTED) == 0)
{
VECCOPY(vec, bone->head);
Mat4MulVecfl(ob->obmat, vec);
project_short_noclip(ar, vec, pval);
-
+
pdist = ABS(pval[0] - mval[0]) + ABS(pval[1] - mval[1]);
-
+
if (pdist < *dist)
{
*dist = pdist;
@@ -1222,14 +769,14 @@ SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short
pt->type = PT_EXACT;
}
}
-
-
+
+
VECCOPY(vec, bone->tail);
Mat4MulVecfl(ob->obmat, vec);
project_short_noclip(ar, vec, pval);
-
+
pdist = ABS(pval[0] - mval[0]) + ABS(pval[1] - mval[1]);
-
+
if (pdist < *dist)
{
*dist = pdist;
@@ -1238,7 +785,7 @@ SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short
pt->type = PT_EXACT;
}
}
-
+
return pt;
}
@@ -1265,21 +812,15 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
SK_Stroke *target;
int closest_index = -1;
int dist = SNAP_MIN_DISTANCE * 2;
-
-// /* If snapping, don't start overdraw */ Can't do that, snap is embed too now
-// if (sk_lastStrokePoint(stk)->mode == PT_SNAP)
-// {
-// return;
-// }
-
+
for (target = sketch->strokes.first; target; target = target->next)
{
if (target != stk)
{
int index;
-
+
SK_Point *spt = sk_snapPointStroke(C, target, dd->mval, &dist, &index, 1);
-
+
if (spt != NULL)
{
sketch->over.target = target;
@@ -1287,7 +828,7 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
}
}
}
-
+
if (sketch->over.target != NULL)
{
if (closest_index > -1)
@@ -1319,7 +860,7 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
int index;
closest_pt = sk_snapPointStroke(C, sketch->over.target, dd->mval, &dist, &index, 1);
-
+
if (closest_pt != NULL)
{
if (sk_lastStrokePoint(stk)->type == PT_EXACT)
@@ -1330,7 +871,7 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
{
sketch->over.count++;
}
-
+
sketch->over.end = index;
}
else
@@ -1347,17 +888,17 @@ int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end)
*start = sketch->over.start;
*end = sketch->over.end;
-
+
if (*start == -1)
{
*start = 0;
}
-
+
if (*end == -1)
{
*end = sketch->over.target->nb_points - 1;
}
-
+
if (*end < *start)
{
int tmp = *start;
@@ -1365,34 +906,34 @@ int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end)
*end = tmp;
retval = 1;
}
-
+
return retval;
}
void sk_endOverdraw(SK_Sketch *sketch)
{
SK_Stroke *stk = sketch->active_stroke;
-
+
if (sk_hasOverdraw(sketch, NULL))
{
int start;
int end;
-
+
if (sk_adjustIndexes(sketch, &start, &end))
{
sk_reverseStroke(stk);
}
-
+
if (stk->nb_points > 1)
{
stk->points->type = sketch->over.target->points[start].type;
sk_lastStrokePoint(stk)->type = sketch->over.target->points[end].type;
}
-
+
sk_insertStrokePoints(sketch->over.target, stk->points, stk->nb_points, start, end);
-
+
sk_removeStroke(sketch, stk);
-
+
sk_resetOverdraw(sketch);
}
}
@@ -1401,11 +942,11 @@ void sk_endOverdraw(SK_Sketch *sketch)
void sk_startStroke(SK_Sketch *sketch)
{
SK_Stroke *stk = sk_createStroke();
-
+
BLI_addtail(&sketch->strokes, stk);
sketch->active_stroke = stk;
- sk_resetOverdraw(sketch);
+ sk_resetOverdraw(sketch);
}
void sk_endStroke(bContext *C, SK_Sketch *sketch)
@@ -1424,7 +965,7 @@ void sk_endStroke(bContext *C, SK_Sketch *sketch)
void sk_updateDrawData(SK_DrawData *dd)
{
dd->type = PT_CONTINUOUS;
-
+
dd->previous_mval[0] = dd->mval[0];
dd->previous_mval[1] = dd->mval[1];
}
@@ -1435,19 +976,19 @@ float sk_distanceDepth(bContext *C, float p1[3], float p2[3])
RegionView3D *rv3d = ar->regiondata;
float vec[3];
float distance;
-
+
VecSubf(vec, p1, p2);
-
+
Projf(vec, vec, rv3d->viewinv[2]);
-
+
distance = VecLength(vec);
-
+
if (Inpf(rv3d->viewinv[2], vec) > 0)
{
distance *= -1;
}
-
- return distance;
+
+ return distance;
}
void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float length, float distance)
@@ -1458,18 +999,18 @@ void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float
float progress = 0;
int i;
-
+
progress = VecLenf(stk->points[start].p, stk->points[start - 1].p);
-
+
for (i = start; i <= end; i++)
{
float ray_start[3], ray_normal[3];
float delta = VecLenf(stk->points[i].p, stk->points[i + 1].p);
short pval[2];
-
+
project_short_noclip(ar, stk->points[i].p, pval);
viewray(ar, v3d, pval, ray_start, ray_normal);
-
+
VecMulf(ray_normal, distance * progress / length);
VecAddf(stk->points[i].p, stk->points[i].p, ray_normal);
@@ -1480,19 +1021,19 @@ void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float
void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData *dd)
{
ARegion *ar = CTX_wm_region(C);
- /* copied from grease pencil, need fixing */
+ /* copied from grease pencil, need fixing */
SK_Point *last = sk_lastStrokePoint(stk);
short cval[2];
float fp[3] = {0, 0, 0};
float dvec[3];
-
+
if (last != NULL)
{
VECCOPY(fp, last->p);
}
-
+
initgrabz(ar->regiondata, fp[0], fp[1], fp[2]);
-
+
/* method taken from editview.c - mouse_cursor() */
project_short_noclip(ar, fp, cval);
window_to_3d_delta(ar, dvec, cval[0] - dd->mval[0], cval[1] - dd->mval[1]);
@@ -1504,20 +1045,22 @@ int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
pt->type = dd->type;
pt->mode = PT_PROJECT;
sk_projectDrawPoint(C, pt->p, stk, dd);
-
+
return 1;
}
int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = ar->regiondata;
SK_Point pt;
-
- sk_initPoint(C, &pt);
-
+
+ sk_initPoint(&pt, dd, rv3d->viewinv[2]);
+
sk_getStrokeDrawPoint(C, &pt, sketch, stk, dd);
sk_appendStrokePoint(stk, &pt);
-
+
return 1;
}
@@ -1528,16 +1071,17 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
if (ts->snap_mode == SCE_SNAP_MODE_VOLUME)
{
- ListBase depth_peels;
DepthPeel *p1, *p2;
float *last_p = NULL;
float dist = FLT_MAX;
float p[3];
-
- depth_peels.first = depth_peels.last = NULL;
-
- peelObjectsContext(C, &depth_peels, dd->mval);
-
+ float size = 0;
+
+ BLI_freelistN(&sketch->depth_peels);
+ sketch->depth_peels.first = sketch->depth_peels.last = NULL;
+
+ peelObjectsContext(C, &sketch->depth_peels, dd->mval);
+
if (stk->nb_points > 0 && stk->points[stk->nb_points - 1].type == PT_CONTINUOUS)
{
last_p = stk->points[stk->nb_points - 1].p;
@@ -1546,19 +1090,20 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
{
last_p = LAST_SNAP_POINT;
}
-
-
- for (p1 = depth_peels.first; p1; p1 = p1->next)
+
+
+ for (p1 = sketch->depth_peels.first; p1; p1 = p1->next)
{
if (p1->flag == 0)
{
float vec[3];
float new_dist;
-
+ float new_size = 0;
+
p2 = NULL;
p1->flag = 1;
-
- /* if peeling objects, take the first and last from each object */
+
+ /* if peeling objects, take the first and last from each object */
if (ts->snap_flag & SCE_SNAP_PEEL_OBJECT)
{
DepthPeel *peel;
@@ -1579,46 +1124,50 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
/* nothing to do here */
}
}
-
+
if (p2)
{
p2->flag = 1;
-
+
VecAddf(vec, p1->p, p2->p);
VecMulf(vec, 0.5f);
+ new_size = VecLenf(p1->p, p2->p);
}
else
{
VECCOPY(vec, p1->p);
}
-
+
if (last_p == NULL)
{
VECCOPY(p, vec);
+ size = new_size;
dist = 0;
break;
}
-
+
new_dist = VecLenf(last_p, vec);
-
+
if (new_dist < dist)
{
VECCOPY(p, vec);
dist = new_dist;
+ size = new_size;
}
}
}
-
+
if (dist != FLT_MAX)
{
pt->type = dd->type;
pt->mode = PT_SNAP;
+ pt->size = size / 2;
VECCOPY(pt->p, p);
-
+
point_added = 1;
}
-
- BLI_freelistN(&depth_peels);
+
+ //BLI_freelistN(&depth_peels);
}
else
{
@@ -1641,7 +1190,7 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
{
spt = sk_snapPointStroke(C, snap_stk, dd->mval, &dist, NULL, 1);
}
-
+
if (spt != NULL)
{
VECCOPY(pt->p, spt->p);
@@ -1656,35 +1205,37 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
pt->type = dd->type;
pt->mode = PT_SNAP;
VECCOPY(pt->p, vec);
-
+
point_added = 1;
}
}
-
+
return point_added;
}
int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
int point_added;
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = ar->regiondata;
SK_Point pt;
-
- sk_initPoint(C, &pt);
+
+ sk_initPoint(&pt, dd, rv3d->viewinv[2]);
point_added = sk_getStrokeSnapPoint(C, &pt, sketch, stk, dd);
-
+
if (point_added)
{
float final_p[3];
float length, distance;
int total;
int i;
-
+
VECCOPY(final_p, pt.p);
-
+
sk_projectDrawPoint(C, pt.p, stk, dd);
sk_appendStrokePoint(stk, &pt);
-
+
/* update all previous point to give smooth Z progresion */
total = 0;
length = 0;
@@ -1697,19 +1248,19 @@ int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_Dra
break;
}
}
-
+
if (total > 1)
{
distance = sk_distanceDepth(C, final_p, stk->points[i].p);
-
+
sk_interpolateDepth(C, stk, i + 1, stk->nb_points - 2, length, distance);
}
-
+
VECCOPY(stk->points[stk->nb_points - 1].p, final_p);
-
+
point_added = 1;
}
-
+
return point_added;
}
@@ -1717,17 +1268,17 @@ void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
{
ToolSettings *ts = CTX_data_tool_settings(C);
int point_added = 0;
-
+
if (snap)
{
point_added = sk_addStrokeSnapPoint(C, sketch, stk, dd);
}
-
+
if (point_added == 0)
{
point_added = sk_addStrokeDrawPoint(C, sketch, stk, dd);
}
-
+
if (stk == sketch->active_stroke && ts->bone_sketching & BONE_SKETCHING_ADJUST)
{
sk_updateOverdraw(C, sketch, stk, dd);
@@ -1737,7 +1288,7 @@ void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
{
int point_added = 0;
-
+
if (snap)
{
point_added = sk_getStrokeSnapPoint(C, pt, sketch, stk, dd);
@@ -1748,45 +1299,13 @@ void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *
{
LAST_SNAP_POINT_VALID = 0;
}
-
+
if (point_added == 0)
{
point_added = sk_getStrokeDrawPoint(C, pt, sketch, stk, dd);
- }
-}
-
-void sk_endContinuousStroke(SK_Stroke *stk)
-{
- stk->points[stk->nb_points - 1].type = PT_EXACT;
-}
-
-void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk)
-{
- if (stk)
- {
- memcpy(&sketch->next_point, stk->points[stk->nb_points - 1].p, sizeof(SK_Point));
- }
-}
-
-int sk_stroke_filtermval(SK_DrawData *dd)
-{
- int retval = 0;
- if (ABS(dd->mval[0] - dd->previous_mval[0]) + ABS(dd->mval[1] - dd->previous_mval[1]) > U.gp_manhattendist)
- {
- retval = 1;
}
-
- return retval;
}
-void sk_initDrawData(SK_DrawData *dd, short mval[2])
-{
- dd->mval[0] = mval[0];
- dd->mval[1] = mval[1];
- dd->previous_mval[0] = -1;
- dd->previous_mval[1] = -1;
- dd->type = PT_EXACT;
-}
/********************************************/
static void* headPoint(void *arg);
@@ -1805,25 +1324,27 @@ static void initIteratorFct(SK_StrokeIterator *iter)
iter->next = nextPoint;
iter->nextN = nextNPoint;
iter->previous = previousPoint;
- iter->stopped = iteratorStopped;
+ iter->stopped = iteratorStopped;
}
static SK_Point* setIteratorValues(SK_StrokeIterator *iter, int index)
{
SK_Point *pt = NULL;
-
+
if (index >= 0 && index < iter->length)
{
pt = &(iter->stroke->points[iter->start + (iter->stride * index)]);
iter->p = pt->p;
iter->no = pt->no;
+ iter->size = pt->size;
}
else
{
iter->p = NULL;
iter->no = NULL;
+ iter->size = 0;
}
-
+
return pt;
}
@@ -1833,7 +1354,7 @@ void initStrokeIterator(BArcIterator *arg, SK_Stroke *stk, int start, int end)
initIteratorFct(iter);
iter->stroke = stk;
-
+
if (start < end)
{
iter->start = start + 1;
@@ -1846,9 +1367,9 @@ void initStrokeIterator(BArcIterator *arg, SK_Stroke *stk, int start, int end)
iter->end = end + 1;
iter->stride = -1;
}
-
+
iter->length = iter->stride * (iter->end - iter->start + 1);
-
+
iter->index = -1;
}
@@ -1857,11 +1378,12 @@ static void* headPoint(void *arg)
{
SK_StrokeIterator *iter = (SK_StrokeIterator*)arg;
SK_Point *result = NULL;
-
+
result = &(iter->stroke->points[iter->start - iter->stride]);
iter->p = result->p;
iter->no = result->no;
-
+ iter->size = result->size;
+
return result;
}
@@ -1869,11 +1391,12 @@ static void* tailPoint(void *arg)
{
SK_StrokeIterator *iter = (SK_StrokeIterator*)arg;
SK_Point *result = NULL;
-
+
result = &(iter->stroke->points[iter->end + iter->stride]);
iter->p = result->p;
iter->no = result->no;
-
+ iter->size = result->size;
+
return result;
}
@@ -1881,7 +1404,7 @@ static void* nextPoint(void *arg)
{
SK_StrokeIterator *iter = (SK_StrokeIterator*)arg;
SK_Point *result = NULL;
-
+
iter->index++;
if (iter->index < iter->length)
{
@@ -1895,7 +1418,7 @@ static void* nextNPoint(void *arg, int n)
{
SK_StrokeIterator *iter = (SK_StrokeIterator*)arg;
SK_Point *result = NULL;
-
+
iter->index += n;
/* check if passed end */
@@ -1926,7 +1449,7 @@ static void* previousPoint(void *arg)
{
SK_StrokeIterator *iter = (SK_StrokeIterator*)arg;
SK_Point *result = NULL;
-
+
if (iter->index > 0)
{
iter->index--;
@@ -1961,18 +1484,18 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
float tmat[3][3];
int head_index = 0;
int i;
-
+
head = NULL;
-
+
Mat4Invert(invmat, obedit->obmat);
-
+
Mat3CpyMat4(tmat, obedit->obmat);
Mat3Transp(tmat);
-
+
for (i = 0; i < stk->nb_points; i++)
{
SK_Point *pt = stk->points + i;
-
+
if (pt->type == PT_EXACT)
{
if (head == NULL)
@@ -1984,14 +1507,14 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
{
EditBone *bone = NULL;
EditBone *new_parent;
-
+
if (i - head_index > 1)
{
SK_StrokeIterator sk_iter;
BArcIterator *iter = (BArcIterator*)&sk_iter;
initStrokeIterator(iter, stk, head_index, i);
-
+
if (ts->bone_sketching_convert == SK_CONVERT_CUT_ADAPTATIVE)
{
bone = subdivideArcBy(ts, arm, arm->edbo, iter, invmat, tmat, nextAdaptativeSubdivision);
@@ -2005,11 +1528,11 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
bone = subdivideArcBy(ts, arm, arm->edbo, iter, invmat, tmat, nextFixedSubdivision);
}
}
-
+
if (bone == NULL)
{
bone = addEditBone(arm, "Bone");
-
+
VECCOPY(bone->head, head->p);
VECCOPY(bone->tail, pt->p);
@@ -2017,10 +1540,10 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
Mat4MulVecfl(invmat, bone->tail);
setBoneRollFromNormal(bone, head->no, invmat, tmat);
}
-
+
new_parent = bone;
bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
-
+
/* move to end of chain */
while (bone->parent != NULL)
{
@@ -2031,9 +1554,9 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
if (parent != NULL)
{
bone->parent = parent;
- bone->flag |= BONE_CONNECTED;
+ bone->flag |= BONE_CONNECTED;
}
-
+
parent = new_parent;
head_index = i;
head = pt;
@@ -2046,7 +1569,7 @@ void sk_convert(bContext *C, SK_Sketch *sketch)
{
ToolSettings *ts = CTX_data_tool_settings(C);
SK_Stroke *stk;
-
+
for (stk = sketch->strokes.first; stk; stk = stk->next)
{
if (stk->selected == 1)
@@ -2079,7 +1602,7 @@ int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture)
float s_p1[3] = {0, 0, 0};
float s_p2[3] = {0, 0, 0};
int g_i;
-
+
project_float(ar, gesture->points[s_i].p, s_p1);
project_float(ar, gesture->points[s_i + 1].p, s_p2);
@@ -2090,37 +1613,37 @@ int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture)
float g_p2[3] = {0, 0, 0};
float vi[3];
float lambda;
-
+
project_float(ar, gesture->points[g_i].p, g_p1);
project_float(ar, gesture->points[g_i + 1].p, g_p2);
-
+
if (LineIntersectLineStrict(s_p1, s_p2, g_p1, g_p2, vi, &lambda))
{
SK_Intersection *isect = MEM_callocN(sizeof(SK_Intersection), "Intersection");
-
+
isect->gesture_index = g_i;
isect->before = s_i;
isect->after = s_i + 1;
isect->stroke = gesture;
-
+
VecSubf(isect->p, gesture->points[s_i + 1].p, gesture->points[s_i].p);
VecMulf(isect->p, lambda);
VecAddf(isect->p, isect->p, gesture->points[s_i].p);
-
+
BLI_addtail(list, isect);
added++;
}
}
}
-
+
return added;
}
int cmpIntersections(void *i1, void *i2)
{
SK_Intersection *isect1 = i1, *isect2 = i2;
-
+
if (isect1->stroke == isect2->stroke)
{
if (isect1->before < isect2->before)
@@ -2143,7 +1666,7 @@ int cmpIntersections(void *i1, void *i2)
}
}
}
-
+
return 0;
}
@@ -2161,13 +1684,13 @@ int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Strok
{
int s_added = 0;
int s_i;
-
+
for (s_i = 0; s_i < stk->nb_points - 1; s_i++)
{
float s_p1[3] = {0, 0, 0};
float s_p2[3] = {0, 0, 0};
int g_i;
-
+
project_float(ar, stk->points[s_i].p, s_p1);
project_float(ar, stk->points[s_i + 1].p, s_p2);
@@ -2177,45 +1700,45 @@ int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Strok
float g_p2[3] = {0, 0, 0};
float vi[3];
float lambda;
-
+
project_float(ar, gesture->points[g_i].p, g_p1);
project_float(ar, gesture->points[g_i + 1].p, g_p2);
-
+
if (LineIntersectLineStrict(s_p1, s_p2, g_p1, g_p2, vi, &lambda))
{
SK_Intersection *isect = MEM_callocN(sizeof(SK_Intersection), "Intersection");
float ray_start[3], ray_end[3];
short mval[2];
-
+
isect->gesture_index = g_i;
isect->before = s_i;
isect->after = s_i + 1;
isect->stroke = stk;
isect->lambda = lambda;
-
+
mval[0] = (short)(vi[0]);
mval[1] = (short)(vi[1]);
viewline(ar, v3d, mval, ray_start, ray_end);
-
+
LineIntersectLine( stk->points[s_i].p,
stk->points[s_i + 1].p,
ray_start,
ray_end,
isect->p,
vi);
-
+
BLI_addtail(list, isect);
s_added++;
}
}
}
-
+
added = MAX2(s_added, added);
}
-
+
BLI_sortlist(list, cmpIntersections);
-
+
return added;
}
@@ -2223,23 +1746,23 @@ int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
{
SK_StrokeIterator sk_iter;
BArcIterator *iter = (BArcIterator*)&sk_iter;
-
+
float CORRELATION_THRESHOLD = 0.99f;
float *vec;
int i, j;
-
+
sk_appendStrokePoint(segments, &gesture->points[0]);
vec = segments->points[segments->nb_points - 1].p;
initStrokeIterator(iter, gesture, 0, gesture->nb_points - 1);
for (i = 1, j = 0; i < gesture->nb_points; i++)
- {
+ {
float n[3];
-
+
/* Calculate normal */
VecSubf(n, gesture->points[i].p, vec);
-
+
if (calcArcCorrelation(iter, j, i, vec, n) < CORRELATION_THRESHOLD)
{
j = i - 1;
@@ -2250,7 +1773,7 @@ int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
}
sk_appendStrokePoint(segments, &gesture->points[gesture->nb_points - 1]);
-
+
return segments->nb_points - 1;
}
@@ -2267,16 +1790,16 @@ int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
-
+
for (isect = gest->intersections.first; isect; isect = isect->next)
{
SK_Point pt;
-
+
pt.type = PT_EXACT;
pt.mode = PT_PROJECT; /* take mode from neighbouring points */
VECCOPY(pt.p, isect->p);
VECCOPY(pt.no, isect->stroke->points[isect->before].no);
-
+
sk_insertStrokePoint(isect->stroke, &pt, isect->after);
}
}
@@ -2287,12 +1810,12 @@ int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
float s1[3], s2[3];
float angle;
-
+
VecSubf(s1, gest->segments->points[1].p, gest->segments->points[0].p);
VecSubf(s2, gest->segments->points[2].p, gest->segments->points[1].p);
-
- angle = VecAngle2(s1, s2);
-
+
+ angle = RAD2DEG(VecAngle2(s1, s2));
+
if (angle > 60 && angle < 120)
{
return 1;
@@ -2306,21 +1829,21 @@ void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
float trim_dir[3];
-
+
VecSubf(trim_dir, gest->segments->points[2].p, gest->segments->points[1].p);
-
+
for (isect = gest->intersections.first; isect; isect = isect->next)
{
SK_Point pt;
float stroke_dir[3];
-
+
pt.type = PT_EXACT;
pt.mode = PT_PROJECT; /* take mode from neighbouring points */
VECCOPY(pt.p, isect->p);
VECCOPY(pt.no, isect->stroke->points[isect->before].no);
-
+
VecSubf(stroke_dir, isect->stroke->points[isect->after].p, isect->stroke->points[isect->before].p);
-
+
/* same direction, trim end */
if (Inpf(stroke_dir, trim_dir) > 0)
{
@@ -2333,7 +1856,7 @@ void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
sk_replaceStrokePoint(isect->stroke, &pt, isect->before);
sk_trimStroke(isect->stroke, isect->before, isect->stroke->nb_points - 1);
}
-
+
}
}
@@ -2342,7 +1865,7 @@ int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 1)
{
SK_Intersection *isect, *self_isect;
-
+
/* get the the last intersection of the first pair */
for( isect = gest->intersections.first; isect; isect = isect->next )
{
@@ -2352,15 +1875,15 @@ int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
break;
}
}
-
+
self_isect = gest->self_intersections.first;
-
+
if (isect && isect->gesture_index < self_isect->gesture_index)
{
return 1;
}
}
-
+
return 0;
}
@@ -2368,7 +1891,7 @@ void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
int command = 1;
-
+
// XXX
// command = pupmenu("Action %t|Flatten %x1|Straighten %x2|Polygonize %x3");
if(command < 1) return;
@@ -2376,9 +1899,9 @@ void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
for (isect = gest->intersections.first; isect; isect = isect->next)
{
SK_Intersection *i2;
-
+
i2 = isect->next;
-
+
if (i2 && i2->stroke == isect->stroke)
{
switch (command)
@@ -2405,32 +1928,32 @@ int sk_detectDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
float s1[3], s2[3];
float angle;
-
+
VecSubf(s1, gest->segments->points[1].p, gest->segments->points[0].p);
VecSubf(s2, gest->segments->points[2].p, gest->segments->points[1].p);
-
- angle = VecAngle2(s1, s2);
-
+
+ angle = RAD2DEG(VecAngle2(s1, s2));
+
if (angle > 120)
{
return 1;
}
}
-
+
return 0;
}
void sk_applyDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
-
+
for (isect = gest->intersections.first; isect; isect = isect->next)
{
/* only delete strokes that are crossed twice */
if (isect->next && isect->next->stroke == isect->stroke)
{
isect = isect->next;
-
+
sk_removeStroke(sketch, isect->stroke);
}
}
@@ -2443,17 +1966,17 @@ int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
short start_val[2], end_val[2];
short dist;
-
+
project_short_noclip(ar, gest->stk->points[0].p, start_val);
project_short_noclip(ar, sk_lastStrokePoint(gest->stk)->p, end_val);
-
+
dist = MAX2(ABS(start_val[0] - end_val[0]), ABS(start_val[1] - end_val[1]));
-
+
/* if gesture is a circle */
if ( dist <= 20 )
{
SK_Intersection *isect;
-
+
/* check if it circled around an exact point */
for (isect = gest->intersections.first; isect; isect = isect->next)
{
@@ -2462,10 +1985,10 @@ int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
int start_index, end_index;
int i;
-
+
start_index = MIN2(isect->after, isect->next->after);
end_index = MAX2(isect->before, isect->next->before);
-
+
for (i = start_index; i <= end_index; i++)
{
if (isect->stroke->points[i].type == PT_EXACT)
@@ -2473,21 +1996,21 @@ int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 1; /* at least one exact point found, stop detect here */
}
}
-
- /* skip next */
+
+ /* skip next */
isect = isect->next;
}
}
}
}
-
+
return 0;
}
void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
-
+
/* check if it circled around an exact point */
for (isect = gest->intersections.first; isect; isect = isect->next)
{
@@ -2496,7 +2019,7 @@ void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
int start_index, end_index;
int i;
-
+
start_index = MIN2(isect->after, isect->next->after);
end_index = MAX2(isect->before, isect->next->before);
@@ -2509,7 +2032,7 @@ void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
- /* skip next */
+ /* skip next */
isect = isect->next;
}
}
@@ -2520,7 +2043,7 @@ int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 0)
{
SK_Intersection *isect;
-
+
/* check if it circled around an exact point */
for (isect = gest->intersections.first; isect; isect = isect->next)
{
@@ -2529,7 +2052,7 @@ int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
float start_v[3], end_v[3];
float angle;
-
+
if (isect->gesture_index < isect->next->gesture_index)
{
VecSubf(start_v, isect->p, gest->stk->points[0].p);
@@ -2540,27 +2063,27 @@ int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
VecSubf(start_v, isect->next->p, gest->stk->points[0].p);
VecSubf(end_v, sk_lastStrokePoint(gest->stk)->p, isect->p);
}
-
- angle = VecAngle2(start_v, end_v);
-
+
+ angle = RAD2DEG(VecAngle2(start_v, end_v));
+
if (angle > 120)
{
return 1;
}
-
- /* skip next */
+
+ /* skip next */
isect = isect->next;
}
}
}
-
+
return 0;
}
void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
-
+
for (isect = gest->intersections.first; isect; isect = isect->next)
{
/* only reverse strokes that are crossed twice */
@@ -2568,7 +2091,7 @@ void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
sk_reverseStroke(isect->stroke);
- /* skip next */
+ /* skip next */
isect = isect->next;
}
}
@@ -2592,7 +2115,7 @@ static void sk_initGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
{
gest->intersections.first = gest->intersections.last = NULL;
gest->self_intersections.first = gest->self_intersections.last = NULL;
-
+
gest->segments = sk_createStroke();
gest->stk = sketch->gesture;
@@ -2612,9 +2135,9 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch)
{
SK_Gesture gest;
SK_GestureAction *act;
-
+
sk_initGesture(C, &gest, sketch);
-
+
/* detect and apply */
for (act = GESTURE_ACTIONS; act->apply != NULL; act++)
{
@@ -2624,62 +2147,12 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch)
break;
}
}
-
+
sk_freeGesture(&gest);
}
/********************************************/
-void sk_deleteSelectedStrokes(SK_Sketch *sketch)
-{
- SK_Stroke *stk, *next;
-
- for (stk = sketch->strokes.first; stk; stk = next)
- {
- next = stk->next;
-
- if (stk->selected == 1)
- {
- sk_removeStroke(sketch, stk);
- }
- }
-}
-
-void sk_selectAllSketch(SK_Sketch *sketch, int mode)
-{
- SK_Stroke *stk = NULL;
-
- if (mode == -1)
- {
- for (stk = sketch->strokes.first; stk; stk = stk->next)
- {
- stk->selected = 0;
- }
- }
- else if (mode == 0)
- {
- for (stk = sketch->strokes.first; stk; stk = stk->next)
- {
- stk->selected = 1;
- }
- }
- else if (mode == 1)
- {
- int selected = 1;
-
- for (stk = sketch->strokes.first; stk; stk = stk->next)
- {
- selected &= stk->selected;
- }
-
- selected ^= 1;
-
- for (stk = sketch->strokes.first; stk; stk = stk->next)
- {
- stk->selected = selected;
- }
- }
-}
void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
{
@@ -2687,20 +2160,20 @@ void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
rcti rect;
unsigned int buffer[MAXPICKBUF];
short hits;
-
+
view3d_set_viewcontext(C, &vc);
-
+
rect.xmin= mval[0]-5;
rect.xmax= mval[0]+5;
rect.ymin= mval[1]-5;
rect.ymax= mval[1]+5;
-
+
hits = view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
if (hits>0)
{
int besthitresult = -1;
-
+
if(hits == 1) {
besthitresult = buffer[3];
}
@@ -2708,23 +2181,23 @@ void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
besthitresult = buffer[3];
/* loop and get best hit */
}
-
+
if (besthitresult > 0)
{
SK_Stroke *selected_stk = BLI_findlink(&sketch->strokes, besthitresult - 1);
-
+
if (extend == 0)
{
sk_selectAllSketch(sketch, -1);
-
+
selected_stk->selected = 1;
}
else
{
selected_stk->selected ^= 1;
}
-
-
+
+
}
}
}
@@ -2734,7 +2207,7 @@ void sk_queueRedrawSketch(SK_Sketch *sketch)
if (sketch->active_stroke != NULL)
{
SK_Point *last = sk_lastStrokePoint(sketch->active_stroke);
-
+
if (last != NULL)
{
// XXX
@@ -2743,16 +2216,14 @@ void sk_queueRedrawSketch(SK_Sketch *sketch)
}
}
-void sk_drawSketch(Scene *scene, SK_Sketch *sketch, int with_names)
+void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names)
{
ToolSettings *ts= scene->toolsettings;
SK_Stroke *stk;
-
- glDisable(GL_DEPTH_TEST);
- glLineWidth(UI_GetThemeValuef(TH_VERTEX_SIZE));
- glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
-
+ glClear(GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+
if (with_names)
{
int id;
@@ -2760,61 +2231,51 @@ void sk_drawSketch(Scene *scene, SK_Sketch *sketch, int with_names)
{
sk_drawStroke(stk, id, NULL, -1, -1);
}
-
+
glLoadName(-1);
}
else
{
float selected_rgb[3] = {1, 0, 0};
float unselected_rgb[3] = {1, 0.5, 0};
-
+
for (stk = sketch->strokes.first; stk; stk = stk->next)
{
int start = -1;
int end = -1;
-
+
if (sk_hasOverdraw(sketch, stk))
{
sk_adjustIndexes(sketch, &start, &end);
}
-
+
sk_drawStroke(stk, -1, (stk->selected==1?selected_rgb:unselected_rgb), start, end);
-
+
if (stk->selected == 1)
{
sk_drawStrokeSubdivision(ts, stk);
}
}
-
- /* only draw gesture in active area */
- if (sketch->gesture != NULL /*&& area_is_active_area(G.vd->area)*/)
- {
- float gesture_rgb[3] = {0, 0.5, 1};
- sk_drawStroke(sketch->gesture, -1, gesture_rgb, -1, -1);
- }
-
+
if (sketch->active_stroke != NULL)
{
SK_Point *last = sk_lastStrokePoint(sketch->active_stroke);
-
+
if (ts->bone_sketching & BONE_SKETCHING_QUICK)
{
sk_drawStrokeSubdivision(ts, sketch->active_stroke);
}
-
+
if (last != NULL)
{
- glEnable(GL_LINE_STIPPLE);
- glColor3fv(selected_rgb);
- glBegin(GL_LINE_STRIP);
-
- glVertex3fv(last->p);
- glVertex3fv(sketch->next_point.p);
-
- glEnd();
-
- glDisable(GL_LINE_STIPPLE);
-
+ GLUquadric *quad = gluNewQuadric();
+ gluQuadricNormals(quad, GLU_SMOOTH);
+
+ glPushMatrix();
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
switch (sketch->next_point.mode)
{
case PT_SNAP:
@@ -2824,20 +2285,63 @@ void sk_drawSketch(Scene *scene, SK_Sketch *sketch, int with_names)
glColor3f(0, 0, 0);
break;
}
-
- glBegin(GL_POINTS);
-
- glVertex3fv(sketch->next_point.p);
-
- glEnd();
+
+ sk_drawPoint(quad, &sketch->next_point, 0.1);
+
+ glColor4f(selected_rgb[0], selected_rgb[1], selected_rgb[2], 0.3);
+
+ sk_drawEdge(quad, last, &sketch->next_point, 0.1);
+
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+
+ gluDeleteQuadric(quad);
}
}
}
-
- glLineWidth(1.0);
- glPointSize(1.0);
- glEnable(GL_DEPTH_TEST);
+#if 1
+ if (sketch->depth_peels.first != NULL)
+ {
+ float colors[8][3] = {
+ {1, 0, 0},
+ {0, 1, 0},
+ {0, 0, 1},
+ {1, 1, 0},
+ {1, 0, 1},
+ {0, 1, 1},
+ {1, 1, 1},
+ {0, 0, 0}
+ };
+ DepthPeel *p;
+ GLUquadric *quad = gluNewQuadric();
+ gluQuadricNormals(quad, GLU_SMOOTH);
+
+ for (p = sketch->depth_peels.first; p; p = p->next)
+ {
+ int index = GET_INT_FROM_POINTER(p->ob);
+ index = (index >> 5) & 7;
+
+ glColor3fv(colors[index]);
+ glPushMatrix();
+ glTranslatef(p->p[0], p->p[1], p->p[2]);
+ gluSphere(quad, 0.02, 8, 8);
+ glPopMatrix();
+ }
+
+ gluDeleteQuadric(quad);
+ }
+#endif
+
+ glDisable(GL_DEPTH_TEST);
+
+ /* only draw gesture in active area */
+ if (sketch->gesture != NULL /*&& area_is_active_area(G.vd->area)*/)
+ {
+ float gesture_rgb[3] = {0, 0.5, 1};
+ sk_drawStroke(sketch->gesture, -1, gesture_rgb, -1, -1);
+ }
}
int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
@@ -2847,9 +2351,9 @@ int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
if (sketch->active_stroke != NULL)
{
SK_Stroke *stk = sketch->active_stroke;
-
+
sk_endStroke(C, sketch);
-
+
if (ts->bone_sketching & BONE_SKETCHING_QUICK)
{
if (ts->bone_sketching_convert == SK_CONVERT_RETARGET)
@@ -2867,11 +2371,11 @@ int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
// allqueue(REDRAWBUTSEDIT, 0);
}
-// XXX
+// XXX
// allqueue(REDRAWVIEW3D, 0);
return 1;
}
-
+
return 0;
}
@@ -2881,7 +2385,7 @@ void sk_start_draw_stroke(SK_Sketch *sketch)
{
sk_startStroke(sketch);
sk_selectAllSketch(sketch, -1);
-
+
sketch->active_stroke->selected = 1;
}
}
@@ -2898,9 +2402,10 @@ int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *
sk_addStrokePoint(C, sketch, stk, dd, snap);
sk_updateDrawData(dd);
sk_updateNextPoint(sketch, stk);
+
return 1;
}
-
+
return 0;
}
@@ -2908,9 +2413,9 @@ static int ValidSketchViewContext(ViewContext *vc)
{
Object *obedit = vc->obedit;
Scene *scene= vc->scene;
-
- if (obedit &&
- obedit->type == OB_ARMATURE &&
+
+ if (obedit &&
+ obedit->type == OB_ARMATURE &&
scene->toolsettings->bone_sketching & BONE_SKETCHING)
{
return 1;
@@ -2925,32 +2430,35 @@ int BDR_drawSketchNames(ViewContext *vc)
{
if (ValidSketchViewContext(vc))
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = viewcontextSketch(vc, 0);
+ if (sketch)
{
- sk_drawSketch(vc->scene, GLOBAL_sketch, 1);
+ sk_drawSketch(vc->scene, vc->v3d, sketch, 1);
return 1;
}
}
-
+
return 0;
}
-void BDR_drawSketch(bContext *C)
+void BDR_drawSketch(const bContext *C)
{
if (ED_operator_sketch_mode(C))
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
{
- sk_drawSketch(CTX_data_scene(C), GLOBAL_sketch, 0);
+ sk_drawSketch(CTX_data_scene(C), CTX_wm_view3d(C), sketch, 0);
}
}
}
static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
{
- sk_deleteSelectedStrokes(GLOBAL_sketch);
+ sk_deleteSelectedStrokes(sketch);
// allqueue(REDRAWVIEW3D, 0);
}
return OPERATOR_FINISHED;
@@ -2958,9 +2466,12 @@ static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
void BIF_sk_selectStroke(bContext *C, short mval[2], short extend)
{
- if (GLOBAL_sketch != NULL)
+ ToolSettings *ts = CTX_data_tool_settings(C);
+ SK_Sketch *sketch = contextSketch(C, 0);
+
+ if (sketch != NULL && ts->bone_sketching & BONE_SKETCHING)
{
- sk_selectStroke(C, GLOBAL_sketch, mval, extend);
+ sk_selectStroke(C, sketch, mval, extend);
}
}
@@ -2968,9 +2479,10 @@ void BIF_convertSketch(bContext *C)
{
if (ED_operator_sketch_full_mode(C))
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
{
- sk_convert(C, GLOBAL_sketch);
+ sk_convert(C, sketch);
// BIF_undo_push("Convert Sketch");
// allqueue(REDRAWVIEW3D, 0);
// allqueue(REDRAWBUTSEDIT, 0);
@@ -2982,42 +2494,76 @@ void BIF_deleteSketch(bContext *C)
{
if (ED_operator_sketch_full_mode(C))
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
{
- sk_deleteSelectedStrokes(GLOBAL_sketch);
+ sk_deleteSelectedStrokes(sketch);
// BIF_undo_push("Convert Sketch");
// allqueue(REDRAWVIEW3D, 0);
}
}
}
-//void BIF_selectAllSketch(bContext *C, int mode)
-//{
-// if (BIF_validSketchMode(C))
-// {
-// if (GLOBAL_sketch != NULL)
-// {
-// sk_selectAllSketch(GLOBAL_sketch, mode);
-//// XXX
-//// allqueue(REDRAWVIEW3D, 0);
-// }
-// }
-//}
+#if 0
+void BIF_selectAllSketch(bContext *C, int mode)
+{
+ if (BIF_validSketchMode(C))
+ {
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
+ {
+ sk_selectAllSketch(sketch, mode);
+// XXX
+// allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+}
+#endif
-void BIF_freeSketch(bContext *C)
+SK_Sketch* contextSketch(const bContext *C, int create)
{
- if (GLOBAL_sketch != NULL)
+ Object *obedit = CTX_data_edit_object(C);
+ SK_Sketch *sketch = NULL;
+
+ if (obedit && obedit->type == OB_ARMATURE)
{
- sk_freeSketch(GLOBAL_sketch);
- GLOBAL_sketch = NULL;
+ bArmature *arm = obedit->data;
+
+ if (arm->sketch == NULL && create)
+ {
+ arm->sketch = createSketch();
+ }
+ sketch = arm->sketch;
+ }
+
+ return sketch;
+}
+
+SK_Sketch* viewcontextSketch(ViewContext *vc, int create)
+{
+ Object *obedit = vc->obedit;
+ SK_Sketch *sketch = NULL;
+
+ if (obedit && obedit->type == OB_ARMATURE)
+ {
+ bArmature *arm = obedit->data;
+
+ if (arm->sketch == NULL && create)
+ {
+ arm->sketch = createSketch();
+ }
+ sketch = arm->sketch;
}
+
+ return sketch;
}
static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch != NULL)
{
- sk_cancelStroke(GLOBAL_sketch);
+ sk_cancelStroke(sketch);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
@@ -3026,9 +2572,10 @@ static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch != NULL)
{
- if (sk_finish_stroke(C, GLOBAL_sketch))
+ if (sk_finish_stroke(C, sketch))
{
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -3039,20 +2586,22 @@ static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
static int sketch_select(bContext *C, wmOperator *op, wmEvent *event)
{
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+ if (sketch)
{
short extend = 0;
- sk_selectStroke(C, GLOBAL_sketch, event->mval, extend);
+ sk_selectStroke(C, sketch, event->mval, extend);
ED_area_tag_redraw(CTX_wm_area(C));
}
-
+
return OPERATOR_FINISHED;
}
static int sketch_draw_stroke_cancel(bContext *C, wmOperator *op)
{
- sk_cancelStroke(GLOBAL_sketch);
- MEM_freeN(op->customdata);
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
+ sk_cancelStroke(sketch);
+ MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
@@ -3060,28 +2609,25 @@ static int sketch_draw_stroke(bContext *C, wmOperator *op, wmEvent *event)
{
short snap = RNA_boolean_get(op->ptr, "snap");
SK_DrawData *dd;
-
- if (GLOBAL_sketch == NULL)
- {
- GLOBAL_sketch = sk_createSketch();
- }
-
+ SK_Sketch *sketch = contextSketch(C, 1);
+
op->customdata = dd = MEM_callocN(sizeof("SK_DrawData"), "SketchDrawData");
sk_initDrawData(dd, event->mval);
-
- sk_start_draw_stroke(GLOBAL_sketch);
-
- sk_draw_stroke(C, GLOBAL_sketch, GLOBAL_sketch->active_stroke, dd, snap);
-
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+
+ sk_start_draw_stroke(sketch);
+
+ sk_draw_stroke(C, sketch, sketch->active_stroke, dd, snap);
+
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
static int sketch_draw_gesture_cancel(bContext *C, wmOperator *op)
{
- sk_cancelStroke(GLOBAL_sketch);
- MEM_freeN(op->customdata);
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
+ sk_cancelStroke(sketch);
+ MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
@@ -3089,19 +2635,16 @@ static int sketch_draw_gesture(bContext *C, wmOperator *op, wmEvent *event)
{
short snap = RNA_boolean_get(op->ptr, "snap");
SK_DrawData *dd;
-
- if (GLOBAL_sketch == NULL)
- {
- GLOBAL_sketch = sk_createSketch();
- }
-
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
+ sk_cancelStroke(sketch);
+
op->customdata = dd = MEM_callocN(sizeof("SK_DrawData"), "SketchDrawData");
sk_initDrawData(dd, event->mval);
-
- sk_start_draw_gesture(GLOBAL_sketch);
- sk_draw_stroke(C, GLOBAL_sketch, GLOBAL_sketch->gesture, dd, snap);
-
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+
+ sk_start_draw_gesture(sketch);
+ sk_draw_stroke(C, sketch, sketch->gesture, dd, snap);
+
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -3110,8 +2653,9 @@ static int sketch_draw_modal(bContext *C, wmOperator *op, wmEvent *event, short
{
short snap = RNA_boolean_get(op->ptr, "snap");
SK_DrawData *dd = op->customdata;
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
int retval = OPERATOR_RUNNING_MODAL;
-
+
switch (event->type)
{
case LEFTCTRLKEY:
@@ -3122,7 +2666,7 @@ static int sketch_draw_modal(bContext *C, wmOperator *op, wmEvent *event, short
case MOUSEMOVE:
dd->mval[0] = event->mval[0];
dd->mval[1] = event->mval[1];
- sk_draw_stroke(C, GLOBAL_sketch, stk, dd, snap);
+ sk_draw_stroke(C, sketch, stk, dd, snap);
ED_area_tag_redraw(CTX_wm_area(C));
break;
case ESCKEY:
@@ -3131,66 +2675,68 @@ static int sketch_draw_modal(bContext *C, wmOperator *op, wmEvent *event, short
retval = OPERATOR_CANCELLED;
break;
case LEFTMOUSE:
- if (event->val == 0)
+ if (event->val == KM_RELEASE)
{
if (gesture == 0)
{
sk_endContinuousStroke(stk);
sk_filterLastContinuousStroke(stk);
- sk_updateNextPoint(GLOBAL_sketch, stk);
+ sk_updateNextPoint(sketch, stk);
ED_area_tag_redraw(CTX_wm_area(C));
- MEM_freeN(op->customdata);
+ MEM_freeN(op->customdata);
retval = OPERATOR_FINISHED;
}
else
{
sk_endContinuousStroke(stk);
sk_filterLastContinuousStroke(stk);
-
- if (stk->nb_points > 1)
+
+ if (stk->nb_points > 1)
{
/* apply gesture here */
- sk_applyGesture(C, GLOBAL_sketch);
+ sk_applyGesture(C, sketch);
}
-
+
sk_freeStroke(stk);
- GLOBAL_sketch->gesture = NULL;
-
+ sketch->gesture = NULL;
+
ED_area_tag_redraw(CTX_wm_area(C));
- MEM_freeN(op->customdata);
+ MEM_freeN(op->customdata);
retval = OPERATOR_FINISHED;
}
}
break;
}
-
+
return retval;
}
static int sketch_draw_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- return sketch_draw_modal(C, op, event, 0, GLOBAL_sketch->active_stroke);
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
+ return sketch_draw_modal(C, op, event, 0, sketch->active_stroke);
}
static int sketch_draw_gesture_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- return sketch_draw_modal(C, op, event, 1, GLOBAL_sketch->gesture);
+ SK_Sketch *sketch = contextSketch(C, 1); /* create just to be sure */
+ return sketch_draw_modal(C, op, event, 1, sketch->gesture);
}
static int sketch_draw_preview(bContext *C, wmOperator *op, wmEvent *event)
{
short snap = RNA_boolean_get(op->ptr, "snap");
-
- if (GLOBAL_sketch != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+
+ if (sketch)
{
- SK_Sketch *sketch = GLOBAL_sketch;
SK_DrawData dd;
-
+
sk_initDrawData(&dd, event->mval);
sk_getStrokePoint(C, &sketch->next_point, sketch, sketch->active_stroke, &dd, snap);
ED_area_tag_redraw(CTX_wm_area(C));
}
-
+
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
@@ -3198,14 +2744,12 @@ static int sketch_draw_preview(bContext *C, wmOperator *op, wmEvent *event)
int ED_operator_sketch_mode_active_stroke(bContext *C)
{
- Object *obedit = CTX_data_edit_object(C);
ToolSettings *ts = CTX_data_tool_settings(C);
-
- if (obedit &&
- obedit->type == OB_ARMATURE &&
- ts->bone_sketching & BONE_SKETCHING &&
- GLOBAL_sketch != NULL &&
- GLOBAL_sketch->active_stroke != NULL)
+ SK_Sketch *sketch = contextSketch(C, 0);
+
+ if (ts->bone_sketching & BONE_SKETCHING &&
+ sketch != NULL &&
+ sketch->active_stroke != NULL)
{
return 1;
}
@@ -3217,15 +2761,13 @@ int ED_operator_sketch_mode_active_stroke(bContext *C)
int ED_operator_sketch_mode_gesture(bContext *C)
{
- Object *obedit = CTX_data_edit_object(C);
ToolSettings *ts = CTX_data_tool_settings(C);
-
- if (obedit &&
- obedit->type == OB_ARMATURE &&
- ts->bone_sketching & BONE_SKETCHING &&
+ SK_Sketch *sketch = contextSketch(C, 0);
+
+ if (ts->bone_sketching & BONE_SKETCHING &&
(ts->bone_sketching & BONE_SKETCHING_QUICK) == 0 &&
- GLOBAL_sketch != NULL &&
- GLOBAL_sketch->active_stroke == NULL)
+ sketch != NULL &&
+ sketch->active_stroke == NULL)
{
return 1;
}
@@ -3239,10 +2781,10 @@ int ED_operator_sketch_full_mode(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
ToolSettings *ts = CTX_data_tool_settings(C);
-
- if (obedit &&
- obedit->type == OB_ARMATURE &&
- ts->bone_sketching & BONE_SKETCHING &&
+
+ if (obedit &&
+ obedit->type == OB_ARMATURE &&
+ ts->bone_sketching & BONE_SKETCHING &&
(ts->bone_sketching & BONE_SKETCHING_QUICK) == 0)
{
return 1;
@@ -3253,13 +2795,13 @@ int ED_operator_sketch_full_mode(bContext *C)
}
}
-int ED_operator_sketch_mode(bContext *C)
+int ED_operator_sketch_mode(const bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
ToolSettings *ts = CTX_data_tool_settings(C);
-
- if (obedit &&
- obedit->type == OB_ARMATURE &&
+
+ if (obedit &&
+ obedit->type == OB_ARMATURE &&
ts->bone_sketching & BONE_SKETCHING)
{
return 1;
@@ -3277,12 +2819,12 @@ void SKETCH_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "delete";
ot->idname= "SKETCH_OT_delete";
-
+
/* api callbacks */
ot->invoke= sketch_delete;
-
+
ot->poll= ED_operator_sketch_full_mode;
-
+
/* flags */
// ot->flag= OPTYPE_UNDO;
}
@@ -3292,12 +2834,12 @@ void SKETCH_OT_select(wmOperatorType *ot)
/* identifiers */
ot->name= "select";
ot->idname= "SKETCH_OT_select";
-
+
/* api callbacks */
ot->invoke= sketch_select;
-
+
ot->poll= ED_operator_sketch_full_mode;
-
+
/* flags */
// ot->flag= OPTYPE_UNDO;
}
@@ -3307,12 +2849,12 @@ void SKETCH_OT_cancel_stroke(wmOperatorType *ot)
/* identifiers */
ot->name= "cancel stroke";
ot->idname= "SKETCH_OT_cancel_stroke";
-
+
/* api callbacks */
ot->invoke= sketch_cancel;
-
+
ot->poll= ED_operator_sketch_mode_active_stroke;
-
+
/* flags */
// ot->flag= OPTYPE_UNDO;
}
@@ -3322,12 +2864,12 @@ void SKETCH_OT_finish_stroke(wmOperatorType *ot)
/* identifiers */
ot->name= "end stroke";
ot->idname= "SKETCH_OT_finish_stroke";
-
+
/* api callbacks */
ot->invoke= sketch_finish;
-
+
ot->poll= ED_operator_sketch_mode_active_stroke;
-
+
/* flags */
// ot->flag= OPTYPE_UNDO;
}
@@ -3337,12 +2879,12 @@ void SKETCH_OT_draw_preview(wmOperatorType *ot)
/* identifiers */
ot->name= "draw preview";
ot->idname= "SKETCH_OT_draw_preview";
-
+
/* api callbacks */
ot->invoke= sketch_draw_preview;
-
+
ot->poll= ED_operator_sketch_mode_active_stroke;
-
+
RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
/* flags */
@@ -3354,18 +2896,18 @@ void SKETCH_OT_draw_stroke(wmOperatorType *ot)
/* identifiers */
ot->name= "draw stroke";
ot->idname= "SKETCH_OT_draw_stroke";
-
+
/* api callbacks */
ot->invoke = sketch_draw_stroke;
ot->modal = sketch_draw_stroke_modal;
ot->cancel = sketch_draw_stroke_cancel;
-
- ot->poll= ED_operator_sketch_mode;
-
+
+ ot->poll= (int (*)(bContext *))ED_operator_sketch_mode;
+
RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
-
+
/* flags */
-// ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_BLOCKING; // OPTYPE_REGISTER|OPTYPE_UNDO
}
void SKETCH_OT_gesture(wmOperatorType *ot)
@@ -3373,16 +2915,17 @@ void SKETCH_OT_gesture(wmOperatorType *ot)
/* identifiers */
ot->name= "gesture";
ot->idname= "SKETCH_OT_gesture";
-
+
/* api callbacks */
ot->invoke = sketch_draw_gesture;
ot->modal = sketch_draw_gesture_modal;
ot->cancel = sketch_draw_gesture_cancel;
-
+
ot->poll= ED_operator_sketch_mode_gesture;
-
+
RNA_def_boolean(ot->srna, "snap", 0, "Snap", "");
-
+
/* flags */
-// ot->flag= OPTYPE_UNDO;
+ ot->flag= OPTYPE_BLOCKING; // OPTYPE_UNDO
}
+
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index 8807b21e653..81e67c4d46e 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -65,7 +65,7 @@
/* ************* XXX *************** */
-static void waitcursor() {}
+static void waitcursor(int val) {}
static void progress_bar() {}
static void start_progress_bar() {}
static void end_progress_bar() {}
@@ -176,9 +176,9 @@ static void laplacian_triangle_area(LaplacianSystem *sys, int i1, int i2, int i3
t2= cotan_weight(v2, v3, v1);
t3= cotan_weight(v3, v1, v2);
- if(VecAngle3(v2, v1, v3) > 90) obtuse= 1;
- else if(VecAngle3(v1, v2, v3) > 90) obtuse= 2;
- else if(VecAngle3(v1, v3, v2) > 90) obtuse= 3;
+ if(RAD2DEG(VecAngle3(v2, v1, v3)) > 90) obtuse= 1;
+ else if(RAD2DEG(VecAngle3(v1, v2, v3)) > 90) obtuse= 2;
+ else if(RAD2DEG(VecAngle3(v1, v3, v2)) > 90) obtuse= 3;
if (obtuse > 0) {
area= AreaT3Dfl(v1, v2, v3);
@@ -672,9 +672,9 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
/* clear weights */
if(bbone && firstsegment) {
for(a=0; a<me->totvert; a++) {
- remove_vert_defgroup(ob, dgrouplist[j], a);
+ ED_vgroup_vert_remove(ob, dgrouplist[j], a);
if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0)
- remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ ED_vgroup_vert_remove(ob, dgroupflip[j], vertsflipped[a]);
}
}
@@ -694,32 +694,32 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
if(bbone) {
if(solution > 0.0f)
- add_vert_to_defgroup(ob, dgrouplist[j], a, solution,
+ ED_vgroup_vert_add(ob, dgrouplist[j], a, solution,
WEIGHT_ADD);
}
else {
weight= heat_limit_weight(solution);
if(weight > 0.0f)
- add_vert_to_defgroup(ob, dgrouplist[j], a, weight,
+ ED_vgroup_vert_add(ob, dgrouplist[j], a, weight,
WEIGHT_REPLACE);
else
- remove_vert_defgroup(ob, dgrouplist[j], a);
+ ED_vgroup_vert_remove(ob, dgrouplist[j], a);
}
/* do same for mirror */
if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0) {
if(bbone) {
if(solution > 0.0f)
- add_vert_to_defgroup(ob, dgroupflip[j], vertsflipped[a],
+ ED_vgroup_vert_add(ob, dgroupflip[j], vertsflipped[a],
solution, WEIGHT_ADD);
}
else {
weight= heat_limit_weight(solution);
if(weight > 0.0f)
- add_vert_to_defgroup(ob, dgroupflip[j], vertsflipped[a],
+ ED_vgroup_vert_add(ob, dgroupflip[j], vertsflipped[a],
weight, WEIGHT_REPLACE);
else
- remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ ED_vgroup_vert_remove(ob, dgroupflip[j], vertsflipped[a]);
}
}
}
@@ -734,16 +734,16 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones,
/* remove too small vertex weights */
if(bbone && lastsegment) {
for(a=0; a<me->totvert; a++) {
- weight= get_vert_defgroup(ob, dgrouplist[j], a);
+ weight= ED_vgroup_vert_weight(ob, dgrouplist[j], a);
weight= heat_limit_weight(weight);
if(weight <= 0.0f)
- remove_vert_defgroup(ob, dgrouplist[j], a);
+ ED_vgroup_vert_remove(ob, dgrouplist[j], a);
if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0) {
- weight= get_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ weight= ED_vgroup_vert_weight(ob, dgroupflip[j], vertsflipped[a]);
weight= heat_limit_weight(weight);
if(weight <= 0.0f)
- remove_vert_defgroup(ob, dgroupflip[j], vertsflipped[a]);
+ ED_vgroup_vert_remove(ob, dgroupflip[j], vertsflipped[a]);
}
}
}
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
new file mode 100644
index 00000000000..7c63954767f
--- /dev/null
+++ b/source/blender/editors/armature/poseSlide.c
@@ -0,0 +1,936 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009, Blender Foundation, Joshua Leung
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_dlrbTree.h"
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+
+#include "BKE_global.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "BIF_gl.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_keyframes_draw.h"
+#include "ED_keyframing.h"
+#include "ED_keyframes_edit.h"
+#include "ED_screen.h"
+
+#include "armature_intern.h"
+
+/* **************************************************** */
+/* == POSE 'SLIDING' TOOLS ==
+ *
+ * A) Push & Relax, Breakdowner
+ * These tools provide the animator with various capabilities
+ * for interactively controlling the spacing of poses, but also
+ * for 'pushing' and/or 'relaxing' extremes as they see fit.
+ *
+ * B) Pose Sculpting
+ * This is yet to be implemented, but the idea here is to use
+ * sculpting techniques to make it easier to pose rigs by allowing
+ * rigs to be manipulated using a familiar paint-based interface.
+ */
+/* **************************************************** */
+/* A) Push & Relax, Breakdowner */
+
+/* Temporary data shared between these operators */
+typedef struct tPoseSlideOp {
+ Scene *scene; /* current scene */
+ ARegion *ar; /* region that we're operating in (needed for */
+ Object *ob; /* active object that Pose Info comes from */
+ bArmature *arm; /* armature for pose */
+
+ ListBase pfLinks; /* links between posechannels and f-curves */
+ DLRBT_Tree keys; /* binary tree for quicker searching for keyframes (when applicable) */
+
+ KeyingSet *ks_loc; /* builtin KeyingSet for keyframing locations */
+ KeyingSet *ks_rot; /* builtin KeyingSet for keyframing rotations */
+ KeyingSet *ks_scale;/* builtin KeyingSet for keyframing scale */
+
+ int cframe; /* current frame number */
+ int prevFrame; /* frame before current frame (blend-from) */
+ int nextFrame; /* frame after current frame (blend-to) */
+
+ int mode; /* sliding mode (ePoseSlide_Modes) */
+ int flag; // unused for now, but can later get used for storing runtime settings....
+
+ float percentage; /* 0-1 value for determining the influence of whatever is relevant */
+} tPoseSlideOp;
+
+/* Pose Sliding Modes */
+typedef enum ePoseSlide_Modes {
+ POSESLIDE_PUSH = 0, /* exaggerate the pose... */
+ POSESLIDE_RELAX, /* soften the pose... */
+ POSESLIDE_BREAKDOWN, /* slide between the endpoint poses, finding a 'soft' spot */
+} ePoseSlide_Modes;
+
+/* Temporary data linking PoseChannels with the F-Curves they affect */
+typedef struct tPChanFCurveLink {
+ struct tPChanFCurveLink *next, *prev;
+
+ ListBase fcurves; /* F-Curves for this PoseChannel */
+ bPoseChannel *pchan; /* Pose Channel which data is attached to */
+
+ char *pchan_path; /* RNA Path to this Pose Channel (needs to be freed when we're done) */
+
+ float oldloc[3]; /* transform values at start of operator (to be restored before each modal step) */
+ float oldrot[3];
+ float oldscale[3];
+ float oldquat[4];
+} tPChanFCurveLink;
+
+/* ------------------------------------ */
+
+/* operator init */
+static int pose_slide_init (bContext *C, wmOperator *op, short mode)
+{
+ tPoseSlideOp *pso;
+ bAction *act= NULL;
+
+ /* init slide-op data */
+ pso= op->customdata= MEM_callocN(sizeof(tPoseSlideOp), "tPoseSlideOp");
+
+ /* get info from context */
+ pso->scene= CTX_data_scene(C);
+ pso->ob= 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() */
+
+ pso->cframe= pso->scene->r.cfra;
+ pso->mode= mode;
+
+ /* set range info from property values - these may get overridden for the invoke() */
+ pso->percentage= RNA_float_get(op->ptr, "percentage");
+ pso->prevFrame= RNA_int_get(op->ptr, "prev_frame");
+ pso->nextFrame= RNA_int_get(op->ptr, "next_frame");
+
+ /* check the settings from the context */
+ if (ELEM4(NULL, pso->ob, pso->arm, pso->ob->adt, pso->ob->adt->action))
+ return 0;
+ else
+ act= pso->ob->adt->action;
+
+ /* for each Pose-Channel which gets affected, get the F-Curves for that channel
+ * and set the relevant transform flags...
+ */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ ListBase curves = {NULL, NULL};
+ int transFlags = action_get_item_transforms(act, pso->ob, pchan, &curves);
+
+ pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
+
+ /* check if any transforms found... */
+ if (transFlags) {
+ /* make new linkage data */
+ tPChanFCurveLink *pfl= MEM_callocN(sizeof(tPChanFCurveLink), "tPChanFCurveLink");
+ PointerRNA ptr;
+
+ pfl->fcurves= curves;
+ pfl->pchan= pchan;
+
+ /* get the RNA path to this pchan - this needs to be freed! */
+ RNA_pointer_create((ID *)pso->ob, &RNA_PoseChannel, pchan, &ptr);
+ pfl->pchan_path= RNA_path_from_ID_to_struct(&ptr);
+
+ /* add linkage data to operator data */
+ BLI_addtail(&pso->pfLinks, pfl);
+
+ /* set pchan's transform flags */
+ if (transFlags & ACT_TRANS_LOC)
+ pchan->flag |= POSE_LOC;
+ if (transFlags & ACT_TRANS_ROT)
+ pchan->flag |= POSE_ROT;
+ if (transFlags & ACT_TRANS_SCALE)
+ pchan->flag |= POSE_SIZE;
+
+ /* store current transforms */
+ VECCOPY(pfl->oldloc, pchan->loc);
+ VECCOPY(pfl->oldrot, pchan->eul);
+ VECCOPY(pfl->oldscale, pchan->size);
+ QUATCOPY(pfl->oldquat, pchan->quat);
+ }
+ }
+ CTX_DATA_END;
+
+ /* set depsgraph flags */
+ /* make sure the lock is set OK, unlock can be accidentally saved? */
+ pso->ob->pose->flag |= POSE_LOCKED;
+ pso->ob->pose->flag &= ~POSE_DO_UNLOCK;
+
+ /* do basic initialise of RB-BST used for finding keyframes, but leave the filling of it up
+ * to the caller of this (usually only invoke() will do it, to make things more efficient).
+ */
+ BLI_dlrbTree_init(&pso->keys);
+
+ /* get builtin KeyingSets */
+ pso->ks_loc= ANIM_builtin_keyingset_get_named(NULL, "Location");
+ pso->ks_rot= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
+ pso->ks_scale= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
+
+ /* return status is whether we've got all the data we were requested to get */
+ return 1;
+}
+
+/* exiting the operator - free data */
+static void pose_slide_exit (bContext *C, wmOperator *op)
+{
+ tPoseSlideOp *pso= op->customdata;
+
+ /* if data exists, clear its data and exit */
+ if (pso) {
+ tPChanFCurveLink *pfl, *pfln=NULL;
+
+ /* free the temp pchan links and their data */
+ for (pfl= pso->pfLinks.first; pfl; pfl= pfln) {
+ pfln= pfl->next;
+
+ /* free list of F-Curve reference links */
+ BLI_freelistN(&pfl->fcurves);
+
+ /* free pchan RNA Path */
+ MEM_freeN(pfl->pchan_path);
+
+ /* free link itself */
+ BLI_freelinkN(&pso->pfLinks, pfl);
+ }
+
+ /* free RB-BST for keyframes (if it contained data) */
+ BLI_dlrbTree_free(&pso->keys);
+
+ /* free data itself */
+ MEM_freeN(pso);
+ }
+
+ /* cleanup */
+ op->customdata= NULL;
+}
+
+/* ------------------------------------ */
+
+/* helper for apply() / reset() - refresh the data */
+static void pose_slide_refresh (bContext *C, tPoseSlideOp *pso)
+{
+ /* old optimize trick... this enforces to bypass the depgraph
+ * - note: code copied from transform_generics.c -> recalcData()
+ */
+ // FIXME: shouldn't this use the builtin stuff?
+ if ((pso->arm->flag & ARM_DELAYDEFORM)==0)
+ DAG_id_flush_update(&pso->ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ else
+ where_is_pose(pso->scene, pso->ob);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, pso->ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+}
+
+/* helper for apply() callabcks - find the next F-Curve with matching path... */
+static LinkData *find_next_fcurve_link (ListBase *fcuLinks, LinkData *prev, char *path)
+{
+ LinkData *first= (prev)? prev->next : (fcuLinks)? fcuLinks->first : NULL;
+ LinkData *ld;
+
+ /* check each link to see if the linked F-Curve has a matching path */
+ for (ld= first; ld; ld= ld->next) {
+ FCurve *fcu= (FCurve *)ld->data;
+
+ /* check if paths match */
+ if (strcmp(path, fcu->rna_path) == 0)
+ return ld;
+ }
+
+ /* none found */
+ return NULL;
+}
+
+/* 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)
+{
+ LinkData *ld=NULL;
+ char *path=NULL;
+ float cframe;
+
+ /* get the path to use... */
+ path= BLI_sprintfN("%s.%s", pfl->pchan_path, propName);
+
+ /* get the current frame number */
+ cframe= (float)pso->cframe;
+
+ /* using this path, find each matching F-Curve for the variables we're interested in */
+ while ( (ld= find_next_fcurve_link(&pfl->fcurves, ld, path)) ) {
+ FCurve *fcu= (FCurve *)ld->data;
+ float sVal, eVal;
+ float w1, w2;
+ int ch;
+
+ /* get keyframe values for endpoint poses to blend with */
+ /* previous/start */
+ sVal= evaluate_fcurve(fcu, (float)pso->prevFrame);
+ /* next/end */
+ eVal= evaluate_fcurve(fcu, (float)pso->nextFrame);
+
+ /* get channel index */
+ ch= fcu->array_index;
+
+ /* calculate the relative weights of the endpoints */
+ if (pso->mode == POSESLIDE_BREAKDOWN) {
+ /* get weights from the percentage control */
+ w1= pso->percentage; /* this must come second */
+ w2= 1.0f - w1; /* this must come first */
+ }
+ else {
+ /* - these weights are derived from the relative distance of these
+ * poses from the current frame
+ * - they then get normalised so that they only sum up to 1
+ */
+ float wtot;
+
+ w1 = cframe - (float)pso->prevFrame;
+ w2 = (float)pso->nextFrame - cframe;
+
+ wtot = w1 + w2;
+ w1 = (w1/wtot);
+ w2 = (w2/wtot);
+ }
+
+ /* depending on the mode, calculate the new value
+ * - in all of these, the start+end values are multiplied by w2 and w1 (respectively),
+ * since multiplication in another order would decrease the value the current frame is closer to
+ */
+ switch (pso->mode) {
+ case POSESLIDE_PUSH: /* make the current pose more pronounced */
+ {
+ /* perform a weighted average here, favouring the middle pose
+ * - numerator should be larger than denominator to 'expand' the result
+ * - perform this weighting a number of times given by the percentage...
+ */
+ int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
+
+ while (iters-- > 0) {
+ vec[ch]= ( -((sVal * w2) + (eVal * w1)) + (vec[ch] * 6.0f) ) / 5.0f;
+ }
+ }
+ break;
+
+ case POSESLIDE_RELAX: /* make the current pose more like its surrounding ones */
+ {
+ /* perform a weighted average here, favouring the middle pose
+ * - numerator should be smaller than denominator to 'relax' the result
+ * - perform this weighting a number of times given by the percentage...
+ */
+ int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
+
+ while (iters-- > 0) {
+ vec[ch]= ( ((sVal * w2) + (eVal * w1)) + (vec[ch] * 5.0f) ) / 6.0f;
+ }
+ }
+ break;
+
+ case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
+ {
+ /* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
+ // TODO: make this use some kind of spline interpolation instead?
+ vec[ch]= ((sVal * w2) + (eVal * w1));
+ }
+ break;
+ }
+
+ }
+
+ /* free the temp path we got */
+ MEM_freeN(path);
+}
+
+/* helper for apply() - perform sliding for quaternion rotations (using quat blending) */
+static void pose_slide_apply_quat (tPoseSlideOp *pso, tPChanFCurveLink *pfl)
+{
+ FCurve *fcu_w=NULL, *fcu_x=NULL, *fcu_y=NULL, *fcu_z=NULL;
+ bPoseChannel *pchan= pfl->pchan;
+ LinkData *ld=NULL;
+ char *path=NULL;
+ float cframe;
+
+ /* get the path to use - this should be quaternion rotations only (needs care) */
+ path= BLI_sprintfN("%s.%s", pfl->pchan_path, "rotation");
+
+ /* get the current frame number */
+ cframe= (float)pso->cframe;
+
+ /* using this path, find each matching F-Curve for the variables we're interested in */
+ while ( (ld= find_next_fcurve_link(&pfl->fcurves, ld, path)) ) {
+ FCurve *fcu= (FCurve *)ld->data;
+
+ /* assign this F-Curve to one of the relevant pointers... */
+ switch (fcu->array_index) {
+ case 3: /* z */
+ fcu_z= fcu;
+ break;
+ case 2: /* y */
+ fcu_y= fcu;
+ break;
+ case 1: /* x */
+ fcu_x= fcu;
+ break;
+ case 0: /* w */
+ fcu_w= fcu;
+ break;
+ }
+ }
+
+ /* only if all channels exist, proceed */
+ if (fcu_w && fcu_x && fcu_y && fcu_z) {
+ float quat_prev[4], quat_next[4];
+
+ /* get 2 quats */
+ quat_prev[0] = evaluate_fcurve(fcu_w, pso->prevFrame);
+ quat_prev[1] = evaluate_fcurve(fcu_x, pso->prevFrame);
+ quat_prev[2] = evaluate_fcurve(fcu_y, pso->prevFrame);
+ quat_prev[3] = evaluate_fcurve(fcu_z, pso->prevFrame);
+
+ quat_next[0] = evaluate_fcurve(fcu_w, pso->nextFrame);
+ quat_next[1] = evaluate_fcurve(fcu_x, pso->nextFrame);
+ quat_next[2] = evaluate_fcurve(fcu_y, pso->nextFrame);
+ quat_next[3] = evaluate_fcurve(fcu_z, pso->nextFrame);
+
+ /* perform blending */
+ if (pso->mode == POSESLIDE_BREAKDOWN) {
+ /* just perform the interpol between quat_prev and quat_next using pso->percentage as a guide */
+ QuatInterpol(pchan->quat, quat_prev, quat_next, pso->percentage);
+ }
+ else {
+ float quat_interp[4], quat_orig[4];
+ int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
+
+ /* perform this blending several times until a satisfactory result is reached */
+ while (iters-- > 0) {
+ /* calculate the interpolation between the endpoints */
+ QuatInterpol(quat_interp, quat_prev, quat_next, (cframe-pso->prevFrame) / (pso->nextFrame-pso->prevFrame) );
+
+ /* make a copy of the original rotation */
+ QUATCOPY(quat_orig, pchan->quat);
+
+ /* tricky interpolations - mode-dependent blending between original and new */
+ if (pso->mode == POSESLIDE_RELAX) // xxx this was the original code, so should work fine
+ QuatInterpol(pchan->quat, quat_orig, quat_interp, 1.0f/6.0f);
+ else // I'm just guessing here...
+ QuatInterpol(pchan->quat, quat_orig, quat_interp, 6.0f/5.0f);
+ }
+ }
+ }
+
+ /* free the path now */
+ MEM_freeN(path);
+}
+
+/* apply() - perform the pose sliding based on weighting various poses */
+static void pose_slide_apply (bContext *C, wmOperator *op, tPoseSlideOp *pso)
+{
+ tPChanFCurveLink *pfl;
+
+ /* sanitise the frame ranges */
+ if (pso->prevFrame == pso->nextFrame) {
+ /* move out one step either side */
+ pso->prevFrame--;
+ pso->nextFrame++;
+ }
+
+ /* for each link, handle each set of transforms */
+ for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
+ /* valid transforms for each PoseChannel should have been noted already
+ * - sliding the pose should be a straightforward exercise for location+rotation,
+ * but rotations get more complicated since we may want to use quaternion blending
+ * for quaternions instead...
+ */
+ bPoseChannel *pchan= pfl->pchan;
+
+ if (pchan->flag & POSE_LOC) {
+ /* calculate these for the 'location' vector, and use location curves */
+ pose_slide_apply_vec3(pso, pfl, pchan->loc, "location");
+ }
+
+ if (pchan->flag & POSE_SIZE) {
+ /* calculate these for the 'scale' vector, and use scale curves */
+ pose_slide_apply_vec3(pso, pfl, pchan->size, "scale");
+ }
+
+ if (pchan->flag & POSE_ROT) {
+ /* everything depends on the rotation mode */
+ if (pchan->rotmode > 0) {
+ /* eulers - so calculate these for the 'eul' vector, and use euler_rotation curves */
+ pose_slide_apply_vec3(pso, pfl, pchan->eul, "euler_rotation");
+ }
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ // TODO: need to figure out how to do this!
+ }
+ else {
+ /* quaternions - use quaternion blending */
+ pose_slide_apply_quat(pso, pfl);
+ }
+ }
+ }
+
+ /* depsgraph updates + redraws */
+ pose_slide_refresh(C, pso);
+}
+
+/* perform autokeyframing after changes were made + confirmed */
+static void pose_slide_autoKeyframe (bContext *C, tPoseSlideOp *pso)
+{
+ /* insert keyframes as necessary if autokeyframing */
+ if (autokeyframe_cfra_can_key(pso->scene, &pso->ob->id)) {
+ bCommonKeySrc cks;
+ ListBase dsources = {&cks, &cks};
+ tPChanFCurveLink *pfl;
+
+ /* init common-key-source for use by KeyingSets */
+ memset(&cks, 0, sizeof(bCommonKeySrc));
+ cks.id= &pso->ob->id;
+
+ /* iterate over each pose-channel affected, applying the changes */
+ for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
+ bPoseChannel *pchan= pfl->pchan;
+ /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
+ cks.pchan= pchan;
+
+ /* insert keyframes */
+ if (pchan->flag & POSE_LOC)
+ modify_keyframes(C, &dsources, NULL, pso->ks_loc, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
+ if (pchan->flag & POSE_ROT)
+ modify_keyframes(C, &dsources, NULL, pso->ks_rot, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
+ if (pchan->flag & POSE_SIZE)
+ modify_keyframes(C, &dsources, NULL, pso->ks_scale, MODIFYKEY_MODE_INSERT, (float)pso->cframe);
+ }
+ }
+}
+
+/* reset changes made to current pose */
+static void pose_slide_reset (bContext *C, tPoseSlideOp *pso)
+{
+ tPChanFCurveLink *pfl;
+
+ /* iterate over each pose-channel affected, restoring all channels to their original values */
+ for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
+ bPoseChannel *pchan= pfl->pchan;
+
+ /* just copy all the values over regardless of whether they changed or not */
+ VECCOPY(pchan->loc, pfl->oldloc);
+ VECCOPY(pchan->eul, pfl->oldrot);
+ VECCOPY(pchan->size, pfl->oldscale);
+ QUATCOPY(pchan->quat, pfl->oldquat);
+ }
+}
+
+/* ------------------------------------ */
+
+/* common code for invoke() methods */
+static int pose_slide_invoke_common (bContext *C, wmOperator *op, tPoseSlideOp *pso)
+{
+ tPChanFCurveLink *pfl;
+ AnimData *adt= pso->ob->adt;
+ wmWindow *win= CTX_wm_window(C);
+
+ /* for each link, add all its keyframes to the search tree */
+ for (pfl= pso->pfLinks.first; pfl; pfl= pfl->next) {
+ LinkData *ld;
+
+ /* do this for each F-Curve */
+ for (ld= pfl->fcurves.first; ld; ld= ld->next) {
+ FCurve *fcu= (FCurve *)ld->data;
+ fcurve_to_keylist(adt, fcu, &pso->keys, NULL);
+ }
+ }
+
+ /* consolidate these keyframes, and figure out the nearest ones */
+ BLI_dlrbTree_linkedlist_sync(&pso->keys);
+
+ /* cancel if no keyframes found... */
+ if (pso->keys.root) {
+ ActKeyColumn *ak;
+
+ /* firstly, check if the current frame is a keyframe... */
+ ak= cfra_find_actkeycolumn(pso->keys.root, pso->cframe);
+
+ if (ak == NULL) {
+ /* current frame is not a keyframe, so search */
+ ActKeyColumn *pk= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 0);
+ ActKeyColumn *nk= cfra_find_nearest_next_ak(pso->keys.root, pso->cframe, 1);
+
+ /* check if we found good keyframes */
+ if ((pk == nk) && (pk != NULL)) {
+ if (pk->cfra < pso->cframe)
+ nk= nk->next;
+ else if (nk->cfra > pso->cframe)
+ pk= pk->prev;
+ }
+
+ /* new set the frames */
+ /* prev frame */
+ pso->prevFrame= (pk)? (pk->cfra) : (pso->cframe - 1);
+ RNA_int_set(op->ptr, "prev_frame", pso->prevFrame);
+ /* next frame */
+ pso->nextFrame= (nk)? (nk->cfra) : (pso->cframe + 1);
+ RNA_int_set(op->ptr, "next_frame", pso->nextFrame);
+ }
+ else {
+ /* current frame itself is a keyframe, so just take keyframes on either side */
+ /* prev frame */
+ pso->prevFrame= (ak->prev)? (ak->prev->cfra) : (pso->cframe - 1);
+ RNA_int_set(op->ptr, "prev_frame", pso->prevFrame);
+ /* next frame */
+ pso->nextFrame= (ak->next)? (ak->next->cfra) : (pso->cframe + 1);
+ RNA_int_set(op->ptr, "next_frame", pso->nextFrame);
+ }
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No keyframes to slide between.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* initial apply for operator... */
+ // TODO: need to calculate percentage for initial round too...
+ pose_slide_apply(C, op, pso);
+
+ /* depsgraph updates + redraws */
+ pose_slide_refresh(C, pso);
+
+ /* set cursor to indicate modal */
+ WM_cursor_modal(win, BC_EW_SCROLLCURSOR);
+
+ /* add a modal handler for this operator */
+ WM_event_add_modal_handler(C, op);
+ return OPERATOR_RUNNING_MODAL;
+}
+
+/* common code for modal() */
+static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tPoseSlideOp *pso= op->customdata;
+ wmWindow *win= CTX_wm_window(C);
+
+ switch (evt->type) {
+ case LEFTMOUSE: /* confirm */
+ {
+ /* return to normal cursor */
+ WM_cursor_restore(win);
+
+ /* insert keyframes as required... */
+ pose_slide_autoKeyframe(C, pso);
+ pose_slide_exit(C, op);
+
+ /* done! */
+ return OPERATOR_FINISHED;
+ }
+
+ case ESCKEY: /* cancel */
+ case RIGHTMOUSE:
+ {
+ /* return to normal cursor */
+ WM_cursor_restore(win);
+
+ /* reset transforms back to original state */
+ pose_slide_reset(C, pso);
+
+ /* depsgraph updates + redraws */
+ pose_slide_refresh(C, pso);
+
+ /* clean up temp data */
+ pose_slide_exit(C, op);
+
+ /* cancelled! */
+ return OPERATOR_CANCELLED;
+ }
+
+ case MOUSEMOVE: /* calculate new position */
+ {
+ /* calculate percentage based on position of mouse (we only use x-axis for now.
+ * since this is more conveninent for users to do), and store new percentage value
+ */
+ pso->percentage= (evt->x - pso->ar->winrct.xmin) / ((float)pso->ar->winx);
+ RNA_float_set(op->ptr, "percentage", pso->percentage);
+
+ /* reset transforms (to avoid accumulation errors) */
+ pose_slide_reset(C, pso);
+
+ /* apply... */
+ pose_slide_apply(C, op, pso);
+ }
+ break;
+
+ default: /* unhandled event (maybe it was some view manip? */
+ /* allow to pass through */
+ return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH;
+ }
+
+ /* still running... */
+ return OPERATOR_RUNNING_MODAL;
+}
+
+/* common code for cancel() */
+static int pose_slide_cancel (bContext *C, wmOperator *op)
+{
+ /* cleanup and done */
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+/* common code for exec() methods */
+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);
+
+ /* insert keyframes if needed */
+ pose_slide_autoKeyframe(C, pso);
+
+ /* cleanup and done */
+ pose_slide_exit(C, op);
+
+ return OPERATOR_FINISHED;
+}
+
+/* common code for defining RNA properties */
+static void pose_slide_opdef_properties (wmOperatorType *ot)
+{
+ RNA_def_int(ot->srna, "prev_frame", 0, MINAFRAME, MAXFRAME, "Previous Keyframe", "Frame number of keyframe immediately before the current frame.", 0, 50);
+ RNA_def_int(ot->srna, "next_frame", 0, MINAFRAME, MAXFRAME, "Next Keyframe", "Frame number of keyframe immediately after the current frame.", 0, 50);
+ RNA_def_float_percentage(ot->srna, "percentage", 0.5f, 0.0f, 1.0f, "Percentage", "Weighting factor for the sliding operation", 0.3, 0.7);
+}
+
+/* ------------------------------------ */
+
+/* invoke() - for 'push' mode */
+static int pose_slide_push_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data */
+ if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common setup work */
+ return pose_slide_invoke_common(C, op, pso);
+}
+
+/* exec() - for push */
+static int pose_slide_push_exec (bContext *C, wmOperator *op)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data (from RNA-props) */
+ if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common exec work */
+ return pose_slide_exec_common(C, op, pso);
+}
+
+void POSE_OT_push (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Push Pose";
+ ot->idname= "POSE_OT_push";
+ ot->description= "Exaggerate the current pose";
+
+ /* callbacks */
+ ot->exec= pose_slide_push_exec;
+ ot->invoke= pose_slide_push_invoke;
+ ot->modal= pose_slide_modal;
+ ot->cancel= pose_slide_cancel;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* Properties */
+ pose_slide_opdef_properties(ot);
+}
+
+/* ........................ */
+
+/* invoke() - for 'relax' mode */
+static int pose_slide_relax_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data */
+ if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common setup work */
+ return pose_slide_invoke_common(C, op, pso);
+}
+
+/* exec() - for relax */
+static int pose_slide_relax_exec (bContext *C, wmOperator *op)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data (from RNA-props) */
+ if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common exec work */
+ return pose_slide_exec_common(C, op, pso);
+}
+
+void POSE_OT_relax (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Relax Pose";
+ ot->idname= "POSE_OT_relax";
+ ot->description= "Make the current pose more similar to its surrounding ones.";
+
+ /* callbacks */
+ ot->exec= pose_slide_relax_exec;
+ ot->invoke= pose_slide_relax_invoke;
+ ot->modal= pose_slide_modal;
+ ot->cancel= pose_slide_cancel;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* Properties */
+ pose_slide_opdef_properties(ot);
+}
+
+/* ........................ */
+
+/* invoke() - for 'breakdown' mode */
+static int pose_slide_breakdown_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data */
+ if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common setup work */
+ return pose_slide_invoke_common(C, op, pso);
+}
+
+/* exec() - for breakdown */
+static int pose_slide_breakdown_exec (bContext *C, wmOperator *op)
+{
+ tPoseSlideOp *pso;
+
+ /* initialise data (from RNA-props) */
+ if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
+ pose_slide_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ else
+ pso= op->customdata;
+
+ /* do common exec work */
+ return pose_slide_exec_common(C, op, pso);
+}
+
+void POSE_OT_breakdown (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Pose Breakdowner";
+ ot->idname= "POSE_OT_breakdown";
+ ot->description= "Create a suitable breakdown pose on the current frame.";
+
+ /* callbacks */
+ ot->exec= pose_slide_breakdown_exec;
+ ot->invoke= pose_slide_breakdown_invoke;
+ ot->modal= pose_slide_modal;
+ ot->cancel= pose_slide_cancel;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* Properties */
+ pose_slide_opdef_properties(ot);
+}
+
+/* **************************************************** */
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 8cbfebebff6..386cb6512a3 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -37,13 +37,13 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_dlrbTree.h"
#include "DNA_listBase.h"
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
-#include "DNA_ipo_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
@@ -61,8 +61,6 @@
#include "BKE_report.h"
#include "BKE_utildefines.h"
-#include "PIL_time.h" /* sleep */
-
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
@@ -216,7 +214,7 @@ bAction *poselib_validate (Object *ob)
// TODO: operatorfy me!
void poselib_validate_act (bAction *act)
{
- ListBase keys = {NULL, NULL};
+ DLRBT_Tree keys = {NULL, NULL};
ActKeyColumn *ak;
TimeMarker *marker, *markern;
@@ -227,7 +225,9 @@ void poselib_validate_act (bAction *act)
}
/* determine which frames have keys */
- action_to_keylist(act, &keys, NULL, NULL);
+ BLI_dlrbTree_init(&keys);
+ action_to_keylist(NULL, act, &keys, NULL);
+ BLI_dlrbTree_linkedlist_sync(&keys);
/* for each key, make sure there is a correspnding pose */
for (ak= keys.first; ak; ak= ak->next) {
@@ -267,7 +267,7 @@ void poselib_validate_act (bAction *act)
}
/* free temp memory */
- BLI_freelistN(&keys);
+ BLI_freelistN((ListBase *)&keys);
BIF_undo_push("PoseLib Validate Action");
}
@@ -275,29 +275,7 @@ void poselib_validate_act (bAction *act)
/* ************************************************************* */
/* Pointers to the builtin KeyingSets that we want to use */
-static KeyingSet *poselib_ks_locrotscale = NULL; /* quaternion rotations */
-static KeyingSet *poselib_ks_locrotscale2 = NULL; /* euler rotations */ // XXX FIXME...
-static short poselib_ks_need_init= 1; /* have the above been obtained yet? */
-
-/* Make sure the builtin KeyingSets are initialised properly
- * (only gets called on first run of poselib_add_current_pose).
- */
-static void poselib_get_builtin_keyingsets (void)
-{
- /* only if we haven't got these yet */
- // FIXME: this assumes that we will always get the builtin sets...
- if (poselib_ks_need_init) {
- /* LocRotScale (quaternions) */
- poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
-
- /* LocRotScale (euler) */
- //ks_locrotscale2= ANIM_builtin_keyingset_get_named(ks_locrotscale, "LocRotScale");
- poselib_ks_locrotscale2= poselib_ks_locrotscale; // FIXME: for now, just use the same one...
-
- /* clear flag requesting init */
- poselib_ks_need_init= 0;
- }
-}
+static KeyingSet *poselib_ks_locrotscale = NULL; /* the only keyingset we'll need */
/* ----- */
@@ -339,7 +317,7 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
uiItemIntO(layout, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
- uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu);
+ uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu, NULL);
}
uiPupMenuEnd(C, pup);
@@ -392,9 +370,6 @@ static int poselib_add_exec (bContext *C, wmOperator *op)
/* validate name */
BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), 64);
- /* make sure we've got KeyingSets to use */
- poselib_get_builtin_keyingsets();
-
/* init common-key-source for use by KeyingSets */
memset(&cks, 0, sizeof(bCommonKeySrc));
cks.id= &ob->id;
@@ -407,11 +382,10 @@ static int poselib_add_exec (bContext *C, wmOperator *op)
/* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
cks.pchan= pchan;
- /* KeyingSet to use depends on rotation mode */
- if (pchan->rotmode)
- modify_keyframes(C, &dsources, act, poselib_ks_locrotscale2, MODIFYKEY_MODE_INSERT, (float)frame);
- else
- modify_keyframes(C, &dsources, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame);
+ /* KeyingSet to use depends on rotation mode (but that's handled by the templates code) */
+ if (poselib_ks_locrotscale == NULL)
+ poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+ modify_keyframes(C, &dsources, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame);
}
}
}
@@ -493,6 +467,7 @@ static int poselib_remove_exec (bContext *C, wmOperator *op)
marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "index"));
if (marker == NULL) {
BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose");
+ return OPERATOR_CANCELLED;
}
/* remove relevant keyframes */
@@ -559,6 +534,7 @@ static int poselib_rename_exec (bContext *C, wmOperator *op)
marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "index"));
if (marker == NULL) {
BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose");
+ return OPERATOR_CANCELLED;
}
/* get new name */
@@ -761,13 +737,20 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
}
/* Auto-keys/tags bones affected by the pose used from the poselib */
-static void poselib_keytag_pose (Scene *scene, tPoseLib_PreviewData *pld)
+static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData *pld)
{
bPose *pose= pld->pose;
bPoseChannel *pchan;
bAction *act= pld->act;
bActionGroup *agrp;
+ bCommonKeySrc cks;
+ ListBase dsources = {&cks, &cks};
+
+ /* init common-key-source for use by KeyingSets */
+ memset(&cks, 0, sizeof(bCommonKeySrc));
+ cks.id= &pld->ob->id;
+
/* start tagging/keying */
for (agrp= act->groups.first; agrp; agrp= agrp->next) {
/* only for selected action channels */
@@ -775,28 +758,21 @@ static void poselib_keytag_pose (Scene *scene, tPoseLib_PreviewData *pld)
pchan= get_pose_channel(pose, agrp->name);
if (pchan) {
-#if 0 // XXX old animation system
// TODO: use a standard autokeying function in future (to allow autokeying-editkeys to work)
- if (IS_AUTOKEY_MODE(NORMAL)) {
- ID *id= &pld->ob->id;
+ if (IS_AUTOKEY_MODE(scene, NORMAL)) {
+ /* Set keys on pose
+ * - KeyingSet to use depends on rotation mode
+ * (but that's handled by the templates code)
+ */
+ // TODO: for getting the KeyingSet used, we should really check which channels were affected
+ if (poselib_ks_locrotscale == NULL)
+ poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
- /* Set keys on pose */
- if (pchan->flag & POSE_ROT) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
- }
- if (pchan->flag & POSE_SIZE) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
- }
- if (pchan->flag & POSE_LOC) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
- }
+ /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
+ cks.pchan= pchan;
+
+ /* now insert the keyframe */
+ modify_keyframes(C, &dsources, NULL, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
/* clear any unkeyed tags */
if (pchan->bone)
@@ -807,7 +783,6 @@ static void poselib_keytag_pose (Scene *scene, tPoseLib_PreviewData *pld)
if (pchan->bone)
pchan->bone->flag |= BONE_UNKEYED;
}
-#endif // XXX old animation system
}
}
@@ -840,7 +815,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_object_flush_update(pld->scene, pld->ob, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_flush_update(&pld->ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(pld->scene, pld->ob);
}
@@ -1343,21 +1318,21 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
* - note: code copied from transform_generics.c -> recalcData()
*/
if ((arm->flag & ARM_DELAYDEFORM)==0)
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(scene, ob);
}
else if (pld->state == PL_PREVIEW_CONFIRM) {
/* tag poses as appropriate */
- poselib_keytag_pose(scene, pld);
+ poselib_keytag_pose(C, scene, pld);
/* change active pose setting */
act->active_marker= BLI_findindex(&act->markers, marker) + 1;
action_set_activemarker(act, marker, 0);
/* Update event for pose and deformation children */
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
/* updates */
if (IS_AUTOKEY_MODE(scene, NORMAL)) {
@@ -1439,7 +1414,7 @@ static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *event)
poselib_preview_apply(C, op);
/* add temp handler if we're running as a modal operator */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1489,7 +1464,7 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
ot->poll= ED_operator_posemode;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* properties */
RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX);
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index 281f314a546..f40476f6f59 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -21,6 +21,7 @@
* All rights reserved.
*
* Contributor(s): Ton Roosendaal, Blender Foundation '05, full recode.
+ * Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
* support for animation modes - Reevan McKay
@@ -50,6 +51,7 @@
#include "DNA_view3d_types.h"
#include "DNA_userdef_types.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_blender.h"
@@ -63,8 +65,8 @@
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
+#include "BKE_report.h"
-#include "BIF_transform.h" /* for autokey TFM_TRANSLATION, etc */
#include "BIF_gl.h"
#include "RNA_access.h"
@@ -79,19 +81,18 @@
#include "ED_object.h"
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_transform.h" /* for autokey TFM_TRANSLATION, etc */
#include "ED_view3d.h"
+#include "UI_interface.h"
+
#include "armature_intern.h"
/* ************* XXX *************** */
-static int movetolayer_short_buts() {return 1;}
-static int okee() {return 0;}
static int pupmenu() {return 0;}
-static void waitcursor() {};
static void error() {};
static void BIF_undo_push() {}
static void countall() {}
-static void add_constraint() {}
static void autokeyframe_pose_cb_func() {}
/* ************* XXX *************** */
@@ -124,9 +125,8 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
switch (ob->type){
case OB_ARMATURE:
-
- ob->flag |= OB_POSEMODE;
- base->flag= ob->flag;
+ ob->restore_mode = ob->mode;
+ ob->mode |= OB_MODE_POSE;
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_POSE, NULL);
@@ -134,7 +134,8 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
default:
return;
}
- ED_view3d_exit_paint_modes(C);
+
+ //ED_object_toggle_modes(C, ob->mode);
}
void ED_armature_exit_posemode(bContext *C, Base *base)
@@ -142,8 +143,8 @@ void ED_armature_exit_posemode(bContext *C, Base *base)
if(base) {
Object *ob= base->object;
- ob->flag &= ~OB_POSEMODE;
- base->flag= ob->flag;
+ ob->restore_mode = ob->mode;
+ ob->mode &= ~OB_MODE_POSE;
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
@@ -200,10 +201,12 @@ int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
/* ********************************************** */
-/* 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
+/* For the object with pose/action: update paths for those that have got them
+ * This should selectively update paths that exist...
+ *
+ * To be called from various tools that do incremental updates
*/
-void pose_calculate_path(bContext *C, Scene *scene, Object *ob)
+void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
{
bArmature *arm;
bPoseChannel *pchan;
@@ -212,29 +215,28 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob)
int cfra;
int sfra, efra;
- if (ob==NULL || ob->pose==NULL)
+ /* sanity checks */
+ if ELEM(NULL, ob, ob->pose)
return;
arm= ob->data;
- /* version patch for older files here (do_versions patch too complicated) */
- if ((arm->pathsf == 0) || (arm->pathef == 0)) {
- arm->pathsf = SFRA;
- arm->pathef = EFRA;
- }
- if (arm->pathsize == 0) {
- arm->pathsize = 1;
- }
-
/* set frame values */
- cfra= CFRA;
- sfra = arm->pathsf;
- efra = arm->pathef;
- if (efra <= sfra) {
- error("Can't calculate paths when pathlen <= 0");
- return;
+ cfra = CFRA;
+ sfra = efra = cfra;
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (pchan->path) {
+ /* if the pathsf and pathef aren't initialised, abort! */
+ if (ELEM(0, pchan->pathsf, pchan->pathef))
+ return;
+
+ /* try to increase area to do (only as much as needed) */
+ sfra= MIN2(sfra, pchan->pathsf);
+ efra= MAX2(efra, pchan->pathef);
+ }
+ }
}
-
- waitcursor(1);
+ if (efra <= sfra) return;
/* hack: for unsaved files, set OB_RECALC so that paths can get calculated */
if ((ob->recalc & OB_RECALC)==0) {
@@ -244,35 +246,30 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob)
else
ED_anim_object_flush_update(C, ob);
-
- /* malloc the path blocks */
- for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
- if (arm->layer & pchan->bone->layer) {
- pchan->pathlen= efra-sfra+1;
- pchan->pathsf= sfra;
- pchan->pathef= efra+1;
- if (pchan->path)
- MEM_freeN(pchan->path);
- pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path");
- }
- }
- }
-
+ /* calculate path over requested range */
for (CFRA=sfra; CFRA<=efra; CFRA++) {
/* do all updates */
for (base= FIRSTBASE; base; base= base->next) {
if (base->object->recalc) {
int temp= base->object->recalc;
+
+ if (base->object->adt)
+ BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL);
+
+ /* update object */
object_handle_update(scene, base->object);
base->object->recalc= temp;
}
}
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
- if (arm->layer & pchan->bone->layer) {
- if (pchan->path) {
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
+ if (pchan->path) {
+ /* only update if:
+ * - in range of this pchan's existing path
+ * - ... insert evil filtering/optimising conditions here...
+ */
+ if (IN_RANGE(CFRA, pchan->pathsf, pchan->pathef)) {
fp= pchan->path+3*(CFRA-sfra);
if (arm->pathflag & ARM_PATH_HEADS) {
@@ -289,16 +286,35 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob)
}
}
- waitcursor(0);
-
+ /* reset flags */
CFRA= cfra;
+ ob->pose->flag &= ~POSE_RECALCPATHS;
+
+ /* flush one final time - to restore to the original state */
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc) {
+ int temp= base->object->recalc;
+
+ if (base->object->adt)
+ BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL);
+
+ object_handle_update(scene, base->object);
+ base->object->recalc= temp;
+ }
+ }
}
-/* For the object with pose/action: update paths for those that have got them
- * This should selectively update paths that exist...
+/* --------- */
+
+/* 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
*/
-void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
+static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
{
+ wmWindow *win= CTX_wm_window(C);
+ ScrArea *sa= CTX_wm_area(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob;
bArmature *arm;
bPoseChannel *pchan;
Base *base;
@@ -306,29 +322,35 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
int cfra;
int sfra, efra;
- if (ob==NULL || ob->pose==NULL)
- return;
+ /* 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);
+
+ /* only continue if there's an object */
+ if ELEM(NULL, ob, ob->pose)
+ return OPERATOR_CANCELLED;
arm= ob->data;
- /* set frame values */
- cfra = CFRA;
- sfra = efra = cfra;
- for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
- if (pchan->path) {
- /* if the pathsf and pathef aren't initialised, abort! */
- if (ELEM(0, pchan->pathsf, pchan->pathef))
- return;
-
- /* try to increase area to do (only as much as needed) */
- sfra= MIN2(sfra, pchan->pathsf);
- efra= MAX2(efra, pchan->pathef);
- }
- }
+ /* version patch for older files here (do_versions patch too complicated) */
+ if ((arm->pathsf == 0) || (arm->pathef == 0)) {
+ arm->pathsf = SFRA;
+ arm->pathef = EFRA;
+ }
+ if (arm->pathsize == 0) {
+ arm->pathsize = 1;
}
- if (efra <= sfra) return;
- waitcursor(1);
+ /* get frame values to use */
+ cfra= CFRA;
+ sfra = arm->pathsf;
+ efra = arm->pathef;
+
+ if (efra <= sfra) {
+ BKE_report(op->reports, RPT_ERROR, "Can't calculate paths when pathlen <= 0");
+ return OPERATOR_CANCELLED;
+ }
/* hack: for unsaved files, set OB_RECALC so that paths can get calculated */
if ((ob->recalc & OB_RECALC)==0) {
@@ -338,24 +360,42 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
else
ED_anim_object_flush_update(C, ob);
+ /* alloc the path cache arrays */
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+ if (arm->layer & pchan->bone->layer) {
+ pchan->pathlen= efra-sfra+1;
+ pchan->pathsf= sfra;
+ pchan->pathef= efra+1;
+ if (pchan->path)
+ MEM_freeN(pchan->path);
+ pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path");
+ }
+ }
+ }
+
+ /* step through frame range sampling the values */
for (CFRA=sfra; CFRA<=efra; CFRA++) {
+ /* for each frame we calculate, update time-cursor... (may be too slow) */
+ WM_timecursor(win, CFRA);
+
/* do all updates */
for (base= FIRSTBASE; base; base= base->next) {
if (base->object->recalc) {
int temp= base->object->recalc;
+
+ if (base->object->adt)
+ BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL);
+
object_handle_update(scene, base->object);
base->object->recalc= temp;
}
}
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone) && (arm->layer & pchan->bone->layer)) {
- if (pchan->path) {
- /* only update if:
- * - in range of this pchan's existing path
- * - ... insert evil filtering/optimising conditions here...
- */
- if (IN_RANGE(CFRA, pchan->pathsf, pchan->pathef)) {
+ if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) {
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->path) {
fp= pchan->path+3*(CFRA-sfra);
if (arm->pathflag & ARM_PATH_HEADS) {
@@ -372,18 +412,55 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
}
}
- waitcursor(0);
+ /* restore original cursor */
+ WM_cursor_restore(win);
+ /* reset current frame, and clear flags */
CFRA= cfra;
ob->pose->flag &= ~POSE_RECALCPATHS;
+
+ /* flush one final time - to restore to the original state */
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (base->object->recalc) {
+ int temp= base->object->recalc;
+
+ if (base->object->adt)
+ BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL);
+
+ object_handle_update(scene, base->object);
+ base->object->recalc= temp;
+ }
+ }
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_paths_calculate (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Calculate Bone Paths";
+ ot->idname= "POSE_OT_paths_calculate";
+ ot->description= "Calculate paths for the selected bones.";
+
+ /* api callbacks */
+ ot->exec= pose_calculate_paths_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* --------- */
+
/* for the object with pose/action: clear path curves for selected bones only */
-void pose_clear_paths(Object *ob)
+void ED_pose_clear_paths(Object *ob)
{
bPoseChannel *pchan;
- if (ob==NULL || ob->pose==NULL)
+ if ELEM(NULL, ob, ob->pose)
return;
/* free the path blocks */
@@ -395,11 +472,51 @@ void pose_clear_paths(Object *ob)
}
}
}
+}
+
+/* operator callback for this */
+static int pose_clear_paths_exec (bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ /* 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);
+
+ /* only continue if there's an object */
+ if ELEM(NULL, ob, ob->pose)
+ return OPERATOR_CANCELLED;
+
+ /* for now, just call the API function for this (which is shared with backend functions) */
+ ED_pose_clear_paths(ob);
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
}
+void POSE_OT_paths_clear (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Bone Paths";
+ ot->idname= "POSE_OT_paths_clear";
+ ot->description= "Clear path caches for selected bones.";
+
+ /* api callbacks */
+ ot->exec= pose_clear_paths_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+/* ******************* Select Constraint Target Operator ************* */
+// XXX this function is to be removed when the other stuff is recoded
void pose_select_constraint_target(Scene *scene)
{
Object *obedit= scene->obedit; // XXX context
@@ -410,7 +527,7 @@ void pose_select_constraint_target(Scene *scene)
/* paranoia checks */
if (!ob && !ob->pose) return;
- if (ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
+ if (ob==obedit || (ob->mode & OB_MODE_POSE)==0) return;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if (arm->layer & pchan->bone->layer) {
@@ -443,6 +560,65 @@ void pose_select_constraint_target(Scene *scene)
}
+static int pose_select_constraint_target_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm= ob->data;
+ bPoseChannel *pchan;
+ bConstraint *con;
+ int found= 0;
+
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
+ for (con= pchan->constraints.first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if ((ct->tar == ob) && (ct->subtarget[0])) {
+ bPoseChannel *pchanc= get_pose_channel(ob->pose, ct->subtarget);
+ if(pchanc) {
+ pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ found= 1;
+ }
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
+ }
+ }
+ }
+ }
+ }
+
+ if(!found)
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_select_constraint_target(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Constraint Target";
+ ot->idname= "POSE_OT_select_constraint_target";
+
+ /* api callbacks */
+ ot->exec= pose_select_constraint_target_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ******************* select hierarchy operator ************* */
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
@@ -453,6 +629,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
Bone *curbone, *pabone, *chbone;
int direction = RNA_enum_get(op->ptr, "direction");
int add_to_sel = RNA_boolean_get(op->ptr, "extend");
+ int found= 0;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
curbone= pchan->bone;
@@ -469,8 +646,8 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
curbone->flag &= ~BONE_ACTIVE;
pabone->flag |= (BONE_ACTIVE|BONE_SELECTED);
-
- // XXX notifiers need to be sent to other editors to update
+
+ found= 1;
break;
}
} else { // BONE_SELECT_CHILD
@@ -483,8 +660,8 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
curbone->flag &= ~BONE_ACTIVE;
chbone->flag |= (BONE_ACTIVE|BONE_SELECTED);
-
- // XXX notifiers need to be sent to other editors to update
+
+ found= 1;
break;
}
}
@@ -492,6 +669,9 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
}
}
+ if(!found)
+ return OPERATOR_CANCELLED;
+
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
@@ -524,92 +704,6 @@ void POSE_OT_select_hierarchy(wmOperatorType *ot)
}
-void pose_add_IK(Scene *scene)
-{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
-
- /* paranoia checks */
- if(!ob && !ob->pose) return;
- if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
-
- add_constraint(1); /* 1 means only IK */
-}
-
-/* context: all selected channels */
-void pose_clear_IK(Scene *scene)
-{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
- bArmature *arm= ob->data;
- bPoseChannel *pchan;
- bConstraint *con;
- bConstraint *next;
-
- /* paranoia checks */
- if(!ob && !ob->pose) return;
- if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
-
- if(pose_has_protected_selected(ob, 0, 1))
- return;
-
- if(okee("Remove IK constraint(s)")==0) return;
-
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
-
- for(con= pchan->constraints.first; con; con= next) {
- next= con->next;
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
- BLI_remlink(&pchan->constraints, con);
- free_constraint_data(con);
- MEM_freeN(con);
- }
- }
- pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
- }
- }
- }
-
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA); // and all its relations
-
- BIF_undo_push("Remove IK constraint(s)");
-}
-
-void pose_clear_constraints(Scene *scene)
-{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
- bArmature *arm= ob->data;
- bPoseChannel *pchan;
-
- /* paranoia checks */
- if(!ob && !ob->pose) return;
- if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
-
- if(pose_has_protected_selected(ob, 0, 1))
- return;
-
- if(okee("Remove Constraints")==0) return;
-
- /* find active */
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
- free_constraints(&pchan->constraints);
- pchan->constflag= 0;
- }
- }
- }
-
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA); // and all its relations
-
- BIF_undo_push("Remove Constraint(s)");
-
-}
-
-
void pose_copy_menu(Scene *scene)
{
Object *obedit= scene->obedit; // XXX context
@@ -621,7 +715,7 @@ void pose_copy_menu(Scene *scene)
/* paranoia checks */
if (ELEM(NULL, ob, ob->pose)) return;
- if ((ob==obedit) || (ob->flag & OB_POSEMODE)==0) return;
+ if ((ob==obedit) || (ob->mode & OB_MODE_POSE)==0) return;
/* find active */
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
@@ -665,6 +759,7 @@ void pose_copy_menu(Scene *scene)
break;
case 2: /* Local Rotation */
QUATCOPY(pchan->quat, pchanact->quat);
+ VECCOPY(pchan->eul, pchanact->eul);
break;
case 3: /* Local Size */
VECCOPY(pchan->size, pchanact->size);
@@ -703,6 +798,8 @@ void pose_copy_menu(Scene *scene)
VECCOPY(pchan->limitmax, pchanact->limitmax);
VECCOPY(pchan->stiffness, pchanact->stiffness);
pchan->ikstretch= pchanact->ikstretch;
+ pchan->ikrotweight= pchanact->ikrotweight;
+ pchan->iklinweight= pchanact->iklinweight;
}
break;
case 8: /* Custom Bone Shape */
@@ -713,11 +810,21 @@ void pose_copy_menu(Scene *scene)
break;
case 10: /* Visual Rotation */
{
- float delta_mat[4][4], quat[4];
+ float delta_mat[4][4];
armature_mat_pose_to_bone(pchan, pchanact->pose_mat, delta_mat);
- Mat4ToQuat(delta_mat, quat);
- QUATCOPY(pchan->quat, quat);
+
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ float tmp_quat[4];
+
+ /* need to convert to quat first (in temp var)... */
+ Mat4ToQuat(delta_mat, tmp_quat);
+ QuatToAxisAngle(tmp_quat, &pchan->quat[1], &pchan->quat[0]);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_QUAT)
+ Mat4ToQuat(delta_mat, pchan->quat);
+ else
+ Mat4ToEulO(delta_mat, pchan->eul, pchan->rotmode);
}
break;
case 11: /* Visual Size */
@@ -794,7 +901,7 @@ void pose_copy_menu(Scene *scene)
ob->pose->flag |= POSE_RECALC;
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA); // and all its relations
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); // and all its relations
BIF_undo_push("Copy Pose Attributes");
@@ -802,104 +909,187 @@ void pose_copy_menu(Scene *scene)
/* ******************** copy/paste pose ********************** */
-static bPose *g_posebuf=NULL;
+/* Global copy/paste buffer for pose - cleared on start/end session + before every copy operation */
+static bPose *g_posebuf = NULL;
void free_posebuf(void)
{
if (g_posebuf) {
- // was copied without constraints
- BLI_freelistN (&g_posebuf->chanbase);
- MEM_freeN (g_posebuf);
+ /* was copied without constraints */
+ BLI_freelistN(&g_posebuf->chanbase);
+ MEM_freeN(g_posebuf);
}
+
g_posebuf=NULL;
}
-void copy_posebuf (Scene *scene)
-{
- Object *ob= OBACT;
+/* ---- */
- if (!ob || !ob->pose){
- error ("No Pose");
- return;
+static int pose_copy_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+
+ /* sanity checking */
+ if ELEM(NULL, ob, ob->pose) {
+ BKE_report(op->reports, RPT_ERROR, "No Pose to Copy");
+ return OPERATOR_CANCELLED;
}
+ /* free existing pose buffer */
free_posebuf();
- set_pose_keys(ob); // sets chan->flag to POSE_KEY if bone selected
+ /* sets chan->flag to POSE_KEY if bone selected, then copy those bones to the buffer */
+ set_pose_keys(ob);
copy_pose(&g_posebuf, ob->pose, 0);
+
+
+ return OPERATOR_FINISHED;
+}
+void POSE_OT_copy (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy Pose";
+ ot->idname= "POSE_OT_copy";
+ ot->description= "Copies the current pose of the selected bones to copy/paste buffer.";
+
+ /* api callbacks */
+ ot->exec= pose_copy_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flag */
+ ot->flag= OPTYPE_REGISTER;
}
-void paste_posebuf (Scene *scene, int flip)
+/* ---- */
+
+/* Pointers to the builtin KeyingSets that we want to use */
+static KeyingSet *posePaste_ks_locrotscale = NULL; /* the only keyingset we'll need */
+
+/* ---- */
+
+static int pose_paste_exec (bContext *C, wmOperator *op)
{
- Object *ob= OBACT;
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
bPoseChannel *chan, *pchan;
- float eul[4];
char name[32];
+ int flip= RNA_boolean_get(op->ptr, "flipped");
- if (!ob || !ob->pose)
- return;
+ bCommonKeySrc cks;
+ ListBase dsources = {&cks, &cks};
+
+ /* init common-key-source for use by KeyingSets */
+ memset(&cks, 0, sizeof(bCommonKeySrc));
+ cks.id= &ob->id;
+
+ /* sanity checks */
+ if ELEM(NULL, ob, ob->pose)
+ return OPERATOR_CANCELLED;
- if (!g_posebuf){
- error ("Copy buffer is empty");
- return;
+ if (g_posebuf == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Copy buffer is empty");
+ return OPERATOR_CANCELLED;
}
- /*
- // disabled until protected bones in proxies follow the rules everywhere else!
- if(pose_has_protected_selected(ob, 1, 1))
- return;
- */
-
- /* Safely merge all of the channels in this pose into
- any existing pose */
- for (chan=g_posebuf->chanbase.first; chan; chan=chan->next) {
+ /* 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 */
BLI_strncpy(name, chan->name, sizeof(name));
if (flip)
- bone_flip_name (name, 0); // 0 = don't strip off number extensions
+ bone_flip_name(name, 0); /* 0 = don't strip off number extensions */
/* only copy when channel exists, poses are not meant to add random channels to anymore */
pchan= get_pose_channel(ob->pose, name);
if (pchan) {
- /* only loc rot size */
- /* only copies transform info for the pose */
+ /* only loc rot size
+ * - only copies transform info for the pose
+ */
VECCOPY(pchan->loc, chan->loc);
VECCOPY(pchan->size, chan->size);
- QUATCOPY(pchan->quat, chan->quat);
pchan->flag= chan->flag;
- if (flip) {
- pchan->loc[0]*= -1;
-
- QuatToEul(pchan->quat, eul);
- eul[1]*= -1;
- eul[2]*= -1;
- EulToQuat(eul, pchan->quat);
+ /* check if rotation modes are compatible (i.e. do they need any conversions) */
+ if (pchan->rotmode == chan->rotmode) {
+ /* copy the type of rotation in use */
+ if (pchan->rotmode > 0) {
+ VECCOPY(pchan->eul, chan->eul);
+ }
+ else {
+ QUATCOPY(pchan->quat, chan->quat);
+ }
+ }
+ else if (pchan->rotmode > 0) {
+ /* quat/axis-angle to euler */
+ if (chan->rotmode == PCHAN_ROT_AXISANGLE)
+ AxisAngleToEulO(&chan->quat[1], chan->quat[0], pchan->eul, pchan->rotmode);
+ else
+ QuatToEulO(chan->quat, pchan->eul, pchan->rotmode);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* quat/euler to axis angle */
+ if (chan->rotmode > 0)
+ EulOToAxisAngle(chan->eul, chan->rotmode, &pchan->quat[1], &pchan->quat[0]);
+ else
+ QuatToAxisAngle(chan->quat, &pchan->quat[1], &pchan->quat[0]);
+ }
+ else {
+ /* euler/axis-angle to quat */
+ if (chan->rotmode > 0)
+ EulOToQuat(chan->eul, chan->rotmode, pchan->quat);
+ else
+ AxisAngleToQuat(pchan->quat, &chan->quat[1], chan->quat[0]);
}
-#if 0 // XXX old animation system
- if (autokeyframe_cfra_can_key(ob)) {
- ID *id= &ob->id;
+ /* paste flipped pose? */
+ if (flip) {
+ pchan->loc[0]*= -1;
- /* Set keys on pose */
- if (chan->flag & POSE_ROT) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
+ /* has to be done as eulers... */
+ if (pchan->rotmode > 0) {
+ pchan->eul[1] *= -1;
+ pchan->eul[2] *= -1;
}
- if (chan->flag & POSE_SIZE) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
+ else if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ float eul[3];
+
+ AxisAngleToEulO(&pchan->quat[1], pchan->quat[0], eul, EULER_ORDER_DEFAULT);
+ eul[1]*= -1;
+ eul[2]*= -1;
+ EulOToAxisAngle(eul, EULER_ORDER_DEFAULT, &pchan->quat[1], &pchan->quat[0]);
+
+ // experimental method (uncomment to test):
+#if 0
+ /* experimental method: just flip the orientation of the axis on x/y axes */
+ pchan->quat[1] *= -1;
+ pchan->quat[2] *= -1;
+#endif
}
- if (chan->flag & POSE_LOC) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
+ else {
+ float eul[3];
+
+ QuatToEul(pchan->quat, eul);
+ eul[1]*= -1;
+ eul[2]*= -1;
+ EulToQuat(eul, pchan->quat);
}
+ }
+
+ if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ /* Set keys on pose
+ * - KeyingSet to use depends on rotation mode
+ * (but that's handled by the templates code)
+ */
+ // TODO: for getting the KeyingSet used, we should really check which channels were affected
+ if (posePaste_ks_locrotscale == NULL)
+ posePaste_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+
+ /* init cks for this PoseChannel, then use the relative KeyingSets to keyframe it */
+ cks.pchan= pchan;
+
+ modify_keyframes(C, &dsources, NULL, posePaste_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
/* clear any unkeyed tags */
if (chan->bone)
@@ -910,13 +1100,12 @@ void paste_posebuf (Scene *scene, int flip)
if (chan->bone)
chan->bone->flag |= BONE_UNKEYED;
}
-#endif // XXX old animation system
}
}
}
/* Update event for pose and deformation children */
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
if (IS_AUTOKEY_ON(scene)) {
// XXX remake_action_ipos(ob->action);
@@ -926,8 +1115,29 @@ void paste_posebuf (Scene *scene, int flip)
where_is_pose(scene, ob);
ob->recalc= 0;
}
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE|ND_TRANSFORM, ob);
- BIF_undo_push("Paste Action Pose");
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_paste (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Paste Pose";
+ ot->idname= "POSE_OT_paste";
+ ot->description= "Pastes the stored pose on to the current pose.";
+
+ /* api callbacks */
+ ot->exec= pose_paste_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flag */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "flipped", 0, "Flipped on X-Axis", "");
}
/* ********************************************** */
@@ -938,7 +1148,7 @@ void pose_adds_vgroups(Scene *scene, Object *meshobj, int heatweights)
// XXX extern VPaint Gwp; /* from vpaint */
Object *poseobj= modifiers_isDeformedByArmature(meshobj);
- if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) {
+ if(poseobj==NULL || (poseobj->mode & OB_MODE_POSE)==0) {
error("The active object must have a deforming armature in pose mode");
return;
}
@@ -952,221 +1162,325 @@ void pose_adds_vgroups(Scene *scene, Object *meshobj, int heatweights)
// and all its relations
- DAG_object_flush_update(scene, meshobj, OB_RECALC_DATA);
+ DAG_id_flush_update(&meshobj->id, OB_RECALC_DATA);
}
/* ********************************************** */
-/* adds a new pose-group */
-void pose_add_posegroup (Scene *scene)
+
+static int pose_group_add_exec (bContext *C, wmOperator *op)
{
- Object *ob= OBACT;
- bPose *pose= (ob) ? ob->pose : NULL;
- bActionGroup *grp;
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
- if (ELEM(NULL, ob, ob->pose))
- return;
+ /* 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);
+
+ /* only continue if there's an object */
+ if (ob == NULL)
+ return OPERATOR_CANCELLED;
- grp= MEM_callocN(sizeof(bActionGroup), "PoseGroup");
- strcpy(grp->name, "Group");
- BLI_addtail(&pose->agroups, grp);
- BLI_uniquename(&pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), 32);
+ /* for now, just call the API function for this */
+ pose_add_group(ob);
- pose->active_group= BLI_countlist(&pose->agroups);
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_group_add (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Bone Group";
+ ot->idname= "POSE_OT_group_add";
+ ot->description= "Add a new bone group.";
- BIF_undo_push("Add Bone Group");
+ /* api callbacks */
+ ot->exec= pose_group_add_exec;
+ ot->poll= ED_operator_posemode;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/* Remove the active bone-group */
-void pose_remove_posegroup (Scene *scene)
+
+static int pose_group_remove_exec (bContext *C, wmOperator *op)
{
- Object *ob= OBACT;
- bPose *pose= (ob) ? ob->pose : NULL;
- bActionGroup *grp = NULL;
- bPoseChannel *pchan;
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
- /* sanity checks */
- if (ELEM(NULL, ob, pose))
- return;
- if (pose->active_group <= 0)
- return;
+ /* 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);
- /* get group to remove */
- grp= BLI_findlink(&pose->agroups, pose->active_group-1);
- if (grp) {
- /* adjust group references (the trouble of using indices!):
- * - firstly, make sure nothing references it
- * - also, make sure that those after this item get corrected
- */
- for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
- if (pchan->agrp_index == pose->active_group)
- pchan->agrp_index= 0;
- else if (pchan->agrp_index > pose->active_group)
- pchan->agrp_index--;
- }
-
- /* now, remove it from the pose */
- BLI_freelinkN(&pose->agroups, grp);
- pose->active_group= 0;
-
- BIF_undo_push("Remove Bone Group");
- }
+ /* only continue if there's an object */
+ if (ob == NULL)
+ return OPERATOR_CANCELLED;
+
+ /* for now, just call the API function for this */
+ pose_remove_group(ob);
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_group_remove (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Bone Group";
+ ot->idname= "POSE_OT_group_remove";
+ ot->description= "Removes the active bone group.";
+
+ /* api callbacks */
+ ot->exec= pose_group_remove_exec;
+ ot->poll= ED_operator_posemode;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-char *build_posegroups_menustr (bPose *pose, short for_pupmenu)
+/* ------------ */
+
+/* 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)
{
- DynStr *pupds= BLI_dynstr_new();
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ bPose *pose;
+
+ uiPopupMenu *pup;
+ uiLayout *layout;
bActionGroup *grp;
- char *str;
- char buf[16];
int i;
- /* add title first (and the "none" entry) */
- BLI_dynstr_append(pupds, "Bone Group%t|");
- if (for_pupmenu)
- BLI_dynstr_append(pupds, "Add New%x0|");
+ /* 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
- BLI_dynstr_append(pupds, "BG: [None]%x0|");
-
- /* loop through groups, adding them */
- for (grp= pose->agroups.first, i=1; grp; grp=grp->next, i++) {
- if (for_pupmenu == 0)
- BLI_dynstr_append(pupds, "BG: ");
- BLI_dynstr_append(pupds, grp->name);
+ ob= 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;
+
+ /* 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);
+ layout= uiPupMenuLayout(pup);
- sprintf(buf, "%%x%d", i);
- BLI_dynstr_append(pupds, buf);
+ /* 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);
+ 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);
+
+ /* finish building the menu, and process it (should result in calling self again) */
+ uiPupMenuEnd(C, pup);
- if (grp->next)
- BLI_dynstr_append(pupds, "|");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ /* just use the active group index, and call the exec callback for the calling operator */
+ RNA_int_set(op->ptr, "type", pose->active_group);
+ return op->type->exec(C, op);
}
-
- /* convert to normal MEM_malloc'd string */
- str= BLI_dynstr_get_cstring(pupds);
- BLI_dynstr_free(pupds);
-
- return str;
}
/* Assign selected pchans to the bone group that the user selects */
-void pose_assign_to_posegroup (Scene *scene, short active)
+static int pose_group_assign_exec (bContext *C, wmOperator *op)
{
- Object *ob= OBACT;
- bArmature *arm= (ob) ? ob->data : NULL;
- bPose *pose= (ob) ? ob->pose : NULL;
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ bArmature *arm;
+ bPose *pose;
bPoseChannel *pchan;
- char *menustr;
- int nr;
short done= 0;
- /* sanity checks */
- if (ELEM3(NULL, ob, pose, arm))
- return;
-
- /* get group to affect */
- if ((active==0) || (pose->active_group <= 0)) {
- menustr= build_posegroups_menustr(pose, 1);
- nr= 0; // XXX pupmenu_col(menustr, 20);
- MEM_freeN(menustr);
-
- if (nr < 0)
- return;
- else if (nr == 0) {
- /* add new - note: this does an undo push and sets active group */
- pose_add_posegroup(scene);
- }
- else
- pose->active_group= nr;
- }
+ /* 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);
+
+ /* 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
+ * - if 0 after this, make a new group...
+ */
+ pose->active_group= RNA_int_get(op->ptr, "type");
+ if (pose->active_group == 0)
+ pose_add_group(ob);
/* add selected bones to group then */
+ // NOTE: unfortunately, we cannot use the context-iterators here, since they might not be defined...
+ // CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) {
- pchan->agrp_index= pose->active_group;
- done= 1;
+ /* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
+ // NOTE: sync this view3d_context() in space_view3d.c
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (pchan->bone->flag & (BONE_SELECTED|BONE_ACTIVE)) {
+ pchan->agrp_index= pose->active_group;
+ done= 1;
+ }
}
}
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ /* report done status */
if (done)
- BIF_undo_push("Add Bones To Group");
-
+ return OPERATOR_FINISHED;
+ else
+ return OPERATOR_CANCELLED;
}
-/* Remove selected pchans from their bone groups */
-void pose_remove_from_posegroups (Scene *scene)
+void POSE_OT_group_assign (wmOperatorType *ot)
{
- Object *ob= OBACT;
- bArmature *arm= (ob) ? ob->data : NULL;
- bPose *pose= (ob) ? ob->pose : NULL;
+ /* identifiers */
+ ot->name= "Add Selected to Bone Group";
+ ot->idname= "POSE_OT_group_assign";
+ ot->description= "Add selected bones to the chosen bone group.";
+
+ /* api callbacks */
+ ot->invoke= pose_groups_menu_invoke;
+ ot->exec= pose_group_assign_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_int(ot->srna, "type", 0, 0, 10, "Bone Group Index", "", 0, INT_MAX);
+}
+
+
+static int pose_group_unassign_exec (bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ bArmature *arm;
+ bPose *pose;
bPoseChannel *pchan;
short done= 0;
- /* sanity checks */
- if (ELEM3(NULL, ob, pose, arm))
- return;
+ /* 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);
- /* remove selected bones from their groups */
+ /* 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;
+
+ /* add selected bones to ungroup then */
+ // NOTE: unfortunately, we cannot use the context-iterators here, since they might not be defined...
+ // CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) {
- if (pchan->agrp_index) {
- pchan->agrp_index= 0;
- done= 1;
+ /* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
+ // NOTE: sync this view3d_context() in space_view3d.c
+ if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (pchan->bone->flag & (BONE_SELECTED|BONE_ACTIVE)) {
+ if (pchan->agrp_index) {
+ pchan->agrp_index= 0;
+ done= 1;
+ }
}
}
}
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ /* report done status */
if (done)
- BIF_undo_push("Remove Bones From Groups");
-
+ return OPERATOR_FINISHED;
+ else
+ return OPERATOR_CANCELLED;
}
-/* Ctrl-G in 3D-View while in PoseMode */
-void pgroup_operation_with_menu (Scene *scene)
+void POSE_OT_group_unassign (wmOperatorType *ot)
{
- Object *ob= OBACT;
- bArmature *arm= (ob) ? ob->data : NULL;
- bPose *pose= (ob) ? ob->pose : NULL;
- bPoseChannel *pchan= NULL;
- int mode;
+ /* identifiers */
+ ot->name= "Remove Selected from Bone Groups";
+ ot->idname= "POSE_OT_group_unassign";
+ ot->description= "Add selected bones from all bone groups";
- /* sanity checks */
- if (ELEM3(NULL, ob, pose, arm))
- return;
+ /* api callbacks */
+ ot->exec= pose_group_unassign_exec;
+ ot->poll= ED_operator_posemode;
- /* check that something is selected */
- for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer))
- break;
- }
- if (pchan == NULL)
- return;
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ----------------- */
+
+static int pose_groupOps_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ Object *ob= CTX_data_active_object(C);
+ uiPopupMenu *pup= uiPupMenuBegin(C, op->type->name, 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
+
+ /* sanity check - must have object with pose */
+ if ELEM(NULL, ob, ob->pose)
+ return OPERATOR_CANCELLED;
/* get mode of action */
- if (pchan)
- mode= pupmenu("Bone Groups%t|Add Selected to Active Group%x1|Add Selected to Group%x2|%|Remove Selected From Groups%x3|Remove Active Group%x4");
- else
- mode= pupmenu("Bone Groups%t|Add New Group%x5|Remove Active Group%x4");
+ if (CTX_DATA_COUNT(C, selected_pchans)) {
+ /* if selected bone(s), include options to add/remove to active group */
+ uiItemO(layout, "Add Selected to Active Group", 0, "POSE_OT_group_assign");
- /* handle mode */
- switch (mode) {
- case 1:
- pose_assign_to_posegroup(scene, 1);
- break;
- case 2:
- pose_assign_to_posegroup(scene, 0);
- break;
- case 5:
- pose_add_posegroup(scene);
- break;
- case 3:
- pose_remove_from_posegroups(scene);
- break;
- case 4:
- pose_remove_posegroup(scene);
- break;
+ uiItemS(layout);
+
+ uiItemO(layout, "Remove Selected from All Groups", 0, "POSE_OT_group_unassign");
+ uiItemO(layout, "Remove Active Group", 0, "POSE_OT_group_remove");
}
+ else {
+ /* no selected bones - so just options for groups management */
+ uiItemO(layout, "Add New Group", 0, "POSE_OT_group_add");
+ uiItemO(layout, "Remove Active Group", 0, "POSE_OT_group_remove");
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void POSE_OT_groups_menu (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Bone Group Tools";
+ ot->idname= "POSE_OT_groups_menu";
+ ot->description= "Menu displaying available tools for Bone Groups.";
+
+ /* api callbacks (only invoke needed) */
+ ot->invoke= pose_groupOps_menu_invoke;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
}
/* ********************************************** */
@@ -1262,64 +1576,109 @@ void pose_select_grouped_menu (Scene *scene)
/* ********************************************** */
-/* context active object */
-void pose_flip_names(Scene *scene)
+static int pose_flip_names_exec (bContext *C, wmOperator *op)
{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
- bArmature *arm= ob->data;
- bPoseChannel *pchan;
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm;
char newname[32];
/* paranoia checks */
- if(!ob && !ob->pose) return;
- if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
-
- if(pose_has_protected_selected(ob, 0, 1))
- return;
+ if (ELEM(NULL, ob, ob->pose))
+ return OPERATOR_CANCELLED;
+ arm= ob->data;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
- BLI_strncpy(newname, pchan->name, sizeof(newname));
- bone_flip_name(newname, 1); // 1 = do strip off number extensions
- armature_bone_rename(ob, pchan->name, newname);
- }
- }
+ /* loop through selected bones, auto-naming them */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ BLI_strncpy(newname, pchan->name, sizeof(newname));
+ bone_flip_name(newname, 1); // 1 = do strip off number extensions
+ ED_armature_bone_rename(arm, pchan->name, newname);
}
+ CTX_DATA_END;
- BIF_undo_push("Flip names");
+ /* since we renamed stuff... */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
}
-/* context active object */
-void pose_autoside_names(Scene *scene, short axis)
+void POSE_OT_flip_names (wmOperatorType *ot)
{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
- bArmature *arm= ob->data;
- bPoseChannel *pchan;
+ /* identifiers */
+ ot->name= "Flip Names";
+ ot->idname= "POSE_OT_flip_names";
+ ot->description= "Flips (and corrects) the names of selected bones.";
+
+ /* api callbacks */
+ ot->exec= pose_flip_names_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ------------------ */
+
+static int pose_autoside_names_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm;
char newname[32];
+ short axis= RNA_enum_get(op->ptr, "axis");
/* paranoia checks */
- if (ELEM(NULL, ob, ob->pose)) return;
- if (ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
-
- if (pose_has_protected_selected(ob, 0, 1))
- return;
+ if (ELEM(NULL, ob, ob->pose))
+ return OPERATOR_CANCELLED;
+ arm= ob->data;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
- BLI_strncpy(newname, pchan->name, sizeof(newname));
- bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]);
- armature_bone_rename(ob, pchan->name, newname);
- }
- }
+ /* loop through selected bones, auto-naming them */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ BLI_strncpy(newname, pchan->name, sizeof(newname));
+ bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]);
+ ED_armature_bone_rename(arm, pchan->name, newname);
}
+ CTX_DATA_END;
+
+ /* since we renamed stuff... */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_autoside_names (wmOperatorType *ot)
+{
+ static EnumPropertyItem axis_items[]= {
+ {0, "XAXIS", 0, "X-Axis", "Left/Right"},
+ {1, "YAXIS", 0, "Y-Axis", "Front/Back"},
+ {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "AutoName by Axis";
+ ot->idname= "POSE_OT_autoside_names";
+ ot->description= "Automatically renames the selected bones according to which side of the target axis they fall on.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= pose_autoside_names_exec;
+ ot->poll= ED_operator_posemode;
- BIF_undo_push("Flip names");
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* settings */
+ RNA_def_enum(ot->srna, "axis", axis_items, 0, "Axis", "Axis tag names with.");
}
+/* ********************************************** */
+
/* context active object, or weightpainted object with armature in posemode */
void pose_activate_flipped_bone(Scene *scene)
{
@@ -1328,10 +1687,10 @@ void pose_activate_flipped_bone(Scene *scene)
if(ob==NULL) return;
- if(G.f & G_WEIGHTPAINT) {
+ if(ob->mode && OB_MODE_WEIGHT_PAINT) {
ob= modifiers_isDeformedByArmature(ob);
}
- if(ob && (ob->flag & OB_POSEMODE)) {
+ if(ob && (ob->mode & OB_MODE_POSE)) {
bPoseChannel *pchan, *pchanf;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
@@ -1352,9 +1711,9 @@ void pose_activate_flipped_bone(Scene *scene)
pchanf->bone->flag |= (BONE_SELECTED|BONE_ACTIVE);
/* in weightpaint we select the associated vertex group too */
- if(G.f & G_WEIGHTPAINT) {
- vertexgroup_select_by_name(OBACT, name);
- DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
+ if(ob->mode & OB_MODE_WEIGHT_PAINT) {
+ ED_vgroup_select_by_name(OBACT, name);
+ DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
}
// XXX notifiers need to be sent to other editors to update
@@ -1364,259 +1723,271 @@ void pose_activate_flipped_bone(Scene *scene)
}
}
-/* This function pops up the move-to-layer popup widgets when the user
- * presses either SHIFT-MKEY or MKEY in PoseMode OR EditMode (for Armatures)
- */
-void pose_movetolayer(Scene *scene)
+
+/* ********************************************** */
+
+/* Present a popup to get the layers that should be used */
+// TODO: move to wm?
+static uiBlock *wm_layers_select_create_menu(bContext *C, ARegion *ar, void *arg_op)
{
- Object *obedit= scene->obedit; // XXX context
- Object *ob= OBACT;
- bArmature *arm;
- short lay= 0;
- short shift= 0; // XXX
+ 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);
+
+ layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 150, 20, style);
+ uiItemL(layout, op->type->name, 0);
+ uiTemplateLayers(layout, op->ptr, "layers"); /* must have a property named layers setup */
+
+ uiPopupBoundsBlock(block, 4.0f, 0, 0);
+ uiEndBlock(C, block);
- if (ob==NULL) return;
- arm= ob->data;
+ return block;
+}
+
+/* ------------------- */
+
+/* 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);
+ bArmature *arm= (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */
- if (shift) {
- /* armature layers */
- lay= arm->layer;
- if ( movetolayer_short_buts(&lay, "Armature Layers")==0 ) return;
- if (lay==0) return;
- arm->layer= lay;
- if(ob->pose)
- ob->pose->proxy_layer= lay;
-
- }
- else if (obedit) {
- /* the check for editbone layer moving needs to occur before posemode one to work */
- EditBone *ebo;
- EditBone *flipBone;
-
- for (ebo= arm->edbo->first; ebo; ebo= ebo->next) {
- if (arm->layer & ebo->layer) {
- if (ebo->flag & BONE_SELECTED)
- lay |= ebo->layer;
- }
- }
- if (lay==0) return;
-
- if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return;
- if (lay==0) return;
-
- for (ebo= arm->edbo->first; ebo; ebo= ebo->next) {
- if (arm->layer & ebo->layer) {
- if (ebo->flag & BONE_SELECTED) {
- ebo->layer= lay;
- if (arm->flag & ARM_MIRROR_EDIT) {
- flipBone = ED_armature_bone_get_mirrored(arm->edbo, ebo);
- if (flipBone)
- flipBone->layer = lay;
- }
- }
- }
- }
-
- BIF_undo_push("Move Bone Layer");
- }
- else if (ob->flag & OB_POSEMODE) {
- /* pose-channel layers */
- bPoseChannel *pchan;
-
- if (pose_has_protected_selected(ob, 0, 1))
- return;
-
- for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if (arm->layer & pchan->bone->layer) {
- if (pchan->bone->flag & BONE_SELECTED)
- lay |= pchan->bone->layer;
- }
- }
- if (lay==0) return;
-
- if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return;
- if (lay==0) return;
+ /* sanity checking */
+ if (arm == NULL)
+ return OPERATOR_CANCELLED;
- for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if (arm->layer & pchan->bone->layer) {
- if (pchan->bone->flag & BONE_SELECTED)
- pchan->bone->layer= lay;
- }
- }
-
- BIF_undo_push("Move Bone Layer");
- }
+ /* get RNA pointer to armature data to use that to retrieve the layers as ints to init the operator */
+ RNA_id_pointer_create((ID *)arm, &ptr);
+ RNA_boolean_get_array(&ptr, "layer", layers);
+ RNA_boolean_set_array(op->ptr, "layers", layers);
+
+ /* part to sync with other similar operators... */
+ /* pass on operator, so return modal */
+ uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT);
+ return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH;
}
-#if 0
-// XXX old sys
-/* for use with pose_relax only */
-static int pose_relax_icu(struct IpoCurve *icu, float framef, float *val, float *frame_prev, float *frame_next)
+/* Set the visible layers for the active armature (edit and pose modes) */
+static int pose_armature_layers_exec (bContext *C, wmOperator *op)
{
- if (!icu) {
- return 0;
- }
- else {
- BezTriple *bezt = icu->bezt;
-
- BezTriple *bezt_prev=NULL, *bezt_next=NULL;
- float w1, w2, wtot;
- int i;
-
- for (i=0; i < icu->totvert; i++, bezt++) {
- if (bezt->vec[1][0] < framef - 0.5) {
- bezt_prev = bezt;
- } else {
- break;
- }
- }
-
- if (bezt_prev==NULL) return 0;
-
- /* advance to the next, dont need to advance i */
- bezt = bezt_prev+1;
-
- for (; i < icu->totvert; i++, bezt++) {
- if (bezt->vec[1][0] > framef + 0.5) {
- bezt_next = bezt;
- break;
- }
- }
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm= (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */
+
+ /* get the values set in the operator properties */
+ RNA_boolean_get_array(op->ptr, "layers", layers);
+
+ /* get pointer for armature, and write data there... */
+ RNA_id_pointer_create((ID *)arm, &ptr);
+ RNA_boolean_set_array(&ptr, "layer", layers);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void POSE_OT_armature_layers (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Change Armature Layers";
+ ot->idname= "POSE_OT_armature_layers";
+ ot->description= "Change the visible armature layers.";
+
+ /* callbacks */
+ ot->invoke= pose_armature_layers_invoke;
+ ot->exec= pose_armature_layers_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers to make visible.");
+}
+
+void ARMATURE_OT_armature_layers (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Change Armature Layers";
+ ot->idname= "ARMATURE_OT_armature_layers";
+ ot->description= "Change the visible armature layers.";
+
+ /* callbacks */
+ ot->invoke= pose_armature_layers_invoke;
+ ot->exec= pose_armature_layers_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers to make visible.");
+}
+
+/* ------------------- */
+
+/* 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[16]; /* hardcoded for now - we can only have 16 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, bPoseChannel *, pchan, selected_pchans)
+ {
+ short bit;
- if (bezt_next==NULL) return 0;
-
- if (val) {
- w1 = framef - bezt_prev->vec[1][0];
- w2 = bezt_next->vec[1][0] - framef;
- wtot = w1 + w2;
- w1=w1/wtot;
- w2=w2/wtot;
-#if 0
- val = (bezt_prev->vec[1][1] * w2) + (bezt_next->vec[1][1] * w1);
-#else
- /* apply the value with a hard coded 6th */
- *val = (((bezt_prev->vec[1][1] * w2) + (bezt_next->vec[1][1] * w1)) + (*val * 5.0f)) / 6.0f;
-#endif
+ /* loop over the bits for this pchan's layers, adding layers where they're needed */
+ for (bit= 0; bit < 16; bit++) {
+ if (pchan->bone->layer & (1<<bit))
+ layers[bit]= 1;
}
-
- if (frame_prev) *frame_prev = bezt_prev->vec[1][0];
- if (frame_next) *frame_next = bezt_next->vec[1][0];
-
- return 1;
}
+ CTX_DATA_END;
+
+ /* copy layers to operator */
+ RNA_boolean_set_array(op->ptr, "layers", layers);
+
+ /* part to sync with other similar operators... */
+ /* pass on operator, so return modal */
+ uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT);
+ return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH;
}
-#endif
-void pose_relax(Scene *scene)
+/* Set the visible layers for the active armature (edit and pose modes) */
+static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob = OBACT;
- bPose *pose;
- bAction *act;
- bArmature *arm;
+ Object *ob= CTX_data_active_object(C);
+ bArmature *arm= (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */
+
+ /* get the values set in the operator properties */
+ RNA_boolean_get_array(op->ptr, "layers", layers);
+
+ /* set layers of pchans based on the values set in the operator props */
+ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pchans)
+ {
+ /* get pointer for pchan, and write flags this way */
+ RNA_pointer_create((ID *)arm, &RNA_Bone, pchan->bone, &ptr);
+ RNA_boolean_set_array(&ptr, "layer", layers);
+ }
+ CTX_DATA_END;
-// IpoCurve *icu_w, *icu_x, *icu_y, *icu_z;
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
- bPoseChannel *pchan;
-// bActionChannel *achan;
-// float framef = F_CFRA;
-// float frame_prev, frame_next;
-// float quat_prev[4], quat_next[4], quat_interp[4], quat_orig[4];
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_bone_layers (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Change Bone Layers";
+ ot->idname= "POSE_OT_bone_layers";
+ ot->description= "Change the layers that the selected bones belong to.";
- int do_scale = 0;
- int do_loc = 0;
- int do_quat = 0;
- int flag = 0;
-// int do_x, do_y, do_z;
+ /* callbacks */
+ ot->invoke= pose_bone_layers_invoke;
+ ot->exec= pose_bone_layers_exec;
+ ot->poll= ED_operator_posemode;
- if (!ob) return;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- pose = ob->pose;
- act = ob->action;
- arm = (bArmature *)ob->data;
+ /* properties */
+ RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers that bone belongs to.");
+}
+
+/* ------------------- */
+
+/* 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[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */
- if (!pose || !act || !arm) return;
+ /* get layers that are active already */
+ memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */
- for (pchan=pose->chanbase.first; pchan; pchan= pchan->next) {
-
- pchan->bone->flag &= ~BONE_TRANSFORM;
+ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
+ {
+ short bit;
- if (pchan->bone->layer & arm->layer) {
- if (pchan->bone->flag & BONE_SELECTED) {
- /* do we have an ipo curve? */
-#if 0 // XXX old animation system
- achan= get_action_channel(act, pchan->name);
-
- if (achan && achan->ipo) {
- /*calc_ipo(achan->ipo, ctime);*/
-
- do_x = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_X), framef, &pchan->loc[0], NULL, NULL);
- do_y = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_Y), framef, &pchan->loc[1], NULL, NULL);
- do_z = pose_relax_icu(find_ipocurve(achan->ipo, AC_LOC_Z), framef, &pchan->loc[2], NULL, NULL);
- do_loc += do_x + do_y + do_z;
-
- do_x = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_X), framef, &pchan->size[0], NULL, NULL);
- do_y = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_Y), framef, &pchan->size[1], NULL, NULL);
- do_z = pose_relax_icu(find_ipocurve(achan->ipo, AC_SIZE_Z), framef, &pchan->size[2], NULL, NULL);
- do_scale += do_x + do_y + do_z;
-
- if( ((icu_w = find_ipocurve(achan->ipo, AC_QUAT_W))) &&
- ((icu_x = find_ipocurve(achan->ipo, AC_QUAT_X))) &&
- ((icu_y = find_ipocurve(achan->ipo, AC_QUAT_Y))) &&
- ((icu_z = find_ipocurve(achan->ipo, AC_QUAT_Z))) )
- {
- /* use the quatw keyframe as a basis for others */
- if (pose_relax_icu(icu_w, framef, NULL, &frame_prev, &frame_next)) {
- /* get 2 quats */
- quat_prev[0] = eval_icu(icu_w, frame_prev);
- quat_prev[1] = eval_icu(icu_x, frame_prev);
- quat_prev[2] = eval_icu(icu_y, frame_prev);
- quat_prev[3] = eval_icu(icu_z, frame_prev);
-
- quat_next[0] = eval_icu(icu_w, frame_next);
- quat_next[1] = eval_icu(icu_x, frame_next);
- quat_next[2] = eval_icu(icu_y, frame_next);
- quat_next[3] = eval_icu(icu_z, frame_next);
-
-#if 0
- /* apply the setting, completely smooth */
- QuatInterpol(pchan->quat, quat_prev, quat_next, (framef-frame_prev) / (frame_next-frame_prev) );
-#else
- /* tricky interpolation */
- QuatInterpol(quat_interp, quat_prev, quat_next, (framef-frame_prev) / (frame_next-frame_prev) );
- QUATCOPY(quat_orig, pchan->quat);
- QuatInterpol(pchan->quat, quat_orig, quat_interp, 1.0f/6.0f);
- /* done */
-#endif
- do_quat++;
- }
- }
-
- /* apply BONE_TRANSFORM tag so that autokeying will pick it up */
- pchan->bone->flag |= BONE_TRANSFORM;
- }
-
-#endif // XXX old animation system
- }
+ /* loop over the bits for this pchan's layers, adding layers where they're needed */
+ for (bit= 0; bit < 16; bit++) {
+ if (ebone->layer & (1<<bit))
+ layers[bit]= 1;
}
}
+ CTX_DATA_END;
+
+ /* copy layers to operator */
+ RNA_boolean_set_array(op->ptr, "layers", layers);
- ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
-
- /* do auto-keying */
- if (do_loc) flag |= TFM_TRANSLATION;
- if (do_scale) flag |= TFM_RESIZE;
- if (do_quat) flag |= TFM_ROTATION;
- autokeyframe_pose_cb_func(ob, flag, 0);
-
- /* clear BONE_TRANSFORM flags */
- for (pchan=pose->chanbase.first; pchan; pchan= pchan->next)
- pchan->bone->flag &= ~ BONE_TRANSFORM;
-
- /* do depsgraph flush */
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- BIF_undo_push("Relax Pose");
+ /* part to sync with other similar operators... */
+ /* pass on operator, so return modal */
+ uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT);
+ return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH;
}
+/* Set the visible layers for the active armature (edit and pose modes) */
+static int armature_bone_layers_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+ bArmature *arm= (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */
+
+ /* get the values set in the operator properties */
+ RNA_boolean_get_array(op->ptr, "layers", layers);
+
+ /* set layers of pchans based on the values set in the operator props */
+ CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
+ {
+ /* get pointer for pchan, and write flags this way */
+ RNA_pointer_create((ID *)arm, &RNA_EditBone, ebone, &ptr);
+ RNA_boolean_set_array(&ptr, "layer", layers);
+ }
+ CTX_DATA_END;
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_bone_layers (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Change Bone Layers";
+ ot->idname= "ARMATURE_OT_bone_layers";
+ ot->description= "Change the layers that the selected bones belong to.";
+
+ /* callbacks */
+ ot->invoke= armature_bone_layers_invoke;
+ ot->exec= armature_bone_layers_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers that bone belongs to.");
+}
+
+/* ********************************************** */
+
/* for use in insertkey, ensure rotation goes other way around */
void pose_flipquats(Scene *scene)
{
@@ -1652,7 +2023,7 @@ void pose_special_editmenu(Scene *scene)
/* paranoia checks */
if(!ob && !ob->pose) return;
- if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return;
+ if(ob==obedit || (ob->mode & OB_MODE_POSE)==0) return;
nr= pupmenu("Specials%t|Select Constraint Target%x1|Flip Left-Right Names%x2|Calculate Paths%x3|Clear Paths%x4|Clear User Transform %x5|Relax Pose %x6|%l|AutoName Left-Right%x7|AutoName Front-Back%x8|AutoName Top-Bottom%x9");
if(nr==1) {
@@ -1708,7 +2079,7 @@ void pose_clear_user_transforms(Scene *scene, Object *ob)
rest_pose(ob->pose);
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Clear User Transform");
}
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index ea794b2c7c1..132d9edf8d0 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -3179,6 +3179,7 @@ static void setIteratorValues(ReebArcIterator *iter, EmbedBucket *bucket)
iter->p = NULL;
iter->no = NULL;
}
+ iter->size = 0;
}
void initArcIterator(BArcIterator *arg, ReebArc *arc, ReebNode *head)
@@ -3276,6 +3277,7 @@ static void* headNode(void *arg)
iter->p = node->p;
iter->no = node->no;
+ iter->size = 0;
return node;
}
@@ -3296,6 +3298,7 @@ static void* tailNode(void *arg)
iter->p = node->p;
iter->no = node->no;
+ iter->size = 0;
return node;
}
diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h
index 3bdd55509ad..6a3a261cb10 100644
--- a/source/blender/editors/armature/reeb.h
+++ b/source/blender/editors/armature/reeb.h
@@ -126,6 +126,7 @@ typedef struct ReebArcIterator {
StoppedFct stopped;
float *p, *no;
+ float size;
int length;
int index;
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 2146855a75e..ad3e9427861 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -75,7 +75,8 @@ void CURVE_OT_spline_type_set(struct wmOperatorType *ot);
void CURVE_OT_radius_set(struct wmOperatorType *ot);
void CURVE_OT_spline_weight_set(struct wmOperatorType *ot);
void CURVE_OT_handle_type_set(struct wmOperatorType *ot);
-void CURVE_OT_smooth_set(struct wmOperatorType *ot);
+void CURVE_OT_shade_smooth(struct wmOperatorType *ot);
+void CURVE_OT_shade_flat(struct wmOperatorType *ot);
void CURVE_OT_tilt_clear(struct wmOperatorType *ot);
void CURVE_OT_smooth(struct wmOperatorType *ot);
@@ -84,7 +85,7 @@ void CURVE_OT_smooth_radius(struct wmOperatorType *ot);
void CURVE_OT_de_select_first(struct wmOperatorType *ot);
void CURVE_OT_de_select_last(struct wmOperatorType *ot);
void CURVE_OT_select_all_toggle(struct wmOperatorType *ot);
-void CURVE_OT_select_invert(struct wmOperatorType *ot);
+void CURVE_OT_select_inverse(struct wmOperatorType *ot);
void CURVE_OT_select_linked(struct wmOperatorType *ot);
void CURVE_OT_select_row(struct wmOperatorType *ot);
void CURVE_OT_select_next(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 66cde772f3e..77c5ed1de2c 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -53,10 +53,9 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_screen.h"
#include "ED_object.h"
-
-#include "BIF_transform.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
#include "UI_interface.h"
@@ -131,7 +130,8 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_radius_set);
WM_operatortype_append(CURVE_OT_spline_weight_set);
WM_operatortype_append(CURVE_OT_handle_type_set);
- WM_operatortype_append(CURVE_OT_smooth_set);
+ WM_operatortype_append(CURVE_OT_shade_smooth);
+ WM_operatortype_append(CURVE_OT_shade_flat);
WM_operatortype_append(CURVE_OT_tilt_clear);
WM_operatortype_append(CURVE_OT_smooth);
@@ -140,7 +140,7 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_de_select_first);
WM_operatortype_append(CURVE_OT_de_select_last);
WM_operatortype_append(CURVE_OT_select_all_toggle);
- WM_operatortype_append(CURVE_OT_select_invert);
+ WM_operatortype_append(CURVE_OT_select_inverse);
WM_operatortype_append(CURVE_OT_select_linked);
WM_operatortype_append(CURVE_OT_select_row);
WM_operatortype_append(CURVE_OT_select_next);
@@ -163,7 +163,10 @@ void ED_operatortypes_curve(void)
void ED_keymap_curve(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Font", 0, 0);
+ wmKeyMap *keymap;
+
+ keymap= WM_keymap_find(wm, "Font", 0, 0);
+ keymap->poll= ED_operator_editfont;
/* only set in editmode font, by space_view3d listener */
RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_style_toggle", BKEY, KM_PRESS, KM_CTRL, 0)->ptr, "style", CU_BOLD);
@@ -202,14 +205,18 @@ void ED_keymap_curve(wmWindowManager *wm)
RNA_int_set(WM_keymap_add_item(keymap, "FONT_OT_change_character", DOWNARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1);
WM_keymap_add_item(keymap, "FONT_OT_text_copy", CKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "FONT_OT_text_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "FONT_OT_text_cut", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "FONT_OT_text_paste", PKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "FONT_OT_text_cut", XKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "FONT_OT_text_paste", VKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "FONT_OT_text_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
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!
/* only set in editmode curve, by space_view3d listener */
- keymap= WM_keymap_listbase(wm, "Curve", 0, 0);
+ keymap= WM_keymap_find(wm, "Curve", 0, 0);
+ keymap->poll= ED_operator_editsurfcurve;
WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
@@ -230,7 +237,8 @@ void ED_keymap_curve(wmWindowManager *wm)
WM_keymap_add_item(keymap, "CURVE_OT_delete", DELKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, 0, 0)->ptr, "mode", TFM_TILT);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", TFM_TILT);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TFM_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);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 5283aacf39e..a18815d04a6 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -73,23 +73,19 @@
#include "ED_keyframes_edit.h"
#include "ED_object.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
#include "ED_view3d.h"
#include "UI_interface.h"
-#include "BIF_transform.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
/* still need to eradicate a few :( */
#define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name)
-/* for curve objects in editmode that can have hidden handles */
-#define BEZSELECTED_HIDDENHANDLES(bezt) ((G.f & G_HIDDENHANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt))
-
float nurbcircle[8][2]= {
{0.0, -1.0}, {-1.0, -1.0}, {-1.0, 0.0}, {-1.0, 1.0},
{0.0, 1.0}, { 1.0, 1.0}, { 1.0, 0.0}, { 1.0, -1.0}
@@ -195,7 +191,7 @@ int isNurbsel(Nurb *nu)
BPoint *bp;
int a;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -214,17 +210,17 @@ int isNurbsel(Nurb *nu)
return 0;
}
-int isNurbsel_count(Nurb *nu)
+int isNurbsel_count(Curve *cu, Nurb *nu)
{
BezTriple *bezt;
BPoint *bp;
int a, sel=0;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if (BEZSELECTED_HIDDENHANDLES(bezt)) sel++;
+ if (BEZSELECTED_HIDDENHANDLES(cu, bezt)) sel++;
bezt++;
}
}
@@ -248,7 +244,7 @@ void printknots(Object *obedit)
int a, num;
for(nu= editnurb->first; nu; nu= nu->next) {
- if(isNurbsel(nu) && (nu->type & 7)==CU_NURBS) {
+ if(isNurbsel(nu) && nu->type == CU_NURBS) {
if(nu->knotsu) {
num= KNOTSU(nu);
for(a=0;a<num;a++) printf("knotu %d: %f\n", a, nu->knotsu[a]);
@@ -270,6 +266,8 @@ void load_editNurb(Object *obedit)
if(obedit==NULL) return;
+ set_actNurb(obedit, NULL);
+
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
Nurb *nu, *newnu;
@@ -301,7 +299,7 @@ void load_editNurb(Object *obedit)
newnu= duplicateNurb(nu);
BLI_addtail(&(cu->nurb), newnu);
- if((nu->type & 7)==CU_NURBS) {
+ if(nu->type == CU_NURBS) {
clamp_nurb_order_u(nu);
}
}
@@ -315,11 +313,13 @@ void load_editNurb(Object *obedit)
void make_editNurb(Object *obedit)
{
ListBase *editnurb= curve_get_editcurve(obedit);
- Nurb *nu, *newnu;
+ Nurb *nu, *newnu, *nu_act= NULL;
KeyBlock *actkey;
if(obedit==NULL) return;
+ set_actNurb(obedit, NULL);
+
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
@@ -335,6 +335,12 @@ void make_editNurb(Object *obedit)
newnu= duplicateNurb(nu);
test2DNurb(newnu); // after join, or any other creation of curve
BLI_addtail(editnurb, newnu);
+
+ if (nu_act == NULL && isNurbsel(nu)) {
+ nu_act= newnu;
+ set_actNurb(obedit, newnu);
+ }
+
nu= nu->next;
}
@@ -344,8 +350,6 @@ void make_editNurb(Object *obedit)
key_to_curve(actkey, cu, editnurb);
}
}
-
- set_actNurb(obedit, NULL);
}
void free_editNurb(Object *obedit)
@@ -410,10 +414,10 @@ static int separate_exec(bContext *C, wmOperator *op)
load_editNurb(newob);
free_editNurb(newob);
- DAG_object_flush_update(scene, oldob, OB_RECALC_DATA); /* this is the original one */
- DAG_object_flush_update(scene, newob, OB_RECALC_DATA); /* this is the separated one */
+ 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 */
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, oldob);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, oldob->data);
WM_cursor_wait(0);
@@ -485,7 +489,7 @@ static void setflagsNurb(ListBase *editnurb, short flag)
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -512,7 +516,7 @@ static void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float ro
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_NURBS) {
+ if(nu->type == CU_NURBS) {
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
@@ -541,7 +545,7 @@ static void translateflagNurb(ListBase *editnurb, short flag, float *vec)
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -571,7 +575,7 @@ static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /*
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_NURBS) {
+ if(nu->type == CU_NURBS) {
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
@@ -835,7 +839,7 @@ static void adduplicateflagNurb(Object *obedit, short flag)
nu= editnurb->last;
while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
for(a=0; a<nu->pntsu; a++) {
enda= -1;
@@ -1006,8 +1010,8 @@ static int switch_direction_exec(bContext *C, wmOperator *op)
if(isNurbsel(nu))
switchdirectionNurb(nu);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1053,8 +1057,8 @@ static int set_weight_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1067,14 +1071,14 @@ void CURVE_OT_spline_weight_set(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_weight_exec;
- ot->invoke= WM_operator_redo;
+ ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_editsurfcurve;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_float_percentage(ot->srna, "weight", 1.0f, 0.0f, 1.0f, "Weight", "", 0.0f, 1.0f);
+ RNA_def_float_factor(ot->srna, "weight", 1.0f, 0.0f, 1.0f, "Weight", "", 0.0f, 1.0f);
}
/******************* set radius operator ******************/
@@ -1104,8 +1108,8 @@ static int set_radius_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -1118,7 +1122,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_radius_exec;
- ot->invoke= WM_operator_redo;
+ ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_editsurfcurve;
/* flags */
@@ -1179,8 +1183,8 @@ static int smooth_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -1344,8 +1348,8 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -1382,7 +1386,7 @@ static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short
for(nu= editnurb->first; nu; nu= nu->next) {
lastsel=0;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
if(next < 0) bezt= (nu->bezt + (a-1));
@@ -1448,7 +1452,7 @@ void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatu
for(nu= editnurb->first; nu; nu= nu->next) {
sel= 0;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
/* which point? */
@@ -1494,7 +1498,7 @@ static int de_select_first_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
selectend_nurb(obedit, FIRST, 1, DESELECT);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1518,7 +1522,7 @@ static int de_select_last_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
selectend_nurb(obedit, LAST, 1, DESELECT);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1547,7 +1551,7 @@ static short nurb_has_selected_cps(ListBase *editnurb)
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -1586,7 +1590,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
select_adjacent_cp(editnurb, 1, 1, SELECT); /* cascade selection */
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1610,6 +1614,7 @@ void CURVE_OT_select_all_toggle(wmOperatorType *ot)
static int hide_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
BPoint *bp;
@@ -1617,16 +1622,16 @@ static int hide_exec(bContext *C, wmOperator *op)
int a, sel, invert= RNA_boolean_get(op->ptr, "unselected");
for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
sel= 0;
while(a--) {
- if(invert == 0 && BEZSELECTED_HIDDENHANDLES(bezt)) {
+ if(invert == 0 && BEZSELECTED_HIDDENHANDLES(cu, bezt)) {
select_beztriple(bezt, DESELECT, 1, HIDDEN);
bezt->hide= 1;
}
- else if(invert && !BEZSELECTED_HIDDENHANDLES(bezt)) {
+ else if(invert && !BEZSELECTED_HIDDENHANDLES(cu, bezt)) {
select_beztriple(bezt, DESELECT, 1, HIDDEN);
bezt->hide= 1;
}
@@ -1655,8 +1660,8 @@ static int hide_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1691,7 +1696,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
for(nu= editnurb->first; nu; nu= nu->next) {
nu->hide= 0;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -1715,8 +1720,8 @@ static int reveal_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1737,9 +1742,10 @@ void CURVE_OT_reveal(wmOperatorType *ot)
/********************** select invert operator *********************/
-static int select_invert_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
BPoint *bp;
@@ -1747,13 +1753,13 @@ static int select_invert_exec(bContext *C, wmOperator *op)
int a;
for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
bezt->f2 ^= SELECT; /* always do the center point */
- if ((G.f & G_HIDDENHANDLES)==0) {
+ if((cu->drawflag & CU_HIDE_HANDLES)==0) {
bezt->f1 ^= SELECT;
bezt->f3 ^= SELECT;
}
@@ -1771,19 +1777,19 @@ static int select_invert_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
-void CURVE_OT_select_invert(wmOperatorType *ot)
+void CURVE_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select Invert";
- ot->idname= "CURVE_OT_select_invert";
+ ot->name= "Select Inverse";
+ ot->idname= "CURVE_OT_select_inverse";
/* api callbacks */
- ot->exec= select_invert_exec;
+ ot->exec= select_inverse_exec;
ot->poll= ED_operator_editsurfcurve;
/* flags */
@@ -1804,6 +1810,7 @@ void CURVE_OT_select_invert(wmOperatorType *ot)
static int subdivide_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
BezTriple *prevbezt, *bezt, *beztnew, *beztn;
@@ -1815,7 +1822,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
for(nu= editnurb->first; nu; nu= nu->next) {
amount= 0;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
/*
Insert a point into a 2D Bezier curve.
Endpoints are preserved. Otherwise, all selected and inserted points are
@@ -1833,7 +1840,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
bezt= prevbezt+1;
}
while(a--) {
- if( BEZSELECTED_HIDDENHANDLES(prevbezt) && BEZSELECTED_HIDDENHANDLES(bezt) ) amount++;
+ if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) amount++;
prevbezt= bezt;
bezt++;
}
@@ -1857,7 +1864,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
memcpy(beztn, prevbezt, sizeof(BezTriple));
beztn++;
- if( BEZSELECTED_HIDDENHANDLES(prevbezt) && BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
memcpy(beztn, bezt, sizeof(BezTriple));
/* midpoint subdividing */
@@ -1896,7 +1903,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
calchandlesNurb(nu);
}
- } /* End of 'if((nu->type & 7)==CU_BEZIER)' */
+ } /* End of 'if(nu->type == CU_BEZIER)' */
else if (nu->pntsv==1) {
/*
All flat lines (ie. co-planar), except flat Nurbs. Flat NURB curves
@@ -1965,7 +1972,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
}
}
} /* End of 'else if(nu->pntsv==1)' */
- else if((nu->type & 7)==CU_NURBS) {
+ else if(nu->type == CU_NURBS) {
/* This is a very strange test ... */
/**
Subdivide NURB surfaces - nzc 30-5-'00 -
@@ -2164,11 +2171,11 @@ static int subdivide_exec(bContext *C, wmOperator *op)
MEM_freeN(usel);
MEM_freeN(vsel);
- } /* End of 'if((nu->type & 7)==CU_NURBS)' */
+ } /* End of 'if(nu->type == CU_NURBS)' */
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2257,7 +2264,7 @@ static void findselectedNurbvert(ListBase *editnurb, Nurb **nu, BezTriple **bezt
*bezt= 0;
*bp= 0;
for(nu1= editnurb->first; nu1; nu1= nu1->next) {
- if((nu1->type & 7)==CU_BEZIER) {
+ if(nu1->type == CU_BEZIER) {
bezt1= nu1->bezt;
a= nu1->pntsu;
while(a--) {
@@ -2314,7 +2321,7 @@ static int convertspline(short type, Nurb *nu)
BPoint *bp;
int a, c, nr;
- if((nu->type & 7)==CU_POLY) {
+ if(nu->type == CU_POLY) {
if(type==CU_BEZIER) { /* to Bezier with vecthandles */
nr= nu->pntsu;
bezt =
@@ -2334,13 +2341,11 @@ static int convertspline(short type, Nurb *nu)
MEM_freeN(nu->bp);
nu->bp= 0;
nu->pntsu= nr;
- nu->type &= ~7;
- nu->type |= CU_BEZIER;
+ nu->type = CU_BEZIER;
calchandlesNurb(nu);
}
else if(type==CU_NURBS) {
- nu->type &= ~7;
- nu->type |= CU_NURBS;
+ nu->type = CU_NURBS;
nu->orderu= 4;
nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */
nu->flagu += 4;
@@ -2353,15 +2358,15 @@ static int convertspline(short type, Nurb *nu)
}
}
}
- else if((nu->type & 7)==CU_BEZIER) { /* Bezier */
- if(type==0 || type==4) { /* to Poly or Nurb */
+ else if(nu->type == CU_BEZIER) { /* Bezier */
+ if(type==CU_POLY || type==CU_NURBS) {
nr= 3*nu->pntsu;
nu->bp = MEM_callocN(nr * sizeof(BPoint), "setsplinetype");
a= nu->pntsu;
bezt= nu->bezt;
bp= nu->bp;
while(a--) {
- if(type==0 && bezt->h1==HD_VECT && bezt->h2==HD_VECT) {
+ if(type==CU_POLY && bezt->h1==HD_VECT && bezt->h2==HD_VECT) {
/* vector handle becomes 1 poly vertice */
VECCOPY(bp->vec, bezt->vec[1]);
bp->vec[3]= 1.0;
@@ -2386,25 +2391,24 @@ static int convertspline(short type, Nurb *nu)
bezt++;
}
MEM_freeN(nu->bezt);
- nu->bezt= 0;
+ nu->bezt= NULL;
nu->pntsu= nr;
nu->pntsv= 1;
nu->orderu= 4;
nu->orderv= 1;
- nu->type &= ~7;
- nu->type+= type;
+ nu->type = type;
if(nu->flagu & CU_CYCLIC) c= nu->orderu-1;
else c= 0;
- if(type== 4) {
+ if(type== CU_NURBS) {
nu->flagu &= CU_CYCLIC; /* disable all flags except for cyclic */
nu->flagu += 4;
makeknots(nu, 1);
}
}
}
- else if((nu->type & 7)==CU_NURBS) {
- if(type==0) { /* to Poly */
- nu->type &= ~7;
+ else if(nu->type == CU_NURBS) {
+ if(type==CU_POLY) {
+ nu->type = CU_POLY;
if(nu->knotsu) MEM_freeN(nu->knotsu); /* python created nurbs have a knotsu of zero */
nu->knotsu= NULL;
if(nu->knotsv) MEM_freeN(nu->knotsv);
@@ -2439,8 +2443,7 @@ static int convertspline(short type, Nurb *nu)
MEM_freeN(nu->knotsu);
nu->knotsu= NULL;
nu->pntsu= nr;
- nu->type &= ~7;
- nu->type |= CU_BEZIER;
+ nu->type = CU_BEZIER;
}
}
}
@@ -2469,7 +2472,15 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
}
}
- return (changed)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
+ if(changed) {
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
}
void CURVE_OT_spline_type_set(wmOperatorType *ot)
@@ -2477,8 +2488,8 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
static EnumPropertyItem type_items[]= {
{CU_POLY, "POLY", 0, "Poly", ""},
{CU_BEZIER, "BEZIER", 0, "Bezier", ""},
- {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
- {CU_BSPLINE, "B_SPLINE", 0, "B-Spline", ""},
+// {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
+// {CU_BSPLINE, "B_SPLINE", 0, "B-Spline", ""},
{CU_NURBS, "NURBS", 0, "NURBS", ""},
{0, NULL, 0, NULL, NULL}};
@@ -2488,6 +2499,7 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_spline_type_exec;
+ ot->invoke= WM_menu_invoke;
ot->poll= ED_operator_editcurve;
/* flags */
@@ -2501,14 +2513,13 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
static int set_handle_type_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
sethandlesNurb(editnurb, RNA_enum_get(op->ptr, "type"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2535,7 +2546,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", type_items, CU_POLY, "Type", "Spline type");
+ RNA_def_enum(ot->srna, "type", type_items, 1, "Type", "Spline type");
}
/***************** make segment operator **********************/
@@ -2801,7 +2812,7 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu
}
}
- if((nu1->type & 7)==CU_NURBS) {
+ if(nu1->type == CU_NURBS) {
/* merge knots */
makeknots(nu1, 1);
@@ -2862,8 +2873,8 @@ static int merge_nurb(bContext *C, wmOperator *op)
set_actNurb(obedit, NULL);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2871,8 +2882,8 @@ static int merge_nurb(bContext *C, wmOperator *op)
static int make_segment_exec(bContext *C, wmOperator *op)
{
/* joins 2 curves */
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu, *nu1=0, *nu2=0;
BezTriple *bezt;
@@ -2888,8 +2899,8 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if( isNurbsel(nu) ) {
if(nu->pntsu>1 && nu->pntsv>1) break;
- if(isNurbsel_count(nu)>1) break;
- if(isNurbsel_count(nu)==1) {
+ if(isNurbsel_count(cu, nu)>1) break;
+ if(isNurbsel_count(cu, nu)==1) {
/* only 1 selected, not first or last, a little complex, but intuitive */
if(nu->pntsv==1) {
if( (nu->bp->f1 & SELECT) || ((nu->bp+nu->pntsu-1)->f1 & SELECT));
@@ -2906,26 +2917,26 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* find both nurbs and points, nu1 will be put behind nu2 */
for(nu= editnurb->first; nu; nu= nu->next) {
if((nu->flagu & CU_CYCLIC)==0) { /* not cyclic */
- if( (nu->type & 7)==CU_BEZIER ) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
if(nu1==0) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) nu1= nu;
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) nu1= nu;
else {
bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu1= nu;
switchdirectionNurb(nu);
}
}
}
else if(nu2==0) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
}
else {
bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu2= nu;
}
}
@@ -2963,7 +2974,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if((nu1 && nu2) && (nu1!=nu2)) {
if( nu1->type==nu2->type) {
- if((nu1->type & 7)==CU_BEZIER) {
+ if(nu1->type == CU_BEZIER) {
bezt =
(BezTriple*)MEM_mallocN((nu1->pntsu+nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
memcpy(bezt, nu2->bezt, nu2->pntsu*sizeof(BezTriple));
@@ -2989,7 +3000,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
BLI_remlink(editnurb, nu2);
/* now join the knots */
- if((nu1->type & 7)==CU_NURBS) {
+ if(nu1->type == CU_NURBS) {
if(nu1->knotsu==NULL) {
makeknots(nu1, 1);
}
@@ -3016,8 +3027,8 @@ static int make_segment_exec(bContext *C, wmOperator *op)
set_actNurb(obedit, NULL); /* for selected */
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -3046,8 +3057,8 @@ void CURVE_OT_make_segment(wmOperatorType *ot)
void mouse_nurb(bContext *C, short mval[2], int extend)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
Curve *cu= obedit->data;
+ ListBase *editnurb= curve_get_editcurve(obedit);
ViewContext vc;
Nurb *nu;
BezTriple *bezt=0;
@@ -3101,7 +3112,7 @@ void mouse_nurb(bContext *C, short mval[2], int extend)
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
if(nu!=get_actNurb(obedit))
set_actNurb(obedit, nu);
@@ -3232,8 +3243,8 @@ static int spin_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -3256,7 +3267,6 @@ void CURVE_OT_spin(wmOperatorType *ot)
static int addvert_Nurb(bContext *C, short mode, float location[3])
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
@@ -3270,7 +3280,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
findselectedNurbvert(editnurb, &nu, &bezt, &bp);
if(bezt==0 && bp==0) return OPERATOR_CANCELLED;
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
/* which bezpoint? */
if(bezt== nu->bezt) { /* first */
BEZ_DESEL(bezt);
@@ -3368,8 +3378,8 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
test2DNurb(nu);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -3424,14 +3434,14 @@ void CURVE_OT_vertex_add(wmOperatorType *ot)
static int extrude_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
/* first test: curve? */
for(nu= editnurb->first; nu; nu= nu->next)
- if(nu->pntsv==1 && isNurbsel_count(nu)==1)
+ if(nu->pntsv==1 && isNurbsel_count(cu, nu)==1)
break;
if(obedit->type==OB_CURVE || nu) {
@@ -3439,8 +3449,8 @@ static int extrude_exec(bContext *C, wmOperator *op)
}
else {
if(extrudeflagNurb(editnurb, 1)) { /* '1'= flag */
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -3482,6 +3492,7 @@ void CURVE_OT_extrude(wmOperatorType *ot)
static int toggle_cyclic_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
BezTriple *bezt;
@@ -3490,7 +3501,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
for(nu= editnurb->first; nu; nu= nu->next) {
if( nu->pntsu>1 || nu->pntsv>1) {
- if( (nu->type & 7)==CU_POLY ) {
+ if(nu->type == CU_POLY) {
a= nu->pntsu;
bp= nu->bp;
while(a--) {
@@ -3501,11 +3512,11 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
bp++;
}
}
- else if( (nu->type & 7)==CU_BEZIER ) {
+ else if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
nu->flagu ^= CU_CYCLIC;
break;
}
@@ -3513,7 +3524,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
}
calchandlesNurb(nu);
}
- else if(nu->pntsv==1 && (nu->type & 7)==CU_NURBS) {
+ else if(nu->pntsv==1 && nu->type == CU_NURBS) {
if (nu->knotsu) { /* if check_valid_nurb_u fails the knotsu can be NULL */
a= nu->pntsu;
bp= nu->bp;
@@ -3550,8 +3561,8 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -3642,7 +3653,7 @@ static int select_linked_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -3683,8 +3694,8 @@ void CURVE_OT_select_linked(wmOperatorType *ot)
static int select_row_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
Curve *cu= obedit->data;
+ ListBase *editnurb= curve_get_editcurve(obedit);
static BPoint *last=0;
static int direction=0;
Nurb *nu;
@@ -3734,7 +3745,7 @@ static int select_row_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -3761,7 +3772,7 @@ static int select_next_exec(bContext *C, wmOperator *op)
ListBase *editnurb= curve_get_editcurve(obedit);
select_adjacent_cp(editnurb, 1, 0, SELECT);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -3788,7 +3799,7 @@ static int select_previous_exec(bContext *C, wmOperator *op)
ListBase *editnurb= curve_get_editcurve(obedit);
select_adjacent_cp(editnurb, -1, 0, SELECT);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -3875,7 +3886,7 @@ static int select_more_exec(bContext *C, wmOperator *op)
select_adjacent_cp(editnurb, -1, 0, SELECT);
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -3964,7 +3975,7 @@ static int select_less_exec(bContext *C, wmOperator *op)
for(nu= editnurb->first; nu; nu= nu->next) {
lastsel=0;
/* check what type of curve/nurb it is */
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -4036,7 +4047,7 @@ static int select_less_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -4110,7 +4121,7 @@ static int select_random_exec(bContext *C, wmOperator *op)
/* select elements */
for(i=1, nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -4132,7 +4143,7 @@ static int select_random_exec(bContext *C, wmOperator *op)
MEM_freeN(itemstobeselected);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -4145,7 +4156,7 @@ void CURVE_OT_select_random(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_random_exec;
- ot->invoke= WM_operator_redo;
+ ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_editsurfcurve;
/* flags */
@@ -4166,7 +4177,7 @@ static int select_every_nth_exec(bContext *C, wmOperator *op)
select_adjacent_cp(editnurb, n, 1, SELECT);
select_adjacent_cp(editnurb, -n, 1, SELECT);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -4179,7 +4190,7 @@ void CURVE_OT_select_every_nth(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_every_nth_exec;
- ot->invoke= WM_operator_redo;
+ ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_editsurfcurve;
/* flags */
@@ -4232,8 +4243,8 @@ void CURVE_OT_duplicate(wmOperatorType *ot)
static int delete_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu, *next, *nu1;
BezTriple *bezt, *bezt1, *bezt2;
@@ -4244,8 +4255,8 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type==0) deleteflagNurb(C, op, 1);
else freeNurblist(editnurb);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -4255,12 +4266,12 @@ static int delete_exec(bContext *C, wmOperator *op)
nu= editnurb->first;
while(nu) {
next= nu->next;
- if( (nu->type & 7)==CU_BEZIER ) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
if(a) {
while(a) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) );
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) );
else break;
a--;
bezt++;
@@ -4291,7 +4302,7 @@ static int delete_exec(bContext *C, wmOperator *op)
/* Never allow the order to exceed the number of points
- note, this is ok but changes unselected nurbs, disable for now */
/*
- if ((nu!= NULL) && ((nu->type & 7)==CU_NURBS)) {
+ if ((nu!= NULL) && (nu->type == CU_NURBS)) {
clamp_nurb_order_u(nu);
}
*/
@@ -4302,10 +4313,10 @@ static int delete_exec(bContext *C, wmOperator *op)
while(nu) {
next= nu->next;
type= 0;
- if( (nu->type & 7)==CU_BEZIER ) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
for(a=0;a<nu->pntsu;a++) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
nu->pntsu--;
a--;
@@ -4345,7 +4356,7 @@ static int delete_exec(bContext *C, wmOperator *op)
/* Never allow the order to exceed the number of points\
- note, this is ok but changes unselected nurbs, disable for now */
/*
- if ((nu->type & 7)==CU_NURBS) {
+ if (nu->type == CU_NURBS) {
clamp_nurb_order_u(nu);
}*/
}
@@ -4362,10 +4373,10 @@ static int delete_exec(bContext *C, wmOperator *op)
nu1= 0;
while(nu) {
next= nu->next;
- if( (nu->type & 7)==CU_BEZIER ) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
for(a=0; a<nu->pntsu-1; a++) {
- if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
bezt1= bezt;
bezt2= bezt+1;
if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) ;
@@ -4374,8 +4385,8 @@ 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_CYCLIC;
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -4400,8 +4411,8 @@ static int delete_exec(bContext *C, wmOperator *op)
bp2= bp+(nu->pntsu-1);
if( bp2->f1 & SELECT ) {
nu->flagu &= ~CU_CYCLIC;
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -4498,8 +4509,8 @@ static int delete_exec(bContext *C, wmOperator *op)
else if(type==2)
freeNurblist(editnurb);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -4551,14 +4562,14 @@ void CURVE_OT_delete(wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "Which elements to delete.");
}
-/********************** set smooth operator *********************/
+/********************** shade smooth/flat operator *********************/
-static int set_smooth_exec(bContext *C, wmOperator *op)
+static int shade_smooth_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
- int clear= RNA_boolean_get(op->ptr, "clear");
+ int clear= (strcmp(op->idname, "CURVE_OT_shade_flat") == 0);
if(obedit->type != OB_CURVE)
return OPERATOR_CANCELLED;
@@ -4570,37 +4581,46 @@ static int set_smooth_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
-void CURVE_OT_smooth_set(wmOperatorType *ot)
+void CURVE_OT_shade_smooth(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Set Smooth";
- ot->idname= "CURVE_OT_smooth_set";
+ ot->name= "Shade Smooth";
+ ot->idname= "CURVE_OT_shade_smooth";
/* api callbacks */
- ot->exec= set_smooth_exec;
+ ot->exec= shade_smooth_exec;
ot->poll= ED_operator_editsurfcurve;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
- /* properties */
- RNA_def_boolean(ot->srna, "clear", 0, "Clear", "Clear smooth shading to solid for selection instead of enabling it.");
+void CURVE_OT_shade_flat(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Shade Flat";
+ ot->idname= "CURVE_OT_shade_flat";
+
+ /* api callbacks */
+ ot->exec= shade_smooth_exec;
+ ot->poll= ED_operator_editsurfcurve;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/************** join operator, to be used externally? ****************/
-int join_curve(bContext *C, wmOperator *op, int type)
+int join_curve_exec(bContext *C, wmOperator *op)
{
- View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_edit_object(C);
- Base *base, *nextb;
+ Object *ob= CTX_data_active_object(C);
Curve *cu;
Nurb *nu, *newnu;
BezTriple *bezt;
@@ -4609,64 +4629,51 @@ int join_curve(bContext *C, wmOperator *op, int type)
float imat[4][4], cmat[4][4];
int a;
- // XXX not integrated yet, to be called by object/ module? */
-
- if(object_data_is_libdata(ob)) {
- BKE_report(op->reports, RPT_ERROR, "Can't edit external libdata");
- return OPERATOR_CANCELLED;
- }
-
- if(ob->type!=type)
- return 0;
-
tempbase.first= tempbase.last= 0;
/* trasnform all selected curves inverse in obact */
Mat4Invert(imat, ob->obmat);
- for(base= FIRSTBASE; base; base=nextb) {
- nextb= base->next;
-
- if(TESTBASE(v3d, base)) {
- if(base->object->type==type) {
- if(base->object != ob) {
-
- cu= base->object->data;
-
- if(cu->nurb.first) {
- /* watch it: switch order here really goes wrong */
- Mat4MulMat4(cmat, base->object->obmat, imat);
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if(base->object->type==ob->type) {
+ if(base->object != ob) {
+
+ cu= base->object->data;
+
+ if(cu->nurb.first) {
+ /* watch it: switch order here really goes wrong */
+ Mat4MulMat4(cmat, base->object->obmat, imat);
+
+ nu= cu->nurb.first;
+ while(nu) {
+ newnu= duplicateNurb(nu);
+ BLI_addtail(&tempbase, newnu);
- nu= cu->nurb.first;
- while(nu) {
- newnu= duplicateNurb(nu);
- BLI_addtail(&tempbase, newnu);
-
- if( (bezt= newnu->bezt) ) {
- a= newnu->pntsu;
- while(a--) {
- Mat4MulVecfl(cmat, bezt->vec[0]);
- Mat4MulVecfl(cmat, bezt->vec[1]);
- Mat4MulVecfl(cmat, bezt->vec[2]);
- bezt++;
- }
+ if( (bezt= newnu->bezt) ) {
+ a= newnu->pntsu;
+ while(a--) {
+ Mat4MulVecfl(cmat, bezt->vec[0]);
+ Mat4MulVecfl(cmat, bezt->vec[1]);
+ Mat4MulVecfl(cmat, bezt->vec[2]);
+ bezt++;
}
- if( (bp= newnu->bp) ) {
- a= newnu->pntsu*nu->pntsv;
- while(a--) {
- Mat4MulVecfl(cmat, bp->vec);
- bp++;
- }
+ }
+ if( (bp= newnu->bp) ) {
+ a= newnu->pntsu*nu->pntsv;
+ while(a--) {
+ Mat4MulVecfl(cmat, bp->vec);
+ bp++;
}
- nu= nu->next;
}
+ nu= nu->next;
}
-
- ED_base_object_free_and_unlink(scene, base);
}
+
+ ED_base_object_free_and_unlink(scene, base);
}
}
}
+ CTX_DATA_END;
cu= ob->data;
addlisttolist(&cu->nurb, &tempbase);
@@ -4675,8 +4682,8 @@ int join_curve(bContext *C, wmOperator *op, int type)
ED_object_enter_editmode(C, EM_WAITCURSOR);
ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR);
-
- // BIF_undo_push("Join");
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
return OPERATOR_FINISHED;
}
@@ -4697,6 +4704,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
float *curs, cent[3],vec[3],imat[3][3],mat[3][3];
float fac,cmat[3][3], 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;
@@ -4720,7 +4728,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
cent[2]-= obedit->obmat[3][2];
if(rv3d) {
- if (!(newname) || U.flag & USER_ADD_VIEWALIGNED || !rv3d)
+ if (!newname && U.flag & USER_ADD_VIEWALIGNED)
Mat3CpyMat4(imat, rv3d->viewmat);
else
Mat3One(imat);
@@ -4729,16 +4737,18 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
Mat3MulMat3(cmat, imat, mat);
Mat3Inv(imat, cmat);
}
+ else
+ Mat3One(imat);
+
setflagsNurb(editnurb, 0);
}
- else {
+ else
return NULL;
- }
/* these types call this function to return a Nurb */
if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) {
nu = (Nurb*)MEM_callocN(sizeof(Nurb), "addNurbprim");
- nu->type= type;
+ nu->type= cutype;
nu->resolu= 4;
nu->resolv= 4;
}
@@ -4751,6 +4761,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
rename_id((ID *)obedit->data, "Curve");
}
if(cutype==CU_BEZIER) {
+ if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 2;
nu->bezt =
(BezTriple*)MEM_callocN(2 * sizeof(BezTriple), "addNurbprim1");
@@ -4859,6 +4870,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
rename_id((ID *)obedit->data, "CurveCircle");
}
if(cutype==CU_BEZIER) {
+ if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 4;
nu->bezt= callocstructN(BezTriple, 4, "addNurbprim1");
nu->flagu= CU_CYCLIC;
@@ -5085,7 +5097,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
}
/* always do: */
- nu->flag= CU_SMOOTH;
+ nu->flag |= CU_SMOOTH;
test2DNurb(nu);
@@ -5097,6 +5109,7 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname)
static int clear_tilt_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
+ Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
Nurb *nu;
BezTriple *bezt;
@@ -5108,7 +5121,7 @@ static int clear_tilt_exec(bContext *C, wmOperator *op)
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
- if(BEZSELECTED_HIDDENHANDLES(bezt)) bezt->alfa= 0.0;
+ if(BEZSELECTED_HIDDENHANDLES(cu, bezt)) bezt->alfa= 0.0;
bezt++;
}
}
@@ -5122,8 +5135,8 @@ static int clear_tilt_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 9f2bd6f26f9..2be567e1921 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -273,15 +273,14 @@ static void text_update_edited(bContext *C, Scene *scene, Object *obedit, int re
BKE_text_to_curve(scene, obedit, mode);
if(recalc)
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
/********************** insert lorem operator *********************/
static int insert_lorem_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
char *p, *p2;
int i;
@@ -308,8 +307,8 @@ static int insert_lorem_exec(bContext *C, wmOperator *op)
insert_into_textbuf(obedit, '\n');
insert_into_textbuf(obedit, '\n');
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -318,6 +317,7 @@ void FONT_OT_insert_lorem(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Insert Lorem";
+ ot->description= "Insert placeholder text.";
ot->idname= "FONT_OT_insert_lorem";
/* api callbacks */
@@ -381,19 +381,19 @@ static int paste_file(bContext *C, ReportList *reports, char *filename)
static int paste_file_exec(bContext *C, wmOperator *op)
{
- char *filename;
+ char *path;
int retval;
- filename= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
- retval= paste_file(C, op->reports, filename);
- MEM_freeN(filename);
+ path= RNA_string_get_alloc(op->ptr, "path", NULL, 0);
+ retval= paste_file(C, op->reports, path);
+ MEM_freeN(path);
return retval;
}
static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return paste_file_exec(C, op);
WM_event_add_fileselect(C, op);
@@ -405,6 +405,7 @@ void FONT_OT_file_paste(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Paste File";
+ ot->description= "Paste contents from file.";
ot->idname= "FONT_OT_file_paste";
/* api callbacks */
@@ -416,7 +417,7 @@ void FONT_OT_file_paste(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of text file to load.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE, FILE_SPECIAL);
}
/******************* paste buffer operator ********************/
@@ -453,6 +454,7 @@ void FONT_OT_buffer_paste(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Paste Buffer";
+ ot->description= "Paste text from OS buffer.";
ot->idname= "FONT_OT_buffer_paste";
/* api callbacks */
@@ -614,7 +616,6 @@ static EnumPropertyItem style_items[]= {
static int set_style(bContext *C, int style, int clear)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
EditFont *ef= cu->editfont;
@@ -630,8 +631,8 @@ static int set_style(bContext *C, int style, int clear)
ef->textbufinfo[i].flag |= style;
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -650,6 +651,7 @@ void FONT_OT_style_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Style";
+ ot->description= "Set font style.";
ot->idname= "FONT_OT_style_set";
/* api callbacks */
@@ -687,6 +689,7 @@ void FONT_OT_style_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Style";
+ ot->description= "Toggle font style.";
ot->idname= "FONT_OT_style_toggle";
/* api callbacks */
@@ -729,6 +732,7 @@ void FONT_OT_text_copy(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Text";
+ ot->description= "Copy selected text to clipboard.";
ot->idname= "FONT_OT_text_copy";
/* api callbacks */
@@ -759,6 +763,7 @@ void FONT_OT_text_cut(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Cut Text";
+ ot->description= "Cut selected text to clipboard.";
ot->idname= "FONT_OT_text_cut";
/* api callbacks */
@@ -816,6 +821,7 @@ void FONT_OT_text_paste(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Paste Text";
+ ot->description= "Paste text from clipboard.";
ot->idname= "FONT_OT_text_paste";
/* api callbacks */
@@ -951,6 +957,7 @@ void FONT_OT_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move Cursor";
+ ot->description= "Move cursor to position type.";
ot->idname= "FONT_OT_move";
/* api callbacks */
@@ -977,6 +984,7 @@ void FONT_OT_move_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move Select";
+ ot->description= "Make selection from current cursor position to new cursor position type.";
ot->idname= "FONT_OT_move_select";
/* api callbacks */
@@ -1018,6 +1026,7 @@ void FONT_OT_change_spacing(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Change Spacing";
+ ot->description= "Change font spacing.";
ot->idname= "FONT_OT_change_spacing";
/* api callbacks */
@@ -1062,6 +1071,7 @@ void FONT_OT_change_character(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Change Character";
+ ot->description= "Change font character code.";
ot->idname= "FONT_OT_change_character";
/* api callbacks */
@@ -1104,6 +1114,7 @@ void FONT_OT_line_break(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Line Break";
+ ot->description= "Insert line break at cursor position.";
ot->idname= "FONT_OT_line_break";
/* api callbacks */
@@ -1193,6 +1204,7 @@ void FONT_OT_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete";
+ ot->description= "Delete text by cursor position.";
ot->idname= "FONT_OT_delete";
/* api callbacks */
@@ -1334,6 +1346,7 @@ void FONT_OT_text_insert(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Insert Text";
+ ot->description= "Insert text at cursor position.";
ot->idname= "FONT_OT_text_insert";
/* api callbacks */
@@ -1469,6 +1482,7 @@ void FONT_OT_case_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Case";
+ ot->description= "Set font case.";
ot->idname= "FONT_OT_case_set";
/* api callbacks */
@@ -1511,6 +1525,7 @@ void FONT_OT_case_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Case";
+ ot->description= "Toggle font case.";
ot->idname= "FONT_OT_case_toggle";
/* api callbacks */
diff --git a/source/blender/editors/datafiles/B.blend.c b/source/blender/editors/datafiles/B.blend.c
index fcdf83e98de..b469f0c24cb 100644
--- a/source/blender/editors/datafiles/B.blend.c
+++ b/source/blender/editors/datafiles/B.blend.c
@@ -1,851 +1,880 @@
/* DataToC output of file <B_blend> */
-int datatoc_B_blend_size= 93184;
+int datatoc_B_blend_size= 100360;
char datatoc_B_blend[]= {
-
- 66, 76, 69, 78, 68, 69, 82, 95, 86, 50, 53, 48, 82, 69, 78, 68, 0, 0, 0, 32,191,255,240,240, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 1, 0, 0, 0,250, 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, 0, 0, 0, 32,191,255,240,232, 0, 0, 0,181, 0, 0, 0, 1, 32, 32, 32, 48, 0, 0, 0, 0, 0,250, 0, 0,
- 0, 1, 1, 0, 0,232,214, 96, 1, 7,176, 32, 0, 0, 16, 0, 0, 4, 32,128, 0, 0, 87, 77, 0, 0, 0,124, 0,232,212,240,
- 0, 0, 1, 68, 0, 0, 0, 1, 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, 0, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,213,160,
- 0,232,213,160, 0,232,213,160, 0,232,213,160, 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,238,152, 96,
- 5,210, 11, 64, 68, 65, 84, 65, 0, 0, 0,144, 0,232,213,160, 0, 0, 1, 69, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,237,219, 32, 0, 0, 0, 1, 0, 0, 0, 0, 0,232,214, 96,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, 0, 10, 0, 14, 7,108, 4,108, 0, 0, 0, 0, 0, 1, 3,238,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,238,151,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227,142,160,
- 0, 0, 0, 0, 0, 0, 0, 0, 6,147, 67,240, 6,160,144,208, 0,238,152,224, 0,238,153,208, 5,209,239,128, 5,210, 15,128,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 0,136, 0,232,214, 96, 0, 0, 0,173, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,101,101,110, 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,232,215, 16, 0,232,218, 80, 0,232,218,144, 0,232,222,208,
- 0,232,223, 16, 0,233, 19,208, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,176, 32, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 8,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,215, 16, 0, 0, 0,174, 0, 0, 0, 1, 0,232,215, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,215, 80, 0, 0, 0,174, 0, 0, 0, 1,
- 0,232,215,144, 0,232,215, 16, 0, 0, 0, 0, 0, 0, 4,108, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,215,144,
- 0, 0, 0,174, 0, 0, 0, 1, 0,232,215,208, 0,232,215, 80, 0, 0, 0, 0, 7,108, 4,108, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 20, 0,232,215,208, 0, 0, 0,174, 0, 0, 0, 1, 0,232,216, 16, 0,232,215,144, 0, 0, 0, 0, 7,108, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,216, 16, 0, 0, 0,174, 0, 0, 0, 1, 0,232,216, 80, 0,232,215,208,
- 0, 0, 0, 0, 0, 0, 4, 81, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,216, 80, 0, 0, 0,174, 0, 0, 0, 1,
- 0,232,216,144, 0,232,216, 16, 0, 0, 0, 0, 7,108, 4, 81, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,216,144,
- 0, 0, 0,174, 0, 0, 0, 1, 0,232,216,208, 0,232,216, 80, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 20, 0,232,216,208, 0, 0, 0,174, 0, 0, 0, 1, 0,232,217, 16, 0,232,216,144, 0, 0, 0, 0, 7,108, 0, 64,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,217, 16, 0, 0, 0,174, 0, 0, 0, 1, 0,232,217, 80, 0,232,216,208,
- 0, 0, 0, 0, 5,224, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,217, 80, 0, 0, 0,174, 0, 0, 0, 1,
- 0,232,217,144, 0,232,217, 16, 0, 0, 0, 0, 5,224, 4, 81, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,217,144,
- 0, 0, 0,174, 0, 0, 0, 1, 0,232,217,208, 0,232,217, 80, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 1, 68, 65, 84, 65,
- 0, 0, 0, 20, 0,232,217,208, 0, 0, 0,174, 0, 0, 0, 1, 0,232,218, 16, 0,232,217,144, 0, 0, 0, 0, 5,224, 0, 76,
- 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,218, 16, 0, 0, 0,174, 0, 0, 0, 1, 0,232,218, 80, 0,232,217,208,
- 0, 0, 0, 0, 5,224, 3, 76, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 0,232,218, 80, 0, 0, 0,174, 0, 0, 0, 1,
- 0, 0, 0, 0, 0,232,218, 16, 0, 0, 0, 0, 7,108, 3, 76, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,218,144,
- 0, 0, 0,175, 0, 0, 0, 1, 0,232,218,208, 0, 0, 0, 0, 0,232,215, 80, 0,232,215,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 0,232,218,208, 0, 0, 0,175, 0, 0, 0, 1, 0,232,219, 16, 0,232,218,144, 0,232,215, 80,
- 0,232,216, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,219, 16, 0, 0, 0,175, 0, 0, 0, 1,
- 0,232,219, 80, 0,232,218,208, 0,232,215,144, 0,232,216, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 0,232,219, 80, 0, 0, 0,175, 0, 0, 0, 1, 0,232,219,144, 0,232,219, 16, 0,232,216, 16, 0,232,216, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,219,144, 0, 0, 0,175, 0, 0, 0, 1, 0,232,219,208, 0,232,219, 80,
- 0,232,215, 16, 0,232,217, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,219,208, 0, 0, 0,175,
- 0, 0, 0, 1, 0,232,220, 16, 0,232,219,144, 0,232,215,208, 0,232,217, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 0,232,220, 16, 0, 0, 0,175, 0, 0, 0, 1, 0,232,220, 80, 0,232,219,208, 0,232,216, 16, 0,232,217, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,220, 80, 0, 0, 0,175, 0, 0, 0, 1, 0,232,220,144,
- 0,232,220, 16, 0,232,216, 80, 0,232,217, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,220,144,
- 0, 0, 0,175, 0, 0, 0, 1, 0,232,220,208, 0,232,220, 80, 0,232,215, 16, 0,232,217,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 0,232,220,208, 0, 0, 0,175, 0, 0, 0, 1, 0,232,221, 16, 0,232,220,144, 0,232,216, 16,
- 0,232,217,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,221, 16, 0, 0, 0,175, 0, 0, 0, 1,
- 0,232,221, 80, 0,232,220,208, 0,232,217, 80, 0,232,217,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 0,232,221, 80, 0, 0, 0,175, 0, 0, 0, 1, 0,232,221,144, 0,232,221, 16, 0,232,217, 16, 0,232,217,208, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,221,144, 0, 0, 0,175, 0, 0, 0, 1, 0,232,221,208, 0,232,221, 80,
- 0,232,217,144, 0,232,217,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,221,208, 0, 0, 0,175,
- 0, 0, 0, 1, 0,232,222, 16, 0,232,221,144, 0,232,217, 16, 0,232,218, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 0,232,222, 16, 0, 0, 0,175, 0, 0, 0, 1, 0,232,222, 80, 0,232,221,208, 0,232,217, 80, 0,232,218, 16,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,222, 80, 0, 0, 0,175, 0, 0, 0, 1, 0,232,222,144,
- 0,232,222, 16, 0,232,216, 80, 0,232,218, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,232,222,144,
- 0, 0, 0,175, 0, 0, 0, 1, 0,232,222,208, 0,232,222, 80, 0,232,215,208, 0,232,218, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 0,232,222,208, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0,232,222,144, 0,232,218, 16,
- 0,232,218, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,112, 0,232,223, 16, 0, 0, 0,179, 0, 0, 0, 1,
- 0,232,225,240, 0, 0, 0, 0, 0,232,216, 16, 0,232,215, 80, 0,232,215,144, 0,232,216, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7,108, 0, 0, 4, 82, 0, 0, 4,108, 7, 7, 7,109, 0, 27, 0, 1, 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,229, 69,160, 0,233, 31,144, 0,233, 31,144, 0,232,223,176, 0,232,224,208,
- 0, 0, 0, 0, 0, 0, 0, 0, 5,216,137, 0, 5,209,241, 64, 68, 65, 84, 65, 0, 0, 0,236, 0,232,223,176, 0, 0, 0,180,
- 0, 0, 0, 1, 0,232,224,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 68,192, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
- 68,237,160, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,108, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0,
- 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12,
- 0, 10, 7,109, 0, 26, 7,109, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,108, 0, 0, 4, 82,
- 0, 0, 4,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,109, 0, 26, 0, 2, 0, 1, 0, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 70,192, 6,144,192,176, 6,144,192,176, 0, 0, 0, 0, 0, 0, 0, 0,
- 5,209,243, 64, 5,209,243,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236, 0,232,224,208, 0, 0, 0,180,
- 0, 0, 0, 1, 0, 0, 0, 0, 0,232,223,176, 0, 0, 0, 0, 68,158, 64, 0, 0, 0, 0, 0, 65, 16, 0, 0, 0, 0, 0, 0,
- 69, 21,180, 43, 63,184, 81,222, 65, 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, 7,108, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 35,215, 10, 68,122, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 4, 0,
- 0, 10, 7,109, 0, 6, 7,109, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,108,
- 0, 0, 4,108, 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, 1, 0, 0, 0, 0, 0, 0, 0,229, 70, 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, 68, 65, 84, 65, 0, 0, 0,112, 0,232,225,240, 0, 0, 0,179,
- 0, 0, 0, 1, 0,233, 2, 0, 0,232,223, 16, 0,232,217, 16, 0,232,218, 16, 0,232,218, 80, 0,232,215,208, 0, 0, 0, 0,
- 0, 0, 5,225, 0, 0, 7,108, 0, 0, 0, 0, 0, 0, 3, 75, 4, 4, 1,140, 3, 76, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 67, 96, 0,232,253,144, 0,233, 0,224, 0,232,226,144,
- 0,232,227,176, 0, 0, 0, 0, 0, 0, 0, 0, 5,209,244, 32, 5,209,244,224, 68, 65, 84, 65, 0, 0, 0,236, 0,232,226,144,
- 0, 0, 0,180, 0, 0, 0, 1, 0,232,227,176, 0, 0, 0, 0, 0, 0, 0, 0, 67,240, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
- 0, 0, 0, 0, 67,198, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 25,
- 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
- 0, 4, 4, 12, 0, 10, 1,140, 0, 26, 1,140, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,225, 0, 0, 7,108,
- 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,140, 0, 26, 0, 3, 0, 1,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 68,128, 6,157, 67,144, 6,157, 67,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 5,209,246,144, 5,209,247,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236, 0,232,227,176,
- 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0,232,226,144, 0, 0, 0, 0, 67,163,128, 0,196,133,192, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,163,134,146,196, 41,151, 74,192, 50,112,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 3, 49,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3,
- 0, 2, 4, 0, 0, 6, 1,140, 3, 50, 1,140, 3, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,225, 0, 0, 7,108,
- 0, 0, 0, 26, 0, 0, 3, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,140, 3, 50, 0, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 67,240, 6,160,103, 16, 6,160,111,112, 0,232,228,208,
- 0,232,252,112, 5,209,249, 48, 5,209,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,228,208,
- 0, 0, 0,176, 0, 0, 0, 1, 0,232,229,240, 0, 0, 0, 0, 5,213,216,128, 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, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 56, 1, 71, 0,176,
- 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240,
- 0,232,229,240, 0, 0, 0,176, 0, 0, 0, 1, 0,232,231, 16, 0,232,228,208, 5,213,218, 16, 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,
+ 66, 76, 69, 78, 68, 69, 82, 95,
+118, 50, 53, 48, 82, 69, 78, 68, 32, 0, 0, 0,208,245, 18, 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, 0, 0, 0,
+200,245, 18, 0,192, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 51, 3, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 72, 22, 11, 7,
+160, 33, 10, 7, 0, 16, 0, 0,128, 32, 4, 0, 87, 77, 0, 0,140, 0, 0, 0,192, 75, 10, 7, 86, 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,254, 14, 7,160,147,103, 2,160,254, 14, 7,
+160,254, 14, 7, 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, 2, 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,224,183,102, 2,216, 85, 5, 7, 68, 65, 84, 65,148, 0, 0, 0,160,254, 14, 7, 87, 1, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 99, 2, 1, 0, 0, 0, 0, 0, 0, 0, 72, 22, 11, 7, 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, 62, 0, 34, 0,
+186, 4,254, 2, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,232, 44, 99, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144, 76, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0,208,229, 25, 7,176,202, 25, 7,152, 43, 99, 2,
+184,231, 9, 7,200, 45, 5, 7, 56, 90, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 72, 22, 11, 7,
+186, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,101,101,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,208, 79, 10, 7,
+176,183, 3, 7,232,192, 3, 7, 96,201, 2, 7,120,255, 14, 7, 72,136, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0,160, 33, 10, 7,
+ 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16,111, 92, 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,208, 79, 10, 7,
+187, 0, 0, 0, 1, 0, 0, 0,120, 63, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,120, 63, 11, 7,187, 0, 0, 0, 1, 0, 0, 0, 8, 11, 11, 7,208, 79, 10, 7, 0, 0, 0, 0, 0, 0,254, 2,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 8, 11, 11, 7,187, 0, 0, 0, 1, 0, 0, 0,200, 32, 4, 7,120, 63, 11, 7,
+ 0, 0, 0, 0,186, 4,254, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,200, 32, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,
+232,251, 3, 7, 8, 11, 11, 7, 0, 0, 0, 0,186, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,232,251, 3, 7,
+187, 0, 0, 0, 1, 0, 0, 0, 48, 16, 4, 7,200, 32, 4, 7, 0, 0, 0, 0, 0, 0,227, 2, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 48, 16, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,216, 43, 4, 7,232,251, 3, 7, 0, 0, 0, 0,186, 4,227, 2,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216, 43, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,160, 34, 4, 7, 48, 16, 4, 7,
+ 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 34, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,
+ 88,147, 4, 7,216, 43, 4, 7, 0, 0, 0, 0,186, 4, 60, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,147, 4, 7,
+187, 0, 0, 0, 1, 0, 0, 0,136,121, 4, 7,160, 34, 4, 7, 0, 0, 0, 0,216, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,136,121, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,104, 25, 4, 7, 88,147, 4, 7, 0, 0, 0, 0,216, 3,227, 2,
+ 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104, 25, 4, 7,187, 0, 0, 0, 1, 0, 0, 0, 64,160, 4, 7,136,121, 4, 7,
+ 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 64,160, 4, 7,187, 0, 0, 0, 1, 0, 0, 0,
+ 32, 26, 15, 7,104, 25, 4, 7, 0, 0, 0, 0,216, 3, 72, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 26, 15, 7,
+187, 0, 0, 0, 1, 0, 0, 0,176,183, 3, 7, 64,160, 4, 7, 0, 0, 0, 0,216, 3, 72, 2, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,176,183, 3, 7,187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 26, 15, 7, 0, 0, 0, 0,186, 4, 72, 2,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,192, 3, 7,188, 0, 0, 0, 1, 0, 0, 0, 24,226, 3, 7, 0, 0, 0, 0,
+ 8, 11, 11, 7,120, 63, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,226, 3, 7,188, 0, 0, 0,
+ 1, 0, 0, 0, 88, 14, 4, 7,232,192, 3, 7,232,251, 3, 7,120, 63, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 88, 14, 4, 7,188, 0, 0, 0, 1, 0, 0, 0, 0,180, 3, 7, 24,226, 3, 7, 48, 16, 4, 7, 8, 11, 11, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,180, 3, 7,188, 0, 0, 0, 1, 0, 0, 0,104,163, 3, 7,
+ 88, 14, 4, 7,232,251, 3, 7, 48, 16, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,163, 3, 7,
+188, 0, 0, 0, 1, 0, 0, 0,248,203, 3, 7, 0,180, 3, 7, 88,147, 4, 7,208, 79, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,248,203, 3, 7,188, 0, 0, 0, 1, 0, 0, 0, 16,191, 3, 7,104,163, 3, 7,200, 32, 4, 7,
+ 88,147, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,191, 3, 7,188, 0, 0, 0, 1, 0, 0, 0,
+144, 23, 4, 7,248,203, 3, 7,232,251, 3, 7,136,121, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+144, 23, 4, 7,188, 0, 0, 0, 1, 0, 0, 0, 0,118, 4, 7, 16,191, 3, 7, 48, 16, 4, 7,136,121, 4, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,118, 4, 7,188, 0, 0, 0, 1, 0, 0, 0,144,109, 4, 7,144, 23, 4, 7,
+104, 25, 4, 7,208, 79, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,109, 4, 7,188, 0, 0, 0,
+ 1, 0, 0, 0, 40,178, 3, 7, 0,118, 4, 7,232,251, 3, 7,104, 25, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 40,178, 3, 7,188, 0, 0, 0, 1, 0, 0, 0,200,170, 3, 7,144,109, 4, 7,136,121, 4, 7, 64,160, 4, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,170, 3, 7,188, 0, 0, 0, 1, 0, 0, 0,176,242, 3, 7,
+ 40,178, 3, 7, 88,147, 4, 7, 64,160, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176,242, 3, 7,
+188, 0, 0, 0, 1, 0, 0, 0, 56,248, 3, 7,200,170, 3, 7,104, 25, 4, 7, 64,160, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 56,248, 3, 7,188, 0, 0, 0, 1, 0, 0, 0, 80, 38, 4, 7,176,242, 3, 7, 88,147, 4, 7,
+ 32, 26, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80, 38, 4, 7,188, 0, 0, 0, 1, 0, 0, 0,
+232,133, 3, 7, 56,248, 3, 7,136,121, 4, 7, 32, 26, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+232,133, 3, 7,188, 0, 0, 0, 1, 0, 0, 0,160,210, 2, 7, 80, 38, 4, 7,176,183, 3, 7, 48, 16, 4, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,210, 2, 7,188, 0, 0, 0, 1, 0, 0, 0, 96,201, 2, 7,232,133, 3, 7,
+176,183, 3, 7,200, 32, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,201, 2, 7,188, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,160,210, 2, 7,176,183, 3, 7, 32, 26, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 96, 0, 0, 0,120,255, 14, 7,190, 0, 0, 0, 1, 0, 0, 0, 24, 23, 11, 7, 0, 0, 0, 0,232,251, 3, 7,120, 63, 11, 7,
+ 8, 11, 11, 7, 48, 16, 4, 7, 0, 0, 0, 0, 0, 0, 0, 0,186, 4, 0, 0,228, 2, 0, 0,254, 2, 0, 0, 7, 7,187, 4,
+ 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 56,150, 92, 2,152,180,102, 2,152,180,102, 2, 32,173, 11, 7,112,158, 24, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 40, 47, 5, 7, 8, 48, 5, 7, 68, 65, 84, 65,248, 0, 0, 0, 32,173, 11, 7,191, 0, 0, 0,
+ 1, 0, 0, 0,112,158, 24, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,157, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 96,151, 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,186, 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,187, 4, 26, 0,187, 4, 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,186, 4, 0, 0,228, 2, 0, 0,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+187, 4, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,151, 92, 2,184,191, 25, 7,
+184,191, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0,216, 49, 5, 7, 96, 50, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0,112,158, 24, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,173, 11, 7, 0, 0, 0, 0, 0, 32,240, 68,
+ 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 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, 3, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,254, 2, 0, 0,254, 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, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,224,150, 92, 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, 68, 65, 84, 65, 96, 0, 0, 0, 24, 23, 11, 7,190, 0, 0, 0, 1, 0, 0, 0,200, 33, 11, 7,
+120,255, 14, 7, 88,147, 4, 7, 32, 26, 15, 7,176,183, 3, 7,200, 32, 4, 7, 0, 0, 0, 0,217, 3, 0, 0,186, 4, 0, 0,
+ 0, 0, 0, 0, 71, 2, 0, 0, 4, 4,226, 0, 72, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,147, 92, 2,192,160, 9, 7,
+120,148, 10, 7,128,237, 11, 7,184,238, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0,232, 50, 5, 7,200, 51, 5, 7, 68, 65, 84, 65,
+248, 0, 0, 0,128,237, 11, 7,191, 0, 0, 0, 1, 0, 0, 0,184,238, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 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, 0, 0, 0, 0, 0, 0, 0, 0,217, 3, 0, 0,186, 4, 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,226, 0, 31, 0, 3, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,152,149, 92, 2,160,145,246, 6,160,145,246, 6, 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 5, 7,168, 54, 5, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,238, 11, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+128,237, 11, 7, 0, 0, 0, 0, 0, 0, 80, 67, 0, 0, 68,196, 0, 0, 0, 0, 0, 0, 0, 0,254,255, 80, 67,255,191, 5,196,
+ 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 18, 0, 0, 0, 40, 2, 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, 40, 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, 4, 6, 0,226, 0, 41, 2,209, 0,
+ 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 63,100, 2, 1, 0, 0, 0, 0, 0, 0, 0,217, 3, 0, 0,186, 4, 0, 0,
+ 31, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 41, 2, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,148, 92, 2, 88, 22, 6, 7, 16,102, 5, 7,248, 24, 11, 7,
+ 72,159, 9, 7,144, 56, 5, 7, 40, 58, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,248, 24, 11, 7,
+189, 0, 0, 0, 1, 0, 0, 0,112, 26, 11, 7, 0, 0, 0, 0,200,148, 92, 2, 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,208, 0, 36, 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,
+ 68, 65, 84, 65, 56, 1, 0, 0,112, 26, 11, 7,189, 0, 0, 0, 1, 0, 0, 0,232, 27, 11, 7,248, 24, 11, 7,232,164, 2, 7,
+ 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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,208, 0, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,232, 27, 11, 7,189, 0, 0, 0, 1, 0, 0, 0,
+ 96, 29, 11, 7,112, 26, 11, 7,192,166, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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,208, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 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, 68, 65, 84, 65, 56, 1, 0, 0,
+ 96, 29, 11, 7,189, 0, 0, 0, 1, 0, 0, 0,216, 30, 11, 7,232, 27, 11, 7,152,168, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78,
+ 69, 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, 83, 67, 69, 78,
+ 69, 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, 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,165,254,
+208, 0,178, 0, 0, 0, 0, 0, 0, 0, 2, 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,254, 88,
- 1, 71, 0,200, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,240, 0,232,231, 16, 0, 0, 0,176, 0, 0, 0, 1, 0,232,232, 48, 0,232,229,240, 5,213,219,160, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,253,240, 1, 71, 0, 80, 0, 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,240, 0,232,232, 48, 0, 0, 0,176, 0, 0, 0, 1, 0,232,233, 80, 0,232,231, 16, 5,213,222,176,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,253,136, 1, 71, 0, 80, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,233, 80, 0, 0, 0,176, 0, 0, 0, 1, 0,232,234,112, 0,232,232, 48,
- 5,213,224, 64, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,194, 1, 71, 0,174, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,234,112, 0, 0, 0,176, 0, 0, 0, 1, 0,232,235,144,
- 0,232,233, 80, 5,213,225,208, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,214, 1, 71, 0,212, 0, 20, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0,
- 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,235,144, 0, 0, 0,176, 0, 0, 0, 1,
- 0,232,236,176, 0,232,234,112, 0, 0, 0, 0, 0, 0, 0, 0, 76,101,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, 76,101,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 81, 1, 74, 0,151, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,236,176, 0, 0, 0,176,
- 0, 0, 0, 1, 0,232,237,208, 0,232,235,144, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,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, 68,105,115,112,108, 97,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,141, 1, 74, 0,107, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,237,208,
- 0, 0, 0,176, 0, 0, 0, 1, 0,232,238,240, 0,232,236,176, 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, 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 96, 1, 74, 0,136,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240,
- 0,232,238,240, 0, 0, 0,176, 0, 0, 0, 1, 0,232,240, 16, 0,232,237,208, 0, 0, 0, 0, 0, 0, 0, 0, 87,111,114,108,
-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, 87,111,114,108,
-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,254,247,
- 1, 74, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,240, 0,232,240, 16, 0, 0, 0,176, 0, 0, 0, 1, 0,232,241, 48, 0,232,238,240, 0, 0, 0, 0, 0, 0, 0, 0,
- 65,109, 98,105,101,110,116, 32, 79, 99, 99,108,117,115,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65,109, 98,105,101,110,116, 32, 79, 99, 99,108,117,115,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,254, 43, 1, 74, 0,180, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,240, 0,232,241, 48, 0, 0, 0,176, 0, 0, 0, 1, 0,232,242, 80, 0,232,240, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 77,105,115,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, 77,105,115,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,253,168, 1, 74, 0,107, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,242, 80, 0, 0, 0,176, 0, 0, 0, 1, 0,232,243,112, 0,232,241, 48,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,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, 83,116, 97,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 84, 1, 74, 0, 60, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,243,112, 0, 0, 0,176, 0, 0, 0, 1, 0,232,244,144,
- 0,232,242, 80, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114, 32, 67,111,114,114,101, 99,116,105,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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114, 32, 67,111,114,114,101, 99,116,105,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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 24, 1, 74, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,244,144, 0, 0, 0,176, 0, 0, 0, 1,
- 0,232,245,176, 0,232,243,112, 0, 0, 0, 0, 0, 0, 0, 0, 76, 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, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,216, 30, 11, 7,189, 0, 0, 0, 1, 0, 0, 0, 80, 32, 11, 7, 96, 29, 11, 7,
+112,170, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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, 0, 0,255, 83, 1, 74, 0,149, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,245,176, 0, 0, 0,176,
- 0, 0, 0, 1, 0,232,246,208, 0,232,244,144, 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, 83,254,208, 0, 58, 0, 20, 0, 0, 0, 0, 0, 2, 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, 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, 68, 65, 84, 65, 56, 1, 0, 0, 80, 32, 11, 7,189, 0, 0, 0,
+ 1, 0, 0, 0,104,153, 9, 7,216, 30, 11, 7, 72,172, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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,213,253,208, 0,102, 0, 0, 0, 0, 0,
+ 0, 0, 2, 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,254,136, 1, 74, 0,179, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,246,208,
- 0, 0, 0,176, 0, 0, 0, 1, 0,232,247,240, 0,232,245,176, 0, 0, 0, 0, 0, 0, 0, 0, 83,117,114,102, 97, 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, 83,117,114,102, 97, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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,149, 1, 74, 0, 83,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240,
- 0,232,247,240, 0, 0, 0,176, 0, 0, 0, 1, 0,232,249, 16, 0,232,246,208, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,115,
-116,114, 97,105,110,116,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, 67,111,110,115,
-116,114, 97,105,110,116,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, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,196,
- 1, 74, 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, 68, 65, 84, 65,
- 0, 0, 0,240, 0,232,249, 16, 0, 0, 0,176, 0, 0, 0, 1, 0,232,250, 48, 0,232,247,240, 0, 0, 0, 0, 0, 0, 0, 0,
- 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 76, 1, 74, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,240, 0,232,250, 48, 0, 0, 0,176, 0, 0, 0, 1, 0,232,251, 80, 0,232,249, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0,
- 0, 0, 0, 0, 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, 68, 65, 84, 65,
+ 56, 1, 0, 0,104,153, 9, 7,189, 0, 0, 0, 1, 0, 0, 0,224,154, 9, 7, 80, 32, 11, 7, 32,174, 2, 7, 0, 0, 0, 0,
+ 83, 67, 69, 78, 69, 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,
+ 83, 67, 69, 78, 69, 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,
+ 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,255, 16, 1, 74, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,251, 80, 0, 0, 0,176, 0, 0, 0, 1, 0,232,252,112, 0,232,250, 48,
- 0, 0, 0, 0, 0, 0, 0, 0, 68,117,112,108,105, 99, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 84,253,208, 0,105, 0, 0, 0, 0, 0, 0, 0, 2, 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, 68,117,112,108,105, 99, 97,116,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,224,154, 9, 7,189, 0, 0, 0, 1, 0, 0, 0, 88,156, 9, 7,
+104,153, 9, 7,208,177, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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,254, 81, 1, 74, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,232,252,112, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0,
- 0,232,251, 80, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,105,109, 97,116,105,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, 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, 65,110,105,109, 97,116,105,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, 60,253,208, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 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, 56, 1, 0, 0, 88,156, 9, 7,
+189, 0, 0, 0, 1, 0, 0, 0,208,157, 9, 7,224,154, 9, 7,168,179, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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, 36,253,208, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 2, 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,253,167, 1, 74, 0,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,224, 0,232,253,144, 0, 0, 0,151, 0, 0, 0, 1,
- 0,233, 0,224, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 56, 1, 0, 0,208,157, 9, 7,189, 0, 0, 0, 1, 0, 0, 0, 72,159, 9, 7, 88,156, 9, 7,128,181, 2, 7,
+ 0, 0, 0, 0, 83, 67, 69, 78, 69, 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, 83, 67, 69, 78, 69, 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, 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, 12,253,208, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 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, 1,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,236, 0,232,254,160, 0, 0, 0,180, 0, 0, 0, 1, 0,232,255,192, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 69, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,138, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 20, 0, 26, 1, 20, 0, 26, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 6, 89, 0, 0, 7,108, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 20, 0, 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, 68, 65, 84, 65, 56, 1, 0, 0, 72,159, 9, 7,189, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,208,157, 9, 7, 88,183, 2, 7, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,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,
- 68, 65, 84, 65, 0, 0, 0,236, 0,232,255,192, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0,232,254,160, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 69, 78, 69, 95, 80, 84, 95,117,110,105,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, 85,110,105,116,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,244,252,208, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 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, 68, 65, 84, 65,224, 0, 0, 0,
+192,160, 9, 7,158, 0, 0, 0, 1, 0, 0, 0,120,148, 10, 7, 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, 6, 89, 0, 0, 7,108, 0, 0, 0, 26, 0, 0, 4, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 20, 4, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,160, 32,
- 68, 65, 84, 65, 0, 0, 2,152, 1, 7,160, 32, 0, 0, 0,145, 0, 0, 0, 1, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,
-191,128, 0, 0,128, 0, 0, 0,128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 63,128, 0, 0, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,
-191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184, 65, 32, 0, 0, 62,111,122,237, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,106, 14,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,249,252,209,
-194, 71,253,115, 0, 0, 0, 0, 0, 0, 0, 0, 67,249,127, 98, 66, 71,255,129, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0, 63,128, 0, 0, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,
-191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184, 65, 32, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,222, 32,100, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,240, 0,233, 0,224, 0, 0, 0,146, 0, 0, 0, 1,
- 0, 0, 0, 0, 0,232,253,144, 0,232,254,160, 0,232,255,192, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 1, 0, 7, 1, 7,188, 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, 1, 0, 0, 0, 1,
- 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 60, 35,215, 10, 67,250, 0, 0, 0, 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,159, 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, 68, 65, 84, 65, 0, 0, 0,112, 0,233, 2, 0, 0, 0, 0,179,
- 0, 0, 0, 1, 0,233, 9, 16, 0,232,225,240, 0,232,215, 16, 0,232,217,144, 0,232,217,208, 0,232,217, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 5,223, 0, 0, 0, 0, 0, 0, 0, 75, 15, 15, 5,224, 0, 76, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 42,208, 0,233, 4,224, 0,233, 7,240, 0,233, 2,160,
- 0,233, 3,192, 0, 0, 0, 0, 0, 0, 0, 0, 5,209,251,112, 5,209,252, 48, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 2,160,
- 0, 0, 0,180, 0, 0, 0, 1, 0,233, 3,192, 0, 0, 0, 0, 0, 0, 0, 0, 68,112,128, 0, 0, 0, 0, 0, 65,208, 0, 0,
- 0, 0, 0, 0, 68,188, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,223, 0, 0, 0, 0, 0, 0, 0, 25,
- 68,202,224, 0, 65,200, 0, 0, 68,202,224, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
- 0, 4, 4, 12, 0, 10, 5,224, 0, 26, 5,224, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223,
- 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,224, 0, 26, 0, 5, 0, 1,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 43,240, 5,219, 95,160, 5,219, 95,160, 0, 0, 0, 0,
- 0, 0, 0, 0, 5,209,253,224, 5,209,254, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 3,192,
- 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 2,160,192, 64, 0, 0, 67,126, 0, 0, 0, 0, 0, 0, 66, 72, 0, 0,
-192, 17,189,112, 67,125, 70,246, 0, 0, 0, 0, 66, 72, 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,223, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 5,223, 0, 0, 0, 17, 0, 0, 0, 49,
- 63,128, 0, 0, 66, 72, 0, 0, 72,146,124, 0, 66, 72, 0, 0, 61,204,204,205, 65, 32, 0, 0, 0, 72, 0, 0, 0, 0, 2, 0,
- 0, 4, 4, 0, 0, 8, 5,224, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223,
- 0, 0, 0, 26, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,224, 0, 50, 0, 6, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 43, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5,210, 0, 16, 5,210, 1,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,168, 0,233, 4,224,
- 0, 0, 0,160, 0, 0, 0, 1, 0,233, 7,240, 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, 2, 0, 1, 0, 0, 0, 0, 0, 80,175, 11, 7,
+255, 20, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,161, 9, 7,191, 0, 0, 0, 1, 0, 0, 0,
+ 40,144, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 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, 19, 1, 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, 1,
+ 26, 0, 20, 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, 89, 6, 0, 0,
+108, 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, 20, 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, 68, 65, 84, 65,248, 0, 0, 0,
+ 40,144, 10, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,161, 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 6, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 5,176, 0, 0, 0,180,
- 0, 0, 0, 1, 0,233, 6,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
- 68,203, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 87, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0,
- 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12,
- 0, 10, 6, 88, 0, 26, 6, 88, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 87, 0, 0, 0, 0,
- 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 88, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 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, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 6,208, 0, 0, 0,180,
- 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 5,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,145, 10, 7, 68, 65, 84, 65,216, 2, 0, 0, 96,145, 10, 7,152, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 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,
+ 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 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, 32,193, 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, 32, 65, 0, 0,128, 63,103,212,136, 64, 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,
+ 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 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, 32,193, 0, 0,128, 63,103,212,136, 64, 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,
+ 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 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, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 6, 87, 0, 0, 0, 26,
- 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 88, 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, 0, 0, 0, 0, 0, 0, 0, 1, 7,164, 32, 68, 65, 84, 65, 0, 0, 2,152, 1, 7,164, 32, 0, 0, 0,145,
- 0, 0, 0, 1, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,108,213, 87, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,128, 0, 0, 0,128, 0, 0, 0,188,163,215,226,
-128, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0,
- 63,128, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,108,213, 87, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184,
- 65, 32, 0, 0, 63,106, 14,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,138, 91,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,249,252,209,194, 71,253,115, 0, 0, 0, 0, 0, 0, 0, 0, 67,249,127, 98,
- 66, 71,255,129, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0,
- 63,128, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,108,213, 87, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184,
- 65, 32, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 58,147,149, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,120,148, 10, 7,153, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,192,160, 9, 7,224,161, 9, 7, 40,144, 10, 7, 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, 56,192, 9, 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, 1, 0, 0, 0,
+ 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 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,159, 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, 68, 65, 84, 65, 96, 0, 0, 0,200, 33, 11, 7,
+190, 0, 0, 0, 1, 0, 0, 0, 48,124, 9, 7, 24, 23, 11, 7,208, 79, 10, 7,104, 25, 4, 7, 64,160, 4, 7, 88,147, 4, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,215, 3, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 15, 15,216, 3, 72, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,123, 92, 2, 24,152, 10, 7, 0,123, 9, 7,168,149, 10, 7,224,150, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+176, 58, 5, 7,144, 59, 5, 7, 68, 65, 84, 65,248, 0, 0, 0,168,149, 10, 7,191, 0, 0, 0, 1, 0, 0, 0,224,150, 10, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,128, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 56, 0, 0,118, 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,215, 3, 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,216, 3, 26, 0,216, 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, 0, 0, 0, 0,215, 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,216, 3, 26, 0, 5, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,124, 92, 2,248, 23, 6, 7,248, 23, 6, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96, 61, 5, 7,112, 62, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,224,150, 10, 7,
+191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,149, 10, 7, 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,215, 3, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,215, 3, 0, 0, 18, 0, 0, 0, 45, 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,216, 3, 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,215, 3, 0, 0, 26, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,216, 3, 46, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,123, 92, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 64, 5, 7,120, 66, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,180, 0, 0, 0, 24,152, 10, 7,168, 0, 0, 0, 1, 0, 0, 0, 0,123, 9, 7, 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,
+ 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,153, 10, 7,191, 0, 0, 0, 1, 0, 0, 0,176,118, 9, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,203, 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, 87, 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, 88, 6, 26, 0, 88, 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, 87, 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, 88, 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, 68, 65, 84, 65,248, 0, 0, 0,176,118, 9, 7,
+191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,153, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 6, 0, 0, 26, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 88, 6, 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, 0, 0, 0, 0, 0, 0, 0, 0,232,119, 9, 7,
+ 68, 65, 84, 65,216, 2, 0, 0,232,119, 9, 7,152, 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, 87,213,108, 66, 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,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 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, 32,193, 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, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 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,184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,
+115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 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, 32,193, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, 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,184,175, 31, 65, 0, 0, 32, 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, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0,123, 9, 7,153, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 24,152, 10, 7, 16,153, 10, 7,176,118, 9, 7, 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, 56,192, 9, 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, 1, 0, 0, 0, 1, 0, 0, 0,
+ 2, 0, 0, 0, 1, 0, 0, 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,159, 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, 68, 65, 84, 65, 96, 0, 0, 0, 48,124, 9, 7,190, 0, 0, 0,
+ 1, 0, 0, 0, 72,136, 9, 7,200, 33, 11, 7,104, 25, 4, 7,232,251, 3, 7,136,121, 4, 7, 64,160, 4, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0,215, 3, 0, 0, 73, 0, 0, 0,226, 2, 0, 0, 1, 1,216, 3,154, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,124, 92, 2, 24,135, 9, 7, 24,135, 9, 7,208,124, 9, 7,160,229, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 5, 7,
+ 48, 69, 5, 7, 68, 65, 84, 65,248, 0, 0, 0,208,124, 9, 7,191, 0, 0, 0, 1, 0, 0, 0, 8,126, 9, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 64, 90, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,118, 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,215, 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,216, 3, 26, 0,216, 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, 0, 0, 0, 0,215, 3, 0, 0, 73, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 3, 26, 0, 7, 0, 1, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,132, 92, 2, 32, 77,104, 2, 32, 77,104, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 71, 5, 7,152, 72, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,126, 9, 7,191, 0, 0, 0,
+ 1, 0, 0, 0, 48,130, 9, 7,208,124, 9, 7, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,251,195, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 15, 67, 0, 0,251,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 7, 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, 18, 0, 0, 0, 7, 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, 4,
+ 6, 0,160, 0, 8, 2,143, 0,246, 1, 0, 0, 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, 0, 0, 0,219, 0, 0, 0,226, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 0, 8, 2, 8, 0, 5, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,129, 92, 2, 72,117,101, 2,
+136, 52,102, 2, 64,127, 9, 7,184,128, 9, 7,128, 74, 5, 7, 24, 76, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 56, 1, 0, 0, 64,127, 9, 7,189, 0, 0, 0, 1, 0, 0, 0,184,128, 9, 7, 0, 0, 0, 0,224,129, 92, 2, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,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,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108, 95,115,104,101,108,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,
+ 84,111,111,108, 32, 83,104,101,108,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,196,255,143, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,184,128, 9, 7,189, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 64,127, 9, 7, 80,129, 4, 7, 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, 27,254,143, 0,145, 1, 0, 0, 0, 0, 0, 0, 7, 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, 68, 65, 84, 65,248, 0, 0, 0, 48,130, 9, 7,
+191, 0, 0, 0, 1, 0, 0, 0,152,219, 10, 7, 8,126, 9, 7, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 99, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,160, 0,120, 0, 9, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,130, 92, 2,
+120, 73, 25, 7,120, 73, 25, 7, 32,218, 10, 7, 32,218, 10, 7, 0, 78, 5, 7,152, 79, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 56, 1, 0, 0, 32,218, 10, 7,189, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,131, 92, 2,
+ 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,105,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, 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, 68, 65, 84, 65,248, 0, 0, 0,152,219, 10, 7,191, 0, 0, 0, 1, 0, 0, 0,
+160,229, 10, 7, 48,130, 9, 7, 0, 0, 0, 0, 0, 0, 75, 67, 0,128,118,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67,
+ 0,128, 27,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 18, 0, 0, 0,127, 2, 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, 18, 0, 0, 0,127, 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,220, 0,
+128, 2,203, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 3, 0, 0,
+215, 3, 0, 0, 99, 0, 0, 0,226, 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, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,126, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+208,220, 10, 7, 40,228, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,
+208,220, 10, 7,189, 0, 0, 0, 1, 0, 0, 0, 72,222, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,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, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,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, 84,114, 97,110,
+115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,255,
+203, 0,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 72,222, 10, 7,189, 0, 0, 0, 1, 0, 0, 0,192,223, 10, 7,208,220, 10, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 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, 86, 73, 69, 87, 51, 68, 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, 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,200,254,203, 0, 58, 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, 68, 65, 84, 65, 56, 1, 0, 0,192,223, 10, 7,189, 0, 0, 0,
+ 1, 0, 0, 0, 56,225, 10, 7, 72,222, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,
+118,105,101,119, 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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,
+118,105,101,119, 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, 86,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, 0,129,253,203, 0, 47, 1, 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, 68, 65, 84, 65,
- 0, 0, 0,240, 0,233, 7,240, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 4,224, 0,233, 5,176, 0,233, 6,208,
- 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 1, 7,188, 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, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,
- 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 60, 35,215, 10, 67,250, 0, 0, 0, 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,159, 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,
- 68, 65, 84, 65, 0, 0, 0,112, 0,233, 9, 16, 0, 0, 0,179, 0, 0, 0, 1, 0,233, 19,208, 0,233, 2, 0, 0,232,217,144,
- 0,232,216, 16, 0,232,217, 80, 0,232,217,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223, 0, 0, 0, 77, 0, 0, 4, 80,
- 1, 1, 5,224, 4, 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,229, 44,128, 0,233, 18,176, 0,233, 18,176, 0,233, 9,176, 0,233, 17,144, 0, 0, 0, 0, 0, 0, 0, 0, 6,157,103,176,
- 6,160,128,208, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 9,176, 0, 0, 0,180, 0, 0, 0, 1, 0,233, 10,208, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 84, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,188, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,223, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 5,224, 0, 26, 5,224, 0, 26, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223, 0, 0, 0, 77, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5,224, 0, 26, 0, 7, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,229, 52,192, 5,221, 1, 32, 5,221, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 5,210, 5, 16, 5,210, 6, 96, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 10,208, 0, 0, 0,180, 0, 0, 0, 1, 0,233, 17,144, 0,233, 9,176,
- 0, 0, 0, 0, 67, 92, 0, 0,196, 55, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 92, 0, 0,196, 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,219, 0, 0, 0, 0, 0, 0, 2,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 6, 0,220, 2,164, 0,220, 2,164, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223, 0, 0, 5,223, 0, 0, 0,103, 0, 0, 4, 80, 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, 1, 0, 0, 0, 0, 0, 0,
- 0,229, 45,160, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 11,240, 0,233, 16,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 11,240, 0, 0, 0,176, 0, 0, 0, 1, 0,233, 13, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,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, 84,114, 97,110,115,102,111,114,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 26, 0,220, 0,206, 0, 0, 0, 0, 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, 0, 0,240, 0,233, 13, 16, 0, 0, 0,176, 0, 0, 0, 1, 0,233, 14, 48,
- 0,233, 11,240, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 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, 86,105,101,119, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,229, 0,220, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 14, 48, 0, 0, 0,176, 0, 0, 0, 1,
- 0,233, 15, 80, 0,233, 13, 16, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 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, 66, 97, 99,107,103,114,111,117,110,100, 32, 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, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,169, 0,220, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 15, 80, 0, 0, 0,176,
- 0, 0, 0, 1, 0,233, 16,112, 0,233, 14, 48, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,
-105,101,110,116, 97,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, 84,114, 97,110,115,102,111,114,109, 32, 79,114,
-105,101,110,116, 97,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, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 79, 0,220, 0, 66, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 16,112,
- 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 15, 80, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,115,116, 32, 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, 76, 97,115,116, 32, 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, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 39, 0,220, 0, 16,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236,
- 0,233, 17,144, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 10,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,223, 0, 0, 0,103, 0, 0, 4, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,224, 3,234,
- 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 45, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5,210, 8, 32, 5,210, 11,192, 0, 0, 0, 0, 1, 7,168, 32, 68, 65, 84, 65, 0, 0, 2,152,
- 1, 7,168, 32, 0, 0, 0,145, 0, 0, 0, 1, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,210, 35,198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 63, 53, 4,238,190, 59,103,186, 63, 46,217,247, 0, 0, 0, 0, 63, 53, 4,255,
- 62, 59,103,126,191, 46,217,244, 0, 0, 0, 0, 50, 52, 3,228, 63,119, 70,248, 62,132,131,217, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,193,138, 60,152, 63,128, 0, 0, 63, 53, 4,236, 63, 53, 4,244, 53, 24, 0, 0, 0, 0, 0, 0,190, 59,103,137,
- 62, 59,103,118, 63,119, 70,227, 0, 0, 0, 0, 63, 46,217,238,191, 46,217,221, 62,132,131,213, 0, 0, 0, 0, 65, 60,213,186,
-193, 60,213,168, 64,143, 28,221, 63,128, 0, 0, 63, 69,253,100,190,153,213, 71,191, 46,219,194,191, 46,217,247, 63, 69,253,119,
- 62,153,213, 21, 63, 46,219,191, 63, 46,217,244, 50, 68,228, 65, 63,202,250,197,190,132,133, 53,190,132,131,217, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,138, 21, 13, 65,138, 60,152, 63, 37,129, 20, 63, 37,128,162, 53,252, 0, 0, 52,160, 0, 0,189,228, 76,142,
- 61,228, 76,119, 63, 22,159, 2, 52, 49, 0, 0,196, 19,133, 0, 68, 19,132,242,195, 95,154, 27,194, 71,253, 81, 68, 19, 90,205,
-196, 19, 90,191, 67, 95, 90, 36, 66, 71,255, 95, 63, 53, 4,238,190, 59,103,186, 63, 46,217,247, 0, 0, 0, 0, 63, 53, 4,255,
- 62, 59,103,126,191, 46,217,244, 0, 0, 0, 0, 50, 52, 3,228, 63,119, 70,248, 62,132,131,217, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,193,138, 60,152, 63,128, 0, 0, 63, 69,253,100,190,153,213, 71,191, 46,219,194,191, 46,217,247, 63, 69,253,119,
- 62,153,213, 21, 63, 46,219,191, 63, 46,217,244, 50, 68,228, 65, 63,202,250,197,190,132,133, 53,190,132,131,217, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,138, 21, 13, 65,138, 60,152, 63, 59,163,122,191, 15,250,235,190,110,141,221,190,155,113,230, 65,138, 60,152,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,159, 91,166, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 18,176, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7,
- 1, 7,188, 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, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0, 0,
- 0, 0, 8, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 60, 35,215, 10, 67,250, 0, 0,
- 0, 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,159, 0, 0, 0, 0, 0, 0, 0, 1, 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, 68, 65, 84, 65, 0, 0, 0,112, 0,233, 19,208, 0, 0, 0,179, 0, 0, 0, 1, 0, 0, 0, 0,
- 0,233, 9, 16, 0,232,218, 16, 0,232,217, 80, 0,232,216, 80, 0,232,218, 80, 0, 0, 0, 0, 0, 0, 5,225, 0, 0, 7,108,
- 0, 0, 3, 77, 0, 0, 4, 80, 3, 3, 1,140, 1, 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,229, 41, 32, 0,233, 22,176, 0,233, 30,112, 0,233, 20,112, 0,233, 21,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 5,210, 12, 48, 6,160,116, 96, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 20,112, 0, 0, 0,180, 0, 0, 0, 1,
- 0,233, 21,144, 0, 0, 0, 0, 0, 0, 0, 0, 67,216, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,198, 0, 0,
- 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 25, 67, 66, 0, 0, 65,200, 0, 0,
- 67, 66, 0, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1,140,
- 0, 26, 1,140, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,225, 0, 0, 7,108, 0, 0, 3, 77, 0, 0, 3,102,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,140, 0, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 42, 64, 5,216,145, 16, 5,216,145, 16, 0, 0, 0, 0, 0, 0, 0, 0, 5,210, 14,160,
- 5,210, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 21,144, 0, 0, 0,180, 0, 0, 0, 1,
- 0, 0, 0, 0, 0,233, 20,112, 0, 0, 0, 0, 67,132, 0, 0,194,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,190, 0, 0,
-195, 89, 0, 0, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 1,140, 0, 0, 0, 17, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 1,123,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,123, 0, 0, 0, 17, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 0, 0, 2, 3, 3, 0, 0, 4, 0, 0, 6, 1,140,
- 0,234, 1,124, 0,217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,225, 0, 0, 7,108, 0, 0, 3,103, 0, 0, 4, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,140, 0,234, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,229, 41,176, 6,161, 8,240, 6,161, 8,240, 0, 0, 0, 0, 0, 0, 0, 0, 5,210, 16,208,
- 5,210, 17,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 0,233, 22,176, 0, 0, 0,154, 0, 0, 0, 1,
- 0,233, 27, 32, 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, 6,160,117, 80, 6,160,117, 80, 0,233, 23,208, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 12,
- 0,233, 23,208, 0, 0, 0,203, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0,233, 24, 16, 68, 65, 84, 65, 0, 0, 0,156,
- 0,233, 24, 16, 0, 0, 0,202, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 1, 1, 7,176, 32, 0, 19, 0, 0, 0, 1, 0, 1,
- 1, 7,176, 32, 0, 20, 0, 0, 0, 1, 0, 1, 1, 7,176, 32, 0, 21, 0, 1, 0, 1, 0, 1, 1, 7,176, 32, 0, 0, 0, 0,
- 0, 1, 0, 1, 0,233, 38, 96, 0, 0, 0, 0, 0, 1, 0, 1, 1, 7,192, 32, 0, 0, 0, 0, 0, 1, 0, 1, 0,233, 43,112,
- 0, 0, 0, 0, 0, 1, 0, 1, 1, 7,200, 32, 0, 0, 0, 0, 0, 1, 0, 1, 0,233, 42, 48, 0, 0, 0, 0, 0, 1, 0, 1,
- 1, 7,196, 32, 0, 0, 0, 0, 0, 1, 0, 1, 0,233, 35, 64, 0, 0, 0, 0, 0, 1, 0, 1, 1, 7,188, 32, 0, 0, 0, 0,
- 0, 1, 0, 1, 0,233, 34,144, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 24,224, 0, 0, 0,180, 0, 0, 0, 1, 0,233, 26, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,240, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 55, 0, 0, 0, 67, 67, 0, 0, 0, 0, 0, 0,
- 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 25, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0,
- 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 0,195, 0, 26, 0,195,
- 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 53, 0, 0, 4,247, 0, 0, 2, 69, 0, 0, 2, 94, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0, 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, 68, 65, 84, 65, 0, 0, 0,236, 0,233, 26, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0,
- 0,233, 24,224, 0, 0, 0, 0, 67,150, 0, 0,196,116,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,150, 85,205,196, 35,204,223,
-195,207, 85, 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,194, 0, 0, 0, 0, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 4, 0, 0, 6, 0,195, 0,156, 0,195,
- 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 53, 0, 0, 4,247, 0, 0, 2, 95, 0, 0, 2,250, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,224, 0,233, 27, 32, 0, 0, 0,151, 0, 0, 0, 1, 0,233, 30,112,
- 0,233, 22,176, 0,233, 24,224, 0,233, 26, 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, 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, 1,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,236, 0,233, 28, 48, 0, 0, 0,180, 0, 0, 0, 1, 0,233, 29, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0,
- 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,138, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19,
- 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 20, 0, 26, 1, 20, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 6, 89, 0, 0, 7,108, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 20, 0, 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,
+ 56, 1, 0, 0, 56,225, 10, 7,189, 0, 0, 0, 1, 0, 0, 0,176,226, 10, 7,192,223, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,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,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,100,105,115,112,108, 97,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,
+ 68,105,115,112,108, 97,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, 66,252,203, 0, 39, 1, 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, 56, 1, 0, 0,176,226, 10, 7,189, 0, 0, 0, 1, 0, 0, 0, 40,228, 10, 7,
+ 56,225, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,109,101,115,
+104,100,105,115,112,108, 97,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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 51,100,118,105,101,119, 95,109,101,115,
+104,100,105,115,112,108, 97,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, 77,101,115,104, 32, 68,105,115,112,108, 97,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,254,250,203, 0,104, 1, 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, 68, 65, 84, 65, 56, 1, 0, 0, 40,228, 10, 7,
+189, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176,226, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 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, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 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, 66, 97, 99,107,103,114,111,117,
+110,100, 32, 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, 42,252,203, 0, 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, 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,229, 10, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,219, 10, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 3, 0, 0, 99, 0, 0, 0,226, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 3,128, 2, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,125, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 81, 5, 7,
+ 40, 84, 5, 7, 0, 0, 0, 0, 0,132, 9, 7, 68, 65, 84, 65,216, 2, 0, 0, 0,132, 9, 7,152, 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, 1, 64,215, 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,
+238, 4, 53, 63,186,103, 59,190,247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62,244,217, 46,191, 0, 0, 0, 0,
+228, 3, 52, 50,248, 70,119, 63,217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 60,138,193, 0, 0,128, 63,
+236, 4, 53, 63,244, 4, 53, 63, 0, 0, 24, 53, 0, 0, 0, 0,137,103, 59,190,118,103, 59, 62,227, 70,119, 63, 0, 0, 0, 0,
+238,217, 46, 63,221,217, 46,191,213,131,132, 62, 0, 0, 0, 0,186,213, 60, 65,168,213, 60,193,221, 28,143, 64, 0, 0,128, 63,
+100,253, 69, 63,248,146,157,190,223,235, 46,191,247,217, 46,191,119,253, 69, 63,197,146,157, 62,220,235, 46, 63,244,217, 46, 63,
+ 65,228, 68, 50,109,234,207, 63,107,145,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, 18,177,136, 65,152, 60,138, 65,
+252,128, 37, 63,186,128, 37, 63, 0, 0,180, 53, 0, 0, 60, 52,154,225,222,189,131,225,222, 61,139, 11, 19, 63, 0, 0,144, 51,
+ 25,255,107,194, 1,255,107, 66,239,218,178,193,208,247,159,192,220, 91,105, 66,197, 91,105,194, 49,219,176, 65, 50, 8,160, 64,
+238, 4, 53, 63,186,103, 59,190,247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62,244,217, 46,191, 0, 0, 0, 0,
+228, 3, 52, 50,248, 70,119, 63,217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 60,138,193, 0, 0,128, 63,
+100,253, 69, 63,248,146,157,190,223,235, 46,191,247,217, 46,191,119,253, 69, 63,197,146,157, 62,220,235, 46, 63,244,217, 46, 63,
+ 65,228, 68, 50,109,234,207, 63,107,145,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, 18,177,136, 65,152, 60,138, 65,
+166, 33, 26, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 33, 26, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,166, 33, 26, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+122,163, 59, 63,235,250, 15,191,221,141,110,190,230,113,155,190,152, 60,138, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,146,243, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,135, 9, 7,153, 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, 56,192, 9, 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, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 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, 72,136, 9, 7,190, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,124, 9, 7, 32, 26, 15, 7,136,121, 4, 7,
+ 48, 16, 4, 7,176,183, 3, 7, 0, 0, 0, 0,217, 3, 0, 0,186, 4, 0, 0, 73, 2, 0, 0,226, 2, 0, 0, 3, 3,226, 0,
+154, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,121, 92, 2, 88,139, 9, 7, 24,238, 10, 7,232,136, 9, 7, 32,138, 9, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,120, 86, 5, 7, 88, 87, 5, 7, 68, 65, 84, 65,248, 0, 0, 0,232,136, 9, 7,191, 0, 0, 0,
+ 1, 0, 0, 0, 32,138, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+217, 3, 0, 0,186, 4, 0, 0, 73, 2, 0, 0, 98, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+226, 0, 26, 0, 11, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,122, 92, 2, 96,150, 25, 7,
+ 96,150, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0, 40, 89, 5, 7,176, 89, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0, 32,138, 9, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,136, 9, 7, 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,220,194, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0,
+ 18, 0, 0, 0,127, 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,127, 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, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,226, 0,128, 0,209, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 3, 0, 0,186, 4, 0, 0, 99, 2, 0, 0,226, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,128, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,192,121, 92, 2,200,170, 25, 7,200,170, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0,152, 91, 5, 7,168, 92, 5, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 1, 0, 0, 88,139, 9, 7,162, 0, 0, 0, 1, 0, 0, 0,112,231, 10, 7,
+ 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, 0, 0, 0, 0,176,125, 25, 7,176,125, 25, 7,
+216,143, 12, 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, 1, 0, 0, 0,
+ 68, 65, 84, 65, 12, 0, 0, 0,216,143, 12, 7,214, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0,160,140, 9, 7,
+ 68, 65, 84, 65,156, 0, 0, 0,160,140, 9, 7,213, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,160, 33, 10, 7,
+ 19, 0, 0, 0, 1, 0, 1, 0,160, 33, 10, 7, 20, 0, 0, 0, 1, 0, 1, 0,160, 33, 10, 7, 21, 0, 1, 0, 1, 0, 1, 0,
+160, 33, 10, 7, 0, 0, 0, 0, 1, 0, 1, 0, 64, 39, 10, 7, 0, 0, 0, 0, 1, 0, 1, 0,224,195, 9, 7, 0, 0, 0, 0,
+ 1, 0, 1, 0, 48, 21, 12, 7, 0, 0, 0, 0, 1, 0, 1, 0, 48,203, 9, 7, 0, 0, 0, 0, 1, 0, 1, 0,224, 45, 10, 7,
+ 0, 0, 0, 0, 1, 0, 1, 0,136,199, 9, 7, 0, 0, 0, 0, 1, 0, 1, 0,208,240, 10, 7, 0, 0, 0, 0, 1, 0, 1, 0,
+ 56,192, 9, 7, 0, 0, 0, 0, 1, 0, 1, 0,240,143, 9, 7, 68, 65, 84, 65,248, 0, 0, 0,128,141, 9, 7,191, 0, 0, 0,
+ 1, 0, 0, 0,184,142, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55,
+ 0, 0, 67, 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,194, 0, 0, 0, 0, 0, 0, 0, 25, 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,195, 0, 26, 0,195, 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,
+ 53, 4, 0, 0,247, 4, 0, 0, 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+195, 0, 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, 68, 65, 84, 65,
- 0, 0, 0,236, 0,233, 29, 80, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 28, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 89, 0, 0, 7,108, 0, 0, 0, 26, 0, 0, 4, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 20, 4, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,172, 32, 68, 65, 84, 65,
- 0, 0, 2,152, 1, 7,172, 32, 0, 0, 0,145, 0, 0, 0, 1, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,
-128, 0, 0, 0,128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 63,128, 0, 0, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184, 65, 32, 0, 0, 62,111,122,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,106, 14,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,249,252,209,194, 71,253,115,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,249,127, 98, 66, 71,255,129, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0, 63,128, 0, 0, 64,136,212,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 31,175,184, 65, 32, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,222, 32,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248, 0, 0, 0,184,142, 9, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,141, 9, 7, 0, 0, 0, 0, 0, 0,150, 67,
+ 0,192,116,196, 0, 0, 0, 0, 0, 0, 0, 0,205, 85,150, 67,223,204, 35,196, 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0, 0,
+ 0, 0, 0, 0,155, 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,
+ 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,195, 0,156, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,112,231, 10, 7,158, 0, 0, 0, 1, 0, 0, 0, 24,238, 10, 7,
+ 88,139, 9, 7,128,141, 9, 7,184,142, 9, 7, 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, 68, 65, 84, 65, 0, 0, 0,240, 0,233, 30,112, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 0,
- 0,233, 27, 32, 0,233, 28, 48, 0,233, 29, 80, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 1, 0, 7, 1, 7,188, 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, 1, 0, 0, 0, 1, 0, 2, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 60, 35,215, 10,
- 67,250, 0, 0, 0, 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,159, 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, 83, 67, 0, 0, 4,248, 1, 7,176, 32, 0, 0, 0,143, 0, 0, 0, 1,
- 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,188, 32, 0,233, 38, 96,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,232,212,160, 0,233, 32, 64, 0,232,212,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 61,204,204,205, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 32,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 32,224,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,
+248, 0, 0, 0,144,232, 10, 7,191, 0, 0, 0, 1, 0, 0, 0,200,233, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 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, 19, 1, 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, 1, 26, 0, 20, 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, 89, 6, 0, 0,108, 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, 20, 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,172, 68, 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,100, 0, 0, 0,100, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,128, 1,224, 0, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 25,
- 0,141, 7,128, 4, 56, 0, 4, 0, 4, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 33, 0, 23, 0, 0, 0,128, 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200,233, 10, 7,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+144,232, 10, 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,233, 34, 32, 0,233, 34, 32, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2, 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, 0, 89, 6, 0, 0,108, 7, 0, 0,
+ 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 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, 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,235, 10, 7, 68, 65, 84, 65,216, 2, 0, 0, 0,235, 10, 7,
+152, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 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, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,
+226,215,163,188, 0, 0, 0,128, 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, 32,193, 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, 32, 65, 0, 0,128, 63,103,212,136, 64, 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, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0,
+ 98,127,249, 67,129,255, 71, 66, 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, 32,193, 0, 0,128, 63,103,212,136, 64, 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, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+184,175, 31, 65, 0, 0, 32, 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, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 24,238, 10, 7,153, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112,231, 10, 7,144,232, 10, 7,
+200,233, 10, 7, 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, 56,192, 9, 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, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 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,159, 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, 83, 67, 0, 0, 92, 5, 0, 0,160, 33, 10, 7,150, 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, 0, 0, 0, 0, 0, 0, 0, 0, 56,192, 9, 7, 64, 39, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+120,188, 2, 7, 48,241, 2, 7,120,188, 2, 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,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,239, 10, 7,152,230,101, 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,172, 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,100, 0, 0, 0,100, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 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, 0, 0, 1, 0, 0, 0, 6, 0, 25, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0,
+ 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0,128, 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, 0, 0, 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,231, 9, 7, 48,231, 9, 7, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 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, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 0, 0, 0, 6, 0, 0, 0, 16, 63,128, 0, 0, 63,128, 0, 0,
- 2,173, 0, 95, 63,217,153,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0,172, 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, 10, 0, 0, 0, 0, 0, 0, 0,232,101,128,
- 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 28,
- 0,232,212,160, 0, 0, 0,125, 0, 0, 0, 1, 0,233, 31,240, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,
- 2,240, 1,245, 1, 7,192, 32, 68, 65, 84, 65, 0, 0, 0, 28, 0,233, 31,240, 0, 0, 0,125, 0, 0, 0, 1, 0,233, 32, 64,
- 0,232,212,160, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 3,200, 3, 42, 1, 7,196, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 0,233, 32, 64, 0, 0, 0,125, 0, 0, 0, 1, 0, 0, 0, 0, 0,233, 31,240, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 4, 0,
- 3, 73, 3, 70, 1, 7,188, 32, 68, 65, 84, 65, 0, 0, 0, 40, 0,233, 32,144, 0, 0, 0,124, 0, 0, 0, 1, 1, 44, 0, 0,
- 0, 1, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 1,244, 0,200, 0,100, 0, 20, 0, 0, 39, 16, 61,204,204,205, 65,240, 0, 0,
- 64, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 12, 0,233, 32,224, 0, 0, 0,141, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 1, 63, 76,204,205, 66,180, 0, 0, 0, 9, 0, 1, 63,128, 0, 0, 58,131, 18,111, 0, 32, 0, 32,
- 0, 32, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5,255,255, 0, 50, 0, 50,
- 0, 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50,
- 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 60, 35,215, 10, 61,204,204,205, 0, 0, 0, 0, 0, 0, 0,250, 61,204,204,205, 61,204,204,205, 63,166,102,102,
- 63,192, 0, 0, 65,240, 0, 0, 63,122,225, 72, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 2, 67, 0, 3,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 0,233, 34, 32, 0, 0, 0,130, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 49, 32, 82,101,110,100,101,114, 76, 97,121,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, 15,255,255, 0, 0, 0, 0, 0, 0,127,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
- 0, 0, 67, 65, 0, 0, 0,136, 0,233, 34,144, 0, 0, 0, 30, 0, 0, 0, 1, 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, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 63, 0, 0, 0, 66, 68,137,145, 61,204,204,205, 66,200, 0, 0,
- 66, 12, 0, 0, 64,234, 14,161, 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, 76, 65,
- 0, 0, 1,132, 0,233, 35, 64, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 76, 65, 83,112,111,116, 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, 32, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 65,239,255,247, 66,150, 0, 0,
- 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0,233, 36,240, 0, 1, 0, 0, 63,128, 26, 46, 65,240, 4, 25,
- 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 1, 8, 0,233, 36,240,
- 0, 0, 1, 50, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
-191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 0,233, 38, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,233, 38, 32, 0, 0, 1, 48,
- 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79,
- 0, 0, 1,104, 0,233, 38, 96, 0, 0, 0,123, 0, 0, 0, 1, 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, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 62,128, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
- 61,204,204,205, 61,204,204,205, 61,204,204,205, 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,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 28,204,205, 0, 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, 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, 65,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 32, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 76,204,205, 0, 0, 0, 5, 0, 0, 0, 0, 59,163,215, 10, 0, 0, 0, 0,
- 62,128, 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, 84, 88, 0, 0, 0,120,
- 0,233, 39,240, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,
-120,116, 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, 7, 0, 0, 0, 1, 0,233, 40,144, 0,233, 40,144, 0,233, 40,144, 0,233, 40,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7,182, 32,255,255,255,255, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 0,233, 40,144, 0, 0, 0, 26, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,233, 40,208, 0, 0, 0, 0, 0, 0, 0, 0, 70, 82, 69, 69, 68, 65, 84, 65, 0, 0, 0, 4, 0,233, 40,208, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 3, 80, 1, 7,188, 32, 0, 0, 0,115, 0, 0, 0, 1, 1, 7,192, 32,
- 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, 0, 1, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 34,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,239,101,110,192,208, 62,150, 64,170,255, 78, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,141,254, 42,
- 60, 49, 57,192, 63, 80,159, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 47,149,222, 63, 58, 70, 53,188, 49, 56,222,
- 0, 0, 0, 0,190,162,126, 86, 62,159,251,227, 63,101, 53, 55, 0, 0, 0, 0, 63, 39,165, 7,191, 28, 84,149, 62,227,247, 51,
- 0, 0, 0, 0, 64,239,101,110,192,208, 62,150, 64,170,255, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 1, 51,128, 0, 1,179, 0, 0, 1,
- 0, 0, 0, 0, 51, 0, 0, 0, 63,128, 0, 0, 51,128, 0, 1, 0, 0, 0, 0,179, 0, 0, 2,167, 0, 0, 2, 63,128, 0, 1,
- 0, 0, 0, 0, 53, 0, 0, 1, 41, 0, 0, 1,168,128, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 49,215,190,157, 52, 4,170,167,
-128, 0, 0, 0,178,157,116,129, 63,128, 0, 1, 51, 15, 69, 33,128, 0, 0, 0, 51, 67,254, 73, 49,106, 97,243, 63,128, 0, 0,
-128, 0, 0, 0, 52, 64, 0, 3, 39,157,164,183, 53,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 63, 16,225,187, 63,128, 0, 0, 62,204,204,205, 63, 32, 54,237, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 1, 7,192, 32, 0, 0, 0,115, 0, 0, 0, 1,
- 1, 7,196, 32, 1, 7,188, 32, 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, 0, 1, 4, 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, 6,144,198, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 43,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,233, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 47,149,222, 63, 58, 70, 52,
-188, 49, 56,179,128, 0, 0, 0,190,162,126, 86, 62,159,251,227, 63,101, 53, 56,128, 0, 0, 0, 63, 39,165, 7,191, 28, 84,149,
- 62,227,247, 50,128, 0, 0, 0, 64,239,101,110,192,208, 62,151, 64,170,255, 77, 63,128, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 34,208,229,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,144,198,192, 6,144,204,128, 0, 0, 0, 25, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 0,233, 41, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 1, 7,196, 32, 0, 0, 0,115, 0, 0, 0, 1, 0, 0, 0, 0,
- 1, 7,192, 32, 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, 0, 1, 4, 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,233, 35, 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,
- 64,130,112,154, 63,128,178,183, 64,188,236,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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,123,229,
- 61, 98, 43, 87, 63,238,229,229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,148,236, 54, 63,116,134, 25,189, 98, 13,236,
- 0, 0, 0, 0,191, 69,102,221,190, 76,174, 57, 63, 26,194, 34, 0, 0, 0, 0, 63, 16,255, 37, 62, 95,161,241, 63, 75,111,164,
- 0, 0, 0, 0, 64,130,112,154, 63,128,178,183, 64,188,236,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 50,128, 0, 1,179, 0, 0, 0,
- 0, 0, 0, 0, 50,128, 0, 1, 63,128, 0, 1, 51, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 39, 0, 0, 1, 52, 0, 0, 1, 39,128, 0, 1, 63,128, 0, 0,190,148,236, 53,191, 69,102,222, 63, 16,255, 37,
-128, 0, 0, 0, 63,116,134, 24,190, 76,174, 57, 62, 95,161,240,128, 0, 0, 0,189, 98, 13,235, 63, 26,194, 34, 63, 75,111,166,
-128, 0, 0, 0, 63, 13, 19,208,190,102, 65,234,192,231, 10, 10, 63,128, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 5, 0, 1, 0, 0, 0, 68, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 34,208,229, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 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,
+ 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 6, 0, 0, 0, 16, 0, 0, 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, 0, 0, 0, 0,
+ 0, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 11, 7, 1, 0, 0, 0, 1, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,120,188, 2, 7,
+128, 0, 0, 0, 1, 0, 0, 0,136,223, 2, 7, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,236, 1, 64, 1,
+224,195, 9, 7, 68, 65, 84, 65, 28, 0, 0, 0,136,223, 2, 7,128, 0, 0, 0, 1, 0, 0, 0, 48,241, 2, 7,120,188, 2, 7,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,121, 2, 10, 2,136,199, 9, 7, 68, 65, 84, 65, 28, 0, 0, 0, 48,241, 2, 7,
+128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,223, 2, 7, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 38, 2, 28, 2,
+ 56,192, 9, 7, 68, 65, 84, 65, 72, 1, 0, 0, 72,239, 10, 7,147, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 0, 0, 0, 0, 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, 80, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 50, 0, 10, 0, 0, 0,
+ 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0,
+ 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 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, 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, 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,
+ 68, 65, 84, 65, 72, 0, 0, 0, 48,231, 9, 7,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,
+110,100,101,114, 76, 97,121,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,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,
+120, 0, 0, 0,240,143, 9, 7, 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,145,137, 68, 66,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, 0, 0, 0, 0, 76, 65, 0, 0,124, 1, 0, 0,208,240, 10, 7, 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, 83,112,111,116, 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,144,242, 10, 7,
+ 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0,
+ 0, 0, 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, 0, 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, 4, 7, 68, 65, 84, 65, 8, 1, 0, 0,
+144,242, 10, 7, 64, 1, 0, 0, 1, 0, 0, 0, 1, 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,112,236, 2, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,112,236, 2, 7,
+ 62, 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, 0, 42, 4, 7, 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,104, 1, 0, 0, 64, 39, 10, 7,
+127, 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,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, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 0, 0, 0, 0,205,204,204, 61,205,204,204, 61,
+205,204,204, 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,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, 0, 0, 0, 0, 0, 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, 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, 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, 84, 88, 0, 0,120, 0, 0, 0,232, 40, 10, 7, 27, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 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, 7, 0, 0, 0,
+ 1, 0, 0, 0, 96,142, 2, 7, 96,142, 2, 7, 96,142, 2, 7, 96,142, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,160, 41, 10, 7,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0, 96,142, 2, 7, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,248, 11, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,104,248, 11, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0,
+ 79, 66, 0, 0,100, 3, 0, 0, 56,192, 9, 7,118, 0, 0, 0, 1, 0, 0, 0,224,195, 9, 7, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,143, 9, 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,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,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, 2, 0, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 79, 66, 0, 0,100, 3, 0, 0,
+224,195, 9, 7,118, 0, 0, 0, 1, 0, 0, 0,136,199, 9, 7, 56,192, 9, 7, 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,184,149, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 48, 21, 12, 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,224,127, 10, 7,
+168,144, 9, 7, 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,128, 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,
+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, 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, 4, 0, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,137, 25, 7,152,143, 25, 7, 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, 68, 65, 84, 65, 4, 0, 0, 0,224,127, 10, 7, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,168,144, 9, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66, 0, 0,100, 3, 0, 0,136,199, 9, 7,118, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,195, 9, 7, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,240, 10, 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,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, 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, 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, 4, 0, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 77, 65, 0, 0,184, 2, 0, 0,
+ 48,203, 9, 7, 44, 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,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, 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, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 10,215, 35, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204, 76, 62,205,204, 76, 62, 0, 0, 8, 0, 1, 0, 50, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6,
+ 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 3, 3, 0, 1, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 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,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,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, 40,206, 9, 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, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 77, 65, 0, 0, 2,112, 1, 7,200, 32, 0, 0, 0, 42, 0, 0, 0, 1,
- 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,205,
- 63, 76,204,205, 63, 76,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 76,204,205, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 0, 0,
- 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 2, 0, 50, 0, 6, 63,128, 0, 0,
- 63,128, 0, 0, 0, 18, 0, 18, 59,163,215, 10, 59,163,215, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 3,
- 3, 1, 0, 3, 0, 1, 0, 4, 0, 12, 0, 4, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0,
- 61,204,204,205, 63, 0, 0, 0, 61,204,204,205, 61,204,204,205, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0,233, 41, 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, 56,144, 2, 7, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,233, 41,224, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 61, 76,204,205, 61,204,204,205,
- 63,166,102,102, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 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, 40,206, 9, 7, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,224, 45, 10, 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, 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,144, 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,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,144, 2, 7, 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, 84, 69, 0, 0,
+ 40, 1, 0, 0,224, 45, 10, 7, 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, 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, 5, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,136, 0,233, 41, 48, 0, 0, 0, 33,
- 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 42, 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, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32, 0,233, 41,224, 0, 0, 0, 19, 0, 0, 0, 1,
- 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, 84, 69, 0, 0, 1, 24, 0,233, 42, 48, 0, 0, 0, 38, 0, 0, 0, 1, 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, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 64,160, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 60,204,204,205,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 77, 69, 0, 0, 24, 1, 0, 0,
+ 48, 21, 12, 7, 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, 1, 0, 0, 0, 0, 0, 0, 0, 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,131, 2, 7, 80, 27, 12, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0,248,206, 9, 7, 72, 47, 10, 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,136, 22, 12, 7, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 24, 12, 7,
+ 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 25, 12, 7, 1, 0, 0, 0, 5, 0, 0, 0,
+ 20, 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, 4, 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, 80,131, 2, 7, 0, 0, 0, 0, 1, 0, 0, 0, 48,203, 9, 7, 68, 65, 84, 65,
+ 84, 1, 0, 0,136, 22, 12, 7, 67, 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, 77, 69, 0, 0, 1, 24, 0,233, 43,112, 0, 0, 0, 52, 0, 0, 0, 1,
- 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 44,176, 0,233, 51, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 46, 96, 0,233, 48,208,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 44,224, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 47, 80, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 49,144, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 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, 51,128, 0, 0,180, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 4, 63,128, 0, 4, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 67, 0, 30, 0, 4, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 0,233, 44,176, 0, 0, 0, 0, 0, 0, 0, 1, 1, 7,200, 32, 68, 65, 84, 65, 0, 0, 1, 84, 0,233, 44,224, 0, 0, 1, 53,
- 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,248,206, 9, 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,233, 46, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -853,17 +882,16 @@ char datatoc_B_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, 68, 65, 84, 65, 0, 0, 0,192,
- 0,233, 46, 96, 0, 0, 0, 58, 0, 0, 0, 8, 63,128, 0, 0, 63,127,255,255,191,128, 0, 0, 73,230, 73,230,182, 26, 3,255,
- 0, 0, 0, 0, 63,128, 0, 0,191,128, 0, 0,191,128, 0, 0, 73,230,182, 26,182, 26, 3,255, 0, 0, 0, 0,191,128, 0, 1,
-191,127,255,253,191,128, 0, 0,182, 26,182, 26,182, 26, 3,255, 0, 0, 0, 0,191,127,255,250, 63,128, 0, 3,191,128, 0, 0,
-182, 26, 73,230,182, 26, 3,255, 0, 0, 0, 0, 63,128, 0, 4, 63,127,255,247, 63,128, 0, 0, 73,230, 73,230, 73,230, 3,255,
- 0, 0, 0, 0, 63,127,255,245,191,128, 0, 5, 63,128, 0, 0, 73,230,182, 26, 73,230, 3,255, 0, 0, 0, 0,191,128, 0, 3,
-191,127,255,250, 63,128, 0, 0,182, 26,182, 26, 73,230, 3,255, 0, 0, 0, 0,191,127,255,255, 63,128, 0, 0, 63,128, 0, 0,
-182, 26, 73,230, 73,230, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 0,233, 47, 80, 0, 0, 1, 53, 0, 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, 68, 65, 84, 65,192, 0, 0, 0,248,206, 9, 7, 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,
+ 32, 24, 12, 7, 67, 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,233, 48,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -871,16 +899,15 @@ char datatoc_B_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, 0, 0,144, 0,233, 48,208,
- 0, 0, 0, 55, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 3,
- 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84,
- 0,233, 49,144, 0, 0, 1, 53, 0, 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,233, 51, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,144, 0, 0, 0, 72, 47, 10, 7, 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,184, 25, 12, 7, 67, 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, 80, 27, 12, 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, 0,
@@ -888,28 +915,28 @@ char datatoc_B_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, 0, 0, 0,120, 0,233, 51, 16, 0, 0, 0, 54, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2,
- 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 2, 85, 83, 69, 82, 0, 0, 11, 40, 0,169, 26,192, 0, 0, 0,172, 0, 0, 0, 1,
- 0, 1,152, 33, 0, 0, 2, 63, 0, 0, 0, 5, 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, 68, 65, 84, 65,120, 0, 0, 0, 80, 27, 12, 7, 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, 85, 83, 69, 82, 56, 11, 0, 0,
+ 0, 2, 68, 1,185, 0, 0, 0, 1, 0, 0, 0, 33,152, 1, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 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, 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,
@@ -928,8 +955,8 @@ char datatoc_B_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, 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, 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,
@@ -938,17 +965,18 @@ char datatoc_B_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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 6, 52, 48, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 64, 0, 5, 0, 2, 1, 7,216, 32, 1, 7,236, 32,
- 5,210, 18, 32, 5,210, 18, 32, 5,210, 24, 64, 5,210, 24, 64, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20,
- 0, 0, 0, 1, 0, 0, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0,191,100, 90, 30, 62,153,153,154, 63,102,102,102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 62,254,250, 31, 63, 0, 0, 9, 63, 25,153,156, 0, 0, 0, 0, 62, 76,204,205, 62, 76,204,205, 62, 76,204,205, 63,128, 0, 0,
- 63, 22,135, 44, 62,235,133, 32, 62,125,243,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76, 73,195, 63, 86,135, 42,
- 63,128, 0, 0, 0, 0, 0, 0, 61,135, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 93, 47, 16,190,200,180, 58,
-190, 93, 47, 24, 0, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0,
- 31,144, 0, 15, 0, 6, 0, 15, 0, 8, 0, 10, 0,250, 0, 0, 0,100, 0,100, 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, 2, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 48, 52, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0,168, 3, 10, 7, 40,207, 13, 7, 48, 93, 5, 7,
+ 48, 93, 5, 7,128, 94, 5, 7,128, 94, 5, 7, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 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, 0, 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, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0,
+ 6, 0, 15, 0, 8, 0, 10, 0,250, 0, 0, 0,100, 0,100, 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,
@@ -957,327 +985,197 @@ char datatoc_B_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, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 19, 8, 1, 7,216, 32, 0, 0, 0,170, 0, 0, 0, 1, 1, 7,236, 32,
- 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, 0, 1, 0, 25,
-255,231, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 1, 0, 15,
-255,241, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 0,
- 0, 25, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 15,
-255,241, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236,
- 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236,
- 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 0, 1, 0, 15,
-255,241, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 25,
-255,236, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0, 25,
-255,236, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 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,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,145,145,145,245, 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,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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,145,145,145,245, 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, 16, 64, 16,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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90,255, 0, 0, 0, 0,250,250,250,255,
- 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,180,180,180,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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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,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,145,145,145,245, 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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 82, 96,110,255,124,137,150,255, 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,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,145,145,145,245, 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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,145,145,145,245, 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, 16, 64, 16,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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 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, 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,145,145,145,245, 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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 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,116,116,116,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,145,145,145,245, 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,172,172,172,255, 84, 44, 31,100, 17, 27, 60,100,
- 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,228,156,198,255,255,255,170,255, 96,192, 64,255,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,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,145,145,145,245, 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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,145,145,145,245, 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, 16, 64, 16,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,255,255,255, 10,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 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,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,110,110,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,145,145,145,245, 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,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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,145,145,145,245, 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, 16, 64, 16,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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,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,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,145,145,145,245, 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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,145,145,145,245, 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, 16, 64, 16,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, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
- 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, 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,145,145,145,245, 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, 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255,
- 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,
-129,131,144,255,127,127,127,255,142,138,145,255,120,145,120,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,154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255,
- 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255,
- 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255,
- 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255,
- 0, 0, 0, 0,244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255,
- 0, 0, 0, 0,111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255,
- 0, 0, 0, 0,141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,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, 68, 65, 84, 65, 0, 0, 19, 8, 1, 7,236, 32, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 1, 7,216, 32,
- 82,111,117,110,100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,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, 2, 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,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, 68, 65, 84, 65,200, 21, 0, 0,168, 3, 10, 7,183, 0, 0, 0, 1, 0, 0, 0, 40,207, 13, 7, 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, 0, 1, 0, 25,255,231, 0, 0,
- 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 1, 0, 15,255,241, 0, 0,
- 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 0, 0, 25, 0, 0,
- 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 15,255,241, 0, 0,
- 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236, 0, 0, 0, 0,
- 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236, 0, 0, 0, 0,
- 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 0, 1, 0, 15,255,241, 0, 0,
- 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 25,255,236, 0, 0,
- 0, 0, 0,255, 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0, 25,255,236, 0, 0,
- 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,175,175,175, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,
-107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,
- 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255,
- 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,
-255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,
-255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0,
+ 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,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,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,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0,
+ 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0,
+ 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0,
+ 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0,
+ 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, 0, 0, 25, 0,236,255, 0, 0,
+ 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0,
+ 25, 25, 25,255,128,128,128,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,
+ 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0, 5, 0,251,255, 0, 0,
+ 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, 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,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,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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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, 16, 64, 16,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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90,255, 0, 0, 0, 0,250,250,250,255, 15, 15, 15,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,180,180,180,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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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,
+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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255,
+124,137,150,255, 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,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,
+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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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, 16, 64, 16,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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100,255,130, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,
-107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,
-107,107,107,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,100,143,143,143,100, 96,192, 64,255, 94, 94, 94,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,135,177,125,255,255,255,255,255,255,255,255,255,
-255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 82, 96,110,255,
-124,137,150,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,
-255,255,255,255,255,130, 0,255, 2, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,
-158,158,158,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,
-255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 79,101, 73,255,135,177,125,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,143,143,143,255,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-228,156,198,204,255,255,170,204, 96,192, 64,255, 82, 96,110,255,124,137,150,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,
-107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,143,143,143,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,
-255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,255,255,255,170,255, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 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,
+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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255,
+124,137,150,255, 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,116,116,116,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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,
-255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60,
-255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 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,
+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,
+ 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, 16, 64, 16,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,255,255,255, 10,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 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,255,255,255,128,
- 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,
-195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-143,143,143,255,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,
-153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,153,153,153,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 88, 88, 88,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,
-255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 2, 0, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,
-158,158,158,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255,
- 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,
-255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,110,110,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,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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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, 16, 64, 16,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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,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,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,
+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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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, 16, 64, 16,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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255,
127,127,127,255,142,138,145,255,120,145,120,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,255,255,255,128, 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, 16, 64, 16,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, 18,255,133, 0, 60,
+255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,
+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,
+ 16, 64, 16,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, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0,
30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,
169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0,
@@ -1288,1632 +1186,1958 @@ char datatoc_B_blend[]= {
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,
- 68, 78, 65, 49, 0, 0,203, 56, 6, 62, 16, 32, 0, 0, 0, 0, 0, 0, 0, 1, 83, 68, 78, 65, 78, 65, 77, 69, 0, 0, 10, 5,
- 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,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,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,
-111,110, 95,105,100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,
-105,108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,
-116,111,116, 0,112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,
-100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,
-107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,
-116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,114,116, 0,
-105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,105,110, 0,
-115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,101, 0, 99,
-117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116,105,118,101, 0,
-116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, 91, 51, 50, 93,
- 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114,101,102,107,101,
-121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, 0, 42,105,112,
-111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 42, 42,115, 99,114,105,112,116,115, 0,
- 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,112,116, 0,116,111,116,115, 99,114,105,112,116, 0, 42,108,105,110,101, 0,
- 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108,
- 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115,
- 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,
-107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0,117,110,100,111, 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, 97,110,103,108,101, 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, 89, 70, 95, 97,112,101,114,116,117,114,101, 0, 89,
- 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,116, 0,115,
- 99,114,105,112,116,108,105,110,107, 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,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,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,112, 97,100, 91, 50, 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,110,111,114,102, 97, 99, 0,118, 97,114,
-102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,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,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,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,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 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, 99,111, 98, 97, 0, 42,101,110,118, 0,117,115,101, 95,110,111,100,101,115, 0,112, 97,
-100, 91, 55, 93, 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,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,115,104, 97,100,115,112,111,116,
-115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 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, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,
-115, 0, 89, 70, 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,
-113,109, 99, 0, 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99,
- 98,108,117,114, 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,
-108,111,119,111,102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120,
- 91, 49, 56, 93, 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,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,
- 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,
-112,119,114, 0, 89, 70, 95,100,115,109,112, 0, 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,105,116, 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,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,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,
-115, 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, 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,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, 98,112, 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,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, 99,117, 98,101,
-109, 97,112,115,105,122,101, 0,100,114, 97,119,102,108, 97,103, 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, 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, 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,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,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,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, 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, 97, 98,115,111,114,112,116,105,111,110, 0,116,105,109,101, 0, 42, 98,118,104,116,114,
-101,101, 0, 42,100,109, 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,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110,100,119,101,105,103,
-104,116,115, 0, 42, 98,105,110,100, 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,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,115,121,115, 0,114,
-116, 91, 50, 93, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0, 42,117,110,100,
-111, 95,118,101,114,116,115, 0,117,110,100,111, 95,118,101,114,116,115, 95,116,111,116, 0,117,110,100,111, 95,115,105,103,110,
- 97,108, 0,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,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,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, 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,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,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, 99,116,105,109,101, 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,
-115,105,122,101,102, 97, 99, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,100,
-116, 0,100,116,120, 0, 97, 99,116, 99,111,108, 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,112,100, 0, 42,115,111,102,116,
+ 68, 65, 84, 65,200, 21, 0, 0, 40,207, 13, 7,183, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168, 3, 10, 7, 82,111,117,110,
+100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,101, 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, 25, 0,231,255, 0, 0, 25, 25, 25,255,
+153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,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, 25, 25, 25,255,
+180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,
+180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255,
+ 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255,
+ 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255,
+ 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,175,175,175, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,107,107,107,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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, 0, 0, 0, 51,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,
+217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255,
+ 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255,
+ 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 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,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100,255,130, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,107,107,107,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,107,107,107,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,100,143,143,143,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,135,177,125,255,255,255,255,255,255,255,255,255,255,130, 0,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 82, 96,110,255,124,137,150,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,255,255,255,255,
+255,130, 0,255, 2, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,158,158,158,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,
+135,177,125,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,143,143,143,255,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,204,
+255,255,170,204, 96,192, 64,255, 82, 96,110,255,124,137,150,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,107,107,107,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,143,143,143,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,255,255,255,170,255, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96,192, 64,255, 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, 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, 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,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 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,255,255,255,128, 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,195,195,195,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,
+127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,153,153,153,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,153,153,153,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 88, 88, 88,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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,
+ 2, 0, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 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,158,158,158,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255,
+255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255,
+ 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 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, 96,192, 64,255, 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,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255,127,127,127,255,
+142,138,145,255,120,145,120,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,100,100,100,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245,
+ 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, 0, 0, 0, 51,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,
+217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255,
+ 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255,
+ 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 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, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255,255,255,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0,255,
+189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255,
+ 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,
+193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255,
+ 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,
+238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,
+152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,
+176,176,176,255,222,222,222,255, 0, 0, 0, 0,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, 68, 78, 65, 49,
+ 28,222, 0, 0, 32, 80, 6, 7, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,212, 10, 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,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,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,
+100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100,
+ 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,
+112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93,
+ 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,
+101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,
+120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,
+101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,
+101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,
+104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,
+108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,
+100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114,101,102,107,101,121, 0,101,108,
+101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,
+114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0,
+ 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,
+114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42,
+ 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,
+100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0,117,110,100,111, 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, 97,110,103,108,101, 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, 89, 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,
+101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,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,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, 42,114,101,110,100,101,114, 95,116,101,120,116, 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,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,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, 42,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,112,100,112, 97,100, 50, 91, 50, 93, 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,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,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,
+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,101,120,116,101,110,100, 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, 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, 0, 89, 70, 95,110,117,109,112,104,
+111,116,111,110,115, 0, 89, 70, 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70,
+ 95,117,115,101,113,109, 99, 0, 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,
+115,116,105, 99, 98,108,117,114, 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0,
+ 89, 70, 95,103,108,111,119,111,102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 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, 91, 51, 93, 0,100,101,110,115,105,
+116,121, 0,101,109,105,115,115,105,111,110, 0, 97, 98,115,111,114,112,116,105,111,110, 0,115, 99, 97,116,116,101,114,105,110,
+103, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0, 97, 98,115,111,114,112,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,112,
+104, 97,115,101,102,117,110, 99, 95,116,121,112,101, 0,118,112, 97,100, 91, 51, 93, 0,112,104, 97,115,101,102,117,110, 99, 95,
+103, 0,115,116,101,112,115,105,122,101, 0,115,104, 97,100,101, 95,115,116,101,112,115,105,122,101, 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,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,116,101,112,115, 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, 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0,
+ 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,100,115,109,112, 0, 89, 70, 95,112,114,101,
+115,101,116, 0, 89, 70, 95,100,106,105,116, 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, 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,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, 98,112, 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, 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, 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,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,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110,100,119,101,105,103,104,116,115,
+ 0, 42, 98,105,110,100, 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,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,115,121,115, 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, 42,117,110,100,111, 95,118,101,114,116,115, 0,117,110,100,111, 95,118,101,114,116,115, 95,116,111,116,
+ 0,117,110,100,111, 95,115,105,103,110, 97,108, 0,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,
+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, 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,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,115,105,122,101,102, 97, 99, 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,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, 53, 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, 99,
-117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108,
-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,102, 95,115,116,114,101,110,103,
-116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, 97,109,112, 0,109, 97,120,100,105,115,116,
- 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,102, 95,112,111,119,101,114, 95,114,
- 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,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120,105,115, 0,
-114,116, 50, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 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,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, 42,112, 97,114,116,105, 99,
-108,101,115, 0,116,111,116,112,111,105,110,116, 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,110,111,100,101,109, 97,115,115, 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,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,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,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,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,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 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,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,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,104,101,109,105,114,101,115, 0,109, 97,120,105,116,101,114, 0,100,114, 97,119,116,
-121,112,101, 0,115,117, 98,115,104,111,111,116,112, 0,115,117, 98,115,104,111,111,116,101, 0,110,111,100,101,108,105,109, 0,
-109, 97,120,115,117, 98,108, 97,109,112, 0,112, 97,109, 97, 0,112, 97,109,105, 0,101,108,109, 97, 0,101,108,109,105, 0,109,
- 97,120,110,111,100,101, 0, 99,111,110,118,101,114,103,101,110, 99,101, 0,114, 97,100,102, 97, 99, 0,103, 97,109,109, 97, 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, 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,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, 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,102,102, 99,111,100,101, 99,100, 97,116, 97, 0, 97,117,100,105,111, 0, 99,102,114, 97, 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, 49, 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,114,112, 97,100, 0,114,112, 97,100, 49, 0,114,112, 97,100, 50,
- 0,115, 99,101,109,111,100,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,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,112,111,115,116,109,117,108, 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, 71, 73,113,117, 97,108,
-105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71,
- 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,
-117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71,
- 73, 99, 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120,101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,
-104,111,116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120,112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,
-114, 97,100,105,117,115, 0, 89, 70, 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89,
- 70, 95, 65, 65,115, 97,109,112,108,101,115, 0,121,102,112, 97,100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,
-116,121, 0, 71, 73,114,101,102,105,110,101,109,101,110,116, 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,
-111,119,101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89, 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121,
- 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,
-108,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,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,112, 97,100, 57, 0,100,
-111,109,101,115,105,122,101, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101,120,116, 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, 99,111,108, 91, 51, 93, 0,102,114, 97,109,101, 0,110,
- 97,109,101, 91, 54, 52, 93, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 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, 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,115,116,101,112, 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,100,114, 97,119, 95,116,105,109,101,
-100, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 42,115,101,115,115,105,111,110, 0,112,105,
-118,111,116, 91, 51, 93, 0,116,101,120,115,101,112, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,101,116,
- 95,115,116,114,101,110,103,116,104, 0,112, 97,100, 91, 53, 93, 0,109,117,108, 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, 42,
-115, 99,117,108,112,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,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,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,
-115,107,103,101,110, 95,112, 97,100, 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,112, 97,100, 51, 91, 50, 93, 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, 42, 99, 97,109,101,114, 97, 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,101,100,105,116, 98,117,116,115,105,122,101, 0,115,101,108,101, 99,116,109,111,100,101, 0,112,114,111,112,111,
-114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0, 97,117,116,111,109,101,114,103,101, 0,112, 97,100, 53,
- 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 42,101,100, 0, 42,114, 97,100,105,111, 0,102,114, 97,109,105,110,103,
- 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0,116,114, 97,110,115,102,111,114,109, 95,
-115,112, 97, 99,101,115, 0,106,117,109,112,102,114, 97,109,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, 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,102,114, 97,109,101, 95,115,116,101,112, 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,122,111,111,109, 0, 98,108,101,110,100, 0,120,
-105,109, 0,121,105,109, 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,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,108, 97,115,116,109,111,100,101, 0,114,102,108, 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0,118,
-105,101,119, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,103,112,100, 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,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, 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,108, 97,121, 97, 99,116, 0,108,111, 99, 97,108,118,105,101,119, 0,115,
- 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,102,108, 97,103, 50, 0,112,105,118,111,116, 95,108, 97,115,116,
- 0,103,114,105,100, 0,103,114,105,100,118,105,101,119, 0,112, 97,100,102, 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,116,119,100,114, 97,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, 99,117,114,115,111,114, 91, 50, 93, 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,112,105,110, 0,108,111, 99,107, 0, 99,117,114,115,101,110,115, 0, 99,117,114, 97, 99,116, 0,116, 97, 98,111, 0,109, 97,
-105,110, 98, 0,109, 97,105,110, 98,111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,110,114, 0,116,101,120,102,114,
-111,109, 0,115,104,111,119,103,114,111,117,112, 0,109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,108,111,
- 99,107, 0,114,101, 95, 97,108,105,103,110, 0,111,108,100,107,101,121,112,114,101,115,115, 0,116, 97, 98, 91, 56, 93, 0, 99,
-104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0, 42,112, 97,114, 97,109,115, 0, 42,102,105,108,101,115, 0, 42,111,
-112, 0, 42,108,111, 97,100,105,109, 97,103,101, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 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,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,101,110,116,120, 0, 99,101,110,116,121, 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,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,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,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,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,109,101,110,117, 0,115,111,
-114,116, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,116,105,108,101,
-115,121, 0,115,101,108,115,116, 97,116,101, 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, 97, 99,116,105,118,101, 95, 98,111,111,107,109, 97,114,107, 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,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,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,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,
-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,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,114, 97,100,105,111, 0,119, 99,111,108, 95,116,101,
-120,116, 0,119, 99,111,108, 95,111,112,116,105,111,110, 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,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,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,
- 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,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,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, 51, 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, 97,114,109, 91,
- 50, 48, 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,121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48,
- 93, 0,118,101,114,115,105,111,110,115, 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,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,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,
-119,109,112, 97,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,105,112,111, 95,110,101,119, 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, 97,117,116,111,107,101,121, 95,
-102,108, 97,103, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 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,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,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, 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, 99,117,114,115,111,114, 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,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,100,105,115,112,108, 97,121,109,111,100,101, 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,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,
-115, 97,116,117,114, 97,116,105,111,110, 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,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,102, 97, 99,102, 48, 0,102, 97, 99,102, 49, 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,111,117,110,100, 0, 42,
-104,100, 97,117,100,105,111, 0,108,101,118,101,108, 0,112, 97,110, 0, 99,117,114,112,111,115, 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,115,
- 99,101,110,101,110,114, 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,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, 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,111,116,121,112,101, 0,111,108,100, 0, 42,112,111,105,110, 0, 42,111,108,100,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, 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,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,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,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93,
- 0,109, 97,107,101, 99,111,112,121, 0, 99,111,112,121,109, 97,100,101, 0,112, 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107,
- 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, 98,117,116,115,116, 97, 0, 98,
-117,116,101,110,100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,105,102, 97, 99, 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,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,103,111, 0, 97,
- 99, 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,
-100, 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,
-112, 0, 42,115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101,
- 0, 42,115,110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,
-112,105,116, 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99,101,
- 0,115,116,114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97,100,
- 91, 49, 48, 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114,118,
-101,108,111, 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117,110,
-100,115,103, 97,109,101,101,110,103,105,110,101, 0, 42, 97,114,101, 97, 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, 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,112, 97,116,104,102,108, 97,103, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,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, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,116, 0,102,111,
+114, 99,101,102,105,101,108,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,102,
+ 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, 97,109,112, 0,
+109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,102, 95,
+112,111,119,101,114, 95,114, 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,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,
+107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 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,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,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,104,111,114,107, 0,
+122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 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,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,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, 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,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, 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,102,102, 99,111,100,101, 99,100, 97,116, 97, 0, 97,117,
+100,105,111, 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, 49, 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,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,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, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99,
+ 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116,
+ 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95,
+ 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,
+112,116,104, 0, 71, 73,112,105,120,101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,
+117,110,116, 0, 71, 73,109,105,120,112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0,
+ 89, 70, 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,
+112,108,101,115, 0,121,102,112, 97,100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,
+102,105,110,101,109,101,110,116, 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70,
+ 95,103, 97,109,109, 97, 0, 89, 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70,
+ 95, 65, 65,112,105,120,101,108,115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,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,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,100,111,
+109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0, 42, 42, 98,114,117,115,104,101,115, 0, 97, 99,116,105,118,101, 95, 98,
+114,117,115,104, 95,105,110,100,101,120, 0, 98,114,117,115,104, 95, 99,111,117,110,116, 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,116,
+111,111,108, 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, 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,112,
+105,118,111,116, 91, 51, 93, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,101,116, 95,115,116,114,101,110,
+103,116,104, 0,103, 97,109,109, 97, 0,109,117,108, 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,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, 42, 99, 97,109,
+101,114, 97, 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, 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,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0,115,111,117,110,100, 95,104, 97,110,100,108,
+101,115, 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,102,114, 97,109,101, 95,115,116,101,112, 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, 98,108,101,110,100, 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,108, 97,115,116,109,111,100,101, 0,114,102,108, 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,
+112, 0,118,105,101,119, 0, 99,108,105,112, 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,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, 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,108, 97,121, 97, 99,116, 0,100,114, 97,119,116,121,112,101, 0,108,111, 99, 97,
+108,118,105,101,119, 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,103,114,105,100,118,105,101,119, 0,112, 97,100,102, 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,116,119,100,114, 97,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, 99,117,114,115,111,114, 91, 50, 93, 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,112,105,
+110, 0,108,111, 99,107, 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,109,101,110,117, 0,102,112, 95,115,116,114, 91, 56, 93, 0, 42,112,117,112,109,101,
+110,117, 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,108,111, 97,100,105,109, 97,103,101, 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,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,101,110,116,120, 0, 99,101,110,116,121, 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,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,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,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, 56, 93, 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,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,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,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, 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,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,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, 51, 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, 97,114,109, 91, 50, 48, 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,121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93, 0,118,101,
+114,115,105,111,110,115, 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,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,119,109,112, 97,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,105,112,111, 95,110,101,119, 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,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,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,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,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,
+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,115, 97,116,117,
+114, 97,116,105,111,110, 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,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,102, 97, 99,102, 48, 0,102, 97, 99,102, 49, 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,111,117,110,100, 0, 42,115,111,117,110,
+100, 95,104, 97,110,100,108,101, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 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,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, 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, 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,109,111,100,117,108,101, 91, 54, 52, 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,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,112,105,116,
+ 99,104, 0,115,111,117,110,100, 51, 68, 0,109, 97,107,101, 99,111,112,121, 0, 99,111,112,121,109, 97,100,101, 0,112, 97,100,
+ 50, 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, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,
+105,102, 97, 99, 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,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,103,111, 0, 97, 99, 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,
+112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100, 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,
+108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,112, 0, 42,115,111,117,114, 99,101, 0,102,114, 97,109,101,115,107,
+105,112, 0,109,117,116,101, 0, 99,104, 97,110,103,101,100, 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, 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, 97,114,101, 97, 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, 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,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,114,111,112, 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,114,111,116,109,111,100,101, 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, 42, 99,117,115,116,111,109, 0, 99,104,
- 97,110, 98, 97,115,101, 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, 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,102,105,108,116,101,
-114,102,108, 97,103, 0, 97,100,115, 0, 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 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, 42,116, 97,114, 0,115,117,
- 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 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,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,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,117,115,101,114,110, 97,109,101, 91, 51,
- 50, 93, 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,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, 42,
-115,101,108,105,110, 0, 42,115,101,108,111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 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,116, 99,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,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, 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,
-105,116,101,114, 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,115, 97,116, 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,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,112,114,101,118,105,101,119, 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,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, 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,111,
-102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,105,110,110,101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,
-114,103, 98, 91, 51, 93, 0,114,111,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 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,101,100,105,116,102,108, 97,103, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,118,101, 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, 97,110,100, 91, 51, 93, 0, 42,115,116,105, 99,107, 95,111, 98, 0,112,114,101,118, 95,115,116, 97,
-116,101, 0, 42,104, 97,105,114, 0,105, 95,114,111,116, 91, 52, 93, 0,114, 95,114,111,116, 91, 52, 93, 0,114, 95, 97,118,101,
- 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, 0,100,105,101,116,105,109,101, 0, 98, 97,110,107, 0,115,105,122,101,109,117,108,
- 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, 0, 97,108,105,118,101, 0,108,111,111,112, 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,100,
-114, 97,119, 95,115,116,101,112, 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,110, 98,101,116,119,101,101,110, 0, 98,111,105,100,110,101,105,103,
-104, 98,111,117,114,115, 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,102,
-108, 97,103, 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,107,101,121,101,100, 95,
-116,105,109,101, 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, 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, 97, 98,115,108,101,110,103,116,104, 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,104,105,108,100,115,112,114,101, 97,100, 0,
- 99,108,117,109,112,102, 97, 99, 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, 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,109, 97,120, 95,108, 97,116,
- 95, 97, 99, 99, 0,109, 97,120, 95,116, 97,110, 95, 97, 99, 99, 0, 97,118,101,114, 97,103,101, 95,118,101,108, 0, 98, 97,110,
-107,105,110,103, 0,109, 97,120, 95, 98, 97,110,107, 0,103,114,111,117,110,100,122, 0, 98,111,105,100,102, 97, 99, 91, 56, 93,
- 0, 98,111,105,100,114,117,108,101, 91, 56, 93, 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,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,
-100,105,116, 41, 40, 41, 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,116, 97,
-114,103,101,116, 95,111, 98, 0, 42,107,101,121,101,100, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,
-116,111,114,115, 0,114,101, 97, 99,116,101,118,101,110,116,115, 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,107,101,
-121,101,100, 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,
+ 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, 42,112,114,111,112, 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,114,111,116,109,111,100,101, 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, 42, 99,117,115,116,111,109, 0, 99,104, 97,110,
+ 98, 97,115,101, 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, 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,102,105,108,116,101,114,
+102,108, 97,103, 0, 97,100,115, 0, 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 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, 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,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,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,117,115,101,114,110, 97,109,101, 91, 51, 50, 93, 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,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, 42,115,101,108,105,110, 0,
+ 42,115,101,108,111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 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,116, 99,
+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,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, 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,105,116,101,114, 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,
+115, 97,116, 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,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,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, 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,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101,
+ 0,105,110,110,101,114,114, 97,100,105,117,115, 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,116,111,111,108, 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,101,100,105,116,102,
+108, 97,103, 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,103,114, 97,118,105,116,121, 91, 51, 93, 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, 97,110,100, 91,
+ 51, 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, 97,108,105,118,101, 0,108,111,111,112, 0,104, 97,105,114, 95,105,110,
+100,101,120, 0, 42, 98,111,105,100,115, 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,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,102,108, 97,103, 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, 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,102, 97, 99, 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,101,102,102,101, 99,116,111,114, 95,119,101,105,103,104,116, 91, 49, 48,
+ 93, 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,101,102,102,101, 99,
+116,111,114,115, 0,114,101, 97, 99,116,101,118,101,110,116,115, 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, 99, 97, 99,104,101, 0, 67,100,105,115, 0, 67,118,105, 0, 91,
- 51, 93, 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,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,112,114,101,115,101,116,115, 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, 42,112,111,105,110,116,115, 0,116,111,116,112,111,105,110,116,115, 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,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,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,107,101,121,109, 97,112,115, 0,
- 42,103,104,111,115,116,119,105,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, 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,116,105,109,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, 42,112,116,114, 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,107,101,121,109, 97,112, 0,110, 97,109,101,105,100, 91, 54, 52, 93, 0,115,112, 97, 99,101,105,100,
- 0,114,101,103,105,111,110,105,100, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,114,101,112,111,114,116,115, 0, 42,
-101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 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,102,117,110, 99, 95,116,121,112,101, 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, 42,114,
-110, 97, 95,112, 97,116,104, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 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, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, 0, 97, 99,
-116, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,115,116,114,105,112,115, 0,105,110,102,111, 91, 54, 52, 93,
- 0,103,114,111,117,112, 91, 54, 52, 93, 0,105,100,116,121,112,101, 0,116,101,109,112,108, 97,116,101,115, 0,103,114,111,117,
-112,109,111,100,101, 0,112, 97,116,104,115, 0,107,101,121,105,110,103,102,108, 97,103, 0,110,108, 97, 95,116,114, 97, 99,107,
-115, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 84, 89, 80, 69, 0, 0, 1,154, 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,105, 0,118,101, 99, 50,102, 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, 83, 99,114,105,112,116, 76,105,110,107, 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, 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, 87, 97,118,101, 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, 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,
- 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 32, 40, 49, 60, 60, 49, 41, 32, 35,100,101,102,
-105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 32, 40, 49, 60, 60, 50, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 71,
- 79, 78, 32, 40, 49, 60, 60, 51, 41, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82,
- 32, 40, 49, 60, 60, 53, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 32, 40, 49, 60,
- 60, 55, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 32, 40, 49, 60, 60, 56, 41, 32,
- 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 32, 40, 49, 60, 60, 57, 41, 32, 32, 32, 35,100,101,102,105,110,
-101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, 32,
- 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69,
- 95, 70, 76, 73, 80, 86, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 32, 49, 54, 32, 35,
-100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 32, 51, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80,
- 82, 79, 74, 89, 90, 32, 54, 52, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 32, 49, 32, 35,100,101,102,
-105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 32, 52, 32,
- 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 52, 86,
- 49, 32, 56, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 32, 49, 32, 35,100,101,102,105,110,101,
- 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 32, 50, 32, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 83, 69,108,
- 32, 48, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95,
- 70, 83, 69, 76, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 49, 32, 32, 35,100,101,
-102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76,
- 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70,
- 95, 83, 69, 76, 51, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 32, 51, 50, 32, 35,100,101,102,
-105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 32, 54, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, 65,
- 77, 73, 67, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 32, 50, 32, 35,100,101,
-102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 86,
- 69, 82, 84, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 32, 49, 54, 32, 35,100,101,102,105,110,
-101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 73, 76,
- 69, 83, 32, 49, 50, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 32, 50, 53, 54, 32,
- 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 32, 53, 49, 50, 32, 35,100,101,102,105,110,101, 32, 84,
- 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 32, 49, 48, 50, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, 79,
- 76, 32, 50, 48, 52, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 32, 52, 48, 57,
- 54, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 32, 56, 49, 57, 50, 32, 35,100,101,102,105,110,
-101, 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 32, 49, 54, 51, 56, 52, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 79,
- 76, 73, 68, 32, 48, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84,
- 70, 95, 65, 76, 80, 72, 65, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 32, 52, 32, 32, 32, 35,100,
-101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 32, 51, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69,
- 67, 65, 84, 69, 68, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 50, 32,
- 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 32, 52, 32, 35,100,101,102,105,
-110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80,
- 73, 78, 49, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 32, 51, 50, 32, 35,100,101,102,105,110,
-101, 32, 84, 70, 95, 80, 73, 78, 51, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 52, 32, 49, 50, 56,
- 32, 35,101,110,100,105,102, 32,108,118,108, 59, 10, 9,117,110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,117,115,101, 95,
- 99,111,108, 44, 32,102,108, 97,103, 59, 10, 10, 9, 47, 42, 32, 83,112,101, 99,105, 97,108, 32,108,101,118,101,108, 32, 49, 32,
-100, 97,116, 97, 32,116,104, 97,116, 32, 99, 97,110,110,111,116, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32,102,114,111,
-109, 32,111,116,104,101,114, 32,108,101,118,101,108,115, 32, 42, 47, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,118,100,
- 97,116, 97, 59, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,102,100, 97,116, 97, 59, 10, 9,115,104,111,114,116, 32, 42,
-101,100,103,101, 95,102,108, 97,103,115, 59, 10, 9, 99,104, 97,114, 32, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 59,
- 10,125, 32, 77,117,108,116,105,114,101,115, 59, 10, 10, 47, 42, 42, 32, 69,110,100, 32, 77,117,108,116,105,114,101,115, 32, 42,
- 42, 47, 10, 10,116,121,112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,
-108,105,116,121, 32,123, 10, 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32, 42,118,101,114,116, 95,109, 97,112, 59, 32,
- 47, 42, 32,118,101,114,116, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,
-120, 32, 42, 47, 10, 9,105,110,116, 32, 42,101,100,103,101, 95,109, 97,112, 59, 32, 47, 42, 32,101,100,103,101, 95,109, 97,112,
- 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,120, 44, 32, 45, 49, 61, 32,104,105,100,100,
-101,110, 32, 42, 47, 10, 9, 77, 70, 97, 99,101, 32, 42,111,108,100, 95,102, 97, 99,101,115, 59, 10, 9, 77, 69,100,103,101, 32,
- 42,111,108,100, 95,101,100,103,101,115, 59, 10, 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32,116,111,116,102, 97, 99,
-101, 44, 32,116,111,116,101,100,103,101, 44, 32,116,111,116,118,101,114,116, 44, 32,112, 97,100, 59, 10,125, 32, 80, 97,114,116,
-105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 59, 10, 10, 47, 42, 32,109,118,101,114,116, 45, 62,102,108, 97,103, 32, 40,
- 49, 61, 83, 69, 76, 69, 67, 84, 41, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69,
- 83, 84, 9, 50, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 77, 80, 9, 52, 10, 35,100,101,
-102,105,110,101, 32, 77, 69, 95, 72, 73, 68, 69, 9, 9, 9, 49, 54, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 69, 82,
- 84, 95, 77, 69, 82, 71, 69, 68, 9, 9, 40, 49, 60, 60, 54, 41, 10, 10, 47, 42, 32,109,101,100,103,101, 45, 62,102,108, 97,103,
- 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65,
- 87, 9, 9, 9, 40, 49, 60, 60, 49, 41, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 9, 9, 9, 9, 40, 49,
- 60, 60, 50, 41, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 71, 79, 78, 9, 9, 9, 9, 40, 49, 60, 60, 51, 41, 10, 9,
- 9, 9, 9, 9, 9, 47, 42, 32,114,101,115,101,114,118,101, 32, 49, 54, 32,102,111,114, 32, 77, 69, 95, 72, 73, 68, 69, 32, 42,
- 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82, 9, 9, 40, 49, 60, 60, 53, 41, 10,
- 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 9, 9, 40, 49, 60, 60, 55, 41, 10, 35,100,101,
-102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 9, 9, 40, 49, 60, 60, 56, 41, 10, 35,100,101,102,105,110,
-101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 9, 9, 9, 40, 49, 60, 60, 57, 41, 10, 10, 47, 42, 32,112,117,110,111, 32, 61, 32,118,
-101,114,116,101,120,110,111,114,109, 97,108, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 10, 47, 42, 32,114,101,110,100,101,114,
- 32, 97,115,115,117,109,101,115, 32,102,108,105,112,115, 32,116,111, 32, 98,101, 32,111,114,100,101,114,101,100, 32,108,105,107,
-101, 32,116,104,105,115, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 9, 9, 49, 10, 35,
-100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, 9, 9, 50, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70,
- 76, 73, 80, 86, 51, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 9, 9, 56, 10, 35,100,
-101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 9, 9, 49, 54, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80,
- 82, 79, 74, 88, 90, 9, 9, 51, 50, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 89, 90, 9, 9, 54, 52, 10,
- 10, 47, 42, 32,101,100, 99,111,100,101, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69,
- 95, 86, 49, 86, 50, 9, 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 9, 9, 9, 50, 10, 35,100,
-101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 9, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86,
- 52, 9, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 52, 86, 49, 9, 9, 9, 56, 10, 10, 47, 42, 32,102,108,
- 97,103, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 9,
- 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 9, 9, 9, 50, 10, 9, 9, 9, 9,
- 9, 9, 47, 42, 32,102,108, 97,103, 32, 77, 69, 95, 72, 73, 68, 69, 61, 61, 49, 54, 32,105,115, 32,117,115,101,100, 32,104,101,
-114,101, 32,116,111,111, 32, 42, 47, 32, 10, 47, 42, 32,109,115,101,108,101, 99,116, 45, 62,116,121,112,101, 32, 42, 47, 10, 35,
-100,101,102,105,110,101, 32, 77, 69, 95, 86, 83, 69,108, 9, 48, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108,
- 32, 49, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45,
- 62,102,108, 97,103, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 9, 49, 32, 47, 42, 32,
-117,115,101, 32, 77, 70, 97, 99,101, 32,104,105,100,101, 32,102,108, 97,103, 32, 40, 97,102,116,101,114, 32, 50, 46, 52, 51, 41,
- 44, 32,115,104,111,117,108,100, 32, 98,101, 32, 97, 98,108,101, 32,116,111, 32,114,101,117,115,101, 32, 97,102,116,101,114, 32,
- 50, 46, 52, 52, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 9, 50, 32, 47, 42, 32,100,
-101,112,114,101, 99, 97,116,101,100, 33, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 49, 9, 9, 52,
- 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 9, 9, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83,
- 69, 76, 51, 9, 9, 49, 54, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 9, 9, 51, 50, 10, 35,100,101,102,
-105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 9, 9, 54, 52, 32, 47, 42, 32,117,110,117,115,101,100, 44, 32,115, 97,109,101, 32,
- 97,115, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 42, 47, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,109,111,100,101,
- 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, 65, 77, 73, 67, 9, 9, 49, 10, 35,100,101,102,105,110,
-101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 9, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 9,
- 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 86, 69, 82, 84, 9, 56, 10, 35,100,101,102,
-105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 9, 9, 49, 54, 10, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65,
- 82, 69, 68, 67, 79, 76, 9, 54, 52, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 73, 76, 69, 83, 9, 9, 49, 50, 56, 10,
- 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 9, 50, 53, 54, 10, 35,100,101,102,105,110,101,
- 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 9, 9, 53, 49, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 73, 78, 86, 73,
- 83, 73, 66, 76, 69, 9, 49, 48, 50, 52, 10, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, 79, 76, 9, 9, 50, 48,
- 52, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 9, 52, 48, 57, 54, 9, 47, 42,
- 32,119,105,116,104, 32, 90, 32, 97,120,105,115, 32, 99,111,110,115,116,114, 97,105,110,116, 32, 42, 47, 10, 35,100,101,102,105,
-110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 9, 9, 56, 49, 57, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 77,
- 70, 79, 78, 84, 9, 9, 49, 54, 51, 56, 52, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,116,114, 97,110,115,112, 44, 32,
-118, 97,108,117,101,115, 32, 49, 45, 52, 32, 97,114,101, 32,117,115,101,100, 32, 97,115, 32,102,108, 97,103,115, 32,105,110, 32,
-116,104,101, 32, 71, 76, 44, 32, 87, 65, 82, 78, 73, 78, 71, 44, 32, 84, 70, 95, 83, 85, 66, 32, 99, 97,110,116, 32,119,111,114,
-107, 32,119,105,116,104, 32,116,104,105,115, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 79, 76, 73, 68, 9,
- 48, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65,
- 76, 80, 72, 65, 9, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 9, 9, 52, 32, 47, 42, 32, 99,108,105,
-112,109, 97,112, 32, 97,108,112,104, 97, 47, 98,105,110, 97,114,121, 32, 97,108,112,104, 97, 32, 97,108,108, 32,111,114, 32,110,
-111,116,104,105,110,103, 33, 32, 42, 47, 10, 10, 47, 42, 32,115,117, 98, 32,105,115, 32,110,111,116, 32, 97,118, 97,105,108, 97,
- 98,108,101, 32,105,110, 32,116,104,101, 32,117,115,101,114, 32,105,110,116,101,114,102, 97, 99,101, 32, 97,110,121,109,111,114,
-101, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 9, 9, 51, 10, 10, 10, 47, 42, 32,109,116,102, 97,
- 99,101, 45, 62,117,110,119,114, 97,112, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65,
- 84, 69, 68, 49, 9, 49, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 50, 9, 50, 10,
- 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 9, 52, 10, 35,100,101,102,105,110,101,
- 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 9, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78,
- 49, 9, 9, 32, 32, 32, 32, 49, 54, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 9, 9, 32, 32, 32, 32, 51,
- 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 9, 32, 32, 32, 9, 9, 54, 52, 10, 35,100,101,102,105,110,
-101, 32, 84, 70, 95, 80, 73, 78, 52, 9, 32, 32, 32, 32, 9, 49, 50, 56, 10, 10, 35,101,110,100,105,102, 10, 32, 79, 67, 75, 33,
- 99,116, 32, 77, 86,101,114,116, 59, 32,115,116,114,117, 99,116, 32, 77, 69,100,103,101, 59, 32,115,116,114,117, 99,116, 32, 77,
- 70, 97, 99,101, 59, 32,115,116,114,117, 99,116, 32, 77, 67,111,108, 59, 32,115,116,114,117, 99,116, 32, 77, 83,116,105, 99,107,
-121, 59, 32,115,116,114,117, 99,116, 32, 77,101,115,104, 59, 32,115,116,114,117, 99,116, 32, 79, 99, 73,110,102,111, 59, 32,115,
-116,114,117, 99,116, 32, 77,117,108,116,105,114,101,115, 59, 32,115,116,114,117, 99,116, 32, 80, 97,114,116,105, 97,108, 86,105,
-115,105, 98,105,108,105,116,121, 59, 32,115,116,114,117, 99,116, 32, 69,100,105,116, 77,101,115,104, 59, 32, 32,116,121,112,101,
-100,101,102, 32,115,116,114,117, 99,116, 32, 77,101,115,104, 32,123, 32, 32, 73, 68, 32,105,100, 59, 32, 32, 32,115,116,114,117,
- 99,116, 32, 66,111,117,110,100, 66,111,120, 32, 42, 98, 98, 59, 32, 32, 32, 76,105,115,116, 66, 97,115,101, 32,101,102,102,101,
- 99,116, 59, 32, 32, 32, 32,115,116,114,117, 99,116, 32, 73,112,111, 32, 42,105,112,111, 59, 32, 32,115,116,114,117, 99,116, 32,
- 75,101,121, 32, 42,107,101,121, 59, 32, 32,115,192, 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, 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, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 98, 65, 99,116,
-105,111,110, 0, 98, 80,111,115,101, 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, 82, 78, 71, 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, 82, 97,100,105,111, 0, 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,
+116, 51, 0, 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,116,114,101,101, 0, 67,100,105,115, 0, 67,118,105, 0, 91, 51,
+ 93, 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,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,112,114,101,
+115,101,116,115, 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,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,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,107,101,121,109, 97,112,115, 0, 42,103,104,111,115,116,119,105,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,116,105,
+109,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, 42,112,116,114, 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,112,114,111,112,118, 97,108,117,101, 0,105,110, 97, 99,116,105,118,101, 0,109, 97,112,116,
+121,112,101, 0,107,101,121,109, 97,112, 0,110, 97,109,101,105,100, 91, 54, 52, 93, 0,115,112, 97, 99,101,105,100, 0,114,101,
+103,105,111,110,105,100, 0,105,115, 95,109,111,100, 97,108, 0, 42,105,116,101,109,115, 0, 42, 99,117,115,116,111,109,100, 97,
+116, 97, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0,109,118, 97,108, 91, 50, 93, 0,112,
+114,101,118,120, 0,112,114,101,118,121, 0,117,110,105, 99,111,100,101, 0, 97,115, 99,105,105, 0, 42,107,101,121,109, 97,112,
+ 95,105,100,110, 97,109,101, 0, 99,117,115,116,111,109, 0, 99,117,115,116,111,109,100, 97,116, 97,102,114,101,101, 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, 42,114,110, 97, 95,112, 97,116,
+104, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0,118,101,
+ 99, 91, 50, 93, 0, 42,102,112,116, 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,105,100,116,121,112,101, 0,
+116,101,109,112,108, 97,116,101,115, 0,103,114,111,117,112,109,111,100,101, 0,112, 97,116,104,115, 0,107,101,121,105,110,103,
+102,108, 97,103, 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, 99, 99,117,114, 97, 99,121, 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, 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, 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,118,101,
+108,111, 99,105,116,121, 91, 51, 93, 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,110,117,109,112,111,105,110,116,115, 0, 0, 0, 0, 84, 89, 80, 69,182, 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,105, 0,118,101, 99, 50,102, 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, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 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, 87, 97,118,101, 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, 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, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 32, 40, 49, 60, 60, 49,
+ 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 32, 40, 49, 60, 60, 50, 41, 32, 35,100,101,102,105,110,101,
+ 32, 77, 69, 95, 70, 71, 79, 78, 32, 40, 49, 60, 60, 51, 41, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69,
+ 82, 69, 78, 68, 69, 82, 32, 40, 49, 60, 60, 53, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68,
+ 71, 69, 32, 40, 49, 60, 60, 55, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 32, 40,
+ 49, 60, 60, 56, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 32, 40, 49, 60, 60, 57, 41, 32, 32, 32,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70,
+ 76, 73, 80, 86, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 32, 52, 32, 35,100,101,102,
+105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88,
+ 89, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 32, 51, 50, 32, 35,100,101,102,105,110,
+101, 32, 77, 69, 95, 80, 82, 79, 74, 89, 90, 32, 54, 52, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 32,
+ 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86,
+ 51, 86, 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 32, 52, 32, 35,100,101,102,105,110,101, 32,
+ 77, 69, 95, 86, 52, 86, 49, 32, 56, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 32, 49, 32, 35,
+100,101,102,105,110,101, 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 32, 50, 32, 32, 32, 35,100,101,102,105,110,101, 32, 77,
+ 69, 95, 86, 83, 69,108, 32, 48, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 32, 35,100,101,102,105,
+110,101, 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32,
+ 49, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 83, 69, 76, 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 32, 56, 32, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 83, 69, 76, 51, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 32, 51,
+ 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 32, 54, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84,
+ 70, 95, 68, 89, 78, 65, 77, 73, 67, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84,
+ 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83,
+ 72, 65, 82, 69, 68, 86, 69, 82, 84, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 32, 49, 54, 32,
+ 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 84, 73, 76, 69, 83, 32, 49, 50, 56, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65,
+ 82, 68, 32, 50, 53, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 32, 53, 49, 50, 32, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 32, 49, 48, 50, 52, 32, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 79, 66, 67, 79, 76, 32, 50, 48, 52, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65,
+ 82, 68, 50, 32, 52, 48, 57, 54, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 32, 56, 49, 57, 50,
+ 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 32, 49, 54, 51, 56, 52, 32, 32, 35,100,101,102,105,110,
+101, 32, 84, 70, 95, 83, 79, 76, 73, 68, 32, 48, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 32, 49, 32, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80,
+ 32, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 32, 51, 32, 32, 35,100,101,102,105,110,101, 32, 84,
+ 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69,
+ 67, 65, 84, 69, 68, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 32,
+ 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 32, 56, 32, 35,100,101,102,105,
+110,101, 32, 84, 70, 95, 80, 73, 78, 49, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 32, 51, 50,
+ 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80,
+ 73, 78, 52, 32, 49, 50, 56, 32, 35,101,110,100,105,102, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 59, 13, 10, 13, 10,
+116,121,112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 77,117,108,116,105,114,101,115, 32,123, 13, 10, 9, 76,105,115,116,
+ 66, 97,115,101, 32,108,101,118,101,108,115, 59, 13, 10, 9, 77, 86,101,114,116, 32, 42,118,101,114,116,115, 59, 13, 10, 13, 10,
+ 9,117,110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,108,101,118,101,108, 95, 99,111,117,110,116, 44, 32, 99,117,114,114,
+101,110,116, 44, 32,110,101,119,108,118,108, 44, 32,101,100,103,101,108,118,108, 44, 32,112,105,110,108,118,108, 44, 32,114,101,
+110,100,101,114,108,118,108, 59, 13, 10, 9,117,110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,117,115,101, 95, 99,111,108,
+ 44, 32,102,108, 97,103, 59, 13, 10, 13, 10, 9, 47, 42, 32, 83,112,101, 99,105, 97,108, 32,108,101,118,101,108, 32, 49, 32,100,
+ 97,116, 97, 32,116,104, 97,116, 32, 99, 97,110,110,111,116, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32,102,114,111,109,
+ 32,111,116,104,101,114, 32,108,101,118,101,108,115, 32, 42, 47, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,118,100,
+ 97,116, 97, 59, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,102,100, 97,116, 97, 59, 13, 10, 9,115,104,111,114,116,
+ 32, 42,101,100,103,101, 95,102,108, 97,103,115, 59, 13, 10, 9, 99,104, 97,114, 32, 42,101,100,103,101, 95, 99,114,101, 97,115,
+101,115, 59, 13, 10,125, 32, 77,117,108,116,105,114,101,115, 59, 13, 10, 13, 10, 47, 42, 42, 32, 69,110,100, 32, 77,117,108,116,
+105,114,101,115, 32, 42, 42, 47, 13, 10, 13, 10,116,121,112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 80, 97,114,116,105,
+ 97,108, 86,105,115,105, 98,105,108,105,116,121, 32,123, 13, 10, 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32, 42,118,
+101,114,116, 95,109, 97,112, 59, 32, 47, 42, 32,118,101,114,116, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61,
+ 32, 78,101,119, 32, 73,110,100,101,120, 32, 42, 47, 13, 10, 9,105,110,116, 32, 42,101,100,103,101, 95,109, 97,112, 59, 32, 47,
+ 42, 32,101,100,103,101, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,120,
+ 44, 32, 45, 49, 61, 32,104,105,100,100,101,110, 32, 42, 47, 13, 10, 9, 77, 70, 97, 99,101, 32, 42,111,108,100, 95,102, 97, 99,
+101,115, 59, 13, 10, 9, 77, 69,100,103,101, 32, 42,111,108,100, 95,101,100,103,101,115, 59, 13, 10, 9,117,110,115,105,103,110,
+101,100, 32,105,110,116, 32,116,111,116,102, 97, 99,101, 44, 32,116,111,116,101,100,103,101, 44, 32,116,111,116,118,101,114,116,
+ 44, 32,112, 97,100, 59, 13, 10,125, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 59, 13, 10, 13, 10,
+ 47, 42, 32,109,118,101,114,116, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 32, 42, 47, 13, 10, 35,100,
+101,102,105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 83, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77,
+ 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 77, 80, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 72, 73, 68, 69, 9,
+ 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 69, 82, 84, 95, 77, 69, 82, 71, 69, 68, 9, 9, 40, 49,
+ 60, 60, 54, 41, 13, 10, 13, 10, 47, 42, 32,109,101,100,103,101, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84,
+ 41, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 9, 9, 9, 40, 49, 60, 60, 49,
+ 41, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 9, 9, 9, 9, 40, 49, 60, 60, 50, 41, 13, 10, 35,100,
+101,102,105,110,101, 32, 77, 69, 95, 70, 71, 79, 78, 9, 9, 9, 9, 40, 49, 60, 60, 51, 41, 13, 10, 9, 9, 9, 9, 9, 9, 47,
+ 42, 32,114,101,115,101,114,118,101, 32, 49, 54, 32,102,111,114, 32, 77, 69, 95, 72, 73, 68, 69, 32, 42, 47, 13, 10, 35,100,101,
+102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82, 9, 9, 40, 49, 60, 60, 53, 41, 13, 10, 35,100,101,102,
+105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 9, 9, 40, 49, 60, 60, 55, 41, 13, 10, 35,100,101,102,105,110,
+101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 9, 9, 40, 49, 60, 60, 56, 41, 13, 10, 35,100,101,102,105,110,101, 32,
+ 77, 69, 95, 83, 72, 65, 82, 80, 9, 9, 9, 40, 49, 60, 60, 57, 41, 13, 10, 13, 10, 47, 42, 32,112,117,110,111, 32, 61, 32,118,
+101,114,116,101,120,110,111,114,109, 97,108, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 47, 42, 32,114,101,110,100,101,
+114, 32, 97,115,115,117,109,101,115, 32,102,108,105,112,115, 32,116,111, 32, 98,101, 32,111,114,100,101,114,101,100, 32,108,105,
+107,101, 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 9, 9, 49,
+ 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32,
+ 77, 69, 95, 70, 76, 73, 80, 86, 51, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 9,
+ 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 9, 9, 49, 54, 13, 10, 35,100,101,102,105,
+110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 9, 9, 51, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79,
+ 74, 89, 90, 9, 9, 54, 52, 13, 10, 13, 10, 47, 42, 32,101,100, 99,111,100,101, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13,
+ 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69,
+ 95, 86, 50, 86, 51, 9, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 9, 9, 9, 52, 13, 10,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95,
+ 86, 52, 86, 49, 9, 9, 9, 56, 13, 10, 13, 10, 47, 42, 32,102,108, 97,103, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77,
+ 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 9, 9, 9, 50, 13, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,102,108, 97,103, 32, 77, 69,
+ 95, 72, 73, 68, 69, 61, 61, 49, 54, 32,105,115, 32,117,115,101,100, 32,104,101,114,101, 32,116,111,111, 32, 42, 47, 32, 13, 10,
+ 47, 42, 32,109,115,101,108,101, 99,116, 45, 62,116,121,112,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95,
+ 86, 83, 69,108, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 13, 10, 35,100,101,102,105,
+110,101, 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,102,108, 97,103, 32,
+ 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 9, 49, 32, 47, 42, 32,117,115,101, 32, 77,
+ 70, 97, 99,101, 32,104,105,100,101, 32,102,108, 97,103, 32, 40, 97,102,116,101,114, 32, 50, 46, 52, 51, 41, 44, 32,115,104,111,
+117,108,100, 32, 98,101, 32, 97, 98,108,101, 32,116,111, 32,114,101,117,115,101, 32, 97,102,116,101,114, 32, 50, 46, 52, 52, 32,
+ 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 9, 50, 32, 47, 42, 32,100,101,112,114,101,
+ 99, 97,116,101,100, 33, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 49, 9, 9, 52, 13, 10, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 9, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69,
+ 76, 51, 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 9, 9, 51, 50, 13, 10, 35,100,101,
+102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 9, 9, 54, 52, 32, 47, 42, 32,117,110,117,115,101,100, 44, 32,115, 97,109,101,
+ 32, 97,115, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,109,
+111,100,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, 65, 77, 73, 67, 9, 9, 49, 13, 10, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84,
+ 70, 95, 84, 69, 88, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 86, 69, 82, 84,
+ 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 9, 9, 49, 54, 13, 10, 13, 10, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95,
+ 84, 73, 76, 69, 83, 9, 9, 49, 50, 56, 9, 9, 47, 42, 32,100,101,112,114,101, 99, 97,116,101,100, 32, 42, 47, 13, 10, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 9, 50, 53, 54, 13, 10, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 9, 9, 53, 49, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 73, 78, 86, 73,
+ 83, 73, 66, 76, 69, 9, 49, 48, 50, 52, 13, 10, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, 79, 76, 9, 9,
+ 50, 48, 52, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 9, 52, 48, 57, 54,
+ 9, 47, 42, 32,119,105,116,104, 32, 90, 32, 97,120,105,115, 32, 99,111,110,115,116,114, 97,105,110,116, 32, 42, 47, 13, 10, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 9, 9, 56, 49, 57, 50, 13, 10, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 66, 77, 70, 79, 78, 84, 9, 9, 49, 54, 51, 56, 52, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,116,
+114, 97,110,115,112, 44, 32,118, 97,108,117,101,115, 32, 49, 45, 52, 32, 97,114,101, 32,117,115,101,100, 32, 97,115, 32,102,108,
+ 97,103,115, 32,105,110, 32,116,104,101, 32, 71, 76, 44, 32, 87, 65, 82, 78, 73, 78, 71, 44, 32, 84, 70, 95, 83, 85, 66, 32, 99,
+ 97,110,116, 32,119,111,114,107, 32,119,105,116,104, 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84,
+ 70, 95, 83, 79, 76, 73, 68, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 9, 9, 49, 13, 10, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73,
+ 80, 9, 9, 52, 32, 47, 42, 32, 99,108,105,112,109, 97,112, 32, 97,108,112,104, 97, 47, 98,105,110, 97,114,121, 32, 97,108,112,
+104, 97, 32, 97,108,108, 32,111,114, 32,110,111,116,104,105,110,103, 33, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,115,117, 98, 32,
+105,115, 32,110,111,116, 32, 97,118, 97,105,108, 97, 98,108,101, 32,105,110, 32,116,104,101, 32,117,115,101,114, 32,105,110,116,
+101,114,102, 97, 99,101, 32, 97,110,121,109,111,114,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85,
+ 66, 9, 9, 51, 13, 10, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,117,110,119,114, 97,112, 32, 42, 47, 13, 10,
+ 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 9, 49, 13, 10, 35,100,101,102,105,110,
+101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 50, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68,
+ 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65,
+ 84, 69, 68, 52, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 49, 9, 9, 32, 32, 32, 32, 49, 54, 13,
+ 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 9, 9, 32, 32, 32, 32, 51, 50, 13, 10, 35,100,101,102,105,110,
+101, 32, 84, 70, 95, 80, 73, 78, 51, 9, 32, 32, 32, 9, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73,
+ 78, 52, 9, 32, 32, 32, 32, 9, 49, 50, 56, 13, 10, 13, 10, 35,101,110,100,105,102, 13, 10,104, 79, 67, 75, 33,109, 98,101,114,
+ 97, 2, 67, 3,191, 16, 8, 1,232, 80,100, 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, 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,
+ 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, 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, 82, 78, 71, 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, 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, 70,114, 97,109,105,110,
-103, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0,
- 66,114,117,115,104, 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, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 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, 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, 98, 71, 80,100, 97,116,
- 97, 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, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 83,101,
-108,101, 99,116, 80, 97,114, 97,109,115, 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,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, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 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, 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, 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, 72,101, 97,100,101,114, 0, 72,101, 97,100,101,114, 84,121,112,101, 0, 77,101,
-110,117, 0, 77,101,110,117, 84,121,112,101, 0, 83, 99,114, 65,114,101, 97, 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, 98, 83,111,117,110,100, 0,104,100, 97,117,100,105,111, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 69,100,105,116,105,110,
-103, 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, 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, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 68, 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, 70,114,101,101, 67, 97,109,101,114, 97, 0, 98, 83, 97,109,112,108,101, 0, 98, 83,111,117,110,100, 76,105,115,116,101,110,
-101,114, 0, 83,112, 97, 99,101, 83,111,117,110,100, 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, 80,111,115,101, 67,104, 97,110,110,101,108, 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, 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, 77,105,110, 77, 97,120, 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, 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, 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, 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, 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, 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, 72, 97,105,114, 75,101,
-121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,
-105, 99,108,101, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,
-108,101, 69,100,105,116, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 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,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, 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,109, 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, 82,101,112,111,114,116, 76,105,115,116, 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, 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, 68,114,105,118,101,114, 84, 97,114,103,101,116, 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, 0, 84, 76, 69, 78, 0, 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,
- 2, 40, 0, 0, 0, 32, 0,140, 3, 80, 0, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 40, 0, 16, 0, 24, 0, 40, 0,120,
- 0, 12, 0,136, 0, 36, 4,248, 1,124, 0, 0, 0, 0, 0, 0, 0,136, 1, 24, 1, 84, 0, 24, 3, 8, 0,168, 0, 0, 0,140,
- 0,132, 1,132, 1, 8, 0, 56, 2,112, 0, 76, 1, 60, 0, 0, 0,108, 0,104, 0,140, 0, 56, 0, 8, 0, 16, 1, 76, 0, 0,
- 0, 0, 0, 0, 1, 24, 0, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 24, 0, 76, 0, 32,
- 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 1, 0, 0, 32, 0, 12, 0, 0, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 56,
- 0, 72, 0, 92, 0,100, 0, 72, 0,100, 0,120, 0, 68, 0, 64, 0,112, 0, 64, 0,152, 0,156, 0, 64, 0, 96, 0,108, 0,188,
- 0,104, 0,184, 0, 56, 0, 76, 0, 0, 0,132, 0, 28, 0, 20, 0,104, 0, 0, 0, 64, 0, 0, 0, 0, 0, 68, 0, 8, 0, 8,
- 0,220, 0, 80, 1, 68, 0, 68, 0, 68, 0, 68, 0, 64, 1,164, 0,112, 0,108, 0,188, 0, 40, 0, 92, 0, 56, 0,112, 0,128,
- 0,152, 0,208, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,104, 0, 40, 0, 28, 0,176, 0,144, 0, 52, 0, 16, 0, 72, 3,224,
- 0, 56, 0, 16, 0, 80, 0, 16, 0,196, 0, 8, 0, 76, 0, 80, 0, 32, 0, 0, 0, 32, 1, 12, 0, 32, 0, 0, 0, 0, 0, 64,
- 2,152, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 40, 0,136, 0, 48, 0,136, 0,196, 0, 20, 0,224, 0,204,
- 0, 44, 0, 0, 0, 0, 0, 92, 0, 0, 0,248, 0, 12, 0, 12, 0,136, 0,184, 2,124, 2, 80, 0, 40, 0,168, 0,232, 2,136,
- 1, 16, 0, 24, 0,192, 0, 32, 1,176, 1, 16, 0, 16, 19, 8, 0, 56, 11, 40, 0, 20, 0, 24, 0,240, 0, 0, 0, 0, 0, 8,
- 0, 0, 0, 8, 0, 0, 0,112, 0, 0, 0,236, 0, 0, 0, 32, 0, 80, 0, 28, 0, 16, 0, 8, 0, 52, 0,160, 0,240, 1,168,
- 0,204, 1, 28, 0, 0, 0, 16, 2, 24, 0, 12, 0, 24, 0, 48, 0, 16, 0, 20, 0, 16, 0, 24, 1, 56, 0, 0, 0, 56, 0, 64,
- 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 68, 0, 76, 0, 80, 0, 60, 0,128,
- 0, 4, 0, 60, 0, 12, 0, 92, 0, 28, 0, 20, 0, 80, 0, 16, 0, 76, 0,104, 0, 84, 0, 28, 0, 96, 0, 60, 0, 56, 0,108,
- 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 40, 0, 0, 0, 68, 0,184, 0, 24, 1, 4, 0,120, 1,172, 0,104, 0,216, 0, 64,
- 0, 44, 0, 64, 0,116, 0, 60, 0,104, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12,
- 0,108, 0, 92, 0, 28, 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,208, 0, 0, 0, 0, 0, 16,
- 0, 40, 0, 28, 0, 12, 0, 12, 1, 16, 0, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 32,
- 0, 12, 0, 44, 0, 20, 0, 68, 0, 24, 0, 56, 0, 72, 0,252, 1,224, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172,
- 0,124, 0,144, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 88, 0, 0, 0, 0, 0, 88, 1, 20, 0, 16, 0, 20, 0, 8, 0, 8,
- 0, 24, 0, 20, 0, 88, 1, 24, 0, 16, 0, 68, 1, 0, 0, 20, 0,160, 0, 88, 0, 96, 0, 88, 0, 20, 0, 56, 83, 84, 82, 67,
- 0, 0, 1, 94, 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, 4, 0, 5,
- 0, 4, 0, 6, 0, 15, 0, 2, 0, 7, 0, 5, 0, 7, 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, 6,
- 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0, 2, 0, 43, 0, 4, 0, 44, 0, 31, 0, 6, 0, 32, 0, 45,
- 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 48, 0, 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1,
- 0, 34, 0, 49, 0, 35, 0, 50, 0, 24, 0, 51, 0, 24, 0, 52, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 53, 0, 2, 0, 54,
- 0, 2, 0, 55, 0, 2, 0, 56, 0, 2, 0, 19, 0, 2, 0, 57, 0, 7, 0, 11, 0, 7, 0, 12, 0, 4, 0, 58, 0, 7, 0, 59,
- 0, 7, 0, 60, 0, 7, 0, 61, 0, 31, 0, 62, 0, 36, 0, 7, 0, 27, 0, 31, 0, 12, 0, 63, 0, 24, 0, 64, 0, 2, 0, 46,
- 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61,
- 0, 2, 0, 17, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 19, 0, 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71,
- 0, 0, 0, 20, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, 38, 0, 13, 0, 27, 0, 31, 0, 39, 0, 75, 0, 37, 0, 76,
- 0, 0, 0, 77, 0, 4, 0, 78, 0, 7, 0, 61, 0, 12, 0, 79, 0, 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82,
- 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 5, 0, 27, 0, 84, 0, 2, 0, 85, 0, 2, 0, 86, 0, 2, 0, 87, 0, 4, 0, 37,
- 0, 41, 0, 6, 0, 41, 0, 0, 0, 41, 0, 1, 0, 0, 0, 88, 0, 0, 0, 89, 0, 4, 0, 23, 0, 4, 0, 90, 0, 42, 0, 10,
- 0, 42, 0, 0, 0, 42, 0, 1, 0, 4, 0, 91, 0, 4, 0, 92, 0, 4, 0, 93, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 94,
- 0, 0, 0, 95, 0, 0, 0, 96, 0, 43, 0, 15, 0, 27, 0, 31, 0, 0, 0, 97, 0, 4, 0, 94, 0, 4, 0, 98, 0, 12, 0, 99,
- 0, 41, 0,100, 0, 41, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 12, 0,104, 0, 0, 0,105, 0, 4, 0,106, 0, 4, 0,107,
- 0, 9, 0,108, 0, 8, 0,109, 0, 44, 0, 3, 0, 4, 0,110, 0, 4, 0,111, 0, 9, 0, 2, 0, 45, 0, 21, 0, 27, 0, 31,
- 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,116,
- 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0, 7, 0,121, 0, 7, 0,122, 0, 2, 0,123, 0, 2, 0,124,
- 0, 7, 0,125, 0, 36, 0, 80, 0, 40, 0,126, 0, 32, 0,127, 0, 46, 0, 13, 0, 4, 0,128, 0, 4, 0,129, 0, 4, 0,130,
- 0, 4, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0, 19, 0, 2, 0,134, 0, 2, 0,135, 0, 2, 0,136, 0, 2, 0,137,
- 0, 2, 0,138, 0, 47, 0,139, 0, 48, 0, 31, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,140, 0, 49, 0,141, 0, 50, 0,142,
- 0, 51, 0,143, 0, 2, 0,134, 0, 2, 0, 19, 0, 2, 0,144, 0, 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,145,
- 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, 2, 0,150, 0, 2, 0,151, 0, 4, 0,152, 0, 4, 0,153,
- 0, 44, 0,154, 0, 30, 0,155, 0, 7, 0,156, 0, 4, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 2, 0,161,
- 0, 7, 0,162, 0, 7, 0,163, 0, 52, 0, 31, 0, 2, 0,164, 0, 2, 0,165, 0, 2, 0,166, 0, 2, 0,167, 0, 32, 0,168,
- 0, 53, 0,169, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, 0, 0,173, 0, 0, 0,174, 0, 7, 0,175, 0, 7, 0,176,
- 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0, 2, 0,181, 0, 2, 0,182, 0, 2, 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, 57, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191,
- 0, 7, 0,192, 0, 7, 0,193, 0, 54, 0, 15, 0, 0, 0,194, 0, 9, 0,195, 0, 0, 0,196, 0, 0, 0,197, 0, 4, 0,198,
- 0, 4, 0,199, 0, 9, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 4, 0,204, 0, 9, 0,205, 0, 9, 0,206,
- 0, 4, 0,207, 0, 4, 0, 37, 0, 55, 0, 6, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,208, 0, 7, 0, 67,
- 0, 4, 0, 64, 0, 56, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,209, 0, 55, 0,203, 0, 57, 0, 17,
- 0, 32, 0,168, 0, 48, 0,210, 0, 58, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, 2, 0, 17, 0, 2, 0,214, 0, 7, 0,114,
- 0, 7, 0,115, 0, 7, 0,215, 0, 4, 0,216, 0, 2, 0,217, 0, 2, 0,218, 0, 4, 0,134, 0, 4, 0,145, 0, 2, 0,219,
- 0, 2, 0,220, 0, 53, 0, 57, 0, 27, 0, 31, 0, 39, 0, 75, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224,
- 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 7, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 7, 0,232,
- 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 7, 0,239, 0, 7, 0,240,
- 0, 2, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 2, 0,244, 0, 2, 0,245, 0, 2, 0,246, 0, 2, 0,247, 0, 2, 0, 19,
- 0, 2, 0, 17, 0, 2, 0,214, 0, 7, 0,248, 0, 7, 0,249, 0, 7, 0,250, 0, 7, 0,251, 0, 2, 0,252, 0, 2, 0,253,
- 0, 2, 0,254, 0, 2, 0,132, 0, 4, 0, 23, 0, 4, 0,129, 0, 4, 0,130, 0, 4, 0,131, 0, 7, 0,255, 0, 7, 1, 0,
- 0, 7, 0,190, 0, 46, 1, 1, 0, 59, 1, 2, 0, 36, 0, 80, 0, 48, 0,210, 0, 54, 1, 3, 0, 56, 1, 4, 0, 57, 1, 5,
- 0, 30, 0,155, 0, 0, 1, 6, 0, 0, 1, 7, 0, 60, 0, 8, 0, 7, 1, 8, 0, 7, 1, 9, 0, 7, 0,176, 0, 4, 0, 19,
- 0, 7, 1, 10, 0, 7, 1, 11, 0, 7, 1, 12, 0, 32, 0, 45, 0, 61, 0, 81, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 4, 1, 13, 0, 2, 0,178, 0, 2, 1, 14, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187,
- 0, 7, 1, 15, 0, 7, 1, 16, 0, 7, 1, 17, 0, 7, 1, 18, 0, 7, 1, 19, 0, 7, 1, 20, 0, 7, 1, 21, 0, 7, 1, 22,
- 0, 7, 1, 23, 0, 7, 1, 24, 0, 7, 1, 25, 0, 62, 1, 26, 0, 2, 1, 27, 0, 2, 0, 70, 0, 7, 0,114, 0, 7, 0,115,
- 0, 7, 1, 28, 0, 7, 1, 29, 0, 7, 1, 30, 0, 2, 1, 31, 0, 2, 1, 32, 0, 2, 1, 33, 0, 2, 1, 34, 0, 0, 1, 35,
- 0, 0, 1, 36, 0, 2, 1, 37, 0, 2, 1, 38, 0, 2, 1, 39, 0, 2, 1, 40, 0, 2, 1, 41, 0, 7, 1, 42, 0, 7, 1, 43,
- 0, 7, 1, 44, 0, 7, 1, 45, 0, 2, 1, 46, 0, 2, 0, 43, 0, 2, 1, 47, 0, 2, 1, 48, 0, 2, 1, 49, 0, 2, 1, 50,
- 0, 7, 1, 51, 0, 7, 1, 52, 0, 7, 1, 53, 0, 7, 1, 54, 0, 7, 1, 55, 0, 7, 1, 56, 0, 7, 1, 57, 0, 7, 1, 58,
- 0, 7, 1, 59, 0, 7, 1, 60, 0, 7, 1, 61, 0, 7, 1, 62, 0, 2, 1, 63, 0, 2, 1, 64, 0, 4, 1, 65, 0, 4, 1, 66,
- 0, 2, 1, 67, 0, 2, 1, 68, 0, 2, 1, 69, 0, 2, 1, 70, 0, 7, 1, 71, 0, 7, 1, 72, 0, 7, 1, 73, 0, 7, 1, 74,
- 0, 2, 1, 75, 0, 2, 1, 76, 0, 52, 1, 77, 0, 36, 0, 80, 0, 30, 0,155, 0, 40, 0,126, 0, 63, 0, 2, 0, 27, 0, 31,
- 0, 36, 0, 80, 0, 64, 0,130, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 1, 78, 0, 2, 0, 19, 0, 7, 0,184, 0, 7, 0,185,
- 0, 7, 0,186, 0, 7, 1, 79, 0, 7, 1, 80, 0, 7, 1, 81, 0, 7, 1, 82, 0, 7, 1, 83, 0, 7, 1, 84, 0, 7, 1, 85,
- 0, 7, 1, 86, 0, 7, 1, 87, 0, 7, 1, 88, 0, 7, 1, 89, 0, 7, 1, 90, 0, 7, 1, 91, 0, 7, 1, 92, 0, 7, 1, 93,
- 0, 7, 1, 94, 0, 7, 1, 95, 0, 7, 1, 96, 0, 7, 1, 97, 0, 7, 1, 98, 0, 7, 1, 99, 0, 7, 1,100, 0, 7, 1,101,
- 0, 7, 1,102, 0, 7, 1,103, 0, 7, 1,104, 0, 7, 1,105, 0, 2, 1,106, 0, 2, 1,107, 0, 2, 1,108, 0, 0, 1,109,
- 0, 0, 1,110, 0, 7, 1,111, 0, 7, 1,112, 0, 2, 1,113, 0, 2, 1,114, 0, 7, 1,115, 0, 7, 1,116, 0, 7, 1,117,
- 0, 7, 1,118, 0, 2, 1,119, 0, 2, 1,120, 0, 4, 1, 13, 0, 4, 1,121, 0, 2, 1,122, 0, 2, 1,123, 0, 2, 1,124,
- 0, 2, 1,125, 0, 7, 1,126, 0, 7, 1,127, 0, 7, 1,128, 0, 7, 1,129, 0, 7, 1,130, 0, 7, 1,131, 0, 7, 1,132,
- 0, 7, 1,133, 0, 7, 1,134, 0, 7, 1,135, 0, 0, 1,136, 0, 7, 1,137, 0, 7, 1,138, 0, 7, 1,139, 0, 4, 1,140,
- 0, 0, 1,141, 0, 0, 1, 47, 0, 0, 1,142, 0, 0, 1, 6, 0, 2, 1,143, 0, 2, 1,144, 0, 2, 1, 64, 0, 2, 1,145,
- 0, 2, 1,146, 0, 2, 1,147, 0, 7, 1,148, 0, 7, 1,149, 0, 7, 1,150, 0, 7, 1,151, 0, 7, 1,152, 0, 2, 0,164,
- 0, 2, 0,165, 0, 56, 1,153, 0, 56, 1,154, 0, 0, 1,155, 0, 0, 1,156, 0, 0, 1,157, 0, 0, 1,158, 0, 2, 1,159,
- 0, 2, 1,160, 0, 7, 1,161, 0, 7, 1,162, 0, 52, 1, 77, 0, 59, 1, 2, 0, 36, 0, 80, 0, 65, 1,163, 0, 30, 0,155,
- 0, 7, 1,164, 0, 7, 1,165, 0, 7, 1,166, 0, 7, 1,167, 0, 7, 1,168, 0, 2, 1,169, 0, 2, 0, 70, 0, 7, 1,170,
- 0, 7, 1,171, 0, 7, 1,172, 0, 7, 1,173, 0, 7, 1,174, 0, 7, 1,175, 0, 7, 1,176, 0, 7, 1,177, 0, 7, 1,178,
- 0, 2, 1,179, 0, 2, 1,180, 0, 7, 1,181, 0, 7, 1,182, 0, 7, 1,183, 0, 7, 1,184, 0, 7, 1,185, 0, 4, 1,186,
- 0, 4, 1,187, 0, 4, 1,188, 0, 40, 0,126, 0, 12, 1,189, 0, 66, 0, 4, 0, 27, 0, 31, 0, 0, 1,190, 0, 67, 0, 2,
- 0, 44, 0,154, 0, 68, 0, 26, 0, 68, 0, 0, 0, 68, 0, 1, 0, 69, 1,191, 0, 4, 1,192, 0, 4, 1,193, 0, 4, 1,194,
- 0, 4, 1,195, 0, 4, 1,196, 0, 4, 1,197, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 1,198, 0, 2, 1,199, 0, 7, 0, 5,
- 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 1,200, 0, 7, 1,201, 0, 7, 1,202, 0, 7, 1,203, 0, 7, 1,204, 0, 7, 1,205,
- 0, 7, 1,206, 0, 7, 0, 23, 0, 7, 1,207, 0, 7, 1,208, 0, 70, 0, 16, 0, 27, 0, 31, 0, 69, 1,191, 0, 12, 1,209,
- 0, 12, 1,210, 0, 12, 1,211, 0, 36, 0, 80, 0, 64, 1,212, 0, 2, 0, 19, 0, 2, 1,213, 0, 4, 0,177, 0, 7, 1, 8,
- 0, 7, 0,176, 0, 7, 1, 9, 0, 7, 1,214, 0, 7, 1,215, 0, 7, 1,216, 0, 35, 0, 11, 0, 7, 1,217, 0, 7, 1,218,
- 0, 7, 1,219, 0, 7, 1,220, 0, 2, 0, 55, 0, 0, 1,221, 0, 0, 1,222, 0, 0, 1,223, 0, 0, 1,224, 0, 0, 1,225,
- 0, 0, 1,226, 0, 34, 0, 7, 0, 7, 1,227, 0, 7, 1,218, 0, 7, 1,219, 0, 2, 1,223, 0, 2, 1,226, 0, 7, 1,220,
- 0, 7, 0, 37, 0, 71, 0, 21, 0, 71, 0, 0, 0, 71, 0, 1, 0, 2, 0, 17, 0, 2, 1,228, 0, 2, 1,226, 0, 2, 0, 19,
- 0, 2, 1,229, 0, 2, 1,230, 0, 2, 1,231, 0, 2, 1,232, 0, 2, 1,233, 0, 2, 1,234, 0, 2, 1,235, 0, 2, 1,236,
- 0, 7, 1,237, 0, 7, 1,238, 0, 34, 0, 49, 0, 35, 0, 50, 0, 2, 1,239, 0, 2, 1,240, 0, 4, 1,241, 0, 72, 0, 5,
- 0, 2, 1,242, 0, 2, 1,228, 0, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 70, 0, 73, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6,
- 0, 7, 0, 8, 0, 7, 1,243, 0, 74, 0, 62, 0, 27, 0, 31, 0, 39, 0, 75, 0, 69, 1,191, 0, 12, 1,244, 0, 12, 1,210,
- 0, 12, 1,245, 0, 32, 1,246, 0, 32, 1,247, 0, 32, 1,248, 0, 36, 0, 80, 0, 75, 1,249, 0, 38, 1,250, 0, 64, 1,212,
- 0, 12, 1,251, 0, 7, 1, 8, 0, 7, 0,176, 0, 7, 1, 9, 0, 4, 0,177, 0, 2, 1,252, 0, 2, 1,213, 0, 2, 0, 19,
- 0, 2, 1,253, 0, 7, 1,254, 0, 7, 1,255, 0, 7, 2, 0, 0, 2, 1,231, 0, 2, 1,232, 0, 2, 2, 1, 0, 2, 2, 2,
- 0, 4, 2, 3, 0, 34, 2, 4, 0, 2, 0, 23, 0, 2, 0, 99, 0, 2, 0, 67, 0, 2, 2, 5, 0, 7, 2, 6, 0, 7, 2, 7,
- 0, 7, 2, 8, 0, 7, 2, 9, 0, 7, 2, 10, 0, 7, 2, 11, 0, 7, 2, 12, 0, 7, 2, 13, 0, 7, 2, 14, 0, 7, 2, 15,
- 0, 0, 2, 16, 0, 76, 2, 17, 0, 77, 2, 18, 0, 0, 2, 19, 0, 66, 2, 20, 0, 66, 2, 21, 0, 66, 2, 22, 0, 66, 2, 23,
- 0, 4, 2, 24, 0, 4, 2, 25, 0, 4, 2, 26, 0, 4, 0, 37, 0, 73, 2, 27, 0, 4, 2, 28, 0, 4, 2, 29, 0, 72, 2, 30,
- 0, 72, 2, 31, 0, 78, 0, 39, 0, 27, 0, 31, 0, 69, 1,191, 0, 12, 2, 32, 0, 36, 0, 80, 0, 38, 1,250, 0, 64, 1,212,
- 0, 79, 2, 33, 0, 80, 2, 34, 0, 81, 2, 35, 0, 82, 2, 36, 0, 83, 2, 37, 0, 84, 2, 38, 0, 85, 2, 39, 0, 86, 2, 40,
- 0, 78, 2, 41, 0, 87, 2, 42, 0, 88, 2, 43, 0, 89, 2, 44, 0, 89, 2, 45, 0, 89, 2, 46, 0, 4, 0, 54, 0, 4, 2, 47,
- 0, 4, 2, 48, 0, 4, 2, 49, 0, 4, 2, 50, 0, 4, 0,177, 0, 7, 1, 8, 0, 7, 0,176, 0, 7, 1, 9, 0, 7, 2, 51,
- 0, 4, 2, 52, 0, 2, 2, 53, 0, 2, 0, 19, 0, 2, 2, 54, 0, 2, 2, 55, 0, 2, 1,213, 0, 2, 2, 56, 0, 90, 2, 57,
- 0, 91, 2, 58, 0, 81, 0, 8, 0, 9, 2, 59, 0, 7, 2, 60, 0, 4, 2, 61, 0, 0, 0, 19, 0, 0, 2, 62, 0, 2, 1, 13,
- 0, 2, 2, 63, 0, 2, 2, 64, 0, 79, 0, 8, 0, 4, 2, 65, 0, 4, 2, 66, 0, 4, 2, 67, 0, 4, 2, 68, 0, 0, 0, 37,
- 0, 0, 1,228, 0, 0, 2, 69, 0, 0, 0, 19, 0, 83, 0, 5, 0, 4, 2, 65, 0, 4, 2, 66, 0, 0, 2, 70, 0, 0, 2, 71,
- 0, 2, 0, 19, 0, 92, 0, 2, 0, 4, 2, 72, 0, 7, 1,219, 0, 84, 0, 3, 0, 92, 2, 73, 0, 4, 2, 74, 0, 4, 0, 19,
- 0, 82, 0, 6, 0, 7, 2, 75, 0, 2, 2, 76, 0, 0, 0, 19, 0, 0, 1,228, 0, 0, 2, 71, 0, 0, 2, 77, 0, 85, 0, 4,
- 0, 0, 0,208, 0, 0, 0,184, 0, 0, 0,185, 0, 0, 0,186, 0, 93, 0, 6, 0, 48, 2, 59, 0, 0, 0, 19, 0, 0, 2, 62,
- 0, 2, 1, 13, 0, 2, 2, 63, 0, 2, 2, 64, 0, 94, 0, 1, 0, 7, 2, 78, 0, 95, 0, 5, 0, 0, 0,208, 0, 0, 0,184,
- 0, 0, 0,185, 0, 0, 0,186, 0, 4, 0, 37, 0, 86, 0, 1, 0, 7, 2, 79, 0, 87, 0, 2, 0, 4, 2, 80, 0, 4, 0, 17,
- 0, 80, 0, 7, 0, 7, 2, 60, 0, 48, 2, 59, 0, 0, 0, 19, 0, 0, 2, 62, 0, 2, 1, 13, 0, 2, 2, 63, 0, 2, 2, 64,
- 0, 96, 0, 1, 0, 7, 2, 81, 0, 97, 0, 1, 0, 4, 2, 82, 0, 98, 0, 1, 0, 0, 2, 83, 0, 99, 0, 1, 0, 7, 2, 60,
- 0,100, 0, 3, 0, 4, 2, 84, 0, 0, 0, 96, 0, 7, 2, 85, 0,102, 0, 4, 0, 7, 0,208, 0, 7, 0,184, 0, 7, 0,185,
- 0, 7, 0,186, 0,103, 0, 1, 0,102, 2, 61, 0,104, 0, 5, 0, 4, 2, 86, 0, 4, 2, 87, 0, 0, 0, 19, 0, 0, 1,228,
- 0, 0, 0,183, 0,105, 0, 2, 0, 4, 2, 88, 0, 4, 2, 87, 0,106, 0, 10, 0,106, 0, 0, 0,106, 0, 1, 0,104, 2, 89,
- 0,103, 2, 90, 0,105, 2, 91, 0, 4, 0, 54, 0, 4, 2, 48, 0, 4, 2, 47, 0, 4, 0, 37, 0, 82, 2, 92, 0, 90, 0, 14,
- 0, 12, 2, 93, 0, 82, 2, 92, 0, 0, 2, 94, 0, 0, 2, 95, 0, 0, 2, 96, 0, 0, 2, 97, 0, 0, 2, 98, 0, 0, 2, 99,
- 0, 0, 2,100, 0, 0, 0, 19, 0, 89, 2, 44, 0, 89, 2, 46, 0, 2, 2,101, 0, 0, 2,102, 0, 91, 0, 8, 0, 4, 2,103,
- 0, 4, 2,104, 0, 79, 2,105, 0, 83, 2,106, 0, 4, 2, 48, 0, 4, 2, 47, 0, 4, 0, 54, 0, 4, 0, 37, 0,107, 0, 7,
- 0,107, 0, 0, 0,107, 0, 1, 0, 4, 0, 17, 0, 4, 1, 13, 0, 0, 0, 20, 0, 47, 0,139, 0, 0, 2,107, 0,108, 0, 7,
- 0,107, 2,108, 0, 2, 2,109, 0, 2, 2, 93, 0, 2, 2,110, 0, 2, 0, 94, 0, 9, 2,111, 0, 9, 2,112, 0,109, 0, 3,
- 0,107, 2,108, 0, 32, 0,168, 0, 0, 0, 20, 0,110, 0, 5, 0,107, 2,108, 0, 32, 0,168, 0, 0, 0, 20, 0, 2, 2,113,
- 0, 0, 2,114, 0,111, 0, 5, 0,107, 2,108, 0, 7, 0, 92, 0, 7, 2,115, 0, 4, 2,116, 0, 4, 2,117, 0,112, 0, 5,
- 0,107, 2,108, 0, 32, 2,118, 0, 0, 0, 72, 0, 4, 1, 13, 0, 4, 0, 19, 0,113, 0, 13, 0,107, 2,108, 0, 32, 2,119,
- 0, 32, 2,120, 0, 32, 2,121, 0, 32, 2,122, 0, 7, 2,123, 0, 7, 2,124, 0, 7, 2,115, 0, 7, 2,125, 0, 4, 2,126,
- 0, 4, 2,127, 0, 4, 0, 94, 0, 4, 2,128, 0,114, 0, 5, 0,107, 2,108, 0, 2, 2,129, 0, 2, 0, 19, 0, 7, 2,130,
- 0, 32, 2,131, 0,115, 0, 3, 0,107, 2,108, 0, 7, 2,132, 0, 4, 0, 94, 0,116, 0, 10, 0,107, 2,108, 0, 7, 2,133,
- 0, 4, 2,134, 0, 4, 0, 37, 0, 2, 0, 94, 0, 2, 2,135, 0, 2, 2,136, 0, 2, 2,137, 0, 7, 2,138, 0, 0, 2,139,
- 0,117, 0, 3, 0,107, 2,108, 0, 7, 0, 37, 0, 4, 0, 17, 0,118, 0, 11, 0,107, 2,108, 0, 53, 2,140, 0, 7, 2,141,
- 0, 4, 2,142, 0, 0, 2,139, 0, 7, 2,143, 0, 4, 2,144, 0, 32, 2,145, 0, 0, 2,146, 0, 4, 2,147, 0, 4, 0, 37,
- 0,119, 0, 10, 0,107, 2,108, 0, 32, 2,148, 0, 48, 2,149, 0, 4, 0, 94, 0, 4, 2,150, 0, 7, 2,151, 0, 7, 2,152,
- 0, 0, 2,146, 0, 4, 2,147, 0, 4, 0, 37, 0,120, 0, 3, 0,107, 2,108, 0, 7, 2,153, 0, 4, 2,154, 0,121, 0, 5,
- 0,107, 2,108, 0, 7, 2,155, 0, 0, 2,139, 0, 2, 0, 19, 0, 2, 2,156, 0,122, 0, 8, 0,107, 2,108, 0, 32, 0,168,
- 0, 7, 2,155, 0, 7, 1,220, 0, 7, 0,110, 0, 0, 2,139, 0, 2, 0, 19, 0, 2, 0, 17, 0,123, 0, 21, 0,107, 2,108,
- 0, 32, 2,157, 0, 0, 2,139, 0, 53, 2,140, 0, 32, 2,145, 0, 2, 0, 19, 0, 2, 0, 37, 0, 7, 2,158, 0, 7, 2,159,
- 0, 7, 2,160, 0, 7, 1,254, 0, 7, 2,161, 0, 7, 2,162, 0, 7, 2,163, 0, 7, 2,164, 0, 4, 2,144, 0, 4, 2,147,
- 0, 0, 2,146, 0, 7, 2,165, 0, 7, 2,166, 0, 7, 0, 43, 0,124, 0, 7, 0,107, 2,108, 0, 2, 2,167, 0, 2, 2,168,
- 0, 4, 0, 70, 0, 32, 0,168, 0, 7, 2,169, 0, 0, 2,139, 0,125, 0, 9, 0,107, 2,108, 0, 32, 0,168, 0, 7, 2,170,
- 0, 7, 2,171, 0, 7, 2,164, 0, 4, 2,172, 0, 4, 2,173, 0, 7, 2,174, 0, 0, 0, 20, 0,126, 0, 1, 0,107, 2,108,
- 0,127, 0, 6, 0,107, 2,108, 0, 47, 0,139, 0,128, 2,175, 0,129, 2,176, 0,130, 2,177, 0,131, 2,178, 0,132, 0, 14,
- 0,107, 2,108, 0, 82, 2,179, 0, 82, 2,180, 0, 82, 2,181, 0, 82, 2,182, 0, 82, 2,183, 0, 82, 2,184, 0, 79, 2,185,
- 0, 4, 2,186, 0, 4, 2,187, 0, 2, 2,188, 0, 2, 0, 37, 0, 7, 2,189, 0,133, 2,190, 0,134, 0, 3, 0,107, 2,108,
- 0,135, 2,191, 0,136, 2,190, 0,137, 0, 4, 0,107, 2,108, 0, 32, 0,168, 0, 4, 2,192, 0, 4, 0, 37, 0,138, 0, 2,
- 0, 4, 2,193, 0, 7, 1,219, 0,139, 0, 2, 0, 4, 0,130, 0, 4, 2,194, 0,140, 0, 20, 0,107, 2,108, 0, 32, 0,168,
- 0, 0, 2,139, 0, 2, 2,195, 0, 2, 2,196, 0, 2, 0, 19, 0, 2, 0, 37, 0, 7, 2,197, 0, 7, 2,198, 0, 4, 0, 54,
- 0, 4, 2,199, 0,139, 2,200, 0,138, 2,201, 0, 4, 2,202, 0, 4, 2,203, 0, 4, 2,204, 0, 4, 2,194, 0, 7, 2,205,
- 0, 7, 2,206, 0, 7, 2,207, 0,141, 0, 8, 0,107, 2,108, 0,142, 2,208, 0,135, 2,191, 0, 4, 2,209, 0, 4, 2,210,
- 0, 4, 2,211, 0, 2, 0, 19, 0, 2, 0, 57, 0,143, 0, 5, 0,107, 2,108, 0, 32, 0, 45, 0, 2, 2,212, 0, 2, 0, 19,
- 0, 2, 2,213, 0,144, 0, 5, 0,107, 2,108, 0, 4, 2,214, 0, 2, 0, 19, 0, 2, 2,215, 0, 7, 2,216, 0,145, 0, 7,
- 0,107, 2,108, 0, 82, 2,217, 0, 4, 2,218, 0, 0, 2,219, 0, 0, 2,220, 0, 0, 2,221, 0, 0, 2,222, 0,146, 0, 3,
- 0,107, 2,108, 0,147, 2,223, 0,131, 2,178, 0,148, 0, 10, 0,107, 2,108, 0, 32, 2,224, 0, 32, 2,225, 0, 0, 2,226,
- 0, 7, 2,227, 0, 2, 2,228, 0, 2, 2,229, 0, 0, 2,230, 0, 0, 2,231, 0, 0, 2,114, 0,149, 0, 9, 0,107, 2,108,
- 0, 32, 2,232, 0, 0, 2,226, 0, 7, 2,233, 0, 7, 2,234, 0, 0, 1, 13, 0, 0, 2,129, 0, 0, 2,235, 0, 0, 0, 37,
- 0,150, 0, 27, 0, 27, 0, 31, 0, 2, 1,229, 0, 2, 1,230, 0, 2, 2,236, 0, 2, 0, 19, 0, 2, 2,237, 0, 2, 2,238,
- 0, 2, 2,239, 0, 2, 0, 70, 0, 0, 2,240, 0, 0, 2,241, 0, 0, 2,242, 0, 0, 0, 17, 0, 4, 0, 37, 0, 7, 2,243,
- 0, 7, 2,244, 0, 7, 2,245, 0, 7, 2,246, 0, 7, 2,247, 0, 7, 2,248, 0, 34, 2,249, 0, 36, 0, 80, 0, 38, 1,250,
- 0, 84, 2, 38, 0, 7, 2,250, 0, 7, 2,251, 0,150, 2,252, 0,151, 0, 3, 0,151, 0, 0, 0,151, 0, 1, 0, 0, 0, 20,
- 0, 69, 0, 3, 0, 7, 2,253, 0, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,111, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17,
- 0, 2, 2,254, 0, 4, 2,255, 0, 4, 3, 0, 0, 4, 3, 1, 0, 0, 3, 2, 0, 32, 0, 38, 0, 32, 3, 3, 0, 32, 3, 4,
- 0, 32, 3, 5, 0, 32, 3, 6, 0, 36, 0, 80, 0, 75, 1,249, 0, 69, 1,191, 0,152, 3, 7, 0,152, 3, 8, 0,153, 3, 9,
- 0, 9, 0, 2, 0, 12, 3, 10, 0, 12, 2, 32, 0, 12, 1,210, 0, 12, 3, 11, 0, 12, 3, 12, 0, 64, 1,212, 0, 7, 1, 8,
- 0, 7, 3, 13, 0, 7, 3, 14, 0, 7, 0,176, 0, 7, 3, 15, 0, 7, 1, 9, 0, 7, 3, 16, 0, 7, 3, 17, 0, 7, 2,170,
- 0, 7, 3, 18, 0, 7, 0,212, 0, 4, 3, 19, 0, 2, 0, 19, 0, 2, 3, 20, 0, 2, 3, 21, 0, 2, 3, 22, 0, 2, 3, 23,
- 0, 2, 3, 24, 0, 2, 3, 25, 0, 2, 3, 26, 0, 2, 3, 27, 0, 2, 3, 28, 0, 2, 3, 29, 0, 2, 3, 30, 0, 4, 3, 31,
- 0, 4, 3, 32, 0, 4, 3, 33, 0, 4, 3, 34, 0, 7, 3, 35, 0, 7, 3, 36, 0, 7, 3, 37, 0, 7, 3, 38, 0, 7, 3, 39,
- 0, 7, 3, 40, 0, 7, 3, 41, 0, 7, 3, 42, 0, 7, 3, 43, 0, 7, 3, 44, 0, 7, 3, 45, 0, 7, 1,160, 0, 0, 3, 46,
- 0, 0, 3, 47, 0, 0, 1,213, 0, 0, 3, 48, 0, 0, 3, 49, 0, 0, 3, 50, 0, 7, 3, 51, 0, 7, 3, 52, 0, 40, 0,126,
- 0, 12, 3, 53, 0, 12, 3, 54, 0, 12, 3, 55, 0, 12, 3, 56, 0, 7, 3, 57, 0, 2, 2, 80, 0, 2, 3, 58, 0, 7, 2, 61,
- 0, 4, 3, 59, 0, 4, 3, 60, 0,154, 3, 61, 0, 2, 3, 62, 0, 2, 0,219, 0, 7, 3, 63, 0, 12, 3, 64, 0, 12, 3, 65,
- 0, 12, 3, 66, 0, 12, 3, 67, 0,155, 3, 68, 0,156, 3, 69, 0, 65, 3, 70, 0, 2, 3, 71, 0, 2, 3, 72, 0, 2, 3, 73,
- 0, 2, 3, 74, 0, 7, 2, 53, 0, 2, 3, 75, 0, 2, 3, 76, 0,147, 3, 77, 0,135, 3, 78, 0,135, 3, 79, 0, 4, 3, 80,
- 0, 4, 3, 81, 0, 4, 3, 82, 0, 4, 0, 70, 0, 12, 3, 83, 0,157, 0, 14, 0,157, 0, 0, 0,157, 0, 1, 0, 32, 0, 38,
- 0, 7, 2,170, 0, 7, 1, 10, 0, 7, 2,171, 0, 7, 2,164, 0, 0, 0, 20, 0, 4, 2,172, 0, 4, 2,173, 0, 4, 3, 84,
- 0, 2, 0, 17, 0, 2, 3, 85, 0, 7, 2,174, 0,155, 0, 36, 0, 2, 3, 86, 0, 2, 3, 87, 0, 2, 0, 19, 0, 2, 2,164,
- 0, 7, 3, 88, 0, 7, 3, 89, 0, 7, 3, 90, 0, 7, 3, 91, 0, 7, 3, 92, 0, 7, 3, 93, 0, 7, 3, 94, 0, 7, 3, 95,
- 0, 7, 3, 96, 0, 7, 3, 97, 0, 7, 3, 98, 0, 7, 3, 99, 0, 7, 3,100, 0, 7, 3,101, 0, 7, 3,102, 0, 7, 3,103,
- 0, 7, 3,104, 0, 7, 3,105, 0, 7, 3,106, 0, 7, 3,107, 0, 7, 3,108, 0, 7, 3,109, 0, 7, 3,110, 0, 7, 3,111,
- 0, 2, 3,112, 0, 2, 3,113, 0, 2, 3,114, 0, 2, 3,115, 0, 53, 0,169, 0,158, 3,116, 0, 7, 3,117, 0, 4, 0, 37,
- 0,131, 0, 5, 0, 4, 0, 19, 0, 4, 3,118, 0, 4, 3,119, 0, 4, 3,120, 0, 4, 3,121, 0,159, 0, 1, 0, 7, 1,227,
- 0,154, 0, 28, 0, 4, 0, 19, 0, 7, 3,122, 0, 7, 3,123, 0, 7, 3,124, 0, 4, 3,125, 0, 4, 3,126, 0, 4, 3,127,
- 0, 4, 3,128, 0, 7, 3,129, 0, 7, 3,130, 0, 7, 3,131, 0, 7, 3,132, 0, 7, 3,133, 0, 7, 3,134, 0, 7, 3,135,
- 0, 7, 3,136, 0, 7, 3,137, 0, 7, 3,138, 0, 7, 3,139, 0, 7, 3,140, 0, 7, 3,141, 0, 7, 3,142, 0, 7, 3,143,
- 0, 7, 3,144, 0, 7, 3,145, 0, 7, 3,146, 0, 4, 3,147, 0, 4, 3,148, 0,156, 0, 44, 0,142, 3,149, 0, 4, 3,150,
- 0, 4, 3,151, 0,160, 3,152, 0,161, 3,153, 0, 7, 0, 37, 0, 7, 3,154, 0, 7, 3,155, 0, 7, 3,156, 0, 7, 3,157,
- 0, 7, 3,158, 0, 7, 3,159, 0, 7, 3,160, 0, 7, 3,161, 0, 7, 3,162, 0, 7, 3,163, 0, 2, 3,164, 0, 2, 3,165,
- 0, 7, 3,166, 0, 7, 3,167, 0, 4, 0,131, 0, 4, 3,168, 0, 4, 3,169, 0, 2, 3,170, 0, 2, 3,171, 0,159, 3,172,
- 0, 4, 3,173, 0, 4, 0, 82, 0, 7, 3,174, 0, 7, 3,175, 0, 7, 3,176, 0, 7, 3,177, 0, 2, 3,178, 0, 2, 3,179,
- 0, 2, 3,180, 0, 2, 3,181, 0, 2, 3,182, 0, 2, 3,183, 0, 2, 3,184, 0, 2, 3,185, 0,162, 3,186, 0, 7, 3,187,
- 0, 7, 3,188, 0,131, 3,189, 0,147, 0, 48, 0, 2, 0, 17, 0, 2, 3,190, 0, 2, 3,191, 0, 2, 3,192, 0, 7, 3,193,
- 0, 2, 3,194, 0, 2, 3,195, 0, 7, 3,196, 0, 2, 3,197, 0, 2, 3,198, 0, 7, 3,199, 0, 7, 3,200, 0, 7, 3,201,
- 0, 7, 3,202, 0, 7, 3,203, 0, 7, 3,204, 0, 4, 3,205, 0, 7, 3,206, 0, 7, 3,207, 0, 7, 3,208, 0, 78, 3,209,
- 0, 78, 3,210, 0, 78, 3,211, 0, 0, 3,212, 0, 7, 3,213, 0, 7, 3,214, 0, 36, 0, 80, 0, 2, 3,215, 0, 0, 3,216,
- 0, 0, 3,217, 0, 7, 3,218, 0, 4, 3,219, 0, 7, 3,220, 0, 7, 3,221, 0, 4, 3,222, 0, 4, 0, 19, 0, 7, 3,223,
- 0, 7, 3,224, 0, 7, 3,225, 0, 82, 3,226, 0, 7, 3,227, 0, 7, 3,228, 0, 7, 3,229, 0, 7, 3,230, 0, 7, 3,231,
- 0, 7, 3,232, 0, 7, 3,233, 0, 4, 3,234, 0,163, 0, 68, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,178, 0, 2, 1, 14,
- 0, 2, 1, 47, 0, 2, 3,235, 0, 7, 3,236, 0, 7, 3,237, 0, 7, 3,238, 0, 7, 3,239, 0, 7, 3,240, 0, 7, 3,241,
- 0, 7, 3,242, 0, 7, 3,243, 0, 7, 1, 85, 0, 7, 1, 87, 0, 7, 1, 86, 0, 7, 3,244, 0, 4, 3,245, 0, 7, 3,246,
- 0, 7, 3,247, 0, 7, 3,248, 0, 7, 3,249, 0, 7, 3,250, 0, 7, 3,251, 0, 7, 3,252, 0, 2, 3,253, 0, 2, 1, 13,
- 0, 2, 3,254, 0, 2, 3,255, 0, 7, 4, 0, 0, 7, 4, 1, 0, 7, 4, 2, 0, 7, 4, 3, 0, 7, 4, 4, 0, 7, 4, 5,
- 0, 7, 4, 6, 0, 7, 4, 7, 0, 7, 4, 8, 0, 7, 4, 9, 0, 7, 4, 10, 0, 7, 4, 11, 0, 2, 4, 12, 0, 2, 4, 13,
- 0, 2, 4, 14, 0, 2, 4, 15, 0, 7, 4, 16, 0, 7, 4, 17, 0, 7, 4, 18, 0, 7, 4, 19, 0, 2, 4, 20, 0, 2, 4, 21,
- 0, 2, 4, 22, 0, 2, 4, 23, 0, 7, 4, 24, 0, 7, 4, 25, 0, 7, 4, 26, 0, 7, 4, 27, 0, 2, 4, 28, 0, 2, 4, 29,
- 0, 2, 4, 30, 0, 2, 0, 19, 0, 7, 4, 31, 0, 7, 4, 32, 0, 36, 0, 80, 0, 52, 1, 77, 0, 30, 0,155, 0, 40, 0,126,
- 0,164, 0, 16, 0, 2, 4, 33, 0, 2, 4, 34, 0, 2, 4, 35, 0, 2, 0, 19, 0, 2, 4, 36, 0, 2, 4, 37, 0, 2, 4, 38,
- 0, 2, 4, 39, 0, 2, 4, 40, 0, 2, 4, 41, 0, 2, 4, 42, 0, 2, 4, 43, 0, 4, 4, 44, 0, 7, 4, 45, 0, 7, 4, 46,
- 0, 7, 4, 47, 0,165, 0, 8, 0,165, 0, 0, 0,165, 0, 1, 0, 4, 3, 19, 0, 4, 4, 48, 0, 4, 0, 19, 0, 2, 4, 49,
- 0, 2, 4, 50, 0, 32, 0,168, 0,166, 0, 13, 0, 9, 4, 51, 0, 9, 4, 52, 0, 4, 4, 53, 0, 4, 4, 54, 0, 4, 4, 55,
- 0, 4, 4, 56, 0, 4, 4, 57, 0, 4, 4, 58, 0, 4, 4, 59, 0, 4, 4, 60, 0, 4, 4, 61, 0, 4, 0, 37, 0, 0, 4, 62,
- 0,167, 0, 5, 0, 9, 4, 63, 0, 9, 4, 64, 0, 4, 4, 65, 0, 4, 0, 70, 0, 0, 4, 66, 0,168, 0, 13, 0, 4, 0, 17,
- 0, 4, 4, 67, 0, 4, 4, 68, 0, 4, 4, 69, 0, 4, 4, 70, 0, 4, 4, 71, 0, 4, 0, 94, 0, 4, 4, 72, 0, 4, 4, 73,
- 0, 4, 4, 74, 0, 4, 4, 75, 0, 4, 4, 76, 0, 26, 0, 30, 0,169, 0, 4, 0, 4, 4, 77, 0, 7, 4, 78, 0, 2, 0, 19,
- 0, 2, 2, 77, 0,170, 0, 11, 0,170, 0, 0, 0,170, 0, 1, 0, 0, 0, 20, 0, 64, 4, 79, 0, 65, 4, 80, 0, 4, 3, 19,
- 0, 4, 4, 81, 0, 4, 4, 82, 0, 4, 0, 37, 0, 4, 4, 83, 0, 4, 4, 84, 0,171, 0,131, 0,166, 4, 85, 0,167, 4, 86,
- 0,168, 4, 87, 0,169, 4, 88, 0, 4, 4, 89, 0, 4, 0,131, 0, 4, 3,168, 0, 4, 4, 90, 0, 4, 4, 91, 0, 4, 4, 92,
- 0, 4, 4, 93, 0, 2, 0, 19, 0, 2, 4, 94, 0, 7, 3, 36, 0, 7, 4, 95, 0, 7, 4, 96, 0, 7, 4, 97, 0, 7, 4, 98,
- 0, 7, 4, 99, 0, 2, 4,100, 0, 2, 4,101, 0, 2, 4,102, 0, 2, 4,103, 0, 2, 0,218, 0, 2, 4,104, 0, 2, 4,105,
- 0, 2, 3,115, 0, 2, 4,106, 0, 2, 4,107, 0, 2, 1, 34, 0, 2, 0,110, 0, 2, 4,108, 0, 2, 4,109, 0, 2, 4,110,
- 0, 2, 4,111, 0, 2, 4,112, 0, 2, 4,113, 0, 2, 4,114, 0, 2, 4,115, 0, 2, 4,116, 0, 2, 1, 35, 0, 2, 4,117,
- 0, 2, 4,118, 0, 2, 4,119, 0, 2, 4,120, 0, 4, 4,121, 0, 4, 1, 13, 0, 2, 4,122, 0, 2, 4,123, 0, 2, 4,124,
- 0, 2, 4,125, 0, 2, 4,126, 0, 2, 4,127, 0, 24, 4,128, 0, 24, 4,129, 0, 23, 4,130, 0, 12, 4,131, 0, 2, 4,132,
- 0, 2, 0, 37, 0, 7, 4,133, 0, 7, 4,134, 0, 7, 4,135, 0, 7, 4,136, 0, 7, 4,137, 0, 7, 4,138, 0, 7, 4,139,
- 0, 7, 4,140, 0, 7, 4,141, 0, 2, 4,142, 0, 2, 4,143, 0, 2, 4,144, 0, 2, 4,145, 0, 2, 4,146, 0, 2, 4,147,
- 0, 7, 4,148, 0, 7, 4,149, 0, 7, 4,150, 0, 2, 4,151, 0, 2, 4,152, 0, 2, 4,153, 0, 2, 4,154, 0, 2, 4,155,
- 0, 2, 4,156, 0, 2, 4,157, 0, 2, 4,158, 0, 2, 4,159, 0, 2, 4,160, 0, 4, 4,161, 0, 4, 4,162, 0, 4, 4,163,
- 0, 4, 4,164, 0, 4, 4,165, 0, 7, 4,166, 0, 4, 4,167, 0, 4, 4,168, 0, 4, 4,169, 0, 4, 4,170, 0, 7, 4,171,
- 0, 7, 4,172, 0, 7, 4,173, 0, 7, 4,174, 0, 7, 4,175, 0, 7, 4,176, 0, 7, 4,177, 0, 7, 4,178, 0, 7, 4,179,
- 0, 0, 4,180, 0, 0, 4,181, 0, 4, 4,182, 0, 2, 4,183, 0, 2, 1,160, 0, 0, 4,184, 0, 7, 4,185, 0, 7, 4,186,
- 0, 4, 4,187, 0, 4, 4,188, 0, 7, 4,189, 0, 7, 4,190, 0, 2, 4,191, 0, 2, 4,192, 0, 7, 4,193, 0, 2, 4,194,
- 0, 2, 4,195, 0, 4, 4,196, 0, 2, 4,197, 0, 2, 4,198, 0, 2, 4,199, 0, 2, 4,200, 0, 7, 4,201, 0, 7, 4,202,
- 0, 43, 4,203, 0,172, 0, 9, 0,172, 0, 0, 0,172, 0, 1, 0, 0, 0, 20, 0, 2, 4,204, 0, 2, 4,205, 0, 2, 4,206,
- 0, 2, 0, 43, 0, 7, 4,207, 0, 7, 0, 70, 0,173, 0, 5, 0, 7, 4,208, 0, 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70,
- 0, 0, 1,160, 0,174, 0, 5, 0,174, 0, 0, 0,174, 0, 1, 0, 4, 4,209, 0, 0, 4,210, 0, 4, 0, 19, 0,175, 0, 6,
- 0,176, 4,211, 0, 2, 0, 19, 0, 2, 4,212, 0, 2, 4,213, 0, 2, 4,214, 0, 9, 4,215, 0,177, 0, 4, 0, 2, 0,110,
- 0, 2, 2,141, 0, 2, 4,216, 0, 2, 4,217, 0,178, 0, 8, 0, 2, 0, 19, 0, 2, 4,218, 0, 2, 4,219, 0, 2, 4,220,
- 0,177, 4,221, 0, 9, 4,215, 0, 7, 4,222, 0, 4, 4,223, 0,179, 0, 4, 0,179, 0, 0, 0,179, 0, 1, 0, 0, 4,224,
- 0, 7, 4,225, 0,180, 0, 8, 0,181, 4,226, 0,176, 4,211, 0, 7, 4,227, 0, 4, 0, 94, 0, 0, 4,228, 0, 0, 4,229,
- 0, 0, 4,230, 0, 0, 4,231, 0,182, 0, 9, 0,176, 4,211, 0, 7, 4, 47, 0, 7, 4,232, 0, 2, 1, 13, 0, 2, 0, 19,
- 0, 4, 0, 36, 0, 4, 4,233, 0, 84, 4,234, 0, 9, 4,215, 0,183, 0, 64, 0,182, 4,235, 0,182, 4,236, 0,180, 4,237,
- 0, 2, 4,238, 0, 2, 4,239, 0, 7, 4,240, 0, 7, 4,241, 0, 2, 4,216, 0, 2, 4,242, 0, 7, 4,243, 0, 7, 4,244,
- 0, 2, 4,245, 0, 2, 4,246, 0, 2, 4,247, 0, 2, 4,248, 0, 7, 4,249, 0, 7, 4,250, 0, 7, 4,251, 0, 7, 0, 37,
- 0, 2, 4,252, 0, 2, 4,253, 0, 2, 4,254, 0, 2, 4,255, 0, 2, 5, 0, 0, 2, 5, 1, 0, 2, 5, 2, 0,175, 5, 3,
- 0,178, 5, 4, 0, 7, 5, 5, 0, 7, 5, 6, 0, 7, 5, 7, 0, 0, 5, 8, 0, 0, 5, 9, 0, 0, 5, 10, 0, 0, 5, 11,
- 0, 0, 5, 12, 0, 0, 5, 13, 0, 2, 5, 14, 0, 7, 5, 15, 0, 7, 5, 16, 0, 7, 5, 17, 0, 7, 5, 18, 0, 7, 5, 19,
- 0, 7, 5, 20, 0, 7, 5, 21, 0, 7, 5, 22, 0, 7, 5, 23, 0, 7, 5, 24, 0, 2, 5, 25, 0, 0, 5, 26, 0, 0, 5, 27,
- 0, 0, 5, 28, 0, 0, 5, 29, 0, 4, 5, 30, 0, 32, 5, 31, 0, 0, 5, 32, 0, 0, 5, 33, 0, 0, 5, 34, 0, 0, 5, 35,
- 0, 0, 5, 36, 0, 0, 5, 37, 0, 0, 5, 38, 0, 0, 5, 39, 0, 0, 5, 40, 0,184, 0, 8, 0, 4, 5, 41, 0, 4, 5, 42,
- 0, 4, 5, 43, 0, 4, 5, 44, 0, 4, 5, 45, 0, 4, 5, 46, 0, 4, 0, 54, 0, 4, 2, 48, 0, 47, 0, 46, 0, 27, 0, 31,
- 0, 39, 0, 75, 0, 32, 5, 47, 0,163, 5, 48, 0, 47, 5, 49, 0, 48, 0,210, 0, 12, 5, 50, 0,165, 5, 51, 0, 32, 5, 52,
- 0, 7, 5, 53, 0, 7, 5, 54, 0, 7, 5, 55, 0, 7, 5, 56, 0, 4, 3, 19, 0, 7, 5, 57, 0, 2, 5, 58, 0, 2, 5, 59,
- 0, 2, 5, 60, 0, 2, 5, 61, 0, 2, 5, 62, 0, 2, 0, 19, 0, 2, 5, 63, 0, 2, 1, 6, 0, 59, 1, 2, 0, 9, 5, 64,
- 0,164, 5, 65, 0,173, 5, 66, 0,183, 5, 67, 0,185, 5, 68, 0,171, 0,184, 0,169, 4, 88, 0, 40, 0,126, 0, 12, 0,104,
- 0, 12, 5, 69, 0, 2, 5, 70, 0, 2, 5, 71, 0, 2, 5, 72, 0, 2, 5, 73, 0,186, 5, 74, 0, 2, 5, 75, 0, 2, 5, 76,
- 0, 2, 1, 64, 0, 2, 0,219, 0, 4, 5, 77, 0, 4, 5, 78, 0, 12, 5, 79, 0,187, 0, 9, 0, 48, 0,210, 0, 46, 1, 1,
- 0, 7, 2, 13, 0, 7, 2, 14, 0, 7, 0,110, 0, 7, 5, 80, 0, 7, 5, 81, 0, 2, 5, 82, 0, 2, 5, 83, 0,188, 0, 34,
- 0, 7, 5, 84, 0, 7, 5, 85, 0, 7, 5, 86, 0, 7, 5, 87, 0, 7, 5, 88, 0, 7, 5, 89, 0, 7, 5, 90, 0, 7, 5, 91,
- 0, 7, 1, 20, 0, 7, 5, 92, 0, 7, 5, 93, 0, 7, 5, 94, 0, 7, 5, 95, 0, 7, 0,175, 0, 2, 5, 96, 0, 2, 5, 97,
- 0, 4, 5, 98, 0, 2, 5, 99, 0, 2, 5,100, 0, 2, 5,101, 0, 2, 5,102, 0, 7, 5,103, 0, 69, 5,104, 0,189, 5,105,
- 0,188, 5,106, 0,190, 5,107, 0,191, 5,108, 0,192, 5,109, 0,193, 5,110, 0,194, 5,111, 0, 7, 5,112, 0, 2, 5,113,
- 0, 2, 5,114, 0, 4, 1,160, 0,195, 0, 54, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117,
- 0, 2, 5,118, 0, 7, 5, 91, 0, 7, 1, 20, 0, 7, 0, 43, 0, 4, 5,119, 0, 2, 5,101, 0, 2, 5,102, 0, 32, 5, 47,
- 0, 32, 5,120, 0,187, 5,121, 0,195, 5,106, 0, 0, 5,122, 0, 4, 3, 19, 0, 4, 5,123, 0, 2, 4, 35, 0, 2, 5,124,
- 0, 2, 5,125, 0, 2, 5,126, 0, 2, 1,160, 0, 2, 0, 19, 0, 2, 5,127, 0, 2, 5,128, 0, 7, 0,116, 0, 7, 5,129,
- 0, 7, 5,130, 0, 7, 5,131, 0, 7, 5,132, 0, 7, 5,133, 0, 7, 0,175, 0, 7, 5, 53, 0, 2, 5,134, 0, 2, 1, 64,
- 0, 2, 5,135, 0, 2, 5,136, 0, 2, 5,137, 0, 2, 5,138, 0, 2, 5,139, 0, 2, 5,140, 0, 2, 5,141, 0, 2, 5,142,
- 0, 4, 5,143, 0, 12, 5,144, 0, 2, 5,145, 0, 2, 2, 62, 0, 2, 5,146, 0, 0, 5,147, 0, 0, 5,148, 0, 9, 5,149,
- 0,189, 5,105, 0,197, 0, 22, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 5,150, 0, 23, 5,151, 0, 23, 5,152, 0, 7, 5,153,
- 0, 7, 5,154, 0, 7, 5,155, 0, 7, 5,156, 0, 2, 5,157, 0, 2, 5,158, 0, 2, 5,159, 0, 2, 5,160, 0, 2, 5,161,
- 0, 2, 0, 19, 0, 2, 5,162, 0, 2, 5,163, 0, 2, 5,164, 0, 2, 5,165, 0, 2, 5,166, 0, 2, 5,126, 0, 7, 5,167,
- 0,196, 0, 6, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,198, 0, 8,
- 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,199, 5,168, 0, 47, 0,139,
- 0,200, 0, 14, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169,
- 0,201, 5,170, 0, 12, 5,171, 0, 2, 1, 13, 0, 2, 0, 19, 0, 2, 5,172, 0, 0, 5,173, 0, 0, 5,174, 0,202, 0, 28,
- 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,190, 5,107, 0, 2, 5,175,
- 0, 2, 5,176, 0, 2, 5,162, 0, 2, 5,177, 0,197, 5,169, 0, 2, 5,178, 0, 2, 0,138, 0, 2, 5,173, 0, 2, 5,179,
- 0, 9, 5,180, 0, 2, 5,181, 0, 0, 5,182, 0, 0, 5,183, 0, 2, 5,184, 0, 2, 5,185, 0, 2, 3, 28, 0, 2, 5,186,
- 0, 2, 5,187, 0, 0, 0, 19, 0, 0, 1, 47, 0, 0, 5,188, 0,203, 0, 16, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115,
- 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169, 0, 7, 2, 13, 0, 7, 2, 14, 0, 2, 5,178, 0, 2, 0, 37,
- 0, 2, 5,189, 0, 2, 5,190, 0, 4, 0, 19, 0, 7, 5, 80, 0,189, 5,105, 0,204, 0, 10, 0,196, 0, 0, 0,196, 0, 1,
- 0, 12, 5,115, 0, 4, 5,116, 0, 4, 0, 37, 0,205, 5,191, 0,206, 5,192, 0,207, 5,193, 0,194, 5,194, 0,208, 5,195,
- 0,209, 0, 17, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169,
- 0, 12, 5,196, 0,210, 5,197, 0, 0, 5,198, 0,211, 5,199, 0, 4, 5,200, 0, 4, 5,201, 0, 2, 0, 19, 0, 2, 5,202,
- 0, 2, 5,203, 0, 2, 0, 37, 0,212, 0, 29, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117,
- 0, 2, 5,118, 0, 48, 2,149, 0, 46, 1, 1, 0, 62, 5,204, 0, 2, 0,138, 0, 2, 5,205, 0, 2, 0, 70, 0, 2, 5,206,
- 0, 4, 0, 19, 0, 2, 5,207, 0, 2, 5,174, 0, 2, 5,173, 0, 2, 1,160, 0, 0, 5,208, 0, 0, 5,209, 0, 0, 5,210,
- 0, 0, 0, 37, 0, 7, 2, 13, 0, 7, 2, 14, 0, 7, 5, 80, 0, 7, 1, 64, 0, 7, 5,211, 0, 7, 5,212, 0,189, 5,105,
- 0,213, 0, 11, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0, 2, 0,138,
- 0, 2, 5,174, 0, 2, 5,172, 0, 2, 0, 19, 0,197, 5,169, 0,214, 0, 24, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115,
- 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0, 43, 5,213, 0, 4, 5,214, 0, 4, 5,215, 0, 2, 0, 94, 0, 2, 0,138,
- 0, 4, 5,216, 0, 4, 5,217, 0, 4, 5,218, 0, 4, 5,219, 0, 4, 5,220, 0, 4, 5,221, 0, 7, 5,222, 0, 23, 5,223,
- 0, 23, 5,224, 0, 4, 5,225, 0, 4, 5,226, 0, 0, 5,227, 0, 0, 5,228, 0,215, 0, 10, 0, 27, 0, 31, 0, 9, 5,229,
- 0, 9, 5,230, 0, 9, 5,231, 0, 9, 5,232, 0, 9, 5,233, 0, 4, 0, 94, 0, 4, 5,234, 0, 0, 5,235, 0, 0, 5,236,
- 0,216, 0, 10, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0,215, 5,237, 0, 2, 0, 94,
- 0, 2, 0,138, 0, 4, 0, 43, 0, 9, 5,238, 0,217, 0, 8, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116,
- 0, 7, 5,117, 0,197, 5,169, 0, 4, 0, 19, 0, 4, 5,239, 0,218, 0, 22, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115,
- 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169, 0, 27, 5,240, 0, 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,138,
- 0, 7, 5,241, 0, 9, 5,242, 0, 7, 2, 13, 0, 7, 2, 14, 0, 7, 5,243, 0, 7, 5,244, 0, 59, 1, 2, 0, 59, 5,245,
- 0, 4, 5,246, 0, 4, 0, 37, 0,189, 5,105, 0,219, 0, 42, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116,
- 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169, 0,206, 5,192, 0, 0, 5,247, 0, 0, 5,248, 0, 0, 5,249, 0, 2, 0, 17,
- 0, 2, 5,250, 0, 2, 0, 19, 0, 2, 5,251, 0, 9, 5,242, 0, 4, 5,252, 0, 4, 5,253, 0, 4, 5,254, 0, 4, 5,255,
- 0, 23, 6, 0, 0, 23, 6, 1, 0, 7, 6, 2, 0, 7, 6, 3, 0, 7, 6, 4, 0, 7, 5,241, 0, 2, 6, 5, 0, 2, 0,209,
- 0, 2, 1,103, 0, 2, 6, 6, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 6, 7, 0, 2, 6, 8, 0, 9, 6, 9, 0, 9, 6, 10,
- 0, 9, 6, 11, 0, 9, 6, 12, 0, 9, 6, 13, 0, 2, 6, 14, 0, 0, 6, 15, 0, 58, 6, 16, 0,220, 0, 7, 0,220, 0, 0,
- 0,220, 0, 1, 0, 0, 6, 17, 0, 2, 6, 18, 0, 2, 6, 19, 0, 2, 6, 20, 0, 2, 0, 37, 0,221, 0, 10, 0, 2, 6, 19,
- 0, 2, 6, 21, 0, 2, 6, 22, 0, 2, 6, 23, 0, 2, 6, 24, 0, 2, 6, 25, 0, 2, 6, 26, 0, 2, 5,162, 0, 7, 6, 27,
- 0, 7, 6, 28, 0,222, 0, 17, 0,222, 0, 0, 0,222, 0, 1, 0, 0, 4,210, 0,221, 6, 29, 0,221, 6, 30, 0,221, 6, 31,
- 0,221, 6, 32, 0, 2, 6, 33, 0, 2, 6, 34, 0, 2, 6, 35, 0, 2, 6, 36, 0, 2, 6, 37, 0, 2, 6, 38, 0, 2, 6, 39,
- 0, 2, 6, 40, 0, 2, 6, 41, 0, 2, 2, 77, 0,223, 0, 10, 0, 0, 6, 42, 0, 0, 6, 43, 0, 0, 6, 44, 0, 0, 6, 45,
- 0, 0, 6, 46, 0, 0, 6, 47, 0, 2, 6, 48, 0, 2, 6, 49, 0, 2, 6, 50, 0, 2, 0, 37, 0,224, 0, 12, 0,223, 6, 51,
- 0,223, 6, 52, 0,223, 6, 53, 0,223, 6, 54, 0,223, 6, 55, 0,223, 6, 56, 0,223, 6, 57, 0,223, 6, 58, 0,223, 6, 59,
- 0,223, 6, 60, 0,223, 6, 61, 0, 0, 6, 62, 0,225, 0, 71, 0, 0, 6, 63, 0, 0, 6, 64, 0, 0, 6, 46, 0, 0, 6, 65,
- 0, 0, 6, 66, 0, 0, 6, 67, 0, 0, 6, 68, 0, 0, 6, 69, 0, 0, 6, 70, 0, 0, 6, 71, 0, 0, 6, 72, 0, 0, 6, 73,
- 0, 0, 6, 74, 0, 0, 6, 75, 0, 0, 6, 76, 0, 0, 6, 77, 0, 0, 6, 78, 0, 0, 6, 79, 0, 0, 6, 80, 0, 0, 6, 81,
- 0, 0, 6, 82, 0, 0, 6, 83, 0, 0, 6, 84, 0, 0, 6, 85, 0, 0, 6, 86, 0, 0, 6, 87, 0, 0, 6, 88, 0, 0, 6, 89,
- 0, 0, 6, 90, 0, 0, 6, 91, 0, 0, 6, 92, 0, 0, 6, 93, 0, 0, 6, 94, 0, 0, 6, 95, 0, 0, 6, 96, 0, 0, 6, 97,
- 0, 0, 6, 98, 0, 0, 6, 99, 0, 0, 6,100, 0, 0, 6,101, 0, 0, 6,102, 0, 0, 6,103, 0, 0, 6,104, 0, 0, 6,105,
- 0, 0, 6,106, 0, 0, 6,107, 0, 0, 6,108, 0, 0, 6,109, 0, 0, 6,110, 0, 0, 6,111, 0, 0, 6,112, 0, 0, 6,113,
- 0, 0, 6,114, 0, 0, 6,115, 0, 0, 6,116, 0, 0, 6,117, 0, 0, 6,118, 0, 0, 6,119, 0, 0, 6,120, 0, 0, 6,121,
- 0, 0, 6,122, 0, 0, 6,123, 0, 0, 6,124, 0, 0, 6,125, 0, 0, 6,126, 0, 0, 6,127, 0, 0, 6,128, 0, 0, 6,129,
- 0, 0, 6,130, 0, 0, 6,131, 0, 0, 0, 96, 0,226, 0, 5, 0, 0, 6,132, 0, 0, 6, 87, 0, 0, 6, 89, 0, 2, 0, 19,
- 0, 2, 0, 37, 0,227, 0, 20, 0,227, 0, 0, 0,227, 0, 1, 0, 0, 0, 20, 0,224, 6,133, 0,225, 6,134, 0,225, 6,135,
- 0,225, 6,136, 0,225, 6,137, 0,225, 6,138, 0,225, 6,139, 0,225, 6,140, 0,225, 6,141, 0,225, 6,142, 0,225, 6,143,
- 0,225, 6,144, 0,225, 6,145, 0,225, 6,146, 0,225, 6,147, 0,225, 6,148, 0,226, 6,149, 0,228, 0, 5, 0, 4, 0, 19,
- 0, 4, 0, 37, 0, 7, 2, 61, 0, 7, 6,150, 0, 7, 1,227, 0,229, 0, 67, 0, 4, 0, 19, 0, 4, 6,151, 0, 4, 6,152,
- 0, 0, 6,153, 0, 0, 6,154, 0, 0, 6,155, 0, 0, 6,156, 0, 0, 6,157, 0, 0, 6,158, 0, 0, 6,159, 0, 0, 6,160,
- 0, 0, 6,161, 0, 2, 6,162, 0, 2, 0, 37, 0, 4, 6,163, 0, 4, 6,164, 0, 4, 6,165, 0, 4, 6,166, 0, 2, 6,167,
- 0, 2, 6,168, 0, 4, 6,169, 0, 4, 0, 43, 0, 4, 6,170, 0, 2, 6,171, 0, 2, 6,172, 0, 2, 6,173, 0, 2, 6,174,
- 0, 12, 6,175, 0, 12, 6,176, 0, 12, 6,177, 0, 2, 6,178, 0, 2, 6,179, 0, 2, 6,180, 0, 2, 6,181, 0, 2, 6,182,
- 0, 2, 6,183, 0, 2, 6,184, 0, 2, 6,185, 0,228, 6,186, 0, 2, 6,187, 0, 2, 6,188, 0, 2, 6,189, 0, 2, 6,190,
- 0, 2, 6,191, 0, 2, 6,192, 0, 2, 6,193, 0, 2, 6,194, 0, 4, 6,195, 0, 4, 6,196, 0, 2, 6,197, 0, 2, 6,198,
- 0, 2, 6,199, 0, 2, 6,200, 0, 2, 6,201, 0, 2, 6,202, 0, 2, 6,203, 0, 2, 6,204, 0, 2, 6,205, 0, 2, 6,206,
- 0, 2, 6,207, 0, 2, 6,208, 0, 0, 6,209, 0, 0, 6,210, 0, 7, 6,211, 0, 2, 5, 63, 0, 2, 6,212, 0, 56, 6,213,
- 0,199, 0, 20, 0, 27, 0, 31, 0, 12, 6,214, 0, 12, 6,215, 0, 12, 6,216, 0, 12, 5,115, 0, 47, 0,139, 0, 2, 6,217,
- 0, 2, 6,218, 0, 2, 6,219, 0, 2, 6,220, 0, 2, 6,221, 0, 2, 6,222, 0, 2, 6,223, 0, 2, 0, 37, 0, 2, 6,224,
- 0, 2, 6,225, 0, 4, 0, 70, 0,194, 6,226, 0, 9, 6,227, 0, 2, 6,228, 0,230, 0, 5, 0,230, 0, 0, 0,230, 0, 1,
- 0,230, 6,229, 0, 13, 6,230, 0, 4, 0, 19, 0,231, 0, 7, 0,231, 0, 0, 0,231, 0, 1, 0,230, 6,231, 0,230, 6,232,
- 0, 2, 4,129, 0, 2, 0, 19, 0, 4, 0, 37, 0,232, 0, 20, 0,232, 0, 0, 0,232, 0, 1, 0,233, 6,233, 0,234, 5,195,
- 0, 0, 6,234, 0, 0, 6,235, 0, 0, 6,236, 0, 2, 6,237, 0, 2, 6,238, 0, 2, 6,239, 0, 2, 6,240, 0, 2, 6,241,
- 0, 2, 0, 37, 0, 2, 0, 19, 0, 2, 6,242, 0, 2, 6,243, 0, 2, 6,244, 0, 4, 6,245, 0,232, 6,246, 0, 9, 6,247,
- 0,235, 0, 2, 0,236, 6,233, 0,234, 5,195, 0,237, 0, 2, 0,238, 6,233, 0,234, 5,195, 0,239, 0, 23, 0,239, 0, 0,
- 0,239, 0, 1, 0,230, 6,231, 0,230, 6,232, 0,230, 6,248, 0,230, 6,249, 0,199, 6,250, 0, 23, 0, 52, 0, 0, 5,116,
- 0, 0, 6,251, 0, 2, 5,163, 0, 2, 5,164, 0, 2, 6,252, 0, 2, 0, 37, 0, 2, 6,220, 0, 2, 6,253, 0, 2, 0, 19,
- 0, 40, 0,126, 0,240, 6,233, 0, 12, 6,254, 0, 12, 5,115, 0, 12, 6,255, 0, 12, 7, 0, 0,241, 0, 21, 0,241, 0, 0,
- 0,241, 0, 1, 0,197, 5,169, 0, 23, 7, 1, 0, 23, 7, 2, 0, 2, 5,163, 0, 2, 5,164, 0, 2, 7, 3, 0, 2, 7, 4,
- 0, 2, 7, 5, 0, 2, 0, 19, 0, 7, 2, 9, 0, 2, 6,219, 0, 2, 6,223, 0, 4, 0, 43, 0,242, 6,233, 0, 12, 7, 6,
- 0, 12, 7, 7, 0, 12, 6,255, 0, 0, 7, 8, 0, 9, 7, 9, 0,243, 0, 11, 0, 0, 7, 10, 0, 2, 7, 11, 0, 2, 7, 12,
- 0, 2, 7, 13, 0, 2, 7, 14, 0, 2, 7, 15, 0, 2, 4,113, 0,199, 7, 16, 0, 47, 7, 17, 0, 4, 7, 18, 0, 4, 7, 19,
- 0,244, 0, 1, 0, 0, 7, 20, 0,245, 0, 8, 0, 58, 7, 21, 0, 58, 7, 22, 0,245, 7, 23, 0,245, 7, 24, 0,245, 7, 25,
- 0, 2, 0,134, 0, 2, 0, 19, 0, 4, 7, 26, 0,246, 0, 4, 0, 4, 5,214, 0, 4, 7, 27, 0, 4, 5,217, 0, 4, 7, 28,
- 0,247, 0, 2, 0, 4, 7, 29, 0, 4, 7, 30, 0,248, 0, 7, 0, 7, 7, 31, 0, 7, 7, 32, 0, 7, 7, 33, 0, 4, 0, 19,
- 0, 4, 0, 37, 0, 7, 3,246, 0, 7, 7, 34, 0,249, 0, 1, 0, 0, 7, 35, 0,250, 0, 21, 0,250, 0, 0, 0,250, 0, 1,
- 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 7, 36, 0, 4, 7, 37, 0, 4, 7, 38, 0,244, 7, 39, 0, 0, 7, 35,
- 0, 4, 7, 40, 0, 4, 7, 41, 0,249, 3, 4, 0,246, 7, 42, 0,247, 7, 43, 0,248, 7, 44, 0,245, 7, 45, 0,245, 7, 46,
- 0,245, 7, 47, 0, 58, 7, 48, 0, 58, 7, 49, 0,251, 0, 12, 0, 0, 1,190, 0, 9, 0,195, 0, 0, 0,196, 0, 4, 0,199,
- 0, 4, 0,207, 0, 9, 0,200, 0, 7, 0,202, 0, 7, 0,203, 0, 9, 7, 50, 0, 9, 7, 51, 0, 9, 0,204, 0, 9, 0,206,
- 0,252, 0, 45, 0,252, 0, 0, 0,252, 0, 1, 0, 9, 7, 52, 0, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17,
- 0, 4, 0, 23, 0, 4, 0, 92, 0, 4, 7, 53, 0, 4, 7, 54, 0, 4, 7, 37, 0, 4, 7, 38, 0, 4, 7, 55, 0, 4, 0,218,
- 0, 4, 7, 56, 0, 4, 7, 57, 0, 7, 4,232, 0, 7, 7, 58, 0, 4, 0,131, 0, 4, 7, 59, 0,250, 7, 60, 0, 36, 0, 80,
- 0, 47, 0,139, 0, 50, 0,142, 0, 7, 7, 61, 0, 7, 7, 62, 0,251, 1, 3, 0,252, 7, 63, 0,252, 7, 64, 0,252, 7, 65,
- 0, 12, 7, 66, 0,253, 7, 67, 0,254, 7, 68, 0, 7, 7, 69, 0, 7, 7, 70, 0, 4, 7, 71, 0, 7, 7, 72, 0, 9, 7, 73,
- 0, 4, 7, 74, 0, 4, 7, 75, 0, 4, 7, 76, 0, 7, 7, 77, 0, 4, 7, 78, 0, 4, 0, 37, 0,255, 0, 4, 0,255, 0, 0,
- 0,255, 0, 1, 0, 12, 7, 79, 0,252, 7, 80, 1, 0, 0, 6, 0, 12, 7, 81, 0, 12, 7, 66, 0, 12, 7, 82, 0,252, 7, 83,
- 0, 0, 7, 84, 0, 0, 7, 85, 1, 1, 0, 4, 0, 7, 7, 86, 0, 7, 0,113, 0, 2, 7, 87, 0, 2, 7, 88, 1, 2, 0, 6,
- 0, 7, 7, 89, 0, 7, 7, 90, 0, 7, 7, 91, 0, 7, 7, 92, 0, 4, 7, 93, 0, 4, 7, 94, 1, 3, 0, 12, 0, 7, 7, 95,
- 0, 7, 7, 96, 0, 7, 7, 97, 0, 7, 7, 98, 0, 7, 7, 99, 0, 7, 7,100, 0, 7, 7,101, 0, 7, 7,102, 0, 7, 7,103,
- 0, 7, 7,104, 0, 4, 2,153, 0, 4, 7,105, 1, 4, 0, 2, 0, 7, 4,208, 0, 7, 0, 37, 1, 5, 0, 5, 0, 7, 7,106,
- 0, 7, 7,107, 0, 4, 0, 94, 0, 4, 2,115, 0, 4, 7,108, 1, 6, 0, 6, 1, 6, 0, 0, 1, 6, 0, 1, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 2, 7,109, 0, 2, 0, 57, 1, 7, 0, 8, 1, 7, 0, 0, 1, 7, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19,
- 0, 2, 7,109, 0, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,131, 1, 8, 0, 45, 1, 8, 0, 0, 1, 8, 0, 1, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 2, 7,109, 0, 2, 0,214, 0, 2, 3,164, 0, 2, 7,110, 0, 7, 7,111, 0, 7, 0, 93, 0, 7, 2,166,
- 0, 4, 7,112, 0, 4, 0, 82, 0, 4, 2,117, 0, 7, 7,113, 0, 7, 7,114, 0, 7, 7,115, 0, 7, 7,116, 0, 7, 7,117,
- 0, 7, 7,118, 0, 7, 2,163, 0, 7, 1, 0, 0, 7, 7,119, 0, 7, 7,120, 0, 7, 0, 37, 0, 7, 7,121, 0, 7, 7,122,
- 0, 7, 7,123, 0, 2, 7,124, 0, 2, 7,125, 0, 2, 7,126, 0, 2, 7,127, 0, 2, 7,128, 0, 2, 7,129, 0, 2, 7,130,
- 0, 2, 7,131, 0, 2, 5,127, 0, 2, 7,132, 0, 2, 1,210, 0, 2, 7,133, 0, 0, 7,134, 0, 0, 7,135, 0, 7, 0,212,
- 1, 9, 7,136, 0, 65, 1,163, 1, 10, 0, 16, 1, 10, 0, 0, 1, 10, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 7,109,
- 0, 2, 0,214, 0, 7, 2,158, 0, 7, 2,159, 0, 7, 2,160, 0, 7, 1,254, 0, 7, 2,161, 0, 7, 2,162, 0, 7, 7,137,
- 0, 7, 2,163, 0, 7, 2,165, 0, 7, 2,166, 0,211, 0, 5, 0, 2, 0, 17, 0, 2, 7, 26, 0, 2, 0, 19, 0, 2, 7,138,
- 0, 27, 5,240, 0,210, 0, 3, 0, 4, 0, 69, 0, 4, 7,139, 0,211, 0, 2, 1, 11, 0, 11, 1, 11, 0, 0, 1, 11, 0, 1,
- 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 7,140, 0, 4, 0, 22, 0, 4, 7,141, 0, 2, 0, 19, 0, 2, 0, 37, 0, 9, 7,142,
- 0, 9, 7,143, 1, 12, 0, 5, 0, 0, 0, 20, 0, 7, 1, 20, 0, 7, 7,144, 0, 4, 7,145, 0, 4, 0, 37, 1, 13, 0, 4,
- 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, 2, 0, 70, 1, 14, 0, 4, 0, 0, 0, 20, 0, 64, 7,146, 0, 7, 1, 20,
- 0, 7, 0, 37, 1, 15, 0, 6, 0, 2, 7,147, 0, 2, 7,148, 0, 2, 0, 17, 0, 2, 7,149, 0, 0, 7,150, 0, 0, 7,151,
- 1, 16, 0, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 0, 7,152, 0, 0, 7,153, 1, 17, 0, 3, 0, 4, 0, 17,
- 0, 4, 0, 37, 0, 0, 0, 20, 1, 18, 0, 4, 0, 2, 7,154, 0, 2, 7,155, 0, 2, 0, 19, 0, 2, 0, 37, 1, 19, 0, 6,
- 0, 0, 0, 20, 0, 0, 7,156, 0, 2, 7,157, 0, 2, 2,163, 0, 2, 1, 13, 0, 2, 0, 70, 1, 20, 0, 5, 0, 0, 0, 20,
- 0, 7, 0,113, 0, 7, 3,248, 0, 2, 0, 19, 0, 2, 2,129, 1, 21, 0, 3, 0, 0, 0, 20, 0, 4, 2,117, 0, 4, 7,154,
- 1, 22, 0, 7, 0, 0, 0, 20, 0, 7, 3,248, 0, 0, 7,158, 0, 0, 7,159, 0, 2, 1, 13, 0, 2, 0, 43, 0, 4, 7,160,
- 1, 23, 0, 3, 0, 32, 7,161, 0, 0, 7,162, 0, 0, 7,163, 1, 24, 0, 17, 1, 24, 0, 0, 1, 24, 0, 1, 0, 2, 0, 17,
- 0, 2, 7,140, 0, 2, 0, 19, 0, 2, 7,164, 0, 2, 7,165, 0, 2, 7,166, 0, 2, 0, 43, 0, 2, 0, 70, 0, 0, 0, 20,
- 0, 9, 0, 2, 1, 25, 7,167, 0, 32, 0, 45, 0, 2, 4,217, 0, 2, 7, 69, 0, 4, 0, 37, 1, 26, 0, 11, 0, 0, 0, 20,
- 0, 0, 0, 17, 0, 0, 7,168, 0, 2, 0, 19, 0, 2, 2,129, 0, 2, 7,169, 0, 4, 7,170, 0, 4, 7,171, 0, 4, 7,172,
- 0, 4, 7,173, 0, 4, 7,174, 1, 27, 0, 1, 0, 0, 7,175, 1, 28, 0, 1, 0, 43, 5,213, 1, 25, 0, 18, 1, 25, 0, 0,
- 1, 25, 0, 1, 1, 25, 7,176, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 7,177, 0, 2, 7,166, 0, 2, 7,140, 0, 2, 7,178,
- 0, 2, 0, 70, 0, 2, 1,160, 0, 0, 0, 20, 0, 9, 0, 2, 1, 29, 7,167, 1, 24, 7,179, 0, 2, 0, 15, 0, 2, 7,180,
- 0, 4, 7,181, 1, 30, 0, 3, 0, 4, 2,189, 0, 4, 0, 37, 0, 32, 0, 45, 1, 31, 0, 12, 0,152, 7,182, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 4, 7,111, 0, 4, 0, 93, 0, 0, 0, 20, 0, 0, 7,183, 0, 2, 7,184, 0, 2, 7,185, 0, 2, 7,186,
- 0, 2, 7,187, 0, 7, 7,188, 1, 32, 0, 10, 0, 2, 0, 19, 0, 2, 7,189, 0, 4, 7,111, 0, 4, 0, 93, 0, 2, 7,190,
- 0,253, 7, 67, 0, 2, 0, 17, 0, 2, 7,191, 0, 2, 7,192, 0, 2, 7,193, 1, 33, 0, 7, 0, 2, 0, 19, 0, 2, 7,189,
- 0, 4, 7,111, 0, 4, 0, 93, 0, 2, 0, 17, 0, 2, 7,194, 0, 7, 3,124, 1, 34, 0, 11, 0, 4, 2,189, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 32, 0, 45, 0, 78, 7,195, 0, 0, 0, 20, 0, 7, 7,196, 0, 7, 7,197, 0, 7, 3, 37, 0, 2, 7,198,
- 0, 2, 7,199, 1, 35, 0, 5, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 37, 0, 47, 0,139, 0, 32, 5, 47, 1, 36, 0, 5,
- 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 7,152, 0, 32, 0, 45, 1, 37, 0, 12, 0, 2, 0, 19, 0, 2, 0, 17,
- 0, 2, 7,140, 0, 2, 3, 38, 0, 7, 7,200, 0, 7, 7,201, 0, 7, 1, 8, 0, 7, 1, 9, 0, 7, 3, 13, 0, 7, 3, 16,
- 0, 7, 7,202, 0, 7, 7,203, 1, 38, 0, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 7,111, 0, 4, 0, 93, 0, 0, 0, 20,
- 0, 0, 7,183, 0, 2, 0, 43, 0, 2, 0, 64, 0, 2, 7,204, 0, 2, 7,205, 1, 39, 0, 8, 0, 32, 0, 45, 0, 7, 2,160,
- 0, 7, 7,206, 0, 7, 7,207, 0, 7, 2,155, 0, 2, 0, 19, 0, 2, 2,129, 0, 7, 7,208, 1, 40, 0, 12, 0, 2, 0, 17,
- 0, 2, 1, 13, 0, 2, 0, 19, 0, 2, 2,163, 0, 2, 2,189, 0, 2, 7,209, 0, 4, 0, 37, 0, 7, 7,210, 0, 7, 7,211,
- 0, 7, 7,212, 0, 7, 7,213, 0, 0, 7,214, 1, 41, 0, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 7,111, 0, 4, 0, 93,
- 0, 0, 0, 20, 0, 2, 2, 77, 0, 2, 0, 64, 0, 2, 7,204, 0, 2, 7,205, 0, 65, 1,163, 1, 42, 0, 7, 0, 4, 2,117,
- 0, 4, 7,215, 0, 4, 7,216, 0, 4, 7,217, 0, 7, 7,218, 0, 7, 7,219, 0, 0, 7,158, 1, 43, 0, 7, 0, 0, 7,220,
- 0, 32, 7,221, 0, 0, 7,162, 0, 2, 7,222, 0, 2, 0, 43, 0, 4, 0, 70, 0, 0, 7,163, 1, 44, 0, 6, 0, 2, 0, 19,
- 0, 2, 0, 17, 0, 4, 7,111, 0, 4, 0, 93, 0, 0, 7,223, 0, 0, 7,224, 1, 45, 0, 1, 0, 4, 0, 19, 1, 46, 0, 6,
- 0, 0, 0, 96, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 7,225, 0, 7, 7,226, 0, 43, 5,213, 1, 47, 0, 3, 0, 0, 0, 96,
- 0, 4, 0, 17, 0, 32, 0, 45, 1, 48, 0, 2, 0, 4, 0, 17, 0, 4, 5,152, 1, 29, 0, 10, 1, 29, 0, 0, 1, 29, 0, 1,
- 1, 29, 7,176, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 7,140, 0, 2, 7,227, 0, 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45,
- 1, 49, 0, 10, 0, 7, 3, 37, 0, 7, 7,228, 0, 7, 7,229, 0, 7, 7,230, 0, 7, 7,231, 0, 4, 0, 19, 0, 7, 7,209,
- 0, 7, 7,232, 0, 7, 7,233, 0, 7, 0, 37, 0,253, 0, 20, 0, 27, 0, 31, 0, 0, 0,194, 1, 50, 7,234, 0, 9, 7,235,
- 0, 44, 0,154, 0, 44, 7,236, 0, 9, 7,237, 0, 36, 0, 80, 0, 7, 3,124, 0, 7, 7,238, 0, 7, 7,239, 0, 7, 7,240,
- 0, 7, 7,241, 0, 7, 7,242, 0, 7, 7,243, 0, 4, 0, 94, 0, 4, 7,244, 0, 0, 7,245, 0, 0, 7,246, 0, 0, 7,247,
- 1, 51, 0, 6, 0, 27, 0, 31, 0, 7, 7,248, 0, 7, 7,249, 0, 7, 7,250, 0, 2, 7,251, 0, 2, 7,252, 1, 52, 0, 15,
- 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0,239, 7,253, 0,197, 5,169, 0,253, 7, 67,
- 0, 2, 1, 13, 0, 2, 7,189, 0, 2, 2, 13, 0, 2, 2, 14, 0, 2, 0, 19, 0, 2, 5,174, 0, 4, 0, 70, 1, 53, 0, 6,
- 1, 53, 0, 0, 1, 53, 0, 1, 0, 32, 0, 45, 0, 9, 7,254, 0, 4, 0,219, 0, 4, 0, 37, 0, 65, 0, 4, 0, 27, 0, 31,
- 0, 12, 7,255, 0, 4, 0,136, 0, 7, 8, 0, 1, 54, 0, 25, 1, 54, 0, 0, 1, 54, 0, 1, 1, 54, 0, 38, 0, 12, 8, 1,
- 0, 0, 0, 20, 0, 7, 8, 2, 0, 7, 8, 3, 0, 7, 8, 4, 0, 7, 8, 5, 0, 4, 0, 19, 0, 7, 8, 6, 0, 7, 8, 7,
- 0, 7, 8, 8, 0, 7, 1, 20, 0, 7, 1,219, 0, 7, 8, 9, 0, 7, 2,115, 0, 7, 8, 10, 0, 7, 8, 11, 0, 7, 8, 12,
- 0, 7, 8, 13, 0, 7, 8, 14, 0, 7, 0,176, 0, 2, 0,136, 0, 2, 4,245, 1, 55, 0, 20, 0, 27, 0, 31, 0, 12, 8, 15,
- 0, 12, 8, 16, 0, 12, 8, 17, 0, 4, 0, 19, 0, 4, 4, 35, 0, 2, 2,167, 0, 2, 8, 18, 0, 2, 0,136, 0, 2, 8, 19,
- 0, 2, 8, 20, 0, 2, 8, 21, 0, 2, 8, 22, 0, 2, 8, 23, 0, 4, 8, 24, 0, 4, 8, 25, 0, 4, 8, 26, 0, 4, 8, 27,
- 0, 4, 8, 28, 0, 4, 8, 29, 1, 56, 0, 38, 1, 56, 0, 0, 1, 56, 0, 1, 0, 26, 8, 30, 0, 12, 3, 64, 0, 0, 0, 20,
- 0, 2, 0, 19, 0, 2, 8, 31, 0, 2, 8, 32, 0, 2, 8, 33, 0, 2, 3, 22, 0, 2, 8, 34, 0, 4, 1,252, 0, 4, 8, 26,
- 0, 4, 8, 27, 1, 54, 8, 35, 1, 56, 0, 38, 1, 56, 8, 36, 0, 12, 8, 37, 0, 9, 8, 38, 0, 9, 8, 39, 0, 9, 8, 40,
- 0, 7, 1, 8, 0, 7, 0,176, 0, 7, 8, 41, 0, 7, 1,200, 0, 2, 8, 42, 0, 2, 0, 37, 0, 7, 8, 43, 0, 7, 8, 44,
- 0, 7, 3, 18, 0, 7, 8, 45, 0, 7, 8, 46, 0, 7, 8, 47, 0, 7, 8, 48, 0, 7, 8, 49, 0, 7, 8, 50, 0, 7, 1,249,
- 0, 32, 8, 51, 0,153, 0, 9, 0, 12, 8, 52, 0, 2, 0, 19, 0, 2, 8, 53, 0, 7, 3, 36, 0, 7, 8, 54, 0, 7, 8, 55,
- 0, 12, 8, 56, 0, 4, 8, 57, 0, 4, 0, 37, 1, 57, 0, 7, 1, 57, 0, 0, 1, 57, 0, 1, 0, 12, 7,245, 0, 4, 0, 19,
- 0, 4, 8, 58, 0, 0, 4,210, 0,226, 8, 59, 0,152, 0, 7, 0, 27, 0, 31, 0, 12, 8, 60, 0, 12, 8, 52, 0, 12, 8, 61,
- 0, 12, 0,104, 0, 4, 0, 19, 0, 4, 8, 62, 0,201, 0, 4, 0, 27, 8, 63, 0, 12, 8, 52, 0, 4, 8, 64, 0, 4, 0, 19,
- 1, 58, 0, 17, 0,196, 0, 0, 0,196, 0, 1, 0, 12, 5,115, 0, 4, 5,116, 0, 7, 5,117, 0, 2, 5,118, 0,197, 5,169,
- 0,152, 3, 7, 0,201, 8, 65, 0, 0, 1, 13, 0, 0, 5,172, 0, 2, 0, 19, 0, 2, 8, 66, 0, 2, 5,173, 0, 2, 5,174,
- 0, 2, 8, 67, 0, 7, 8, 68, 1, 59, 0, 8, 1, 59, 0, 0, 1, 59, 0, 1, 1, 57, 8, 69, 0, 36, 0, 80, 0, 12, 3, 10,
- 0, 4, 0, 19, 0, 0, 0, 20, 0, 4, 8, 70, 1, 60, 0, 5, 1, 60, 0, 0, 1, 60, 0, 1, 0, 36, 0, 80, 0, 2, 0, 19,
- 0, 0, 8, 71, 1, 61, 0, 12, 1, 61, 0, 0, 1, 61, 0, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 8, 72,
- 0, 0, 8, 73, 0, 0, 8, 71, 0, 7, 8, 74, 0, 7, 8, 75, 0, 4, 0, 37, 0, 36, 0, 80, 1, 62, 0, 9, 1, 62, 0, 0,
- 1, 62, 0, 1, 0, 32, 8, 76, 0, 0, 8, 77, 0, 7, 8, 78, 0, 2, 8, 79, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 37,
- 1, 63, 0, 7, 0, 43, 5,213, 0, 26, 8, 30, 0, 4, 0, 19, 0, 4, 8, 80, 0, 12, 8, 81, 0, 32, 8, 76, 0, 0, 8, 77,
- 1, 64, 0, 12, 0, 32, 8, 76, 0, 2, 8, 82, 0, 2, 0, 19, 0, 2, 8, 83, 0, 2, 8, 84, 0, 0, 8, 77, 0, 32, 8, 85,
- 0, 0, 8, 86, 0, 7, 8, 87, 0, 7, 1,219, 0, 7, 8, 88, 0, 7, 8, 89, 1, 65, 0, 6, 0, 32, 8, 76, 0, 4, 8, 90,
- 0, 4, 8, 91, 0, 4, 0, 94, 0, 4, 0, 37, 0, 0, 8, 77, 1, 66, 0, 4, 0, 32, 8, 76, 0, 4, 0, 19, 0, 4, 8, 90,
- 0, 0, 8, 77, 1, 67, 0, 4, 0, 32, 8, 76, 0, 4, 0, 19, 0, 4, 8, 90, 0, 0, 8, 77, 1, 68, 0, 10, 0, 32, 8, 76,
- 0, 4, 8, 92, 0, 7, 0,130, 0, 4, 0, 19, 0, 2, 5,209, 0, 2, 8, 93, 0, 2, 0, 43, 0, 2, 0, 70, 0, 7, 8, 94,
- 0, 0, 8, 77, 1, 69, 0, 4, 0, 32, 8, 76, 0, 4, 0, 19, 0, 4, 8, 90, 0, 0, 8, 77, 1, 70, 0, 10, 0, 32, 8, 76,
- 0, 2, 0, 17, 0, 2, 3,170, 0, 4, 0, 92, 0, 4, 0, 93, 0, 7, 7,206, 0, 7, 7,207, 0, 4, 0, 37, 0,152, 7,182,
- 0, 0, 8, 77, 1, 71, 0, 4, 0, 32, 8, 76, 0, 4, 3, 23, 0, 4, 8, 95, 0, 0, 8, 77, 1, 72, 0, 5, 0, 32, 8, 76,
- 0, 7, 0,130, 0, 4, 8, 96, 0, 4, 3, 23, 0, 4, 3, 24, 1, 73, 0, 6, 0, 32, 8, 76, 0, 4, 8, 97, 0, 4, 8, 98,
- 0, 7, 8, 99, 0, 7, 8,100, 0, 0, 8, 77, 1, 74, 0, 16, 0, 32, 8, 76, 0, 32, 8, 36, 0, 4, 0, 17, 0, 7, 8,101,
- 0, 7, 8,102, 0, 7, 8,103, 0, 7, 8,104, 0, 7, 8,105, 0, 7, 8,106, 0, 7, 8,107, 0, 7, 8,108, 0, 7, 8,109,
- 0, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 1, 75, 0, 3, 0, 32, 8, 76, 0, 4, 0, 19, 0, 4, 5,127,
- 1, 76, 0, 5, 0, 32, 8, 76, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 8,110, 0, 0, 8, 77, 1, 77, 0, 10, 0, 32, 8, 76,
- 0, 0, 8, 77, 0, 2, 8,111, 0, 2, 8,112, 0, 0, 8,113, 0, 0, 8,114, 0, 7, 8,115, 0, 7, 8,116, 0, 7, 8,117,
- 0, 7, 8,118, 1, 78, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 8,119, 0, 7, 8,120,
- 0, 2, 0, 19, 0, 2, 5,127, 1, 79, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 8,119,
- 0, 7, 8,120, 0, 2, 0, 19, 0, 2, 5,127, 1, 80, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12,
- 0, 7, 8,119, 0, 7, 8,120, 0, 2, 0, 19, 0, 2, 5,127, 1, 81, 0, 7, 0, 32, 8, 76, 0, 0, 8, 77, 0, 7, 1, 20,
- 0, 7, 1, 30, 0, 2, 0, 19, 0, 2, 1, 13, 0, 4, 0, 37, 1, 82, 0, 5, 0, 32, 2,224, 0, 7, 1, 20, 0, 2, 2,228,
- 0, 0, 2,230, 0, 0, 8,121, 1, 83, 0, 10, 1, 83, 0, 0, 1, 83, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 8,122,
- 0, 7, 0,221, 0, 7, 0,222, 0, 2, 7,245, 0, 2, 8,123, 0, 32, 0, 45, 1, 84, 0, 22, 1, 84, 0, 0, 1, 84, 0, 1,
- 0, 2, 0, 19, 0, 2, 1, 13, 0, 2, 8,124, 0, 2, 8,125, 0, 36, 0, 80, 0,152, 7,182, 0, 32, 0,168, 0, 7, 0, 92,
- 0, 7, 0, 93, 0, 7, 8,126, 0, 7, 8,127, 0, 7, 8,128, 0, 7, 8,129, 0, 7, 2,156, 0, 7, 8,130, 0, 7, 7,184,
- 0, 7, 8,131, 0, 0, 8,132, 0, 0, 8,133, 0, 12, 3, 12, 1, 85, 0, 8, 0, 7, 1,227, 0, 7, 7,206, 0, 7, 7,207,
- 0, 9, 0, 2, 0, 2, 8,134, 0, 2, 8,135, 0, 2, 8,136, 0, 2, 8,137, 1, 86, 0, 18, 1, 86, 0, 0, 1, 86, 0, 1,
- 1, 86, 8,138, 0, 0, 0, 20, 1, 85, 8,139, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 8,140, 0, 2, 8,141, 0, 2, 8,142,
- 0, 2, 8,143, 0, 4, 0, 43, 0, 7, 8,144, 0, 7, 8,145, 0, 4, 8,146, 0, 4, 8,147, 1, 86, 8,148, 1, 87, 8,149,
- 1, 88, 0, 33, 1, 88, 0, 0, 1, 88, 0, 1, 1, 88, 8,150, 0, 0, 0, 20, 0, 0, 8,151, 0, 2, 0, 17, 0, 2, 0, 19,
- 0, 2, 7, 36, 0, 2, 7, 69, 0, 2, 8,152, 0, 2, 0,138, 0, 2, 8,141, 0, 2, 7, 26, 0, 12, 7,177, 0, 12, 8,153,
- 0, 27, 5,240, 0, 9, 8,154, 0, 7, 8,144, 0, 7, 8,145, 0, 7, 1,254, 0, 7, 8,155, 0, 2, 8,156, 0, 2, 8,157,
- 0, 7, 8,158, 0, 7, 8,159, 0, 2, 8,160, 0, 2, 8,161, 0, 9, 8,162, 0, 24, 8,163, 0, 24, 8,164, 0, 24, 8,165,
- 1, 89, 0,155, 1, 90, 8,166, 1, 87, 0, 8, 1, 87, 0, 0, 1, 87, 0, 1, 1, 88, 8,167, 1, 88, 8,168, 1, 86, 8,169,
- 1, 86, 8,148, 0, 4, 0, 19, 0, 4, 0, 37, 0, 59, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 12, 8,170, 0, 12, 8,171,
- 1, 85, 8,172, 0, 12, 8,173, 0, 4, 0, 17, 0, 4, 8,174, 0, 4, 8,175, 0, 4, 8,176, 0, 12, 8,177, 1, 90, 8,178,
- 1, 86, 8,179, 1, 86, 8,180, 0, 9, 8,181, 0, 9, 8,182, 0, 4, 8,183, 0, 9, 8,184, 0, 9, 8,185, 0, 9, 8,186,
- 1, 91, 0, 6, 0, 4, 0,129, 0, 4, 0,131, 0, 4, 7, 26, 0, 0, 8,187, 0, 0, 8,188, 0, 2, 0, 37, 1, 92, 0, 16,
- 0, 2, 6,239, 0, 2, 6,240, 0, 2, 8,189, 0, 2, 7,229, 0, 2, 8,190, 0, 2, 0, 68, 0, 7, 2,155, 0, 7, 8,191,
- 0, 7, 8,192, 0, 2, 1, 34, 0, 0, 8,193, 0, 0, 4, 47, 0, 2, 8,194, 0, 2, 0, 37, 0, 4, 8,195, 0, 4, 8,196,
- 1, 93, 0, 9, 0, 7, 8,197, 0, 7, 8,198, 0, 7, 7,243, 0, 7, 0,113, 0, 7, 8,199, 0, 7, 5, 80, 0, 2, 8,200,
- 0, 0, 8,201, 0, 0, 0, 37, 1, 94, 0, 4, 0, 7, 8,202, 0, 7, 8,203, 0, 2, 8,200, 0, 2, 0, 37, 1, 95, 0, 3,
- 0, 7, 8,204, 0, 7, 8,205, 0, 7, 0, 15, 1, 96, 0, 7, 0, 0, 1,190, 0, 2, 4,115, 0, 2, 4,116, 0, 2, 4,117,
- 0, 2, 4, 67, 0, 4, 0,131, 0, 4, 3,168, 1, 97, 0, 7, 0, 7, 8,206, 0, 7, 8,207, 0, 7, 8,208, 0, 7, 2, 9,
- 0, 7, 8,209, 0, 7, 8,210, 0, 7, 8,211, 1, 98, 0, 4, 0, 2, 8,212, 0, 2, 8,213, 0, 2, 8,214, 0, 2, 8,215,
- 1, 99, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 1,100, 0, 2, 0, 0, 0,170, 0, 0, 8,216, 1,101, 0, 1, 0, 0, 0, 20,
- 1,102, 0, 10, 0, 0, 8,217, 0, 0, 8,218, 0, 0, 8,219, 0, 0, 8,220, 0, 2, 8,189, 0, 2, 8,221, 0, 7, 8,222,
- 0, 7, 8,223, 0, 7, 8,224, 0, 7, 8,130, 1,103, 0, 2, 0, 9, 8,225, 0, 9, 8,226, 1,104, 0, 11, 0, 0, 4,117,
- 0, 0, 0, 17, 0, 0, 8,200, 0, 0, 0,113, 0, 0, 8,227, 0, 0, 0,110, 0, 0, 0,183, 0, 7, 8,228, 0, 7, 8,229,
- 0, 7, 8,230, 0, 7, 8,231, 1,105, 0, 8, 0, 7, 7,147, 0, 7, 0,130, 0, 7, 4, 47, 0, 7, 2, 81, 0, 7, 8,232,
- 0, 7, 0,208, 0, 7, 8,233, 0, 4, 0, 17, 1,106, 0, 4, 0, 2, 8,234, 0, 2, 8,235, 0, 2, 8,236, 0, 2, 0, 37,
- 1,107, 0, 1, 0, 0, 0, 20, 1,108, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 8,237, 1,109, 0, 10,
- 0, 2, 3,150, 0, 2, 0, 19, 0, 7, 3,248, 0, 7, 8,238, 0, 7, 8,239, 0, 7, 8,240, 0, 7, 8,241, 1,108, 8,242,
- 1,108, 8,243, 1,108, 8,244, 0, 62, 0, 9, 0, 4, 0, 19, 0, 4, 0, 64, 0, 24, 8,245, 0, 24, 8,246, 1,109, 8,247,
- 0, 7, 8,248, 0, 7, 8,249, 0, 7, 8,250, 0, 7, 8,251, 1,110, 0, 4, 0, 48, 2,149, 0, 7, 8,252, 0, 7, 1, 93,
- 0, 7, 0, 37, 0,176, 0, 17, 0, 27, 0, 31, 1,110, 8,253, 0, 62, 8,242, 0, 52, 1, 77, 0, 2, 0, 19, 0, 2, 5, 81,
- 0, 4, 0,110, 0, 7, 8,254, 0, 7, 2, 6, 0, 7, 8,255, 0, 7, 9, 0, 0, 7, 1, 93, 0, 7, 9, 1, 0, 2, 1, 47,
- 0, 0, 9, 2, 0, 0, 3,112, 0, 0, 0, 96, 1,111, 0, 10, 0, 4, 0, 17, 0, 4, 0,130, 0, 4, 0, 19, 0, 4, 3, 85,
- 0, 4, 9, 3, 0, 4, 9, 4, 0, 4, 9, 5, 0, 0, 0, 96, 0, 0, 0, 20, 0, 9, 0, 2, 0, 89, 0, 6, 1,111, 9, 6,
- 0, 4, 9, 7, 0, 4, 9, 8, 0, 4, 9, 9, 0, 4, 0, 37, 0, 9, 9, 10, 1,112, 0, 5, 0, 7, 2, 75, 0, 7, 2,189,
- 0, 7, 1,219, 0, 2, 9, 11, 0, 2, 0, 37, 1,113, 0, 5, 0, 7, 2, 75, 0, 7, 9, 12, 0, 7, 9, 13, 0, 7, 9, 14,
- 0, 7, 2,189, 1,114, 0, 7, 0, 4, 9, 15, 0, 4, 9, 16, 0, 4, 9, 17, 0, 7, 9, 18, 0, 7, 9, 19, 0, 7, 9, 20,
- 0, 7, 9, 21, 1,115, 0, 26, 0, 32, 9, 22, 1,113, 3, 81, 1,113, 9, 23, 1,112, 9, 24, 1,113, 7,136, 0, 7, 9, 25,
- 0, 7, 9, 26, 0, 7, 9, 27, 0, 7, 9, 28, 0, 7, 9, 19, 0, 7, 9, 20, 0, 7, 2,189, 0, 7, 2,166, 0, 7, 9, 29,
- 0, 7, 9, 30, 0, 7, 0,110, 0, 7, 9, 31, 0, 4, 9, 15, 0, 4, 9, 32, 0, 4, 0, 37, 0, 4, 0, 82, 0, 4, 9, 33,
- 0, 2, 0, 19, 0, 2, 9, 34, 0, 2, 9, 35, 0, 2, 3,115, 1,116, 0,112, 0, 27, 0, 31, 0, 4, 0, 19, 0, 2, 0, 17,
- 0, 2, 8,111, 0, 2, 9, 36, 0, 2, 9, 37, 0, 2, 8, 42, 0, 2, 9, 38, 0, 2, 9, 39, 0, 2, 9, 40, 0, 2, 9, 41,
- 0, 2, 9, 42, 0, 2, 9, 43, 0, 2, 9, 44, 0, 2, 9, 45, 0, 2, 9, 46, 0, 2, 9, 47, 0, 2, 9, 48, 0, 2, 9, 49,
- 0, 2, 1,210, 0, 2, 7,129, 0, 2, 7,105, 0, 2, 9, 50, 0, 2, 9, 51, 0, 2, 3,113, 0, 2, 3,114, 0, 2, 9, 52,
- 0, 2, 9, 53, 0, 2, 9, 54, 0, 2, 9, 55, 0, 2, 9, 56, 0, 2, 9, 57, 0, 7, 9, 58, 0, 7, 9, 59, 0, 7, 9, 60,
- 0, 2, 9, 61, 0, 2, 9, 62, 0, 7, 9, 63, 0, 7, 9, 64, 0, 7, 9, 65, 0, 7, 7,111, 0, 7, 0, 93, 0, 7, 2,166,
- 0, 7, 7,117, 0, 7, 9, 66, 0, 7, 9, 67, 0, 7, 9, 68, 0, 7, 9, 69, 0, 7, 0, 57, 0, 4, 7,112, 0, 4, 7,110,
- 0, 4, 9, 70, 0, 7, 7,113, 0, 7, 7,114, 0, 7, 7,115, 0, 7, 9, 71, 0, 7, 9, 72, 0, 7, 9, 73, 0, 7, 9, 74,
- 0, 7, 9, 75, 0, 7, 9, 76, 0, 7, 9, 77, 0, 7, 9, 78, 0, 7, 3, 37, 0, 7, 0,110, 0, 7, 9, 79, 0, 7, 9, 80,
- 0, 7, 9, 81, 0, 7, 9, 82, 0, 7, 9, 83, 0, 7, 9, 84, 0, 7, 2,115, 0, 7, 9, 85, 0, 7, 9, 86, 0, 4, 9, 87,
- 0, 4, 9, 88, 0, 7, 9, 89, 0, 7, 9, 90, 0, 7, 9, 91, 0, 7, 9, 92, 0, 7, 9, 93, 0, 7, 9, 94, 0, 7, 9, 95,
- 0, 7, 9, 96, 0, 7, 3,109, 0, 7, 3,107, 0, 7, 3,108, 0, 7, 9, 97, 0, 7, 9, 98, 0, 7, 9, 99, 0, 7, 9,100,
- 0, 7, 9,101, 0, 7, 9,102, 0, 7, 9,103, 0, 7, 9,104, 0, 7, 9,105, 0, 7, 3, 44, 0, 7, 9,106, 0, 7, 9,107,
- 0, 7, 9,108, 0, 7, 9,109, 0, 7, 9,110, 0, 7, 9,111, 0, 7, 9,112, 0, 0, 9,113, 0, 65, 3, 70, 0, 65, 9,114,
- 0, 32, 9,115, 0, 32, 9,116, 0, 36, 0, 80, 0,155, 3, 68, 0,155, 9,117, 0,142, 0, 38, 0,142, 0, 0, 0,142, 0, 1,
- 1,116, 9,118, 1,115, 3,149, 1,114, 8, 36, 1,117, 9,119, 0, 9, 9,120, 1,118, 9,121, 1,118, 9,122, 0, 12, 9,123,
- 0, 12, 9,124, 0,156, 3, 69, 0, 32, 9,125, 0, 32, 9,126, 0, 32, 9,127, 0, 12, 9,128, 0, 12, 9,129, 0, 7, 0,212,
- 0, 7, 4, 89, 0, 4, 2,117, 0, 4, 0, 19, 0, 4, 7,112, 0, 4, 9,130, 0, 4, 9,131, 0, 4, 9,132, 0, 4, 0, 57,
- 0, 2, 0,219, 0, 2, 9,133, 0, 2, 9,134, 0, 2, 9,135, 0, 2, 3, 62, 0, 2, 9,136, 0, 0, 9,137, 0, 2, 9,138,
- 0, 2, 9,139, 0, 2, 9,140, 0, 9, 9,141, 0,131, 3,189, 0,129, 0, 34, 1,119, 9,142, 0, 7, 3,161, 0, 7, 9,143,
- 0, 7, 9,144, 0, 7, 3,251, 0, 7, 9,145, 0, 7, 3, 46, 0, 7, 3, 37, 0, 7, 9,146, 0, 7, 2, 8, 0, 7, 9,147,
- 0, 7, 9,148, 0, 7, 9,149, 0, 7, 9,150, 0, 7, 9,151, 0, 7, 9,152, 0, 7, 3,162, 0, 7, 9,153, 0, 7, 9,154,
- 0, 7, 9,155, 0, 7, 3,163, 0, 7, 3,159, 0, 7, 3,160, 0, 4, 9,156, 0, 4, 0, 94, 0, 4, 9,157, 0, 4, 9,158,
- 0, 2, 9,159, 0, 2, 9,160, 0, 2, 9,161, 0, 2, 9,162, 0, 2, 9,163, 0, 2, 0, 37, 0, 4, 0, 70, 0,130, 0, 8,
- 1,119, 9,164, 0, 7, 9,165, 0, 7, 9,166, 0, 7, 1,164, 0, 7, 9,167, 0, 4, 0, 94, 0, 2, 9,168, 0, 2, 9,169,
- 1,120, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 9,170, 1,121, 0, 6, 1,121, 0, 0, 1,121, 0, 1,
- 1,120, 9,171, 0, 4, 9,172, 0, 2, 9,173, 0, 2, 0, 19, 1,122, 0, 5, 1,122, 0, 0, 1,122, 0, 1, 0, 12, 9,174,
- 0, 4, 9,175, 0, 4, 0, 19, 1,123, 0, 9, 1,123, 0, 0, 1,123, 0, 1, 0, 12, 0,129, 1,122, 9,176, 0, 4, 0, 19,
- 0, 2, 9,173, 0, 2, 9,177, 0, 7, 0, 95, 0, 0, 9,178, 0,189, 0, 6, 0, 27, 0, 31, 0, 12, 4,131, 0, 4, 0, 19,
- 0, 2, 9,179, 0, 2, 9,180, 0, 9, 9,181, 1,124, 0, 13, 0, 27, 0, 31, 1,125, 9,182, 1,125, 9,183, 0, 12, 9,184,
- 0, 4, 9,185, 0, 2, 9,186, 0, 2, 0, 37, 0, 12, 9,187, 0, 12, 9,188, 0, 12, 9,189, 0, 12, 9,190, 0, 12, 9,191,
- 0, 12, 9,192, 1,125, 0, 29, 1,125, 0, 0, 1,125, 0, 1, 0, 9, 9,193, 0, 4, 6,218, 0, 4, 0, 37, 0,199, 5,168,
- 0, 0, 9,194, 0, 2, 9,195, 0, 2, 9,196, 0, 2, 6,239, 0, 2, 6,240, 0, 2, 9,197, 0, 2, 9,198, 0, 2, 3, 85,
- 0, 2, 6,253, 0, 2, 9,199, 0, 2, 0, 70, 0, 4, 1,160, 1,126, 9,200, 1,127, 9,201, 1,128, 9,202, 0, 4, 9,203,
- 0, 4, 9,204, 0, 9, 9,205, 0, 12, 9,206, 0, 12, 9,188, 0, 12, 6,255, 0, 12, 9,207, 0, 12, 9,208, 1,129, 0, 12,
- 1,129, 0, 0, 1,129, 0, 1, 0, 0, 9,209, 1,130, 9,210, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 9,211, 0, 2, 9,212,
- 0, 2, 9,213, 0, 2, 9,214, 0, 2, 9,215, 0, 2, 0, 37, 1,131, 0, 6, 1,131, 0, 0, 1,131, 0, 1, 0, 12, 9,216,
- 0, 0, 9,217, 0, 4, 9,218, 0, 4, 9,219, 0,207, 0, 8, 0,207, 0, 0, 0,207, 0, 1, 0, 0, 9,209, 0, 26, 0, 30,
- 1,132, 6,233, 0, 9, 9,220, 1,130, 9,210, 1,133, 9,221, 1,134, 0, 8, 1,134, 0, 0, 1,134, 0, 1, 0, 9, 0, 2,
- 0, 9, 9,222, 0, 0, 4,210, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 9,223, 1,135, 0, 8, 0, 0, 9,224, 0, 7, 9,225,
- 0, 4, 9,226, 0, 2, 9,227, 0, 2, 9,228, 0, 4, 0, 37, 0, 2, 0, 19, 0, 2, 1, 13, 1,136, 0, 5, 0, 7, 7,206,
- 0, 7, 7,207, 0, 7, 2,189, 0, 2, 1,223, 0, 2, 1,224, 1,137, 0, 5, 1,136, 0, 2, 0, 4, 0, 54, 0, 7, 9,229,
- 0, 7, 7,206, 0, 7, 7,207, 1,138, 0, 4, 0, 2, 9,230, 0, 2, 9,231, 0, 2, 9,232, 0, 2, 9,233, 1,139, 0, 2,
- 0, 43, 5,237, 0, 26, 8, 30, 1,140, 0, 3, 0, 24, 9,234, 0, 4, 0, 19, 0, 4, 0, 37, 1,141, 0, 6, 0, 7, 0,110,
- 0, 7, 2,141, 0, 7, 9,235, 0, 7, 0, 37, 0, 2, 0,218, 0, 2, 9,236, 1,142, 0, 7, 1,142, 0, 0, 1,142, 0, 1,
- 0, 27, 5,240, 0, 0, 9,237, 0, 4, 9,238, 0, 4, 0, 94, 0, 0, 4,210, 1,143, 0, 6, 0, 12, 8, 81, 0, 0, 9,224,
- 0, 7, 0, 61, 0, 7, 9,223, 0, 4, 0, 17, 0, 4, 0, 19, 1,144, 0, 3, 0, 7, 9,239, 0, 4, 0, 19, 0, 4, 0, 37,
- 1,145, 0, 15, 1,145, 0, 0, 1,145, 0, 1, 1, 57, 8, 69, 1,143, 0, 62, 0, 12, 3, 12, 0, 35, 0, 50, 1,144, 9,240,
- 0, 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0,254, 0, 4, 9,238, 0, 0, 9,237, 0, 4, 9,241, 0, 7, 9,242,
- 1,146, 0, 2, 0, 0, 9,243, 0, 0, 9,244, 1,147, 0, 4, 1,147, 0, 0, 1,147, 0, 1, 0,152, 2,224, 0, 12, 9,245,
- 1,148, 0, 24, 1,148, 0, 0, 1,148, 0, 1, 0,152, 7,182, 1,147, 9,246, 0, 12, 3, 12, 0, 12, 9,247, 0, 7, 9,223,
- 0, 7, 9,248, 0, 7, 0, 92, 0, 7, 0, 93, 0, 7, 8,126, 0, 7, 8,127, 0, 7, 2,156, 0, 7, 8,130, 0, 7, 7,184,
- 0, 7, 8,131, 0, 4, 9,249, 0, 4, 0, 19, 0, 4, 8,124, 0, 4, 0, 37, 0, 7, 8,128, 0, 7, 8,129, 0, 0, 8,132,
- 0, 0, 8,133, 1,149, 0, 6, 1,149, 0, 0, 1,149, 0, 1, 0, 12, 9,250, 0, 4, 0, 19, 0, 4, 2, 80, 0, 0, 9,251,
- 1,150, 0, 10, 1,150, 0, 0, 1,150, 0, 1, 0, 27, 5,240, 0, 0, 9,252, 0, 4, 9,253, 0, 4, 9,254, 0, 0, 9,237,
- 0, 4, 9,238, 0, 2, 0, 19, 0, 2, 9,255, 1,151, 0, 6, 1,151, 0, 0, 1,151, 0, 1, 0, 12, 10, 0, 0, 0, 4,210,
- 0, 4, 0, 19, 0, 4, 10, 1, 1,152, 0, 5, 1,152, 0, 0, 1,152, 0, 1, 0, 0, 9,237, 0, 4, 9,238, 0, 7, 2,133,
- 0, 39, 0, 7, 0,152, 3, 7, 1,147, 9,246, 0, 12, 10, 2, 0, 12, 10, 3, 0, 12, 10, 4, 0, 4, 0, 19, 0, 4, 0,219,
- 1,153, 0, 2, 0, 27, 0, 31, 0, 39, 0, 75, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+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, 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,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, 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,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, 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, 99,114, 65,114,101, 97, 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, 98, 83,
+111,117,110,100, 0, 83,111,117,110,100, 72, 97,110,100,108,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, 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, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 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, 70,114,101,101, 67, 97,109,101,114, 97,
+ 0, 83,112, 97, 99,101, 83,111,117,110,100, 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, 77,111,116,105,111,110, 80, 97,
+116,104, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 80,111,115,101, 67,104, 97,110,110,101,108,
+ 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, 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, 77,105,110, 77, 97,120, 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, 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, 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, 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, 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, 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, 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, 97,116, 97, 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, 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,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, 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,109, 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, 68,114,105,118,101,114, 84,
+ 97,114,103,101,116, 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, 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,100, 3, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 56, 0, 24, 0, 40, 0,120, 0, 12, 0,
+120, 0, 36, 0, 92, 5,128, 1, 0, 0, 0, 0, 0, 0,144, 0, 40, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0, 76, 0,128, 1,
+ 24, 1,140, 0,132, 0,124, 1, 8, 1, 56, 0, 88, 0,184, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0,
+ 16, 0, 92, 1, 0, 0, 0, 0, 0, 0, 24, 1, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0,
+ 24, 0, 76, 0, 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 12, 0, 0, 0, 16, 0, 64, 0, 24, 0,
+ 12, 0, 40, 0, 56, 0, 72, 0, 92, 0,100, 0, 72, 0,100, 0,120, 0, 68, 0, 64, 0,112, 0, 64, 0, 76, 0,176, 0, 48, 0,
+168, 0,152, 0,156, 0, 64, 0, 96, 0,108, 0,188, 0,104, 0,216, 0, 56, 0, 84, 0, 0, 0,132, 0, 28, 0,240, 1,104, 0,
+ 0, 0, 80, 0, 0, 0, 0, 0, 68, 0, 8, 0, 8, 0,220, 0, 80, 0, 76, 0, 68, 0, 68, 0, 64, 0,164, 1,112, 0,108, 0,
+188, 0, 40, 0, 0, 0, 92, 0, 56, 0, 72, 0,120, 0,128, 0,252, 0,208, 0, 0, 0, 92, 0, 0, 0, 16, 0, 0, 0, 0, 0,
+ 0, 0,104, 1, 28, 0,176, 0,144, 0, 52, 0, 16, 0, 72, 0, 0, 4, 56, 0, 20, 0, 16, 0, 92, 0, 80, 0, 24, 0,196, 0,
+ 36, 0, 8, 0,100, 0, 80, 0, 48, 0, 52, 0, 72, 1, 32, 0, 8, 0, 24, 2, 0, 0, 0, 0, 56, 0,216, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,240, 0, 40, 0,148, 0, 48, 0,140, 0,208, 0, 20, 0,224, 0,216, 0,204, 1, 60, 0, 0, 0,112, 0,
+ 0, 0, 4, 1, 12, 0, 12, 0,136, 0,200, 0,124, 2, 80, 2, 40, 0,180, 0,244, 0, 52, 0,148, 2, 28, 0, 80, 0, 24, 0,
+ 16, 1, 32, 0,224, 0, 32, 0, 32, 0, 80, 2, 16, 1, 16, 0,200, 21, 56, 0, 56, 11, 20, 0, 24, 0, 56, 1, 0, 0, 0, 0,
+ 96, 0, 0, 0,248, 0, 0, 0, 32, 0, 80, 0, 28, 0, 16, 0, 8, 0, 52, 0,252, 0,240, 0,168, 1,196, 0, 8, 1, 48, 0,
+ 16, 0, 12, 0, 24, 0, 48, 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, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0,
+ 68, 0, 32, 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 60, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0,
+ 8, 0, 40, 0,196, 0, 24, 0, 4, 1,124, 0, 16, 0, 20, 0, 24, 0,172, 1,104, 0,228, 0, 64, 0, 44, 0, 64, 0,116, 0,
+ 60, 0,104, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 28, 0,
+ 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,208, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0,
+ 12, 0, 16, 1, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 32, 0, 12, 0, 44, 0, 20, 0,
+ 68, 0, 24, 0, 56, 0, 52, 0, 20, 0, 72, 0, 28, 0,180, 0,208, 1, 96, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,
+172, 0, 24, 0, 24, 0,140, 0,148, 0, 56, 0, 0, 0, 0, 0,100, 0, 0, 0, 92, 0, 0, 0, 88, 0, 20, 0, 24, 0, 16, 0,
+ 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 88, 0, 24, 1, 16, 0, 68, 0, 0, 1, 20, 0,160, 0, 88, 0, 96, 0, 88, 0, 20, 0,
+ 56, 0, 48, 0, 68, 0, 56, 0, 92, 0, 64, 0, 56, 0, 96, 0, 0, 0, 0, 0, 83, 84, 82, 67,126, 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, 4, 0, 5, 0, 4, 0, 6, 0, 15, 0, 2, 0,
+ 7, 0, 5, 0, 7, 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, 6, 0, 4, 0, 39, 0, 4, 0, 40, 0,
+ 2, 0, 41, 0, 2, 0, 42, 0, 2, 0, 43, 0, 4, 0, 44, 0, 31, 0, 6, 0, 32, 0, 45, 0, 2, 0, 46, 0, 2, 0, 47, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 48, 0, 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 49, 0, 35, 0, 50, 0,
+ 24, 0, 51, 0, 24, 0, 52, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 56, 0,
+ 2, 0, 19, 0, 2, 0, 57, 0, 7, 0, 11, 0, 7, 0, 12, 0, 4, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 7, 0, 61, 0,
+ 31, 0, 62, 0, 36, 0, 7, 0, 27, 0, 31, 0, 12, 0, 63, 0, 24, 0, 64, 0, 2, 0, 46, 0, 2, 0, 65, 0, 2, 0, 66, 0,
+ 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61, 0, 2, 0, 17, 0, 2, 0, 47, 0,
+ 2, 0, 68, 0, 2, 0, 19, 0, 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71, 0, 0, 0, 20, 0, 0, 0, 72, 0,
+ 7, 0, 73, 0, 7, 0, 74, 0, 38, 0, 13, 0, 27, 0, 31, 0, 39, 0, 75, 0, 37, 0, 76, 0, 0, 0, 77, 0, 4, 0, 78, 0,
+ 7, 0, 61, 0, 12, 0, 79, 0, 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0,
+ 40, 0, 6, 0, 40, 0, 0, 0, 40, 0, 1, 0, 0, 0, 84, 0, 0, 0, 85, 0, 4, 0, 23, 0, 4, 0, 86, 0, 41, 0, 10, 0,
+ 41, 0, 0, 0, 41, 0, 1, 0, 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 43, 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, 20, 0, 27, 0, 31, 0,
+ 39, 0, 75, 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, 7, 0,117, 0, 7, 0,118, 0, 2, 0,119, 0, 2, 0,120, 0,
+ 7, 0,121, 0, 36, 0, 80, 0, 32, 0,122, 0, 45, 0, 13, 0, 4, 0,123, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0,
+ 2, 0,127, 0, 2, 0,128, 0, 2, 0, 19, 0, 2, 0,129, 0, 2, 0,130, 0, 2, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0,
+ 46, 0,134, 0, 47, 0, 32, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,135, 0, 48, 0,136, 0, 49, 0,137, 0, 50, 0,138, 0,
+ 2, 0,129, 0, 2, 0, 19, 0, 2, 0,139, 0, 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,140, 0, 2, 0,141, 0,
+ 2, 0,142, 0, 2, 0,143, 0, 2, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 4, 0,147, 0, 4, 0,148, 0, 43, 0,149, 0,
+ 30, 0,150, 0, 0, 0,151, 0, 7, 0,152, 0, 4, 0,153, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0,
+ 7, 0,158, 0, 7, 0,159, 0, 51, 0, 33, 0, 2, 0,160, 0, 2, 0,161, 0, 2, 0,162, 0, 2, 0,163, 0, 32, 0,164, 0,
+ 52, 0,165, 0, 0, 0,166, 0, 0, 0,167, 0, 0, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 7, 0,171, 0, 7, 0,172, 0,
+ 7, 0,173, 0, 2, 0,174, 0, 2, 0,175, 0, 2, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 0, 0,180, 0,
+ 0, 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, 57, 0, 7, 0,187, 0,
+ 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 53, 0, 15, 0, 0, 0,192, 0, 9, 0,193, 0, 0, 0,194, 0,
+ 0, 0,195, 0, 4, 0,196, 0, 4, 0,197, 0, 9, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 4, 0,202, 0,
+ 9, 0,203, 0, 9, 0,204, 0, 4, 0,205, 0, 4, 0, 37, 0, 54, 0, 6, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0,
+ 7, 0,206, 0, 7, 0, 67, 0, 4, 0, 64, 0, 55, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,207, 0,
+ 54, 0,201, 0, 56, 0, 17, 0, 32, 0,164, 0, 47, 0,208, 0, 57, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 2, 0, 17, 0,
+ 2, 0,212, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,213, 0, 4, 0,214, 0, 2, 0,215, 0, 2, 0,216, 0, 4, 0,129, 0,
+ 4, 0,140, 0, 2, 0,217, 0, 2, 0,218, 0, 58, 0, 23, 0, 2, 0, 19, 0, 2, 0,219, 0, 7, 0,220, 0, 7, 0,221, 0,
+ 2, 0,139, 0, 2, 0,222, 0, 4, 0,223, 0, 4, 0,224, 0, 32, 0,164, 0, 59, 0,225, 0, 2, 0,226, 0, 2, 0,227, 0,
+ 2, 0,228, 0, 9, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 2, 0,232, 0, 2, 0,233, 0, 2, 0,234, 0, 2, 0,235, 0,
+ 7, 0,236, 0, 7, 0,237, 0, 55, 0,238, 0, 60, 0, 10, 0, 4, 0,239, 0, 4, 0,240, 0, 2, 0,241, 0, 2, 0, 19, 0,
+ 4, 0, 37, 0, 32, 0,164, 0, 7, 0,242, 0, 4, 0,243, 0, 0, 0,244, 0, 7, 0,245, 0, 52, 0, 61, 0, 27, 0, 31, 0,
+ 39, 0, 75, 0, 7, 0,246, 0, 7, 0,247, 0, 7, 0,248, 0, 7, 0,249, 0, 7, 0,250, 0, 7, 0,251, 0, 7, 0,252, 0,
+ 7, 0,253, 0, 7, 0,254, 0, 7, 0,255, 0, 7, 0, 0, 1, 7, 0, 1, 1, 7, 0, 2, 1, 7, 0, 3, 1, 7, 0, 4, 1,
+ 7, 0, 5, 1, 7, 0, 6, 1, 7, 0, 7, 1, 7, 0, 8, 1, 7, 0, 9, 1, 2, 0, 10, 1, 2, 0, 11, 1, 2, 0, 12, 1,
+ 2, 0, 13, 1, 2, 0, 14, 1, 2, 0, 15, 1, 2, 0, 16, 1, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,212, 0, 7, 0, 17, 1,
+ 7, 0, 18, 1, 7, 0, 19, 1, 7, 0, 20, 1, 4, 0, 21, 1, 4, 0, 22, 1, 2, 0, 23, 1, 2, 0, 24, 1, 2, 0, 25, 1,
+ 2, 0,127, 0, 4, 0, 23, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 7, 0, 26, 1, 7, 0, 27, 1, 7, 0,188, 0,
+ 45, 0, 28, 1, 61, 0, 29, 1, 36, 0, 80, 0, 47, 0,208, 0, 53, 0, 30, 1, 55, 0,238, 0, 56, 0, 31, 1, 30, 0,150, 0,
+ 58, 0, 32, 1, 60, 0, 33, 1, 0, 0, 34, 1, 0, 0,181, 0, 62, 0, 8, 0, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0,172, 0,
+ 4, 0, 19, 0, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 32, 0, 45, 0, 63, 0, 82, 0, 27, 0, 31, 0, 39, 0, 75, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 40, 1, 2, 0,175, 0, 2, 0, 41, 1, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0,
+ 7, 0,185, 0, 7, 0, 42, 1, 7, 0, 43, 1, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 7, 0, 48, 1,
+ 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1, 7, 0, 52, 1, 64, 0, 53, 1, 2, 0,219, 0, 2, 0, 70, 0, 7, 0,110, 0,
+ 7, 0,111, 0, 7, 0, 54, 1, 7, 0, 55, 1, 7, 0, 56, 1, 2, 0, 57, 1, 2, 0, 58, 1, 2, 0, 59, 1, 2, 0, 60, 1,
+ 0, 0, 61, 1, 0, 0, 62, 1, 2, 0, 63, 1, 2, 0, 64, 1, 2, 0, 65, 1, 2, 0, 66, 1, 2, 0, 67, 1, 7, 0, 68, 1,
+ 7, 0, 69, 1, 7, 0, 70, 1, 7, 0, 71, 1, 2, 0, 72, 1, 2, 0, 43, 0, 2, 0, 73, 1, 2, 0, 74, 1, 2, 0, 75, 1,
+ 2, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1, 7, 0, 83, 1,
+ 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 2, 0, 89, 1, 2, 0, 90, 1, 4, 0, 91, 1,
+ 4, 0, 92, 1, 2, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1, 2, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1, 7, 0, 99, 1,
+ 7, 0,100, 1, 2, 0,101, 1, 2, 0,102, 1, 36, 0, 80, 0, 51, 0,103, 1, 2, 0,104, 1, 2, 0,105, 1, 30, 0,150, 0,
+ 65, 0, 2, 0, 27, 0, 31, 0, 36, 0, 80, 0, 66, 0, 20, 0, 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, 2, 0,114, 1, 2, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1,
+ 7, 0,118, 1, 2, 0,119, 1, 2, 0,120, 1, 2, 0,121, 1, 2, 0,122, 1, 7, 0,123, 1, 7, 0,124, 1, 4, 0,125, 1,
+ 67, 0,130, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,126, 1, 2, 0, 19, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0,
+ 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,
+ 7, 0,135, 1, 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 7, 0,141, 1, 7, 0,142, 1,
+ 7, 0,143, 1, 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 66, 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, 2, 0,155, 1, 2, 0,156, 1, 2, 0,157, 1, 0, 0,158, 1,
+ 0, 0,159, 1, 7, 0,160, 1, 7, 0,161, 1, 2, 0,162, 1, 2, 0,163, 1, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1,
+ 7, 0,167, 1, 2, 0,168, 1, 2, 0,169, 1, 4, 0, 40, 1, 4, 0,170, 1, 2, 0,171, 1, 2, 0,172, 1, 2, 0,173, 1,
+ 2, 0,174, 1, 7, 0,175, 1, 7, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1,
+ 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 0, 0,185, 1, 7, 0,186, 1, 7, 0,187, 1, 7, 0,188, 1, 4, 0,189, 1,
+ 0, 0,190, 1, 0, 0, 73, 1, 0, 0,191, 1, 0, 0, 34, 1, 2, 0,192, 1, 2, 0,193, 1, 2, 0,104, 1, 2, 0,194, 1,
+ 2, 0,195, 1, 2, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1, 7, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 2, 0,160, 0,
+ 2, 0,161, 0, 55, 0,202, 1, 55, 0,203, 1, 0, 0,204, 1, 0, 0,205, 1, 0, 0,206, 1, 0, 0,207, 1, 2, 0,208, 1,
+ 2, 0,209, 1, 7, 0,210, 1, 7, 0,211, 1, 51, 0,103, 1, 61, 0, 29, 1, 36, 0, 80, 0, 68, 0,212, 1, 30, 0,150, 0,
+ 7, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 7, 0,216, 1, 7, 0,217, 1, 2, 0,218, 1, 2, 0, 70, 0, 7, 0,219, 1,
+ 7, 0,220, 1, 7, 0,221, 1, 7, 0,222, 1, 7, 0,223, 1, 7, 0,224, 1, 7, 0,225, 1, 7, 0,226, 1, 7, 0,227, 1,
+ 2, 0,228, 1, 2, 0,229, 1, 7, 0,230, 1, 7, 0,231, 1, 7, 0,232, 1, 7, 0,233, 1, 7, 0,234, 1, 4, 0,235, 1,
+ 4, 0,236, 1, 4, 0,237, 1, 12, 0,238, 1, 69, 0, 4, 0, 27, 0, 31, 0, 0, 0,239, 1, 70, 0, 2, 0, 43, 0,149, 0,
+ 71, 0, 26, 0, 71, 0, 0, 0, 71, 0, 1, 0, 72, 0,240, 1, 4, 0,241, 1, 4, 0,242, 1, 4, 0,243, 1, 4, 0,244, 1,
+ 4, 0,245, 1, 4, 0,246, 1, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,247, 1, 2, 0,248, 1, 7, 0, 5, 0, 7, 0, 6, 0,
+ 7, 0, 7, 0, 7, 0,249, 1, 7, 0,250, 1, 7, 0,251, 1, 7, 0,252, 1, 7, 0,253, 1, 7, 0,254, 1, 7, 0,255, 1,
+ 7, 0, 23, 0, 7, 0, 0, 2, 7, 0, 1, 2, 73, 0, 19, 0, 27, 0, 31, 0, 39, 0, 75, 0, 72, 0,240, 1, 12, 0, 2, 2,
+ 12, 0, 3, 2, 12, 0, 4, 2, 36, 0, 80, 0, 67, 0, 5, 2, 0, 0, 19, 0, 0, 0, 6, 2, 2, 0, 7, 2, 4, 0,174, 0,
+ 7, 0, 35, 1, 7, 0,172, 0, 7, 0, 36, 1, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 71, 0, 11, 2, 35, 0, 11, 0,
+ 7, 0, 12, 2, 7, 0, 13, 2, 7, 0, 14, 2, 7, 0,221, 0, 2, 0, 55, 0, 0, 0, 15, 2, 0, 0, 16, 2, 0, 0, 17, 2,
+ 0, 0, 18, 2, 0, 0, 19, 2, 0, 0, 20, 2, 34, 0, 7, 0, 7, 0, 21, 2, 7, 0, 13, 2, 7, 0, 14, 2, 2, 0, 17, 2,
+ 2, 0, 20, 2, 7, 0,221, 0, 7, 0, 37, 0, 74, 0, 21, 0, 74, 0, 0, 0, 74, 0, 1, 0, 2, 0, 17, 0, 2, 0, 22, 2,
+ 2, 0, 20, 2, 2, 0, 19, 0, 2, 0, 23, 2, 2, 0, 24, 2, 2, 0, 25, 2, 2, 0, 26, 2, 2, 0, 27, 2, 2, 0, 28, 2,
+ 2, 0, 29, 2, 2, 0, 30, 2, 7, 0, 31, 2, 7, 0, 32, 2, 34, 0, 49, 0, 35, 0, 50, 0, 2, 0, 33, 2, 2, 0, 34, 2,
+ 4, 0, 35, 2, 75, 0, 5, 0, 2, 0, 36, 2, 2, 0, 22, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 70, 0, 76, 0, 4, 0,
+ 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 8, 0, 7, 0, 37, 2, 77, 0, 67, 0, 27, 0, 31, 0, 39, 0, 75, 0, 72, 0,240, 1,
+ 12, 0, 38, 2, 12, 0, 3, 2, 12, 0, 39, 2, 32, 0, 40, 2, 32, 0, 41, 2, 32, 0, 42, 2, 36, 0, 80, 0, 78, 0, 43, 2,
+ 38, 0, 44, 2, 67, 0, 5, 2, 12, 0, 45, 2, 7, 0, 35, 1, 7, 0,172, 0, 7, 0, 36, 1, 4, 0,174, 0, 2, 0, 46, 2,
+ 2, 0, 47, 2, 2, 0, 48, 2, 7, 0, 49, 2, 7, 0, 70, 0, 2, 0, 50, 2, 2, 0, 7, 2, 2, 0, 19, 0, 2, 0, 51, 2,
+ 7, 0, 52, 2, 7, 0, 53, 2, 7, 0, 54, 2, 2, 0, 25, 2, 2, 0, 26, 2, 2, 0, 55, 2, 2, 0, 56, 2, 4, 0, 57, 2,
+ 34, 0, 58, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 67, 0, 2, 0, 59, 2, 7, 0, 60, 2, 7, 0, 61, 2, 7, 0, 62, 2,
+ 7, 0, 63, 2, 7, 0, 64, 2, 7, 0, 65, 2, 7, 0, 66, 2, 7, 0, 67, 2, 7, 0, 68, 2, 7, 0, 69, 2, 0, 0, 70, 2,
+ 79, 0, 71, 2, 80, 0, 72, 2, 0, 0, 73, 2, 69, 0, 74, 2, 69, 0, 75, 2, 69, 0, 76, 2, 69, 0, 77, 2, 4, 0, 78, 2,
+ 7, 0, 79, 2, 4, 0, 80, 2, 4, 0, 81, 2, 76, 0, 82, 2, 4, 0, 83, 2, 4, 0, 84, 2, 75, 0, 85, 2, 75, 0, 86, 2,
+ 81, 0, 39, 0, 27, 0, 31, 0, 72, 0,240, 1, 12, 0, 87, 2, 36, 0, 80, 0, 38, 0, 44, 2, 67, 0, 5, 2, 82, 0, 88, 2,
+ 83, 0, 89, 2, 84, 0, 90, 2, 85, 0, 91, 2, 86, 0, 92, 2, 87, 0, 93, 2, 88, 0, 94, 2, 89, 0, 95, 2, 81, 0, 96, 2,
+ 90, 0, 97, 2, 91, 0, 98, 2, 92, 0, 99, 2, 92, 0,100, 2, 92, 0,101, 2, 4, 0, 54, 0, 4, 0,102, 2, 4, 0,103, 2,
+ 4, 0,104, 2, 4, 0,105, 2, 4, 0,174, 0, 7, 0, 35, 1, 7, 0,172, 0, 7, 0, 36, 1, 7, 0,106, 2, 4, 0, 46, 2,
+ 2, 0,107, 2, 2, 0, 19, 0, 2, 0,108, 2, 2, 0,109, 2, 2, 0, 7, 2, 2, 0,110, 2, 93, 0,111, 2, 94, 0,112, 2,
+ 84, 0, 8, 0, 9, 0,113, 2, 7, 0,114, 2, 4, 0,115, 2, 0, 0, 19, 0, 0, 0,116, 2, 2, 0, 40, 1, 2, 0,117, 2,
+ 2, 0,118, 2, 82, 0, 7, 0, 4, 0,119, 2, 4, 0,120, 2, 4, 0,121, 2, 4, 0,122, 2, 2, 0, 22, 2, 0, 0,123, 2,
+ 0, 0, 19, 0, 86, 0, 5, 0, 4, 0,119, 2, 4, 0,120, 2, 0, 0,124, 2, 0, 0,125, 2, 2, 0, 19, 0, 95, 0, 2, 0,
+ 4, 0,126, 2, 7, 0, 14, 2, 87, 0, 3, 0, 95, 0,127, 2, 4, 0,128, 2, 4, 0, 19, 0, 85, 0, 6, 0, 7, 0,129, 2,
+ 2, 0,130, 2, 2, 0, 22, 2, 0, 0, 19, 0, 0, 0,125, 2, 0, 0, 48, 2, 88, 0, 4, 0, 0, 0,206, 0, 0, 0,182, 0,
+ 0, 0,183, 0, 0, 0,184, 0, 96, 0, 6, 0, 47, 0,113, 2, 0, 0, 19, 0, 0, 0,116, 2, 2, 0, 40, 1, 2, 0,117, 2,
+ 2, 0,118, 2, 97, 0, 1, 0, 7, 0,131, 2, 98, 0, 5, 0, 0, 0,206, 0, 0, 0,182, 0, 0, 0,183, 0, 0, 0,184, 0,
+ 4, 0, 37, 0, 89, 0, 1, 0, 7, 0,132, 2, 90, 0, 2, 0, 4, 0,133, 2, 4, 0, 17, 0, 83, 0, 7, 0, 7, 0,114, 2,
+ 47, 0,113, 2, 0, 0, 19, 0, 0, 0,116, 2, 2, 0, 40, 1, 2, 0,117, 2, 2, 0,118, 2, 99, 0, 1, 0, 7, 0,134, 2,
+100, 0, 1, 0, 4, 0,135, 2,101, 0, 1, 0, 0, 0,136, 2,102, 0, 1, 0, 7, 0,114, 2,103, 0, 3, 0, 4, 0,137, 2,
+ 0, 0, 92, 0, 7, 0,138, 2,105, 0, 4, 0, 7, 0,206, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0,106, 0, 1, 0,
+105, 0,115, 2,107, 0, 5, 0, 4, 0,139, 2, 4, 0,140, 2, 0, 0, 19, 0, 0, 0, 22, 2, 0, 0, 48, 2,108, 0, 2, 0,
+ 4, 0,141, 2, 4, 0,140, 2,109, 0, 10, 0,109, 0, 0, 0,109, 0, 1, 0,107, 0,142, 2,106, 0,143, 2,108, 0,144, 2,
+ 4, 0, 54, 0, 4, 0,103, 2, 4, 0,102, 2, 4, 0, 37, 0, 85, 0,145, 2, 93, 0, 14, 0, 12, 0,146, 2, 85, 0,145, 2,
+ 0, 0,147, 2, 0, 0,148, 2, 0, 0,149, 2, 0, 0,150, 2, 0, 0,151, 2, 0, 0,152, 2, 0, 0,153, 2, 0, 0, 19, 0,
+ 92, 0, 99, 2, 92, 0,101, 2, 2, 0,154, 2, 0, 0,155, 2, 94, 0, 8, 0, 4, 0,156, 2, 4, 0,157, 2, 82, 0,158, 2,
+ 86, 0,159, 2, 4, 0,103, 2, 4, 0,102, 2, 4, 0, 54, 0, 4, 0, 37, 0,110, 0, 7, 0,110, 0, 0, 0,110, 0, 1, 0,
+ 4, 0, 17, 0, 4, 0, 40, 1, 0, 0, 20, 0, 46, 0,134, 0, 0, 0,160, 2,111, 0, 7, 0,110, 0,161, 2, 2, 0,162, 2,
+ 2, 0,146, 2, 2, 0,163, 2, 2, 0, 90, 0, 9, 0,164, 2, 9, 0,165, 2,112, 0, 3, 0,110, 0,161, 2, 32, 0,164, 0,
+ 0, 0, 20, 0,113, 0, 5, 0,110, 0,161, 2, 32, 0,164, 0, 0, 0, 20, 0, 2, 0,166, 2, 0, 0,167, 2,114, 0, 5, 0,
+110, 0,161, 2, 7, 0, 88, 0, 7, 0,168, 2, 4, 0,169, 2, 4, 0,170, 2,115, 0, 5, 0,110, 0,161, 2, 32, 0,171, 2,
+ 0, 0, 72, 0, 4, 0, 40, 1, 4, 0, 19, 0,116, 0, 13, 0,110, 0,161, 2, 32, 0,172, 2, 32, 0,173, 2, 32, 0,174, 2,
+ 32, 0,175, 2, 7, 0,176, 2, 7, 0,177, 2, 7, 0,168, 2, 7, 0,178, 2, 4, 0,179, 2, 4, 0,180, 2, 4, 0, 90, 0,
+ 4, 0,181, 2,117, 0, 5, 0,110, 0,161, 2, 2, 0,182, 2, 2, 0, 19, 0, 7, 0,183, 2, 32, 0,184, 2,118, 0, 3, 0,
+110, 0,161, 2, 7, 0,185, 2, 4, 0, 90, 0,119, 0, 10, 0,110, 0,161, 2, 7, 0,186, 2, 4, 0,187, 2, 4, 0, 37, 0,
+ 2, 0, 90, 0, 2, 0,188, 2, 2, 0,189, 2, 2, 0,190, 2, 7, 0,191, 2, 0, 0,192, 2,120, 0, 3, 0,110, 0,161, 2,
+ 7, 0, 37, 0, 4, 0, 17, 0,121, 0, 6, 0,110, 0,161, 2,122, 0,193, 2,123, 0,194, 2,124, 0,195, 2, 7, 0,196, 2,
+ 4, 0, 17, 0,125, 0, 11, 0,110, 0,161, 2, 52, 0,197, 2, 7, 0,198, 2, 4, 0,199, 2, 0, 0,192, 2, 7, 0,200, 2,
+ 4, 0,201, 2, 32, 0,202, 2, 0, 0,203, 2, 4, 0,204, 2, 4, 0, 37, 0,126, 0, 10, 0,110, 0,161, 2, 32, 0,205, 2,
+ 47, 0,206, 2, 4, 0, 90, 0, 4, 0,207, 2, 7, 0,208, 2, 7, 0,209, 2, 0, 0,203, 2, 4, 0,204, 2, 4, 0, 37, 0,
+127, 0, 3, 0,110, 0,161, 2, 7, 0,210, 2, 4, 0,211, 2,128, 0, 5, 0,110, 0,161, 2, 7, 0,212, 2, 0, 0,192, 2,
+ 2, 0, 19, 0, 2, 0,213, 2,129, 0, 8, 0,110, 0,161, 2, 32, 0,164, 0, 7, 0,212, 2, 7, 0,221, 0, 7, 0,106, 0,
+ 0, 0,192, 2, 2, 0, 19, 0, 2, 0, 17, 0,130, 0, 21, 0,110, 0,161, 2, 32, 0,214, 2, 0, 0,192, 2, 52, 0,197, 2,
+ 32, 0,202, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,215, 2, 7, 0,216, 2, 7, 0,217, 2, 7, 0, 52, 2, 7, 0,218, 2,
+ 7, 0,219, 2, 7, 0,220, 2, 7, 0,221, 2, 4, 0,201, 2, 4, 0,204, 2, 0, 0,203, 2, 7, 0,222, 2, 7, 0,223, 2,
+ 7, 0, 43, 0,131, 0, 7, 0,110, 0,161, 2, 2, 0,224, 2, 2, 0,225, 2, 4, 0, 70, 0, 32, 0,164, 0, 7, 0,226, 2,
+ 0, 0,192, 2,132, 0, 10, 0,110, 0,161, 2, 32, 0,164, 0, 0, 0,227, 2, 7, 0,228, 2, 7, 0,229, 2, 7, 0,221, 2,
+ 4, 0,230, 2, 4, 0,231, 2, 7, 0,232, 2, 0, 0, 20, 0,133, 0, 1, 0,110, 0,161, 2,134, 0, 7, 0,110, 0,161, 2,
+ 46, 0,134, 0,135, 0,233, 2,136, 0,234, 2,137, 0,235, 2,138, 0,236, 2, 12, 0,237, 2,139, 0, 14, 0,110, 0,161, 2,
+ 85, 0,238, 2, 85, 0,239, 2, 85, 0,240, 2, 85, 0,241, 2, 85, 0,242, 2, 85, 0,243, 2, 82, 0,244, 2, 4, 0,245, 2,
+ 4, 0,246, 2, 2, 0,108, 1, 2, 0, 37, 0, 7, 0,196, 2,140, 0,247, 2,141, 0, 7, 0,110, 0,161, 2, 85, 0,238, 2,
+ 85, 0,248, 2,142, 0,249, 2,143, 0,247, 2, 4, 0,250, 2, 4, 0,245, 2,144, 0, 4, 0,110, 0,161, 2, 32, 0,164, 0,
+ 4, 0,251, 2, 4, 0, 37, 0,145, 0, 2, 0, 4, 0,252, 2, 7, 0, 14, 2,146, 0, 2, 0, 4, 0,125, 0, 4, 0,253, 2,
+147, 0, 20, 0,110, 0,161, 2, 32, 0,164, 0, 0, 0,192, 2, 2, 0,254, 2, 2, 0,255, 2, 2, 0, 19, 0, 2, 0, 37, 0,
+ 7, 0, 0, 3, 7, 0, 1, 3, 4, 0, 54, 0, 4, 0, 2, 3,146, 0, 3, 3,145, 0, 4, 3, 4, 0, 5, 3, 4, 0, 6, 3,
+ 4, 0, 7, 3, 4, 0,253, 2, 7, 0, 8, 3, 7, 0, 9, 3, 7, 0, 10, 3,148, 0, 8, 0,110, 0,161, 2, 59, 0,225, 0,
+142, 0,249, 2, 4, 0, 11, 3, 4, 0, 12, 3, 4, 0, 13, 3, 2, 0, 19, 0, 2, 0, 57, 0,149, 0, 8, 0,110, 0,161, 2,
+ 32, 0, 45, 0, 2, 0, 14, 3, 2, 0, 19, 0, 2, 0,182, 2, 2, 0, 57, 0, 7, 0, 15, 3, 7, 0, 16, 3,150, 0, 5, 0,
+110, 0,161, 2, 4, 0, 17, 3, 2, 0, 19, 0, 2, 0, 18, 3, 7, 0, 19, 3,151, 0, 7, 0,110, 0,161, 2, 85, 0, 20, 3,
+ 4, 0, 21, 3, 0, 0, 22, 3, 0, 0, 23, 3, 0, 0, 24, 3, 0, 0, 25, 3,152, 0, 3, 0,110, 0,161, 2,153, 0, 26, 3,
+138, 0,236, 2,154, 0, 10, 0,110, 0,161, 2, 32, 0, 27, 3, 32, 0, 28, 3, 0, 0, 29, 3, 7, 0, 30, 3, 2, 0, 31, 3,
+ 2, 0, 32, 3, 0, 0, 33, 3, 0, 0, 34, 3, 0, 0,167, 2,155, 0, 9, 0,110, 0,161, 2, 32, 0, 35, 3, 0, 0, 29, 3,
+ 7, 0, 36, 3, 7, 0, 37, 3, 0, 0, 40, 1, 0, 0,182, 2, 0, 0, 38, 3, 0, 0, 37, 0,156, 0, 27, 0, 27, 0, 31, 0,
+ 2, 0, 23, 2, 2, 0, 24, 2, 2, 0, 39, 3, 2, 0, 19, 0, 2, 0, 40, 3, 2, 0, 41, 3, 2, 0, 42, 3, 2, 0, 70, 0,
+ 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 45, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 46, 3, 7, 0, 47, 3, 7, 0, 48, 3,
+ 7, 0, 49, 3, 7, 0, 50, 3, 7, 0, 51, 3, 34, 0, 52, 3, 36, 0, 80, 0, 38, 0, 44, 2, 87, 0, 93, 2, 7, 0, 53, 3,
+ 7, 0, 54, 3,156, 0, 55, 3,157, 0, 3, 0,157, 0, 0, 0,157, 0, 1, 0, 0, 0, 20, 0, 72, 0, 3, 0, 7, 0, 56, 3,
+ 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,116, 0, 27, 0, 31, 0, 39, 0, 75, 0,158, 0, 57, 3, 2, 0, 17, 0, 2, 0, 58, 3,
+ 4, 0, 59, 3, 4, 0, 60, 3, 4, 0, 61, 3, 0, 0, 62, 3, 32, 0, 38, 0, 32, 0, 63, 3, 32, 0, 64, 3, 32, 0, 65, 3,
+ 32, 0, 66, 3, 36, 0, 80, 0, 78, 0, 43, 2, 72, 0,240, 1,159, 0, 67, 3,159, 0, 68, 3,160, 0, 69, 3, 9, 0, 2, 0,
+161, 0, 70, 3, 12, 0, 71, 3, 12, 0, 87, 2, 12, 0, 3, 2, 12, 0, 72, 3, 12, 0, 73, 3, 4, 0, 40, 1, 4, 0, 74, 3,
+ 67, 0, 5, 2, 0, 0, 75, 3, 4, 0, 7, 2, 4, 0, 76, 3, 7, 0, 35, 1, 7, 0, 77, 3, 7, 0, 78, 3, 7, 0,172, 0,
+ 7, 0, 79, 3, 7, 0, 36, 1, 7, 0, 80, 3, 7, 0, 81, 3, 7, 0,228, 2, 7, 0, 82, 3, 7, 0,210, 0, 4, 0, 83, 3,
+ 2, 0, 19, 0, 2, 0, 84, 3, 2, 0, 85, 3, 2, 0, 86, 3, 2, 0, 87, 3, 2, 0, 88, 3, 2, 0, 89, 3, 2, 0, 90, 3,
+ 2, 0, 91, 3, 2, 0, 92, 3, 2, 0, 93, 3, 2, 0, 94, 3, 4, 0, 95, 3, 4, 0, 96, 3, 4, 0, 97, 3, 4, 0, 98, 3,
+ 7, 0, 99, 3, 7, 0, 79, 2, 7, 0,100, 3, 7, 0,101, 3, 7, 0,102, 3, 7, 0,103, 3, 7, 0,104, 3, 7, 0,105, 3,
+ 7, 0,106, 3, 7, 0,107, 3, 7, 0,108, 3, 7, 0,109, 3, 0, 0,110, 3, 0, 0,111, 3, 0, 0,112, 3, 0, 0,113, 3,
+ 7, 0,114, 3, 7, 0,115, 3, 12, 0,116, 3, 12, 0,117, 3, 12, 0,118, 3, 12, 0,119, 3, 7, 0,120, 3, 2, 0,133, 2,
+ 2, 0,121, 3, 7, 0,115, 2, 4, 0,122, 3, 4, 0,123, 3,162, 0,124, 3, 2, 0,125, 3, 2, 0,217, 0, 7, 0,126, 3,
+ 12, 0,127, 3, 12, 0,128, 3, 12, 0,129, 3, 12, 0,130, 3,163, 0, 32, 1,164, 0,131, 3, 68, 0,132, 3, 2, 0,133, 3,
+ 2, 0,134, 3, 2, 0,135, 3, 2, 0,136, 3, 7, 0,107, 2, 2, 0,137, 3, 2, 0,138, 3,153, 0,139, 3,142, 0,140, 3,
+142, 0,141, 3, 4, 0,142, 3, 4, 0,143, 3, 4, 0,144, 3, 4, 0, 70, 0, 12, 0,145, 3, 12, 0,146, 3,165, 0, 14, 0,
+165, 0, 0, 0,165, 0, 1, 0, 32, 0, 38, 0, 7, 0,228, 2, 7, 0, 37, 1, 7, 0,229, 2, 7, 0,221, 2, 0, 0, 20, 0,
+ 4, 0,230, 2, 4, 0,231, 2, 4, 0,147, 3, 2, 0, 17, 0, 2, 0,148, 3, 7, 0,232, 2,163, 0, 36, 0, 2, 0,149, 3,
+ 2, 0,150, 3, 2, 0, 19, 0, 2, 0,221, 2, 7, 0,151, 3, 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3, 7, 0,155, 3,
+ 7, 0,156, 3, 7, 0,157, 3, 7, 0,158, 3, 7, 0,159, 3, 7, 0,160, 3, 7, 0,161, 3, 7, 0,162, 3, 7, 0,163, 3,
+ 7, 0,164, 3, 7, 0,165, 3, 7, 0,166, 3, 7, 0,167, 3, 7, 0,168, 3, 7, 0,169, 3, 7, 0,170, 3, 7, 0,171, 3,
+ 7, 0,172, 3, 7, 0,173, 3, 7, 0,174, 3, 2, 0,175, 3, 2, 0,176, 3, 2, 0,177, 3, 2, 0,178, 3, 52, 0,165, 0,
+166, 0,179, 3, 7, 0,180, 3, 4, 0,170, 2,167, 0, 9, 0,167, 0, 0, 0,167, 0, 1, 0, 4, 0,181, 3, 4, 0,182, 3,
+ 4, 0,183, 3, 4, 0, 19, 0, 4, 0,184, 3, 9, 0,185, 3, 9, 0,186, 3,138, 0, 19, 0,138, 0, 0, 0,138, 0, 1, 0,
+ 4, 0, 19, 0, 4, 0,187, 3, 4, 0,188, 3, 4, 0,189, 3, 4, 0,190, 3, 4, 0,191, 3, 4, 0,192, 3, 4, 0,182, 3,
+ 4, 0,133, 2, 4, 0, 57, 0, 0, 0,193, 3, 0, 0,194, 3, 0, 0,195, 3, 0, 0,196, 3, 12, 0,197, 3,168, 0,198, 3,
+ 9, 0,199, 3,169, 0, 1, 0, 7, 0, 21, 2,162, 0, 30, 0, 4, 0, 19, 0, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3,
+ 4, 0,203, 3, 4, 0,204, 3, 4, 0,205, 3, 4, 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, 4, 0,225, 3, 4, 0,226, 3,
+ 7, 0,227, 3, 7, 0,106, 3,164, 0, 49, 0, 4, 0,182, 3, 4, 0,228, 3,170, 0,229, 3,171, 0,230, 3, 0, 0, 37, 0,
+ 0, 0,231, 3, 2, 0,232, 3, 7, 0,233, 3, 0, 0,234, 3, 7, 0,235, 3, 7, 0,236, 3, 7, 0,237, 3, 7, 0,238, 3,
+ 7, 0,239, 3, 7, 0,240, 3, 7, 0,241, 3, 7, 0,242, 3, 7, 0,243, 3, 2, 0,244, 3, 0, 0,245, 3, 2, 0,246, 3,
+ 7, 0,247, 3, 7, 0,248, 3, 0, 0,249, 3, 4, 0,126, 0, 4, 0,250, 3, 4, 0,251, 3, 2, 0,252, 3, 2, 0,253, 3,
+169, 0,254, 3, 4, 0,255, 3, 4, 0, 82, 0, 7, 0, 0, 4, 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 2, 0, 4, 4,
+ 2, 0, 5, 4, 2, 0, 6, 4, 2, 0, 7, 4, 2, 0, 8, 4, 2, 0, 9, 4, 2, 0, 10, 4, 2, 0, 11, 4,172, 0, 12, 4,
+ 7, 0, 13, 4, 7, 0, 14, 4,138, 0, 15, 4, 12, 0,237, 2,153, 0, 48, 0, 2, 0, 17, 0, 2, 0, 16, 4, 2, 0, 17, 4,
+ 2, 0, 18, 4, 7, 0, 19, 4, 2, 0, 20, 4, 2, 0, 21, 4, 7, 0, 22, 4, 2, 0, 23, 4, 2, 0, 24, 4, 7, 0, 25, 4,
+ 7, 0, 26, 4, 7, 0, 27, 4, 7, 0, 28, 4, 7, 0, 29, 4, 7, 0, 30, 4, 4, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4,
+ 7, 0, 34, 4, 81, 0, 35, 4, 81, 0, 36, 4, 81, 0, 37, 4, 0, 0, 38, 4, 7, 0, 39, 4, 7, 0, 40, 4, 36, 0, 80, 0,
+ 2, 0, 41, 4, 0, 0, 42, 4, 0, 0, 43, 4, 7, 0, 44, 4, 4, 0, 45, 4, 7, 0, 46, 4, 7, 0, 47, 4, 4, 0, 48, 4,
+ 4, 0, 19, 0, 7, 0, 49, 4, 7, 0, 50, 4, 7, 0, 51, 4, 85, 0, 52, 4, 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4,
+ 7, 0, 56, 4, 7, 0, 57, 4, 7, 0, 58, 4, 7, 0, 59, 4, 4, 0, 60, 4,173, 0, 73, 0, 27, 0, 31, 0, 39, 0, 75, 0,
+ 2, 0,175, 0, 2, 0, 41, 1, 2, 0, 73, 1, 2, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4, 7, 0, 64, 4, 7, 0, 65, 4,
+ 7, 0, 66, 4, 7, 0, 67, 4, 7, 0, 68, 4, 7, 0, 69, 4, 7, 0,133, 1, 7, 0,135, 1, 7, 0,134, 1, 7, 0, 70, 4,
+ 4, 0, 71, 4, 7, 0, 72, 4, 7, 0, 73, 4, 7, 0, 74, 4, 7, 0, 75, 4, 7, 0, 76, 4, 7, 0, 77, 4, 7, 0, 78, 4,
+ 2, 0, 79, 4, 2, 0, 40, 1, 2, 0, 80, 4, 2, 0, 81, 4, 2, 0, 82, 4, 2, 0, 83, 4, 2, 0, 84, 4, 2, 0, 85, 4,
+ 7, 0, 86, 4, 7, 0, 87, 4, 7, 0, 88, 4, 7, 0, 89, 4, 7, 0, 90, 4, 7, 0, 91, 4, 7, 0, 92, 4, 7, 0, 93, 4,
+ 7, 0, 94, 4, 7, 0, 95, 4, 7, 0, 96, 4, 7, 0, 97, 4, 2, 0, 98, 4, 2, 0, 99, 4, 2, 0,100, 4, 2, 0,101, 4,
+ 7, 0,102, 4, 7, 0,103, 4, 7, 0,104, 4, 7, 0,105, 4, 2, 0,106, 4, 2, 0,107, 4, 2, 0,108, 4, 2, 0,109, 4,
+ 7, 0,110, 4, 7, 0,111, 4, 7, 0,112, 4, 7, 0,113, 4, 2, 0,114, 4, 2, 0,115, 4, 2, 0,116, 4, 2, 0, 19, 0,
+ 7, 0,117, 4, 7, 0,118, 4, 36, 0, 80, 0, 51, 0,103, 1, 2, 0,104, 1, 2, 0,105, 1, 30, 0,150, 0,174, 0, 8, 0,
+174, 0, 0, 0,174, 0, 1, 0, 4, 0, 83, 3, 4, 0,119, 4, 4, 0, 19, 0, 2, 0,120, 4, 2, 0,121, 4, 32, 0,164, 0,
+175, 0, 13, 0, 9, 0,122, 4, 9, 0,123, 4, 4, 0,124, 4, 4, 0,125, 4, 4, 0,126, 4, 4, 0,127, 4, 4, 0,128, 4,
+ 4, 0,129, 4, 4, 0,130, 4, 4, 0,131, 4, 4, 0,132, 4, 4, 0, 37, 0, 0, 0,133, 4,176, 0, 5, 0, 9, 0,134, 4,
+ 9, 0,135, 4, 4, 0,136, 4, 4, 0, 70, 0, 0, 0,137, 4,177, 0, 13, 0, 4, 0, 17, 0, 4, 0,138, 4, 4, 0,139, 4,
+ 4, 0,140, 4, 4, 0,141, 4, 4, 0,142, 4, 4, 0, 90, 0, 4, 0,143, 4, 4, 0,144, 4, 4, 0,145, 4, 4, 0,146, 4,
+ 4, 0,147, 4, 26, 0, 30, 0,178, 0, 4, 0, 4, 0,148, 4, 7, 0,149, 4, 2, 0, 19, 0, 2, 0,105, 1,179, 0, 11, 0,
+179, 0, 0, 0,179, 0, 1, 0, 0, 0, 20, 0, 67, 0,150, 4, 68, 0,151, 4, 4, 0, 83, 3, 4, 0,152, 4, 4, 0,153, 4,
+ 4, 0, 37, 0, 4, 0,154, 4, 4, 0,155, 4,180, 0,132, 0,175, 0,156, 4,176, 0,157, 4,177, 0,158, 4,178, 0,159, 4,
+ 4, 0,250, 2, 4, 0,126, 0, 4, 0,250, 3, 4, 0,160, 4, 4, 0,161, 4, 4, 0,162, 4, 4, 0,163, 4, 2, 0, 19, 0,
+ 2, 0,164, 4, 7, 0, 79, 2, 7, 0,165, 4, 7, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 2, 0,170, 4,
+ 2, 0,171, 4, 2, 0,172, 4, 2, 0,173, 4, 2, 0,216, 0, 2, 0,174, 4, 2, 0,175, 4, 2, 0,178, 3, 2, 0,176, 4,
+ 2, 0,177, 4, 2, 0, 60, 1, 2, 0,106, 0, 2, 0,178, 4, 2, 0,179, 4, 2, 0,180, 4, 2, 0,181, 4, 2, 0,182, 4,
+ 2, 0,183, 4, 2, 0,184, 4, 2, 0,185, 4, 2, 0,186, 4, 2, 0, 61, 1, 2, 0,187, 4, 2, 0,188, 4, 2, 0,189, 4,
+ 2, 0,190, 4, 4, 0,191, 4, 4, 0, 40, 1, 2, 0,192, 4, 2, 0,193, 4, 2, 0,194, 4, 2, 0,195, 4, 2, 0,196, 4,
+ 2, 0,197, 4, 24, 0,198, 4, 24, 0,199, 4, 23, 0,200, 4, 12, 0,201, 4, 2, 0,202, 4, 2, 0, 37, 0, 7, 0,203, 4,
+ 7, 0,204, 4, 7, 0,205, 4, 7, 0,206, 4, 4, 0,207, 4, 7, 0,208, 4, 7, 0,209, 4, 7, 0,210, 4, 7, 0,211, 4,
+ 2, 0,212, 4, 2, 0,213, 4, 2, 0,214, 4, 2, 0,215, 4, 2, 0,216, 4, 2, 0,217, 4, 7, 0,218, 4, 7, 0,219, 4,
+ 7, 0,220, 4, 2, 0,221, 4, 2, 0,222, 4, 2, 0,223, 4, 2, 0,224, 4, 2, 0,225, 4, 2, 0,226, 4, 2, 0,227, 4,
+ 2, 0,228, 4, 2, 0,229, 4, 2, 0,230, 4, 4, 0,231, 4, 4, 0,232, 4, 4, 0,233, 4, 4, 0,234, 4, 4, 0,235, 4,
+ 7, 0,236, 4, 4, 0,237, 4, 4, 0,238, 4, 4, 0,239, 4, 4, 0,240, 4, 7, 0,241, 4, 7, 0,242, 4, 7, 0,243, 4,
+ 7, 0,244, 4, 7, 0,245, 4, 7, 0,246, 4, 7, 0,247, 4, 7, 0,248, 4, 7, 0,249, 4, 0, 0,250, 4, 0, 0,251, 4,
+ 4, 0,252, 4, 2, 0,253, 4, 2, 0,209, 1, 0, 0,254, 4, 7, 0,255, 4, 7, 0, 0, 5, 4, 0, 1, 5, 4, 0, 2, 5,
+ 7, 0, 3, 5, 7, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5, 7, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 4, 0, 10, 5,
+ 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0, 14, 5, 7, 0, 15, 5, 7, 0, 70, 0, 42, 0, 16, 5, 0, 0, 17, 5,
+181, 0, 9, 0,181, 0, 0, 0,181, 0, 1, 0, 0, 0, 20, 0, 2, 0, 18, 5, 2, 0, 19, 5, 2, 0, 20, 5, 2, 0, 43, 0,
+ 7, 0, 21, 5, 7, 0, 70, 0,182, 0, 7, 0, 2, 0,187, 2, 2, 0, 40, 1, 2, 0,109, 0, 2, 0, 22, 5, 7, 0, 23, 5,
+ 7, 0, 70, 0, 42, 0, 24, 5,183, 0, 5, 0, 7, 0, 25, 5, 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,209, 1,
+184, 0, 26, 0, 7, 0, 77, 4, 7, 0, 78, 4, 2, 0, 40, 1, 2, 0, 19, 0, 2, 0, 26, 5, 2, 0,105, 1, 2, 0, 80, 4,
+ 2, 0, 81, 4, 2, 0, 82, 4, 2, 0, 83, 4, 2, 0, 84, 4, 2, 0, 85, 4,183, 0, 27, 5, 2, 0,170, 4, 2, 0,171, 4,
+ 2, 0,172, 4, 2, 0,173, 4, 2, 0,216, 0, 2, 0,174, 4, 2, 0,175, 4, 2, 0,178, 3,182, 0, 28, 5, 2, 0, 29, 5,
+ 2, 0,176, 4, 2, 0,179, 4, 2, 0,180, 4,185, 0, 5, 0,185, 0, 0, 0,185, 0, 1, 0, 4, 0,181, 3, 0, 0,193, 3,
+ 4, 0, 19, 0,186, 0, 6, 0,187, 0, 30, 5, 4, 0, 31, 5, 4, 0, 32, 5, 9, 0, 33, 5, 0, 0, 34, 5, 4, 0, 37, 0,
+188, 0, 6, 0,186, 0, 35, 5, 2, 0, 19, 0, 2, 0, 36, 5, 2, 0, 37, 5, 2, 0, 38, 5, 9, 0, 39, 5,189, 0, 4, 0,
+ 2, 0,106, 0, 2, 0,198, 2, 2, 0,187, 3, 2, 0, 40, 5,190, 0, 14, 0, 2, 0, 19, 0, 2, 0, 41, 5, 2, 0, 42, 5,
+ 2, 0, 43, 5,189, 0, 44, 5, 9, 0, 39, 5, 7, 0, 45, 5, 7, 0, 57, 0, 4, 0, 46, 5, 4, 0, 47, 5, 4, 0, 48, 5,
+ 4, 0, 49, 5, 46, 0,134, 0, 32, 0,164, 0,191, 0, 4, 0,191, 0, 0, 0,191, 0, 1, 0, 0, 0, 50, 5, 7, 0, 51, 5,
+192, 0, 6, 0,186, 0, 35, 5, 7, 0, 52, 5, 4, 0, 90, 0, 0, 0, 53, 5, 0, 0, 54, 5, 0, 0,167, 2,193, 0, 9, 0,
+186, 0, 35, 5, 7, 0, 55, 5, 7, 0, 56, 5, 2, 0, 40, 1, 2, 0, 19, 0, 4, 0, 36, 0, 4, 0, 57, 5, 87, 0, 58, 5,
+ 9, 0, 39, 5,194, 0, 72, 0,193, 0, 59, 5,193, 0, 60, 5,192, 0, 57, 3, 7, 0, 61, 5, 2, 0, 62, 5, 2, 0, 63, 5,
+ 7, 0, 64, 5, 7, 0, 65, 5, 2, 0,187, 3, 2, 0, 66, 5, 7, 0, 67, 5, 7, 0, 68, 5, 7, 0, 69, 5, 2, 0, 70, 5,
+ 2, 0, 46, 5, 2, 0, 71, 5, 2, 0, 72, 5, 2, 0, 73, 5, 2, 0, 74, 5, 7, 0, 75, 5, 7, 0, 76, 5, 7, 0, 77, 5,
+ 2, 0, 78, 5, 2, 0, 79, 5, 2, 0, 80, 5, 2, 0, 81, 5, 2, 0, 82, 5, 2, 0, 83, 5, 2, 0, 84, 5,188, 0, 85, 5,
+190, 0, 86, 5, 7, 0, 87, 5, 7, 0, 88, 5, 7, 0, 89, 5, 2, 0, 90, 5, 2, 0, 91, 5, 0, 0, 92, 5, 0, 0, 93, 5,
+ 0, 0, 94, 5, 0, 0, 95, 5, 0, 0, 96, 5, 0, 0, 97, 5, 2, 0, 98, 5, 7, 0, 99, 5, 7, 0,100, 5, 7, 0,101, 5,
+ 7, 0,102, 5, 7, 0,103, 5, 7, 0,104, 5, 7, 0,105, 5, 7, 0,106, 5, 7, 0,107, 5, 7, 0,108, 5, 2, 0,109, 5,
+ 0, 0,110, 5, 0, 0,111, 5, 0, 0,112, 5, 0, 0,113, 5, 32, 0,114, 5, 0, 0,115, 5, 0, 0,116, 5, 0, 0,117, 5,
+ 0, 0,118, 5, 0, 0,119, 5, 0, 0,120, 5, 0, 0,121, 5, 0, 0,122, 5, 2, 0,123, 5, 2, 0,124, 5, 2, 0,125, 5,
+ 2, 0,126, 5, 2, 0,127, 5,195, 0, 8, 0, 4, 0,128, 5, 4, 0,129, 5, 4, 0,130, 5, 4, 0,131, 5, 4, 0,132, 5,
+ 4, 0,133, 5, 4, 0, 54, 0, 4, 0,103, 2,196, 0, 3, 0, 7, 0,134, 5, 2, 0,135, 5, 2, 0, 19, 0, 46, 0, 37, 0,
+ 27, 0, 31, 0, 39, 0, 75, 0, 32, 0,136, 5,173, 0,137, 5, 46, 0,138, 5, 47, 0,208, 0, 12, 0,139, 5,174, 0,140, 5,
+ 32, 0,141, 5, 7, 0,142, 5, 7, 0,143, 5, 7, 0,144, 5, 7, 0,145, 5, 4, 0, 83, 3, 2, 0, 19, 0, 2, 0, 34, 1,
+ 61, 0, 29, 1,197, 0,146, 5,194, 0,147, 5,198, 0,148, 5,180, 0,182, 0,178, 0,159, 4, 12, 0,100, 0, 12, 0,149, 5,
+ 12, 0,150, 5,199, 0,151, 5, 2, 0,152, 5, 2, 0,153, 5, 2, 0,217, 0, 2, 0,154, 5, 4, 0,155, 5, 4, 0,156, 5,
+ 12, 0,157, 5,183, 0, 27, 5,184, 0,158, 5,196, 0,159, 5,161, 0, 70, 3,200, 0, 6, 0, 47, 0,208, 0, 45, 0, 28, 1,
+ 7, 0, 67, 2, 7, 0, 68, 2, 7, 0,106, 0, 7, 0,160, 5,201, 0, 35, 0, 7, 0,161, 5, 7, 0,162, 5, 7, 0,163, 5,
+ 7, 0,164, 5, 7, 0,165, 5, 7, 0,166, 5, 7, 0,167, 5, 7, 0,168, 5, 7, 0,169, 5, 7, 0, 47, 1, 7, 0,170, 5,
+ 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,171, 0, 2, 0,174, 5, 2, 0,175, 5, 4, 0,176, 5, 2, 0,177, 5,
+ 2, 0,178, 5, 2, 0,179, 5, 2, 0,180, 5, 7, 0,181, 5, 72, 0,182, 5,161, 0, 70, 3,201, 0,183, 5,202, 0,184, 5,
+203, 0,185, 5,204, 0,186, 5,205, 0,187, 5,206, 0,188, 5, 7, 0,189, 5, 2, 0,190, 5, 2, 0,191, 5, 4, 0,209, 1,
+207, 0, 54, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5, 7, 0,169, 5,
+ 7, 0, 47, 1, 7, 0, 43, 0, 4, 0,196, 5, 2, 0,179, 5, 2, 0,180, 5, 32, 0,136, 5, 32, 0,197, 5,200, 0,198, 5,
+207, 0,183, 5, 0, 0,199, 5, 4, 0, 83, 3, 4, 0,200, 5, 2, 0,201, 5, 2, 0,202, 5, 2, 0,203, 5, 2, 0,204, 5,
+ 2, 0,209, 1, 2, 0, 19, 0, 2, 0, 6, 2, 2, 0,205, 5, 7, 0,112, 0, 7, 0,206, 5, 7, 0,207, 5, 7, 0,208, 5,
+ 7, 0,209, 5, 7, 0,210, 5, 7, 0,171, 0, 7, 0,142, 5, 2, 0,211, 5, 2, 0, 90, 1, 2, 0,212, 5, 2, 0,213, 5,
+ 2, 0,214, 5, 2, 0,215, 5, 2, 0,216, 5, 2, 0,217, 5, 2, 0,218, 5, 2, 0,219, 5, 4, 0,220, 5, 12, 0,221, 5,
+ 2, 0,222, 5, 2, 0,116, 2, 2, 0,223, 5, 0, 0,224, 5, 0, 0,225, 5, 9, 0,226, 5,161, 0, 70, 3,209, 0, 25, 0,
+ 24, 0, 36, 0, 24, 0, 64, 0, 23, 0,227, 5, 23, 0,228, 5, 23, 0,229, 5, 7, 0,230, 5, 7, 0,231, 5, 7, 0,232, 5,
+ 7, 0,233, 5, 2, 0,234, 5, 2, 0,235, 5, 2, 0,236, 5, 2, 0,237, 5, 2, 0,238, 5, 2, 0, 19, 0, 2, 0,239, 5,
+ 2, 0,240, 5, 2, 0,241, 5, 2, 0,242, 5, 2, 0,243, 5, 2, 0,204, 5, 7, 0,244, 5, 7, 0,245, 5, 4, 0,246, 5,
+ 4, 0,247, 5,208, 0, 6, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,
+210, 0, 8, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,211, 0,248, 5,
+ 46, 0,134, 0,212, 0, 14, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,
+209, 0,249, 5,213, 0,250, 5, 12, 0,251, 5, 2, 0, 40, 1, 2, 0, 19, 0, 2, 0,252, 5, 0, 0,253, 5, 0, 0,254, 5,
+214, 0, 20, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,202, 0,184, 5,
+209, 0,249, 5, 2, 0,255, 5, 2, 0, 0, 6, 2, 0, 1, 6, 2, 0, 2, 6, 2, 0,239, 5, 2, 0, 3, 6, 0, 0, 19, 0,
+ 0, 0,105, 1, 9, 0, 43, 2, 4, 0, 4, 6, 4, 0, 5, 6, 27, 0, 6, 6,215, 0, 16, 0,208, 0, 0, 0,208, 0, 1, 0,
+ 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,209, 0,249, 5, 7, 0, 67, 2, 7, 0, 68, 2, 2, 0,255, 5,
+ 2, 0, 7, 6, 2, 0, 8, 6, 2, 0, 9, 6, 4, 0, 19, 0, 7, 0, 10, 6,161, 0, 70, 3,216, 0, 16, 0, 0, 0, 11, 6,
+ 0, 0, 12, 6, 0, 0, 13, 6, 0, 0, 14, 6, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 15, 6, 2, 0, 16, 6, 2, 0,152, 1,
+ 2, 0, 17, 6, 4, 0, 18, 6, 4, 0, 19, 6, 2, 0, 20, 6, 2, 0, 21, 6, 0, 0, 22, 6, 0, 0, 23, 6,217, 0, 16, 0,
+208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 4, 0, 37, 0,216, 0, 24, 6,218, 0, 25, 6, 12, 0, 26, 6,
+ 12, 0, 27, 6,219, 0, 28, 6,206, 0, 29, 6,220, 0, 30, 6, 2, 0, 31, 6, 2, 0, 32, 6, 2, 0, 33, 6, 2, 0, 70, 0,
+221, 0, 17, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,209, 0,249, 5,
+ 12, 0, 34, 6,222, 0, 35, 6, 0, 0, 36, 6,223, 0, 37, 6, 4, 0, 38, 6, 4, 0, 39, 6, 2, 0, 19, 0, 2, 0, 40, 6,
+ 2, 0, 41, 6, 2, 0, 37, 0,224, 0, 29, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5,
+ 2, 0,195, 5, 47, 0,206, 2, 45, 0, 28, 1, 64, 0, 42, 6, 2, 0,133, 0, 2, 0, 43, 6, 2, 0, 70, 0, 2, 0, 44, 6,
+ 4, 0, 19, 0, 2, 0, 45, 6, 2, 0,254, 5, 2, 0,253, 5, 2, 0,209, 1, 0, 0, 46, 6, 0, 0, 47, 6, 0, 0, 48, 6,
+ 0, 0,204, 5, 7, 0, 67, 2, 7, 0, 68, 2, 7, 0, 10, 6, 7, 0, 90, 1, 7, 0, 49, 6, 7, 0, 50, 6,161, 0, 70, 3,
+225, 0, 11, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5, 2, 0,252, 5,
+ 2, 0, 19, 0, 4, 0, 37, 0,213, 0,250, 5,209, 0,249, 5,226, 0, 27, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5,
+ 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5, 42, 0, 51, 6, 4, 0, 52, 6, 4, 0, 53, 6, 2, 0, 90, 0, 2, 0,133, 0,
+ 2, 0, 54, 6, 0, 0, 55, 6, 0, 0, 56, 6, 4, 0, 57, 6, 4, 0, 58, 6, 4, 0, 59, 6, 4, 0, 60, 6, 2, 0, 61, 6,
+ 2, 0, 62, 6, 7, 0, 63, 6, 23, 0, 64, 6, 23, 0, 65, 6, 4, 0, 66, 6, 4, 0, 67, 6, 0, 0, 68, 6, 0, 0, 69, 6,
+227, 0, 10, 0, 27, 0, 31, 0, 9, 0, 70, 6, 9, 0, 71, 6, 9, 0, 72, 6, 9, 0, 73, 6, 9, 0, 74, 6, 4, 0, 90, 0,
+ 4, 0, 75, 6, 0, 0, 76, 6, 0, 0, 77, 6,228, 0, 10, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5,
+ 7, 0,194, 5,227, 0, 78, 6, 2, 0, 90, 0, 2, 0,133, 0, 4, 0, 43, 0, 9, 0, 79, 6,229, 0, 8, 0,208, 0, 0, 0,
+208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5,209, 0,249, 5, 4, 0, 19, 0, 4, 0, 80, 6,230, 0, 23, 0,
+208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5,209, 0,249, 5, 27, 0, 81, 6,
+ 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,133, 0, 7, 0, 82, 6, 9, 0, 83, 6, 7, 0, 67, 2, 7, 0, 68, 2, 7, 0, 84, 6,
+ 7, 0, 85, 6, 61, 0, 29, 1, 61, 0, 86, 6, 4, 0, 87, 6, 2, 0, 88, 6, 2, 0, 37, 0,161, 0, 70, 3,231, 0, 10, 0,
+208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5, 2, 0, 19, 0, 2, 0, 92, 3,
+ 4, 0, 37, 0,161, 0, 70, 3,232, 0, 42, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5,
+ 2, 0,195, 5,209, 0,249, 5,218, 0, 25, 6, 0, 0, 11, 6, 0, 0, 12, 6, 0, 0, 13, 6, 2, 0, 17, 0, 2, 0, 21, 6,
+ 2, 0, 19, 0, 2, 0, 15, 6, 9, 0, 83, 6, 4, 0, 18, 6, 4, 0, 89, 6, 4, 0, 90, 6, 4, 0, 19, 6, 23, 0, 91, 6,
+ 23, 0, 92, 6, 7, 0, 93, 6, 7, 0, 94, 6, 7, 0, 95, 6, 7, 0, 82, 6, 2, 0, 96, 6, 2, 0,207, 0, 2, 0,152, 1,
+ 2, 0, 17, 6, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 97, 6, 2, 0, 98, 6, 9, 0, 99, 6, 9, 0,100, 6, 9, 0,101, 6,
+ 9, 0,102, 6, 9, 0,103, 6, 2, 0,104, 6, 0, 0, 23, 6, 57, 0,105, 6,233, 0, 7, 0,233, 0, 0, 0,233, 0, 1, 0,
+ 4, 0,106, 6, 4, 0, 23, 0, 0, 0, 84, 0, 4, 0,107, 6, 4, 0, 17, 0,234, 0, 13, 0,208, 0, 0, 0,208, 0, 1, 0,
+ 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5, 2, 0,195, 5, 4, 0, 17, 0, 4, 0,108, 6, 4, 0, 19, 0, 4, 0, 54, 6,
+ 12, 0,109, 6, 12, 0,110, 6, 0, 0,111, 6,235, 0, 5, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5,
+ 4, 0, 37, 0,236, 0, 7, 0,236, 0, 0, 0,236, 0, 1, 0, 0, 0,112, 6, 2, 0,113, 6, 2, 0,114, 6, 2, 0,115, 6,
+ 2, 0, 37, 0,237, 0, 12, 0, 2, 0,114, 6, 2, 0,116, 6, 2, 0,117, 6, 0, 0,167, 2, 2, 0,118, 6, 2, 0,119, 6,
+ 2, 0,120, 6, 2, 0,121, 6, 2, 0,122, 6, 2, 0,239, 5, 7, 0,123, 6, 7, 0,124, 6,238, 0, 18, 0,238, 0, 0, 0,
+238, 0, 1, 0, 0, 0,193, 3,237, 0,125, 6,237, 0,126, 6,237, 0,127, 6,237, 0,128, 6, 7, 0,129, 6, 2, 0,130, 6,
+ 2, 0,131, 6, 2, 0,132, 6, 2, 0,133, 6, 2, 0,134, 6, 2, 0,135, 6, 2, 0,136, 6, 2, 0,137, 6, 2, 0,138, 6,
+ 2, 0,139, 6,239, 0, 10, 0, 0, 0,140, 6, 0, 0,141, 6, 0, 0,142, 6, 0, 0,143, 6, 0, 0,144, 6, 0, 0,145, 6,
+ 2, 0,146, 6, 2, 0,147, 6, 2, 0,148, 6, 2, 0, 37, 0,240, 0, 8, 0, 0, 0,149, 6, 0, 0,150, 6, 0, 0,151, 6,
+ 0, 0,152, 6, 0, 0,153, 6, 0, 0,154, 6, 7, 0,160, 5, 7, 0, 37, 0,241, 0, 17, 0,239, 0,155, 6,239, 0,156, 6,
+239, 0,157, 6,239, 0,158, 6,239, 0,159, 6,239, 0,160, 6,239, 0,161, 6,239, 0,162, 6,239, 0,163, 6,239, 0,164, 6,
+239, 0,165, 6,239, 0,166, 6,239, 0,167, 6,239, 0,168, 6,239, 0,169, 6,240, 0,170, 6, 0, 0,171, 6,242, 0, 71, 0,
+ 0, 0,172, 6, 0, 0,173, 6, 0, 0,144, 6, 0, 0,174, 6, 0, 0,175, 6, 0, 0,176, 6, 0, 0,177, 6, 0, 0,178, 6,
+ 0, 0,179, 6, 0, 0,180, 6, 0, 0,181, 6, 0, 0,182, 6, 0, 0,183, 6, 0, 0,184, 6, 0, 0,185, 6, 0, 0,186, 6,
+ 0, 0,187, 6, 0, 0,188, 6, 0, 0,189, 6, 0, 0,190, 6, 0, 0,191, 6, 0, 0,192, 6, 0, 0,193, 6, 0, 0,194, 6,
+ 0, 0,195, 6, 0, 0,196, 6, 0, 0,197, 6, 0, 0,198, 6, 0, 0,199, 6, 0, 0,200, 6, 0, 0,201, 6, 0, 0,202, 6,
+ 0, 0,203, 6, 0, 0,204, 6, 0, 0,205, 6, 0, 0,206, 6, 0, 0,207, 6, 0, 0,208, 6, 0, 0,209, 6, 0, 0,210, 6,
+ 0, 0,211, 6, 0, 0,212, 6, 0, 0,213, 6, 0, 0,214, 6, 0, 0,215, 6, 0, 0,216, 6, 0, 0,217, 6, 0, 0,218, 6,
+ 0, 0,219, 6, 0, 0,220, 6, 0, 0,221, 6, 0, 0,222, 6, 0, 0,223, 6, 0, 0,224, 6, 0, 0,225, 6, 0, 0,226, 6,
+ 0, 0,227, 6, 0, 0,228, 6, 0, 0,229, 6, 0, 0,230, 6, 0, 0,231, 6, 0, 0,232, 6, 0, 0,233, 6, 0, 0,234, 6,
+ 0, 0,235, 6, 0, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 0, 0,239, 6, 0, 0,240, 6, 0, 0, 92, 0,243, 0, 5, 0,
+ 0, 0,241, 6, 0, 0,196, 6, 0, 0,198, 6, 2, 0, 19, 0, 2, 0, 37, 0,244, 0, 22, 0,244, 0, 0, 0,244, 0, 1, 0,
+ 0, 0, 20, 0,241, 0,242, 6,242, 0,243, 6,242, 0,244, 6,242, 0,245, 6,242, 0,246, 6,242, 0,247, 6,242, 0,248, 6,
+242, 0,249, 6,242, 0,250, 6,242, 0,251, 6,242, 0,252, 6,242, 0,253, 6,242, 0,254, 6,242, 0,255, 6,242, 0, 0, 7,
+242, 0, 1, 7,242, 0, 2, 7,242, 0, 3, 7,243, 0, 4, 7,245, 0, 5, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,115, 2,
+ 7, 0, 5, 7, 7, 0, 21, 2,246, 0, 71, 0, 4, 0, 19, 0, 4, 0, 6, 7, 4, 0, 7, 7, 0, 0, 8, 7, 0, 0, 9, 7,
+ 0, 0, 10, 7, 0, 0, 11, 7, 0, 0, 12, 7, 0, 0, 13, 7, 0, 0, 14, 7, 0, 0, 15, 7, 0, 0, 16, 7, 2, 0, 17, 7,
+ 2, 0, 37, 0, 4, 0, 18, 7, 4, 0, 19, 7, 4, 0, 20, 7, 4, 0, 21, 7, 2, 0, 22, 7, 2, 0, 23, 7, 4, 0, 24, 7,
+ 4, 0, 25, 7, 4, 0, 26, 7, 4, 0, 27, 7, 4, 0, 28, 7, 4, 0,109, 6, 4, 0, 29, 7, 2, 0, 30, 7, 2, 0, 31, 7,
+ 2, 0, 32, 7, 2, 0, 33, 7, 12, 0, 34, 7, 12, 0, 35, 7, 12, 0, 36, 7, 2, 0, 37, 7, 2, 0, 38, 7, 2, 0, 39, 7,
+ 2, 0, 40, 7, 2, 0, 41, 7, 2, 0, 42, 7, 2, 0, 43, 7, 2, 0, 44, 7,245, 0, 45, 7, 2, 0, 46, 7, 2, 0, 47, 7,
+ 2, 0, 48, 7, 2, 0, 49, 7, 2, 0, 50, 7, 2, 0, 51, 7, 2, 0, 52, 7, 2, 0, 53, 7, 4, 0, 54, 7, 4, 0, 55, 7,
+ 2, 0, 56, 7, 2, 0, 57, 7, 2, 0, 58, 7, 2, 0, 59, 7, 2, 0, 60, 7, 2, 0, 61, 7, 2, 0, 62, 7, 2, 0, 63, 7,
+ 2, 0, 64, 7, 2, 0, 65, 7, 2, 0, 66, 7, 2, 0, 67, 7, 0, 0, 68, 7, 0, 0, 69, 7, 7, 0, 70, 7, 2, 0, 90, 5,
+ 2, 0, 91, 5, 55, 0, 71, 7,211, 0, 21, 0, 27, 0, 31, 0, 12, 0, 72, 7, 12, 0, 73, 7, 12, 0, 74, 7, 12, 0,192, 5,
+ 46, 0,134, 0, 46, 0, 75, 7, 2, 0, 76, 7, 2, 0, 77, 7, 2, 0, 78, 7, 2, 0, 79, 7, 2, 0, 80, 7, 2, 0, 81, 7,
+ 2, 0, 82, 7, 2, 0, 37, 0, 2, 0, 83, 7, 2, 0, 84, 7, 4, 0, 70, 0,206, 0, 85, 7, 9, 0, 86, 7, 2, 0, 87, 7,
+247, 0, 5, 0,247, 0, 0, 0,247, 0, 1, 0,247, 0, 88, 7, 13, 0, 89, 7, 4, 0, 19, 0,248, 0, 7, 0,248, 0, 0, 0,
+248, 0, 1, 0,247, 0, 90, 7,247, 0, 91, 7, 2, 0,199, 4, 2, 0, 19, 0, 4, 0, 37, 0,249, 0, 23, 0,249, 0, 0, 0,
+249, 0, 1, 0,250, 0, 92, 7,251, 0, 30, 6, 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 2, 0, 96, 7, 2, 0, 97, 7,
+ 2, 0, 98, 7, 2, 0, 99, 7, 2, 0,100, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,101, 7, 2, 0,102, 7, 2, 0,103, 7,
+ 4, 0,104, 7,249, 0,105, 7, 9, 0,106, 7, 4, 0,107, 7, 4, 0,108, 7, 0, 0,109, 7,252, 0, 22, 0,252, 0, 0, 0,
+252, 0, 1, 0,247, 0, 90, 7,247, 0, 91, 7,247, 0,110, 7,247, 0,111, 7,211, 0,112, 7, 23, 0, 52, 0, 0, 0,193, 5,
+ 0, 0,113, 7, 2, 0,240, 5, 2, 0,241, 5, 2, 0,114, 7, 2, 0, 37, 0, 2, 0, 79, 7, 2, 0,107, 6, 2, 0, 19, 0,
+253, 0, 92, 7, 12, 0,115, 7, 12, 0,192, 5, 12, 0,116, 7, 12, 0,117, 7,254, 0, 21, 0,254, 0, 0, 0,254, 0, 1, 0,
+209, 0,249, 5, 23, 0,118, 7, 23, 0,119, 7, 2, 0,240, 5, 2, 0,241, 5, 2, 0,120, 7, 2, 0,121, 7, 2, 0,122, 7,
+ 2, 0, 19, 0, 7, 0, 63, 2, 2, 0, 78, 7, 2, 0, 82, 7, 4, 0, 43, 0,255, 0, 92, 7, 12, 0,123, 7, 12, 0,124, 7,
+ 12, 0,116, 7, 0, 0,125, 7, 9, 0,126, 7, 0, 1, 11, 0, 0, 0,127, 7, 2, 0,128, 7, 2, 0,129, 7, 2, 0,130, 7,
+ 2, 0,131, 7, 2, 0,188, 4, 2, 0,183, 4,211, 0,132, 7, 46, 0,133, 7, 4, 0,134, 7, 4, 0,135, 7, 1, 1, 1, 0,
+ 0, 0,136, 7, 2, 1, 8, 0, 57, 0,137, 7, 57, 0,138, 7, 2, 1,139, 7, 2, 1,140, 7, 2, 1,141, 7, 2, 0,129, 0,
+ 2, 0, 19, 0, 4, 0,142, 7, 3, 1, 4, 0, 4, 0, 52, 6, 4, 0,143, 7, 4, 0, 57, 6, 4, 0,144, 7, 4, 1, 2, 0,
+ 4, 0,145, 7, 4, 0,146, 7, 5, 1, 7, 0, 7, 0,147, 7, 7, 0,148, 7, 7, 0,149, 7, 4, 0, 19, 0, 4, 0, 37, 0,
+ 7, 0, 72, 4, 7, 0,150, 7, 6, 1, 6, 0, 0, 0,151, 7, 0, 0, 13, 6, 49, 0,137, 0, 2, 0,106, 0, 2, 0,187, 4,
+ 4, 0, 37, 0, 7, 1, 21, 0, 7, 1, 0, 0, 7, 1, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0,152, 7,
+ 4, 0,153, 7, 4, 0,154, 7, 1, 1,155, 7, 0, 0,151, 7, 4, 0,156, 7, 4, 0,157, 7, 6, 1, 64, 3, 3, 1,158, 7,
+ 4, 1,159, 7, 5, 1,160, 7, 2, 1,161, 7, 2, 1,162, 7, 2, 1,163, 7, 57, 0,164, 7, 57, 0,165, 7, 8, 1, 12, 0,
+ 0, 0,239, 1, 9, 0,193, 0, 0, 0,194, 0, 4, 0,197, 0, 4, 0,205, 0, 9, 0,198, 0, 7, 0,200, 0, 7, 0,201, 0,
+ 9, 0,166, 7, 9, 0,167, 7, 9, 0,202, 0, 9, 0,204, 0, 9, 1, 43, 0, 9, 1, 0, 0, 9, 1, 1, 0, 9, 0,168, 7,
+ 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 88, 0, 4, 0,169, 7, 4, 0,170, 7,
+ 4, 0,153, 7, 4, 0,154, 7, 4, 0,171, 7, 4, 0,216, 0, 4, 0,172, 7, 4, 0,173, 7, 7, 0, 56, 5, 7, 0,174, 7,
+ 4, 0,126, 0, 4, 0,175, 7, 7, 1,176, 7, 36, 0, 80, 0, 46, 0,134, 0, 49, 0,137, 0, 7, 0,177, 7, 7, 0,178, 7,
+ 8, 1, 30, 1, 9, 1,179, 7, 9, 1,180, 7, 9, 1,181, 7, 12, 0,182, 7, 10, 1,183, 7, 11, 1,184, 7, 7, 0,185, 7,
+ 7, 0,186, 7, 4, 0,187, 7, 7, 0,188, 7, 9, 0,189, 7, 4, 0,190, 7, 4, 0,191, 7, 4, 0,192, 7, 7, 0,193, 7,
+ 12, 1, 4, 0, 12, 1, 0, 0, 12, 1, 1, 0, 12, 0,194, 7, 9, 1,195, 7,197, 0, 6, 0, 12, 0,196, 7, 12, 0,182, 7,
+ 12, 0,197, 7, 9, 1,198, 7, 0, 0,199, 7, 0, 0,200, 7, 13, 1, 4, 0, 7, 0,201, 7, 7, 0,109, 0, 2, 0,202, 7,
+ 2, 0,203, 7, 14, 1, 6, 0, 7, 0,204, 7, 7, 0,205, 7, 7, 0,206, 7, 7, 0,207, 7, 4, 0,208, 7, 4, 0,209, 7,
+ 15, 1, 12, 0, 7, 0,210, 7, 7, 0,211, 7, 7, 0,212, 7, 7, 0,213, 7, 7, 0,214, 7, 7, 0,215, 7, 7, 0,216, 7,
+ 7, 0,217, 7, 7, 0,218, 7, 7, 0,219, 7, 4, 0,210, 2, 4, 0,220, 7, 16, 1, 2, 0, 7, 0, 25, 5, 7, 0, 37, 0,
+ 17, 1, 5, 0, 7, 0,221, 7, 7, 0,222, 7, 4, 0, 90, 0, 4, 0,168, 2, 4, 0,223, 7, 18, 1, 6, 0, 18, 1, 0, 0,
+ 18, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,224, 7, 2, 0, 57, 0, 19, 1, 8, 0, 19, 1, 0, 0, 19, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,224, 7, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,126, 0, 20, 1, 45, 0, 20, 1, 0, 0,
+ 20, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,224, 7, 2, 0,212, 0, 2, 0,244, 3, 2, 0,225, 7, 7, 0,226, 7,
+ 7, 0, 89, 0, 7, 0,223, 2, 4, 0,227, 7, 4, 0, 82, 0, 4, 0,170, 2, 7, 0,228, 7, 7, 0,229, 7, 7, 0,230, 7,
+ 7, 0,231, 7, 7, 0,232, 7, 7, 0,233, 7, 7, 0,220, 2, 7, 0, 27, 1, 7, 0,234, 7, 7, 0,235, 7, 7, 0, 37, 0,
+ 7, 0,236, 7, 7, 0,237, 7, 7, 0,238, 7, 2, 0,239, 7, 2, 0,240, 7, 2, 0,241, 7, 2, 0,242, 7, 2, 0,243, 7,
+ 2, 0,244, 7, 2, 0,245, 7, 2, 0,246, 7, 2, 0, 6, 2, 2, 0,247, 7, 2, 0, 3, 2, 2, 0,248, 7, 0, 0,249, 7,
+ 0, 0,250, 7, 7, 0,210, 0, 21, 1,251, 7, 68, 0,212, 1, 22, 1, 16, 0, 22, 1, 0, 0, 22, 1, 1, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 2, 0,224, 7, 2, 0,212, 0, 7, 0,215, 2, 7, 0,216, 2, 7, 0,217, 2, 7, 0, 52, 2, 7, 0,218, 2,
+ 7, 0,219, 2, 7, 0,252, 7, 7, 0,220, 2, 7, 0,222, 2, 7, 0,223, 2,223, 0, 5, 0, 2, 0, 17, 0, 2, 0,142, 7,
+ 2, 0, 19, 0, 2, 0,253, 7, 27, 0, 81, 6,222, 0, 3, 0, 4, 0, 69, 0, 4, 0,254, 7,223, 0, 2, 0, 23, 1, 7, 0,
+ 23, 1, 0, 0, 23, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,255, 7, 24, 1, 5, 0,
+ 0, 0, 20, 0, 7, 0, 47, 1, 7, 0, 0, 8, 4, 0, 1, 8, 4, 0, 37, 0, 25, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0,
+ 2, 0, 43, 0, 2, 0, 70, 0, 26, 1, 4, 0, 0, 0, 20, 0, 67, 0, 2, 8, 7, 0, 47, 1, 7, 0, 37, 0, 27, 1, 6, 0,
+ 2, 0, 3, 8, 2, 0, 4, 8, 2, 0, 17, 0, 2, 0, 5, 8, 0, 0, 6, 8, 0, 0, 7, 8, 28, 1, 5, 0, 4, 0, 17, 0,
+ 4, 0, 37, 0, 0, 0, 20, 0, 0, 0, 8, 8, 0, 0, 9, 8, 29, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0,
+ 30, 1, 4, 0, 2, 0, 10, 8, 2, 0, 11, 8, 2, 0, 19, 0, 2, 0, 37, 0, 31, 1, 6, 0, 0, 0, 20, 0, 0, 0, 12, 8,
+ 2, 0, 13, 8, 2, 0,220, 2, 2, 0, 40, 1, 2, 0, 70, 0, 32, 1, 5, 0, 0, 0, 20, 0, 7, 0,109, 0, 7, 0, 74, 4,
+ 2, 0, 19, 0, 2, 0,182, 2, 33, 1, 3, 0, 0, 0, 20, 0, 4, 0,170, 2, 4, 0, 10, 8, 34, 1, 7, 0, 0, 0, 20, 0,
+ 7, 0, 74, 4, 0, 0, 14, 8, 0, 0, 15, 8, 2, 0, 40, 1, 2, 0, 43, 0, 4, 0, 16, 8, 35, 1, 3, 0, 32, 0, 17, 8,
+ 0, 0, 18, 8, 0, 0, 19, 8, 36, 1, 18, 0, 36, 1, 0, 0, 36, 1, 1, 0, 2, 0, 17, 0, 2, 0, 20, 8, 2, 0, 19, 0,
+ 2, 0, 21, 8, 2, 0, 22, 8, 2, 0, 23, 8, 2, 0, 43, 0, 2, 0, 70, 0, 0, 0, 20, 0, 9, 0, 2, 0, 37, 1, 24, 8,
+ 32, 0, 45, 0, 2, 0, 40, 5, 2, 0,185, 7, 2, 0, 25, 8, 2, 0, 37, 0, 38, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0,
+ 0, 0, 26, 8, 2, 0, 19, 0, 2, 0,182, 2, 2, 0, 27, 8, 4, 0, 28, 8, 4, 0, 29, 8, 4, 0, 30, 8, 4, 0, 31, 8,
+ 4, 0, 32, 8, 39, 1, 1, 0, 0, 0, 33, 8, 40, 1, 4, 0, 42, 0, 51, 6, 0, 0, 34, 8, 4, 0, 40, 1, 4, 0, 19, 0,
+ 37, 1, 18, 0, 37, 1, 0, 0, 37, 1, 1, 0, 37, 1, 35, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 36, 8, 2, 0, 23, 8,
+ 2, 0, 20, 8, 2, 0, 37, 8, 2, 0, 70, 0, 2, 0,209, 1, 0, 0, 20, 0, 9, 0, 2, 0, 41, 1, 24, 8, 36, 1, 38, 8,
+ 2, 0, 15, 0, 2, 0, 39, 8, 4, 0, 40, 8, 42, 1, 3, 0, 4, 0,196, 2, 4, 0, 37, 0, 32, 0, 45, 0, 43, 1, 12, 0,
+159, 0, 41, 8, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,226, 7, 4, 0, 89, 0, 0, 0, 20, 0, 0, 0, 42, 8, 2, 0, 43, 8,
+ 2, 0, 44, 8, 2, 0, 45, 8, 2, 0, 46, 8, 7, 0, 47, 8, 44, 1, 13, 0, 2, 0, 19, 0, 2, 0, 48, 8, 4, 0,226, 7,
+ 4, 0, 89, 0, 2, 0, 49, 8, 7, 0,202, 3, 7, 0, 50, 8, 10, 1,183, 7, 45, 1, 51, 8, 2, 0, 17, 0, 2, 0, 52, 8,
+ 2, 0, 53, 8, 2, 0, 54, 8, 46, 1, 11, 0, 4, 0,196, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 81, 0, 55, 8,
+ 0, 0, 20, 0, 7, 0, 56, 8, 7, 0, 57, 8, 7, 0,100, 3, 2, 0, 58, 8, 2, 0, 59, 8, 47, 1, 5, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 4, 0, 37, 0, 46, 0,134, 0, 32, 0,136, 5, 48, 1, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 20, 0,
+ 0, 0, 8, 8, 32, 0, 45, 0, 49, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 20, 8, 2, 0,101, 3, 7, 0, 60, 8,
+ 7, 0, 61, 8, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 77, 3, 7, 0, 80, 3, 7, 0, 62, 8, 7, 0, 63, 8, 32, 0, 64, 8,
+ 50, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,226, 7, 4, 0, 89, 0, 0, 0, 20, 0, 0, 0, 42, 8, 2, 0, 43, 0,
+ 2, 0, 64, 0, 2, 0, 65, 8, 2, 0, 66, 8, 51, 1, 8, 0, 32, 0, 45, 0, 7, 0,217, 2, 7, 0, 67, 8, 7, 0, 68, 8,
+ 7, 0,212, 2, 2, 0, 19, 0, 2, 0,182, 2, 7, 0, 69, 8, 52, 1, 12, 0, 2, 0, 17, 0, 2, 0, 40, 1, 2, 0, 19, 0,
+ 2, 0,220, 2, 2, 0,196, 2, 2, 0, 70, 8, 4, 0, 37, 0, 7, 0, 71, 8, 7, 0, 72, 8, 7, 0, 73, 8, 7, 0, 74, 8,
+ 0, 0, 75, 8, 53, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,226, 7, 4, 0, 89, 0, 0, 0, 20, 0, 2, 0,105, 1,
+ 2, 0, 64, 0, 2, 0, 65, 8, 2, 0, 66, 8, 68, 0,212, 1, 54, 1, 7, 0, 4, 0,170, 2, 4, 0, 76, 8, 4, 0, 77, 8,
+ 4, 0, 78, 8, 7, 0, 79, 8, 7, 0, 80, 8, 0, 0, 14, 8, 55, 1, 7, 0, 0, 0, 81, 8, 32, 0, 82, 8, 0, 0, 18, 8,
+ 2, 0, 83, 8, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0, 19, 8, 56, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,226, 7,
+ 4, 0, 89, 0, 0, 0, 84, 8, 0, 0, 85, 8, 57, 1, 1, 0, 4, 0, 19, 0, 58, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 4, 0, 86, 8, 7, 0, 87, 8, 42, 0, 51, 6, 59, 1, 4, 0, 0, 0, 48, 2, 2, 0, 19, 0, 4, 0, 17, 0,
+ 32, 0, 45, 0, 60, 1, 2, 0, 4, 0, 17, 0, 4, 0,229, 5, 41, 1, 10, 0, 41, 1, 0, 0, 41, 1, 1, 0, 41, 1, 35, 8,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 20, 8, 2, 0, 88, 8, 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0, 61, 1, 10, 0,
+ 7, 0,100, 3, 7, 0, 89, 8, 7, 0, 90, 8, 7, 0, 91, 8, 7, 0, 92, 8, 4, 0, 19, 0, 7, 0, 70, 8, 7, 0, 93, 8,
+ 7, 0, 94, 8, 7, 0, 37, 0, 11, 1, 12, 0, 11, 1, 0, 0, 11, 1, 1, 0, 10, 1, 95, 8, 9, 0,193, 0, 4, 0,143, 3,
+ 4, 0,189, 3, 4, 0,190, 3, 4, 0, 96, 8, 4, 0, 97, 8, 4, 0, 98, 8, 7, 0,202, 3, 7, 0, 37, 0, 45, 1, 8, 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,
+ 10, 1, 15, 0, 27, 0, 31, 0, 0, 0,192, 0, 43, 0,149, 0, 9, 0,193, 0, 43, 0,107, 8, 36, 0, 80, 0, 7, 0,202, 3,
+ 7, 0,108, 8, 7, 0, 50, 8, 7, 0, 99, 8, 7, 0,100, 8, 7, 0,109, 8, 4, 0, 90, 0, 4, 0, 98, 8, 9, 0,110, 8,
+ 62, 1, 15, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5,252, 0,111, 8,209, 0,249, 5,
+ 10, 1,183, 7, 2, 0, 40, 1, 2, 0, 48, 8, 2, 0, 67, 2, 2, 0, 68, 2, 2, 0, 19, 0, 2, 0,254, 5, 4, 0, 70, 0,
+ 63, 1, 6, 0, 63, 1, 0, 0, 63, 1, 1, 0, 32, 0, 45, 0, 9, 0,112, 8, 4, 0,217, 0, 4, 0, 37, 0, 68, 0, 4, 0,
+ 27, 0, 31, 0, 12, 0,113, 8, 4, 0,131, 0, 7, 0,114, 8, 64, 1, 25, 0, 64, 1, 0, 0, 64, 1, 1, 0, 64, 1, 38, 0,
+ 12, 0,115, 8, 0, 0, 20, 0, 7, 0,116, 8, 7, 0,117, 8, 7, 0,118, 8, 7, 0,119, 8, 4, 0, 19, 0, 7, 0,120, 8,
+ 7, 0,121, 8, 7, 0,122, 8, 7, 0, 47, 1, 7, 0, 14, 2, 7, 0,123, 8, 7, 0,168, 2, 7, 0,124, 8, 7, 0,125, 8,
+ 7, 0,126, 8, 7, 0,127, 8, 7, 0,128, 8, 7, 0,172, 0, 2, 0,131, 0, 2, 0, 71, 5, 65, 1, 21, 0, 27, 0, 31, 0,
+ 12, 0,129, 8, 12, 0,130, 8, 12, 0,131, 8, 9, 0,132, 8, 4, 0, 19, 0, 4, 0,201, 5, 2, 0,224, 2, 2, 0, 4, 6,
+ 2, 0,131, 0, 2, 0,133, 8, 2, 0,134, 8, 2, 0,135, 8, 2, 0,136, 8, 2, 0,137, 8, 4, 0,138, 8, 4, 0,139, 8,
+ 4, 0,140, 8, 4, 0,141, 8, 4, 0,142, 8, 4, 0,143, 8, 66, 1, 2, 0, 7, 0,129, 2, 4, 0, 19, 0, 67, 1, 5, 0,
+ 66, 1,144, 8, 4, 0,168, 2, 4, 0,145, 8, 4, 0,146, 8, 4, 0, 19, 0, 68, 1, 6, 0, 4, 0, 37, 0, 4, 0, 4, 6,
+ 4, 0,140, 8, 4, 0,141, 8, 4, 0,142, 8, 4, 0,143, 8, 69, 1, 38, 0, 69, 1, 0, 0, 69, 1, 1, 0, 26, 0,147, 8,
+ 12, 0,127, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0,148, 8, 2, 0,149, 8, 2, 0,150, 8, 2, 0, 86, 3, 2, 0,151, 8,
+ 4, 0, 50, 2, 4, 0,140, 8, 4, 0,141, 8, 64, 1,152, 8, 69, 1, 38, 0, 69, 1,153, 8, 12, 0,154, 8, 9, 0,155, 8,
+ 9, 0,156, 8, 9, 0,157, 8, 7, 0, 35, 1, 7, 0,172, 0, 7, 0,158, 8, 7, 0,249, 1, 2, 0,159, 8, 2, 0, 37, 0,
+ 7, 0,160, 8, 7, 0,161, 8, 7, 0, 82, 3, 7, 0,162, 8, 7, 0,163, 8, 7, 0,164, 8, 7, 0,165, 8, 7, 0,166, 8,
+ 7, 0,167, 8, 7, 0, 43, 2, 32, 0,168, 8,160, 0, 9, 0, 12, 0,169, 8, 2, 0, 19, 0, 2, 0,170, 8, 7, 0, 79, 2,
+ 7, 0,171, 8, 7, 0,172, 8, 12, 0,173, 8, 4, 0,174, 8, 4, 0, 37, 0, 70, 1, 7, 0, 70, 1, 0, 0, 70, 1, 1, 0,
+ 12, 0,175, 8, 4, 0, 19, 0, 4, 0,176, 8, 0, 0,193, 3,243, 0,177, 8,159, 0, 7, 0, 27, 0, 31, 0, 12, 0,178, 8,
+ 12, 0,169, 8, 12, 0,179, 8, 12, 0,100, 0, 4, 0, 19, 0, 4, 0,180, 8,213, 0, 4, 0, 27, 0, 95, 8, 12, 0,169, 8,
+ 4, 0,181, 8, 4, 0, 19, 0, 71, 1, 17, 0,208, 0, 0, 0,208, 0, 1, 0, 12, 0,192, 5, 4, 0,193, 5, 7, 0,194, 5,
+ 2, 0,195, 5,209, 0,249, 5,159, 0, 67, 3,213, 0,182, 8, 0, 0, 40, 1, 0, 0,252, 5, 2, 0, 19, 0, 2, 0,183, 8,
+ 2, 0,253, 5, 2, 0,254, 5, 2, 0,184, 8, 7, 0,185, 8, 72, 1, 8, 0, 72, 1, 0, 0, 72, 1, 1, 0, 70, 1,186, 8,
+ 36, 0, 80, 0, 12, 0, 71, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0,187, 8, 73, 1, 5, 0, 73, 1, 0, 0, 73, 1, 1, 0,
+ 36, 0, 80, 0, 2, 0, 19, 0, 0, 0,188, 8, 74, 1, 12, 0, 74, 1, 0, 0, 74, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 0, 0,189, 8, 0, 0,190, 8, 0, 0,188, 8, 7, 0,191, 8, 7, 0,192, 8, 4, 0, 37, 0, 36, 0, 80, 0,
+ 75, 1, 9, 0, 75, 1, 0, 0, 75, 1, 1, 0, 32, 0,193, 8, 0, 0,227, 2, 7, 0,194, 8, 2, 0,195, 8, 2, 0, 19, 0,
+ 2, 0, 17, 0, 2, 0,196, 8, 76, 1, 7, 0, 42, 0, 51, 6, 26, 0,147, 8, 4, 0, 19, 0, 4, 0,197, 8, 12, 0,198, 8,
+ 32, 0,193, 8, 0, 0,227, 2, 77, 1, 12, 0, 32, 0,193, 8, 2, 0,199, 8, 2, 0, 19, 0, 2, 0,200, 8, 2, 0,201, 8,
+ 0, 0,227, 2, 32, 0,202, 8, 0, 0,203, 8, 7, 0,204, 8, 7, 0, 14, 2, 7, 0,205, 8, 7, 0,206, 8, 78, 1, 6, 0,
+ 32, 0,193, 8, 4, 0,207, 8, 4, 0,208, 8, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,227, 2, 79, 1, 4, 0, 32, 0,193, 8,
+ 4, 0, 19, 0, 4, 0,207, 8, 0, 0,227, 2, 80, 1, 4, 0, 32, 0,193, 8, 4, 0, 19, 0, 4, 0,207, 8, 0, 0,227, 2,
+ 81, 1, 10, 0, 32, 0,193, 8, 4, 0,209, 8, 7, 0,125, 0, 4, 0, 19, 0, 2, 0, 47, 6, 2, 0,210, 8, 2, 0, 43, 0,
+ 2, 0, 70, 0, 7, 0,211, 8, 0, 0,227, 2, 82, 1, 4, 0, 32, 0,193, 8, 4, 0, 19, 0, 4, 0,207, 8, 0, 0,227, 2,
+ 83, 1, 10, 0, 32, 0,193, 8, 2, 0, 17, 0, 2, 0,252, 3, 4, 0, 88, 0, 4, 0, 89, 0, 7, 0, 67, 8, 7, 0, 68, 8,
+ 4, 0, 37, 0,159, 0, 41, 8, 0, 0,227, 2, 84, 1, 4, 0, 32, 0,193, 8, 4, 0, 87, 3, 4, 0,212, 8, 0, 0,227, 2,
+ 85, 1, 5, 0, 32, 0,193, 8, 7, 0,125, 0, 4, 0,213, 8, 4, 0, 87, 3, 4, 0, 88, 3, 86, 1, 6, 0, 32, 0,193, 8,
+ 4, 0,214, 8, 4, 0,215, 8, 7, 0,216, 8, 7, 0,217, 8, 0, 0,227, 2, 87, 1, 16, 0, 32, 0,193, 8, 32, 0,153, 8,
+ 4, 0, 17, 0, 7, 0,218, 8, 7, 0,219, 8, 7, 0,220, 8, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, 7, 0,224, 8,
+ 7, 0,225, 8, 7, 0,226, 8, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0, 88, 1, 3, 0, 32, 0,193, 8,
+ 4, 0, 19, 0, 4, 0, 6, 2, 89, 1, 5, 0, 32, 0,193, 8, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,227, 8, 0, 0,227, 2,
+ 90, 1, 10, 0, 32, 0,193, 8, 0, 0,227, 2, 2, 0,228, 8, 2, 0,229, 8, 0, 0,230, 8, 0, 0,231, 8, 7, 0,232, 8,
+ 7, 0,233, 8, 7, 0,234, 8, 7, 0,235, 8, 91, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0,
+ 7, 0,236, 8, 7, 0,237, 8, 2, 0, 19, 0, 2, 0, 6, 2, 92, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0,
+ 7, 0, 12, 0, 7, 0,236, 8, 7, 0,237, 8, 2, 0, 19, 0, 2, 0, 6, 2, 93, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
+ 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,236, 8, 7, 0,237, 8, 2, 0, 19, 0, 2, 0, 6, 2, 94, 1, 7, 0, 32, 0,193, 8,
+ 0, 0,227, 2, 7, 0, 47, 1, 7, 0, 56, 1, 2, 0, 19, 0, 2, 0, 40, 1, 4, 0, 37, 0, 95, 1, 5, 0, 32, 0, 27, 3,
+ 7, 0, 47, 1, 2, 0, 31, 3, 0, 0, 33, 3, 0, 0,238, 8, 96, 1, 10, 0, 96, 1, 0, 0, 96, 1, 1, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 0, 0,239, 8, 7, 0,246, 0, 7, 0,247, 0, 2, 0,175, 8, 2, 0,240, 8, 32, 0, 45, 0, 97, 1, 22, 0,
+ 97, 1, 0, 0, 97, 1, 1, 0, 2, 0, 19, 0, 2, 0, 40, 1, 2, 0,241, 8, 2, 0,242, 8, 36, 0, 80, 0,159, 0, 41, 8,
+ 32, 0,164, 0, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,243, 8, 7, 0,244, 8, 7, 0,245, 8, 7, 0,246, 8, 7, 0,213, 2,
+ 7, 0,247, 8, 7, 0, 43, 8, 7, 0,248, 8, 0, 0,249, 8, 0, 0,250, 8, 12, 0, 73, 3, 98, 1, 8, 0, 7, 0, 21, 2,
+ 7, 0, 67, 8, 7, 0, 68, 8, 9, 0, 2, 0, 2, 0,251, 8, 2, 0,252, 8, 2, 0,253, 8, 2, 0,254, 8, 99, 1, 18, 0,
+ 99, 1, 0, 0, 99, 1, 1, 0, 99, 1,255, 8, 0, 0, 20, 0, 98, 1, 0, 9, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 1, 9,
+ 2, 0, 2, 9, 2, 0, 3, 9, 2, 0, 4, 9, 4, 0, 43, 0, 7, 0, 5, 9, 7, 0, 6, 9, 4, 0, 7, 9, 4, 0, 8, 9,
+ 99, 1, 9, 9,100, 1, 10, 9,101, 1, 33, 0,101, 1, 0, 0,101, 1, 1, 0,101, 1, 11, 9, 0, 0, 20, 0, 0, 0, 12, 9,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,152, 7, 2, 0,185, 7, 2, 0, 13, 9, 2, 0,133, 0, 2, 0, 2, 9, 2, 0,142, 7,
+ 12, 0, 36, 8, 12, 0, 14, 9, 27, 0, 81, 6, 9, 0, 15, 9, 7, 0, 5, 9, 7, 0, 6, 9, 7, 0, 52, 2, 7, 0, 16, 9,
+ 2, 0, 17, 9, 2, 0, 18, 9, 7, 0, 19, 9, 7, 0, 20, 9, 2, 0, 21, 9, 2, 0, 22, 9, 9, 0, 23, 9, 24, 0, 24, 9,
+ 24, 0, 25, 9, 24, 0, 26, 9,102, 1,150, 0,103, 1, 27, 9,100, 1, 8, 0,100, 1, 0, 0,100, 1, 1, 0,101, 1, 28, 9,
+101, 1, 29, 9, 99, 1, 30, 9, 99, 1, 9, 9, 4, 0, 19, 0, 4, 0, 37, 0, 61, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0,
+ 12, 0, 31, 9, 12, 0, 32, 9, 98, 1, 33, 9, 12, 0, 34, 9, 4, 0, 17, 0, 4, 0, 35, 9, 4, 0, 36, 9, 4, 0, 37, 9,
+ 12, 0, 38, 9,103, 1, 39, 9, 99, 1, 40, 9, 99, 1, 41, 9, 9, 0, 42, 9, 9, 0, 43, 9, 4, 0, 44, 9, 9, 0, 45, 9,
+ 9, 0, 46, 9, 9, 0, 47, 9,104, 1, 6, 0, 4, 0,124, 0, 4, 0,126, 0, 4, 0,142, 7, 0, 0, 48, 9, 0, 0, 49, 9,
+ 2, 0, 37, 0,105, 1, 16, 0, 2, 0, 98, 7, 2, 0, 99, 7, 2, 0, 50, 9, 2, 0, 90, 8, 2, 0, 51, 9, 2, 0, 68, 0,
+ 7, 0,212, 2, 7, 0, 52, 9, 7, 0, 53, 9, 2, 0, 60, 1, 0, 0, 54, 9, 0, 0, 55, 5, 2, 0, 55, 9, 2, 0, 37, 0,
+ 4, 0, 56, 9, 4, 0, 57, 9,106, 1, 9, 0, 7, 0, 58, 9, 7, 0, 59, 9, 7, 0,109, 8, 7, 0,109, 0, 7, 0, 60, 9,
+ 7, 0, 10, 6, 2, 0, 61, 9, 0, 0, 62, 9, 0, 0, 37, 0,107, 1, 4, 0, 7, 0, 63, 9, 7, 0, 64, 9, 2, 0, 61, 9,
+ 2, 0, 37, 0,108, 1, 3, 0, 7, 0, 65, 9, 7, 0, 66, 9, 7, 0, 15, 0,109, 1, 7, 0, 0, 0,239, 1, 2, 0,185, 4,
+ 2, 0,186, 4, 2, 0,187, 4, 2, 0,138, 4, 4, 0,126, 0, 4, 0,250, 3,110, 1, 7, 0, 7, 0, 67, 9, 7, 0, 68, 9,
+ 7, 0, 69, 9, 7, 0, 63, 2, 7, 0, 70, 9, 7, 0, 71, 9, 7, 0, 72, 9,111, 1, 4, 0, 2, 0, 73, 9, 2, 0, 74, 9,
+ 2, 0, 75, 9, 2, 0, 76, 9,112, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,113, 1, 2, 0, 0, 0,166, 0, 0, 0, 77, 9,
+114, 1, 1, 0, 0, 0, 20, 0,115, 1, 10, 0, 0, 0, 78, 9, 0, 0, 79, 9, 0, 0, 3, 6, 0, 0, 80, 9, 2, 0, 50, 9,
+ 2, 0, 81, 9, 7, 0, 82, 9, 7, 0, 83, 9, 7, 0, 84, 9, 7, 0,247, 8,116, 1, 2, 0, 9, 0, 85, 9, 9, 0, 86, 9,
+117, 1, 11, 0, 0, 0,187, 4, 0, 0, 17, 0, 0, 0, 61, 9, 0, 0,109, 0, 0, 0, 87, 9, 0, 0,106, 0, 0, 0, 48, 2,
+ 7, 0, 88, 9, 7, 0, 89, 9, 7, 0, 90, 9, 7, 0, 91, 9,118, 1, 8, 0, 7, 0, 3, 8, 7, 0,125, 0, 7, 0, 55, 5,
+ 7, 0,134, 2, 7, 0, 92, 9, 7, 0,206, 0, 7, 0, 93, 9, 4, 0, 17, 0,119, 1, 4, 0, 2, 0, 94, 9, 2, 0, 95, 9,
+ 2, 0, 96, 9, 2, 0, 37, 0,120, 1, 1, 0, 0, 0, 20, 0,121, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0,
+ 2, 0, 97, 9,122, 1, 10, 0, 2, 0,182, 3, 2, 0, 19, 0, 7, 0, 74, 4, 7, 0, 98, 9, 7, 0, 99, 9, 7, 0,100, 9,
+ 7, 0,101, 9,121, 1,102, 9,121, 1,103, 9,121, 1,104, 9, 64, 0, 9, 0, 4, 0, 19, 0, 4, 0, 64, 0, 24, 0,105, 9,
+ 24, 0,106, 9,122, 1,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0,110, 9, 7, 0,111, 9,123, 1, 4, 0, 47, 0,206, 2,
+ 7, 0,112, 9, 7, 0,141, 1, 7, 0, 37, 0,187, 0, 17, 0, 27, 0, 31, 0,123, 1,113, 9, 64, 0,102, 9, 51, 0,103, 1,
+ 2, 0, 19, 0, 2, 0,160, 5, 4, 0,106, 0, 7, 0,114, 9, 7, 0, 60, 2, 4, 0,115, 9, 7, 0,116, 9, 7, 0,117, 9,
+ 7, 0,118, 9, 7, 0,141, 1, 2, 0, 73, 1, 0, 0,119, 9, 0, 0,139, 6,124, 1, 10, 0, 4, 0, 17, 0, 4, 0,125, 0,
+ 4, 0, 19, 0, 4, 0,148, 3, 4, 0,120, 9, 4, 0,121, 9, 4, 0,122, 9, 0, 0, 92, 0, 0, 0, 20, 0, 9, 0, 2, 0,
+ 92, 0, 6, 0,124, 1,123, 9, 4, 0,124, 9, 4, 0,125, 9, 4, 0,126, 9, 4, 0, 37, 0, 9, 0,127, 9,125, 1, 5, 0,
+ 7, 0,129, 2, 7, 0,196, 2, 7, 0, 14, 2, 2, 0,128, 9, 2, 0, 37, 0,126, 1, 5, 0, 7, 0,129, 2, 7, 0,129, 9,
+ 7, 0,130, 9, 7, 0,131, 9, 7, 0,196, 2,127, 1, 5, 0, 32, 0,132, 9,128, 1, 22, 0, 7, 0,133, 9, 7, 0,134, 9,
+ 7, 0, 57, 0,129, 1, 7, 0, 4, 0,135, 9, 4, 0,136, 9, 4, 0,137, 9, 7, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9,
+ 7, 0,141, 9,130, 1, 8, 0,130, 1, 0, 0,130, 1, 1, 0, 32, 0, 45, 0, 4, 0, 14, 3, 2, 0, 19, 0, 2, 0, 40, 1,
+ 7, 0,196, 2, 7, 0, 11, 8,131, 1, 18, 0,126, 1,143, 3,126, 1,142, 9,125, 1,143, 9,126, 1,251, 7,127, 1,144, 9,
+ 4, 0, 82, 0, 7, 0,196, 2, 7, 0,223, 2, 7, 0,145, 9, 4, 0,135, 9, 4, 0,146, 9, 7, 0,139, 9, 7, 0,140, 9,
+ 7, 0,106, 0, 2, 0, 19, 0, 2, 0,147, 9, 2, 0,148, 9, 2, 0,149, 9,132, 1,107, 0, 27, 0, 31, 0, 39, 0, 75, 0,
+133, 1,150, 9, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,228, 8, 2, 0,151, 9, 2, 0,152, 9, 2, 0,159, 8, 2, 0,153, 9,
+ 2, 0,154, 9, 2, 0,155, 9, 2, 0,156, 9, 2, 0,157, 9, 2, 0,158, 9, 2, 0,159, 9, 2, 0,178, 3, 2, 0, 48, 5,
+ 2, 0,160, 9, 2, 0,161, 9, 2, 0,162, 9, 2, 0,163, 9, 2, 0,164, 9, 2, 0, 3, 2, 2, 0,244, 7, 2, 0,220, 7,
+ 2, 0,165, 9, 2, 0,166, 9, 2, 0,176, 3, 2, 0,177, 3, 2, 0,167, 9, 2, 0,168, 9, 2, 0,169, 9, 2, 0,170, 9,
+ 7, 0,171, 9, 7, 0,172, 9, 7, 0,173, 9, 2, 0,174, 9, 2, 0,175, 9, 7, 0,176, 9, 7, 0,177, 9, 7, 0,178, 9,
+ 7, 0,226, 7, 7, 0, 89, 0, 7, 0,223, 2, 7, 0,232, 7, 7, 0,179, 9, 7, 0,180, 9, 7, 0,181, 9, 4, 0,227, 7,
+ 4, 0,225, 7, 4, 0,182, 9, 7, 0,228, 7, 7, 0,229, 7, 7, 0,230, 7, 7, 0,183, 9, 7, 0,184, 9, 7, 0,185, 9,
+ 7, 0,186, 9, 7, 0,187, 9, 7, 0,188, 9, 7, 0,189, 9, 7, 0,190, 9, 7, 0,100, 3, 7, 0,106, 0, 7, 0,191, 9,
+ 7, 0,192, 9, 7, 0,193, 9, 7, 0,194, 9, 7, 0,195, 9, 7, 0,196, 9, 7, 0,197, 9, 4, 0,198, 9, 4, 0,199, 9,
+ 7, 0,200, 9, 7, 0,201, 9, 7, 0,202, 9, 7, 0,203, 9, 7, 0,204, 9, 7, 0,205, 9, 7, 0,206, 9, 7, 0,172, 3,
+ 7, 0,170, 3, 7, 0,171, 3, 7, 0,207, 9, 7, 0,208, 9, 7, 0,209, 9, 7, 0,210, 9, 7, 0,211, 9, 7, 0,212, 9,
+ 7, 0,213, 9, 7, 0,214, 9, 7, 0,215, 9, 7, 0,216, 9, 7, 0,217, 9, 7, 0,218, 9, 7, 0,219, 9, 4, 0,220, 9,
+ 4, 0,221, 9, 7, 0,222, 9, 68, 0,132, 3, 68, 0,223, 9, 32, 0,224, 9, 32, 0,225, 9, 36, 0, 80, 0,163, 0, 32, 1,
+163, 0,226, 9, 59, 0, 43, 0, 59, 0, 0, 0, 59, 0, 1, 0,132, 1,227, 9,131, 1,228, 9,129, 1,153, 8,168, 0,198, 3,
+ 9, 0,199, 3,134, 1,229, 9,134, 1,230, 9, 12, 0,231, 9, 12, 0,232, 9,134, 0,233, 9,142, 0,234, 9,142, 0,235, 9,
+ 32, 0,236, 9, 32, 0,237, 9, 32, 0, 38, 0, 12, 0,238, 9, 12, 0,239, 9, 12, 0,198, 8, 0, 0, 20, 0, 7, 0,210, 0,
+ 7, 0,250, 2, 7, 0,240, 9, 4, 0,170, 2, 4, 0, 57, 0, 4, 0, 19, 0, 4, 0,227, 7, 4, 0,241, 9, 4, 0,242, 9,
+ 4, 0,243, 9, 2, 0,217, 0, 2, 0,244, 9, 2, 0,245, 9, 2, 0,246, 9, 0, 0,247, 9, 2, 0,248, 9, 2, 0,249, 9,
+ 2, 0,250, 9, 9, 0,251, 9,138, 0, 15, 4, 12, 0,237, 2,135, 1,252, 9,136, 0, 34, 0,136, 1,110, 8, 7, 0,241, 3,
+ 7, 0,253, 9, 7, 0,254, 9, 7, 0, 77, 4, 7, 0,255, 9, 7, 0,110, 3, 7, 0,100, 3, 7, 0, 0, 10, 7, 0, 62, 2,
+ 7, 0, 1, 10, 7, 0, 2, 10, 7, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10, 7, 0,242, 3, 7, 0, 7, 10,
+ 7, 0, 8, 10, 7, 0, 9, 10, 7, 0,243, 3, 7, 0,239, 3, 7, 0,240, 3, 7, 0, 10, 10, 4, 0, 11, 10, 4, 0, 90, 0,
+ 4, 0, 12, 10, 4, 0, 13, 10, 2, 0, 14, 10, 2, 0, 15, 10, 2, 0, 16, 10, 2, 0, 17, 10, 2, 0, 18, 10, 2, 0, 37, 0,
+137, 0, 8, 0,136, 1, 19, 10, 7, 0, 20, 10, 7, 0, 21, 10, 7, 0,213, 1, 7, 0, 22, 10, 4, 0, 90, 0, 2, 0, 23, 10,
+ 2, 0, 24, 10,137, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 25, 10,138, 1, 6, 0,138, 1, 0, 0,
+138, 1, 1, 0,137, 1,144, 8, 4, 0,223, 0, 2, 0, 26, 10, 2, 0, 19, 0,139, 1, 5, 0,139, 1, 0, 0,139, 1, 1, 0,
+ 12, 0, 27, 10, 4, 0, 28, 10, 4, 0, 19, 0,140, 1, 9, 0,140, 1, 0, 0,140, 1, 1, 0, 12, 0,124, 0,139, 1, 29, 10,
+ 4, 0, 19, 0, 2, 0, 26, 10, 2, 0, 30, 10, 7, 0, 91, 0, 0, 0, 31, 10,161, 0, 6, 0, 27, 0, 31, 0, 12, 0,201, 4,
+ 4, 0, 19, 0, 2, 0, 32, 10, 2, 0, 33, 10, 9, 0, 34, 10,141, 1, 7, 0,141, 1, 0, 0,141, 1, 1, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 4, 0, 23, 0, 0, 0, 35, 10, 0, 0, 36, 10,142, 1, 5, 0, 12, 0, 37, 10, 4, 0, 38, 10, 4, 0, 39, 10,
+ 4, 0, 19, 0, 4, 0, 37, 0,143, 1, 13, 0, 27, 0, 31, 0,144, 1, 40, 10,144, 1, 41, 10, 12, 0, 42, 10, 4, 0, 43, 10,
+ 2, 0, 44, 10, 2, 0, 37, 0, 12, 0, 45, 10, 12, 0, 46, 10,142, 1, 47, 10, 12, 0, 48, 10, 12, 0, 49, 10, 12, 0, 50, 10,
+144, 1, 30, 0,144, 1, 0, 0,144, 1, 1, 0, 9, 0, 51, 10, 4, 0, 77, 7, 4, 0, 37, 0,211, 0,248, 5,211, 0, 52, 10,
+ 0, 0, 53, 10, 2, 0, 54, 10, 2, 0, 55, 10, 2, 0, 98, 7, 2, 0, 99, 7, 2, 0, 56, 10, 2, 0, 57, 10, 2, 0,148, 3,
+ 2, 0,107, 6, 2, 0, 58, 10, 2, 0, 59, 10, 4, 0,209, 1,145, 1, 60, 10,146, 1, 61, 10,147, 1, 62, 10, 4, 0, 63, 10,
+ 4, 0, 64, 10, 9, 0, 65, 10, 12, 0, 66, 10, 12, 0, 46, 10, 12, 0,116, 7, 12, 0, 67, 10, 12, 0, 68, 10,148, 1, 16, 0,
+148, 1, 0, 0,148, 1, 1, 0, 0, 0, 69, 10,149, 1, 70, 10, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 71, 10, 2, 0, 72, 10,
+ 2, 0, 73, 10, 2, 0, 74, 10, 2, 0, 75, 10, 2, 0, 76, 10, 2, 0, 77, 10, 2, 0, 78, 10, 2, 0, 70, 0, 2, 0,209, 1,
+150, 1, 9, 0,150, 1, 0, 0,150, 1, 1, 0, 12, 0, 79, 10, 0, 0, 80, 10, 2, 0, 81, 10, 2, 0, 82, 10, 2, 0, 83, 10,
+ 2, 0, 37, 0, 9, 0, 84, 10,219, 0, 12, 0,219, 0, 0, 0,219, 0, 1, 0, 0, 0, 69, 10, 26, 0, 30, 0,151, 1, 92, 7,
+ 9, 0, 85, 10,149, 1, 70, 10,142, 1, 86, 10, 12, 0, 87, 10,219, 0, 88, 10, 2, 0, 19, 0, 2, 0,105, 1,145, 1, 23, 0,
+145, 1, 0, 0,145, 1, 1, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 5, 0, 2, 0, 6, 0, 2, 0, 89, 10, 2, 0, 90, 10,
+ 2, 0, 91, 10, 2, 0, 92, 10, 0, 0, 93, 10, 0, 0, 37, 0, 2, 0, 71, 10, 2, 0, 72, 10, 2, 0, 73, 10, 2, 0, 74, 10,
+ 2, 0, 75, 10, 2, 0, 43, 0, 0, 0, 94, 10, 2, 0, 95, 10, 2, 0, 96, 10, 4, 0, 70, 0, 9, 0, 85, 10,152, 1, 8, 0,
+152, 1, 0, 0,152, 1, 1, 0, 9, 0, 2, 0, 9, 0, 97, 10, 0, 0,193, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 98, 10,
+153, 1, 5, 0, 7, 0, 99, 10, 4, 0,100, 10, 4, 0,101, 10, 4, 0, 40, 1, 4, 0, 19, 0,154, 1, 6, 0, 7, 0,102, 10,
+ 7, 0,103, 10, 7, 0,104, 10, 7, 0,105, 10, 4, 0, 17, 0, 4, 0, 19, 0,155, 1, 5, 0, 7, 0, 67, 8, 7, 0, 68, 8,
+ 7, 0,196, 2, 2, 0, 17, 2, 2, 0, 18, 2,156, 1, 5, 0,155, 1, 2, 0, 4, 0, 54, 0, 7, 0,106, 10, 7, 0, 67, 8,
+ 7, 0, 68, 8,157, 1, 4, 0, 2, 0,107, 10, 2, 0,108, 10, 2, 0,109, 10, 2, 0,110, 10,158, 1, 2, 0, 42, 0, 78, 6,
+ 26, 0,147, 8,159, 1, 3, 0, 24, 0,111, 10, 4, 0, 19, 0, 4, 0, 37, 0,160, 1, 6, 0, 7, 0,106, 0, 7, 0,198, 2,
+ 7, 0,112, 10, 7, 0, 37, 0, 2, 0,216, 0, 2, 0,113, 10,161, 1, 7, 0,161, 1, 0, 0,161, 1, 1, 0, 27, 0, 81, 6,
+ 0, 0,114, 10, 4, 0,115, 10, 4, 0, 90, 0, 0, 0,193, 3,162, 1, 6, 0, 12, 0,198, 8, 0, 0,116, 10, 7, 0, 61, 0,
+ 7, 0, 98, 10, 4, 0, 17, 0, 4, 0, 19, 0,163, 1, 3, 0, 7, 0,117, 10, 4, 0, 19, 0, 4, 0, 37, 0,164, 1, 15, 0,
+164, 1, 0, 0,164, 1, 1, 0, 70, 1,186, 8,162, 1, 62, 0, 12, 0, 73, 3, 35, 0, 50, 0,163, 1,118, 10, 4, 0, 54, 0,
+ 7, 0, 61, 0, 2, 0, 19, 0, 2, 0, 25, 1, 4, 0,115, 10, 0, 0,114, 10, 4, 0,119, 10, 7, 0,120, 10,165, 1, 2, 0,
+ 0, 0,121, 10, 0, 0,122, 10,166, 1, 4, 0,166, 1, 0, 0,166, 1, 1, 0,159, 0, 27, 3, 12, 0,123, 10,167, 1, 24, 0,
+167, 1, 0, 0,167, 1, 1, 0, 12, 0,124, 10,159, 0, 41, 8,166, 1,125, 10, 12, 0,126, 10, 12, 0, 73, 3, 0, 0,193, 3,
+ 7, 0, 98, 10, 7, 0,127, 10, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,243, 8, 7, 0,244, 8, 7, 0,213, 2, 7, 0,247, 8,
+ 7, 0, 43, 8, 7, 0,248, 8, 2, 0,128, 10, 2, 0,129, 10, 2, 0, 43, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 70, 0,
+168, 1, 6, 0,168, 1, 0, 0,168, 1, 1, 0, 12, 0,124, 10, 4, 0, 19, 0, 4, 0,133, 2, 0, 0,193, 3,169, 1, 10, 0,
+169, 1, 0, 0,169, 1, 1, 0, 27, 0, 81, 6, 0, 0,130, 10, 4, 0,131, 10, 4, 0,132, 10, 0, 0,114, 10, 4, 0,115, 10,
+ 2, 0, 19, 0, 2, 0,133, 10,170, 1, 6, 0,170, 1, 0, 0,170, 1, 1, 0, 12, 0,134, 10, 0, 0,193, 3, 4, 0, 19, 0,
+ 4, 0,135, 10,171, 1, 5, 0,171, 1, 0, 0,171, 1, 1, 0, 0, 0,114, 10, 4, 0,115, 10, 7, 0,186, 2, 39, 0, 12, 0,
+159, 0, 67, 3,159, 0,136, 10,166, 1,125, 10, 12, 0,137, 10,167, 1,138, 10, 12, 0,139, 10, 12, 0,140, 10, 4, 0, 19, 0,
+ 4, 0,217, 0, 2, 0,141, 10, 2, 0,142, 10, 7, 0,143, 10,172, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0,173, 1, 5, 0,
+173, 1, 0, 0,173, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 0, 0, 20, 0,174, 1, 6, 0,173, 1,144, 10, 32, 0, 45, 0,
+ 4, 0,145, 10, 7, 0,146, 10, 4, 0,147, 10, 4, 0,175, 8,175, 1, 3, 0,173, 1,144, 10, 4, 0,145, 10, 7, 0,148, 10,
+176, 1, 8, 0,173, 1,144, 10, 32, 0, 45, 0, 7, 0, 35, 1, 7, 0,149, 10, 7, 0,250, 2, 7, 0,109, 8, 4, 0,145, 10,
+ 4, 0,150, 10,177, 1, 5, 0,173, 1,144, 10, 7, 0,151, 10, 7, 0,185, 7, 7, 0,219, 2, 7, 0, 57, 0,178, 1, 3, 0,
+173, 1,144, 10, 7, 0,109, 8, 7, 0,152, 10,128, 1, 4, 0, 7, 0,153, 10, 7, 0,193, 9, 2, 0,154, 10, 2, 0, 40, 1,
+179, 1, 14, 0,179, 1, 0, 0,179, 1, 1, 0, 12, 0,155, 10, 12, 0,156, 10, 12, 0,157, 10, 0, 0, 20, 0, 4, 0, 31, 0,
+ 4, 0, 19, 0, 4, 0,158, 10, 7, 0,159, 10, 4, 0,147, 10, 4, 0,175, 8, 7, 0,202, 3, 7, 0,221, 2,133, 1, 23, 0,
+ 4, 0,145, 10, 4, 0,160, 10, 7, 0,161, 10, 7, 0, 57, 0, 7, 0,162, 10, 7, 0,217, 2, 7, 0,153, 10, 7, 0,163, 10,
+ 7, 0,198, 2, 7, 0,164, 10, 7, 0, 74, 4, 7, 0,165, 10, 7, 0,166, 10, 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, 7, 0,174, 10, 7, 0,175, 10, 12, 0,176, 10,122, 0, 33, 0,
+121, 0,177, 10,180, 1,178, 10, 68, 0,179, 10, 68, 0,223, 9, 68, 0,180, 10,181, 1,181, 10, 48, 0,165, 0, 48, 0,182, 10,
+ 48, 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,187, 8, 7, 0,189, 10,
+ 7, 0,141, 1, 7, 0,190, 10, 4, 0,191, 10, 4, 0,192, 10, 4, 0,193, 10, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,194, 10,
+ 2, 0,195, 10, 2, 0,196, 10, 4, 0,197, 10, 7, 0,198, 2, 4, 0,198, 10, 7, 0,199, 10, 4, 0,200, 10,138, 0,201, 10,
+ 12, 0,202, 10,123, 0, 11, 0,121, 0,177, 10, 59, 0,225, 0, 7, 0,106, 1, 7, 0,187, 8, 7, 0,203, 10, 7, 0,204, 10,
+ 2, 0,205, 10, 2, 0,206, 10, 2, 0,207, 10, 2, 0, 17, 0, 4, 0, 37, 0,124, 0, 13, 0,121, 0,177, 10,140, 0,247, 2,
+142, 0,249, 2, 7, 0,144, 8, 7, 0,208, 10, 7, 0,209, 10, 7, 0, 37, 1, 7, 0,210, 10, 4, 0,211, 10, 4, 0,245, 2,
+ 2, 0, 17, 0, 2, 0, 37, 0, 4, 0, 70, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0};
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index fa000034caf..cfd526d82ef 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,5538 +1,5710 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 177005;
+int datatoc_blenderbuttons_size= 182512;
char datatoc_blenderbuttons[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73,
- 72, 68, 82, 0, 0, 2, 88, 0, 0, 2,128, 8, 6, 0, 0, 0, 64, 11, 6,158, 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, 4,103, 65, 77, 65, 0, 0,177,142,124,251, 81,147, 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, 2,168,136, 73, 68, 65, 84,120,218,236,157,119,120, 20,197, 31,198,223,217,221,235,119,233, 36, 33,133, 22, 58,132,150, 4,
-148, 94,165, 73, 17, 4, 5, 4, 21, 27,168,232, 15, 21, 1, 11, 2, 42, 96, 65,138, 10, 40, 22, 20, 4, 20,149,166, 72,147,222,
- 9, 82, 66,111,129, 52, 66, 18,210,175,223,238,252,254,200,221,121, 57, 46,185, 11,132,234,124,158,231,158, 43,187,251,222,236,
-238,204,236,187,223, 41, 75, 40,165, 96, 48, 24, 12, 6,131,193, 96, 84, 30, 28, 59, 4, 12, 6,131,193, 96, 48, 24,247,144,193,
- 34,132, 52, 97,154, 76,147,105, 50, 77,166,201, 52,153, 38,211,100, 6,203,251, 65,165,183,224, 68, 81,251,171,227,221,174,121,
- 11,247,157, 86,162,102, 71,187,230,228,123, 36,157, 29,239, 86, 77,199,254, 86,166,174,235, 49,172,172,227,233,146, 78, 90,217,
-233,188, 85,154,149, 93, 46, 43, 51,143,122, 56,239,147,239,145,116,118,188,219, 52,221,243, 79,101,232,122,202,147, 55,123, 60,
- 61,164,147, 86,118, 58,111,149,102,101, 95, 47, 43, 43,143,150,115,238, 43,237,218,116, 55, 35,220,105,131, 1, 0,148, 82,226,
-162, 79,238, 86, 77,215,227,224,208,175,204,180, 86, 34, 91, 43, 91,211,237,120, 86, 22,147, 41,165,132, 16,178, 13, 64,199,202,
-220,247,202, 56,239,110,251, 90, 41,186,183,210, 92, 85,102,190,191,213,154,149, 85,150,220, 53, 43, 35,223,123, 58,239,183,240,
- 28, 85, 86, 58, 43,165, 44,221,138, 60,239, 33,255,220,180,174,187,102,101,148, 37,119,205,202,200,247,183, 67,179, 50,202,146,
- 39,205,202,200,247,101,157,123, 22,193,186, 61, 70,192,189, 96,119,186,155,141,208, 45,142, 98,117,188, 23, 52, 43,249, 28, 77,
-182,107, 86,230,221, 76,167,202, 58, 71,238,121,167, 50,238,186, 92, 53, 43, 43,111,122, 72,231, 77,159, 39, 79,154, 55,155,222,
- 50,210, 89,233,251,126,179,249,254,118,105, 86,242, 57,170,148,178,228,166,217,169,146,111, 2, 58, 85,102, 89,114,213,172,172,
-178,228, 33,157, 55,125,158, 60,105,222,108,122,203, 72,103,165,239,123, 37, 70, 68, 43, 93,247,190,139, 96,221, 74,115,117, 43,
-204,155,227, 46,169,178, 47,100,149,105,178,110, 85,164,173,178,162, 56, 30,116,183, 85,162,220,214,202, 78,167, 61,125,228, 86,
- 24, 97, 74,233,100, 66,200,123,119,115,129,102,101,137,149,165,187,173, 44,121,202, 55, 55, 91,150,110,213,205,179,171,102,101,
- 25, 33, 15,251,126, 83,101,201,125,219,202, 40, 75, 94, 52,201,173,216,255,202, 46, 79,119, 35,119,205, 40,194, 91,208,191,135,
-222,138,168,216, 45,220,239,202, 76,103,167,123, 97,223,111, 69, 58, 9, 33,147,111,209,190,223, 43,199,148,149, 37, 86,150,238,
-186,178,228,150, 39, 59, 85, 86,100,168,178,111,164,220, 53, 43,179, 31, 82,101,230,209, 91,189,239,149, 89,150,110,197,185,191,
- 87,168,112, 4,235, 86,221, 29,223, 11,154,183, 66,251, 22,237,251,182, 91,113,119,112, 11,250,117, 85,122, 58, 41,165,147, 81,
-137, 77,142,142,125,174,204,180,222,202,102,194, 91,145, 55,111,101,126,175,204,126, 30,183,104,223,239,149,243, 94,233,233,172,
-172,178,228,225,156,223,116, 90, 61, 29,191,202,110,194,174,204,188,121, 43, 53, 43, 67,251, 86,164,243, 86,157,251,123, 9,194,
- 38, 26,101, 48, 24, 12, 6,131,193,168, 92,202,140, 96,197,197,197,173, 85,169, 84,117,202, 90,174,215,235, 51, 14, 31, 62,220,
-153, 29, 66, 6,131,225,245, 78,142, 16, 14,255,118, 73,144, 74,110,102,217,221, 29,131,193,248, 15, 26, 44,185, 92, 30,179,125,
-251,246,122,146, 36,193,102,179, 65, 20, 69,136,162, 8,155,205, 6,179,217,140, 71, 31,125,180,194,205,139,205,155, 55,223,206,
-113, 92,205,138,108, 35,138,226,229, 35, 71,142,180, 43,107,121,120,120,248,110, 0, 49,132, 16,215,202, 28,142,239,174,191,115,
-156,179,203, 89,122, 74, 74, 74, 92,121,154,132,144, 24, 87, 61,119, 45, 15,186,229,106, 54,104,208,224,160, 32, 8,209,158,182,
- 47, 75, 91,146,164, 11,199,142, 29,107,195,178,233,237,161,121,243,230,219,121,158,175,112,254, 60,124,248,112,153,249,179, 73,
-147, 38,255,112, 28, 23,233,233, 28,151,145,159,120, 81, 20, 79, 31, 57,114,164, 93, 89, 6, 36, 34, 34, 98, 55,165, 52,198,199,
-124,233, 32, 53, 37, 37, 37,193, 91, 57, 42, 47,157, 30,180,203,213,116, 53, 87, 81, 81, 81, 51, 66, 67, 67, 71,235,245,122, 35,
- 0,202,113, 28,109,212,168, 81, 41,125, 81, 20,179, 78,158, 60,201, 38, 47,100, 48, 24,247,183,193,146, 36,137, 51,153, 76, 56,
-115,230, 12, 60,213,243, 28,199,137, 21,253, 51, 74,105,189,205, 75, 23,135,169, 67,195, 33, 90,204, 80, 86, 9,115,106,231,157,
- 56, 6,209, 98,129,100,181,160, 74,194,131,142, 52,160, 83,167, 78,188, 23,217,232,177, 99,199,134,249,249,249,193,104, 52,194,
-104, 52,194,100, 50,193,100, 50,193,108, 54,195,108, 54,195, 98,177,192, 98,177,192,106,181,194,100, 50,225,216,177, 99,162,151,
- 11, 66,244, 43,175,188,226,212, 52,153, 76, 48, 26,141, 78, 45,147,201,228,212, 52,155,205, 48,153, 76, 56,126,252,120,185,154,
-130, 32, 68, 31, 58,116, 40, 76, 46,151,131, 82, 10, 73,146, 64, 41, 45,245,114, 59, 86,104,219,182,173,133,101,209,219, 74,189,
-149, 31,125, 24,166, 12,169, 2,201,106, 69, 72,243,120,231,185, 72,219,252, 23, 36,171, 21,146,213,138, 26,125, 7, 58,127,239,
-216,177,163,183,252, 89,227,215, 73, 19, 3,229,126,126,176, 25,141,168,213,103,128,115, 65,210,252, 89,160, 86, 43,168,205,130,
-166,175,189, 3, 0,200,206,206, 54, 52,108,216, 48, 29, 37,253, 20,202,138,240, 68, 95,188,120, 49,204,145, 6,119,163,206,113,
- 92,169,215,206,157, 59, 49,124,248,112,111,251, 30,253,246,219,111,135, 57,202,136,107, 94,183, 90,173,206,242, 99,179,217, 96,
-181, 90, 97, 54,155,241,207, 63,255,248, 20,185,138,136,136,248,168,125,251,246, 35,151, 44, 89,162,253,253,247,223,181,181,106,
-213,130, 92, 46, 7,207,243,224,121, 30, 28,199,129,231,121,244,239,223,159,176, 44,200, 96, 48,238,123,131,101,177, 88, 46,118,
-239,222,157, 2,128,217,108,142, 82, 40, 20,114, 55, 3, 22,217,182,109,219,211,238,219,121,107, 58, 84,135,134,227,187, 90,193,
- 0,128,193,231,115,156, 23,133, 21, 29, 90, 56,215, 25,122, 41,191,100, 93,181, 26, 28,199, 17, 47, 21, 56,116, 58, 29,186,119,
-239, 14,133, 66,129,248,248,120,200,229,114,200,100,178, 50, 95,190,160,213,106, 49,101,202, 20,135, 57,130, 86,165,196,139,237,
- 31,132,138, 80,124,119,228, 20, 76,162, 4, 65, 16, 32, 8, 2,100, 50,217,117, 17, 41, 79,200,229,114, 28, 59,118, 12, 60,207,
- 67, 16,132, 82,239, 60,207, 99,205,154, 53, 24, 52,104, 16,120,158,135, 70,163, 1,254, 67,157, 1,239, 22,148, 33, 85,240,107,
-199,146, 64,228, 19, 41,133,206,223,255, 26,210,215,249,121, 68, 90, 49, 8, 33,144,203,229,190,157,119, 63, 63,252, 57,168, 23,
- 0, 96,224,153,171,206, 60,115,116,214,135,144, 41, 20, 16,100,114, 52, 25,251, 54,178,179,179, 13, 3, 7, 14,220,169, 82,169,
-214,251,112,179,130,203,151, 47, 59,181,100, 50,217,117,249,158,227, 56,124,255,253,247,184,116,233,146, 79,251,110, 48, 24, 48,
-109,218, 52,231,190,121,210,117,253,236,109,223, 9, 33, 92,213,170, 85, 63,104,223,190,253,240, 37, 75,150, 4, 17, 66, 48,111,
-222, 60, 8,130,128,135, 31,126, 24, 33, 33, 33,216,176, 97, 3,228,114, 57,198,141, 27,199, 50, 31,131,193,248,111, 24,172,195,
-135, 15,247,114,124,126,240,193, 7, 79,238,220,185,179,129, 75, 40, 31, 54,155, 77,110,179,217,234, 57,154, 13,109, 54, 27, 76,
- 38, 19,134, 14, 29, 90,238, 29,189,104, 49, 95,103,144,202, 50, 78,190, 98, 54,155, 49,120,240, 96,167,137, 41,207, 92,249,120,
- 97,128,201,100,130, 32, 8,168, 93, 61, 20,239, 12, 78, 64, 91,158,194,144, 3, 32,187, 24, 79, 69, 8, 56, 28, 93, 15,159, 95,
-206,193,165,130, 34, 8,130,111,173,165,146, 36,149, 50, 84,238,159, 23, 44, 88,128, 33, 67,134,128,231,249,235,154,144, 24,183,
- 7,201,106,245,154, 15, 43,122,110,108, 70, 35, 0,128,119, 49,228, 50,153, 12, 10,149, 10,188, 76, 6, 65, 33, 71,118,118,182,
-225,161,135, 30,218,171, 86,171,127,168, 90,181,106, 90,106,106,106,185,249,147, 82, 10,153, 76, 6, 65, 16,202,204,243,223,127,
-255, 61, 22, 47, 94,140, 86,173, 90,249,148,231,205,102, 51,228,114, 57, 62,252,240,195,235,150,207,159, 63,255, 58,131,229, 69,
-143, 0,224,194,195,195, 95, 92,186,116,169,191,227,255, 67, 66, 66, 32,147,201, 16, 27, 27, 11, 63, 63, 63,236,220,185, 19,162,
- 40,250,108, 86, 25, 12,198,127, 22, 25,128,230, 0, 66, 1,136, 0, 10, 1, 4,186, 44,207,178,191,135,186,124, 63,224, 65,167,
-165,125, 29,199,114,199,119, 51, 0,133,135,223,115, 0,168,237, 47, 19,128,221, 0, 98, 93,254,199,177, 29,220,255, 87,176, 87,
-134, 29, 1,108, 5,208,201,211,228,119,142,230,194, 83,167, 78,193, 91,191, 84,111,195, 59,149, 85,194,156,145,171, 95,106,135,
- 56,127, 31,146,156,231,172, 96,255,108, 85, 23, 74,157, 22, 9,147, 63,241,122,196, 29, 23,134,171, 87,175, 94,119,231,125,163,
- 6, 11, 0,172, 86, 43,212,106, 37,182,124,213, 1, 25, 23,108,248,112,109, 10, 86,237,191, 8, 65, 16,208,167, 65, 93, 60,106,
- 3,102, 4,171,240,130, 77,132, 69,162, 62, 93,192, 40,165,215,153, 43, 87,147, 69, 8,113,254,198, 46, 54,119,134,144,230,241,
-206,200,213,146,106,126,215, 69,173, 0, 96, 85,139,154, 80,249,233, 16,251,234, 4,159,242,103,173, 62, 3,156,145,171, 63,226,
- 99, 32,200,229,144, 41, 21,120,244, 72, 10,128,146,102,193, 46, 77, 27,109,203,227, 21,139,158,124,242,201, 11,155, 55,111,214,
-248,146, 86,185, 92, 94,202,176,121, 50, 87,130, 32,192,234,102, 26,203,187,169, 40,203, 56, 57,202, 85, 69, 34, 88, 0,160,215,
-235,205,171, 86,173,194,231,159,127,142,144,144, 16,116,239,222, 29, 85,171, 86,197,138, 21, 43, 64, 41,197,203, 47,191, 12,181,
- 90, 13,181, 90,205,242, 60,131,241, 31,199,139, 23,233, 48,113,226,196,132, 25, 51,102, 76,107,221,186,245,178,221,187,119, 47,
- 37,132,172,117,241, 30,125,236, 26,107, 93,190,183,116, 51, 89, 50, 0,161,132,144,181,142,245, 93,191,187,252,222, 13,128,194,
-241,125,226,196,137,177, 51,102,204,152, 54, 97,194,132,183,166, 79,159, 46,159, 56,113, 98,211, 25, 51,102, 76,115,252,143,167,
-116,184, 70,176,202,157, 5,216, 98,177, 92,236,214,173,155, 79, 35,126, 12, 6,195, 21, 47, 6,204, 99,100,192, 53, 42,160,244,
-211, 65,237,231, 7,194,249, 86,225, 90,173, 86, 8,130, 0,142,227,176,113,227, 70,168,213,106,244,238,221,251,134,155, 8, 29,
-166, 77,161,144, 67, 8,228,240,228,103, 7,145,149,171,119, 54, 9,110, 74, 78,193,126,181, 26,239, 52,106, 10, 93, 81, 50, 10,
- 76,230,155,138, 96, 13, 25, 50, 4, 70,163, 17, 28,199, 57,127,227, 56, 14,255,165,103, 54,221,133, 5,221,227,119, 66, 8, 84,
-254,126, 80,233,116,224, 5,222, 39, 45, 74,233,191, 70, 72,161,128, 76,169,128, 32,151, 59,205,213, 67, 15, 61,180, 55,143, 87,
- 44, 74, 75, 75,219, 11, 64,229,171,193,114, 68,176,202, 51, 87,130, 32,192, 98,177,248,100, 94, 76, 38, 19,228,242,127,123, 2,
- 92,190,124,185, 92,131,229,101,159, 41, 33, 68, 34,132, 72, 49, 49, 49,206,109,194,195,195, 17, 24, 24, 8, 73,146, 32, 73, 18,
- 84, 42, 21,212,106,117,169,255,101, 48, 24,255, 89,202,243, 34,202, 25, 51,102, 76,115, 53, 48,238,134,198,213, 56,185,153, 40,
- 87,147, 22,235,165,238, 95,235,110,154, 28,255, 75, 8, 89, 59,125,250,244, 62, 94,210,145,229,110,176,202,157,102,223,181,185,
-176,178, 46, 94,229, 93,192,212, 1,254, 80,104,181,176,119,191,162,222,180, 44, 22,139,179,207,201,232,209,163,203,188,171,119,
-237,155,226, 13,179,217, 12,158,227, 1,101, 45, 72,216,231,188, 88, 57, 95,114, 57,146,171, 55, 3,185,146, 6, 65,240,173,191,
-191, 35,130,229, 48, 81, 47,191,252, 50, 22, 46, 92,232,236,152, 12, 0, 60,207,163,126,253,250, 56,127,254, 60, 43,106,119, 0,
- 74,169,215,102,107,149,191, 31,148, 58, 29,120, 31, 34,141,142,229,206, 62, 76, 42, 37,120,185, 28,130,188,164, 89,176, 95,191,
-126,219,242,242,242, 22, 53,110,220,248, 44, 74,166, 49, 32,190,150, 31, 79,249,124,209,162, 69,165,204, 85, 69, 34, 88,142,114,
-228,138,167,230,194,129, 3, 7,250, 26,193,162,132, 16, 42,147,201,208,173, 91, 55, 52,109,218, 20,171, 86,173,130, 36, 73,120,
-233,165,151,160, 86,171, 49,123,246,108,216,108, 54,204,152, 49,131, 69,176, 24, 12, 70,121, 94,196, 48, 97,194,132,183, 8, 33,
-107,237,145,164,164,114,140,148, 39, 90,186,153,180,172, 50,174, 1,125, 60,153, 44,215,207, 14, 38, 78,156, 24,235, 33, 29, 7,
-174, 51, 88, 46,174,241,150,146,119,226,152,179, 67,187,163, 89,144, 16,130,191,218, 52,128, 66,167,133, 74,167, 67,187,149, 59,
-156,119,205,248, 96,166, 79, 17, 44,135,113,202,201,201,241,218, 68,232,107, 84,140,151,203,176, 87, 39, 3,149,241,165, 46, 88,
- 50,153, 12,156, 32, 67,114,104, 61, 16, 97, 3, 4,209,230,211,197,193, 17,201,112, 29, 61,245,228,147, 79,130,227, 56,167,201,
-106,209,162, 69,169,188,198,138,219,237, 37,253,239,245, 88,247,120, 73, 89,117,109, 22, 92,219,170, 14,148,126, 58, 40,181, 90,
-116, 92,179,219,217,156,139,217, 95,123,213, 60,245,237,151, 72,154, 51, 29,130, 76,134, 1,135,146,157,145,171,182, 13,234,238,
- 53,107,253, 23, 93,190,124,121, 47, 0,238,241,199, 31, 15,140,139,139,227,125,172,132, 74,117, 60, 23, 4,193,163,185, 18, 4,
- 1, 54,155,205,167,125,183, 88, 44, 62, 69,146, 28, 81, 44, 31,242, 59,109,216,176, 33,120,158, 71, 64, 64, 0,252,252,252,156,
- 35,104, 29,145, 43, 71,255, 77, 95,203, 37,131,193,184,239,111,114,203,242, 34,166,233,211,167, 39, 77,159, 62,221, 25, 73,114,
-143, 96,149,193,195,118, 51, 21,234, 48,103, 40,233, 75,117,160,156, 52,244, 41,203,120,185,254, 54, 99,198,140,105, 30,210,225,
-108,150,244,216, 59,187,121,243,230,235, 52, 26, 77, 45, 95, 15, 72, 69, 38, 29, 21, 45,150,235,238,196, 9, 33, 80,233,116, 80,
-248,233,160,212,233,202,140,114,149,117,161,113, 52, 17,242, 60,239,188,232,252,240,195, 15,208,233,116,120,250,233,167,111,168,
-147,123,137,193,226,177, 90,126, 6,144, 11,215, 93,180,120,153, 12,151, 3,170,129,147,201, 32,136,190, 69, 8,242,243,243,193,
-243, 60,222,123,239, 61,204,152, 49,195, 57,140,222,117,104,189,107,212,131,113,251,113,237,228, 94, 42,170,234,231,231,204,159,
-174,191,123,235,147, 72, 8, 1, 68, 91,201,104, 65,165,194,105,174,250,245,235,183,205,172,245, 95,212,160, 65, 3, 71,228,138,
-211,104, 52, 94, 71,205,186,150, 13,135,209,113, 55, 87,142, 40,169,227,179,213,106,245, 41,207, 59, 12,214,194,133, 11,203,189,
- 25,113,252,175,175,249,148,227, 56,108,223,190, 29,135, 14, 29,194,232,209,163,161, 86,171, 49,119,238, 92,216,108, 54, 76,157,
- 58, 21,106,181, 26, 10,133,130,101, 62, 6,131, 81, 30, 65, 14,131, 99, 55, 73,165, 34, 75,148,210, 62,174, 38,168,172,166, 66,
-123,196,105,187,151,255,250,195,110,204, 60,226,136,164,185,213,161,107,221,205,153,224,112,140,174,239, 10,133,162,214,174, 93,
-187,234, 73,146, 4, 81, 20, 81,222,187,217,108,198, 99,143, 61,230,243,164,163,146,181,196, 96,113,110, 35,229,148,254,126, 80,
-232,254,189,128,185, 92,196,188,214,226,142, 8,150,171,193,122,239,189,247, 32, 8, 2, 22, 46, 92, 8, 0,120,227,141, 55, 42,
- 28,193,162, 18,176, 91,220,138,200,121,205, 64, 23,169,144,185,253, 36,100, 50, 25,170,182,122, 8, 82,194,163,200, 81,248, 67,
-107,239, 87,229, 75,179, 99, 78, 78, 14, 46, 93,186, 4, 66, 8, 94,123,237,181,114,205,213,198,141, 27, 89, 31,172, 59,104,176,
- 56,158, 47,117, 62, 92,243,167,155,249,242,222, 78,102,179, 65,166, 84,150, 26, 45,152,151,151,183,232,242,229,203,251, 0,144,
-225,195,135, 7,106, 52, 26,124,251,237,183,122, 0,242,149, 43, 87,170,189,105,186,246,227,115,143, 92,185, 27, 44, 81,244,222,
-132,237,184,169,240, 37,218, 91, 17,131,229,200,223,132, 16,136,162,232,140, 92, 89,173, 86,231,119,165, 82,201, 50, 30,131,193,
-240,246, 92,209, 44,183,126, 78,196, 45,210,148,229,201, 88,185, 54, 7,186,124,182,122,208, 53,187, 53, 29,186,255,238,120,207,
-153, 62,125,250, 22, 71,228,202,229,247, 82,233, 40, 51,130,197,113, 28, 76, 38, 19, 78,156, 56,225,235, 29,170,207,147,142,134,
-196, 63,128,161,151,242, 65, 8,193,134,246,141,161,210,233, 32,215,105,209,230,215,173,206, 10, 59,121,198, 56,200,181, 58,132,
-180,123,200,167, 10, 92, 20,197,235, 12, 86, 94, 94, 30,100, 50, 25, 62,248,224, 3,112, 28,135,143, 62,250, 8, 81, 81, 81,200,
-200,200, 64,199,142, 29,125,186,216,112, 18, 7,213, 83,193, 80,189,224, 7,110,116, 29,196,246,125, 1,249,133, 53,113,212,172,
- 69,195,226, 51, 8,250,123, 50, 44,146,205,167,105, 26, 8, 33,176,217,108,216,178,101, 11,100, 50, 25,108, 54,155,243,226, 67,
- 41,117,206,146,239,152,212,241,163,143, 62, 98,165,237, 14, 80,237,225, 71,240,100,186, 30, 0,176,174, 77, 3, 40,181, 90, 40,
-252,116,104,247,251,118,103,254,188, 48,237,117,200,181, 58, 4,182,108,239,147,102,163,151,222, 64,195, 23, 95, 71,118,118,182,
-161, 91,139,216,237,249,188,242,251, 38, 77,154, 56,251, 92,105, 52, 26,168, 84, 42,226,136,100,249,106, 90, 56,142,243,106,174,
- 28,159,125,189,169,112, 31,133, 91,158,193,242, 21,142,227,240,244,211, 79, 35, 34, 34, 2,159,127,254,121,169,200,213, 91,111,
-189, 5,171,213,138,217,179,103,179,204,199, 96, 48,202,227, 64, 5,214,109,233, 98,150, 14,220,160,238,129,155, 77,176,199,154,
-215,100, 50, 37,119,237,218, 21,101, 44,139, 82, 42,149,165,106, 87,199,164,163,238, 77,133,132,144, 38,148,210, 99,110, 14,245,
-223,102, 65,123,103, 97,133, 91,179,139, 66,231, 7,153, 86, 7,206, 67, 37,238, 73,211, 83, 4,203,209,116,146,159,159, 15,153,
- 76,134,207, 63,255, 28,254,254,254, 48,153, 76,158, 58,216,123,212,228,121, 30,250, 75,122, 92,124,247, 40,148,218,115,168,255,
-144, 31,252,100,231, 81,119,199, 74,216,108,102,192,165,201,208, 23,205,250,245,235,227,189,247,222,187,110,122,134,178,136,143,
-143,247,170,121,179, 48, 77,207,154,132, 16, 40,253,116, 80,249,249,149,153, 63, 5, 15,115, 55,185,107, 58,150, 59, 34, 87, 69,
-114,205,247,151, 47, 94,220, 7,128, 27, 62,124,120,128, 70,163,193,130, 5, 11,244, 0,184,247,223,127, 95, 83,163, 70, 13,222,
-151,116,114, 28,135, 31,126,248,225,186, 62, 87,101, 25, 44, 95,210,105,179,217,174, 51, 88,131, 7, 15,190,110,162,209,178, 34,
- 88,158,210,233,232,171, 86,165, 74, 21,104, 52, 26,231, 99,183, 84, 42, 21, 84, 42,149,115,118,248,178,154, 90, 89,254,100,154,
- 76,243,191,163,121,135,204,216, 45,195,163,193,250,231,159,127,122,150,181, 65,219,182,109,207,236,218,181,171,174,235,179, 9,
-109, 54,155,220,100, 50,213,235,223,191,191,215, 91,101, 73,146,160, 84, 42, 65, 41, 69,243,119,102,148,220,194,115,255, 54, 9,
- 82, 74, 17,216,182, 27, 8,207, 67, 20, 37, 88,173, 86,175,163, 8,141, 70, 99,169, 14,232,158,134,175, 23, 21, 21,149, 59,207,
-143,187,166,193, 96, 40,213,175,139,136, 20, 23, 54,173,184,126, 52,161,253,127,124, 69,165, 82,149,106, 54,241,150, 20,118,211,
-114,123,113, 76,224, 73, 41, 69,236, 43, 19, 74, 34, 69, 60, 87,106,121, 64,203,246, 32,130, 12, 82, 73,191, 37,111, 3, 67, 72,
- 86, 86,150,161, 95,191,126,219, 40,165,223,245,239,223,255, 52, 74, 58, 88, 82,157, 78,167,148,201,100, 18,128,107, 0,104,110,
-110,110, 64, 90, 90,154,100, 52, 26,171,123, 75,231,246,237,219,113,238,220, 57,196,197,197, 57, 35,159,142,151,163,249,254, 70,
- 34, 88,158,102,132, 47,107, 38,247,138, 68,176, 2, 2, 2,160, 80, 40,240,193, 7, 31, 64, 46,151, 67,173, 46,105, 5,157, 61,
-123,182,243,152, 51, 24, 12,198,253, 68,133, 31,216, 44, 73, 18, 95, 86,243,161,183,166, 66, 81, 20, 83, 31,120,224,129,138,254,
- 95,166,151, 11, 98,234,142, 29, 59,228,238, 15,164,245,244, 0, 92,151,223,188,106, 30, 56,112, 64, 94,206,246,158, 62,103, 86,
-100,223,125,233,191, 98,179,217,210, 88, 22,189,125,216,108,182,212, 86,173, 90,121, 94,248,222, 71,101,157,215, 76, 47,166,229,
-108,189,122,245,210,117, 58,221, 31,225,225,225, 57,187,118,237, 10,105,217,178,101,136,235, 58, 45, 91,182,140,112,219,204,140,
-114,166, 39, 33,132,164, 62,249,228,147,114, 47,249,209,253,115,170,151,155,138,212,164,164, 36,185,167,252, 94,214, 59,165, 52,
-213,135,195,122,169, 87,175, 94,156,167, 50,228,225, 88,102,177, 92,200, 96, 48,254,179, 6,203,104, 52,166,116,237,218,213,227,
-184,111,189, 94,127,185,188,109,147,146,146, 18, 42,123, 7, 82, 83, 83,219,220, 11,154,183, 98,223, 25,119,255, 57, 74, 74, 74,
-106, 85,217,154,151, 47, 95,110,115, 47,104, 2,192,241,227,199, 91,179,156,197, 96, 48,152,193,242, 1, 95,167, 99, 96, 48, 24,
- 12, 6,131,193,248,175,194,177, 67,192, 96, 48, 24, 12, 6,131, 81,185, 16, 0, 77, 60, 45,168,200,232, 0, 66, 72,147,138,254,
-177, 55,125,166,201, 52,153, 38,211,100,154, 76,147,105,222,127,154,222,180,239,226,209,137, 21, 51, 88,222,102,162,190, 41,113,
- 54,132,149,105, 50, 77,166,201, 52,153, 38,211,100,154,255, 65, 88, 19, 33,131,193, 96, 48, 24, 12, 70, 37, 35,176, 67,112,103,
- 32,132,240,148, 82,177, 18, 37, 3, 1,148,245, 64, 55, 51,128,188, 27,212, 85, 0,144,217, 95, 64,201, 35, 6,172,118, 77, 6,
-131,113, 31,145,144,144, 48,146, 82,250, 97, 73, 21, 69, 62, 56,120,240,224, 23,236,168, 48, 24,149,108,176,234,212,169,115,144,
-227,184,104, 79, 15, 32, 46,107, 94, 28, 81, 20, 83, 79,158, 60,233,211, 80,119, 66,136, 16, 17, 17, 49, 88,171,213,118,230,121,
-190,173,125,251, 93,197,197,197, 91, 50, 50, 50,126,161,148,218,110,100,135, 98, 98, 98,252,141, 70,227, 99,132,144, 97, 0, 64,
- 41,253, 73,165, 82,253,124,225,194,133,130, 27, 52, 66,117,170, 86,173,250,147, 76, 38,227, 83, 82, 82, 58, 3, 64,181,106,213,
-182,152,205,102,241,234,213,171,195, 40,165,231, 42,168,199,201,229,242, 25,237,219,183,111, 71, 8,249,145, 82, 58,191,146,206,
-165,146,227,184, 75,158, 22, 72,146, 84,227, 6,244,228, 0, 2,102,207,158, 29,188,120,241,226, 22, 25, 25, 25, 77, 1, 32, 34,
- 34,226,232,240,225,195,255,249,223,255,254,119, 13, 64, 62, 0, 11, 43, 70,247, 54,245,234,213, 59,200,113, 92,116, 69,230,146,
-179, 63,162, 42,245,248,241,227, 9,101,105,242, 60, 31,237,101, 62,186,235, 62, 75,146,116, 33, 41, 41,201,227,148, 17,245,235,
-215,223,195,243,124, 45,111,105,243,148,206,178,166,224,168, 95,191,254, 65,158,231,163, 43,170, 41, 73,210,133, 99,199,142,181,
-169, 76,205,219,157, 78, 0,232,212,169,147,178,184,184,248, 39,157, 78,215,172,184,184,120, 36,165,116,210,214,173, 91,195, 57,
-142, 67,183,110,221, 38, 37, 36, 36, 92, 84, 42,149,243,140, 70,227, 63, 58,157,110,232,214,173, 91, 77,172,196, 48, 24, 55,105,
-176, 56,142,139, 62,116,232, 80,152, 86,171,133,221,168,192, 49,123,187, 36, 73,206, 23,165, 20,148, 82,216,108, 54,116,234,212,
-201,167, 63,141,142,142,110, 82,191,126,253, 21, 47,191,252,114,245,190,125,251, 42,194,195,195, 65, 8,193,149, 43, 87,234,173,
- 93,187,246,137,207, 63,255,252,189,232,232,232, 65,169,169,169,190,118,148,227, 34, 34, 34,186, 2,120,170, 73,147, 38, 3,223,
-120,227, 13,121,219,182,109, 33,138, 34,254,254,251,239,246,179,102,205,250, 60, 50, 50,242, 55, 0,139, 50, 50, 50, 54, 83, 74,
- 37, 31,117, 91,212,170, 85,235,231,237,219,183,215, 74, 78, 78, 22, 7, 12, 24,240, 35, 0,236,218,181,171, 25,165,148,180,109,
-219,118, 29, 33,228, 49, 74,233, 63, 21, 56,230,253,199,140, 25, 51,232,165,151, 94, 10, 29, 57,114,228,112, 0,243,237,255,229,
-120,200,101, 69, 59,197, 57, 35, 87,148, 82,121, 57,235,133, 87, 32,146,165,189,112,225, 66, 96,219,182,109, 95,186,122,245,234,
- 88, 87,221,204,204, 76, 28, 62,124,216,242,209, 71, 31,205,218,181,107,215,151, 49, 49, 49,121, 0,138, 89, 81,186,119,225,121,
- 62,234,224,193,131, 97, 26,141,198,249, 32,119,215,114,238, 40,227,174, 89,147, 82,138, 14, 29, 58,148,167, 25,157,152,152, 24,
-166, 86,171,157,117, 71,121,122, 46,154,150,114,234,164, 26, 7, 14, 28, 8,211,104, 52,160,148,122,213, 35,132,128, 82, 90,238,
-179, 71, 29,233, 84,169, 84, 62,105, 58,104,219,182,173, 88, 89,154,142,116,182,110,221,154,150,167,121,232,208,161, 48,199, 83,
- 48, 42,144,206,114,111,128,138,139,139,127,250,229,151, 95, 6,132,135,135,163,127,255,254, 27, 26, 55,110,172,208,104, 52, 88,
-183,110, 29,162,163,163,171,248,251,251,255, 57,125,250,116,204,156, 57,179,250,198,141, 27,151, 2, 24,192, 74, 12,131,113,243,
- 6, 11, 90,173, 22,203,150, 45,243,248,248, 25,247,207, 53,106,248, 22, 36,169, 90,181,106, 66,205,154, 53,183,173, 92,185, 82,
- 29, 22, 22,230,252,221, 98,177,192,223,223, 31, 79, 63,253,180,162, 91,183,110,117,159,120,226,137,189, 85,171, 86,237,120,229,
-202,149,131,229,233, 69, 68, 68, 12,140,141,141,253, 98,236,216,177,225,253,250,245, 67, 80, 80, 80,169,229,125,250,244, 65,239,
-222,189,229, 23, 46, 92, 24,242,203, 47,191, 12,249,241,199, 31,175, 68, 68, 68,140,201,200,200,248,173, 92,135,161,213,118,107,
-222,188,249,183,155, 55,111,142, 14, 12, 12, 68,100,100, 36,247,238,187,239, 54,169, 93,187,182, 58, 34, 34,130, 75, 79, 79,199,
-111,191,253, 86,123,248,240,225,171, 84, 42,213, 72,163,209,184,217, 7,195,166, 8, 14, 14, 30,247,194, 11, 47,132, 20, 22, 22,
-218, 14, 29, 58,116,206,241,187, 82,169,156,244,224,131, 15,198, 17, 66,150, 83, 74, 23,221, 72,228,138, 82, 90,128,127,155,242,
- 28, 88, 29,203,125,140,100, 41, 14, 29, 58, 20,212,182,109,219,223, 77, 38, 83,220,179,207, 62,155,246,201, 39,159, 40,252,253,
-253,253, 1,144,188,188,188,220, 41, 83,166,136,115,231,206, 29,223,184,113,227,174,187,118,237, 26, 16, 23, 23,199,154, 12,239,
-113, 52, 26, 13,214,172, 89,227,241, 49, 83,158,202,124, 96, 96,160,215,167, 17,168,213,106,108,220,184,209,185,157,235,163,165,
- 60,125, 14, 12, 12, 4,165,180, 92, 81,149, 74,133,157, 59,119, 58, 31, 3, 84, 86,189,228,120,215,104, 52, 32,132,112,222, 52,
-183,109,219,230, 85,203,241,174,211,233, 0,128,247, 37,157,222,246,217,241, 89,171,213,122, 61,158, 74,165,210,169,233,170, 81,
-214,119,251,205, 49,241,114,142,154,133,135,135, 99,223,190,125,152, 60,121,178, 34, 54, 54, 22,103,206,156, 1,199,113, 24, 57,
-114, 36, 26, 55,110,140, 43, 87,174,160,113,227,198,216,185,115,103, 11, 86, 82, 24,140, 74, 48, 88, 14,202,170, 96,221, 63, 59,
-238,196,220,238, 72, 75, 69,160,106,214,172,169,212,233,116,191,174, 89,179, 70, 29, 18,242,239,211, 66,204,102, 51, 10, 11, 11,
- 81, 84, 84,132,194,194, 66,104,181, 90,204,155, 55, 79, 61,108,216,176, 95,107,214,172, 89, 47, 57, 57,217, 84,150, 38, 33,100,
-214,225,195,135,195,109, 54, 27, 20, 10, 69,153,102,177, 78,157, 58, 24, 51,102, 12,218,181,107, 87,117,200,144, 33,179, 0,252,
- 86,150,166,221,184,125,185,107,215,174,104,133, 66,129, 51,103,206, 32, 53, 53, 21,163, 70,141,170, 33, 73, 18, 82, 82, 82,112,
-230,204, 25,164,167,167,227,235,175,191,142, 30, 54,108,216, 60, 0,117,203,219,119, 59,207,189,246,218,107,117,131,130,130,184,
- 79, 62,249, 36,191,168,168,232,107,251,239, 19,103,207,158, 61,180, 99,199,142,161,207, 62,251, 44, 37,132, 44,163,148, 94,103,
- 88,220, 52, 61, 69,174, 68, 74,233, 73,183,205, 26,186, 69,182,194, 81,242, 44,188,124, 15,154, 4,128,127,207,158, 61, 95, 55,
-153, 76,113, 59,118,236, 56,215,174, 93,187, 26, 0, 50, 40,165, 89, 0, 16, 20, 20,164,157, 51,103, 78,120,159, 62,125, 78,119,
-235,214, 45,174,103,207,158,175,103,101,101,125, 8, 32, 27,246,199,187,220,138,145, 37, 76,243,214,105,218,155,146, 32, 8, 2,
-122,245,234, 5, 66,136,199,231,109,238,217,179, 7, 93,187,118,133, 76, 38,195, 51,207, 60,227,179,102,143, 30, 61, 96,179,217,
-174,211,115, 55, 32,142,103,116,150,183,239,148,210, 82,207, 8,245,100, 46, 92, 95,238,122,158, 52, 37, 73,242,168, 85,150,201,
-114, 60,172,222,151,125,247,213, 92,122, 75,167,171,166, 76, 38, 67,155, 54,109,112,232,208,161,114,205,150,183,116,218, 35, 88,
- 79,245,239,223,127,195,168, 81,163, 84, 0,144,157,157, 93,234, 65,244,167, 78,157,130,201,100,194,146, 37, 75, 96, 50,153, 70,
-179,114,196, 52,111,165,166, 55, 59, 2,160, 57,128, 80, 0, 34,128, 66,251,117,208,108,191, 22,230, 0, 80,219, 95, 38, 0, 69,
- 0,170,216,183,205,182, 95,223, 92, 31, 83,150,133,210, 15,133,110,105,215,118, 60,178, 43,212,101,153,227, 63,220,191,187,191,
-151,210,230,236,133,151,218, 95, 29,221,195,214,190,152, 43, 71,229,232,195, 9,121,121,226,196,137,225,174,230,202,100, 50,161,
-160,160, 0,133,133,133,206,247, 51,103,206, 64,161, 80, 96,240,224,193,225,148,210,151,189,200,202,121,158,199,161, 67,135,176,
-114,229, 74, 92,188,120,241,186, 21,206,159, 63,143, 57,115,230, 96,230,204,153, 40, 40, 40, 0, 74,250, 23,121,164,121,243,230,
-147,135, 13, 27,182,183, 83,167, 78, 74, 65, 16,112,248,240, 97,212,171, 87, 15,187,119,239,198,229,203,151,145,155,155,139, 83,
-167, 78,161, 73,147, 38, 56,119,238, 28, 10, 10, 10, 16, 27, 27,171,140,143,143,223, 81,179,102,205,201,229, 68,175,228, 81, 81,
- 81,111,189,240,194, 11,202,140,140, 12,233,135, 31,126,216, 69, 41,221, 77, 8, 25,245,246,219,111,143,232,209,163, 71,232,201,
-147, 39, 11, 14, 28, 56,112,208,147,185, 42, 35,114,117,153,227,184, 75,148,210, 2, 74,169, 1, 37,157,207, 75, 93,140,108, 54,
-155,201, 96, 48,228,231,228,228,100,115, 28,119,137,227,184, 51, 0,148,101,105, 14, 31, 62,188,118,118,118,246, 75,255,251,223,
-255, 46,182,107,215,174, 6,165,244, 20,165, 52,199,158, 97, 77, 54,155, 45, 39, 47, 47,239,116,219,182,109, 35,134, 14, 29,122,
- 46, 59, 59,251,165,225,195,135,215, 46, 71,147,113,247, 67, 69, 81,132, 76, 38,195,214,173, 91,177,115,231, 78,236,220,185, 19,
-187,118,237,194,238,221,187,177,103,207, 30,236,217,179, 7,130, 32, 96,247,238,221,216,189,123, 55,198,140, 25,227,181,204,139,
-162, 8, 65, 16,176,109,219, 54,236,223,191,223,249, 58,112,224, 0,246,239,223, 15,181, 90,237,213, 12,185,149, 33,167,166,167,
-215,151, 95,126,233, 52,135,142,186,137,227,184,114,163, 98,238,198,197,221,176,212,168, 89,243,186,101,222,210,233, 48,109,130,
- 32,224,155,111,190, 65, 90, 90, 26, 62,255,252,115,156, 63,127, 30, 31,127,252, 49,146,146,146, 48,117,234, 84, 28, 56,112, 0,
- 19, 39, 78,196,142, 29, 59, 28, 15,127,167,222, 52, 29,230,202, 98,177, 56,211,115,234,212, 41, 76,155, 54, 13,135, 15, 31,198,
-164, 73,147,176,103,207, 30,140, 27, 55, 14, 60, 95,110,144, 13, 9, 9, 9, 35, 9, 33,191,212,175, 95, 95,217,165, 75, 23, 8,
-130,128,105,211,166, 73,147, 38, 77,186,250,246,219,111, 95, 93,187,118, 45,173, 93,187, 54,204,102, 51,252,252,252, 64, 41, 93,
-148,144,144,240, 50, 43, 46,140, 91,133, 39, 47,226, 66,135,137, 19, 39,118, 33,132,172,109,211,166,205,112, 0,129,132,144,181,
- 0, 20,246,247,144,137, 19, 39,182, 34,132,172,157, 56,113, 98, 2,128, 42,132,144,181,246,239,157, 1,132, 56,190,219,215, 15,
-117, 51,111,161, 46,191,135,186,173,171,240,244,221,253,221, 93, 91,112,185, 24, 19,123, 1, 39,174, 21,100, 69, 12,150,183, 10,
- 87,167,211,245,238,217,179,167,220,213, 92,185, 70,174, 28,239,133,133,133, 56,125,250, 52,154, 52,105, 34,215,233,116,189, 1,
-124,234, 53, 20, 39, 8,136,140,140, 68,118,118, 54,142, 29, 59,134, 26, 53,106,192,106,181, 98,253,250,245,200,203,203,131, 92,
- 46,135, 92, 46,135,217, 92,190,119,105,216,176, 97,175,197,139, 23, 39,252,248,227,143,185,130, 32,224,212,169, 83,248,233,167,
-159, 64, 41, 69,149, 42, 85,160,215,235,113,245,234, 85,204,154, 53, 11, 22,139, 5, 58,157, 14, 81, 81, 81,170,151, 95,126,185,
-221,148, 41, 83,100, 0,202, 50, 89, 15, 12, 28, 56,208,223,207,207, 15,175,190,250,170,100,177, 88,102, 18, 66, 30, 28, 56,112,
-224, 91, 99,198,140, 9, 78, 78, 78, 54, 63,247,220,115, 7, 45, 22,203, 44,123, 70,147, 81, 74,173, 94, 12,107,153,145, 43,155,
-205,230, 56,166, 23, 11, 11, 11, 17, 22, 22, 86,157, 82, 42,247,114,142,228,187,119,239,110, 3,128,127,255,253,247, 85,148,210,
- 76, 87,211,102,177, 88, 28,154,182,252,252,252,171,227,198,141,179, 45, 93,186,148,183,111,115, 2,128,145, 85, 17,247,100,165,
-230, 44,235,189,122,245, 42,101, 40,182,111,223,142,158, 61,123, 58,203,187, 92, 46,119,174,231, 77,211, 53, 42,230,136, 60, 57,
-116,183,108,217,114, 93,228,197,199,155, 52,103,132,197,147,241,113, 55, 93,142, 27, 69, 95,204,144, 39,147,229,168, 91,220, 35,
- 67,190,164, 83, 38,147, 97,204,152, 49, 16, 4, 1,227,198,141,131, 76, 38, 67,243,230,205, 33, 8, 2, 90,183,110, 13, 65, 16,
-208,185,115,103,159,111, 80, 29,233,220,179,103, 15,226,227,227,157,233,105,222,188, 57, 90,182,108, 9, 65, 16,208,190,125,123,
- 8,130,128,238,221,187,123,213,116,116,104,215,233,116, 56,125,250, 52,120,158, 7, 33, 36, 39, 49, 49, 49, 28, 0, 38, 79,158,
-156,109, 52, 26, 67,140, 70, 35,186,118,237,138, 54,109,218,132, 46, 93,186,244, 93, 0,108,100, 33,227,214,221,237,121,240, 34,
-142, 0,192,140, 25, 51,166, 81, 74,251,148,181,173, 99, 57, 33,100,237,244,233,211,251,216,245,174,251,238, 18,101,114, 53,111,
-177,174, 17, 40,199,118,174,255, 87,222,127,187,173,159, 85,202, 96,217,119,168,147,167, 74,215, 83,168,220,253,179, 47, 21,132,
-209,104,108,238,136, 94, 25,141,198, 82,134,170,168,168,168,148,209, 50,155,205,136,137,137,129,209,104,108, 94,209,139, 69, 68,
- 68, 4, 44, 22, 11, 22, 46, 92,232, 52, 86,174, 38,161, 60,142, 31, 63,126,113,239,222,189,113,241,241,241, 65,191,255,254,123,
- 86,183,110,221, 66,123,244,232, 1,149, 74, 5,163,209, 8,155,205,134, 7, 30,120, 0, 13, 27, 54,196,213,171, 87,177,110,221,
-186,236,122,245,234, 85,217,183,111,159,116,229,202,149, 75,229, 72,119,237,218,181, 43, 8, 33, 88,183,110,221, 53, 74,105,162,
- 90,173,254,109,218,180,105,129, 38,147, 73, 26, 49, 98, 68,202,181,107,215,198, 1,176, 42,149,202, 79, 31,122,232,161, 7,120,
-158, 95, 46,138, 98,133, 43, 51,147,201, 84,234,216, 22, 22, 22, 66,163,209,248, 50, 37,132, 44, 47, 47,175, 41, 0,104, 52,154,
- 96, 0,206, 17,146, 6,131,193,121,142,236,231,199, 24, 28, 28,172, 5, 0,251, 54, 50, 86, 53,220,187, 56, 46,222, 91,183,110,
- 45, 85,190, 29, 17, 40,247, 50,175, 80, 40,176,102,205, 26,159, 52, 93,205,148, 15,205,121,229, 70,155, 28, 6, 75, 16, 4,124,
-253,117, 73, 11,251,171,175,190,234,220,222,253, 63,124,169, 47, 28,102, 72, 16, 4, 52,124, 79, 2, 96, 65,234,103, 42,200,100,
- 37, 89,218, 61,205,142,139,128, 47,230,242,243,207, 63, 71,159, 62,125,176,118,237,218,114,223,123,247,238,237, 83, 58, 5, 65,
-128, 82,169, 44,101,252, 14, 31, 62,236, 81,119,193,130, 5, 94,251,180, 73,146,132, 63,254,248, 3, 28,199,149,138,120,189,251,
-238,187, 47,248,251,251,235,182,109,219,134,204,204, 76, 20, 23, 23,163,168,168, 8, 65, 65, 65,129,221,186,117, 59,124,229,202,
-149,228,227,199,143,179, 14,239,140, 91, 18,197,114,245, 34, 46, 24, 38, 76,152,240, 22, 33,100,237,132, 9, 19,222,154, 62,125,
-122,146,125,253,181,110,219,175,245,162,239, 48, 65,142,230,193,150,110,230,205,209,116,248,112, 57,219,154,221, 12,149,123, 19,
-225, 1,175, 17, 44,247,190, 9,229,125,182,135,184,189, 85,184, 2, 33,228, 58, 3,224, 41,130,101,181, 90,145,147,147, 3, 73,
-146, 42,117,174, 46,111, 6,235,216,177, 99, 79,143, 28, 57, 50, 61, 32, 32,160, 89, 78, 78, 78,134, 82,169,108,191,125,251,246,
-106, 86,171, 21,254,254,254,240,247,247,199,159,127,254,137,128,128, 0,252,239,127,255,187,108, 48, 24,118,107,181,218,112,131,
-193,112,228,202,149, 43,239,148,233, 92,100,178,174,237,219,183, 71, 98, 98, 34,242,242,242,254, 38,132, 52,123,246,217,103,187,
- 87,171, 86,141,124,248,225,135,198,115,231,206,125, 1, 32, 75,171,213,126,179,120,241,226,142,113,113,113,186, 17, 35, 70,128,
- 16,242, 45,165,212,231,200,144, 94,175, 47,101,172, 28,199,212,207,207,207,167, 57,183,236,199,155, 18, 66,156, 3, 26, 93,141,
-149,139, 1,166, 60,207, 75, 0,104,101,159, 35,198,237,143, 96, 57,202,122,223,190,125,175,235,220, 46,151,203,177, 97,195, 6,
- 60,242,200, 35,206, 27,150,248,248,120,159,163, 77,253,250,245,115, 26,130, 13, 27, 54,148,105,176,188, 53,105,185, 71,155, 94,
-121,229, 21,200,100, 50,124,241,197, 23, 24, 59,118, 44,120,158,199,103,159,125, 6,142,227,240,238,187,239, 86,216, 92,202,100,
- 50, 92,252,168,228, 61,250,181, 2,228,204, 15, 7, 0,248,249,251,151,236,143, 36,249,172,233,216,119,111,145, 43, 87, 99,229,
-173,137,208, 53, 10,120,230,204, 25,231,231,214,173, 91,151,138, 92, 9,130,224,213,176,217,255,111,106,151, 46, 93, 62,140,142,
-142, 14, 27, 53,106, 20, 17, 4, 1, 9, 9, 9, 85, 38, 77,154,148, 47,147,201, 84,111,188,241,134,167,174, 20, 50, 0,205, 26,
- 53,106,164,101, 37,135,113,155, 35, 88,166,233,211,167, 39, 77,159, 62,221, 99,132,202, 61,146, 84, 94,164,201,197, 88, 29,128,
-189, 57,112,194,132, 9,111,161,164, 43,204, 1, 31,182, 85, 56,204,149,123,148,203, 21,247, 8,214, 20,247,138,199, 23,131,229,
- 75,255, 9,123, 84,228,104,118,118,118,107,165, 82,137,130,130,130,235, 46,218,174,166,128,231,121, 92,189,122, 21, 26,141,230,
-104,101,158, 60,111, 77,132,118, 51,243,186,203,113,105, 57,120,240,224,165,203,151, 47,143,217,180,105, 19,246,237,219,135, 42,
- 85,170, 96,218,180,105, 23,146,147,147,135, 82, 74, 15,248,242,191,181,107,215,110,172,211,233,176,107,215, 46, 0,216, 1,224,
-169, 23, 95,124,145, 88, 44, 22,204,155, 55, 79, 15, 96, 83, 64, 64,192,111, 43, 86,172,104,214,172, 89, 51,229,166, 77,155, 10,
-247,237,219,183,213, 71,115, 37, 82, 74, 61, 26,171,194,194, 66, 20, 23, 23, 67,167,211,249, 98,176,108,254,254,254,199, 10, 11,
- 11, 31, 51, 24, 12, 5, 74,165,210,175,160,160,192,228, 26, 97, 44, 42, 42, 66,113,113, 49, 4, 65,144,157, 57,115, 38, 29, 64,
-109,127,127,255, 99, 0,108,172,106,184, 55,225, 56,142, 58, 76,198,166, 77,155, 60,150,117,153, 76,134,245,235,215,151, 42,239,
-235,214,173,243,106,218, 4, 65,112,142, 36,244, 22,193,114,108,234, 53,204, 42,147,129,231,121,204,159, 63, 31,148, 82,103,228,
-138,227, 56, 76,152, 48, 1, 74,165, 18, 31,124,240, 1, 38, 76,152,224, 83, 20,203, 53, 42, 86,107,188,225,223,202,209,190,173,
-197,108, 46,137,210,115,156,171,201,242, 41,210,230,173,131,123, 69, 76,176,107,164, 77,169, 84,150,217,185,221,125,211,178, 52,
- 15, 30, 60,248, 93, 92, 92,220,185,208,208,208,141,109,218,180, 81, 30, 60,120, 16, 99,198,140, 33, 38,147,201,127,211,166, 77,
-206,255,245,116,188,138,139,139, 85,172,228, 48,110, 97, 4,107,138,135, 69, 65, 14,227,100, 55, 67,190,234,173,117, 93,223,161,
-225,110,138,236, 17,177,237,222,180, 60,109, 91, 22, 66, 89,225,110,247, 74,194,155,209,242,229,238,211, 96, 48,108,222,186,117,
-107,203, 71, 30,121, 68, 40,175,121,176,168,168, 8,225,225,225, 56,127,254,188,205, 96, 48,120,157,254, 64, 20,125,159, 16,221,
- 91, 4,203, 67,101,114, 32, 54, 54,214,102,177, 88, 80,183,110, 93, 68, 69, 69,193, 96, 48, 96,206,156, 57, 54, 95,205, 21, 33,
- 68,158,144,144,192, 3, 64,126,126, 62, 80, 50,218,161, 94,189,122,245,144,152,152,136,220,220,220, 85, 0,186, 78,153, 50,165,
-197,131, 15, 62, 40, 95,190,124,185,126,244,232,209,171,172, 86,235,135, 62,222,129,155,109, 54, 91, 45,142,227, 44,121,121,121,
-105,174,198, 42, 60, 60, 60, 72,167,211,113, 87,175, 94,181,250,114,120,154, 54,109,186, 63, 53, 53, 21,239,191,255,126,214,180,
-105,211,234, 21, 22, 22,230,230,231,231,219, 28,198,170,160,160, 0, 6,131,129, 11, 13, 13, 85, 46, 88,176, 64, 3, 0, 77,155,
- 54,221, 15, 54,225,232,189,126,215,120, 93,211,160,167,105, 26,124,189,153,114, 53, 46,253,251,247,191, 46, 34,230,120,173, 88,
-177,162, 84,191, 38,111, 77,111, 14,205, 47,191,252, 18,175,190,250, 42,148, 74, 37,102,207,158, 93,170, 15,150,167, 77,203,211,
-116,152,182, 90,227, 13,184, 50, 55, 24, 50,153, 12, 33,163, 51, 75, 53, 17,122,186,203,246,197, 8, 78,155, 54,173, 82,154, 8,
- 93, 77,159, 99, 74,156,133, 11, 23, 98,240,224,193,216,177, 99,199, 13, 55, 17,214,170, 85,107,241,156, 57,115,148, 39, 78,156,
- 64, 65, 65, 1,178,178,178, 96, 52, 26,145,146,146,226, 60,135,101, 68,202,213,172,212, 48,110, 69,244,170,156,197, 89,110,253,
-167,136,107,115, 93, 57,239,238,235,195,229, 55, 87,221, 44,148, 30, 40,230,250,187,187,169,114,255, 15,215,117,178,174,139, 96,
-149,113,225,246,121,154, 6,123, 7, 73,111, 70, 96,214,123,239,189,247, 82,187,118,237,130,253,253,253,145,158,158,238, 49,130,
-229,239,239, 15,139,197,130,173, 91,183, 22, 72,146, 52,203,203, 57,177, 90,173, 86,132,133,133, 33, 59, 59, 27, 82, 25, 97,124,
-142,227,160, 86,171, 81, 84, 84, 4,183,131,232,211,133,194,106,181,194, 98,177,192, 98,177,192,106,181, 86, 52,223,168, 29, 19,
-182, 22, 23, 23, 3, 64,113,100,100,100,109,149, 74,229, 24,245,120, 6, 64,151, 30, 61,122,200,114,114,114,232,115,207, 61,183,
-135, 82, 58,198,203,108,246,230,173, 91,183,214, 4, 0,181, 90,125, 6, 0, 82, 82, 82,172,121,121,121, 40, 42, 42,114, 70, 8,
-213,106, 53, 6, 12, 24, 80,149, 82,138,173, 91,183,214,148,203,229,180, 28, 51,100, 90,187,118,237,241,128,128,128,165, 51,102,
-204, 24,250,240,195, 15, 39, 53,109,218,180, 86, 81, 81,209, 85,189, 94,111, 48, 24, 12, 84, 16, 4,121, 72, 72,136,114,227,198,
-141,231,246,236,217,243,144,191,191,255,210,181,107,215, 30,183,135, 86, 25,247,230, 29, 99,169, 40,142, 39, 83, 85,145, 17,116,
-174,198, 69, 16, 4,172, 95,191,190,220, 40,142,175,154,174, 38,227,245,215, 95,199,220,185,115,175,139, 96,125,248, 97,201, 61,
-201,219,111,191, 93,161, 8,145, 32, 8,184, 50, 55, 24, 85, 95,185,118, 93, 4,139,216,211, 87,145, 38, 66,199,246, 83,167, 78,
-133, 76, 38,115, 54,225, 61,244,208, 67,165,154, 6,125, 53, 86,174,154, 87,175, 94,133, 32, 8, 8, 14, 14,198,208,161, 67,209,
-189,123,247,235,244,124,213, 77, 73, 73,249,103,230,204,153,213,163,162,162,176,124,249,114,179, 86,171, 85,116,233,210,133,230,
-231,231,147,242, 34, 88, 6,131,129, 69,176, 24,183,155, 3,183, 89,247,166,255, 79,240, 86,233,222,204, 52, 13,238, 79,219, 78,
- 78, 78,206,143,136,136, 24, 54,100,200,144,223,231,207,159,175,174, 93,187, 54, 78,157, 58,133,220,220, 92, 88, 44, 22,200,229,
-114, 68, 70, 70,162,168,168, 8,191,254,250,171, 94,175,215, 15,203,200,200,200, 47, 79,147, 16,242,118,175, 94,189, 22,188,243,
-206, 59,170,198,141, 27, 35, 55, 55, 23, 69, 69, 69,206, 59, 47, 66, 8,252,253,253,161,209,104,112,236,216, 49,236,217,179,199,
- 64, 8,121,187, 60, 77, 79, 70,211, 97,172, 28, 70,203,219,200, 36, 55, 77,173, 70,163,113,220,249, 1,128,173,122,245,234,225,
- 0, 28, 6,235, 82, 76, 76,204, 59,117,234,212, 33,139, 23, 47,166,148,210, 77,158,204,149,155,102,110,199,142, 29,243, 0,132,
-155,205,102, 57, 0, 20, 20, 20, 88, 66, 66, 66,194,148, 74,165,164, 84, 42, 37,149, 74, 37,101,100,100,216,108, 54,155, 28, 0,
- 58,118,236,104, 6,144, 9,251,124, 85, 30, 52, 37, 0,133,243,230,205,155,252,212, 83, 79,181,110,219,182,109,236,115,207, 61,
-119, 98,244,232,209,136,138,138, 10, 42, 42, 42, 50,158, 57,115, 38,111,254,252,249,198,253,251,247, 63, 36,147,201, 46,205,155,
- 55,111, 50, 74,230, 35,145,124, 61,158, 55,104, 2,152,230, 45,210,116,244,253,241,100,172, 92,191,251, 48,141, 66,169,116, 58,
- 76,219, 99,143, 61,230, 28,125,232, 30,185,170,168, 38, 0,231, 8,194, 55,223,124,179, 84,250,222,121,167,204, 46,144,164,156,
-125,119, 70,155, 4, 65, 64,254,194,168, 82,230,207, 87, 83,229, 73, 83, 16, 4, 76,154, 52,201,231, 8,150,123, 31,172,242,210,
-217,177, 99, 71, 20, 23, 23, 67, 38,147, 97,195,134, 13,101, 70,176,188, 29, 79,181, 90, 61,116,213,170, 85, 63, 41,149,202,166,
-102,179,249,153,236,236,236, 31,244,122,125,245,188,188,188,114, 35, 88, 70,163, 81,201,202, 17,211,188, 3,115, 97,221, 83,148,
-123,139,103,179,217, 80,173, 90,181, 82,207,182,114,116,102,231,121,222, 57,242,196,151, 17,132, 14, 50, 50, 50, 54, 68, 68, 68,
- 12, 28, 48, 96,192,146,167,158,122,202,175, 97,195,134,178, 26, 53,106,192, 96, 48, 32, 57, 57, 25,201,201,201,182,191,255,254,
-187, 64,175,215, 63,145,145,145,177,193,155, 94, 90, 90,218,143,225,225,225,235,135, 15, 31, 62,169, 69,139, 22,163,198,142, 29,
-203,199,196,196, 32, 63, 63, 31, 65, 65, 65, 8, 13, 13, 69,114,114, 50,126,253,245, 87, 49, 47, 47,111,129, 40,138, 83, 51, 51,
- 51,179, 42,114,144,108, 54, 27,111,181, 90, 49,100,200, 16, 72,146,132,217,179,103,195,102,179,241, 21,144,176, 88, 44, 22, 10,
-128,100,103,103, 3,128,222, 97,184,206,158, 61, 11, 0,151,107,214,172,169, 3,128,205,155, 55, 19, 0,187,125, 13,174,185, 70,
-178, 26, 54,108,152,236, 94, 41, 58, 34, 87,142,168,151,171,185, 42, 3,227,208,161, 67,179, 76, 38, 83,143,215, 94,123,109,210,
-194,133, 11,135, 46, 92,184,240,186,149,252,253,253,151,126,246,217,103, 83,135, 14, 29,154, 5, 54, 61,195,253, 81, 25,184, 69,
-171, 42,218, 5,160, 44,205,213,171, 87,251, 60,185,166,183,168, 24, 33,196,227,136,196,242,234, 32, 95,158, 62, 85,214,132,162,
- 55, 19, 21, 20, 4, 1,159,124,242,137, 51,114,229,218,249,252, 70, 34, 88, 14,205,224,224,224,146,187, 54,173, 22,146, 36,161,
-119,239,222, 55,172,107,127,182,224, 64,199,247,132,132,132,169,203,150, 45,251,144, 82, 26, 2, 64,112, 61, 6, 21,127,138, 23,
-131,193, 12,150, 71, 68, 81, 76,117, 60, 91,208,151,135,192,218,141, 72,170,143, 38,107,125, 76, 76, 76,204,194,133, 11, 95,213,
-106,181,221,140, 70, 99, 83, 0, 80,169, 84, 71,139,139,139, 55,113, 28, 55, 39, 35, 35,195,231,135, 51,219, 13,211,203,209,209,
-209,179,135, 15, 31,254, 97,155, 54,109, 6, 61,247,220,115, 68, 16, 4,252,242,203, 47, 52, 45, 45,109, 5,199,113,111,167,167,
-167,159,191,145,131,164,209,104, 78,175, 88,177,162,246,234,213,171, 97,181, 90,177, 96,193, 2, 40,149,202,211,190,110, 79, 41,
-205, 18, 4, 97, 73,219,182,109,135,238,217,179,103, 41,165,244,152, 82,169,252,169, 67,135, 14,195,118,239,222,253, 51,165,244,
-132, 32, 8, 63,181,105,211,102,216,254,253,251,127,163,148, 30,169, 64,242,156,145, 44,155,205,115,139,162,167,200,149, 23, 10,
- 70,142, 28,105, 25, 57,114,228,107,131, 6, 13, 90,152,152,152,248,128, 99,250,134,192,192,192,163,241,241,241,251, 86,172, 88,
-113,202, 30,185, 98,230,234, 30,199,209, 33, 61, 40, 40, 8, 28,199, 57, 95,142,217,188, 43,106,132, 28,154,148, 82, 4, 5, 5,
-121,188, 49, 43, 71,147,120, 41, 75,208,233,116, 78, 77, 31, 71, 47,123, 13, 67,233,116,186, 82,105,244,241,230,166,220,125,119,
- 79,167, 47,199,204,155,166, 86,171,133,197, 98,241, 89, 19, 62, 12, 26,112,229,224,193,131,223, 1,248,174,110,221,186,103, 1,
-212, 97,166,138,193,184, 5, 6,235,228,201,147, 9,183,242,143, 47, 92,184, 80, 0, 96,170,253, 85, 41,164,166,166,158, 7,240,
- 88,213,170, 85, 63,221,189,123,247,187,246,202,245,125,111,207, 51,244,198,145, 35, 71, 30,145,201,100,243, 22, 45, 90,212,134,
- 82,138,128,128,128,221,231,206,157,123,177,130, 81,176, 81,132,144,177,142, 81,129, 38,147,105, 20, 33,228, 13, 74,105,177,203,
-114,231,247, 10, 66, 81,210,217, 46,162,140,229,190, 68,174,174,139,100, 1, 48,175, 88,177,162, 8,192, 97,252, 59,207,149,213,
-254, 50,193,165, 89,144,113,239, 98,179,217,210, 58,117,234, 36,120,187,129,242,176, 93,106,121, 55,104,237,219,183,199, 13,104,
-166,149,147,212, 75,109,218,180,225,124,213,114, 96,181, 90,175,150, 99,190, 82, 91,183,110,237, 49,157, 94,142, 89,185,251,222,
-186,117,235, 10,165,209,158,150,180,202,214,244,114, 60,203,196, 96, 48,228,134,134,134, 22, 25,141, 70,153,201,100,146,185, 71,
-236,213,106,117, 22, 43, 57, 12,198, 13, 26,172,123, 25,187,161,234, 91, 89,122,246,254, 80,207, 87,130,142,209,237,123,113,121,
-223, 43, 72,238, 45, 56,148, 18, 0, 3, 43, 38,247, 55,199,142, 29,123,160,178, 53,143, 31, 63,158,112, 11,210,217,186,178, 53,
-147,146,146, 18,254,171,154,229,145,150,150,246, 0, 43, 25, 12,198,205,193,177, 67,192, 96, 48, 24, 12, 6,131, 81,185, 16, 0,
- 77, 60, 45,168,200,232, 0, 66, 72,147,138,254,177, 55,125,166,201, 52,153, 38,211,100,154, 76,147,105,222,127,154,222,180,239,
-151,209,137,228, 86,118, 98,100, 67, 88,153, 38,211,100,154, 76,147,105, 50, 77,166,249, 95,132, 53, 17, 50, 24, 12, 6,131,193,
- 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24, 55, 10, 33,
-132, 68, 71, 71,119,140,140,140,108,253, 95, 61, 6, 2,203, 6, 12, 6,131,193, 96, 48, 42,131,234,213,171, 7,138,162,248, 84,
-100,100,228,139,181,107,215,174, 13, 0, 81, 81, 81,199, 40,165,115,212,106,245, 79,231,206,157, 51,255,103, 76, 38,123, 20, 2,
-131,193, 96, 48, 24,140,155, 33, 50, 50,178, 5,128, 23,213,106,245, 19, 15, 60,240,128,162, 75,151, 46, 8, 10, 10,130,205,102,
- 67, 70, 70, 6,254,254,251,111, 28, 62,124,248,154,213,106,157,103,181, 90,231,101,101,101,101,254,103, 12, 22, 33,100, 27, 0,
- 80, 74, 59,178,172,194, 96, 48, 24, 12, 6,195, 23, 34, 34, 34,102,246,236,217,243,181,160,160, 32,212,173, 91, 23, 85,171, 86,
-133,201,100,130,193, 96, 0,165, 20,130, 32,128, 82,138,194,194, 66, 28, 60,120, 16,251,246,237,179, 21, 20, 20, 44, 37,132,204,
- 73, 79, 79,255,167,148, 41,185,143,188, 8,161,148,130, 16, 66, 1,116,178,239,212, 54,150, 93, 24, 12, 6,131,193, 96,248, 66,
-100,100,100,230,230,205,155,195, 68, 81, 68,118,118, 54, 76, 38, 19,244,122,189,211, 96,241, 60, 15, 74, 41,108, 54, 27, 0, 64,
-146, 36,156, 56,113, 2,123,246,236, 65, 74, 74,202,103, 25, 25, 25,175,219,205,213,125,229, 69,156,157,220, 41,165,219,152,185,
- 98, 48, 24, 12, 6,131, 81, 81, 76, 38, 19, 22, 47, 94,140,236,236,108, 84,171, 86, 13, 81, 81, 81, 8, 8, 8,128, 74,165, 2,
- 0,167,185, 2, 0,142,227, 16, 27, 27,139, 97,195,134,129, 16, 50,204, 85,231,126,242, 34,172,147, 59,131,193, 96, 48, 24,140,
-155,193,106,177, 88,144,144,144,128,139, 23, 47, 34, 49, 49, 17,113,113,113,104,212,168, 17,178,179,179,145,158,158, 94,106,229,
-253,251,247,227,208,161, 67,232,208,161,195,125,125, 80, 28, 77,132,147, 1,116,180,187,199,142, 44,175, 48, 24, 12, 6,131,193,
-240,133,168,168,168, 17,161,161,161,243,135, 15, 31,174,110,222,188, 57, 82, 83, 83,145,150,150,134,220,220, 92,180,104,209, 2,
-177,177,177, 56,127,254, 60,214,175, 95,143, 67,135, 14, 65,169, 84, 34, 58, 58, 26,186,165,203,240, 71,100, 68, 90,122,122,122,
- 52,128,251,206,139,184,118,114,119,236,212, 54,150, 93, 24, 12, 6,131,193, 96,248, 74,100,100,100, 8, 33,228,237,200,200,200,
-151,158,120,226, 9, 89,157, 58,117,144,154,154,138,236,236,108,228,230,230, 98,239,222,189, 14, 51,134,168,168, 40, 36, 39, 39,
-227,216,177, 99, 6,147,201, 52, 58, 45, 45,237, 71,167, 41,185,143,188, 8,155,166,129,193, 96, 48, 24, 12, 70,101, 25,173,106,
- 0,166,212,169, 83,103,196,224,193,131,185,200,200, 72,164,165,165,225,239,191,255, 70,237,218,181,113,245,234, 85, 28, 60,120,
- 80, 44, 40, 40, 88, 32,138,226,212,204,204,204,172,251,245, 88,220,210,153,220, 9, 33, 77,152, 38,211,100,154, 76,147,105, 50,
- 77,166,249,223,208, 76, 79, 79, 79, 73, 79, 79,127,250,204,153, 51,177, 31,126,248,225,170,249,243,231,131,231,121, 68, 70, 70,
- 98,203,150, 45,116,243,230,205, 43,138,138,138,234,167,167,167,191,124, 63,155, 43,128,117,114,103, 48, 24, 12, 6,131, 81,201,
- 92,185,114,229, 36,128, 71,162,162,162, 30, 72, 74, 74,122, 11, 0, 36, 73,122,255,202,149, 43, 7,255, 43,199,128, 25, 44, 6,
-131,193, 96, 48, 24,183,132,180,180,180,125, 0,250,254, 23,247,157, 61,236,153,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193,
- 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,254, 83, 16, 0, 30, 71, 2, 80, 74,143,249, 44,114, 3, 35, 20,188,233, 51,
- 77,166,201, 52,153, 38,211,100,154, 76,243,254,211,244,166, 93, 17,255,113, 87, 27, 44, 95,230,193, 34,132, 16,122, 3, 19,102,
- 17, 66,154, 84,246,129, 98,154, 76,147,105, 50, 77,166,121,107, 52,111,164,174,247,164, 73, 8, 33, 46, 55,241, 0, 64,237, 23,
- 78,122, 55,165,243, 94,217,247,255,138,230,253,134,224,229, 0,114, 40,105, 70, 36,132, 16, 9,128, 84, 25, 7,202,126, 18,184,
-202,210, 99,220, 2,231, 93,114,142,200,191, 55, 20,236, 60, 49, 24,247,113,121,175,180,186,222,165,238,224, 29,154, 0, 68, 0,
- 34, 33,228,166, 46,182,183,226,154,116,183,239,251,127, 89,243,190, 52, 88,142, 3, 21, 26, 26,186, 33, 44, 44,172,115,118,118,
-182,100,255, 29, 81, 81, 81,224, 56, 14,130, 32, 24, 46, 94,188,232, 95,209, 63, 12, 15, 15,255, 54, 54, 54,246,169,156,156, 28,
-137,227, 56, 84,171, 86, 13,132, 16,240, 60, 15,158,231, 13,231,206,157,243,191,211, 7, 37, 62, 62, 62,215,108, 54,235,220,127,
- 87, 40, 20,198,196,196, 68,191,255, 64,101, 43,212,171, 87,239,113,141, 70,163,118,252, 22, 23, 23,231,186, 10, 61,116,232,208,
- 66, 95,245,106,213,170,181, 95,173, 86, 7, 10,130, 0,158,231, 33, 8, 2,138,139,139,243, 78,156, 56,209,202,190,124,151, 90,
-173, 14,225,121,222,145,183, 96, 52, 26,115,142, 31, 63,222,150, 93,250,174,167, 83,167, 78, 2, 42, 62,197,138,109,235,214,173,
-182,219,152, 76,206,156,232, 87,135,216, 12,205, 8, 71, 3,168, 68,242,169,160, 62,162,136, 47, 60,231,227,246,210, 29, 46, 3,
-213, 1,216, 40,165,233, 55,178,177,135,138,182,167, 8, 12,177,127, 53,114, 64, 14, 1,206,132, 0,191,102, 2,134, 82, 43,223,
-198, 11,145,163,174,143,142,142,158, 19, 30, 30,254,116, 97, 97,161,158,231,121, 16, 66,104,108,108,236,117,187, 67, 8,129, 36,
- 73,169, 73, 73, 73, 9, 94, 46,178,178,234,213,171,127, 22, 26, 26,250,164, 94,175,215, 19, 66, 64, 8,161,132, 16, 52,109,218,
-212,169,233,120, 23, 69, 49,245,216,177, 99, 9,183, 43,157,119,106,223,155, 52,105,226,212,114,104, 75,146, 84,230,190,187,106,
- 70, 71, 71,127, 22, 30, 30,254,100, 81, 81,145,158,227, 56,167,102,108,108,236, 13,167,243,110,214,188,159, 35, 88, 92, 88, 88,
-216,170, 86,173, 90,117, 90,189,122, 53,119,242,228, 73,174, 97,195,134, 16, 69, 17,146, 36,129, 82,138,248,248,120, 77, 69,255,
-172,106,213,170, 63,180,108,217,114,200,154, 53,107,184, 85,171, 86,113, 45, 91,182, 4, 33, 4,162, 40, 66, 20, 69,116,237,218,
- 85,125,147,149,133, 78, 16,132,177, 10,133,162,163,205,102,107, 4, 0, 50,153,236,132,201,100,218,102,179,217,102, 81, 74,139,
-124,209,177, 90,173,154,164,164,164,235,142, 77,171, 86,173, 20, 55,154,182,122,245,234,237,230, 56, 46,198,181,208,122,123,167,
-148, 94, 72, 74, 74,106, 83,150,102,131, 6, 13,188,106,186,255, 38, 73,210,133, 99,199,142,181, 41,207, 92,213,173, 91,119, 72,
-227,198,141, 85,191,252,242, 11, 82, 82, 82,160,213,106, 33, 73, 18, 68, 81,132,213,106,197, 35,143, 60, 66, 42,178,239,106,181,
-218,255,239,191,255,174, 19, 22, 22,134,171, 87,175, 34, 59, 59, 27,163, 70,141, 58,227,178, 60,100,203,150, 45,245,130,131,131,
-161,215,235,145,159,159,143, 97,195,134,221,243,133,171,123,135,218, 31, 16, 32,216,241, 93,148,112,109,211,206,243,239,220,172,
-174,201,100,202, 16, 69, 49,200,203, 53,189, 20, 60,207,231, 2, 8,245, 82,126,106, 2,232,203,243,124, 93,153, 76,214,128, 82,
- 90,211,102,179,133, 3,128, 92, 46,207,228,121, 62,217,106,181,158, 50,155,205,103, 1,172,161,148, 38,151,165,101, 78,244,171,
- 35,154,244,131,138, 77, 82,111,137,162, 42, 71,112, 69,171,212,255,105, 78,244, 91, 81, 1,147,117,167,204, 85,173,200,200,200,
- 79,236,159,199, 81, 74, 47,222,172,166, 8, 12,161,148, 6, 0, 64,126,126,126, 64, 74, 74, 74,213, 53,107,214,196, 78,155, 54,
-173,139,194,104,252,216, 12,156, 40,111,251,135, 58,214, 57, 40, 16, 18,237,116,203, 84, 74,221,184,237,124,101, 92,152,184,168,
-168,168, 57,189,122,245, 26,190, 96,193, 2,205,190,125,251, 52, 77,155, 54, 69,201,133, 17,206,250,158, 82,234,204, 99, 15, 62,
-216,186,220,195, 7, 64,136,140,140,156,221,171, 87,175,161,243,230,205,211,156, 58,117, 74, 83,171, 86, 45,167,166,107,158,181,
- 95,128,209,188,121,139,219,157,206, 91,186,239, 61,122,244, 24,186, 96,193, 2,205,209,163, 71, 53,245,234,213,115,106,186,123,
-103,142,227,144,144,208,210, 39,205,158, 61,123, 14,253,234,171,175, 52,137,137,137,154, 70,141, 26,217, 77, 26,156,105,188,145,
-116,222,229,154,247,159,193, 34,132,112,161,161,161,139, 19, 18, 18,122,172, 94,189,154, 7,128,196,196, 68,228,228,228, 32, 42,
- 42, 10, 58,157, 14, 42,149, 10, 70,163,177, 66,119, 89,225,225,225,223,182,106,213,106,200,234,213,171,101, 0,240,219, 19,143,
-224,130, 12, 24,115,213, 12,185, 92,142,115,231,206,129,231,249,155, 9, 29,119,240,243,243,251,113,229,202,149, 65,113,113,113,
- 92,118,118, 54,106,213,170,133,107,215,174,181,218,190,125,123,252, 51,207, 60,243, 12, 33,100, 4,165,116,187,175,154,127,252,
-241, 7,180, 90,173,243,101,177, 88,200,141,166,143,231,249,232,125,251,246,133,233,116, 58,136,162, 8, 74,105,169, 2,236, 94,
-240, 36, 73, 66,251,246,237, 45,229,158, 60, 65,136,222,183,111, 95,152, 90,173,190, 78, 75, 20, 69, 40, 20, 10,112, 28,231,184,
- 67,132,205,102, 67,155, 54,109, 44,229,221,209,213,171, 87,239,113,135,185,226, 56, 14,203,151, 47, 71,213,170, 85, 17, 22, 22,
- 6,173, 86, 11,181,186,226, 30, 88, 16, 4,132,132,132,224,165,151, 94,194,227,143, 63,142, 37, 75,150, 64, 38,147,149, 90, 30,
- 28, 28,140,191,254,250, 11,254,254,254,168, 81,163, 70,169,229,247,108, 36, 16, 8, 94,191,253,188, 51, 34, 59,168, 79,115,161,
- 91,251,152,121,206,202,181,100, 37, 42,149,172, 75, 37, 81,204,221,188,235,210, 36, 31,110, 0,170,236,218,181, 11, 74,165,210,
-183,139,187, 40,162, 85,171, 86, 85,188,148,159,222, 77,154, 52,249,237,165,151, 94,146,215,169, 83,135,200,100, 50, 8,130, 0,
- 65, 16, 28,249,177, 6,165,180,134, 36, 73,157, 50, 51, 51,233,231,159,127,254, 49, 33,100, 0,165,244, 79,143,122, 54, 67,179,
- 98,147,212,155, 82, 84, 13,239, 70,171, 95,221, 68, 80,108,146,122, 7, 8,134,115, 0,238, 90,131, 69, 8,241, 87,171,213,239,
-254,242,203, 47,114, 0,232,214,173,219,187,132,144,255, 81, 74, 11, 42,235, 63, 2, 2, 2, 16, 16, 16,128, 38, 77,154, 96,224,
-192,129,129, 45, 90,180,120,163,166,201, 52, 42, 25, 48,151, 89,134, 56, 46,122,221,150, 51, 97,142,239, 67, 31,137,147,247,232,
- 84, 39,179,164,131,139,251,218, 20,146, 72, 83, 55,237,188,144,224,101, 95,185,170, 85,171,126,218,179,103,207,199, 22, 44, 88,
-224, 7, 0,223,126,251, 45,122,247,238,141,170, 85,171, 66,173, 86, 67, 46,151, 67, 46,151, 67, 38,147, 57,223,189, 68,132,248,
-170, 85,171,126,252,240,195, 15, 15,154, 55,111,158, 31, 0,252,240,195, 15,232,211,167, 15, 66, 66, 66,224,239,239, 15,165, 82,
- 9,133, 66, 97,215, 34,240, 22,175,243,148,206,231,186,119, 65,140, 90,137,190, 31,126,130,192,192, 64,252,253,250,139,144,113,
- 28, 94,252,107, 27,252,253,253,189,214, 31,158, 52, 19, 19, 19,145,153,153,233,113,223,121,158, 47,183,188,185,238,123,239,222,
-189, 7, 57, 52,127,248,225, 7,244,232,209, 3, 33, 33, 33,208,233,116,206,125,255, 87,155,243, 73,179, 71,143, 30,131,190,250,
-234, 43,167,102,215,174, 93, 17, 28, 28, 12, 63, 63, 63,200,229,114,231,241,172,200, 57,186,155, 53,239, 75,131,229,232, 27, 21,
- 22, 22,246,216,218,181,107,157,103, 94, 38,147, 65,169, 84, 58, 51,135,235,133,219,215, 48,116,108,108,236, 83,171, 87,175,118,
-110,100,118, 43, 84, 42,149,170, 66,154,110,250,221, 58,119,238,188,108,237,218,181, 42,185, 92, 14,131,193,128,164,164, 36, 4,
- 4, 4, 64,161, 80,160,127,255,254,124,155, 54,109, 66, 58,119,238,252, 43, 33,100, 40,165,116,147, 55, 77, 74, 41,116, 58, 93,
- 41,131,117, 51,145,123, 66, 8,212,106, 53, 86,173, 90, 5, 65, 16, 74,101, 50, 79,149, 88,120,120,184,215,168, 4, 0, 40,149,
- 74,236,222,189, 27, 28,199, 65, 38,147, 57, 95,127,252,241, 7, 94,127,253,117,100,102,102, 58,151,249,249,121,109,221, 36, 26,
-141, 70,237, 48, 87,142,115,175, 86,171, 33,147,201,136, 32, 8,132,231,121, 0,160, 21,233, 16, 42, 8, 2,146,147,147,241,196,
- 19, 79, 96,209,162, 69,120,255,253,247, 49,116,232,208, 82,203, 11, 10, 10, 16, 20, 20,132,192,192, 64, 40,149,202, 27,206, 11,
-119, 19,146,219,209,153,250,254,199,154,146, 14, 30, 18, 32, 1, 20,212,249, 57, 35,227, 28,102,126, 58,151,247, 85, 91,169, 84,
- 98,215,174, 93,112,109,118,229, 56, 14,114,185,188,212,111,130, 32, 32, 34, 34,194, 23,189, 41, 43, 87,174, 84, 44, 95,190, 28,
-191,255,254, 59, 68, 81,132, 76, 38,131, 74,165,130,191,191, 63,130,131,131,157,175, 26, 53,106,144,239,190,251, 78,222,172, 89,
-179, 41, 0, 60, 27, 44,142, 6, 72,118,115, 5, 0, 97,221,104,245,243,171,249,160, 64,191,146, 40,206, 93,106,174, 4, 0, 19,
-191,248,226,139,144,248,248,120, 0,192, 23, 95,124, 17, 50,114,228,200,137,132,144,119, 40,165, 55,220,196,202, 3,203, 8, 33,
- 67,236, 17, 91,213, 67, 15, 61,164,248,242,203, 47,209,160, 65, 3,188,242,202, 43,193, 51, 63,254,184, 47,128, 21,101,231,165,
-210,153,105,250, 39,115, 3, 93,111,168,254,125, 1,215,178,146,241,238,187, 31,120,173,147, 1,112,145,145,145,207,124,253,245,
-215,206,238, 16,193,193,193,206, 58,200,189,142,114,188,151, 83, 47, 17,123, 84,104,228,130, 5, 11,156,154,161,161,161,165, 52,
-100, 50, 25,146, 79,252,131,117,223,206,128, 54, 36, 2,195, 94,159, 94,225,116, 70, 41, 21,136, 86, 43,208,172, 89, 51,168,213,
-106, 36,202, 74, 46,101, 14,115, 85, 94, 58,203,210,228,121,222,153, 70, 74, 41,140, 70, 35, 10, 11, 11, 33,138, 34,204,102, 51,
-226,227,227,125,218,247,175,190,250,202,169, 89,165, 74, 21,103,253,238, 90,207, 59, 94,142, 27,152,242, 52, 35, 35, 35, 71,126,
-243,205, 55, 78,205,144,144, 16,167,150, 32, 8,144,203,229,248,225,135, 31,224, 99, 68,219,103,205,138,158,119,119,205,139, 23,
- 47, 98,218,180,105,144,203,229,142, 46, 64,206,136,101, 84, 84, 20, 62,255,252,115,159,174,113,247, 85, 4, 11, 0,201,206,206,
-150, 78,158, 60,201, 29, 60,120, 16,114,185, 28,161,161,161,104,213,170, 21, 0,192, 98,177, 64, 16, 4,168,213,106, 82,175, 94,
-189, 76,199, 65,115,188,187,182,165,187,140, 48,224,174, 93,187, 38,109,216,176,129, 91, 50,176, 7,204, 20,104,241,238,116,244,
-232,211, 7,235,163, 20,224, 1,180, 58,153, 13,133, 66, 33, 68, 68, 68, 88, 29, 39,193,161,235,218, 55,203,195,168, 5, 63,173,
- 86,251,221,154, 53,107, 84, 28,199,161,176,176, 16,146, 36,161,109,219,182, 32,132,224,232,209,163,120,231,157,119,240,219,111,
-191, 97,229,202,149,234,184,184,184,239, 8, 33,141, 40,165,133, 46,102,234,152,167,204,233,239,239, 15,181, 90,237, 52, 88,106,
-181,154, 52,104,208, 32,211,209,126,238,214, 28,151,150,148,148, 20, 95,150,166, 35,146, 48, 96,192, 0,103,159, 51,199, 5,208,
-181,176, 57, 62, 39, 37, 37,121, 50,125,215,105, 74,146,132,118,237,218, 1, 0,180, 90, 45,116, 58, 29,182,108,217,226, 92, 30,
- 23, 23, 7,179,217,140, 42, 85,170,224,196,137, 19, 62,105, 94,185,114, 5,139, 23, 47,134, 76, 38, 67, 72, 72, 8,100, 50,153,
-124,211,166, 77,239,107,181,218, 0,158,231, 17, 24, 24,136, 62,125,250, 44,232,219,183,175, 35, 13,226, 31,127,252, 33,148,165,
-201,243, 60, 84, 42, 21,126,248,225, 7, 76,155, 54, 13,111,189,245,150,123,116, 15, 70,163, 17, 33, 33, 33, 8, 10, 10, 66, 80,
- 80,144, 79,233,188, 89,110,181, 38, 5, 69,210,161,245, 56,126,120, 19, 68, 42, 66, 18, 37, 80,137, 66,148, 36, 28,218,184,191,
- 94,198,133,244, 40, 10,234,236,109, 36, 22, 21,219, 58, 85, 81, 54, 0,176,106,107,182,105,182,183,116,242, 60, 15,139,197,130,
-245,235,215,227,220,185,115,216,176, 97, 3, 12, 6, 3,170, 84,169,130,192,192, 64,180,105,211, 6, 35, 71,142,244,104,176,220,
- 53, 69, 81,252, 33, 45, 45,173, 69,155, 54,109, 72,126,126, 62,178,179,179, 81, 88, 88, 8,139,197, 2,139,197,226, 60,135, 90,
-173, 22, 85,171, 86,133,193, 96,160, 38,147,233,135, 50,247, 93, 34,249, 28,193,149,243,171,132, 42,181,251,219,212,153, 91, 66,
- 76, 6,179,220, 54,127,149,102,228, 31,227,107,119,231, 40, 71,129,146, 93, 39, 4, 84, 18,197,236, 77, 59, 46,188,116,135,207,
-251,168,177, 99,199, 54,114,109,158, 30, 54,108, 24,146,146,146, 26,205,154, 53,107, 20,128, 47, 42,170,169, 6,162, 0,192, 6,
-252,133,146, 23,166, 24, 12,228,253, 85,171, 6, 0,120,114,229,202,149, 24, 58,116, 40, 62,253,248,227, 38,238, 6,171,212,241,
-164, 20,201,103,182,227,226,153, 93,144, 36,201,254,162,101,126,166,190,165,147, 20, 21, 21, 25,247,237,219,167,251,254,251,239,
- 17, 28, 28,140,154, 53,107,194,207,207, 15, 74,165,242, 58, 51,224,120,121,219,119,189, 94,111, 60,121,242,164,110,217,178,101,
- 8, 9, 9, 65,141, 26, 53,160,213,106,161, 82,169,156, 55,232,251, 54,172,196,168, 17,253,145,115,249, 20,230,254,239,113,159,
-211,249,220, 67, 93, 16,173, 86,160,255,212,233,104,212,168, 17, 86, 60,222, 15, 28, 1, 70,255,189, 23, 50,153, 12,223,247,238,
- 0,165, 82,129,209,127, 31,240, 89,243,192,129, 3,160,148,162, 70,141, 26, 48, 24, 12,206, 40,155, 92, 46,199,166, 77,155,208,
-175, 95, 63, 44, 89,178, 4, 15, 62,248,160,215,125, 47, 42, 42, 50, 30, 61,122, 84,247,211, 79, 63, 33, 56, 56, 24,213,170, 85,
-131, 70,163,113,234,185,154,152,152,152, 24,228,229,229,161,118,237,218,229,106, 22, 23, 23, 27, 19, 19, 19,117, 75,150, 44, 65,
-112,112, 48,162,163,163,161,209,104, 74, 69,194,166, 76,153, 82, 74,163, 89,179,102, 55,173, 89,209,243,238,174, 57,112,224, 64,
-212,174, 93, 27,254,254,254,206, 99,224,110,180, 43, 72, 75,148,238,230, 96, 6,160,112,121,207, 2,112,192,195,122,142,223,101,
- 0,154,219,151,137, 0, 10, 1, 4,122,208, 43, 75, 39,219, 30, 47, 14,117, 91,223,253,127, 74, 27, 44, 66,136,163, 60,118, 2,
-176, 19, 0, 26, 54,108,136,156,156, 28, 40,149, 74,180,106,213, 10, 89, 89, 89,206, 48,159, 36, 73, 24, 60,120, 48, 63,126,252,
-248, 48,142,227, 96,181, 90, 65, 41, 5,207,243,112,220,249,185,251, 0,142,227,208,166, 77, 27, 28,183, 31,211, 30,125,250, 32,
- 58, 58, 26,201, 46,119,228, 67,135, 14, 37,175,191,254,186,224,136, 94, 80, 74, 97, 48, 24,208,172, 89, 51,117, 57,209,145,255,
-253,250,235,175, 1, 10,133,194,105,174, 28,105, 57,121,242, 36,102,206,156,137, 39,159,124, 18,151, 47, 95, 70, 68, 68, 4,222,
-120,227, 13,221,140, 25, 51,254, 7, 96,170,183,179,169,211,233, 74, 25,172, 17, 35, 70, 8,109,218,180, 9,211,104, 52,206,232,
-150,221, 84,162, 77,155, 54,196, 91, 4, 75,146, 36,252,245,215, 95, 30,239, 14,221,239, 24,236,163, 46,124,210,220,183,111,159,
-211,156, 57,162, 23,142,229, 73, 73, 73,206, 8,150,221, 8,150,167, 73, 29, 70,205, 17, 38,151,201,100,242,125,251,246,125, 24,
- 17, 17,161, 27, 49, 98, 4, 10, 11, 11, 17, 25, 25,137,238,221,187, 67,146, 36, 88, 44, 22,140, 25, 51,166,220,200,139, 76, 38,
-195,254,253,251, 49, 99,198, 12,140, 31, 63, 30, 11, 22, 44, 64,183,110,221, 74, 69,176, 28,119,186,254,254,119,124,140, 67, 37,
-134,176, 0,139,205, 10,189,222, 0, 74, 69,136, 18,133, 36, 74, 56,186,245, 80,189, 11,135,207,197,174, 93,186, 88, 6, 0,198,
-109, 43, 93,183,138, 24, 56,239,231,250,157,130,229,251,182, 94,179,236,243,210,236,140, 23, 95,124, 17,147, 38, 77,194, 99,143,
- 61,134,141, 27, 55,226,237,183,223,198, 51,207, 60,227, 52,239,142,188,224, 67,179,227,215,195,134, 13,123, 97,197,138, 21, 13,
- 94,123,237, 53,206, 81, 38, 53, 26, 13, 8, 33, 48, 26,141,206,215,201,147, 39,165,231,159,127,254,180,217,108,254,186,204,140,
- 36,168,143,104,149,250, 63, 51,114,184,186, 87,254, 14,230,136,224,111, 9,173,209, 41,255,225,122,221,104,183,199,107, 6, 81,
-169, 36,194, 71, 65, 97, 50, 22,227,173,241,227,248, 59,121,170, 8, 33,189, 31,122,232,161,238, 31,126,248,225,117,203, 62,252,
-240, 67,156, 56,113,162, 59, 33, 36,185,172, 38,209, 50,204, 85,116, 64,213,170,179, 0, 64,125,229,202, 88, 3,144, 10, 0,239,
- 3, 61, 68,160,223,198,141, 27, 1, 0,213,171, 87,135, 4, 52, 38,192,143, 60,176,204, 6,172,243, 20, 81,183, 88,109, 48, 24,
-140,144,104, 73, 62,146,168, 4, 73, 44,137,130,186,155, 44,111,237,110,148, 82, 74, 8,145,120,158, 71,147, 38, 77,208,163, 71,
- 15, 40, 20, 10,232,116, 58,103, 61,239, 94, 39,249,112, 81,164, 0, 36, 66, 8, 98, 98, 98,208,189,123,119,200,229,114,104,181,
- 90,248,251,251, 59, 13, 22,207,243,104,210,166, 11,150, 45,249, 4,195,123,196, 98, 68,135,112,252,122, 52,219,167,116,214,208,
- 40, 80, 67,173, 68,195,134, 13,225,231,231, 7, 66, 0,158,231,156,233,212,106, 84,144, 59,155, 31,125,219,247, 43, 87,174, 32,
- 57, 57, 25,201,201,201,224, 56, 14,109,219,182,133, 66,161,128, 32, 8, 56,115,230, 12,166, 78,157, 10,179,217,236,211,190,115,
- 28,135,186,117,235,162, 75,151, 46, 80, 40, 20,112, 92, 43, 92,155, 6,101, 50, 25, 10, 11, 11, 81,167, 78, 29,172, 90,181, 10,
-237,219,183,247,170,217,168, 81, 35,116,234,212, 9,114,185, 28,106,181,218,217, 85, 71,225,178,175, 69, 69, 69,206,227,208,162,
- 69,139, 10,105,110,216,127, 25, 11, 55,108,129,201, 44,161, 64,111, 45,181, 65, 68, 21,127,236,252,105,188, 79,251,238,208,252,
-250,235,175,145,151,151,231,172,135, 56,142,115,190, 8, 33,136,142,142,198, 87, 95,125,229,169, 28, 58,189, 8,165,116,155,219,
-226, 80, 66,200, 90,151,243,216,135, 16,178,214,245,189,172,245,236, 31, 59, 76,156, 56, 49, 97,198,140, 25,211, 90,183,110,189,
-108,247,238,221, 75,203,210, 43, 75,103,226,196,137,177, 51,102,204,152,230,186,190,135,255,185, 62,130, 85,146,231, 8, 5,192,
- 57, 34, 51, 81, 81, 81,206,118,103,157, 78, 7,185, 92,238,220,208,102,179,225,187,239,190, 67, 88, 88, 24,194,195,195,157,239,
-101,101,232,234,213,171,131, 82,138, 87,178, 74,186, 0,253, 21, 41, 71, 50,128,135,179,168, 83, 79, 20, 69,172, 88,177, 2,126,
-126,126,206,130,174,211,233,202,109, 46, 82, 40, 20,157, 90,182,108,201,153, 76, 38,103,152,156,227, 56,156, 60,121, 18, 51,102,
-204,192,208,161, 67, 81,191,126,125,136,162,136,226,226, 98,116,238,220, 89, 54,119,238,220, 78,190, 26, 44,141, 70,227,236,119,
-100, 50,153,176,121,243,102, 4, 6, 6, 34, 40, 40, 8, 33, 33, 33, 8, 14, 14,134, 82,169,116,205, 24,229, 54, 59, 14, 24, 48,
-160, 84,228,202, 53,106,229, 90,161, 57,154,253,124,209,124,240,193, 7,157,209, 43,157, 78,135,117,235,254,173,159, 91,181,106,
- 5, 74, 41, 66, 67, 67,177,103,207, 30,175,149,110, 92, 92, 28, 36, 73, 66, 88, 88, 24,100, 50, 25,217,180,105,211,251,118,115,
- 69,100, 50, 25,254,249,231, 31, 36, 37, 37, 33, 52, 52,212,121, 87,234,141,226,226,226,140,185,115,231,138, 95,126,249, 37, 0,
-160,107,215,174,200,207,207,191,234,178, 60,103,248,240,225,165,246, 55, 55, 55, 55,231, 62,240, 87,176, 89,108,208, 27,140, 40,
- 42, 44,134, 85, 18, 97,181,137,184,154,150, 21, 56,254,245,177,178, 79,199,140, 4, 0,188, 62,251, 11, 20,126,245,111, 5,246,
-251,235, 67,194, 6,204, 92, 62, 1, 64,255,242,244,245,122, 61,140, 70, 35,170, 87,175,142, 3, 7, 14,160,176,176, 16,221,186,
-117, 43, 21,253,245,210, 4,225,122,238,205,132,144,182,125,250,244, 57,240,217,103,159,213,110,220,184, 49, 41, 46, 46, 70,113,
-113, 49,244,122, 61, 28,159,143, 29, 59, 70,151, 46, 93,122, 65,175,215,183,161,148,150,217,103, 72, 17, 95,120,206,156,232,183,
- 98,199, 17,121,159, 71, 7,246, 11, 72, 77, 75,177,229, 24, 84, 69,249,134,211, 38,145,158, 0, 21, 41, 68, 74, 65, 69, 9, 34,
-149,112, 39,199,111, 19, 66,162,235,213,171,247,252,146, 37, 75, 60, 26, 82,158,231,177,100,201, 18,180,107,215,238,121, 66,200,
-201,242, 58,247, 59,168, 9, 40,108, 50,217,248,159,127,254, 89, 14, 0, 93,186,116, 25, 95,211,106,125, 61, 25, 48, 55,110,218,
-116,208,238,221,187, 3, 52,154,146,113, 66, 1, 1, 1,160,148,242,122,189, 62,160, 77,155, 54,131,224,201, 96, 73, 20, 86,171,
- 13, 6,163, 9,121,249, 69,176,154,173,176, 73, 54,136, 54, 9, 54,169, 36, 58,106, 19, 69, 72, 54, 17, 54, 73, 4, 47,240,126,
-157, 30,172, 94, 84, 18,203, 34,121,219,246, 94,174,230, 41,139,150,140,240, 2,170, 86,173,234,108, 18,118,237, 43,227, 45,138,
-225, 1,177,164, 46,164,206,186,241,200,214,181,184,122, 98, 39,228,132, 66, 18,173,144,108, 22,136, 86, 11,120, 72, 56,113, 62,
- 13,141, 35,189,214, 33,206,116,246,124,247, 3,180,106,213, 10,191, 14,233, 15, 66,128,209,155,247, 64, 46,151, 99,233, 35,221,
-160, 80, 41,240,236,134,189,190,166,179,212,190, 39, 38, 38,226,149, 87, 94,193, 71, 31,125, 4,181, 90,237,188, 57, 57,117,234,
- 20,150, 47, 95,142,135, 30,122,200,231,125, 39,164,164,169,213,113, 12, 39, 78,156,136,244,244,116,204,154, 53, 11, 9, 9, 9,
-144,201,100,200,203,203, 67,155, 54,109,144,153,153,233,147, 38,165, 18,130,131,131,157,221,117,220,251,136, 57,110,100, 43,114,
-142, 92, 53,159,126, 36, 2,171,119, 45, 5, 1,193,222,159,198,150,186, 30,205, 95,190,163,194,154,147, 38, 77, 42,149,206,138,
- 68,175, 92,188, 8, 41, 99,121, 31, 31,235, 52,199,122,142,131,172,156, 49, 99,198, 52,247,237,189,233,185, 46,119,219,222,236,
-102,202, 50,189, 54, 17, 82, 74,105, 84, 84, 20, 36, 73,130, 78,167,131, 66, 81, 18, 1,115,191,144,106,181,218, 82,142,220, 91,
-123, 50,207,243,160,148, 58, 15, 44,239, 97,249,158, 61,123,174, 51, 1,223,124,243, 77,185,237,180, 54,155,173,145,159,159, 31,
- 10, 11, 11,157,125,164, 20, 10, 5, 38, 76,152,128,225,195,135, 59,205,149, 66,161,192,162, 69,139, 16, 31, 31, 15,179,217,220,
-168,188, 3, 42,151,203,245, 77,155, 54,229, 28, 81, 32,181, 90, 77,134, 14, 29,202, 91, 44, 22,168, 84,170, 82, 81, 39, 71,223,
- 52,111,102,200, 17,109, 90,191,126,189, 79, 17, 44, 95,251, 32, 81, 74,113,232,208,161, 82, 70,205, 62,212, 24, 0,112,248,240,
- 97,231,133,214,215,246,110, 81, 20,161, 86,171,137, 92, 46, 39, 90,173, 54, 96,196,136, 17, 78, 93,199, 57,119,236,183, 47, 29,
-173,143, 28, 57,210,185,188,229, 71,143, 30,189, 47,167, 99,144, 36, 9, 22,171, 21, 6,131, 17,133,197,122, 76,153,110,111, 81,
-155,130,125, 0,246,181, 29,245, 10, 94,236,241, 80, 23,120, 25,221, 87, 22,193,193,193,248,237,183,223, 32,147,201,176,106,213,
- 42,248,251,251,163, 95,191,126,240,247,247,199,248,241,227,241,248,227,143,251,108,176,236,121, 41,159, 16,210,118,236,216,177,
- 7, 62,254,248,227,234,213,171, 87,135,197, 98,129,217,108,134,197, 98,193,249,243,231,177,116,233,210, 20,189, 94,223,150, 82,
-154,239, 77, 79, 17, 95,120,110,237,107,181, 51,218, 13,124,196,120,226,202, 6,100, 94,201,130, 77, 76,133, 77, 20, 97,179,218,
- 74, 12,129, 36,193,102,177,129,231, 57,255,206,173,107,108, 42,233,240, 79,204, 91,247, 36,247,186,141,167,138,158, 57,115, 38,
- 39, 52, 52,212,113, 7,233,111, 54,155,137,189, 46,161, 0, 28, 29,220,139, 1, 88,124, 17, 76, 1, 70,125,250,209, 71,213, 28,
-205,247, 31,125,244, 81,181, 55, 94,123,109, 20,128, 57, 39,142, 30, 93,252,244,211, 79,143,253,229,151, 95, 74,109,243,244,211,
- 79,227,196,209,163,139,203, 10, 17, 88,173, 86, 24, 12, 38,100,103, 95,195,115,163,223,253, 55,228, 12,234,236,232,110,159,213,
- 17, 0, 84, 0,144,157,121, 22, 99, 94,121, 67, 89,214, 13, 85,227,198,141, 29,229, 29, 50,153,236,186, 78,200,174,245,187,183,
-250,195, 30, 25, 42,213,197, 66, 46,151,227,220,238,181, 24, 59,106, 16, 32,218, 0, 75, 49, 96,209,131, 90,244,160,230, 98, 16,
-133, 26,212,106,244,170,235, 72,167,163,219,134,192,115, 80, 42,254,173, 55, 53, 26, 53, 20, 42,133, 79,233,244,180,239,151, 46,
- 93,194, 75, 47,189, 4,179,217,140,129, 3, 7,194,104, 52,194,100, 50,193,104, 52, 34, 38, 38, 6, 6,131,193,231,125,151, 36,
-201, 25, 5, 28, 59,118, 44, 18, 18, 18, 48,117,234, 84,188,249,230,155,136,137,137,193,168, 81,163,176,108,217, 50,196,198,198,
- 66,175,215,123,213,116,212, 37, 58,157, 14,130, 32, 56,235, 96,215,115,229, 48, 88,190,158, 35, 79,154, 37,211,129,225,186,243,
-254,234,136,174, 21,214,156, 54,109, 26,178,179,179,175,139, 92,185, 70,176,230,205,155,119,163, 55, 68,107,125, 49, 89, 46,235,
- 37,218,127, 50, 76,152, 48,225, 45, 66,200,218, 9, 19, 38,188, 53,125,250,244, 36, 95,244,202, 88,254,135,253,253, 97,151,223,
- 18,189, 26, 44,160,100,232, 40,165,212, 25,214,116, 28, 56,199, 50, 0,208,104, 52, 88,187,118, 45, 86,172, 88, 81,234,130, 82,
- 22, 28,199, 65,146, 36,252, 25, 90,114, 34,122,219, 35, 87,142,239,189,174, 74,232,211,167, 15, 98, 98, 98, 74, 69,175,212,106,
-117,185,102, 67,146, 36, 92,186,116, 9,199,142, 29, 67,235,214,173,145,159,159, 15, 1,192,235, 71,143,162,241,136, 17, 48,217,
-141,159, 66,161,192,243,207, 63,239,211, 9, 60,112,224, 64,169, 78, 64,141, 27, 55, 78,109,211,166, 77,212,158, 61,123,156, 17,
- 45,165, 82, 9,149, 74,229, 52, 25, 62, 22,106, 12, 26, 52,168,148, 25,114, 55, 88,142,194,243,215, 95,127,249,212, 68, 72, 41,
- 69,199,142, 29,157,209, 43, 63, 63, 63,252,254,251,239,206,117, 58,116,232, 0, 66, 8,194,194,194,176,110,221, 58,175,154,142,
- 99,234, 56,247, 60,207,163,184,184, 24,137,137,137, 80, 40, 20,206,254, 25,106,181,218,185,255,140,178, 78,184, 4,179,213, 10,
-189,193,136,194,194,146,138,244,220,177, 95, 75,173, 98, 49,221,248,224, 52, 71, 36,180,160,160, 0,155, 55,111,198,111,191,253,
-134,132,132,132, 82,205,131,190, 54, 17,186,228,209, 44, 66, 72,187, 55,223,124,115,239,251,239,191, 31, 25, 18, 18, 2,139,197,
-130, 75,151, 46,225,187,239,190, 75,215,235,245,237, 40,165, 89, 21, 16,132,205,106,131, 81,111, 64,126, 97, 49, 38,127,184,168,
-204, 42, 2, 0, 44,230, 66,244,233,213, 81,113, 91, 79, 19,165,105, 0,158,113, 41, 87,139, 1, 4,216,191, 22, 80, 74,135, 87,
- 68, 79, 6,116, 26, 56,104, 80,151,177, 99,199, 58,127, 27, 59,118, 44,246,238,221,219, 69,182, 98,197, 49, 43,176,149, 95,177,
-162,201,172, 89,179,156,235,204,154, 53, 11,191,173, 88,241,183, 8,108, 45,235, 56, 90,237, 77,132, 69,197, 6,248, 7, 70, 32,
-237,226, 54,175,105,145,243, 38,208,114,234,101, 71, 29, 82, 86,191, 27, 95,205,149,235,197,182,105,211,166,112, 52, 49,203,229,
-114, 52,233, 50, 8,159,205,249, 6, 74,142, 98, 64,151,198, 8, 85, 75, 32,154, 96,200, 59, 78, 0, 9,172, 81,178,225,228,230,
-240,165,174,219,246,246,235, 56,175, 85,225,249,141,187, 32,147,201,240,219,144,222,144, 43,228,120,242,143,237, 37,131,123, 70,
- 14,128, 92,169, 64,247,249,203,125,185, 80, 59,247,253,220,185,115,216,181,107, 23, 26, 54,108,136,179,103,207, 58,251,216, 58,
-174, 91, 62,182, 38, 80,199, 60, 87,142,122,252,202,149, 43,232,211,167, 15,228,114, 57, 22, 45, 90,132,109,219,182,225,205, 55,
-223,196,211, 79, 63,141,206,157, 59,123,236, 23,235,174, 25, 27, 27, 91,234, 28,149,213, 63,170, 34,231,200,147,166, 51,255,222,
-224,121,119,213,116,116,110,247,100,214,111,182, 99,187, 75,180,200, 83,147,217,195, 30, 34, 79, 45, 81,210, 55,202, 52,125,250,
-244,164,233,211,167,247, 33,132,172,157, 62,125,122,159,114, 34, 88, 15,123,137,112, 61,140,146, 62, 87,229,215,209,110,109,159,
-157, 92, 77,148,162,156,182,108,173, 86,139,103,158,121, 6,227,199,143,119,118,100, 44, 15,135,115, 45,143,181,107,215, 94,247,
-219,170, 85,171,188, 53, 17,158, 12, 8, 8, 72,232,210,165, 11,242,243,243,113,249,242,101,232,116, 58, 52,158, 57, 19, 71, 95,
-124, 17,205, 23, 44, 0,215,165,139,179,192, 31, 61,122, 20, 74,165,242,100, 69, 79,170, 78,167, 67, 80, 80, 16, 84, 42, 21,252,
-252,252,224,231,231, 7,173, 86,235, 52, 90,222,154, 8, 29,133,249,143, 63,254, 40, 55,114,229, 26,242,245,197, 12, 81, 74,177,
-103,207,158,235, 34, 88,142,255,116, 44,115, 68, 50,124,209,180, 71, 44,169, 82,169, 4,207,243,208,104, 52,206,112,191, 74,165,
-114,190,124,141, 96,121,155, 72,180,102,205,154,165, 38, 34,149,201,100,165, 38, 34,189,247,155, 8, 77, 40, 46, 42,174,116,125,
-179,217, 12, 65, 16,240,219,111,191,225,129, 7, 30,112,154, 43,135,177,114, 61,239, 21,172,192, 82, 9, 33,157,230,206,157,187,
-239,179,207, 62, 11, 42, 42, 42,194,162, 69,139,242,139,138,138, 58, 81, 74, 83, 43,164, 5,192,106,177, 65,111, 50,161,168,176,
-228, 24,156, 79,250,213,171, 41,187,151,105,212,180,233,240,239,191,255,254,186,223,191,255,254,123,156, 61,123,118, 56,142, 30,
-221, 90, 13, 88, 48,126,252,248, 58,241,241,241,213, 0, 96,252,248,241, 41,213,128, 5,229,149,115, 71, 19, 97,145,221,172, 27,
-139,179, 43, 45,210,234,126,195,119,179, 23, 68, 66,136,211,100, 60,244,216, 51, 72,191,112, 10, 13, 53,217, 8, 11,212, 66, 42,
- 76,135,188,235,100, 28,189,166,193,236, 5,235, 43,148, 78,141, 66, 14,149,250,223,230, 38,149, 90, 5,165,189, 85,129, 16, 2,
-149, 70, 13,153, 66, 81,225,125, 63,117,234, 20, 52, 26, 13, 68, 81,188,238,122, 83,209, 17,205,148, 82,231,181,243,179,207, 62,
-195,184,113,227,176,104,209, 34, 28, 61,122, 20,205,155, 55, 71,183,110,221,112,245,234, 85, 28, 57,114, 4, 38,147,201,231,116,
-186, 94, 47, 78,156, 56,129, 77,155, 54,225,244,233,211, 72, 73, 73,185,225,243,238,222,204,104,111,193, 41, 49,175,155,254,193,
-163, 15,197,221,144,230,228,201,147,113,245,234,213,235, 34, 87,174,221,143,202,138, 96,185,122,145,114, 72,116,139, 30,193,209,
- 31,202, 97,136,220,191, 3, 8,114,252, 54, 97,194,132,183,124,221,206,245,187, 35, 2,230,107, 83,165,224,233,162,235,104, 98,
-114, 28,116,215,200,148,227,179, 70,163,113, 70,153,106,212,168, 81,110,244,202, 81,224,120,158, 71,251, 11,133, 80, 40, 20,206,
-230,188, 94, 87,165, 82, 33,242,152,152,152, 82,125,176, 92, 79,138, 39, 76, 38,211,214,173, 91,183,182,232,215,175, 31,127,226,
-196, 9, 8,130, 0, 73,146, 96,122,240, 65, 52, 95,176, 0,199,198,142, 69,135,139, 23, 97,178, 90,161, 82,169,240,215, 95,127,
- 89,244,122,253,214,138,100, 26,142,227,136,195, 96, 41,149, 74,248,249,249,193,223,223,223, 25,205,169, 72, 37, 84,214, 29,162,
-235,171, 34, 5,218,209,161,223,245,194,234, 56,127, 6,131,161,148,225,242, 21,215, 38, 3,135, 41, 10, 8, 8, 40,213, 44,234,
-136,226,249, 98,176,188, 77, 36,170, 84, 42,253,183,111,223, 94,199,223,223, 31,148, 82,100,103,103, 99,200,144, 33,103,238,249,
- 0, 22,104, 73, 39,119,131, 17, 69, 6, 99,165,235,255,244,211, 79, 56,119,238, 28, 44, 22, 11,166, 79,159,126,157,177,186,145,
- 8,150, 75,190, 58, 23, 23, 23, 39,245,236,217, 19,123,246,236,129, 82,169,180, 82, 74, 43, 60,127, 21,149, 36, 88,172, 54, 24,
- 13, 38, 20, 21, 23,227,191,192,241,163, 71, 87,104,181,218, 33, 0,116,121,121,121,124, 64, 64, 0, 52, 26, 13, 12, 6, 67, 62,
-111, 31, 41,152, 12,152,213, 86,235, 71,143, 61,246,216, 44, 0, 16,172,214,143,202,155, 7,203,105,176, 42,249, 56, 58,234,173,
-178,162, 87, 55,106,174, 8, 33, 37,195,243, 57, 14,139,166,143, 67, 67, 77, 22,226,106,105, 97,188,122, 14, 74,255, 42, 32,129,
- 53, 49,123,193,122,156, 72,190, 86,161,116, 14, 93,252, 43,170, 85,171,134,181, 79,246,135, 82,169,196,144, 95, 55,149,116,210,
- 30,245, 56,228, 42, 37,186,126,241,211, 13,237,187, 94,175, 47, 51, 82,229,107, 4,203, 85,211, 97, 0,227,226,226, 80,183,110,
- 93,108,221,186, 21,113,113,113, 56,123,246, 44,206,158, 61,139,228,228,100, 28, 61,122, 20,185,185,185, 21, 62, 71,203,151, 47,
- 71, 86, 86, 22,228,114, 57, 10, 10, 10,112,241,226,197, 50,251, 63, 87,228,188, 59,104,240,240,100, 0, 64,100,104, 64,133, 12,
-150,171,230, 39,159,124, 82,145,105, 30, 92,243,121,121, 43,101,187,245,117,114,124, 55,187,153, 29,247,239,238,235, 3,192, 85,
- 0,188,151,237,220,191,103, 79,159, 62,125,171, 35,242,101,215,229,203,234,127, 85, 42,130,229,102, 2, 12, 13, 26, 52, 80,187,
-182,159,114, 28, 7, 63, 63, 63,242,198, 27,111,240,132, 16,232,116, 58, 4, 4, 4,160, 94,189,122,176, 88,188,119, 75,144,203,
-229,134, 86,173, 90,169, 93, 67,175,132, 16,104,181, 90,254,205, 55,223, 36,223,124,243,141,199,237, 86,175, 94, 93,110,230,182,
-217,108,179, 70,140, 24,241,108,106,106,106, 80,120,120, 56, 50, 50, 50, 32,151,203, 75,102,139,237,220, 25,237, 47, 92,128,197,
-110, 24, 78,157, 58,133,133, 11, 23, 22, 91, 44,150, 89, 55, 18,193, 10, 9, 9,129, 82,169, 44, 53, 42,198, 37,180,234, 83, 4,
-171, 50,205,149, 67,211,245,194,234,248, 60,106,212, 40,231,247,138, 84,146,114,185,156, 62,252,240,195,206,103, 16, 6, 6, 6,
-162, 74,149, 42,200,204,204,252,119,164,142, 61,114,231,171,193,242, 54,145,168, 76, 38,131,197, 98,113, 54,103,126,241,197, 23,
- 55,108, 12,238, 42,131,101,147,136, 78, 23,138,200,200,250, 8, 13, 51, 66,146,196, 74,211,182,217,108, 24, 61,122,116,169, 57,
-175, 28, 23, 98,199, 36,182,142, 17,190,174,225,255,138,222,137,223,116,116,132, 2, 86,155, 61,138,167, 55,223,115,231,176, 70,
-141, 26,254,246, 38, 67,119,150, 81, 74,215,121, 60, 55,246, 41, 25,120,224,131,203,151, 47, 55, 9, 8, 8, 64,247,238,221,177,
-102,229,202,213,239, 2,206,144,141, 1, 72, 85, 95,185,242, 63,251,231, 52,111, 65, 61, 71, 19, 97,177,190,178,205, 58,185, 46,
-122,117,179, 77, 57, 28, 87,114, 99,246,251, 87, 31,161,161, 58, 19,205,171, 43,177,107,239, 17, 60, 80,141,130,154,228, 55,156,
- 78,157, 78, 87,210, 25, 95,163,129, 82,249,111,159, 43,165, 70, 13,185, 66,121,195,251,238, 26,169,186,217, 8, 22, 33, 92,169,
-227,248,236,179,207, 98,252,248,241,232,222,189, 59,206,158, 61,139,237,219,183,227,204,153, 51,120,229,149, 87, 16, 27, 27,139,
- 30, 61,122, 84,232, 28,253,254,251,239,200,207,207, 7,165, 20, 89, 89, 89, 48, 26,141,152, 52,105,210, 77,159,119, 7, 23, 54,
- 78, 3, 0,252,186,241,208, 13,107, 78,156, 56,209, 57, 7,163,227,154, 95, 94,212,202, 71,246,123,249, 94,209,237,111, 57, 30,
- 13,214,233,211,167, 61,142,149,111,212,168, 81,102,215,174, 93,195, 78,159, 62, 13,157, 78,135,122,245,234,193,100, 50,149,217,
- 12,225,250,180,237,164,164, 36,143,154,181,107,215,182, 60,244,208, 67,178,170, 85,171,150,138, 92, 57, 70,216,184, 58, 99,119,
- 77,251, 69,160,144, 16,242,124,219,182,109,127, 92,183,110,157,186, 94,189,122,200,207,207, 7, 0, 44, 90,180, 8, 47,191,252,
- 50,212,106, 53, 78,159, 62,141,254,253,251,235,245,122,253,243,174,115, 96,121,210,244,100,100,228,114,185,179,153,204,209, 84,
-166, 40, 39, 20, 93,198,147,198, 49,119,238, 92,143,115, 65,185,179, 96,193,130,146,220,234, 67, 58, 63,253,244,211, 74,211,220,
-187,119,111,169,103, 12,246,237,219,247,171, 30, 61,122, 32, 37, 37,165, 84,179, 96,121, 6,203, 93,211,219, 68,162, 60,207, 35,
- 60, 60, 28,239,191,255, 62,170, 84,169,130,170, 85,171, 94,103,176,188,157,163, 27,188,123,191,165,154,148,163,137,115, 62,155,
-220,238,171,111,127,149, 41, 21, 28,246,108,255, 21, 5,185, 87, 74, 71, 96, 45,255, 14,137, 86,196,117,133,249,208,102,159,210,
-105, 50,153,240,241,199, 31, 99,242,228,201,152, 60,121,114,185,105, 42, 99, 56,180,215,125,119, 53, 88,190,152, 45, 79,154,146,
- 36, 18,149, 38, 8, 26,109, 36, 98, 99,131, 32,249, 48, 87,167,116,231,207,187, 62, 37, 37, 37,160, 90,181,106, 56,115,230, 12,
-193,191,253,177,254, 61, 87, 10,197, 16,184,140,246,243, 88,222,129,163, 75,151, 46,109,210,180,105, 83,124,241,197, 23, 0,240,
-228,199, 27, 54, 60, 62,217, 80, 18,206,180, 79,201,240,151, 47,233, 20,169, 72, 84,154, 64,168,117,246,227, 40,249, 62,231, 41,
- 45,103,223, 29, 23,191,155,188,209,187, 78,211,177,253,249, 61,127,224,225, 94,209,216,189,239, 40, 54,167,106, 81, 77,153,142,
- 8,125, 22,164,172,147,248,223,160, 56,204, 94, 81,114, 17, 63,122,208,187, 38, 33, 4, 59,223,120, 30, 58,149, 18,143, 46,253,
- 19, 50,153, 12, 91,199, 62, 5,185, 92,142,142,159,149, 52,201, 30,251,120, 34, 4,165, 2, 13, 95,153,236, 83, 58,221, 91,106,
- 28,125,174, 92,205, 85,121, 17,172,242,246,189,168,168, 8,185,185,185,248,241,199, 31, 49,114,228, 72, 92,189,122, 21, 23, 47,
- 94,196,233,211,167,177,108,217,178, 82,215, 56, 84,224, 28, 77,152, 48, 1,175,191,254, 58, 56,142, 67,147, 38, 77, 48,121,242,
-100,180,110,221,186,194,231,200,253,188,187,227, 45,122, 85,158,230,156, 57,115, 42, 60, 96,235,126,164, 66, 29, 52, 28,145,172,
- 42, 85,170, 64,171,213, 2, 64,169, 11,172,183,102,194,178, 52,109, 54, 27,212,106, 53,212,106,117,169,105, 17,250,245,235,231,
- 53,130,101,175,252,255, 34,132, 12,107,220,184,241,119,147, 39, 79,214,118,234,212, 73, 22, 25, 25,137,248,248,120,156, 62,125,
- 26,127,252,241,135,101,222,188,121,122,189, 94, 63,146, 82,186,241, 70,234,100, 71,199,111,215, 25,237, 43,130, 40,138, 41, 23,
- 47, 94,140,248,244,211, 79,121, 66, 8,102,205,154, 85,106,130, 86,247,125,220,187,119,175,205, 91,147,140,205,102, 75,185,120,
-241, 98,196,204,153, 51, 75,105, 58, 94,238, 38,197, 23,205,178,112,236,179,251, 49,240,165,240,120,155, 72, 84, 16, 4,156, 58,
-117, 10,239,189,247, 30, 8, 33,165, 6, 78,220,203,236,218,159,254, 77,155,132,200,160, 33,131,186, 52, 37,224, 96,246, 16,233,
-229,115,242,156,230,106,192,204,229,248,253,245,199,125, 57, 23, 23,183,109,219, 86,125,218,180,105, 60,207,243,248,228,147, 79,
- 74,229, 37,247,243,254,247,223,127,139,106,181,250,242,141,238,135,197, 98,241, 58,138,170,156, 2,190,107,238, 39,239,117,255,
-234,251, 53, 50, 66,204,216,179,237, 87,228,231,121, 30,154,174,144, 9, 88,188,116,181, 77,224,185,148, 59,124,234,190,234,214,
-173,219,164, 77,155, 54, 9,213,170, 85,187, 97,145,104, 96,205,220,185,115,123,141, 24, 49, 34,184, 81,163, 70,142,193, 39, 10,
-251, 11,246,153,221,255,242,209, 36,173,154,253,233,123, 79,126,253,253, 26, 5, 71, 44,216,179,253, 87,228,187,153,245,235,163,
-209, 50, 44, 89,186,202, 34, 8,252, 41,111,117,240,141,140, 96,246,133, 22, 15,143,196,151,127, 46, 68, 88,211, 94, 24,220,183,
- 29,118,126,241, 36, 30,107,100,128,229,231,161,104, 50,120, 49, 22, 77, 44,137,222, 52,255,101,162, 79,215, 10,127,221,191, 19,
- 86,114, 28, 7,165, 74, 13,153,226,223,232,139, 66,163, 1, 95,129,136,173, 99,223,203,139, 84, 85,244,120,240, 60,143,152,152,
- 24,212,174, 93, 27,109,219,182, 69,139, 22, 45,208,185,115,103, 28, 57,114, 4, 71,142, 28,193, 43,175,188, 82,166,185,242,229,
- 28,117,239,222, 29, 61,123,246,188,233,115,227,126,222, 43, 3, 95,242,210,139, 47,190, 8, 0, 55, 27,205,186,127, 13, 86,104,
-104, 40, 20, 10,197, 13, 25, 42, 79,154,102,179,217,105,172,212,106,181, 51, 98,181,122,245,106,159, 51, 56,165,116, 35, 33, 36,
-246,157,119,222,121, 85,173, 86,119, 54, 24, 12, 13, 1, 64,163,209,156,212,235,245, 91, 44, 22,203, 28, 74,105,222,205,164,213,
-213, 96,120,112,243,229,222,226,103,101,101,245, 24, 62,124,248, 70,142,227,106,149,247, 96,102, 23,179,154,156,153,153,217,203,
-155,230, 19, 79, 60,225, 81,211,147,174, 47,154,101,152,195, 82,166,202,117,132,161, 79,153,204,203, 68,162, 50,153, 12, 58,157,
- 14, 43, 87,174, 68, 72, 72,200,125, 85,192,118, 31, 76,255,184,188,229,157,170, 40,183, 1, 8, 29, 48,115,249,229,173,217,230,
- 26,157,170, 40, 46,253,254,250,227,213,189, 24,158, 54, 51,102,204,216,105,181, 90,107,248,152,111, 47,153, 76,166,118, 21, 77,
- 59,165, 20,167, 78,157,146,158,125,246,217,236,172,172,172,193, 55,178,255,219,247, 92,250,172, 93,171,200, 42,131,250,183,107,
- 9, 66, 96, 54,155,202,106, 89,160,148, 82, 42,240, 92,202,182,189, 41,207,222,201,115, 70, 41, 61, 76, 8,153, 90,167, 78,157,
- 23, 0,148,117, 37, 92,230, 77, 39, 25, 48, 43, 76,166, 79, 19, 18, 18,222,124,235,173,183, 2,251,246,237,139,106,213,170, 33,
- 32, 32,160,194,105,218,185, 47,245,133,214, 9, 17,209,143,246,107,215,131, 35,132,154,204, 38, 47,209, 5,251,241, 20,248, 83,
-219,246,166, 52, 43, 47, 58,239, 48,229,183, 34,218,208,117,208,211,232, 58,232,105,103,126,218,188,162, 19, 18,211, 54, 32,158,
- 75,131,233,235,118, 32,254,142,172,238,125,154, 27,142,227,208,247,251,149,144,203,229,206,116,182,153, 81,122, 92, 64,189,151,
-124,127,150,186,235,190,187, 70,176, 60,212,197, 21,234,131,197,243, 60,178,179,179,113,250,244,105,100,102,102, 66,175,215,227,
-196,137, 19, 48,155,205,200,205,205,133, 99,164,225,141,164,179,178,206,209,157,212,252, 47, 24,171, 27, 50, 88,148,210,212, 7,
- 30,120,192,219,197,184, 66,163,140, 4, 65, 48,182,107,215,142,120, 26,109,224,248,172, 86,171, 13, 62,166, 47, 15,192,100, 0,
-147,237,207,155,130,217,108,190,233,142, 36,162, 40,166,183,106,213,138, 47,175, 79,130, 36, 73,153, 94,204, 80, 49,128, 74,125,
-116,248,173,208,244, 80,104,196, 23, 94,120,161, 92, 39,165,213,106,203,237, 92,228,109, 34, 81,189, 94,159, 49,124,248,112,209,
-181,169,217,117, 34,210,251, 26, 66, 47,245, 30,242, 76,141,173,217,230, 26, 0,224, 48, 89,160,244, 82, 89,155, 28, 56,112, 32,
- 19, 64,157, 91,157,180, 11, 23, 46,152, 31,120,224,129, 37,133,133,133, 47, 82, 74,245, 55,170,179,115,127,250,196,123,237,180,
- 80, 74, 15, 3, 24,117,179, 58,102,224, 68,184,209, 56,122,242,187,239, 62,250,222,187,239,214,147,128, 16,216,231,168,226,125,
- 48,105,174,236, 57,152, 81,233,115,131,137,162,152,218,166, 77,155, 10,111,227,109,121, 57, 51,137,227, 39, 84, 3, 14, 86, 92,
-243, 86,164,211,161,217,180,105, 83, 52,111,222,220,249,238,192,245,247, 22, 45, 90,248,164, 25, 23, 23,135, 70,141, 26,149, 57,
- 67,187,123,159,171, 59,189,239, 14, 28,183,190, 45, 90,172,175, 52,205,155, 77,231,189, 95,189,223,194, 33,209,247, 98,191, 25,
-166,201, 52,153,166,115, 29,158, 82, 42,178,227,201, 52,153, 38,211,188, 29,154,247, 27, 28, 59, 4, 12, 6,163,140, 40,142,200,
-142, 2,131,193, 96,220,160, 9, 5,208,164,140,202,213,103,103, 74, 8,105, 82,209, 63,246,225,238,153,105, 50, 77,166,201, 52,
-153, 38,211,100,154,247,153,166, 55,237,251, 37, 50,198,154, 8,153, 38,211,100,154, 76,147,105, 50, 77,166,121,199, 53,239, 55,
- 88, 19, 33,131,193, 96, 48, 24, 12, 70, 37, 35,176, 67,192, 96,252,183,153, 66,200, 77,221,104,189, 71,169,196,210,201, 96, 48,
- 24,165, 97, 17, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193,248, 79,
-113, 75, 71, 17, 50, 24,140,187, 31,214, 7,139,193, 96, 48, 42, 31, 22,193, 98, 48, 24, 12, 6,131,193,168,100, 4,160,244,131,
-138, 41,165,132, 29, 22, 6,131,193, 96, 48, 24,183,147,251,205,139, 8,204, 88, 49, 24, 12, 6,131,193,184, 27,184,159,188, 8,
-231,201, 57, 50, 24, 12, 6,131,193, 96,220,110,238, 39, 47,194,221,143,174,145,193, 96, 48, 24, 12,198,189,199,125, 27,193, 98,
- 81, 44, 6,131,193, 96, 48, 24,119,138,251,201,139, 8,247,155, 99,100, 48, 24, 12, 6,131,113,239,113,191,121,145, 91, 58, 77,
- 3, 33,164, 9,211,100,154, 76,147,105, 50, 77,166,201, 52,153,230,127, 13, 54, 15, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12,
- 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96,252,167, 16,216, 33, 96, 48,254,219,220, 43,207,232, 99,207, 18,100,
- 48, 24,247, 18, 44,130,197, 96, 48, 24, 12, 6,131, 81,201, 16, 0, 30, 71, 2, 80, 74,143,249, 44,114, 3,163, 9,188,233, 51,
- 77,166,201, 52,153, 38,211,100,154, 76,243,254,211,244,166, 93, 17,255,113, 87, 27, 44, 74,111,221,124, 94,132,144, 38,149,125,
-160,152, 38,211,100,154, 76,147,105, 50, 77,166,121,255,105,222,111,176, 38, 66,134,123,161, 17, 8, 33,194,141, 46,191, 93,154,
- 12, 6,131,193, 96,220,205,176,139, 26,195,213,232,180, 6,208,199,254,121, 45,165,116, 79, 69,150,223, 46,205, 59, 69,124,124,
-188, 90,165, 82,117,255,251,239,191,229,167, 78,157,194,222,189,123,233, 79, 63,253,100, 53, 26,141, 27, 18, 19, 19, 13, 44, 7,
-221, 31,196,197,197,245, 32,132,140, 7, 0, 74,233, 71,135, 14, 29, 90,127, 19,101,138,212,169, 83,231, 21,133, 66,209, 91, 38,
-147, 69,138,162, 72, 76, 38, 83,186,193, 96,216,152,150,150, 54,147,222, 64,199,125, 66, 72,203, 42, 85,170,140,138,141,141,173,
-119,225,194,133,148,203,151, 47, 47, 6,176, 30, 64,143,234,213,171, 15,143,137,137,169,150,148,148,116, 38, 59, 59,123, 1,165,
-244,192,157, 74, 39,131,193, 12,150,111,133,143, 11, 10, 10,122, 72,173, 86,191, 90, 84, 84, 20,231,239,239,159,100,179,217,230,
-102,100,100,172,101, 5,239,190, 49, 87, 2,128, 62,148, 82, 25, 0,240, 60,223,191,117,235,214, 53, 8, 33, 18, 33,132, 82, 74,
- 9,199,113, 45, 68, 81,228,236,235,247, 33,132, 28,160,148,218,110, 84,211,102,179, 85, 88,243, 86, 17, 27, 27, 59,141, 82, 26,
- 89,222, 58, 90,173, 54, 97,243,230,205, 13, 86,173, 90,101, 91,188,120,113,222,227,143, 63,174,123,234,169,167,132, 69,139, 22,
-125, 9,224,127,238,235, 55,110,220,248, 51,142,227,170,248,242,255,146, 36,101, 31, 63,126,252, 53,150, 19,239,138,178, 48,254,
-153, 25, 91, 59, 72, 20,248,110, 66, 71,206,110, 94,110,136, 22, 45, 90,252,240,200, 35,143, 12,169, 95,191,190, 32, 73, 18,172,
- 86, 43, 76, 38, 83,131, 67,135, 14,117, 90,191,126,125, 2,128,193, 21, 76, 91,159, 9, 19, 38, 44,156, 58,117,106,168, 76, 38,
- 35, 86,171,245,193,159,127,254,185,231,168, 81,163, 14, 47, 88,176,160,249, 99,143, 61,230,231,248,253,189,247,222,235, 69, 8,
- 25, 75, 41, 93,118,187,211,201, 96, 48,188, 24, 44, 63, 63,191,186,161,161,161,175,135,132,132,244, 74, 72, 72,200,127,254,249,
-231,207, 31, 57,114,228, 68,108,108,108,209,247,223,127,255,161,213,106,157, 87,191,126,253, 13, 5, 5, 5, 51,175, 92,185,114,
-162,130, 21, 69, 93, 0,207, 3,232, 5, 32, 26, 64, 58,128,117, 0, 22, 82, 74, 79,221,200,206, 68, 69, 69, 53,213,106,181,111,
- 18, 66, 30, 44, 46, 46,142,214,106,181,233,148,210,125,133,133,133,159,100,100,100, 28,186, 17,205,232,232,232,218, 0,198, 8,
-130,208, 94, 20,197, 90, 60,207, 95, 18, 69,113,135, 40,138, 95,164,167,167,159,185, 17,205,182,213,252,250, 74, 58,255,153, 86,
- 94, 93,173,200,104,147,235,148,130, 85, 38, 25, 83,164,226,188, 9,251, 46, 23,253,122, 55,100, 12,133, 66,193, 45, 94,188,184,
-185, 66,161, 0, 0,152,205,102,196,198,198,222,212,115,162,100, 50, 25,247,201, 39,159, 52,151,203,229, 0, 0,139,197,130, 46,
- 93,186,220, 21,207,158, 34,132, 68, 39, 38, 38, 6, 56,210,230,142, 40,138,232,223,191,127, 77,133, 66,129, 5, 11, 22,216,178,
-179,179,227,190,251,238,187,196, 47,191,252,178,202, 15, 63,252, 48,200,147,193,226, 56,174, 74, 89,154,162, 40,194, 98,177,192,
-102,179,193,108, 54,163,115,231,206,172, 54,186, 75,160,148,214,160, 0,214, 29, 49, 2, 64,200,205,104,169,213,234,134, 3, 6,
- 12, 16,178,178,178, 32,147,201, 96,177, 88,112,229,202, 21,212,174, 93,155, 55,155,205,245, 43,170,215,160, 65,131, 81,211,167,
- 79, 15,251,243,207, 63, 45, 75,150, 44, 49,117,235,214, 77, 62,114,228, 72,255, 14, 29, 58,180,143,142,142,230,190,251,238, 59,
-211,166, 77,155, 44, 79, 60,241,132,114,218,180,105, 97,235,214,173, 27, 2, 96,217,237, 78, 39,131,193, 40,199, 96,249,249,249,
-109,211,233,116,117,158,123,238,185, 83, 47,190,248,226, 6,157, 78, 39, 2,192,149, 43, 87,148,253,251,247,207, 26, 56,112,224,
- 85,189, 94,207,207,155, 55,175,250,231,159,127,190,209,207,207, 47,173,176,176,176,149, 15, 23, 50, 2,224, 85,142,227,198,116,
-239,222,125,155,213,106,205, 90,185,114,229, 47,131, 6, 13,106, 39, 73,146,246,239,191,255,254,131, 16,242, 21,128, 79,125,141,
-142, 17, 66,248,152,152,152,201,209,209,209,111,204,159, 63, 95, 89,171, 86, 45,104, 52, 26, 20, 22, 22, 86, 63,115,230, 76,181,
- 87, 95,125,181, 95,237,218,181,231, 6, 4, 4,188,147,152,152,104,245, 81,147, 68, 70, 70,254,207,223,223,255,131, 15, 63,252,
- 80,213,184,113, 99,162,209,104,144,156,156,220,100,207,158, 61,177,223,126,251,237,200,232,232,232, 41,105,105,105, 62,167,179,
- 19, 33,130,169, 78,232,250,192, 6,173, 58, 47, 88,248, 45,169,162,213, 64, 32, 4, 86,139, 69,150,169, 55,196,188, 60,250,133,
- 95, 90,215,171,186,171, 80,150,217,245,248,113,106,185,205, 23, 21, 27, 33,100, 45,207,243,253, 21, 10, 5,215,191,127,127,108,
-218,180,137, 24,141, 70, 1, 0, 84, 42,149,173,127,255,254, 80,171,213, 48,155,205, 18,128,181,246,109,148,246,237, 77,229,105,
-202,100, 50,174,115,231,206,250,131, 7, 15,230,232,245,122,153, 67,179,115,231,206,193, 74,165, 82, 99,181, 90,125,210,188,197,
-166, 18,231,206,157,187,206, 8, 93,189,122, 21, 57, 57, 57, 48,153, 76, 36, 55, 55, 23,162, 40,194,100, 50,101,137,162, 8,142,
- 43, 9,190,149,165, 41,151,203,113,250,244,233,235,126,183, 88, 44, 48, 24, 12,176, 90,173, 40, 40, 40, 80,171, 84,170, 58,237,
-219,183, 79, 5,176,170,168,168,104,230,225,195,135, 47,177,234,233,142,113,249,143,127,140,213, 1, 88, 0, 92,184, 73,227, 46,
- 1,192,142, 29, 59,144,153,153,137,172,172, 44,100,101,101,161, 90,181,106,184,145,232,255,169, 83,167,230,180,104,209,130, 28,
- 62,124,120, 13,128,133,203,151, 47, 31,112,237,218,181,249,227,198,141, 11,254,228,147, 79,174,189,249,230,155,163, 1,252,190,
-124,249,242,167,155, 54,109,218,247,232,209,163,179,239, 68, 58, 25, 12, 70, 57,157,220, 41,165,145,117,235,214,189, 54,107,214,
-172, 6, 19, 38, 76, 8, 41, 42, 42,226, 1, 32, 50, 50,210, 8, 0,122,189,158, 31, 63,126,124,232,140, 25, 51, 26, 40,149,202,
- 92,155,205, 22,234, 65,195,211, 8,131, 49,254,254,254,253,206,159, 63,191,188, 65,131, 6,193,211,167, 79,255, 71,171,213,210,
-217,179,103, 31,170, 93,187,118,196,165, 75,151,126,244,247,247,239, 2,224,141, 50,210,117,157,102,205,154, 53,223, 27, 52,104,
-208, 27,187,118,237, 82, 54,107,214, 12,126,126,126,224,121, 30,129,129,129,120,224,129, 7,200,246,237,219,149,189,123,247,126,
- 37, 63, 63,255, 19, 95, 53,163,162,162,222,232,217,179,231,135, 7, 15, 30, 84,119,237,218,149, 40, 20, 10,228,229,229, 65,161,
- 80,160,117,235,214,100,254,151, 95,168,155, 52,110,244, 94,116,116,244, 84, 95, 53, 77,117,171,108,124,252,197,241, 93,214,174,
- 91, 79,194,195,195,113,254,211,169,216,209, 33, 22,103,223,159,128,136,136, 8,172,249,243, 47,210,103,196,139,237,252,173,225,
-127,251,170, 89, 9,198,234,152,203,231, 61,177,177,177,137, 39, 78,156, 64,251,246,237,241,203, 47,191, 52, 27, 55,110,220,139,
-227,198,141,123,241,151, 95,126,105,214,190,125,123,156, 56,113, 2,177,177,177,137,148,210, 61,132,144, 23, 1, 92, 3,112,205,
-254,185, 76,205,109,219,182,161, 75,151, 46,185,203,151, 47,175, 61,105,210,164,105,147, 38, 77,154,246,203, 47,191,196,116,233,
-210, 37,119,219,182,109, 21,210,188, 21,251,238,106,168,220, 95,148, 82, 72,146,132,176,176,176,171,127,254,249, 39,237,211,167,
- 15, 95,181,106,213,244,254,253,251, 43,247,237,219, 71, 9, 33,107, 43,146, 78, 74, 41, 12, 6, 3, 12, 6, 3, 46, 92,184,160,
-158, 59,119,110,187, 55,222,120,163,238,207, 63,255, 28,245,202, 43,175,140,246,247,247, 63,212,188,121,243, 26,183,123,223,153,
-166, 51,242,120,197,110,174,138, 57,142,187,124,163,154,143, 62,250,104,147, 26, 53,106,132,255,156, 20,132, 92,121, 3,136,178,
- 0, 72,242, 64,136, 33, 45,113, 86,222, 19,145,145,145,225, 53,106,212,104, 93, 17, 77, 74,233,198,127,254,249,167, 23,165,116,
- 1,165, 84,164,148,174,120,243,205, 55,159, 37,132,252,250,230,155,111,190, 64, 41, 93, 97,255,253,155, 35, 71,142,244,165,148,
-110,185, 19,233,100,121,137,105,222, 2, 90, 2,120,216,254,106, 5,224, 1,183,239, 10,183,245,186,149,241,254,176,219,247,150,
-110,219,181,172, 84,131, 69, 8,161,142,151,203, 29,141,245,227,143, 63,222,251,237,183,223,110,202,200,200,136,136,137,137,121,
-120,192,128, 1, 53, 10, 10, 10,184,129, 3, 7,214,140,136,136,232,179,101,203,150,170, 3, 7, 14,252,123,208,160, 65,123, 8,
- 33, 94,251,205, 16, 66,106,243, 60, 63,246,240,225,195, 59,107,214,172,105, 73, 79, 79,247,107,209,162, 69, 33, 0,212,171, 87,
- 79,159,147,147,163,246,243,243,195,159,127,254,185,159, 16,242, 60, 33,164,129, 55,205,200,200,200, 22, 85,170, 84,121,227,131,
- 15, 62, 80,242, 60,239,113, 29,165, 82,137, 15, 62,248, 64,233,239,239,255, 92, 84, 84,212,131,222, 52,171, 86,173,218,208,207,
-207,111,242,220,185,115, 85,102,179, 25, 22,139, 5,225,225,225,208,233,116,200,200,200, 64,218,197,139,184,154,156,140, 87,158,
-121, 70,173, 85,171,199, 70, 70, 70, 54,247,166,217,190,166, 95,127, 93, 84,163, 78, 47,143,121, 21,199, 95,125, 6,155,162, 20,
-168, 58,102, 60,154,109, 61,134,232, 41, 51,177, 37,198, 31,137,131, 31,194,216,177,175, 67, 30, 22,211,166, 77, 53,221,227,119,
- 36,164, 41, 8, 84,169, 84,194,104, 52, 10, 59,118,236,104,111,179,217,100, 54,155, 77,182,125,251,246, 78, 27, 54,108,232, 53,
-125,250,244, 30,106,181,122,116,235,214,173,127, 32,132,204,161,148,170, 41,165,106, 0,159, 56, 34, 79,158, 52,101, 50, 25, 12,
- 6,131,236,224,193,131, 47,136,162,168, 16, 69, 81,113,240,224,193,151,182,108,217, 50,124,193,130, 5, 21,214,188, 93,240, 60,
- 15, 65, 16, 32,147,201,208,188,121,243,243, 75,151, 46,181, 70, 70, 70, 10, 95,127,253,117, 80, 88, 88,152,246,135, 31,126,200,
-203,205,205,253,184, 34,154,102,179, 25, 38,147, 9, 6,131, 1, 59,118,236,168,245,220,115,207, 9,102,179, 89, 28, 49, 98,196,
- 53,171,213,106,122,233,165,151,252,117, 58,221,235,236,254,239,206, 64, 41, 21, 1, 20, 3, 40,114, 68, 81,107,214,172,169,140,
-138,138,106, 90,179,102, 77,159,243, 99, 81, 81,209, 87,159,125,246, 89, 52,167, 12,196, 78,115,111, 44,167, 83,177, 49,240, 75,
-100,213, 28,135,240,106,117,209,179,103,207, 48, 66,200, 23,149,144,222, 85,148,210, 65,148,210,223,110,100,251, 91,157,206,150,
- 45, 91,182, 79, 72, 72, 56, 24, 31, 31,159,145,144,144,112,176,101,203,150,237,111,118,159,167,142, 34,221, 62, 26,195,167,190,
- 63,154,208,143,198,240,169, 83, 71,145,110, 44,231,222,251,120,242, 34, 46,132, 18, 66,214, 18, 66,214, 78,156, 56,177, 51,128,
- 16,183,239,109, 92,215, 3,160,240,244,238,120,185,252, 30,106, 55, 86,161, 46,223, 43,231,122,234, 82, 72, 61, 54,115,132,134,
-134,154,223,122,235,173,195, 70,163,241,216, 15, 63,252, 80,231,197, 23, 95,108, 81,163, 70,141,211, 3, 7, 14,252, 67,163,209,
-216, 28,125,116,124,228,153,222,189,123,255, 25, 28, 28, 76,178,179,179,229,102,179, 89,184,114,229,138, 92, 20, 69,194,243, 60,
-213,235,245,194,217,179,103,101, 22,139, 69,122,240,193, 7, 87,239,217,179,231,121, 0, 99,203, 19,212,104, 52, 47,125,253,245,
-215,170,178,204,149, 40,138, 40, 42, 42,130,205,102,195,148, 41, 83, 84,111,188,241,198,171, 0,246,150,167, 41,147,201, 94,153,
- 53,107,150,202,209, 4, 36, 73, 18, 14, 29, 58,132,236,171, 87, 97, 42, 44,128,185,176, 0,230,252, 92,112, 69,249, 24,222,171,
-135,106,193,111, 43, 95, 3, 48,188,220,139,170, 82, 55,227,135,133,223, 66, 20, 69,164,175,244,220, 37,226,218,174,173, 16,109,
- 86, 76,251,232, 19, 50,246,153,199,166, 3, 88,126,183,100,124,133, 66,193,125,250,233,167, 13, 20, 10, 5, 8, 33,212,108, 54,
-163,113,227,198,228, 38, 53,249, 57,115,230,180,144,203,229,196,161,217,164, 73, 19,114,183, 21,122,185, 92, 14,181, 90,141,154,
- 53,107, 26,250,246,237,187,103,206,156, 57,213,121,158,215, 8,130,240, 87,126,126,254,244,164,164,164, 10, 53, 35,153, 76, 38,
- 24,141, 70, 24,141, 70, 92,190,124,185,106,157, 58,117,200,255,254,247, 63,177,184,184, 56,230,155,111,190, 57,183,124,249,114,
-205, 23, 95,124, 49, 16,192, 24, 86,229,222, 94,234,212,169,163,240,247,247, 15,168, 30, 34, 20,203,120, 20,103,216,108,225,209,
-209,209,227, 1, 36,212,171, 87, 47,232,236,217,179,185, 81, 81, 81,123, 57,142, 91,150,146,146,146,225,197,248, 16,155,205,134,
- 23, 90,229, 97,244,131, 28,108, 54, 27,242,242,242,112,249,242,101, 36, 37, 37, 97,223,190,164, 27, 74, 99,173, 90,181,158, 81,
-169, 84,221, 21, 10, 69, 77, 81, 20, 57,189, 94,127,201,100, 50,109, 74, 79, 79,255,138,222,192,196,134,183, 42,157, 46,250, 51,
- 7, 12, 24, 16, 25, 16, 16,128,127,254,249, 39,242,200,145, 35, 51, 1, 36,220, 84,221, 33,227,190, 27,241,236, 23, 81,193,129,
-129, 72, 62,177, 38,106,213,186,159,191, 67, 73, 95, 94,198,189,127,131, 83,214, 53, 32,139, 82,234, 28,113, 62,125,250,244, 62,
-246,245,251,184,126,247, 65,191,143, 7, 99,183,214,211,239,149,102,176, 28, 35,197,202, 90, 81,165, 82,137,163, 70,141, 58,189,
-122,245,234,154, 9, 9, 9, 39,203,234, 12,236,133,182, 13, 26, 52,184,180,127,255,126, 26, 26, 26,106,150, 36,137,104, 52, 26,
- 81,173, 86, 75,249,249,249,176, 90,173,244,210,165, 75,194,229,203,151,229, 85,170, 84,145,251, 18,170,147,201,100,173,107,213,
-170, 85,102,164,160,168,168, 8,133,133,133, 48,153, 76, 8, 15, 15, 39, 28,199, 61,224, 53,172,199,113,237, 26, 52,104, 64,114,
-115,115, 17, 25, 25,137,157, 59,119,162, 40, 63, 15,166,194, 66,152,242,243, 96, 41,200,135, 88,144,135,188,171, 25,168, 25, 17,
- 77,236, 83, 13,148,139,141, 87,215, 8,211,105,113,118,234,120,180, 60,116, 9, 68, 38,199,254, 38, 17,160,214,146,174, 86,173,
-142,166,131,200, 21, 56,249,202, 83,168, 58,236, 57, 88, 57,101,212,157,200,220, 54,155,141,152, 76, 38,168, 84, 42, 91,251,246,
-237,119,240, 60,223, 73,161, 80,112,163, 71,143,198,149, 43, 87,156,217, 5, 0, 70,143, 30, 13,181, 90, 13,147,201,100, 3, 48,
-174,172, 62, 83, 54,155,141, 88,173, 86,168,213,106,107, 66, 66,194, 87, 60,207,191,164, 80, 40,248,250,245,235,103,206,152, 49,
- 35, 93,171,213,106, 47, 95,190,124, 77,161, 80,164,214,172, 89,179,149, 90,173,174,225, 77,243,118,162, 84, 42, 33, 8, 2, 56,
-142, 67, 72, 72, 72,113, 78, 78,206,190,243,231,207, 15,189, 17, 45, 81, 20, 97, 54,155, 97,181, 90, 97, 52, 26, 33, 73, 18,142,
- 28, 57, 2,165, 82, 41, 19, 69, 49, 73, 20, 69,141, 76, 38, 3,207,243,108,142,186,219, 76,124,124,124,167,102, 85,253,103,142,
-142, 48, 5,213,238,163, 45,210, 40,249,226, 33, 43,173, 45,187,117, 27,220, 99,220,184,241,186, 42, 85,170, 40, 46, 94,188,104,
-156, 61,123,118,173,223,127,255,157, 0,248,180, 60,189,244,244,244, 95,103,204,152, 17,220,169, 83,167, 24,153, 76, 70,242,242,
-242,144,149,149,133,171, 87,175,226,242,229,203, 52, 57, 57,249,188,205,102,251,165, 34,105,108,214,172,217, 55,195,134, 13, 27,
-209,184,113, 99, 25,165, 20, 86,171, 21,122,189,190,197,190,125,251,250,237,220,185,179, 61,128, 10,231,203,140,140,140, 95, 62,
-250,232, 35,109,199,142, 29, 27,200,100, 50,174, 50,210,233,118, 65,139,212,233,116,216,180,105, 19,252,253,253,225,109,180,174,
- 47, 88,108, 82, 84,112, 96, 8,140,103, 62, 67,164,127, 13, 88,108, 82, 20,203,193,247, 79, 20,171, 12, 47,114, 0,192,195, 55,
-107,134,110,149,153,186,161, 8,150,131, 43, 87,174, 40,139,138,138, 4, 73,146, 56,147,201, 36,147, 36, 9, 50,153,204, 90,193,
-255,107, 60, 96,192,128,189, 45, 91,182,212,219, 35, 24,182,128,128, 0, 91,126,126, 62,236, 6, 75, 18, 4,193,168,211,233,140,
- 49, 49, 49, 0,224,181,137,208, 96, 48, 84, 87,171,213,215,253,174,215,235, 81, 84, 84,228, 52, 88,122,189, 30,254,254,254, 40,
- 46, 46,246, 90,184, 69, 81,172,169,209,104,144,158,158, 14, 0, 40,202,203,133,177,160, 0,150,194,124, 88,242,114, 97,205,207,
-131, 53, 63, 23,156,193,128,192,232,106,176,217,108,213,188,105, 22,155, 68, 5, 15,138,171,107,127, 69,248, 75,227,202, 92,239,
-218,142, 45,208,213,169, 15,131,193, 34,220,129,140,221,154,227,184,248, 70,141, 26,161,127,255,254, 24, 60,120,240, 17,181, 90,
- 29,246,197, 23, 95, 52, 78, 75, 75,187,110,253, 71, 30,121, 4, 99,198,140,193,128, 1, 3,126,252,231,159,127,230,149,167,217,
-177, 99, 71,116,238,220, 57,120,240,224,193,201, 58,157, 46,113,225,194,133,173,166, 76,153,146,169,215,235,211, 18, 19, 19,155,
-166,166,166,106,234,213,171,183, 53, 54, 54,150,251,243,207, 63,107,148,167,121, 7, 76, 39,172, 86, 43, 44, 22, 11, 76, 38,147,
-215,178,226,118,113, 41,245,221,106,181, 58, 71, 16, 26,141, 70, 88,173, 86,178,106,213, 74,172, 89,179,134, 59,113,226,120,244,
-132, 9, 19,145,151,151, 7, 81, 20, 89, 77,123,155, 72, 72, 72,232, 37, 80,233,235, 39,170,218, 84, 79,132,219,138, 4,142, 22,
-157,249,246,157,226, 35,129,130,201, 84, 76,252,222,126,231,157,160,115,231,206, 89, 62,250,232,163,140,254,253,251,171,158,125,
-246,217, 70,127,254,249,103,251,234,213,171,127,123,249,242,229,188, 50,242,189,252,153,103,158,217, 27, 20, 20, 84,123,201,146,
- 37,153,233,233,233,193, 86,171, 85, 99, 54,155, 45,102,179,249,156,197, 98,217,105, 54,155, 55,101,100,100, 36, 86, 36,173, 58,
-157,174,217,227,143, 63, 46,203,205,205,133, 32, 8,176, 88, 44,200,202,202, 66, 92, 92, 28,191,121,243,230,198, 55,178,255,199,
-143, 31,255, 44, 50, 50,114,235,154, 53,107,186,107,181,218,120,133, 66, 81, 85, 20, 69,209,104, 52,102, 26,141,198,195, 55,146,
- 78,183, 99,145,126,232,208,161, 72, 63, 63, 63,164,165,165,129, 16,146,126,179,231, 76, 46,227, 82,146, 79,174,174, 22,233, 95,
- 11,167, 78,237,133, 92,198,165,176,156,124,223, 71,176, 90,186, 70,172,202, 49, 73,134, 9, 19, 38,188, 69, 8, 89, 59, 97,194,
-132,183,202,137, 96,137,174,235,185,172, 95,105, 55,245,229, 94,196, 11, 11, 11,133, 3, 7, 14,132, 92,190,124, 89, 87,181,106,
- 85,125,108,108,108, 30, 33,132,138,162,200, 93,187,118, 77,155,154,154,170, 10, 10, 10, 50, 85,171, 86, 45,223,199,255, 59,243,
-242,203, 47,119,156, 52,105, 82,226, 67, 15, 61,148, 13, 0,185,185,185,200,202,202,114,140,210, 66,122,122, 58,119,240,224,193,
-224,191,254,250,171, 5,124, 24,193,163, 86,171, 47, 23, 22, 22,214, 15, 12, 12,116, 94,208, 28,166,202,245,221, 98,177,160,176,
-176, 16, 90,173,214,107,225,230, 56, 46, 45, 45, 45,173,142,193,160,199,165,179,103, 97, 42,204,135,165, 32, 31,214,130, 60, 88,
-243,242, 32,230, 93, 3, 87, 84, 8,157, 90,141,194,107, 57,224,121,254,138, 55, 77,173,146, 55, 91,109,162, 34,180,103, 63,128,
-148,125,125, 14,124,160, 29,104,195,102, 80,171,127,179,222,206, 76,237,152,179,202, 49, 39,149, 90,173,198,135, 31,126,136,196,
-196, 68,169,188,102, 96,133, 66, 1,142,227, 68, 95, 52,149, 74,165,122,210,164, 73,234,195,135, 15,171, 20, 10, 5,116, 58,157,
-230,240,225,195, 77,119,239,222,205,233,245,122,190, 78,157, 58, 3,162,162,162,138,202,211,188,213, 70,202,211,111, 69, 69, 69,
-206,126, 83,215,174, 93, 19, 84, 42, 85,189, 14, 29, 58,236, 49,155,205,191,216,108,182,239, 19, 19, 19, 11,202,188,211,182, 92,
- 63, 24, 84,146, 36,216,108, 54,216,108, 54, 8,130, 32,173, 90,181, 26,159,207,155,131, 21,203,127,163, 29, 59,118, 36,127,254,
-249, 39, 36, 73, 74,101, 85,237,237, 65,146,164,153, 91,198, 63,170,130, 40, 22,153,182, 46, 45, 94,159, 35, 20,127,123,108,203,
-193, 28,171, 73, 89,183,110, 76, 67,127,191, 0,238,135,197,223, 94,203,200, 60,127,230,243,207, 83,171, 77,155, 54, 45, 48, 38,
- 38, 38,224,244,233,211, 81, 0,242,202, 48, 66, 53,159,122,234,169,145,215,174, 93,147, 45, 92,184,112, 81, 90, 90,218,118, 74,
-233,121,183,242, 17, 71, 8,249, 4,128, 12, 64, 56, 0, 27,128,141,148,210, 31,203, 41,167, 18, 33, 4, 91,183,110,189,110,180,
-159, 36, 73, 55, 60,218, 47, 35, 35, 35,247,129, 7, 30,104,118,230,204,153, 85,185,185,185, 75,220,151,107, 52,154,126,177,177,
-177, 67,246,239,223,255, 46,165,244, 92, 5, 47,152, 99, 79,156, 56,241,177, 36, 73, 53, 56,142,187, 68, 41,125,243,102,207,153,
-217, 34, 61,187,122,221,242,133,102,171, 88, 93, 33,227, 47,155, 45,210,115, 44, 39,223,247, 56,250, 72,193,213, 56,121, 48, 70,
-187,167, 79,159,174,158, 49, 99, 6,166, 79,159,158,228, 41,130,229, 48, 90,211,167, 79, 79,114,172,231,178,254,246, 74, 53, 88,
-158, 28,163,205,102,211, 77,156, 56,177,109,139, 22, 45,210, 59,117,234,148, 81,171, 86, 45,189, 75, 97, 51, 7, 6, 6,154, 77,
- 38,147, 50, 61, 61, 61,244,228,201,147,181, 36, 73, 82,251,240,127,127, 7, 6, 6, 6, 31, 60,120, 48,100,217,178,101,117, 15,
- 29, 58, 84, 99,216,176, 97, 29, 77, 38, 19,204,102, 51, 46, 92,184, 80,227,235,175,191,150,228,114,121, 30, 33,228, 0, 0,175,
- 23, 89,171,213,186,231,204,153, 51,245, 30,120,224, 1, 98,181, 90, 75,153, 42,215,207, 10,133, 2,105,105,105, 84,146,164,125,
- 62,164,115,239,193,253,251,235, 52,105,212, 8,166,252, 92,152, 11,242, 96,201,207,131, 45, 63, 15, 82, 65, 30,184,162, 66,132,
- 4,203,160, 86,107,113, 38, 61, 3,246,180,150,139,204,102, 72, 78,203, 47,168, 95,103,242,167,216, 18,227, 15,106,181, 56,155,
- 5, 1, 56,155, 11,219,156,204,194,142,221,123, 32,136,166,180, 59,153,147,205,102,179, 52,112,224,192,253, 28,199, 53,169, 44,
- 77,171,213, 42,189,248,226,139, 78,205,148,148,148,107, 41, 41, 41, 42,131,193,192,233,116,186,162, 59, 93,122,173, 86,171, 71,
-131,100, 54,155, 97, 48, 24,144,145,145,161,216,184,113, 99,251, 61,123,246,200,143, 31, 63,142, 61,123,246, 52, 95,181,106,213,
-196,134, 13, 27, 54, 59,121,242,228, 21, 95, 76,155, 36, 73,112, 92, 7, 41,165,160,148,242, 0,176,250,247,181,232,217,179, 39,
- 41, 44, 44,196,154, 53,107, 42,165, 25,133,225, 51,197,176,137,106,243,182,165,197,175,159, 85, 20, 36,233,133, 15, 18, 19, 19,
-215,247,238,221,123, 71,100,120,140, 63, 0, 40,229,186, 80,158,250,233, 66, 67, 67,149, 0, 16, 25, 25, 25,111,181, 90,231, 1,
-104,231, 73,240,145, 71, 30,105, 19, 22, 22,214, 98,221,186,117,135,211,210,210,118,184,155, 43, 0,168, 95,191,254,148, 99,199,
-142,245,146,201,100,196,165,242,167, 0, 60, 26,172, 71, 31,125,180,126,116,116,116,200,159,103, 2, 80, 32,175, 3,137,203, 3,
-229,149, 16, 3,155,225,146,188, 49,194,195, 79,134,212,169, 83,167,249,185,115,231, 14, 87,240,230,170,250, 99,143, 61,246,199,
- 55,223,124,211,176,103,207,158, 10, 0,215, 25,172,134, 13, 27, 14,220,188,121,243,160,209,163, 71, 55, 35,132,244,165,148,158,
-245, 85, 63, 49, 49,113, 23,128,214,149,121,194, 38, 45,160,155, 0,212, 96, 89,247, 63, 19,189, 2, 92,250, 96, 1,200, 66,201,
-179,148, 93,191, 59,242,189,217,101,221, 44,151,168,149,217, 45,234,229,105, 89, 22,128, 74, 11,110, 8,229,220,121,111,188,112,
-225, 66,203,199, 30,123, 44,203,213, 92,185, 30, 0,157, 78,103,242,247,247, 47,218,191,127,127,164, 40,138, 91,125,248,191,133,
-155, 55,111,222, 50,119,238,220,165,193,193,193,214,225,195,135,115,227,199,143,223,145,147,147, 67,115,114,114,240,197, 23, 95,
-116,104,223,190,253,142, 75,151, 46,137,137,137,137, 79, 3,232,233, 77, 80,175,215,127,249,210, 75, 47, 13,217,177, 99,135,202,
-108, 54, 35, 47, 47,239,186,232,149,213,106, 5,207,243,152, 55,111,158,169,184,184,120,142, 15,145,140,175,190,252,242,203, 65,
- 95,127, 62, 87, 37, 88, 45,208,231,229, 66,180,191,120, 99, 49,116, 42, 14,117, 90,132, 34, 47, 93,137,197,235,118, 25,108, 54,
-219,151, 94, 13,150,177,104,220,232, 23,158, 95,187,241,239, 45, 8,105,215, 5,217, 91,254,186, 62, 26, 20, 26, 14,179,197,130,
- 15,166, 78,166,196,144, 55,254, 54,103,108,155,125,116,133, 35, 3,174,253,231,159,127,246,180,104,209,162,151,217,108, 46,207,
-136, 65,146, 36,254, 70, 52,149, 74,101,106,253,250,245,255,174, 93,187,246, 0, 0,104,212,168,209,239, 28,199,117, 41, 79,243,
- 86, 27,172, 73,147, 38, 97,198,140, 25,152, 48, 97,130,211, 32, 57,110, 0, 76, 38, 83,173,191,254,250, 75,177,107,215, 46,186,
-120,241,226,236, 71, 31,125, 52,112,216,176, 97,129, 75,150, 44,249, 31,128,241,101,105,190,249,230,155, 88,176, 96, 1, 70,141,
- 26,117,221,114,158,231,165,180,180, 84,152,204, 38,186,122,245,234,116, 65, 16,130,102,207,158,173,126,227,141, 55, 8,171,110,
-111, 15,162, 40,190,221,238,179, 85,175, 2,106,171,205,102,155,115,228,200,193,173, 0, 48,120,240,224,176,207, 62,251, 76, 1,
- 0,159,126,242,169,140, 82, 42,115, 76, 12,251,254,251,239,171, 94,120,225,133,176,178, 52,127,253,245,215,220,247,223,127, 63,
-228,217,103,159,237,185,101,203, 22, 21, 33,228, 47,148,244, 33,201,182,223, 56, 86, 1,176, 43, 52, 52, 52, 98,249,242,229,117,
-186,119,239,174,245,234, 2,139,139,191,157, 63,127,126,205,153,219,253,240,103,241, 0,164,208,193,160,193, 20,193,242, 66, 52,
-210, 93, 70,199,136,148,200, 37, 75,150, 44, 4, 16, 95, 1,115,213,248,209, 71, 31, 93,249,205, 55,223,212,122,254,249,231, 83,
-119,237,218,149, 66, 8,153,226, 97,213,156,167,158,122,234,210,162, 69,139,234, 72,146,180,158, 16,210,147, 82,122,134,229, 30,
-198,109,228,192, 45, 90,247,150, 33,148, 99, 50,158, 33,132,196, 78,152, 48,225,227,200,200,200,234,147, 39, 79,190,216,168, 81,
-163, 98,103,105,203,201,209,109,219,182, 45,166,160,160,160,208,102,179,141,160,148, 30,241, 80,120,155,184,205,137,116,137, 16,
-242,113,243,230,205,135,252,252,243,207,219,252,252,252, 10,246,238,221,235,239,239,239,159,127,252,248,113, 45,207,243,250,243,
-231,207, 99,211,166, 77, 29, 0,124,238,233, 46,201, 93, 51, 61, 61,253,159, 90,181,106,125,250,198, 27,111,188,241,238,187,239,
-170, 36, 73,130,193, 96, 64, 97, 97, 33,140, 70,163,179,115,242,178,101,203, 76, 38,147,233,235,180,180,180,189, 62,104,238,169,
- 86,173,218,130, 57,179,231,188,248,220,144,199, 20, 52, 47, 7,249, 25, 6, 16, 99, 49,116, 42, 5, 26,119,137, 66,113, 14,193,
- 55,219, 14,154,175,153, 45,203,211,210,210,182,122,211,220,121,185,240,143, 7,235,134,109,122,127,234,228,110, 19,191,255, 13,
-146, 36,225,228, 75,195,145,187,125, 19, 52,141,154,162,205,201, 44,152,205,102, 76,120,243, 13,240,250,204, 29,123, 47, 23,173,
-240,166, 89, 25,184,106,218,231,161, 58,224, 98,142, 94, 36,132,140,104,216,176, 33, 70,143, 30,141, 71, 30,121,164,212,182, 43,
- 87,174,196,252,249,243, 97, 50,153, 70, 16, 66, 14, 81, 74,231, 85, 68,179, 86,173, 90,173, 26, 55,110,204, 71, 70, 70,234,237,
-102,163, 75, 82, 82, 82,203,134, 13, 27,150,171,121,139,246, 61,247,236,217,179,254,159,124,242, 9,177, 88, 44,152, 50,101, 10,
- 28,198,210, 17,113,122,251,237,183, 35,253,252,252, 48,115,230, 76,115,118,118,118,215,156,156,156,205,115,231,206,173,178,108,
-217,178,161, 14,131,229,166,121,245,196,137, 19,126, 11, 22, 44,224,108, 54, 27, 62,251,236,179,235, 34, 90, 99,199,142,133,197,
- 98,133, 76,144,153, 77, 70, 83, 99,181, 90,125, 46, 40, 40, 72, 45, 73, 18,189, 93,231,253,191,174,121,228,200,145,141, 0, 54,
-150,115,243, 1, 0, 48, 24, 12,200,206,206, 70,118,118, 54, 2, 2, 2, 0,151, 9,102,221, 53, 13, 6,195,225, 55,223,124, 51,
-241,171,175,190,234,185,123,247,238,199,182,111,223,222,123,211,166, 77,198, 75,151, 46,217,172, 86, 43,141,136,136, 16,218,181,
-107,167,234,221,187,183, 86,169, 84,114,111,191,253,118,246,135, 31,126, 88, 5, 64, 78, 57,245, 39, 47, 73, 18, 94,107, 95,128,
- 55, 59, 11, 48,153, 74,110, 40,211,211,211,144,148,148,132, 61,123, 78,129, 16,194, 85,240,120,206, 89,178,100, 73,140, 66,161,
- 32, 75,151, 46,173,190,116,233,210, 87,188, 29,191, 31,127,252,177,230,210,165, 75,231, 17, 66,186, 81, 74, 37,150,151,152, 38,
-163,130, 6,203, 94,160,147, 0,244, 36,132,180,123,254,249,231, 63,106,216,176,161,201,102,179,201,214,175, 95,223, 32, 59, 59,
- 91, 97,179,217,222,164,148, 86,168,189,146, 82,186,128, 16,130,254,253,251,191, 89,187,118,237,205,135, 14, 29,106,246,240,195,
- 15,175, 95,185,114,101, 59,155,205,118,254,216,177, 99, 35, 0,204, 1,240,185,175,154,201,201,201, 83, 54,109,218, 68,246,238,
-221,251,250,132, 9, 19,148,161,161,161, 36, 48, 48, 16, 6,131, 1, 41, 41, 41,116,209,162, 69, 38,147,201,244,121, 64, 64,192,
- 59,190,106,134,134,134,142,223,126,240,160,226,244,185,179, 79, 63,221,235, 33, 85,245,122,245,161, 35, 64,209,181, 28,108,219,
-150,129,239,247, 29, 54,102,155, 45, 63,241, 60,239,243, 80,250,232,115, 89, 61, 55, 46,255,102,221,214,191,255,238, 54,109,198,
-199, 36,242,137,231,160,173, 81, 11, 82,205,186,216,182,117, 43, 62,124,127, 10,229,139, 50,183, 91,207,101, 62,116, 7, 67,180,
- 54,123,225, 81, 2,248, 68,146, 36, 1, 40,233,147, 53,102,204, 24,184, 62, 58,103,254,252,249, 48, 24, 12, 0, 32, 16, 66, 62,
- 33,132,124, 87,214,140,238,101,104, 86,251,227,143, 63,170,185,106, 54,108,216,208, 39,205,202, 38, 51, 51,243,157,103,158,121,
-102,134, 76, 38, 11,144, 36, 9,158, 70,187,107,181, 90, 20, 20, 20, 64, 20, 69, 91,112,112,240, 41,171,213, 10, 65, 16,202, 44,
- 71,197,197,197,239,140, 26, 53,234, 3, 66, 72,153,145, 14,181, 90,125,105,231,206,157,117,135, 13, 27,198, 45, 95,190,252,194,
-208,161, 67,149,187,119,239, 22, 1,252,198,170,167,187, 19, 74, 41,138,139,139, 1,128,150,179,206,101, 66,200,155,137,137,137,
-170, 81,163, 70,197, 63,241,196, 19,254,157, 59,119,214,185,174, 99, 48, 24,164, 53,107,214, 20, 47, 88,176, 32,103,251,246,237,
- 7, 70,142, 28, 57, 0, 37,205, 27, 30, 73, 79, 79,255,227,139, 47,190, 8,232,216,177, 99, 61, 81, 20,145,157,157,237,236,131,
-149,154,154,138, 75,151, 46, 93,146, 36,105,117, 5,119,231,165, 97,195,134,253,185,104,209,162, 26,207, 63,255,124,234,178,101,
-203, 86, 3,200,247,176,158,110,224,192,129,253, 22, 45, 90, 84,227,133, 23, 94,184, 12,224, 21, 54,195, 59,131,113, 19, 6,203,
-165,178,216, 9,160, 53, 33,164, 63,207,243,227,138,138,138, 62,163,148,174,186,137, 10,106, 1, 33,100,253,217,179,103,159, 5,
-144, 48,103,206,156,137, 0, 82,236, 97,189,238,158,250, 43,120,209, 19, 1,188, 27, 21, 21,245,235,228,201,147, 43,229, 89,132,
-246, 71,234,188, 20, 25, 25,185,236,163,101,191,190, 67, 41,141,227,168, 20, 34, 17, 46,151,227,184,127, 68, 81,252, 48, 53, 53,
-117, 91, 69, 52,127, 41, 73,103,247, 7,171,251,245,121,243,133, 97, 31,219,100,234,154, 69, 70,155, 66,171, 20,204,114,209,116,
-137, 51,228,190,189,247, 82,209, 93,121, 97, 53,153, 76,182, 1, 3, 6,124,203,113,156, 4, 0,162, 40, 10, 38,147,233,105, 95,
-243,208,237,210,188, 81,178,179,179,139, 0,188, 84,222, 58,237,219,183,255,113,221,186,117,195,186,119,239, 46,174, 93,187, 54,
-179, 79,159, 62, 66, 98, 98, 34, 5,176,169, 12,227,111, 66, 25, 79, 36,112,208,188,121,243, 26,223,125,247,221,161,103,159,125,
-214,127,222,188,121,193,251,247,239, 23,191,249,230,155,130,162,162,162,153,172,122,186, 59, 32,246, 65, 41, 50,153, 12, 26,141,
- 6,254,254,254,200,202,202,242, 58,210,147, 82,122,142, 16,242,240,184,113,227,218,143, 27, 55,238,225,232,232,232,198,213,171,
- 87,175,206,113, 28,151,145,145,145,149,146,146,146,108,177, 88, 54, 3,248, 3,128,188,118,237,218,255, 0, 88, 92,150,222,241,
-227,199, 63,136,140,140,220,242,251,239,191, 63,172, 84, 42, 27, 41, 20,138, 96,171,213,202, 21, 23, 23, 95,179, 88, 44, 39, 76,
- 38,211,218,244,244,244,221, 21,172, 59, 79, 19, 66, 58, 11,130,240,199, 55,223,124,211, 48, 35, 35,163,230,182,109,219,250,186,
-175, 23, 31, 31,191,104,209,162, 69, 53, 70,143, 30,125,110,233,210,165, 21,234,131,197, 96, 48,131,229, 91, 97, 92, 5, 96, 85,
-101,252, 49,165,244, 18,128,119,236,175, 74, 33, 45, 45,237, 40,128, 97,149,121,128,210,211,211,119, 1,232, 1,148,204,230,156,
- 82,114,209,188, 41,246, 94, 46, 92, 11, 96,237, 93,126,151,110, 34,132,140,179,143,114, 2,128,113,238,211, 38, 16, 66,142,184,
- 46,247, 22,105,186, 21,154,183,147,220,220,220,255,125,255,253,247,251, 95,126,249,101,229,224,193,131,113,226,196, 9,204,155,
- 55,207,148,155,155,187,236, 70, 53, 15, 31, 62,124,169,121,243,230,113, 11, 23, 46,124,253,235,175,191,238, 79, 8, 97,207, 34,
-188, 75, 48,155,205,231, 31,127,252,113,199,243, 83,169,227,209, 73,142,105, 59,108, 54,219,121, 31,202,145, 13,192, 22,251,203,
- 27,159,248, 80, 31,237, 1,176,167,146,203,250,101, 66,200,195,201,201,201,211, 78,159, 62,253,151,167,117,146,146,146, 86,118,
-239,222, 93,179,103,207,158,183, 42, 58,138,144,193,248,207,222,156,221,192,196,191, 21,185,243, 99,237,211,247,184,166,183, 7,
- 47,123, 90,126, 39, 52,217,121,103,154, 76,147,105, 50,205,123, 91,243,126, 67, 96,135,128,225,229,238,214,116, 51,203,111,151,
- 38,131,193, 96, 48, 24,119, 19, 4, 64,147, 50, 46,114, 62, 59, 83, 66, 72,133,231, 74,242,166,207, 52,153, 38,211,100,154, 76,
-147,105, 50,205,251, 79,211,131,246,163,110,139,210,220,244,190,190, 39, 13, 22,107, 34,100,154, 76,147,105, 50, 77,166,201, 52,
-153,230,157,214, 44,227,127,158,191, 87, 13, 22,123,160, 44,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,119,
- 55, 62,117,114, 87, 40, 20,177,148,210,145,132,144,170,132,144, 43,148,210,239,204,102,115,210,127,237, 96, 41, 20,138, 88, 66,
-200, 72, 74,105, 85, 74,233, 21, 66,200,157, 61, 14,132,144, 41,147, 75,102,147,126,111, 50, 40,110,101,123, 47,131,193, 96, 48,
- 24,140,155, 55, 88, 53,171, 85,123,140,227,201, 92,139, 85, 12, 10, 12, 12,228,190,248,226, 11,174,111,223,190, 88,179,102, 13,
- 94, 25, 51,230,149,168,168, 72, 73, 46, 8,185, 84,178,189,146,156,146,254,179, 47,127, 54,112,224,192, 76,171,213, 90,230,172,
-214, 60,207, 95, 93,185,114,101,248,205,238, 84, 84,252, 99,153, 86,139,165,204,255, 17, 4,217,213,244,127,126,241,233,127,170,
- 85,139,124,140, 39,220, 92,171, 40, 5, 5, 5, 5,113,159,127,254,185,243, 56,188,252,242,203,175, 68, 71, 69, 73,114, 25,159,
- 43,137,244,149,228,148,148,159,111,219,153,115, 49, 87, 0, 48,101, 50,200,123,132,128,153, 44, 6,131,193, 96, 48,238, 98,131,
- 69, 56,204, 91,250,213, 39, 65, 57,215,114,177,108,229,122, 52,108,216, 16,199,143, 31, 71,195,134, 13,209,174, 85, 51,174, 71,
-235,230, 28,207, 33,116,210,231,139,231, 1,240,201, 88, 88,173,214,176,223,127,255, 29,132, 16,231,132,125,142, 73,251, 10, 11,
- 11,241,234,171,175,134, 85,198, 78, 89, 45,150,176,243, 7,126,131,140, 39,176,138, 20, 86, 27,133,213, 38,193, 34, 82, 20,232,
-109,232,242,240, 48,159,255,135, 3, 55,239,187,185,159, 4,229,229,231,227,183, 63, 55,150, 58, 14, 93,218,182,228, 6,247,238,
-196,105,212,242,208,231,199,127,228,243,113,168, 12, 92,205, 85, 41,147, 85,206,227, 59, 24, 12, 6,131,193, 96,220, 97,131,101,
-182,138, 65,225,193, 1,248,254,187,239,240,230,132,247,209,160, 65, 3, 80, 74, 65, 8,193, 91,239, 78,197,172,247, 39,224,241,
- 94, 29, 96,181, 73, 65,101,105,120, 26, 97, 64, 8,193,197,139, 23, 97, 48, 24, 74,189, 98, 99, 99,125, 74,176,175,163, 22,100,
- 60,193, 31,135, 10, 97,177, 74,176,216,236, 47,171,132,206, 77,252, 42,164,105, 21,165,160, 64,127, 29, 22,126, 53, 31,111, 78,
-253,164,212,113, 24,255,214,187,248,114,198, 59, 24, 59,250, 73,152,173, 98,208,141,164,179, 34, 48, 77,166,201, 52,153, 38,211,
-100,154,247,171,230,125,105,176, 8, 33, 29, 1,108,181, 31, 52,103,100,196,106, 54,162,113,181, 16,204,159,249, 1, 40, 56, 72,
-148, 2, 20,160,146, 21,181,170,104, 96,208,235, 43,252,135,146, 36,193, 98,177,192,106,181,226,235,175,191, 70, 81, 81, 17, 36,
- 73, 66,195,134, 13, 1, 0,241,241,241,174, 17,152,203,137,137,137, 53,188,105,134, 53,125,228, 18, 40,170,187,254,246,222, 39,
-223, 98,215,161,243,160, 20, 80,170, 53, 24,244,196, 11, 16, 37, 10,139,181,226,207, 39, 53,234,245,136,208,201, 48,235,195,119,
-193,201,228,224, 64,192,113, 4, 28,145,208, 32, 58, 8,166,146,135, 19,223, 86,222,155, 12,234, 30,197,122,111, 50, 40,222, 99,
-153,154,193, 96, 48, 24,247, 30,101,121,145,123,218, 96, 1,216,234,105,103,204, 70, 3,162,131,228,168,170, 11,128,205, 38, 34,
-201, 18,129, 66,189, 17, 22,139, 21,151, 44, 22,156,251, 39, 3,109,218,180,193, 35,143, 60, 34, 90, 44, 22,200,229,242,252,149,
- 43, 87, 6,123, 51, 88, 86,171, 21, 22,139, 5,197,197,197, 88,178,100, 9, 4, 65,128, 36, 73, 14, 87,236,124,111,219,182,109,
-117,223,172, 52,170,159,219,255, 43,252, 84, 60,108, 18,133,205, 70, 97, 21, 1, 81,162,208,155, 37, 12,124,230, 29,216, 36, 9,
- 54, 73,130,217, 7,131, 85,202,176, 5,183, 68,255,137,203, 0,232,156,203,253,149, 20,111,182,229, 32, 87, 40,161,144,243, 48,
- 25,244,183,255,204, 81, 74,223, 35, 4,172,147, 59,131,193, 96, 48,238, 19,182,222, 15,198,202,221, 96, 57,221, 35,165,116,219,
-191, 6, 75, 15,155, 85,132,213, 38,194,102,181, 33,191,200,128,143, 63,254, 24, 74,165, 18,132, 16,167, 89,146, 36,137,179, 90,
-173,232,221,187,119,144,183, 63, 20, 69, 17, 22,139, 5, 22,139, 5,148, 82,240, 60,143, 7, 30,120,224,186,245,246,238,221, 91,
-161, 29,241, 83,241,168,213,109,226,117,191,239,251,245, 3, 80, 74, 33,138, 37, 47, 95, 12,150, 55,195,214,162,227, 96,152,204,
- 86, 80, 10,128,150, 68,184,238, 8,148, 82,103,159, 43, 22,185, 98, 48, 24, 12,198,125,128,187, 23,185, 47, 12, 22, 74, 66,115,
- 78,247,104, 50, 24, 96,181,218, 96,179,137,176, 90, 75,140,145, 90,173, 70,135, 14, 29, 28,215,119,231,251,250,245,235, 97,177,
- 88,188,254,161,163, 83,187,221,152,129, 82,138,101,203,150, 65, 38,147, 57, 95,114,185,188,194, 59, 98, 19, 41, 38,142,127, 13,
-114,129,131, 76,224,156,239, 34,165,160,180,196, 28,137, 18,133,201,234, 91,144,167, 60,195, 6, 0,102,147, 5,160, 20, 20, 20,
-134,226, 98, 86, 34, 24, 12, 6,131,193,168, 28, 74,121,145,123,221, 96,117, 34,132, 92,231, 60,204,134, 98,123,244, 74,132,213,
-102,115, 26,168,153, 51,103, 66, 16, 4, 40, 20, 10, 8,130,224, 52, 68,190, 24, 44,163,209,136,152,152, 24,152,205,102, 52,108,
-216, 16,148, 82, 12, 25, 50,228,186,245,246,239,223, 95,161, 29,177,138, 20,211, 63,250,236,186,223,119,254,242, 62,154, 54,170,
-133, 86,117,181, 48, 90, 36, 20,232,109, 55,109,216, 0,148, 68,176, 0, 80, 10, 24,138,245,172, 56, 48, 24, 12, 6,131,113,115,
-120,244, 34,247,180,193,178,135,226,174,115,139, 70,189, 30, 54,171,205,105,178,204,102, 51, 36, 73,194,152, 49, 99,174, 19,218,
-188,121, 51,204,102,115,249,127, 38, 8, 87,159,123,238,185, 82, 83, 36, 80, 74,241,235,175,191, 66,169, 84,150,138, 98, 17, 82,
- 49,243,106, 21, 41, 38,191,253, 6, 20, 50,190,148, 33,146, 36, 96,205, 31, 27,176,230,143, 13,206,117,121, 94,118,245,102, 12,
- 27, 0,152,205,246, 8, 22,165, 40, 46, 42,100,197,130,193, 96, 48, 24,140,155,160, 44, 47,114, 79, 27,172,178, 48, 26,138, 97,
-117,233,131,101,177, 88, 96,179,217,240,245,215, 95,151,106,206,147,201,100,224, 56,206,107, 4,235,247,223,127, 47, 53,185,103,
-124,124, 60,165,148, 98,208,160, 65,206,230,198,167,159,126, 26,207, 63,255,124,133, 13,150, 77,164,152, 50,109,166, 83,167,119,
-183,246,232,223,171, 35, 36,187, 23,190,122,108,101,133, 4,203, 51,108, 0, 96, 54,149,244,193,162, 0,244,133,172,137,144,193,
- 96, 48, 24, 12,134, 15, 6, 75, 38,112,249,231, 46, 93, 9,168,162, 85,193, 38,153, 96,147, 74, 70,254,137,162,136,231,159,127,
-222,185,222,208,161, 67, 49, 98,196, 8,143, 6,203,151,167,109, 75,146,132,157, 59,119,130, 16, 2,142,227,156,175,178, 40, 75,
-179,216, 36, 97,215,207, 83, 33, 81, 10,137, 2,146,125, 32,130,217,230, 61,218,232, 73,211,155, 97, 83,234, 2,193,115, 20,132,
- 0,231, 82, 51, 33,240, 92,126, 69,247,189,162, 48, 77,166,201, 52,153, 38,211,100,154,247,171,230,127,198, 96, 81,145,190,178,
- 96,237,222,185, 86, 81, 10,112,252,214,184,113, 99, 88, 44, 22,252,245,215, 95, 78,227,193,243,188,179, 73,207,151, 62, 88,110,
- 92,238,208,161, 67,121, 83, 49, 92,246,237, 76,227,114, 66,231,199,170,151,183,188,162, 9,243,102,216,190,217,254,239, 35, 8,
- 5,142,203, 7,165,175,176,236,196, 96, 48, 24, 12, 6,163, 92,131,117, 57, 45,109, 49,128,197,174,191, 61,252,240,195, 69,253,
-250,245, 83,219,108, 54,152,205,102, 88, 44, 22,152,205,102,231, 75,169, 84, 86,104,198, 77, 95, 38, 17,245,133,171, 71, 87,214,
-168,212,163,226,131, 97, 75, 79, 79,175,193,178, 15,131,193, 96, 48, 24,140, 10, 25, 44, 79,232,245,250, 64, 66,136,144,158,158,
-126,221,178, 43, 87,174, 0,128,237,126, 56, 40,149,110,216, 24, 12, 6,131,193, 96, 48,131, 85, 22, 91,183,110,181,221, 47, 38,
-138,193, 96, 48, 24, 12, 6,227, 86,193,177, 67,192, 96, 48, 24, 12, 6,131, 81,185, 16, 0, 77, 60, 45,168,200,232, 0, 66, 72,
-147,138,254,177, 55,125,166,201, 52,153, 38,211,100,154, 76,147,105,222,127,154,222,180, 93,183, 39,132, 60, 79, 41,253,250,158,
- 52, 88,183,242,249,192,108, 8, 43,211,100,154, 76,147,105, 50, 77,166,201, 52,111,226,127,238, 89,131,197,154, 8, 43,114,162,
-227, 95,144,177,163,192, 96, 48, 24, 12, 6,195, 27,194,237,250,163, 41, 83,166,220,148,153,123,239,189,247,164, 59,102,172,162,
- 31,173,195, 11,248, 56,174, 69,211, 94, 92,141,129,127, 82,145,140,167,169,191,158, 99,217,231,198,104,161, 35, 85,172, 68,214,
- 39, 72,167,234, 95,221, 79,120,240,108,182,126,183,222, 34,173,161,196,186,234,120, 1,205,101, 71,136,193, 96,120, 34, 58, 58,
- 58,104,215,174, 93,213,219,182,109,123, 57, 53, 53, 53,215,215,101,101, 81,181,118,194, 8, 63,157,230, 37,163,201, 84, 43,192,
-223,255,234,181,156,156, 5,233,231, 15,125,225, 88, 30, 19, 19,227,191,116,233,210,200,161, 67,135,166, 95,184,112,161,128,157,
- 1,198,109, 53, 88, 45, 91,182,172, 37, 73,210,147, 0,158,160,148, 30, 62,116,232,208,163, 55,162,179,121,243,230, 40,171,213,
-218,210,102,179,197, 1,136, 83,107,116,205, 77, 38,227, 85, 2,250, 84,175, 94,189,254,169,168, 94,124,124,252, 31, 0,122,123,
- 52, 76,132, 76, 57,120,240,224,100, 95,181,120, 1, 31,111, 88,245, 77,255, 12,189, 26,219, 18, 47, 61,242,221,167, 19, 0, 96,
-192,221,120, 66, 35, 35, 35,213, 0,158,226, 56,174,171, 82,169,172,103, 52, 26,147, 1, 28, 37,132,204, 75, 77, 77, 77,191, 33,
-131, 73, 8, 23,171,147, 61,163, 81,107,122, 70,248, 41,226,210,114, 11,210,140, 22,105,135, 68, 44,159, 84,212, 16,213, 33, 68,
- 81,187,122,224,182,215, 7,182,107,216,172,113, 93, 72,151, 14,195,152,151,213, 47, 49, 77,223,239,171,125, 87, 95,171, 67, 72,
-220, 57, 74,205,190,104, 85,171, 86, 45, 66, 20, 69, 33, 61, 61, 61,197, 81, 25,154, 76,166, 4, 0, 13, 1,156, 84, 42,149, 7,
-111,182, 82,188, 87, 52,163,163,163, 35, 37, 73,122, 54, 60, 60,252,225,204,204,204, 63, 56,142,251,230, 70,207, 55,227,191, 67,
-205, 7, 71,124, 70, 56, 82,165, 34,219, 80,137,102, 39,239,253,241,181,219,125,159, 11, 0,148,210,167,171, 87,175, 94,151, 82,
-122, 26,192,236, 82,233,242,188,172,204, 62, 48, 53, 99,219,172, 28, 51,234,169, 46,175,142,126, 90,167,209,168,161, 55, 24, 67,
-230, 45,252,225,211,154,141,219,246, 78, 62,190,171, 23, 0,152, 76,166, 1,213,170, 85,171,105, 54,155, 47, 2,248,193,155, 38,
-131,113,211, 6,171,113,227,198, 90,133, 66, 49,136,227,184,167,154,197,183,110,215,111,240, 83,196, 74, 52,248,240,141,161, 21,
-158,194,225,208,161, 67,202,140,140,140,247,107, 53,136,255, 95,167,238,253,185, 70, 13, 27,160, 74, 72, 16, 36, 78,129, 69,127,
-157, 9,217,250,213,211, 95, 0,104,125, 3,201,236,253,243,159,251,144,145, 39,130, 16,128, 16,128, 35, 64,145, 81,194, 91, 35,
-219,189, 7,192, 39,131, 69,226, 95,144,197, 54,110,216,235,204, 53, 21,254, 58,102, 5, 16, 9, 77, 80,120, 47, 18,255,130,140,
- 38,126,101,189,155, 78,102, 68, 68, 68, 92, 72, 72,200,151, 79, 63,253,116, 80,189,122,245, 34, 20, 10,133,198,104, 52,214,189,
-116,233, 82,173, 89,179,102, 61, 20, 17, 17, 49, 35, 35, 35,227,183,138,104, 54, 12, 84, 85,239,213,160,198,207,227, 71, 63,217,
-170, 94, 76, 53, 8,230, 98, 80, 83, 81,181, 75, 23,207,183,158,246,205,111,207,197, 6,200,134, 36,229, 91, 55,249,170,167,242,
-147,191,253,214,243, 67, 26,214,241,163, 48, 31,223, 9,129,167, 80,249, 5,161, 85,117, 30, 4,180,209,228,191,211,223, 2,240,
-158, 15, 70,114, 42,128,183, 0,144,136,136,136,159,101, 50,217,254, 7, 31,124,176,193,227,143, 63, 78,154, 54,109,138,127,254,
-249,167,209,154, 53,107, 30,173, 94,189,250, 41,179,217,188, 47, 36, 36,228,240,241,227,199, 45, 62,230,111,121, 78, 78, 78,115,
-133, 66,241,192,221,172, 25, 25, 25,169, 54,155,205, 79, 70, 71, 71, 63,223,175, 95,191,166,125,251,246, 37,245,235,215,199,169,
- 83,167,226,215,173, 91,247, 94,243,230,205,143,166,166,166,126,173, 80, 40,126, 72, 79, 79,247,105, 18,224,193,221,200,169, 95,
- 54,209, 6, 55,186,220,205,152, 7, 2, 80, 81, 74, 51,124, 88, 55, 28,128,134, 82,122,225,118,107,222,162, 72,203, 9, 66, 72,
-176, 61, 29,142,244,148,250,236,250, 46,138, 98,241,165, 75,151,106,151,167, 89,189,122,245, 70,146, 36,241,174,191,201,100,101,
-247, 90,176,217,108, 82, 74, 74,202,241,114,143, 17, 71,170,124,253,229,103, 1, 2, 7,136,212,254,178, 82,136,148, 66,146, 0,
- 81, 2, 68, 73,130, 77,164,144,168, 4,171,141, 98,202,123,111,221,201,106,238, 97, 0, 29, 0,108, 7, 48,167,156,101,179,203,
- 19, 9,171,211, 98,248,232,167, 71,116,126,235,141,151,116,148, 82, 80, 74,161, 86, 41, 49,238,213, 81, 10,163,209,220, 54,162,
-110,194,243, 25,103, 15, 46, 36,132,116, 6,144, 0,224,160,139,193, 98, 48, 42,215, 96, 17, 66, 72,124,124,124, 7, 74,233, 83,
- 53, 99,234, 12, 26, 56,236, 5,117,205,186, 77, 80, 36,249,227, 98,182,132, 67, 91,150, 2,192,242,138,252,249,250,245,235, 19,
- 40,197,247,163, 39,124,214,160, 89,139,150, 56,150,102,195,174, 20, 17,197,231, 68, 8,188, 1,146, 4, 80, 74, 77, 55,186,115,
-169,185, 54,236, 56,101, 6,207, 1, 28, 7,240, 28, 1, 95,193,231,116,211,196,175,172, 92,141,129,127,110,216,159,246, 8, 84,
-225,208,231,166, 65,159,155,185,142,166,252,126, 87,153,171,168,168,168, 46, 49, 49, 49,179, 95,125,245,213,170, 25, 25, 25,193,
-251,246,237,131, 82,169, 68, 80, 80,144, 80,165, 74,149, 6, 19, 38, 76,200,159, 54,109,218,184,240,240,240,127, 50, 51, 51,147,
-125, 50, 5, 58, 69,195,142,113,141,119, 79,154, 58, 57,192,148,184, 14,121, 43, 86,128,231, 36,200,181, 58, 68,168, 53,152,243,
-112,205,224, 9,235, 83,126,107,170, 86, 55, 60,106, 48,164,249, 20,117, 10, 11,238, 94,167, 94,125,228,173,157,135,179,121, 38,
-236,201, 52,161, 95,199, 4,212, 9, 82,163,133, 77, 68,136, 74,232,226,205, 96, 69, 71, 71, 7, 1, 24,159,156,156,204,201,229,
-114, 82,171, 86,173, 33, 95,127,253, 53,109,212,168,145,243,169,219,173, 91,183, 70,235,214,173, 73, 81, 81, 81,195, 93,187,118,
- 53, 92,185,114,165, 53, 42, 42, 42, 49, 45, 45,109, 81,217,145,165,218,151, 77, 38, 99, 53,165, 74,109,156, 53,107,214, 79, 15,
- 62,248,160,164, 80, 40,112, 51,154,118,227,187, 36, 58, 58, 90, 51,105,210,164,236,150, 45, 91,210,202,208,172, 85,171,214,134,
-246,237,219,119,238,222,189,187,208,182,109, 91, 68, 70, 70, 58,151, 85,169, 82, 5,237,219,183, 39, 41, 41, 41,205,118,236,216,
- 49,111,195,134, 13,115,107,213,170,181,229,226,197,139,221,125, 56, 69,245,111,114,121,169,224, 47,128,233,132,144,133,148,210,
- 93,229,212, 45,113, 0,134, 2,248,248, 14,105,150,139, 90,173,206, 52, 26,141, 97, 0,160, 82,169,174, 26, 12,134,112, 31,234,
- 75,221,172, 89,179,194,228,114, 57, 56,142,131, 40,138, 16, 69, 17,146, 36,129, 82,234,124,119, 12, 50,154, 58,117,170,232, 77,
- 83,146, 36,238,179,207, 62,147,169,213,106, 0,128,213,106, 45,245,238,192,241,125,234,212,169, 62,213, 81,106, 5,143,119,223,
-120,190, 21, 39,154, 85,229,254, 63,175, 48, 62, 51,110,246,254, 59, 96, 86,131, 40,165, 79, 2,232, 11,192, 81,198,155, 70, 69,
- 69,253,237,182,106, 83,251,123,113, 84, 84,212, 22, 0,127, 16, 66,190,247,212, 92, 24,160,245, 27,245,250,152,103,253, 40,165,
-152,178, 34, 27, 83,126,205,198,187, 3,130, 49,174,183, 6, 35,159,120, 84,251,253,226, 95, 94, 0,176,208,101,147,211,246, 40,
- 26,139, 94, 49, 42,223, 96,181,104,209,226,207, 94, 3, 70,244,124,176, 67,119,216,228, 97, 56,117,149, 32,229, 34,133,192,219,
-192, 65,194,133, 3,171, 40,199,113, 63,184,133,108,203, 28, 97,240,231,159,127,190, 86,189, 78,243, 25,111, 77,158,206, 31,203,
- 84,224,251, 29, 6,136,166,124, 24,178,207,161,248,234, 25, 20, 94, 57,129,188,180, 99, 71, 57,142,155,236,171,230,117,230,136,
- 2, 18,165, 32,148, 0,146, 61,178,203, 17, 15,235,149,175, 73, 69, 50, 62,113,195,247,143,180,232, 63, 17,103,118, 44, 6, 40,
- 55,222,251,127, 87,254,232,138,178, 52, 35, 35, 35, 31,170, 89,179,230, 39, 47,188,240, 66,244,145, 35, 71,252,245,122,125,241,
-254,253,251,183,101,100,100,132, 87,169, 82, 37,229,241,199, 31,111, 19, 22, 22, 22,214,161, 67, 7,205,250,245,235,223, 6,240,
-172, 55,205, 38, 90, 69,108,251, 86, 77,246,124,240,201, 76,109,246,111,115, 97,190,120, 4,123, 50,141, 56,146,101,160, 81,254,
-249,228,177, 38, 65,208, 42, 4, 60,255, 64,152,238,127,107,146, 63, 2, 48,204,151,125,175, 21, 21, 94,219,106, 48,192,104,176,
-224,207, 51,249,134, 61,185,249, 97,156, 95,106,214,184, 71, 18, 84,124,118, 58,170,250,201,234, 86,244,120, 18, 66,160,209,104,
- 60, 46, 11, 8, 8, 64,235,214,173, 81,187,118,109,217,208,161, 67, 31, 4,176,168, 44, 77,139,197, 18,145,150,150,142,122,245,
-235, 41,187,118,237, 74,120,158,135,217,108,190, 41, 77, 0,208,106,181,125,227,226,226,132, 31,127,252, 49, 47, 57, 57, 57,105,
-224,192,129,105, 26,141,166,212, 5, 85,163,209,160,122,245,234,120,241,197, 23,101,207, 61,247,156, 87,205,240,240,240,135, 22,
- 47, 94, 12, 66,136,243,226,237, 78,141, 26, 53, 80,181,106, 85,244,238,221, 91,120,244,209, 71, 31, 42,239,120, 14,238, 70, 78,
- 57,204,211,224,110,132,122,137,114, 81, 0,167,221, 35, 89,238,154,148,210, 28, 66,200, 2, 0,191, 19, 66, 6,121, 50, 68,132,
-144,182, 0, 86, 0,232, 69, 41,189,234,237,188,187,106, 42, 20, 10,185,197, 98, 9,114, 55, 62, 21,213,116, 73, 11, 77, 76, 76,
- 68,124,124, 60, 92,223,141, 70,163,211, 8, 17, 66,194,124,205,159, 60,207, 99,254,252,249,224, 56, 14,114,185, 28, 50,153, 12,
-114,185,252,186, 87,139, 22, 45,124, 46,239, 50,153, 12,243,231,207,135, 40,138, 92,114,114,242, 83,162, 40,246, 55, 26,141, 97,
-106,181, 58, 75, 46,151,175,237,216,177,227,119, 74,165,210, 86, 17, 77,142, 7, 56,209,172,218,180,126,181,182,172,115,110, 50,
-153,208,167,255, 99,224, 8,119,219,235,186, 93,187,118, 85,175, 94,189,122,125,123,116, 10, 0,182,167,165,165,117,112,249,238,
-202,246,180,180, 52, 71,215,144,179,151, 47, 95,174, 14, 32,215, 93,211,108,182,212,210,233,180,160,148, 98,202,175,217, 48,254,
- 24, 3,213,136, 11, 24,249,128, 9,126,126,126,176,217,108, 13,162,162,162,126, 0, 80,207, 30,189,234, 23, 21, 21, 85,159, 82,
-186, 69,169, 84,254,238,104,210,191,157,245,252,127, 65,211, 11, 45, 1,132,186,124, 55, 3,112,220,173,102,219, 13,112,136,219,
-239,174,235, 57,222,179,236,191,135,218,183,163, 46,186, 89, 0, 14, 84,170,193, 34,132, 80, 74, 41,113,188,151,177,174,127,170,
- 33, 16, 69, 23,171, 64,224, 36, 8, 60,129,192, 3, 0, 65, 78,234, 9,152,139,115,118, 30, 60,120,240,162, 47,127,250,215, 95,
-127,181,174,217,168,213, 71,147, 63,248,148,251,110,187, 1,249,122, 35,178,143,175, 70,198,254,111, 51, 36,155,101, 53,199,113,
- 7, 57,142, 59, 20,215,172,233,169,136,136, 8,241, 70,119, 78,162, 37, 33,110,167,177,146, 0,114, 3, 55, 32, 52,245,215,115,
-145, 29,223, 41,245,253,110,113,200,209,209,209,189,234,212,169, 51,253,133, 23, 94,168,113,232,208, 33,191,194,194,194,172, 77,
-155, 54,157,178, 88, 44,255,112, 28, 55, 39, 61, 61,189,227,226,197,139, 53,111,190,249,102,247,250,245,235,215,223,176, 97,131,
-222,107,228, 74, 43,111, 54, 98,248,227,123,250, 63,255,138, 42,233,215, 47,160, 60,117, 8, 95, 31,207, 21, 15,102, 26,222, 54,
- 22,217,102,171, 53, 66,219, 60,163,109,227,235,237, 35,184, 8, 63, 25,170, 5,200, 59,249,154, 94,133, 76, 41, 80, 65, 5,179,
-201,134, 98,179,100, 62,158, 69,139, 95,235,212,196, 66,181, 85, 84, 0, 32,240,156, 87,211,159,154,154,154, 27, 25, 25,249, 81,
-205,154, 53,223, 33,132,208, 14, 29, 58, 28,143,143,143, 47,150, 36, 9, 6,131, 1, 22,139, 5, 50,153, 12, 6,131, 1,151, 46,
- 93,194,190,125,251, 16, 16, 16, 80,161,227,154,151,151,135,154, 53,107, 66,163,209,220,180,166, 36, 73,100,222,188,121,170,164,
-164, 36,213,239,191,255, 30,252,218,107,175,229,183,104,209,226,196, 35,143, 60,146, 18, 28, 28,108, 57,124,248, 48,246,236,217,
-131,220,220, 92,180,106,213,202, 39, 77,139,197, 2, 65, 16, 96, 48, 24,160, 84, 42, 33, 8, 2,108, 54, 27, 36, 73,114,154,174,
-162,162, 34, 92,187,118, 13, 50,153,204,235,131,216, 29,102,105,112, 55, 66,127, 89,177,251,106, 73,219, 80,129, 21,150,124, 43,
-108,249, 86, 88,243,173,176,230, 89, 7,191, 58,179,217, 47,155, 40,169, 64, 37,188,151, 16, 50, 8,192, 10,119,147,229, 98,132,
- 6, 81, 74, 15, 87, 84,211, 98,177,236,116, 24, 31,149, 74, 21, 70, 72,137, 49, 84, 42,149, 86,147,201,212,185, 34,154, 0,144,
-152,152,136,184,184, 56,222,174, 73, 29,239, 55, 18,181, 32,132,128,231,121,200,100, 50,240, 60,143,184,184, 56,244,237,219, 23,
-245,235,215, 71,106,106, 42,182,110,221,138, 51,103,206, 64, 46,151,151,106, 58,244,134, 76, 38, 3,199,113,220,233,211,167,191,
-235,218,181,107,157, 87, 94,121, 69, 81,189,122,117,156, 58,117,170,234,188,121,243, 70,108,222,188,185,227,128, 1, 3, 70, 0,
-176,149,215,124, 88,202, 8,218, 77,147,201,100,194,137, 19, 39,202, 95,183,162, 77, 0,149, 64,219,182,109, 47, 83, 74,207,162,
-164,233,175,105, 90, 90, 90,135,168,168,168, 63, 1,184, 27,194,226,180,180,180,222, 81, 81, 81,249, 0,142, 2, 56, 77, 8,185,
-156,154,154,122,157,102, 96,128,127, 86, 81, 81,113,184, 86,171,193,219,253, 3,161, 26,113, 1, 99, 58,243,176, 90,173, 56,127,
-254, 34,106,213,140, 38,203,191, 95,229,104, 26, 76, 56,120,240, 32, 80,210, 84,152,156,146,146, 18, 9,128,117,120,191, 5,120,
-241, 34,161,132,144,181, 46,245, 64, 31,199,247, 9, 19, 38,188, 53,125,250,244, 36, 66,200, 90,215,223, 93,215,115,125,183,255,
-215, 90, 74,105,159,137, 19, 39,198,206,152, 49, 99,154, 99,221, 59, 18,193,226,121,126,224,177,191,102,239,173,107,161, 53,194,
- 99, 31,182,215, 57, 37, 17,211, 75,135,255,130, 36, 73,139,124,209,217,179,103,143,202, 38,225,187, 55,223,154,202,125,181,197,
-128,204, 43,233, 72,223,246, 49, 12, 87, 79,124,175, 86,171, 95,239,218,179,207, 77,103,220,248,248,248,216,192,144,170, 48, 89,
-168,221, 96,149, 54, 89,247, 11,145,145,145,125,235,212,169, 51,117,245,234,213, 53, 12, 6,131,223,174, 93,187,242, 54,110,220,
-120,214, 98,177,124,147,145,145,177,196,158,137, 86, 11,130,240, 62,165, 20, 58,157, 78,224,121, 94,237,200,189, 30, 35, 87, 1,
-242,184,167,159,122, 98,231,107,115, 22,170,206, 30, 59,140,185,203,255,132,146, 90,196,227, 57,230, 71,142, 21, 90, 29,153,246,
-239,222, 81,154, 52, 74, 81, 77,198, 17, 4,107,100, 85, 91, 19,162,218, 67,169,209, 91,154,171, 84,171,193,217,162, 98,176, 67,
-111,130,206, 95,174, 0,128,168,122,141,249,195, 5, 54,236,218,127, 18, 42, 85,144,220,151,125, 79, 79, 79,159, 20, 21, 21, 85,
-115,227,198,141,156, 94,175, 47, 62,114,228, 8, 66, 66, 66, 16, 22, 22, 6,127,127,127,156, 58,117, 10,155, 54,109,194,233,211,
-167, 65, 41, 45, 51, 74, 80, 22,153,153,153, 40, 40, 40,168, 20, 77,155,205, 70, 0, 32, 54, 54, 22,177,177,177,138,180,180,180,
-176,181,107,215, 6, 77,155, 54,237, 74, 68, 68,196,122,131,225,223,238, 81,238,205, 61,229, 69, 20, 0,192,104, 52,194,100, 50,
- 65, 46,151, 67,165, 82, 65, 46,151,163,160,160, 0,153,153,153, 40, 44, 44, 44,185,152, 4, 6, 58,215,247, 9, 81, 2,246,182,
- 59,120,221,239, 81, 79,133,221,224,157,238, 46,187,201,250,155, 16,226, 56,191,153,246,247, 65,229, 53,245,121,209, 44,117, 60,
- 92,162, 76,178, 27,209,140,143,143,119,104,148,170, 37, 84, 42,213, 85, 71,228, 74,165, 82, 93,245, 69,203,209, 44,168, 80, 40,
- 16, 27, 27,139,215, 95,127, 29,167, 78,157,194,206,157, 59, 17, 22, 22,134, 30, 61,122, 64, 16, 4,164,164,164,128,227, 56,159,
- 12,150, 92, 46,135,213,106,197,217,179,103,159,234,210,165, 75,204,220,185,115, 21,201,201,201, 56,117,234, 20,252,253,253,241,
-254,251,239, 43,199,143, 31, 31,189,126,253,250,231,154, 55,111, 62,223,231,186,157,148, 52,255,245,233,255,152, 7, 35,162,149,
-253,184,232, 91,133,195,120,113,119, 96, 98, 31,123, 19,223,103, 0,102,217,155, 5, 59, 0,208,166,165,165,117,182, 95,132, 0,
-128,218,155, 5, 1,224,104, 90, 90, 90,151,242,204,113,198,213,140, 5, 31,207,249,106,214,148,183,198, 42,198,245,214, 96,228,
- 3, 38,136,162, 8,158,231, 49,119,193,247,214, 51, 39,142, 29, 73, 72, 72, 88, 11,160,223,193,131, 7,145,144,144, 80, 8,224,
- 12,128,139, 10,133, 34,253,194,133, 11, 96,220, 25,220, 77,144,195, 56, 77,159, 62,189,143, 39, 83,229,193,196,149,250,125,198,
-140, 25,211, 92,190, 87,234, 40,118,193,213, 57,122,185, 11,143, 8, 12,141, 10,126, 97, 88, 15,172, 60,226,120, 32, 33,133,197,
-164,199,149, 83, 91,244,102,179,121,133, 47,127,152,147,147,243,254,200,215,103,214, 57,120, 89, 64, 70,174, 30,233,155,167, 82,
- 75, 94,242,160,190,125,251,174,172,140, 29,138,143,143,143, 13,170, 18,185,245,157,143, 22,226,239,179,102, 72, 20, 32,212,165,
-202,188, 79,102,254,138,138,138,170, 27, 20, 20,244,233,170, 85,171,194, 20, 10,133,223,209,163, 71,197,109,219,182,165, 91,173,
-214,121, 25, 25, 25,203, 92, 76,216, 19, 77,154, 52,177,106,181, 90,100,100,100, 24,173, 86,107, 81, 89,230, 42, 86,173,142,142,
- 79,104,178,253,181, 57, 11, 85, 70,179, 25,249, 6, 19, 66, 35, 34,196,157, 71, 79, 60,114,188,208,230,188, 35,104,236, 39,107,
-243,104, 66,173, 40, 78,237, 7,232, 11,144, 86, 96, 78,247,197, 92, 1,128,214, 47,144,139, 78,232,132,132, 87, 63,199,241,201,
-111, 83, 0, 8, 12,143,228, 58,191,248, 33,116,241,125, 49,255,149,167, 42, 98,129, 13,245,234,213,195, 63,255,252,227,200, 91,
-200,201,201, 65, 76, 76, 12,230,206,157, 91,106, 69,163,209,120, 67,199,185, 50, 52, 37, 73, 34,110,231, 14,163, 71,143,150,173,
- 91,183, 78,235,106,174, 42,162,105, 54,155,157,134,130, 82, 10,179,217, 12,179,217, 12,173, 86,139,179,103,207,150,246, 75,162,
-232,177,169,179,236, 4,231,123, 14,119, 89,115,172, 55, 81, 41,238, 34,132,200, 93, 76, 80, 56,128,118, 55, 98,132, 60, 25,159,
-202, 32, 49, 49, 17,158, 46,200,142,166,199, 67,135, 14,209,184,184,184,240, 10,236, 51, 20, 10, 5,250,245,235,135,147, 39, 79,
- 34, 61, 61, 29,126,126,126, 48,153, 76, 48,153, 76,136,139,139, 67,102,102,166,207,209, 43, 23,221, 94, 99,198,140, 81, 93,188,
-120, 17,215,174, 93,131, 74,165,130,205,102,131, 40,138,120,238,185,231, 84, 47,190,248, 98, 79, 0,190, 27, 44,158,160,219, 83,
- 31,121,236, 91,245,247,183,255,235,168, 84, 42,157,205, 45, 60,119, 87, 85,160,174,125,162, 42,116, 16,175, 94, 56, 58,191, 70,
-163, 54, 15,217, 44,150,206,207, 60,249,152,159, 78,171,193,249, 11,201,152,255,205,143,214,191,119,252,159,189,243,142,138,226,
-250,219,248,115,103,123, 97,233,189, 8, 40, 29, 81, 17, 80,177,162,177,119, 77,140, 26, 77, 44,177, 38, 26,163,198,154,216, 91,
-140,177,166,153,216,141, 26, 75,212,216,123,141, 29, 43, 22, 16,145,222, 59,203, 46, 91,231,190,127, 0, 6, 13,101, 65,243, 75,
-121,231,115,206, 28,216,153,217,103,239,157,185,115,231,153,239, 45,115,227,108, 70,242,211,110, 0,136,139,139,139,111, 89,228,
- 42, 38, 37, 37,229,131,186, 70, 52, 57,106, 23,197,170,100,221,232,242,129, 45, 85, 25,167,218, 24,180,138, 17,174,114,102,206,
-156,217,112,233,210,165,111,180,143, 33, 83,225, 71, 73, 53,166, 37,216,210,214,229,220,204, 37, 63,153,237,191,199, 67,110, 90,
- 52,146,110, 31,132,129, 5,210,162,127, 7, 53,234,127,125,248,240, 97,113, 77, 63,118,226,196, 9, 31, 55,223,208, 79,154,132,
- 52,199,137, 7, 26,228,222,223, 5,109,222,243,239,123,244,232,241,230,204,149,141,211,249, 89,203,126,178, 62, 20, 37, 64,226,
-243,104,156, 95,219, 27, 39,151,191,133,227, 95,190,133, 35, 75, 59,224,183,197, 29, 0,224,104,109,116, 35, 8,225,123, 90,233,
-208, 41,128,192,217, 86, 5, 18, 65,248,127,119, 33, 76, 73, 73,121, 10, 96,235, 79, 63,253, 84,116,249,242,101,227,216,177, 99,
- 99, 10, 10, 10, 22,165,166,166,238,170,112, 35,239, 80,191,126,253,169, 11, 22, 44,240, 53, 26,141,184,120,241,226, 83, 30,143,
- 87,101,251,114,148, 90,157,124,231,254,195,239, 46,239,216,128, 59,183,110, 98,251,156,201,134, 43, 15, 30,245,122,201, 92,153,
-137,252,195, 27,122, 31,254,104,226, 71, 12, 17,203,241, 36, 91,131, 52,165,254,140,201,233, 46, 82,233, 5, 98, 41,204, 28, 61,
-144,160,102,133, 46, 46, 46,215,147,243,213, 66,134,199, 7,195, 23, 34, 46, 79, 83,171,155, 56,203,254,217,143,189,106, 90, 0,
-212,216, 68, 86,163,147,123, 13,205,242, 8,214,159,252,138, 94, 79,234,170, 89,209, 96,189,106,166, 42, 59, 70,181, 50, 88,186,
-194,202,207,129, 54,231, 77, 12,236,208,150, 45,120, 29,115, 85,110,124,202, 35, 74, 98,177,248, 69, 83,155,169, 81,166,202, 34,
- 88,175,179,253,149, 27, 2, 88,150,133, 64, 32,128,183,183, 55, 10, 10, 10, 96,110,110, 14,133, 66, 1, 51, 51, 51,136,197, 98,
- 56, 56, 56, 64, 36, 18,129, 97, 24, 48, 38, 26, 23,189, 94, 15,173, 86,235,232,234,234, 10,165, 82, 9,137, 68,242, 98, 17,137,
- 68,240,245,245,133, 82,169,172,149,233,172,141,105,226,253,135,166,166, 78,120,116,165,223,150,221, 7, 39,118,236, 53,228,102,
-227,240,110,154, 47, 22,175,214,156, 57,125,250,118,250,179,219,221, 56,155,243,183, 70,168, 72, 37,235,126,172, 42,130,245, 38,
-162, 96,229,145, 44, 0,210,191, 36,130, 85,147,185,154,190,248, 71,243, 61,183, 25,228,167, 61, 65,194,241, 89, 69, 70,157, 42,
-143,101,245,238,121,207, 46, 3, 21, 58,228,214,112, 51, 12,107,217,161, 15,115,254,177, 22,186,162, 84, 20, 70,253, 18, 47, 22,
-139,103,188, 73,115, 53, 99,233, 79,214,251,239,241,145,155, 26,141,103, 71,103, 22, 24,117,170, 14,145,145,145,181,158, 71,107,
- 12, 33,130,245,148,234,251,216,219,247,117,115,115, 88, 62,162,191, 2,109, 59, 74, 97, 46, 52,199,130,175,152,199, 14,173,200,
-212,140,223,233, 33, 18, 66, 4, 52,146,254, 45, 35, 10,163,162,162, 22,123,123,123, 51, 6,131, 97,132, 78,167,155,151,154,154,
-186,183, 66,228,170,147,187,187,251,242,133, 11, 23,186,198,199,199,139,174, 93,187,150,123,231,206, 29,214,104, 52, 46,171, 78,
-243,126,129,102, 90,144, 66,200,243,114,115,158, 16,155,156,220,251, 65,161,225,120,249,182, 32,185,168, 97,235, 96,255,223, 23,
-206,159,169,208, 93,219,135,226,244,100,124,115, 45,189,144, 53,234,103,154, 24,117,179,246, 16, 2, 51, 71, 13, 99,139,138,138,
- 32, 19, 9,217,228, 39,207,120,239,119,108,107,252,114,250, 20, 38, 61, 61, 29,170,226, 98,158,139,139,139,117, 74, 74, 74,174,
- 41,154,149, 25,138,202,162, 64,181, 50, 24,149,240, 58,154,175, 70,176,170, 51, 88,166,106, 86,108, 18,171,233,120, 24,141,198,
-218, 53, 17, 26,170, 48, 88,186, 44,221,107, 22,217, 68, 66, 72,189,242,255,223,196, 53, 80, 82, 82, 98, 95, 33, 42, 86,237,131,
-162,137, 17,172, 58,111,175, 42,130, 21, 27, 27, 11, 59, 59, 59, 24, 12, 6,200,229,114, 72,165, 82, 72,165, 82,168,213,106,136,
- 68, 34,240,120,188, 90,233,138,197,226,244, 39, 79,158,184, 91, 89, 89,193,104, 52,190,100,178,158, 63,127, 14, 11, 11,139, 76,
- 83,251, 95,149, 70,176,128,211, 91,166, 87, 58,138,208,210, 66,254,146, 16,143, 16,252,131,160, 21, 34, 87,117,138, 42,165,199,
-220,216, 14, 96,187,139,139,203,214, 29, 27,142,132,134,134,134, 30,121, 93, 77,142,191, 60,194,117,184,162, 73, 34,132, 28,158,
- 49, 99, 70,157,231, 14,153, 49, 99,198,172,202, 34, 90,111,204, 96,149, 87, 74,175, 86, 78, 33, 33, 33,193,150, 54,206,231,166,
- 46, 92,111,190,227, 22,131,130,180,199, 72, 61,253,121, 1,171, 83,117, 96, 24, 38, 45,233,202,143,123, 1,168,110,223,190,125,
-193,196,155, 97, 83, 63, 31, 31,236,137, 50,160, 36,253, 30, 24, 66,183,116,236,216, 81,245,186,153, 40, 55, 87,211,150,252,104,
-189,231, 14, 31,121,165, 38,176,128,173,131,185,122, 79, 44,246, 18, 48,204,114,175,240,166, 61, 6, 57,216, 42,187,123,201, 44,
-187,123,137,193,187,118, 0,135,156, 51,145,107,123, 22,227, 86,185,120, 93, 57, 88,248, 91,189,183,248,185,189,219, 54, 49,119,
-110,199, 63,162,167,198,105, 89, 23,233,255,188,243,251,211,167, 79, 23, 58, 58, 58,238, 79, 79, 79,127,209, 59,213,213,213,181,
-155,135,135,199,146, 5, 11, 22,120, 36, 37, 37, 41,238,222,189, 91,184,119,239,222,231, 12,195, 44, 72, 75, 75,171,241,233,254,
- 65,145,110, 74, 67, 51,209,134, 40,165,225,201,139,200,149, 92,216,120,216,251,131,174,118, 28, 52, 92, 18,119,126, 43,172,147,
- 31, 98,245,141, 76, 99,114, 65,201,224,199, 42,154,110,138,185, 18,137, 68,123,214,238,219,247, 52, 40, 40,136,168, 84, 42,232,
-245,122,100,101,101,225,171,159,247, 68,177, 44, 11, 43, 43, 43,156, 57,115,134,253,228,147, 79,246,184,184,184, 12, 48,197,100,
-177, 44,251,226,102, 85, 85, 20, 72, 42,149,214,206, 96,148,125,167,162,129,121, 29,205,170, 12,214,171,145,173, 90,106,150, 94,
-192,101,157,219,171,138,232,241,120, 60,176, 44, 91,105,164,175,234, 48, 73,126, 21, 6, 43,243,181, 30, 36, 40,165,238, 53, 12,
-164,249,219, 40,155,138, 1, 0,216,170,166, 98,168,208, 71,203,164, 8, 22, 0,136, 68, 34, 92,185,114, 5, 93,187,118, 5,203,
-178, 16,139,197,144, 74,165,144, 72, 36,184,113,227, 6,132, 66, 33,120, 60, 94,173,154, 9, 5, 2,193,177,111,190,249,102,216,
-178,101,203,164, 44,203, 66, 36, 18, 65, 42,149, 66, 44, 22, 99,229,202,149,106,145, 72,116,188, 86, 6, 11, 53,143, 34,172,104,
-198,254,215,188, 50, 77,195,171, 83, 49, 84,228,213, 41, 28,170,156,166,193,197,197,197,154, 16,242, 33,165, 52,176,108,213, 75,
-163, 5, 43, 6, 74,203,183,187,184,184,108,125,117, 20, 33,199, 95, 19,189,170,162,142,200,122, 37,242,164,173,240, 57, 11,165,
-239, 86,238, 89,246, 63, 42,249, 95, 91,201,186,156,165, 75,151,158,171,208,127, 43,235,127, 18,193, 10, 14, 14,246,183,182,115,
- 61, 55,121,225,122,243,173,215,121, 40, 72,123,132,236,115, 95, 20, 80,131,186,162,105,105, 93,203,223, 11,182,183,183, 65,246,
-149, 18,232,243,158,130, 16,114,251,117, 51,208,172, 89, 51,111, 75,107,199,243, 83, 23,253,104,189, 51,146,143,252,212, 63, 76,
- 96, 93, 34, 87,124,134,249,234,235, 19,191,244, 22,167, 63,134,250,222,121, 75, 65,110, 50,162, 50,117,216,115, 37,189,232,252,
-239, 63, 93,102, 2,104,155, 14,131, 45,205, 58, 12,182,198,234,113,199,173, 51, 74, 30,226,122,204,225, 62, 75,102, 30,166,248,
-155,102,119,175,104,174,156,157,157,123,185,186,186,206, 63,114,228,136,187,193, 96, 80, 92,188,120,177,104,239,222,189,207, 12,
- 6,195,218,180,180,180, 35, 38, 71,199,148,218, 23,230, 42,200, 66,216,244,195,145, 31, 92,254,100,213, 15,146,135,145, 55,177,
-124,235, 17, 40, 4,122, 99,100,106,201,128, 40,165,225,152, 73,199,149,207, 95,176,115,231, 78,121, 64, 64, 0,201,201,201,121,
-113,195,215,233,116, 40, 44, 44, 68, 65, 65, 1,180, 90, 45,130,130,130,152,185,115,231,202,231,204,153,179, 0,192, 71, 53, 92,
-140,153,243,231,207,183, 31, 61,122, 52,204,205,205,145,147,147, 3,189, 94,255, 34,218, 36, 22,139, 97,105,105,137,252,252,124,
-156, 62,125, 26,149, 13,217,175,136, 80, 40, 76,115,113,113,118,147,202,228, 90,153, 76, 70,205,204,204, 94, 91,179,236,102,155,
-222,189,123,119,199,249,243,231,139, 42, 54, 51,233,116, 58, 82, 87, 77, 74,169,170,115,231,206,178,181,107,215,194,221,221, 29,
- 90,173, 22, 44,203,190,136, 96,149, 79, 13,144,152,152,136,197,139, 23,131, 82,106,250,131,140, 62, 79, 15,215, 15,236,160,203,
-209, 67,151,163,135, 54, 91, 15, 93,166, 30, 6,213, 63,110,136, 72, 93, 58,160,155, 16, 9,179,127,221, 8, 86, 89, 52, 13, 66,
-161, 16, 73, 73, 73, 56,115,230, 12,154, 53,107, 6,133, 66,129,226,226, 98, 92,189,122, 21,233,233,233,117,138, 96,117,232,208,
- 97,203,201,147, 39,219,124,252,241,199,158, 99,199,142,149,250,251,251, 35, 62, 62, 30,171, 86,173, 42,121,244,232, 81,202,196,
-137, 19,127,170,141, 30, 83, 54,117,141, 73,163, 8,153,255,189, 55,174, 98,154,134,238, 85,236, 94,113, 10,135,151,166,105,168,
-200,129, 3, 7, 60, 93, 92, 92,252, 81,218,191, 10,248,243,104,193,138,220,186,117,235, 86, 40,184, 81,132,127, 55, 55,255,109,
- 9,230, 87,125,209, 49,159, 54,127,123,182,249,150,107,124,228,165, 68,161,224,210,220, 87,205,149, 41,149,204, 75,111,219, 22,
- 72, 20, 65, 6, 42, 4, 80, 2, 67,254, 51,136, 68,162, 90, 27,160, 87, 53, 89,150,157,210,226,237,217,214,219,110,242, 81,144,
-250, 8, 89,231,231,212,218, 92,149,107,142, 33, 68,224,221, 50,180,135, 56, 35, 26, 37,231,119,129, 0,216,112,167, 24, 87,147,
-181, 43,117, 90,237,162,135, 5,154,124,215,112, 98,181,107, 73,230,156,110,253, 26,125,226, 59,240, 52,174,103,125, 15,200, 0,
- 43, 59,126,183,138,205,133,127,199,219,203, 93, 92, 92,188, 21, 10,197, 87,199,142, 29,179, 19,137, 68,230, 15, 31, 62, 52,238,
-219,183, 47,201,104, 52,126, 93,177,227,123,109, 52, 27, 74,165,174,129,126,158, 23, 38,126,253,157,164, 72, 89,140, 98,173, 14,
-206,245, 92,140, 23, 34, 31,191, 29,165,212, 30, 52, 69,211,193,193,161,253,123,239,189,215, 56, 36, 36,132,169,202, 92, 21, 22,
- 22, 66,169, 84, 34, 57, 57, 25,109,218,180, 97,252,253,253,131, 28, 28, 28,218,103,100,100,156,171, 42,157,105,105,105,243,118,
-237,218,213,106,247,238,221, 61, 71,141, 26,165,232,223,191, 63,164, 82, 41,138,139,139,225,230,230, 6,150,101,113,233,210, 37,
-196,196,196, 20, 1, 56,156,150,150,246,123,117,233,140,139,123, 86,143, 16,194,184,186,186,182,234,218,181,235, 27,209, 4,128,
-172,172, 44,175, 11, 23, 46, 76,239,211,167,207,164, 46, 93,186, 40,102,205,154, 37,244,244,244,132,209,104, 36,117,213,204,203,
-203,179,184,125,251,246,138,214,173, 91,127,212,181,107, 87,254,146, 37, 75, 96, 97, 97, 1,163,209, 8,169, 84,138,194,194, 66,
- 44, 88,176, 0,151, 47, 95, 54, 80, 74,191, 45, 40, 40,152, 90,157,230, 75,243, 96, 77, 92,217,164,186,114, 88,213, 60, 88,127,
- 71,153, 87,171,213, 14,181,141,138,153,146,206,219,183,111,211, 87,231,195,170, 46,130,245,170,102,121,127, 48,145, 72, 4, 62,
-159,143,172,172, 44,156, 60,121,242,165,249,175, 68, 34,209,139,105, 28, 42,139, 96, 85,149, 78,133, 66,193,190,243,206, 59, 35,
-142, 29, 59, 54,108,202,148, 41,125,138,138,138,236,205,205,205,179,228,114,249,225,137, 19, 39,110,178,180,180,172,114,138,134,
-202, 52,121, 12,169,114, 20,225, 75, 81, 83,158,168,164,178,238, 90,127,245,121,127,101,154,134, 87,167, 98,168,200,171, 83, 56,
-188, 52, 77, 67, 69,205,190,125,251, 62, 71,233,228,161, 76,217,223, 87, 71, 11,150,227,115,235,214,173,208,208,208,208,139, 40,
-237,159,243,210, 40,194,191,163,204,255,151, 53,255,107, 84,215, 7, 75,242,123,100, 12, 24,113, 38,138,174,127, 85,107,115, 85,
- 25, 6, 77,113,236,194, 95,226,130,141, 90, 53, 12,133, 9,209, 93,123,116,207,124,221, 12, 80, 74,229,151,111,199,130, 47,201,
- 65,254,181, 47,243,137, 81,211, 33, 50, 50,242,110, 93,180,214, 83,170, 31, 34,151,159,127,118,249,204, 91,206, 0, 18,114,181,
-184,251, 36,247,228,126,149,106, 74,249, 62,201, 87,105, 30,128, 73, 78,109, 25, 63,107,159,130, 78, 22,206, 64,102,162, 30,121,
- 89,134, 99,127, 87, 95,172,114, 82, 82, 82,158, 54,108,216,112,235,198,141, 27,199, 53,109,218,212,108,194,132, 9,229, 29,223,
-119,215, 85, 51, 74,173, 78,110,168, 16,125,127,126,195,170,207, 36,254,205,176,111,201, 76,227,197,200, 39,125, 31, 20,105, 77,
-110,179, 22,139,197, 17,227,198,141, 19,170, 84,170, 42,205, 85, 97, 97, 33,138,138,138, 80, 88, 88,136,187,119,239,162,127,255,
-254,226,199,143, 31, 71, 0, 56, 87,205,185,103, 1, 92,242,242,242,186,241,253,247,223,119,220,182,109, 91,167,145, 35, 71,138,
- 34, 34, 34,240,240,225, 67,220,184,113, 67,171,211,233, 78, 73, 36,146,211,177,177,177, 90, 19,203,211, 95,161,105, 0,176,216,
-214,214,118,237,222,189,123, 23,157, 61,123,118,232,176, 97,195,228, 6,131,129,188,166,230, 36, 59, 59,187,207,143, 30, 61,186,
-229,228,201,147,125,135, 14, 29,202, 76,156, 56, 17,235,214,173,195,190,125,251, 88,163,209,120, 80, 32, 16,124,144,149,149, 85,
-227, 0,148,151,230,193,170,102,158,171,154,182,255, 77, 79,161,175,173,249,106, 36,172,105,211,166, 14, 21, 71,105, 86,252, 91,
- 27, 26, 55,110,252,210, 60, 87,229, 29,218,203, 23, 30,143, 7, 62,159, 95,171, 38,194,134, 13, 27, 66, 32, 16,176,193,193,193,
-155, 0,108, 2, 94,126,101,142, 64, 32,120, 49,169,169, 41,104, 12, 44, 54,108,220,122,195,192, 82, 24, 89, 10,202, 2,122, 10,
-176, 70, 22, 70,150,194,200,178,165,211,162, 81, 64, 93, 98,252,159,215,107, 21,166,105, 88, 89,201, 84, 12, 21, 31, 48, 95,157,
-194, 1,168,162, 31, 85, 89,247,131,242,254,168,149,141, 22, 44,215,220, 90,182, 94,154,146,146,242,126,117,154, 28, 28,181, 49,
- 88,179,148,145,107,244, 0,108, 8, 33, 51, 35, 35, 35, 31,190,238,143,241,120,204,204,204, 67,195,215, 82, 32,143, 71, 48,243,
- 77,100,192,104, 52,206, 46,190,189,150,165,148, 90, 18, 66,102,220,186,117,235,181,210, 73, 13,134,241, 95,253,116,105,165,157,
-133,168, 83,118,190,230, 40, 8,169,116,214,118, 3,232,199,219,191, 76,252,210,202,142,223, 45, 47,203,112,140,101, 48,253,159,
-112, 66,163,162,162,150,120,123,123,243,126,248,225,135, 17, 90,173,246,165,142,239,117,214, 44,210, 78, 11, 82, 8,121,126,158,
-174, 19,158,196, 39,246,121, 80,100, 90,179, 96, 5, 68, 46, 46, 46, 81, 42,149, 10,132, 16,104, 52,154,151, 12, 85, 69,131,165,
-211,233,144,153,153, 9, 79, 79, 79, 84,152, 51,169, 90,202, 76,201, 17, 91, 91,219,139,107,214,172,233,177,110,221,186,150, 44,
-203, 94,209,233,116, 71,178,179,179,149,117,201,243, 95,161, 89,246,189, 79,100, 50,217,178,117,235,214,173,144, 72, 36,161,153,
-153,153, 23, 94, 71,179,204, 60,189,109, 99, 99,227,188,117,235,214, 61, 27, 55,110,108,193,231,243,175, 17, 66, 6,228,231,231,
-215,229,101,207,209,175,185,189, 38,246,253, 5,197,254,181, 53, 77,121,253, 77,173, 30, 38, 13, 6,229,204,153, 51, 51, 95,125,
-231, 96,197, 57,175, 42,254,213,106,181, 37, 38,104,178, 95,124,241, 69,181, 15,113, 21,141, 86, 73, 73, 73,141, 77,186,148,165,
-217,221,223, 29, 95,187, 58,146,165,217,127, 99, 21,119, 8,192,211,178,133, 86,179,173, 86, 89, 2,112, 22, 64, 60,165, 52,254,
- 21,221,138,235, 57, 56,222,140,193,138,140,140, 76, 2, 48,252, 77,254, 88,215,174, 93,207, 0,240,127,147,154,119,239,222, 77,
- 0, 48,244, 77,233,237,208,104, 98, 1,244, 28, 67,136, 96, 59,173, 58, 34, 85,214,161,189,223,223, 57,138,176, 42, 42,235,248,
-254,186, 84,214,241,189, 22, 55,155, 19, 98,177,152, 20, 22, 22, 66,167,211,161,168,168,232,133,185,170,104,178, 12, 6, 3, 8,
- 33, 40, 42, 42,130,153,153, 25,244,122,125,173,158, 20,203, 76,202,174,136,136,136,189,231,207,159, 55,188,137,124,255, 21,154,
- 42,149, 42, 29,192,123, 17, 17, 17,252, 55,165,153,147,147,147, 10,160,165,151,151,151,200,212, 40, 88,117,145,172,186,110, 55,
-129, 31,254,130, 34,255,243, 63,173, 98,141,143,143, 15,120,211,154,137,137,137,143,222,120, 58,175,109,155,252, 47,185, 87,209,
- 50, 51,186, 53, 49, 49,177, 30, 33, 36,241, 85,131, 85,221,182,234, 52, 1, 64, 36, 18, 29, 72, 74, 74,114, 22,139,197,169,166,
-172,231,224, 48, 5, 82,151,176,183,201,226, 92,251, 52,167,201,105,114,154,156, 38,167,201,105,114,154,117,255,157,209, 21,231,
-193,250, 55,241, 31,154, 54,142,131,131,131,131,131,131,131,227,159, 1, 1, 16, 84,217,134,218, 56, 83, 66, 72, 80,109,127,184,
- 38,125, 78,147,211,228, 52, 57, 77, 78,147,211,228, 52,255,123,154, 53,105,191, 50, 34,247, 95, 27,193,226,154, 8, 57, 77, 78,
-147,211,228, 52, 57, 77, 78,147,211,252,219, 53,171,248, 29,174,137,144,131,131,131,131,131,131,131,131,163, 20, 62,119, 8, 56,
- 76,193,213,213,117,105,243,230,205,199,223,188,121,243,235,196,196,196, 5,117,212,112,182,177,177, 89, 12,160, 37,165, 84,204,
-227,241, 30,101,103,103, 47, 73, 74, 74,186, 84,215,116, 57, 59, 59,187,217,217,217, 45, 6,208,130,101, 89,161, 64, 32,136,202,
-200,200, 88,148,146,146,114,173,174,154,118,118,118,114, 39, 39,167, 80, 74,169, 61,165,148, 17, 8, 4,121, 41, 41, 41,119, 51,
- 51, 51, 51,185,146,192,193,193,193,193,241,218, 6,107,254, 4,226, 4, 29,248,115,215,211, 36, 0, 32,132,152,163,116,210, 53,
-127, 0,143, 1,220,162,148,190,214, 43, 3,254, 45,154,255,116, 8, 33,140,165,165,101,103,153, 76,246,137, 82,169, 12, 54, 55,
- 55,143, 42,123, 61,206,225,178,201, 51,235,140,189,189,189,253,187,239,190, 59, 99,205,154, 53, 24, 49, 98,196,231,182,182,182,
-171,106, 59,111, 83, 64, 64, 64,111, 23, 23,151,245, 11, 23, 46,178,107,214,172, 25,145, 72, 36,136,141,141,117,153, 61,123, 86,
-211,166, 77,155,238,185,125,251,246, 71,181, 77, 87,195,134, 13, 7,184,187,187,175, 93,178,100,137, 93,104,104, 40,225,243,249,
-184,127,255,190,235,252,249,243,155, 5, 7, 7,111,189,115,231,206,148,218,106, 6, 5, 5,121,122,121,121,181, 92,180,104,145,
-164, 89,179,102, 16,139,197,120,244,232,145,124,214,172, 89,118, 77,155, 54,125,122,251,246,237,235,181,209, 11, 25,115, 91, 32,
-148,233,248, 0,160, 83, 9, 13,145,235,155,234, 77, 93,199, 85, 79, 28, 28, 28, 28,255, 65,131,181, 96, 28, 89,192, 0,179,192,
-128, 76, 26, 76,118,175,219,205,220,232,216,177,163,223,200,145, 35, 73,217,171, 35, 2,118,237,218,245, 54,143,199,123,194,178,
-236,117, 0,119, 41,165, 58, 19,205,128, 16, 64, 19,134, 97,154,255,147, 53,255, 13, 40, 20, 10,111, 59, 59,187, 41, 54, 54, 54,
-221, 66, 67, 67, 11,199,142, 29, 27,127,237,218,181,184,176,176,176,146,141, 27, 55, 46,209,235,245,223,249,248,248,156, 42, 42,
- 42, 90, 81,215,121,177, 4, 2,129, 63, 33, 4, 41, 41, 41, 16, 8, 4, 2,145, 72, 20, 0,192,100,163,225,230,230,230,228,236,
-236,252,195,238, 3, 39,236, 11, 53, 12,158,102,177, 0, 84, 48, 50,182, 88,184,124,157,205,138,197,159, 15,246,241,241,185, 28,
- 19, 19,243,139,169,154,206,206,206,110,238,238,238,107,207,158, 61,107, 47, 22,139,193,178, 44,138,138,138, 96,111,111,143,165,
- 75,151, 90, 47, 92,184,112,164,167,167,231,197,231,207,159, 31, 50, 85,211,206,206, 78,238,229,229,213,242,220,185,115, 18,145,
- 72, 68,244,122, 61,209,104, 52,112,116,116,164, 43, 87,174, 20,207,158, 61,219,215,211,211, 51,253,249,243,231,137, 38,153,171,
- 31,111, 11, 10,179,207,133,211, 36,245,231, 0, 64, 36,210, 69, 17,243,173,111, 20,102,159,107, 86,211,186,144, 31,113, 53,114,
- 52,103,178, 56,254,183, 56, 59, 59,183,242,244,244, 60,144,152,152,120,133,199,227, 13,140,143,143,215,188,174, 38, 33,196, 21,
-128, 39, 0, 43,148, 14,172,202, 69,233,228,157, 73,117,213,180,245,106,223, 11, 98,217,112, 80,218,132, 1, 0,134,185,203,234,
-138, 55,103, 71,159, 59,244, 90,154, 18,249, 8,176,108, 19, 6,148, 5,195,187, 71, 13,197, 63,101, 61, 62,119,140, 43, 25, 28,
-111,204, 96,205,255,144, 88, 49, 2, 76,159, 57,118, 52,195,231,241,200,146,245, 63, 14,186,121,229, 16,117,170,215,228,197, 43,
- 55,218,180,105,131, 54,109,218,144,229,203,151,251,159, 61,123,214,127,199,142, 29,122, 66, 72, 36,165,116, 75, 85, 63,182,116,
-162, 44,209,160, 87,187, 45, 24, 47, 45,241,104,241,221,142,150, 45,219,176, 98,177, 24,175,163, 9, 0, 31, 13, 16,156, 26, 49,
-192,147, 68,244,156,147,240,166, 52,255, 37,230,234,130, 66,161,240, 26, 51,102,204,211,113,227,198, 93,148,203,229, 20, 0, 50,
- 51, 51,229, 61,122,244,200,235,219,183,111,142, 74,165,194,247,223,127,239,182,118,237,218, 83,230,230,230, 41,133,133,133,205,
-106, 81, 49,242,157,156,156,150,117,234,212,105,242,123,239,189, 7,133, 66,129, 97,195,134, 65,163,209, 92,113,118,118, 94,158,
-150,150,246, 57,165,180,198,119,103, 88, 89, 89,205,157, 63,127,190,189, 82,203,195,231,219, 98,145,171, 44,245, 13, 50, 17,131,
-143,222, 18,227,253,247, 63,176,184,115,231,206,114, 0, 38, 27, 44, 59, 59,187,197, 75,150, 44,177, 43, 63,215, 74,165, 18, 74,
-165, 18, 69, 69, 69, 80, 42,149,120,239,189,247,204,159, 62,125,186, 26,165,179, 59,155,132,147,147, 83,232,162, 69,139, 36, 34,
-145, 8,135, 14, 29,106, 92, 82, 82,194,215,235,245,160,148, 26,252,252,252,238,126,240,193, 7,194,152,152,152,112, 0, 38, 25,
- 44,167,116, 8, 10,212,234,111,191,249,242, 51, 59, 0,248,120,250, 87,223, 2,234,230,212,132,117, 78,233, 8, 3,192, 25,172,
-234,203, 39, 15, 64, 63,129, 64,208,223,203,203, 43,244,233,211,167,119, 12, 6,195,175, 0,126,165,244,245, 38,255, 37,132,188,
-229,236,236,188, 56, 53, 53,245, 27, 74,233,246,255, 47,199,180, 65,131, 6,251,119,236,216, 97,115,244,232,209,222, 11, 23, 46,
-124, 23,192,214,215, 56,134, 2, 0,225,101,166,234,113,153,177, 66,153,209,242, 35,132, 52, 0,240,123,109, 30,120,109,125, 91,
-153,129,111,190, 43,188, 67,215,214, 3,222,238,171,176,179,182, 64,177,198,136,152,248,244,122, 39,143,238,111,231, 24,212,227,
-138, 65, 87, 48, 40, 59,250,119,101,109, 53,219,119,235,221,186,195, 91, 29, 21, 22, 22,150,200, 41,210,227, 89,124,178,251,133,
- 83, 7,219, 56, 4,245,184, 8,162, 31,154,113,255,164,138,187,234, 56,106, 3, 99,226,133, 2,185,153,188,210,109, 22, 22, 22,
-136,136,136,192,146, 37, 75, 4, 0, 90, 84,220,246,234, 8, 3,163, 81,235,244,249, 71, 19, 32,226, 83,113,143,110, 93,136,185,
-185,249,107,107, 2,128,131,181,161, 99,115, 95,117,187,140,187, 19,135,220,189,176, 56, 72, 91,146,255,167, 55,157,202,100, 50,
-120,123,123, 99,246,236,217, 38,105,190, 46,255, 11, 77, 74,169,115, 64, 64, 64,209,170, 85,171,124,231,204,153, 99, 85, 82, 82,
- 34, 7,224, 26, 16,220,202,153, 97, 24, 55,173, 86,171,152, 55,111,158,237,151, 95,126,233,107,103,103,151, 79, 41,181,171, 77,
- 58,157,156,156, 86, 45, 89,178,100,202,230,205,155, 73, 88, 88, 24, 20, 10, 5,194,195,195,177,109,219, 54,102,238,220,185, 51,
-156,156,156,150,153,152,247, 54,205,154, 53, 35, 44,128, 60,165, 1,231,150,134,224,247,175,194,160,210,178, 40, 40, 82, 66,173,
- 86, 67, 34,145, 72,109,109,109,205,106,113, 60, 91,132,134,134, 18, 0, 47, 76, 85, 81, 81,233,162, 84, 22, 67,171,213,129, 97,
- 24,115, 15, 15, 15,113, 45,142,167,125,179,102,165,254,179,164,164,132,223,187,119,111,244,236,217, 19, 69, 69, 69,252,194,194,
- 66,104,181, 90, 48, 12, 35, 44,187,177,215,168,169,149, 9, 8, 75, 89, 7,185, 76,106, 43,151, 73,109, 89,202, 58, 0,128, 41,
-235,180, 50, 1,249, 59,203, 39, 33,196,142,199,227,109,242,242,242,122,196,227,241,182, 18, 66, 28, 95, 71,147, 16, 18, 70, 8,
- 89, 34,147,201, 78, 7, 4, 4, 36,201,229,242,179,132,144,101,132,144,240,186,104, 18, 66, 68, 50,153,236,236,146, 37, 75,246,
-220,185,115,231,221, 51,103,206,120,222,191,127,255,237,229,203,151,239, 50, 51, 51,187, 72, 8,145,190,206,181,233,233,233,185,
-241,250,245,235, 97, 45, 91,182,220, 64, 8, 17,191,137,235,157, 16,194, 35,132, 4, 19, 19, 95, 60,248,191, 62,239,174,174,174,
- 94,193,193,193,182, 60, 30, 15,109,218,180, 1,165,180,205,107,106,182, 4,144, 78, 41,189, 64, 41,205,162,148, 26,203,150,108,
- 74,233,165,178, 7,149, 54,181,210,228,155,239,250,228,211,105, 93,167, 78,248, 80,113, 59,193,136,159, 78,166, 97,247,229, 44,
-164, 20,137,209,169,207, 8,139,118,221,223,235,194, 23, 90,236,170,173,230,140, 25,179,186,126, 56,108,136,226, 65, 42,131, 61,
-191,103,227,242,227, 66,168,136, 21, 34,250,140,182, 10,104,214,173, 7,129,112,203, 63,225, 28,253,215, 53,255, 95, 68,176,230,
-110,160,121, 11,198,145, 47,151,124,255,227,231, 12, 33,212,213,167,203, 67, 79,239, 22,197, 44,203, 66,173, 86, 67,167,211, 65,
- 32, 16, 64,173, 86, 35, 33, 33, 1,215,175, 95,135,133,133, 69,173,126, 56,191,160, 0, 46,174,158,144,201,100,111, 68,115,212,
- 59,125,249,137,105,105,252, 43,183,207,133,252,178,102, 71,136, 91,131, 78,143,155, 68, 76,123, 96,102, 81, 79,125,247,238, 93,
- 92,189,122, 21,121,121,121, 40,191,129,254, 71,158,224,245, 43, 86,172,184,157,154,154,138, 75,151, 46, 5,207, 95,253,179,199,
-131,194, 6,252, 44, 37, 21,216,153,101,184,251, 75,163,141,121,185,185,113, 83,166, 76, 57,235,228,228,164,157, 48, 97, 66, 59,
- 83,116, 93, 93, 93, 37,132,144,144,238,221,187,127,244,193, 7, 31, 32, 62, 62, 30, 83,167, 78,213,222,189,123, 55, 63, 36, 36,
-196,106,197,138, 21,194,209,163, 71,227,202,149, 43, 83, 92, 93, 93,247, 2,136, 74, 78, 78,174,238, 93,106, 34,137, 68, 2, 20,
-148, 62,168,234, 12, 20, 0,251, 34,242,196,208,124, 8,133, 66,134, 97, 24, 59, 0, 38, 61,121,178, 44, 43, 20,137, 68, 40, 46,
- 46,134, 82,169, 68, 74,150, 18, 9, 25,197, 40, 42,214, 64,173,214, 67, 83, 66, 33, 86, 56, 48,250,172, 44, 27, 0, 41, 38, 86,
- 24, 76,121,115,163, 86,171,133, 90,173,134, 86,171,133, 86,171,125,241, 58, 31, 30,143,167,112,113,113, 49, 7,144, 87,147, 30,
- 79, 36, 53,240, 24,225,146, 89,139,190,157, 7, 0, 60, 70,184,196, 12, 37,172, 41,235,120, 34,169,225,111, 44, 87, 98, 59, 59,
-187,115,123,246,236, 9,240,246,246,198,243,231,207,253, 7, 12, 24,208,156, 16, 18, 76, 41, 85,213, 82, 75,198, 48,204,151,195,
-135, 15, 31, 63,120,240, 96,226,227,227, 3, 62,159, 15,131,193,224, 26, 27, 27,219,126,247,238,221,211,249,124,254, 79, 70,163,
-113, 10,165, 84,105,162, 38, 35, 18,137,126, 89,191,126,125,219,230,205,155, 99,235,214,173,184,113,227, 6, 27, 22, 22,198,188,
-255,254,251,112,119,119,111,241,254,251,239,239, 35,132,244, 52, 37,194, 90,137,190,251,144, 33, 67,220,120, 60, 30, 90,182,108,
- 41,188,114,229, 74, 83, 0, 87, 94,243,152,154,185,186,186, 94,136,136,136, 8, 62,125,250,244,109, 66, 72,132,169,249, 5, 0,
-103,103,231, 62, 14, 14, 14,203, 21, 10,133,149,169,223, 81, 42,149,170,140,140,140,169, 41, 41, 41,123, 77, 44,255, 45, 27, 53,
-106, 4,131,193, 0, 11, 11, 11, 56, 58, 58,182,118,113,113,153, 98, 97, 97,209,175,176,176,112,114,114,114,242,141, 90,228,215,
- 5, 0, 67, 41,125, 90,246,217, 3, 64,249,107,150,162, 41,165,207, 41,165,113,132, 16,103, 66,136,155, 41,205,133,182, 94,237,
-123,181,236,216,189,117,155,230, 65,204,210,189,241, 48,178, 44,248, 48,130,207, 99,145,109, 20,128, 16, 2,119,223, 48,158,195,
-131, 91, 45,108,125, 59,245,202,142, 62,117,200, 20,205,174,189,251,182,241,243,245, 97,190, 62,144,136,252,148, 7,198,140,199,
-103,179, 9,195,160,126,147, 78,182,238,190,193, 60,175,224,183, 4, 25,241, 15,218, 91,123,183,235,152,251,244,194,105,206, 54,
-112,212,218, 96, 17, 66, 40,165,244,197,147,213,156,239,233, 28, 91, 43,226,241,240,193, 61, 38, 41, 93, 91,124,239,222, 61,216,
-216,216,192,222,222, 30,230,230,230,120,242,228, 9, 78,159, 62,141,232,232,104, 80, 74, 17, 28, 28, 92,171, 31,206, 72, 79, 71,
- 78,110,209, 27,213,172,231,228,132,122, 78, 78,252,236,188,124, 92,189,119, 63,224,208, 79, 29,253, 50,152, 49,155,213,106,245,
-139,125,244,250,255, 94,171,139,189,189,189,241,227,143, 39,228,140,250, 54,174,193,160, 14, 46,188, 62,225,142, 56,112, 37,141,
-183,235, 60,143,126, 62,178,113,118,108,108,140,201,153,118,119,119, 95,220,190,125,251,207,248,124,190, 96,244,232,209, 0,128,
-137, 19, 39,106,238,223,191, 31,152,148,148, 20,231,228,228,228, 55,121,242,228,251,251,246,237, 19,124,248,225,135,164,164,164,
-228,134, 64, 32,160,206,206,206, 11, 82, 83, 83,231, 85,106, 52,120,188, 59, 15, 31, 62,244, 48, 72,156, 97,171, 96,208,229,243,
-219, 0, 0, 51, 49, 69,118, 70, 10,162, 98,111,194,206,206,206,194,214,214,246,113,171, 86,173, 52, 25, 25, 25,159, 60,123,246,
-108, 75,117,233, 20, 8, 4, 81,247,239,223,119,117,112,112,128, 82,169, 68, 82,102, 49, 54, 93, 37, 80,105,164, 0,164,224, 65,
- 1,133,173,155,162, 62, 85,221, 13, 10, 10,210,105,181,218, 25, 49, 49, 49,219,107,208,204,123,244,232,145,220,197,197, 5, 60,
- 30, 79,183,123,247,110,161, 86,171, 5,165,212,112,244,232,209,129,249,249,249, 45, 27, 52,104,192,184,187,187,175,104,213,170,
-149, 58, 45, 45,109,212,243,231,207,171,124,209,240,241,137, 94,186,118,243,206,127,151,255, 60,105, 55, 0,184, 52, 15,200, 61,
- 60,175,169,182,221, 60,101,141,235,142, 79,244,210, 97,194,223,246,234,179,225,179,102,205, 10,176,182,182,198,216,177, 99, 49,
-127,254,124,204,153, 51,199,123,236,216,177,163, 1,172,170,197, 77, 86,234,232,232,120,115,205,154, 53,254,173, 90,181,194,209,
-163, 71,177,115,231, 78,196,197,197, 25, 60, 61, 61,249,205,155, 55,199,220,185,115,209,165, 75,151, 81, 19, 38, 76,104, 71, 8,
-105,106,162,233, 24, 49,119,238,220, 62,173, 91,183,198,176, 97,195, 52,231,207,159,127, 23,192,201, 83,167, 78,117,184,112,225,
-194,222,159,127,254, 89,186,100,201,146,174,147, 39, 79, 30, 7,224,155, 58,228,191,111,219,182,109, 1, 0,173, 91,183,198,242,
-229,203,187,188,142,193, 34,132,136,108,108,108,142,108,221,186, 53,216,215,215, 23, 67,135, 14,109,250,238,187,239, 30, 33,132,
-116,162,148,154,244,222, 72, 39, 39,167, 47,215,175, 95,239, 37,149, 74, 77,254, 93,173, 86,107, 61,102,204,152,101, 0, 76, 54,
- 88, 65, 65, 65, 56,127,254, 60, 58,118,236,136,134, 13, 27,122,141, 25, 51,102, 69,151, 46, 93,240,233,167,159, 94,118,116,116,
-116, 78, 79, 79, 55,245, 69,207,238, 0,158,148,229,191, 30, 0,111, 0,191,151,109,107, 78, 8, 1,165,244, 57, 74, 95, 30,238,
- 7,160,230,254, 88, 18,249,240,222, 61,123, 42,126,189,146, 9, 35,203,194,223, 69,130,128,122,230,136,207, 44, 65,124, 74, 14,
- 4, 68, 7,133, 84,140, 70, 45,123, 88,229,102,196, 15,135, 41,221, 3,196,178,225,125,123,247, 52,219,127, 53, 19,249, 41, 81,
- 52,225,230,238,179,250,146,226, 81, 0,240,240,226,246, 31, 28,172, 36,157,124,154,132,240, 84,109,250, 88, 93, 56,240,253,112,
- 0,156,193,250,235, 31,240, 94,242, 34,255,185, 8, 86, 57, 57,249, 80,219, 56, 6, 32, 41,253, 78,233,231,156, 28,228,228,228,
-160,126,253,250, 88,187,118,237, 75,251,150,148,148,212, 41, 1,127,133,166,173,149, 37,122,183,111,199,123,240,228,123,158,154,
- 85,191, 17,205,127, 42,148, 82, 74, 8, 33, 9,217,122,203,236, 66,189,112, 96,123, 55, 42,224, 49, 24,212,190, 30,249,230, 80,
-130, 48, 91, 45,179,228,241,120,140, 41, 79,242, 33, 33, 33,130,246,237,219,127,182,113,227, 70, 65, 90, 90, 26, 44, 45, 45,161,
-215,235,113,231,206,157,212,212,212,212, 56, 0, 72, 75, 75,123,226,234,234,154, 97, 52, 26, 93,253,253,253, 49,102,204, 24,248,
-249,249,145, 41, 83,166, 76, 39,132, 44,168,108,196, 98, 70, 70,198,146,217,179,103,183, 93,188,124,173,205,144,230, 4,197, 42,
- 45,148, 74, 37,226, 99,162, 64,149, 90,124,253,245, 74, 72,165, 82, 2, 64,152,149,149, 37,156, 55,111,238,134,208,208,208,158,
-183,110,221,234, 95,165, 65,207,200, 88, 52,119,238,220,102, 95,127,253,181,181, 82,169,132,186,164, 4, 69,106, 17,174,175, 44,
-141, 80, 54,159,124, 3,223,124,181,130, 9,114,151,219, 40,149, 74,124,246,217,103,107,130,131,131, 91,220,185,115,103,124, 85,
-154, 41, 41, 41,119,103,205,154,101,183,110,221, 58,177,159,159,223,253,194,194, 66,228,229,229, 49,251,246,237, 91,232,238,238,
-110,189,102,205, 90, 34,147,201, 0, 0, 73, 73, 73,194,207, 63,159,253, 75,163, 70,141,126,190,127,255,254,176,170,206, 13, 0,
- 13, 33, 72,115,118,174,239,165,186,202,204,115,118, 46,185,124,126,110,202, 54, 66,144, 86,186, 15,168,211,122,167, 33,137, 91,
-197,173, 53, 26,118,117,122,122, 66, 52,165,160,152,251,247,189, 87,214,214,214,118, 66,159, 62,125,176,108,217, 50, 28, 58,116,
-104,178,181,181,245,202,249,243,231,195,217,217,249, 99, 66,200,106,106,250,236,196, 95,173, 90,181,202,223,223,223, 31, 31,124,
-240,129,246,244,233,211,179, 0, 28, 0,144,112,233,210,165,122, 91,182,108,233,245,203, 47,191, 44, 91,179,102,141,100,221,186,
-117, 94,111,191,253,246,106, 0, 35,107, 18,117,112,112,248,116,240,224,193, 88,177, 98, 5,206,159, 63,255, 54,165,244,104,217,
-166, 99,132,144, 94, 75,150, 44, 57,243,249,231,159, 99,213,170, 85,147,106,107,176, 8, 33,102, 1, 1, 1, 95,116,237,218, 21,
-151, 46, 93, 66,155, 54,109, 16, 30, 30, 62,153, 16,178,150, 82,154, 93,135,155, 5, 99,102,102,246,203,230,205,155,219,120,120,
-120, 96,209,162, 69,248,236,179,207,176,113,227,198, 54, 67,135, 14,253,133, 16,210,223,148, 81,190,102,102,102,102, 82,169, 20,
-203,150, 45,163,137,137,137, 53, 70, 79,157,156,156,172,190,248,226, 11, 98, 97, 66, 51, 0, 33,132,231,236,236,108,225,232,232,
-216,214,209,209, 17,107,214,172,129,189,189, 61, 38, 79,158, 12, 27, 27, 27, 20, 23, 23,163,127,255,254,130,107,215,174, 13, 2,
-176,214,196,172,219, 0, 40,143,120, 5,160,180,175, 85, 81,217,239, 93, 3,208, 26,192,115,148,246,203,178, 54, 69,144,161, 52,
-200,202,210, 28,169,247, 51,192,135, 1,254,245, 20,184, 21, 91, 12,157,145, 66, 38, 55, 67,113, 81, 62,154,120,217,161, 80,229,
- 10,128, 53,105,246,113, 33,143, 9, 17,137,165,200, 44, 44, 64,250,163, 51, 57, 58,163,102, 76,126,220,229, 36, 0,176,110,208,
-118, 76,212,245,227,183,250,119,107, 99,159,149, 87, 15,148,178,205,192,193, 81, 11,106,236,131,197,178,127,190,246, 43, 70,132,
-202,209,233, 94,111, 96,222, 95,161, 89, 25,127,133,230, 63,193,103,185, 88,241, 11,228, 18,198,112,234, 86,166, 81,111, 48,226,
-196,173,116,163, 76, 76, 12, 86, 98,109, 33,203,178, 38,221, 16, 35, 35, 35,245,151, 46, 93,218, 58,115,230, 76,172, 90,181, 10,
-207,158, 61,131, 64, 32,128,175,175,175,131,155,155,155, 19, 80, 58,122,175, 97,195,134,182, 60, 30, 15,177,177,177,216,185,115,
- 39,230,205,155, 71, 35, 35, 35, 55, 86,117,163, 72, 77, 77,189,147,145,145,177,126,233,130, 89,249, 2, 77, 42,100,198, 44, 24,
-243,159, 65, 96, 44,192,132,201, 51,241, 60,219,136, 59,207,139,112,231,121, 17,210,213, 18,124,177,232,107,158,183,183,119, 47,
- 87, 87,215, 46,213,152,161,107,105,105,105,219,230,204,153, 83,144,157,157,253,162,252,232, 12, 44,116, 6,246,213,155, 19,150,
- 46, 93,106,233,228,228, 52,208,197,197, 37,162, 42,205,204,204,204,204,212,212,212,216,153, 51,103,234,178,178,178, 80, 88, 88,
-136,227,199,143,191, 93,191,126,125,235, 41, 51, 23,144,231,217,244, 69, 58, 11, 88, 75,172, 88,251, 19,175, 65,131, 6,239, 57,
- 59, 59, 87,219,143,200,217,217,197, 43, 32,160,193,158,107,215,174, 13,243,242,242, 26, 95,110,172, 40, 5, 5, 0, 79, 79,207,
-177,145,145,145, 35,130,131, 3,247, 56, 56, 56,250,253,205, 79,143,237, 7, 14, 28,232,199,178, 44,246,236,217,115,159, 82,186,
-106,255,254,253, 55, 53, 26, 13, 6, 13, 26,228, 9,160,171,137, 58, 97,239,189,247,222,248, 54,109,218, 96,210,164, 73,186,211,
-167, 79,135, 80, 74, 87, 82, 74,227,105, 41, 9,148,210,181, 23, 46, 92,104, 50, 97,194, 4, 77,179,102,205, 48,108,216,176, 17,
-132,144, 54, 53,232,182, 28, 60,120,176, 63,203,178,216,181,107,215,189, 10,230,170,220,212,158,221,187,119,239, 53,173, 86,139,
- 33, 67,134,212, 39,132,116,168, 69,222,133, 98,177,120,207,194,133, 11, 45, 83, 82, 82,240,254,251,239,107,158, 60,121,130,121,
-243,230, 73, 45, 44, 44,142, 18, 66,204,106,123, 60,197, 98,241,143,223,127,255,125,159, 70,141, 26, 97,220,184,113,218,239,190,
-251,110,226,248,241,227,181, 33, 33, 33,248,246,219,111,251,136, 68,162, 90,205, 80,157,145,145,145,127,254,252,121,155,154,150,
-244,244,244, 12,147,162,254,245,234, 89, 54,108,216,240,126, 88, 88, 88,118,227,198,141, 27, 0, 64, 84, 84, 84,214,158, 61,123,
-168,141,141, 13,142, 31, 63,142, 31,127,252, 17,173, 90,181,130, 66,161, 24, 84,155, 58,169,108, 65,133,191,175,110,127,117,191,
-154, 78, 16, 45, 80, 25,192,103, 24, 8,120, 20, 9, 25, 37,208, 25, 41,132, 2, 6, 2, 30,192,103, 40,108, 20, 2, 8, 4, 60,
- 0,196, 36, 77,134, 16,228, 21,235,193,231, 17, 8, 68, 66,194, 24,140, 47, 66,132, 12,223, 40, 21, 75,196,196,222, 66, 8, 33,
-159,128, 16,112,112,188,185, 8, 22, 0, 24,141,127, 14,124, 84, 22, 5,210,106,181,175,149,144,191, 66,179,138,176,249,127,234,
- 4, 22, 22, 22,242, 47, 92,184, 96, 33, 16, 8,228, 61, 27,181,202,249,114,119,140,237,252, 29,209, 16,241, 64,122, 53,102,210,
-206,159, 59, 77,242,242,242,172,188,189,189,243, 76,209,123,246,236,217, 40, 39, 39,167, 69, 12,195, 52, 51, 26,141,187, 87,173,
- 90,133,111,190,249, 70, 54,118,236,216, 39,206,206,206, 41, 62, 62, 62,110,171, 87,175, 22, 3,192,182,109,219,112,226,196,137,
-190, 2,129,224, 70, 66, 66, 66,122,117,186,119,239,222,253,220,221,221,253, 74, 92, 92,220, 90, 66,136,165, 66,161,176,218,191,
-127, 63, 73,203,215,226,243,109,207, 94,140, 44,148,139,121,152,217,207, 14,239,188, 51,128,255,244,233,211,175, 0,156,168, 74,
-243,246,237,219,147, 61, 61, 61, 47,196,196,196,172, 18,218,248,218, 72,130, 70, 43, 58,204, 44,109,126,116,178, 22,131, 41,171,
- 16, 11, 10, 10,144,157,157,141, 17, 35, 70, 88, 46, 94,188,120, 58,128,243, 85,105,222,185,115,231,154,167,167,103, 90, 76, 76,
- 76, 11, 74,169,200,194,194,162,213,170, 85,171, 72, 66,174, 22, 51,182,196,162,168,164, 52,157, 10,137, 0, 11, 6,187, 98,216,
-176, 97,252,231,207,159,127, 89,246, 68,254, 39, 92, 92, 92,188, 3, 2, 2,246,236,216,177, 35, 96,245,234,213,185, 79,159, 62,
- 45,118,118,118,158,255,202,110,154,165, 75,151,230,108,219,182,205,247,253,247,223,223,227,232,232,248,110, 93,167,212,120, 93,
-204,205,205,151,141, 25, 51, 6,191,252,242, 11,242,242,242, 86,151,149,177, 85, 59,118,236,216, 53,106,212, 40,108,219,182,109,
- 25, 33,228,184, 9, 81,172,110,131, 6, 13,194,177, 99,199,112,230,204,153, 47, 40,165, 15,171,136,242,197, 16, 66,166, 31, 60,
-120,112,205,224,193,131,177,105,211,166,174, 0,170,155,120,182, 83,151, 46, 93,112,244,232, 81,228,228,228,124, 91,217, 14,249,
-249,249,223,253,246,219,111, 45,186,116,233,130,165, 75,151,118, 2,112,214, 4,115,229,111, 97, 97,177,121,205,154, 53, 97,141,
- 26, 53,194,123,239,189, 87,162,211,233,186,126,246,217,103,135,118,238,220,169,216,186,117,107,232,232,209,163,175, 19, 66, 62,
-164,148,154, 52,137, 45,143,199, 91,178,110,221,186,145, 17, 17, 17,152, 60,121,178,225,196,137, 19,189, 41,165, 39, 9, 33,177,
-211,166, 77, 59,242,245,215, 95,243, 86,172, 88, 49,146,199,227,101, 25,141,198, 89,127,147,161, 94,241,245,215, 95, 7, 4, 6,
- 6,162,164,164, 4,207,158, 61, 67, 70, 70,198,142,227,199,143,159,124,240,224,193,242,244,244,244,125, 14, 14, 14,163, 38, 79,
-158,236, 26, 22, 22, 22,230,234,234,106,149,156,156,108, 74, 93, 82, 30,153,202, 4,240, 8, 64,139,178,200, 21, 0, 52, 71,105,
-211, 32, 80, 58,162, 48,207,196,196,222,143,121,158, 82,223,202,204, 28,121,172, 8,207, 83,178, 33,149,203,193, 80, 6, 6,117,
- 30,188,221,237,193, 82,160, 48, 59, 5, 12, 67,238,155, 34,169, 55,178,145,241, 73, 25, 46,150,114, 9,188, 67,186,219,220, 59,
-187,105,187, 69,131,214,163,249, 60,194, 19,138,205,215,191, 55,248, 3, 91,189,145, 66,153,151, 6,194, 99,110,128,131,227, 77,
- 26, 44,150,101, 33,149, 74, 95,138, 48,189, 26, 5,146, 74,165,208,104,106, 55, 93,138, 84, 42,133,206,128, 55,170,105,202,111,
-190,105,205,191, 19,189, 94,175, 24, 63,126,124,235, 22, 45, 90, 36,117,235,214, 45,214,223,223, 46,190, 71, 75,137,237,186,141,
- 7,131,187,181,107,120,167, 48, 55, 35, 43, 65, 44, 46,201,203,203,179,217,182,109, 91, 83,189, 94, 47, 51, 69, 55, 45, 45, 45,
- 17, 64,162,139,139, 75,143,246,237,219, 15,237,217,179, 39, 46, 94,188,168, 40, 46, 46,246,151,203, 75, 71,147,238,219,183, 15,
-191,253,246,219, 79,169,169,169, 7, 77, 77,111, 66, 66,194,113, 0, 94,245,234,213,179,172, 87,175, 94,134,165,165,165, 48,165,
-168,248,197,200, 66, 33,159, 65,171,207,110, 34,191,176, 8,150,150,150,144,201,100,158, 53,105,150,205,115,117,168,217,192,133,
-141,120,113, 59, 46,172, 91,179,218,162,252,201,212,193, 82,136,252,252,124,100,103,103, 35, 43, 43, 11,148, 82, 24,141,198, 0,
- 19, 52, 19, 1, 36,218,218,218, 58,121,123,123, 19, 51, 51, 51,208,220, 98,228, 41,117, 47, 53, 65, 22, 41,139,225,226,226, 2,
-133, 66, 81,105,115,132,181,181,181, 66, 44, 22,111,217,176, 97,131,191, 66,161,224,141, 26, 53,202,114,212,168, 81,173,171, 50,
- 99, 50,153,140,183,105,211, 38,159,224,224,224,205, 30, 30, 30,157,226,227,227, 11,254,135, 55, 90, 30,128,177, 83,167, 78, 13,
-149, 72, 36,248,230,155,111,226, 0,252, 92,182,121,207,119,223,125, 55,103,240,224,193,126, 19, 39, 78,108,248,249,231,159, 79,
- 46,107, 42,172,178,217, 89, 40, 20,134, 4, 4, 4, 96,255,254,253, 0,176,191,134,159,223,123,229,202,149, 53, 61,123,246,132,
- 68, 34, 9,171, 97, 95, 79, 55, 55, 55, 28, 60,120, 16, 0,238, 84,229,147,159, 60,121,130,254,253,251,131, 16,226,105, 66,222,
-251,116,238,220,121,239,210,165, 75,249, 10,133, 2, 35, 71,142,212, 94,191,126,189, 59,165,244, 34, 33,164,253,144, 33, 67, 46,
-252,252,243,207,242, 11, 23, 46,248, 47, 94,188,248, 10,143,199, 91, 98, 52, 26, 63,175, 65,115,196,162, 69,139,102,246,237,219,
- 23,243,231,207,167,187,119,239,126,143, 82,122,178,204, 84,158, 32,132,188,111,101,101,245,243,236,217,179, 73, 65, 65,193, 76,
- 66, 72, 50,165,244,251,170,244, 84, 42, 85,129,209,104,116, 84,169, 84, 38, 61, 33,154,186,127,253,250,245,187, 5, 6, 6,226,
-224,193,131,232,213,171, 23, 78,157, 58, 5,134, 97,142,164,164,164,156, 3,112, 18, 0,156,156,156, 44, 98, 99, 99, 39,183,105,
-211,134, 57,125,250,116,127, 0, 63,153,144,132,231, 0, 26, 1, 56, 69, 41, 77, 42, 27, 56,217, 18,165, 83, 54, 60,162,148,150,
- 79,117, 18, 4, 32,214,148, 60,177, 90,229,214, 51, 71,247,182,239,244,246,120, 11, 30,143, 1, 31, 66,168,138, 10, 1,163, 17,
- 94,238, 14,104, 22,224,128,123,241,106, 92, 57,189, 39, 95,165, 84,153, 52,189,132, 81, 87,188,249,204,241,131,237,194, 58,127,
- 96, 33,246, 10,132,155,195,164,224,168, 27, 39, 79,137, 69, 66,242,246,219, 3, 44,219, 55,243,198,153,251,133,184,118,230, 64,
-158,170,168,112, 51,103, 25, 56,234,100,176,170,232, 84,150, 57,121,242,100,251, 41, 83,166,192,220,220, 28, 57, 57, 57,208,235,
-245, 47,162, 77, 98,177, 24,150,150,150,200,201,201,193,174, 93,187, 80,246,180, 82,205, 19,157, 40,109,209,183,235,220, 8, 79,
-174, 21, 75,101,212, 90,246,250,154, 0,160,213,243, 51,191,223,181,207,186, 91,219,112,126, 61, 39,167, 63,109,175,139,230,191,
-196, 96,157, 74, 79, 79, 15,245,243,243, 75,119,119,119, 87,151,148,148,128,170,213, 69, 71,119,173,110,224,102, 49,238, 25,195,
- 48, 84, 42,149,178,150,150,150,197,207,158, 61, 35, 6,131,225, 92,109,244, 41,165, 99,199,142, 29,203, 92,186,116,233,189,161,
- 67,135,194,195,195, 3,119,238,220,193,182,109,219,176,119,239,222, 45, 66,161,112, 98, 93,210,157,148,148,164, 12, 8, 8,120,
- 41, 2,242,234,200, 66,189, 38, 11, 44,203,154,220, 57, 63,239,246,182,104,158,173,173,190, 97,189, 63,166, 19,201,203,203, 67,
- 86,153,185,170, 96,178, 76, 14, 97, 18, 66,138,180, 90,237, 43,233,252,163,249,177,184,184, 24, 58, 77, 38,140, 70, 99,165,154,
-185,185,185, 69,206,206,206,235,214,174, 93,251,245,194,133, 11,237, 87,173, 90,149,251,248,241,227, 66,134, 97, 74, 94,121,136,
-145,120,121,121, 41, 86,172, 88,225,176,118,237,218, 92,150,101,215,253,143,205, 85,223, 70,141, 26,109,233,214,173,155, 98,252,
-248,241, 88,187,118, 45,210,210,210,102, 80, 74, 13,101,229,128, 37,132, 76,251,246,219,111, 15, 79,159, 62, 29, 58,157,110,197,
-209,163, 71,231, 19, 66,198, 82, 74,127,174, 76,211,206,206,206,149,207,231,227,246,237,219,133,148,210,103, 53,148,179,116, 95,
- 95,223, 12, 66,136,131,147,147, 83,131,234,246,181,182,182,246, 82, 40, 20, 72, 73, 73, 41,191,137, 87, 70,124,106,106, 42, 21,
-137, 68,196,217,217,217,187,166,252, 91, 89, 89, 77,219,176, 97, 3,255,220,185,115,152, 59,119,110,114, 66, 66,194,144,178,105,
- 4, 64, 41,189, 77, 8,105,211,190,125,251,157,211,167, 79,247,253,242,203, 47,201,147, 39, 79,198, 1,168,214, 96,185,187,187,
-143, 29, 49, 98, 4,214,173, 91,135,245,235,215,143,163,148,238,121, 37,207, 59, 9, 33, 86, 54, 54, 54,235,198,140, 25,131,205,
-155, 55, 15, 1, 80,165,193, 74, 73, 73,153, 62,112,224,192, 57,185,185,185, 75, 76, 57,167,166,236,239,236,236,220,123,232,208,
-161, 14,148, 82,172, 93,187, 54,125,221,186,117,170,194,194,194,159, 83, 83, 83, 95,170, 39, 24,134,217,119,252,248,241,201,227,
-199,143,199,185,115,231,190,113,118,118,166,169,169,169, 27,106, 56,167,105,132,144, 6,132,144, 0, 74,233,163,178, 81,130, 73,
-175,148, 59,223,178,125,147, 77,201, 83,118,244,185, 67, 14, 13,187,255,126,247,198,249,206,158, 13,219, 8,236,173, 20,112,241,
-182,133,181,153, 16, 20,192,131, 4, 53,174, 93, 60,169,207, 76, 75,188, 98,202, 8,194,114, 77,199,160, 30, 87,100,182,238,157,
-235, 7,182,230,123,122,251,160, 83,171,198, 86, 54,230, 2,104,245, 20,167,238, 22,224,234,133, 99,250,204,140,164,115,220, 8,
-194,255, 13,255,149, 14,238,166, 68,176,230,173, 95,191,190,213,198,141, 27,123, 78,158, 60, 89,241,193, 7, 31, 64, 42,149,162,
-184,184, 24,110,110,110, 48, 24, 12, 56,122,244, 40,110,223,190, 93,196,178,236, 97,252, 49, 74,164,252, 2,122,233,109,219, 51,
-215,170,234, 17, 66, 24,160,184,213,252,245,141,223,136, 38, 0, 92,137, 51,184, 56,167,101,207,203,201, 59,250,169,187,139,147,
-176, 75,235, 22,124, 91,171,210,209,204,117,213,124, 3, 55,173,191, 92,211, 96, 48,140, 32,132, 52,156, 54,109,218,114, 23, 23,
- 23,231,249,243,231, 39, 6, 6, 6,170, 11, 11, 11,169, 86,171,101,179,178,178,100,123,247,238,245,204,201,201, 41,210,235,245,
-239, 83, 74,239,213, 38,157,169,169,169,106, 0, 67, 28, 29, 29, 15,102,102,102,238, 29, 52,104, 16, 54,111,222,140,171, 87,175,
-246, 72, 77, 77, 61, 90,215,188, 83, 74, 13,225,225,225,249, 81, 81, 81, 14, 60, 11, 79, 56, 88, 10,208,245,139,210, 96,132, 66,
- 12,168,139,139, 16, 23,243, 8,133,133,133,183, 76,213,140,141,141,213, 6, 7, 7,231,103,101,101,217,218,217,217,149,154,171,
- 10,198, 42, 55, 55, 23, 5, 5, 5,148, 97,152,223, 77,213,204,202,202, 42,110,217,178,165, 42, 54, 54, 86,196, 19, 57,193,201,
- 74,140,210, 38, 72, 10, 59, 5, 31,106, 85, 49,238,223,185,133,194,194,194,243, 85,105,166,166,166,238,114,118,118, 6,128,175,
-231,204,153, 99,219,181,107,215,167, 55,110,220,104, 87,241,119, 66, 66, 66, 14,204,159, 63,191,199,226,197,139,179,183,108,217,
- 50, 61, 45, 45,109,251,255,178, 44,217,216,216, 76, 57,114,228,136, 66,167,211, 97,237,218,181, 88,185,114,229, 70, 74,233,190,
- 87,206,217, 17, 30,143,247, 45,195, 48, 31,125,252,241,199, 24, 51,102,140, 44, 52, 52,116,114,133, 40,215, 75,154, 41, 41, 41,
-159,135,132,132,204,201,204,204, 52,201, 16,196,196,196,140, 14, 9, 9,249, 60, 51, 51,115,121,117,121,151,203,229,114,163,209,
-136,231,207,159,231, 81, 74, 11,170, 40, 95, 37, 62, 62, 62, 41, 70,163,209, 85, 38,147, 89,215, 84, 62,243,242,242,150,132,134,
-134,206,203,200,200, 56, 9, 96, 17,165,180,228, 21,189,187,132,144,134,159,124,242,201,132,101,203,150,245, 79, 79, 79,223, 85,
-147,102, 66, 66,194,146,246,237,219,127, 17, 29, 29,189,133, 82,186,190,138,116,126, 67, 8,209,109,223,190,125,220,243,231,207,
-151, 86,167,153,154,154,122, 24,192, 97, 83,207,111, 85,251, 87,212,180,182,182,158, 62, 97,194, 4, 28, 59,118, 12, 69, 69, 69,
-107, 82, 83, 83,191,172,194,172, 93,243,244,244,252, 45, 60, 60,188,247,138, 21, 43,132, 61,122,244, 24, 7, 96,131, 9,229,243,
- 42,128, 86,101,253,224, 30, 3,200, 41,247,201, 40, 29, 57, 72, 94,173,139,107,210, 52,234, 11, 7,223,185,180,127,103, 82,236,
-253,240,144,118,125,173, 10, 84,174, 16,242, 25, 40,243,210,112,245,244,175,121,169,201,207,174,106, 75,242, 7,215, 70,211,160,
- 43, 24,116,255,242,129, 93,233,241,143, 90,168, 90,117,183,202, 47,114,135, 80, 64,144,159,149,140,235,231, 15,230,166, 37, 62,
-191,164,103, 53,195,254,174,122,254,255,147,230,127, 13, 98,202,128, 32, 66,136, 8, 64, 71,133, 66,209,233,211, 79, 63, 21,117,
-237,218, 21,139, 23, 47,198,169, 83,167,180, 90,173,246, 20,128,211,149, 69, 6,170, 59, 1,127,133,102,183,230, 68,225,232,192,
-172,246,112, 98,134, 4,122,123,145,168,152, 39,252, 91,169, 61,127,124, 29,205,127, 75,129, 38,132,180, 22, 8, 4, 95,250,251,
-251,107,226,227,227, 3,173,173,173,163, 83, 82, 82, 68,122,189,126, 26,165,244,226,235,164,211,209,209,209,182,123,247,238,153,
-179,103,207, 38,243,231,207,199,197,139, 23, 45,171,139,176,152,162, 89,175, 94,189, 14,161,161,161, 39, 86,125,179,129,159,144,
-161, 68, 97, 81, 17,138,138,138, 80,172, 84,162,164, 48, 29,199, 14,236,212, 62,120,240,192, 55, 61, 61, 61,193, 84, 77,119,119,
-247,174,141, 27, 55,222,185, 97,195, 6,139,156,156,156, 23, 6, 43, 55, 55, 23, 44,203, 98,253,250,245,185, 57, 57, 57,141,146,
-147,147, 83, 77,213,244,240,240,232,211,170, 85,171,189,203, 87,255,192, 79,202, 80,162,168,184, 24, 42,149, 10, 37,106, 53,116,
-202, 12,108,249,113,173,230,209,163, 71, 30, 89, 89, 89, 25,213,105, 58, 59, 59, 15,108,221,186,245,130,251,247,239,159,123,242,
-228,201,216,138,219,124,124,124,190,109,210,164, 73,247,223,127,255,125, 78, 74, 74,202,182,255,117, 89, 34,132,116,117,113,113,
- 89,153,149,149, 21,167,211,233,246, 80, 74,183, 85,243,189, 65,124, 62,127,144,173,173,173, 67,122,122,250, 50, 74,233,254,255,
-101,153, 39,132,244,180,183,183,159,149,153,153,185,140, 82,250, 91, 53,223, 43,223,111, 57,165,244, 0,119, 3,251,179,166,179,
-179,115, 79,123,123,251, 5, 25, 25, 25,231,210,211,211,167, 85,215,228,235,234,234, 42, 97, 89,118,129,131,131, 67,203,244,244,
-244,175,211,210,210,126, 53, 53,157,101,175,202,241, 64,105,127, 43,160,180,207, 85, 66,117,115, 95,213,164,105,235,219,169,151,
- 88, 38, 29, 78, 89, 99, 19,128,128,225,241,238,150, 20,171, 54, 87, 23,185, 50, 69, 83, 34,151,141, 96, 89, 99, 19, 6,132,101,
- 24,230,158, 90,173,250, 41,235,241,169, 99,156, 25,250,251, 12, 22, 33,100, 52,165,244, 71,252, 11, 33,166,143,184, 46, 29,194,
- 12,160, 7,195, 48, 45, 89,150,189, 2,224, 72,117,243,214,152,114, 2,254, 10,205,110, 17,196,197,195,150,183, 94, 33, 99, 66,
-151,109,209,127,242, 38, 52,255, 45, 5,154, 16,210,135,207,231,127,102, 48, 24,190,162,148, 30,124, 83,233,244,241,241,217, 16,
- 17, 17, 49,252,196,137, 19,223, 37, 36, 36, 76,120, 19,154,129,129,129, 95,215,175, 95,127, 66,143, 30, 61, 4,246,246,246,200,
-206,206, 70, 76, 76, 12, 34, 35, 35,181,233,233,233, 99,159, 60,121,178,165,182,154,141, 27, 55, 94,104, 99, 99, 51,246,195, 15,
- 63,180, 33,132, 32, 39, 39, 7, 69, 69, 69,116,223,190,125,217,106,181,250,195, 39, 79,158, 28,174,173,102,163, 70,141,126,244,
-244,244, 28,214,183,111, 95,129,139,139, 11,178,179,179,241,240,225, 67,252,254,251,239,154,244,244,244,161,209,209,209,251, 76,
-209,244,242,242, 18,197,198,198, 86,218,156, 24, 18, 18, 34,136,140,140,212,115, 21, 46,167,201,105,114,154,156,193,250,111, 24,
- 44,126,109,118, 46, 51, 41,187, 8, 33,123,203,251,103,188, 46,127,133,230,177,243, 52, 5, 64,119, 66, 8,255, 77,105,254, 91,
- 40, 51, 85, 7,223,180,110, 76, 76,204,135,206,206,206, 19,203,154, 13,223, 8, 15, 31, 62,156,226,226,226,178, 61, 62, 62,126,
-133, 76, 38, 11,102, 89, 86,175,209,104, 46,231,228,228, 76, 78, 77, 77,173,211,139, 96,239,221,187,247,133,179,179,243,129, 21,
- 43, 86,204,160,148, 54, 38,132,104, 13, 6,195,149,188,188,188, 5, 73, 73, 73,105,117,209,188,127,255,254,104, 23, 23,151, 77,
-241,241,241, 75,197, 98,113, 99, 74,169, 86,173, 86,159,207,204,204,252,180, 60,114,101, 10, 85,153, 43,160,116,138, 12,112,112,
-112,112,112,252,103,224,215,229, 75,127,133,105,249,183,104,254,127,230, 77,154,171,114, 82, 82, 82,238, 1,120,235, 13,167,243,
- 14,128, 1,111, 56,157,215, 1, 68,112,165,128,131,131,131,131,195, 20, 24,238, 16,112,112,112,112,112,112,112,112,188, 89, 8,
- 74,231, 33,249, 19,181,105, 91, 37,132, 4,213,246,135, 77,232, 75,196,105,114,154,156, 38,167,201,105,114,154,156,230,127, 76,
-179, 18,237,183, 95,217,148,242,138,222,127,191,147,123,173,197,185, 14,128,156, 38,167,201,105,114,154,156, 38,167,201,105,254,
- 63,132,107, 34,228,224,224,224,224,224,224,224,224, 12, 22, 7, 7, 7, 7, 7, 7, 7, 7,103,176, 56, 56, 56, 56, 56, 56, 56,
- 56, 56,131,197,193,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14,142,127, 12,127,233, 40, 66, 14, 14, 14,
- 14, 14, 14, 14,142,255,143,188, 20,193, 34,132,112,110,139,131,131,131,131,131,131,227,111,227,191,226, 69,184, 38, 66, 14, 14,
- 14, 14, 14, 14, 14, 14,206, 96,113,112,112,112,112,112,112,112,252, 11, 12, 22,215, 52,200,193,193,193,193,193,193,241,119,242,
- 95,243, 34,229, 17,172,136,178,140, 69,112,167,152,131,131,131,131,131,131,227,111,224, 63,229, 69,184, 81,132, 28, 28, 28, 28,
- 28, 28, 28, 28,111, 24,174, 15, 22, 7, 7, 7, 7, 7, 7, 7,199,191,201, 96, 17, 66,130, 56, 77, 78,147,211,228, 52, 57, 77,
- 78,147,211,228, 52, 57,131,197,193,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,206, 96,113,112,112,
-112,112,112,112,112,112, 6,139,131,131,131,131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,127, 19, 4, 64,165,
- 35, 1, 40,165, 15, 76, 22,169,195,104,130,154,244, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252,239,105,214,164, 93, 27,
-255,241,143, 54, 88,127,229, 68,163,132,144,160, 55,125,160, 56, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252,239,105,254,215,
-224,115,135,128,131,227, 95,206, 94,194,131,189,159, 39, 88,234, 12,190, 40, 13,103,239, 63,195, 92,202,190,182,166,115,160, 59,
-180,122, 7, 72, 37, 89, 56,113, 47,238,181, 53, 57, 56, 56, 56, 56,131,197,193,193,241,175,193,201,223, 23, 70, 44, 5, 15, 78,
-160,186, 88,180, 10, 92, 10,224,245,158, 44,109,252,125,161,103, 23,129,207,184, 66,171,139, 70, 91,191,101, 0, 30,114, 7,155,
-131,131,131,195, 52,254,150, 78,238, 97, 97, 97,145, 97, 97, 97, 11, 35, 34, 34,196,220, 41,224,224,120, 13, 30, 52,146,193, 96,
-236,166,213,179, 46,199,175,228,219,171, 74,140,190, 16, 26,186,227,138,175,217,107,105, 10, 72,231, 18, 61, 91,111,251, 41,149,
- 67,113,137, 33, 0, 12, 94, 79,179,140,160,160, 32,203,102,205,154, 29, 15, 14, 14,182,229, 78, 30, 7, 7, 7,103,176,222, 48,
- 44,203, 54,181,183,183,159,172, 86,171, 19, 66, 67, 67,123,255,127, 58,224, 45, 90,180,184, 18, 30, 30,158,209,178,101,203,140,
-150, 45, 91,222,174,105,253,127, 17,103,103,103,223, 70,141, 26, 37, 52,108,216, 48,186,226,122,251, 38,253, 91, 6,180,253, 96,
-174,109,195,190,237,184, 75,211, 68,138, 89, 7, 48,188,246, 15,227, 85,178,244,124,189, 67,228, 19,149, 2,148, 23, 1, 29,156,
- 94, 75,147,165, 29,238,198,170,229, 87,159,217, 57, 92,122,160, 49, 7,101,218,131, 18,199,215, 77,174, 72, 36, 26, 71, 41,237,
- 36, 16, 8, 38,113, 39,239,255, 55,132,144, 32, 66, 72,111, 66, 72,216, 27,212,252,210,223,223, 63,133, 16,242, 9,119,132, 57,
-254, 53, 6,107, 64,125,210,234,189, 6,228,194,192,250,164,104, 80, 3,162, 28,218,128, 92,126,199,139,212,249, 70,184,111,223,
- 62,233,182,109,219,236, 3, 3, 3,119, 53,111,222,252,114,104,104,168, 79, 93,116,194,194,194,142,135,133,133, 13,120,117, 93,
-104,104,232,192,138,235,154, 53,107, 22,213,172, 89,179,130,176,176,176,103,166,232,134,132,132, 60, 13, 9, 9, 41, 14, 11, 11,
-123, 90,113,125,104,104,232,192,102,205,154, 29,127,229,247, 6,188,186,174,202, 3,206, 48,174,135, 14, 29,178, 63,114,228,136,
- 61,159,207,119,120,117,253,225,195,135, 95, 90, 95,135,227, 49, 42, 44, 44,236,202, 43,121,249,240,213,117,213, 17, 26, 26,122,
- 37, 36, 36,228,195, 87,116,175,132,133,133,141,122, 19,230,170,109,219,182,151,239,220,185, 83, 79,161, 80, 88, 86,220,230,104,
- 99,217,229,202,225,111, 39, 15, 27,208,121,156,125, 96,191, 70,220,229, 89, 3,143, 3,133, 48,176,109, 89,150,218, 61,124, 86,
- 98,215,189,199, 59,252,187, 79,213,118,122,131,209, 26,132, 23,129, 11, 30,226, 58,105,234,245,109, 88, 74, 29,206,220, 21,218,
- 69,244,250,152,119,238, 62,223, 78,111, 52,218, 64,143,118,117,210,252,163, 28, 10,120, 60,222,228, 49, 99,198, 48,132,144,143,
-189,188,188, 68,255,159, 78, 87,243, 70,196,229,173, 80,254,141,144, 64,210,234, 13, 26,138,134,114,185,252, 22, 33,196,247, 95,
-102,174,154, 2,144, 81, 74,127, 3,224, 64, 8,225,191, 1,205, 85, 11, 22, 44,152,246,224,193, 3,231,250,245,235,207, 39,132,
-240,184, 74,130,227, 31,111,176, 6,213, 39,243, 28, 28, 93, 78,206, 94,181,163,237,134, 11,113,102,223, 29,186, 45,159, 60,125,
- 73, 43, 71, 43,187,163, 67,189,200,178,170,190, 87,221, 8, 3,145, 72,132,103,207,158, 97,237,218,181,146,121,243,230,181,180,
-176,176,184,215,188,121,243,213,129,129,129,242,234,210,242,170, 38,165,180,149, 64, 32,216,208,188,121,243,205,229, 21, 54, 33,
-164,149, 88, 44,254,177,121,243,230,219,203,155, 33, 67, 66, 66,234,223,184,113,195,156, 16,226, 96, 74, 58,155, 53,107,230, 20,
- 25, 25, 41, 3, 74, 35, 1, 17, 17, 17,226,102,205,154,109,115,113,113, 89, 15,160, 21, 0,120,121,121,137,154, 55,111,190,217,
-205,205,237, 39, 66, 94,174, 52,171,202, 59,195, 48,176,180,180,196,142, 29, 59,192,227,241, 42, 86, 14,176,180,180,196,207, 63,
-255, 12, 66, 72,173,143,103, 96, 96,160, 60, 44, 44,108,159,147,147,211,106,150,101,195, 1,160, 81,163, 70,178,102,205,154,237,
-117,113,113, 89, 83,190,206, 20, 77, 74,105,184, 80, 40, 92,221,172, 89,179,189,141, 26, 53,146, 1, 0,203,178,225,124, 62,127,
- 85, 88, 88,216,190,218,156,163,166, 77,155,142,105,220,184,113,106,227,198,141, 83,253,252,252, 22, 59, 56, 56,156, 95,183,110,
-157, 77,197,188,151, 71,174, 50, 50,115,242,174,220,140,122, 50,121,204, 59, 17,245,220, 28,134, 88, 54,233,107, 97, 74,222,235,
-202,191, 94, 51,135,216,131,208,142, 79, 18,212, 18, 15,239, 80,185,189,255, 59,176,179,228,139,175, 62, 42, 86,128,135,183, 32,
-144,217,213, 77,147,255, 86, 84,156, 90,106, 85,191,155, 44,172, 69, 91, 16,185,143,248,252,157, 98,115,240,153,186,105,254,193,
- 59,225,225,225,162,142, 29, 59,194,217,217,153,103, 97, 97, 49,228, 63,127,142, 42,152, 43,133, 68,116,253,235, 5,159,134, 58,
-219,200, 14,154, 98,178, 76, 24, 62,223,208,222,222,254,220,183,223,126, 27,162, 80, 40, 46,154, 98,178,254, 9,199,179,204, 92,
- 9, 41,165,215,202, 86, 61, 4,208,230, 53, 53, 87,205,155, 55,111,210,204,153, 51, 81, 84, 84,132, 97,195,134,153, 3,248,218,
- 84, 77,133, 66,225,221,184,113,227,237, 13, 27, 54, 76, 12, 14, 14,214, 6, 4, 4,148,248,249,249,197, 7, 5, 5,109,145, 72,
- 36,158,255,245,242,249, 79,209,172, 1, 17,128,246, 0,122, 0,120, 11, 64,179,178,255,195,202,150, 30, 0, 58,190,242,183, 60,
- 58, 90,190,189,121, 21, 26, 61, 42,249, 94, 88,133,245, 21, 63,191,250,127,245, 6,139, 16, 66, 43,254,173,200,187, 13, 72, 75,
- 27, 71,151,105, 95, 30,184, 41,101, 99,238, 34,114,100, 7, 60,249,164, 47,164, 79,239, 98,198,132, 25, 82,133,194,106,194,128,
- 6,164,125, 93,142, 86,116,116, 52,118,237,218, 5, 91, 91, 91,178,113,227, 70,241,128, 1, 3,198,153,155,155, 39,133,133,133,
- 13, 49, 85,131,199,227, 25, 55,111,222,108,214,167, 79,159, 65,214,214,214, 81, 33, 33, 33,245, 25,134, 49,110,221,186,213,108,
-224,192,129, 3,180, 90,237,163,208,208, 80,159,219,183,111, 27,111,222,188, 9,134, 49, 45,104, 23, 25, 25,105, 56,118,236, 88,
-121, 68,199,135, 82,250,104,217,178,101,131,246,239,223,175,176,176,176, 96, 67, 66, 66,234,187,185,185, 69,125,249,229,151, 67,
-246,238,221,171, 48, 55, 55,103, 77,172, 8, 80, 82, 82, 2,137, 68,242,146,145, 34,132, 64,173, 86, 67, 44, 22,155,156,198, 10,
-145,129,134, 54, 54, 54,143,151, 46, 93,218,231,192,129, 3, 82,133, 66,129,176,176,176, 0, 75, 75,203, 39,203,151, 47,239,123,
-240,224, 65,169, 66,161, 48, 89, 79, 40, 20,226,231,159,127,150,189,247,222,123,189,197, 98,241,227,176,176,176, 0,161, 80,136,
-157, 59,119,202,134, 12, 25,210, 83, 38,147, 61, 10, 9, 9,105,104,138,150, 94,175,159,115,243,230, 77,167,243,231,207, 59,185,
-187,187, 79,252,238,187,239, 28, 4, 2, 1, 0,192,104, 52,190, 20,185, 26,210,191, 83,243, 73,115,190, 61,167, 46,209,104, 23,
-205, 24, 17, 33, 48,162, 5,247, 12, 84, 5,123, 9, 15,172,177, 41, 0,175,219,209,106,219, 38,109,135,240,145,249, 27,154, 5,
-152,241, 47,220, 86,218, 83, 74,221, 97,160,205,112, 33,130, 95, 43, 77, 30,109, 2,194,250,156,188, 67,108, 91,118, 28,194, 79,
- 72, 72,128,103, 64, 4,239,240, 77, 56, 80, 74, 61,193, 34,180, 86,154, 21, 16, 8, 4,115,223,125,247, 93,121,124,124, 60, 90,
-182,108, 41, 19,137, 68,115,222, 72, 20,239,186,159, 59, 46,250, 70,224,138,175, 83, 93,211,246, 87, 71,174,204, 37,162,107, 59,
-183,255,226,220,168,205, 40,178,254, 83,119,107, 59,133,224,224,235, 68,178,202,204,213,217,235,215,175,219,116,238,220, 25,243,
-230,205,179, 51, 55, 55,191,248, 79,143,100, 85, 52, 87,132, 16,105, 89,243, 96, 10, 0,215,215,208, 92, 51,111,222,188, 73,179,
-102,205,194,181,107,215,176,124,249,114,116,235,214, 13, 86, 86, 86, 53,214, 31,239,191,255,190,172, 85,171, 86,145,189,123,247,
-190, 59,105,210,164, 33,135, 15, 31,118,219,188,121,179,112,248,240,225,226,119,223,125,215,253,211, 79, 63,253,160,123,247,238,
- 15,154, 55,111,126,125,192,128, 1,146,186, 38,177,108,225,168,249, 92, 86,233, 69, 0, 52,158, 57,115,102, 51, 66,200,225,153,
- 51,103,134, 2,176, 37,132, 28, 6, 96, 7,192,174,236,127,209, 43,127,237,202, 76, 83,249,118,155,202, 52,202,151, 87,190,103,
- 87, 97,125,197,223,120,245,255,154, 35, 88,132,144,118, 0, 46,190,186, 3,159, 98,193,152,201, 11, 37,207,183,172, 68,218,246,
- 85, 96,178, 83,192,203, 79,135,230,226,111,208, 95, 58,132,247,195,195,165, 82, 66, 22,213,229, 96, 42, 20, 10, 8,133, 66,196,
-196,196,224,209,163, 71,232,222,189,187,112,237,218,181,150, 13, 27, 54,252,177, 85,171, 86,119,195,194,194, 26,155, 98, 88,188,
-189,189, 49,104,208, 32,209, 39,159,124,210, 64, 34,145,220,166,148, 10, 60, 61, 61, 49,112,224, 64,225,244,233,211, 61, 36, 18,
-201, 77,150,101,133, 50,153,172,202,232, 80,101,186, 82,169, 20, 0, 4, 62, 62, 62,183,118,237,218,229,217,170, 85, 43,254,201,
-147, 39, 81, 88, 88,200,247,245,245,189,187,115,231, 78,175,150, 45, 91,242, 47, 95,190,140,226,226, 98,106,170,110,113,113, 49,
-164, 82,233,159, 12, 86,113,113,241,159,140, 87, 77,132,133,133,141,242,242,242,186,185,107,215, 46,215, 54,109,218,240,206,157,
- 59,135,162,162, 34,184,187,187,223,218,181,107,151,107,171, 86,173,120, 87,174, 92, 65, 81, 81,145,233,143, 9, 34, 17, 60, 61,
- 61,241,238,187,239, 10,166, 78,157,234, 42, 16, 8,110,138, 68, 34,184,187,187,227,221,119,223, 21, 78,153, 50,197, 85, 36, 18,
- 93, 55,177,201,144, 7, 0, 6,131, 1, 3, 6, 12,144, 75,165, 82, 36, 37, 37,129,101, 89,176,108,169, 39, 77,203,202,185,255,
-251,205, 7,143, 39,143, 29,208,174, 88,163,209,156, 56,127,235, 81,160,143,187, 43, 33,212,131,171,114,170,192, 42,208, 6, 60,
-116, 74, 72,213,138, 69,114, 87,133,153,173, 31,144,123, 17,245,157,197, 0, 37,146,155,143, 85,114, 48,180, 19,144,109, 83, 43,
- 77, 35,219, 41, 46, 69, 43,214, 73,131,204,156, 93,234, 33, 39, 39, 7,110,158,254,208,192, 78,116,229, 65,177, 25,104, 45, 53,
-203, 8, 14, 14,110,227,230,230,230,232,225,225,129,236,236,108,120,123,123,195,204,204,204, 42, 36, 36,164, 83,157,143,193, 5,
- 15, 49, 10,208, 10, 58,242, 53, 8, 51, 31,148,191, 20,252,172,166,184, 29, 34,248,199,153,171,159,127,113,177,113,242, 7, 30,
-140,132,131,181, 8, 27,103, 54,177,182, 83,136,235,100,178, 8, 33, 13, 29, 28, 28,206, 94,191,126,221, 86, 34,145, 32, 50, 50,
- 18,129,129,129, 88,185,114,165,157,149,149,213, 63,214,100,189, 98,174,172, 41,165,106, 0, 44,128,193,168,195,168, 87, 82,202,
- 55, 11, 23, 46,156, 56,107,214, 44, 92,189,122, 21, 46, 46, 46,200,204,204, 68,155, 54,109, 18,242,242,242,170,189, 47, 53,108,
-216,208, 53, 38, 38, 38,229,211, 79, 63,109,186,109,219, 54,169, 92, 46, 71,126,126, 62,126,250,233, 39,204,156, 57, 19,132, 16,
- 80, 74,177,105,211, 38,217,136, 17, 35,154,197,198,198,166,120,120,120,152,218,125,131,148, 69, 92,100, 0,228,101,127, 37, 19,
- 39, 78, 20, 17, 66,196,101,230, 82, 66, 8, 17,112,149,217,159,206,107,165, 94, 4,128,237,178,101,203,150, 80, 74,123, 46, 91,
-182,108, 73,133,253, 15, 87,163, 85,209, 52, 1, 0, 94,213,160,148,246,172,248,183,226,119, 41,165, 61, 41,165, 61, 43,126,191,
-186,223,171,210, 96, 1, 56, 79, 41,109,247,167, 48, 32,208,216,177,190, 31,242, 79,237,129,148, 71, 94, 90,152,184,251,112,147,
-240,161,167,180, 97, 93, 14,164,153,153,217,139,133, 97, 24,164,165,165,129,199,227, 97,206,156, 57,146, 9, 19, 38, 52, 18, 10,
-133, 87,219,182,109,187,180, 38,195, 2, 0, 55,110,220,128,183,183, 55,153, 53,107,150,121,187,118,237,248, 0,112,239,222, 61,
-120,121,121,145,197,139, 23, 43,122,245,234, 69,100, 50,153,201,209, 33,134, 97, 32,149, 74, 17, 17, 17, 65, 54,111,222,108, 38,
- 22,139,113,228,200, 17,100,103,103,163,115,231,206,252,205,155, 55,155, 73, 36, 18, 92,184,112, 1, 5, 5, 5, 38,235, 18, 66,
-160,209,104, 42, 53, 88,149, 69,182,170,163,101,203,150, 27, 29, 29, 29, 87,111,219,182, 77, 44,149, 74,113,238,220, 57, 20, 20,
- 20, 96,208,160, 65,134,159,127,254, 89, 98,110,110,142, 43, 87,174,160,160,160,160, 78, 5,253,198,141, 27,240,242,242, 34,179,
-103,207,150,134,135,135,235, 1,224,206,157, 59,240,241,241, 33,179,103,207,150,154,155,155,175,106,221,186,245,198,234, 52, 88,
-150, 69, 90, 90, 26, 30, 60,120,128,184,184, 56,100,103,103, 35, 43, 43, 11, 69, 69, 69, 48, 24, 12, 0, 0, 89, 81,225,145,111,
- 54, 31,186, 43,151, 74,101,205, 27,249,212,187,126,251, 97,166, 92, 42,149,249,120,214,243, 37,100, 62,247, 58,167,202, 10,145,
- 64,235, 3, 74,154, 94,123,168,180,110,211,101,176, 16, 89,199, 0,170, 7, 8, 31,237,155,187,242, 15, 94, 46,118, 0,139,198,
- 16,194, 31, 48,161, 64, 17, 66,192,215,121, 3, 36,244,100,164,193,166,117,151,113,194,228,228,100, 8,133, 66,136,197, 98, 4,
-183,122,155,191,243,156,222, 17, 64, 19, 8,224,103,146,102, 5,196, 98,241, 23, 35, 70,140,144,167,164,164,188,208,236,214,173,
-155, 92, 38,147,205,173,179,185, 98,100,225, 48,208, 73, 81,113,106,247,197, 91,210,252,159, 37,169,253, 65, 49, 5,122,125,240,
-235,154, 44,119,119,247, 8, 95, 95,223, 56, 79, 79,207,214,175,105,174,174,238,250,249, 23, 23,107,199, 82,115, 5,163, 10,224,
- 73,225,104,111,133,141,115, 35,172,237,204,165,181, 50, 89,101,230,234,204,181,107,215,108, 37, 18, 9,110,221,186, 5,145, 72,
- 4,137, 68,130, 70,141, 26, 97,253,250,245,118,214,214,214,255, 8,147, 69, 8,177, 34,132,116, 33,132,188, 67, 8,121,187,130,
-185,242, 4,208,129, 16,210, 9,128, 35,128, 11,148,210,187, 38,106,182,230,243,249, 71,154, 52,105,146,202,231,243, 31, 46, 89,
-178,228,163,233,211,167, 99,205,154, 53,136,136,136,120, 54, 99,198, 12, 60,121,242,196,160, 82,169,122, 83, 74,171,189, 17, 42,
-149,202,223,102,207,158,109,209,175, 95,191,242,207,184,124,249, 50,182,110,221, 10,185,252,143, 94, 16,148, 82,244,234,213, 11,
-163, 70,141,178,210,106,181,251,170,211,116,112,112,120,235,252,249,243, 62,101,230, 74, 82,193, 96,201, 79,159, 62,109, 41,145,
- 72,172,155, 53,107,102, 94,182, 94,214,175, 95, 63, 27,129, 64,208,154,171,212, 94,162, 82, 47, 82,149,193,121,213, 0, 85,182,
-173, 50,243, 84,215,196, 85,247,123,213, 25,172, 8, 66,200,133,202,118,210,229,102, 64, 12, 35,100, 60, 2, 41,159,148,254,229,
- 17, 72, 9, 11,126, 94, 70, 45,171,218,151, 13,150, 66,161,248,147,209, 82,171,213, 80, 42,149, 38, 25,141,242,190, 60, 86, 86,
- 86, 47,110,218,102,102,165,163,201,173,173,173,161,209,104, 64, 8,129, 92, 46,135, 92, 46,175, 85, 4, 75, 34, 41,141, 8, 95,
-185,114, 5,191,255,254, 59,248,124, 62,172,173,173, 1, 0,183,110,221,194,253,251,247, 33, 18,137, 96, 99, 99, 83, 43, 93,157,
- 78, 87,105, 19,161, 86,171,173, 85, 19, 33,195, 48, 40, 41, 41,161,183,110,221,194,131, 7, 15, 32, 22,139, 97,103,103, 7,145,
- 72,132,164,164, 36, 60,126,252, 24, 34,145, 8,118,118,118,117, 58, 63,230,230,230,200,207,207, 7,203,178,229,209, 60,152,155,
-155, 67,169, 84,130, 97, 24,147,210,201,178, 44, 82, 82, 82,144,157,157,141,196,196, 68,100,101,101,189, 48, 89,229, 77,132, 28,
-181,228,114, 67, 11, 16, 65,231,172,124,189, 56, 75, 41,178,112,240,234, 8,100, 31, 3, 8, 15, 16, 88,161, 69,211,250, 72, 72,
- 55,202,159, 36,106, 37,208,163, 11,206,250, 90,153,164,201, 19,116,202, 44,208,139,227,243,237,204, 3,130, 66,144,153,153, 9,
-177, 88, 12,177, 88,140,208, 22,111, 33, 46,149,149, 61,124,174,150,129,162,179, 73,154,101, 52,109,218,180,129, 84, 42, 13,111,
-218,180, 41,201,200,200,128, 88, 44,134, 68, 34, 65,120,120, 56, 24,134,105, 20, 28, 28,236, 95,171,252, 63,243, 18, 65, 32,107,
- 1,208, 73,143,159,171,156, 15, 94, 81,251,246,234,251,182,245,170,221,153,254,143,159,151,120, 66,107,152,138, 98, 93, 72, 93,
- 77,150,135,135, 71, 59, 51, 51,179,195, 95,124,241,133,167, 88, 44, 62,230,233,233,217,166, 78,245,155,152,247,195, 23,147, 6,
-187, 88,149,155, 43, 67, 49,192,147, 2, 60, 89,169,201,114,176,197,162, 79, 58, 90,203,132,130, 95, 77,213,148, 74,165, 59,191,
-249,230, 27,187,114,115, 37, 20, 10, 33,145, 72, 94, 44, 77,155, 54,197,156, 57,115,236,172,173,173,119,252,205,230,202, 26,165,
-253,170,238, 1,216, 7,224, 76, 5,115,229, 13,224,215,178,168,213,109, 74,105,130,137,154, 45,187,118,237,122,238,217,179,103,
-221,239,222,189,235,148,158,158,238, 63,101,202, 20,172, 94,189, 26,211,167, 79,223, 65, 41,245,221,179,103, 79,240,141, 27, 55,
- 26,153,210, 63, 40, 61, 61,253,189, 25, 51,102,100,103,103,103, 3, 0,130,130,130,144,159,159,143,169, 83,167, 98,210,164, 73,
-229,145, 87, 0, 64,102,102, 38, 86,172, 88,145,145,158,158, 62,172, 58, 77,163,209,152,180,127,255,254,112,173, 86, 91, 15,128,
- 16,128, 24,128, 44, 33, 33,193,162,184,184,216,156,199,227, 41,228,114,185,185, 88, 44,150,143, 24, 49, 66,248,240,225,195, 0,
-131,193,144,194, 85,106, 47, 81,165, 23,169, 44,210, 84,213,186,186,238,111,170,201,170,149,193,162,148, 94, 0,208,246, 79, 6,
-134,224, 94,226,205, 11,176, 14,108,250,114, 4,139, 79, 32, 83,152, 35, 46, 37, 9, 66,144,168, 58, 36,240,133,169,170,104,178,
-210,210,210, 48, 99,198, 12,213,246,237,219,239,107,181,218,240,139, 23, 47,206, 52, 37,130,101,111,111,143,196,196, 68,250,213,
- 87, 95, 21, 30, 59,118,204, 80,190, 46, 41, 41,137,126,254,249,231, 69,191,252,242, 11,173, 77, 19, 97,121, 4,235,194,133, 11,
-116,238,220,185, 5,169,169,169,212,218,218, 26, 54, 54, 54, 56,125,250,180, 97,230,204,153, 5,177,177,177,212,218,218, 26,214,
-214,214,181, 50, 88, 6,131, 1, 82,169,244, 37,131, 66, 8,129, 94,175,255, 83,100,171,218,123,226,229,203, 35, 11, 10, 10, 62,
-157, 58,117,170,250,209,163, 71,212,206,206, 14,118,118,118,216,178,101, 11,255,131, 15, 62, 80,223,187,119,239,197,186,186, 96,
-107,107,139,232,232,104,186,100,201, 18,245,153, 51,103, 4, 0, 96,103,103,135, 39, 79,158,208, 5, 11, 22,168,243,243,243, 63,
-189,124,249,242,200, 26, 42, 28,196,197,197,161,176,176, 16, 70,163, 17, 26,141, 6, 89, 89, 89, 72, 78, 78,126, 97,176,212,114,
-243,174, 31, 15,239,213,164, 88,173, 86, 93,191, 31,147,216,188,105,160,125,177, 90,173,138,121,158, 24, 77,233, 92,110,246,240,
- 63, 93, 60,172, 35, 40,109,125,249,190,210,178, 83,143,129, 34, 82,120, 3,208, 43, 1,129, 21, 32,176, 4, 95, 98,131,110,111,
- 5,243, 54,159, 40,116, 4, 97, 91, 66, 34,174,185,127, 11, 75, 29,192,178,109, 78,223, 42,177,106,221,125,130, 40, 55, 55, 23,
- 12,195,188, 48, 88, 50,185, 28,111,245, 28,202,108, 58,161,113, 4, 75, 91,129,199, 51,185,207,140, 80, 40,156, 54,124,248,112,
- 97, 94, 94,222, 75,154, 82,169, 20,125,251,246, 21, 43, 20,138,207, 77,206,251,227, 64, 33, 50,196, 45,192,210, 73, 79,226,213,
-206,251,127, 87,251, 78,153,179, 73,218,176,113,115,140,237, 99, 47, 93,188, 45, 51,240,110,172,202, 19,140,113, 50, 84,218, 80,
-252, 88, 59,147,229,233,233,217, 70, 46,151, 31, 57,112,224,128,172,125,251,246,152, 50,101,138, 92, 44, 22, 31,243,240,240,104,
- 91,219,211, 84, 92,100,252,120,193,170,109, 25,247,118,119, 1, 12, 69,101,230,234,143, 37,179,128,197,156,111,206, 21,232,141,
-116,176,169,154,106,181,250,131, 15, 63,252, 48,103,223,190,125,127, 50, 87, 18,137, 4,207,159, 63,199,226,197,139,115,115,115,
-115,135,253,205,165, 52, 24,192, 29, 0, 37, 0,218, 1,144,149,141, 20, 12, 7,112,154, 82,106,164,148,102, 80, 74,211, 76, 21,
-228,241,120,211,191,251,238, 59,190, 90,173,198,168, 81,163,144,148,148,132,212,212, 84,204,158, 61,251, 57,203,178, 31,148,105,
-222,165,148, 62, 54, 69, 79,171,213, 62,201,203,203,235,217,181,107,215,252,188,188, 60, 52,110,220, 24, 61,123,246,132,163,163,
- 35,156,157,157,209,187,119,111,248,248,248, 32, 39, 39, 7,131, 7, 15,206,205,202,202,234, 66, 41,173,118, 20,122, 78, 78, 78,
-236,238,221,187, 99, 63,250,232,163,176,164,164,164, 32, 0, 78,122,189,222, 90,173, 86, 43, 12, 6,131,153,185,185,185, 77, 72,
- 72,136,221,216,177, 99, 45,111,222,188, 25,152,156,156,172, 4,144,192, 85,106, 47,121,131, 74,189,200,107,112,228,117, 34, 85,
-149, 69,192, 76,133, 41, 19, 34, 21,255,190, 20,189, 2,230,108,221,187,181, 68,228,238, 3, 11,255, 38,144, 73, 36,144,138, 69,
-144, 90, 90,163,132,101,177,225,121,186,170,152,210,207,235,144,248,151, 34, 87, 44,203, 98,253,250,245, 37,139, 22, 45,202, 79,
- 79, 79, 31,123,241,226,197, 38, 55,111,222,188,103,138, 17, 42, 44, 44,196,158, 61,123,212,155, 55,111,126,166, 86,171,155, 10,
-133, 66,189, 86,171,197,142, 29, 59, 74, 86,175, 94, 29,175, 82,169,194, 4, 2,129,174, 54,205,111,229,125,176, 4, 2,129,190,
-164,164,164,233,174, 93,187, 98,143, 28, 57,162, 54, 55, 55,135, 64, 32,208,171, 84,170, 70,219,182,109,123,178,107,215, 46,181,
-185,185,121,173,140, 27,203,178,149, 70,176,140, 70, 35,196, 98,113,173,250, 96,221,188,121,243, 39,157, 78,215,124,199,142, 29,
-201,155, 54,109, 42, 49, 55, 55, 7, 0,232,245,250,176,173, 91,183, 38,255,240,195, 15,154,218,116,112, 47,171,120, 96, 52, 26,
-177,109,219, 54,205,206,157, 59,147, 13, 6, 67, 88,249,186, 77,155, 54,149,108,219,182, 45, 89,167,211, 53,191,121,243,230, 79,
- 53,105, 25,141, 70, 99,126,126, 62,248,124, 62,158, 61,123,166, 17,139,197,224,241,120,136,137,137,121, 97,176,236,109,173, 3,
- 91,133, 5,249,175,252, 97,207, 5,185, 88, 44,238, 18, 17, 26,240, 48, 38, 33,153, 82, 18,207, 85, 55,149,133,148, 33, 3,129,
- 52, 38, 73,163,144, 8,244, 4,233,191, 2, 66,171, 50,131, 85,186, 56,187,184,226,230, 99,149, 2, 4, 34,104,245,246, 53,106,
-234,169, 28, 4,178, 7, 9, 80,240,133, 82,146,158,158,254, 34,210, 84,110,136, 60,189, 2,112, 59, 70,105, 6, 66,197, 0, 28,
-106, 83, 81,153,153,153,241,211,210,210, 94,104,189,208,244,244,228,233,245,250, 46, 38,231, 61,203,232, 4,150,253, 56, 58,177,
-196,249,192,239,106,159,201,115, 54, 73,165,188, 60, 32,126, 13, 26,250, 56, 98,202,176, 38,162,217, 27,178, 26,222,124,168,106,
- 0, 66,199,162,161,210,228,167, 11, 79, 79,207,214, 50,153,236,216,129, 3, 7,100,114,185, 28,207,158, 61, 67,227,198,141,177,
-112,225, 66,153, 76, 38, 59,234,238,238, 30, 81,155,211,116,237, 9, 77, 80, 22, 25,195,167,173, 79, 74,191,247,220, 88,106,172,
-152, 82,115,149, 85, 64,241,225, 23,135,242,243, 10, 75,222,190,122, 95,127,182, 22,199,242, 78, 65, 65, 65,231, 47,190,248, 34,
- 39, 59, 59,251, 37,115,149,144,144, 80,110, 4, 34, 40,165, 81,127,115, 41,149,163,180,243,186, 31, 0, 47, 0, 77, 40,165, 6,
- 0, 69,148,210, 58,133,174, 3, 3, 3,155,186,187,187,227,251,239,191,199,134, 13, 27,242, 86,174, 92, 9, 74, 41,124,124,124,
-204,235,170,153,145,145,113,227,201,147, 39, 93,154, 52,105,242,104,221,186,117,201, 78, 78, 78,236,168, 81,163, 48,114,228, 72,
-216,217,217, 25,215,172, 89,147,216,166, 77,155, 7,177,177,177, 29,139,139,139,239,155,112,126,104,118,118,246,149,141, 27, 55,
-222,120,235,173,183, 20,195,135, 15,119,216,176, 97,131,227,227,199,143,235,169, 84, 42,151,204,204, 76,249,197,139, 23,197, 91,
-183,110,117,124,248,240,225,115,181, 90,125,131,254,149, 47, 4,254,247,153,171, 42,189, 8,128,172, 50,163,163,125,229,111, 86,
- 13,219, 76,253,110,165,255,155,176, 95,149,212, 56,226,102,247, 51,122,101,168, 23, 89,190,112,211,250,207,134, 54,242,151,122,
-120, 6,192,168,204,199,253,244,116,108, 77, 43, 80,233, 41,253,102,207, 51,122,174,174, 6,139,199,227,225,196,137, 19,198, 29,
- 59,118,232, 40,165, 63, 22, 22, 22,126,254,240,225,195, 98, 83,117, 88,150,229,141, 24, 49, 66,153,151,151,247,107, 90, 90,218,
-216,216,216, 88,109,155, 54,109,120,239,189,247,158, 50, 55, 55,247, 55, 66,200,168, 91,183,110,105, 90,183,110,141,218,148, 99,
- 66, 8,132, 66, 33, 8, 33,184,121,243,230,243,192,192,192,134,215,174, 93,251, 54, 58, 58,250, 93, 74, 41, 47, 50, 50, 50, 41,
- 36, 36,164,241,149, 43, 87,214, 61,126,252,120, 48,203,178, 60, 83,117,203,163, 99, 21,141, 20,195, 48, 47, 76, 29,169,101,155,
-107,100,100,100, 84, 96, 96, 96,192,141, 27, 55,182,140, 30, 61,186, 11, 0,217,205,155, 55, 31, 53,106,212,200,255,218,181,107,
- 91, 62,248,224,131,174, 40,109,243, 55,237,254,173,211,161,111,223,190,170,130,130,130,227, 69, 69, 69,195,238,223,191,175, 10,
- 9, 9, 41, 95,119, 34, 63, 63,127, 88, 45,206,209,130,181,107,215,206, 41, 59, 87, 91, 86,173, 90,245,225,212,169, 83,237, 82,
- 82, 82, 94, 24,172,204,236,220,179, 45,123, 76, 48,230,228, 23,104, 55,173,154,246,142, 84, 34, 22,125,190,108,211,121, 61, 15,
-215,184, 42,167, 18, 68,198, 66, 80, 38,245,157, 14, 86,226, 53,223,108, 20, 14,239,221, 64, 18,228,239, 94,106,174,132, 86,184,
-249, 48, 31,115,190,218,195,126, 57,206, 46, 14, 44,146, 96,196,147, 26, 53,205,248,133, 40,209,103,126,216, 69, 40, 94,250,227,
-164,250,173,122,126, 38, 14, 8,106,246,194, 8, 61,142,186,133, 85,139, 39,176, 95,142,181,142, 3, 75, 82, 97,192, 99, 83,147,
-107, 48, 24,222, 89,182,108,217,241,225,195,135,203, 27, 54,108,248, 66,243,249,243,231,248,242,203, 47,213, 26,141,230,109, 83,
-175, 74, 48,129,193, 70,163,209,254,231,147, 57,222,159, 78, 28, 43,147, 50,185, 64,220,138, 82,243, 34,176, 64,112,144, 45,230,
- 76,116, 20, 76, 89,122, 40,240,242,183,245,149,208, 11, 3, 0,164,154,162,206,231,243,143, 44, 89,178, 68, 38,149, 74, 17, 19,
- 19, 3,169, 84, 10,137, 68,130,144,144, 16,172, 94,189, 90,246,209, 71, 31, 29,139,136,136, 48, 59,127,254,188,161, 54, 38,171,
-133, 31, 9,159,246, 93,236,213,229,159, 88, 58, 54,246,179, 69,118, 17,240,225,220,195,121,185,133,234, 1,181, 49, 87, 21, 77,
- 22, 33,164,243,164, 73,147, 78,110,222,188,217, 38, 32, 32, 0, 73, 73, 73, 24, 52,104, 80, 78, 86, 86, 86,251,127,128,185, 2,
-128, 98, 0, 46, 0,162, 81,218, 23,233, 41, 33, 68,132,215,120, 61,219,195,135, 15,111, 39, 36, 36, 56,141, 28, 57, 18,133,133,
-133, 86, 3, 7, 14,196,179,103,207, 16, 29, 29,125,231,117, 18,170, 86,171,111, 18, 66, 26,125,250,233,167, 67,167, 77,155,214,
- 74,161, 80,120, 82, 74,105, 97, 97, 97,156,209,104,188, 12, 96, 7,165,166,191,135,179,204, 48, 61, 37,132,196,197,198,198, 58,
-108,217,178,197,178,236, 24, 0,128, 26, 64, 1,128,140,186,154,194,255,199,220,252,155,190,251, 90,142,209,164,229, 29, 79,180,
- 26,222,128, 92,120,175, 62,138, 6,215,135,114,184, 23,185,252,118, 3,180,171,238, 59, 0,130, 42, 91,223,180,105, 83,106, 48,
- 24,232,201,147, 39,105,183,110,221,138, 91,183,110,125, 57, 36, 36,196,199,148,116,188,170, 25, 17, 17,113, 60, 52, 52,116,192,
-171,235,154, 53,107, 54,176,226,186,118,237,218, 69,181,107,215,174,160,109,219,182,207, 76, 73,103,219,182,109, 31,183,106,213,
-170,184,109,219,182,143, 43,174, 15, 11, 11,235,211,161, 67,135, 35, 21,215, 53,107,214,172,247,171,235,170,202,123,199,142, 29,
-147,162,163,163,105, 98, 98, 34,237,222,189,123,106,249,250,183,222,122, 43,233,238,221,187, 52, 58, 58,154,118,237,218, 53,181,
- 54,199,179,226, 18, 26, 26, 58,170, 77,155, 54, 87, 94, 73,243,135,175,174,171, 78,179, 77,155, 54, 87,194,194,194, 62,124,117,
- 93,104,104,232,168,186,156,163,138,139,147,147,147,111,112,112,112,230,170, 85,171,104,253,250,245, 51, 43,110,107, 24, 49,226,
-139,252, 66,101,225,212, 5,223,239,182, 11,232,219,168,182,121,175,237,242,175,213,124, 20, 32,164,191, 7,180,162, 23, 3,142,
- 60,222,230,254,104, 88,103,185, 38,114, 71, 87, 74, 31,127, 70,175,237, 25, 73,195, 3, 68,198,223,191,117,139,166, 23,253,143,
-209, 75,190,109,233,177, 6, 34,147, 52, 47,122,181,161, 23,253,143, 61,220,226,254,168,111, 91, 59,237,142,109,235,233,211,167,
- 79,233,111,251,119,208, 22, 1,178, 50,205,128,147,244, 98, 64,123,147, 52, 95,190,230, 91,133,135,135, 43,119,239,222, 77, 99,
- 98, 98,232,169, 83,167,104,203,150, 45, 85,193,193,193,237, 77,207, 59, 8,189, 16,216,215,112,206,239,242,204, 65,102,249, 31,
-118,145,104, 6,181, 23,105,251,132, 11,117,157,155, 10, 13,173, 2,248,198,198,245, 25, 54,192, 13,180,115,136, 84, 67, 47,250,
- 93,162,151, 3,186,152,154, 78, 31, 31,159, 68, 15, 15, 15, 90,213,226,235,235,155,213,174, 93, 59,126, 93,206,123,115, 95,184,
-119, 12, 19,167,157,249,177, 61,237,213, 86,145,211, 34,136,223,225,117,203, 18,128, 96, 91, 91,219,236,205,155, 55, 83, 7, 7,
-135, 44, 0, 13,255, 41,101, 30,128, 53,128, 62, 0,236,202, 62,155,161,116,254,161,250,175,161,217,178,115,231,206,250,219,183,
-111,211,103,207,158,209,227,199,143,211, 86,173, 90, 25, 0, 68,252,167,175,247,255, 71,154,255,181,133,252,149,209, 73, 66, 72,
- 80,101,157, 13, 67, 66, 66,104,151, 46, 93,212, 23, 46, 92, 80,106,181,218, 49,183,110,221,250,237,117, 53,255,138,116,254, 21,
-154, 29, 58,116,184,194, 48, 76,253,178, 33,192,169,167, 79,159,110, 10, 0,237,219,183,191,194,227,241,234,151,153,222,212, 51,
-103,206, 52,253,175,229,189, 28,103,103,103, 95,134, 97, 78, 0,208, 36, 39, 39,191, 24,237,100,223,176, 79,184,181,149, 69,251,
-252,252,130, 59,233, 15, 14, 30,251, 47,230,253,141,105, 30,247, 18, 65, 33, 10,133, 17, 51, 30, 60, 83,121,126,190, 49,187, 65,
-207,206, 45, 5, 91,246, 92,100,151,143,183,143,109, 25, 40,127, 14,194,126, 9,163,230, 6,218,197,107, 76,214,148,145,102,128,
- 96,198,221, 88,149,251,212,239,242,188, 59,246,250,144,119,104,239,122,246,171,241, 54,177, 45, 3,205, 18, 1,124, 9, 86,117,
-213,100,205,151,175,251, 86, 98,177,248,216,224,193,131,205,118,238,220,169, 46, 41, 41,233,121,251,246,237,115,181,202,251, 85,
-255,122, 48,144,197, 0,117, 51,161, 65,254, 41, 12,236, 66,180,127,156,248, 79, 56,239, 45,252,136,187, 92, 33, 62,172,210, 24,
- 38,153, 18,185, 50, 69,147, 16, 18,108,101,101,181, 61, 47, 47,111,160, 41,145,171,255,101,222, 9, 33,118, 40,157,136,145,143,
-210,105, 11,162,106,234,195,100,130,102,107, 30,143, 55,189, 65,131, 6,141,159, 61,123,246,192,104, 52,126, 69, 41, 61,255,255,
-225,222,241,255, 65,243,191,198,223, 98,176,218,180,105, 19,105, 52, 26,143, 11,133,194,197,231,207,159,215,112,133,143,211,228,
- 52,235,160, 89,193,100, 69, 70, 23,215, 95,250,115,174,251,228,129, 86,137, 53,153,171, 26, 53,203, 76,214,141, 39, 42,143, 47,
-119, 20,185, 79, 25,104,150, 88,147,185, 50, 53,239, 33, 33, 33,173, 36, 18,201, 86,181, 90, 61,170, 38,115, 85,169,230,227, 64,
- 33,242,244, 46, 48,240,130,192,160,234, 87,237,176, 84, 5, 1,239, 1,210,144,129,119, 30,234,184,178,196,105,114,154,156,193,
-250, 95,243,183,204,122,124,233,210,165, 16,238,208,115,112,188, 38, 93, 99,181, 56,238,117, 11, 10,209,178, 16, 95,233,132, 95,
- 23, 75, 85, 96, 73, 50, 8,187,186, 58,115,101,130,230, 13,200,244,203,154,249, 74, 39,237, 95, 44, 85, 1, 72, 7,197,170,234,
-204,149,169, 68, 70, 70,254, 14,160,126,157, 5,252, 31,234, 0, 60, 7, 72, 60,230, 87, 51, 59,246, 92, 80,128,235, 60,204,193,
-193,241,255,204, 96,113,112,112,188, 65,147,245, 56,240, 38,114,120, 83, 97, 68,125,136, 13, 9,200, 55,164,163,107,188,246, 53,
- 53,175, 35,135,124, 2, 22,190, 16, 25, 98,145,175,125, 61,205, 55, 14,165,165, 38,138,131,131,131,131, 51, 88, 28, 28, 28,127,
- 5,165, 81,157,228,178,229,159,171,201,193,193,193,241,255, 8, 2, 32,168,242,231, 67,211,219, 86, 9, 33, 65,181,127,254,172,
-177,243, 38,167,201,105,114,154,156, 38,167,201,105,114,154,255, 49,205,154,180,255, 43,125,187,254,150, 78,238,156, 38,167,201,
-105,114,154,156, 38,167,201,105,114,154,255,101,184, 23,233,114,112,112,112,112,112,112,112,188, 97,254,214, 62, 88, 50, 91, 95,
- 39,240,153,198,132,165,254, 0, 64, 25,242, 24, 6,246,158, 42, 59, 58,237,117,181,137, 67, 35,153,153,128,183, 67,169, 55,190,
- 71, 51,238,171,222,144, 99,111, 13,192, 29, 64, 2,165,244, 50, 87,124, 56, 56, 56, 56, 56, 56, 56,106,101,176,124, 91,246,187,
- 36,151,202,189, 1,128,165, 20, 70, 22, 40,204,203,188,154,112,239, 84, 63, 0,112,110,248,214,126,145,220, 54,156,101, 41, 88,
- 74, 97, 96, 41, 12, 26,245,211,172,135, 71, 76,122,243,188,153,189, 95,191,142,157, 59,246,239,217,179,135, 95,163,160, 70, 94,
- 0,112,255,193,253,216,195,135,143, 60, 49,179,247,251, 85,153,249,100,255,235,100,204, 76, 32,248, 34,172, 89,243, 46, 55,111,
- 94,159, 13, 96,214, 27, 58, 94, 66,122,185,251, 54,210,250,232, 91, 92,209,225,224,224,224,224,224,224,168,181,193,146, 75,229,
-222,103, 15,110,180,223,127, 41, 9, 0,208, 49,196, 17,243,191,222,220,151, 16,242, 4, 0,222,254,232,107,223,207, 63, 29,134,
- 43, 81, 89,160,148, 34,216,219, 26,125,135,124,100,210,143, 74, 29, 3,195, 6,190,251,238,123, 83,167, 78,233,253,244,233,211,
-248,157, 59,119, 94, 2,128, 54,109,219,122, 47, 89,178,228,221, 21, 86,214, 98,169, 99, 96,138, 58,253, 97,157,222, 31,100,230,
-232,101, 27,208, 48,244,195, 29, 63,125,197,239,208,125,208, 72, 51, 71,175, 85,202,244,216,236,186,104,137,221, 26,214,183, 16,
- 8,231, 19,134,225, 91,216,123,216, 3,128,149, 91,240, 97,231,134,221,140, 18,137,244,126,177, 90,189, 53,243,209,241, 13,220,
- 11, 59, 57, 56, 56, 56, 56, 56, 56,106, 52, 88, 0, 96, 38,225,227,201,243,210,214, 58, 75, 25, 48,250,131,183,145,145,145,238,
-171, 51,176, 24, 58,176, 31,110, 63, 73, 67,244,243, 44, 80, 10,248,186,154,252, 46, 97,240,192,134,142, 24, 57,162,221,137,147,
- 39,111,124,241,249, 23,219, 8,193, 85, 0, 88,255,227, 79,225,115,230,206, 25, 53,244,131,161,157,246,238,221, 27,133, 58,190,
-160,145, 17, 90,174,250,114,241,124,179,148,236,146,146,137, 83, 62,227, 77,253,244,147, 21, 0, 62,168,139,185, 10,112,115, 93,
-124,233,228, 94,153, 76, 38,195,134, 13, 27,196,192, 65,204,155, 58, 66,210,163,103, 79, 24,193,107,249,213,183, 59, 27,159, 20,
-137, 70,218,250,118,234,151, 29,125, 42,141, 43, 82, 28, 28, 28, 28, 28, 28, 28,213,118,114, 55,178, 20,143,227,210,241, 56, 46,
- 29,215, 31,103, 65,107,228, 99,197,162,233, 88, 54,111, 26,114, 84,192,129,223,147,240,228,121, 58,158, 60, 79, 71, 78,190, 18,
-175, 78,251,247,234, 8,131,175, 63,145, 53, 93, 61,205,226,171,174,161,242, 8,107, 43, 43,171,152, 27,219,138,231, 12,201, 8,
-152,255,110,146, 80, 32,113, 72,182,114,168,215,114,207,222,189,129, 14,118,246,114,115,115,139,105,214,254,157, 55, 90,122, 68,
- 88, 84,167,249, 39, 83,232,216,176, 93,175, 30,221,123, 56, 58, 58, 24,199,172,190,245, 56,200,223,215,224,227,235, 31, 97,230,
-232,215,174,170,239, 84,166, 41,118,107, 88,223,203,201, 97,241,133,227,123,101, 37, 37, 37,120,240,224, 1,114,114,114, 74, 55,
- 18, 2,134,225,161,158,139, 19,214, 45,157, 34,155, 55,125, 92,136, 88, 34, 59, 72, 8, 33,166,166,179, 46,112,154,156, 38,167,
-201,105,114,154,156,230,127, 85,243, 63,105,176, 8, 33,149, 54,111,197, 38,229,224, 73, 92, 26,154,250,187,192,203,195, 17, 55,
- 98,242,176,227,108, 18, 54,157,140,199,217,123, 89, 96, 5, 10,164, 23, 17, 60, 77,200, 64,116,124,118,141,211, 42,243, 68,130,
-129,147,150, 23, 76, 13,172, 95,216,226,252,238, 9,112, 54,139, 9,156,254,117,254, 4,158, 72, 48,208,222,209,114,231,212, 79,
-198, 14, 81,200,164, 34,173, 70, 11, 79, 15, 55,201,184, 81, 35,134, 11,205,228, 59, 77,205,140,157, 93,160, 92, 36,149,111, 91,
- 60,103,138,100,229,254,152,196, 98, 45, 45,222,123, 37,245,217,212, 25,115, 10,121, 2,233,143,118,118,129,114, 83,116,196,110,
- 13,235,187,219,216, 44,190,124, 98,175, 76,167,211, 32, 53, 53, 21, 90,173, 22, 6,131,225,143,194, 5,160, 72,109, 64, 92,154,
- 26,237,218,182,226, 53, 13,110,232,111,231,223,109, 12, 87,164, 56, 56, 56, 56, 56, 56,106, 79, 85, 94,228, 95,109,176, 42,163,
- 88, 93,252,244,253, 49, 83, 51,189, 21,105,218,126,237, 3, 0, 10,100,165,197,227,225,141, 19,136,137, 60,137,162,172, 68, 80,
- 10,120,120,212,131, 80, 29,167, 93,255,195,119,153,172,161,228,105, 85,122,125, 58, 59,187, 62, 77,145, 51,203,167,214,187, 26,
- 19,157,102, 59,126,234,102,196, 68,167,217, 46,159, 90,239,234,211, 20, 57, 35, 19, 26, 91,126, 48,168, 15,233,211,179, 43,166,
- 79,159,138, 62, 61,187, 98,234,216,119,137, 68, 36,104, 97,106,102, 74, 68,146,101, 51,190, 88,160, 72,207,215,105,175, 71, 23,
-106,204,100, 50,241,239,143,139, 85, 26, 42,213,245, 30, 56, 58, 75, 35,228, 47, 48,197, 92, 57,153,155, 47,190,114,122,159,140,
- 82,138,228,228,100,232,116, 58,232,245,122,232,245,250, 23,251,229, 43,245, 72,204, 82, 35, 33, 83,133, 7,241,133,232,214,181,
-171,140, 47, 16, 13,225, 46, 17, 14, 14, 14, 14, 14, 14,142, 42, 13, 86,244,149,253,109, 34, 79,111,115,200,206,200, 40,144,139,
-249,224, 51, 12, 50,147,159, 97,235,215,159, 96,239, 55, 83,144,159,246, 20,148, 2, 82, 33, 15, 26,101, 78, 65,218,157, 61, 14,
-217,213,140, 32, 36,208,119,250,118,251,115,207,248, 52,106,177,227,184, 82, 0, 0, 59,142, 43, 5,241,105,212,226,219,237,207,
- 61, 69, 52, 11,172,209,136,158,125,222,198,182, 45, 27, 16,222,161, 15,246, 94, 76,132, 74,173, 51,233,253,103, 18, 7, 95, 15,
-123, 71,199,183, 39, 13,125, 75,209,204,215,202,204,199,205,146,199, 19, 8, 13, 34,129,152, 61,116,171, 32,165, 75,207,126,140,
- 76,110,222, 85,226,224,235, 81,157,142,133, 64, 56,255,247,147,251,100, 60, 30, 15,137,137,137,208,233,116,208,106,181,208,104,
- 52, 47, 34, 88,133, 42, 61, 82,114,212, 72,202, 82, 33, 49, 75,133, 71,137,133, 16,201,173,160,215,235,131,184, 34,197,193,193,
-193,193,193,193, 97,210, 68,163,169,153,185,176, 86,240, 96,231,236,137,247, 62, 89, 1, 0, 48,178, 6, 80,148, 78,207, 96, 74,
- 76,143, 66,112,234,227,161,158,113, 30, 78,164, 96, 72, 55,153, 26, 0,134,116,147,169, 61,156, 72,193,199, 67, 61,227, 84, 70,
- 43,157,209,104,196,229,168, 76, 44,255,229, 17,190,216,124, 15, 39,110,153,222,103,156, 47,144, 78,250,114,233, 18, 25,159, 71,
- 72, 84, 66,145, 50, 45,215,160, 20, 10, 5, 58,129,136,175, 87,106,137, 58, 62,203,152,211,117,192,248,231, 60,158, 96,124,141,
-105,165, 44, 40,165,208,104, 52,208,106,181, 47,150,242, 8, 86,174, 82,135,212,156, 18, 36,102,169,145, 84,182,100,228,169,193,
- 13, 36,228,224,224,224,224,224,224,120,201, 96, 17, 66,104,101,237,159, 44,128,152,248, 44,136,249, 44, 92,235,121,253,209,145,
-157, 2,148, 2,122, 3,107,210, 15, 29, 60,153,154, 92,223,165,152, 78, 91,145, 24, 30,228,111,115,111,220, 96,183,199, 65,254,
- 54,247,166,173, 72, 12,175,239, 82, 76,245,172,200, 72, 41, 5,101, 41, 40,165,160, 20, 96, 89,211, 13, 11, 33,188, 22,193,254,
-238,252,249, 59,159, 38,140,255, 46,250, 49,225,243,245, 34,145,200,224, 96, 33, 37,174,182, 82,126,145, 6, 37,126, 65, 77,245,
- 4,104, 90,157, 78,129, 94, 55,183, 85,151, 1, 42,157,206, 0, 55, 55, 55,104,181,218, 23, 77,132,229, 17,172,124,165, 14, 41,
-185, 37, 72,202, 82, 35, 49, 75, 13,117,137, 17,247, 31,199,131, 48, 60,174,211, 31, 7, 7, 7, 7, 7, 71, 29,169,202,139,252,
-107, 13, 22,165,148,148, 47,149,237,228,238,230,128,235, 15, 18, 80,207, 65, 12,115, 11, 5, 30,199, 38,131,225,241,193, 99, 8,
- 12, 70,211,143, 3,213,234,127, 89, 57,205, 98, 69, 98,154,241,218,119,219,159, 61, 77, 76, 51, 94, 91, 57,205, 98, 5,213,234,
-127, 41, 77, 71,233,164,166,108,133,191, 38,107, 83,214,222,214, 66,204,191, 25,171,204, 37, 60,190, 70, 40,224,107,156,108,196,
-196,201, 86,202,119,179,145,138,228, 18, 1,227,228,224,192,130, 82,135,234,116, 52, 73, 81,113,233,133,133,179,219,116,126, 91,
- 37, 16, 8, 80,191,126,253, 23, 17,172,114,131, 85, 26,193, 82, 35, 49, 75,133,244,220, 18, 72,197, 12,238, 94, 61,163, 50, 26,
-245, 91,185,203,131,131,131,131,131,131,163,246,212,228, 69,254,109,240, 77,200, 49,228, 50, 41, 88, 70,130,203,183, 98,225, 31,
-208, 24,155,127,187, 1,175,160,230, 72, 43, 50,128,214,226,117,134, 83,214,168,110, 3,184,221,167,179,179,107,191,110, 46,157,
- 40, 4,167,190,221, 89,144, 12, 0, 27,195,251,149, 25,171,210,200, 21, 75, 75,167,137, 48,217,245, 2,169,137,153,197,102,158,
-142,114, 60, 74,210,106, 20, 50,137,193, 82, 38,228,219, 89,136,120,230, 82, 62,159, 47,100,152,252,252,172, 34,128,164,214,164,
-165, 73,138,138, 19,187, 53,156,221,182,219,160,197,151,142,239,150, 53,104,208, 0,119,239,222,125,209, 68,168, 42, 49,128, 20,
-233, 32,144, 82,248,184,152,225,241,237, 75,198,156,204,148,135,121,209,199, 55,112,151, 8, 7, 7, 7, 7, 7, 7,135, 73,238,
-136,101, 41,236,108,173, 32, 54,179, 64, 92,150, 22, 74,216,161, 64, 77,192, 26, 1,163,161,106, 19, 68, 8,169,180,211,247,193,
-147,169,201, 7, 78,102,109, 60,120, 50, 53,249, 21,247,250,162,121,144, 82, 90,105, 19, 97, 85,154,148, 26,143, 29, 62,117, 57,
-183,111, 11,123, 75, 70, 32, 80,139,196, 60,157, 84, 34,208,203,196,124,216, 91, 8, 69,174, 86, 66,241,249, 35,187, 24,194,210,
-179,166,104,106,146,162,226,158,103,102,206,238,208,115,176,202,193,209, 17, 67,135, 14, 69,189,122,245, 0, 0,214,114, 6,238,
- 86, 12,248,154,116, 92,248,109, 99,241,227,200,115,145, 48,106,250, 85,156,205,189,170,116,190, 14,156, 38,167,201,105,114,154,
-156, 38,167,249, 95,213,252,175, 97,210,203,158, 27, 56,201,225,237, 34, 71,137,214, 1,106,173, 17,197, 26, 3,138, 84,122, 20,
-168,244,136, 79, 87, 33,250,252,235, 39,132,150, 25, 44, 80, 2,150, 82,128,148, 54, 19,154, 26, 40, 44, 22, 20,174,248,114,201,
-252, 65,187,247,236,167, 19,187, 59,185, 94,127,170, 78, 18,243, 4, 90,153,152,225,155, 75, 25,227,243,184,231,169, 39, 15,239,
-106,168,146,168,134,153,154,166,242, 72,150, 95,211, 14,243, 65,193,215,170, 11,228, 51, 90, 5,226,196,241, 35,106,209,229, 72,
- 61,225,139, 30,176, 70,221,246,188,104,238, 85, 57, 28, 28, 28, 28, 28, 28, 28,181, 48, 88, 42,181,234,105,167,254, 31,150,189,
-240,153,194,104, 44,141, 44, 25,203,155,242, 88, 10,163, 78,253,244,117, 19, 98,100,217, 27,223,111,254,165,123,147,224,230,188,
- 64,119, 5, 10,243,179,113,235,250, 85, 3,101,217,171, 38, 25,180,248,120,141,153,131,255,187, 3,222,238,187,107,228,216,137,
-202, 54,237,218,203,108,108,204, 13,217,153, 57,133, 91, 55,236,206,219,191,251,231,134,132,101,223,167,241,241,154,218,164, 75,
-147, 20, 21, 7, 96, 72,153, 99,239, 0, 4,182, 43, 78,189,215, 75, 73,255, 28, 9,227,224,224,224,224,224,224,224, 48,201, 96,
-197, 92,221,223,230,127,145,144,220,220,140,161,219,119,253,186,232,231,221,191,181,210,232,116, 46, 44,120, 73, 70,189,254,130,
-184, 40,103,142,169, 26,202,140,199, 15,137,135, 71,232, 79,223,172,248,244,199,111, 87,190, 5,214,232, 5, 66,158, 19,150,158,
- 85, 74, 84, 35,105, 74,237,204, 85, 37,100,147,214, 71, 59, 3,200,230,138, 14, 7, 7, 7, 7, 7, 7, 71,157, 13,214,255,138,
-220,216,235, 69, 0, 38,190,174, 78, 89,132,106,105,217,242, 70, 41,123,247, 18, 55, 21, 3, 7, 7, 7, 7, 7, 7, 71,181, 48,
-220, 33,224,224,224,224,224,224,224,224,120,179, 16, 0, 85,140,202, 51,253, 77,217,117, 25, 77, 80,147, 62,167,201,105,114,154,
-156, 38,167,201,105,114,154,255, 61,205,154,180,107,227, 63,254,209, 6,235,175, 28,252, 70, 8, 9,122,211, 7,138,211,228, 52,
- 57, 77, 78,147,211,228, 52, 57,205,255,158,230,127, 13,174,137,144,131,131,131,131,227,255, 29,182,190,189,205,108,125,123,155,
-153,186,191, 93,224, 0, 7,187,192, 1, 14,220,145,227, 48, 21, 62,119, 8,222,136,147, 23, 3, 96, 41,165,186,191, 43, 13, 86,
- 86,245,205, 13, 10,219,253, 12,171,249,178, 32,233,222,169, 55,157,191,192,192,192, 96, 0,120,248,240,225, 29, 74,233,235,142,
-198,132,220,193,111,176,149,185,229, 24, 29,171, 53,170,138, 85,223, 43,211,163,247,190,201, 52,219,217, 5,202,181, 98,233,114,
- 16,218, 13, 20, 12,101,200, 25, 94,161,126,114,126,254,221,130,234,190, 87,175,207, 82,255,145,239,244,248,124,227,222, 35,139,
- 18, 15,206,124,252,234,118,235,110,235, 20, 19,135,190, 53,237,155, 95, 14,127,153,253,219, 52, 37, 87,250,107, 79,189,214,239,
- 89, 26,248,142,188,212,243, 43,114,106,243, 61, 87,191,240, 40,129, 64, 96,167,211,233, 50, 83,162,175,153,212,108,225,230,223,
-242, 54,143,199, 56, 27, 13,108,114,210,147, 43,161,220,209,175, 25,153,179,127, 48, 49, 26,167, 83,214, 40, 96,193, 91, 85,146,
- 21,115,249,117,244,156,157,157,165, 22, 22, 22,109,205,205,205,221,100, 50,153, 36, 47, 47, 79,157,151,151,151,152,144,144,112,
-150, 82,106,248, 59,242,104,215,176,239, 76,190,136,153, 91,246,255,252,172,168, 3, 75,171,223,191,207, 34,194,144,153,101,255,
- 47,205,138, 58,248,249, 63,225, 92, 57, 52,234,223, 28,148,253,148, 97,120, 45,141,212,176, 36,243,254,193,239,106,243,253,240,
-240,240,190,122,189, 94, 92,254, 89, 32, 16,104,174, 94,189,122,128,187, 10,254, 38,131,229, 26, 56,192, 74,207,167,243,248, 60,
-230,109,150, 82, 69,218,157, 61,242,127,114, 6,221,155,191,127,139, 97, 24,215,138,235, 88,150, 77, 78,184,190,237,141, 84,182,
-132, 16,215,175, 39,133, 76,207,200, 81, 23, 18, 66, 22, 86,101, 62, 28,130, 7, 95, 33, 12,169, 79, 8, 1, 67, 0, 30, 67, 0,
- 32, 53,241,250,246,166,149,104, 58,153,203,249,190,133,197,134, 7,148,210, 26,111, 66, 82, 27, 31,103,185,141,203,133,136,126,
- 19, 60,111,157,216, 28, 96,230,224,255,150, 50,227,241,195, 55,144, 55, 59, 47, 47,175, 48, 95, 95, 95,155, 9, 19, 38, 8, 1,
- 96,213,170, 85,222,222,222,222, 57,177,177,177, 55, 41,165, 89,117, 50, 87,246,254, 67,215,172, 88,176,173, 91,183,110, 72,205,
- 42,198,242, 85,223, 69,152, 57,250, 14,120, 83, 38,139, 56,135, 72, 45,229,178, 7, 31,125, 58,199,181,123,251, 48,126,190, 82,
-143,163,103,175, 13,221,187,105,121, 7, 75,203, 38,141,170, 51, 89,172, 42,255,115, 7, 5,237,202,170,242, 1, 96,240,171,219,
- 93,204,244, 29,173,101,232,230, 36,230,223, 5,240,107,141, 55,151,176, 15, 78, 8,132, 66,119, 66,152,210,243,206, 35, 96,202,
-202,128, 65,175, 77,120,122,105, 83,151,127, 68, 69, 29, 50, 52,157,128,216, 48,101,233, 35, 4, 96, 24, 6,124, 2,128,210,194,
-103, 87, 54,219,188,129,242,100, 17,228,109,217,176, 71,171,214, 27, 47,196,229,154,213,107,247,233, 17, 66,153,239, 18, 46,126,
-125,215,148,239, 75, 36, 18,171, 67,135, 14,217,117,237,218,213,194, 33,168,239, 5, 83,190, 99, 38,146, 4, 30, 62,252,155,176,
-107,215, 46,181, 40,159,126,157,192, 48,219, 9, 32, 96, 89,186,138,199,210,221,202,156,232,216,218, 78, 38,108, 31,212,119, 1,
- 8, 2, 76,254, 2,197,163,204, 7, 7,230,212,241,216,242,164,246,126,195,164, 18,201, 84,111, 95,127,223,248,231,207,162, 11,
- 11, 11, 86,170, 51,163, 55, 82, 74,217, 90,105, 25,140,147, 78,158,189,242, 14, 95, 32, 32, 93,218,135,201, 9, 33, 93,106,171,
-241, 82,217,114,112,232,187,110,221,186, 6,225,225,225, 0, 0,131,193, 96,190,103,207, 30,199,133, 11, 23,202, 77,185,134, 42,
-195,197,197,197,197,194,194,162,158, 84, 42,117, 1, 0,181, 90,157, 82, 80, 80,144,152,146,146,146, 82,211,119, 29,131, 7,216,
- 50, 12, 22, 28,255,245, 71, 62, 0,116,233, 63,102,145,103,196,103, 86,132, 39, 80, 87,182,191,209,160,149, 51,132,124,122,230,
-208,102, 2, 0,111,245, 30, 62,195, 46,112,192, 55, 89, 15,247,100,252, 45, 15,244, 3, 6,240,108, 99,116,125, 9, 37,147, 67,
- 66,195, 90,244,239,211, 13,129, 94,206,232, 59,104,220, 84, 0,181, 50, 88,122,189, 94,188,119,239, 94, 87,134, 97,120, 58,157,
-174,100,208,160, 65,153,175,147, 54,159,214, 31, 92, 1, 33,110, 58,131,225,167,132,107, 94,139, 40,157,203,190,154,118,167,231,
-252,217, 32,204, 40,202,178, 73,105,183,119,182,228, 12, 86, 25,182,190,189,205,120, 98,225,131,136, 54, 45,108,102,142,235, 39,
-250, 97,247, 37, 56, 7,191,155,146,122,103,183,203, 63, 53,131, 12,195,184, 30,220,177,206, 94, 42,230, 1, 0,148,106, 35,250,
- 15,157, 80,243, 5, 28, 54,228, 60, 8,252,202,219, 80,141, 70,131,132,207, 23,148, 16, 0, 32,165,163, 3,164, 82,209,181,141,
-179,195, 11,134,247,170,255,254,244,111,110,111, 1, 96, 9, 32,189,210,139,130, 97, 92,119,109, 90,101,239, 98, 35, 1,159, 71,
-160, 84, 27,208,239,253,201,198,202, 12,219,198,217,225, 11,134,118,243, 24,104,223,117, 95,127, 0,199,170,189,129, 56, 6,250,
- 43,108,157, 79,245, 31,189,192, 89, 13,115,124,190,104,165,253,149,147,123, 47,117,236,251,161, 46, 49, 57, 89,101,208,233,159,
-228,228,166, 77, 41, 74,141,142, 49,181,162, 54, 51, 51,107, 96,102,102,214,164, 91,183,110,146,169, 83,167, 10, 34, 34, 34, 94,
-108, 31, 61,122,180,240,252,249,243, 78, 43, 86,172,232,238,236,236, 92,162, 84, 42,239, 42,149,202,103,148, 82,163,169,231,196,
-209,209,238,227,183,251,246, 66,135,183, 63,130,145, 37, 24, 53,126, 18, 78, 28,251,117, 44,128, 55, 98,176,204,120,204,252, 81,
- 19,102,185,182, 11, 15,225, 47,219,243, 20, 22, 50, 33,186, 52, 15,229,139,121,211,156,118,109, 90,177, 18,192,136,202, 34, 87,
-172, 42,255,243, 32, 91,221,160,222, 45,235,227,183, 93,186, 65,174, 29,167,129,145, 89,190,136,100,121,117,155,168,176,146, 74,
-214,185, 88,242,236,197,198,204,117, 94,221, 38,158,142, 61,182,182,168,186,180, 8,132, 66,247,141,223, 44,246,177, 54, 19,130,
-199, 35,224, 51, 12,120, 60, 2,141,214,136,161,227,102,190,169, 8, 35, 79,106,239,211,157, 1,134, 3, 0, 11,108, 86,103,198,
- 28,173,205, 57, 33, 12,207,102,207,166, 21,124,123, 11, 17,120, 60, 2, 30, 83,186, 60, 79, 87, 99,226,103,243, 44, 94,215,168,
-119,107,101, 31,118,254,155,118, 93, 90, 4, 89, 55,254,229, 42,177,108,209,109,160, 77,118,137,116,216,174,131,231, 7,213,107,
- 59,249, 58,165,236, 87, 73,151, 86,159,172, 78, 71,163,209,100,116,233,218,205,156,240,229,178,211,251,183,180, 45,127,217,188,
-222,200,254,241,114,120, 10,148, 63,196,176, 20, 24,253,225, 72,116,233,218, 77,197, 26,216,228, 90, 84, 26,219,143,159,190,108,
- 87,162,167,248,122,221,134, 5,197, 5,217, 11,226, 30,219,196,203, 28,124, 63, 85,101, 68,255,102,122,198, 17, 16,125,101, 79,
-191, 29,135,175, 34, 40, 48, 0, 70,182,244,253,170,190,174,114,236, 60,114, 13,254,126,254,165,147, 55,179, 20,126,110,102,104,
-215,227,253, 58, 30,223, 8,190,220,193,127,103,223,129,195,223,233,247,246, 32, 88,154,155, 65,171,211,248,158, 61,121,236,199,
-239,215, 45,111, 69, 8, 25, 86, 27,115,200,178, 70,209, 31,255,235, 37, 0, 4, 0,180,175, 17,193,178, 11, 11, 11,123,241,217,
- 96, 48,192,211,211, 19, 41, 41, 41,126,117, 48,107, 50,103,103,231, 30,203,151, 47,183,111,223,190,189,192,206,206, 14, 0,144,
-149,149,229,114,238,220,185,166, 77,155, 54,205, 76, 77, 77, 61,146,145,145,161,170,210, 84,176, 37, 66, 30,229,243,196, 98,105,
-153,175, 5, 51,117,194,123,141,237,236,236, 42,125, 56,206,201,201, 21,205,157, 59,135,240,249,130,210,253, 41,101, 40,107,172,
-242, 29, 35, 45, 91,182,236,173,211,233, 36,149,109,203, 54,216,117, 47, 97, 69, 3, 75,239, 34, 0,159,199,203, 75,189,179,215,
-206,100,211,222,184, 79,103, 39, 70,240,125,175, 62,125, 60,250,118,143,128,147,157, 5,206, 94,123,130, 79,102,127, 13,189,193,
-184,186, 46,231,135,199,227,241, 51, 51, 51,227,173,172,172, 28,223,192,253,182,254,193, 29,107,237,207, 93,186, 53,227, 27,241,
-174,113, 13, 90, 15,215,151,191,254,206,200, 82,248, 73,204, 5,109,251,116, 82,216,184,248, 74, 55,124,179, 76,192, 69,176, 42,
-158, 8, 17,111, 97,235,150, 97, 54, 51, 39,141, 20, 45,220,112, 1, 87, 79, 30, 81,167,222,217,243, 70,204,149,194,222, 47,156,
-240,248, 99, 8,143, 39, 39, 12, 17,177, 70, 54,201,160,213, 46, 82,101, 71,167,189,174,182,145, 5,246,253, 94, 75, 99, 78,169,
-247,143,223,126,109,239, 96, 41,134, 90,107,192,136,143,191,192,250,213, 11, 20,118, 22, 34,104,116, 70,108, 62,120, 51,187,113,
-241, 74, 58,188,123,253,247, 23,111,140,250,245,171,237,143,127, 45,189, 86,171, 40,120,132,129,189,133, 24,139,118, 62,129,185,
- 76, 0,107, 51, 17, 24,166,114,115, 53,188, 87,169,102,126,145,214, 64, 8, 17, 81, 74, 43,173,220,204,156,130,218, 40,236, 92,
-247,246,251,112,129, 93, 76, 22, 1,165, 90, 60,179, 16,163,255,208,113,150, 94,142, 82,200, 37, 60,196, 39,165,121,126, 54,109,
- 90,168,196,201, 63,172, 36,237,113, 98, 77,217,246,240,240,232,223,179,103, 79,217,148, 41, 83, 4,110,110,110,216,190,231,132,
-123,167,119, 38,246, 74, 73,207,113, 99, 41,224, 96,111,157, 52,114, 96,247, 67, 71,143, 30, 77, 72, 74, 74, 18, 44, 95,190,188,
-249,254,253,251, 3,107,243, 36,106,164, 20,106,173, 17, 70, 35, 11, 35, 75,144,149,175,169,195, 77,133, 48, 85, 63, 85,211, 62,
-157, 35,154,241, 87, 29,120,134, 34,149, 30, 82, 33, 15, 79,211,138, 17, 30, 30,198,223,189,153,180,175,236, 27, 35,223,233,241,
-185,131,130,118,237,221,178, 62,236,173,100,216,244,205, 98,252,118, 37,174,107, 70, 17,129,109,239,229, 99,156,196,252, 78,118,
- 50,225,186,136, 80,111,199,183, 66,220,113, 43,212,219,241, 98,228,227,232, 70,239,174,156,144,162, 20,156,206, 61, 54,161,168,
-170,243,110,109, 38,196,134, 19,241,144,139, 5,144, 75,248,165,139,152, 15,134,121,189, 23,198, 75,157, 3,221,120,172,113,164,
-185,115,224,200, 65,239, 14,112, 30, 60,232, 29, 74, 24, 30,246,252,122,168,207,207, 63,111, 79, 51,115,244,219, 96,100,120, 27,
-213,169, 15,147,106, 62,158,128,189,133, 8,159,253,244, 0, 10,153, 0,230, 50, 1, 20, 82, 1,222,106, 98, 87,231,116, 18, 66,
-172,198,246,105,208,253,222,182,142,237,253,234,153,249,220,141, 45,120, 56,114,209,173,213,231,243,219, 79, 90,183, 42,208, 70,
-148,167,225,127, 49,245, 67,126, 74,106, 90,251, 61,135, 46,116,112,110, 54,242,137, 65, 87, 60, 43,243,238,238,131,149,233, 37,
- 61,190,210,212, 53,124,128, 68,167,212,223,191, 27,157,236,149, 91, 34,194,195,132,194,178, 99, 42,128, 89,249,177, 45, 59,190,
-105,201,241,200, 85,241, 46,167,216, 48,237,233,249, 43,181,106,138, 82,235, 88,220,141, 83,194,195,183, 41, 28,157,156,161,237,
-254,158,199,141,179,251, 14,202,157, 2,150, 22,167, 61,154,101,170,206,142,195, 87,177,112,233,234, 24, 16, 60, 42,187,155, 7,
- 76,153, 60,193,231,235,149,235, 94, 90, 55,238,163,241, 62,117, 53,215, 50, 7,191,159, 59,246, 30,246, 78,227,230,157, 16, 19,
-251, 12, 49, 81,183,240, 86,199, 46,232,214,179, 31,180,154,146,247, 55,254,184,238, 38,128,111,255, 84,231, 58, 5,180,110, 20,
- 20,240,179,179,147,179, 27,165,101,175, 38,163, 20,237,219,183,199,180, 79, 71, 65,165, 44,130,159, 95, 80, 43,203, 54,157, 53,
- 93, 7,126, 12,150,165,200,201,201, 46,126,242,248, 97, 71,117,198,227,235,166,166, 81,165, 82,233,179,178,178,112,231,206, 29,
- 68, 71, 71, 35, 42, 42, 10, 57, 57, 57,176,176,176,168, 85, 19,187,149,149,149,121,104,104,232,123,187,119,239,150, 88, 88,252,
-225,249,181, 90, 45,100, 50, 25,250,246,237, 43,104,221,186,181,203,240,225,195, 63,176,178,178,218,145,151,151, 87, 88,169, 97,
-186,119, 56,213,177, 81,223, 31,186,191, 51,122, 28, 0, 8,197,102,113,107,126,250, 53,170,186,223, 22, 74,204,221, 59,246, 29,
-225, 5, 74, 65, 8, 89,147,253,248,215,244,170,246,213,233,116,210, 95,126,249,197,133, 16,242,210,253,117,193,218, 95, 90,222,
-143, 73,235,248,253,188,233,124,133, 92,140,236, 2, 45,198,140,155, 96,107,178,185,106,212,103,124, 88,211,166,223,126, 49,117,
- 20,228, 50, 41, 78, 94,123,134, 79,103, 46, 53,228,102,103,110, 3, 33,171,178,162,246,191,110,171,197, 27, 25,241,230,227, 98,
- 6, 69,151,112,201,168,119, 35, 36, 90,189, 17,121, 74, 61, 52, 58, 35, 88, 74, 81, 80,172,199,195,132, 34,216, 90, 8,177, 1,
-255,125,106,101,176,248, 2, 81,207,137,195,186,139, 86,236,184,142,171, 39,119,168, 83,111,239,145,149,111,115, 11, 29, 20,151,
-116,107, 87,253,151, 61, 74,205, 35, 12,164,206,129,110,124,194, 91,217,178, 77,203,206,163,199,140,163,141,253,220,133, 0,131,
- 71, 49,207,245,155, 54,110, 24,102,225,214,104,117, 97,242,131,207,203,111,166,181, 29,181,192,178,108,242,171, 17, 43,150,101,
-147,107, 74, 39, 33,128,165, 92,128, 31,142,196,149, 62, 25,131,194, 66, 38,192,206,115,201, 40,204, 77,201,110,172, 94,249,251,
-200,238,246,189, 23,109,124,120,240,187, 67, 25,145, 0,162, 40,165, 25, 85,105, 18, 6,224,243, 8, 44,228, 66, 88,200, 4,176,
- 48, 19,128, 33,164, 74,115,245,197,143,247,182, 0,120, 82,209, 92, 85,212,148, 59,248, 53, 52,183,243, 56,240,246,216, 37, 86,
-247, 19,117, 96, 24,160,190,163, 28, 86,102, 34,104,245, 64,124,150,174, 44,175,230, 24, 63,101,158,221,140,201, 99,143, 18, 18,
-209,152,210,243,134,234,242,174, 82,169, 68, 67,135, 14, 21,232,245,122,221,240, 79, 22,117, 78,203,200,238,179,122,201,103, 98,
- 91, 91, 27, 20,151, 24,112,231, 81,124,192,210,175,190,169,127,236,252,141,253, 51,198,246,249,173,107,215,174, 22,191,252,242,
- 11, 91,155,243,158,149,145,253,205,230,237,123,183,173, 90,177, 20,143,227,115,177,233,199,239, 64,141,134, 31,170,247,187, 47,
-107,174, 95,191,222, 62, 60, 60,156,185,118,237, 90,206,171, 6,148, 16,200,115, 11, 52,176,148, 11, 33, 19,243,225,104, 41,134,
-141, 66, 8,177,144, 1,195,252, 81,137, 84,212,220,184,247,200, 34, 86,149,143,223,118,233, 6,109,250,102, 49, 70,124, 60, 27,
- 15,178,133,199, 25,153,229,162,143, 7,246,153,110, 45, 67, 55, 23, 75,198,254,173, 16, 15,200, 37, 66,204,156, 56, 20, 97,145,
-241,246,201,249,236,236, 92, 21,154, 0,248,188,178,116, 50, 60, 2, 62,143,129, 66, 42,192,249, 35, 59, 51, 85, 69, 5, 5,132,
- 87, 26, 97,209,107,117, 9,166,121,253, 63, 31, 79,185,131,223,140,144,224,198,139,199,141, 30,201,180, 10,111, 70, 25,134,143,
-236, 66, 29,161,160,152,244,241, 88,140, 31, 59,202, 49, 57, 37, 99,206,183,223,173,255,220,204, 62, 96,161, 50,243,209,188,234,
- 52,121,132, 1,195, 16,200,165, 2,152, 73,254, 88, 74,180, 44, 8, 1,207, 53,100, 80, 1, 8, 64, 8, 73, 77,186,185, 51,192,
-148,116, 58, 55,234,118,230, 66,166,208, 95,117,180,228,234,211,152,219,139,110,220, 75,188, 65, 41,205,173,215,110,242, 7,122,
- 61,133,178,196,128,231, 25, 42, 24,180,148,140,232,234, 14,207,119,136,223,146, 77,183,183, 17, 66,204,203, 35, 46,175,106, 38,
- 95,221, 83, 98,219,168,255,192, 85,107,215,223, 92,177,120, 54, 47,167, 80, 11, 35, 5,164, 34, 30, 36,101,139, 84,200, 67, 73,
-113, 1,190,253,225,167,116, 3, 72,127,122,190,250, 50,255,231, 74,131, 14,233,223,189,237, 46, 2,136, 8, 35, 76,118,118,247,
-112,239,208,115,152,228,173, 94,239,195,104,208,205,144, 59,248,159, 43,206,120,124,198, 20,205,160,192, 0,128,224, 81,230,253,
- 3,253, 75,111,146,125,127,245,247,243,247,121,117,157,183,183,175,143, 41,231,189,252,225, 66,106,231, 51,218,219,191,209,180,
-113, 95,172,247, 72,205,209,192,202,197, 27,119,110, 71,226,196,158,111,111,171,139,242, 86,156, 56,188,127,218,194,101,171,155,
-244,236,251, 46, 14, 30,216, 61,133, 16,242, 29, 45,229,133, 38,101,217, 33, 91, 54,172,119, 19, 8,197,208, 27, 41,244, 6, 22,
-122, 35, 11,189,129, 34, 45, 45, 21, 69, 74, 37, 36, 82, 5,228,230,214,208, 27, 74, 35,133, 26,141, 94, 62,246,253,158,227, 1,
- 92,175, 44,157,158,205,135,222, 2, 67, 92, 75,215,151,153, 19,198, 74,229,228,228,180, 13, 0,196, 98, 49,196, 98, 49, 12, 6,
- 3,238,167, 98,146,115,216,144,153,160,101,119,118,150, 77, 78,187,189, 51,180,170,188,187,185,185,245,170,204, 92, 41,149, 74,
-252,126,243,158,197,230, 95, 78,118,141, 79, 74,111,192, 26,237, 53, 82,199, 38, 93, 0,244,170,234,120,166,223, 63, 48,190, 94,
-196, 36,102,202,184,161,222,107,126,218,123, 35,230,248,194,106,195,201,245, 59,206,208, 78, 27, 63, 56,244,203, 53,155, 98,146,
- 47,172,254,180,166,115, 36, 20, 10, 5, 89, 89, 89, 47,174,239, 5,235,246,117, 75,204, 40,236,248,213,226,217,194, 59,207,148,
-184,247, 60, 13,195, 58,185,155,124,189, 59, 53,236,231,231,238,225,182,122,245,194, 79, 16,157,170,198,186,125, 55,112,225,200,
-182, 72, 93, 73, 81,143,204,168,223, 50,235, 82,135,188,174,193,170, 76,179,252, 70,112,238, 94, 54,138,212,165,198, 74,111,100,
- 81,164, 54, 32, 51, 95,131,130, 98, 61,148, 37,122, 12,235,232, 94, 23,191, 18, 6,192, 14, 64, 22,128,155,175,124, 70,217,255,
-168,228,115,118, 89,196,208,166, 44, 18, 43,170,160, 89,254,185,170,245,229,223,127, 8, 32,160, 76,211, 8,224, 6,128,188, 26,
- 61, 19, 33,132, 82,250,199, 43,149, 95,253,252, 82,228,193,160,119,117,118,114, 2, 75,147,203, 35,156,165, 81,143,230,131, 84,
-159,142, 30, 32,117, 14,126,167, 56,245,206, 94,147,251,100, 41,236,125, 91, 74,165,178, 35, 75,151, 45,167, 3,123,181, 19,165,
- 23,232,213, 15, 83, 74,178,148, 26,106,112,180,243, 18, 47,251,242, 75,179, 37,203, 86,124,180,255, 87, 54, 31,192, 87,149,134,
-159,195, 6,223, 34,132,113,101,254, 8,203,131,178, 52, 57,249,230,142, 80, 0,120,157,190, 86,197, 37, 6,240,120, 4,130,178,
- 62, 41, 42,173, 17,170,252,244,156,198,170,213,191,143,236, 90,106,174,174,167, 56, 62,227,241,178,116,148,210,106,155, 32, 24,
- 66, 80,168,210,195, 92, 42,128,133, 92, 8, 75,153,240, 69, 4,171, 10,115, 21, 85,157,166, 80,167, 75, 50,234, 53, 37,212,104,
- 68,247, 48, 59,216, 91,136,224,100, 37,134, 68,196,135,222, 8,168,181, 44,212, 90, 35, 18, 50, 85, 40, 82,137,209,168,221, 32,
-111, 91,167,235, 42, 91,143,176, 45,217,241, 55,199, 84, 27, 97, 50, 26,241,243,222, 19,222, 41,105,153,125, 14,110, 95, 41,206,
- 44,208,227, 94,188, 18,153,121, 90, 80, 98,129,153,159,127, 46,254,226,139,185,253,118, 31, 56,243,188,101,168,111,114,173,143,
-107,230,227,237,141, 91,245,248,166, 71,175,190,138,135, 55,142, 33,230,206,153, 47,148, 25,181,235,127,229,238,238,110,252,246,
-219,111, 45,127,248,225, 7,111,123,123,251,164,204,204,204,184,242,230, 40,207,192,240,212, 83,103, 47,218,180,107,213,150,159,
-148, 93, 2, 91,133, 16,238, 14, 50, 68, 94, 57,167,101, 8, 57, 94,153, 94, 89, 51,224, 96,215,142,211,240,219,149,184,174, 81,
- 57,226,243, 31,142, 26, 17,127,234,200,141,156,181,219,207, 44,119, 49,211,223,149,176,153,235, 34, 67,189, 29,103, 76, 24,138,
-165,107,183,227, 66,228,227,204, 98,198,121,113,154,198,112,106,238,160,202, 91, 59,120, 12, 32,224, 19, 40,164, 2,168,138, 11,
- 10, 30,156,254,206,247, 13, 61, 28,125,112,226,192,118, 38,183, 72,143,228,108, 53, 73,205, 41,130,129,101, 97, 41, 23,193,192,
- 2,249,185,217,228,231,159,183,227,230,205,171, 12,120,204,135, 0,230,213, 20,193,226, 49, 4,102, 18, 62,204,164,165, 81, 32,
- 51, 41, 31, 58, 3, 11,159,250,110, 88,189, 96,162,185,157,189, 3, 58,247, 31, 99,122,132, 77,110,213,100,235,247, 11,113,254,
-234,221,136,115, 79,119,134,217, 7, 53, 89,235, 26, 56, 96, 5, 99,237,172,214,232,141, 40, 44,200, 67,137, 38, 9,205, 92,178,
- 97, 45, 55, 34,190,208, 9, 15,210, 99,204,106,106,206,202,190,255,235, 29,187,160,126,159,239, 57,116,118,105,151, 78, 17,136,
-122, 94, 88,106,174,132,165,230,138, 79, 88,172,252, 97,189, 62,175,160,168,103,246,131, 3,217,117, 40,159,167,203, 42,227,210,
- 72,177, 67, 3,187,159,215,125,190,117,212,180,229, 93,186,244,251,128, 60,184,121,110, 22,128, 51,166, 70,207,255,188,142,154,
-180,174, 42,115,101,239, 21,186, 99,243,150,157, 3, 3,125,220,144,145,175, 71,106,158, 14,151, 34,159, 98,255,250, 89,249,249,
- 25,207,134, 64,167, 84,178,196, 80,112,242,196,161,227, 31, 77,156,134,134, 13,155,120, 20, 38, 23,154, 3, 40,120,233,102,200,
- 35,235,223, 31, 57,118,160,131,189,131,130, 45,139, 96,177,148,194,207, 47, 16,221,123,245,199,249,139, 87,240, 48,234, 94,233,
-122, 22,160,148, 34, 63, 47, 39,221,160,215,110,169, 50,125, 60,226,186,249,135,149,246, 12, 1,116, 6, 22, 90, 61,139, 25, 51,
-191,208,126, 50,103, 93,235, 46,173, 26, 71,241,192, 22, 38,166,229, 91,222,124,146,214,136, 8,204,157,222, 27, 61, 93,168,214,
- 25, 81,168,210,227,204,158, 53, 85, 55, 51, 54,104, 18,238, 25,208,122,228,232,217, 63,136,197, 60, 70,215,208,215, 45,174, 93,
-139,134, 73,245,156,109,139,150,172,249,185,217,149,200, 39,221,251,191,221, 79, 50,176, 65, 32,113,182,145, 40,198,142,159,208,
-216,209,167,245,251,233, 49,151,183, 85,121,243,227,139,243,221, 92,221, 94, 52, 37,218, 7,245,189, 7,224,213, 59,127, 66,230,
-131, 3,141, 1,192,222,193,177,132, 8,196, 69,181, 48, 32, 20, 0,230,175,221,219, 61, 57, 75,249,206, 87,139,103, 11,239,196,
- 21,227,206,179, 2,136,132, 60,104,116,166,119,107, 51, 18, 58,105,250,132, 17,130,220, 98, 3,206,221,203,194,131, 91,103,169,
- 65, 87, 56,140, 18,254,112,187,160,190,239, 19,192,147, 2,207, 25,130, 31,181, 12,182,228,223, 61, 80, 80,215, 8,150,125, 96,
-255,150,132,135,238, 60,190, 48, 12, 96,253, 13,122,189, 61,195,227,101,167,223,221,235, 80,139,188, 67,149, 25,131,229, 75,230,
- 96,245,134,253,184, 17,157, 11, 11, 67, 18, 14,110, 90,140, 41, 75,127,134, 74,107,172,170,124, 87,231, 71,236, 8, 33,135, 41,
-165, 61, 1,116, 4, 32,170,240, 25,132,144,195,101,191,253,210,231, 25, 51,102,204, 90,186,116,105, 84,249,190,229,235,203,247,
-173,110,125,133,239,219,204,156, 57, 51,104,217,178,101, 75,194,195,195,119, 93,185,114, 37,206, 36,131, 85, 49, 19,132,144, 42,
-175,114,135, 70,125,154, 1, 12,207,209,198, 12,222,245,221, 32, 31, 48, 92,234, 26, 50,176,152,199, 99,152, 45,171,103, 73,114,
-212,124,240,121,188, 98,147, 43, 95, 7,255,230, 10,133,226,232, 47,187,247, 81, 31, 15, 71,209,190,107,249,137,145,113,170, 23,
- 33,221,194,172, 4,145,183,181,134, 55,240,221,254,242,227, 39, 79, 77,170,202, 96, 17,194,184,174, 93,249,165,189, 66, 42, 0,
- 67,128, 66,181, 1,147, 38, 79,127,237,187, 23, 5,229,141,159, 60, 23, 12, 41,189,249, 40, 11,114,177,120,213,102,101,127,215,
-179,151, 71,118,181,237,189,104,227,195,131, 39, 31, 73,159,246,235,215,161, 32, 62, 62,190,198, 3, 77,168, 49,249,157, 15, 62,
- 17, 50, 76,105,179, 17, 33, 4,128, 49,163, 46,230, 10, 0,242,242,226, 10,165,142,141,251,109, 95, 57, 97, 67, 61, 87, 23,107,
-133, 76, 2, 51,185,152,248,251,121, 73, 90, 52, 15,151,186,123, 53, 20, 94,124,164, 68, 98,150, 26,207, 82, 10, 33,182, 11, 18,
- 12,140,232,132,237,107,166,119, 55, 37,255,103,175, 62,232,245,221,138,217,226,140, 60, 29, 30, 37, 21, 33, 61, 87,131,244,188,
- 18,164,231,105, 96, 38,225,163,197, 91,253,197,191,157,217,219,183,101,168,239,218,186, 28,223,103,177,113,251, 19, 82,210,134,
- 53, 14,110,134,159,183,110,110, 65, 92, 93, 37, 52, 57,185,196,212,239,111,216,176, 33,183,105,211,166,182, 95,125,245, 85,177,
-159,159, 95, 19, 63, 63,191,250,209,209,209,231, 27, 52,104,208,235,251, 53, 11,207,127, 50,123,133, 59, 31, 6,139, 22,173, 90,
-241,100, 34,130,107, 23, 79,106,182,108,248, 33, 85,151,175,156, 86,173, 17,150, 89, 46,202, 40, 34,176,115,118,123, 32, 23,232,
- 59, 11,100,186,232,220,109, 19,182, 3,248,213,171,219,196,211,231,110, 61,137, 14,137,140,183, 63, 27, 25,157,153,171,210,251,
-198, 30,155, 92,109,133,203, 35,101, 17, 44,217, 31, 17, 75,135, 38, 3,158, 82, 66,236,202,141, 13, 65,105, 68,139,148, 62, 31,
-164, 38, 71,254, 98, 66,199,104, 66, 89, 22,136, 78, 86,162, 72,109, 64,137,222, 0, 55, 91, 57,178, 50,146,241,253,218, 45,184,
-125,235, 38, 58,119,235,141,111,127,250, 25,163,222, 31, 80,227,113,101, 24, 2,134, 33,101,145,171, 82,115,101, 38,225, 3, 4,
-200, 47,214,227,215,203, 73,240,170,207,128,212,162,181, 80, 97, 38, 69, 65, 81, 9, 24,129, 25, 30, 95,218, 38, 59,118,246,198,
-204,121, 43, 54,126, 86,168,204, 72,140,125,120, 21,126, 86, 57,168,239,172, 69, 84,134, 5,110,229,122,192,207,171, 1, 24,225,
- 77,147,180,179,163, 26, 45,255,141,217,215, 51, 44, 56, 48,188,158,189, 5,212, 90, 99, 89, 20,139,143, 45,155, 55, 35,254,121,
-242,200,236,168, 3,183,223,132,147, 85,102, 60,203,146, 56,248,124,116,255,218,153,184,190, 67,198,195,209,165, 94, 19,211,187,
- 39,152,102,166, 88, 19, 12, 22, 33,132,177,246, 8,222,186,117,251,158,129,245,235, 57,226,212,141,231,184, 29,155, 7,115,133,
- 37,120,114, 39,248,182, 27,110,121,255,248,154,183,213,217,202,173, 2,161,236,195,102, 45, 90,129, 82,138, 39,143,163,114, 11,
- 10, 44,254, 84, 55,171, 82, 31,223, 1, 96, 94,113,157,204, 46,160,137,194,194,250, 78,137,206,136,148,148,100,252,126,229,124,
-211,178,253, 76, 70, 44,100,112, 50, 50, 19, 58, 3, 11,157,158, 69,211, 70,254, 37, 2,161,180,205,151, 27,142,180, 72,207,200,
-100,100,102, 22,172,133,109, 3,161,165, 62, 93,115, 55,174, 64,168, 51,176,104,224, 84,253,115,185,204,186,193,146, 79, 39,127,
- 18,192, 23, 73, 81, 88,172,209,166, 37,167, 56,254,184,243,156,242,209,147,135, 46,158, 30,245,204, 23, 46,156, 39, 44, 44,161,
-200,204,215, 32,187, 72, 71,222, 29, 60,210,121,219,166,111,135, 0,216, 86,139,164, 55,218,181,237, 7,189,181,153,144, 20,169,
-244, 52,171,176,196, 56,254,163, 73,141, 94,167,236,188,100,174,158, 21,227, 78, 92, 62,196, 66, 30,196, 66, 30,244, 6,211,186,
- 72,218, 5, 14,144,219,217, 89, 14,105, 30,236,141, 19,145, 89,224,243, 8,212,197,133, 90,137,216,236,129,191,191, 15, 19,220,
- 36, 8, 17,173, 91, 34, 54, 46,222,239,196,169,179,171,110,220,188,189,216, 46,168,223,180,172, 7,251,191,173, 77, 90, 19, 82,
-178,228, 25, 6,183, 65,246,142,182, 65,189,123,247, 18,215,115,113, 32,182, 54,150, 48, 66,136,113,227, 63,182, 55,185,213,136,
- 82, 80, 0,203, 22,204,132, 70,171,133,189,165, 8,148, 2,155,214,205,135, 86,171,133,179,141, 4, 5,197,250,234,202,121,181,
-126,164, 50, 67,244,170,209, 42,255,191,124,191,165, 75,151,246,124,197, 0,246,172,194, 24,254,105,191,242,239, 47, 91,182,108,
- 73,133,237, 42,147,155, 8,203, 51, 83, 85,166,236, 26,247,107, 37, 21,203, 79,126,187,116, 18,147, 95,172,131, 88,200,160, 65,
-125, 79, 76,152,248,137,236,173, 96,123,168, 97,142,125, 59,183, 20, 26,140,250,195,166,252,168,204,209, 39,212, 76,166, 56,190,
-105,235, 78,214,209,222,150,252,120, 58, 43, 46,171,208,240, 98,138,131,232,235,191,177,183, 78,252,232, 68, 65,142,203, 36, 82,
-111,141, 86, 99, 85,229,141,161,236,132,110, 58, 25, 15, 30,195,128,247,134,102,246, 98, 24,198,248,211,218,133,176, 53, 47,237,
-115, 53,127,245,246,162, 94,118,199,207, 86, 52, 87,193,193,193, 5, 77,154, 52,201,103,152,154,127, 52,241,198,207, 45, 43, 41,
- 40,117, 50, 87, 47,250,137,164,223,187,137, 87,102,226, 39, 36, 68, 96,235,185,103,202,160,247,134,204,116,104,216, 75,241, 60,
-173, 0, 34, 70,143,176, 0, 39,156, 63,241, 43,155, 20,247,104,172, 41,218,153, 57, 5,110,182, 54, 54,184,253, 76,137,212,156,
- 18,164,229,150,154,171,244,220, 18, 20,170, 13, 8,246,180, 71,126,129,210,173,206, 6,150,208, 3, 39,142,159, 24,214,173,207,
- 64, 76,248,108, 94,183, 13,223,125,125, 79,234, 16,240,190, 58,227,209, 13, 83,190,191,103,207, 30,163,135,135, 71, 92,118,118,
-118,216,180,105,211,138, 60, 61, 61, 29, 23, 46, 92, 56,186, 65,131, 6,206,111,181,111, 95,112,243, 92,139,173,159,124, 54,175,
-253,172, 79, 54,212,103, 24, 38,131,178,244,183,212, 98,253, 92,154,245, 80, 93,237,121, 58, 56,243, 49, 9,156, 63,236,173, 54,
- 54,191,217, 72,153, 64, 1,209, 12, 38,129,243,119,211,135,115,117,177,199,214, 22, 53,122,119,229,132,148,124,118,118, 9,227,
-184,184, 38,115, 85, 26,193, 34,208,234, 88,152, 75, 5,229, 35, 71, 1, 10,167,239,214,125, 45,179,179, 16,131,207, 35, 16,240,
- 24, 20,168,244,200, 41,212,226,179,105,211, 76, 61,130,172,145,101,161,210, 24,161,214, 26, 64, 64, 80, 84,152,141,153,159,125,
-138,110,189,250, 99,228,216,201,200, 87, 3,183,226,138,160,211,235,107,180, 69, 60, 2,168, 52, 6,140,236,226,142,156, 34, 29,
-138, 75, 12,208,234, 88,200, 36,124,240,249, 12,228, 98, 62, 20, 82, 1, 8,161, 66, 39, 39,167,209, 0, 32, 16, 8, 74, 18, 19,
- 19,183, 87,221, 60, 79,225,225,230, 0,181,142, 65,179,129, 43,208, 49,220, 23,119, 78,109,228, 95,188,126,191,254,103,243, 86,
- 97,252,224,112,236,125,226, 5,107,123, 15,152,201, 36,208, 83, 6,128,105, 83,128, 80, 58,151,117,242,239, 63,248,135,159, 54,
- 61, 89,240,197,116, 73, 94, 49,129, 88,200,199,217,179,167,113,245,250,173, 53, 89, 81, 7,182,191,201,190, 20, 2,202, 56,152,
- 91,152, 67, 34,226, 65,167,211,152,220,225,219,200, 82,128, 34,192,190, 81,223, 95,203,206,125, 0, 91,201,186,154, 34, 88,132,
- 16, 98,225, 28,180,249,135, 13, 63, 15,113,114,180,199,254, 51,247,176,117,195, 55,112, 9,234,134,167,145, 63,192, 45,164, 47,
-204,234,119,128, 72,177,103, 52,195,227, 55, 26,255,201,204,254, 33,161,225,184,114,233, 28, 50,211,211,126,160,244,177, 73,125,
-208,120, 2, 50,177,125,199,158,208,232,140,104,211,161, 39,142, 31,218, 63, 1,101,131, 39,234, 10,143,199,176, 31,143, 26, 36,
-200,204,215, 10, 50, 11, 52, 72,201, 86, 35, 46,189, 24, 7,127,217,104,114,147, 20,225, 49, 97,237,154,184, 10, 70, 47, 63,155,
-228,230,234,164, 17,104,212,210,232,216, 88,255, 15,135, 13, 17,120,122,251, 49, 89,249, 26,100, 21,104,145, 85,160, 69,113,137,
- 30, 94,206,245, 24,141,129, 31, 94,219,180,218, 91, 72, 4,223, 30,142,131,185,140,143,150, 1, 54,117,238,132,205,178,236, 31,
-230,106, 81,105,228,234,110, 92, 1, 36, 66, 30, 68, 2, 30,196, 66, 6,122, 35, 53,241, 94,100, 24, 52,102,216,187, 82,173,158,
- 34,187, 80, 11, 30, 67,224,104,107, 35,118,115,242,197,166, 21, 31, 3, 0, 70, 77,255, 14, 31,142, 24, 10, 63, 95,111, 20, 20,
- 20, 73, 63, 28,247,201, 74, 84,210,239,174,170, 72,219,207, 7, 47, 6,222,122,144, 48,229,131, 97,239, 11, 6,246,110,203,220,
-126, 86,136,180, 92, 13,158, 61, 85, 65,171,175,221,108, 52, 6, 99,105,155,239,230,221,135, 33, 19,242,144, 85, 80,122,185, 44,
- 90,183, 27,102, 82, 62,210,243,180, 96, 89,182,186,244, 84,235, 71,170,138, 58,213,134,138, 38,172,186,245,132,144,195, 51,102,
-204,152, 5,128,206,152, 49, 99, 86,249,231,165, 75,151,170, 1,164,154,100,176,202, 51, 85,169,123,110,220,175,149, 84, 36, 57,
-185,109,221, 44,233,153,104,138, 53, 39, 35,209,189,133, 19,132,124, 2,137,153, 35,238,196,229,227,204,153,131, 69,151,174, 94,
- 47, 33,140,190,198, 97, 81, 50, 39,191,166, 50,137,226,244, 55,235,183, 26, 28, 28, 29,177,243,114, 94,106,142,210,160,255,163,
-121, 74, 79,110,157,248,177,190,129,213,119, 85,167,199,212,248, 56,203, 82, 42, 92,250,253,111,160,148, 2,172, 17, 44, 88,240,
-132, 98,185,123,243,161, 25, 32,128,209,200, 74,248, 60,166,228, 69, 59, 72,233,173, 41, 57,225,250,142,106,155, 14, 9, 0,115,
-153, 0,191, 92, 72, 70, 65,110,106,118, 47,187,227,191,151,155,171,227, 81,226,167, 33, 33,193, 5,205,155, 55,207, 23,139,197,
-224,241,120,117, 57,193,175,101,174,170, 46,156,145,122, 0,203,156,253,219,246,238, 38, 15,106, 46, 34, 2,132,248, 59,225,252,
-201,253,236,213, 99, 27,251,169, 50,162,143,152, 26,226, 85,150, 24,144,154,171, 70, 74,182, 26,105,121,101, 17,172, 92, 13, 8,
- 1, 74,180,175, 55,125,141, 42, 35,250,144,153, 75,195, 31, 52,122,140,109,211,185, 47,166,204,251,198,123,251, 15,203, 47,201,
-237,125,194,138, 51, 99,238,155,162, 17, 31, 31,175,113,112,112,184, 93, 84, 84,212,105,229,202,149,202,128,128, 0,145, 84, 42,
-205, 1, 32,137,121,242, 68,120,246,232,158,231, 89,169,169, 99,116, 58,221, 77, 83,211,229, 17, 49, 92,236,111,158, 59,218, 93,
-214,178, 75, 3, 71, 25,220,101,197, 93,252,205,238,126,101,255,214,164, 37,153,103, 86,103,166,105, 12,167,114, 85,104,146,162,
- 20,156, 54,169,178,209,105, 19,222, 27, 51, 3, 60,134, 64,167,209,190,232,147, 97,103, 33,198,188,237,143,160,144, 10, 96, 38,
- 21, 64, 33,229,163, 85,128, 13,106, 17, 32,162,122, 3,133, 90,107,128, 90, 99,132, 90, 99,128,109, 61, 75,252,180,109, 47, 18,
-179,212,248,237,102, 54, 30,199, 23,194,215, 77, 14, 74,107,142, 59,177,212, 88,252,238,232,217, 10, 30,195,128, 71,192,248,123,
-123, 32, 87,169,133,144,207, 64, 36, 18, 65, 38,225,195, 92, 38,128,128, 47,192,141,123,247,160,209,104,208,188,121,115, 73, 77,
- 13, 14, 10, 51, 41,124,234, 59, 67,167, 55,224,232,197,135, 88, 52,169, 31, 58,181, 13,197,103, 60, 17, 30,107,130,161,176, 86,
-128, 37, 60,232, 12, 44, 52,122, 35, 0,162,174,230,154,105, 89,214, 47,162,132, 82,122, 45,237,241,175,137,246, 13,251,142, 62,
-118,242,236,246, 94,221, 59,227,246,221, 40,236,219,255,219,165,108,155,130,169, 21,190,211, 8,101,163,224, 40,165, 81,117,172,
-140,137,220,193,127, 82,120,171, 8, 40,243, 50,145,145,244,220,228, 74, 61,176,158, 2,159, 78,154,224,227,231,231,231, 99,100,
- 41, 88,150, 34,208, 93,129, 49,227,198,249,120,121,251,250,176,101,163, 8,253,221, 20,213,234,200, 29,252,198, 47, 94,249,253,
-251,110,110,110, 56,126,249, 17,150,206, 30,123, 91, 38, 51,243, 12,181, 86, 88,178,126, 77, 16,247,224, 20,172, 61,242, 97,238,
-224,227,218,187,211, 48,215,110, 61,250,226,254,221, 72,172,254,106,225,213, 98,158,116,137, 41,105, 53,115,104, 96, 23, 28,214,
-246, 61,115,107, 7,228, 21, 40, 97,102,101,143,128,198,161,239,153, 57, 52,152,174,204,120,150, 85,215,107,157,165, 20, 26, 29,
-139, 92,165, 14,201, 89,106, 60,207, 80,225,121,186, 10, 44,251, 71, 83,112, 77, 37,148,128, 16,185,152,207,183,214, 63,173,119,
-239,244, 89,234,238,230, 64,150, 47,156,198,211, 81, 49, 50, 11,180,200, 42,212, 34,171, 64,131,172,194, 82,131,101,101,198, 7,
- 75,217, 90,143,206,200, 85,234,160,144,242, 97, 33, 23,194,104,172,123,159,239,121,171,118,182, 76,206, 82,190,245,213,162,217,
-194, 59,207,139,113, 47,174, 0, 98, 33, 83, 26,189, 42, 51, 88,166, 54, 11,243,248,204,132, 30, 29,155, 35, 41,171, 4,124, 30,
- 3, 62,143,129,119,195,166,176,149,177,120,107,224, 12, 0, 64,175,238,165,211,144,196,165, 21,227,208,181, 52, 0, 16,154,154,
-214,204,236, 66,201,254, 83,183, 63,217,249,211,114, 81,137, 81,128,239,143,196,163, 68,107,132, 88, 88,214,236, 46,170,221,253,
-205, 96, 44,141, 96, 37,101,233, 80,172, 49,162, 80,165, 3,165,192,141,167, 69, 80,105,140, 40, 80,233,208,194,207,186,166,251,
- 15,169, 97,123,207,215,187, 79,210,158, 40,237,171,101,103,106, 4,107,233,210,165, 81, 75,151, 46,173, 52, 34, 86,163,193,170,
-210, 92, 9, 37, 39,183,174,157, 37, 61,253,132,226,252,189, 28,188,211,198, 21, 57,153,201,216,240,221, 26,150, 82, 64, 44, 17,
-165, 27, 13,236,177, 18,214, 48, 45,255,238,161,106,219,125,229,118,129,141,165, 50,217,217,165,171,127,208, 57, 58,185,178,191,
- 94,203,207, 44, 80, 25, 95,138, 21, 26, 53, 26,134,178, 84,104,138,185, 42,107,218,208,205,155,208, 15, 44,165,152,187,102, 55,
-150, 78, 25, 4, 51, 9, 95, 70, 8,145, 21,151, 24, 48,105,225, 70,172,252,124,132, 66, 38,230,151, 25, 3, 35,198, 78,248,204,
-164,147,160,214, 24, 81,156,151,158,211, 72,185,234, 21,115, 21, 82, 16, 22, 22,150,111,101,101, 5,185, 92, 94,107,131, 85,153,
-185,114,116,116,116,150,201,100,214, 62, 62, 62,101, 79,125, 60, 24,141,198,226,152,152,152, 58, 77,250, 86,152,159,125, 32,245,
-249,131,230,173, 34,122,224,194,201, 3,236,213,163, 27,250,213,102,136,185,165,133,121, 82,228,195,132, 0,192, 12, 41, 57, 37,
- 72,207, 43, 65, 90,174, 6, 58, 3, 11,119, 7, 25,146,147, 18, 97,105, 97,150,100,170,158,204,209,167, 43, 67,121, 99, 88,130,
-159, 84,233,143,143, 2,128, 50, 37,106,156,204,222,247,126, 84,212,221,213, 61, 7, 77, 16,117,122,123,156,112,253,178,143,102,
- 0, 24,100,170,110, 70, 70,134,202,222,222,254,170,179,179,115,207,185,115,231,106, 0,136, 52, 26,141,108,196,136, 17,178,132,
-132,132, 79, 41,165, 38,165,177,205,136,205,182, 68, 66,187, 54,240, 11, 25,236, 46, 43,238,220,161,109, 56, 90, 6,185, 33,185,
-109, 56, 0, 76, 76, 80,153,249,182, 30,187,225,151,250,118, 86,199,190,223,114,116,233,168,129, 29, 62,117,238, 53,127,101,234,
-161,185,213, 70,196,158, 92,220,216,165, 50,247, 46, 40,235,248, 94,209, 96, 25,140,180, 54, 77,112, 84,111,100,161,210, 24,160,
-210, 24,160, 44,209,227,204,157, 76,100,228,107,145, 87,172, 67,137,198, 8, 10, 64,167,167,229,179,138, 84,111, 86,175,108,177,
- 44,255,223, 53,100, 80,193,154, 5, 19,204,247, 93, 78,134, 92, 92,218, 31,203, 66, 46,130,185, 76, 0,128,226,252,249,243, 40,
- 31, 30, 95,211, 83,252,190,227, 55,176,114,203, 89, 28,223, 56, 13, 18, 17, 15, 77,250, 46,192,176,190,205,193,178, 20,177, 79,
- 30,100,248, 4, 4, 59, 48,102, 50, 48, 12,202,251,164, 84,119, 60,109, 40,165,191, 17, 66,122, 18, 66,122,148, 90, 56,228, 29,
- 48,230, 20,159, 61,178, 83, 94,172,214, 24,242, 18, 30,125,131,226,236,118,165, 77,240, 96,203, 30,208,207, 19, 66,218,214,209,
- 92, 49, 82,123,223, 53, 31,142,155,244,142,151, 87, 3,236,222,177, 9,148,146,125,166,126,127,251,161,171, 88,181,250,229, 17,
-131, 99,198,141,243, 89,255,253,247, 47,173,123,127,196,104,159,234, 12,158,107, 80,135,105,126,254,129,184, 22,149,140,229, 95,
-140,191, 93,146, 25, 55, 88,107,102, 51, 70, 87,156, 54, 57, 48, 40, 24,142, 14, 54, 72, 79,203, 64,251, 62,157,208,173, 75, 23,
-220,191, 27,137, 69,115, 62,187, 10,149,182,115, 77, 81,219, 63,140,144, 96,108, 68,151,190, 2,149, 70,135,117,203,231, 96,204,
-212,197,104,209,190,151,224,193,157,235, 99, 1, 44, 48, 53,207, 90, 61,139,246,141,237,160,213, 27,161,211,179,248, 45,142,199,
-255,115,158, 0, 62,143, 97,130, 27,148, 54,239, 22,170,245,213,215,243,124,146,158, 87, 88,228,241,205,226, 79,120,197, 26, 35,
-178, 10, 52,200,204,215, 34,171, 80,131,236, 2, 77,169,185, 42,208, 34,187, 64, 3, 62,143, 32, 38, 46, 5, 60, 30,169,117,255,
-187,252, 98, 29,154,249, 90, 1, 32, 96,234,216, 28,146,109,176,235,118, 55, 58,249,173,229, 11,103, 11,239,196, 41,113,239,121,
- 97,153,177, 98, 32,170, 96,176, 88, 19,186, 96,217, 7,246,110,249,254,160, 62, 13,205,229, 18,164, 60, 41, 2,159, 33,224,243,
- 8,204,237,220, 96, 33, 41,193,132,241, 99, 96, 99,109,129,196,236, 18,172,217, 31,141,123, 15,159,130, 85,215, 46,219,223,253,
-124,188,223,251, 67, 6,138, 25,129, 4,219, 79,198, 65, 36,228,129, 15, 45, 30, 94,191,168,201, 72,126,174, 43, 42,204,151,243,
-249, 2,147, 68, 9, 64, 13, 70, 22,148, 82, 44,153, 63, 19,187,182,124,135,227,183, 50, 64, 81, 58, 85,195,239,191,126,141, 73,
- 51, 22, 33,171, 80, 11,128,188,206,168,197, 35, 0,122,188,106,132, 94, 53, 73, 21, 34, 80,149,113,179,162, 70,249,254, 85, 25,
-184,138,125,178, 0,152, 20,105,231,191,234, 20,203, 63,219, 53,238,215, 74, 34, 18,157,220,178,102,166,244, 76, 52, 94,152, 43,
-181, 50, 27,219, 54,174, 87, 82,176, 29, 51, 30, 28,188, 97,234,209,144,219,251, 6,137,229,242, 11,179, 23,173,209, 56,187,214,
- 55, 28,189, 83,152, 83, 84, 98,252, 83, 24, 68, 40,147, 27,229, 22,118, 37,150,238, 77, 87, 10,212,218, 57, 89, 89, 15,139,107,
- 58,165, 44,165, 56,116, 61, 29, 96, 75, 79,226,238,139, 41,165,243,248,240, 8,140,108,105, 59,247,169,219,153, 47,214,153, 86,
-177, 2,191,156,188,157, 93,149,185,178,180,180,132,165,165, 37,204,204,204,106, 91, 97, 87, 26,185,146,201,100,214, 39, 78,156,
-144,152,155,155,131,199,227, 65,163,209,160, 83,167, 78,117, 42,121,114, 7,191, 65, 45,222,234,191,180,117,251, 30, 56,119,226,
- 87,246,234,209,205,253, 85,153,181,152,191, 7, 64,183,182,141, 15, 45,255,122, 93,253,169, 51,102,139,229, 18, 62,242,148, 58,
-240, 24, 2,119,123, 41,108,204,120,184,122,246,112,201,224,174,193, 38,155, 63, 55, 87,143,109, 95,175,249,193,102,229,151,243,
- 59, 91, 89,213,119,200,203,139, 43, 4, 0, 85,102,244, 15,102,142,126, 79, 92,235,157,188,208,164,109, 63,216,187,120,119,175,
-109,126, 51, 51, 51, 51,131,130,130, 30, 5, 6, 6,134,246,239,223,159, 46, 89,178,196, 42, 57, 57,121,143,169,230, 10, 0, 58,
-116,105, 57, 73, 46,208,135,219, 72,153,192, 6,142, 50,180, 12, 42,109,253, 28,216,163, 53, 92,221,234,225, 89,186, 42, 56, 71,
-205, 10,139,245,130, 6,223,255,176,233,166,187, 53,127,148, 65,169,126, 8,224, 96,173,111,218, 40,171, 36,101,101,230, 74,194,
-135,153, 84, 0,150,150,110, 51, 61,130,197, 66,171, 99,161,210, 26,160,210, 24, 75,205,150,214, 8,150, 45,237,172, 76, 8,129,
- 78,111, 44, 15,200,214, 38,129, 48,183,178, 69,125,143,210, 52,190, 88,164, 2, 16, 2,216,217,217,193,198,166,230,121, 71, 89,
-150,133, 86,103, 40,187,233, 26, 95, 12,234,208,234, 12,160,148, 34, 58, 58,102, 90,124, 92,124, 31,111, 31,175,182,129,141,131,
-173,165, 34, 6, 0, 74,106, 8, 38, 13, 6,160,167,148,190, 24, 20,225,209,176,117,201,254, 95,247,201,123,246,234,149,167, 85,
-102,237,173,176, 51, 15, 64,215, 50, 51,166,174,229,117, 74,228,118,190,125,221,252, 91, 46, 30, 58,124,140,111,251,142, 93,112,
-254,204, 41,252,246,235,206,173,197,153, 79, 78,154,170,227,231,231,247,167, 81,132, 94,222,190,127, 26, 69,232, 81,223,167, 74,
-131,101, 97,209,216,188,113, 88,132, 91, 66,182, 14,199,142, 29, 69,113, 65,250, 23, 90,173, 82, 5, 1,221,112,250,215, 31, 71,
- 14, 30, 59,215,188, 69, 88, 40, 44, 21, 50,216, 90,153, 33,242,214, 85,124,185, 96,246, 85,168,180,157,107,174, 63,203,242, 27,
- 24, 40,244,174,231,241,137,123,131,134,136,188,126, 25,177,209, 15,162,238,220,188,218,208, 59,168, 57,236,156,221, 63, 33,129,
-129,203,232,195,135, 53,190,169,130, 26,105,242, 7,163, 39,151,221, 75, 74,215,181,104, 82, 95,244,231, 66, 72, 96,208,235,140,
-219,215,127,153, 89,113, 20, 97, 85,186, 37, 69,249,123, 47, 93,191,255, 89,239, 46,109, 72,121, 83, 96,185,169,122,245,179,183,
-139, 28,177,247, 31,179,250,226,130,125,181,187, 50,105,198,184,241, 19,165,165,105,103, 65, 75, 39, 86, 83,215,246,250, 46, 49,
- 10,223,251,126,254, 44,114, 55,190, 24,247,159, 23,150, 54, 11,150, 25, 44,177,144, 7, 81,217, 95,147,166, 38, 99,152,229,239,
- 15,232,130,236, 2, 45, 88, 74,203,230,210, 35,224,243, 5, 72, 40, 4,146, 10,149,200,202,207, 64,220,243,120, 20,164,199,129,
- 97,120,176,113,241,134, 42,209,180,180, 22, 25,205,124,245, 44,188, 6,244,108,195, 59,112, 37, 13, 82, 49, 31, 69,217, 73,184,
-124, 98,183,154, 26,141, 63,104,245,218, 93,246, 84,244,224,225,253, 61, 58, 19,171,142,172,194, 98,173,131, 88,200,195,238,205,
-223,224,221, 97,227, 94, 68,179, 1,224,179,217, 11, 65, 8, 65, 94,129, 18, 0,201,170, 41,114,245,202,231,172, 10,145,167, 63,
-125,174, 96,138, 42,251, 76,202, 62,107,171,208,208,190, 98,170,180,175,172,215,190,162,103,210,228,200, 85, 70,176, 4, 12,239,
-212,230,213,179, 36, 81,153, 98,220,120,156,142,119,218,184, 66, 85,152,141,245,223,174, 82,150,232,117,221,178,238,155,110,174,
-202, 10, 74,151,119, 71, 76,137,106,224, 29,160, 61,243,160, 40, 46,191, 88, 95,101, 63,134,230,239,204,138,186,125,228,155,238,
- 5,250,184,241,102,206, 13,141,172,193,176, 92,149,249,100,126,229,149, 56, 21,205, 93,179,187,212, 92,177, 44,166,127,185, 13,
-148, 53,150, 77,224,103, 4, 53,178,248,248,139,239, 96, 40,251,223,200, 26, 65,244, 70, 89,141,225,114,137,240,100, 35,229, 42,
-139, 87,205, 85,211,166, 77,243, 45, 45, 45, 97, 99, 99, 3, 43, 43, 43,148, 27,162,215,109, 22,244,241,241,129,153,153, 25,206,
-159, 63, 15, 51, 51, 51,200,229,117,155, 32,223,204,193,255,221,230, 29,250,253,220,190,215, 8,230,244,254,245,198,235,231, 15,
-191,163,206,124,108,178, 9, 48, 26,141, 68,175,215,163, 75, 68, 72,194,157, 39,137,199, 23,206,159,223, 53,172,195,219,226,150,
-126,246, 80,107, 13, 72, 78, 74,194,213,115,191,149,120,215,179, 61,222, 50,212, 55, 89,175,215,195,104, 52,214,120, 3,215,104,
-180, 57,140, 64, 98, 51,112,208,123,226,155, 55,110,252, 44,119,240,219,201,240,216,187,212,200,107, 12,208,119, 27, 55, 10,128,
-206,192, 66,173, 42,204,173, 75,190,163,162,162,110,126,253,245,215,126, 2,129,192,117,239,222,189,217,121,121,121,181,122, 93,
-208,169, 35, 55,214,240,205,244, 49, 66, 90, 50,216, 93, 86,220, 57,169, 77, 56, 6,245,108,141, 93, 71, 46,227,220,197,171, 72,
- 80,153,221, 41,214,242, 14, 36, 39,167,106, 2,173, 10,126,237,219,202,147,183,111, 91,225, 62,251,246,211, 7, 80, 42, 61,149,
-117,126,110,177,233, 55,111,160, 80,173,175, 16,193, 42,237,223,196, 48,196,228, 8, 22, 1,226, 46, 94,137, 12, 10,241, 13,192,
-157,103,133,200,202,211, 64,165, 45, 45,247, 20, 20, 54,230, 66,136,133, 60, 36, 60,143, 3, 75,117,207,107,119,159, 65, 86,183,
-119,198,240,203, 30, 95,248, 2, 1, 31,180,236, 6, 41,149,136,148,246,246,246, 38, 25, 44,189,209,136,254, 93,154,163, 69, 88,
- 99,244, 25,251, 53, 0,224,204,214,233,176, 50, 19, 98,239,222,189, 72,188,188,106,123,131,150,227, 78, 62,184,255,240,237,168,
-219, 87,222,235, 22, 34, 13,118,228,167, 9,171, 9,235, 31, 36,132,136, 0,180, 39,132,116, 2,112,158, 82,170, 55, 26,216,196,
-174, 93,187,176, 70, 35,155, 90,225, 90,179, 2, 16, 14, 32, 23, 64, 36,165, 84, 95,253, 3,160,127, 71, 48,216, 9, 66, 36,102,
- 82, 89, 66,120,199, 65,206, 97, 45,154, 91,244,237, 63, 0, 34,161, 8,167, 79,157,192,218, 85,203,118, 43,211, 30,141,168, 85,
-243,152,137, 29,218,171,107, 46, 42, 40,176, 40,142,126,120, 39, 47, 46, 67,107,197,183,244,129, 64,172, 24, 67, 44,156,215,240,
-196,102,115, 93, 90, 12, 51, 63,115,249, 6,162,238, 92,129,179,173, 20,113,177, 79, 85, 15,238,222,254, 78, 69, 4,243,105,214,
- 67,149,169,233,148,229, 24,223,110, 49,180,171, 85,137,206,136, 75,103,143,148,176, 6,182,235,181, 11, 71, 99,221,124,195, 36,
- 65, 97,111, 89,101, 31,220,208, 31,192,174,154,116,158, 95,223,254,167,174, 23, 13,154,191,155,122,244,212, 69, 51,231,122,222,
- 60, 16, 6, 26,117, 49,178, 18, 30, 24, 74, 10, 51, 84, 25,247, 15, 56,155,146,190, 4, 67,202, 23,115,150,253, 48, 62,164, 73,
- 67, 57,165,162,151, 34, 86,229,255,231, 20,105, 75,251,204, 22,231,227,217,253,203, 37, 89, 79, 11,102, 86, 95,215,233,101, 57,
- 57,185, 47,134,230, 75,149,150, 30, 5, 22, 5,226,242, 11, 12, 60,192,162,192,242, 69,164, 34, 39, 39, 87,100, 52,234,101,166,
- 92,158,150, 10, 9,238, 63, 79,125,209,161, 93, 44,100,202,250, 94,253, 17,201, 50,241, 58, 15,225,139,228, 72,201, 41, 1, 67,
- 41, 88,214, 0,131, 94, 11,101, 97, 33, 82, 83,210,145,145,145, 9,101, 81, 1,164,102,150, 8, 10, 14,133, 66,161,192,163, 91,
-231, 0,144, 67, 38,153, 65, 86,232, 19, 22, 26, 42,136,138, 47,130, 78,207, 66, 0, 29, 46, 29,255,165,196,160,215,246,202,184,
-127,224,108,109,235, 97, 3, 75, 79, 63,120,146,208,208,205,214,137,220,126,150,143,109, 63,174, 43, 29, 77,106, 40,141,102, 70,
- 37, 22, 35, 53,167, 24, 41, 73, 9, 20,172,241,116, 45,229,111,214,240,185, 46,188, 9,141,218, 27, 44,131,193, 32,169,231,238,
-129, 65, 99,134,226,187,239,190, 71,244,179, 4,252,248,237,234, 82,115,117,111,255,239, 38, 26,138, 23,111,219, 46, 78,127,188,
-124,196,119,207,147, 15,221,205, 99,212,218,234,223, 63, 37,179,243, 68,155, 17, 43, 79,168,139,114, 69, 70,141,138,127,104,251,
-136,157,149,105, 2, 0,143, 33,218,178,102, 65, 16, 66, 80,222, 44,248,221,130, 81,144,137,121, 32,132, 64,165, 49,224,253, 79,
- 87, 98,235,202,210, 39,171, 15,199, 79, 81, 85,149,206, 10, 70,136, 12,239, 90,191,247,162,141, 15, 15, 94,142,183,121,214,163,
- 71,187,130,224,224,224,124,169, 84, 10,185, 92, 14,115,115,115,152,155,155,195,210,210,178,198,188,151,125,118,168,169,207, 21,
-195, 48, 48, 55, 55,135, 84, 42,173,212,184,213,244,246,114, 51, 71,223, 1,205,218,247,219,217,161,247, 72,230,244,254, 31,217,
- 91,231, 15, 13, 80,103, 62, 57, 96,234, 57, 42,139, 58,220,237,223,191,127,163, 49, 99,198, 8,103,141,239,127,226,196,249,200,
-232, 95, 79,237,235,149,155, 95,228, 70, 41,133,165,133, 89,210, 59,157, 26, 29,106, 19,230,151,112,230,204,153,255, 99,239,188,
-195,163,168,218, 54,126,159,217,158,222,123, 35,141,144, 70,239,189, 74,175,130,160, 32, 96,161, 40,168, 96, 1, 84,164, 42, 40,
- 32, 96, 67,145, 46,189, 11,210, 91,232,189, 37,129, 64,122,239, 61,217, 62, 51,231,251,131,132, 47,242,166,108, 0, 95, 95,241,
-252,174,107,175,236,110,102,238, 61,231,204,153,153,123,158,211,196,173, 91,183,234, 8, 33,119,235, 74,103, 94, 94,206,250,147,
- 39, 79,125,221,185, 75, 87,172,222,176,181,127,116,244,189,254,113,177, 15,225,229,227, 15, 95,255,134, 80, 19, 91,156,140, 56,
-135,210,130,236,245,166,164,179, 42,141, 27, 55,246,104,218,180,169,103, 81, 81,145,118,246,236,217,141, 4, 65,248, 61, 60, 60,
-188,101, 88, 88, 88,102, 84, 84, 84,154, 41,121,191,184,105, 76, 46,128, 77, 13,186,142,223,153, 97, 40,122, 31,192, 98, 47,111,
-111,156, 62,123, 9,151, 47, 92, 89,149,103,238, 61,111,252,107, 99,223,110,224, 32,123,123,112,251, 6, 18,103, 59,115,108, 89,
-189, 76,178,255, 98,210,242,164,124,227,175, 0, 22,154,114,140, 42, 41, 40, 53,160, 67,168, 3,120,158, 66,160, 20, 28, 33,176,
- 50,147, 86,107,176,170,211,148,234,149,111, 76,158, 52, 49, 46,188, 73,179, 15, 94, 27, 55, 81,222, 44,192, 27, 87, 31, 22, 2,
- 32,112,176, 54, 71, 70, 70, 38,206,253,254, 43, 95,152,126,127,149, 68, 34,206,175, 79,121,166,221,216, 22, 88,249,222,205,205,
-109,194,173,200, 72,156, 57,115, 6, 14, 14, 14,168, 52, 87,213, 53, 17, 62,169, 89, 88, 88,122, 97,193,178, 95, 59,188, 61,122,
- 48, 6,116, 13, 67,196,181, 56,232,141, 34, 12,188,248,184,147,107,194,165,159, 21,239,143,244,215,191, 51, 44,168, 68,109, 84,
- 36,205, 73, 42,137,168, 58,137,236,147,154,148, 82, 61, 33,228, 40,128, 54, 0, 6, 19, 66,142, 81, 74, 91, 86,141, 60, 1,104,
- 12, 32, 12,192, 37, 74,105,130, 73,121,231,176,229,198,181,235, 14, 6, 94,196,185, 43,183, 67,186,119,104, 6, 42, 82, 92,187,
-118, 29,107,214,173,209,222,189,115,107,105,121,182,235,252,154, 38,183,173,169, 60, 77, 29, 69, 88,221,119,149,154,148,158,225,
- 45, 93,130, 87, 93, 60, 31,241,153,210,189, 37,130,251,125, 58, 40,253,246,239,131, 92, 67,123,195, 49,160, 3, 50,110,239,195,
-205, 11, 91, 14, 93,231,249,153, 42,145, 75, 46,207,189, 95,110,234,249, 94,137, 82,101, 62, 53,172,121, 23,164,166, 36, 33,241,
- 97,228, 70, 77,254,195, 12, 75,215,224,141,233,105,201,147,124, 67, 59,224,252,209,109,239,213,100,176,234,170,243,142,138,226,
- 85,103,206, 95, 28,149,190,243,119,151,210, 50,141,153, 84,202,169,149, 18,100,203,213,113,219, 77, 77, 39,141,142, 54, 56, 7,
-180, 31,246,218,196,207,255, 88,254,245,108,153,179,173, 18, 89,133, 90,148,168,141, 40,209, 24, 33, 33, 64,160,187, 37, 52,229,
- 37,184,124,104,147,145, 26, 10,134, 85,244, 71,173, 86,211, 41,108,240, 66, 66, 48,229,243,207,103, 65,162,176,118,247,235,241,
-169,129,243,115,133, 29,158,152,204,220, 30,240,235,241, 41,116,165,217, 3, 63,255,124, 86, 35, 74,105, 15,167,176,193,165,149,
-107, 17,214,148,247,252, 82, 3, 70,119,243,130,222,248,104,254, 48, 65,120,212,215, 78,172,152,213, 28,181,196,149,171,106, 82,
- 64,190,227,143, 75, 72,207, 46,132, 70,103,132,222,192, 67,207, 11,224, 56, 9,236,236,236, 16,232,215, 28,182, 54,214,200,201,
-203,199,181, 75,231,113,249,193,173, 4, 10, 44,204,179, 47,222,108,202, 49, 34, 82,139, 64, 23,103, 71,146, 93,170,135, 74, 41,
-193,229, 51, 17, 70, 0,235, 77, 49, 87,213,105, 22,171,139,190,157,185, 96,229,171, 63, 45,155,227,218,196,215, 26,169,121, 90,
-164,229,106, 80,170,229, 1, 80,240, 2,133, 94, 91,140,152,107, 71,178,120,168,191,197, 11, 78,205, 17, 44,153, 76,119,237,206,
- 3,229,204,185, 75,112, 47, 54, 1,107, 86,125, 95,174,171,135,185,170,142,117,239,248,110,171,223, 30, 21,243,150,206, 79,170,
-253,129,187,154,102, 65,145, 82, 28,184,156,245,120,217,143,202,166,194, 27,177, 69,117, 85, 26,217,146,169,205, 62,169, 52, 66,
-223,237, 77,191,172, 84,230,137, 41, 41, 41,133,155, 55,111,126,108,122, 36, 18, 9, 42, 71, 15,234,245,250, 58, 71, 21,217, 89,
- 43,194,198,244,109, 48,178, 38,115, 37,145, 72, 32,138,226,227,232, 85,125,155, 30, 45,156, 27,245,106,221,125,232,182,238,131,
-223,226, 78,238,251, 85,188,126,230,247,225,101, 57, 49,123,235,123,140, 10, 11, 11,163, 8, 33, 15,151, 46, 93,218,108,205,154,
- 53,126, 31,125,244, 81,252,175,139, 38,125,247,232, 9,238,209,178,136, 55,111,222,164,147, 39, 79,214,105,181,218,132,194,194,
-194, 27,166, 44,114,173,206,142, 89,186,254,167,111, 26,165,166,103,142, 11, 8,107, 3, 71,223,214,112, 13,104,131,130, 50, 3,
-174,196,166, 35, 62,250, 36,238, 93,220,181, 93,147,235,242, 85,125,210,219,172, 89, 51,111,153, 76, 54,144, 82, 26,100, 97, 97,
-225, 75, 41, 85, 72,165,210, 17,132,144,135, 60,207, 71,135,134,134,158,140,142,142, 54,121,205,176,164, 51,235,117, 13,186,142,
- 95,153,172,182,232, 26,159,165,110,158,172,182,184,169, 86,218, 76,207, 57,185, 66,231,242,210,210,229, 48,230, 71,237,218, 88,
-188,103,203,234,101,146,209, 19, 62, 20, 34, 11,172,223,151, 90,154, 29, 95, 60,222,228,145,251,224, 8,201,252,232,163,143,255,
-127,154, 6,242,168, 97,176, 98,202,134, 12, 83, 52, 42,214, 83,156, 97,230, 30,246, 67,228, 7,147, 22, 52,110,213, 97, 76,151,
- 62, 35, 57, 75,185, 5,142,239,253,153, 38,220, 57,189, 83, 74,133,207,212, 57,113, 9,207,122,145,208,235,245,127, 50, 86,166,
- 68,175, 0, 32,215,161,184,235, 31,199,206,140, 59,120, 36, 98, 81,223, 94, 29, 29,126,156,253, 10,190,249,101, 63, 44,205,149,
-160,162,128,145,221,189,135,223,219,218,123,160,151,139,202, 99,247,233,180,179, 83,150, 71,206, 80,171, 13, 15,234, 90,247,174,
- 98,126,161,203,132,144, 64, 0, 3, 9, 33, 34, 0, 11, 0,229, 0,202, 42, 26, 36,246, 81, 74,203,235,147, 79, 3, 47, 34, 49,
- 91,139,253,123,118,225,246,149,147,184,119, 47,166,244, 94,244,189,239,137,148, 46, 47,203,122,240, 84,145, 85,161,218, 17,131,
-168,126,100, 97, 45,148, 75,204,190,186,121,112, 73,215,134,221,223,107,231, 16,208, 1,118, 62,143, 60,101,113, 90, 36, 82,175,
-237,218, 95,154, 33, 31, 65,105,164,241,105,143,177,187,151, 95, 67, 81,162,192,197, 51,135, 64, 69,113, 21, 0, 80, 81, 92,117,
-235,252,161, 73,109,250,190, 9,123,103,159,166,149, 67,187,234,171,109, 38,229,139,255,216,240,213,206,196,196, 68,220,191,127,
- 31,177,177,177, 40, 40, 40,192,150, 45,231,138,235,213, 21, 32,238,226,113,151,160,206,189, 95, 29,255,193,129,161, 47, 15, 85,
-121,251, 6,112,141, 60,173,225, 96, 37, 69, 76, 92, 58,226, 34, 31,138,177,119,206,106,169, 38,103, 72, 78,236,133, 26,163, 35,
- 78,161, 35, 92, 56, 9,153,121,242,247, 71,107, 11,246, 28,252, 70,163, 79,166,124,212,214,222,193,174,218,235,120, 65,126,161,
- 98,238,220, 47, 26, 85,110, 95,215, 90,132,156, 68, 82, 58, 97,210, 84, 11,142,112,143,155, 1,105,101, 27, 25,125, 92,135, 1,
- 2,200,101,210, 58,235,232,184,161, 29,193,139, 34,202, 52, 6,148,169, 13, 40, 42,211, 34, 43,175, 8, 81,209,113,184,122,238,
- 48, 18,227, 98, 75,121,158, 63, 13,138, 61,185, 14,197,219,159,156, 88,183,214, 8, 43, 36,222,246,118, 86, 72, 44,212,194, 76,
- 46, 69, 70, 74, 44,111,224,181, 79, 61,201,122,222,173,223, 51, 93,194, 7,191, 52,254,157, 79,143,116,238,220,201,186, 73,243,
-150, 22,142,214, 86,144, 75, 9,226, 82,178,113,247,230,181,242,228, 7,183, 74, 4,163,166, 79, 94,228,239,207,188, 74,203, 63,
-214, 96, 25, 4,190,231,135,159, 46, 62, 38, 8,130,153, 84, 34,209, 24,169,216,231, 89,204,213, 95, 5,165, 98,218, 59,239,127,
-252,167, 7, 2,163, 32,154,189,245,206, 71,154,170, 15, 8,196, 40,152, 87, 70,174,234, 24,169, 39,201, 45,210,149,206,250,233,
-246,198,175, 55, 70,239, 2, 16,253,172, 35,251, 0,160,176, 68,127,219,161,215,142,193,165,106,158, 0,184, 87,141,102,121,247,
-238,221, 31,155,173,138,230, 58,147,111, 16, 10,149,249,164,110, 3,223,224, 78,238, 95, 35, 94, 59,189,127,196,211,152,171, 42,
- 55, 48, 3,128, 43,132,144,200,207, 62,251,172,149,139,139,139,203, 23, 95,124,161, 42, 41, 41,145,253,248,227,143,218,188,188,
-188,172,146,146,146, 75,148,154,222, 63,161,226,166, 57,222,204, 37,228,103,178,107,237, 75,118,206, 30,189,109, 29,189,130, 10,
-115,211,226, 74,242,211,142, 16, 17,199, 75,115, 98, 46,213, 55,173,183,110,221, 74,105,220,184,241, 62,137, 68,226, 41, 8,130,
- 35, 33,196,146, 82, 90,200,243,124,161, 40,138,153,245, 49, 87, 85, 77, 86,231,119,215,109,205,215,136, 10, 3, 81,109, 77, 58,
-179, 94, 7, 0,217,199, 62, 82, 3,248,221,165,219,140,161,251, 47, 38,126, 31, 85,104, 61, 53,231,204,215, 7,234,171,159,126,
-115,123,224,243,170,255,154,140,168, 52, 0,227, 44, 92, 26, 45,139,188,121,105, 14,161,144, 9,224, 23,170,179, 31, 94,127, 30,
-250, 50,153, 76,219,178,101,203,106, 71, 11, 42,149,202, 90,231,215,170,184,208,175, 33, 93,187,110, 56,114,242,220,184,195,199,
-207, 47,106,219,174,163,131, 74,233, 14, 31, 59, 3, 54,124,220,226,189,147, 55,115,175, 14,250,248,236, 79,241, 25,218, 59,148,
- 82,109, 61,235,105, 44, 33,164, 24,192, 96, 74,233,106, 66,200, 4, 0,247, 0, 68,214,219, 8,136,120,173, 93,187,214, 91, 8,
- 33, 82,202,139,223, 92,146, 73,182,106, 51,239,165, 61,141,161,168, 74, 19, 95,107, 76,152, 52,169,161,127,192,255,143, 34, 12,
-107, 96,133,209,227,222,110,232,227,215,240,241,119,141,188,106,127,160,162, 25, 55, 52,196,165,113,175,152, 99, 75,103, 59,196,
- 93,120,199,204,222,211,178, 60, 47,169,160, 48,233,250, 82,117,142,203,210, 39, 87,104,168, 47,137,177, 81,203,215, 46,155,241,
- 81,102,122,220,154,242,156, 7,143, 90, 29,114, 30, 68,154,187, 4,205,206,203, 74,251, 40, 63, 39,126,233,211,150, 69,121,121,
-121,198,230,205,155,109, 59,116,232,192,185,184,184, 32, 55, 55, 23,167, 79,159, 22, 69, 81, 76,175,175, 86,246,131,179,167, 73,
- 64,128,253,214, 13,197,223, 72,205,172,250,241, 2,220, 41,165,144,114, 36,211,160, 43, 62,146,107,171,249,152,222,185, 84,123,
-189, 20, 5, 66, 57,202, 85,174, 45, 40,138, 34, 89,242,195,166, 36,137, 76, 81,109,147,170, 96,212,155,139,162,104,242, 90,132,
-217,146,100,135,112, 99,112,221,163,248, 40, 16, 73,238,215,241,112, 74,143,182,239,251,122,111,158, 23,140,120,212, 63,177,242,
-149, 67, 41, 57, 5, 34, 28,203,179, 47,189, 84, 31, 83,245,167,251,188,193, 96, 11, 78, 14, 43,115, 35, 56, 16,148, 20, 23, 43,
-157, 4,197,189,103,169, 75,217,145,251,163, 72,215,174, 62,250, 19,167,198, 70,156,187, 48,130,138,162,175, 64, 1, 80,146,168,
- 55,104,119,230, 88,231,109,124,218,244,254,211, 32,207,120,253,168,119, 8,241,159,160, 73, 8,145, 3,112, 4, 32, 84, 93,254,
-230,121,164,179,182,181, 5,159, 37,239, 86,110, 33, 29,149, 42,243,143,213,234,210, 53,234,236, 7, 7,158,103,121, 18, 66,108,
-148, 74,101,115, 75, 75, 75, 89, 94, 94,222, 21, 74,105,241,139,120,220,171,210,233,141,245,142,221,123,183,255,224,248, 31, 87,
- 87, 86, 52, 31, 62,198,115,196,114,213,232,126,157,167,111,218,115,112,249,147,163, 8, 95,132,188,255, 85,154,164,107, 87,169,
-115,161,245, 56, 65, 16, 23,118,111, 88,170,206, 74,136,153,124,238,110,238, 21, 74,105,233, 51,214,207, 87, 43, 35, 88,148,210,
-173,255, 43,121,119, 14, 31, 50, 31, 4, 33, 38,139, 80,220,203,137,220,247, 69,157,215,144,208, 80,185,121, 46,236,212,121,142,
-249,245, 53, 86,127,203,113, 39, 68,210,184,113,227, 78,114,185,220, 91, 16, 4,115,189, 94,175,214,104, 52,137, 73, 73, 73, 23,
-107, 90,144,252,175, 78,167, 75,227, 33,203,101, 50,217,251, 0, 96, 52, 26, 87,102,223,221, 55,173,182,125,107,218,254,191,114,
- 63, 26, 49, 66, 66,119,238, 20,254,138, 99,228,209,124,120,145,209,200,219, 84,126,150,203,164,197,105, 55,119,217,254, 93,117,
-137, 25,172,127,225,141,129,105, 50, 77,166,249,124, 53,107, 95,172,155,149, 39,211,252,235, 53,221, 67, 7,122, 1, 64, 70,244,
- 1,147, 70, 27, 87,183, 61, 43, 79,102,176,106, 67,202,138,128,193, 96,252,183, 49,197, 92, 49, 24,127, 37,166, 26,171,167,221,
-158,193, 32,120, 98,169,149, 42, 23, 64,147,157, 41, 33, 36,252, 41, 46,176,145, 76,147,105, 50, 77,166,201, 52,153, 38,211,252,
-119,105,214,165,253,162, 68,198, 88, 19, 33,211,100,154, 76,147,105, 50, 77,166,201, 52,255,118,205, 23, 13,142, 21, 1,131,193,
- 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,
-193, 96, 6,139,193, 96, 48, 24, 12, 6,227,127,133,191,116, 20, 33,131,193, 96, 48, 24, 12,198,191, 17, 22,193, 98, 48, 24, 12,
- 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,
-204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,227,239, 55, 88,
-132,144,112,166,201, 52,153, 38,211,100,154, 76,147,105, 50, 77,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,
-131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24,140,
-191, 9, 2,160,218,145, 0,148,210, 72,147, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,
-235,210,174,143,255,248,159, 54, 88,148,210,191, 78,156,144,240,231, 93, 80, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241,
- 52, 95, 52, 88, 19, 33,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,
-131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,227,127,134,191,116, 20, 33,131,193, 96, 48, 24, 12,198,
-191, 17, 22,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176,
- 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96,
- 48, 24, 12, 6,227,239, 55, 88,132,144,112,166,201, 52,153, 38,211,100,154, 76,147,105, 50, 77,102,176, 24, 12, 6,131,193, 96,
- 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25,
- 44, 6,131,193, 96, 48, 24,140,191, 9, 2,160,218,145, 0,148,210, 72,147, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,
-201, 52,153, 38,211,124,241, 52,235,210,174,143,255,248,159, 54, 88,148,210,191, 78,156,144,240,231, 93, 80, 76,147,105, 50, 77,
-166,201, 52,153, 38,211,124,241, 52, 95, 52, 88, 19, 33,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96,
- 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,227,127,134,191,116, 20,
- 33,131,193, 96, 48, 24, 12,198,191, 17, 22,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,
-131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12,
- 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,227,239, 55, 88,132,144,112,166,201, 52,153, 38,211,100,154, 76,147,105, 50, 77,
-102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,
-193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24,140,191, 9, 2,160,218,145, 0,148,210, 72,147, 69,158, 98, 52, 65,
- 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,235,210,174,143,255,248,159, 54, 88,148,210,191, 78,156,144,240,
-231, 93, 80, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52, 95, 52, 88, 19, 33,131,193, 96, 48, 24, 12, 6, 51, 88, 12,
- 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24,
- 12, 6,227,127,134,191,116, 20, 33,131,193, 96, 48, 24, 12,198,191, 17, 22,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96,
- 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193,
- 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,227,239, 55, 88,132,144,112,166,201, 52,153, 38,
-211,100,154, 76,147,105, 50, 77,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48,
- 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24,140,191, 9, 2,160,218,145, 0,148,
-210, 72,147, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,235,210,174,143,255,248,159, 54,
- 88,148,210,191, 78,156,144,240,231, 93, 80, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52, 95, 52, 88, 19, 33,131,193,
- 96, 48, 24, 12,198,115, 70, 90,221,151,178, 54, 95,102,243, 60,239, 12, 0, 82,169, 52,199,120,245,115,215,218, 68,188,220,220,
-122, 10,192,175, 0, 32, 1,222, 78,205,200, 56, 94,141,230,113,158,231,237, 42, 52, 11,141, 87, 63,127,169, 54, 77, 89,235,133,
-199,254,180,253,149,207,122, 85, 99,161, 57, 89,235,133,153, 79,164,213,205,228,220, 83, 42,254, 55,210,249, 79,209,252, 55, 35,
-111,251,101,182,209,248,168, 30,201,100,210, 28,195,149,218,235,145,188,205,194,204, 63,109,127,249, 51,151, 39,183, 81,182, 95,
-148, 98, 52,242,110, 0,160, 84, 40,114, 3,125, 92, 86,212,166, 25,159,154,243,129, 70,171,115,170,208,204,212, 93,156,229,253,
-143, 61, 55, 77,196,213,213,181, 37,199,113,159, 19, 66,172,171,124,125, 39, 61, 61,253, 3, 86, 43, 25, 12,198, 11,103,176,120,
-158,119,190,177,119, 14,202,117, 64,143,215, 23, 58,251, 13, 89,189,229,201,109,140,218, 66,133,250,225,254, 80,137,177,200,206,
-214,140,218, 61,124,248,144, 3, 0,119,119,247, 95, 1,120, 87,163,105,119, 99,239, 28,168,245, 64,231, 81,243,236,154,250,248,
- 88,151, 16,242,161,153,153, 89,119,173, 86, 27, 6, 0, 42,149, 42, 74,163,209,156,178,166,116,217,147,219,215,148,129,170,105,
-237, 62,102,161,115,208,208, 95,223, 19, 4, 65,161,139,223,209, 69, 44, 77,150, 74, 4,253, 15,125, 50, 51, 15,255, 2, 8,166,
- 20, 72,213,223,237, 50,242, 83, 7, 47, 55,183,158,102,230,230, 45,205, 45, 45, 59, 9,130, 16, 34,138, 34, 68, 81,188,167, 41,
- 47, 63,199, 27,141,215, 5,163,218,225,198,190,175,196,218,210,249,100, 94, 90, 0,210, 28, 87,215, 17,102,150,150, 93, 37, 18,
- 73, 7, 0, 16, 4,225,130,166,172,236,140,115, 86,214, 78, 83,242,110,106,249, 60,237,246,255, 54,140, 70,222, 57,225,232, 28,
-232,140, 64,243,151, 23, 57, 55,121,109,227, 86, 0,208,231,220,118, 41,123,248,123, 27, 0,176, 8, 24,112, 69,233,218, 60, 27,
- 0,164,201,153,206, 15, 14,126, 6,157, 17, 8, 25, 48,207,185, 58, 77,189,222,224, 21,123,104, 54,116, 70,224,173,185,187,220,
- 62,158, 52,220, 28, 0, 78,239,251, 37,224,216,174,149,253, 1,224,165,225,239,255,209,109,200,196, 56, 0, 88,242,243, 46,183,
-205, 95, 14,135,206, 8,132, 15, 94,224,245,180,231, 38,175, 43,150, 23, 61, 56, 24,104, 44,201,176,243,178,144,186,214,247,220,
-180, 1,108,202,128, 41, 68, 34,233, 24, 24, 24,216, 2, 0,226,226,226,110,136, 60,127,222, 18,248,225,121,214, 37,137, 68,242,
- 94,122,122,250,192,170,223,121,120,120,176, 10,201, 96, 48, 94, 76,131, 5, 0,229, 58, 32, 34, 22,232,210,182, 9, 38,140,238,
-111, 89,245,127,251,214, 47,246, 74,143, 58, 22,178,100,219, 10, 73, 80, 80, 16, 30, 62,124,104,210,143,169,245,192,153,135,128,
- 82,155,104,165,150,201,226,231,126,254,185,117,199,142, 29,165,238,238,238, 0,128,156,156,156,182,231,206,157,107, 57,111,222,
-188,201, 74,109, 98,161, 90,143,210, 51, 38, 72, 87,166, 53, 44,168, 1, 62,155, 58,202, 6, 0, 86,124,184,179,229,161,139,183,
-237, 19, 19, 19,123,124,245,213, 87,249, 30,151, 46,173,178, 20,197,117, 49,217,217,169,166,164,115,251,225,155,102,129,134,227,
-126,195,223,120, 99,143,183,183,183,185,167,167, 39, 81,169, 84,144, 72, 36, 40, 43, 43,115,143,137,137,233,121,235,214, 45,205,
-217, 75,251,101,183,111, 14, 75,200,144, 53,215,152,146,119, 57,159,167, 42,111,216, 48,122,120,223,190,158, 3, 6, 12, 80,249,
-250,250, 2, 0, 18, 19, 19, 27,254,241,199, 31,175, 30, 58,116,232, 11, 57,159,199,171,245,208,214,149,247, 74, 77, 0,144, 1,
-237,237,157,157, 71,203,100,178,112,158,231, 61, 42,162, 11,233, 70,163, 49,178, 32, 39,103,243,147,219, 51,254, 19,157, 17,184,
-151, 9,244,236,212, 28, 99,134,245,180, 0,128, 25, 35,191,108,155,156, 24, 43,215,235,245, 8,106, 20,210, 97,193,162,111,143,
-130,227,240,219,158, 19,143,183,175,213,216, 82, 14, 15,115,128, 59,247, 19, 48,231,203,239,104,214,157, 93,173,248,194,232, 94,
-249,121,121, 82, 0,112,112,116, 28,177,125,235,230,227,174, 77,134, 95,139,203, 46,127,188,189, 41,245,189,186,115,243,208,182,
-239,220,211, 35, 79,133,254,116,116,141,204,219,219, 27,145,145,145,245, 58, 55, 81, 28, 99,101,238,230,118,111,238,199, 31,187,
-118,238,220, 25, 22, 22, 22,144,201,100, 48, 26,141, 61, 47, 92,184,208,115,206,156, 57,147, 75,138, 99,202, 77, 61, 55,235, 70,
-182,204, 37,168, 75,183,161,131,250,185,117,239,210, 22,195,250,116, 96, 21,145,193, 96,188,184, 6, 75, 42,149,230,244, 26,251,
-149,115,167, 54,225,184,118,251, 65,113, 98, 74, 86, 89,229,255,138,238,239,109, 56,105,104,211,240,213,135, 14,194, 96, 48,224,
-226,197,139,184,126,253, 58, 46, 94,188, 72,151, 45, 91,166,145, 0,111,215,160, 89,216,121,212, 60, 59,165, 46,213,178,133, 67,
-170,239,246,173,103, 36, 26,141, 6, 17, 17, 17, 40, 44, 44,132, 82,169,132,135,135, 7, 58,117,234, 36, 61,125,250,180,253,200,
- 87, 71,219,188, 52,228,205, 4,157,210,171, 76, 42,149, 22,214,152, 1,169, 52,167,199,235, 11,157, 67, 27, 54, 64, 92, 82, 70,
-241,103,139,214,148,137, 2,149,106,147,211, 12,103,207,158, 69,179,102,205,176,125,251,118,135,194,194,194,217, 27, 54,108,248,
-220,229,251,245, 43,179,211, 98, 62,172, 69,175,176,243,168,121,118, 65,194, 73,239,157, 91,214,201,111,223,190, 45, 95,181,106,
- 21, 10, 10, 10,160, 80, 40, 96, 99, 99, 3, 87, 87, 87, 4, 5, 5,145,201,147, 39,155,119,235,246, 16,159,125,248,134,119,150,
-221,208,152,154,210, 89,169, 41,215,103,154, 55,148, 92, 15,248,117,227, 70,174,117,235,214,164,234, 54,222,222,222,232,218,181,
-171,106,232,208,161, 1,147,223,157, 42,246, 28, 58, 49,206,160,112, 83,215,165,137,242, 84, 51, 7,245, 37,247,158,163, 70, 29,
-152, 59,119,174,173,155,155, 27,204,205,205, 1, 0,197,197,197,158, 73, 73, 73,109,231,204,153, 51,252,202,157,237,210,206, 3,
- 82, 51, 96,225,165,169,173, 60,255,173,200,100,210,156,202, 72,148,149,133, 89, 97,106, 90,118,249,163, 40,148, 30,122,189, 30,
- 58,157, 14,239, 76,158, 40,121,251,229,214,129, 62,157,222,187,149,152,158, 93, 16,114,226,178,125,229,190, 53,104,230,133, 14,
- 90, 96, 7, 0, 92, 73, 66,121, 97,210,177,183,102, 78,155,230,225,234, 58, 9,114,185, 28, 0,176,126,221, 58,105,126,126,126,
-223, 5, 11, 22,132, 83,139, 30, 37,161,131, 22, 88, 84,236, 91, 88,223,115,179,240,193, 65,191, 47,167,244,110,250,235,162,131,
- 16, 4, 1,151, 47, 95,198,217,179,103,241,237,183,223,210,195,135, 15, 23, 91, 91, 88,212,122,110,162, 56,198,170,163, 91,150,
-255,215, 95,239, 38, 10,133, 2,251,247,239,199,253,251,247,193,113, 28,154, 52,105,130, 49, 99,198,160,103,207,158,174, 19, 38,
- 76,164,157,251,140,140,135, 77,163,210,103,169, 75,132,204,227,156,195,154,190, 55,101,194,107,110, 47, 15,238,141,239,190,255,
-137, 25, 44, 6,131,241,226, 64, 41,253,207, 23, 64,124,135,172,222,186,243, 6, 61,232, 59,100,245, 86, 10, 16, 10, 16, 37,224,
-221,189,123,119,125, 89, 89, 25,189,125,251, 54, 29, 49, 98, 68,225,140,143, 63, 94,187,113,253,250,185, 58,181,250,157, 22, 77,
-155,142,161, 21, 35, 19,171,213,180,181,181,246,247,247,207, 77, 77, 77,165,135, 15, 31,166,243,230,205,163, 91,182,108,161, 71,
-142, 28,161, 39, 79,158,164, 71,142, 28,161, 59,118,236,160,183,111,223,166,177,177,177, 52, 32, 32, 32,215,215,214,214,186, 22,
- 77,142, 2, 92,224,208, 95, 62,220,117, 93,152,219,112,232,175, 31, 80,128, 11,112,117,109,212,171, 87, 47, 97,247,238,221,116,
-243,230,205,116,227,198,141,244,206,157, 59, 52, 47, 47,143,122,248,248,231, 86,238, 87, 83, 58, 41, 64,154, 55,111,158, 91, 84,
- 84, 68,189,189,189,169, 92, 46,167,206,206,206, 52, 40, 40,136,182,109,219,150,246,233,211,135,190,250,234,171,116,246,236,217,
-180,168,168,136,250,248,248,100, 87,238, 87,147,102, 91, 15, 15, 85, 64, 64, 64,202,221,187,119,105, 77,104,181, 90,154,151,151,
- 71, 79,157, 58, 69, 3, 2, 2, 82,218,122,120,168,106,211,148, 1,205,195,195,195,115,243,242,242,168, 40,138, 84,173, 86,211,
-252,252,124,154,159,159, 79, 11, 11, 11,169, 94,175,167,162, 40, 82, 81, 20,105, 76, 76, 12,245,247,247,207,145, 1,205,107,212,
-252, 55,191, 42,235,196, 19, 47, 15, 23,151, 62,174,174,174,154,221,187,119,211,244,244,116,186, 97,195, 6,202, 1, 95,254,199,
-182,213,104, 14, 15, 25, 46,111,222,124,130,153, 68, 98,214,191,125,251,246,194,197,139, 23,233,141, 27, 55,232,204,153, 51,233,
-192,129, 3,233,160, 65,131,232,220,185,115,105, 74, 74, 10, 77, 77, 77,165, 47,189,244,146, 32,145,152,245,111,222,124,130,217,
-240,144,225,242,250,156,155, 42,192,107,192,128, 1, 26,131,193, 64,227,227,227,105, 88, 88, 88,154, 4, 24, 45, 7, 66,252, 1,
- 69, 93,245,211, 26,176,117,115,115,203,188,116,233, 18,221,189,123, 55,245,241,241,201,149, 0,227,149,128,175, 18,240,149, 0,
-227,253,252,252,114, 47, 93,186, 68,243,242,242,168,183,183,119,166, 53, 96,251,180,117, 9,152,203, 57,135, 13, 89,183,224,251,
-221, 52, 38,173,156, 46,248,126, 55,117, 9,234,154, 66, 41,165,110,110,110,199, 89,157,100, 47,246, 98,175,127,250, 75, 90, 31,
- 51,198,153,153,205, 89,180,104,145, 92,163,209, 96,254,252,249,185,239, 76,154,180,208,209,217,217, 32,147,201, 32, 83, 42,235,
- 22,176,182,254, 96,214,172, 89,182,122,189, 30, 55,111,222, 68,139, 22, 45,160, 82,169, 32,147,201, 32,151,203, 33,149, 74,225,
-234,234,138,188,188, 60,184,184,184, 96,242,228,201, 54, 63,124,247,221, 7, 40, 42,154, 95,155,172, 40, 80, 41, 0, 8,130,160,
-240,114,119,159, 16,214,184,241,178,201,147, 39,115, 22, 22, 22,208,233,116,208,233,116,136,137,137,129,131,131, 3,204,205,204,
- 76,202, 51,199,113,156,165,165, 37, 34, 34, 34,176,110,221, 58, 36, 36, 36, 32, 35, 35, 3,214,214,214,104,214,172, 25, 66, 66,
- 66,208,161, 67, 7,196,198,198,130, 16, 66,234,210,203,150, 72,166,140, 25, 53,202, 57, 60,188,250, 41, 69,116, 58, 29,138,138,
-138, 80, 84, 84, 4, 23, 23, 23,244,237,219,215,249,192,254,253, 83, 0, 44,173,110,123,115,192,213,183, 97,195, 3, 87,175, 94,
-117,228, 56, 14, 17, 17, 17, 80,171,213,208,106,181,224,121, 30,132, 16,168, 84, 42,180,107,215, 14, 14, 14, 14,104,216,176, 33,
-246,238,221,235,212,171, 87,175, 63,204,179,179,155,171,129, 76,246,120, 81, 55,105,217,217,199, 90, 0, 14,175,189,246,218,225,
- 59,119,238,116, 30, 61,122, 52,178,179,179, 63,149,204,156, 89, 40, 0,203,107,219,119,231,189, 93,188, 39, 96, 97,239,228,244,
-203,226,197,139,185,172,172, 44, 76,159, 62, 61, 63, 35, 53,117,150, 10,184, 4, 0,127,252,254,123,187, 77,155, 54, 45,218,188,
-121,179,195,198,141, 27,185, 22, 45, 90,172,206,185,185, 58,244, 6, 80, 92,159,116,106,129,247, 86,172, 88,161,210,106,181,232,
-213,171, 87,188, 58, 49,177, 9, 15,104, 76,221,191, 12,152, 50,247,227,143, 93,149, 74, 37, 62,250,232,163,188,188,228,228, 48,
- 30,200,173,178, 73,146, 69, 66,194,225,215, 95,127, 61,234,206,157, 59,142,203,151, 47,119,125,121,232,208, 41, 0, 22,154,250,
- 27,255,223,161,157,179,118, 9,242,111, 56,164, 79, 95,151, 70,126,206,216,189,255, 40,126, 88,189,101, 61,138,226,126,241,240,
-240,152,194,113,220, 18, 86,243, 24, 12,198, 11,217, 68, 88, 19,118,118,118, 45, 3, 2, 2,112,242,228, 73, 4, 7, 7,239,117,
-174, 52, 87, 50, 25, 4,161,238, 62,228,102, 22, 22, 61, 58,119,238, 44,189,120,241, 34,124,125,125, 97,102,102,246,216, 88, 85,
-154, 44,153, 76, 6, 87, 87, 87, 20, 23, 23,163, 99,199,142,178,117,235,214,245, 0, 48,191, 46,237,204,164, 24, 75,196,175,123,
-109,222,130, 5,254, 45, 91,182,132,193, 96,120,100, 68,204,205,161,211,233, 32,147,201, 96, 48, 24,160,213,211, 18, 83,242, 42,
- 8,130, 32,145, 72,224,237,237,141, 47,190,248, 2, 90,173,246,113,179, 78, 73, 73, 9,138,138,138,112,243,230, 77, 36, 38, 38,
- 66, 20,197, 58, 39, 19, 51,183,180,236, 59,104,208, 32, 69,117,255,211,235,245,143,205, 85,113,113, 49,180, 90, 45,154, 54,109,
-170, 56,117,234, 84,223,154, 12, 22, 81,169,134,111,220,184,209, 89,161, 80, 64,171,213,226,225,195,135,136,139,139, 67, 76, 76,
-140,174,160,160,128,183,180,180, 36,110,110,110,146,226,226, 98,197,235,175,191, 78, 74, 75, 75, 1, 0, 67,135, 14,117, 88,191,
-118,237, 43,168,195, 28, 48,254,159, 27,128, 46, 64,175, 31,216,186,117,235, 83,215,174, 93,107,241,254,251,239,227,206,157, 59,
-223,152,111,223,126, 86, 13,220,170,181, 94, 2,147,151,204,152,225,102, 97, 97,129, 49, 99,198, 20,168, 83, 83,155,240, 64, 86,
-149, 77, 30, 56, 36, 38, 30, 25, 59,118,108,228,157, 59,119,236,150, 47, 95,238,250,202,240,225,147, 1, 44,170, 79, 26,109,108,
-108, 90,187,186,186,226,200,145, 35, 72, 73, 76,156, 81, 31,115, 5, 0, 68, 34,233,216,165, 75, 23,236,219,183, 15,105,201,201,
- 51,158, 48, 87, 0,128,114, 32, 87, 26, 31, 63, 99,253,250,245,235,222,120,227, 13,112, 82,105, 71,240,188,201,191, 81, 93,135,
-246,119,102, 44,193,222, 35,151,215,231, 68, 53,126,139,210,189, 34,128,171,172,198, 49, 24,140, 23,129,122,205,131,229,231,231,
-231,167, 84, 42,145,148,148,132, 54,109,218, 36,202, 20, 10, 40, 21, 10, 40,205,204, 76,123,202,214,106, 27,187,186,186,162,164,
-164, 4,142,142,142,144,203,229,144,203,229, 80, 40, 20, 80, 40, 20,143, 63, 91, 89, 89,129,227, 56,120,120,120, 64,171,213, 54,
-174, 75,151, 47,126,232,124,116,195,140,119, 15,237,221,228, 63,116,232, 80,184,187,187,193,195,195, 29, 22, 22, 22,144, 74,165,
-240,246,246, 70, 64, 64, 0,214,174, 93, 11, 98,221,240,138, 41,105,173,106,154, 36, 18, 9, 4, 65, 64,118,118, 54, 98, 98, 98,
-112,231,206, 29, 92,186,116, 9, 55,111,222, 68, 89, 89,153, 73,121, 87,171,213,205,170, 11,116, 61,105,174,138,138,138,144,155,
-155,139,184,184, 56,148,150,150, 54,175,209,236, 58, 56, 12, 11, 15, 15,151, 0,128, 74,165,130,159,159, 31,126,254,249,103,254,
-248,145, 35,175,152, 93,187,102, 43,156, 58,101,179,245,183,223, 94,121,243,205, 55,133, 43, 87,174,160,164,164, 4, 15, 30, 60,
-128,147,147,147, 84,105,102,246, 10,171,250,245, 35, 14, 40,183, 40, 45,237,211,190,125,251,132,226,226, 98, 44, 89,178,132,147,
- 90, 89,253, 50, 17,144,212,122,130, 73, 36,157,186,117,235,134,253,251,247, 35, 45, 57,121,102,254,159,205, 21, 0, 32, 31,200,
- 74,140,139,155,177,126,253,122,244,237,219, 23, 82,169,180, 83,125,211,215,182,109,219,112, 74, 41,238,222,189, 11, 5,112,185,
-190,251, 7, 6, 6,182,176,180,180,196,253,251,247, 33, 3,206,214,180,157, 12, 56,123,243,230, 77,152,153,153, 33, 52, 52,180,
-101,253,126, 69,182,204, 37,168, 75,230, 59, 51,150, 96,207,145, 11, 0,128,125, 7, 14,103, 63, 50, 87,115, 68, 86,203, 24, 12,
-198,191,214, 96, 1,143,250,108, 73, 36, 18,200,165, 82,152, 41,149, 80, 40,149, 80,200,100,166, 63, 41, 19, 2,165, 82,249, 31,
-166,170,210,104, 85,254,181,176,176, 48, 89,211,152,121,190,243,184,177,175, 43, 44, 45, 45, 33, 8, 60,164, 82, 41,204,205,205,
-225,234,234,130, 70,141, 26,161,160,160, 0, 3, 7, 13,209, 38, 23, 72, 15,200, 60,123,220,121,154,130,226,121, 30,229,229,229,
- 40, 44, 44, 68, 65, 65, 1, 74, 74, 74,160,213,106, 97, 66,235,224, 99,159,150,146,146,130,109,219,182, 33, 63, 63,191, 70,115,
- 21, 31, 31,143, 77,155, 54, 33, 49, 49, 17, 18,137,196,228,227,211,163, 71, 15, 28, 60,120, 80,210,181, 71,143, 53,201, 62, 62,
-153,201, 62, 62,153, 93,123,244, 88,243,251,239,191, 75, 60, 60, 60,144,146,146,130,155, 55,111,162,160,160, 0,162, 40, 18, 86,
-245,235, 79, 6, 80,168, 46, 40,120,227,211, 79, 63,165,150,150,150, 88,186,116,105,179,181,192,171,181,237,227, 31, 16,208,194,
-210,210, 18,247,238,221,131,121, 45,198,197, 28, 56,123,227,198, 13,152,153,153,161, 81, 72, 72,203,167, 57, 47, 69, 81,132, 32,
- 8, 32, 64,189,205, 10, 33, 4, 50,153, 12, 28,247,215,204, 61, 76,200, 60,142,183,107,250,222,148, 41, 83,221,222,155,250, 14,
- 78, 69, 60,242,128,146,178,248,135,204, 92, 49, 24,140, 23,145,122, 53, 17,198,197,197, 37,106,181,218, 16, 95, 95, 95, 68, 69,
- 69,249,134, 53,110,124, 71, 38,147, 65, 41,147,213,254, 24, 95,129, 74,165,186,155,157,157,221,193,211,211, 19, 70,163,241,113,
-147, 96,101, 51, 97,229,103, 0, 80, 42,149,184,119,239, 30, 84, 42,213,221, 58, 51, 33,148,249,248,249,249, 33, 43, 43, 27, 74,
-165, 18,118,118,182, 48, 51, 51,131, 82,169,194,162, 69,139,196, 53,171, 87,255,168, 12,155, 82, 52,237,205, 25,244,234,194, 95,
-255,150,130, 54, 55, 55,191,235,235,235,219,206,194,194, 2,123,247,238, 69, 98, 98, 34,138,138,138, 30,247,155,210,104, 52,208,
-233,116, 80,169, 84, 8, 13, 13,133,189,189, 61,162,162,162,106,204,123, 97,126,254,158,200,200,200,118,173, 90,181,122, 92,244,
- 93,187,118, 37, 93,187,118,117,172, 18, 53, 67,126,126, 62,110,223,190,141,136,136, 8,240, 60,143,232,232,104, 65,167,209,108,
-103, 85,255,233,208, 2, 23, 36,235,215,175,155, 52,105,210,155, 29, 58,116, 0, 5,250, 1,248,173,198, 39, 24,142, 35, 82,169,
- 20,132,144, 90,141, 15, 1,196,202,101,171, 72, 61, 92,123, 37,151, 46, 93,138, 20, 4,161, 67, 80, 80, 16,116, 64,107, 0, 7,
-235,179,127,108,108,236, 13,163,209,216,179,105,211,166,216,179,115,103,103, 0, 73,213, 62,204, 0,157,155, 55,111, 14,141, 70,
-131,232,232,232,235,166,154, 43,231,176,187,107,166, 76,120,109,252,203,131,123, 99,247,254,163,216,119,224, 72,234, 79, 95,127,
-236, 69,169,104, 96,181,138,193, 96,252,235, 35, 88,197,197,197,215,238,223,191,143,182,109,219, 34, 54, 62,126,168, 78,163,145,
- 87, 70,177, 56, 73,221, 22, 75, 83, 94,126,242,252,249,243,124,179,102,205, 80, 86, 86,246,216, 84, 85,141, 94, 85, 26, 46, 11,
- 11, 11, 28, 62,124,216,160, 41, 47, 63, 89,151,174,192, 11, 34,199,113, 32,132, 64,167,211, 33, 51, 51, 11, 90,173, 14,191,254,
-250, 43,214,174, 94,253,106, 90,102,230, 7, 80,218,105,254,138, 2, 52,245, 94,168,209,104, 78,158, 60,121,210,232,235,235,139,
-113,227,198, 97,218,180,105,152, 54,109, 26, 38, 78,156,136,241,227,199, 99,244,232,209, 24, 54,108, 24,218,180,105, 3, 39, 39,
- 39, 36, 36, 36, 24, 53, 26, 77,141,121,167, 90,237,174,177, 99,199,230,104,181, 90, 8,130, 0,157, 78, 7,141, 70,243, 56,202,
-118,243,230, 77,236,217,179, 7,171, 87,175,198, 31,127,252,129,242,242,114,148,148,148,224,198,141, 27, 69, 18,163,113, 7,171,
-250,207,116,210,236, 62,127,254, 60,236,236,236,224,238,233,217,165,214,135,146,216,216, 91,130, 32,160, 73,147, 38, 40, 7,106,
-220,182, 28,232,210,172, 89, 51,104,181, 90,220,139,142,190, 89,223, 52,149,150,150, 94, 77, 72, 72, 64,215,174, 93,225,230,233,
-185,204, 5, 48,171,207,254, 34,207,159,191,112,225, 2, 94,127,253,117,248,248,249,125,109, 1, 56, 61,185,141, 5,224,228, 27,
- 16,240,245,248,241,227,113,236,216, 49,136, 60,127,190, 38, 61, 87, 87,215,150,238,238,238,191,123,120,120, 68,184, 4, 28, 79,
- 26,218,167,237,248,170, 29,218,105, 81,220, 8, 15, 15,143,205, 28,199,125,196,106, 20,131,193,248,215, 27, 44, 81,163,153, 55,
-107,214, 44,189, 68, 34,193,187,239,190,235,244,195, 79, 63,205,219,177, 99, 71,171,219,119,239,186,234,117,186,186, 29, 86, 73,
-201,138, 5, 11, 22, 20, 25, 12, 6, 4, 7, 7,163,160,160, 0,130, 32, 64, 34,145, 64, 42,149, 66, 34,145,128,227, 56,152,155,
-155, 35, 50, 50, 18,219,183,111, 47, 65, 73,201,138, 58,211, 37,138,119,247,238,221, 11,169, 84, 74, 85, 42,213, 99,211,243,221,
-119,223,229,188,153,153,185, 7, 0, 36, 18,137, 30, 0, 56, 9, 49,169, 87, 46,199,113,117,118, 92, 87, 40, 20,149,157,251,235,
-238,228,206,243, 43,126,254,249,231,210,135, 15, 31, 66,173, 86, 63,110, 26, 44, 43, 43, 67,105,105,233,227,207,149, 38,241,236,
-217,179,165,230, 60, 95, 99,222,213, 64, 86,226,195,135, 3, 91,181,106,149,159,148,148,132,178,178, 50,196,198,198,226,210,165,
- 75, 56,120,240, 32, 78,159, 62,141,184,184, 56,232,245,122,216,218,218,162,164,164, 4,191,255,254,123,137,174,172,172,183,186,
-154,126, 64,140,255,199,203,205,173,135,139,179,115,170,147,163, 99,186,151,155, 91,143,106,140,198,131, 7, 15, 30, 64, 16, 4,
-248,251,251,219,215,214, 15, 75,224,249,243,151, 46, 93,194,232,209,163,225,234,225,177,200,169, 26,227,226, 4, 56,185,121,122,
- 46, 26, 55,110, 28, 78,158, 60, 9,161, 22,227, 82, 19, 42,224,187,143, 63,254, 88, 35,151,203,177,125,251,118,127,235,192,192,
- 24, 41,240,154, 2, 8, 14, 0,228,117,237,111, 9,252, 48,123,246,236, 44, 0,216,188,121,179,163, 91, 64, 64,148, 20, 24,167,
- 2, 26,168,128, 6, 82, 96,156, 91, 64, 64,212,246,237,219, 29,121,158,199,180,105,211,178, 44,129, 31,106,210,147, 72, 36,239,
-101,100,100, 12, 76, 79, 79,239,156, 21,123,209,235,167,175, 63,198,169,136,203,248, 97,245,150,245, 57, 81,141,223,202,206, 78,
-187,154,158,158, 62, 38, 45, 45,141, 45, 22,203, 96, 48, 94, 72, 72,101,179, 68, 85,100,109,190,204, 6,168,115,151,182, 77,112,
-237,118, 76,177,131,157,205,145,202,255, 21,221,223,219,240,149,174, 62,205,230,205,155, 7, 66, 8,238,223,191,143, 59,119,238,
- 0, 0,150, 44, 89,162,230, 40, 29, 90,185,222, 89,213,213,182, 43,215, 59, 83,234, 82, 45,155,219, 37,248,253,182,113,189,196,
-202,202, 10,101,101,101,144, 72, 36, 80,169, 84,176,176,176,128, 82,169,196,157, 59,119,240,250,184, 55,132, 56,190,233,227,137,
- 70, 43,215, 59,251,211, 10,222,132,112, 0,208,193,193,193, 60, 69, 46,255,208,201,197,229,227,169, 83,167,154,117,238,220, 25,
- 10,133, 2, 45,219,116,202, 50,107,246,241, 74, 78, 66,248,140,188,226,207, 3, 26,184,219, 68, 63, 76, 2, 64, 30,173, 89, 88,
-177, 22, 97,117,233,108,172,186,227,255,219, 79,243,173,195,194,194, 64, 41, 69,113,113, 49,178,179,179,145,147,147,131,162,162,
- 34,104, 52, 26,136,162,136, 19, 39, 78,224,196,149,248,146,108,171,151,226,107, 74,231,255,231, 61,201, 42,196,236,129,239,202,
-229,203, 36,118,118,118,200,206,206, 70, 94, 94,222,227,166, 66, 65, 16, 80, 90, 90,138,253, 7,254, 16,226,133,198,137, 58,101,
-131,210,186, 52, 81,158,106,102, 95,118,193,163,101,184, 47,157, 56,113,162,149,181,181, 53, 68, 81, 68, 65, 65, 1, 18, 19, 19,
-241,224,193, 3,156, 59,119, 78,157, 83, 98,164, 26,199, 94,105,149, 19,141, 86, 91,158,207, 47,170,247,207,211,172,168, 75, 0,
-224,238,230,150,153,156,156,236, 44, 8, 2, 60, 60, 60,248,162,130,130,197, 10,224,152, 28,200, 32, 0, 45, 5,102, 47, 95,185,
-242,141,193,131, 7,163,117,235,214,169, 89,217,217, 13,170,171, 75, 32,132,115, 7,236,228, 62, 62,247, 46, 95,190,236,244,224,
-193, 3,140, 29, 59, 54, 55, 35, 53,245, 67,107, 32, 2, 0, 74,128, 46,238, 94, 94,203,182,110,221,234, 20, 30, 30,142, 38, 77,
-154,228,234, 18, 19, 67, 50,128,194, 26,234,103,141,231,102,225,131,131,126,239, 14, 13,111,245,206, 59,239,128,231,121, 68, 68,
- 68,224,202,149, 43, 72, 73, 73,193,133, 11, 23,138,172, 45, 44, 70,214,118,110,162, 56,198,170,111,195,114,255,205,155,127, 35,
-114,185, 28,235,215,175,199,205,155,143,130,105,205,155, 55,199,248,241,227,193,243, 60, 70,143, 30, 67,255,136, 49,123, 60,209,
-104,117,117,201,211,211, 51, 92, 20,197,165,132, 16,185,160,112,110,149,149,112, 83,229, 22,212, 49, 35,235, 97, 15,175,250,244,
-185, 98,245,147,105, 50,205,127,143,230,139, 70,157,107, 17, 46, 92, 5,155, 63, 47,199,241,118,230,254,245,139,165,253,250, 15,
- 12,249,252,179, 89,146,198,141, 27, 67, 20, 69,180,110,221, 26, 99,199,142, 53, 15, 9, 9,169,107,189,179,178,151,134,188,153,
-240,210, 75, 47,217,190,251,238,187, 54, 93,186,116,145, 85, 46,149,115,247,238, 93, 28, 58,116,200,176,109,219,182,146,116, 69,
-167,162, 11,135,215,150,153,178,222,217,133,252,124, 53,128,249, 65, 6,195,234,217,159,125, 54, 55,172,113,227, 55, 63,248,224,
- 3,206,210,194, 92,182,240,243,183, 85, 0,240,229,247,219,108, 6, 15,127, 13, 43, 2,129, 46,175, 86,191,118, 92,213,116,166,
-101,230, 36,191,246,198,136,192, 55, 71, 15, 21,135, 12, 25, 98,110, 99, 99, 3, 47, 47, 47,216,218,218, 34, 33, 33, 1,119,239,
-222,165,199,142, 29, 43,187,125, 63, 69,182,105,199,177,100,133,165,179, 41,235, 6,150,190, 52,120,108,226,184,113,227,236,134,
- 14, 29,106, 21, 22, 22, 38,147,201,100, 80, 42,149,200,203,203, 67, 90, 90,154,225,244,233,211,101,233,242,118,133, 23,142,108,
- 40, 53,113, 45, 66, 77,231, 81,243, 98, 79, 30,157,251,193,237,219,183,199, 0,104,106, 48, 24, 60, 5, 65, 32, 28,199,101, 10,
-130,112, 71, 91, 86,182,142,111, 62,119, 5, 91,139,208, 52, 4, 65,144, 11,130,128,162,162, 34, 28, 63,126, 92, 26, 23, 23,247,
-249,237,219,183, 63,207,200,200,128,193, 96,192,240,225,195,209,188,121,115,156, 57,115, 6,185,217,217, 7,106,211,202, 0, 10,
-165,201,201,111, 76,158, 60,249,224,134, 13, 27,200,221,187,119,157,214,173, 91,247,219,141, 27, 55, 0, 0, 45, 90,180,192, 27,
-111,188, 1,169, 84,138,177, 99,199,210,148,196,196, 55,120,160,176,150,250, 89,219,185,153,123,104,219,119,183,135, 12, 27, 30,
- 58,103,246,103,178, 14, 29, 58,192,201,201, 9,157, 58,117,130,193, 96,176, 53,225,220, 44,237,220,103,100,124,211,166, 77, 45,
-150, 47, 95,238,250,198, 27,111, 96,202,148, 41, 0, 0,141, 70,131, 99,199,142, 97,218,180,105, 89, 41,210, 54,229, 55, 78,111,
-175,181,126, 86, 68,166,122, 1,128,135,135, 71, 4,128,206, 92,121, 82, 60,235,208,206, 96, 48,254,213, 6, 11,248,255,245,206,
-206, 93,137, 68,213,229, 56, 30, 97,127,207,104, 63, 52,254,141,105,139, 67, 37,198, 34, 59, 51,169,222,238,206,237,219, 92, 66,
- 66, 66,173, 63, 86,185,222,153, 78,233, 85, 38,100,230,183,250,110,197,138, 15,214,172, 89,211,163,114, 42, 6,149, 74,117, 87,
- 83, 94,126, 18, 37, 37, 43,116,190, 94,167,234,187,118,222,131,252,252,108, 0,147, 2, 68,113,229,184, 55, 39, 46, 33,150, 94,
-210, 89, 11,127,213, 74, 36, 18,125,124,122, 54, 86, 4, 2, 22, 38,204,135,170,214, 3,119,243,157,249, 40,218, 37,102,233,226,
-197,211, 87,253,240, 67, 27, 51, 75,203,206, 6,131, 33, 68, 20, 69, 0,184,167, 85,171,207,242, 6,195,149,116,247, 9,223, 42,
- 44,157,169,169,235, 6,234, 84,190,165, 22,154,115,173,118,239,220,249,254,225,195,135,255, 35,239, 86,192, 74,157,181,239, 73,
- 83,242, 94,117, 27, 35,112, 17, 57, 57, 23,107,124,218, 0, 91,139,208, 84, 56, 74,223,182,179,179,251,173, 71,143, 30,170,158,
- 61,123,162, 95,191,126,104,223,190, 61, 68, 81, 4,165, 20,165,165,165,216,177, 99, 7,190,249,230,155,135, 46,192,188,186,244,
-120,224,136,116,255,254, 65, 45, 90,180, 88,183,124,249,114,135, 73,147, 38,193,172, 98,106, 19,141, 70,131,211,167, 79, 99,218,
-180,105,249, 73,241,241,111,240,192,145,186,244,106, 63, 55, 85, 15,120,219,193,137, 35,167, 44, 14, 52,150,100,216, 57,152,243,
-174, 81,145,119, 77, 62, 55, 97,211,168,180,248,230,142,214, 47, 15, 29, 58,133,147, 74, 59, 86, 78,197, 16, 29, 29,125,189,114,
-177,103, 52, 31,127,162, 62,117,137,210, 71,115,207, 81, 74, 89,135,118, 6,131,241,239, 54, 88, 82,169, 52,167, 50,202, 35,149,
- 74,115, 18,246, 77,120,173, 54, 17, 47, 55,183,158, 21, 79,199,168,107, 45,194,202,247, 9, 69, 69,165, 21, 51,180, 87, 59,137,
-168,236,137,237,235,147,169,184,236,236, 24, 0,253,129,100, 32,230,220, 35,189,214, 11,103, 86,205, 83,141, 5,242,167,223,149,
- 23,164,101,103,159, 3,112, 14,192, 55,213,166,211, 91, 94, 80, 87, 58,159,204,251,237,228,228,146,138,124, 87,159,119,231,186,
-243, 46,173,103,249, 72,159,161, 60,255,109,100,230,230,238, 3, 96,225,120,240,160,203,161,131, 7, 95,153, 62,125,250,203,238,
-238,238,129,142,142,142,118, 86, 86, 86,220,229,203,151, 19,244, 90,237,202, 0, 96,195, 3, 64,109,138, 38, 15, 28,114,141,143,
- 15, 30, 52, 96,192, 7,156, 84,218, 49, 36, 36,164, 57, 0,220,187,119,239,166,200,243,231,157,128, 21, 60, 80, 96,194,113,172,
-223,185,169,172,255,185, 89,252,104, 22,249,133,224,121,160,162,249,255, 89,206, 77, 81, 20, 23,122,120,120,148,178, 25,218, 25,
- 12,198,191,137,106,251, 96, 61, 55,113,214, 62,205, 52, 95, 32, 77, 66,136, 4,128, 69,101, 68,134,149, 39,211,100,154, 76,147,
-105, 50,106,124, 32,102, 69,192, 96,152, 6,165, 84, 0, 80,194, 74,130,193, 96, 48, 24,117,154, 80, 0,225, 53,220, 76,234,243,
-100, 31,254, 20, 55,171, 72,166,201, 52,153, 38,211,100,154, 76,147,105,254,187, 52,235,210,126, 81, 34, 99,172,137,144,105, 50,
- 77,166,201, 52,153, 38,211,100,154,127,187,230,139, 6,199,138,128,193, 96, 48, 30, 49,111, 30,225, 0, 66,128,121, 28,176, 75,
- 2,140,144, 60,250,252,244,140, 24, 65,170,157,136,246,189,209,196,138,149, 56,131,241,226,194,250, 96,253,141,184,185,185,121,
-187,184,184,252, 66, 41, 37, 57, 57, 57, 19, 50, 51, 51, 83, 88,169,252,239,225,224,224,208, 3, 0,242,243,243, 79,190,168,121,
- 12,243, 35, 67, 41, 65,240,159,158, 80, 69,164, 68, 37,210, 63,173,179, 24,230, 75,198, 80,238,207,115,105, 17,138,251, 81, 9,
-116,111, 61,158,124,185, 33, 61,156,150, 2,192,190,147,185, 31,209,138, 9, 85,159, 39,238,238,238, 65, 14, 14, 14, 71, 37, 18,
-137, 84, 16,132,201,119,239,222, 61, 88, 91,122, 0,224,157, 97,152,101,231,224, 56,107,246, 36, 34,211,235,150, 20,233,180,218,
- 98,142,227, 18,229,114,249, 57,157, 40, 63,242,253,102, 99, 84,117,251,215,150,254,112, 63,210, 55, 56, 36,116, 96,139, 16,179,
-248,165, 35, 90,175,232,242,166,163, 44,225,250, 45,203, 85,123, 83,126,113,178,243, 24,248,254, 40,233, 65,165,153, 48,230,235,
-181,180,140,157,105,166,177,136, 16,123, 3,208, 88,174, 84,122, 10, 60,239, 2, 0, 18,169, 52,219,168,211,165,202,129, 59, 51,
- 41, 45,250, 31,209,116, 52, 74,165,225,114,133,194, 83, 48, 26, 93, 8, 64, 33,147,229,136,122,125,170,192,243,145,115, 40,205,
-127,218,116,202,148, 74, 47,129,231, 93, 8, 64,159, 87,222,159,167, 38,163, 14,131, 21, 16, 16,112,157,227, 56, 79,142,227, 42,
- 47, 66, 85, 47, 72,213,254, 21, 4, 33,237,254,253,251, 45, 77,253,113, 63, 63, 63,107,173, 86,251, 10, 33,228,181,138, 11,213,
- 22,149, 74,181, 35, 33, 33,225,169, 58, 18,251,249,249, 89, 83, 74, 63, 50, 51, 51,235,174,213,106,195, 0, 64,165, 82, 69,105,
- 52,154, 83,132,144,165, 79,163, 75, 8,145,186,185,185,141,176,176,176,232,198,243,124, 55, 74, 41,145, 74,165,167,213,106,245,
-169,204,204,204,157,148, 82,190,190,154,238,238,238,102, 14, 14, 14, 95, 6, 6, 6,190,250,238,187,239,230,219,219,219, 55,154,
- 55,111,222,181,240,240,240,173, 5, 5, 5,159,101,100,100,104,254, 23, 42, 7, 33, 36,192,213,213,117,139, 76, 38,147,164,166,
-166,118, 3, 0, 47, 47,175,211,122,189, 94,200,201,201,121,141, 82, 26, 87, 31, 61, 39, 39, 39, 11,153, 76,214,214,194,194,162,
-165,133,133, 69,103, 65, 16, 66, 68, 81,132, 40,138,247,202,203,203,207, 26,141,198,235, 70,163,241,114,110,110,110,249,255,202,
- 9, 66, 8,177,114,117,117,253,141,231,121, 16, 66, 26, 82, 74, 75, 95,196, 11, 1, 37, 8,142,142,186,215,168,234,119,161, 97,
- 33,255,185, 29, 7,239, 26,182, 51,217, 96,245,235,104,219,103, 96,223,166, 28, 0, 24,244,215,250, 0, 56,244,188,205, 85,191,
-126,253, 46,174, 92,185,210, 78,167,211,225,227,143, 63,222,210,176, 97,195, 31, 31, 62,124, 56,171,182,253,172,173,109,166,207,
-255,234, 7,243,138,235,153,179, 40,138,206,153, 25,169, 13, 99,238,223,237, 19,115, 63,114,209,212,225,247, 47,105,120, 97,226,
-218,125,184,111, 74, 58, 66,125,201,128,193, 47, 15,237, 63,255,139,185,120,245,213, 87, 27, 68, 21,104,205, 60,162,110, 43,202,
-169,101,128,163,179,231,160, 25,159,125, 77, 46, 95, 60, 51,104,231,182, 53,167,102,188, 73,186, 51,147, 85,231,185, 72, 22, 74,
-165,109,237,130,131, 59,143,220,183, 15,150, 94, 94, 82,169, 82,201, 1, 0,175,211,121,149,165,166,186,109, 31, 52,168,205, 60,
- 66,206,204,161,244,202,223,169, 57, 95, 42,237,224, 16, 28,220,225,213, 67,135, 96,233,230, 38,229,228,114, 14, 0, 68,131,193,
-179, 36, 35,195,109,123,255,254,173,231,201,100,103,231,242,252,101,106, 66, 63,157,127, 74,222, 25, 38, 26, 44,142,227, 60,111,
-222,188,233,108, 97, 97, 81,249,148, 6, 65, 16, 32, 8, 2, 42,110,138,143, 39, 94,164,148,130,231,121,116,237,218,213,164,167,
- 87, 55, 55,183,238, 0,198,133,135,135,191,252,209, 71, 31,201, 59,116,232, 0, 65, 16,112,234,212,169, 78,203,151, 47,255,222,
-221,221,125, 15,128, 13,153,153,153, 39, 77,125,186,117,115,115,235,109, 97, 97,177,249,243,207, 63,183,238,216,177,163,180,114,
-118,248,156,156,156,182,231,206,157,107, 57,111,222,188,201,110,110,110,163, 51, 51, 51,143,154, 90, 56,158,158,158,225, 13, 27,
- 54,220,213,183,111, 95,207,150, 45, 91,170,130,130,130, 64, 41,197,173, 91,183,222,136,137,137, 25,117,232,208,161, 57,158,158,
-158,195, 77, 93, 79,141, 16, 66, 2, 2, 2,198,186,186,186,126, 57,125,250,116,251, 33, 67,134, 40, 34, 35, 35, 11,253,253,253,
-201,158, 61,123,156, 14, 28, 56, 48,249,199, 31,127, 28, 17, 24, 24,248, 89, 92, 92,220, 70, 83, 78,188,134, 13, 27, 94,231, 56,
-206,211, 20, 3, 92, 31, 19, 76, 8,105,230,235,235,187,227,236,217,179,190, 73, 73, 73,194,208,161, 67, 55, 1,192,133, 11, 23,
-154, 80, 74, 73,135, 14, 29, 14, 19, 66, 94,161,148,222, 50, 37,239, 30, 30, 30, 77,156,156,156,246, 15, 25, 50,196,222,219,219,
-219,220,211,211,147,168, 84, 42, 72, 36, 18,148,149,149,185,199,196,196,244,188,117,235,150,230,194,133, 11, 5, 30, 30, 30,131,
-210,211,211,239,212,227,194,219,222,217,217,121,140, 76, 38, 11,231,121,222, 3, 0,164, 82,105,186,209,104,140,204,201,201,249,
-141, 82,122,241,105, 79, 16, 23, 23,151,239,151, 47, 95,238,152,157,157, 77,231,206,157,251, 61,128,177, 47,242, 5, 33,242,214,
-101,156,187,112, 22, 63,175,254,173,152, 82, 36,255,135,193, 18, 17, 27, 22, 22,226, 52,241,237, 49,246,157, 58,116, 70,120,179,
-182,117,106, 14,233,225, 56, 95, 33,151, 58,168,117,186, 43,121,105,220,126,239, 0,197,208,209,195, 90,198, 3,192,145, 19,119,
-135,182, 9,176, 63,239,232, 41, 14, 54, 87, 42,219,232, 13,124,254,190,147,121, 95,212,199, 76,185,186,186, 30,181,180,180, 52,
- 47, 42, 42,202,202,207,207, 95,213,175, 95,191,133,203,151, 47,183,139,143,143, 71,106,106, 42,198,141, 27,103,153,158,158,254,
-174,183,183,247,165,148,148,148, 26, 35, 89, 37,165,197, 43,190,156, 59,125,142,149,141,157,196,220,204, 2,150, 86,214,240,245,
-107,136, 86,109, 58,161,231, 75,131, 16, 31, 23,211,110,199,230, 53,183, 38, 15, 75, 91, 20, 83,128, 5, 17, 17,168,241,218, 20,
-214,128,116, 25, 60,252,145,185,250, 98,254, 92, 60,136,185, 95,154,148,194, 77,253,227, 6,103,222,183,123,168, 82,175, 43, 75,
-186,124,241,140,111,219,246, 93, 1,160,229,206,109,107, 78,205, 27, 77,122,204,217,252, 98, 26,248,231, 97,174,230,203,100, 99,
-123, 47, 95,238,220,124,242,100,121, 89, 98,162, 33,254,231,159,213,217,103,207, 10, 82,165,146,122,245,233, 67,156,186,117, 83,
- 77,190,119, 79,126, 97,241,226,206, 95, 41, 20,254,159,234,245,155,255, 46,205,126,223,125,231,212,108,194, 4,121, 73,124,188,
-225,193,247,223,107,178, 78,156,224,229, 42,149,232,217,175,159,196,165, 87, 47,229,228,168, 40,249,165, 37, 75, 58, 72,103,207,
-246, 3,240,219,139,144,119, 70,253, 12, 22, 44, 44, 44,176,109,219, 54,200,100, 50,200,100, 50, 72,165,210, 26,223,251,248,248,
-152, 98,130,134,133,133,133,253, 48,125,250,116,151,129, 3, 7,194,206,238,207,171,108, 12, 24, 48, 0,253,250,245,147, 39, 36,
- 36,140,218,185,115,231,168, 77,155, 54,101,185,185,185, 77,205,172, 88,176,185,150,155,119, 55,127,127,255, 61,219,182,109, 51,
-211,104, 52,136,136,136, 64, 97, 97, 33,148, 74, 37, 60, 60, 60,208,169, 83, 39,233,233,211,167,237, 71,141, 26,181,199,195,195,
- 99, 64,122,122,250,233,186,210,234,234,234,218,210,201,201, 41, 98,245,234,213,170,224,224, 96, 18, 27, 27,139,166, 77,155, 2,
- 0,242,243,243, 49, 96,192, 0,213,144, 33, 67, 2,222,125,247,221, 75,174,174,174, 93,179,178,178,174,215,145,247, 22, 77,155,
- 54,221,216,167, 79, 31,247,153, 51,103, 90, 91, 90, 90, 34, 41, 41, 41,211,213,213,181, 97,165, 9, 26, 60,120,176,162, 87,175,
- 94,110,171, 86,173, 90,121,232,208,161,143,221,220,220,198,102,102,102,222,168, 77,151,227, 56,207, 27, 55,110, 56,155,155,155,
- 35, 59, 59, 27,155, 55,111,198,187,239,190, 11,169, 84,138,156,156, 28,236,216,177, 3, 83,167, 78, 5,199,113, 40, 41, 41, 49,
-201, 4, 91, 88, 88,244,108,218,180,233,218,147, 39, 79,122,218,218,218,194,221,221,157,155, 61,123,118,184,191,191,191,153,155,
-155, 27,151,145,145,129, 61,123,246,248,143, 25, 51,102,191, 74,165,122, 67,171,213,214,217,116,230,224,224,176,110,211,166, 77,
-222,183,111,223,198,170, 85,171, 80, 80, 80, 0,133, 66, 1, 27, 27, 27,184,186,186, 34, 40, 40,136, 76,158, 60,217,188, 91,183,
-110,230,115,231,206, 93, 7,160,153, 9, 23,221,166,206,206,206,191,140, 26, 53,202,127,238,220,185,182,110,110,110, 48, 55, 55,
- 7, 0, 20, 23, 23,123, 38, 37, 37,181,157, 51,103,206,112, 23, 23,151,132,156,156,156,137,148,210,219,245,188,168, 55,235,209,
-163,199,128, 33, 67,134, 72,178,178,178,176,102,205,154, 1,132,144,102,166,154,202,127, 34,231, 46,156, 69,183, 62,163,160,225,
-205,100, 7,246,110,166,101,177,171, 29, 44,109,109,165, 0, 80, 86, 84,196,219,219, 91,136, 3, 6,141, 54,116,239, 51, 88,125,
-234,200, 22,115, 83, 12,150, 66, 46,117,216,190,118, 82,234,217,203, 15, 67,142,158, 74,234, 57,100, 80, 79, 78,106,209, 40, 0,
- 0, 62,252,224,109,197,190,223, 79,252,216,187,123,131,204,206,109, 27,166,142,124,243,103,175,250,152, 43,127,127,255, 51, 71,
-143, 30,117, 81, 40, 20, 40, 44, 44,116, 88,191,126,253,183,109,219,182,229,226,226,226,112,255,254,125, 36, 38, 38,162,168,168,
- 8,173, 91,183,182,140,142,142, 94, 5,160, 70,131,245,211,110,124,185,120,134,203,119, 78,110, 78,190, 70,189,206,137,215,101,
-135,157, 60,122,187,201,238, 29,234, 22,206,174,158, 13, 71,141,158,128, 25,179,191,150,237,221,181,241, 11,156, 62,134,136,218,
-102,241, 39,104,255,233,204, 89, 40, 81,235, 48,250,181,183, 49,102,244,219, 14, 84,212,187, 81, 81,107,161,215, 22,218,218,200,
- 99, 14,110, 92,191, 99, 40, 0,207, 42, 38,235, 36, 51, 89,213, 51, 95, 42,109,243,210,178,101,206, 77, 39, 79, 86,222,158, 55,
-175, 60,239,236, 89,141, 95,191,126,133,205, 39, 77,210, 1, 64,105, 98,162,252,193,156, 57,230, 78,157, 59,155,117,248,228, 19,
- 91,163, 90,237,186,128,144,214,179, 41,189, 90, 95, 77,223, 87, 95, 21,150,238,217,211,234,242,226,197, 93,177, 96,129,164, 91,
-243,230,183,102,255,252,115,154, 41,154, 11,165,210,182,125,127,252,209,185,241,248,241,202,235,179,102,149, 23, 93,189,170, 9,
- 24, 58,180,160,213,180,105,122, 72, 36, 80,167,165,201,226,230,205,179,176,105,211,198,172,221,135, 31,218, 10,122,189,203, 60,
- 66,218,212, 22, 33,154, 47,149,182,233,179, 98,133, 83,211, 73,147,148,183, 23, 46, 44,207, 56,117, 74, 87, 18, 18,130,102, 47,
-191,156,239,225,224,160,123,218,188, 87,213,204, 59,125,250,153,203,147, 81,205,101,160,166, 32, 73,163, 70,141,178, 99, 98, 98,
-156,119,239,222,109,146,193,114,119,119, 71,167, 78,157,114,238,222,189,235, 82,203, 5, 49, 53, 53, 53,213,147,231,121, 40, 20,
-138, 90, 19, 86, 90, 90,138, 59,119,238, 96,212,168, 81,105, 25, 25, 25, 53, 94,116,237,237,237,173,236,236,236,226, 79,159, 62,
-237, 24, 29, 29,141,235,215,175,195,223,223, 31,118,118,118,144,201,100, 48, 26,141, 40, 45, 45, 69, 96, 96, 32,204,205,205,209,
-175, 95,191,188,130,130, 2,255,130,130,130, 26, 47, 98, 13, 26, 52, 80,202,100,178,135,187,119,239,246, 10, 15, 15,199,213,171,
- 87,225,229,229, 5, 87, 87, 87, 0, 64, 98, 98, 34, 46, 92,184,128,190,125,251, 34, 50, 50, 18,147, 38, 77, 74, 53, 26,141, 13,
-147,146,146,116, 53, 54, 23,132,134,102,238,220,185, 51, 45, 56, 56, 88, 91, 94, 94,206,101,103,103,203,206,158, 61,203,151,149,
-149, 89, 22, 21, 21,201,138,139,139,165,197,197,197,178,242,242,114, 25,199,113,114,157, 78, 39,187,124,249,178, 36, 63, 63,223,
-186,182,114, 10, 14, 14,206,190,127,255,190,243,239,191,255,142,198,141, 27, 99,247,238,221,248,232,163,143,112,225,194, 5,120,
-122,122, 98,215,174, 93,248,232,163,143,112,255,254,125, 56, 57, 57,161,123,247,238,181, 30, 35, 0, 8, 12, 12,140,189,115,231,
- 78,128, 66,161, 64, 92, 92, 28,210,210,210,208,185,115,103,136,162,136,172,172, 44, 60,124,248, 16, 25, 25, 25, 8, 8, 8,192,
-107,175,189, 22,151,150,150, 22, 88, 87, 69,107,209,162, 69,238,201,147, 39, 29,155, 52,105,130,172,172, 44,216,218,218, 62,126,
-217,216,216,192,214,214, 22,126,126,126,152, 62,125, 58,154, 54,109,154,147,148,148,228, 82,151,249, 9, 15, 15, 63,122,234,212,
- 41, 71,123,123,123,104,181, 90,104,181,218,199, 15, 7,230,230,230,144,201,100, 0,128,135, 15, 31, 98,192,128, 1,185,241,241,
-241,125, 76, 53, 71,132, 16,206,197,197,229,254,237,219,183, 27, 90, 89, 89, 33, 53, 53, 21,145,145,145,120,243,205, 55, 31,150,
-151,151, 7,255, 21,253,134,254, 78, 66,253,201,231,209, 81,247, 26,133,134,134, 20,191,254,198, 68,217,224,129,131,203,111, 94,
- 57,102,148,233,206,148,189,212,201, 38, 3, 0, 78, 94, 46,117,214,201, 58,201, 91,182,238, 77,246,239,223,175,218,184,225, 23,
-105, 84,212, 61,215,208,176,144,152,232,120,186,176, 38,237, 1,221,108, 95,255,104, 74,159,144,206, 29, 58, 75, 75,202,169,235,
-218,117,191,182, 78, 78,138,119, 1, 0,159, 6,254,217,111,190,241,246, 85,107, 11,146,117,246,194, 89,126,233, 15, 71,238, 29,
- 60, 93,180,201,132,232,178,191,151,151,215,165,245,235,215, 59, 58, 58, 58,194,198,198, 6,106,181, 26, 6,131, 1,209,209,209,
-218,237,219,183, 27,173,173,173,173,178,178,178, 80, 88, 88, 8,169, 84,138,203,151, 47,167,100,101,101,249, 84,119,172, 43,223,
-239,220, 57, 87,218,165,165,183,157,156,163,102, 10, 33,198, 93, 42,161, 10, 2, 91,151,147, 17,151,155,158,137, 56, 59,186,223,
-192,145, 78,237, 58,116,195,215, 11,103, 24, 19, 83, 83,155,173,221,135,251,213,213,133, 16, 63,210,125,200,176,161, 35,230,127,
- 49, 23,115,231,207,195,193, 3,251,138, 45,205, 56,157,181,149,204,166,115,199, 14,218,233, 83, 95, 73, 85,151, 22,121,125,187,
-124,233,171,189,250, 12,245,108,219,190, 43, 46, 95, 60,131,157,219,214, 92,151, 43,141,172,185,176, 10,243, 8,177,179,245,247,
-159, 56,229,225, 67,249,221,185,115,203,248,140,140,194,150,211,166,229, 85,183,109,218,241,227, 22, 10,119,119,107,135, 65,131,
-236,150,251,248,192,152,147,243, 75,117,125,136,170,211,188,234,230,102,187,247,244,233, 30,162, 84,218,229,221, 41, 83,204,122,
-246,236,137,146,146, 18, 28, 60,120, 16, 91,183,108,209,185,186,186,222,177,189,122,245,150,127,102,230,231,213,105, 46, 34,196,
-222, 42, 40,104,194,187,247,238,201,111,126,254,121, 25, 10, 10, 10,154, 79,157,154, 47, 8, 2,153,176,112, 97,191,248,204,204,
- 46,217,121,121, 62, 0,224,108,107,155, 26,236,230,118,243,187, 77,155,162,127,104,212,136,150,101,100,252, 50,135,210,194,186,
-210,185,253,194, 5,151,195,185,185,111,217,217,217,153,229,229,231, 75,228, 50, 89, 65,139,134, 13,183,127, 61,117,106,132,230,
-250,117,197,211,230,189,229,180,105,121,197,106,181,244,179,239,190,235,144,145,159,223,160, 92,175, 15, 44, 46, 43,115,229, 13,
- 6,206,202,204, 44,191, 65, 64, 64,118,201,169, 83, 89, 62,101,101,239,175, 40, 47,207, 97,181,242, 25, 35, 88,132, 16, 80, 74,
- 77, 50, 87, 50,153,236, 79,205, 80,181, 32,151, 72, 36,184,122,245, 42,114,114,114,208,184,113, 99,248,250,250,254,105,131,248,
-248,120, 28, 58,116, 8,133,133,133,104,209,162, 5, 0,200,107, 19,180,178,178,250, 96,214,172, 89,182,122,189, 30, 55,111,222,
- 68,139, 22, 45,160, 82,169, 32,147,201, 32,151,203, 33,149, 74,225,234,234,138,188,188, 60,184,184,184, 96,242,228,201, 54,223,
-125,247,221, 7,168, 97,153,154,138,230,208, 41,163, 70,141,114, 14, 15,127, 52, 69, 71,106,106,106,101, 90, 0, 0,206,206,206,
-184,117,235, 22, 90,180,104, 1, 23, 23, 23,244,237,219,215,121,255,254,253, 83, 0, 44,173, 49,227,114, 57, 23, 28, 28,220,170,
- 34, 66, 4,142,227, 30, 88, 91, 91, 59,185,184,184, 88, 88, 91, 91,255, 71, 30,215,175, 95, 95,164, 80, 40,140,166, 20,106, 86,
- 86, 22,194,195,195, 81, 84,244,232, 92, 42, 47, 47, 71, 96, 96, 32,138,139,139, 1, 0, 58,157, 14,238,238,238,143, 13, 72, 77,
- 52,109,218,116,110,112,112,240, 75, 93,187,118, 85, 74,165, 82,220,190,125, 27,205,155, 55,199,246,237,219,225,227,227, 3,115,
-115,115,196,196,196,160, 73,147, 38,136,136,136,128,147,147, 19,194,194,194,148, 45, 90,180, 56, 87, 80, 80,112, 58, 41, 41,105,
-110, 45,145, 54,206,210,210, 18, 17, 17, 17, 88,183,110, 29, 18, 18, 18,144,145,145, 1,107,107,107, 52,107,214, 12, 33, 33, 33,
-232,208,161, 3, 98, 99, 99, 65,234,168, 76,132, 16,215,134, 13, 27, 30,188,122,245,170, 35,199,113,136,136,136,128, 90,173,134,
- 86,171, 69, 69, 95, 41,168, 84, 42,180,107,215, 14, 14, 14, 14,104,216,176, 33,246,238,221,235,212,171, 87,175, 67, 21, 17,168,
-172,186,202,212,206,206,238,253, 47,190,248,194,203,197,197, 5,165,165,165, 80,171,213,112,119,119, 71,175, 94,189, 60, 14, 29,
- 58,244, 62,128,229, 47,212,147,150,136,148,208,176, 16, 80,138,228, 3,123, 55, 83, 79, 39, 85,120,215, 22,162,243,131,104,105,
-187,203,151, 35,195, 0,192,206,194,247,118,195, 16,195,131,136,107,199,211, 14,254,190,245,182, 32,128, 11, 9, 13,105,196, 81,
-164,215,166,157,151,198,237, 63,122, 42,169,103,147, 38,157, 36,223,125, 59,103,240,132, 55,122, 43,237,237, 58,145,146,180, 29,
-184,112,227,174,207,236,217, 51,157, 23, 44, 88,124,224,232,169, 36, 33, 47,141,251,210,148,244, 6, 52,176,255,126,247, 50,153,
- 99,105,233, 22,220,142,181, 4, 49,107, 2, 95,191, 0,148,148,148, 64,169, 84,170, 94,125,245, 85, 97,214,172, 89,106, 43, 43,
- 43,243,138,186,156,195,113, 92,239, 58,133,239,223, 3,223, 56,144,151, 89,233, 69,145, 90,106,160, 45,150,223,141,141, 71,167,
-110,125,179, 91,183,104,182,112,241,210,229,159,251, 7, 54,114,122,245,245,137,178,101, 95,127,254, 51, 64, 59, 85, 39,115, 47,
-129,158, 10,245, 37,102, 0,250,207,255, 98, 46,226,227, 31,218, 77, 24, 86, 52, 79, 42, 49,115, 15,110,220,197,234,231,245,199,
-251, 4, 6, 53,106, 48, 97,242,251,127,172, 94,181,178,127,213, 72,214,182, 45,171,247, 19, 66,122,208,191,114, 14,157,127, 22,
- 77,198, 28, 60, 8,117, 74,138,177,224,220, 57,109,143, 31,126,200,107,241,250,235,203, 13, 70,163, 35, 33,228, 79, 93, 33, 8,
- 33,128, 40, 18,233,210,165, 28,117,119,135,209,214,118,220, 76, 32,168, 46,205,197, 70,227,176, 33,205,154,245, 95,187,121, 51,
-124,124,124, 30,107,218,216,216, 96,202,148, 41,152, 60,121,178,242,206,157, 59,109, 14, 29, 58,212,102,211,143, 63,186,204, 4,
-134, 61, 41,104, 0, 26,191,250,251,239, 40, 75, 76, 52, 20, 92,189,170,237,190,114,101,254,153,107,215,236,103,254,248,227,236,
-198,205,155,123,252, 52,119,174,210,219,251,209,248,144,148,148,148,192,149, 43, 86,120,119,235,213,171,195,140, 15, 63, 92,127,
-107,250,244, 80, 60, 90,146,173,198,116,102,157, 61,171, 63, 92, 80,240,214,206, 93,187,108, 27, 53,106, 4, 74, 41, 98, 99, 99,
-157,215,173, 91, 55,177,203,228,201, 99, 62, 28, 53,106,118,175,132,132, 66, 33, 63, 95, 49,224,251,239,101,219, 70,140, 8,171,
- 75,179,178, 60, 1,224,229,143, 62,250,160,117,251,246,161,125, 95,125,213,222,221,221,157,152,153,153,193, 96, 48, 32, 43, 43,
-203, 46, 38, 38, 38,224,100,113,113,201,177, 91,183,126, 67,197, 34,238,140,103, 48, 88, 0, 32, 8, 66,189, 12,150,137, 38,235,
-113,196, 43, 47, 47, 15,145,145,145,240,241,241,129,209,104,196,209,163, 71, 81, 84, 84, 4,185, 92, 14,185, 92, 14,189, 94,111,
- 82,115, 86,231,206,157,165, 23, 47, 94,132,175,175, 47,204,204,204, 30, 27,171, 74,147, 37,147,201,224,234,234,138,226,226, 98,
-116,236,216, 81,182,110,221,186,158,181, 25, 44, 75, 75,203,126,131, 6, 13,122, 28, 98, 43, 47, 47,135, 68,242,104,164,181, 94,
-175, 71,105,105, 41,242,243,243, 81, 92, 92, 12,173, 86,139,166, 77,155, 42, 78,157, 58,213,175, 54,131, 85, 21,181, 90, 93,150,
-147,147, 99,219,169, 83, 39,187, 13, 27, 54,196,180,107,215,238, 79,157,134,207,156, 57,163,213,233,116, 82,133, 66, 97, 82,103,
-247,205,155, 55, 63, 46,251,140,140, 12,252,242,203, 47, 16, 69, 17,132, 16, 60,124,248, 16,223,125,247,221,227,190,114,181, 29,
-163,224,224,224,190,191,253,246, 91,203, 77,155, 54, 21, 74,165, 82,196,196,196, 96,203,150, 45,160,148,194,209,209, 17,106,181,
- 26, 57, 57, 57, 88,190,124, 57, 12, 6, 3, 44, 45, 45,225,225,225,161,154, 50,101, 74,199,121,243,230,201, 0,204,173,165, 46,
- 9, 18,137, 4,222,222,222,248,226,139, 47,160,213,106, 33,151, 63,242,149, 37, 37, 37, 40, 42, 42,194,205,155, 55,145,152,152,
- 8, 81, 20,107,189,177,168, 84,170,225, 27, 55,110,116, 86, 40, 20,208,106,181,120,248,240, 33,226,226,226, 16, 19, 19,163, 43,
- 40, 40,224, 45, 45, 45,137,155,155,155,164,184,184, 88,241,250,235,175,147,210,210, 82, 80, 74, 49,116,232, 80,135,181,107,215,
-190, 2, 96, 69, 29, 6,206, 41, 36, 36,228,211, 9, 19, 38,168, 42,203, 77, 20, 69,228,230,230, 98,196,136, 17,230,167, 79,159,
-158, 69, 8,217, 66, 41,205,125, 81, 46, 4, 85, 71, 11,150,197,174,118, 56,118,236,167, 6, 15,162,165,237, 36,200,111,211,188,
-203,251, 82, 0,184,127,125,125,135,216,123, 87, 5, 75,145,196,255,177,101,233, 37,203,192, 9,249, 0,246,215, 22, 5,236,215,
-209,182,143,119,128, 98,232,144, 65, 61,185,181,235,126,109, 61,225,141,222, 74,231,166,191, 18, 0,176, 83,122,162,189,241, 67,
- 78,171, 47, 87,173, 93,247,107,235, 33,131,250, 93, 73, 76, 74, 94,222,191,147,221,222, 67,231,139,142,212, 22, 37,116,115,148,
-122,216,153,229,193,206,171, 39,124, 66,236,112,243,230, 77,236,223,115, 17,129,141, 90, 65,175,215,195,104, 52, 90, 12, 24, 48,
- 64,189,107,215, 46,109,126,126,126,169,193, 96,232,146,145,145,241,160, 78,127,133, 60,177, 41, 39, 26, 20,130,140,215,148, 43,
-202,167,206,222,243, 74,235,246,125, 91,216,123,123,200, 28, 84,252,129,174, 93, 58,111,222,186,233,151,233, 31,206, 88,128,166,
-205,219,181,159, 42,191, 22, 6,224,110,117, 90,209,137,244, 96,184, 63,225,227, 31,196,246, 79, 78, 77, 74, 11,242,114,213,199,
-165, 80,227,251,179,126,238,213,169,231,240, 38, 1,141,218, 42,162,238, 95, 36,211,167, 77,223,250,237,183, 75, 94,173, 52, 89,
-103, 35,142,118,153, 59, 46, 73, 1, 64,199,110, 81,128, 92,169,244,180,244,241,145, 38,110,216,160,241, 31, 56,176, 16, 0,140,
- 60,239,120,249,202, 21, 27,115,115,115, 80, 74, 97, 52, 26,255,212, 71,184,178, 95,112,207,174, 93, 93, 76,209, 76,253,233,167,
- 38,239,190,251, 46,178,178,178,192,243,252,227,232,119,149,107, 54, 74, 74, 74, 48,108,216, 48,172, 95,181,170,218,118,113,153,
- 82,233,101,233,229, 37, 77,220,176, 65, 19,208,191,127, 1, 4,129,204,248,241,199, 47, 62,252,248, 99,223, 17,175,188,242,167,
-231,198,144,144, 16,252,180,106,149, 98,203,150, 45, 30,139, 87,173,122,163,175, 82, 25, 95, 87, 58, 75,195,194, 96, 23, 25,105,
-214,168, 81,163,199,134,178, 97,195,134,248,250,235,175,149,163, 71,143, 86,140, 29, 51,102, 89, 84,163, 70, 43,231, 38, 38,198,
- 58, 4, 5, 89, 75,149, 74, 79, 83,203, 19, 0,202,244,250,240,185, 11, 22,216, 93,185,114, 5, 25, 25, 25,168,244,247,132, 16,
- 52,105,210,132,188,242,202, 43, 54,109, 91,182,108,205,106,228,115,138, 96, 85,103,176,106, 50, 90,228, 41,166,138, 33,132,192,
-205,205, 13, 6,131, 1,191,254,250,235, 99, 99,245,248,137,192, 96,168, 83, 67,171,213, 54,118,117,117, 69, 73, 73, 9,130,130,
-130, 30,107, 84,166,171,242,165, 82,169,160,213,106,225,225,225, 1,173, 86,219,184, 14, 3,212,204,198,198,166, 50,154, 5,157,
- 78,247,216, 92, 21, 21, 21,161,168,168, 8,122,189, 30,133,133,133, 40, 43, 43, 67, 81, 81, 17, 74, 75, 75,155,155,146,103, 81,
- 20, 17, 25, 25, 25,215,168, 81,163,102, 18,137, 4,150,150,150, 22,229,229,229,168, 28, 76, 80, 80, 80,128,141, 27, 55,150,191,
-254,250,235,142,151, 47, 95,214,152, 82,134, 83,167, 78,133, 82,169,132, 90,173,198,170, 85,171, 48,117,234, 84,200,229,114,148,
-150,150, 98,213,170, 85,152, 62,125, 58,164, 82, 41,116, 58, 29,182,111,223, 94,163, 86,116,116,116,226,229,203,151,155,183,104,
-209,194,110,239,222,189,185, 61,123,246,116,234,221,187,247,227,178,227,121, 30,109,218,180, 65,112,112, 48,114,114,114,112,248,
-240,225,188,134, 13, 27, 58, 94,185,114, 69,204,202,202, 74,174, 35,223,143, 77,147, 68, 34,129, 32, 8,200,206,206, 70, 81, 81,
- 17,114,115,115,145,145,145,129,180,180, 52, 72,165,117,207, 28,226,224,224,240,114,120,120,184,164,194,108,193,207,207, 15, 31,
-126,248, 33,175,209,104, 70, 0, 56, 92,177, 89,223,173, 91,183,238, 13, 12, 12,148,186,187,187,227,225,195,135,112,114,114,146,
-154,153,153,141,172,203, 96,185,186,186,174, 63,112,224,128,125,229, 8,218, 74, 52, 26, 13,120,158,199,168, 81,163,236,215,174,
- 93,187, 30, 64,191, 23,241,162, 96,105,107, 43,125,169,147, 77,198,229,203,145, 97,205,187,188, 47,181, 15,154,243,200,128, 3,
-210,155,103, 87, 54,239,212, 38,124, 75,101,191,172,218, 24,210,195,105,233,192,190, 77,185,209,195, 90,198, 75, 45, 26, 5,108,
-222,184,210,197,222,174,211,255, 95, 40,164,246,176, 80, 1,193, 62, 2,119,233, 96,188,203,244,233,141,244, 91,126,126, 43,126,
-243,158,235, 61,229,138,219,221, 1, 76,175,209, 16,198, 27,127, 47,214,218,135,216, 20,239, 33,112,120, 27,205,155, 55,135,147,
-147, 59,126, 90,253, 27, 60, 26,180,128, 94,175,135,181,181,181,249,163,203,136, 97,179, 41,230, 10, 0,230,206,141, 16, 59,119,
-238, 98,144, 58, 57,242, 83,166,124, 59,172,119,223, 97, 33, 93,186,246,160,199,143, 31, 49,180, 15, 49,100,244,232,210, 54,235,
- 76, 68,196,195,172,172,244,134,193, 33, 77, 16, 19,117,189, 55, 64, 34,129,234,163, 77,145,241,244, 72, 64, 0, 57,189,253,227,
- 9,162, 70,127,211,108,225,143,119,251,246, 31, 60, 54,188,115,199, 78,226,241, 19,199,244, 10, 20,221,179,236,216, 62,125,236,
-152,145,123,183,239,216,253,210,233, 19, 7, 3,139,139,178, 15, 46,217, 68,153,185,170,124, 56,227,121, 23,169, 82,201,101,159,
- 62,205, 55,125,243,205,199,229, 98,110,110,142,253,251,247, 67,161, 80, 64, 46,151, 67,161, 80, 60,126,201,229,114,184,186,186,
-130, 80,202,213, 71, 51, 51, 51, 19, 89, 89, 89,176,177,177,129,147,147, 19,178,178,178,112,225,194, 5, 60,124,248, 16, 82,169,
- 20,125,251,246, 5, 87,195,125,243, 9, 77,253, 91,243,231,247, 9,107,210,196,253, 73,115, 85,121,111, 43, 40, 40, 64,151, 46,
- 93,200,241,227,199,157,206,198,199, 15,254,172,154,206,238, 85, 53, 27, 15, 26,148,159,115,242,100,181,191, 29, 26, 26, 74,246,
-238,223,175,124,117,212,168,105, 95,175, 94,189, 98,246,178,101, 89,224,121,215,250,228,157, 16,194, 17, 66,224,229,229,133,130,
-130, 2,148,149,149, 85, 6, 28, 96,103,103, 7,163,209, 8, 81, 20,101,172, 70,154, 14, 87,151, 25,120,210, 72,213,244,226, 56,
-238,169, 76, 86,109,152, 98,176, 42, 77,134, 82,169,252,211,201, 85,249,170,122,242, 85,154, 24, 19,144,148,148,148, 96,207,158,
- 61, 40, 40, 40, 64,105,105,233,159,204, 85,101,228, 42, 33, 33, 1, 91,183,110, 69,122,122, 58, 36, 18,137, 73,147,182, 38, 36,
- 36, 92,247,245,245,109, 86, 25, 17,235,214,173,155,231,185,115,231, 50, 42,205,220,231,159,127,158,215,182,109, 91,199, 39,111,
-238,181, 38, 86, 34,193,133, 11, 23,160, 86,171, 65, 41,133, 92, 46, 71, 76, 76, 12,120,158, 7,165, 20, 82,169, 20,185,185,185,
-117, 70,176, 34, 35, 35,199,191,241,198, 27, 43,222,124,243,205,211, 51,102,204, 56,222,189,123,247, 84, 66, 8,140, 70, 35,172,
-173,173,225,234,234,138, 7, 15, 30, 64,163,209,224,131, 15, 62, 72,217,180,105,211,137, 85,171, 86,157, 94,179,102,205,138,180,
-180,180, 55,234,115,108,121,158, 71,121,121, 57, 10, 11, 11, 81, 80, 80,128,146,146, 18,104,181,218,167,170, 67, 61,122,244,192,
-193,131, 7, 37, 61,122,244, 88,235,227,227,147,229,227,227,147,213,163, 71,143,181,191,255,254,187,196,195,195, 3,169,169,169,
-184,121,243, 38, 10, 10, 10, 32,138, 98,173, 63, 32,147,201,186,141, 25, 51,166,163,183,183, 55, 49, 24, 12,208,233,116,208,235,
-245, 48, 24, 12, 16, 4, 1, 41, 41, 41, 8, 13, 13,229,188,189,189,219, 17, 66,186,177, 75, 72,253, 40, 73,219, 1,154,243, 3,
-104,193, 54,136, 57, 63,162, 92,251,116, 58,133,133,133, 95,190,243, 85,113,142, 80,124, 26,209, 55,246,160, 84, 35,133,103, 96,
- 55, 76,124,115, 20,174, 93, 57,141,252,252,124,220,187,119, 15,157, 59,119,150, 19, 66,234, 85, 55,183,109, 59, 40,188, 58,234,
-147, 87,122,244, 30,214,178, 71,207,126,194,241,227, 39,117, 87, 47, 29,185, 30,232,107,157, 67,249,162,108, 27,107,243, 27,177,
- 15,238,161, 97,163, 80, 24,121,177, 51, 48,183,214, 58, 21, 23, 71,245,127,100,185, 9,175, 76,141, 28,211,123,224,184,166, 61,
-122,246, 54, 30, 61,114, 64, 56,119,108,215,205,222,221, 26, 68, 44, 90,178,197,171,192, 24, 20,166,178,118, 61,212,174,153,121,
-167, 73, 67,188, 39,176,154, 82, 77,228, 69,165, 18, 81,113,221, 36,132, 64, 20,197, 63,153,170, 39, 95,166,220,147,170,106, 86,
- 66, 41, 69, 81, 81, 17, 30, 62,124,136, 37, 75,150,224,214,173, 91, 16, 4,225,113, 36,171,198,251, 16, 64, 31,107, 2,136,207,
-204,236,242,238,187,239, 42,171, 51, 87,249,249,249,200,203,203, 67,122,122, 58,250,246,237, 43, 47,177,183,111, 86, 87, 58, 61,
-156,157,117,230, 42, 85,246,131, 7, 15,254, 35,189,165,165,165, 80, 42,149,248,225,199, 31,229, 7, 35, 35,167,158,187,112,193,
-182, 62,229, 89,169, 67, 8,129,179,179, 51, 2, 2, 2,208,188,121,115, 52,110,220, 24, 42,149, 10, 81, 81, 81,248,229,151, 95,
- 32, 33,132,103, 53,241, 57, 68,176,106, 50, 88,213,189,151, 74,165,168,143, 33, 48, 21, 83,154, 8, 85, 42,213,221,236,236,236,
- 14,158,158,158, 48, 26,141,143,163, 87,149,205,132,149,159, 1, 64,169, 84,226,222,189,123, 80,169, 84,119,107,211, 52, 55, 55,
-191, 43,145, 72,218,181,106,213, 10,123,247,238,197,233,211,167,145,144,144, 0,141, 70, 3,173, 86, 11,141, 70,131,168,168, 40,
-136,162,136,240,240,112,216,216,216,192,220,220,252,110, 93,105, 45, 47, 47,207,148, 74,165,141,204,204,204,254,191,169,195,205,
- 13,121,121,121,162,209,104,196,198,141, 27, 75, 92, 93, 93, 45,204,204,204, 76, 46, 79, 66, 8,114,114,114,224,229,229,133,146,
-146, 71,211,124,149,150,150,194,217,217, 25, 6,131, 1,162, 40, 66,167,211,193,210,210, 18,117,117,233,160,148,106, 1,124, 88,
- 69,187,213,136, 17, 35,182,110,223,190,221,239,196,137, 19,184,114,229, 10, 28, 29, 29,241,213, 87, 95, 37, 36, 37, 37,189, 74,
- 41,189,246,119, 84,218,252,252,252,221,145,145,145,237, 90,181,106,245,248,234,208,181,107, 87,210,181,107, 87,199,170, 33,253,
-252,252,124,220,190,125, 27, 17, 17, 17, 48, 26,141,184,119,239,158,160,209,104,182,213, 82,150,114, 31, 31,159, 13,179,103,207,
-182,228,121, 30, 18,137, 4, 50,153, 12, 60,207, 67,169, 84, 62,142,212,166,164,164, 96,232,208,161, 54, 43, 87,174, 92, 79, 8,
- 9,160,148, 26, 94,164,139, 66, 89, 81, 17,127,242,114,169,179,157,133,239,237,251,215,215,119, 8,174,184, 78,220,191,190,142,
- 87, 89,120, 93,185,114, 91, 99,213, 70, 85,196, 91, 58,214,174,179,239,100,238, 71, 6,253,181, 62, 71, 78,220, 29,250,225, 7,
-111, 43,124, 26,248,103, 95,184,113,215,167,189,241, 67,206, 66, 5,148,107,129,130, 98,224,126,178, 68,244,105,224,159,125,237,
- 70,140, 98,217,138, 53,254,234,114,253,222, 67,231,139,142,212,166,157,150,150,166,245,240,240, 24,242,225,183,230, 17,163, 70,
- 75, 20, 10,149, 61, 74, 11, 98,225,227,227,129, 87,134,116,192, 15,191, 30,131,141,173, 29, 92, 92, 92, 64, 8,177,168, 71,246,
-201,165,147, 55,223,124,253,141,137,109,123,189,212, 79, 56,122,236, 16, 78, 30,221,115,101,195,138, 89,123, 12,210, 82, 11, 78,
- 40, 51,243,242,116,189,147,152,240,224,181,206, 93, 95,130,202,204, 60, 0, 8,174,246, 46, 30,234, 75, 94, 7, 7,111,136, 72,
-225, 56,168, 94,127, 99, 66,251,222,125, 7,241, 71, 15,239,195,209, 3,155, 46,207,153,218,224, 80,194,237, 45,242, 75, 87,211,
- 84, 67,134, 79, 46, 60,120,242,158,254,229,249,190, 15,220, 27, 54,211,176, 91, 83,149, 7, 72,169, 52,155,215,233,188, 60,123,
-247,150,168,147,147,101,150, 46, 46,124,229, 67, 90,213,135,234, 39, 35, 88, 28,199, 1, 28, 39,154,162,105,106, 90, 52, 26, 13,
- 68,160, 90,147, 65, 42, 53,251,246,149,168,211,210,100, 57,249,249, 13, 26, 52,104,240,167,109,140, 70, 35,242,243,243, 31,191,
-138,138,138,160, 82,169, 80, 96, 52,186,152,146,206,206, 77,154,108,252,118,217,178,143, 86,255,250,235,227,166,158,210,210, 82,
-148,148,148,160,184,184, 24, 28,199,225,147, 25, 51,148, 51,230,207,127,119,128, 84, 58,173, 62,229, 89,249,176,206,113, 28,164,
- 82, 41,146,147,147, 31,191, 82, 82, 82,160, 82,169, 64, 9, 17, 89,141,124, 14, 6,171,178,147,123, 93,230,170,242,189, 68, 34,
- 49, 45,220, 91,241, 36,240,188, 34, 88,229,229,229, 39,206,159, 63,223,166,119,239,222,210, 75,151, 46,193,205,205,237, 63,154,
- 9,165, 82, 41, 8, 33, 48, 55, 55,199,225,195,135, 13,229,229,229, 39,234, 56,137, 78,158, 60,121,178,229,244,233,211,101,227,
-198,141, 67, 84, 84, 20, 38, 77,154,132,194,194, 66,148,148,148, 32, 63, 63, 31, 26,141, 6,109,218,180,129, 74,165, 66,108,108,
-172, 81,163,209,212, 53, 85, 1,205,201,201, 41,115,114,114,114,123,242, 31,195,135, 15,119,249,233,167,159,212,247,239,223, 55,
-118,232,208,193, 26, 64,189, 12,235,214,173, 91, 31, 31,179,152,152, 24,172, 90,181,234,113, 63,132, 27, 55,110, 96,233,210,165,
- 16, 4, 1,245,237, 51, 75, 41,189, 22, 22, 22,198, 27, 12, 6, 4, 6, 6,194,195,195, 3, 26,141, 6, 43, 87,174,228,255, 42,
-115,101, 74, 4, 75,171,213,238, 26, 59,118,236,140, 91,183,110,185,201,229,242,202,208, 53, 68, 81,132,193, 96, 64, 82, 82, 18,
-238,221,187,135,216,216, 88,228,229,229,129, 82, 10,189, 94,143, 27, 55,110, 20, 25,141,198, 29, 53,233, 58, 57, 57,125,190,118,
-237, 90, 87, 51, 51,179,255,152, 88,183,242,162, 83,217,244,234,236,236,140,174, 93,187, 58,159, 58,117,234,115, 0, 95,252,211,
- 47, 4,149, 51,180, 83, 17,177,246,246, 22,226,228, 73,111,202, 27,134, 24, 30,196,222,187, 42,220, 60,187,178, 57, 0,168, 44,
-188,174, 52,108,212, 34,250, 92,164,165,216,255,245, 79,154,229,231, 79,148, 16,138, 70,132, 34,239,201, 25,223, 43,234,143, 8,
-224, 80,155, 0,251,243,251,126, 63,241,227,204, 15,223,190, 58,123,246, 76,103,173,190, 92, 21,236, 35,112,192, 35,115,117, 41,
-202, 66,187, 96,193,219, 87, 23, 47,219, 40,166,196, 25,166, 93,137, 43,172,113,132,111, 85,211, 98,167,132,202,213,127, 90,134,
-111,195,238, 13,238, 92,254,133, 56, 90, 75, 96, 21, 50, 0,125,251,188,132,227, 39,207, 35, 57, 83,131,156,156, 28, 0,168,117,
-218,131, 16, 31,140,169,212, 36, 28, 84, 99,198, 79,232,220,183,239, 32,122,232,143,223,249,125, 59, 55,157,223,186,109,233, 14,
- 78, 46,151, 26, 68,107, 61,145,104,139, 4,137,109, 84,121,113,193,163,136,167, 84,110, 93, 75,251,128,119,116,212,253, 70,161,
-161,193,174, 99,198, 79,180,233,215,119, 48, 61,116,104,159,184, 99,243,198,211, 59,190,107,188, 89, 52,150,200, 51,147,212,202,
-226, 82, 99, 49,149, 40,108,203, 74, 69,117,182, 54, 64,235,126,121,184, 1,195,217,205,233,241,125, 64,167, 75, 43, 75, 77,117,
-179,239,210, 69, 25, 59,119,174,185, 75,155, 54, 90, 66, 72,157, 6, 75, 34,145,128,162,250,185,202,158,212,172,143,193,162,132,
- 84, 59,248, 72,208,233, 82,203,146,147,221, 28,187,116, 81,197,125,241,133,121,117, 81,251,252,252,124, 20, 20, 20,252,201, 96,
- 85, 92,107, 76, 74,231,146, 15, 62,184,220,106,220,184,130, 75,151, 46,185,180,107,215,142,148,148,148, 60, 54, 87,149,239,157,
-156,156,136,119,131, 6, 86, 39,210,211,253,231,153, 88,158,166,228,157,227,184, 26,203,147,241, 12, 17, 44, 83, 13,150, 9, 55,
- 71,163,209,104,132,179,179, 51,242,242,242, 32,138, 98,141, 7,210,204,204,172,178, 13,184,214,145,116,165,165,165, 43, 22, 44,
- 88, 48,165, 91,183,110,142,193,193,193,200,205,205,133,179,179, 51, 36, 18,201,227,116, 85,234, 69, 70, 70, 98,251,246,237, 37,
-165,165,165, 43,234,200,247,242,159,127,254,249,221,126,253,250,217, 59, 57, 57,193,206,206, 14,119,238,220,129,173,173, 45, 74,
- 75, 75, 17, 19, 19, 3, 43, 43, 43, 16, 66,160,211,233,112,246,236,217, 82, 81, 20,151,215,113, 98,210, 11, 23, 46, 24,204,205,
-205,239,228,231,231, 75,242,242,242, 36, 21,211, 51,200,138,139,139,101, 71,142, 28,113,180,177,177, 81,159, 58,117, 42,215,219,
-219, 91,146,152,152, 40,209,235,245,117,186, 44, 66, 8, 62,248,224, 3,200,229,114,232,116, 58,172, 88,177, 2, 31,126,248, 33,
-164, 82, 41,244,122, 61,190,249,230, 27,124,246,217,103,143, 13,243,129, 3, 7,234,107,178, 96, 52, 26, 97, 48, 24, 96, 48, 24,
- 96, 52, 26,255,210, 10,105,138,193,162,148,102, 17, 66, 6,180,106,213,234,216,190,125,251, 28,172,173,173,145,145,145,129,220,
-220, 92,100,103,103, 35, 39, 39, 7,165,165,165,208,233,116,176,181,181, 69,114,114, 50,142, 29, 59, 86, 82, 86, 86,246, 82,109,
- 35, 8, 37, 18,201,216,206,157, 59, 75,159, 76, 3,199,113,143,235,147, 76, 38,131, 66,161, 64,122,122, 58, 58,119,238,172,136,
-136,136, 24,251, 34, 24,172,202, 25,218,195,194, 66,156, 6, 12, 26,109,104,217,186,119, 89,196,181,227,105,150, 34,137,239,212,
- 38,124, 11, 0, 92,185,173,177, 58, 23,105, 41, 54,109,209,147,244, 31,160,105,182, 97,221,106, 69,116, 84,180,111,104,120,104,
-173, 51,250, 59,122,138,131,123,119,111,144,105,109, 65,164, 11, 22, 44, 62,176,118,221,175,173, 47, 29,252,255,105, 26, 22, 44,
-120, 52, 77, 67,239,238, 13,248,232,152, 7,131, 1,108, 50,213,180, 12, 24,208,251,230,218,245,219,145, 30,123,192,125,249, 71,
-102, 10,228,231, 0,230, 45,208,185,165, 3,174,175,185,135,219,183,111,103,137,162, 88,123, 83, 46, 7,239,200,200,232, 70, 97,
-225,161,174,175,143,159, 96,211,175,223, 96, 28, 58,180, 31,191,173, 95, 29,209,206,182,249,218,228,107,121, 18,143, 70,118,114,
-115, 91,133, 92, 42, 87, 73,229, 82,121,158,193,248, 40,186, 46,149,203,172,129, 17, 98, 69,235, 80,181, 76,154, 56,218,166,123,
-175,193,248,163, 66,115,118,179,225,107,124,165, 33,164,205, 71, 75, 38,251,250,248,250,148,171,179, 75, 56, 78, 97,208,234, 68,
-171, 37,107,146,190,141,143, 27, 27,127,115,196,136,101,108, 20,225, 99,238,252,214,175, 95,235,247,226,226,228, 78, 29, 59,154,
-101,156, 62,109,254,100, 19, 97,117, 6, 75, 42,149, 2, 28,199,155,162, 73,142, 31,231, 0, 64, 46,151,215,248, 96, 47,151,203,
-161, 86,171,193, 19, 82,237, 6,114,224,206,111, 3, 6,180,121, 47, 46, 78,102,223,173,155,185,211,173, 91, 41,137,137,137, 65,
-205,155, 55,135, 32, 8,127,138, 92, 85,190,180, 90, 45,244,122, 61, 84, 74,101,164, 41,233,204, 62,123, 86,251,217,248,241, 95,
-188,251,206, 59,223,109,223,177, 67,101,109,109,141,146,146, 18,148,150,150, 62,126,233,116, 58,180,108,213, 74,182, 41, 38,102,
- 12,128, 57,166,148,167, 75,183,110,234,186,174,201, 21,134,149, 53, 17,214, 3,174,174, 8,214,179, 76,211, 64, 8, 9,127,226,
-243,103,125,251,246,213, 38, 36, 36,192,203,203,235,177, 73,169,250,155,214,214,214,176,181,181, 69,116,116, 52,214,174, 93,171,
- 33,132,124, 86,155,102, 65, 65, 65,169, 86,171, 29, 57,106,212, 40,141, 76, 38, 67,163, 70,141, 30, 55,235, 80, 74, 31,247,189,
-138,140,140,196,216,177, 99,213, 90,173,118,228,147,115, 96, 61,169,153,148,148, 84, 92, 94, 94,254,218,232,209,163,213,247,239,
-223, 71,167, 78,157,112,235,214, 45,148,151,151,163,172,172, 12,137,137,137, 8, 13, 13,133,193, 96,192,174, 93,187,212,229,229,
-229,175, 37, 37, 37, 21,215,166, 89, 90, 90, 58,240,235,175,191,150, 28, 58,116,200,215,221,221, 61,172, 85,171, 86,193,221,187,
-119, 15, 24, 58,116,168, 79,191,126,253,220, 26, 54,108,168,237,221,187,183, 83,223,190,125,157, 36, 18,137, 44, 46, 46, 46,147,
- 82,218,183, 54,205,170, 6,224,193,131, 7, 48, 24, 12,255,209,231,170,114, 52,161, 32, 8, 38, 29,163,234, 76,118,165,177,170,
- 52, 90,117, 93,247,171,211,228, 56,174,206,155,133, 66,161,168,140,112,210,186, 52, 41,165,183,238,221,187,215,171,125,251,246,
- 55,199,142, 29, 91,154,146,146, 2,185, 92, 14, 15, 15, 15,248,248,248,192,194,194, 2, 5, 5, 5,216,181,107,151,250,240,225,
-195,145, 37, 37, 37, 93,159,156, 3,235, 73, 77,142,227, 18,171,187,184, 74, 36,146,255, 48, 88,149, 43, 5,112, 28,151, 88,159,
-242,124, 74,211,249, 95,211,156,248,246, 24,251,254, 3, 7, 91,237,223,191, 95,181,106,213,154,232, 78,157, 38,108,180,116,123,
-247,136,165,219,187, 71,218,180,123,107,203,247, 63,175,127,184,247,247,223,205,250,247, 31,106, 51,121,194, 24,119, 16, 34,173,
- 75,211, 92,169,108,211,185,109,195,162,179, 23,206,242,139,151,109, 20, 58,116,234,119,229,187,239,127,222,241,221,247, 63,239,
-232,208,169,223,149,197,203, 54, 10,103, 47,156,229, 59,183,109, 88,100,174, 84,182, 49, 37,157,147, 38,142,182,233,223,111, 48,
- 14, 30,220,203,111,221,184,226,155,253,103,244, 93,134,207,208,102, 39, 63, 60, 73,145,245, 37,156, 21,231,145,146,146, 82,204,
-243,124,183, 39, 59,184,215,164, 57,121,194,232,170,230,234,108,116, 34,126, 93,125,243,166,240,211,248,185,198, 45, 71,247,106,
- 14, 70,220, 44,137,184,158, 82,152,251,176, 56,190,188,180, 68, 47,138, 34,168, 40, 72,230,205, 3,169,237, 24,117,232,208, 21,
-167,142,111,193,198,117,191, 20,139, 34,180,195,119,238, 20, 70,252, 52,151,250,248, 52,240,217,188,121, 11, 25, 48,112,136, 13,
-165, 16, 7, 14, 25,108,187,117,243, 86,226,231,231,215,192,223, 31,242,127,122, 93,122, 94,154,115, 40, 45, 44, 73, 78,142,184,
-182,114,165,222,101,228, 72,123,133,139,139, 53, 68,145,212,213, 7,235,201, 8, 86,109,154, 46,246,246,233, 71,143, 30, 69,163,
- 70,141,224,225,225,241,167, 22, 25,153, 76, 6,111,111,111, 56, 57, 57,225,216,177, 99,160,192,245,234, 52,103, 82, 90, 84, 20,
- 31,127,230,202,146, 37, 58,151,225,195,237,154,249,249, 93,255,110,229, 74,189, 32, 8,143,163, 86, 85,255, 22, 22, 22, 66, 16,
- 4,156, 62,117, 74, 95,166,209,172,173, 45,157, 55,126,248, 65, 87,153,247, 54, 90,109,249,144,150, 45, 23,141, 25, 51,198,144,
-152,152, 8, 65, 16, 80, 53,146,149,147,147, 3, 43, 43, 43,104,180, 90, 79, 23, 23, 23,115, 83, 52,115, 14, 29,178, 68, 29,215,
-117,137, 68,242,167, 38,194,191,226,184,255,171, 34, 88, 60,207,195,203,203,235, 79,243,140, 84,118, 28,172,140, 12,153, 24,185,
- 2, 0,164,167,167,111,114,113,113, 57, 58,102,204,152, 47,154, 53,107, 54,105,218,180,105, 18, 63, 63, 63, 20, 23, 23,195,206,
-206, 14, 78, 78, 78, 72, 74, 74,194,238,221,187,133,162,162,162,159, 5, 65,152,159,157,157,157,107,130,238,105, 15, 15,143, 1,
- 47,189,244,210,246,119,223,125,215,166, 75,151, 46,178,202, 27,224,221,187,119,113,232,208, 33,195,182,109,219, 74,180, 90,237,
- 72, 83,102,113, 7,128,204,204,204, 99,110,110,110, 47,143, 27, 55,110,243,208,161, 67,173,180, 90,173, 44, 33, 33, 1,122,189,
- 30, 60,207,163,160,160,192,112,230,204,153, 50,181, 90, 61, 58, 51, 51,243,152, 9,122, 55, 8, 33,161, 6,131, 97,236,205,155,
- 55,191,124,249,229,151, 29,218,183,111, 47,231,121, 30,231,207,159,207,109,222,188,185,115, 73, 73,137,225,194,133, 11,249, 90,
-173,246,179,140,140,140,141, 38,174, 81,133,146,146, 18, 56, 58, 58, 66,171,213, 66, 20, 69,232,245,122, 88, 89, 89, 61, 94,222,
-136, 82,250,232,228,120,138, 7, 98,158,231, 37, 70,163, 17,163, 70,141,130, 40,138, 88,177, 98, 5,120,158,151,212, 87,199,210,
-210,242,122, 84, 84,212,128,176,176,176,199,233,225, 56, 14, 28,199, 65,169, 84,194,209,209, 17, 14, 14, 14, 56,113,226, 4, 56,
-142,187,110, 98,116,237, 54,128, 22,132,144,246,183,111,223,126, 29, 64, 83,131,193,224, 41, 8, 2,225, 56, 46, 83, 16,132, 59,
-101,101,101,107, 77, 93, 42, 39, 39, 39,231,203,177, 99,199, 54,223,186,117,171,165, 84, 42,125, 92, 94, 28,199, 65, 46,151,195,
-209,209, 17, 42,149, 10, 1, 1, 1,208,104, 52,248,252,243,207, 75,212,106,245,151, 47,210, 5,161, 83,135,206, 56,117,100,139,
-249,198, 13,191,149, 10, 2,184,138,169, 24, 30, 29, 67, 71, 32, 63,127,162,100,195,186,213, 10,149, 84,107,215,169, 67,103,147,
-154, 86,244, 6, 62,127,228,155, 63,123, 85, 44,149,243,101, 98, 82,242,242, 45, 63,191, 21, 15, 0,203, 86,172,241, 79,137, 51,
- 76,139,142,121, 48,120,213,154, 51,109,244, 6,222,164, 5,112,255,223,180,108, 46, 6,133, 54, 61, 61,253,138,167,167,167,111,
-167, 55, 12,159, 53,106, 64, 6,101,231,139,233,132,144,169,233,233,233,241,166,230,189,125,251, 46, 56,115,124, 43, 54,174,223,
- 92, 76, 68,104, 43,141,254, 46,128,238,154, 27, 65,129,136,202, 77,203, 39,191,140,121,159,125, 50,233,195,146,210,226,111,127,
-250,145,138,115,107,233,231,222,164,105, 91, 52,105,218, 22, 83,166,126,106, 19, 26, 22,236, 13, 0, 59,119, 82, 33,220,143, 28,
-248, 98,254,220, 65,243,191,152,139, 18,181, 14,149,203,234,196,220,143,254, 35, 46,158,234,159,247,160,161,127, 50, 95,240,252,
- 21,124,252,113, 67,109,113,177, 83,199, 25, 51, 28,165, 75,150,112,149, 15,208, 79, 70,176, 30, 71,175,234,161,121,228,228,201,
- 63, 62,254,232,163,244,165, 75,150,244, 94,252,245,215,102, 33, 33, 33,200,202,202, 66,112,112, 48, 60, 60, 60,112,254,252,121,
- 28, 59,124,184,188, 76,163,249,204,213,213,117, 85, 77,154,115, 40,189,242,165, 92, 30,160, 47, 47,119, 89,186,110,221,195,238,
- 61,123,102,175, 93,187,214,179, 79,159, 62,156, 90,173, 70,113,113, 49,138,139,139,161,211,233, 32,151,203,145,145,158, 46,166,
-165,167,223, 73, 73, 73, 89, 91,107, 58,167, 79,111,168, 46, 40,112,234, 56, 99,134,163, 49, 63, 95,245, 97, 82, 82, 26,183, 97,
-195,215,147, 38, 78,252,104,218,244,233, 74, 79, 79, 79,162,211,233, 30, 27, 45,163,209, 8, 51, 51, 51, 35,207,243, 14, 0,212,
-166,104,170,254,248,131,207,207,207,135,189,189,253,227,105,151, 56,142,131, 74,165,130,157,157, 29,202,202,202, 64, 41,155, 0,
-183, 94, 15, 10, 53,221,116,131,131,131,175, 75,165, 82,207,170, 33,194,234,214,182,171,250,158,231,249,180,200,200,200,150, 85,
- 29, 46,165,180,218,208,167,167,167,167,191, 40,138, 95,181,111,223,254,229,183,223,126,155, 68, 68, 68,224,228,201,147, 52, 61,
- 61,125, 23,199,113,159,165,165,165,197,215,244,100, 83,147,166,189,189,189,149,149,149,213, 7, 22, 22, 22, 61, 43,167, 98, 80,
-169, 84,119,203,203,203, 79,148,150,150,174,168,105,246,246,218, 52,253,252,252,172, 69, 81,124,223,194,194,162, 87, 94, 94, 94,
- 51, 0,112,116,116,188, 85, 94, 94,126,156,227,184,149, 53, 45, 32, 93,155,166,187,187,187,153,165,165,229,151,246,246,246,175,
-189,253,246,219, 14, 17, 17, 17,153,183,110,221,146,151,148,148,108,225,121,190,198,197,158,171,211, 12, 13, 13,253,211, 90,132,
-207,243, 24, 1, 64,211,166, 77, 15, 14, 28, 56,176,255,107,175,189, 6,163,209,136,159,127,254, 25,199,142, 29,251, 35, 54, 54,
-118, 64,109, 79,159, 79,106,186,186,186, 58,122,120,120,156, 25, 61,122,180,207,144, 33, 67,204,109,108,108, 32,145, 72, 80, 94,
- 94,142,248,248,120,220,189,123,151, 30, 59,118,172, 44, 58, 58, 58, 77,163,209,116,205,202,202,202, 51,181, 60,159,229, 41,249,
- 73, 77,153, 76,214,197,203,203,107,219,156, 57,115,172,122,245,234,101,230,224,224, 0,169, 84, 10,158,231,145,157,157,141,200,
-200, 72, 28, 58,116,168,124,231,206,157,229,249,249,249,163, 40,165, 17,127, 71, 58,159,183,102,229, 76,238, 85,183, 9, 9, 13,
-137,190,151, 64, 23,253,169,190,249,145,233,209, 81,209,141,171, 70,174, 42,103,114, 55, 53,157,253, 59,217,245,123,121, 72,171,
-158, 0,176,123,223,181, 19,127,156, 43, 60, 84,143,116,206,142,142,186,255,196, 98,211,193, 49,209,241,116,193, 83,231,221,143,
-124, 17, 25, 25,253, 39,205,240,240,208,152,123,137, 88,104,162,209, 23,171, 61, 55, 43,251,139,253, 41, 36,140,148,232, 68,186,
-169,202, 54, 3, 6,191, 60,180,255,167, 51,103,225,171,197,139,176,127,247,222, 63,162, 19,233,193,127,114, 93,250,171, 52, 43,
- 23, 39, 54,119,115,235,188,213,209,113,214,209,227,199, 45, 43,251,215, 86,246,145,124,114,192, 85,243,230,205,115,110,221,186,
-229, 98,138,230,128,239,191, 55,104,173,172,148,139,127,254,185,139, 90,175,239,242,225,135, 31, 74,175, 95,191,142,109, 91,182,
-240,154,212,212,205, 89,130,240,126,117,173, 31,213,229,253, 75,185,188,141,202,193,161,107,195, 89,179,148,139,183,111, 31,231,
-225,233,233, 50, 96,224, 64,185, 84, 42, 69,121,121, 57, 50, 50, 50,112,225,252,121,109,114, 74, 74,164, 86,171, 29,154,154,154,
-154,105,106,222, 7,124,255,189,193,214,223, 31,150, 46, 46,226,185, 11, 23,108,103,204,153, 51,201,197,205,205,166, 99,167, 78,
- 50,115,115,115, 20, 22, 22, 34, 37, 37, 5,231,206,157,203,137,143,143,119,167,148, 10,166,104,254,126,247,110,147, 83, 87,174,
- 12,255,248,227,143, 21,193,193,193,176,178,178, 66, 73, 73, 9,238,221,187,135, 11, 23, 46,232,182,111,223, 94, 92, 94, 94, 62,
- 41, 53, 53,245,247,191,234,184,255,107, 12,214,127,235,196,115,117,117,109,201,113,220,236,138,230,168, 5,117,173,233,247, 34,
- 93,116,220,220,220,188,237,236,236, 86,107, 52, 26,170,211,233, 38,102,102,102,166,252,175,165,147, 16, 34,109,217,178,229, 79,
- 57, 57, 57,237, 41,165,176,177,177,185, 24, 21, 21,245, 14,165,148,175,175, 38, 33, 68,226,234,234,218,222,194,194,162,141,133,
-133, 69, 23,131,193, 16, 82,209, 15,239,158, 90,173,142, 48, 26,141, 87,178,178,178, 46, 82, 74,133,191, 51,239,132, 16, 9,128,
- 94,238,238,238,111,137,162, 24,200,113,156,109, 69, 83,105, 17,165, 52,182,176,176,112, 13,128,227,127,119, 58,159,167,102,152,
- 31, 25, 74, 9,130,255,180,141,136,148, 39, 59,175, 87,118,134,255,243, 69, 4,247,163, 18,232, 94, 83,211, 73, 8,225,134,244,
-112, 90, 10, 60, 26,105, 88,219,132,162,255, 97,134, 76, 48, 45,245, 54, 88, 13,200,216,234, 52,239, 37,215,190, 8,111, 93, 6,
-203, 84,194, 26,144, 46, 32,104, 47, 18, 92,185,151, 64, 79,189,136,215,186,231,169,185,136, 16,251,157, 65, 65, 23, 57,169,212,
-181,114,153, 35,194,113,162, 8, 8,224, 56,190,106,179, 96,213, 7,202,186, 52, 13, 64, 99,185, 82,233, 41,240,188, 75,190, 92,
-110,117,193,194,162,133, 14, 40,115, 21,132,217, 39,242,243, 99,234,155,206,121,132,216, 1, 8,149, 42,149,222, 23,204,205, 7,
- 22,216,217,181, 40,228,121, 23, 0,162, 82,169,140, 42, 83,171,215,166,166,166,174,121,178,165,194,148,116,202,148, 74, 47,129,
-231, 93, 8, 64, 57,169, 52,231,168, 82,233,149,235,228,244,186, 90,163,241, 81, 42,149, 70, 0, 37, 6,131, 97,116, 74, 74,202,
-201,250,104,166, 72, 36,161,119,172,172, 58, 9,214,214, 14, 6,192,194, 32,138, 6,131,209,152,170,211,233,238, 74, 36,146,111,
-211,210,210,226,254,202,227,206, 12,214,191,236,100,102,154, 76,147,105, 50, 77,166,201, 52,255, 9,154, 46, 46, 46,230, 28,199,
- 57,100,101,101,165, 87,125, 0,252,167,228,253, 69, 67,202,138,128,193, 96, 48, 24,140,127, 62,217,217,217,106, 84,211,231,138,
-241,247, 64, 0, 84, 59, 18,160, 62,206,244,105, 70, 19,212,165,207, 52,153, 38,211,100,154, 76,147,105, 50,205, 23, 79,179, 46,
-237, 23, 37, 50,198,154, 8,153, 38,211,100,154, 76,147,105, 50, 77,166,249,183,107,190,104,112,172, 8,106,172, 60, 46,132, 16,
-151,231,189, 45,227,197,174, 11,213,236,235, 65, 8,241,168,231,246,110,172,212, 25, 12, 6,227,159,205,127,189, 15, 86,229,141,
-138, 82,154,253, 60,182,123,222,251, 86,236,191,136, 16,124, 82,241,254, 27, 74,233,172,103,220,214, 36, 35, 27, 22, 22,230, 72,
- 8,233, 97, 99, 99,211,184,180,180, 52,146, 82,122,252,238,221,187,249, 48,113,121, 2,111,111,111, 95,149, 74, 53,142, 16, 18,
- 82,145,255,123, 90,173,118, 67, 74, 74, 74,226,115, 56,110, 4,192, 4,165, 82,249,138,173,173,109, 96, 97, 97, 97,172, 94,175,
-223, 9,224,151,167,153,113,218,221,221, 61, 8,192, 88, 81, 20,165, 28,199,109,205,200,200,184,109,234,190, 46,225, 67,118, 80,
-160, 33, 0, 78, 36,226,112,142,114,187, 0,136, 4,120,152, 29,185,239,149,231, 92, 95, 77,174, 11, 79, 34,145, 72, 22, 19,130,
-143, 43,222, 47, 17, 4,225,211, 58,182, 95, 70,128,247, 65, 64, 43,182,159,201, 46, 81, 12, 6,131,241, 47, 48, 88,158,158,158,
-125, 69, 81,124, 21, 0, 56,142,219,154,150,150,118,248,175,184, 89, 61,203, 77,237,137,125,151, 83, 74, 63,170,127,180, 2,159,
-136, 34,229, 30,229,147,204,112,113,113,177,151, 74,165,255, 49, 55, 21,207,243,102,132,224, 45, 81,164,164, 98,219, 79, 8, 33,
- 43,159,198,216,181,104,209,194,174, 85,171, 86,159,206,159, 63, 95,233,228,228, 68,178,178,178, 58,126,252,241,199, 45,131,131,
-131, 23,223,191,127, 63,171,174,253,253,253,253,135, 52,107,222,234,189,105, 31,207,112,113,118,112,180,226, 5,222,144,158,158,
-233,190, 98,249,215,109,253,253,253,127,138,143,143,223, 87, 31, 35, 37,149, 74, 95, 81,169, 84, 1, 90,173, 54,142,231,249, 93,
- 18,137,164,247,194,133, 11,195,251,247,239,175, 42, 46, 46, 86,240, 60, 31,184,121,243,230,233,235,214,173,235, 75, 8, 25, 92,
-199, 80,123,143, 10,195,151, 94,229,235, 87,175, 92,185,210, 67, 42,149,146,214,173, 91,155, 17, 66,166, 86,106,212,176,253, 99,
- 40,208, 48,234,252,206,198, 0, 16,214,113,196,131,168,243, 59, 81,241,254,185, 63, 12, 60, 89, 23, 44, 45, 45, 55,149,149,149,
-197,212,101,228, 43,246,253,184,202,190,159, 56, 56, 56,124,159,159,159,159, 21, 24, 24,216, 82,171,213,142, 1, 0,149, 74,245,
- 91,108,108,236,117, 7, 7, 7, 87,133, 92,254,190, 70,171, 37, 0, 8,199,145,143, 9, 33, 43,158,246, 33,129,193, 96, 48, 24,
-255, 32,131, 69, 41,125, 61, 54, 54,214, 92, 20, 69, 52,106,212,104, 12, 0,147, 13, 86,117, 55,171, 30, 61,122, 52, 55, 51, 51,
-211, 87,221, 78,163,209, 40, 8, 65,143,167, 49, 45,149,191,161,215,235, 56,153, 76, 1,137,132,251,176,105,211,166, 45,243,242,
-242, 78, 10,130,240,243,147,147, 87,154,152,110,172, 93,187, 54,196,197,197,229, 63,214, 80,201,206,206,150, 15, 28, 56,160, 94,
-122,175, 55,110,172,210,198,199,119,226,100, 50,111,131,209,232, 8, 0, 50,153, 44, 95,101,105,233,245,249,103,159,153, 91, 88,
- 88,136,249,249,249, 40, 41, 41, 33, 83,166, 76, 81, 77,153, 50,165, 23,128,141,181,105,122,121,121,249,181,104,213,230,189, 13,
-235,215,183, 41, 46, 40,208,174,249,118,213, 77,157, 84,169,246, 9, 9,146,207,158,179,208,102,254, 23,179, 38,122,121,121, 69,
-166,166,166, 38,212,145, 87, 14,192,222, 15, 62,248, 32,108,192,128, 1,138,210,210, 82,149, 90,173,110,176,121,243,230,207, 91,
-181,106,101,217,188,121,115,197,182,109,219, 72, 81, 81, 17, 40,165,230,193,193,193,116,196,136, 17,218, 29, 59,118, 76, 1,240,
- 93,125,204,178, 32, 8,178,202,192, 23,207,243,138,138,186,104, 48,197, 92, 19,224, 97, 88,199, 17, 0, 65, 96,212,249,157,170,
-176, 78, 35,180,160,136, 37,192,195,138, 7,129,183, 69, 81,244,173, 46, 61, 28,199, 37,166,165,165,253,250, 52, 39, 75,255,254,
- 3, 0, 96,181,155,155,219,217,220,220, 92, 79, 66, 48,218,212,135, 0, 66, 8,145, 74,165, 99, 1, 44,214,104, 52,111,158, 60,
-121,178, 25, 0,244,232,209, 67, 14,224, 58,165,180,253,163,172, 49, 24, 12, 6,227,223,104,176,228, 0,112,246,236, 89, 80, 74,
- 21, 79, 19, 20,168,106, 92,222,127,255,125,184,185,253,185,187, 73,102,102, 38,206,156, 57,253, 44,121,250,211, 77,234,203, 47,
-191,180,201,207,207, 31,180,118,237,218,222,174,174,174,159,103,101,101,157,169, 35,143,217,132,144,111, 56,142,204, 32,132, 64,
-161, 80, 38, 78,156, 56,241,122,197,255,252, 15, 28, 56, 96, 62,112,224, 64, 53, 33, 36, 30, 0, 20, 10,165,179, 68,194,249, 82,
- 74, 65, 41,190,169,205, 8,190,108,105,217,136, 82, 58,112,210,178,101, 66,139,126,253,164,214,206,206, 18,112, 28,114, 83, 82,
- 28, 86,255,248, 99,251,152, 99,199,148,174,193,193, 41,122,133,162,232,193,131, 7,112,115,115,131, 92, 46,175,115, 4,135,185,
-185,249,155, 31, 76,251,200,169,184,160, 80, 99, 44, 45, 53, 88,138, 2,111,173,146,145,146,220,252,162,196, 84,107,245,155,147,
-223,147,126, 49,115,250,155, 0, 62,173, 67,106,202,180,105,211, 66, 90,183,110,237,177,125,251,118, 82, 92, 92, 12,169, 84,106,
-217,172, 89, 51,180,108,217, 82, 56,121,242, 36,241,243,243, 67,120,120, 56,206,159, 63,143, 11, 23, 46,144,230,205,155,155,239,
-221,187,119, 76,117, 6,235, 73, 83, 45,145,112, 51, 71,142, 28,217,215,220,220,220,216,181,107, 87,188,253,246,219, 40, 47, 47,
- 71, 72, 72, 72,147,174, 93,187, 94, 26, 54,108,152,140,227, 72,184, 32,136,168,205, 92, 87, 54, 3, 58,135, 15,185, 3,160, 49,
- 40, 98,115, 34,247, 53,169,252,191, 40,138,190, 49, 49, 49,161, 69, 69, 69, 16, 69,241,241,154,140, 0,208,185,115,231,250,212,
-247,108, 66,200, 55, 3, 7, 14,152, 1, 16,116,239,222, 61,255,189,247,222, 19,238,221,187,215,117,216,176,161,109, 31, 62,140,
-173,241, 33,128, 82,154, 45,145, 72,150, 84,252,143,140, 27, 55, 62,219,210,210,114,168,151,151, 87, 12, 33, 68, 42,151,203, 43,
-203, 72, 18, 18, 18,226, 20, 30, 30, 62,217,206,206, 46, 71,194,113,206, 20,148, 18,194, 45, 17, 69,129, 69,175, 24, 12, 6,227,
-223, 96,176, 8, 33,121,183,110,221,114,211,106,181, 32,132,212, 25, 13,170, 58,194,160,226,134,243, 19,199,145,119, 8, 33, 8,
- 15,111,156,176, 98,197, 10,125, 53,187,233,195,195, 27, 39, 72, 36,156, 31,165, 20,132,112,171,170,222,104,106, 27,181, 80,121,
- 67, 84, 40,148,159, 0,128,155,155,123,246,193,131, 7,141,195,135, 15,199,146, 37, 75, 20, 51,103,206, 92,232,238,238, 62, 50,
- 35, 35, 35,173,166,116, 86,124,158,229,226,226, 98,191,118,237,218,144,137, 19, 39, 94, 79, 79, 79,255, 0, 0, 60, 60, 60, 86,
- 0,104, 76, 8,137,175,242, 29,126,249,229,151,150,111,190,249,230,189,236,236,236, 89, 53,105,190,108,101, 21,232,224,238, 62,
-100,233,249,243, 84,202,243,164,248,250,245,162,180,172, 44,131, 94, 16,184,195, 9, 9,109, 70,142, 31, 47,119,113,115,163,251,
-127,249,197, 71, 45,147, 81, 65,165, 42,142,138,138,162, 6,131,225,110, 93,121, 39,132, 4,219,217,218, 89,172, 89,182,234,186,
-147, 82, 66, 28,189,220,137,220,218, 86,202, 89, 90, 41,169, 68,162,241,241,114,183, 34,132, 4,215,117,140,228,114,249,152,222,
-189,123,155,111,219,182,141,132,135,135,195,214,214, 22,103,207,158,197,173, 91,183, 80, 88, 88,200,241, 60,143, 86,173, 90,225,
-155,111,190,129,151,151, 23,138,139,139,145,148,148,228, 40,151,203,157,106, 41,207, 63, 25,222, 79, 62,249, 4,206,206,206, 16,
- 4, 1,153,153,153, 40, 43, 43,131,133,133, 5,108,108,108,144,145,145,129,253,251,247,213, 89,151, 76,165, 93,187,118,106, 0,
- 73, 79, 70,176,234,163,233,225,225,113, 44, 39, 39,183, 83,183,110,221, 80, 84, 84,100,152, 51,103, 14,154, 53,107,134,134, 13,
-131,234, 76,167, 32, 8,159, 58, 58, 58,174,115,112,112, 88,246,222,123,239,185, 58, 56, 56, 64,167,211,125,150,159,159,143, 79,
- 62,249, 4, 0,208,178,101,203,198,148,210, 63,222,124,243, 77,248,250,250,166, 23, 20, 20,164,196,196,196, 76,204,201,201,137,
-124,150,188,215,231,220,100,154, 76,147,105, 50,205,255, 5,205, 23,210, 96, 17, 66, 40,165,143,154,228,170,190,175,166, 64, 11,
- 61, 60, 60,220,204,204,204, 64, 41, 45,172,239,143, 9,130, 48,197,209,209, 49,103,214,172, 89, 29,131,130,130,244, 83,166, 76,
-137, 76, 76, 76,252,172,234, 54,190,190,190, 95,254,240,195, 15,120,240,224, 65,210,162, 69,139,206,231,229,229, 45,168,231, 65,
-159, 73, 8, 89, 1, 0, 25, 25, 25,121, 7, 14, 28,104, 29, 17, 17, 49,115,197,138, 21,110, 83,166, 76, 81,188,247,222,123,147,
- 77,136,228, 64, 42,149,106,170,107, 22,172, 14, 23, 23, 23, 67,117,125,180, 42,153,216,162,133,146,138,226,144,175,207,158, 21,
-197,180, 52,237,161,245,235,177,228,194,133, 73, 54,142,142,222, 78, 78, 78,212,215,211, 51,215,140,231,179, 75,114,115,185,230,
-189,123,203,142,110,220,232,163,244,245,141,222,181,107, 87,153, 40,138,199, 76, 72, 66,153,222,104,212, 89,120,185, 27, 7, 14,
-238,221,248,238,213, 91, 15,204,236,237,185,198,173,154,133,222,143, 77,186, 65, 0, 61, 30,189,106,197,198,198, 38, 40, 47, 47,
- 15, 37, 37, 37,112,114,114,194,202,149, 43,225,226,226, 2,181, 90,141,168,168, 40,234,233,233, 73,206,157, 59, 7,119,119,119,
-228,230,230, 66,175,215, 67,173, 86,231,232,245,122, 77, 77,134, 87, 42,149,174,225, 56,242, 54, 33, 4,129,129, 13,179,191,251,
-238, 59, 35,165, 20,193,193,193, 24, 58,116, 40,206,158, 61,139,168,168,168,202, 40,147,209,215,215, 47,155,227,136,243,163,221,
-107,143, 8,214, 70, 69,196, 42, 41, 35, 35, 99,214,211,236,239,233,233,169, 18, 4, 97, 82,163, 70,141, 6,188,250,234,171, 6,
-185, 92, 14,181, 90, 93, 89, 22,134, 62,125,250,228, 15, 28, 56,192,225,143, 63,254,168, 53,157,121,121,121,241, 33, 33, 33,111,
-127,244,209, 71,191,173, 90,181,202,246,211, 79, 63,125,188, 8,183, 32, 8, 16, 69,241,113,148,109,239,222,189, 72, 76, 76,252,
-170,170,185, 98, 48, 24,140,127, 11,166,122,145,127, 92, 4,235,191,149, 25,137, 68,242,203,177, 99,199,154,117,238,220, 89,218,
-163, 71,143,112, 79, 79,207,240,180,180,180,200,138,155, 90,120,159, 62,125,194,157,157,157,177,114,229, 74,181, 68, 34,249,229,
- 41,157,117,213,155,221, 37, 15, 15,143,217,123,246,236, 89, 59,113,226, 68,184,184,184, 52,251,111, 23,114,225,131, 7, 29,198,
-205,159, 47,170, 0,201, 31,191,253, 70, 23,158, 63,255,245,142,157, 59,229,254,254,254,160,148, 34, 41, 41,201,250,231,181,107,
-237, 71,246,234, 21,149, 85, 94, 78,226,178,178,132,232,131, 7,185,124,142,251, 62, 62, 62,190,206, 72,161,193, 96,184,150,146,
-156, 28,212,161, 83, 7,183,179,215,163,111, 14, 27, 50,160, 27, 39,229,184,196,228,204,107, 78, 14,246, 22, 23, 46,158, 47, 49,
- 24, 12,215,234,210, 41, 47, 47, 79,228,121,222,158, 82,234,116,230,204, 25, 56, 58, 58,162,176,176, 16, 70,163, 17, 6,131, 65,
-175, 86,171, 85,247,239,223,135, 78,167,131, 78,167,131,181,181, 53,238,222,189,155,205,243,252,169,154, 52,121,158,159, 64, 8,
-153, 79, 41, 69, 76, 76, 76, 58, 0,184,187,187, 55,180,181,181,221,194,243, 60, 50, 50, 50,112,230,204,153,209, 25, 25, 25, 15,
-170,212,197, 90, 59,185,155, 88, 7,158,250,120, 57, 59, 59,135, 91, 88, 88,204,154, 58,117,170, 75, 88, 88, 24,180, 90, 45, 0,
-192,210,210, 18,106,181, 26,214,214,214,104,223,190,253,189, 5, 11, 22, 24, 40,197, 56, 74,105,173,131, 16,238,221,187,151, 27,
- 20, 20, 52,117,226,196,137,243,130,130,130,252, 40,165, 8, 12, 12, 68,239,222,189,113,232,208, 33, 60,124,248, 16,229,229,229,
-194,213,171, 87,183,165,166,166, 30,100,151, 89, 6,131,193, 76,214, 11, 18,193,170,184, 33, 17, 66, 8,253,171,127, 48, 59, 59,
- 59,215,211,211,243,200,141, 27, 55, 6,188,242,202, 43, 56,115,230,204, 56, 0,211, 1, 64,169, 84,142,123,229,149, 87,112,227,
-198, 13,220,191,127,255, 72,118,118,118,238,115, 58, 96,106,189,254, 81, 0, 71,165, 82,153,213,243, 70,237, 95,209, 52, 8, 74,
-169,127, 77,223,213, 17, 13,243,110, 55,116, 40, 87,118,235, 86,209,252,163, 71, 63,216,186,103,143,220,203,203, 11,165,165,165,
-144, 72, 36,176,182,182, 38,189,251,245,179, 91,179,117,171,171,151,149,213,133,201,227,199,199,124,117,252,184,250, 66,113,177,
- 73,211, 43,104,181,218,181, 95, 46,152,221,237,183,205, 59,130, 27, 5, 7,218, 29, 58,118,250,166,131,131,181,153,175,175,191,
-178,184,168, 72,247,195,138, 37,210,242,242,242,117,117,233,104, 52,154,189, 39, 79,158, 28,226,229,229,229, 20, 25, 25, 9,189,
- 94, 15, 65, 16,208,179,103, 79, 80, 74,149, 0, 68,169, 84,138,123,247,238,193, 96, 48,228, 60,124,248, 48, 61, 46, 46, 78, 9,
- 96,113, 29,101,248, 39,163,196,113,220,200, 1, 3, 6,128,231,121,244,238,221, 27,251,246,237,123, 5,192,188,154,182,127,134,
- 8, 86, 3,119,119,247, 69, 21,191,105, 82,231,118, 55, 55,183,142, 65, 65, 65,243,150, 46,253,134,184,184,184, 65, 16,120, 24,
-141, 6,228,230,230,163,180,180, 20,161,161,161,240,246,246,198,226,197,139, 1, 96, 95, 93,230,170,146, 7, 15, 30,196, 2, 24,
- 53,126,252,120,249,217,179,103, 91,106,181,218,229,189,122,245,194,205,155, 55,113,251,246,237,215,156,157,157,115,188,188,188,
-120, 15, 15,143,183, 9, 33,214, 42,149,106,107,108,108,108, 58,187,220, 50, 24,140,127, 19,255, 45, 47,242, 95, 53, 88,117,101,
-204,197,197,197,188,164, 40,255,125, 95, 95, 95, 21, 0, 40,229,146,238,142,142,142, 95,229,229,229,149,213,247, 71,213,106,245,
-142,205,155, 55,191,244,237,183,223,202,251,245,235, 23,224,233,233,217, 26, 0,134, 13, 27, 22, 96,101,101,133,205,155, 55, 27,
-212,106,245,142,231,149, 73, 81, 20,123,183,106,213, 10, 5, 5, 5, 72, 74, 74,186, 94,159,125, 15, 28, 56, 96, 14,160,113, 93,
-223,213,134,222,104,116,178,118,115,147,102,159, 61,107,208,240,188,119, 80, 80, 16, 74, 75, 75,161, 80, 40,160,211,233,144,152,
-152, 8,185, 92, 78, 30, 38, 36, 56,206,156, 62,253,156, 89, 80,144,101,229, 8, 67, 83,200,200,200,208,184,187,187,191,183,240,
-203,133, 91,150, 46, 89,226, 92,144, 95,248, 64,174, 48,211,154,155, 41,237,103,124,180,128,102,103,103,127, 88,177, 70, 85, 93,
- 44,222,178,101, 75,159,151, 94,122,233,142,151,151,151,115, 94, 94,158,107, 73, 73, 9, 45, 40, 40, 32,120,212,151,138, 0,192,
-157, 59,119,144,156,156,204, 11,130,112, 14,192,124, 74,169,222,212,180,122,122,122,218,181,110,221,186,143,131,131,195,227,166,
-200,230,205,155,247,241,244,244,252, 62, 45, 45,173,240,121, 86,238, 99,199,142,153,139,162, 24, 10, 0,125,250,244, 49,213,140,
-191, 62,114,228, 72, 98,102,102, 1,158,231,161, 84,202,161, 84, 42, 97,105,105, 13,123,123,123, 36, 39, 39,163,123,247,238, 98,
- 66, 66,194,126,115,115,243,245,245, 77,211,233,211,167, 7,181,110,221,122,250,228,201,147, 97, 52, 26, 49,100,200, 16,164,167,
-167, 47, 77, 76, 76,220,238,234,234, 58,250,179,207, 62,115,116,112,112,192, 39,159,124, 98, 6, 96, 46,187,220, 50, 24, 12,102,
-178, 94, 0,131, 85,203, 77,177,149,179,179,243,148,156,156, 28, 85,101,211, 11, 33, 68,213, 52, 32,224, 23,119,119,247,159, 50,
- 50, 50, 46,212,231, 71, 11, 11, 11, 75,220,220,220,246, 95,186,116,105,196,176, 97,195,112,252,248,241,177, 21, 6, 11,151, 46,
- 93, 66, 66, 66,194,254,194,194,194,146,231,145, 65, 15, 15,143,151,187,117,235, 54,182,117,235,214, 56,112,224, 0, 4, 65, 56,
- 85,159,253,171,142, 24,172,110, 20, 97,229,119,166,104, 41,148, 74,177,178,255,141, 68, 34,129, 86,171, 69,102,102, 38, 98, 98,
- 98, 96,109,109,141,194,130, 2, 98,109,111,111,208,233,116, 66,125,243,153,145,145,145, 22, 20, 20, 20,167,209,106,101,118, 14,
-246,106, 43, 11, 5, 45, 41, 45,229,238,220,185,153,153,157,157,157,100, 98,165,214, 19, 66,186, 28, 61,122,244, 11,137, 68,242,
-138,135,135, 7, 70,140, 24, 65,122,244,232, 1,133, 66, 1,141, 70,131,162,162, 34, 28, 56,112, 0, 60,207,251, 1,128,147,147,
-147, 75,131, 6, 13,118,115, 28,151,157,144,144,240,102, 93,191, 33, 8,194,176,193,131, 7, 75,141, 70, 35, 22, 44, 88,128,185,
-115,231,162,111,223,190,210,107,215,174, 13, 3,240,235,115, 60, 65,241,210, 75, 47, 61,238,228, 94,181,115,123, 77,116,237,218,
- 85, 42,145, 72,252, 61, 60, 60,144,148,148, 4,115,115,115,184,184,184,192,214,214, 22,142,142,142,248,246,219,111,177,124,249,
-242,219, 18,137,100, 85, 70, 70, 70, 92,125,211,228,237,237,253,246,152, 49, 99,222, 30, 49, 98, 4, 74, 75, 75,113,233,210, 37,
-116,232,208, 1,139, 22, 45,114, 61,127,254,252,180, 86,173, 90, 65, 42,149, 34, 34, 34, 2,130, 32,164,178,203, 44,131,193, 96,
-252,195, 13, 86,213,246,206,170,239,237,236,236,172, 85, 42,213,196, 1, 3, 6,116, 28, 50,100, 8,122,247,238,253,167,157, 87,
-174, 92,105,121,230,204,153, 25, 30, 30, 30, 93, 0,172, 74, 79, 79, 47,168, 71, 84,105,239,150, 45, 91,250,181,107,215,206,188,
- 91,183,110,254, 0,160, 84, 42,245, 91,182,108, 81,139,162,184,183,190, 25,121,114,210, 71, 79, 79,207, 86, 18,137,100,220,192,
-129, 3, 91,189,241,198, 27,136,138,138,194,230,205,155,239, 5, 5, 5, 29,175,167,110,124, 29,163, 8, 87,212, 21,205, 82,200,
-100,185, 37,153,153, 14, 82, 55, 55,133,133, 66,145,122,237,218, 53,255,128,128, 0,146,144,144,128, 7, 15, 30,192, 96, 48,224,
-214,173, 91,148, 3,210, 36,214,214, 92,242,157, 59, 68, 46,147,213,123,206, 46, 51,185,216,226,243, 79, 38, 4,106,181,154,208,
-226,226, 98, 94, 42,149, 74,149, 50, 33,161,158,198, 68,231,237,237, 61, 88, 16, 4, 71,189, 94,111,116,113,113,145,157, 56,113,
- 2, 10,133, 2,143, 70,127,134, 67,161, 80,232, 61, 61, 61, 75, 1,192,193,193,129, 91,180,104,145,108,218,180,105, 81,117,105,
-183,104,209, 66,214,160, 65,131,145, 65, 65, 65,184,120,241, 34,162,163,163,227, 47, 94,188,232,223,162, 69, 11,120,121,121,141,
-108,209,162,197,134, 27, 55,110, 24,159,151,193, 66, 61, 59,185, 71, 68, 68,136,238,238,238, 32,132, 64, 34,145, 64,173, 86, 35,
- 33, 33, 1,237,219,183,199,186,117,235,176, 98,197,138, 77,153,153,153,235,159, 38, 61,227,199,143,151, 55,105,210,228,245, 17,
- 35, 70, 32, 62, 62, 30,139, 23, 47,206,207,202,202, 58,125,244,232,209, 97,147, 39, 79,150,116,232,208, 1,121,121,121,216,176,
- 97, 3,127,243,230,205,245,253,250,245,251,141, 93,158, 24, 12,198,191, 45,114, 85,221,251, 23, 46,130,229,225,225,209,223,222,
-222,254,173,145, 35, 71, 74, 26, 53,106,132,236,236,108, 88, 89, 40,245,132, 16, 5, 0, 88, 89,168,244, 70,163, 17,147, 39, 79,
- 70,179,102,205, 90,207,152, 49,163,149,171,171,235,166,172,172,172,221,166,252,112,118,118,182,218,205,205,109,215, 59,239,188,
-179,248,214,173,155,126, 0,112,245,234,213,132,140,140,140,153, 38, 54,103, 85, 53, 65,149,147, 83, 18,115,115,243, 59,129,129,
-129,249,125,250,244,177, 27, 58,116, 40, 28, 29, 29,113,243,230, 77, 44, 90,180, 40, 74,171,213, 78, 57,115,230, 12,255,223, 46,
-100,158,231, 83,174, 28, 60,104,247,210,232,209,118, 11, 70,142,252,225,141,241,227,191,249,106,209, 34,185,135,135, 7,177,182,
-182,198,237,219,183,233,154, 95,127, 53,108, 95,178,228, 7,137,153,153,252,236,190,125, 10,193,104,140,173,207,111,120,122,122,
-118,233,215,167, 75,248,210,111,191,131, 70, 93,134,171,151, 14,162,176, 32, 15,191,252,186,167,177,167,167,103,151,180,180,180,
-136,122,164,215,127,215,174, 93,143,204,161, 66,129,249,243,231,195,221,221, 29,214,214,214, 40, 43, 43,195,132, 9, 19, 20,239,
-191,255, 62, 0, 32, 58, 58, 26,150,150,150, 38,233,102,102,102,118,155, 56,113,162,181,209,104,196,225,195,135,117,130, 32,188,
-119,252,248,241,189, 77,155, 54, 85,118,238,220,217,250,183,223,126,235, 14,224,232,223,120,114,139,238,238,238, 41,199,142, 29,
-243, 30, 49, 98, 4,228,114, 57, 10, 11, 11, 97,101,101,133,165, 75,151, 82,131,193,176,251,105,181,211,211,211, 21,142,142,142,
- 10, 65, 16,176,107,215, 46,148,148,148,188,153,150,150,150, 21, 16, 16,176,119,198,140, 25, 31, 6, 6, 6,250,198,198,198, 38,
- 11,130,176, 36, 61, 61, 61,145, 93,106, 25, 12, 6,227, 5, 53, 88, 0, 94, 59,114,228,136, 68, 20, 69,172, 94,189, 26, 55,110,
-220,160,150,214,246, 31, 88,217,144,141,214,214,214, 66, 81, 81,209,107,223,124,243,205,144, 47,190,248,130,116,234,212, 9,151,
- 46, 93, 34,126,126,126,195, 0,236,174, 98,124,106, 93,109,187,184,184,248, 90,118,118,150, 95,149, 89,219,253,148, 74,213,181,
- 58,204,212,159, 52,171,153,204,178,233,151, 95,126, 25,233,236,236,108,140,140,140,196,170, 85,171,196, 27, 55,110,252, 1, 96,
-105,118,118,182,198, 20,205,231, 65, 85, 77,187,160,160, 11,235,102,205,106,222,110,208, 32,218,253,149, 87,196,101, 10,197, 71,
-179,231,204,121,175,160,164,196, 75, 20, 69, 56,216,216,164,108,250,242,203,111, 59,116,234,164,185,123,249,178,197,249,223,127,
- 55,115,105,208,224, 92,125,210,153,150,150, 22,209, 48,192, 27, 27,126,253, 22, 6,131, 14,153,233,201, 0,128,188,252, 98,212,
-102,174,170,211,228, 56,174,104,220,184,113,230,122,189,158,140, 28, 57, 82,150,147,147,131,128,128, 0, 0, 64, 73, 73, 9,254,
-248,227, 15, 4, 7, 63,154, 86,235,238,221,187,143,223,215,149, 78,115,115,243, 87, 58,118,236,136,164,164, 36, 68, 69, 69, 29,
-202,206,206,206,117,115,115, 59,148,156,156, 60,172,101,203,150,216,187,119,239,136,154, 12, 86,125,143, 81,229,196,162,245,169,
- 75, 21,230,114,198,222,189,123, 39, 94,186,116,169,203,244,233,211, 73,143, 30, 61, 0, 0,229,229,229,130, 41,253, 13,107, 75,
-103,101,243,176, 40,138,240,242,242, 42, 7,128,184,184,184, 68, 0,239, 62,173,230,243,168,159, 76,147,105, 50, 77,166,249,191,
-160,249,111, 50, 88,188, 40,138, 56,115,230, 12,246,236,217, 35,232,245,250, 89,153,153,153, 49, 85,254,191,222,203,203,235,220,
-176, 97,195,150, 61,120,240, 64, 18, 29, 29, 13, 74,105,189,250, 14,105,181, 90, 35, 33,255,249,221,179,102,106,221,186,117,200,
-202,202,210, 39, 39, 39,255,110, 48, 24, 54,231,229,229,101, 62, 67, 84,227,153, 71, 17,254,114,227,134,238,101, 43,171,125, 51,
-187,117, 27,182,224,200, 17, 85,223,241,227,245, 93,251,244,249, 10,122,189, 94, 38,147,137, 48, 51,147, 72,204,204,228,209,151,
- 47, 91, 44,157, 52,201,129,112,220,254, 31,163,163, 53, 79, 17,193,194,184,183,166, 65,163, 41,195,229,139, 7, 81, 84,144,135,
- 75,215, 30,160,190, 17, 44,169, 84,234,109, 52, 26,149, 60,207,167, 83, 74,241,250,235,175, 67, 16, 4,104,181, 90,148,150,150,
-162,160,160, 64, 59,117,234, 84,174,194, 52,225,165,151, 94, 50,105, 86,127,127,127,127,111,169, 84,138,163, 71,143, 66, 34,145,
-236,126,100,136, 37,187, 79,158, 60, 57,108,228,200,145,240,240,240, 8, 34, 21, 99,116,107,211,121,188,216, 51, 65,224,163, 51,
- 29,129,206,225, 67,238, 84, 46,246,204,113, 92, 98,179,102,205, 76,234,119,245, 36, 57, 57, 57, 57, 0,230,187,187,187,239,252,
-228,147, 79, 38,183,110,221, 58,124,222,188,121, 0, 32,121,214,122, 41,138, 34,120,158,127,166, 41, 36, 24, 12, 6,131,241, 15,
- 55, 88,132,144,109,221,186,117, 27, 69, 41,149,112, 28,183,249, 9,115, 5, 0, 72, 77, 77, 77,240,244,244, 92,237,235,235,251,
-120, 1,232,122,154,151,108, 66,200,215, 28, 71, 62,121,244,185,254, 19, 75, 86, 89,218,230, 19, 0, 68, 42,149,109,190,114,229,
-202,167, 25, 25, 25, 89,245, 53,124,213,241, 60, 70, 17, 2,192,238,210,210,216,151, 45, 45,247, 79,110,218,116,224,144,247,222,
-163, 45,123,245,178,113,109,208,128,231,141, 70, 33,254,206, 29,114,126,239, 94,249,249,223,127, 55,147, 16,114, 96,119,121,121,
- 76,125,211,153,150,150, 22, 17,224,239,121,108,248,176,126, 47,249,251,186, 3, 0,226, 19, 51,144, 87, 80,124,172, 62,230, 10,
- 0,146,146,146,116, 0,116,110,110,110,195,118,236,216,177,171,194,244, 84,141, 10,233,164, 82,105, 67, 0, 40, 45, 45,245,217,
-187,119,239, 22,169, 84,154, 86,151,110,116,116,244,182, 57,115,230,140, 78, 72, 72,248, 61, 45, 45, 45,174, 34,221,113,238,238,
-238,171, 50, 50, 50, 70, 39, 39, 39,255, 70, 77,112, 31, 79, 44,246,140,168,243, 59, 85, 0, 26, 87, 46,246,252,180,107, 13, 86,
-165, 98, 94,174,247,221,221,221,219,245,238,221,123, 28,165, 52,231, 89,244, 84, 42,149, 81,167,211,241,130, 32, 72, 13, 6, 3,
- 85,169, 84, 70,118,249, 97, 48, 24,140, 23, 23,242, 87, 62, 77,155, 26, 66,124,178,131,250,211,104,214, 71,195, 20, 77,119,119,
-247, 41,132, 16,127, 83, 53, 40,165,241, 25, 25, 25, 63,212,160,201, 85,126, 95,211, 98,207,212,104, 76, 86,249,251,159,219,116,
-247,174,182,186,224, 71,125,202,179, 97,195,134, 52, 54, 54,214,164, 78,130,117,105,122,122,122,170,164, 82,233,147, 17, 42, 93,
-133, 9,171,212, 32, 0, 36,148, 82,190, 62,233,124,218, 99,244, 56,130, 5,112, 34, 17,135,115,148,219, 5, 64,172,140, 96, 61,
-239,250,249, 12,117,137,171,250, 63,127,127,255,119,130,131,131, 71,223,185,115,103, 71,106,106,234, 74, 19,228,196,255, 82, 58,
-153, 38,211,100,154, 76,243,111,215, 52,129, 86, 0, 42,151,102,171,156, 39,211,233,137,247,122, 0, 85,239, 89,149,159,115, 1,
- 92,171,162, 81,245,251,186,246, 5,128, 60, 0,119, 96,194,170, 40,117, 70,176,254,155, 60,237,114, 40,207, 91,227,137, 8,198,
- 15,207, 81,238,113,232,103,211,221,187,106, 0, 71,254,202,242,124,248,240,225,115, 27,125,145,150,150,166, 5,160,173,163,236,
- 41,128,255,218,224,129,106, 76, 84, 56,254, 55,249, 83, 71,176,248,248,248, 31,186,118,237,250,115,106,106, 42, 15, 6,131,193,
- 96,212,219, 92, 17, 66, 14, 86,220,119, 6, 84, 24,189,131, 79,190,175,220,166,114,187,170,219, 84,106, 60,249,125,109,251, 2,
-192,204,153, 51, 63, 93,180,104,145, 57,128,211,166, 38,152, 99,199,140,193,248,239,241,119,140, 98,101, 48, 24,140, 23,128,199,
-198,232, 73, 35, 84,205, 67,255,128,170,127,107,163, 58,157,202,223,168,250,121,241,226,197, 95, 1,168,215, 74, 48, 82, 66, 72,
-120, 13, 9, 52, 57,244, 87,147, 70,109,255,171, 75,159,105, 50, 77,166,201, 52,153, 38,211,100,154, 47,158,230,243,218,255,121,
- 80,157, 89,123, 34,226, 5, 66,200,193,153, 51,103,126,138,122, 52, 15, 86,138,255,101, 47, 0,225, 76,147,105, 50, 77,166,201,
- 52,153, 38,211,100,154,207,248,234,255,200,178,208,254, 85,223, 87,247, 93,109,239,235,218,215,132,109, 77, 78,243,255, 68, 31,
- 44, 6,131,193, 96, 48, 24,140, 90,200,173, 26,109,170,136, 48, 9, 51,103,206,252,180,106, 63, 41, 0, 58, 0,202,106,162,101,
-127,234,187, 85, 71,100,205,228,109,107,131, 25,172, 26,104, 22, 40, 89,224,237,237,220,242,113,148,175, 98,138, 2, 17,180, 50,
-242, 87,241, 70, 4, 21, 41, 50, 50,139,110,220,137,167,179,107,144,171,179,175, 91,167, 78,174,246, 18, 77,217,114, 65, 20, 58,
- 0, 0, 1,119, 86, 38,179,157,126,242,106,122, 17,158,232, 44, 93, 19, 33, 1, 36, 68, 37,197,199,162,136, 38,132, 0,132,224,
-142,150,199,146,123,113,244,222,179,150, 7, 33,132,132,249, 97,130, 66,105, 62,210,198,214, 46,176, 48, 63,239,161,193,160,219,
- 25,157,136, 95,232, 83, 12, 69, 13, 14, 32,205, 32, 96,134, 32, 66, 38,229,176,252, 94, 34, 61,207,106, 29,131,193,248, 47,241,
-172,253,143,171,187, 38, 63,235,224, 34, 54, 65, 94,237, 92, 3,208,170,138,233,201, 5,112,119,209,162, 69,133,139, 22, 45,170,
-250,221,109, 0, 77, 43,182,203,173,198, 40,233, 43, 62,235,171,217, 70,111,202,182,127,137,193, 10,243, 34,147, 65, 49, 23, 4,
- 20,192,188,168, 84,186,170, 94,251, 7,146,158, 42,169,100, 13, 40, 36, 90,163,240, 33, 21,112,182,218,155,185, 4,157, 85, 50,
-201, 50, 16,136, 90, 94,120, 51, 42,150,158, 48,245, 55,194, 27,146, 62, 82,194,253, 38,138, 84, 38,136,116, 35, 68, 28,180, 52,
-226,194,165, 52,170,173, 79, 90,189,189,157, 91,238, 59,145,249,210,233,109,239,161, 77,179, 64, 80,209, 8, 80, 30,230,193, 31,
-227,228,166,215,209,166,177,247,163,239, 68, 35, 44,155, 47, 67,223,142, 54, 79,125,114,116,234,228,106,111, 38,138,119, 86,173,
-253,205,213, 59,176, 29,161,162, 14,177,183, 14,191,246,254, 39,159,117,235,209,218,163,201,201,171,117,175,241,216,180, 33,121,
- 43,160, 65,163,143,167,125,246, 45,231,238,238,105, 41,242,122, 62, 51, 53,186,197,247,223,206,217,221,180, 33, 89,118,251, 33,
- 93, 99,170,145, 10,245,197, 68,169, 76, 49,194,204,220, 34, 80,173, 46,141, 21,140,198,157,225, 1,210, 62, 75,190, 89,209,172,
- 75,183,190,150,162, 46,139, 51,242, 36,116,251,142,173, 62, 63,252,180,170, 31, 33,100, 16,165, 84,172, 87,166, 5,124,112,119,
-255,132,225, 50,169,132, 4,247,255,213,130, 16,210,187,222, 26, 0,194,253, 72, 24,173, 99, 38,244,138, 43,223,143,145, 9, 52,
-234,105,142, 79,136, 31, 89, 75,128, 32, 0,187, 8,197,182,168,196,103,155, 19,139,193, 96,252,239,225,225,225,113, 58, 61, 61,
-189,219,115,214,108,147,158,158,126,133,149,238,115, 53, 89, 79,114,213,196,237,254,235,212, 55,130,181, 48, 42, 54,213, 14,162,
- 1, 97, 65,254, 11, 0,212,203, 96,169,164,146,141,215,238,100,187,130, 26,240,235,183,239,108,215, 27, 1,158, 55, 64,224,141,
- 16,120,227,163,247,130, 17, 34,175,197,156,229,103, 0,190, 20, 45,155, 53,220, 8,192,205,212,223,144,129,251,237,198,133, 99,
-246,132, 47,198,246, 13,139,166, 38,103,148, 77, 61,113, 53, 35, 47,204,151,204,138, 78,194,250,250,220,196, 79,111,123, 31,155,
-119, 31, 74, 91,249,235,142,251, 34, 40,236, 44,149,141,198, 12,139,242,218,180,251,116,234,138,117,218,251, 84,164,176,181, 82,
- 54, 26, 59, 40,214,251, 89, 14,130, 68, 83,182,252,167, 95,215,187,122,251,248, 16, 99,226, 66,192,168,131,151,119, 63,201,103,
-211,222,114,155,247,205,143,223, 2, 24, 91,107, 52,200,159,132, 6, 53, 12,249,112,227,246,139,222,229,101, 57,250, 83,127,124,
- 26, 71, 40, 53, 58, 58, 6,203,231, 47, 92,106,246,249,172,105,211,131,253,201,149,251,241, 52,186, 14,115,197,133,248, 98,255,
- 87, 95, 45,105,210,163,215, 64, 75, 65,159, 43,209,150,149, 6,173, 89,191,118,110,112, 88,107,243,142,205, 61,229,185, 23, 38,
- 17,117,105, 1, 12,212, 76,217,189,101, 15,107,245,152, 87,140,107, 55,109,157, 2,224,187,122,249, 43,254,255,231, 26, 49,240,
- 80, 1,144,161,190, 29, 8, 31, 61,242,189,123,235,210,233,137,124,225, 53, 64, 52, 84,152, 94, 3, 32, 26, 65,171,252,109,251,
-234,122, 0,152,244, 84,143,186, 4, 47,157, 56,113,205, 45, 59, 59,179,213,242,229, 95,205, 10,245, 35,135, 65,240,219,189, 4,
- 68, 60,141, 41,100, 48, 24,255,155,184,187,187, 11, 25, 25, 25,146,231,169,233,225,225,209, 47, 61, 61,253,208, 51,166,235, 99,
- 0,111, 85,124, 92,147,145,145,177,228, 89,211,213,170, 85, 43, 79, 74,169,107,197,181, 63,235,218,181,107,105,172, 6,252,189,
- 6, 75, 5, 42, 2, 23,134, 0,164,126,195, 21, 43,110,134, 42, 16, 9, 96, 44,195,224, 1, 61,225,232,224, 6, 8,229,128,160,
- 1,120, 53, 32, 60,122,229,229, 38, 3,124, 57,144,123, 24, 60,165,202,122,231,202, 88, 12,228,236,196, 75,237,188, 97,107,165,
-194,251,163, 66, 29, 87,239,123,176,102,205,190,152,158, 0, 70,154,148, 86, 74,209,166,121, 32, 86,254, 90,126,255,247,211, 57,
-189, 1,160,127, 87,199, 35,109, 26,251,120,173, 88,167,189,255, 71, 68, 65, 31, 0,232,219,209,230,112,235,112, 87,111,241, 25,
- 38,108, 21, 68,161,163,119, 64,115,194,167,124, 3,142, 43, 68, 89, 89, 30, 82,227, 55,192,209,165, 55,199,139, 98,231,186,246,
- 55,147, 98,230,251, 31, 47,150,150,151,101,235, 41,159, 35,186, 88,230,201,101, 32, 18,177,252,156, 94,147, 85, 84,246,193,187,
- 99,248, 15,103,126, 53, 19,192,232,218,116, 66,253, 48,101,217, 55, 43, 26,119,104,221,200, 57,235,252,251,164,172, 56, 27, 70,
-106,166, 28,212,165, 3,236,124, 66,197,236, 91,203,136,210,173, 39,236,124,253,145,118,119, 51,146,239,236, 33,157, 90, 15, 83,
-110,220, 34, 31, 83,147,193,106,232, 70, 58,246,126,169,245,118,127, 31,119, 55, 74, 69,136,162, 8, 74, 69,140, 29,217, 7,179,
-126,136, 67,185,134,199,128,158,109, 59, 56,216, 72,116,139, 62,236, 10, 74, 69,164,102,228,171, 79, 93,188,223, 35, 46,157,214,
-249,228, 71,128, 31,155,182,235,214,241,206,213, 75,193,134,140,131,104, 53,116,209,125, 2,156,175, 82,231, 58,222, 60,185, 62,
- 24, 88,255, 84,199,134, 16, 66, 66,124, 33,164, 92, 94, 12,207,230, 19, 36,191,172, 63,226, 84,156,159, 62,118,207,142,159,134,
-255,180,250,151,205, 79,107,218, 24, 12,198,255, 30, 25, 25, 25,207,221,100, 93,188,120, 49,227, 89, 76, 86,171, 86,173, 58, 3,
-248, 38, 35, 35,163,210,108,125,211,166, 77,155, 47, 42,239, 83, 79, 80, 76, 41, 29,125,237,218,181,179,181,105, 78,159, 62,221,
- 29,128,239,245,235,215, 43,127,195,183, 85,171, 86,190,213,109,107,110,110, 46, 52,109,218, 52,233,219,111,191,205, 96, 53,228,
-175, 53, 88,247,179,206,125,208, 92, 95,160, 6,128,251, 38,152,148, 63, 13,181,212, 26,133,197, 27, 86,140, 93, 28, 22,100,135,
-146, 82, 61,142,159, 75,170,136, 96,241, 16, 4,227,227,191,189,219, 57,162, 61, 63, 9,223,109,139, 1, 47,136,139,106,211,124,
- 18,131, 40,190,218,172,243, 43, 59, 68, 74, 21,230,230, 92,113,128,151,131,243,135, 99,154,114,239,143, 10,131, 70,203,191, 18,
-234, 75, 78, 69, 39,210, 95, 77,210, 20,249,106,242, 84,205,119,162, 80,103,222,107,162,105, 35,179, 54, 67,251,118,178,134,177,
- 0, 66,121, 34,244,130,136,204,204,114, 36,100,200, 97, 35,102,155,164, 41,138,104,226,234,234,102,126,241,216,140, 68,103,171,
- 66,185,131,153, 32,151, 19,145,114, 70, 42,209,235,239,107,237,220,123,202, 68, 17, 77,234, 58, 70,102,102, 86,175,119,234,214,
-223, 38,229,228, 91,196,204,171, 47,156,253, 60,145,120, 99, 3,114, 34, 15, 34, 63, 39,153,216,208, 66,152, 55,244, 71,223, 97,
-163,240,205,148,150, 40, 41, 41, 3,201,141,183, 81, 40,148,182, 53,105, 82, 14,163,151,125,253,165,155, 84,202, 61, 42, 79,202,
- 3,212, 8, 80, 35, 74,203,116,208,235,245, 80,201, 41, 44, 84, 20,168,104,134, 21, 4,189,121,147, 30, 51,223, 1,112,165,174,
-188, 71, 38,208,168, 48, 63,114, 30,148, 15,166,130, 6, 4, 56, 31,149, 64, 31,155,158,112, 63, 18,214,162,199,248,119, 9,240,
-227,211, 28,163,240, 6, 24,208, 50,216,210,194,140,191,143,180, 51, 83, 17, 39,168,168, 75,227,183, 48,106,244, 20,243, 95,214,
-172, 30, 72, 8,153, 92,181, 15,218, 95, 49,188,152,105, 50,205,127,170,166,141,141,141, 95,131, 6, 13,190, 48, 26,141,157,229,
-114,185,139,193, 96,128, 40,138, 89, 10,133,226, 92, 82, 82,210,252,226,226,226,132,255,181,188, 31, 62,124,216,100,147,101,138,
-166, 76, 38,195,161, 67,135, 98, 77, 53, 89, 79,106,114, 28,247,219,174, 93,187,176, 99,199, 14, 0,192,233,211,167,209,176, 97,
- 67,139,234,246, 77, 77, 77,181,120,249,229,151,127, 3,224, 85,155,230,195,135, 15,253,190,252,242, 75,236,218,181, 11, 0,176,
-105,211, 38, 4, 5, 5, 85,155,158,219,183,111, 75, 62,255,252,115, 63, 0, 25,127,245, 49,122, 97, 13, 86,197, 26,187,117,117,
-210,139,119,181,146, 53,135,209, 8, 0,241,245,253,177,232, 56,250,117,211, 32, 89,159,147,123,126,236,172, 82,112,152,187,252,
-195,212,220,220,210,182, 82,201,163, 14,131,188, 0,206,206, 86,113,105,209,212,166,222,133,197, 90,252, 30,145,126, 54, 42,158,
-214, 43, 20, 26, 21, 71,143, 3,176,253,255, 27, 36, 9, 26,251,217,241,109,219,190,238,211,100,218,232, 38,216,127, 38,105, 26,
-128, 58,215,170,163,162, 8, 74,249,199,157,218, 43,190,172,104,114,250,255,239, 68, 74, 1,106, 4,173,103,255,196,121,243, 70,
- 72,247,111,219,219,199, 66, 41,253,126,210,219, 19,173,141,249,209, 40, 46, 18,144,149, 87,142,228, 92, 91, 8,102, 1,120, 16,
-117, 69,144,112, 92,157,253,207, 8,135, 18,106, 44,183,178, 51, 51,227, 66, 91,191,227, 86, 28,249,105,137, 82, 98,148,216, 54,
-251,210, 42,251,238,178, 20, 94,151, 83, 70, 56, 24,234,210,177,182,177,105,168, 43, 77,146, 20, 23,229,195,182,113, 40,250, 14,
- 26,136,185,111,134,160,180,180, 28,185,249, 23,105,160,143, 13,209,222,220,130,207, 94, 15, 70,126, 94, 38,244, 70,128, 43,209,
- 22,104,245,218,178,154, 47, 22,248,229,131, 15, 63,121,213,199,211,201,162,114,176, 0, 21, 5, 52, 13,247, 71,175,110,109,112,
-252,210, 69, 92,187,249, 0, 34, 21, 43, 6, 19, 8, 72,203, 41,202,214, 26,132, 13,245,186,120,138,252,163, 72,104, 53, 6,236,
-105,162, 76,141, 27, 19,115,161, 28,179,219,134, 90,189, 57,227,117, 31, 43, 43, 5,129,214, 76,128, 86,107, 68,233,253, 31,224,
-224,217, 24,230, 42, 21,105,222, 92, 35, 5,192,214, 21,100, 48,170, 48, 98,196, 8, 85,118,118,246,153,254,253,251,135,246,236,
-217,211,188,115,231,206, 40, 47, 47,199,209,163, 71,161, 86,171,125,188,188,188,124,142, 29, 59, 54,172, 77,155, 54,209, 94, 94,
- 94, 93,119,238,220,169,125,138,159,169,188, 95, 61,215,206,225, 10,133, 2,151, 46, 93,122,174,145, 44,133, 66,129,171, 87,175,
-198, 62, 77, 36,171,188,188, 92,238,234,234, 10, 7, 7, 7, 8,130,128,242,242,114,236,219,183, 15, 37, 37, 37, 16, 69, 17,102,
-102,102, 88,118,184, 24,218,152, 93, 88,243,253,151, 40, 46, 46,150,215,165,153,151,151, 71, 26, 53,106, 4,157, 78, 7,158,231,
-161,213,106,113,226,196,137,199,159,165, 82, 41, 22,236,202,134,238,193, 54,108,252,101, 25,242,242,242,200,127,171,238,152,232,
- 69,254, 57, 6,171, 50, 67,255,141,140, 9, 2, 63,107,245,134,109,151,102, 77, 29,137, 41,175,247,240,154,255,221,222,158,209,
-241,116, 35, 0,132,250,147,177, 99,250, 5,122,219, 90,200, 48,239,231,235, 0,232,172,103,253,189,200, 36,250, 32, 44,128, 76,
-219,123, 38,249,204,167,111, 54,135,191,151,117,195,128, 0,162,136,139,163,117,247,247, 17,141,176,179, 84, 54,234,223,213,241,
- 8,168, 8, 91, 75,101, 48,168, 0, 91, 43,101,163,190, 29,109, 14,139,148,194,214, 66, 30, 76, 69,211, 39,231,110, 29,174,124,
-219, 76,198,189,109, 97,101,235,253,193,164, 49,102,253,251,191,108,102,161,160,200,143, 62,132, 18, 26, 6,189,133, 5,168,186,
- 8, 9, 15, 35,133,195, 17,215,211,149, 14,110, 31,213,153, 76, 1,103, 51, 82,239, 13,109, 16,216,211, 54,247,250,103, 57,126,
- 61,182,248,114, 16,184,242, 75,195,114, 44,172, 66,229,231,111, 71,242,162,128,139,117,233,148,150,148, 36, 25, 13,112,211, 26,
-101, 86,113, 87,215, 99,230,152, 48, 20, 21,230, 66,171,227, 81, 84,206, 27,220, 28, 13, 74,109,225, 93,232,244, 60,116, 6, 10,
-153,185, 59,142, 93,138,204, 19,121,227,225,154, 52,227, 50,232, 45, 0,150, 85,191, 11,112, 39, 77,103,216,153,221,130,160, 65,
-114, 74, 6, 54,238,190,212,188, 98,187,103,120, 60,229, 65,249,255,191, 70, 87,118,126,127,154,206,237, 33, 13, 72,107, 51, 51,
-217,247,243,102,246, 15,237, 26, 38, 40,137, 54, 19, 4,128,185, 74, 10,157, 74,128,141,202, 31,212, 80, 74,213, 90,109, 81, 84,
- 36,216,204,236, 12, 70, 21,130,131,131, 93,109,108,108,162, 62,252,240, 67,251,161, 67,135, 62, 54, 3, 27, 54,108,192,138, 21,
- 43, 48,119,238, 92, 24,141, 70,172, 94,189,218,124,247,238,221,173,127,252,241,199, 52, 31, 31,159,176,228,228,228, 44, 19, 77,
-149,188,226,222,197, 85,152, 43, 97,222,188,121,116,238,220,185,168,250, 29,165,212,240, 52,233, 87, 40, 20, 80, 40, 20,184,127,
-255,254,115, 49, 89, 50,153, 12,114,185, 28, 10,133, 2, 49, 49, 49,245, 54, 89, 60,207, 75,210,210,210, 80, 82, 82,130, 94, 3,
- 7, 98,197,226,197,232,220,185, 51,122,246,236, 9, 74, 41, 78,158, 60,137,246,118, 15, 96, 63,176, 11,238,221,187, 7,163,209,
-104, 82,203, 84, 90, 90, 26,242,243,243,209,103,224, 64,252,250,211, 79,104,209,162, 5, 26, 53,106, 4, 0, 56,115,230, 12,122,
-120, 36,193,178, 81, 79, 60,120,240,224,191, 86,119,254,155, 94,228,191, 26,193,250,111, 17, 25, 71, 47,135,250,145,131,163,250,
-183, 26, 48,176,123, 40,126,221,118,234,203,208, 80,178, 13, 0, 28,108,148, 11, 95,239,239,143,232,248, 66,156,188,154,113, 48,
- 58,129, 94,126, 30,191, 41, 10,112,116,176, 53, 7, 56, 5,212,122,129,183,182,174,123,218, 3, 17, 20,230, 33, 51, 49,102,232,
- 61,175, 54,141,189,188, 40,229, 43, 70, 12,126,139,177,131, 98,189, 91,133,185,120, 63,106,242, 50,194,186,253, 22, 64,180,168,
- 51, 29,157,154,169,142,125,244,222,212,118,253, 7,142, 50,147,155, 59, 64,212,164,194, 88,112, 7,249, 9,167,161, 51,107,134,
-220,180, 68,108,219,255,123,241,253,132,236, 18,137,132, 59, 46,181,113,249,228,196,137,132,178,186,116,181, 18, 44,154,251,197,
-172,254,219, 54,111,181, 49,115,239,132,135,251,251, 21, 41, 36, 70,165,179, 71, 16, 52,188,149,176,116,221, 65,219,114, 96,113,
- 93, 58,234,242,146, 61, 39, 78, 30, 25, 25,232,214,209, 42, 49,242, 32,212,106, 61,116, 70, 32,188, 69, 55, 8, 34, 85, 16,142,
-136,214, 18, 9,201,206, 46, 0, 49,138,217,231,110, 38,102,158,191, 22, 47,209,113,117,107,255,169,210,201, 37,239, 13,236,217,
- 20, 16, 52, 24,212, 43, 28,203,215,157,156, 10, 96,252,179, 25, 44, 35,168,160, 1, 5, 58,134,249,145,159, 41,208,241,198,225,
-229,193, 45,251, 78, 67,125, 34, 88,225,126,164,111,227, 96,247,245,203,191,156,101,111,239,236, 37,129,160, 1,225, 75,168, 88,
-112, 25,210,242,135,176,246,236, 15,193,166, 3,126,249,105,105,153, 40,210,109,244,175, 92, 45,157,193,248, 7,162,213,106,247,
- 44, 94,188,216,126,192,128, 71,163,221,203,202,202,112,241,226, 69,172, 89,179, 6, 22, 22,255,127,157,164,148,162, 95,191,126,
-160,148,218,207,153, 51,103, 15,128,118, 53,105,118,232,208, 97,224,183,223,126,155,210,170, 85,171,135,120, 52,199,145, 28,128,
- 4, 0, 61,113,226, 4, 7, 0,173, 91,183, 22,174, 94,189, 42, 2,160,163, 71,143,150, 89, 90, 90, 54, 44, 43, 43,139,120, 90,
-131,165, 80, 40,144,158,158,254,204, 38, 75, 38,147, 61,214,147,203,229, 72, 79, 79,175,151,201,226,121, 94,250,199, 31,127,224,
-230,205,155,152,215,188, 57,222,119,115,131,131,131, 3, 34, 34, 34, 64, 41,133,133,133, 5, 10, 10, 10,176,109,219, 54,116,235,
-214, 13, 60,207,203, 77,209,221,183,111, 31,110,220,184,129, 5, 45, 91, 98,170,133, 5,108,109,109,113,230,204, 25, 0,128, 82,
-169, 68,122,122, 58, 78,156, 56,129,174, 93,187,178, 74,253, 87, 27,172,174,132, 72,137, 23, 92,141, 6, 13, 40, 79, 1, 2,247,
-208, 80, 34,143,142,174,255, 83, 2, 7,124,182,114,221,193,254,203,103, 13, 34, 19,134, 55,119,159,255,227,233,201, 0,240,230,
- 43, 65, 30,230, 74, 41, 86,110,139,166, 28,240,217,243,200, 96,104, 40,145,115, 28, 38,247,234,208, 8, 25,121,122,196,167, 20,
-159,138, 78,160, 38, 53,233,156,220, 56, 6,155,246,156, 73, 93,177,254,207, 35, 6,215,239,187,145,178,108,163,246, 62, 5,133,
-173,153, 44,120,252,160,246,117,142, 34,108, 29,174,124,123,198,180,105,237, 6,191,246,137,153, 49,109, 47,116, 73,127, 0,130,
- 26,234,114,130, 18, 62, 16,153, 41,105,152,183,124,107,170,206,200,189,122, 61, 90, 91, 47, 99,249,224, 1, 45, 11,245, 39, 67,
- 23,127,253,197,241,175,230,205,177, 84,166,159, 44,145, 73, 81,206, 57,116,150, 45,252, 98,149,180,180, 88,255,114, 92, 50, 45,
-173, 75, 71,199, 97,241,215,203,190,235,255,214,152,161,247,131,188,186, 58, 8, 89,241, 14,234,226,226,156, 45,135,111,184, 86,
- 60, 57, 18, 0,136, 75,204, 71,110, 65, 57, 47,240,198, 8, 43, 3,230, 71,165, 81,147, 71,255,249,187, 16,167,161,253,155,188,
-230,100,171,128,166,188, 16,206,118,114,244,238, 24,240,154,191, 11,153, 17,159, 77,115,159,246, 56, 87, 54, 17, 94, 90,211, 61,
- 24,162, 33,152,138, 70,232,147,127,171,191, 14, 48,109,218, 72, 31, 27,123, 11, 61, 71,132,114, 64,102, 7, 40,156, 8,103,230,
- 11,137,153, 55,146, 98,175,243,211,222, 25,153,159,148,148,181,214,145, 98, 9,187,132, 48, 24,127, 38, 57, 57,249,245, 79, 63,
-253,244,124,155, 54,109, 92, 28, 29, 29, 17, 30, 30,142, 3, 7, 14,224,163,143,254, 63, 24,223,172, 89, 51, 0, 64,126,126, 62,
-190,254,250,235,172,140,140,140,215,107,211,140,138,138,186,255,219,111,191,117,108,210,164,137, 94, 46,151, 23, 86,154,172,228,
-228,100,105,121,121, 57,209,235,245,212,194,194, 66, 84, 42,149,198, 17, 35, 70, 24,174, 94,189,218,176,188,188, 60,249, 89, 34,
- 88, 45, 91,182,188, 91, 84, 84, 84, 76, 8,121,230, 41, 28, 42,205, 85,112,112,176,147, 94,175, 23, 0, 20, 60,205, 20, 14, 60,
-207,163,101,203,150, 56,113,246, 58, 14,159,189,139,178,220,120,140,126,185, 55,130,131,131,113,244,232,209,167, 62,102, 45, 91,
-182,196,137, 19,231,113,230,122, 12,178,147,163, 49,102,212, 16, 52,106,212, 8, 39, 78,156, 96, 21,250, 89, 13, 86, 93, 33,185,
- 16, 31,210,212, 37, 92,177,233,179, 65, 1,161,210,240,185, 32, 82, 51,236, 93,127,160,195,172,175,126,190,223,216,131,140,190,
-107,194,104,175, 63, 69,177, 30,117, 76,222,122, 59, 58,248,181, 65,157,189,240,235, 78,243,217, 0,240, 74, 47, 63, 92,141,206,
-197,149,200,156,173, 81, 79, 57,103, 81, 85, 26,187, 16,115, 88, 96,235,215,159, 12,238,234,227,233,138, 53, 59,206,131, 80,236,
- 49,233, 70, 75, 41,109,211,196, 27, 43,214, 63, 57, 98,208,205,123,217, 70,237,253,163, 23, 74,250, 2,192, 75,237, 44, 14,183,
- 10,177,247,174, 43,146,161,146,113, 19,250, 14,122,221,140,207, 62, 10,177, 96, 39,100, 10, 57, 52,229, 2, 50,115,116,208,152,
-155,225,212,185, 8, 77,153,154,159,118, 39,150,127,170,168, 93,116, 60,141,111, 22, 68, 82,202, 53, 26, 55, 75,251,128,114,142,
-128,150,233,101,244, 70,116,122,121, 84, 50,141, 49, 69, 35, 46,142,234,219,121,146, 78,191,108,220,249,133, 76,166,120, 69, 34,
- 1,113,182,181,112,250,121,229, 2, 88, 89, 89,130,242,165,160,186, 60, 12,125,243,171,220,187, 15, 13,126, 0, 16, 20, 68, 44,
- 59, 55,149,111,148,114, 36,237,212, 77,253,231,117,134,128, 37,152, 52,122, 80, 83,153,104, 44,199,123,115,182,227,151,133,131,
- 48,102, 96,136,236,143, 83, 15, 38, 1,152,255,244, 97,202, 71, 77,132,237, 38,156,189, 79,128,243, 20,232,120,253,224,194, 96,
-192,244,150,199, 22, 45,136, 76, 42, 37, 33, 33, 30,122,153,144,182, 13, 68,229, 65, 37,142, 93, 1,139,134,132, 90,134,227,135,
-149, 95,148,253,186,102,205, 49,145, 96,222,253,196,218,167,188, 96, 48,254,173, 80, 74,227,109,109,109,251,244,235,215,239,228,
-209,163, 71,237,195,195, 31, 45, 55,119,227,198,141,138,243,236, 81, 83, 84,118,118, 54, 94,125,245,213,188,204,204,204, 62,148,
-210, 90,251,244,150,150,150, 38,236,221,187,215, 69,163,209,180,250,252,243,207,179, 27, 52,104, 80,106, 52, 26,105,105,105, 41,
-120,158,167, 78, 78, 78,178, 22, 45, 90,144,176,176, 48,205,201,147, 39, 29, 82, 83, 83, 75, 1, 36, 61, 77,250,223,122,235, 45,
-236,222,189, 27, 0,240, 60,230,197,146,203,229,232,215,175,159,199,197,139, 23,211, 43, 52,175, 60, 67,217,226,206,157, 59, 56,
- 23, 43, 64, 97, 97,135,164,251, 37, 56,241,251,126,140,158, 48, 17, 60,255,244,189, 21,110,223,190,141,109, 39,110,195,197, 35,
- 0,197,186, 59,216,183,111, 31, 38, 79,158,252, 76,154, 79,153, 63,242,194,245,193,170,204,216,147,255, 12, 8, 32, 10,165, 30,
-115,122,183,245,248,100, 68,143, 0, 9,175,206,128, 40,138,144, 0,112,180,226,176,238,215, 95,252,118,238, 61,116,169,177,183,
-228, 59,232,197,207,238,102, 83,117, 61,194, 88,115,190,221,112,225,149,223, 22,116,145, 78, 30, 30,108, 15, 0,114, 25,135,149,
- 91,163,120,112,152,243, 44,153,106,231, 73, 84,101,114, 76,112,245,181,153, 61,235,157,254,246, 93,219, 4, 33,226, 82, 36,190,
-219,124,233,172,194, 14,155,234, 19, 21,169,218,161,253,209,119,213, 4,191,104,221,149, 80, 16,169,171,194,220, 17,218,164, 67,
-144, 42,148,224,121, 3,114,179,213, 72,204, 18,161,114,151,225,234,157,100,205,144,215,134,254,241,180,121, 38,132,144,142,205,
- 84,238,115, 22, 46,245,212,104, 74,249,146,162, 60, 94, 42,191, 36, 53, 55, 83,102,213, 71,231, 82, 26,213,118,105, 38,111, 1,
- 42, 74,148, 18,170,158, 53,109,156, 69,250,131,163, 8,116,202, 0, 1,133,153,123,127, 88, 89, 72,228,157,154,202, 83, 0,192,
-215,193, 70,241,245,252,143,108, 62,152, 49,239,156, 41,209,196,198, 65,174, 31,132, 7,218, 35,226,202, 61,156,189,150, 28,117,
-246,242,131,176,110,173,221, 17,228,103,251,126,104, 40, 89,252, 52, 17,209, 71,199,224, 81, 19, 97,229, 40,194,112, 63, 18,214,
-106,192,231,213,142, 30,172, 9,223,155, 16, 31,248, 81, 16, 34, 1, 5, 1,180,233,224, 83,127,131,196,111, 42,221,179,127,161,
-102,205,175,107, 22, 68, 39, 82, 22,181, 98, 48,234,160,168,168,232,142,185,185,121,239,166, 77,155,110,120,239,189,247,172, 94,
-123,237, 53,247,183,222,122,139, 3,128,236,236,108,113,197,138, 21, 25,223,127,255,125,113, 94, 94,222,120,131,193,112,215,148,
- 7, 94, 66,200,197,117,235,214,229,158, 63,127, 62,172,109,219,182,230,173, 90,181, 18,157,157,157,229,106,181, 90, 72, 77, 77,
-213, 92,186,116, 73,136,141,141,181, 41, 42, 42,138, 5, 16,247, 52,205,247,238,238,238,224, 56,110,190,151,151,215, 23,233,233,
-233,141,159, 71, 31,172,192,192, 64,119, 0,177, 30, 30, 30,129,245,109, 30,252,143, 27,182, 84,138,194,194, 66,148,166,197, 65,
-157,159,135, 70, 18, 53,154,217, 59,194,202,202,234,153,204, 80,113,113, 49,164,186,108,196,223, 73, 70, 81, 86, 18, 66,125, 90,
-194,194,194, 2, 58,157,238,239, 48,232,228, 69, 57, 15,106,108, 34, 12,243, 34,147,237, 20, 88, 49,110,132,159,220,207,199, 19,
-250,220, 27,184, 21, 87,134,207,215,182,142,150,200,173,116, 83,198,246,106,209,173,167, 19,186,116,109, 77, 26,248,216,190,191,
-120,241,170,119,195,188,201, 71, 81, 41,116,165, 41, 63, 28, 21, 71, 19, 66,252,200,154,211,215,210, 39,121, 58,105, 64, 65,113,
-250,122, 38,238,198, 21,174,185,151, 64, 19,234,147,137,176, 64,210, 83, 74,184,237, 84,160, 42, 27, 43,139,210,102,157,131, 29,
-123,118,108,194,245,233,214, 10,114, 41,112,254,202,109, 76, 91,184,231,178,168,160,253,111,220, 48,173,121, 16, 84,252, 15,227,
-244,104,196, 32,255,167, 17,131,148, 82, 10,145, 71, 93,243, 77, 74, 56,146, 85,158,125,221, 85, 97, 21, 10, 67,254, 41,100,103,
-151, 33, 42,222,128,255, 99,239,186,227,163, 40, 30,239,155,221,171, 73, 46,189,222, 37, 33, 64,168, 9, 37,141, 14,210,171, 20,
- 81, 16, 16, 65, 80, 80, 64, 80, 65,165,137,244,162, 8, 34, 69,154, 10, 88, 64, 58,130,244, 18, 58,132, 4, 66, 73, 32,148, 64,
-218,165,247,114,125,119,126,127, 36,151,111, 8, 41,151,128,141,223,190,207,231, 62,119, 91,238,237,204,206,236,206,155, 55,173,
- 0,222,200, 78, 76, 4,165, 92,252,220,185,187,106,253,132,184,184,184,184,213,111,212,184,193,154,205,187, 97,208,229,226, 81,
-212, 22, 20,228,165, 96,209,210, 63, 26,120,121,121,117, 78, 76, 76, 60,107,177, 88, 3,105,124,234,244,118, 55, 80,128, 21,201,
-240,231,166,157,200, 16, 89,193,197, 94, 2, 94,155,134,241,227, 70,218,247,123,117,164, 61, 0,196, 63,140, 68, 29, 39,203,116,
-181, 33, 7,175,191, 57,166,137, 3,184, 34,252,188, 63, 82,203, 16,244,249,249,143, 59, 15,187, 6, 59,200,223,236,233,227,184,
- 96, 99,206, 27, 0,182,215,234,161,228,185,167, 70, 17,214,102,244,224, 46, 74, 57,191,250,228,225,246,147,233,138,161,253,130,
-172, 36, 34, 66,168, 54, 9, 60,145,144,239,214,253,148, 47, 37,216, 36, 20,157, 2, 4, 88,134,162,162,162, 8, 66, 72,139,207,
- 62,251,108,196,172, 89,179, 94,177,177,177,169, 15, 0,133,133,133,177, 70,163,241, 28,128,237,148, 82,174, 6, 5, 47, 5,240,
-128, 16, 18,251,240,225, 67,247,159,127,254,217, 1,128,188,228,176, 22, 64, 14,128,212,154,112,150,135, 89, 76,169, 84,170, 47,
- 95,212,125, 48,139, 41, 79, 79,207,134,181,249, 63,203,178, 28,195, 20,175,236, 35,147,201,112,254,252,121,244,237,216, 9,145,
- 39,227,208,212,221, 27, 93, 71,190,131,253,103,206,128,101, 89,243,249, 53, 42, 71, 68, 34, 17, 46, 92,184,128, 33,253,187, 96,
-255,254,253,240, 13, 9,192,228,201,147,113,244,232, 81,136, 68,194,106,122,127,137,192, 2,197,130, 19,191, 47,145,128, 55, 98,
-247,111, 95,227,196,181, 34,253,189, 36,204,110,146,136, 85,187,145,207,167,101,236,249,224,207,208, 71,203,199,142,233,111,221,
-173,115, 79,116,123,165,171,168, 89, 64,231, 57, 0,190, 43,227,170, 52,175,106,174, 12,206,136,133,155,246,220,125,255,247,195,
- 49, 4,166,124, 12, 27,216,138,114, 70, 44,172,198,169,121,134,211,222, 90,241,251,133,243,151, 29,193, 21, 32,229,241, 25,185,
-135,123,125,128, 26,113,255,126, 12,214,254,180,159, 15,189,124,239, 23, 61,139, 41, 15,163,104,161,165,156,197,138,202, 4,123,
-133,244,153, 17,131, 14, 86,226,166,189,218,217, 28,161,148, 82, 91,107,113,211,138,230,198, 42,207,169, 53,242,155,126,217,182,
-249,155,119,223,125,207, 38, 83,151,132,152,132, 59,208,178,158, 96,173, 27,224, 78,248, 49,141,198,200, 87, 59,117, 68, 85,247,
- 51, 35, 35, 35, 45, 34, 60, 11,191,111, 93, 10,163, 81,135,180,228, 98,141,154,156,154, 7, 59, 59,207,203, 53,225, 52,152,248,
-220,215, 7,143,151, 88,201, 97, 53,242,205, 87,165, 15,213, 58, 4, 53,177, 45,206, 22,134, 12,220, 13, 61,143,174,110,197,157,
- 33, 31,222,101, 81,167,173,202,162,112,218,218, 74,166,244,237,228,137,216,184, 20,156,143, 72,218,246, 40,137,170,125, 61,201,
-182,135,241, 57, 31, 12,234, 90, 7,223,254, 18, 53,185, 50,129, 85, 25,103,201,104,193,142,160, 70, 80,147, 22, 20,232,216,188,
- 62,105,102,201,200,193,138, 56, 69, 12,222, 90,249,251,147, 47,118,135,166, 15,250,252,189, 78,118, 29,218,245,149,130, 55,210,
-252, 34,157, 49, 42,150,230, 61, 79, 26, 61,135, 59, 41,112, 10,156,255, 73,206, 18,177,243, 75,201,231, 69,114,170, 81,110, 94,
-166,231,141,123,217,230, 64,181, 90,205,170, 84, 42,174,186, 78,238, 22,112, 94, 45, 43,180, 74,220,171, 42, 93,172, 10, 56,213,
-109,218,180,113, 26, 48, 96, 0, 76, 38, 19, 30, 60,120,128,184,184, 56, 12, 24, 59, 6,142,142,142,184, 26, 21,133, 7, 15, 30,
-224,203, 47,191,132,201,100, 66, 88, 88, 88, 98,117,156, 98,177,216, 16, 16, 16, 32,121,237,181,215, 96, 50,153,240,232,209, 35,
- 60,121,242, 4,147, 39, 79,134,189,189, 61,162,162,162,240,232,209, 35,124,249,229,151,208,233,116,136,141,141, 53,252, 29,121,
-233,255,143,192, 34,224,192, 27,145,123,109, 46, 54, 28,130,193, 96, 66,211, 59, 9,244,113,153, 51,214,183,244, 34, 7,111,222,
-185, 27, 27,113,181,155, 20,121,183, 0,160, 70, 53,135,152, 4,154,220,170,137, 40, 31,166,124, 59,164, 31,193,227,164,252,130,
-152, 4,154, 92, 11,247,130,128, 43, 2,114,195,177,255, 80, 40,100,242, 27,184,118,253, 46,119, 41, 34,230,119,134, 98, 97,212,
- 99,122,191,230,156, 20,138,224, 85,120,103,224,195,226, 17,131,212, 8,202,155, 96,223, 97, 59,198, 12,108, 95,167, 85, 83,135,
- 58,224,141,160,212, 8,199,238,103,128, 47,228, 85,242,133,221,214,109,238, 20, 40,127, 35, 63, 47,163, 77,207,174, 93,108, 92,
- 27,191,137,220,251, 81,184,115,253,132, 38,252, 86,204,229,176,219,186,205,207,147,144,158,158,158,175,116,239,222, 4,195,222,
-153, 9,131, 46, 7,143,238,252,132,252,188, 20,156,191,168,192,221,248,188,118, 0, 44,118,176, 46,221, 54, 54, 3,128,142, 45,
- 36,241,118, 82,189,199,168, 33,253, 33, 19,105,193, 27,243, 65, 12, 25,120,152,101,200,125, 99,110, 34, 7, 0,214,114, 34,178,
- 17,229,218, 89,194,235,239,235,220,200, 90, 98,196,207, 7,238,128, 39,197,203, 44,241, 4,235,127, 62,248,240,131,133, 31, 6,
-193,223,215, 49,192,220, 0,111,113, 58, 1,147,194,255,152,223, 84,123,103, 14, 40,111,196,133,229,142, 77, 59,125,150, 61, 9,
-181,156, 97,253,214, 67,154, 4,224, 3, 63, 31,178,241,163,197, 71,231,132, 52,143,234, 56,237,131, 65,118, 32,194,194,232, 2,
- 4, 8,248, 71,156,192,247,167, 79,159,190,145,101, 89, 87, 0,132, 82, 10,157, 78, 39,250,225,135, 31,196, 38,147,137, 97, 89,
-150,147,203,229,166,136,136, 8, 35,207,243,233, 6,131,225,253,234, 56,245,122,253,195,181,107,215, 54, 48, 26,141,165, 35, 14,
-117, 58, 29,126,249,229, 23,232,116, 58,200,100, 50, 40, 20, 10, 60,122,244, 8,132, 16, 3,199,113, 15,133,148,120,145, 2, 11,
-152,223,225,245,185,115, 65, 65, 64, 48,175,156,184, 2, 0,220, 76,164,234,102,222,228,147,102,129,157,231,150,136,178,249, 53,
- 13,128,150,227,134,180, 10,110,188, 3, 0,116, 60,247,118,109, 34,145,167,213,188, 25,216,186,221,239, 60,165, 34, 19, 71,127,
- 96, 24,236,209, 2,209, 15, 99,171, 31, 57, 87, 25,212,201, 57, 17,125, 59,218, 83,243, 18, 56,165,205,130, 37,211, 49, 80, 74,
-255,183, 12,221, 23,114,100,100,234,170,237, 77,125,254,134,182, 87,235,230,178,113,199,206, 94, 31,207,241,212,131,101, 72,138,
-214,200,111,122, 94,113, 5, 0,137,137,137,103,253,125,201,241,155, 29,221,123,185,148, 76,179,154,145, 3,100,228,226,120, 98,
- 98,254,217,218,112,102,107,140,131,102, 45, 63,240,135, 84,196,138, 0, 10,158, 47,142,175,214,192,101,153, 69, 88,203, 70, 68,
-245,217, 15,166, 29, 44, 75,226,170,227,187,122, 43,249,219, 97,159,157,252,244,206,131,236, 31, 30, 39, 22,215,124, 30, 39,210,
-219, 13, 61,201,156,135, 9,249,159,222,126,144,253, 77, 77,251, 77, 16, 96, 93,171,129,115,159,217,247,188,247, 51, 58,142, 70,
- 2, 24,220,172, 30,233, 57,108,194,154,105,132, 64, 88, 38, 66,128,128,255, 71, 48,187, 88, 12,195, 44,120, 81,156,102, 23, 11,
-192,131, 26,252,231, 42,128, 22, 47, 50,110, 17, 17, 17,153, 0, 50,133, 84,254,107, 65,254,202,105,124, 4,219,188,148,147,121,
- 78, 58,190, 38,225,108,212,168, 17,125,240,224,129, 69,157, 5,133, 52, 18, 56, 5, 78,129, 83,120, 39,191,144,119,242,243,118,
-206,166,255,223,211,232,101,131,208,236,241,247,128,255, 59, 47,118,255,254,125, 34,220,114, 1, 2, 4, 8,248, 91,223,201,194,
-164,195, 2,158, 2, 35,220, 2, 1, 2, 4, 8, 16, 32, 64,128,128, 23, 11, 2,160,121,133, 82,188, 6,214, 31, 33,164,121,141,
-165,126, 53,252, 2,167,192, 41,112, 10,156, 2,167,192, 41,112,190,124,156,213,113,191, 44, 77,143, 66, 31, 44,129, 83,224, 20,
- 56, 5, 78,129, 83,224, 20, 56,255,113,206,151, 13, 66, 19,161, 0, 1, 2, 4, 8, 16, 32, 64,128, 32,176, 4, 8, 16, 32, 64,
-128, 0, 1, 2, 4,129, 37, 64,128, 0, 1, 2, 4, 8, 16, 32, 8, 44, 1, 2, 4, 8, 16, 32, 64,128, 0, 1,130,192, 18, 32,
- 64,128, 0, 1, 2, 4, 8,248,215,224, 47, 29, 69, 40, 64,128, 0, 1, 2, 4, 8, 16,240,255, 17, 12, 0, 16, 66,104,201,167,
-179,112, 75, 4, 8, 16, 32, 64,128, 0, 1,127, 55, 94, 54, 45, 82,186, 84, 14,165,148, 16, 66, 40,158,127, 61, 37, 1, 2, 4,
- 8, 16, 32, 64,128,128, 26,227,101,210, 34, 76, 89,229, 8,160,139,144,188, 2, 4, 8, 16, 32, 64,128,128,127, 2, 47,147, 22,
-121,202,193, 18,146, 86,128, 0, 1, 2, 4, 8, 16,240, 79,225,101,210, 34,194, 40, 66, 1, 2, 4, 8, 16, 32, 64,128,128, 23,
- 12, 97, 20,161, 0, 1, 2, 4, 8, 16, 32, 64,192, 11,134,224, 96, 9, 16, 32, 64,128, 0, 1, 2, 4,252,151, 4, 22, 33,164,
-185,192, 41,112, 10,156, 2,167,192, 41,112, 10,156, 2,167, 32,176, 4, 8, 16, 32, 64,128, 0, 1, 2, 4, 8, 2, 75,128, 0,
- 1, 2, 4, 8, 16, 32, 64, 16, 88, 2, 4, 8, 16, 32, 64,128, 0, 1,130,192, 18, 32, 64,128, 0, 1, 2, 4, 8, 16, 32, 8,
- 44, 1, 2, 4, 8, 16, 32, 64,128,128,127, 8, 4, 64,133, 35, 1, 40,165,183, 45, 38,169,197,104,130,234,248, 5, 78,129, 83,
-224, 20, 56, 5, 78,129, 83,224,124,249, 56,171,227,174,137,254,248, 87, 11,172,191,114,162, 81, 66, 72,243, 23,125,163, 4, 78,
-129, 83,224, 20, 56, 5, 78,129, 83,224,124,249, 56, 95, 54, 8, 77,132, 2, 4, 8, 16, 32, 64,128, 0, 1, 47, 24,162,127,234,
-194,132, 16,166,140,192,227, 1, 80,250,156,118,218, 95,193, 41, 64,128,128, 23,131, 87, 2,201,116,169, 68, 60, 86,107, 48,126,
-117,225, 6,253,169, 75, 48,113, 54,241, 88, 38,151,136, 58,233,244,166,175,207, 71,210, 31,106,248,188, 63,181, 40,172,240,172,
- 63, 63,122,245,234, 53, 30,192, 92, 74, 41,229,121,126,246,169, 83,167,182,189,136,119,189,135,135,199,112, 0,214, 0,192, 48,
- 76,110, 82, 82,210, 46, 75,254,219,165, 75, 23, 81, 65, 65,193, 19, 0,158, 37,187,238, 71, 68, 68, 52,174,238,152,128,154, 35,
- 60, 60,156,250,248,248,160, 69,139, 22,247, 82, 82, 82,214, 80, 74,215, 11,119,229, 95, 36,176,154,184, 89,181,173,235,237,250,
-234,145,240,184,217,213, 61,112,158,158,158,203, 92, 93, 93, 39, 20, 21, 21,105, 1, 80,134, 97,168,159,159, 31, 8, 33, 48,191,
- 55, 57,142, 75,191,123,247,110,115, 75, 31,226, 23,197,217,184,113,227,112,134, 97,188,202,190,191,171,251,205,243,124, 98, 84,
- 84, 84, 72,117,225, 84, 42,149,189, 25,134,153, 81,221,121, 60,207, 47, 75, 78, 78, 62, 86,213, 57, 45, 90,180,184,110, 99, 99,
-227,206, 48, 76,165,171,143,151, 45,115, 76, 38, 19, 45, 42, 42, 74,189,115,231, 78, 80, 77,211,214,211,211,115, 54,165, 52, 8,
-192,214,228,228,228,195,148, 82,238,121,242,138,167,167,231, 27,148,210, 47, 74,238,225,162,164,164,164, 61, 53,249,127,163, 70,
-141,194, 37, 18,137, 23,203,178,164,124,154, 84,180,205,243, 60,213,235,245,137,247,238,221, 11, 17, 30,251,191, 31,237, 3, 73,
-219, 38,245,148, 95,126,248, 86, 87,124,186,236,247, 15, 59,182, 32, 25, 86, 54,146,245,111,116,108,224,224,239,235,128, 5, 27,
- 47, 79, 1, 96,177,192, 34,132, 16,111,111,239, 64,119,119,247,122, 26,141,134, 3,128,102,205,154, 81,150,101,159, 58,207, 96,
- 48, 24,238,222,189,123, 88, 72, 1, 11, 11, 4,145,232,203,131, 7, 15, 42,121,158, 71,191,126,253,230, 1,216,246, 2,104,137,
- 76, 38,179,122,252,248, 49,140, 70, 35,227,227,227,163,168, 97, 25,229, 18, 17, 17, 1,131,193,160,111,215,174,157, 79,217, 99,
- 82,169,212,229,210,165, 75, 0,160, 15, 14, 14,246,169,109, 0,253,253,253,109,108,172,172,166,178,132,244,224, 40,109, 10, 0,
- 44, 33,119, 57, 74, 79, 22,106, 52, 43,163,162,162, 10, 95,246,180, 63,113,226, 4,198,143, 31,143, 91,183,110, 53, 57,124,248,
-240,247, 42,149,106, 82,114,114,114, 87, 74,105,186,240,100,252,195, 2,171,161, 82,209,196,195,197,249,208, 87,139,231, 3,192,
-236,170,132,144, 82,169,252,170, 83,167, 78, 99,127,253,245, 87,155,125,251,246,217,212,171, 87, 15, 18,137, 4, 44,203,130,101,
- 89, 48, 12, 3,150,101, 49,104,208, 32, 98,169,184, 42,203,121,234,212, 41,155,198,141, 27,151, 22,178,148,210, 82,145,213,175,
- 95,191,106, 57, 25,134,241,186,126,253,186,155, 92, 46, 47,253, 63,207,243, 79,125, 40,165,165, 31,142,227,208,169, 83, 39,139,
-238, 19,195, 48, 51,162,163,163, 95, 41, 44, 44,124,138,195,124, 13,243,239, 87, 94,121, 5, 0,142, 85,195,165,186,120,254,148,
- 27, 49,196, 2,166, 44, 80,214, 9,144,214, 7, 24, 89,133,231,103,101,101,161,107,215,174,108,109,210,215,213,213,117, 84,104,
-104,104,195,199,143, 31,191,182,100,201,146, 76,149, 74,245, 61,128, 31,213,106,117, 66,109,248, 40,165,139, 98, 99, 99, 27, 81,
- 74,225,235,235,187, 16, 64,141, 4, 22,203,178, 94, 39, 78,156,112,147, 74,165,165,233, 92,217, 55,199,113, 48, 24, 12,232,211,
-167,143, 73,120,228,255,161, 23, 13,193,194, 97, 3,123, 66, 99,100, 96, 52,154, 92,149,174,182,191, 76, 25,213, 89, 12,170,199,
-182, 63,174,195,104,226,127,170,169,184,234,219,183,175,207,250,245,235, 69,209,209,209, 34, 63, 63, 63,112, 28, 87,250,225,121,
-190, 70,207,165,128, 82,129, 69, 24,134, 65, 82, 82, 18, 20, 10,133,125,215,174, 93,213, 28,199,205, 58,119,238,220,182, 23,125,
-173,242,206, 22, 33,164, 80,173, 86,111,255,187,227, 28, 24, 24,216,201,206,218,250,247,249,115, 63,113,107,218,172, 57,227,236,
-234,140,135, 15, 19, 33, 21,209, 14, 15,239,221,111,179,112,233,119, 31, 4, 6, 6, 14,187,113,227,198,249,151, 45,189,125, 94,
-255,225,123,222,100,152, 80,188,229, 0, 96, 19,242,243,243,241,222,123,239,225,192,129, 3,126,109,219,182, 93, 6, 96,172,240,
-100,252,131, 2,171,129,167,149,167,173,204,230,248,198, 13,107,136, 49, 63,213,177,154, 7,106, 81,167, 78,157,222,254,245,215,
- 95, 29, 9, 33, 56, 53,249, 93, 56, 24,180, 80,125,249, 53, 28, 93, 92,161,159, 49, 30,182,156, 9, 45, 78, 71,214,228, 33,125,
-138,243,222,189,123,200,202,202,130,171,171, 43,172,173,173, 33,147,201, 32,145, 72, 32,149, 74, 45,229,132, 92, 46,199,137, 19,
- 39, 32, 18,137, 74, 63, 44,203, 86,184,237,238,238,110,241,189,226,121,126, 89,211,166, 77, 91,198,196,196,216,101,103,103,163,
- 93,187,118,121,132,144,155,101,132, 71,203,155, 55,111,218, 89,252,146, 50,196,162, 32,126, 3,104,246, 30,192,225,117,112,118,
-195,160, 69,253,167, 10, 25,179, 40,228,184,218,155, 78,233,233,233,134,115,231,206, 33, 48, 48, 16,191,255,254,187,115,118,118,
-246,151, 91,183,110,253, 66,165, 82,205, 86,171,213,203,106, 65,233, 4, 0,247,238,221, 3, 0,199,218,132, 73, 42,149,226,202,
-149, 43,160,148,150,138,114,134, 97,192, 48, 12, 14, 62,112, 65,161,158, 65, 81,234,109, 76, 25,224,131,122,245,234, 61,227,106,
- 9,248,123,208, 41,128,244, 11, 9,108,222,214,199,187, 14, 66, 47,133, 65, 34, 21, 59, 76, 28,221, 31,182, 10, 17,150,255,248,
- 39, 31,159,152,245,225,249, 72,186,205,194,103,147, 40,149,202,150,189,122,245,242, 94,191,126,189, 4, 0,110,223,190,141,228,
-228,100,184,185,185, 65, 46,151, 67, 44, 22,131,101, 89, 72, 36, 18,225,230,215, 0,193,193,193,205,122,247,238,109,195,113, 28,
-138,138,138,176, 97,195, 6,123,185, 92,110,223,191,127,127,139,157,172,138,154,237, 0, 52,213,233,116, 26,165, 82,105, 13,128,
-103, 24,166,160,188,179, 5, 0, 74,165,210,166, 2, 74, 19,128,140,224,224, 96, 79, 0,210, 18,190,210, 99,122,189,190,178, 99,
-150,198,185, 67, 72,160,223,225,133,139,230,218,164,164,222,135,189, 93, 10,120, 99, 26,190,255,254,123, 88, 89,217, 97,222,188,
- 89,162,253, 33,193, 30, 31,127, 50,243, 80,171, 86,173,250, 92,187,118,237,242,203,148,230,188,201, 48, 33, 32,164,125,233,246,
-182, 19,171,161,179, 15, 66,210,188,121, 88,181,106, 21, 26, 53,106,212, 90,120, 50,254, 65,129,213,188,142,189,131,140,136,143,
-255,176,126,165, 20,134, 66,199,123,215, 46,162, 89,223,247,205, 98,225,118,217, 23, 35, 0,198,221,221,125,226,246,237,219,237,
-204,133, 93, 99,194,193, 1, 6,212,245,247,135,181,189, 3, 82, 77, 6, 80,163, 1, 82,137,164,194, 2,209, 18, 78,134, 97, 32,
- 22,139,159,250, 72,165, 82,148,117, 59, 42,227, 44, 87,155, 3,203,178, 56,113,226, 4,140, 70, 35,134, 12, 25, 82,161,216,170,
-196,161,169,144, 51, 57, 57,249,152,167,167,231, 77, 74,233, 43, 60,207,131, 16,114, 51, 41, 41,169,179,249,184, 82,169,236, 29,
- 16, 16, 48,131,231,249,101,213,113, 82, 74, 1, 83, 38,104,214,118,216,182,203, 64,222,101, 23, 16,155, 30,224,224,131,219, 15,
- 82,112, 42,252, 9, 50,178, 10, 16,220,216, 13,189,218,249,130,231,121,139,195, 89, 22, 42,149,170,145,191,191,127, 83,163,209,
-136,115,231,206,129,227, 56,180,104,209, 2, 99,198,140, 97, 86,175, 94, 61, 6,192,178,154,114, 2,136,140,136,136,232,145,146,
-146, 2, 0,183, 44,112,188,110, 87, 36,132,127,254,249,103,104,181,218,103,206,119,236,188, 4,159,190,238,131, 49,147,183,225,
-235,152, 93, 88,183,110, 29,202,119,209,249, 43, 70,192, 8,156, 21,169, 34,140, 25, 58,248, 53,176, 18, 27,220,123,152,136,206,
-109,131,224,230,230,134,155,209, 15, 17,159,148,149, 74, 8,222,233,211, 65,182, 76,163,209,127,113,238, 6,253,177, 58, 78,165,
- 82, 89,127,211,166, 77,226,178,251, 36, 18, 73,169, 11, 94,214, 13, 47,223,100, 40,164, 81,197,156,193,193,193,205,122,246,236,
-121,126,238,220,185,182,241,241,241,184,120,241, 34,124,124,124,160,209,104, 80, 93,215,182,114,156,207, 52,219, 81, 74,121, 0,
-191,213, 38,156,161,161,161, 38, 0, 94, 21,157, 83,213, 49, 75,226,222,162, 69, 11,107,107,185,124,231,130,133,115,108, 34, 34,
- 14,163,125,135, 62,176,178,109, 8,147, 33, 17,153, 89, 5,200,126,160,198,210,165, 43,241,197, 23, 51,177,100,241, 66,219,225,
- 35,199,252,222,174, 93,187, 70,151, 47, 95,214,190, 44,233,206,136, 36,235, 35,195, 47, 77, 0,128,188,232,189,248,104, 68,123,
-228,231, 63,192, 7, 31,204, 65, 82, 82, 18,238,223,191, 31,241,119,134,243,165, 21, 88,132, 16, 74, 41,173, 81, 21,223,203,139,
-200,109, 57,171, 67,223,127,187,204,222, 86, 97,237, 26,126,124, 63,226,226, 82,170,252, 79, 81, 81,145,254,192,129, 3, 56, 62,
-105, 44, 26, 17, 19, 28,191, 92, 14, 55,149, 10,185, 99, 7,161,192,104, 64,131, 35, 97,144, 41, 20,144,218, 40, 44,118, 28,138,
-138,138,244,103,206,156,193,157, 59,119, 32, 18,137,160, 80, 40, 96, 99, 99, 3,153, 76, 86, 42,172,204, 47, 96, 75, 57, 41,165,
- 16,137, 68,184,125,251, 54,226,226,226,224,224,224,128,139, 23, 47,162, 71,143, 30, 79,137, 43,150,101,159,234,227, 85,131, 12,
- 95,161,163, 84,210,239,234,152,197, 68, 98, 23,192,233,109,228, 95, 81, 1,142, 35, 97,164,246,224, 41,143, 27, 15, 50,241,254,
-200, 87, 1, 0, 19,191,216,128, 30,109,234,149, 54, 65,214, 4,158,158,158,239,183,108,217,114,229,132, 9, 19, 24, 27, 27, 27,
-232,116, 58,232,116, 58,220,187,119, 15,206,206,206,176,182,182,150,212,242,129,127,172, 82,169, 32,151,203, 65, 41,125, 92, 27,
- 14, 66, 8,118,238,220, 89,225,177,119, 86, 70, 65, 84,220, 61, 11,235,215,175,135,201,100, 66, 77,243,183,128, 23,245,118,135,
-167,187,135, 23, 24,106,132, 58, 53, 3,131,250,245,130, 72,162,192,147,196, 12, 4,248,251, 42,223, 26,208, 65,201, 18, 19, 62,
-255,106,251, 68, 0, 63, 90,240,188,115,209,209,209,226,200,200, 72,176, 44, 11, 59, 59, 59, 88, 91, 91, 67, 34,145, 64, 38,147,
-149, 10, 43,193,193,170, 26,189,123,247,254,144,231,249, 89, 60,207,103,247,236,217, 83, 53,127,254,124,251,196,196, 68,220,190,
-125, 27,219,183,111,207,160,148,154, 74, 58,187,207,123,222,107, 89,224,108,129, 16, 82,227,126, 78,254,254,254, 18,147, 33,231,
- 35,123, 43,110,160,136,177,243, 49,229, 21, 60,206, 51, 50, 7, 98, 18,213,171, 41,165, 85,118, 9,144,137,197, 31,174, 90, 62,
-203,221,197,217,128,222,189, 7,226,209,227,108,204,156, 57, 4,121,121, 90,252,250,243, 10, 0, 82, 24, 76, 44,130, 90,247,129,
- 82,233,141,142,237, 59, 42,207, 93, 56, 55, 17,192,138,151, 37, 15,196,237,125,111, 34, 33,100, 97,157, 58,117,206,110, 88,186,
-180, 97,247,238,221, 1, 0,167, 78,157,194, 79, 35, 70, 96, 30, 48,106, 53, 33,201, 83, 40,157,249,119,133,169, 54, 90,228, 95,
- 45,176,204, 17,170, 73,196, 8, 33,164,129,187,237,174,249,179, 62,172, 87,167,190,175,199,213, 63,119, 34, 54, 54, 9,169,169,
-217,149, 21,168,148, 16,194, 19, 66,248,250,245,235,195,206,168,133, 61,213,195, 77,169,130,173,147, 51,178,141, 37,206,149,141,
- 13,164, 54, 10,139, 94,142,101, 57,253,253,253,145,154,154, 10,137, 68, 2,133, 66, 1, 91, 91,219, 82,129,101, 22, 87,150,190,
-112, 9, 33,224,121, 30, 34,145, 8, 55,111,222, 68,199,142, 29,225,237,237,141,223,127,255, 29,189,123,247,126,198,197,170, 77,
-211,147,185,207, 85, 89,231,138, 97,152, 25,150,116,110,127, 10,210, 6, 48,217,190, 9,198,186, 59, 12,212, 14, 58,170, 44,105,
- 18,164,248, 51, 44, 21, 49,113, 25, 79, 53, 23, 90, 46,158,189, 84,114,185,124,219,194,133, 11,187,133,132,132,192, 96, 48, 0,
- 0,172,173,173,161,211,233, 32, 22,139, 97, 48, 24,160,209,104,146,254,137,140,107,190,231,199,143, 31, 7, 33,164, 84,232,154,
-155, 10, 11,147, 19, 48,102,202,175,144,138,128,155, 55,111,162,105,211,166, 66,137,250, 15,193, 74, 46,119,150,202,237,193,155,
-180, 16,137,197,168,227, 93, 23, 60,167, 67,118, 94, 17,222,121,115, 0,174,223,138,194,225, 51, 87, 77, 70, 35,191,218, 82,206,
-198,141, 27, 35, 45, 45, 13, 44,203,194,214,214, 22, 54, 54, 54,104,210,164, 9, 18, 18, 18,158,114,177, 4, 84, 14,134, 97,102,
- 31, 62,124,216,157,101, 89, 15,147,201,132,132,132, 4,220,188,121, 19,107,214,172, 73, 45, 44, 44,236, 18, 17, 17, 17, 83, 11,
-218,202,154,237,158,233,172, 94, 27,103,171, 92,229,175, 97, 29,119,249,201,229, 95, 77,242,106, 17,208,138,200, 89, 69,110,209,
-195,180,142, 97, 87, 47,119,248,226,199,221, 31,186,187,187,119, 79, 77, 77,173,180,242,198, 50, 76,143, 38,205,154, 51, 60,159,
- 8, 86,210, 20,223,174,252, 20, 89,217,133, 40,200,215, 0,144, 66,111, 20, 65,167, 35,232,218,173, 59,126,223,121, 0,173, 66,
- 90,177, 44,195,244,122,153, 4, 22, 0,176, 44,187,108,255,254,253, 13,229,114, 57, 22, 47, 94, 12, 91, 91, 91, 92, 89,184, 16,
- 63, 73, 36,176, 2,176,222, 96,152, 1,224,111, 17, 88,181,209, 34,255, 9, 7,171,166,240,242,242, 90,209,182, 67,155, 87,234,
-251,183,146, 95, 61,186, 23, 15,238,199, 33, 35, 35, 23, 20,208, 84,165, 43, 8, 33, 84, 44, 22,195,237,243, 5,168,211,162, 5,
-138,198,191,129,108,163, 1,190,127, 94,129, 76,161,192,221,158, 65,160,122, 61, 58, 69,167, 90, 42, 92, 40, 33,132, 2,128,139,
-139, 11, 36, 18, 9,228,114, 57,228,114,121,105,223,171,178, 31, 75,197, 16,207,243,200,203,203,195,227,199,143, 49,126,252,120,
- 88, 91, 91,131, 16,130,212,212, 84,248,248,248,128,101, 89, 36, 37, 37,225,244,233,211,168, 95,191, 62,164, 82,105,141, 50, 67,
-153, 78,237, 45, 61, 61, 61,207, 18, 66, 90,134,135,135,219,133,132,132,160, 70, 14, 22,145, 64, 7, 31,112,240, 2, 79,255,215,
-215,202,104,122,186,242,102, 22, 89,150,192,195,195,195,175,121,243,230,151,215,172, 89,109,235,230,230, 14,158,231, 96, 52, 26,
-145,155,155,135,162,162, 34,212,169, 83, 7, 54, 54, 54,116,249,242,229,132,227,184,127,108, 40,175, 89, 80,153, 29, 68,115,255,
- 43,134, 97, 48,101, 96, 29,100,103,219,130,101,139,183, 45,141,187,128, 23, 15, 27, 27, 91, 39,145,196, 6, 60, 35,130,189,189,
- 35, 68, 82, 27,240, 38, 17, 56, 30,176,181,119,193,165,235,247,112,249, 86,254,251,105,153,216,101,193,115, 67,155, 55,111, 78,
- 89,150,133,155,155, 91,169,152, 18,139,139, 91, 12,221,221,221,145,151,151, 7,150,101, 75,247, 9,168,186, 34,249,228,201, 19,
- 20, 22, 22,226,202,149, 43,216,185,115,103,122,121,113,213,171, 87,175, 9,214,214,214, 95,104,181,218,197, 71,143, 30,253,190,
- 42,206,154, 54,219,213,198,249,138,136,136,104, 28, 28, 28, 44,246,114,147, 28, 62,178,119,165,151, 29,119,157,224,201, 56, 32,
- 38, 47, 90, 17,230,214,190,123,235,254,196,127,193,199, 62,131,230,172, 60, 66, 8,241,171,108,196, 51, 5,154,203,173,228, 0,
- 37,184,120,225,104,113,179, 96, 86, 62, 10, 10,181,208, 25, 88,232,244, 4, 90, 3, 65,247, 30,125,176,233,199, 29, 72, 78,203,
- 6, 5, 90,188,108,249,160, 81,163, 70,193,158,158,158,248,248,227,143,161,221,190, 29, 5, 0,250, 3,216, 95, 82,169,182, 5,
-166, 9, 79,203,223, 40,176,188,188,188, 62, 12, 8, 8,120,111,243,214, 95, 21, 95,205,249, 60, 47, 59,250, 22,171,215, 24,108,
-116, 70,163,254, 97,114,230,234,170, 94,142, 77,155, 54, 45,174,117, 58, 56,194,218,206, 30,186,114,206, 21,213,235,193, 27,244,
-144, 88,248,114, 52,115, 82, 74, 97,101,101, 5,169, 84, 90,161,115, 85, 19, 7, 11, 0,114,114,114,176,115,231, 78,180,110,221,
- 26,214,214,214, 96, 89, 22, 45, 91,182, 68,116,116, 52,124,125,125, 1, 0,251,247,239,199,235,175,191,142, 7, 15, 30,192,207,
-207,175, 38, 67,143, 75,155, 8,143, 31, 63,110, 71, 41,125,133, 82,138,244,244,218,141,134,229, 56, 14,133,133,133, 56,126,252,
- 56,212,106, 53, 60, 60, 60,144,155,107, 11, 59, 21, 95, 42, 22,205, 31, 11, 95,188,159,191,251,238,187,182, 10,133, 2, 28,103,
-130, 88, 44, 46, 21,174, 98,177, 4,247,238,221,195,136, 17, 35,114,159, 60,121,242, 89,109, 70,253, 16, 66,136,151,151,210, 61,
- 55, 55, 27,249,121, 57, 96, 89,120, 19, 66,216,218, 76,253,192, 48, 76,233,183,249, 67, 8,129, 68,204,194,195,221,181,180,227,
-123,137,123, 39, 52, 17,254,125,133,183, 13,128, 97, 0,222,238,210,218, 94,148,149,175, 1, 76,122, 60,126,242, 24, 57,133, 6,
- 80,147, 17,241,137,201, 40,212,241,200,204,202, 71, 64,112,239, 53,103,206,156,153, 77, 8,153, 69, 41, 61,100, 73,158,191,118,
-237, 26,206,157, 59,135, 11, 23, 46,192,220, 81, 26, 0,236,236,236,112,226,196, 9,116,237,218, 85, 72,136, 42, 96, 48, 24, 22,
-247,234,213,107,150,135,135,135,124,197,138, 21,246,117,234,212, 1, 33, 36,175,188,115, 21, 18, 18, 50,123,198,140, 25,202, 33,
- 67,134, 76, 1,240,125, 45, 47, 87, 85,103,245, 42,203,168,138,166, 98, 72, 75, 75,153,176,113,219, 24, 87, 27,241, 99, 53,158,
-124, 91, 34,190, 88,160, 40, 15, 56,243, 43, 36,175, 44,120, 50,178,219, 68, 55,117,254,234,119, 1,108,170, 36,147,242,247, 98,
-226,176,110,221, 42,124,241,197, 68,108,255,117, 21,120, 42, 65,126,161, 17,238,170, 64,232,141, 60, 8, 35, 70,187,246,157,112,
-225,210, 85,128, 51, 96,202,248,203, 47,221, 92,107,247,239,223, 15,139,139,139,107, 58,103,206, 28,108,241,244,132,173,173, 45,
-166,206,157,123,217,100, 50,181, 23,158,146, 23, 32,176,106, 98,201,121,121,121, 13, 86, 42,149, 95,253,250,235,175, 86,106,181,
- 26,170, 70,205,236, 14,238,222,169,115, 83, 72, 52,201, 89,217,163,111, 36, 21, 84, 59,220,158, 97, 24,152, 22, 78, 69,166, 73,
-143,122, 7, 47, 65,166, 80, 32,166,119, 8,168, 94,143,246, 17, 79, 32, 83, 40, 32,146, 91,213, 56, 50, 21, 57, 86,101, 63,230,
-194,184, 58,232,245,122,135, 30, 61,122,160,123,247,238,120,227,141, 55, 74,155, 2, 3, 3, 3,177, 99,199, 14, 12, 30, 60, 24,
-145,145,145, 80,169, 84,104,210,164, 9,154, 52,105,130, 51,103,206,212, 40,172,102, 7,171,119,239,222,121,132,144,155,148,210,
-150, 97, 97, 97,118, 53,229, 48, 11,168,227,199,143,227,213, 87, 95,133,175,175, 47,174, 95,191,142, 19, 11,150, 67,164,112, 1,
- 24, 55, 80,158,150, 58, 91,150,244,193,146, 72, 36, 29,235,215,175,143,148,148, 84,200,100, 50, 56, 58, 58,192,202,202, 10, 50,
-153, 28, 75,151, 46,229, 55,109,218,180,150, 16,178, 64,173, 86,103,213, 66,156, 55, 8, 8, 8,248,121,244,168,145,109,156,157,
- 93,224,238,174,196,140,233, 51,251,108,223,241,251, 29, 79, 79,207,225, 73, 73, 73,183, 44,229, 34,132, 64,175,215,131,101, 89,
-236,143,113, 69,161,158, 32, 47, 49, 2, 31, 13,244, 41, 21, 91,230,166, 94,243,244, 23, 2,254, 30,176, 44,187,101,234,212,169,
- 93,134, 14, 29, 74, 36,140, 81,127,226,216, 54, 17,199,153,200,167,179,126,224, 66,207,159,101, 56,206, 68,222, 24, 49,141, 63,
-124,250, 22,243,254,148,229, 92, 96,219, 87,113,251,246,109,143,254,253,251, 47, 2, 96,145,192, 50,167,113, 37,215, 23,154, 8,
-171,193,201,147, 39,215, 2, 88,219,171, 87,175, 20,107,107,107, 20, 20, 20, 60,211, 79,209,223,223,223,166, 89,179,102, 18,169,
- 84,138,224,224, 96,215, 94,189,122,197, 16, 66, 86, 28, 59,118,108,115, 77,174, 85,145,179,245, 60,211, 52,216, 58,113, 3, 90,
-180,106, 98,123,207,102,142,173,149, 88,123,163,110,140,220,142, 0,200,213,120, 60,186,152, 56,188,128, 73, 99, 3, 90,116,243,
-135,173,216,122, 96,101, 2,139, 0, 55, 11,243,243,123, 21,105, 76, 56, 27, 26,137, 33, 67,234, 64,107, 96,160,209, 50, 48, 24,
- 41, 24, 86, 2,194, 74, 48,122,236,123,208,155,120,228, 36, 39,131, 0,145, 47, 91, 62,224, 56,110,198,160, 65,131, 90, 45, 94,
-188,216,111,234,212,169, 0, 0,149, 74,213, 78,165, 82, 69,253,221,243, 96,189, 76,205,131, 79, 57, 88,213, 69,172, 75,151, 46,
-155,141, 70,227,107, 54, 54, 54,142,239,189,247,158, 33, 35, 35, 3,251,246,237,195, 79, 63,253, 84, 84,104,100,195,115, 50, 77,
-163, 30,169, 11, 18, 45, 41, 20, 25,134,129,196,104, 4, 53,253,207,185,226,117,186, 82, 39, 75,108,101, 93,211,218, 50, 40,165,
- 21,138, 42,179,147, 85,147,151,173, 76, 38,203,185,112,225,130, 91, 98, 98,226, 83, 29,218,235,213,171, 7, 0, 8, 11, 11,195,
-149, 43, 87, 48,124,248,112,136, 68, 34, 72, 36, 18,220,188,121, 51,191, 38, 97, 54, 11, 30,243, 40, 66,165, 82,217,187, 77,155,
- 54, 21,142, 30,180,132, 43, 62, 62, 30,190,190,190,208,233,116,112,112,112, 64,102,242, 99,196, 63,142, 69,145, 46, 6,245, 61,
-228, 72, 75, 75,131, 76, 38,179,244,129,227,204, 5,151, 78,167, 67,114,114, 10, 84, 42, 21,126,249,229, 87,108,222,188,121,184,
- 90,173,222, 85,211, 48, 18, 66, 68, 74,165,114, 90,255,254,253, 23,189,246,218,107,162,162,194, 2, 80,190, 88,240, 72,164, 18,
-124,247,221,119, 77, 78,159, 62,125,195,211,211,115,137, 92, 46, 95,244,240,225, 67,125,117,105, 14, 0, 91,182,108, 1, 0, 88,
-183,157,139, 25, 67,235,226,237,137,219,176, 98,197,222,167,226,202,178, 44,230,207,159, 47,148,168,127, 35,218,182,109, 27, 56,
-107,214, 44,177,185, 79,156,170,206, 98,147,193, 96,224, 1,160,105,203, 87,254,231, 84,246, 6, 30, 60,120,128, 21, 43, 86,160,
-176,176, 16, 34,145,200, 98,155,185, 71,143, 30,232,221,187,119,105, 51,161,139,139, 11, 12, 6, 3, 76, 38,147, 32,174,106,232,
-100,189,250,234,171,179,120,158,167, 60,207,207, 49,239, 15, 14, 14,182,170, 83,167,206,197, 85,171, 86, 57,155, 76, 38, 76,155,
- 54,205, 33, 35, 35,195, 97,210,164, 73, 51, 1,108,174,164,156,168,201,236,234, 22, 77,211, 80, 81,159, 46, 66, 72,125, 27, 27,
-123,164, 35, 5, 57, 46,198,192, 28,103, 83,214,241,228,247,111,122, 39, 4, 52,181,226,140,190, 76,158, 30,246, 86,118, 0, 79,
- 27, 85,250,158,227,249,227,209,119,162,186,123,121,250,178, 7, 14,134,226,213, 1,131,161,213, 19,104, 13, 12, 8, 43, 6, 97,
- 37,104,213,166, 61,234,249, 54, 6,207, 3, 81,145, 17, 6, 35,207, 31,121,153,210,222,231,245, 31,190,247, 26,176,110, 2, 0,
- 76,251,238, 20,102, 47,252, 22, 35,223,232,141, 49, 99,198,252, 99,243, 96,189,180,125,176,170, 16, 87,239, 56, 58, 58,142, 24,
- 59,118,172, 85, 88, 88, 24, 22, 46, 92, 40, 58,113,226,132,225,218,181,107, 38,142,227,166, 37, 37, 37,109,172,201, 69, 25,134,
- 65,253, 95,255,132,202,195, 3,247,251,180,122,202,185, 58,219,210, 11,188, 78,135,158,177,185, 53,142,140,185, 41,203, 44,172,
-204,226,170,178,169, 20,170,169,129, 87, 56,239,213, 7, 31,124,128,205,155, 55,163,125,251,246,104,216,176, 33, 68, 34, 81,105,
-179, 84,109, 28, 44, 51,106, 60,122,176, 92,109,190, 78,157, 58,184,117,235, 22,236,237,237,241,243,207, 63,195,219,203, 19,163,
-122,213,131, 94,175,135,209,104, 68, 97, 97,161,217,193,170, 54,160, 60,207,223,217,183,111,159,239,208,161, 67,169, 72, 36, 34,
- 58,157, 14, 0,176,122,245,234, 52,181, 90,189,167,166,225,243,244,244,124,163,126,253,250, 63, 14, 31, 62,220,182, 73,147, 38,
- 72, 77, 77,197,213,171,151, 49,115,230,140,171, 98,177, 72,219,167,111,191, 46,126,126,205, 48,113,226, 68, 38, 48, 48,240,139,
-153, 51,103, 78,243,246,246, 30,147,144,144,176,179, 58,145,181, 99,199, 14, 0,192,187,223,221,133, 94,111, 4, 80, 60,106,208,
-195,195,227,169,115, 31, 62,124, 40,140, 34,252, 27, 97, 50,153, 40,195, 48, 36, 33, 33,193, 96,109,109, 77,156,156,156, 68, 50,
-153, 12, 58,157,174, 84,104, 61,120,240, 0,135, 14, 29, 66, 98, 98, 34,156,156,156, 24,123,123,123,152, 76,166,108, 75,243,124,
-217,209,130,102, 65, 37,136,171,154, 35, 52, 52,116, 45,128,181,101,132,235,120, 66,200,116,133, 66, 97,183,121,243,102, 7, 59,
- 59, 59,114,232,208, 33,253,134, 13, 27, 10, 88,150,205, 6,176,188,170, 50,229, 69,205,174, 94,153,243, 5, 0,156, 9,247,179,
- 11, 98,125,196, 10, 37, 31,169, 37,151, 62, 78,152,209, 52,155,105,228, 78,154, 53, 51, 13, 73,187,115,113,148,241, 81,251,244,
-212, 52,194, 81,122,183, 50,238,236,220,220,239,127,220,250,251, 71,251,246,108,171, 35,183,179,198,200,183, 63,196,241,147,231,
- 33,149, 89,227,106,248, 13,232, 13, 28,158,196, 39, 97,248, 91, 35,161,116,115, 6, 91,164, 78,214,233,245, 27, 95,166,180,127,
-106, 30,172,144,246,184,184,119, 57,118,196,212, 65,210,194,133,255,232, 60, 88, 47,157,131, 85, 25,218,180,105, 99,171,211,233,
-190,251,228,147, 79,172, 10, 11, 11,145,145,145,129,204,204, 76, 92,189,122,245,132,209,104,252,168,170, 81, 26, 21,173,182,109,
- 30,241,229,228,234, 6,153,194, 22, 84,175, 47,117,174, 36,214, 54,224,117, 58,240, 6, 61, 80, 73,115, 78,101,156,132,144,103,
- 92, 43, 75,197, 85,121, 78,179, 35, 86,209,164,162,222,222,222, 88,178,100,201, 51,211, 52, 88, 18,206,146, 90, 90,111, 66, 72,
- 75,179,243, 68, 41,109,169, 84, 42,123, 91, 50,114,176, 50, 78,158,231,209,185,115,103,156, 56,113, 2,183,110,221, 2,195, 48,
-232,219,183, 47, 8, 33,176,183,183,135, 72, 36, 42, 21,115,230, 1, 1, 85,113,114, 28,247,246, 79, 63,253,244,233,145, 35, 71,
- 62,159, 60,121,178,213, 43,175,188, 98,238,231,149, 94, 50,242,167, 70,225,228,121,126,222,205,155, 55,109, 77, 38, 19, 22, 47,
- 94,140,240,240,240,194,135, 15, 31,126,146,156,156,252, 35,165,148, 42,149,202,145,143, 30, 61, 94,247,229,151, 95,218,118,235,
-214, 13, 97, 97, 97,114,111,111,239, 47, 1,236,172, 46,238, 87,175, 94, 5,203,178, 48,101,197, 97,226,140,223,161,176, 22,227,
-222,189,123,200,204,204, 44,205,107,149, 53, 37,253,127, 94,181,254,175,230,188,118,237,218,238,181,107,215,126, 48,122,244,104,
- 9,165,148,139,139,139, 51, 2, 32, 30, 30, 30,236,181,107,215,248, 63,254,248, 3, 26,141, 6, 94, 94, 94,140,167,167, 39, 57,
-113,226, 4, 31, 29, 29,125,149, 82, 58,203,210,112,150, 21, 87, 98,177, 24, 26,141,198, 34,113, 37,164, 81,181,156,115,247,238,
-221,171,212,106,181,144, 74,165,216,181,107,151, 97,219,182,109, 81,121,121,121,157, 34, 34, 34, 52,181,225,172,233, 52, 13,213,
-113,230,103, 51,135, 78, 28,143,106,105,236,250, 3,153,156,146,217,177,180, 96, 38,196,101,151,123,115, 23,121,235,128, 36,197,
-185,111,152, 2, 90,244, 71,101,156, 15, 31, 62,212, 7, 5, 5,189, 62,245,211, 57,103, 22,206,155,107,187,236,235,175,112,251,
-213, 33,200,201, 45,130, 78,207,193, 96,226, 49,111,222, 2,184, 57, 57,192, 81, 98, 40,200,209,144,215,163,162,162, 12, 47, 83,
-186, 63,207, 60, 88,127, 69, 56, 95, 54, 84,171, 62,138,138,138, 22, 54,110,220, 88, 26, 29, 29,141,135, 15, 31, 34, 38, 38, 6,
- 28,199, 61, 72, 76, 76,236, 95,219,139, 50, 12, 3,123,123,123, 72,165, 82,180,187,149, 4,169, 68, 2,169, 77,113, 31,241,158,
-177,185, 0,165, 96,164,178, 26,115,150,159,243,234,121, 70, 17,113, 28, 87, 58, 67,187, 89,192, 85, 52, 90,173,166,206, 21,195,
- 48, 51, 46, 95,190,108, 23, 23, 23, 7, 74, 41,246,238,221,107,247,198, 27,111,204,168,141,123, 69, 41, 69,102,102, 38,120,158,
-135, 88, 44, 70,183,110,221, 16, 20, 20,132,130,130, 2,112, 28, 87,218,124, 41,145, 72,106, 52,138, 48, 53, 53,181, 8,192,124,
- 87, 87,215,141, 95,124,241,197,252,230,205,155,191,247,241,199, 31, 51,168,229,160, 8, 66,136,201,100, 50, 97,215,174, 93,216,
-179,103, 79, 62,165,180,177, 90,173, 78, 41,227,222,253,234,238,238,126, 98,240,224,193, 15, 30, 61,122,100,151,155,155, 11, 20,
-119,138,173, 46,111,162, 97,195,134,224, 56, 14, 95, 77,244, 66,126,126, 11,112, 28, 7,147,201, 4,107,107,235,167,150, 32, 18,
-102,113,255,123,193,113,220, 76, 66,200,209, 37, 75,150,204,152, 50,101, 74,155,209,163, 71,139, 37, 18, 9,159,148,148,100,218,
-190,125, 59,105,212,168, 17, 35, 22,139,201,241,227,199,249,176,176,176, 43, 38,147,233, 43, 74,105,141,150, 34, 41, 43,174,132,
- 62, 87, 47, 20, 59,135, 14, 29, 58,122,200,144, 33, 86,129,129,129,178,159,126,250, 41,167,176,176,176, 66,113, 85,145,121, 89,
-217, 52, 13, 47, 98, 2,210, 50,239,140,141, 11,230,158,155, 56,178,225,136, 70,239, 57,215,197,201,194, 52,100,139, 89,198,206,
-129, 65,160, 15,139,162,156, 71,110, 39,195,246,198, 36, 39, 39,111,169,138,231,250,245,235,215, 67, 66, 66, 58,191,253,206,187,
-251,198,142, 30,171,250,252,227,143,196,135, 78,156, 1,103,212,225,252,169, 83,112, 81, 48,156,161, 48, 85,157,107,100, 6, 69,
- 68, 68,188,116,253,175,226,246,190, 55, 17,192, 68, 66,200,240,185,115,231,110,159, 56,113, 34,120,158, 71,104,104, 40,214, 77,
-159,142,121, 28, 55,106, 53, 33, 69, 83, 40,157, 40, 60, 22, 47, 80, 96,181,110,221,186,110, 97, 97,225,207, 70,163, 49,144,231,
-121,233,217,179,103,161,213,106, 17, 29, 29,173,225,121,126,247,243,164,105,223,190,125,153,242,235,197, 85,242,146,182,180,115,
- 93, 92,143, 30, 61, 94, 24, 39,207,243,137,101,215, 48,171,140,183,236,182,201,100, 74,180, 36,160, 60,207, 47,107,215,174,221,
- 51,251,106,101,239,242,124,108,247,238,221, 13,229, 69, 87, 69,191,203,196, 63,209, 82,254,244,244,244, 84, 0,239, 43,149,202,
- 85, 99,198,140,153, 11,224, 65, 45, 5,214, 34, 63, 63,191, 47,138,127,146,133, 73, 73, 73, 41, 21,136,186,116, 79, 79,207,247,
-188,189,189, 75, 23,128,174, 46,238, 61,123,246, 52, 84,183,200,115, 89,231,138,231,249, 68,225,145,255,251, 80, 34,152,206, 19,
- 66, 58,173, 91,183,110,230, 7, 31,124,208,122,216,176, 97,162,206,157, 59,227,240,225,195, 92,104,104,232, 85,141, 70,179,172,
-166,194,138, 16, 82, 80,254, 25,170, 34, 12, 90, 33, 37,106,134,147, 39, 79, 78,237,208,161,195,220,157, 59,119, 62,241,241,241,
-145, 17, 66, 76, 22,138,171, 23, 62, 77, 67, 21,233,106,242,246,246, 30,240,235,136, 15, 14, 5, 78,126,215,167,119,251, 96,185,
- 87, 3,165,199,189,184, 76, 36,220, 60,161,121,116,118,221, 99,170,205, 28, 96,137,227, 30, 30, 30, 30,217,160, 65,131,198, 27,
-127,218,252,174,132,101,123,242,148, 6,125, 54,105, 20, 24, 66,174, 27, 56,238, 68, 94,126,254,143,213,245, 9,253,175, 67, 38,
-145,140,154, 52,105, 18,126,249,229, 23,236, 91,181, 10,189, 19, 19,177, 67, 34,129,149, 68,130,245, 6,195, 4, 0,130,192,170,
- 77,217, 87,217,200,170, 38, 77,154,236,200,202,202, 26,146,151,151,103, 50,153, 76, 28, 33,196, 68, 8,209,240, 60,191,128,231,
-249, 13,212,130, 33, 89,130, 21, 47,112, 10,156, 2,103,153,227,157,236,236,236, 62,230,121, 30, 5, 5, 5,171, 44, 17, 86,194,
-253,252,231, 56,187,117,235,182,146, 97,152, 54, 28,199,109, 61,115,230,204,166,231,225,172, 97,231,119,139,195, 73, 8, 17,121,
-120,120,140,165,142,138,254, 48,138, 26, 82, 3,123,143, 53,100, 29, 74, 78, 78,222, 82, 94, 92, 9,233, 94, 57,103, 76, 76, 12,
-117,114,114, 66, 86, 86, 22,246, 52,105,242,212, 49, 91, 96,125, 69, 14,214, 63,208, 68,216, 10,128,107,201,239, 12, 0,247, 0,
- 4, 3,176, 2,160, 3, 80, 0,192,165,204,249,153, 37,199,204,199,207, 1, 48,254,221,181,204,191,236, 3,160,185,192, 41,112,
- 10,156, 2,167,192, 41,112, 10,156, 2,231,115,126, 94, 5, 64, 1,208, 25, 51,102,204,164,148,246,153, 49, 99,198,204, 50,219,
-165,199,139,165, 13,125,181,220,241, 86,127,115,120,193, 64,128, 0, 1, 2, 4, 8, 16, 32,224, 63, 0, 74,105,255,101,203,150,
- 45, 1,192, 46, 91,182,108, 73,153,109, 80, 74,251,151,253, 46,119,220,245,239, 14, 43, 1,208,188,146, 72, 88,108,253, 17, 66,
-154,215,226, 38,221, 22, 56, 5, 78,129, 83,224, 20, 56, 5, 78,129,243,255, 23,103,117,220,149,252,255, 85, 66,200, 33, 74,105,
-255,178,223,101,133, 87, 9,231,161,178,191,203, 29,255,243,239, 86,131, 66, 19,161,192, 41,112, 10,156, 2,167,192, 41,112, 10,
-156,255,250, 38,194,170,190, 43,251, 93,102,223,223,218, 68, 88,249,176,251,221,187,217, 36, 63,216, 73,173,172, 37, 0,160,215,
- 20, 25, 60,163,145,135, 33, 67, 56, 8, 16, 32, 64,128, 0, 1, 2, 4,252,205, 32,132, 28,154, 49, 99,198,172,255, 66, 88, 69,
-149,137,171,140, 16,107, 23,145, 46,187, 49,103, 50, 52, 5, 0, 17, 67,239,102,132, 56,198,184,236,222,157,241,162, 69, 86,223,
-190,125,103, 81, 74,221,197, 98,241,159, 30, 30, 30,161, 27, 55,110, 52, 10,217,232, 31, 65,181,125,242,130,131,131, 29,117, 58,
-221,114,158,231,187,149,172,243, 23, 42,145, 72, 62,189,113,227, 70, 22,128, 74,135, 68,251,248,248,108,247,245,245,109, 76,139,
- 1, 0, 79,205,203,101,222,103, 62, 30, 31, 31,127, 63, 33, 33,225, 45, 75, 3, 94,167, 78,157,122,114,185,252, 29, 66,136, 95,
- 9, 79,180, 86,171,221, 26, 31, 31,255,248,255, 91, 34,170, 84, 42, 43, 74,233,107, 98,177,120,180,147,147, 83,235,244,244,244,
-121, 73, 73, 73,223,214,242,101, 38, 2, 48,205,193,193, 97,184,131,131, 67,253,172,172,172, 71,121,121,121, 59, 1,172,160,148,
- 86,251,156, 46,252,208,179,237, 43,253, 58,207, 57,119,248,236,194, 57,107,147,174,148, 63, 62,255, 83,149,115,183,238, 29,230,
- 28,249,243,210,130, 37,107,147,178,106, 24, 54,166, 76,158,229,205,217,231, 95,156, 46,129, 0,166,115, 28, 39,102, 24,230,219,
-228,228,228, 11,255,246,188,212,180,105,211,207,165, 82,233, 4,134, 97, 30,165,166,166,142, 85,171,213, 47,100,170, 19, 66, 8,
-227,227,227, 99, 27, 23, 23,151,111,201, 84, 10, 2,138,209,174, 93,187, 84,131,193,224, 86,213, 57, 18,137, 36,237,242,229,203,
-238, 47, 97,244, 51,204, 77,127, 0,210, 0,176, 37,219,250,146,239,212, 50,251, 82, 43, 57,254,207, 11,172, 36, 63,216,137,116,
-217,141, 51, 83,163,134,165, 39,223,120, 19, 0, 92,149,129, 59,157,221,253,127, 79,242,147, 26, 90, 53,125, 93, 33,182, 22,125,
-207,178,226, 64,173, 94,231, 34, 22,137, 51, 12, 38,227, 13, 70, 79, 39, 38,223,221, 27,111,201,133, 7, 12, 24,208, 24,128,125,
- 80, 80,208, 53,189, 94,223,250,219,111,191, 85,238,217,179,167,101, 68, 68,196,136,129, 3, 7, 30,164,148, 30, 59,120,240,160,
-166, 70, 15,109,151, 46, 34,183, 28,167, 81,172, 72, 52, 0, 64, 75, 74, 1, 16,246, 38,111, 52,252,153,230,152,185,149, 22,207,
-209, 82,187,140, 29,236,220,152,240,134,207,196, 44,237,100,228,200,121,202, 72,150, 95,142,200,140,177, 92, 0,168,122, 72, 69,
-228, 7, 0,208,155,232,123,241,241,234,147,207,115, 94, 37, 47,240,158, 0,126, 37,132,136, 1,172,231, 56,110,127,106,106,106,
- 36,165,212,244, 34, 50,139,191,191,191, 43, 33,228,230,202,149, 43,157,219,180,105,195,242, 60,143,211,167, 79,191,245,197, 23,
- 95,244,110,214,172, 89,243, 59,119,238,164, 85,246, 95, 95, 95,223,198,167, 78,157, 10, 56,122,244, 40,218,183,111, 15,158,231,
-193,243, 60, 28, 28, 28,240,199, 31,127,160, 77,155, 54,165,251,220,221,221,209,185,115,103,139,195,229,235,235,251, 90, 96, 80,
-171, 41,159,124, 54,221,221,205,217,197,214,196,153, 12, 73, 73,201,170, 85,223,126,213,214,215,215,247,251, 71,143, 30,237,175,
- 69, 1, 64,188,188,188,134,137,197,226,254, 0,252, 74,118, 71, 27,141,198, 67,137,137,137,191, 91, 90,144, 7, 4, 4,156, 99,
- 24,166,110, 77,174,205,113, 92,252,205,155, 55, 59,214, 38,141, 60, 61, 61,135,122,122,122,254,212,182,109, 91,235,192,192, 64,
- 72, 36, 18,124,253,245,215,211, 0,124,107,137,144,178,182,182, 30,102, 99, 99,227, 91, 80, 80,240, 80,163,209,236,145, 74,165,
- 61,190,251,238, 59,239, 14, 29, 58,216,166,166,166, 18,150,101,221, 15, 30, 60, 56,106,205,154, 53,189, 9, 33,221,171,203, 91,
-217,143,248, 57, 50,113,211, 78,217, 15,207,204, 1,208,183,252,113,147, 86, 62,154, 21,123,247,103,233,245, 4, 0, 43,106, 82,
- 64,123,121,121,125,231,238,238, 62, 70,163,209,104, 9, 33,148, 16, 66, 91,180,104, 97, 62, 14, 0,208,235,245,217,247,238,221,
-107, 82, 21, 87,189,118, 78,225, 44,195, 86, 58,119, 19,199,115,137,143, 47,103,133, 60,239,243, 67, 41,253, 56, 50, 50,114,136,
- 72, 36, 34, 1, 1, 1, 54,132,144,222,150,138, 11,149, 74,213,152, 16, 50,155, 82,122, 45, 57, 57,249,123, 74, 41,231,233,233,
-217,149, 82,250,121, 73,124,191, 78, 74, 74, 58, 83,146, 7,190,111,216,176,225,192, 7, 15, 30,172, 79, 74, 74, 90, 84,219,240,
- 54,106,212,104,226, 71, 31,125, 52,119,194,132, 9, 86,153,153,153, 62,189,122,245,250, 13, 64,167,231,185, 7,193,193,193,226,
-148,148,148,105, 45, 91,182,156,220,170, 85, 43,101, 84, 84, 84,138, 74,165, 90,237,225,225,177, 34, 34, 34,162, 90,193,222,178,
-101, 75,149, 72, 36, 26, 3, 96, 84, 73, 1,186, 3,192,214,235,215,175, 63,250,255, 32,176, 12, 6,131,219,201, 69,115, 64, 88,
- 22,242, 78, 61,192,243, 60, 50,150,207,133, 41, 43, 3, 46,139, 86,195,100, 50,161, 71,143, 30,110, 47,105,244,195,254,107, 1,
-174, 80, 96, 73,173,172, 37,156,201,208, 52, 61,249,198,155,173,251,172,182, 7,128,176,163, 83,222,116,246,108,118, 91, 42,178,
-142,145,217,201,247,190, 62,160, 71,224,144,254,157,137,151,210, 13,137,201,105,238, 63,238, 56,214,231,208,177, 51,123, 81, 60,
- 47, 69,181,200,203,203, 91,236,227,227,227,122,234,212,169, 39, 82,169,212, 74, 46,151,147,161, 67,135, 90,141, 24, 49,194,255,
-244,233,211,190, 71,143, 30, 29, 50,104,208,160,163, 18,137,228,207, 93,187,118, 85,187, 62,153,123,139,193,254, 30, 34,143,221,
-131, 94,235, 91,247,213,158,110, 82, 31, 15, 87,240,188, 28,247, 98, 13,117, 78,156,191,222,231,240,209,227,159,185,249, 15, 30,
-154, 22,181,239,150,165, 55,167,121,115,123, 7, 43,134, 78,181,146,210,225,125, 58,249,215, 27,208,183, 61,169,223,160, 62, 98,
-162, 99,124,207,156,189, 54,166,107,107,219,199, 26, 61,217,161,225,201,202,219,183,115,115,170,226,146,138,200,150,155,119, 30,
-168, 56,142,195,215, 95, 45, 57, 49,123,246,236,210,217,213,205, 31,142,227,240,234,171,131,240,205, 55,223, 64,167,211,161, 85,
- 96,179, 45,248,223,188, 49,150,224,183,168,168, 40,231,162,162, 34, 28, 61,122,116,102,114,114,242,204, 99,199,142, 37,171, 84,
-170,207,146,147,147,119,188,128,218,253,218,245,235,215, 59,183,110,221,154, 53, 24,138,231, 55,237,208,161, 3, 59,107,214, 44,
-167,165, 75,151,174, 2, 48,188,138,194,133, 30, 61,122, 20, 63,255,252,115,198, 87, 95,125,149, 8, 0, 46, 46, 46,158,111,189,
-245,150,235,175,191,254,154,190,114,229,202, 68, 74, 41,156,157,157,189,134, 13, 27,230,106,105, 80,189,189,189,235, 7,183,106,
- 51,101,235,150, 45,109,114,179,178,180, 63,172, 92,127, 93, 39,146, 21,249,248, 53,150,204,153,187,200,126,193,151, 51,223,247,
-246,246,190,157,144,144, 16,107,105, 36,149, 74,101,157,186,117,235,238,157, 53,107, 86,243,142, 29, 59,138,221,220,220,144,154,
-154,138,123,247,238, 53,191,120,241,226,107,251,247,239,159,166, 84, 42, 95, 79, 78, 78,174,182, 50, 65, 41,109,116,224,235, 37,
-110, 50,103, 23,240, 70, 35, 28, 91, 4,150, 30, 83,159, 62, 6,222,104, 4,111, 52,194,251,213,215, 74,157,188,174, 93,187,214,
-106, 74,114, 47, 47, 47, 85,227,198,141,127,153, 49, 99,134, 68,167,211,225,198,141, 27,184,124,249, 50,159,150,150,182,172, 58,
-113, 69, 8, 57, 62,119,238, 92,175,142, 29, 59,218,102,100,100,128,227, 56,151,253,251,247, 79, 12, 10, 10,178,243,242,242,146,
-110,219,182,205,188, 66,128,147,175,175,175,211,136, 17, 35,244, 63,255,252,243, 52, 0, 95, 85,230, 92,229, 60,228,231,164,136,
-124,251, 52, 9,121, 7, 41,162, 99,125,166,246, 86, 30,113,240,101, 74,157,172,190, 13, 26,216,214,111,106, 61, 93, 97,215,220,
- 41, 55,233,196,244,190, 13, 26,108, 62,242,240, 97,181,139,166, 19, 66, 24, 79, 79,207,239,250,245,235,247,214,250,245,235,173,
-163,163,163,173,253,252,252,192,243, 60, 76, 38, 19, 56,142, 51,175,187,137,178, 19, 6, 87, 6,150, 97,189, 46,238,189,227,102,
-101,101, 85,250, 28,154,191, 11, 11, 11,209,123,116,219, 23,242,178,229,121, 94,106,206,215, 38,147, 73, 14, 64, 12,192,210, 9,
- 44,231, 95,186,116,105,232,145, 35, 71, 70, 46, 90,180,168, 17,128, 15,121,158,159, 19, 29, 29,221, 25, 0,252,252,252,164, 0,
-206,168, 84,170,177, 19, 38, 76,152, 48,105,210, 36,140, 30, 61,122, 14, 33,100,113,109,159,123,169, 84,250,229, 7, 31,124, 96,
-101, 52, 26, 97,101,101, 5,131,193,208,224, 57, 43,104,146,162,162,162, 61,243,231,207,239, 63,104,208, 32,243, 18, 94, 30,231,
-206,157, 91,250,233,167,159,182, 15, 14, 14, 30, 92,153,200, 10, 14, 14, 14, 4,176,160, 97,195,134,189, 71,143, 30,205,118,232,
-208, 1, 5, 5, 5, 56,126,252,248,236,189,123,247,206, 14, 14, 14,190, 4, 96, 78, 68, 68, 68,232,203, 46,178, 88,133, 45,238,
-189,222, 21,190,209,153, 0,128,148,239,139,151,134,180,251,242, 27,193,226,251, 47, 8,172,234, 80, 84, 84, 20, 52,115,202, 40,
- 48, 76,113, 45,177, 97,253, 58, 88, 58,107, 60, 57,112,232, 88, 80, 53,246,230, 74,142,227, 26, 57, 57, 57,125,166,213,106,229,
-171, 86,173,146, 39, 37, 37, 53,221,179,103, 15,141,140,140,132, 68, 34,129,189,189, 61,186,117,235, 38,235,211,167, 79,131, 75,
-151, 46,213,217,187,119,239,160, 87, 95,125,117,235,159,127,254,121,176, 50, 94,151, 22, 3, 27,185,187,122,156,253,102,209, 56,
-167,230,245,125,161, 55, 26,145,152,150, 4, 10, 41, 60,220,108, 48,242,181, 0, 73,135, 16, 73,195, 21,235, 78,133,186, 55, 31,
-244, 74,234,237, 3,119,170,139, 99,167, 96,155,176,193,157, 27, 4, 15,236,221,158,105,232,231, 15,137,204,186,244, 88,139,160,
- 32,180, 8, 10, 34,227,199,231,215,143,188, 30,249,197,209, 83, 87,103,117, 10,182,137, 56, 31, 81, 88,249,194,152, 20, 50,243,
-218,105,175,191,241, 38, 26, 55,110,252,212,203,220,252,251,201,147, 39, 32,132, 32, 35, 35, 3, 60,133,180, 22,105,131, 43, 87,
-174, 32, 32, 32, 0,189,122,245,194,240,225,195,149,251,247,239,255,109,237,218,181,157, 1,140,127,158,204,194,113, 92,135,160,
-160, 32,214, 96, 48,128,101, 89,100,102,102, 34, 54, 54, 22,190,190,190, 44,199,113, 93,170, 17, 26,104,223,190, 61,190,250,234,
-171,196,179,103,207, 6, 1,192, 43,175,188,114,189, 77,155, 54,174, 43, 87,174, 76, 60,127,254,124,112,137, 96,139, 8, 9, 9,
-177,120, 56,173,181,181,245,187, 31,127,242,169,107,110, 86,182,198,152,159,111, 80,240,156,201, 78, 46, 38,121,233,153, 57,143,
- 19,236,138,222,157, 48, 69,244,229,140,169,239, 2,176,168,205, 94,169, 84,214,105,218,180,105,216,230,205,155,221,156,157,157,
-145,147,147,131,204,204, 76,132,133,133,129,231,121,244,233,211, 71, 22,212,178,101,208,138,149, 43, 47, 43,149,202,118,150,136,
- 44,153,179, 11,246,116, 46,126, 52,134, 62,202, 44,117, 88,142, 14, 31, 80,122,206,136,184, 92, 0,128, 92, 46,175,245,178, 62,
-148,210,118, 29, 58,116,144, 0,192,180,105,211,242, 10, 11, 11,151, 18, 66,126, 83,171,213, 73,213,252,117,218, 23, 95,124,225,
- 89,191,126,125,159,223,126,251, 13, 5, 5, 5, 0,224, 86,191,126,125, 52,106,212,136, 59,123,246, 44, 26, 55,110, 12, 91, 91,
- 91,156, 61,123, 22, 87,174, 92, 65, 96, 96,160,173, 68, 34,121,179, 50,129,245, 74,191,206,115,100,226,166,157,154,132,188, 3,
-133,157, 18,155,183,255,142,123,225, 91, 59,233,140,119,231,204,250,208,243,109,150,202,222,241,108,164,152, 81, 47,164,139,115,
-195,102,131, 80, 55,248,134,139,142, 59, 23, 59,103,146,239, 50,145, 92,187,109,238, 55,234,204,202,196,149,135,135,199,242,190,
-125,251, 14, 93,191,126,189, 3, 0,220,186,117, 11, 41, 41, 41,112,117,117,133, 92, 46,135, 88, 44,134, 72, 36,170,209, 82, 89,
- 86, 86, 86, 72, 78, 78,134,185,226,192,113, 28,242,243,243, 75, 23, 13,159, 63,159, 48,115,231, 90,230, 54, 41,149,202,142, 65,
- 65, 65,191,122,121,121,121,151,221,223,183,111, 95,140, 31, 63, 30,133,133,133, 8, 12, 12,236,224,238,238,174, 27, 55,110, 28,
-120,158, 71,106,106,106,193,173, 91,183,122, 38, 37, 37, 93,173, 36,222,154,148,148, 20, 76,152, 48, 1,241,241,241,147, 84, 42,
- 85, 28,195, 48,114,169, 84,106, 62, 46, 85,169, 84,141, 27, 55,110,252,221,184,113,227,240,228,201, 19,196,196,196,132, 61, 79,
-165, 74, 38,147, 21,114, 28,231,102, 50,153,160,209,104,208,167, 79, 31,121,211,166, 77, 83,197, 98,241,221,156,156,156,145, 9,
- 9, 9,201, 22,186,141, 34,165, 82,233, 33, 22,139,215, 79,153, 50,165, 95,231,206,157,113,247,238, 93, 28, 61,122, 20, 3, 7,
- 14, 68,151, 46, 93, 48,123,246,236, 87,231,204,153, 51, 13, 64,101,149,129,221,123,246,236,169,231,229,229, 85,186, 36,146,157,
-157, 29,222,125,247, 93,140, 26, 53, 10,135, 15, 31,110,191,100,201,146, 61, 93,186,116,113, 11,125,142,150,138,255, 2,100, 33,
-237,225, 27,157,137, 71,126,206,197, 14,126,137,208, 50,111,195, 51, 72, 80, 54,255,102,129,165,215, 20, 25, 68, 12,189,235,170,
- 12,220, 25,118,116, 74,105, 19, 33, 76,244,174,222, 80,100, 40,182,205, 41,242,138, 76,176,146, 49,120,146,156,143,219,143, 50,
- 42,122,225,223, 46, 87,248,127,178,122,245,106,124,253,245,215,125, 53, 26, 77, 65,108,108,108,114, 65, 65, 65,225,200,145, 35,
-137, 88, 44,198,197,139, 23,241,248,241, 99,180,104,209, 2, 14, 14, 14,232,216,177,163,164, 87,175, 94,222, 99,199,142,125, 27,
-192,193,138, 56,201,208,161,172, 82, 42,251, 99,249,162, 97, 78,132,141, 65, 76,124, 14, 26,120,181,134,179,189, 55,146,210, 11,
- 16, 17,117, 24, 49, 15,255, 68, 3,175, 58, 24,255, 86, 3,135,111, 55,164, 31, 34,193,239, 55,160, 17,255,235,231, 85,209,144,
- 80,185,132,107, 53,111,117, 36,184,194,135,160,198,120, 80, 67,202,179,133,187,131, 55,154, 6,184,195, 90,234,202,220,138,254,
-182, 85, 85,113,215,153,232,231,139, 23,206,255,177,101, 96, 48,114,115,115,177,102,205,154, 82, 97, 69, 41, 45,173,113,183,109,
-219, 22, 70,163, 17, 63,254,248, 35,140,124,177,253, 95, 85, 56,203, 97, 68,155, 54,109,126,167,148, 74,173,172,172, 82, 2, 2,
- 2,124, 62,252,240, 67,209,176, 97,195,160,209,104,198, 41,149,202, 99,201,201,201,251,106,200, 9, 0,168, 91,183,110,199, 46,
- 93,186, 88,177, 44, 11,131,193,128,220,220, 92, 36, 38, 38, 34, 54, 54, 22, 46, 46, 46, 64,153,254, 91,149,113,150, 95, 11,145,
- 82, 74,205,241, 47, 43,196,204,247,197,146,112, 18, 66,154, 58, 58, 56,218,252,176, 98,125,184,171,140, 37, 46,222, 42, 34,177,
-115, 16, 49, 10, 91, 25,101, 89,141,143,183,202,150, 16,210,180, 18, 65, 82,126,209,112, 82,183,110,221,189, 91,182,108,113, 19,
-139,197,224, 56, 14,174,174,174,136,141,141, 69, 78, 78, 14,242,243,243, 17,123, 55, 26,245,188,188,240,209,248,247,148,243,191,
- 89,185,151, 16, 18, 82,182, 16,171,112, 49,110,163,177,124,152, 43, 43,136, 96, 73, 56,171,112, 72, 30,171,213,106, 88, 91, 91,
-195,207,207, 79,113,237,218,181,243, 73, 73, 73, 73,213,113,202,229,242, 55, 59,116,232, 96,187,125,251,118, 4, 7, 7,195,222,
-222, 30,103,206,156,193,173, 91,183, 96, 48, 24,152,252,252,124, 40, 20, 10, 44, 91,182, 12,117,234,212, 65,110,110, 46,226,226,
-226,156,197, 98,177, 75,101,156,231, 14,159, 93,152,253,232,204,156, 20,246, 88,159,205,219,127,199,184, 17,195,224, 97,122,116,
-222,177, 1,179,176,239,171,237,191,100,197,222,253,109,108,155, 59, 54,106, 62, 8, 18,169, 2, 31,126,190, 0, 49,183,255,112,
- 44,202,191, 53,137, 51, 38,120, 3,248,168, 60, 39, 41,190, 65,140, 74,165,122,111,227,198,141,182,230,253, 12,195, 64, 44, 22,
- 63, 37,172,204,139,177, 87,116, 79, 43,186,159, 28,199,193, 96, 48,192, 96, 48,128,231,121,164,167,167, 35, 63, 63, 31,142,142,
-142,197, 39,204, 5, 8, 8,161,149,172, 66, 95,150,147, 97,152,145,191,255,254,187,183,181,181,245, 51,231, 37, 36, 36, 32, 55,
- 55, 23, 54, 54, 54,112,112,112,128,209,104,132,201,100,130, 78,167, 83,116,233,210,101, 34,128,171, 21,113,178, 44, 59,117,194,
-132, 9, 29, 14, 29, 58,228,187,104,209, 34, 24, 12,134,229,233,233,233, 48, 11,180,142, 29, 59,182,165,148,222,155, 50,101, 74,
-137, 32,156,111, 44, 40, 40,248,160,182,121,201,221,221,221,127,192,128, 1,142, 39, 79,158, 68,199,142, 29,161,211,233, 48,113,
-226, 68,187,247,222,123,207,238,210,165, 75,174,171, 86,173,218, 6,160, 71, 85,156,193,193,193,226,212,212,212,233, 35, 71,142,
-156,214,163, 71, 15,251,140,140, 12,200,100, 50,236,220,185, 19, 63,252,240,195, 17,131,193,240,197,158, 61,123, 22,111,218,180,
-169,207,160, 65,131,176,105,211,166, 41,132,144,175, 41,165,124, 5,156, 42,111,111,111,220,188,121, 19,142,142,142,112,113,113,
- 65,110,110, 46,174, 92,185,130,176,176, 48, 52,109,218, 20,132, 16,199,146, 50,205,244, 60,207, 81, 13, 43, 53,127, 59,103,233,
- 26,171,101,242, 46, 0,112, 40,158, 97,179,182,225, 36,132,136, 84, 42,213, 32, 7, 7,135, 73,148, 82, 81,118,118,246, 70,107,
-107,235,221,149, 45, 19, 36, 44,244,108,161,192, 34,132,152,211,165, 11,165,244,172,103, 52,242, 50, 66, 28, 99,156,221,253,127,
-119,246,108, 86,124, 19, 77,244, 46, 43,115,140,113, 15, 47,202, 3, 0,131,145,226,210,221,108,220,124,144,138,155,247, 83,160,
-144, 87, 95,235,118,118,118, 70,251,246,237,113,224,192, 1, 36, 36, 36, 40,150, 45, 91,214,200, 96, 48, 24, 6, 12, 24,160,174,
- 91,183,110,118,199,142, 29, 33, 22,139,113,245,234, 85,228,229,229,129,101, 89, 72,165, 82,240, 60, 95,169,211,230,118,159,123,
-103,244,248, 32, 95, 23, 7, 6, 7, 47, 30, 67,219,166,131, 97, 45, 19, 35, 61, 91, 3,134, 16, 60,124,124, 18, 28,103,131,200,
-187,241,104,215,220, 6,157,218,216,123, 21,156,202, 26, 15, 96,157, 37, 55,200,144, 20, 10,105,221,215, 1,121, 51, 80,253, 67,
-240,250, 36, 80,177, 27, 10,139,228,200,120, 18,135,187, 87,118,131,154,138,170,229, 73, 72, 80,255,164, 82,169, 58,134,142,122,
-231, 29,158,231,241,213, 87, 95,133,222,191,127,191,107,217,115, 26, 52,104,112,102,246,236,217, 93,178,179,179,113,236,216,177,
-173,106,181,122, 75, 77, 18, 83,173, 86,159, 4,224, 84,214,141,185,126,253,250,246, 95,126,249,165,221,219,111,191,141, 93,187,
-118,125, 6, 96, 95, 77, 56,167, 76,153, 34, 62,112,224, 64,111, 43, 43,171, 53,115,230,204, 81,232,245,122, 36, 39, 39, 35, 37,
- 37,165,212,109,187,115,231, 14, 39, 18,137, 46, 85, 83,248, 87,184,216,116,121,129, 85,102,159,165, 53,239, 2,189,209,168,179,
-241, 86, 25, 7, 12,234,221,226, 86,216,141, 24, 43, 39, 39,166, 69,171, 64,255,187, 15,158, 68,144,226, 38, 24,139,154, 97,188,
-188,188,134,205,157, 59,183,133,157,157, 29,120,158,135,189,189, 61,210,211,211, 75, 5,165, 62, 63, 15,134,188, 92,220,140,139,
- 69,199, 46,221,208,171, 93, 91,191, 63,141,198, 97, 0,118, 84,197,235,212, 50,168,212,185,218,229,235, 92,186,127,248,147,156,
- 82, 1,112,184,117, 67,200, 20, 54,104,254,241,204, 90, 63,204,201,201,201,215,125,124,124, 14,247,233,211,167,223,248,241,227,
-153,148,148,148,163,238,238,238, 29, 82, 83, 83,163,170,250,159, 66,161,104,144,145,145,129,252,252,124,216,219,219, 99,213,170,
- 85,112,115,115, 67, 81, 81, 17,174, 93,187, 70,189,188,188,200,153, 51,103,224,233,233,137,204,204, 76, 24, 12, 6, 20, 21, 21,
-165,232,245,250, 74,251, 72,150, 52, 3,246,157,218, 75,121,228, 94,248,214, 78,158,136,189, 54,228,179, 78,247, 35,195, 98, 18,
- 78,159,186,184,208,164,149, 39,228, 36,158,152, 94,191, 85,164,203,164,207,230, 99,237,242,185,184,119,245,108,150,123,157,252,
-117, 28,209,109,237,208,187, 74,151, 86, 27, 29, 29,109, 27, 25, 25, 9,134, 97, 96,103,103, 7, 27, 27,155,210,133,205,205,226,
- 74, 36,178,220,160, 55, 87,112,204,226, 42, 61, 61, 29, 15,227, 98,176,231,244, 54, 24, 77, 70,151, 45,109,236, 82,124, 37,146,
-155, 46,185,100, 86,198,109,122,189,154, 2,112,227,240,225,195,135,121,122,122,218,150,221, 31, 16, 16,128,183,222,122, 11, 71,
-143, 30, 69,120,120,248, 83, 21,172,244,244,244,100,142,227,182, 86,198, 25, 31, 31,159,227,229,229,213,231,189,247,222,139,216,
-183,111,159,221, 55,223,124, 83,186,176,185,185, 89,212,252,189,125,251,118, 68, 68, 68,204, 73, 73, 73,185, 91,155,124,228,225,
-225,209,116,192,128, 1,231,214,173, 91,231,144,154,154,138,140,140, 12, 20, 22, 22, 66, 44, 22,195,100, 50,161, 97,195,134,132,
-227,184,122,213, 53, 7, 50, 12,243,199,233,211,167,123, 55,106,212, 8, 0, 96, 52, 26,113,241,226, 69,140, 31, 63, 62,211,218,
-218,250,205, 39, 79,158, 20,170, 84,170,217,135, 14, 29,234, 19, 16, 16,128, 22, 45, 90,120,164,165,165,217, 2,200,173,236, 29,
-194,113, 92,105,250,252,248,227,143,165,199,180,218,226, 37, 39,245,122, 61,105,213,170, 85,189,107,215,174,189,180,131, 91,226,
-126,217,140, 39,179, 38,195,231,252, 61, 0, 64,132,127,113,151, 43,159,179,209,197, 39,140, 26, 85, 35, 62,149, 74,229, 76, 41,
- 29,215,163, 71,143,143,251,244,233,227,170, 84, 42,225,236,236,140, 91,183,110,117, 56,118,236,216, 26, 47, 47,175, 13, 28,199,
-109,176,196,173,127, 94,148,215, 34, 47,141,131, 69, 41, 37, 37,145, 35, 24, 50,132,115,217,189, 59, 35,201, 79,106,144,138,172,
- 99, 0, 64,111, 40, 50,184,135, 23, 21, 79,211,176,112, 59, 40, 40, 56,190,196,109,160, 20,156,133,227, 64,180,119,223, 0,159,
-243, 7,220, 28, 7, 97,211,166,125, 72, 75, 75,147,172, 90,181,170,238,190,125,251,188, 70,142, 28, 25,223,176, 97,195,220,110,
-221,186, 97,219,182,109,240,240,240,128, 94,175, 7,207,243,149,170, 55, 91, 39,110, 72,155, 22, 13,217,152,184, 91, 8,105,244,
- 6,234, 41, 59,226, 97, 82, 46,178,243,117,200,204,213,160,113,227,207,144,154, 85,132,188, 66, 45,110,221,251, 13, 94,202,250,
- 12, 43,126,216,199, 82,129,165,123,248, 43,116,177,191, 67,162,236, 10,105,253, 97, 16,187,180, 67,194,189, 80,220, 56,185, 18,
-137,247, 47,128,242, 28,220,189,155, 90, 90, 51,153,183,122,245,234,145, 75,151, 46, 21, 77,158, 60,185,139,167,167,103,151,164,
-164,164, 80, 0,240,244,244,236, 50, 97,194,132, 46,182,182,182, 88,188,120,177,145, 82, 58,239,121, 19, 55, 57, 57, 57,222,211,
-211,115,210,201,147, 39, 35,199,142, 29,139,166, 77,155, 6, 17, 66, 24, 75, 58,214, 54,108,216,112,188, 84, 42, 29, 99, 50,153,
- 26,141, 24, 49,130, 25, 55,110,156,194,205,205, 13, 79,158, 60,129, 78,167, 3,195, 48,144, 72, 36,184,115,231, 14,255,199, 31,
-127,228, 74, 36,146, 41, 22, 56, 44,112,113,113,241,236,212,169, 83, 4, 0, 56, 57, 57,121,241, 60, 15,103,103,103,175,246,237,
-219, 71, 0,128,163,163,163,103, 69, 66,172, 82, 1,108, 48, 92,139,143,139,107,220,161, 83, 7,229,185,240,168,235,175,191,214,
-191, 43, 35, 98,152,199,113,201,215, 92,157,157,108, 46, 94,186,144,103, 48, 24,174, 89,194, 37, 22,139,251,119,236,216, 81,148,
-157,157, 13,149, 74,133,244,244,116, 36, 37, 37,193,104, 52, 66,155,155, 13, 67, 94, 30, 12,185, 57,160, 69, 5,120,116,237, 42,
-252,188, 61,101,199,139, 59,193,239,168,174,198, 89,145, 67, 69, 8, 41,221, 39,179, 85,192,202,214,182,180,249,163, 6, 47,199,
- 65,118,118,118,211,243,243,243, 15, 39, 37, 37, 45,210,235,245, 31, 46, 93,186,180,213,130, 5, 11, 92,166, 79,159,110, 55,125,
-250,244, 93,117,235,214, 13,124,242,228,137,174, 82,133, 90, 80,240,208,104, 52, 58, 3,112, 63,117,234, 20, 92, 93, 93,145,151,
-151, 7,163,209, 8,141, 70,163,119,116,116,148,103,102,102, 66,171,213, 66,175,215,195,206,206, 14, 17, 17, 17, 89, 38,147,233,
- 96,117,225,115,104,192, 44,212, 25,239,206,113,242,183, 73,226,168,115,231,124, 13,159, 61,247, 27,245, 66, 0, 43,250, 54,104,
-176, 89,207,159,141,141,185,125,192, 49,246,218,153, 44,245,253, 34,223,205,127, 62,202,175,226, 62, 82, 66, 8, 79, 8,161, 77,
-154, 52, 65,122,122, 58, 88,150,133,141,141, 13, 20, 10, 5,154, 54,109,138,132,132,132, 90, 11,172,178,226,234,228,229, 67,200,
- 40, 72,198,230,229,219,225,233,225,205, 0,112, 77, 74, 73,232, 57,118,218,208, 54,245, 59, 58, 46,141,189,144,189,172,138,138,
-206, 13, 0,118,101,247,121,122,122,118,117,116,116, 60,109, 48, 24,240,228,201, 19, 28, 63,126,188, 75, 98, 98, 98,141, 10,144,
-196,196,196, 71,158,158,158,125, 94,123,237,181,109, 45, 90,180,104, 64, 41, 69,211,166, 77, 49,104,208, 32,236,217,179, 7, 81,
- 81, 81,200,203,203,227,207,159, 63,191, 37, 57, 57,185, 86, 29,114,148, 74,101,147, 87, 95,125,245,194,218,181,107, 29, 51, 50,
- 50,160,213,106, 81, 80, 80,128,221,187,119,163, 67,135, 14,144,203,229, 88,189,122,117,158,201,100, 90, 91,149,184,162,148, 30,
-216,183,111, 95,111, 95, 95, 95,220,189,123, 23,231,207,159,135,171,171, 43,172,172,172, 48, 96,192, 0,231,223,127,255,253, 67,
-127,127,255,149, 98,177,120, 97,191,126,253,192,113, 28,194,195,195,147,227,226,226,242,171, 74,163, 74,203, 21,173, 22,148, 82,
- 24,141,198, 85, 12,195,188, 25, 28, 28,220, 43, 34, 34, 34, 12, 47, 9,188,188,188,154,137,197,226,143, 28, 29, 29,145,158,158,
-142, 28, 30, 80,100, 21, 15,186,205, 45,121, 93,102,101,101,149,190,107, 26, 53,106,244,167, 70,163,153,149,152,152, 88,169,203,
-228,233,233,217,210,218,218,250,227, 1, 3, 6,140,124,245,213, 87, 89,131,193,128, 67,135, 14, 97,237,218,181,232,211,167, 15,
- 26, 54,108,136,207, 62,251,204, 94,167,211,205, 56,122,244,232,116, 63, 63,191,163,249,249,249, 51,171,226,124, 65, 14,222,255,
-180,200,203, 34,176, 74, 34,244,191,126, 52, 67,134,112,158, 64,118, 73,141,198,197,201,201,105, 45,199,113, 93,241,229,151,176,
- 21,217,227,201,195,251,200,207,230, 97,212,235,192,243, 20,148,183,236, 94,240, 57,127,192,238, 21,138,188,115, 4, 6,131, 1,
-110,110,110, 88,182,108, 25,114,115,115, 69, 99,199,142,173, 55,127,254,252, 27, 90,173, 22,133,133,133,208,104, 52,208,104, 52,
- 85, 10, 44,137, 92,215,194,199,189, 17,242, 53,173, 97, 45,149, 34, 51, 79,135,236,124, 29, 50,114,180,216,123, 96, 4,116,154,
- 34,152,244,122,112, 6, 19, 20,238,131,209,208,169, 43,128, 7,205, 45, 76,232,146, 64,155, 96, 72, 58, 1, 67,210, 9, 88, 7,
-204,198,129,213,111, 63,117,158,201,100, 89,147,127,114,114,114,188, 74,165,250,126,204,152, 49, 83, 94,123,237, 53,108,216,176,
-225,107, 0, 33, 37, 46,194,215,131, 7, 15,198,157, 59,119,112,238,220,185,245, 47,170,182, 64, 41,117,118,114,114, 2,195, 48,
- 40, 42, 42,210, 85, 39,174,118,239,222, 77,230,207,159,127,116,192,128, 1,237, 62,252,240, 67,107, 15, 15, 15, 80, 74,161,215,
-235,145,152,152, 8,134, 97,144,147,147,131, 31,127,252,177, 48, 60, 60,156, 74,165,210, 75, 98,177,248,253, 59,119,238,168,171,
- 11,139,163,163, 35, 70,140, 24,225,218,186,117,107,215,178, 35, 6,223,124,243, 77,215,144,144,144,210,125, 94, 94, 94, 22,199,
- 79,171,213,254,184,120,225,156,174,191,252,186,179,105,147,166, 13, 29, 15, 31, 63,115,221,217,217,206,170, 94, 61, 95, 89,110,
- 78,142,110,237,170,229,162,194,194,194,159, 44,164,243,115,113,113, 65, 74, 74, 10, 30, 60,120, 0,157, 78, 87,220,132, 83, 84,
- 0,125, 78, 14, 12,185,217,128, 86, 3, 41,199, 65,151,145,138,122,190,245,128,255,141, 48,172,174,102, 86,161,192, 50,127, 91,
-217,219, 65,106, 99, 3, 86, 44,178,184, 15,150, 82,169, 12, 14, 10, 10,218,185,105,211, 38,201,212,169, 83,219,212,173, 91,119,
-109, 74, 74, 74,156,151,151, 87,247,229,203,151,135, 45, 90,180, 72, 54,114,228,200, 38, 27, 55,110, 28, 13, 96, 99, 21,247,112,
-231,225,195,135,223,170, 83,167,142,251,237,219,183,161,213,106,193,243, 60,250,246,237, 11, 0,114,243,121,247,238,221,211,104,
- 52,154,212, 59,119,238,228,199,197,197, 25, 96,193,168,191, 57,107,147,174, 76, 29,234,245,186, 82,169,186, 44,149,249,212,103,
-138, 34, 6, 79, 29,234,245,205,202, 93,137,218, 35, 15, 31,230,207,153,228,187,172, 40,255,246, 36, 71,175,194,117,235, 14, 62,
-202,183, 36, 75,151,140, 24,132,139,139, 75,105,147,160, 68, 34, 49, 55,109, 33, 55, 55,183,202, 38,194,202, 10,239,220,220, 92,
-228,230,230,226,254,227,187, 72,207, 79,198,137, 29,151,193,113, 92,169, 59,162,114,247,194,201, 29, 97,182, 93,134,180,154,229,
-220,146,156,201,188, 73,175, 89,154, 79, 25,134,249,248,141, 55,222,128,193, 96,192,160, 65,131,176,125,251,246,143, 1,212,184,
-134,158,148,148,116,133, 16,210,232,193,131, 7,118, 70,163,113,224,128, 1, 3,182,246,235,215, 15,151, 47, 95,198,169, 83,167,
-186,232,245,250, 24,142,227, 52, 74,165,114,169, 82,169,116, 35,132, 44, 85,171,213, 85,142,118,110,220,184,241, 72, 91, 91,219,
-197, 86, 86, 86,249,253,250,245, 83,153,157,171,194,194, 66,152, 76, 38, 36, 38, 38,226,200,145, 35,201,135, 15, 31, 78,166,148,
- 90, 23, 20, 20,204,141,143,143,223, 93, 89,179,160,209,104,220,255,199, 31,127,244,241,245,245,197,217,179,103,241,213, 87, 95,
-161, 65,131, 6,216,178,101, 11,218,183,111,143,122,245,234,193,201,201,233,163,188,188,188,118, 95,125,245, 85,191,160,160, 32,
-236,219,183, 15,105,105,105,107,170,122, 63, 85,245,158,213,104, 52,160,148,162, 91,183,110,227,167, 78,157,138, 1, 3, 6, 28,
- 15, 9, 9,105, 29, 30, 30,126,255,191, 94, 72,171, 84,170,101, 61,122,244,152,222,178,101, 75,252,250,235,175,208,133,116,132,
-205,150,131,184,221,191, 3, 40, 0,213,150, 3, 0,128,219, 3,139, 7,116,212,235, 62, 4,211,167, 79,239, 55,120,240,224, 58,
- 0,154, 85,194,249,205,219,111,191, 61,237,237,183,223,198,245,235,215,177,113,227, 70,220,184,113,163,180,204, 51, 26,141,136,
-142,142, 70,116,116, 52,148, 74, 37,250,247,239, 79,222,127,255,253,190,125,251,246,117, 53,151, 89,127,177,139,213,229,165,105,
- 34,172, 74, 53,122,120,120,184, 56, 58, 58,222, 89,187,118,173,115,155, 54,109, 88,147,201,132, 83,167, 79,227,211,201, 99,209,
-167,255, 36,104,117, 82,152,180, 4,156, 68, 97,217, 21,237,250, 35,239, 28, 1,175,232, 7,189, 94,143,241,219, 37,112, 32,169,
- 88,245,142, 59, 0, 16,141, 70, 3,157, 78, 7,141, 70,131,194,194, 66, 20, 22, 22,130,227,184, 74,223,146,249, 57, 54, 6,131,
-145, 71, 82, 90, 28, 18,147,111,195, 94, 81, 7,148,241, 70,106, 86, 17, 8,220, 96,212,222, 3, 95,242, 96,234, 52,137, 40,212,
- 61,159, 40,230,242, 99, 43,112,102, 44,239, 83,201,113,220,226,229,203,151,143, 95,187,118,173,108,210,164, 73,193, 42,149,106,
- 32, 0, 76,155, 54, 45, 88, 46,151, 99,221,186,117, 58,142,227, 22,191,160,140,202,122,122,122,126,252,202, 43,175, 32, 47, 47,
- 15,119,238,220, 57, 84,221,127,102,207,158, 61,241,141, 55,222,104, 55,127,254,124,107,173, 86,139,162,162,226,230,207,220,220,
- 92, 20, 22, 22, 34, 53, 53, 21,211,166, 77,203, 54, 24, 12, 19, 30, 63,126,188,167, 6, 66, 15,127,252,241, 7,126,249,229,151,
-167, 70, 12,190,249,230,155,174,219,183,111, 79, 91,189,122,117, 18,165,148, 58, 57, 57,121, 13, 25, 50,196,205,210, 22, 66,181,
- 90,173, 81,169, 84, 83, 22, 45, 94,244,219, 55,203,151,187,101,101,102,199, 72,164, 86, 90,107, 43,153,211,244, 79, 23,210,212,
-212,212,105,169,169,169, 69,150,134, 51, 59, 59, 27,177,177,177,176,178,178,130, 68, 34, 1, 87, 84, 0,190,176, 16,186,236, 76,
- 48,122, 29,100, 28, 7, 39,107, 25,188,221,221, 81,199,205,178,190,248,201,103,142,227,200,176,254, 79, 53, 11, 18, 66,112,180,
-125, 19, 72, 21, 54,144, 43, 20,232,184,255,124,113,133, 65, 34, 1, 86,109,178,164, 25,199, 69,165, 82,253,177,102,205, 26, 73,
- 70, 70, 6,238,220,185, 19,249,228,201,147, 92, 39, 39, 39, 91,177, 88,204,223,191,127,255,228,189,123,247,250,215,171, 87, 15,
-148,210,234, 70,127,173,216,187,119,111,207, 14, 29, 58,152,234,213,171,103,147,158,158, 94, 39, 59, 59,155, 36, 39, 63,221,135,
-249,218,181,107,242,248,248,248, 34,158,231,247,161,120, 30,172,106, 51,254,212,161, 94,242, 75,215, 49,165,179, 75,189,150,246,
-174, 45,145, 97,188,209,242, 74,100,202,148,169, 67,189, 86,175,220,149,168,229,136,110, 43,103, 76,240, 22,201,181,219, 44,204,
- 71,212,223,223, 31,148, 82, 92,187,118, 13,231,207,159,199,249,243,231,241,228,201,147,210,115,236,237,237,113,226,196, 9,116,
-237,218,213,226,103,165,168,168, 8, 74,165, 18, 14, 14, 14,216, 23,250, 51,126,248,102,123,105, 71,119, 51, 50, 50, 50, 96,109,
-109,141,197,159,174, 84,140,253,124,200, 66, 0,189, 44,225,246,246,246,174,223,161, 67,135, 87,221,221,221,145,157,157, 13, 87,
- 87, 87,180,106,213,106,128,187,187,123,189,212,212,212, 90, 53,101,233,245,250,137, 93,187,118, 93, 52,109,218, 52, 24,141, 70,
- 12, 27, 54, 12,177,177,177, 59, 31, 61,122,180,202,199,199,103,202,164, 73,147,220, 93, 92, 92, 48,113,226, 68, 27, 0,175, 87,
-198,211,180,105,211, 79,102,204,152,177,100,212,168, 81, 50,163,209,136, 83,167, 78,149,186,212, 38,147, 9,113,113,113,152, 59,
-119,110,114, 94, 94, 94,231,196,196,196,135,213,133, 43, 37, 37,101,218,254,253,251,251, 54,110,220, 24, 71,143, 30,197,132, 9,
- 19,254, 84, 40, 20,205, 94,125,245,213, 58, 54, 54, 54,136,140,140,132,193, 96,128, 82,169,116,159, 49, 99, 70,255,222,189,123,
-227,228,201,147, 88,184,112,225, 33, 15, 15,143, 21,213,137, 96,145, 72, 4, 99,185, 62,141, 44,203,226,198,141, 27,232,214,173,
- 27,166, 79,159, 14, 0, 56,121,242,164, 93,175, 94,189,110,119,233,210,197, 46, 52, 52, 84,247, 95, 46,164,109,108,108,198,108,
-217,178, 5, 15, 30, 60,192,133, 11, 23,144,153,153, 9,189, 94,143, 92,190,184,207,149,172,196,185,162,158, 62,104, 63,109, 22,
-134,247,127, 29,201,201,201, 96, 24,198,165,138,178, 97,228,172, 89,179,112,228,200, 17, 44, 91,182, 12,121,121,121, 21,158,103,
-101,101,133, 86,173, 90, 33, 48, 48, 16,177,177,177, 0,224,242, 87,199,247,165,116,176,170,112, 29, 86,125,255,253,247,206, 29,
- 58,116, 96, 11, 11, 11,193,243, 60,218,181,109,139,209,239,140,198,177,125,187,161,172,223, 21,172,214, 10, 38, 91,107,203, 4,
-134,247, 86,100,101,101, 65, 38,147, 65, 94,210,161,244,102, 98,169,189, 11,173, 86, 91, 42,174,204,223, 85,193,164,151, 70, 68,
- 63,226,188,243, 10,110,224,106,196, 47, 48,234,245,168,215,104, 38,116, 38, 23,216,184,189, 11,141,225, 15, 24,114,138, 71,238,
- 74,237,186, 32, 53, 53, 3, 0,185,109, 97, 66, 63, 43,166, 52,207,118,118,231, 57,203, 5, 86,106,106,106,186, 82,169, 92,113,
-227,198,141,217,125,251,246,197, 15, 63,252,176,140, 82,138,126,253,250,225,218,181,107,136,140,140, 92,145,154,154,154,254, 2,
-196,149,200,195,195,227,199,117,235,214,245,115,119,119,199,222,189,123, 65, 41,173, 86, 16, 73,165,210,113, 83,166, 76,177, 54,
-187, 24, 82,169, 20, 26,141, 6, 41, 41, 41, 48, 24, 12,216,183,111,159, 78,175,215, 79,125,242,228,201,158, 26, 62, 52,180,117,
-235,214, 88,185,114,101,226,133, 11, 23,130, 1,160,125,251,246, 17, 33, 33, 33,174,171, 87,175, 78,186,114,229, 74, 48, 0,180,
-105,211, 38, 60, 48, 48,176, 70,243,184,168,213,234,196,198,141, 27, 63,212,104,181, 98, 71,103,167, 34, 91, 27, 41,205,203,207,
-103,110,222,188,158,156,154,154,250,164, 6, 84,209,119,238,220,105,158,148,148,132,184,184, 56,112, 69, 5, 96,116, 58, 16,157,
- 6,221,219,181,133, 21, 40,100,224, 33,225,141, 16,179, 34,228,231, 23, 0, 64,116,181,174,109,153, 2,193, 44,174, 8, 33,144,
- 43, 20,144,218, 42, 32, 83, 40,158,114,180, 44, 17,151, 86, 86, 86,191,109,220,184, 81,169, 84, 42,241,237,183,223, 66,169, 84,
- 54,237,209,163, 71, 81,231,206,157,173, 92, 92, 92,208,184,113, 99,132,132,132,224,204,153, 51, 32,132, 60,172, 38,109, 76,132,
-144, 94, 23, 46, 92,152,118,233,210,165,161, 42,149,138,140, 26, 53, 10,125,250,244,129, 76, 38,131, 70,163, 65,118,118, 54,254,
-252,243, 79,194,113, 92, 80,137,192,243,169, 91,183,238,118, 66, 72,226,227,199,143,223, 44,207,185, 97,113, 75, 85,190,134, 31,
-171,244, 80,189,222,185,119,189, 22,221,122,247, 64,253, 70,221,209,173,119, 2, 0, 44,115, 17, 63, 30,246,245,236,230,251,234,
-121, 59,109,185,180,255,228,151, 29,251,118,253, 98,254, 20,167,133,115, 87,103, 89, 50, 77, 67,105, 97,203, 48, 76,133, 46, 21,
-203,178, 96, 24,203,214,178,231,120, 46,177,207, 59,237, 74,183,141, 38,131,139,167,135, 55, 99,118,174, 0, 32, 47, 47, 15,241,
-241,241, 48, 26,141,112,118,118,134,209,104,104, 89,131, 74,213,148, 97,195,134, 17,173, 86,139,105,211,166, 97,249,242,229, 24,
- 52,104, 16,185,122,245,234, 20, 0, 31,215,194,209, 88, 62,113,226,196,105, 99,198,140, 65, 78, 78, 14, 78,159, 62,141,174, 93,
-187,226,251,239,191,119, 61,125,250,244,146,246,237,219,131,101, 89,156, 56,113, 2, 6,131,225, 94, 53,207,251,228, 81,163, 70,
-201, 18, 18, 18, 32,145, 72, 16, 18, 18,130,196,196, 68, 20, 22, 22, 34, 45, 45, 13, 11, 22, 44, 72,201,205,205,237,146,148,148,
-244,208,130,116, 97, 58,117,234,244, 81,195,134, 13,113,234,212, 41, 76,156, 56,241,136,141,141,205,235,217,217,217,239,235,116,
-186,213,253,251,247, 71,251,246,237,113,239,222, 61, 12, 24, 48, 0,173, 90,181,194,233,211,167, 49,125,250,244, 63,173,173,173,
-223,168,102, 30,172,251,161,161,161,205, 67, 66, 66, 80, 88, 88,136,252,252,124,136,197, 98, 56, 56, 56, 32, 58, 58, 26,141, 26,
- 53,194,244,233,211,177,114,229, 74, 76,157, 58,149,239,213,171,151,201, 96, 48, 72,204,163, 44,255,203, 40, 44, 44,164,201,201,
-201,176,179,179,195,174, 93,187,112,235,228, 49, 28,158,252, 46,228, 95, 44, 7,165, 20,137,139,102,160,219,231, 95,160,109,228,
- 35, 36, 39, 39, 99,219,182,109, 96, 24,166,116, 68,108,101,101, 91,110,110, 46, 2, 3, 3,113,237,218, 53,108,219,182, 13,223,
-126,251,109,169, 91, 43, 22,139,209,165, 75, 23,244,236,217, 19,247,239,223,199,198,141, 27, 97,103,103, 7, 1,181, 16, 88,148,
- 82, 82,246,251,105,119,134,239,214,170, 85, 43,182,160,160, 0, 90,173, 22,169,169,169,120,252,248, 49,172,172,172,144,148, 22,
-143,214, 13, 10,144, 66,244,184,115, 35,134, 35,172,248, 70,117, 53, 16,131,193, 0,189, 94,143,155, 55,111, 22, 15,125,111,180,
-180,180,243,115, 73,159, 15,104,181, 90,132,134,134, 82, 43, 43, 43,216,216,216,144,170,218,222,121,147,238,200,153,139,145,253,
-222, 30,220, 77,122, 34,244, 7, 24,117, 38, 20,232, 28, 80,168,213, 35, 95, 35,134, 94,214, 27,132,156, 7,195,202,208, 62,176,
- 1, 78, 95,184,175,229,140,134,163,150,169, 2, 14,172, 83, 75,112, 89, 55,203, 8,172,167,107,245, 18,153, 2,156,169,102,163,
-130,229,114,249,242, 21, 43, 86, 76,254,241,199, 31,109,223,127,255,253,198,230,194, 98,221,186,117,249,114,185,124,249,243, 10,
- 43,165, 82,249,118,135, 14, 29, 22,204,157, 59,215, 51, 48, 48, 16, 17, 17, 17, 88,186,116,233,159, 41, 41, 41, 7, 44,168, 25,
-123, 57, 59, 59,163,160,160, 0, 82,169, 20, 28,199, 33, 45, 45, 13,241,241,241,144,201,100, 8, 11, 11,211,251,248,248,236,173,
- 77,216, 44,233,208, 94,118, 68,101, 77, 96, 37,225,131,191,248,124,124, 67,173, 86,227,159,159,159,111, 18,137, 68, 34,153,152,
-139,173, 9,135,209,104, 60,116,254,252,249,215, 58,118,236, 40,139,185,121, 3,134,220, 92, 24,243,114, 32,225, 76,112, 10, 14,
- 4,163,215,130,232,141,240,244,163,208,228,216,224,226,245, 71, 70,163,209, 88,173, 43,104, 22, 88, 12,203, 62,221,239,202,206,
- 22, 82, 69,177,192, 42,187,159, 84,211,174,229,238,238,110,221,183,111,223,238, 65, 65, 65,160,148, 98,249,242,229,208,235,245,
- 82,163,209, 8,163,209, 8,131,193,128,252,252,124,236,217,179, 7, 63,255,252,243, 69,123,123,251,106, 7, 75, 80, 74, 77, 94,
- 94, 94, 31,242, 60,239,102, 50,153, 12,174,174,174,146,157, 59,119, 66, 46,151,131, 97, 24, 4, 6, 6, 66, 46,151,235, 84, 42,
-149,161, 36, 12,198, 21, 43, 86,136,222,123,239, 61, 73, 69,124, 1,173, 27,127,202, 81,231,206, 82,153, 79, 61,123,215,150,168,
-223,168, 59, 0,160,103,255,177,168,223,208, 27,185,233, 55,235,235,117,113,131, 89,146,233,248,203,229,164,232, 78,214,205,199,
-100, 38,134,198, 0,248,209,210,188,212,189,123,119,244,234,213,171,180, 57,208,205,205, 13,122,189, 30, 38,147,201, 98,113, 5,
- 0,230, 73, 68,231,207, 39, 12,230, 2, 91,218,216,166, 0, 40,181, 39,115,115,115,145,144,144,128,184,184,184,210,247, 20, 79,
- 45,171, 93,171, 84, 42,171,250,245,235,191,211,172, 89, 51,156, 62,125, 26, 55,111,222, 76, 58,123,246,172,103,235,214,173,225,
-229,229, 53, 70,165, 82,205, 82,171,213, 22, 79,168,236,234,234,106,211,169, 83,167,201, 99,198,140,193,189,123,247, 48,125,250,
-244,204,148,148,148,125,135, 14, 29,122,239,147, 79, 62, 97, 58,119,238,140,180,180, 52,108,216,176,129, 11, 11, 11,251,198,209,
-209,113, 65, 53,247, 49, 86,173, 86,215,213,106,181,200,204,204,132,121, 74,134,163, 71,143,226,216,177, 99,169, 57, 57, 57, 93,
-212,106,245, 3, 75,194,230,227,227, 99, 27, 28, 28,236, 30, 19, 19,131, 29, 59,118,192, 96, 48,124,241,228,201, 19,131,189,189,
-253,175,235,214,173,155,235,235,235,235,244,202, 43,175,160,125,251,246,160,148,226,224,193,131,152, 55,111,222,159, 86, 86, 86,
-175, 71, 69, 69, 25,170,161, 31,188,112,225,194,133, 46, 46, 46,111,190,245,214, 91, 76,112,112, 48,194,195,195,193,113, 28,186,
-119,239, 94, 42,174,142, 30, 61,250,219,209,163, 71,135, 0,144, 40, 20, 10,249,127,221,189, 50, 67,171,213, 34, 38, 38, 6,238,
-238,238,104,216,186, 29,166,223,126,140,243,151, 46,131, 82,138,142,119, 30,163,160,160, 16, 91,182,108, 65, 68, 68, 4, 88,150,
-133,175,175,111,181,156, 6,131, 1, 15, 30, 60, 64,122,122, 58, 6, 13, 26,132,145, 35, 71,226,235,175,191,134,193, 96,192,236,
-217,179,145,149,149,133, 77,155, 54,225,193,131, 7, 16,137, 68, 80, 40, 20,127,121, 60,171,210, 34, 47,165,131, 5, 20,183,125,
-243, 60, 15,181, 90,141,107,215,174,225,241,227,199,176,177,177,129,198,196,243,107,174, 68,242, 12, 17, 39,113, 20, 23,168, 9,
-159, 87,167,196,141, 70, 35, 17,137, 68,184,116,233, 18, 30, 62,124, 8,187,134,180,212,189, 50, 26,141,208,233,116, 40, 42, 42,
-130, 88, 44, 46,184,124,249,242,147,240,240,240,250, 34,145,168,210, 81, 96,105,141,216,173, 39, 78,158,250, 52, 56,208,191,113,
-143,206,243,112,232,208,151,200,201,203, 67,161, 78,132, 2,141, 1,133, 90, 10,149,109, 3,180,105, 25,132,244, 76, 61,238,223,
-137, 72,204,144, 56, 85,219, 6, 99,228,152,220,223,214,190,111, 63,112,200, 68,200, 61, 94,129,254,241, 78,240,154,212, 82,129,
- 37,145,219,194,206,165, 14,242, 10, 52,184, 24, 29, 11, 35,199,228, 90,122,211, 99, 99, 99,243, 84, 42,213,226,139, 23, 47,126,
-101, 30,249,115,238,220, 57, 60,122,244,104,177, 90,173,206,171, 97,109,182, 7,128,237, 0,228,110,110,110,169,239,191,255,190,
-178, 87,175, 94,242,206,157, 59,131,101, 89, 92,191,126, 29,239,191,255,254,113,133, 66,241,186, 37, 35,243,164, 82,105,106,110,
-110,174,189, 76, 38,131,209,104, 68, 74, 74, 10,238,221,187, 7,141, 70,131,212,212, 84, 16, 66,212,161,161,161,154, 90, 60, 56,
-207,140, 34, 52,143, 10,170, 68,136, 89,172,176,188,188,188, 58,247,235,211,185,249, 55, 43, 87, 67, 83, 84,128,176,203,135,144,
-157,149,129,141,155,247,182,240,242,242,234,108,105,103,226,196,196,196,223,247,238,221, 59, 45,160, 89,179, 32, 95,111,111,220,
-138,123, 12, 9,207, 65,202,113, 96,245, 90, 48,156, 14, 94,205, 41, 24, 70,129,212,148,124,172, 63,126,250,118, 98, 98,226,239,
-213,241,122,246, 29,136, 17,113,185, 32,132,224,120, 39,127,200, 21, 10, 72, 20, 54,104,191, 39,180, 84, 84, 61, 89,246, 25, 36,
- 54, 10, 56,182,170,126, 98,204,212,212,212,162,134, 13, 27,134,223,189,123,183, 85,147, 38, 77, 48,127,254,124, 36, 36, 36,128,
- 82,138,180,180, 52,109,122,122,122, 82,102,102,230, 19, 66,200, 62,181, 90,189,217,210,217,194,121,158,119, 59,120,240, 32, 0,
- 72, 0,224,212,169, 83, 80,169, 84,176,183,183, 71, 94, 94, 30, 70,141, 26, 37,155, 51,103, 14, 0,224,250,245,235, 98,185, 92,
- 94, 41,215,157, 27,247, 86,100,231,209,108,166, 48,226,245, 12,211,141, 22,221,122, 39,162,103,255, 49, 56,113,104, 11, 78, 31,
- 59, 9, 23,241,227, 88,206,170,224, 72,122,108, 70,126,114, 97,163, 13,254, 33,239,177,234,130, 99, 27, 39, 13,114, 20,121, 41,
-249, 93, 51,190,175,122,226, 94, 74, 41, 88,150,125,166, 67,123, 77,197, 85, 89,204,157, 75,121, 2, 66,234,139, 69, 55,146, 82,
- 18,122,171,220,189, 74, 43, 23,241,241,241, 72, 72, 72, 64,195,134, 13,241, 56,238, 17,164, 82,201, 13, 11,243,253, 91,253,251,
-247,183,213,235,245,216,191,127,191,137, 16,210,255,224,193,131,225, 1, 1, 1,162,174, 93,187,218,110,217,178,229, 45, 0,155,
-107,210, 98,164, 80, 40, 36, 70,163, 17, 91,183,110, 69, 82, 82, 82,231,148,148,148,104,149, 74,181,225,131, 15, 62,248,222,207,
-207,175, 97,116,116,244,125,141, 70, 51, 81,173, 86,223,172,142, 44, 39, 39,103,116,159, 62,125,118,241, 60,239,211,161, 67, 7,
-155, 17, 35, 70,216, 81, 74,225,231,231,135,195,135, 15,171,213,106,181,197,125,152,226,226,226,242,207,159, 63,159,234,239,239,
-239,174, 84, 42, 33,145, 72,150, 41,149,202, 69, 10,133,226,155, 1, 3, 6, 56,237,220,185, 19,187,119,239,134,141,141, 13, 98,
- 99, 99,213,119,239,222, 93,229,225,225,241,157, 37, 51,184, 71, 68, 68,196, 2, 24,209,186,117,235,121,223,126,251,237, 23, 12,
-195,188,125,252,248,241,210,185,206,204,226,170, 94,189,122,163,119,237,218, 53,242, 37, 51, 66,140,122,189, 30,206,206,206, 72,
- 79, 79, 71, 90, 90, 26,234,212,169,131,118,237,218,193,104, 52,226,192,161, 63,113,254,252,121, 80, 74,225,226,226, 2, 59, 59,
- 59, 68, 70, 70, 2, 64, 85,163,135,141, 6,131, 1, 78, 78, 78,200,201,201, 65,100,100, 36,220,220,220, 48,117,234, 84,232,245,
-122,236,220,185, 19, 55,110,220, 0,195, 48,112,117,117,133,173,173, 45,110,220,184, 81, 29,167,128,154, 10, 44,150,101,207,156,
- 57,115,102, 72,203,150, 45, 69,247,239,223,199,253,251,197,207,155, 70,163, 49,137, 88,236, 78,189,185,127, 68, 21,110, 74,243,
-178,115,101, 72,165,210,245, 67,134, 12,153, 56,118,236, 88, 76,154, 52, 9, 12,195,224,199,235, 58,196,199,243, 48, 24, 12, 72,
- 77, 77,197,173, 91,183,104,171, 86,173, 8,207,243,134, 46, 93,186,140,139,136,136,104,205,178,108, 94,101,156,116,215, 46,206,
-165,197,192, 65,235,214,111,190,244,206, 59,239, 56, 13, 28,180, 14,215,163,238, 32,167,176,184,149, 73,229, 98,131, 54, 77, 62,
- 67, 90,166, 14,199,142, 28,202,230, 77,218, 55,232,237, 29,198,170,194, 9, 0,233, 69, 26,183, 13,219,246, 46,223,177,103,223,
-184,241,163, 71,200,187,116, 25, 13,113,254, 45,112,153, 17, 80, 53,234, 0,194, 90,227,106,228,117,220,124,144,160, 45,210,178,
-155,243, 12,154,207,170,227, 44, 11,134, 97,214,108, 90,191,122,201,209, 19,161,172,193, 96, 64,191, 62,221, 57,134, 97,214, 84,
-227, 78, 61,195,105,109,109,189, 35, 50, 50,210, 73,167,211, 33, 49, 49,177,126,227,198,141, 65, 41, 69, 92, 92, 28, 86,173, 90,
-101, 58,124,248,240, 58,185, 92, 62,189,178, 26, 98,121, 78,163,209,184,125,235,214,173, 51, 63,252,240, 67,121, 90, 90, 26,238,
-222,189,139,194,194, 66, 24, 12, 6, 68, 68, 68,104,141, 70,227, 14, 11, 92,180,103,194,105, 22, 88, 78, 78, 78,158,109,219,182,
- 53,143, 34,244,228,121, 30,142,142,142, 94,173, 91,183, 14, 7, 0,123,123,251, 10, 71, 17, 86,117, 63, 19, 19, 19,207, 54,106,
- 80, 7, 91, 55,175,132,193,160, 67,114, 82,177,211,144,145,153,139,170,196,213, 51,121,137, 82,170, 84, 42, 95,255,118,213,170,
- 43, 19, 70,191,237,209,169, 91,119, 36,220,140,132, 62, 43, 29, 12,103,130,152,138, 80,148,102,133,212,212, 2, 44, 57,124, 50,
- 77,163,213, 62, 35, 90, 43, 11,103,105,179,160,157, 45,100, 10, 5,164, 37,174,149,249,152, 84, 97, 11,177,141, 2,172, 68, 82,
- 81,103,248,230, 21,204, 41,247,198,248,241,227,111, 30, 62,124,216,113,196,136, 17, 24, 56,112,224,245,156,156,156,174, 89, 89,
- 89,150,116, 20,175,144,147, 97,152,180,126,253,250,185,233,245,122,211,176, 97,195, 68, 25, 25, 25, 48, 15,177,207,207,207,199,
-145, 35, 71,208,164, 73,241,170, 51,119,238,220,129,191,191,127,165,156,239,125,126, 43, 9,192,194,169, 67,189,190,185, 18,153,
- 50, 5,192,178,250, 13,189,112,250,216, 73,156, 63,125,105, 70,219,230,252,234, 87,223,106,189, 64,222,237,205,207,252,131,223,
- 99, 21,118, 74,108,219,187,135,141,138,248, 97,177,182,240,182, 47,128,207, 42, 11, 39, 33,164,120,165,250, 50,226, 74, 36, 18,
-161,168,168,200, 34,113, 85, 85, 94,162,160,212, 37,143,124,241,206,212,161,237, 78,237,184,106,107, 99, 99, 83,218,231,167, 65,
-131, 6, 16,137, 69,248,113,223,154,194,156,156,140, 57,150,112,218,216,216,124,216,181,107, 87, 60,122,244, 8, 55,111,222,220,
-163, 86,171,111,170, 84,170, 61,177,177,177,195, 90,183,110,141,223,127,255,253,195,202, 4, 86,101,156,230, 25,235, 75,220,222,
-172,146,102,242, 72, 0,109,107, 26,247,146,201, 66, 59, 0,128,159,159, 95,194,224,193,131,237, 76, 38, 19, 74,196,179,115, 77,
-242, 18,165,148, 87,169, 84,223,133,133,133, 45, 13, 12, 12,196,240,225,195,123,134,135,135,247, 12, 8, 8,128,175,175, 47,178,
-179,179, 17, 26, 26,250, 11,207,243, 31, 36, 39, 39,107,171,170, 68, 85, 22,247,176,176,176, 7, 0, 70, 5, 7, 7,191, 41, 18,
-137, 96,103,103,199, 38, 37, 37,177,199,143, 31, 7,128,241,187,118,237,226,106,147,238,207,209, 98,240,151,115, 18, 66,102,143,
- 30, 61,122,195,251,239,191, 47,111,221,186, 53,114,115,115, 75, 69,255,225,195,135, 81, 50, 18, 27,206,206,206,120,240,224, 1,
-246,237,219,167,207,205,205, 93, 37,145, 72,150, 85,197, 57,106,212,168,167, 56,205,226,237,208,161, 67, 48, 15, 34,113,118,118,
-198,253,251,247,177,119,239, 94,109,110,110,238, 74,189, 94,255,245, 95, 25,247,255,119, 2, 43, 43, 43,235,163,153, 51,103,118,
-125,247,221,119,157, 53, 26, 13,235,226,226, 2,181, 90,109, 58,118,236, 88, 86,126,126,254, 71, 53,185,216,165, 75,151, 38,245,
-239,223,127,213, 79, 63,253,180,105,211,166, 77,157,135, 15, 31,142, 81,253,250, 97, 98, 59, 27,232,116, 58, 16, 66,112,236,216,
-177,123,103,206,156,169, 47,145, 72,116,115,231,206,229, 1, 92,169,142, 55,227,214, 31,247,221, 91, 12,238,188,122,205,247,187,
-131, 66,218,250,212,173, 87, 87,214,193,219, 30, 6, 35,135,212,180, 76,156,189, 20,165,187, 31, 21,153,192, 27,244, 67,211,162,
-170,159,197, 29, 0,162,162,168, 1,192, 71,254,254,118,243,191, 94,255,219,250,159,119,237, 25, 60,110,248,235,162,224, 22, 93,
-241, 56,229, 0,206,133,159, 49,101,231,211,125,249,122,118, 66, 84, 84, 94,118, 77,111,124, 98, 98,162,182, 97, 61,207, 92,173,
- 86,235,244,248,241, 99,164, 38,171,243, 18, 19,147,180,181,105,118,211,233,116,120,244,232, 17, 78,158, 60,137,235,215,175,227,
-226,197,139,134,227,199,143,255,196, 48,204,226,202, 38,154,172, 12,205,155, 55,255,234,135, 31,126, 24,194,113,156,111,151, 46,
- 93,228, 78, 78, 78,200,200,200, 64, 88, 88,152,254,198,141, 27,143,154, 55,111,254,117,109, 51,155,135,135, 7,134, 14, 29,234,
- 22, 28, 28,236,102, 30, 49,232,237,237,141, 55,222,120,195, 45, 32, 32,160,116, 95,157, 58,117, 80,147,169, 26, 74, 28, 44,188,
-243,222, 39,208,104, 10,112,229,210, 33,228,100,101,224,242,181, 24,212,196,193, 2,138, 71,122, 42,149,202,182,139, 86,173,222,
-219,167, 77, 43,191,198, 42, 15,153,115,189,186,176,113,245, 64, 86,102, 38,174, 68, 62, 52,174, 61,113,246,182, 70,171,125,221,
-210,145,158, 60,207,151,142,114,243,159, 50, 3, 12,195,148,174,130, 96, 62,110, 23,210, 17,140, 72, 12,142, 2, 6,131,161, 90,
-247, 78,173, 86, 39,122,122,122,190, 49,121,242,228, 83, 91,183,110,101,186,116,233, 18,248,199, 31,127, 60,215,162,185,137,137,
-137, 94, 37,174,104,158,157,157,157,104,204,152, 49, 48, 26,141, 40, 42, 42, 66, 94, 94, 30, 50, 51, 51,117, 31,127,252,177, 12,
- 0, 36, 18,137,177, 79,159, 62,213,190, 63, 86,238, 74,212, 78, 29,234,181,218, 69,252,120, 88,110,250,205,250, 46,226,199,177,
-109,155,243,171, 87,238, 74,212,126,245,190,227,162,164,244,208, 24,117,193,177,141,219,246,238, 97, 71, 15,126,131, 83, 42,238,
-207,112,241,198,174,174, 3, 45,120,121,149, 19, 88,181,117,174,158,121,159,220,166,215,235,183,179, 95,218,117,104,235, 89,139,
-166,173, 80,184,184,186,192,100, 50, 33, 54,254, 17,126,218,187,182, 48, 95,151,189, 56, 51,138,134, 91,194, 85,191,126,253,122,
- 44,203,226,192,129, 3, 0, 96,158,218, 96,237,145, 35, 71,134,189,245,214, 91,168, 83,167,142,127,221,186,117,101, 85, 77,163,
- 81,145,123,103, 52, 26,241,162,215,181, 38,132, 60,138,140,140,244,244,244,244, 36, 59,118,236, 40, 48, 24, 12,243,106,241,140,
-175,248,243,207, 63, 59, 81, 74,251, 4, 5, 5,193,199,199,167,228,125, 26,133,243,231,207,111, 79, 74, 74,122,231, 5, 45,238,
- 76, 9, 33,200,203,203, 51,207,107, 98, 80, 40, 20, 47,229,162,209, 73, 73, 73, 63,187,187,187, 31,155, 55,111,222,151, 13, 26,
- 52,248, 96,252,248,241,108,227,198,141,145,155,155, 11, 59, 59, 59, 40,149, 74, 36, 37, 37,225,231,159,127,230,210,210,210,126,
- 98, 24,102,190, 90,173, 86,215,150,211,209,209, 17, 74,165, 18,137,137,137,102,206, 77, 70,163,113, 65,122,122,122, 42, 4,212,
-236,153,178,228, 33, 45,153,166,225, 59,142,227,186,154, 93,173,172,172,172,143, 82, 82, 82, 50,106,171,238,251,247,239,223, 32,
- 35, 35, 99,147,193, 96,232, 60,112,224, 64, 12, 31, 62, 28, 3, 6, 12,192,240,225,195, 89,179,107,117,224,192,129,187, 53,225,
- 52, 47,246,204,176,146,254,148,210,150, 0, 8, 97,152,106, 23,123,182, 68,137, 7,249,219,249, 90,201,248,205, 86, 82,190,163,
- 70,207, 92,208,232,152,113,215,163,242, 30, 61, 79,205,166,100, 97,231, 95, 1, 64,103,164,111, 39, 36,168, 79,212,244,126,150,
- 52, 17,238, 32,132,176,148,210, 53,148,210, 29, 74,165,242,145, 37,182,123, 5,156, 12, 80, 60,185,232,201,147, 39,191, 36,132,
-188,173,211,233, 92,101, 50, 89, 58,165,244,151, 30, 61,122, 44, 88,189,122,117, 85,188,124,101,225,244,246,246,254, 77,165, 82,
- 53, 50, 59, 69,101, 11, 11,243,183,121,127,201,124, 68, 15, 19, 19, 19,223,178,244,126, 54,240,245, 58,230, 91,207,179,151,111,
- 61, 21, 0,224,209, 99, 53, 30, 61, 78, 58,254,240, 81, 98,239,218,164, 81,217,197,158, 73,201, 84, 12,212,130,197,158,203,115,
- 54,107,214, 44,156,101, 89,175,154, 60,148, 60,207,171,111,223,190, 29,100, 73, 56, 85, 42,213, 8,111,111,239,101,106,181,122,
-111, 66, 66,194, 39, 47,162,230,173, 82,169,218, 51, 12,115,152,231,121,171,242, 14,151, 89,132,121,120,120,248,200,100,178,167,
- 58,185, 87,197,249,245,236,230,115, 58,116,238, 52,248,226,217,243,251, 62, 95,124,123, 97,217, 99, 31, 14,118, 26,251,214,164,
-143,190,254,109,221,119,159,175,221,151,245, 83,117,225,108,217,178,101, 40,128, 70,102, 55,171, 42,112, 28,167,190,125,251,118,
- 72,109, 92, 7,231,150,164,149,131,141,203, 66,189,193, 16,192, 16, 80,177, 68, 18,153,147,147, 49,167, 34,113, 85, 25,167,151,
-151,215,178,134, 13, 27,126,244,240,225,195,237, 9, 9, 9,239,150,185,199,223,212,173, 91,119, 82, 66, 66,194,218,132,132,132,
-207, 44, 77,163,250,245,235,219, 5, 4, 4,100,207,159, 63,159,153, 59,119, 46,194,194,194,156, 18, 19, 19,179, 95, 68,186,251,
-248,248,120,200,229,242,109, 60,207,251,114, 28,183,238,209,163, 71, 43,106,195,233,239,239, 47,201,201,201,249,200,219,219,123,
-170,187,187,187,123,106,106,106, 92,124,124,252,210,148,148,148, 31, 44, 21, 87,150,164, 81,112,112,176, 14, 40, 94, 78,204,146,
-254, 86,255, 85, 7,171, 92,126,242,229,121,126,113, 64, 64,192,144,177, 99,199,146,232,232,104,156, 56,113, 2, 79,158, 60,217,
- 71, 41,157, 85, 89,147,110, 77, 57,143, 29, 59, 70,227,226,226,118, 49, 12,243, 69, 98, 98,226,163,191, 43,238, 47, 29,204,211,
-238,255, 21, 31, 0,205,171, 59,231,213, 87, 95,109,208,186,117,235,208, 22, 45, 90,240, 45, 90,180,200,127, 17,156,127, 69, 56,
-205,159,206,157, 93,108, 94, 52,231, 95, 17,206, 90,114, 50,207,249,249,199,227,222,176, 97, 67,106,214,112, 47,105, 26,253, 39,
- 57,215, 47,106,161,186,122,242,205,111, 55,127,213,220,179,252,177,121,147, 29,109, 79, 29,120,253,235,121,147, 29,109, 95,198,
-184, 3, 96, 42,217, 79,106,195,233,237,237,189,225,181,215, 94,227,188,189,189, 55,253,155,227, 14,128,248,248,248,200,132,231,
-232,197,115,186,187,187,135, 40,149,202,131, 74,165,242,160,167,167,103,235, 23,204,185,223,195,195, 35,232,159,136,251,203,246,
- 17,253,211, 2,239,208,161, 67, 15, 1,116, 25, 56,112,160, 27,203,178,255,250, 69, 58, 67, 67,211, 11, 95, 98,189,253,159,183,
-216,239,223,191, 79,132,106,211,191, 15, 31,204,190,169, 6,240, 73,235,238,207, 30, 43,153,154,225,243,110, 3, 95,206,184, 87,
-230,218,212,118, 33,230,248,248,248, 15, 84, 42,213,212,154,140, 62,252,135,226, 77, 1,232,132,220,255,226,145,146,146, 18, 14,
- 96,192,191,157,243,255, 59, 68,255,150,128,252,241,199, 31,105, 66,114, 8, 16, 32, 64, 64,245,248,183,139, 43, 1, 2, 4, 20,
-207,148,218,188,146,218,135,197,109,171,132,144,230, 53,189,112,117,252, 2,167,192, 41,112, 10,156, 2,167,192, 41,112,190,124,
-156,213,113,191, 44,125,187,200,139, 30,137, 82,254,230,253,215, 59, 21, 10,156, 2,167,192, 41,112, 10,156, 2,167,192,249,215,
-115,190,108, 96,132, 91, 32,224,175,198,154,113,196,115,205, 56,226,249, 87,157, 47, 64,128, 0, 1, 2, 4,252,219, 32,122,217,
- 34, 20, 18, 18,226, 79, 41,125,139, 16, 50, 4, 0, 40,165,187, 9, 33,191,133,135,135, 91, 52, 3,173,149,149, 85,138, 86,171,
-117, 3, 0,185, 92,158,166,213,106,149,101, 69,123,153, 15, 80,188,214,166,121,212, 90,165, 86, 96,253,250,245, 83,116, 58,157,
- 37,235,235,221, 32,132, 92,231,121, 62, 66,161, 80, 92,184,127,255,126,140,165,241,238,217,179,231, 7, 54, 54, 54,115, 52, 26,
-205,215,199,142, 29,251,238,175,190,207,132,144, 54,222, 42,143, 45, 70,147,129, 79, 73,203,154, 77, 41, 61, 80,209,121,223,191,
- 75,150,138, 72,241,164,145,223,191, 75,150, 79,252,145,206,172,138,183,166,231, 87, 17,190, 16,177, 88,252,161,187,187,123,223,
-196,196,196,112, 0,159, 83, 74,133, 89,136, 5, 8, 16, 32, 64,192,191, 79, 96,181, 11,118,110, 76,120,195,103, 98,150,118, 50,
-114,228, 60,101, 36,203, 47, 71,100,198, 60, 79, 0, 84, 42,149, 55, 33,164, 11,165,212,143, 97,152, 91, 60,207, 31, 87,171,213,
-153, 53,225, 8, 14, 14,246, 6, 48, 28,192,136,182,109,219, 54,159, 48, 97, 2, 26, 54,108, 8,173, 86,139,176,176,176, 25,191,
-254,250,235,140,224,224,224,219, 40, 94, 82,102, 71, 68, 68, 68, 66,101, 92, 90,173,214,205,172,149, 8, 33,110, 67,134, 12, 9,
- 43,179, 8, 47, 49, 47, 46, 75, 41,189, 2,224, 50, 33,228,210,142, 29, 59, 18,155,184, 89,181,173,235,237,250,234,145,240,184,
-217,229, 57,117, 58,157,219,141,131,251, 64, 77, 28, 10,146,226,209,224,245,225,165,199, 78,188,222, 29,180, 48, 15, 98,153,228,
- 70,215, 63, 46, 93, 7, 16, 17, 31, 31,127,189, 78,157, 58, 49, 85,113,150, 71, 96, 96,224,130,121,243,230,185, 12, 28, 56,240,
- 67, 0,149, 10,172,154,112, 86, 33, 94,100,109, 67, 90,158, 57,184,103,135, 28,132,193,107,131,135,108, 39,132,140, 42,191,152,
-244,247, 99,136, 59, 97,241,217,132,143, 39,176, 0,240,253,170,245,159,175,122,155,172,254,248, 23,154,226,233,233,217,149, 82,
-250,121, 9,223,215, 73, 73, 73,103,190, 31, 67,220,193, 96,250,132,143, 39, 16, 0, 88,191,106,253,103,223,143, 33,223, 77,220,
- 66, 83,107, 24,190,137,239,188,243,206,234,197,139, 23,179, 37,147,240,245,241,247,247,111, 76, 8,241,167,148, 10,157,131, 5,
- 8, 16, 32, 64,192, 63, 47,176,154, 55,183,119,176, 98,232, 84, 43, 41, 29,222,167,147,127,189, 1,125,219,147,250, 13,234, 35,
- 38, 58,198,247,204,217,107, 99,186,182,182,125,172,209,147, 29, 26,158,172,188,125,187,234,245,195,230,140, 35, 70,147,169,248,
-154, 34, 17,184,109,199,189,246,245,232,209,163,222,216,177, 99, 17, 20, 20,132,240,240,240,174,187,118,237,250,200,219,219,251,
-154,209,104, 60, 44,147,201, 66,171,155,225, 56, 56, 56,120,153,167,167,231,231,211,166, 77, 35, 33, 33, 33,144,201,100,165,199,
- 20, 10, 5,186,119,239,142,238,221,187, 35, 37, 37,165,121,104,104,104,243,223,126,251,109,105,112,112,240,215, 17, 17, 17, 51,
- 44,185, 65,115,230,204, 9,174, 96,247, 49, 66,200, 67,134, 97, 34,154, 54,109,154,216, 80,169,104,226,238,234,124,232,171,197,
-243, 1,160, 82,225,178,191,119,123, 0,120, 74, 96, 25, 50, 82, 33,183, 85,220,144, 88, 89, 93, 7, 16, 1,224,122,157, 58,117,
-110, 88,202, 9, 0, 93,186,116,145,217,218,218, 18, 74, 41, 90,183,110,237,212,187,119,239, 24,134, 97,190, 59,114,228,200,250,
-178,231,213,132,179, 26,180,153,247,217, 36, 73,198,163, 27,184,123,233, 56, 6, 5,123,202,175,223,185,183, 8,192,158,170,133,
- 15,195,108, 13,119,153,241, 49,240, 17,207,243,115,162,163,163, 59, 3,128,159,159,159, 20,192,153,109, 97,142,253,222,105,159,
- 91,235,105, 22, 8, 33, 18,150,101,215,109,219,182,237,189, 81,163, 70, 33, 46, 46, 14, 23, 46, 92,128, 66,161,192,130, 5, 11,
-234, 78,155, 54,109, 41,128,143,132,199, 94,128, 0, 1, 2, 4,252,163, 2,171, 83,176, 77,216,224,206, 13,130, 7,246,110,207,
- 52,244,243,135, 68,102, 93,122,172, 69, 80, 16, 90, 4, 5,145,241,227,243,235, 71, 94,143,252,226,232,169,171,179, 58, 5,219,
- 68,156,143, 40,108, 93, 25,159,201, 4,209,210,197,191, 1, 0,182,109,126,139,141,137,137,169,103,101,245,191,201,162, 59,119,
-238,140,206,157, 59, 51, 75,151, 46,109,115,230,204,153, 54, 59,118,236, 48,120,122,122,174, 74, 74, 74,218, 85, 69, 48, 63,223,
-181,107, 23, 97, 89, 22, 44,203, 86,122,146,135,135, 7,122,246,236, 9, 15, 15, 15,242,217,103,159,125, 14,160, 66,129, 37,151,
-203,211, 8, 33,110, 0,224,232,232,200,205,155, 55, 47,146,150, 0, 0,120,158,191,194,178,236,101, 66,200,149,189,123,247, 38,
- 53,240,180,242,180,149, 89, 31,223,180, 97, 13,140,121,169, 78,149, 93,191, 72,157,104, 86, 1, 79,237,151,218, 88,223,144,218,
-216, 92,151, 42, 20, 17, 0,174, 3,184, 97, 41,167, 89, 92, 89, 89, 89,157,219,176, 97,131, 35, 0, 76,158, 60,217,161,168,168,
-200, 97,220,184,113, 51, 0,148, 10,172,154,112, 86, 33, 96, 28, 58,181, 11,121,178,122,217,151,118, 65,109, 58,226,202,238,239,
-145,147, 83,136,194,252, 34,240, 60,255,204,202,191, 19,183,208,212,239,223, 37,203,191,255,118,253,116,194, 48, 36,160,247,231,
-232,237, 68,167,168, 84,170, 59,132, 16,177, 84, 42, 53,243,138,188,188,188, 84,141, 27, 7, 46,111,216,177, 9,214,127,183, 14,
-148,231, 41,128,229,150,186, 87,132, 16, 55, 91, 91,219, 3,199,143, 31,111,211,170, 85, 43, 92,185,114, 5,143, 30, 61,194,164,
- 73,147,244,147, 38, 77,146,140, 30, 61,154, 76,157, 58,117, 50, 33,100, 55,165,244,162,240,232, 11, 16, 32, 64,128,128,127, 76,
- 96,201, 37, 92,171,121,171, 35,193, 21, 62, 4, 53,198,131, 26, 82,158, 57,199,218,193, 27, 77, 3,220, 97, 45,117,101,110, 69,
-127,219,170,236,177,234, 70, 24,152,197,213,238, 21,170,102,154,194,100, 9, 0, 88,217, 40, 13,111, 76, 77,186,211,170, 85, 43,
-184,186,186, 74, 46, 93,186, 52, 21,192,174, 42, 56,137,254,102, 56,238, 14,232,128, 6,119,179, 96,109,109, 13,115,193,109, 70,
- 76, 76, 12,206,157, 59,135,184,184, 56,248,250,250, 2,255,235, 67,245, 12,167, 70,163,241,232,211,167, 79,232,215, 95,127,253,
-202,178,101,203,110,109,223,190,189, 11,165,180,168, 66,119,175,142,189,131,148,138,143,111, 94,255,173, 24,250, 66,167,123,215,
- 46,162, 89,223,247, 43, 12,103,189, 1,111, 96, 66, 78,113,211,227, 78,127, 21,228,118, 10,200, 20,182, 55,122, 30,187, 86,234,
- 92, 1,184, 97, 41,103,183,110,221,198,136, 68,162,217, 0,236, 55,110,220,232,224,224,224,192, 28, 56,112,192,176, 97,195,134,
-124,137, 68,162, 39,132, 44,169, 77, 56,171,130,152,101, 23,126, 51,239, 51, 59,107,198,132,235,135,127, 65, 98, 92, 60,110, 62,
- 72, 50,254,126, 62,138,211, 27,185,177, 21,221,207,137, 63,210,153,211, 6,203,182,132, 39,251, 30,236, 63,119, 82,163, 69, 3,
-221, 97, 48, 24, 54,167,167,167, 99,220,184,113,224,121, 30, 29, 59,118,236, 64, 41, 77,154, 50,101, 10,124,125,125,177,249,143,
-251, 69,162,188,171, 93,126, 61,149, 23,110, 73, 94, 34,132, 52,247,241,241, 57,126,230,204, 25,119, 79, 79, 79,132,134,134, 34,
- 37, 37, 5, 74,165, 18,147, 38, 77,146, 46, 91,182,108, 91, 94, 94,222,208,197,139, 23,203,111,223,190,189,131, 16,226, 93,162,
-153, 95,248, 8, 24,129, 83,224, 20, 56, 5, 78,129,243, 47, 65, 43, 0,174, 0,210, 1, 92, 43,183,141,146,223,168, 96, 59,163,
-164,204, 47,187,120,121, 6,138,251, 79,187, 2,224, 0,132, 1,200,126,209, 1, 22,149, 20, 80,157, 1,132, 2,152, 79, 41,157,
- 87,254, 36, 67, 82, 40,164,117, 95, 7,228,205, 64,245, 15,193,235,147, 64,197,110, 40, 44,146, 35,227, 73, 28,238, 94,217, 13,
-106, 42,170,254, 98, 34,152,214,172,122, 75,100,107, 13, 72,100,174,134,252,252,124,216,216,216, 64, 83,152, 44, 25, 61,174,212,
-217,146,156, 57,115, 6, 17, 17, 17, 80,169, 84,213,138, 64, 0,160,250,226, 86, 68,189, 94, 15,189, 94,143,148,126,173, 97,211,
-246, 21,100,191, 61, 9, 39, 79,158, 68,122,122, 58, 36, 18, 9, 36, 18, 9, 76,166,234, 39,139,103, 74, 86,226, 53,155, 86, 21,
-157,227,229, 69,228,182,156,213,161, 53, 43,151,216,217, 41,172,221,195,143,239, 71, 92, 92,138, 69, 55, 93,106, 99, 13,169,149,
-245, 13,169,141,213, 83,226,170, 38,156, 44,203, 46,216,179,103,143,167, 78,167,131, 68, 34,193,238,221,187, 13, 91,183,110,189,
- 83, 88, 88,216, 41, 34, 34, 66,243, 34,194, 89, 30,206,174,174,127,190, 62,242,253, 73,139,222,237, 9, 77,161, 22,251,206, 71,
-225,212,173,199, 3, 1, 92,160,148, 86, 58,195,253,138,125,186, 7,158,158,158,221,199,141, 27,119, 99,239,222,189, 46,223,124,
-243, 13, 56,142,131,201,100,130,201,100, 42,253,205,113, 28,182,111,223,142, 11, 87,163,166,168,213,121, 22, 45,166, 75, 8, 81,
-213,171, 87,239,228,213,171, 87, 93,173,173,173,113,226,196, 9,228,228,228, 96,226,196,137,165,206, 85, 78, 78,206,240,245,235,
-215,191,241,228,201,147,111,206,159, 63,159, 9,128, 5,240,175, 95, 53, 64,128, 0, 1, 2,254, 63,161, 26, 45,226, 74, 8, 57,
- 68, 41,237, 15,160, 7, 0,105,153,109, 16, 66, 14,149,148,219, 79,109,207,152, 49, 99,214,210,165, 75,239,152,183,205,231,204,
-156, 57,179,217,178,101,203,150,180,107,215,110,199,165, 75,151, 98,255, 50,129, 5, 32,148, 82, 90,105,223, 23,221,195, 95,161,
-139,253, 29, 18,101, 87, 72,235, 15,131,216,165, 29, 18,238,133,226,198,201,149, 72,188,127, 1,148,231,224,238,221,180,218,139,
- 45,220, 76,197, 42,149, 42, 66,173, 86,227,250,245,235,120,248,240, 33,228,242,103, 90,150,112,234,212, 41, 0,128,187,187,187,
-101,130,165, 85, 7,120, 71, 38, 35, 33,160,120,192,159,119,100, 50, 0, 96,201,204,153,144, 74,165,144, 72, 36,165,231,114, 28,
-103, 73, 34,155, 5,150,121,148,224, 51,199, 27,184,219,238,154, 59,227, 67,159,122,190, 13, 85, 87,255,220,137,216,216, 36,164,
-166, 90,150, 62, 50,133,205, 13,153,173,205,117,169,213,255,154, 5,107,193,185,115,232,208,161, 99, 6, 15, 30,108,213,182,109,
- 91,217,143, 63,254,152, 83, 94, 92, 61,111, 56,203, 66,169, 84,246,126,245,213, 87,255, 28, 63,126, 60, 6,245,233,129,183, 58,
-250,209,196,180, 92, 13,128, 19,148,210,106,111,106, 82, 82, 82,146,167,167,103,207,215, 95,127,253,215,102,205,154,249, 81, 74,
-209,180,105, 83, 12, 26, 52, 8,123,246,236, 65, 84, 84, 20,242,243,243, 13,231,207,159, 95,165, 86,171,127,178,240, 97,180,118,
-116,116, 60,122,250,244,105, 87,107,107,107, 28, 63,126, 28, 69, 69, 69,207, 56, 87, 75,150, 44,145, 63,126,252,120,237,177, 99,
-199,234,162,120, 93, 56, 65, 92, 9, 16, 32, 64,192,191, 15, 85,106, 17,179,112,162,148,246, 47, 43,152,202, 11, 45,243,111,243,
-121, 75,151, 46,237, 95, 86,124, 1,192,178,101,203,150,148,217, 46,250, 43, 34, 99, 22, 88, 93, 8, 33, 20, 64, 23, 74,233,217,
-114, 54, 96,241, 15,222, 4, 67,210, 9, 24,146, 78,192, 58, 96, 54, 14,172,126,251, 41, 34, 75,156,161,138,160,213,106, 33,150,
- 58, 27,182,109,126, 75, 2, 0, 28,181, 49, 60,115,237,234, 28,172, 26, 76,150,106, 73, 56, 9, 33, 76, 25, 94,238, 89,247,202,
-107, 69,187, 14,109, 58, 54,108,209,218,250,234,209,189,120,112, 63, 14, 25, 25,185, 0,133,182, 50,206, 19,195,250,162,240, 81,
- 12,172,236,236,110,244, 62, 29,249,148,115, 85, 27,206, 19, 39, 78,124,218,174, 93,187, 57,187,119,239, 86,251,250,250,202, 68,
- 34,145,161,172,184,170,109, 56,203, 66,165, 82,117, 16,137, 68,199, 25,134,177,234,211,167, 15,166, 76,153,130,239,190,251,206,
-196,139,229,253,215, 31, 13, 31, 90,160, 51,204,182, 68, 92,149, 17, 89, 55, 1,248,215,173, 91, 87,102, 50,153,186, 14, 24, 48,
-224,112,191,126,253,112,249,242,101,156, 60,121,178,145,193, 96, 72, 46,185,238, 2, 0,238, 12,195,124, 93,197, 74,238,140, 68,
- 34,217,113,242,228,201,102, 42,149, 10, 39, 78,156, 64, 81, 81, 81,169,115,245,206, 59,239, 60,229, 92, 93,186,116, 41, 83, 16,
- 87, 2, 4, 8, 16,240,175, 70,165, 90,164,172,251, 84,145,200,178,176, 82,110, 22, 95,154, 25, 51,102,204, 34,132, 28, 42,113,
-184, 52, 0,212,127,137,192, 42,137, 8, 41,137, 88,181,163,184,184,252,216,103,246,241,124,237,203,173, 70, 61,142,221,177,178,
-178,194,250,245,235, 97,109,109, 93, 99,225, 84,120,120, 47, 18, 38,141, 44,117,174,204, 78, 22,122,143,174,173,192, 50, 59, 88,
- 87, 80,174,137,208,203,203,235,195,150, 45, 91,190,187,105,235,175,182,203,230,124,158,155,119,247,142, 72, 91,164,179,209, 25,
- 77,134,135,169, 25,149, 78,143, 96,202,203,129,204,198,230,134,216,218,170, 34,113, 85, 43,206,203,151, 47,107,187,119,239,190,
-101,201,146, 37,109,121,158,223,250, 34,194, 89, 86, 92, 57, 59, 59, 31, 91,187,118,173,149,149,149, 21,116, 58, 29,190,254,250,
-107,156, 58,117,170,127,114,114,242, 49, 0,199,106,155,222, 6,131,225,189, 30, 61,122,124,251,233,167,159,194,104, 52, 98,216,
-176, 97,120,242,228,201,241, 7, 15, 30,124,231,229,229,245,233,196,137, 19, 85, 46, 46, 46,152, 48, 97,130, 4,192, 59,149,208,
-124,245,219,111,191,245, 15, 8, 8,192,217,179,103,145,155,155, 11,165, 82,137, 15, 63,252, 80,186,116,233,210,109,249,249,249,
- 67,151, 46, 93, 42, 56, 87, 2, 4, 8, 16,240, 31,129,165, 90,164,172, 19, 85, 67,126,243,255,196, 75,151, 46,189,179,116,233,
-210,167, 28,174,191, 68, 96,149, 68, 6, 0,186, 88,226, 14,241,154,103,251,240,240,156,169, 38,145,180,232, 60, 75,154,243,128,
-255,245,193,170, 64, 40, 61,179, 93,131, 62, 88,199, 40,165,151,202, 10, 44, 47, 47,175,215, 60, 60, 60,190,250,237,183,223,172,
-212,106, 53,188, 26, 55,183,255,115,207,239, 58,119, 27,153, 54, 49, 43,107,116,100, 82,193,238,202, 56,121,109,225, 13,185,141,
-226,186,220, 90, 81, 94, 92,213,154, 19, 0, 78,157, 58, 53,173, 2,135,237,185, 56, 85, 42, 85, 7, 23, 23,151, 99,107,215,174,
-181, 86,171,213,144, 72, 36, 80, 40, 20, 56,125,250, 52, 74,196, 85,173,225,229,229, 53,111,242,228,201,115,223,121,231, 29,100,
-103,103,227,228,201,147,232,218,181, 43,214,174, 93,235,115,250,244,233,111,219,183,111, 15,150,101,113,226,196, 9, 24,141,198,
-251,149,164,235,224,241,227,199,127,250,198, 27,111, 32, 44, 44, 12,201,201,201,152, 48, 97,130,254,195, 15, 63, 44,237,115,245,
-253,247,223,191,241,248,241, 99,193,185, 18, 32, 64,128,128,255, 8,170,210, 34,229,240, 39,128, 87,203,187, 90,229,197,151,217,
-161, 42,187, 93,254,252,146,227,218,191, 34, 62,102, 7,171,114,215,138,114, 96,157, 90,130,203,186, 89, 70, 96, 37, 63,117,138,
- 68,166, 0,103,129,112,153, 51,142, 24,103,188, 5,209,207, 11, 24,136,165,206,134, 70, 61,142,221,169,236, 92,133, 66, 1,158,
-231, 45,210, 97,146,126,111,176, 13,122,191,134, 71, 45, 60, 64,141,134, 82, 39, 11,179,102, 61, 37,174, 36, 18, 9,244,122, 61,
- 80, 65,179, 95, 57,132, 17, 66,158,176, 44,123,153, 82, 74,187,116,233,178,217,104, 52,190,166, 80, 40, 28,199,141, 27,103,200,
-200,200,192,190,125,251,176,101,203, 22, 77,129, 65, 20,158,157,105,124,251,145,186, 32,177, 10,190, 27,175,158,189,243,148,115,
-245, 2, 56,159,193,139,224, 84,169, 84, 29,220,220,220, 74,197,149, 76, 38,131, 66,161, 64, 82, 82, 18, 68, 34,209,115, 77,210,
- 89,183,110, 93, 89,155, 54,109,166,143, 30, 61, 26,119,239,222,197,140, 25, 51,146,213,106,245,222, 3, 7, 14, 76,152, 58,117,
-170,168,115,231,206, 72, 75, 75,195,134, 13, 27,140, 97, 97, 97, 75, 82, 82, 82,150, 87,152,105, 69,162,247, 22, 46, 92, 72,213,
-106, 53,121,244,232,209, 83,206, 85, 94, 94,222,208,165, 75,151,202, 99, 99, 99, 5,231, 74,128, 0, 1, 2,254, 91, 14, 86, 85,
- 45,104, 25, 37,226, 41,181,130,109,182,140,176, 42,191,157, 86,110, 27, 0,244,229,142, 71,254,101, 2,171, 50, 24, 57, 38,247,
-183,181,239,219, 15, 28, 50, 17,114,143, 87,160,127,188, 19,188, 38,181, 84, 96, 73,228,182,176,115,169,131,188, 2, 13, 46, 70,
-199,194,200, 49,185, 85,241,153, 76, 16, 77,254,248,127,163, 5, 29, 28, 28,144,155,155,251,148,163,101,109,109, 13,149, 74,133,
-188,188, 60,236,222,189, 27,213,205, 89, 68, 41, 93, 56,122,244,232, 47, 39, 78,156,200, 52, 24, 49, 22, 5, 87,206, 63,227, 90,
-201,229,114, 88, 89, 89, 33, 41, 41, 9,247,238,221,227, 41,165, 11,171, 81,209, 87, 25,134,185,177, 99,199,142,196, 46, 93,186,
-188,227,232,232, 56, 98,236,216,177, 86, 97, 97, 97, 88,184,112,161,232,196,137, 19,134,107,215,174,153, 56,142,155,150,148,148,
-180,193, 2, 85, 94, 94, 92, 61, 55,103, 5,226,234,185, 57, 85, 42, 85,123,149, 74,117,236,187,239,190,179, 78, 73, 73,129, 76,
- 38,131,173,173, 45,226,227,227,177,112,225,194, 66,147,201,212,231, 57,243,155,204,198,198, 70,102, 52, 26,177,117,235, 86, 36,
- 37, 37,181, 75, 78, 78,142,247,240,240,216,240,193, 7, 31,172,246,243,243,107,122,239,222,189,251, 5, 5, 5,147, 82, 82, 82,
-238, 86, 70,226,224,224,208,206,213,213,149, 92,190,124, 25, 19, 38, 76,208, 79,158, 60,185,180,207,149,224, 92, 9, 16, 32, 64,
-192, 75,137,176,106,182,255,117,168, 82, 96,165, 23,105,220, 54,108,219,187,124,199,158,125,227,198,143, 30, 33,239,210,101, 52,
-196,249,183,192,101, 70, 64,213,168, 3, 8,107,141,171, 55,174,227,230,195, 4,109,145,150,221,156,103,208,124, 86, 78, 88, 84,
-185,218,118,110,110, 46,234,214,173,139,227,155,155, 52,211,107,211, 36, 65, 78, 0,129,189,225,196,233,126,119,206,157, 59, 87,
- 0, 96,115,163, 70,141,118, 85,197,121,253,250,245,249,129,129,129, 7,102,206,156,185,180, 81,163, 70,125,198, 47, 88, 7,201,
-199,163,161,137,186, 9,235, 46, 67,225,224,224,128,172,172, 44,132,135,135, 35, 63, 63,255, 40,165,116,230,141, 27, 55,110, 85,
-197, 73, 41,189,210,180,105,211,196, 54,109,218,216,234,245,250,239, 62,249,228, 19,171,194,194, 66,100,100,100, 32, 51, 51, 19,
- 87,175, 94, 61, 97, 52, 26, 63, 74, 77, 77,125, 92,133,168, 42,229,228,121,190, 84, 92,189, 40,206,178,120, 81,156, 54, 54, 54,
-159,237,219,183,239, 41,231, 42, 46, 46, 14, 11, 22, 44, 40,212,106,181,125,212,106,181, 69, 19,116, 86,149,238, 60,207,195,100,
- 50,129, 82, 10,169, 84,154, 7, 0, 37, 98,170,187,165,156, 25, 25, 25,161, 79,158, 60, 25,100, 99, 99,131,201,147, 39, 75,151,
- 44, 89,178, 45, 55, 55,183,198,206,213,255,231, 85,235, 5, 78,129, 83,224, 20, 56,255,109,156, 47, 27,170, 20, 88, 81, 81,212,
- 0,224, 35,127,127,187,249, 95,175,255,109,253,207,187,246, 12, 30, 55,252,117, 81,112,139,174,120,156,114, 0,231,194,207,152,
-178,243,233,190,124, 61, 59, 33, 42, 42,175,218,177,255, 34, 17, 76, 51,103,191, 37, 2, 0,177, 24,166, 89,253,251,135, 54,107,
-214,172,227,192,128, 52,201,132,201,197,206,214,250, 53,111, 73, 66, 67, 67,119,201,100,178,141,177,177,177,121,150, 68,162, 68,
- 48,245,109,213,170,213, 43,159,126,250,233, 87,253,234,121,181, 30,220,174, 11,196, 98, 49,174, 93,187,134,172,172,172, 48,134,
- 97,166, 95,191,126,253,156, 37,124, 7, 14, 28, 72, 4,128,162,162,162,133,141, 26, 53,146, 70, 71, 71,227,225,195,135,136,137,
-137, 1,199,113, 15, 18, 19, 19,107,212, 33, 78, 46,151, 95, 5,112,231, 69,114,150,197,139,226,212,104, 52, 75, 22, 45, 90,212,
-107,254,252,249, 50, 91, 91, 91,220,184,113, 3,243,231,207,175,145,184,170, 14,148, 82, 24,141,198, 26,141,252,172, 0,211, 3,
- 2, 2,154, 44, 90,180,168, 81, 73, 95, 46,193,185, 18, 32, 64,128, 0, 1,255, 29,129,245, 63,161,149,151, 13,224,205, 32,127,
- 59,223, 37,235,126,221,108, 37,229, 59,106,244,204, 5,141,142, 25,119, 61, 42,239,145,165, 23, 91,184,153,138,203,110, 47, 0,
-224,239,239,111,147,224,129, 2,243,190,132, 84, 64,173, 86,127, 93,155,200, 92,187,118,237, 28,128, 54, 65, 65, 65,131, 15, 19,
- 50, 11,136, 5,165,116,201,245,235,215,247,213,132,167,117,235,214,117, 11, 11, 11,127, 54, 24, 12,129, 60,207, 75,207,158, 61,
- 11,173, 86,139,232,232,104, 13,207,243,187,107, 26,174,216,216,216, 59, 47,154,243,175, 8,103, 98, 98,226, 53,149, 74,213,131,
- 16,114,114,250,244,233,178,154, 58, 87,213,193,201,201,169, 40, 37, 37, 37, 83,171,213, 58,167,166,166,234,157,156,156,106, 53,
-247, 8,165,244, 1, 33,164,197, 39,159,124,178,224,211, 79, 63,253,236,171,175,190,146, 8,125,174, 4, 8, 16, 32, 64,192,127,
- 78, 96,153, 81, 34,166,186,116,233,226,106,115,225, 82,122,225,139, 8, 64, 84, 84, 84,225,156,113,164,212,217, 18,137,158,127,
-134,237, 18, 65,181,175,182,255,207,207,207, 95,146,149,149,213, 54, 47, 47,207,244,248,241, 99, 13, 33,196, 68, 8,209,240, 60,
-191,128,231,249, 13, 47, 51,167, 90,173,190,232,225,225,209,233,226,197,139, 83, 11, 11, 11,215,170,213,234, 75, 47, 42,179, 69,
- 68, 68, 24,149, 74,229,200, 1, 3, 6,140,229,121,126, 67, 82, 82,146,177,182, 92,148, 82, 61,128,233,132,144,189,183,110,221,
-218,121,233,210,165,100, 65, 92, 9, 16, 32, 64,128,128,255,164,192, 50, 35, 52,244,197,136, 43, 51,202, 59, 91,255, 52,238,221,
-187, 55, 28,192,240,255,143,156, 0,144,146,146, 18,254, 87,240, 2, 64,114,114,242,113, 0,199, 95, 20, 31,165,244, 26, 33,164,
- 30,138, 71,137, 8,226, 74,128, 0, 1, 2, 4,252,119, 5,150, 0, 1,255, 38,148, 44,105, 36,136, 43, 1, 2, 4, 8, 16,240,
-175, 1, 1,208,188,146, 66,203,226,209, 1,132,144,230,181, 40, 20,111, 11,156, 2,167,192, 41,112, 10,156, 2,167,192,249,255,
-139,179, 58,238,151,101,116, 34,121,206,209, 92,213,222, 60, 97, 8,171,192, 41,112, 10,156, 2,167,192, 41,112, 10,156,255,223,
-192, 8,183, 64,128, 0, 1, 2, 4, 8, 16, 32,224,197,162,198,125,176, 90,183,110,221, 16, 0,194,194,194, 30,252, 85,129, 34,
-132,124,168, 84, 42,199,181,108,217,210, 79, 34,145, 48,185,185,185,243, 67, 67, 67,231, 87,116,110, 64, 64, 64,120,175, 94,189,
-124,207,156, 57,163, 47,249, 47,202,126,115, 28,151, 24, 30, 30, 30, 34, 36,245, 63, 3,165, 82,121, 76, 46,151,251, 20, 79, 48,
- 74, 97,226, 57,112, 60, 5,199,241, 48,114, 20, 6,189, 54, 78, 87,152,219,187, 86,220,129,175,215,225, 56,126, 41, 5, 93, 79,
- 40,153, 64, 9, 93, 79, 40,249,128, 50,100, 61,225,233,251, 16,153,190,129, 73,244,169,136, 23,207, 86, 71,237, 74,120, 25,238,
-231,252,249,243,159,171, 82, 52,119,238,220, 10,215,159, 10, 10, 10, 58, 36,151,203, 27, 84,246,191,162,162,162,228,200,200,200,
-174, 47,115, 94,245,240,240,120,133, 97,152, 53, 0,154,149, 59,116, 23,192, 71,106,181,250,212,191, 45,204,110,110,110,231, 88,
-150,109, 84, 88, 84, 84,152,159,151,231,107,107,107,251,200,202,218,198,134, 51,113,247, 51, 50,210, 94, 17,222, 64, 2, 4,252,
-139, 5, 86,112,112,112, 99, 0,157, 9, 33,157, 41,165,175, 52,109,218,212,189,168,168, 8,193,193,193,169,132,144,115, 37,171,
- 95,159,141,136,136,136,121, 17, 1, 98, 89,118,249,119,223,125, 55,109,242,228,201,165, 34,233,246,237,219, 85,157,239,181,108,
-217, 50,251,248,248,120, 72, 36, 18, 72,165,210,210, 15,203,178,104,219,182,109,141,174,239,228,228,100,235,230,230, 54,159, 16,
- 50,148, 97, 24,182,186,243,121,158,231, 40,165,187,210,210,210,230,102,101,101,229,215,228, 90,173, 66, 90, 26, 1, 82,201, 53,
- 40,119, 45,252,102,149,163, 43,155, 52,105, 18, 46, 18,137,188,202, 10,202, 50, 34,181,194,223, 28,199, 37,222,185,115, 39,196,
-210,123, 33,183,182,254,140, 48,162, 30,160,124,211, 98, 50,230, 46,229, 77, 39,181, 69, 69,203, 45,137,175, 76, 38,243,137,184,
-126,189, 81,212,189, 88,248,214,175, 3,189,193, 4,157,222,136, 3, 39,175, 33,192,175, 30, 6,246,235, 89,235,188, 98,226,201,
-188,217, 31,190,221,109,201,154,237,173,102, 77, 30,161, 88,178,102,123,200,172,201, 35,108,151,172,221, 30, 50,123,202, 91,182,
-139,214,252, 22, 50,123,202, 91,246,139,215,252,166, 7,240, 94,109,174,241,110, 11,159, 66,134, 51,201, 42, 76,123, 86,164,251,
-241, 86,156,205, 63,241,224, 46, 89,178,164,177,193, 96,136,126,103, 88,200,194,166, 13,221,210, 42, 58, 39, 55, 55,205,237,225,
-221,240, 57, 16, 75,252,252, 90,207,170,242,249,148, 72, 36,245,207,157, 59,215,200, 60,211, 62,199,113,224, 56, 14, 38,147, 9,
-122,189, 30,111,188,241,198, 11, 25, 16, 19, 18, 18, 50,150, 82,186,184, 56, 91,146, 69,225,225,225,107,159,163, 34,166, 16,137,
- 68,159, 72,165,210,206, 38,147,201, 15, 0,196, 98,113,180, 78,167, 59,107, 50,153,190,165,148, 22,212,132,143, 97,152, 85, 97,
- 97, 97,254,182,182,182, 48, 24, 12,165, 11,195,179, 44,219,180, 77,155, 54,235, 0, 52,178,148,203,203,203, 43,156, 16,226, 85,
-147,235, 83, 74, 19, 19, 19, 19, 67,106,248,190,108,244, 36, 94,237, 86,183,142, 10, 0, 96,109,109, 99,115,237,246, 99,183,224,
-102,117,133,210, 77,128,128,127,171,192, 10, 14, 14, 62, 12,160,115,211,166, 77,173,122,246,236,137,160,160, 32,248,248,248, 64,
- 46,151, 3, 0,178,178,178,220,163,162,162,222,188,113,227,198,155,151, 47, 95, 70,112,112,176, 6,192,133,136,136,136, 10,221,
-136, 30, 3, 58, 77,150, 43,100,223, 1, 64,122, 82,102,114,226,163,180, 53,201,201,201,203, 41,165,124,153, 23,166,239, 59,239,
-188, 51,117,202,148, 41, 56,116,232, 16,182,111,223, 14,157, 78,135,220,220, 92,132,134,134, 86, 24, 78,142,227, 18, 71,141, 26,
- 37,138,137,137, 49, 85,230, 96,213,176, 70, 56,127,216,176, 97, 31,251,251,251,151, 46,235, 98, 52, 26, 75,191,179,179,179, 49,
-117,234, 84,243, 11, 17, 60,207,227,244,233,211,147, 63,255,252,115, 0,248,164, 34,206,158,157, 27,132,139, 8,241,226,255, 39,
-202, 18, 79,156,123, 20, 2, 16,246, 90,120, 36, 41,247,146, 5, 0,180,110, 21, 88,173,184, 19,137, 68, 94,215,175, 95,119,147,
- 72, 36, 22,197,141,231,121, 4, 5, 5, 89,116,174,167,167,103, 87, 27,133,221,246,193,195,223,117, 12, 12, 10, 18,123,169,148,
- 48,154, 76,136,125, 28,223, 58,242, 70, 68,224,241,131,191,143,243,244,244, 28,145,148,148,116,166, 42, 30, 35,199, 35,242,206,
- 3,156,184,112, 29, 3, 36,114, 20,105,245,200, 47,210,227,231, 63, 46, 34, 49, 45,183,214, 25,183, 77,155, 54,158, 54, 34,151,
- 54, 83,222,123,205,230,155,239,183,217, 76,121,239, 53,172, 88,255,115,233,247,228,119, 7, 97,249,247,219, 20, 83,222, 29,132,
- 53, 27,182,180,107,211,166,141,231,213,171, 87,147, 42,227,171, 44,141, 24,206, 36,219, 28,149,196, 2, 64,250,134, 13, 48,164,
-166, 66, 53,119, 46, 0, 96,124, 51, 47, 89, 77,194,220,188,121,243, 82, 65, 92,165,112, 52,153, 18,111,223,190, 29, 82,157,184,
- 50,153, 76, 84, 36, 18,205, 57,127,100,254,238,246,173, 27, 63,117, 51, 99,238,199,216,207,251,114,238,144,157, 71,243,233,155,
-125,108,163,163,195,150, 84, 41,178,120,158,103,116, 58, 29,238,223,191, 95,225, 44,251, 12,195,112,181, 73,167, 46, 93,186,200,
- 10, 11, 11,127, 83, 40, 20, 45, 11, 11, 11,199, 82, 74,191, 12, 13, 13,117,103, 24, 6, 61,122,244,248, 50, 36, 36,228,177, 76,
- 38,251, 94,171,213,222, 80, 40, 20, 35, 66, 67, 67,117, 22,138,171, 87,108,109,109,127,222,191,127,191, 99, 80, 80, 16,147,145,
-145,129,122,245,234, 33, 43, 43,171,245,185,115,231,130,223,125,247,221,119, 9, 33,163, 40,165,231,106, 16,220, 38, 54, 54, 54,
-116,244,232,209,132,227,254, 23,221, 31,127,252, 17,193, 13, 82, 27, 76, 24, 98, 85,164, 53,208,220,243, 55,229, 31, 80,134, 94,
-120,242, 36, 39,183,138,240,121,205,223,252,145,155, 84, 42,133,209,104, 44,253, 80, 30, 0, 5, 40, 15, 80,158,130, 82, 0,148,
-128,231,120,172,152,185,185,214,207,131,181,141,141,181,135,135, 50,213,202,218,218,154, 10,229,154, 0, 1,255,122, 7,171,111,
-104,104, 40, 76, 38, 19,108,109,109,193,178,108,121,119, 3,175,188,242, 10,218,180,105,131, 30, 61,122,224,222,189,123, 86, 95,
-125,245, 85,165,118,196, 91,211,250,195,187,145,187, 89, 68, 40,207, 31,186,190,244,135,249,123, 92, 0,124, 90,230,180,177,227,
-199,143, 39,153,153,153, 24, 58,116,232, 57,157, 78, 55,136, 82, 90,229,114, 57,145,145,145, 47,180,249,143, 16, 50, 84,169, 84,
- 98,199,142, 29,208,235,245,207, 28,183,179,179,195,157, 59,119,202,214, 32, 17, 24, 24,200, 18, 66,134, 86, 38,176, 24, 66,188,
-142,132, 62,112, 51,111, 15, 27, 24, 40,233,213,185, 65,170,136,145, 82, 0,100,246,236,217,165,226,138, 82,138, 5, 11, 22, 88,
- 28, 94,137, 68,130,187,119,239,130,101, 89, 60,234,216,184,184, 32,191,158, 0,150,101, 17,217,178,184, 86,219,238,126, 54, 68,
- 34, 17, 20, 10,133,165,226,170,139,187,210,107,255,204,185, 75,109,181, 70,138, 63, 79,135, 33, 94,125, 2,148, 82, 40,221,156,
-208, 62, 56, 72,236,215,162,165,219, 79,235,150,239,247,244,244, 28,148,148,148, 20, 90,185, 88,224,224,215,184, 62,182,238, 63,
-135,197,223,239, 70,102,158, 22,249, 69,197,247,181, 71, 59,127,252,184,162,246, 78,103,211,250,245,189,183,238, 60,134,246,109,
- 91, 99,235,206,163,104,215,182, 53,182,238, 42,222,222,182,235, 24, 58,181,107,131,109,187,142,161,185, 95,163, 58,153, 79,114,
-151,163,138,185,189,158, 73,163, 65,197,105, 84,143,149, 16,115,218, 60,153, 48, 1, 0, 74, 5, 86,141, 31,182, 18, 65, 92,221,
-121, 85,137,224, 50,226, 10,105,105,105, 36, 39, 39,135, 58, 56, 56, 12, 41, 43,178,204,226,234,247, 35,121,208,196,172, 33,191,
-254,122,150, 31, 57,178,115,116,116,216, 18, 63, 96,110,133,139,104, 27, 12,134,199,189,122,245,162, 0,160,215,235, 61,165, 82,
-169,164,156, 0, 83,117,232,208,225, 25,129, 86, 93,211, 97, 97, 97,225,111,187,118,237, 26,236,238,238,142, 65,131, 6, 29,247,
-247,247,151, 90, 91, 91,227,200,145, 35,240,242,242,114,177,179,179, 59,188,116,233, 82,172, 92,185,178,206,241,227,199,183, 3,
- 24,108,193, 51,218,163,107,215,174, 59, 14, 29, 58, 36,151, 72, 36,208,104, 52,184,115,231, 14,236,237,237, 33,149, 74, 49,104,
-208, 32,182,125,251,246,206, 93,187,118,221, 67, 8, 25, 65, 41, 61,105,105, 26,105, 52, 26, 58,115,230, 76, 88, 91, 91,195,198,
-198,166,244, 99, 37,229,200,250,121,245,173, 62, 94,150, 98, 53,251,243,145,203, 54,253,116,240, 76,157, 58,246, 95,198,199,231,
-230, 84,234, 98,177, 45, 48,227,211, 25,102,129, 10,169, 84,250,148,203,110,254, 45,145, 72, 16, 24, 24, 88,109,216,252,252,252,
- 54,176, 44,235, 90, 78,248,178,115,190,152,101,186,117,231,158,141,209, 4, 27,173,222,136, 69, 11,190, 52,177, 12,203, 54,111,
-222,124, 31,165, 52,253,206,157, 59, 31, 8, 69,157, 0, 1,255, 46,129, 5,133, 66,129,107,215,174,129, 16, 2, 91, 91, 91,216,
-217,217,193,222,222, 30,121,121,121,136,138,138,194,221,187,119,241,248,241, 99, 48, 12, 3, 95, 95, 95,160,120,218,135,178,110,
- 76,105,219,222,111, 43, 14, 65,174,144,129, 16,160, 85,207,150, 8,233, 22,128,219, 87, 31,125,164, 82,169, 54,171,213,234,251,
-132, 16, 81,243,230,205,223,109,219,182, 45, 86,174, 92, 9,157, 78,247,109, 69,226,170,162, 81, 11, 31, 12, 22,159,151,136, 24,
-111,131,137, 79,216,176,207,216, 41, 48, 48, 48, 60, 40, 40,168,222,173, 91,183,140,102, 55,171,124, 51, 89,217,126, 89,229, 57,
- 51, 50, 50,192,243,188,197,174, 80, 78,206,179,239,216,114,139, 71, 63,117,108,209,210,149, 14,249,185,105, 88,248,245, 47, 48,
- 26,141,152, 54,109, 26,120,158, 7,207,243,224, 56, 14,217,217,217, 64, 5,213,208,242,225, 52,199,137,101,217,167, 4,112,117,
-219, 85,113,186,186,186,218,200,228,214,219, 63,157,189,208,246,102, 76, 34, 14,157, 14, 3,165, 20, 7, 54,125, 9, 0, 24, 52,
-126, 1,146,146,211,209, 62,184, 41,222,121,255, 19,219, 85, 75,103,111,119,117,117,109,144,158,254,191,201,103,203,114, 26, 77,
- 60,118, 31,189,140,228,204, 2,140, 26,220, 13, 58,189, 17,105,169,201,216,242,253, 55,152, 56,102, 47, 28, 21, 86, 30,190,190,
-190, 49,101,239,145,173,173, 45,171,213,106,207,197,196,196,188, 87, 89, 56,141, 70, 99,223,153, 31,143,195,170,205,187,209,204,
-215, 29,135, 78, 92, 65,171,230, 62, 56,124, 58, 12,237, 90,212,195,209,179,225,104, 31,224,139, 51,151,111,227,163, 15, 70,226,
-179,143,206,245,173, 81, 26, 45, 89,233,144,159,151,134, 63,151,108, 67,218,218,181,136,155, 60, 25,173, 74,242,196, 53,134,129,
-196,211, 19,176,171,254,126, 86,132,187,119,239, 66,167,123,214,168,145,201,100,104,218,180,105,149,156,102,231, 42, 53, 53,149,
-164,166,166,194,198,198,134, 68,223,185,205,249, 53,107, 62,132,203,218,185, 25, 0,138,157,171, 60, 20,221, 91, 13,205,253, 53,
-144,228,220, 98, 54, 45,120, 95, 63,254,203,141,209,230,103,180,124, 56, 35, 35, 35, 75,239, 79,219,182,109,239, 94,184,112,161,
- 73, 25, 23, 24, 38,147, 73, 98, 50,153, 26,153,155, 13, 77, 38, 19,116, 58, 29, 70,140, 24,193, 86, 21,119, 43, 43,171,150,238,
-238,238,184,122,245, 42,230,205,155, 39,109,214,172, 25,238,223,191, 15,134, 97, 48,118,236, 88,248,251,251, 35, 61, 61, 29,173,
- 90,181,194,249,243,231, 3, 45,200,243,182, 54, 54, 54, 63, 29, 60,120, 80,206, 48, 12,242,243,243,193,243, 60, 58,116,232, 0,
- 66, 8,110,221,186,133, 47,190,248, 2,123,247,238,197,254,253,251,173,130,131,131,127, 34,132,248, 81, 74,243, 45, 72, 35,170,
-211,233,168, 92, 46,135, 92, 46,135, 76, 38,131, 76, 38,131, 68, 34,129, 70,207,226,253,185,143,117, 98,153,130,111,217,194,183,
-193,196,241,131,153,133,203,182,156, 6,112,160, 50, 78, 53,189, 3,167,102, 4,199,183,132, 99,208,132, 87, 32, 17, 75, 33, 17,
- 75, 32,149, 72, 33, 46,249, 45, 17, 75, 32, 21,203,192,186,104,171,205, 75, 98,177,216,229,250,245,235, 14,101,159,101,147,201,
- 20, 61,121,242,100,223,193, 3,251,187,239,220,123,136,125,123,216, 32,206,195,221, 45, 35, 33, 33,238, 1, 0,135,224,224, 96,
- 90,211,252, 89, 83, 8,156, 2,231,223,132, 86, 0,202, 86, 48,244, 0,164,230, 98,187,228,221,230, 92,110, 63, 0,164,155,139,
-183, 74,182, 51, 0, 68, 1,240, 43,217,199, 1, 8, 3,144,253,188, 1, 22,149,188,180,104,153,155, 70, 42,184,145,200,203,203,
- 67, 94, 94, 30, 18, 18, 18,176,126,253,122,136,197, 98,136, 68, 34,136, 68, 34, 48, 12, 83,218, 95,161, 50,156, 60,120,126, 13,
-128, 53,193,193,193,226, 31, 46,239, 62, 60,123,235, 71,221,219,244, 12,102,195, 79,220, 26, 2, 96, 17,128,190,163, 71,143,118,
- 1,128,109,219,182,101, 0, 56, 98,177,139, 35, 98,188, 87,127,247, 75,157, 41, 31,189,109, 22, 20, 94,155, 55,111,118, 76, 76,
- 76,124,170,150, 40,145, 72,170,237,151, 69, 41,221,245,224,193,131,143,149, 74,101,105, 65, 82,182,153,208,100, 50, 65, 46,151,
-151,138, 33,157, 78,135,223,126,251,205, 68, 41,221, 85, 5, 39, 98,238,156,194,253, 59,103,192,113,252, 83, 98, 74,171,213, 98,
-222,188,121,165,238, 21, 0, 76, 40,113, 74, 44, 69, 85,206, 21,203,178,184,224, 91,172, 4,250,165,211,103,250,106,149,135, 88,
- 42,159,214,239,245,145, 78, 38,202,150,138,171,226, 56, 20,139, 11,169, 88, 4, 43,153, 24,247, 31, 37,160,158,103, 48,186,247,
-121,205,241,228,225, 61,211, 0, 84, 56, 8,193,200,241,232,215, 37, 24,223,239, 56,131,188, 2, 45,242,114,178,144,145,112, 23,
-209, 55,195, 32,149, 74,113,229,202, 21, 91,123,123, 7,219,250,245,235,129,227,120, 92,184, 18, 14,107,107, 43,236,216,254,107,
- 61,159,122,245, 17,247, 56,246,189, 74,132,173,168,125,136, 31,242, 50,226, 33, 18,137,208, 62,168, 1, 68, 34, 17, 58, 4, 55,
- 2,203,178,232,216,170, 9, 88,150, 69,231, 54,254,104,208,160, 1,120,158, 23, 85,243,178, 64,204,237, 83,136,137, 58, 3,202,
-243,224,248,226,230, 95, 10,192,144,156,252,108,188, 82, 82, 64,237,220,106,243, 82,194,244,233,211,115,212,106,181,161,252, 49,
-149, 74, 37,217,187,119,175, 67, 85, 83,167, 72, 36, 18, 63,145, 72, 20,157,149,149,197, 91, 91, 91, 51, 28,103,226,253,154, 53,
-103,207, 31,153, 95,186,246,228,188, 5,243,119,191,217,199,110,200, 47, 91, 14, 82,137,107, 7, 66, 88,153,105,220,151, 27,165,
- 16, 75,252, 44,172, 52, 48, 58,157, 14,247,238,221,171,118, 81,238,138,222, 23,229, 28,172,119, 6, 13, 26,116,252,131, 15, 62,
-144,155, 43, 47, 34,145,168, 84,244, 63,124,248, 16, 12,195, 96,211,166, 77,208,233,116,213,102,124,145, 72,244,241,158, 61,123,
-236,165, 82,105,169,184,162,148,130,101, 89,220,189,123, 23, 43, 86,172,192,232,209,163, 17, 31, 31, 15,165, 82,137,105,211,166,
- 41,150, 45, 91,246, 49,138,151, 62,173, 14, 55,245,122,125,136,149,149, 21,100, 50, 25,204, 66, 11, 0, 34, 30,186,223,142,141,
-141,109,225,227,227,226, 81,207,255,214, 31, 93, 58,182, 12,112,118,118,104,103, 22, 88, 21, 86, 80, 11,234, 32, 63, 70,132,206,
-157, 59,227,236,217,115,232,223,191, 63, 56,137, 4,188, 84, 10, 94, 42, 5,149, 72, 0,169, 20, 68, 42, 5,181,182,182, 40,251,
-176, 44,139,148,148,148,167,246,141, 31, 63, 62,110,228,200,145,110, 0,133, 90,157, 68, 63,249,120, 74, 82, 70, 70, 6,117,119,
-119, 23, 44, 4, 1,255, 41, 84,163, 69, 92, 9, 33,135,202, 28,239,111,222,158, 49, 99,198,172,165, 75,151,222, 33,132, 28, 42,
-187,223,124, 94, 9,247,161,138,182, 75,254,235, 60,115,230,204,230,203,150, 45, 91,210,174, 93,187, 29,151, 46, 93,138,125, 97,
- 2,139, 82, 74, 8, 33,180,186,151,101,121,231,228,233,166, 32,203, 38,210,142,136,136, 48,122,122,122,254,112, 55, 60,182,123,
-147,144, 70,176,178,145,245, 36,132,172,145,201,100,159,140, 26, 53, 10, 87,174, 92,193,237,219,183,127,172,201,178, 39, 6, 19,
-159, 48,229,163,183, 97, 48,241, 9,102,135,106,218,180,105,146, 11, 23, 46, 24, 42,115,176, 42,227, 74, 75, 75,155, 27, 22, 22,
-134,170, 58,185,191,249,230,155,101, 11,163,210, 78,238,149,190, 21,121, 10,131,193,136,194, 66, 77,177,176, 42, 41,188, 57,142,
- 67, 97, 97, 33,134, 13, 27, 86, 42,186,120,158, 71, 90, 90, 90,173, 18,147, 97, 24,139,157,171, 74, 57, 88,182,119,203,128, 32,
-241,233, 75, 55,159, 42, 92, 95,123,127, 17,164,146, 98,113,101, 37,151,192, 74, 38, 70,130, 58, 21, 77,253,154, 73,206,158, 56,
-212,187, 82,129,101,226,176,230,215, 19, 0, 33,216,125,232, 52, 66,234, 89, 99,254, 23,211, 49,116,232, 80, 72,165,114,236,217,
-179, 11,203,215,109,197, 4, 31, 31, 80, 0,109, 66, 2,241,245,134, 29, 88,184, 96, 1,179,107,231,238,142,213,133, 87, 44, 22,
-131,101,217,210, 66,187,252, 55,203,178,176,100,174, 55,202, 83, 24,140, 70, 20, 21,106,192,241, 60,120,158,130,242, 60, 64, 41,
- 60, 23, 47,134,231,226,197,184,198, 20, 15,224,243, 47, 44,132, 70,163, 1,186,180,172,177,184,210,235,245, 80,171,213,134,200,
-200,200,103, 74,191,128,128,128, 84,189, 94, 95,101,120,103,205,154, 21,179,100,201, 18, 63, 39, 39,167,232,155, 55, 35,141, 45,
- 91, 6,136,203,247,193,106,220,168,113,238,188, 5,243,119,191, 61,102,192,144, 13, 95, 12, 55,125, 48,247,103,145, 37, 29,221,
-203,184,100,143,123,244,232, 97, 81, 87, 30,141, 70,147, 82,217,177,144,144,144,177,132,144,197,141, 27, 55,150,117,235,214, 13,
-231,206,157,195,226,197,139,121,147,201,148, 1, 0,237,219,183,119, 93,184,112, 33,137,138,138,130,131,131, 3,210,210,210,182,
-134,132,132, 44,172,170,227,187, 84, 42,237,210,170, 85, 43, 70,167,211,149, 86, 74, 24,134,193,221,187,119,177,108,217, 50,140,
- 24, 49, 2,141, 27, 55, 46,125,182,186,118,237, 42, 94,189,122,117, 23, 75, 4, 22,195, 48, 31,117,239,222,253, 27, 20,143, 34,
- 44,251,146,139, 6,240, 25, 0,196,197,101,164,140,120,163,253,157,238,157,131, 66, 26,212,243, 84, 86,197,151, 41,126, 8,101,
-144, 21, 36, 98, 9, 70,127, 62, 16,135, 14, 29,194,164,121, 35, 75,156,172, 98, 7, 75, 44,150, 64, 34,150, 66,234, 90,187,133,
- 8, 74,222, 35,196,206,206, 30, 0, 96,111,111,111,126,199, 17, 0,148, 97, 24,161, 75,150,128,255, 12, 44,209, 34,102,129, 84,
- 94,104, 45, 93,186,180,127,249,125,101,197, 84, 69,191,203,254,119,217,178,101, 75,202,112, 23,189,136,248,188,176,165,114,140,
-198,170,215,237,237,214,173,219,100, 91, 91,219,239, 74, 94,188,120,114, 49, 9, 79, 46, 38,193,175, 73,179, 14, 65, 1, 33, 57,
- 35, 70,140,128,179,179, 51, 62,251,236, 51, 10,224,167,154, 92,123,195, 62, 99,167,178,219, 55,110,220,168,117,191,172,146,145,
-113,159,160,146,254, 84,181,204, 52, 48, 26,140, 40, 44,210,194, 96, 48,192,104,228, 96, 50,113, 8,246,183,197,207, 27,167, 67,
-175, 55,192,200, 21,239, 43,118,202, 56,200, 36, 58,116,110,235,109, 4, 97, 52,103, 47,199,217, 85,197,223, 44, 34, 30, 44,203,
-226,102,128,103,133,206, 85, 79,181,193, 98,161, 69,121,174,137,187,187, 27,226,143, 94, 45,174,133, 91,203,113,108,219, 66,216,
- 88, 23,215,228,251,142,158, 85, 44,178,100, 18, 24, 12,122,184,185,215,133,137, 51, 54,169,140,207,100, 52,232, 91, 54,242,132,
-131,173, 21, 34,175, 93,198, 39, 31,190,135,177, 99,223,133, 68,110,139,179,103,207, 32, 94,157,134,135,137,217,248,112,238,247,
- 48, 26, 57, 24, 76, 28,140, 38, 30,171,182, 28,130,129,171, 94, 25, 73, 36, 18, 76,155, 54,205,170,178,227, 59,118,236,208, 88,
- 36,176,104,137, 8, 46,210, 64,167,213, 65,111, 40, 78, 11,174,190, 24,139,190, 24, 9,163,209, 8,205,240,118, 48, 24,141,224,
- 62, 26, 12,131,193,128, 4,107, 17,211, 49, 68,101, 4, 97, 52, 23,174, 37,218, 89, 42,176, 42, 11, 15,165,180,194,166,195,202,
- 68, 86,203,150, 1,209,163,135,133, 44,189,120,233, 90,250,197, 75,215,158, 57,175,126,227,144, 71, 31, 44,218, 49,179, 38,226,
- 10,120,186,185,240, 57,243,253,151,161,161,161,238, 10,133, 2, 49, 49, 49, 96, 89, 22,132,144,204,136,136, 8,119, 0,152, 55,
-111, 94,134, 88, 44,118,102, 89, 22, 31,127,252, 49, 88,150,117,157, 52,105,210, 28, 0,149, 10, 44,147,201,228,103,107,107,139,
-252,252,252,210,251, 40,149, 74, 49, 99,198, 12,188,253,246,219,165,226, 74, 42,149, 98,235,214,173, 8, 14, 14,134, 94,175,183,
-200,185, 75, 76, 76,188, 6,160,147, 5,162,166,184,153,149,231,171,204, 88,138, 66,111,104, 31, 75,193, 73, 36,216,113,224, 0,
-222,126,251,109, 72,165,178, 82,231, 10, 18, 9,136, 84, 10, 70, 34, 1,199,202,106,124,127,121,158, 71, 94, 94, 30,187,117,235,
-214,250,205,154, 53, 35, 20, 64,211,166,254,228,208,159,127,214, 81, 40, 20,177, 78, 78, 78, 6,161,200, 22,240, 18,186, 92,135,
-202,139,172,231,225,154, 49, 99,198, 44, 0,116,198,140, 25,179,204,219, 75,151, 46,213, 0, 80,255,107, 4, 86,117, 14,214,202,
-149, 43,209,162, 69,139, 42, 11,159,213,171, 87,227,231,159,127, 94, 73, 41,125, 84,147,107,191,255,154,248,170,181,149, 68, 89,
-164, 49, 36,111,220,111,108, 19, 16, 16, 16,222,174, 93,187,250,225,225,225,149, 58, 88,149,205,141,245, 87, 76,211, 64, 41,133,
-222, 96, 68, 81,145, 6, 90,189, 30, 83,167,175,179, 40,237, 13,250,124,209,171,125, 94,177,170,206, 73,180,164, 15, 86,117, 77,
-131, 79,139,101, 19,204, 26,160,160, 72,139,174, 35,102,224,218, 31,223, 1, 64,169,184,178,146,137, 33,151,138,193, 16,128,160,
-114,110,163, 38,111,224,231,147,223, 59,191,254,199,159,189, 94,123,101, 28,166, 76,153, 2,145,212, 26,142,206,174, 48,113, 20,
-117, 84,110,120,152,152,141, 61,107,167,151,116, 59,163,120,229,173,121, 88,249,197, 56, 44,159, 87,125,173,158,101, 89,172, 93,
-187, 86, 83,222,181, 42,235,100, 89, 42,130,205, 46,163, 70,167,199,167, 51,191,183, 60,141,122,119,178,178,244,222, 86, 52,112,
-194, 82, 1, 86, 94,100, 1, 96, 1,160,178, 82, 84,230, 12,248,117,232,247,197, 63,249, 50,228,121, 30,127,254,249,231, 51,238,
-106,249, 52,180,212,109,229,121, 30,113,113,113,184,125,251, 54,218,181,107,135,220,220, 92,136, 0, 76,187,117, 11,254,163, 70,
- 65, 87,210,117, 65, 42,149, 98,252,248,241,127,209, 27,190,164, 31, 27,169, 58,161, 10,173, 19,225,222, 92,134,159,150,237,195,
-228, 5,163,225,218, 84,142, 21, 51, 55,149, 30, 95,254,195,188,146,126, 88, 82,200, 21, 53, 15, 70, 94, 94,158,232,155, 21, 43,
- 90,182,105,221,214,234,237,209, 99, 25,189,137,199,162,175,190, 99,119,110,223,230,188,109,219, 47, 86,114,185, 60, 90, 40,142,
- 5,188,132, 46, 87,255, 23,201,101,118,176,150, 46, 93,122,103,233,210,165,207,184, 97,127,169,192, 98, 89, 22,101,135, 44, 87,
- 84,200, 91,210, 7,107,234,212,169,176,181,181,173,240,152,193, 96,160, 55,111,222,140, 74, 78, 78,222, 76, 41,173,241,188, 56,
- 82, 49,227,190,242,155, 45, 94, 83, 62,122,155, 7,138, 71,107,173, 91,183,206,193,220, 7,171,108, 63,172,234,250, 96,185,185,
-185,205,255,250,235,175,167,244,237,219,151, 97, 24,230,169,194,207, 60, 45, 67,217,143,209,104,196,193,131, 7,167, 44, 93,186,
- 20,149,185, 94,148, 22, 55, 63, 21, 22,105,160,213, 21, 23,176, 15,111,239,182, 52, 7, 84,123,138,217,185,106, 27,147, 85,161,
-115,117,212,189,184,224,234,151, 94, 61, 23, 97,216,152,199,113, 9,173, 61, 92, 28,144,157, 91, 0, 89, 73,179,160, 25,102,113,
-101, 37,147,192,209, 94,129,172,204, 52,136,197,226,152, 42, 50,112, 28, 33,164,211,176,193,253,142, 51,172, 72, 94,246,152,216,
-202,206,250,196,197, 91,142,169,217, 69,224,203,196,147,167, 20,147, 23, 90,102, 98,138,197, 98, 76,154, 52,169, 82,129,115,224,
-192, 1, 77,205, 5,150,174,102,105, 84, 3, 39,179, 58, 7,203, 82,129, 85, 30,230,209,133, 18,137,196,175, 68,124, 89,140,128,
-128,128, 35,214,214,214,245, 44, 61,223,210, 73, 71, 9, 33, 11,186,117,235,182,216,203,203,203,237,131, 15, 62, 32, 34,145, 8,
- 33, 33, 33, 46, 95,126,249,101, 46, 0,248,249,249,217,154,223, 49,171, 86,173, 66,116,116,116, 58, 33,100, 97,149,207,186, 84,
-122,215,222,222, 62,164, 91,183,110,200,205,205, 69,124,124, 60, 20, 10, 5,252, 87,172,192,173,137, 19, 17,176, 97, 3,152,110,
-221,138, 5,166, 76,134, 91,183,110, 65, 38,147,221,173,140,207,211,211,179, 13,165,244,107, 0, 29,240,191,102, 65, 10,224, 34,
- 33,228,243,164,164,164,171,207,252,137, 33, 76,113, 69,173,234,132,146,230,186, 67,151, 32,195, 59,239,188, 3,137, 68, 10, 72,
-165,248,244,211, 79,203,188,143,164, 96, 75,250, 99,241,156,212,146,218, 54, 45, 39,214,137, 76, 42,149,141, 30,243, 46,243,249,
-167,159,240, 70,147,137, 23,137,196,204,180,217, 75,152,251,247,110,203, 10, 11, 11, 25, 82,147,154,149, 0, 1,255, 17, 7,171,
-172,208, 42,227, 66, 85,134,244,178,253,178, 42, 19,104,101,251,100, 1,208,189,136,176,138,202,188,220,203, 63,136,247, 35, 35,
- 35, 27, 53,107,214, 12,241,241,241, 21,142,148, 3, 80, 60,132,217,202, 10, 15, 30, 60, 0,128,251,149, 93,232,244,233,211,107,
- 0,172, 49,111,171, 84,170,118, 93,134,118,185, 24,208, 45, 8,187,191,221,153,155,156,156, 28, 96,158, 19,139, 16, 66, 84, 42,
-213,219, 98,169,232,205, 6,205,235,116,230,120,254,235,211,127, 92,152, 95, 25,119,249, 62, 88, 38,147,169,214,125,176, 8, 33,
- 67,251,246,237,203, 68, 69, 69, 97,216,176, 97,248,229,151, 95, 42,189,121,111,191,253, 54,118,236,216,129,222,189,123, 51,203,
-150, 45, 27, 90,185,192, 2,140, 6, 19, 10,139,180,208,106,117,127, 89,198,123, 94,231, 10, 0, 40,111, 58,121,235, 70, 68, 96,
-139,224,118,226,199, 9, 41,144, 75,197, 79, 9, 44,107,153, 4,114, 89,241, 62, 15, 87, 71,132, 93, 58,107, 48,153,140, 39,171,
- 17, 22,113,168, 96,146, 70,153,173, 75, 76,207, 14, 45, 28, 43,116, 60,103,142, 70,139,223, 87, 90, 36,176,126,252,241, 71, 77,
-101,238,149,165,247,128, 82,148, 54, 17, 22,105, 94,108, 26,185,187,187,187,186,185,185,173,119,112,112,144,155,251, 14, 85,118,
-188, 42,135,171, 58,113, 85, 50, 47, 86,244,146, 37, 75,106, 36,178,164, 82,105,189,139, 23, 47, 54, 50,247, 11,172,234, 91,175,
-215,227,205, 55,223,180,200, 22, 12, 15, 15,255, 41, 40, 40,232,161,171,171,235,137,246,237,219,203,162,162,162,176,104,209, 34,
- 34, 22,139,237,204,207,101,126,126, 62, 68, 34, 17,178,179,179, 65, 8,121, 39, 60, 60,252,104, 85,156, 58,157, 46, 52, 52, 52,
- 52,112,224,192,129,108,116,116, 52, 68, 34, 17,120,158,135,174,109, 91, 4,108,216,128,219,159,124,130, 87, 30, 63,134,206,104,
-132, 92, 46,199,209,163, 71, 13, 69, 69, 69,161, 85,196,125,211,229,203,151,155,201,229,114, 24, 12, 6,240, 60, 15,134, 97, 8,
-203,178, 29,155, 53,107,182, 26,197, 35,151, 74, 81,175,158,155,219,164,247,250, 53,225,120,158, 75, 82,167,167, 87,233, 86,218,
-166,195,213, 79, 86,218,223, 74, 34,150, 64, 34, 42, 22, 86,102,231, 74, 34,150, 64, 34,145, 66, 38,181,168, 9,159,150,207, 59,
-230,190, 87, 54, 54,214,124,195,134, 13,163,238, 63,120,232, 15,128,177,183,119,176,184, 95,172, 0, 1,255, 50,135,138, 84, 37,
-148,202, 62, 98,101,182,211, 81,188,182,114,255,146,223, 40,243,251, 26,128, 86,229,206, 53, 31,215,151,251, 54, 31,143,252,171,
- 29,172,126,239,189,247,222,134, 94,189,122,117,159, 54,109, 26, 20, 10, 5,146,147,147, 75, 31, 90,169, 84, 10,111,111,111,104,
- 52, 26,156, 59,119, 14, 57, 57, 57,167, 1,188,111,233,133,147,147,147,175, 60,184,113, 63,179,227,192, 54,206,126,109,154, 56,
- 36,198, 36,182, 5,112,137, 16, 66, 60, 61, 61,127, 24,254, 73,223, 49, 93, 95,111, 13,137, 84,140,132, 7, 41, 85,114,149,239,
-131,245, 60,115, 99, 49, 12,195, 18, 66, 48,108,216, 48,139,206, 31, 62,124, 56,206,158, 61,139,170,154, 19,139,155, 8, 13, 40,
- 42,212,160,232, 5, 10, 44, 66, 8, 56,142, 43,117,174,204,159,158,106, 3, 24,134, 41, 21, 22,125,211,120,139, 57,181, 69, 69,
-203,207,159, 60, 48,190,137,127, 75,215,118, 65,141,113, 63, 54, 1,203,103,253,175,169,229,211, 9,195,177,117,199, 65,168, 60,
-156,161,211, 20,224,216,225,131,185,121,121,121,203,107, 27,135,173,251,206, 2, 0, 58,189,245,244, 24,129, 97, 31,175,178, 44,
- 3,139, 68, 24, 59,118,108,165, 14,214,137, 19, 39, 52,101,157,200,234,210,168,176, 80,139, 34,141,230,133,165,145, 74,165, 10,
-104,219,182,237,137,141, 27, 55, 58,187,184,184, 64,173, 86, 63, 37,176, 84, 42, 85, 64,155, 54,109, 78,108,220,184,209,217,213,
-213, 21,241,241,241, 22, 79, 17, 82, 78, 92, 33, 61, 61,157,100,103,103,243,142,142,142, 53, 18, 89, 12,195, 64,167,211, 33, 58,
- 58,218,210,103,196,226, 73, 71,235,213,171,247,203,119,223,125, 39,123,242,228, 9,140, 70, 35,162,162,162,158, 25,132,192,178,
- 44,102,204,152,129,217,179,103,175, 7,224, 83, 21,159,201,100,250,118,212,168, 81,239, 37, 37, 37, 57,186,255, 31,123,215, 29,
- 22,197,245, 69,207,155,237,133,222,119, 65, 64, 65,164,136, 5,176, 99, 55, 86,140, 41,118,141, 37,177,198, 22, 19, 91,162,177,
- 70,108, 81, 99,172, 81, 99,139, 13,163,198,216, 53,246, 46, 96, 69, 5, 69, 81, 96,233,189,108,159,153,223, 31, 2, 65,126,148,
- 5, 77, 52,201,156,239,219,111,203,204,158,121,243,230,205,155,243,238,187,239, 94, 71, 71, 36, 37, 37, 65, 40, 20,130,101, 89,
-144,246,237,209,250,233, 83,232,105, 26, 82,169, 20,143, 30, 61,194,198,141, 27, 11,244,122,253,138,242,184, 60, 61, 61, 69, 20,
- 69,121, 9,133, 66, 12, 26, 52,232,149,109,219,182,109, 67, 11,223,172,160, 81, 31,137,242,105, 86,168,205,135,239, 49,138,162,
-200,184, 17,221,235, 5,183,104,224,127, 63,234,217, 19, 85,106,230,229, 74,197,127,142, 45,244, 42, 49, 32, 20,254,233,111, 85,
-228,115,197, 19,137, 74, 86, 20,178, 34, 17, 24,145,105,193,130, 75,139, 38, 66, 8,108,109,109,181, 43, 87, 44, 21,203,229,114,
- 26, 0,204,205,228,244,222,109,107, 96,107, 99,163,101,107, 98, 10,229,192,225,221,197,205,183,244,223, 55, 47,176, 34, 34, 34,
-158, 2,232, 20, 16, 16, 48,240,194,133, 11,203, 39, 79,158,108, 31, 28, 28,140,204,204, 76,184,185,185, 65,161, 80, 32, 60, 60,
- 28,183,111,223, 78,103, 89,246,203,240,240,240, 29,229, 8,128, 10,179,109,179, 44,203, 42,149,202, 48,125, 97,225,216, 70,193,
-222, 56,191,239, 98,168, 66,161, 24,229,226,226, 50,113,200,140,247,135,181,251,160, 9,162, 35,159,225,218,201,187, 72,122,145,
-142,161,173,167, 86,200,105,138, 15, 86,233,247,178, 62, 88,165, 57, 25,134,161,117, 58, 29,246,236,217, 99,146,200,218,181,107,
- 23, 52, 26, 13, 24,134,161, 43, 58,119,154,161,137,185,133, 61,156, 93,125,161,215, 21,128, 97, 76, 31, 89,178, 85,212,167,209,
-104,196,220,185,115, 49,101,202, 20,204,159, 63,191, 82, 33,178,102,205, 26, 84,117,141, 50, 51, 51,243,148, 74,229,224,221,155,
-127,216, 55,112,196, 4,115,151,150,141,240,243,222,163, 48,232, 13,144,136,249,176,182, 48, 67,221,218,206,208,105, 10,177,246,
-199,229,185, 26,141,122,112, 89,223,179,234,100, 89, 31,250, 97, 91, 44,222,120, 8, 23,119,254,105,160,108, 61,112, 54,126, 89,
- 54, 30, 1, 1, 91, 42,229,164,105, 26, 2,129, 0, 59,119,238, 84, 87,180,154,144,199,227,161, 34,129, 85,246, 26, 89, 88,216,
-195,197,221, 15, 58, 77,254, 27,187, 70,182,182,182, 83, 54,109,218,100,171, 86,171,241,240,225, 67, 60,124,248, 16,132,144, 7,
-101,183, 23, 20, 20,224,222,189,123,197, 34,231,129,169,245, 89,108,185, 74, 75, 75, 35, 73, 73, 73,144,201,100,212,157, 59,119,
- 52, 13, 27, 54,124,128, 34, 31,173,170,206, 93,171,213,198,117,236,216,177, 34,139,145,179, 88, 44,126, 37,101, 83,113,208,209,
-178, 83,133,229,149, 51, 62, 62,254,214, 15, 63,252,224, 90,175, 94, 61,252,244,211, 79, 90,115,115,115,209,228,201,147,193,227,
-241,200,202,149, 43,217,204,204, 76,253,244,233,211, 69,151, 46, 93, 66, 65, 65,193,173,170,218, 39,203,178,121,132,144,145, 45,
- 91,182,220,126,236,216, 49,169,151,151, 23,114,114,114, 94,138,245,173, 91, 49,110,220, 56, 72,165, 82, 68, 71, 71,163, 87,175,
- 94,133,133,133,133, 35, 75,199,192, 42,205,105, 52, 26,137, 64, 32, 96, 25,134,193,204,153, 51, 95, 9, 44, 42,147,201, 32, 21,
-209,216, 48,207, 67,254,197,226,100,249,132,177,159,124,242,178,157, 48,244,253,168,103, 79, 54,252,124,232, 44,128, 11,149,157,
- 59, 99,153, 3, 59,175,151, 22, 44, 65,113,204, 43,161,248,149,213,131, 47,227, 96,189,140,139, 85,213,185,151,117,197,176,177,
-177, 49, 6, 6, 6, 68,169,213,106, 94,177,150,178,179,179,187, 87,180, 47, 91,171, 86, 45, 93,153,230, 89,173,123,179, 26, 3,
- 61,142,147,227,228, 80, 77, 11, 22, 0, 32, 50, 50,114,167,191,191,255,177, 69,139, 22, 45, 58,112,224,192,136, 9, 19, 38, 16,
- 11, 11, 11,132,133,133,177,153,153,153, 91, 68, 34,209,148,171, 87,175,214, 40, 94, 4,203,178, 91, 47,253,126,109,204,128, 47,
-122,146, 9,203,134,182,186,117,238,222,131,134,173,188,208,160,165, 23,194,207, 68, 97,205,215,187,119, 24, 13,198,111,147,146,
-146, 94, 84,198, 99,138, 15, 86,241,139,207,231, 87, 25, 7,235,192,129, 3, 19,186,119,239, 78,221,184,113,227,255,124,174, 74,
-251, 97,157, 58,117, 10,122,189, 30, 97, 97, 97, 76,101,113,176, 24,224,183, 21,203,190, 29,178,121,219, 17, 17, 69,244,184,122,
-225, 87,228,100, 85,110,149, 19, 10, 5,248,101,215,111,122, 62,159,247,168,146,178, 62,143,136,136,176, 93,188,120, 49,143,162,
- 40,172, 89,179,230, 21,203, 85, 89,220,189,123,151, 49, 24, 12, 85, 94, 43,149, 74,117,202,201,201,169,255,250, 21,243,182,182,
-239,242,190,149,143, 79,125,190,131,131, 43,248, 20,133,236,204, 52,220,188,118,201,120,252,200,193,108,157, 78, 55, 84,165, 82,
-157,122,157, 6, 24,186,225, 96,185,191,127, 60, 97,121, 85, 86, 20,163,193, 96,224,203,229,114, 24,141,198,114,197, 85,199,142,
- 29,165,151, 47, 95, 86,235,245,122,240,120,188, 74, 21,211,203,107, 52,123,200,230,237,111,246, 26,209, 52,237,155,149,149,133,
-130,130, 2,132,135,135,179,107,214,172, 73,203,206,206,254,186,244,246,204,204, 76,228,229,229,225,230,205,155,236, 79, 63,253,
-148,150,155,155,251,181,169,245, 87, 28, 23, 43, 43, 43,139,145,201,100,148,193, 96, 48, 52,108,216, 80, 34, 20,154, 22,243, 10,
- 0,110,221,186,213,181,162,109,173, 90,181,138,185,124,249,114,221,210,185, 9,141, 70,163, 80,171,213,122,245,234,213,171,202,
-254, 67, 42,149, 14,248,245,215, 95,119, 74, 36,146, 6, 26,141,230,179,212,212,212,173, 0, 92,121, 60, 30, 30, 63,126,156,110,
- 52, 26,251,204,156, 57,115,115, 65, 65,193, 93, 51, 51,179,129, 38,246, 27,199, 9, 33, 3,253,252,252,126,158, 51,103,142,188,
- 93,187,118, 2,165, 82,137,192,192, 64, 68, 71, 71,227,200,145, 35,250,181,107,215, 22, 22, 22, 22, 14,103, 89,246, 84, 37,131,
- 14, 22, 0, 49, 26,141,175,228, 48, 21,137, 68, 16, 8, 4, 40,212, 82, 24, 49, 51, 86,205, 64,160, 94,184,116,199, 17,150, 5,
- 81, 37,165,167, 39,167,100, 95,231, 27, 12, 23,226, 84,121, 57,149,149,147, 78,151,193,221,194,191,100,112, 71, 8, 1,197, 80,
- 32,122, 2, 30,205, 3,207,192, 3,225,243, 95, 90,183, 76, 75,119,197, 26,141, 70,132,132,132,224,240,225,195,248,224,131, 15,
- 88, 84,226, 43,114,248,240, 97,152, 98,189,229,192,129,195, 91, 18, 88, 0,112,239,222,189,108, 0,163,154, 52,105,178,109,252,
-248,241,135, 25,134, 17, 48, 12,211,227,214,173, 91, 23, 95,231,224, 73, 73, 73, 17, 74,165,242,107,123,103,171,208,174, 3, 91,
-161,126, 19, 55,208, 70, 26,151,143,222,194,150,133, 7,119, 39,196, 39, 12, 43,157,171,176, 34,152,226,131, 85,214,130, 85, 17,
- 87,106,106,234,236, 5, 11, 22,224,187,239,190,171,246, 42,194,138,246,185,114, 51,113, 84,139, 32,133,203,199,239,183,234, 66,
- 17,194,106, 43,241,179, 33, 4,108,177,167, 5,159,207,123,116,254, 90,124,195,138,246, 77, 78, 78,238, 56,118,236,216, 63, 40,
-138,114, 43, 53,170, 64, 37, 15,251,164,140,140,140,206,166, 92,155,228,228,228, 99, 46, 46, 46,245,206, 31, 63, 52,227,210,233,
- 99,237,104, 90,239, 73, 64, 32, 20, 10,159, 24,104,227, 57,131, 78, 23,154,144,144,240,218,129,216,102,140,250, 0,207, 85,233,
-224,243,121, 47, 99, 79, 21, 93,238, 95, 87, 77, 70, 64,192, 47, 21,254, 79, 44, 22, 31,251,249,231,159, 67, 62,249,228, 19,194,
-231,243, 75,166,221,138,207,159,162, 40, 92,187,118, 77,173,211,233,176,101,203, 22, 86, 42,149, 86, 26,184,246,175,186, 70,249,
-249,249,195,123,245,234,181, 21,128, 24,192,227,156,156,156,209, 42,149, 42,161,244,246, 15, 62,248, 96, 43, 0, 49, 33,228,255,
-182, 87,133,226,144, 13,214,214,214, 15,138, 44, 87,146,154, 56,186, 87,210,190,121, 21, 77, 31,154, 50, 85, 88,148, 91,240,163,
-226,239, 65, 65, 65,243,198,140, 25, 83, 58,217,243, 5, 0, 30, 53, 24,156,157, 34,132,212,159, 57,115,230, 68,169, 84,218, 94,
-173, 86,251, 0,128, 76, 38,123, 88, 88, 88,120, 86,175,215,255,192,178,108,118,101, 28, 79,158, 60,209,213,169, 83, 39,218,104,
- 52,250, 59, 56, 56,148,172, 62, 20,137, 94, 90,147,174, 61,180, 9, 79, 76, 76,108, 82,195,193, 99, 66,101, 22,229,138,254, 83,
-217,118,157, 78,151,118,229,202, 21,155,211,167, 79,243,104,154,198,241,227,199, 75, 6,125,229,205, 6,198,198,198, 66,167,211,
-105,184,199, 28, 7, 14,111, 7,228,175,156,166, 55,213,132,168, 84, 42,251, 73,228,226,177,110,245, 20, 13, 85, 79, 83,163,242,
-178, 11,127, 73, 74, 74,218,192,178, 44,205,153, 79,255,189,156, 34,153,197, 9,194, 19,186, 85,248,192,161,245,207,117,133,185,
- 93,202,227,108,214,172,153,179, 80, 40, 92,170,213,106,187, 85, 22,165,157,199,227, 25,165, 82,233, 49,141, 70, 51,165,108,178,
-231,127, 98,125,206,157, 59,183, 92,147,132,169,171, 8,103,207,158,205, 84,167,156,141, 26, 53, 58, 43,147,201,202, 13,168, 89,
- 88, 88,248,226,246,237,219,157,223,133,250, 44, 94, 45,103,138,223, 81,105,206, 26,173, 34,124, 75,247,145,139,139,139,196,194,
-194, 98, 41, 69, 81, 10, 19,197,177, 46, 53, 53,117,114,122,122,122, 50,215, 47,113,156,220, 20,225, 59,106,193,250,171,161, 82,
-169,246, 0,216,195, 93,142,255, 22,138,197, 83, 77, 80, 36,150,250,255,215,234,172, 88, 32,149,243,251, 67, 0,111,124, 73,190,
- 41,225, 24,222, 5,212,212,161,187, 72, 64,181,254, 39,156, 99, 66, 66,130, 6,192, 56,174,231,224,192,225,159, 1,110,130,158,
- 3, 7, 14, 28, 56,112,224,192,225, 13,131, 0,240,175, 96, 68,104,178,233,143, 16,226, 95,131, 17,231, 61,142,147,227,228, 56,
- 57, 78,142,147,227,228, 56,255, 91,156, 85,113,255, 91,166, 30,223, 9, 31, 44,142,147,227,228, 56, 57, 78,142,147,227,228, 56,
- 57, 31,172,127, 19,184, 41, 66, 14, 28, 56,112,224,192,129, 3,135,183, 37,176,204,156,124,125,237,221, 27,109,181,169,213,240,
-142, 77,173,134,119,236,221, 27,109, 53,115,242,245,253, 47, 86,154, 82,169,148, 42, 20,138,129,174,174,174,167, 26, 55,110,156,
-235,236,236,252, 5,215,148,170,143,118,132,240,251, 19,242,249, 16, 66, 94, 12, 33,228, 69,127, 66, 62,111, 71, 8,255,223,118,
-158,243,199, 57, 55,191,120,124,208,177,249,227,156,203, 13,192, 54,247, 43,165,237,229, 19,125,127,248,122,156,179,205, 27, 26,
- 89,154, 59, 58, 58,254,228,228,228, 20,231,232,232,248,220,209,209,241,103, 66,136, 37,215,226, 56,112,224,192,225,239,131, 73,
- 15, 51, 27,183, 6,159,249,250,120, 79,153, 55,123, 6,113,118,178,151, 25,140,180,254, 89, 92,130,223,236, 5,139,246,217,184,
- 53, 88,158,249,252,238,166, 26, 60, 4,136,139,139, 75, 63,129, 64, 16, 2,160, 88,168, 61, 48, 24, 12,135, 19, 18, 18,246,152,
-186, 42,168, 97,195,134,151,120, 60,158,107,117,142,205, 48, 76,220,237,219,183,219,212,164,194,156,157,157,251, 56, 59, 59,255,
-220,188,121,115, 89,227,198,141, 33, 20, 10,177,100,201,146, 47, 1,172, 48,249,220,219,181,227, 59,100,219,124,194,227,243,123,
- 2,104,200,178, 0, 8,239, 14, 99,208, 31, 73,181,206,216,202,158, 59,103, 82, 24,113,133, 66,241, 53, 33,100, 40, 94, 46, 43,
-223,164, 82,169,150,254, 21,141, 68,169, 84,214, 34,132,180,103, 89,214,135,162,168,187, 12,195,156, 84,169, 84, 25,175,203,235,
- 8,140,106, 25, 28,252,195,144, 47,191,228,169, 47, 92,192, 15, 63,255,188, 18,185,185, 0,176,166,186,109,169, 89,179,198,189,
-205,205, 17, 66,128, 0, 16, 16, 10,236,173,204,108,234,232,205,155,145,123, 76,137,165, 86, 17, 2, 3, 3,143, 0,232, 94,244,
-245,104, 68, 68, 68,143,234,114,100,197, 50,179,196, 2,159,214, 89, 79,206,206, 2,208,173,236,118,163, 70, 50,132, 39,168, 21,
-194, 99, 35,227, 1,124,255,154,226, 74,102,111,111,127,231,224,193,131, 46,205,154, 53,227, 3, 64,120,120,248, 39, 33, 33, 33,
- 29,138, 76,250,185,111,163,163,105,209,162,133,181,209,104,220,198, 35,164, 57,195, 48, 86, 0, 64, 81, 84, 54,205,178,215,248,
-124,254,144,154, 6, 43,230,192,129, 3,135,127,172,192, 50,115,244,241,171, 95,223,247,203,227, 7,182,213,202,206,204,214,172,
- 89,186, 53, 82,205, 23, 21,214,246,243, 18,174, 90,190,216,106,220,164,175, 38,153, 57,250, 92,207, 79,121, 24,101,234, 65, 21,
- 10,133,171,187,187,251,254,175,191,254,218, 63, 56, 56, 88,224,224,224,128,148,148, 20, 60,122,244,200,255,242,229,203, 31, 28,
- 60,120,240, 75,133, 66,241, 81, 85, 17,220, 1, 64, 46, 18,214,217,179,120,161,147,200,202, 26, 44,109,132, 85,253, 70, 0, 0,
-150, 97,144,116,238, 20, 24,131, 1, 44, 67,195,165,235,251, 47,127,103, 89, 52,109,218, 84, 88,147,202,114,113,113, 81,214,171,
- 87,111,199,244,233,211,133, 90,173, 22,183,110,221,194,213,171, 87,153,212,212,212, 69, 38,139,138, 6, 31,250, 57,241,157,246,
-245,250,160,155,123,143,247, 28, 68,110, 78,246, 96, 24, 9, 30, 61,213,187,158,186, 24,217,245,232,241,147, 83, 28,252, 62,236,
-147, 26,117,224,110,101, 60,254,254,254,205, 41,138,250, 46, 49, 49,177, 88, 4, 45,105,214,172,217,183,165,247, 41,171, 81, 25,
-134, 1,159,207, 79, 41, 44, 44,236,119,239,222,189,200,242,120,103,141, 32, 6,163,241,101,187,224,243, 65,111, 59,233,114,160,
- 83,167, 78,181,135, 15, 31,142,128,128, 0,132,135,135,183, 15, 11, 11,155, 88,171, 86,173,155, 6,131,225,168, 88, 44, 62, 23,
- 23, 23, 87,163, 4,139, 66, 96,234,144, 47,191,228,153,197,197,193,236,214, 45, 12,202,205,229, 47, 6,166, 86, 71, 96, 5, 6,
- 6,214,233,220, 41, 96,223, 7, 31,181,245,117,114,242, 19, 10, 4,118, 96, 89, 22, 6, 67,102,189,180,180, 7,189, 45, 45, 49,
-189,105,211,166, 31,223,184,113,227,177, 41,124, 77,154, 52,113,100, 24,102, 61,203,178, 66, 66,200,120, 0,221,143, 31, 63, 14,
-154,166,209,163, 71,143,238,129,129,129,117, 88,150,253,209,204,204,140, 85,171,213,159,222,188,121, 51,165, 50,203, 85,246, 19,
-102, 86, 50,223,163,171,119,208, 80, 36,243, 79,116,157,220, 69,113,204,202,131,154, 63,107,117,226, 53, 0,232,230,233,105, 94,
-199, 71, 54,205,204,194,223, 38, 39,241,212,180,110,158,158, 27,143, 61,121,146,247, 26, 98,120,233,182,109,219,106, 53,111,222,
-188, 36, 72,110,227,198,141,121, 75,150, 44,113,158, 60,121,242, 74, 0,195, 76,228,169,103,107,107,123,130, 97, 24,237,253,251,
-247,235, 21,255,238,208,232,163,150,182,230,242,142,105, 89,121, 23,210,239, 31, 60,111, 10, 87, 80, 80,208,112, 33, 69,253,180,
-124,230, 56,158,111,195,134,144,217, 57, 64,175, 82,161,192,104,176,185,118,251,126,143,197, 43,126, 74, 11, 10, 10, 26, 25, 30,
- 30,254, 51,215, 37,115,224,192,225, 63, 35,176,196, 98,209,244,217,223, 76, 35, 89, 25,217,106,125, 94,174, 94,198,234,140, 22,
- 50, 9,201, 77, 77,203,126,102, 33, 43,156, 60,105,130,100,218,244,111,166, 3, 24,100,170,184,242,241,241,185,177,113,227, 70,
- 7, 27, 27, 27,228,228,228, 32, 35, 35, 3, 55,110,220, 0,203,178,232,214,173,155,184, 81,131, 6, 1,203, 87,172,184,170, 80,
- 40, 90, 84, 37,178,248, 2, 62, 17,200,229,248,181,109, 0, 40,161, 16, 31, 63, 76,122, 41, 46, 12,122, 28,239,223, 19, 0,192,
- 19,137,208, 55, 38, 21, 0, 32,145, 72,106, 92, 89, 44,203,182,104,213,170,149, 16, 0,190,252,242,203,220,130,130,130, 80, 66,
-200, 78,149, 74,149,104,202,255,237, 26,188,239,229,104,239,116,126,217,130, 17, 54,254,117, 60,160, 51, 24,144,144,154, 8, 22,
- 34, 56, 57,200, 49,232,131, 70,194, 86, 65,194,186,223,175,249,227,156,163,127,175, 54, 41,247,126,187, 95,161,176,148,203,183,
-173, 92,185, 18,123,247,238, 5, 0,156, 61,123, 22, 94, 94, 94,242,170,202,240,232,209, 35,143,161, 67,135,238, 6, 80,183,188,
-237, 70, 35,248,161,223,237, 4, 0,108,219, 56,144, 23, 29, 29, 93, 91, 42,253, 51,151,114,219,182,109,209,182,109, 91, 42, 52,
- 52,180,217,217,179,103,155,237,222,189, 91,239,236,236,188, 50, 49, 49, 49,172, 38,117,170,190,112, 1,102,183,110, 1, 23, 46,
- 84,251,191,141, 27, 55,118,173, 95,223,254,234,247,203,190,181,255,253,240,125, 44, 91,246, 51,158, 60,121, 2, 0,240,240,240,
-192,192, 1,125, 4, 59,127, 89, 95,127,250,244, 57, 87, 2, 3, 3,131, 35, 34, 34,170,140,110,206, 48,204,250,208,208,208,247,
-205,204,204, 48,125,250,244,232, 58,117,234,192,194,194, 2, 27, 54,108,128,181,181, 53, 12, 6, 67,244,146, 37, 75,248, 42,149,
- 10,171, 86,173,218, 92,202,186,245,127,104,211,189,237, 44,177,192,167,181,119,208, 80,152, 89, 40,176,113,215, 30, 60, 10,223,
-218, 90,107,120, 56,235,235,113,206,131,121,172,120,168,179,151,217,244,218, 65,237,108,235,214,239, 5,247,192, 91,118, 90,250,
-194,211, 89,159,123, 44,226, 75, 52,219,102, 47,251,127, 43, 33,233,179,143,231,159,123,211,230,222, 41,121, 6,203,150, 4, 13,
- 37, 40,138,129,229,164, 80,246,108,219,182, 45,175, 88, 96,199,197,197, 65,167,211,193,207,207,143,210,233,116, 38,197,180, 82,
- 42,149,245,218,180,105,115,105,199,142, 29,182,173, 91,183, 78, 43,189,205,201,214,170,203,249,253, 43, 39,124,247,195, 47, 62,
- 14,126, 31,102, 87, 53, 16, 8, 10, 10, 26,222,160,158,199,166,149, 75,102, 19, 94, 65, 2,248, 86, 25, 0,147,129,164,221,155,
- 1,153, 13,122,140,158,140, 38,205,154,241, 38, 76,250,122, 83,147, 38, 77,216,155, 55,111,110,225,186,101, 14, 28, 56,252, 39,
- 4, 22,195, 50, 13,237,237,109, 36,171,150,110, 13, 87, 72, 40,226,228,162, 36, 34, 11, 43, 62,204,228, 98,138, 39, 80,123,120,
-184, 8, 25,150,105, 88,129, 32,121,101,133, 1, 33,132,184,187,187,239,223,178,101,139,131, 64, 32, 0,195, 48,176,183,183,199,
-211,167, 79,145,149,149,133,252,252,124, 60,121,240, 0,238,181, 92, 48, 97,228, 8,197,252,101,223,239, 39,132, 4,149,158, 46,
- 44,203,201, 50, 44, 24,227,171, 51,106,132, 16,148, 55,191, 88, 81, 26, 25, 83, 87, 66, 48, 12,243, 76,165, 82, 65, 38,147,193,
-215,215,215,236,230,205,155, 23, 19,139, 77, 72, 85,157,123,159, 62, 60,133, 72,124,104,233,130,126, 54,132, 23,141,232, 23,217,
-240,116,105, 10, 91,203, 90, 72, 76,203, 71, 68,212, 81, 68, 63, 57, 2, 79, 23, 87,140, 28,232,105,181, 98,125,218, 97, 18, 56,
-202,147,141,216, 96, 40,143, 51, 47, 47,207,204,213,213, 21,206,206,206, 96, 24, 6, 52, 77,227,254,253,251, 37,159,139,243, 37,
- 22,127, 94,185,243, 50,172,121,233,232,247, 97,119,100,102,102,154,153,122,238,197,226,106,223,247,202,250,234,130, 36, 33, 0,
- 72,229, 10,253,199,147, 19,239, 55,105,210, 4,246,246,246,194, 43, 87,174, 76, 6, 16, 86,221,250,212, 3, 75,126,216,178,101,
-213,160,156, 28, 10, 0, 54, 17,194,232, 95, 70,213, 54,169, 45,117,126,175,241,129, 21, 43,102,217, 19, 54, 10, 54,150,139,113,
-227,198,115,232,245, 47,175,124, 70, 70, 42,198,127,158, 11, 62,223, 28,223,127, 63,219,182,111,191, 49,191, 22, 77,145, 49,149,
-149,147,101, 89,225,195,135, 15, 81,191,126,125,236,222,189,155,207,227,241,112,253,250,117, 72,165, 82, 12, 29, 58, 20,254,254,
-254,124,169, 84,138,139, 23, 47, 34, 55, 55,151, 84, 86,206, 11, 71,207,207,207,138, 61, 59, 43,153,119,162,235,198, 93,123, 48,
- 98, 64, 63, 56, 25, 99, 47, 90,123, 82,243,187,245,104,249, 45, 79, 80, 43, 68,110,238,111,237,229,223, 11, 66,145, 25,198, 77,
-157,135,232,123,135,172, 11,243,238,126, 78, 27,226,107, 1,152, 88,150,147, 13,235, 77, 47,223,234, 16,120,218, 53,210, 77, 25,
- 56,234,122, 82,228, 79,119,254, 60,186, 47, 31,148,218,170, 88, 92, 61,126,252, 24, 79,158, 60, 1,143,199,131, 90,173,126, 37,
- 81,112,105,206,128,128,128, 81, 52, 77,127, 11, 0, 58,157,110,171,163,163,227,240, 31,127,252,209,150,199,251, 51, 83, 84,177,
-229, 42, 51, 59, 55,235,202,205,251,143, 38,143,234,221,238,194,181,123,241, 86,141, 62,120,145,125,251, 96, 78,121,245,217,162,
- 69, 11,107, 17,143,247,211, 15,203,230, 18, 58,246, 15,136,125,219,129,111,230, 5,218,144, 8, 77, 86, 62,212, 79,147,161,223,
-176, 26, 30,163, 39, 97,233,146,239,200,128,193,159,254,228,233,233,185,255, 73, 41, 11,222, 95,177, 74,137,227,228, 56, 57,206,
-119,147,243, 63, 39,176, 8,161,114,245,122,131,192,162,150,179,225,227,143,218, 52,136,188,126, 47,218,204,198,146,106,212,180,
-129,223,189,232,132, 8, 24,105, 61, 33,148, 73,126, 29, 46, 46, 46,253,102,207,158,221,192,194,194, 2, 12,195,192,210,210, 18,
-105,105,105,208,235,245,200,205,205,133, 54, 63, 15,250,188, 92,220,126, 17,135,224,118,237,240, 94,139, 22,190, 71, 13,134,126,
- 0,118, 87,196, 73, 83, 60,214, 54,160, 41,250,196,102,128,209,235, 16,230, 97, 91, 98,181,234, 31,151, 13, 66, 8,104,157, 22,
- 71,155,214,133,216, 76,142,134, 83,102,215,184,178,146,146,146, 34,221,220,220,142,117,237,218,181,219,200,145, 35,169,228,228,
-228,227,142,142,142,173, 82, 82, 82,170,156, 30,117,136,161,135, 14, 25, 25,224, 97,103, 69,225,247,203, 39,208,220,231, 67,200,
-196, 2,164,101,169, 65, 17,130, 39,207, 78,131,166,229,184,253,240, 5, 90,248,203,209,186,153,165, 75,254, 31,153, 35, 81,241,
-116, 25,201,202,202, 66,106,106, 42, 12, 6, 3,140, 70, 35,122,247,233,131,109, 91,183,162,160,160, 0, 26,141, 6, 58,157, 14,
- 12,243, 82, 79, 36,167,229,227,198,237,227, 8,106, 80, 15,168, 36,226, 55,159, 15,227,143, 43, 7,242,205,101,128, 80,108,175,
-207,203,203,131, 92, 46,135,186, 32, 73, 56,100, 68,137,101, 75,120,246,236, 89, 68, 68, 68, 64,169, 84,154,212,142,202,195, 19,
-224,167,103, 52, 61,179,219,129, 3, 14,151, 15, 28, 96,174,253,254,123,130, 56, 47,111,131, 41,255,109,214,172,113,239,113,227,
-122,248, 74, 37, 82, 36,188, 88, 9, 31, 31, 33,190,252,194, 22,161,139,211, 1, 0, 19,198,185, 32, 40,200, 22,185,217,251, 96,
-231,240, 53,190,156,252,129,103,126, 62,251, 9,128,173,149,183,119, 50,254,151, 95,126,137,238,220,185, 51, 63, 50, 50, 18, 98,
-177, 24, 82,169, 20, 18,137, 4, 82,169, 20,201,201,201,208,233,116, 8, 11, 11, 51, 22, 77, 33, 86,136,162,105,192,110,147, 59,
- 43,142, 61, 10,223,218,218,153,122,122,251,131,201, 45,159, 69, 94,191,157,127,230,143,203,243,141, 26, 73,124,118,194,169,105,
-117,154,220,182,251,124,202, 92,172, 94, 58, 27,143,174,159,207,116,116,205, 91, 67, 19,237,214, 86,229,196,185,111,215,110, 46,
-127,236,204, 1,134,177,195, 63,182, 60,172,184, 50,226, 48, 31,233, 41,153,119,151, 33,246,134, 90,236, 85,127,112,189, 58, 68,
-119,230,204, 25,105,155, 54,109,160, 86,171, 95,222, 11, 60, 30,126,249,229, 23,198,104, 52,158, 45,175,156, 6,131,225,219,136,
-136, 8, 69, 97, 97, 33, 6, 12, 24, 48, 97,206,156, 57,114,129, 64,240,242,254,162,233, 87, 44, 87, 11, 86,108, 63, 49,233,219,
- 53,103, 79,236, 94,172, 92, 48,125,120,187, 65,227,190, 59, 11,224,120,249,214, 80,227,182, 21,139,103,240,196, 86,122,144, 38,
-157,161, 79, 85,227,249,166,145,208,229,168, 81,111,254, 60, 0, 66,232,244, 60, 28,254,160, 15,120, 54, 74,124,214,166, 21,127,
-195,249, 75,219, 0,124,192,117,205, 28, 56,112, 40,131, 38, 0,236,139, 62,167, 23, 61,199,108, 1, 20, 91,217,237, 1,232, 0,
-136, 74,253,167,236,247,210,251,150,253, 94,250,115, 58, 94,250, 54,219, 3,160, 1,220, 0, 80,109, 63, 81,170,232,161,194,150,
-122,192,176,101,172, 54, 23,158,196,198,169,219,181, 13, 82,156,189, 17, 19,217,245,195,247,154,182,233,208,172,121, 74, 70,110,
-172,147,189,133,252,202,245,107, 98,134, 97, 76,154,223, 17, 8, 4, 33,193,193,193,252,172,172, 44,200,100, 50,164,165,165, 33,
- 49, 49, 17,122,189, 30,234,156,108,104,179,179,160,206,202,132, 33, 47, 27, 79,110, 94,135,183,171,179,184,200, 9,222, 36,148,
-181, 80, 21,103,176, 39, 20, 5,137,133, 57,164, 22, 22,224,241,170, 23,153, 66,169, 84,246,242,241,241,185,230,236,236, 60,179,
-104,132,255,121,104,104,104, 58,203,178,152, 54,109,154,133,133,133, 69,152,187,187,187,184, 42, 30,115, 27,186,119,179, 6,117,
-121,209,207,239, 34,200,235, 99,212, 86,180,193,147,196, 28,164,229,104,144,156, 89,128,122,245,166,192, 94, 57, 2,150, 78,163,
-113,247, 81, 60, 20, 78,181, 41,158, 64,216,181, 50,206,228,228,228, 87,190,239,218,185, 19,133,133,133,168, 91,183, 46,250,247,
-239,143,169, 83,167,162, 95,191,126, 80, 42,149,104, 93,151,143,225,131,123, 35, 53, 53,181,210,114,206,223,200, 10, 22,237, 84,
- 68, 14,153,205, 70,214,237,120,236,254,147, 39, 79, 16, 29,253,255, 51,107,127,252,241, 7,114,114,114, 74, 30,192,166,192,209,
-209,113,134, 66,161,184,163, 80, 40,238, 43, 20,138,163, 41, 74,229, 67,131,135,135, 99,171, 15, 62, 32,126,125,251,242,226,229,
-114,242,172, 86, 45, 51, 83,184, 44, 44,208, 35, 40, 40, 88,148,157,245, 51,128,151, 34,114,248, 48,123, 92, 58, 95, 31,151, 47,
- 6, 98,252, 56, 15, 80, 68, 2, 66, 9, 81, 88,240, 7,252,234,251, 11,205,205,217, 74,219, 82,145, 67,123,108,253,250,245,249,
- 99,198,140,129, 88, 44,198,182,109,219,176,110,221, 58, 44, 95,190, 28,209,209,209,112,115,115,131, 66,161,128,163,163, 35, 31,
- 64,108,209,127, 42,133,149, 39, 53, 95,107,120,120,209,218, 75, 30, 75, 40,135,150, 90,163,228,227,217,203, 84, 25,243,215,196,
-126,255,236,145,218,227,225,245,243, 25,209,247,126, 99,158,222, 60,155,174,138,201,247,152,191, 38,246,251,133,171, 19, 51,203,
-227, 58,127,126, 54,125,240,232,121,125, 65,126, 33,191, 87,183,142,234,209,195,250,215,179,145,121,255, 2,231,206,141,221,107,
- 41, 6,207, 94,184, 74,247,217,152, 73,250, 77,155,127,102,243,242,242,144,155,155,139, 31,126,248,193,248,251,239,191, 39,210,
- 52, 61,169,130, 34,242,138, 4, 17,250,244,233, 35,151, 74,165,136,143,143, 47,177,130, 2, 64, 82, 90,198,221,203, 55,239, 61,
-156, 60,186, 79,219, 2,173, 86,123,226, 92,248, 3, 63, 47, 55, 23, 66, 88,247,138,206,155, 71, 72,243,250, 13, 27,130,101,179,
- 65,241, 93,145,176,125, 25,212,201,153, 40, 76,203, 4, 37,144,195, 0, 9,244,172, 8,146,134, 77,241, 60,226, 22, 28,205, 44,
-192, 39,164, 21,247, 28,225,192,225,191,137,202,180, 8, 0,123, 66,200, 97, 66,200,225, 25, 51,102,180, 7, 96, 75, 8, 57, 92,
- 36,130,236,139, 62,139,138,247,169,224,187,125,105,158, 50,255, 45,253,217,110,198,140, 25, 29, 8, 33,135, 91,182,108, 57,184,
- 72,200, 85, 27, 85,170, 13,158, 70, 23, 58, 99,230,108,202,194, 76,100,238,231, 91,219,250,247,147, 23, 34, 47, 95,187,245,192,
- 92, 38, 17,231, 23, 20,136,150,255,184,206,149, 20,170, 77,117,242,246,181,179,179,131, 94,175,199,227,199,143,145,144,144, 0,
-189, 94, 15, 99, 97, 1,180,217,217,208,100,101,129, 41,204,135,144,102,160, 78, 79,131,181, 68, 4,252,185,194,176, 50, 83,101,
-137,152, 42, 79,112, 17, 66, 32,177, 48,135,200,220, 12, 20,159,103,114,229, 40, 20,138,192,198,141, 27,239, 61,115,230, 76,179,
-224,224,224,249,238,238,238,150,201,201,201,207, 83, 82, 82, 58, 46, 93,186, 84,107,111,111,143, 65,131, 6,121, 27, 12,134, 33,
- 85,113, 9, 37,218, 6,110,142, 94,112,117,236, 5,165,109,115,100,228,106,145,150,173, 70,114, 70, 33,246,252,218, 31,167,142,
-245,199,173,139,131,241,248,250,112,100, 20, 88, 64, 98,211, 30, 0, 91,105, 4,221,107,215,174, 97,253,250,245, 37,175,213,171,
- 87, 35, 51, 51, 19,245,235,215, 71,124,124, 60,142, 31, 63,142,228,228,100,216,219,219,227,214,173, 91,216,176, 97, 3,174, 95,
-191, 94,237, 70,162,209,104, 32, 16,217,234,183,109, 28,136,109, 27, 7,130,102,229,250,210,117,111,114, 99,163,168,161, 73, 31,
-124,208, 32,201,202,202,175, 97,195,134,221,250,246,237,235,209,172, 89,179,146,237,158,158,158,174,124, 62, 63, 89,169, 84,110,
- 82, 42,149,141, 43, 37, 99,216, 0,107, 27, 95,232,180, 15,139,174, 49, 31,132,136,209,225,189, 7,104,213, 58, 2,122,131, 8,
-132, 18,131, 34, 18, 24,141, 25,176, 48,119, 4,203, 86, 25,145,184,251,241,227,199,177,126,253,122, 60,125,250,180,100,122, 52,
- 36, 36,100,252,128, 1, 3,246,211, 52,141,195,135, 15,227,224,193,131,168, 83,167, 14, 26, 55,110, 12,189, 94,223,189,170,243,
-158,181, 58,241,218,206,229,199,250, 11,140, 86,141, 69, 98,183, 58, 84,158,172,215,231,237,236,229, 0,112,236,201,147, 60, 71,
-215,188, 69,133,121,247, 94, 88,187, 20, 44,174,202,193,157,101,193,134, 71,223,191,190,251,215,147, 57, 41,233, 25,130,128, 70,
-254,234,239,230, 78, 17,186,215,174,187,100,246,180,177,142,137,185,146,156,247, 38, 28,123,184,255,248,141,252, 79,134,143, 52,
-126, 58,114,156,230,196,201, 63, 14, 48, 12,211,176,162, 21,132, 12,195, 32, 41, 41, 9,247,238,221,195,211,167, 79,145,158,158,
-142,180,180, 52,228,229,229,149, 76, 43,202,242,114,143,172,222,242,251,109,185, 84, 42,107,214,192,203,245,122,100, 84,170, 92,
- 42,149,121,213,118,173, 71, 72,249, 9,168, 25,134,177,122, 89,135, 4,121,247, 46, 64,147,153, 7,117,118, 62,212,153,249,208,
-234,121,208,104, 41,104,244, 20,236, 90,119, 70,126,129, 26,154,204,108, 48, 44,107,205, 61,102, 56,112,224, 80,201,243, 62,100,
-209,162, 69, 11, 43,219, 94,234, 93, 87,230, 59, 8, 33,135, 89,150, 13, 97, 89, 54,164, 72, 76, 21,235,132,195,165,121, 22, 45,
- 90,180,144,101,217,144, 43, 87,174,236, 2, 80, 88,147,178, 86, 57,181,147,158, 30,157,111, 97,239,247,209,164,105,223, 30,253,
-101,227, 42,135,204,204,172,104,161, 68,170,145, 72, 68, 54, 83,167,205,181, 42, 40,204,249, 40, 63,211,244, 85, 79, 89, 89, 89,
- 37, 15, 47,161, 80, 8,186,176, 0,180,186, 16,154,172, 12, 16,189, 22, 66,154,134,141, 76, 6, 87,165, 35,220, 29,157,170,228,
-227, 49, 52, 81,157, 58,138, 19,131, 63,124,101, 90,144,209,235,112,188,165, 55, 68,102,114, 72,173,172, 17,124,240,226, 75,161,
- 35, 20, 2,179, 23, 87,201,235,228,228,100,167, 84, 42, 15,253,248,227,143,194,244,244,116,220,191,127,255,118, 92, 92, 92,142,
-141,141,141,185, 64, 32, 96, 98, 98, 98, 78, 63,122,244, 40,164,118,237,218, 96, 89,214,179, 42,190,188,108,185, 94,111, 96,144,
-152,250, 28, 9, 73,247, 96,105,230, 10,150,170,133,148,204, 66, 16, 56,192,160,121, 84,226, 75,166, 85, 39,160, 64,107, 90,222,
- 94,189, 94, 15,131,193, 0,131,193, 0,157, 78,135, 79, 62,249, 4, 87,174, 94,197,206,131,231, 16, 31, 31,143, 58, 78, 50,244,
-239,215, 7,141, 26, 53, 66,120,120,120,141, 27,181, 87,167, 19,247,165, 82, 41,214,173, 91, 7,153, 76,134,234, 10, 44,133, 66,
-241,189,143,143, 79,221, 71, 5, 5,136,122,248, 16, 77,251,244, 1, 0, 92,186,116,169,100, 31,181, 90,141,129, 3, 7,138,158,
- 62,125,250,233,195,135, 15, 63, 85, 40, 20,203,147,146,146,190,172,136,243,200,145,171, 24, 61, 58, 10,105,105, 47, 45,187,123,
-118,249,149,108,123,246, 84,143,174, 61, 94,206, 92, 89, 89, 89,225,251,239, 77,203,246, 64,211, 52, 54,108,216, 0,169, 84, 90,
- 34,176,132, 66, 97,171,201,147, 39,127, 84,222,254,126,126,126, 85,114, 78,238,227, 34,185,245, 92,250,185,101,221,218,254,150,
-246, 13,145,110,188,213, 32, 50, 49,121,252,228, 62, 46, 43,151,135, 37,104,104,162,221, 74, 27,226,107,241, 37,154,109,166,148,
-241,201,177, 85, 58,235, 58,163,182, 37,167,230,124, 51,110,228, 32, 91, 43,107,199,252, 77, 63,134, 90, 81, 20,133,223, 35,116,
- 89,245, 61,108,173,123, 53,255, 33,127,244, 23,179, 34,117,198,231,227, 17,127,248, 81,145,185, 27, 21, 9,172,196,196, 68,164,
-167,167,227,197,139, 23, 72, 75, 75, 3, 33, 4,105,105,105,213,178, 80,150,103, 81,214, 37, 36, 34,249,192,102, 56, 13, 28,132,
-122,243,230,129, 97, 4, 80, 23, 26,177,175,117, 71,228,230,168,161, 99, 8,172, 2, 91,226,189,195, 23, 65, 49, 70,224,234, 21,
-238, 9,194,129, 3,135,202,250,149,195,211,167, 79,255,218,196,221, 79, 3, 48, 41,180, 78, 89,193, 53,125,250,244,175,139,143,
- 21, 26, 26,170, 6,160,122,227, 2, 11, 0,114,211,162, 98,109,221, 26, 38,229, 23,170, 37,214, 54,214,133,230,102, 34, 54, 39,
- 59,135,247,240,113,180, 38, 63,233,241,163,106, 28,239,193,253,251,247,253, 19, 19, 19,241,226,249,115, 24, 10, 11, 64,116, 90,
- 64,163, 70,167,214,173, 32, 1, 32, 33,128,144,209,131,199, 19, 33, 63, 63, 23, 0, 30, 84, 69,202, 24, 12,175,116,234, 37,211,
-130,230,230, 16,153,201, 33,182, 48,127,197,162,101, 10,164, 82,233,206, 13, 27, 54, 40, 20, 10, 5, 86,172, 88, 1,133, 66,225,
-211,169, 83,167,194,182,109,219, 74,237,236,236, 80,175, 94, 61, 4, 5, 5,225,236,217,179, 32,132, 60,169,138,207,168, 19, 69,
- 60,136,165,107,229,230,223,194,245,136, 29, 48,232,116,168,237, 53, 3, 90,163, 29,228, 14,159, 66,173, 63, 4,125,246, 57, 0,
-128,200,162, 29, 82, 82,210, 1,144,123, 85, 89,238,202,126,191,115,231, 14,182, 30,184, 4, 87,223,118, 72,206, 60,142,123,247,
-194,225,104,125, 18, 94,126,245, 97, 40, 85, 79,166, 88, 5, 77, 21, 36, 38,222, 20, 3,103,204,152,129, 28,169, 20,232,209, 3,
-194,216, 88,232,245,122, 52,111,222, 28, 77,154, 52, 1, 0, 52,111,222, 28, 60, 30, 15,117,235,214,133,141,141, 13,246,239,223,
- 63, 16, 64,185, 2,139, 37,228, 22, 67,103,248,120,120,120,148, 8,172,109,219,211, 16, 25,222, 9, 4, 34,172, 90,253,231, 37,
-113,117,117, 69,114,242, 83, 16, 82,165, 83,230,209, 30, 61,122,116,183,182,182,198,176, 97,195, 32,149, 74,241,225,135, 31, 66,
-173, 86,247, 45, 26,209, 96,198,140, 25, 0,128,217,179,103, 99,206,156, 57, 40, 44, 44,172, 48, 68,197,250,239, 26, 42,243,212,
-204,112,133, 66,249, 97,123,187,218, 13, 59,116,233,132, 58, 94, 29,209,161, 75, 60, 0, 44,180, 19, 60,235,179,228, 27,255, 3,
-181,107,217,108,185,114,240,244,183,193,221,218,207,156, 59,193,102,254,236, 85,153, 85, 14, 88,178,159,253,148,247, 80,208,115,
-229,170,245,198, 21,179,191,158, 44,126,158,174,207, 84,101, 49,249,114, 49,223,220,211, 17,102,227,167,206,127,170, 82, 61,254,
- 10,241, 39,163, 77,185,134, 79,159, 62,133, 86,171, 5, 77,211,208,106,181,200,207,207, 71, 66, 66, 66,201,245, 85,203, 45,186,
-142, 27,214,179, 81,129, 90, 93,120,253,110,204,139,153, 19, 6,181, 40, 80,171, 11, 99,158,189,136,102,217, 31,152, 10,174,121,
-118, 97, 94,190,141, 46,207,128,236,219,209,176,235,224, 6,157,145, 64,107,228, 33, 51, 61, 15,122, 26, 48, 80, 2,184,244,254,
- 4, 70,194, 71,110, 90, 50, 40, 66,184,120, 88, 28, 56,112,168, 82, 8,133,134,134,134,252, 85,220, 0, 16, 26, 26,122, 63, 52,
- 52,244,181,142, 85, 44,176,218,149,154,239,108, 87, 78, 71, 73, 26, 55,116,117, 94,248,245, 71, 74,131, 65,231,147,159,159, 79,
-243,249, 34,126, 45, 75,117,114,117, 14,102, 48, 24, 14, 95,188,120,241,131,214,173, 91,139, 99,238,222,134, 54, 39, 7,218,156,
-108, 8, 25, 35,108, 36, 65,160, 12, 58, 16,157, 22,206,222, 12,212,185, 18, 92,189,249,200, 96, 48, 24, 14, 87, 90, 33, 96, 89,
-198,248, 82, 56, 80, 20,239,149,169, 66,177,185, 25, 68,102,102, 16,155,153,151, 59,133, 88, 17, 28, 29, 29,101,221,186,117,235,
- 24, 16, 16, 0,150,101,177,116,233, 82,232,116, 58, 81,177,165, 72,175,215, 35, 47, 47, 15,191,254,250, 43,182,111,223,126,217,
-210,210,178,202,165,229,140, 81,123,236,236,229,219,221, 7,127,216, 65,116,234,220, 38, 24,180, 70,228,107,173, 80,160,209, 33,
- 79, 45,128, 78,220, 5,132, 92, 4,197, 19,163,101, 99, 79,156,185, 20,163,161, 13,250,227,213, 17, 67,132, 16,104,181, 90,164,
-166,166, 33, 51,239, 44,144,151, 8, 59,125, 30,242,159, 61, 65,227, 79,134, 64,167,211, 85,201, 53,107, 4, 49, 76, 31, 8,254,
-246,121, 20, 4, 34, 91,189, 87,167, 19, 21,134,138, 48, 51, 51, 43,241,209, 49, 73,168,231,230, 98,199,142, 29,104,222,188, 57,
-218,182,109,139,196,196, 68,196,198,198,162,123,247, 63,103,217,110,223,190,141,200,200, 72,120,122,122, 86,193,197, 30,205,204,
-124,220,167, 87,175, 94,194,107,215,174,129,101, 89,120,121, 89,194,194,220, 12,132, 18,195,215,215, 30,192, 35, 16, 66,208,174,
- 93, 59,232,245, 42, 99, 65, 1,142, 86,198, 25, 17, 17,209, 35, 48, 48,176,142,193, 96,136,246,247,247,231, 39, 39, 39,163,119,
-239,222,216,179,103, 79,241,136, 6,211,167, 79,127,229, 63,249,249,249,154,138,248, 26, 53,173,247, 21,205,218,182, 21,137,221,
-234, 88,218, 55, 68, 29,175,142, 0,128,247, 66,134,163, 78,221, 90,200, 73,187, 83, 71,167,125,254, 33,143,100, 88,255,114, 45,
- 49,170,181,204,127, 88,122,252,185, 24, 0,155, 76,184,230, 44, 33, 36,229,133,192, 98,239,190,223, 14,143,234,217,243,125,190,
-129,102,140,254,174,124,203, 61,251,143,164, 38, 62,127,241, 3, 94,156,188, 95,122,255, 74, 4, 22,157,157,157, 13, 51, 51, 51,
-196,198,198,106,123,246,236, 41, 86,171,213,136,137,137, 41, 17, 88, 14,118, 54,126,173,154,248,251, 44, 88,177,253,132, 92, 44,
- 22,119,105, 23,228, 27, 21,243, 60,129,101, 73, 92,133,188, 44,123, 45,230,193,131, 30,246,118,174, 72, 58,119, 5,242,224,110,
-208,106, 9, 52,122, 6, 58, 26, 48,242,132,176,108,212, 20, 82, 15, 95, 48, 44,240,224,238,109, 24, 89,246, 50,247, 8,225,192,
-225, 63,139, 74,181, 72,177, 5,171, 69,139, 22,187, 75, 91,153,138, 63, 3,208, 2,168,204, 39, 58,173,180,136, 42,158, 54,172,
-232, 56,101,120,107, 38,176, 88,150, 61,143, 74, 86,150,217,217,217, 57,248,122,215,247,216,184,121, 19,244,218, 28,196, 70,109,
- 65, 65, 94, 10,102, 45,188,234,233,226,226,210, 54, 33, 33,225,188, 41, 7, 75, 72, 72,216,179,127,255,254, 47, 27,213,175, 31,
-224,238,226,130, 59,113,207, 32,100,105, 8,105, 26,148, 94, 11, 62,173,131,139, 31, 3,138,146, 35, 57, 57, 15, 27,142,255,113,
- 47, 33, 33, 97, 79,165,163,111,194, 67,173,158, 31, 99,192,123, 61,192, 26,244, 56,217,218, 15, 18, 51, 51,136,173,172,208,242,
-215,115, 47, 67, 54, 24, 13,136, 91, 52, 5, 66,185, 25,108,154,183,171,178,156, 41, 41, 41,133,117,235,214, 13,127,248,240, 97,
- 19,111,111,111,204,157, 59, 23,241,241,241, 96, 89, 22,169,169,169,154,180,180,180,196,140,140,140, 56, 66,200, 1,149, 74,181,
-209,148, 72,225,169, 94,188,173,167, 78,255,241, 85, 96, 99,191,122,157,218,206,193,225,195,223, 34, 59, 55, 23, 5, 90, 62,242,
-213,122, 20,104, 88, 40,205, 61,209,172, 97, 0,210, 50,116,136,185, 31,145,144, 46,180,249,169,154,166, 83,220,190,125, 27,110,
- 54, 4, 81,209,145,176,211,100,194,219,202, 12, 1,193,173,241,244,233, 83,147, 44, 83, 70, 35,248,227, 39,253,185, 90,208,202,
-202, 10, 57, 57, 57,175,252, 79, 38,147, 65,169, 84, 34, 55, 55, 23,251,246,237, 3,107,218, 67,209,160,211,233,224,227,227,131,
-155, 55,111,226,244,233,211,232,208,161, 3,218,180,105,131,115,231,206, 33, 60, 60, 28,145,145,145, 32,132,192,214,214,182,216,
-218, 86,161,201,237,198,141,219, 97,102,102,100,198,176, 97, 99,252, 7, 13, 26,132, 95,127,221,141,225,195,188, 65, 40, 49, 8,
- 17,227,253,158, 62,152, 55, 63, 28,205,154,181,131,157,157, 16,167, 79,223,127,202,231, 91,110, 55, 65,184,252,184,100,201, 18,
-190, 68, 34,129, 78,167, 67,126,126, 62, 50, 50, 94,134,163, 42,207,130,165, 86,171, 43, 12,172,118,255,214,163,239,179,114,217,
- 44,170, 48,226,195,116,195,173,134, 29,186, 36,224,189,144, 97, 56,117,120, 11,206,156, 56, 13, 59,193,179,167,180, 52,255, 88,
-218,211,244, 60, 85,190,215, 6,191,160,207,120, 73, 5, 39,214,127,222,203,154,231,162, 96,194,166,175,205,201,174,170,188,153,
- 81, 59, 14, 29, 98,241,126,112,243,166,158, 13, 92,149,162,204,140, 84,236,255,237,216,125,253,179, 95, 15,227,229,180,160, 41,
-166,200,121,171, 86,173,250, 22, 0, 24,134,217,186, 98,197,138,207,190,250,234, 43,251,196,196,196, 18,129,149,154,158,121,166,
-101,143,241,116, 70,118,142,238,231, 21, 83,123, 75, 37, 98,209,204, 69, 63,159, 51,240,112,173,194,206,133,207, 31,242,245,218,
- 95,210,246,133,109,225,217, 75,132,184, 52,109, 54, 98,255, 56, 11, 61, 17,162,203,201,235,208,233,105,228,166,102,224,204,176,
-177,176, 86,216,224,104, 70, 12,157,147,151, 59,132,123,198,112,224,240,159,181, 78, 85,166, 69,210, 74, 9,162, 76, 0,113,161,
-161,161,233,165,172, 75,105, 0,110, 3,104, 84,180, 95, 90,153,255,165, 1,184, 9,160, 73, 41,158,180, 82, 66,171,244,103, 93,
-153,125,110,191,142, 5,171, 82,164,167,167,167,222, 8,191,135,203,167,214,193,104,208, 34, 39,243,101,236, 79, 85,138, 6, 22,
- 22, 22, 87, 43,121,224,191,146,109,155,101, 89, 86,161, 80,124,180, 98,229,202,107,163,134, 12,118,106,211,177, 35,158,223,189,
- 3,109,102, 58,120, 52, 13, 30, 17, 32, 63, 93,130,148,228, 92,132, 30, 58,150,170,214,104, 62, 42, 59,242, 46, 47,131,119,177,
-147, 59, 75, 8, 36,150, 22, 16,203,229, 16, 91, 90,252,105,177, 34, 4, 34, 51,115, 8,228,102,224, 9, 69, 85,150, 19, 0, 10,
- 11, 11, 63, 30, 57,114,228,157,163, 71,143, 90, 15, 24, 48, 0,239,191,255,126,100,118,118,118,251,204,204, 76,147,252,205,254,
-239,220,195,194,104,187, 6,239,247, 90,179,110,227,149,161, 67,135,218,188,223,107, 13, 34,163,238, 35,187,192, 1, 0,160,180,
-147,163,153,247, 20,164,102,104,113,226,216,225, 44,198,168,249,152,189,183,219, 80, 17, 39,203,178,172,157,157,221, 43, 86, 57,
- 30,143,135,115,231,206, 97,226,196,137,176, 51, 63,135,188,184, 88, 52,104,221, 22,239, 13, 26,130,225,195,135,131,199,227,193,
-214,214, 22,165, 31,186, 85,101, 68,207,201,201,129,187,187, 59, 78,110,244,174,175,211,164, 10, 3,108, 0, 2, 75,253,169, 51,
-221,239, 95,184,112, 33, 31,192, 70, 47, 47,175,176,170,234,147, 16,242,205,194,133, 11,215,181,106,213, 74,106,102,102, 6, 47,
- 47, 47, 92,190,124, 25,151, 47, 95,198,197,139, 47,253,227,108,109,109, 97, 99, 99,131,236,236,108,196,199,199,171, 9, 33,223,
- 84,210,150,152, 38, 77,154,124,112,234,212,129,235, 61,123,126,100,215,181,107, 11, 56, 57,229,193,104, 76, 7,161,132, 16, 75,
- 28,176,113,227, 34,164,166,100,226,202,213,171,153,249,249,252,143,195,195, 95, 77, 65, 84, 65, 57,245,199,143, 31,135, 68, 34,
-193,175,191,254,106,116,116,116,228, 91, 89, 89, 85,104,193,210,104, 52,226,138, 56, 63,155,122, 55, 17,192,252,201,125, 92,150,
- 93,185,159,242, 1,128,157,117,234,186,224,204,137,211,184,120,230,202,244,230,254,204,170, 30, 3,155,206,147,116,232, 59,197,
- 47,240, 51,158,153,133, 2,219,246,255,202,139,138,216,244,157,166,224,158, 7,128, 41, 85, 92, 35, 22, 0,242, 83, 83,102,132,
- 46, 95,189, 53,116,238,183,210,165, 63,172, 85,169,211,147,191,198,203,165,149,108,233,253, 42, 42,103,108,108,236, 6, 0, 37,
-225, 49,148, 74,229,142, 69,139, 22, 93, 24, 60,120,176,125,177,133, 50,245,254,111, 87, 1, 92,245,111,255,233,172,150, 77,234,
-123,127,247,195, 47, 39, 94,196,167,252,146, 29,245, 50, 6, 86,121,229,188,122,245,106, 86, 80, 80,208,200, 41,211,230,108,154,
- 59,111, 54,241,153, 52, 29,209,151,111, 66,171,214, 67,207,242, 96, 0, 65,196,130,229, 48,183,183,192, 37, 54,147,213,242,168,
- 17, 79,202, 56,249, 87,213, 62,107, 2,142,147,227,228, 56,223, 77,206, 42,112,179, 60,123,136, 9,251,221, 52,129,231, 47,129,
- 73, 2,203,217,217,185,205,123, 29,155,163,213,123, 99,160,215,102, 35,246,254,207,200,207, 75,129,179,147, 24,177, 47,114, 91,
- 0, 56,111,234, 1,147,146,146, 94, 40, 20,138,230,223,173, 92,181,191, 75,211, 38,190, 94,206, 10,177,149,187, 27,228, 14,142,
- 72, 79, 75,195,245,136,104,195,218, 19,103,238,169, 53, 26,147, 82,229, 48, 12,195,178, 44, 11,161, 80, 8,150,199,131,223,248,
-105,160, 40,170,204,106, 65, 2,139,160, 96, 80,124, 1, 12, 38,250, 12,169, 84,170, 4,103,103,231,143,199,143, 31,255,199,214,
-173, 91,169,118,237,218, 53, 62,116,232, 16,243, 58,149,157,126,247, 80,140, 99,131, 15,219,174,250,113,237,190,128,160,230,110,
-238,181,221,197,173,106, 89, 66,111,160,145,146,154,129,243, 87,162,180, 49, 81,183,227, 25,189,174, 79,106, 84,197, 81,220, 1,
-192, 96, 48,188, 80, 42,149,142,115,230,204,129,209,104, 4, 77,211, 48, 26,141, 72, 79, 79, 71,100,100, 36, 2,155,183,128,207,
-167,159, 33, 51, 51, 19,155, 55,111,134,139,139, 11,186,119,239,142,188,188, 60, 92,184,112,225, 69,197, 86, 7, 24,103,124, 51,
-144, 15, 0, 2, 1,140, 95,135,132,156,171, 95,191,126,240,251,141, 82,133, 99,198,191,180,108, 45, 94, 52, 80,120,238,220,185,
- 48,177, 88,188,225,233,211,167,149,198, 64,243,244,244, 20,105, 52,154,198, 44,203,242,115,115,115, 87,106,181,218,161,147, 39,
- 79, 86, 44, 89,178, 4, 13, 27, 54, 68,122,122, 58,108,108,108,160, 80, 40,144,159,159,143,167, 79,159,210,122,189,126, 61, 77,
-211,243, 82, 82, 82,210, 42,189,219,110,222,124, 22, 16, 16,208, 34, 37,121,221,254, 49,163, 59,123, 25, 12, 65, 34, 11,203,214,
- 96, 89, 35,178,179,226, 65,216, 59,250, 3, 7,255,120,146,157,205,251, 40, 60, 60, 60,198,148,107, 68, 81,212,232,223,127,255,
- 29,197,169,114, 84, 42, 85, 44, 69, 81, 21, 90,176, 76,193,242,176, 4, 13,128, 93,203,190,104, 49, 41, 39,237, 78, 61, 59,193,
-179,167,205,253,153, 85,203,195, 18, 52,139, 71, 89, 47, 72, 76, 59, 23,173,202, 63,177, 97,219,254, 95,121, 67, 62,252,152, 86,
-152,197, 76,183,171,133,176,246,239, 87, 57,218, 99, 27, 53,106,228, 74, 81,153,181, 83, 51, 30,133, 15, 31, 49,170,175,165, 80,
-125,180,161,115,122, 93,163,163,159, 36, 42, 42, 42,174,104, 55,182, 58,237, 84,165, 82, 69, 43,149,202, 54,223,127,255,253,137,
-178,166,241,212,244,204, 51, 45, 66,198,177,217,217, 57,183, 82,163,126,187, 91, 21, 87,120,120,248,207, 65, 65, 65,248,100,240,
-240,159, 70,124, 58,146,231, 63, 97, 42, 18,206,254, 1, 24, 13, 72,186,120, 30, 50,115, 26,135,211,227,232, 66, 30, 53, 50, 60,
- 60,156,139,226,206,129, 3,135,127, 13,136,169,125,175,167,135,203, 9,143,218,206,157, 61,106, 43, 1, 0,177,207, 84,136,125,
-150,120,242, 73,108, 66,151,154, 40,220,210,201,158, 73, 81, 40, 6,214,132,100,207,101, 57,253,253,253, 35, 41,138, 82, 86,231,
-164,105,154, 78,184,127,255,126,144, 41,229, 84, 42,149, 3,106,213,170,181, 72,165, 82,237,143,143,143,255,226, 77,168,251,226,
-100,207, 20, 79, 24,194,178,108, 67, 0,132, 80, 84,149,201,158, 75,115, 58, 59, 59, 55,144, 74,165, 27,248,124,190,107,177, 73,
-181,184,202,244,122, 61, 47, 39, 39, 71,162,211,233,120, 0,136, 80, 40, 52,154,153,153,105, 4, 2,129,145,166,233, 23, 6,131,
- 97, 84, 98, 98,226, 93, 83, 71, 33,126,126,126,242,144,160, 7,249,197, 41,116,102,124, 51, 16,161, 91, 88, 98,202,185, 63,126,
-252,184,158,181,181,117, 63, 66, 72,111,150,101,189,243,242,242,180,223,126,251,237,173,243,231,207,231,186,186,186,118,109,221,
-186, 53,185,115,231, 14,226,226,226,216,252,252,252,125, 20, 69,125,147,144,144, 16, 91,205,182, 68,181,108,217,184,191,185, 25,
-122, 48, 44, 26, 1, 44, 33,132,220,205,207, 39, 71, 21,138,218,191,132,133,133,209, 53, 29,129, 5, 6, 6, 30,201,207,207,239,
- 30, 19, 19, 83,209,185,130,101,255,172,139,202, 56,151,125,211,224,155, 22,109,131, 63,190,124,254,226,129,169,223,221,155, 95,
-122,219,184, 15,109,134, 15,252,124,226,146,157,107,126,152,186,250, 64,230,207,166,148, 51, 48, 48,176, 14,128,254, 44,203,214,
- 39,132,120, 49, 12, 36,132,176,153,132,144, 40,134, 97,110, 51, 12,243,251,157, 59,119, 84,239,194,136,182,116,178,103, 66,211,
- 86, 52, 33, 38, 37,123,230, 44, 4, 28, 39,199,201, 89,176,254,169, 48, 57, 2,119,177,144,242,242,242, 98, 31, 63,126,252,202,
- 67,165, 38, 40, 18, 80,187, 81, 73,148,118, 83,112,239,222,189,128,191,178,130, 84, 42,213, 46, 0,187,222, 36,103,145,128,250,
-185,232, 85, 35, 20, 9,164,102,127, 71, 35,137,138,138, 42,152, 53,130,148, 88,182,248,124, 24, 77,253,111,231,206,157,159,235,
-245,250,211, 0, 18, 0, 88, 1,200, 52, 24, 12,199,211,210,210, 82,156,156,156,130,158, 63,127, 62,171,200, 18, 57, 63, 57, 57,
- 57,188,134,109,137, 1,176,179,232,245, 70, 17, 17, 17,209, 67,169, 84, 70,218,218,218,122,106, 52, 26,145, 70,163, 17,148,110,
-251, 82,169, 52,205, 84, 46, 75, 11,108,227,145, 12, 91,107, 11,242,127,150, 26, 59,103,252,170, 46,184, 87,207,206, 25,191, 86,
-163,108, 79, 27, 55,110,188,131,162,168,218, 12,195, 56, 2,176, 96, 89,164,179, 44,155, 78,211,116,194,221,187,119, 85,239, 74,
- 71, 83, 36,160, 66,192,129, 3, 7, 14,156,192, 42, 31, 49, 49, 49,132,171,182,255, 30,230,111,100, 5, 53,249, 95, 92, 92,156,
- 22,192,149,162,215, 43, 40, 18, 84, 61,223,245,115, 87,169, 84,111, 68,196, 23,249,100,125,209,180,227,255,111, 43, 10,205, 48,
-181,195,251,213,227,188,117,235,214, 11, 0, 47,184, 22,202,129, 3, 7, 14,239, 22, 40,174, 10, 56,112,224,192,129, 3, 7, 14,
- 28,222, 44, 8,128,114, 67, 92, 87,103,110,149, 16,226, 95,221, 3, 87,197,207,113,114,156, 28, 39,199,201,113,114,156, 28,231,
-191,143,179, 42,238,127,139,111, 23,169,230, 2,163,234,145,115, 14,128, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254, 7,
-193, 77, 17,114,224,192,129, 3, 7, 14, 28, 56,188, 97, 84,232,228,238,225, 81,203,143,162,153, 86, 44, 75,241, 88,138, 53,144,
- 92,245,158, 39,101,130,108,186,186,186, 90, 9, 40,244, 36, 44, 43, 39,132,161, 25, 30,117, 57, 54, 54, 62,202,148, 3,251,249,
-249, 9, 1, 12, 21, 8, 4,193,122,189, 94, 33, 16, 8,146, 52, 26,205, 37,129, 64,176, 53, 42, 42, 74,255, 46, 85, 82,112,112,
-112,255,125,251,246, 89,133,132,132,104,245,122,189, 81, 40, 20,242,119,239,222, 45, 30, 54,108, 88,246,165, 75,151,106,180, 10,
- 50, 32, 32,160,253,226,197,139,235,116,236,216, 17,193,193,193, 5,221,186,117, 19, 6, 5, 5, 9,167, 77,155,246, 52, 50, 50,
-242,108,117,184, 28, 29, 29,253,248,124,254,118, 66, 8,143,101,217, 79,138, 67, 48,252, 21, 32,132, 12, 0,208, 7,128, 2, 64,
- 50,128,189, 44,203,238,170, 33, 87, 87,188,116,114,111, 88,244,211, 29, 0,191,179, 44,123,252, 53,202,215, 21, 64, 79, 66, 72,
- 35, 0, 96, 89,246,246, 27,228,108, 88,196,249,198,202,249,186,231, 30, 24, 24,248,173, 72, 36, 26, 1, 0, 58,157,238,103, 51,
- 51,179,208,242,246, 59,127,254,188,174,162,208, 39,126,117, 8, 27,245,187,207,203,207, 61, 31, 2, 0,170,252,254,180,134,171,
-136, 31,248,178,229,241,194,247, 65,141, 23,207, 40,149,202,177,221,187,119,159,118,252,248,241,239, 18, 18, 18,126, 2, 7, 14,
- 28, 56,188,171, 2,203,195,163,150, 95,239, 15, 62, 90, 56,122,212, 24,194,227, 81,120,240,240, 33,255,243, 9, 95,116,246,245,
-245,117,150,107, 52,190, 44,192,168,165,210,123, 60, 30,149,184,110,205,143,230,222,245,234,209, 52,205, 96,253,134,117,221, 60,
- 60,106,125, 93,149,200,114,112,112,168,163, 80, 40, 86, 78,152, 48,193,161,115,231,206,148,163,163, 35, 18, 18, 18, 44, 14, 28,
- 56, 80,119,243,230,205, 33, 14, 14, 14,147, 82, 83, 83,159,214,228,132, 20, 10, 69,107,133, 53,186, 74,197,108,123,228, 18,168,
-141,228,108,146,142, 61,158,148,148,116,177,166,149,164,211,233,198, 23, 22, 22, 54,247,243,243, 99,214,173, 91, 71, 70,142, 28,
-201, 18, 66, 40,181, 90,189, 5, 53, 12, 51, 33,149, 74,215,116,236,216,209, 43, 56, 56, 56,246,242,229,203, 61, 0, 28,233,211,
-167,143,135, 84, 42,141, 1,224, 93, 29, 46, 30,143,183, 37, 42, 42,170,145, 90,173, 70, 80, 80,208,102, 0,129,127,145,184,218,
-108,109,109,109, 88,187,118,237,134,198,141, 27,123,102,101,101, 21,140, 26, 53,170, 19, 33,164, 3,203,178,159, 86,131, 71, 14,
- 96,149, 76, 38,227, 77,154, 52,233,216,135, 31,126,120, 91, 46,151,155, 61,122,244, 72, 48,113,226,196, 79, 8, 33,189, 1, 76,
- 96, 89,182,160,186,156,182,182,182,210, 5, 11, 22, 68,180,108,217, 50, 85, 34,145, 72,159, 62,125, 74, 38, 77,154, 52,242, 53,
- 57,133,243,230,205,187,220,174, 93,187, 88,177, 88, 44,123,241,226, 5,239,171,175,190, 26,254, 58,156, 86, 86, 86,162,111,191,
-253,246,106,219,182,109,227, 36, 18,137, 60, 54, 54,150,154, 60,121,242,103,213,225,108,219,182,109,127,138,162,230, 94,184,112,
- 1, 0,208,162, 69,139,111,117, 58,221,204,178,251,177, 44,139,224,224, 96, 77,219,182,109, 71,156, 63,127,190,220,246,186, 53,
-124, 74,127, 0,248,106, 86,241,247,151,239,229,125, 31, 26,180,180,218,109,222,175,206,203,252, 98,159,127,181,118,240,203,247,
-151,191,175, 43,186, 43,215,244, 36,108,117, 68,155,179,179,243,168,166, 77,155,206,184,126,253,250,182,160,160,160,137, 63,253,
-244,147, 32, 36, 36,100,129, 82,169,244,236,218,181,107,239,171, 87,175, 46,125,248,240,225, 26,174,139,231,192,129,195, 59, 37,
-176, 40,154,105, 53,122,212, 24,210,111, 64,255,228,164,148, 84,198,204,220,114,192,222,176, 48, 89,189,122,245, 40,205,170, 85,
- 48,166,167,131,254,242,203,150,231,207,159, 55,140,155,244,165, 90,171, 41,220,162,112,116,144,237,217,181,219,105,255,175,251,
- 90, 1,136,170,204,114,165, 80, 40, 86,254,250,235,175, 78,117,234,212,129, 78,167, 67, 90, 90, 26,244,122, 61, 62,252,240, 67,
- 94,243,230,205,157,134, 15, 31,190,210,207,207,239,163,234, 88,178,236,237,237, 29,189, 93, 5, 71,231,124,209,181, 94,251, 54,
- 65, 82, 39,231,218, 64, 2,131,196,216,152, 38,127, 92,139,152,208,166,174,115,244,163, 28,125,247,180,180,180,148,234, 86, 82,
- 70, 70,198,180, 81,163, 70,237,107,216,176,161,189, 88, 44,134,163,163, 35,249,236,179,207, 82,146,146,146,230,213,180,226,139,
-163,131, 83, 20, 69,151,121,175, 9,157,139,165,165, 37, 44, 44, 44, 0,192,249,117, 26, 68,159, 62,125,120, 47, 94,188, 24,193,
- 48,140,111,233,223,147,146,146, 60,236,237,237,211,159, 61,139,107,164,209,233,155,141,253,106,238,130,126, 61,219, 91, 92,189,
-122,149,234,209,163,135,128, 16, 50,160, 26,150,172, 85,222,222,222,119,151, 44, 89,162,123, 16,243,212,255,228,185,171,148,131,
-141,156,169,227,238,110,118,255,254,125, 97,104,104,104, 90,104,104,232, 42, 0,195,171, 81,244, 85,239,189,247, 94,252,140, 25,
- 51,120, 15,162,159,120, 92,188,122, 11, 22,102, 34,218,213, 69, 41,185,122,245, 42,127,221,186,117,248,250,235,175,171,205,217,
-190,125,251,152,249,243,231,179,201,169,153,117,159, 62, 75,130,185,153,200,104,107,107, 43, 61,119,238, 28,217,186,117,171,110,
-226,196,137,213,230,108,217,178,229,147,217,179,103,147,135,143,159,214,189,116,245, 22,204,228, 66,163,187,171,139,228,198,141,
- 27,228,199, 31,127, 52,124,251,237,183, 38,113,178, 44,187,126,233,210,165,248,237,183,223, 0, 0,187,118,237,130,135,135,199,
- 43, 13, 72,173,209,128, 16,130,184,103,207,100,163, 71,143, 94, 95,222,128, 32,234,119, 31,108, 13, 7,134, 14, 29,106, 90,242,
-246, 7, 75,171,109,181, 42, 22, 86, 99,198,140, 73,168, 96,175,193,126,117, 76, 23, 89,173, 90,181,154,182,103,207, 30,187,176,
-176,176,175, 14, 28, 56, 0, 0,144,201,100,178,213,171, 87,143,237,213,171, 23, 62,253,244,211,105, 0, 56,129,197,129, 3,135,
-119, 75, 96,177, 44,197,227,241, 40,164,166,164, 27,222,235,212,121,248,234,181,107,197, 34,145, 8, 58,157, 14, 5,103,206,128,
-213,106, 97, 41,149,162,123,247,238, 2,127,127,127,139,145,195,135,127,150,154,146,188,129,199,163,156, 88,150,226, 85,113,204,
-161, 19, 38, 76,112,168, 83,167,206, 43, 9,132,105,154, 70, 74, 74, 10,204,205,205,209,183,111, 95,187, 29, 59,118, 12, 5, 96,
-146,185,223,209,209,209,221,219,195,225, 74,216,166,175,156, 28,172, 8,144,246, 43,240, 60, 6,216, 41,129,151,131, 27,188, 58,
-180,145,246,108,230,223,168,255,146,173,183, 28, 29, 29, 91,166,164,164,196, 85,167,146,158, 61,123,118, 73,169, 84,142,208,104,
- 52, 7, 1, 80,151, 47, 95,102, 95,188,120, 49, 58, 57, 57,249,121, 77, 43,158,166,105,100,103,103,131, 97, 24, 30,128,146,119,
-218,196, 84, 62,127, 5,250,244,233,195,139,143,143, 31,229,235,235, 91,119,227,198,141, 72, 77, 77,133, 68, 34, 1,195, 48,104,
-209,162,133,107,167, 78,157,158,164,101,230, 88, 27,141,180, 62,225,249,179,160, 69, 75,111,165, 53,242,243,190, 20, 22, 22,214,
-216,206,206,174, 47, 76, 8,200, 74, 8,233,106,110,110,206,255,238,187,239,212, 78, 46, 30,253, 20,174, 94,130, 43, 55,239, 70,
- 11,101, 34, 54, 35, 39, 47,239,214,173, 91,209,115,231,206,109,115,244,232,209, 84, 66, 72, 87, 83,166,204, 8, 33, 93,109,109,
-109,165,211,167, 79, 39,150,182,202,247,130,219,184, 10, 34,238, 68, 61, 17,201, 68, 76,112,112,112,207, 43, 87,174,108,158, 60,
-121,114,227, 35, 71,142,228, 86,135,211,198,198, 70, 48,111,222, 60,218, 81,233,214,203,181,118, 93,129,179,147,157, 31, 0, 60,
-138,126,188, 41, 37, 37,229,201,232,209,163,155, 29, 59,118, 44,175, 58,156,150,150,150,194,111,191,253,150,245,245,111, 60,188,
-126,195, 64,234,247,147, 23,174, 74,229, 34, 58,183, 64,157, 31, 21, 21,245,100,234,212,169, 77,143, 28, 57, 98, 18,103, 97, 97,
-161,185,139,139, 11,156,156,156,192,168,213,200,205,205,197,254,253,251,145,151,151, 7,154,166, 33,149, 74,241,195,241, 76,104,
- 30,255,142, 13, 43,231, 65,173, 86,155,191,137,118,226,215,243, 33,162, 76,181, 47, 63,240,101,215, 93, 28, 55,184, 18, 97,133,
- 82,194,107, 48, 30,248,178,149, 77, 23,150,178, 92, 37,132,133,133, 57,120,122,122,162, 93,187,151, 9,220,135, 15, 31,142, 78,
-157, 58,225,183,223,126,195,201,147, 39, 95,124,248,225,135, 79, 35, 34, 34,150,198,199,199,175,231,186,122, 14, 28, 56,252,221,
- 40,215, 92,194, 18, 82,112,255,193, 3,129,153,149,213,224,213,107,215,138, 5, 2, 1,226,226,226, 16, 21, 21,133,194, 51,103,
-160,190,114, 5,169,169,169,200,203,203,131,189,189, 61, 66,151, 46,149, 11,165,242,225, 49,143, 31,243, 88,138, 53,148, 26, 97,
-255,223, 10, 3,145, 72, 20,220,189,123,119,170,162,213,139,201,201,201,232,220,185, 51,159,207,231, 7, 87, 48,106, 47,155,156,
-151, 40,237,201,239,123,127,154,228,228,192,191, 11, 60,158, 8,100, 95, 4,140,217,128, 58, 31,120,118, 23, 56,240, 61, 92, 50,
- 31,147,157, 19,250, 56, 58, 75,133,191,147,210, 25,146, 81,245,146, 80, 23, 23, 23, 15, 79, 79,207,141, 31,127,252, 49, 5, 0,
-193,193,193,196,211,211,115,131,139,139,139, 71, 37,214,133, 74, 57, 53, 26,205,181,172,172, 44,210,163, 71, 15,219,150, 45, 91,
-158,234,209,163,135, 45, 0,162,209,104,174,213,148,179, 8,182, 29, 58,116,200,240,240,240,216,229,238,238, 46, 54,193, 10, 82,
-194,249,226,197,139, 17, 62, 62, 62,117, 55,110,220,200,227,241,120,248,233,167,159,176,119,239, 94, 92,184,112, 1,105,105,105,
-178,201,147, 39, 91, 29, 58, 19,121,250,212,197,219,135, 39,141, 25,197,188, 23,216, 88, 33, 78, 79,206,176,181,181,237, 6,192,
-201,196,114,246, 28, 63,126,252,209,200,168,103, 78,132, 39, 22, 11,133, 66,137,147,163,157,131,194,193,209, 93,225,224, 88,207,
- 92, 38,179, 46, 40, 40,120,113,240,224, 65, 22,165,130,144, 86,197, 57,119,238,220, 27, 81, 49, 47, 28, 88, 74, 40, 18, 10, 5,
- 66, 59,107, 43,155,222,239,119,238, 9, 0, 50,177, 88, 86, 80, 80,144,180, 99,199,142,106,113,206,158, 61,251, 98, 98, 74,182,
- 19, 95, 32, 20, 75,196,226,146, 44,225, 54,214,150,206,102,114,185, 76,167,211,197,111,220,184,209, 88, 29,206,153, 51,103, 94,
-126,240,248,133, 35, 69,241,120, 20, 69,248,246,182,214,118,182,182,182, 10, 91,107, 27,103,169, 72, 36,207,207,207, 79,216,181,
-107, 23,109, 42,103, 74, 74, 10, 30, 62,124,136, 90, 77,154,224,244,233,211,168, 85,171, 22,250,244,233,131,126,253,250, 65, 42,
-149,162,169,213, 19,124,216,181, 37,158, 60,121, 82,225,117, 47,246,135,170, 12, 74,165,242,124,117,218, 18,240,114, 90,176, 50,
-113, 85,150,179,188,253,202,114,182,106,213,106,218,254,253,251,237, 86,172, 88,209,248,139, 47,190,136,221,191,127, 63, 26, 54,
-108,136, 7, 15, 30,192,217,217, 25,187,119,239,198,184,113,227, 98,231,204,153,211,120,239,222,189,142,254,254,254,211,107,120,
- 31, 85, 11, 28, 39,199,201,113,114, 48,201,130,101, 96,240,251,248,137,147,123,254,186,127,191, 76, 36, 18,225,217,179,103, 72,
- 73, 73,193,209,195,135,233,163, 13, 26, 20,242,120, 60,246,163, 95,127, 53,239,211,175, 31, 17, 10,133,168, 91,183, 46,186,119,
-239, 46,253,108,228,152, 84,126,129,122, 79, 21, 23,197,193,222,222, 30,211,167, 79, 71,104,232,171,254,184, 67,135, 14,197,202,
-149, 43, 97,110,110, 14, 66,136,131, 41, 39,160, 80, 40,250, 12,255,170,125, 45, 11, 55,139, 20, 54,114,139,128,128,178, 1, 95,
- 6, 80, 34, 64,102, 6, 48, 52, 96,208, 65, 27,126, 37,147,109,183, 58,183, 75, 64,129,115,178,110, 87, 31, 0,123, 77,173, 36,
- 59, 59,187,153, 97, 97, 97,246, 83,167, 78,101,243,242,242, 72,106,106, 42, 59,117,234, 84,251,153, 51,103,206, 4, 48,180, 38,
- 21,175, 82,169, 22, 12, 31, 62,188,203,207, 63,255,236,244,241,199, 31, 91, 21,141,192,147, 85, 42,213,130,215,185,160, 2,129,
-128,119,230,204, 25,155,245,235,215,247, 95,176, 96, 65,253,142, 29, 59, 58,101,103,103,199, 37, 37, 37,245,174,202,226,198, 48,
-140,239,198,141, 27,193,227,189, 52, 66,242,120, 60,136, 68, 34, 72, 36, 18, 88, 90, 90,102, 63,125,250,212,232,110, 43,228,191,
-120,145, 92,232,166,116, 49,183,108,228,231,232,224,226,250, 81, 65, 65, 65, 4, 76,207, 10,208,176,107,215,174,151, 15,157,189,
-131,177,159,118,170,199, 39, 58,190, 68, 34,172, 39, 19, 10,136,128, 98, 89,198,200,210,155,247, 92,254,205,205,205,205,151, 16,
- 98,210,116, 39, 33,164, 81,235,214,173, 19, 79, 95,139,162,174,223,138,137,117,180,145, 91,125,216, 45,184,121,201, 1, 3, 2,
-250,149,218,215,212,212, 54, 13,219,181,107,247,240,113, 66, 6,229,170,180,123,197, 39,206,222,222,190, 11, 0, 20,230,231,110,
- 85, 40, 20,222, 98,177,216,212, 92,152, 13, 59,116,232, 16,115,250,218,125,202,201,222,170,184,125,191, 50,144, 72, 79, 73,218,
-225,230,230, 86,143, 16,226,100, 10,225,193,131, 7,113,235,214, 45,204,243,243,195, 84, 55, 55,216,219,219,227,204,153, 51, 96,
- 89, 22,114,185, 28,217,217,217, 8, 11, 11, 43,177,242,188, 14,148, 74,229,121,149, 74,213,182,196, 49,253, 13,160,152,211, 84,
-235,216,165, 75,151,246,135,133,133,141,245,244,244,196,176, 97,195, 60,182,108,217, 18,235,237,237,237, 17, 28, 28,140, 75,151,
- 46, 97,234,212,169,177,115,230,204,241, 24, 58,116, 40,182,110,221,138,219,183,111,111,227,186,121, 14, 28, 56,188, 53,129, 69,
- 8, 97, 89,150, 37,197,239, 47, 94,188,200,246,245,245,117,246,244,244,164,116, 58, 29,114,114,114,112,226,216, 49,122,247,222,
-189, 71,116, 58,221, 4,138,162,132, 91,183,111, 95,239,224,232,216,190,119,159, 62,196, 96, 48,160, 99,199,142,162, 51,103,206,
-216,222,121,241, 34,175,178, 3,242,120,188, 18,235,209,216,177, 99,177,114,229, 74, 0,192,144, 33, 67,254, 20,120, 6, 3,202,
- 24,153, 42,132,204,146, 14,105,219,169,190,121,188,252, 71,115, 77,203,220,188, 58,209,206, 87,204,242,228, 77,193,151,240, 33,
- 51, 3, 99,132, 49, 38,191,121, 68,236,243,218,190,146,163,169,181, 91,121, 55,197,222,171, 7, 66,170, 35,176,164, 82,105, 83,
-185, 92,142, 7, 15, 30,100, 6, 5, 5,101, 91, 88, 88, 88,122,121,121,217, 73,165,210,166, 53,173,248,148,148,148,103,206,206,
-206,109, 63,250,232,163,207, 41,138,234,196, 48,204,233,140,140,140, 53, 41, 41, 41,207, 76,249,191,179,179,243, 24,150,101,103,
- 3,216, 87,252,155, 94,175, 7, 69, 81, 96, 89, 22, 61,123,246,196,162, 69,139,252, 78,159, 62,141, 11, 23, 46,216, 12, 28, 56,
-240,154, 82,169,204, 38,132,124,154,152,152, 88,161,149, 44, 35, 35, 3,235,214,173, 3,143,199,131,149,149, 21,204,205,205, 33,
-145, 72,208,174, 93,187,148, 37, 75,150,120,133,133,133, 25, 50,234,166,178,162,252,156, 2, 91,169,151,146,178,179,175,243,249,
-200, 81,215, 1,132,153,122,238,102,102,102,230,230, 60,117, 62,143,213,240, 86,172,218,192,151,241, 41,200, 5, 66, 72,168,124,
- 50,227,219,249,172,132,240,100,168,102, 26, 39,161, 80, 40,179, 20, 65, 39,148, 9,104, 51,153,232,141,164,115,146, 74,165,114,
- 51, 33,116, 21,109, 23, 81,124, 17, 0, 9, 33,164,208, 84, 78,137, 68, 98,102, 33, 98,181, 21,109, 55, 23, 8,133,132, 16, 9,
-128,114,157,220,251,116, 34,108,216,202, 98,129, 35, 41,249,157,166,105, 52,105,210, 4,123,127, 59,141, 19, 23,239, 35, 51, 33,
- 10,131,251,116,131,187,187, 59, 24,134,169,180, 76,197, 62, 88, 38, 12, 10, 94, 10,162, 83,150, 85,239, 92,228,119, 85,213,212,
- 96,105,206,151,226,170, 98, 31, 44, 23, 23,151,145,141, 27, 55, 30,114,224,192, 1,180,111,223, 30, 33, 33, 33,240,246,246,246,
- 24, 56,112, 32, 0,160, 77,155, 54, 8, 13, 13,245,232,223,191, 63, 14, 30, 60,136,163, 71,143, 34, 40, 40,104,162, 82,169, 76,
- 85,169, 84,107,185,238,158, 3,135,119, 27,101,181,200,191,210,130, 5, 0, 98,189,222, 91,179,110, 29, 10, 79,159,134,232,212,
- 41, 28,105,212, 40,223,104, 52,126,169, 82,169,226, 1,192,209,209,113, 82,216,190,125,151, 59,159, 61,107,161,123,240, 0,181,
-238,221, 3,191, 94,189,198,166, 30,184,216,122,165,215,191,244, 99,223,182,109, 27,114,115,115,145,147,147, 3,163,209,228, 92,
-194, 16, 8, 72, 43, 7, 59, 87, 36, 33, 6, 12,159,111,254,204, 79,215, 82,174,182, 72,172,245,204, 46, 63, 71,208,136, 68,167,
- 54, 50,215,228, 25,154, 81, 66, 29,116,217, 26, 40,109,157,193,167,248,173,170, 83, 73,197, 22, 29,169, 84,154, 25, 17, 17,241,
-126,235,214,173, 15, 1,176, 43,254,189,166, 72, 76, 76,124, 12, 96, 98, 77,254, 75, 81,212,236,115,231,206, 57,132,133,133,141,
- 91,189,122, 53, 11, 0, 58,157,174,196, 73, 94,167,211,129,207,231,131, 97, 24,200,229,114,240,249,124,199, 3, 7, 14, 56,246,
-234,213,107, 13,128, 10,175,147, 76, 38,131,163,163, 35, 4, 2, 1, 44, 45, 45, 81,144,155, 37, 95,183,112,102, 59,153,181,163,
-205,196,137, 95, 82, 67,135, 14,189,191,122,245,106, 23,165,103,221,250, 15, 31, 62,124, 49, 96,216,240,203,187,119,239,206,175,
-134,131,251,157,216,216, 88, 81,125,223,186,146, 35,251,242, 25, 25,159,133, 44,253, 59,200,164, 10,136, 68, 46,144,137,197, 16,
-138, 68,118, 73,201,201, 41, 44,203, 62, 49,133,144,101,217,219, 79,159, 62,229,213,118,117, 18,229, 21, 26,243,100, 60,218,252,
-113,228,157,232,186, 1, 13,235, 1,128,230,193,157,115,226,218,158,162,164,172, 28,177, 82,169,140,170, 70, 57,133,142,142,142,
-162,251, 15, 30,111,180,179,177,112,117,116,116,120, 15, 0, 12,234,194,251, 68,167, 81,241,248,124, 69,102, 86, 86,154, 70,163,
-121,108, 42,103,116,116, 52,223,211,221, 69,188,255,240,169,159, 29, 44,204,106,217, 73,197,142, 22,114,161,153,136,166, 11, 68,
- 12,173, 18,138,197, 78,170,228,228,116,150,101,163, 43, 34, 89,119,113,220,224,151,159, 54,239, 40, 58,255, 98,235, 14,174,196,
-178,176,182, 87, 34, 35,254, 17,206,252,126, 16, 67,198,142, 51,233,126, 90, 54,127,216,238,101,243,135, 85, 24,158,161,140, 32,
-130,234,117,211, 72, 63,240, 61,255,255,156,149,119,168, 93,187,118,253,230,167,159,126,146,149, 80, 60,120,128,224,224,151, 6,
-192,185,115,231,162, 75,151, 46,240,242,242, 66, 84, 84, 20,220,220,220,176,127,255,126,240,120, 60,193,200,145, 35,167, 1,224,
- 4, 22, 7, 14, 28,254, 86, 84,184,100,141, 97, 89,134,206,202, 2,171,211, 21, 91, 8, 88,150,101,101,127, 10, 27,129,204,202,
-202,138, 8,156,157, 65, 36,146, 98,249,249,218, 30,218,124, 62,191, 90, 2,139,166,193, 3, 49,128, 5, 11,128, 2, 1,133, 66,
-169, 8,115, 28, 67,200, 12,197, 52, 94,154,204,154, 16, 30, 5, 66, 17,128, 0,172,129, 1,205,210,213, 85, 70,108,126,126, 62,
-180, 90,173,181,167,167,231, 17,141, 70, 99, 93,244, 96, 99,223,214,133,163,105, 58,150,162, 40,124,242,201, 39,192,203,148, 71,
-208,233,116,136,142,142,134, 70,163,129, 78,167, 67, 84, 84, 20,114,115,115,161,211,233, 16, 30, 30, 14, 55, 55, 55,240,249,124,
- 69,101,188, 70,163, 17,246,246,246, 80, 40, 20,208, 22,228,202,127,253,105,101,143, 37,115,103,216, 13,240,100,169,205,171,190,
-103,234,213,171,151, 93,191,126,125, 59,169, 84,154,213,176, 97,195,140,221,187,119, 31,168, 78,136, 6, 0,191,207,152, 49,163,
- 89,187,118,237,188,172,204,165, 6,185, 4,144,241, 10, 32, 98,213, 16, 24, 83,224, 85,167, 46, 67,100, 50,239,254,253,251,107,
- 1,252,110, 42,231,228,201,147, 61,253,253,253, 21,214, 22,226, 2,169,144, 36, 75,120,116, 82,118,212,157,107, 0, 32,182,178,
- 81, 67, 44,245, 31, 50,100,136,186, 58,156, 83,167, 78,245,173, 93,187,182,147,144,207, 22, 18,218,248,167,164,208,106, 82,120,
- 2, 97, 33,132,194,128,137, 19, 39,234,171,195,249,213, 87, 95,249, 52,106,212,200,209,222, 82, 82, 32, 21, 64, 37,229,209, 42,
-129, 78, 27, 47, 52,234, 82, 36,214,214,133,144,202, 26, 15, 30, 60, 88, 87, 17,103,177,245,170,172,101,136,207,231, 67,165, 82,
- 33,243,217, 21,100, 62,187,139,122, 84, 30,154, 57,218,195,204,204,172,234,251,201,247, 1,137,122,202,146,168,167, 44,129,239,
- 3, 82,222,247,114, 68, 86,165,109,191, 82,191,174, 7,190,231,107,194,121,244,232,209,197,189,122,245, 50,244,235,215, 15,167,
- 78,157, 2, 33, 4,151, 46, 93, 66, 98, 98, 34,186,116,233, 2,150,101,113,235,214, 45,232,245,122, 60,120,240, 0,189,123,247,
- 70, 72, 72, 72,225,241,227,199,191,227,186,122, 14, 28, 56,188, 45,129,213,142, 16,194, 2, 40,113,212, 48,136,197,247,153,241,
-227, 97,249,219,111, 16,196,196,160,247, 71, 31, 89,136,197,226, 85, 10,133, 34, 80,169, 84,182,146, 74,165,107, 38, 79,158,108,
-110, 27, 26, 10,229,133, 11, 72, 58,117, 10, 6,129,224,102,117, 14,174, 86,171,139,173, 49,208, 21, 9, 57, 43, 43, 43, 48, 12,
- 3, 83,181, 11, 75,227,106, 82, 90, 12, 68,112, 7, 11,228, 29,203,235,112,117, 64,236, 60,199,211,121,245,234,197,228, 10, 60,
-151, 56, 52,179,219, 88,187,229, 77, 53, 17,228, 11, 45, 68, 80,169, 84, 96,193, 92,173, 78, 57, 53, 26, 77, 78, 65, 65, 1,241,
-244,244,180,139,136,136,240,172, 91,183,174, 45, 0,162,213,106,111,188, 78,229, 43,149,202, 22, 1, 1, 1,123, 3, 3, 3,159,
- 6, 4, 4,236, 85, 42,149, 45,170,241,247,205,145,145,145,224,241,120, 24, 57,114, 36,242,242,242,160,211,233, 16, 31, 31,143,
- 23, 47, 94, 64,167,211,225,254,253,251,120,248,240, 33,116, 58, 29,110,221,186, 5,173, 86,107,138,112,131,185,185, 57,178, 51,
- 82,229,123,214,125,223,227,187,185,179,164, 57,143, 35,144,160, 74, 1, 67,171, 85,179,102,205,138,245,244,244,188,164,213,106,
-125,140, 70, 99,119,150,101,247, 84,195,252, 75, 1,184,229,237,237,221,110,217,178,101,173,230, 45,222, 46,178, 52,203,133,216,
-202, 6, 34,107, 25, 68,110, 65, 24, 50,101, 57,127,195,134,181,119, 46, 93,186,148,102,226,202, 60, 10,192,173, 38, 77,154,180,
- 74, 78, 78,110, 27, 16, 16, 16,228, 92,187,182, 92,238,164,200, 18, 59, 41,211, 25,173,230, 26,156,156,219,108,219,182,237,198,
-217,179,103,147,170,195,233,230,230,214,102,237,218,181,205,220,221,221,155,201, 44, 44,204, 52,121,121, 59,140,133,133, 97, 60,
- 51, 51, 17,164,242,206,199,143, 31,191,180,123,247,238,228,234,112,250,250,250,182, 14, 13, 13,109, 18, 24, 24,216,204,197,195,
-195, 76,234,224,148, 33, 87,186,164, 74,189,252,132,112,114,233,180,109,219,182, 43,231,206,157, 75, 50, 53,224, 40, 69, 81,224,
-243,249, 48, 51, 51,195,249,243,231, 17,210,218, 27, 10, 42, 19, 13,221, 21,232, 54,236, 83,156, 60,121, 18, 2,129, 0,175,107,
-109, 45, 11, 83, 4, 81,117,197, 87, 85,156, 42,149,106,109,120,120,248, 15,125,251,246, 69,167, 78,157,112,251,246,109, 76,157,
- 58, 53,246,220,185,115, 0,128,219,183,111, 99,193,130, 5,177, 87,175, 94,197,176, 97,195, 16, 28, 28,140, 91,183,110,109,227,
-130,143,114,224,240,143,193,255,105,145,127,188,192, 98, 89,246,124,233,119, 79, 27, 27,115,141,166, 48,225,252,249,243,122,138,
-162, 32,149, 74,209,167, 95, 63,106,225,119,223,181,254,160, 81,163, 51,131, 90,182, 60,182,103,207,158,128,128,128,128,146, 78,
-254,208,161, 67,234,156,156,236, 12, 87, 87, 87, 43, 83, 15,158,158,158, 14,224,229, 20, 92, 65, 65, 1, 88,150, 45, 25,113,155,
-234,131, 85,144, 75,157,186,116,254,126, 54, 75,143,125,209, 57,102,181, 97, 81,210,199, 45,242, 24,150,159,207, 24,144, 83,200,
- 34, 79,203,242,175,179, 86, 77, 70,121,133, 24, 98,219, 53,125,116,245, 89, 68,166,154,213,157,170, 78, 37,101,101,101,205, 28,
- 59,118,108,186,163,163, 35, 49, 55, 55,135,163,163, 35, 53, 98,196,136,180,248,248,248,249, 53,173,120, 63, 63,191,254, 45, 91,
-182, 60, 20, 25, 25,217,123,239,222,189,238, 97, 97, 97,125, 90,182,108,121,200,207,207,175,191,137, 20,123,151, 45, 91, 86, 32,
- 18,137,208,188,121,243, 18,129, 85,217,171,120, 58,182, 50, 48, 12, 3,137, 68,130,176, 77, 43, 59,127, 55,119,150, 52,227,193,
- 85,220,185,116, 10,199,159,105, 11,103, 47,250,225,154, 68, 34,169,217,249, 58,200, 27, 52,247,114,122,248,205,248,225,177,179,
-102,205,146,223,185,115, 71, 54,113,194,120, 54, 41, 57, 7,226,122, 63,128,170, 61, 27, 15,147,237,208,173,123, 27,118,198,148,
-207,155, 0,152, 80, 29,206, 9, 19, 38,200, 22, 47, 94, 92, 24, 28, 28,156,147,155,155, 43,145, 91,219,250, 11, 45,173, 27, 38,
-103,102,137,218,180,105,115,123,248,240,225,153, 12,195,140,175,110, 57, 47, 95,190, 44,238,222,189,123, 65, 94, 94,158, 76, 32,
-149, 6, 80, 18, 73, 96, 78,126,161,168,255,128, 1,145, 61,122,244,200, 99, 24,102, 66,117, 57, 31, 61,122, 36, 14, 14, 14,206,
-207,205,205,149,153,219,217, 55,230, 91,217, 4,168, 50, 50, 69,193,173, 91,223, 26, 62,124,120,110,101,231,222,103,210,159,226,
- 68, 42,149,102,248,250,250, 98,230,204,153,152, 61,123, 54,250,244,233,131,196,196, 68,116, 29, 56, 8,141,134,140,192,217,123,
- 81, 72, 74, 74,194,215, 95,127, 13, 47, 47, 47, 80, 20,149,244,119,137,172,138, 28,225,253,234,144,243,149,249, 89, 85, 37,178,
- 58,119,238, 60,172, 87,175, 94,248,237,183,223, 74, 28,218,251,245,235, 7,161, 80,136,198,141, 27,227,203, 47,191,244, 88,182,
-108, 89,236,242,229,203,209,162, 69, 11,184,184,184,188,207, 61,179, 56,112,248,103,160,172, 22,249,167,131, 95,234,196, 74, 58,
- 61,214, 66,218,239,167,181,107, 44,199, 77,250,178,192,207,207,207,218,209,209, 17, 20, 69,161,107,183,110,164,197,137, 19,230,
- 2,133, 2,182, 13, 26,128,101, 89, 48, 12,131,139, 23, 46,224,204,153, 51, 5, 59,126,222,236, 60,252,179,207,122, 2,216, 86,
- 73, 5,178, 69, 35,122,164,165,165,193,201,201, 9, 60, 30, 15, 18,137, 4, 42,149, 10, 78, 78, 78, 16, 10,133,224,241,120,252,
-162,212, 47,149, 78, 59, 58, 57, 57,109, 15, 93, 16, 53, 61,190,225, 87,117,130,101, 20, 57, 86,144, 12, 10, 4, 70,150, 1,165,
-102,193, 48, 44,180, 6,160,190, 51,207,250,180, 22, 86, 55,238,159,122,234,228,228,180,189, 58,149, 20, 27, 27,123, 86,161, 80,
-140, 46, 40, 40,216, 7,128,186,118,237, 26,243,236,217,179,207, 77,117, 72, 47, 15, 82,169,116, 74, 88, 88,152,205,252,249,243,
-179,206,156, 57,147,211,161, 67, 7,203,208,208, 80,219,254,253,251, 79,129, 9,209,225, 85, 42,149, 90,169, 84,110, 75, 73, 73,
-249,188, 73,147, 38,200,204,204,132, 78,167, 67,100,100, 36,234,214,173,139,240,240,112,120,123,123,227,198,141, 27,240,241,241,
- 1, 77,211,208,104, 52,160, 77, 8,180,165,138,127,110, 38,211,102, 89,168,174, 31,197,163, 59,225, 56, 26,171, 45, 92,250,243,
-158,163, 13, 26, 7, 21,152, 42,124, 75,195,219, 81, 94, 95,105,111,123, 98,249,178, 69,230,137,215,143, 97,239,134,229,236, 31,
-135, 15, 7,138, 45,240, 73,139,247,198,245, 49,232, 81,139, 97, 33, 12, 14,110,137,158,129,247,137, 64,139,172, 63,194, 43,143,
-100, 94, 30,231,190,237,187, 2, 52, 64,253, 58,117,234,244,228,241,120,246, 0,244, 52, 77, 71,193,196, 20, 52, 21,149, 83, 3,
-212, 87, 40, 20, 61, 37, 18,137, 51, 33, 68,173, 86,171, 99,222, 4,167,135,135, 71, 79, 30,143,167, 4, 80, 72,211,116, 52,170,
-153, 42,167, 83,167, 78, 75, 55,111,222, 60, 89,171,213,218,150,178,182,146, 99,199,142, 65,167,211, 65, 36, 18,177,114,185, 28,
-241,241,241, 44,128, 36,150,101, 71,191,169,142,227,227,143, 63,198,181,107,215,230, 2,152, 93,217,126,153,153,153,124, 27, 27,
- 27, 99, 85,194,203, 84,206,235,215,175, 47, 30, 49, 98,196,148,227,199,143, 39,204,153, 51,167,241,208,161, 67,113,240,224, 65,
-184,186,186,226,209,163, 71,152, 60,121, 50, 8, 33, 30,203,150, 45,187,181,123,247,110, 69,114,114,242,247,220, 99,139, 3,135,
-127,148,200, 34,255,150,115, 41,215,201,157, 48, 68,224, 85,183, 46,173, 43,204,223,242,217,176, 97,163, 67,151, 44,145,249,249,
-249,193,104, 52, 66,115,227, 6,116, 18, 9, 44,191,253, 22, 20, 69,225,250,181,107,152, 48,126,124,190,166, 48,127, 83,237,218,
-238,254,132,101,229, 37, 60,229,100,219,214, 21,207, 5,226,229, 20,161, 90,173,134, 80, 40,132,153,153, 25,210,210,210, 32, 18,
-137, 32,149, 74,209,168, 81, 35, 42, 55, 55, 55, 4,192,111,175,148,173, 12,103, 68, 68,132,193,217,217,185,247,111, 67, 38, 30,
-237,188,109,133,211, 72,171,218,228,146, 58, 3,105,180, 22, 44, 0,123,115, 10, 94, 78, 20, 12, 5,169,236,221, 45, 3,146,136,
- 49,167,119, 68, 68,162,161, 50,206,178, 80, 42,149,245,234,215,175,191,166, 75,151, 46, 20, 0,180,110,221,154,146,203,229, 63,
- 42,149,202, 40,149, 74, 85,174, 51,114, 85,156, 18,137, 68, 12, 0,167, 78,157,202,188,124,249,114, 8, 77,211,135, 7, 12, 24,
- 96, 93,252,187, 41,156, 20, 69,253,180, 97,195,134,207,151, 46, 93,138,212,212, 84,232,116, 58,104,181,218,114,173, 87, 78, 78,
- 78, 56,125,250, 52, 24,134, 57, 82, 85, 57,125,253, 27,230,111,227, 91,165,108, 61,244,135, 99, 38, 35,201, 95,250,243,158,227,
-213, 17, 87,165, 57,235, 43,204,188,157,237,109, 79,124,191,116,145,121,198,131,171,120,124, 55, 28, 71,175, 39,222, 82,179,108,
- 34,128,133, 69, 47,180, 15, 36,113, 39,246, 77,183, 71,108, 8,142, 95, 1,251, 26,156,137, 0,142,191,225,114,190, 51,156, 97,
- 43,125, 74,210,203,204,154, 53,235,198,172, 89,179,250, 86,248,199, 7,190,231,225,123,151,212,164,125, 86,114, 47, 64, 85,228,
-225,174, 82,169,230, 0,152, 83, 46,167,239, 3,178,166, 39, 97, 1, 84,185,146,208,100, 78, 0, 69,233,111,214,244,232,209,227,
-121,113, 40,134,125,251,246, 97,254,252,249,216,181,107, 23,178,178,178,208,178,101, 75,184,184,184, 56, 92,191,126,189,206,155,
- 60,119, 83,175, 17,199,201,113,114,156, 28,128, 10,156,220, 9, 97,104,154,102,224,224,232, 96,158,150,154,186,122,236,216, 49,
- 25,243,230,205,211,156, 63,127, 30,186,135, 15,161,137,140,196,233,211,167, 49,113,226,196,194, 81,163, 71, 39,105, 10,243, 87,
- 58, 57, 58,216,209, 52, 3, 66,152, 74, 45, 36, 20, 69,197,198,196,196, 0, 0,180, 90, 45,126,252,241, 71,131, 94,175,135,133,
-133, 5, 88,150,197,198,141, 27, 25, 0,232,216,177,163, 92, 32, 16,152,148,130, 36, 49, 49,241, 78,110,188,170,243,175,253,199,
-196, 62,216,253,123,110,131, 12, 29,250, 74, 20,248,160, 1,139, 58,146,231,120,113,245,231,156,171,235, 63,138, 45,204,138,239,
-146,152,152,120,167,186,149,228,228,228,244,237,206,157, 59, 29, 34, 34, 34, 88,173, 86,139,196,196, 68,118,202,148, 41, 14, 78,
- 78, 78,223,190, 78,251,204,206,206, 6, 69, 81, 76, 81,189, 20,175,165, 55, 89,189, 39, 36, 36,220,219,183,111,223,111,103,207,
-158,133,139,139, 11,104,154, 46, 17, 88,165,223,249,124, 62, 8, 33, 88,191,126,125, 54, 33,100, 70, 85,188, 34,145, 8, 27,246,
- 30, 61,246,213,186,253,123,247,158,190,177,191,166,150, 43, 0,144,153, 91,204,255,126,233, 34,203,226,169,198,157, 17,170, 92,
- 66,179,229, 79,213,233, 19, 95,182, 17, 2,246,141,113,254, 21,229,124,139,156,111, 19, 69, 66,136, 40,149, 74,252,250,235,175,
-213,246,193,242,171, 67,254,207,185,189,166,156,247,238,221, 91,212,183,111,223,148, 57,115,230,172,213,104, 52, 5, 69,131, 55,
-253,247,223,127,191,108,220,184,113, 41,137,137,137,156,229,138, 3, 7, 14,239,158, 5,139,225, 81,151,215,111, 88,215,109,207,
-174,221, 78, 60, 30,229,244,244,233,179,155,159,124,250,105,226,133, 11, 23,108, 4,117,235, 54,165, 40,138,209, 77,159,126, 53,
- 63, 55, 39,115,251,150,159,221,106,215,118,111, 84,148,236,153,101,120,212,229,202, 14,152,153,153,185,117,210,164, 73, 77,183,
-109,219, 38, 92,186,116,105, 65, 98, 98,226,201,235,215,175,119, 91,187,118,173,100,227,198,141,133, 57, 57, 57,135,142, 30, 61,
-218,171,125,251,246, 70,157, 78,103,114,124,161,148,148,148, 40, 66,136, 15,181,124,227,192,232, 13, 59, 58,179, 60,170, 37, 52,
- 66, 16,150,190, 66, 25,243, 79,166,170, 84, 59, 89,150, 53,214,164,146, 36, 18, 73, 35,169, 84,138,199,143, 31,103, 53,109,218,
- 84, 39, 18,137, 4,238,238,238,182, 18,137,164,209,107,152, 65,217,172,172, 44,176, 44,203, 7, 64,104,154,230, 3, 0, 83, 85,
-208,162, 50, 16, 10,133,253,135, 15, 31,254,219,218,181,107, 59,119,236,216, 17, 30, 30, 30, 48, 24, 12,240,246,246,134, 78,167,
-131,151,151, 23, 52, 26, 13,126,248,225, 7,228,231,231, 79, 78, 76, 76,204,170,140,143, 97, 24,136,197, 98,136, 68, 34,120,251,
-250, 23, 74, 36, 18,212, 84, 92, 1,128, 92,132, 58,241,215,142,224,241,221, 8,236,137, 76,202, 46,208, 51, 93, 31,165, 22,220,
- 47,187, 95,161, 14, 5,237,187,142,121, 41,188, 13,200,127, 19,156,127, 69, 57,223, 54,103,159, 73, 15,209,238, 67,211,247, 13,
- 59,253,102, 58, 10,149, 74, 85,237, 70, 16,245,148, 37,120,224,203,226,193,234,114, 99, 92,213,132,179, 24, 69,233,111,214, 3,
-128,139,139,203,147, 9, 19, 38, 76, 73, 76, 76, 92, 81, 20,239,106, 54,215,181,115,224,192,225,157, 20, 88,177,177,241, 81, 30,
- 30,181,190,222,255,235,190, 86, 44, 75,241, 88, 66, 10, 0,234,247,251,247,239,103,151,222,207,211,198,198,124,248,136,225,253,
- 8, 67, 4,132, 48, 52,195,163, 46,199,198,198, 71, 85, 97,109,186, 59,100,200,144,213,237,219,183,255,148,166,233, 37, 49, 49,
- 49, 39,189,189,189,111,117,237,218,245, 43,163,209,184,236,201,147, 39, 39,125,124,124, 78,237,217,179,103, 42, 77,211,213,178,
- 16, 21, 9,168,109,168,196, 7,172,134,152, 7,192, 82, 44, 22,231,132,135,135,239, 14, 14, 14,238, 79, 8,177, 4,144, 83, 83,
- 66,173, 86, 59, 33, 47, 47,207,174, 95,191,126, 6, 0,222, 31,126,248,225,140,152,152, 24, 65, 65, 65, 65,108,117,120,226,226,
-226,180,238,238,238,189,198,142, 29,187, 73, 40, 20,118, 44,178,128,177,165,234, 4, 44,203,130,166,233, 67, 42,149,170,210,122,
- 17, 8, 4,249, 61,122,244, 48, 51,193,194,149,111,106,249,146,211,243, 38, 44,216,122, 52, 84,107, 96, 24, 35,195,142,126,148,
- 82, 80,238, 18,178, 27,247,217,250,111,154,179, 58,248,167,112, 2,192,152,214,171,119,224,193,234, 18,135,247,226,208, 13,101,
-191,255, 85, 40,178, 56,177, 0,230, 86,185,115,145,197,170,170,220,133,213,226, 44,131,162, 85,130,220, 74, 65, 14, 28, 56,188,
- 83, 32,127,101, 40, 39,110,126,154,227,228, 56, 57, 78,142,147,227,228, 56, 57,206,255, 34, 40,174, 10, 56,112,224,192,129, 3,
- 7, 14, 28,222, 44, 8, 0,255,242, 54, 84, 71,153, 18, 66,252,171,123,224,170,248, 57, 78,142,147,227,228, 56, 57, 78,142,147,
-227,252,247,113, 86,197,253,111,177,140,113, 83,132, 28, 39,199,201,113,114,156, 28, 39,199,201,113,190,117,206,127, 27,184, 41,
- 66, 14, 28, 56,112,224,192,129, 3, 7, 78, 96,189,125, 16, 66, 62, 33,132, 28, 39,132,220, 35,132,156, 32,132,124,242, 26, 92,
- 82, 66,200,244, 82,124,199, 8, 33, 83, 9, 33, 98,174,166,223,233, 54,192,227,106,129,195,187, 4,165, 82, 89,207,207,207, 47,
- 66,169, 84,214,227,106,131, 3,135,183, 15,126, 69, 27, 60, 61, 61,175, 80, 20, 85,135,162,168,226, 7, 74,233,135, 75,185,239,
- 44,203, 62,141,138,138,106, 89, 17,103,157, 58,117, 74, 56, 41,138, 2, 33, 4, 20, 69,193, 96, 48,152,243,120,188,188,242, 56,
-105,154, 78,120,244,232, 81,208, 59,244, 96,221, 97,109,109,109, 88,187,118,237,154,128,128,128,186,153,153,153, 5, 35, 71,142,
-236, 66, 8,233,196,178,236,224,106,114,249, 19, 66,182, 55,105,210,100,255,184,113,227,194,252,252,252,204, 11, 10, 10,196,123,
-246,236,113, 90,191,126,253, 69, 66,200,112,150,101,163,184,102,250,238, 64,161, 80, 4, 16, 66, 86,123,121,121, 5, 41,149,202,
-155, 0, 62, 87,169, 84,183,185,154,249, 91,239,193,207, 68, 34, 81, 87, 47, 47,175,166, 90,173, 54,235,233,211,167, 55,104,154,
-254,150,101,217,228, 55,196,111, 9,224, 91,177, 88,220,204,211,211,179, 86, 76, 76, 76,188, 94,175,191, 14, 96, 30,203,178, 57,
-239,170,184,106,214,172,217,165,133, 11, 23,218,206,152, 49,227,146, 82,169, 12,174, 40,203, 4, 7, 14,165,225,234,234,106, 85,
- 80, 80,176,137,162,168, 0,137, 68,226,100,110,110, 14, 51, 51,179,100,177, 88,124, 75, 38,147,125,122,228,200,145,108,174,150,
-222,176,192,226,241,120, 46, 55,110,220,112, 48, 55, 55, 7, 77,211, 96, 24, 6, 12,195,148,228, 31, 44,237,187, 85, 20,103, 9,
-237,219,183,175, 52,155, 48,159,207,175, 21, 17, 17,225, 96,102,246,103,168, 37,189, 94,143,134, 13, 27, 50,145,145,145, 14,101,
- 19, 9,235,116, 58, 4, 6, 6,178,239, 74,101, 17, 66, 6,217,218,218,234,158, 63,127,209, 66,163,213,183, 28, 59,101,254,183,
-253,222,111,107,121,245,234, 85,170,103,207,158, 2, 66,200, 39, 44,203,110, 55,145, 75, 74, 8,217, 60,115,230,204, 69,124,161,
-204, 97,223,209, 43,252, 31, 55,236,140,247,247,173, 77, 38,141, 31, 43,155, 48, 97,194, 13, 31, 31,159,159, 9, 33,173, 89,150,
-213,114, 77,245,157,184,254,252, 90,181,106,253, 22, 26, 26,234,156,156,148,132,229, 43, 86, 52, 7,176, 22, 64,115,174,118,254,
-182,107, 48,125,238,220,185,161, 3, 7, 14,132,209,104,132, 90,173, 86, 62,121,242,164,254,204,153, 51, 63, 36,132, 52,101, 89,
- 54,246, 53,249,237,189,188,188, 30, 78,154, 52,201,166,105,211,166,160, 40, 10,217,217,217,202, 75,151, 46, 53,223,188,121,243,
- 39,132, 16, 31,150,101,211, 94,131,159,178,181,181,157, 0,160, 61,195, 48, 98, 0,215,179,178,178, 22,176, 44,171,127,157,114,
- 91, 91, 91,255,178,108,217, 50, 91,177, 88,140, 45, 91,182,216,246,237,219,247,162, 82,169,108,205,137, 44, 14,149,193,206,206,
-238,179,188,188,188, 53, 50,153, 76,104,101,101, 5,169, 84, 10,161, 80, 8,145, 72,228,106,109,109,237,106,102,102,214,125,192,
-128, 1,159,239,218,181,107, 19, 87, 91,111, 80, 96, 81, 20, 5,169, 84,138, 61,123,246,128,199,227, 65, 40, 20, 66, 32, 16, 64,
- 32, 16,188,242,185,248,123,173, 90,181, 76,233, 92, 0, 0,135, 14, 29,130,165,165, 37, 44, 44, 44,224,235,235, 11, 66, 8,196,
- 98, 49, 78,159, 62,253, 10,111, 80, 80,208,107, 69, 17,175, 9,250,116, 34, 44, 80,126,240,198, 30,109,204,208,115,224,194,143,
- 11,181,134, 54, 44, 75,212,201, 89,134,204,121, 75,215, 68, 53,174,239, 75,246,238,221, 27,104,103,103, 55, 0,128,169,137,164,
- 39, 54,109,218,244,144, 17, 34,199,225, 67,135, 13, 29, 70, 17,227, 71,195,190,156,123, 41,242, 73,214, 38,191,128,157,105,105,
- 9,163,127,252,241,199,232,177, 99,199, 78, 0,176,196,212,242, 55,105,210,228, 5,195, 48,181,138, 68,114,186, 84, 42, 85,156,
- 59,119,206,248,182, 27, 26, 33, 68, 9, 96, 41, 0, 3,128,197, 44,203, 62, 44,181,173,158, 80, 40, 92,162,215,235, 51, 1,204,
-102, 89, 54,254, 93,188, 89,156,157,157,125, 6, 15, 30,108,151,145,150,134,229, 43, 86, 20,255, 28,100, 74, 82,242, 55,141,192,
-192,192, 58, 18,137,100, 41,128, 0,173, 86,235, 12, 0, 82,169, 52,145,101,217, 3,106,181,250,155,136,136, 8,117, 13,175, 83,
- 45, 0,245, 81,113,202, 38,118,201,146, 37,209, 83,166, 76,121,250,119,115, 18, 66,220, 29, 29, 29, 23,246,233,211, 7, 71,142,
- 28,193,209,163, 71, 13, 18,137,132, 63,116,232, 80,242,249,231,159, 91, 79,154, 52,169, 59,128, 31, 94,179,106,187,207,157, 59,
-215,198,215,215, 23,251,246,237,195,237,219,183,213,245,234,213,147,182,109,219, 22, 60, 30,207,230,155,111,190,233, 6, 96,107,
- 53,235, 84, 12, 96, 2,128,246, 60, 30,175,245,208,161, 67,141,227,199,143, 23, 80, 20,101, 88,185,114,165,253,166, 77,155,250,
-217,217,217, 5,164,167,167,231,215,180,208, 89, 89, 89, 11,230,207,159,191,109,245,234,213,230,177,177,177,152, 59,119,174,221,
-184,113,227,206, 43,149,202,182,156,200,170, 24, 60, 30, 79,207, 48,140, 0,128,132,101, 89,109, 85,223,255, 77,231,110,107,107,
- 59, 38, 43, 43,107,173, 82,169,132,189,189,125,201,179,150, 97, 24, 20, 20, 20, 64,173, 86,163, 78,157, 58, 66, 95, 95,223,141,
-227,198,141, 19,172, 94,189,122, 29,215, 98,170, 41,176, 8, 33,109, 89,150, 61, 95,170, 51,104,203,178,236,121, 66, 8, 24,134,
-129, 64, 32, 0,143,199, 3,159,207, 47, 17, 62,165, 63, 23,191,202, 19, 66,101, 87, 24, 80, 20, 69,242,242,242, 74,196,149,165,
-165,101,137, 37,204, 96, 48,252, 31, 39, 77,211,160, 40,138,173,140,243, 77,160, 52,103,216, 74, 31,108, 13,159,210,127,107,248,
-203,239,221, 6,190,124,223, 26, 14,156,190, 62,122,233,146,117,173,106, 77, 92,176, 37, 52, 35, 35, 59,213,207,197,222, 56, 96,
- 96, 91, 55, 81,122, 74,186,109,237,218, 33, 0, 82,171, 81,206,224,209,163, 71,239,219,119,246,177, 92, 44, 22,137,120, 20,120,
-245, 60,234, 8,156, 45,234,218,216,119,105, 42,138,139,141,189,248,201, 39,159,140, 30, 59,118,172,109,177,192, 50,229,220, 89,
-150, 85,156, 60,121, 18,124, 62, 31,157, 58,117,178, 46, 18,209, 70, 83,206,253,175,168,207, 82,152,153,146,146,210, 95,163,209,
- 32, 40, 40,232,125, 66, 72,123,150,101,111, 17, 66, 26,244,234,213,235, 98, 88, 88,152,121,100,100, 36,154, 55,111, 46, 5,208,
-247, 45,150,243,255,160, 84, 42, 79, 2,120,143,199,227, 65,167,209,232,150,126,255, 74,154,187,240,210,226,234,239, 40,103,227,
-198,141,125,100, 50,217,149,239,191,255,222,194,207,207,143, 8, 4, 2, 24,141, 70,196,196,196,212,218,177, 99,199,168,155, 55,
-111,118, 11, 12, 12,244,139,136,136, 48,212,224,220,235, 95,188,120,177,192,195,195,163, 92,193, 88, 88, 88,200,243,240,240,104,
- 7,224,233, 91,224, 76, 72, 73, 73,249,224,189,247,222, 27,157,156,156,252,208,104, 52, 78, 3,224,111,103,103, 23,249,241,199,
- 31, 67, 42,149,182, 55, 69, 96, 85,118,141, 28, 28, 28,122,181,108,217, 18,171, 87,175,198,226,197,139, 59,177, 44,251, 7, 33,
-164, 99,110,110,238,233,247,223,127, 31, 86, 86, 86, 31,148, 39,176, 42,226, 36,132,248,137,197,226,173,187,118,237, 50,243,240,
-240,240, 16, 10,133,148,135,135, 7, 50, 51, 51,161,209,104,196, 11, 22, 44,104, 32,145, 72,110,255,240,195, 15, 91, 1,124, 84,
-195,246, 89,175,105,211,166, 27, 39, 79,158,108,126,248,240, 97,120,121,121, 33, 55, 55, 23,195,135, 15,119, 88,181,106,213, 57,
-165, 82,217,174, 88,100,253,221,247, 17, 33, 36, 7,128, 5, 0,171,234, 76,175, 86, 82,159, 57, 0, 74,252, 83, 5, 2, 1,196,
- 98, 49, 36, 18, 9, 36, 18, 9,158, 62,125,250, 43,143,199, 27, 86, 52,144,171,146,147,252,249,224,106, 68, 8,185,193,227,241,
- 42,253,206,178, 44,243,182,251, 37, 66,136, 11, 33,100, 37,128,246,120,233, 71,125,222,193,193, 97, 98,114,114,242,115, 83, 57,
-149, 74,165,109,126,126,254, 15, 74,165, 18, 14, 14, 14,197, 98, 19, 65, 65, 65,208,104, 52,184,127,255, 62, 24,134,193,147, 39,
- 79, 96, 97, 97,129, 6, 13, 26,252, 48,119,238,220,125,179,103,207,206,248,171,206,189, 34, 45,242, 79,183, 96,157, 43,106,103,
-197, 39,115,174,120,164, 73,211,116,137,192, 42, 43,126,202, 10, 46, 66, 8, 88,150, 37, 85, 84, 32,165,211,233, 74,196,149,133,
-133, 69,137, 56, 51, 26,141,229, 10,172,154,194,218,218,250, 68,118,118,246, 10,150,101, 79,214,228,255, 67,135, 14,253, 63,127,
-142,233,211,167,199,167,165,165,209,189,130,235,137,183,111, 63,146,241, 73, 72, 59, 39, 63, 79, 23,111,185,173, 67,163,194,194,
-194,155, 0, 4,213, 49,136,248,249,249,153,175,219,117, 62,117,224,132,165,243, 92, 28,205,232, 38, 94,142, 22,158, 54,114,145,
-173,132,111,180, 98,141,217, 50,153,172, 62,128,140,234,150,221,210,210, 18,135, 14, 29,122,215,218,154,181, 90,173, 70, 86, 86,
- 22,214,175, 95,111, 49,122,244,232,179,132,144,137,189,122,245, 90,189,111,223, 62,121,118,118, 54,244,122, 61, 0,168,223,193,
-251,100,190,181,181,117,155,246,237,219,139,118,239,221, 43, 98, 89,182, 0, 47,211, 17,229,179, 44, 59,238,239, 46,140, 68, 34,
-249,106,193,130, 5, 22,126,126,126, 36, 61, 61, 29, 44,203,130,162, 40,216,217,217, 97,202,148, 41,146,111,190,249,198, 57, 58,
- 58,250,107,212, 32,237, 12, 0, 82,145, 16, 2, 0,153, 76, 70,163,250,139, 99,202,229, 52, 26,141,164, 85,171, 86, 83,210,211,
-211, 27,168,213,234,239, 76,120,240, 24, 1, 28, 42,122, 21,247, 41,183, 31, 62,124,168,230,243,249,210,218,181,107, 55,123,221,
-186,173, 87,175, 94, 11,129, 64,128,235,215,175,107, 1, 20,119,238,231,239,220,185,163,253,232,163,143,196,181,106,213,106, 81,
- 29,203,149, 88, 44,222,250,248,241, 99,111,133, 66, 33,189,118,237, 26, 26, 54,108,136,244,244,116, 36, 39, 39, 35, 63, 63, 31,
-201,201,201,248,244,211, 79, 29,150, 47, 95,174, 48, 85, 76,121,122,122,158,178,179,179,147, 22,167,193,234,209,163,135, 96,201,
-146, 37,230, 9, 9, 9, 48, 26,141,152, 49, 99, 6, 66, 66, 66, 96,109,109,141, 97,195,134, 57,110,220,184,241, 23, 0,129,111,
-249, 30,202, 22, 8, 4,144,203,229, 86,217,217,217, 57,175,193, 35, 6, 32, 2, 0, 62,159, 95, 34,174,196, 98, 49,196,226,127,
-255,186, 32, 66,136, 51, 33, 36, 74, 32, 16,136,229,114,185,144,162, 40,200,229,242, 46, 46, 46, 46,247, 63,249,228, 19,255,237,
-219,183,199,153,194,163,209,104,182, 75,165, 82,129,189,189, 61, 0,160,115,231,206, 24, 58,116, 40,210,210,210, 24,149, 74, 5,
-111,111,111,234,252,249,243, 72, 73, 73,193,237,219,183,209,164, 73, 19,129,141,141,205,118, 0,221,254,194,211,171, 80,139,252,
-147, 5,214, 43, 39, 87,122, 35,195, 48,175,136,171,242, 44, 87,165, 45, 88, 85, 77,231, 17, 66, 64,211, 52,156,156,156, 32,147,
-201, 32,147,201, 74,182, 21,139,185,210, 47,150,101,107, 60, 69, 88,183,110,221, 14, 50,153,172, 53, 33,228,125,150,101, 77, 78,
-121,219,103,210,195, 18,171, 85, 89, 52,106,212,232,202,140, 25, 51,186,158, 57,115, 38,171, 69,195, 58,140, 88, 21,159, 33,179,
-182,107, 72,236, 29, 58,141, 29, 49,242, 42,128, 93,213, 40,162, 74,163,209,136,221,157, 40,181, 42, 39, 87, 87,199,194,210,170,
-142,165,153,204,221,206,210,214, 90, 34,162,228,142, 14, 74,131,193,144, 13, 64, 85, 21, 81,233,105, 65,137, 68,162, 35,132,240,
-173,172,172, 96,105,105,169,207,202,202,210, 4, 6, 6, 66, 36, 18,165, 11,133, 66,147,167, 11,155, 54,109,154, 66,211,180, 67,
-101,251, 8,133,194,212,171, 87,175, 58,154,120,190,223, 52,106,212,168,237,218,181,107,237,189,188,188,176,126,253,122,139,125,
-251,246,109,253,229,151, 95,144,157,157,141,103,207,158, 97,248,240,225,185,120, 57,141,248, 78,193,198,198,230, 82,239,222,189,
-177,105,211, 38,182,104, 16, 33, 39,132, 52,180,180,180,124, 20, 21, 21,165,255,187,203, 67, 81, 84, 23,111,111,111,146,147,147,
- 3,150,101,193,227,241, 94,121, 77,153, 50, 69,250,233,167,159,206,108,209,162,197, 20,129, 64,144,107, 52, 26,119,231,231,231,
-127,119,239,222,189,119,202, 89,181,117,235,214, 95,196,199,199,135,184,185,185,253,254, 26,163,125,182, 73,147, 38, 58,150,101,
-165, 60, 30, 79,240,186,101, 42, 94, 29, 74,211,180,166, 56, 57, 60,203,178,198,192,192, 64, 77,209,195,189, 58,171, 71, 39,132,
-133,133,153, 43, 20, 10,169, 90,173, 70,108,108, 44, 2, 3, 3,145,151,151,135,130,130, 2, 20, 22, 22, 66,175,215, 35, 39, 39,
-199,138,166,105,157,137,109,241,151, 29, 59,118,184,184,184,184,192, 96, 48,192, 96, 48,160,160,160, 0,231,207,159,135, 86,171,
- 45, 73,244,190,104,209, 34,205,231,159,127, 46,217,187,119,111,170, 90,173, 30,244,182,175, 53,143,199,131, 88, 44,134, 64, 32,
-200,118,117,117, 5, 69, 81,146,184,184,184,154, 76,185, 89, 0,200,229,243,249,162,210,194, 74, 34,145,224,222,189,123,123, 42,
-178, 94, 85,214,126,170,243,253, 29, 16, 88, 43, 5, 2,129,216,214,214, 86, 88,252,155, 94,175, 23, 90, 91, 91,195,205,205,109,
- 53,128,238, 38,242, 52,182,181,181, 5, 33, 4, 66,161, 16, 35, 70,140,192,141, 27, 55, 14, 36, 36, 36,124,146,154,154,138,252,
-252,252,237, 22, 22, 22, 31,166,166,166,130,166,105,196,197,197,161, 81,163, 70,141,255,166,211,252,199, 11,171, 87, 4, 22, 33,
-164,109,233,247, 98, 49,196,178,108,149,150,171,202,166, 8,203, 66,175,215,155,133,132,132, 48,197, 98,172,120, 21, 33, 0, 66,
-211, 52,132, 66,225, 43,156, 69, 2,171, 70, 13, 92, 44, 22,163,123,247,238, 18,153, 76,118,176, 72,100,157,169,105, 37, 29,218,
-183,211,113,201,236, 25,179,109,148,181, 61,191,254,250,107,126,183,110,221, 78,239,222,189,187,137, 93,112,135,174, 23,254,216,
-227,184,126,218,161,223,247,236,217,147,103,170,131,123, 17, 46, 31, 56,112, 64,241,213,248,177,194,182,109,219,254, 58,164,193,
-100,190, 66,196,152,219,136,133, 60, 25,143, 79,137,107,185,119,253,227,252,133, 36, 0, 23, 76,232, 36, 20,167, 79,159,134,149,
-149, 21, 0,136,116, 58, 29,172,172,172,176,126,253,122,137,133,133, 5, 44, 44, 44,208,178,101, 75,107,161, 80, 88,233,116, 97,
-105,208, 52,237,112,238,220, 57,152,153,153,161,160,160, 0, 90,173, 22, 70,163, 17, 44,203,150,140, 28,219,181,107,231, 80,141,
-142, 44,150, 16,210,102,236,216,177, 23,214,174, 93,107,239,233,233,137,121,243,230, 33, 35, 35, 3, 47, 94,188,192,160, 65,131,
-114,159, 62,125,218,190,180,111,214,187,128, 6, 13, 26,176,151, 47, 95,198,177, 99,199,208,179,103, 79,114,232,208, 33, 61, 77,
-211,194,196,196,196,187,111,171, 76, 70,163,209, 92, 36, 18,193, 96, 48,128,207,231,151, 76,225, 23, 11, 44,103,103,103,156, 58,
-117,138, 95, 88, 88,200,207,200,200,144,109,222,188,121,124,120,120,184, 2,192,128,183, 89,151,235,214,173,115, 27, 49, 98,196,
- 11, 62,159,207,118,237,218,117,240,243,231,207, 63, 80, 40, 20,127,156, 61,123,246,123, 0,213, 14, 45,224,239,239, 31,206,227,
-241, 92, 0, 8, 15, 30, 60,104,160,105, 90,216,160, 65,131,148, 98,203, 78,241,179,209,104, 52, 38, 68, 71, 71, 7,153,194, 39,
-145, 72,132, 63,253,244,147, 65,163,209, 8, 27, 54,108,152, 82,138, 71,248,219,111,191, 25, 12, 6,131,208,219,219, 59,220,196,
-149,205,237,154, 53,107,230,150,157,157, 13, 75, 75, 75,228,231,231, 35, 60, 60, 28,126,126,126, 80,169, 84,160, 40, 10, 86, 86,
- 86, 88,183,110, 93, 33, 33, 36,211,148,115,206,204,204, 28, 52,105,210,164,139,123,246,236,177,227,241,120,120,254,252, 57, 50,
- 51, 51, 97,101,101,133, 29, 59,118,192,221,221, 29,167, 79,159,206,164,105,250,179, 77,155, 54,205, 84,171,213,131,222,182, 15,
- 22, 69, 81, 37, 66,168,148, 32,210, 52,111,222, 28,151, 47, 95,222, 89, 29, 81,196,178,172,174,120, 90,176,244,212,160, 88, 44,
- 6,143,199,171,246,148, 7, 77,211, 66, 66, 72, 99,252, 57,107, 83,233,247,119, 0,109,229,114,185,176,236,143, 89, 89, 89, 66,
-111,111,239,214,213,120, 62,218, 74,165,210,151,132,109,219, 34, 53, 53,149,246,240,240,232,215,183,111, 95, 3, 0,140, 26, 53,
-170, 95, 90, 90,154,198, 96, 48,240,248,124, 62,210,210,210, 80,167, 78, 29,219,191, 65, 64,254,159, 22,249, 71, 11, 44,150,101,
- 9, 33,132, 45,253, 94,218,130, 85,149,229,170,120, 91,177, 80,170,226, 70,203,142,136,136,144,203,229,242,146,223, 12, 6, 3,
- 26, 55,110,204, 48, 12, 67,202, 30,235,117, 44, 88, 98,177, 24, 86, 86, 86, 24, 48, 96,128, 44, 49, 49,113, 43, 0, 23, 83,254,
-247,210, 7,235, 85,113,181, 97,241,188,213, 63, 46, 89, 96,251,228,216, 22,108, 90,181,140,150,203,205, 34, 27, 53,106,212, 38,
- 39, 39, 71,107, 37,215, 34, 57, 3,251, 88,150,253,165, 26,141,136, 2,176,231,234,213,171,183, 58,119,238,124,245,217,179,103,
-214,207, 31, 63,190,100,161,203,207, 55,171, 85,219, 40,116,112,236,165,214, 27,248,189,123,247,118, 4,176,202, 4, 62, 48, 12,
-131, 35, 71,142,192,220,220, 28, 22, 22, 22,176,178,178, 66,177,184,170, 41,158, 62,125,138,132,132, 4,200,229,114,200,229,114,
-152,153,153,193,204,204, 12, 34,145,232, 21,235, 99, 53, 68, 86, 52, 33,100,226,254,253,251,119,135,134,134, 34, 43, 43, 11, 5,
- 5, 5,152, 61,123, 54, 98, 99, 99, 39,177, 44,123,235, 93,186, 57, 26, 54,108,200, 94,189,122, 21,151, 46, 93, 66, 65, 65, 1,
- 86,175, 94, 13,133, 66,209, 1,192,172,183, 89, 46,134, 97,132,197,161, 78, 40,138,250, 63, 11, 86,177,216,146, 74,165,176,179,
-179,195,140, 25, 51,132,189,122,245, 10,121,155,101, 94,178,100, 73,221,149, 43, 87,110,222,182,109,219,177, 65,131, 6,237,189,
-119,239,222, 48, 75, 75,203,187,103,206,156, 89, 32, 22,139,153, 26,117, 94,124,190,203,173, 91,183, 74,139,124, 1, 77,211, 50,
-154,166, 97, 52, 26, 97, 48, 24, 80, 88, 88,136, 78,157, 58,153,204,119,227,198, 13, 25, 0,204,154, 53, 75, 0, 64,198, 48, 12,
- 74,243,169,213,106, 65,199,142, 29, 93, 76, 44,162,210,218,218, 90,240,226,197, 11, 24,141, 70, 4, 4, 4, 96,221,186,117,232,
-219,183, 47,234,215,175,143,188,188, 60, 68, 69, 69, 97,235,214,173,214, 66,161,240, 99,147,204,222, 42, 85,180, 82,169,108,221,
-175, 95,191, 43,187,119,239,182,118,115,115, 67, 66, 66, 2, 84, 42, 21, 60, 61, 61,177,106,213,170, 2,150,101, 91, 21,137,170,
-223,222,246, 61, 68, 81, 84,137, 8, 42,239, 85,195, 1,134,133, 68, 34,201,149, 72, 36,162, 98,161,117,243,230,205,106, 91,175,
- 74,245, 75,183,170,243,253,109,162,184, 15, 54, 24, 94, 61, 77,185, 92, 14, 47, 47, 47,147,121,228,114, 57, 41,126,198, 26, 12,
- 6, 36, 37, 37,209,247,238,221,163, 3, 2, 2, 0, 0, 10,133,130,190,118,237, 26,173,213,106,121,230,230,230, 0, 0, 43, 43,
-171,191, 84,100, 86,166, 69,254,209, 22,172, 82, 86,146, 11,101, 45, 88,197,130,167, 50, 39,119, 62,159,111,170,192, 2,143,199,
-195,241,227,199, 97,102,102, 6,115,115,115,248,248,248, 20, 87,110,185, 86,177,154, 10, 44,145, 72, 4, 75, 75, 75,156, 60,121,
- 82,115,251,246,237, 17, 53,181, 92,109, 88, 60,111,245,162,239,230,218,102, 60,184,138, 4, 85, 18, 50, 82,244,225,151,239,197,
-157, 0,112, 2, 0,240,192,247, 60,124, 31,152, 44,174,124,237,101,141,154,123, 57,253,214,254,189,174,206, 31, 12, 25, 75,125,
-254,249,231, 45,134, 14, 29,154, 57,120,240,224, 9, 82,169,180,190,209,104,204, 58,125,254,124, 92,159, 62,125,108,115,114,114,
-134,178, 44, 91,165, 79, 18,143,199, 75,234,220,185,115, 45, 0, 48, 55, 55,215,253,252,243,207, 34, 43, 43, 43, 12, 28, 56, 80,
-147,156,156, 44, 41,170,143, 44, 83,173, 87, 69, 15,155,212,207, 62,251,204,161,138, 58, 78,173,230,232,164,113, 72, 72,200,198,
- 61,123,246, 32, 35, 35, 3, 5, 5, 5, 16, 10,133, 88,186,116, 41, 94,188,120,241, 3, 33,228,222,187,210,153, 53,106,212,136,
-189,126,253, 58,238,222,189, 11,173, 86,139, 17, 35, 70,148,246, 49,236,252,182,103, 10, 18, 19, 19,177, 99,199, 14,208, 52,141,
- 65,131, 6,193,221,221,189, 68, 96, 37, 39, 39,227,231,159,127, 6, 77,211,248,236,179,207,224,234,234, 10,131,193, 32,105,215,
-174, 29,255,109,173, 40,157, 60,121,242,147, 3, 7, 14, 28,139,143,143,239,182,120,241,226,182,132, 16,102,202,148, 41,139, 44,
- 44, 44, 94,107,245,101, 86, 78, 30, 30, 61,126, 14,163,209, 88,238,203,222,206,166,218,124, 49,177, 47, 96, 52,210, 37, 28, 52,
-253, 39,159,173, 77,181,248, 18, 51, 51, 51,189,120, 60,158,240,241,227,199,112,115,115, 67,211,166, 77,177,112,225, 66,164,165,
-165,193,104, 52,194,193,193,129, 49, 24, 12,145, 58,157,238,130,169,164, 73, 73, 73,133, 25, 25, 25, 5,159,125,246,153,213,198,
-141, 27,137,151,151, 23,158, 61,123, 6,129, 64, 0,115,115,243,194,135, 15, 31,190, 51,171, 6,203, 90,174,138, 95, 69,150, 43,
- 10,192,239, 0,170, 37,176, 89,150,213,213,170, 85,235, 21,255,171,154, 88,175,254, 42,252,149, 43, 19,189,188,188,206, 91, 88,
- 88,132, 60,124,248,240, 21, 43,214,128, 1, 3,244,158,158,158, 23, 77,229,177,176,176,200, 18,137, 68,182, 26,141, 6, 87,175,
- 94,133,143,143,143, 48, 39, 39, 39,148, 16, 50,189,104,112, 25,154,146,146, 34,116,118,118, 6, 0,120,123,123, 35, 39, 39, 39,
-203,148,104, 1,175,137,255,211, 34,255,120,129,197,178,108,219,210,239,165, 26,178, 73,211,131,165, 44, 88, 85, 90, 90,212,106,
-117,137, 69, 68, 46,151,131, 97,152, 87,166, 35,203, 10,172,178,171, 8,171,115, 99,159, 61,123, 86,179, 97,195,134,222, 44,203,
-158, 48,245,127,165,125,176,126, 90,190, 96, 73,177,184,186,115,233, 20,126,123,152,147, 62,101,225,242,149, 53,173,108, 63,123,
-121, 67, 39, 71,187,115,203,151, 46,178, 72,188,126, 12,123, 55, 44,103,239,220,184,209,100,204,141, 27, 31,143, 25, 51,198, 6,
- 47,253,173, 18, 1, 92, 2,240,131, 41,226, 10, 0,174, 93,187,230, 90,252,185,105,211,166, 6, 11, 11, 11,152,153,153, 33, 45,
- 45, 77,104,102,102, 38, 57,119,238, 92,181,125, 29,174, 95,191,238,248, 38, 27, 26, 33,164, 94,207,158, 61, 47,252,250,235,175,
-242,236,236,108,196,197,197, 97,234,212,169, 88,179,102, 13, 44, 44, 44,112,228,200, 17,243,144,144,144,115,132,144,150,111, 59,
-184,106,227,198,141,217,155, 55,111, 34, 46, 46, 14, 70,163, 17, 31,124,240, 1,222,165,209, 20,195, 48,236,164, 73,147,176,113,
-227, 70, 80, 20,133, 33, 67,134, 32, 55, 55,183,100,187,141,141, 77,121,219,120,168, 98, 69,233, 95,218,209,240,249,236,249,243,
-231, 23,183,109,219, 22,241,241,241,221, 2, 3, 3,127, 28, 54,108, 88,226,235,242, 90, 91,154,163,145,159, 7,180, 90, 45,180,
- 90, 45,148, 74, 37,242,242,242,240,228,201, 19,104,181, 90, 56, 58, 88, 85,155,175,113,253,186,208,233,116,208,106,181,112,112,
-112, 64, 65, 65, 1,158, 61,123, 6,173, 86, 11,123,123,235,234,208,157,191,116,233,146, 91,167, 78,157,188,163,162,162,112,225,
-194, 5,232,116, 58, 52,110,220, 24, 49, 49, 49,104,209,162, 5,114,115,115,175,223,188,121,243, 80, 53,238,163, 90, 93,186,116,
- 57,187,115,231, 78,219, 95,126,249, 69,247,209, 71, 31,137,230,205,155, 71, 44, 44, 44,144,146,146,130,119,204,101,232,255,132,
- 85,120,120,248, 30,161, 80,200, 2,168,145,181,169, 24,241,241,241,226, 6, 13, 26,104,197, 98,177,232,202,149, 43, 59,107,106,
-189,250, 75, 70, 63,175,185, 50,177, 50,212,173, 91,119,146,139,139, 75,167,128,128, 0, 68, 69, 69, 9,197, 98, 49, 6, 15, 30,
-172,239,222,189,187,158,207,231,155,188,224, 70, 34,145, 60, 48, 55, 55,111,163,213,106,161,211,233,112,250,244,105,216,216,216,
- 76, 13, 9, 9,153,152,148,148, 4,149, 74, 37, 18,139,197, 37, 86,242,246,237,219, 35, 51, 51,243,193, 95, 93,119, 21,105,145,
-127,186, 5,171, 92, 49, 84,218,130, 85,217,244,160,169, 2,139,162, 40,232,116, 58,200,100,178, 18,129, 85, 58, 82,124, 77, 56,
- 43,194,173, 91,183,174,196,198,198,126,207,178,236,209,154,252, 63,236,151,109, 10, 75,166,176,150,234,250, 81, 60,186, 19,142,
- 3, 81,217,233, 83, 22, 46, 31,255,126,239,129, 41,101, 5, 89,152, 9, 46,244,245, 28,228,254,206,142,182,231,150, 47, 93,100,
-145,241,224, 42, 30,223, 13,199,209,235, 9, 17, 90,150,141, 1,240,221,155,188,168,197,115,235,239, 88, 71, 59,169,120,181, 96,
-108,108, 44, 6, 13, 26,148, 29, 23, 23, 55,246,131, 15, 62, 88,115,226,196, 9,107,107,107,107,156, 60,121,210,188, 86,173, 90,
-161, 0, 66,222, 98,231,200,210, 52,141,140,140,151,139, 55, 91,181,106,133,119,205, 84, 29, 30, 30, 46,236,217,179,231, 31, 0,
- 58, 60,120,240, 0, 12,195, 92,137,136,136,104, 85,188,189,178,109,166,232,183,188,188, 60,129,185,185,121,185, 15, 43,161, 80,
- 40,172,174,197,161, 52,231,229,203,151, 23,125,255,253,247, 7,190,252,242,203,199,175,201, 89,174, 5, 43, 36, 36, 4, 26,173,
- 1, 9, 41, 57, 48, 26,141, 40,212,165,188,150, 5, 43, 36, 36, 4,106,141, 14, 47,146, 50, 97, 52, 26,145,175,169,150,161,100,
-213,128, 1, 3,122, 95,190,124, 57,211,219,219,219,230,230,205,155, 72, 77, 77,133,193, 96, 64,135, 14, 29, 32, 22,139,159,135,
-134,134, 10, 97,130, 27, 64, 81,219,148,189,247,222,123, 39,118,239,222,237,116,229,202, 21,232,116, 58, 38, 60, 60,252,217,200,
-145, 35, 45, 62,253,244, 83,219,151,213,248,206,221,247, 16,139,197,120,240,224, 65,177,176, 26,242,166,132, 80,177, 5,235,191,
-132, 95,126,249, 37,113,203,150, 45,126, 10,133, 98,229,224,193,131,219, 43,149, 74, 74, 36, 18,157,231,243,249, 19, 1, 60,175,
- 70,221, 13,179,182,182,126,194,227,241,120,137,137,137,120,252,248, 49,120, 60, 30, 88,150, 21,169,213,106, 56, 58, 58,130,199,
-227, 21, 91,199,224,226,226, 66,199,196,196, 12, 3,135, 55, 35,176,138, 49,127,254,124,108,216,176, 1,163, 70,141,170,116,191,
-162,176, 0,164, 76,135,240, 74,182,237,226, 85,132,115,230,204,121,229,127,197, 83,129, 99,199,142,125,133,243,224,193,131,255,
- 55, 69,104,106, 6,239, 39, 79,158,152,172,128, 75,115, 22,251, 96,245, 25, 52, 36,105,245,162,217,119,183, 30,250,163, 65,146,
-154, 77,154,178,112,249,228,178,226,202, 84, 78, 95, 39, 51, 95, 23, 7,219,243,223, 47, 93,100, 89,108, 13,219, 29,153,156, 3,
- 35, 59,170,154, 15,255, 42,207, 93, 32, 16, 36,181,108,217,178, 22, 96,218,180,224,223,149,101, 93,171,213,226,218,181,107, 0,
-128,225,195,135,103,199,197,197,181, 97, 89,246, 62, 33,228, 65,215,174, 93,207, 31, 63,126,220,186,104,244,157,241, 54,203, 9,
-188, 92,209,202,231,243,225,229,229, 85,109,113,245,119,149, 51, 41, 41,105,212,232,209,163, 55,104,181, 90,126, 65, 65,193, 40,
- 83,183, 85, 85,206,176,176,176,199, 94, 94, 94,109, 81,113, 40, 6, 6,192,213,215,225, 92,185,114, 37, 0,120,191, 14,103, 69,
- 22,172, 61,123,246,128,166,105,184, 56, 90, 66,171,213,162,180,191,167, 41,156,101, 45, 88,123,247,238, 5,195, 48,112, 85,216,
- 64,171,213, 86,232,123, 88, 30, 39,203,178, 90, 66,200,176,150, 45, 91,110, 95,176, 96,193, 83, 31, 31,159, 90, 45, 91,182,180,
-206,204,204, 76,189,117,235, 86,220,134, 13, 27,204,140, 70,227,176,138,166,137,202,114,218,218,218, 46,223,182,109,155,203,131,
- 7, 15,144,152,152,136, 21, 43, 86, 60, 79, 75, 75,235,206,231,243,197, 63,254,248,227,185, 30, 61,122, 56, 26,141, 70,237,187,
-208, 62,139,161, 82,169, 14,225,101,248,154,106, 9, 43, 83,202,121,227,198,141,189, 69,220, 71, 77,225,254,187,206,253,117, 87,
- 38, 86, 85,206, 97,195,134, 37,160, 76,204,180,234,150,243,228,201,147,113,253,251,247,159,239,239,239, 63,199,204,204, 12,209,
-209,209, 37, 97,145,138, 7,232,132, 16,244,233,211, 7, 99,198,140,193,201,147, 39,231,247,238,221, 59,238,175,174,207,255,140,
-192,162,105, 58, 62, 46, 46, 78,177,109,219, 54, 30, 33, 4, 59,118,236, 64, 89,199,218,226,119, 0,184,118,237,154,145,101,217,
- 39,149, 29,140,166,233,248,240,240,112,199, 45, 91,182, 8,164, 82, 41,196, 98, 49, 84, 42, 21, 24,134, 97, 82, 82, 82,168,157,
- 59,119,190,226,172,123,245,234, 85,163, 94,175,127,241,182, 42,231, 98,212,243,137,199,143, 28,176,107,209,188, 77,182,133,141,
- 77,185, 66,165, 56,226,123,101,144,155, 91, 44,250,126,233, 34,171, 98,113,181, 39, 50, 57, 91,163,165,219, 63, 72, 43,188,243,
-166,203,124,249,242,101,215,119,180,173,205,110,219,182, 45, 3,192, 14,192, 76,246,165,229, 14, 69, 34,171,185,151,151,215,151,
- 0,164, 0,102,191, 77,235, 21,195, 48, 37,150,211,119,217,201, 50, 34, 34,226, 41,128,142,213,221, 86, 21,122,247,238, 29, 11,
- 32,246, 77,150,245,175,224, 44, 70,102,118, 46,158, 60, 75, 44, 74,229, 69,131,126,158, 92,202,127,202,128,204,220,234,133,145,
-203,202,201,195,147,103, 9, 96, 24,246, 37, 31,157, 88,226,228,110, 52, 26,145,158, 93,189, 48,109, 44,203, 70, 17, 66, 90, 76,
-155, 54,109, 2,128, 96, 0,174, 0, 94,224,165, 27,192, 42, 83,125,112, 4, 2, 65,240,202,149, 43,187, 83, 20, 69, 93,187,118,
- 77,187,116,233,210,248,180,180,180, 94, 44,203,190, 0, 0,165, 82,217,238,224,193,131,191,188, 11, 33, 25,202, 96,200, 63,148,
-187,198,248,167,172, 76,220,189,123,247,220,177, 99,199,242,155, 53,107,246,117,147, 38, 77,168,103,207,158, 33, 53, 53,181,100,
-112,217,165, 75, 23,184,185,185, 49, 71,143, 30, 93,248,225,135, 31,206, 5,135, 55, 39,176,210,211,211,187, 12, 25, 50,228, 20,
- 69, 81,181, 43, 74,238, 92,218,186,196, 48, 76, 92, 74, 74, 74,165, 65,200,210,211,211,187,204,158, 61,251, 20,159,207,175, 93,
- 42,153,179, 54, 35, 35, 99,108,159, 62,125,214, 10, 4, 2,113,105,107, 23,195, 48,207,147,146,146,254, 86,135,226,178,113,176,
-186,246,248, 48,253,117, 57,229, 34,120,196, 95, 59,130,199,119, 35,176, 39, 50, 57, 43, 79, 71,183,139, 78, 43,248, 79, 41,127,
-150,101, 83, 1,140,173, 96,219, 99, 0,163,222,129, 50,254,107, 86,175,252, 23, 96, 52, 26, 19, 58,117,104,135,178, 97, 25,202,
-126,167,105, 58,193, 84,190,142,237,219, 86,200, 83,252,217, 84,190,210,150, 44,188,204,198,176,164,166,231,202,227,241,190,108,
-214,172, 25,239,203, 47,191, 76, 57,118,236,216, 31, 89, 89, 89,147, 89,150, 45, 44,101, 41,138,198,219, 15, 38,202,225,207,107,
-254,143, 88,153,184,118,237,218, 89, 83,167, 78,221,170, 84, 42,119, 4, 7, 7,123,123,122,122, 90,152,155,155, 35, 55, 55, 55,
- 47, 51, 51,243,209,145, 35, 71, 6, 13, 25, 50,228, 41,119, 69,223,176,192, 74, 75, 75, 43, 0,208,226, 77, 30,172, 10, 78,183,
-119,165, 82,134, 6, 45,221,141, 7, 75, 95,201, 67, 88, 44,190,202,253, 94,133, 15, 86, 82,122,238,152, 5, 91,143, 44,211, 26,
- 89, 70,111,100,134, 71,167, 22, 68,113, 77,239,157,237, 24, 57,113,245, 15,193,189,123,247,130,222,101,190, 55, 9,157, 78, 55,
-177,101,203,150, 63,208, 52,253,189,193, 96,184,196, 93,125, 14,111, 10, 75,150, 44,121, 90,252, 92,238,211,167, 15, 15, 0,194,
-194,194,232,119,176,168, 77, 0,216, 3, 40, 78,182,110, 15, 64,135,151,145,253,211, 0,220,252,199, 8,172,255, 42,194, 78,255,
-249,128, 45, 43,156,170,250, 94, 17, 30, 37,231,159,231, 70,151, 28, 56,112,120, 13,225,255, 2, 64, 47,174, 38, 56,252,165,207,
-191,119, 83, 88, 21,195,158, 16,114,152,101,217, 16, 0, 40,254, 92,250,183,119, 13, 20,215,164, 56,112,224,192,129, 3, 7, 14,
- 28,222, 44, 8, 0,255, 10, 70, 76, 38,251, 8, 17, 66,252,107, 48, 34,187,199,113,114,156, 28, 39,199,201,113,114,156, 28,231,
-127,139,179, 42,238, 10,254,223,163, 10, 11,214,145,119, 78, 96,253,149,129,233,254,238, 37,193, 28, 39,199,201,113,114,156, 28,
- 39,199,201,113,254, 51, 57,171,192, 63, 78, 96,113, 62, 88, 28, 56,112,224,192,129, 3,135,119, 29,234,233,211,167,127, 77, 8,
- 57, 12, 0,211,167, 79,255,250, 93, 47, 48, 39,176, 56,112,224,192,161, 20,148, 74,101, 79, 0,115,241,210,133, 34, 84,165, 82,
-237,229,106,133,195,191, 9,246,246,246,114, 91, 91,219, 63, 40,138,114, 3, 94, 13,185, 84, 94,254, 95,134, 97,146, 50, 51, 51,
- 59, 39, 39, 39,167,255,157,156,101,112, 37, 52, 52,180, 48, 52, 52,180,216,161, 61, 13, 47,103,225, 66,240,231,202,194,127,182,
-192,154,222,185,118,107,165,179,243,206,236,140,140, 72,109, 97,222,167, 11,255, 72,204,172,201,129, 9, 33,182, 34,145,168,159,
- 92, 46,239,196,178,172, 7,143,199,123,152,147,147,115,218, 96, 48,236,102, 89, 54,159,187, 5, 56,188,109, 52,110,220,184,129,
- 72, 36,154, 74, 8,105,110, 52, 26, 93, 4, 2,129, 10,192,117,173, 86,187, 52, 50, 50, 50,146,171,161,127, 7, 8, 33,148, 66,
-161,248,193,202,202,170, 89,118,118,246, 32, 0, 95, 71, 71, 71, 55,164, 40, 10,126,126,126, 95, 43,149,202, 39,230,230,230,155,
-242,242,242,174, 36, 37, 37, 77,172, 78,238, 56, 14,239, 46, 60, 61, 61,195, 41,138,114, 41,157,174,173,172, 32, 40,251,206,178,
-236,211,168,168,168,150, 21,113,186,184,184,120, 88, 88, 88,172, 5,208,164, 60, 81, 81, 26, 69,238, 57, 55,115,115,115,199, 38,
- 36, 36,148, 27,136,215,198,198,198,220,193,193, 97, 46, 33,164, 15, 69, 81,188,170,206,137, 97, 24,154,101,217,176,212,212,212,
-217,153,153,153,121, 21,237,103,107,107,123,250,194,133, 11, 77,236,236,236,170, 12, 75, 99, 52, 26,145,144,144, 96, 31, 18, 18,
-114, 1,128,207,223,201, 89, 6, 58, 0, 55,254, 73,109,172,218, 2,139,208, 24,252,233,136, 33,206,217,241,209,206,219,118, 31,
-175,247, 77, 23,183,118,223,157,120,158, 92, 29, 14,169, 84,218,207,223,223,127,213,170, 85,171,108,107,215,174, 77,164, 82, 41,
-146,146,146,124,110,223,190,253,225,156, 57,115,102, 11, 4,130, 97, 6,131,225,212,107,118,154, 86, 54,102,252,169, 25,121,134,
- 25, 92, 87,194,161, 58,232,211,167, 15, 47, 62, 62,126,142,157,157,221, 87,211,166, 77, 19,215,169, 83, 7,102,102,102, 72, 77,
- 77,117,141,137,137,169,181,118,237,218,158, 45, 91,182,252, 81, 40, 20,126,115,238,220, 57, 35, 87, 99,255,108, 40, 20,138, 31,
- 46, 92,184, 48, 78,169, 84,162, 85,171, 86, 87, 26, 55,110,108, 33,147,201,112,236,216, 49,120,120,120,212,183,180,180,188,190,
-126,253,122,193,220,185,115, 27,237,223,191, 31, 0,198,115,181,246,207, 7, 69, 81, 46,145,145,145, 14, 50,153, 12, 52, 77, 23,
-101, 3, 96,192,178,108,201,123,105, 49, 68,211, 52,218,183,111,175,175,140, 83, 34,145,172,185,123,247,110,167,226, 12, 39,165,
-132, 84,185, 80,169, 84,157,218,183,111,191, 6, 64,185, 1,181, 29, 28, 28,230,246,237,219,119, 82,253,250,245, 75, 82,205, 49,
- 12, 83,242,158,158,158,142,207, 63,255,188,228, 24, 12,195,224,194,133, 11, 19,190,248,226, 11, 0,248,162,146,115,119,179,179,
-179, 35, 85,165,192,155, 51,103, 14,230,204,153,131, 85,171, 86, 17, 62,159,111, 85, 69,125,190,113,206,127, 58,170, 47,176,192,
- 30, 61,186,111,239,167, 33,109,189,201,208, 94, 1, 94,191, 28, 10,191, 58,189, 83,157, 54,139, 78, 63,141, 55, 81, 92, 77, 24,
- 61,122,244,162,121,243,230, 73, 30, 61,122,132,168,168, 40, 24,141, 70,152,153,153,161, 65,131, 6,212,209,163, 71, 21, 19, 38,
- 76,216, 39, 18,137,134,235,116,186,253, 53, 61, 49, 39,107,222, 82,185,148, 55, 80,196,231, 95,215, 25,141,135,222,197,202,111,
-214,172,217, 73,131,193,176, 56, 50, 50,242,236, 63,165,193, 4, 6, 6,182, 18, 10,133,179, 69, 34, 81,215,127,171,184,120,254,
-252,249,236,214,173, 91,127, 53,103,206, 28,241,179,103,207, 16, 29, 29,141,164,164, 36,212,174, 93, 27,181,107,215, 38,171, 86,
-173,146,252,248,227,143,227,111,223,190, 77, 1,152, 82, 29, 75,137,147,147,211,103, 29, 59,118,252,216,206,206,206, 50, 49, 49,
- 49,231,242,229,203,191, 37, 37, 37,253,196,178,108,141,234,146, 16, 66,217,217,217, 13, 13, 9, 9,249,216,198,198,198, 38, 41,
- 41, 41,243,143, 63,254,248, 45, 53, 53,117,211,235, 88, 90, 8, 33, 10, 0, 13, 1,216, 22,253,148,228,238,238,126,255,217,179,
-103,169,111,144, 83,229,238,238, 30, 85, 19, 78,123,123,123, 57,159,207,223, 75, 8, 81, 86, 98, 33, 80, 25,141,198,190, 69, 1,
-142, 43,132,133,133, 69,115,133, 66,129,235,215,175, 99,230,204,153, 54,237,219,183, 71, 76, 76, 12, 40,138,194, 87, 95,125, 69,
-252,252,252, 4,201,201,201, 8, 10, 10,194,233,211,167, 91,114,210,164, 90,215, 60, 12,128, 21,128, 1, 44,203,166,151,250,221,
- 14,192, 65, 0,169, 44,203,126,244,182,202, 39,149, 74,177,107,215, 46, 8, 4, 2, 8,133, 66,100,101,101,193,217,217, 25, 66,
-161, 16, 2,129,160,228, 37, 20, 10, 81,171, 86,173, 42,249, 24,134,105,202,227,241,144,159,159, 15,154,166, 75,210, 44,229,228,
-228,128,101, 89,136, 68,162,146,223,139,183, 49, 12,211,180,146,250,235,163, 84, 42,177,123,247,110,232,116,186,242,218, 46,238,
-221,251,211,207,156,199,227,161, 81,163, 70, 20, 33,164, 79,101, 2,139, 16,194, 2,192,136, 17, 35, 94, 73, 79, 87,246, 85,156,
- 59,152,101,217,146, 20, 98,127, 39,231,191, 90, 96,205,232, 88,103,108,253,128, 70, 75, 69, 34,129,148,161, 13, 96,140, 6,212,
-247,247, 2,195, 24,241,244,121, 18, 60, 28, 68, 24,222,205,211,109,251,201,152,123, 95,119,246,106,182,240,100, 76,116,153, 14,
-238, 94,153, 11,224,222,164, 73,147,185, 11, 22, 44,144,252,241,199, 31,120,244,232, 17, 22, 46, 92, 8, 0,144,203,229, 56,118,
-236, 24,104,154,198,242,229,203,205,187,118,237,186,150, 16,114,158,101,217,204,202, 56, 43,184,208,110,109,130, 92,122,237, 95,
-214, 70, 92,255,195,125, 43, 9, 33, 71, 88,150,165, 43,233,136,223,248, 74, 8, 83, 56,141, 70,227,123, 2,129,160,101, 64, 64,
- 64, 79, 83, 68,214,219, 42,103,105,113, 37, 16, 8,142,235,245,122,153, 72, 36,226,163,130, 68,210,111,187,156,175,195,217,184,
-113,227, 6, 54, 54, 54, 95,205,158, 61, 91,124,237,218, 53,100,101,101, 33, 53, 53, 21, 19, 39, 78,196,186,117,235, 80,191,126,
-125,200,229,114,140, 31, 63, 94,242,249,231,159,143,109,210,164, 73,216,205,155, 55,195,171, 42, 39, 33,132,106,219,182,237,174,
- 29, 59,118,212, 54, 26,141, 20, 0, 24, 12, 6,235,231,207,159, 15,153, 49, 99, 70, 91, 66,200,128,138, 68, 86,101,156, 45, 91,
-182,220,241,203, 47,191,120,138, 68, 34,170,168,179,182,255,228,147, 79, 62,253,230,155,111,218, 19, 66, 6, 86,212,238, 43,171,
- 79, 66, 72, 99,153, 76,230, 59,118,236,216,244, 94,189,122, 37, 2, 64, 68, 68, 4,185,117,235, 86,171,185,115,231,198,205,158,
- 61,251, 86, 13, 56, 3,101, 50,153,247,184,113,227,210,186,119,239,174, 18, 10,133,204,181,107,215,120,247,238,221, 11, 94,184,
-112, 97,236,215, 95,127,125,167, 58,156, 2,129, 96,207,254,253,251,219, 58, 59, 59,211, 0,216,226, 14,158, 16,194, 82, 20,197,
- 82, 20,133,216,216, 88,247,222,189,123,239, 4,240,126,101,156,217,217,217, 67,130,131,131, 47,204,156, 57,211, 6, 0, 46, 92,
-184, 0, 62,159, 95,242, 64,120,244,232, 17,180, 90, 45, 86,173, 90,165,207,203,203,251,236,223,214,230,255, 98,206, 90, 0,154,
- 2, 56, 67, 8,233,192,178,108,122,145,184, 58, 11,192, 15,192,229,183, 85, 78,138,162, 64,211,116,137,136, 58,117,234, 20,214,
-173, 91,135,221,187,119,195,217,217,249, 21,129, 37, 16, 8,202,245, 35, 42,231, 25, 87,220,183,131,166,105,220,184,113, 3,155,
- 54,109,130,131,131, 3,236,108,109, 97,103,111,143,102,205,154,161,216,106, 70,211,244,255,241,150,229, 76, 79, 79, 7,195, 48,
-166,158, 35,114,115,115, 77,174,207,202,132, 80,233, 87,117,174,209,235,112,254,167, 4,150,194,201,238,155,222, 31,191, 39, 5,
-109, 4,244, 5,128,190, 16,172,190, 16,172,174, 0, 68, 36, 5,107,208, 64,206,203,192,168,142,142, 22,251,174,166, 60,152,222,
-193,173,199,162, 51,207,143, 87, 50, 82,156,181, 97,195, 6,203,187,119,239, 34, 58, 58, 26, 43, 86,172,192,188,121,243, 74, 70,
- 14,239,191,255, 62,174, 92,185, 2,157, 78,135,153, 51,103,218, 76,155, 54,109, 28, 94, 58,155, 86,207,122,101,203, 95,183,119,
-251, 42, 27, 27,105, 58,134,247,186,105,187,102,111,220, 88, 0, 63,190,139, 23, 96,218,180,105,178, 37, 75,150,252,110,170,200,
-122,155,150, 43,177, 88,124,124,214,172, 89,242, 89,179,102,209,111,136,179, 62,159,207,223, 99, 48, 24,190,140,140,140, 60, 81,
-131,209,177,107,147, 38, 77, 22, 70, 71, 71, 31,207,205,205,253,165,236,118,145, 72,244,126, 96, 96,224,160,171, 87,175,126, 93,
- 85, 34,242, 98,136,197,226, 9, 95,125,245,149, 36, 33, 33, 1,217,217,217, 16,139,197,175,116,110, 98,177, 24, 20, 69, 65, 36,
- 18,225,147, 79, 62,145,108,222,188,121, 50,128,254, 85,182, 73, 39,167,207,182,111,223, 94, 91,175,215, 83, 5, 5, 5, 16, 10,
-133, 16, 10,133,104,208,160, 1,111,202,148, 41,181, 38, 77,154, 52, 26,192,234,234,156,191,181,181,245,144, 29, 59,118,120,138,
- 68, 34, 42, 41, 41, 9,173, 90,181,194,245,235,215,209,172, 89, 51,222,148, 41, 83, 92,199,143, 31, 63, 18,192,186,234, 90,153,
-100, 50, 89,253, 11, 23, 46,196, 43,149,127, 26,135,106,215,174,205,118,235,214, 45, 51, 58, 58,218, 59, 50, 50, 50, 35, 32, 32,
- 32,190, 26,156,206, 50,153,204,231,196,137, 19, 73,243,230,205,235,184,110,221,186, 94, 0,208,180,105,211, 67, 11, 23, 46,252,
- 35, 35, 35,195,239,198,141, 27, 25, 77,155, 54, 77,172, 70, 81,109,157,156,156,140, 99,199,142, 53, 47,187, 97,246,236,217,152,
- 59,119, 46,182,110,221,154, 1,192,161, 50, 18,165, 82,217,147,162,168,185,245,235,215,183,232,208,161, 3, 46, 92,184,128,241,
-227,199,107, 13, 6, 67, 12, 0,116,234,212,169,222,156, 57,115, 68,145,145,145,176,182,182, 22, 36, 37, 37,253,172, 84, 42, 57,
-199,119,211,209, 11,192, 57, 0,245,139, 68, 86, 95, 0,251, 0,248, 2,136, 6,208,251,109, 22,174, 88, 96, 37, 38, 38, 98,243,
-230,205, 88,184,112, 33,188,188,188,160,215,235,193,231,243, 75,196, 21,159,207, 7, 33,196,228, 84, 90, 52, 77,227,230,205,155,
-216,190,125, 59,102,126,243, 13,204,205, 95, 54, 83,189, 94,143,204,172, 44, 72, 36,146, 18, 17, 86,133, 96, 10,123,252,248,241,
- 36,103,103,231,146,105,202,210, 83,132, 0, 96,102,102, 6,134, 97, 96, 52, 26,161,213,106,177,113,227, 70, 35,203,178, 97, 85,
-220,147, 37, 98,232,139, 47,190,128, 86,251,103,206,241,134, 13, 27, 2, 0,220,221,221,209,168, 81,163,146,239,197, 22, 42, 83,
- 56, 55,181,106, 0,117,169,189,189,231, 44, 3, 0,184,184,184,192,219,219, 27, 10,133,194, 36,206,127,133,192, 42, 78,112, 91,
- 54,209,109,114,114,234,226,173,235,127, 94, 38, 18, 80,130, 78, 45,189, 97, 45, 54,130,200,108, 32,108, 59, 29,196,202,237,101,
- 3,200,140,133,238,196,116,244,109,148, 78,109,215,242, 14,206,237,230,105, 63,251,216,147,114,157,235, 40,138,106,238,234,234,
-138, 11, 23, 46,160,118,237,218,152, 53,107, 22,124,124,124, 32,147,201,144,146,146,130,130,130, 2,200,229,114,208, 52,141,128,
-128, 0,158,185,185,121,251,234, 10, 44, 66, 72,192,103,125,155, 53,229, 91,248,160, 85,215, 22, 56,185,182,173,124,235, 97,213,
- 12, 66,200,207,165,147,163,190, 43,248,224,131, 15,144,146,146, 34,219,177, 99, 71,141, 69, 86,179,102,205, 78, 26,141,198,247,
- 76, 48,135,159,189,120,241, 98,135,154,138,171,205,155, 55,203,173,172,172, 80,149,243,102, 53,196,213,165, 33, 67,134, 88,236,
-216,177,227, 64, 64, 64,192,135,213, 17, 89,132, 16,215,190,125,251, 30,217,180,105,147, 79,143, 30, 61,204, 0,252,159,192,170,
- 95,191,254, 7, 39, 79,158,252,112,204,152, 49,245, 9, 33, 61,139,146, 74, 87,197,219,178, 78,157, 58,120,241,226, 5, 82, 82,
- 82,160,213,106,145,146,146, 2, 0, 72, 72, 72,128,139,139, 11,172,173,173,225,226,226,130,122,245,234, 17,138,162,154,153, 82,
-222,246,237,219,247, 2, 64,197,198,198, 34, 45, 45, 13,150,150,150,144,203,229,112,118,118, 70,135, 14, 29,248,158,158,158,221,
-171, 43,176,186,117,235,246,177, 76, 38,163,158, 63,127,142,184,184, 56,104,181, 90,196,196,196,192,210,210, 18,157, 58,117, 18,
-120,122,122,134, 84, 87, 96, 1,240, 31, 57,114,100,106,105,113, 85, 12,185, 92, 78,188,189,189, 51,173,172,172,130, 0,196, 87,
-135,115,252,248,241, 41,161,161,161,109, 78,159, 62, 61,173,248,199,211,167, 79, 79, 5,128,213,171, 87, 95,176,177,177, 9, 2,
- 80, 29,129, 5,150,101,153, 79, 63,253,244,177, 72, 36, 66,241,171, 88,184, 46, 91,182, 12, 20, 69, 89,154, 64,243,117,116,116,
-116, 67, 51, 51, 51, 68, 71, 71,131,199,227,129, 16,242, 88,165, 82, 53, 44, 26, 0, 61,209,104, 52, 30, 26,141, 6,189,123,247,
- 38, 61,122,244,104,176, 98,197,138,111, 0,188, 19, 2,139, 16,210, 4,192,114,188,116, 0,254,134,101,217,235,239, 82,255,198,
-178,108, 10, 33,164, 93, 41,145,117, 11,128,184, 72, 92,181, 99, 89, 54,229, 45,214, 29, 24,134, 1,159,207,199,178,101,203,160,
-215,235,241,203, 47,191, 96,223,190,125,160, 40, 10,132, 16, 16, 66, 96, 97, 97,129, 31,126,248,161,228,187, 41, 48, 26,141,216,
-178,101, 11,166, 79,155, 86, 34,174, 0, 64, 40, 20,194,201,209, 17,182,118,118,136,141,141,173, 82, 96,165,166,166,206,190,113,
-227, 6, 42,115,114,255,232,163, 63,103, 88, 75, 59,185,155, 82, 78, 30,143, 7,173, 86,139,247,222,251,243,241, 49,110,220,184,
-146,207, 89, 89, 89,197,247, 4,136,137, 39,207,227,241,160,102,129, 15, 36,127,254,214,253,203, 47, 95,177,200, 85,196, 89,145,
- 22,249, 87, 90,176, 68,193,207, 87, 63,187, 66, 53,234, 19,210, 98,168,141,133, 20, 76,158, 10,194,142,115,112, 55, 83,134,149,
-235, 95, 62, 11, 39,245, 14,128,255,123, 11,160,253,185, 51, 58,184,235, 68, 63, 71, 74,167, 0,152, 85, 30,159,157,157,157,157,
-209,104, 4, 69, 81,144,203,229,176,177,177,129, 84, 42, 69,122,122, 58, 38, 76,152,128,227,199,143, 67,167,211, 65, 40, 20,162,
- 78,157, 58,208,235,245, 30,213,182, 94, 89,243, 55,173, 88,182,208, 42, 35,118, 39, 34, 30,101, 67,102,233,130,111, 70, 6, 89,
-207, 89, 27, 62, 27,192,212,119,241, 34,248,249,249, 97,226,196,137,178, 31,127,252,177, 70, 34,203,104, 52,206,231,243,249,173,
-190,252,242, 75,105,239,222,255, 63, 32,140,138,138,194,232,209,163,213,133,133,133,223,213, 68, 92,137, 68,162,227,155, 54,109,
-146, 91, 90, 90,226,197,139, 23,111, 76, 92,173, 90,181,202,194,195,195, 3, 2,129, 64,178,101,203, 22,147, 69, 22, 33,164,222,
- 71, 31,125,116,116,211,166, 77,110, 35, 71,142, 76,184,112,225, 66, 28, 33,164, 60, 33,158, 53,116,232,208,231, 91,183,110,245,
-100, 24,230, 4, 33, 36,132,101,217, 7, 85,212,165,171, 76, 38, 67,122,122, 58, 38, 77,154,244,138,131,106,241,116, 54, 0, 68,
- 71, 71,195,197,197, 5, 26,141,198,217,148,115,182,177,177,177,102, 89, 22, 35, 70,140, 64,124,252,159,218,196,217,217, 25,241,
-241,241, 48, 26,141, 54,213,173, 71,107,107,107, 27,131,193,128,182,109,219, 66,163,209, 0, 0,250,246,237, 11,129, 64,128,212,
-212, 84,232,245,122,219, 26, 92, 30,187, 30, 61,122,168, 42,218, 40,151,203, 13,214,214,214,238,213,228,180, 13, 9, 9, 73,220,
-176, 97,195,251,101, 55,220,184,113,227,125, 75, 75,203,211, 54, 54, 54,222, 53, 40, 43, 35, 22,139, 33, 22,139, 33, 16, 8, 32,
- 18,137, 32, 22,139, 33, 18,137, 32, 16, 8,192,227,241, 76,154, 87, 97, 24, 6, 71,142, 28, 1, 69, 81,175, 76, 93,204,154, 53,
-107,148,149,149,149,227,249,243,231, 75, 6,128,249,249,249,168, 91,183,110,157, 78,157, 58,221, 78, 78, 78,142,139,138,138,250,
-240, 45,119, 31, 75, 1, 20,251,133,173, 3,208,232, 93,235,223,138, 68, 86, 31, 0,225, 69,226, 74, 7,224,227,183, 41,174, 74,
- 95,123, 62,159, 95,114,159, 75, 36, 18, 4, 4, 4,148,136, 41, 66, 8, 10, 11, 11, 75,166, 8, 77,125,232,231,228,228, 64,161,
- 80,192,220,220, 28,117,189,188,240, 56, 38, 6, 0, 74, 62,139, 68,162, 18, 33, 86, 25,138, 86, 2,126,129, 74,252,169,106, 40,
- 46, 89, 0,224,243, 43,119,195, 86, 40, 20, 96, 24,166, 88, 88,178,111,130,211,206,206, 14,249,249,249, 38,113,254, 43, 4, 86,
-121,138,113,238, 92, 66,105,175,212,222,220,167,123,211,161,190, 46,114,104,211, 99, 33, 50,179, 5,177,114,199,202,245, 39,240,
- 32,238,165,107,212,202,125,145,216, 58,163, 11,136,204, 6, 10,245, 35,152, 75,196, 31, 86, 36,176, 50, 50, 50,242,245,122,189,
-141, 84, 42, 5,159,207,135, 80, 40, 68,122,122, 58,190,253,246, 91,236,221,187, 23,238,238,238, 48, 26,141, 16,137, 68, 72, 75,
- 75,131, 80, 40,172,214,234, 68, 62,159,244,152, 51,177, 91,109,185,173, 23, 50, 34,231,189,252,209, 34, 0, 35,251,242, 68,223,
-111,191, 63,132, 16,242, 61,203,178,169,239,218, 69, 48, 51, 51, 67,163, 70,141, 48,112,224, 64,217, 47,191,252,178, 13,128, 75,
-117,254, 31, 17, 17,113, 57, 48, 48,176,243,242,229,203, 79, 38, 37, 37, 73, 27, 55,110, 12, 51, 51, 51,152,153,153, 33, 54, 54,
- 22,243,230,205,211,104,181,218,144,154, 88,199,248,124,254,150, 79, 63,253, 84,110, 97, 97,129,216,216, 88,216,216,216,188,214,
-185, 6, 6, 6,214, 23, 8, 4,151, 86,173, 90,101,225,233,233,137,135, 15, 31, 34, 48, 48, 16, 78, 78, 78,146,208,208, 80, 83,
- 69,214,154,157, 59,119,186,139, 68, 34,178,107,215, 46,215, 93,187,118, 77,168,234,184,219,183,111,119,223,181,107,215, 42, 66,
- 72,167,202,156,191,133, 66, 97, 66, 90, 90,154,103,173, 90,181,176,121,243,102, 80, 20, 5,149, 74,133,111,190,249, 6,161,161,
-161,104,214,172, 25,204,205,205, 81,171, 86, 45, 60,126,252, 24, 18,137, 36,201,148,243, 78, 76, 76,204, 4,224,112,252,248,113,
-164,165,253, 25,178,197,205,205, 13,153,153,153,208,106,181, 25,213,173,203,196,196,196, 12, 0,142,183,111,223, 70, 92, 92, 28,
-186,118,237,138,131, 7, 15, 34, 40, 40, 8, 52, 77,195, 96, 48,100,212,224, 18,209, 60, 30,143,173,164, 19, 37, 0,172,171,201,
-105,172,140, 19, 47,227, 77, 85,151, 19, 44,203,178, 21,137, 43,145, 72,132, 42,142, 89,162,155,125,124,124,230,214,169, 83,199,
-247,155,111,190, 17,240,249,124, 4, 7, 7,215,155, 50,101,202,115,169, 84,106, 59,125,250,116, 89,121,198, 96, 0, 13,125,125,
-125,229,239, 64,247, 81,218, 74,247, 78, 46, 58, 33,132, 56, 20, 89,252, 68, 0,244, 69,239,187,139,125,178,222,182, 5, 75, 40,
- 20, 98,206,156, 57, 24, 51,102, 12, 28, 29, 29, 49,109,218, 52,240,249,252,146, 87,177, 85,166,216,170,101, 98,219,132,163,131,
- 67,229, 55, 90,145,147,123, 21, 3,179,191, 36, 76, 67,177, 24, 50,197, 23,170,148,181,201, 36,209,246, 58,156,255, 38,235, 85,
-137,192, 42,107,150, 43, 17, 87, 93, 3,135,250,184, 72,113, 43,242, 30,252,157, 12, 96, 5,130, 74, 90,139, 1, 68, 40,135,149,
-148,239, 82,201, 5,136,140,139,139,115,179,178,178,130, 94,175,135, 72, 36,130,191,191, 63,174, 94,189, 10,173, 86, 11,157, 78,
- 7,177, 88, 12,161, 80,136,251,247,239, 67,175,215, 95,168,198,205,194,115,180,230,173,154,250,245, 60,115, 36,110,134,149,185,
- 8,237,155,123, 2,114, 95,240, 10, 30, 97,249,204, 16,155, 81,223, 28, 92, 9, 19,252,101,222,134,192,122,254,252, 57,118,237,
-218, 85,168,213,106,135,212,132,163, 88,100,237,221,187,247,164,149,149,149,180, 89,179,102,136,137,137,193,119,223,125,167,209,
-106,181, 61,106,234,223,101, 52, 26,135,109,220,184,241,184,209,104,148, 23,139,139,215,181, 92, 77,152, 48,193,188,110,221,186,
-120,242,228, 9, 44, 45, 45, 97,110,110,142,218,181,107, 67,161, 80, 72, 38, 76,152, 96,138,200,250,124,224,192,129, 71,183,110,
-221,234, 54,114,228,200,132,221,187,119, 31, 2,144, 83, 94,213,126,244,209, 71,239,111,221,186,213,109,212,168, 81, 47, 0, 76,
-168,106,101, 29,195, 48, 87,158, 60,121,226,225,227,227, 67,234,213,171, 7,145, 72, 4,103,231,151, 70,170,134, 13, 27,194,199,
-199, 7, 66,161, 16, 0,240,228,201, 19,192,196,184, 44, 23, 47, 94,252, 45, 58, 58,250,179,160,160, 32,158,147,147,211, 43,171,
-147, 66, 67, 67,245,207,159, 63,175,118,154,135, 51,103,206, 28,188,119,239,222,136,224,224, 96,190,181,181, 53,196, 98, 49,252,
-253,253,161, 80, 40,240,221,119,223,233,159, 61,123, 86,147,212, 17, 47,110,223,190, 45,241,242,242,162, 43,104,171,230, 0,170,
-107,121, 72,136,136,136, 16, 54,111,222,252,208,177, 99,199,234,151,222,208,180,105,211, 67,102,102,102,150, 0,146,106, 80, 86,
-166,244,212, 96,233,169, 66,145, 72, 4, 62,159, 95,165, 5, 75,165, 82,253,238,228,228,244,212,209,209,241,114,203,150, 45, 45,
-195,195,195, 49,107,214, 44,161, 86,171,117, 61,125,250,116,201,131,184,188, 7,104, 65, 65,129,228, 29,232, 62, 38, 1, 88, 1,
- 64, 6, 96,218, 59, 40,174, 28,241,210,161,221, 27, 47,167, 5,251, 22,137,173, 98,159,172,183, 42,178, 24,134,129, 64, 32,128,
-183,183, 55,190,248,226, 11, 44, 94,188, 24, 99,199,142, 69,221,186,117, 75,174,125,177, 15, 86,209,138, 55,147, 30,252, 66,161,
- 16,142, 78, 78, 48, 24, 12, 37,214, 43, 0,120, 28, 19, 3, 62,159, 15,134, 97,160,213,106,171,156, 34,116,112,112,152,187,100,
-201,146, 9,221,186,117,163, 74,175,184, 99, 89,182, 36,156, 68,233,151,193, 96,192,239,191,255, 62, 33, 52, 52, 20,166, 88,189,
-120, 60, 30, 26, 54,108,248,202,180,224,234,213,127,122, 42, 4, 4, 4,160, 83,167, 78,213, 90,237,199,227,241,224, 61,103,217,
- 43,211,130, 71,237,255,172,182, 90,159,140, 68,221,239, 86,149,203,249,159,152, 34,212, 95,117, 91,208,187, 75,163,161, 62,206,
- 98,220,142,188,143,195,225,105,143,156, 90,242,189,237, 10,210,192,164, 61,196,164,222, 1, 88,185,239,101,156,197, 73,189, 3,
-192,164,222, 7,155, 21, 11, 88,212, 66,106, 1,163,170,196,220,185,116,254,252,249,237,214,175, 95,111,157,155,155, 11,129, 64,
-128,132,132, 4,180,111,223, 30, 15, 30,188,156,185, 17,137, 68,160, 40, 10,179,102,205, 74, 75, 75, 75, 91,111,234,137,200,165,
-212,200,197,223,244,119, 20,138,205,129,204, 11,176,176,176,194,230,245,203, 0,173, 10,160, 68,232,217,169, 17,111,238,143,231,
- 59, 16, 66,234,177, 44, 27,253, 46, 93,132, 23, 47, 94, 96,206,156, 57,133,106,181,250,181, 28,221,139, 69,214,250,245,235, 79,
-166,167,167, 75, 15, 28, 56,240, 90,226,170, 20,103,215,109,219,182, 29,119,114,114,146,187,187,187,215,248, 60,133, 66,225,116,
-189, 94,111,177, 98,197, 10,122,229,202,149, 21,117,120, 98,153, 76,182, 4,192,137, 74, 70,135,209,132,144,246,124, 62,255,200,
-166, 77,155,124,146,146,146,220,207,159, 63,223,179, 28, 65,183,117,235,214,173,110, 99,198,140,121,178,107,215, 46,147,124,176,
-180, 90,237,234,117,235,214,245, 89,179,102,141,212,204,204, 12,132, 16,216,219,219,151, 8,225,226, 7,185, 94,175,199,218,181,
-107,213,106,181,122,165, 41,231,158,145,145,177,121,202,148, 41,237,103,204,152,225,214,172, 89, 51,129,173,173, 45, 84, 42, 21,
-118,237,218,165,255,233,167,159, 18,179,179,179,127,170,110,125,230,230,230,110,153, 58,117,106,199,111,190,249,198,173, 83,167,
- 78,130,172,172, 44,104,181, 90,124,247,221,119,250,159,126,250, 41, 49, 47, 47,175,218,156, 45, 90,180,120,146,152,152,216, 74,
-171,213,102,137,197,226, 87, 58, 56,129, 64, 64, 36, 18, 73, 83, 0,219,171,195, 25, 20, 20,244, 36, 46, 46,174,197,130, 5, 11,
-206, 27, 12, 6,193,141, 27, 55,122, 21,139,171,181,107,215,158,149, 72, 36,157, 0, 84,187,172, 20, 69, 49,101, 69, 85,105,177,
- 37, 16, 8, 76,154, 34,244,241,241,217,185,125,251,118,203, 7, 15, 30, 32, 55, 55, 23,105,105,105,208,104, 52, 37, 83,185, 21,
-197, 49, 42, 44, 44,148,190,237,190,131,101,217,115,120, 25,250,226, 93,197,190, 82,226,170, 93, 57, 62, 89,191,225,207, 41,206,
-191,221,130,197,178,108,201, 96,167,127,255,254,232,216,177, 35,220,220,220, 74, 68, 85,233, 85,132,213, 17, 25, 52, 77,195,223,
-223, 31,218, 34,151,151,226, 54,196,231,243, 97,111,111,143,199, 79,158,152,228,228, 78, 8,233,211,173, 91, 55, 42, 42, 42, 10,
-253,250,245,195,142, 29, 59, 42,220,119,240,224,193,216,189,123, 55,186,116,233, 66, 45, 90,180,168, 79, 21, 2,171, 90,214, 38,
- 19,173,119,127, 5,231, 63, 95, 96, 21, 43,197,226,119, 71,107,249, 48, 95, 5, 31,183,111, 63,192,161,136,204,173,132, 80,251,
- 35,159,105, 15,119,169,147, 7,253,222, 1,240,239,179, 3, 91,103,116,121,249, 64, 76,189, 15,125,216, 96, 16,153, 29, 30,231,
-202,161,214,101, 31,169,164, 51,184, 97,109,109,189,103,251,246,237,159, 14, 29, 58, 84,196, 48, 12,164, 82, 41, 38, 79,158, 92,
- 18, 35,132,199,227, 97,236,216,177,249,169,169,169, 43, 76, 93,249, 69, 8,145, 58,219,139,102, 14, 26, 49, 75,130,248, 13, 0,
- 37, 68, 58, 26,163, 97,155, 79,145, 26,119, 21, 40,120, 0, 16, 33,214, 47,250,204,238,253, 97,223,255, 4,160,245,187,114, 1,
- 30, 62,124,136,217,179,103,191,182,184, 42, 43,178, 14, 29, 58,180, 77,171,213,142,120,131,156, 93, 23, 47, 94,124,220,193,193,
-161,198,211, 34,206,206,206,159,164,167,167,127,106,138,225,204,132, 7,203, 11, 66, 72,143,184,184,184,133,209,209,209,229,174,
- 92,189,127,255,254,193,206,157, 59,203,170,179,138, 48, 50, 50, 50,178,121,243,230,235, 86,172, 88, 49,118,226,196,137, 18,169,
- 84, 10, 11, 11, 11, 68, 71, 71,195,213,213, 21, 0,160, 86,171, 49, 99,198, 12,181,193, 96,216,122,243,230,205,171, 38, 62, 8,
- 25, 66,200,160,209,163, 71,127, 86,175, 94,189,247, 25,134,177,213,233,116, 25,207,159, 63, 63,146,151,151, 87,163, 56, 88, 69,
-156, 3,199,140, 25, 51,212,203,203,235, 99,189, 94,111,107, 52, 26, 51,226,227,227, 15,229,230,230,110,174, 9,231,149, 43, 87,
-210, 54,109,218, 20,155,156,156,236,167, 80, 40,114, 44, 45, 45,117, 58,157,142,103,102,102,102, 46, 18,137, 2, 1, 92, 5,240,
-160, 58,156, 55,111,222, 76, 89,191,126,125,156, 86,171,173,183,113,227,198, 11,114,185,252, 15, 66, 8, 17, 10,133,214,114,185,
-188, 61,128,243, 0, 30, 87,183,172, 20, 69, 49,197,211,130,101,173, 88, 66,161, 16,132, 16,147, 4,214,147, 39, 79, 46,207,159,
- 63,191, 65,157, 58,117,176,126,253,250, 76, 51, 51, 51,243,143, 63,254,152,159,147,147, 67, 42,179, 96,169,213,106, 9, 56, 84,
- 57,182, 40,178,242,246, 42,246,185, 42, 37,178,246, 1,200,126,203, 2,245, 21, 33,229,234,234,250,138,168, 42,189,173, 58, 2,
-203,104, 52, 66, 40, 20,130,207,231,195, 73,161, 40, 17,115, 44,203, 34,230,241, 99,100,101,101,149,132,105,168,162,141,243, 8,
- 33,232,215,175,159, 73,199,237,223,191, 63,206,159, 63,143,170,166, 19, 75,175,248,171,106,208, 92, 44,152, 40,138, 50,121, 21,
-161,139,139, 75,141, 56,203,106,145,127,165, 5, 75,149, 89,184, 96,211,129, 91, 51, 84,185,198,253,226,150,207,191,152, 51, 7,
-236,140,142,238, 39, 93,228,162,206,190, 84, 34,180, 63, 5,131, 88,188,124,216,176,249, 42, 16,185, 19,178, 4,174,248, 61, 50,
- 57,153, 18,240,150, 84,118,192,236,236,236, 73, 63,252,240, 3,239,248,241,227,125, 22, 46, 92,104,229,237,237,141, 65,131, 6,
- 65,167,211,225,238,221,187, 24, 61,122,116,102, 90, 90,218,134,236,236,236,197,166,158,132,157, 5,255,219,149, 95,119,182,165,
-152,124, 32, 55, 2,224, 91,194,206,198, 28,119,194, 47, 0, 57,225, 0, 37, 4, 40, 17,130, 26,251,160, 97,125, 79, 31, 66, 72,
- 48,203,178,151,222,133, 11, 48,106,212,168, 55, 38,174, 74, 11, 34, 0,117,222,100, 57,139, 69,214,151, 95,126,121,156, 97, 24,
- 89, 77, 56,194,194,194,104, 0,244, 27,236, 28, 95, 0, 24, 88,209,118,157, 78,119, 8, 64,181,131,204, 26, 12,134, 25, 81, 81,
- 81, 24, 55,110,220,152,193,131, 7, 75,189,189,189,225,230,230,134,152,152, 24, 68, 71, 71, 99,221,186,117, 26,134, 97, 54,103,
-103,103,127, 85,205,242,210, 0, 54, 20,189,222, 84, 29, 48, 0,126, 46,122,189, 17,124,246,217,103,247, 30, 63,126,156,233,236,
-236,220,140,199,227, 53,192,203, 64,145, 73, 69,199,120, 92, 19,206,209,163, 71,223,142,141,141, 77,119,114,114,106, 38, 20, 10,
- 61,139, 56, 19, 1,108,174, 33,103,198,157, 59,119, 60,155, 54,109,202,240,120, 60, 86, 32, 16,176, 69, 15, 67,150,207,231,179,
-132, 16,246,196,137, 19, 18, 0, 85,250, 92, 38, 36, 36, 76,216,186,117, 43,107,102,102,214, 44, 63, 63,127, 16,128,109,106,181,
-186,105,118,118,118,165, 22, 44,141, 70, 35,230,244, 83,149,237,243,131, 10,126, 79, 1, 16,252, 46,148,113,254,252,249,216,176,
- 97, 3,170,138, 64,126,232,208, 33,160,138, 41,194,226,182, 82,236, 95,165,211,233, 16, 21, 21, 5, 66, 72,201,247,210, 65, 70,
-105,154,174, 52,210, 59,195, 48,180, 78,167,195,158, 61,123, 76, 18, 89,187,118,237,130, 70,163, 1,195, 48, 38,245,179, 69,129,
- 73,145,149,149, 85, 18, 58, 33, 32, 32,160,100,187, 94,175,175,118,125,242,120, 60,120,123,123, 35, 61, 61, 29,118,118,118, 0,
- 94, 78, 11,150,136,207,130,130,255, 76,251, 39,149, 93,220,210,152,219,206,221, 82,195,167, 14, 52,114,102,218, 5,185,137, 97,
-103, 37, 1, 79, 32, 70,174,134, 32, 74,165,193,165, 7,185,241,180,145, 13,249,238,143,103, 38, 5,136, 35,132, 52, 87, 40, 20,
- 95,211, 52, 93,159,162, 40, 25,203,178,249, 60, 30,239,150, 74,165,154,203,178,236,253,234,156,132,149, 57,239,177,181,156,103,
- 41, 16,137, 88,218,200, 0,160, 0,138, 2, 8, 5,128, 87,244,254,242,187, 90,173, 23,210, 12,217,159,146,150,254,217,219,174,
-252, 54,109,218,156, 44, 40, 40,248,199, 69,114,151, 74,165,179,121, 60, 94,215,127,123,154,152, 38, 77,154, 4, 73,165,210,175,
- 25,134,105,162,209,104,156,164, 82,105, 10, 33, 36, 60, 47, 47,111,209,173, 91,183,174,113,143,207,183,135, 55, 25,201,189, 44,
-138,147, 61,219,217,217,121,221,185,115, 71, 82,218,130, 85,186,191,172,206,170, 50, 14,239, 30,124,125,125,175,239,220,185, 51,
-200,213,213,149, 42,118,184,166, 40,170,228, 85, 60,141, 85,108,109,185,118,237,154,241,243,207, 63,191,122,251,246,237, 54, 21,
-113,214,173, 91,247,228,233,211,167,223, 43,109,161, 42, 22, 82,101, 63,211, 52,141,194,194, 66,204,158, 61,251,212,227,199,143,
-203, 77,149,227,227,227,179, 98,230,204,153, 19,186,119,239, 78, 81, 20,245,127, 62, 87,101,253,176,244,122, 61,246,239,223,207,
-108,217,178,101,213,195,135, 15, 43,156, 34,108,220,184,113,252,173, 91,183, 92,138, 67, 38,148,125,149, 93, 81, 11, 0,205,155,
- 55, 79,186,126,253,186,242,239,228,252,207, 8,172,162, 14,133, 76,235,224,214,151,128,234, 67, 17,198, 31,132,136, 24, 22,209,
- 4, 56, 41,146,232,214,206,254, 93,165, 46,179,191,255,155,142,200,203,113,114,156,111,131,147, 16, 66,153,146,122,134,171,207,
-127, 15,103,221,186,117, 31, 63,126,252,216,179, 18,158, 18,129,197,213,231, 63,143,211,222,222, 94,110,111,111,255, 7, 69, 81,
-110, 21, 37,119, 46, 45,174, 25,134,137, 75, 73, 73,233,152,146,146, 82, 88, 17,167,139,139,139,135, 68, 34, 89,195, 48, 76, 83,
- 83,146, 61, 83, 20,117, 67,163,209,124, 94, 58,217,115,105,206, 55,181,138,176,108, 57,235,215,175,255,228,198,141, 27, 30, 82,
-169,180,100,234,178,116,187, 46,139,103,207,158,225,227,143, 63,126,126,251,246,109,247,191,146,243,223,134,106,229, 34,100, 95,
-214,216,158,162, 23, 7, 14,255, 25,188, 78, 94, 63, 14,255, 76,168,213,234, 44,123,123,251,124,141, 70, 35,208,106,181, 2,163,
-209,248,202, 3, 78, 42,149,166,113,181,244,207, 69,145,101,179,217,155,228, 44, 18, 74,157,223, 20,223, 95, 21, 7, 43, 43, 43,
- 43,164, 73,147, 38, 39,248,124,190,184,172,248, 41, 79, 12,209, 52,173,201,200,200,232,250,119,115,254,167, 4, 22, 7, 14, 28,
- 56,252, 87,144,152,152,216,140,171, 5, 14,255, 70,168, 84,170,104, 0,110,239, 58,231, 63, 29, 20, 87, 5, 28, 56,112,224,192,
-129, 3, 7, 14,156,192,226,192,129, 3, 7, 14, 28, 56,112,224, 4, 22, 7, 14, 28, 56,112,224,192,129, 3, 39,176, 56,112,224,
-192,129, 3, 7, 14, 28, 56,212, 24,255, 27, 0, 30,206, 65, 61,139,248,242,231, 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, 88, 0, 0, 2,128, 8, 6, 0, 0, 0, 64, 11, 6,158, 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, 2,190, 27, 73, 68, 65, 84,120,218,236,157,119,120, 20,197, 31,198,223,
+217,221,235,119,233, 33, 61,144,132, 26, 8, 61,116, 66,111, 34, 77, 69,186, 10, 22, 64,129,159, 32,205,134, 32,130, 93, 1,149,
+174, 34, 32, 34, 72, 85,148, 42,189, 73,239, 61,129, 52,210,235,245,178,243,251, 35,185,243, 18,146,220, 37, 32, 22,230,243, 60,
+251, 92,178,187,247,222,236,236,236,236,187,223, 41, 75, 40,165, 96, 48, 24, 12, 6,131,193, 96, 60, 56, 56,150, 5, 12, 6,131,
+193, 96, 48, 24,255, 34,131, 69, 8,233,198, 52,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 12, 22,131,193, 96, 48, 24, 12,
+ 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 48,131,
+197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12,198,127, 3,194, 38, 26,101, 48, 24, 12, 6,131,193,120,176, 8,
+229,109,104,214,172,217,207, 10,133,162, 86,121,219,117, 58, 93,234,153, 51,103, 58,179, 44,100, 48, 24, 46,159,228, 8,225,240,
+103,196, 92, 4, 64, 41,123,186, 99, 48, 24,143,162,193,146, 74,165, 81,251,247,239,175, 35,138, 34,108, 54, 27,172, 86,171,227,
+211,100, 50,225,169,167,158, 18, 42,251, 99, 77,154, 52,217,207,113, 92, 68,101,190, 99,179,217,238,156, 61,123,182,125,121,219,
+ 3, 3, 3, 15, 3,136, 34,132,216, 43,242, 50, 63, 1,128,227, 28, 45,162, 41,137,137,137,205, 42,210, 36,132, 68, 57,221, 28,
+238,209,178,255,237,174,102,189,122,245, 78, 8,130, 16, 86,250,251,101,253,111,255, 91, 20,197, 91,231,207,159,111,203,138,233,
+195,161, 73,147, 38,251,121,158,175,116,249, 60,115,230, 76,185,229,179, 97,195,134,167, 57,142, 11, 41,235, 28,151,117,206, 1,
+240, 54,155,237,234,217,179,103,219,151,103, 64,130,131,131, 15, 3,136,170,168,236,148, 42,155, 0,144,148,152,152, 24,235,234,
+ 58,170,232, 26, 42,163,204, 87,168,233,108,174, 66, 67, 67, 63,168, 86,173,218, 88,157, 78,103, 0, 64,121,158,167,245,235,215,
+ 47,145, 15, 54,155, 45,227,242,229,203, 13, 89, 73,100, 48, 24,255,105,131, 37,138, 34,103, 52, 26,113,237,218, 53,148, 85,207,
+115, 28,103,171,236,143, 81, 74,235,236, 94,179, 42, 64, 89, 45, 16, 54,139, 25,114,191,106, 14,237,220,203, 23, 32,154,205,176,
+153, 77,240,143,109,109,175,112,209,185,115,103,222,133,108,216,164, 73,147, 2, 60, 60, 60, 96, 48, 24, 96, 48, 24, 96, 52, 26,
+ 97, 48, 24, 96, 50,153, 96, 50,153, 96, 54,155, 97, 54,155, 97,181, 90, 97, 52, 26,113,238,220, 57,155,139, 27, 66,216,132, 9,
+ 19, 2, 60, 61, 61, 29,122,246,197,174,105,215,181, 88, 44, 48, 24, 12,184,112,225, 66,133,154,130, 32,132,157, 58,117, 42, 64,
+ 42,149,130, 82, 10, 81, 20, 65, 41, 45,177,148,166,109,219,182,102, 86, 68, 31, 42,117, 54,125, 52, 55, 64,238,235, 7,209, 98,
+129, 95,147,230,246,114,139,148, 61,219, 97, 51,155, 33, 90, 44,168,209,247, 73,199,250,142, 29, 59,186, 42,159, 53,126,154,241,
+186,183,212,195, 3, 86,131, 1,145,125,158,112,108,184,184,120, 30, 68,139, 25,212, 98, 70,163, 73,111, 1, 0, 50, 51, 51,245,
+209,209,209, 41, 0, 8,128,242, 34, 60, 97,183,110,221, 10,176,167,161, 44,211,239,188, 28, 58,116, 8,195,135, 15,119,117,236,
+ 97,111,190,249,102,128,253, 26, 41, 93,206,173, 86,171,227,211,106,181,194, 96, 48,224,244,233,211,110, 69,174,130,131,131, 63,
+140,139,139, 27,181,122,245,106,245,166, 77,155,212, 17, 17, 17,144, 74,165,224,121, 30, 60,207,131,227, 56, 8,130,128,126,253,
+250, 17, 86, 4, 25, 12,198,127,222, 96,153,205,230,248, 30, 61,122, 80, 0, 48,153, 76,161, 50,153, 76, 90,202,128,133,180,107,
+215,238,106,233,239,185,106, 58, 84, 86, 11,196, 55,145,190, 0,128,167,111,102, 57,110, 12,235,227,154, 56,246, 25,122, 59,175,
+104, 95,165, 18, 28,199, 17, 23, 21, 56,212,106, 53,186,119,239, 14,153, 76,134,216,216, 88, 72, 36,146, 50, 23,169, 84, 10,137,
+ 68,114, 79,244,168, 44, 52, 26, 13,102,205,154,101, 55, 71, 80, 43,228, 24,223, 54, 22, 10, 80, 44,189,112, 29, 38,145, 66, 16,
+ 4,199,226,142,166, 84, 42,197,249,243,231, 33, 8, 2,120,158,119,124,218,255,222,178,101, 11, 6, 14, 28, 8, 65, 16,160, 84,
+ 42, 81,124,147,101, 60, 68, 20,126,254, 88,223,161, 41, 0, 96,120, 98,129,163,140,253, 58,184,143, 99,159,103,146,181, 32,132,
+ 64, 42,149,186,119,222, 61, 60,176,109,224, 99, 0,128, 39,175,165, 67, 34,145, 64, 16, 4,156,251,236, 61, 72,100, 50, 8, 82,
+ 41, 26, 77,122, 11,153,153,153,250, 39,158,120,226,160, 66,161,216,238,198,195, 10, 18, 19, 19, 33, 8, 66,185,229,157,227, 56,
+172, 88,177, 2,183,111,223,118,235,216,245,122, 61,222,127,255,125, 16, 66, 74, 92, 47,229,253,237,234,216, 9, 33, 92, 80, 80,
+208,123,113,113,113, 35, 86,175, 94,237, 67, 8,193,151, 95,126, 9,169, 84,138,222,189,123,195,207,207, 15, 59,118,236,128, 84,
+ 42,197,212,169, 83, 89,225, 99, 48, 24,143,134,193, 58,115,230,204, 99,246,191, 91,183,110,125,249,224,193,131,245,156, 66,249,
+176, 90,173, 82,171,213, 90,199,222,108,104,127,242, 29, 58,116,104,133, 79,244, 54,139,249, 30,131, 84, 86, 69,237,206,141,203,
+201, 12, 98,208,160, 65, 0, 80,238,205,198,121,113,227,169, 27, 38,147, 9,130, 32,160,110,120, 53,188,221,179, 41, 90, 82, 11,
+180,133, 4,214, 60, 45,250,107, 44,184, 92,191, 25,150,220,201,192,237,252, 66, 8,130,123,173,165,162, 40,150,107,174,120,158,
+199,162, 69,139, 48,100,200, 16,240, 60, 95,110,190, 48,254, 90,108,102,179,203,114, 88,217,115, 99, 53, 24,138, 34, 75, 2,239,
+ 48, 87, 18,137, 4, 18,185, 28,130, 84, 10, 65, 38, 69,102,102,166,190, 91,183,110, 71,101, 50,217,119,129,129,129, 41, 73, 73,
+ 73, 21,150, 79, 74,105, 73,173, 50, 30, 38,190,253,246, 91,172, 92,185, 18,173, 90,181,114,199, 12,193,100, 50, 65, 42,149,226,
+189,247,222,187,103,251,226,197,139,239, 49, 88, 46,244, 8, 0, 46, 48, 48,240,229, 53,107,214,120,218,127,223,223,223, 31, 18,
+137, 4, 13, 27, 54,132,135,135, 7, 14, 30, 60, 8,155,205,230,246,131, 15,131,193, 96,252,235, 13, 86, 41, 99,192, 25,141, 70,
+ 92,185,114, 5,174,250,165, 82, 74, 43,172, 37,229,126,213, 28,145,171,117, 53,253, 28,235,135, 36,228, 58,110, 92,219, 90,214,
+130, 76,163, 70,236, 59, 31,187,109,134,210,211,211, 29, 79,222,174, 22,119, 42,114,147,201, 4,149, 82,129, 93, 19, 27, 34, 49,
+ 75,134,153, 71,178,241,203,153, 27,144, 72, 36,232, 85,191, 33, 30,147,122,224,173, 26, 50, 76,188,158, 0, 11,165,110,221,192,
+ 40,165,101, 26, 43,251,223,246,166, 18,187,193, 98, 60,124,252,154, 52,119, 68,174, 86,135,123,220, 19,181, 2,128, 45,205, 34,
+ 32,247,208,160,225,255,166,187, 85, 62, 35,251, 60,225,136, 92,253,210, 60, 18,188, 68, 2,137, 76,134,167,207, 39, 3, 40,106,
+ 22,236,220, 48,122, 95, 46, 47, 91, 49, 98,196,136,248,223,127,255, 93,233, 78, 90,203, 50, 88,118,243,243,237,183,223, 98,213,
+170, 85, 16, 4, 1,102,179,217,173,116, 26,141,198,114,141, 83, 85, 34, 88, 0,160,211,233, 76,155, 55,111,198, 23, 95,124, 1,
+ 63, 63, 63,244,232,209, 3,193,193,193, 88,183,110, 29, 40,165, 24, 55,110, 28,148, 74, 37,148, 74, 37, 43,243, 12, 6,227,209,
+ 51, 88,102,179, 57,190, 91,183,110,110,141,248,209,235,245,119, 93, 24,176, 50, 35, 3,206, 81, 1,185,135, 6,114,141, 6,156,
+155,179,116, 89, 44, 22,135, 65,217,185,115, 39,148, 74, 37,122,247,238,125, 95, 17, 44,179,217, 12,153, 84, 2,206, 63, 16,207,
+126,254, 59,178, 10,244,142, 27,218,222, 91,241, 56,149,150,142,137,109,186, 66,173, 76, 71,161,201,228,118, 4,171,180,185, 18,
+ 4, 1,131, 6, 13,130,209,104, 4, 33,164, 68,191, 20, 87,102,149,241,215, 81,222, 32, 4, 66, 8, 20,158, 30,144,169,213,224,
+121,222, 45, 45,231,104,147, 32,147, 65, 34,151, 65, 40, 46,135,246,200, 85, 46, 47, 91,145,156,156,124, 20,128,162,101,203,150,
+ 74,119,210,230,108,176,156, 13,144,179,185,226,121, 30, 22,139,197, 45,243, 98, 52, 26, 33,149,254,217, 19,224,206,157, 59, 21,
+ 26, 44, 23,199, 76, 9, 33, 34, 33, 68,140,138,138,114,124, 55, 40, 40, 8,222,222,222, 16, 69, 17,162, 40, 66,161, 80, 64,169,
+ 84,150,248, 93, 6,131,193,120,100, 12,150,115,115,225,131,186,121, 85,116, 3, 83,122,122, 66,170, 86,219, 71, 43, 81,119,204,
+144,189,207,201,216,177, 99, 43,236,151, 98, 55, 98,110,152, 74,112, 2,143,212,160, 72,216,184, 3,127,222, 32,139, 23, 78,144,
+224,118, 80, 61,240, 87, 78, 67, 34,138,110,221,192, 74, 71,176,198,141, 27,135,101,203,150,129,227, 56, 71,158, 8,130,128,218,
+181,107, 35, 62, 62,158,149,206,191, 1, 90, 65, 52,210,190, 94,225,225, 1,153, 70, 3,222,141,190,119,165,205,144, 84, 46,135,
+ 32,147, 66,144, 22, 53, 11,246,237,219,119, 95,110,110,238,138, 6, 13, 26, 92, 71,209, 52, 6,156,187,215,144, 32, 8, 37,140,
+ 79, 89,230, 74, 16, 4, 88,173, 86,183, 31, 42, 74, 27,157, 57,115,230,220,179,239, 83, 79, 61,229,110, 4,139, 18, 66,168, 84,
+ 42, 69,247,238,221,209,168, 81, 35,108,218,180, 9,162, 40,226,149, 87, 94,129, 82,169,196,188,121,243, 96,181, 90,241,225,135,
+ 31,178, 8, 22,131,193,120,244, 12,214,131, 36,247,210,121, 71, 39, 98,231,102,193,223,218,214,131, 92,163,134, 92,163, 65,187,
+ 77, 7, 28, 79,205,120,239, 83,183, 34, 88,118,131,149,149,149, 85,161,185,114, 39,130,229, 48, 88, 50, 1,235,195,114, 64,101,
+ 18, 8, 38, 75, 9,131,197, 11, 18, 36,250, 69,130,147, 72, 33,216,172,110,105, 82, 74,239,105, 18,124,238,185,231, 64, 8,113,
+140,248,106,220,184,177,243,141,134,221,113, 30, 50, 41,123,182, 59, 58,180, 59, 55, 11,254,220,178, 22, 20, 30, 26,200,212,106,
+116,216,122,216, 17,109,196,188,165, 46, 53,175,126,253, 21,206,207,155, 11,137, 76,134, 39, 79,223,118, 68,174,218,214,173,117,
+212,164,246, 92,113,231,206,157,163, 0,184,193,131, 7,123, 55,110,220,216,173,107,210,222,201,190, 60,115,229,108,176, 44, 22,
+139,219,101,222,157,235,195, 30,197,114,163,188,211,232,232,104,112, 28, 7, 79, 79, 79,104, 52, 26,199, 8, 90,133, 66, 1,149,
+ 74,229,232,191,233,238,117,201, 96, 48, 24,255,106,131,213,164, 73,147, 95, 85, 42, 85,164,187, 34,149,153,116,212,185, 19,177,
+221, 92, 17, 66,160,208,104, 32,211,168, 33,247,208,148, 27,229, 42,239, 70, 99,111, 34,228,121,222,113,179,249,238,187,239,160,
+209,104, 48,114,228,200, 74,247,193,178, 63,205,115, 82, 14, 59,228,123,192,203,132, 18,230, 74, 16, 4,240, 18, 9,238,106,130,
+193, 73, 36, 16,172,174,163, 98,132, 16,228,229,229, 65, 16, 4,188,253,246,219,142, 39,118,103,115,197, 58,182,255,253,136, 78,
+102,164, 68, 84,213,195,195, 81, 62,157,215,187,234,147, 72, 8, 1,181, 90, 32,145,203, 33, 41, 30,136,107,143, 92,153,212,158,
+ 43,234,213,171,231,136, 92,169, 84, 42,251,232, 81,151,154, 28,199,149, 40,211, 43, 86,172, 40, 97,174, 74, 71,176,220, 45,243,
+ 82,169, 20,203,150, 45,171,208, 68, 73,165, 82,183, 71, 80, 2, 69,211, 70,236,219,183, 15,167, 78,157,194,216,177, 99,161, 84,
+ 42,177, 96,193, 2, 88,173, 86,204,158, 61, 27, 74,165, 18, 50,153,140, 21, 62, 6,131,241,223, 55, 88, 50,153, 44,242,208,161,
+ 67,142, 73, 70, 43,250, 52,153, 76, 24, 52,104,144,219,145, 48,177,120, 20, 33, 87,106,164,156,220, 83, 3,121,113,211,139,243,
+122,226, 70, 45,110,127, 2,118, 54, 88,239,188,243, 14, 4, 65,192,178,101,203, 0, 0,147, 39, 79,118,187, 15,150, 93, 19, 54,
+130, 36,122, 19, 77, 63, 31, 8,211,106, 11,210, 14,157,133, 32, 8, 8,104,253, 24,196,150, 3,161, 83,106, 32,216,172,110,143,
+ 34,204,206,206, 70,124,124, 60,120,158,199,164, 73,147, 74,204, 85, 84,234,152,177,115,231, 78,214, 7,235,111, 52, 88, 92,113,
+255,170,178,202,103, 41,243,229,186,157,204,102, 45,234,119, 37,253,115,180, 96,110,110,238,138, 59,119,238, 28, 3,192,141, 24,
+ 49,194, 91,165, 82,225,235,175,191,214, 1,144,173, 91,183,206,165,203,178,151,155,242,204, 85, 85,154, 8,237,145, 96,231,126,
+ 93,247,107,176,236,102,144, 16, 2,155,205, 6,165, 82, 89, 34,114,165, 80, 40, 32,151,203, 89,193, 99, 48, 24,143,134,193,226,
+ 56, 14, 70,163, 17,151, 46, 93,114,247, 9,213,237, 73, 71,253,154,183,194,208,219,121, 32,132, 96, 71, 92, 3, 71,179, 75,219,
+159,246, 57, 42,236,219,239, 79,134, 68,173,129, 95, 92,143, 74,221, 24,156, 13, 86,110,110, 46, 36, 18, 9,222,123,239, 61,112,
+ 28,135, 15, 63,252, 16,161,161,161, 72, 77, 77, 69,199,142, 29,221,122,154,231,109, 60,130,159,137,134,234, 57, 47,120, 62,211,
+ 1, 62,221,223, 65,178, 73,192, 97,131, 10, 29, 12, 23, 33,219, 49, 31, 38,209,230,150,193, 34,132,192,106,181, 98,223,190,125,
+ 37, 58,178, 3, 69, 77,135,246,233, 46, 44, 22, 11,204,102, 51, 62,252,240, 67, 86, 58,255, 6,194, 31, 31,128,103, 83,116, 0,
+128, 95,157,154,173,219,111, 60,224, 40,159,241,115, 38, 65,162,214,192,167, 69,156, 91,154,245, 95,153,130,250,175, 76, 65,102,
+102,166,190,107,147, 6,251, 11,165,170,111, 27, 54,108, 88, 34,114,165, 80, 40, 72,241,255,196,157,178,196,113, 28,120,158,119,
+152, 43,187,153, 42,203, 96,185,251, 0, 96,177, 88, 32,149, 74,221, 54, 88,238,194,113, 28,158,127,254,121, 4, 7, 7, 59, 34,
+ 87,239,190,251, 46,148, 74, 37, 94,127,253,117, 88, 44, 22,204,159, 63,159, 21, 62, 6,131,241,223, 55, 88, 70,163, 49,161,107,
+215,174, 40,103, 91,168, 92, 46, 47, 17, 6,178, 79, 58, 90,186,169,144, 16,210,141, 82,186,171,172, 27,132,243,104, 44,121,169,
+168,149,212,195, 19, 18,181, 6, 92, 25,209,166,210,154,246, 39,227,210, 6,203,190,228,229,229, 65, 34,145,224,139, 47,190,128,
+167,167,167, 99,180, 94, 69,154,246, 8, 22,207,243,208, 37, 22,224,242,220, 93,144, 41, 14,163, 86,143, 33, 8,150, 40, 33, 61,
+184, 1,122,155,165,194,137, 70,203,210,172, 83,167, 14,102,204,152,113,207,244, 12,229,209,172, 89, 51,151,154,247, 11,211, 44,
+ 91,211,157,242,201,203,229, 46,207,187,125,187, 61,114, 85, 40, 85,125, 27, 31, 31,111,143, 92,121,169, 84, 42, 44, 94,188, 88,
+ 7,128,155, 61,123,182,170, 70,141, 26,188, 59,233,228,121, 30,223,125,247,221, 61, 29,218,203, 50, 87,101, 77,251, 81, 86, 58,
+173, 86,235, 61, 6,107,208,160, 65,247,140, 30, 44, 47,130, 85, 86, 58,237,125,213,252,252,252, 28,145, 43,155,205,230, 24, 61,
+104,177, 88, 96,181, 90,203,109,106,101,229,147,105, 50,205, 71, 71,243,145, 48, 88,167, 79,159,238, 85,222, 23,218,181,107,119,
+237,208,161, 67,181,109, 54,155,243, 59, 10,165, 6,131,161, 78,255,254,253, 93, 62, 42,139,162, 8,185, 92, 14, 74, 41,154,190,
+245, 1, 8,185,183,191,149,119,219,174, 32,130, 0,155,205, 6,139,197,226,114,122, 8,189, 94,239,184,153,148,215,193,189,176,
+176,176,194,121,126, 74,223, 20, 12, 6, 67,137, 27, 21,161, 34,110,239,254,241,158,209,132,149,137, 16, 0,128, 66,161, 40,209,
+239,202, 85, 82, 88, 17,125,184,216,167, 84,160,148,162,193,248,105, 69,231,169,184,185,208,110, 2,188, 98,227, 64, 36, 2, 68,
+ 0,102,179,217, 85,249, 36,246, 62, 87,148,210,111,250,247,239,127, 21,128, 17, 0,213,104, 52,114,137, 68, 34, 2,200, 6, 64,
+115,114,114,188,146,147,147, 69,131,193, 80,221, 85, 58,247,237,219,135, 27, 55,110,160,121,243,230,142, 87, 54,217,155,221,236,
+ 38,198,217, 96,185, 27,193, 42,107, 78,173,242,102,115,119, 23,158,231,225,229,229,229,152,196, 84, 42,149, 66,165, 82, 1, 0,
+230,207,159,239,200,115, 6,131,193,248,207, 27, 44, 23, 6,137, 47,175,249,208, 85, 83,161,205,102, 75,106,217,178,101,101,127,
+ 47,205,197, 13, 49,105,255,254,253,210,138, 94,242, 92,198, 58,151,154,199,142, 29,147, 86,240,253,178,254, 78,115,117,236,173,
+ 90,181, 42,243,251,229, 97,181, 90,147, 89, 17,125,120, 88,173,214,242,203,231, 59, 31,148,119, 94,211, 92,152,150,235,181,107,
+215, 78,209,104, 52,191, 4, 6, 6,102, 29, 58,116,200,175, 69,139, 22,126,206,251,180,104,209, 34,184,212,215, 76,168, 96,122,
+ 18, 66, 72,210,179,207, 62, 43,117, 81,198, 75,255,159,228,226,161, 34,233,194,133, 11,210,178,180,202,251,164,148, 38,185,145,
+173,183,123,245,234,197, 57,127,183,188,178,111,181, 90, 51, 88, 41,100, 48, 24,143,172,193, 50, 24, 12,137, 93,187,118, 45,179,
+215,172, 78,167,187, 83,209,119, 47, 92,184, 16,251,160, 15, 32, 41, 41,169,237,191, 65,243,175, 56,118,198, 63,255, 28, 93,184,
+112,161,229,131,214,188,115,231, 78,219,127,131, 38, 0, 92,188,120,177, 13, 43, 89, 12, 6,131, 25, 44, 55,112,119, 58, 6, 6,
+131,193, 96, 48, 24,140, 71, 21,142,101, 1,131,193, 96, 48, 24, 12,198,131,133, 0,232, 86,214,134,202,140, 14, 32,132,116,171,
+236, 15,187,210,103,154, 76,147,105, 50, 77,166,201, 52,153,230,127, 79,211,149,246,127,102,116, 34,165,244, 47, 91, 0,116, 99,
+154, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,212, 22,214, 68,200, 96, 48, 24, 12, 6,131,241,128, 17, 88, 22,252, 61, 16,
+ 66,120, 74,169,237, 1, 74,250, 0, 40,239,133,110, 38, 0, 57, 85, 73, 38, 0,105,241, 98,159,168,200, 2,192, 92,188, 80,215,
+ 18,179,184,148, 20,159, 24,106,147,180,160,132, 72, 68, 17,103,170, 87, 15, 63, 13,244, 50, 1,128, 38,168,126,125,141, 90,217,
+205,104, 54, 69,202, 37,178, 75,185,218,194,157,134,180,171, 9,172,132, 48, 24, 15,159,216,216,216, 81,148,210, 57, 69, 85, 20,
+121,239,196,137, 19, 95,178, 92, 97, 48, 30,176,193,170, 85,171,214, 9,142,227,194,236,147, 97, 86, 52,231,142,253,211,102,179,
+ 37, 93,190,124,217,173,161,238,132, 16, 33, 56, 56,248,105,181, 90,221,153,231,249,118,197,223, 63,164,213,106,127, 79, 77, 77,
+ 93, 71, 41,181, 86,229,128,162,162,162, 60, 13, 6,195, 32, 66,200, 48, 0,160,148,126,175, 80, 40,126,188,117,235, 86,126, 21,
+141, 80,173,160,160,160,239, 37, 18, 9,159,152,152,216, 25, 0,194,195,195,127, 55,153, 76,182,244,244,244, 97,148,210, 27,149,
+212,227,164, 82,233, 7,113,113,113,237, 9, 33, 43, 41,165,139, 30,208,185,148,115, 28, 87,166, 49, 17, 69, 49,162, 10,122, 82,
+ 0, 94, 95,124,241,133,223,170, 85,171,154, 38, 37, 37, 53, 4,128,176,176,176,243, 35, 70,140, 56, 61,126,252,248, 44, 0,121,
+197, 70,171, 92, 82, 82,124, 98,210,239,222, 26,155,150,126,105, 16, 0, 4, 5, 55,252,145,231, 57,105,104,232,169, 35, 42,255,
+ 97,254,117,235,213, 28,243,195,215, 95, 72, 35, 34,195,177,231,240,169, 38,227,255,247, 70,140, 34,176,238,167,204,100, 61, 60,
+234,212,169,115,130,227,184,176,202,204, 37, 87,252, 6,133,164,139, 23, 47,198,150,167,201,243,124,152,171,185,186, 74,175, 19,
+ 69,241,214,133, 11, 23,202,156, 50,162,110,221,186, 71,120,158,143,116,183, 62,114, 78,103,121, 83,112,212,173, 91,247, 4,207,
+243, 97,174, 52, 75,175, 19, 69,241,214,249,243,231,219,186,171,233, 98, 14,189, 42,165,211, 29,205,138,210, 9, 0,157, 58,117,
+146,107,181,218,239, 53, 26, 77, 99,173, 86, 59,138, 82, 58, 99,239,222,189,129, 28,199,161, 91,183,110, 51, 98, 99, 99,227, 21,
+ 10,197, 66,189, 94,127, 90,163,209, 12,221,187,119,175,145, 93, 49, 12,198,125, 26, 44,142,227,194, 78,157, 58, 21,160, 86,171,
+ 81,108, 84, 96,159,189, 93, 20, 69,136,162, 8, 74,169,227,211,106,181,162, 83,167, 78,110,253,104, 88, 88, 88,195,186,117,235,
+174, 31, 55,110, 92,245,190,125,251,202, 2, 3, 3, 65, 8,193,221,187,119,235,252,242,203, 47,195, 23, 44, 88,240, 78, 88, 88,
+216,192,164,164,164,243,238,154,150,224,224,224,174, 0,158,107,216,176,225,147,147, 39, 79,150,182,107,215, 14, 54,155, 13,123,
+246,236,137,155, 55,111,222, 23, 33, 33, 33, 27, 0,172, 72, 77, 77,221, 77, 41, 21,221,212,109, 26, 25, 25,249,227,129, 3, 7,
+ 34, 19, 18, 18,108, 3, 6, 12, 88, 9, 0,135, 15, 31,110, 44,138, 34,105,215,174,221,175,132,144, 65,148,210,211,149,200,243,
+254,227,199,143, 31, 56,110,220,184,106, 35, 71,142,124, 6,192,162,226,223, 34,197,249, 76, 43,121, 14, 29,145, 43, 74,105, 69,
+211,107, 7, 85, 34,146,165,142,143,143,247,105,219,182,237,203,233,233,233, 19,157,117,211,210,210,112,242,228, 73,243,220,185,
+115, 63, 63,124,248,240,194,200,200,200, 28, 0,218,242,132,168, 77,210, 34, 45,253,210,160, 14,109,190,240, 2,128,117, 91, 94,
+ 30,114,252,116,134,199,207,191, 45, 25, 46, 83, 72,141,171,150,126, 46,173, 93, 43, 2,123, 79, 92,199,177, 75,217,164, 97,251,
+ 62, 66,222,207, 43,187, 3, 88,194, 46,207,135, 3,207,243,161, 39, 78,156, 8, 80,169, 84,101,190,208,189, 84,191, 11, 16, 66,
+ 64, 41, 69, 92, 92, 92, 69,154, 97,167, 78,157, 10, 80, 40, 20,142,186,163,116,157, 97,175, 87, 28,101,133, 82,116,232,208,193,
+ 92, 65,157, 84,227,143, 63,254, 8, 80,169, 84, 14,157,178,210, 87,218,104,116,232,208,161,194,116,158, 60,121,210,145, 78,119,
+ 52, 41,165,104,215,174,157,205,213,177,219,223, 88,225,234,184,237,154,109,218,180,161,149,209,116, 51,157, 21, 62, 0,105,181,
+218,239,215,173, 91,247, 68, 96, 96, 32,250,247,239,191,163, 65,131, 6, 50,149, 74,133,223,126,251, 13,225,225,225,254, 30, 30,
+ 30,219,222,127,255,125,124,250,233,167,213,119,238,220,185, 6,192, 19,236,138, 97, 48,238,223, 96, 65,173, 86, 99,237,218,181,
+142,215,195,216, 95,147, 81,214,223,213,171, 87,119,235, 7,131,130,130, 98, 35, 34, 34,246,109,218,180, 73, 25, 16, 16,224, 88,
+111, 50,153,224,233,233,137,231,158,123, 78,214,189,123,247,218,195,134, 13, 59, 26, 20, 20,212,241,238,221,187, 39, 42,210, 11,
+ 14, 14,126, 50, 38, 38,230,203,137, 19, 39, 6,246,235,215, 15, 62, 62, 62, 37,182,247,233,211, 7,189,123,247,150,222,186,117,
+107,200,186,117,235,134,172, 92,185,242,110,112,112,240,248,212,212,212, 13, 21, 58, 12,181,186, 91,147, 38, 77,190,222,179,103,
+ 79,152,183,183, 55, 66, 66, 66,184,183,223,126,187, 97,205,154, 53,149, 65, 65, 65, 92,106,106, 42, 54,108,216, 80,115,196,136,
+ 17,155, 21, 10,197, 40,131,193,176,219, 13,195, 38,243,245,245,157, 50,122,244,104,191,252,252,124,235,169, 83,167,174,219,215,
+203,229,242, 25,173, 91,183,110, 70, 8, 89, 75, 41, 93, 81,149,200, 21,165, 52, 31,127, 54,229,217,177,216,183,187, 25,201,146,
+157, 57,115,198,183, 77,155, 54, 27,140, 70, 99,179,177, 99,199,222,153, 59,119,174,210,211,211,211, 19, 0,201,207,207,207,153,
+ 53,107,150,105,222,188,121,211,234,215,175,223,245,200,145, 35, 79, 54,105,210,196, 82,108,222,238, 53, 88,132, 56,210,147,152,
+156,129,125,135, 69,217,140,215, 39,135,125, 52, 39,242,246, 31, 23, 19, 69, 65,233,137,173,251, 47, 32, 45,171, 16,191, 30,185,
+136, 32, 63, 15, 34,149, 75, 98,188,195, 98, 58,230, 37, 95,220, 95, 5,195,201,168, 2, 42,149, 10, 91,183,110,189,231, 21, 83,
+101,189,126, 74, 16, 4,120,123,123, 87,248, 54, 2, 66, 8, 20, 10, 5,118,238,220, 89,226,245, 82,101,253,109,255,244,242,242,
+ 2,165,180,194, 87, 28, 40, 20, 10, 28, 58,116, 8, 28,199,221,243,253,210,105, 22, 4, 1,106,181, 26,132, 16,206,149,230,254,
+253,251, 93,106,217, 63, 53, 26, 13, 0, 84,248,254, 33,185, 92,142,131, 7, 15,150,123,204,165,255,214, 20,191,239,210,149,230,
+161, 67,135, 74,188,162,171,244,171,187,156,255, 47,126, 56,174, 80, 84,169, 84, 54, 14, 12, 12,196,241,227,199, 49,115,230, 76,
+ 89, 76, 76, 12,174, 95,191, 14, 66, 8, 70,142, 28,137, 6, 13, 26, 32, 53, 53, 21, 13, 26, 52,192,193,131, 7,155,178, 43,133,
+193,120, 0, 6,203,142, 59,230,202,254, 30,177,210, 21, 68,233,161,150, 17, 17, 17,114,141, 70,243,211,214,173, 91,149,126,126,
+127,190, 45,196,104, 52,162,160,160, 0,133,133,133, 40, 40, 40,128,135,135, 7, 22, 46, 92,168, 28, 58,116,232, 79, 17, 17, 17,
+117, 18, 18, 18,140,229,105, 18, 66, 62, 63,115,230, 76,160,213,106,133, 76, 38, 43,215, 44,214,170, 85, 11,227,199,143, 71, 92,
+ 92, 92,208,224,193,131, 63, 7,176,161, 60,205, 98,227,246,213,225,195,135,195,164, 82, 41,174, 93,187,134,164,164, 36,140, 25,
+ 51,166,134, 40,138, 72, 76, 76,196,245,235,215,145,156,156,140,101,203,150,133, 13, 29, 58,116, 33,128,218, 21, 29,123, 49, 47,
+ 78,154, 52,169,142,175,175, 47,247,241,199, 31,231, 21, 22, 22, 46, 45, 94,255,250,252,249,243,135,118,232,208,161,218, 11, 47,
+188, 0, 66,200, 15,148,210,123, 12, 75, 41,205,178, 34, 87, 54, 0,151, 75,125, 45,186, 84,100, 43, 8, 69,239,194,203, 45, 67,
+147, 0,240,234,209,163,199, 36,163,209,216,236,224,193,131, 55,218,181,107, 87, 3, 64, 42,128, 12, 0,240,242,242, 82,127,254,
+249,231,129,125,250,244,185,218,165, 75,151,102, 61,122,244,152,148,145,145, 49,183,120, 59, 45,173, 41,138, 56, 19, 20,220,240,
+199,253, 71,198, 15,218,123,200, 36,157,252,191,119,238, 84, 15,143,200, 59,115, 45,219,118,241, 86, 6, 10,244, 86, 60,209,165,
+ 17, 0,160,117,195,234,248,114,237, 65,188,242,234,155,146, 13, 63,174,124,234, 6,133, 26,192, 47, 21,228,231,125,193, 52,255,
+ 52, 67,162, 40, 66, 34,145,224,177,199, 30, 3, 33,228,158,119,109, 74, 36, 18, 28, 57,114, 4, 93,186,116,129, 68, 34,193,243,
+207, 63,239, 50,157,162, 40, 66, 16, 4,244,232,209, 3, 86,171,245, 30,189,210,102,193,254,142,206,138, 52, 41,165, 16, 4, 1,
+ 28,199,149,105,126, 74, 47,101,153,150,178,142,221,149,150,243,182,178, 94,247, 83, 90,211,158, 78,119,204,149, 93,211,221,116,
+ 10,130,128,182,109,219,226,244,233,211, 21,154, 45,142,227, 92,214,201, 90,173,246,185,254,253,251,239, 24, 59,118,172, 2, 0,
+178,178,178, 28, 47,162,231,121, 30, 87,174, 92,129,201,100,194,234,213,171, 97, 52, 26,199,178,235,136,105,254,149,154,143,140,
+193,178, 87, 18,238, 26, 44,119,222,173, 71, 41, 29,247,250,235,175, 7, 86,100,174, 10, 11, 11,145,146,146,130, 26, 53,106,224,
+233,167,159, 14, 92,185,114,229, 56, 0,159, 84, 32, 43,229,121, 30,199,143, 31, 71,122,122, 58, 26, 53,106,132,200,200,200, 18,
+ 59,220,188,121, 19,219,182,109, 67,110,110, 46,154, 55,111, 14, 20,245, 47, 42,147, 38, 77,154,204,140,142,142,238,209,169, 83,
+ 39,185, 68, 34,193,153, 51,103,208,172, 89, 51,172, 93,187, 22,213,171, 87,135, 74,165,194,213,171, 87,209,168, 81, 35,236,219,
+183, 15,213,170, 85, 67, 76, 76,140,188,121,243,230, 7,178,179,179,127, 79, 72, 72,152, 89, 78,126, 74, 67, 67, 67,223, 24, 61,
+122,180, 44, 37, 37, 69,252,238,187,239, 14, 83, 74, 15, 19, 66,198,188,249,230,155,207,244,236,217,179,218,169, 83,167,242,255,
+248,227,143, 63,202, 50, 87,110, 70,174,172,165,111, 70, 54,155,205,168,215,235, 77, 70,163,209,194,113, 92, 2, 33,196,100,179,
+217,234,148,247, 48,255,220,115,207,213,204,204,204,124,229,213, 87, 95,141, 47, 54, 87, 87, 80,212,177, 29, 0, 96,181, 90,141,
+133,133,133,249,109,218,180,169, 49,116,232,208, 27,107,214,172,121,229,185,231,158, 91,183, 98,197,138, 66, 0,250,210,130,213,
+171,135,159,230,121, 78,170, 45,240,189,181,126,221,242,137,219,182,140, 11, 79, 76, 76,174,237,231, 95, 77, 43,213, 84, 75, 89,
+247,253,183, 39, 0,152, 82, 50,242,113,238,230, 93, 72, 36, 60, 46, 37,230,161, 67,175,167, 37, 55,174,205,105,111, 55, 88,140,
+191, 20,106,127, 57,244,222,189,123, 43,140, 96, 29, 57,114, 4, 18,137, 4, 74,165, 18,107,215,174,173, 80,212,110, 8,236,209,
+ 33, 87, 38,198,213,203,207,237, 38,195,254, 2,246,210,203, 87, 95,125,133, 87, 95,125,181,196,111, 20,107, 18,119,210, 89, 86,
+250,106, 68, 68, 32, 61, 45,173,196, 58, 55, 94,210, 14,155,205, 6,137, 68,130,101,203,150,161, 79,159, 62,248,249,231,159, 43,
+252, 44, 54,182,212,157,116,182,109,219, 22,102,179,217,145,230, 43, 87,174,148,169,187,104, 81,197,221, 59, 99, 99, 99, 71, 17,
+ 66,230,212,173, 91, 87,222,185,115,103,236,223,191, 31,115,230,204, 17,173, 86,107, 38, 0,180,109,219,182,218,196,137, 19,201,
+201,147, 39,161,209,104,144,145,145,177, 34, 54, 54,118, 54,235,248,206, 96, 60,128, 8,150,189,210,117,101,174,236, 79,138,174,
+ 76,150, 70,163,233,221,171, 87, 47,135,185, 49, 24, 12, 14, 99,101, 55, 87,246,255,175, 94,189,138,152,152, 24,169, 70,163,233,
+237,194, 96, 21, 29,136, 32, 32, 36, 36, 4,153,153,153, 56,127,254, 60,106,212,168, 1,139,197,130,237,219,183, 35, 47, 47, 15,
+ 18,137, 4, 82,169, 20,102,115,133, 93, 18, 16, 29, 29,253,216,170, 85,171, 98, 87,174, 92,153, 99,127,130,251,254,251,239, 65,
+ 41, 69,181,106,213,160,211,233,144,150,150,134,223,127,255, 29, 86,171, 21, 26,141, 6,161,161,161,138,113,227,198,181,159, 53,
+107,150, 4,192,204,114,164, 91, 61,245,212, 83,158,158,158,158,248,223,255,254, 71,205,102,243, 39,132,144,214, 79, 62,249,228,
+ 27,227,199,143,247, 77, 72, 72, 48,189,248,226,139, 39,204,102,243,231,197, 55, 19, 9,165,212,226,194,176,150, 27,185,178, 88,
+ 44,246, 60,141, 47, 44, 44,132,191,191,127, 13, 23,125,180, 0, 64,122,232,208,161,182, 0,248,217,179,103, 43, 80,244, 2,107,
+ 71, 26, 76, 38, 19, 10, 11, 11,161,213,106, 45,121,121,121,233, 83,166, 76,177,174, 89,179,134, 47,254,206,165,178, 12, 22,208,
+203,212,160,129, 90, 70, 41,255,230,146, 37, 75, 52, 61,123,246,228, 52, 26, 13, 10, 10, 10, 60,127,253,237, 55, 77,215,206,237,
+163,230,126,240,209, 14,207,176, 70,105,135,206,220, 66,242,221, 60,152, 44, 22, 68, 5,123, 21,197,191, 24,127, 57,197, 29,172,
+ 29, 17, 44,103, 51,177,127,255,126,244,234,213,203,113,173, 75,165, 82,199,126,238,104, 10,130,128, 94,189,122,221, 19,209,217,
+187,119,111,153,209, 38, 87,117,136,179, 25, 42,109,138,202, 50, 94, 28,199,193, 85, 43,179, 61,122, 87,150,201,114,142,226,151,
+ 50,109,174, 30, 38, 33, 8, 2,198,143, 31, 15,137, 68,130,169, 83,167, 66, 16, 4, 52,109,218, 20,130, 32,160, 77,155, 54,144,
+ 72, 36,232,210,165, 75,185,145,182,178,204,165, 32, 8, 56,122,244, 40,154, 53,107,230, 72, 83,211,166, 77,209,162, 69, 11, 8,
+130,128,184,184, 56, 72, 36, 18,244,232,209,195,165,166,189, 67,187, 70,163,193,213,171, 87,193,243, 60, 8, 33, 89, 39, 79,158,
+ 12, 4,128,153, 51,103,102,234,245,122, 63,131,193,128,174, 93,187,162,125,251,246,213,190,255,254,251,183, 1, 48,131,197, 96,
+220,111, 4,203, 94,233,186,107,176, 92, 97, 48, 24,154,216,163, 87,101,153, 43,231, 79,147,201,132,154, 53,107,194, 96, 48, 52,
+169,236,205, 34, 56, 56, 24,102,179, 25,203,151, 47,135, 84, 42,133, 84,250,167,175, 48,153, 42, 14, 14, 93,188,120, 49,254,232,
+209,163,205,154, 55,111,238,179,113,227,198,140,238,221,187, 87,235,217,179, 39,148, 74, 37,244,122, 61, 44, 22, 11, 90,183,110,
+141,232,232,104,164,167,167,227,215, 95,127,205,172, 83,167,142,255,177, 99,199,196,187,119,239,222,174, 64,186,107,215,174, 93,
+ 65, 8,193,175,191,254,154, 69, 41, 61,169, 84, 42, 55,206,157, 59,215,219,100, 50,137,207, 60,243, 76, 98,118,118,246, 20, 0,
+ 22,185, 92,254, 73,207,158, 61, 91,241, 60,191,214,102,179, 85,186, 50, 43,157,183, 90,173, 22, 10,133,194,157, 41, 33, 36,217,
+217,217, 13, 1, 64,173, 86,251, 2,112,140,144,212,235,245, 37, 76,176,201,100, 50,248,250,250,170, 1,160,248, 59,146,114,206,
+ 71, 53,149, 74,181,254,246,237, 91, 30,206,145, 75,111,111,111, 12, 27, 58,148,107,215,182,173,172,113,147, 38, 61,222,250,116,
+229,218, 16, 63, 79, 83, 84,136, 31, 44, 54, 11,118,237,216, 46, 82,209,178,131, 93,162, 15, 7,187,201, 40, 29,193,146, 72, 36,
+216,183,111,223, 61,235,164, 82, 41,182,110,221,234,150, 25,178,155,169,242,154,200, 74,153, 33,226, 78, 84,157,231,121, 44, 91,
+182, 12,162, 40, 98,226,196,137, 37,154, 13,157,245,237,102,199,149,166,253, 59,209,239,136, 0, 76, 72,250, 76,238,248,126,233,
+244, 22,107, 18,119,204,208, 23, 95,124,225, 86, 4,235,241,199, 31,119,203,180, 57, 31,151, 61, 93,167, 79,159, 46, 83,119,201,
+146, 37, 46,251,180,137,162,136, 95,126,249,197, 97, 78,237,188,253,246,219,163, 61, 61, 61, 53,251,247,239,199,221,187,119,161,
+213,106, 81, 88, 88, 8, 31, 31, 31,239,110,221,186,157,185,123,247,110,194,197,139, 23, 89,135,119, 6,163,170, 17, 44,123,165,
+235, 78, 51, 97, 89,237,253,101,232, 9,132, 16, 24, 12,134, 50,141,149,179, 41, 48,155,205,200,202,202,130, 40,138, 85,158,171,
+171,172,138,213,149,193, 58,127,254,252,200, 81,163, 70,165,120,121,121, 53,206,202,202, 74,149,203,229,113,251,247,239, 15, 55,
+155,205,240,244,244,132,167,167, 39,182,109,219, 6,111,111,111,188,250,234,171,119,244,122,253, 97,181, 90, 29,168,215,235,207,
+222,189,123,247,173,114,157,139, 68,210,181, 67,135, 14, 56,121,242, 36,114,115,115,247, 16, 66, 26,191,240,194, 11,221,195,195,
+195,201,156, 57,115, 12, 55,110,220,248, 10, 64,134, 90,173, 94,190,106,213,170,142,205,155, 55,215,140, 24, 49, 2,132,144,175,
+ 41,165, 6,119,143, 89,171,213,150, 48, 86,249,249,249, 40, 40, 40,128, 90,173,182,186,153,103, 18, 20,245,165,178,247,167,114,
+156,155,226,232,149,253,252, 80, 65, 16,104,209, 46, 84, 82,158,158, 90,173,158,189,114,229,202, 18,125,238,236,209,209,180,180,
+ 52,120,122,122,226,237,183,222,146,190,251,218, 11,205,120, 77,224, 17,142, 35, 48,153,105, 46, 21, 77,219,181,105,131, 15,176,
+ 75,244,225, 68,176,236,134,160, 95,191,126,247, 52, 11, 74,165, 82,236,220,185, 19, 3, 6, 12,112, 60,176, 20, 55,181,187,101,
+ 8,250,246,237,235,136, 4,109,223,190,189,204,230, 61,123, 4,202, 29, 35,104,223,119,194,132, 9, 16, 4, 1, 95,126,249, 37,
+ 38, 77,154, 4,142,227,240,217,103,159,129,227, 56,204,152, 49,163, 82,245,132,189, 46, 75,248,168,232, 51,108, 82, 62,178, 22,
+ 5, 2, 0, 60, 60, 61,237, 59, 86, 74, 83, 16, 4, 71,228,170, 73,147, 38,144, 72, 36,104,211,166, 13, 4, 65,112, 68,174,122,
+247,238,237, 60,173, 2,117, 71, 83, 16, 4, 92,187,118,205,145,230, 54,109,218,148,136, 92, 9,130,224,150, 97, 35,132,188,219,
+165, 75,151, 57, 97, 97, 97, 1, 99,199,142, 37, 60,207, 35, 54, 54,214,127,198,140, 25,121, 18,137, 68, 57,121,242,228,178,174,
+107, 9,128,198,245,235,215, 87,179, 43,135,193,184,143, 8, 86,101, 12,150, 59,149,163, 74,165, 58,151,153,153,217, 70, 46,151,
+151, 48, 87,101, 25, 45,158,231,145,158,158, 14,149, 74,117,238, 65, 30,176,171, 38,194, 98, 51,243,154, 83, 62,180,120,250,233,
+167,215,172, 93,187, 54,106,215,174, 93, 56,118,236, 24,170, 85,171,134,185,115,231,222, 74, 72, 72, 24, 74, 41,253,195,157,223,
+173, 89,179,102, 3,181, 90,141,195,135, 15, 3,192, 1, 0,207,189,242,202, 43,196,106,181, 98,225,194,133, 58, 0, 59,189,188,
+188, 54,252,244,211, 79, 77, 26, 53,106, 36,219,181,107, 87,193,177, 99,199,246,186,105,174,108,162, 40,222, 99,172,156,243,212,
+195,195,195,157, 8,150,197,203,203,235,124,126,126,254,211,122,189, 62, 95, 46,151,123,228,231,231, 27,157,141,149, 93, 95, 16,
+ 4,201,181,107,215, 82, 0, 68,121,121,121,157,135, 83, 83, 98,137, 2, 38, 8, 93,187,118,237, 42,148, 62, 7,105,105,105,184,
+123,247, 46,204,102, 51,154, 55,111, 78,120, 98,225,179,239,156, 29,205, 46,201,135, 15,199,113,212,126,173,219, 71,253,149, 53,
+114,112,251,246,237,142,255, 57,142,195,175,191,254,234,150,105,219,185,115,103,133, 29,209, 75,117, 72,119, 25, 10,183,239,191,
+112,225,194,162,215, 81, 20, 71,174, 56,142,195,244,233,211, 33,151,203, 49,103,206, 28, 76,159, 62,189, 68, 84,198, 85, 4, 75,
+ 16, 4, 68, 76,213, 57, 63, 20, 21, 93, 20,197,253,157, 8, 33,206, 38,203,173, 72,155,171, 14,238,238, 68,254,203, 74,167, 66,
+161, 40,183,131,123, 41,205,114,127,224,196,137, 19,223, 52,107,214,236, 70,181,106,213,118,182,105,211, 70,126,226,196, 9,140,
+ 27, 55,142, 24,141, 70,207, 93,187,118, 57,126,183, 44,163,167,213,106,149,236,202, 97, 48,238, 35,130, 85,153, 78,238,238,244,
+ 75,208,235,245,187,247,238,221,219,162,127,255,254, 66, 69,205,131, 90,173, 22,129,129,129,184,121,243,166, 85,175,215,187,156,
+254,192,102,115,127, 66,116, 87, 6,171,140, 60,248, 35, 38, 38,198,106,177, 88, 80,187,118,109,132,134,134,194, 96, 48, 96,222,
+188,121, 86,119,205, 21, 33, 68, 26, 27, 27,203, 3, 64, 78, 78, 14, 0,100, 1,168, 83,167, 78, 29,156, 60,121, 18, 57, 57, 57,
+155, 1,116,123,247,221,119,155,182,106,213, 74,186,118,237, 90,221,216,177, 99, 55, 91, 44,150, 57,238,232,139,162,104,178, 90,
+173,145, 28,199,153,115,115,115,147,157,243, 51, 48, 48,208, 87,173, 86,147,180,180, 52,139, 59, 6,171,113,227,198,199,239,220,
+185,131,217,179,103,103,204,157, 59,183, 78, 65, 65, 65, 78, 94, 94,158,213,217,100, 25, 12, 6,206,223,223, 95,190,104,209, 34,
+ 37, 0, 52,110,220,248,120,121, 6, 75,171,213,134,171, 84, 42,199,255, 70,163, 17,119,239,222,197,221,187,119,145,150,150,134,
+130,130, 2, 68, 69, 69, 65,167,211,213, 96,151,227,223,135,115, 51,153,243,245,237,124, 3,175,204,181,238,172,217,175, 95, 63,
+ 71,223, 45,123, 68,204,190,172, 95,191,190, 68,199,113, 87, 77,111,118,131,181,112,225, 66, 76,152, 48, 1, 10,133, 2,159,127,
+254,121,137, 38,194, 50, 76, 1,113, 39,157,145,211,244,184,187,192, 23, 18,137, 4,126, 99,211, 74, 52,197,149, 49, 26,207, 45,
+ 35, 56,119,238,220, 7,214, 68,104,215,172, 81,163,232, 82, 89,182,108, 25,158,126,250,105, 28, 56,112,160,202, 77,132,145,145,
+145,171,230,207,159, 47,191,120,241, 34,242,243,243,145,145,145, 1,163,209,136,164,164, 36, 71,222,148,133, 78,167, 83,176,171,
+134,193,184, 15,131,229,220,249,211,149,193, 42,238, 32,233,202, 8,124,254,206, 59,239,188,210,190,125,123, 95, 15, 15, 15,164,
+164,164,220, 99,174, 10, 11, 11,161,209,104, 96, 50,153,176,119,239,222,124, 81, 20, 63,119,101, 10, 44, 22, 11, 2, 2, 2,144,
+153,153, 9,177,156,126,209, 28,199, 65,169, 84, 66,171,213,162, 60, 51, 80, 81, 5,108, 54,155, 97,177, 88, 96,177, 88, 42,109,
+210, 0, 40,237, 19,182, 22,255,190, 54, 36, 36,164,166, 66,161, 64,124,124, 60, 0, 92, 3,208,185,103,207,158,146,172,172, 44,
+250,226,139, 47, 30,161,148,142,119, 49,155,189,105,255,254,253,145, 0,160, 84, 42,175, 2, 64, 82, 82,146, 37, 55, 55,183, 68,
+100, 80,165, 82,209, 1, 3, 6, 4, 83, 74,177,127,255,254, 72,169, 84, 74, 81,206,156, 85, 0, 12,155, 55,111,190,232,229,229,
+181,230,131, 15, 62, 24,218,167, 79,159, 11, 13, 27, 54,140,212,106,181,233,122,189, 94,111, 48, 24, 40,207,243, 82, 31, 31, 31,
+197,142, 29, 59,110, 28, 57,114,164,155,167,167,231,154,205,155, 55, 95, 4, 80,102,164, 77,173, 86, 39,233,116,186, 8,141, 70,
+ 3,189, 94, 95,194, 92,221,189,123, 23,148, 82,220,186,117, 11, 42,149,234, 14,187, 28,255, 30,156, 35, 46,165, 35, 45,165,215,
+185,107,174,156,205,208,142, 29, 59, 42,156, 3,203, 93, 77,103, 51, 52,105,210, 36, 44, 88,176,224,158, 8,214,156, 57, 69,207,
+ 36,111,189,245,150,203,232,149, 51, 18,137, 4,119, 23,248, 34,104, 66,118, 9, 51, 3, 0,196,158,190, 74, 78,201, 38, 8, 2,
+102,207,158,125, 79,231,115,231, 38, 60,119,141,149,115, 58,211,211,211, 33, 8, 2,124,125,125, 49,108,216, 48,244,232,209,195,
+209,212, 88, 89,221,196,196,196,211,159,126,250,105,245,208,208, 80,172, 93,187,214,164, 86,171,101, 93,186,116,161,185,185,185,
+164,162, 8, 22, 51, 88, 12,134,107, 56,119, 42, 72,119,154, 9,203,170, 36, 9, 33,221,156,255, 79, 72, 72,200,211,106,181,195,
+134, 12, 25,162, 55, 26,141,168, 89,179, 38,228,114, 57, 44, 22, 11, 76, 38, 19,164, 82, 41,130,131,131, 65, 41,197,134, 13, 27,
+244, 58,157,110, 88, 66, 66, 66, 94, 69,154,132,144, 55, 31,123,236, 49, 67,124,124, 60,170, 87,175, 14, 15, 15,143,123, 94, 27,
+225,233,233, 9,111,111,111, 92,190,124, 25,203,151, 47,215, 19, 66,222,172, 72,179, 44,163,105, 55, 86,118,163,229,106,100, 82,
+ 41, 77,181, 61,138,163,211,233, 0,192, 90,189,122,245, 64, 0,184,117,235, 22, 0,220,142,138,138,234, 88,171, 86, 45,114,224,
+192, 1, 80, 74,119,149,101,174, 74,105,102,199,197,197,221,142,139,139, 51,153, 76, 38,169,201,100,146,230,229,229,153,253,253,
+253, 3,252,253,253,253, 3, 3, 3,125, 3, 2, 2,188, 83, 82, 82,172, 86,171, 85,106,179,217,164,113,113,113,166, 86,173, 90,
+221,129,211,108,238,165, 52, 69, 0,249, 75,150, 44,153, 37,145, 72,110,183,109,219, 54,102,218,180,105, 9, 22,139,197, 24, 26,
+ 26,234, 19, 20, 20,164,212,233,116, 5,239,191,255,126,250,130, 5, 11,186, 73, 36,146,219, 75,150, 44,153, 5, 32,191,248,187,
+247,104, 90,173,214,221,187,118,237,178, 90, 44, 22, 36, 39, 39, 35, 37, 37, 5,169,169,169,142, 79,111,111,111, 28, 63,126,220,
+102, 54,155,119, 85, 34, 63, 31,148,177, 96,154,248,179,239, 79, 69,198,202,157,110, 0,165,211,105, 55, 67, 79, 63,253, 52, 6,
+ 15, 30,140, 33, 67,134, 96,216,176, 97, 24, 49, 98, 68,101,166,102, 40,125,189, 59,190, 59,109,218, 52,188,245,214, 91,120,231,
+157,119, 32,151,203,241,246,219,111, 99,230,204,153,152, 57,115,102,105,115, 69, 42, 56,246, 18,245, 92,222,178, 80,232, 86, 68,
+192,180,186, 86, 81, 19, 33,165,127, 46,238,231,167,195, 12,189,253,246,219, 56,114,228, 8,166, 76,153,130, 61,123,246, 96,220,
+184,113,216,182,109, 27, 70,143, 30,141, 95,126,249,197,241, 89,252, 16, 72,221, 73,167, 32, 8,232,216,177, 35,116, 58,157,195,
+192,142, 25, 51,166,132,222,232,209,163,221,202, 79,165, 82, 57,116,243,230,205, 27,151, 47, 95,126, 43, 59, 59,187, 71, 66, 66,
+194, 29,173, 86, 75,242,242,242, 28,231,176,244, 82, 28,137,150,179,235,136,105, 50, 11,117, 31, 17, 44,171,213,138,240,240,240,
+ 18,239,182,226, 56,174,196, 82,153,126, 4, 0,144,154,154,186, 35, 56, 56,248,201, 39,158,120, 98,245,115,207, 61,231, 17, 29,
+ 29, 45,137,136,136,128, 78,167,195,237,219,183,145,144,144, 96,221,179,103, 79,190, 78,167, 27,158,154,154,234,114, 20, 89,114,
+114,242,202,192,192,192,237,195,135, 15,159,209,180,105,211, 49, 19, 39, 78,228,163,162,162,144,151,151, 7, 31, 31, 31, 4, 4,
+ 4, 32, 62, 62, 30,251,246,237,179,229,230,230, 46,182,217,108,239,166,165,165,101, 84, 38,147,172, 86, 43,111, 54,155, 49,100,
+200, 16,136,162,136,121,243,230,193,106,181,242,149,144, 48,155,205,102, 10,128,100,102,102, 2,128,206,110,184,174, 95,191, 14,
+ 0,119, 34, 34, 34, 52, 0,176,107,215, 46, 2,224,176,187, 15,244,206,145,172,232,232,232,120,123,165,232,124,147,179,111, 47,
+142, 92,185,122, 12, 55, 12, 26, 52, 40, 93,167,211,245,156, 52,105,210,140,133, 11, 23, 14, 93,184,112,225, 61, 59,121,122,122,
+174,249,236,179,207,222, 29, 52,104, 80,122,121,209,171,226,136,221, 91,207, 62,251,236,160,115,231,206,121, 40, 20, 10,104,181,
+ 90,100,101,101,193,108, 54, 35, 42, 42, 10,233,233,233, 88,185,114,101,129, 94,175,159,201, 46,199,191,151,242,140,149,187,125,
+ 44,203,139,226,108,221,186,181,204, 57,166, 42,171, 89,218,100,184, 59, 55,149, 27, 15, 67,101, 78,253, 80,153,122,173, 60,205,
+143, 63,254,216, 49,217,106, 89,145,171,202, 68,176,236,154,190,190,190, 0,138,102,223, 23, 69, 17,143, 63,254,120,149,117,139,
+223, 45,248,164,253,255,216,216,216,119,215,174, 93, 59,135, 82,234, 7, 64,112,206, 3,246, 82, 5, 6,227, 1, 25, 44,155,205,
+150,212,177, 99,199, 18, 21, 91, 69, 47, 85, 45, 54, 34, 73,110,154,172,237, 81, 81, 81, 81,203,150, 45,251,159, 90,173,238,102,
+ 48, 24, 26, 1,128, 66,161, 56,167,213,106,119,113, 28, 55, 63, 53, 53,213,237,151, 51, 23, 27,166,113, 97, 97, 97,243, 70,140,
+ 24, 49,167,109,219,182, 3, 95,124,241, 69, 34, 8, 2,214,173, 91, 71,147,146,146,214,115, 28,247,102, 74, 74,202,205,170,100,
+146, 74,165,186,186,126,253,250,154, 91,183,110,133,197, 98,193,162, 69,139,160, 80, 40,174,186,251,125, 74,105,134, 32, 8,171,
+219,182,109, 59,244,200,145, 35,107, 40,165,231,229,114,249,247,113,113,113,195, 14, 31, 62,252, 35,165,244,146, 32, 8,223,183,
+105,211,102,216,241,227,199, 55, 80, 74,207, 86, 34,121,217,113,113,113, 57, 0,130,172,214,178, 91, 20,227,226,226, 76, 0,238,
+186, 97,174,236,228,143, 26, 53,202, 60,106,212,168,215, 6, 13, 26,180,252,143, 63,254,104,153,155,155,219, 8, 0,188,189,189,
+207,181,104,209,226,248,143, 63,254,120,165, 56,114,101,112,117,236,132,144, 1,141, 26, 53,218,240,222,123,239,169, 99, 98, 98,
+132,218,181,107, 35, 33, 33, 1,231,207,159,183,126,243,205, 55,133,122,189,190, 31,165, 52,135, 93,142,127, 15,246, 38, 66,111,
+111,239, 18, 15, 79,246,161,251,149,105,194, 43, 75,179,244,131, 25,207,243, 21,105,186,116, 53, 26,141,198, 49,106,217,157,174,
+ 9, 21,189,123,212,158, 78,187,166,125,113,195, 92, 81, 87,154,197,175,233,169,140, 38,220,209,180, 88, 44, 14, 93, 55, 52, 43,
+245,163, 39, 78,156,248, 6,192, 55,181,107,215,190, 14,160, 22, 51, 85, 12,198, 95, 96,176, 46, 95,190, 28,251, 87,254,240,173,
+ 91,183,242, 1,188, 91,188, 60, 16,146,146,146,110, 2, 24, 20, 20, 20,244,201,225,195,135,223, 6, 0, 81, 20,103,187,122,159,
+161, 43,206,158, 61, 59, 64, 34,145, 44, 92,177, 98, 69, 91, 74, 41,188,188,188, 14, 95,191,126,253,229, 74, 70,193,198, 16, 66,
+ 38,218, 71, 5, 26,141,198, 49,132,144,201,148, 82,173,211,118,199,255,149,132, 2, 48, 82, 74, 67,202,217,110,172,132,185,114,
+ 68,178, 0,152,126,252,241,199, 66, 0,103,240,231, 60, 87,150,226,197, 0,167,102, 65, 23, 55,184,223, 9, 33,181,223,126,251,
+237,185, 60,207,119,213,106,181,161,106,181, 58,209,106,181,238,214,233,116,111, 82, 74,179,216,165,248,247, 97,181, 90,147, 59,
+118,236, 40,148,245,224, 84,209, 13,188,162, 7, 42,155,205,150, 20, 23, 23,135, 42,104, 38, 87,144,212,219,109,218,180,225,220,
+213,178, 99,177, 88,210, 43, 74,103,155, 54,109,202,125,104,172,234,177,183,105,211,166, 82,105, 44,174,171,146, 31,180,166,139,
+252, 44, 23,189, 94,159, 83,173, 90,181, 66,131,193, 32, 49, 26,141,146,210, 17,123,165, 82,153,193,174, 28, 6,163,138, 6,235,
+223, 76,177,161,234,251,160,244,138,251, 67,189,244, 0,116, 12,165,254,215, 86,244,127, 37,249, 43, 34, 64, 34, 0,221, 3,202,
+195, 76, 0, 47,178, 75,238,159,199,249,243,231, 91, 61,104,205,139, 23, 47,198,254, 5,233,108,243,160, 53, 47, 92,184, 16,251,
+168,106, 86, 68,114,114,114, 43,118,101, 48, 24,247, 7,199,178,128,193, 96, 48, 24, 12, 6,227,193, 66, 0,148, 57, 18,160, 50,
+111,202,174,202,104, 2, 87,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,252,239,105,186,210,174,140,255,248, 71, 83,214, 48,
+220, 7,181, 0,232,198, 52,153, 38,211,100,154, 76,147,105, 50, 77,166,249,168, 45,172,137,144,193, 96, 48, 24, 12, 6,227, 1,
+195, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193,120,132, 32,132,144,
+176,176,176,142, 33, 33, 33,109, 30,213, 60, 16, 88, 49, 96, 48, 24, 12, 6,131,241, 32,168, 94,189,186,183,205,102,123, 46, 36,
+ 36,228,229,154, 53,107,214, 4,128,208,208,208,243,148,210,249, 74,165,242,251, 27, 55,110,152, 30, 25,147,201, 94,133,192, 96,
+ 48, 24, 12, 6,227,126, 8, 9, 9,105, 10,224,101,165, 82, 57,188, 85,171, 86,178, 46, 93,186,192,199,199, 7, 86,171, 21,169,
+169,169,248,253,247,223,113,250,244,233,108,139,197,178,208, 98,177, 44,204,200,200, 72, 99, 6,139,193, 96, 48, 24, 12, 6,163,
+ 28,130,131,131, 63,237,213,171,215, 36, 31, 31, 31,212,174, 93, 27, 65, 65, 65, 48, 26,141,208,235,245,160,148, 66, 16, 4, 80,
+ 74, 81, 80, 80,128, 19, 39, 78,224,216,177, 99,214,252,252,252, 53,132,144,249, 41, 41, 41,167,153,193, 98, 48, 24, 12, 6,131,
+193, 40, 69, 72, 72, 72,218,158, 61,123, 2,172, 86, 43, 50, 51, 51, 97, 52, 26,161,211,233, 28, 6,139,231,121, 80, 74, 97,181,
+ 90, 1, 0,162, 40,226,210,165, 75, 56,114,228, 8, 18, 19, 19, 63, 75, 77, 77,125,237,191,152, 47,172,147, 59,131,193, 96, 48,
+ 24,140,251,194,104, 52, 98,213,170, 85,200,204,204, 68,120,120, 56, 66, 67, 67,225,237,237, 13,165, 82, 9, 0, 14,115, 5, 0,
+ 28,199, 33, 38, 38, 6,195,135, 15, 7, 33,100,216,127, 53, 79, 88, 39,119, 6,131,193, 96, 48, 24,247,131,197,100, 50, 33, 54,
+ 54, 22,241,241,241, 56,121,242, 36,154, 53,107,134,250,245,235, 35, 51, 51, 19, 41, 41, 41, 37,118, 62,126,252, 56, 78,157, 58,
+133, 14, 29, 58,252,167, 51,133, 53, 17, 50, 24, 12, 6,131,193,168, 50,161,161,161,207, 84,171, 86,109,209,136, 17, 35,148, 77,
+154, 52, 65, 82, 82, 18,146,147,147,145,147,147,131,166, 77,155, 34, 38, 38, 6, 55,111,222,196,246,237,219,113,234,212, 41,200,
+229,114,132,133,133, 65,179,230, 7,252, 18, 18,156,156,146,146, 18,198, 12, 22,131,193, 96, 48, 24, 12, 70, 41, 66, 66, 66,252,
+ 8, 33,111,134,134,134,190, 50,108,216, 48, 73,237,218,181,145,148,148,132,140,140, 12,228,228,228,224,232,209,163,118, 51,134,
+176,176, 48, 36, 36, 36,224,220,185,115,122,163,209, 56, 54, 57, 57,121, 37, 51, 88, 12, 6,131,193, 96, 48, 24,229, 27,173,112,
+ 0,179,106,213,170,245,204,211, 79, 63,205,133,132,132, 32, 57, 57, 25,123,246,236, 65,173, 90,181,144,150,150,134, 19, 39, 78,
+216,242,243,243, 23,219,108,182,119,211,210,210, 50,254,171,121,241,151,118,114, 39,132,116, 99,154, 76,147,105, 50, 77,166,201,
+ 52,153,230,163,161,153,146,146,146,152,146,146, 50,242,218,181,107, 49,115,230,204,217,188,104,209, 34,240, 60,143,208,208, 80,
+236,217,179,135,238,222,189,123,125, 97, 97, 97,221,148,148,148,113,255,101,115, 5,176, 78,238, 12, 6,131,193, 96, 48, 30, 48,
+119,239,222,189, 12, 96, 64,104,104,104,171, 11, 23, 46,188, 1, 0,162, 40,206,190,123,247,238,137, 71, 37, 15,152,193, 98, 48,
+ 24, 12, 6,131,241,151,144,156,156,124, 12, 64,223, 71,241,216,217, 60, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,
+131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,241, 72, 65, 0,148, 57, 18,128, 82,186,203,109,145, 42,140, 80,112,165,207, 52,
+153, 38,211,100,154, 76,147,105, 50,205,255,158,166, 43,237,202,248,143,127, 52,148, 82,151, 11,138,231,203,170,236, 2,160, 91,
+ 85,190,199, 52,153, 38,211,100,154, 76,243,225,107, 86,165,174, 47, 75,179,248,225,157,160,168,149,132,179,255,255, 79, 75,231,
+191,229,216, 31, 21,205,255,218, 34,184,112,151,142, 76, 34,132,136, 0, 68,250, 0,102, 38, 37,132,216, 79,192, 3,209, 99,252,
+ 5,161,205,162,115, 68,254,244,225,236, 60, 49, 24,255,225,235,253,129,213,245, 78,117, 7,239,116,147,181, 1,176, 17, 66,112,
+ 63,117,201, 95,113, 79,250,167, 31,251,163,172,249,111, 71,168, 40,163,170, 85,171,182, 35, 32, 32,160,115,102,102,166, 88,188,
+ 30,161,161,161,224, 56, 14,130, 32,232,227,227,227, 61, 43,251,131,129,129,129, 95,199,196,196, 60,151,149,149, 37,114, 28,135,
+240,240,112, 16, 66,192,243, 60,120,158,215,223,184,113,195,243,239,206,148,230,205,155,231,152, 76, 38, 77,233,245, 50,153,204,
+112,242,228, 73,143, 71,193, 92,249,251,251, 63, 25, 24, 24,232,157,157,157, 77, 1, 32, 44, 44, 12, 60,207, 23, 21, 26, 65,176,
+222,188,121,115,133,187,122,145,145,145,199,149, 74,165,183, 32, 8,224,121, 30,130, 32, 64,171,213,230, 94,186,116,169,101,241,
+246, 67, 74,165,210,143,231,121,123,217,130,193, 96,200,186,120,241, 98, 59,118,235,251,119,178,126,253,122,190,103,232,243,181,
+ 4,170,111,204,113,212, 75, 20, 73,158,149, 40,207,110, 79,254,250,134, 59,223, 31, 56,112,160,237,111,190, 6,170, 3,176, 82,
+ 74, 83,170,240,101,174,140,138,182,151, 13, 24, 92,252,175,129, 3,178, 8,112,173, 46,176,225, 34,160, 47,213,172, 32, 62,236,
+ 7,169,234,213,171,207,175, 86,173,218,200,194,194, 66, 29,199,113, 32,132,208,152,152, 24,251, 62, 37, 62, 69, 81, 76,186,112,
+225, 66,172,139,155,172,164,122,245,234,159, 85,171, 86,237, 89,157, 78,167, 35,132,128, 16, 66, 9, 33,104,212,168,209, 61,154,
+ 54,155, 45,233,252,249,243,177, 15, 43,157,127,215,177, 55,108,216,176, 76,205,242,142,189, 44, 77,231,116, 18, 66, 16, 19, 19,
+115,223,233,252, 39,106,254,103, 13, 22, 0, 46, 32, 32, 96,115,203,150, 45, 59,109,217,178,133,187,124,249, 50, 23, 29, 29, 13,
+155,205, 6, 81, 44,186,246,155, 53,107,166,170,236,143, 5, 5, 5,125,215,178,101,203, 33, 91,182,108,225, 54,111,222,204,181,
+104,209, 2,132, 16,216,108, 54,216,108, 54,116,237,218, 85,121,159,149,133, 70, 16,132,137, 50,153,172,163,213,106,173, 15, 0,
+ 18,137,228,146,209,104,220,103,181, 90, 63,167,148, 22,186,163, 99,177, 88, 84, 23, 46, 92,184, 39,111, 90,182,108, 41,171,106,
+218,234,212,169,115,152,227,184,168,178, 46,218,242, 62, 41,165,183, 46, 92,184,208,182, 60,205,122,245,234, 29,230, 56, 46,202,
+190,127, 89, 26,165,215,137,162,120,235,252,249,243,109, 43,170,116, 2, 3, 3,159,106,219,182,173,215, 79, 63,253, 68, 18, 19,
+ 19,137, 82,169,132, 40,138,176,217,108,176, 88, 44,232,210,165, 75,165,230, 79, 83,169, 84,158,187,119,239,174, 21, 16, 16,128,
+244,244,116,100,101,101, 97,244,232,209,215,236,219,149, 74,165,223,239,191,255, 94,199,215,215, 23, 58,157, 14,121,121,121, 24,
+ 54,108,216,191,254,226,234,209,161,230,123, 4,240,181,255,111, 19,145,189,235,224,205,183,238, 87,183, 94,189,122,167,100, 50,
+ 89, 96,121,231,188,172,115,111, 50,153,210, 46, 92,184,208,204,197,245, 19, 1,160, 47,207,243,181, 5, 65,168, 7, 32,194,106,
+181, 6, 2,128, 84, 42, 77,227,121, 62,193, 98,177, 92, 49,153, 76,215, 1,108,165,148, 38,148,167,213, 51,244,249, 90,196,170,
+ 27, 88, 96, 20,123,171,106,126, 80, 87,119,115,250, 85,149, 92,183,173,103,232,243,235,221, 53, 89,127,163,185,138, 12, 9, 9,
+249,184,248,239, 41,148,210,248,251,213,180, 1,131, 41,165, 94, 0,144,151,151,231,149,152,152, 24,180,117,235,214,152,185,115,
+231,118,145, 25, 12, 31,153,128,203, 21,125,191,123,199, 90, 39, 4,142,132,161, 56, 6, 96,165, 98,210,206,125, 55, 31,196,141,
+137, 11, 13, 13,157,223,179,103,207, 17,139, 23, 47, 86, 29, 59,118, 76,213,176, 97, 67,240, 60,111,175, 47, 80, 58,240,208,186,
+117,235, 10,179, 15,128, 16, 18, 18, 50,239,177,199, 30, 27,186,112,225, 66,213,149, 43, 87, 84,145,145,145, 40,190,217,150, 40,
+155,246,117, 77,155, 54,125,216,233,252, 75,143,189, 87,175, 94, 67, 23, 45, 90,164, 58,119,238,156,170,118,237,218,224, 56, 14,
+ 28,199,221,163,199,113, 28, 98, 99, 99,221,210,236,209,163,199,208, 37, 75,150,168, 78,157, 58,165,170, 87,175,158, 35,239,156,
+154,231, 42,157,206,127,184,230,127,207, 96, 17, 66,184,106,213,170,173,138,141,141,237,185,101,203, 22, 30, 0, 78,157, 58,133,
+236,236,108,132,134,134, 66,163,209, 64, 46,151,195, 96, 48, 84, 42,220, 23, 24, 24,248,117,177,185,146, 0,192,134,225, 3,112,
+ 75, 2,140, 79, 55, 65, 42,149,226,230,205,155,224,121,254,126, 66,199, 29, 60, 61, 61, 87,110,220,184,209,167, 89,179,102, 92,
+102,102, 38, 34, 35, 35,145,157,157,221,114,255,254,253,205,159,127,254,249,231, 9, 33,207, 80, 74,247,187,171,185,109,219, 54,
+168,213,106,168, 84, 42,168,213,106,152,205,102, 82,213,244,241, 60, 31,118,236,216,177, 0,141, 70, 3, 81, 20, 29, 75,169,246,
+107, 7,162, 40,162, 67,135, 14,230, 10, 79,158, 32,132, 29, 59,118, 44, 64,169, 84,130, 82, 90, 66,207,102,179, 65, 46,151, 59,
+ 63, 33,194,102,179,161, 77,155, 54,102, 87,145, 43,187,185, 2,128, 53,107,214, 32, 40, 40, 8, 1, 1, 1, 80,171,213, 80, 42,
+149, 85, 57,118,248,249,249,225,149, 87, 94,193,224,193,131,177,122,245,106, 72, 36, 18,231,227,128,175,175, 47,126,251,237, 55,
+120,122,122,162, 70,141, 26, 37,182,255,107, 35,129,128,239,246,253, 55, 29, 17,217,129,125,154, 8,221,226,162, 22, 58, 42,215,
+162,157,168, 88,180, 47, 21,109,182,156,221,135,110,207,112,121, 87,224,184,144, 99,199,142, 5,200,229,114,247,110,238, 54, 27,
+154, 53,107,198,187,184,126,122,199,196,196,108,120,249,229,151,165,181,107,215, 38, 82,169, 20,130, 32, 64, 16, 4,123,121,172,
+ 65, 41,173, 33,138, 98,167,180,180, 52,250,197, 23, 95,124, 68, 8,121,130, 82,186,173,204,178, 73,245,141, 11,140, 98,239, 3,
+167,209,114, 96,183,105,248,109,221,244,150,113, 77, 69,120,168,244, 55, 0,252, 99, 13, 22, 33,196, 83,169, 84,190,189,110,221,
+ 58, 41, 0,116,235,214,237,109, 66,200,171,148,210,252, 7,245, 27, 94, 94, 94,240,242,242, 66,195,134, 13,241,228,147, 79,122,
+ 55,109,218,116,114, 39,163,113,204, 94,160,220,107, 83,224,184,176, 95,127,191, 22, 96,255,127,232,128,230,210,158,157,106,165,
+ 21, 61,136,149,222,155, 66,180,209,164, 93, 7,111,197,186, 56, 86, 46, 40, 40,232,147, 94,189,122, 13, 90,188,120,177, 7, 0,
+124,253,245,215,120,252,241,199, 17, 24, 24, 8,165, 82, 9,153, 76, 6,137, 68, 2,169, 84,234,248,116, 17, 17,226,131,130,130,
+ 62,122,252,241,199, 7, 46, 92,184,208, 3, 0,190,251,238, 59,244,233,211, 7,126,126,126,240,244,244,132, 92, 46,135, 76, 38,
+131, 84, 42, 45, 97,184, 42,147,206, 23,122,116, 65, 77,165, 28,125,222,251, 8, 62, 62, 62,216,253,218,203,144,112, 28,198,109,
+223, 15, 15, 15,143, 10,211, 89,158,230,201,147, 39,145,158,158, 94,230,177, 19, 66, 42,172,251,156,143,189,119,239,222, 3, 23,
+ 45, 90,228, 56,246,158, 61,123,194,207,207, 15, 30, 30, 30,144,203,229,144, 74,165, 37,150,242,242,192, 89,179, 87,175, 94, 3,
+151, 44, 89,226, 1, 0, 43, 86,172, 64,183,110,221,224,227,227, 3, 15, 15, 15, 71, 94, 86,246, 28,253,147, 53,255,147, 6,203,
+222, 55, 42, 32, 32, 96,208,207, 63,255,204, 57,223, 0,229,114,185,227,194,144,201,100,224, 56,174, 50,149, 22,137,137,137,121,
+110,203,150, 45,142, 47,153, 74, 85, 10,114,185,188, 82,154,165,244,187,117,238,220,249,135,159,127,254, 89, 33,149, 74,161,215,
+235,113,225,194, 5,120,121,121, 65, 38,147,161,127,255,254,124,187,118,237,252, 58,117,234,244, 19, 33,100,168, 59, 35, 20, 40,
+165,208,104, 52, 37, 12,214,253, 52, 33,219, 47,208, 45, 91,182,128,231,249, 18,133,204,254,233,252,119, 64, 64,128, 91,186,114,
+185, 28,135, 15, 31, 6,207,243,144, 72, 36, 16, 4, 1, 18,137, 4,191,252,242, 11, 94,123,237, 53,100,102,102,130, 16, 2,137,
+ 68, 2, 15, 15,151,173,155, 36, 48, 48,208,219,110,174,138, 35,128, 80, 42,149,144, 72, 36, 68, 16, 4, 98,111,198, 35,132, 16,
+119,219,212, 5, 65, 64, 66, 66, 2,134, 15, 31,142, 21, 43, 86, 96,246,236,217, 24, 58,116,104,137,237,249,249,249,240,241,241,
+129,143,143, 15, 20, 10, 69,149,203,194, 63, 9,177, 84,238,188, 59,231, 99, 21, 68,138,162, 78, 30, 34, 32, 2, 20, 20, 34, 21,
+145,150,124, 3,159,126,178,128,119,183, 44,201,229,114, 28, 58,116,200, 97,130, 4, 65, 0, 33, 4,206,198,200,190, 4, 5, 5,
+185,212,148, 74,165,179, 54,109,218, 36, 91,189,122, 53,214,174, 93,235,248, 13,181, 90, 13,111,111,111,248,249,249, 57,150,176,
+176, 48,242,205, 55,223, 72, 27, 55,110, 60, 11,192,182,178, 77, 32,245, 82,213,252,160,238,192,110,211,138,204,229, 52,138,156,
+107,115,154,112,185, 51,188,254,193,230, 74, 0,240,250,151, 95,126,233,215,188,121,115, 0,192,151, 95,126,233, 55,106,212,168,
+215, 9, 33,111, 81, 74,173, 85,126,192, 2,214, 18, 66, 6, 23, 71,108, 21,221,187,119,151,125,245,213, 87,168, 87,175, 30, 38,
+ 76,152,224,251,233, 71, 31,245, 5,240, 83,249,101,169,100, 97,250,224,227,249,222,148, 22,149, 31, 42,210, 18,159,217,233, 9,
+120,251,237,247, 92,214,201, 0,184,144,144,144,231,151, 46, 93,234,232, 14,225,227,227, 83,102,221, 36,145, 72, 28, 75, 5,166,
+136, 20, 71,133, 70, 45, 94,188,216,161,233,239,239, 15,169, 84, 90,226, 6,123,251,242, 25,108, 91,254, 62,212,190, 65, 24, 62,
+229,195, 74,167, 51, 76, 46, 67,152, 82,134, 38, 77,154, 64,165, 82,225,164,164,232, 86,230,225,225,225, 50,157,229,105, 58,215,
+203, 0,160,211,233, 28, 81,123,147,201,132,216,216, 88,183,142,125,201,146, 37, 14, 77, 63, 63, 63,199,177,219,211,229, 92,215,
+219, 31, 96, 42,210, 12, 9, 9, 25,181,108,217, 50,135,166,175,175,111, 9, 13,137, 68,130,149, 43, 87,222, 83, 71,220,175,102,
+101,207,123,105,205,132,132, 4,204,157, 59,215, 81, 39,217,163,120,246,174, 70, 11, 22, 44,112,203, 96,255,167, 34, 88, 0, 72,
+102,102,166,120,249,242,101,238,228,201,147,144, 72, 36, 8, 8, 8, 64,139, 22, 45, 0, 0,102,179,217,126,211, 37,245,234,213,
+ 75,227, 56, 14,246,155, 46,199,113,176, 90,173,142,246,100, 39, 35,195,101,103,103,139, 59,119,238,228, 86, 61,209, 3, 38, 10,
+ 52,125,251,125,244,236,211, 7,219, 67,101,224, 1,180,188,156, 9,153, 76, 38, 4, 7, 7, 91,236, 39,193,174,237,220, 55,171,
+180, 57, 34,132,120,168,213,234,111,182,110,221,170,224, 56, 14, 5, 5, 5, 16, 69, 17,237,218,181, 3,199,113, 56,127,254, 60,
+222,124,243, 77,108,216,176, 1,155, 54,109, 82, 54,107,214,236, 27, 66, 72,125, 74,105,129,147,153,218, 85, 86,225,244,240,240,
+128, 74,165,114, 24, 44,251, 49, 23,183,169,151,110,146, 73,190,112,225, 66,243,242, 52,237,145,132, 1, 3, 6, 56,250,156,217,
+205, 80,233, 79,169, 84,138,243,231,207,151,101,250,238,209, 20, 69, 17,237,219,183,183, 55,197, 65,163,209, 96,239,222,189,142,
+237, 77,155, 54,133,201,100,130,191,191, 63, 46, 93,186,228, 82, 51, 35, 35,131,166,164,164,144, 85,171, 86, 65, 34,145,192,207,
+207, 15, 42,149,138,252,244,211, 79,175, 43, 20,138, 48,163,209, 40, 90, 44, 22,132,133,133, 45,168, 81,163,134,253, 28,105,111,
+220,184,225, 87,158, 38,207,243, 80, 40, 20,248,238,187,239, 48,119,238, 92,188,241,198, 27, 37, 46, 44,158,231, 97, 48, 24,224,
+239,239,239, 48, 89,165, 47,188,191, 98,216,238, 95,173, 73, 65,113,225,212,118, 92, 60,183, 11,162, 77,132, 77,164,160,212, 6,
+209, 10,156,220,121,180, 78,234,173,148, 80, 10, 10, 20,247,184,177, 20,106,173,157,252,229,245, 0,108,222,155,105,156,231, 42,
+157,130, 32,192, 98,177, 96,235,214,173,184,113,227, 6,118,236,216, 1,189, 94,239,200,199, 54,109,218, 96,212,168, 81, 8, 10,
+ 10,114,153,159,148,210,239, 18, 19, 19,155,182,111,223,158,228,230,230, 34, 55, 55, 23,122,189, 30, 54,155, 13, 86,171, 21,130,
+ 32, 64,161, 80, 64,169, 84, 34, 48, 48, 16, 6,131,129, 26,141,198,239,202,211, 20, 69,146,167,187, 57,253,234,111,235,166,183,
+ 28, 56,141, 98,253,135, 4,117, 34,228,186,125,103,188, 71,109, 59,246,122,119, 66, 57, 10, 20, 29, 58, 71, 64,109, 54, 91,230,
+ 75,227, 63, 24,247,176,207, 81, 41,198, 76,156, 56,177,190,115,243,244,176, 97,195,112,225,194,133,250,159,127,254,249, 24, 0,
+ 95, 86, 86,211, 7, 8, 5, 0, 43,240, 27,138, 22,172,215,235,201,144,205,155, 7, 0,120,118,211,166, 77, 24, 58,116, 40, 62,
+249,232,163,134,165, 13, 86,137,178, 68, 41, 18,174, 29, 64,194,245,131, 16, 69,234, 20, 5, 47,251,111,234, 94, 58, 73, 97, 97,
+161,225,216,177, 99,154, 21, 43, 86,192,219,219, 27, 81, 81, 81,142, 86,138,210, 55, 88,251,255,174,202,146, 78,167, 51, 92,190,
+124, 89,243,195, 15, 63,192,215,215, 23, 53,106,212,128, 74,165,114,104,202,100, 50, 28,221,190, 17, 99,134,247, 70,102,194, 69,
+204,127,117,144,219,233,124,161,123, 23,132, 43,100, 24, 48,251, 3, 68, 71, 71, 99,253,224,126,224, 8, 48,118,207, 81, 72,165,
+ 82,172,232,221, 1, 50,185, 12, 99,247,252,225, 42,157, 14,205, 19, 39, 78, 64, 20, 69, 68, 68, 68, 64,167,211,193,211,211, 19,
+ 10,133, 2, 18,137, 4, 59,119,238, 68,255,254,253,177,122,245,106,180,105,211,198,229,177, 23, 22, 22, 26,206,157, 59,167,249,
+254,251,239,225,235,235,139,240,240,112,168, 84, 42, 71, 96,194,110,180,120,158, 71, 84, 84, 20,242,242,242, 80,179,102,205, 10,
+ 53,181, 90,173,225,228,201,147,154,239,191,255, 30, 62, 62, 62, 8, 11, 11,115, 68,216,236,166,104,230,204,153, 37, 52,154, 52,
+105,114,223,154,149, 61,239,165, 53, 7, 12, 24,128, 90,181,106,193,211,211, 19,106,181,218,161, 93,145,230,127,218, 96, 81, 74,
+105,241, 40, 10, 68, 71, 71, 35, 59, 59, 27,114,185, 28, 45, 90,180, 64,102,102, 38, 52, 26, 13,164, 82, 41, 40,165, 24, 60,120,
+ 48, 63,101,202,148,128, 98, 83,229,168,240,203,105, 75, 23, 57,142, 67,219,182,109,113,161,184,229,167,103,159, 62, 8, 11, 11,
+131,189, 19,135, 66,161,192,208,161, 67,201,107,175,189, 38,216,163, 23,148, 82,232,245,122, 52,110,220, 88, 89, 65,116,228,213,
+159,126,250,201, 75, 38,147,161,160,160,192,209, 68,198,243, 60, 46, 95,190,140, 79, 62,249, 4,207, 62,251, 44,238,220,185,131,
+144,144, 16, 76,158, 60, 89,243,193, 7, 31,188, 10,224, 93, 87,153,163,209,104, 28,230, 74,165, 82, 97,196,136, 17, 66,187,118,
+237, 2, 52, 26, 13, 60, 60, 60, 96,111,238,179,217,108,104,219,182, 45,113, 21,117, 16, 69, 17,219,183,111,135, 32, 8, 46, 35,
+ 88,197,109,214,110,105, 30, 59,118,204, 97,206,156,159,138, 8, 33,184,112,225,130,195,204, 21, 23,230,138, 52, 41,207,243, 80,
+171,213, 8, 10, 10,130, 82,169,132, 74,165, 34, 91,182,108,121, 43, 34, 34, 34,248,229,151, 95,230,242,243,243,185,216,216, 88,
+244,238,221, 91, 16, 69, 17,102,179, 25, 93,186,116,169, 48, 31, 37, 18, 9,142, 31, 63,142, 15, 62,248, 0,211,166, 77,195,146,
+ 37, 75,208,173, 91,183, 18, 70,129, 16,130,106,213,170,193,211,211,243,191,115,117,137,128,217,106,129,174, 80,239,104,194,181,
+217,108, 56,183,247, 76,157, 91,103,174,197,252,252,195,106, 9, 0, 24,246,110,116,254, 86,240,147, 11,127,172,219,201, 87,122,
+108,111,182,249,152,139,166, 66, 76,152, 48, 1, 51,102,204,192,224,193,131,177,115,231, 78,188,249,230,155,120,254,249,231, 75,
+ 68,176,220,193, 98,177, 44,125,230,153,103, 70,175, 95,191,190,222,180,105,211, 56,123, 4, 75,165, 82,129, 16, 2,131,193, 0,
+163,209, 8,189, 94,143, 43, 87,174,136, 47,190,248,226, 85,147,201,180,180, 60, 61, 43, 81,158, 85,201,117,219,106, 87,231,107,
+105,227, 63,246,104,223, 42, 66, 79,148,205,243, 30,175,221,141,118, 27, 26,225, 3, 74, 65,197,162, 40,159,209,168,197,235, 83,
+ 39,243,127,231,169, 34,132,244,238,222,189,123,143, 57,115,230,220,179,109,206,156, 57,184,116,233, 82, 15, 66, 72, 66,121, 77,
+162,101,225, 13,132, 41,130,130, 62, 3, 0,239,187,119, 39,229, 2, 73, 0, 48, 4,232,105, 3,250,237,220,185, 19, 0, 80,189,
+122,117,136, 64, 3, 2,124,199, 3,107,173,101, 69, 5, 41,133,197, 98,133, 94,111,172,208, 88,217,255,119, 21, 92,182,215,245,
+ 60,207,163, 97,195,134,232,217,179, 39,164, 82, 41, 60, 60, 60, 28,205, 57,101, 69, 49, 92, 52,221, 83, 0, 34, 33, 4, 81, 81,
+ 81,232,209,163, 7,164, 82, 41,212,106,181,195,180,200,100, 50,240, 60,143, 70,237,186, 98,245,202, 57,120,174, 79, 51, 60, 27,
+ 23,136, 13,231,178,220, 74,103,132, 82,134, 26, 42, 57,162,163,163,225,225,225, 1, 66, 0,129,255,179, 62, 85,169,148,144,201,
+101, 21,166,179,180,102, 90, 90, 26,226,227,227, 17, 31, 31, 15,142,227,208,190,125,123, 71,212,229,250,245,235,120,247,221,119,
+ 97, 52, 26,221, 58,118,142,227, 80,187,118,109,116,233,210, 5, 50,153, 12, 42,149,170, 68,211,160, 61, 79, 11, 10, 10, 80,171,
+ 86, 45,108,222,188, 25, 29, 58,116,112,169, 25, 29, 29,141,142, 29, 59, 66, 42,149, 58, 30,164,149, 74,165,227,190, 81,108,238,
+ 28,191,209,172, 89,179, 74,105,238, 56,126, 7,203,119,254, 14,163, 73, 68,190,206, 82,226, 11,193,254,158, 56,248,253, 52,183,
+142,221,174,185,108,217, 50,228,230,230, 58,234, 32,123, 0,198, 30, 60, 9, 15, 15,199,162, 69,139, 30,173, 38, 66,251,109,193,
+238, 42, 67, 67, 67, 97,239,231,161,209,104, 32,147,253,217,199,219,106,181, 98,195,134, 13, 8, 8, 8,112, 44, 94, 94, 94,229,
+ 22,232,234,213,171,131, 82,138, 9, 25, 69,221, 12,126, 11,145, 34, 1,192,227, 25,212, 17,221,177,217,108,248,233,167,159,224,
+108, 96, 60, 60, 60, 42,108, 46,146,201,100,157, 90,180,104,193, 25,141,198,123,204,213, 7, 31,124,128,161, 67,135,162,110,221,
+186, 16, 69, 17,133,133,133,232,220,185,179,100,193,130, 5,157, 42, 99,176, 84,170,162,254,252, 38,147, 9,123,247,238,133,143,
+143, 15,252,252,252,224,235,235, 11, 15, 15, 15, 40, 20, 10, 16, 66, 92, 54,151, 81, 74, 49, 96,192, 0, 71,161,115,142, 90,149,
+ 54, 91,135, 15, 31,118,171,153,140, 82,138, 86,173, 90, 65,173, 86, 67,163,209, 64,163,209, 96,251,246,237,142,237, 45, 91,182,
+132, 40,138, 8, 8, 8,192,145, 35, 71, 92, 86,186, 97, 97, 97,142,253, 37, 18, 9,249,233,167,159, 94,143,140,140, 12, 30, 59,
+118, 44,199,243, 60, 78,157, 58,133,139, 23, 47, 34, 40, 40,200,209, 39,203, 85, 58,181, 90,109,234,130, 5, 11,108, 95,125,245,
+ 21, 0,160, 75,151, 46,200,203,203, 75,119,218,158, 53,124,248,112,199, 40, 69, 0,200,206,206,206,250, 15,248, 43, 88,205, 86,
+232, 12, 6, 20, 22,232, 28,209,160,244,148, 52,239,105,175, 77,148,124, 50,110, 36, 0,224,181,121, 95,162, 96,201,159, 21,216,
+198,215,134, 4, 60,241,233,218,233, 0,250, 87,164,175,211,233, 96, 52, 26, 81,163, 70, 13, 28, 63,126, 28, 5, 5, 5,232,214,
+173, 91,137, 8,169,115,158,186, 56,247, 38, 66, 72,187, 62,125,250,252,241,249,231,159,215,172, 95,191, 62,209,106,181,208,233,
+116,112,254, 60,119,238, 28, 93,179,102,205, 45,157, 78,215,150, 82,106, 42, 79,111,123,242,215, 55,122,134, 62,191,126,255, 89,
+ 89, 31,255,168,171,158,201, 57, 53,173, 89,201,114,109,190,254,138,193, 70, 47,130,218, 0, 27, 68, 80,171, 8, 27, 40,254,206,
+241,219,132,144,176, 58,117,234,188,180,122,245,234, 50,243,139,231,121,172, 94,189, 26,237,219,183,127,137, 16,114,185,162,206,
+253,118,218, 0, 50,131, 68, 50,109,235,143, 63, 22,245,229,234,210,101, 90, 27,139,229,181, 35,128,169, 65,163, 70, 79, 29, 62,
+124,216,203, 94,175,120,121,121,129, 82,202,235,116, 58,175,182,109,219, 62, 85, 86,179, 43, 21, 1,139,197, 2,189,222,136,188,
+188, 2,152,204,150,226, 58, 83,132,205,102, 45,254, 20, 97, 45,174, 71, 37, 2,239,209,169, 77,245,194, 34,163, 69,114,247, 29,
+189, 19, 94, 78, 93, 79, 9, 33, 8, 12, 12,132, 84, 42, 45, 17,101,114, 39,122, 85, 6, 54,123, 93,232,231,231, 7,153, 76,134,
+179,123,127, 70,250,165,131,144, 18, 10,209,102,129,104, 53,195,102, 53,131,231,120, 92,185,153,130,232, 96,151, 99,135, 28,233,
+236,249,246,108,180,110,221, 26,235, 7,247, 3, 33,192,203,123,142, 66, 34,145,224,251, 1, 93, 33,151, 73,241,226,206,163,238,
+166,179,196,177,159, 56,113, 2, 19, 38, 76,192,135, 31,126, 8,165, 82,105,111, 57,193,229,203,151,241,227,143, 63,162,123,247,
+238,110, 31, 59, 33,196,113,236,130, 32, 96,250,244,233, 72, 73, 73,193,188,121,243,208,188,121,115, 72, 36, 18,228,230,230,162,
+109,219,182, 72, 75, 75,115, 59, 63,237,205,120, 50,153,172, 68,180,201,110,252,170,114,142,236,154, 35, 7, 4, 99,203,161, 53,
+ 32, 32, 56,250,253,196, 18,247,162, 69,107, 15, 84, 90,115,198,140, 25, 37,210,249, 40, 70,175,202, 52, 88,148, 82, 26, 26, 26,
+ 10, 81, 20, 75,152,170,210, 29,106,237, 33, 63,231,144, 98,133,125, 16,120, 30,162, 40, 58, 10, 3, 95,198,246, 35, 71,142,220,
+ 99, 2,150, 47, 95, 94,225, 13,220,106,181,214,247,240,240, 40, 17,189,146, 74,165,152, 62,125, 58, 70,140, 24,225, 48, 87, 82,
+169, 20, 43, 86,172, 64,108,108, 44, 76, 38, 83,253,138,210, 42,149, 74,117,141, 26, 53,226,236, 81, 32,165, 82, 73,134, 14, 29,
+202, 91,173, 86, 71,158,216, 23,123,223, 52, 87, 38,195, 30,109,218,177, 99,135, 91, 17, 44,119,251, 32, 81, 74,113,230,204,153,
+ 18,166,205, 62, 10, 6, 0,206,156, 57,227,232,159,229,174,166,205,102,131, 82,169, 36, 82,169,148, 40, 20,138, 48,187,185,226,
+121,222,113,190,157,251,228,185,186, 80,206,158, 61,219,185,162,237,231,206,157,251, 79, 78,199, 32, 66,132,217, 98,129, 94,103,
+ 66, 65,161, 30,179,222,255,182,104,195, 44, 28, 3,112,172,221,152, 9,120,185,103,247, 46, 0,170, 85,210, 16,192,126, 3,251,
+233,167,159, 32,145, 72,176,121,243,102,120,122,122,162, 95,191,126,240,244,244,196,180,105,211, 48,120,240, 96,183, 35, 88,197,
+101, 41,143, 16,210,238,213, 87, 95,253,227,227,143, 63,174, 30, 30, 30, 14,147,201, 4,179,217, 12,147,201,132, 27, 55,110, 96,
+205,154, 53,137, 58,157,174, 29,165, 52,207,149,222,246,228,175,111,252,124,228,245,148,184, 39,159,212, 95, 78,251, 13,119,239,
+102,193,106, 77,134,104,179,194,108, 45, 26,145,108,179, 90, 97,181,218, 32,240,156,231,162,207,167,236, 44,234,240, 79, 76, 3,
+ 7, 14,124,236, 33,158, 42,122,237,218,181,172,106,213,170,217, 43, 49, 79,147,201, 68,138, 31,224, 40, 0,123, 7,119, 45, 42,
+232,136,238,204,113, 96,244, 39, 31,126, 24,102,111,190,127,255,195, 15,195, 38, 79,154, 52, 26,192,130, 75,231,206,173, 30, 57,
+114,228,171,235,214,173, 43,241,157,145, 35, 71,226,210,185,115,171,203, 14, 17, 20, 71,176, 12, 6,100,100,229,224,133, 49,111,
+ 57, 66, 7, 0,133,179, 67,165, 69,255, 43, 0, 32, 51,237, 6,198, 79,120, 77, 94,222, 3, 85,131, 6, 13, 32,138, 98,137,104,
+ 72, 21,250, 94, 57, 71,134, 28,251,121,122,122, 66, 42,149,226,198,225,159, 49,105,204, 32,192,102, 6,181,232, 1,179, 14, 48,
+ 23, 66, 52,233, 64,164, 74,192,162,119,169,107, 79,167,167,167,103, 81,159, 80,129,135, 76,250,167,249,115,142, 92,185,115,227,
+ 46,125,236, 9, 9, 9,120,249,229,151, 97, 54,155, 49, 96,192, 0,152, 76, 38, 24, 12, 6,232,245,122, 68, 69, 69, 65,167,211,
+185,125,236,246,123,167, 84, 42,197,196,137, 19, 17, 27, 27,139,119,223,125, 23, 83,167, 78, 69, 84, 84, 20,198,142, 29,139, 53,
+107,214, 32, 38, 38,166, 66, 93,187,102, 81,147,123,145,166,253,120, 75, 55,229,217, 91, 10,220, 61, 71,101,105,218,103, 23, 41,
+125,222,255,247, 76,215, 74,107,126,240,193, 7,200,200,200,184, 39,114,101,255, 59, 52, 52, 20, 11, 23, 46,124, 36, 35, 88,142,
+225,164,246, 27,168,253, 70,238, 92,185,171, 84, 42,108,216,176,161, 68,231,186,138,194,210, 28,199, 65, 20, 69,108,171, 86,244,
+253,222,197,145, 43,231,255,251,246,237,139,200,200,200, 18,209, 43,165, 82, 89, 97,161, 17, 69, 17,183,111,223,198,133, 11, 23,
+208,186,117,107,228,229,229, 65,194,113,120,237,220, 57, 52,120,230, 25,152,164, 82,136,162, 8,153, 76,134,209,163, 71,187,213,
+ 81,253,143, 63,254,240,113,254,191, 65,131, 6, 73,113,113,113,161,199,143, 31,119,116,124, 47,110, 62,115, 24, 13, 55, 47,106,
+ 60,245,212, 83, 37,162, 86,206,230,202,121,249,237,183,223,220,106, 34,164,148, 34, 46, 46,206, 17,189,242,240,240,192,166, 77,
+155, 28,219,237,225,231,192,192, 64,183, 52,237, 79,240,197, 29,219, 97, 52, 26,197,130,130, 2,238,228,201,147,144,201,100,142,
+115,162, 84, 42,161, 80, 40,238,107,112,194,127, 30,155, 8,147,197, 2,189, 94,143,194,194,162, 25, 66,110,156, 47,217,143,217,
+108,172,250,224, 52,123,148,170,160,160, 0,187,119,239,198,198,141, 27,209,188,121,243,123, 58,185, 59, 95,183,110,148,209, 12,
+ 66, 72,251, 41, 83,166, 28,125,239,189,247, 66,124,125,125, 97, 54,155,113,231,206, 29,124,243,205, 55, 41, 58,157,174, 61,165,
+ 52,163, 18,174, 13, 22,139, 21, 6,157, 17,121,249, 5,152, 57,103, 69,185, 85, 4, 0,100,167, 95,193,208,161,195,100, 15,243,
+ 52, 81, 74,147, 1, 60,239,116, 93,173, 2, 96, 15,199,231, 83, 74, 71, 84, 70, 79, 2,116,122,114,224,192, 46, 19, 39, 78,116,
+172,155, 56,113, 34,142, 30, 61,218, 69,178,126,253, 5, 11,176,151, 95,191, 62,230,243,207, 63,119,236,243,249,231,159, 99,195,
+250,245,123,108,192,222,242,234, 14,123, 19, 97, 97,161, 30,158,222,193, 72,142,223,231, 50, 45, 82,222, 0, 42,138, 46, 31,252,
+ 74,247,187, 41, 93, 63, 85,162,252,208, 70,141, 26,217, 91, 23, 32,149, 74,209,176,203, 64,124, 58,127, 41,228, 28,197,147,221,
+ 26,162,154,194, 6, 40,125, 33,237, 48, 13,196,187, 70,241, 67, 71, 83,183, 30, 80,247,191, 53, 25,183,212, 10,188,184,227, 32,
+164, 82, 41,126, 26,220, 27,114,185, 20,207,254,188, 31, 82,169, 20, 63,143,122, 2, 82,153, 20, 61, 23,255,232,214,131,138,253,
+216,111,220,184,129,195,135, 15, 35, 58, 58, 26,215,175, 95,135,115, 63, 91, 74,169,219,166,173, 97,195,134,142,128,132, 68, 34,
+193,221,187,119,209,167, 79, 31,199, 3,254,190,125,251, 48,101,202, 20,140, 26, 53, 10,157, 58,117, 42,179, 95,108,105,205,152,
+152, 24, 71,224,160,180, 9,118,110,182,173,204, 57, 42, 75,211, 81,126,171,120,222,157, 53,223,123,239,189, 50,205,122,101, 52,
+255,211, 6,203,126,129,148,215,238,172, 86,171,241,202, 43,175, 96,198,140, 25,240,247,247,119,217,119,198,238, 92, 43, 98,235,
+214,173,247,172,219,188,121,179,171, 38,194,203, 94, 94, 94,177,157, 59,119, 70, 94, 94, 30, 18, 19, 19,161, 86,171,209,224,211,
+ 79,113,238,229,151,209,100,241, 98,112, 93,186,128, 16, 2,153, 76,134,115,231,206, 65,169, 84, 94,174,108,196,192,195,195, 3,
+ 62, 62, 62,142, 54,117,187,209,114, 50, 88,212, 29, 51,180,109,219,182, 50, 71,232, 84,165, 15,150,189,226, 61,122,244,104,137,
+254, 87,206,205, 28, 71,143, 30,117, 68,176,138,247, 39,174,206, 83,241, 83, 29,181,235,169, 84, 42,248,250,250, 66, 46,151, 59,
+140,149,221, 92,185, 99, 46, 93, 77, 36, 26, 17, 17, 81, 98, 34, 82,137, 68, 82, 98, 34,210,127,123, 19,161, 94,111, 64, 97,129,
+254, 65, 54,105, 21,153,179,226, 1, 39, 27, 54,108, 64,171, 86,173,238, 49, 87,246,168, 99, 21, 12, 71, 18, 33,164,211,252,249,
+243,143,125,246,217,103, 62,133,133,133,248,246,219,111,243, 10, 11, 11, 59, 81, 74,147, 42,165, 5,192, 98, 54, 67,103, 48, 66,
+ 91, 88,148, 7, 55, 47,252,228,210,148,253,155,169,223,168,209,240,111,191,253,246,158,245,223,126,251, 45,174, 95,191, 62, 28,
+231,206,237,109, 9, 44,121,125,218,180,218,205,155, 55, 15, 3,128,215,167, 77, 75,106, 9, 44,169,232, 58, 55, 23, 55, 17, 22,
+ 22, 22, 69, 61, 12,218,204, 7, 83, 78,139, 77, 70,121,125,174,170,114, 67,180,215,183, 82,169, 20, 61, 6,191,128,148, 91, 87,
+ 16,173,206, 68, 53,111, 21,104,126, 50,164, 93,222,193,185,108, 21,230, 45,222, 94,169,116,170,229, 50, 40, 20,114,167, 62, 87,
+ 10,200, 20,114, 71, 58, 21, 74, 37, 36,114, 89,165,143,253,234,213,171, 80, 42,149,176,217,108,247,220,111, 42,123,252,206,198,
+229,243,207, 63,199,148, 41, 83,176, 98,197, 10,156, 59,119, 14, 77,154, 52, 65,183,110,221,144,158,158,142,179,103,207,194,104,
+ 52,186,157, 78,231,126,113, 23, 47, 94,196,175,191,254,138,248,248,120, 36, 38, 38, 86,249,188, 59,107,150, 54, 88, 27,118,157,
+198, 83,221,155, 85, 73,115,230,204,153, 72, 79, 79, 47, 17,185,114,142,110, 62,210, 17, 44,123, 19,147,211, 77,249,158, 40,149,
+ 90,173,118,116,136,244,244,244,116, 25, 25,178, 27,172,184, 91, 5, 37,250,114,217, 35, 89, 0, 48,106,212,168,123, 34, 88,165,
+ 39,167, 43,141,209,104,220,183,111,223,190,166,125,251,246,229, 47, 95,190,236,104,138, 52,181,105,131, 38,139, 23,227,252,196,
+137,232,152,144, 0,131,217, 12,133, 66,129,237,219,183,155,117, 58,221,190, 74, 86, 22,196,217, 96,169,213,106,120,121,121, 57,
+ 12, 70,101, 92,121,121, 79,136,206,255, 87, 38, 34,100,239,115,102, 95,236, 55, 86, 66, 8,244,122,189,163,179,102,101,162, 34,
+ 54,155,205,113,225,217, 59, 40,122,123,123, 59, 42, 13,251,104, 50,119,155, 71, 93, 77, 36,170, 80, 40, 60, 15, 28, 56, 80,203,
+ 62,141, 68,102,102, 38, 6, 15, 30,124,237,223,126,113, 81, 80,152,173, 54, 20,234, 13, 40,212,235, 30,184,254,234,213,171,113,
+227,198, 13,152,205,102,188,255,254,251,247, 24,171,202,116,114, 47,163, 92,221,104,214,172,153,216,171, 87, 47, 28, 61,122, 20,
+114,185,220, 66, 41,173,244,252, 85, 84, 20, 97,182, 90, 97,208,235, 81,168,213, 62, 18, 79,173, 23,207,157,251, 73,173, 86, 15,
+ 6,160,201,205,205,229,189,188,188,160, 82,169,160,215,235,243,248,226,145,130, 71, 0,147,183,197,242,225,160, 65,131, 62, 3,
+ 0,133,197,242,225, 17,192, 84,209,117,110,177, 22,155,245, 7,152,143,246,122,171,188, 58,169, 42,209,105,251,141, 84, 42,149,
+ 66,224,121,124, 59,119, 50,162,213, 25,104, 22,233, 1, 99,218,117,200, 60,252, 65,188, 35, 48,111,241,118, 92, 74,200,174, 84,
+ 58,135,172, 92,143,240,240,112,108,121,166, 31, 20,114, 5,134,108,216, 13,137, 68,130, 29, 99, 7, 67, 42,147,161,219, 87,223,
+ 87,233,216,181, 90,109,185,145, 42,119, 35, 88,165,143, 93, 34,145,160,105,211,166,168, 83,167, 14,246,238,221,139,102,205,154,
+225,250,245,235,184,126,253, 58, 18, 18, 18,112,238,220, 57,228,228,228, 84,250, 28,173, 93,187, 22,217,217,217,144,201,100,200,
+204,204, 68,124,124,188, 91, 83,177,184, 58,239,118,234, 61, 62, 19, 0, 16, 82,205,171, 82, 6,203, 89,243,163,143, 62,186,199,
+180, 63,138, 45, 29, 66, 57, 38, 64, 95,175, 94, 61,165,115,251, 41,199,113,240,240,240, 32, 83,166, 76,225,139,255,134,151,151,
+ 23,170, 85,171,230, 86,179,155, 68, 34,209,183,108,217, 82,105, 47,128,118,227,164, 86,171,249,169, 83,167,146,229,203,151,151,
+ 27,213,114,209, 7,235,179, 17, 35, 70, 60,159,148,148,228, 19, 16, 16,128,212,212, 84,200,100,178,162,139,162,115,103,196,221,
+186, 5,115, 81,159, 34, 92,189,122, 21, 75,151, 46,213, 26,141,198,207, 42,155, 81, 26,141, 6,126,126,126,142,166, 65,123, 4,
+199,201, 44,210,170, 84,100,165,151,202, 68, 28,236,154,206, 6,203,126, 99, 29, 51,102, 76, 9,179,229,118,129, 16, 4,107,199,
+142, 29, 5,123, 58, 44, 22, 11, 26, 53,106,132,244,244,116, 72, 36, 18,200,100,178, 18,145, 59,119, 12,150,171,137, 68, 5, 65,
+128,201,100, 66,135, 14, 29, 64, 8,193,151, 95,126, 89,165,200,203, 63,206, 96, 89, 69,162,209,248, 33, 36,164, 46,170, 5, 24,
+ 32,138, 15,238,237, 47, 86,171, 21, 99,199,142, 45, 17,177,178,143, 84,180, 55,241, 23, 53, 43, 89,170, 60,105,171,253,186,190,
+159,249,223, 68, 10, 71,211,150, 86,107,248,215,157,195, 26, 53,106,120, 22, 55, 25,150,230, 7, 74,233,175,101,158,155,226, 41,
+ 25,120, 96,246,157, 59,119, 26,122,121,121,161, 71,143, 30,216,186,105,211,150, 31, 0, 71,200, 38, 23, 72,242,185,123,119, 98,
+241,223,201,174,130,122, 69,125,176,140,208,106,245, 15,252, 56,239,247, 65,175,172, 7,106,158,231,177, 97,241, 7,136, 86,165,
+161,105,117, 57, 14, 31, 61,141, 86,225, 0, 76, 85,111, 1,182,247,109, 82,169,148,144,202,228,142,116, 42, 84, 42, 72,164,178,
+ 42, 31,187,115,125, 90,186,190,172, 74, 4,207, 57, 63, 95,120,225, 5, 76,155, 54, 13, 61,122,244,192,245,235,215,177,127,255,
+126, 92,191,126, 29, 19, 38, 76, 64, 76, 76, 12,122,246,236, 89, 41,205,245,235,215, 35, 47, 47, 15, 28,199, 33, 43, 43, 11,122,
+189, 30, 51,102,204,184,239,243,110, 39,126,215,251, 0,128,159,118,158,170,178,230,155,111,190,137,187,119,239,150,136, 92, 61,
+ 42, 81, 43,151, 6,235,234,213,171,101,182,247,197,196,196,164,117,239,222, 61, 32, 53, 53, 21, 26,141,198,165,185, 34,132,116,
+179,207,149,113,225,194,133, 50, 53,107,214,172,105,238,222,189,187, 36, 56, 56,184,196,232, 65,181, 90, 93,226, 98, 45, 75,179,
+184,242, 47, 32,132,188,212,174, 93,187,239,126,251,237, 55, 85,157, 58,117,144,159,159, 15, 74, 41, 86,172, 88,129,113,227,198,
+ 65,161, 80,224,234,213,171,232,215,175,159, 78,167,211,189,228, 60, 7, 86, 89,154,101, 25, 25,142,227, 28,243,195,148, 97,174,
+ 42, 60,118,103,230,207,159,239,152, 11,170, 34,150, 44, 89, 2,148,154, 82,161, 44, 77, 74, 41, 62,249,228,147, 7,166,121,229,
+202,149, 21,206,219, 35, 35, 35,191,124,236,177,199,132,196,196,196, 18,166,202,121, 41,163, 66, 42,161,233,106, 34, 81,158,231,
+ 17, 24, 24,136,247,222,123, 15,126,126,126, 8, 10, 10,186, 39,242,226,234, 28, 85,241,233,253, 47,213,164, 28, 61, 57,255,179,
+153,237,151,124,189, 81, 34,151, 1, 71,246,255,132,252,156,187, 37, 35,176,230, 63,135, 68,203,154,117,133,233,212,110,183,210,
+105, 52, 26,241,209, 71, 31, 97,230,204,153,247,204,129, 83,206,121,191,175, 99,119,199,100,149,165, 41,138, 34, 81,169,125,160,
+ 80,135,160, 65,140, 15, 68, 55,230,234, 20,255,254,243,174, 75, 76, 76,244, 10, 15, 15,199,181,107,215, 8,254,236,143,245,231,
+185,146,201,134, 0,248,181, 34, 77, 2,156, 91,179,102, 77,195, 70,141, 26,225,203, 47,191, 4,128,103,159,219,177, 99,240,211,
+122,189, 1, 40,154,124,180,216,140,185, 76,167,141, 82,162, 84,121, 67,161, 14, 70,131,134,222, 16, 69,247,231, 60,165, 21, 28,
+187,253,230, 87, 58,122, 85,201,137,164,239,209,180, 63, 32,221, 60,242, 11,250,244, 14,195,161, 99,231,177, 59, 81,133, 48, 89,
+ 42, 66,116, 25, 16, 51, 46,227,213,129,205, 48,111,125,209, 77,252,252, 73,215,154,132, 16, 28,122,237, 69,168, 85, 10, 60,185,
+230, 87, 72,165, 82,252,254,234, 51,144, 74,229,232,248, 89, 81,147,236,185, 15,167, 67, 34,151, 35,250,127, 51,221, 74,103,233,
+150, 26,123, 87, 14,231,125, 42,138, 96, 85,116,236, 5, 5, 5,200,205,205,197,119,223,125,135,145, 35, 71, 34, 61, 61, 29, 9,
+ 9, 9,184,118,237, 26,126,248,225, 7,199,232,244,202,164,211,110, 94, 38, 77,154, 4, 74, 41, 26, 52,104,128,153, 51,103,162,
+ 77,155, 54,149, 62, 71,165,207,123,105, 92, 69,175, 42,210,156, 55,111, 94,149,202,210, 35, 97,176, 42,122, 42,225, 56, 14,254,
+254,254,142,194,225, 92,240,170,242,164,203,243, 60,172, 86,171,163,227,180,125, 1,128,190,125,251, 98,235,214,173,238,140,140,
+248,141, 16, 50,188,126,253,250,223,204,154, 53, 75,211,177, 99, 71, 33, 36, 36, 4, 45, 90,180,192,213,171, 87,241,203, 47,191,
+ 88, 22, 46, 92,168,213,233,116,163, 40,165, 59,171, 82, 39,219, 95, 61,227,188, 84, 6,155,205,150, 24, 31, 31, 31,252,201, 39,
+159,240, 28,199, 97,222,188,121,206, 47,185,190,167, 16, 30, 61,122,212,234,170, 73,198,106,181, 38,198,199,199, 7,127,250,233,
+167, 60, 33,196,161,233, 60,249,171,115,222,185,163, 89,150,185,180, 15,120, 40,107, 41, 43,237,101,157,227,138, 38, 18, 21, 4,
+ 1, 87,175, 94,197,140, 25, 51, 64, 8,193, 79, 63,253,244,159,184,184, 14, 29, 79, 89,222, 54, 54,196,103,200,192, 78,141, 8,
+ 56,152,204,247, 14, 64,227,179,114, 29,230,234,137, 79,215, 98,227,107,131,221, 49, 59, 55,142, 31, 63,238,251,209, 71, 31, 9,
+ 60,207,227,243,207, 63, 47, 49,217,111,233,243,126,236,216, 49,107,149,154,247,138,175,103,179,217, 12,189,190,106, 81, 19,202,
+145,195,243, 62,122,167,251,146,111,183, 74, 8, 49,225,200,190,159,144,151, 91,246,208,116,153, 68,192,170, 53, 91,172, 2,207,
+ 37,254,205,167,110, 73,183,110,221,102,236,218,181, 75, 8, 15, 15,175,178, 72,123, 96,235,130, 5, 11, 30,123,230,153,103,124,
+235,215,175,143,141, 27, 55, 2,128,172,120, 65,241,204,238,191,185,103,146,196,205,159,127,252,206,179, 75,191,221, 42,227,136,
+ 25, 71,246,255,132,188, 82,102,189, 52, 82,169, 4,171,215,108, 54, 11, 2,127,197, 85,189,238, 28,189,186,223, 27,162,115,217,
+107,214,231,121,124,249,203, 82, 4, 52,234,133, 65,125,227,112,240,203,103, 48, 40,218, 0,243,186, 97,104, 56,112, 37, 86,188,
+ 94, 20,189,105,186,254, 13,183,238, 63, 30, 30,106, 71, 7,114,142,227, 32, 87,168, 32,145,255,217,127, 72,166, 82, 65,168, 68,
+ 36,203,126,236, 21, 69,170, 42, 27,193,226, 56, 14,145,145,145,168, 89,179, 38,218,181,107,135,102,205,154,161,115,231,206, 56,
+123,246, 44,206,158, 61,139, 9, 19, 38,148,107,174,220, 57, 71,221,187,119,199,149, 43, 87,238,187,144,151, 62,239, 15, 2,119,
+202,210,203, 47,191, 12, 0,143,110, 31, 44, 87,153,103, 47,144,244, 1,116, 70, 37,132,192,100, 50, 57,154,222,156,231, 85,178,
+119,122,119,115, 62,168,157,132,144,152,183,223,126,123,162, 66,161,232,172,211,233,234, 2,128, 90,173,190,106, 52, 26,127,215,
+235,245,159, 83, 74,115,239, 39,173,206,211, 50,148,113, 28, 21,102, 70, 70, 70, 70,207, 17, 35, 70,236,228, 56, 46,178,162,151,
+243, 58, 61,249, 39,164,165,165, 61,230, 74,115,248,240,225,101,106,150,165,235,142,102, 89,231, 92, 20,197,114,205,149, 59, 21,
+144,171,137, 68, 37, 18, 9,212,106, 53, 54,109,218, 4,127,127,255,255,212, 5,118,248, 68,202, 71, 21,109,239,228, 47,223, 7,
+160,218, 19,159,174,189,179, 55,211, 84,163,147,191,236,246,198,215, 6, 87,175,232, 59, 57, 57, 57, 61, 38, 77,154,244,171, 32,
+ 8,145, 21,157,111, 39, 35, 30,159,145,145, 81,233,105, 15, 40,165,184,114,229,138,248,194, 11, 47,100,102,100,100, 60, 93,149,
+227, 31, 63,241,227,207, 22,124,242,170,223,192,254,237, 91,128, 16,152, 76,229,116,234, 37,160,148, 82, 42,240, 92,226, 43,147,
+ 62,125,241,239, 60,103,148,210, 51,132,144,119,107,213,170, 53, 26, 64,121,119,194, 31, 92,233,236, 5,204, 50,163,241,147,216,
+216,216,169,111,188,241,134,119,223,190,125, 17, 30, 30, 94,238,124,129, 21,113,240, 88,210,232, 54,177,193, 97, 79,245,107,223,
+147, 35,132, 26, 77, 70, 23,245,106,113,126, 10,252,149,125, 71, 19, 27,187,138,206,115, 28, 87,233, 46, 10,238,208,117,224, 72,
+116, 29, 56,210, 81,158,118,173,235,132,147, 41, 59,209,156, 75,130,113,105,123, 16, 79,123, 81,231, 93,222, 39, 56,142, 67,191,
+ 21,155, 75,164,179,221,135, 37,163,179,117,199,189, 93,169,123,143,243,224,171, 7,213, 7,139,231,121,100,102,102,226,234,213,
+171, 72, 75, 75,131, 78,167,195,165, 75,151, 96, 54,155,145,147,147, 3,251, 72,195,170,164,243, 65,157,163,191, 83,243, 81,106,
+ 38,172,148,193,178,217,108, 73,174,222,122,110,181, 90, 43, 53,202, 72, 16, 4, 67,251,246,237, 73, 89,163, 13,236,127, 43,149,
+ 74,189,155, 21, 99, 46,128, 25, 0,102, 20,191,111, 10,217,217,217,247,237, 2,109, 54, 91, 74,203,150, 45,249,138, 12,145,205,
+102, 75,115, 97,134,180, 0,218, 60,200,147,247, 87,104,150,113,126,180, 29, 59,118,188,103, 30, 19,231,243,163, 80, 40, 42,236,
+117,235,106, 34, 81,157, 78,151, 58, 98,196, 8,155,115,179,160,243, 68,164,255,105, 8,189,221,123,200,243, 53,246,102,154,106,
+ 0,128,221,100,129,210,219,229,125, 37, 37, 37, 69, 15,160,227, 95,157,180, 91,183,110,153, 90,181,106,181,186,160,160,224,101,
+ 74,105,149,123,233, 79,152, 60,239,141,127,219,105,161,148,158, 1, 48,230,126,117, 76,192,229, 6, 6,195,203, 51,223,126,251,
+201,119,222,126,187,142, 8,248, 1, 69,115, 84,241,192,218,202,104, 29, 57,145,250,192,231, 6,179,217,108, 73,109,219,182,173,
+ 84,164,198, 85, 29,111,181, 90, 43,188, 79,172, 65, 56,112,162,114,154,127, 69, 58,157, 53,155, 52,105,130,166, 77,155, 58, 62,
+237,148, 94,239,142,102,243,230,205,209,160, 65,131,114,103,104, 47,221,231,234,239, 62,118,187,166,221,246, 55,109,186,227,129,
+105,222,111, 58, 31, 41,131,101,127,199,224,131,228,226,197,139,127,201,187, 81, 40,125,112, 99,189, 47, 94,188,216, 2,143, 40,
+ 87,174, 92,241,187, 95, 13, 87, 19,137,158, 59,119,174,243,163,154,191,123, 51, 76,207,221,179,174,216,108,253,221,104,181,218,
+234,148,210, 42,245,204, 31, 56,112,160,237, 81, 61,167,160,180,196,196, 83, 23,139, 38, 40,253,238,159,152,212, 11, 23, 46, 60,
+240, 58,253,175,184, 79,252, 21,233,100,199,254,207,215,252,183,195,102,136,100, 48, 24,229, 61,164,216, 88, 46, 48, 24, 12, 70,
+213, 32, 0,186,149, 83,185,186, 61,114,135, 16,210,173, 10,149,247, 46,166,201, 52,153, 38,211,100,154, 76,147,105, 62, 90,154,
+174,180, 31,244,200,225,191,243, 41,245, 47, 91, 0,116, 99,154, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,212, 22,214, 68,
+200, 96, 48, 24, 12, 6,131,241,128, 97, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12,
+ 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 84, 29,242, 0,231,227,100, 48, 24, 12, 6,131,193, 96,128, 69,176,
+ 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96,
+ 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193,
+248, 39, 24, 44, 66, 72, 55,166,201, 52,153, 38,211,100,154, 76,147,105, 50, 77,102,176, 24, 12, 6,131,193, 96, 48, 24,204, 96,
+ 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193,
+ 96, 48, 24,140,191, 9, 2,160,204,145, 0,148,210, 93,110,139, 84, 97, 52,129, 43,125,166,201, 52,153, 38,211,100,154, 76,147,
+105,254,247, 52, 93,105, 87,198,127,252,163,161,148,254,101, 11,128,110, 76,147,105, 50, 77,166,201, 52,153, 38,211,100,154,143,
+218,194,154, 8, 25,174,158, 48, 4, 66,136, 80,213,237, 15, 75,147,193, 96, 48, 24,140,127, 18,236, 38,198,168,200, 8,181, 1,
+208,167,248,239,159, 41,165, 71, 42,179,253, 97,105, 62, 44,154, 55,111,174, 84, 40, 20, 61,246,236,217, 35,187,116,233, 18,254,
+248,227, 15,186,122,245,106,179,193, 96,216,113,242,228, 73, 61, 43, 49,255,126,154, 53,107,214, 19,192,244,226,127, 63, 56,117,
+234,212,246,251,188,134, 72,173, 90,181, 38,200,100,178,222, 82,169, 52,196,106,181, 18,163,209,152,162,215,235,119, 38, 39, 39,
+127, 74, 41, 21,171,160,217,194,223,223,127, 76, 76, 76, 76,157, 91,183,110, 37,222,185,115,103, 21,128,237, 0,122, 86,175, 94,
+125, 68, 84, 84, 84,248,133, 11, 23,174,101,102,102, 46,166,148,254,241,119,165,147,193, 96, 6,203,189,139,143,243,241,241,233,
+174, 84, 42,255, 87, 88, 88,216,212,211,211,243,162,213,106, 93,144,154,154,250, 51,187,240,254,179,230, 74, 0,208,135, 82, 42,
+ 1, 0,158,231,251,183,105,211,166, 6, 33, 68, 36,132, 80, 74, 41,225, 56,174,169,205,102,227,138,247,239, 67, 8,249,131, 82,
+106,173,140,102,171, 86,173,194, 5, 65,160,148, 82, 66, 41,229, 56,142,107, 92, 25,205, 7, 69, 76, 76,204, 92, 74,105, 72, 69,
+251,168,213,234,216, 61,123,246,212,219,188,121,179,109,213,170, 85,185, 67,134, 12,209,140, 28, 57, 82,248,246,219,111,191, 2,
+240,191,210,251, 55,104,208,224, 51,142,227,252,221,249,125, 81, 20, 51, 47, 94,188, 56,137,149,188,191,157,233, 47,124,184,175,
+ 3,165,192,215,211, 59,114,197,198,165,202, 52,109,218,244,187, 1, 3, 6, 12,169, 91,183,174, 32,138, 34, 44, 22, 11, 76, 38,
+ 83,189, 83,167, 78,117,218,177, 99, 71, 44,128,167, 43,121, 93,246,153, 62,125,250,178,119,223,125,183,154, 68, 34, 33, 22,139,
+165,245,143, 63,254,216,107,204,152, 49,103, 22, 47, 94,220,100,208,160, 65, 30,246,245,239,188,243,206, 99,132,144,137,148,210,
+ 31, 30,118, 58, 25, 12,134, 11,131,229,225,225, 81,187, 90,181,106,175,249,249,249, 61, 22, 27, 27,155,247,210, 75, 47,221,188,
+113,227,198,249,200,200, 72,221,183,223,126, 59,199, 98,177, 44,172, 91,183,238,142,252,252,252, 79,239,222,189,123,169,146, 21,
+ 69,109, 0, 47, 1,120, 12, 64, 24,128, 20, 0,191, 2, 88, 70, 41,189, 82,149,131, 9, 13, 13,109,164, 86,171,167, 18, 66, 90,
+107,181,218, 48,181, 90,157, 66, 41, 61, 86, 80, 80,240,113,106,106,234,169,170,104,134,133,133,213, 4, 48, 94, 16,132, 56,155,
+205, 22,201,243,252,109,155,205,118,192,102,179,125,153,146,146,114,173, 42,154,237,194, 61,250,138, 26,207, 79, 45,188, 50,188,
+208, 96,149,106,228,130, 69, 34, 26, 18, 69,109,238,244, 99,119, 10,127,250, 39, 22, 20,153, 76,198,173, 90,181,170,137, 76, 38,
+ 3, 0,152, 76, 38,196,196,196,144,251,209,148, 72, 36,220,167,159,126,218, 76, 16, 4,152,205,102,177,160,160,128, 62,249,228,
+147,127, 75,179, 53, 33, 36,236,228,201,147, 94, 82,169,180,204,237, 54,155, 13,253,250,245,139,148, 74,165, 88,180,104,145, 37,
+ 43, 43,171,233,242,229,203, 79, 45, 92,184,208,127,197,138, 21, 3,203, 50, 88, 28,199,249,151,167,105,179,217, 96, 54,155, 97,
+181, 90, 97, 50,153,208,185,115,103, 86, 27,253, 51,168, 1, 0,219,206, 26, 0,192,247,126,197,148, 74,101,244, 19, 79, 60, 33,
+100,100,100, 64, 34,145,192,108, 54,227,238,221,187,168, 85,171, 22,191,121,243,230,186,149,213,171, 87,175,222,152,247,223,127,
+ 63, 96,219,182,109,230,213,171, 87, 27,187,117,235, 38, 29, 53,106,148,103,135, 14, 29,226,194,194,194,184,111,190,249,198,184,
+107,215, 46,243,240,225,195,229,115,231,206, 13,248,245,215, 95,135, 0,248,225, 97,167,147,193, 96, 84, 96,176, 60, 60, 60,246,
+105, 52,154, 90, 47,190,248,226,149,151, 95,126,121,135, 70,163,177, 1,192,247,223,127, 47,244,239,223, 63,227,201, 39,159, 76,
+215,233,116,252,194,133, 11,171,127,241,197, 23, 59, 61, 60, 60,146, 11, 10, 10, 90,186,113, 35, 35, 0,254,199,113,220,248, 30,
+ 61,122,236,179, 88, 44, 25, 91,182,108, 89,247,196, 19, 79,196, 81, 74,213,123,246,236,249,133, 16,178, 4,192, 39,238, 70,199,
+ 8, 33,124, 84, 84,212,204,176,176,176,201,139, 22, 45,146, 71, 69, 69, 65,169, 84,162,160,160,160,250,181,107,215,194,255,247,
+191,255,245,171, 89,179,230, 2, 47, 47,175,183, 78,158, 60,105,113, 83,147,132,132,132,188,234,233,233,249,222,220,185,115, 21,
+245,235,215, 39,106,181, 26,241,241,241, 13,143, 30, 61, 26,179,124,249,242, 81, 97, 97, 97,179,146,147,147,221, 78,103, 39, 66,
+ 4, 67,205,106, 59,124,234,181,236,180,120,217,215,196, 95,173,130, 64, 8, 44,102,179, 36, 77,167,143, 26, 55,118,244,186, 54,
+117,130, 14, 21, 72,210,186, 94,188, 72,205,127,147,209,144, 3, 0,165,212, 72, 8,249,153,231,249,254, 50,153,140,235,223,191,
+ 63,118,237,218, 69, 12, 6,131, 0, 0, 10,133,194,218,191,127,127, 40,149, 74,152, 76, 38, 17,192,207,229, 69,154,202,210,148,
+ 72, 36, 92,231,206,157,117,199,143, 31,207,182,107,170, 84, 42, 75,231,206,157,253,100, 50,153,210,106,181,210,138, 52,255, 34,
+ 19,137, 27, 55,110,148, 88, 87, 80, 80,128,140,140, 12,100,101,101,193,100, 50, 33, 55, 55, 23,162, 40, 18,163,209,152, 33,138,
+ 34, 56,174, 40,216, 86,158,166, 84, 42,197,213,171, 87, 75,172,179, 90,173,208,106,181, 48, 26,141, 48,155,205,208,235,245, 74,
+133, 66, 81, 59, 46, 46, 46, 9,192,230,194,194,194, 79,207,156, 57,115,155, 85, 79,127, 11,119,126, 62,109,168, 14,192, 4, 32,
+254, 1, 92, 79, 34, 0, 28, 56,112, 0,105,105,105,200,204,204, 68, 70, 70, 6,194,194,194, 80,149,232,255,149, 43, 87,230, 55,
+109,218,148,156, 57,115,102, 43,128,101,107,215,174,125, 34, 59, 59,123,209,148, 41, 83,124, 63,254,248,227,236,169, 83,167,142,
+ 5,176,113,237,218,181, 35, 27, 53,106,212,247,220,185,115,243,254,142,116, 50, 24,140, 10,230,193,162,148,134,212,174, 93, 59,
+251,243,207, 63,175, 55,125,250,116,191,194,194, 66,190, 56, 74,100, 32,132, 80,157, 78,199, 79,155, 54,173,218, 7, 31,124, 80,
+ 79, 46,151,231, 88,173,214,106,101,104,148, 53,212,114,188,167,167,103,191,248,248,248,181,245,234,213,243,125,255,253,247, 79,
+ 43,149, 74, 58,127,254,252,147, 53,107,214, 12,190,125,251,246, 74, 79, 79,207, 46, 0, 38,151,147,174,123, 52, 35, 35, 35,223,
+ 27, 56,112,224,228, 67,135, 14,201, 27, 55,110, 12,141, 70, 3,158,231,225,237,237,141, 86,173, 90,145,253,251,247,203,123,247,
+238, 61, 33, 47, 47,239, 99,119, 53, 67, 66, 66,222,232,213,171,215,156,147, 39, 79, 42,187,118,237, 74,100, 50, 25,114,114,114,
+ 32,151,203,209,186,117,107,178,120,225, 87,202,134, 13,234,191, 19, 22, 22,246,174,187,154,230,218,254, 59,135,188, 50,173,243,
+207,191,110, 39,129,129,129,184,249,201,187, 56,208, 33, 6,215,103, 79, 71,112,112, 48,182,110,251,141,244,125,246,149,246,158,
+150,192, 61,238,106,222, 47,206,154,132,144,151, 1,100, 3,200, 38,132,188, 76, 41, 61, 18, 19, 19,115,242,210,165, 75,136,139,
+139,195,186,117,235, 26, 79,153, 50,229,229, 41, 83,166,188,188,110,221,186,198,113,113,113,184,116,233, 18, 98, 98, 98, 78, 58,
+247,149,114, 71,115,223,190,125,232,210,165, 75,206,186,117,235,162,102,204,152, 49,119,198,140, 25,115,215,174, 93, 91,179, 75,
+151, 46, 57,243,230,205, 51, 86,164,249, 87, 28,187,115,100,201,121, 17,197, 63,239, 45, 1, 1, 1,233, 63,255,252, 51,250,246,
+237,203, 5, 6, 6,166,246,239,223, 95,126,252,248,113, 10,224,231,202,164,211, 96, 48, 64,175,215, 67,171,213,226,206,157, 59,
+202,133, 11, 23,182,159, 60,121,114,173,117,235,214,133, 78,152, 48, 97,172,167,167,231,169, 38, 77,154,212,120,216,199,206, 52,
+ 1,142,227,238, 2, 48, 3,208,114, 28,119,251,126, 52,159,122,234,169,134, 17, 17, 17,129, 63, 94,240, 65,142,180, 30, 68,169,
+ 55, 68,169, 55,108,126, 45,112, 67,246, 24, 66, 67, 67, 3,107,212,168,209,166, 50,154,148,210,157,167, 79,159,126,140, 82,186,
+152, 82,106,163,148,174,159, 58,117,234, 11,132,144,159,166, 78,157, 58,154, 82,186,190,120,253,242,179,103,207,246,165,148,254,
+254,119,164,147,149, 37,166,201,168,192, 96, 17, 66, 44, 31,125,244,209,209,175,191,254,122, 87,106,106,106,112, 84, 84,212,227,
+ 79, 60,241, 68,141,188,188, 60,242,196, 19, 79, 68, 6, 7, 7,247,217,183,111, 95,208,192,129, 3,247, 12, 28, 56,240, 8, 33,
+196,101,164,129, 16, 82,147,231,249,137,103,206,156, 57, 88,189,122,117,115, 74, 74,138, 71,211,166, 77, 11, 0,160, 78,157, 58,
+186,172,172, 44,165,151,151, 23,126,251,237,183,227,132,144,151, 8, 33,245, 92,105, 6, 7, 7, 55,243,243,243,251,223,123,239,
+189, 39,231,121,190,204,125,228,114, 57,222,123,239, 61,185,167,167,231,139,161,161,161,173, 93,105, 6, 5, 5,213,247,240,240,
+120,243,139, 47,190, 80, 24,141, 70,152, 76, 38, 4, 6, 6, 66,163,209, 32, 53, 37, 5, 41, 9,241, 72,139,191,133, 9, 47, 60,
+175, 84, 43,149, 19, 67, 66, 66,154,184,210,140,139,240,232,175, 14,107,208,105,220,248,255,225,194,132,145,216, 21, 42, 67,208,
+248,105,104,188,247, 60,194,102,125,138,223,163, 60,113,242,233,238,120,245,213, 73,144, 6, 68,181,109, 27,174, 25,252, 55, 68,
+174, 62,166,148, 42, 41,165, 74, 66,200,252,182,109,219,174, 86, 42,149, 47,191,255,254,251, 61,119,236,216,209,107,255,254,253,
+157,172, 86,171,196,106,181, 74, 14, 28, 56, 16,103, 48, 24, 4,185, 92, 14, 65, 16,168,187,154,109,218,180,249, 78,169, 84,142,
+ 93,180,104, 81,207,223,127,255,125,196,137, 19, 39, 94,177,217,108, 50,155,205, 38, 59,113,226,196,104,189, 94, 47,161,148,218,
+202,211,124,216, 72, 36, 18, 72,165, 82, 40,149, 74, 52,109,218,244,230,154, 53,107, 44,193,193,193,146,101,203,150,249, 4, 6,
+ 6,170, 87,172, 88,145,155,155,155,251,161,187,122,102,179, 25, 70,163, 17,122,189, 30, 6,131, 1,135, 15, 31,142, 28, 53,106,
+148, 96, 50,153,108, 35, 70,140,200,182, 88, 44,198,113,227,198,121,106, 52,154,215, 88,245,244,240, 41,142,152, 22, 2,208, 82,
+ 74,141,246,245, 17, 17, 17,242,208,208,208, 70, 17, 17, 17,114,119,181, 10, 11, 11,151,124,246,217,103, 97,156,220, 27, 7, 77,
+189,241,131, 56, 11, 59,188,190, 68,122,141,201, 8, 8,171,133, 94,189,122, 5, 16, 66,190,124, 0,105,222, 76, 41, 29, 72, 41,
+221, 80,149,239,255,213,233,108,209,162, 69, 92,108,108,236,137,230,205,155,167,198,198,198,158,104,209,162, 69,220,253, 30,243,
+211, 49,164,219,136, 38,124,210,192, 6,132,142,104,194, 39, 61, 29, 83,249,185,154, 24,140,191, 26,151,157,220,171, 85,171,102,
+122,227,141, 55,206, 24, 12,134,243,223,125,247, 93,173,225,195,135, 55,173, 81,163,198,213, 39,159,124,242, 23,141, 70, 99,181,
+247,201,113,147,231,123,247,238,189,205,223,223, 31,121,121,121,130,197, 98,225,181, 90, 45, 15, 0,162, 40,194, 96, 48,240,183,
+110,221, 18,140, 70, 35,109,221,186,245,150, 35, 71,142,188, 4, 96, 98, 69,130,106,181,250,229,165, 75,151, 42,202, 51, 87, 54,
+155, 13, 5, 5, 5,176, 90,173,152, 53,107,150, 98,242,228,201,255, 3,112,212,197, 77,117,252,252,249,243,229, 86,171, 21, 28,
+199,129, 82,138, 83,167, 78, 33, 43, 61, 29,134,130,124, 24,243,243, 96,206,207, 3,175, 45,192,136,199,122, 42, 22,111,216, 52,
+ 9,192,136,138, 52, 77,114,205, 7,223, 45, 93, 14,155,205,134,212,205, 63,150,185, 79,246,161,189,176, 89, 45,120,255,195,143,
+201,171,207, 15,122, 31,192,218,191,171, 96,200,229,114, 97,213,170, 85, 67,101, 50, 25, 40,165,196,100, 50, 97,199,142, 29,247,
+173,185,114,229,202, 17,118, 77,179,217, 76, 27, 54,108,120, 79,243,154,209,104,164,255,148, 11, 68, 38,147, 65,161, 80,192,108,
+ 54,163,122,245,234,250,126,253,250, 29,158, 63,127,126,117,158,231,213,130, 32,252,150,151,151, 55,247,194,133, 11,183,220,213,
+ 43,238, 60, 12,147,201, 4,189, 94,143, 59,119,238, 4,133,134,134,146, 55,223,124,211,166,211,233,162,150, 47, 95,126,227,199,
+ 31,127, 84,125,241,197, 23, 79, 2, 24,207,170,168,135, 71,173, 90,181,100,158,158,158, 94,213,253, 4,173,132, 71, 97, 58,165,
+ 30, 17, 17, 17, 53, 44, 22,203,147,132,144,214,117,234,212,241,185,126,253,122, 78,104,104,232, 81,142,227,126, 72, 76, 76, 76,
+117, 97,124,136,213,106,197,232,150,185,120,185, 13, 15,139, 37, 15,121,121,121,184,125,251, 54, 46, 94,188,136, 99,199, 46, 84,
+ 41,157,145,145,145,207, 43, 20,138, 30, 50,153, 44,194,102,179,113, 58,157,238,182,209,104,220,149,146,146,178,132, 22, 79, 80,
+ 84, 73,131,246,151,164,211, 73,255,211, 39,158,120, 34,196,203,203, 11,167, 79,159, 14, 57,123,246,236,167, 0, 98,239,235,186,
+ 20,184,111,102,127,242,101,104,176,191, 55, 46, 28,218, 26, 58,111,217,143,223,160,168, 47, 47,131,241,239, 49, 88,118, 20, 10,
+133,109,204,152, 49, 87,183,108,217, 18, 17, 27, 27,123,185,188,206,192, 46,104, 23, 29, 29,125,251,240,225,195,240,245,245, 53,
+ 91, 44, 22,222, 96, 48,112, 82,169,148,102,103,103, 19,189, 94,207,157, 61,123, 86,145,148,148, 36,245,241,241,145, 0,104,230,
+ 70,132,161, 77,100,100,100,217,166,198,100, 66, 97, 97, 33, 10, 10, 10, 96, 52, 26, 17, 24, 24, 72, 56,142,107,229, 50,172,199,
+113,237,235,214,173, 75,114,114,114, 16, 18, 18,130, 67,135, 14,161, 48, 55, 23,134,130,124,152,242,243, 96,206,203,133, 37, 47,
+ 23,185,233, 41,136, 8, 14, 35,197, 83, 11, 84,136,149, 87,214, 8,208,168,113,125,246, 52,180, 56,117, 27, 68, 34,197,241,134,
+193,160,150,162,174, 86, 45,207,165,128, 72,101,184, 60,225, 57, 4, 14,127, 17, 22, 78, 30,250,144,159,220,141,132,144, 41, 28,
+199,205,151,203,229,194,216,177, 99,145,154,154, 90,194,252,140, 29, 59,214,209,231,170, 67,135, 14, 7, 20, 10,133, 53, 35, 35,
+ 3, 70,163, 81,226,142,102, 68, 68,196,237,183,222,122,235,184,201,100, 10, 11, 9, 9,241, 54, 26,141,250,186,117,235,134, 40,
+149,202, 64,147,201,100,139,141,141, 93,162, 84, 42, 45,133,133,133,212,106,181,146,127,194, 5, 66, 8, 1, 33, 4, 86,171, 21,
+ 86,171, 21,222,222,222,218,172,172,172, 99, 55,111,222, 28, 90, 21, 61,139,197, 2,139,197,226,136, 98,137,162,136,115,231,206,
+ 65,161, 80, 72, 68, 81,188, 96,179,217, 84, 18,137, 4, 60,207,179, 57,234, 30, 34,205,155, 55,239,212, 56,208,243,179,177, 33,
+ 70,239,154,125,213, 90,149,140,215,126,156,165,140,248,229, 59,237,218, 62,189, 7,123, 76,158, 60,185,134,175,175,175,226,214,
+173, 91,134,121,243,230, 69,110,220,184,145, 0,248,164, 34,205,148,148,148,159, 62,248,224, 3,223, 78,157, 58, 69, 73, 36, 18,
+146,155,155,139,140,140, 12,164,167,167,227,206,157, 59, 52, 33, 33,225,166,213,106, 93, 87,153,116, 54,110,220,120,249,240,225,
+195,159,105,208,160,129,132, 82, 10,179,217, 12,157, 78,215,244,216,177, 99,253, 14, 30, 60, 24, 7,160,210,229, 50, 53, 53,117,
+221,135, 31,126,168,238,216,177, 99, 61,137, 68,194, 61,136,116,150,170, 7, 66, 52, 26, 13,118,237,218, 5,111,111,111,184, 26,
+173,235, 14, 70,139, 24, 26, 20,224, 7,195,161,207, 80,219,183, 6,140, 22, 49,148,149, 98,198,191,214, 96,101,100,100,200,180,
+ 90,173, 32,138, 34,159,151,151,167, 82,169, 84, 86,153, 76,102,170,228,239, 53,232,215,175,223,241, 86,173, 90, 21, 22, 71, 52,
+ 44, 1, 1, 1,230,188,188, 60,136,162, 8, 81, 20,173,158,158,158,133, 22,139, 5, 81, 81, 81, 28, 0,151, 77,132,122,189,190,
+186, 82,169,188,103,189, 78,167,115,152,171,194,194, 66,232,116, 58,120,121,121, 65,171,213,186,188,184,109, 54, 91,132, 74,165,
+ 66, 74, 74, 10, 0,160, 32, 39, 27,198,252,124,152, 10,254, 52, 87,182,220, 28,136,122, 45,188,195,194, 97,181, 90,195, 93,105,
+106,141, 54, 25, 15,138,244,173, 63, 33,240,229, 41,229,238,151,115,112, 47, 60,106, 71, 67,175, 55, 63,244, 57,202, 40,165, 11,
+155, 54,109,218,108,227,198,141,163,146,147,147,239,217, 62, 96,192, 0,140, 31, 63, 30,227,198,141,187,252,248,227,143,159,221,
+186,117, 43, 94,121,229, 21,136,162,216,132, 16,146, 71, 41,253,181, 34,205,233,211,167,159, 72, 76, 76,220,123,237,218,181,177,
+ 1, 1, 1,242, 70,141, 26, 93,111,212,168, 17,191,113,227,198,192, 23, 95,124,241,100,175, 94,189, 18,118,239,222,237,187,107,
+215, 46,133, 40,138,205, 9, 33,201,127,247, 60, 88,246, 38, 98,147,201, 4,131,193, 0,179,217, 12,155,205, 70, 42,145,167, 37,
+254, 23, 69,209, 97,214,140, 70, 35, 44, 22, 11,217,185,115, 7,182,110,221,202, 93,186,116, 49,108,250,244,215,145,151,151, 7,
+155,205,198,106,167,135, 64,108,108,236, 99, 2, 21,151, 14, 15,178, 42,134, 6, 90,181, 82, 66, 11,175, 45,125,171, 48,190,134,
+ 70,235,233,207,155, 60,253, 36, 33,211,166, 79, 11,190,121,227,166,241,163,143, 62,186,212,167, 79,159,128, 23, 95,124,177,254,
+182,109,219,226,170, 87,175,254,245,157, 59,119,114,203, 49,230,210, 81,163, 70, 29,243,246,246,174,185,122,245,234,244,228,228,
+100, 31,139,197,162,178, 88, 44,102,131,193,112,195,108, 54, 31, 52,153, 76,187, 82, 83, 83, 79, 86, 38,189, 26,141,166,241,160,
+ 65,131, 36,185,185,185, 40, 30,125,139,244,244,116, 52,107,214,140,223,189,123,119,131,170,228,193,197,139, 23, 63, 11, 9, 9,
+217,187,101,203,150, 30,106,181,186,185, 76, 38, 11, 18, 69,209,166,215,235,211, 12, 6,195,153,170,164,179, 84, 94,164,156, 58,
+117, 42,196,211,211, 19,137,137,137, 32,132,164,220,239,121, 83, 72,185,196, 75, 7,183,132,215,246,141,196,177,163, 71,161,144,
+114,137,172, 52, 51,254, 85, 6,171,160,160, 64, 56,117,234,148, 79, 98, 98,162,198,223,223,223, 80,191,126,253, 60, 66,136,200,
+113, 28, 77, 77, 77,245,141,143,143, 87,248,249,249,105,107,214,172,153,237,230,239, 93,155, 48, 97, 66,220,140, 25, 51, 78,118,
+239,222, 61, 19, 0,114,114,114,144,149,149,133,140,140, 12,152,205,102,164,164,164,112, 39, 78,156,240,253,237,183,223,154, 2,
+112,217,244,162, 84, 42,239, 20, 20, 20,212,245,246,246,118,220,208,236,166,202,217, 96,217,163, 89,106,181,218,229,197,205,113,
+ 92,114,114,114,114, 45,131, 94,143, 59,215,175,195, 88, 80,212, 36,232, 48, 87,121,217, 64, 97, 1,212, 10, 5, 10,178,179,192,
+243,252, 93, 87,154,106, 57,111,178, 88,109,178,106,189,250, 1,164,252,251,179, 87,203,118, 16,235, 53,130, 82,185,222,242,119,
+ 20, 8,142,227,108, 21, 53,251,202,100, 50, 4, 6, 6,138,173, 91,183,198, 43,175,188, 98, 55, 2,132, 16,210,137, 16,114,144,
+ 82, 90, 88,158,166, 40,138,220,165, 75,151,158,184,113,227, 6, 47,145, 72,184, 86,173, 90,197,180,111,223,222, 36,147,201, 32,
+149, 74,133,194,194, 66,143, 93,187,118, 41, 44, 22, 11, 41,214,124,104,243, 96, 1, 69,163,251,202, 48,240,208,106,181,208,235,
+245, 40, 44, 44, 68,110,110,174,160, 84, 42,235,118,232,208,225,168,209,104, 92,103,179,217,190, 57,121,242,100,126,121,154,102,
+179,185,132,217, 18, 69, 17,148, 82,216,108, 54, 88, 44, 22, 72, 36, 18,113,203,150,173,248, 98,225,124,172, 95,187,129,118,235,
+214,141,252,246,219,111, 16, 69, 49,137, 85, 79,127, 61,162, 40,126,250,251,180,167, 20,176,218,180,198,125,107, 10,183,103, 11,
+218,175, 47,252,126, 66, 47,112,249,213,235,163, 81, 68,120, 77,222,203,211,139, 91,177,114,105,214,111,219,246,220, 72, 74, 74,
+202,159, 61,123,118,155,168,168, 40,175,171, 87,175,134, 2,200, 45,199, 8, 69,140, 28, 57,114,100, 78, 78,142,116,217,178,101,
+ 43,146,147,147,247, 81, 74,111,150, 50, 30,205, 8, 33, 31, 3,144, 0, 8, 4, 96, 5,176,147, 82,186,178, 2,179, 34, 18, 66,
+240,251,239,191,223, 51,218, 79,116, 30,145, 81,249, 40, 86, 78,171, 86,173, 26, 95,187,118,109,115, 78, 78,206,234,210,219, 85,
+ 42, 85,191,152,152,152, 33,199,143, 31,127,155, 82,122,163,146, 15,110, 19, 47, 93,186,244,145, 40,138, 53, 56,142,187, 77, 41,
+157,250, 0, 34, 88, 47,204, 91,182,118,153,193,108,171,174,144,242,119,140, 22,241, 69, 86,154, 25,255, 26,131,101,181, 90, 53,
+111,189,245, 86,155, 38, 77,154,164,118,232,208,225,110,100,100,164,206,190,205,195,195, 67,239,231,231,167, 55, 24, 12,202,219,
+183,111, 7,111,218,180,169,142,205,102, 83,185,241,123,123,188,189,189,125, 79,156, 56,225,247,195, 15, 63,212, 62,117,234, 84,
+141, 97,195,134,117, 52,153, 76, 48, 26,141,184,117,235, 86,141,165, 75,151,138, 82,169, 52,151, 16,242, 7, 0,151,143,241, 22,
+139,229,200,181,107,215,234,180,106,213,138, 88, 44, 22,135,161,114, 54, 89,133,133,133,144, 74,165, 72, 73, 73,161,162, 40, 30,
+115, 35,157, 71, 79, 28, 63, 94,171, 97,253,104, 24,243,114,138,205, 85, 30,172,121, 57, 16,243,178,193,105, 11,225,231, 43, 64,
+165,208,224,106, 74, 42,138,211, 90, 33, 18,171, 62, 33, 57, 47,191,110,173,153,159,224,247, 40, 79, 80,139,217,209, 44, 8,192,
+209, 92,216,246,114, 6, 14, 28, 62, 2,193,102, 76,254,167, 22,154,179,103,207,166, 15, 27, 54,236,164, 40,138,205, 80,193, 20,
+ 5, 21, 60,133, 23, 20, 22, 22, 34, 51, 51,211,150,149,149,101, 0,128,244,244,244,156, 45, 91,182, 92, 18, 69,177,101, 85, 52,
+ 31, 4, 22,139,229,158,232,147,205,102,131,213,106,133,217,108, 70, 70, 70,134,236,224,193,131, 29,142, 30, 61, 42,189,120,241,
+ 34,142, 30, 61,218,100,211,166, 77,175, 71, 71, 71, 55,186,124,249,242, 93, 87,166,141,148,109,172,121, 0,216,178,241,103, 12,
+ 25, 50,132,100,102,102, 98,211,166, 77, 15,164, 25,133,225, 22, 90, 88,109, 74,211,190, 53,133,175, 93,151, 23, 92,208,241,179,
+ 79,158, 60,185,157, 82, 74,123,247,238,125,182,110,189, 40,127, 0,144,203, 52, 65, 13, 27, 54,236,232,227,227, 35, 3,128,144,
+144,144,230, 22,139,101, 33,128,246,101,137, 14, 24, 48,160,109, 64, 64, 64,211, 95,127,253,245, 76,114,114,242,254,210,230, 10,
+ 0,234,214,173, 59,235,252,249,243,143, 73, 36, 18,226, 84, 70, 40,128, 50, 13,214, 83, 79, 61, 85, 55, 44, 44,204,111,219, 53,
+ 47,228, 75,107,129,242,121,128,160,128,205,187, 49,110, 75,235, 35, 40,232,138, 95,173, 90,181,154,220,184,113,227, 76, 37, 35,
+ 76,213, 7, 13, 26,244,203,242,229,203,163,123,245,234, 37, 3,112,143,193,138,142,142,126,114,247,238,221, 3,199,142, 29,219,
+152, 16,210,151, 82,122,221, 93,253,147, 39, 79, 30, 2,208,230, 65,158,180,117, 23,232, 46, 20,207, 89,198, 96,252,235, 12,150,
+217,108,222,121,253,250,245, 22, 79, 61,245, 84,166,179,185,162,148, 58, 42, 3, 47, 47, 47,189,191,191,127,246,153, 51,103,170,
+137,162,184,207,141,223, 91,182,123,247,238,223, 23, 44, 88,176,198,215,215,215, 50, 98,196, 8,110,218,180,105, 7,178,178,178,
+104, 86, 86, 22,190,252,242,203, 14,113,113,113, 7,110,223,190,109, 59,121,242,228, 72, 0,189, 92,214,142, 90,237,194, 87, 94,
+121,101,200,129, 3, 7, 20,246,121,138, 74, 71,175, 44, 22, 11, 4, 65,192,194,133, 11,141, 90,173,118,190, 27,145,140, 37, 95,
+125,245,213,192,165, 95, 44, 80,240,102, 51, 44,185,217,176,230,229,194,150,155, 13, 78,167,133,135,130,160,118,179,106,200, 73,
+150, 99,213,246, 67,122,171,213,250,149, 75,131,101, 40,156, 50,118,244, 75, 63,239,220,243, 59,124,219,119, 65,214,239,191,221,
+ 27, 29,170, 22, 8,147,217,140,247,222,157, 73,137, 62,119,218,223,244, 68,207,155, 76,229,183,252,154, 76, 38,136,162,152,116,
+241,226,197,181,132,144, 2, 66, 72,167,226, 77,123,203,138, 94, 57,107,114, 28, 39,214,175, 95,127, 99, 96, 96,224, 19, 0,180,
+245,235,215,223, 40,151,203,187,152, 76,166, 86,162, 40, 38,157, 62,125,122, 3, 33,228, 46, 33,164, 79,241, 87, 31,234, 60, 88,
+ 22,139, 5, 51,102,204,192, 7, 31,124,128,233,211,167, 59,142,215,222, 76,104, 54,155, 35,119,236,216, 33, 61,116,232, 16,253,
+238,187,239,178,158,126,250,105,239, 97,195,134,121,175, 90,181,106, 34,128,169,229,105, 78,157, 58, 21,139, 23, 47,198,152, 49,
+ 99,238,117, 87, 60, 47, 38, 39, 39,193,100, 54,209,149, 43, 87,166, 8,130,224,243,249,231,159, 43, 39, 79,158, 76, 88,245,244,
+215, 99,179,217,222,108,247,233,166, 87, 9, 81,154,173, 86,235,252,179,103, 79,239,117,122, 16, 80,126,250,201,167, 2, 0,124,
+242,241,167, 18, 74,169,151,125, 98,216,217,179,103, 43, 70,143, 30, 29, 80,158,238,250,245,235,115,103,207,158,237,247,194, 11,
+ 47,244,218,187,119,175,138, 16,178, 13,192, 31, 0, 50,139, 31, 28,253, 1, 28,170, 86,173, 90,240,218,181,107,107,245,232,209,
+ 67,237, 70, 93,247,245,162, 69,139, 34, 62,221,239,129,109,218, 39,144, 40, 62, 13,234, 77,225, 27, 80,128,250,154, 59,232, 28,
+154, 28,178,122,245,234,101, 0,154, 87,194, 92, 53,120,234,169,167, 54, 45, 95,190, 60,242,165,151, 94, 74, 58,116,232, 80, 34,
+ 33,100, 86, 25,187,102, 61,247,220,115,183, 87,172, 88, 81, 75, 20,197,237,132,144, 94,148,210,107,172, 4, 49, 24, 85,139, 96,
+ 61, 79, 8,137,153, 62,125,250, 71, 33, 33, 33,213,103,206,156, 25, 95,191,126,125,173,227,106,203,202,210,236,219,183, 47, 42,
+ 63, 63,191,192,106,181,142,160,148,158, 45,227,226,237,230, 60, 87, 6,165,244, 54, 33,228,163, 38, 77,154, 12,249,241,199, 31,
+247,121,120,120,228, 31, 61,122,212,211,211,211, 51,239,210,165, 75,106,158,231,117,241,241,241,216,177, 99, 71, 7, 0, 95,148,
+245,148, 84, 90, 51, 53, 53,245, 84, 84, 84,212,252,201,147, 39,255,239,237,183,223, 86, 80, 74,161,211,233,144,159,159, 15,163,
+209, 8, 65, 16, 64, 8,193,154, 53,107,140, 70,163,113,105,114,114,242, 81, 87,154, 41, 41, 41, 71,194,195,195,191,153, 63,111,
+222, 11, 47, 14, 25, 44, 67, 94, 22,114, 83,147, 65,116,133,208, 40,229,136,233, 26, 6,109, 22,193,242,125,127,152,178,141,230,
+181,201,201,201,123, 93,105, 30,188, 83,240, 75,155, 58, 1,187,103,207,158,217,245,245,111, 55, 64, 20, 69, 92,126,229, 25,228,
+236,223, 9, 85,253, 70,104,123, 57, 3, 38,147, 9,211,167, 78, 6,175, 75, 59,112,244, 78,225,122, 87,154, 15, 2,103, 77, 66,
+200,203,132,144,103,162,163,163, 49,118,236, 88, 12, 24, 48,160,196,190,155, 54,109,194,162, 69,139, 96, 52, 26,159, 33,132,156,
+162,148, 46, 36,132, 28, 44, 62,183,133,174, 52, 35, 34, 34, 90,196,196,196, 32, 36, 36, 68, 87,108, 46,186, 95,188,120,177,121,
+116,116,116,105,205, 63,138, 53,173, 15,235,216, 41,165, 57,215,175, 95,247,252,248,227,143,137,217,108,198,172, 89,179, 96, 55,
+154,246,150,151, 55,222,120, 35, 68,163,209,224,147, 79, 62, 49,101,102,102,118, 89,180,104,209,158, 5, 11, 22,248,175, 89,179,
+102,168,221, 96,149,210, 76,191,116,233,146,199,226,197,139, 57,171,213,138,207, 62,251,236,158,102,200,137, 19, 39,194,108,182,
+ 64,224, 5,147, 65,111,104,160, 80, 40,110,248,248,248, 40, 69, 81,164, 15,235,216, 31,101,205,179,103,207,238, 4,176,211,157,
+239, 25, 12, 6,100,100,100, 32, 51, 51, 19,197, 93, 18, 72,121,233, 52, 24, 12,167,167, 78,157,122,114,201,146, 37,189, 14, 29,
+ 58, 52,112,255,254,253,189,118,237,218,101,184,125,251,182,213, 98,177,208,224,224, 96,161,125,251,246,138,222,189,123,171,229,
+114, 57,247,230,155,111,102,206,153, 51,199, 31, 64, 86, 5,245, 39, 79, 41,197,107, 29, 10, 48,181, 51, 15,147,201,140,220,220,
+ 92, 36, 39, 39,225,226,197,139, 56,114,228, 50, 40,165, 92, 37,243,115,254,234,213,171,163,100, 50, 25, 89,179,102, 77,245, 53,
+107,214, 76,112,149, 15, 43, 87,174,140, 88,179,102,205,194, 98, 45,145,149, 37,166,201,168,164,193, 42,190,160, 47, 0,232, 69,
+ 8,105,255,210, 75, 47,125, 24, 29, 29,109,180, 90,173,146,237,219,183,215,203,204,204,148, 89,173,214,169,148,210,253,149,249,
+ 65, 74,233, 98, 66, 8,250,247,239, 63,181,102,205,154,187, 79,157, 58,213,184, 95,191,126,219, 55,110,220,216,222,106,181,222,
+ 60,127,254,252, 51, 0,230, 3,248,194, 93,205,248,248,248,183,118,237,218,101, 61,122,244,232,107,211,166, 77,147, 7, 4, 4,
+ 16, 31, 31, 31,164,164,164, 32, 41, 41,137,126,251,237,183, 70,163,209,248,133,151,151,215, 91,238,106,202,100,178,215,246,159,
+ 56, 73,174,222,184, 49,242,249,199,122, 40,194,235,212,133,134,212, 69, 65, 86, 38,246,239, 77,195,138, 63,206, 24,210, 12,166,
+239,121,158,119,123, 40,125,232,245,140,158, 59,127, 88,254,235,222,221,123,186,205,253,224, 35, 18, 50,252, 5,168, 35, 34, 33,
+ 70,212,198,190,189,123, 49,103,246, 44,202, 23,166,237,183,220, 72,235,254,176, 11,130,125,206, 42, 81, 20, 5, 0, 80, 42,149,
+ 24, 63,126, 60,156, 95,141,179,104,209, 34,232,245,122, 0, 16, 8, 33, 31, 19, 66,190, 41, 47,106, 85,142,102,245,109,219,182,
+ 85,119,214,140,142,142, 46, 75,211,248,176,143, 63, 45, 45,237,173,231,158,123,238,125,137, 68,226, 93,222, 62,106,181, 26, 5,
+ 5, 5,176,217,108, 54, 95, 95,223, 43,246,200,104,121,215,145, 86,171,125,107,204,152, 49,239, 17, 66,202,141,116, 40,149,202,
+219, 7, 15, 30,172, 61,108,216, 48,110,237,218,181,183,134, 14, 29, 42, 63,120,240,160, 13,192, 6, 86, 61,253,179,112, 30,176,
+160,213,106, 1,128, 86,176,239, 29, 66,200,212,147, 39, 79, 42,198,140, 25,211,124,248,240,225,158,157, 59,119,214, 56,239,163,
+215,235,197,173, 91,183,106, 23, 47, 94,156,181,127,255,254, 63, 70,141, 26,245, 4,138,102,144, 47,147,148,148,148, 95,190,248,
+226, 11,175, 78,157, 58,213,177,217,108,142,254, 87, 25, 25, 25, 72, 74, 74, 66, 66, 66,194,109, 81, 20,183, 84,242,176, 94, 25,
+ 54,108,216,182, 21, 43, 86,212,120,233,165,151,146,126,248,225,135, 45, 0,242,202,216, 79,243,228,147, 79,246, 91,177, 98, 69,
+141,209,163, 71,223, 1, 48,129,205,240,206, 96,220,135,193,114,170, 44, 14, 2,104, 67, 8,233,207,243,252,148,194,194,194,207,
+ 40,165,155,239,163,162, 90, 76, 8,217,126,253,250,245, 23, 0,196,126,246,217,103,175, 3, 72, 68, 81, 8,189, 71, 89,253, 21,
+ 92,232,217, 0,188, 29, 26, 26,250,211,172, 89,179, 30,200,187, 8,111,220,184, 97, 2,240, 74, 72, 72,200, 15,239,255,176,254,
+ 45, 74,105, 51,158,138,126, 54,194,229,112, 28,119,218,102,179,205, 73, 74, 74,218, 87, 25,205,117, 69,233,236,209,186,186, 71,
+159,169,163,135,125,100,149, 40, 35, 10, 13, 86,153, 90, 46,152,164, 54,227,109, 78,159,243,230,209,219,133,255,136, 27,171,209,
+104,180, 62,241,196, 19, 95,115, 28, 39, 2,128,205,102, 19,140, 70,227, 72, 84, 98,228,105, 89,154, 3, 6, 12,248,150,231,121,
+107,113,100,136, 51, 26,141,207,223,143,230,131, 34, 51, 51,179, 16,192,184,138,246,137,139,139, 91,245,235,175,191, 14,235,222,
+189,187,237,151, 95,126, 73,127,252,241,199,133, 83,167, 78, 81, 66, 72,153, 79,113, 9, 9, 9, 70,148,243, 70, 2, 59, 77,154,
+ 52,169,241,205, 55,223,156,122,225,133, 23, 60, 23, 46, 92,232,123,252,248,113,219,242,229,203,243, 11, 11, 11, 63,101,213,211,
+ 63, 11,137, 68, 2,149, 74, 5,147,201,132,140,140, 12,184,234, 83, 78, 41,189, 65, 8,121,124,202,148, 41,113, 83,166, 76,121,
+ 60, 44, 44,172, 65,245,234,213,171,115, 28,199,165,166,166,102, 36, 38, 38, 38,152,205,230,221, 0,126, 1, 32,173, 89,179,230,
+105, 0,171,202,211,187,120,241,226,123, 33, 33, 33,191,111,220,184,241,113,185, 92, 94, 95, 38,147,249, 90,173, 86,174,176,176,
+ 48,219,108, 54, 95, 50, 26,141, 63,167,164,164, 28,174,100,221,121,149, 16,210, 89, 16,132, 95,150, 47, 95, 30,157,154,154, 26,
+177,111,223,190,190,165,247,107,222,188,249,138, 21, 43, 86,212, 24, 59,118,236,141, 53,107,214, 84,170, 15, 22,131,193, 12,150,
+123, 23,227,102, 0,155, 31,196, 15, 83, 74,111, 3,120,171,120,121, 32, 36, 39, 39,159, 3, 48,236, 65,102, 80, 74, 74,202, 33,
+ 0, 61,129,162,217,156, 19,139,110,154,247,197,209, 59, 5, 63,195,233,245, 42,255,144,167,115, 35, 33,100, 74,241,168, 38, 0,
+152,114,250,244,233,133,165, 34, 82,103,157,183,187,138, 52,149,165,121,230,204,153,210,154,231, 43,163,249,119,146,147,147,243,
+191, 21, 43, 86, 28,127,229,149, 87,228,131, 6, 13,194,229,203,151,241,213, 87, 95, 25,115,114,114,214, 84, 85,243,204,153, 51,
+183,155, 52,105,210,108,217,178,101,175, 45, 93,186,180, 63, 33,132,189,139,240, 31,130,193, 96,184, 57,100,200, 16,112, 28, 71,
+ 40,165,212,106,181, 58, 6, 61, 20,207,103,118,211,141,235,202, 10,224,247,226,197, 21, 31,187, 81, 31, 29, 1,112,228, 1, 95,
+251,119, 8, 33,143, 39, 36, 36,204,189,122,245,234,111,101,237,115,225,194,133, 77, 61,122,244, 80, 29, 57,114,228,141,202,142,
+ 34,100, 48,152,193, 98,184, 36,225, 1,152,171,127, 50,197,253,159,190,177,155,163,202,110,127, 88,154,127, 23, 23, 47, 94,204,
+ 1,224,120,101, 72, 84, 84, 20,250,244,233,115,223,186,197,102,106, 60,216,204,237,255, 40,182,108,217,242,216,163,114,172,148,
+210, 59, 21, 61,156,154, 76,166, 45, 0,182,176, 82,193, 96, 48,131,197,168,122, 69,107,188,159,237, 15, 75,147,193, 96, 48, 24,
+140,127, 50, 4, 64,183,114,110,122,110,143, 14, 32,164,242, 47,218,116,165,207, 52,153, 38,211,100,154, 76,147,105, 50,205,255,
+158,166, 43,237,255,204,232, 68, 74,233, 95,182, 0,232,198, 52,153, 38,211,100,154, 76,147,105, 50, 77,166,249,168, 45,236,133,
+178, 12, 6, 3,237,171, 19,239,158, 97,196,167,172,109, 61,195,136, 79,251,234,196,155,229, 18,131,193, 96,184, 15,235,131,197,
+248,215,241,244,211, 79,243,149,217, 63,222,219,155,203, 75,170,254,169, 70, 37,239,171, 51, 24, 63,189,254,203, 27, 95,252, 23,
+242, 33, 56, 56,184,158,167,167,231, 8, 0, 13,116, 58, 93,128, 74,165, 74, 7,112, 49, 63, 63,127, 85,106,106,234, 21,119,117,
+ 58, 69,145,233, 2,143,153, 70, 30,164,115, 4,153,243,123, 2,125,215,190,173,115, 4,153, 33, 74,240,166, 0,208, 78,145,228,
+189,189,241,244, 61,119,117,123,214, 34, 6, 10,200, 9,129,121,251,117,234,120,193,101,175,218,196, 32,210,123,215,247,172, 77,
+ 76,148, 66, 74, 0,227,246, 27, 84,193, 74, 58,131,193,248,207, 27, 44,153, 76, 22, 67, 41, 29, 69, 8, 9, 34,132,220,165,148,
+126, 99, 50,153, 46, 60,106,153, 37,147,201, 98, 8, 33,163, 40,165, 65,148,210,187,132,144,191, 57, 31, 8, 89,255,116, 81, 20,
+114,224, 58,136, 0,165,172, 72,151, 97,174,146,171, 47, 29,217,191,197,115,211, 70,117, 70,179, 65,159, 77, 69, 37, 38,177,253,
+ 39, 66, 8,225,163,162,162, 94,169, 81,163,198,224, 37, 75,150, 72,163,162,162,160, 80, 40,160,215,235,131,111,222,188, 25, 60,
+118,236,216,142, 53,107,214, 92,123,235,214,173,175,138,231,136, 43,223, 4,133, 17, 31, 72, 48,115,239,194,177, 50, 0,232, 56,
+118,209,140,200,208, 0,106,134, 68, 47,133, 69, 25, 46,193,140,125, 11,199,242,197,219,102, 70,134, 6, 16, 51, 36,122, 39,137,
+164,228,228,228,117,101,105, 83, 64,246,243,202, 79,208,239,153,201, 66,104,104,232,107,246,245, 77, 52,132,252,188,106, 30,122,
+ 13,249, 95,137,245, 49, 10, 8, 91, 87,126,130, 62,207, 76, 46,247,109,227,189,234,112, 22, 81,164,229,214, 91, 28, 71,172, 23,
+116,193,211,203,216, 84,102, 58,251, 68, 11,105,102,139,173,204,137, 96,165, 18, 62,253,231,203,214,192,208,208,208,167, 1,132,
+185,171,201, 96, 48, 24, 21, 26,172,136,240,240, 65, 28, 79, 22,152, 45, 54, 31,111,111,111,238,203, 47,191,228,250,246,237,139,
+159,183,110,197,248,241,227, 39,132,134,134,136, 82, 65,200,161,162,117, 66, 66, 98,202,143,238,252,216,147, 79, 62,153,102,177,
+ 88,202,157,213,154,231,249,244, 77,155, 54, 5,222,239, 65,133, 54, 31,148,102, 49,155,203,253, 29, 65,144,164,167,156, 94,231,
+214,239,132,135,135, 12,226, 9,183,192, 98, 19,125,124,124,124,184, 47,190,248,130,235,219,183, 47,182,110,221,138,113,227,198,
+ 77, 8, 11, 13, 21,165, 18, 62, 71,180,209, 9, 9,137,137, 63, 62,188, 83, 71,200,250,245,224, 48,176,232,191,245,235,193, 13,
+ 28, 72, 30,105,147,149,153,153, 73, 0,192,223,223,159,150, 48, 87,253, 90, 60,247,230, 75, 93, 49,103,233,110,232,141,166,213,
+255,246,227,140,138,138,122,229,233,167,159, 30,252,222,123,239, 73, 57,174,168,149, 95,171,213, 66,175,215, 35, 52, 52, 20,123,
+247,238,149,190,245,214, 91,131, 55,109,218, 4, 0, 11, 42,163,205,243, 60,249,125,231,254, 40,223,192, 16, 83,118, 90,138,236,
+249, 94, 13, 72, 89,219,236,235,234,213,171,231, 82,179,154,175,167,241,202,174, 43,181,237,255,143,235, 22,102, 43,103,189, 17,
+128,178, 34, 45, 81,164,194,142, 47,198,150,187,125,204,251,107,109,235,126,249, 83,211, 85, 58,205, 22, 91, 64,121,122, 61,198,
+ 47,178,215, 33, 97, 87,174,184,175,201, 96, 48, 24, 21, 26, 44,194, 97,225,154, 37, 31,251,100,101,231,224,135, 77,219, 17, 29,
+ 29,141,139, 23, 47,162, 94,116, 52,226, 90, 54,225,122,180,109,204, 9,132, 84,123,251,139,149, 11, 1,184,101, 44, 44, 22, 75,
+192,198,141, 27, 65, 8,129,205,102,131,205,102,179, 79,216,135,194,194, 66, 76,152, 48, 33,224, 65, 28,148,197,108, 14,184,249,
+199, 6, 72,120, 2,171,141,194, 98,163, 48, 91, 69,152,173, 20,249, 58, 43,186, 60, 62,204,237,223,225,192, 45,252,246,139, 79,
+124,114,114,115,177,241,215, 93,142,124,136,142,142, 70,151,118, 45,185,167, 31,239,200,169, 21,242,106, 47, 78,123,223,237,124,
+120, 16,172,127,250, 79,115,229,188,110,224, 58,216, 30,165, 2,124,249,242,101,222,104, 52, 14,241,244,244,108, 45,145, 72, 2,
+ 85,222,193, 98,174,180,102,150,150, 4,221, 50,107,101, 29, 70, 13,168,213,235,141, 23, 58, 97,206,210,221,248,118,203, 31, 43,
+188, 66, 19,103,252,155,143, 55, 56, 56,184, 94,141, 26, 53, 74,152, 43,251, 75,205,243,243,243, 81, 80, 80, 0,142,227, 48,117,
+234, 84,233,190,125,251, 6, 7, 7, 7,239,170,168,185,112,123, 18,205,233, 20, 69,102,118,124,121,209,108,158,227, 57,153, 79,
+248,169,217, 31,124,156,175, 86,171,169, 66,161,208, 87,139,136, 57,213,101,220,210,102,148, 82,234, 21, 90,231,143, 37,223,124,
+151,167, 86,171,169, 92, 46,151,191,244,210, 75,110,245,225,212, 27,244,152, 52,105,146, 81,169, 84, 82,133, 66, 65,141,166,162,
+ 89, 57, 12, 70, 3,222,124,243, 77,163, 74,165,162,106,181,154,154,204, 38,183,243,225,214,221, 2, 72, 5, 14, 82, 9, 15,169,
+192, 67, 25, 84, 23,178,194,120,152,205,230, 18,154,238,166,115,207,217,100, 40,101, 18,168,228, 2,106, 71,134, 65, 78,245,247,
+236, 51,118,236, 88,209,203,203,203,172,209,104,164,111,188,241, 6,235,191,202, 96, 48,170,102,176, 76, 22,155, 79,144,159, 55,
+190,253,230, 91, 76,125,125, 54,234,213,171, 7, 74, 41, 8, 33,120,125,198, 44,124,254,238,116, 12,126,172, 35, 44, 86,209,167,
+ 60,141,178,134, 90, 18, 66, 16, 31, 31, 15,131,193, 0,189, 94,239, 88, 98, 98, 98,220, 74,176,187,195, 55, 37, 60,193, 47,167,
+ 10,138,140,149, 69,132,217, 42,194, 98, 21,209, 57,198,163, 82,154, 22,155,232,227,229,161,198,210,197, 11, 49,245,221,143, 75,
+228,195,180, 55,222,194, 87, 31,190,141,137, 99,158,133,201, 98,243,169, 74, 58, 43, 3,211, 44,201,225,195,135,131, 85, 42,213,
+103,195,134, 13, 11,153, 48, 97,130,140, 10,106, 97,251,177,219, 94,159,124,179, 59,196, 96, 50,243,143,183,175,137,231, 7,196,
+ 98,206,178,223,139,205,213,157,151, 34,115,115,197,127,243,177,123,122,122,142, 88,178,100,201, 61,230, 42, 45, 45,141, 43, 44,
+ 44,132,217,108, 22,139,223,151,136,233,211,167, 75,222,122,235,173, 17,132,144,119,139,117,140,101,105,238,189, 69, 63,168, 17,
+ 26, 40,236,219,187,175,230,187,239,127,148, 63, 96,192,128,235, 28,199, 65, 34,145,224, 70,120, 56,125,172, 91,231,203,239,127,
+248,161,241,185,231, 95,186,192,113, 28,120,158,199,213,171, 87,163, 0,168,220, 57,118, 2,208,126,253,250, 57, 52,191,217, 57,
+159,218,215, 15, 25, 50,228,186, 93,243,210,198, 57,212,221,252, 20,120,130, 48,127,245,159,191, 32, 87, 2,197,111,197,116,214,
+116, 55,157, 2,207,161,117,189,226,231,174,208,102, 64,210,193,123,126, 83,161, 80,152,159,122,234,169,235, 9, 9, 9,110, 31,
+ 59,187,222,153, 38,211,100, 6,171, 76,204, 70, 61, 98,170,251, 98,241,167,239, 65,164, 28, 40, 40,168, 72, 65,169, 13,145,254,
+106, 24,117,218, 74,255,160, 40,138,176, 88, 44, 48,155,205, 88,178,100, 9, 10, 11, 11, 33,138, 34,234,215,175, 15, 0,104,222,
+188,185,115, 37,123,231,228,201,147, 53, 92,105, 6, 52, 26,112, 27, 20,213,157,215,189,243,241,215, 56,124,250, 38, 68, 17,144,
+ 43, 85, 24, 56, 98, 52,172, 54, 10,147,165,242,239, 39, 53,234,117, 8,209, 72, 48,111,238, 12, 16, 65, 2,158, 16, 16, 66,192,
+ 17, 17,245, 66,189, 97, 50,232, 30,250,137, 27,184, 14,226,250,245, 37, 71,129, 22,245,195,122,116, 34, 87, 42,149,234,179, 85,
+171, 86,213,104,209,162, 5, 7, 0,199,175,229,200, 63,249,102,119,200,215, 51,159, 32,205,234, 5, 33, 43, 79,143, 57,203,247,
+ 97,207,169,148,223, 74,155,171,127, 49, 13,162,162,162, 74,152,171, 79, 62,249,196,127,225,194,133,161, 0,240,212, 83, 79, 37,
+119,237,218, 53,243,234,213,171, 8, 14, 14, 38,153,153,153,143, 3,248, 95,241,195,205, 20, 74,233,194,178, 68,173, 16, 12,190,
+129, 33, 38,153, 76, 6,137, 68, 2,142,227, 28,139,111, 96,136, 73,237,233, 99, 42,189,222, 93, 8, 33, 37, 52, 75, 60, 8,149,
+179,222,101,197, 85,193,254, 85, 73, 39,207, 17, 39,241,178,187,128,201,100, 50, 8,130, 80,233,180, 50, 24, 12,102,176,238,141,
+ 98, 25,245, 8,243,150, 33, 72, 35,192, 98,177,226,162, 37, 4, 5, 58, 3,204,102, 11,238,152,205,184,117,230, 46,218,181,107,
+135, 39,158,120,194,102, 54,155, 33,149, 74,243, 54,110,220,232,235,202, 96,153,205,102,152,205,102,104,181, 90,172, 94,189, 26,
+130, 32, 56, 94,156,234,252,198,250,182,109,219, 86,119,207, 74,163,250,141,227, 63,193, 67,193,195, 42, 82, 88,173, 20, 86, 17,
+176,218, 40,244,102,138, 39, 70,189, 9,155,141,194, 38, 82,152,172,174,187, 40,149, 48,108,190, 45,208,111,250, 15, 0, 52,142,
+237,158,114,138,169,237,120,200,100, 18,200,100, 2, 12, 58,253,223,112,234, 40, 29, 56,144,136,143,106, 39,119,163,209, 56,116,
+216,176, 97, 33,118,115, 5, 0, 57,249, 70,193, 96, 50,243,205,234, 5,161,251,224,201,216,185,246, 19,252,122,232, 26,124, 52,
+194,254,176,255,134,185,130, 78,167, 11, 80, 40, 20,208,106,181,142,200,213,194,133, 11, 67, 77, 38, 19, 7, 0,130, 32, 9,203,
+ 16, 67, 21, 54, 17,240,242, 76, 69, 78, 78,158, 31,165,148, 20, 27,157,143, 9, 33,223,148, 53,115,190, 20, 22,101, 86, 90,138,
+ 76, 46,151, 27,236,198,132,231,121,112, 28,135,172,180, 20, 25,103, 51,209,210,235, 43,131,243,119,157,141, 87, 89,235,221,170,
+184,120, 82,162, 2, 40, 79,211,221,116, 10,188,211,126,124,217, 6, 75, 46,151, 83,158,231, 43,157, 86, 6,131,193, 12,214,189,
+ 17, 44,189, 30, 22,139, 21, 86,171, 13, 22,171, 13,121,133,122,124,248,225,135,144,203,229, 32,132, 64, 20, 69, 20,191, 0,149,
+179, 88, 44,120,252,241,199,125, 92,253,160,115,191, 43, 74, 41,120,158, 71,171, 86,173,238,217,239,232,209,163,149, 58, 16, 15,
+ 5,143,200,110,175,223,179,254,216, 79,239,129, 82,192, 38, 22, 27, 44,179, 27,247, 89, 23,134,173, 73,135,129, 48,153,204, 69,
+ 17, 61, 74,171, 20,201,123, 96, 38,235, 17,235,115,229, 20, 77,232, 54, 97,194,132, 18,119, 66, 31, 79,185, 85, 33,147,218, 78,
+ 93, 78, 37, 59,215,126,194,157,184,148, 34,202, 36, 2, 85,211,187, 81,255,149,227, 86,169, 84,233, 58,157, 46, 88,175,215, 35,
+ 63, 63, 31,249,249,249, 37, 47,104,137,132,188, 52,102,156,191, 68, 42,131,197,108,194,175,171,230,184,212,236, 28, 65,102,132,
+ 75, 48,227,197,199, 98,224, 87,163,193,233, 27,181,106,137,118,131,114,252,183, 85,109,214,125,252, 74,115, 81, 20, 73,222,157,
+179,199, 59, 13,124,249, 24,199,113, 48,153, 76,238, 79,163, 64, 8,185,113,227, 70,148,195, 72, 17, 66,236,235, 47, 95,190, 28,
+101, 55, 68,180,232,205, 18,110,161,241,240, 0, 52,213, 0,185,125,122,174, 63,191,234,172,233,110, 58, 27,212, 12, 1,130, 26,
+ 1, 50,175,138,202,156,236,234,213,171, 81, 54,155,141, 77, 33,193, 96, 48,238,207, 96, 25, 13, 58, 88,172, 54, 88, 45, 69,111,
+144, 55,153, 76, 80, 42,149,232,208,161, 67,137,104, 19,165, 20, 59,118,236,128,201,228,186,147,170,213,106,117, 68,176, 68, 81,
+ 4,165, 20, 63,252,240, 3, 36, 18, 9,164, 82, 41, 36, 18, 9, 36, 18,137,163, 14,118, 23,171,141,226,141,105,175, 65, 34,112,
+144, 10, 28, 36, 2,129, 84,224, 96,163, 20, 20, 20, 86, 91,209, 98,178,186, 23,200,168,200,176, 1,128,209,100, 41,122,110,166,
+128, 78,167, 99, 37,233, 33,146,153,153, 73,244,122,125,132,183,183,183,147,213,164,168,166,178, 25, 71,246,109,146, 50,242,157,
+ 13, 33, 38,139, 21, 82,129,167, 67,123, 68,167,236,222,184,215, 47,211,152, 75,236,163, 11,255,229, 92,188,113,227, 70,112,120,
+120, 56,242,243,243, 97,181, 90,197,167,158,122, 42, 89, 16, 36, 97,130, 68, 66,250, 12, 25, 39,222,189,155, 98,225, 56, 30,148,
+218,240,216,211, 99,137, 92,161,148,154, 77, 38, 43,128, 41,165,163, 87, 61,195,136,143, 40,193,155,246,169, 24,186,140, 91,218,
+236,177,110,157, 47,219, 71, 17,254,248,209,203,205,119,127,241,162,125, 91,203, 55, 63, 90,126,221,121, 20,161, 59,200,101,114,
+140, 24, 49,194,209,103,233,208,215, 83,138, 12,139, 84,134,126,253,250, 57,214,255, 54, 79,234,182,166,146,183, 2,133,119, 1,
+237,221, 18,235, 37, 18, 73, 9, 77,119, 81, 11, 86,224,238,169, 10,247,153, 62,125, 58,135, 82,125,175, 24, 12, 6,163,106, 6,
+ 75,175,135,213, 98,117,152, 44,179,217, 12, 0,248,244,211, 79,239, 49, 68,148, 82,199,246, 10, 53,141, 70, 68, 69, 69,193,100,
+ 50, 33, 58, 58, 26,148, 82, 12, 25, 50,228,158,253,142, 31, 63, 94,169, 3,177,216, 40,230,126,248,233, 61,235, 15,174,123, 15,
+141,163, 35,209,170,182, 10, 6,139,136, 60,173,245,190, 13, 27, 0,152, 76,102,160,120, 58,124,189, 86,203, 74,210,223,136,197,
+ 98, 65, 78, 78, 14,140,133, 57,214,186, 65, 52,239,133, 62, 53,141, 25,217, 58,129,163, 6,107,152,135,206, 88,152,157,204,171,
+ 84,255,141,251, 98,126,126,254,170,177, 99,199,118,220,191,127,191,148,227, 56,228,231,231,163,115,231,206,153, 25, 98,168,226,
+165, 49,227,252, 83, 82,146,173,158, 74,193, 40,149, 74,144,158,158, 46,118,236, 61, 76, 63,100,212,171, 33,175,190,249,254,146,
+148, 67, 11,239,233,127,165,227, 64, 5,167, 54, 54, 74, 41,253,240,227,143,140, 94,190, 1, 70,129,216,108,206, 77,246,148, 82,
+250,205,138,111, 13,190,213,130,141,114,185, 92, 62,116,232, 80,183,218,223, 12, 70, 3,222,126,251,109,163, 66,161, 40, 49, 90,
+208, 96, 52, 96,238,220,185, 70,141, 70, 67, 85, 42, 21, 53, 91, 92,215, 31, 28, 71,172, 99,222, 95,107,179,215, 53, 78,193, 48,
+ 8,130, 0,179,141,104,157, 53,221, 77,167, 59,163, 8, 39, 77,154, 36,250,248,248,152, 61, 61, 61,165,227,199,143,103, 29,177,
+ 24, 12,198,125, 24, 44,157, 22, 22,139,173,184,137,208,234,136, 58,141, 31, 63,254,158,125,119,239,222,237,210, 96, 9,130,144,
+254,194, 11, 47,148,152, 34,129, 82,138, 13, 27, 54,192,222,185,214,110,218,170, 18,193,154,249,214,100,200, 36,124,177, 33, 42,
+ 50, 70, 34,165,216,242,203, 14,108,249,101,135, 99, 95,158,151,164,223,143, 97, 43, 50,138, 22, 80, 90,116,103,210, 23, 50,131,
+245, 48,241,247,247,167, 25, 25, 25, 9,185,185,185,117,213,106, 53,178,178,178,144,157,157,141,220,220, 92,232,243,115,172,106,
+107,174,214,100,205,134, 32, 8,184,155,152, 6,155,205,118,247, 63, 18,189, 66,106,106,234,149,154, 53,107,174,125,227,141, 55,
+134, 76,159, 62, 93, 34,138, 34,174, 94,189, 10, 16, 66, 37, 82, 25,138, 70,234, 9,200,203,203, 23, 85, 26,239, 84, 51,229, 85,
+ 18,169, 12, 28, 47, 45,179, 41,249,224, 29,154,219, 41,130,188,211,241,229, 69,179, 37, 82, 41,241, 10,171,119,236,153,145, 47,
+ 94,176,119, 20,207, 78, 56,115,168,219,171, 95,183,181, 89,173,104,210,182,219,182,103, 70,190,120, 81, 34,145,224,252,249,243,
+ 81,174,162, 57, 4,176, 14,120,110, 42,239,225,161, 46, 28, 52,104,208,117,187,230,141, 95,231, 23, 62, 59,110, 6, 4,169,162,
+112,228,200,145,142,209,133,231,126,122,191,112,192,115, 83,229, 4,229, 55,123, 95,208, 5, 79, 95,247,203,149,218,175,191,254,
+186,113,216,176, 97, 14,205,203,151, 47, 71,245,235,215, 79,245,222,123,239, 25,157, 53,221, 73, 39,224,222, 40, 66,149, 74,101,
+126,230,153,103,174,151, 53, 50,145,193, 96, 48, 42,111,176,172, 86, 88, 45, 69,125,176,204,102, 51,172, 86, 43,150, 46, 93, 90,
+194, 12, 73,165, 82,112, 28,231,210, 96,109,220,184,177,196,228,158,205,155, 55,167,148, 82, 60,245,212, 83,142,230,198,145, 35,
+ 71, 98,244,232,209,149,238, 68,107,177, 1,179,230,124,234,208,233,221, 61, 14,253, 31,235, 8, 42, 22, 25,181,244,243,155, 42,
+229,216, 42, 50,108,142, 8, 22, 40, 64, 41, 10, 11, 10, 88, 73,122,200,152, 76,166, 93, 11, 22, 44,136,120,235,173,183,100,217,
+217,217,200,204,204, 68, 78, 78,142, 99, 41, 44, 44, 68, 80, 80, 16,126,251,237, 55,115,126,126,254,209,255,210,177,223,186,117,
+235,171, 45, 91,182, 96,223,190,125,131,167, 79,159, 46, 9, 10, 10, 34, 94, 94,105,196, 98, 54, 1,160, 52, 35, 35, 67, 84,105,
+188, 83,253, 3,195,238,164,220, 77,143,182,152, 77, 16,109,230,114,123,102,239, 77,160, 31,134,135, 6,242, 71,247, 31,171,249,
+217,188, 47, 10,237,166, 69, 34,145,160, 93,159,145,167,223,252,104, 89,252,130, 47, 22,152, 94,124,233,229,139,149, 25,245,119,
+209, 16,242,250,149, 43, 87,106,207,156, 57,211,232,172,217,253,149,121,107,250,244,233,163,250,248,227,143,141,246,117, 28,199,
+225,201,233, 95,175,137,139,139, 83,213,171, 87,239,186, 43,109,231,209,142,246, 79,251,122,231,117, 15,114, 20,161, 66,161,168,
+210,136, 71, 6,131,193, 12, 86, 9, 36, 2,151,119,237,118,170, 87, 53,181, 18, 86,209, 8,155,169,104,106, 5,155,205,134,151,
+ 94,122,201,177,223,208,161, 67,241,236,179,207,218, 59,148,150,124,130, 37,164,155,171,185, 50, 68, 81,196,193,131, 7, 75,140,
+254,169,168, 2, 43, 79, 83,107,180,225,208,143,239, 66,164,128, 88,228,123, 64, 65,220, 26, 53, 88,150,166, 43,195,166,240,240,
+ 1, 7, 10,240,192,205,228,116, 8, 60,151, 87,217, 99,175, 44, 76,243, 79, 77,185, 92,190,230,135, 31,126,232, 29, 23, 23, 87,
+163,113,227,198, 92,118,118, 54, 10, 11, 11, 81, 88, 88,104,143,114,225,210,165, 75,226,237,219,183,147,229,114,249, 15,255,165,
+ 99, 47,126,253,205,130,224,224,224, 93, 51,102,204, 24,145,153,153,249,120, 78, 78,174,223,207,223,206, 70,175,167,199,146,142,
+189,135,106, 77, 84, 80, 36,165,166,213,219,187,237,123,223, 95,215,126, 5,179,201, 52,154,144, 69,151,237,211, 52,148,214, 20,
+ 33,152, 60,188,124, 45, 74,165,146, 58, 27, 20, 65, 16,224,225,229,107,241,246,169,102,114, 54, 52,101,141,164, 43,239,216,203,
+210,180,175,255,167,104, 86,102, 20,161,253,183,216,181,201, 52,153, 38,155, 11,171, 74, 6,139,218,232,132,197, 63, 31, 93, 96,
+177,137, 94,246,117, 13, 26, 52,128,217,108,198,111,191,253,230, 48, 30,130, 32, 56,230,134,113,167, 15, 86, 41,238,116,232,208,
+161,162,169, 24,238,184,119,166,113, 39,182,243,160,234, 21,109,175,108,194, 92, 25,182,101,123,207,255,153,137, 28,151, 7, 74,
+ 39,176,226,244,240,136,142,142,182, 29, 62,124,120,210,216,177, 99, 63,235,218,181,107,104,255,254,253,165,225,225,225,144,203,
+229,184,121,243, 38, 14, 28, 56, 96,190,117,235, 86,178, 78,167,155,212,184,113,227,255,228, 72,203,212,212,212, 43,197,147,136,
+254,207, 62, 21,131, 92,161,148, 14, 29,245,106,152, 99, 20,225,218,175, 96, 52,232, 1, 64,168,104,154, 6, 59, 30, 30, 30, 50,
+251, 40, 60, 65, 16, 28,163,240, 60, 61, 61,101,231,207,159,119,140, 4,172,204, 40,194,135,169, 41,145, 72,170,164,233,206, 40,
+ 66,137, 68, 34,187,116,233, 18, 27, 69,200, 96, 48,238,207, 96,221, 73, 78, 94, 5, 96,149,243,186,199, 31,127,188,176, 95,191,
+126, 74,251,136, 66,251,104, 64,147,201, 4,147,201, 4,133, 66, 81,169, 9,161,220,153, 68,212, 29,210,207,109,170,241, 64,115,
+197, 13,195,150,146,146, 82,131, 21,159,191,151,182,109,219,166, 94,190,124,121,216,206,157, 59,135,238,223,191,191,155, 78,167,
+139, 32,132, 64,169, 84, 38,152, 76,166, 93,114,185,124,205,127,213, 92,149,135,217,108,182, 78,159,245,201,119,188, 32,181,138,
+162,153,152,205,230, 81,112,243,165,238, 0, 48,102,204,152, 50, 71,202, 13, 31, 62,188,202, 35,232, 30,166,102,241,107,113,254,
+146, 81,132,197, 29,219, 89,223, 43, 6,131,113,127, 6,171, 44,116, 58,157, 55, 33, 68, 72, 73, 73,185,103,155, 84, 42,197,237,
+219,183,173,255,133, 76,121,224,134,141,241,151, 17, 29, 29,109, 43,126, 16, 88, 85,250,101,207,143, 2,148, 82, 35, 33,100, 10,
+ 33,228,227,226, 85, 83,110,253, 62,223, 49, 90,144,144, 5,231,156,183, 85, 16,189, 74,170,226,203,139,147, 42,218,246, 79,215,
+148, 74,248,116,167,151, 58,223,179,205,197,111, 38,177, 43,144,193, 96, 60, 16,131,181,119,239, 94, 43,128,202,152,168,244,191,
+ 32,205,233,236,180, 61,218,172, 91,183,206,198,114,161,132,201, 90, 72, 8,249,198,110,184,220,221,230, 76,114,114,242,186, 7,
+157,174,127,131,230,207,151,173,129,127,199,113, 48, 24, 12,102,176, 24, 12,198,191,195,100, 25,171,178,141,193, 96, 48, 24,127,
+ 13, 4, 64,195,114, 42,229,243,110,139, 16,210,176, 10, 55,132,243,255, 32,205,128, 10, 52,119,185,208,236, 86,133,116, 50, 77,
+166,201, 52,153, 38,211,100,154,143,164,166, 43,237,255,204,232, 68, 90, 60, 27,249, 95,177, 0,104,248, 47,209,236,198, 52,153,
+ 38,211,100,154, 76,147,105, 50,205,191, 79,243,191,182,176, 25,243, 24, 12, 6,131,193, 96, 48, 30, 48,101,246,193,170, 22, 51,
+ 0, 92,169,121,207, 69, 10,100, 92,216, 84,165,253, 0, 96,214,172, 89,247,101,230,222,121,231, 29,183,222,210, 92,173,225, 0,
+112,110,140, 33, 19, 9,144,113,126,147,219,191, 79,106, 12,120, 11, 34,222, 40,250, 7, 31,209, 59,155,102,178,226, 83, 53,154,
+106,136,191,133, 72,250,120, 40, 36,253, 34, 60, 36,109,110,230, 26, 15,235,204,226, 86, 74, 44,155, 47,230,211, 28,150, 67, 12,
+198, 95,143, 79, 84,187, 97,126,254, 65,163, 69, 74,149, 0, 96, 50, 25, 44,201,137,119,230,211,156,139,107, 75,212,125,190,245,
+ 7, 6,133,132,141, 87, 42,212,202,162,234,143,152,178,179,238, 46,204,185,117,232,251,135,149, 86, 82,252,238,180,208,208, 80,
+239, 67,135, 14,213,104,215,174,221,237,228,228,228, 92,231,125,202,218, 70,157, 95,166, 89,134,102, 96, 84,179,103, 60, 52,234,
+151, 13, 70, 99,164,151,167,103,122,118, 86,214,226,212, 91,167,191,178,239, 83,163, 70, 13,207,181,107,215, 6, 15, 29, 58, 52,
+ 37, 62, 62,190,192,149, 38,131,225,210, 96,113, 4, 88,183,110, 45, 40,165,197,147,108, 82, 12, 29, 50,180,204,253,194,229, 41,
+145,162, 40, 62, 11, 96, 56,165,244, 76,138, 37,252,169,170, 36,100,247,238,221,161, 22,139,165,133,213,106,109, 6,160,153, 82,
+165,105, 98, 52, 26,210, 9,232,115,143, 61,246,216,105,119,117, 56, 10, 44,251,118, 37,102,141,233,244, 11,128,222,229, 92, 88,
+179,146,140,161,149, 51, 72, 34,125,243,143,253, 27,228,222, 42,130, 90,205,159,156, 10,224, 31,105,176, 66, 66, 66,148, 0,158,
+227, 56,174,171, 92, 46,175, 99, 48, 24, 18, 0,156, 35,132, 44, 76, 74, 74, 74,169, 98,229,198,197,104, 36,207,171,148,170, 94,
+193,106, 89,179,212,220,252,100,157, 69, 60, 32, 18,243,199,149, 53, 68,181, 8,145,213, 12,247,222,247, 90,255,184,232,198,209,
+ 53, 97,187,176, 31, 38,179,185,223,137, 84, 93,191, 37,167,211, 38,213, 34,164,217, 13, 74, 77,110,166, 43, 24,128, 64, 41, 77,
+ 4,128,176,176, 48, 31, 81, 20,227, 0, 52, 1,112,134,227,184, 3, 73, 73, 73,247,101,216,254, 69,154, 33,162, 40,190, 16, 24,
+ 24,248,120, 90, 90,218, 47, 28,199, 45,175,234,249,102, 60, 26,248,250, 5,189,252,229, 55,235, 29,211,214, 83, 81,148, 12,233,
+223,105, 4,128, 18, 6,203,219,219,239,185,111,215,252,170, 36,127,190, 97, 67, 54,110,212,192,209, 0, 30,138,193, 34,132, 16,
+ 74, 41,102,205,154, 69,150, 45, 91, 54,178,122,245,234,181, 41,165, 87,103,206,156, 57,223,121,191,210,219,222,121,231, 29, 90,
+252, 93, 90,150,102, 84, 76,251,205,207, 63, 59,184,211,132,177,207,105, 84, 74, 37,244,122,131,223,162,101, 43, 63,249,106,249,
+170, 62,207, 62,213,173, 23, 0, 44, 93,186,116, 64,120,120,120,132,201,100,138,159, 57,115,230,202,138, 52, 25, 12,183, 12, 86,
+177, 75,199,245,203,103,240,203,207,219,112,252,204, 37,136, 78,197,169, 65,131, 6,106,153, 76, 54, 48, 76,198, 61,215,168, 89,
+155,246,253,158,126,142, 88,136, 10,115, 38, 15,173,244, 60, 88,167, 78,157,146,167,166,166,206,142,172,215,252,213, 78, 61,250,
+115,245,163,235,193,223,207, 7, 34, 39,195,138,223,174,249,237, 93, 50,242, 75, 0,109,220,246, 65, 4,120,113,228, 51, 8,149,
+161,247,143,219,142, 33, 53,215, 6, 66, 0, 66,138, 12, 97,161, 65,196, 27,163,218,191, 83,121,131, 68, 56,111, 21,193,196, 53,
+ 6, 0,224,255,137, 39, 51, 56, 56,184,153,159,159,223, 87, 35, 71,142,244,169, 83,167, 78,176, 76, 38, 83, 25, 12,134,218,119,
+238,220,137,252,236,179,207,186, 7, 7, 7,127,144,154,154,186,161, 50,154,209,222,138,234,143,213,171,241,227,180, 49,207,181,
+172, 27, 17, 14,193, 88, 8,209,168, 13,191,125,235, 70,155,185,223,110,120, 49,198, 75, 50,228, 66,158,197,237, 14,137, 10, 15,
+233,155,111, 60, 63, 52,186,150,154,194,116,254, 16, 36, 60, 15,133,167, 15, 90,241, 60, 56, 66,235,191,115, 32,249, 13, 0,239,
+184, 81,233,190, 11,224, 13, 0, 68, 42,149,110, 8, 12, 12,188,218,182,109,219,198,131, 7, 15, 38, 13, 27, 54,196,153, 51,103,
+154,254,252,243,207,163,194,195,195,207, 90, 44,150,223,213,106,245,209, 27, 55,110,184,101,220,106,213,170, 37,211,106,181,173,
+ 37, 18, 73,231,127,178,102, 72, 72,136,210,100, 50, 61, 27, 22, 22,246, 82,191,126,253, 26,245,237,219,151,212,173, 91, 23, 87,
+174, 92,105,254,235,175,191,190,211,164, 73,147,115, 73, 73, 73, 75,101, 50,217,119, 41, 41, 41,110, 77, 2, 60,184, 33,185,178,
+246, 60,173, 87,213,237,165,206,145, 55, 0, 37,165, 52,197,141,125, 3, 1,168, 41,165, 55, 31,182,230, 95,244,160,115, 9,128,
+175,253,165,245, 28,199, 57, 94, 96,239,252,105,255,219,102,179,105,239,220,185, 83,211,133,102, 93, 81, 20,221,110, 9, 32,132,
+208,212,212,212, 43,229,214,241,160, 50, 0,152,251,206,100, 36, 39,222,134,222,160,213,231,230,102,173, 40,189, 95,110, 78,246,
+170, 23,134,247,249,159, 76,166,144,132,134,215,192, 27,179, 62,129, 61,234,245,176,152, 53,107, 22,121,231,157,119,176,116,233,
+210,190, 0,226, 40,165, 7,162,163,163, 23,148,186,103, 57,182,189,243,206, 59,243,103,205,154, 69, 0,148,105,132,170, 69, 53,
+ 25, 49, 98,200,128, 78,175,191,246,178,198,190, 78,169, 84,224,181,255,141,150,233,141,166, 54,139,190, 94,249,210,252, 57,211,
+150, 1,232, 2, 32,150, 82,122, 2,192,202,138, 52, 25, 12,183, 13,150, 72,129, 95,126,222,134,215,166,191,141,111, 86,124,135,
+239, 62, 28, 77, 98, 99, 99, 59, 80, 74,159,139,136,170, 53,240,201, 97,163,149, 17,181, 27,162, 80,244, 68,124,166,136, 83,191,
+175, 65,233, 39, 31, 87,108,223,190, 61,150, 82,124, 59,118,250,103,245, 26, 55,109,129,243,201, 86, 28, 74,180, 65,123,195, 6,
+129,215, 67, 20, 43, 63,196,220,222,236,215,188,121,115, 36,229, 88,113,224,138, 9, 60, 7,112, 92,209, 11, 93,121, 82,197,156,
+ 18, 77,215,102,127,123, 42, 38, 51, 77, 4, 68,211,181,127,218,137, 12, 13, 13,237, 18, 21, 21, 53,239,127,255,251, 95, 80,106,
+106,170,239,241,227,199, 33,151,203,225,227,227, 35,248,249,249,213,155, 62,125,122,222,220,185,115,167, 4, 6, 6,158, 78, 75,
+ 75, 75,112, 71,179,129, 70, 22,221,177, 89,204,225, 25, 51,223,241, 50, 29,251, 21, 57,107,214,129,231, 40,164,106, 13, 66,148,
+ 74, 44,232, 17,225, 59,109, 79,226,134, 70, 74,101,244, 57,189, 62,217, 29,205,240, 0,223, 30,181,235,214, 67,206,198, 47,113,
+ 61,223,136, 35, 25, 70,244,239,216, 18,181,124,149,104, 98,181,193, 79, 33,116,113,101,176, 8, 33, 62, 0,166,153, 76, 38, 78,
+ 42,149, 18,133, 66, 49,112,197,138, 21,123,234,214,173,107,176,239,211,186,117,107,180,110,221,154,104,181,218, 38,135, 14, 29,
+106,178,113,227, 70,115,112,112,240,193,212,212,212,121,229,233, 42,149,170, 59, 6,131, 62, 92,165, 86,155,150, 47, 91,182,187,
+117,235,214, 84, 34,145,224,126, 52, 1, 32, 40, 40,104, 67, 68, 68,132,255,156, 57,115, 10, 90,182,108,249, 64, 52, 35, 35, 35,
+119,196,197,197,117,238,209,163,135,208,174, 93, 59,132,132,132, 56,182,249,251,251, 35, 46, 46,142, 36, 38, 38, 54, 62,112,224,
+192,194, 29, 59,118, 44,136,140,140,252, 61, 62, 62,190,135,171,243, 67,129,186,247,179,189, 20, 60,128,185,132,144,101,148,210,
+ 67, 21,156,207,102, 0,134, 1,248,240,111,210,172, 16,165, 82,153,102, 48, 24, 2, 0, 64,161, 80,164,235,245,122,151,115,103,
+ 17, 66, 52, 31,125,244, 81,128, 84, 42, 5,207,243,176,217,108,142,133, 82, 10, 81, 20, 75,116,134,253,240,195, 15,221,154,219,
+237,238,221,187, 90, 20,141,254,166, 78,139, 88,214,103, 68, 68,132,191, 59,154,201,137,183,225, 97,137,207, 10,244, 80,214,136,
+244,240,158,221,174, 93,187,217,206,219,219, 70,123, 1,200,135, 94,127,247,118,114, 34,252,254,134,186,205,123,217,178,101,207,
+ 46, 93,186,180, 63, 33, 68, 91,156,191,141, 94,125,245,213,223, 75,229,121,163,226, 79,109, 72, 72,200, 94, 66,200,214,208,208,
+208,111, 1,220, 19, 29,246,210,120,140,158, 52,238, 69,205,255,217, 59,239,168, 42,174,181,141, 63,123, 78, 47,244, 94, 5, 20,
+164, 8, 54, 64,196,138,189,196,222,141, 37, 38, 26, 75, 98, 55,150,104,236, 81, 99, 76,108,177, 37,246, 30, 77,236,189,247,138,
+ 21, 4, 20, 5,164,247,126,250, 57,179,191, 63, 0, 47, 26,133, 3,122,111,242,153,249,173, 53, 11,157, 51,243,204,158,153, 61,
+123,158,121,119, 3,128,121,251,179, 48,119,127, 38,190,235,105,133,169,159,200, 49,108, 80,111,249,230,237,191,143, 4,240, 91,
+ 57,237,104, 95, 95, 95, 18, 21, 21,197,153, 43,142, 15, 19,193,186,253,224, 9, 54,111,221,134, 65,131, 6, 35,226,236,134,227,
+157,122, 14,233,216,184, 69,123,232,133,118,136,206, 32, 72,140,163,224,243,244, 96,192,226,197,157, 67,148, 97,152,109,111,104,
+188,115,216,132,227,199,143, 79,170,225, 89,127,201,183,115, 23,243, 30,167,139,176,229,138, 18, 6,117, 62,148, 89,177, 40,206,
+120,138,194,180, 39,200, 75,126,252,136, 97,152,185,198,106,254,245, 28, 0,150, 82, 16, 74, 74,138, 28, 80,252,165,209, 24,140,
+236, 18,170, 45,142,170,233,237,239,159, 43, 50, 0,218,226,168,202,143,253,225,187,153,190, 75,211,201,201,169,157,187,187,251,
+143, 35, 71,142,116,121,244,232,145,153, 66,161, 40,190,117,235,214,165,212,212, 84,123, 27, 27,155,196,254,253,251, 55,177,183,
+183,183,107,209,162,133,236,212,169, 83, 51, 1, 12,175, 76, 51, 64, 46,242,111, 30, 28,112, 99,225,210,159,228, 89,251, 86, 67,
+ 19,251, 16, 55,178,148,120,148,173,164,206,166,121,164,159,175, 21,100, 34, 62, 70, 6,218,155,140, 63, 21,247, 67,233,203,172,
+210,115,247,112,180,175,165, 83, 42,160, 82,234,112,252,121,190,242, 70, 65,190, 29,243,240,101,230,212,174,193, 18, 94,102, 10,
+ 28, 76, 4, 94, 85,189,158,132, 16, 72, 36,111,159, 30,206,194,194, 2,161,161,161,168, 89,179,166,112,224,192,129,173, 1,172,
+120,151,166, 86,171,113,100, 89, 10, 51, 51, 51, 97,155, 54,109, 8, 33,132,190, 57,129,121, 85, 53, 1, 64, 46,151,119,168, 95,
+191, 62,111,247,238,221, 69,105,105,105,241,159,124,242, 73,150, 68, 34, 97,223,216, 6,110,110,110,248,234,171,175,132,195,135,
+ 15,175, 84,211,222,222,190,221,142, 29, 59, 64, 8,121,245,226,126, 19, 55, 55, 55, 56, 56, 56,160,115,231,206,252,222,189,123,
+183,171,232,122,246, 15, 32,209,101,230,169, 95, 0,169,240, 37,210, 47,128, 80, 2,196,188, 25,201,122, 83,147, 82,154, 77, 8,
+ 89, 15,224, 0, 33,164,207,219, 12, 17, 33,164, 41,128,253, 0, 58, 81, 74, 51, 42,187,239,229, 53, 69, 34,145, 80,171,213, 90,
+190,105,124,170,170, 89, 62,226, 19, 30, 30,142,192,192, 64,148,255,171, 82,169, 94,205,189, 74, 8,177, 51, 54,127,242,120, 60,
+252,252,243,207,224,241,120, 16, 10,133, 16,137, 68,111,253, 27, 28, 28, 92,213, 50, 36,145, 16,194,212,168, 81, 99, 26,143,199,
+ 27,174,209,104, 92,196, 98,113,138,193, 96,216,106,101,101,245,125,120,120,184, 14,128,197,219,230,134, 45,175,169, 84, 21, 43,
+ 41,203, 74, 53, 26,149, 78, 42,151,186, 93,187,118,173,246,187,238,185, 90,173, 70,155, 54,109,144, 94, 88,156, 89,182,207,255,
+170,172,187,118,237,154, 91,141, 26, 53,188, 1, 52, 47, 93,117, 57, 57, 57,185, 69,185,255,151,231,114,114,114,114,167,210,127,
+199,188,124,249,210,173,204, 96,149,215,212,104,180, 30, 38, 38,114, 0,192,220,253,153, 80,239,168, 5,241,224,231,248, 60, 68,
+ 13, 83, 83, 83, 24, 12,122,239, 9, 19, 38,108, 67,201, 51,113,135, 82,218, 99,194,132, 9, 62, 0,206,187,185,185, 29, 4,144,
+255,191, 46,231,255, 13,154, 31,165,193, 42,173, 82, 46,171, 90, 38, 44, 5, 6, 14, 24, 8,150, 2, 39, 79,158, 4, 91, 82,118,
+155, 37, 41, 45, 80, 20,103, 3, 62,195,130,207, 35,224,243, 0,128, 32, 59,233, 9, 52,197,217, 87,147, 52,206,113,172, 17,254,
+254,228,201,147,161,238,126,141,126,152,187,112, 25,179,249,178, 18,249, 10, 21,178, 34, 15, 35,245,246,166, 84, 86,175, 61,204,
+ 48,204, 93,134, 97,238, 53,172, 87, 55,218,209,209,177,218,163,118,179, 20, 48,148, 55, 86, 44, 64, 62,178,232,174,139,139, 75,
+ 39, 79, 79,207,197,163, 70,141,114, 11, 15, 15, 55, 45, 44, 44,204, 60,123,246,108,180, 86,171,189,207, 48,204,202,148,148,148,
+150, 59,118,236,144, 77,157, 58,181,189,183,183,183,247,233,211,167, 21,149, 70,174,228,194,122, 67, 62,237,127,163,251,168,113,
+146,200,223,215, 64,252, 36, 28, 27,158,230, 26,238,102, 42,103,170,138,244, 43,164, 50,126,211, 92,181,254,204,148, 16, 39,198,
+ 81, 46,128,171,153, 32,204,216,244,138, 68, 18, 62,229, 75,160,209,232, 81,172, 99, 53,145,153,180,120, 82,203,186, 90, 42,183,
+145, 0, 0,159, 97,248, 70, 60,216,185,132,144, 31, 68, 34,209, 44, 66, 8,237,222,189,123,124,195,134, 13, 85, 0,160, 84, 42,
+161, 86,171, 33, 16, 8,160, 82,169,240,226,197, 11,220,188,121, 19,150,150,150, 85,186,174,185,185,185,112,115,115,131,137,137,
+201,123,107, 26, 12, 6,178,102,205, 26, 81, 68, 68,132,232,143, 63,254, 48,155, 50,101, 74,113, 72, 72, 72,194, 39,159,124,146,
+ 97,102,102,166,127,240,224, 1,110,220,184,129,188,188, 60, 52,106,212,200, 40, 77,141, 70, 3, 62,159, 15,165, 82, 9,177, 88,
+ 12, 62,159, 15,189, 94, 15,150,101, 95,153,174,162,162, 34,228,228,228, 64, 40, 20,226,109, 70,177, 60,101,102,169, 95, 0,161,
+191, 31,191,158, 1,176, 20,154, 66, 29, 52,249, 58,168,203,150, 92, 93,191,137, 63,213,255,253, 49, 37, 85, 40,132,111, 18, 66,
+250, 0,216,255,166,201, 42,103,132,250, 80, 74, 31, 84, 85, 83,171,213, 94, 45, 51, 62, 18,137,196,142,144, 18, 99, 40, 22,139,
+117,106,181,186, 85, 85, 52, 1, 32, 60, 60, 28, 13, 27, 54,228,149,106,150,111,102,195, 86,245,185, 36,132,128,199,227, 65, 44,
+ 22,131, 97, 24,132,132,132,160,119,239,222,240,245,245, 69, 98, 98, 34, 78,159, 62,141,168,168, 40, 8,133,194,215,170, 10,141,
+ 33, 44, 44,140,231,225,225,113,189, 93,187,118,254, 99,199,142,149,184,185,185, 33, 58, 58,186,198,218,181,107,167, 93,189,122,
+181,123, 96, 96, 96, 80,120,120,120,165,105, 78, 75, 73, 90, 61,160,123,216,103,121,185, 57, 59,106,248,154,207, 85,171,213,120,
+242,228,137,209,251,252,175,202,184,166, 77,155, 38, 80, 74,159, 81, 74,175, 16, 66,234, 38, 39, 39,183,112,118,118, 62, 65, 41,
+149,191,113,205,139,147,147,147, 59, 57, 59, 59, 23, 80, 74, 31, 17, 66, 98, 8, 33, 9, 73, 73,127,157,209,200,194,220, 44,179,
+168,168,216,222,196, 68,142,153,221, 45, 32, 30,252, 28, 99, 91,241,160,211,233,240,226, 69, 60, 60,220, 93,201,158,205,135,130,
+ 0,220, 1, 16, 28, 30, 30, 14, 0, 65, 0,226, 18, 19, 19, 29,203, 12, 22, 7, 71,149, 35, 88,111,246, 2,180,171,219, 3, 53,
+ 68,188, 94,143, 79,174,184,233,165,165,110,246,254,159,148, 70,162, 75, 34,213, 9, 15, 78,130,101,217,173,233, 70,244,202,187,
+113,227,134, 68,207, 98,243,212,111,231, 51, 27, 46, 40,145,158,150,130,148, 75, 75,161,204,120,178, 69, 42,149, 78,110,211,177,
+ 75, 65,117, 78,164,124,143, 70,103, 97,146,191,133,181, 3,212, 90, 90,106,176, 94, 55, 89, 31, 11, 78, 78, 78, 93, 61, 61, 61,
+231, 31, 62,124,216, 77,169, 84,154, 94,187,118, 45,239,204,153, 51,207,180, 90,237,198,212,212,212,157,165,133,206, 97, 62,159,
+191, 0, 0, 76, 77, 77,249, 60, 30, 79, 90, 81, 35,205, 0,115, 97,195, 97,159, 13,186, 58,105,229,111,146,103,143, 31, 96,229,
+254,227, 16, 27, 52,134,200, 92, 77,143,199,133,186,163,165,155,157,239,236, 36, 75,166,160,174, 2,134,192, 74, 42,116, 8, 37,
+ 68,114,131, 82, 85,101,105,182,113,117, 99,116, 53, 60,112, 69,175,130,137,169, 80, 4, 0,206,181,253,120,247,149, 58, 92,123,
+248, 4, 18,137,165,208,200,151,236,108, 59, 59,187,198,151, 46, 93, 34, 69, 69, 69,170, 71,143, 30,193,202,202, 10,246,246,246,
+ 48, 55, 55,199,147, 39, 79,112,238,220, 57,196,196,196,128, 82,138,122,245,234, 85,233,218,166,167,167,163,160,160, 0, 61,122,
+244,108,157,146,146, 44,177,179,119,208,156, 63,119,246,108,117, 52, 89,150, 37, 0,224,239,239, 15,127,127,127, 65,114,114,178,
+197,209,163, 71, 77, 22, 47, 94,236,100,107,107,123, 71,169, 84,190,102,156,140, 53, 88, 0,160, 82,169,160, 86,171, 33, 20, 10,
+ 33,145, 72, 32, 20, 10, 81, 80, 80,128,244,244,116, 20, 22, 22,190,138,184, 25,171,251,234,211,100,123,179,187,127,205, 28,159,
+217, 85,243, 75,247, 90,169,201, 58, 79, 8, 41,187,191,233,165,127,251, 84, 84,213, 87,137,230,107, 17,150,114, 81, 38, 65,117,
+ 52, 3, 3, 3,203, 52, 94, 43, 37, 36, 18, 73, 70, 89,228, 74, 34,145, 24, 53, 85, 23, 33, 4, 44,203, 66, 40, 20,162, 94,189,
+122,152, 57,115, 38, 34, 35, 35,113,225,194, 5, 56, 58, 58,162,107,215,174, 16, 8, 4,136,143,143,127,173,125,150, 49, 55, 39,
+ 62, 62,126, 90,251,246,237,253, 87,174, 92, 41, 73, 72, 72, 64, 84, 84, 20,204,204,204, 48,127,254,124,241,244,233,211, 61,175,
+ 95,191, 62, 27,192,143,149, 94,195,156, 39,251, 75, 13, 46, 26, 52,104,240, 89,155, 54,109,254, 90,174,218,218,154,239,222,189,
+219,174,204,120,149,223,231,127, 69,114,114,114,222,220,185,115,151,251,250,250,174, 40,173, 22,108, 78, 41,149,167,164,164,132,
+237,223,191,159, 0, 64,159, 62,125,168,147,147,211,197,210,188,241,104,197,138, 21,173,162,162,162,232,220,185,115,223, 90,206,
+165,102,164,174,255,113,213,134,229,115,103, 76, 20,125,211, 89,134,207, 67,212, 96, 89, 22, 60, 30, 15, 43,215,109,214,197, 68,
+ 62,122, 24, 20, 20,116,148, 82,218,163, 52,154, 89, 4, 32,134, 16, 18, 39, 18,137, 82, 94,188,120,193,185, 7,142, 74, 97,202,
+135,199,223,181, 81,198,163,131, 96, 89,214,209,194,214,217,106,228,167, 29,192,178,128,158, 5,244, 6, 10,165,162, 24,105,209,
+ 23, 20, 26,141,198,168,135, 46, 59, 59,123,193,176, 9, 75, 60,239,190,228, 35, 53, 87,131,164,115,243,169, 58, 43,186,119,215,
+174, 93,135,183,105,211,166,160,218, 39, 82,218,243,209, 89,152,228,111,105,227,116,241,187,165,155,112,231,133, 6, 44,253, 79,
+ 36,203,192, 2,236, 71, 18,192,114,118,118,246,178,180,180, 92,118,248,240, 97,119,145, 72,100, 26, 27, 27,107,184,120,241, 98,
+138, 78,167, 91, 91,102,174, 74, 77,216,160,128,128, 0,157, 76, 38,131, 66,161, 80,233,116,186,162,119,153, 43,127,169,212, 37,
+ 48, 32,224,242,164,149,191, 73, 84, 26, 13,242,149,106,216, 58, 58, 24, 30,229, 42,122, 60, 42, 84, 31,125, 21,225, 50, 21, 52,
+ 9,170,229,236, 76, 36,166,160, 0,146, 11, 53, 41,198,152, 43, 0,144,155,154, 51, 46, 65, 97, 8, 26,191, 26, 74,158, 57, 5,
+ 0, 75, 59, 39,166,213,152,239,209,113,229, 37,168,249,166, 70, 91, 96, 62,159,175,246,242,242, 82,149, 22,170,200,206,206, 70,
+100,100, 36,114,114,114,176,122,245,106, 68, 71, 71,191,122,233, 86,205, 96,188,122,137, 35, 51, 51, 67, 76, 41, 69, 70,122,154,
+168,186,154,101, 6,171,220,189,195,232,209,163,249,197,197,197,146,242,230,170,170, 6,171, 44, 29,148, 82,104, 52, 26,228,231,
+231, 67,163,209,224,217,179,103,175,204, 85,105, 4,173,106,231,175, 41,212,189,117,189, 42, 71,247, 30,213, 9,215, 0, 8,203,
+ 13, 82,104, 95, 93,115,245,134,241,169, 82,244,167,178, 8, 22,222,210,128, 89,169, 84,218, 83, 74, 73,120,120, 56,140,105,127,
+ 85,222, 96,137, 68, 34,244,237,219, 23, 17, 17, 17, 72, 76, 76, 4,159,207,135, 74,165,130, 74,165, 66,163, 70,141, 32, 18,137,
+170, 26,193,162, 2,129, 96,208,216,177, 99, 37,113,113,113,200,202,202, 2,195, 48,208,235,245, 48, 24, 12, 24, 62,124,184, 84,
+ 36, 18, 13, 66, 21, 27, 98,223,191,127,191,195,181,107,215,188,223, 92, 50, 51, 51,243,197, 98,241, 63,178, 12,220,191,127, 63,
+233,211,167, 15,237,211,167, 15, 45, 51, 90,198,146, 25,247,120,253,206, 61, 7,207,204,156,187,180, 40, 43, 59, 7,114,185, 28,
+153, 89,217,248,110,193, 50,221,133,171,183, 47,142, 30,254,105,232,242,229,203,151, 0,136, 41,221, 37,102,197,138, 21, 67, 71,
+140, 24,177,189,108,184, 6, 14, 14,163, 35, 88,101, 85,132,239,248,178,107, 96, 97,227,124, 97,198,162,223, 76, 14, 60,228, 33,
+ 55, 53, 6,170,140, 24,184, 54,236,142,244,152,107,160, 6,221,159,145,145,145,197,149, 29,236,212,169, 83,181, 93,189,131,198,
+215, 15, 12,193,210, 99, 69, 40,138,220, 3, 77,110,220,186, 46, 93,186, 28,124,223, 19, 97, 41, 48,105, 80, 19,127, 75,107,199,
+139,223, 46,249,205,234, 72,132, 0,217, 41, 49,136, 62, 52, 13, 6,237, 95,106,197,142, 87, 85, 95,202,106, 68, 69,121,233,208,
+ 20, 26, 32, 97, 20,146,191,251,198, 37, 39, 39, 63,243,247,247,223,246,235,175,191,142,170, 87,175,158,108,252,248,241, 79, 11,
+ 10, 10, 22,166,164,164,252, 94,238, 69,222,186,102,205,154, 83,230,207,159,239,249,242,229, 75, 92,190,124,249, 25,143,199,187,
+243, 46,205, 8,165, 50,169,174,185,120,237,213, 93, 27,191,225,185,121, 99,239,220,169,250,235,143,159,116,139, 44,212,159,120,
+101,174, 76, 68,190,161,254, 94, 71,191, 30, 59,138, 49,220, 59,137,232,196, 12,164, 22,235,206, 25,157,238, 66,133, 78, 32,150,
+194,196,193, 29, 9, 42, 86,232,226,226,114,123, 68,207,174, 66,134,199, 7,195, 23,226, 69,158,218,232,151,184, 94,175, 23, 63,
+121,242,132, 0,120,205,220,169, 84,170,119, 70,124, 62, 36,198,106,190,173,125, 20, 0,232,116,186,106,107,150,143,216, 84,118,
+ 44,150,101,161, 86, 87,161,175,136, 58,239,237,247, 64,153,165,251, 16,151,173,244,175,232,125,204, 85,153,241, 41,107,128, 46,
+ 22,139, 95,153, 20, 99,163, 76, 21, 68,176,170,245,251,219, 12,186, 80, 40,132,143,143, 15, 46, 95,190, 12, 11, 11, 11,152,152,
+152, 64, 46,151, 67, 34,145,192,194,194, 2, 34,145, 8, 12, 83,165, 33, 2,169, 86,171,173,225,226,226,130,103,207,158, 65, 34,
+145,188, 90,196, 98, 49,124,124,124,160, 80, 40,156,241, 81,197,234,255, 59, 12,237,211,182,251,250, 93, 7,134,236, 61,112,116,
+140, 90,165, 10,240,241,246,162, 81,143,239, 61, 28, 61,124, 80, 71,238,234,112,124, 80,131, 85, 65,161,210,192,194,198,249,194,
+180,239,127, 53,219,119,143, 65, 94,106, 52, 18, 78,126, 91,104,208, 42,114, 89, 86,231,150,251,252, 42, 0,108, 53,242, 75, 62,
+184, 73,235,238,204,197, 40, 13,180,133, 41, 40,136,216, 27, 47, 22,139,167,127,136, 19,113, 21, 37,249, 91, 90, 59, 94,156,190,
+248, 55,171, 3, 15,249,200, 73,137,193,243,227, 51,242, 13, 90, 69,235,240,240,240, 87,227,104,217,251,247,192,231,211,150, 99,
+243, 15, 19,141,214, 30, 44, 18,117,239,239,103,209,101,120,243, 20, 24,136, 1,131,158, 68,117,114,106, 78,186,167, 92,161,135,
+254,206,155, 23, 17, 17,241,189,151,151, 23,163,215,235, 63,215,106,181,115, 83, 82, 82,246,151,139, 92,181,115,115,115, 91,186,
+ 96,193, 2,151,132,132, 4,209,141, 27, 55,114,238,223,191,207, 26, 12,134, 37, 21,105, 62,202, 87, 79, 13, 48, 21,242,188, 92,
+157,198, 62, 75, 74,234,246,184, 64,127,178,236,183, 0,185,200,191,121,125,223,107, 11,230,126,107,170,185,186, 31,197,169,137,
+ 88, 29,158, 86,192, 26,116, 51,140,140,186, 89,185, 9, 41,153, 49,226, 51,182,176,176, 16, 50,145,144, 77,140,126,206, 27,210,
+182,133,225,135,105,147,153,180,180, 52, 40,138,139,249,206,206,206, 86,201,201,201, 57,149, 68, 8,230, 3,104, 93,175, 94, 61,
+180,111,223, 62,126,222,188,121, 81,229,205,199, 63,204, 96,189,245,235, 90,171,213,146,234,106,150,143, 96, 85,102,176,170, 28,
+193, 82, 23,188,221, 72, 41, 50,223,215, 96,189, 36,132,212, 40,251,247,135,184, 7, 42,149,202,174, 92,213, 32, 40,165,213, 14,
+103,149, 70,176,170,253,123,121, 24,134, 1,165, 20, 34,145, 8, 49, 49, 49,112,112,112,128, 94,175,135, 92, 46,135, 76, 38, 67,
+105, 68, 25, 34,145, 8,124, 62,191, 42,201,100, 69, 34,209,203,152,152, 24,111, 75, 75, 75, 24, 12,134,215, 76, 86, 92, 92, 28,
+228,114,121,114, 85, 35, 88, 13, 26, 52, 56, 37,149, 74,221,222, 92,111,107,107,107,254, 79,125,121,149,143, 92,245,233,211,135,
+ 78,152, 48,161,202, 26,171,190,255,102, 7,128, 29, 19, 38, 76,216,182,107,227,241,160,160,160,160, 99,190,190,190, 4, 0,184,
+ 30,131, 28, 31,196, 96,149, 21, 74,101,127,203,218, 51, 57, 11,147, 26, 88, 88, 59, 93,152,178, 96,131,217,174,187, 12,242, 83,
+163,144,114,118, 86, 62,171, 85,180,102, 24, 38, 53,241,250,175,251, 1, 40,238,221,187,119,201,214,191, 7, 8, 41,233,185,247,
+182,145,220, 75, 11,250,134, 62,181,107, 99, 95,132, 30,170,180,135, 96, 8,221,218,182,109, 91,197,251,158, 68, 96, 96,160,191,
+165,181,227,197,169,139,126,181,218,119,159,143,220, 18, 19,152,207,106, 21,173,147,181, 46,175, 13, 82,202, 18, 96,243, 15, 19,
+193, 26, 81, 12, 15, 39,196,146, 39,151,172, 29,210, 62,184,159, 91, 45, 23,176, 84, 7, 86, 72,209,107,170, 13, 63,230,158,226,
+ 96,141,246,188,223,217, 34,118, 76,210,141,191,111,244,241,103,207,158, 45,112,112,112, 56,144,150,150,246,170,117,170,139,139,
+ 75, 39,119,119,247, 69,243,231,207,119, 79, 74, 74, 50,189,127,255,126,193,254,253,251,227, 24,134,153,159,154,154, 90,233,215,
+253,227, 66,237,100,127, 19,209,198,136, 34,253,171, 49,116,234,200,133,245, 62, 27, 50,240, 70,219,129,159, 73,158,159,221, 1,
+171,184, 39, 88,121, 47,221,144, 92,168, 26, 24,165,160,105,198,152, 43,177, 88,188,127,245,254,253,207,234,214,173, 75,138,139,
+139,161,211,233,144,149,149,133, 31,119,238,139,164,148,194,210,210, 18,103,207,158,101,199,143, 31,191,223,217,217,185,207,187,
+ 76, 86,185, 97, 26, 32, 20, 10,137, 84, 42,245,136,143,143,143,119,119,119, 87,189,205,164,136,197,226, 42, 27, 44,169, 84, 10,
+150,125,119, 16,160, 42,154,122,189,158, 24,179,190, 42,154,101,105, 43,107,220,254,230,250, 50,120, 60, 30, 88,150,173,240, 92,
+254,234,222,222, 17,193, 82,100,188,151,193,162,148,186,149,117,164,249,167, 21,132,165,145, 48, 0, 96,223, 53, 20, 67, 85, 34,
+ 88,165,102, 15, 34,145, 8,151, 47, 95, 70,215,174, 93, 65, 41,133, 88, 44,134, 76, 38,131, 68, 34,193,181,107,215, 32, 18,137,
+192,227,241,170, 18,197,162,122,189,126,231, 47,191,252,242,237,226,197,139,165,101,199, 40, 51, 88, 63,253,244,147, 82,173, 86,
+239, 52,198, 96, 17,203, 58,253, 45, 44,173, 6,231,229,101,111,109,226, 99, 81, 97, 47,194,183,237, 83,218, 30,235,191, 78,217,
+ 48, 13,148,210,238,111, 14,197, 80,182,205,132, 9, 19,240,230, 16, 14, 21, 13,211,224,228,228,100,185,113,227,198, 17, 44,203,
+214, 41, 93,245,102,111,193,178,251, 88,246,126, 42,235, 85,248, 90, 47, 66, 14,142, 42, 71,176, 24, 2, 56,242, 95,250, 90, 88,
+187, 92,152,180, 96,131,217,182, 91, 60,228,167, 62, 65,214,133,239,242,169, 94,217, 58, 60, 60,252,190, 93,221, 30, 8,105,218,
+186, 89,219, 79,250,192,254,200, 62,220,185,126, 30, 63,174,222,140,111,198,126, 81,225,135,146,157,157, 53,178,174,171,160,203,
+125, 6, 66,200,189,247, 61,129, 70,141, 26,121, 89, 88, 57, 92,156,178,240, 87,171,221,225,124,228,165,252,199, 4,206, 88,115,
+225,254, 87, 35,134,190,182,189,177,211,227, 12, 22,137,186,251,215,118,217, 52,160, 83, 83, 75,115,162,135, 62, 33, 10, 27, 63,
+235,135,240,174, 90, 52,237,111,142, 70,157, 77,225,217, 64,210,239,248,111, 57,109,156,154,147,225,127,103, 52,171,188,185,114,
+114,114,234,234,226,226, 50,239,216,177, 99,110,122,189,222,244,242,229,203,133,251,247,239,127,174,215,235, 87,165,166,166, 30,
+ 51, 58, 58, 86,164,121,101,174, 2,204,133, 13,135,127, 62,244,234,248, 21,235, 37,145,225,119,176,116,231, 17,152,241,116,134,
+187,105,170,190, 17, 69,255,169, 62,172, 48,163,241,249, 11,118,239,222, 45,247,243,243, 35,217,217,217,175, 34, 45, 90,173, 22,
+249,249,249, 40, 44, 44,132, 90,173, 70, 64, 64, 0, 51,119,238, 92,249,119,223,125,183, 0,192, 24, 99,211,107,107,107, 11,161,
+ 80, 8,173, 86,251,202,164,136, 68, 34, 88, 88, 88, 32, 63, 63, 31,103,206,156, 65,101,131, 83, 10,133,162, 84,134, 33,174, 38,
+166,166, 58,185, 92, 78,229,114,249, 95,182,169,170,102,169,201,201,236,212,169,147,237,252,249,243, 5,129,129,129,175,214,151,
+ 85, 17, 86, 71,147, 82,170,104,223,190,189,108,213,170, 85,112,115,115,131, 70,163,121,205, 72, 49, 12, 3,161, 80,136,196,196,
+ 68, 44, 92,184, 16,148, 82,227, 63,100, 84,185, 58, 4, 12,181,131, 50, 91, 7,101,182, 14,170, 44, 45,138, 51,116,208, 41, 12,
+255,180, 2,172, 58, 13,208,141,136,132,217,189,111, 4,171,172,186, 82, 44, 22, 35, 62, 62, 30,167, 78,157, 66,104,104, 40,204,
+204,204, 80, 92, 92,140, 43, 87,174, 32, 57, 57, 25, 98,177, 24, 60, 30,175, 74,141,220,107,212,168,241,195,237,219,183,187,142,
+ 27, 55,174,206,151, 95,126, 41,245,245,245, 69, 92, 92, 28,150, 47, 95,174,122,244,232, 81,172,165,165,229,124,160,242,121,102,
+157, 93,107,140,223,184,243,168, 96,216,192, 78, 99,129, 98, 24,211,139,240,245,125,254, 55,141,221,223, 49, 76, 67,167,119,108,
+ 94,126, 8,135,215,134,105, 40,207,193,131, 7, 61,156,157,157,125, 81,210, 51, 16,248,107,111,193,242,220, 9, 15, 15, 15, 6,
+215,139,144,227, 67, 24,172,210, 2,122, 98, 72,239,153,102, 91,111,242,145,155, 28,129,252, 43,115, 94,153, 43,160,164,225,187,
+ 93,221, 30, 48,176, 20,173, 59,246, 46, 27, 20,244,205, 66, 38,160,252,184, 85, 2,137,105,128,158, 10, 1,168,160,207,123, 14,
+145, 72,116,191,170, 9,126, 83,147,101,217,201,141,123,207,180,218,126,135,143,252,148, 39,200,188, 56, 59,159,213, 42, 90, 39,
+106, 92,238,127, 53, 98,168, 81,141,218, 9, 33,109,203,198,244, 24, 44, 18,125, 39,224,145, 89,159,180,104, 40,108,214,160, 54,
+228, 25,241, 72, 75, 74,193,222, 39,153, 57,177,185,234,225,215,136, 22, 9,207,213, 27, 59,143,176,178,178,116, 16,160,203, 40,
+107,171,155, 71, 10, 14, 58,183,102,180, 84, 75, 23,167, 92,165,115,223,212,252, 80, 84,166,233,236,236,236,101,106,106,250,227,
+201,147, 39,109, 69, 34,145, 89,100,100,164,225,192,129, 3,137, 6,131,225,167,212,212,212, 61,213,209,244,151, 74, 93,234,120,
+123, 92, 26,255,243, 58, 73, 81,177, 2,197, 26, 45,156, 92,157, 13,151,238, 69,245,142, 40,210, 28, 50, 70,211,222,222,190,213,
+192,129, 3,235, 5, 6, 6, 50,229,205,149, 70,163, 65, 65, 65, 1, 10, 11, 11, 81, 80, 80,128,130,130, 2, 36, 39, 39,163,105,
+211,166,140,175,175,111,128,189,189,125,171,244,244,244, 11,111,106,150, 27,166,225, 91, 0,140, 76, 38,139,185,126,253,186,170,
+119,239,222,144, 74,165, 40, 46, 46,134,139,139, 11, 88,150,197,149, 43, 87, 16, 19, 19,147, 7, 96,119, 90, 90,218,217,138,210,
+169, 84, 42,106, 16, 66,120,102,166,166,109, 59,116,232, 48,112,248,240,225, 22,229,183,175,142, 38, 0,100,102,102,186, 95,190,
+124,249,187,238,221,187,143,237,216,177,163,108,198,140, 25, 2, 15, 15, 15,232,245,122, 82, 93,205,220,220, 92,243,123,247,238,
+ 45,107,214,172,217, 87, 29, 59,118,228, 47, 90,180, 8,230,230,230, 48, 24, 12,144, 74,165, 40, 40, 40,192,252,249,243,113,245,
+234, 85, 61,165,116, 77,126,126,254,148,138, 52, 95, 27, 7,107,210,207,245, 43,202,135,239, 26, 7,235,239,200,243, 74,165,210,
+190,170, 81, 49, 99,210,121,239,222, 61,250,230,120, 88, 21, 69,176,222,166, 89, 22, 93,226,243,249, 72, 75, 75,195,209,163, 71,
+ 95, 27, 3,171,108,121, 87, 21,225, 59,210, 73, 47, 94,188,104, 32,132,132,234,245,250,105, 19, 38, 76, 24,174, 80, 40, 92,228,
+114,121,138, 86,171,221,106, 97, 97, 81, 54, 14,150,176, 50, 77,145, 72, 34, 32, 12, 3,169, 68, 46, 85, 42, 51, 19,222,214,139,
+240,141,107,157, 32, 18,217, 91,151,237,243,191,186,239,111, 12,211,240,218, 80, 12,111,236,243,218, 16, 14,111, 14,211, 80, 94,
+179, 71,143, 30,113, 0,162, 41,165, 12, 33, 36,250,205,222,130,229,100,189,195,195,195,131,131,130,130, 46, 81, 74,101,111,246,
+ 34,252, 59,242,252,199,172,249,175, 49, 88, 0, 36,215,194,159,130, 17,103,160,240,214,143,175,153,171, 87, 79, 58, 11,220,185,
+126, 30, 44, 11,180,104,223,179, 82, 51,163, 87, 23,199, 46,216,251,162,129, 65,163,132,190, 32, 33,166,227, 39,157, 51,222, 39,
+241,182, 1, 61,225, 42,164,242,171,247, 98,193,151,100, 35,239,230, 15,121,196,160,110, 29, 30, 30,254,160,218,153, 6,152,177,
+238,196,126, 33, 49,183,194,195, 9,195,144,146, 87,140, 19, 47,114,127,167, 10,245,152, 29,180,164, 42,208, 37,148, 92,217, 52,
+ 51,109,109,243, 94,230,253,108,156, 5,248,249,155,173,144, 76,183, 22, 54,106,211,226,111,157,163,176,172,225,251,198,141, 27,
+ 71, 7, 6, 6,154,124,253,245,215, 79,243,243,243, 95,107,248, 94, 85, 34,148,202, 36,127, 83,209,186, 11,191,254,252,141,212,
+ 63, 4,251, 23,206, 48, 92,190, 23,221,227,113,161,230,168,177, 26, 98,177, 56,108,204,152, 49,194,226,226,226,191,152,171, 55,
+ 13, 86, 65, 65, 1, 30, 62,124,136, 62,125,250,136,163,162,162,194, 0, 92,120, 71, 4,103,118,233,128,147,124, 27, 27,155,204,
+117,235,214,117,223,190,125,123,175,225,195,135,139,195,194,194, 16, 25, 25,137,219,183,111,171, 53, 26,205,159, 66,161,240, 80,
+124,124,188, 81,173,188, 41,165, 6, 0,167,220,221,221, 47,173, 91,183,174, 59,203,178,175,230,179,124, 15, 77, 29,128,217, 86,
+ 86, 86,203,246,239,223,191,244,252,249,243, 3,135, 12, 25, 34,209,233,116,228, 61, 52,245, 0, 38,216,218,218,206, 58,126,252,
+248,214,211,167, 79,247, 24, 60,120, 48, 51,110,220, 56,172, 94,189, 26,127,252,241, 7,107, 48, 24, 14, 9, 4,130,161,153,153,
+153,149,118, 64,121,109, 28,172, 10,198,185,170,236,119, 35,184,251, 95,200,250,239,173,249,102, 36,172, 97,195,134,246,229,123,
+105,150,255,107,108, 4,139, 16,130,160,160,160,215,254, 95, 54, 36, 3,143,199,123,109,169, 74, 21, 33, 0, 11, 74, 41, 11, 96,
+ 13,128,213,120,125, 20,119, 30,254, 51,210,187, 81, 56,187,186, 33, 57, 17,214, 89,197,170,188,138, 39,123,182,183,118,118,117,
+251, 59,202,181,188,185,115,231, 46,159, 51,103,206,242, 55,135, 98, 40,191,221,155, 67, 56,204,155, 55, 15,239, 26,166, 33, 37,
+ 37, 37,119,238,220,185, 63, 0,128,175,175, 47, 41,173, 22, 12, 66,105,111,193,114,154,219, 80, 50, 85,142,236,203, 47,191, 28,
+ 2,224,157,154, 28, 28, 85, 49, 88,223, 22,133,175,212, 1,176, 38,132,204, 72,214,186, 68,254,181, 16, 1,126, 92,189,249,181,
+ 73,161, 43,130,199, 99,102,100, 28, 25,182,138, 2,185, 60,130, 25,239,155,120, 75, 11, 51, 24, 10, 13, 51,139,239,173, 98, 41,
+165, 22,132,144,233,119,239,222,141,124,111,103,110,110,133,194,249,163,241, 71, 68, 10, 77, 43,214,245,220,161,121, 61, 82, 83,
+218,230,170,191, 83,115,178,215,210, 73,112, 96, 66,107,107,114, 44,103,200, 63,226,134, 70, 68, 68, 44,242,242,242,226,173, 95,
+191,254,115,141, 70,243, 90,195,247,106,107, 22,106,166, 6,152, 10,121,190, 30,174, 99,163,226, 19,186, 63, 46, 52,174, 90,176,
+ 28, 34,103,103,231,199, 10,133, 2,132, 16,168,213,234, 87,198,170,176,176, 16,249,249,249,175,254,175,213,106,145,153,153, 9,
+ 15, 15, 15,148, 27, 51,233, 93, 38, 35,181,188, 71,176,180,180, 60,185,106,213,170,129,171, 86,173,106, 3,224,156, 82,169,220,
+157,155,155, 91,173,161, 63, 74,141,206, 94,169, 84,246, 35, 33,196, 89, 44,145,106,174, 94,189,122,226,125, 52,115,114,114, 10,
+ 1,140,146, 74,165, 11,126,249,229,151, 85, 18,137, 36, 56, 35, 35,227,189, 52, 75,205, 83,111,107,107,107,167,109,219,182,237,
+219,180,105, 83, 99, 62,159,127,147, 16,210, 55, 47, 47,175,202,147, 61,147,215,191,222,171,252,187, 17,252,241, 95,200,246,239,
+173,105,236,240, 11,198,162,215,235,139,230,204,153,147,241,182,121, 7,203,204, 84,249,117, 90,173,214,168, 97, 78, 28, 28, 28,
+140, 30,139,172,162,161,119, 0,128, 33, 68, 9, 64,250,237,188,101,165, 31,204, 70, 79,246, 12, 2,162,249, 95,150,107,115,230,
+204,161,243,230,205, 35,132,144, 67, 40, 25,143,234,217,155,141,208,203,255, 54,111,222, 60,204,153, 51,135,206,157, 59,183, 82,
+205,168,168, 40, 74, 8, 57, 7, 32, 14, 64,124,121,221,242,235,203,246,169, 72,147,131,163, 82,131,197, 82, 32, 89,235,146, 8,
+ 96, 88,249,117,127,125,193,225, 47,109,174, 42,242, 88, 29, 59,118, 60, 7,192,247, 67, 37, 62, 47, 55, 31,196,170, 97, 66,110,
+110,246,224,140,199,135, 62,136, 38, 11,252, 56,188, 81,216, 55, 0, 8, 5,126,126,211, 92,189,246, 21,116,133, 30,114,108, 74,
+ 22, 55,106,211, 98, 98,233,203,103,209, 63,225,166,190,173,225,251,251,242,182,134,239, 85,120,217,156, 22,139,197,164,176,176,
+ 16, 74,165,242,181,104, 85, 65, 65, 1, 20, 10, 5,138,138,138, 80, 54,181, 71, 81, 81, 17, 76, 76, 76,160,211,233,170,244,165,
+ 88,106, 82,214, 5, 6, 6,110, 44,173, 38,121,111,148, 74,133, 11, 0, 4, 6, 6, 10, 62,156,166, 50, 5, 64,175, 15,169,153,
+157,157,157, 2,160,137,167,167,167,200,216,201,162, 43,138,100, 85,247,119, 35, 88,255, 95,200,242, 59,240, 15, 35, 33, 33,193,
+239, 67,107,166,164,164,196,124, 72,189,236,172,180, 13, 95, 13,235, 51,166,108,210,103, 99, 38,123, 46, 51,102, 57,217,105, 27,
+254, 87,215,178,108,154, 17, 0,212,217,217,121,219,203,151, 47,221, 8, 33, 9,111, 70,146,222,252,109,238,220,185,120,215,152,
+127,229, 53, 1,192,195,195,227, 96, 98, 98,162,147, 80, 40, 76, 45,175,251,230,250,138, 52, 57, 56,222,150,209,254,107, 11,128,
+128,255, 39,154,109, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252,251, 52, 63,182,133,225, 44, 38, 7, 7, 7, 7, 7, 7,
+ 7,199,135,133, 0, 8,120, 71,100,235,177,209, 34,132, 4, 84, 35,114,246,248, 31,164,105, 87,129,230,217, 74, 52,219, 86, 35,
+157,156, 38,167,201,105,114,154,156, 38,167,249,175,212,172, 76,251,163,233,157,200, 85, 17,114, 97, 94, 78,147,211,228, 52, 57,
+ 77, 78,147,211,228,170, 8,185, 42, 66, 14, 14, 14, 14, 14, 14, 14,142,127, 52,239, 28,166,161, 87,221,146,238,195,127, 62,226,
+ 58, 76,112, 0, 60, 30,111,113,139, 22, 45,198, 92,189,122,245, 39,157, 78, 55,191, 58, 26,132, 16, 39,123,123,251,239, 41,165,
+ 77, 8, 33, 98, 62,159,255, 36, 61, 61,125,145, 78,167,187, 82,221,116, 17, 66, 92, 29, 28, 28,190,103, 89,182, 49, 0, 33,159,
+207,143, 72, 73, 73, 89, 72, 41,189,249, 30,154,102, 14, 14, 14,173, 88,150,117, 41, 57,117, 94, 70,106,106,234, 21, 74,105, 50,
+151, 19, 56, 56, 56, 56, 56,170,109,176,122,215, 33, 96, 0,212, 9,131,227,188,145,132, 63,103, 3, 77, 44,123,241,160,100, 48,
+ 54, 95, 0, 81, 0,238, 82, 74, 11,222, 39, 1,255, 95, 52,255,233, 16, 66, 24, 11, 11,139,246, 50,153,108,124, 81, 81, 81, 3,
+ 51, 51,179,136,210,233,113,142,150, 14, 74,248, 62,218,118, 3, 7, 14,156,190,113,227, 70,244,235,215,111, 22, 33,100, 57,165,
+180,168, 42, 26,214,214,214,221, 60, 60, 60, 54,172, 90,181,218,182, 89,179,102, 68, 42,149, 34, 42, 42,202,121,204,152,209, 65,
+ 78, 78, 78,123, 83, 82, 82,190,170,106,186,108,109,109,251,214,170, 85,107,213,154, 53,107,108,155, 52,105, 66, 4, 2, 1,194,
+195,195, 93,198,143, 31, 31,226,232,232,184, 53, 53, 53,117,114, 85, 53,173,172,172,252,106,214,172,217,113,237,218,181,178,166,
+ 77,155, 66, 44, 22,227,225,195,135,166, 35, 71,142,116,118,114,114,122,152,146,146,114,166, 42,122,129, 35,239, 9,132, 50, 45,
+ 31, 0,180, 10,161, 62,124, 67, 67,157,177,235,184,226,137,131,131,131,227, 35, 50, 88,125,235, 16, 16, 0,254,205, 48,159,232,
+241, 45, 24,144, 9, 3,201,239,171,127,103,110,183,109,219,214,231,139, 47,190, 32,165, 83, 71,248,237,217,179,167, 55,143,199,
+139,102, 89,246, 22,128, 7,206,206,206,218,178,105, 9,222,164,131, 23,121, 53, 70,214,153,231, 16, 2,168,207, 48, 76, 72,101,
+154,237,106, 65, 75, 8,112,234,217,219, 35,105,237, 61, 9, 64,129, 51, 47,170,166,121, 58,246,227,136,204,153,154,154,122,217,
+218,218, 78,182,182,182,238, 20, 20, 20, 84, 48,106,212,168,248,200,200,200,167, 62, 62, 62,170, 77,155, 54, 45,210,233,116,107,
+107,215,174,125,166,176,176,112,217,123,140,139,229,174,211,233, 16, 29, 29, 13,134, 97, 4, 0, 60, 0, 60,170,130, 65,115,116,
+119,119, 95,127,225,218, 61,187, 2, 13, 15,207, 50, 41, 0, 5, 88,161, 3,214,109,222,107, 57,123,218,216,129,102,102,102, 87,
+ 11, 10, 10,246, 86, 65,211,181, 86,173, 90,171, 30, 63,126,108, 39,145, 72,192,178, 44, 10, 11, 11,225,228,228,132, 77,155, 54,
+ 89,126,243,205, 55,159,203,100,178,203, 10,133,226, 72, 85,140,121,205,154, 53, 59, 70, 70, 70,202,196, 98, 49,209,235,245, 68,
+173, 86,195,213,213,149,238,218,181, 75, 50,110,220,184,250, 98,177,248,165, 90,173,126,106,148,185,250,245,158,160, 32,235, 66,
+ 40, 77, 84,206, 2, 0, 34,145, 46, 12,155,103,117,187, 32,235, 66,163,202,214, 5,254,138, 27,225, 95,114, 38,139,227,127,139,
+163,163, 99,160,165,165,229,254,188,188,188, 75,169,169,169,195, 75,103, 54,120,223,143, 63, 39, 62,159,239, 65, 41,181, 40,253,
+127,158, 94,175,143, 51,102,206,205,119, 97,227,217,170, 43,196,178, 97,160,108,125, 6, 0, 97,152, 7, 6,173, 98, 75, 86,204,
+133, 35,239,165, 41,146,126, 14,208,250, 12,192, 18,134,121,200,234, 21,191,101, 70, 93, 56,193,229, 12,142, 15, 22,193,170, 19,
+ 2, 75, 2, 76,155, 49,234, 75,134,207,227,145, 69, 27,126, 29,112,231,250, 17,234, 88,163,254,171, 41, 55,154, 55,111,142,230,
+205,155,147,165, 75,151,250,158, 63,127,222,119,215,174, 93,186,235,215,175,135, 3,216,250, 54, 77, 74,129,150, 29,165, 47,245,
+ 58,165,107,211,118, 82,149,123,227,181,187,154, 52,105,206,138,197, 98, 84,164,121,230,250,245,240,118,181,222,174, 89, 34, 12,
+212,106,192, 63,227,220,208,149,132,117,153,157, 96,172,230,187,210,249,255,204, 92, 93, 50, 53, 53,245, 28, 57,114,228,179,209,
+163, 71, 95,150,203,229, 20, 0, 20, 10,133,184,107,215,174,185, 61,122,244,200, 86, 40, 20, 88,183,110,157,235,170, 85,171,206,
+152,153,153, 37, 23, 20, 20, 52,170, 74, 84, 12,192,156,110,221,186,205,250,250,235,175, 81,163, 70, 13,140, 27, 55, 14, 58,157,
+ 46,156, 16, 50, 27,192, 18, 99, 6,221,179,179,179,155,179, 98,197, 10,187, 98,157, 0,223,109,143, 69, 78, 81,201,128,162, 50,
+ 17,131,175,218, 74, 48,118,236, 56,243,219,183,111, 47,197, 27, 35, 72, 87,132,131,131,195,247,107,214,172,177,149, 72, 36,160,
+148,162,168,168, 8,133,133,133, 40, 42, 42, 66,113,113, 49, 70,143, 30,109, 30, 17, 17,177, 2,192,145, 42,104,182, 90,187,118,
+173, 76, 44, 22,227,204,153, 51,222,106,181,154,167,209,104, 96, 48, 24, 12,181,106,213,138,254,250,235,175,197,143, 31, 63,238,
+ 0,192, 40,131,229,152, 6, 65,190, 82,185,230,151, 31,190,177, 5,128,175,167,253,184, 6, 80,134, 80, 35,214, 57,166, 33, 24,
+ 0,103,176, 42,206,159, 60, 0, 61, 5, 2, 65, 47, 79, 79,207,160,103,207,158,221,215,235,245,127, 2,248,179,116,122,162,247,
+209,110,227,228,228,244,125, 74, 74,202, 47,148,210, 29,255,150,107,106,103,103,247,231,129, 3, 7, 92,183,111,223,254,217,111,
+191,253,118, 28,239, 49, 74, 62, 33, 68, 0, 32,180, 81,163, 70, 54,189,122,245, 18, 56, 56, 56, 64,161, 80, 32, 54, 54, 86,118,
+246,236, 89, 91,137, 68,146,173, 86,171,111, 84,229, 94,217,120, 55, 53, 1,223,108, 79,104,171,182,205,250,245,238,105,106,111,
+109, 14,165,198,128,103, 9,169, 53, 78, 30, 63,220,210, 41,224,147,235, 90,109,254,128,172,152,107, 69, 85,213,108,213,177, 75,
+179,182,109,218,152,154, 91,152, 35,191, 88,139,231,241,201,110, 23,206, 28,105,238, 24,240,201,101,150,232, 6,167, 63, 58,173,
+224,158, 58,142,170,240,151, 70,238,251, 34,233,219, 30, 20,200, 77,228,111, 21, 48, 55, 55, 71, 88, 88, 24, 22, 45, 90, 36, 0,
+208,248,117, 83,245,159, 97, 19, 24, 0, 6,131,198,113,214, 87, 99, 33,226, 83,241, 39,157, 58, 16, 51, 51, 51,163, 52,121,239,
+208, 4, 0,202, 8, 97,111,165,111, 27,226,173,108,153,254, 96,220,160, 7,151,190, 15,208,168,242, 4,111,106,202,100, 50,120,
+121,121, 97,230,204,153,111, 75,231, 7,239, 18,250,191,208,164,148, 58,249,249,249, 21,174, 88,177,194,123,238,220,185,150, 42,
+149, 74, 14,192,213,179, 78, 35, 23,134, 97, 92, 85, 42,149,217,156, 57,115,108,151, 46, 93,234,109,107,107,155, 71, 41,181,173,
+ 98, 58, 23,172, 89,179,102,246,161, 67,135,152,230,205,155,195,210,210, 18,173, 90,181,194,241,227,199,249, 63,253,244,211, 34,
+ 0,179,140, 73, 39,195, 48,205,155, 53,107, 70, 88,150, 34,183, 72,135, 11,139, 3,113,237,199, 96, 40, 52, 44,114,243, 10,160,
+ 82,169, 32,147,201,164,132, 16, 19, 99,207,157,101,217,198, 77,154, 52, 33, 64,201,200,239, 37, 75, 49, 10, 11, 75,254,106, 52,
+ 90, 8, 4, 2, 83, 66,136,184, 10,154, 46, 77,155, 54, 5, 0, 40,149, 74,126,155, 54,109, 72,235,214,173, 73, 97, 97, 33,191,
+108, 26, 31,129, 64, 32, 34,132,240,141,209,212,200, 4,132,165,172,189, 92, 38,181,145,203,164, 54, 44,101,237, 1,192,152,117,
+ 26,153,128,252,157,249,147, 16, 98,203,227,241, 54,123,122,122, 62,225,241,120,219, 8, 33, 14,239,163, 73, 8, 9, 38,132, 44,
+146,201,100,103,253,252,252, 18,229,114,249,121, 66,200, 18, 66, 72,104,117, 52, 9, 33, 34,153, 76,118,126,209,162, 69,251,238,
+223,191,223,239,220,185,115, 30,143, 30, 61,234,189,116,233,210, 61, 38, 38, 38, 87, 8, 33,178,247,121, 54, 61, 60, 60, 54,221,
+186,117, 43,184, 73,147, 38, 27, 43,202, 67, 85,209, 36,132,240, 8, 33, 13, 72,217,252, 56,255,128, 50,164, 60, 46, 46, 46, 78,
+254,254,254,174, 98,177, 24,205,154, 53, 3,165, 52,236, 61, 53, 67, 71,141, 26,229, 48,105,210, 36,193,131, 7, 15,176,113,227,
+ 70, 28, 58,116, 8, 25, 25, 25,232,210,165,139,176,117,235,214, 14, 98,177, 56,180, 74,154,124,179, 61,227, 39, 76,236,248,205,
+184, 17,166, 15, 95,106,177,229,236, 75, 28,188,145,138, 12,133, 8, 93,123, 15, 53,239,208,189,127, 7,145,216,124, 79, 85, 53,
+167, 79,155,214,241,203,207, 63, 53,141, 76,101,113,248,102, 26,110, 70,231, 67, 47,176, 64,231,222,195, 45,235, 55,237,248, 9,
+ 31,130,173,255,132,123,244,177,107,254, 43, 34, 88,115, 54,210,220,249,163,201, 15,139,214,253, 58,139, 33,132,186,212,238, 16,
+233,225,213,184,152,101, 89, 40,149,202,178, 23, 13,148, 74, 37, 18, 18, 18,112,235,214, 45,152,155,155, 87,120,160,147,177, 20,
+ 11,191,250,207,225,242,242,243,225,236,226, 1,153, 76, 86,169,230,137, 10,170,243,248,180, 36, 26, 50,162, 79, 15,254,203,212,
+ 84,254,245,123, 23, 2,247,174,220, 21,232, 90,171, 93, 84,253,176,169,143, 77,204,107, 40, 31, 60,120,128, 27, 55,110, 32, 55,
+ 55, 23,141, 26, 53,250,104,110, 30, 33, 68,183,108,217,178,123, 41, 41, 41,228,234,213,171,245,231,175,216,229,241,168,160, 38,
+ 47,179,136, 10,108, 77, 94,122,248,201,158, 26,242,243,243,227, 38, 79,158,124,193,193,193, 65, 61,118,236,216,150, 70,234, 74,
+ 0,248,244,233,211,103,250,152, 49, 99, 16, 27, 27,139, 17, 35, 70, 40,111,223,190,157,221,164, 73, 19,235,223,126,251, 77, 58,
+105,210, 36, 92,186,116,105, 14, 33,228, 0,128, 56, 74,233, 59,231, 82, 99, 89, 86, 36,149, 74,129,130,146, 15, 85,173,190,108,
+110, 90,160,184,184, 24,124,228, 65, 36, 18, 49, 0,108, 1, 24,251,229, 41, 20,139,197,175,204, 85, 82, 70, 33, 18, 50,138, 80,
+ 88,164,134, 82,169,131, 70, 5,136,205,236,121, 64,162, 53, 0, 99, 27,167,243,196, 98, 49,244,122, 61,180, 90, 45, 84, 42, 21,
+ 84, 42, 21,212,106, 53,242,243,243, 81, 88, 88, 8, 62,159, 47, 3, 96, 6, 32,167, 82, 49,145, 84,207, 99,132,139,190, 93,184,
+102, 46, 0,240, 24,225, 34, 19,168, 88, 99,214,241, 68, 82,253,223,152,175,196,182,182,182, 23,246,237,219,231,231,229,229,133,
+184,184, 56,223,190,125,251,134, 16, 66, 26, 80, 74, 21, 85,212,146, 49, 12,243,195,176, 97,195,198, 12, 28, 56,144,212,174, 93,
+ 27,124, 62, 31,122,189,222, 37, 54, 54,182,213,239,191,255, 62,141,207,231,255,102, 48, 24, 38, 27,219,174,143, 16,194,136, 68,
+162,189, 27, 54,108,104, 17, 18, 18,130,109,219,182,225,246,237,219,108,112,112, 48, 51,100,200, 16,184,185,185,133, 12, 25, 50,
+228, 32, 33,164,115,117, 34, 89,132, 16,183, 65,131, 6,185,242,120, 60, 52,105,210, 68,120,253,250,245,134, 0,174,191,231, 53,
+ 53,113,113,113,185, 20, 22, 22,214,224,236,217,179,247, 8, 33, 97, 85,105,199,232,228,228,212,221,222,222,126,169,169,169,169,
+165,177,251, 20, 21, 21, 41,210,211,211,167, 36, 39, 39, 27, 53, 31, 41,165,180,113, 64, 64, 0,146,147,147,225,233,233, 9,161,
+ 80, 24,234,236,236, 60,146, 82,218,145,101,217,153, 85,105, 98, 64, 8,113, 10, 13, 13,181, 9, 11, 11, 35, 75,150, 44, 1, 0,
+ 8, 4, 2, 24, 12, 6, 48, 12, 3,129, 64, 0, 95, 95, 95,242,226,197, 11, 43, 66,136,147, 49,213,133, 54,158,173,186, 54,105,
+211,177, 89,139,144,122,204, 79,251,159,193,192, 26,192, 35,122,240, 9, 11, 86, 39,134, 88,200, 67,109,255, 32, 94,116,196,195,
+ 16, 27,239,118, 93,179, 98,206, 28, 49, 70,179, 99,215,110,205,253,124,106, 51, 43, 15, 62, 71, 94,242, 19, 67,114,212,229, 44,
+134,199,192, 47,176,181, 77,237, 58, 13,120, 13, 66,194, 4, 41,113, 17,173,172,188, 90,182,205,121,118,137, 51, 21, 28, 85, 55,
+ 88,132, 16, 74, 41,125,245,101, 53,123, 29,157,109, 99, 73,220, 35, 31, 63,100, 18,211, 52,197, 15, 31, 62,132,181,181, 53,236,
+236,236, 96,102,102,134,232,232,104,156, 61,123, 22, 49, 49, 49,160,148,162, 65,131, 6, 85, 58,112,122, 90, 26,178,115, 10,223,
+ 91,243, 68, 44,197,130,209, 37,201,174,225,232,136, 26,142,142,252,172,220, 60,220,120,248,200,239,200,111,109,125,210,153,145,
+ 91,148, 74,229,171,237,117,186,143,175,214,197,222,222, 94,255,213, 87, 95,231,124,185, 54,174,214,128,214, 78,188,238,161, 14,
+ 56,120, 61,149,183,231, 34,143,206,254,162, 94,230,179,103, 79,141, 62,105,145, 72,244,125,167, 78,157,190,161,148, 10,198,143,
+ 31, 15, 0, 24, 58,116,104,193,205,155, 55,107, 83, 74, 51, 8, 33, 78, 95,124,241,197,211, 11, 23, 46,200, 38, 78,156,200,211,
+235,245,145,124, 62,159, 18, 66,230, 83, 74,231,190, 53,147,241,249,247, 31, 60,120,224, 14, 19, 55,216,152,242,208, 97,214, 61,
+ 0,128,137, 24,200, 76, 75,194,173, 71, 23, 97,109,109,109,222,188,121,243, 40, 47, 47, 47,117,106,106,234,248,226,226,226,173,
+ 21,102, 92, 62, 63, 34, 60, 60,220,197,197,197,165,196, 96,101, 41,177,229, 6, 3,133, 90, 10, 64, 10,194,202, 97,102,231,110,
+ 90, 91, 91,240,192,214,214, 86,171,209,104,166, 23, 20, 20, 84, 88,213,195,227,241, 50, 30, 63,126,108,234,234,234, 10, 0,186,
+131, 7, 15,242, 53, 26, 13, 40,165,134, 99,199,142,117, 76, 76, 76,108,224,225,225,193,184,184,184, 76,247,242,242, 82, 38, 39,
+ 39,143, 80, 42,149,239,172, 66, 57, 57,206, 83,219,114,238,197,181,121,113,137,191, 3,128,115,136, 95,206,209,185, 13, 53, 45,
+231, 22, 85,186,238,228, 56, 79, 45,198,254,109,237, 4,135,125,251,237,183,126, 86, 86, 86, 24, 53,106, 20,230,205,155,135,217,
+179,103,123,141, 26, 53,234, 75, 0,203,171,240,146,149, 58, 56, 56,220, 89,185,114,165,111,211,166, 77,113,252,248,113,236,222,
+189, 27, 47, 94,188,208,123,120,120,240, 67, 66, 66, 48,103,206, 28,116,232,208, 97,196,216,177, 99, 91, 18, 66, 26, 26,105, 58,
+ 62,159, 51,103, 78,247,102,205,154,225,179,207, 62, 83, 95,188,120,177, 31,128,211,103,206,156,105,125,233,210,165,253, 59,119,
+238,148, 46, 90,180,168,237,164, 73,147, 70, 1, 88, 93,141,243,239,209,162, 69, 11, 0, 64,179,102,205,176,116,233,210, 14,239,
+ 99,176, 8, 33, 34,107,107,235, 99,219,182,109,107,224,237,237,141,193,131, 7, 55,236,215,175,223, 49, 66, 72, 59, 74,169, 81,
+243, 70, 58, 58, 58,254,176, 97,195, 6, 79,169, 84,106,244,113, 53, 26,141,213,200,145, 35,151, 0, 48,202, 96,177, 44,219, 56,
+ 32, 32, 0, 7, 15, 30,196,200,145, 35,225,231,231, 87,175, 65,131, 6,235, 7, 13, 26,132, 81,163, 70,181,177,181,181,181, 47,
+157, 92,188,242, 23, 11,159,239,209,165, 75, 23,193,159,127,254, 9, 0,104,209,162, 5,218,182,109,139,199,143, 31,227,234,213,
+171,224,241,120,144,203,229,104,218,180,169, 40, 37, 37,197, 3, 64,165, 6,139, 17,203,134,117,239,210,217,244,240,205, 84, 24,
+ 88, 61,130, 60,205, 16,226,107,135,232,164, 2,132, 63, 73,130, 65, 35,132,153,149, 53, 66, 91,182,183, 74, 75,126, 49, 12,198,
+ 52, 15, 16,203,134,245,234,254,137,201,225, 27, 41,200, 75,137,162,207,110, 31, 56,175, 83, 21,143, 0,128,187,231,246,172,119,
+176,150,182,171, 29, 24,196, 11,107,215,205,242,207,221,105,195, 0,112, 6,139,227,253, 34, 88,101,100,231, 65,105,237,224,135,
+196,180,251, 37,255,207,206, 70,118,118, 54,106,214,172,137, 85,171, 86,189,182,173, 74,165,170, 86, 2,254, 27,154, 54,150, 22,
+232,214,170, 37,239,113,244, 58,158,146, 85,126, 16,205,127, 42,165,147,150, 50, 9, 89, 58,139,204,124,173,176,127, 43, 87, 42,
+224, 49, 24,208,170, 6,249,229, 72,130, 48,163, 88, 96,193, 48, 76, 2,203, 86,222,145,144, 16, 34,232,222,189,251, 55,123,247,
+238, 21, 68, 69, 69,161, 86,173, 90,208,106,181,184,121,243,102, 18,165, 52,163,244,120, 41, 60, 30, 47,133,101, 89,175,250,245,
+235, 99,241,226,197,240,245,245, 37,157, 59,119,158, 86,106,178,254,114,160,148,148,148, 69, 95,127,253,117,139, 95,183,236,177,
+ 30,220,152,160,176, 80, 13,133, 66,129,232,199,119, 80,156, 94,140,245,235, 55, 64, 38,147, 17, 0,194,180,180, 52,225,164, 73,
+ 19, 55,186,184,184,116, 73, 74, 74,234,245,174,180,166,164,164, 44, 28, 59,118,108,200,246,237,219, 45, 75,218, 93, 41, 81,168,
+ 20,227,214,207, 37, 17,202,144, 73,183,241,219,175, 27,153,186,238,114,235,194,194, 66,140, 24, 49, 98,165,163,163, 99,211,212,
+212,212,145,239,210, 76, 77, 77,189, 50, 98,196, 8,231,223,127,255, 93,226,229,229, 21,147,159,159,143,156,156, 28,102,231,206,
+157, 99, 29, 29, 29,205, 15, 30, 60, 68,228,114, 57, 0,240,226,227,227,133, 95,127,253,213, 94, 7, 7,135,157,105,105,105,159,
+189,235,222, 0, 80, 19,130, 84, 39,167,154,158,138, 27,204, 92, 39, 39,213,213,139,115,146,183, 19,130,212,146,109, 64, 29, 55,
+ 56, 14,122,185, 77,220, 76,173,102, 87,164,165, 37,196, 80, 10,138, 57,127, 95, 39, 12, 27, 27,155,177,221,187,119,199,146, 37,
+ 75,112,228,200,145, 73, 86, 86, 86, 63,207,155, 55, 15, 78, 78, 78, 95, 19, 66, 86, 84, 97,178,219, 31,151, 47, 95,238,235,235,
+235,139,161, 67,135,106,206,158, 61,251, 45,128,131, 0, 18,174, 92,185, 82, 99,235,214,173, 93,247,238,221,187,100,229,202,149,
+146,213,171, 87,123,246,238,221,123, 5,128, 47,140,248,160,152, 56,112,224, 64, 44, 91,182, 12, 23, 47, 94,236, 77, 41, 61, 94,
+246,189, 69, 8,233,186,104,209,162,115,179,102,205,194,242,229,203,199, 87,213, 96, 17, 66, 76,252,252,252,190,235,216,177, 35,
+174, 92,185,130,230,205,155, 35, 52, 52,116, 18, 33,100, 21,165, 52,171, 26,230,138, 49, 49, 49,217,187,101,203,150,230,238,238,
+238, 88,184,112, 33,190,249,230, 27,108,218,180,169,249,224,193,131,247, 18, 66,122, 25,211,203,215,196,196,196, 68, 42,149, 98,
+201,146, 37,244,229,203,151,185, 70, 24, 50,203,239,190,251,142,152, 87, 86,181,240,159, 8,153, 84, 44, 22, 55,241,241,241,193,
+ 79, 63,253,132, 43, 87,174, 96,220,184,113,240,241,241, 65, 82, 82, 18,186,117,235, 38,123,250,244,105, 31, 0, 91,140, 44,151,
+204,173,173,173,145,145,145, 1,129, 64,128,166, 77,155,226,224,193,131, 80,171,213,176,179,179, 67, 94, 94,222,171,218, 4, 62,
+159,111,110,100,105, 23, 96, 99,101,142,140,136,100,240,161, 71, 96,109, 27, 92,120,156, 13,173,142,133,157,181, 5,210, 50,210,
+209, 56,192, 5, 26, 77, 13, 80,202, 26, 53, 19,136,136,199, 4,138, 37, 82,228, 20,102, 33,249,201,197,108,173, 65, 61, 50,239,
+197,213, 68, 0,176,170,213, 98,228,221,171,103,238,246,253,164,133, 93, 81,177, 43, 8,101, 27,129,131,163, 10, 84, 58,208,232,
+219, 94,204,229, 35, 66,101,104,181,218,247, 74,200,127, 67,243,109,252, 55, 52,255, 1, 38,139,117,182,228,231,203, 37,140,254,
+ 76,120,134, 65,167, 55,224,212,221, 52,131, 76, 76,244,150, 98, 77, 1,203,178,148, 16, 66,141,208,209,157, 58,117,106,219,184,
+113,227,240,243,207, 63,227,233,211,167, 16, 10,133, 8, 8, 8,112, 44,107, 31, 69, 8, 49, 15, 12, 12,180, 99, 24, 6,209,209,
+209,248,233,167,159,240,249,231,159,211,235,215,175,111,122,215,139,130, 82,122, 63, 53, 53,117,195,148,241, 35,243, 24, 69, 34,
+228, 52, 11,218,156,167, 96,149,153,248,118,206, 34,196,101,179,184,247,162, 16,247, 94, 20, 34, 75, 35,199, 79,191,108,230,249,
+251,251,119, 21, 8, 4, 29, 42, 72,235,205,212,212,212,109, 19, 39, 78,204,203,200,200,120,101,156,181,122, 22, 90,253,235,201,
+ 48, 53, 53,197,250,245,235, 45, 92, 93, 93,251, 8, 4,130, 86, 21,104, 38,167,164,164, 60, 26, 51,102,140, 58, 53, 53, 21,249,
+249,249, 56,125,250,116, 59, 23, 23, 23,243,185,139,150,147,184,108,250, 42,157, 69,196, 26,155,119,254,201,171, 93,187,246,167,
+ 2,129, 32,180,226,151,151,179,167,159, 95,173,125, 55,111,222,252,204,211,211,115, 76,153,177,162, 20, 20, 0, 60, 60, 60, 70,
+133,135,135,127,222,160, 65,157,125,246,246, 14, 62,127,103, 94, 34,132,180,234,223,191,191, 15,203,178,216,183,111,223, 35, 74,
+233,242, 3, 7, 14,220, 81,171,213, 24, 48, 96,128, 7,128,142, 70,234, 4,127,250,233,167, 99,154, 55,111,142, 9, 19, 38,104,
+207,158, 61, 27, 72, 41,253,153, 82, 26, 79, 75, 72,160,148,174,186,116,233, 82,253,177, 99,199,170, 27, 53,106,132,207, 62,251,
+236,115, 66, 72,243, 74,116,155, 12, 28, 56,208,151,101, 89,236,217,179,231, 97, 57,115, 85,118, 15,207,239,223,191,255,166, 70,
+163,193,160, 65,131,106, 18, 66, 90, 87,225,220,133, 98,177,120,223,130, 5, 11, 44,146,147,147, 49,100,200, 16,117,116,116, 52,
+230,206,157, 43, 53, 55, 55, 63, 94, 81, 27,193,119, 6, 72,196,226, 95,215,173, 91,215,189,110,221,186, 24, 61,122,180,102,237,
+218,181,227,198,140, 25,163, 9, 12, 12,196,154, 53,107,186,139, 68,162, 95,171, 20,249, 79, 79,207,187,120,241,162,117,101, 75,
+ 90, 90, 90,186,145,209,111,153,151,151,215,141,218,181,107, 23,248,249,249, 5,233,245,122, 60,125,250,244,249, 31,127,252,193,
+250,248,248, 96,235,214,173, 88,191,126, 61,218,180,105, 3,134, 97,250, 84, 37,173,197,197,197,144, 72, 36, 16, 10,133, 8, 15,
+ 15,135, 90,173,134, 76, 38,131, 68, 34, 1,143,199,131,133,133, 5, 76, 77, 77, 1,128, 26,119,127, 64, 11, 20, 58, 8, 4, 12,
+248, 12,139,168,132,124,104,117, 44, 36, 66, 30, 4,124, 2, 80, 22, 22,114, 1, 36, 34, 30, 24, 66, 88, 35, 53,145, 95,172,133,
+ 72,200, 64, 32, 20, 17, 70,111,120, 21, 34,100,248, 6,169, 84, 42, 34, 54,102, 98, 72,132,220,152,220, 28, 31, 56,130, 5, 0,
+ 6,195, 95,123,233,190, 45, 10,164,209,104,222, 43, 33,255, 13,205,119,132,205, 63,170, 27, 88, 80, 80,192,191,113,227,134,169,
+ 80, 40, 20,119,111, 16,146,181,244,247,167,182,243,118,198, 64,204, 7,233,228, 79,211, 79, 28, 63, 34, 42, 44, 44,180,241,241,
+241,201, 54,242, 62,140, 32,132, 44, 4, 80,135,207,231, 31,221,178,101, 11,217,177, 99,135,229,192,129, 3, 99, 9, 33,201,254,
+254,254,110, 91,182,108, 49, 3,128, 85,171, 86,209,189,123,247,118, 0, 16, 65, 41, 77,171, 72, 55, 53, 53,117,150, 88, 44,190,
+ 30, 29, 29,189, 74, 32, 16, 88,152,153,153, 89, 94,186,116,137,164,231,107,241,221,246, 23,175,122, 22,202,197, 60,204,232,101,
+135, 97,195, 62,231, 71, 70, 70,254, 8,224,212,187, 52,147,147,147, 39,201,100,178, 75,143, 30, 61, 90,110,234, 92,207,202, 38,
+116,146, 89,235, 25, 37,213,143, 14,150, 34, 48,165,101, 98, 94, 94, 30,178,178,178, 48,105,210, 36,139,201,147, 39, 79, 5,112,
+161,130,116,158, 22,139,197, 9, 17, 17, 17,237,249,124,190,216,196,196,164,193,141, 27, 55,200,203, 60, 29,102,108,125,142, 66,
+ 85, 73,109,171,169, 68,128,121, 3, 93, 48,118,236, 88,126,108,108,236, 15, 0,154,189, 77,207,217,217,217,203,207,207,111,223,
+174, 93,187,252, 86,172, 88,145,243,236,217,179, 98, 39, 39,167,121,111,108,166, 94,188,120,113,246,246,237,219,189,135, 12, 25,
+178,207,193,193,161,223,123, 12,169,241, 94,152,153,153, 45, 25, 57,114, 36,246,238,221,139,220,220,220, 21,165,121,108,249,174,
+ 93,187,246,140, 24, 49, 2,219,183,111, 95, 66, 8, 57,105, 68, 20,171,211,128, 1, 3,112,226,196, 9,156, 59,119,238, 59, 74,
+105,228, 59, 76,237, 83, 66,200,180, 67,135, 14,173, 28, 56,112, 32, 54,111,222,220, 17, 64, 69, 3,207,182,235,208,161, 3,142,
+ 31, 63,142,236,236,236, 53,111,219, 32, 47, 47,111,237,225,195,135, 27,119,232,208, 1,139, 23, 47,110, 7,224,188, 17,230,202,
+215,220,220,124,203,202,149, 43,131,235,214,173,139, 79, 63,253, 84,165,213,106, 59,126,243,205, 55, 71,118,239,222,109,186,109,
+219,182,160, 47,191,252,242, 22, 33,100,184,177,131,216,242,120,188, 69,171, 87,175,254, 34, 44, 44, 12,147, 38, 77,210,159, 58,
+117,170, 27,165,244, 52, 33, 36,118,234,212,169,199,126,250,233, 39,222,178,101,203,190,224,241,120,153, 6,131,225,219,191,229,
+ 11,155, 97, 22,204,159, 63,191,113,139, 22, 45,144,144,144,128,123,247,238, 65,175,215,111,191,123,247,238,229, 22, 45, 90, 44,
+208,106,181, 71, 36, 18,201, 80, 19, 19, 19,127,127,127,255,214,246,246,246,178,244,244,116,133, 17,215, 51, 47, 54, 54, 86,110,
+103,103, 7,129, 64,128,135, 15, 31,194,206,174,100,202,215,140,140, 12, 4, 4, 4,128,199,227, 33, 47, 47, 15, 0,242,141, 51,
+ 67,204,163,216,248,148,154, 86,166,114,192, 32,193,253,232, 36,216,218, 88,194, 64, 24,164,165,165,162,129,143, 11, 8, 33,200,
+203, 78, 3, 33,196,168,185,116, 13,148, 13,127,153,146,225,108,109, 42, 70,221,198,237,173,111,156,204,220, 97, 94,171,217,151,
+124, 30,225,137, 37,102, 27,190,248,236, 51, 27,150,165,200,203, 78, 7,159, 97,110,115,150,129,227,131, 26, 44,150,101, 33,149,
+ 74, 95,139, 48,189, 25, 5,146, 74,165, 80,171,213, 85, 58,176, 84, 42,133, 86,143, 15,170,105,204, 49, 63,180,230,223,137, 94,
+175, 55,157, 60,121,114, 72, 72, 72, 72,114,155, 54,109,226,188,189,173, 18,187, 52,150,218,172,220,116,160, 65,231,150,117,239,
+229,229,100,100,189, 48, 51, 83,199,199,199,219,253,246,219,111, 33, 58,157, 78,102,100, 68,236, 37,128,151,132,144,181, 29, 59,
+118,252,170,111,223,190,136,140,140,180, 83, 40, 20,118, 50, 89,137,196,142, 29, 59,176,119,239,222,159, 41,165, 70, 15,188,169,
+ 86,171, 79, 2,240, 36,132, 88,212,168, 81, 35,221,202,202, 74,152, 90, 84,252,170,103,161,144,207,160,233, 55,119,144,155, 87,
+ 0, 27, 27, 27,152,154,154,122, 84,166, 89, 58,206,213, 17,175,118, 83,235, 41, 31,109,184,184,117,203, 22,115, 0,224, 49, 4,
+182,230, 66,228,229,229, 33, 51, 51, 19, 89, 89, 89, 96, 24, 6,122,189,222,207,136,116, 62, 5,240,148, 16,226,212,186,117,235,
+ 5,166,166,166, 96,115,138,145, 91,164,125,173, 10,178,168, 72, 1,119,119,119,152,154,154,190,181, 58,194,202,202,202, 84, 44,
+ 22,111,221,184,113,163,175,169,169, 41,111,196,136, 17, 22, 35, 70,140,104,246, 46, 51, 38,147,201,120,155, 55,111,174,221,160,
+ 65,131, 45,238,238,238,237,226,227,227,243,255, 87,121,169,116,200,131, 81, 83,166, 76, 9,146, 72, 36,248,229,151, 95, 94, 0,
+216, 89,250,243,190,181,107,215,206, 30, 56,112,160,207,184,113,227,252,103,205,154, 53,169,180,170,240,157, 99, 36, 9,133,194,
+ 64, 63, 63, 63, 28, 56,112, 0, 0, 14, 84,114,248,253,215,175, 95, 95,217,165, 75, 23, 72, 36,146,224, 74,182,245,112,117,117,
+197,161, 67,135, 0,224,254, 59,182,185, 31, 29, 29,141, 94,189,122,129, 16,226, 97,196,185,119,111,223,190,253,254,197,139, 23,
+243, 77, 77, 77,241,197, 23, 95,104,110,221,186,213,153, 82,122,153, 16,210,106,208,160, 65,151,118,238,220, 41,191,116,233,146,
+239,247,223,127,127,157,199,227, 45, 50, 24, 12,179, 42,209,252,124,225,194,133, 51,122,244,232,129,121,243,230,209,223,127,255,
+253, 83, 74,233,233,210,231,235, 20, 33,100,136,165,165,229,206,153, 51,103,146,252,252,252, 25,132,144, 36, 74,233,186, 10,242,
+121,190,193, 96,112, 80, 40, 20, 70,125, 33, 26,187,189,181,181,117,167, 22, 45, 90,224,199, 31,127,196,184,113,227,176,117,235,
+ 86, 10,224,104,106,106,234, 67, 0, 45, 74, 34,176, 78,166,225,225,225,254,205,155, 55, 23, 62,122,244,232, 19, 0,191, 27, 81,
+ 54,197, 95,184,112,193,174,115,231,206, 66,153, 76, 6,131,193,128,236,236,108,168, 84, 42, 4, 4, 4,160,113,227,198,200,200,
+200,192,209,163, 71,181,121,121,121,241, 70,149,119,154,226,109,103,142,253,217,170,235,128,145,230, 82, 33, 15, 6,157, 8,233,
+233,153, 40, 52,232, 17,232,231,134,230, 13,106, 32, 33, 93,137, 83, 71,255,204, 45, 44, 84,108, 51, 70, 83,167, 86,108, 57,123,
+242, 72,203,230,157, 6,153,203,125,252,225,225, 56,174,193,221,235,103,207, 72, 68, 2, 50,104, 96, 63,139,166, 13,189,240,240,
+ 69, 1, 78, 28, 61,144,155, 95, 80,176, 5, 28, 28,213, 49, 88,229, 27,184,151, 35, 99,210,164, 73,118,147, 39, 79,134,153,153,
+ 25,178,179,179,161,211,233, 94, 69,155,196, 98, 49, 44, 44, 44,144,157,157,141, 61,123,246, 0, 64, 70,197, 95,116,162,212,133,
+107, 86,187, 18,158, 92, 35,150,202,168,149,236,253, 53, 1, 64,163,227,103,172,219,243,135, 85,167, 22,161,252, 26,142,142,111,
+ 11,211, 87, 89,243,255, 3, 90,173,246,116, 92, 92, 92,240,128, 1, 3, 50, 93, 93, 93,149, 42,149, 10, 74,165,178,240,232,238,
+149,181,156,205, 70,191, 96, 24,134,154,154,154,178,118,118,118,249,231,206,157,179,211,235,245, 23,171,120,136, 73,253,250,245,
+ 99,206,158, 61, 59,106,204,152, 49,196,203,203, 11,225,225,225,248,229,151, 95,232,182,109,219, 86, 2,152, 94,205,164, 23,169,
+213,234,215, 34, 32,229,123, 22, 22, 21, 21, 65,163, 76,135,174, 10, 61, 18, 98,207,254, 24, 93,179,102, 77,157,191,219,127,134,
+ 19,201,205,205, 69,102, 86,214, 43,131,149,153,153, 9, 0, 85, 9, 97, 22,252, 53,157,255,169,121, 40, 46, 46,134, 74,145, 6,
+131,193,240, 86,205,156,156,156, 66, 39, 39,167,213,171, 86,173,250,105,193,130, 5,118,203,151, 47,207,137,138,138, 42, 96, 24,
+ 70,245,198, 71,140,196,211,211,211,116,217,178,101,246,171, 86,173,202, 97, 89,118,245,255,216, 92,245,168, 91,183,238,214, 78,
+157, 58,153,142, 25, 51, 6,171, 86,173, 66,106,106,234,116, 74,169,190,180,108, 96, 9, 33, 83,215,172, 89,115,116,218,180,105,
+208,106,181,203,142, 31, 63, 62,143, 16, 50,138, 82,186,243,109,154,182,182,182, 46,124, 62, 31,247,238,221, 43,160,148, 62,175,
+196,208,167,121,123,123,167, 19, 66,236, 29, 29, 29,107, 85,180,173,149,149,149,167,169,169, 41,146,147,147, 1, 32,238, 29,155,
+197,167,164,164, 80,145, 72, 68,156,156,156,188, 42, 59,127, 75, 75,203,169, 27, 55,110,228, 95,184,112, 1,115,230,204, 73, 74,
+ 72, 72, 24, 68, 41,189, 82,154,182,123,132,144,230,173, 90,181,218, 61,109,218, 52,239, 31,126,248,129, 68, 71, 71,143,198, 59,
+134, 40, 41,195,205,205,109,212,231,159,127,142,213,171, 87, 99,195,134, 13,163, 41,165,251,222, 56,231,221,132, 16, 75,107,107,
+235,213, 35, 71,142,196,150, 45, 91, 6, 1, 88, 87, 65,180,118, 90,255,254,253,103,231,228,228, 44, 50,230,158, 26,179,189,179,
+179,115,171,214,173, 91,123,170, 84, 42,236,219,183,239,249,254,253,251,115, 13, 6,195,158, 82,115, 85, 62,127, 28, 60,121,242,
+228,236,169, 83,167,226,194,133, 11, 91,156,156,156,120, 41, 41, 41,187, 43,185,167, 41, 18,137, 36,235,225,195,135, 14,190,190,
+190,140,163,163, 35, 26, 53,106, 4, 11, 11, 11,240,120, 60,100,100,100,224,242,229,203,108,108,108,108,150,177, 3,142,102,197,
+ 92, 56,226, 80,183,243,181,123,183, 46,183,247,111,216, 84,224,108, 99,133, 80,127,103, 88,152, 8, 65, 0, 36,100, 40,113,254,
+252, 25, 93, 92,220,243, 27,198,244, 32, 44,211,116,170,247,201,117, 11,187, 26,237,235, 52,104,202,175,229, 83, 27,237, 91,212,
+183,180,148, 11,193, 82,138,135, 47,242,113,230,244, 73, 93, 74, 82,226, 5,174, 7, 33,199,135,142, 96,205,221,176, 97, 67,211,
+ 77,155, 54,117,153, 52,105,146,233,208,161, 67, 33,149, 74, 81, 92, 92, 12, 87, 87, 87,232,245,122, 28, 63,126, 28,247,238,221,
+ 43,100, 89,246, 40,128,107,111, 60,152, 1,229,199,173,154,177, 74, 81,163,100,240,202,226,166,243, 54,212,251, 32,154, 0,112,
+253,133,222,217, 41, 53,107,110,118,238,241,137,110,206,142,194, 14,205, 26,243,109, 44, 75,122, 51, 27,169,217,246, 67,143,233,
+241,191,208,212,235,245, 95, 16, 66,252,167, 78,157,186,212,217,217,217,105,222,188,121, 47,235,212,169,163, 44, 40, 40,160, 26,
+141,134,205,202,202,146,237,219,183,207, 35, 59, 59,187, 80,167,211, 13,161,148, 62,172, 74, 58, 41,165, 90, 0, 99, 8, 33,135,
+243,243,243, 79,125,243,205, 55,248,254,251,239,113,228,200,145,230,148,210,107,213, 61,119, 74,169,222,195,195, 35,239,254,253,
+251,246, 34,235,218,176,183, 16,162,227,119, 37,193, 8, 83, 49,129,178,184, 16, 81,143, 31,162,160,160,224,110, 21, 52, 53,206,
+206,206,249,233,233,233, 54,246,246,246, 37,230, 42, 51,243,149,185,202,201,201, 65,118,118, 54, 45,127,239,141,208, 44,246,244,
+244, 84, 68, 69, 69,137,120, 50, 87, 56, 88,138, 81, 82, 5, 73, 97,107,202, 71,113,113, 33,158,220,188,129,252,252,252,139,239,
+210, 76, 73, 73,217,227,228,228, 4, 0, 63,205,158, 61,219,166, 99,199,142,207,110,223,190,221,178,252,113, 2, 3, 3, 15,206,
+155, 55,239,147,239,191,255, 62,107,235,214,173,211, 82, 83, 83,119,252, 47,243,146,181,181,245,228, 99,199,142,153,106,181, 90,
+172, 90,181, 10, 63,255,252,243, 38, 74,233, 31,111, 92,139, 99, 60, 30,111, 13,195, 48, 95,125,253,245,215, 24, 57,114,164, 44,
+ 40, 40,104, 82,185, 40,215,107,154,201,201,201,179, 2, 3, 3,103,103,100,100, 24,101, 8,158, 62,125,250,101, 96, 96,224,172,
+140,140,140,165, 21,157,187, 92, 46,151, 27, 12, 6,196,197,197,229, 82, 74,243,223,113,223, 84,181,107,215, 78, 54, 24, 12, 46,
+ 50,153,204,170,178,252,153,155,155,187, 40, 40, 40,104,110,122,122,250,105, 0, 11,223, 28,114,132, 82,250,128, 16,226, 63,126,
+252,248,177, 75,150, 44,233,149,150,150,182,167, 50,205,132,132,132, 69,173, 90,181,250, 46, 38, 38,102, 43,165,116,195, 59,210,
+249, 11, 33, 68,187, 99,199,142,209,113,113,113,139, 43,210, 76, 73, 73, 57, 10,224,168,177,247,247, 93,219,151,215,100, 24,102,
+234,140, 25, 51,152,157, 59,119, 2,192,178,164,164,164, 13,239, 48,107, 15,157,157,157,183, 5, 5, 5, 13, 93,183,110,157,164,
+ 77,155, 54, 35, 1,236,174, 44,127,170,213,234,155,215,175, 95,111, 28, 31, 31,111,211,170, 85, 43, 33, 0, 20, 20, 20, 32, 47,
+ 47, 15, 71,143, 30,213,198,198,198,102, 21, 23, 23,223,172, 74, 25,162,215, 20, 12,188,126,254,208,238,248,167,143, 67,195, 58,
+118,183,212,104, 93, 32,206,230, 33, 47, 59, 13, 39,143,254,153, 27, 23,247,252,134, 66,145, 55,176, 42,154, 90,117,254,128, 27,
+ 23, 14,239, 73,138,139,106,220,162, 85,103, 75,149,198, 13, 98, 33,131,236,244,100,156, 60,118, 40, 39, 46,238,197, 21,149, 78,
+253,217,223, 85,206,255,155, 52, 63, 58,104, 89,107,219, 10, 22, 0, 34, 0,159,152,154,154,174,154, 51,103,206,134, 91,183,110,
+109,232,210,165,203, 6,145, 72,180, 10,192, 39, 0, 68,239,216, 47,224,127,169,217,177, 17, 76, 63,239,198,108, 94, 48,154,175,
+ 61,184,220, 71, 55,127, 20,168,145,154,109,141,185, 14, 85, 89,254,215,154, 0,154, 9, 4,130, 27,117,235,214,189, 96,106,106,
+154,233,238,238,126, 69, 32, 16,220, 6,208,226,125,211, 9,192,166,127,255,254,108, 97, 97, 33,237,215,175, 31, 5, 96,254,190,
+154, 98,177,184,117, 88, 88,152,238,101,106, 46,189,242, 32,145, 30,189, 20, 73,119, 29,185, 65, 55,236, 62, 69,151,175,217, 76,
+235,213,171,167, 1,224, 86, 21, 77,145, 72,212, 49, 44, 44, 44, 47, 43, 43,139, 70, 71, 71,211,203,151, 47,211,253,251,247,211,
+ 13, 27, 54,208,181,107,215, 82, 39, 39,167,108, 0, 78, 85,209,148, 74,165,221, 59,118,236,168, 79,206, 44,162, 55, 35,211,232,
+217, 91,207,233,193,115, 15,233,158,163, 55,232,166, 29,127, 80, 95, 95, 95, 21, 0,251,202, 52, 29, 29, 29,251,247,235,215,239,
+153,183,183,247,250, 55,127,243,242,242, 90,211,175, 95,191, 4, 39, 39,167, 33,127, 71, 94, 2,208,209,217,217, 57, 90, 40, 20,
+ 30, 3, 48,164,146,253, 6,240,249,252, 35, 14, 14, 14,119, 0,244,252, 95,231,121, 0, 93,236,236,236,110, 2,232, 86,201,126,
+101,219,245,248, 24,159,247, 15,161,233,228,228,212,218,213,213,245,178,147,147,211,204,202,246,243,243,243, 19, 58, 56, 56, 44,
+112,118,118, 62,238,232,232,216,166, 42,233, 4,224,100, 98, 98,210,204,196,196,164,171,137,137, 73, 87, 11, 11,139,102,229,159,
+195,234,156,187,117,237,182, 93,107, 52,236,118,208,181,254, 39, 9, 53, 26,116, 73,240, 8,236,126,208,186,118,219,174,239,171,
+233, 22,216,253, 80,141, 6, 93, 94,214,104,208, 53,190,102,112,247,131, 54, 62,109, 59,125,108,247,253,159,172,249,177, 45, 70,
+111,216,167,164,229,138, 9,128, 1, 12,195,252, 2, 96, 0, 0,147, 74,110, 64,128, 17, 55,233,131,107,118,108, 9,231, 49,125,
+120,199,167,127, 38,200, 52, 82,243,163,201,208, 0,186,243,249,252,235, 0,186,127,200,116,154,153,153,109,236,219,183,175, 65,
+ 32, 16,172,254, 80,154,214,214,214, 63,133,134,134,106, 87,174, 92, 73, 15, 28, 56, 64, 55,108,216, 64,199,142, 29, 75, 3, 2,
+ 2,212, 86, 86, 86,159, 85, 71,211,193,193, 97, 97,221,186,117,115,118,236,216, 65,247,236,217, 67, 87,175, 94, 77,231,206,157,
+203,214,168, 81, 35,211,202,202,170, 91,117, 52,237,236,236,126,109,214,172,153,246,215, 95,127,165,103,206,156,161,187,118,237,
+162,147, 39, 79,166,126,126,126, 42,185, 92,222,219, 88,205, 90,181,106,137,222,245, 91,195,134, 13, 5, 92,129,203,105,114,154,
+156, 38,103,176, 62,158,133,111,108,164,107, 95, 36, 69,239, 58,164,136, 0,123,254,120,194,238,239,229, 7,253, 31,145,239, 63,
+ 86, 79,205,154, 53,139, 8, 33,123,158, 63,127,190,223,205,205, 77, 31, 31, 31,255,222,154, 39, 46,210,228,246, 30,164,243,153,
+120, 3, 31,128,222,248, 97,123, 62,138,136,228, 33, 0,135, 62,180,110,126,126,254,112, 66,200, 56, 74,169,242, 67,105,102,101,
+101, 77, 38,132,236,120,254,252,249, 50,185, 92,222,192, 96, 48,232, 84, 42,213,213,204,204,204, 73,148,210,196,234,104,166,166,
+166,206, 34,132, 28,152, 62,125,250,116, 0,245, 8, 33, 26,157, 78,119, 61, 35, 35, 99, 62,165, 52,181, 58,154,233,233,233, 95,
+ 10,133,194,205,177,177,177,139,165, 82,105, 61,150,101, 53, 10,133,226, 98, 86, 86,214, 68, 74,105,186,177, 58,177,177,177,239,
+108,255, 21, 30, 30,206,205, 59,200,193,193,193,241, 47,106,131,245, 26,127, 68, 82,244,170, 75,208, 51, 0,250, 63, 30,125, 24,
+211,242,252,249,171,246,175, 31,116,106,144,211,113,244,131,107,114,213,201, 31,206, 92,149,211,124, 8,160,205, 7,214,188, 15,
+160,239,135,212,212,106,181,183, 0,132,113,185,128,131,131,131,131,227,131, 27, 44, 0,248,243, 17,229,174, 26, 7, 7, 7, 7,
+ 7, 7, 7, 71, 5, 16, 0, 1,239,136, 2, 60, 54, 90,132,144,128,170, 30,184, 50,253,255,177,166, 93, 5,154,103, 43,209,108,
+ 91,141,116,114,154,156, 38,167,201,105,114,154,156,230,191, 82,179, 50,237,143,166,119,226,127,181, 5,189, 17, 13,210,255, 33,
+154, 92, 67, 69, 78,147,211,228, 52, 57, 77, 78,147,211,228, 26,185,127,176,133,155, 96,137,131,131,131,131,131,131,131,227, 3,
+195, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,206, 96,113,112,112,112,112,112,112,112,112, 6,139,131,131,131,131,131,131,131,131,
+ 51, 88, 31, 16,187,255, 39,154, 28, 28, 28, 28, 28, 28, 28, 28, 31, 12,242,111, 26,229,156,131,131,131,131,131,131,131,227,127,
+ 1, 87, 69,200,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,206, 96,113,112,112,112,112,112,112,112,
+112, 6,139,131,131,131,131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,156,193,226,224,224,224,224,224,224,224,
+224, 12, 22, 7, 7, 7, 7, 7, 7, 7, 7,199,223,111,176, 8, 33,109, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,228, 52,
+ 57,131,197,193,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,206, 96,113,112,112,112,112,112,112,112,
+112, 6,139,131,131,131,131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,127, 19, 4,192, 91,123, 2, 80, 74,207,
+ 26, 45, 82,141,222, 4,149,233,115,154,156, 38,167,201,105,114,154,156, 38,167,249,241,105, 86,166, 93, 21,255,241,143,134, 82,
+250, 95, 91, 0,180,229, 52, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252,183, 45,124, 46,136,199,193,241,255,156,253,132,
+135, 92, 31, 15, 80,234, 4,158, 40, 21,169,143,158, 99, 14,101,223, 91, 51,189,142, 27,164, 58,123,232, 37,153, 72,127,248,226,
+189, 53, 57, 56, 56, 56,254, 69,112, 6,139,131,227,255, 59,153,190,222,224, 99, 49, 24, 56,130,106, 99, 97, 91,103, 49,128,199,
+239,173, 41,100, 23,194,192,184,128,106, 99, 96,231,179, 4, 64, 36,119,177, 57, 56, 56, 56,140,227,111,105,228, 30, 28, 28, 28,
+ 30, 28, 28,188, 32, 44, 44, 76,204,221, 2,142,255, 22, 97, 97, 97,226,224,224,224, 5, 33, 33, 33,225, 31,237, 73,238,168, 43,
+ 3, 99,232,164,209,177,206, 39, 31,229,217, 41,212, 6,111, 48,250,206,216,236,109,242, 94,154,124,210, 94,165,101,107,236,188,
+173,176, 47,214,232,253, 64,241,126,154,165, 4, 4, 4, 88, 52,106,212,232,100,131, 6, 13,108,184, 28,202,193,193,193, 25,172,
+ 15, 12,203,178, 13,237,236,236, 38, 41,149,202,132,160,160,160,110,255,166, 11,222,184,113,227,235,161,161,161,233, 77,154, 52,
+ 73,111,210,164,201,189,202,214,127,140, 56, 57, 57,121,215,173, 91, 55,193,223,223, 63,166,252,122,187,250,189,154,248,181, 24,
+ 58,199,198,191, 71,203,247, 61, 70, 80, 80, 80, 55,149, 74,149, 80,163, 70,141,137,122,189,190,225, 71,123, 49, 85,172, 61, 24,
+ 94,171,136, 84,133, 44,181, 64,103, 31, 30,175, 48, 5,120, 97,208,192,177,218,154,249,172, 61, 64, 91, 63, 72, 82,202,175,231,
+216,218, 95,121,174, 54, 3,195,180,130,138, 56,188,111,114, 69, 34,209,104, 74,105, 59,129, 64, 48,129, 43,126,255,221, 16, 66,
+ 2, 8, 33,221, 8, 33,193, 31, 80,243, 7, 95, 95,223,100, 66,200,120,238, 10,115,252,191, 49, 88,125,107,146,166,159,214, 34,
+151,250,215, 36,133, 3,106,145,162, 33,181,200,213, 62, 53, 73,235,234, 30,248,143, 63,254,144,110,223,190,221,174, 78,157, 58,
+123, 66, 66, 66,174, 6, 5, 5,213,174,142, 78,112,112,240,201,224,224,224,190,111,174, 11, 10, 10,234, 95,126, 93,163, 70,141,
+ 34, 26, 53,106,148, 31, 28, 28,252,220, 24,221,192,192,192,103, 65, 65, 65,197,193,193,193,207,222,120,113,247,111,212,168,209,
+201, 55,142,215,247,205,117,239,130,199,227,185, 28, 57,114,196,238,216,177, 99,118,124, 62,223,254,213,141, 96,152,183,174,175,
+198,245, 24, 17, 28, 28,124,253,141,115, 25,254,230,186, 74,204,201,245,192,192,192,225,111,232, 94, 15, 14, 14, 30,241, 33,204,
+ 85,139, 22, 45,174,222,191,127,191,134,169,169,169, 69,249,223, 28,172, 45, 58, 92, 63,186,102,210,103,125,219,143,182,171,211,
+179,110, 53,141, 85,237,198,141, 27, 95,245,244,244,220,179,120,241, 98,187, 57,115,230,200, 62,218,167,119,127, 29, 33, 8,219,
+130,165,212,246, 73,178,202,246,147,110,125,249,247, 19,149,182, 58,131,193, 10,224,133, 97,171,187,184, 90,154,124, 93,115,150,
+ 82,251,115,241, 2,219, 86,253,198,242,206,199,243,109,117, 6,131, 53, 24,180,172,150,230,127,242,161,128,199,227, 77, 26, 57,
+114, 36, 67, 8,249,218,211,211, 83,244,111, 42,108, 67,156,137,115, 27, 47,254,237, 64, 39,210,244, 3, 26, 10,127,185, 92,126,
+151, 16,226,253,255,204, 92, 53, 4, 32,163,148, 30, 6, 96, 79, 8,225,127, 0,205,229,243,231,207,159, 26, 17, 17,225, 84,179,
+102,205,121,132, 16, 30,247,138,231,248,199, 27,172, 1, 53,201, 92,123, 7,231,211, 51,151,239,106,177,241,210, 11,147,181, 71,
+239,203, 39, 78, 91,212,212,193,218,246,200,160, 90,228,135,119,237, 87, 81, 87, 75,145, 72,132, 23, 47, 94, 96,213,170, 85,146,
+185,115,231, 54, 49, 55, 55,127, 24, 18, 18,178,162, 78,157, 58,242,138,210,242,166, 38,165,180,169, 64, 32,216, 24, 18, 18,178,
+165,172,192, 38,132, 52, 21,139,197,191,134,132,132,236, 40,171,134, 12, 12, 12,172,121,251,246,109, 51, 66,136,189, 49,233,108,
+212,168,145,227,221,187,119,101, 64, 73, 36, 32, 44, 44, 76,220,168, 81,163,237,206,206,206, 27, 0, 52, 5, 0, 79, 79, 79, 81,
+ 72, 72,200, 22, 87, 87,215,223, 8,121,189,208,124,215,185, 19, 66, 96, 97, 97,129, 93,187,118,129,199,227,253,101,253,142, 29,
+ 59, 64, 8,169,242,245,172, 83,167,142, 60, 56, 56,248, 15, 71, 71,199, 21, 44,203,134, 2, 64,221,186,117,101,141, 26, 53,218,
+239,226,226,178,178,108,157, 49,154,148,210, 80,161, 80,184,162, 81,163, 70,251,235,214,173, 43, 3, 0,150,101, 67,249,124,254,
+242,224,224,224, 63,170,114,143, 26, 54,108, 56,178, 94,189,122, 41,245,234,213, 75,241,241,241,249,222,222,222,254,226,234,213,
+171,173,203,159,123, 89,228, 42, 61, 35, 59,247,250,157,136,232, 73, 35,251,132,213,112,181, 31,100, 81,191,135,185, 49,231, 94,
+118,254, 33, 33, 33, 43,204,205,205, 31,206,152, 49, 35,116,225,194,133, 18,173, 86, 11,161, 80,136,234,228,207,234,242, 63,213,
+204, 34,118,160,180,109,116,154, 82,226,238, 23, 36,183, 11,234, 13, 59, 51,129,248,198,243, 98, 83, 16,180,129, 86,102, 91, 45,
+ 77,194,111, 19,145,172,148, 90,250,119,150, 5,135,182, 0, 99, 93, 91,124, 49,166,216, 12, 12, 83, 61,205,255,208, 39, 52, 52,
+ 84,212,182,109, 91, 56, 57, 57,241,204,205,205, 7,253,163,174,231,127, 81, 51,196,153, 56,155,154,136,110,253, 52,103, 98,144,
+147,149,236,144, 49, 38,203,136,238,243,254,118,118,118, 23,214,172, 89, 19,104,106,106,122,217, 24,147,245, 79,184,158,165,230,
+ 74, 72, 41,189, 89,186, 42, 18, 64,243,247,212, 92, 62,119,238,220, 9, 51,102,204, 64, 65, 65, 1,134, 13, 27,102, 6,224, 39,
+ 99, 53, 77, 77, 77,189,234,213,171,183,195,223,223,255,101,131, 6, 13, 52,117,234,212, 81,249,248,248,196, 7, 4, 4,108,149,
+ 72, 36, 30, 31,123,254,252,167,104,254,235, 12, 86,191, 90,164,137,141,131,243,212, 31, 14,222,145, 26, 34,239,226,238,103, 45,
+ 17,245, 85,103, 72, 99,194, 49, 99,220,183, 82, 51, 51,203,175,251,214, 34,173,170,115,240,152,152, 24,236,221,187, 23, 54, 54,
+ 54,100,243,230,205,226,190,125,251,142, 54, 51, 51, 75, 12, 14, 14, 30,100,172, 6,143,199, 51,108,217,178,197,164,123,247,238,
+ 3,172,172,172, 34, 2, 3, 3,107, 50, 12, 99,216,182,109,155, 73,255,254,253,251,106, 52,154, 39, 65, 65, 65,181,239,221,187,
+103,184,115,231, 14, 24,198,184,160, 93,120,120,184,254,196,137, 19,175,162, 34,148,210, 39, 75,150, 44, 25,112,224,192, 1, 83,
+115,115,115, 54, 48, 48,176,166,171,171,107,196, 15, 63,252, 48,104,255,254,253,166,102,102,102,172,145, 5, 1, 84, 42, 21,164,
+ 82,233,107, 70,138, 16, 2,165, 82, 9,137, 68,242,154,241, 50, 50, 50,224,111,109,109, 29,181,120,241,226,238, 7, 15, 30,148,
+154,154,154, 34, 56, 56,216,207,194,194, 34,122,233,210,165, 61,202,214, 25,139, 80, 40,196,174, 93,187,100,159,126,250,105, 55,
+177, 88, 28, 21, 28, 28,236, 39, 20, 10,177,123,247,110,217,160, 65,131,186,200,100,178, 39,129,129,129,254,198,104,233,116,186,
+217,119,238,220,113,188,116,233,146,163,155,155,219,184,181,107,215,218, 11, 4, 2, 0,128,193, 96,120, 45,114, 53,168, 87,187,
+144, 9,179,215, 92, 80,170,212,154,133,211, 63, 15, 19, 24,208,216,200,168,221, 32, 51, 51,179,196, 47,190,248, 98,204,174, 93,
+187,196, 14, 14, 14, 76,120,120, 56, 10, 11, 11,171,124, 45,255,255, 68,175, 8, 15,124, 67, 67, 0,158,225,241, 74,155,250,109,
+ 7,243, 17,123, 4,141, 60, 76,248, 23, 98, 10,237, 40, 67,221, 0,218, 8,243,194,248, 85,210, 20,208,250, 96,216,218,167, 99,
+137, 77,147,206,131,248, 9, 9, 9,240,168, 31,198, 59, 22, 3,123, 74,168, 7, 88, 4, 85, 73,179, 28, 2,129, 96, 78,191,126,
+253,228, 9, 9, 9,104,218,180,169, 76, 36, 18,205,254, 32, 81,188,245, 62,110,216,232,211, 18,155,189, 29,113, 41,236, 31,215,
+113, 39,196,153, 56,155,153,136,110,238,222,189,215,169,110,199, 47,201,134,161,238, 86,182,102,130, 67,239, 19,201, 42, 53, 87,
+231,111,221,186,101,221,190,125,123,204,157, 59,215,214,204,204,236,242, 63, 61,146, 85,222, 92, 17, 66,164,165,213,131,201, 0,
+ 92,222, 67,115,229,220,185,115, 39,204,156, 57, 19, 55,111,222,196,210,165, 75,209,177, 99, 71, 88, 90, 90, 86, 90,126, 12, 25,
+ 50, 68,214,180,105,211,240,110,221,186, 61,152, 56,113,226,160,163, 71,143,186,110,217,178, 69,248,217,103,159,137,251,245,235,
+231, 54,113,226,196,161,157, 59,119,126,220,184,113,227, 91,125,251,246,149, 84, 49,105,124, 0,162,210, 69, 80,146, 84, 66, 8,
+ 33,124, 66,136,128,139,176,113, 6, 11,124,138,249, 95, 78, 94, 32,137,219,250, 51,210,247,254, 2, 94, 94, 58, 4,133,217, 80,
+ 95, 61, 6,221,213,195, 24, 18, 26, 42,149, 18,178,176, 58, 7, 55, 49, 49,129, 80, 40,196,179,103,207, 16, 25, 25,137,206,157,
+ 59, 11, 87,175, 94,109,225,239,239,255,107,211,166, 77, 31, 4, 7, 7,215, 51,198,176,120,121,121, 97,192,128, 1,162,241,227,
+199,215,146, 72, 36,247, 40,165, 2, 15, 15, 15,244,239,223, 95, 56,109,218, 52,119,137, 68,114,135,101, 89,161, 76, 38,123,103,
+116,232,109,186, 82,169, 20, 0, 4,181,107,215,190,187,103,207, 30,143,166, 77,155,242,207,156, 57,131,130,130, 2,190,183,183,
+247,131,221,187,119,123, 54,105,210,132,127,237,218, 53, 20, 23, 23, 83, 99,117, 21, 10, 5, 36, 18,201, 95, 12,150, 66,161,128,
+ 88, 44, 54, 58,141,165,230, 98,132,167,167,231,157, 61,123,246,184, 52,111,222,156,119,241,226, 69, 20, 22, 22,194,205,205,237,
+238,158, 61,123, 92,154, 54,109,202,187,113,227, 6, 10, 11, 11,141,214, 20,137, 68,112,119,119, 71,191,126,253, 4, 83,166, 76,
+113, 17, 8, 4,119, 68, 34, 17,220,220,220,208,175, 95, 63,225,228,201,147, 93, 68, 34,209, 45, 35,171, 12,121,165, 70, 11,253,
+250,245,147,203,100, 50, 36, 38, 38,130,101, 89,176,108,137, 39, 77,205,204,126,116,237,206,227,168, 73,163,250,182, 44, 86,171,
+213,167, 46,222,125, 82,167,182,155, 11, 33,212,189,146,115,175, 23, 18, 18,242, 32, 44, 44,236,183,195,135, 15, 91,180,107,215,
+ 78,112,231,206, 29,188,124,249, 18, 98,177, 24, 38, 38, 38,224,243, 63,210,142,178, 5,117,172,193,162, 93, 66,166, 70, 44,182,
+112, 49, 53,113,244, 6, 94, 94, 70, 77, 91, 49,120, 12, 79,114,231,133, 66, 14,208,118,168,145,101, 93, 53, 77,182,221,139, 12,
+141, 88,103, 21, 96,226,228, 82, 3,217,217,217,112,173,229, 11,149,200, 86,116,253, 89,177, 9, 72, 21, 53, 75,105,208,160, 65,
+115, 87, 87, 87, 7,119,119,119,100,101,101,193,203,203, 11, 38, 38, 38,150,129,129,129,237,170,125, 13,182,186,139, 81,128,166,
+ 0,179, 12, 6, 50, 15, 58,254, 98, 60,203,108,136, 95, 3, 5,255, 56,115,181,103,175,179,117, 13, 63,224,216,231,176,183, 16,
+ 99,211,232,134, 86,182,230,226,106,153, 44, 66,136,191,189,189,253,249, 91,183,110,217, 72, 36, 18,220,187,119, 15,117,234,212,
+193,207, 63,255,108,107,105,105,249,143, 53, 89,111,152, 43, 43, 74,169, 18, 0, 11, 96, 32,170,209,235,181,212,172,252,178, 96,
+193,130,113,223,126,251, 45,174, 95,191, 14, 23, 23, 23,100,102,102,162,121,243,230, 9,185,185,185, 21,190,151,252,253,253, 93,
+158, 62,125,154, 60,105,210,164,134, 59,118,236,144,202,100, 50,228,229,229,225,183,223,126,195,140, 25, 51, 64, 8, 1,165, 20,
+155, 55,111,150, 13, 27, 54,172, 81,108,108,108,178,187,187,187, 49,205, 55, 8, 0, 9, 0, 89,233, 34, 7, 32,219,189,123,183,
+121,247,238,221,205, 74,215, 73, 1, 72, 9, 33, 92, 71,175,127,179,193,162, 64, 61, 7, 15, 31,228,159,217, 7, 41,159, 64,202,
+ 43, 93,248, 4,204,243, 71,112,149, 8,160,163,212,191, 58, 7, 55, 49, 49,121,181, 48, 12,131,212,212, 84, 48, 12,131,217,179,
+103, 75,198,141, 27, 87, 87, 36, 18,221,104,209,162,197,226, 10, 79,160, 52, 34,117,231,206, 29,212,174, 93,155,204,156, 57,211,
+ 44, 44,172,228, 43,246,209,163, 71,240,244,244, 36,139, 22, 45, 50,237,218,181, 43,145,203,229, 70, 71,176, 24,134,129, 84, 42,
+ 69,171, 86,173,200,150, 45, 91, 76,196, 98, 49,142, 29, 59,134,204,204, 76,180,111,223,158,191,101,203, 22, 19,137, 68,130,203,
+151, 47, 35, 63, 63,223,104,221,202, 34, 88,165,166,206, 40,154, 52,105,178,201,193,193, 97,197,246,237,219,197, 82,169, 20, 23,
+ 47, 94, 68, 94, 94, 30, 6, 12, 24,160,223,185,115,167,196,204,204, 12, 55,110,220, 64, 94, 94, 94,181, 50,199,157, 59,119,224,
+229,229, 69,102,205,154, 37, 13, 13, 13,213, 1,192,253,251,247,203,174,179,212,204,204,108,121,179,102,205, 54, 85,164,193,178,
+ 44, 82, 83, 83, 17, 17, 17,129,231,207,159, 35, 51, 51, 19, 89, 89, 89, 40, 44, 44,132, 94,175, 7, 0,200, 10, 11,142,253,178,
+229,200, 3,185, 84, 42, 11,169, 91,187,198,173,123,145, 25,114,169, 84, 86,219,163,134, 55, 33,243,222,122, 97, 67, 67, 67, 23,
+243,120,188, 27, 11, 23, 46,172, 55,107,214, 44,113,116,116, 52,238,221,187,247,151,124,245, 81, 26, 44, 66, 8,136,166, 54, 8,
+105,120,243,121,177, 85,243, 46, 3,133,120,113, 18, 96,117, 0,195, 71, 88, 61, 23,254,161, 71,197,246,160,168, 7, 53,124, 1,
+ 35, 28, 59, 33, 4,208,122, 1, 36,232,244, 83,189,117,211,158,163,133,201,201,201, 16, 10,133, 16,139,197,104,216,186, 55,127,
+247, 3,157, 3, 8,234, 67, 11, 31,163, 52,203, 33, 22,139,191,251,252,243,207,229,229, 53, 59,117,234, 36,151,201,100,115,170,
+109,174,138,101,161,208,211,241, 17,201, 10,247,239,143,165,249,197,102, 40,125, 64,233, 36, 64,215,224,125, 77,150,155,155, 91,
+152,183,183,247, 11, 15, 15,143,102,239,101,174, 76, 69, 55,246,236,217,235,108,229, 90, 98,174,160, 87, 1, 2, 41, 28,108, 45,
+176,105, 98, 43, 43, 91, 11,105,149, 76, 86,169,185, 58,119,243,230, 77, 27,137, 68,130,240,240,112, 8,133, 66, 72, 36, 18,212,
+173, 91, 23, 27, 54,108,176,181,178,178,250, 71,152, 44, 66,136, 37, 33,164, 3, 33,164, 15, 33,164,119, 57,115,229, 1,160, 53,
+ 33,164, 29, 0, 7, 0,151, 40,165, 15,140,212,108,198,231,243,143,213,175, 95, 63,133,207,231, 71, 46, 90,180,232,171,105,211,
+166, 97,229,202,149, 8, 11, 11,123, 62,109,218, 52, 68, 69, 69,233, 21, 10, 69, 55, 74,233,209,138,180,138,138,138, 14,207,154,
+ 53,203,188,103,207,158,101,255,199,213,171, 87,177,109,219, 54,200,229,175,183,130,232,214,173, 27, 70,140, 24, 97,169,209,104,
+254,168, 72,211,222,222,190,205,205,155, 55,235, 0, 16, 2, 16,151, 25,172,199,143, 31, 91, 20, 20, 20, 88,152,152,152, 88, 56,
+ 58, 58,154,150,153,172,158, 61,123, 90, 8, 4,130,102,224,248,119, 26, 44, 0,208,230,164, 67, 12, 3,164, 60, 2, 25,175,156,
+201, 2, 11,126,126, 70, 21,139,218,183, 27, 44, 83, 83,211, 87, 70, 75,169, 84, 26, 29,113, 41, 51, 54,150,150,150, 40, 44, 44,
+132, 78,167,123,245,112, 88, 90, 90, 66,173, 86, 3, 0,228,114, 57,170, 25,193,194,245,235,215,113,237,218, 53,240,249,124, 88,
+ 89, 89, 1, 0,238,222,189,139, 71,143, 30, 65, 40, 20,194,202,202,170, 74,186, 90,173,246,173, 17, 44,173, 86, 11,177, 88, 92,
+ 37, 19,168, 82,169,232,221,187,119,241,248,241, 99,136,197, 98,216,218,218, 66, 36, 18, 33, 49, 49, 17, 81, 81, 81, 16,137, 68,
+176,181,181,173,214,253, 49, 51, 51, 67,110,110, 46, 12, 6,195,171,107, 97,110,110,142,226,226, 98, 48, 12, 99, 84, 58, 89,150,
+ 69, 74, 74, 10, 50, 51, 51,145,152,152,136,172,172,172, 87, 38,171,172,138,176, 90, 25,151, 97, 64, 8,193,189,123,247,232,249,
+243,231, 81, 88, 88,248,151,188, 84, 22, 33,253,232, 88,235,111, 14,157,160,125, 86,145, 78,156,169, 21,154,219,251,183, 5, 94,
+156, 0, 24, 62, 32,177, 68,227,128,154, 72,200, 53,200,163,211, 53, 18, 16,116,192, 26,111, 75,163, 52, 13,130,118,153,133, 58,
+113,188,214,214,204,175, 94, 32,210,211,211, 33, 22,139, 33, 22,139, 17,212,180, 45, 94,100, 27,100,145,201, 74, 25, 40,218, 27,
+165, 89, 74,195,134, 13,107, 73,165,210,208,134, 13, 27,146,242,154,161,161,161, 96, 24,166,110,131, 6, 13,124,171,116,254,171,
+ 61, 69,208,202, 26,131, 79,199, 71,166, 42,156, 14, 61, 86,121,119,237,209,219,106,229,217, 12,191, 39,105,106, 15, 80,221,100,
+ 80,109, 96,117, 77,150,187,187,123, 75, 19, 19,147,163,223,125,247,157,135, 88, 44, 62,225,225,225,209,188, 90,229,155,148,183,
+254,187,175, 6, 58, 91,150,153, 43,157, 2,224, 75, 1,129, 20,224, 75,225, 96,103,131,133, 35,218, 89,201, 36,130, 63,141,213,
+148, 74,165,187,215,172, 89, 99,251,166,185, 42, 91, 26, 54,108,136,217,179,103,219, 90, 89, 89,237,250,155,205,149, 21, 74,218,
+ 85, 61, 4,240, 7,128,115,229,204,149, 23,128, 63, 75,163, 86,247, 40,165, 9, 70,106, 54,233,216,177,227,133,231,207,159,119,
+126,240,224,129, 99, 90, 90,154,239,228,201,147,177,114,229, 74, 76,155, 54,109, 23,165,212,123,223,190,125, 13,110,223,190, 93,
+151, 82, 90,105, 68, 44, 45, 45,237,211,105,211,166,101,101,101,101, 1, 0,234,214,173,139,188,188, 60, 76,153, 50, 5, 19, 38,
+ 76, 40,139,188,130, 82,138,244,244,116, 44, 91,182, 44, 61, 45, 45,237,179,138, 52, 13, 6, 67,226,190,125,251, 26,105,181, 90,
+ 23,148, 84, 11,138,243,242,242,204,114,114,114, 76,181, 90,173,156,101, 89,185,133,133,133, 9, 0,217,144, 33, 67,248,145,145,
+145,126,122,189, 62,153,179, 34,255, 82,131,197, 35,120,248,242,238,101, 88,249, 7,190, 22,189,146,241, 8,164,102,230,120,145,
+152, 0, 33, 72, 68, 85, 15, 76, 41,125,205, 96,149,189, 24, 83, 83, 83, 49,125,250,116,197,142, 29, 59, 30,105, 52,154,208,203,
+151, 47,207,168,244,195, 27,128,173,173, 45, 18, 18, 18,232,143, 63,254, 88,112,226,196, 9, 61, 0,216,217,217, 33, 49, 49,145,
+206,154, 53,171,112,239,222,189,180, 42, 6,139, 97, 24, 72, 36, 18, 92,188,120,145,206,153, 51, 39, 63, 53, 53,149, 90, 91, 91,
+195,218,218, 26,103,207,158,213,207,152, 49, 35, 63, 54, 54,246,213,186,170, 24,172, 50,195, 82,222,160,188,203,120, 85,196,213,
+171, 87,191,200,207,207,159, 56,101,202, 20,229,147, 39, 79,168,173,173, 45,108,109,109,177,117,235, 86,254,208,161, 67,149, 15,
+ 31, 62,124,181,174, 58, 88, 91, 91, 35, 38, 38,134, 46, 90,180, 72,121,238,220, 57, 1, 0,216,216,216, 32, 42, 42,138,206,159,
+ 63, 95,153,151,151, 55,241,234,213,171, 95, 84, 82,224,224,249,243,231,175, 34, 86, 42,149, 10, 89, 89, 89, 72, 76, 76,124,101,
+176,148,114,179,142, 95, 15,235, 90,191, 88,169, 84,220,122,244,244,101, 72,195, 58,118,197, 74,165,226,105,220,203, 24, 74,231,
+188,181,109,219,181,107,215,102,232,245,250,208, 35, 71,142, 60,218,176, 97,131, 34, 39, 39,231,173,134,253,163, 52, 88, 12,235,
+ 0, 66,155, 93,121, 90,100,209,174,107,127, 17, 73,187, 13,104,139, 0,177, 37, 32,182, 4, 95,110,141, 78,205, 27,240,182,222,
+ 44,112, 0,101,155, 64, 40,174,188,125,139,128,218, 3,108,243, 51, 49, 42,203,102,125,198,138,114,114,114,192,227,241, 94,153,
+ 33,153, 92,142, 54, 61,134, 48,155,111,171, 29, 0,218, 20,132,103,116,155, 25,161, 80, 56,117,216,176, 97,194,220,220, 92, 48,
+ 12,243, 74, 83, 42,149,162,103,207,158, 98, 83, 83,211, 89, 70,159,251,254, 58, 66, 8,196,141, 1, 58, 33, 58, 77,229,116,248,
+145,210,103,242,146, 77, 82,255, 6,141, 48, 50,204, 78,186,228, 88,134,255,131, 68,101, 77,192, 48, 17,122, 77, 80, 85, 77,150,
+135,135, 71,115,185, 92,126,236,208,161, 67,178, 86,173, 90, 97,202,148, 41,114,137, 68,114,194,221,221,189, 69, 85,111, 83,113,
+145,225,235,249,171,182,167, 63, 92,222, 1,208, 22,151, 24,171,114, 75, 70, 17,139,217,155,206,231,235,116,116,160,177,154, 74,
+165,114,232,240,225,195,179,255,252,243,207,191,152, 43,137, 68,130,184,184, 56,124,255,253,247, 57, 57, 57, 57,159,253,205,185,
+180, 1,128,251, 0, 84, 0, 90, 2,144,149,246, 20, 12, 5,112,150, 82,106,160,148,166, 83, 74, 83,141, 21,228,241,120,211,214,
+174, 93,203, 87, 42,149, 24, 49, 98, 4, 18, 19, 19,145,146,146,130,111,191,253, 54,142,101,217,161,165,154, 15, 40,165, 81,198,
+232,105, 52,154,232,220,220,220, 46, 29, 58,116,200,203,205,205, 69,189,122,245,208,181,107, 87, 56, 56, 56,192,201,201, 9,221,
+187,119,135,183,183, 55,178,179,179, 49,112,224,192,156,204,204,204, 14,148,210, 10,123,161,103,103,103,199,238,218,181, 43,102,
+236,216,177, 13,147,146,146,252, 0, 88, 23, 22, 22,202, 11, 11, 11,197, 26,141, 70,106,105,105,105,217,160, 65, 3,155, 47,191,
+252,210,228,254,253,251,126, 73, 73, 73, 69, 0, 18,192,241,239, 52, 88, 90, 96,246,182,125, 91, 85,162, 26, 94, 48,247,169, 15,
+153, 68, 2,169, 72, 4,169,165, 53,212, 44,139,141,113,105,138, 98, 74,103, 85,245,192,148,210,215, 34, 13, 6,131, 1,235,215,
+175, 87, 45, 92,184, 48, 47, 45, 45,109,212,229,203,151,235,223,185,115,231,161, 49, 70,168,160,160, 0,251,246,237, 83,110,217,
+178,229,185, 82,169,108, 40, 20, 10,117, 26,141, 6,187,118,237, 82,173, 88,177, 34, 94,161, 80, 4, 11, 4, 2,109, 85,204, 75,
+ 89, 4, 75, 32, 16,232, 84, 42, 85,195,221,187,119,199, 30, 61,122, 84,105,102,102, 6,129, 64,160, 83, 40, 20,117,183,111,223,
+ 30,189,123,247,110,165,169,169,105,149,140, 27,203,178,111,173, 34,100, 89,182, 74, 6, 11, 0,238,220,185,243,155, 86,171, 13,
+217,181,107, 87,210,166, 77,155, 84,102,102,102, 0, 0,157, 78, 23,188,109,219,182,164,117,235,214,169,171,210,192,189,180,224,
+129,193, 96,192,246,237,219,213,187,119,239, 78,210,235,245,193,101,235, 54,111,222,172,218,190,125,123,146, 86,171, 13,185,115,
+231,206,111,149,105, 25, 12, 6, 67, 65, 65, 1,248,124, 62,158, 63,127,174, 46,139,208, 61,123,246,236,149,193,178,179,177,170,
+211, 52, 56,192,247,231,245,251, 46,201,197, 98,113,135,176, 32,191,200,167, 9, 73,148,146,248, 74,206,253,225,245,235,215,235,
+231,228,228,140,218,176, 97, 67,222,206,157, 59, 85, 6,131,225, 53,147, 37, 18,137, 62,198,167, 86, 6, 2,233,211, 12,181,169,
+132,209, 19,196, 28, 44, 49, 87, 18, 11, 64, 98, 9, 72, 44,225,236,236,130,219,113, 10, 83, 48, 16,193,160,179, 51,226,129,148,
+131, 64,246, 56, 29,166, 2,145,148,164,165,165,189, 50, 66,101,139,135,151, 31,238, 37, 20,153,128, 80, 49,120,176,175,194,179,
+222,197,212,212,148,159,154,154,250, 87, 77, 15, 15,158, 78,167,235, 96,244,185,167, 24, 28, 1,246,171,152, 52,149,227,129, 7,
+197, 62, 19, 23,111,150, 74, 13,121,192,221, 85,240,175,229,132,137,125, 26,136,102, 30,206,244,191, 19,175,168, 5, 30, 29, 9,
+182,200,232,175, 11, 15, 15,143,102, 50,153,236,196,193,131, 7,101, 50,153, 12,207,159, 63, 71,221,186,117, 49,127,254,124,153,
+ 76, 38, 59,238,230,230, 22, 86,149,219,116, 51,141, 38, 20, 21, 26, 66,167,238,123,153,246, 48, 85,255,154,185,202, 44,166, 24,
+254,195,225,188,220, 2, 85,239, 27, 47,117,231,171,112, 45,239,231,229,229,181,159, 53,107, 86,118,102,102,230,107,230, 42, 33,
+ 33,161,204, 8,132, 81, 74, 35,254,230, 92, 42, 71, 73,227,117, 31, 0,158, 0,234, 83, 74,245, 0, 10, 41,165,213, 10, 93,215,
+169, 83,167,161,155,155, 27,214,173, 91,135,141, 27, 55,230,254,252,243,207,160,148,162,118,237,218,102,213,213, 76, 79, 79,191,
+ 29, 29, 29,221,161, 94,189,122, 79, 86,175, 94,157,228,232,232,200,126,249,229,151, 24, 62,124, 56,108,109,109, 13, 43, 86,172,
+120,217,188,121,243,199,177,177,177,109,139,139,139, 31, 25,113,127,104, 86, 86,214,245, 95,127,253,245,102,235,214,173,101, 67,
+135, 14,181, 61,116,232,144,181, 66,161,112, 18,139,197,118, 26,141, 70,244,228,201, 19,222,254,253,251, 29, 34, 35, 35,227,148,
+ 74,229,109, 90, 58,177, 31,199,191,208, 96,253,254,156, 94, 47, 46,204, 91, 58,127,243, 6,229, 11, 61,129,190,102, 29,168,172,
+157,113, 39, 79,137, 41, 79,146, 20,122,150,174,217,247,156, 94,168,110, 4, 75, 38,147,225,220,185,115,134,175,190,250, 74,117,
+251,246,237, 95,243,243,243, 93,239,220,185,179,211, 88, 29,150,101,121,159,127,254,121,209,181,107,215,246,165,166,166,250,135,
+135,135,191, 96, 89,150, 55,104,208,160,162, 51,103,206,252, 73, 8,241,187,123,247,238,211,106,132,184, 33, 20, 10, 65, 8,193,
+157, 59,119,226,114,114,114,252,111,222,188,185,123,198,140, 25, 69,148, 82, 94,120,120,120, 98,113,113,113,189,235,215,175,239,
+248,250,235,175,139, 40,165, 60, 99,117,203,204, 91,121, 35, 85, 22,205,170,170,193, 2,128,240,240,240,136,188,188, 60,191,219,
+183,111,159,248,242,203, 47, 21,165,230,227, 73, 97, 97,161,239,205,155, 55,143, 13, 29, 58, 84, 81, 21, 61,173, 86,139, 30, 61,
+122, 40,110,220,184,113,172,176,176,208,247,206,157, 59, 79,202,214, 93,187,118,237, 68, 94, 94,158, 95,120,120,184,177, 5,248,
+252, 21, 43, 86,164, 46, 92,184, 48, 53, 51, 51,243,231,229,203,151,103,218,218,218, 66,171,213,190, 50, 88, 25, 89, 57,231,155,
+124, 50,246,135, 29,127,156,189,179, 98,254, 87,173,164, 18,177,104,214,146,205, 23,117, 60,220, 52,210,100,238, 44, 40, 40,112,
+125,240,224,193,175, 19, 39, 78, 84,157, 62,125,218, 32,149, 74, 97, 98, 98, 2,177,248, 99,108, 67,106, 40, 0, 75, 82,250, 6,
+ 89, 38,175, 88,251,155,250,241,139,244, 87,198, 10, 98, 11,220,137,205,195,119,171,247,177,223,119,179,125, 1,138, 68, 48,136,
+174, 92,147, 95, 0,150,100, 12,111, 36, 76,250,253,167, 9,234, 23,209,143, 94, 51, 66, 81, 15,239, 96,249,156,177,236,162,174,
+ 86, 47,192,146, 20, 16, 68, 25,155, 90,189, 94,223,103,241,226,197,197,177,177,177,175,105,198,199,199, 99,201,146, 37, 74,181,
+ 90,221,219,232,135, 82,204,175,111,160,212,110,231,141,236,218,163,190, 28, 38,149,234,115,128, 91, 63, 2, 2, 25, 32, 54, 71,
+ 3,223, 90,152, 61,226, 19,193,228,253,105,254, 0,235, 6, 70,232,103,108, 58,249,124,254,177,197,139, 23,203,164, 82, 41,158,
+ 61,123, 6,137, 68, 2,169, 84,138,160,160, 32,172, 92,185, 82, 38, 18,137, 78,148,181,239,172,178,201,218,253, 44,237, 97,162,
+ 10, 16, 72,144, 85, 12, 12,255,225, 72,110, 78,190,178, 79, 85,204,213,155, 38,107,194,132, 9,217,233,233,233,144, 72, 36, 72,
+ 76, 76,196,128, 1, 3,178,255, 33,230, 10, 0,138, 1, 56, 3,136, 1, 16, 11,224, 1, 33, 68,132,247,152,158, 45, 50, 50,242,
+ 94, 66, 66, 2,190,248,226, 11, 12, 30, 60,216,242,211, 79, 63,197,139, 23, 47, 16, 19, 19,115,255,125, 18,170, 84, 42,239, 36,
+ 37, 37,213,157, 48, 97,194,108, 23, 23,151, 45,214,214,214, 23,173,172,172, 46,184,184,184,108,158, 49, 99,198,119,169,169,169,
+245,181, 90,237,131, 42,220, 31, 74, 41,125, 22, 27, 27,123,120,251,246,237,225, 19, 38, 76,136,251,244,211, 79,147,198,143, 31,
+159,250,235,175,191,166,220,191,127,255,105, 94, 94,222,169,202,162, 97, 28, 31, 1,198,206, 10,221,199, 3, 77,135,213, 34,151,
+ 62,173,137,194,129, 53, 81,244,185, 39,185,218,219, 3,173,171, 51,219,118,195,134, 13,169, 94,175,167,167, 79,159,166,157, 58,
+117, 42,110,214,172,217,213,192,192,192,218,213,153,193, 59, 44, 44,236,100, 80, 80, 80,223, 55,215, 53,106,212,168,127,249,117,
+ 45, 91,182,140,104,217,178,101,126,139, 22, 45,158, 27,147,206, 22, 45, 90, 68, 53,109,218,180,184, 69,139, 22, 81,229,215, 7,
+ 7, 7,119,111,221,186,245,177,242,235, 26, 53,106,212,237,205,117,239, 58,247,182,109,219, 38,198,196,196,208,151, 47, 95,210,
+206,157, 59,167,148,173,111,211,166, 77,226,163, 71,143,232,211,167, 79,105,199,142, 29, 83,170, 59,123,121, 80, 80,208,136,230,
+205,155, 95,127, 35,205,195,223, 92, 87,145,102,243,230,205,175, 7, 7, 7, 15,127,115, 93, 80, 80,208,136,247,157,101,221,209,
+209,209,187, 65,131, 6, 25, 43, 86,172,160, 53,107,214,204, 40,255,155,127,216,231,223,229, 21, 20, 21, 76,153,191,238,119, 91,
+191, 30,117,171, 51,115,123, 96, 96, 96,237, 22, 45, 90, 92,253,228,147, 79,138,111,223,190, 77, 41,165,180, 97,195,134,244,163,
+154,181,126,159,159,144,110,240,107, 74,215,251, 29,139,154,227,246,228,179, 16,185, 58,252,167,206,148,158,159, 74,111,174, 27,
+ 78, 67, 61, 68,134,107, 83, 92, 99,232, 6,223, 19,116,179,119, 11,186,170,150,200, 40,205,141,158,205,233, 6,223, 19,145,179,
+221,158,244, 12,180,213,236,222,186,129, 62,123,246,140, 30,222,191,139, 54,174, 41, 43,209, 92,239,119,154,174,243,107,101,148,
+230,235,207,124,211,208,208,208,162,223,127,255,157, 62,123,246,140,158, 57,115,134, 54,109,218, 84,209,160, 65,131, 86, 70,159,
+ 59, 64,232,186, 58, 61,244,107,125,174,204,104,107,146, 55, 60, 68,162, 30,216, 64,164,233,238, 47,212,182,247, 18,234,155,184,
+241, 13,245, 29, 25,214,207, 22,180,189,143, 84, 77,215,251, 92,166,235,253, 58, 24,155,206,218,181,107,191,116,119,119,167,239,
+ 90,188,189,189, 51, 91,182,108,201,175,206,125, 15,177,135, 91, 91,111,113,234,185,249,173,105,215,122,166,217,141, 93,249,173,
+223, 55, 47, 1,104, 96, 99, 99,147,181,101,203, 22,106,111,111,159, 9,192,255, 31,145, 63, 75,214, 89, 1,232, 14,192,182,244,
+255, 38, 0, 90, 1,168,249, 30,154, 77,218,183,111,175,187,119,239, 30,125,254,252, 57, 61,121,242, 36,109,218,180,169, 30, 64,
+216, 63,230,217,228, 52,185,165,220, 66,254,155,209, 73, 66, 72,219,183, 13, 70, 22, 24, 24, 72, 59,116,232,160,188,116,233, 82,
+145, 70,163, 25,121,247,238,221,195,239,171,249,223, 72,231,127, 67,179,117,235,214,215, 25,134,169, 89,218, 5, 56,229,236,217,
+179, 13, 1,160, 85,171, 86,215,121, 60, 94,205, 82,211,155,114,238,220,185,134, 31,219,185,151,225,228,228,228,205, 48,204, 41,
+ 0,234,164,164,164, 87,189,157,236,252,187,135, 90, 89,154,183,202,203,203,191,159,246,248,208,137,247, 73,103, 80, 80, 80, 55,
+177, 88,188, 33, 52, 52, 84,126,254,252,121, 89,120,120, 56,249,168,174,231,106, 79, 17, 68,162, 32, 80, 76,127,156,172,240,248,
+238, 72, 86,173, 79,218, 52, 21,108, 61,120,137, 93,218,203, 46,182,137,167, 60, 14, 2,246, 7, 16,245,109,124, 22,175, 54, 90,
+ 83, 74, 26,193, 32,152,254, 32, 81,225, 54,229,207, 92,175,182,189,135,243,142,236,217,192,254,216,195, 58,182, 73, 45,147,151,
+160,248, 1, 98,197, 13,163, 53, 95,127,238,155,138,197,226, 19, 3, 7, 14, 52,217,189,123,183, 82,165, 82,117,185,119,239,222,
+133, 42,157,251, 38,223, 26, 48,144,133,160,212,181,242,175, 71, 60,131, 1, 11,241, 85,212,203,127,194,125,111,236, 64,220,228,
+230,226,163, 10,165,126,130, 49,145, 43, 99, 52, 9, 33, 13, 44, 45, 45,119,228,230,230,246, 55, 38,114,245,191, 60,119, 66,136,
+ 45,128,224,210,168, 21, 1, 16, 97,108,212,166, 2,205,102, 60, 30,111, 90,173, 90,181,234, 61,127,254,252,177,193, 96,248,145,
+ 82,122,241,223,240,238,248, 55,104,126,108,252, 45,125,216,165, 82,233,189,139, 23, 47,158, 20, 10,133,223, 95,187,118, 77,253,
+111,186,224,231,207,159,111,242,182,245, 23, 46, 92,104,242,111,185, 6, 41, 41, 41, 49, 0,220,222, 92,159, 17,113,232, 6,128,
+ 27, 31,226, 24,119,239,222, 61, 28, 22, 22,118,250,218,181,107, 51,229,114,121,199,143,238, 34,142,141,213, 96,181,231, 93,136,
+ 68, 75, 2,156,101,211,191,235, 76,201,226, 83,215,221,150,246,178,123, 89,153,185,170, 68,243, 54,164,186, 37,245, 93,101,211,
+ 23,117, 7,249,225,196, 86,183, 31,123, 88,191,172,204, 92, 25, 67,120,120,248,181,192,192,192, 78,123,246,236,217,166, 82,169,
+ 70, 84,102,174,222,138, 41,147,134, 98,221, 28,232,120, 1,160, 16, 85, 16,154, 87,128,225, 61, 70, 6,210,255, 41,183,236,102,
+ 26, 77, 0,224,255, 33, 53, 41,165,247, 1,248,253, 19,179, 40,165, 52, 19,192,177, 15,172,121, 21,192, 85,238,213,205,193, 25,
+172,119,112,229,202,149, 64,238,210,115,252,183,185,120,241,162, 26,192,119,165,203,199, 71, 57,147, 21, 88, 67, 58,246,207, 81,
+ 82, 5, 40, 73,130,128, 93, 81,101,115,245, 22,147,213,200, 77, 58,225,192, 72,169, 2, 20,105,160, 88,254, 62,230,170,188,201,
+ 2, 80,179,218, 2,125, 34,181, 0,226, 64, 72, 60,230,226,221,141, 21,231,226, 85, 61, 6, 7, 7, 7,199,191,198, 96,113,112,
+112,124, 64,147,181,191,206, 29,100,241,166,128, 65, 77, 64,159,128, 98,125, 26,198,198,107,222, 83,243, 22,178,200,120,240,224,
+ 13,145, 62, 22, 69,154, 52,140,122, 15,205, 15, 77,137,121,122,183,129,154,195,101, 13, 14, 14, 14,206, 96,113,112,112,188, 15,
+ 37, 81,157,164,210,229,159,171,201,193,193,193,241, 47,130, 0,104,251,142, 15, 68,163, 27,175, 17, 66,218, 86,227, 3,244, 44,
+167,201,105,114,154,156, 38,167,201,105,114,154,255, 46,205,202,180, 63,154,198,243,255,205, 46,138,224,186,176,114,154,156, 38,
+167,201,105,114,154,156, 38,167,249, 47, 92, 24,112,112,112,112,112,112,112,112,112,124, 80,254,214, 54, 88, 50, 27,111, 71,240,
+153,122,132,165,190, 0, 64, 25, 18, 5, 61,251, 80,145, 21,147,250,190,218,196,190,174,204, 68,192,219, 85,164, 51,124, 74,211,
+ 31, 41, 62, 68,122, 9, 33,205, 80, 50,188, 64, 66,105,119, 97,227,246,179,241, 54,177, 55, 55,105,175,209,104,189, 68, 66,126,
+106,122,161,230, 15,154, 25, 89,204,101, 63, 14, 14, 14, 14, 14,142,127,153,193,242,110,210,243,138,137, 76,238, 5, 0, 6,150,
+194,192, 2, 5,185, 25, 55, 18, 30,158,233, 9, 0, 78,254,109, 14,136,229, 54,161, 6,150,130,165, 20, 6,150, 66,167, 86, 62,
+203,140, 60,102,212,204,243, 38,118, 62, 61,219,182,111,219,171, 75,151, 79,124,234, 6,212,245, 4,128, 71,143, 31,197, 30, 61,
+122, 44,218,196,206,231,207,162,140,232, 3,239,115, 98, 38, 2,193,119,193,141, 66, 58,220,185,115,107, 38,128,111, 63,208,245,
+ 18,210,171,157,183,147,102,199,219, 84,101, 39,123,115,147,246, 61, 58,183,247,157, 50, 97, 20, 25,254,205, 98,151,194, 43, 23,
+ 38,201, 29,235, 22, 82,170,190,174, 76,127,118,143, 82,202,114, 89,145,131,131,131,131,131,227, 95, 96,176, 76,100,114,175,115,
+ 7, 55,217, 29,184,154, 8, 0,104,219,208, 1,243,126,218,210,131, 16, 18, 13, 0,189,191,254,201,251,187,137,195,112, 61, 34,
+ 3,148, 82, 52,240,178, 70,247, 79,199, 24,117, 80,169, 67,157,224,254,253,250,125, 58,101,202,228,110,207,158, 61,139,223,189,
+123,247, 21, 0,104,222,162,133,215,162, 69,139,250, 45,179,180, 18, 75, 29,234, 36, 43,211, 34,239, 84,203, 92, 57,120,218,248,
+249, 7, 15,223,189,241, 71,126,171, 78, 3,190, 48,113,240, 92, 94,148, 22,155, 85, 29, 45,177,171,127, 77,115,129,112, 30, 97,
+ 24,190,185,157,187, 29, 0,152, 57,250, 29,183,243,108,102, 48,177,176,123, 80,172, 84,110,203,120,114,114, 99, 69, 19,118,106,
+ 52, 90,175, 9, 95,127, 78,238, 63,207, 70, 77,255,102,204,170,197, 51,193,234,245,102, 19,103,204,111,127,235, 22, 0,224, 46,
+151, 21, 57, 56, 56, 56, 56, 56,254, 5, 6, 11, 0, 76,164,124, 68,191, 72, 3, 0, 88, 72,129, 47,135,246, 65,122,122,154,183,
+214,192, 98, 72,255,158,184, 23,149,138,232,184, 76, 80, 74,225,237, 34, 51,250,160, 60,176, 65,159,127,241,121,203, 83,167, 79,
+223,254,110,214,119,219, 9, 41, 25,189,123,195,175,191,133,206,158, 51,123,196,224,161,131,219,237,223,191, 63, 2, 64,181, 12,
+ 22, 35,176, 88,241,195,162,185, 38, 73,153, 42,213,132,201, 83,121,147, 38,142, 91, 6, 96,104,117,204,149,159,171,203,247, 87,
+ 78,239,151,201,100, 50,108,220,184, 81, 12, 28,194,192,110, 45, 68,157, 63,249, 4,181,125, 3,154,252,184,102,119,189,211, 34,
+209, 23, 54,222,237,122,102,197,156,121,107,213,166, 72, 36,124, 54,119,201, 47,190,212,194,151,204, 28,217, 9,117,106, 57, 34,
+ 57, 51, 31, 45,218,119,231,221,190,125,183, 9,103,176, 56, 56, 56, 56, 56, 56, 62, 46, 42,108,228,110, 48, 80, 68,199,165, 34,
+ 58, 46, 21,183,163, 50,161,101,121,248,105,225,116,252, 48,119, 42,178, 21,192,129,235,137,136,137, 75, 67, 76, 92, 26,178,114,
+139,254,178,255,155, 93, 45,127, 90, 34,107,184, 98,133,249,143,237, 91,200,195,172, 44, 45, 45,159, 70,108, 47,158, 61, 41,221,
+111,222,132, 68,161, 64, 98,159,100,105, 95,163,201,190,253,251,235,216,219,218,201,205,204,204,167, 90,249,182,223,100,225, 30,
+102, 94,145,230, 95, 76,161,131,127,203,174, 93, 59,119,118,176,183, 99, 71,173, 8,143,170,227, 91, 91, 95,219,219, 55,204,196,
+193,167,229,187,246,121,155,166,216,213,191,166,167,163,253,247,151, 78,238,151,169, 84, 42, 60,126,252, 24,217,217,217,165,219,
+ 3,246,246,142,112,115,113,194, 47,139,167,200,230, 78, 31, 19, 40,150,200, 14, 17, 66,200,219, 52,211,243,139, 78, 31, 59,113,
+ 38,253,216,158, 95, 88, 0,200,204, 45,198,133, 59,207,112,247, 73, 98,149,110,214,127,163,235, 42,167,201,105,114,154,156, 38,
+167,201,105,254, 19, 52, 63, 54, 42,140, 96,197, 38,230, 32,250, 69, 26, 6,119, 9,130,139,179, 35,110,199,228, 34,191, 88,135,
+188, 98, 45,242,138,181, 96,249,166, 72, 43,200, 67, 65, 78, 58,158, 38,100,161,178,137, 41,120, 98, 65,255, 9, 19,242,167, 20,
+ 45,172,157,122,241,196, 88, 56,219, 62,173, 51,109, 90, 94,187, 21, 43,204, 53,118, 14, 22,126,163,135, 15,233,112,232,192, 31,
+ 68,163,214,192,195,221, 85,210,188, 93,247, 97,191,109,217,233, 0,160,147, 49, 39, 99,107, 91, 71, 46, 54, 49,217,254,253,119,
+147, 37,139,127,143,142, 47,214,160,248,207,235,233,207,167, 76,159,109, 54,242,179,126,191,218,218,214,105,144,105, 68,227,114,
+177,171,127, 77, 55,107,235,239,175,158,218, 47,211,106,213, 72, 77, 77,133, 70,163,129, 94,175, 47,249, 93, 34,129, 88, 34, 65,
+129, 82,143,172,124, 53, 90, 54,111,194,107,120,234,170,175, 86,171, 29, 9, 96,253, 95, 50, 98, 86, 76,145,169,115,128,252,248,
+161,189,204,158, 51,247, 97, 33,151,226,250,189,103,184,123,249,184,129, 82,245,245,178,237, 76,157,106,123, 3,146, 83, 32, 68,
+252,106,103,194, 38, 21, 38, 61, 10,226,178, 42, 7, 7, 7, 7, 7,199, 71, 96,176,138, 20,197,207,134,142,154, 12, 79, 59, 7,
+243,238, 97,126,162,240,216, 60,100,166, 38,224, 89,204, 99, 40, 84, 58, 8, 45,107, 2, 18, 7,184,123,184, 33, 42,233,154,102,
+253,186,219,249,172, 94,245,236, 93,122,221,187, 59,185, 56,218,202,153, 31,151,214,184, 25, 19,157, 27,184,107,214, 22,124,250,
+169,137,205,143, 75,107,220,140,127, 46,103,100, 98, 67,147,161, 3,186, 19,232, 20,152, 54,109, 10,186,119,233,136,207,135,245,
+ 35, 59,119,255,222,216,216,147,209,136, 36, 75,102,127, 55,223, 52, 45, 79,171,189, 29, 83,164,150,201,165,210,107, 79,139,138,
+253, 61, 44,165,221,250,143, 42, 56,184,123,205,124, 0,147, 42, 51, 87,142,102,102,223, 95, 63,251,135,140, 82,138,228,228,100,
+104,181, 90,232,116,186, 87, 6,203,194,194, 2,121,197, 90,104, 50, 20,200,200, 83, 67,111, 96,209,169, 99, 39,217,221,123,145,
+131,222,102,176, 0,128,101, 9,171,215,107,113,224,244, 93, 36,222,217, 71, 9, 17,190,106,228, 94,102,174, 28, 28,106, 92,238,
+210,107,136,173, 72, 82, 82,221, 90, 88,172,198,182,245, 75,185, 92,202,193,193,193,193,193,241,177, 24,172,152,235, 7,154, 3,
+ 64, 96,219, 33,233, 38, 18,190, 29,159, 33, 72, 79,138,197,182,101,227,193,178, 20,157, 71,252, 8, 83, 15, 7, 72,133, 60,168,
+139,115,242, 83,239,239,179,175,232, 64,132,232,218,173,217,144,236, 49,102,116, 45,179, 93,187,138, 4, 0,176,107, 87,145, 96,
+244, 40, 87,179,181, 27,226, 60,154,180,105, 9,106, 48,160, 75,247,222,232, 63,160, 63,226,211, 20,248,227,242, 75, 40,148, 90,
+163,230, 63,147,216,123,187, 59,185,122,245, 30, 63,184,141, 41,159, 71, 72,109, 55,115, 94, 98,166, 78,207,227, 9, 12, 71,238,
+228,167,244,234,218,195,230,204,145,157, 29, 37,246,222,171, 85,233, 49,241,239,210, 49, 23, 8,231, 93, 59,253,135,140,199,227,
+ 33, 33, 33, 1, 90,173,246,213,162,211,233, 74,140,143, 82,135,212,108, 53,132, 58, 37, 50,242,212,200, 45,214,194,209,204, 2,
+ 58,157, 46,224, 93,186, 6, 86,125,164,107,207,193, 93,193, 80,134,165,244,160, 42,237,209,171, 52,148,153,171,142,221, 63,181,
+189, 28, 30,139,103,119, 79,228, 82, 86, 95,114, 48,194,114, 83,149,112,112,112,112,112,112,252, 63,195,168,129, 70,147,211,115,
+ 96,109,194,135,173,147, 7, 6,141,255,169,196, 48, 24,116,160, 20,208, 27, 88, 24, 51,103, 61,165,130, 51, 95,141,246,136,115,
+247, 32,249,131, 62,149, 41, 1, 96,208,167, 50,165,187, 7,201,255,106,180, 71,156, 66,107,169,213, 27, 12,184, 22,145,129, 31,
+247, 62,193,236,173,143,112,242,174,241,195, 97,241, 5,210, 9, 63, 44, 94, 36,227,243, 8,137, 72, 40, 42, 74,202,214, 23,241,
+ 4, 2,173, 76, 38,162, 26,202, 87,199,103, 26,178, 59,246, 29, 29,207,227, 9,198, 84,158, 86, 22,148, 82,168,213,106,104, 52,
+ 26,104,181, 90,104, 52,154, 87, 6, 43,191, 88,135,212, 28, 21, 18, 51,149,120,153,169, 68, 82,166, 18,233,185, 42,188,171, 35,
+161,169, 83,109,111,107, 11,171, 11,214,150,166,211,173,204,204,166, 90,152, 88, 92, 44,169, 14,124,221, 92,221,140, 72, 65,236,
+253,179,233, 6,173,162, 95, 97,242, 3,251,194,228, 7,246, 92,245, 32, 7, 7, 7, 7, 7,199, 71,104,176, 88, 0, 79, 19,178,
+ 32,226,179,112,113,247, 4, 45, 55,129, 61, 5,160, 55, 84, 60,169,125, 25,135, 14,165, 36,213,242, 42,102,167, 78,125, 25, 26,
+ 80,215,250,225,232, 81,174, 81, 1,117,173, 31, 78,157,250, 50,180,150, 87, 49,171, 51,136, 12,148, 82,176, 20,165, 11, 5, 53,
+198,185,149, 66, 8,175,113, 3, 95, 55,254,188, 93, 79, 95,142, 89, 27, 19, 45, 20, 10,117, 46, 54, 50,226,102, 47,227,213,176,
+149,138,212, 58, 70,237, 83,183,145,150, 0, 13, 43,210,201,215,105,231, 52,235,208, 87,161,213,234,225,234,234,250,154,185, 42,
+171, 34,204, 87,104,145,154,171,194,203, 76, 5, 18, 51, 21, 80,168,245,120, 28, 19, 7,194,240, 30,191, 77,211,204,212,234,212,
+177,131,251,106,212,247,171,101, 87,199,219,221,110,227,214,237, 53, 36, 18,139, 83,166, 78,181,189,107,120,248,132,223, 58,251,
+187,237,205,136, 20, 36, 68,223, 77,211,171, 11,118, 23,167, 71,157,227,178, 38, 7, 7, 7, 7, 7,199, 71,108,176, 0,192,205,
+197, 30,183, 30, 39,192,205, 86, 2,115, 51, 83, 68,197, 38,129,199, 8,192, 16, 64,167, 55,222, 4, 81,173,110,239,207, 63,155,
+ 47, 75,136, 51,220, 90,187,238,249,179,132, 56,195,173,159,127, 54, 95, 70,181,186,189, 64, 73,239,188, 18,147, 85, 98,180, 12,
+ 85, 24,126,147, 82,214,206,214, 66,194,191,251,188, 56,155, 97,120,106,107,115, 9,107,109, 46,102, 28, 45,196, 2, 23,107,161,
+ 80, 36, 98,224, 96,107,163, 7,165, 21, 86,101,170, 19, 35, 94,164, 22, 20,204,108,222,190,183, 66, 32, 16,192,195,195, 3, 26,
+141,230,181, 70,238, 25,153,185,175, 34, 88,169, 57,106, 72, 69, 12,238, 95, 59,167, 48, 24,116,219,222,166,201, 19, 8,205,109,
+108,172,241,237,130,159, 49,117,206,207, 72, 46,224, 67, 40, 22, 59,184,123,248, 63, 24, 58,102,150,236,235, 13,207, 48,180,133,
+ 57, 20, 89,177,201,138,116,201,116, 46, 91,114,112,112,112,112,112,252,255,166,242,169,114, 40, 96, 34,147,128,242, 36,184, 18,
+ 30, 11,159, 58,245,176,245,240,109,120,213,109,140,212, 66, 61,170, 50,157,225,228,233,138,123, 0,238,117,239,238,228,210,179,
+167,115, 59, 74, 5,103,214,174,207, 79, 2,128, 77, 71,122,129, 2, 96, 89, 90, 98,180, 74, 71,136, 55, 22, 2,164, 36,164, 23,
+154,122, 56,200, 17,153,164, 85,203,197, 66,198, 82, 46,226,217,154,139,132, 66, 62, 31, 6, 74,212,217, 57, 25,133, 0, 73,169,
+ 76, 75,157, 24,241, 66,236,234, 63,179, 69,167, 1,223, 95, 57,249,187,204,211,211, 19,247,239,223,127,101,176, 10,139,138,145,
+ 83,160,132,204, 10,240,118,145,227, 73,248, 21, 67,118, 70,114,100,110,204,201,141,111,211, 99, 89,240, 84, 90, 3, 30, 60,207,
+ 71, 94,177, 14,121, 69, 90, 52,109,213, 85,216,180,109, 55, 92,126,156,133,220,124, 5,230,110,249,179,192, 64,117,253, 41,141,
+212,113,217,146,131,131,131,131,131,227,255, 55, 70,185, 35, 3, 75, 97, 99,109, 5,137,220, 12,113,233, 90, 20, 18, 59,228, 42,
+ 40, 12,134,138, 35, 88,132,144,182,111, 91,127,232, 80, 74,210,193,131,153,155, 14, 29, 74, 73, 42,239,228,216, 87, 85,132,165,
+127, 89,106,180, 38,165,134, 19, 71,206, 92,207,233, 22, 98,107,201,240,120, 74,161,128, 81,243,133, 60,173,144,207,232,132,124,
+ 70, 99,111, 38,224,157, 63,188,147, 33,132,158, 55, 70, 83,157, 24,241, 34, 46, 35, 99,102,235, 46, 3, 21,118,246,246, 24, 60,
+120, 48, 92, 93, 93, 1, 0, 38, 18, 2, 27,145, 2, 60, 85, 10, 46, 29,222, 92, 28, 21,126, 33, 28, 6,117,207,242,163,185,191,
+166, 73, 41,155,149,167,134, 82,163, 71,110,145, 22,185,197, 90,232,109, 67,113,240,122, 10,178,242, 53,136,189,190, 93,161, 86,
+228, 78, 80,165, 63,141,171,208, 68,190,227,220,223, 7, 78,147,211,228, 52, 57, 77, 78,147,211,252, 39,104,126,108, 24, 49,217,
+ 51, 69, 45, 71, 57,188,156,229, 80,105,237,160,210, 24, 80,172, 50,160, 64,161, 69,129, 66,135,184, 52, 5,158, 94,120,255,132,
+ 80, 0,148, 5, 8, 74,170, 10, 65, 74,140, 29, 37,198,237, 95, 44, 40, 88,246,227,162,185, 3,246,236,251, 19,227, 62,113,116,
+125, 24,167, 73, 33,132, 81, 50, 60,190,206,202,148, 47,120, 30, 27,157,122,233,244,254,160, 98,145, 98,184,177,105, 42,139,100,
+249, 52,108, 61, 15, 20,124,141, 50, 95, 62,189,105, 29, 60,120,240, 80, 21, 21,155,166,231, 73, 44, 30,178, 6,237,142,220,152,
+138,167,202, 97,132,146, 39, 55,195, 31, 53,150, 90,187,161, 72,169, 67,161, 82, 7,133,186, 36, 26,246,242,254, 33, 77, 94,114,
+212,239,133,201, 15,182,114,217,145,131,131,131,131,131,227, 95, 98,176, 20, 74,197,179,118,189,134,191,154,208,217, 96,160, 96,
+ 89, 10, 67,105,132,137,165, 20,122,173,242,217,251, 38,196,192,178,183,215,109,221,211,185,126,131,198,188, 58, 53, 76, 80,144,
+155,137, 59,183,110,232, 41,203,222, 48,202,160,197,199,171, 77,236,125,251,245,235,221,115,207, 23,163,198, 21,180,104,209, 74,
+108,109, 99,166, 77,207,204, 40,216,185,113,183,225,232,159,123,130,192,178, 67,104,124,188,186, 42,233, 82, 39, 70,188, 0, 48,
+168,212,177,183, 6,234,180, 84,102, 62,237,162,200,136, 57,111,172, 70, 86,114, 98,175,159,126, 88, 24,223,109,208, 87, 34, 75,
+123, 79,104,116, 60,164,167,167,227,249,237, 3,170,162,148,136,131, 69,201, 15,134,115, 89,145,131,131,131,131,131,227, 95,100,
+176,158,222, 40, 25, 15,235,191, 77, 78, 78,250,224, 29,187,255, 92,184,115,239,225,166,106,173,214,153, 5, 47,209,160,211, 93,
+ 18, 23,102,207, 54, 86,163, 40, 61, 42,146,184,187, 7,253,246,203,178,137,191,174,249,185, 13, 88,131, 15, 8,137, 35,132,158,
+ 47, 18, 42,190,172,170,185,122,155, 87, 34,205,142,183, 7, 80,165,137,163, 21, 89, 81,105, 38,246,181, 92,119,255,186,244, 71,
+134,225,181, 55, 24, 88, 1,107,208, 61, 51,104, 85, 63, 40, 51,163, 15,211,170,116,151,228,224,224,224,224,224,224,248,255,111,
+176,254, 87,228,196,222, 42, 4, 48,238,125,117, 74, 77,212,226,210,229,131, 66, 41,125, 12,224,113,117,246, 45, 74,127,158,137,
+106, 76, 56,205,193,193,193,193,193,193,241,255, 15,134,187, 4, 28, 28, 28, 28, 28, 28, 28, 28, 31, 22, 2,224, 29,189,242,140,
+159, 41,187, 58,189, 9, 42,211,231, 52, 57, 77, 78,147,211,228, 52, 57, 77, 78,243,227,211,172, 76,187, 42,254,227, 31, 13, 45,
+ 29, 49,253,191,177, 0,104,203,105,114,154,156, 38,167,201,105,114,154,156, 38,167,249,111, 91,184, 42, 66, 14, 14, 14, 14,142,
+127, 29, 54,222,221, 76,108,188,187,153, 24,187,189,109,157,190,246,182,117,250,218,115, 87,142,195, 88,248,220, 37,120,127, 8,
+ 33, 98, 0, 44,165, 84,251,119,165,193,210,178,166,153,222,212,230, 0,195,170,127,200, 79,124,120,230, 67,159, 95,157, 58,117,
+ 26, 0, 64,100,100,228,125, 74,233,251,246,198,132,220,222,103,160,165,153,197, 72, 45,171, 49, 40,138, 21,235,138,210, 98,246,
+127,200, 52,219,218,214,145,107,196,210,165, 32,180, 19, 40, 24, 74,200,121, 94,161,110, 98, 94,222,131,252,138,246,171,209,125,
+177,239, 23,253, 62,153,181,233,247, 99, 11, 95, 30,154, 17,245,230,239, 86,157, 86,155,142, 29,210,126,218,154, 61,135,150,100,
+ 29,158, 90,196,229,254,170, 83,163,217,167, 22,122,190, 3, 47,229,226,178,236,170,236,231,226, 19, 26, 33, 16, 8,108,181, 90,
+109, 70,114,204,205, 0, 99,246,113,245,109,114,143,199, 99,156, 12,122, 54, 41, 49,250, 58, 55,113,186, 17, 72,237,106,133, 66,
+175,255,150, 2, 4,132,255,147, 42,251,249,123,141,116,232,228,228, 36, 53, 55, 55,111, 97,102,102,230, 42,147,201, 36,185,185,
+185,202,220,220,220,151, 9, 9, 9,231, 41,165,250,191,227, 28,109,253,123,204,224,139,152, 57,165,255,158,151, 25,113,112,113,
+197,219,119, 95, 72, 24, 50,163,244,223,139, 51, 35, 14,205,250, 39,220, 43,251,186,189, 66, 64,217,137, 12,195,107, 98,160,250,
+ 69, 25,143, 14,173,173,202,254,161,161,161, 61,116, 58,157,184,236,255, 2,129, 64,125,227,198,141,131,220, 83,240, 55, 25, 44,
+151, 58,125, 45,117,124, 58,151,207, 99,122,179,148,154,166,222,223, 39,255, 39,159,160, 91,200,144,187, 12,195,184,148, 95,199,
+178,108, 82,194,173,237, 31,164,176, 37,132,184,252, 52, 33,112, 90,122,182,178,128, 16,178,224, 93,230,195,190,193,192,235,132,
+ 33, 53, 9, 33, 96, 24, 2, 94,201, 0,170, 41, 47,111,237,104,248, 22, 77, 71, 51, 57,223,187,160, 88,255,152, 82, 90,233, 75,
+ 72,106, 93,219, 73,102,237,124, 41,172,199, 88,143,187,167,183,248,153,216,251,182, 41, 74,143,138,252, 0,231,102,235,233,233,
+ 25,236,237,237,109, 61,118,236, 88, 33, 0, 44, 95,190,220,203,203,203, 43, 59, 54, 54,246, 14,165, 52,179, 90,230,202,206,119,
+240,202,101,243,183,119,234,212, 25, 41, 89,197, 88,250,243,154, 48, 19, 7,239,190, 31,202,100, 17,167, 64,169,133, 92, 30,241,
+245,196,217,206,157, 91, 5,243,115,139,181, 56,126,254,246,160,253,155,126,104,109, 97, 81, 63,160, 34,147,197, 42,242,103,217,
+155,208,142,172, 34, 31, 0, 6,190,249,187,179,137,174,173,173,212,208,209, 81,204,191, 15,224,207, 74, 95, 46,193, 67, 79, 9,
+132, 66, 55, 66, 24, 48, 4,224,241, 8, 24, 66,192, 16, 64,175,211, 36, 60,187,178,185,195, 63,162,160, 14, 28,156, 70, 8,177,
+102,152,146,244, 17, 2, 48, 12, 3,126,201,200,191, 5,207,175,111,177,254, 0,249,201, 60,192,203,194,255,147,166,205, 54, 95,
+122,145, 35,175,209,114,226, 49, 66,153,181, 9,151,127,122, 96,204,254, 18,137,196,242,200,145, 35,182, 29, 59,118, 52,183, 15,
+232,113,201,152,125, 76, 68,146, 58, 71,143, 30, 22,118,236,216,161, 10,249,211,167, 29, 24,102, 7, 1, 4, 44, 75,151,243, 88,
+250,123, 81,118, 76,108, 85,135, 83,177, 11,232, 49, 31, 4,126, 70,239, 64,241, 36,227,241,193,217,213,188,182, 60,169,157,207,
+103, 82,137,100, 74,109, 31, 63,239,184, 23,177, 49, 5, 5,249, 63, 43, 51, 98, 54, 81, 74,217, 42,137,233,244,223,156,189, 18,
+222,137, 47, 16,144,142,109, 66,120, 0,222,203, 96,217,219,219,247, 88,189,122,117,173,208,208, 80, 0,128, 94,175, 55,219,183,
+111,159,195,130, 5, 11,228,198, 60, 67,111,195,217,217,217,217,220,220,188,134, 84, 42,117, 6, 0,165, 82,153,156,159,159,255,
+ 50, 57, 57, 57,185,178,125, 29, 26,244,181, 97, 24,204, 63,249,231,175,124, 0,232,208,107,228, 66,143,176,111, 44, 9, 79,160,
+124,219,246, 6,189, 70,206, 16, 50,241,220,145, 45, 4, 0,218,116, 27, 54,221,182, 78,223, 95, 50, 35,247,165,255, 45, 31,244,
+125,251,242,108,158,106,123, 16, 74, 38, 5, 6, 5, 55,238,221,189, 19,252, 60,157,208, 99,192,232, 41, 0,170,100,176,116, 58,
+157,120,255,254,253, 46, 12,195,240,244,122,189,170, 95,191,126, 25,239,147,182,218,205,134, 94, 7, 33,174, 90,189,254,183,132,
+155,158, 11, 41,157,195,190,153,118,199, 56,254, 76, 16,102, 4,101,217,196,212,123,187,155,112, 6,171, 20, 27,239,110, 38, 60,
+177,240,113,171,230,141,173,167,143,238, 41, 90,255,251, 21, 56, 53,232,151,156,114,255,119,231,127,234, 9, 50, 12,227,114,112,
+215,106, 59,153,136, 7, 0, 40, 82,233,209,107,112,229,163, 65, 56, 7, 15,186, 8, 2,159,178, 58, 84,131, 65, 47,225,243, 5,
+ 42, 2, 0,164,164,119,128, 84, 42,186,185,105,102,104,254,176,174, 53,135, 76,251,229,222, 86, 0, 22, 0,210,222,250, 80, 48,
+140,203,158,205,203,237,156,173, 37,224,243, 8,138,148,122,244, 28, 50,201,240, 54,195,182,105,102,232,252,193,157,220,251,219,
+117,252,163, 23,128, 19, 21,190, 64, 28,234,248,154,218, 56,157,233, 61,114,190,147, 2,102,248,110,225,114,187,107,167,247, 93,
+105,219, 99,184,246,101, 82,146, 66,175,213, 69,103,231,164, 78, 46, 76,137,121,106,108, 65,109, 98, 98, 82,203,196,196,164,126,
+167, 78,157, 36, 83,166, 76, 17,132,133,133,189,250,253,203, 47,191, 20, 94,188,120,209,113,217,178,101,157,157,156,156, 84, 69,
+ 69, 69, 15,138,138,138,158, 83, 74, 13,198,222, 19, 7, 7,219,175,123,247,236,138,214,189,190,130,129, 37,248,114,204, 68,156,
+ 58,241,231, 40, 0, 31,196, 96,153,240,152,121, 35,198,126,235,220, 34,180, 33,127,241,190,167,176,144, 9,209, 62,164, 33, 95,
+ 34,248,198, 97,247,111,203,126, 6,240,249,219, 34, 87,172, 34,127, 86,128,141,102, 64,183,208,154, 56,188, 91, 51,192,165,237,
+ 52, 48, 50,243, 87,145, 44,207, 78,227, 76, 45,165,210,213, 78, 22, 60, 59,177, 33,115,181,103,167,113,103, 99, 79,172, 42,172,
+ 40, 45, 2,161,208,109,211,234,239,107, 91,154, 10,193,103, 8,120, 60, 2, 62,143,129, 74, 99,192,144,209, 51, 62, 84,132,145,
+ 39,181,171,221,153, 1,134, 1, 0, 11,108, 81,102, 60, 61, 94,149,123, 66, 24,158,245,190,205,203,248,118,230, 98,240,120, 4,
+ 60, 6,224, 49, 4,241,233, 74,140,157, 50,215,252,125,141,122,167,166,118,193, 23,127,105,217,161,113,128, 85,189,189, 55,136,
+121,227, 78,253,173,179, 84,178,207,246, 28,186, 48,160, 70,139, 73,183, 40,101,127, 76,188,178,226,116, 69, 58,106,181, 58,189,
+ 67,199, 78,102,132, 47,151,157, 61,184,181, 5,159, 33,208, 25, 40,244,134,146, 65,144, 89, 74, 81,242,221, 82,242, 17, 67, 89,
+138, 17, 35,190, 64,135,142,157, 20,172,158, 77,170, 66,161,177,227,228,217,107,182,106, 29,139,101,171, 55,205, 47,206,207,156,
+255, 34,202, 58, 94,102,239, 61, 81,145, 30,115,216,248, 19,135, 95,204,245,125, 61,119, 29,189,137,128, 58,126, 37, 3, 53,179,
+ 20, 62, 46,114,236, 58,118, 19,190, 62,190, 37,233,102, 41,188, 93, 77,208,242,147, 33,213,188,190, 97,124,185,189,239,238,110,
+125,134,246,233,213,103, 32,172, 44,205,160,209,170,189,207,157, 58,254,235,186,213, 75,155, 18, 66, 62,171,146, 57,164,134, 87,
+239, 5,202,178,239, 93,203,225,228,228,100, 27, 28, 28,252,234,255,122,189, 30, 30, 30, 30, 72, 78, 78,246,169,134, 89,147, 57,
+ 57, 57,125,178,116,233, 82,187, 86,173, 90, 9,108,109,109, 1, 0,153,153,153,206,151, 46, 93,106,216,176, 97,195,140,148,148,
+148, 99,233,233,233,138,119,154, 10, 86, 37,228, 81, 62, 79, 44,150,150,250, 90, 48, 83,198,126, 90,207,214,214,246,173, 31,199,
+217,217, 57,162, 57,115,102, 19, 62, 95, 80,178, 61,165, 12,101, 13,239,156, 99,164, 73,147, 38,221,180, 90,173,228,109,191,101,
+233,109, 59,171, 88, 81,255,146,183, 8,192,231,241,114, 83,238,239,183, 53,218,180,215,235,222,222,145, 17,172,235,218,189,187,
+123,143,206, 97,112,180, 53,199,249,155, 49, 24, 63,243, 39,232,244,134, 21,213,185, 63, 60, 30,143,159,145,145, 17,111,105,105,
+233,240, 1,222,183, 53, 15,237, 90,101,119,225,202,221,233,191,136,247,140,174,213,108,152,174,164, 61, 82,201,204, 44, 62, 18,
+ 51, 65,203, 30,109,205,172,156,125, 37, 27, 87, 47, 22,112, 17,172,242, 55, 66,196, 91,208,172, 73,176,245,244, 9, 95,136, 22,
+108,186,132, 27,167,142, 41, 83,238,239,251, 32,230,202,212,206, 39,148,240,248, 35, 9,143, 39, 39, 12, 17,177, 6, 54, 81,175,
+209, 44, 84,100,197,164,190,175, 54,203, 82,252,113,189,138,198,156, 82,175, 95,127, 89,102,103,111, 33,134, 74,107,192,176,175,
+191,195,134, 21,243, 77,109,205, 69, 80,107, 13,216,122,248,110, 86, 93,197,114, 58,172, 99,205, 33,223,111,138,248,243,199, 29,
+ 81,127,150, 60,171,239,204,120,176, 51, 23,227,251, 61, 49, 48,147, 10, 96,105, 42, 4,195,188,221, 92, 13,235, 90,162,153, 87,
+168,209, 19, 66, 68,148, 82,205, 91,141,132, 99, 64,115, 51, 91,151,253, 61, 71,204,183,141, 73, 39,160,208, 34,214, 76,130,222,
+131, 71, 91,212,114,144, 66, 46,225, 33, 62, 49,213,227,155,169, 83,131, 36,142,190,193,170,212,168,151,149,157,182,187,187,123,
+175, 46, 93,186,200, 38, 79,158, 44,112,117,117,197,142,125,167,220,218,245, 25,215, 53, 57, 45,219,149,165,128,189,157, 85,226,
+ 23,253, 59, 31, 57,126,252,120, 66, 98, 98,162, 96,233,210,165, 33, 7, 14, 28,168, 83,149, 47, 81, 3,165, 80,169, 13, 48,148,
+190, 24, 51,243,213,213,120,169, 16,230,221, 95,230,180,123,135,176, 96,254,242,131,207, 81,168,208, 67, 38,226, 35, 54,181, 24,
+161, 33,193,252,189, 27, 73,171,183,237,241, 69,191, 79,102,217,155,208,142,221, 66,107,194,206, 82,134,205,191,124,143,195, 55,
+ 94,116, 76, 47, 34,176,233,182,116,164,163,152,223,206, 86, 38, 92, 29, 22,228,233,208, 58,208, 13,119,130, 60, 29, 46,135, 71,
+199,212,237,247,243,216,228, 34,193,217,156, 19, 99,223,106,180, 24,194,192,202, 84,136, 77,167, 18, 32,147,240, 33,151,240, 33,
+ 23,151,252,101, 24,242, 94,249, 90,234, 84,199,149,199, 26,190, 48,115,170,243,197,128,126,125,157, 62, 29,208,151,130,199, 96,
+223, 31, 71,186,239,220,185, 35,213,196,193,103,163,129,225,109, 82,166, 68, 38, 86,126, 61, 1, 59,115, 17,190,217,248, 24,102,
+ 82, 1, 76,101, 2,152,201, 4,104, 93,207,182,218,233, 36,132, 88,142,234, 94,171,243,195,237,109, 91,249,212, 48,169,253, 32,
+ 54, 63,242,139,133,119, 87, 92,204,107, 53,225,151,229,117,172,139,242, 52,252,217, 83, 70,240,147, 82, 82, 90,237, 59,114,169,
+181, 83,163, 47,162,245,218,226,111, 51, 30,252,126,232,109,122,137, 81,215, 27,186,132,246,149,104,139,116,143, 30, 68, 39,121,
+230,170,197,136,136, 47,128, 92,194,135, 73,217,181,149,240, 33,151, 8, 96, 34,225, 35, 37, 41, 14, 57,197,188,171,201,214, 76,
+ 43,122,241,122,149,170,162, 84, 90, 3,238,191, 40,130,187, 79, 3, 56, 58, 58, 65,211,121,144,251,173,243,127, 28,146, 59,250,
+ 45, 46, 78,125,242,173,177, 58,187,142,222,196,130,197,203,159,130,224, 73,233,219,220,111,242,164,177,181,127,250,121,245,107,
+235, 70,127, 53,166,118,117,205,181,204,222,103,103,203, 79, 6,247,169,219,184, 61,158,199,197,225,196,145,187,104,211,174, 19,
+ 58,119,237, 5,141, 70, 61,100,211,134, 85,119, 0,172,249, 75,153,235,232,215,172,110,128,223, 78,103, 39, 39, 87,150, 45,153,
+ 3,150, 82,160, 89,203,214,152, 58, 97, 4, 88, 74, 81,191, 97,163,214,157, 7,140,165,148,150, 24,193,172,236,172,226,232,168,
+200,182,202,244,168, 91, 70, 95, 75,149, 74,151,153,153,137,251,247,239, 35, 38, 38, 6, 17, 17, 17,200,206,206,134,185,185,121,
+149,170,216, 45, 45, 45,205,130,130,130, 62,253,253,247,223, 37,230,230,255,241,252, 26,141, 6, 50,153, 12,221,186,117, 19, 52,
+107,214,204,121,232,208,161, 67, 45, 45, 45,119,229,230,230, 22,188,213, 48, 61, 60,154,226, 80,183,199,250,206,125,190, 28, 13,
+ 0, 66,177,201,139,149,191,253, 25, 81,209,177,133, 18, 51,183,182, 61, 62,247, 4,165, 32,132,172,204,138,250, 51,237, 93,219,
+106,181, 90,233,222,189,123,157, 9, 33,175,189, 95,231,173,220,211,244,241,179,180, 54,235,230, 78,227,155,153, 72,144,153,167,
+198,200,209, 99,109,140, 54, 87,117,187,143, 9,110,216,112,205,119, 83, 70, 64, 46,147,226,244,173,231,152, 56, 99,137, 62, 39,
+ 43,125, 59, 8, 89,158, 25,113,224,125,107, 45, 62,200,128,215,181,157, 77, 96,218, 33, 84, 50,162, 95,152, 68,163, 51, 32,175,
+ 88, 7,181,214, 0, 3, 75,145, 95,172, 67,228,203, 66,216,152,137,176, 17, 31, 63, 85, 50, 88,124,129,168,203,184,207, 58,139,
+150,237,186,133, 27,167,118, 41, 83,238,237,147,149,253,230, 26, 52,224, 69,226,221, 61, 53, 95,247, 40,149,119,181,148, 58,213,
+113,229, 19,222,207, 45,195, 90,180, 31, 61,102, 12,124,106,185, 8, 13, 6, 3,125, 28,243, 66,183,117,211,230,207,204, 93,235,
+174, 40, 72,122, 60,171,236,101, 90,213,238,155, 44,203, 38,189, 25,177, 98,217,215,191,102,223,166, 73, 8, 96, 97, 34,194,250,
+ 19,113,160, 20, 32,160, 48,151, 11,176,231, 98, 18,242,179, 83,178,234, 41,150, 95,251,162,163, 77,183,133,155, 34, 15,173, 61,
+146, 30, 14, 32,130, 82,154,254, 46, 77, 66, 8,248, 60, 2, 51,153, 0,230, 50, 33, 44,228, 66, 48,132,188,211, 92,125,247,235,
+195,173, 0,162,203,155,171,242,154,114,123, 31,127, 51, 27,183,131,189, 70, 45,182,124,248, 82, 11, 62,143,160,166,131, 20, 86,
+166, 66,104,244, 4,241,153,218,210,125,204,240,213,228,121,182,211, 38,141, 62, 78, 72, 88, 61, 74, 47,234, 43, 58,119,133, 66,
+ 33, 26, 60,120,176, 64,167,211,105,135,141, 95,216, 62, 45, 35,187,251,138, 69, 83,197,182, 54,214, 40, 86,233,112,239, 73,130,
+223,146,101,191,212, 60,118,238,230,193,111,191,234,121,168, 99,199,142,230,123,247,238,101,171,114,223, 51,211,179,126,217,188,
+115,255,246,229,203, 22, 33, 58, 33, 23,155, 54,172, 1, 53,232,215, 87,236,119, 95,215, 92,189,122,181,125, 72, 72, 8,115,251,
+246,237,172, 55, 13, 40, 33,144,103, 23,168, 97, 33, 23, 66, 38,230,195,222, 82, 2,107, 19, 17, 68, 2, 6, 12,243,159, 66,164,
+188,230,166,223,143, 45,100, 21,249, 56,188, 91, 51, 96,243, 47,223,227,243,175,103,226,113,150,232, 36, 35, 51, 95,248,213,128,
+ 94,211,109,165,134,142, 78, 22,140, 93,235, 64,119,200, 37, 66,204, 24, 55, 24,141,194,227,237,146,243,216,153,153, 74, 94, 3,
+ 0, 51,223,150, 78,166, 52, 98,101, 42, 19,224,226,209,221, 25,197,133,121,249,132, 87, 82, 69,168,211,104, 19,140,243,250,127,
+189,158,114,123,159,233,129, 13,234,125, 63,250,203, 47,152,166,161,141, 40,195, 8,144, 85,168, 33,148, 2, 19,198,142,194, 87,
+163, 70, 56, 36,166,100,204, 94,179,102,253, 44, 19, 59,191, 5, 69, 25, 79,230, 86,164,201, 35, 12, 24,134,192, 68,194,135,137,
+180,196,176,152, 72,248, 80,105, 12, 32, 4, 60,151,192, 1,249, 32, 0, 33, 36, 37,241,206,110, 63, 99,210,233, 84,183,211,185,
+ 75, 25, 66, 95,197,113,213,141,103, 79,239, 45,188,253,240,229,109, 74,105, 78,141,150,147,134,106,245, 20, 69, 42, 61,226,210,
+ 21,208,107, 41,249,188,147, 27, 60,250, 16,159, 69,155,239,109, 39,132,152,149, 69, 92,222,212, 76,186,177, 79,101, 83,183, 87,
+255,229,171, 54,220, 89,246,253, 76, 94, 86,190, 6, 44,165,144,136,120,144,138,248,165, 11, 15,202,226,124,172, 89,247, 91,154,
+ 30,164, 23,189, 88,113,158,255,107,161, 65, 7,245,236,220, 98, 15, 1, 68,132, 17, 38, 57,185,185,187,181,233,250,153,164, 77,
+183,193, 48,232, 53,211,229,246,190, 23,138,211,163,206, 25,163, 25, 80,199, 15, 32,120,146,241,232, 96,175,146,151,100,143, 63,
+125,125,124,107,191,185,206,203,203,167,182, 49,247,189,236,227, 66,106, 91,251, 75, 47,223,186, 83, 71,127,183,193, 61, 46, 85,
+ 1, 43,215,218,136,120,116, 31, 39,246,254,114, 79, 89,152,187,236,196,225, 63,167, 46,248, 97,101,253,174, 61,250,225,208,129,
+189,147, 9, 33,107,105, 9,103,203, 69,167, 6,109,221,248,171,171, 64, 36,134, 78,207, 66,103,160, 37,127,245, 6,228,228,228,
+ 66,167,103, 33,145,153, 66,207, 18,232, 12, 44,116,122, 22,106,141, 94, 62,106,240, 39, 99, 0,220,122, 91, 58, 61, 66, 6,223,
+ 5, 67, 92, 74,214,151,172, 19, 49,230, 10, 71, 71,199,237, 0, 32, 22,139, 33, 22,139,193,178, 44, 30,165,144, 9, 78,193,131,
+102,128,150,190,217, 89, 54, 41,245,222,238,160,119,157,187,171,171,107,215, 55,205,149, 74,165, 66, 81, 81, 17,174,221,121,104,
+190,109,223,217,142,241,137,105,181, 88,131,157, 90,234, 80,191, 3,128,174,239,186,158,105,143, 14,142,169, 17, 54,129,153, 60,
+122,176,215,202,223,246,223,126,122,114, 65,133,225,228,154,109,167,107,166,142, 25, 24,244,195,202,205, 79,147, 46,173,152, 88,
+217, 61, 18, 10,133,130,204,204,204, 87,207,247,252,213,127,116,122,153, 94,208,102,217,247,179,132,247, 94, 20,225, 81, 92, 26,
+134,182,173, 97,244,243,238,232,223,211,199,205,195,117,197,138, 5,227, 17,147,162,196,234, 63,110,227,210,177,237,225, 90, 85,
+225, 39, 25, 17,135, 51,170, 83,134,188,175,193,170, 72,243,194,195, 44, 20,169,244, 80,107,244,208,177, 20, 5, 10, 29, 50,242,
+ 52, 40, 80,104, 81,164,212, 99,104,187, 26,248, 55, 80, 37,131,101,208,235, 92,156,156, 28,193,210,164,178, 8,103, 73,212, 35,
+100,128, 98,226,151,125,165, 78, 13,250, 20,167,220,223,111,116,155, 44, 83, 59,239, 38, 82,169,236,216, 79, 63,253,132, 1, 93,
+155, 75, 95,102,233,138, 30,190, 84,166, 23,107,160,183,179,245, 22, 45, 92,180,196,100,201,210, 31,191, 58,122,152,205, 3,240,
+227, 91,195,207,193, 3,239,242, 72,185, 54, 86,132,128,178,108, 82,210,157, 93, 65, 0,240, 62,109,173,138, 84, 58,240,152,146,
+182, 51,132, 0, 10,149, 30,197,185,105,217,229,205,213,173,100,135,231, 60, 94,166,150, 82, 90, 97, 21, 4, 67,128, 2,133, 14,
+230, 50, 1, 44, 76, 4, 48,151,255, 39,130,245, 14,115, 21, 81,145,166, 80,171, 77, 52,232, 53, 42,106, 48,160, 75,176, 45,236,
+ 44, 68,112,180, 20, 67, 44,226, 67,167, 7,148, 26, 22, 42,141, 1,241, 25, 74, 20, 42, 69,168, 23,214,223, 43,197,241,166,194,
+198, 61,120,107, 86,252,157,145, 21,222,103,131, 1, 59,247,159,242, 74, 73,203,236,126,104,251,207,226,140, 2, 45, 30,196, 23,
+ 33, 35, 79, 13, 16,115, 76,159, 57, 75, 60,123,246,156, 30, 59,255, 56,157,208, 50,196, 47,161,170,215,181, 56, 35,106, 71,189,
+166,159,252,210,165, 75, 15,211,136, 91,199,241,244,254,185,239,138,210,171,214,254,202,203,203, 75,255,203, 47,191,216,110,216,
+176,193,203,206,206,238,101, 70, 70,198,139,178,234, 40,143, 58,161, 41,103,207, 93,177,110,209,180, 57, 63, 41, 75, 5,107, 83,
+ 33,220,237,229, 8,191,113, 65,195, 16,114,242,109,122,165,213,128, 3, 93,218, 78,195,225, 27, 47, 58, 70,100, 75, 46,142,248,
+ 98,104,194,233,203,209,217,171,183,159,254,193,217, 68,119, 95,194,102,174,190, 27,228,233, 48,125,236, 96, 44, 94,181, 3,151,
+194,163, 51,138, 25,199,239, 83,213,250, 51,115,251, 79,125,123,212,151, 1,248, 60, 2, 83,169, 0,197,197,121,249,143,207,174,
+245,254, 64,207,238,208,211, 7,119, 48, 57,133, 58, 36,102,169, 72, 74, 78, 33, 12, 44,133,133, 76, 8, 61, 75,145,151,147, 69,
+118,238,216,142, 59,119,110, 48,224, 49,195, 1,204,173, 36, 18, 2, 30, 67, 96, 34, 17,148, 68,128,164, 37,127,117, 6, 22,181,
+107,186, 98,229,252,113,102, 54,118,246,104,223,107,164,241, 17, 54,185,101,253,109,235, 22,226,226,141,251, 97, 23,158,237, 14,
+182, 11,168,191,202,165, 78,223,101,140,149,179, 74,173, 53, 32, 63, 47, 23, 34, 77, 34, 26, 57,103,194, 74,102, 64,124,129, 35,
+ 30,167, 61, 53,169,172, 58, 43,235,209,159,247,109, 3,122,206,218,127,228,252,226, 14,237,194,240, 56,190, 0, 82, 17, 31, 18,
+ 17, 15, 18, 17, 15, 2, 98,192,207,235,214,235,114,243, 11,187,100, 61, 62,152, 85,141,252,121, 22,192,171, 54,103, 38,246,181,
+108,119,172,154,181,109,196,212,165, 29, 58,246,252,140, 60,190,115,225, 91, 0,231,140, 42, 51, 89,106,212, 58,150, 53,238,221,
+ 70, 8, 97,236, 60,131,118,109,217,186,187,127,157,218,174, 72,207,211, 33, 37, 87,139, 43,247, 98,177,109,227,172,188,220,244,
+231,131,160, 45, 42, 98,137, 62,255,212,201, 35, 39,191, 30, 63, 21,254, 1,245,221, 11,146, 10,204, 0,228,191,118, 76, 30,217,
+ 48,228,139,145,253,237,237,237, 77,255, 19,193,162,240,246,169,131,206,221,122,227,212,161, 3,136,140,120, 8,150,150, 12,231,
+195,178, 20,121,185,217,105,122,157,102,235, 59,211,199,227,185,108, 89,191,204,142, 97, 8,180, 58, 22, 26, 61,139,233,211,103,
+105,198,207, 94,221,172, 67,211,122, 17, 60,176, 5, 47, 83,243, 44,194,163,211,234, 18,129,169,227,160, 81,211,132, 42,181, 1,
+249, 10, 29,206,238, 91,249,238,106,198, 90,245, 67, 61,252,154,125,241,229,204,245, 98, 49,143,209,250,123,187,190,104,217,216,
+ 63,177,134,147, 77,225,162,149, 59, 27, 93,191, 23,221,185, 87,175, 94,146,254,181,252,136,147,181,196,116,212,152,177,245, 28,
+106, 55, 27,146,246,244,234,246,119,190,252,248,226, 60, 87, 23,215, 87, 85,137,118, 1, 61, 30, 2,112,123, 99,179,132,140,199,
+ 7,235, 1,128,157,189,131,138, 8,196,133, 85, 48, 32, 20, 0,230,173,218,223, 57, 41,179,168, 79,153,185,186,255, 60, 31, 98,
+ 33, 3,173,206,248,166,113, 6, 66, 39, 76, 27,251,185, 32,167, 88,143,139, 15, 51, 17,113,247, 2,213,107, 11, 62,163,132, 63,
+204, 54,160,199, 16, 2,120, 80, 32,142, 33,248, 85,195, 96,107,222,131,131,249, 85,175,233, 41, 73,143, 93,157, 94, 77, 8, 15,
+157,121,124, 97, 48,192,250,234,117, 58, 59,134,199,203, 74,123,176,191,210, 30,148,229,207,168, 56, 61, 6, 75, 23,205,198,202,
+141, 7,144,146,173,130,185, 33, 17,135, 54, 45,196,228,197,187,160, 84, 27,240,111,192,104,131,101, 95,183,123, 35,128,225, 57,
+ 88,153,192,171,166, 43, 76,250, 14,147,186, 4,246, 47,230,241, 24,102,235,138,111, 37,217, 74, 62,248, 60, 94,177,209,133,175,
+189,111,136,169,169,233,241, 63,255, 56,128, 90, 53,236,132, 59,175,228,196,221,123,161,124, 21,210, 45,200, 76, 16,121,152, 41,
+248,189,122,246,148,157, 59,127, 97,194,187, 12, 22,143, 48, 46, 43,127,254,193,206, 84, 42, 0, 33, 64,161, 82,143,241,147,166,
+189,247,133,161,160,188,175, 39,205, 1, 41, 53, 87,133,249, 57,248,126,229,214,162, 94,206,231,175,150,153,171,211, 79,164,207,
+122,246,108,157, 31, 31, 31,159, 91,105,193, 72, 13, 73,125,134,142, 23, 50, 76, 73,181, 17, 67, 8, 40, 12,233,213, 49, 87, 0,
+144,155,251,162, 64,234, 80,175,231,142,229, 99, 55,214,112,118,182, 52,149, 73,136,137, 92, 76,252,124, 60, 37,141, 27,135, 74,
+106,120,250,139, 46, 71, 22,225,101,166, 18, 47, 82,242, 33,178,241, 23,244,111,217, 22, 59, 86, 78,235,108,204,249,159,191,241,
+184,235,218,101,179,196,105,121, 26, 68,189, 44, 66, 90,174, 10,169,185,106,164,229,168, 96, 34, 21, 32,180,109, 47,241,137, 51,
+251,186,182, 12,241, 91, 85,157,235,251, 60,246,197,129,248,228,212,207,234, 53,108,132,157,219,182, 52, 38, 46, 46, 18,154,148,
+164, 50,118,255,141, 27, 55,230, 4, 7, 7,219, 46, 89,178,164,216,199,199,167,129,143,143, 79,205,152,152,152,139, 94, 94, 94,
+221,214,174, 92,112,105,252,204,101,110, 60,162, 51,111,210,180, 25, 79, 34, 36,184,113,249,148,122,235,198,245, 41,218,188,162,
+169, 21, 26, 97,153,249,194,244, 34, 2, 91,103,231, 8, 19,145,161, 29,159,201,139,201, 57, 49,118, 59,128, 63, 61, 59,141, 59,
+123,225,110,116, 76, 80,120,188,221,249,240,103, 25, 57, 10,173,119,236,137, 73, 21, 22,184, 60, 66, 32,224, 49, 48,149,242, 95,
+ 69, 44,237,235,247,125, 70, 9,177, 45,139,148, 18,148, 68,180, 72,201,103, 75, 74, 82,248, 94, 35, 26, 70, 19,202, 82, 32, 58,
+169, 24, 69,170,146, 16,188,139,141, 12,153,233, 73, 88,187,106, 43,238,221,189,131,246,157,186, 97,205,111, 59, 49, 98, 72,223,
+ 74,175, 43,195,160, 36,130, 85, 46,122,101, 34,229, 3, 32,200, 43,214,225,143,171,137,240,172,201,128, 84,161,182,208,212, 68,
+138,252, 66, 37, 24,129, 9,162,174,108,151,157,184,112,123,198,220, 31, 55,125, 83, 80,148,246, 50, 54,242, 6,124, 44,179, 81,
+211, 89,139,136, 52, 51,220,205,246,128,143, 87, 45, 48,194, 59, 70,105,103, 69,212, 93,122,136,249,163, 75, 80,131, 58,161,110,
+118, 22, 80,106, 12,165, 81, 44, 30,182,108,222,142,248,184,164, 47,178, 34, 14,222,251, 16,133,100, 81,250,243, 76,137,125,237,
+175, 30,221, 58,247,162,231,167, 95,193,209,185, 70,253,170, 52, 79, 48,102,157,193, 8,131, 69, 8, 97,172,220, 27,108,219,182,
+ 99, 95,255,154, 53, 28,112,230, 86, 28,110,199,100,195,198,198, 26, 60,153, 3,106,183, 28,102,241,232,228,202,222,202,172,162,
+109, 2,161,108,120, 72,227,166,160,148, 34,250, 73, 68, 78,126,190,249, 95,202,102, 69, 74,212,125, 0,102,229,215,201,108,253,
+234,155,152, 91,221, 87,107, 13, 72, 78, 78,194,181,235, 23, 27,150,110,103, 52, 98, 33, 15,167,239,101, 64,171, 99,161,213,179,
+ 8, 9,244,215, 8, 68,210,230, 63,108, 60,214, 56, 61, 61,147,145,154,152,177,230,118,181,132, 86,186, 52,245,131,231,249, 66,
+173,142, 69, 45,167,138,191,203,101, 86,181, 22, 77,154, 60,222,143, 39,148,162,176, 88,173, 73, 77, 73,118,248,117,247,133,162,
+ 39,209,145,206, 30,238, 53,204, 22, 46,152, 43,204, 87, 2, 25,249,106,228, 20,106, 73,191, 79,191,112,218,190,105,205, 32, 0,
+219,171,144,244,186,123,183,175,215, 89,154, 8, 73,161, 82, 71, 51,243,213,134, 49, 95,141,175,251, 62,121,167,204, 92,253,248,
+253, 76,225,189, 23, 69,120,240, 60, 31, 18, 33, 15, 34, 33, 3,141,145, 6,203,182, 78, 95,185,173,173,197,160,144,250,181,113,
+234, 94, 38,120, 60, 6,138,226,124,141, 68,108,242,216,215,183, 54,211,160,126, 0,194,154, 53, 65,236,139,120,159, 83,103,206,
+ 47,191,125,231,222,247,182, 1, 61,167,102, 62, 62,176,166, 42,105, 77, 76,205,150,165,235, 93,199,219, 57,216, 4,116,235,222,
+ 85, 92,195,217,158,216, 90, 89,192, 64,132, 24, 53,250,107, 59,163,243, 60, 45,137, 94, 46, 89, 48, 3,106,181, 6,182, 22, 34,
+ 80, 10,108, 94, 53, 23, 26,141, 6, 78,214, 98,228, 23,235, 56,131,245,234, 6,215,235,217, 84, 42,150,159, 94,179,120, 2,147,
+ 87,172,131, 68,200, 67,173, 90, 53, 49,118,252, 4, 89,155,250,182, 80, 18, 51,252,177,123,107,129,222,160, 59,106,140,158,204,
+161,118,144,169,220,236,212,182, 29,123, 89, 27,107,107,102,237,233,204,231,217,133,250, 87, 67, 28,196,220, 58,204,222, 61,245,
+171, 35, 5, 57, 41,145, 72,188, 52, 26,141,101,101, 55,116,243,233,132,210,198,185,228,131, 92, 24,134, 97, 12,191,174, 90, 0,
+ 27, 51, 17,212, 58, 22,243,151,111, 47,236, 98,123,242,124,121,115, 21, 24, 24,152, 95,191,126,253, 60,134,169,124, 56,177,151,
+183,119, 54,121, 75,129, 89, 45,115, 85,134, 50,237,225, 29, 0, 1,175,107, 6, 10,108, 60,246, 77, 30, 48,104,200, 12, 7,255,
+ 79, 76,227, 82,243, 33, 36, 90, 4,251, 57,226,226,169, 63,217,196, 23, 79, 70, 25,163,157,145,157,239,106, 99, 99,141,123,207,
+ 11,145,156,173, 68, 90,169,185, 74,205, 85,163, 80, 89,136,250,238,182,200,203, 47,114,173,182,129, 37,244,224,169, 83,167, 62,
+235,220,189, 63,198,126, 51,175,211,198,181,203, 30, 74,237,253,134, 40,211,159,220, 54,102,255,125,251,246, 25,220,221,221,159,
+103,102,102, 54,154, 50,101, 74, 65,173, 90,181, 28, 22, 44, 88,240,101,173, 90,181,156, 90,183,106,149,127,251, 66,227,109,227,
+191,153,219,106,250,184,141, 53, 25,134, 73,167, 44, 61,156, 82,172,155, 67, 51, 35,149, 21,222,167, 67, 51,162, 72,157,121,159,
+181,107,110,123,216, 74,198,248,139,169,102, 0,169, 51,111, 47,141,156,163,141, 61,177,170,176,110,191,159,199,166,228,177, 51,
+ 85,140,221,247,149,153,171,146, 8, 22,129, 70,111,128,169, 84,240,159,188, 73,225,184,118,245,207, 50, 91,115, 17, 4, 60, 6,
+124, 30, 65,129, 66,135,172, 2, 45,190,153,250,141,177, 87,144,213, 27, 40,148, 26, 61, 20,165, 95,131,133, 5, 89,152,241,205,
+ 36,116,234,218, 19,195, 71, 77, 66,174, 18,184,251,162, 16, 90,157,174,210,135,130, 71, 8, 20,106, 61, 62,111,239,134,156, 34,
+ 45,138,149,122,104,244, 44,100, 34, 62,248,124, 6,114, 9, 31,102, 50, 1, 8,161, 66, 71, 71,199, 47, 1, 64, 32, 16,168, 94,
+190,124,185,163,130, 47,120,120,184,218, 67,169, 99,208,168,255, 50,180, 13,245,198,131,179,155,248,151,110, 62,170,249,205,220,
+229, 24, 51, 48, 20,251,163, 60, 97,101,231, 6, 19,185, 20, 58,202, 0, 48,110, 8, 16, 74,231,176,142,190,189, 6,174,255,109,
+115,244,252,217,211, 37,121,197, 4, 98, 33, 15,231,207,157,197,141, 91,119, 87,102, 70, 28,220,241, 33, 11, 74, 1,101,236,205,
+204,204, 32, 17,241,160,209,170, 53, 70, 71, 30, 88, 10, 80,248,217,213,237,241,103,233,189,247, 51,176,120,203, 58, 90,153,185,
+ 34,230, 78, 1, 91,214,111,220, 57,200,201,193, 14, 7,206, 61,196,150,223, 86,163,102,131, 46,184,122,108, 11,204, 61, 26, 67,
+ 94,163, 25, 68,166,251,190,100,120,252,186, 95, 79,248,182, 87, 96,112, 40,174, 93, 57,143,140,180,212,245,148, 70, 25,213, 6,
+141, 39, 32,227, 90,183,235, 10,149,198,128,230,109,186,224,228,145, 3, 99, 81,218,121,194, 88,222, 52,225, 44, 11,253,215,195,
+ 7, 8, 50,242, 52,130,204, 2, 13,146, 50, 21,136, 75, 87,224,208,158, 77,212,216,183, 54,195,231, 5,183,168,231, 34,248,114,
+233,249, 68, 87, 23, 71,181, 64,173,148,198,196, 62,247, 29,254,217, 32, 65, 77, 47, 95, 38, 35, 95,141,204,124, 53,178,242,213,
+ 40, 82,233,225,229, 88,131, 81,235,249,161, 85,189,207,182, 22, 18,193,154, 35, 47, 96, 38, 23,160,137,175,117,181, 27, 97,179,
+ 44,251,154,185,186,255,162, 24, 15, 95,228, 67, 44,228, 65, 44,100, 32, 22,242,160, 55, 80, 35,223, 69,250, 1, 35,135,245,151,
+106,116, 20,217,249, 26,240,121, 4, 14, 54,214, 98, 87, 71,111,108, 94,246, 53, 0, 96,196,180,181, 24,254,249, 96,248,120,123,
+ 33, 63,191, 80, 58,124,244,248,159,241,150,118,119,239, 74,235,206, 67,151,235,220,125,156, 48,249,179, 97, 67, 5,253,186, 54,
+103,238, 63, 47, 64,106,142, 26,207, 99, 21,208,234,170, 54, 26,141,222,192,130,130, 98,235,222,163,144,138,248,200,204,215,130,
+ 82,138,133,171,127,135,169, 84,128,212,220,146,106,125,206, 96,149,153, 43,145,228,244,246,213,223, 74,207,199, 0, 43,207,220,
+197, 39, 33,142, 16,242, 25,136, 77, 28,240,224, 69, 46,206,158, 59, 84,120,245,198, 45, 21, 24, 93,165,221,162,100,142, 62, 13,
+229, 82,179,179,107,126,221,166,183,177,179,195,142, 43, 57, 73,185,197,122,221,127,170,167,116,228,238,169, 95,107,234, 89, 93,
+ 71,101,218,211, 74, 63,103, 89, 74,133,139,215, 29, 2, 64,193,178, 44, 40,203,130, 39, 20,203,221, 26, 15, 78, 47,209, 99, 37,
+124, 30,163, 42,255,228, 83,214,144,148,112,107, 87,133, 85,135, 4,128,185, 76,128,189,151,146,145,159,147,146,213,197,246,228,
+171,106,193,147, 17,226,103,129,129, 13,242,131,131,131,243,164, 82, 41,120, 60, 94,149, 47,252,251,154,171,119,191,120,194,117,
+ 0,150, 56,249,182,236,214, 73,230, 31, 34, 98,248, 8,244,113,196,197,211, 7,216, 27, 39, 54,245, 84,164,199, 28, 51, 50,188,
+141, 34,165, 14, 41,217, 42, 36,103,171,144,150,171, 66, 90,142, 26,105,185, 42, 16, 66,160,210,188,223,240, 53,138,244,152, 35,
+ 38,206,254,235,213, 90,140,106,209,190, 39, 38,207, 93,227,181, 99,253, 15, 87,228,118,181,131,139, 51,158, 62, 50, 70, 35, 62,
+ 62, 94,109,111,111, 31,158,151,151,215,126,249,242,229, 69,126,126,126, 34, 19, 19,147,108, 0,210,103, 49, 49,194,243,199,247,
+197,101,166,164,140,212,106,181,119,140, 77,151,123,216, 48,177,239,255,177,119,214,225, 81, 92,251, 27,127,103, 93,226,196, 29,
+136,144, 64,130, 4,151,160,193,221, 10, 20, 41,165, 69, 90, 42, 72, 91, 40, 45, 82, 10,133,150, 34, 53,104,161,197, 29,138, 21,
+119, 11, 30,136, 64, 8, 16,119,221,205,102,125,103,230,252,254,128,228,166,220,200,134,210,223,189,151,158,207,243,204,147, 77,
+ 50,243,206, 57,179,103,230,188,243, 61,102, 95, 60,217,207,166, 67,239, 0, 15, 37,252,108, 52,189, 67,109,239,126,227,214,227,
+195,165,249,103, 86,231,231, 24,217, 83, 5,122, 97,139,172, 50,177, 85,125, 1, 89,179, 41,237,245, 41,115, 33,100, 24,152,141,
+166,180,242,194,229,230, 32,197,194,109, 15, 96, 43, 23,195, 78, 33,130,173, 66,140, 78, 77,234,161, 14,175, 7,196,194,241,208,
+ 25, 57,232,141, 44, 12, 38, 22, 46,190, 78, 88,191,117, 15,210,243,245, 56,120,179, 16,137,105, 26, 4,251,216,128,144,218,227,
+ 78, 60, 97,181,175, 77,158,103, 39, 20, 8, 32,100, 32, 8, 13,170,143,226, 50, 19, 36, 34, 1,164, 82, 41,108,100, 34,216, 43,
+196, 16,139,196,184,113,239, 30,140, 70, 35,218,182,109, 43,175,217, 2, 62,141, 98, 5, 55,244,130,217,194,226,232,197, 4, 44,
+153, 49, 12, 61, 59,183,194, 71, 66, 41, 30, 24, 35, 96, 87,207, 14,188, 64, 0, 51,203,195,100,230, 0, 8,170,141,182,249,249,
+249,117,183,177,177,177,209,233,116,154,180,180,180,243, 57, 15,246,167,187,133, 13,153,124,252,228,217,173, 3,250,246,196,157,
+123,241,216,251,251,161, 75,133,206,234,217,229,199,132,135,135,183,115,113,113,177, 45, 42, 42, 42,141,141,141,189,241, 34,101,
+149, 97, 24,198,198, 61,244,195,246,157,186,162, 76,149,143,188,140,148, 35,214, 30,219,216,223, 14, 51,103,188, 23, 28,210, 40,
+ 36,152,123, 54,146,170,137,159, 29,166, 78,123, 39, 56, 48,184, 81,112,249, 64,143,198,126, 53,207,119,105,227, 30,242,206,146,
+149,107,199,251,249,250,226,216,149, 7,248,106,222,212, 59, 54, 74,187, 6, 62,238, 78,142,146,176, 86,136,137,185, 10, 55, 72,
+ 97,239, 30,236, 51,122,208, 20,159,222,125, 7, 33,246,238, 45,172,254,122,113,180, 86,168, 88,106, 77, 90,109,221, 3, 92, 91,
+180,238,252,186, 93, 61,119,168,212, 26,216, 57,185,161,113,179,214,175,219,186, 7,124,242,108,177,250, 23, 51, 27,132,192,104,
+ 38, 40, 41, 51, 35,163, 64,143,212,220,167, 6,139,231,235,208,231,135,128,177,149,139, 68,245, 44,143,252, 98, 79,159, 37,254,
+190,238,204,215,139, 63, 18,154,241,180,179,120,129,218,136,130, 82, 19, 10,212, 38,148, 25, 44,168,103, 35, 2, 79,248, 58,191,
+109,151,148,153, 97,247,172,159, 44,199,191,184, 9, 88,184,106, 71,135,204, 2, 93,143,111,190,156, 39,185,155, 82,201, 92,137,
+159, 70,175,100, 18, 33, 56,222,186, 8,150, 80, 36,120,175,127,143, 54,200, 40,212, 63, 29,133, 44, 96, 16, 20, 22, 1, 23, 5,
+143, 30,163,230, 0, 0, 6,246,123, 58, 13, 73,114,142, 22,135,175,229, 0,128,196,218,180, 22, 21,105,100,191,159,186,243,193,
+142,245,223, 72,141,188, 24, 63, 31, 75,131,206,200, 66, 46, 17, 66, 38, 17, 66, 33,169, 91,253,198,114, 79, 7, 75,164, 23, 90,
+160, 51, 24, 80,170,183,128, 0,184,241,168, 12,122, 19, 11,181,214,130,118,161, 78,212, 96,149,155,171,205,223,125,170, 56,243,
+144,224,220,221, 34,140,136,244, 65, 81,126, 38,214,255,180,134, 39, 4,144,201,165,185, 28,203, 31,211,243,236,199,170,187,135,
+213, 53, 62, 36, 92,155, 52, 83, 40,149,103,151,175,254,217,236,230,238,205,239,191,166,202, 87,235,184, 63,197, 10, 57,163, 81,
+ 64,120, 34,177,198, 92, 61,139, 52,153, 23,188, 55, 20, 60, 33, 88,184,122, 15,150,206, 30, 5, 91,133, 72,201, 48,140, 82,107,
+ 96, 49, 99,209, 6,124,251,249, 36, 59,165, 76, 4,134, 1, 12, 38, 14, 83,223,179, 46, 74,160, 51,114,208,170,114,139,154,150,
+173,124,206, 92,181, 84,183,109,219, 86,229,228,228,132, 23, 49, 88, 85,153, 43, 15, 15, 15, 47,165, 82, 89, 47, 56,248,105, 95,
+ 87,161, 80, 8,142,227,180, 73, 73, 73, 47, 52,233, 91,169,170,224, 64, 78, 74,108,219, 14, 93,251,227,194,201, 3,124,244,209,
+ 13, 67,235, 50,196,220,209,193, 62,227, 78, 66, 90, 99, 6,182, 79, 35, 88,207,204,149,201,194,195,223, 93,137,204,140,116, 56,
+ 58,216,102, 88,171,167,244, 8,238, 35, 32,194, 41, 60,131,245,186,220, 7, 71, 1,160, 44, 43,126,154,210,173, 81,108,124,252,
+221,213, 3,198,188, 39,237, 53, 98,154,100,221, 87,239,206, 1, 48,218, 90,221,188,188, 60,157,171,171,107,180,167,167,231,128,
+ 69,139, 22, 25, 1,200,140, 70,163, 96,226,196,137,202,180,180,180, 25,132, 16,171,210, 24,249,230, 94, 23, 70,166,233, 27, 24,
+220,122,140,191,157,166,103,183,200,246,104, 31,230,139,140,200,246, 0,240,126, 90,153,109, 72,167,105,191,238,106,232,234,115,
+116,221,198,195, 75,223, 30, 21, 53,195,107,224,162,149,217,135, 23,212, 24, 17, 75,188,248,107,239,170,236,187, 72, 40,128,157,
+ 66, 12, 91,133, 8,118, 10, 49,236,228, 98, 88, 88, 82,151, 38, 56, 98, 97,249,167, 17, 44, 19,139, 50, 61,139,179, 49,121,200,
+ 85,155,160,210,152,161, 55,115, 32, 32, 48, 91,248,242, 89, 69,106, 54,171, 87, 55, 57,150,127,246,105, 57, 90,189,230,139,247,
+236,247, 93,206,172, 24,161,231,160,148,194, 78, 41, 6, 64,112,241,226, 69, 56, 59,215, 62, 45, 22,207,243,216,123,252, 6, 86,
+110, 58,139,227,191,125, 12,185, 68,136,102,131, 23,225,141, 33,109,193,243, 4,143, 19,227,243,130,155, 52,119, 23, 8, 20, 16,
+ 48, 12,140, 22, 30, 0,169,246,122,154, 76, 38,231,244,244,244,210,160,160, 32, 15,111,111,239, 17, 66,161,144,200, 0,227,129,
+157,197,186, 51, 71,182, 43,181,122, 35,167,100,213,191, 5,229,232,251, 7, 7, 7,131, 97, 24,226,226,226, 34, 57,123,246,108,
+ 89,211,166, 77, 93, 95,228, 62, 98, 24, 70,160,112,107,180,230,173,105, 31,142, 8, 12, 8,192,158,237,191,129, 16,102,159,181,
+199,111, 59, 28,141,149,171,254, 60, 98,112,234,180,119,130,215,173,253,233, 79,127, 27, 63,105,114,112, 77, 6,207, 39,188,251,
+199,161,161, 77, 16, 29,159,137,175, 63,155,118,199,144,159, 60,198,100,235, 60,197, 92,150, 51,179, 69, 68, 43,120, 56,219, 35,
+187,216,136, 65, 99,135,160, 99,167, 72,196,222,189,133,197,159,127, 20, 13,157,169, 87,109, 81,219,127, 25, 33,241,212,110,189,
+135,136,245, 70, 51,190,251,122, 62,166,204, 94,130,118,221, 7,138,227, 98,174, 77, 5,240,133,181,121, 54,154, 57,116,107,234,
+242,212, 52, 91,120, 28, 74, 22,138,170, 42,129, 34, 33, 35,104, 17,224, 8,189,137, 69,169,206, 82, 75, 4,139,201, 85,105,180,
+245,127, 88,250,161, 80,107, 96, 81,160, 54, 33, 95,109, 68,161,234, 95,198,170, 80,109, 68,129,218, 4,177,136,193,195,148,108,
+ 8,133, 76,157,251,223,149,148, 89,208,166,145,211,211,123,244, 5, 91, 67, 10, 89,215,190,119, 31,102,247,248,122,241, 92,201,
+221, 84, 45,238, 37,151, 62,139, 92, 9, 33, 19, 11, 32,125,246,153,179,194, 95,185, 53, 25,212, 97,252,232,193, 97,246, 54,114,
+100, 63,212, 64, 36,124, 58,213,139,131,155, 47, 28,100, 6, 76,159, 54, 25, 46,206,142, 72, 47, 52, 98,205,239, 15,113, 47,225,
+ 17,120,125,221,178,253,195,246,227, 67, 39,140, 27, 37, 19, 74,100,216,114, 36, 5, 50,137, 16, 34, 98, 66,252,181,139,198,188,
+204, 20,179,166, 84,101, 35, 18,137,173, 18,101, 0, 82, 30,153, 91,186,112, 14,118,110,250, 9, 39,110,231, 87,116,159,191,188,
+239, 91,124, 56,247, 75, 20,150,154, 0, 48,175,124, 24, 75, 84,147,185,146, 75,165, 39, 55,173,153,171, 56,243, 16, 56,127,239,
+169,185,210,151, 21, 98,203,175, 63,151, 17,240, 81,121,113, 7,173,126, 35,180,113,107, 20, 46,179,177,185,240,217,151,107,140,
+238,222,245,217,163, 49,165, 69, 26, 3,247,111, 97, 16,137,210,134,179,113,112, 53, 56,250, 71,172, 20,235, 77,243, 11, 10, 18,
+180,181, 69,154,120, 66,112,228,122, 46, 8,121,250, 74,180,251, 98, 22,132,130,167,205,133, 28,255,180,249,228, 84, 76, 62, 68,
+ 2,198,234, 33,231, 12, 3,236, 62, 25, 83, 24, 94,133,185,106,221,186,181,202,222,222, 30,142,142,142,176,181,181,173,235, 3,
+187,202,200,149, 82,169,172,119,226,196, 9,185,189,189, 61,132, 66, 33,140, 70, 35,122,246,236,249, 66, 95,170,141,123,200,232,
+118, 61,134,125,213,177, 91,127,156, 59,177,159,143, 62,186,113,152, 46,191, 14,243,247, 0,232,219,185,217,225,229,223,126,223,
+240,163, 57,159,201,236,228, 34,220, 47, 51, 65,192, 48,240,119, 87,194,217, 86,136,232,179, 71, 12, 35,122, 54, 61,108,173,158,
+159, 79,253, 45, 43,190, 91,231,188,114,217,162, 94, 78, 78, 13,221, 75, 74,146, 75, 1, 64,151,255,112,157,173, 71, 72,162,143,
+223,201, 11,205,187, 12,133,187,119, 80,191,186,230,183,160,160, 32, 47, 44, 44,236,126,147, 38, 77, 90,141, 24, 49,130,124,245,
+213, 87, 78,153,153,153,123,172, 53, 87, 0,208,163,103,216, 12, 91, 41,215,174,158, 82, 16, 22,224,161, 68,251,176,167,173,159,
+163,250,119,130,175,159, 31,158,228,234, 90, 20,235,120,113,153, 73, 24,240,227,207,247,110, 54,112, 17,190,205,234, 77, 9, 0,
+ 14,214,185,210,198,191, 58,190,151, 71,175,236, 20, 98,240, 79,203, 71,157, 12,150,209,204, 65,111,228,160, 55,177,208,154, 56,
+232, 76, 28,120,242,244,158, 96, 24, 6,102,150, 47, 63,101,157, 18,104, 95,207, 5, 1, 13,158,142,122,181, 83, 60,157,178,225,
+105, 19, 33,224,236,236, 12, 55,183,218, 27,119, 8, 33, 48,153,159,222,226, 38, 11, 95,209, 68,106, 50,179, 32,132,224,225,195,
+196,143, 83,147,147, 7, 7, 5, 7,117,110,210,172,121, 61,165, 76, 0, 0,213,154, 1,157, 78,199,217,217,217,185,213,171, 87,
+ 79,144,149,149, 85,209,239, 49,168, 69, 55,246,247,253,251, 48,108,216,208,178,251, 55,238, 86,140,168,210,235,245, 76,199,142,
+ 29,237,125,125,125, 5, 70,163,177,180,206, 81, 43,215, 70, 67,124, 67, 59, 44, 25, 63,113, 74,163,110, 81,125,112,238,204, 73,
+ 28,220,191, 99,179, 54, 63,241,164,181, 58, 33, 33,161,255, 54,138, 48, 48,184,209,191,141, 34,172,223, 48,184, 90,131,229,224,
+208,204,190, 89,235,174,190,169,133,102, 28, 59,118, 20, 90,117,238,231, 38, 83,153, 14, 98,178,225,200,142, 31, 39,189,245,225,
+ 34,251,174, 93, 34,225,100,175,132, 72, 36,196,237,155,209, 88,246,197,167,209,208,153,122,213,246,252,172,200,111,147, 38,146,
+ 32,191,250, 31,248, 5,134,227,246,181, 75,120,252, 48, 46,254,238,205,232,176,160,166,237,224,234,229,255, 1,211,164,201, 50,
+146,144, 80,235, 74, 21,132,227, 50, 39, 76,158,249,236,251,127,250,183,246, 45, 26, 74,153,231,111, 0, 0, 22,214,204,109, 89,
+183, 44,191,242, 40,194,234,116, 13, 26,213,222,139,215,238,205, 30,216, 43, 82, 80, 88,106,122, 26,177, 82,155,158,109, 70, 20,
+150,127, 46, 53, 34,216,203, 22,143,227,238,243, 22,173,122, 95,221,238, 76,146, 55,237,157,247, 20, 79,211,206,131,240,164, 70,
+195, 95,109, 90, 57,201,235,235,190,152,195,220, 75,213,226, 94, 74,233,211, 38, 65,177,240,169,177, 18, 11, 42,204,150, 85,173,
+100, 2,193,215,227, 71,246, 70, 97,169, 25, 60, 15,136,132,130,103,155, 4,233, 26, 6, 25, 26, 29, 10, 75, 10,144,156,154, 6,
+ 85,238, 99, 8, 4, 2,184,120, 53,130, 46,221,186,180,106, 56,219, 70, 22, 14,129, 35,251, 71, 10,127,143,206,133, 82, 38, 66,
+105, 81, 6,174,156,216,165,231, 89,110,157,201, 98,218,233, 70,164,113, 9,177,123,204, 86, 62, 58, 10, 74,181, 70,119,153, 88,
+136, 61,155,126,192,200, 55,166,149, 71, 32, 1, 0, 31,207, 91, 12, 8, 24,148,168,180, 0,152, 23,142,138,254,207, 27, 44,177,
+ 64,120,106,227,234, 79,229, 9, 5,114,220, 72,204,193,136, 72, 31,232, 52,133,248,249,135, 53,101, 6,139,177,111, 65,236,193,
+186,133,219, 5,130,222,163,222,156, 29, 31,208,168,137,241, 92, 92, 89,138, 74,107,169,182, 31, 67,251, 17,159,197,223,250,227,
+251,126,106,203,147,119,108,189,194, 56,158,101,191,214,229, 39, 46,170,250, 45,153, 72, 23,173,217, 83,209, 60,248,201,178, 45,
+ 79, 63,115, 28, 56,194,131,240,192,244,207,215,130,229, 57,240, 28, 7,158, 35, 96, 44,156,178,214,112,185, 92,114, 50,188,108,
+165, 67, 85,230,202,209,209, 17,206,206,206,112,118,118, 70,185, 33,250,171,205,130,193,193,193,176,181,181,197,165, 75,151,160,
+ 80, 40, 96, 99,243, 98, 19,228,219,186,135,190,214,182,251,208,109,221, 6,190, 41, 56,253,251,207,220,245,243, 71, 70,232,243,
+ 31, 88,109, 2, 56,142, 99, 44, 22, 11,122,119,109,153, 22,147,152,126,252,139, 69, 11,251,180,238, 62, 92,214, 33,196, 13,122,
+ 19,139,172,204, 76, 68,159, 61,104, 8,242,115, 62,209,165,109,227, 52,139,197, 2,142,227,106,173,192, 13, 70, 83,145, 80,172,
+112, 30, 53,250,117,217,205, 27, 55,182,217,184,135,236, 16, 8,249,187,132, 19, 54, 3,200,107,205,154, 53,134,217,194, 67,167,
+211, 20,191, 72,190, 19, 18, 18,110,172, 90,181,170,145, 88, 44,246,221,189,123,119, 97, 73, 73, 73,157,150, 11, 58,121, 49,113,
+181,136, 41, 73,146,242,230, 49,254,118,154,158,233,157,218, 99,244,128, 78,216,249,199,101,156,191, 20,141,180, 50,219,152, 50,
+ 86,116, 32, 35, 45,219, 24, 86,175,116,223,160,246,245,133,123, 54,149,236,115,235, 54,247, 53, 66,100, 39, 11,206, 47,208, 90,
+ 95,121, 3, 26,189, 5,246,202,167,243, 53,149, 71,178,132, 12, 99,181, 19, 98,128,228, 75,209,183,195, 91, 5, 55,193,157,100,
+ 53,242, 85, 70,232,141, 44,120,158,128, 7,129,179,157, 20,114,137, 0,233,169,201,224,137, 57,165,110,245, 12, 10,250, 14,159,
+ 34,122,122, 30, 94, 36, 22,139, 64,158,213,139, 10,185,180,204,205,205,205,170, 8,150,153,101, 49,172, 79, 91,180,107,221, 12,
+131,167,172, 0, 0,156,217, 60, 7, 78,182, 98,236,221,187, 23,233,151, 87,109, 13,232, 48,237,100, 92,108,252,240,248, 59, 87,
+ 95,239,219, 82,209,194, 67,148, 93,109,211, 70, 89, 89,217, 62,134, 97,164, 18,137,164, 79,231,206,157,235,237,219,183, 79,229,
+226,226,194, 75, 37,146,130, 65, 3, 7,240, 98,137,164,162,236, 92,185,114, 69, 60,101,202, 20,187,146,146,146,244,188,188,188,
+104, 66,136,165,230, 23,192,208, 40, 8,176, 3, 12, 35,183, 85, 40,211,218, 71,141,246,106,221,174,173,195,144, 97, 35, 33,147,
+202,112,234,228,113,124,183,106,217,238,178,156,251,111,214,229, 82,190,140, 81,132,106,181,131, 54, 41,225,110, 73, 74,190,201,
+ 73,236, 24, 12,177,204,110, 10,227,224,181, 70, 40,179, 93,224,218,124,136,253,222, 67, 71, 17, 27, 23,135,122, 10, 11,158, 60,
+ 78,210,197,197,220,249, 73,199,136, 23,145,130, 4,157,213, 17,230, 34,110,120,251,113,125,156,140,102, 14, 23,207,254, 97,224,
+ 89,190, 79,244,133,163,143,125, 26,181,150,135,183,238,225, 84,120,112,195, 48, 0, 59,107,211, 73,185,190,245,223,186, 94, 4,
+180,125, 45,251,232,201, 11,182,158,254, 65, 66, 6, 66, 24,244, 58, 20,164,197,178, 6,117,174, 46, 47,246,128,151, 53,233, 75,
+ 99,179, 62,255,252,171,181,239,180,106, 30,102, 67,136,228, 79, 17,171,114, 99, 85, 88,106,130,139,157, 20, 70,109, 9, 30,223,
+187,100, 40, 16,231,125, 90,243,179,206,162, 44, 42, 42,150,150,255,174, 40,115,172,175,118, 80,203, 42, 76,160, 16,112, 80, 59,
+ 26,255,213,148, 86, 44,229, 56,139,210,154,219,211,193, 86,142,216,148,156,138, 14,237, 50,241,211,190, 87, 82,177,176,162, 31,
+150,149,247,121, 75,145,212, 22, 89, 69, 6, 48, 32,224, 57, 22,172,197, 4, 77,105, 41,178,178,115,145,151,155, 7,141, 70, 5,
+165,173, 19,194, 91,180,129,157,173, 13, 30,220, 62, 15,128,177,234,229,215,192, 75,130, 91,183,106, 37,142, 79, 43,131,217,194,
+ 67, 12, 51, 46, 31,219,105,176, 88, 76, 3,243, 98, 15,156,173,235,115,152,229,201,233,184,196,180, 48, 31, 87, 79, 38,230,177,
+ 26, 91,215,127, 15,211,179, 72,166,197,194, 33, 46, 93,139,156, 98, 29, 50, 51,210, 8,120,238, 52, 94,113,170, 53, 88, 44,203,
+202,253,252, 27, 96,244,148,177,248,233,167,181,120,248, 36, 29,191,252,248,204, 92,221,251,253,138,149,134, 34,170,124,174, 12,
+109,238,131,175,223,252, 41, 37,243,208,157, 98,129,222, 84,243,250, 83,114, 87,127, 68,190,249,237, 9,189,166, 88,202, 25,117,
+162,195, 91,223,220, 81,149,230, 83,223,198,152,150,204, 26, 5, 91,133, 8, 12,195,160,188, 89,240,199,197,147,161,148, 9,193,
+ 48, 12,244, 70, 22, 99,103,172,196,214,149, 51, 65, 0,188,245,206, 44, 93,117,233,172,100,132,152,137,125, 26, 14,250,242,215,
+132,131,151, 83,157,159,244,239,223, 69,221,178,101, 75,149, 66,161,128, 66,161,128,189,189, 61,156,156,156,224,232,232, 88,107,
+222,159,253,238, 94, 91,159, 43,129, 64, 0, 27, 27, 27,216,218,218,194,198,198,230,223,140,219,243,154,255,102,174, 60, 26,141,
+108,211,109,232,142,238,131, 38, 9, 78,255,254, 11,127,235,252,225,145,250,252,196, 3,214,126, 71,207,154,117,238, 14, 27, 54,
+172,233,148, 41, 83, 36,159,190, 51,236,196,137,243,183, 31,238, 63,181,111, 96,177, 74,227, 75, 8,129,163,131,109,198,136,158,
+ 77, 15, 71,182, 14, 73, 59,115,230, 12,191, 99,199, 14, 35,195, 48,177,181,165,179,176, 48,127,227,153,211,103,151, 71,118,233,
+138,245,155,118,244,143, 79,184,223,255,241,227, 36,248,250, 7,160, 65,195, 96,232, 24, 39,156,189,112, 9,154,226,220,141,214,
+164,179, 50, 77,155, 54,245,110,222,188,185,143, 74,165, 50,204,159, 63, 63,132, 16,114, 32, 60, 60,188, 85,203,150, 45,115,239,
+220,185,147, 89,221,176,255,202,154, 87,215, 14, 41, 0,176,185,126,215,137,187,179,204,170, 15, 0, 44,243,243,247,195,249, 75,
+209,136,190,124,125,109,161,210,111,209,155, 99, 39, 78,174, 63, 72,248,214,160,246,245,133,110, 78, 74,108,255,229, 91,225,161,
+232,212,149,169, 69,220, 6, 0,139,173,249,142, 42, 30,214, 26, 51, 58, 54,174, 7, 11, 71,192,147,167,166,203, 78, 46,174,178,
+137,176, 42, 77,145, 73,246,230,212, 41, 83, 30,135, 55,107,241,225,216,137, 83, 37, 45, 2,124,113,227,145, 10, 96, 24,212,243,
+176, 65, 78, 78, 14, 46,238,253,133, 45,201,122,176, 86, 40,228,191,168,203,245,204,188,189, 51,168,252,179,167,167,231,228,152,
+184, 56,156, 63,127, 30,229,198,202,213,213,181, 74,131,245,188,102, 73,137,230,202,226, 21,235, 59,190, 61,110, 48, 6,116, 13,
+195,133,155,143, 97,122, 54,223, 82,249,144,240,228,232,117,210, 15, 70, 5,152,222, 25,214,168, 84,111,145,166,126,158,162,190,
+ 88,121, 18,217,231, 53, 9, 33, 38,134, 97, 14, 37, 38, 38,118,106,222,188,121,253,163, 71,143, 22,199, 95, 63,241,167,137,238,
+102,205,154,101,251,211, 79, 63, 41, 9, 33, 87,140, 70,227, 19,171,242, 46,192,246,219,183,110, 57,155, 45, 60, 46, 93,191,219,
+184, 71,199, 22,224, 9,112,243,230, 77,108,248,117,131, 33,246, 94,204, 10,109,158,199, 23,213, 77,110, 91,221,245,228,254,194,
+ 40,194,114, 77, 66,206,179,182,238,161,107,175, 92,186, 48, 79,230,213, 10,161,253, 62, 29,148,117,247,208, 32,143, 38,189,225,
+ 18,208, 1,217,247, 14,225,202,137,109, 71,121,150,157, 35,231, 5,105,218,130, 7, 90,107,239,247,114,100, 10,229,123, 77, 90,
+118, 65,122, 90, 42, 82,146,226, 54,235,139,146,178,109, 61, 66, 55,103,103,166, 77,109, 24,214, 17,151, 79,236,124,191, 58,131,
+ 85, 91,153,119,147,107,214,158,187,124,117,116,214,158, 67,238,154, 50,189, 66, 36, 18,232,100, 34, 38, 79,162,123,188,203,218,
+116,146,132, 4,179, 91, 96,135, 97, 99,166,124,246,199,202,175,230,137,221, 29,101,200, 45, 49,160, 84,111,134, 70,103,134,128,
+ 97, 16,228,101, 3,189,182, 20,209, 71,183, 88, 56, 67,209, 40,242,232,207, 17,183,202,154,174, 97,131,191,100, 24, 76,255,236,
+179,185, 16, 74,237,189, 26,246,248,212, 44,104,232, 1, 39, 60, 55,153,121, 61,160, 97,143, 79, 97,212,228, 13,252,236,179,185,
+ 33,132,144, 30,174, 97,131, 53,229,107, 17, 86,151,247, 34,141, 25,175,119,243,133,153,125, 58,127, 24,203, 3, 28,255,244,133,
+159, 16,128,212,208,110, 95, 89,147, 0,146, 93,127, 92, 65,118,158, 10,122,147, 5, 70, 19, 11,179,133,131, 64, 40,132,163,147,
+ 35,130, 27, 68,192,209,209, 1,249,133,133,184, 25,125, 25,215, 18, 99,146, 9,240,101, 97, 61,245, 54,107,190, 35, 70,100, 19,
+228,238,230,194,228,149,154,160,144, 10,113,237,246,121, 11, 1, 54, 90, 99,174,170,210, 84,235, 84, 43,231, 44, 94, 51,230,167,
+111, 23,120, 52,109,104,143,204, 66, 61, 50, 11, 12,208, 24,158,190,223,176, 28, 15,147, 94,141,196,155,199,114, 89,232, 86,254,
+115, 35, 88, 98,177,241,230,189, 68,217,156, 69,223,224,254,163,100,108, 88,251,189,214,104, 49, 91,109,174,170,226,183,119, 26,
+236,172,219, 17,207,230, 45,253, 34,181,150, 23,238,231,154, 5, 9, 15,158, 16, 28,190,158, 91,209, 44,200, 63,235, 81,121,231,
+177,170,182, 66, 35,254,230,189, 22, 31,151, 27,161,239,126,207,186, 38,147, 21,242,233,233,233, 37,219,182,109,171, 48, 61, 66,
+161, 16,229,163, 7, 77, 38, 83,173,163,138,156,236,165, 97,227,250,214, 31, 85,157,185, 18, 10,133,224,121, 30,246,246,246, 80,
+ 40, 20,117,110,122,180,113, 11,233,217,166,251,208,157,221, 7,191, 37, 56,115, 96, 61,127,235,252,161, 17,101,249,137,191,215,
+245, 59, 42, 41, 41,137,103, 24, 38,105,197,138, 21, 45, 54,108,216,208,112,246,236,217, 79,214,127, 53,245,187,167,111,112, 79,
+151, 69,188,115,231, 14,153, 54,109,154,209, 96, 48, 36,151,148,148,220,182,102,145,107, 93, 94,226,138,223,126, 90, 30,146,145,
+149,243, 70, 64,120, 27,184, 54,108, 3,143,160,182, 40,209,152,113,227, 81, 54,158,220, 63,131,132, 43,123,119,233, 11,220,151,
+214, 37,189, 45, 90,180,240, 19,139,197, 3, 1,132, 40, 20,138,250, 12,195, 72,197, 98,241,107, 12,195, 36, 49, 12,115, 63, 36,
+ 36,228, 12,170, 89,190,168, 42, 82,207,111, 52,214,239, 58,113, 77,154,198,174,219,147, 92, 93, 68,154,198,238,142, 78,230, 48,
+ 51,255,204,106,163,123,175, 21, 43,137,185, 48,126,207,166,210,125,219,127,249, 86, 56,118,242, 44, 46, 78,237,244,129, 72, 33,
+ 61,245,213, 27,214,143,230, 22, 48, 76,206,236,217, 31,253,107,154,134,103,145,171,103, 83, 54,100, 91,163,241,108, 61,197, 79,
+ 20, 94, 97, 63,196,125, 48,101,113,179,214, 29,199,117,238, 59, 74,192, 74,108,113,226,247,117, 36,249,222,217, 61, 34,194,205,
+211,229, 63, 78,254,171, 15, 9,147,201, 84,171,185,170,178,233,214, 89,221,245,143,147,231,223, 56,114,252,194, 87,125,123,118,
+114,254,241,243,215,240,205,207, 7, 96,163,144,129,240, 28, 70,117,247, 27,113,127, 71,239,129,190,238,114,239,125,231, 50, 47,
+ 78, 95, 21,247,137, 78,103,126, 88,219,218,121,207, 12,243, 37, 59, 59,187,130, 78,157, 58,181,147,201,100, 76, 97, 97,161,200,
+205,205,141,117,112,112, 48,101,102,102,234,140, 70,227, 62, 66,136,182, 46,249, 52, 91,120,164,228, 25,112,112,255, 62,220,189,
+126, 6,247,239, 39,106,238, 39,220,255,158, 17,145, 85,101,185, 15, 95, 40,178,202, 87, 57,138,144,212,121, 20,161, 86,168, 88,
+122,231,200, 55, 93,131,187,191,223,222, 57,176, 35,156,252,159, 6,138,212,153,113,200,184,185,231,160, 38, 91, 50,146,144,184,
+ 23, 30,251,238,229,211, 48,152, 8,165,184,122,254, 15, 16,158, 95, 11, 0,132,231,215,222,185,124,116,106,219,126,111,161,158,
+ 91,253,230, 12,195, 48,117, 93,143, 17, 0,100, 2,179,250,143, 77, 75,247,164,164,164,224,193,131, 7,120,244,232, 17,138,139,
+139,177, 61,229,162,186, 46, 58,249,143,175,158,114,111,212,185,247,152, 55,103, 28, 30, 58,124,168,220,175, 65,144, 32,196,199,
+ 30, 46,182, 34, 36, 38,103,225,113, 92, 18,255,232,222, 69, 3,209,231, 15, 41,124,116,165, 90,195,231,218,100,164,187, 64,200,
+204, 57,115,232,233,218,130, 81,131,223, 12,249,120,250,236,118,245,156,157,170,124,142, 23, 23,149, 72, 23, 46,156, 31, 82,190,
+127,109,107, 17, 10,132, 66,205,228,169,239,217, 8, 24, 1,202, 47, 23, 41,111, 35,171,248,241,244,131, 68, 44,170,181,140, 78,
+ 28, 26, 9,150,231,161,213, 91,160,209,155,160,214, 24,145, 83,168, 66,252,253, 71,184,126,233, 56, 82, 30, 39,105, 88,150, 61,
+ 7,130,253, 5,206,234, 93,207, 79,172, 91, 99,249,132,208,175,158,147, 61, 82, 85, 6,200,165, 34,100,167, 63,102,205,172,225,
+133, 39, 89, 47,140, 57,148,227, 30, 62,184,215,196,119, 62, 61,222,185,115,164, 67,179,136, 86, 74, 23,123,123, 72, 68,192,227,
+244,124,220,187,125, 67,155,246, 48,166,148,179,232,251, 20,198, 29,250,203,171,180,252,207, 26, 44, 51,199, 70,205,250,116,217,
+ 73,142,227, 20, 34,161, 80,111, 33,124,159,191, 98,174,254, 46, 8,225, 51,223,121,255,163,138,168, 46, 0, 88, 56, 94,241,214,
+ 59,179,245,149,223, 16, 24, 11,167, 44,143, 92,213, 50, 82, 79, 88,160, 50,106,230,254,116,119,243,242,205, 9,123, 1, 36,252,
+213,145,125, 0, 80, 82,106,186,235,220,115,247, 96,141,142,101, 0,220,175, 66, 83,219,189,123,247, 10,179,245,172,185,206,234,
+ 10, 66, 42, 87, 78,237, 54,240, 77,193,153,131, 27,248,155,231, 14,142,124, 17,115, 85,169, 2, 51, 3,184,206, 48, 76,220,188,
+121,243, 90,187,187,187,187,207,159, 63, 95, 94, 90, 90, 42,254,241,199, 31, 13,133,133,133,185,165,165,165,209,132, 88,223, 63,
+225, 89,165, 57, 81,225,222,120, 29,179,119, 67, 47, 39, 55,239,222,142, 46,190,141, 74, 10, 50, 31,151, 22,101, 30,103,120,156,
+210,228, 39, 70,215, 53,173, 49, 49, 49,233, 77,155, 54, 61, 32, 20, 10,111, 3,112, 1, 96, 71, 8, 41,102, 89,182, 68, 44, 22,
+231, 38, 38, 38,214,121, 65,214,212,243, 27,141,157,223,249,117, 71,177,142,151,152, 4,146, 29,169,231, 55, 26, 1, 32,239,228,
+108, 29,128,131,238,221,230, 12, 59, 20,157,250, 93,124,137,195,251,249,231,150, 30,170,171,126,214,157, 93, 65, 47,171,252,235,
+179,227, 51, 1,188, 97,227, 30,242,109,236,157,232, 5, 12,129,152, 3,251,165, 46, 47,233,214,203,208, 23,139,197,134, 86,173,
+ 90, 85, 57, 90, 80, 38,147,213, 56,191,214,179, 7,253, 6,166,107,215, 77,199,207, 92,122,227,216,169,203, 95,181,107,223,201,
+ 89,238,227, 13,127, 39, 51, 54,125,212,242,253, 51,119, 10,110, 12,250,232,226, 79, 79,178, 13,247, 8, 33,134,186,164, 77,163,
+209, 60,100, 24,166,164,172,172,108, 48, 33, 36,131, 97, 24,223,146,146,146, 24,139,197, 18, 91,103, 35,192,227,245,246,237,219,
+108,103, 24, 70, 68, 88,254,235,104,177,112,135, 33,231,126,230,139, 24,138, 63, 69, 87, 27,216, 99,242,212,105,193,129, 65,141,
+130,203,215, 34, 12,171,111,135,177, 19,223, 14,174,223, 48, 56,248, 95,235, 19,214,252, 66, 69,178,111,235, 25,247,166, 61, 19,
+ 79,174,248,220,249,241,149,119, 20,245,124,108,181,133,169,197, 37,169,183, 86,232,242,221, 87, 60,191, 66, 67, 93, 73,121, 20,
+191,106,195,138, 79,102,231,100, 37,111,208,230, 63,140, 3, 0,109,254,195, 56,165,123,163,207, 11,115, 51,103, 23,229, 63, 89,
+241,162,215, 66,171,213,102,111,219,182,205,177, 99,199,142, 2,119,119,119, 20, 20, 20,224,220,185,115, 60,207,243, 89,117,213,
+202,123,120,241, 28, 19, 24, 88,111,199, 38,245,215, 34,133, 93, 63,150,131, 23, 33,128, 72,128, 28,179, 81,125,188,192, 81,255,
+ 17,185, 23, 93,115,185,228, 57,134, 8,136,160,124,109, 65,158,231,153,111,126,216,146, 42, 20, 75,171,108, 82,229, 44, 38, 37,
+207,243, 86,175, 69,152, 39, 76,115, 14,183,132, 90, 53,138, 47,142,121, 80,203,203, 41, 57,209,161,239,248,222, 44,203, 89, 0,
+ 24, 42,109,249,132, 48,103,193,112, 39, 11,235,105,162,235, 98,170,254, 84,207,155,205,142, 16, 74, 96,167,176,128, 1,131, 82,
+181, 74,230,202, 73,239,255,149,178,148, 23,119, 48,158,233,218,213,223,116,250,236,132, 11,151,174,142, 36, 60,215,128, 35, 0,
+ 8,147, 98, 50, 27,246,228,219, 23,110,126,209,244,254,175,193,144,191,113, 62, 10,107,155, 75,254,219, 52, 25,134,145, 60,171,
+172,185,202,203,223,188,140,116,214,180,182,224, 95,201,187,157,103,227, 78, 50,185,242, 35,157, 78,179, 65,151,247,240,240,203,
+188,158, 12,195, 56,200,100,178, 8, 91, 91, 91,113, 97, 97,225,117, 66,136,250, 85,252,222, 43, 19,249,230, 94,151, 30, 61,195,
+102,156,188,152,184,250, 89,243, 97, 5, 62, 35, 87,201,199,245,235, 54,107,243,254,131,255, 54,138,240, 85,200,251,223,165,201,
+116,237, 42,114, 43,177,127,131,227,248, 47,187, 7,107,116,185,201,137,211, 46,197, 22, 92, 39,132,104,254, 74, 58,165, 82,233,
+ 88,179,217,172,144, 72, 36,122,147,201,180,237,191, 37,239,110,225, 67,190, 0,131,198, 86,139, 16,220,207,143, 59, 48,191,214,
+103, 72,147, 38, 18,101, 1,156,116,133, 46, 69,117, 53, 86,255,145,239,157, 97,132, 77,155, 54,141,148, 72, 36,126, 28,199, 41,
+ 77, 38,147, 78,175,215,167,164,166,166, 94,173,110, 65,242,191, 59,157,238, 77,135,172, 18,139,197, 31, 0,128,197, 98, 89,147,
+ 23,123, 96, 70, 77,199, 86,183,255,255, 75,125, 52,114,164,144,236,217,195,253, 29,223,145,119,196, 8,149,197,194, 58,148,255,
+ 46, 17,139,212,153,119,246, 58,254,167,202,210, 43, 7,121,182, 60,194,223,177, 1,136,162,154, 84,147,106, 82,205, 42,246, 21,
+208,235, 73, 53,255,147,154,158,141, 7,248,122, 54, 30,224,107,237,241, 85,237, 79,175, 39, 1,221,170,223, 68,212, 98, 82, 40,
+148,255,192,139, 29, 79,175, 2,229, 63, 73,118,194,225,140,191,115,127, 10,133, 1, 16, 85,205, 3,208,234,208, 31,195, 48, 81,
+ 47,240,128, 61, 77, 53,169, 38,213,164,154, 84,147,106, 82,205,127,150,102,109,218,175, 76,211, 35,109, 34,164,154, 84,147,106,
+ 82, 77,170, 73, 53,169, 38,109, 34,124,185,155, 0, 20, 10,133, 66,161, 80, 40,148,151, 10, 53, 88, 20, 10,133, 66,161, 80, 40,
+212, 96, 81, 40, 20, 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80, 40, 20, 10,229,197,249, 91,
+103,114,167, 80, 40, 20, 10,133, 66,249, 39, 66, 35, 88, 20, 10,133, 66,161, 80, 40,212, 96, 81, 40, 20, 10,133, 66,161, 80,131,
+ 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80, 40, 20, 10,133, 26, 44, 10,133, 66,161, 80, 40, 20,106,176, 40, 20, 10,
+133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161,252,231, 13, 22,195, 48, 81, 84,147,106, 82, 77,170, 73, 53,169, 38,213,
+164,154,212, 96, 81, 40, 20, 10,133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, 10,133, 26,
+ 44, 10,133, 66,161, 80, 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40,255, 33, 24, 0, 85,142, 4, 32,132,156,182, 90,228, 5,
+ 70, 19,212,166, 79, 53,169, 38,213,164,154, 84,147,106, 82,205, 87, 79,179, 54,237,186,248,143,255,106, 8, 33,127,219, 6, 32,
+138,106, 82, 77,170, 73, 53,169, 38,213,164,154, 84,243,159,182,209, 38, 66, 10,133, 66,161, 80, 40,148,151, 12, 53, 88, 20, 10,
+133, 66,161, 80, 40,212, 96, 81, 40, 20, 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80, 40, 20,
+ 10,229,197, 97,158,141, 6,160, 80, 40, 20, 10,133, 66,161,188, 36,104, 4,139, 66,161, 80, 40, 20, 10,133, 26, 44, 10,133, 66,
+161, 80, 40, 20,106,176, 40, 20, 10,133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133,
+ 66, 13, 22,133, 66,161, 80, 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40,148,255,188,193, 98, 24, 38,138,106, 82, 77,170, 73,
+ 53,169, 38,213,164,154, 84,147, 26, 44, 10,133, 66,161, 80, 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40,212, 96, 81, 40, 20,
+ 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, 10,229, 63, 4, 3,160,202,145, 0,132,
+144,211, 86,139,188,192,104,130,218,244,169, 38,213,164,154, 84,147,106, 82, 77,170,249,234,105,214,166, 93, 23,255,241, 95, 13,
+ 33,228,111,219, 0, 68, 81, 77,170, 73, 53,169, 38,213,164,154, 84,147,106,254,211, 54,218, 68, 72,161, 80, 40, 20, 10,133,242,
+146,161, 6,139, 66,161, 80, 40, 20, 10,133, 26, 44, 10,133, 66,161, 80, 40, 20,106,176, 40, 20, 10,133, 66,161, 80,168,193,162,
+ 80, 40, 20, 10,133, 66,161,188, 56,204,179,209, 0, 20, 10,133, 66,161, 80, 40,148,151, 4,141, 96, 81, 40, 20, 10,133, 66,161,
+ 80,131, 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80, 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40, 20,106,176, 40,
+ 20, 10,133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, 10,133,242,159, 55, 88, 12,195, 68,
+ 81, 77,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,131, 69,161, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, 10,
+133, 26, 44, 10,133, 66,161, 80, 40, 20,106,176, 40, 20, 10,133, 66,161, 80, 40,212, 96, 81, 40, 20, 10,133, 66,161,252,135, 96,
+ 0, 84, 57, 18,128, 16,114,218,106,145, 23, 24, 77, 80,155, 62,213,164,154, 84,147,106, 82, 77,170, 73, 53, 95, 61,205,218,180,
+235,226, 63,254,171, 33,132,252,109, 27,128, 40,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,205,127,218, 70,155, 8, 41, 20,
+ 10,133, 66,161, 80, 94, 50,212, 96, 81, 40, 20, 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80,
+ 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40,148, 23,135,121, 54, 26,128, 66,161, 80, 40, 20, 10,133,242,146,160, 17, 44, 10,
+133, 66,161, 80, 40, 20,106,176, 40, 20, 10,133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20,
+ 10,133, 66, 13, 22,133, 66,161, 80, 40, 20, 10, 53, 88, 20, 10,133, 66,161, 80, 40,212, 96, 81, 40, 20, 10,133, 66,161, 80,254,
+243, 6,139, 97,152, 40,170, 73, 53,169, 38,213,164,154, 84,147,106, 82, 77,106,176, 40, 20, 10,133, 66,161, 80, 40,212, 96, 81,
+ 40, 20, 10,133, 66,161, 80,131, 69,161, 80, 40, 20, 10,133, 66, 13, 22,133, 66,161, 80, 40, 20, 10,133, 26, 44, 10,133, 66,161,
+ 80, 40,148,255, 16, 12,128, 42, 71, 2, 16, 66, 78, 91, 45,242, 2,163, 9,106,211,167,154, 84,147,106, 82, 77,170, 73, 53,169,
+230,171,167, 89,155,118, 93,252,199,127, 53,132,144,191,109, 3, 16, 69, 53,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 79,
+219,104, 19, 33,133, 66,161, 80, 40, 20,202, 75, 70, 84,213, 31,197,109,151,228,177, 44,235, 6, 0, 34,145, 40,223,114,227, 51,
+207,154, 68,124, 61, 61,123,112,192,122, 0, 16, 2,111,103,100,103,159,170, 66,243, 20,203,178, 78,207, 52, 75, 44, 55, 62,235,
+ 93,147,166,184,205,151, 39,254,180,255,245,121, 61,171,136, 47, 10,197,109,190,204,126, 46,173, 94,117, 8,223,113,255, 31,233,
+252, 95,209,252, 39, 35,105,183, 36,207, 98,121, 90,142,196, 98, 81,190,249,122,205,229, 72,210,246,203,236, 63,237,127,109,158,
+123, 77,154, 74,133,172, 40,208,219,117,101, 77,154, 79,178, 11,103,106,117, 6,231,154, 52,255,103,238, 77, 43,241,240,240,104,
+ 37, 16, 8, 62, 99, 24,198,190,210,159,239,101,101,101,125, 72, 75, 37,133, 66,121,229, 12, 22,203,178,110,183,127, 95, 0,173,
+ 17,232, 49,254, 75,183,128, 33, 63,111,255,183,125, 12, 37, 82,125,210,129,166, 82,104,157, 20, 98,214, 62, 41, 41,137, 1, 0,
+ 47, 47,175,245, 0,252,170,208,116,186,253,251, 2,232, 76, 64,231,209,139,156, 58,249,250,218,231, 10,133,179,100, 10, 69, 55,
+131,193, 16, 6, 0,114,185, 60,222,168,215,159,243,224,184,111,159,223,191,186, 12, 84, 78,107,247,113, 95,186,133, 14,249,249,
+125,142,231,165,250, 39,123, 58,243,154, 52,145,132, 51,253,248, 70, 78,206,177, 5, 0,103,205, 5,169,124,222, 46,163, 62,117,
+246,243,244,236, 46,149,203,155,219,217,219, 71,242,132, 52,230,121,158,225, 88, 54, 65, 91, 86,118,137,103,217,187,156, 69,231,
+124,251,192, 82,190,166,116, 62,159,151,145,128,232,154,135,199, 8,165,141, 77, 55,129, 72,212, 1, 0,120,150,189,170,211,106,
+207,181,203,205,221,107, 77,222,173,189, 62, 47,186,255, 63, 13,139,133,117, 75, 62,177, 0, 70, 11, 16, 49,252, 43,183,102,175,
+111,222, 14, 0,166,252,187,238,101, 73,135,218, 2,128, 77,224,128,235, 50,143,136, 60, 0, 16,165,229,184, 61, 60, 50, 15, 70,
+ 11,208,120,192, 34,183,218, 52, 39,206,223,237,252,241,228, 97, 50, 0, 56,185,239,135, 70,103,247,175,237, 11, 0,221,135, 77,
+ 59,214,107,248,244,135, 0,240,245, 47,251,157,119,126,245, 90,141,154,214,221,155,106,137, 58,233, 72,144,169, 52,199,209,215,
+ 70,228,145,148,148, 36,168,203,189,233, 3, 56,228, 0,239, 10,132,194,200,192,160,160, 8, 0,228,201,227,199,119, 56,150,189,
+236, 9,252,248, 50,203,146, 80, 40,124, 63, 43, 43,107, 96,229,191,121,123,123,211, 2, 73,161, 80, 94, 77,131, 5, 0, 90, 35,
+112,225, 17,208,165, 93, 51, 76,126,189,159,109,229,255,237,255,117,177, 95,102,220,169,208,165, 27,191, 22,132,133,133,225,201,
+147, 39, 86,157, 76,103, 2,206, 39, 1, 50, 67,138, 93,190, 84,250,120,254,103,159,217, 71, 70, 70,138, 60, 61,159,190,132,231,
+231,231,183,187,124,249,114,171,133, 11, 23, 78,149, 25, 82, 74,116, 38,104,206, 39,213,174, 91,158,214,176, 70,245,241,217,244,
+215, 28, 0, 96,213,236,189,173,142, 94,189, 91, 47, 37, 37,165,199,210,165, 75,139,188,163,163,215,214,227,184,141,177,249,249,
+ 25,214,164,115,215,137, 24,121,160,233, 84,192,136,137, 19,247,249,251,251,219,122,121,121, 49, 74,165, 18, 66,161, 16,165,165,
+165,126,137,137,137,125,239,222,189,171,189,116,237,160, 52,246,238,240, 39,153,194, 22, 6,107,242, 46, 97, 11,229,113,193,193,
+241, 35,250,246,245, 25, 48, 96,128,188, 65,131, 6, 0,128,148,148,148,224, 63,254,248, 99,244,209,163, 71,231, 75,216, 66, 86,
+103,130,161,182,188,151,107, 2,128, 28,232,224,232,230, 54, 86, 40, 22,135,177, 44,235,253, 44,186,144,197, 89, 44,241,170,252,
+252,109,207,239, 79,249,119,140, 22,224,126, 14, 16, 21, 25,129,113,195,162,108, 0,224,147, 81, 75,218,165,165, 60,146,152, 76,
+ 38, 52, 10,105,220,113,241, 87, 43, 79, 64, 32,192,214,253,167, 43,246,183, 70,243,222,253,100, 44, 88,188, 10,217,177,123,219,
+113,234, 71,221, 52,165,106, 33, 0,216, 59, 56, 12,219,187,107,199, 57,175,166, 35,174, 61, 42, 52, 91,165, 89,211,189,121,124,
+215,247,158,153,113,231,154,252,116,242, 55,177,159,159, 31, 98, 99, 99,235,116,111, 66,157,104,199,123,122, 38,124,251,209, 71,
+ 30,157, 59,119,134,173,173, 45, 68, 34, 17, 88,150,141,186,124,249,114,212,130, 5, 11,166, 65,157,168,181,246,222,180,130,111,
+189,188,188,186, 13, 30, 62,214,179, 91,239, 1, 24,214,167, 35, 45,136, 20, 10,229,213, 53, 88, 34,145, 40,191,231,132,165,110,
+145,109,195,113,243,238, 67,117,106,122, 78, 89,249,255, 84,247,247, 55, 26, 29, 21,216,100,221,209, 63, 96, 52, 26,113,229,202,
+ 21,220,189,123, 23, 41, 41, 41,152, 55,111,158, 81, 8,188, 93,141,102, 73,231,209,139,156,100,198, 12,219,150,206, 25, 13,118,
+110, 63, 39,212,235,245, 56,127,254, 60, 74, 74, 74, 32,149, 74,225,227,227,131, 78,157, 58,137,206,159, 63, 95,111,212,152,177,
+ 14,189,134, 76, 74, 54,202,124,203, 68, 34, 81, 73,181, 25, 16,137,242,123,140,255,210,173, 73,112,125, 60, 78,205, 86,127,246,
+213,175,101, 60, 79, 68,186,180, 76,243,133, 11, 23, 16, 17, 17,129, 93,187,118, 57,151,148,148,124,190,105,211,166,207, 60,191,
+223,184, 38, 39, 51,113,118, 13,122, 37,157, 71, 47,114,106,196,157,245,223,187,227, 55,201,221,187,119, 37,235,214,173, 67, 81,
+ 81, 17,164, 82, 41, 28, 29, 29,225,225,225,129, 70,141, 26, 49,239,190,251,174,109,183,110,137,248,124,230, 36,255, 28,199,193,
+137,213,165,179, 92, 83, 98,202, 81, 6, 11,111, 5,174,223,188, 89,208,166, 77, 27,166,242, 62,126,126,126,232,218,181,171,124,
+232,208,161,129,211,222,125,143,143, 26, 58,229,177, 89,234,169,171, 77, 19,218, 12,133,179, 46,218, 43,106,244,232, 67,139, 22,
+ 45,114,244,240,240,128,141,141, 13, 0, 64,173, 86,251,164,166,166,182,155, 63,127,254,240,235,247,118,137, 58, 15,200,200,134,
+141,175,190,166,235,249, 79, 69, 44, 22,229,151, 71,141,236,108, 20, 37, 25,153,121, 90, 0, 48,153, 76, 48,153, 76, 48, 26,141,
+120,103,218, 20,225,219,195,219, 4,249, 71,190, 31,147,146,149, 87,220,248,244,181,122,229,199,214,166, 41,210,165,168, 84,233,
+103,222, 94,240,209, 71, 30,238,238,255,106,249,219,186,101,139,176,184,184, 56,106,193,130, 5, 77,136,178,171,170,241,128, 69,
+142, 53,105,214,120,111, 62,252,163,193,226,233,189,155,255,252,213, 17,112, 28,135,232,232,104, 92,188,120, 17, 43, 87,174, 36,
+199,142, 29, 83,219,219,216,212,120,111, 66,157,104,215,201, 51, 55, 96,249,242,125,140, 76, 38,195,193,131, 7,241,224,193, 3,
+ 8, 4, 2, 52,107,214, 12,227,198,141, 67, 84, 84,148,199,228,201, 83, 72,231, 62,163,158,192, 33, 68,243, 87,202, 18,195, 48,
+ 2, 79, 79,207,247,223,249,240, 83,207, 97,163,223,192,247,223,124, 65, 13, 22,133, 66,121,117,168,178,247, 59, 32,104, 56,228,
+231,157,123,110,241,127, 52, 28,242,243, 78, 2, 8, 8, 32,176, 7,234, 71, 70, 70, 90, 84, 42, 21,185,113,227, 6,121,231,157,
+119,180,107,214,172, 57,247,199, 31,127,236,101,205,230, 13, 17,205,155,175, 32,128,160, 58,205,102, 14, 14, 14, 1, 1, 1, 5,
+ 25, 25, 25,228,232,209,163,100,225,194,133,100,219,182,109,228,216,177, 99,228,244,233,211,228,216,177, 99,100,231,206,157,228,
+222,189,123,228,209,163, 71, 36, 48, 48,176,160,153,131,131, 67, 13,154, 66, 2, 8, 27, 13, 89, 55,123,223, 77,203,162,144, 33,
+ 63,207, 32,128,176,177,187,123,104,207,158, 61,185,189,123,247,146,173, 91,183,146,205,155, 55,147,123,247,238,145,194,194, 66,
+226,237, 31, 80, 80,126, 92,117,233, 36,128, 32, 34, 34,162, 64,165, 82, 17, 95, 95, 95, 34,149, 74,137,187,187, 59,105,212,168,
+ 17,105,215,174, 29,233,219,183, 47,121,253,245,215,201,231,159,127, 78, 84, 42, 21,241,247,247,207, 43, 63,174, 58,205, 1,158,
+158,138,192,192,192,244,216,216, 88, 82, 29,122,189,158, 20, 22, 22,146,179,103,207,146,192,192,192,244, 1,158,158,138,154, 52,
+ 21, 64,203,166, 77,155, 22, 20, 22, 22, 18,179,217, 76,210,211,211, 73, 92, 92, 28,121,240,224, 1, 73, 79, 79, 39,122,189,190,
+ 66,251,225,195,135, 36, 32, 32,160, 64, 1,180,172, 86,243,159,188,149,151,137,231, 54, 63,119,247,190, 30, 30, 30,250,125,251,
+246,145,172,172, 44,178,105,211, 38, 34, 0,150,252,219,190, 53,104, 74,129, 94,157, 58,117,226,162,163,163, 73, 76, 76, 12,153,
+ 51,103, 14,233,221,187, 55,233,211,167, 15, 89,176, 96, 1,201,204,204, 36,153,153,153,164,111,223,190,156, 20,232, 85, 91,249,
+172,234,222,116, 0,252, 6, 12, 24,160, 55,155,205,228,201,147, 39, 36, 44, 44, 44, 83, 8,140,181, 1,154,116, 1,100,181,149,
+ 79,111,192,201,211,211, 51, 39, 58, 58,154,236,223,191,159,248,251,251, 23, 8,129,137,246, 64, 67,123,160,161, 16,152,216,176,
+ 97,195,130,232,232,104, 82, 84, 84, 68,252,252,252,114,188, 1,167, 23, 45, 75, 0, 4,158,158,158,191,125,249,245, 15, 36, 49,
+ 83, 75,190,252,250, 7,226,233,233,153, 78, 8, 33,158,158,158,167,104,153,164, 27,221,232,246,191,190,137,234,100,198,108,108,
+150, 46, 94,188, 88,100, 48, 24,240,235,175,191,106,198,140, 26,181,223,209,209,145, 21,139,197, 96, 4,181, 15, 72,212, 56, 56,
+124, 48,111,238, 92, 71,163,209,136, 91,183,110,161, 85,171, 86,144,201,100,144, 72, 36, 16,139,197, 16,139,197,240,244,244, 68,
+126,126, 62,194,194,194, 48,117,234, 84,135, 31,191,255,254, 3,168,213,139,107,210,229,121, 34, 2, 0,142,231,165,245,189,188,
+ 38,135, 54,109,186, 98,218,180,105, 2, 27, 27, 27, 24, 12, 6, 24,141, 70, 60,120,240, 0,206,206,206, 80, 42, 20, 86,229, 89,
+ 32, 16, 8,108,109,109,113,246,236, 89,252,242,203, 47, 72, 73, 73, 65, 78, 78, 14,236,236,236, 16, 22, 22,134,198,141, 27,163,
+ 75,151, 46,120,242,228, 9, 24,134, 97,106,211, 75, 16,139,223, 29, 55,122,180, 91,120,120,120,149,255, 55, 24, 12, 80,169, 84,
+ 80,171,213,112,119,119, 71,223,190,125,221, 14, 31, 60,248, 46,128,111,171,218,223, 25,240,240, 9, 14, 62,116,227,198, 13, 23,
+ 66, 8,182,110,221,138,178,178, 50,152, 76, 38, 8, 4, 2,200,229,114, 56, 57, 57,161,123,247,238,112,117,117, 69,112,112, 48,
+118,239,222,237,210,183,111,223, 35,206,249,249, 45,139,128,108,250,122, 81, 59,105,121,121, 39,123, 1, 46, 99, 95,127,253,216,
+221,123,247, 34,199,142, 29,139,188,188,188, 79,197,115,230,168, 44,192,170,218,142, 15, 1, 28,234,121,122,110, 92,190,124,185,
+ 32, 55, 55, 23,179,102,205, 42,204, 78, 75,155,227, 0, 92, 2,128, 51,199,143, 71,110,219,182,109,217,214,173, 91, 93,182,108,
+217, 34,136,136,136,216, 24,146,158, 30,150, 8,168,235,146, 78, 13,240,254,234,213,171,229, 6,131, 1, 61,123,246,124, 34, 79,
+ 73,105,206, 2,122,107,143,207, 1,222, 93,249,241,199, 30, 50,153, 12,179,102,205, 42,212,165,165,133,179, 64, 65,165, 93, 82,
+ 93,147,147,143,143, 31, 63, 62,238,222,189,123, 46,171, 86,173,242, 24, 62,116,232,187, 0,150, 88,123,142,202, 29,218, 61, 61,
+ 61,131, 7, 15, 31,235,222,168, 73, 83,236,223,185, 9, 63,173, 94,186,145,227,184,159,189,189,189,167, 11, 4,130,111,104,201,
+163, 80, 40,175,100, 19, 97,117, 56,187,186,182, 10, 13, 13,197,133, 11, 23,208,180,105,211, 27,142,142,142,172, 68, 38,131, 88,
+ 44, 6,225,249, 90,143, 87,216,216,244,232,220,185,179,232,234,213,171, 8, 8, 8,128, 66,161,168, 48, 86,229,155, 68, 34,129,
+167,167, 39, 74, 75, 75, 17, 25, 25, 41,222,184,113, 99, 15, 0,139,107,211,206, 78, 77,180, 69,242,198,215,151,125,187,162, 97,
+155, 54,109,160, 86,151,130,231,121, 40,149, 74,152, 76, 38,136, 68, 34,152, 76, 38, 24, 76,164,212,154,188,114, 28,199, 9,133,
+ 66, 4, 4, 4, 96,233,210,165, 48, 24, 12,144, 72, 36, 0,128,210,210, 82,168, 84, 42,196,197,197, 33, 53, 53, 21,228,217, 43,
+121, 77,216,216,218,246, 27, 52,104,144,180,170,255, 25,141, 70,168,213,106,168,213,106,168, 84, 42, 24, 12, 6, 52,107,214, 76,
+122,238,236,217,126,213, 25, 44,163, 92, 62,124,203,150, 45,110, 82,169, 20,122,189, 30, 26,141, 6, 25, 25, 25, 72, 75, 75, 51,
+228,231,231,179,118,118,118, 2,127,127,127,129, 76, 38,147, 13, 25, 50,132, 41, 45, 45, 5,195, 48, 24, 48, 96,128,243,246,173,
+ 91, 95, 3,176,146, 22,127,235, 56, 9, 24, 91,154, 76, 3,219,182,105,115,246,198,205,155, 17, 31,124,240, 1,238,221,187,183,
+ 92,185,107,215, 5, 29,112,183,166, 99,159, 0,239,174,168,100, 92, 72, 90, 90, 83,243,115,198,197,255,169,113,137, 45, 55, 46,
+ 35,235,104, 92, 0,192,206,193,161,181,167,167, 39,142, 29, 59,134,244,148,148, 79,234, 98,174, 0, 64, 32, 20,118,234,220,185,
+ 51, 14, 30, 60,136,204,180,180, 79,158, 51, 87, 0,128, 2,160, 64,244,228,201, 39, 27, 55,110,252,237,205, 55,223,132, 80, 36,
+234, 4,150,181,250, 28, 85,117,104,127,247,131, 79,112,112,223,182,141, 57, 57, 57,111, 17, 66,120, 0, 55,104,137,163, 80, 40,
+175, 2,117,154, 7,203,195,195,195,219,198,198, 6,217,217,217,104, 28, 26,154, 47,147,201, 32, 21,139, 33,151, 74,173, 58,222,
+ 96, 48, 52,245,240,240,128, 90,173,134,139,139, 11, 36, 18, 73,197, 38,149, 74, 43, 62,219,217,217, 65, 32, 16,192,219,219, 27,
+ 6,131,161,105,109,186,172, 42,201,237,248,166, 57,239, 28,222,183,165, 97,223,190,253,224,228, 84, 15,190,190, 62,112,115,115,
+131, 66,161,128,175,175, 47,130,130,130,200,250,245,235, 33,176, 15,178,234, 1, 94,217, 52,137, 68, 34,112, 28,135,188,188, 60,
+ 36, 38, 38,226,222,189,123,136,142,142, 70, 76, 76, 12, 52, 26, 13,172,240, 87,208,234,116,205,171, 10,116, 25,141, 70,168, 84,
+170,138,232,149, 74,165, 66, 65, 65, 1,158, 60,121,130, 82,141,166, 69,117,122, 78,206,206,195,194,195,195,133, 0,160, 80, 40,
+208,162, 69, 11,252,252,243,207,236,225, 3, 7, 70, 53,137,142,174,231,123,226,132,227,250,117,235, 70,141, 24, 49,130,187,118,
+237, 26, 74, 75, 75,113,255,254,125,184,186,186,138,164,114,249,107,180,232,215,141,219,128,214, 69,163,233,211,161, 67,135,100,
+181, 90,141,111,190,249, 70, 32,182,179,251,101, 17, 32,172,197, 85,116,236,220,185, 51, 14, 29, 58,132,236,180,180, 57,105, 85,
+ 24,151, 52,160, 32,253,201,147, 57, 27, 55,110, 68,175, 94,189,192,136, 68,117,238,136,212,174, 93,187,112,158,231, 17, 27, 27,
+ 11, 71,224,122, 93,143, 15, 12, 10,138,176,181,181,197,131, 7, 15, 96,243, 44,186, 86,229,139, 2,112,233,206,157, 59, 80, 40,
+ 20,104,220,164, 73,203, 58,158,230, 91, 47, 47,175,156,119, 63,248, 4,251,143, 95, 1, 0, 28,220,183, 45,175,146,185,162, 80,
+ 40,148,127,166,193, 42, 71, 44, 22, 67, 42,147, 65, 42,149, 62, 53, 70, 50,153,213,199, 50, 12, 3,185, 92, 94, 97,168, 42, 27,
+171,202,159,149, 74,165, 85,198, 5, 0, 44,185, 87, 34, 95, 27, 57, 66, 42,145, 72, 96, 50, 25, 65, 8,129, 76, 38,135,163,163,
+ 35, 2, 2, 2,160,211,105, 49,104,240, 48, 99,134, 74,114, 68,226,211,227,222,139,228,153,101, 89,104,181, 90,148,148,148,160,
+184,184, 24,165,165,165,208,235,245,176,162,117,176,162,170, 77, 79, 79,199,142, 29, 59, 80, 84, 84, 4,224,105, 7,234,114, 83,
+ 85,254, 51, 57, 57, 25, 91,183,110, 69, 74, 74, 10,132, 66,161,213,223, 79,100,100, 36,142, 28, 57, 34,236,218,163,199,134, 83,
+254,254,217,167,252,253,179,187,246,232,177,225,208,161, 67, 66,111,111,111,164,166,166,226,214,173, 91, 40, 41, 41, 1, 33,132,
+161, 69,191,238, 60, 6, 74,116,197,197,111,126,250,233,167,196,214,214, 22,223,172, 88,209,124, 9, 48,198, 90,227,226, 80,131,
+113,113,248,107,198, 5,132, 16,240, 60, 15,142,227, 94, 40,111, 12,195, 48, 98,177,184, 46,229, 25,120,186,212,150,181,250, 2,
+ 66,200,251,239,124,248,169,231,123, 31,205,199,185, 19, 71,202,255,158, 68,205, 21,133, 66,121, 21,169, 83, 19, 97,118,118,118,
+150, 86,171,109,232,239,239,143,204,204, 76, 55, 63, 63,191, 52,169, 88, 12,137, 84,106, 85, 31, 44,185, 92, 30,155,151,151,215,
+209,219,219, 27, 44,203, 86,152,169,231,155, 8,203,163, 50,247,239,223,135, 92, 46,175,117,156,185,128, 43,171, 31, 22, 22, 86,
+ 17, 9,114,116,116,132,163,163, 3,100, 50, 57,150, 45, 91,198,111,248,229,151, 31,229, 97,239,170, 63,156,244, 49,185,189,100,
+195, 75,189,128,214, 86, 72, 74,165, 50,182, 65,131, 6,237,149, 74, 37,246,239,223,143,212,212, 84,148,148,148, 64,167,211,193,
+104, 52, 66,167,211,193,100, 50, 65, 46,151,163, 73,147, 38,168, 87,175, 30,226,227,227,171,205,123, 73, 81,209,254,216,216,216,
+246,109,218,180,169,136,160,116,235,214,141,233,214,173,155, 75,249,239, 58,157, 14,133,133,133,184,113,227, 6, 78,159, 62, 13,
+134, 97,144,148,148,196, 25,245,250,157,180,232,191, 24, 6,224,170,112,227,198,223,166, 78,157, 58,169, 99,199,142,224,128,190,
+ 0,182,254,167,140, 75, 57,209,209,209,113, 28,199,117,108,212,168, 17, 84, 64, 91, 0, 7,235,100, 30, 31, 61,186,195,178,108,
+143,230,205,155, 99,255,158, 61,145, 0, 82,171,218, 79, 11, 68, 70, 68, 68, 64,175,215,227,126, 66,194,109,107,205,149,167,167,
+231,134,119, 62,252,116,226,176,209,111, 96,255,206, 77, 56,184,111, 91,198,143,107,150,251, 18, 66,204,180, 84, 81, 40,148,127,
+188,193, 42, 41, 42,186, 29, 23, 23,215,176,101,203,150,216,176, 97, 67,155, 14,237,219,103, 73,164, 82, 86, 42,145, 64, 96, 69,
+ 5,162,215,106,207, 92,190,124,185,109,175, 94,189, 68,215,174, 93,131,135,135, 71,133,193, 42,255, 41, 18,137, 64, 8,129, 82,
+169,196,177, 99,199,204,122,173,246, 76,109,186, 28,203,113,130,103, 6,143, 16, 2,149, 74, 5,137, 68,130,245,235, 55, 96,211,
+ 47,191,188,158,153,147,179, 55,184,149,211, 71, 0,228,255,177,138, 89,167, 59,123,230,204,153, 86, 51,103,206, 20,251,248,248,
+ 64,165, 82,161,164,164, 4, 69, 69, 69, 40, 45, 45, 69,105,105, 41, 74, 74, 74,160, 82,169, 32,151,203,241,232,209, 35,139, 65,
+167, 59, 91,157,158,204, 96,216, 55, 97,194,132,143,239,220,185,227, 41, 18,137, 96,177, 88,192,243, 60,120,158,135,217,108,198,
+163, 71,143, 16, 31, 31,143, 7, 15, 30,160,184,184, 24, 98,177, 24, 66,161, 16, 49, 49, 49, 37, 54, 22,203, 30, 90,244, 95, 28,
+ 49,176,255,242,229,203,147,198,141, 27, 7, 47, 31,159, 46,200,204,180,202,184, 28,168,193,184,168, 95,192,184,252,201,248,104,
+ 52, 55,147,147,147, 59,118,237,218, 21,158, 62, 62,203,155,100,102,158, 74,168, 67, 63, 44,142,101, 47, 93,190,124,185,199,248,
+241,227,177, 97,195,134,229,174,201,201,199, 11,158,107,206,116, 5, 92, 27, 4, 6, 46,159, 56,113, 34, 78,158, 60, 9,142,101,
+171,141,200, 61,215,161,189,254,224,225, 99,125,105,135,118, 10,133,242, 79,162, 78, 77,132,140, 86, 59,119,222,188,121, 22,161,
+ 80,136, 97,195,134,217, 29, 60,116,104, 68,204,221,187, 1,249,249,249,142, 28,199,213,170,101,167, 86,175, 89,188,120,177,202,
+ 98,177, 32, 36, 36, 4,197,197,197,224, 56, 14, 34,145, 8, 34,145, 8, 12,195, 64, 32, 16,192,214,214, 22,241,241,241,216,181,
+107, 87,169,157, 90,189,166, 54, 93,158,231, 99,127,255,253,119,136, 68, 34, 34,151,203,193, 48, 12, 68, 34, 17,214,175, 95,159,
+ 63, 55, 39,103, 63, 0, 8, 5, 2, 19, 0, 8, 4,140, 85,189,114, 25,134,169,181,125, 82, 42,149,130,127,218,185,191,214,125,
+ 93, 45,150,213,235,214,173,211, 36, 37, 37, 65,171,213, 86, 68,219,202,202,202, 42, 58,205,171, 84, 42, 48, 12, 3,131,193,128,
+139, 23, 47,106, 92, 45,150,213,213,233, 21, 1,185,153, 73, 73,131,218,180,105, 83,148,156,156, 12,181, 90,141,216,216, 88,156,
+ 62,125, 26,187,119,239,198,201,147, 39,241,232,209, 35,176, 44, 11,111,111,111, 16, 66,112,224,192, 1, 53,171,209,244, 45, 2,
+114,105,209,175,158,250, 30, 30, 61,220,221,220,210, 93, 93, 92, 50,235,123,120,244,120,254,255, 14,192,195,135, 15, 31,130,101,
+ 89, 4, 4, 4,212,171,169, 31, 22, 97,217,203,151, 47, 95,198,248,241,227,225,219,176,225, 50,127,192,245,249,125,252, 1, 87,
+255,192,192,101,229,198,133,176,236,229,186,166,217, 14,248,238,163,143, 62,210, 75, 36, 18,236,218,181, 43,192, 18, 20,244, 64,
+ 4,140,177, 5, 66,187, 2,146,218,142,247, 4,126,252,252,243,207,115, 25,134,193,182,109,219, 92, 28, 2, 3,227, 68,192, 4,
+ 7,160,190, 3, 80, 95, 4, 76,112, 8, 12,140,219,181,107,151, 11,203,178,152, 49, 99, 70,174, 39,240, 99,117,122, 66,161,240,
+253,236,236,236,129, 89, 89, 89,157,179,179,179,125,127, 92,179, 28,231, 78, 28,193, 79,171,151,110,204,201,201,121, 43, 47, 47,
+239, 70, 86, 86,214,184,204,204,204, 56, 90,226, 40, 20,202,171, 8, 83, 85, 63, 39,113,219, 37,121, 0,113,235,210,174, 25,110,
+222, 77, 84,187, 56,217,159, 40,255,159,234,254,254, 70, 3,218,121, 52,251,230,155,111, 32, 18,137,144,145,145,129,132,132, 4,
+216,219,219,227,131, 15, 62, 48, 90,140,198, 65,229,235,157, 49, 12, 19, 69, 8, 57,253, 76,243, 20,203,178, 78, 50, 99,134,109,
+132, 83,114,195,173,155, 55, 10,237,236,236, 80, 86, 86, 86, 49,173,128, 82,169,132, 66,161,192,189,123,247, 48,254,141, 55,185,
+199,108,243,138,137, 70,203,215, 59,171,172, 9,134, 17, 2, 64, 95, 39, 39,229,125,153,108,150,179,187,251,236,247,222,123, 79,
+209,165, 75, 23, 72, 36, 18,180,106, 27,153,107,211, 98,246,119, 2, 1,195,102, 22,149,206, 11,172,239,229,144,144,148, 10,128,
+121,186,102,225,179,181, 8,171, 74,103, 83,249,189,128,173, 63,125, 97, 31, 22, 22,246, 52,223, 42, 21,242,242,242,144,159,159,
+ 15,149, 74, 5,173, 86, 11, 0, 56,125,250, 52,206,222, 72, 46,205,177,237,249,164,186,116,254, 43,239,169,118,141, 21, 15, 27,
+124,183,122,165,208,209,209, 17,121,121,121, 40, 40, 40,128, 74,165,130, 94,175, 7,199,113, 40, 45, 45,197,161, 35, 71,185, 39,
+ 92,211, 20,163,172,190,166, 54, 77,104, 51, 20,245,202,174,120, 71, 52,241, 39,147, 38, 77,178,179,183,183, 7,207,243, 40, 41,
+ 41, 65,122,122, 58,146,147,147,113,241,226, 69,109,190,202, 4,173, 75,207,204,242,137, 70,171,188,158, 47,171, 80,253, 47,106,
+ 62, 43, 75, 0,224,229,233,153,157,150,150,230,198,113, 28,188,189,189, 89, 85,113,241, 50, 41,112,210, 14,200, 1, 64, 10,129,
+207, 86,127,247,221,155,131, 7, 15, 70,235,214,173, 51,114,243,242, 26, 84, 85,150,192, 48,194, 16,192, 65,231,227, 19,127,227,
+198, 13,143,244,244,116,140, 31, 63,190, 48,237,241,227,138,105, 26,212, 64,164,127, 96,224,178, 93,187,118,185, 52,108,216, 16,
+ 77,155, 54,205,149,151, 79,211, 80,117,249,172,254,222,124,248, 71,131,105, 67,195, 91,191,243,206, 59, 96, 89, 22, 23, 47, 94,
+196,245,235,215,145,150,150,134, 43, 87,174,168,236,109,108, 70,213,116,111, 66,157,104,215, 55, 88, 27,176,109,219, 86, 70, 34,
+145, 96,227,198,141,184,115,231, 14, 0, 32, 34, 34, 2, 19, 39, 78, 4,203,178, 24, 59,118, 28,249, 35, 81, 81, 49,209,104, 85,
+101,201,199,199, 39,156,231,249, 21, 12,195, 72, 8, 33,173,179,179,179,229,222,222,222,217,217,217,217,190,117,233,115, 69,203,
+ 39,213,164,154,255, 28,205, 87,141, 90,215, 34,252,114, 45, 28,254,188, 28,199,219,217,191,255,186, 68,212,187, 79,223,208,121,
+159,206, 21, 68, 68, 68,192,215,215, 23, 17, 17, 17,184,115,231,142,172,113,227,198,181,173,119, 86,214,107,200,164,228, 94,189,
+122, 57,190,251,238,187, 14, 93,186,116, 17,123,121, 61, 93, 87, 55, 62, 62, 30,199,142, 29, 51,239,216,177,163, 52, 75, 26,169,
+186,114,236,215, 50,107,214, 59, 59, 86, 82,162, 3,240, 69, 51,147,233,151,207,231,205, 91, 16,214,180,233,164, 15, 63,252, 80,
+ 96,107,163, 20, 47,153,247,150, 28, 0,190,252, 97,183,195,224, 17,175, 99,117, 16,208,101, 76,213,235,188, 85, 78,103,102, 78,
+126,218,152,137, 35,130,222,125,107, 12, 55,112,224, 64, 27, 91, 91, 91,248,250,250,194,201,201, 9, 41, 41, 41,136,141,141, 37,
+167, 78,157, 42,187, 29,159, 34,222,180,251,100,154,212,214,205,154,117, 3, 53,189, 6, 79, 72,153, 48, 97,130,211,208,161, 67,
+237,194,194,194,196, 98,177, 24,114,185, 28, 69, 69, 69,200,200,200, 48,159, 63,127,190, 44, 75,210,190,228,202,241, 77, 26, 43,
+215, 34,212,119, 30,189,232,209,165, 83, 11,103,196,199,198,142,227,129,230,102,179,217,155,227, 56, 70, 32, 16,228,240, 60, 31,
+107,214,104,126, 51, 70, 44, 92, 69,215, 34,180, 14,142,227, 36, 28,199, 65,165, 82,225,212,169, 83,162,199,143, 31,127,118,247,
+238,221,207,178,179,179, 97,177, 88, 48,124,248,112, 68, 68, 68,224,220,185,115, 40,200,203, 59, 92,147, 86, 34,160,150,101,102,
+ 78,124,251,237,183,143,109,221,186, 85,112,247,238, 93,151,141, 27, 55,254, 90,149,113, 25, 55,110, 28,159,151,158, 62,209, 88,
+195, 28, 88,181,220,155,133,199,119,125,127,119,200,176, 17, 77, 22,206,255, 76,220,161, 67, 7,184,184,184, 32, 50, 50, 18,102,
+179,217,209,138,123, 83,211,185,207,168, 39,205,155, 55,183, 89,181,106,149,199,155,111,190,137,233,211,167, 3, 0,244,122, 61,
+ 78,158, 60,137, 25, 51,102,228,166,139,218,106,111,159,219, 85, 99,249,124, 22,153,234, 9, 0,222,222,222, 23, 0,116, 6,240,
+132,118,104,167, 80, 40,255,104,131, 5,252,107,189,179, 75,215,227, 80,121, 57,142,167,184, 38,176, 46,195, 31, 79,157,189,188,
+169, 20, 90, 39, 49, 99,180,143,185,115,135, 73, 78, 78,174,241,100,229,235,157, 25,101,190,101,202,236,194, 54,223,173, 94,253,
+193,134, 13, 27,122,148, 79,197, 32,151,203, 99,245, 90,237, 25, 59,181,122,141,177,161,239,153,186,174,157,119,175,184, 56, 15,
+192,180, 80,142,251,238,141, 73, 83,190, 22,216,250,136, 63, 93,178,193, 32, 20, 8, 76,143,178, 11,176, 58, 8,176,177, 98,192,
+163,206, 4,196, 22,185,177, 9,232,154,184,124,209,162, 89,171,191,253,182,141,210,214,182,139,133,101,131,121,158, 7,225,184,
+ 36,189, 94,127, 1,102,243,141, 76,175,201,223, 74,109,221,136,181,235, 6, 26,229, 13, 52,238,218, 11,109,246,237,217,243,254,
+177, 99,199,254, 45,239,158, 60,255,221, 19,251, 6,167,173,201,123,229,125, 12,192, 85,228,231, 95,173,246,109, 3,116, 45, 66,
+171,111, 10,158,159,236,228,228,180,165, 71,143, 30,242,168,168, 40,244,239,223, 31, 29, 58,116, 0,207,243, 32,132, 64,163,209,
+ 96,247,238,221,248,250,235,175,147, 26, 0, 95,212,166,103, 4,206,200,142, 30,237,219,188,121,243,141, 53, 25,151,103,230,170,
+214, 62,135, 53,223,155,178, 36,214, 97, 80,234,232,119,151, 6,153, 74,115, 28,157,149,172, 71,124, 92,172,192,218,123, 19, 14,
+ 33, 26,238,206,238,182,195,135, 14,125, 87, 40, 18, 69, 62, 27,209, 72,238, 39, 36,220, 46, 95,236, 25, 17, 19, 79,213,165, 44,
+ 17,242,116,238, 57,218,161,157, 66,161,252,227, 13,150, 72, 36,202, 47,143,242,136, 68,162,252, 39, 7,166,188, 94,147,136,175,
+167,103,143,103,111,199,168,109, 45,194,242,207,119,213,106,205,179, 25,218,171,156, 68, 84,252,220,254,117,201,212,131,252,252,
+ 68, 0, 3,128, 52, 32,241,105,119, 22,113,155, 47, 63,169,156,167,106, 47,200,159,206, 43, 41, 78,205,203,187,132,167,205, 57,
+ 85,118,198, 21,251, 73,138,107, 75,231,243,121,191,156,145, 81,250, 44,223, 85,231,221,163,246,188,139,234,120,125, 68,127,225,
+122,254,211,200, 42, 44, 60, 0,192,214,231,200, 17,247,227, 71,142,188, 54,107,230,204,225,158, 94, 94,129, 46, 46, 46, 78,118,
+118,118,130,107,215,174, 37,179, 6,195,119, 45,128, 77,215, 1,157, 53,154, 70,224, 76, 72,122,122,216,200,161, 67,223,101, 68,
+162, 78,149,141, 11, 97,217, 43, 1,192,143, 70, 43,102,111,175,243,189, 41,171,251,189,153,249, 52, 29, 75,192,178, 75,112,239,
+222, 95,190, 55,121,158,255,210,219,219, 91, 67, 59,180, 83, 40,148,127, 20,127,231, 58, 60, 0,162,168, 38,213,124, 85, 52,159,
+122, 20,216,211,235, 73, 53,169, 38,213,164,154, 47, 95,243, 31,189, 22, 33,133,242, 15,127, 25,225, 0,148,210, 43, 65,161, 80,
+ 40,148,218, 96, 0, 68, 85, 83,153, 88, 61, 58,128, 97,152,168, 23,168,172, 78, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243,
+159,165, 89,155,246, 43, 51, 58,145, 54, 17, 82, 77,170, 73, 53,169, 38,213,164,154, 84,147, 54, 17,190,220, 77, 0, 10,133, 66,
+161, 96,209, 34, 70, 0, 48, 12,176, 72, 0,236, 21, 2, 35,133, 79,127,127,113, 70,142,100,170,156,132,246,253,247, 25, 59,122,
+197, 41,148, 87, 27,218, 7,235, 63,136,167,167,167,159,187,187,251,207,132, 16, 38, 63, 63,127,114, 78, 78, 78, 58,189, 42,255,
+125, 56, 59, 59,247, 96, 89, 22,106,181,250,204,171,152,191,176, 32,102, 40, 17,160,241,191,194,218, 72, 79, 72, 34, 91,170,218,
+183, 73, 48, 51, 30,204,191,230,210, 98,120,220,143,127, 68,126,183,246, 92, 12,195, 8,134,244,117, 93, 1, 0, 7,142, 21,204,
+254, 59,230,197,242,242,242,106,228,236,236,124, 66, 40, 20,138, 56,142,155, 22, 27, 27,123,164,122, 3, 52, 82, 8, 0,174,138,
+253,115, 29,235,185,204,249,124, 22, 35, 54, 25,191, 81, 25, 13, 6,181, 64, 36, 74,145, 74,148,151, 89,129,205,177,204,188,190,
+ 9, 85, 29,191,103,207,158,106, 87,215, 14, 15,102,250,134, 54,105, 50,176,101, 83,197,147, 21,107,218,172,238, 18,224, 34, 78,
+206,136,177, 93,187, 37,253,103, 87, 39,239,129, 31,188, 37, 58, 34, 35,220,184,229,191,146, 50,122,151, 89,207, 87, 12, 83,207,
+ 12, 52, 21,203,100,190, 28,203,186, 51, 0, 17,138, 68,121, 22,163, 49, 67, 2,220,155, 67,136,234, 85,215,148,200,100, 62, 28,
+203,186, 3,192,127, 99, 58, 41,181, 24,172,192,192,192, 91, 2,129,192,167,124,141,191,202,139,213,150,127,126,254, 39,199,113,
+153, 15, 30, 60,104,101,237,201, 27, 54,108,104,111, 48, 24, 94, 99, 24,230,117, 0, 32,132,108,151,203,229,187,147,147,147, 95,
+168, 35,113,195,134, 13,237, 9, 33,179, 21, 10, 69,119,131,193, 16, 6, 0,114,185, 60, 94,175,215,159,101, 24,102,197,139,232,
+ 50, 12, 35,242,244,244, 28,105, 99, 99,211,141,101,217,110,132, 16, 70, 36, 18,157,211,233,116,103,115,114,114,246, 16, 66,216,
+186,106,122,121,121, 41,156,157,157,151, 4, 5, 5,141,121,247,221,119,139,234,213,171, 23,178,104,209,162,155,225,225,225, 59,
+138,139,139,231,101,103,103,235,255, 27, 10, 7,195, 48,129, 30, 30, 30,219,197, 98,177, 48, 35, 35,163, 27, 0,248,250,250,158,
+ 51,153, 76, 92,126,126,254,235,132,144,199,117,209,115,117,117,181, 17,139,197,237,108,108,108, 90,217,216,216,116,230, 56,174,
+241,179,245, 19,239,107,181,218,139, 22,139,229,150,197, 98,185, 86, 80, 80,160,253,111,185, 65, 24,134,177,115,115,115,219,202,
+ 48, 12, 24,134, 9, 38,132,104, 94,181,135, 0, 17,160,113, 66,252,131,144, 10, 19, 21, 22, 90,195, 5,129, 95, 21,251, 90,109,
+176,250,245,112,236, 51,112, 96,115, 1, 0,152,205, 55,251, 0, 56,250,178,205, 85,191,126,253,174,126,247,221,119, 78, 6,131,
+ 1, 31,125,244,209,246,224,224,224, 31,147,146,146,230,214,116,156,157,157,221,140, 47, 22,255,160,124,246, 44,115,227,121,222,
+ 45, 39, 39, 35, 56,241, 65,108,159,196,196,184,165,102,237,239,215,204, 68, 56, 69,165, 27,244,192,154,116, 52, 9,100, 6, 12,
+ 30, 57,180,255, 23, 95, 44,196,152, 81, 99,234,199,199, 27, 20,222,246, 79,164,165,102,155, 32, 23, 23,159, 65,159,124,186,156,
+185, 22,125,126,208,158,221, 27,206,126, 50,137,233, 78, 77,150, 85,247, 34,243,165, 72,212,206, 41, 52,180,243,168, 3, 7, 96,
+235,235, 43, 18,201,100, 2, 0, 96,141, 70,223,178,140, 12,207, 93,131, 6,181, 93,196, 48,231, 23, 16,114,157,106,254,255,107,
+ 82,172, 52, 88, 2,129,192,231,206,157, 59,110, 54, 54, 54,120,102,126,192,113, 28, 56,142,171, 88, 84,152, 16, 82,241,147,101,
+ 89,116,237,218,213,170, 55, 88, 79, 79,207,238, 0,222, 8, 15, 15, 31, 62,123,246,108, 73,199,142, 29,193,113, 28,206,158, 61,
+ 27,185,122,245,234,239,189,188,188,246, 3,216,148,147,147,115,198,218, 55, 92, 79, 79,207,222, 54, 54, 54,219, 62,251,236, 51,
+251,200,200, 72,145,167,167, 39, 0, 32, 63, 63,191,221,229,203,151, 91, 45, 92,184,112,154,167,167,231,216,156,156,156, 19,214,
+ 94, 28, 31, 31,159,240,224,224,224,189,125,251,246,245,105,213,170,149,188, 81,163, 70, 32,132, 32, 38, 38,230,205,196,196,196,
+209, 71,143, 30, 93,224,227,227, 51,194,218,245,212, 24,134, 97, 2, 3, 3, 39,120,120,120, 44,153, 57,115,102,189, 33, 67,134,
+ 72,227,226,226, 74, 2, 2, 2,152,253,251,247,187, 30, 62,124,120,218, 79, 63,253, 52, 50, 40, 40,104,222,227,199,143, 55,147,
+170,214, 49,122,142,224,224,224, 91, 2,129,192,199, 26, 3,204, 48, 12, 88,150,181,202, 4, 51, 12,211,162, 65,131, 6,187, 47,
+ 93,186,212, 32, 53, 53,149, 27, 50,100,200, 22, 0, 56,123,246,108, 83,139,197,194,244,234,213,235, 24,195, 48,175, 17, 66, 98,
+172,201,187,183,183,119, 51, 87, 87,215,131, 67,134, 12,169,231,231,231,167,244,241,241, 97,228,114, 57,132, 66, 33,202,202,202,
+188, 18, 19, 19,163, 98, 98, 98,244, 87,174, 92, 41,246,246,246, 30,148,149,149,117,175, 14, 15,222, 14,110,110,110,227,196, 98,
+113, 56,203,178,222, 0, 32, 18,137,178, 44, 22, 75, 92,126,126,254, 86, 66,200,213, 23,189, 65,220,221,221,191, 95,178,100,137,
+ 75,126,126, 62, 89,182,108,217,247, 0, 38,188,170, 15,131,237, 59,246,224,214,205,235, 0, 32, 97, 24,134,121,190,252, 49, 12,
+195, 52, 14,134,228,195, 15,103,162, 85,235,182,120,125,204,200, 90, 53,135,244,119,249, 66, 42, 20, 57,235, 76,198,235,133,106,
+193, 65, 63, 55,233,208,177, 35, 91, 61, 1,128,227,199, 98,135,182,109, 91,239,178,139, 3, 63, 88, 41,149,181, 53,113,108,209,
+129, 63, 10,231,215,197, 76,121,120,120,156,176,179,179, 83,150,148,148,228, 22, 21, 21,173,237,215,175,223,151,171, 86,173,114,
+122,242,228, 9, 50, 50, 50,240,198, 27,111,216,102,101,101,189,235,231,231, 23,157,158,158, 94,109, 36, 75,163,209,172, 89,178,
+120,230,124, 59,123, 39,161, 82, 97, 3, 91, 59,123, 52,104, 16,140,214,109, 34, 17,213,115, 16,158, 60, 73,108,183,123,231,134,
+ 59,194,156,189, 95,113,210,136, 47, 85,170, 6,213, 62,151,194, 66,152, 46,229,230,106,254,252,133,120,248,224,129, 38, 53, 69,
+240,222, 31, 7, 68,202,190, 61, 66,101, 38,115, 89,234,181,232,243, 13,218,181,239, 10, 0,173,246,236,222,112,118,209, 88,166,
+199,130,109,175,158,121,127,153,230,234, 11,177,120, 66,239, 85,171,220, 34,166, 77,147,148,165,164,152,159,172, 91,167,203,187,
+120,145, 19,201,100,196,183, 79, 31,198,181, 91, 55,249,180,251,247, 37, 87,150, 45,235,188, 84, 42, 13,248,212,100,218, 70, 53,
+255,255, 52, 41,117, 51, 88,176,177,177,193,174, 93,187, 32, 22,139, 33, 18,137, 32, 22,139,171,253,236,231,231,103,141, 9, 26,
+ 22, 22, 22,246,195,204,153, 51,221, 7, 14, 28, 8, 39,167, 63,175,178, 49, 96,192, 0,244,235,215, 79,146,156,156, 60,122,207,
+158, 61,163,183,108,217,146,235,233,233,249, 94,206,179, 5,155,107,168,188,187, 5, 4, 4,236,223,177, 99,135, 66,175,215,227,
+252,249,243, 40, 41, 41,129, 84, 42,133,143,143, 15, 58,117,234, 36, 58,127,254,124,189,209,163, 71,239,247,246,246, 30,144,149,
+149,117,174,182,180,122,120,120,180,114,117,117,189,240,203, 47,191,200, 67, 67, 67,153, 71,143, 30,161,121,243,230, 0,128,162,
+162, 34, 12, 24, 48, 64, 62,116,232,208,192,119,222,121,231,154,135,135, 71,151,220,220,220, 91,181,228,189,101,243,230,205, 55,
+247,233,211,199,107,206,156, 57,246,182,182,182, 72, 77, 77,205,241,240,240, 8, 46, 55, 63,131, 7, 15,150,246,236,217,211,115,
+237,218,181,107,142, 30, 61,250,145,167,167,231,132,156,156,156,219, 53,233, 10, 4, 2,159,219,183,111,187, 41,149, 74,228,229,
+229, 97,251,246,237,120,247,221,119, 33, 20, 10,145,159,159,143,221,187,119,227,189,247,222,131, 80, 40,132, 90,173,182,202, 4,
+219,216,216, 68, 53,111,222,252,215,179,103,207,250, 56, 58, 58,194,203,203, 75,240,249,231,159,135, 7, 4, 4, 40,234,215,175,
+ 47,204,201,201,193,254,253,251, 3,198,141, 27,119, 80, 46,151,191,105, 48, 24,106,109, 58,115,118,118,254,109,243,230,205,126,
+119,239,222,197,186,117,235, 80, 92, 92, 12,169, 84, 10, 71, 71, 71,120,120,120, 32, 56, 56,152,153, 54,109,154,178,123,247,238,
+202,133, 11, 23,254, 6,160,133, 21, 15,221,230,110,110,110, 63,143, 30, 61, 58, 96,209,162, 69,142, 30, 30, 30, 40,127, 33, 80,
+171,213, 62,169,169,169,237,230,207,159, 63,194,221,221, 61, 57, 63, 63,127, 10, 33,228,110, 29, 31,234, 45,122,244,232, 49, 96,
+200,144, 33,194,156,156, 28,108,221,186,117, 0,195, 48, 45,172, 53,149,255,107,220,186,121, 29,147,223,249,160,204,203,215, 87,
+114,248,208,206,193,101,101,191, 92,182, 21, 56,138, 0,160,140, 87,177, 29,219,217,118, 26, 56,104,180,164, 95,255, 33,101,191,
+252,180,198,214, 26,131, 37, 21,138,156,119,109,155,154,113,241, 74, 82,227, 19,167, 83,163,134, 12,138, 18,136, 36, 33,129, 0,
+ 48,107,230,219,210, 3,135, 78,255,216, 59,170,126, 78,231,142,193, 25,163,198,174,243,173,139,185, 10, 8, 8, 56,127,226,196,
+ 9,119,169, 84,138,146,146, 18,231,141, 27, 55,174,108,219,182,173,224,241,227,199,120,240,224, 1, 82, 82, 82,160, 86,171,209,
+166, 77, 27,219,132,132,132,181, 0,170, 53, 88, 5,250, 97, 75, 2,220, 10,191,243,118,118,106, 96, 48,171,221, 56,182,168,201,
+217,211,119,155,237,219,163,139,112,243,240, 9, 30, 61,122, 50, 62,153,187, 92,252,251,190,205,243, 47, 92, 60, 9,160, 65,245,
+ 51,248, 19,116,248,116,222, 92,148,106,140, 24, 59,230,109,140, 27,243,182, 51,129,201,147,112, 6, 27,147,190,196,209, 65, 18,
+127,100,243,206, 61, 67, 1,248, 84, 50, 89,103,168,201,170,158, 47, 68,162,182, 3,126,248,193, 53,252,173,183,100,119, 23, 45,
+210, 22, 94,188,168, 15,234,215,175, 36, 98,234, 84, 35, 0,104, 82, 82, 36, 15, 23, 44, 80,186,118,238,172,104, 63,123,182, 19,
+103, 50,121, 44,102,152, 54,159, 19,114,163,174,154, 13,198,140,225, 86,236,223,223,250,218,178,101, 93,177,120,177,176, 91, 68,
+ 68,204,188,159,126,202,250, 43,154, 47, 51,157,217, 23, 46, 24,181,141, 27,163,233,240,225, 69,222,206,206,198,151,153,247,191,
+146, 78, 74, 21,117, 72,117, 65,146,144,144,144,188,196,196, 68,183,253,251,247,215,106,174,196, 98, 49, 60, 61, 61, 17, 25, 25,
+153, 31, 27, 27,235, 94,195, 67, 49, 35, 35, 35,195,135,101, 89, 72,165,210, 26, 19,166,209,104, 16, 27, 27,139, 81,163, 70,101,
+102,103,103, 87,251,224,173, 87,175,158,157,147,147,211,147,115,231,206,185,196,199,199,227,214,173, 91, 8, 8, 8,128,147,147,
+ 19,196, 98, 49, 44, 22, 11, 74, 75, 75, 17, 18, 18, 2,133, 66,129,126,253,250, 21, 22, 23, 23, 7, 20, 23, 23, 87,251, 32,171,
+ 95,191,190, 76, 44, 22, 39,237,219,183,207, 55, 60, 60, 28, 55,110,220,128,175,175, 47, 60, 60, 60, 0, 0, 41, 41, 41,184,124,
+249, 50,250,245,235,135,184,184, 56, 76,157, 58, 53,195, 98,177, 4,167,166,166, 26,171,109, 50,104,210, 36,103,207,158, 61,153,
+161,161,161, 6,173, 86, 43,200,203,203, 19, 95,188,120,145,213,104, 52,182,106,181, 90,172, 82,169,196,165,165,165, 34,173, 86,
+ 43, 22, 8, 4, 18,163,209, 40,190,118,237,154,176,168,168,200,190,166,235, 20, 26, 26,154,247,224,193, 3,183, 67,135, 14,161,
+105,211,166,216,191,127, 63,102,205,154,133, 43, 87,174,192,215,215, 23,123,246,236,193,236,217,179,145,152,152, 8, 23, 23, 23,
+116,239,222,189,198,239, 8, 0,130,130,130, 30,197,198,198, 6, 74, 36, 18, 60,121,242, 4,153,153,153,229,235,217,161,160,160,
+ 0,143, 31, 63, 70, 86, 86, 22,130,130,130, 48,102,204,152,199,153,153,153, 65,181, 21,180,150, 45, 91, 22,156, 57,115,198,165,
+ 89,179,102,200,203,203,131,163,163, 35, 28, 28, 28,224,232,232, 88,241, 57, 32, 32, 0, 51,103,206, 68,179,102,205,242, 83, 83,
+ 83,221,107, 51, 63, 77,155, 54, 61,113,230,204, 25, 23,123,123,123,228,230,230,162,180,180, 20, 34,145, 8, 74,165, 18, 46, 46,
+ 46,144,203,229, 0,128,164,164, 36,244,239,223,191,240,201,147, 39,189,173, 53, 71, 12,195, 8,220,221,221, 31,220,187,119, 47,
+152, 16,130,244,244,116, 36, 38, 38,226,157,119,222, 73, 50, 24, 12,161,175,210,154,122,149,250, 85, 73, 38, 76,156, 44, 25, 50,
+104,176, 46,230,214,113, 94,129, 11,104,211, 66,161, 2,128, 27, 49,122, 71, 61,186,160, 69,171, 62,130, 3,135, 14, 42, 55,111,
+250, 69, 12, 30,238, 96,144,152,240,144, 44,174, 78,123, 64,111,199,241,179, 63,232,211,184,115,199,206,162,210, 82,226,241,235,
+150,245,109,210,146,159,184, 3,128,127,195,128,188, 73,227,223,190, 97,111,207,228, 94,188,114,145, 93,177,230,248,253, 35, 39,
+ 84, 91,172,136, 44, 7,248,249,249, 69,255,246,219,111, 46,174,174,174,112,112,112,128, 86,171,133,217,108, 70, 66, 66,130, 97,
+215,174, 93, 22,123,123,123,187,220,220, 92,168, 84, 42,136, 68, 34, 68, 71, 71,167,231,230,230,250, 63,175, 85,222, 7, 11, 0,
+222,233,219, 88,220,164,123,176,147, 68,198, 42, 20,226,135,158, 96, 56, 25, 67,108,221,207,158,141,110,118,238,194,165,215,251,
+ 13, 24,229,218,190,125, 55, 44, 95,250,137, 37, 61, 55, 47, 66,165, 27,244,160,170, 62, 88,141,131,153,238, 67,134, 15, 29,249,
+197, 23, 11,177,112,254, 34, 28, 57,116, 64,109,107, 35, 48,218, 59,138, 29, 58,183,235,104,152,249,238,224, 12, 93, 89,166,239,
+202, 31,215,143,233,217,123,164, 79,187,246, 93,113, 45,250, 60,246,236,222,112, 75,194, 89,104,115,225,115, 44, 98, 24, 39,199,
+128,128, 41,239, 39, 37, 73,238, 46, 92, 88,198,102,103,151,180,154, 49,163,176,170,125, 51, 79,157,178,145,122,121,217, 59, 13,
+ 26, 84,111,141,191, 63,177,228,231,255, 92, 85, 31,162,170, 52,111,120,122, 58,254,126,238, 92, 15, 94, 36,234,242,238,244,233,
+138,168,168, 40,148,150,150,226,200,145, 35,216,177,125,187,209,195,221, 61,214,241,230,205, 59, 1, 57, 57,159, 89,171,217,106,
+198,140, 66,142,227,152,169, 75,151,246,124,152,145,209, 61,191,168,168, 62, 0,184, 57, 56,100,132,251,248,220, 90,181,109, 91,
+226,247, 13, 26,240,214,166,115,215,149, 43,238,199, 10, 10,222,114,116,116, 84, 20, 20, 22,138,100, 82,105, 81, 68, 80,208,158,
+175,166, 79, 63,111,186,115, 71, 34,247,241,177,119, 24, 48,160,206,121,111, 53, 99, 70,161, 90,167, 19,205,251,238,187,142,217,
+ 69, 69,245,181, 38, 83,144,186,172,204,131, 53,155, 5,118, 10, 69,145,127, 80, 80,190,230,204,153, 28,255,178,178, 15, 86,107,
+181,249,180, 84,254,197, 8, 22,195, 48, 32,132, 88, 21,189, 18,139,197,127,234,163, 85, 3, 18,161, 80,136, 27, 55,110, 32, 63,
+ 63, 31, 77,155, 54, 69,131, 6, 13,254,180,195,147, 39, 79,112,244,232, 81,168, 84, 42,180,108,217, 18, 0, 36, 53, 9,218,217,
+217,125, 56,119,238, 92, 71,163,209,136, 91,183,110,161, 85,171, 86,144,201,100,144, 72, 36,127, 50,127,249,249,249, 8, 11, 11,
+195,212,169, 83, 29,190,255,254,251, 15, 81,195, 26,114,132,144,233,163, 71,143,118, 11, 15, 15, 7, 0,100,100,100,148,167, 5,
+ 0,224,234,234,138,152,152, 24,180,106,213, 10,238,238,238,232,219,183,175,219,193,131, 7,167, 3, 88, 81,109,198, 37, 18, 65,
+104,104,104,235,103, 17, 34, 8, 4,130,135,246,246,246,174,238,238,238, 54,246,246,246,255,150,199,141, 27, 55,170,164, 82,169,
+197,154,139,154,155,155,139,240,240,112,168,213,106, 0,128, 86,171, 69, 80, 80, 16, 74, 75,159,118, 57, 51, 26,141,240,242,242,
+130, 94, 95,115,215,174,230,205,155, 47, 12, 13, 13,237,213,181,107, 87,153, 88, 44,198,221,187,119, 17, 17, 17,129, 93,187,118,
+193,207,207, 15, 74,165, 18, 73, 73, 73,104,218,180, 41, 46, 92,184, 0, 87, 87, 87,132,133,133,201, 90,182,108,121,169,184,184,
+248, 92,106,106,234,194, 26, 34,109, 2, 91, 91, 91, 92,184,112, 1,191,253,246, 27, 82, 82, 82,144,157,157, 13, 59, 59, 59,180,
+104,209, 2, 77,154, 52, 65,135, 14, 29,144,148,148, 4,166,150,194,196, 48,140, 71,112,112,240,145, 27, 55,110,184, 16, 66,176,
+117,235, 86,148,149,149,193,100, 50, 65, 32, 16, 64, 46,151,195,201,201, 9,221,187,119,135,171,171, 43,130,131,131,177,123,247,
+110,151,190,125,251, 30,125, 22,129,202,173,237,154, 58, 57, 57,125,176, 96,193, 2, 95, 55, 55, 55,164,166,166, 66,173, 86,195,
+221,221, 29, 93,187,118,245, 62,125,250,244, 7, 0, 86,189, 42, 15,129,242, 14,237, 12,195, 48,135, 15,237, 28,236,231, 41,109,
+220, 38, 66,227, 31,123, 91, 20,120,244,244,163,102, 79,175,135,255,189, 54, 45, 53,143,111,220, 58,158,118,248,208,206,235,247,
+ 31,226,160, 53, 77,216,133,106,193,193, 19,167, 83,163,154,133, 69, 10,191,251,113,193,224,201,147,122,203,234, 57, 69, 50,165,
+249,187,113,229,122,172,255,231, 11,231,184, 45, 94,184,236,240,137,211,169, 92,161, 90,176,196,154,244, 6, 6,212,251,126,223,
+122,145,139,198,244, 35, 98,174, 59, 0,226,246,104, 24,208, 8,165,165,165,144,203,229,242, 49, 99,198,112,115,231,206,213,217,
+219,219, 43, 69, 34, 17, 98, 98, 98,242, 5, 2, 65,239,218,116, 13,110, 78,132, 51, 91, 88, 34, 21,242,132,177,211, 51, 92,177,
+ 52, 46, 33, 25, 93,186,244,205,107,221, 42, 98,233,178,111, 86,125, 26, 16, 16,226, 58,102,236, 20,241,138, 21,159,173, 3, 16,
+ 89,149,206,253, 36,114,182, 73, 32,163, 0,208,255,139,197, 11,241,228, 73,146,211,228, 55, 84,139, 68, 50,133, 87,168,127, 71,
+187,117,191,157,235, 19, 20,212,160,254,228,137,111,254,241,203,198,223,250, 87,142,100,237,220,241,203, 65,134, 97,122, 88,115,
+109,255, 65, 52, 27,119,228, 8,202,210,211, 45,197,151, 46, 25,122,252,240, 67, 97,203,241,227, 87, 89, 88,214,165,188,174, 42,
+255,201, 48, 12,192,243,140,104,197, 10, 1,241,242,130,197,209,241,141, 57, 64,163,218, 52,151, 89, 44,195,134,180,104,209,255,
+215,109,219,224,239,239, 95,161,233,224,224,128,233,211,167, 99,218,180,105,178,123,247,238,181, 57,122,244,104,155, 45, 63,254,
+232, 62, 7, 24,102, 77, 58, 47,222,189,235,244,241,154, 53,243, 26,135,135,251,173,254,225, 7, 89,121,125,151,154,154, 26,252,
+195,247,223,251,119,143,138,202,251,228,227,143, 55,221,153, 53, 43, 12, 79,151,100,171, 86, 51,247,226, 69,211,177,226,226,183,
+246,236,221,235, 24, 18,242,180, 27,228,227,199,143,221,126,253,245,215,183,187,191,251,238,216, 89,163, 71,127,214,253,209, 35,
+149,125, 65,129,108,192,247,223,139,118,142, 28, 89,171,102,121, 58, 1, 96,248,236,217, 31,182,237,216,177, 73,223, 49, 99,234,
+121,121,121, 49, 10,133, 2,102,179, 25,121,121,121, 78,137,137,137,129,167, 85,170,210,147, 49, 49, 91,241,108, 17,119,202, 95,
+ 48, 88, 0,192,113,156, 85,230, 74, 36, 18,253,171,112, 91,115, 82,145, 8, 94, 94, 94, 40, 44, 44, 68, 92, 92, 28,252,253,253,
+ 97,177, 88,112,226,196, 9,168,213,106,136,197, 98, 72, 36, 18,152,205,181,175, 13,107, 99, 99, 19,213,185,115,103,209,213,171,
+ 87, 17, 16, 16, 0,133, 66, 81,145,174,242, 77, 34,145,192,211,211, 19,165,165,165,136,140,140, 20,111,220,184, 49,170, 38,131,
+101,107,107,219,111,240,224,193, 21, 33,182,178,178, 50, 8,133,194, 10,179, 82, 86, 86,134,226,226, 98,168, 84, 42, 24, 12, 6,
+ 52,107,214, 76,122,246,236,217,126, 53, 25,172,202,232,116,186,178,252,252,124,199,200,200, 72,167, 77,155, 54, 37,182,111,223,
+ 62,164,242,255,207,159, 63,111, 48, 24, 12, 98,169, 84, 90,235, 58,119, 12,195, 96,219,182,109, 21,215, 62, 43, 43, 11,235,214,
+173,171,248,127, 82, 82, 18,190,251,238,187,138,121, 57,106,250,142, 66, 67, 67,251,110,221,186,181,213,150, 45, 91, 74,132, 66,
+ 33, 18, 19, 19,177,125,251,118, 16, 66,224,234,234, 10,157, 78,135,188,188, 60,156, 59,119, 14, 44,203,194,214,214, 22,222,222,
+222,242,233,211,167,119, 90,180,104,145, 24,192,194, 26,202, 18, 39, 20, 10,225,239,239,143,249,243,231,195, 96, 48, 64, 34,121,
+234, 43, 75, 75, 75,161, 82,169,112,231,206, 29,164,166,166,162,182,202, 69, 46,151,143,216,178,101,139,155, 84, 42,133, 94,175,
+135, 70,163, 65, 70, 70, 6,210,210,210, 12,249,249,249,172,157,157,157,192,223,223, 95, 32,147,201,100, 67,134, 12, 97,202,141,
+230,128, 1, 3,156,183,110,221, 58,170, 54,115,196, 48,140,107,227,198,141, 63,125,251,237,183,229,149, 76, 55,114,115,115, 49,
+108,216, 48,229,213,171, 87,231, 50, 12,179,157, 16, 82,240, 42, 61, 12, 8, 33,164,172,236,151,203, 23, 15,254,208, 56,246,182,
+ 40,208,100, 42,105,223,179,223, 7, 34, 0,184,122, 97, 99,251,216,219,113, 80, 48,108,218,177,147, 43, 46,219,218, 78, 38,181,
+ 69, 0,251,245,112,236,227,231, 38, 29, 58,100, 80,148,224,215, 45,235,219, 76,158,212, 91,230,214,112, 61, 3, 0, 78, 18, 31,
+116,224,102, 9, 12, 70,173,252,215, 45,235,219, 12, 25,212,239,122, 74,114,218,170,254, 81, 78,191, 31, 61,163, 58, 94, 83,132,
+208,211, 77,228,237,100, 87, 8, 39,187, 8,248, 7,216,225, 78,204, 61, 28,220,127, 9,193,161,157, 96, 52, 26,193,178,172,205,
+192,129, 3,117,123,246,236, 49, 20, 21, 21,105,204,102,115,151,236,236,236,135,181,229, 63, 51, 51,129, 15,241,104,103,150, 40,
+100,172, 70, 45,209,205,249,108,239,200,150,109,123,181,114,242,244, 22,187,218,240,135,187,117,137,220,190, 99,219,207, 51,102,
+125,180, 24, 45, 90,180,111,127,255,209,177, 38, 0, 98,171, 52,173,143,201,145,240, 96,134,125,242,232, 81,255,180,212,212,204,
+ 70,238, 30,166,199, 42, 98,249, 96,206,250,158,145, 93, 70, 52, 11,108,220, 89, 26,159,112,129,153,249,238,219, 59, 86,254,184,
+126, 76,185,201,186,120,241, 68,151,133, 11, 83,165, 0,140,180,122,122,246,114, 42,147,249,216,250,251,139, 82, 54,109,210, 7,
+ 12, 28, 88, 2, 0, 22,150,117,137,190,118,205, 65,169, 84,130, 16, 2,139,197,242,167, 62,194,229,253,130,163,186,118,117,183,
+ 70, 51,227,167,159,154,189,251,238,187,200,205,205, 5,203,178, 16,139,197,207, 63,179,161,209,104, 48,124,248,112,108, 92,187,
+182,157, 53,154, 28,199, 49, 31,175, 89, 51,111,250, 7, 31, 4,142, 29, 59, 86, 80,249,217,235,232,232,136, 95,214,175,151,110,
+218,180,201,103,249,111,191,189,209, 83, 38,123, 82,155,166, 38, 44, 12,142,177,177,138,114,115, 5, 0,129,129,129, 88,182,108,
+153,108,244,232,209,210, 9, 19, 38,124, 27, 31, 18,178,102, 97, 90,218, 35,231, 70,141,236,165, 50,153,143,181,215, 19, 0,202,
+ 76,166,240, 5, 95,124,225,116,253,250,117,100,103,103,151,207,117, 5,134, 97,208,180,105, 83,102,228,200,145, 14,237, 90,181,
+106, 67, 75,228, 75,138, 96,113, 28,247, 39,163, 82,155,193,170,115,251, 36,195,192,211,211, 19,102,179, 25, 27, 54,108,128, 68,
+ 34,169,168,116, 1,192,100, 50,213,170, 97, 48, 24,154,122,120,120, 64,173, 86,163, 81,163, 70,127,138, 92, 73, 36, 18,136, 68,
+ 34, 72, 36, 18,200,100, 50, 24,141, 70,120,123,123,195, 96, 48, 52,173,197, 0,181,176,183,183,175,168, 88,141, 70, 99,133,185,
+ 82,169, 84, 80,169, 84, 48,153, 76, 40, 41, 41, 65, 89, 89, 25, 84, 42, 21, 52, 26, 77,132, 53,121,230,121, 30,113,113,113,143,
+ 67, 66, 66, 90, 8,133, 66,216,218,218,218,104,181,218,138,190, 67,197,197,197,216,188,121,179,118,252,248,241, 46,215,175, 95,
+183,106, 33,225,247,222,123, 15, 50,153, 12, 58,157, 14,107,215,174,197,251,239,191, 15,137, 68, 2,141, 70,131,117,235,214, 97,
+230,204,153, 16,137, 68, 48,153, 76,216,181,107, 87,245,145,140,132,132,148,107,215,174, 69,180,108,217,210,233,247,223,127, 47,
+232,217,179,167,107,239,222,189,161, 80, 40,160,215,235, 97,177, 88,208,174, 93, 59,132,134,134, 34, 63, 63, 31,199,142, 29, 43,
+ 12, 14, 14,118,185,126,253, 58,159,155,155,155, 86, 91,229, 93,217, 96,115, 28,135,188,188, 60,168, 84, 42, 20, 20, 20, 32, 59,
+ 59, 27,153,153,153, 16,137, 68,168,237,229,221,217,217,121,120,120,120,184, 16, 0, 20, 10, 5, 90,180,104,129,121,243,230,177,
+122,189,254, 53, 0,199,158,237,214,119,253,250,245,191, 95,190,124, 89,228,229,229,133, 7, 15, 30,192,213,213, 85, 36,151,203,
+107, 53, 88, 30, 30, 30, 27, 15, 31, 62, 92,175,220, 84,151,151, 85,157,238,233,215, 49,108,216,176,122, 91,182,108,217, 8,160,
+223,171,246, 64,176, 21, 56,138,218,180, 80,168,142,158,126,212,172,103,191, 15, 68,158,129, 11, 0, 0, 29, 0,209,169,163,107,
+154,245,139, 10,218, 83,222, 47,171, 38,134,244,117, 93, 49,112, 96,115,193,216,145,173,158,136, 36, 33,129,219,182,172,113,175,
+231, 20,249,175,135,132,176, 30,108, 20, 64,104, 32, 39,136,222,249,196,125,230, 7, 33,166,237,155,222,122,178,109,207,173, 40,
+137,228,110,119, 0, 51,171,211,142, 79,180, 28, 82,107,235, 53,118,144,156,103, 32, 31,132,136, 22,193,112,117, 85, 97,237, 47,
+ 91,224,237,215, 17, 70,163, 17,246,246,246, 74, 0,102,179,217,188,205, 26,115, 5, 0,103,206,168,248,176, 48,149, 73,168,225,
+217,119,223, 95, 49,180,103,223, 65, 77,186,119,143,226, 79,158, 58,105,238, 24, 97,206,233,222,189,125,222,185,243, 23,147,114,
+115,179,130, 67, 67,155,225, 97, 98, 76, 31,128,137, 3,170, 46,176,113, 73,228,120, 96, 32,115,110,215,174,201,188,158,191,163,
+248,114, 73,108,223,254,253, 39,132,119,142,236,204,159, 58,125,214, 36, 69,225,125,219, 78, 29,178, 38,140,126,237,247, 93,251,
+127,239,117,238,236,145, 32,117,105,222,145,111,126, 36,212, 92, 85,126, 57, 99, 89,119,145, 76, 38, 40, 56,119,142,109, 58,105,
+ 82,197,181, 81, 42,149, 56,120,240, 32,164, 82,105,197, 38,145, 72, 42, 62,187,187,187,131, 33, 68, 80, 23,205,156,156, 28,228,
+230,230,194,193,193, 1,174,174,174,200,205,205,197,213,171, 87,241,240,225, 67,136,197, 98,244,233,211, 7,130,106,234,205,231,
+ 53,167, 46, 93,218,179, 81,227,198,126,207,155, 43, 60, 45,152, 40, 46, 46, 70, 84, 84,148,224,204,153, 51, 30,209,143, 30, 13,
+ 2,176,173, 70,205, 65,131,138, 10,206,156,169,242,220,225,225,225,204,193,131, 7,101, 99, 70,143,158,177,232,251,239,127, 92,
+242,195, 15, 25, 28,203,122,212, 37,239, 12,195, 8, 24,134,129,175,175, 47,138,139,139, 81, 86, 86, 86, 30,112,128,147,147, 19,
+ 44, 22, 11,120,158, 23,211, 18,105, 61,130,218,204,128, 53,230, 74, 44, 22, 67, 32, 16,188,144,201,170, 28, 33,120, 30,107, 12,
+ 86,121,229, 39,151,203,255,116,131,149,155,181,202,159,203,223,118,172, 64, 88, 90, 90,138,125,251,246, 85, 20, 52,147,201, 4,
+181, 90, 13,149, 74, 5,181, 90, 13,131,193,128,148,148, 20,236,220,185, 19,217,217,217, 16, 10,133, 86, 77,218,250,228,201,147,
+ 91, 13, 26, 52,104, 81, 94,121,119,235,214,205,231,226,197,139,217,229,215,224,179,207, 62, 43,108,215,174,157, 75,229,202,189,
+214,196, 10,133,184,122,245, 42,244,122, 61, 8, 33,144, 72, 36, 72, 76, 76, 4,203,178,224,121, 30, 34,145, 8, 5, 5, 5,181,
+ 70,176,226,226,226, 38,190,249,230,155,171, 39, 77,154,116,238,227,143, 63, 62,213,173, 91,183, 12,134, 97, 96, 54,155, 97,111,
+111, 15, 15, 15, 15, 36, 38, 38,194, 96, 48,224,195, 15, 63, 76,223,178,101,203,233,181,107,215,158,219,176, 97,195,234,204,204,
+204, 55,235,242,125,179, 44, 11,173, 86,139,146,146, 18, 20, 23, 23,163,180,180, 20, 6,131,225,133,202, 80,100,100, 36,142, 28,
+ 57, 34,236,209,163,199,175,254,254,254,185,254,254,254,185, 61,122,244,248,245,208,161, 67, 66,111,111,111,164,166,166,226,214,
+173, 91, 40, 41, 41, 1, 33,164,198, 19,136,197,226,110,227,199,143,239,228,231,231,199,152,205,102, 24,141, 70, 24,141, 70,152,
+205,102,240, 60,143,212,212, 84, 52,110,220, 88,224,239,239,223,158, 97,152,110,244, 17, 98, 61,165,249,187, 65,116, 63,128, 24,
+119,130, 47,253, 17,218, 23,156,140,164,164,164,100,201, 59,115,212,249,156, 49, 6, 9,177,231,161,209,121,195,167,225, 68,188,
+253,102, 55,220,184,118, 18,197,197,197, 72, 72, 72, 64,151, 46, 93, 36, 12,195,212,169, 92,158, 58,117,141,123,109,220,251, 35,
+186,245, 26,212, 42, 42,170, 31,123,226,196,105,211,237,155, 39,110, 5, 5, 58,229, 19,190, 44,207,209, 81,121,231,209,163,251,
+ 8,110,212, 4,102,139, 37, 18, 88, 88, 99,121,122,252,152,152,254,248,195,147,123,109, 82,220,184,222,125,222,104,222,163, 71,
+111,203,137, 83,135,185, 75,231,246,222,233,221, 59,240,194, 87,107,118,251, 22,155, 66,195,228,246, 30, 71,219,119, 82, 70, 78,
+125,221,111, 50, 45, 41,213, 68, 3,228,114, 30,207,158,139,229, 93, 88, 42,155,171,231, 55,107,234,164,202,154,149,235, 34,149,
+ 74,133,164,164, 36,124,243,205, 55,136,137,137, 1,199, 61,237,106, 87, 91, 55,139,202,154,137,233,233,221,223,127,255,125, 89,
+ 85,230,170,168,168, 8,133,133,133,200,202,202,194,128, 1, 3, 36,197, 78, 78, 45,107,211,244,118,115, 51, 42,229,242,188,135,
+ 15, 31,254, 91,122, 75, 75, 75, 33,149, 74,241,253, 15, 63, 72, 78, 60,120,240,206,137,179,103, 93,234,114, 61, 43,215,165,110,
+110,110, 8, 12, 12, 68, 68, 68, 4,154, 54,109, 10,185, 92,142,248,248,120,252,252,243,207, 16, 50, 12, 75, 75,226, 75,138, 96,
+213,197, 96,213,197, 16, 88,139, 53, 77,132,114,185, 60, 54, 47, 47,175,163,183,183, 55, 88,150,173, 48, 83,207, 55, 17,150, 71,
+ 59,238,223,191, 15,185, 92, 30, 91,147,166, 82,169,140, 21, 10,133,237,219,180,105,131,253,251,247,227,220,185,115, 72, 78, 78,
+134, 78,167,131,209,104,132, 94,175, 71,124,124, 60,120,158, 71,120,120, 56, 28, 28, 28,160, 84, 42, 99,107, 75,171, 86,171,205,
+ 17,139,197, 33, 10,133,226, 95,205, 29,158,158, 40, 42, 42,226, 45, 22, 11, 54,111,222, 92,234,225,225, 97,163, 80, 40, 80, 62,
+255,152, 53,230, 50, 63, 63, 31, 62, 62, 62, 21,125,176, 52, 26, 13,220,220,220, 96, 54,155, 43, 34,112,118,118,118,181,154, 75,
+ 66,136, 1,192,172, 74,218,173, 71,142, 28,185, 99,215,174, 93, 13, 79,159, 62,141,235,215,175,195,213,213, 21, 75,151, 46, 77,
+ 78, 77, 77, 29, 67, 8,185,249,178,191,115,107, 12, 86, 81, 81,209,190,216,216,216,246,109,218,180,169, 40,116,221,186,117, 99,
+186,117,235,230, 82, 57,164, 95, 80, 80,128, 27, 55,110,224,244,233,211, 96, 24, 6, 73, 73, 73,156, 94,175,223, 81,195,185, 37,
+254,254,254,155,230,205,155,103,203,178,108, 69,217, 86, 40, 20,144,203,229,144, 72, 36, 16, 10,133, 72, 77, 77,197,224,193,131,
+ 29,126,248,225,135,141, 12,195, 4, 18, 66,204,175,202, 3,161,140, 87,177, 55, 98,244,142, 78, 78,254,247,174, 94,216,216,190,
+195,179,103,196,213, 11, 27, 89, 39, 39,255,123, 55, 98,244,142,157,125, 85,172,109, 45, 58, 7,142, 21,204, 54,155,111,246, 57,
+126, 44,118,232,172,153,111, 75,253, 27, 6,228, 93,185, 30,235,223,129,155, 37,176, 81, 0, 90, 61, 80,172, 2, 30, 60, 22,242,
+254, 13, 3,242,110,222, 78,148,126,187,114, 67,128, 78,111,250,253,232, 25,213,241,154,180, 51, 51, 51, 13,222,222,222, 67,102,
+ 45, 82, 94, 24, 61,198, 77, 42,145,251, 66, 83,114, 27,245,253,157,241,218,240, 16,252,248,203,109,216,219,215,123, 26,193, 96,
+ 24, 27,107,243, 94, 88, 88,200,236,219,121,105,210,248, 55,222,110,215,187, 87,127,246,248,137, 63, 68,231, 78, 30,186,186,241,
+151, 79,127, 39, 66,173,146, 33, 26,133,175,159,207,189,148,228,135, 99, 58,119,238, 5,133, 84, 25, 4,132, 86, 89, 96, 43, 6,
+ 14, 16,164, 11, 4,144,143,127, 99,114,135,222,189, 7,177, 39, 78, 28,192,137,163, 91,174, 45, 88, 80,255,104,114,214,118, 73,
+244,205, 76,249,144, 17,211, 74,142, 28,187,111, 26, 62,176,193, 67, 47,155, 22,122, 90, 45, 61,247, 2, 41, 18,229,177, 70,163,
+175, 79,239,222, 66, 93, 90,154,216,214,221,157, 5, 0,139,197,242,111,166,170,114, 4, 75, 32, 16, 0, 2, 1,111,141,166,181,
+105,209,233,116,224, 1,214, 26,205,130,226,226,250,207,247, 49,182, 88, 44, 40, 42, 42,170,216, 84, 42, 21,228,114, 57, 74,158,
+ 77, 26, 90,155,102,231,102,205, 54,175,252,246,219,217,191,172, 95, 47,169,108,174,202, 55,129, 64,128,185,159,126, 42,153,255,
+213, 87,211,134,137, 68, 31,212,229,122,150,191,172, 11,133, 66,136, 68, 34,164,165,165, 33, 61, 61, 29,105,105,105, 72, 75, 75,
+131, 66,161, 0, 97, 24,158,150,200,151, 96,176,202,191, 60,107, 59,185, 91,107, 8,202,223, 4, 94,150,193,210,106,181,167, 47,
+ 95,190,220,182, 87,175, 94,162,107,215,174,193,195,195,163,194, 96,149,255, 44,111,118, 82, 42,149, 56,118,236,152, 89,171,213,
+214,184,144,164, 94,175, 63,115,230,204,153, 86, 51,103,206, 20, 79,156, 56, 17, 9, 9, 9,152, 50,101, 10, 84, 42, 21, 74, 75,
+ 75, 81, 84, 84, 4,157, 78,135,182,109,219, 66, 46,151,227,209,163, 71, 22,189, 94, 95,219, 84, 5, 36, 63, 63,191,204,213,213,
+213,243,249,127,140, 24, 49,194,253,167,159,126,210, 61,120,240,192,210,177, 99, 71,123,107,141, 70, 57, 59,119,238,172, 48, 79,
+ 15, 31, 62,196, 79, 63,253, 84,209,231,234,246,237,219, 88,177, 98, 69,197,220,101,117,140, 42,222, 12, 11, 11, 99, 45, 22, 11,
+130,130,130,202,155, 87,177,122,245,106,246,239, 48, 87,214, 98, 48, 24,246, 78,152, 48,225,147, 59,119,238,120,138, 68,162,242,
+208, 53,120,158,135,217,108,198,163, 71,143, 16, 31, 31,143, 7, 15, 30,160,184,184,184,226, 5, 32, 38, 38,166,196, 98,177,236,
+174, 78,215,213,213,245,179,223,126,251,205, 67,169, 84,254,169, 60, 11, 4,130,138,135,142, 68, 34, 65, 65, 65, 1, 28, 29, 29,
+209,163, 71, 15,183, 51,103,206,124, 6, 96,254,171,240, 48, 96, 24,134,233,216,206,182,211,123,211,222, 64,155,150,154,199,177,
+183,227,112,234,232,154,102,192,211, 78,238, 77, 91,134, 63,190,113,199, 14,125,123,205,238,116,229,218,148, 26, 59,185, 63,235,
+ 67,117,180,109,219,122,151, 15, 28, 58,253,227,156,153,111,223,248,124,225, 28, 55,131, 81, 43, 15, 13,228, 4,192, 83,115, 21,
+125,199,198,176,120,225,219, 55,150,173,220,204,167,231,155,103, 92,191, 94, 82,237,232,222,202,166,197,201, 22,114, 15,223, 25,
+217,245, 3,186, 55,136,189,189, 1, 46, 14, 37,176, 11,234,136,190,189,219,226,244,153, 88,164,101, 25,144,159,159, 15, 0, 53,
+ 78,123,240,224,222,239,227, 8, 67,252, 24,194,164, 51, 2, 34, 31, 55,225,173,200,254,253, 7,145, 35, 71, 14,177, 7,126,223,
+118,121,247,214,239,246, 10, 36, 98,145,222,228, 96, 98, 24,131,154, 23,216, 37,104,181, 69, 79, 31,158, 18, 73,245,203,221, 60,
+155,144,181, 73, 88,168,199,184, 9, 83, 28,250,245, 29, 76,142, 30, 61,192,239,222,181,249,220,238, 13, 77,183,241,130, 82, 73,
+ 78,134, 78,166, 46,181,168, 9, 35,117, 44, 43,229,117,121, 79, 2, 13, 94,253, 71,152,105,181,244, 92, 61, 96, 52,102,150,101,
+100,120,214,235,210, 69,246,104,225, 66,165,123,219,182,134,242, 46, 44, 53, 25, 44,161, 80, 8, 2,240,214,104, 90,155, 22,189,
+ 94, 15,194, 48,150, 23,209,100, 89,246, 79,230,170,220, 96, 61,123,214, 91,149,206,111, 62,252,240, 90,235, 55,222, 40,142,142,
+142,118,111,223,190, 61,163,209,104,160,209,104,254,100,178, 92, 93, 93,153,134, 1, 1,202, 19, 57, 57, 1,243,173,188,158,214,
+228, 93, 32, 16, 84,123, 61, 41, 47, 96,176,202, 35, 88,214, 24, 44,161, 80,104,141, 41,176, 88, 44, 22,184,185,185,161,176,176,
+176,218, 10, 95, 32, 16, 64,161, 80, 64,171,213, 2, 64,141, 35,233, 52, 26,205,234,197,139, 23, 79,239,214,173,155, 75, 72, 72,
+ 8, 10, 10, 10,224,238,238, 14,185, 92, 94,209, 55,172, 92, 47, 46, 46, 14,187,118,237, 42,213,104, 52,171,107,201,247,170,117,
+235,214,189,219,175, 95,191,122, 46, 46, 46,112,114,114,194,189,123,247,224,228,228,132,210,210, 82, 36, 38, 38,194,206,206, 14,
+ 12,195,192, 96, 48,224,226,197,139, 26,158,231, 87,213,114, 99,146, 43, 87,174,152,149, 74,229,189,130,130, 2, 97,113,113,177,
+168,164,164, 68, 84, 90, 90, 42, 86,171,213,226,227,199,143,187, 56, 56, 56,232,206,158, 61, 91,224,231,231, 39, 76, 73, 73, 17,
+154, 76, 38,129, 21,149, 34, 62,248,224, 3, 72, 36, 18, 24,141, 70,172, 94,189, 26,179,103,207,174,232,115,245,245,215, 95, 99,
+222,188,121, 21, 33,245,195,135, 15,215,213,100,193,108, 54,195, 98,177,192, 98,177, 88,101,122,255, 10,214, 24,117, 66, 72, 46,
+195, 48, 3,218,180,105,115,114,207,158, 61,206,118,118,118, 72, 77, 77, 69, 94, 94, 30,242,242,242, 80, 80, 80,128,178,178, 50,
+176, 44, 11,111,111,111,228,229,229,225,192,129, 3,106,141, 70,211,187,166, 17,132, 66,161,112, 66,100,100,164,232,249, 52,148,
+191,213,149,155,118,153, 76,134,236,236,108,116,235,214, 77,122,254,252,249, 9,255,235, 6,171,220,184, 52, 14,134,100,224,160,
+209,146, 22,173,250,232,110,220, 58,158,166, 96,216,180,126, 81, 65,123,128,167,211, 52,220,184, 99,135, 22,173,250, 8, 6,230,
+152,218,170, 74,126,105,209,164, 17, 99,174,105, 89, 29, 0,112,113,224, 7,247,142,170,159, 99,111,207,136, 22, 47, 92,118,248,
+215, 45,235,219, 68,239,252,215, 52, 13,139, 23, 62,157,166,161,119, 84,125, 54,225,193,195,193, 0,182, 88,107, 90, 6, 12,232,
+125,231,183,141,187,144,149,114,216,107,213, 23, 10, 41, 12, 37,128, 56, 4,145,237,236,113,243,199, 76,100,101,101,229,242, 60,
+ 95, 99, 51, 46, 97,136, 95,124, 66, 92,163,166, 97, 77, 60,198, 77,152,108, 63, 96,192, 96, 28, 57,114, 16, 91, 55,111,184, 56,
+124,244,176, 95,179, 74, 74,133,110, 98,165, 68, 73,120,169, 80,226, 32,146, 43,149,249,230,236,236,167, 15, 79,145,216, 30, 24,
+201, 3,213, 71,134,167, 78, 30,235,208, 61,106, 48,254, 56,122, 16, 91, 55,255,114,225,243,176, 17, 27, 26, 68, 52,102,218,182,
+252,102, 90,131,134, 13,252,181,101,121,165, 2, 70,106, 54, 24,120,187,111, 54,167,174,124, 50,111,194,147, 59,113, 35,191,165,
+163, 8,255,196,189,173,253,250,181,121,255,241, 99,137,107,167, 78,138,236,115,231,148,214, 24, 44,145, 72, 4, 8, 4,172, 53,
+154,204,169, 83, 2, 0, 53, 14,174,146, 72, 36,208,233,116, 96, 25,198,108,141,166, 91, 76, 76, 70,106,106,106,176,163,163,227,
+159,204, 85,113,113,113,197,103,131,193, 0,147,201, 4,133, 92, 30,111,141,102,222,197,139,134,121, 19, 39,206,127,247,157,119,
+190,219,185,107,151,220,193,193, 1,106,181,250, 79, 6,203,100, 50,161, 77,219,182,146,141, 15, 30,140, 3,176,192,154,235,233,
+222,173, 91,173,253,125,159, 25, 86,218, 68, 88,151,250,172,182,166, 26,107, 71, 17, 86, 85, 49, 50, 12, 19,245,220,239,243,250,
+246,237,107, 72, 78, 78,134,159,159, 95,133, 73,169,124, 78,123,123,123, 56, 58, 58,226,193,131, 7,216,176, 97,131,158, 97,152,
+121, 53,105, 22, 23, 23,107, 12, 6,195,168,209,163, 71,235, 37, 18, 9, 66, 67, 67, 43,230,191,226,121, 30, 82,169, 20, 54, 54,
+ 54,136,139,139,195,132, 9, 19,116, 6,131, 97,212,243,115, 96, 61,175,153,154,154,170,214,106,181,175,191,254,250,235,186,135,
+ 15, 31, 34, 50, 50, 18,119,239,222, 69, 89, 89, 25,202,202,202,144,146,146,130, 38, 77,154,192,100, 50, 97,239,222,189,122,173,
+ 86,251,122,106,106,170,186, 38, 77,141, 70, 51,112,249,242,229,194,163, 71,143, 54,240,241,241, 9,107,221,186,117, 72,143, 30,
+ 61, 2,135, 14, 29,234,223,175, 95, 63,207,224,224, 96, 67,239,222,189, 93,251,246,237,235, 42, 20, 10,197,143, 31, 63,206, 33,
+132,244,173, 73,179,178, 41,121,248,240, 97, 69,147,160, 72, 36, 66, 97, 97, 97,197, 76,251,229, 15,163,170, 12,112,117,154,149,
+ 77,118,185,177, 42, 55, 90,181, 61,251,171,210,100, 24,166,214, 10, 67, 42,149,150, 71, 56, 73,109,154,132,144,152,251,247,239,
+247,236,210,165, 75,204,164, 73,147, 52,185,185,185,176,179,179, 67, 64, 64, 0, 26, 53,106, 4, 23, 23, 23,152,205,102,252,254,
+251,239,218, 3, 7, 14,196,170,213,234,110,207,207,129,245,188,166, 64, 32, 72,169,234,225, 90, 30,189, 42, 55, 88,114,185, 28,
+222,222,222,229,215, 54,165, 46,215,243, 5, 35, 75,127,175,230, 51,227,210,163,123,239,134,253,250, 15,113, 56,112,232,160,242,
+251,181,155,238,119, 30, 60,125,157,139,255,172,253, 46,254,179,246,119, 30, 60,125,221,247,107, 55,221, 63,112,232,160,178, 95,
+255, 33, 14, 61,186,247,110,152, 16,255, 32,228, 79,235, 18, 86,145, 78,165, 84,214,182,115,199, 96,213,197, 43, 23,217,101, 43,
+ 55,115, 29, 59,244,187,254,221,119,235,118,127,247,221,186,221, 29, 59,244,187,190,108,229,102,238,226,149,139,108,231,142,193,
+ 42,165, 84,214,214,154,188, 79,157, 60,214,161,127,191,193, 56,114,228,119,118,199,214,213, 95, 31, 60, 97,234, 50, 98,178, 33,
+ 47, 45,229, 54,129,110, 19, 92,237, 99,145,158,158,174,102, 89,182, 91, 85, 29,220,171,210,156,242,246,216,202,230,234,146,179,
+ 71,228,250,251,247,193,157, 58,117,216,114,230,204, 29,253,165,152,124,245,173,132,194,226,162, 82, 67,178, 86, 83,106,226,121,
+ 30,132,231,132,139, 22,129,169,233, 59,234,216,177, 43,206,158,222,142,205,155,126, 86,243, 60, 12, 35,246,236,225, 70,142, 92,
+ 72,252,235,215,247,223,182,115, 59, 51, 96,208, 16, 7, 2,240, 3,135, 13,118,220,177,107, 7,211, 48,168, 97,253,128,128,167,
+ 83,211,252, 79,150,165,191, 65,115, 1, 33, 37,165,105,105, 23,110,255,240,131,209,125,212,168,122, 82,119,119,123,240, 60, 83,
+254,124,175,110, 19,137, 68,127,138,184,212,164,233, 94,175, 94,214,137, 19, 39, 16, 18, 18, 2,111,111,239, 63,117,121, 41,159,
+ 72,219,197,197, 5,167, 78,157, 2, 1,110, 89,163,217,196,203,235,246,143, 63,252, 96,226,121, 30, 37, 37, 37,255, 22,189, 42,
+ 41, 41, 1,207,243,184,120,225,130, 73, 93, 86,182,217,218,188,183, 53,153,202,134,180,106,245,213,248,241,227,205, 41, 41, 41,
+224,121, 30,149, 35, 89,249,249,249, 80, 42,149,208,233,245,190,238,238,238, 74,107, 52,243,143, 31,183, 65, 45,207,117,129, 64,
+240,167, 38,194,191,227,123,255, 71, 69,176, 88,150,133,175,175,239,159,230, 25, 17, 8, 4,127,218,234, 50,130, 48, 43, 43,107,
+139,187,187,251,137,113,227,198,205,111,209,162,197,212, 25, 51,102, 8, 27, 54,108, 8,181, 90, 13, 39, 39, 39,184,185,185, 33,
+ 37, 37, 5, 23, 46, 92,224, 84, 42,213, 58,142,227,190,200,203,203, 43,176, 66,247,156,183,183,247,128, 94,189,122,237,122,247,
+221,119, 29,186,116,233, 34,246,242,242, 2, 0,196,199,199,227,216,177, 99,230, 29, 59,118,148, 26, 12,134, 81,214,204,226, 14,
+ 0, 57, 57, 57, 39, 61, 61, 61,135, 79,152, 48, 97,219,208,161, 67,237, 12, 6,131, 56, 37, 37, 5, 38,147, 9, 44,203,162,184,
+184,216,124,225,194,133, 50,157, 78, 55, 54, 39, 39,231,164, 21,122,183, 25,134,105, 98, 54,155, 39,220,185,115,103,201,240,225,
+195,157, 59,116,232, 32, 97, 89, 22,151, 47, 95, 46,136,136,136,112, 43, 45, 45, 53, 95,185,114,165,200, 96, 48,204,203,206,206,
+182,106,169, 28,134, 97, 80, 90, 90, 10, 23, 23, 23, 24,141, 70,240, 60, 15,147,201, 4, 91, 91,219,138,229,141, 8, 33, 47,220,
+ 71,142,101, 89,161,217,108,198,232,209,163,193,243, 60, 86,175, 94, 13,150,101,235, 44,102,107,107,123, 43, 62, 62,126, 64, 88,
+ 88, 88,133,105, 41, 47, 67, 50,153, 12, 46, 46, 46,112,118,118,198,233,211,167, 33, 20, 10,111, 89, 25, 93,187, 11, 32,130, 97,
+152, 14,177,177,177,227, 1,180, 48,155,205,222, 28,199, 49, 2,129, 32,135, 16,114,175,180,180,244, 87,107,151,202,201,207,207,
+ 95,242,198, 27,111, 68,108,223,190,221, 86, 36,250,215,173, 33, 18,137, 32,147,201,224,230,230, 6, 7, 7, 7, 16, 66, 96, 50,
+153,240,217,103,159,149,106,181,218, 37,175,202,195,160, 85,235,182,248,229,167, 53,182,103,206,158, 40,184,159,132,131,149,167,
+ 98,176, 5,112,229,218,148,131,170,146, 95, 90,100,103,100,216,182,106,221,214, 42, 77, 19,199, 22,141, 26,187,206,247,217, 82,
+ 57, 75, 82,146,211, 86,109,223,244,214, 19, 0,248,118,229,134,128,244,124,243,140,132, 7, 15, 7,175, 93,119,190,173,137, 99,
+139,172,209,252,151,105,217,166, 6,129, 33, 43, 43,235,186,143,143, 79,131,200,193,230,121, 33,129,204,160,188, 66, 62,139, 97,
+152,247,178,178,178,158, 88,155,247, 78, 29,187,224,236,201, 29,216,186,121, 91, 41,225,133, 6, 23, 23, 23, 2, 0,247,239,187,
+144,251,247, 85, 4, 40,159,175,209, 81,235,170, 44,248, 98,222,220,169, 51, 53, 26,205,170, 31,191,169,121,194,217,102,205,219,
+161, 89,243,118,152,254,222,167, 14, 77,194, 66,253, 0, 96,207, 30,194,133, 7, 51,135,231,127,190,112,208, 23, 95, 44, 68,169,
+198,136, 47,190,120,186,172, 78, 98, 92,194, 31,143, 31, 19, 19,173,154,254,204,124,150,189,142,153, 51,131,117,197,197,174,157,
+ 62,249,196, 69,244,205, 55,130,170, 58,185,151, 71,176, 42,223,191,214,104, 30, 63,115,230,143,143,102,206,204, 90,241,205, 55,
+189,151, 45, 95,174,104,220,184, 49,114,115,115, 17, 26, 26, 10,111,111,111, 92,185,114, 5, 39,142, 30,213,150,233,245,243, 60,
+ 60, 60,214, 90,163,249,253,142, 29,137,157,187,119, 47,220,178,101,139, 87,247,238,221, 25,173, 86, 11,181, 90, 13,181, 90, 13,
+163,209, 8,137, 68,130,172,172, 44,146,158,145,113, 63, 51, 51,115,157,181,121,231, 10, 10,228,179,210,211, 51, 69,155, 54, 45,
+159, 50,121,242,236,153,179,102,201,124,124,124, 24,163,209, 88, 17,197, 50,155,205, 80, 42,149,102,141, 70,227, 12, 64,103,141,
+166,236,240, 97,182,168,168, 8,206,206,206, 21,211, 46, 85,158, 87, 80,171,213,130, 16, 58, 9,110,157, 94, 20,170,171,195, 67,
+ 67, 67,111,137, 68, 34,159,202,209,172,234,126, 86,170,140, 51,227,226,226, 90, 85,118,184,132,144, 42,251, 59,249,248,248, 4,
+240, 60,191,180, 67,135, 14,195,223,126,251,109,230,194,133, 11, 56,123,246, 44,201,204,204,220, 43, 16, 8,230,101,102,102, 62,
+169,238,205,166, 58,205,122,245,234,217,217,217,217,125,104, 99, 99, 19, 85, 62, 21,131, 92, 46,143,213,106,181,167, 53, 26,205,
+234,234,102,111,175, 73,179, 97,195,134,246, 60,207,127, 96, 99, 99,211,179,176,176,176, 5, 0,184,184,184,196,104,181,218, 83,
+ 2,129, 96, 77,117, 11, 72,215,164,233,229,229,165,176,181,181, 93, 82,175, 94,189,215,223,126,251,109,231, 11, 23, 46,228,196,
+196,196, 72, 74, 75, 75,183,179, 44, 91,237, 98,207, 85,105, 54,105,210,228, 79,107, 17,190,204,239, 8, 0,154, 55,111,126,100,
+224,192,129,253,199,142, 29, 11,139,197,130,181,107,215,226,212,169, 83,127, 36, 37, 37, 13,168,233,237,243,121, 77, 15, 15, 15,
+ 23,111,111,239,243,227,198,141,243, 31, 50,100,136,210,222,222, 30, 66,161, 16, 90,173, 22,201,201,201,184,119,239, 30, 57,117,
+234, 84, 89,124,124,124,166, 94,175,239,154,155,155, 91,104,237,245,252, 43,111,201,207,107,138,197,226, 46,190,190,190, 59, 23,
+ 44, 88, 96,215,179,103, 79,133,179,179, 51,132, 66, 33, 44, 22, 11,114,114,114, 16, 23, 23,135, 19, 39, 78,104,247,238,221,171,
+ 45, 42, 42, 26, 77, 8,185,240,159, 72,231,203,212,108,210,136,249,252,185, 5,156,171,157,157,189,166,125,173, 73,103,255, 40,
+167,126,195,135,183,142, 2,128,125,251,110,158,254,227,116,201,209, 23, 77,103,109,105,181, 70,179,113,176,112, 65,124, 66,220,
+159, 38,162, 12,107, 18,254,176,113,211, 97, 95, 90,163, 85, 62,147,251,243,121,175, 52, 59,126,165, 55,130, 63, 55,167,150, 47,
+ 8,253,233,188,185, 88,186,228, 43, 28,220,243,251, 31, 9,143,201,145,255,229,178,244,119,106,150, 47, 78,172,244,244,236,188,
+195,197,101,238,201,211,167,109, 43,191,168,149, 71,154, 43,191, 76,182,104,209, 34, 63, 38, 38,198,221, 26,205, 1,223,127,111,
+ 54,216,217,201,150,173, 91,215, 69,103, 50,117,153, 53,107,150,232,246,237,219,216,177,109, 27,171,207,200,216,150,203,113, 31,
+ 84,213,250, 81,147,102,224, 71, 31,201,151,110,223, 62,177,126,195,134,110,131, 7, 15, 22, 11,133, 66,104, 52, 26,100,103,103,
+227,234,149, 43,166,228,148,148, 4,157, 78, 55, 40, 51, 51, 51,219, 90,205, 1,223,127,111,118, 12, 8,128,210,213,149, 92,137,
+142,118,248,120,193,130,169, 30,158,158, 14,157, 34, 35,197, 74,165, 18, 37, 37, 37, 72, 79, 79,199,165, 75,151,242,159, 60,121,
+226, 69, 8,225,172,209, 60, 20, 27,219,236,236,245,235, 35, 62,254,248, 99,105, 72, 72, 8,236,236,236,160,209,104,144,144,144,
+128,171, 87,175, 26,119,238,220,169,214,106,181, 83, 51, 50, 50, 14,253, 93,223,251, 63,198, 96,253,127,221,120, 30, 30, 30,173,
+ 4, 2,193,231,207,154,163, 22,215,182,166,223,171,244,208,241,244,244,244,115,114,114,250, 69,175,215, 19,163,209, 56, 37, 39,
+ 39, 39,253,191, 45,157, 12,195,136, 90,181,106,245, 83,126,126,126, 7, 66, 8, 28, 28, 28,174,198,199,199,191, 67, 8, 97,235,
+170,201, 48,140,208,195,195,163,131,141,141, 77, 91, 27, 27,155, 46,102,179,185,241,179,126,120,247,117, 58,221, 5,139,197,114,
+ 61, 55, 55,247, 42, 33,132,251, 79,230,157, 97, 24, 33,128,158, 94, 94, 94,111,241, 60, 31,196, 48,140, 35,199,113,176, 88, 44,
+ 42,158,231, 31,169,213,234, 13, 0, 78,253,167,211,249,178, 52,195,130,152,161, 68,128,198,213, 25,129, 63, 25,154,231,140, 3,
+195,227,126,252, 35,242,187,181,233,100, 24, 70, 48,164,175,235, 10,224,233, 72,195,218,150, 28,250,147,193,178,194,180,212,217,
+ 92, 6,137,222, 32, 12,241,251,243, 67,145, 73, 15,109, 54,116,235, 95, 49, 88,214, 18, 22,194,116, 1, 65, 7,158,224,250,253,
+ 36,114,246, 85,125,214,189, 76,205,175, 24,166,222,158, 70,141,174, 10, 68, 34, 15,134, 97, 4, 0,192, 8, 4, 60, 15,112, 16,
+ 8,216,202,205,130,149, 95, 40,107,211, 52, 3, 77,197, 50,153, 47,199,178,238,197, 18,137,237, 21, 27,155,150, 70,160,204,131,
+227, 62, 63, 93, 84,148,248, 34,233, 52, 3, 77,133, 50,153,223, 21, 59,187,193, 42, 39,167,102, 37,102,179, 43, 0,162, 80, 40,
+238,151,233,116,155, 83, 83, 83,127,172, 98, 81,245, 90, 53, 37, 50,153, 15,247,108,228,161, 64, 36,202, 63, 33,147,249, 22,184,
+186,142,215,233,245,254,114,185,220, 66, 8, 41, 53,155,205, 99,211,211,211,207,212, 37,239,233, 66, 97,147,123,118,118,145,156,
+189,189,179,133, 97,108, 76, 28,103, 54, 91, 44, 25, 70,163, 49, 86, 40, 20,174,204,204,204,124,252,119,126,239,175, 28,229,163,
+205,254,142, 13, 64, 20,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,126, 77, 55, 55, 55,165,135,135,135, 31, 0,225,255, 98,
+222, 95,181, 77, 68, 45, 38,133, 66,161, 80, 40,255,251,228,229,229,233, 80, 69,159, 43,202,127,168,137, 16, 64, 84, 53,145, 45,
+171, 67,127, 47, 50,154,192,138,166, 4,170, 73, 53,169, 38,213,164,154, 84,147,106,190, 98,154,181,105,191, 50, 77,143,180,137,
+144,106, 82, 77,170, 73, 53,169, 38,213,164,154,180,137,240,229,110, 2, 80,170,115,214,238, 12,195,184,191,236,125, 41,175,118,
+ 89,168,226, 88,111,134, 97,188,235,184,191, 39,189,234, 20, 10,133,242,191,205,255,123, 31,172,242,138,138, 16,146,247, 50,246,
+123,217,199, 62, 59,254, 43,134,193,199,207, 62,127, 77, 8,153,251, 50,246,173, 13, 47, 47, 47,223,122,245,234,189,225,226,226,
+210,177,168,168,232, 98, 78, 78,206,198,194,194,194,156, 58, 28, 31, 44,151,203,223, 17, 8, 4,225, 0,192,243,124,156,193, 96,
+248, 41, 59, 59, 59,233, 37,124,111, 12,128,201, 50,153,236, 53, 39, 39,167,160,226,226,226, 71, 38,147,105, 15,128,159, 95,100,
+214,105, 79, 79,207,150, 28,199,189,143,167, 35, 89,127, 46, 40, 40,184, 98,237,177,238,225, 67,118, 19, 32, 24,128,128,103,248,
+ 17, 2, 34,216, 11,128,103,128,164,188,184, 3,175,189,228,242,250,194,223,111, 93,143,101, 24,102, 37, 3,124, 8, 6,228,175,
+150, 37, 10,133, 66,161,252, 15, 25, 44,111,111,239, 9, 0,102,227,233, 76,219,223,102,101,101,109,254, 59, 42,171,151, 88,169,
+173, 38,132,204,170,123,180, 2, 31,243, 60, 17, 0,128, 64,192,124,226,238,238, 30, 46, 18,137,140,207,239,203,178,172,140, 97,
+208,135,231, 9,243,108,223,143, 25,134, 89,243, 34,198,206,217,217,217,107,204,152, 49,219,190,248,226, 11,133, 82,169, 68,122,
+122,250,144,185,115,231, 70,121,121,121,141,207,206,206,206,168,237,248,134, 13, 27,142,105,218,172,197,204,185,159,126,110,235,
+234,230,102,195,178,156, 57, 35, 43, 83,249,205, 87,139,219, 54,108,216,112, 77,114,114,242,142,186, 24, 41,145, 72,244,154, 92,
+ 46, 15, 52, 24, 12,143, 89,150,221, 43, 20, 10,123, 47, 89,178, 36,188, 95,191,126,242,210,210, 82, 41,203,178, 65, 91,183,110,
+157,249,219,111,191,245,101, 24,102,112, 77,195,237,203, 35, 56,132,144,172, 74,215,238,157,219,183,111,119, 23,139,197,204,179,
+ 69,155,175,212,180,127,101, 8, 16, 28,127,121, 79, 83, 0, 8,235, 52,242, 97,252,229, 61,120,246,249,165,191, 12, 60, 95, 22,
+156,156,156,182,151,148,148, 36,212,102,228,171, 58,150, 97,152,239, 8, 33,185, 94, 94, 94, 29, 1,188,243,108,215,159,178,179,
+179,175, 48, 12,227, 33,151,201, 62,212, 27, 12, 12, 0,230,175,148, 37, 10,133, 66,161,252,239, 69,176,230, 62,124,248,208,142,
+ 16,130,144,144,144, 57, 0,172, 54, 88,207, 87, 56, 66,161, 96, 78,207,158, 61, 39,202,100,178, 63, 85,204, 70,163, 81, 32, 16,
+ 48,110, 28,247,244,207,117,169,104,202,207, 97, 50, 25, 5, 98,177, 20, 66,161, 96,102,139, 22, 45,250,230,229,229, 29,147,201,
+100, 95,167,164,164,228,191, 72,228,102,243,230,205, 17,206,206,206,255,102, 32,138,138,138, 4,125,251,246, 97,234,162, 55,145,
+ 97,100, 70,153,172,173,132, 97, 60, 57,150,117, 4, 0,145, 72, 84, 18,228,238,222,229,179,185,115, 21,207,116, 81, 86, 86,134,
+ 55,222,120, 67,249,232,209,163,177, 0,150,214, 18,185,106,212, 60,162,213,140, 29,219,183, 53, 46, 45, 46, 49,172, 95,245,243,
+109,189, 72,162,107,208, 36, 84,178,248,171,149, 78,159,125, 50,243, 61, 47, 47,175,152,170,150, 13,121, 46,175, 2, 0,191,127,
+248,225,135, 97, 3, 6, 12,144,106, 52, 26,185, 94,175,175,191,109,219,182,207, 90,181,106,101,219,162, 69, 11,233,206,157, 59,
+ 25,181, 90, 13, 66,136, 50, 52, 52,148,188,246,218,107,134, 93,187,118, 77, 7,240, 93, 93,204, 50,207,243,194,170,202,161, 53,
+230,154, 1,146,194, 58,141, 4, 24, 4,197, 95,222, 35, 15,139, 28,105, 0,193, 35, 6, 72,122,246, 34,240, 5, 80,105, 94,167,
+ 63,115, 63, 43, 43,235,133,214, 14,236,223,127, 0, 67, 8,249,221,203,203,235, 76, 97, 97,161, 29,195, 96,116, 29,162, 83,140,
+171,171,235,123, 0, 62, 37,132,124,120,238,220,185,246, 0,208,173, 91, 55, 9,128, 43, 14, 14, 14, 61, 76, 70, 35, 67, 31, 73,
+ 20, 10,133,242, 15, 52, 88,132, 16, 25, 0, 92,186,116, 9,132, 16,249,139, 4, 5, 42,255, 50,107,214, 44, 56, 59, 59, 63,111,
+ 90,112,246,236,153,106,143,169,235, 57,190,250,234, 43,199,252,252,252,209,191,254,250,235, 16, 15, 15,143,119,115,115,115,143,
+215,146,199, 60,134, 97,190,126, 22,113, 96,228,114, 69,201,164, 73,147,174, 62,251, 95,227,195,135, 15,219, 13, 28, 56, 80,195,
+ 48,204,125, 0,144,203, 21, 93,132, 66,129, 19, 33,132, 16,130,175,107, 50,130, 35, 25, 38, 64, 42,149,118,159,242,253,247,108,
+203,129, 3, 69, 54,174,174, 12, 0,164, 61,120,224,242,221, 15, 63,116, 86,101,100,200, 68,118,118,101,121, 37, 37,166,135, 15,
+ 31, 66, 46,151, 51, 2,129,160, 99,109, 25, 86, 42,149,239,207,154, 61,199,166,180, 88,165, 55,148,106, 76, 66,214, 98,180, 83,
+ 40,185,188,220,252, 34, 91,133,141,110,242,187,239, 75, 23,124, 58,251,253, 74, 81,147,234,152, 62,115,230,204,198,109,218,180,
+241,222,189,123, 55,163, 86,171, 33, 18,137,108, 91,180,104,129, 86,173, 90,113,103,207,158,101, 26, 52,104,128,240,240,112, 92,
+190,124, 25, 87,175, 94,101, 34, 34, 34,148,251,247,239, 31, 87,149,193,170,202, 84,143, 25, 51,102,162, 84, 42,229,187,116,233,
+130,183,222,122, 11,132, 16, 68, 68, 68,116, 28, 55,110, 92,142, 94,175,183,202, 92,151, 55, 3,186,133, 15,185, 7,160, 41, 8,
+ 30,229,199, 29,104, 86,105,151,198,137,137,137,237, 74, 74, 74, 42, 58, 27,150, 47, 44,222,185,115,231,186,148,247, 60,134, 97,
+190, 30, 56,112,192, 28,128, 65, 84, 84, 84,217,244,233,211, 73, 98, 98, 98,175, 33, 67, 6, 55, 72, 74,122, 84,109, 58,159, 47,
+ 71, 83,167, 78,211,138,197,226, 55,188,188,188, 18, 24,134, 17,139,197,226,242,107, 36,170, 95,191,190,123,211,166, 77,231,122,
+122,122,234,132, 2,129,146,160,246,178, 68,161, 80, 40,148, 87,200, 96, 49, 12,147,125,247,238,221,250, 58,157, 14, 12,195,100,
+ 91, 81, 65,157,174, 92,225,136, 68,162, 95,132, 66,193, 20, 0,104,221,186,141,118,249,242,229, 85, 53, 43,241,173, 91,183,209,
+ 10,133, 2,155,167,149,151,240,103,150,101,243,170,210,172,166, 66,252, 70, 42,149,125, 4,128,241,241,241, 45, 59,120,240, 32,
+ 63,124,248,112,124,243,205, 55,178, 57,115,230,252, 88,191,126,253,110,169,169,169,105,213,165,243,217,239,115,221,221,221,195,
+ 55,111,222, 28, 49,105,210,164,171, 89, 89, 89,195,158, 69, 70,246, 3,104,199, 48,204,253,202,127,219,191,127,127,135, 9, 19,
+ 38,220,201,203,203,155, 91,157,230,112,134, 9,244, 15, 13,237,254,197,197,139, 68, 96, 52, 50,133,151, 46,149, 22, 23, 20,152,
+ 31, 23, 22,218,108,143,141, 29,253,241,162, 69, 18, 15,111,111, 92, 57,121,210, 46, 87,165,210,168,116, 58, 83, 74, 74, 10,207,
+113,220, 25, 43,242, 30,230,234,226,162,252,121,229,218,155,118, 98, 33,239,230,227,205,136,235,213, 19, 9,148,246, 82,161, 72,
+ 96,108, 80, 63, 64, 10, 32,172,182,239, 72, 34,145,140,235,213,171,151,114,215,174, 93, 76,120,120, 56, 28, 29, 29,113,233,210,
+ 37,196,196,196,160,164,164, 68, 96,177, 88,208,186,117,107, 44, 95,190, 28,126,126,126, 80,169, 84, 72, 79, 79,119,145, 74,165,
+174, 53, 92, 79,166, 82,249,193, 39,159,124, 2, 87, 87, 87, 88, 44, 22, 20, 23, 23,131,227, 56,216,216,216, 0, 0,114,115,115,
+113,240,224,129, 90,203,146,149,230, 8,237,219,183,175, 48,194,149, 35, 88,117,209,244,246,246,190, 84, 80, 80, 56,178,123,247,
+238, 40, 46, 46,102, 23, 46, 92,136,230,205,155,163, 81,163, 70,214,148,249,185, 50,153,236, 55,127,127,255, 77, 83,167, 78,173,
+239,228,228, 4,163,209,184,162,168,168, 8, 31,127,252, 49, 0,160, 77,155, 54,173, 9, 33, 49,147, 38, 77, 66,253,250,245, 53,
+185,185,185,133,247,238,221, 27,162, 82,169,238,189,104,222,173,188, 62, 84,147,106, 82, 77,170,249, 95,165,249,143, 54, 88, 0,
+242,188,189,189,235, 43, 20, 10, 0,168,243,219, 53,203,178, 83,221,220,220, 4,159,125,246,217,192,134, 13, 27,242,211,167, 79,
+191,146,146,146,242,167,142, 51, 13, 26, 52,216,243,195, 15, 63,116, 76, 78, 78,214,125,249,229,151,135,243,243,243,167,213,241,
+ 75,255,132, 97,152, 85, 0,144,145,145, 81,116,224,192,129,200,139, 23, 47,126,181,106,213, 42,159,233,211,167,203,166, 79,159,
+254, 9,128, 90, 53, 69, 34,145,177,170,102,193,170,112,118,118,230,171,234,163, 85,206, 64,134, 81,216, 75,165,221,190,184,120,
+145,152, 82, 83,117,187,126,252, 81,177,238,230,205,249, 22, 66, 60,221,221,221,133, 93, 58,117, 50,218, 73,165,154,188,236,108,
+222,201,199,135, 73,126,252,216,214, 34, 20,154,143, 31, 63, 94, 86, 80, 80,176,205,138, 36,148,242,132,152,108,125,252, 44, 35,
+134,244, 12,191,121, 61,230,129,157,155,139, 32,162, 69,120,179, 7, 15, 83,111,131,231,204, 0, 74,107, 19,113,112,112,104, 84,
+ 84, 84,132,210,210, 82,184,186,186, 98,245,234,213,240,240,240,128, 78,167, 67,124,124, 60,241,241,241, 97, 46, 94,188, 8, 31,
+ 31, 31, 20, 20, 20,192,100, 50, 65,163,209,228, 27,141, 70,125,117,134, 87, 36, 18,253, 38, 16, 48,147, 24,134, 65, 72, 72,168,
+118,213,170, 85, 60, 33, 4,141, 27, 55,198,176, 97,195,176,111,223, 62,196,199,199,151, 71,154,248,192,192, 32,173, 64,192,216,
+ 0,224,255, 74, 20,135,231,121, 84, 54,194,117,197,203,203, 75, 1,224,227,224,224,224, 81,175,191,254, 58, 43,145, 72,160,213,
+106,161,215,235, 17, 23, 23,199,246,239, 63,160,108,224,192, 1,182,127,252,241, 71,141,233, 52, 26,141,143,253,253,253,135,207,
+152, 49,227,228,207, 63,255,236, 60,111,222, 60,240, 60, 95,177,177, 44, 91,177, 40,247,129, 3, 7,240,232,209,163,185,149,205,
+ 21,133, 66,161, 80,254, 25, 6,235, 47, 35, 22,139,191,248,227,143, 63,122, 45, 93,186, 84,220,163, 71,143,142, 94, 94, 94, 29,
+178,179,179,175, 62,171,212, 58,244,235,215,175,163,155,155, 27,214,172, 89, 99, 18,139,197, 95,188,160,179,174, 92,217,157,243,
+240,240,152,190,127,255,254, 67, 83,166, 76,129,167,167,103,219,255,239, 60,219,203,100, 17,147, 86,175,102,197, 22,139, 96,231,
+207, 63,203,150,158, 57,179,122,215,238,221,226, 54,173, 91,131, 0, 72,136,143,151,125,253,253,247,178,145, 3, 6,228,199, 63,
+122,132,227,167, 79,155, 84,197,197,217, 5,165,165,179,243,242,242, 10,172, 48,174,209,201, 41,201, 94,145, 93,218,123, 95,184,
+ 17, 23, 51, 98, 72,191,238, 98,145,128,121,148,154,121,203,211,195,197,225,234,229,203,122,150,101,163,107,211,209,106,181, 41,
+ 44,203,214, 35,132,184,158, 63,127, 30,174,174,174, 40, 41, 41,129,197, 98,129,201,100, 50,233,116, 58,121, 81, 81, 17, 12, 6,
+ 3,140, 70, 35,236,237,237, 17, 27, 27,155,199,178,236,217, 26,210,246, 22,195, 48, 11, 9, 33, 72, 72, 72,200, 2, 0, 95, 95,
+223, 38,142,142,142,167,202, 23, 80,190,120,241, 98,175,204,204,204,248, 74,145,174, 26, 59,185, 91, 27,193,122, 81, 60, 61, 61,
+ 91,202,229,242,175,231,204,249,196,171,121,243,230, 40, 40, 40, 4,207,243,176,181,181,133, 94,175,135,157,157, 29, 58,118,236,
+152,187,112,225,194,100, 66,208,151, 16,146, 91,147, 94, 90, 90, 90,174,159,159,223,232, 41, 83,166,124, 31, 28, 28,220,136, 16,
+130,224,224, 96,244,234,213, 11,199,142, 29,195,195,135, 15, 81, 86, 86,198,222,184,113, 99,125,118,118,246, 46,250, 88,162, 80,
+ 40, 20,106,176,234, 76, 86, 86, 86,150,183,183,247,150, 59,119,238, 76,122,237,181,215,112,238,220,185,121, 0,250, 2,128, 92,
+ 46,159,247,218,107,175,225,206,157, 59,184,127,255,254,150,172,172,172,172,151,113, 78,169, 84,170, 53,153, 76,120,118, 14,101,
+ 29, 43,234,198,207,154, 6, 65, 8,105, 92,221,223,106, 66, 32, 18,121, 54,237,211, 71, 84, 18, 19, 83,186,234,242,229,197, 59,
+118,238, 20,183,109,211, 6,102,139, 5, 60,199,193,215,207, 15,221,163,162,100, 91,118,239,182, 97,181,218, 43,159,127,240,193,
+177,181,111,188, 81,118,173,172,236,145, 53,105,212,106,181,223,125,254,233, 39, 81,187,118,239,243,110, 18, 26, 88,239,248,201,
+115,119,156,157, 29,148,141,130,130,108, 84, 42, 53,183,114,197, 82, 81, 89, 89,217,247,181,233,232,245,250,223, 79,159, 62, 61,
+196,215,215,215, 53, 46, 46, 14, 38,147, 9, 28,199,161, 71,143, 30,229,253,239,120,145, 72,132, 7, 15, 30,192,108, 54,231, 39,
+ 37, 37,101, 63,122,244, 72, 6, 96, 89, 45,215,240,249,239,113, 82,255,254,253, 97,177, 88,208,171, 87, 47, 28, 56,112,224, 77,
+ 0, 51,106,216,255,133, 12, 86,229,239, 9, 86,118,110,247,242,242,234, 25, 20, 20,180,102,249,242,229, 2, 31, 31, 31,240, 60,
+ 15, 39, 39, 39,232,116, 58, 20, 22, 22,161, 73,147, 38,240,245,245,197,178,101,203, 0, 96,103,109,230,170,156,244,244,244,251,
+ 0,186, 5, 6, 6, 74, 13, 6, 67,199,168,168,168,173, 61,122,244,192,157, 59,119,112,245,234,213,238, 12,195,228, 26, 12, 6,
+139,183,183,247, 44, 0,142,132,144, 95,172, 25, 61, 74,161, 80, 40,148,255,113,131, 21, 24, 24,104, 39, 22,139,186, 78,155, 54,
+213,150,227,120,136,197,162,110,245,235,215,119, 72, 77, 77, 85,191, 64,229,183,102,219,182,109,175,175, 92,185, 82,214,191,127,
+255,102,158,158,158,189, 0, 96,228,200,145,205,236,237,237,177,109,219, 54, 35, 33,100,205,203,202, 36,203,178, 67, 90,181,106,
+133,226,226, 98,164,166,166, 94,173,203,177,135, 15, 31,182, 3,208,174,182,191,213,120,126,147,201,201,209,219, 91,144,117,238,
+156,185,184,180,212,171,220, 92, 9, 4, 2, 20, 23, 23, 35, 45, 53, 21,246,118,118, 72, 72, 76,148,173,125,255,253, 93,254,225,
+225, 98,206,100,114,182, 86,191,160,160, 64,235,225,225, 49,113,254,231,159,253,254,253, 15, 63,184,170, 74, 75, 31, 43, 20, 74,
+163, 76, 38,241,152, 63,127, 30,167, 86,171, 39, 20, 22, 22,150, 89, 33,181,108,251,246,237,125,250,244,233,115,207,207,207,207,
+173,160,160,192, 67,173, 86,147,226,226, 98, 6, 79,251, 82, 49, 0,112,239,222, 61,164,166,166,178, 28,199, 93, 4,240, 5, 33,
+196,100,109, 90,189,188,188,156,219,183,111, 63,212,205,205,173,162, 41,178, 69,139, 22, 67,189,188,188,150,100,103,103, 23,189,
+204,194,125,234,212, 41, 59, 66, 72, 59, 66, 8,250,244,233, 99,237, 97,239, 12, 24, 48, 64,192, 48, 12,244,122, 61,100, 50, 25,
+108,108,108, 97,103,103,143, 70,141, 66,144,149,149,133, 94,189,122,113,143, 31, 63,222, 33,145, 72,190,171,107,154,244,122,253,
+152,142, 29, 59, 46,154, 54,109, 26,120,158,199,224,193,131,145,145,145,177, 41, 57, 57,121,131,143,143,207,180, 73,147, 38,185,
+ 59, 59, 59, 99,214,172, 89,202,202,166,147, 66,161, 80, 40,175,160,193,242,242,242,138,114,114,114, 90,225,232,232,110,123,226,
+196, 73, 17, 0,116,233,210,217,198, 98, 97,163,189,188,188,230,100,103,103, 31,174,203, 73,179,179,179,139,188,188,188,126,190,
+122,245,234, 7,195,134, 13,195,169, 83,167, 62, 5,128, 97,195,134,225,234,213,171, 72, 78, 78,254,249,101, 85,182,222,222,222,
+ 19,186,116,233,242,110,155, 54,109,112,228,200, 17,112, 28,119,180, 46,199, 87, 30, 49, 88,213, 40,194,242,191, 89, 37, 38, 20,
+130, 97, 24,112, 28, 7,194,243, 40, 44, 42,194,131,196, 68,148,148,148,128,227, 56,232,117, 58, 75,112,195,134, 90,181,201,100,
+207, 60,157,107,204,106,114,115,115,211, 2, 3, 3,211,117, 6,189,155,179, 83, 61,189, 82, 41,131, 70, 83, 38,137,189, 23, 83,
+150,153,153,249,216, 74,227,107, 98, 24,166,203,177, 99,199,230, 11,133,194,215,188,189,189, 49,114,228, 72,166, 71,143, 30,144,
+ 74,165, 48, 24, 12, 40, 41, 41,193,225,195,135,193,178,108, 67, 0,112,117,117,117,175, 95,191,254, 62,129, 64,144,151,156,156,
+ 60,169,182,115, 48, 12, 51,126,224,192,129, 98,147,201,132,197,139, 23, 99,193,130, 5,232,219,183,175,248,246,237,219,227, 1,
+172,124, 89, 5,155,231,121,244,236,217,179,114, 39,247,251,181, 29,211,181,107, 87,145, 80, 40, 12, 9, 12, 12, 68, 65, 65, 1,
+ 10, 10, 10,224,234,234, 10, 47, 47, 47,184,185,185, 97,229,202,149, 88,189,122,245, 13, 66,200,178,220,220,220, 7,117, 77,147,
+175,175,239,172, 55,222,120, 99,214,168, 81,163,160,209,104,112,245,234, 85,116,236,216, 17,203,151, 47,247,185,116,233,210,162,
+ 86,173, 90, 65, 34,145,224,252,249,243, 96, 89, 54,133, 62,158, 40, 20, 10,229, 21, 53, 88,222,222,222,245,120,158, 95, 50, 96,
+192,128,129, 67,135, 14,197,242,229,203, 42,121, 5, 17, 54,110,220,228,176,127,255,254,117,190,190,190, 67,133, 66,225,156,212,
+212, 84,171, 59, 36, 43, 20,138,181,219,183,111,159,216,190,125,123,187,168,168,168, 96, 0,144,201,100,252,246,237,219, 53, 10,
+133, 98,109, 93, 51,242,252,164,143,158,158,158,157,164, 82,233,244,129, 3, 7,118,154, 56,113, 34,226,227,227,177,117,235,214,
+187, 94, 94, 94,135,234,168,123,191,182, 81,132,181, 69,179,132, 82,105,145, 42, 55,215,209,214,207, 79,236,236,224,144,125,238,
+220, 57,255,182,109,219, 34, 45, 61, 29,170,146, 18,232,245,122,196,199,199, 19,137, 72,148, 44,114,114, 98,210,162,163, 25,161,
+ 84, 90,103,131,105, 35,103,130, 63,255,120,114,125,131,193, 16,166, 86,171, 89,177, 68, 34, 86, 72, 73,157,154,153, 8, 33, 70,
+ 63, 63,191,193, 28,199,185,152, 76, 38,139,187,187,187,248,244,233,211,144, 74,165, 96, 24, 6, 77,155, 54,133, 84, 42, 53,249,
+248,248,104, 0,192,217,217, 89,176,108,217, 50,241,135, 31,126, 24, 95,155,118,203,150, 45,197,254,254,254,147, 66, 66, 66,112,
+245,234, 85, 36, 36, 36, 36, 94,187,118, 45, 36, 34, 34, 2,222,222,222,147, 90,182,108,249,253,237,219,183, 45, 47,163, 96, 19,
+ 66,234,220,201,253,194,133, 11,196,203,203, 11, 2,129, 0, 2,129, 0, 60,207,163,160,160, 0, 13, 27, 54,196,218,181,107,177,
+122,245,234,159,114,114,114, 94, 40,178, 26, 24, 24, 40,109,222,188,249,187,163, 70,141,194,227,199,143,177,116,233,210,252,188,
+188,188,163, 39, 79,158, 28, 63,109,218, 52, 81,199,142, 29, 81, 84, 84,132,141, 27, 55, 90,238,220,185,243, 93, 78, 78,206, 90,
+250,120,162, 80, 40,148, 87,208, 96,249,250,250, 78,148,203,229,139, 70,141, 26, 37, 10, 9, 9, 65, 94, 94, 30, 52,154, 50,174,
+105,211,112, 14, 96,136,173,173, 13,163, 84, 42, 49,101,202, 20, 52,107,214,172,231, 39,159,124,210,195,203,203,235,171,236,236,
+236, 31,173, 57,241,227,199,143, 53, 94, 94, 94,223,205,156, 57,115,121,116,244, 85, 27, 0,136,137,137,209,102,103,103,127,153,
+157,157,173,169,163, 9, 42,159,156,146,177,177,177, 73, 10, 10, 10,178,244,239,223,223,121,232,208,161,112,113,113,193,157, 59,
+119,176,108,217,178, 59, 90,173,118, 76,106,106,170,229,255,251, 34,179, 70, 99,238,173, 3, 7,236,186,190,254,186,253,199, 67,
+134, 44,125,251,237,183,127, 92,176,112,161, 56, 48, 32, 0, 38,179, 25, 9, 9, 9,100,231,142, 29,230, 29,203,151,127, 11, 27,
+ 27,113,244,190,125, 82,147,201,148, 86,151,115,248,248,248,116,233,215,167, 75,200,138,149,223,193,160, 47,195,245,171,127,160,
+164,164, 0, 63,255,178, 63,196,199,199,167, 75,102,102,230, 5,171,211,203,178, 1,123,247,238, 5, 0, 72,165, 82,124,241,197,
+ 23,240,242,242,130,189,189, 61, 52, 26, 13, 38, 79,158, 44,253,240,195, 15, 1, 0,241,241,241,176,181,181,181, 54,202,214,111,
+242,228,201,142, 22,139, 5,199,142, 29, 51, 72, 36,146,215, 79,158, 60,121,181, 89,179,102,242,206,157, 59, 59,110,221,186,181,
+ 63,128, 3, 47,203, 96,189,192, 49,156,183,183,119,242,201,147, 39, 27,142, 28, 57, 18, 18,137, 4, 37, 37, 37,176,183,183,199,
+ 15, 63,252,192, 43,149,202,141,127, 33, 73, 82,165, 82, 41,227, 56, 14,187,119,239, 70, 94, 94,222,128,242,254,136,179,103,207,
+254, 50, 52, 52, 52,240,193,131, 7, 79, 12, 6,195,188,172,172,172, 71,244,209, 68,161, 80, 40,175,168,193,226,121,254,227, 19,
+ 39, 78,136, 56,142,195,250,245,235,113,243,230, 77,146,151,151,247,173,217,108,254, 74,169, 84,178,197,197,197,179,223,126,251,
+237,169, 11, 22, 44, 16, 68, 70, 70, 34, 58, 58, 90,208,176, 97,195,233, 0,126,172,100,124,162,106,154, 43,163,164,164,228,104,
+110,110,206,143, 60,255,180, 50, 20, 8, 24, 27,169, 84,118,180, 22, 51,245, 39,205, 42, 38,179,108,244,213, 87, 95,229, 59, 59,
+ 59,243,241,241,241, 88,187,118, 45,119,235,214,173,125, 60,207,127, 86, 88, 88,168,179, 70,243,101, 80, 89, 83,202,178,183,183,
+206,158,221,184,229,224,193,252,176,183,222, 50, 10, 68,162,119,150,174, 90,245,105,137, 74,229, 5,134, 33, 46, 78, 78,105, 27,
+150, 44, 89,220,161, 91, 55, 67,252,133, 11,242,152, 83,167,196,174, 22,203,221,186,164, 51, 51, 51,243, 66,112,160, 31, 54,173,
+ 95, 9,179,217,136,156,172,167,254,172,176, 72,141,154,204, 85, 85,154, 2,129, 64,245,198, 27,111, 40, 77, 38, 19, 51,122,244,
+104,113,126,126, 62, 2, 3, 3, 1, 0,165,165,165,248,227,143, 63, 16, 26, 26, 10, 0,136,141,141,173,248, 92, 91, 58, 21, 10,
+197,164,142, 29, 59, 34, 45, 45, 13, 9, 9, 9,123,179,179,179,243,188,188,188,246,166,165,165,141,111,221,186, 53,246,237,219,
+247,102,117, 6,171,174,223,145, 53, 6,171,154,188,191,181,127,255,254,143,162,163,163,251,204,154, 53,139,233,214,173, 27, 0,
+160,172,172,140,207,201,201,209,188,136,102,229, 52,177, 44, 11, 0,144,203,229, 26, 0,120,102,166, 70,190,168,230,203, 40,159,
+ 84,147,106, 82, 77,170,249,223,160,249,143, 49, 88, 0,204, 28,199,225,194,133, 11,216,191,127, 63,107, 48, 24,134,229,230,230,
+222,170,244,255, 47,125,124,124, 14, 13, 31, 62,252,104, 98, 98,162, 40, 33, 33, 1, 0,216,186,156,220,104, 52,154, 24, 6, 4,
+255,154,140,146, 24,141, 70,211,139,124,215,149,127,249,245,215, 95,145,147,147, 99, 76, 75, 75,219, 73, 8, 89,151,147,147,147,
+249, 23, 34, 33,127,121, 20,225, 70, 66,140,175, 51,204,233, 5,157, 58,245,156,127,234,148,236,181, 25, 51,204,195, 70,141,154,
+205,153, 76, 22,161, 68,194, 75,109,108, 4,156, 76, 38,142,191,112, 65,190,102,218,180,122,122,163,241,248,214, 58,116, 28,175,
+ 20,193,194, 27,111,205,128,190, 82, 4, 43,250,230, 67,212, 53,130, 37, 18,137,252, 44, 22,139,140,101,217, 44,158,231, 49,126,
+252,120,240, 60, 15,189, 94, 15,141, 70,131,226,226, 98,195,123,239,189, 39, 0, 0,165, 82,137, 94,189,122, 73,173,209, 13, 8,
+ 8,104, 32, 22,139,113,252,248,113,136,197,226,205, 0, 32, 22,139, 55,159, 58,117,106,252,152, 49, 99,224,231,231,215,132, 97,
+ 24,166,182,197,163, 43, 22,123,102, 16,244,236,219, 15,114, 11, 31,114,175,210, 98,207,247, 35, 34, 34, 0, 43,250, 93, 61, 79,
+ 70, 70, 70, 14,128, 25, 62, 62, 62, 27, 63,250,232,163,143,219,182,109,219,106,225,194,133, 96, 24, 70,248, 87,111, 54,158,231,
+ 97,177, 88,254,210, 20, 18, 20, 10,133, 66,249,223, 55, 88, 43,187,117,235, 54,147, 16, 34, 98, 24,230,155,231,204, 85,121,212,
+ 36,222,219,219,251,243,134, 13, 27, 86, 44, 0, 93, 71,243,146,199, 48,204,114,129,128,249,248,233,239,117,159, 88,178,146,198,
+ 39, 79,205,129,120,215,173, 91,183, 62, 77, 75, 75,203, 34,132,176,127,245, 2,189,140, 81,132, 0,176,157,144,148,209, 12,115,
+ 98, 86,120,120, 84,159,105,211,208,172, 79, 31,123, 47,127,127, 78,111, 54,243,177,151, 47, 51, 87,247,238,149,196,156, 58, 37,
+214, 27,141,199,247, 19,146, 94,215,116,102,102,102, 94, 8, 12,240, 57, 57, 98, 88,191, 94, 1, 13,188, 0, 0, 79, 82,178, 81,
+ 88,172, 62, 89, 23,115, 5, 0,169,169,169, 70, 0, 70, 79, 79,207, 97,187,119,239,222,251,204,244, 84, 44, 59, 3,192, 40, 18,
+137,130, 1, 64,163,209,248,255,254,251,239,219, 69, 34, 81,173, 38,246,254,253,251, 27, 22, 44, 88, 48,229,201,147, 39, 59, 51,
+ 51, 51, 19, 1, 32, 45, 45, 45,209,219,219,251,235,156,156,156,169, 25, 25, 25,107,137, 21,238,227,185,197,158, 17,127,121,143,
+ 28, 64,211,242,197,158, 95,116,173,193,231,174,103, 28,128,177,222,222,222,221,122,247,238, 61, 29, 64,238, 95,209, 51, 26,141,
+ 22,163,209,104,225,121, 94,108, 54,155,137,209,104,180,208,199, 15,133, 66,161,252, 3, 13, 86, 86, 86,214,102, 88,177,152,179,
+181,251,213, 96,144,230, 50, 12,179,166,220, 44,253, 85, 13,179,217,252,178,214,111,187, 63,104,208,160, 58,237, 95,219, 14, 59,
+ 9, 73,123,159, 97,182, 28,249,254,251, 22,199,215,173,243,230, 88,214,153, 1,136, 80, 42, 45, 50,153, 76,169,174, 22,203,221,
+186, 70,174, 42,243,248, 73,102,111, 0, 8, 14, 14, 38,143, 30, 61, 2, 33,228, 47, 45, 30,156,147,147,115,210,199,199,199, 77,
+ 36, 18, 73, 25,230, 79, 82,198,103, 38, 12, 0,238, 49, 12,211, 4, 64,173, 17,158,140,140,140, 85, 0, 86, 85, 81,134, 86, 3,
+ 88,109,109,186, 42, 22,123, 6, 4, 60,195,143, 8,235, 52,114, 47, 0,190,124,177,231,151, 73, 86, 86,214, 57, 0,231, 94,130,
+ 97, 51,212,175, 95,127,221,242,229,203,167,222,189,123,247,215,204,204, 76, 3,125,252, 80, 40, 20,202, 63,208, 96,253,127,242,
+ 50, 22,181,125,217, 11,227,190,140, 40, 72, 85,124,247,212, 64, 93,251, 59,175,103, 82, 82, 18,243,178,180,158, 25, 1, 67, 45,
+215,158,160,142,205,195,127,133,242,197,158, 43, 17,254,191,112,179,165,166,166,126,213,178,101,203, 21,153,153,153, 52,122, 69,
+161, 80, 40,175, 56, 2,122, 9, 40,148,255, 63, 94,214, 52, 20, 20, 10,133, 66,249,239,134, 1, 16, 85,213, 63,234, 50, 58,128,
+ 97,152,168,186,158,184, 54,125,170, 73, 53,169, 38,213,164,154, 84,147,106,190,122,154,181,105,191, 50,163, 19, 43,119, 94,126,
+217, 27,128, 40,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,205,127,218, 70,155, 8, 41, 20, 10,133, 66,161, 80, 94, 50, 34,
+122, 9,170,166,133,167,112,177,159,143, 91,171,138, 40, 31,207, 3, 0,248,103,179, 8, 84, 76, 39,192,243, 32,132, 32, 59, 95,
+117,251, 94, 30,249,252, 69,207, 23,226,205,212,115,147,203, 87,243,132,116,122,246,167, 11,234, 34,227,140, 56, 53, 81, 89,171,
+209,216,131,105, 44, 23,224, 35,158,160, 25, 0, 8, 24,220, 51,240,248,230,126, 46,185,255, 87,175, 7,195, 48, 76,152, 43, 38,
+ 75, 21,202, 81, 14,142, 78, 65, 37, 37,133, 73,102,131,113, 79, 66, 1,126, 38, 47, 48,177, 83, 96, 61,166, 29, 79,240, 41, 0,
+129, 88,128,111, 31, 22,145,115,180,212, 81, 40,148,255, 39,254,234,188,118, 92, 85,143,201,191,168, 73, 39,200,251, 39, 27,172,
+ 48, 55,102, 26, 24, 44, 4, 64, 64,176, 40, 62,159,212,105,189,180, 48, 47, 38, 74, 46, 20,110, 0, 32, 52,152,185, 89,132,199,
+197, 42, 43,115, 1, 58,203, 37,194,111, 1,240, 6,142,155, 20,159,109,125,123,108,184, 15,211, 71,196, 11,182,242,132,136, 57,
+158,108, 6,193, 17, 91, 9,174, 68,103,146, 58, 13,139,247,243,113,107,117,224, 70, 78,175,115,107, 63, 64,219,102,129, 32, 28,
+ 11,240, 22, 40, 35, 63,194,153, 85,227,209,182,177, 31, 8,111, 1,120, 22,182,125, 87,160,111,184,195, 11,223, 28, 33,222, 76,
+ 61,127, 23,183,184,245,235, 55,120,120, 5, 52, 97,120,214,140,196, 27, 39,199,126,248,241,252,238,225, 14, 76,184, 53, 38,171,
+185, 23,243, 86, 96,195,144,143,102, 44, 92, 41,244,244,242,181,225, 45, 70, 54, 55,229,126,196,119, 95,207,223,215,220,139,249,
+246,110, 54,217, 96,173,145,106,226,138, 41, 34,153,116,164, 66,110, 19,164,211,105, 30,113,102,203,158,112, 47, 81,159,111, 86,
+172,110,209,181,103, 63, 91, 78,147, 43,176,240,104,178,123,215, 78,255,239,127,252,169, 31,195, 48,131, 8, 33,124, 93,242,204,
+ 19,124,252,112,203,228,126, 98,145,144,105,252,230,122, 33, 94,112, 42,132, 38,238,204, 24,134, 32,178,214, 39, 23,131, 75, 9,
+121,100,199,139,156,163,177, 59,243, 43, 67,208, 8, 12,246, 50, 4, 59,227,243, 73, 62,125,116, 80, 40,175, 22, 62, 62, 62,231,
+ 50, 51, 51,187,189, 76, 77, 47, 47,175,118,217,217,217,215,232,213,165, 6,203,138,218, 23, 95,198, 63,206,112, 2,103, 70, 88,
+163,128,197, 0,234,100,176,228, 66,225,230,155, 73,121, 30, 96,205, 88,191,228,157, 93, 38, 11,192, 90,204,224, 88, 11, 56,214,
+ 2,150, 53,131,179, 88, 64, 44, 70,204,255,237, 28, 96,210,160, 85,120,240,102, 0,158,214,158, 67, 76, 4, 91,111, 95, 62, 89,
+143, 49,169,177, 99,237, 87,239,101, 20,148,189,119,250, 94,118, 97,152, 59, 51, 55, 33, 31, 27,235, 98, 4,206,173,251, 0,219,
+126,255, 35,115,205,175,218, 7, 60, 33,168,103,175, 8, 25, 59, 32,222,119,203,193,115, 25,171, 55, 27, 30, 0,128,131,141, 52,
+100,194,189, 36,191,191,242, 37,184,201,229,171,127,254,233,123, 15, 79,103, 5,195, 94, 93, 6,150,227,224,235,223, 95, 56,119,
+250, 88,207, 47, 87,109, 88, 5,224,141,154,142, 15,117,103,154, 52, 10,108, 60,107,243, 31, 87,253,180,165,249,166,147,219, 63,
+125, 12, 35, 44, 30,222,141,197,139,191, 90, 41,156,247,201, 7, 51, 67,221,153,235, 15,242, 72, 66, 45,230, 74,208,216, 13, 7,
+191, 90,182,162, 89,247,190, 3,108,249,178, 2,161, 65, 91,214,104,253,111, 27, 22,134, 54,107,163,140, 12,247,145,228,239,153,
+202,232, 53,197, 48, 11,228,178,238, 97, 81,246,250,113,163, 45,235, 55,109,155, 14,224,187, 58,189,254,145,127,149, 61,158,127,
+241,183, 73,134, 32, 50,230,218,185, 41, 92,246, 77, 16,206, 2,112,230,138,159,224, 44, 32,252,211,159,109,167,254, 6, 0, 47,
+100,176, 4, 4,189, 78, 95,190,233,153,151,155,211,122,213,138,165,115,155,184, 49,199,192, 97,235,253, 98, 92,168,171,177,164,
+ 80, 40,255,189,120,121,121,177,217,217,217, 47,181,101,199,219,219,187, 95, 86, 86,214,209,191,152,174,143, 0,188,245,236,215,
+ 13,217,217,217,223,252,213,116,181,110,221,218,135, 16,226,241,236,217,159,123,243,230,205, 76, 90, 2,254,147, 6, 11,144,131,
+240,192,222, 33, 0,160,168,235,201, 8, 32, 7, 35, 4, 44, 90, 12,238,219, 19, 46,110, 30,128, 69, 7,152,117,128, 69, 15, 88,
+180,128, 69,143,194,156, 52,192,172, 5,158, 28, 3, 75,136,172,206,185, 50,170,129,135,123,208, 35,194, 15,174, 14,114,124, 48,
+184,137,203, 47,199, 31,110,216,112, 50, 49, 10,192, 40,171,210, 74, 8,218, 54, 13,194,154, 13,218, 7,135,110,231,247, 6,128,
+254, 45, 92,142,183,109,226,239,187,122,179,225,193, 31,247,138,251, 0, 64,223,112,135, 99,109, 66, 60,253,248,191, 16,221,229,
+ 9,137,244,170, 31,196,112, 49, 63,131, 47,205, 68,105,169, 30,153, 41, 91,224,228,221, 82,192,241,232, 82,219,241, 10, 33,230,
+188, 63,111,185, 88, 87,154,103,226,205, 5,156,171,176, 68, 40,146,242, 12,178, 46, 24,203,120, 21, 55, 99,242,120,118,214,231,
+ 75,230, 0, 24, 91, 99, 52,200, 13,211,191,253,118,117,211,142,173, 66,221,114,247,125,192,148,149,228,129, 21, 42,101,131,219,
+119,132, 99,112, 19, 62,239,252,183,140, 52, 32, 10,142,206, 1,200,186,186, 29,169,215,246, 51,157, 34,134,201, 54,238,144,140,
+171,206, 96, 5,187, 50,157,122,119,110,179, 43,192,207,203,147, 16, 30, 60, 79, 64,120, 14,111,142,232,133,185,187,159,128,227,
+ 56, 12,239,221,169,199,242, 41,221, 9,207,243, 32,132, 71, 70,110,145,238,236,245, 7, 61, 30, 23,147,235,214, 68,166,154,183,
+235,214,233,222,237,107,161,150,135,135,209,106,236, 87, 15, 24,224,114,165, 50,215,233,206,137,141,161,192,111, 47,102,224, 24,
+134,105,236, 6, 46,245,248, 50,248,117,158, 44,252,121,199,113, 87,117, 65,214,132,125, 91,126, 26,177,246,231,159,183, 1,152,
+ 74, 31, 35, 20,202,171, 65,118,118,246, 75, 55, 89, 87,175, 94,205,254, 43, 38,171,117,235,214,157, 1,124,157,157,157, 93,110,
+182,190,110,219,182,237,252,202,117, 85, 37,212,132,144,177, 55,111,222,188, 88,147,230,204,153, 51,189, 0, 52,184,117,235, 86,
+249, 57, 26,180,110,221,186, 65, 85,251, 42,149, 74,174,121,243,230,169, 43, 87,174,204,166, 37,228,239, 53, 88, 15,210,247,124,
+ 16, 97,204, 41, 3,128, 7, 86,152,148, 63, 53,237, 25, 44,220,178, 77, 11,199, 47, 11,171, 95, 15, 26,173, 9, 39,111,165,130,
+227, 44,224, 88,246, 89, 36,139, 5,199, 90,208,187,185, 11, 58, 24,166,226,187, 35,137, 96, 57,254,171,154, 52,159,199, 76,248,
+ 49, 45,162, 94,219,205,243, 68, 42, 19, 11,212,141,124,157,221,102, 13,111, 46,248, 96,112, 24,244,102,246,181, 38,238,204,217,
+132, 60,178,222, 42, 77,254,223,231,206, 36, 85,253,141, 99,107,205,123, 13,209,167,182,163, 7,244,180, 39, 70, 53, 44,133, 79,
+160,209, 89,240,164,200,130, 92,131, 10, 50, 38,199, 42, 77,158,160,153,143,183,167,242,202,174, 79, 82,156,133,165, 34, 55, 33,
+ 43,145, 10, 88,112, 60, 17, 18, 85,130,177, 94,104, 79,113,121,191,172,154,210,169, 80,218,141,239,220,171,191, 67,250,246,201,
+140,162, 81,111,184, 69,248, 34,229,226, 38,228,223, 58,130,162,236, 84,198,222,160,130,187,115, 32,250,142, 29,133,111, 70,181,
+134,166, 84, 3, 97,206, 99, 7,169, 88,230, 88,157, 38,225, 48,246,219,229, 75, 60, 69, 66,193,211,235, 89,190,113, 22,232,141,
+ 70,128, 99, 33, 23,241, 96, 72,249,255, 44,224, 44,102,101,179, 97,159,188, 3,224,122,109,121, 79,200, 35, 59,194,220,152, 72,
+240,150, 80, 98,209,131, 1, 46,199,231,147, 10,211,211,196,157, 25,211,178,247,196, 72,194,224,210,139,124, 71,225,206, 24,208,
+170,129,173,141, 77,233, 3,100,238,125, 15,143, 33, 39,238, 29,223,194,152, 55,167, 43,127,249,229,151,129, 12,195, 76,171,220,
+ 7,237,239, 24, 94, 76, 53,169,230,255,170,166,131,131, 67,195,250,245,235,207,183, 88, 44,157, 37, 18,137,187,217,108, 6,207,
+243,185, 82,169,244, 82,106,106,234, 23,106,181, 58,249,191, 45,239,199,142, 29,179,218,100, 89,163, 41, 22,139,113,230,204,153,
+ 71,214,154,172, 42, 22,160,223,186,119,239, 94,236,222,189, 27, 0,112,238,220, 57, 4, 7, 7,219, 84,117,108, 70, 70,134,205,
+240,225,195,183, 2,240,173, 73, 51, 41, 41,169,225,146, 37, 75,176,119,239, 94, 0,192,150, 45, 91,208,168, 81,163, 42,211,115,
+247,238, 93,225,103,159,125,214, 16, 64,246,223,253, 29,253,211, 13,214, 19, 63, 39,105, 4, 12, 28, 0, 60,169,235,201, 18,114,
+201,242,230,158,226, 62,103,246,254,216, 89, 46, 17, 96,193,250, 89, 25, 5,197,154,118, 34, 6, 60, 0,176, 4, 2, 39, 91,105,
+244, 87, 19,154,251,149,148, 25,112,232, 70,214,197,248, 60, 82,167, 80,104,124, 54, 57, 5,192,241, 95, 21, 36,211,104,194, 55,
+167,118,238,156,211,167,217,140,193,205,112,240,106,234, 12, 0,235,107, 45,228, 60, 15,194,179, 21,157,218,159, 58, 25, 30,224,
+217, 63,189, 49,240, 32, 79,255,198,215, 45,130,213,149, 97, 68, 37,110,232, 91, 79, 41,253, 97,202,148,183,237, 45, 5, 73, 40,
+ 54, 73,144, 81, 98, 64,174, 94,140, 50,145, 27,178, 30,196,114, 2, 6,167,106,143,178,160,148,176, 6, 71, 39,169,173, 32,188,
+231, 59,222,165,199, 63, 45,145, 50,172,208,126,232,151,142,133,103, 86,166,178,218, 2, 45,195,160,214, 9, 46, 29, 28, 28,131,
+ 13, 69,169, 66,117, 73, 33, 28, 61,194,208,231,181, 1, 88,212,191, 9, 52,165, 90, 20, 20, 71,147, 32, 79,123, 38,237,210, 54,
+204,235,219, 24, 69,121, 57, 48, 90, 0, 70,107, 44, 54,152, 12,101,213, 94, 71, 1,126,254,112,246,199, 99,252, 61, 93,109,202,
+ 7, 11, 16,158, 67,243,198, 1,232,217,185, 45, 78, 93,190,130,155,177, 15,193, 63, 27, 44, 64,120, 30,153,249, 37,121, 6, 51,
+183,169, 78, 23,148, 99, 65, 44,134, 42, 13, 24, 94,160,105,176,169, 59,163,228,128,207,219, 5,217, 77,154, 51,192,223,206, 70,
+198,192, 96,225, 96, 48, 89,160,185,242, 3,156,235, 55,133, 82, 46,103, 34,160, 23, 1,160,147,135, 82, 40,149, 24, 57,114,164,
+ 60, 47, 47,239,124,255,254,253,155,244,236,217, 83, 25, 25, 25, 9,173, 86,139,147, 39, 79, 66,171,213,250,251,250,250,250,159,
+ 60,121,114, 88,187,118,237, 18,124,124,124,186,238,217,179,167, 46,125,100, 69,248, 87, 39,117, 30, 0,251,108, 41, 47, 33,158,
+118, 52,231, 9, 33,220,139,166, 93, 42,149, 34, 58, 58,250,165, 71,178,110,220,184,241,232, 69, 34, 89, 90,173, 86,226,233,233,
+ 9,103,103,103,112, 28, 7,173, 86,139, 3, 7, 14, 64,173, 86,131,231,121, 40, 20, 10,124,249,237,122, 60,184,115, 30,215,175,
+ 95,135, 90,173,150,212,166, 89, 88, 88,200,132,132,132,192,104, 52,130,101, 89, 24, 12, 6,156, 62,125,186,226,119,145, 72,132,
+143, 23,175,194,195, 91,231, 17, 19, 19,131,194,194, 66,134,150,234,191,223, 96,253,101, 56,142,157,251,203,230,157,209,115,167,
+142,194,244,209, 81,190, 95,252,184, 63, 42,161,128,108, 6,128, 38,174,204,132,113,221,130,252, 28,149, 98, 44,218,126, 11, 32,
+100,238, 95, 61, 95, 92, 17,121, 24,230,193,204,248,253,250,255,177,119,222, 97, 81, 29,109, 27,191,231,108,103,119,233,125, 1,
+ 65, 80, 17, 81, 81,192,174, 17, 21,187,198,104, 52, 70,141, 45,177, 27, 53, 26, 75,140, 70, 99,236, 38,182, 24,141,154,166,177,
+183, 24,123,199, 6, 54, 84, 80, 80, 20,145,186,244, 94,182,239,153,239, 15,202,171,134,178,160,249,222,188,230,252,174,107, 47,
+216,118,239,156, 57,101,238,243,204,204, 51, 9, 33,243,135,250,195,203,217,162, 81,131, 6, 68, 20, 27,107,194,154,127,172, 1,
+214,114,113,227,190, 45,237, 78,131,101, 97,101, 46,246,129,209, 0, 43,185,184,113,239,102,150,167, 0,192, 74, 42,244,169, 44,
+210, 85,101,184,183,158,112,188, 84,204, 31, 47, 11,112,174, 55,186,127,119,179, 62,253, 7,153,201, 5, 6,100,223, 60,139, 2,
+129, 43,244, 54,238,208,232,115,144, 28, 23,107,188,112, 35, 58, 37,171, 80, 51,171,198, 98, 82, 92, 73,137,123,108,239,233,215,
+221, 58,235,248,151, 25,158, 99,118,215,103,192, 50,133,187, 6,166,203, 28, 90,155,221,122, 22, 87,196,210,191, 70,112, 94,165,
+ 32, 63, 63, 94,111,132,179,202,200, 55,143,189,244, 43,230,245,110,142,220,156, 12,168,117, 6,228,171, 12, 58, 39, 43,137, 88,
+ 19,247, 0, 26,157, 1, 90, 61, 11,129,149, 11,206,134, 69,102,177,122,253,169,170, 52, 99,179,232, 61, 0,242, 23, 95,107, 96,
+ 79, 90,204,181, 48,187, 7,189, 10, 9,201, 74,236, 56, 17,230, 95,246,185,186,223,157,178,134,210,110,230, 23, 34, 87,132,162,
+ 83, 93, 6,183, 55,113, 36,173,205, 36,194,239, 87,127, 54,220,183,157,183,141,152, 77, 14, 3, 97,117,144, 25,249, 80,137,140,
+176,116,243, 2,171, 45,164, 37,106,117,222,195,255,199, 37,130, 56, 56,254, 23,240,241,241,113,178,180,180,124,248,249,231,159,
+219, 12, 28, 56, 16, 71,142, 28, 65, 65, 65, 1,126,251,237, 55,172, 95,191, 30,139, 23, 47,134, 94,175,199,182,109,219,164,135,
+ 14, 29,106,189,121,243,230,100,119,119,247,166, 9, 9, 9, 53, 45,168, 78, 0,136, 1, 8,202,218, 46, 2,128, 61,121,242, 36,
+250,244,233,131,147, 39, 79,178,101,175, 25, 9, 33,122, 74,169,166,174, 6, 75, 36, 18,225,209,163, 71,111,196,100, 9, 4, 2,
+200,229,114,136, 68, 34, 60,126,252,184,214, 38,203, 96, 48,240,146,147,147,145,159,159,143,238,253,251, 99,221,138, 21,232,210,
+165, 11,186,119,239, 14, 74, 41,206,159, 63,143,224, 14,205, 48,244,221, 32, 68, 71, 71, 67,175,215,155, 84,222,180,180, 52,164,
+167,167,163, 87,255,254,216,190,121, 51,218,180,105,131,198,141, 27,195, 96, 48, 32, 36, 36, 4,131,123,118,128,228,189, 96,196,
+196,196,112, 7,245,255,138,193,122,144, 65,111,248,218,147,227, 31,246,108,221,175,127, 71, 95,108,223,119, 97,153,175, 47,217,
+ 11, 0,182,230,226,165, 35,187,120, 33, 42, 49, 23, 23,238, 41,143, 71,101,210, 55, 50,251,130, 53,194,206,214, 66, 10,240, 68,
+ 80,233, 88,131,197, 51,212, 56, 48,153,165, 20,210,119,230,226,163,254, 81,110,109,124,221,220,202,103, 17,202,251,172,197,168,
+200,167,245, 90, 53,118,170, 7,163, 30, 48,234, 97, 49,116, 55,240,141,172,198,114,116,244, 20,159,155, 59,235,179,246,189,223,
+251,192, 76, 36,181,132,177, 32, 9,250,180, 72,100, 63,185,130, 98,105, 35,164, 37, 60,195,254, 51, 55,243,159, 36,103, 23, 48,
+ 12,206,166,231,107,102,199,230,208,162,154,116,213,122,172,248,234,203, 89,125,247,239,221,103, 46,246,234, 72, 98, 55,245,201,
+ 23,241, 13, 98,251,250, 1, 76,137,196,142, 46,255,109,159, 69,177, 22, 43,107,210, 41, 41, 46, 56,124,254,236,233,161, 13, 61,
+ 59,154, 63,191,125, 2, 42,181, 6, 26, 61,208,180,117, 16,140, 70, 42, 34, 12, 97, 45,120, 60,146,145,157, 11,162, 55,166, 95,
+189,255, 60,245,218,253,103, 60,141,121,205,218, 47, 29,116,132, 55,173,127, 80, 75, 64,175,194,187,239, 52,199,186, 93, 23, 62,
+ 5, 48,230,245,118,114,105, 4,139, 2, 29,155, 58,144, 31, 1,116,188,243,199,122,159,192,247,102,160, 54, 17,172,102,246,164,
+119,179, 6,138, 95,215, 45,157,107, 99,235,218,136, 71, 88, 61,168,147, 31, 80,144, 76, 73,114, 24, 44, 93,218,192,168,232,128,
+109, 27,191, 45, 98, 89,186,183, 46, 41, 42, 56, 56,222,102,212,106,245,225, 85,171, 86,217,244,235,215, 15, 0, 80, 84, 84,132,
+176,176, 48,252,244,211, 79,144,201, 94,190, 78,246,233,211, 7,148, 82,155, 69,139, 22, 29, 6,208,174, 42,205, 14, 29, 58,244,
+223,184,113,163,178,101,203,150,207,202, 76,150, 16, 0,243,224,193, 3, 38, 41, 41,137, 88, 91, 91, 83,133, 66,161, 87, 42,149,
+ 44, 0,227,216,177, 99,121,114,185,188, 97, 81, 81,209,229,186, 26, 44,145, 72,244, 70,198,100, 9, 4, 2, 16, 66, 32, 18,137,
+ 32, 20, 10,145,146,146, 82, 43,147,101, 48, 24,248, 39, 79,158,196,157, 59,119,176,184,101, 75,124,230,226, 2, 27, 27, 27,132,
+132,132,128, 82, 10,153, 76,134,156,156, 28,236,221,187, 23, 93,187,118,133,193, 96, 16,154,162,123,240,224, 65,132,135,135,227,
+155,192, 64,124,102,105, 9,185, 92,142,243,231, 75,123,253,196, 98, 49, 18, 18, 18,112,254,252,121, 4, 5, 5,113, 7,245,223,
+109,176,130, 8,225, 19, 71, 56,233,180, 42, 80, 3, 5, 8, 20,190,190, 68, 24, 21, 69,117,181,253, 81,134,193,151, 27,119, 28,
+239,187,118, 70,127, 50,126,128,191, 98,201,175,151, 38, 1,192,199,239,123,187, 72,197,124,108, 56, 26, 69, 25, 6, 95,190,137,
+ 13,244,245, 37, 66,134,193,164,238,109, 26, 67,153,167, 69,172, 50,239, 98, 20,165, 38,117,233, 92, 88,251, 17,118,254, 25,146,
+180,126,167,250, 17,165, 20, 86,114,113,227, 81, 17,177,245,126, 61, 25,158,248,221,126,245, 35,202, 82, 88, 73, 5, 62, 99,162,
+ 59,212, 56,139,176, 85, 61,225,248, 47,230,206,238, 48, 96,204,231, 18,195,163, 3,208,198,158, 1,171, 83,161, 64, 39, 68, 30,
+207, 9,201,137,137, 88,190,237,120, 82, 65,177,118,232,131,140,218, 25,203,152, 44, 90,228,107, 79, 6, 46,255,122,254,185, 21,
+ 75, 23,201, 85,207, 66,138,120,196,160,226,121,116,230, 47, 93,188,150, 20,106,180, 31,196,230,208,194,154,116, 52,230, 88,185,
+234,187,141,125,199,141, 24,244,200,187, 81,103, 91,163, 50,206, 86, 93, 80,144,177,251,116,184, 83,217,157, 33, 1,128,216,228,
+108,100,230, 23, 27,140, 6,253,101,115, 1,150, 60, 52, 37, 26, 88,134,151, 35,177, 31,216,201,111,184,189,185, 16,170,162, 60,
+ 56,152, 11,208,179, 77,131,225, 94,142,100,238,179,116,154, 89,119,131,165, 7,213,171,112, 99,101, 87, 31,106,212,251,192,168,
+135, 46,226,247,218, 71,194, 8, 62,155,250,142,220,194, 90,251,156, 65,177, 12, 48,179, 3,177,112, 7, 44,235, 19, 65,147, 15,
+160,124,246,208,240,233,240, 17,217,113,241,201, 63,219,153, 97, 13,119, 9,225,224,120,153,132,132,132,145, 95,124,241,197,181,
+ 54,109,218, 56,218,217,217,161,121,243,230,248,243,207, 63,241,249,231,159, 87,124,166,101,203,150,160,148, 34, 39, 39, 7,171,
+ 86,173, 74, 83, 42,149, 35,171,211,124,248,240,225,163,157, 59,119,190,227,235,235,171, 19, 10,133,121, 0,196,121,121,121,146,
+156,156, 28,162, 86,171,193,178, 44,107,105,105,105, 84, 42,149,250,161, 67,135,106, 66, 67, 67, 27, 20, 23, 23, 39,188, 78, 4,
+171, 85,171, 86, 15,242,242,242,242, 25,134,121,237, 20, 14,229,230,170, 89,179,102,246,197,197,197, 44,128,220,186,164,112, 48,
+ 24, 12, 8, 12, 12,196,153, 43,119,113,242, 66, 40, 10,148,143, 49,105,220, 72, 52,111,222, 28,103,206,156,169,243, 62,107,209,
+162, 5, 78,159,191,134,107,119,238, 35, 33, 38, 2,159, 78, 26,135,166, 77,155,226,244,233,211,220, 1,253,119, 27,172, 38,246,
+164,133,162,161,232,247, 69,189, 27, 52, 17,116, 95, 4, 34, 48,195,129, 70,167, 59,124,185,124,211,163,230,142,100, 68,100,122,
+205,179,189, 94,138, 98,165,211,135, 77, 29,200,158,251,209, 62,195,223,109,227,134,237,127, 74, 23, 2,192, 7,157, 60,113,235,
+ 73, 38,110,198,100,236,121,152, 65, 31,190,238,198, 53,119, 36, 82, 80,236, 89, 53,109, 64,144,187,171, 19,126, 58,114, 13,132,
+224,176, 73, 13, 45,165,180,141,175, 59,214,239,124,117,198,160, 83,189,239,246,171, 31,157,121, 80,208, 27, 0,122, 52,145,157,
+106,213,192,186, 94, 77,145, 12, 51, 17,127, 66,239, 65, 31, 73, 12, 49,127, 2,241,231, 65, 12, 26,168,116, 44, 82,179, 10, 81,
+ 98,233,134,144,176,251,170,124,181,118,198,195,140,186, 69,237,162, 50,233,179,150,206, 36,177,168, 88,229, 44,181,111,160,230,
+ 49, 44, 91,164,161,184, 21, 21, 95,240, 48,149, 62, 54, 69, 35, 54,150,106,219,185,146, 78, 63,238,216,255,149, 64, 40,250,128,
+ 71, 64, 28,172,100,246, 63,174,253, 6,230,230,114,176,218, 34,160, 56, 19, 3,167, 44,207,140, 76,209,121, 2,128,183, 29,145,
+191,227, 37,220,193,103, 72,242,197,167,218, 5, 53,253, 6,209, 99,226,136,158, 45, 5,172,182, 24,211, 86,237,195,214,185, 3,
+240, 81,183, 38,130, 19,215, 99, 38, 2, 88, 82,215,125, 77,141, 6, 80,189, 10,237,230, 95,121, 68,128,107, 20,232,120,103,255,
+ 82, 31,224,174,201, 26, 1,132, 8,248,206,164,137, 95, 61,153,144, 77,190, 14, 54,249, 58,229,185,117, 0,169,247, 14, 33, 78,
+129,244,251,213,139,139,183,111,255,233, 44,203,224,235,154, 82, 94,112,112,252, 91,161,148, 62,179,178,178,234,213,167, 79,159,
+ 11,103,206,156,177,105,214,172, 25, 0,160,124,198, 90, 96, 96, 32,188,189,189,145,158,158,142, 15, 63,252, 48, 43, 53, 53,181,
+ 23,165,180,218, 49,189,133,133,133,113, 7, 15, 30,116, 44, 46, 46,110,185, 96,193,130, 12,119,119,247, 2,181, 90, 77,242,242,
+242, 88,131,193, 0,107,107,107, 81,203,150, 45,209,190,125,251,162,176,176, 48,143,164,164,164, 66, 0,241,117, 41,255, 39,159,
+124,130,195,135, 75,155,137, 55,145, 23, 75, 40, 20, 34, 56, 56,216, 37, 52, 52, 52, 5, 0,234,146, 23,235,197,230,229,254,253,
+251,184,124, 55, 25,124,173, 10,162, 76, 37,110, 28, 57,136,254, 19, 38,195, 96,168,251,104,133,251,247,239,227,143,243, 55, 32,
+ 19,243,241,248,241, 67, 28, 60,120, 16,147, 38, 77,122, 45, 77,142, 26, 12, 86,131, 6, 68, 36, 46,194,162,158,129, 46,115, 62,
+232,216,128,167, 47, 80,130, 53,178,224, 9, 0, 7, 59, 11,252,254,251, 30,207, 61,251,246,133,181,112, 17,108,100, 13,134, 47,
+ 35,211,105, 73, 45,126,123,209,218,125,215, 62,248,125, 86, 16,127, 82,111, 31, 27, 0, 16,242, 25,108,248,243,161, 1,192,162,
+215,217,168,118,174, 68, 82,164,199,120, 39, 91,203,133, 95,124,210,215, 38, 40,208, 27,151,111, 62,192,198,131, 97, 87, 68, 25,
+216,105,242, 65,205,234, 95,157, 2, 91,233, 44, 66,176, 53,143,167, 52, 26,169,147, 80,102, 13, 93,252, 37, 64,167,134, 90,163,
+ 67, 82,182, 17, 73, 57,106,240,165, 66,220,137, 73, 86,217,166,225,120, 93,183,153, 16, 66, 58,122, 73, 20, 95, 45,251,206, 85,
+173, 42, 50, 20,228,102, 25,132,162, 27, 2,169,153, 56,181, 54, 58, 97,201, 84,221,217, 83, 24, 0,176, 60,145,132,150,204,159,
+ 57, 90,150, 18,117, 6, 13, 25, 37, 8,165, 48,107,210, 23,230,102, 60, 97,167,250,194, 68, 0,168,239,100, 41, 90,245,245,231,
+150, 51,230,126, 93,227, 24, 47, 95, 66,132,205, 91, 57,205,104,230,110,141, 43,225,143,112, 37, 50,225,225,149, 59,143,155,118,
+105,174,128,183,171,213,116, 95, 66, 86, 70,209,218, 71, 68, 75,119,140, 1,208,171, 43,102, 17,250, 58,146, 97,173, 62, 88, 80,
+233,236,193,170,168, 15,176, 49, 70, 10,194,227, 1,132, 41,157,209,152,116, 29,124, 43, 47,186,103,255, 31, 37, 63,253,180,243,
+155,168, 76,202, 69,173, 56, 56,106, 32, 47, 47, 47, 66, 42,149,246,244,243,243,251,109,218,180,105,230, 35, 70,140, 80,140, 27,
+ 55,142, 1,128,244,244,116,118,253,250,245,202,239,191,255, 62, 63, 43, 43,107,140, 78,167,139, 52,229,134,151, 16, 18,250,243,
+207, 63,103, 94,189,122,181,105,235,214,173,197, 1, 1, 1,172,181,181, 53, 95, 44, 22, 27,181, 90,173, 58, 38, 38,198,248,236,
+217, 51,231,188,188,188,167, 0, 98,235,210,125,175, 80, 40,192, 48,204, 18, 87, 87,215,175,148, 74,101,179, 55, 49, 6,171, 97,
+195,134, 10, 0, 79, 93, 92, 92, 26,214,182,123,240, 47, 13, 54,159,143,220,220, 92,148,164, 61,132, 36,249, 9,252,100, 12,124,
+173,229,176,176,176,120, 45, 51,148,159,159, 15, 20,167,224,218,181,251,128,193, 0, 75, 75, 75, 88, 90, 90,114, 6,235,239, 50,
+ 88, 77, 29,200, 36,107, 17,214, 79,232,219, 64, 88,191,158, 43, 52,201,119,112, 63,169, 8, 95,182,109, 29,197, 19,155,171, 39,
+140, 28, 16, 56,104,176, 7,130,218,183, 34,245,157, 45,167,175, 92,187,101, 74, 83, 71,242,249,195,116,186,193,148, 31,126,152,
+ 65,227,154, 56,144,159, 46, 69, 36, 79,116,149,170,192,178, 20,151, 34, 83, 17, 25,159,251, 83,116, 6,141,171,205, 70, 52, 85,
+144, 96, 62,152,125,148, 82,137,165, 76, 86,216,178,133,143, 93,112,187, 22, 76,175,206,129, 16,242,128,107,183,238,227,179,181,
+135,111,176, 44,237, 27,110, 98,247, 96,233,140,193,151,141, 83,233,140, 65,253, 75, 51, 6, 41,165,180,116, 22, 97,245,195,186,
+120, 60,146, 86,146,112,219, 73, 96,219, 8,170,216, 75,136,207,101,145,144, 81,136, 2,190, 19, 52, 41, 41, 0,101, 19, 67, 40,
+173,243,209,108,103,103,231,224,233,235,221, 96,211,142,131,208,149,228, 35, 46,228, 55, 20,229,166, 98,233,143,127, 54,112,117,
+117,237,156,156,156,124,185, 22,102,205,251,194,241, 61, 14,160, 0, 79, 32,198,137,205,251,145,101,107, 6, 59,169, 16,172, 42,
+ 19, 19,102,140,176,236,221,125,132, 37, 0, 36, 60,190, 7,119,169,202, 36, 93,157, 45, 6,125,208,165,177, 21,244, 42,236, 56,
+125, 79,205, 0,189,118,158,125, 24,219,197,199, 74,242, 65, 71,119,235, 37,202,188,247, 81,199,100,160,229, 17,172,138,136, 94,
+ 29,102, 15, 30,160,212,216,196,158,196,238, 11,205,144, 13,238, 30, 32, 21,242, 9,161, 69, 41,160,102,118,216,178,227, 64,145,
+ 72,143,109,220, 37,131,131,195, 52, 74, 74, 74,194, 9, 33,205,103,207,158, 61,108,254,252,249,239,200,100, 50, 79, 0, 40, 46,
+ 46,142,211,235,245, 87, 0,236,169,205,108,191, 50,195,244,148, 16, 18, 23, 27, 27,235,184,107,215, 46, 43, 0,146,178,183,213,
+ 0,242, 0,164,191,206, 12,194,114, 51,165, 80, 40,190,122, 83,245, 80,110,166, 92, 92, 92, 26,214,229,251, 60, 30,207, 72, 8,
+ 1, 33, 4, 98,177, 24, 87,175, 94,197,144,190,221, 17,125, 34, 15,205,172,228,104, 61,102, 2,246,157, 59, 7, 30,143, 7, 66,
+ 8,120, 60, 94,173,218, 17, 62,159,143,107,215,174,225,163, 15, 7, 67,204, 7, 44, 45, 45, 49,123,246,108, 28, 61,122, 20,124,
+ 62,183,154,222,223, 19,193, 34, 88,114,238,183,229, 66, 24,245, 56,246,219,183, 56,254,160, 72,251, 56, 19, 95, 54,206,196,250,
+131, 40,100, 51,215,238,156,120,238,218,131, 53, 99,135,246,147,118,237,210, 29, 93,131,186,240,155,182,234,188, 16,192,134, 23,
+ 26,234,224,234,114,101, 24, 89,124,179,237,244,163, 9,251, 66, 98, 8,116,133, 24,218,163, 21, 53,178,248,166,134,198,255, 47,
+154,150,102,242,125,215,194,194,172,161, 43, 66,252,189,139, 18, 15,207, 6,128, 81,135,167, 79,159,224,251, 29, 71,216,144, 91,
+143,127,215, 26, 48, 45, 54,135, 22,155,170, 89,234,168, 12,176,148,137, 26,247,110,102,121,138, 5,133,149, 84,232, 67, 89, 35,
+172,164, 2,159, 30, 77,100,167, 40,165,212,220, 76,224, 67,141,250, 26, 53, 85, 90,195,214, 29,191,252,244,221,199, 31,127, 44,
+203, 74, 78,131,178,224, 1,138, 68, 46,208, 75,221, 16,123,239,138,170, 68, 99,168,177,241,174,174, 62,179,178,178, 50,194,111,
+230, 96,223,143, 43,160,215,106,144,145, 92,234, 81,149, 89, 5,176,176,115, 9,171,141,166,206,192,230, 15, 26, 49, 94,104,102,
+ 14,179,143, 6,245, 19,197,102,107,224,175, 48, 47,189,200, 21,101, 34,250,252, 53, 4, 21,151,250,181,103, 73, 12,220, 91, 40,
+ 76, 42,167,185, 68, 56,173,119,128, 11,226, 18, 83,113,245, 97,202,142,103,217, 84,233,101, 75,118,196, 42,243, 38, 14,104, 91,
+ 15,235,142, 70,125, 90,149, 41,170, 74,211,215,145, 12, 3,208,177,116,144,187, 10, 20,232,232,235, 72,134,153, 50,115,176, 50,
+ 77,190, 16,195,191, 59,149,176,224,192,237,172, 1,115,134,119,178,104,223,190,143, 8, 6, 45, 10, 85, 26,125, 84, 46, 45,120,
+157,125,244, 26,209, 73, 78,147,211,252,159,212, 44, 51, 59,191,151, 61,222,164,166, 18,175,228,101,122,221,109,127,177, 59, 80,
+169, 84,242,203,162, 87,213, 14,114,175, 73,243,197,238,192,148,148,148,147,101,209,171,106,163, 88,149,104, 42,219,180,105, 99,
+211,191,127,127, 24,141, 70, 60,121,242, 4, 9, 73, 73, 8,158,248, 41,172,172,172,112, 37, 34, 2,143, 31, 63,198, 87, 95,125,
+ 5,150,101,113,227,198,141,228,154, 52, 5, 2,129,174, 69,139, 22,194,247,222,123, 15, 6,131, 1,207,158, 61, 67, 74, 74, 10,
+ 62,251,236, 51, 88, 90, 90, 34, 60, 60,188, 66, 83,163,209, 32, 46, 46, 78,247,255,113, 44,253,123, 12, 22, 96,132, 81,143,252,
+115,139,176,225, 42,116, 58, 61,124, 30,102,208,231, 47,188,191,197,207,150, 28,139,120,240, 40, 46,252,122, 87, 17, 50, 34, 75,
+191, 83, 11, 98,178,104,106, 43, 55,126, 33,116,133, 22,120,118, 10,207,211, 11,139, 98,178,104,106,109, 55,130,178, 70, 2, 93,
+ 9,144,122, 7,161, 87, 46, 35,228,198,125,220,142,124,100, 12, 13,143,217,199,176,248, 38, 42,139, 62,169,181, 38,165,144,247,
+ 93,135,209,145, 79,235,181,242,118,172, 7,163, 1,148,213,195,114,232, 30,140,137,106, 95,175,149,151, 85,189,210,200,149, 30,
+214,159, 92, 4,190,147, 84,171,119, 59, 81,183,173,163,167,248,253,194,188,236,182,221, 58,183,147, 89, 54,233,141,172,167, 49,
+120,114,255,154, 42,252, 65,108,232,237, 68,221,107, 69, 71, 92, 92, 92,222,233,214,185, 49,134, 78,248, 2,186,146,124, 60, 11,
+249, 5, 69, 57,105,184, 26, 38,199,163,130,130,118, 0, 76,142, 96,133, 38,232,155, 2, 64,199,250,194, 68,115,104,156, 70,246,
+235, 15, 49, 81,131,213, 20,128,148,100, 33, 54, 69,155,255,254,143, 73, 70, 0,144,138, 9, 95, 70,243, 45, 76,209,245,117,183,
+109, 36,229,233,177,243,220, 67,176,108,233, 50, 75, 44,139, 45, 59, 47,198, 78,252,230, 35,127,248,214,179,110, 65, 8, 33,181,
+ 9,237, 19,138, 78,183,247,125,237,163,190,176, 16, 96,117,184, 54,221,198,167,211,134,156, 78,117,141,132, 69,166,208, 20, 0,
+ 19,155, 40,200,214,233, 27, 78, 47, 12, 60, 23,213,113,214, 39, 3, 44, 64,185,133,209, 57, 56, 56,254, 43,145,192, 9,115,231,
+206,221,202,227,241,236, 1, 16, 74, 41, 52, 26, 13,255,199, 31,127, 20, 24, 12, 6,134,199,227, 25, 37, 18,137, 33, 60, 60, 92,
+207,178,108,166, 78,167,155, 80,147,166, 86,171,141,221,180,105, 83, 3,189, 94, 95, 49,227, 80,163,209,224,151, 95,126,129, 70,
+163,129, 88, 44,134, 92, 46,199,179,103,207, 64, 8,209, 25,141,198, 88,110, 79,188, 73,131, 69,241,117,135,143, 22, 45, 2, 64,
+ 64,177,248, 21,115, 5, 0,136,200,166,202,166, 14,228,179,166,173, 58, 47, 42,255, 78,109, 11,160, 54, 26, 7,183,106,238,189,
+ 23, 0, 52,212,248, 81, 93, 54,162, 64,163,250,160,101,171,118,251, 88, 74,249, 6, 74,127, 98, 88, 28, 82, 27, 16,109,202,204,
+185, 42,239, 60, 50,242,194,203, 23,112,102, 65,255,211, 45, 88,150,142,129, 82, 74, 43,186, 5,191,149, 32, 43, 95, 83, 99, 30,
+167,107,113,154,238,173,234, 9,199,159,189,126,111,130,209, 72,157,120, 60,146,166,210, 26,182,190,174,185, 42,187,251,186,236,
+235, 64,206, 70,180,112,236, 97, 39, 45,139,106,149, 0, 89, 37, 56,155,156, 81,120,185, 46,154,185,197,250, 1,243,215, 31,253,
+ 83, 36,224,241, 65,105,105, 34, 80, 74,161,214, 25,115,202, 77,152,159, 45, 81,204,254,195,176,151,199, 35, 9, 53,233,221,124,
+156,186,110,232,202,243,159, 63,140,207,253,233,121, 46,125, 0, 0,207,115,233,131,134,182,100, 97,108, 90,225,231, 15, 18,114,
+191,173,237,184, 9, 74,112,181,213,208, 69,127,121,237,117,235, 51, 90, 73,239, 3, 24,216,212,129,116, 31, 58,235,251, 89,132,
+128, 91, 38,130,131,227, 95, 68,121, 20,139, 97,152, 37,111, 74,179, 60,138, 5,224,105, 45,190,115, 19, 64,243, 55,185,109,225,
+225,225,217, 0,178,185,189,252, 95, 50, 88, 15, 51,232, 22,152,176,152,179,169,159,171,242,251, 74,122, 30,128,237,235,108, 68,
+153,134,205,155,172,152,136,116,186,240,239,168,240, 50, 51,245,183,140,229,137,202,160, 61, 1,160, 81,163, 70,244,233,211,167,
+160,148,190, 86,246,221,232, 76,122, 31,175, 44,185, 80,153,201, 6,208,201, 20,189,152, 44,250, 13,240,215, 46,224,167,217,116,
+ 41,128,165,117,218,230, 58,102,106, 55,249,216,202,160,231,128,154,179,233,115,112,112,188,157, 38,235, 77,107,190,238,194,207,
+ 28,111,129,193,226,248,223,229,201,147, 39,220,178, 6, 28, 28, 28, 28, 85, 99,252, 27, 52,185,164,195, 28, 47,193,112, 85,192,
+193,193,193,193,193,193,193,241,102, 33, 0,130, 43,181,226,181,152, 29, 64, 8, 9,174,181,213,175, 65,159,211,228, 52, 57, 77,
+ 78,147,211,228, 52, 57,205,183, 79,179, 38,237,183,102,118, 34,125, 97,240,242,155,126, 0, 8,230, 52, 57, 77, 78,147,211,228,
+ 52, 57, 77, 78,147,211,252,183, 61,184, 46, 66, 14, 14, 14, 14, 14, 14, 14,142, 55, 12,103,176, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56,131,197,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,206, 96,113,112,112,112,112,112,112,112,112,
+212, 29, 82,203,149, 73, 56, 56, 56, 56, 56, 56, 56, 56, 56,106,128,139, 96,113,112,112,112,112,112,112,112,112, 6,139,131,131,
+131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,156,193,226,224,224,224,224,224,224,224,224,224, 12, 22, 7, 7,
+ 7, 7, 7, 7, 7, 7,103,176, 56, 56, 56, 56, 56, 56, 56, 56, 56,131,197,193,193,193,193,193,193,193,193,241,223, 55, 88,132,
+144, 96, 78,147,211,228, 52, 57, 77, 78,147,211,228, 52, 57, 77,206, 96,113,112,112,112,112,112,112,112,112,112, 6,139,131,131,
+131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,156,193,226,224,224,224,224,224,224,224,224,224, 12, 22, 7, 7,
+ 7, 7, 7, 7, 7,199,127, 9, 2,160,210,153, 0,148,210,243, 38,139,212, 97, 54, 65, 77,250,156, 38,167,201,105,114,154,156,
+ 38,167,201,105,190,125,154, 53,105,215,198,127,252,163,161,148,254,109, 15, 0,193,156, 38,167,201,105,114,154,156, 38,167,201,
+105,114,154,255,182, 7,215, 69,200, 97,106,148,210,145, 16,226,200,213, 4, 7, 7, 7, 7, 7, 71,205,240,223,164,152, 15, 33,
+109,214,188, 83,111, 81,159,203, 9,189, 76,104,176, 25,252,103, 12, 24, 91, 26, 76, 43,181,197,175, 97, 2,222,184, 38, 7, 64,
+ 8, 89, 65, 8,230,148,253,191,154, 82,250,197,219,184,157,115,230,204, 25,236,239,223, 10,214,146,116,180,242,122, 2,228,238,
+ 1,172, 63,192,130, 51, 93,208,202,191, 3,174,220, 77,194,149, 27, 15, 17,182,185, 63, 62,153,177, 8,106,181, 14, 89, 89, 74,
+220,191,118,250,224, 91,180,175,219, 10, 4,130, 15,172,173,173,205, 51, 50, 50, 46, 0,248, 19,192,187, 14, 14, 14,221,114,115,
+115, 11,245,122,253,126, 74,233,141,186,104,191,211,146,204, 21, 9, 5, 99,213, 58,253,170,107,247,232, 47, 65, 1,196,214,192,
+ 98,165, 68,200,239,164,209, 26, 86, 95,189, 79,127,170,101, 89,201, 43,209,248, 90,159,235, 7, 9,225,153,250,217, 63,172,173,
+189, 45,228,242, 11, 18, 30,239,121, 74, 73,201,136,193, 25, 25, 73,131, 41, 53,190, 77,231, 64,215,174, 93, 71,243,120,188,101,
+ 0, 96, 52, 26,191,188,120,241,226,111,111, 66, 87,161, 80, 12,163,148,202,202,246, 91,177, 82,169,220, 99,234,119, 3, 2, 2,
+ 18, 0,212, 43,123,154, 24, 30, 30,238,110,202,123, 28,181,227,206,157, 59,212,221,221, 29,205,155, 55,127,156,150,150,246, 61,
+165,116, 11, 87, 43,255, 16,131,213,152,144,134, 19,251,180, 63,215,227,253,158, 50, 83,140,144,139,139,203, 74,123,123,251, 73,
+ 37, 37, 37,106, 0,148,199,227,209, 38, 77,154,128, 16,130,242,235,166,209,104,204,124,244,232, 81, 51, 83,205,213,155,210,244,
+246,246,190,195, 48,140,235,139,215,239,154,254,103, 89, 54, 57, 42, 42, 42,176,166,114, 58, 59, 59,247,100, 24,102, 94, 77,159,
+ 99, 89,118,101,106,106,234,153,234, 62,211,188,121,243,187, 50,153,204,145, 97, 24, 82,213,103, 94,108,115, 12, 6, 3, 45, 41,
+ 41, 73,127,248,240,161,127, 45, 26, 49, 71, 66, 48,135,101, 41, 3, 0, 12, 67,230, 90, 91, 91,239,206,205,205,141, 42,127,191,
+236,119,210,107,115,188,184,184,184,140, 2,240, 57, 0, 10,224,187,148,148,148, 29,181,249,126,163, 70,141,238, 8,133, 66, 87,
+ 30,143, 71, 94,221, 39,149, 61,103, 89,150,106,181,218,228,199,143, 31, 87,185,143, 66, 66, 46, 31, 88,189,122,245,221,109, 63,
+255,228,223,162,229, 96, 48,210, 46,208, 81, 11,220,141,215,160, 85, 11, 2,202,178, 80, 23,100,128,101, 89,148,168, 53,184,112,
+228,151,187,245,234, 55,240, 71,233, 88,198,183,193, 92,245, 26, 53,106,212,242, 85,171, 86,217,137, 68, 34,102,255,254,253,237,
+ 62,251,236,179,177,235,214,173,115,249,224,131, 15,204,181, 90, 45, 59,119,238,220,119, 8, 33, 95, 83, 74,143,214, 70,187,125,
+ 75,210,182,113,125,231,175,166,142,232,138,207, 87,236,157,218,177, 57,201, 50,147, 9,183,188,223,169,129, 85, 83, 79,107,124,
+189, 53,116, 26,128,159,106, 81, 86,226,230,230,214,210,209,209,177,190, 74,165, 50, 2, 64,211,166, 77, 41,143,247,178, 95,210,
+233,116,186, 71,143, 30,157,124,221,186,249, 92, 34,105,211, 73, 38, 61,247,197,196,113,102,185, 89, 89,142, 91, 15, 30,142, 56,
+232,224,224, 55, 24,136,127,155, 26, 4, 30,143,183,236,244,233,211,206,148, 82,244,236,217,115, 25,128, 55, 98,176, 40,165,178,
+212,212,212,242,107,160,172,150, 95,175, 23, 30, 30, 94,110,168,234,213,226, 61,147,105,215,174,157,196,160,211, 77,230, 49, 76,
+ 15, 10, 52, 71,233, 73, 29,105, 4,206,241,249,252, 31,194,194,194,212,111,187, 25, 56,119,238, 28,198,143, 31,143,200,200,200,
+198, 39, 79,158,220,172, 80, 40,166,164,166,166,118,161,148,102,114, 86,233,191,104,176,154, 18,226,208, 47,160,241,213,201, 31,
+ 13,150,178, 7,215, 19,140, 94, 80,173, 17,114,118,118, 94,213,169, 83,167,177,187,118,237,146,253,241,199, 31, 50, 15, 15, 15,
+ 8,133, 66,240,120, 60,240,120, 60, 48, 12, 3, 62,159,143,119,223,125,215,164,134,235, 85,205, 11, 23, 46,200,188,189,189,255,
+210,200, 50, 12,131,222,189,123,215,168,201, 48,140,235,221,187,119, 29, 36, 18, 73,133, 73, 97, 89,246,165,199, 11,253,208, 48,
+ 24, 12,232,212,169,147, 73,117,197, 48,204,188,232,232,232,119,138,139,139,171,237,187, 45,211, 59, 83,131,150,226,250,213, 11,
+ 14, 68, 23, 7, 24,114, 64,121, 54,128,200, 19, 96,196,149,126, 62, 39, 39, 7, 93,186,116,225,189,206,190,238,219,183, 31,161,
+148, 30, 81, 40, 20, 23,178,178,178,204, 9,193,135,117,140,108,125, 17, 19, 19, 99, 78, 41, 69,227,198,141,231, 1,168,149,193,
+226,241,120,174,103,207,158,117, 16,139,197, 21,251,185,170,191, 70,163, 17, 58,157, 14,189,122,245, 50,212, 96,106,241,195,214,
+ 95,252,213, 26, 61,212,212, 3, 15,163,139,113,234,212, 17,212, 47,214, 35,246,129, 26, 44,171,128,186, 48, 3,148, 82,168,212,
+ 90,180, 8,122,223,159,101,223,158, 0,169,165,165,229,224,117,235,214,217,255,244,211, 79, 5,143, 31, 63,214,253,248,227,143,
+246, 19, 38, 76,240,209,233,116,152, 56,113, 98,102,227,198,141,133,235,214,173,179, 63,114,228, 72, 79, 0,181, 50, 88,124,130,
+111, 62, 28,208, 3,106, 61, 3,189,222, 96,239,108,111,254,251,244, 81, 65, 2, 74,181,216,121, 52, 28,122, 3,251, 75,109,205,
+ 85,239,222,189,221,183,108,217,194,143,142,142,230, 55,105,210, 4, 70,163,177,226,193,178, 44,140, 70,163,201,231,101,117,140,
+ 5,188,157,172,173,207,181,233,211,215,204, 73, 38,133,248,249, 83,244,183,150,153,159, 76,205,218, 5,160,253,219,214, 40,240,
+120, 60, 36, 37, 37,193,210,210,210, 44, 40, 40, 40,149, 16,178,248,210,165, 75,219,254,142,223,122,157,200,214,155, 34, 32, 32,
+160, 53,159, 97, 14, 45,156, 63,213,201,175,101, 75,158,131,163, 61, 98,158, 36, 66,200, 99,131,159, 62,138, 9, 90,254,237,150,
+233, 1, 1, 1,239,135,135,135,223,122,219,246,181,251,160,159, 54,179, 6,221,164,210,103, 86, 0,182,161,176,176, 16,159,124,
+242, 9,142, 30, 61,218,164,109,219,182, 43, 75, 79, 1,142,255,138,193,242, 37, 68,214,194,195, 41,228,155,207, 39, 88,211, 83,
+191, 50, 37,217, 25, 16, 86, 99,132,156,156,156,150,118,234,212,233,163, 93,187,118, 89, 19, 66,112,110,234, 88, 88,235,212, 80,
+124,181, 26,214,118,246,208,206, 27, 15,115,163, 1,126,151, 34, 76,189,216,254, 69,243,241,227,199,200,205,205,133,157,157, 29,
+164, 82, 41, 36, 18, 9,132, 66, 33, 68, 34,145,169,154,144, 72, 36, 56,127,254, 60,248,124, 62,120, 60, 30,248,124,126,197,227,
+197,231, 60, 30, 15,142,142,166, 15, 77, 98, 89,118,165,143,143,143, 95, 76, 76,140, 69, 94, 94, 30,218,182,109, 91, 64, 8,137,
+120,225, 78,207, 47, 34, 34,194,194,228,198, 70, 23,135,162,196, 31, 65,115, 15, 1, 86,131, 96,180, 24, 10, 53, 60, 43, 26,152,
+ 23,255,178, 44, 91,151, 59,207,116, 66,200,234,254,253,251,205, 3, 8,130,131,131,139,166, 78,157, 74, 31, 63,126,220,227,189,
+247, 6,212,127,242,228,105,153,217, 35,115, 8, 33, 27, 76,141,100, 81, 74,197, 0,112,245,234, 85, 80, 74, 37,117, 57,246,196,
+ 98, 49,194,194,194, 42, 34,148, 12,195,128, 97, 24,240,120, 60, 28,123,106,135, 98, 45,131,146,244, 7,248,180, 95, 61,120,122,
+122,254,197,112,255,101,223, 80,138, 41, 19,198,222, 93,178,106,189,191,209,104,196,169, 83,167,176,118,237, 90,104, 52, 26, 4,
+117,235,129,231,180, 5,154,121,218,129,101, 89,168,212, 90, 68, 92, 62,116, 87, 81,207,211,255,109,185, 24,228,231,231,255,238,
+237,237,205,203,204,204,188, 8, 32, 78,175,215,111,250,253,247,223, 29, 62,254,248,227,140, 93,187,118, 77, 5,224,182,102,205,
+154,158, 69, 69, 69,251,106,163,219,169, 5,233, 19,216,178, 89,219,122,110,110,184, 28,122, 11, 66,145,192,106,242,232,126,144,
+203,249,248,246,167, 19,108, 66,114,206,212,171,247,233, 14, 19,207, 77,226,236,236,236,215,163, 71, 15,183, 45, 91,182, 8, 1,
+224,193,131, 7,200,200,200,128,173,173, 45, 36, 18, 9, 4, 2, 65,197, 13,219, 27, 49, 87,118,118, 55, 15, 30, 60,104, 6,189,
+ 30,155,190, 93,141,126,170,124,152, 17, 64, 11, 82,255,109,106, 12, 2, 2, 2,188,187,116,233, 34, 49, 26,141, 40, 46, 46,198,
+150, 45, 91, 44,205,204,204, 44,123,247,238,189, 8,128,201, 6,171,125,251,246,233, 90,173,214, 1, 0, 68, 34, 81, 70,104,104,
+168, 35,128,146,250,245,235,155,149,125, 68, 85,203,200, 86,226, 11,209,169,196, 90,188, 87, 35,129,129,129,173,154,120,215, 63,
+191, 98,197, 98,121, 94, 65, 26, 44, 45,211,193, 32, 15,219,182,253, 0, 51, 51, 11, 44, 90, 52,159, 31,216,166,141,203,244,207,
+230,159, 15, 8, 8, 8,126,219, 76, 22,107,208, 77,106, 17,248,159,123,132, 29,231, 54, 66, 99,233,143,148,197,139,177,126,253,
+122, 52,106,212,168, 53,103,147,254, 75, 6, 43,136, 16,190,171,141,252,216,230, 69,211,235, 51, 97,199, 5,170,196,167, 80,170,
+141,176,250,207,201,115,254,197, 11, 35, 0,198,209,209,113,242,158, 61,123, 44,202, 27,187,198,196, 8, 43,232, 80,191,105, 83,
+ 72, 45,173,144,102,208,129,234,117, 16, 10, 4,149, 54,136,166,104,150, 71,192,132, 66, 33,132, 66, 97,197, 5, 87, 40, 20,214,
+168,249, 82,229,240,249, 96, 24, 6,231,206,157,131,193, 96,192,224,193,131,255, 98,174,248,124,254, 75, 93,144, 53,105,166,166,
+166,158,113,113,113,137,160,148,190, 99, 52, 26, 65, 8,137, 72, 73, 73,233, 92,254,190,179,179,115,207, 22, 45, 90,204, 99, 89,
+118,165, 73,229, 52,100,131,230,236,129,121,187, 44, 20,132,217,129,200,130,193, 18, 15, 68, 62, 73,197,197,219,241,200,204, 45,
+ 70,128,183, 61,122,182,111, 0,163,209,104,242,182,191,136,139,139,203,213,204,204,172, 33, 93,187,118, 69, 78, 78,142, 97,241,
+226,197,104,209,162, 5,188,189,189,171, 50, 79, 53,106, 18, 66,148, 17, 17, 17, 30, 42,149, 10,132, 16,165, 9,134,236,124,101,
+ 70,248,247,223,127,135, 90,253,215,232,189,117,231,229,248,124,144, 59,198,124,186, 3,171, 31,239,199,230,205,155,241,234, 16,
+157, 87, 53, 89,150,197,146,149,235,253, 85, 26,109, 69, 93,105, 52, 26,132,133,133, 65, 83, 82,136, 75,187,198, 85, 68, 47, 85,
+106, 45, 92,253,186,251,215,164,249, 38,248,255,210,164,148,134, 0, 8,121,161,126, 23,236,218,181,107, 8,128,195,148,210, 80,
+ 0,161, 0,246,214,186,156, 4, 99, 62, 24,244, 30,248, 66,115, 60,122,154,140,206,237,252,225,232,224,128,136,232, 88, 36,164,
+228,164, 19,130,209,189, 58,136, 87,170, 84,218, 5, 87,238,209,159,107,210,116,118,118,246,220,182,109,155,224,197,136, 11,143,
+199,123,233, 92, 47,127,173, 50,147,101,106,125,142, 5,188, 93,172,173,111, 30,253,242, 75, 89,218,175,191, 34,191, 99, 71, 8,
+ 90,183,197,246,115,167,145,153,171, 82,107,141,108,183,183, 97,191,151,155,171,160,160,160,208,165, 75,151, 90, 37, 37, 37,225,
+250,245,235,240,240,240, 64, 73, 73, 9,106, 26,218,246,170,166, 86,171,117,120,161,219,206, 1, 0,210,210,210,246,226, 63, 93,
+233,180, 54,229,172,110, 92, 85,109,198, 92,189, 90,206, 6, 13, 26,136,236,172,173, 15,172, 92,181, 68, 30, 21,125, 5, 45, 91,
+180,133,220,210, 23,172, 49, 13,217, 57, 69,200,125,170,196,210,165,171,177,104,241,151, 88,189,106,169,124,232,176, 49,135,218,
+181,107,215,240,197,238,194,255,245,253,206,240,133, 91,238,223, 9,157, 4, 0, 5,209,135, 49,125, 88,123, 20, 22, 62,197,196,
+137, 11,145,146,146,130, 39, 79,158,132,255,127,150,147, 51, 88, 47,152,155, 64,177, 96,247,222, 69, 83, 91,139,227, 35, 69,154,
+ 7, 97, 80,106, 88,250, 91,146, 33,229,219,106,190, 87, 82, 82,162, 61,122,244, 40,206, 78, 25,139,134,196, 0,155,175,214,192,
+209,197, 5,121, 99,222, 69,161, 94,135, 6,167,110, 65, 44,151, 67, 36,147,215, 24,113,120, 81,243,210,165, 75,120,248,240, 33,
+248,124, 62,228,114, 57,228,114, 57,196, 98, 49, 68, 34, 81,133,185,170,202, 96, 85,113,240,128,199,227,225,193,131, 7, 72, 72,
+ 72,128,149,149, 21,174, 95,191,142,110,221,186,253, 37,138, 85,199, 3,190,210,136, 82,217,184,171, 51,166,106, 64, 96, 7,216,
+124,132,194, 27, 10,192,122, 4,244,176,130,209,104,196,189,167,217, 24,255, 81, 95, 0,192,228, 5, 63, 34,184, 77,253, 10,115,
+ 80,139,240,189, 25,128, 57,141, 26, 53, 26, 58,124,248,112,131, 80, 40, 68,113,113, 49, 84, 42, 21, 30, 60,120, 96,232,219,183,
+ 95, 81,255,254,253,228, 39, 78,156, 96, 41,197,234, 90,142,195, 74, 87, 40, 20, 30,101,221,176,233,117, 56,254, 64, 8,193,254,
+253,251, 43,125,127,244,218, 40,240, 75,135,103, 97,203,150, 45, 48, 26,141,160,148,146,154,234,243,171,121, 51,238, 78,159,187,
+196,159,101, 89,116,235,214, 13,179,102,205,194,179,103,207, 48,100,200,144,138,104, 32,165, 20, 42,141, 6, 41,145,231,239, 58,
+187,213,247,127, 91, 47, 14,148,210,147, 0, 78,190,190, 16, 92, 28,156,220,192, 80, 61,148, 25,217,120,175,111, 15,240,132,114,
+ 60, 79,202, 66, 11, 95, 47,231,225,239,118,112,230, 17, 3,230,172,220, 51, 25,192,207, 38,156,239,198,232,232,104,193,253,251,
+247,193,227,241, 96, 97, 97, 1,169, 84, 90,113,142,191,104,184, 94, 39,114,229, 98,109,125,243,207, 69,139,100, 13,175, 95, 71,
+195,131, 7,177,236,202, 21,168,122,247,198,190, 71, 79,212, 40, 41, 9,254, 86,173,142,249, 95,222,191,221,187,119,159, 0, 96,
+ 17,165, 52, 47, 40, 40,200,113,217,178,101,214, 41, 41, 41,136,138,138,194,254,253,251, 51, 13, 6,131, 1, 0,161,148,126,253,
+ 6,142, 37,246,197,200, 86,251,246,237, 51, 66, 67, 67, 29, 9, 33,197,229,145, 43, 66, 72,113, 29,162,110,130,130,188,212, 79,
+173,101,116, 0,159, 49,175,111, 40, 40,122,158,107, 96,142, 90,216, 59,126, 31, 30, 30,174,175,238,187,150,150,150,159, 44, 91,
+ 50, 83, 97,103,199, 34,168,115, 87,164,166,235,176,124,230, 40,100,103, 23,226,231,237, 43, 0,136,160, 51,240,240, 78,208,251,
+112,112,112, 65,167,142,157,156, 46, 95,187, 58, 5,192,183,111,203, 57,158,112,248,147,201,132,144,111,234,213,171,119,249,199,
+ 21, 43, 26,118,235, 86,122,207,112,225,194, 5,252, 50,108, 24, 22, 3, 35, 55, 18,146, 58,237, 45,157,216,244,143, 53, 88,245,
+197,242,203,219, 62, 27,210,214,214, 88, 34,208, 94, 59,134, 20, 13,107,248,246,169,174,228,118, 30, 29,246,109,229, 39, 24, 37,
+132,176,132, 16,214,211,211, 19, 22,122, 53,172,168, 22,142, 10, 5,204,109,108,145,163, 47,141, 92,137,100, 50,136,100,114,147,
+ 46,142, 47,106,250,250,250, 34, 61, 61, 29, 34,145, 8,114,185, 28,230,230,230,127, 49, 87,166, 94,112, 9, 33, 96, 89, 22,124,
+ 62, 31, 17, 17, 17,232,216,177, 35,220,220,220,176,127,255,126,244,236,217,243, 47, 93,134,166,154,182, 87, 27,243, 23, 35, 74,
+229,131,223, 77, 25,220,254, 18,162, 6, 48,152,127, 0, 70,218, 13,122, 88, 66,205, 58,149,118, 7, 82,138,147,183,210,241, 56,
+ 33, 27,172,145,173,117, 23,161,179,179,115,128, 68, 34, 89, 61,111,222, 92, 69,139, 22, 45,144,153,153, 5,150,101, 33,151,203,
+161, 82,169, 96,110,110,142, 14, 29, 58,164, 45, 94,188, 56,142, 82,244,166,148,166,253, 55, 14,224,179,103,207,190,212, 61, 88,
+254, 40, 78, 77,198,152,105,187, 32,226, 3, 17, 17, 17,240,241,241,169, 57, 92,206, 82, 76,155,251,181,191, 90,163,133, 72, 36,
+ 66,251,246,237,209,182,109,219,138,113,113,229, 6, 85,167,211,193,104,100,225,228,219,213,159,188,133, 23, 5, 66, 72, 43, 0,
+ 31, 91, 90, 90,122,148,148,148,164,233,245,250,253,101,166,191,167, 64, 32,248, 64, 42,149, 58,229,231,231,199, 3,248,153, 82,
+122,187, 38, 61, 51,137,196, 86, 44,177, 0,107,208,128,207,231,195,205,173, 62,168, 81,139,220, 2, 21, 70, 15,237,143,187, 17,
+209, 56,125,233,134, 65,175,103, 55,154, 90, 70,111,111,111,100,103,103,131,199,227, 65, 42,149, 66, 38,147,161,113,227,198, 72,
+ 74, 74,170, 48, 87,117,237, 34, 44, 51, 87, 55,202,205, 21, 61,120, 16, 49, 50, 25, 60, 37, 18,124,249,235,175,197,185, 5, 5,
+109,126, 1, 98,222,130, 93,253,245,169, 83,167, 28,248,124,190,147,209,104, 68, 98, 98, 34, 30, 62,124,136, 13, 27, 54,164, 23,
+ 22, 22, 6,133,135,135,215,105, 27, 69, 34, 81, 70,121,228, 74, 36, 18,101, 84, 23,217,122,157, 49, 87,174,174,174, 94, 46, 14,
+226,115,191,109,152, 90,207,175,101,107,198,140, 39,207, 45,126,150,222,241,214,141, 27,237, 23,252,124,112,138,171,171,107,143,
+228,228,228,103, 85, 54,126, 12,211,187,133,127, 75, 62,104, 26,248,162,142, 88,189,106, 40, 50,179, 10,144,155, 83, 8,161, 80,
+ 6,173,158, 7, 35, 75,208,190, 99, 39,252,186, 99, 31,154, 54,109,198,227, 1,221,223, 38,131, 85, 22, 1, 94,249,199, 31,127,
+ 52,148, 72, 36, 88,182,108, 25,204,205,205,113,227,155,111,240,139, 80, 8, 51, 0, 91,116,186,121, 0, 56,131,245,255,101,176,
+100,142,141,135,237,253,168,123, 7, 95, 79, 23, 70,191,127, 3,146, 75, 12,234, 69,143,117,234, 71,133,244,221, 40, 74,175, 87,
+231, 43, 8, 33, 84, 40, 20,194,113,238, 55,112,111,214, 28,197,227, 7, 33, 71,175,131,215,137, 27, 16,203,229,120,212,221, 31,
+ 84,171,197, 59,143, 50, 76, 53, 46,148, 16, 66, 1,192,222,222, 30, 66,161, 16, 18,137, 4, 98,177, 24, 98,177,184,194, 88,137,
+ 68, 34,136, 68, 34,147,205, 16,203,178, 40, 44, 44,196,243,231,207, 49,126,252,120, 72,165, 82,148,133,186,225,238,238, 14, 62,
+159,143,148,148, 20, 92,188,120, 17,158,158,158, 16,137, 68,181,106,107, 95,104,176,253, 92, 92, 92, 46, 19, 66,252,238,220,185,
+ 99, 17, 24, 24, 8, 83, 35, 88,165,173,161, 16, 26,184,131, 37,110, 47,141,181,210,235, 13, 47,109, 75,121,244,197,196,200, 85,
+247,134, 13, 27,110, 88,181,106, 21,227,234,234, 10,150,101, 97,109,109,141,146,146, 18,100,101,101,195,215,215, 23,110,110,110,
+ 88,181,106, 21, 0,236,253,111,153, 43,160,180, 59,184,220, 96,189,104,180,166,189, 91, 15, 57, 57,114,240,120, 76,133, 97,174,
+113,159, 83,138,141,171, 22,221, 29, 62,126,150,255,140, 5,171,161,214,232,160,210,104,161,214,104,161,214,232,202,254,106, 81,
+ 62,176, 61, 45,234,226, 91, 23,193, 34,132,244, 11, 14, 14,222,180,118,237, 90, 39, 39, 39, 39, 65,102,102,166,225,135, 31,126,
+232,249,195, 15, 63, 68, 77,153, 50,197,119,202,148, 41,214,246,246,246,252,180,180, 52,253,204,153, 51,123, 18, 66,230, 81, 74,
+247, 86,123,189,144,153,219,240,132, 50, 16,194,135,149,165, 53,248, 34, 25, 88, 3, 31, 70, 22,176,176,180, 71,232,221,131,184,
+ 30, 89, 56, 33, 35, 27, 7, 76,185,169,106,214,172, 25,229,241,120,176,181,181,125,169,107, 16, 0, 28, 29, 29, 81, 80, 80, 0,
+ 30,143, 87,241, 90, 93,204,213,177, 69,139,228, 13,202,205,149, 84,138, 8, 79, 79, 44, 75, 72,200,203, 42, 40,232,248,150,152,
+171,138, 27,135,184,184, 56,148,148,148, 32, 52, 52, 20,135, 14, 29,202,124,213, 92, 5, 7, 7,143,147,203,229,139, 85, 42,213,
+234, 51,103,206,108,168, 73,183,108,204,213, 27,163,178, 84, 12, 1, 1, 1, 2, 39, 91,222,153,179,135,215,185,155,179,247, 8,
+226, 63, 1,158, 20, 60,148,223,116,120,167, 91,171,190, 76,243,111,166,123,244,158,255,221,153,128,128,128,198, 85, 69,178, 40,
+165,254,102, 50, 57,128,116,132,223, 9,169, 48, 87,217, 57,249,208,232,120,208,104, 9,212, 58, 6, 93,131,123, 97,211,143,191,
+ 35, 37, 61, 27,229, 51, 12,223, 38, 26, 53,106, 20,224,226,226,130, 25, 51,102, 64,189,103, 15,138, 0,244, 3,240,135, 78, 7,
+ 0, 48, 7,102,113, 86,233,255,201, 96, 89, 57, 53,238,188, 96,238,244,245, 29,223,239,197,164,143,107,135,188, 34,141,102, 78,
+148,129, 77, 46,169,209, 92,129, 82, 74,125,124,124,192, 48, 12,228,150, 86, 48,179,176,128,250,133,200,149, 88,110, 14,170,213,
+130,213,105, 33, 52,241,226, 88,174, 73, 41,133,153,153, 25,132, 66,225, 75, 93,131,229,198,170, 54, 17, 44, 0,200,203,203,195,
+129, 3, 7,208,186,117,107, 72,165, 82,240,249,124,248,249,249, 33, 58, 58, 26, 94, 94, 94, 32,132,224,143, 63,254,192,192,129,
+ 3,241,236,217, 51,248,250,250,202,235, 98,176,206,157, 59,103, 65, 41,125,135, 82,138,172,172,172, 58,237, 68,150,101, 81, 84,
+ 84,132,179,103,207, 34, 53, 53, 21,142,142,142,200,205,147,194, 82,209,164,244,183, 94, 48, 89, 38, 50,185, 95,191,126, 12, 33,
+ 4, 42,149, 10, 98,177, 24, 50,153, 28,230,230, 22,240,246,110,140,148,148, 20,244,232,209,195, 24, 27, 27,187, 71, 40, 20,110,
+172,109,121, 27, 52,104, 96,158,151,151,215,183,126,253,250, 66, 0, 48, 51, 51,235,231,225,225, 97, 25, 31, 31,159, 95, 75, 51,
+ 80, 97,172, 8, 33, 21, 51, 80, 25,134, 1,159, 97,224,236,228, 80,241,188,108,219, 73, 77,245, 56,108,220, 44,127,214,168,197,
+206,181, 35, 65, 12,217, 48,192, 18, 26,184,192, 96,228, 85, 24, 88,153, 76,134,166,157, 63,120, 43, 35, 88, 66,161,112,212,246,
+237,219, 93,126,251,237,183,188,163, 71,143,230,183,105,211, 70,182,126,253,122,135, 77,155, 54,117,209,106,181,152, 49, 99, 70,
+198,205,155, 55,139, 7, 12, 24, 96,185,109,219, 54,151,134, 13, 27,190,139, 74,198,101, 17, 66,100, 0,134, 2,248, 40,168,181,
+ 37, 63,175, 80, 5,214,160, 69, 92,252,115,228, 23,105,193, 26,117, 72, 76, 86,162, 72,109, 68,118, 78, 33,252,252,123,124, 31,
+ 18, 18,242, 37, 33,100, 62,165,244,120, 77,229, 52, 26,141,184,113,227, 6,174, 95,191,142, 43, 87,174, 32, 33, 33,161,226, 61,
+ 11, 11, 11,156, 59,119, 14, 93,186,116,121,163,230, 42,241, 45, 50, 87,101,215,160, 69, 61,122,244, 88,100,107,107, 43,217,184,
+113,163,165,187,187, 59, 12, 6,131,246,213,200, 85, 96, 96,224,130, 5, 11, 22, 56,191,247,222,123, 83, 1,108,168,235,239, 85,
+ 21,217, 50,129,191,164, 98,200,204, 76, 27,247,253,246, 81,118, 50, 97,130, 18, 79,190,115, 41,139,197, 0, 37, 5, 64,200,110,
+144, 14, 11,159,143, 14,158,108,189,234,232,166,113, 0, 54, 87, 37, 28,251, 44, 9, 91,182,108,194,103, 51, 70,227,215,159, 87,
+131,101,249,208,232,121,168, 87,191, 45, 52, 58, 22,132,225,163,133,127, 32, 46,133, 92,133,128, 1,166, 79,184,249,214,153,128,
+ 39, 79,158,220, 74, 72, 72,240, 89,184,112, 33,126,117,113,129,185,185, 57,102, 46, 90, 20,102, 48, 24,222,186, 25,178,255, 88,
+131, 21,224,237,245,141,165,141,245,216,246,173,154,216,206,156, 58, 78,240, 44, 77,141,139, 29,191,200, 59,184,106,174, 60,137,
+202,167, 36,208,188,235,181,137, 58, 24,150,204, 68,182, 81,139,250,199, 66, 33,150,203, 17,211, 51, 16, 84,171, 69,135,187, 9,
+ 16,203,229,224, 75,204,234,114, 2,191,212, 29,248,234,115,134, 49, 45,113,189, 78,167,179,234,222,189, 59,186,117,235,134,247,
+223,127,191, 98,204, 85,203,150, 45,177,119,239, 94, 12, 26, 52, 8,247,238,221,131,179,179, 51,124,124,124,224,227,227,131,139,
+ 23, 47,214,250,238,209,104, 52,162,103,207,158, 5,132,144, 8, 74,169,223,173, 91,183, 44,106,171, 81,222,216,156, 61,123, 22,
+125,251,246,133,151,151, 23,194,195,195,113,246,235,111, 33,181,169, 7,192, 10,172,209, 8,173, 86, 11,134, 97,106, 28,131, 21,
+ 20, 20,196,231,241,120,141, 27, 52,104,128,204,204, 76,100,102,102,194,222,222, 30, 10,133, 2, 14, 14, 14, 88,187,118, 45,214,
+175, 95,127,139, 82,186, 50, 45, 45,237, 81,109,247,145, 66,161, 8,182,182,182,254, 86,165, 82, 9,203,203, 66, 8, 17, 56, 59,
+ 59,135, 41, 20,138,121, 74,165,242, 88,109, 12,150, 78,167, 3, 33, 4, 39,226, 20, 40,214, 18, 20, 36,135, 99,250,187,238, 47,
+ 25, 46,129, 64,240, 82, 90,141,170, 13, 22,197,158,237,223,221,157,247,197,199,254,200,217, 5, 67,246, 46, 16,235, 97, 56,244,
+176, 23,126,191,105, 11, 0,240,118, 98,240,221, 88,249, 91, 27,193,210,233,116,219, 26, 53,106, 4,173, 86,123, 1,192,246,136,
+136,136,129,169,169,169,235,254,252,243, 79,197,144, 33, 67,148,199,142, 29,251, 12,192,145,136,136,136, 49,203,150, 45,235,166,
+215,235,183, 85,209,237,240,235,204,153, 51,131,134, 12, 25, 66,132,140, 94,123,246,204, 14,190,193,160, 39,179,231,255,100, 12,
+185,118,153, 49, 24,244,228,253, 15,103,178, 39, 47, 70, 50, 19,166,173, 49,182,108,219, 23, 15, 30, 60,112,234,215,175,223, 82,
+ 0, 38, 25, 44,129, 64, 80, 97,160, 43,249,253, 90,117, 17,126, 12,120,185, 90, 91,223, 56,182,120,177,220,235,218,181,151,205,
+ 85, 98,226, 91,103,174, 0,224,194,133, 11, 91, 1,108, 13, 10, 10, 74,151,201,100, 40, 42, 42,250,203, 57,210,174, 93, 59,137,
+ 66,161,144, 8, 4, 2,180,110,221,218,166,103,207,158, 49, 12,195,108, 56,117,234, 84,173,147, 80, 86, 22,217,170,107,154, 6,
+115,107,182, 95,203,182, 77,205, 31,155, 47, 54,151,240,213,247, 60, 98, 36, 22, 4, 64,190,198, 49, 46, 52, 97,104, 1,201, 16,
+183,108, 22,236, 1, 41, 35,233, 87,149,193, 34,132,220, 45,200,203,239, 93, 80,168,197,181,235, 15,240,225,208,134,208,232, 8,
+ 88,150, 65, 81,177, 6,224, 9,192, 0, 24, 54,124, 20, 40,225, 35, 55, 43, 13, 4,136,124,219, 76,128,209,104,156, 55, 96,192,
+128, 86,203,150, 45,107, 50,115,230,204,242,253,210, 78,161, 80, 68,113,121,176,254, 31, 12, 86, 35, 47,215, 94,157, 91, 5, 78,
+251,114,254,151,230, 79,110, 93,193,151, 75,191,103, 27, 6,246,204, 95,185,231,143,194,124,121,189,110, 37,202, 71,247,106, 27,
+117, 16, 24,244,160, 6, 29,196,114,249, 75,145, 43,145, 76, 6,129,153,180, 86, 27, 65, 8, 1,165,244, 47,221,129, 47,154,171,
+218, 92,108, 69, 34, 81,222,213,171, 87, 29,146,147,147, 95, 26,208, 94,191,126,125, 16, 66,112,243,230, 77,220,184,113, 3, 31,
+126,248, 33,248,124, 62, 4, 2, 1, 34, 34, 34, 10,235, 18,193, 42,159, 69,232,236,236,220,179, 77,155, 54,149,206, 30, 52, 37,
+130,149,152,152, 8, 47, 47, 47,104, 52, 26, 88, 91, 91, 35, 39, 45, 14,207,158, 60, 66,137, 70, 15, 15, 7, 17,178,178,178, 80,
+158,215,171, 58, 46, 95,190, 76, 21, 10,197, 75,145,159,204,204, 76,120,122,122, 98,203,150, 45, 88,191,126,253,230,212,212,212,
+ 90,223,197,186,184,184,216,176, 44,187,172, 95,191,126,253, 7, 14, 28,136,158, 61,123,190,244,254,174, 93,187, 44, 15, 31, 62,
+252,163,155,155,219, 64, 30,143, 55, 47, 62, 62, 62,189,166,125, 14, 0,191,252, 82,154, 62, 73,218,118, 17,230, 13,241,192, 71,
+147,119,224,187,239, 14, 67, 44, 22,191,212,216, 46, 89,178,164,230,122,164, 20,221,223,255,196,191,139,159, 22,198,236, 63, 96,
+209, 62, 23, 5,161,214,200, 47,244,199,205,181,125, 0, 0,205, 63, 62, 14, 74, 61, 0,224,173,140, 96, 81, 74,207, 1, 56,247,
+194, 75, 7, 9, 33,122, 66,200,112, 0,251, 40,165,135,203, 94,255, 9,213, 36, 6,109,219,182,109,203,249,243,231, 11,202,211,
+102, 40,234, 45, 51,232,116, 58, 22, 0, 26,251,189,243, 82, 95,245,211,167, 79,241,221,119,223,161,184,184, 24,194, 90,132,153,
+131,131,131, 43,198, 68, 10,133, 66,216,217,217, 65,167,211,193, 96, 48,212,122,252,149,157,171,235,247,119,174, 95, 55,138,126,
+216,160,162, 7, 15,154,197,152,153,189,213,230,234, 21, 22,245,233,211,103, 17,165,148,178, 44,187,240,133,155, 45,177,181,181,
+245,213,239,191,255,222,214, 96, 48, 96,214,172, 89, 86,217,217,217, 86, 19, 39, 78,156, 7,160, 74,131, 85, 69,154,134,170,142,
+183, 58,165,105, 96, 89,120,203,229, 22,200, 70, 50, 52,118,250,150,121,182,134,156,115,169,227,238, 41, 18,252,125,101, 70,189,
+ 39, 83,160,133,165,196, 28,148, 82,239,170,126,219,192,178,167, 30, 69, 69,245,168,231,214,144,247,231,241, 43, 24, 48,112, 8,
+ 52, 26, 6,106, 61, 1,225, 9, 64,120, 66, 52,247,243,135, 79, 83, 63, 80, 0, 49, 15, 35, 12,198,151,207,141,255,121,220, 7,
+253,180,217,181,255, 15,147, 0, 96,214,134, 11,248,242,155,117, 24,241,126, 79,140, 25, 51,134,203,131,245,255, 97,176,234,213,
+171,103,229, 32,151,254, 50,229,227,177,230, 9,247,195,144, 28, 17,134,235,215, 98,114,119, 31, 58,154, 82,144,159,249,113,109,
+204,213,139, 17, 44,175, 93, 39,224,226,236, 92, 17,185,106, 31, 30, 15,177, 92,142,144,230, 46, 96, 53, 26,244,120, 94, 80,235,
+141,169, 44,106, 37, 20, 10,235, 52,211,175,220, 84,189, 58,160,125,194,132, 9,216,190,125, 59, 58,116,232,128, 70,141, 26,213,
+250, 78,249, 69, 83,244,226,152,168,218,204, 30,172, 76,171, 94,189,122,136,140,140,132,165,165, 37,118,238,220, 9, 87, 87, 23,
+140,233,229, 5, 30,175,180,107,139, 97, 24,147,198, 96, 81, 74,141, 46, 46, 46,113,103,207,158,245, 28, 50,100, 8,132, 66, 33,
+114,115,115, 97, 97, 97,129, 77,155, 54,177, 82,169,244,215,218,150,207,205,205,109,140, 68, 34,249,122,232,208,161,252,198,141,
+ 27, 35, 61, 61, 29,150,150,150,108,217,210, 70,176,177,177,102,165, 82, 41, 38, 76,152, 0, 63, 63,191,238,115,231,206,237,166,
+ 80, 40, 86, 40,149,202, 31,106, 50, 89,123,247,150,246, 78,125,188,225, 17,180,218,210,161, 22,155, 55,111,134,179,179,243,203,
+ 93, 1,177,177, 53,207, 34,100, 89,156, 59,244,211,221,201, 83,135,250, 19,235, 97, 40, 8,181, 6,181,252, 16,233, 69,230,216,
+117, 57, 3,151,239, 38, 84, 36, 26,125,219, 34, 88,132,144, 1, 40, 29,122,113,146, 82,122,132, 16, 50, 24, 64,207,242,231,168,
+101, 98, 81,131,193, 64, 25,134, 33, 73, 73, 73, 58,169, 84, 74,108,108,108,248, 98,177, 24, 26,141,166,194,104, 61,125,250, 20,
+199,143, 31, 71,114,114, 50,108,108,108, 24, 75, 75, 75,232,116,186, 92, 19,239,186,255,146,158,161,236,119,107,125, 62,142, 6,
+154,109, 94, 60,223, 67,197,207,181,204, 26,211, 21,236,189,235,170,200, 76,141,217,191,196, 92, 33, 36, 36,100, 43,128,173,229,
+207,187,118,237, 58,134,207,231,127, 9,192,114,219,182,109, 86, 86, 86, 86,228,216,177, 99,250,109,219,182,229,241,120,188, 92,
+ 0,235,170,211,171,108, 48,251,235, 80, 89, 42, 6, 74, 17,149,147, 31,231, 46,176, 82,176,247,213, 52,116, 70,210, 60,159, 92,
+ 65, 67,123,210,180, 25, 6,102, 68, 95, 27, 99,136,109,159,153,150,193, 80,208,168,170,116,243,243,243,127,250,117,199,129,217,
+251,247,253, 82, 79, 44, 23, 99,194,196,249, 56,113,250, 18, 8, 35,192,213,208,155,208,234,140,200,202,201,199,208, 97, 35,224,
+234,108, 7, 20,165,100, 10, 68,162, 31,222,166,125,255, 82, 30,172,192,246,184,126,120, 13,246,198,212, 67,202, 55,223,112,121,
+176,254, 78,131,229,225,225, 33,150, 9, 48,222,198, 76, 56,103,202,240,247,236, 51, 98, 31, 34, 57,250, 46, 0, 64,163, 81,233,
+ 83, 99, 46,183, 48,225,162, 29,252,106,174,140,242,174, 27, 27,123,135,138,200,213,139,179, 7, 89,141, 6,172, 78, 11, 84,209,
+157, 83,149, 38,195, 48,127, 49, 86, 47, 94,120,107, 83,206,242,232, 72,101, 9, 70,221,220,220,176, 98,197,138,191,228,193, 50,
+165,156,101,119,105, 61, 9, 33,126,229,198,136, 82,234,231,236,236,220,211,148,153,131, 85,105,150,103,172, 62,117,234, 20,162,
+162,162, 64, 41, 69,191,126,253, 32, 16, 8, 96,110,110, 94, 97,178, 42, 27,131, 85,153, 38,195, 48,159, 28, 62,124,120,118, 88,
+ 88, 88,175, 89,179,102,145,242,177, 44, 69, 69, 69,108,106,106,106, 97,109,203,201,178,236,156, 51,103,206,240,141, 70, 35,182,
+111,223,142,219,183,111, 83,169, 84,186, 82, 32, 16,172,144, 74,165, 6,189, 94,255,249,184,113,227, 38, 46, 94,188,152,233,212,
+169, 19,194,194,194, 24, 79, 79,207,169, 0,126,168,105,219,111,222,188, 89,218,229,156,147,136,201,243,246, 65,102,198,199,163,
+ 71,143,144,147,147,243,151,228,163, 53,151,147,194,191,203, 16,127,150,234,160,147, 15, 1, 99,214,181,116,169,156,231, 26,180,
+242, 43,141, 58,170, 10, 50, 43,234,177,178, 8, 86, 85,229,124, 77,243,243,183,106, 18, 66,250, 55,105,210,228,139,168,168, 40,
+215,230,205,155,251, 18, 66,130,154, 53,107,214, 42, 50, 50,178,252,185,128, 82,186,191, 54,154,183,111,223, 62,184,105,211,166,
+137,163, 71,143, 22,178, 44,107, 76, 72, 72,208, 3, 32, 78, 78, 78,188,219,183,111,179,127,254,249, 39, 84, 42, 21, 92, 93, 93,
+ 25, 23, 23, 23,114,238,220, 57, 54, 58, 58,250, 38,165,116,190,169,219, 94, 30,153, 22, 8, 4,224,241,120, 80,169, 84, 38,153,
+171, 87, 53,221, 27,121, 45,239,220,222,195, 45, 75, 25,129,132,132,120, 36, 6, 54,212,111,222,124,188, 86,230,234,127,113,191,
+ 87,115,115,185,228,208,161, 67, 46, 26,141, 6, 66,161, 16, 7, 14, 28,208,237,216,177, 35, 42, 63, 63,191, 99,120,120,184,170,
+174,229,172, 77, 2,210,154, 52,139,242,120, 39, 78,159,121,208,138,215,235, 39, 76, 86,102,118,172, 48, 94,132,216, 28,118,244,
+237, 40,109,221, 60,197,252,202, 26,166, 4,234, 19, 85,105,198,198,198,106, 3, 3, 3,135,204,157,179,232,194,215, 75,191,150,
+ 47, 92,180, 8,215,111, 70, 34, 59,175, 8, 44,229,129, 37, 4, 95,126,185, 16, 78,118, 54,176, 17,233, 75,178,139,201,192, 87,
+151,204,249, 95,223,239,175,147, 7,235,239, 40,231,191,198, 96,153,243,241,160,163,175,151, 75, 39,255,166, 18,190, 81,133,228,
+232, 88,228, 20,171,113,238, 97, 66, 30, 67,153, 95, 95,231, 71,121, 60, 30, 44, 45, 45, 33, 20, 10,209, 46, 50, 5, 34,161, 16,
+ 98,185, 57, 0,148, 70,174, 40, 5, 35, 18,215,246, 0,170,212, 96,213, 21,163,209, 8, 71, 71,199,151,150, 93,121,177,193, 46,
+ 55,138,181, 77,209,192, 48,204,188,176,176, 48,139,196,196, 68, 80, 74,113,228,200, 17,139, 65,131, 6,205,171, 75,244,138, 82,
+138,236,236,108,176, 44, 11,177, 88,140, 94,189,122,161, 83,167, 78,208,149,205,254, 40,111,128,106,155,201, 61, 41, 41, 41, 21,
+192,103,174,174,174,191,206,158, 61,123, 78,155, 54,109, 2, 23, 47, 94, 12, 82,139,133,113, 95, 65,103, 52, 26,113,249,242,101,
+ 28, 62,124,216,160, 86,171, 7,165,165,165,221,121,225,253,165,174,174,174,127, 14, 26, 52,232,228,227,199,143,249, 81, 81, 81,
+ 0, 96,168, 73, 84,165, 82,161, 81,163, 70, 48, 24, 12, 88, 53,217, 13,133,133,205, 97, 48, 24, 96, 52, 26, 33,147,201, 94,202,
+251,101,202,126, 98, 41,139,187,151, 14,220,117,111,217,211,191,166,165,114,222,178, 8, 86,175,168,168, 40,215,225,195,135,103,
+ 68, 70, 70,186, 30, 63,126,220,170, 95,191,126,178, 97,195,134,101, 68, 70, 70,186, 18, 66,222, 1,176,191,150,231,207, 23,132,
+144,211,203,151, 47,159, 55,109,218,180, 54,163, 71,143, 22, 8, 4, 2, 54, 37, 37,197,176,103,207, 30,210,168, 81, 35, 70, 40,
+ 20,146, 51,103,206,176,183,110,221,186, 97, 48, 24, 86, 81, 74,175,214,246, 58, 82,110,174,234, 26, 73, 94, 7,140,106,156,152,
+220,113,255,146, 53,140,160,137,179,238,216,169,155, 73,119,239, 60,127, 6,157,113,198, 47,192,179,127,105,187,176,127,200,144,
+ 33, 99, 6, 13, 26,100,214,186,117,107,241, 79, 63,253,148, 95, 82, 82, 82,169,185,170,140,218,164,105,168,109, 2,210,114,148,
+ 74,229,207, 43,150, 92,153,241,145,207, 48,175, 79,236, 60,112,190, 56, 3,185,124, 30, 99, 97,197,192,223,157, 7, 85,222,115,
+251, 11, 55, 15, 61, 79, 85, 42,171,205,171,118,231,206,157,219, 1, 1, 1,193, 31,125, 52,230,208,132,143,199, 57, 44,252, 98,
+174,224,224,159, 39, 1,131, 14,183,174, 94,133,149,148, 80, 67,113,106,122,182,150,188,247, 54, 46,149,147,112,248,147,201, 0,
+ 38, 19, 66, 62, 92,180,104,209,158,201,147, 39,131,101, 89,132,132,132,224,135,185,115,177,216,104, 28,185,145,144,146,105,148,
+ 78,230,236,210, 27, 52, 88, 96, 72,225,141, 39, 9, 69, 55,159, 36, 20,129,165,148,165, 84,195, 48, 72, 42,214,233,150,199, 60,
+ 75, 62,243, 58,251,180, 87,175, 94,204,171,198,165,138,110, 6, 83, 7,215, 37, 4, 7, 7,191, 49, 77,150,101,147, 59,118,236,
+248,151,134,185,170,255,203,116,147, 77, 10,201,178,236,202,118,237,218,253,229,181, 58,133,119, 89, 54,174, 91,183,110,186, 87,
+ 77, 87,117,207,141, 70, 99,178,169,250,201,201,201, 15, 0,140,112,113,113,233,210,179,103,207,169, 0,234,154,142, 97,109,151,
+ 46, 93,102, 82, 74,249,132,144, 53,175,152,171,242,223,122,232,226,226,178,208,211,211,179, 98, 1,232,154,182, 61, 56, 56, 88,
+ 87,211, 34,207, 47, 14,128,102, 89, 54,185,122, 77,138,122, 45,122,248,235,244,165, 38,173,186,165,114,170,138, 96,253,143,178,
+143, 16, 34, 0,144, 27, 21, 21,245, 78, 89,228, 42,249,193,131, 7,231,247,238,221,235, 8,212,156, 62,161,138, 27,128,171, 0,
+174, 18, 66, 58,109,222,188,249,139, 9, 19, 38,180,254,240,195, 15,249, 65, 65, 65, 56,113,226,132, 49, 36, 36,228,166, 74,165,
+ 90, 89, 91, 99, 69, 8, 41,122,245, 28,170,166, 12,213, 46,210,235,205, 48,155, 86, 8,132,146,113, 7, 46, 23, 93, 22,146, 80,
+163,202, 48,255, 55,224,193,191,185, 81, 56,119,238,220,231,237,218,181, 91,120,224,192, 1,165,151,151,151, 88, 32, 16,104, 77,
+ 53, 87, 64,237,210, 52, 80, 74,217, 58, 30, 91, 6, 71, 71,199, 62,187,134, 79, 62,218, 98,202,232,250,189, 58, 4, 74, 93, 60,
+ 28, 92, 30, 63,207, 66,114,228,249,226,103, 33,155,226,141,234,156, 1,148,210, 26,111,212,194,195,195,111,181,107,215,174,225,
+230,109, 63, 78,230, 49, 76, 15,131,209,232, 55,115,242, 8, 74,128, 72, 22, 56, 39, 20,139,222,250,197,158,197, 66,225,200, 41,
+ 83,166,224,247,223,127,199,145,245,235,209, 51, 57, 25,123,133, 66,152, 9,133,216,162,211, 77, 2,192, 25,172, 55,105,176, 34,
+159, 60, 15,248, 59,126, 48, 42, 42,170,221, 63, 93, 51, 42, 42, 42,240,239,170,240,215, 25,107, 85, 73, 57,255, 95,166,209,166,
+164,164, 92, 2,112,233, 53,190,191, 3, 38, 44,230,108,234,231, 0,224,209,163, 71,111,124,219,169,216,114, 72,226,253,179,121,
+ 78, 77,186, 90, 25, 12, 6, 16, 66,160, 86,171,113,227,198, 13,104, 74, 10, 17,178,123,124, 69, 38,119, 80, 32, 45,250, 98,158,
+ 83,253,102, 86,255,235, 23, 1, 74,233, 21, 0, 87,202,204,203, 64, 66, 72, 31, 0,103, 40,165, 7,223,144,126,133,209,218,182,
+109,219, 12, 74, 41, 10, 10, 10,214,215,214, 88, 85, 92,155, 34, 35, 47,190,169,109,143,103,217,139, 11, 75, 74,186,102,179,236,
+140,159, 13,181, 91,112,252,109, 38, 44, 44, 76,221,173, 91,183, 95,151, 45, 91,214,150,101,217,223,222,132,230,107,164,105,168,
+148,244,244,244,231,132,144, 22,236, 55, 27,198,134, 91,153,247,165,122,166, 49,209,243,143, 17,109,246,137,180,180,180, 95, 40,
+165,198,218,108,111,217, 77,221,119,255,198,253,125, 63, 50,178, 39, 0,244,238,221, 27,170, 89,165,105,175,118,252, 39, 15,214,
+ 22,238,140,120,211, 17, 44, 14,142,127, 25, 41, 49,225, 7, 1, 32, 45,186,180,253,254,254,251,239, 1, 0, 61,123,246,252,203,
+172,199,242,207,164, 61,127,187,130, 29,101, 3,218,143,252, 77,218, 87, 1, 92,253, 39,109,111, 8,165,253,184, 35,191,114, 46,
+ 92,184,240, 70, 19, 76,190,233, 4,164,101,199,148, 17,192,246,178, 7, 71, 29,241,246,246, 38, 0, 96,103,103,135, 5,181, 88,
+ 78,141,163,122, 24,174, 10, 56, 56, 56, 56, 56, 56, 56, 56,222, 44, 4, 64,112, 21,119, 6, 38,207, 14, 32,132, 4,215,225,206,
+227, 60,167,201,105,114,154,156, 38,167,201,105,114,154,255, 46,205,154,180,223,154,217,137,229, 25,174,255,142, 7,128, 96, 78,
+147,211,228, 52, 57, 77, 78,147,211,228, 52, 57,205,127,219,163,154, 49, 88, 7,121, 41, 41,176, 16,137,164, 66, 0,208,106, 75,
+116, 46, 46, 40, 0, 6, 27,193,193, 81,155, 48, 41, 33,142,101,102, 62,253, 77,126,150,131,131,131,131,131,227,159, 10,191, 42,
+115,149,149, 37,181,227,243,115,189,141, 70,181, 15, 0,240,249,204,163,172, 44,235, 24, 59,187,131, 89,111,218,100,245,238,221,
+123, 62,165,212, 81, 32, 16,156,112,114,114, 10,217,186,117,171,254,223,108, 52, 94,199,100,252,127, 24, 20, 91, 91, 91,133,163,
+163,227,112, 43, 43,171,160,252,252,252,171,105,105,105, 59,179,179,179,149, 85,148,103, 5, 33,152, 83,246,255,106, 74,233, 23,
+213,148,221,228,207,190,138, 66,161,104, 36,145, 72, 38, 51, 12,211, 12, 0, 88,150,125,160, 86,171, 55, 43,149,202, 39,255,182,
+147, 90,161, 80,152, 81, 74,223, 19, 8, 4,163,108,108,108, 90,103,102,102, 46, 78, 73, 73, 89, 87,199, 99,150, 15, 96,150,149,
+149,213,135, 86, 86, 86,158, 57, 57, 57,207, 10, 10, 10,246, 3,248,142, 82, 90,227,121,250,245,116, 69,187,160,158, 65, 11, 66,
+206,132, 44, 93,180, 65, 25,246,151,247, 63, 87,216,246,232,222, 97, 97,200,177,208, 37, 95,108, 74,201,169,101,217, 24,252,103,
+ 28, 41, 91,122,216,255,115, 71,232, 58, 56, 56,180, 45, 75,164,202, 48, 12,243, 93,122,122,250,165,127,242,113,100,111,111, 47,
+115,114,114, 90, 69, 8,233,207,227,241,162,210,211,211,199, 43,149,202,228, 55,116, 45,100,220,221,221,205, 19, 18, 18, 10,235,
+154,170,225,223, 72,187,118,237,210,117, 58, 93,181,217,241,133, 66, 97, 70, 88, 88,152, 35, 87, 91,255, 80,131,149,146, 2, 11,
+ 62, 63,215, 59, 35, 45,114,168, 50, 53,226, 3, 0, 80, 56,251,237,119,112,106,190, 47, 37, 69,164,107,213,125,144, 92, 32,229,
+111,230,241, 4, 45,213, 90,141,157,128, 47,200,210, 25,244,247, 24, 45,157,156,250,232,112,162, 41, 63,220,191,127,127,111, 0,
+150,254,254,254,183,181, 90,109,235,117,235,214, 57, 31, 58,116,200, 47, 60, 60,124,216,187,239,190,123,140, 82,122,230,216,177,
+ 99,170, 90,157,180, 65, 65,124,135, 60,155,145, 60, 62,191, 63, 0, 63, 74, 1, 16, 94, 4,171,211,158,204, 16,218,252, 70,195,
+235,110,220,218, 53,178,245, 38, 84, 55, 91, 64,104, 39, 61, 37, 87, 41, 17,174, 9,123,146, 29, 83,139, 11,138, 73,230,225,117,
+ 76,198, 43,223, 93, 79, 41,157,245,166, 15, 24, 39, 39, 39,187,193,131, 7,239, 90,186,116,169,204,220,220,156,196,199,199, 15,
+252,226,139, 47,122, 42, 20,138,143,148, 74,101,210,171,102,143, 16,204, 97, 89,202, 0, 0,195,144,185,142,142,142,205,248,124,
+190,230, 85, 93,131,193, 32, 38, 4,189, 88,182,116, 57, 27,134, 33,115, 8, 33, 27, 76, 49,138,158,158,158,195,154,251,181,156,
+249,197,252,133,114,123, 7, 7,153,193, 96,212, 37,165, 36, 75,215,172,248,166,141,167,167,231,134,184,184,184, 61,181,221, 78,
+ 66, 8,113,117,117, 29, 42, 16, 8,250, 1,104, 82,246,114,180, 94,175, 63,158,156,156,188,207,212,134,188, 69,139, 22, 87, 24,
+134,241,168,205,111, 27,141,198,196,136,136,136,142,117,217, 63, 46, 46, 46, 67, 92, 92, 92,126,105,219,182,173,180,101,203,150,
+ 16, 10,133, 88,189,122,245, 44,212,176,188, 73,185,145,146, 74,165, 67,101, 50,153, 87, 81, 81, 81,172, 74,165, 58, 36, 18,137,
+130, 55,108,216,224,214,161, 67, 7,243,244,244,116,194,227,241, 28,143, 31, 63, 62,114,227,198,141, 61, 9, 33,221,106,202, 51,
+148, 31, 75, 23,136,251, 55,233,148, 31,123,105, 1,128,222,127,217,239,106,201, 40,202,115,235,167,162,119,147, 80,139, 41,242,
+132, 16,198,213,213,117,131,163,163,227, 24,149, 74,165, 38,132, 80, 66, 8,109,222,188,121,249,251, 0, 0,173, 86,155,251,248,
+241,227,198,213,105,213,111,103,115,135,199,240, 92,171,220, 31,172, 49,249,121, 88,206,107,167,110, 49, 26,141,115,162,162,162,
+250, 8, 4, 2,210,162, 69, 11, 30,106,145,250, 68,161, 80,120, 19, 66,190,164,148,222, 78, 77, 77,221, 92,182,164, 85, 23, 74,
+105,197,181,162, 44,157, 10, 92, 92, 92, 54, 55,108,216,240,221,167, 79,159,110, 73, 73, 73, 89,250, 26, 70,125,235,242,229,203,
+ 63,232,217,179, 39, 47, 59, 59,219,165, 71,143, 30,187, 1,116,122,157, 58, 8, 8, 8, 16,164,165,165,205,106,209,162,197,167,
+173, 90,181,114,126,248,240, 97,154, 66,161,216,232,228,228,244, 93,120,120,120,141,215,103, 63, 63, 63, 5,159,207, 31, 3, 96,
+ 36, 0, 30,165,116, 47,128,223,238,222,189,251,175, 72, 10,171,211,233, 28,206, 47, 93, 8,194,231, 67,210,177, 27, 88,150, 69,
+214,154, 69, 48,228,100,193,110,233, 70, 24, 12, 6, 4, 7, 7, 59,128,227,159,107,176, 68, 34,169,208,104, 84,251, 40, 83, 35,
+ 62,120,167,243,247,150, 0,112,229,242,167, 31, 56, 56, 53,125, 32, 18, 73, 99,196, 22,146,195,131,250, 7,183, 28,220,175, 51,
+113,117,118, 64,114,106,134,227,207,123,207,244, 58,126,230,210, 97, 0, 38,229,207, 42, 40, 40, 88,230,238,238,110,127,225,194,
+133,120,145, 72,100, 38,145, 72,200,144, 33, 67,204,134, 13, 27,230,123,241,226, 69,175,211,167, 79, 15, 30, 48, 96,192,105,161,
+ 80,120,226,192,129, 3, 53,174, 79,230,216,124,160,175, 19,223,233,224,128,247,122,123,244,237,238, 32,114,119,178, 7,101, 37,
+120, 20,167,171,119,238,234,221, 94, 39, 78,157,153,227,224, 59,240,253,140,168, 35, 38,175,134,222,172,153,165,149,153,138,206,
+ 52, 19,210, 15,123,181,241,173,223,191,123,123,226,233,233,137,152,199, 49, 94,151,174,223, 30,211,197,199,252,185, 74, 71,246,
+170,204,200,218, 7, 15,242,243,170,139, 42,189,104, 52,120, 60,102, 94,247,238,221,199,136,197,226,151,238,220, 52, 26, 13,195,
+ 48,196,193,104, 44,125,185, 54, 38,163,252, 55,180, 90, 13, 35, 16,136,192,227, 49, 51, 91,182,108,217, 59, 61, 61,253,148, 88,
+ 44, 94,253,252,249,243, 90,229,157,153, 70,136, 40,151,207, 15, 96,196, 98,103,163, 86,107, 11, 0, 68, 36,202,173,103,107,219,
+246,171,175,190,146,243,120, 60,100,103,103, 67,173, 86,147, 79, 62,249,196, 44, 54, 54,118, 52,128, 37, 53,153,150, 29, 59,118,
+248,219,218,218,254,229,142, 53, 59, 59,155,233,221,187, 87,173,243,118, 42, 20, 10,239, 22,254,129,159,237,217,189,171, 73, 65,
+ 78,174,122,251,186,173,225,122,137, 84,227,217,164,177,224,155, 21,107, 45, 23,204,157,249,169, 66,161,184,167, 84, 42, 77, 54,
+195,206,206,206,245, 60, 60, 60, 14,207,159, 63,191, 89,199,142, 29, 5, 14, 14, 14, 72, 79, 79,199,227,199,143,155, 93,191,126,
+253,189, 63,254,248, 99,150,179,179,243,160,212,212,212, 26,111, 38, 40,165,141,142,174, 89,225, 32,182,177, 5,171,215,195,198,
+207,191, 34,249,107,234,165,179, 48,234,116, 96,245,122,184,245,125, 15,101,145, 55,116,237,218,181, 78, 25,243, 93, 93, 93, 21,
+222,222,222,191,207,155, 55, 79,168,213,106,113,247,238, 93,132,133,133,177, 25, 25, 25, 43,107, 50, 87,132,144,179,139, 22, 45,
+114,237,216,177,163,121, 86, 86, 22,140, 70,163,221, 31,127,252, 49,217,223,223,223,194,205,205, 77,180,115,231, 78, 20, 21, 21,
+193, 96, 48,216,120,121,121,217, 12, 27, 54, 76,187,115,231,206, 89, 0, 86, 85, 21,185, 42,136,165, 11,210,136, 87,175,198, 1,
+163,144, 70, 78,247,154,217,219,249,148, 69, 3, 82, 17,201,234,221,160,129,185,151,143,108,174,220,162,185, 77, 65,202,249,185,
+189, 27, 52,216,126, 42, 54,214,148,165,152, 24, 23, 23,151, 13,125,250,244, 25,190,101,203, 22,105,116,116,180,180, 73,147, 38,
+ 96, 89,182, 34,147,127,249,202, 5,157, 58,213,236, 7,120, 12,207,245,250,225,135, 14,102,102,102, 21,107,132,150,255, 45, 46,
+ 46, 70,207, 81,109,255,142,235,109,109,247,241,215,161,161,161, 67, 78,157, 58, 53, 98,233,210,165,141, 0, 76,101, 89,118, 97,
+116,116,116,103, 0,104,210,164,137, 8,192, 37,133, 66, 49,118,210,164, 73,147,166, 78,157,138,145, 35, 71, 46, 36,132, 44,171,
+ 75, 84,143, 16,194,107,218,180,105,159,158, 61,123,242,244,122, 61,204,204,204,160,211,233, 26,188,206,198,251,250,250, 10, 75,
+ 74, 74, 14, 45, 89,178,164,223,128, 1, 3,192,231,243,193,178,172,211,149, 43, 87, 86,204,154, 53,171,125, 64, 64,192,192,170,
+ 76, 86, 64, 64, 64, 75, 0, 75, 26, 54,108,216,115,212,168, 81,188, 14, 29, 58,160,168,168, 8,103,207,158,253,242,240,225,195,
+ 95, 6, 4, 4,132, 2, 88, 24, 30, 30, 30,242,182, 55,218, 60,185, 57, 30, 15,234, 2,175,232,108, 0, 64,218,230, 53, 0, 0,
+139,175,190,229, 28,205,255,130,193,170,137,146,146, 18,255, 47,166,141, 4,195,148,182,135, 13, 61,235, 97,197,252,241,228,232,
+241, 51,254, 53,132, 55,215, 26,141,198, 70, 54, 54, 54,179,213,106,181,100,253,250,245, 18,165, 82,233,115,240,224, 65,122,255,
+254,125, 8,133, 66, 88, 90, 90,162, 91,183,110,226, 94,189,122, 53, 8, 13, 13,173,119,248,240,225, 1,125,251,246,253,237,196,
+137, 19,199,170, 51, 87,118,246,246,151,191, 93, 58,206,166,153,167, 23,116,122, 61,146, 50, 82, 64,137, 8,206, 14, 50,124, 52,
+176,165,176, 99,160,200,235,219, 31,206,135, 56, 54, 27,240, 78,250,131,163, 15,107,218,198, 78, 13,101,183, 6, 6, 52, 8,232,
+ 31,220,158,105,212,216, 23, 66,137,180,226,189,230, 45,253,209,188,165, 63, 25, 63,166,208,243,254,253,251, 11, 78, 95,190, 57,
+191, 83, 67, 89,248,213,167,197,213, 45,140,249,146,121,152, 53,107, 22,108,109,109, 95, 53, 25,184,120,241, 66,149,223, 49,229,
+186,248,226,147, 21, 43, 86, 88,101,100,100,124,248,243,207, 63,191,231,228,228, 52, 37, 45, 45,237,180, 41, 34, 35, 9,241,128,
+ 88,220,109,204,119,223,177, 45,223,125,151,103,229,228,196,176, 70, 35, 73,142,141,181,251,110,253,250,224,194,164, 36,169,202,
+220,188, 40, 51, 63, 95, 27, 19, 19, 3, 51, 51, 51,194,227,241, 58, 84, 98, 46,210, 9, 33,171, 25,134,204, 37,132, 16,137,196,
+ 44,247,227,143, 63, 14, 45,123,175,201,177, 99,199,204,251,247,239, 95, 72, 8,137, 6, 0,137,196,172, 51,143,199, 88,211,210,
+142,158,213,166, 24, 75,169, 84, 58,109,214,231,243,100, 5, 57,121, 42, 93,113,177,222,222, 66, 78,136,220,156, 87,144, 95, 88,
+152,146,154,169,153,244,233, 12,222,130,121, 51,167,193,196, 76,196,206,206,206,245,124,124,124,110,109,223,190,221,193,214,214,
+ 22,121,121,121,200,206,206,198,173, 91,183,192,178, 44,122,247,238, 45,246,247,243,243,255,110,237,218, 48,103,103,231,118,166,
+152, 44,137,173, 29, 14,190,211, 18, 0, 48,228, 89,118, 69,132,229,212,208,255,164, 96, 26,150,144, 95,250, 89,137,164,214,203,
+ 47,189, 80,223,237, 58,116,232, 32, 4,128,153, 51,103, 22, 20, 23, 23,175, 32,132,236, 86, 42,149, 41, 53,124,117,214,130, 5,
+ 11, 92, 60, 61, 61,221,119,239,222,141,162,162, 34, 0,112,240,244,244, 68,227,198,141,141, 33, 33, 33,240,246,246,134,185,185,
+ 57,174, 92,185,130, 27, 55,110, 32, 32, 32,192, 92, 40, 20,126, 80,149,193, 10,234, 25,180, 64,220,191, 73,167,198, 1,163, 32,
+183,112,198,246, 61,251,240, 56,124, 71, 39,141, 46,122,193,138,169, 46, 31,169,168,120,180,107, 35,243,121, 30,129,157,109, 27,
+ 54,125, 23,238, 1,119,237,212,198,171,113, 11,167,120,173,228, 75,212, 59, 22,125,171,204,174,202, 92, 57, 57, 57,173,233,221,
+187,247,144, 45, 91,182, 88, 1, 64,100,100, 36,210,211,211, 97,111,111, 15,137, 68, 2,129, 64, 80,177,126,168,169,152,153,153,
+ 33, 53, 53,181, 98,153, 41,163,209,136,194,194, 66, 56, 57, 57,149,186,155,175, 9,179,104,145,105, 93, 89,206,206,206, 29,253,
+253,253,119,185,186,186,186,189,248,122,207,158, 61, 49,126,252,120, 80, 74,209,161, 67,135,110,227,199,143,167,148, 82,176, 44,
+139,244,244,244,162,200,200,200,238, 41, 41, 41, 55,171,216,110, 85, 90, 90, 26, 38, 77,154,132,196,196,196, 41, 10,133, 34,129,
+ 97, 24, 73,249,114, 96,132, 16,145, 66,161,240,246,246,246,222, 48,126,252,120,196,199,199, 35, 38, 38,230, 86, 93,187, 76, 41,
+165,198,182,109,219, 62,213,235,245,129, 6,131, 1, 42,149, 10,189,122,245,146,248,248,248,164, 11, 4,130, 71,121,121,121, 35,
+202,150,212, 50,197,172,241,157,157,157,157, 4, 2,193,150,113,227,198,245,105,223,190, 61, 30, 61,122,132, 83,167, 78, 97,192,
+128, 1, 8, 10, 10,194,130, 5, 11,250, 46, 88,176, 96, 22,128,170,110, 6, 14, 30, 58,116,168,190,171,171,107,197,146, 72, 22,
+ 22, 22,248,248,227,143, 49,114,228, 72,156, 60,121,178,253,242,229,203, 15, 5, 5, 5, 57,132,132,132, 24,222,230, 70, 91, 28,
+216, 30, 94,209,217,120,214,164,180,253, 40, 55, 90,229,207,225,226, 15,142,127,176,193,210,106, 75,116,124, 62,243, 72,225,236,
+183,255,202,229, 79, 43,186, 8, 1,230,145, 86, 91,162, 43, 13,155, 83, 20,148, 24, 96, 38,102, 16,159, 86,136,135,207,178, 42,
+ 59, 73,207,191, 98,204, 62,219,184,113, 35, 86,175, 94,221, 91,165, 82, 21,197,197,197,165, 22, 21, 21, 21,127,244,209, 71,132,
+207,231,227,250,245,235,120,254,252, 57,154, 55,111, 14,107,107,107,116,236,216, 81,216,163, 71, 15,183,177, 99,199,126, 4,224,
+ 88,101,154, 36, 40,136,239, 44,182, 63,188,102,233, 80, 27, 48, 49,136, 73,204, 67, 3,215,214,176,179,114, 67, 74,102, 17,110,
+ 71,157,196,147,216, 19,104,224,226,142,241,195, 27, 90,173,219,122,253, 56, 9,152,208,224,197,238,194,202,166,132, 74,120,198,
+ 86,139,247,220,135, 49, 39, 22, 52, 63, 17,180,248,175,171,196, 72,237,220,224,211,206, 17, 82, 43,123, 38,242,209,186, 86, 85,
+109, 59,165, 52,157,207,231,111,227,241,152, 9, 0,208,170, 85,235,226, 85,171, 86, 85,118,177,102, 91,181,106, 93,204,227, 49,
+178,210, 8, 22,111,171,193, 96, 72,175,174,156,175,152,153, 53, 34,145,120, 54, 0,226,234,234, 86,116,244,232, 81,246,253,247,
+223,199,154, 53,107,196,243,230,205,251,193,195,195,163, 75,124,124,124, 66,117,251,104, 16, 33,245, 92, 26, 52,232,177,236,250,
+117, 42,208,235, 73,206,173, 91, 5,133,233,233,250,148,194, 66,201,111,119,239, 14,158, 50,103,142,196,201,203, 11,161,231,207,
+155,167,229,230, 22,230,149,148,104,227,226,226,168,209,104,188, 90,197,182,127,225,232,232,216,108,199,142, 29,254, 31,127,252,
+113,104, 74, 74,202,160,178,110,140,195, 0,218, 18, 66,162, 95,124,237,240,225,195,237, 71,141, 26,117, 55, 61, 61,253,139,234,
+202,249, 2, 77,237,237,236,164,123,182,238,140,176, 49, 55, 99,236, 93, 21,140,192,202,138,111, 16,153, 9, 89, 64, 85,207,173,
+190, 12, 64,211, 42,234,236,213, 69,195,137,135,135,199,225, 95,127,253,213, 65, 32, 16,192,104, 52,194,222,222, 30,207,159, 63,
+ 71, 94, 94, 30, 10, 11, 11, 17,247, 40, 26,245,221,220, 48,125,252, 39,206, 95,127,187,246, 48, 33, 36,240,197, 70,172,210,197,
+184,117,186, 87, 27,156,170, 22, 8,135, 41,229,172, 10,150,101,159, 43,149, 74, 72,165, 82, 52,105,210, 68,126,251,246,237,171,
+ 41, 41, 41, 41, 53,105, 74, 36,146, 15, 58,116,232, 96,190,103,207, 30, 4, 4, 4,192,210,210, 18, 33, 33, 33,136,140,140,132,
+ 78,167, 99,138,138,138, 96,110,110,142,149, 43, 87,194,221,221, 29, 5, 5, 5, 72, 76, 76,180, 21, 8, 4,118, 85,105,134,156,
+ 9, 89,154, 31,123,105, 65, 26, 57,221,107,251,158,125, 24, 55,108, 40,156,232,179,171,150, 13,200,210, 30,253, 59,124, 69,121,
+110,253,100,230,126,214,141,154,245,135, 80, 36,199,212, 57, 75, 16,243,224,152,117, 73, 97,196, 20, 98, 76,114, 3, 48,253, 85,
+ 77, 82, 90, 65,140, 66,161,248,100,235,214,173,230, 21,119,244,101,107, 18,190,104,172,202, 31,149,213,105, 85, 11,166,235,116,
+ 58,232,116, 58, 24,141, 70,100,101,101,161,176,176, 16, 86, 86,101,137,250, 23, 1, 4,132,208, 42, 86,161,127, 81,147, 97,152,
+ 17,251,246,237,115,147, 74,165,175,126, 6,101,209, 65, 72,165, 82,176, 44, 11,157, 78, 7,131,193, 0,141, 70, 35, 15, 10, 10,
+154, 12,224,102,101,154, 60, 30,111,230,164, 73,147, 58, 28, 63,126,220,107,233,210,165,208,233,116,107, 50, 51, 51, 49,126,252,
+120,176, 44,139,142, 29, 59,182,165,148, 62,158, 62,125, 58, 0, 96,241,226,197,250,162,162,162,137,117, 61,150, 28, 29, 29,125,
+251,247,239,239,117,225,194, 5,116,234,212, 9, 26,141, 6, 95,125,245,149,197,234,213,171, 45,246,239,223,111,191, 98,197,138,
+ 95, 0,244,172, 78, 51, 32, 32, 64,144,158,158, 62,119,196,136, 17,179,130,131,131, 45, 19, 19, 19, 97,102,102,134,163, 71,143,
+ 98,235,214,173,167,116, 58,221,130, 67,135, 14, 45,219,182,109, 91,175, 1, 3, 6, 96,235,214,173,211,202,134, 69,176,149,104,
+ 42,220,220,220, 16, 17, 17, 1,107,107,107,216,217,217, 33, 63, 63, 31, 55,110,220,192,173, 91,183,224,227,227, 3, 66,136,117,
+ 89,155,102,120,157,243,168,150, 70,244,255, 93,179,124,134, 26,251,194,177, 75, 41, 45,221,104, 90,247,114, 18, 66,248, 10,133,
+ 98,128,149,149,213, 20, 74, 41, 63, 55, 55,119,171, 84, 42, 61, 24, 27, 27,171,253,255,218,246,127,133,193,114,113, 65, 65, 86,
+150,117,140,131, 83,243,125, 14, 78, 77,203, 82, 85, 51,143,120, 60,235, 24, 71,199,146, 2, 0,208, 25, 40, 66, 31,229, 33,226,
+105, 26, 34,159,166, 65, 38,174,249,174,219,214,214, 22,237,219,183,199,209,163, 71,145,148,148, 36, 95,185,114,101, 35,157, 78,
+167,235,223,191,191,210,195,195, 35,183, 99,199,142, 16, 8, 4,184,125,251, 54, 10, 10, 10,192, 48, 12,196, 98, 49, 88,150,173,
+242, 86,212, 33,215,122,212,168,241,205, 61,237,172, 24, 28,187,118, 26,109,125, 6, 66, 42, 22, 32, 51, 79, 5, 2,130,103,207,
+207,131, 53,200,113, 63, 58, 30,237,253,164,120,167,181,149,107,209,133,156,241, 0,126, 48,165,130,116,113, 33, 16,249, 14, 2,
+216,166,160,185,177, 96, 11, 82, 64,165, 14, 40,102,205,144,165, 76,192,163,171, 7, 64,117, 53, 15, 21, 51, 24, 12, 19, 29, 28,
+ 28,152, 5, 11, 22,244,247,244,244,100,167, 78,157,122,253,249,243,231, 67, 94,252, 76,253,250,245, 15,108,218,180,169, 67, 92,
+ 92, 92,201,210,165, 75,143,101,100,100, 76,170,229,137, 57,151, 16,178, 14, 0,146,146,146,178,255,248,227,143, 78, 87,174, 92,
+ 89,177,110,221, 58,215,169, 83,167,138,167, 78,157, 58, 23,192,164,234,186, 5,101, 98,113,240,178, 43, 87,168, 33, 57, 89,115,
+100,235, 86,222,250,176,176,121, 58,150,173,103,239,224,192, 15,234,212, 73,109,103,101, 85,156,158,150,198, 90, 41, 20,228,121,
+108,172,156, 21, 8,116,167, 79,159, 46,204,201,201,169,114,153, 17, 62,159,175,169,172, 91,176,138, 99,132,173,108,140, 86, 53,
+ 20,176,148,234,172, 60, 61,105,143,110,237, 26, 62,125,252,236,153,196,202,138,215,168, 97,253,198, 15, 31, 61,191, 69,141, 6,
+ 53,128, 2, 19,187,216,134, 46, 90,180,168,185,133,133, 5, 88,150,133,165,165, 37, 50, 51, 51,161,213,106, 81, 80, 80, 0,109,
+ 97, 62,180,249,249,136, 76,120,142, 14, 65, 65,232,209,174,109,147, 19,122,253, 80, 0,123,171,211,181,241,243,175,136, 92, 29,
+240,250, 79,212,242,195,248,188, 10,179,117,178,117, 3,136,228, 50, 52,159,241, 69,157, 79,230,212,212,212,187,238,238,238, 39,
+123,247,238,221,103,194,132, 9, 76, 90, 90,218,105, 71, 71,199, 14,233,233,233, 81,213,125, 79, 46,151, 55, 40, 55, 20,150,150,
+150, 88,191,126, 61, 28, 29, 29, 81, 82, 82,130,219,183,111, 83, 87, 87, 87,114,233,210, 37,184,186,186, 34, 43, 43, 11, 58,157,
+ 14,197,197,197,105, 90,173,182,202, 3,191,172, 27,176,247,204,222,206,167, 30,135,239,232,228, 66,226,110,127, 48,171,243,211,
+199,145,143, 18,207,158,187,254,141, 65, 45, 73,202, 75, 62, 63,215,179,213, 93,187, 41,179,191,198,166, 53,139,240,248,230,149,
+ 28,199,122, 5, 63,152, 17,205,111,109,186, 87, 27, 65, 87, 63,122,244,200,252,254,253,251, 32,132,192,210,210, 18, 82,169,180,
+ 82,147,101, 42, 70,163,177,226,111, 86, 86, 22, 50, 51, 51, 17,155, 16,131, 67, 23,119, 64,111,208,219,253,218,198, 34,205, 75,
+ 40,140,176,203, 39,243,179, 30,208,187, 53,156,135, 91, 63,252,240,195,161, 46, 46, 46,230, 47,190,222,162, 69, 11,140, 24, 49,
+ 2, 59,119,238,196,157, 59,119, 42,186, 49, 41,165,200,204,204, 76, 53, 26,141,191, 85,165,153,152,152,152,231,234,234,218,235,
+147, 79, 62, 9, 63,114,228,136,197,183,223,126, 11,163,209, 8,131,193, 80,209, 45, 90,254,119,247,238,221, 8, 15, 15, 95,152,
+150,150,246,168, 46,199,145,147,147,147, 79,255,254,253,175,252,240,195, 15, 86, 25, 25, 25,200,202,202, 66, 81, 81, 17,138,139,
+139, 97, 52, 26, 81,191,126,125, 98, 48, 24, 26,215,212, 29,200, 48,204,209,139, 23, 47,246,106,212,168, 17, 0, 64,175,215, 35,
+ 52, 52, 20,227,199,143,207,150, 74,165, 31,196,199,199, 23, 43, 20,138, 47, 79,156, 56,209,171,101,203,150,240,243,243,115,202,
+200,200, 48, 7,144, 95,197, 13, 4,140, 70, 35, 50, 51, 51,145,153,153,137,159,127,254,207, 58,206, 26,141,166, 44, 56,160, 37,
+173, 90,181,170,127,251,246,237,231,111,107,163, 29,255,251,118,196,207,255, 20, 30, 87, 31, 3, 0,194,125, 75,135, 92,185, 95,
+142, 46, 29,126, 48,106, 84,173,244, 20, 10,133, 45,165,116, 92,112,112,240,140, 94,189,122,217, 43, 20, 10,216,216,216, 32, 50,
+ 50,178,195,153, 51,103,190,119,117,117,253,209,104, 52,254,104, 74,180,158,195,164, 46,194,193, 70, 59,187,131, 89, 41, 41, 34,
+157, 72, 36,141, 41,143,106,149,154,171,193, 70, 96, 15, 12, 58,125,217, 5,130,150, 61, 76,235,214, 80,167,190, 15, 86,245, 39,
+ 28,164, 3,176,109,219, 17,100,100,100, 8,215,175, 95,239,113,228,200, 17,215, 17, 35, 70, 36, 54,108,216, 48, 63, 40, 40, 8,
+ 59,118,236,128,147,147, 19, 52, 26, 13,216,106,196,205,109,140,131,219, 54,111,200,123,146,240, 0,129,222,131, 81, 95,209, 17,
+207, 82,242,145, 83,168, 65,118,190, 10,141,189,103, 35, 61,187, 4,249,197,106, 68, 62,222, 13, 23, 39, 79,134, 39,136,237,101,
+170,193, 82,223,223, 5, 77,228, 62, 8,189,186, 64,212,116, 40, 4,174,237,144, 20, 25,130,123, 39,191, 67,242,195,107,160,172,
+ 17,142, 30, 77, 76,218,118,129, 64,176,228,196,137, 19, 61,150, 47, 95, 46,232,214,173, 91, 7,133, 66,209, 94,169, 84,134,150,
+ 29,228,237,251,244,233,211,193,193,193, 1, 27, 54,108,208, 10, 4,130, 37,117,188,251,121,177, 91,237,146,147,147,211,212,195,
+135, 15,255, 57, 97,194, 4, 56, 59, 59,183,169,238,187,153, 2, 65,139,209,203,151, 83, 1,143, 71, 79,252,242, 11,153,127,242,
+228,198,157,191,255, 46,234,208,161, 3, 8,128,136,200, 72,201,202,245,235,205,134, 14, 24,144, 17,243,252, 57,206, 94,188,168,
+201, 72, 75,203,202, 44, 46,158,243,166,102, 23,213, 22,131,193, 16,150,152,148,232, 18,216,166,165,253,221,232,184,135, 61,187,
+182,111,207, 48, 12,243,248, 89, 66,168,189,189,133,244,234,213, 43, 58,131,193, 16,102,226,254,233,215,177, 99, 71,126,110,110,
+ 46, 20, 10, 5, 50, 51, 51,145,146,146, 2,189, 94, 15,117,126, 46,116,249,249,208, 23,228,193, 88, 92,132,184,219,183,224,235,
+230, 34, 62, 91, 58, 8,126,111, 77,119,156,149, 69,168, 94,140,100,137,205,229, 16,203,229, 47, 45, 78,109,226,197,113,128,133,
+133,197,220,194,194,194,147, 41, 41, 41, 75,181, 90,237,212,229,203,151,183, 90,178,100,137,221,188,121,243, 44,230,204,153,115,
+192,195,195,163,101,124,124,124,149,166,181,168,168, 40,214, 96, 48,216, 1,112,184,112,225, 2, 28, 28, 28,144,159,159, 95,186,
+221,106,181,182,164,164, 68,146,157,157, 13,141, 70, 3,173, 86, 11, 11, 11, 11,220,185,115, 39,215, 96, 48,252, 89, 83,249, 44,
+ 26,144,165, 26, 93,244, 2,219, 38, 50,165,206, 96,221, 57, 35,135,205, 93,244,173,114, 9,128,239,122, 55,104,176, 93,199, 94,
+137,123,242,224,152,245,243,219, 33, 57,202, 39,197, 94,219, 79, 60, 43,172,166, 30, 41, 33,132, 37,132, 80,111,111,111,100,102,
+102,130,199,227, 65, 42,149, 66, 46,151,195,199,199, 7, 73, 73, 73,117, 54, 88, 6,131,161,194, 92,157, 11, 59,142,236,162, 84,
+108, 95,179, 7, 46, 78,110, 12, 0,251,148,180,164,238, 99,103, 13,105,227,217,209,122, 69,220,181,220, 42,199,181, 41,149,202,
+123, 0, 44, 94,190,105,117,233, 98, 99, 99,115, 81,171,213, 34, 62, 62, 30,103,207,158, 13, 74, 78, 78,190, 92,155,125,157,156,
+156,252,204,197,197,165,215,123,239,189,183,163,121,243,230, 13, 40,165,240,241,241,193,128, 1, 3,112,232,208, 33, 68, 69, 69,
+161,160,160,128,189,122,245,234,175,169,169,169,181, 26,144, 67, 8, 33,148, 82,234,236,236,220,184, 95,191,126,215, 54,109,218,
+100,157,149,149, 5,149, 74,133,226,226, 98, 28, 60,120, 16,157, 58,117,130,141,141, 13,254,248,227, 15, 67,121,143, 66, 85,230,
+138, 82,122,244,200,145, 35,189,188,188,188,240,232,209, 35,156, 59,119, 14,158,158,158, 16, 8, 4,232,215,175,159,237,190,125,
+251,166,250,250,250,174, 21, 8, 4,223,244,233,211, 7, 70,163, 17,119,238,220, 73, 77, 72, 72, 40,172,201, 4, 87,134, 74,165,
+ 2,165, 20,122,189,126, 61,195, 48, 31, 4, 4, 4,244, 8, 15, 15,191,245,182, 52,212,174,174,174, 77, 5, 2,193,116,107,107,
+107,100,103,101, 33,159, 5,114,114,114, 64, 41, 69, 62, 91, 26,184,146,101,255,167, 87,189, 81,163, 70, 39, 84, 42,213,252,228,
+228,228, 42,215,242,114,113,113,241,147, 74,165, 51,250,247,239, 63,162,111,223,190, 60,189, 94,143, 99,199,142, 97,211,166, 77,
+232,213,171, 23, 26, 54,108,136, 57,115,230, 88,170,213,234,121,167, 79,159,158,219,164, 73,147,211,133,133,133, 95, 84,167,201,
+ 97,146,193, 42, 53, 89, 46, 46,200, 45,187,163,177,179,177,177,217,100, 52, 26,187, 0, 95,193,156,111,137, 71,119,111, 35, 39,
+155, 7,141,202, 8,150,150,154, 44,147,186, 49, 84,127,194,194,155,162, 32,134, 64,175,215,195,209,209, 17, 43, 87,174, 68,126,
+126, 62,127,236,216,177,245,191,254,250,235,123, 90,173, 22,197,197,197, 80,169, 84, 80,169, 84, 48, 26,141, 85, 26, 44,161, 88,
+211,188,158, 99, 35, 20,170, 90, 67, 42, 22, 33,167, 64, 83,106,174,242,212, 56,244,231,135,208,148,168, 96,212,233, 96,208,234,
+ 33,119, 28,136, 6,190, 93, 0, 60,109,102,162, 89, 41,253,203, 26,160,125,122, 14,218,167,231, 32,235,178, 0, 71,151,143,120,
+229,196, 55,109,114, 98, 74, 74, 74,138,139,139,203,206,187,119,239,126,252,193, 7, 31,224,210,165, 75, 95,162,108,102,149, 68,
+ 34,249,242,131, 15, 62,192,221,187,119, 17, 29, 29,189,179,170,174,157,218, 34, 18,137,138,181, 90,109,121, 87,144,180,134,207,
+186,180, 26, 52,136,201,191,123,183, 96,249,197,139,139,126,251,237, 55,209, 59,157, 58, 65,175, 47, 53,211,245,235,215, 71,143,
+158, 61,197,187,246,239,151,171,242,242,110,207,159, 58,245,207,205,163, 70, 21,220, 42, 42,122, 96, 98,125, 54, 41,235, 26, 4,
+165,180, 73, 85,175,213,134,226,226,226,141,243,231,205, 10, 62,120,232,168, 91, 61, 55, 23,139, 51,231, 46,223, 23,155,137, 24,
+175,250, 13,120,133,133,121,252, 77,235,191, 51, 43, 42, 42,250,222, 68,185, 38,118,118,118, 72, 75, 75,195,211,167, 79,161,209,
+104, 74,183,189,164, 24,218,220, 60,104,243,115, 64,212, 42,136,141, 70,168,179,210,225,225,229, 9,252,103,134, 97, 77, 13, 88,
+165, 6,171,252,175,153,133, 5,132, 50, 25,120, 2,129,201, 99,176,156,157,157, 3,252,253,253,247,111,219,182, 77, 56,115,230,
+204, 54, 30, 30, 30,155,210,210,210, 18, 92, 93, 93,187,173, 89,179,230,214,178,101,203,196, 35, 70,140,104,188,117,235,214, 81,
+ 0,182, 86,121, 19,161, 86,239, 63,113,226,196,112,119,119,119,135,200,200, 72,168,213,234,242,241,102, 0, 32, 41,255,220,227,
+199,143, 85,106,181, 58,227,193,131, 7, 5, 9, 9, 9, 90,152, 48,235,111,209, 6,101,216,204, 33,174,131, 28,157, 92,110, 72,
+204, 60,234,211,162,187, 3,103, 14,113, 93,179,246, 64,178,250, 84,108,108,225,194, 41, 94, 43,139, 11, 35,166, 88,185, 22,253,
+112,234,216,179, 66, 83, 14,163,178, 25,131,176,181,181, 5,159,207,135, 64, 32, 64,249, 88, 36, 71, 71, 71,228,231,231, 87,219,
+ 69, 88, 85,227, 93, 80, 80,128,252,252,124, 60,121,254, 8,217, 69,169, 56,187, 39, 12, 70,163, 17,106,181,186,212,204, 58,186,
+226,252,222, 91,230, 65,131, 91,205,183,245, 35,151,178, 35,232,109, 83,143, 83,134, 97,102, 12, 26, 52, 8, 58,157, 14, 3, 6,
+ 12,192,158, 61,123,102, 0,184, 92,219,227, 61, 37, 37,229, 6, 33,164,209,211,167, 79, 45,244,122,253,187,253,251,247,255,173,
+ 79,159, 62, 8, 11, 11,195,133, 11, 23,130,180, 90,109,140,209,104, 84, 57, 59, 59,175,112,118,118,118, 32,132,172,168,110,130,
+ 71, 89, 42,134,205, 77,155, 54,125,183, 75,151, 46,247,251,244,233,211,108,211,166, 77, 86, 25, 25, 25,229,147, 26,144,156,156,
+140,147, 39, 79,166, 30, 59,118,172,128,101, 89, 91,134, 97, 78,100,101,101,125, 81, 85,183,160, 78,167, 59,114,236,216,177, 94,
+ 94, 94, 94,184,124,249, 50,150, 47, 95,142,230,205,155,227,196,137, 19,240,240,240,128,143,143, 15,108,108,108,166, 23, 20, 20,
+180, 91,189,122,117, 31,127,127,127, 28, 57,114, 4,233,233,233,223, 87,151,178,193, 96, 48,212,104,176,186,118,237, 58,126,230,
+204,153,232,223,191,255,217,192,192,192,214,119,238,220,249,159, 79,211,162, 80, 40, 86, 6, 7, 7,207,109,209,162, 5,126,255,
+253,119,168, 3, 58, 64,246,235, 49, 60,232,215, 1, 20,128,226,215,163,160,148,226,225,128,119, 64, 1,212,239, 54, 24,115,231,
+206,237, 51,112,224,192,122,168, 98,120,132, 66,161,248,246,163,143, 62,154, 53,114,228, 72,132,135,135, 99,235,214,173,184,119,
+239, 94, 69,155,167,215,235, 17, 29, 29,141,232,232,104, 56, 59, 59,163, 95,191,126,100,194,132, 9,189,123,247,238,109, 15, 32,
+ 16, 28,175,107,176, 42,194,197,118,214,214,214, 15,127,248,225, 7,219,214,173, 91,243, 12, 6, 3, 46,133,132, 96,241, 87,179,
+208,187,231,199,208,177,150, 48,104,133, 96,133, 18,211,126, 81,220, 15, 5, 49, 4,172,176, 15,180, 90, 45,198,237, 22,192,138,
+100, 96,253,104, 71, 0, 32,106,181,186,194, 88,149,223, 61, 85, 23,193, 42,204,151,233,244,122, 10,101, 70, 2,146, 83, 31,194,
+ 66,238, 6,202,115, 67, 70, 78, 9, 8, 28, 97,208,196,192,168, 47, 53, 64, 26, 85, 50, 74,180,228,181, 42,204,152,243,215,217,
+192, 70,131,233, 99, 42, 41,165, 27,118,237,218, 53,124,237,218,181,226,190,125,251,250, 57, 59, 59,247, 0,128, 33, 67,134,248,
+ 89, 88, 88, 96,215,174, 93, 26, 74,233,134, 55, 24,225,121, 47, 48, 48, 16, 57, 57, 57,136,143,143, 15,173,118,219,180, 90, 91,
+185,131, 3, 47,227,210, 37,125, 78, 97, 97,189, 78,101,230,138, 97, 24,228,230,230,226,249,243,231,144,203,100,120, 16, 21, 37,
+254,110,210,164, 93, 62,126,126, 76,249, 12, 67, 83, 56,118,236,152, 57,128,182, 53,189, 86, 27, 50, 51, 51,139,157,156,156,198,
+124, 57,127,254,145,239,191,255,222, 50, 61, 35, 61, 70, 44, 18, 25,228,114,137, 98,250,244,201,252,130,130,130,225, 89, 89, 89,
+ 69,166,234,229,230,230, 34, 46, 46, 14,102,102,102, 16, 10, 4, 96, 85, 37, 48, 22, 23, 65,157,147, 9,158, 78, 11,145,209, 8,
+ 27,169, 24,110,142,142,168,103,111,103, 90,215,221,165,179, 21, 3,218, 95,236, 22, 60,221,190, 49,196,114, 25,196,114, 57, 58,
+252, 81, 58,132, 77, 40, 20, 2,235,183,153,210,141, 99,167, 80, 40,254,220,180,105,147, 48, 59, 59, 27, 15, 31, 62,188, 31, 31,
+ 31,159,111, 99, 99, 99, 46, 16, 8,216, 39, 79,158,156,127,244,232, 81, 63, 79, 79, 79, 80, 74,107,154,253,245,221,225,195,135,
+187,119,236,216,209, 80,191,126,125, 89, 70, 70, 70,189,252,252,124,146,154,250,242, 24,230,219,183,111, 75, 18, 19, 19,139, 89,
+150, 61,130,210, 60, 88, 53, 30,248, 51,135,184, 74, 66,239, 98, 90,231,158, 30,205, 45,236,252,144, 99,184,219,252,198,253,212,
+105, 51,135,184,110, 92,123, 32, 89,109, 70, 52,191, 17, 99,146, 27, 95,162,222, 97,226,249, 67,125,125,125, 65, 41,197,173, 91,
+183,112,237,218, 53, 92,185,114, 5, 9, 9, 9, 21,159,177,180,180,196,185,115,231,208,165, 75, 23,147,143,163,146,146, 18, 56,
+ 59, 59,195,218,218, 26,135, 47,237,196,246, 53,123, 42, 6,186,151,147,149,149, 5,169, 84,138,101,159,175,149,143,157, 51,248,
+ 27, 0, 61, 76,209,118,115,115,243,236,208,161, 67, 95, 71, 71, 71,228,230,230,194,193,193, 1,173, 90,181,234,239,232,232, 88,
+ 63, 61, 61,189, 78, 93, 89, 90,173,118,114,151, 46, 93,150,126,254,249,231, 48, 24, 12,248,240,195, 15, 17, 23, 23,183,255,217,
+179,103,235,221,221,221,167, 77,153, 50,197,209,206,206, 14,147, 39, 79,150, 1, 24, 84,141,193, 90,177,122,245,234,225,193,193,
+193,140, 94,175,127,231,194,133, 11,136,143,143,135, 86,171,133,193, 96, 64,124,124, 60, 22, 45, 90,148, 90, 80, 80,208, 57, 57,
+ 57, 57,182,166,114,165,165,165,205,250,227,143, 63,250,120,123,123,227,204,153, 51,152, 56,113,226, 9, 11, 11,139,166,126,126,
+126,245,234,213,171,135, 63,255,252, 19,102,102,102,112,118,118,118,156, 55,111, 94,191,158, 61,123,226,252,249,243, 88,178,100,
+201,113, 39, 39,167,239,106, 50,193,124, 62, 31,122,253,203, 55,180, 60, 30, 15,247,238,221, 67,215,174, 93, 49,119,238, 92, 0,
+192,249,243,231, 45,122,244,232,241, 32, 40, 40,200, 34, 36, 36, 68,131,255, 97,100, 50,217,152, 95,127,253, 21, 79,159, 62,197,
+213,171, 87,145,149,149, 5,173, 86,139,188, 50, 43, 42, 46,139,100, 81, 23,119,180,159, 53, 31,195,250, 13, 66,106,106, 42, 24,
+134,177,171,230,134,111,196,252,249,243,113,234,212, 41,172, 90,181, 10,249,249,249,149,126,206,204,204, 12,173, 90,181, 66,203,
+150, 45, 17, 23, 23, 7, 0,118,224,120,115, 6,203,218,218,122,253,230,205,155,109, 59,116,232,192, 43, 51, 59,104,221,170, 21,
+ 70,141, 25,131,115,135,143,195,193,187, 23,136, 86, 14,131, 84,100, 90, 4,203, 98, 7,178,245,217,144, 8, 37, 16,107,181, 96,
+ 89, 51, 68, 36,171, 43, 92,179, 74,165, 66,185,201, 42, 46, 46,134, 76, 38,171,222, 64,104, 69,225,209,113, 6,183,252,194,123,
+184,113,119, 39,244, 90, 61, 26,120,207,135, 74,111, 11,153,253,199, 80,107,255,132, 49,175,116,230,174,200, 34, 8,105,105, 89,
+ 0,136,169, 17,151,191,158,228,133,127, 29,236,206, 26, 77,207,187,170, 84, 42,179, 21, 10,197,214,208,208,208,233,131, 6, 13,
+194,185,115,231,230, 3,192,160, 65,131, 16, 26, 26,138,184,184,184,173, 74,101,229, 51,168,106,139,139,139,203,168,206,157, 59,
+ 79,105,221,186, 53,142, 31, 63, 14,163,209,120,210,148,239,241, 4, 2, 74, 8, 65,249, 12,167,156,220, 92, 60,126,252, 24, 57,
+217,217, 48, 26,141, 40, 81,169, 12, 77, 27, 55, 46,160, 44,107, 94,155,242,188, 56, 99,176,178, 89,132,229,175,213,118, 59,211,
+210,210, 18, 26, 52,104,144, 88, 82, 82,108,111,109,101, 93, 40, 18,137,140, 5,133,133,249, 79, 99, 30,105, 77,105, 20, 94, 32,
+ 58, 42, 42,170, 89,114,114, 50, 18, 19, 19, 97, 40, 46, 4, 79,163, 5,163, 41, 65,183,246,237, 96, 6, 10, 9, 88, 8, 88, 61,
+ 4, 60, 1, 10, 75,103,219, 69,215,120,204,191,208, 32,148,155, 43, 66, 8, 36,114, 57, 68,114, 25,196,230,242,151, 34, 90,166,
+ 76,252, 50, 51, 51,219,189,117,235, 86,103, 39, 39, 39,172, 93,187, 22,206,206,206, 62,193,193,193, 37,157, 59,119, 54,179,179,
+179,131,183,183, 55, 2, 3, 3,113,233,210, 37, 16, 66, 98,107, 56,206, 13,132,144, 30, 87,175, 94,157,117,253,250,245, 33, 10,
+133,130,140, 28, 57, 18,189,122,245,130, 68, 34, 65, 73, 73, 9,114,115,115,113,226,196, 9, 98, 52, 26,253,203, 12,158,187,135,
+135,199, 30, 66, 72,242,243,231,207, 63,120, 85,115,231, 58, 63, 69, 70, 14,251,177,163,147,203,192,206, 61, 61,154,119,237, 25,
+ 12,207, 70, 93,209,181,103, 34, 0,172,180,225,199,127,184,102, 65,179, 35,118,110, 54,191,156, 61,125,110, 81,199,206, 93,191,
+156, 55,193,122,233,202,173,185, 53,142,151, 35,132, 84, 52,182, 12,195, 84, 26,165,226,243,249, 21,179,205,106,188,105, 98,141,
+201,189, 70,183,171,120,174, 55,232,237, 92,156,220,152,242,200, 21, 0,228,231,231, 35, 41, 41, 9,122,189, 30,182,182,182,208,
+235,117,126,181,232,126,156, 54,116,232, 80,162, 86,171, 49,107,214, 44,124,251,237,183, 24, 48, 96, 0,185,121,243,230, 52, 0,
+ 51,234, 16,209, 88, 51,101,202,148, 89, 99,198,140, 65, 94, 94, 30, 46, 94,188,136, 46, 93,186, 96,203,150, 45,246, 23, 47, 94,
+ 92,222,190,125,123,240,120, 60,156, 59,119, 14, 58,157,238,113,181, 13, 0,159,255,110,112,112, 48,147,148,148, 4,161, 80,136,
+192,192, 64, 36, 39, 39,163,164,164, 4, 25, 25, 25,248,250,235,175,211,242,243,243,131, 82, 82, 82, 98, 77,216, 47, 76,135, 14,
+ 29,166, 55,108,216, 16, 23, 47, 94,196,164, 73,147, 78,201,100,178, 65,217,217,217, 19,212,106,245,198,161, 67,135,194,199,199,
+ 7, 49, 49, 49,232,219,183, 47, 90,181,106,133,139, 23, 47, 98,206,156, 57, 39,164, 82,233,251, 53,228,193,122, 18, 18, 18,210,
+ 44, 48, 48, 16, 37, 37, 37, 40, 40, 40,128, 64, 32,128,149,149, 21,162,163,163,209,168, 81, 35,204,157, 59, 23,107,215,174,197,
+204,153, 51,217, 30, 61,122, 24,116, 58,157, 80, 36, 18,253,207, 55,210,197,197,197, 52, 53, 53, 21, 22, 22, 22, 56,112,224, 0,
+ 34,207,159,193,201, 79, 63,134,100,193, 26, 80, 74,145,180,116, 30,186,205, 89,128,182,247,159, 33, 53, 53, 21, 59,118,236, 0,
+195, 48, 21, 51, 98,171,106,219,242,243,243,209,178,101, 75,220,186,117, 11, 59,118,236,192,186,117,235, 42,162,181, 2,129, 0,
+ 65, 65, 65,232,222,189, 59,158, 60,121,130,173, 91,183,194,194,194,130,115, 76,111,218, 96,177, 44,219,181, 85,171, 86,188,162,
+162, 34,168,213,106,164,165,165, 33, 62, 62, 30,102, 82, 51, 36,101,165,160,133,191, 14,105,108, 1,162,239, 63, 52, 18,158,224,
+ 94, 77,119, 32, 90,173, 22, 90,173, 22, 17, 17, 17,165, 83,223, 27,173,168, 24,232,169,215,235,161,209,104,160, 82,169,112,241,
+226, 69, 42, 22,139, 33,147,201, 72,117,125,239,172, 65,115,234,226,181,251,125, 70, 12,236, 34, 58, 23,178, 29,122, 45,139, 2,
+181, 5,138, 84, 26, 20,169, 5,208,136,123,130,144,171, 96,120, 98,180,111,217, 16, 23,175,197,168,141,122,157, 73,233, 10,192,
+ 26,193,119,246,131, 33, 53,226, 63, 47,189, 50,155, 80, 40,149,131, 53,214,110, 86,176,153,153,217,150,221,187,119,143,105,215,
+174,157,121,112,112,112, 35, 0, 16,139,197,236,238,221,187, 11,205,204,204,182,212,118, 39,190,154,189,221,217,217,185,163, 72,
+ 36,154,218,191,127,255,142, 99,198,140,193,195,135, 15,241,251,239,191,223, 87, 40, 20,213,142,153,225,137, 68,217, 69, 25, 25,
+ 86,242,250,245,249, 86,230,230,202, 51,103,206,120,188,211,185, 51, 18,226,227,145,147,147, 3,149, 74,133,168,232,104, 42,100,
+152, 68, 98, 97,193, 60,190,123,151,225,137, 68,217,181, 40,103,116, 77,179, 8,235, 26,205,146,153,145, 6, 11,230, 78,240, 84,
+171,213,205, 10, 10, 10, 12, 2,129, 64, 32, 21,209,132,218,104,232,245,250,227, 87,175, 94,125,175, 67,135, 14,226,152,136,123,
+ 48,228,231, 67,155,159, 11, 33,107,132,141,127, 11,240,116, 26, 64,171,135, 75, 19, 10,117,158, 20,215,239, 61,211,235,245,250,
+227,166, 26, 44,134,199,123,121,220,149,133, 28, 98,115,115,136,228,242,151, 94, 39, 53,244,107, 57, 58, 58, 74,123,247,238,221,
+205,223,191, 52,167,214,154, 53,107,160,211,233, 68,122,189,190, 98, 38, 92, 81, 81, 17, 14, 30, 60,136,157, 59,119, 94,183,180,
+180,252,213,132,155, 9,131,171,171,235, 84,150,101, 29, 12, 6,131,206,222,222, 94,184,127,255,126, 72, 36, 18, 48, 12,131,150,
+ 45, 91, 66, 34,145,104, 20, 10,133,174,172, 12,250,181,107,215,242, 63,254,248, 99, 97,101,122,141,155,251,204,246, 52, 88,119,
+150,152,121,212,183,176,243,131,103,163,174, 0,128,238,253,198,194,179, 97, 61, 20,100, 69,212, 87,171,226, 7, 10,249,185,214,
+ 15, 55,166, 68,153,245,109, 54,166, 56, 35,228, 9,128,159, 76, 58, 53, 89, 22,193,193,193,232,217,179,103, 69,119,160,131,131,
+ 3,180, 90, 45,140, 70, 99,173,198,178,149, 39, 17,253,250,107,194, 96, 17,240,107, 27,139, 52, 0,246, 47,154,171,196,196, 68,
+ 36, 38, 38, 86,220, 8,178,212,180, 20, 42, 10,133,194,204,211,211,115,116,179,102,205,112,225,194, 5, 68, 68, 68,164,132,132,
+132,184,180,110,221, 26,174,174,174, 99, 20, 10,197,124,165, 82,105,114, 66,101,123,123,123, 89,167, 78,157, 62, 29, 51,102, 12,
+ 30, 61,122,132,121,243,230,101,167,166,166, 30, 57,118,236,216, 39,159,125,246, 25,211,185,115,103,100,100,100, 96,203,150, 45,
+198, 91,183,110,125,107,109,109,189,164,134,253,254, 72,169, 84,186,170,213,106,228,228,228,192, 96, 48,160,164,164, 4,167, 79,
+159,198,153, 51,103,210,243,242,242,130,148, 74,229, 83, 83,202,230,238,238,110, 30, 24, 24,232,248,228,201, 19,236,217,179, 7,
+ 58,157,110, 65,124,124,188,206,210,210,114,215,242,229,203, 23, 89, 90, 90,218, 4, 7, 7,163,252,184,253,243,207, 63,177,120,
+241,226, 19,102,102,102,131,162,162,162,116, 53,200, 15,252,230,155,111,190,177,179,179,251, 96,248,240,225, 76, 96, 96, 32,238,
+220,185, 3,163,209,136,110,221,186, 85,152,171,211,167, 79,239, 62,125,250,244, 96, 0, 66,185, 92, 46,249, 95,143, 94,149,163,
+ 86,171, 17, 19, 19, 3, 71, 71, 71, 52,108,221, 14,115, 31, 60,199,213,208, 48, 80, 74,209,241,225,115, 20, 21, 21,227,215, 95,
+127, 69,120,120, 56,120, 60, 30,188,188,188,106,212,212,233,116,120,250,244, 41, 50, 51, 51, 49, 96,192, 0,140, 24, 49, 2,171,
+ 87,175,134, 78,167,195,151, 95,126,137,156,156, 28,108,219,182, 13, 79,159, 62, 5,159,207,135, 92, 46,231, 28,211,155, 54, 88,
+101,221, 76, 96, 89, 22, 41, 41, 41,184,115,231, 14,158, 63,127, 14,153, 76, 6,149,193,200,110, 57,127,141, 37, 68,152,204, 82,
+122,157, 26, 74,179,136, 87,231,196,245,122, 61,225,243,249, 8, 13, 13,197,179,103,207, 96,222,144, 86,152,171,242, 8, 86, 73,
+ 73, 9, 4, 2, 65, 81, 88, 88, 88,124,120,120,184, 39,159,207,215, 86,165,153, 97,157,187,227,220,133,243,179, 3, 90,250, 54,
+234,222,121, 49,142, 31, 95,132,220,252, 2,148,104, 5, 40, 84,233, 80,172,162,112,177,104,132,214,126,126,200,204,209,226,201,
+195,240,228, 44,161, 77,141,125, 48,122,202,228,239, 94, 57,209,242,221, 17,147, 96,230,241, 14, 52, 15, 15,128, 45, 76, 3, 91,
+ 88,218,109, 34,146, 89,192,220,206, 13, 69, 37,106, 92,123,240, 12,122,202,228,155, 90,233,177,177,177,133, 10,133, 98,227,204,
+153, 51, 87,133,133,133,202, 0,224,222,189,123,197, 74,165,114,169, 82,169, 44,172,205, 14,124, 33,123, 59,145,201,100, 79, 26,
+ 54,108,168,239,219,183,175,237,192,129, 3, 97,103,103,135,187,119,239, 98,229,202,149,119,139,139,139,135,197,199,199,235,107,
+232,118, 72, 9,255,227, 15,139,160,145, 35,173,230, 13, 24,176,114,242,228,201,223, 47, 89,178, 68,216,160, 97, 67,176, 70, 35,
+162,162,162,232,174, 93,187, 12, 63, 45, 92,184, 70, 36,147,241,111, 29, 61, 42, 48,104, 52, 41,255,237,131,216,213,213,181,115,
+159, 94,157,155,124,187,118, 35,212,170, 34,220, 12, 61,129,220,220, 76,108,221,118,184,137,171,171,107,103, 83, 7, 19, 39, 39,
+ 39,239, 59,116,232,208, 44, 63,223, 38,254, 94,110,110,136, 76,120, 14, 17,107,132,208, 96, 0, 79,167, 1, 99, 80,195,173, 25,
+ 5, 97,204,145,150, 86,136, 45,103, 46, 62, 72, 78, 78,222, 87, 99, 36,177,247,187, 24,150,144, 15, 66, 8,206,118,242,133,196,
+ 92, 14,145, 76,134,246,135, 46, 87,152,170,132, 21,159, 67, 32,147,195,186,245, 59, 53,150, 51, 61, 61,189,164, 97,195,134,119,
+ 30, 61,122,212,170,113,227,198,248,250,235,175,145,148,148, 4, 74, 41, 50, 50, 50,212,153,153,153, 41,217,217,217,241,132,144,
+ 35, 74,165,114,187,169, 75,145,176, 44,235,112,236,216, 49, 0, 16, 2,192,133, 11, 23,160, 80, 40, 96,105,105,137,130,130, 2,
+140, 28, 57, 82,252,213, 87, 95, 1, 0,238,220,185, 35, 48, 51, 51,171, 82, 43, 50, 60,250,219,188, 66,154, 75,139,238, 14,204,
+ 49,220,109,222,181,103, 18,186,247, 27,131,115,199,127,197,197, 51,231, 97,195,143,127, 14, 89,225,169,172,231, 89, 5,201,197,
+141,126,108, 18,240, 9, 47,181,248,204,143,211, 6, 88,243,156,157,217, 3,243, 54, 87,157,184,183,252, 14,156,199,227, 85,140,
+193, 42, 31,208, 94, 91,115,245, 34,139, 22, 81,150,128, 16, 47,161, 48, 34, 37, 45,169,187,194,209, 21,233,233,233, 72, 74, 74,
+ 66, 98, 98, 34,146,146,146,208,176, 97, 67, 60, 79,120, 6,145, 72,120,207,196, 40,248,240,254,253,251,155,107,181, 90,252,241,
+199, 31, 6, 66, 72,191, 99,199,142,221,105,209,162, 5,191, 75,151, 46,230,191,254,250,235,112, 0,219,107,115, 47, 33,151,203,
+133, 58,157, 14,191,253,246, 27,146,147,147, 59,167,165,165, 69, 43, 20,138, 31, 39, 78,156,184,185, 73,147, 38, 13,163,163,163,
+159,168, 84,170,201, 74,165, 50,162, 38,177,188,188,188,177,189,122,245, 58,192,178,172,123,199,142, 29,101,139, 22, 45,178,120,
+252,248, 49, 60, 60, 60, 64, 41,141,172,205, 82, 83, 9, 9, 9,133,215,174, 93, 75,111,218,180,169,163,179,179, 51,132, 66,225,
+ 74,103,103,231,165,114,185,252,219, 46, 93,186,216,236,218,181, 11,103,206,156,129, 64, 32,192,179,103,207,148,143, 30, 61, 90,
+239,228,228,180,193,148, 12,238,225,225,225,113, 0,134,181,110,221,122,241,186,117,235, 22, 48, 12,243,209,217,179,103, 33, 16,
+ 8, 0,160,194, 92,213,175, 95,127,212,129, 3, 7, 70,188,101,237,180, 94,171,213,194,214,214, 22,153,153,153,200,200,200, 64,
+189,122,245,208,174, 93, 59,232,245,122, 28, 61,126, 2, 87,175, 94, 5,165, 20,118,118,118,176,180,180,196,253,251,247, 1,160,
+186,217,195,122,157, 78, 7, 27, 27, 27,228,229,229,225,254,253,251,112,112,112,192,204,153, 51,161,213,106,177,127,255,126,220,
+187,119, 15, 12,195,192,193,193, 1,230,230,230,166,104,114,212,214, 96,241,120,188, 75,151, 46, 93, 26,236,231,231,199,127,250,
+244, 41,158, 62, 45,189,153, 81,169, 84, 6, 62, 15, 7,211, 35,254, 24, 86, 77,227, 31,252, 98,174, 12,145, 72,180,101,240,224,
+193,147,199,142, 29,139,169, 83,167,130, 16,130, 95,238,105,145,152,200, 66,175,215, 35, 61, 61, 29,145,145,145,180, 85,171, 86,
+132,101, 89, 93, 80, 80,208,184,240,240,240,214, 60, 30,175,160, 42, 77, 26, 18, 98,112,108, 62,240,253, 31,182,108,191, 60,122,
+244,104,155,254, 3,126,192,189,232, 40,228,151,216, 3,148,194,197, 94,142,214,222,159, 35, 35, 91,141, 51,167,142,231,178, 6,
+245,251,244,193, 94,125,117,229, 4,128, 76,190,202,225,199,157,135,214,236, 61,112,120,220,248, 49,195, 37, 65,193, 35, 33,204,
+138,132, 65, 25, 14, 23,223,142,160,124, 51,220, 10,191,139,136,167, 73,234, 18, 29,111,123,129, 80, 53,187, 38,205, 23,201,205,
+205, 61,153,150,150,250, 67,249,228, 0,134, 33, 50,145, 72,124,178, 6, 51, 21,252, 74, 94,160, 87, 51,196,123,175, 88,177, 34,
+195,214,214,150,125,248,240, 33,182,108,217, 98,188,115,231,206, 33,150,101, 23,100,101,101,149,212,164,105,175,215,223,223, 61,
+111,158,111,235, 65,131,232,192,113,227,212,140, 68, 50,121,229,218,181,243,179,243,243, 93, 0,192,198,202, 42,105,235,226,197,
+ 75,122,247,233, 83,248,240,218, 53,179,208, 63,254, 48, 19, 25, 12,225, 53,149,243, 77, 80,157,102,114,114,242,229, 70, 13,234,
+225,183,237,107,161,211,105,144,154, 82, 26,184,202,202,206, 71,117,230,234, 47,199, 82,233, 44,170, 65,235,214,111,184, 49,105,
+228, 71, 78,239,116, 11, 70,226,253,123,208,229,100,130,232, 13, 16, 16, 62,138, 51,164,200, 72, 47,194,138,147,231, 51, 84,106,
+245,160, 87, 19, 57, 86, 85,206,138,110, 65, 11,115,136,100,165,227,174, 94,140, 90, 9,205, 45, 32,144,201,193, 19, 10, 43, 27,
+ 12, 31, 92, 73, 78,185,247,199,143, 31, 31,113,242,228, 73,235, 97,195,134,225,221,119,223,189,155,151,151,215, 37, 39, 39,167,
+176,174,245,201, 48, 76, 70,159, 62,125, 28,180, 90,173, 97,232,208,161,252,172,172, 44,148, 79,177, 47, 42, 42,194,169, 83,167,
+208,184,113,233,236,252,135, 15, 31,162,105,211,166, 85,106,126, 50, 39, 50, 5,192,146,153, 67, 92,215,220,184,159, 58, 13,192,
+ 74,207,134,110,184,120,230, 60,174, 94, 12,157,215,182, 25,187,177,207,136, 86,223, 72,187,124, 48,187, 73,192, 39, 60,185,133,
+ 51,118, 28, 62,196,139, 14,255,105, 89, 73, 73,100, 3, 0,159, 87, 85,206,242,238,235, 87, 83, 50,168, 84, 42,147,204, 85,117,
+199, 18, 5,165,118,249,100,254,216, 89, 67,218,156,219,115,211, 92, 46,151, 67,167,211,129, 82,138, 6, 13, 26,128, 47,224,227,
+231, 35,223, 23,231,229,101, 45, 52, 69, 83, 38,147, 77, 13, 10, 10, 66,108,108, 44, 34, 34, 34, 14, 41,149,202, 8,133, 66,113,
+ 40, 46, 46,110,104,155, 54,109,176,111,223,190,169, 85, 25,172,170, 52,203, 51,214, 83, 74, 97, 52, 26,115, 0, 64,169, 84,222,
+ 55, 37,250,251,170,102, 89,178,208, 14, 0,208,164, 73,147, 36, 71, 71, 71,139,251,247,239,195,217,217, 25, 58,157,174, 77,109,
+142, 37, 74, 41,171, 80, 40, 54,220,186,117,107, 69,203,150, 45,241,225,135, 31,118,191,115,231, 78,247, 22, 45, 90,192,203,203,
+ 11,215,175, 95,199,217,179,103,127,103, 89,118, 98,106,106,170,186,186, 36,168, 85,109,251,173, 91,183,158, 2, 24, 25, 16, 16,
+240, 1,159,207,135,133,133, 5, 47, 37, 37,133,119,246,236, 89, 0, 24,127,224,192, 1, 99, 93,246,251,223,113, 93,122, 83,154,
+132,144, 47, 71,141, 26,245,227,132, 9, 19, 36,109,218,180,121, 41,162,122,242,228, 73,176, 44, 11, 91, 91, 91,216,218,218,226,
+233,211,167, 56,114,228,136, 54, 63, 63,127,189, 80, 40, 92, 89,157,230,200,145, 35,127,156, 48, 97,130,164,117,235,214,200,207,
+207,175, 48,111,199,143, 31, 7, 33, 4,118,118,118,176,181,181,197,147, 39, 79,112,228,200, 17,117,110,110,238, 90,173, 86,187,
+250,239,220,246,127,157,193,202,201,201,153,254,197, 23, 95,116, 25, 55,110,156,109,113,113, 49,207,214,214, 22,105,105,105,134,
+211,167, 79,231, 20, 22, 22, 78,175,205,143,133,134,134, 78,233,215,175,223,250, 95,126,249,101,219,246,237,219, 59, 15, 29, 58,
+ 20, 35,251,246,197,164,182, 82,104, 52, 26, 16, 66,112,230,204,153,199,151, 46, 93,242, 20, 10,133,154, 69,139, 22,177, 0,110,
+212,120, 71, 31,121, 36,202,177,249,192,206, 27,191,223,124,208, 63,176,173,187, 71,125, 15,113,123, 87, 75,232,244, 70,164,103,
+100,227,114,232, 67, 77, 76,212,189, 20,170,211,189,159, 17, 85,115, 22,119, 0,136,138,162, 58, 0,211,125,125, 45,190, 94,253,
+227,174, 45, 59,247, 28, 28, 56,126,196, 32,190,127,139,110,136, 11, 61,130, 43, 55, 46, 26,114,213,244, 72,161,128, 55, 41,234,
+105, 65,110,109, 43, 94,163,209,104, 9, 1,197,127,178,175, 83,141, 70,163,173,203,249,248,226,147,159,127,254, 25,169,169,169,
+154,132,132,132,189,148,210, 31, 83, 83, 83, 77, 78,159,176,145, 82,237, 32, 66,206, 47,232,216,177,215,130, 51,103, 36, 67, 62,
+253, 84, 59,240,253,247,103, 67,163,209, 65, 36,162,124,153,140,129, 88, 44,120,120,237,154,217,134, 73,147,108,136, 86,123,238,
+ 87, 74, 77, 14,193,255, 29,179, 8, 95,136, 96, 97,244, 39,159, 65,245, 66, 4, 43,236,118, 12,106, 19,193, 2,128,212,212,212,
+ 68,103,103,231,182, 75, 55,108, 60,220,187,109,235, 38,141, 20,206, 98,219,250, 30,144, 59, 57, 33, 39, 43, 11, 55,239,197,234,
+191, 63,127,249,129, 74,173, 30,100,106, 94, 24,150,101, 43,102,185,249,126, 58, 23, 12,143, 87, 97, 4,202,147, 6, 90, 4,118,
+ 4,225,243, 97,164, 20, 58,157,174,198, 65, 88, 74,165, 50,217,197,197,229,253, 79, 63,253,244,194,111,191,253,198, 4, 5, 5,
+181,252,243,207, 63, 95,107,209,220,228,228,100,215,178,110,173, 2, 11, 11, 11,254,152, 49, 99,160,215,235, 81, 82, 82,130,252,
+252,124,100,103,103,107,102,204,152, 33, 6, 0,161, 80,168,239,213,171, 87,141,215,143,181, 7,146,213, 51,135,184,110,180,225,
+199,127, 88,144, 21, 81,223,134, 31,255,188,109, 51,118,227,218, 3,201,234,175, 63,179, 90,154, 21,127, 57, 38,181,248,204,143,
+ 59, 14, 31,226,141, 26,248,190,209, 85,254,100,158,196,129, 30,236,218,191,198, 70,232, 47, 73, 69,235, 26,185,122,149,172, 7,
+244,174,103, 71,235, 21, 93,134,180,158,191,116,214, 90,185,131,131, 61, 12, 70, 3,158, 39,198,225,151,195,155,138, 11, 53,185,
+203,178,163,232, 29, 83,180, 60, 61, 61,235,243,120, 60, 28, 61,122, 20, 0, 54,149,189,188,233,244,233,211, 67,135, 13, 27, 6,
+119,119,119, 95, 15, 15, 15,113,117,105, 52, 42,139,222,233,245,122,188,233,117,173, 9, 33,207,182,108,217,226, 98, 99, 99, 67,
+174, 94,189,106, 96, 24,230, 88,109, 53,156,156,156,190, 59,113,226, 68, 39, 74,105, 47,127,127,127,184,187,187,151, 93, 79,163,
+112,245,234,213, 61, 41, 41, 41,163,223,208,226,206,148, 16,130,130,130,130,242,129,118, 58,185, 92,254, 86, 46, 26,157,146,146,
+178,211,209,209,241,204,226,197,139,191,106,208,160,193,196,241,227,199,243,188,189,189,145,159,159, 15, 11, 11, 11, 40, 20, 10,
+164,164,164, 96,231,206,157,198,140,140,140, 95, 24,134,249, 90,169, 84, 42,235,170,105,109,109, 13,103,103,103, 36, 39, 39,151,
+107,110,211,235,245, 75, 50, 51, 51,211,193,241,102, 13, 86, 90, 90, 90,150,147,147, 83,211,159,127,254,121, 67,105,154,134,210,
+168, 86, 97, 97,225,244,180,210, 17,227,181,226,248,241,227,177, 0,130,250,245,235,215,224,224,193,131,219,118,239,222,221,121,
+192,128, 1, 24, 58,116, 40, 12, 6, 3,122,247,238, 61,250,213,168,149, 41,164, 71, 30,137, 34, 65, 65, 77,239,220,188, 50,242,
+238,157, 27,253, 40,165,126, 0, 8, 97,152,255, 44,246, 28, 85,251,197,158,163,162, 10,114, 1,124,224,239,106,225,181,108,211,
+174,237,102,124,182,163,202,192, 92, 83,105,152,113,119,147, 11,234,188,192,104, 89,230,245, 85, 12, 67,230,148, 62, 55,109,105,
+152, 42, 52,230, 2, 0,159, 47,216,119,231,206,157,249, 9, 9, 9, 41,166,204,240,170,140,195,148, 38,142, 36,228,236,108, 63,
+191,110,253,102,204, 16, 4,244,232, 97,110,227,230,198, 82, 74,141,207,111,222, 36, 97, 71,143, 10,194,142, 30,149,232, 53,154,
+ 11, 7, 40,173,213, 12,168,191, 99, 22, 97,121, 4,171,129,151,235,217,193,131,250,244,240,170,175, 0, 0, 60,123,174, 68, 86,
+ 78,254,217,218,230, 26, 42, 55, 89,132,144,192, 63, 13,134,161, 2,129,160, 31, 41, 75,197, 64,235,176,216,179,209,104, 76,110,
+219,182,138,205, 91,180,178, 42, 67,150,110,226,133, 55, 68,161, 80,124,212,190,125,251,149, 74,165,242,112,102,102,102,241, 27,
+186, 46,244,222,189,123,247, 73,150,101,205, 94,137,112, 21, 40,149, 74,243,178,134,212,253,244,233,211,123, 8, 33, 53, 26,248,
+181, 7,146,213,107, 22, 52, 59,162, 86,197, 15, 36,242,146, 35,107, 55,148,206,106, 89,180, 46, 47, 31,192, 79,211, 6,218,176,
+209,225, 63,173,118,177,120, 50,103,195,145,156, 95,106,210, 99, 24,230, 73,155, 54,109, 42,140, 86, 13,245,175,172, 75, 5,196,
+ 93,203, 93,105,235, 71, 46,125, 60,119,240, 55, 90,157,174, 5, 67, 64, 5, 66,225,253,188,188,172,133,166,154,171, 50, 99,241,
+195,172, 89,179,166,199,198,198,238, 41,207,121,167, 84, 42, 67, 21, 10,197,119,137,137,137, 83,146,146,146, 54, 37, 37, 37,153,
+108,174,228,114,185, 90,165, 82,177, 6,131,129,209,104, 52, 16,137, 68,186, 55,213, 24, 20, 23, 23, 15,223,188,121,243,207,122,
+189,190, 9, 33,228, 88, 94, 94, 94,173,179,222,134,135,135,235,125,125,125, 7,156, 56,113, 98,250,131, 7, 15,102, 58, 58, 58,
+ 58,166,167,167, 39, 36, 38, 38,174, 72, 75, 75,251,233, 13,153, 43,132,135,135,139, 3, 2, 2, 52, 47,212,139,197,219, 50,222,
+170,210,246, 45, 61, 61, 19,192, 84, 87, 87,215,245,179,103,207, 94,214,162, 69,139,193, 99,199,142, 37, 82,169, 20,251,247,239,
+ 71,124,124,252, 17, 74,233,252,218,116,233, 86,165,105,102,102,134,253,251,247,211,248,248,248, 3, 12,195, 44, 80, 42,149,255,
+138,133,180,255, 14,200,155,190, 11,170,109,248,180, 95,191,126, 13,178,178,178,182,105, 52,154,119, 0, 20, 71, 68, 68,152,255,
+183, 67,178,213, 17,228,107, 47, 11,137,170,185, 33, 51, 85,243,213, 1,234,117,209,172,141,134,169,154, 85, 45,246,204,106, 52,
+ 74, 91,131,225,206, 70, 74,181,166,106,186,184,184, 44,129,137,249,162,202,136, 78, 73, 73,249,170, 46,245,217,168, 81, 35,250,
+244,233, 83, 80, 74,201,155,220,239,127,199,177,244,111,210,220,185,206, 79,209,184,185,207,236,200,240,232,111,203,186, 15, 43,
+248,122,154,141,121,199,174, 65, 11,175, 93, 12,249,102,209,198,151,187, 56,223,134,109, 39,132, 48,149, 25,139,242,228,158,181,
+213,172, 87,175,222,143,254,254,254,227,238,222,189,251,115, 98, 98,226,248,127,234,182, 19, 66,136,187,187,187,168, 54,209, 57,
+238, 60, 50, 77,211,201,201, 41,144, 97,152,133,101, 55, 28,203,146,147,147,111,189, 65, 77, 35,165,116,105,106,106,234,221,255,
+239,109,255,215, 69,176,254,110,202, 35, 90,239,190,251,174, 3,143,199,251,199, 47,210,105,138,185,170,109, 20,234,159,160,241,
+ 42,101, 6, 42,244, 77,104,189,106,150,254, 78,158, 60,121, 66,184,211,250,159,199,200,207, 34,148, 0,102, 4, 86,146,154,170,
+204, 84,205,238,242,238,219,185,237, 85, 69,109,234,186, 16,115, 98, 98,226, 68,133, 66, 49,179, 54,179, 15,255, 75,219, 77, 1,
+104,184,163,255,205,147,150,150,118, 7, 64,255,127,186, 38,103,176,254, 33,252,249,231,159, 25,220,238,224,224,224,224,168,153,
+127,186,185,226,224,224, 40, 29, 32, 29, 92,197,221,135,201,161, 63, 66, 72,112, 29,238,110,206,115,154,156, 38,167,201,105,114,
+154,156, 38,167,249,239,210,252,215, 80, 62,139,233,239,120, 0, 8,230, 52, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252,
+183, 61, 24,206, 98,114,252,221,124, 63,136,184,124, 63,136,184,252, 93,159,231,224,224,224,224,224,248,167,193,127,219, 54, 40,
+ 48, 48,208,151, 82, 58,156, 16, 50,184, 44, 66,119,144, 16,178,251,206,157, 59, 38,101,160, 53, 51, 51, 75, 87,171,213, 14, 0,
+ 32,145, 72, 50,212,106,181,211,139,209, 82,224, 47, 75,100,208,210,159,169,122,192,170,167,167,103,186, 70,163,113, 48, 33,154,
+120,153, 16,114,133, 97,152,203,117, 73, 47,208,181,107,215,209, 60, 30,111, 25, 0, 24,141,198, 47, 47, 94,188,248,219,223, 85,
+207,132,144, 54,110, 10,167, 95,117,122,157, 33, 61, 51,103, 33,165,244,104,101,159,219,220,159,172,224, 19,204, 46,251,127,205,
+228, 99,180,218,169,223,181,253,124, 53,229, 11, 20, 8, 4, 83, 29, 29, 29,123, 39, 39, 39,223, 1, 48,135, 82, 90,227, 49, 96,
+229,226, 59, 82, 32, 16,140,208, 27,141, 94, 2, 30,239,153, 94,175,223,149,151, 18,181,147,187, 84,112,112,112,112,112,252,109,
+ 6,171, 93, 35, 91,111, 66,117,179, 5,132,118,210, 83,114,149, 18,225,154,176, 39,217, 49,175, 83, 0,133, 66,225, 70, 8, 9,
+162,148, 54, 97, 24, 38,146,101,217,179,181, 93,236, 56, 32, 32,192, 13,192,135, 0,134,181,109,219,182,217,164, 73,147,208,176,
+ 97, 67,168,213,106,220,186,117,107,222,174, 93,187,230, 5, 4, 4, 60, 0,176, 7,192,222,240,240,240,164,170,180,212,106,181,
+ 67,185, 87, 34,132, 56, 12, 30, 60,248,214,139,166,170,108,113, 89, 66, 41, 13, 35,132,132, 26,141,198, 27, 7, 14, 28, 72,242,
+ 33,164,205,132,250,194,131,211,227,180,174,175,106,106, 52, 26,135,227, 51,167,128, 82, 22,234,236, 44,116, 88,185,161,226,189,
+ 83,189,218,130, 49,234, 33, 18, 11, 47, 7, 29, 11,187, 2,224,114,217,163,214,240,120,188,101,167, 79,159,118,166,148,162,103,
+207,158,203, 0,252, 45, 6,139, 16, 34,110, 27,216,226,210,177, 67,123, 36, 69, 57,233,232, 53, 96,232, 46, 66,200,104, 74,233,
+161,151,204, 82, 31,226, 72,248,152, 61,105,249,110, 30, 0,108,158, 63,124,206,250,158,100,227,140, 51, 52,205,197,197,165, 11,
+165,116, 78,153,222,234,148,148,148, 75,155,251, 16, 71,240, 48,119,210,242,221, 4, 0,182,204, 31, 62,123,115, 31,178, 97,242,
+201,218,205,146, 36,132, 76, 30, 61,122,244,198,101,203,150,241,156,157,157,145,146,146,210,203,215,215,215,155, 16,226, 75, 41,
+173,114,112,176, 77, 61,191,125,189,122,245,246,252,112,200, 32,169,189,157, 53,146, 83,179, 44,126,223,181,123,130, 77, 61,191,
+222, 57,137, 17, 67,185,203, 5, 7, 7, 7, 7,199, 27, 51, 88,205,154, 89, 90,153,169,232, 76, 51, 33,253,176, 87, 27,223,250,
+253,187,183, 39,158,158,158,136,121, 28,227,117,233,250,237, 49, 93,124,204,159,171,116,100,175,202,140,172,125,240,160,250,245,
+195, 70,251, 19,189,222, 88,250,155, 66, 62,140, 23, 51, 93,143, 4, 7, 7,215, 31, 59,118, 44,252,253,253,113,231,206,157, 46,
+ 7, 14, 28,152,238,230,230,118, 91,175,215,159, 20,139,197, 33, 53,229, 80, 9, 8, 8, 88,233,226,226, 50,103,214,172, 89, 36,
+ 48, 48, 16, 98,177,184,226, 61,185, 92,142,110,221,186,161, 91,183,110, 72, 79, 79,111,118,233,210,165,102,187,119,239, 94, 17,
+ 16, 16,176, 58, 60, 60,124,158, 41, 21,180,112,225,194,192, 74, 94, 62, 77, 8,137, 53, 24, 12,247,252,252,252,146, 26, 19,210,
+112, 98,159,246,231, 38,119,104, 36,171, 38, 58,133,219,203, 74, 87,215,120,209, 96,209,146, 66, 8, 44,204, 47, 11,228,242,191,
+152,171, 38,132,180,104,107,205,252,250, 83,142,209,175, 22, 38, 11, 73, 73, 73,176,180,180, 52, 11, 10, 10, 74, 37,132, 44,190,
+116,233,210,182, 55,124,220,180, 89, 60,123,178, 48, 55, 62, 2,105,143,194, 48,115, 72, 71,233,140,239,255,252, 6,192,161,234,
+141, 15,195,252,246,204,110,222, 12, 96, 58,203,178, 11,163,163,163, 59, 3, 64,147, 38, 77, 68, 0, 46,237,120,106,221,103,116,
+147,252, 58,167, 89, 32,132, 8,121, 60,222, 15, 59,118,236,248,100,228,200,145, 72, 72, 72,192,181,107,215, 32,151,203,177,100,
+201, 18,143, 89,179,102,173, 0, 48,189,170,200, 85,207, 94,125, 60,183,124,187,192,183, 48, 39, 95,179,245,135,253,183, 21,205,
+ 26, 51, 51,166, 77, 49,215, 26,116, 78, 86, 46,190, 35,185, 72, 22, 7, 7, 7, 7,199, 27, 49, 88,157, 26,202,110, 13, 12,104,
+ 16,208, 63,184, 61,211,168,177, 47,132, 18,105,197,123,205, 91,250,163,121, 75,127, 50,126, 76,161,231,253,251,247, 23,156,190,
+124,115,126,167,134,178,240,171, 79,139, 91, 87,165,167, 55,130,191,123,247,110, 0,192,119,159, 15,231,253,112, 53,166,254,139,
+ 11,198,118,238,220, 25,157, 59,119,102, 86,172, 88,209,230,210,165, 75,109,246,238,221,171,115,113,113, 89,159,146,146,114,160,
+154, 98,206, 57,112,224, 0,225,241,120,224,241,120, 85,126,200,209,209, 17,221,187,119,135,179,179, 51,249,252,243,207,231, 0,
+168,212, 96, 73, 36,146, 12, 66,136, 3, 0,216,216,216, 24, 23, 47, 94,124,143,210,138, 30, 64, 74, 41, 13, 99, 24,230, 6,203,
+178, 55,143, 30, 61,154,220,148, 16,135,126, 1,141,175, 78,254,104,176,148, 30, 92, 95,165, 57,208,228,229, 84,250,186, 72, 38,
+189, 44,146,201,174,136,205,204, 94, 50, 87, 77, 9,113,109,219,184,254,217,205,159, 13, 55, 55, 49,138,231,221,165, 75, 23,137,
+209,104, 68,113,113, 49,182,108,217, 98,105,102,102,102,217,187,119,239, 69, 0, 42, 12,150, 47, 33,205,223, 87,240,198, 47, 78,
+ 49, 76,169,131,129,177,234,212, 46, 48,254,251,149,139, 44, 2,219,118,194,147, 75,191, 35, 39,167, 16,249,121, 69,120, 53,235,
+ 55, 0, 76, 62, 73,211, 55,247, 39,107, 54,127, 49,124, 46, 97, 24,210, 98,224, 28,244,244,166,211, 20, 10,197, 67, 66,136,160,
+124,249, 24, 66, 8,223,213,213, 85,225,237,221,114, 77,163,158, 62,216,242,229, 71,160,165,139, 52,174, 49, 53,122, 69, 8,113,
+ 48, 55, 55, 63,122,246,236,217, 54,173, 90,181,194,141, 27, 55, 16, 23, 23,135,201,147, 39,107,167, 76,153, 34, 28, 53,106, 20,
+153, 57,115,230,167,132,144,131,148,210,235,175,126, 95, 32, 16,140,248, 96,208,123,162,162,188, 2,181, 86,163,211,218,216, 89,
+177,154, 98,117, 73, 86,110,129,250,163,225, 35,180,247,238,132,143, 0,240, 23,131,245, 58,245,201,193,193,193,193,241, 47, 53,
+ 88, 18,158,177,213,226, 61,247, 97,204,137, 5,205, 79, 4, 45, 78,251,203,103,164,118,110,240,105,231, 8,169,149, 61, 19,249,
+104, 93,171, 87,162, 54,213, 78,213, 44, 55, 87, 91,135, 43,154, 22,231,166, 10, 1, 64,102,237,172, 27,191, 43,229, 97,171, 86,
+173, 96,111,111, 47, 12, 13, 13,157, 9,224, 64, 53,154, 68, 27, 25,142, 71,253,218,163,193,163, 28, 72,165, 82,136, 68,162,151,
+ 62, 16, 19, 19,131, 43, 87,174, 32, 49, 49, 17, 94, 94, 94,192, 43,227,168, 94,212, 84,169, 84,142,189,122,245, 10, 89,189,122,
+117,231,239,190,251,238,193,142, 29, 59, 58, 87,213,173,228, 75,136,172,133,135, 83,200, 55,159, 79,176,166,167,126,101, 74,178,
+ 51, 32,172,162,156,237,151,173, 69,251,101,107, 1, 0,251,125,157, 33,177, 48,135, 68, 46,191, 28,124,230,206, 95, 34, 87, 1,
+132, 88,120, 57,219, 94,220,180,120,186, 12, 23,247,137, 48,110, 73,181,245, 25, 16, 16,224, 29, 20, 20, 20,186,116,233, 82,171,
+164,164, 36, 92,191,126, 29, 30, 30, 30, 40, 41, 41,121,105,189, 50, 95, 66, 28, 91, 55,118, 63, 59,127,214, 24, 75, 0, 83, 76,
+217, 71, 47,153, 16, 30,239,155,111, 23,207,177,176, 20, 83,196, 94, 63,130,184,216,231,184, 21,245, 92,191,243, 92,132, 81,171,
+ 55,142,173,172, 62, 39, 31,163, 95,204,234, 38,254,245, 78,161,215,177,126, 93,166, 52, 90, 58,204, 17, 58,157,110,123,102,102,
+ 38,198,143, 31, 15,150,101,209,177, 99,199, 14,148,210,148,105,211,166,193,203,203, 11,219,206,196,148,240,115,110, 6,237, 10,
+ 45,184, 99,202,177, 68, 8,105,230,238,238,126,246,210,165, 75,142, 46, 46, 46, 8, 9, 9, 65, 90, 90, 26,156,156,156, 48,101,
+202, 20,209,202,149, 43,119, 20, 20, 20, 12, 89,182,108,153,228,193,131, 7,123, 9, 33,110,101,166,185, 66,211,200, 26, 21,158,
+ 30, 10,249,161,189,103,238, 91,155, 75, 81,207,203, 77,200,147, 91, 24, 41, 72, 73, 61,103,123,161,145, 53, 42, 42,217,255,175,
+ 85,159,166,194,105,114,154,156, 38,167,249,111,208,252, 87, 25,172,114,116,113, 33, 16,249, 14, 2,216,166,160,185,177, 96, 11,
+ 82, 64,165, 14, 40,102,205,144,165, 76,192,163,171, 7, 64,117, 53,231,189, 19,240, 96, 88, 48,101, 56,223, 74, 2,136,204,237,
+117,133,133,133,144,201,100, 40,206, 77, 21,206,250,182, 34,178, 37,188,116,233, 18,194,195,195,161, 80, 40, 76, 42, 35,213,150,
+246, 34,106,181, 90,104,181, 90,164,245,105, 13, 89,219,119,144,251,209, 20, 92,184,112, 1, 25, 25, 25, 16, 10,133, 16,137, 68,
+ 48, 24,106, 78, 22,207,148,173, 26, 91, 30,181,170,236, 51, 65,132,240, 93,109,228,199, 54, 47,154, 94,159, 9, 59, 46, 80, 37,
+ 62,133, 82,109,132,149, 9,245, 41,150,203, 32,146,154, 93, 22,201,101,149,153, 43,129, 76, 46, 57,246,235,210,153, 78,188,187,
+ 23, 36,170,167, 17, 21,166,237, 69,186,119,239, 62, 1,192, 34, 74,105, 94, 80, 80,144,227,178,101,203,172, 83, 82, 82, 16, 21,
+ 21,133,253,251,247,103, 26, 74, 55,148, 80, 74,191, 6,128,118,132, 72,234,217, 91,157,217,244,213,116,115, 92,218, 39,194,199,
+181, 79,174,110,217,164,255,137,247, 71, 77,154,178,113,122,127, 20, 23,170,176,251,220, 93,156, 14,143,125, 23,192, 53, 74,105,
+149, 25,238,191,187,160,121,234,226,226,210,109,220,184,113,247, 14, 31, 62,108,247,237,183,223,194,104, 52,194, 96, 48,192, 96,
+ 48, 84,252,111, 52, 26,177,103,207, 30, 92,187, 19, 53, 77,169, 44, 48,105,189, 55, 66,136,162,126,253,250,231,111,222,188,105,
+ 47,149, 74,113,238,220, 57,228,229,229, 85, 68,174, 70,143, 30, 77,242,242,242, 62,220,178,101,203,251,241,241,241,223, 94,189,
+122, 53, 27, 0, 15,128,225,229,125,206,143, 53, 24,244, 62,206, 77, 26,242,135,244,239,212,169, 40, 59, 2,114, 91, 63,132,221,
+143, 61,150,155,155,167, 98, 24,126,236,139,159,127, 19,245,201,193,193,193,193,241, 47, 55, 88,234,251,187,160,137,220, 7,161,
+ 87, 23,136,154, 14,133,192,181, 29,146, 34, 67,112,239,228,119, 72,126,120, 13,148, 53,194,209,163,230,165,230,126,187, 75, 5,
+ 10,133, 34, 92,169, 84,226,238,221,187,136,141,141,133, 68, 34,249,203,231, 46, 92,184, 0, 0,112,114,114, 50,105, 35, 68,129,
+237,225,118, 63, 21, 73, 45,156, 1, 0,110,247, 83, 1, 0, 43,230,207,135, 80, 40,132, 80, 40,172, 88, 20,214, 20,131, 69,202,
+ 62,204,150,118, 83,209,202,222, 15, 20, 11,118,239, 93, 52,181,181, 56, 62, 82,164,121, 16, 6,165,134,165,199,210,141, 39,124,
+ 77, 49, 88, 82,233,101,145, 92,126, 69, 40,147,189,100,174, 0,128, 10, 4, 59,127,255,122,170,159, 44,253,153, 76,125,251, 2,
+ 82,213,172,206,162,114,153,175, 79,157, 58,229,192,231,243,157,140, 70, 35, 18, 19, 19,241,240,225, 67,108,216,176, 33,189,176,
+176, 48, 40, 60, 60, 60,230,133,242, 50,173,204, 68,251,119, 46,153,238,201,143,184, 44,209,196, 62,168,212,180, 85,135,125,243,
+129, 61,223, 13,106,113, 98,194, 71, 95,226,189, 62, 61, 48, 42,200,151, 62, 87,230,168, 1,156,163,148, 26,107,250,126, 74, 74,
+ 74,138,139,139, 75,247, 65,131, 6,237,106,218,180,105, 19, 74, 41,124,124,124, 48, 96,192, 0, 28, 58,116, 8, 81, 81, 81, 40,
+ 44, 44,212, 93,189,122,117,189, 82,169,252,197,148, 50, 17, 66,164,214,214,214,167, 47, 94,188,104, 47,149, 74,113,246,236, 89,
+168, 84, 42, 56, 59, 59,191, 20,185, 90,177, 98,133,228,249,243,231,155,206,156, 57,227, 1,128,169,108, 33,108,157, 65,179,237,
+151, 29,123, 55,206,252,116,156,203,197, 27, 81, 23, 52, 69,133,150,238,238, 73, 5,246,214,114,243,101, 43, 86,213,211, 25,180,
+ 19, 42,175,207,144, 58,213, 39, 7, 7, 7, 7,199,191,220, 96,149,119, 49, 81,214, 0,237,211,115,208, 62, 61, 7, 89,151, 5,
+ 56,186,124,196, 75,159, 51, 26,245,117, 42,128, 90,173,134, 80,110,171,251,238,243,225, 66, 0, 96, 5,178,138,213,225, 89,214,
+180,133,215,107,179,164, 87,109, 12, 86,153,238, 95,204, 67,125,177,252,242,182,207,134,180,181, 53,150, 8,180,215,142, 33, 69,
+195, 26,190,125,170, 43,185,157, 71, 87,207,175, 66,243,120,247,214,208,231,102, 65, 98, 46,187,220,235,210,131, 74,103, 11,214,
+151, 88, 92,216, 63,115, 88, 71, 39, 33,132,218, 19, 7,160,212,176,154, 31,227,245,191,108,168, 98,155, 41,165,136,139,139, 67,
+ 73, 73, 9, 66, 67, 67,113,232,208,161,204, 87,205, 85, 89,121, 67,126,158, 51,162,141, 69, 97,154, 80,123,251, 60,148, 26, 86,
+227,109,138,169,242, 27,216, 65,200,144,179,132,225,153,245,233,228,139, 25,227, 6, 98,221,207,127, 26,180, 14,157,250,109, 60,
+122,242,131, 34,141,110,190, 41,230,234, 5,147, 21, 1,192,215,195,195, 67,108, 48, 24,186,244,239,223,255,100,159, 62,125, 16,
+ 22, 22,134,243,231,207, 55,210,233,116,169, 0,160, 80, 40,150, 0,112,100, 24,102,117,114,114,242,179, 42,246, 17, 35, 20, 10,
+247,158, 63,127,190,169, 66,161,192,249,243,231,161, 82,169, 48,105,210, 36,237,212,169, 83,133,163, 71,143, 38,249,249,249, 21,
+145,171,208,208,208,236,170,204, 21, 0, 20, 36, 63, 58,101,237,214,180,125,151,206,237, 6, 54,106,212,208,226, 89, 97, 65,134,
+ 84, 42, 49,187,116,249,170,240,230,141,155,155, 10,146,163,111, 85, 94,159, 23, 76,174, 79, 14, 14, 14, 14, 14,206, 96, 85,139,
+ 49,231,175,109,158,209, 80,247,117,154,219,205, 61,243,208,204,204, 12, 91,182,108,129, 84, 42,173,181,113, 42, 57,117, 4, 73,
+147,135, 87, 68,174,202, 35, 89,232, 53,250,181, 12, 22,203,178,161, 0, 94,114,121, 50,199,198,195,246,126,212,189,131,175,167,
+ 11,163,223,191, 1,201, 37, 6,245,162,199, 58,245,163, 66,250,110, 84, 37,131,167, 43,208,107, 33,145,149, 70,174, 42, 51, 87,
+114, 39,239,247,119, 12,235, 18,212,162,113, 3,198,176,111, 45, 82, 74,244, 69,243,162,117,186,103,197,244,112, 21,166,114, 81,
+143, 30, 61, 22,217,218,218, 74, 54,110,220,104,233,238,238, 14,131,193,160,125,213, 92,201, 28, 27, 15,219, 55,186, 87, 7,111,
+ 39,107, 70,127,240,123, 36,169,140, 37, 27,158,233,119,252,104,130,185,178,179,148,159,249,113,249,100, 51,169, 88, 0,181, 90,
+141,149,155, 15,226,236,245, 7,253, 50, 35,143,156, 1,112,166,174,251, 91,167,211,125, 18, 28, 28,188,110,246,236,217, 48, 24,
+ 12,248,240,195, 15, 17, 31, 31,127,246,233,211,167, 27, 92, 93, 93, 63,159, 60,121,178,194,222,222, 30, 19, 39, 78, 20, 2, 24,
+ 93,133,204,170,221,187,119,247,107,209,162, 5, 46, 95,190,140,188,188, 60, 56, 59, 59, 99,234,212,169,162, 21, 43, 86,236, 40,
+ 40, 40, 24,178,124,249,114, 73, 92, 92, 92,181,145,171, 23,201,163,249, 75,127, 90, 55,241,243,214,109, 59, 48, 79,159,198, 24,
+ 18, 91,119,102, 46,156, 63,121, 37,215, 65,188,227,165,250, 28,211,187,214,245,201,193,193,193,193,193, 25,172, 26,163, 67,198,
+194,191, 14,118,103,141, 38, 7, 50, 76, 54, 78, 70, 19, 53, 89,141,186, 38,195, 84, 43,131, 85, 54, 6,235, 52,165,244, 37,131,
+101,229,212,184,243,130,185,211,215,119,124,191, 23,147, 62,174, 29,242,138, 52,154, 57, 81, 6, 54,185,164, 6,115, 5,128, 49,
+234, 46, 11, 44, 44,174, 8, 95,153, 45, 8, 0,102,142, 13, 91,207,251,236,211,205, 93,135,245, 39,153,147, 58, 34, 55, 79,165,
+249,252,161,129,164,168,232,144, 40, 74, 47, 85,166,119,225,194,133,173, 0,182, 6, 5, 5,165,203,100, 50, 20, 21, 21,253,165,
+ 94,203,203,219,225,253, 94, 76,250, 39,109,144, 83,172,211,204,121,104,128, 82,197,238,173,201, 92,217, 91,153,159,249,113,217,
+100,169, 50, 57, 30, 66,161, 16,114,185, 28,231,174, 69, 34,243,193, 31,103, 94,231,128,115,117,117, 93, 60,109,218,180, 69,163,
+ 71,143, 70,110,110, 46,206,157, 59,135,174, 93,187,226,135, 31,126,112,191,120,241,226,186,246,237,219,131,199,227,225,220,185,
+115,208,235,245, 79,170,216,159, 3,199,143, 31,255,249,251,239,191,143, 91,183,110, 33, 53, 53,245,165,200, 85, 94, 94,222,135,
+155, 55,111,126,255,249,243,231, 53, 70,174, 94,196, 5,104,237,217,160,165,240,139,133,223, 65, 83,146,193,207, 76,185,113,249,
+194, 57, 26,230,158,147, 35, 5,144, 95,215,250,228,224,224,224,224,224, 12, 86, 37,238,197, 8,190,179, 31, 12,169, 17,255,121,
+233,149,217,132, 66,169, 28,172,177,102,227, 50,218,159,232,199, 52, 0,127,109,111, 6, 66,185,173,174,221,220, 51, 15,171,250,
+172, 92, 46, 55,181,139,208, 40,236,243, 62,175, 65,207,247,240,172,185, 19,168, 94, 87, 17,201,194,252,249, 47,153, 44,161, 80,
+ 8,173, 86, 11, 84,210,237,247, 10, 55, 9, 33,241, 0,194, 40,165, 52,192,219,235, 27,137, 76, 54, 38,208,175,129,221,140,201,
+159, 8,158,103,104,112,177,227, 23,121, 7, 87,205,149, 39, 81,249,148, 4,154,119,189, 6, 67,121,185,207,213, 71,127,137, 92,
+249,123,123,125, 41,145, 74,198,181,109,230,237, 52,111,230,100,193,243,116, 13,185,216,122, 78,193,161,213,115,164,113, 48,255,
+ 60,137,230, 94, 50, 97,251, 23,245,233,211,103, 17,165,148,178, 44,187, 16, 0, 94, 44,239,204,169,227, 4,207,210,212,184,208,
+241,203,220, 67,171,230,154, 39,161,250,242,218,251, 13,236,224,104,109,113,230,199,229, 83,164,169, 41, 9, 16,139,197, 48, 55,
+ 55, 71, 82,122, 62, 4,124,158,234,117, 14, 54, 15, 15, 15,113,155, 54,109,230,142, 26, 53, 10,209,209,209,152, 55,111, 94,170,
+ 82,169, 60,124,244,232,209, 73, 51,103,206,228,119,238,220, 25, 25, 25, 25,216,178,101,139,254,214,173, 91,203,211,210,210,214,
+ 84,122,208,242,249,159,124,243,205, 55, 84,169, 84,146,184,184, 56, 56, 59, 59,227,211, 79, 63, 21, 45, 95,190,188, 98,204, 85,
+109, 34, 87,229, 36, 39, 39, 95,110,212,160, 30,222, 61,181, 30, 6,189,230,114, 94,118,226,149, 71,207,114, 47,219,136, 68,179,
+ 58, 6,248,213,169, 62, 57, 56, 56, 56, 56, 56,131,245, 23,244,148,201,223,189,114,162,229,187, 35, 38,193,204,227, 29,104, 30,
+ 30, 0, 91,152, 6,182,176,212,192,136,100, 22, 48,183,115, 67, 81,137, 26,215, 30, 60,131,158, 50,249,213,234, 25,193, 95,250,
+195,127,102, 11, 90, 89, 89, 33, 63, 63,255,165,200,139, 84, 42,133, 66,161, 64, 65, 65, 1, 14, 30, 60, 8, 90, 67,100,136, 82,
+250,205,168, 81,163,190,154, 60,121, 50,211, 96,216, 88, 20,221,184,250,106, 52, 10,102,102,102,144, 72, 36, 72, 78, 78,198,227,
+199,143, 89, 74,233, 55, 53, 68,188,110, 26, 12,134,251,123,247,238, 77,110,228,229,218, 43,168, 85,235,105,243,191,152,103, 30,
+117,245, 44, 22, 46,223,196, 54, 12,236,153,191,114,207, 31,133,249,242,122,221, 74,148,143,238,213, 84,201,132,144,191, 38, 17,
+245,172,215,181,157,127,203,217, 11, 23,126,105,241,240,234, 57,124,181,250, 71,218,168, 69,112,254,234, 67, 71, 11,178,164, 30,
+ 61, 84,233,255, 25,243, 83, 29, 33, 33, 33, 91, 1,108, 45,127,254,106,121,231, 45,217,192,122,183,234,149,187,114,207,161,226,
+ 2,243,122,193,213,149,215,193,119, 80,123, 55,103,155, 51,223, 47,157, 40, 77, 75, 73,132, 88, 44,134, 92, 46, 71, 98,106, 30,
+ 22,173,223, 95,172, 99,217, 94,175,121,188,137,101, 50,153, 88,167,211,225,183,223,126, 67, 74, 74, 74,187,212,212,212, 68, 39,
+ 39,167, 31, 39, 78,156,184,177, 73,147, 38, 62,143, 31, 63,126, 82, 84, 84, 52, 37, 45, 45,237, 81, 85, 34, 86, 86, 86,237,236,
+237,237, 73, 88, 88, 24, 38, 78,156,168,253,244,211, 79,133,163, 70,141, 34,185,185,185,117,138, 92,189, 16, 93,235, 60,160,111,
+123,116,232, 62,233,178, 86,157,119,229,249,163, 29,151, 25,122, 93, 18,208,210,175, 78,245,201,193,193,193,193,193, 25,172, 74,
+201,228,171, 28,126,220,121,104,205,222, 3,135,199,141, 31, 51, 92, 18, 20, 60, 18,194,172, 72, 24,148,225,112,241,237, 8,202,
+ 55,195,173, 59,119, 17, 17,155,164, 46,209,241,182, 23, 8, 85,179, 95, 49, 22,193,213,229,202,200,207,207,135,135,135, 7,246,
+ 76,106,220, 84, 83,144, 33,172, 7,128, 73,177,212, 93,140,233,243,240,202,149, 43, 69, 0,182, 55,106,212,232, 64,117,154,119,
+239,222,253,186,101,203,150, 71,191,248,226,139, 21,141, 26, 53,234, 53,126,201, 15, 16,206, 24, 5, 85, 84, 4,164, 65, 67, 96,
+ 99, 99,131,236,236,108,220,186,117, 11,133,133,133,167, 41,165, 95,220,187,119, 47,178, 58, 77, 74,233, 13, 63, 63,191,228,122,
+245,234, 89, 57,200,205,126,153,244,241, 40,243,132,136, 27, 72,143,185,143,235,215, 98,114,119, 31, 58,154, 82,144,159,249,113,
+117,141,235,139,154, 12,195,188,100,174,188,189,237,228, 50,177,245,206, 41,227,199, 90, 36, 70,222, 66, 70,204, 61, 92,189,254,
+ 36,119,207,222, 35,153,217,217,233, 99,170, 50, 87, 53,213,103,101,229,189,113,245,113,238,222, 3, 71,146, 11,139,115, 63,169,
+172,188, 47,106,202,101,130,217, 71,127, 91, 42, 85, 38, 39, 84,152,171,132,212, 92,124,181,126,111,177, 74,171,239,149, 25,113,
+196,164, 72, 77,117,229,100, 89, 22, 6,131, 1,148, 82,136, 68,162, 2, 0, 40, 51, 83,221, 76,213,204,202,202, 10,137,143,143,
+ 31, 32,151,203, 43, 34, 87,249,249,249, 67, 86,174, 92, 89,171,200,213,171,229, 76, 78, 78,190,220,192,211,117, 85,234,208, 33,
+ 26,103,103,251,203,199, 78,221,142,116,144,155, 61,170,107,125,190, 41, 56, 77, 78,147,211,228, 52,255, 13,154,255, 42,131, 21,
+ 21, 69,117, 0,166,251,250, 90,124,189,250,199, 93, 91,118,238, 57, 56,112,252,136, 65,124,255, 22,221, 16, 23,122, 4, 87,110,
+ 92, 52,228,170,233,145, 66, 1,111, 82,212,211,130,220,154,126, 76,192,131, 97,248,240,225,124, 0, 16,241, 97, 88,219,175, 95,
+ 72,211,166, 77, 59,182,213,103, 8, 23,109, 44,141,108,125, 61,109,184, 48,228, 86,200, 1,177, 88,188, 53, 46, 46,174,192,148,
+141, 40, 51, 76,189, 91,181,106,245,206,231,159,127,190,170, 79,125,215,214, 3,219,119,129, 64, 32,192,173, 91,183,144,157,157,
+125,139, 97,152,185,119,239,222,189, 98,138, 94,100,100,100, 86,211,134, 30,211,109,204,132,179,167, 12, 31,104,159, 25, 27,133,
+228,232,187, 0, 0,141, 70,165, 79,141,185,220,162, 54,149, 92,190,112,179,175,175,175,208,168, 41, 26, 45,225, 91, 44,156,244,
+225, 0,135,236,231,143,144,244,176, 52,221,147, 70, 93,162, 75,138,185,232, 83,151,157,232,225,225, 33,150, 9, 48,161,210,242,
+106,213,250,180, 39,209, 45, 77,209, 41,209,104,151,127,189,110,103,143,165,179,199,136, 45, 44, 44, 16,254,224, 41, 22,174,221,
+ 83, 43,115, 85, 19,148, 82,232,245,250, 90,205,252,172,132,185, 45, 90,180,104,188,108,217,178, 70,101, 99,185, 94, 43,114,245,
+ 34,177,113,201,243,130,130,130,124,159, 62, 14,239, 98, 99, 38,220,245, 58,245,201,193,193,193,193,193, 25, 44, 84,111,180, 10,
+114, 1,124,224,239,106,225,181,108,211,174,237,102,124,182,163,202,192, 92, 83,105,152,113,119,147, 11,158,153,250, 99,191,221,
+165,130, 87, 95,243,245,245,149, 61,229,163,168,252,249,211, 28, 64,169, 84,174,174,203,198,220,190,125,251, 10,128, 54,254,254,
+254, 3, 79, 18, 50, 31,120, 6, 74,233,242,187,119,239, 30,169,141,142, 57, 31, 15, 58,250,122,185,116,242,111, 42,225, 25, 85,
+ 72,142,142, 69, 78,177, 26,231, 30, 38,228, 49,148,249,181,174,149,205,232, 74,238,119,242,109, 80,239,157,128,166, 82, 1,209,
+ 34, 57, 42, 28,249, 42, 45,206, 62, 76,200, 7, 33,117, 30, 40,253,166,202,155, 22,241,199,109,123,191,129,193,132,144,243,243,
+167, 14, 19, 47, 90,187,247,141,154, 43, 27, 27,155,146,180,180,180,108,181, 90,109,155,158,158,174,181,177,177, 41,169,163, 73,
+123, 74, 8,105, 62, 99,198,140, 37,159,127,254,249,236, 85,171, 86, 9,235, 50,230,170, 42,114, 83, 18,142,188,211,244,205,239,
+127, 14, 14, 14, 14, 14,206, 96, 85, 74,153,153, 10, 10,242,181,151, 93,123,156, 89,252, 38, 10, 16, 21, 21, 85, 60,218,159, 84,
+ 68,182, 4, 60, 24, 94, 87,179,204, 80, 29,169,179, 0, 67, 10,111, 60, 73, 40,186,249, 36,161, 8, 44,165, 44,165, 26,134, 65,
+ 82,177, 78,183, 60,230, 89,114,221,103,209, 17, 98,188,253, 52, 81,117, 39, 54, 73, 77, 89,150,178,148,106, 9, 65,154, 94,207,
+ 46,127,240, 44,254,232, 63,161,188,153, 17, 71,174, 59,249, 14,234,116,253,230,131,153,197,197,186, 77,153, 81, 71, 66,223,212,
+193, 22, 30, 30,174,119,118,118, 30,209,191,127,255,177, 44,203,254,152,146,146,162,175,171, 22,165, 84, 11, 96, 46, 33,228,112,
+100,100,228,254,208,208,208,212, 55, 97,174,254,214,253,207,193,193,193,193,193, 25,172,234, 8,137,122, 51,230,170,156,202, 34,
+ 91,255, 77, 34,159, 60, 15,248, 59,116, 31, 60,121,222,236,127,161,188,105, 81,135,239, 0,248,240,239, 40,107,106,106,234, 89,
+ 0,103,223,148, 30,165,244, 54, 33,164, 62, 0,222, 27, 49, 87,127,227,254,231,224,224,224,224,224, 12, 22, 7,199,255, 12,180,
+116, 64,151,129,171, 9, 14, 14, 14, 14,142,127, 10, 4, 64,112, 21,141,150,201,179, 3, 8, 33,193,117,104, 20,207,115,154,156,
+ 38,167,201,105,190, 37,154, 25,213,104, 62,168, 65,179,170,200,182,195,255, 80,125,182,172, 66,115, 85, 13,154,115,171,121,251,
+ 30,119,124,190,157,154,255,166,187,255,191,237, 1, 32,152,211,228, 52, 57, 77, 78,243, 95,160,217,140,171,207, 55,170, 57,151,
+171,207,127,159,230,219,246, 96, 56,139,201,193,193,193,193,241,183,117,147, 16, 34, 38,132,136,235,250, 62, 7,199,255, 42,181,
+ 30,131,213,186,117,235,134, 0,112,235,214,173,167,127,227, 9, 57,213,217,217,121,188,159,159, 95, 19,161, 80,200, 20, 22, 22,
+126,125,241,226,197,197,175,126,238,157,166,130, 59, 60, 6,174, 47,124, 19, 32, 60,128, 97, 96,164, 72,190,114,191, 36,144,219,
+197,255, 93,156,157,157,207, 72, 36, 18,119,150,101, 97, 96, 41,140, 6, 99,233, 95, 35, 11,189,145, 66,167, 85, 39,104,138,243,
+123,214, 73,187,229,160,122, 6, 35, 93, 9,176,155, 9,152, 73, 20,236, 22, 66,153, 73,148,193,102,194, 98, 34,248,250, 53, 48,
+ 8, 62,231, 11,249, 95, 42,195, 15, 36,189, 13,245,121,240,224, 65,222,235,124,127,240,224,193,149, 46, 19,229,239,239,127, 92,
+ 34,145, 52,168,234,123, 37, 37, 37,169,247,239,223,239,242, 54, 31,171, 78, 78, 78,239, 48, 12,243, 61,128,166,175,188,245, 8,
+192,116,165, 82,121,225,117,127,163,181, 84,202,183,227,241, 38, 8, 8,153, 3, 0,122, 74, 87,103, 25,141, 91,111,149,148,252,
+ 99,198, 16, 58, 56, 56, 92,225,241,248,141,138, 75,138,139, 11, 11, 10,188,204,205, 45,158,153, 73,165, 50,163,193,248, 36, 43,
+ 43,227,157, 90, 94,203, 39, 3, 88, 83,246,255,108, 74,233,230,218,188,207,193,241, 86, 27,172,128,128, 0,111, 0,157, 9, 33,
+157, 41,165,239,248,248,248, 56,150,148,148, 32, 32, 32, 32,157, 16,114,133, 82,122, 25,192,229,240,240,240,152, 55, 81, 32, 30,
+143,247,237,134, 13, 27,102,125,250,233,167, 21,139, 52, 71, 68, 68, 84,254, 89, 6,174,151,142,157,119,184, 29, 25,131, 86,193,
+131,203, 12, 22, 3, 20,167,162, 75,247,214,117,250,125, 27, 27, 27,115, 7, 7,135,175, 9, 33, 67, 24,134,169,177, 49, 99, 89,
+214, 72, 41, 61,144,145,145,177, 40, 39, 39,167,176, 54,191,213, 42,208, 79, 95,234, 8, 43,131, 26,111,223,137,168,118,118,165,
+143,143,207, 29, 30,143,231, 90,118,113,122,245,194, 86,233,255, 70,163, 49,249,225,195,135,129,166,214,133, 68, 42,157, 77, 24,
+126, 48, 40, 91,154, 4,149, 48,143, 40,107, 56,175, 46, 41, 89, 99,202,246,138,197, 98,247,240,187,247, 26, 69,197, 60,131, 87,
+253,122,208,234, 12,208,234, 12, 56,122,254, 22, 90,248,212, 71,255, 62,221,235,124,172, 24, 41,249,122,225,244, 17, 93,150,109,
+216,221,234,203,233,195,101,203, 54,236,110,245,229,140,225,242,101, 27,119, 7,126, 57, 99,132,124,233,198, 93,129, 11,102,140,
+176, 88,182,113,183, 14,192,199,117,249,141,143,155,187, 23, 51, 70, 67,165,119,215, 44,143,175,249, 57, 50, 65,246,223, 56,113,
+199,142, 29,235, 93, 92, 92, 28, 53,182, 95,235,111,154,120, 56, 86, 58,254, 39, 47, 59,221,225,201,131, 91, 11,249, 18,153,239,
+123,179,127,169,246,252, 20, 10,133,158, 87,174, 92,105,196,178, 44,140, 70, 35, 12, 6, 67,197, 95,173, 86,139,247,223,127,255,
+141, 76,136, 9, 12, 12, 28, 75, 41, 93, 86,122, 88,146,165,119,238,220,217,244, 26, 55, 98,114, 62,159,255,153, 72, 36,234,108,
+ 48, 24,154, 0,128, 64, 32,136,214,104, 52,151, 13, 6,195, 58, 74,105, 81,109,244, 24,134, 89,127,251,246,109, 95,185, 92, 14,
+157, 78, 87,177, 48, 60,143,199,243,105,211,166,205, 15, 0, 26,189,238,246,219,241,120, 19,218,119,236,184, 97,236,140, 25,188,
+220,219,183,241,253,246,237,235,145,155, 11, 0, 63,212,244, 93, 87, 87,215, 59,132, 16,215,218,252, 30,165, 52, 57, 57, 57, 57,
+176,118,215, 96,126,163,132, 36,165,131,187,155, 2, 0, 32,149, 74,101,183, 31, 60,119, 8,104, 90,191,214,145, 43, 0,107, 40,
+165,102,101,245,187,161,125,251,246,237, 8, 33, 6, 0,148,101, 89,134, 16, 50,140,101, 89,126,217,231,215, 16, 66,126,161,148,
+106,184,166,153,227,173, 54, 88, 1, 1, 1, 39, 1,116,246,241,241, 49,235,222,189, 59,252,253,253,225,238,238, 14,137, 68, 2,
+ 0,200,201,201,113,140,138,138,250,224,222,189,123, 31,132,133,133, 33, 32, 32, 64, 5,224, 90,120,120,120,165,209,136,224,254,
+157, 62,149,200,197, 27, 1, 32, 51, 57, 59, 53, 57, 46, 99, 99,106,106,234, 26, 74, 41,251,194, 9,233, 53,106,212,168,153,211,
+166, 77,195,241,227,199,177,103,207, 30,104, 52, 26, 20, 22, 22,226,226,197,139, 85,220, 90,103, 32,247,226, 74, 64,246, 28, 72,
+188, 12, 72, 29, 0,153,227,235,220,189,125, 61,116,232,208, 25,255,199,222,117,135, 69,113,181,223,115,103,182, 23,122, 95, 80,
+ 81, 16, 21, 84,164, 40,246, 30,187, 81, 99,139,189,151, 88,163,137, 49,198,196,154,216, 75,140, 93, 99,141,189,247, 22,123, 23,
+176, 34,130,130, 74, 89,122,103,217, 58, 59,243,251,131, 18, 36,148,133,248,125,201,247,203,158,231,153,103,119,103,102,207,220,
+185,115,231,222,115,223,251,222,247,250,248,248, 20, 69, 29, 55, 24, 12, 96, 24, 6, 6,131, 1, 25, 25, 25,152, 49, 99, 70, 97,
+229, 5,150,101,113,245,234,213, 41,179,102,205, 2,128, 47, 75,227,252,164,141,103, 48,143, 16, 55,246, 15, 81, 22,119,249,102,
+ 84, 32, 64,232, 71,193, 79, 72,233,226,171, 17, 93,113, 69, 72,187,133,134,134, 58, 10, 4, 2,147,238,141,101, 89,248,251,251,
+155,116,174,171,171,107, 59,153,220,114,255,103,131,198,216,248,249,251,241, 93, 93, 92, 96, 96, 24, 68,191,141,105,242,228,113,
+136,223,165,211, 7,199,186,186,186, 14,138,143,143, 47,119, 65,106,163,145,197,147,176, 72, 92,185,253, 24, 61,249, 98,168, 52,
+ 58,168,212, 58,236, 57,117, 23,113,201, 89, 85,126, 78, 65, 65, 65,174, 82,218,161,201,148, 81,189,101,203,127,217, 45,155, 50,
+170, 55, 86,172,223, 83,240,185, 91, 54,101, 84, 47,172, 88,191, 75, 62,101, 84, 47,252,188,113, 71,211,160,160, 32,215, 7, 15,
+ 30,196,151,197, 87,214, 51,162,140,140,104, 91, 88, 60, 13, 0, 41,155, 55,195,144,156, 12,197,188,121, 0,128,177, 62,174, 38,
+ 15,107, 52,104,208, 32,152,199,227, 85,216, 56, 50, 12, 19,247,252,249,243, 64, 83,196, 21,195, 48, 28,143,199,251,254,246,111,
+139,142,180,240,171,243, 65,102, 70, 68, 68, 88,253,240,195,247,253, 14,133,228,112, 3, 2, 44,194, 78,172, 24, 85,174,200, 98,
+ 89,150,210,106,181,136,140,140, 44, 53,202, 62, 69, 81,198,170, 60,167,182,109,219,138, 84, 42,213, 62,185, 92,238,171, 82,169,
+ 70,113, 28,247,195,245,235,215,157, 40,138, 66,199,142, 29,127, 8, 12, 12,124, 43, 22,139, 55,170,213,234,199,114,185,124,208,
+245,235,215, 77,106, 92, 9, 33,173, 45, 45, 45,247, 28, 63,126,220,198,223,223,159, 74, 77, 77, 69,205,154, 53,145,158,158,222,
+228,230,205,155, 1,163, 71,143, 30, 77, 8, 25,198,113,220,205, 74, 36,183,174, 84, 42,229,134, 15, 31, 78,140,198, 63,110,247,
+215, 95,127, 69,128, 75,146,231,132, 46,178, 60,141,142,203,250, 61,210,106,130, 64, 32,184,253,238,221,187, 74, 23, 96, 62, 33,
+179, 70, 77,159, 78, 11, 18, 18, 32,139,136, 64, 15, 66,120, 91,243,173, 89, 27, 76,184,103,183,213,235, 86, 56, 10,133, 66, 48,
+ 12, 83, 36, 2, 11,235, 40,131,193, 0,189, 94, 15,131,193, 0,163,209, 8,131,222,128,109,155,119, 84,249, 29,147,202,164, 82,
+103, 23,151, 36,137, 84, 38,253, 24,141,141, 72, 36,226,237,222,189,123,144, 80, 40, 4, 0,232,116, 58, 52,104,208,128,152,155,
+ 97, 51,254,141, 22,172,174,215,175, 95, 7,195, 48,176,176,176, 0, 77,211, 37,173, 27,104,221,186, 53,130,130,130,208,177, 99,
+ 71,188,122,245, 74,178,108,217,178, 50,205, 17,131,103,246, 64, 53,175,124,225, 99, 48,176, 46,119,206, 62, 94,250,235,162, 35,
+ 14, 0,102, 22, 55, 24,140, 31, 63,158,164,165,165,161,127,255,254, 55,181, 90,237,167, 28,199,149,185, 92,142,145, 69, 92,187,
+207,135,128,229,136,100,205,131,109, 68,167, 81,115, 20, 69,169, 11,135, 8,171,216, 43,238,175, 80, 40,112,224,192, 1,232,116,
+186, 63, 29,183,180,180,196,139, 23, 47,138,139, 28,248,249,249,209,132,144,254,101, 9, 44,138, 16,183,243,215, 95, 23,205, 8,
+ 26,248,169,159,160, 83, 27,207, 36, 30, 37,228, 0,144,239,190,251,174, 72,176, 1,192,130, 5, 11, 76, 78,175, 64, 32,192,171,
+ 87,175, 64,211, 52,222,180,200,239, 96, 55, 8,141, 5, 77,211,120,226,155,223, 3,109,254, 58, 19, 52, 77, 67, 46,151,155, 42,
+174,218, 58,185,184,157,248,118,222, 18, 11,141,129,195,217,171, 15, 17,163,188, 12,142,227,224,226,104,139,230, 1,254,252,250,
+ 13, 27, 57,254,186, 97,249, 9, 87, 87,215, 94,241,241,241,215,203,226, 50, 48, 70,120,123,213,194,238,227, 55,177,120,227, 81,
+164,101,171,145,147,151,159,175, 29,154,250, 96,123,213, 45,157, 43,234,186,187, 87,219,121,232, 2,154, 53,109,140, 93,135, 46,
+162, 89, 80, 99,228,255, 14,194,174, 67, 23,208,188, 89,254,103,125,111,207,234,233,239,178, 86,160,156,216, 94,127,122, 70,189,
+242,159, 81, 77, 90, 80,212, 0,188,155, 56, 17, 0,138, 4, 86,165, 94, 52, 30,207,237,241,227,199,142, 21,157,231,231,231,103,
+146,229,138, 97, 24, 36, 39, 39,147,204,204, 76,206,218,218,186, 95,113,145, 85, 40,174, 14, 6,103, 67,125,127, 61,249,237,212,
+ 13,118,200,167,109,194, 78,172, 24,229,211,175, 95,191,151,165,241,234,245,250,183,157, 58,117,226, 10, 26, 62, 87,161, 80, 40,
+ 40, 33,192, 20, 45, 90,180,248,147, 64,171,104,232, 80,165, 82,237,219,186,117,107, 31, 79, 79, 79,124,246,217,103,151,124,124,
+124,132, 82,169, 20, 23, 46, 92, 64,181,106,213,236, 45, 44, 44,206, 45, 89,178, 4,171, 87,175,174,126,233,210,165,253, 0,250,
+152,240,142,118,108,215,174,221,129, 51,103,206,136, 5, 2, 1,212,106, 53, 94,188,120, 1, 43, 43, 43, 8,133, 66,244,234,213,
+139,110,209,162,133, 93,219,182,109,143, 18, 66, 6, 85,102, 70,147, 70,163,225,230,204,153, 3,169, 84, 10,169, 84, 10,153, 76,
+ 6,153, 76, 6,137,128, 37,155,167,213,148, 76,221,154, 41,249,114,222,230,165,123, 54,206,191, 86,189,122,245, 31, 98, 98, 98,
+ 50, 43, 91, 22, 50, 30, 61,130, 44, 34, 2,154,224,224, 74,151, 35, 43,153, 45,102,207,158, 93, 81, 89,131, 64, 32, 64,243,230,
+205, 43,228,243,246,246,222, 76,211,180,195,135, 98,154,208,223,127,247, 45,243,252, 69,132, 76,111,228,100, 26, 45,131,197, 11,
+191,103,104,138,162, 27, 52,104,112,156,227,184,148, 23, 47, 94, 76, 48,193,122,166, 37,132,124, 77, 81,212,207, 34,145,136,231,
+238,238,254,254,251,239,191,191,151, 63,212, 0,112, 28, 71,185,187,187, 55,145, 72, 36, 53,180, 90, 45, 3,224,107,179,245,202,
+140,127,139,192,130, 92, 46,199,163, 71,143, 64, 8,129,133,133, 5, 44, 45, 45, 97,101,101,133,236,236,108,132,133,133, 33, 60,
+ 60, 28,239,222,189, 3, 33, 4, 30, 30, 30, 40,124,113,138,189, 96, 69, 21,219,190, 85,103, 32,150,139, 64, 8,224,223,222, 23,
+190,173, 27,160,241,195,168,105, 10,133, 98,171, 82,169,140, 36,132,240, 26, 52,104, 48,186,105,211,166, 88,189,122, 53,180, 90,
+237,234,210,196, 85,113,206,155, 47, 12,129, 0,160, 80, 40,190,218,123,225,141,116,104, 23,207, 60,165, 82,185,178,178,153, 80,
+178, 2, 78, 77, 77, 5,203,178, 38, 91,133, 50, 51, 51,203,229, 44,105, 17, 88,188,116,141,117, 78, 86, 18, 22, 45,219, 11,131,
+193,128,153, 51,103,130,101,217,162,173, 52,190,210,210, 89, 56,244, 71,211,244, 7, 2,184,162,223,229,113, 58, 56, 56,200, 68,
+ 98,233,254,175,190, 91,100,241, 52, 34, 14,103,174, 62, 4,199,113, 56,185,245, 7, 0, 64,175,113, 11, 17,159,152,138, 22, 1,
+245, 48, 98,194, 12,139, 53, 63,205,217,239,224,224,224,153,146,242, 71,240,217,226,156, 6,134,197,209, 11,247,160, 76,203,197,
+240,207, 58, 64,163,213, 35, 37, 57, 17, 59, 54, 44,199, 23, 35,142,194, 70, 46,113,246,240,240,136, 40,158, 71, 28,199, 17,129,
+ 64,112, 59, 34, 34, 98, 76, 89,233, 52, 24, 12, 93,191,157, 49, 22, 63,111, 59,138, 6,181,157,113,250,242, 93, 4,214,175,129,
+243, 87, 31,162,105,195,154,184,120, 35, 4, 77,125,107,225,198,253, 23,152, 62, 97, 24,190,158,118,187,107,101,158,209,143, 75,
+214, 88,231,100, 39,225,204,143,187,145,188, 97, 3,222, 79,158,140, 38, 5,231, 60, 36, 4, 2, 55, 55,192,162,226,252, 44,137,
+151, 47, 95, 66,171,213,150,214,187,135,183,183,119,133,207,168,208,114,149,148,148, 68,146,146,146, 32,147,201,200,203, 23,207,
+141,222,245, 27,244,227,194,143,108, 3,128,124,203, 85, 54,242,238,174,131,250,222, 47, 16,212,124, 74,109, 91, 56, 65, 55,246,
+135,205, 97,197, 26,183, 15,210,249,228,201,147,162,252,105,218,180,105,248,237,219,183,235, 22,150,175,130,161, 66, 1,195, 48,
+ 94,133,195,134, 12,195, 64,171,213, 98,208,160, 65,116,121,247, 46,145, 72,124, 61, 60, 60, 16, 18, 18,130, 9, 19, 38, 8,219,
+181,107,135,215,175, 95,131, 16,130,145, 35, 71,194,199,199, 7, 41, 41, 41,104,220,184, 49,110,221,186,229,103, 66,153,183,144,
+201,100, 59, 78,159, 62, 45,166, 40, 10, 57, 57, 57, 96, 89, 22, 45, 90,180, 0, 69, 81,120,254,252, 57,190,251,238, 59, 28, 59,
+118, 12, 39, 78,156,144, 4, 4, 4,236, 32,132,120,115, 28,151, 99,194, 51,226, 52, 26, 13, 39, 18,137, 32, 18,137, 32, 22,139,
+ 33, 22,139, 33, 20, 10,161,214, 83, 24,183,230,189,150, 22,219,179,245,253, 90,122,142,156,250, 19,181,242,251, 81, 87, 1,156,
+ 44,224,124,110, 74,125, 97,224,184,229,235,183,111, 95,215, 29,249, 19,140, 14,231,228,176, 6,142, 91,110,202,187, 9, 0,185,
+154, 44,212,240,112,195,209,131, 39,208,119, 96,239, 82,197, 21,159, 47,128,128,207,135,165,173,172, 66, 78, 62,159,111, 31, 26,
+ 26,106, 93,188,126, 96, 24,230,229,148, 41, 83, 60,122,247,234,238,116,232,216, 25,122,232,192, 94, 70,103, 39,135,212,216,216,
+247,175, 1, 88, 7, 4, 4,112,166,150,121,142,227, 54,250,249,249,249, 31, 63,126,124,212,236,217,179,131,191,250,234,171, 69,
+197,143,175, 88,177, 98,225,185,115,231,106,244,233,211,103,207,227,199,143, 55, 22,251,223,178,143,221,216,253, 39, 66, 7,152,
+ 57,205,168,178,192, 42,222,248,100,103,103, 35, 59, 59, 27,177,177,177,216,188,121,115,193,139,204, 7,143,199, 3,143,199, 43,
+242, 87, 40, 11, 87, 78,223,250, 5,192, 47, 1, 1, 1,252,103,247, 14,159,159,181,117,106,135,192,142,254,116,200,239,207,250,
+ 1, 88, 12,160,235,240,225,195,237, 1, 96,247,238,221,169, 0,206,255, 29, 25,194,113,220,225,200,200,200,233, 46, 46, 46, 69,
+ 62, 40,197,135, 9, 25,134,129, 88, 44, 70,161,175,138, 86,171,197,190,125,251, 24,142,227, 14,151,151,127, 17, 47,174, 34,242,
+197,181,252,255,177, 44, 88, 99,254,255, 53, 26, 13,230,207,159, 95,124,234, 43, 38, 78,156, 8, 84, 98, 45,228,178, 44, 87,205,
+ 34, 51,192,227,241,112,171, 86,190, 18,232,150,194,253,201, 87,235, 79, 67, 24, 66,241,204,110,159, 13,177,101, 56,186, 72, 92,
+229,223, 67,190,224, 20, 10,120,144,136, 4,136,136,138,129,187,107, 0, 58,116,235,109,115,229,204,209,153, 0, 74, 53,187,233,
+141, 44,186,182, 13,192,134,131,215,145,157,171, 70, 86, 70, 58, 82, 98, 94,226,229,211, 71,224,241,120, 8, 14, 14,182,176,180,
+180,178,168, 85,171, 38,140, 44,139, 59,247,130,193,129,224,244,169,227, 30, 53,106,214,194,251,183,209, 99,202, 16,182,188, 22,
+129, 62,200, 77,139, 3, 77,211,104,238,231, 9,154,166,209, 42,176, 14,104,154, 70,203,198,117,193,227,241,208,182,169, 15,106,
+215,174,141, 66, 63,143,242,159,209,239,136,124,113,189,152,216,229,192, 1,208, 39, 36,252,185,161, 76, 72, 0,103,225, 88,217,
+178,133,111,190,249, 38, 51, 33, 33, 65, 95, 82,208, 41, 20, 10,193,177, 99,199,172, 43, 90, 4, 91, 38,147,249,240,120,188,176,
+244,244,116, 86, 42,149, 82, 44,107,100,189,235, 55,160,111,255,182,232, 72,225, 57, 11, 23, 46, 58, 50, 32,192,178,223,222,195,
+103, 56,129,123, 75, 66,248, 34,102,236, 15,155,133, 60,177,204,199,196, 78, 3,165,213,106,241,234,213,171, 10, 23,229,230, 56,
+174,220, 2,165, 82,169, 70,244,237,219,247,210,196,137, 19,197,132, 16,220,186,117,171, 72,240,211, 52,141,168,168, 40, 80, 20,
+133,173, 91,183, 66,171,213, 78, 52,193, 18, 56,253,232,209,163, 86, 66,161, 16, 57, 57, 57, 69,239, 13, 77,211, 8, 15, 15,199,
+202,149, 43, 49,124,248,112,196,196,196, 64,161, 80, 96,230,204,153,242,165, 75,151, 78, 7,176,208,132, 91,127,170,211,233, 2,
+165, 82, 41,196, 98, 49, 10,133, 22, 0,132, 36, 56, 61,143,142,142,110,104,111,111,239,236,112,227,204,169,230,237, 62,109,100,
+231,224,210,172, 80, 96,153,138, 24,131, 97,171, 82,165,154,219,127,199, 14,199,155,167, 78,177,207, 79,157,138,227, 25,141, 91,
+ 76, 46, 67, 6, 10,239,163,226, 16, 16, 16,128,144,144, 16, 4, 4, 4,124, 96,205, 22, 10,133, 16, 8, 4, 16, 8, 4,176,183,
+ 49,201, 85,130,163,105, 26,137,137,137, 31,236, 27, 55,110,220,251, 33, 67,134, 56, 2, 64,130, 50,142,251,114,250,148,248,212,
+212, 84,206,201,169,124,206, 70,141, 26,221,164, 40,202,189,132, 40,182, 25, 63,126, 60, 50, 51, 51,187, 77,156, 56,177,101,190,
+149,140,138,223,176, 97,195, 80, 0, 16, 10,133, 85, 30,130, 54,195,140,255,121,129,101, 10, 42, 18, 88,133, 8, 9, 9, 49,184,
+186,186,110,139,124,252,174,131,167,175, 7, 36, 50, 81, 39, 66,200, 47, 34,145,104,198,176, 97,195,112,255,254,125, 60,127,254,
+252,215,191,186,236, 73,195,134, 13, 47,138, 68,162, 26,165, 29,211,106,181,239,159, 61,123, 86,170,175, 88,114,114,242,188,135,
+ 15, 31,162, 60, 39,247, 1, 3, 6, 20,111,140,138,156,220,203,172,193, 88, 14, 6,189, 1,170, 60,245, 31,141,119,129,192, 82,
+169, 84, 24, 56,112,224, 7, 22,172,228,228,228, 42,221,115,101, 44, 87,101,129,162,233,206,190,141,252,249, 87,239, 62,253,160,
+113,237, 61,126, 49, 68, 2, 30,164, 34, 1,196, 34, 62, 36, 34, 1, 98,227,147, 80,175, 94, 3,193,141,139,103, 58,151, 37,176,
+ 12, 12,139,229,191,158, 5, 0, 28, 62,125, 21,129, 53,165, 88, 48,247, 27,244,239,223, 31, 66,161, 24, 71,143, 30,198,202, 13,
+187, 49,161, 70,254,163,106,210,216, 15, 43, 54, 29,192,162,133, 11,168,195,135, 14,183, 52,161,193, 5,143,199, 3, 77,211,127,
+250, 44,252,110,138, 53,146, 99, 57,232, 75, 62, 35,150, 3, 56, 14,110, 63,254, 8,183, 31,127,196,195, 2,113,234,163, 82, 65,
+173, 86, 3,109,125, 43, 37,174,116, 58, 29,148, 74,165,254,201,147, 39, 78,165, 52, 76, 73, 58,157,174, 66, 65,179, 99,199,142,
+136, 81,163, 70,249,216,218,218,134, 61,125,242,196,224,219,168, 17,191,164, 15, 86,157, 58,117,178, 22, 46, 92,116,100,104,255,
+ 30,253, 54,127,251, 57, 51, 97,225, 30,158, 41,142,238, 69,162, 88,175,127,219,177, 99, 71,147, 36,190, 90,173, 78, 44,235, 88,
+ 96, 96,224, 40, 66,200,143,117,234,212, 17,181,107,215, 14, 55,111,222,196,143, 63,254,200, 50, 12,147, 10, 0,205,155, 55,119,
+ 88,180,104, 17, 9, 11, 11,131,181,181, 53,146,147,147,119, 5, 6, 6, 46, 42,207,241, 93, 40, 20,182,109,220,184, 49,165,213,
+106,255, 36,174,150, 46, 93,138, 65,131, 6,161, 78,157, 58, 96, 89, 22,185,185,185,104,215,174, 29,127,221,186,117,109, 77, 17,
+ 88, 20, 69, 77,235,208,161,195, 74,228,207, 34, 44, 46, 28, 95, 2,248,186,192,186,157,216,163,239,240, 23,173, 58,126, 22,232,
+ 94,187,129, 75, 69,156, 78, 78, 78,223, 82, 20, 53, 0, 0, 13, 32,150,178,181,173,237,224,224,224,212,186, 71, 15,228, 18, 66,
+111,185,112,129,240, 36, 18, 57, 0,147,134, 26, 53, 6, 21,106,120,228,187,242,245, 29,216, 27, 33, 33, 33,232,247,121, 31, 8,
+ 4, 2,240,120,124, 8,248,124,240, 5,249, 22, 44,107,123,203, 42,213, 35, 5,157, 71, 98,101,101, 5,112,128,165,149, 85,161,
+ 37,147, 0,224, 40,138,226,202, 41,231, 94,123, 39,143,115, 20, 88, 90,129,101, 12,168,254,105,191,162, 50, 29,185, 99,163, 4,
+ 44, 43,201,141,121,139,105,215, 30,242, 97,134, 25,102,129,101, 26,138, 59,133,150,134,246,237,219, 79,177,176,176, 88, 87, 80,
+241, 34,246,126, 60, 98,239,199,195,187,110,253, 22,254,141, 2,179, 6, 13, 26, 4, 59, 59, 59,124,245,213, 87, 28,128, 95, 43,
+123,253,168,136, 23,114, 0,156, 66,161,248,170,192, 34,208,232,225,195,135, 14,143, 30, 61, 66,227,198,141,139, 55, 30,104,217,
+178,236,118,187, 96,102,220,151, 40,195,159,170,138, 86, 49,232,245,122,228,229,169,161,211,233,193, 24, 88, 48, 12,131,128,250,
+ 22,216,179,117,118,254, 62,166,208, 90,150,111, 37, 19, 9,180,104,211,180,154, 1,132, 82,223,184,247,190,220,154,178, 52,203,
+ 21, 77,211,184,237,145,255,183, 78, 9, 6,147,133, 22,199, 26,235, 58, 59, 57, 33,230,194, 3, 0,128, 92, 42,198,197,221,139,
+ 32,147,230, 79,110,232, 54,124, 14, 36, 34, 1, 36, 34, 62,244,122, 61,156, 28,107,130, 49, 26,234,150, 41,188, 13, 58, 93, 13,
+ 39, 43,184,116,107,138, 39,143,238,225,203, 41, 99, 49,106,212,104, 8,196, 22,184,113,227, 26, 98,148,201,120, 29,151,129, 41,
+243, 54,194,192,176,208, 51, 70,232, 13, 70,172,221,117, 22,122, 35, 87, 97, 35, 47, 16, 8, 48,115,230, 76, 73, 89,199, 15, 28,
+ 56,160, 54,253, 25, 25,160, 82,169,161,213,106,161,215, 49,208, 27, 24, 24,107, 9,176,104,238, 96, 48,122, 6,121,159, 55,131,
+222,192,128,157,222, 7,122,157, 1,177, 82, 30,213,178,177,194, 0, 80,234,219,143,226, 44, 43,226, 47, 20, 5,229, 9, 48, 83,
+ 80, 40,178,124, 27, 53, 10, 27,209,189,201,210, 59,247, 30,165,220,185,247,232, 79,231,121,212,111, 18, 61, 97,201,129,217,149,
+ 17, 87,192,135,195,133,127,177,220,255,112,253,250,117, 39,185, 92,142,136,136, 8,208, 52, 13, 66, 72, 90, 72, 72,136, 19, 0,
+204,159, 63, 63,149,207,231,219,209, 52,141,233,211,167,131,199,227, 57,124,241,197, 23,223, 3, 88, 95, 78, 71,206,219,194,194,
+226, 3,235,149, 64, 32,192,236,217,179, 49,116,232,208, 34,113, 37, 16, 8,176,107,215, 46, 4, 6, 6, 66,167,211,121,155,146,
+222,184,184,184, 71, 0, 90,153, 32, 64, 72,129, 40,175,176,124, 82, 20, 53,226,201,196,137,181, 53, 15, 31,226, 11,150,245,169,
+ 91,183, 46, 52, 26, 77,209,113, 79, 79,207,234,113,113,113,137, 10,133,226, 55, 0, 27,149, 74,229,227,242,248, 12, 26, 22,239,
+163,226, 10, 59,171,104,210,164, 73,145,197,170,184,245, 74, 32, 16, 64, 34,148, 87,250,153,177, 44,139,236,236,108,122,215,174,
+ 93,181,124,124,234, 19, 0,240,246,174, 79,206,158, 61, 87, 93, 46,151, 71,219,218,218,234, 43,124, 39, 45,173,112,101,244, 64,
+ 0, 64,255,246, 93, 10,173, 88, 8, 94, 52, 7, 60, 62, 31,141,102,204, 1,240,176,232,124,157, 78, 7,150,101,105,152, 97,134,
+ 89, 96,149,241,226, 27, 12,229, 30, 95,189,122, 53, 26, 54,108, 88,110, 3,180,110,221, 58,236,221,187,119, 53,199,113, 81,149,
+189,126,143, 14,254,245,177,230,248, 11,143, 58,249,149,194,194,233, 61, 41,149, 74,133, 59,119,238,192,202,202, 10,175, 95,155,
+ 22,182,235, 63, 17,166,129,227, 0,189,129,129, 42, 79, 3,157, 78,135,233,179, 76,154,153, 78,244,186, 28, 94,247, 46,173,203,
+ 20, 15,133,195,125, 20, 69, 85,232,131, 85,209,208,224, 7, 22, 12,131, 1,133, 77, 71,110,158, 6,237, 7,127,139,135, 39,215,
+ 2, 64,190,184, 18,243, 33, 17, 10, 32, 17,242, 64, 17,128,160,108,110,131, 58,251,211, 53,139,102,221,218,244,235, 30,183,222,
+173,199, 98,202,228, 41,224, 9,165,176,177,115, 0,195,114,168,174,112,196,155,248, 12, 28,253,101, 86,193,168, 40,135,214, 67,
+230, 99,245,220,177, 88, 49,175, 98, 35, 38,143,199,195,250,245,235,213, 37,173, 86,197, 63,185,138,219,193, 63, 4, 86,158, 26,
+106,141, 22, 95,125,187,209,244,103,212,185,149,196,148,147,203, 19, 80, 21, 9,176,210, 68,150, 41,239,111,163,222,152,251,119,
+ 86, 48, 44,203,226,236,217,179, 69,207,163,172,103,104,170,181,149,101, 89,188,127,255, 30, 47, 94,188, 64,211,166, 77,145,149,
+149, 5, 62, 69, 97,230,179,103,240, 25, 54, 12, 58,129, 0, 44,203, 66, 40, 20, 98,252,248,241, 38,231,103, 37,149, 99,129, 31,
+155,177, 92,114, 23, 23,151, 85,245,234,213,171, 29,149,145,129,144, 39, 79,208,100,220, 56, 0,192,237,219,183,139, 91, 0, 49,
+120,240, 96, 97,116,116,244,232,240,240,240,209, 46, 46, 46,171, 19, 18, 18,102,150,249, 62,113,218, 34, 31,172, 1,131,251,162,
+118,189, 90,216,187,115,127,209,241, 25, 95, 79, 3,159, 47, 0, 95,192,135,181,149,117,165,111, 45, 59, 59,155,183,106,213,106,
+223,160,160,166,146, 33,195, 70, 82,122,134,195,162,101,107,233, 67,251,247,216,237,222,179, 87, 34, 22,139, 95, 86,248,140, 12,
+250, 63,213, 83,132, 16,240,248,124,240,132, 2,128,101,193,113,156,108,197,138, 21, 11, 95,188,120,209,184, 94,189,122,208,106,
+181,195, 8, 33,161,230, 56, 88,102,252,171, 4, 22, 77,211, 21, 90,167, 40,138,170,112,136,112,198,140, 25,176,176,176, 40,171,
+225,225,158, 61,123, 22,150,144,144,176,149,227,184, 42,197,197, 57,243,123,232,139, 5, 95,246,201, 1,160, 6, 0,107,107,235,
+212,246,237,219,231, 2,208, 31, 58,116,232,131,115,181, 90,237,251,178,120, 28, 29, 29, 23, 44, 95,190,124,106,215,174, 93, 41,
+138,162,254, 84,185,151,220, 12, 6, 3, 78,159, 62, 61,117,201,146, 37, 40,203,234, 85,216,120,231,169,212, 80, 23, 56, 56,191,
+121,126,196,212,202,188,194, 83,158, 54,114, 45,213,114,245,137, 82, 15,154,166,113,222, 49,255, 62,186,165, 84,204, 69, 40, 58,
+226,237,251,216, 38,206,246,214,200,200,202,133, 72,200,135, 68,244,135, 53, 95, 34,206,183, 94, 73, 68,124,216, 88, 91, 32, 45,
+ 45, 9,124, 62, 63,162, 28,225,240,158, 16,210,106, 96,159,110,151, 40,154, 39, 46,126,140, 47,177,148, 94,190,243,204, 38, 41,
+ 93,133,226,198, 0,150,229, 48,117,209, 78,211, 10, 48,143,135, 73,147, 38,149, 41,112, 78,157, 58, 85,105, 11,150, 90, 83,201,
+103,100, 34,127,121, 67,128, 21, 29,175, 8,133,179, 11,101, 50,153, 79,129,248, 50, 25,141, 26, 53, 58, 47,149, 74, 77, 14,114,
+100,106,208, 81, 66,200,194,246,237,219,255,232,230,230,230, 56,113,226, 68, 66,211, 52, 2, 3, 3,237,127,248,225,135,172,124,
+203,136,183, 69, 97, 29,179,102,205, 26,188,124,249, 50,133, 16,178,168, 60, 78,161, 80, 24,110,101,101, 21,216,174, 93, 59,100,
+101,101, 33, 54, 54, 22, 50,153, 12, 62,171, 86,225,217, 23, 95,160,209,230,205,160,218,183, 7, 33, 4, 66,161, 16,207,158, 61,
+131, 68, 34, 9, 47,139,207,213,213, 53,136,203,119, 50,111,129, 63,134, 5, 57, 0,119, 8, 33,179,226,227,227, 31,148, 82,223,
+ 81, 0, 96,100, 89,174,130,251, 31,252,237,183,223,130,146, 72,224,210,172, 25,212, 81, 81,208,235,245,104,218,180,105,145, 85,
+189,105,211,166,160,105, 26,181,107,215,134,173,173, 45,142, 29, 59, 54, 24, 31,206,172,254, 0,154, 92, 61,222, 71,197,161, 89,
+179,102, 69,150,170,238,221,187, 23, 89,176,248,124,126,145, 37,139, 24, 43, 22,172,132, 16,174, 68, 93, 76,132, 66,129,104,248,
+200,209,212,172,175,190,100, 13,140,129,165,105, 62,245,213,220, 37,212,235, 87,207, 69, 42,149,138, 34, 21,244,214,170,247,234,
+143,254, 29,242,141,160, 71,107, 59,128, 46, 16, 86,189,158,199, 21, 61, 23,203, 51,191, 11,151, 46, 93,218,175, 94,189,122,249,
+195,237, 0,207, 28, 7,203,140,127,147,192,138,124,242,228,137, 87,253,250,245, 17, 19, 19,243,167,153,109,133,239,152, 76, 38,
+131, 68, 34, 41,180, 16, 69,150, 69,118,245,234,213, 95, 0,252, 82,248, 91,161, 80, 52,107, 55,160,237,221, 38, 93, 26, 99,223,
+146,253, 89, 9, 9, 9,190,133, 49,177, 8, 33, 68,161, 80, 12,229, 11,121, 3, 61, 26, 84,111, 3,150, 93,126,229,212,237,249,
+229,221,136, 71,157,250,185, 0,212,197,102, 17,174,172, 74,134, 16, 66,250,119,237,218,149, 10, 11, 11,195,192,129, 3,177,119,
+239,222, 50,207, 29, 58,116, 40, 14, 28, 56,128,206,157, 59, 83, 75,151, 46,237, 95,145,192,202,183,142,232,254, 99, 15,179, 52,
+203, 85, 73,145, 88,161, 16, 96,153, 43,207, 30,135,248,249, 6, 54,231,191,139, 75,130, 88,200,131, 88,244,199,140,125, 73,129,
+255,149, 68,196,135,179,131, 13, 30,222,189,174,103, 24,195,149, 10,196,197,123,148, 18,164, 81,100, 97, 31,241, 73,139,134, 54,
+165,253,103,213,183,195,208,240,224,170, 10,211,203,231,243,177, 99,199, 14,117, 89,214, 43, 83,243, 32,223,202,104, 64, 94,158,
+ 26,121,106,205, 71,123, 38, 78, 78, 78, 14,142,142,142,155,172,173,173,197,165, 9,168,146,199,255,138,184, 42,136,139, 21, 54,
+106,212,168, 74,137, 44,161, 80, 88,243,206,157, 59, 69, 65, 70,203,251,212,233,116, 24, 48, 96,128, 73,150,239,224,224,224, 29,
+254,254,254,111, 28, 28, 28, 46,251,248,248,136,222,188,121,131,197,139, 23, 19, 62,159,111, 89, 88,127,228,228,228,128,166,105,
+100,100,100,128, 16, 50, 34, 56, 56,248, 66,121,156, 90,173,246,198,141, 27, 55,252,122,246,236, 73,135,135,135,131,166,233,252,
+116, 53,107,134, 70,155, 55,227,249,151, 95,162,205,187,119,208,232,245, 16,139,197,184,120,241,162, 62, 47, 47,239, 70, 57,247,
+190,245,222,189,123,245,197, 98, 49,244,122, 61, 88,150, 5, 69, 81,132,199,227,181,244,241,241, 89, 7,160,113,137, 14,152,227,
+248, 25,203,234, 26, 25,198,152, 16,243, 38,197, 4,139, 16,246,238,221,139,166, 77,155,162, 77,155, 54,136,143,143, 71, 84, 84,
+ 20,186,117,235, 86,116,206,147, 39, 79, 16, 26, 26, 10, 79, 79,207,138, 45,120,148, 1,158,117,107, 66, 32, 16,128,207,231, 67,
+192,207,255,204,223,242, 45, 87, 2,190, 0,124, 30, 31, 98,137,216, 68,237,255, 97,153,180, 42,176,124, 73,165, 18,182,118,237,
+218, 97,175,223, 68,249,128, 3,101,105,105,101,146,175,109, 33, 31, 33,164, 72, 92,241,133,130, 34, 75, 22, 0,100,101,101,105,
+122,247,238,253,155, 86,171, 29,137,143, 56,146, 98,134, 25,255, 43, 2,171,219,152, 49, 99, 54,119,234,212,169,195,204,153, 51,
+ 33,151,203,145,144,144, 80,244,130, 9,133, 66, 84,171, 86, 13,121,121,121,184,121,243, 38, 50, 51, 51,175, 2, 24,111,234,133,
+ 19, 18, 18,238,191,126, 28,153,214,174, 95,115,187,250,205,235, 90,199, 70,198, 53, 5,112,183, 64, 92,253, 58,104, 70,183,145,
+237, 62,107, 2,129,144,143,216,215,137,255,181, 12,161, 40,138, 38,132, 96,224,192,129, 38,157,255,249,231,159,227,198,141, 27,
+ 40,111, 56,177,200,130,149,167,129, 74,253,241, 58,103,132, 16, 24,141, 70, 52,141, 72,255, 96,102, 86,161,229,170, 80, 88,152,
+ 98,185, 42,234, 33,231,229,173,184,117,229,228,184,122, 13, 26, 57, 52,245,243,194,235,232, 56, 44,159, 51,182,232,248, 87, 19,
+ 6, 97,215,193, 83,112,117,182,135, 38, 47, 7, 23,206,157,206,202,206,206, 94, 81,213,123,216,125, 34, 63, 14,100,171,193, 31,
+206, 17, 24,248,229,207, 38,253,159,207,231, 99,228,200,145,101, 90,176, 46, 95,190,172, 54,101,120,148,227, 56,232,117, 6,228,
+170,212, 80,231,125, 28,129,165, 80, 40, 26, 53,109,218,244,242,150, 45, 91,236,236,237,237,161, 84, 42, 63, 16, 88, 10,133,162,
+ 81, 80, 80,208,229, 45, 91,182,216, 57, 56, 56, 32, 54, 54,214,228,240, 32,165,136, 43,164,164,164,144,140,140, 12,214,198,198,
+166, 82, 34,139,162, 40,104,181, 90,188,124,249,210,212,119,196,228, 25, 95,114,185,124,231,146, 37, 75, 68,201,201,201,160,105,
+ 26, 47, 95,190,252,160,172, 22,110,223,126,251, 45,230,204,153,179, 9, 64,141,242,248, 24,134, 89, 61,116,232,208,209,241,241,
+241, 54,142,142,142, 72, 72, 72,128, 80, 40, 4,199,113, 32,237,218,161, 85,116, 52,244, 70, 35, 36, 18, 9, 34, 34, 34,176,117,
+235, 86,149, 86,171, 93, 93, 26,151,167,167,167,144,162, 40, 47,129, 64,128, 33, 67,134,124, 88, 46,119,239, 70,179, 26, 25,129,
+227, 62, 17,229, 50, 16,107,147, 36, 93,207,211, 52, 77,198,127,181,188, 78, 80,235,238, 13, 94, 61,127,240, 38, 37, 41,238, 78,
+ 5,183,111,208,233,116,168, 87,175, 30, 30, 61,122,132, 43, 87,174,160,125,251,246,104,221,186, 53,174, 95,191,142,224,224, 96,
+132,134,134,130, 16, 2, 59, 59,187, 66, 55,139,114,125, 45,116,121, 12,146,149,105,127,178, 86,149,252, 45, 16, 8,160, 85,235,
+ 77,122, 70,197, 69, 19, 33, 4,182,182,182,218,181,107, 86,136,228,114,185, 17, 0,228, 50,169,241,208,238, 13,176,183,179,213,
+114, 38,154, 88,139,134, 5, 11,196, 21,205,231,127,224,166,192,113, 92,206,211,167, 79,199, 17, 66,158, 18, 66, 10,235, 15,115,
+ 28, 44, 51,254, 29, 2, 43, 36, 36, 36, 26, 64, 71,127,127,255,193, 55,111,222, 92, 61, 99,198, 12,135,150, 45, 91, 34, 61, 61,
+ 29, 53,106,212,128, 66,161,192,163, 71,143,240,228,201,147, 84,142,227,102, 6, 7, 7,239, 45,229, 37,235, 88, 86,172, 12,142,
+227, 56,133, 66,113, 88,155,155,251, 69, 64, 27,111, 92, 61,116,107,137,139,139,203,120, 87, 87,215,233, 35,230,244, 26,217,182,
+119, 99, 68,132,190,197,253, 75,207,144, 20,147,138, 17,173,102,149,203, 89,210,201,221,218,218,122,180, 84, 42, 21, 2,208,151,
+210, 11,254, 96, 22, 97,113, 78,150,101,141, 58,157, 14, 7, 15, 30, 52, 73,100,237,223,191, 31, 26,141, 6, 44,203, 26,203,186,
+119, 35,203, 18, 30, 95, 4, 69,181,122,208,235, 85, 96, 89,211, 39, 72,114, 21,228, 39,195, 48, 88,176, 96, 1,190,254,250,107,
+ 44, 90, 84,246,232, 10,143,199,195,134, 13, 27, 80,209, 51, 74, 79, 79,207, 81, 40, 20, 67, 15,108,255,249,200,144,177, 83, 45,
+220,154,251, 98,231,161,243, 48,232,245, 16,137,248,176,177,148,161,118, 77, 55,232, 52, 42,108, 94,191, 38, 91,163, 86, 15, 45,
+233,123, 86,222,115, 47,137,225,189, 91, 99,233,214,147,184,181,239,143, 73,136,173, 6,207,195,111, 43, 38,195,223,127, 71,185,
+156, 70,163, 17, 60, 30, 15, 7, 14, 28, 80,151, 54,123,144,166,105,240,249,252, 50, 45, 88, 31, 62, 35, 35,225, 11,196,168, 86,
+195, 7, 58,109,238, 71,121, 70,118,118,118, 95,111,223,190,221, 78,163,209,224,213,171, 87,120,249,242, 37, 8, 33, 69, 42,166,
+240,120, 94, 94, 30,158, 63,127, 94, 40,112, 94, 86,230, 61, 42,180, 92,165,164,164,144,132,132, 4, 72,165, 82,234,233,211,167,
+ 26, 95, 95,223,176,242,222,239,226,156, 90,173,246, 93,135, 14, 29,202,178, 24,185,138, 68,162, 15,102,124, 21, 6, 29, 45, 57,
+ 84, 88, 90, 58,243,242,242,158,173, 94,189,186, 86,227,198,141,177,101,203, 22,157,133,133,133,112,198,140, 25, 28, 77,211,100,
+237,218,181,200,200,200,208,205,158, 61, 91,120,235,214, 45,168, 84,170,199, 21,221, 59,199,113, 57,132,144,113,205,155, 55,223,
+125,225,194, 5,169,151,151, 23,178,179,179,193,113, 28,118,237,218,133,201,147, 39, 67, 44, 22, 35, 34, 34, 2,159,126,250,105,
+ 94, 94, 94,222,184,226, 49,176,138,115, 50, 12, 67,248,124, 62,199,178, 44,190,255,254,251,162,160,162,133, 65, 70, 37, 2, 35,
+182,206,240,144, 77,219,150, 37, 27,252,195,182, 97, 0, 96,100, 24,227,171,231, 15,222,236, 90,255,195, 53,129, 64,112,179, 24,
+103,131,146,177,176, 8, 33,223,253,244,211, 79,155, 90,180,104, 33,145,203,229,240,242,242,194,157, 59,119,112,231,206, 29,220,
+186,117,171,176, 12,192,214,214, 22,153,153,153,136,141,141, 85, 19, 66,190, 43, 47, 63,133, 82, 62, 60,234,212,204,159, 45, 88,
+ 96,177,226, 23,155, 61, 88,220,154, 37,224,243, 43,124,223, 75,186,119,216,218,218, 50, 1, 1,254, 97,106,181,154, 46,212, 82,
+246,246,246,207, 11,206,229,170, 85,171,166, 43, 81,228,255,196, 25,185,125, 3,130, 23,127,151, 63, 44,248, 44,182, 72,108, 93,
+251,196, 31, 60,129, 0,213,122,244, 45,222, 14,108, 36,132,236, 40,248,174, 45,198,249,205,199,142,133, 85,153,122,201,204,249,
+247,112,254,155, 44, 88, 0,128,208,208,208,125, 13, 26, 52, 56,191,116,233,210,165,199,143, 31, 31, 59,117,234, 84, 98,105,105,
+137,195,135, 15,115,105,105,105, 59,133, 66,225,215,247,238,221,203,168,202,197, 57,142,219,121,253,216,221,137,195,103,247, 38,
+ 51,214,142,104, 25,252,251,243,240,134,205,189,208,176,185, 23,130,175,134, 97,253,156,253,123,141, 6,227,247, 9, 9, 9, 49,
+ 21, 80,105, 59,182,168, 91,210,201,221,238,198,181,223,237, 42, 59,139,144,227,184,195,199,143, 31,159,218,173, 91, 55,234,225,
+195,135,127,242,185, 42, 92, 30,135,101, 89, 92,190,124, 25,122,189, 30,135, 15, 31,102,203,139,131,197,130, 59,185,121,227,138,
+225,155,183, 31, 19, 10, 5, 4,247,110, 30, 69, 86, 70,249, 86, 57,129,128,143,223,246,159,212,243,120,244,171,114,210,250, 62,
+ 52, 52,212,110,249,242,229, 52, 33, 4, 27, 55,110, 4, 69, 81,101, 58,180, 63,127,254,156, 53, 24, 12, 21, 62, 43,165, 82,121,
+217,217,217,249,243,141,171, 23,236,106,215,185,151,181,119, 61, 31,158,163, 99,117,240,104,130,140,180, 84, 4,223,191,197, 92,
+ 56,123, 50, 83,171,213,142, 80, 42,149,151,255, 74, 1, 92,178,229, 68,169,251,251, 78, 93, 93,145, 21,133, 49, 24, 12, 60,153,
+ 76, 6,134, 97, 74, 13,213,208,190,125,123,201,157, 59,119,212,122,189, 30, 52, 77,151,171,152, 88,224,163, 63, 35,163,209,232,
+157,145,145, 1,149, 74,133,144,144, 16,110,253,250,245, 41,153,153,153,115,138, 31, 79, 79, 79, 71, 78, 78, 14,130,131,131,185,
+ 45, 91,182,164,100,103,103,207,169, 76,254, 21,198,197,202,200,200, 96,165, 82, 41,101, 48, 24, 12,190,190,190, 98,153,204,180,
+152, 87, 0,240,248,241,227, 46,101, 29,107,209,162, 69,228,157, 59,119,106, 27,141,198,226,107, 20, 10, 52, 26,141, 87,175, 94,
+189,120, 38,164,111,240,165, 75,151,246,221,186,117,171,161, 86,171, 29,157,156,156,188, 27, 64,117, 30,143,135,215,175, 95,167,
+232,116,186,190,223,125,247,221, 78,149, 74,245, 76, 46,151, 15, 54,177,222,184, 64, 8, 25,226,237,237,189, 99,193,130, 5,242,
+ 54,109,218,240, 20, 10, 5, 26, 55,110,140,136,136, 8,156, 61,123,214,176,113,227, 70, 85, 94, 94,222, 40,142,227, 46,151,211,
+233,224, 0, 16,134, 97, 32, 20, 10,139, 54,145, 72, 4,129, 64,128, 60, 29,133, 49,171,162,212, 12, 36,234,213,243,199,157,229,
+ 0,146, 24, 27,149,154,156, 24,251,128, 16,114, 83,169, 84,102,149,101, 25,211,104, 52,126, 28,199,241,178,179,179,215,106,181,
+218, 17, 51,102,204,112, 89,190,124, 57,124,125,125,145,154,154, 10, 91, 91, 91,184,184,184, 32, 55, 55, 23,209,209,209, 70,189,
+ 94,191,217,104, 52, 46, 76, 74, 74, 42,119,216, 49, 51, 53, 27,110,206,213, 63,176,116,114, 28, 7,206, 8, 24,180, 70, 24,245,
+ 28,116,196, 0, 62,223, 0, 19,151,208,226, 24,134, 65,143, 30, 61,112,230,204, 25,244,238,221,155, 3, 80,166, 21,233,204,153,
+ 51, 21, 15,185,179, 44,248, 34, 33,120,130, 63,134, 5,243,173, 89,249,251, 40,242,167,231,105,182, 90,153,241,239, 20, 88, 5,
+ 13,115, 38,128,241,141, 27, 55,222, 61,101,202,148, 51, 44,203,242, 89,150,237,254,248,241,227, 91,127,229,226, 9, 9, 9, 33,
+ 10,133,226, 91, 39, 55,155,165, 93,135,182, 68, 93,191, 26, 48, 50, 70,220, 57,247, 24, 59,127, 58,113, 32, 62, 54,126, 68,241,
+181, 10,203,126,159,217,107, 45, 2,235, 82, 0, 4,197,134, 95,216,170,204, 34, 76, 78, 78,158,183,120,241, 98,252,248,227,143,
+149,158, 69, 88,214, 57,119, 31,197,143,111, 22,232,226,246,121,223,246,157, 41, 66,113, 90,157,182,156, 94, 1,184, 66,175, 8,
+ 30,143,126,117,227,126,172,111, 89,231, 38, 38, 38,118,152, 56,113,226,239, 20, 69,213, 40,110,154, 47, 11, 70,163, 49, 33, 45,
+ 45,173,147, 41,249,144,152,152,120,222,205,205,173,206,141, 11, 39,191,189,125,229, 92, 91,163, 81,239, 73, 64, 32, 16, 8,222,
+ 24,140,204,117,131, 78,183, 36, 46, 46, 46,227,175, 22,192,111,199,247,198,123,101, 42,120, 60, 58, 63,176,103,193,227, 62,186,
+110, 6,252,253,127, 43,243,127, 34,145,232,252,142, 29, 59,122, 12, 31, 62,156, 20,250,157,113, 28,247, 65,133,254,224,193, 3,
+181, 78,167,195,206,157, 59, 57,137, 68, 82,110,224,218, 15,159, 17,225,180,229,248, 67,153,250,140,114,115,115, 71,245,234,213,
+107, 23, 0, 17,128,215, 89, 89, 89, 19,148, 74,101, 92,241,227,189,123,247,222, 5, 64, 68, 8,249,211,113, 83, 80, 24,178,193,
+198,198, 38,172,192,114, 37,174,138,163,123, 57,229,155, 46,107,248,208,148,161,194,130,181, 5, 63, 43,252, 29, 24, 24,184,112,
+226,196,137, 69,139, 61,135,134,134,222, 6,224, 81,133,206,217,101, 66, 72,253,239,191,255,254, 75,177, 88,220, 46, 47, 47,175,
+ 78,129,160,139,208,106,181,215,212,106,245, 26,142,227,202,141, 45,245,230,205, 27, 93,173, 90,181, 34, 24,134,105,224,224,224,
+ 0, 30,143, 87, 36,178, 0,224,126,140,109,112,124,124,124,227,202,166,237,220,185,115,238, 54, 54, 54,157, 8, 33,253, 56,142,
+171,155,147,147,163,253,225,135, 31,238,222,184,113, 35, 59, 60, 60,188, 75,171, 86,173,136,179,179, 51,222,190,125,203,229,230,
+230, 30,161, 40,234, 59,165, 82, 25,101,194, 61,199,237,220,185,179,178,249, 84,110,121,210,233,116, 41,247,238,221,179,189,114,
+229, 10,109, 52, 26,113,225,194,133,162,142,100,105,163,129, 81, 81, 81,208,233,116,229,142,161,235,179, 50,224, 59,237, 27,112,
+ 5,179, 57, 11, 81,189,123, 95, 16,112,224,116,102, 61,101,198,191, 3,228, 63, 50,141,185,146, 38, 68,133, 66, 49, 80, 44, 19,
+ 77,170, 81,199,197, 87, 25,149, 28,150,147,149,183, 55, 33, 33, 97, 11,199,113,198,170,114, 86, 38,208,168,217,204,251,247,112,
+ 10,165,150, 23, 9, 45,168, 81,102,227, 96,212,191,215,229,101,119, 46,141, 51, 40, 40,200, 85, 32, 16,172,208,106,181, 93,203,
+139,210, 78,211, 52, 35,145, 72,206,107, 52,154,175, 75, 46,246,252,191,152,159, 71,142, 28, 41, 85,244,155, 58,139,176, 95,191,
+126,198,202,164,179, 81,163, 70,215,164, 82,105,169, 1, 53,243,242,242, 98,158, 60,121,210,233,159,144,159,133, 51,219, 76,241,
+ 17, 42,206, 89,149, 89,132,101,112, 22, 13, 17,186,187,187,139,244,122,189, 63,128, 58, 0,172, 1,164, 27, 12,134, 11, 41, 41,
+ 41, 73,206,206,206,129, 20, 69,125, 95, 32, 94, 23, 37, 38, 38, 6,255,157,239,166,155,155,155,216,210,210,114, 5, 69, 81, 46,
+166,252,159,101, 89, 93,114,114,242,140,212,212,212,196,210, 56,235,215,175, 31, 76,211,116,133,139,154, 27,141,198,184, 23, 47,
+ 94, 4,150,147, 78,243, 16,225,191,144,243, 95,105,193,250, 79, 67,169, 84, 30, 4,112,240, 99,114,150, 21,169,221,140,127, 14,
+ 10,197, 83, 85, 80, 32,150, 62,255,183,229, 89,161, 64, 42,101,255, 75, 0,228, 99, 95,207,148,112, 12,255, 4,112, 85,236, 41,
+ 22, 8,168, 86, 31, 51, 45,239,222,189,211, 2,184, 91,176,125,128, 2, 65,213,243,159,146,111,113,113,113, 26, 0,147, 63, 22,
+ 95,121,162,201, 12, 51,254,109,160,204, 89, 96,134, 25,102,152, 97,134, 25,102,152,241,113, 65, 0,116, 44,163, 71,104,178,233,
+143, 16,210,177, 10, 61,206, 43,102, 78, 51,167,153,211,204,249,255,132, 51,185, 28,206,231, 21,112, 54, 40,227,144,227,255, 80,
+126,250,149,193,185,172, 2,206,111,202, 57,252,216, 92, 62,255,127,114,254,107, 80,232,204,248,159,216, 0,116, 52,115,154, 57,
+205,156,102, 78, 51,167,153,211,204,105,230,252,183,109,230, 33, 66, 51,204, 48,195, 12, 51,204, 48,195,140,143, 12,147, 5,150,
+220,217,219,219,193,189,209, 46,219,106,190, 79,109,171,249, 62,117,112,111,180, 75,238,236,237,253,111,204, 52,133, 66, 33,113,
+113,113, 25, 92,189,122,245,203,126,126,126,217,174,174,174, 95,154,139, 82,229,209,150, 16,222,231,132, 76, 26, 78, 72,204,112,
+ 66, 98, 62, 39,100, 82, 91, 66,254,223, 45,155,177, 96,154,162,217,173, 11, 67,206, 47,152,166,104, 86,234,241,175, 20,118, 15,
+ 46, 15,248,121,201,100, 87,219,143,113, 61, 66,136,133,147,147,211, 86,103,103,231,119, 78, 78, 78,239,157,156,156,118, 16, 66,
+172,204, 37,206, 12, 51,204, 48,227,191, 7,147, 26, 51,219, 26, 13,199,120,215,171,251,245,226,249,115,136,179,163,189,148, 49,
+178,250,183,239, 98,125,230, 45, 94,122,196,182, 70,195,213,233,239,159,109,175, 66, 35, 64,220,220,220, 6,242,249,252, 30, 0,
+ 10,133,218, 75,131,193,112, 38, 46, 46,238,160,169,179,130,124,125,125,111,211, 52, 93,189, 50,215,102, 89,246,221,147, 39, 79,
+ 90, 87, 37,195, 92, 93, 93,251,187,186,186,238,104,218,180,169,212,207,207, 15, 2,129, 0,203,151, 47,159, 9, 96,141,201,247,
+222,182, 45,207, 49,211,118, 24,205,227,245, 4,224,203,113, 0, 8,253,148,213,235,206, 37, 11,108,119,113, 33, 91, 12,166,240,
+184,184,184,204, 33,132,140, 64,254,180,242,237, 74,165,114,197,127,162,144, 40, 20,138,106,132,144,118, 28,199,213,163, 40,234,
+ 25,203,178,151,148, 74,101,218, 95,229,117, 2,198, 55,111,217,242,231,225, 51,103,210,234,155, 55,241,243,142, 29,107,145,157,
+ 13, 0, 27, 42, 91,150,130,130,252,250, 89, 88,160, 7, 1,252, 65, 64, 40,112,143,211, 51,169,115,143, 30,133, 30, 52, 37,150,
+ 90, 89, 8, 8, 8, 56, 11,160,112,225,184,115, 33, 33, 33,221, 43,203,145,245,134,155, 43,234,233,221, 42,235,205,181,185, 0,
+186,150, 60,206,104,196,195, 57,186, 90, 15, 53, 23, 26, 11, 96,213, 95,201, 83, 66,136,212,193,193,225,233,201,147, 39,221,154,
+ 52,105,194, 3,128,224,224,224, 97, 61,122,244,104, 95, 16, 74, 32,251,239,168,104,154, 53,107,102,195, 48,204,110,154,144,166,
+ 44,203, 90, 3, 0, 69, 81,153, 70,142,187,207,227,241,134, 87, 53, 88,177, 25,102,152, 97,198,255,172,192,146, 59,213,243,169,
+ 95,223,123,230,133,227,187,171,101,166,103,106,126, 89,185, 59, 68,197, 19,230,121,249,120, 9,126, 89,179,194,102,210,180, 25,
+211,229, 78,245, 30,228, 38,133,135,153,122, 81, 23, 23,151,234,238,238,238,199,230,204,153,211,160,101,203,150,124, 71, 71, 71,
+ 36, 37, 37,225,213,171, 87, 13,238,220,185,211,251,196,137, 19, 51, 93, 92, 92, 62, 51, 33,130, 59,100, 66, 65,173,131,203,151,
+ 56, 11,173,172,193, 25, 25,216, 52,240,203, 31,255,100, 89, 36,222,184, 2,163, 94, 15,142, 53,194,173,203,167,133,226, 10, 65,
+ 65, 65,130,170,100,150,155,155,155,162, 78,157, 58,123,103,207,158, 45,208,233,116, 8, 13, 13,197,189,123,247,216,228,228,228,
+165, 38,139,138,134,125,124,156,121,206, 71,122,245,238,234,222,253, 19, 71, 97, 13,103, 7,112,172, 24,225,209,250,234,151,111,
+133,118, 57,123,254,226, 44, 71,159, 62,125,147,195,142, 63, 43,143,167, 65,131, 6, 77, 41,138,250, 49, 62, 62,190, 80, 4, 45,
+ 15, 10, 10,250,161,248, 57, 37, 53, 42,203,178,224,241,120, 73,121,121,121, 3,159, 63,127, 30, 90, 26,239, 8,127, 98, 48, 24,
+243,203,133,128, 7,227,213, 20,183,227, 29, 59,118,172, 57,106,212, 40,248,251,251, 35, 56, 56,184,221,225,195,135,167, 85,171,
+ 86,237,145,193, 96, 56, 39, 18,137,174, 23, 76, 75,175, 52, 4,192,172,225, 51,103,210,242,119,239, 32,127,242, 4, 67,178,179,
+121,203,128, 89,149, 17, 88, 1, 1, 1,181, 58,117,244, 63,210,251,179, 54,222,206,206, 62, 2, 62,223, 30, 28,199,193, 96, 72,
+175,147,146,242,178,159,149, 21,102, 55,105,210,164,239,195,135, 15, 77,138, 52,219,184,113, 99, 39,150,101, 55,115, 28, 39, 32,
+132, 76, 1,208,237,194,133, 11, 48, 26,141,232,222,189,123,183,128,128,128, 90, 28,199,253, 34,151,203, 57,181, 90, 61,250,209,
+163, 71, 73,229, 89,174,178,223,112,115, 19,137, 71,151,186, 1,195,145, 72, 46,116,153,209,213,229,188,165, 39, 89, 60,239,103,
+229, 61, 0,232,234,233,105,225, 81, 79,246,141,220,178,161,109,118,252,149,111,186,122,122,110, 59,255,230, 77, 78, 85, 58, 44,
+ 5,229, 96,197,158, 61,123,170, 5, 5, 5, 21,197,203,242,243,243,163, 87,172, 88,225,250,229,151, 95,174, 5, 48,210, 68, 81,
+ 93,199,206,206,238, 34,203,178,218, 23, 47, 94,212, 41,220,239,216,232,179,230,118, 22,178, 14, 41, 25, 57, 55, 83, 95,156,184,
+ 97, 10, 87, 96, 96,224, 40, 1, 69,109, 93,243,253,100,186, 94,195, 70,144, 58, 56, 64, 31,167,132,202,104,176,189,255,228, 69,
+247,101,107,182,166, 4, 6, 6,142, 11, 14, 14,222, 97,174,146,205, 48,195,140,127,141,192, 18,137,132,179,231,125,247, 13,201,
+ 76,203, 84,107,178,115,116, 6,141, 70, 67, 9, 56,205,179,176,232,100,138, 71,103,126, 57,109,170,197,236,111,191,155, 13, 96,
+136,169,226,170, 94,189,122, 15,183,109,219,230,104,107,107,139,172,172, 44,164,165,165,225,225,195,135,224, 56, 14, 93,187,118,
+ 21, 53,106,216,192,127,245,154,181,247, 92, 92, 92,154, 85, 36,178,120,124, 30,225, 75,165, 56,218,198, 31,148, 64,128,190,225,
+ 9,249,226,194,160,199,249,129, 61, 0, 0,180, 80,136, 1,145,249,147,124,196, 98,113,149, 51,139,227,184,102, 45, 90,180, 16,
+ 0,192,140, 25, 51,178, 85, 42,213, 18, 66,200, 62,165, 82, 25,111,170,184,178,119,112,184,177,114,241, 88,219, 6,181, 60,160,
+ 55, 24, 16,155, 28, 15,142, 8,225,226, 40,195,208, 62,126,130,150,129, 66,143,149, 27,174, 92,119,106,208,171,117,210,243,147,
+ 47,202, 20,150, 50,217,238,181,107,215,226,208,161, 67, 0,128,107,215,174,193,203,203, 75, 86, 81, 26, 94,189,122,229, 49, 98,
+196,136, 3, 0,106,151,118,220, 96, 4,111,223,190,125, 0,128, 85, 95, 13,166, 55,220,138,168, 41,145,252,177,150,114,155, 54,
+109,208,166, 77, 27,106,201,146, 37, 65,215,174, 93, 11, 58,112,224,128,222,213,213,117,109,124,124,252,225,170,228,169,250,230,
+ 77,200,159, 60, 1,110,220,168,244,127, 3, 2, 2,106,213,171,103,119,127,245,170, 31,236, 79,159,121,129,149, 43,119,224,205,
+155, 55, 0, 0, 15, 15, 15, 12, 30,212,159,191,239,183,205,245,103,207,158,127, 55, 32, 32,160,101, 72, 72, 72,133,209,205, 89,
+150,221,252,213, 87, 95,125,234,234,234,138,185,115,231, 70,212,170, 85, 11,150,150,150,216,178,101, 11,108,108,108, 96, 48, 24,
+ 34,150, 47, 95,206, 83, 42,149, 88,183,110,221,175,197,172, 91,127, 66,219,206,109,231,138,122,122,183,170, 27, 48, 28,114, 75,
+ 23,108,219,127, 16,175, 66,118,183,210,234, 95,206, 93, 50,217,117,168,154, 19,141,112,243,178,152,237, 30,216,198,174,118,253,
+ 79, 81, 35, 32,212, 94, 99,188, 21,253,253, 36,143,165, 60,177,102,247,188,149,127,182, 18,146,254, 71,232, 6,217,225,182,207,
+ 47, 35,141,227,230,177, 5,194,170, 40,254,149,145,195,167,173, 91,183, 46, 18, 87,239,222,189,131, 86,171,133,183,183, 55,165,
+211,233, 76,138,105,165, 80, 40,234,180,110,221,250,246,222,189,123,237, 90,181,106,245,193,210, 45,206,118,214,157,111, 28, 91,
+ 59,245,199,159,127,171,231,232,211, 39,179,162,142, 64, 96, 96,224,168,134,117, 61,183,175, 93,254, 3,161,115, 98,193,179, 78,
+ 1,140,169, 72, 56,248, 43,136,212, 22,221, 39,204, 64,227,160, 32,122,234,151,115,182, 55,110,220,152,123,244,232,209, 78,115,
+181,108,134, 25,102,252, 43, 4, 22,203,177,190, 78,142,118,146,181, 43,119, 61,162,245, 58,157,204,218, 74,199,183,178,100,137,
+133, 21,173,215, 25,114,107,120,212, 16,178, 28,235, 91,134, 32,185, 82,178,151,237,238,238,126,108,231,206,157,142,124, 62, 31,
+ 44,203,194,193,193, 1,111,223,190, 69,102,102, 38,114,114,114,240,230,229, 75,212,172, 94, 13, 83,199,141,117, 89,180,114,213,
+ 49, 66, 72, 96,241,225,194,146,156, 28,203,129,101,152,146,189,121,160,148, 37, 99,202, 90, 70,198,212, 41,165, 44,203,190, 85,
+ 42,149,144, 74,165,240,246,246,150, 63,122,244,232, 86,124,161, 9,169,162,123,111,219,150,231, 34,114, 56,182, 98,241, 64, 91,
+ 80, 17,136,136,201,132,167, 91, 19,216, 91, 87, 67,124, 74, 46, 30,133,157, 67,228,155,179,240,116,173,129,113,131,107, 91,175,
+217,114,231, 12, 9, 24,239, 89,124,184,176, 56,103, 78, 78,142,188, 70,141, 26,112,117,117, 5,203,178, 48, 26,141, 8, 11, 11,
+131,209,104, 44,250, 93,252,115,215,209,171, 96,178,223, 99,248,176, 97, 72, 79, 79,151,155,122,239,133,226,106,203, 96, 69,125,
+ 85, 70,130, 0, 0,100, 54, 46,250,113,191,197,191,104,220,184, 49, 28, 28, 28, 4,119,239,222,157, 1,224,112,101,243, 83, 15,
+ 44,255,121,231,206,117, 67,178,178, 40, 0,216, 78, 8,171,207,143,170,109, 82, 89,234,216,177,209,209,181,107,191,183, 39, 92,
+ 24,108,173,150,225,225,195,247,208,235,243,139, 74, 90, 90, 50,166, 76,202, 6,143,103,129, 85,171,231,219, 13, 24, 48,225,104,
+193, 16, 25, 91, 94, 58, 57,142, 19, 92,189,122, 21,131, 6, 13,194,129, 3, 7,120, 52, 77,227,193,131, 7,144, 72, 36, 24, 57,
+114, 36,234,215,175,207,147, 72, 36,184,125,251, 54,178,179,179, 73,121,233,188,126,241,250,226,172, 55,215,230, 38,146, 11, 93,
+182,237, 63,136,177,131, 6,194,153,139,186,101,229, 73, 22,119,234,217,226, 7,142,174,214, 67,102,225,107,227,213,160, 39, 4,
+ 66, 57, 38,207, 90,136,136,231,167,109,242,114,158, 78, 34,198,216,106, 0,166,149,228,228, 14,247, 51,174,219,127, 55,224,114,
+245, 71, 53, 20, 1,227, 31, 0,120,250,135,192,242,224, 17,202,104, 85,104,189,124,253,250, 53,222,188,121, 3, 30,143, 7,181,
+ 90,253,193,162,190,197, 57,253,253,253,199, 27,141,198, 31, 0, 64,167,211,237,114,114,114, 26,245,203, 47,191,216, 21, 46, 65,
+ 84,220,114,149,158,153,157,113,247,209,139, 87, 51,198,247,107,123,243,254,243, 88,235, 70,189, 99, 50,159,156,200, 42, 45, 63,
+155, 53,107,102, 35,164,233,173, 63,175,152, 71,140, 81, 87, 33,242,110, 11,158,220, 11, 70, 67, 60, 52, 25, 42,104,162, 19,160,
+219,178, 30, 30, 19,191,196,138,101, 63,146, 65, 67, 71,111,245,244,244, 60,246,166,152, 5,239, 63, 49,221,219,204,105,230, 52,
+115,254, 51, 57,255,117, 2,139, 16, 42,219,104,100, 69, 2, 7, 71,205,232, 1, 29, 26, 94,186, 18,252, 88,106,111,201,235,220,
+214,191,205,195,103,209,247, 8, 69, 12,132, 80, 38,249,117,184,185,185, 13,156, 55,111, 94, 67, 75, 75, 75,176, 44, 11, 43, 43,
+ 43,164,164,164, 64,167,211, 33, 43, 43, 11,218,156,108,232,115,178,241, 36,246, 29, 90,180,105,139,142,205,154,122,159, 55, 24,
+ 6, 2, 56, 80, 22,167,145,162, 57, 59,255, 38,232, 31,149, 6, 86,175,195, 97, 15,187, 34,171,213,231,239, 50, 65, 8, 1,171,
+215,225,124, 80,109, 8,229, 50, 52,250,122, 94,149, 51, 43, 33, 33, 33,180, 70,141, 26,231,187,118,237,218,117,252,248,241, 84,
+ 98, 98,226, 5, 39, 39,167, 22, 73, 73, 73, 21, 14,143, 58,102,216, 12, 31, 62,174, 97, 45,123,107, 10,167,111, 95, 64,211,122,
+125, 32, 21,241,145,146,169, 6, 1, 65,212,219, 43, 96, 25, 57,158,188,124,135,230,190, 82,180,110, 98,237,150,251,123,250, 56,
+148, 61, 92, 70, 50, 50, 50,144,156,156, 12,131,193, 0,131,193,128,126,253,251, 99,207,238,221, 80,169, 84, 80,171,213,208,233,
+116, 48, 26,141,160, 40, 10,151,207, 28, 70,108,244, 75, 52,111,214, 12, 40, 39,226, 55,159, 6,179,234,171,193, 60, 0, 16, 90,
+ 56,232,115,114,114, 32,147,201,160,202, 72, 16,204, 92, 89,100,217, 18, 92,187,118, 13, 33, 33, 33, 80, 40, 20, 38,149,163,210,
+240, 6,216,250,214,104,156,219,245,248,113,199, 59,199,143,179,247, 79,159,142, 19,229,228,108, 49,229,191, 65, 65,126,253,166,
+ 78,233, 94, 87, 34,150, 32, 46,102, 45,234,213, 19, 96,230,151,118, 88,178, 44, 21, 0, 48,117,138, 27, 26, 7,218, 35, 59,243,
+ 8,236, 29, 61, 49,115, 70,111,207,220, 92,110, 24,128, 93,229,151,119, 50,229,233,211,167, 17, 78, 78, 78,188,208,208, 80, 8,
+133, 66, 72, 36, 18, 72, 36, 18,136,197, 98, 36, 38, 38, 66,167,211,225,208,161, 67, 76,193, 16, 98,153, 40, 24, 6,236, 58,163,
+171,203,249, 87, 33,187, 91,185,210,209, 79,250, 78,110,249,238,233,253,208,156, 75,151,239, 44, 98, 52,226,216,204,184, 43,223,
+212,106, 28,106, 63,233,235, 5, 88,191, 98, 30, 94, 61,184,153,238, 84, 61,123,131,132,104,119, 5,125, 82,138, 85,172,237, 2,
+222,164,239, 7, 48,227, 71,244,181, 62,237,116,119,252, 57, 30, 73, 73, 76, 13, 89,137,183,161,106, 81,109,255,161,117, 60, 40,
+221,213,171, 87, 37,173, 91,183,134, 70,147,191,100, 28, 77,211,216,187,119, 47,203, 48,204,181, 82,173,150, 6,195, 15, 33, 33,
+ 33, 46,106,181, 26,159,127,254,249,212,249,243,231,203,248,124,126,254,251,101, 52,126, 96,185, 90,188,102,207,197,233, 63,108,
+184,118,241,192, 50,197,226,217,163,218, 14,153,252,227, 53, 0, 23, 74,227,101, 24,102,247,218,101,223,210, 34,107, 3, 72,227,
+ 78,208, 39,169,241,126,219, 88,232,178, 53,168,179,104, 1, 0, 33,116, 6, 10,103,123,245, 3,101,171,192,152, 86, 45,120, 91,
+110,222,222, 13,160,183,185,106, 54,195, 12, 51,254,255, 91,176, 88,246,230,235,232,119,221, 58,117, 12,114, 59,115,227,217,163,
+241, 35,187,119,166, 40,138, 60, 14,123,127,195,179,134,179,253,181,235, 55, 57,150,101,111,154,114, 49, 62,159,223,163,101,203,
+150,188,140,140, 12, 40, 20, 10,164,164,164, 32, 62, 62, 30, 6,131, 1,154,172, 76,232,114,178,161,203,206,130, 81,149,131, 55,
+193, 15, 81,175,186,155,232, 74,190, 19,252, 1, 83,248, 75, 90,168, 10, 23,253, 5, 33, 16, 89,200, 33,146,203, 43, 94, 9,190,
+ 4, 20, 10, 69, 47, 75, 75,203,111,114,114,114,206,197,199,199, 47,214,233,116,147,126,250,233,167, 71, 11, 23, 46,180,159, 61,
+123,182,229,172, 89,179, 14,187,187,187,251, 85,228,135,100, 97,107,236,215,180, 97,109, 58,242,253,115, 4,214,233,135,154,138,
+150,136,138,207, 66,122,142, 22,105, 89,106,212,173,243, 53,146,210,242,144,165,210,224,217,171,125,112,117,174, 69,209,252, 55,
+ 93,202, 17, 88, 72, 74, 74,250,224,158, 15,236,223,143,188,172, 44,120,122,122,194,219,219, 27, 14, 14, 14,120,255,254, 61,110,
+223,190,141, 33, 3, 62, 5,159,223, 23,201,201,201,229,222,239,174, 80,142,175, 80, 40, 66,148, 74, 37, 66, 67, 67,241,230,205,
+155, 82,135, 85,127,255,253,247,252,134,215,217,217,228,188,116,114,114,250,150,162,168, 1, 0,104, 0,177,148, 66, 81,219,193,
+193,193,169, 69,239,222,200,226,243,233, 95,174, 93, 35, 60, 43, 43, 57,128,204,138,184, 44, 45,209, 61, 48,176,165, 48, 51, 99,
+ 7,128,124,163,212,168,145, 14,232,218,197, 9,132, 18, 65,225, 98, 1, 66,137, 64,136, 16,121,170,171,240,169,239, 43,176,176,
+ 56,214,163, 60,129, 85,232,208, 94,191,126,125, 76,152, 48, 1, 39, 78,156,192,174, 93,127,156,222,183,111, 95,124,246,217,103,
+200,205,205,133,147,147, 19, 79,169, 84, 70, 5, 4, 4, 84,232,248,110,233, 73, 22,107,245, 47,231, 90,123,201, 82,140,176,111,
+158,107, 16,165,205, 91, 25, 53, 15,192,170,174,158,158,219,244,236,205,232,200,231,167,109,222, 62,186,158,174,140, 84,121,108,
+ 59, 27, 85,166, 15,214,141, 27, 96,157,124,111,232, 63,237,210,134,215,187,103,187, 60, 87, 55,167, 58,191,108,208,237, 77,119,
+181, 91,236, 94,221,109,200,188,159,190,209, 15,237,211, 74,255,205,204, 41,252,250, 62,222, 36, 59, 59, 27, 7, 15, 30,100,206,
+159, 63,159,192,178,236,244, 50,104,233, 2,161,133, 1, 3, 6,200,164, 82, 41, 98, 99, 99, 81,175, 94, 61,176,108,126,222, 38,
+164,164, 61,187,243,232,121,248,140, 9,253,219,236, 59,117,237,229,197,235,193, 47,123,119,105,209,136, 16,206,189,172,180,210,
+132, 52,245,241,245, 5,199,197,131,230,215, 65,220,222, 81,208,164,229, 64,171,210,128,226,203,160, 51,208,208,179, 4, 34,223,
+ 38,120,125,226, 20,106, 15,174, 15, 30, 33, 45,204,213,178, 25,102,152,241,255, 1, 21,170, 13, 90,163, 91,242,213, 55,115, 97,
+ 99, 37,177,106,226,239,229,124,242,194,141,224,155,119,131, 95,186, 87,179,119,224, 12, 58,155,229,171,215,187,145, 60,181,169,
+ 78,222,222,246,246,246,208,235,245,120,253,250, 53,226,226,226,160,215,235,193,168, 84,208,102,102, 66,147,145, 1,163, 42, 7,
+ 2,163, 17,234,148,100,216,136,133,192, 31, 51, 12,203, 51, 85,254, 33,166, 74, 17, 92,132, 16, 72, 44, 45, 33,178,176, 0,197,
+163, 77,206, 28, 23, 23,151, 0, 63, 63,191, 67, 87,175, 94, 13,106,217,178,229, 34,119,119,119,171,196,196,196,247, 73, 73, 73,
+ 29, 86,172, 88,161,117,112,112,192,144, 33, 67,234, 26, 12,134,225, 21,113, 9, 68,218,134,213,157,188, 80,205,233, 83, 40,236,
+155, 34, 61, 91,139,228, 76, 53,146,210,242,112,240,216, 64, 92, 58,247, 57, 30,223, 30,134,215, 15, 70, 33, 53,215, 18, 98,219,
+118, 0,184, 6,229,113,222,189,123, 23,155, 55,111,198,230,205,155,177,105,211, 38,172, 95,191, 30, 25, 25, 25,104,208,160, 1,
+ 98, 98, 98,112,254,252,121, 36, 36, 36,192,222,222, 30,143, 31, 63,198,150, 45, 91,240,240,225,195, 74, 23, 18,141, 70, 3,129,
+220, 78,191,234,171,193, 88,245,213, 96,176,124,153,190,152, 0, 55,189,176, 81,212,136,132,222,189, 27, 38, 88, 91,251,248,250,
+250,118, 29, 48, 96,128, 71, 80, 80, 80,209,113, 79, 79,207,234, 60, 30, 47, 81,161, 80,108, 87, 40, 20,126,229, 43,127,206,223,
+198,214, 27, 58,109,120,193, 51,230,131, 16, 49,218,127,242, 18, 45, 90, 5, 67,111, 16,128, 34, 34, 80,148, 24, 12,147, 6, 75,
+ 11, 39,112, 28,105, 80, 65, 18,187, 93,184,112, 1,155, 55,111,198,219,183,111,139,132,101,143, 30, 61,166, 12, 26, 52,232,152,
+209,104,196,153, 51,103,112,226,196, 9,212,172, 89, 19,141, 26, 53,130, 94,175,239, 86,209,125,207,251, 89,121,111,223,234,243,
+159,243, 13, 54,126, 98,137,123, 77,168,228,189, 38,181,117,144, 1,192,249, 55,111,114, 28,171,103, 47, 85,229, 60,141,177,118,
+203, 93, 86,145,131, 59,199,205, 99, 67, 34,195,239,239, 59,126, 33, 43, 57, 41,131,239,223,176,190,122,201,194,175, 5,238, 53,
+107, 47,159,247,205, 4,231,248,108,113,230, 39, 83,207,135, 31,187,240, 48,119,232,200,177,204,232,113,147, 53,231, 47, 92, 62,
+206,178,108,195,178,102, 16,178, 44,139,132,132, 4,188,120,241, 2, 81, 81, 81, 72, 73, 73, 65,106,106, 42,114,114,114,138,134,
+ 21,165, 57,217,103,215,239, 60,253, 68, 38,145, 72,131, 26,122, 85,127, 16, 26,150, 44,147, 72,164, 94, 53,171,215, 33,100, 1,
+ 85, 6,175,181, 88, 34, 6, 64,144,243,252, 38, 52,233,185, 80,103,230, 66,147,145, 11,173,158,134, 70, 75, 65,173,163, 96,223,
+170, 19,114, 85, 26,104,210, 50,192,114,156,141,185, 90, 54,195, 12, 51,254, 21, 22,172,212,212,136, 92, 75, 7,159,207,190,156,
+245,195,249,253,191,254,226,168,213,230,197,216,217,200,141,114,169,208,126,244,248, 31,145,147,155,209, 39, 55,221,244, 89, 79,
+ 25, 25, 25,136,142,142,134, 68, 34,129,128,207,135, 81,173,134, 81,173,130, 58, 35, 13,148, 94, 11,129,209, 8, 91,169, 4, 53,
+ 20,206,112,119,170,216, 58, 66,179, 70,162,188,124, 14, 23,135,246,249,211,176,224,133,230,117, 33,146,203, 32,182,182, 65,139,
+ 19,183,242,133,142, 64, 0,204,171,120,145,118,103,103,103,123,133, 66,113,106,253,250,245,130,180,180, 52,188,120,241,226,201,
+187,119,239,178,108,109,109, 45,248,124, 62, 27, 25, 25,121, 37, 60, 60,188, 71,173, 90,181,192,113,156,103, 69,124, 57, 89, 50,
+189,193,192, 65,153,252, 30,113, 9, 47, 96, 41,175, 6,142,174,134,228,244, 60, 16, 56,129,209, 70,192,104,200,119,183,210,170,
+227,144,167, 51,109,221, 94,189, 94, 15,189, 94, 15,131,193, 0,173, 86,139,161, 67,135,226,206,221,187, 56,112,226,119, 68,191,
+137, 64,221,154,206, 24, 54,108, 40,252,252,252,240,232,209,163, 42, 23,148,102,223, 92,124, 33,145, 72,176,105,211, 38, 72,165,
+210, 15,196,173,137, 98,117, 85,135, 14, 29,106, 71,168, 84,120, 17, 30,142, 38,253,251, 3, 0,110,223,190, 93,116,142, 90,173,
+198,224,193,131,133,209,209,209,163,195,195,195, 71,187,184,184,172, 78, 72, 72,152, 89, 22,231,217,179,247, 48, 97, 66, 24, 82,
+ 82,242,253,176, 15,238,175, 95,116,236,109,180, 30, 93,186,231,143, 92, 89, 91, 91, 99,245,234, 6, 38,165,211,104, 52, 98,235,
+214,173, 69,195,130, 0,192,227,241, 90,204,152, 49,227,179,210,206,247,241,241,169,144,115, 70,127, 55,241,227,247,146, 73, 86,
+181,221,235, 91,218,251, 34,205, 16,218, 32, 52, 62, 97,202,140,254,110,107, 87, 31,142,211, 72,136,118, 23, 49,198, 86,227,137,
+ 53,187, 77, 73,227,155,243,235,116,214,238, 35,119, 39,166,100,127, 55,121,236, 96, 59, 75,107, 71,213,246,245, 75,108, 40,154,
+226, 78, 5,235, 51,235,123,216, 89,247,106,250,115,238,132, 47,191, 15,213, 49,177,147, 17,123, 42,162,188, 80, 21, 44,203, 66,
+169, 84, 34, 37, 37, 5, 49, 49, 49, 72, 77, 77, 45,120,247, 83,139,134, 8,171, 2, 66, 8,116, 49, 49, 72, 58,177, 29,206, 67,
+134,162,206,194,133, 48,178, 60,104,242,140, 56,210,186, 3,178, 51,213,208,177, 4,214, 1,205,209,233,204, 45, 16,214, 8,220,
+191,107,174,149,205, 48,195,140,127,135,192, 2,128,236,148,176, 40,187, 26,190, 74,149, 90, 37,117,114,116,208, 74,197, 34, 54,
+ 43, 59,135, 14,125,246, 68,159,155,240,250, 85, 37,174,247, 50, 44, 44,172, 65, 92, 92, 28, 98,222,191, 7,163, 86,129,210,234,
+192,105,242,208,177,101,115,136, 1,136, 41, 2, 1,171, 7,143, 22, 34, 39, 55, 27, 0, 94, 86, 68,202, 26, 12, 31, 84,234,132,
+ 16, 16,138,130, 88, 46,135,208, 66, 6,145,165,197, 7, 22, 45, 83, 32,145, 72,246,109,217,178,197,197,217,217, 25,171, 87,175,
+134,139,139, 75,189,142, 29, 59,230,181,105,211, 70, 98,111,111,143, 58,117,234, 32, 48, 48, 16,215,174, 93, 3, 33,228, 77, 69,
+124,140, 78, 24,242, 50,154,169,150,149,243, 24,247, 67,247,192,160, 51,192,179,206, 28,168, 13,118,144, 57,140,134, 70,119, 10,
+198,204,235, 0, 0,161,101, 91, 36, 38,166, 2, 32,207, 43,243, 48, 57,142,195,211,167, 79,177,255,228, 13,184,212,240, 70, 76,
+100, 56,194,175, 93,193, 29, 7, 59,184,251,212,135,193, 96, 48, 89, 16,153,122,158,169, 13, 48, 33,100,240,216,177, 99,145,201,
+227, 1,221,187, 67, 16, 21, 5,189, 94,143,166, 77,155,162,113,227,198, 0,128,166, 77,155,130,166,105,212,174, 93, 27,118,118,
+118, 56,122,244,232, 96, 0,165, 10, 44,142,144,199,172, 49,173,158,135,135, 71,145,192,218,189, 39, 5,161,193,159,128, 64,136,
+117,235,255,136,202, 80,189,122,117, 36, 38, 70,131, 16,174,162,252, 60,215,189,123,247,110, 54, 54, 54, 24, 53,106, 20,196, 98,
+ 49,250,244,233, 3,141, 70, 51, 0, 0,150, 46, 93,138,111,191,253, 54,223, 42, 53,111, 30,230,207,159,143,188,188,188, 50,135,
+134,247,172,241, 85, 36,167,179,163,157,156, 93,251,180,179,119,111,216,190,115, 71,212,242,106,143,246,157, 99, 0,224, 39, 91,
+222,187, 1, 43,230, 54, 56,110, 95,205,118,199,165, 11,151,231,181,108,211,254,187,217,227,109, 22, 47,221,146, 81,161, 79, 99,
+214,251, 93, 57,175,132, 3,215,252,178,121,207,154, 31,190,157, 38,142, 73,209,101,196,103,112,185,114, 17, 79,238,233, 68,228,
+ 83,102, 45,138, 86, 42,163,102, 34,246, 66,132, 41,207, 48, 42, 42,170,200,103, 79,163,209, 64,165, 82, 33, 54, 54,182,232,249,
+170,101,150, 93, 38,143,236,217, 72,165, 86,231, 61,120, 22, 25, 51,119,234,144,102, 42,181, 58, 47,242,109, 76, 4,199,253,204,
+150,241,204, 51,243, 84,121,182,218, 44, 13,178,158,188,130, 93,251, 26,208, 51, 4, 90,163, 17, 25,169, 57,208, 49,128,129,230,
+195,173,223, 48, 24,192, 67,118, 74, 34, 40, 66,204,241,176,204, 48,195,140,127,143,192, 34,132,144, 70, 13,107, 40, 86,204, 27,
+226,198, 50, 76,221,228,212, 36,134,199, 19,241,171, 89,169, 19, 42,115, 49,131,193,112,230,214,173, 91,189, 91,182,108, 41,138,
+124,246, 4,186,172, 44,232,178, 50,193,103, 25,216, 74, 2, 65,233,181, 32, 58, 29, 92,235,177,208,228, 72,112,247,225, 43,131,
+193, 96, 56, 83,174, 16, 0,199,177, 76,190,192, 34, 20,245,193, 80,161,200,202, 2, 34,185, 28, 34, 11,139, 82,135, 16,203,130,
+147,147,147,180,107,215,174, 29,252,253,253,193,113, 28, 86,172, 88, 1,189, 94, 47, 52, 24, 12, 69, 22,163,220,220, 92, 28, 57,
+114, 4,123,246,236,185, 99,101,101, 85,225,212,114,150,209,158,191,122,251, 73,183, 33,125,218, 9, 47, 95,223, 6,131,142, 69,
+182,198, 18,185,106, 45,114, 53,124,104, 69,157, 65,200, 45, 80,180, 8,205,253,106,227,234,237, 8,141,209,160,191, 80, 89, 33,
+164,209,104, 16, 27,243, 14,113,111, 34, 32,207, 78,132,131,165, 20,121, 81, 17,240, 27, 54, 28, 58,157,174,194,123, 31,225, 79,
+ 12, 51, 26,128,183,186, 43, 5,129,220, 78,223,236,155,139,101,134,138,144,203,229,149, 26, 34, 76, 77, 77,197,233,211,167,209,
+180,105, 83,180,105,211, 6,241,241,241,136,138,138, 66,183,110,127,140,178, 61,121,242, 4,161,161,161,240,244, 44,223, 40,152,
+157,205,157, 75, 79,127,221,191, 87,175, 94,130,251,247,239,131,227, 56,120,121, 89,194,210, 66, 6, 66,137,224,237,237, 8, 32,
+ 95,251,183,109,219, 22, 58, 93, 60,163, 82,225, 92,121,156, 33, 33, 33,221, 3, 2, 2,106, 25, 12,134,136, 54,109,218,240, 94,
+191,126,141,126,253,250,225,224,193,131, 0,128,217,179,103, 99,246,236,217, 31,252, 39, 55, 55, 87, 83, 22, 95,221,134,245,190,
+174,197,216,180, 17, 75,220,107, 90,218,251,162,150, 87,123, 0,192, 39, 61, 70,161, 86,237,234,200, 78,125, 90, 83,163,126,215,
+ 71,192,203,176,121,186, 46, 62, 76,210,189,193, 72, 77,242,245, 72, 0,166, 4,238,229,212,145, 7,147, 98,248, 67, 15,157, 56,
+117,126,124,183, 30,159,242, 13, 70,134,105, 80,131,111,125,248,248,217,228,248,247, 49, 63, 35,230,194,243,162,215,164,124,129,
+101,204,206,206,134, 76, 38, 67, 84, 84,148,182,103,207,158, 34,181, 90,141,215,175, 95, 23, 9, 44, 71,123, 91,159, 22,141, 27,
+212, 91,188,102,207, 69,153, 72, 36,234,220, 54,208, 59, 44,242,125, 28,199,145,119,101,242,114,220,253,215, 47, 95,117,119,116,
+169, 13,229,141,251,144,182,236, 6,173,150,130, 70,199, 66,203, 0, 12, 45,128, 85,163, 32, 72, 60,188,193, 1,120,249,236, 9,
+ 24,142,187, 99,174,150,205, 48,195,140,127,141,192,178,183,183,119,244,247, 15,244,220,246,235, 33,112, 28,135, 87,161, 43,145,
+145, 28,142,239,127,186,231,233,230,230,214, 38, 46, 46,238,134, 41, 60,113,113,113, 7,143, 30, 61, 58,211,215,199,199,191,166,
+155, 27,158,188,123, 11, 1,103,132,192,104, 4,165,215,130,103,212,193,173,129, 17, 20,145, 35, 33, 33, 27, 91, 46, 92,121, 30,
+ 23, 23,119,176,220,198,129,208,168,214,179, 47, 6,125,210, 29,156, 65,143, 75,173,124, 32,182,144, 67,100,109,141,230, 71,174,
+131, 16, 2,142, 49,224,253,146,175,192,151,201, 97,219,172,226, 80, 64, 73, 73, 73,121,181,107,215, 14, 14, 15, 15,111, 92,183,
+110, 93, 44, 88,176, 0,177,177,177,224, 56, 14,201,201,201,154,148,148,148,248,180,180,180,119,132,144,227, 74,165,114,155, 41,
+145,194,147,109, 50,118, 95,254,253,202,215, 1,126, 62, 94,159,180,153,143, 51,103,230, 33, 35, 43, 27,121, 58, 62,114,212,122,
+168,212, 28, 92, 45,189,208,196,215, 23, 41,233, 58, 68,190, 8,137, 75, 21,216,110,173,140,245,138,162, 40, 60,121,242, 4, 30,
+ 10, 11, 68,220,186, 1,123, 41, 31,141, 20,206, 80,180,104,137,168,168, 40,211, 68,176, 17,188,226,179, 5,173,173,173,145,149,
+149,245,129,144,147, 74,165, 80, 40, 20,200,206,206,198,145, 35, 71,192,153,214, 40, 26,116, 58, 29,234,213,171,135, 71,143, 30,
+225,202,149, 43,104,223,190, 61,218,180,105,131,167, 79,159,226,210,165, 75, 8, 13, 13, 5, 33, 4,118,118,118,133,190, 63,101,
+ 70,180,127,248,240,201, 97,185,156,204, 25, 57,114, 98,253, 33, 67,134,224,232,209, 3, 24, 53,178,110,129, 99,187, 8,159,246,
+172,139,133,139, 30, 33, 40,168, 45, 28,236, 5,184,124,229, 69, 52,143,103,181,199,132,124,252,229,151, 95,126,225,169,213,106,
+228,230,230, 66, 46,151, 35, 45, 45, 63, 28, 85, 25, 22,172, 50, 3,171, 61, 11,121,185, 50, 51,135,203,224,114, 67,251,164, 51,
+161, 13,219,119,142,197, 39, 61, 70,226,242,153,157,184,122,241, 10,108,121,239,222, 66,150,115, 62,245,109,106,118,130,202,107,
+179,119,192, 24, 58, 78,117,113,243,212, 94, 54,180,139, 11,123,120,246,198,172,204,114,210,201, 17, 66, 72,122,216,222, 83,199,
+ 57,124,218,188, 89, 80,237, 6,213, 93,132, 25,169,201,220,145,147,231,159,235,223, 30, 61, 93, 40,172, 76, 88, 21, 97,225,218,
+181,107,127, 0, 0,150,101,119,173, 89,179,102,204,215, 95,127,237,160, 84, 42,139, 4, 86,114,106,250,213,230,221,167, 24,211,
+ 50,179,116, 59,214,204,234, 39, 17,139,132,115,151,238,184,110,160,113,191,204,202,133,199, 27, 62,103,211,111, 41, 71, 15,239,
+164,237,197, 2,220,153, 61, 15,111,174, 92,131,158, 18,160,243,165, 7,208,233,141,200, 78, 73,195,181,209,147, 96,237,108,131,
+115,169,145,198,172,156,236,225,230,106,217, 12, 51,204,248,255, 0,147,166,212,165,166,166, 38,223,188,249, 0,215,207, 44,198,
+141, 51,139,241, 34,244, 9,148,241, 58,196, 39,105, 96,105,105,121,175, 28,203, 87,199,146,141,130, 70,163,249,108,205,218,181,
+137, 82,153, 12,173, 59,116,128,179,131, 35,164, 2, 62,104,134, 5, 77,248,200, 77,177, 70,228, 51, 53,150, 28, 63,147,172,214,
+104, 62, 43,217, 56,148,228, 44,182, 31, 32, 4, 18, 75, 11, 8,229,114,136,139, 91,173, 8,129,192,194, 18, 2, 11, 75,208, 2,
+ 97,133,233, 4,128,188,188,188,190,227,198,141,203,200,201,201,193,160, 65,131,112,255,254,253,208, 11, 23, 46, 88, 94,185,114,
+ 69,242,236,217,179,218, 74,165,178, 83,124,124,252,150,178,196,213,159,238,253,250,117,134, 99,244,125, 55,108,218,150,174, 54,
+ 56,161,103,175, 13,176, 20,166,193,192, 24, 1,142,131,171,131, 28, 77, 90,124,133,100,109,115,156, 57,125, 38,131,101, 52,125,
+ 75, 46,153, 83,156,147,227, 56,206,206,206,238, 3,171, 28, 69, 81,184,126,253, 58,250,247,235,139,206,125,122,195,161,166, 7,
+ 28, 59,118, 67,231, 49, 19,176,101,203, 22, 80, 20, 5, 91, 91,219, 15, 44, 26,101,229,103, 33,178,178,178,224,238,238,142, 7,
+ 43,186,213, 63, 63,163,158,127,245, 55,191,248, 75, 31,175,170,127,245,234, 85,172, 90,181, 42, 55, 34, 34, 98,181,151,151,215,
+ 87, 21,229, 39, 33,228,187,159,126,250, 73,253,254,253,123,200,229,114, 48, 12,131, 59,119,238, 96,227,198,141, 88,181,106, 21,
+ 66, 67, 67, 97,103,103,135,218,181,107,131,162, 40,196,196,196,168, 9, 33,223,149, 83,150,216,156, 28, 94,223, 75,151,142,167,
+245,236,217, 26, 59,118,172,135,179,115,115,240,121,206,224,241, 29, 32,147,215,195,246,109,203,208,189, 91, 0, 94,134, 63, 78,
+207,205,229,245,189,126,253, 58, 99, 66, 58,245,207,158, 61,195,177, 99,199,176,112,225, 66,102,193,130, 5,200,202,202, 42,178,
+ 96, 21,174,146, 62,127,254,124, 0,128, 86,171, 21,149,197, 57,102,214,179,248,175, 23, 63, 95,152,148, 24,223,244,198,181,123,
+131,175, 94,188,130,232,200,171,184,122,241, 10,110, 93,189, 59, 59, 41, 49,190,169,127,147, 58,130,207,198, 76,254,122,247,177,
+163,180,220,210, 5,187,143, 29,165, 7, 77,153,254, 99, 96,231,246,223,153,240,140, 56, 0, 92,110,114,210,183, 63,173,252, 37,
+151,209,107,168, 21, 63,111, 80,170, 83, 18,190, 67,225,212,202, 50,172, 87,197, 57,163,162,162,182,188,125,251, 86,241,246,237,
+ 91,197,251,247,239,191,139,143,143,111,189,100,201,146,148, 2,193,149, 47,176, 94,156,188,247,242,214,206,159, 28,237,109, 36,
+205, 27,215,175,187,122,203,145,235, 49,177, 73,191, 21,198,192, 42, 45,157,247,238,221,203,208, 26,152,113, 95,205,154,207,101,
+102,234, 80,119,218,108, 48, 34, 57,180, 12,160,103,105,232,193, 67,232,226,213,176,176,179,192, 29, 46,131,211,210,212,216, 55,
+ 37,156,252, 43, 42,159, 85,129,153,211,204,105,230,252,103,114,254, 43, 45, 88,174,174,174,173,123,125,218, 17,109,123,204, 5,
+199,113, 8, 15, 89,142,140,148, 87,112,117, 22, 33, 42, 38,187, 25,128, 27,166, 94, 48, 33, 33, 33,198,197,197,165,233,226,181,
+235,142,117, 14,106,226,237,229,234, 34,178,118,175, 1,153,163, 35, 82, 83, 83,112, 63, 56,194,176,233,210,213,231,106,141,198,
+164,165,114, 88,150,229, 88,150,133, 64, 32, 0, 71,211,240,153, 58, 27,132,162, 64,241,121, 69,150, 29, 16, 2,203,128, 22, 32,
+124, 62, 12, 38,250, 12, 41,149,202, 56, 87, 87,215,190, 83,166, 76,249,125,215,174, 93, 84,219,182,109,253, 78,157, 58,197,254,
+149,204, 78,122,118, 60,204,169, 97,159, 54,235,126,217,120,196, 63,176,105, 13,247,154,238,162,230,110, 86,208, 27,140, 72, 74,
+ 78,195,141,187, 47,180, 17, 97,143,227, 57,189,190,111,114, 88,217, 81,220, 1,192, 96, 48,196,184,185,185, 57, 45, 88,176, 0,
+ 12,195,128, 97, 24, 24,141, 70,164,166,166,226,222,189,123,104,216, 56, 8,222, 35, 71, 35, 37, 37, 5,235,214,173,131,155,155,
+ 27,126,250,233, 39,228,228,228,224,230,205,155,101,230, 43,159, 6, 51,120,112, 65, 28, 44, 30,152,213, 61,122, 92,175, 95,191,
+126,203,166,134,100,193,188,117,249,150,173,105, 99, 7, 11,174,199, 92, 63, 44, 18,137,182, 68, 71, 71,151,235, 47,228,233,233,
+ 41,212,104, 52,126, 28,199,209,217,217,217,107, 53, 26,205,136, 25, 51,102,184, 44, 93,186, 20, 94, 94, 94, 72, 77, 77,133, 76,
+ 38,131,151,151, 23,114,114,114, 16, 29, 29,109,212,235,245,155,141, 70,227,194,164,164,164,148,242,184, 31, 62,124,248,218,223,
+223,191,105,114,210,166, 99, 19, 39,116,246, 50, 48,129, 66, 75,203, 86,224, 56, 3, 50, 51,226, 0, 60,213, 31, 63,113,229, 77,
+102, 38,253, 89,112,112,112,164, 73, 61, 14,138,154,176,102,205, 26, 20, 46,149, 19, 31, 31, 95,100,250, 43,205,130,101, 10, 86,
+ 31,142,211, 0,216,191,226,203,230, 95,102,167, 62,245,178,229,189,123,219,180, 1,187,110,245,225, 56,205,130, 47,173, 23,167,
+190,187, 17,145,160,186,184,121,247,177,163,244,240, 62,125,141,110,242,200,217, 98, 71,238, 72,251,158, 21, 90,219, 56, 63, 63,
+191,106,132,164,215, 74, 78,123, 21, 60,106,204,248, 1, 86, 2,245,185, 70,110,105,158, 84,117,127,113,104,104,232, 91, 83,215,
+244, 44, 81,246, 35, 20, 10, 69,235,149, 43, 87, 94, 4,240,129,143, 89,114,106,250,213,102, 61, 38,115,153,153, 89,143,147,195,
+ 78, 62,171,136, 43, 56, 56,120, 71, 96, 96, 32,134, 13, 29,181,117,236,232,177,116,131,169, 95, 35,254,250, 85,192,104, 64,226,
+173, 27,144,200,141, 56,147,250,206,152, 71, 83,227,130,131,131,205, 81,220,205, 48,195,140,127,151,192,138,139,139,187,225,233,
+225,118, 41, 34,162,117,167,234,110, 14,249,189,222,183, 74,196, 39,105, 47,153, 58, 60, 88, 82,100, 17, 66, 2,207, 50,204,192,
+ 75,124,126, 15, 82, 16,138,129,171,194, 98,207,121,121,121, 73, 77,155, 54, 45, 35,246,194, 79,165,238, 53, 26,141,113,166,112,
+199,199,199, 95, 87, 40, 20, 67,155, 55,111,190, 84,169, 84, 30, 75, 73, 73, 81,253,213, 12, 79,122,118, 60,140,180,109, 91, 63,
+248,193,205, 97,161,193,247,123,112, 28,231, 11,128, 16,138,250, 99,177,231,176,138, 23,123, 86,171,213,227,231,206,157,187,133,
+199,227, 85, 71, 65,224,208,194, 44,211,235,245,244,142, 29, 59,196, 58,157,142, 6, 64, 4, 2, 1, 35,151,203, 53,119,238,220,
+ 97,140, 70, 99,140,193, 96, 24, 95, 22,239,174, 80,142, 95,114,159,143,143,143,236, 53, 15,185,133,191,211,212,128, 82,169, 92,
+110,202,253,158, 59,119,206,221,198,198,166, 19, 33,164, 31,199,113,245,114,114,114,180, 63,252,240,195,221,107,215,174,101,191,
+122,245,170, 75,171, 86,173,136,179,179, 51,162,163,163,185,220,220,220, 35, 20, 69,125,167, 84, 42,163, 76,205,207,208,208,208,
+ 40, 66, 72, 35, 85, 30,247,185,133,252, 66,119,150, 67, 35,128, 35,132,144,103,185,185,228,156,139,139,199,111,151, 47, 31, 54,
+121, 42, 92,193,218,130,189, 10,127, 7, 4, 4,156,123,245,234, 85,183, 66, 11, 86, 73, 31,172, 74, 65,154,123, 74,163,126,215,
+151,200,243,142,175,254, 57, 78, 3, 0,243,214,100,102, 1,216, 62,181,143, 45,251, 50,100,251,114, 87,203,200, 89, 63, 31, 79,
+ 55,105, 77, 62,127,127,127, 15,138,162, 6, 2,104,224, 40,202,172,237, 32,204, 50, 18,194,181, 35,132,178, 7,240,212,199,199,
+231, 12,128,184,170, 36, 85,169, 84, 70, 0,168, 81,114,127,242,139,147,247, 0,220,171, 12, 87,112,112,240,142,102,205,154,157,
+220,176,117,243,110,154,144,166,196,104,180, 54, 78, 24,244,199, 98,207, 34,225,240, 96,243, 98,207,102,152, 97,198,191, 81, 96,
+ 1,192,155,168,184,206, 0,224,229,229,197,189,126,253, 26, 28,199,145,191,114,225, 2, 1,117, 0, 38, 6, 17, 45, 11,207,159,
+ 63,247,255, 79,102,144, 82,169,220, 15, 96,255,199,228,228,242,135,170,118, 20,108, 85, 66,124,124,252, 51, 0, 65,255,141, 66,
+ 18, 22, 22,166, 26,225, 79,138, 44, 91,124, 26,140,169,255,237,212,169,211,123,189, 94,127, 5, 64, 44, 33,196, 26, 64,186, 94,
+175,191,152,146,146,146,228,236,236, 28,248,254,253,251,239, 11, 44,145,139, 18, 19, 19,131,171, 88,150, 88, 0,251, 10,182,143,
+138,144,144,144,238, 10,133, 34,212,206,206,206, 83,163,209, 8, 53, 26,141,160,184,246,151, 72, 36, 41,166,114, 89, 91,144, 93,
+ 2, 94,134,157,181, 5,249,211,115,183,117,197, 81,181,234,121, 93, 91, 87, 28,173,140,184,244,243,243,219, 75, 81, 84, 77,142,
+227,156, 0,206,138,227,144,194,113, 92, 42,143,199,139, 15, 11, 11,139,255,167, 84, 52,247,242, 5, 84, 15,115,149,107,134, 25,
+102,152, 5, 86, 25,136,140,140, 36,230,108,251,247,161, 52,203,150, 41, 40,136,112,127,183, 96,251, 0, 5,130,170,231, 63,253,
+222,149, 74,229, 71, 17,241, 99,102, 61,139, 7, 48, 61,176,148,121, 22,243,214,165,231, 0,248,186,221,167,149,227,124,252,248,
+113, 12,128, 24,115, 9, 53,195, 12, 51,204,248,103,129, 50,103,129, 25,102,152, 97,134, 25,102,152, 97,198,199, 5, 1, 80,234,
+ 76,128,202,172,148, 93,149,217, 4, 21,241,155, 57,205,156,102, 78, 51,167,153,211,204,105,230,252,255,199,249,175, 65,225,180,
+243,255,196, 6,160,163,153,211,204,105,230, 52,115,154, 57,205,156,102, 78, 51,231,191,109, 51, 15, 17,154, 97,134, 25,102,152,
+ 97,134, 25,102,124,100,148,233,228,238,225, 81,205,135, 50,178, 45, 56,142,162, 57,138, 51,144,108,245,193, 55,233,233, 31, 4,
+ 1,172, 94,189,186, 53,159, 66, 79,194,113, 50, 66, 88, 35, 75, 83,119,162,162, 98,195, 76,185,176,143,143,143, 0,192, 8, 62,
+159,223,210, 96, 48,184,240,120,188, 4,141, 70,115,155,207,231,239, 10, 11, 11,211,255,147, 50,169,101,203,150,131,142, 28, 57,
+ 98,221,163, 71, 15,173, 94,175,103, 68, 34, 17,111,223,190,125,162,145, 35, 71,102,222,190,125,187, 74, 51, 12,253,252,252,218,
+175, 88,177,162, 86,251,246,237,209,178,101, 75, 85,183,110,221, 4,129,129,129,130,175,191,254, 58,250,241,227,199, 87, 43,195,
+229,228,228,228,195,227,241,246, 16, 66,104,142,227,134, 21,204, 48,252,143,128, 16, 50, 8, 64,127, 0, 46, 0, 18, 1, 28,226,
+ 56,110,127, 21,185,186, 32,223,201,221,183, 96,215, 83, 0,167, 57,142,187,240, 23,210,215, 5, 64, 79,154,166,253, 0,192,104,
+ 52, 62,254, 88,156,124, 62,191, 17, 0, 24, 12,134, 39, 31,139,147, 16,210,168,192,146, 92, 37,206,128,128,128, 31,132, 66,225,
+ 88, 0,208,233,116, 59,228,114,249,146,210,206,187,113,227,134,174,172,208, 39, 62,181, 8, 23, 54,171, 94,254,247,229,225, 0,
+128, 10,127, 71, 87,113, 22,241, 22,111,174, 52, 94,140,127, 89,229,201, 51, 10,133,226,139,110,221,186,125,115,225,194,133, 31,
+227,226,226,182, 86,246,255, 71,142, 28,161, 77, 57,239,243, 89,219,123,200,229, 54,223,231,102,103, 45, 61,176,114,212,241,194,
+253,253,250,245, 51,194, 12, 51,204, 48,195, 20,129,229,225, 81,205,167, 95,239,207,126,154, 48,126, 34,161,105, 10, 47,195,195,
+121,147,166,126,217,201,219,219,219, 85,166,209,120,115, 0,171,150, 72,158,211, 52, 21,191,105,195, 47, 22,117,235,212, 49, 26,
+141, 44, 54,111,217,212,213,195,163,218,156,138, 68,150,163,163, 99, 45, 23, 23,151,181, 83,167, 78,117,236,212,169, 19,229,228,
+228,132,184,184, 56,203,227,199,143,215,254,245,215, 95,123, 56, 58, 58, 78, 79, 78, 78,142,174,202, 13,185,184,184,180,114,180,
+ 70, 39,185,152,235,128,108,130, 92, 35,126, 79,214,226, 82, 66, 66,194,173,170,102,146, 78,167,155,146,151,151, 23,228,237,237,
+205,109,222,188,153,140, 29, 59,150, 35,132, 16,181, 90,189, 11, 85, 12,225, 32,149, 74, 55,180,111,223,222,171, 69,139, 22, 81,
+119,239,222,237,198,113,220,185,126,253,250,121, 72,165,210, 72, 0,117, 42,195, 69,211,244,206,176,176,176, 70, 26,141, 6, 1,
+ 1, 1,191, 2, 8,248, 15,137,171, 95,237,236,236,216, 77,155, 54,109,105,216,176,161,167, 74,165,202, 27, 51,102, 76,103, 66,
+ 72,123,142,227, 70, 87,130, 71, 6, 96,157,149,149,149, 96,241,226,197,247,219,182,109, 27, 35, 20, 10,165, 17, 17, 17,220,212,
+169, 83, 71, 17, 66,250, 1,152,202,113,156,170,178,156, 10,133,194,114,217,178,101,175,252,253,253,239, 10,133, 66,193,219,183,
+111, 49,109,218,180, 9,127,133,179, 94,189,122,210,101,203,150, 61,241,246,246, 78, 19,139,197,130,247,239,223, 99,198,140, 25,
+ 99,104,154,238,199,178,108,149, 56, 29, 29, 29,101, 75,150, 44,121, 22, 24, 24,152, 41, 22,139, 5,111,222,188,225,190,252,242,
+203,177,149, 73,103,155, 54,109, 62,167, 40,106,193,205,155, 55, 1, 0,205,154, 53,251, 65,167,211,205, 45,121, 30,199,113,104,
+217,178,165,166, 77,155, 54, 99,111,220,184, 81,106, 88,148,221,162, 89,131, 0,224,235, 31, 10,126, 23,236, 47,237,247,112,237,
+242, 74,151,121,159, 90,132, 3,128, 73, 95,109, 28,154,255,153,191,127, 83, 65,232,222, 13,181, 8, 87, 25,209,230,234,234, 58,
+190, 73,147, 38,223, 62,120,240, 96,119, 96, 96,224,180,173, 91,183,242,123,244,232,177, 88,161, 80,120,118,233,210,165,223,189,
+123,247, 86,132,135,135,111,248,152,229,223,217,185,218,250, 85, 63,111, 85, 76,159, 60,122, 41,128,227,230,230,195, 12, 51,204,
+168,180,192,162,140,108,139, 9,227, 39,146,129,131, 62, 79, 76, 72, 74,102,229, 22, 86,131, 14, 29, 62, 44,173, 83,167, 14,165,
+249,229, 23, 48, 41, 41, 48,206,156,217,252,198,141, 27,134,201,211,103,170,181,154,188,157, 46, 78,142,210,131,251, 15, 56, 31,
+ 59,122,164, 5,128,176,242, 44, 87, 46, 46, 46,107,143, 30, 61,234, 92,171, 86, 45,232,116, 58,164,165,165,193, 96, 48,160, 79,
+159, 62,116,211,166, 77,157, 71,141, 26,181,214,199,199,231,179,202, 88,178, 28, 28, 28,156,188,170,243,207,204,155,222,181, 78,
+251, 54, 1, 50,103,215,154, 64, 28,139,248,232,215,141,175, 60, 8,153,218,210,211, 45, 34, 50, 91,215, 35, 37, 37, 37,169,178,
+153,148,150,150, 54,107,252,248,241, 71,125,125,125, 29, 68, 34, 17,156,157,157,201,152, 49, 99,146, 19, 18, 18, 22,252, 5,177,
+146,159,215, 20,101, 44,254,105,234,130,212, 37,224,102,101,101, 5, 43, 43, 43, 0,112,253, 43, 5,162,127,255,254,116, 76, 76,
+204, 88,150,101,189,139,239, 79, 72, 72,240,112,112,112, 72,122,251,246, 93, 35,181, 78, 31, 56,113,242,156,249, 3,251,117,180,
+190,123,247, 46,186,119,239, 78, 17, 66, 6, 85,194,146,181, 46, 40, 40, 40,114,233,210,165,130,200,168,183,245,239, 63,122, 12,
+153, 88, 96,116,115,115, 21, 61,125,250, 84,184,108,217,178,164, 31,127,252,113, 29,128, 81,149, 72,250,186,254,253,251,103, 76,
+159, 62, 61, 47,226,205,219,154, 15, 66,159,113,114,145,192,224,228,228, 64,223,189,123,151,191, 97,195, 6,242,221,119,223, 85,
+154,115,204,152, 49, 9,211,167, 79,231,165,164,101,214, 78, 76, 74,229,132, 2, 90,111,109,109,205,187,124,249, 50,181,115,231,
+ 78,253,212,169, 83, 43,205,217,189,123,247,164,217,179,103,243,195, 35,163, 60,238,135, 60,131, 92,196, 55, 56, 59, 59,210,247,
+239,223,167,215,173, 91,199,204,155, 55,207, 36, 78,142,227, 54,175, 92,185, 18, 39, 79,158, 4, 0,236,223,191, 31, 30, 30, 30,
+ 31, 12,251,171, 53, 90, 80, 4,120,251,246,173,116,194,132, 9,155, 81, 74,220,185,176, 89,245,176, 27,192,240,225,195, 19, 77,
+179, 66, 45,175, 92,161,218,226,205, 21, 10,171,137, 19, 39,150, 21,155,107,168, 79, 37, 68, 86,139, 22, 45,190, 57,120,240,160,
+253,225,195,135,191, 58,126,252,120, 97,167, 69,186,126,253,250, 47,122,245,234,133,209,163, 71,127, 3,224,163, 10, 44,161, 64,
+ 36, 34, 20,129, 68, 44,181, 52, 55, 29,102,152, 97, 70,149, 4, 22,199, 81, 52, 77, 83, 72, 78, 74, 53,124,210,177,211,168,245,
+ 27, 55,138,132, 66, 33,116, 58, 29, 84, 87,175,130,211,104, 96, 45,149,162, 91,183,110,252, 6, 13, 26, 88,142, 31, 51,102, 76,
+ 82,162,114, 11, 77, 83,206, 28, 71, 85,100,110, 31, 49,117,234, 84,199, 90,181,106,125,176,211,104, 52, 34, 61, 61, 29, 22, 22,
+ 22, 24, 48, 96,128,253,222,189,123, 71, 0, 48,201,220,239,228,228,228, 94,199,195,233,206,145,237, 51, 93, 28,173, 41, 32,229,
+ 8,240,254, 53,176, 79, 12, 47,199,234,240,106,215, 86,214,171, 73, 67,255, 1, 43,118,132, 58, 57, 57,181, 72, 74, 74,122, 87,
+153, 76,122,251,246,237,109,133, 66, 49, 70,173, 86,159, 4, 64,221,185,115,135,139,137,137, 25,159,152,152,248,190,170, 25,207,
+178, 44, 50, 51, 51,193,178, 44, 93,240,187,240,243,111, 43, 12,253,251,247,167, 99, 99, 99,199,123,123,123,215,222,182,109, 27,
+146,147,147, 33,145, 72, 96, 52, 26,209,188,121,243,234, 29, 58,116,120,147,146,150,105, 99, 96, 12,186,132,184, 55, 77, 14,108,
+125,151,215,200,203,235,238,161, 67,135, 26,218,217,217, 13, 48,197,154, 71, 8,233, 98, 97, 97,193,251,233,167,159, 40, 11,107,
+231,238, 77,130, 20,252,103, 97,175,222, 9, 68, 60, 54, 43, 43, 59,237,201,147, 39,225,243,230,205,107,117,234,212,169, 68, 66,
+ 72, 23, 83,134,204, 8, 33, 93,156,157,157, 45,166, 77,155,166,146, 88,216,183,108, 28,228,200,123, 30,246, 58,158, 47,160, 12,
+ 45, 90,180,104,119,239,222,189,157, 51,103,206,244, 61,123,246,108, 86,101, 56,107,215,174, 45,153, 62,125, 58,109,101,109,223,
+209,193, 89, 65, 59,216, 90,123, 2, 64, 84, 84,212,222,164,164,164,200,137, 19, 39, 54, 62,123,246,108, 78,101, 56,237,237,237,
+165,179,103,207,230,213,244,168,219,215,195,171, 46,117,229,250,131,103, 66, 33,101, 80,171,213,233, 47, 95,190,124,253,205, 55,
+223, 4,158, 61,123, 54,219, 20,206,188,188, 60, 11, 87, 87, 87, 56, 57, 57,129, 85,171,145,149,149,133, 99,199,142, 33, 39, 39,
+ 7, 70,163, 17, 18,137, 4, 63,174,222,130, 55,207,239,227,214,173, 91, 80,171,213, 22, 31,163,156,248, 44, 15, 71,216,120,211,
+197,213, 38,118,242,208,114,132, 21,138, 9,175,161,216,226,205,149, 55, 92, 88,204,114, 21,119,248,240, 97, 71, 79, 79, 79,180,
+109,219, 22, 0, 48,106,212, 40,116,236,216, 17, 39, 79,158,196,165, 75,151, 98,154, 53,107,246, 58, 54, 54,118, 85,124,124,252,
+150,143,113,223, 70,206,168, 7, 0,145, 88, 36, 10, 15, 15, 39,245,234,213,227,204, 77,136, 25,102,152, 81, 22, 74,117,114,231,
+ 8, 81,189,120,249,146, 47,183,182, 30,186,126,227, 70, 17,159,207,199,251,247,239, 17, 22, 22,134,188,223,127,135,250,238, 93,
+ 36, 37, 37, 33, 55, 55, 23, 14, 14, 14, 88,178,124,185, 76, 32,145,141,138,124,253,154,230, 40,206, 80,172,135,253,167,169,154,
+ 66,161,176,101,183,110,221,202,116,174, 79, 76, 76, 68,167, 78,157,120, 60, 30,175,101, 25,189,246, 43, 37, 26, 45,162,112, 32,
+167, 15,111,157,230,226,200,123, 6,188,158, 1,228,132, 2,156, 22, 96,116, 64, 76, 56,112, 98, 53, 92,211, 34,201,254, 41, 3,
+156, 93, 37,130,211,164,132,153,168,162, 41,165,110,110,110, 30, 30, 30, 30,219,251,245,235, 71, 1, 64,203,150, 45,137,135,135,
+199, 86, 55, 55, 55,143,114,172, 11,229,114,106, 52,154,251, 25, 25, 25,232,209,163,135, 93,243,230,205,175,244,232,209,195,174,
+112,127, 85, 57, 11, 96,215,190,125,251, 52, 15, 15,143,253,238,238,238, 34, 19,172, 32, 69,156, 49, 49, 49, 99,235,213,171, 87,
+123,219,182,109, 52, 77,211,216,182,109, 27, 14, 30, 60,136,219,183,111, 35, 57, 57, 89, 58, 99,198, 12,235, 51, 87,238, 95,184,
+115,251,225,169,149,115,191,178,235,211,161,173,135, 77, 86, 74,182,173,173,109, 55, 0,206, 38,166,179,231,220,185,115,111, 60,
+126, 25,229, 72,241,248, 2,145,128, 47,113,176,183,174,225,236, 96, 83,219,213,206,166,182,133,144,111,157,157,157, 29,125,226,
+196, 9, 6,197,130,144, 86,196,185, 98,197,138,151,225, 81,177,118, 20,205,227,243,105,190,208,218, 74,110,247,105,143, 78,237,
+ 0, 64, 66, 19, 81,118,118,118,236,222,189,123, 43,197,185,116,233,210,144,132,148, 12, 71,190, 64,200, 19, 9,248,226,194, 3,
+ 54,150,114, 39,153, 72, 36,201,203,203,123,191,125,251,118, 93, 37, 57,159,188,136,124,111, 79, 40,208, 20, 8,223,198,198,194,
+209,193,218,194,217,209, 82,238, 44,166, 32,206,206,206,126,183,127,255,126,189,169,156,201,201,201, 8, 15, 15, 71,181,198,141,
+113,229,202, 21, 84,175, 94, 29, 3, 6, 12,192,231,159,127, 14,137, 68,130,246,205, 26, 98,206,156, 57,120,243,230, 77,153,207,
+189,208, 31,170, 60, 40, 20,138,235,149, 41, 75, 64,254,176, 96,121,226,170, 36,103,105,231,149,228,108,209,162,197, 55,199,142,
+ 29,179, 95,179,102,141,223,151, 95,126, 25,117,236,216, 49,248,250,250,226,229,203,151,112,117,117,197,129, 3, 7, 48,121,242,
+228,168,249,243,231,251, 93,190,124, 89,161, 80, 40,102,153,250, 30, 13, 27, 54,172,101,255,254,253,111,245,239,223,255,241,192,
+129, 3,183,142, 31, 63, 94,241,129, 21, 87, 25, 23,172,211,233,208,200,191,177,116,209,175, 15,134, 84,225,221,172, 20,204,156,
+102,206,127, 27,231,191, 66, 96, 25, 88,156,158, 50,109, 70,222,238,221,187,165, 66,161, 16,239,223,191, 71, 98, 98, 34,142, 31,
+ 61,106, 28,220,176, 97,206, 48, 63,191,236,227, 71,143,114,122,189, 30, 28,199,161,118,237,218,232,214,173,155,100,204,184,137,
+201, 36, 91,125,176,130,135,226,232,224,224, 80,180,104,238, 7,166,173, 17, 35,192, 48, 12, 44, 44, 44, 64, 8,113, 52,229, 6,
+ 92, 92, 92,250,143,250,186,131,155,101, 13,203, 36, 46,113,119, 58,104, 49,192,179, 0,120,150,128,196, 18, 16,203, 0,129, 24,
+218, 71,183,211, 57,180,120,215,217,191,191,171,139,139, 75,255,202,100,146,189,189,253,247, 71,142, 28,113,120,250,244, 41,151,
+147,147,131,164,164, 36,238,155,111,190,113,176,183,183,255,190,170, 25,175, 84, 42, 23,141, 26, 53, 42,169,111,223,190, 86,187,
+119,239,174,214,183,111, 95,171, 81,163, 70, 37, 41,149,202, 69,127,229,129,242,249,124,250,234,213,171,182, 95,125,245,213,231,
+ 6,131, 33,184, 67,135, 14,105,254,254,254,193,206,206,206, 53, 76,176,170,121, 23,138, 43, 0,160, 40, 10, 66,161, 16, 66,161,
+ 16, 86, 86, 86,153, 81, 81, 81, 70,119, 39,137, 80,204,228, 26,109,120, 20,191,166,139,179,157,181,179, 75, 91,149, 74,117, 27,
+ 64,130,137, 73,244,109,219,182,173,152, 97,105,227,196, 17,237,107, 79, 30,217,190,230,182,165, 19,125, 55,252, 52,177,254,202,
+133, 19, 90, 45,253, 97,244, 48,194, 48, 57, 53,107,214,244,192, 31,206,239, 21, 89,134, 26,249,250,250,138, 56,240,241,228, 69,
+ 84,220,219,152,248,236, 46,237, 91,212, 45,186, 96,147,166,159, 59, 58, 58,126,234,225,225,209, 17, 64,103,147, 76,187, 60, 94,
+163,134, 13, 27, 74,120,124, 17, 28,237,173, 60, 44,228,178,162,161, 87, 27,123,199,142,206,110,110,163,121, 64,154,139,139,139,
+ 27,143,199,107,100,106, 58, 3, 3, 3,197, 44, 4,112,118,176,181,117,176,183,177,236,214,161,165, 79,139, 86,205, 27,250, 55,
+111,217,206,191, 89,139,145,148,209,152,225,238,238,238, 90,232,252, 94, 17, 78,156, 56,129,117,235,214,161,101,253,250,112,119,
+119,135,131,131, 3,126,255,253,119,252,254,251,239,144,203,229,200,204,204,196,166, 77,155,112,241,226,197,191, 92, 89, 20, 10,
+162, 34,199,244,143,128,146, 34,171, 34,177,119,251,246,237, 99,135, 15, 31,134,167,167, 39, 70,142, 28,233,177,115,231,206,168,
+168,168, 40,200,229,114, 60,121,242, 4, 95,127,253,117,212,252,249,243, 61, 70,140, 24,129, 3, 7, 14, 32, 62, 62,254, 55, 83,
+210, 49,112,224,192, 73,126,126,126, 87, 19, 19, 19,155,165,167,167, 55, 56,118,236,216,168, 62,125,250, 68, 15, 26, 52,168, 67,
+145, 5,203, 96,216,119,246,212, 81,116,255,244, 51,212,173,223, 96,243,136, 57,123, 27,154,155, 16, 51,204, 48,163,204,118,164,
+180,157, 49, 49, 49,153,222,222,222,174,158,158,158,148, 78,167, 67, 86, 86, 22, 46,158, 63,111, 60,112,232,208, 89,157, 78, 55,
+149,162, 40,193,174, 61,123, 54, 59,187,184,180,251,172,111, 95, 98, 48, 24,208,177, 99, 71,225,213,171, 87,237,158,198,196,228,
+148,119, 65,154,166,139,172, 71, 95,124,241, 5,214,172, 89, 83,216,123,252, 67,224, 25, 12, 38,251, 34, 73,228,108,183, 54, 29,
+ 27, 88,198,202,126,177,212, 55, 55,228,186,191,177,184, 47,203,149, 4,130, 18,242, 32, 17,131,213,137,153,200,204,142,193,111,
+222,214,244,145,104,146,107,182,168, 27,132,131,247,143,119, 3,112,200,212, 76,146, 72, 36, 77,164, 82, 41,194,195,195,211, 3,
+ 2, 2, 50, 45, 45, 45,173,188,188,188,236, 37, 18, 73,147,170,102,124, 82, 82,210, 91, 87, 87,215,214,159,125,246,217,100,138,
+162, 58,178, 44,123, 37, 45, 45,109,125, 82, 82,210, 91, 83,254,239,234,234, 58,145,227,184,121, 0,142, 20,238,211,233,116,160,
+ 40, 10, 28,199,161,103,207,158, 88,186,116,169,207,149, 43, 87,112,243,230, 77,219,193,131, 7,223, 87, 40, 20,153,132,144,209,
+241,241,241,101, 90,201,210,210,210,176,121,243,102,240,120, 60, 88, 91, 91,195,194,194, 2, 98,177, 24,109,219,182, 77, 90,185,
+114,165,215,254,253,251, 13,153,201,201, 68,146,147,165, 37,118,118, 98, 40,170,119, 25, 58, 96,224,125, 0,135, 77,189,119,185,
+ 92, 46, 17, 66,155, 67, 25, 53,212,138,249, 27,120, 82,129,128,136, 5, 60,136,216, 60,122,206,210,197,156,152,112,252,194, 33,
+ 83, 83, 33, 22,139,133, 50, 33,167,229,139, 40,131,148,226, 62,202, 56, 43,143,199, 19,137,248, 80,151,117, 92, 64, 17,154, 16,
+ 34, 1,160,173, 76, 58,229, 66, 99,153,231,139, 41,208, 20, 69,137,203,226,236, 95,159,112,135, 39, 23, 10,156, 34,163, 26, 24,
+134, 65,147, 38, 77,112,224,228, 53,156,251,253, 46, 82,223, 63,197,212,137,163,224,229,229, 85,161,184, 42,244,193, 50,161, 83,
+ 0,133, 66,113, 93,249,131, 85,197, 39, 23,248, 93, 85, 52, 52, 88,156,211,103,121,120,185,179, 19,221,220,220,198,249,249,249,
+ 13, 63,126,252, 56,218,181,107,135, 30, 61,122,160,110,221,186, 30,131, 7, 15, 6, 0,180,110,221, 26,223,127,255,189,199,231,
+159,127,142, 19, 39, 78,224,220,185,115, 8, 12, 12,156,166, 80, 40,146,149, 74,229,198,114,196,213,252, 49, 99,198,204, 93,191,
+126, 61,248,252,252, 21,161,122,247,238, 93, 88, 63,238,232,223,191,127, 90,225,185,135,183,199,221,173,229,225,213,124,210,212,
+175,132,147, 39, 12,155, 13,224,115,115, 51, 98,134, 25,102,152, 44,176, 0, 64,164,215,215,213,110,222, 12,213,149, 43, 16, 94,
+186,132, 51,141, 26,229, 50, 12, 51, 83,169, 84,198, 2,128,147,147,211,244, 67,135, 15,223,233,248,251,239,150,186,240,112,184,
+ 61,123, 6, 94,157, 58,126,166, 94,120,201,146, 37, 69,162, 0, 0,246,236,217,131,172,172, 44,100,101,101,129, 97, 76, 94, 75,
+ 24,124, 33, 90, 58,218, 85, 71, 2, 34,193,242, 40,249,187,186,121, 77,229, 26, 11,165,107,140,147, 42, 75, 80, 7,225,113,245,
+101,234, 76,109, 83, 66,235,160, 73,205,131, 91, 75, 47,240, 80,250,240, 99,153,102, 62,138, 42,108, 28,211, 67, 66, 66,122,182,
+108,217,242, 52, 0,251,194,253, 85, 69,124,124,252,107, 0, 83,171,242, 95,154,166,231,221,186,117,203,241,208,161, 67,147,127,
+254,249,103,174,184,192, 42,252,206,227,241,192,113, 28,100, 50, 25,120, 60,158,211,137, 19, 39,156, 62,253,244,211, 13, 0,202,
+124, 78, 82,169, 20,142,142,142, 16, 10,133,176,176,176,128, 42, 59, 67,182,233,167,185,109,165, 54, 78,182, 83,167,205,164,198,
+141, 27, 23,182,118,237,218,106,206,117,235,122, 63,127,254,252,109,159,129,159,223, 61,121,242,164,186, 18, 14,238, 79,195,195,
+195,105, 47, 79,119, 1,107, 80,179, 50, 1, 32,126,242, 51, 43,180,112,134,152,166,193, 35,224, 36, 82,153, 99,108, 66, 66,140,
+169, 86, 49,142,227,158,188,123,247,142,184, 41,156,120, 57, 42, 77,166,140,199, 10,163, 31, 61,124, 89,171,113, 19,111, 0,208,
+ 60,186,123, 92, 84,183,190,133, 50, 59, 71,226,234,234, 26,101, 10, 39,195, 48, 79,226,226,226,136,173,173, 45, 63, 50,242,245,
+111,118,150, 22, 10, 91, 39,167,182, 0,160, 75, 79,185, 73,212, 26, 37,159,207,119, 77, 73, 75, 75, 96, 24, 38,198,212,116, 70,
+ 71, 71, 19, 55,133, 19,239,244,217,115, 7,156,101, 82, 23,107,137,200, 74, 76,129,136, 57, 54, 75,200, 48,137, 18,169, 76, 17,
+ 23, 31,159,196,113, 92,153,126,130,155,216,201, 67,243,191,253,186,183,132,117, 7,215,130,163, 97, 69, 27,193, 55,168,112,255,
+216, 33,124, 54,229, 75,147,222,167, 21, 11, 71,236, 95,177,112, 68,153,225, 25, 74, 8, 34, 40,199,255,197,154,103,139,247,245,
+ 63,113, 42,203,119,112,239,210,165,203,119, 91,183,110,149, 22,254,126,249,242, 37, 90,182,204,127,149, 23, 44, 88,128,206,157,
+ 59,163, 81,163, 70,120,249,242, 37,106,212,168,129, 99,199,142,129,166,105,254,184,113,227,190, 1,176,177, 28,203,109,207, 45,
+ 91, 62,116,211,210,235,245, 96, 24, 6, 6,131,193,133, 97, 24,151,194, 78,223,207, 63,175, 75,189,116,241, 12,190,153,179, 0,
+142, 14,206,126,230, 38,196, 12, 51,204, 40, 83, 59,148, 89,233,112, 28,203,164,167,131,211,230,119,164, 5, 2, 1,199,113, 92,
+ 81,229,198,231,243,165, 86, 86, 86,132,239,230, 6, 34, 42,112,245, 33,228, 47,199,131,225,241,120, 48, 26, 77,167, 49, 26, 65,
+131,232,193,225, 15,127, 83,149,152,224, 71,251, 14,152, 42,251, 18,137, 66,171,226, 45, 28, 56,134,133, 17,149,179,142, 16, 66,
+ 56,149, 74, 5,173, 86,107,227,233,233,121, 86,163,209,216, 20, 52,152,127,155,147, 43,195, 48, 81, 60, 30, 15, 35, 70,140, 0,
+242,151, 60,130, 78,167,195,227,199,143,161,213,106,161,211,233,112,231,206, 29,100,101,101, 65,167,211,225,242,229,203,168, 81,
+163, 6,120, 60,158, 75,121,188, 44,203,194,193,193, 1, 78, 78, 78,208,170,178,101, 71,183,174,237,190,124,254,183,246,131, 60,
+ 57,234,215,117,171, 88, 79, 79,207,140, 6, 13, 26,216, 74, 36,146,140,128,128,128,204, 19, 39, 78,156,170, 76,136, 6, 0,167,
+103,207,158,237, 27, 20, 20,228,110, 45,151,233, 69, 66, 26, 34, 70,197,137,180,105, 28, 79,157,202,213,112,115,215, 67, 38,111,
+210,183,111, 95, 35,128,211,166,114, 78,157, 58,181,186,183,183,183,189,181,165, 44,155, 71, 33, 94, 96, 52,198,103, 4,223,189,
+ 12, 0, 2,123, 71, 53,100,242, 38,131, 7, 15, 54, 84,134,115,230,204,153,158,174,174,174,118, 20, 69, 50, 25,189,254,125, 81,
+121,208,168,147,104,145, 88, 5,145,184,213,232,209,163,153, 74,166,211,195,215,215,215,206,198,202, 50,147, 79,145, 24,129,145,
+137,149,112,198, 56,161, 65,159, 34,114,116,202,133, 76,222, 98,208,160, 65,101,166,179,208,122, 85,210, 50,196,227,241, 16, 31,
+ 31,143, 60,229, 83, 8,226,195,209, 72,206, 71, 83,103,123,200,100,178,138, 5,214,248,151, 36, 44,154, 35, 97,209, 28,193,248,
+151,164,180,223,165,136,172,114,203,126,185, 67,125, 91,188,175, 87,133,243,220,185,115,203,122,245,234,101, 24, 56,112, 32, 46,
+ 95,190, 12, 66, 8,110,223,190,141,248,248,120,116,238,220, 25, 28,199,225,241,227,199, 69,226,171, 95,191,126,232,209,163, 71,
+222,133, 11, 23,126, 52,181,112,110,221,186, 21, 12,195,128,207,231, 67, 34,145,192,210,210, 18,182,182,182,112,114,114,122,227,
+232,232,248,124,201,230, 19,175, 59,117,238,129,244,180, 84, 36,167, 36, 62, 54, 55, 33,102,152, 97, 70,165, 5,150, 65, 36,122,
+193, 78,153, 2,235, 83,167,192,143,140, 68,191,207, 62,179, 20,137, 68,235, 92, 92, 92, 2, 20, 10, 69, 11,137, 68,178, 97,230,
+140, 25, 22,246, 75,150, 64,113,243, 38, 18,175, 92,129,129,207,127, 84,153,139,171,213,234, 66, 1, 3,109,129,144,179,182,182,
+174,148,192, 98, 25,220, 75, 72,137,132, 16,238, 96,193,229, 94,200,110,253, 96, 80,212, 92,199, 51,217,181,188, 94,171, 4, 94,
+ 11, 29,154, 58,174,171,209,242,129,138,240,114,133,214, 98, 40,227,149, 48,130,189, 87,153,116,106, 52,154, 44,149, 74,133,218,
+181,107,219,133,132,132,120,122,121,121,217, 22, 8,154,135,127, 37,243, 21, 10, 69, 51,127,127,255,195, 1, 1, 1,111,253,253,
+253, 15, 43, 20,138,102,149,248,251,175,143, 30, 61, 2, 77,211, 24, 55,110, 28,114,114,114,160,215,235,145,150,150,134,152,152,
+ 24,232,116, 58,196,197,197,225,213,171, 87,208,233,116,120,247,238, 93, 81, 30,151, 7,131,193, 0, 11, 11, 11,100,166, 37,203,
+ 14,110, 90,213,125,241,252,239, 36, 89,111, 66, 16,167, 76, 2,107, 84, 43,191,255,254,251, 40, 79, 79,207,219, 90,173,182, 30,
+195, 48,221, 56,142, 59, 88, 9,161, 74, 1,120,236,229,229,213,105,229,202,149, 45,191, 95,186, 93,100, 65,231,112, 66, 11, 17,
+ 43,180, 16,114,194,122, 77, 49,102,222,122,241,234,213, 43,238, 5, 7, 7,103,153, 56, 51,143, 2,240, 56, 32, 32,160, 89, 98,
+ 98, 98,203, 70,141, 26,249, 57,215,174, 35, 22,185, 42, 82,133,138, 26,105,156, 58,239, 10, 85,189,102,207,157, 59,119,222,186,
+121,243,102, 82,101, 56,157,156,156, 90,110,222,188,217,191,122,245,234,141,197, 86, 86,146,220,204,204,173,218,204,244,237,124,
+123,103, 9,101,103,223,255,232,209,163,191,159, 61,123, 54,173, 50,156,117,235,214,109,177,100,201,146, 70,254,254,254, 1, 46,
+117,234,138, 37,174,110, 41, 2,215, 26,201, 18,223, 64, 49, 85,195,163,223,246,237,219,175,221,185,115, 39,213,212,128,163, 20,
+ 69,129,207,231, 67, 38,147,225,198,141, 27, 24,244, 89, 23, 56, 59, 90,162, 78,221,186,104, 59,126, 10,206,158, 61, 11,161, 80,
+136,191,106,109, 45, 9, 83, 4, 81,101,197, 87, 69,156, 74,165,114, 99,112,112,240,207, 3, 6, 12, 64,199,142, 29,241,228,201,
+ 19,204,154, 53, 43,234,236,217,179, 0,128, 39, 79,158, 96,241,226,197, 81,247,238,221,195,200,145, 35,209,178,101, 75, 60,126,
+252,120,119,101,130,143,142, 26, 53, 10, 6,131, 1,185,185,185, 72, 79, 79,199,153, 51,103,208,168, 81, 35, 78, 42,149,126, 70,
+ 87,235,244, 99,255, 49,115,154, 55,240,245,195,134,117, 43,117, 66, 30,127,169,185, 9, 49,195, 12, 51, 42, 37,176, 60,109,109,
+ 45, 52,154,188,184,155, 55,111,234, 41,138,130, 84, 42, 69,255,129, 3,169,159,126,250,169, 85,239, 70,141,174, 14,110,214,236,
+252,161,131, 7,253,253,252,253,243,215,219,161, 40,156, 60,121, 82,157,149,149,153, 86,189,122,117,107, 83, 47,158,146,146, 82,
+212,251, 86,171,213,224, 56, 14, 22, 22, 22,149, 18, 88,234, 92,234,202,173, 27, 97, 25,156,241,139,152,110,175,215,232,151, 38,
+246, 14,202,100,141,188, 44,163, 1, 89,106, 14, 57, 26,240, 30, 80,182, 65, 35,188,250,232,163, 59, 6,189,122,240, 54, 52, 77,
+199,233, 42, 53,251, 33, 35, 35,227,187,137, 19, 39,166, 57, 57, 57, 17, 11, 11, 11, 56, 57, 57, 81, 99,198,140, 73,141,141,141,
+ 93, 88,213,140,247,241,241,249,188, 89,179,102,167, 67, 67, 67,251, 29, 58,116,200,253,240,225,195,253,154, 53,107,118,218,199,
+199,199, 84,159,142, 67,203,150, 45, 83, 9,133, 66, 52,109,218, 20, 57, 57, 57,208,233,116, 21,110, 21, 10, 86,150,133, 88, 44,
+198,225,237,107, 59, 45,158,255,157, 36, 61,252, 1,158,222,190,140, 11,111,181,121,243,150,254,124, 95, 44, 22, 87,233,126,189,
+ 28,101, 13, 27, 42, 44, 94,126, 57,106,160,114,246, 55,223, 88, 61,123,246, 76, 58,227,203,233,156, 50, 37,147, 19,119, 95, 77,
+ 83,109,191,167, 94,104,236, 73,175, 30,237,241,227,130, 89,157, 96,194,208,169,143,163,172, 97, 3,133, 69,216, 87,227, 6, 69,
+ 77,157, 58, 85,186,108,217,178,188,150, 45, 91,102,102,101,101, 73,172,156, 92,252, 69,142, 78, 65,202,140, 76, 89,243, 22, 45,
+ 30,143, 26, 53, 74, 85, 89,206,239,191,255, 94,118,235,214, 45, 81,151, 46, 93,114,178,179,179,101, 98,185, 60, 72, 96,105,221,
+ 58, 37, 43,203,178,107,215,174,161, 3, 6, 12, 48, 84,133,243,213,171, 87,162,230,205,155,231,100,101,101,201, 44,157, 92,154,
+136, 29,157, 91,197,167,103, 88, 52,109,214, 44,116,236,216,177,186,242, 56,251,175,255, 67,156, 72,165,210,116,111,111,111,204,
+157, 59, 23, 11, 22, 44, 64,255,254,253, 17,253, 54, 26,109, 70,142, 67,173, 17, 19,112,250,222, 3,196,199,199, 99,206,156, 57,
+240,242,242, 2, 69, 81, 9, 31,179,242, 40, 79, 16,149,229, 8,239, 83,139, 92, 47,207,207,170, 34,145,213,169, 83,167,145,189,
+122,245,194,201,147, 39, 49,107,214,172,168,249,243,231,123, 12, 25,146, 63,161,207,207,207, 15, 51,103,206,244, 88,185,114,101,
+212,234,213,171,209,172, 89, 51,184,185,185,125, 90, 9,171, 48,118,236,216, 1,134, 97, 32,151,203, 97,107,107,139, 30, 61,122,
+224,249,243,231, 19,118,238,220, 25, 78,243,249,131,187,127,218, 23,103, 79, 29,195,171, 23,207, 39,236,250,105,232, 51,115, 19,
+ 98,134, 25,102,148,133,210,227, 96, 89, 74, 6,110,221,184,193,106,242,244,153, 42,111,111,111, 27,103,103,103, 16, 66,208,165,
+ 75, 23,210,236,194, 5, 11,190, 66, 1,187,134, 13,139, 22, 52,188,117,243, 38,174, 94,189,170,218,187,227, 87,215, 81, 99,198,
+244, 4,202,246,153, 45, 62,172,150,150,150, 6,103,103,231,162,217,106, 74,165, 18,206,206,206, 16, 8, 4,160,105,154, 87,176,
+244, 75,185,106,203,217,217,121,207,210,197, 47,102,199,249,206,172, 21, 36,165,200,121, 85, 34,140, 28, 7, 62, 49, 2,106, 14,
+ 6, 35,160, 53,112, 8,172, 73,219,254,174,131,205,131, 23,151,162,157,157,157,247, 84, 38,147,162,162,162,174,185,184,184,140,
+207,203,203, 59, 2,128,186,127,255, 62,251,246,237,219, 73,166, 58,164,151, 6,137, 68, 50,235,200,145, 35,182, 11, 23, 46,204,
+184,122,245,106, 86,251,246,237,173,150, 46, 93,106,251,249,231,159,207, 66, 41,193, 32, 75,105,136,212, 10,133, 98,119, 66, 66,
+194,164,198,141, 27, 35, 61, 61, 29,122,189, 30, 33, 33, 33,240,242,242, 66,112,112, 48,234,212,169,131, 71,143, 30,161,110,221,
+186, 48, 26,141,208,104, 52, 48,154,160, 94,149,177,239,229, 82,109,134,165,242,193,121, 68, 60, 11,193,185, 40,109,222,138, 29,
+ 7,207, 53,244, 11, 84, 21,206, 48,172, 12,234, 58,201,234,187, 58,218, 93, 90,186,224, 7,199,119,215, 14,226,216,142,245,236,
+181,115,231, 26, 72, 44, 49,188,197,192,105,159,235, 13,112, 7,129,168,117,139,230,232,105, 27, 97, 20, 84, 67,210,239, 47,202,
+143,100, 94,215, 73, 86, 95,225, 96,119,113,197,146,133, 22,111, 46,236,194,161, 45,171,185, 35,123,246,251,107,128,250,158,158,
+158, 61,105,154,118, 2,160, 54, 26,141,111, 96,226, 18, 52,165,113,254,126,230, 76,128, 6,168,239,230,230,214,147,207,231, 87,
+ 3,160, 53, 24, 12,239, 63, 6,103,237,218,181,123, 18, 66, 92, 1,104, 10,124,174, 42,181, 84, 78,199,142, 29, 87,108,223,190,
+125,134, 86,171,181, 45,102,109, 37, 39, 79,158,132, 94,175, 39, 2,129,128,149,201,100,136,137,137,225, 0, 36,112, 28, 55,225,
+ 99, 85, 28,125,251,246,197,253,251,247, 23, 0,152, 87,222,121,233,233,233, 60, 91, 91, 91,166, 34,225,101, 42,231,131, 7, 15,
+150,141, 29, 59,246,235, 11, 23, 46,196,205,159, 63,223,111,196,136, 17, 56,113,226, 4,170, 87,175,142, 87,175, 94, 97,198,140,
+ 25, 32,132,120,172, 92,185,242,241,129, 3, 7, 92, 18, 19, 19, 87,153,114, 63, 70,163, 17, 12,195, 96,208,160, 65, 48, 24, 12,
+ 72, 73, 73, 65, 68, 68, 4,110,221,186,133, 9, 19, 38,136, 1,192, 69,225, 22, 40, 20, 10,241, 36,244, 81,222,247,163,131,126,
+ 51, 55, 31,102,152, 97, 70,165, 45, 88,132, 37,124,175,218,181,141,186,188,220,157, 99, 70,142,204,123,241,226, 69, 81, 5,164,
+121,248, 16,170, 11, 23, 96, 52, 26,193,113, 28, 30,220,191,143,169, 83,166,228,106,242,114,183,215,172,233,206, 17,142,147, 21,
+241, 16,210,177, 36,183,174,152, 25, 69,173, 86, 67,173, 86,131,199,227,193,194,194, 2,201,201,201, 16, 10,133,144, 72, 36,104,
+212,168, 17,229,230,230,214,227, 79,105, 43,193, 25, 18, 18, 98, 64,182,182,223,201, 17,211, 18,220,242, 24,110,188,117, 77,212,
+ 16, 72,138,102, 33, 58, 91, 18,124,218,136, 15, 39, 65, 42,247,116,215, 32, 37, 97,178,250,133,132,132, 24,202,227, 44, 9,133,
+ 66, 81,199,199,199,103, 99,223,190,125, 41, 0,104,213,170, 21, 85,191,126,253, 95, 20, 10, 69,153, 75,218, 84,196, 41, 22,139,
+ 69, 0,112,229,202,149,244, 91,183,110,117,185,114,229, 74,122,241,253,166,112, 82, 20,181,117,211,166, 77,144, 74,165, 96, 24,
+ 6, 58,157,174,200,255,170,248,167, 94,175,135,189,189, 61,126,255,253,119,176, 44,123,182,162,116,122, 55,240,205,205,226, 89,
+ 39,237, 62,125, 21,231,223,233,115, 43, 43,174,138,115,214,118,145,215,117,182,183,187,188,226,167, 69, 14, 25,175, 67, 16, 23,
+ 23,199, 93,188,112,246,158,154,227,226,211,178,184, 31,211,115, 56,159, 92, 13, 39, 13,172,137,216,179,191,204,224,190,106, 6,
+ 6, 4, 92,121,156,245, 93,228,117, 93, 29,236, 46,174, 90,241,147, 69,230,235, 16, 36, 36, 38,226,220,217,211,143,213, 28, 23,
+207,113,220, 5,142,227, 38, 50, 12,211,132, 97,152, 38, 28,199, 77, 44, 75,180, 84,150, 83,175,215, 7,233,245,250,160,143,201,
+201,178,108, 16,203,178, 38,115,254, 49,131, 16,152, 59,119,238,195,155, 55,111, 14,120,248,240, 97,135,194,237,249,243,231,237,
+163,163,163,219,199,197,197,181,139,158, 37,162,159, 61,123,198,123,244,232, 17,255,209,163, 71,213,131,131,131, 47,152, 90, 62,
+203,121, 23,138,139,252,249, 74,165,146,148,202, 57,254, 37,217,176,242,139,189,135, 15, 31,118,250,104,156, 0,194,195,195, 55,
+108,223,190,189,134,171,171,171,203,231,159,127,142, 93,187,118, 97,251,246,237, 0,242, 35,217, 23,179, 92, 57, 6, 7, 7,215,
+ 42, 45,200,104,105,247,110, 48, 24,192, 48, 12,246,239,223, 15,134, 97,224,224,224, 0, 31, 31, 31, 76,154, 52,233,218,152, 49,
+ 99, 54, 2, 0, 77,104, 1, 0,104, 53, 90,109,201, 32,163, 85,205, 79, 83,223, 35, 51,167,153,243,223,192,249,239, 16, 88,132,
+ 53, 26,141, 44, 28,157, 28, 45, 82,146,147,215, 79,156, 56, 33,109,225,194,133,154, 27, 55,110, 64, 23, 30, 14, 77,104, 40, 46,
+ 95,190,140,105,211,166,229,141, 27, 63, 62, 65,147,151,187,214,217,201,209,222,104,100, 65, 8, 91,174,133,132,162,168,168,200,
+200,200,194,222, 54,214,175, 95,207,232,245,122, 88, 88,228, 7,153,222,182,109, 27,203,113, 28, 58,116,232, 32,227,243,249, 38,
+ 45, 65, 18, 31, 31,255, 52, 59, 70,217,249,232,192, 9,111, 94, 30, 60,149,225,155,166,199, 16,137, 2, 3, 3, 0, 31,139, 24,
+196, 63,248, 53,227,238,198,222,111,242,210, 99,187,196,199,199, 63,173,108, 38, 57, 57, 57,205,219,183,111,159, 99, 72, 72, 8,
+167,213,106, 17, 31, 31,207,205,154, 53,203,209,201,201,105, 94, 85, 51,158,227, 56,146,153,153, 9, 66, 8, 91, 80, 88,217,194,
+253,166,114,196,197,197, 61, 63,124,248,240,201,107,215,174,193,205,205,173, 72,100,149, 20, 88, 60, 30, 15,132, 16,108,218,180,
+ 41,147, 16,242,109, 69,188, 34,145, 8,219,142, 92, 56,255,213,166, 99,135, 14, 93,121,120,172,170,150, 43, 0, 16, 82,212,252,
+101,139,126,112, 76,125,121,159, 60,191,119,149, 61,248, 36, 33,137, 49,114,147, 75, 61, 57, 71,201, 21, 20,202,242,125,123, 40,
+122,254,178,159, 22, 90, 21, 14, 95,238, 11, 81,102, 19, 35, 55,229,175,189, 9,255, 35,156,127, 35,242,103,250, 41,137, 66,161,
+192,209,163, 71, 43,237,131,229, 83,139,252,201,185,189,170,156, 74,165,114,249, 39,159,124,162,156, 63,127,254, 70,141, 70,163,
+ 42,232,188,233, 87,173, 90,181,114,242,228,201, 73,241,241,241,171, 76,126, 76, 20,181,167, 83,167, 78,220,205,155, 55,209,187,
+119,111, 24, 12, 6,196,198,198, 98,219,182,109, 96, 24, 38,187, 67,135, 14, 44, 0,168, 53,121,217, 28,203, 65,167,215,106, 97,
+134, 25,102,152, 81, 1, 74, 29, 34,100,105,234,206,230, 45,155,186, 30,220,127,192,153,166, 41,231,232,232,183,143,134,141, 30,
+ 29,127,243,230, 77, 91,126,237,218, 77, 40,138, 98,117,179,103,223,203,205,206, 74,223,179,115, 71,141,154, 53,221, 27, 21, 44,
+246,204,177, 52,117,167,188, 11,166,167,167,239,154, 62,125,122,147,221,187,119, 11,150, 47, 95,174,138,143,143,191,116,255,254,
+253,174, 27, 55,110, 20,111,219,182, 45, 47, 39, 39,231,212,185,115,231,122,181,107,215,142,209,233,116,121,166,222, 72, 82, 82,
+ 82, 24, 33,196,155, 90,181,125,240,171, 77,251, 62,225,104,210, 2, 90, 1, 8,199,220,161, 24,213,229, 36,165,114, 31,199,113,
+ 76, 85, 50, 73, 34,145, 52,146, 72, 36,120,253,250,117, 70,147, 38, 77,116, 66,161, 80,224,238,238,110, 39,145, 72, 26, 85, 53,
+227, 57,142,227, 50, 50, 50,192,113, 28, 15, 0, 97, 89,150, 87,176,191, 82, 49,156, 4, 2,193,231,163, 70,141, 58,185,113,227,
+198, 78, 29, 59,118,132,135,135, 7, 12, 6, 3,234,212,169, 3,157, 78, 7, 47, 47, 47,104,181, 90,172, 93,187, 22,185,185,185,
+ 51,226,227,227, 51, 42,226, 20,139,197, 16, 10,133,168,235,221, 32, 79, 44, 22,163,170,226, 10, 0,100,124,202,227,213,153, 29,
+ 72, 78, 75,101, 15, 61, 73, 74,202,211, 27, 59, 71, 38,171, 94,148, 60, 47,207, 8, 85,187,145, 83,227, 1, 64,203, 34,183, 92,
+ 78, 33, 60, 34,206,110, 67, 82,114, 42, 14,134, 38,100,170,244,108,151, 87,165,112, 86, 42,157,255, 35,156,253,215,135,163,237,
+ 23,166,159,123,120,252,199,169, 40,138, 91,149, 76, 69, 88, 52, 71,176,197,155,195,150,245,165,198,184,170, 10,103,177, 78,213,
+ 22, 0, 91, 0,192,205,205,237,205,212,169, 83,191,142,143,143, 95, 83, 16,239,170, 82, 29,159,131, 7, 15,174, 29, 53,106,212,
+133,158, 61,123,126,195,178,172,111,177, 30,122,180,163,163, 99, 81, 14,166, 36, 37,206, 30, 63,122,208,236,220,220,140, 69, 48,
+195, 12, 51,204,168,138,192,138,138,138, 13,243,240,168, 54,231,216,209, 35, 45, 56,142,162, 57, 66, 84, 0,117,250,197,139, 23,
+153,197,207,243,180,181,181, 24, 53,118,212, 64,194, 18, 62, 33,172,145,165,169, 59, 81, 81,177, 97, 21, 84,140,207,134, 15, 31,
+190,190, 93,187,118,163,141, 70,227,242,200,200,200, 75,117,235,214,125,220,165, 75,151,175, 24,134, 89,249,230,205,155, 75,245,
+234,213,187,124,240,224,193, 89, 70,163,241,135, 74,138, 22, 6,249,254, 95,187, 63,102, 38, 81, 20,181,144,227, 56, 43,137, 68,
+146, 21, 28, 28,188,191,117,235,214,131, 56,142,179,162, 40, 42,171,170,156, 58,157,110, 74, 78, 78,142,253,231,159,127,110, 32,
+132,212,237,211,167,207,236,200,200, 72,190, 74,165,138,170, 12,207,187,119,239,180,238,238,238,189,190,248,226,139,237, 2,129,
+160, 3,242, 67, 54,112,197,242, 4, 28,199,193,104, 52,158, 82, 42,149,229,230, 11,159,207,207,237,218,181,171,188, 66,171,148,
+ 80,152,107,106,250,114,116,198,233,155,174,190, 88,162, 49,112, 28,195,114,227, 95, 37,169, 74,157, 66,246,240, 21, 87,223,100,
+ 78, 13, 59,125,221,197,176, 37, 90, 3,203, 50, 44, 55,161, 44,206,202,224,127,133, 19, 0, 38, 82,235,247, 98,203,250, 34,135,
+247,194, 97,195,146,191,255, 83, 40,176, 56,113, 0, 42, 94,236,188,192, 98, 85,209,218,133,149,226, 44,129,130, 89,130, 91,255,
+202, 61,237,216,177, 35, 18, 21, 44,176,125, 96,229,168,227, 0,142,155,155, 13, 51,204, 48,195, 84, 81,242, 31,219, 0,116, 52,
+115,154, 57,205,156,102, 78, 51,167,153,211,204,105,230,252,183,109,148, 89, 98,154, 97,134, 25,102,152, 97,134, 25,102,124, 92,
+ 16, 0, 29,203,176,108,153, 28, 43,170, 42,179, 9, 42,226, 55,115,154, 57,205,156,102, 78, 51,167,153,211,204,249,255,143,243,
+ 95, 3,243, 16,161,153,211,204,105,230, 52,115,154, 57,205,156,102, 78,243, 16,161,121,136,208, 12, 51,204, 48,195, 12, 51,204,
+ 48,227, 31, 13,179,192,170, 2, 8, 33,195, 8, 33, 23, 8, 33,207, 9, 33, 23, 9, 33,195,254, 2,151,132, 16, 50,187, 24,223,
+121, 66,200, 44, 66,136,200,156,211,255,232, 50, 64,155,115,193,140,170,162, 32,120,113, 72,121,193,138,205, 48,195,140,255,109,
+240,202, 58,224,233,233,121,151,162,168, 90,133,139,196, 22, 70, 70, 47,252, 94,242, 55, 0,112, 28, 23, 29, 22, 22,214,188, 44,
+206, 90,181,106, 21,113, 22,110,132, 16, 24, 12, 6, 11,154,166,115, 74,227, 52, 26,141,113,175, 94,189, 10,252, 7, 53,172,123,
+109,109,109,217,205,155, 55,111,240,245,245,173,157,147,147,147, 55,118,236,216,110,132,144,142, 28,199, 13,173, 36, 87, 3, 66,
+200,158,198,141, 27, 31,155, 60,121,242, 97, 31, 31, 31, 75,181, 90, 45,220,191,127,191,243,230,205,155,111, 17, 66, 70,113, 28,
+ 23,102, 46,166,255, 28,184,184,184,248, 19, 66,214,123,121,121, 5, 42, 20,138, 71, 0, 38, 41,149,202, 39,230,156,249,175,190,
+131, 99,132, 66, 97, 23, 47, 47,175, 38, 90,173, 54, 35, 58, 58,250,161,209,104,252,129,227,184,196,143,196,111, 5,224, 7,145,
+ 72, 20,228,233,233, 89, 45, 50, 50, 50, 86,175,215, 63, 0,176,144,227,184,172,143, 33,174,130,130,130,110,255,244,211, 79,118,
+223,126,251,237,109,133, 66,209, 82,169, 84, 70,152,159,172, 25,127, 7,170, 87,175,110,173, 82,169,182,243,120, 60,127,145, 72,
+228, 44,151,203, 33,151,203, 19, 69, 34,209, 99,169, 84, 58,250,236,217,179,153,230, 92,250,200, 2,139,166,105,183,135, 15, 31,
+ 58, 22, 46,190,204,178, 44, 88,150, 5,199,113, 69,159,133, 40,136,179,132,118,237,218,233,203,189, 24,143, 87, 45, 36, 36,196,
+ 81, 46,255, 35,212,146, 94,175,135,175,175, 47, 27, 26, 26,234, 88,114, 33, 97,157, 78,135,128,128, 0,238,159,146, 89,132,144,
+ 33,118,118,118,170,247,239, 99, 90,107,180,250,160,177, 83,190,157, 51,164,223, 39, 54,119,238,220, 65,207,158, 61,105, 66,200,
+ 48,142,227,246,152,200, 37, 33,132,252, 58,103,206,156,101,124,161,212,241,232,217,219,244,218,173,123,223,251,213,169, 73,166,
+ 78,157, 36,159, 60,121,242, 35, 31, 31,159, 29,132,144, 86, 28,199,153, 35, 71,255, 51,158, 63,175, 90,181,106, 39,151, 44, 89,
+226,154,152,144,128,213,107,214, 52, 5,176, 17, 64, 83,115,238,252,215,158,193,236, 5, 11, 22, 44, 25, 60,120, 48,140, 70, 35,
+212,106,181,226,245,235,215,245,231,206,157,219,135, 16,210,132,227,184,168,191,200,239,224,229,229, 21, 62,125,250,116,219, 38,
+ 77,154,128,162, 40,100,101,101, 41,110,221,186,213,244,215, 95,127, 29, 70, 8,169,199,113, 92,202, 95,185,134,141,141,205,111,
+ 43, 87,174,180, 19,137, 68,216,185,115,167,221,128, 1, 3,110, 41, 20,138, 86, 85, 21, 89,132, 16,202,206,206,110, 42,128,246,
+ 44,203, 10, 1, 60,200,200,200, 88,204,113,156,222, 92, 98,204, 40, 15,246,246,246, 99,114,114,114, 54, 72,165, 82,129,165,165,
+ 37,164, 82, 41,248,124, 62,132, 66, 97,117, 27, 27,155,234,114,185,188,219,160, 65,131, 38,237,223,191,127,187, 57,183, 62,162,
+192,162, 40, 10, 18,137, 4,135, 14, 29, 2, 77,211,224,243,249,224,243,249, 16, 8, 4,165,126,175, 94,189,186, 41, 21, 1, 0,
+224,244,233,211,176,180,180,132,149,149, 21,234,213,171, 7, 66, 8, 68, 34, 17,126,255,253,119,240,249,124,240,120, 60,240,249,
+124, 4, 6, 6,126, 96, 41,251,111,160,127,125,194, 1,165, 7,111,236, 94, 95,142,158, 83,126,234,155,167,209,119, 0,160,202,
+204,200,200,120,116,236,152,210,175, 78, 29,193,161, 67,135, 26,217,218,218, 14, 2, 96,234, 66,210,211,154, 54,109,122,138, 19,
+200,156,134,143, 24, 57,124, 52,143,210, 15, 27,255,213,143,177, 9,169,170,113,227,198, 29, 59,117,234,212,240,117,235,214, 69,
+ 78,154, 52,105, 42,128,229,166,166,223,221,221,253, 46, 77,211,133,150, 71,229,235,215,175,253,255, 33, 13,163, 2,192, 10, 0,
+ 6, 0,203, 56,142, 11, 47,118,172,142, 64, 32, 88,174,215,235,211, 1,204,227, 56, 46,246,159,248,178,184,186,186,214, 27, 58,
+116,168,125,122,106, 42, 86,175, 89, 83,184, 59,208,148, 69,201, 63, 54, 2, 2, 2,106,137,197,226, 21, 0,252,181, 90,173, 43,
+ 0, 72, 36,146,120,142,227,142,171,213,234,239, 66, 66, 66,212, 85,124, 78,213, 0,212, 71,254, 12,227,210,192, 45, 89,178, 36,
+114,246,236,217, 81,255,109, 78, 66,136,187,147,147,211, 79,253,251,247,199,217,179,103,113,238,220, 57,131, 68, 34,225,141, 24,
+ 49,130, 76,154, 52,201,102,250,244,233,221, 0,252,252, 23,179,182,219,130, 5, 11,108,189,189,189,113,228,200, 17, 60,125,250,
+ 84,237,229,229, 37,105,219,182, 45,120, 60,158,237,156, 57,115,186, 2,216,245, 87, 46,144,145,145,177,120,209,162, 69,187,215,
+175, 95,111, 17, 29, 29,141,133, 11, 23,218, 79,158, 60,249,134, 66,161,104, 99,170,200, 42,112, 33,152, 10,160, 29, 77,211,173,
+ 70,140, 24,193, 76,153, 50,133, 79, 81,148, 97,205,154, 53, 14,191,254,250,235, 64,123,123,123,255,212,212,212, 92,152,129,114,
+ 12, 9,122,150,101,249, 0,196, 28,199,105, 43,250,253,255,233,222,237,236,236, 38,102,100,100,108, 84, 40, 20,112,112,112, 40,
+106,107, 89,150,133, 74,165,130, 90,173, 70,173, 90,181, 4,222,222,222,219, 38, 79,158,204, 95,191,126,253, 38,115,137,249, 72,
+ 2,139, 16, 2,150,101,193,231,243, 63, 16, 88,133,226,167,228,247, 82,107,205, 18, 83, 53, 41,138, 34,185,185,185, 69,226,202,
+210,210,178,200, 18,102, 48, 24,254,196,107, 52, 26, 65, 81, 20, 87, 30,103, 25,105,159, 8,224,119,142,227,222,152,146, 9,197,
+ 57, 15, 79,174,135,221,162, 89,131, 10, 67,158,119,251, 42,255,115, 55,128, 43,175,199, 47, 95,222,162, 69,181,169,223,175,155,
+175, 78, 83,166,206, 25,218,211,221,203,217, 78, 34,203, 76,206,178,169, 91,183, 39,128,164, 74,164,179,229,184,113,227,142, 28,
+187,242, 66, 44, 22, 11, 4, 60,154,230,183,108, 88,199,174,154, 21,109,101, 1, 88,197, 70, 69,222, 29, 54,108,216,216, 73,147,
+ 38,217, 22, 10, 44, 83,238,157,207,231,187, 61,120,240,192,145,199,227,161, 69,139, 22,198,202,220,251,199, 66, 25,156,115,147,
+146,146, 62,215,104, 52, 8, 12, 12,252,148, 16,210,142,227,184,199,132,144,134,189,122,245,186,117,248,240, 97,139,208,208, 80,
+ 52,109,218, 84, 2, 96,192,223,152,206, 63, 65,161, 80, 92, 2,240, 9, 77,211,208,105, 52,186, 21,171, 62, 88,230, 46,184,184,
+184,250,111,164,211,207,207,175,158, 84, 42,189,187,106,213, 42, 75, 31, 31, 31,194,231,243,193, 48, 12, 34, 35, 35,171,237,221,
+187,119,252,163, 71,143,186, 6, 4, 4,248,148, 92,212,220,196,123,175,127,235,214, 45,149,135,135, 71,169,101, 39, 59, 59,155,
+ 87,167, 78,157, 54, 0,162,254, 6,206,184,164,164,164,222,159,124,242,201,132,196,196,196,112,134, 97,190, 1,208,192,222,222,
+ 62,244,179,207, 62,131, 68, 34,105,103,138,192, 42,239, 25, 57, 58, 58,246,106,222,188, 57,214,175, 95,143,101,203,150,117,228,
+ 56,238,119, 66, 72,135,236,236,236, 43,159,126,250, 41,172,173,173,123,151, 38,176, 42, 81,150,234, 52,105,210,100,219,140, 25,
+ 51, 44,206,158, 61, 11, 47, 47, 47,100,101,101, 97,228,200,145,142,235,214,173,187,174, 80, 40,218, 22,138,172,178, 56, 9, 33,
+ 62, 34,145,104,215,254,253,251,229, 30, 30, 30, 30, 2,129,128,242,240,240, 64,122,122, 58, 52, 26,141,232,199, 31,127,108, 40,
+145, 72,158,252,252,243,207,187, 0,124,246,119,190, 71,132,144, 44, 0,150, 0,172, 43, 51,188, 90,206,189,103, 1, 16, 21,171,
+239, 32, 22,139, 33, 22,139, 33, 18,137, 16, 29, 29,125,148,166,233,145, 5, 29,185, 10, 57,201, 31, 61,248, 70,132,144,135, 52,
+ 77,151,251,187,228, 82,102,127, 71,189, 68, 8,113, 35,132,172, 5,208, 14,249,126,212, 55, 28, 29, 29,167, 37, 38, 38,190, 55,
+149, 83,161, 80,216,229,230,230,254,172, 80, 40,224,232,232, 88, 40, 54, 17, 24, 24, 8,141, 70,131, 23, 47, 94,128,101, 89,188,
+121,243, 6,150,150,150,104,216,176,225,207, 11, 22, 44, 56, 50,111,222,188,180,255,228,189,255,107, 4, 86,161,146,229,241,120,
+ 31, 8,172,146, 91,161, 24, 34,132, 84,184, 80, 49, 33,132,210,233,116, 69,226,202,202,202,170,232,191, 12,195,148, 42,176,170,
+168,204,125, 89,150,173, 69, 8,217, 98,170,200, 42,137,225,195,135,255,201,159, 99,246,236,217,113,169,169,169,108,223,206,141,
+100,225,231,149, 9,158, 54,114,137,131,133, 69, 77,177,141,173,117,110,110,238, 77, 0,242, 74, 92,194,213,219,219,219,106,195,
+238,243,202,177, 95, 46, 89, 20,232, 97,103,233,235,102,111,227,108, 37, 17,202, 41,162, 18, 51,134, 56,153, 76,230, 3, 32,173,
+ 50,233,166, 40, 10,150,150,150, 56,117,234, 20, 10,253,231,254, 33,176, 81,171,213,200,200,200,192,230,205,155, 45, 39, 76,152,
+112,141, 16, 50,173,119,239,222,235, 15, 31, 62, 44,203,204,204,132, 94,175, 7, 0,245, 63,240, 61, 89,100, 99, 99,211,186, 93,
+187,118,194, 3,135, 14, 9, 57,142, 83, 33,127, 57,162, 92,142, 43, 99,225,234,255, 32,196, 98,241, 87,139, 23, 47,182,244,241,
+241, 33,105,105,105, 96, 89, 22, 20, 69,193,222,222, 30, 95,127,253,181,120,238,220,185,174,175, 94,189,154,131, 42, 44, 59, 3,
+128,148, 37,132, 0,192,210,210,146, 65,229, 39,199,148,202,201, 48, 12,105,209,162,197,215,169,169,169, 13,213,106,245,143, 38,
+ 52, 60, 12,128, 83, 5, 91, 97,157,242, 36, 60, 60, 92, 61, 96,192, 0, 73,205,154, 53,131,254,106,222,214,169, 83,167, 25,159,
+207,199,131, 7, 15,180, 0,110, 20,236,190,241,244,233, 83,237,103,159,125, 38,170, 86,173, 90, 51, 83,185, 20, 10, 69, 29, 79,
+ 79,207,203,246,246,246,146,194,105,219,221,187,119,231,175, 88,177,194, 34, 46, 46, 14,122,189, 30,179,103,207, 70,143, 30, 61,
+ 96, 99, 99,131, 81,163, 70, 57,109,221,186,245, 55, 0, 1,229,212,161, 98,161, 80,184,231,245,235,215, 94, 46, 46, 46,146,251,
+247,239,195,215,215, 23,169,169,169, 72, 76, 76, 68,110,110, 46, 18, 19, 19, 49,122,244,104,199,213,171, 87, 43,254, 65,239, 80,
+166, 64, 32,128, 84, 42,181,206,204,204,204,250, 11, 60, 34, 0,194,226,226, 74, 36, 18, 65, 36, 18,161,164,139,201,255, 71, 16,
+ 66, 92, 9, 33, 97, 2,129, 64, 36,149, 74, 5, 20, 69, 65, 38,147,117,174, 86,173,218,139, 97,195,134, 53,216,179,103,207, 59,
+ 83,120, 52, 26,205, 30,137, 68,194,119,112,112, 0, 0,116,234,212, 9, 35, 70,140, 64, 74, 74, 10,171, 84, 42, 81,175, 94, 61,
+234,250,245,235, 72, 74, 74,194,147, 39, 79,208,164, 73, 19,190,173,173,237, 30, 0, 93,205,178,233, 35, 90,176,120, 60, 94,209,
+ 86,154,229,170,112, 43,233,248, 94, 22,167,209,104,132,147,147, 19,164, 82, 41,164, 82,105,113,103,246, 63,241,115, 28, 87,165,
+ 33, 66,153, 76,134,193,131, 7,115,155, 54,109,154, 80, 32,178, 94,155,250,223,254,235,195,139,172, 86, 37,225,235,235,123,231,
+187,239,190,235,114,241,226,197,140, 64,143,154, 60,153,242,125,174,216,210,218, 26,110,213,187, 15,235, 63,240, 46,128,253,149,
+ 72,166, 82,171,213, 10, 60,221,164, 58,138,210,144,234, 34,158,133,139, 76, 32,114,182,177,113, 21,232,180,201,150, 54, 54,194,
+130, 33, 51,101, 69, 68,133,147, 7, 8, 33,176,182,182,230, 23,124,194,209,209, 81,212,160, 65,131, 36,138,162,192,113,156,242,
+217,179,103, 38, 15, 23,122,120,120, 4, 83, 20,229, 70, 8,249, 96, 66, 66,241,141,101,217,184, 23, 47, 94,152, 58, 1,225,187,
+ 70,141, 26,181,217,184,113,163,131,151,151, 23, 54,111,222,108,121,228,200,145, 93,191,253,246, 27, 50, 51, 51,241,238,221, 59,
+140, 30, 61, 58, 27,249,195,136,255, 40,216,218,218,222,238,223,191, 63,182,109,219,198, 21,116, 34,100,132, 16, 95, 43, 43,171,
+ 87, 97, 97, 97,255,117, 63, 23,138,162, 58,215,171, 87,143,100,101,101,129,101, 89,208, 52, 93,212, 17,162,105, 26, 95,125,245,
+149,100,244,232,209,115,155, 53,107,246, 53,159,207,207,102, 24,230, 64,110,110,238,143,207,159, 63,255, 71, 57,171,182,106,213,
+234,203,216,216,216, 30, 53,106,212, 56,253, 23,122,251, 92,227,198,141,117, 0, 36, 52, 77,243, 63, 66, 3, 70, 23,212, 71,154,
+194,197,225, 57,142, 99, 2, 2, 2, 52, 5,141, 59, 93,137,114,243,219,222,189,123,221,220,220,220, 96, 48, 24,192, 48, 12,114,
+115,115,113,253,250,117,104,181, 90, 48, 12,131,122,245,234, 97,217,178,101,154, 73,147, 38,137, 15, 30, 60,152,172, 86,171,135,
+ 84, 64, 59,237,200,145, 35, 50, 23, 23, 23,137, 90,173, 70, 84, 84, 20, 2, 2, 2,144,147,147, 3,149, 74,133,188,188, 60,232,
+245,122,100,103,103, 91, 27,141, 70,221, 63,166,161,225,241, 32, 18,137, 32, 16, 8, 50,107,212,168, 1, 66,136,248,221,187,119,
+ 85, 25,114,179, 4,144,205,231,243,133,197,133,149, 72, 36,194,179,103,207, 14,150,101,189, 42,175,252, 84,230,247, 63, 64, 96,
+173, 21, 8, 4, 34, 91, 91, 91, 65,225, 62,189, 94, 47,176,177,177, 65,205,154, 53,215, 3,232,102, 98, 29,226,103, 99, 99, 3,
+ 66, 8, 4, 2, 1,198,142, 29,139,135, 15, 31, 30,143,139,139, 27,150,156,156,140,188,188,188, 61, 86, 86, 86,125,146,147,147,
+ 97, 52, 26,241,246,237, 91,248,249,249,249,153, 37,211, 71,182, 96,149, 37,168, 74, 10, 46, 83,172, 37,122,189, 94,222,189,123,
+119,182,120, 35, 93,240, 63, 82,142,192,170, 82, 1,231,243,249, 22, 19, 39, 78,204,217,180,105,211,120, 66,200, 86,142,227, 34,
+171,154, 73,167,143,238,119, 90,246,195,236, 31,108, 21, 53, 61,191,249,230, 27,222,103,159,125,118,117,231,206,157,141,109,189,
+189, 63,185,118,105,175,211,250,111,230,156, 56,121,242,100,158,169, 14,238, 5,184,115,252,248,113,151, 25, 83, 39, 9,126,248,
+106,218, 5, 75, 47,123,161,156,216,202,196, 90, 85,138, 28,156, 90, 84,187, 94,143, 51, 23, 47,198, 2,184,109, 66,229,229,246,
+224,193, 3, 71,107,107,107, 0,249,147, 3,172,173,173,177,105,211, 38,155, 66, 75,161, 41,195,133, 37, 94, 64,183,208,208, 80,
+ 71,185, 92, 14,149, 74, 85,212, 32,112, 28, 87, 84, 89,182,110,221,186, 50, 13, 97, 20, 33,164,245, 23, 95,124,113,115,227,198,
+141, 14,158,158,158, 88,180,104, 17,210,210,210, 16, 19, 19,131, 33, 67,134,100, 71, 69, 69,181, 43,238,155,245, 79, 64,195,134,
+ 13,185, 59,119,238,224,194,133, 11,248,244,211, 79,201,201,147, 39,245, 70,163, 81, 16, 31, 31,255,236,239, 74, 19,195, 48, 22,
+ 2,129,160,104, 88,189, 80, 88, 21,110,110,110,110,184,114,229, 10, 47, 47, 47,143,151,154,154, 42,253,245,215, 95,167, 4, 7,
+ 7,187, 0, 24,244,119,230,229,166, 77,155,106,140, 29, 59, 54,134,199,227,113, 93,186,116, 25,250,254,253,251,222, 46, 46, 46,
+191, 95,187,118,109, 21,128, 74,135, 43,104,208,160, 65, 48,143,199,115,227, 56, 78,112,226,196, 9,131,209,104, 20, 52,108,216,
+ 48,169, 68, 48, 68, 48, 12, 19, 23, 17, 17, 17,104, 10,159, 88, 44, 22,108,221,186,213,160,209,104, 4,190,190,190, 73,197,120,
+ 4, 39, 79,158, 52, 24, 12, 6, 65,221,186,117,131, 77,153,217,156,158,158, 62,100,250,244,233,183, 14, 29, 58,100, 79,211, 52,
+222,191,127,143,180,180, 52, 88, 91, 91, 99,207,158, 61,168, 89,179, 38, 46, 95,190,156,206, 48,204,152,109,219,182,205, 85,171,
+213, 67, 76,240,193,106, 29, 20, 20, 84, 35, 51, 51, 19,214,214,214, 80,169, 84, 8, 14, 14,134,143,143, 15,148, 74, 37, 40,138,
+130,181,181, 53, 54,110,220,152, 71, 8, 73,255, 39,188, 67, 52, 77, 23, 89,153,138,137, 34, 77,179,102,205,112,251,246,237,125,
+149, 17, 69, 28,199,233,248,124,254, 7,194,170,240, 59, 77,211,149, 30,242, 48, 26,141, 2, 66,136, 31, 10,252, 3, 43,250,253,
+ 15, 64, 27,169, 84, 42, 40,165,172, 9,234,212,169,211,202, 84, 18,161, 80,104, 39,145, 72,242, 9,219,180, 65,114,114,178,209,
+195,195, 99,224,128, 1, 3, 12, 0, 48,126,252,248,129,201,201,201, 26,134, 97,104,154,166,145,146,146,130,154, 53,107,218,153,
+ 37,211,127,192,130, 85,158,229,170,184, 5,171,162, 66, 72, 81, 84,102, 72, 72,136, 76, 38,147, 21,237, 51, 24, 12,240,243,243,
+ 99, 89,150, 37, 37,175, 83,152,142,170,130,207,231, 91,124,251,237,183,153, 27, 55,110, 28, 6,224, 59, 83,254,115,120,114, 61,
+236, 46, 33,174, 54, 47, 91,184,254,151,101,139,109,223, 92,216,137,237,235, 86, 26,249, 66,121,176,159,159, 95,235,172,172, 44,
+173,181, 76,139,196, 52, 28,231, 56,238,183, 74,244, 66, 40, 0, 7,239,221,187,247,184, 83,167, 78,247,119, 28, 60,102,171,140,
+138,186, 39,202, 78, 77,176,172,237,197, 19,184,214,232,163,210,233,248,125,250,244,145, 3, 88,103, 2, 31, 98, 98, 98,112,247,
+238, 93, 88, 90, 90,194,210,210, 18,214,214,214, 69,223,171,146,135,133,195,182,103,206,156,129, 76, 38, 67,193,212, 93,200,100,
+ 50, 8,133, 66, 20,127,134,149, 16, 89, 17,132,144,105,199,142, 29, 59,176,100,201, 18,164,167,167, 67,165, 82, 97,222,188,121,
+136,138,138,154,206,113,220,227,127,210,203,225,235,235,203,221,187,119, 15,119,238,220,129, 74,165,194, 47,191,252, 2, 23, 23,
+151,246, 0,190,255, 59,211,197,178,172,160,208,162, 88, 92, 88, 21,183, 98,209, 52, 13,177, 88, 12,123,123,123,204,153, 51, 71,
+240,233,167,159,246,248, 59,211,188,124,249,242,218,107,215,174,253,117,247,238,221,231,135, 12, 25,114,232,249,243,231, 35,173,
+172,172,158, 93,189,122,117,177, 72, 36, 98,171,104, 21,113,123,252,248,177, 99,241, 87,158,101, 89, 41,195, 48, 96, 24, 6, 6,
+131, 1,121,121,121,232,216,177,163,201,124, 15, 31, 62,148, 2,192,247,223,127,207, 7, 32,101, 89, 22, 70,163, 17,133,156,121,
+121,121,252, 14, 29, 58,184,153,100,162, 86, 42, 35, 20, 10, 69,171, 1, 3, 6,220, 61,112,224,128, 77,141, 26, 53, 16, 31, 31,
+143,248,248,120,212,174, 93, 27,235,214,173, 83,113, 28,215,162, 64, 84,157, 52,241,182, 21, 54, 54, 54,252,152,152, 24, 48, 12,
+ 3, 63, 63, 63,108,220,184, 17, 3, 7, 14, 68,131, 6, 13,144,157,157,141,176,176, 48,236,218,181,203, 70, 32, 16,244,253,187,
+223, 33,138,162,254, 36,174,138,111, 85,236, 96, 88,138,197,226,108,145, 72, 36, 44,244,191,122,248,240, 97,165,173, 87,197,234,
+165,199,149,249,253,119,194,194,194, 2,114,185, 28, 6,195,135,183, 41,147,201, 80,187,118,109,147,121,228,114, 57, 41, 52, 98,
+ 24, 12, 6, 36, 36, 36, 24,159, 63,127,110,244,247,207, 31,228,112,113,113, 49, 62,120,240,192,168,209,104,104, 11, 11, 11, 20,
+140,138, 16,152,241,241, 44, 88,133,214,138,242, 44, 87,133,223, 11, 45, 81, 21,189,108, 52, 77,227,194,133, 11, 69, 5,165, 94,
+189,122, 69,215,250,216, 2,203,206,206, 78, 21, 20, 20,100, 25, 27, 27,187,191, 42,255, 47, 20, 87, 75, 22,205,179, 77,127,121,
+ 31,113,202, 4,164, 39, 27, 66,110, 63,123,123, 9,192, 37, 0,192, 22,239,235, 24,255,210,100,113,229,237, 32,109,212, 80, 97,
+113,252,147,110, 61,170, 13, 24,247, 37, 53,105,210,164,166, 35, 71,142, 76, 27, 50,100,200, 36,137, 68,226,205, 48, 76,218,153,
+139, 23,223,244,233,211,199,153, 97,152, 17, 28,199,153,226,147, 20, 55,120,240, 96, 1, 33, 4,142,142,142,252,221,187,119,219,
+ 88, 90, 90, 98,228,200,145, 25,111,223,190, 53, 20,244,196,146, 42,121,251,113, 45, 90,180,248,211,176, 96, 97,195, 94,104, 25,
+168,164,104,243,235,209,163,199,182, 67,135, 14, 33, 53, 53, 21, 42,149, 10,124, 62, 31, 43, 86,172, 64, 76, 76,204,207,132,144,
+231,255,148,202,172, 81,163, 70,220,131, 7, 15,240,236,217, 51,104,181, 90,140, 25, 51,166,184,143, 97,167,191,123,164, 32, 62,
+ 62, 30,123,247,238, 5,203,178, 24, 50,100, 8,106,212,168, 81, 36,172, 18, 19, 19,177, 99,199, 14, 24,141, 70,140, 29, 59, 22,
+213,171, 87,135,193, 96, 16,183,109,219,150,119,253,250,117,230,239, 72,240,140, 25, 51,222, 28, 63,126,252,124,108,108,108,215,
+101,203,150,181, 33,132,176, 95,127,253,245, 82, 75, 75,203,191, 52,251, 50, 35, 43, 7,175, 94,191, 47, 18, 64, 37, 55, 7,123,
+219, 74,243, 69, 70,197, 22,253,223,104, 44,206,103,132,157,173, 77,165,248, 18, 18, 18,242,210,210,210, 84, 99,198,140,177,222,
+182,109, 27,169, 93,187, 54,162,163,163,193,231,243, 97, 97, 97,145, 23, 30, 30, 94,217,208, 12,241,233,233,233, 94, 52, 77, 11,
+ 94,191,126, 13,119,119,119, 4, 5, 5,225,199, 31,127, 68,106,106, 42, 24,134,129,163,163, 35,107, 48, 24, 66,117, 58,221,205,
+191,251, 61, 42,110,101, 42,190,221,185,115,103, 31, 77,211, 20,128,211, 0, 42, 37,176, 57,142,211, 85,175, 94,253, 3,238,170,
+ 88,175,254,131, 22,187,255,216,204,196, 58,117,234,220,144,201,100, 61, 94,189,122,245,129, 21,107,240,224,193,122, 79, 79,207,
+ 91,166,242, 88, 90, 90,102, 8, 4, 2, 59,141, 70,131,123,247,238,193,219,219, 91,144,149,149,181,132, 16, 50,187,160,115,185,
+ 36, 41, 41, 73,160, 80,228,187,241,213,173, 91, 23, 57, 57, 57, 25,102,201,244,145, 5, 86,105,150,171,210, 68, 22, 77, 87,236,
+154, 64, 8,129, 90,173,134, 76, 38, 43,218, 10,253,172, 74, 19, 88, 5,190, 63, 85, 26, 34, 44, 16, 87,146, 3, 7, 14,236, 91,
+183,110,221, 29, 83,255, 87,220, 7,107,203,170, 69,203, 10,197,213,211, 59,151,113, 50, 60, 43,117,214,146, 53,107,171,154,217,
+ 62, 14, 50, 95,103, 39,251,235, 43,126, 90,104,249,230,194, 46, 28,218,178,154,123,250,240, 97,227, 9, 15, 31,246,157, 48, 97,
+130, 45,128, 4, 0,241, 0,238, 1,248,217, 68,113,133,136,136,136,162,224,174,254,254,254,177, 54, 54, 54, 54, 18,137, 4, 74,
+165, 82,251,248,241,227, 42, 57,186, 70, 70, 70,126,212,224,174,132,144, 58, 61,123,246,188,121,244,232, 81, 89,102,102, 38,222,
+191,127,143,175,191,254, 26, 27, 54,108,128,165,165, 37,206,158, 61,107,209,163, 71,143,235,132,144,230,127,119,112, 85, 63, 63,
+ 63,238,209,163, 71,120,247,238, 29, 24,134, 65,175, 94,189, 42,156,192,241, 95,182, 96,113,211,167, 79,199,182,109,219, 64,211,
+ 52,134, 13, 27,134,236,236,236,162,227,182,182,182,165, 29,163, 11,222,247,191, 69, 96,241,120, 60,238,198,141, 27,203,218,180,
+105,131,216,216,216,174, 1, 1, 1,191,140, 28, 57, 50,254,175,242,218, 88, 89,160,145,143, 7,180, 90, 45,180, 90, 45, 20, 10,
+ 5,114,114,114,240,230,205, 27,104,181, 90, 56, 57, 90, 87,154,207,191, 65,237, 34, 62, 71, 71, 71,168, 84, 42,188,125,251, 22,
+ 58,157, 14,246,246, 54,149, 41,243,213, 58,119,238,124,109,223,190,125,118,251,246,237,211,125,246,217,103,194,133, 11, 23, 18,
+ 75, 75, 75, 36, 39, 39,163,138,238, 61, 55,110,223,190, 93,163, 99,199,142,117, 95,190,124,137, 27, 55,110, 64,167,211,193,223,
+223, 31,145,145,145,104,214,172, 25,114,115,115, 31, 60,122,244,232,212, 63,161,172, 22, 14,223, 21,110,193,193,193, 7, 5, 2,
+ 1, 7,160, 74,214,166, 66,196,196,196,136,124,125,125,181, 98,177, 88, 88, 32,214,254, 18,223, 71,174,235,254,210,204,196,242,
+224,225,225, 49,221,205,205,173,163,191,191, 63, 94,190,124, 41, 16,137, 68, 24, 58,116,168,190, 91,183,110,122, 30,143,103,242,
+132, 27,137, 68,242, 82, 46,151,183,214,106,181,208,233,116,184,124,249, 50,236,236,236,102,245,236,217,115, 90, 66, 66, 2,148,
+ 74,165, 80, 40, 20, 22,249,223,182,109,219, 22,105,105,105, 47,205,146,233, 35, 9,172,194, 50, 98,202,240,160,169, 62, 88, 20,
+ 69, 65,167,211, 65, 38,147, 65, 42,149, 66, 38,147, 21, 93,135, 16, 82,170,192,170, 10,170, 85,171,134,160,160, 32,201,161, 67,
+135,126, 91,185,114,229,221,170,112, 28,217,183,215,197,138,205,171,166,124,112, 14, 17,207, 66,112, 60, 44, 51,117,214,146, 53,
+ 83,123,246, 29,148, 84, 82,144, 29, 30,111, 66,207,195, 81,214,192,213,201,238,250,170,229, 75, 44,211, 95,222, 71, 66, 98, 34,
+206, 61,120, 20,162,205,247, 13,251,241, 35,190,220, 40, 28, 91,255, 39, 65, 36, 18, 77, 63,114,228,136, 44, 51, 51, 19, 81, 81,
+ 81, 24, 50,100, 72,230,187,119,239,190,232,221,187,247,134, 75,151, 46,217, 88, 91, 91,227,210,165, 75, 22,213,170, 85, 91, 2,
+160,199,223, 88, 57,114, 70,163, 17,233,233,249,238, 43, 45, 90,180,248, 71,137, 43, 0, 8, 14, 14, 22,244,236,217,243,119, 0,
+237, 95,190,124, 9,150,101,239,134,132,132,180, 40, 60, 94,222, 49, 83,244, 91, 78, 78, 14,223,194,194,162,212,198, 74, 32, 16,
+ 8, 42,107,113, 40,206,121,231,206,157,165,171, 86,173, 58, 62,115,230,204,215,127,145,179, 84, 11, 86,143, 30, 61,160,214,234,
+ 17,151,148, 5,163,145,129, 90,159,252,151, 44, 88, 61,122,244, 64,158, 70,135,152,132,116, 48,140, 17, 57,106,198,212,114, 36,
+253,228,147, 79, 46, 30, 56,112,192,249,222,189,123,208,106,181,108,112,112,240,219,113,227,198, 89,142, 30, 61,218,174,172,208,
+ 54, 38, 96,221,160, 65,131,250,221,185,115, 39,189,110,221,186,182, 15, 30, 60, 64,114,114, 50, 24,134, 65,251,246,237, 33, 20,
+ 10, 99,150, 44, 89, 34,128, 9,174, 5,255, 45,129, 37, 18,137, 16, 22, 22, 86, 40,172,134,127, 44, 33, 36, 20, 10,171, 60,204,
+248,191,138,223,126,251, 45,126,231,206,157, 62,174,174,174,107,135, 15, 31,222, 78,161, 80, 80, 34,145,232, 6,143,199,155, 6,
+224,189,169, 60, 2,129, 96,164,181,181,245, 27,138,162,232,248,248,120,188,126,253, 26,209,209,209, 0, 32,204,203,203,131,163,
+163, 99,145,209,100,208,160, 65,168, 86,173,154, 49, 50, 50,114,164, 89, 50,125,100, 11,214,194,133, 11,177,101,203, 22,140, 31,
+ 95,190,138, 56,125,250, 52, 80, 98,136,176, 96,249,152, 43,197, 27,127,163,209,136,121,243,230,125,240,191,194,225,167, 47,190,
+248,226, 3,206, 19, 39, 78,252,105,136,176, 36,103,105, 72, 78, 78,126,121,248,240,225, 71,203,151, 47,127, 96, 98,101, 88,196,
+ 89,232,131,213,111,240,208,132,245, 75,127,120,190,251,244,213, 6, 9,106, 46, 97,214,146, 53, 51, 75,138, 43, 83, 57,189,157,
+229,222,110,142,118, 55, 86, 46, 95, 98, 85,104, 13, 59, 16,154,152, 5,134, 27, 95,153,135,101,202,189, 51, 12, 19,231,231,231,
+ 39, 0, 76, 27, 22, 52,133,179, 10, 34,229, 79,156, 90,173, 22,247,239,223, 7, 0,140, 26, 53, 42,243,221,187,119,173, 57,142,
+123, 65, 8,121,217,185,115,231, 27, 23, 47, 94,180, 97, 89, 22, 40, 35, 44,197,127, 43,157, 5,249, 6, 30,143, 7, 47, 47,175,
+ 74,139,171,255, 86, 58, 19, 18, 18,198, 79,152, 48, 97,139, 86,171,229,169, 84,170,241,166, 30,171, 40,157,135, 15, 31,126,237,
+229,229,213, 6,101,135, 98, 96, 11, 44,172, 85,230, 92,187,118, 45, 0,212,253, 43,156,101, 89,176, 14, 30, 60, 8,150,101, 81,
+205,217, 26, 90,173, 22, 82,169,180, 82,156, 37, 45, 88,135, 14, 29, 2,203,178,168,238, 98, 11,157, 78, 87,102,231,165, 36,167,
+157,157,221,234,221,187,119,187,133,135,135, 35, 46, 46, 14,107,214,172,121,159,146,146,210,141,199,227,137,126,249,229,151,235,
+221,187,119,119, 98, 24, 70, 91,217,231,206,113,156,150, 16, 50,178,121,243,230,123, 22, 47, 94, 28, 93,175, 94,189,234, 45, 90,
+180,176, 78, 75, 75, 75,121,252,248,241,219, 45, 91,182,200, 25,134, 25, 89,214,208,211,127,243, 61, 2,128,248,248,248, 83, 0,
+248,149, 21, 86,166,164,243,225,195,135,135, 10,184,207,153,194,253,223,186,247,191, 58, 51,177,162,116,142, 28, 57, 50, 14, 37,
+226,155, 85, 54,157,151, 46, 93,122, 55,120,240,224, 69, 13, 26, 52,152, 47,151,203, 17, 17, 17, 81, 20, 22,169,176,140, 19, 66,
+208,191,127,127,124,241,197, 23,184,120,241,226,162,126,253,250,189,251, 79,231,231,191, 70, 96, 25,141,198,216,119,239,222,185,
+236,222,189,155, 38,132,224,183,223,126, 67,241, 41,251, 52, 77,131,162, 40,240,120,249, 20,247,239,223,103, 42,138, 57,101, 52,
+ 26, 99,131,131,131,157,118,237,218,197, 47, 52, 25,199,199,199,131,101, 89, 54, 41, 41,137,218,183,111, 95,145, 53,140,199,227,
+225,254,253,251,140, 94,175,143,169,236, 77, 69, 68, 68,124,148,222,219,205, 23,239,166, 93, 60,119,194,190,105, 80,171, 76, 75,
+ 91,219, 82,187,174,133, 17,223,203, 45,220, 60,234,199,101, 63, 45,180, 46, 20, 87, 7, 67, 19, 51, 53, 90, 99,187,151, 41,121,
+ 79, 63,246, 3,125,250,244,105,243,127,104, 89,155,215,166, 77, 27, 22,128, 61,128,185,133,179, 58, 11, 68, 86,211,218,181,107,
+207, 4, 32, 1, 48,239,239,180, 94, 21, 15, 13,242, 79,179, 92, 21, 71, 72, 72, 72, 52,128, 14,149, 61, 86, 17,250,245,235, 23,
+133, 82, 2,126,254, 21,252, 39, 56, 11,145,158,153,141,168,119,241,200,119, 70,103, 97,124,159, 84,228, 55,101, 48, 48, 72,207,
+174, 84, 24, 57,100,100,229,224,205,219,248,130,165,193,140, 48, 26,149, 5,124,249,142,238, 92, 70, 94,133, 28,124, 62,191,229,
+218,181,107,187, 81, 20, 69,221,191,127, 95,187,124,249,242,216,148,148,148, 94, 28,199,197, 0,128, 66,161,104,123,226,196,137,
+223, 76, 8,201, 80, 86,199, 55,140, 16,210,236,155,111,190,153, 10,160, 37,128,234, 0, 98,144, 63,227,120,221, 63, 44,226,248,
+240,255, 81,238, 42,227,127,101,102,226,190,125,251, 22,124,241,197, 23,188,160,160,160, 57,141, 27, 55,166,222,190,125,139,228,
+228,100,240,120, 60,212,169, 83, 7,157, 58,117,130,187,187, 59,123,246,236,217,159,250,244,233,179, 0,102,124, 60,129,149,154,
+154,218,121,248,240,225,151, 41,138,170, 89,124, 24,175,180, 79, 0, 96, 89,246, 93, 82, 82, 82,185, 65,200, 82, 83, 83, 59,207,
+155, 55,239, 50,143,199,171, 89, 44,254,149, 54, 45, 45,237,139,254,253,251,111,228,243,249,162,226,214, 46,150,101,223, 39, 36,
+ 36,252, 87, 29,138, 75,198,193,234,220,173,119,234, 95,229,148, 11, 40,207,136,179,219,144,148,156,138,131,161,137, 25, 57, 58,
+ 99,219,136, 20,213,243,127, 83, 65,227, 56, 46, 25,192, 23,101, 28,123, 13, 96,252, 63, 32,141,164, 64,100,153,103,203,252, 15,
+128, 97,152,184,142,237,219,162,100, 88,134,146,191,141, 70, 99,156,169,124, 29,218,181, 41,147,167,240,123, 69,124, 52, 77,207,
+ 12, 10, 10,162,103,206,156,153,116,254,252,249,223, 51, 50, 50,102,112, 28, 87,164,204, 10,102, 13, 6,252,197,178,170, 69,254,
+ 10, 15,203,205, 37,225, 31, 89,223,253, 79,204, 76,220,184,113,227,247,179,102,205,218,229,230,230,182,183,101,203,150,117, 61,
+ 61, 61, 45, 45, 44, 44,144,157,157,157,147,145,145,241,234,204,153, 51, 67,134, 15, 31, 30,109,126,162, 31, 89, 96,165,164,164,
+168, 0, 52,251,152, 23,171,128,179,198, 63,166,203,165, 93,190, 31, 91,150,127,176, 14, 97,161,248, 42,245,119, 5,210, 32, 75,
+205, 76, 90,119,241,197, 74, 45,195,177,122,134, 29, 21,145,172, 10, 51, 23,189,127,108,197,104, 22, 87,255, 35,120,254,252,121,
+224, 63,145, 79,167,211, 77,107,222,188,249,207, 70,163,113,149,193, 96,184,109,126, 82,102,252,147,177,124,249,242,232,194,118,
+185,127,255,254, 52, 0, 28, 62,124,216,104,206,153,255,160,192,250,183,226,240,139, 63, 26,216,146,194,169,162,223,101,225, 85,
+ 98,238,141,191,218, 99, 53,195, 12, 51,254,103, 68,122, 12,128, 94,230,156, 48,227,127,174,253, 51, 11,171,143, 10,202,156, 5,
+102,152, 97,134, 25,102,152, 97,134, 25, 31, 23, 4, 64,199, 50,122, 97, 38,207, 14, 32,132,116,172,236,133, 77, 88, 49,220,204,
+105,230, 52,115,154, 57,205,156,102, 78, 51,231,255, 51,206,127, 13,138, 59,114,126,236, 13, 64, 71, 51,167,153,211,204,105,230,
+ 52,115,154, 57,205,156,102,206,127,219,102, 30, 34, 52,195, 12, 51,204, 48,195, 12, 51,204,248,200, 48, 59,185,155, 97,134, 25,
+102, 20,131, 66,161,232, 9, 96, 1,242, 93, 40,150, 40,149,202, 67,230, 92, 49,227,255, 19, 28, 28, 28,100,118,118,118,191, 83,
+ 20, 85, 3,248, 48,228, 82, 41,193,189, 97, 52, 26, 19,210,211,211, 59, 37, 38, 38,166,254, 55, 57,255,117, 2,171,125,109,235,
+ 86, 30,181,220,247,165, 36,167,134,230,106,178, 71,255,254, 42, 39,189, 42, 23, 38,132,216, 9,133,194,129, 50,153,172, 35,199,
+113, 30, 52, 77,135,103,101,101, 93, 49, 24, 12, 7, 56,142,203, 53,191, 2,102,252,221,240,243,243,107, 40, 20, 10,103, 17, 66,
+154, 50, 12,227,198,231,243,149, 0, 30,104,181,218, 21,161,161,161,161,230, 28,250,255, 1, 66, 8,229,226,226,242,179,181,181,
+117, 80,102,102,230, 16, 0,115, 34, 34, 34,124, 41,138,130,143,143,207, 28,133, 66,241,198,210,210,114,123,118,118,246,221,132,
+132,132,105,149, 89, 59,206,140,127, 46, 60, 61, 61,131, 41,138,114, 43, 92,146,173,164, 32, 40, 77, 32,112, 28, 23, 29, 22, 22,
+ 86,102, 48,103, 55, 55, 55, 15, 75, 75,203,141, 0, 26,151, 20, 21, 37, 81, 48,204,246, 40, 59, 59,251,139,184,184,184, 82, 3,
+241,218,218,218, 90, 56, 58, 58, 46, 32,132,244,167, 40,170,194, 5,127, 89,150, 53,114, 28,119, 56, 57, 57,121, 94,122,122,122,
+ 78, 89,231,217,217,217, 93,185,121,243,102, 99,123,123,251, 10,195,210, 48, 12,131,248,248,120,135,238,221,187,223, 4, 80,239,
+191,201,249,175, 19, 88,224,168,161, 43,190, 27,235,154, 18,251,198,117,206,218, 99,117, 90,213,179,111,123, 43, 60, 53,177, 50,
+ 20, 18,137,100,160,175,175,239,186,159,127,254,217,206,221,221,157, 72,165, 82, 36, 36, 36,212,123,252,248,113,159,249,243,231,
+207,227,243,249, 35, 13, 6,195,229,191, 88,105, 90,219, 74,121,179,210, 84,134,111,205, 85,137, 25,149, 65,255,254,253,233,216,
+216,216,249,246,246,246, 95,205,158, 61, 91, 84,179,102, 77,200,229,114, 36, 39, 39, 87,127,253,250,117,181, 13, 27, 54,244,108,
+222,188,249, 47, 58,157,110,110, 72, 72,136,193,156, 99,255,219,112,113,113,249,249,228,201,147,147,235,214,173,139,214,173, 91,
+223,245,243,243,179,148, 74,165,184,112,225, 2, 60, 61, 61,235, 91, 90, 90, 62,216,188,121, 51,127,193,130, 5,141,142, 29, 59,
+ 6, 0, 83,204,185,246,191, 15,138,162,220, 66, 67, 67, 29,165, 82, 41,140, 70, 99, 65,244,126, 22, 28,199, 21,125, 22, 23, 67,
+ 70,163, 17,237,218,181,211,151,199, 41, 22,139, 55, 60,123,246,172, 99,225, 58,126,197,132, 84,169, 80, 42,149, 29,219,181,107,
+183, 1, 64,169, 1,181, 29, 29, 29, 23, 12, 24, 48, 96,122,131, 6, 13, 0,160, 40,157,133,159,169,169,169,152, 52,105, 82,209,
+ 53, 88,150,197,205,155, 55,167,126,249,229,151, 0,240,101, 57,247, 94,195,222,222,158, 84,180, 4,222,252,249,243, 49,127,254,
+124,172, 91,183,142,240,120, 60,235, 10,242,243,163,115,254,235, 4, 22,161,200,185,245,155,119,141,158, 49,160, 41, 89, 62,174,
+149,215,119,219,175,223,235, 88,203,166,245,149,232,140, 88, 19,197,213,212, 9, 19, 38, 44, 93,184,112,161,248,213,171, 87, 8,
+ 11, 11, 3,195, 48,176,176,176,128,175,175, 47,117,238,220, 57,151,105,211,166, 29, 17, 10,133,163,116, 58,221,177,170,222,152,
+179, 37,127,133, 76, 68, 13, 22,242,120, 15,116, 12,115,234,159,152,249,238,238,238,151, 12, 6,195,178,248,248,248,107,255, 43,
+ 5, 70,161, 80,180, 16, 10,133,243,222,189,123,215,133,227, 56,230,255,227, 75, 17, 19, 19,179,176,101,203,150, 51,230,207,159,
+ 47,122,251,246, 45, 34, 35, 35,161, 84, 42, 81,179,102, 77,184,187,187,147,117,235,214,137,127,249,229,151, 41, 79,158, 60,225,
+ 3,152, 81, 25, 75,137,179,179,243,152, 14, 29, 58,244,181,183,183,183,138,143,143,207,186,115,231,206,201,132,132,132,173, 85,
+205, 75, 66, 8,101,111,111, 63,162, 71,143, 30,125,109,109,109,109, 19, 19, 19, 51,174, 92,185,114, 34, 57, 57,121,251, 95,177,
+180, 16, 66, 92, 0,248, 2,176, 43,216,149,224,238,238,254,226,237,219,183,201, 31,145, 83,233,238,238, 30, 86, 21, 78, 7, 7,
+ 7, 25,143,199, 59, 68, 8, 81,148, 99, 33, 80, 50, 12, 51,160, 32,192,113,153,176,180,180,108,234,229,229,133,144,144, 16,204,
+157,251,127,236, 93,123, 92, 84, 85, 30,255,158,123,231,197,188, 96, 24, 64, 96, 24, 5,149, 55,152,138, 6,152,226,170,169,105,
+202, 90,138,149,181,165,105,166,100, 46,110, 9,169,176,226, 35,205, 30,102,143, 13,113, 85,220,245, 85,150, 86,102, 25,161,109,
+186,105,226, 11,197,215,240, 88, 69,112, 16, 70, 30, 34,143,153,185, 51,115,239,254, 1, 51,226,198, 99,134,220, 36,155,239,231,
+115, 62,115,239,157,225,203,185,231,156,251, 59,223,251, 59,191,115, 78,170,114,228,200,145, 40, 44, 44, 4, 33, 4,175,188,242,
+ 10,137,136,136,224,151,151,151, 99,240,224,193,200,201,201,121, 8, 78, 56, 82,231,187, 0, 40, 0, 76,227, 56,238, 70,171,235,
+158, 0, 62, 7, 80,201,113,220,228,123,149, 63,177, 88,140,157, 59,119,130,207,231,131,207,231,163,166,166, 6,106,181,218,118,
+ 46, 16, 8,108,199,189,122,245,234,148,143,101,217,104,154,166, 81, 95, 95, 15,139,197, 98, 75,181,181,181,224, 56, 14, 34,145,
+ 8, 22, 75,243,182, 75,214,239, 88,150,141,238,160,252,166,170, 84, 42,236,216,177, 3, 70,163,177,173,182,139,252,252,219,155,
+130,208, 52,141, 1, 3, 6, 80,132,144,169, 29, 9, 44, 66, 8, 7, 0,179,103,207, 6, 77,211,182,173,239,172,199,214,100,177,
+ 88,144,158,158,222, 28,176, 77, 81,157,213,245, 93,231,252,205,183,255,142,212,245,200, 64,247,196, 17,113,177,111,185,136,120,
+ 98,214,108,130,197,108, 2,107, 54,130, 38, 44,226,194,123, 32,170,151, 11,170,107,110, 33,117,107, 94,157,182, 74, 31,147, 93,
+ 80,165,233,164, 2, 2, 98, 98, 98, 78, 29, 60,120, 80,113,224,192, 1,104, 52, 26,188,254,250,235, 0, 0,169, 84,138,253,251,
+247,131,166,105,176, 44,139,113,227,198,233,180, 90,109, 24,199,113,213, 93,120,168,253,135,247, 83,159,220,189,104,184, 50,114,
+238,167, 37,215,111, 26,251,114, 28,215,237, 22, 80, 83,169, 84, 28,159,207,111, 52,155,205,241,191, 5,145,165, 82,169,134,242,
+249,252,253,102,179, 89,194,231,243,197, 87,174, 92, 49,220,111, 15,196,192,129, 3, 31, 80, 42,149, 63,237,217,179,199, 37, 55,
+ 55, 23, 53, 53, 53,168,172,172,196,252,249,243,145,145,145,129,200,200, 72, 72,165, 82, 8,133, 66,188,244,210, 75, 77,183,110,
+221, 26,113,226,196,137,227,118,180, 73,122,248,240,225, 59,182,109,219, 22, 96, 54,155, 41, 0, 48, 26,141, 40, 45, 45,181, 44,
+ 89,178,228,234,137, 19, 39,166, 57, 42,178, 8, 33,212, 67, 15, 61,180,117,219,182,109,129, 66,161,144, 98, 89, 22, 38,147, 9,
+133,133,133,150, 37, 75,150, 92, 57,121,242,228,211, 93,105,247,132,144,129, 18,137, 36, 34, 49, 49, 81, 55,105,210, 36, 6, 0,
+142, 31, 63, 78,157, 57,115,198,181, 79,159, 62, 37,105,105,105,167,186,192, 57, 72, 46,151,135,190,248,226,139, 55, 38, 78,156,
+104, 18, 8, 4,236,143, 63,254,200,211,104, 52,174, 1, 1, 1,197,139, 23, 47, 62,227, 96, 91,220,183,103,207,158, 17, 42,149,
+202, 2,128,179, 26,120,138,162,184,150, 79, 20, 23, 23,243, 18, 18, 18,254,165,213,106,255,216,225,203,152,143, 79,184,175,175,
+239,161,180,180, 52,165,181,147,106,157,172,117,149,158,158,206,148,151,151,199,106,181,218,211,112,194,222,122, 63, 6, 32, 26,
+192, 57, 0,163, 56,142,187,209, 34,174,190, 7, 16, 1,224, 71,142,227,134,221,139,188,133,134,134, 86,228,231,231,247,248,226,
+139, 47,192,231,243,241,221,119,223, 33, 35, 35, 3, 59,119,238,108, 83,100,249,250,250, 34, 46, 46,174,236,244,233,211, 61,219,
+227, 12, 12, 12,188, 89, 84, 84,228,122,243,230, 77, 88, 44, 22, 28, 59,118, 12, 27, 55,110, 68,143, 30, 61,224,233,233, 9, 47,
+ 47, 47, 68, 71, 71, 67, 42,149,218, 68,214,212,169, 83,235,138,138,138,220,218,226, 11, 15, 15,215, 62,243,204, 51,190, 39, 79,
+158,132,201,100,106, 83, 96, 37, 37, 37,181,246, 34, 65, 42,149, 98,210,164, 73,229, 23, 46, 92,104,247,229, 35, 50, 50,178,252,
+220,185,115, 62,103,206,156,185,163,173,183, 37,136,104,154,134, 92, 46,199,144, 33, 67, 42, 78,159, 62,237,243,107,114,222,215,
+ 30,172, 96,127,159, 37,139,230, 60, 38,134,133, 1,103,106, 2,152, 70,128,169, 7,107,108, 4, 17,136, 1, 83, 19,148,194,106,
+188,255, 92, 31,215,213, 95, 92,185, 48,170,175,215,132,131,197,186,253,237,241, 41, 20,138,244,245,235,215, 43,242,243,243,161,
+209,104,176,118,237, 90,172, 88,177, 2, 2,129, 0,213,213,213,136,143,143,199,145, 35, 71,192, 48, 12, 82, 83, 83,149, 41, 41,
+ 41,243,208, 28,108,234,160,247,138,151,241,201,230,247,149, 74,186, 10,207,143, 58,225,241,183,236,203,137, 0, 62,232,142, 21,
+240,214, 91,111, 73,146,147,147,247,250,249,249,117,107,145,165, 82,169,134,138,197,226,253, 73, 73, 73,210, 55,222,120,227,174,
+136, 85,181, 90, 29,201,227,241, 62, 54, 26,141,175,148,151,151,127,219, 5,227,221, 59, 38, 38,230,141,243,231,207,127, 86, 95,
+ 95,191,171,173,223,200,100,178,169,161,161,161,143,157, 56,113, 98, 9,199,113,151, 59,227, 20,137, 68,243, 23, 46, 92,232,114,
+237,218, 53,212,214,214, 66, 40, 20,218,118,153, 39,132, 64, 36, 18,129,162, 40, 8,133, 66, 60,251,236,179, 46,155, 54,109, 90,
+ 0,224,169, 78,219,164,143,207,204,173, 91,183, 6, 48, 12, 67, 53, 52, 52, 64, 32, 16, 64, 32, 16,224,129, 7, 30,160, 23, 46,
+ 92,216,115,254,252,249,115, 0,124,232,200,253,187,187,187, 63,183,117,235,214, 64,161, 80, 72,149,151,151, 99,232,208,161, 56,
+118,236, 24, 98, 98, 98,232,228,228,228, 94,243,230,205,155, 13, 32,195, 81, 47,147, 68, 34,233,247,253,247,223,151,246,236,217,
+211,246,246,213,187,119,111,203,132, 9, 19,170, 47, 94,188, 24,122,244,232,209,170, 33, 67,134, 92,117,128,211, 79, 34,145,132,
+125,253,245,215,229,203,151, 47,127, 56, 51, 51,115, 18, 0, 68, 71, 71,127,185, 98,197,138,131,213,213,213,145,135, 15, 31,174,
+142,139,139, 43,115, 32,171, 30,222,222,222,230,196,196, 68,121,123, 63,216,178,101, 75, 21,128, 30,157,180,235,120,138,162,150,
+ 69, 70, 70,186,142, 28, 57, 18,135, 14, 29,194,203, 47,191,108, 48,153, 76, 5, 0, 48,122,244,232,144,244,244,116,225,201,147,
+ 39,161, 80, 40,248,229,229,229,155, 85, 42,149, 51,240,221,126, 76, 2,240, 47, 0,145, 0, 14, 18, 66,158, 0,240, 41,128,112,
+ 0, 26, 0, 9,247, 50,115, 22,139, 5, 60, 30, 15,101,101,101,216,180,105, 19, 86,173, 90,133,224,224, 96,152, 76, 38,155,192,
+226,241,120,224,243,249, 32,132,216,189,149,150,217,108,198,241,227,199,177,245,159,255, 68,234,146, 37,144,203,155,155, 41,195,
+ 48,168,174,169,129,139,139,139,205,131,213, 17, 56,142,219, 85, 88, 88,152,164, 86,171,239, 24, 26,180,126,182,216, 56,176, 44,
+ 11,179,217, 12,131,193,128,191,255,253,239,102,142,227,118,117,242, 76,218, 60, 94, 73, 73, 73, 48, 24,110,191, 43,247,239,223,
+ 31, 0, 16, 16, 16,128, 1, 3, 6,216,206,173, 30, 42,123, 56,255,254, 80, 63, 52,181,250,117,104,250,219, 86,155,143,208,208,
+ 80,248,250,250,218,197,121, 95, 11,172,130,171,149,107,146,151,189,247,182, 84, 72,243,103,140, 15,135,202,149, 15,136,149, 16,
+ 12, 79, 1, 81,248, 55, 55,128,234,255, 0,217, 41, 72, 29, 91, 69,189,214,196,124, 62, 62, 80,233,245, 77, 81,187,193,117,209,
+ 61,123,246,196,225,195,135,209,167, 79, 31,164,165,165, 33, 44, 44, 12, 82,169, 20, 21, 21, 21,104,104,104,128, 84, 42, 69, 93,
+ 93, 29,162,162,162,104,185, 92, 62,210, 81,129, 69, 8,137,154, 21, 31, 19,205,243, 14,199,208,135, 99,145,189,116,132,116,203,
+ 15,215, 22, 17, 66, 54,183,222,112,181,187, 32, 33, 33, 1,215,175, 95,151,172, 91,183,174,203, 34, 43, 32, 32, 32,155, 97,152,
+ 49,118,184,195,191, 47, 42, 42, 26,213, 85,113,181,119,239, 94,169, 92, 46,199, 27,111,188,113,183,196,213,191, 31,121,228, 17,
+215,111,191,253,118,143,175,175,239,227,142,136, 44, 66, 72,239,169, 83,167,126,181,113,227,198,144, 81,163, 70, 89, 0,180,105,
+ 80, 34, 34, 34,166,100,103,103, 79,158, 53,107, 86, 63, 66,200,196,206, 68, 22, 33,228,161,222,189,123,163,180,180, 20, 21, 21,
+ 21,208,235,245,168,168,168, 0, 0,148,149,149, 65,173, 86, 67,161, 80, 64,173, 86, 35, 36, 36,132, 80, 20, 21, 99, 79,126, 71,
+142, 28, 57, 9, 0, 85, 92, 92, 12,157, 78, 7, 55, 55, 55, 72,165, 82,168,213,106,140, 24, 49,130, 23, 24, 24,248,168,163, 2,
+107,252,248,241, 83, 36, 18, 9, 85, 90, 90,138,203,151, 47,195, 96, 48,160,160,160, 0,110,110,110,120,248,225,135,249,129,129,
+129, 19, 29, 21, 88, 0,250,205,158, 61,187,162,181,184,178, 66, 42,149,146,144,144,144,106, 15, 15,143, 65, 0,174, 58,194, 57,
+111,222,188,202,213,171, 87, 15,207,201,201, 73,177, 94,204,201,201, 73, 6,128,247,222,123,239,176,151,151,215, 32, 0,142, 8,
+ 44,112, 28,199,206,154, 53,171, 80, 32, 16, 64, 40, 20,218,146, 72, 36, 2,159,207, 7, 77,211,110,118,208, 44,214,104, 52,253,
+101, 50, 25, 52, 26, 13,104,154, 6, 33,164, 80,171,213,246, 7,128,148,148,148,162,166,166,166,190,122,189, 30, 9, 9, 9, 36,
+ 62, 62,254,129,181,107,215, 46, 1,208, 45, 4, 22, 33,228, 65, 0,107, 1, 24, 1, 44,225, 56,238, 88,119,178,111, 28,199, 85,
+ 16, 66, 70,180, 18, 89,167, 1,136, 90,196,213, 8,142,227, 42,238, 97,217,129,101, 89,240,249,124,188,253,246,219, 96, 24, 6,
+219,182,109,195,167,159,126, 10,138,162,108,129,238,174,174,174,120,255,253,247,127, 22,248,222,153,112,219,178,101, 11, 82,146,
+147,109,226, 10, 0, 4, 2, 1,124,188,189,225,225,233,137,226,226,226, 78, 5, 86,101,101,229,210,220,220, 92,116, 20,228, 62,
+121,242,237, 17,214,214, 65,238,246,228,147,166,105, 24, 12, 6,140, 25,115,187,251,152, 55,111,158,237,184,186,186,218,250, 76,
+128,216,121,243, 52, 77,163,137, 3, 30,115,185,125,237,209, 87, 94,177, 29,223,184,113,195, 97,206,251, 82, 96, 13, 47,170,254,
+240, 8,193,128,228,231, 31,158,174,242,116, 5, 87, 95, 1,193,168,165, 56, 91, 45,193,186,245,205,125, 97, 82, 66, 20,250,141,
+ 94, 9, 99,214, 88,204, 28,104, 17, 46, 40,199, 66, 0,105,109,241,121,122,122,122,152,205,102, 16, 66, 32,149, 74, 17, 30, 30,
+ 14, 23, 23, 23,232,116, 58,188,252,242,203,216,191,127, 63, 24,134,129, 64, 32, 64,159, 62,125,192, 48, 76,223, 46,120,175, 54,
+190,251,214, 42, 69,213,169, 29, 56,249,159, 90, 72, 60,122, 98,201,180,104,247,244,109,185, 75, 1, 36,119,199, 74, 24, 48, 96,
+ 0,150, 47, 95, 46, 89,186,116,105,151, 68, 22,195, 48, 43,248,124,254,208, 85,171, 86,137,167, 77,155,246,179,239,243,242,242,
+144,144,144,208,164,215,235, 95,239,170,184,250,242,203, 47,165, 74,165, 18,165,165,165,248,165,207,132, 85, 92,109,223,190,221,
+213,223,223, 31,145,145,145, 46,239,188,243,142,221, 34,139, 16,210,127,242,228,201,187, 55,110,220,232, 63, 99,198,140,146, 19,
+ 39, 78, 84, 16, 66,218, 19,226,218,231,159,127,190, 36, 43, 43, 43,132, 16,242, 85,103, 34,203,108, 54,247,146, 72, 36,208,233,
+116,248,243,159,255,124, 71,128,170,117, 56, 27, 0, 52, 26, 13,212,106, 53,244,122,189,159, 61,247,172, 84, 42,221, 1,224,133,
+ 23, 94, 64,105,233,237,112, 69, 63, 63, 63,148,150,150,194,108, 54, 43, 29, 45, 71,165, 82,169, 52,153, 76,136,139,139,131, 94,
+175, 7, 0, 60,241,196, 19,224,243,249,168,172,172, 4,195, 48, 30, 93,168, 30,207, 9, 19, 38,104,219,251,210,213,213,149,113,
+119,119, 15,119,144,211, 35, 62, 62,254,218,134, 13, 27,126, 54, 84,151,155,155,251, 71,165, 82,153,163, 84, 42, 67,186,144, 87,
+182,181,160,178, 30, 11,133, 66,171,199,193,174,183, 99,150,101,177,111,223, 62,208, 52, 13, 30,239,182, 73, 76, 75, 75,123, 81,
+161, 80,120, 31, 58,116, 8,215,175, 95, 71, 67, 67, 3,234,235,235, 17, 20, 20,212,103,244,232,209,121,215,175, 95,191,114,254,
+252,249,199,239,181, 19, 28,128, 53, 46, 44, 3,192,128,238,102,223, 90, 68,214, 84, 0, 39, 90,196,149, 17,192,148,123, 41,174,
+ 90,215, 61,143,199,179, 61,231, 46, 46, 46,136,138,138,178,137, 41, 66, 8, 26, 27, 27,193,227,241,172,241, 66,118, 25,191,218,
+218, 90,248,250,248, 64, 46,151, 35, 40, 56, 24,133, 5, 5, 0, 96, 59, 22,137, 68, 32,132,192,108,238, 56, 42,160,101, 38,224,
+ 2,116, 16, 79,213, 69,113,201, 89,197, 80, 39,246, 31, 44,203, 90,109, 62,119, 55, 56, 61, 61, 61, 81, 95, 95,111, 23,231,125,
+ 43,176,150, 17, 66, 29, 9, 82,110, 74,158, 62, 98,122, 92,136, 59,244,186,203, 16,201, 61, 65, 20, 1, 88,183,254, 91, 92,184,
+210, 28, 26,181,238,211, 83,216,178,232, 17, 64,172, 68, 95,153, 6,158, 82,201,227,237, 9,172,234,234,234, 6,147,201,164, 20,
+139,197,224,241,120, 16, 10,133,168,170,170, 66, 90, 90, 26, 62,249,228, 19, 4, 4, 4,192, 98,177, 64, 36, 18,161,178,178, 18,
+ 2,129,192,161,217,137, 60, 30,153,144,254,194,248,222, 82,159, 96, 84,125,183,162,249,162,247, 64,204,142,167,132,239,236, 62,
+251, 28, 33,228, 29,142,227, 42,187, 91, 37,200,100, 50, 68, 71, 71, 99,238,220,185,146,245,235,215,255, 3,128,218,145,191,215,
+106,181, 63,170, 84,170,177, 75,150, 44,201,190,118,237,154, 56, 54, 54, 22, 50,153, 12, 50,153, 12, 23, 47, 94, 68, 82, 82,146,
+222,104, 52, 78,236,138,119,140,207,231,103,141, 31, 63, 94, 42, 18,137, 80, 84, 84, 4,165, 82,249,139,238,213, 42,174,118,238,
+220,233, 26, 18, 18,130, 75,151, 46, 97,200,144, 33,240,245,245,117,121,245,213, 87, 59, 21, 89, 45,111, 60,239,125,252,241,199,
+ 1, 60, 30,143,124,246,217,103,189, 1, 36,217,243,191,183,111,223, 30,186,107,215,174,181,132,144,199,184,118,130, 15, 5, 2,
+ 65,153, 78,167, 11,236,217,179, 39, 54,109,218, 4,138,162, 80, 94, 94,142,197,139, 23, 99,245,234,213,136,137,137,129, 92, 46,
+ 71,207,158, 61, 81, 84, 84, 4, 23, 23,151,114,123,254,247,181,107,215,170, 89,150,237,177,127,255,126,232,116, 58,219,117,127,
+127,127,212,212,212,192, 96, 48, 84, 57, 90,150,101,101,101, 85, 0,188,243,242,242,112,229,202, 21,140, 27, 55, 14,159,127,254,
+ 57, 6, 15, 30,140,150,120,172,170, 46, 84,145,133,166,105,174,147,242,119,191,155,156, 45,157,150,163,156,224, 56,142,107, 45,
+168,172,199,214,196,227,241,236, 9,242, 95, 21, 22, 22,182,172, 79,159, 62,225,169,169,169,124,154,166, 49,108,216,176,144,133,
+ 11, 23,150,184,184,184,120,188,246,218,107,146,182,156,193, 0,250,135,135,135, 75,187,129,249,104,237,165,235,150,147, 78, 8,
+ 33, 61, 90, 60,126, 66, 0, 76,203,231, 78, 66,200,168,214,129,239,247,210,131,181,108,217, 50,204,153, 51, 7,222,222,222, 72,
+ 73, 73, 1,143,199,179, 37, 66,136,205,163,229, 8,122,120,123,119,248,189, 53, 6,171,147,151,168,255,203, 50, 13,246,138,161,
+230,126,149,103,151,247,238,255,193,121, 95, 10, 44,171,184, 74,121, 46,110,250,176, 16, 87,228, 28, 58,129,145,125, 41,192, 40,
+236,192,132,154, 64, 4, 82,120,203, 41,117, 7,174,195,188,146,146,146, 94, 10,133, 2, 12,195, 64, 40, 20, 34, 50, 50, 18, 71,
+143, 30,133,209,104,132,193, 96,176, 25,199,243,231,207,131, 97,152, 67, 14, 60, 44,180,183,156,255,126,114,234, 10, 57,242, 55,
+ 67, 33, 21, 98,228,160, 64,192, 35, 12,116,181, 6,107, 23,196, 43, 95, 92,179,103, 29,236,136,151,185, 23, 2,171,176,176, 16,
+153,153,153,141, 6,131,225,185,174,112, 88, 69, 86, 70, 70, 70,182, 66,161, 16,255,225, 15,127, 64,126,126, 62, 94,125,245, 85,
+189,209,104,156,208,213,248, 46,147,201, 52,227,171,175,190,218, 31, 24, 24, 40,141,139,139,187,195,221,221, 21,113, 69,211,244,
+191,103,206,156, 41, 15, 8, 8, 64,113,113, 49,220,220,220, 32,147,201,208,187,119,111,236,216,177,195,229,233,167,159,238, 80,
+100,113, 28,199, 17, 66, 18,159,124,242,201,189, 89, 89, 89,254, 51,102,204, 40,217,189,123,247, 94, 0,237, 25, 19,249,228,201,
+147,227,179,178,178,252,103,205,154,165, 1,240, 23,174,131,153, 29, 44,203, 30, 41, 42, 42,234, 27, 22, 22, 70, 66, 66, 66, 32,
+ 20, 10,225,231,215,236,164,234,223,191, 63,194,195,195,193,231,243, 1, 0,133,133,133, 0,144,107,207,189, 31, 62,124,248,203,
+130,130,130,153,131, 7, 15,166,125,124,124,108,193,179, 2,129, 0, 43, 87,174,100, 74, 74, 74,246, 57, 90,158, 7, 15, 30,252,
+ 60, 63, 63,255,133, 97,195,134,241,220,221,221, 33, 18,137,208,175, 95, 63,168, 84, 42,172, 92,185,146,185,124,249,242,190, 46,
+ 84,211,213,252,252,124,151,224,224,224, 54, 45,191, 88, 44,118, 5,224,168,231,161,244,248,241,227,194,216,216,216, 47,191,249,
+230,155,200,214, 95, 68, 71, 71,127, 41,147,201,220, 0,148,119, 33,175,108,107, 65,101, 77,214, 33, 67,123, 4,150, 86,171,221,
+235,227,227,243, 31,111,111,239, 31, 35, 34, 34,220,242,243,243,145,154,154, 42, 48, 24, 12,189,114,114,114,108, 29,113, 27,237,
+ 16, 13, 13, 13,226,110, 96, 62,146, 0,188, 11, 64, 2, 32,165, 27,138, 43,111, 52, 7,180,135,162,121, 88,240,137, 22,177,101,
+141,201,186,167, 34,139,227, 56,240,249,124,132,134,134, 98,193,130, 5, 88,179,102, 13, 18, 19, 19, 17, 28, 28,108,171,123,107,
+144,187, 35, 30, 44,129, 64, 0,111,111,239,230, 73, 39, 45,222, 43, 0, 40, 44, 40, 0,143,199, 3,203,178, 48, 26,141,157,122,
+176,122,244,232,177,236,205, 55,223,156, 63,126,252,120,234,127,103,220, 89,151,149,104,157, 76, 38, 19,246,238,221, 59,127,245,
+234,213,176,199,235, 69,211, 52,250,247,239,127,199,176,224,135, 31,222,142, 84,136,138,138,194,152, 49, 99,236, 18, 77,173, 57,
+ 67,211,223,190, 99, 88,240,107,175,219,197,214,243,217,217, 8, 94,245,129, 67,156,191, 85,180, 57, 71,242, 72,144, 98,101,202,
+ 51, 67,167, 15, 11,146,227,187, 67,167,177,238,235,203,151, 74,202,171,192, 86,228,131,213, 93, 68, 82, 66, 20,194, 3,148, 8,
+ 15, 80, 34, 41, 33, 10,108,229, 57,112, 53,197,224, 68, 10,148,214, 66,219,129,219,116,205,138, 21, 43,106,149, 74, 37,196, 98,
+ 49,132, 66, 33,202,202,202, 16, 17, 17, 1,145, 72,100,123, 3,165, 40, 10,169,169,169, 58,157, 78,183,222,222, 27,145, 10,169,
+217,107, 94,121,194, 91,224, 34, 3, 74, 15,193, 85, 46,195,166,191,189, 13,212,107, 1, 90,128,248, 63, 12,160,125, 61, 21,163,
+ 8, 33, 33,221,173, 18,138,139,139, 49,127,254,252, 70,189, 94,255,139, 2,221,181, 90,237,143, 12,195,140, 93,189,122,117,211,
+246,237,219,127,177,184,178,114, 26,141,198,113,239,190,251,110, 67, 81, 81,209, 47, 18, 88, 60, 30,239, 53,147,201,228,154,153,
+153,201, 14, 26, 52,200,242,216, 99,143, 89,198,142, 29,107, 25, 50,100,136, 37, 34, 34,194, 50,101,202, 20,139, 94,175, 23, 73,
+ 36,146, 55, 59, 49,138, 23,118,239,222, 61,122,214,172, 89,154,172,172, 44,255,152,152, 24, 21,199,113, 75,219, 74,131, 7, 15,
+246,182,138,171, 93,187,118,117, 26,131,101, 48, 24, 62,204,200,200,208, 91,103,185, 8,133, 66,120,121,121,217,132,176, 64, 32,
+128, 72, 36, 2,195, 48,248,232,163,143,154,154,154,154,214,217,115,239, 85, 85, 85,155,147,147,147,175,102,103,103,155,234,234,
+234, 64, 8,193,181,107,215,176,114,229, 74,102,195,134, 13,215,106,107,107, 55, 56, 90,158,117,117,117, 89,201,201,201, 87,246,
+237,219,103,162, 40, 10, 53, 53, 53,112,117,117,181,113,222,186,117,203, 97,206, 33, 67,134, 20,149,148,148,184, 54, 54, 54,182,
+229,205, 36, 82,169,244, 65, 0, 7, 29,225,140,138,138, 42,190,122,245,170,124,229,202,149, 63,140, 30, 61,122,141, 92, 46, 47,
+144,203,229, 5,163, 71,143,126,243,131, 15, 62,248,151,139,139, 75, 52, 0,135, 55,135,165, 40,138,109,109, 55, 90,199, 96,137,
+ 68, 34, 8, 4, 2,187,150,169,112,115,115,219,146,145,145,225, 86, 94, 94, 14,131,193,128,188,188, 60,228,229,229,161,172,172,
+204,214, 9,183,177, 15, 27, 26, 27, 27, 93,238,181,237,224, 56,238, 95, 28,199,245,231, 56, 46,144,227,184,238, 56, 73,230,211,
+ 86,226,106, 4,199,113,249, 0, 70,180,156, 71, 2,248,226, 94,122,176,172, 2,139,199,227, 97,218,180,105, 56,112,224, 0,130,
+130,130,108,129,237,173,131,220, 29, 17, 4,102,179, 25,253,250,245,131,193,104,188, 67,160,243,120, 60,120,245,232,129,162,162,
+ 34,187, 60, 88,132,144,169,227,199,143,167,206,159, 63,143,176,176, 48,156, 58,117,202,150,242,242,242,112,246,236, 89,156, 59,
+119, 14, 23, 46, 92,192,160, 65,131, 80, 82, 82,130, 71, 30,121,196,186, 76, 67,135, 77,199, 94,111,147,117, 38,160, 29,222,166,
+255, 7,231,253,231,193, 82,123, 73,102, 12,237, 77,240,221,225,211,120, 63, 91,187,133,227,184,221,251,243,235,190,154, 51,200,
+ 12,102,215,211,232,151,240,207,230, 97, 65, 0,108,229, 57, 48,187,254, 4, 34,241, 68,110,133, 16,117,122, 83,187,111,205, 12,
+195, 28,115,119,119,223,185,121,243,230,153,207, 63,255,188, 16, 0, 36, 18, 9,254,242,151,191,128,227, 56, 8,133, 66,208, 52,
+141,185,115,231,214, 87, 86, 86,190,203,113, 92,145,157, 15,138,216,207, 93,152,250,204, 75,105, 46,200,219, 0, 80, 2,220,144,
+ 69,161,255, 35, 51, 81,169, 57, 10, 84, 93, 4,104, 1,214,167,191,224,249,199,121,111,111, 0, 16,215, 93, 42,224,220,185,115,
+152, 55,111,222, 47, 22, 87,255,235,201,218,177, 99,199, 63,140, 70,227, 11,119,145,115, 92, 74, 74,202,126,111,111,239, 46, 15,
+139,148,148,148, 60,235,239,239, 63,179,179, 7,175,184,184,184,211,161, 14,142,227, 46, 19, 66, 38, 94,185,114,229,245, 75,151,
+ 46,125,222,222,239, 46, 93,186,244,249,152, 49, 99,232, 99,199,142,189,102,207, 44,194, 83,167, 78,157,138,141,141,205, 88,183,
+110,221,220,164,164, 36,177, 72, 36,130,171,171, 43, 52, 26,141,109, 29, 28,163,209,136, 69,139, 22, 53,153, 76,166, 45,199,143,
+ 31, 63,106,103, 71,104, 38,132, 60, 53,103,206,156, 89, 33, 33, 33,127,100, 89,214,195,104, 52, 86,149,148,148,236,187,117,235,
+ 86,151,214,193,226, 56,142, 37,132, 60, 61,119,238,220,233,193,193,193, 83, 24,134,241,176, 88, 44, 85, 87,175, 94,253,178,174,
+174,110, 83, 87, 56,143, 28, 57,162,251,232,163,143,254,163,211,233,194,212,106,245, 77,153, 76,102, 52, 26,141,180, 88, 44,118,
+149, 74,165, 81, 0,142, 2,184,224, 8,231,201,147, 39,175,175, 95,191,254,138,193, 96, 8, 93,191,126,253, 97, 87, 87,215, 3,
+132, 16, 34, 16, 8,220,197, 98,241, 72, 0, 63, 0, 40,116, 52,175, 52, 77,119,232,193,130,157,241, 29,183,110,221, 58,150,158,
+158, 62,104,224,192,129,200,200,200,168,150,201,100,242, 41, 83,166,240,106,107,107, 73, 71, 30,172,238, 32,176,126, 3,168,106,
+241,242, 78,178,198, 92,181, 10,124,255, 20, 64,237, 61, 22,168,119, 8,169, 94,189,122,217,206, 91,167, 86, 49, 88,118,193, 98,
+177, 64, 32, 16,128,199,227,193, 87,165,178,137, 57,142,227, 80, 84, 84,132,234,234,106,187, 4, 22, 69, 81, 52, 33, 4, 79, 62,
+249,164, 93,255,247,169,167,158,194, 15, 63,252,128,206,134, 19, 91,207,248, 11, 8, 8,232, 84, 12,181,228,197,238, 89,132,106,
+181,250,174,112,222,151, 2,235,170, 78,191,114,193,134,227,139,138, 43, 13,187, 31, 42,172, 89,144, 14,112,128,123,118,152,146,
+140,141,163,202, 96,216, 48, 12,196,181,185,179,225,234,203, 65,164,222, 40,135, 26,239,101, 23, 95, 55,113, 76,135,222,135,218,
+218,218,164, 15, 63,252,144,206,206,206,126, 98,245,234,213,110, 97, 97, 97,248,211,159,254, 4,163,209,136,179,103,207, 98,206,
+156, 57,213, 58,157, 46,179,182,182,118,141,189, 55,225, 41,227,253,117,221,203, 99, 61, 40, 83, 61,112,253, 20, 32,114,131,167,
+187, 12,103,114, 15, 1,215, 79, 2,180, 0,160,133, 24,252, 64, 24,250,135, 7,134, 17, 66,134,113, 28,247,239,238, 80, 1,143,
+ 63,254,248, 93, 19, 87,173, 5, 17,128, 62,119, 51,159, 86,145, 53,125,250,244,253, 44,203, 74,186,226,222,109, 89,147,201,114,
+ 23,141,227,101,116, 50,228,219,178,124,195, 46, 71,120, 77, 38,211,162,252,252,124,204,157, 59,119,238,179,207, 62, 43, 14, 9,
+ 9, 65, 64, 64, 0, 10, 10, 10,160,209,104,144,153,153,217,100, 54,155, 55,213,214,214,190,218,133,251,207,108, 73,119,171, 12,
+ 88, 0,155, 91,210, 93, 65, 98, 98,226,153,226,226,226, 42, 47, 47,175, 24,129, 64,240, 0,154,227,124,174,183,252,143,194,174,
+112,206,153, 51, 39,175,184,184,248,134,159,159, 95,108, 11,167, 2,192, 53, 0, 27,187,200, 89,149,151,151, 23, 24, 29, 29,205,
+242,120, 60,174,197,195,192,241,249,124,142,207,231,115, 0,144,157,157, 45, 2,208,105,204,101,121,121,249,159,247,236,217,131,
+156,156,156,152,250,250,250,103, 0,252,163,177,177, 49,250,230,205,155,182, 78,184, 29,111,167,200,169,159, 58,109,159,143,181,
+115,189, 2,192,176,110,144, 63, 44, 95,190, 28,153,153,153,232,108, 5,242,189,123,247, 2,157, 12, 17, 90,219,138, 85, 60, 49,
+ 12,131,115,231,206, 89,247,222,179, 13, 11, 90,151,104, 48,155,205, 29,174,244,206,178,172,197,104, 52,226,227,143, 63,182, 75,
+100,237,216,177, 3,122,189, 30, 44,203,218,101,103, 91, 22, 38, 69,117,117, 53, 84, 42,149,213,227,220,218, 41,226,112,153,210,
+ 52,141,208,208, 80,220,184,113, 3,158,158,158, 0,154,135, 5,109,222,189,134,134,223, 77,251,239,112,161,209,214, 24, 17,160,
+112,163, 4,100,207,195, 65,130, 17, 19,251,201,209,211, 75, 6,158, 80,132,202, 58, 11,254, 93, 92,143, 79,142,234, 74,141, 22,
+203,196, 3,154,154,124, 59,189, 78,177,190,190,190,139, 45, 22, 75, 36, 69, 81, 18,142,227,234,105,154, 62,173,213,106,151,113,
+ 28,119,206,145,155, 80,136,233, 66,119, 41,237,198,231, 11, 57, 11,203, 2,160, 0, 98, 77,116,243, 39,213,124,222,164,103, 4,
+ 22,142,236,174,208,221,152,117,175, 11, 63, 36, 36, 36,187,161,161,225, 55,183,146,187, 84, 42, 93, 90, 88, 88,120,223,174,228,
+110,197,131, 15, 62, 56, 88, 44, 22, 47,102, 89,246, 65,189, 94,239, 35, 22,139, 43, 8, 33, 39,110,221,186,245,198,233,211,167,
+127,114,118,159,247, 14,119,115, 37,247, 54,218,120, 60,128,101, 30, 30, 30, 33,103,207,158, 21,181,246, 96,181,182,151,142,172,
+139,228, 68,247, 67,120,120,248,177,237,219,183, 15,238,213,171, 23,213, 58,144,157,162, 40,219,226,152, 20, 69,217,102,150,254,
+244,211, 79,230,196,196,196,163,121,121,121,195,219,227, 12, 10, 10,202,206,201,201, 25, 83, 91, 91,251, 51, 33,213,122,101,119,
+235,121, 83, 83, 19,254,250,215,191,126, 87, 88, 88,216,230, 86, 57, 97, 97, 97,239,166,166,166,206,127,244,209, 71, 41,138,162,
+126, 22,115,101,221,214,199,154, 24,134,193,238,221,187,217,172,172,172,247, 47, 94,188,216,110, 12, 86, 84, 84, 84,233,169, 83,
+167,212,214, 37, 19,218, 75,173, 17, 27, 27, 91,254,211, 79, 63,169,126, 77,206,223,141,192,106, 49, 40,100, 84,144,226, 9,142,
+ 35, 83, 9, 72, 63,138,112, 66, 51, 7, 13, 1,178, 37,141,162,143,246,106,181, 77,206,199,214,137,251,242, 65, 33,132,114,110,
+242,251,251, 66, 80, 80, 80, 97, 97, 97, 97, 96, 7,109,194, 41,176,126,227, 34,221,203,203,235, 0, 69, 81,254, 86, 17,221,222,
+103,139, 55,233, 74, 69, 69,197,195, 21, 21, 21,237,174,167,168, 86,171,251,186,184,184,252,141,101,217,104,123, 54,123,166, 40,
+ 42, 87,175,215,191,244,107,111,246, 28, 25, 25, 89,148,155,155,219, 87, 44, 22,223, 17, 87,104,189,231,255,205,251,229,203,151,
+ 49,121,242,228,146,188,188,188,128, 95,147,243,119, 37,176,156,112,194, 9, 39,126, 47,240,243,243, 59,198, 48, 76,152, 94,175,
+231, 27, 12, 6,190,217,108,190,163,131, 19,139,197,186,198,198,198, 30,206,146,114,226,183, 6,149, 74, 21,162, 80, 40,190,229,
+243,249,162,182, 94, 28,254, 23, 22,139, 69, 95, 85, 85, 53, 78,171,213,106,126, 77,206,223, 60,218,154, 33,115,183, 18,128,209,
+ 78, 78, 39,167,147,211,201,233,228,116,114, 58, 57,157,156,191,183, 68, 57,181,188, 19, 78, 56,225,132, 19, 78, 56,225,196,221,
+133, 83, 96, 57,225,132, 19, 78, 56,225,132, 19, 78, 56, 5,150, 19, 78, 56,225,132, 19, 78, 56,225,132, 83, 96, 57,225,132, 19,
+ 78, 56,225,132, 19, 78,252,174,240,223, 1, 0, 29, 13,182,141,194,138, 6,132, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/datafiles/preview.blend.c b/source/blender/editors/datafiles/preview.blend.c
index 670d49d6b81..3f2b5bd41c1 100644
--- a/source/blender/editors/datafiles/preview.blend.c
+++ b/source/blender/editors/datafiles/preview.blend.c
@@ -1,7308 +1,7603 @@
/* DataToC output of file <preview_blend> */
-int datatoc_preview_blend_size= 567892;
+int datatoc_preview_blend_size= 586384;
char datatoc_preview_blend[]= {
- 66, 76, 69, 78, 68, 69, 82, 95, 86, 50, 52, 57, 82, 69, 78, 68, 0, 0, 0, 32,
-191,255,241, 96, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 20,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 0, 0, 0, 32,191,255,241, 80, 0, 0, 0,170, 0, 0, 0, 1,
- 32, 32, 32, 48, 0, 0, 0, 0, 0,245, 0, 15, 0, 1, 1, 0, 8,192,222, 48, 3,160,158, 32, 0, 0, 0, 0, 0, 0, 0, 64,
- 0, 0, 83, 82, 0, 0, 0,120, 8,192,222, 48, 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 83, 82,115, 99,114,101,101,110, 0, 45, 83, 99,114,105,112,116,105,110,103, 0, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 78, 9, 80, 8,192,224,144, 8,192,224,208, 8,192,228, 16, 8,192,228, 80, 8,193,115,224,
- 3,160,158, 32, 0, 0, 3,231, 1,143, 4,174, 3,232, 3, 32, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 2, 78, 9, 80, 0, 0, 0,166, 0, 0, 0, 1,
- 2, 76,195, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 2, 76,195, 64,
- 0, 0, 0,166, 0, 0, 0, 1, 8,192,222,208, 2, 78, 9, 80, 0, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 20, 8,192,222,208, 0, 0, 0,166, 0, 0, 0, 1, 8,192,223, 16, 2, 76,195, 64, 0, 0, 0, 0, 3,232, 3, 32,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,223, 16, 0, 0, 0,166, 0, 0, 0, 1, 8,192,223, 80, 8,192,222,208,
- 0, 0, 0, 0, 3,232, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,223, 80, 0, 0, 0,166, 0, 0, 0, 1,
- 8,192,223,144, 8,192,223, 16, 0, 0, 0, 0, 0, 0, 3, 6, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,223,144,
- 0, 0, 0,166, 0, 0, 0, 1, 8,192,223,208, 8,192,223, 80, 0, 0, 0, 0, 3,232, 3, 6, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 20, 8,192,223,208, 0, 0, 0,166, 0, 0, 0, 1, 8,192,224, 16, 8,192,223,144, 0, 0, 0, 0, 3, 32, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,224, 16, 0, 0, 0,166, 0, 0, 0, 1, 8,192,224, 80, 8,192,223,208,
- 0, 0, 0, 0, 3, 32, 3, 6, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,224, 80, 0, 0, 0,166, 0, 0, 0, 1,
- 8,192,224,144, 8,192,224, 16, 0, 0, 0, 0, 1,236, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,192,224,144,
- 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 8,192,224, 80, 0, 0, 0, 0, 1,236, 3, 6, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 8,192,224,208, 0, 0, 0,167, 0, 0, 0, 1, 8,192,225, 16, 0, 0, 0, 0, 2, 76,195, 64, 8,192,222,208,
- 0, 1, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,225, 16, 0, 0, 0,167, 0, 0, 0, 1, 8,192,225, 80,
- 8,192,224,208, 2, 76,195, 64, 8,192,223, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,225, 80,
- 0, 0, 0,167, 0, 0, 0, 1, 8,192,225,144, 8,192,225, 16, 8,192,222,208, 8,192,223,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 8,192,225,144, 0, 0, 0,167, 0, 0, 0, 1, 8,192,225,208, 8,192,225, 80, 8,192,223, 80,
- 8,192,223,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,225,208, 0, 0, 0,167, 0, 0, 0, 1,
- 8,192,226, 16, 8,192,225,144, 8,192,223, 16, 8,192,223,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,192,226, 16, 0, 0, 0,167, 0, 0, 0, 1, 8,192,226, 80, 8,192,225,208, 8,192,223,144, 8,192,224, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,226, 80, 0, 0, 0,167, 0, 0, 0, 1, 8,192,226,144, 8,192,226, 16,
- 8,192,223,208, 8,192,224, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,226,144, 0, 0, 0,167,
- 0, 0, 0, 1, 8,192,226,208, 8,192,226, 80, 8,192,223, 16, 8,192,223,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 8,192,226,208, 0, 0, 0,167, 0, 0, 0, 1, 8,192,227, 16, 8,192,226,144, 2, 78, 9, 80, 8,192,223, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,227, 16, 0, 0, 0,167, 0, 0, 0, 1, 8,192,227, 80,
- 8,192,226,208, 2, 78, 9, 80, 8,192,224, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,227, 80,
- 0, 0, 0,167, 0, 0, 0, 1, 8,192,227,144, 8,192,227, 16, 8,192,223,208, 8,192,224, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 8,192,227,144, 0, 0, 0,167, 0, 0, 0, 1, 8,192,227,208, 8,192,227, 80, 8,192,223, 80,
- 8,192,224,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,192,227,208, 0, 0, 0,167, 0, 0, 0, 1,
- 8,192,228, 16, 8,192,227,144, 8,192,224, 16, 8,192,224,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,192,228, 16, 0, 0, 0,167, 0, 0, 0, 1, 0, 0, 0, 0, 8,192,227,208, 8,192,224, 80, 8,192,224,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,204, 8,192,228, 80, 0, 0, 0,169, 0, 0, 0, 1, 8,193, 16,224, 0, 0, 0, 0,
- 8,192,223, 80, 2, 76,195, 64, 8,192,222,208, 8,192,223,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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,232, 0, 0, 3, 7,
- 0, 0, 3, 32, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 3, 7, 0, 0, 3, 33, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 3, 32,
- 0, 0, 3, 32, 0, 5, 0, 4, 0, 1, 7, 7, 3,233, 0, 1, 1, 0, 1, 0, 2,189, 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, 8,192, 8,144, 8,192, 8,144, 8,192,229, 80,
- 8,193, 15,208, 68, 65, 84, 65, 0, 0, 0,228, 8,192,229, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,192,230, 96, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,230, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,192,231,112, 8,192,229, 80, 82,101,110,100,101,114, 0, 0,
+ 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 48, 82, 69, 78, 68,
+ 32, 0, 0, 0, 16,244, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0,112,114,101,118,105,101,119, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 32, 0, 0, 0,160,243, 34, 0,186, 0, 0, 0,
+ 1, 0, 0, 0, 32, 32, 32, 48, 0, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 32, 95,178, 3,160, 63,179, 3, 0, 0, 0, 0,
+ 64, 0, 0, 0, 87, 77, 0, 0,140, 0, 0, 0,152, 93,178, 3, 76, 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, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 94,178, 3,240,207, 72, 1, 88, 94,178, 3, 88, 94,178, 3, 1, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+ 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,248, 84, 72, 1,
+216, 15,158, 3, 68, 65, 84, 65,148, 0, 0, 0, 88, 94,178, 3, 77, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 15, 75, 1, 1, 0, 0, 0, 0, 0, 0, 0, 32, 95,178, 3, 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, 0, 0, 27, 0,120, 7,149, 4, 0, 0, 0, 0,
+ 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,200,110, 72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+144,222,154, 3, 0, 0, 0, 0, 0, 0, 0, 0, 16, 79,156, 3,136, 37,159, 3,128, 85, 72, 1,248, 50, 72, 1,184,117, 74, 1,
+ 56, 20,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 32, 95,178, 3,178, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82,115, 99,114,101,101,110, 0, 45, 83, 99,114,105,112,116,
+105,110,103, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,225,155, 3, 88,217,155, 3,120,225,154, 3,
+224,239,157, 3,224,225,153, 3,112, 13,179, 3, 0, 0, 0, 0, 0, 0, 0, 0,160, 63,179, 3, 0, 0, 0, 0, 0, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 87, 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, 24,225,155, 3,179, 0, 0, 0, 1, 0, 0, 0,
+ 8, 2,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 8, 2,156, 3,
+179, 0, 0, 0, 1, 0, 0, 0, 80, 16,156, 3, 24,225,155, 3, 0, 0, 0, 0, 0, 0,149, 4, 0, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0, 80, 16,156, 3,179, 0, 0, 0, 1, 0, 0, 0, 48,225,154, 3, 8, 2,156, 3, 0, 0, 0, 0,120, 7,149, 4,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 48,225,154, 3,179, 0, 0, 0, 1, 0, 0, 0, 48, 11,156, 3, 80, 16,156, 3,
+ 0, 0, 0, 0,120, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 48, 11,156, 3,179, 0, 0, 0, 1, 0, 0, 0,
+224,239,156, 3, 48,225,154, 3, 0, 0, 0, 0, 0, 0,120, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,224,239,156, 3,
+179, 0, 0, 0, 1, 0, 0, 0,232,206,159, 3, 48, 11,156, 3, 0, 0, 0, 0,120, 7,120, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,232,206,159, 3,179, 0, 0, 0, 1, 0, 0, 0,136, 3,156, 3,224,239,156, 3, 0, 0, 0, 0, 8, 6, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,136, 3,156, 3,179, 0, 0, 0, 1, 0, 0, 0, 0,219,155, 3,232,206,159, 3,
+ 0, 0, 0, 0, 8, 6,120, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0,219,155, 3,179, 0, 0, 0, 1, 0, 0, 0,
+ 0,177,154, 3,136, 3,156, 3, 0, 0, 0, 0,192, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0,177,154, 3,
+179, 0, 0, 0, 1, 0, 0, 0,144, 72,160, 3, 0,219,155, 3, 0, 0, 0, 0,192, 3,120, 4, 1, 0, 0, 0, 68, 65, 84, 65,
+ 20, 0, 0, 0,144, 72,160, 3,179, 0, 0, 0, 1, 0, 0, 0,216, 12,156, 3, 0,177,154, 3, 0, 0, 0, 0,192, 3, 44, 3,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216, 12,156, 3,179, 0, 0, 0, 1, 0, 0, 0, 40,175,163, 3,144, 72,160, 3,
+ 0, 0, 0, 0, 8, 6, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,175,163, 3,179, 0, 0, 0, 1, 0, 0, 0,
+ 88,217,155, 3,216, 12,156, 3, 0, 0, 0, 0,192, 3,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,217,155, 3,
+179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,175,163, 3, 0, 0, 0, 0, 8, 6,100, 3, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,120,225,154, 3,180, 0, 0, 0, 1, 0, 0, 0,224, 7,156, 3, 0, 0, 0, 0, 8, 2,156, 3, 80, 16,156, 3,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224, 7,156, 3,180, 0, 0, 0, 1, 0, 0, 0,160, 31,160, 3,
+120,225,154, 3, 8, 2,156, 3, 48, 11,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 31,160, 3,
+180, 0, 0, 0, 1, 0, 0, 0, 8, 5,156, 3,224, 7,156, 3, 80, 16,156, 3,224,239,156, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0, 8, 5,156, 3,180, 0, 0, 0, 1, 0, 0, 0,224,112,155, 3,160, 31,160, 3, 48, 11,156, 3,
+224,239,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,112,155, 3,180, 0, 0, 0, 1, 0, 0, 0,
+ 8, 64,158, 3, 8, 5,156, 3, 48,225,154, 3,232,206,159, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 8, 64,158, 3,180, 0, 0, 0, 1, 0, 0, 0,144,215,163, 3,224,112,155, 3,136, 3,156, 3,224,239,156, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,215,163, 3,180, 0, 0, 0, 1, 0, 0, 0, 16, 74,160, 3, 8, 64,158, 3,
+136, 3,156, 3,232,206,159, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 74,160, 3,180, 0, 0, 0,
+ 1, 0, 0, 0,136, 9,156, 3,144,215,163, 3, 48,225,154, 3,224,239,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,136, 9,156, 3,180, 0, 0, 0, 1, 0, 0, 0, 16, 71,160, 3, 16, 74,160, 3, 24,225,155, 3, 48, 11,156, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 71,160, 3,180, 0, 0, 0, 1, 0, 0, 0,184,240,159, 3,
+136, 9,156, 3, 0,219,155, 3, 24,225,155, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,240,159, 3,
+180, 0, 0, 0, 1, 0, 0, 0,136,128,154, 3, 16, 71,160, 3, 0,219,155, 3,232,206,159, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,136,128,154, 3,180, 0, 0, 0, 1, 0, 0, 0,168,220,155, 3,184,240,159, 3, 0,177,154, 3,
+ 48, 11,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,220,155, 3,180, 0, 0, 0, 1, 0, 0, 0,
+248, 17,156, 3,136,128,154, 3, 0,177,154, 3,136, 3,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+248, 17,156, 3,180, 0, 0, 0, 1, 0, 0, 0,136, 46,155, 3,168,220,155, 3, 0,177,154, 3, 0,219,155, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136, 46,155, 3,180, 0, 0, 0, 1, 0, 0, 0, 32,205,155, 3,248, 17,156, 3,
+ 0,219,155, 3,144, 72,160, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,205,155, 3,180, 0, 0, 0,
+ 1, 0, 0, 0,224, 95,178, 3,136, 46,155, 3,216, 12,156, 3,232,206,159, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,224, 95,178, 3,180, 0, 0, 0, 1, 0, 0, 0,224,111,159, 3, 32,205,155, 3,216, 12,156, 3,144, 72,160, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,111,159, 3,180, 0, 0, 0, 1, 0, 0, 0,224,239,157, 3,
+224, 95,178, 3, 0,177,154, 3,144, 72,160, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,239,157, 3,
+180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,111,159, 3,136, 3,156, 3,216, 12,156, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,112, 0, 0, 0,224,225,153, 3,184, 0, 0, 0, 1, 0, 0, 0, 16,102,155, 3, 0, 0, 0, 0, 48, 11,156, 3,
+ 8, 2,156, 3, 80, 16,156, 3,224,239,156, 3, 0, 0, 0, 0, 0, 0, 0, 0,120, 7, 0, 0,121, 4, 0, 0,149, 4, 0, 0,
+ 7, 7,121, 7, 29, 0, 1, 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,
+248,193, 65, 1, 64, 63,179, 3, 64, 63,179, 3,216, 56,155, 3, 40, 96,178, 3, 0, 0, 0, 0, 0, 0, 0, 0,200, 89,154, 3,
+128,144, 74, 1, 68, 65, 84, 65,236, 0, 0, 0,216, 56,155, 3,185, 0, 0, 0, 1, 0, 0, 0, 40, 96,178, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 64,103, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,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,120, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,213, 68, 0, 0,200, 65, 0,192,213, 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,121, 7, 26, 0,121, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 7, 0, 0,121, 4, 0, 0,146, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,121, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,195, 65, 1, 8,235,154, 3, 8,235,154, 3, 0, 0, 0, 0, 0, 0, 0, 0, 88,204,163, 3, 8,153, 71, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 40, 96,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216, 56,155, 3,
+ 0, 0, 0, 0, 0,240,107, 69, 0,128,206,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 69, 0, 0, 32,192, 0, 0, 0,191,
+104, 7, 0, 0,121, 7, 0, 0, 18, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,103, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,103, 7, 0, 0, 18, 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, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,121, 7, 3, 0,104, 7, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 7, 0, 0,147, 4, 0, 0,149, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,121, 7, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+144,194, 65, 1, 32,142, 78, 1,136,236,154, 3, 72, 97,178, 3, 24,100,178, 3,128,153, 71, 1,112,154, 71, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 72, 97,178, 3,181, 0, 0, 0, 1, 0, 0, 0,176, 98,178, 3, 0, 0, 0, 0,
+128,118,159, 3, 0, 0, 0, 0, 73, 78, 70, 79, 95, 80, 84, 95,116, 97, 98,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, 73, 78, 70, 79, 95, 80, 84, 95,116, 97, 98,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, 0, 0, 0, 0, 0, 0, 0, 0, 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,208, 14, 36, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,176, 98,178, 3,181, 0, 0, 0,
+ 1, 0, 0, 0, 24,100,178, 3, 72, 97,178, 3,224,166,160, 3, 0, 0, 0, 0, 73, 78, 70, 79, 95, 80, 84, 95,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, 73, 78, 70, 79, 95, 80, 84, 95,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, 86,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, 0,122,254,208, 14, 98, 1, 0, 0, 0, 0,
+ 0, 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, 0, 0, 0, 0, 68, 65, 84, 65,
+ 56, 1, 0, 0, 24,100,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 98,178, 3,176,159,155, 3, 0, 0, 0, 0,
+ 73, 78, 70, 79, 95, 80, 84, 95, 98,111,116,116,111,109, 98, 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,
+ 73, 78, 70, 79, 95, 80, 84, 95, 98,111,116,116,111,109, 98, 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,
+ 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, 86,254,208, 14, 36, 0, 0, 0, 0, 0, 0, 0, 11, 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, 68, 65, 84, 65,112, 0, 0, 0, 16,102,155, 3,184, 0, 0, 0, 1, 0, 0, 0,144,214, 76, 1,
+224,225,153, 3,232,206,159, 3,136, 3,156, 3,224,239,156, 3, 48,225,154, 3, 0, 0, 0, 0, 9, 6, 0, 0,120, 7, 0, 0,
+ 0, 0, 0, 0,119, 4, 0, 0, 4, 4,112, 1,120, 4, 2, 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,128,191, 65, 1,232,232,160, 3, 56,186,178, 3,128,101,178, 3,160,102,178, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40, 50,155, 3, 72,155, 71, 1, 68, 65, 84, 65,236, 0, 0, 0,128,101,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+160,102,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,184, 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,111, 1, 0, 0, 0, 0, 0, 0, 25, 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, 4, 10, 0,112, 1,
+ 26, 0,112, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 0, 0,120, 7, 0, 0, 94, 4, 0, 0,119, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 1, 26, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104,193, 65, 1,144,128,163, 3,144,128,163, 3, 0, 0, 0, 0, 0, 0, 0, 0,168,155, 71, 1,
+152,156, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,160,102,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,128,101,178, 3, 0, 0, 0, 0, 0,128,177, 67, 0,160,143,196, 0, 0, 0, 0, 0, 0, 0, 0, 22, 12,186, 67,
+116,195,145,196, 0, 0, 0, 0, 95, 1, 0, 0,112, 1, 0, 0, 18, 0, 0, 0, 93, 4, 0, 0, 0, 0, 0, 0, 94, 1, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 94, 1, 0, 0, 18, 0, 0, 0, 93, 4, 0, 0, 0, 0,128, 67, 0, 0, 40, 66,
+ 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,112, 1,
+ 94, 4, 95, 1, 76, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 0, 0,120, 7, 0, 0, 0, 0, 0, 0, 93, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 1, 94, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24,192, 65, 1,240,146,203, 3,112, 73,163, 3,192,103,178, 3, 88,147,178, 3, 96,158, 71, 1,
+ 80,159, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,192,103,178, 3,181, 0, 0, 0, 1, 0, 0, 0,
+ 40,105,178, 3, 0, 0, 0, 0,168,192, 65, 1, 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,116, 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, 68, 65, 84, 65, 56, 1, 0, 0,
+ 40,105,178, 3,181, 0, 0, 0, 1, 0, 0, 0,144,106,178, 3,192,103,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,108, 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, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,108, 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, 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,
+240, 0, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,144,106,178, 3,181, 0, 0, 0, 1, 0, 0, 0,248,107,178, 3, 40,105,178, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 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, 68, 65, 84, 65, 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, 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, 24,255,240, 0,136, 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, 68, 65, 84, 65, 56, 1, 0, 0,248,107,178, 3,181, 0, 0, 0,
+ 1, 0, 0, 0, 96,109,178, 3,144,106,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,108, 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, 68, 65, 84, 65, 95, 80, 84, 95,108, 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, 76, 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,107,254,240, 0,149, 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, 0, 0, 0, 0, 68, 65, 84, 65,
+ 56, 1, 0, 0, 96,109,178, 3,181, 0, 0, 0, 1, 0, 0, 0,200,110,178, 3,248,107,178, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 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, 0, 0, 0, 0,
+ 68, 65, 84, 65, 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, 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, 47,254,240, 0, 36, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,200,110,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 48,112,178, 3,
+ 96,109,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,112,111,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, 68, 65, 84, 65, 95, 80, 84, 95,115,112,111,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, 83,112,111,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,199,253, 62, 1, 80, 0, 0, 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, 68, 65, 84, 65, 56, 1, 0, 0, 48,112,178, 3,
+181, 0, 0, 0, 1, 0, 0, 0,152,113,178, 3,200,110,178, 3, 48,234,160, 3, 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,116, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 70, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,231,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,232,128, 8,192,230, 96, 65,110,105,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 56, 1, 0, 0,152,113,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 0,115,178, 3, 48,112,178, 3,184,216,160, 3,
+ 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, 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, 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,189,254,116, 1,178, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,232,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,233,144, 8,192,231,112, 70,111,114,109, 97,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, 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, 68, 65, 84, 65, 56, 1, 0, 0, 0,115,178, 3,181, 0, 0, 0, 1, 0, 0, 0,
+104,116,178, 3,152,113,178, 3, 96,218,160, 3, 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,107,254,116, 1, 58, 0, 24, 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, 68, 65, 84, 65, 56, 1, 0, 0,
+104,116,178, 3,181, 0, 0, 0, 1, 0, 0, 0,208,117,178, 3, 0,115,178, 3, 8,220,160, 3, 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, 83,254,
+116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,233,144, 0, 0, 0,168, 0, 0, 0, 1, 8,192,234,160, 8,192,232,128,
- 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,
- 76, 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, 68, 65, 84, 65, 56, 1, 0, 0,208,117,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 56,119,178, 3,104,116,178, 3,
+104,188,159, 3, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,234,160, 0, 0, 0,168, 0, 0, 0, 1, 8,192,235,176, 8,192,233,144, 76, 97,109,112, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,253,116, 1,102, 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, 0, 0, 0, 0,
- 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,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, 68, 65, 84, 65, 56, 1, 0, 0, 56,119,178, 3,181, 0, 0, 0,
+ 1, 0, 0, 0,160,120,178, 3,208,117,178, 3, 16,190,159, 3, 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,189,253,116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 56, 1, 0, 0,160,120,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 8,122,178, 3, 56,119,178, 3,184,191,159, 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 70, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,235,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,236,192, 8,192,234,160, 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,116, 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, 0, 0, 76, 97,109,112, 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,165,253,116, 1, 0, 0, 0, 0, 0, 0, 4, 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, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,236,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,237,208, 8,192,235,176, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,112,117,116, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 8,122,178, 3,181, 0, 0, 0, 1, 0, 0, 0,112,123,178, 3,
+160,120,178, 3, 24,174,159, 3, 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, 76, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,253,116, 1,108, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,237,208, 0, 0, 0,168, 0, 0, 0, 1, 8,192,238,224, 8,192,236,192,
- 77, 97,112, 32, 84,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, 68, 65, 84, 65, 56, 1, 0, 0,112,123,178, 3,
+181, 0, 0, 0, 1, 0, 0, 0,216,124,178, 3, 8,122,178, 3,104,177,159, 3, 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,
- 76, 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, 9,253,116, 1, 0, 0,
+ 24, 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,
+ 68, 65, 84, 65, 56, 1, 0, 0,216,124,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 64,126,178, 3,112,123,178, 3, 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,
- 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,236,192, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,238,224, 0, 0, 0,168, 0, 0, 0, 1, 8,192,239,240, 8,192,237,208, 80,114,101,118,105,101,119, 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, 77, 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,184,255,240, 0, 36, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,239,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,241, 0, 8,192,238,224, 76,105,110,107,115, 32, 97,110,100, 32, 80,105,112,101,108,105,
-110,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, 77, 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, 68, 65, 84, 65, 56, 1, 0, 0, 64,126,178, 3,181, 0, 0, 0, 1, 0, 0, 0,
+168,127,178, 3,216,124,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 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, 68, 65, 84, 65, 95, 80, 84, 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, 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,241, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,242, 16, 8,192,239,240, 77, 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, 77,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, 77, 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, 66,255,240, 0, 94, 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, 68, 65, 84, 65, 56, 1, 0, 0,
+168,127,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 16,129,178, 3, 64,126,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 95, 80, 84, 95,109, 97,116,101,114,105, 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, 68, 65, 84, 65,
+ 95, 80, 84, 95,109, 97,116,101,114,105, 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, 77, 97,116,101,
+114,105, 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,172,254,
+240, 0,126, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,242, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,192,243, 32, 8,192,241, 0,
- 82, 97,109,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, 68, 65, 84, 65, 56, 1, 0, 0, 16,129,178, 3,181, 0, 0, 0, 1, 0, 0, 0,120,130,178, 3,168,127,178, 3,
+ 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,
- 77, 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, 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, 22,254,240, 0,126, 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,
- 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,241, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,243, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,192,244, 48, 8,192,242, 16, 83,104, 97,100,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, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,120,130,178, 3,181, 0, 0, 0,
+ 1, 0, 0, 0,224,131,178, 3, 16,129,178, 3, 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, 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, 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,128,253,240, 0,126, 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, 68, 65, 84, 65,
+ 56, 1, 0, 0,224,131,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 72,133,178, 3,120,130,178, 3, 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,
- 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,210, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,244, 48, 68, 65, 84, 65, 0, 0, 0,228, 8,192,244, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,245, 64, 8,192,243, 32, 77,105,114,114,111,114, 32, 84,114, 97,110,115,112, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,116,101,114,105, 97,108, 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,234,252,240, 0,126, 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, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,245, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,246, 80, 8,192,244, 48, 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, 68, 65, 84, 65, 56, 1, 0, 0, 72,133,178, 3,181, 0, 0, 0, 1, 0, 0, 0,176,134,178, 3,
+224,131,178, 3, 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, 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, 77, 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, 84,252,240, 0,126, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 1, 0, 0,176,134,178, 3,
+181, 0, 0, 0, 1, 0, 0, 0, 24,136,178, 3, 72,133,178, 3,248,225,160, 3, 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, 5, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,246, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,192,247, 96, 8,192,245, 64,
- 77, 97,112, 32, 73,110,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, 69,255,116, 1,151, 0,
+ 0, 0, 0, 0, 0, 0, 6, 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,
- 77, 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,
+ 68, 65, 84, 65, 56, 1, 0, 0, 24,136,178, 3,181, 0, 0, 0, 1, 0, 0, 0,128,137,178, 3,176,134,178, 3, 0,210,160, 3,
+ 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, 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,
- 5, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,245, 64, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,247, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,192,248,112, 8,192,246, 80, 77, 97,112, 32, 84,111, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 0, 0,165,254,116, 1,136, 0, 0, 0, 0, 0, 0, 0, 6, 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, 68, 65, 84, 65, 56, 1, 0, 0,128,137,178, 3,181, 0, 0, 0, 1, 0, 0, 0,
+232,138,178, 3, 24,136,178, 3,168,211,160, 3, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 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, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 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, 77, 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, 5, 24, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,245, 64, 68, 65, 84, 65, 0, 0, 0,228, 8,192,248,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,249,128, 8,192,247, 96, 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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, 69,100,105,116,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, 55,254,116, 1, 86, 0, 0, 0, 0, 0, 0, 0, 6, 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, 56, 1, 0, 0,
+232,138,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 80,140,178, 3,128,137,178, 3,176,181,159, 3, 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,108,253,
+116, 1,179, 0, 0, 0, 0, 0, 0, 0, 6, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,249,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,250,144, 8,192,248,112, 77,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, 68, 65, 84, 65, 56, 1, 0, 0, 80,140,178, 3,181, 0, 0, 0, 1, 0, 0, 0,184,141,178, 3,232,138,178, 3,
+ 88,183,159, 3, 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, 0, 0, 0, 0, 69,100,105,116,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, 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, 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, 0, 0, 0, 0, 0, 0,229,252,116, 1,111, 0, 0, 0, 0, 0, 0, 0, 6, 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, 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,250,144, 0, 0, 0,168, 0, 0, 0, 1, 8,192,251,160, 8,192,249,128,
- 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, 0, 0, 0, 0,
- 69,100,105,116,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, 68, 65, 84, 65, 56, 1, 0, 0,184,141,178, 3,181, 0, 0, 0,
+ 1, 0, 0, 0, 32,143,178, 3, 80,140,178, 3, 96,167,159, 3, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,
+114, 97,121,109,105,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,
+114, 97,121,109,105,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, 82, 97,121, 32, 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,205,252,116, 1, 0, 0, 24, 0, 0, 0,
+ 4, 0, 6, 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,
+ 56, 1, 0, 0, 32,143,178, 3,181, 0, 0, 0, 1, 0, 0, 0,136,144,178, 3,184,141,178, 3, 8,169,159, 3, 0, 0, 0, 0,
+ 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,114, 97,121,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,
- 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,251,160, 0, 0, 0,168, 0, 0, 0, 1, 8,192,252,176, 8,192,250,144, 83,104, 97,112,101,115, 0, 0,
+ 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,114, 97,121,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,100,105,116,105,110,103, 0,
+ 82, 97,121, 32, 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,181,252,116, 1, 0, 0, 24, 0, 0, 0, 4, 0, 6, 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, 2,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,250,144, 68, 65, 84, 65, 0, 0, 0,228, 8,192,252,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,192,253,192, 8,192,251,160, 77,101,115,104, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,136,144,178, 3,181, 0, 0, 0, 1, 0, 0, 0,240,145,178, 3,
+ 32,143,178, 3, 40,208,156, 3, 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, 0, 0, 0, 0, 69,100,105,116,105,110,103, 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,157,252,116, 1, 0, 0, 24, 0, 0, 0, 4, 0, 6, 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, 68, 65, 84, 65, 56, 1, 0, 0,240,145,178, 3,
+181, 0, 0, 0, 1, 0, 0, 0, 88,147,178, 3,136,144,178, 3, 64, 70,156, 3, 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, 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,253,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,192,254,208, 8,192,252,176, 77,101,115,104, 32, 84,111,111,108,115, 32, 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,133,252,116, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 6, 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, 69,100,105,116,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,
+ 68, 65, 84, 65, 56, 1, 0, 0, 88,147,178, 3,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,145,178, 3,232, 71,156, 3,
+ 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, 0, 0, 0, 0, 5, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,192,254,208, 0, 0, 0,168, 0, 0, 0, 1, 8,192,255,224, 8,192,253,192,
- 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, 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,
- 87,111,114,108,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,131,251,116, 1,234, 0, 0, 0, 0, 0, 0, 0, 7, 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, 68, 65, 84, 65,232, 0, 0, 0,232,232,160, 3,151, 0, 0, 0, 1, 0, 0, 0,
+ 8,154,178, 3, 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, 2, 0, 0, 0, 0, 0, 0,193, 0, 0,163, 67, 0, 64,180,196,
+ 0, 0,104, 67, 0, 0, 0,193, 0, 0,163, 67, 0, 64,180,196, 30,209,118, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,192,255,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 0,240, 8,192,254,208, 87,111,114,108,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213, 0, 53, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0,
+ 0, 0, 4, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,150, 1, 0, 0, 48, 1, 0, 0, 72, 61,154, 3,255, 20, 0, 0,
+160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,192,148,178, 3,185, 0, 0, 0, 1, 0, 0, 0,224,149,178, 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, 87,111,114,108,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, 2, 0, 3, 3, 4, 0, 12, 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, 1, 70, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 0,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 2, 0, 8,192,255,224, 77,105,115,116, 32, 47, 32, 83,116, 97,114,115, 32, 47, 32, 80,
-104,121,115,105, 99,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, 87,111,114,108,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, 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, 68, 65, 84, 65,236, 0, 0, 0,224,149,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+192,148,178, 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, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 2, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 3, 16, 8,193, 0,240, 65,109, 98, 32, 79, 99, 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, 0, 0, 87,111,114,108,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,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 79, 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,151,178, 3, 68, 65, 84, 65,216, 2, 0, 0, 0,151,178, 3,145, 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, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 0,240, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 3, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 4, 32, 8,193, 2, 0,
- 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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,
- 87,111,114,108,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,
- 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 4, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 5, 48, 8,193, 3, 16, 77, 97,112, 32, 84,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, 87,111,114,108,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, 3,210, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 3, 16, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 5, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 6, 64, 8,193, 4, 32, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 6, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 7, 80, 8,193, 5, 48, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 99, 92, 63,
+ 43, 35, 2,191,188,238, 46,188, 94, 32,148,188, 23,240, 25, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+201, 77, 68, 64,228, 66,111, 64,230, 97,205,191, 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, 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 7, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 8, 96, 8,193, 6, 64,
- 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,
- 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, 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, 8,154,178, 3,
+146, 0, 0, 0, 1, 0, 0, 0,240,250,157, 3,232,232,160, 3,192,148,178, 3,224,149,178, 3, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 99, 92, 63, 43, 35, 2,191,188,238, 46,188, 94, 32,148,188,
+ 23,240, 25, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,119,179, 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,
+ 4, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 24, 24, 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,201, 77, 68, 64,228, 66,111, 64,230, 97,205,191,128,191,149, 60,
+116,109, 77,191,248,165,230, 63, 20, 0, 0, 0, 7, 0, 10, 0, 99, 0, 0, 0, 1, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+ 40,155,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 72,156,178, 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,
- 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 6, 64, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 8, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 9,112, 8,193, 7, 80, 79, 98,106,101, 99,116, 32, 97,
-110,100, 32, 76,105,110,107,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, 79, 98,106,101, 99,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,
+ 2, 0, 3, 3, 4, 0, 12, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 9,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 10,128, 8,193, 8, 96, 65,110,105,109, 32,115,101,116,116,105,110,103,115, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,
+ 72,156,178, 3,185, 0, 0, 0, 1, 0, 0, 0,104,157,178, 3, 40,155,178, 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, 79, 98,106,101, 99,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, 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, 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 10,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 11,144, 8,193, 9,112, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+104,157,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72,156,178, 3, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,
+205,204,140, 63, 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+235, 2, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,
+235, 2, 0, 0, 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0,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,113, 3, 0, 0,
+ 69, 4, 0, 0, 0, 0, 0, 0, 79, 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, 79, 98,106,101, 99,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, 68, 65, 84, 65,196, 0, 0, 0,
+240,250,157, 3,150, 0, 0, 0, 1, 0, 0, 0,200,160,178, 3, 8,154,178, 3, 40,155,178, 3,104,157,178, 3, 2, 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, 0, 0, 0, 0,122, 67,205,204,204,189,
+205,204,140, 63, 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+235, 2, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,
+235, 2, 0, 0, 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,136,158,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,168,159,178, 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, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 11,144, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 12,160, 8,193, 10,128,
- 67,111,110,115,116,114, 97,105,110,116,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, 2, 0, 3, 3, 4, 0, 12, 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, 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,
- 79, 98,106,101, 99,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, 68, 65, 84, 65,236, 0, 0, 0,168,159,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,136,158,178, 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,
- 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 12,160, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 13,176, 8,193, 11,144, 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,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
+ 79, 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, 84,101,120,116,117,114,101, 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,200,160,178, 3,158, 0, 0, 0,
+ 1, 0, 0, 0,184,165,178, 3,240,250,157, 3,136,158,178, 3,168,159,178, 3, 9, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 45, 96, 1, 0, 0, 0, 0, 62, 0, 0, 0, 32, 0, 1, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,
+225, 2, 0, 0,227, 2, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0,207, 2, 0, 0,227, 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, 2,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 13,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 14,192, 8,193, 12,160, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 14,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 15,208, 8,193, 13,176, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 15,208, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0, 0, 8,193, 14,192,
- 82,101,110,100,101,114, 32, 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,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,192,229, 80, 68, 65, 84, 65,
- 0, 0, 0,204, 8,193, 16,224, 0, 0, 0,169, 0, 0, 0, 1, 8,193, 90,208, 8,192,228, 80, 8,192,223,208, 8,192,224, 16,
- 8,192,223,144, 8,192,223, 16, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 45, 68,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 0, 0, 3, 33, 0, 0, 3,232, 0, 0, 0, 0, 0, 0, 3, 5, 0, 0, 3, 33,
- 0, 0, 3,232, 0, 0, 2,235, 0, 0, 3, 5, 0, 0, 3, 33, 0, 0, 3,232, 0, 0, 0, 0, 0, 0, 2,234, 0, 7, 0, 6,
- 0, 2, 4, 4, 0,200, 2,235, 1, 0, 1, 0, 1,156, 0,103, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,193, 80,144, 8,193, 88,224, 2, 76,232, 48, 8,192, 31,208, 8,193, 17,224, 8,193, 79,128, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 17,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 18,240, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,
-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, 73,112,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,
+ 68, 65, 84, 65,236, 0, 0, 0,120,163,178, 3,185, 0, 0, 0, 1, 0, 0, 0,152,164,178, 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, 33, 0,167, 1, 62, 0,204,
- 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 18,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 20, 0, 8,193, 17,224, 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, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 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,
+ 68, 65, 84, 65,236, 0, 0, 0,152,164,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,163,178, 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, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 3, 8,193, 51,224, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 20, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 21, 16, 8,193, 18,240, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 79, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 21, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 22, 32, 8,193, 20, 0,
- 65,110,105,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65,136, 0, 0, 0,184,165,178, 3,156, 0, 0, 0, 1, 0, 0, 0,176,168,178, 3,200,160,178, 3,120,163,178, 3,
+152,164,178, 3, 6, 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, 0, 0,
+ 0, 0, 0, 0, 0, 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, 1, 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,
+236, 0, 0, 0,112,166,178, 3,185, 0, 0, 0, 1, 0, 0, 0,144,167,178, 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,254, 48, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 22, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 23, 48, 8,193, 21, 16, 70,111,114,109, 97,116, 0, 0,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 82,101,110,100,101,114, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+236, 0, 0, 0,144,167,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112,166,178, 3, 0, 0, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,
+248, 0, 0, 0,176,168,178, 3,155, 0, 0, 0, 1, 0, 0, 0, 24,172,178, 3,184,165,178, 3,112,166,178, 3,144,167,178, 3,
+ 3, 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, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204,
- 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 23, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 24, 64, 8,193, 22, 32, 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,216,169,178, 3,185, 0, 0, 0, 1, 0, 0, 0,248,170,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 24, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 25, 80, 8,193, 23, 48, 67, 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, 2, 0, 3, 3, 4, 0, 12, 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, 69,100,105,116,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, 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, 68, 65, 84, 65,236, 0, 0, 0,248,170,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+216,169,178, 3, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192,
+ 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70,
+ 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 79, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 25, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 26, 96, 8,193, 24, 64,
- 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, 68, 65, 84, 65,184, 0, 0, 0, 24,172,178, 3,250, 0, 0, 0, 1, 0, 0, 0, 96,176,178, 3,
+176,168,178, 3,216,169,178, 3,248,170,178, 3, 11, 0, 0, 0, 51, 51, 51, 63,248,150,127, 3, 0, 0,128,192, 0, 0,122, 67,
+ 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65,
+ 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,236, 0, 0, 0, 0,173,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 32,174,178, 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,
- 76, 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, 0, 2, 0, 3, 3,
+ 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 32,174,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 64,175,178, 3, 0,173,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 26, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 27,112, 8,193, 25, 80, 76, 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, 8, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 64,175,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,174,178, 3, 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68,
+ 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 79, 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, 76, 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, 68, 65, 84, 65,188, 0, 0, 0, 96,176,178, 3,
+157, 0, 0, 0, 1, 0, 0, 0,176,180,178, 3, 24,172,178, 3, 0,173,178, 3, 64,175,178, 3, 13, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,
+124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,
+108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61,
+ 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,236, 0, 0, 0, 80,177,178, 3,185, 0, 0, 0, 1, 0, 0, 0,112,178,178, 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,255, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 27,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 28,128, 8,193, 26, 96, 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,116, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 76, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,112,178,178, 3,185, 0, 0, 0, 1, 0, 0, 0,144,179,178, 3, 80,177,178, 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,254, 28, 1, 62, 0,224, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 77, 96, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 28,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 29,144, 8,193, 27,112, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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, 8, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,144,179,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112,178,178, 3,
+ 0, 0,160,193, 0, 0, 85, 67, 0,160,134,196, 0, 0, 0, 0, 0, 0,160,193, 0, 0, 85, 67, 0,160,134,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 29,144, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 30,160, 8,193, 28,128,
- 77, 97,112, 32, 84,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,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, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 79, 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,
- 76, 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, 68, 65, 84, 65,216, 0, 0, 0,176,180,178, 3, 4, 1, 0, 0, 1, 0, 0, 0, 56,186,178, 3, 96,176,178, 3,
+ 80,177,178, 3,144,179,178, 3, 12, 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, 0,191, 0, 0, 2, 66, 0, 0,122,196, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,
+108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 14, 2, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+128, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68,
+ 10,215, 35, 60, 0, 0, 72, 66, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,184,181,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,216,182,178, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 28,128, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 30,160, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 31,176, 8,193, 29,144, 77,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, 69,100,105,116,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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,216,182,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,248,183,178, 3,184,181,178, 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,255, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 31,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 32,192, 8,193, 30,160, 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, 0, 0, 0, 0, 69,100,105,116,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, 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, 68, 65, 84, 65,236, 0, 0, 0,248,183,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0, 24,185,178, 3,216,182,178, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 32,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 33,208, 8,193, 31,176, 83,104, 97,112,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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
- 8,193, 31,176, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 33,208, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 34,224, 8,193, 32,192,
- 77,101,115,104, 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, 68, 65, 84, 65,236, 0, 0, 0, 24,185,178, 3,185, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,248,183,178, 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,
- 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
+ 79, 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, 68, 65, 84, 65, 52, 0, 0, 0, 56,186,178, 3,154, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,176,180,178, 3,184,181,178, 3, 24,185,178, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,
+144,214, 76, 1,184, 0, 0, 0, 1, 0, 0, 0,184,227,178, 3, 16,102,155, 3, 0,219,155, 3,144, 72,160, 3,216, 12,156, 3,
+232,206,159, 3, 0, 0, 0, 0,193, 3, 0, 0, 7, 6, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 6, 6, 71, 2, 44, 3, 1, 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,240,183, 65, 1,224,188,178, 3,
+ 80,227,178, 3,160,186,178, 3,192,187,178, 3, 0, 0, 0, 0, 0, 0, 0, 0,200,159, 71, 1,136, 0,158, 3, 68, 65, 84, 65,
+236, 0, 0, 0,160,186,178, 3,185, 0, 0, 0, 1, 0, 0, 0,192,187,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 5, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 17, 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, 70, 2, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128, 3, 68, 0, 0,200, 65, 0,128, 3, 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, 71, 2, 26, 0, 71, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+193, 3, 0, 0, 7, 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,
+ 71, 2, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,188, 65, 1,144, 58,199, 3,
+144, 58,199, 3, 0, 0, 0, 0, 0, 0, 0, 0, 56, 2,158, 3, 40, 3,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+236, 0, 0, 0,192,187,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160,186,178, 3, 0, 0, 0, 0, 0, 0, 22, 67,
+ 0, 0, 0, 0, 0, 0, 22, 67, 36,191,184,191,146, 95, 28, 64, 19,174, 7,192, 19,174, 71, 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, 71, 2, 0, 0,
+ 0, 0, 0, 0, 18, 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,250, 94, 1, 62, 0,254, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 34,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 35,240, 8,193, 33,208, 77,101,115,104, 32, 84,111,111,
-108,115, 32, 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, 69,100,105,116,105,110,103, 0,
+193, 3, 0, 0, 7, 6, 0, 0, 26, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 2, 18, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,184, 65, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 5,158, 3,104, 6,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+136, 0, 0, 0,224,188,178, 3,156, 0, 0, 0, 1, 0, 0, 0,224,194,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 83,179, 3, 0, 0, 0, 0,
+ 0, 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,160, 63,179, 3,
+ 0, 0, 0, 0, 0, 0,255,255, 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, 1, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,
+152,189,178, 3,185, 0, 0, 0, 1, 0, 0, 0,184,190,178, 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,252, 96, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 35,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 37, 0, 8,193, 34,224, 84,101,120,116,117,114,101, 32,102, 97, 99,101, 0, 0, 0, 0,
+ 2, 0, 3, 3, 4, 0, 12, 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, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+184,190,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,189,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 37, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 37, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 38, 16, 8,193, 35,240, 85, 86, 32, 67, 97,108, 99,117,108, 97,116,105,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, 0, 0, 0, 0, 33, 2, 0, 0,
+111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 69,100,105,116,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,216,191,178, 3, 68, 65, 84, 65,216, 2, 0, 0,
+216,191,178, 3,145, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 38, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 39, 32, 8,193, 37, 0,
- 80, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 39, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 40, 48, 8,193, 38, 16, 67,117,114,118,101, 32, 97,110,
-100, 32, 83,117,114,102, 97, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 40, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 41, 64, 8,193, 39, 32, 67,117,114,118,101, 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, 69,100,105,116,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, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 41, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 42, 80, 8,193, 40, 48, 67,117,114,118,101, 32, 84,111,111,108,115, 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, 69,100,105,116,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, 84,252, 83, 63,104, 25,223,190,115, 52, 40, 62,119,211,159, 62, 96,183,198, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,163,146, 22,189,174, 51,122,190, 29,244, 58,192, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 42, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 43, 96, 8,193, 41, 64,
- 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,
- 77, 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, 68, 65, 84, 65,240, 0, 0, 0,224,194,178, 3,146, 0, 0, 0, 1, 0, 0, 0, 32,241,154, 3,224,188,178, 3,
+152,189,178, 3,184,190,178, 3, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84,252, 83, 63,104, 25,223,190,115, 52, 40, 62,119,211,159, 62, 96,183,198, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+232,119,179, 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, 4, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 24, 24, 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,
+163,146, 22,189,174, 51,122,190, 29,244, 58,192, 0, 0,224, 54, 56,146, 88, 63,198, 37, 71, 64, 20, 0, 0, 0, 7, 0, 10, 0,
+115, 0, 0, 0, 1, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0, 0,196,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 32,197,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 43, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 44,112, 8,193, 42, 80, 76,105,110,107,115, 32, 97,110,
-100, 32, 80,105,112,101,108,105,110,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, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 32,197,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0,196,178, 3, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196, 0, 0,100, 67,197,197,136, 55,118,209, 78, 68, 40,222,231,195,
+172,158, 25, 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,128, 67, 0, 0, 40, 66, 0, 0, 0, 69,
+ 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,
+235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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,255, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 44,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 45,128, 8,193, 43, 96, 77, 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, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0, 32,241,154, 3,151, 0, 0, 0, 1, 0, 0, 0,160,201,178, 3,
+224,194,178, 3, 0,196,178, 3, 32,197,178, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196, 0, 0,100, 67,
+197,197,136, 55,118,209, 78, 68, 40,222,231,195,172,158, 25, 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,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0,
+ 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 64,198,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 96,199,178, 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,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 45,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 46,144, 8,193, 44,112, 82, 97,109,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, 77, 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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 96,199,178, 3,185, 0, 0, 0, 1, 0, 0, 0,128,200,178, 3, 64,198,178, 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,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 44,112, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 46,144, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 47,160, 8,193, 45,128,
- 83,104, 97,100,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,
- 77, 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, 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, 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,253, 52, 1, 62, 0,224, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 47,160, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 47,160, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 48,176, 8,193, 46,144, 77,105,114,114,111,114, 32, 84,
-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, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,128,200,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,199,178, 3,
+ 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63, 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64,
+ 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0, 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68,
+ 0, 0, 0, 0, 0, 0, 0, 0,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, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,196, 0, 0, 0,160,201,178, 3,150, 0, 0, 0, 1, 0, 0, 0,216,204,178, 3, 32,241,154, 3,
+ 64,198,178, 3,128,200,178, 3, 2, 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, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63, 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64,
+ 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0, 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+236, 0, 0, 0,152,202,178, 3,185, 0, 0, 0, 1, 0, 0, 0,184,203,178, 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,252,248, 1, 62, 1, 28,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 48,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 49,192, 8,193, 47,160, 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, 77, 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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,
+236, 0, 0, 0,184,203,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,202,178, 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,252, 16, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 49,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 50,208, 8,193, 48,176, 77, 97,112, 32, 73,110,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, 77, 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,
+ 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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,252, 16, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 48,176, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 50,208, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 51,224, 8,193, 49,192,
- 77, 97,112, 32, 84,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, 68, 65, 84, 65,
+124, 2, 0, 0,216,204,178, 3,158, 0, 0, 0, 1, 0, 0, 0,200,209,178, 3,160,201,178, 3,152,202,178, 3,184,203,178, 3,
+ 9, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 45, 96, 1, 0, 0, 0, 0,
+ 62, 0, 0, 0, 32, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,225, 2, 0, 0,227, 2, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0,207, 2, 0, 0,
+227, 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,
- 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,252, 16, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 48,176, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 51,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 52,240, 8,193, 50,208, 82,101,110,100,101,114, 32, 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, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 52,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 54, 0, 8,193, 51,224, 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, 87,111,114,108,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,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 54, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 55, 16, 8,193, 52,240, 87,111,114,108,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, 87,111,114,108,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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 55, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 56, 32, 8,193, 54, 0,
- 77,105,115,116, 32, 47, 32, 83,116, 97,114,115, 32, 47, 32, 80,104,121,115,105, 99,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,136,207,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+168,208,178, 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,
- 87,111,114,108,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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 56, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 57, 48, 8,193, 55, 16, 65,109, 98, 32, 79, 99, 99, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,168,208,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,136,207,178, 3, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67,
+ 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 87,111,114,108,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, 68, 65, 84, 65,248, 0, 0, 0,200,209,178, 3,155, 0, 0, 0, 1, 0, 0, 0,
+ 48,213,178, 3,216,204,178, 3,136,207,178, 3,168,208,178, 3, 3, 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, 0, 0, 0, 0,182, 67, 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67,
+ 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 65, 84, 65,236, 0, 0, 0,
+240,210,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 16,212,178, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 55, 16, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 57, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 58, 64, 8,193, 56, 32, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 87,111,114,108,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,
+ 2, 0, 3, 3, 4, 0, 12, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 58, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 59, 80, 8,193, 57, 48, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+ 16,212,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,210,178, 3, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192,
+ 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,
+124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 73, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,
+111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 87,111,114,108,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, 68, 65, 84, 65,184, 0, 0, 0,
+ 48,213,178, 3,250, 0, 0, 0, 1, 0, 0, 0,120,217,178, 3,200,209,178, 3,240,210,178, 3, 16,212,178, 3, 11, 0, 0, 0,
+ 51, 51, 51, 63, 0,226,127, 3, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66,
+ 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67,
+ 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 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,236, 0, 0, 0, 24,214,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 56,215,178, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 57, 48, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 59, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 60, 96, 8,193, 58, 64,
- 77,117,108,116,105,114,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,
- 69,100,105,116,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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 56,215,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 88,216,178, 3, 24,214,178, 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,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 60, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 61,112, 8,193, 59, 80, 79, 98,106,101, 99,116, 32, 97,
-110,100, 32, 76,105,110,107,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, 79, 98,106,101, 99,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, 8, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 61,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 62,128, 8,193, 60, 96, 65,110,105,109, 32,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, 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, 79, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 88,216,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,215,178, 3,
+ 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,
+108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,
+205,204,204, 61, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,188, 0, 0, 0,120,217,178, 3,157, 0, 0, 0, 1, 0, 0, 0,200,221,178, 3, 48,213,178, 3,
+ 24,214,178, 3, 88,216,178, 3, 13, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192,
+ 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,
+108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,236, 0, 0, 0,104,218,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0,136,219,178, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 62,128, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 63,144, 8,193, 61,112, 68,114, 97,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, 79, 98,106,101, 99,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, 2, 0, 3, 3,
+ 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,136,219,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0,168,220,178, 3,104,218,178, 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, 8, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,168,220,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,219,178, 3, 0, 0,160,193, 0,128,167, 67, 0,160,134,196, 0, 0, 0, 0,
+ 0, 0,160,193, 0,128,167, 67, 0,160,134,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 63,144, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 64,160, 8,193, 62,128,
- 67,111,110,115,116,114, 97,105,110,116,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,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, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0,
+ 0, 0, 0, 0, 79, 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,
- 79, 98,106,101, 99,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, 68, 65, 84, 65,216, 0, 0, 0,200,221,178, 3,
+ 4, 1, 0, 0, 1, 0, 0, 0, 80,227,178, 3,120,217,178, 3,104,218,178, 3,168,220,178, 3, 12, 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, 0,191, 0, 0, 2, 66, 0, 0,122,196, 0, 0, 0, 0,
+ 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 14, 2, 0, 0,
+128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0, 14, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68, 10,215, 35, 60, 0, 0, 72, 66, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,236, 0, 0, 0,208,222,178, 3,185, 0, 0, 0, 1, 0, 0, 0,240,223,178, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 64,160, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 65,176, 8,193, 63,144, 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, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 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,
+ 68, 65, 84, 65,236, 0, 0, 0,240,223,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 16,225,178, 3,208,222,178, 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,254, 48, 1, 62, 0,204,
- 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8,193, 21, 16, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 65,176,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 66,192, 8,193, 64,160, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 3, 8,193, 22, 32, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 66,192, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 67,208, 8,193, 65,176, 80, 97,114,116,105, 99,108,101, 32, 83,121,115,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 80, 97,114,116,105, 99,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,236, 0, 0, 0, 16,225,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 48,226,178, 3,240,223,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 67,208, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 68,224, 8,193, 66,192,
- 80,104,121,115,105, 99,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,
- 80, 97,114,116,105, 99,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, 0, 0, 0, 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,
+ 68, 65, 84, 65,236, 0, 0, 0, 48,226,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,225,178, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 68,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 69,240, 8,193, 67,208, 86,105,115,117, 97,108,105,122,
- 97,116,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 97,114,116,105, 99,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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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,254, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 69,240,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 71, 0, 8,193, 68,224, 69,120,116,114, 97,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, 80, 97,114,116,105, 99,108,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 52, 0, 0, 0, 80,227,178, 3,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200,221,178, 3,208,222,178, 3,
+ 48,226,178, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,184,227,178, 3,184, 0, 0, 0, 1, 0, 0, 0,112, 13,179, 3,
+144,214, 76, 1, 24,225,155, 3, 48, 11,156, 3, 0,177,154, 3, 0,219,155, 3, 0, 0, 0, 0, 0, 0, 0, 0,191, 3, 0, 0,
+ 0, 0, 0, 0,119, 4, 0, 0, 1, 1,192, 3,120, 4, 1, 0, 0, 0, 0, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,112,172, 65, 1,160,233,178, 3, 8, 13,179, 3, 88,228,178, 3,120,229,178, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0,224, 6,158, 3,160, 7,158, 3, 68, 65, 84, 65,236, 0, 0, 0, 88,228,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+120,229,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,112, 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,191, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 84, 68, 0, 0,200, 65,
+ 0,192, 84, 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,192, 3,
+ 26, 0,192, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 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,192, 3, 26, 0, 8, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,178, 65, 1,112,168, 78, 1,112,168, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 80, 9,158, 3,
+184, 10,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,120,229,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 88,228,178, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 71, 0, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 72, 16, 8,193, 69,240, 67,104,105,108,100,114,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 3, 0, 0, 26, 0, 0, 0,119, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 3, 94, 4, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,173, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 12,158, 3,
+ 96, 16,158, 3, 0, 0, 0, 0,152,230,178, 3, 68, 65, 84, 65,216, 2, 0, 0,152,230,178, 3,145, 0, 0, 0, 1, 0, 0, 0,
+170, 10,163, 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, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0,
+197, 56, 16, 63,181,165,214,190,216, 65, 54, 63, 0, 0, 0, 0,103,115, 83, 63,179,248,135, 62,228,147,254,190, 0, 0, 0, 0,
+155,199,158, 60, 68, 64, 94, 63,111,229,253, 62, 0, 0, 0, 0,239,219,254,191,167, 80,144,192,255, 66, 63,194, 0, 0,128, 63,
+229, 56, 16, 63, 90,115, 83, 63,158,201,158, 60, 0, 0, 0, 0,200,165,214,190,182,248,135, 62, 77, 64, 94, 63, 0, 0, 0, 0,
+225, 65, 54, 63, 0,148,254,190,119,229,253, 62, 0, 0, 0, 0,110, 23, 5, 66, 18,118,167,193, 59, 82,221, 65, 0, 0,128, 63,
+ 79,180, 55, 63, 62,197,234,190,182, 67, 54,191,216, 65, 54,191, 74,171,134, 63, 4,184,148, 62,128,150,254, 62,228,147,254, 62,
+106, 63,202, 60, 74, 22,115, 63, 9,232,253,190,111,229,253,190,167, 80, 34,192, 55,216,157,192,122, 48, 63, 66,255, 66, 63, 66,
+ 76,111,226, 62,122, 2, 38, 63,246,229,120, 60, 0, 84,115,181, 62,141,196,190,172, 3,121, 62, 71, 19, 75, 63, 0, 8,149,183,
+ 77, 79,208,196, 76, 13,131, 68,171, 51,173,196, 68, 87, 72,194,156, 58,208, 68,179,254,130,196,138, 37,173, 68, 71, 89, 72, 66,
+197, 56, 16, 63,181,165,214,190,216, 65, 54, 63, 0, 0, 0, 0,103,115, 83, 63,179,248,135, 62,228,147,254,190, 0, 0, 0, 0,
+155,199,158, 60, 68, 64, 94, 63,111,229,253, 62, 0, 0, 0, 0, 62,101,214,192,129, 55, 88,192, 98, 89, 45,194, 0, 0,128, 63,
+ 79,180, 55, 63, 62,197,234,190,182, 67, 54,191,216, 65, 54,191, 74,171,134, 63, 4,184,148, 62,128,150,254, 62,228,147,254, 62,
+106, 63,202, 60, 74, 22,115, 63, 9,232,253,190,111,229,253,190,101,139, 8,193,181,124,108,192,174, 70, 45, 66, 98, 89, 45, 66,
+180, 25,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180, 25,170, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,180, 25,170, 64, 0, 0, 0, 0,113, 36,122, 61,157, 24,186,192, 28, 38, 71, 64, 0, 0,128, 63,
+153, 42, 67, 63,246, 62,229,190,251,142,104,190,131, 17,209,190,141, 8, 56, 66,223,139, 15, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+251, 91,214, 58, 80,127, 4,191,250,204,248,191, 74, 51,155,192, 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, 80, 97,114,116,105, 99,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 69,240, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 72, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 73, 32, 8,193, 71, 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,240, 0, 0, 0,
+160,233,178, 3,146, 0, 0, 0, 1, 0, 0, 0, 0,237,178, 3, 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, 17,139, 48, 63,240,151, 31,191,155, 98,151,190,
+ 77, 45, 97,190,141, 8, 56, 66, 0, 0, 0, 0,255, 13, 0, 0, 1, 0, 0, 0,232,119,179, 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,
- 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, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 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, 10,215, 35, 60, 0, 0,250, 67, 80,127, 4,191,250,204,248,191, 74, 51,155,192,
+ 96,199, 41,188,225,230, 30,193,216,129,230, 63, 20, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 1, 0, 1, 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,
+236, 0, 0, 0,192,234,178, 3,185, 0, 0, 0, 1, 0, 0, 0,224,235,178, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 55, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,213, 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,174, 6, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,192,213, 68, 0, 0,200, 65, 0,192,213, 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,175, 6, 26, 0,175, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,174, 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,
+175, 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, 68, 65, 84, 65,
+236, 0, 0, 0,224,235,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192,234,178, 3, 0, 0, 0, 0, 0, 0, 22, 67,
+ 0, 0, 0, 0, 0, 0, 22, 67,181,129,166,192,181,129,198, 64,218, 64, 71,192,109,160,131, 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,175, 6, 0, 0,
+ 0, 0, 0, 0, 60, 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,174, 6, 0, 0, 26, 0, 0, 0, 85, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+175, 6, 60, 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, 68, 65, 84, 65,
+136, 0, 0, 0, 0,237,178, 3,156, 0, 0, 0, 1, 0, 0, 0,192, 78,174, 3,160,233,178, 3,192,234,178, 3,224,235,178, 3,
+ 6, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 83,179, 3, 0, 0, 0, 0,
+ 0, 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, 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,236, 0, 0, 0,
+184,237,178, 3,185, 0, 0, 0, 1, 0, 0, 0,216,238,178, 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,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 73, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 74, 48, 8,193, 72, 16, 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, 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,
+ 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,
+216,238,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,237,178, 3, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196,
+ 0, 0,100, 67,197,197,136, 55,118,209, 78, 68, 40,222,231,195,172,158, 25, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 74, 48,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 75, 64, 8,193, 73, 32, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 2, 0, 0, 0, 0, 0, 0, 79, 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, 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, 68, 65, 84, 65,232, 0, 0, 0,
+192, 78,174, 3,151, 0, 0, 0, 1, 0, 0, 0, 88,243,178, 3, 0,237,178, 3,184,237,178, 3,216,238,178, 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, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196, 0, 0,100, 67,197,197,136, 55,118,209, 78, 68, 40,222,231,195,172,158, 25, 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,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67,
+ 0, 0, 0, 63, 72,225,154, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,235, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,150, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,248,239,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 24,241,178, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 73, 32, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 75, 64, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193, 76, 80, 8,193, 74, 48, 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, 2, 0, 3, 3,
+ 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 24,241,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 56,242,178, 3,248,239,178, 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, 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, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 56,242,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 24,241,178, 3, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63,
+ 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0,
+ 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0,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, 31, 2, 0, 0,
+ 0, 0, 0, 0, 79, 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,255, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 76, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 77, 96, 8,193, 75, 64,
- 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,196, 0, 0, 0, 88,243,178, 3,
+150, 0, 0, 0, 1, 0, 0, 0,144,246,178, 3,192, 78,174, 3,248,239,178, 3, 56,242,178, 3, 2, 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, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63,
+ 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0,
+ 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 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,
- 77, 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, 68, 65, 84, 65,236, 0, 0, 0, 80,244,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+112,245,178, 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, 2, 0, 3, 3, 4, 0, 12, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193, 47,160, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193, 77, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 78,112, 8,193, 76, 80, 83,107,121, 47, 65,116,109,111,
-115,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, 76, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,112,245,178, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 80,244,178, 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,254, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 78,112,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193, 79,128, 8,193, 77, 96, 77,101,115,104, 32, 84,111,111,108,115, 32, 77,111,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, 69,100,105,116,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, 31, 2, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,124, 2, 0, 0,144,246,178, 3,158, 0, 0, 0, 1, 0, 0, 0,
+128,251,178, 3, 88,243,178, 3, 80,244,178, 3,112,245,178, 3, 9, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224, 45, 96, 1, 0, 0, 0, 0, 62, 0, 0, 0, 32, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,225, 2, 0, 0,
+227, 2, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0,207, 2, 0, 0,227, 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,251,120, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 79,128, 0, 0, 0,168, 0, 0, 0, 1,
- 0, 0, 0, 0, 8,193, 78,112, 84,101,120,116,117,114,101, 32, 70, 97, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193, 59, 80, 68, 65, 84, 65, 0, 0, 0,220, 8,193, 80,144, 0, 0, 0,147, 0, 0, 0, 1, 3,160,146, 32, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 0, 8,193, 16,224, 0, 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,193, 0, 0, 0, 67,163, 0, 0,196,180, 64, 0, 67,104, 0, 0,193, 0, 0, 0, 67,163, 0, 0,
-196,133, 50,225, 67, 53,230,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, 67,128, 0, 0, 66, 40, 0, 0,
- 69, 0, 0, 0, 67,225, 0, 0, 63, 0, 0, 0, 63,154,225, 72, 0, 0, 0, 1, 0, 1, 0, 1, 0,200, 2,235, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 3,160,158, 32,255,255, 0, 0,
- 0, 0, 0, 0, 1,150, 0, 0, 1, 53, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 28, 3,160,146, 32,
- 0, 0, 0,142, 0, 0, 0, 1, 8,193, 81,160, 8,193, 80,144, 0, 0, 0, 1, 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,127,198, 52,188,166, 29,146, 61, 22,153, 97, 0, 0, 0, 0, 61, 43,252, 13,
- 62,247, 11, 89,191, 95,248, 90, 0, 0, 0, 0, 52, 67,176,196, 63, 96, 42,246, 62,247, 67, 44, 0, 0, 0, 0, 64, 78, 45, 74,
- 62,172, 87,201,194, 41,171, 79, 63,128, 0, 0, 63,127,198, 53, 61, 43,251,248, 52, 80, 0, 0, 0, 0, 0, 0,188,166, 29,186,
- 62,247, 11,119, 63, 96, 43, 16, 0, 0, 0, 0, 61, 22,153, 99,191, 95,248,117, 62,247, 67, 75, 0, 0, 0, 0,191,211,125,192,
-194, 21,161,185, 65,161,133, 59, 63,128, 0, 0, 63,139,224,100,190, 96,221, 21,189, 22,154,236,189, 22,153, 97, 61, 60, 27,174,
- 64,167, 52,239, 63, 95,250,166, 63, 95,248, 90, 52, 86, 9, 86, 65, 23,185, 41,190,247, 69,181,190,247, 67, 44, 64, 97,129,137,
- 64,105, 75, 27, 66, 41,152,145, 66, 41,171, 79, 63,105,225, 95, 61, 39,247, 84,186,185, 46,176,184,146,196,144,186,245,126,178,
- 61, 54,117, 48, 61,165,157, 23, 52,153,160, 0, 66,165, 56,225, 68,233,202,192,196,124, 94, 18,194, 71,254, 87,194,165, 77,102,
-196,233,177, 39, 68,124, 65,193, 66, 72, 0,101, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 45, 68,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 63,127,198, 52,188,166, 29,146, 61, 22,153, 97, 0, 0, 0, 0, 61, 43,252, 13,
- 62,247, 11, 89,191, 95,248, 90, 0, 0, 0, 0, 52, 67,176,196, 63, 96, 42,246, 62,247, 67, 44, 0, 0, 0, 0, 64, 78, 45, 74,
- 62,172, 87,201,194, 41,171, 79, 63,128, 0, 0, 63, 92, 99,141,191, 2, 35, 43,188, 46,238,188,188,148, 32, 94, 66, 25,240, 23,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3,160,170, 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, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 1, 0, 0,255,226, 0, 0, 66, 12, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 58,124, 56, 68, 60, 35,215, 10, 67,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 68, 77,201,
- 64,111, 66,228,191,205, 97,230, 60,149,191,128,191, 77,109,116, 63,230,165,248, 0, 20, 0, 0, 0, 7, 0, 99, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0,255,255, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 24, 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, 68, 65, 84, 65, 0, 0, 1, 88, 8,193, 81,160, 0, 0, 0,146, 0, 0, 0, 1, 8,193, 83, 32, 3,160,146, 32,
- 0, 0, 0, 2, 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0, 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,122, 0, 0,189,204,204,205, 63,140,204,205, 63,128, 0, 0, 67,122, 0, 0,192,160, 0, 0,
- 64,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2,235, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 0,
- 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 16, 0, 0, 2,235, 60, 35,215, 10, 60, 35,215, 10, 70,106, 96, 0,
- 68,122, 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, 0, 0, 0, 3,161, 14, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,122, 0, 0,189,204,204,205, 63,140,204,205, 68, 65, 84, 65, 0, 0, 0,128, 8,193, 83, 32, 0, 0, 0,153,
- 0, 0, 0, 1, 8,193, 83,208, 8,193, 81,160, 0, 0, 0, 9, 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,193,195,192, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 5,
- 0, 0, 0, 17, 0, 0, 2,225, 0, 0, 2,227, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,207, 0, 0, 2,227, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193, 83,208, 0, 0, 0,151, 0, 0, 0, 1, 8,193, 85, 0, 8,193, 83, 32,
- 0, 0, 0, 6, 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,190,120, 0, 0, 63,159, 0, 0,190,242, 0, 0, 63,188,128, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 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, 1,
- 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,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193, 85, 0, 0, 0, 0,150, 0, 0, 0, 1, 8,193, 86, 48, 8,193, 83,208, 0, 0, 0, 3,
- 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,
-195,209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,190, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1,124,
- 0, 0, 0, 0, 0, 0, 1,124,195,190, 0, 0,195,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 1, 0, 1, 0, 1, 0, 1, 1,108, 1,124, 0, 0, 0, 0, 0, 0, 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,142, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,176, 8,193, 86, 48, 0, 0, 0,235, 0, 0, 0, 1, 8,193, 87, 16, 8,193, 85, 0, 0, 0, 0, 11, 63, 51, 51, 51,
- 8,193, 16,224,192,128, 0, 0, 67,122, 0, 0,192,128, 0, 0, 67,127, 0, 0,192,128, 0, 0, 66, 72, 0, 0,192,128, 0, 0,
- 67,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0,
- 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 16, 0, 0, 1,124, 63,128, 0, 0, 67,129,128, 0, 70,250, 0, 0,
- 67,129,128, 0, 61,204,204,205, 65, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+236, 0, 0, 0, 64,249,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 96,250,178, 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,
- 68, 65, 84, 65, 0, 0, 0,180, 8,193, 87, 16, 0, 0, 0,152, 0, 0, 0, 1, 8,193, 87,240, 8,193, 86, 48, 0, 0, 0, 13,
- 63, 51, 51, 51, 8,193, 16,224, 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,128, 0, 0, 68,122, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,192,160, 0, 0, 66,130, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,
- 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 68,122, 0, 0, 68,122, 0, 0,
- 61,204,204,205, 66, 72, 0, 0, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0,192, 8,193, 87,240, 0, 0, 0,245, 0, 0, 0, 1, 8,193, 88,224,
- 8,193, 87, 16, 0, 0, 0, 12, 63, 51, 51, 51, 8,193, 16,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 0, 0, 0, 66, 2, 0, 0,196,122, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,194,150, 0, 0, 64,160, 0, 0,
- 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 2, 14, 0, 0, 0, 0, 0, 0, 0, 0, 70,250, 0, 0, 68,122, 0, 0,
- 60, 35,215, 10, 66, 72, 0, 0, 0, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1,200, 8,193, 88,224, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0, 0, 8,193, 87,240, 0, 0, 0, 5, 63, 51, 51, 51,
- 8,193, 16,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 83, 97,118,101,
- 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 85,115,101,114,115, 47,116,111,110, 47, 68,
-101,115,107,116,111,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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,
+236, 0, 0, 0, 96,250,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,249,178, 3, 0, 0, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 31, 2, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,
+248, 0, 0, 0,128,251,178, 3,155, 0, 0, 0, 1, 0, 0, 0,232,254,178, 3,144,246,178, 3, 64,249,178, 3, 96,250,178, 3,
+ 3, 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, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,101,118,105,101,119, 46, 98,108,101,110,100, 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,236, 0, 0, 0,168,252,178, 3,185, 0, 0, 0, 1, 0, 0, 0,200,253,178, 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, 8, 0, 82, 0, 0, 0, 0, 1, 76, 0, 1,
- 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0,204,
- 8,193, 90,208, 0, 0, 0,169, 0, 0, 0, 1, 8,193,115,224, 8,193, 16,224, 8,192,224, 80, 8,192,224,144, 8,192,224, 16,
- 8,192,223,208, 0, 0, 0, 0, 63,238, 38, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-188,163,215,225, 0, 0, 0, 0, 0, 0, 1,237, 0, 0, 3, 31, 0, 0, 0, 0, 0, 0, 3, 5, 0, 0, 1,237, 0, 0, 3, 31,
- 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 1,237, 0, 0, 3, 31, 0, 0, 0, 27, 0, 0, 3, 5, 0, 9, 0, 8, 0, 1, 6, 6,
- 1, 51, 2,235, 1, 0, 1, 0, 0,220, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193,105,160, 8,193,113,240, 8,192, 64, 80, 8,192, 64, 80, 8,193, 91,208, 8,193,104,144, 68, 65, 84, 65, 0, 0, 0,228,
- 8,193, 91,208, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 92,224, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,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, 73,112,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, 2, 0, 3, 3, 4, 0, 12, 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, 33, 0,167, 1, 62, 0,204, 0, 0, 0, 0,
- 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 92,224, 0, 0, 0,168,
- 0, 0, 0, 1, 8,193, 93,240, 8,193, 91,208, 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, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,200,253,178, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+168,252,178, 3, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192,
+ 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70,
+ 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,184, 0, 0, 0,232,254,178, 3,250, 0, 0, 0, 1, 0, 0, 0, 48, 3,179, 3,
+128,251,178, 3,168,252,178, 3,200,253,178, 3, 11, 0, 0, 0, 51, 51, 51, 63,248,254,127, 3, 0, 0,128,192, 0, 0,122, 67,
+ 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65,
+ 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,236, 0, 0, 0,208,255,178, 3,
+185, 0, 0, 0, 1, 0, 0, 0,240, 0,179, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 93,240, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 95, 0,
- 8,193, 92,224, 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, 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, 2, 0, 3, 3,
+ 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,240, 0,179, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 16, 2,179, 3,208,255,178, 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, 8, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 16, 2,179, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 0,179, 3, 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68,
+ 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 2, 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, 31, 2, 0, 0,
+ 0, 0, 0, 0, 79, 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, 1, 64, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,228, 8,193, 95, 0, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 96, 16, 8,193, 93,240, 65,110,105,109,
+ 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, 48, 3,179, 3,
+157, 0, 0, 0, 1, 0, 0, 0,128, 7,179, 3,232,254,178, 3,208,255,178, 3, 16, 2,179, 3, 13, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,
+124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,
+108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61,
+ 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,236, 0, 0, 0, 32, 4,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 64, 5,179, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228,
- 8,193, 96, 16, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 97, 32, 8,193, 95, 0, 70,111,114,109, 97,116, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 64, 5,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 96, 6,179, 3, 32, 4,179, 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, 3,192, 0, 0, 1, 62, 0,204, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 97, 32, 0, 0, 0,168,
- 0, 0, 0, 1, 8,193, 98, 48, 8,193, 96, 16, 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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, 69,100,105,116,105,110,103, 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, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 96, 6,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 5,179, 3,
+ 0, 0,160,193, 0, 0, 8, 68, 0,160,134,196, 0, 0, 0, 0, 0, 0,160,193, 0, 0, 8, 68, 0,160,134,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193, 98, 48, 0, 0, 0,168, 0, 0, 0, 1, 8,193, 99, 64,
- 8,193, 97, 32, 67, 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,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, 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, 31, 2, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,216, 0, 0, 0,128, 7,179, 3, 4, 1, 0, 0, 1, 0, 0, 0, 8, 13,179, 3, 48, 3,179, 3,
+ 32, 4,179, 3, 96, 6,179, 3, 12, 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, 0,191, 0, 0, 2, 66, 0, 0,122,196, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,
+108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 14, 2, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+128, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68,
+ 10,215, 35, 60, 0, 0, 72, 66, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,136, 8,179, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,168, 9,179, 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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,168, 9,179, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,200, 10,179, 3,136, 8,179, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,200, 10,179, 3,185, 0, 0, 0,
+ 1, 0, 0, 0,232, 11,179, 3,168, 9,179, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,232, 11,179, 3,185, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,200, 10,179, 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, 18, 0, 0, 0, 0, 0, 3, 3, 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, 31, 2, 0, 0, 0, 0, 0, 0,
+ 79, 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, 68, 65, 84, 65, 52, 0, 0, 0, 8, 13,179, 3,154, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,128, 7,179, 3,136, 8,179, 3,232, 11,179, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,
+112, 13,179, 3,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,227,178, 3,144, 72,160, 3, 0,177,154, 3,136, 3,156, 3,
+216, 12,156, 3, 0, 0, 0, 0,193, 3, 0, 0, 7, 6, 0, 0, 45, 3, 0, 0,119, 4, 0, 0, 3, 3, 71, 2, 75, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, 65, 1, 80, 16,179, 3,
+216, 62,179, 3, 16, 14,179, 3, 48, 15,179, 3, 0, 0, 0, 0, 0, 0, 0, 0,216, 16,158, 3,152, 17,158, 3, 68, 65, 84, 65,
+236, 0, 0, 0, 16, 14,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 48, 15,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 17, 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, 70, 2, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128, 3, 68, 0, 0,200, 65, 0,128, 3, 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, 71, 2, 26, 0, 71, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+193, 3, 0, 0, 7, 6, 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,
+ 71, 2, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,170, 65, 1,112,145,203, 3,
+112,145,203, 3, 0, 0, 0, 0, 0, 0, 0, 0, 72, 19,158, 3,192, 19,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+236, 0, 0, 0, 48, 15,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 14,179, 3, 0, 0, 0, 0, 0,128,241, 67,
+ 0, 0,210,195, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 13, 68, 0,128,143,195, 0, 0, 0, 0, 54, 2, 0, 0, 71, 2, 0, 0,
+ 18, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 53, 2, 0, 0,
+ 18, 0, 0, 0, 48, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 71, 2, 49, 1, 54, 2, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+193, 3, 0, 0, 7, 6, 0, 0, 71, 3, 0, 0,119, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 2, 49, 1, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,169, 65, 1,240,149,203, 3,
+240,149,203, 3, 0, 0, 0, 0, 0, 0, 0, 0,136, 21,158, 3,120, 22,158, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+248, 0, 0, 0, 80, 16,179, 3,155, 0, 0, 0, 1, 0, 0, 0,184, 26,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 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, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184, 67,199, 3,184, 67,199, 3,136,177,163, 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,
+ 1, 0, 12, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,136,177,163, 3,208, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,
+164, 0, 0, 0,232, 21,199, 3, 68, 65, 84, 65,176, 7, 0, 0,232, 21,199, 3,207, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,160, 63,179, 3, 19, 0, 0, 0, 1, 0, 0, 0,160, 63,179, 3, 20, 0, 0, 0, 1, 0, 0, 0,160, 63,179, 3,
+ 23, 0, 0, 0, 1, 0, 0, 0,168,141,156, 3, 21, 0, 1, 0, 1, 0, 0, 0,160, 63,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 24,112,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,203,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,112,104,184, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,199,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 64, 91,184, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 80,195,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 16, 78,184, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 80,191,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,224, 64,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,187,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,176, 51,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,183,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,128, 38,184, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,179,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80, 25,184, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,175,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 32, 12,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,171,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,240,254,183, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80,167,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,192,241,183, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 80,163,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,144,228,183, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 80,159,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 96,215,183, 3, 0, 0, 0, 0, 1, 0, 0, 0,136,155,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 80,173,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,248,151,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 40,130,183, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,104,148,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 87,183, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,216,144,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+240, 44,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 72,141,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,224, 2,183, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,184,137,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,184,215,182, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+232,119,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 85,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 8, 57,181, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 8, 87,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 40,134,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,168,181,182, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,152,130,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+112, 96,182, 3, 0, 0, 0, 0, 1, 0, 0, 0,184, 4,180, 3, 0, 0, 0, 0, 1, 0, 0, 0, 8,208,182, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,232, 71,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,208, 91,181, 3, 9, 0, 0, 0, 1, 0, 0, 0,184, 4,180, 3,
+ 10, 0, 0, 0, 1, 0, 0, 0,184, 4,180, 3, 29, 0, 0, 0, 1, 0, 0, 0,184, 4,180, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 32,225,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 40,109,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,176,228,179, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,216,194,182, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,144,221,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,248,102,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0,218,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 8,100,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,184, 0,180, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 64,193,186, 3, 0, 0, 0, 0, 1, 0, 0, 0, 8,127,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152,139,182, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0, 1, 0, 0, 0, 40,249,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 72, 90,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,184,252,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,144,185,186, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,168, 85,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 60,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,160,170,186, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,200, 78,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,208, 91,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 40,245,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,160,117,184, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,176,232,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,216,162,186, 3, 0, 0, 0, 0, 1, 0, 0, 0,208, 91,181, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 80,207,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,136, 93,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 40,241,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,112,214,179, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,232,105,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,176,236,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,176, 94,181, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,208, 91,181, 3, 9, 0, 0, 0, 1, 0, 0, 0,176,236,179, 3, 10, 0, 0, 0, 1, 0, 0, 0,
+176,236,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,224,210,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,200, 96,179, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0,120,123,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 80, 86,179, 3, 30, 0,255,255, 0, 0, 1, 0,112,152,230, 0,
+ 31, 0, 0, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 1, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 2, 0, 1, 0, 1, 0,
+112,152,230, 0, 31, 0, 3, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 4, 0, 0, 0, 1, 0,112,152,230, 0, 31, 0, 5, 0,
+ 1, 0, 1, 0,112,152,230, 0, 31, 0, 6, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 7, 0, 1, 0, 1, 0,112,152,230, 0,
+ 31, 0, 8, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 9, 0, 1, 0, 1, 0,112,152,230, 0, 30, 0,255,255, 0, 0, 1, 0,
+112,152,230, 0, 31, 0, 0, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 1, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 2, 0,
+ 1, 0, 1, 0,112,152,230, 0, 31, 0, 3, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 10, 0, 1, 0, 1, 0,112,152,230, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 12, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 13, 0, 1, 0, 0, 0,
+112,152,230, 0, 31, 0, 14, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 15, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 16, 0,
+ 1, 0, 0, 0,112,152,230, 0, 31, 0, 17, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 18, 0, 1, 0, 0, 0,112,152,230, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 20, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 21, 0, 1, 0, 0, 0,
+112,152,230, 0, 31, 0, 22, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 23, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 24, 0,
+ 1, 0, 0, 0,112,152,230, 0, 31, 0, 25, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 26, 0, 1, 0, 0, 0,112,152,230, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 28, 0, 1, 0, 0, 0,112,152,230, 0, 31, 0, 29, 0, 1, 0, 0, 0,
+112,152,230, 0, 31, 0, 4, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 5, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 6, 0,
+ 1, 0, 1, 0,112,152,230, 0, 31, 0, 7, 0, 1, 0, 1, 0,112,152,230, 0, 31, 0, 8, 0, 1, 0, 1, 0,112,152,230, 0,
+ 31, 0, 9, 0, 1, 0, 1, 0,112,152,230, 0, 68, 65, 84, 65,236, 0, 0, 0,120, 24,179, 3,185, 0, 0, 0, 1, 0, 0, 0,
+152, 25,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,217, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 3, 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, 14, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128, 3, 68, 0, 0,200, 65,
+ 0,128, 3, 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, 15, 2,
+ 26, 0, 15, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 3, 0, 0, 99, 5, 0, 0, 17, 3, 0, 0, 42, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 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, 68, 65, 84, 65,236, 0, 0, 0,152, 25,179, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,120, 24,179, 3, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,254,127, 7,191,255,191,195, 63,
+247,255,163,189,255, 63,138, 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, 15, 2, 0, 0, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 0, 0, 99, 5, 0, 0, 43, 3, 0, 0, 83, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 2, 41, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0,184, 26,179, 3,156, 0, 0, 0, 1, 0, 0, 0,
+184, 32,179, 3, 80, 16,179, 3,120, 24,179, 3,152, 25,179, 3, 6, 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, 0, 0, 0, 0, 0, 0, 0, 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,255,255, 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, 1, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,112, 27,179, 3,185, 0, 0, 0, 1, 0, 0, 0,144, 28,179, 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, 2, 0, 3, 3, 4, 0, 12, 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, 69,100,105,116,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, 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, 68, 65, 84, 65,236, 0, 0, 0,144, 28,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+112, 27,179, 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, 1, 64, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,228, 8,193, 99, 64, 0, 0, 0,168, 0, 0, 0, 1, 8,193,100, 80, 8,193, 98, 48, 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, 76, 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, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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,176, 29,179, 3, 68, 65, 84, 65,216, 2, 0, 0,176, 29,179, 3,145, 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,
- 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228,
- 8,193,100, 80, 0, 0, 0,168, 0, 0, 0, 1, 8,193,101, 96, 8,193, 99, 64, 76, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,101, 96, 0, 0, 0,168,
- 0, 0, 0, 1, 8,193,102,112, 8,193,100, 80, 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,102,112, 0, 0, 0,168, 0, 0, 0, 1, 8,193,103,128,
- 8,193,101, 96, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,228, 8,193,103,128, 0, 0, 0,168, 0, 0, 0, 1, 8,193,104,144, 8,193,102,112, 77, 97,112, 32,
- 84,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, 76, 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, 0, 0, 0, 0, 0, 84,252, 83, 63,
+104, 25,223,190,115, 52, 40, 62,119,211,159, 62, 96,183,198, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+163,146, 22,189,174, 51,122,190, 29,244, 58,192, 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,253, 72,
- 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193,102,112, 68, 65, 84, 65, 0, 0, 0,228,
- 8,193,104,144, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0, 0, 8,193,103,128, 84,114, 97,110,115,102,111,114,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, 86,105,101,119, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1, 62, 0,204, 0, 0, 0, 0,
- 0,162, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,105,160, 0, 0, 0,151,
- 0, 0, 0, 1, 3,160,150, 32, 0, 0, 0, 0, 0, 0, 0, 6, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,189,204, 0, 0, 63,140,192, 0,
-191,117,128, 0, 63,250,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 51, 0, 0, 0, 0, 0, 0, 2,235, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 32,179, 3,
+146, 0, 0, 0, 1, 0, 0, 0, 24, 36,179, 3,184, 26,179, 3,112, 27,179, 3,144, 28,179, 3, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,252, 83, 63,104, 25,223,190,115, 52, 40, 62,119,211,159, 62,
+ 96,183,198, 65, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,119,179, 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,
+ 4, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 24, 24, 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,163,146, 22,189,174, 51,122,190, 29,244, 58,192, 0, 0,224, 54,
+ 56,146, 88, 63,198, 37, 71, 64, 20, 0, 0, 0, 7, 0, 10, 0,115, 0, 0, 0, 1, 0, 0, 0, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+216, 33,179, 3,185, 0, 0, 0, 1, 0, 0, 0,248, 34,179, 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, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 3, 28, 3,160,150, 32, 0, 0, 0,142, 0, 0, 0, 1,
- 8,193,106,208, 8,193,105,160, 0, 0, 0, 1, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 75, 54, 62,191,102,119,191, 11, 73, 11, 0, 0, 0, 0,191, 40,254,108, 62,217,202, 94,191, 30,124,246,
- 0, 0, 0, 0,180,186, 33,218, 63, 82,254,184, 63, 16,248,193, 0, 0, 0, 0, 62, 8,228, 73,192, 33,158, 72,193,210,148,125,
- 63,128, 0, 0, 63, 64, 75, 68,191, 40,254,161, 54, 58,221,101, 0, 0, 0, 0, 62,191,103, 10, 62,217,202,178, 63, 82,255, 4,
- 0, 0, 0, 0,191, 11, 73, 20,191, 30,125, 78, 63, 16,248,219, 0, 0, 0, 0,193, 87,166, 3,193,114, 36, 19, 65,135,230,213,
- 63,128, 0, 0, 63,178,226,132, 62,209, 88, 18, 63, 11, 74,121, 63, 11, 73, 11,191,157, 53,169, 62,238, 53, 87, 63, 30,126,150,
- 63, 30,124,246,181, 45, 39, 38, 63,102,198,153,191, 16,250, 62,191, 16,248,193, 62,126,177, 46,192, 48,197, 31, 65,210,109,176,
- 65,210,148,125, 62,206,202,119,190,181,145,194,185, 84, 1, 62,183, 73, 79,188, 62,174,236, 32, 62,199, 10,100, 63, 64,245, 33,
- 55, 52,160, 0, 68, 40, 79, 84, 68, 60,252,158,196, 84, 35, 68,194, 71,205,165,196, 40, 46, 68,196, 60,214,248, 68, 84, 1, 62,
- 66, 71,207,188, 63,238, 38, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 1, 80,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,163,215,225,
- 0, 0, 0, 0, 63, 64, 75, 54, 62,191,102,119,191, 11, 73, 11, 0, 0, 0, 0,191, 40,254,108, 62,217,202, 94,191, 30,124,246,
- 0, 0, 0, 0,180,186, 33,218, 63, 82,254,184, 63, 16,248,193, 0, 0, 0, 0, 62, 8,228, 73,192, 33,158, 72,193,210,148,125,
- 63,128, 0, 0, 63, 83,252, 84,190,223, 25,104, 62, 40, 52,115, 62,159,211,119, 65,198,183, 96, 65,198,183, 96, 0, 0, 0, 0,
- 0, 1, 0, 0, 3,160,170, 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, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 1, 0, 0,255,251, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 58,213,207,174, 60, 35,215, 10, 67,250, 0, 0,188,218, 18,228,188, 23,180, 37,189, 22,146,163,190,122, 51,174,192, 58,244, 29,
- 54,224, 0, 0, 63, 88,146, 56, 64, 71, 37,198, 0, 20, 0, 0, 0, 7, 0,115, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,255,255,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 3, 4, 0, 12, 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, 24, 24, 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, 68, 65, 84, 65,
- 0, 0, 0,220, 8,193,106,208, 0, 0, 0,147, 0, 0, 0, 1, 8,193,107,224, 3,160,150, 32, 0, 0, 0, 4, 0, 0, 0, 0,
- 8,193, 90,208, 0, 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, 4,
- 0, 0, 0, 0, 68,160, 0, 0,196, 46, 0, 0, 67,100, 0, 0, 55,136,197,197, 68, 78,209,118,195,231,222, 40, 67, 25,158,172,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 66, 40, 0, 0, 69, 0, 0, 0, 67,225, 0, 0,
- 63, 0, 0, 0, 63,154,225, 72, 0, 0, 0, 1, 0, 1, 0, 1, 3,233, 2,235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1,150, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 88, 8,193,107,224, 0, 0, 0,146, 0, 0, 0, 1,
- 8,193,109, 96, 8,193,106,208, 0, 0, 0, 2, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0, 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,122, 0, 0,189,204,204,205, 63,140,204,205, 63,128, 0, 0,
- 67,122, 0, 0,192,160, 0, 0, 64,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2,235, 0, 0, 0, 16,
- 0, 0, 3,168, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 16, 0, 0, 2,235, 60, 35,215, 10,
- 60, 35,215, 10, 70,106, 96, 0, 68,122, 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, 0, 0, 0, 3,161, 14, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,122, 0, 0,189,204,204,205, 63,140,204,205, 68, 65, 84, 65, 0, 0, 0,128,
- 8,193,109, 96, 0, 0, 0,153, 0, 0, 0, 1, 8,193,110, 16, 8,193,107,224, 0, 0, 0, 9, 63, 51, 51, 51, 8,193, 90,208,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193,195,192, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,204,204,205, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,225, 0, 0, 2,227, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,207,
- 0, 0, 2,227, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,110, 16, 0, 0, 0,150, 0, 0, 0, 1,
- 8,193,111, 64, 8,193,109, 96, 0, 0, 0, 3, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,190, 0, 0,
-181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124,195,190, 0, 0,195,190, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1,108, 1,124, 0, 0, 0, 0, 0, 0, 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,142, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,176, 8,193,111, 64, 0, 0, 0,235, 0, 0, 0, 1, 8,193,112, 32,
- 8,193,110, 16, 0, 0, 0, 11, 63, 51, 51, 51, 8,193, 90,208,192,128, 0, 0, 67,122, 0, 0,192,128, 0, 0, 67,127, 0, 0,
-192,128, 0, 0, 66, 72, 0, 0,192,128, 0, 0, 67,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 16, 0, 0, 1,124,
- 63,128, 0, 0, 67,129,128, 0, 70,250, 0, 0, 67,129,128, 0, 61,204,204,205, 65, 32, 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, 68, 65, 84, 65, 0, 0, 0,180, 8,193,112, 32, 0, 0, 0,152, 0, 0, 0, 1,
- 8,193,113, 0, 8,193,111, 64, 0, 0, 0, 13, 63, 51, 51, 51, 8,193, 90,208, 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,128, 0, 0, 68,122, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,192,160, 0, 0,
- 66,130, 0, 0, 0, 0, 0, 0, 67,182, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0,196,
- 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0,
- 0, 0, 0, 0, 68,122, 0, 0, 68,122, 0, 0, 61,204,204,205, 66, 72, 0, 0, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0,192, 8,193,113, 0,
- 0, 0, 0,245, 0, 0, 0, 1, 8,193,113,240, 8,193,112, 32, 0, 0, 0, 12, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,196,122, 0, 0, 0, 0, 0, 0,191, 0, 0, 0,
- 66, 2, 0, 0,194,150, 0, 0, 64,160, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0,128,
- 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 2, 14, 0, 0, 0, 0,
- 0, 0, 0, 0, 70,250, 0, 0, 68,122, 0, 0, 60, 35,215, 10, 66, 72, 0, 0, 0, 10, 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, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1,200, 8,193,113,240, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0, 0,
- 8,193,113, 0, 0, 0, 0, 5, 63, 51, 51, 51, 8,193, 90,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 86, 83, 97,118,101, 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0,114, 47,114,101,108,101, 97,115,101, 47,100, 97,
-116, 97,102,105,108,101,115, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,101,118,105,101,119, 46, 98,108,101,110,100, 0, 0, 0,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 8, 0, 46, 0, 0, 0, 0, 1, 85, 0, 1, 0, 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, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,204, 8,193,115,224, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0, 0, 8,193, 90,208,
- 2, 78, 9, 80, 8,192,223, 80, 8,192,224,144, 8,192,224, 80, 0, 0, 0, 0, 63, 24, 70,104, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,200,150, 82, 0, 0, 0, 0, 0, 0, 0, 0,188,182, 67, 15,187,253,148,153,191,132, 86,200,
-191,128, 0, 0,128, 0, 0, 0,128, 0, 0, 0,192, 2, 43,100,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,235, 0, 0, 0, 0,
- 0, 0, 3, 5, 0, 0, 0, 0, 0, 0, 1,235, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 1,235, 0, 0, 0, 27,
- 0, 0, 3, 5, 0, 11, 0, 10, 0, 1, 1, 1, 1,236, 2,235, 1, 0, 1, 0, 2, 86, 0, 88, 0, 7, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160,154, 32, 8,193,140, 16, 8,192, 68, 32, 8,192, 68, 32, 8,193,116,224,
- 8,193,130,176, 68, 65, 84, 65, 0, 0, 0,228, 8,193,116,224, 0, 0, 0,168, 0, 0, 0, 1, 8,193,117,240, 0, 0, 0, 0,
- 84,114, 97,110,115,102,111,114,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,
- 73,112,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 33, 0,167, 1, 62, 0,204, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193,117,240, 0, 0, 0,168, 0, 0, 0, 1, 8,193,119, 0, 8,193,116,224, 79,117,116,112,117,116, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+248, 34,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,216, 33,179, 3, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196,
+ 0, 0,100, 67,197,197,136, 55,118,209, 78, 68, 40,222,231,195,172,158, 25, 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, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,235, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,
+111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,232, 0, 0, 0,
+ 24, 36,179, 3,151, 0, 0, 0, 1, 0, 0, 0,144, 40,179, 3,184, 32,179, 3,216, 33,179, 3,248, 34,179, 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, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196, 0, 0,100, 67,197,197,136, 55,118,209, 78, 68, 40,222,231,195,172,158, 25, 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,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67,
+ 0, 0, 0, 63, 72,225,154, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 3,235, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,150, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 48, 37,179, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 80, 38,179, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,119, 0,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193,120, 16, 8,193,117,240, 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, 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, 2, 0, 3, 3,
+ 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0, 80, 38,179, 3,
+185, 0, 0, 0, 1, 0, 0, 0,112, 39,179, 3, 48, 37,179, 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, 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, 1, 64, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,120, 16, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193,121, 32, 8,193,119, 0, 65,110,105,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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,
+ 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, 68, 65, 84, 65,236, 0, 0, 0,112, 39,179, 3,
+185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 38,179, 3, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63,
+ 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0,
+ 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 0, 0, 0, 0, 0, 0, 0, 0,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, 33, 2, 0, 0,111, 3, 0, 0,
+ 0, 0, 0, 0, 79, 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, 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, 68, 65, 84, 65,196, 0, 0, 0,144, 40,179, 3,
+150, 0, 0, 0, 1, 0, 0, 0,200, 43,179, 3, 24, 36,179, 3, 48, 37,179, 3,112, 39,179, 3, 2, 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, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63,
+ 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0,
+ 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 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, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,136, 41,179, 3,185, 0, 0, 0, 1, 0, 0, 0,
+168, 42,179, 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, 2,128, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,121, 32, 0, 0, 0,168, 0, 0, 0, 1, 8,193,122, 48, 8,193,120, 16,
- 70,111,114,109, 97,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, 2, 0, 3, 3, 4, 0, 12, 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,
- 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, 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, 68, 65, 84, 65,236, 0, 0, 0,168, 42,179, 3,185, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,136, 41,179, 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,
- 3,192, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193,122, 48, 0, 0, 0,168, 0, 0, 0, 1, 8,193,123, 64, 8,193,121, 32, 76,105,110,107, 32, 97,110,100,
- 32, 77, 97,116,101,114,105, 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, 69,100,105,116,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, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,123, 64,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193,124, 80, 8,193,122, 48, 67, 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, 68, 65, 84, 65,124, 2, 0, 0,200, 43,179, 3,158, 0, 0, 0, 1, 0, 0, 0,
+184, 48,179, 3,144, 40,179, 3,136, 41,179, 3,168, 42,179, 3, 9, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224, 45, 96, 1, 0, 0, 0, 0, 62, 0, 0, 0, 32, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,225, 2, 0, 0,
+227, 2, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0,207, 2, 0, 0,227, 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, 69,100,105,116,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, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,124, 80, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193,125, 96, 8,193,123, 64, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,125, 96, 0, 0, 0,168, 0, 0, 0, 1, 8,193,126,112, 8,193,124, 80,
- 76, 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,
- 76, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193,126,112, 0, 0, 0,168, 0, 0, 0, 1, 8,193,127,128, 8,193,125, 96, 83,104, 97,100,111,119, 32, 97,
-110,100, 32, 83,112,111,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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,127,128,
- 0, 0, 0,168, 0, 0, 0, 1, 8,193,128,144, 8,193,126,112, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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, 68, 65, 84, 65,
+236, 0, 0, 0,120, 46,179, 3,185, 0, 0, 0, 1, 0, 0, 0,152, 47,179, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 8,193,128,144, 0, 0, 0,168, 0, 0, 0, 1,
- 8,193,129,160, 8,193,127,128, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 76, 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, 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, 68, 65, 84, 65,
+236, 0, 0, 0,152, 47,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120, 46,179, 3, 0, 0,128,192, 0, 0,122, 67,
+ 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65,
+ 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,
+184, 0, 0, 0,184, 48,179, 3,250, 0, 0, 0, 1, 0, 0, 0, 0, 53,179, 3,200, 43,179, 3,120, 46,179, 3,152, 47,179, 3,
+ 11, 0, 0, 0, 51, 51, 51, 63, 0,226,127, 3, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192,
+ 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63,
+ 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 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,236, 0, 0, 0,160, 49,179, 3,185, 0, 0, 0, 1, 0, 0, 0,192, 50,179, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193,127,128, 68, 65, 84, 65, 0, 0, 0,228, 8,193,129,160, 0, 0, 0,168, 0, 0, 0, 1, 8,193,130,176, 8,193,128,144,
- 84,114, 97,110,115,102,111,114,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,
- 86,105,101,119, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 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, 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,228, 1, 62, 0,204, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 8,193,130,176, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0, 0, 8,193,129,160, 80,114,101,118,105,101,119, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,192, 50,179, 3,185, 0, 0, 0, 1, 0, 0, 0,224, 51,179, 3,
+160, 49,179, 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, 86,105,101,119, 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, 8, 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, 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,160, 1,116, 1,152, 1, 76,
- 0, 4, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 28, 3,160,154, 32,
- 0, 0, 0,142, 0, 0, 0, 1, 8,193,131,192, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 51,160, 0, 0,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 51,162, 33,104, 0, 0, 0, 0, 60, 41,199, 78,
-191,230,129,210,193, 30,230,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,127,255,255, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 0, 1, 51,160, 0, 0, 0, 0, 0, 0,188, 41,199, 79,
-193, 30,230,226, 63,230,129,216, 63,128, 0, 0, 63, 24, 70,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,182, 67, 15,
- 59,253,148,216, 63,132, 86,200, 63,128, 0, 0,176,230,220,112, 62,200,150, 82,179,167,160, 95,179,162, 33,104, 62,104,147, 88,
-191, 32,239,249, 65, 3,190,250, 65, 30,230,225, 63,215, 48,137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 46,200, 82,
-182,129,140,216, 64, 35, 92, 69, 52,132, 68, 58, 59,166,242,192, 64,156, 64,224,191, 98,170, 80,190,251,187,175,189, 46,200, 82,
-192,129,140,216, 63,101, 74,199, 63, 2, 34, 29, 63, 24, 70,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,200,150, 82, 0, 0, 0, 0, 0, 0, 0, 0,188,182, 67, 15,187,253,148,153,191,132, 86,200,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,192, 2, 43,100,128, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 51,160, 0, 0,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 51,162, 33,104, 0, 0, 0, 0, 60, 41,199, 78,
-191,230,129,210,193, 30,230,225, 63,128, 0, 0, 63, 53, 4,244,191, 53, 4,243, 0, 0, 0, 0, 0, 0, 0, 0, 66,160,240, 16,
- 63,128, 0, 0, 0, 0, 13,255, 0, 2, 0, 0, 3,160,170, 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, 68, 65, 84, 65,236, 0, 0, 0,224, 51,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+192, 50,179, 3, 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0,
+ 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0,
+ 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68,
+ 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 1, 0, 0,255,231, 0, 0, 66, 12, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 59,223,239,235, 60, 35,215, 10, 67,250, 0, 0,188,218, 18,228,188, 23,180, 37,193, 36,172, 83,
-192, 56,152, 79,192,204,230, 29,188, 41,199, 96,193, 30,230,225, 63,230,129,216, 0, 20, 0, 0, 0, 7, 0,207, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0,255,255, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 8, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48,137,193,191, 13, 88,168, 62, 2,185, 28, 62,230,218,212, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,220, 8,193,131,192, 0, 0, 0,147, 0, 0, 0, 1, 8,193,132,208, 3,160,154, 32,
- 0, 0, 0, 4, 0, 0, 0, 0, 8,193,115,224, 0, 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, 4, 0, 0, 0, 0, 68,160, 0, 0,196, 46, 0, 0, 67,100, 0, 0, 55,136,197,197, 68, 78,209,118,
-195,231,222, 40, 67, 25,158,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 66, 40, 0, 0,
- 69, 0, 0, 0, 67,225, 0, 0, 63, 0, 0, 0, 63,154,225, 72, 0, 0, 0, 1, 0, 1, 0, 1, 3,233, 2,235, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0,255,255, 0, 0,
- 0, 0, 0, 0, 1,150, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 88, 8,193,132,208,
- 0, 0, 0,146, 0, 0, 0, 1, 8,193,134, 80, 8,193,131,192, 0, 0, 0, 2, 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0,
- 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,122, 0, 0,189,204,204,205,
- 63,140,204,205, 63,128, 0, 0, 67,122, 0, 0,192,160, 0, 0, 64,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 0, 2,235, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 16,
- 0, 0, 2,235, 60, 35,215, 10, 60, 35,215, 10, 70,106, 96, 0, 68,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0, 0, 53,179, 3,157, 0, 0, 0, 1, 0, 0, 0, 80, 57,179, 3,
+184, 48,179, 3,160, 49,179, 3,224, 51,179, 3, 13, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,122, 68, 0, 0, 0, 0, 0, 0,122, 68,
+ 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,236, 0, 0, 0,
+240, 53,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 16, 55,179, 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, 3,161, 14, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,122, 0, 0,189,204,204,205, 63,140,204,205,
- 68, 65, 84, 65, 0, 0, 0,128, 8,193,134, 80, 0, 0, 0,153, 0, 0, 0, 1, 8,193,135, 0, 8,193,132,208, 0, 0, 0, 9,
- 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193,195,192, 0, 0, 0, 0,
- 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,225, 0, 0, 2,227, 0, 0, 0, 5,
- 0, 0, 0, 17, 0, 0, 2,207, 0, 0, 2,227, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,135, 0,
- 0, 0, 0,151, 0, 0, 0, 1, 8,193,136, 48, 8,193,134, 80, 0, 0, 0, 6, 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,190,120, 0, 0,
- 63,159, 0, 0,190,242, 0, 0, 63,188,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,242, 0, 0, 0, 0,
+ 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,
+ 16, 55,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 48, 56,179, 3,240, 53,179, 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, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193,136, 48, 0, 0, 0,150,
- 0, 0, 0, 1, 8,193,137, 96, 8,193,135, 0, 0, 0, 0, 3, 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,
-195,190, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124,195,190, 0, 0,195,190, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1,108, 1,124, 0, 0, 0, 0,
- 0, 0, 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,142, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 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, 68, 65, 84, 65, 0, 0, 0,176, 8,193,137, 96, 0, 0, 0,235, 0, 0, 0, 1,
- 8,193,138, 64, 8,193,136, 48, 0, 0, 0, 11, 63, 51, 51, 51, 8,193,115,224,192,128, 0, 0, 67,122, 0, 0,192,128, 0, 0,
- 67,127, 0, 0,192,128, 0, 0, 66, 72, 0, 0,192,128, 0, 0, 67,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 16,
- 0, 0, 1,124, 63,128, 0, 0, 67,129,128, 0, 70,250, 0, 0, 67,129,128, 0, 61,204,204,205, 65, 32, 0, 0, 0, 8, 0, 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, 68, 65, 84, 65,236, 0, 0, 0,
+ 48, 56,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 55,179, 3, 0, 0,160,193, 0,128,167, 67, 0,160,134,196,
+ 0, 0, 0, 0, 0, 0,160,193, 0,128,167, 67, 0,160,134,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,180, 8,193,138, 64, 0, 0, 0,152,
- 0, 0, 0, 1, 8,193,139, 32, 8,193,137, 96, 0, 0, 0, 13, 63, 51, 51, 51, 8,193,115,224, 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,128, 0, 0, 68,122, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,
-192,160, 0, 0, 66,130, 0, 0, 0, 0, 0, 0, 67,182, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124,
- 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 1,124,
- 0, 0, 0, 0, 0, 0, 0, 0, 68,122, 0, 0, 68,122, 0, 0, 61,204,204,205, 66, 72, 0, 0, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0,192,
- 8,193,139, 32, 0, 0, 0,245, 0, 0, 0, 1, 8,193,140, 16, 8,193,138, 64, 0, 0, 0, 12, 63, 51, 51, 51, 8,193,115,224,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,196,122, 0, 0, 0, 0, 0, 0,
-191, 0, 0, 0, 66, 2, 0, 0,194,150, 0, 0, 64,160, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 2, 14,
- 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 2, 14,
- 0, 0, 0, 0, 0, 0, 0, 0, 70,250, 0, 0, 68,122, 0, 0, 60, 35,215, 10, 66, 72, 0, 0, 0, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1,200, 8,193,140, 16, 0, 0, 0,149, 0, 0, 0, 1,
- 0, 0, 0, 0, 8,193,139, 32, 0, 0, 0, 5, 63, 51, 51, 51, 8,193,115,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 83, 97,118,101, 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 47, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0,114, 47,114,101,108,101, 97,115,
-101, 47,100, 97,116, 97,102,105,108,101,115, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,101,118,105,101,119, 46, 98,108,101,110,
-100, 0, 0, 0, 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, 0, 0, 0,
- 0, 0, 0, 0, 0, 8, 0, 46, 0, 0, 0, 0, 1, 85, 0, 1, 0, 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, 0, 0, 0, 0, 0, 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, 67, 0, 0, 5,124, 3,160,158, 32, 0, 0, 0,140, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67,112,114,101,118,105,101,119, 0, 0, 99,101,110,101, 46, 48, 48, 49, 0,
- 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160,170, 32, 8,193,193,208, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,193,142, 0, 8,193,155, 32, 8,193,152,160, 64, 88,103,200, 62,117,122, 54,193, 50,105,189, 66, 7,191,212,191,103,203,252,
- 63,217, 88, 65, 65,193,235,187,191,103,204, 1,192, 73,182, 96, 66, 46,137,203,191,103,203,247, 64,209,135, 83, 0, 0, 0, 2,
- 62,214,245, 65, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193,155,112,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,193,155,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,128, 1,224, 0, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 25,
- 0,141, 2, 88, 2, 88, 0, 4, 0, 4, 0, 0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 32, 0, 0, 0, 0, 0, 64, 0, 0, 0, 5, 0, 25, 0, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,193,158,112, 8,193,158,112, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 63,128, 0, 0, 63,128, 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, 2, 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, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 76,204,205, 63, 76,204,205, 63, 76,204,205, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 0, 0, 0, 6, 0, 0, 0, 16, 63,128, 0, 0, 63,128, 0, 0,
- 2,173, 0, 95, 63,217,153,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,172, 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, 10, 0, 0, 0, 0, 0, 3, 2, 70, 45, 16,
- 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,156,208, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,142, 0, 0, 0, 0,123, 0, 0, 0, 1, 8,193,142, 80, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0,
- 1,183, 0,208, 3,161, 2, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,142, 80, 0, 0, 0,123, 0, 0, 0, 1, 8,193,142,160,
- 8,193,142, 0, 0, 0, 0, 33, 0, 0, 0, 2, 0, 0, 0, 0, 1,183, 0,208, 3,160,254, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,142,160, 0, 0, 0,123, 0, 0, 0, 1, 8,193,142,240, 8,193,142, 80, 0, 0, 0, 33, 0, 0, 0, 3, 0, 0, 0, 0,
- 46,224, 1, 43, 3,160,250, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,142,240, 0, 0, 0,123, 0, 0, 0, 1, 8,193,143, 64,
- 8,193,142,160, 0, 0, 0, 33, 0, 0, 0, 4, 0, 0, 0, 0, 46,224, 1, 43, 3,160,246, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,143, 64, 0, 0, 0,123, 0, 0, 0, 1, 8,193,143,144, 8,193,142,240, 0, 0, 0, 33, 0, 0, 0, 5, 0, 0, 0, 0,
- 46,224, 2, 66, 3,160,242, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,143,144, 0, 0, 0,123, 0, 0, 0, 1, 8,193,143,224,
- 8,193,143, 64, 0, 0, 0, 33, 0, 0, 0, 6, 0, 0, 0, 0, 46,224, 2, 66, 3,160,238, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,143,224, 0, 0, 0,123, 0, 0, 0, 1, 8,193,144, 48, 8,193,143,144, 0, 0, 0, 33, 0, 0, 0, 7, 0, 0, 0, 0,
- 1,153, 1, 33, 3,160,234, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,144, 48, 0, 0, 0,123, 0, 0, 0, 1, 8,193,144,128,
- 8,193,143,224, 0, 0, 0, 33, 0, 0, 0, 8, 0, 0, 0, 0, 1,153, 1, 33, 3,160,230, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,144,128, 0, 0, 0,123, 0, 0, 0, 1, 8,193,144,208, 8,193,144, 48, 0, 0, 0, 33, 0, 0, 0, 9, 0, 0, 0, 0,
- 1, 36, 1, 92, 3,160,226, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,144,208, 0, 0, 0,123, 0, 0, 0, 1, 8,193,145, 32,
- 8,193,144,128, 0, 0, 0, 33, 0, 0, 0, 10, 0, 0, 0, 0, 1, 36, 1, 92, 3,160,222, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,145, 32, 0, 0, 0,123, 0, 0, 0, 1, 8,193,145,112, 8,193,144,208, 0, 0, 0, 33, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 57, 1,210, 3,160,218, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,145,112, 0, 0, 0,123, 0, 0, 0, 1, 8,193,145,192,
- 8,193,145, 32, 0, 0, 0, 33, 0, 0, 0, 12, 0, 0, 0, 0, 0, 57, 1,210, 3,160,214, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,145,192, 0, 0, 0,123, 0, 0, 0, 1, 8,193,146, 16, 8,193,145,112, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 0,
- 1, 9, 2,117, 3,160,210, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,146, 16, 0, 0, 0,123, 0, 0, 0, 1, 8,193,146, 96,
- 8,193,145,192, 0, 0, 4, 14, 0, 0, 0, 2, 0, 0, 0, 0, 1, 9, 2,117, 3,160,206, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,146, 96, 0, 0, 0,123, 0, 0, 0, 1, 8,193,146,176, 8,193,146, 16, 0, 0, 4, 14, 0, 0, 0, 3, 0, 0, 0, 0,
- 1,100, 1,198, 3,160,202, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,146,176, 0, 0, 0,123, 0, 0, 0, 1, 8,193,147, 0,
- 8,193,146, 96, 0, 0, 4, 14, 0, 0, 0, 4, 0, 0, 0, 0, 1,100, 1,198, 3,160,198, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,147, 0, 0, 0, 0,123, 0, 0, 0, 1, 8,193,147, 80, 8,193,146,176, 0, 0, 4, 14, 0, 0, 0, 5, 0, 0, 0, 0,
- 0,154, 1,198, 3,160,194, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,147, 80, 0, 0, 0,123, 0, 0, 0, 1, 8,193,147,160,
- 8,193,147, 0, 0, 0, 4, 14, 0, 0, 0, 6, 0, 0, 0, 0, 0,154, 1,198, 3,160,190, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,147,160, 0, 0, 0,123, 0, 0, 0, 1, 8,193,147,240, 8,193,147, 80, 0, 0, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 1, 15, 1, 76, 3,160,170, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,147,240, 0, 0, 0,123, 0, 0, 0, 1, 8,193,148, 64,
- 8,193,147,160, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,188, 1, 90, 3,161, 78, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,148, 64, 0, 0, 0,123, 0, 0, 0, 1, 8,193,148,144, 8,193,147,240, 0, 0, 0, 33, 0, 0, 0, 13, 0, 0, 0, 0,
- 0,174, 1,151, 3,160,186, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,148,144, 0, 0, 0,123, 0, 0, 0, 1, 8,193,148,224,
- 8,193,148, 64, 0, 0, 4, 14, 0, 0, 0, 7, 0, 0, 0, 0, 0,254, 1,166, 3,160,182, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,148,224, 0, 0, 0,123, 0, 0, 0, 1, 8,193,149, 48, 8,193,148,144, 0, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 0,
- 0,217, 0,233, 3,161, 74, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,149, 48, 0, 0, 0,123, 0, 0, 0, 1, 8,193,149,128,
- 8,193,148,224, 0, 0, 0, 32, 0, 0, 0, 14, 0, 0, 16, 0, 0,116, 1, 27, 3,161, 38, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,149,128, 0, 0, 0,123, 0, 0, 0, 1, 8,193,149,208, 8,193,149, 48, 0, 0, 0, 33, 0, 0, 0, 15, 0, 0, 0, 0,
- 0,174, 1,151, 3,161, 42, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,149,208, 0, 0, 0,123, 0, 0, 0, 1, 8,193,150, 32,
- 8,193,149,128, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 20, 0, 46,224, 1, 67, 3,161, 34, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,150, 32, 0, 0, 0,123, 0, 0, 0, 1, 8,193,150,112, 8,193,149,208, 0, 0, 0, 2, 0, 0, 0, 9, 0, 0, 20, 0,
- 46,224, 1, 96, 3,161, 30, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,150,112, 0, 0, 0,123, 0, 0, 0, 1, 8,193,150,192,
- 8,193,150, 32, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 20, 0, 1,181, 1, 43, 3,161, 26, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,150,192, 0, 0, 0,123, 0, 0, 0, 1, 8,193,151, 16, 8,193,150,112, 0, 0, 0, 1, 0, 0, 0, 15, 0, 0, 20, 0,
- 0, 12, 0,160, 3,161, 22, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,151, 16, 0, 0, 0,123, 0, 0, 0, 1, 8,193,151, 96,
- 8,193,150,192, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 20, 0, 0,175, 0,161, 3,161, 18, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,151, 96, 0, 0, 0,123, 0, 0, 0, 1, 8,193,151,176, 8,193,151, 16, 0, 0, 0, 4, 0, 0, 0, 11, 0, 0, 0, 0,
- 0,123, 1, 57, 3,161, 70, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,151,176, 0, 0, 0,123, 0, 0, 0, 1, 8,193,152, 0,
- 8,193,151, 96, 0, 0, 4, 14, 0, 0, 0, 11, 0, 0, 0, 0, 0,254, 1,166, 3,160,178, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,152, 0, 0, 0, 0,123, 0, 0, 0, 1, 8,193,152, 80, 8,193,151,176, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 16, 0,
- 0,238, 1,122, 3,161, 62, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,152, 80, 0, 0, 0,123, 0, 0, 0, 1, 8,193,152,160,
- 8,193,152, 0, 0, 0, 0, 64, 0, 0, 0, 2, 0, 0, 0, 0, 0,237, 1,119, 3,161, 66, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,152,160, 0, 0, 0,123, 0, 0, 0, 1, 8,193,152,240, 8,193,152, 80, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 1,
- 0,152, 1,114, 3,161, 82, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,152,240, 0, 0, 0,123, 0, 0, 0, 1, 8,193,153, 64,
- 8,193,152,160, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0,123, 1, 65, 3,161, 58, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,153, 64, 0, 0, 0,123, 0, 0, 0, 1, 8,193,153,144, 8,193,152,240, 0, 0, 0, 1, 0, 0, 0, 17, 0, 0, 0, 0,
- 0,123, 1, 26, 3,161, 46, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,153,144, 0, 0, 0,123, 0, 0, 0, 1, 8,193,153,224,
- 8,193,153, 64, 0, 0, 4, 28, 0, 0, 0, 4, 0, 0, 20, 0, 1, 45, 1,117, 3,161, 6, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,153,224, 0, 0, 0,123, 0, 0, 0, 1, 8,193,154, 48, 8,193,153,144, 0, 0, 0, 2, 0, 0, 0, 12, 0, 0, 0, 0,
- 0,251, 1,119, 3,161, 54, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,154, 48, 0, 0, 0,123, 0, 0, 0, 1, 8,193,154,128,
- 8,193,153,224, 0, 0, 4, 28, 0, 0, 0, 5, 0, 0, 20, 0, 0,197, 1,129, 3,161, 14, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,154,128, 0, 0, 0,123, 0, 0, 0, 1, 8,193,154,208, 8,193,154, 48, 0, 0, 0, 8, 0, 0, 0, 21, 0, 0, 0, 0,
- 0,100, 1, 54, 3,161, 50, 32, 68, 65, 84, 65, 0, 0, 0, 28, 8,193,154,208, 0, 0, 0,123, 0, 0, 0, 1, 8,193,155, 32,
- 8,193,154,128, 0, 0, 4, 28, 0, 0, 0, 6, 0, 0, 20, 0, 1, 65, 1, 29, 3,161, 10, 32, 68, 65, 84, 65, 0, 0, 0, 28,
- 8,193,155, 32, 0, 0, 0,123, 0, 0, 0, 1, 0, 0, 0, 0, 8,193,154,208, 0, 0, 13,223, 0, 0, 0, 18, 0, 0, 4, 0,
- 46,224, 1, 76, 3,160,174, 32, 68, 65, 84, 65, 0, 0, 0, 40, 8,193,155,112, 0, 0, 0,122, 0, 0, 0, 1, 1, 44, 0, 0,
- 0, 1, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 1,244, 0,200, 0,100, 0, 20, 0, 0, 39, 16, 61,204,204,205, 65,240, 0, 0,
- 64, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,232, 8,193,155,192, 0, 0, 0,137, 0, 0, 0, 1, 0, 1, 0, 1, 63, 76,204,205,
- 66,180, 0, 0, 0, 9, 0, 1, 63,128, 0, 0, 58,131, 18,111, 0, 32, 0, 32, 0, 32, 0, 1, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 7, 0, 5,
- 0, 5,255,255, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50,
- 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0, 56,209,183, 23, 61,204,204,205, 0, 0, 0, 0, 0, 0, 0,250, 61,204,204,205, 61,204,204,205, 63,166,102,102,
- 63,192, 0, 0, 65,240, 0, 0, 63,122,225, 72, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 2, 67, 0, 3,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 8, 8,193,156,208, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 6, 0, 0,
- 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127, 10, 78, 61,177, 44, 36,191,127, 10, 78, 61,177, 43,213, 8,193,158, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 72, 8,193,158, 0, 0, 0, 1, 37, 0, 0, 0, 6, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 61,204,204,205,
- 63,121,188, 86, 0, 0, 0, 0, 62,153,153,154, 63, 75, 60, 96, 0, 0, 0, 0, 63, 51, 51, 51, 62, 83, 14,128, 0, 0, 0, 0,
- 63,102,102,102, 60,200,117, 79, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72,
- 8,193,158,112, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114, 76, 97,121,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, 8,193,196,160, 0, 15,255,255,
- 0, 0, 0, 0, 0, 0,127,255, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 73, 77, 0, 0, 1,128, 8,193,158,224,
- 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 73,109, 97,103,101, 46,
- 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 53, 0, 0, 0, 0, 85,110,116,105,
-116,108,101,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,134,110,108, 0, 0, 1, 0, 1, 0, 0, 1, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0, 0,132, 8,193,160,144, 0, 0, 0, 30, 0, 0, 0, 1, 8,193,161, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 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, 9, 62, 76,204,205, 66, 96,148,117, 63,128, 0, 0,
- 66,112, 0, 0, 65,240, 0, 0, 64,192, 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, 67, 65, 0, 0, 0,132, 8,193,161, 64, 0, 0, 0, 30, 0, 0, 0, 1, 0, 0, 0, 0, 8,193,160,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 65,116,109,111, 0, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 62, 76,204,205, 66, 68,137,145, 63,128, 0, 0, 66,112, 69,210, 66, 12, 0, 0,
- 64,234, 14,161, 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, 76, 65, 0, 0, 1,128,
- 8,193,161,240, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,165, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,
-109,112, 46, 48, 48, 49, 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, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 65,160, 0, 0, 66, 52, 0, 0, 62, 25,153,154, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 8,193,163,160, 0, 1, 0, 0, 63, 0, 0, 0, 66, 32, 0, 0, 66, 52, 0, 0, 63,128, 0, 0,
- 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 65, 32, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,193,165, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,163,160, 0, 0, 1, 39, 0, 0, 0, 1,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,
-191, 53, 4,242, 63, 53, 4,243, 8,193,164,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,164,208, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32, 8,193,165, 16,
- 0, 0, 0, 19, 0, 0, 0, 1, 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, 76, 65, 0, 0, 1,128, 8,193,165, 96, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,168,208,
- 8,193,161,240, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 46, 48, 48, 50, 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, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 65,160, 0, 0, 66,143,152,182, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 8,193,167, 16, 0, 1, 0, 0,
- 63, 0, 0, 0, 66, 32, 0, 0, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1,
- 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,
+111, 3, 0, 0, 0, 0, 0, 0, 79, 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, 68, 65, 84, 65,216, 0, 0, 0,
+ 80, 57,179, 3, 4, 1, 0, 0, 1, 0, 0, 0,216, 62,179, 3, 0, 53,179, 3,240, 53,179, 3, 48, 56,179, 3, 12, 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, 0,191, 0, 0, 2, 66, 0, 0,122,196,
+ 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
+ 14, 2, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,
+ 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68, 10,215, 35, 60, 0, 0, 72, 66, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 88, 58,179, 3,185, 0, 0, 0, 1, 0, 0, 0,120, 59,179, 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, 8,193,168,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 8, 8,193,167, 16, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,168, 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, 2, 0, 3, 3, 4, 0, 12, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,120, 59,179, 3,185, 0, 0, 0, 1, 0, 0, 0,152, 60,179, 3, 88, 58,179, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,193,168, 64, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32, 8,193,168,128, 0, 0, 0, 19, 0, 0, 0, 1, 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, 76, 65, 0, 0, 1,128,
- 8,193,168,208, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,171,240, 8,193,165, 96, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,
-111,116, 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, 16, 8, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12,204,205, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 8,193,170,128, 0, 4, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0,
- 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193,170,128, 0, 0, 1, 39, 0, 0, 0, 1,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,
-191, 53, 4,242, 63, 53, 4,243, 8,193,171,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 68, 65, 84, 65,236, 0, 0, 0,152, 60,179, 3,185, 0, 0, 0, 1, 0, 0, 0,184, 61,179, 3,120, 59,179, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,171,176, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 1,128, 8,193,171,240,
- 0, 0, 0, 40, 0, 0, 0, 1, 8,193,175, 16, 8,193,168,208, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48,
- 48, 49, 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, 16, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,102,102,102, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 8,193,173,160, 0, 1, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0,
- 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193,173,160, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242,
- 63, 53, 4,243, 8,193,174,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,184, 61,179, 3,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152, 60,179, 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, 18, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 33, 2, 0, 0,111, 3, 0, 0, 0, 0, 0, 0, 79, 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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,174,208, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 1,128, 8,193,175, 16, 0, 0, 0, 40,
- 0, 0, 0, 1, 8,193,178, 48, 8,193,171,240, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 51, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 63, 27,182,200, 63,128, 0, 0,
- 8,193,176,192, 0, 1, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3,
- 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,216, 62,179, 3,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 57,179, 3,
+ 88, 58,179, 3,184, 61,179, 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, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,220, 4, 0, 0,160, 63,179, 3,143, 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,112,114,101,118,105,101,119, 0, 0, 99,101,110,101, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,119,179, 3, 24,112,179, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72, 93,178, 3,144, 80,179, 3,240, 74,179, 3, 0, 0, 0, 0,167,253,243, 64,112,165, 81, 63,
+136, 56, 93, 65,113, 36,122, 61,157, 24,186,192, 28, 38, 71, 64,113, 36,122, 61,157, 24,186,192, 28, 38, 71, 64,113, 36,122, 61,
+157, 24,186,192, 28, 38, 71, 64, 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,224, 80,179, 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,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 1, 0, 0, 0, 20, 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, 0, 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, 0, 0, 1, 0, 0, 0, 0, 0, 25, 0,141, 0, 88, 2, 88, 2, 4, 0, 4, 0, 0, 0, 24, 0, 4, 0, 0, 0, 0, 0,
+ 90, 0, 1, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 5, 0, 25, 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, 0, 0, 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,203,159, 3,120,203,159, 3, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 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, 5, 0, 2, 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, 0, 0, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,176,192, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243,
- 8,193,177,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 8,193,177,240, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 1,128, 8,193,178, 48, 0, 0, 0, 40, 0, 0, 0, 1,
- 8,193,181, 80, 8,193,175, 16, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 52, 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, 16, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,204,204,205, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 63, 27,182,200, 63,128, 0, 0, 8,193,179,224,
- 0, 1, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0,
- 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 92, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193,179,224, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1,
- 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,181, 16,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 8,193,181, 16, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 1,128, 8,193,181, 80, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,184,112,
- 8,193,178, 48, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 53, 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, 16, 8, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83, 78, 80,
- 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 8,193,183, 0, 0, 4, 0, 0,
- 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1,
- 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 6, 0, 0, 0,
+ 16, 0, 0, 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, 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 8, 8,193,183, 0, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,184, 48, 0, 0, 0, 0,
+ 96,103, 75, 1, 1, 0, 0, 0, 1, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 28, 0, 0, 0, 72, 93,178, 3,125, 0, 0, 0, 1, 0, 0, 0,176, 68,179, 3, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,183, 1,208, 0, 80,203,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,176, 68,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 0, 69,179, 3, 72, 93,178, 3, 33, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,183, 1,208, 0, 80,199,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 0, 69,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 80, 69,179, 3,176, 68,179, 3, 33, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0,224, 46, 43, 1, 80,195,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 80, 69,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+160, 69,179, 3, 0, 69,179, 3, 33, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,224, 46, 43, 1, 80,191,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,160, 69,179, 3,125, 0, 0, 0, 1, 0, 0, 0,240, 69,179, 3, 80, 69,179, 3, 33, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0,224, 46, 66, 2, 80,187,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,240, 69,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 64, 70,179, 3,160, 69,179, 3, 33, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,224, 46, 66, 2, 80,183,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 64, 70,179, 3,125, 0, 0, 0, 1, 0, 0, 0,144, 70,179, 3,240, 69,179, 3, 33, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0,153, 1, 33, 1, 80,179,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,144, 70,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+224, 70,179, 3, 64, 70,179, 3, 33, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,153, 1, 33, 1, 80,175,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,224, 70,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 48, 71,179, 3,144, 70,179, 3, 33, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 36, 1, 92, 1, 80,171,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 48, 71,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+128, 71,179, 3,224, 70,179, 3, 33, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 36, 1, 92, 1, 80,167,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,128, 71,179, 3,125, 0, 0, 0, 1, 0, 0, 0,208, 71,179, 3, 48, 71,179, 3, 33, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 57, 0,210, 1, 80,163,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,208, 71,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 32, 72,179, 3,128, 71,179, 3, 33, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 57, 0,210, 1, 80,159,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 32, 72,179, 3,125, 0, 0, 0, 1, 0, 0, 0,112, 72,179, 3,208, 71,179, 3, 14, 4, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 84, 1,240, 1,136,155,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,112, 72,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+192, 72,179, 3, 32, 72,179, 3, 14, 4, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 84, 1,240, 1,248,151,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,192, 72,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 16, 73,179, 3,112, 72,179, 3, 14, 4, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0,118, 1,235, 1,104,148,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 16, 73,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 96, 73,179, 3,192, 72,179, 3, 14, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,118, 1,235, 1,216,144,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 96, 73,179, 3,125, 0, 0, 0, 1, 0, 0, 0,176, 73,179, 3, 16, 73,179, 3, 14, 4, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 97, 1, 3, 2, 72,141,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,176, 73,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 0, 74,179, 3, 96, 73,179, 3, 14, 4, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 97, 1, 3, 2,184,137,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 0, 74,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 80, 74,179, 3,176, 73,179, 3, 0, 8, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 15, 1, 76, 1,232,119,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 80, 74,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+160, 74,179, 3, 0, 74,179, 3, 0, 8, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,188, 0, 90, 1, 8, 57,181, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,160, 74,179, 3,125, 0, 0, 0, 1, 0, 0, 0,240, 74,179, 3, 80, 74,179, 3, 33, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 0, 0,174, 0,151, 1, 40,134,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,240, 74,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 64, 75,179, 3,160, 74,179, 3, 14, 4, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0,129, 1,255, 1,152,130,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 64, 75,179, 3,125, 0, 0, 0, 1, 0, 0, 0,144, 75,179, 3,240, 74,179, 3, 0, 4, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0,217, 0,233, 0,184, 4,180, 3, 68, 65, 84, 65, 28, 0, 0, 0,144, 75,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+224, 75,179, 3, 64, 75,179, 3, 32, 0, 0, 0, 14, 0, 0, 0, 0, 16, 0, 0,116, 0, 27, 1, 32,225,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,224, 75,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 48, 76,179, 3,144, 75,179, 3, 33, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0,174, 0,151, 1,176,228,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 48, 76,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+128, 76,179, 3,224, 75,179, 3, 1, 0, 0, 0, 15, 0, 0, 0, 0, 20, 0, 0, 12, 0,160, 0,144,221,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,128, 76,179, 3,125, 0, 0, 0, 1, 0, 0, 0,208, 76,179, 3, 48, 76,179, 3, 1, 0, 0, 0, 16, 0, 0, 0,
+ 0, 20, 0, 0,175, 0,161, 0, 0,218,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,208, 76,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 32, 77,179, 3,128, 76,179, 3, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,163, 1,254, 1,184, 0,180, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 32, 77,179, 3,125, 0, 0, 0, 1, 0, 0, 0,112, 77,179, 3,208, 76,179, 3, 14, 4, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0,129, 1,255, 1, 8,127,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,112, 77,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+192, 77,179, 3, 32, 77,179, 3, 64, 0, 0, 0, 1, 0, 0, 0, 0, 16, 0, 0,238, 0,122, 1, 40,249,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,192, 77,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 16, 78,179, 3,112, 77,179, 3, 64, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0,237, 0,119, 1,184,252,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 16, 78,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 96, 78,179, 3,192, 77,179, 3, 32, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,152, 0,114, 1,152, 60,181, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 96, 78,179, 3,125, 0, 0, 0, 1, 0, 0, 0,176, 78,179, 3, 16, 78,179, 3, 16, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 22, 1,185, 1, 40,245,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,176, 78,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 0, 79,179, 3, 96, 78,179, 3, 1, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,123, 0, 26, 1,176,232,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 0, 79,179, 3,125, 0, 0, 0, 1, 0, 0, 0, 80, 79,179, 3,176, 78,179, 3, 30, 4, 0, 0, 9, 0, 0, 0,
+ 0, 20, 0, 0,109, 2, 57, 1, 80,207,179, 3, 68, 65, 84, 65, 28, 0, 0, 0, 80, 79,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+160, 79,179, 3, 0, 79,179, 3, 2, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,205, 1, 11, 2, 40,241,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0,160, 79,179, 3,125, 0, 0, 0, 1, 0, 0, 0,240, 79,179, 3, 80, 79,179, 3, 30, 4, 0, 0, 11, 0, 0, 0,
+ 0, 20, 0, 0,230, 0, 99, 2,112,214,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,240, 79,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 64, 80,179, 3,160, 79,179, 3, 8, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 1,185, 1,176,236,179, 3, 68, 65, 84, 65,
+ 28, 0, 0, 0, 64, 80,179, 3,125, 0, 0, 0, 1, 0, 0, 0,144, 80,179, 3,240, 79,179, 3, 30, 4, 0, 0, 12, 0, 0, 0,
+ 0, 20, 0, 0,252, 0,171, 1,224,210,179, 3, 68, 65, 84, 65, 28, 0, 0, 0,144, 80,179, 3,125, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 64, 80,179, 3,223, 13, 0, 0, 13, 0, 0, 0, 0, 4, 0, 0, 75, 1,221, 1,120,123,179, 3, 68, 65, 84, 65,
+ 36, 1, 0, 0,224, 80,179, 3,141, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 50, 0,
+ 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0,
+ 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,183,209, 56,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, 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, 68, 65, 84, 65, 72, 0, 0, 0,120,203,159, 3,
+130, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114, 76, 97,121,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,168,141,156, 3,255,255, 15, 0, 0, 0, 0, 0,
+255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 73, 77, 0, 0,128, 1, 0, 0, 56, 82,179, 3, 32, 0, 0, 0,
+ 1, 0, 0, 0,232, 83,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 73,109, 97,103,101, 46, 48, 48, 49, 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, 85,110,116,105,116,108,101,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,193,184, 48, 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 76, 65, 0, 0, 1,128, 8,193,184,112, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,187,144, 8,193,181, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 54, 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, 2, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,179, 51, 51, 65,239,255,247,
- 66, 72, 0, 0, 63, 8,156,171, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 8,193,186, 32, 0, 4, 0, 0, 65, 68,207, 78,
- 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 1, 8,
- 8,193,186, 32, 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,187, 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, 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, 0, 0, 0, 0,108,110,134, 68, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 73, 77, 0, 0,128, 1, 0, 0,232, 83,179, 3, 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 82,179, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 82,101,110,100,101,114, 32, 82,101,115,117,108,116, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 5, 0, 4, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0,116, 41, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 67, 65, 0, 0,136, 0, 0, 0,
+152, 85,179, 3, 30, 0, 0, 0, 1, 0, 0, 0, 80, 86,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,
+109,101,114, 97, 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, 9, 0,205,204, 76, 62,117,148, 96, 66, 0, 0,128, 63, 0, 0,112, 66, 0, 0,240, 65, 0, 0,192, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,136, 0, 0, 0, 80, 86,179, 3,
+ 30, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152, 85,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97,
+ 65,116,109,111, 0, 0, 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,
+ 0, 0, 13, 0,205,204, 76, 62,145,137, 68, 66, 0, 0,128, 63,210, 69,112, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,132, 1, 0, 0, 8, 87,179, 3, 40, 0, 0, 0,
+ 1, 0, 0, 0, 72, 90,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 46, 48, 48, 49, 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, 1, 0, 0, 0,
+ 1, 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,128, 63, 0, 0,160, 65, 0, 0, 52, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63,192, 88,179, 3, 1, 0, 0, 0, 0, 0, 0, 63, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,
+ 0, 2, 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, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 32, 65,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 89,179, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,192, 88,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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, 80,160,153, 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, 24, 0, 0, 0, 80,160,153, 3, 53, 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,248, 89,179, 3, 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, 76, 65, 0, 0,132, 1, 0, 0, 72, 90,179, 3, 40, 0, 0, 0, 1, 0, 0, 0,136, 93,179, 3, 8, 87,179, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 46, 48, 48, 50, 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, 2, 0, 0, 0, 1, 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,128, 63,
+ 0, 0,160, 65,182,152,143, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 92,179, 3, 1, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 93,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 1, 0, 0, 0, 92,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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,152, 93,155, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,187, 80,
- 0, 0, 1, 37, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 76, 65, 0, 0, 1,128, 8,193,187,144, 0, 0, 0, 40, 0, 0, 0, 1, 8,193,190,176, 8,193,184,112, 0, 0, 0, 0,
- 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 55, 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, 16, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 65,239,255,247, 66,150, 0, 0,
- 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 8,193,189, 64, 0, 1, 0, 0, 63,128, 26, 46, 65,240, 4, 25,
- 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+152, 93,155, 3, 53, 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, 56, 93,179, 3, 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, 76, 65, 0, 0,132, 1, 0, 0,
+136, 93,179, 3, 40, 0, 0, 0, 1, 0, 0, 0,200, 96,179, 3, 72, 90,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,
+111,116, 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, 8, 16, 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,128, 63, 0, 0,128, 63, 64, 95,179, 3, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66,
+ 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 96,179, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 64, 95,179, 3, 55, 1, 0, 0,
+ 1, 0, 0, 0, 1, 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,136,164,154, 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, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,189, 64,
- 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
-191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,190,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, 0, 0, 0, 0, 0, 0, 0, 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,136,164,154, 3, 53, 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,
+120, 96,179, 3, 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, 76, 65, 0, 0,132, 1, 0, 0,200, 96,179, 3, 40, 0, 0, 0, 1, 0, 0, 0,
+ 8,100,179, 3,136, 93,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 49, 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, 16, 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,
+128, 98,179, 3, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0,
+ 1, 0, 0, 0, 0, 0, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,190,112, 0, 0, 1, 37,
- 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65,
- 0, 0, 1,128, 8,193,190,176, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 0, 8,193,187,144, 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, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,192, 0, 0, 65,160, 0, 0, 66, 52, 0, 0, 62, 25,153,154,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 8,193,192, 96, 0, 1, 0, 0, 63, 0, 0, 0, 66, 32, 0, 0, 66, 52, 0, 0,
- 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 99,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,128, 98,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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,
+ 32,253,157, 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, 68, 65, 84, 65, 0, 0, 1, 8, 8,193,192, 96, 0, 0, 1, 39,
- 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243,
- 63, 53, 4,242,191, 53, 4,242, 63, 53, 4,243, 8,193,193,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 32,253,157, 3, 53, 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,184, 99,179, 3, 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,
+ 76, 65, 0, 0,132, 1, 0, 0, 8,100,179, 3, 40, 0, 0, 0, 1, 0, 0, 0,248,102,179, 3,200, 96,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 51, 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,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,200,182, 27, 63, 0, 0,128, 63,192,101,179, 3, 1, 0, 0, 0, 46, 26,128, 63,
+ 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,193,144, 0, 0, 1, 37, 0, 0, 0, 2,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0, 1,108,
- 8,193,193,208, 0, 0, 0,121, 0, 0, 0, 1, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 79, 47,141, 62,209, 19, 64, 63, 14, 23, 73, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 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,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 28,204,205, 0, 0, 0, 0, 0, 1, 0, 32, 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, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 65,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 32, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 76,204,205, 0, 0, 0, 5, 0, 0, 0, 0, 59,163,215, 10, 0, 0, 0, 0,
- 62,128, 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, 8,193,195,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32,
- 8,193,195,112, 0, 0, 0, 19, 0, 0, 0, 1, 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, 84, 88, 0, 0, 0,120, 8,193,195,192, 0, 0, 0, 28, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 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, 7, 0, 0, 0, 1,
- 8,193,196, 96, 8,193,196, 96, 8,193,196, 96, 8,193,196, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3,160,164, 32,255,255,255,255, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,193,196, 96, 0, 0, 0, 26, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 77,244, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 70, 82, 69, 69, 68, 65, 84, 65, 0, 0, 0, 4, 2, 77,244, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 71, 82,
- 0, 0, 0, 76, 8,193,196,160, 0, 0, 0,237, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 71, 82, 79,118,101,114,114,105,100,101, 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, 8,193,197, 32, 8,193,199, 96, 0, 15,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 8,193,197, 32, 0, 0, 0,236, 0, 0, 0, 1, 8,193,197, 96, 0, 0, 0, 0, 3,161, 38, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,197, 96, 0, 0, 0,236, 0, 0, 0, 1, 8,193,197,160,
- 8,193,197, 32, 3,161, 34, 32, 3,163,234, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,197,160,
- 0, 0, 0,236, 0, 0, 0, 1, 8,193,197,224, 8,193,197, 96, 3,161, 30, 32, 3,163,238, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 8,193,197,224, 0, 0, 0,236, 0, 0, 0, 1, 8,193,198, 32, 8,193,197,160, 3,161, 26, 32,
- 3,163,242, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,198, 32, 0, 0, 0,236, 0, 0, 0, 1,
- 8,193,198, 96, 8,193,197,224, 3,161, 22, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 8,193,198, 96, 0, 0, 0,236, 0, 0, 0, 1, 8,193,198,160, 8,193,198, 32, 3,161, 18, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,198,160, 0, 0, 0,236, 0, 0, 0, 1, 8,193,198,224, 8,193,198, 96,
- 3,161, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,198,224, 0, 0, 0,236,
- 0, 0, 0, 1, 8,193,199, 32, 8,193,198,160, 3,161, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 8,193,199, 32, 0, 0, 0,236, 0, 0, 0, 1, 8,193,199, 96, 8,193,198,224, 3,161, 14, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 8,193,199, 96, 0, 0, 0,236, 0, 0, 0, 1, 0, 0, 0, 0,
- 8,193,199, 32, 3,161, 10, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,170, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,160,174, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,193,160,144, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,188, 41,199, 78,193, 30,230,225, 63,230,129,216, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,201, 15,218,128, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,162, 33,105, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0,188, 41,199, 78,193, 30,230,225, 63,230,129,216, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 48,136, 90, 64, 0, 0, 0, 0, 0, 0, 0, 0,
-168, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 63,128, 0, 0, 40, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,
-176,136, 90, 64, 63,128, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 63,128, 0, 0, 0, 0, 8, 0,
- 0, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80,
- 3,160,174, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,178, 32, 3,160,170, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,
-109,101,114, 97, 65,116,109,111, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 1, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,193,161, 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,188, 41,199, 78,193, 30,230,225, 63,230,129,216, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,244, 47,173, 37,113,155,162, 37,170, 80, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 37,170, 80, 40,165,113,155,162, 0, 0, 0, 0, 37,170, 80, 39,190,169, 64,157, 63,113,155,163, 0, 0, 0, 0,
- 37,113,155,165,191,113,155,163,190,169, 64,157, 0, 0, 0, 0,188, 41,199, 78,193, 30,230,225, 63,230,129,216, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0,154, 30,205,143, 25, 88, 25,122, 0, 0, 0, 0, 37,171, 76,175, 63,128, 0, 1, 51,124,134,212, 0, 0, 0, 0,
- 45,255,255,135, 50, 31,154, 19, 63,128, 0, 0, 0, 0, 0, 0, 48,128, 0, 0, 53,128, 0, 1, 52,128, 0, 2, 63,128, 0, 0,
- 63,128, 0, 0, 37,170, 80, 39, 37,113,155,166,128, 0, 0, 0,165,113,155,162, 63,113,155,164,190,169, 64,158,128, 0, 0, 0,
-165,170, 80, 40, 62,169, 64,159, 63,113,155,162,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 13,223, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 63, 16,225,187, 63,128, 0, 0,
- 62,204,204,205, 63, 80, 32,210, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 2, 0, 0, 0,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66,
- 0, 0, 3, 80, 3,160,178, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,182, 32, 3,160,174, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 49, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 77,243, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,119,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 75,234,112, 61,122, 36,113,192,186, 24,157, 64, 71, 38, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 61,122, 36,113,192,186, 24,157, 64, 71, 38, 28,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,
-128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64,
- 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169,
- 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 71,141, 96,
- 2, 71,150, 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,
- 68, 65, 84, 65, 0, 0, 0, 4, 2, 75,234,112, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80,
- 3,160,182, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,186, 32, 3,160,178, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,
-101, 99,107,101,114,115, 46, 48, 48, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 76, 22,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,113,208,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 77,237,160, 61,122, 36,113,192,186, 24,157, 64, 71, 38, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 61,122, 36,113,192,186, 24,157, 64, 71, 38, 28, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,128, 0, 0, 0,
-189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0,
- 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0,
- 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 0, 1, 64, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 71,127,224, 2, 71,134,160,
- 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, 68, 65, 84, 65,
- 0, 0, 0, 4, 2, 77,237,160, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,186, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,160,190, 32, 3,160,182, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,
-114,115, 46, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,125,176, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 77,235, 16, 60,102,131, 0, 64,164,112, 14, 63,229,211, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,
-180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0, 60,102,131, 0, 64,164,112, 14, 63,229,211, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-165,143,118,252, 0, 0, 0, 0, 0, 0, 0, 0,165,168,193,176, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,155, 40,193,176, 53, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231,
- 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,
-189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33,
- 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 1, 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, 0, 0, 4,
- 2, 77,235, 16, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,190, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,160,194, 32, 3,160,186, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
- 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 70,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,154,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 71, 42, 32,191,207, 84, 38,192,239,225, 0, 64, 70,169, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,128, 0, 0, 0, 63,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,162, 33,105, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,191,207, 84, 38,192,239,225, 0, 64, 70,169, 15, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 51,162, 33,105,
- 0, 0, 0, 0, 0, 0, 0, 0,176,136, 90, 64, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,180, 0, 0, 0,181, 0, 0, 0, 52,128, 0, 0, 63,128, 0, 0, 61,243,183,207,189,243,183,205,
- 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,128, 0, 0, 0,189,243,183,205,189,243,183,207,
- 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1,
- 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 71,114, 96, 2, 71,121, 32, 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, 68, 65, 84, 65, 0, 0, 0, 4, 2, 71, 42, 32,
- 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,194, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,160,198, 32, 3,160,190, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 53, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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,
- 2, 70,134,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,160,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 77, 39,144,
-191,207, 84, 38,192,239,225, 0, 64, 70,169, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 0, 0, 0, 63,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,162, 33,105, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,191,207, 84, 38,192,239,225, 0, 64, 70,169, 15, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0,
- 0, 0, 0, 0,176,136, 90, 64, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,180, 0, 0, 0,181, 0, 0, 0, 52,128, 0, 0, 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,
-128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,
-128, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68,
- 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74, 90,192, 2, 74, 99, 96, 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, 68, 65, 84, 65, 0, 0, 0, 4, 2, 77, 39,144, 0, 0, 0, 0,
- 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,198, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,202, 32,
- 3,160,194, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 54, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 4, 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, 2, 76, 61,240,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,166,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, 2, 76,223,192, 63,223, 0, 93,
-192,239,220,205, 64, 70,170,222, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
-191,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,162, 33,105,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,223, 0, 93,192,239,220,205, 64, 70,170,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,179,162, 33,105,167, 34, 33,105, 0, 0, 0, 0,
- 48,136, 90, 64, 63,128, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 52, 0, 0, 0,181, 0, 0, 0, 53, 0, 0, 0, 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0,
- 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,
-190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2,
- 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
-201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74, 73,128, 2, 74, 82, 32, 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, 68, 65, 84, 65, 0, 0, 0, 4, 2, 76,223,192, 0, 0, 0, 0, 0, 0, 0, 1,
- 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,202, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,206, 32, 3,160,198, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 2, 70,222,240, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,194,172, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70,145,240, 63,223, 0, 93,192,239,220,205,
- 64, 70,170,222, 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,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,191,201, 15,218,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,162, 33,105,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 51,162, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,223, 0, 93,
-192,239,220,205, 64, 70,170,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,179,162, 33,105,167, 34, 33,105, 0, 0, 0, 0, 48,136, 90, 64,
- 63,128, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
-181, 0, 0, 0, 53, 0, 0, 0, 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29,
- 50, 26, 90, 31, 62, 44, 85,173,128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,
-190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56,
- 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74, 60, 0, 2, 74, 66,192, 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, 68, 65, 84, 65, 0, 0, 0, 4, 2, 70,145,240, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32,
- 0, 0, 79, 66, 0, 0, 3, 80, 3,160,206, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,210, 32, 3,160,202, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 76, 1,240, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,178, 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, 2, 77,218, 48, 61,122,115,185,193, 18,209, 28, 64, 71, 38, 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, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,192, 73, 15,218, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191,128, 0, 0,180, 34, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 52, 34, 33,105,191,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 61,122,115,185,193, 18,209, 28,
- 64, 71, 38, 27, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,167,128, 0, 0, 0, 0, 0, 0, 47, 5,164, 0, 63,128, 0, 0,
-151, 5,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 49,128, 0, 0, 0, 0, 0, 0,
-153,128, 0, 0, 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31,
- 62, 44, 85,173,128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,190,246,108,212,
-190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0,
- 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 76, 7, 0, 2, 74, 53, 64, 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, 68, 65, 84, 65, 0, 0, 0, 4, 2, 77,218, 48, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66,
- 0, 0, 3, 80, 3,160,210, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,214, 32, 3,160,206, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 76, 31, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,184, 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, 8,193,199,160, 61,122,115,185,193, 18,209, 28, 64, 71, 38, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,192, 73, 15,218, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191,128, 0, 0,180, 34, 33,105, 0, 0, 0, 0, 0, 0, 0, 0, 52, 34, 33,105,191,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 61,122,115,185,193, 18,209, 28, 64, 71, 38, 27,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,167,128, 0, 0, 0, 0, 0, 0, 47, 5,164, 0, 63,128, 0, 0,151, 5,164, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 49,128, 0, 0, 0, 0, 0, 0,153,128, 0, 0,
- 63,128, 0, 0, 61,243,183,207,189,243,183,205, 37,162, 83,160,128, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173,
-128, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,128, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64,
- 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169,
- 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 75,226, 80,
- 2, 75,250,128, 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,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,193,199,160, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80,
- 3,160,214, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,218, 32, 3,160,210, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,
-101, 99,107,101,114,115, 46, 48, 49, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,190, 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, 8,193,199,208,193,129,252,227, 64,164,112, 14, 63,229,197, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,193,129,252,227, 64,164,112, 14, 63,229,197, 9, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0,178,216, 66, 17, 0, 0, 0, 0, 0, 0, 0, 0,165,168,193,176, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 27, 40,193,176,181, 0, 0, 0, 52, 0, 0, 0, 63,128, 0, 0,
- 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0,
- 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0,
- 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0,
- 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 0, 1, 64, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,199,208, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,218, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,160,222, 32, 3,160,214, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,
-114,115, 46, 48, 49, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,200,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,200, 0,193,129,252,227, 64,164,112, 14, 63,229,197, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,
-180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,193,129,252,227, 64,164,112, 14, 63,229,197, 9, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-178,216, 66, 17, 0, 0, 0, 0, 0, 0, 0, 0,165,168,193,176, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 27, 40,193,176,181, 0, 0, 0, 52, 0, 0, 0, 63,128, 0, 0, 61,201,126,231,
- 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,
-189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33,
- 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 1, 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, 0, 0, 4,
- 8,193,200, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,222, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,160,226, 32, 3,160,218, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
- 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,211,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,193,200, 48, 65,130, 56, 8, 64,164,112, 14, 63,229,197, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151,
- 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 34,159,177, 0, 0, 0, 0, 65,130, 56, 8, 64,164,112, 14, 63,229,197, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,178,216, 66, 15,
- 0, 0, 0, 0, 0, 0, 0, 0, 38,112,222,138, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 28,112,222,138, 53,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219,
- 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231,
- 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1,
- 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 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, 0, 0, 0, 1,
- 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, 0, 0, 4, 8,193,200, 48,
- 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,226, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,160,230, 32, 3,160,222, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 49, 51, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,222, 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, 8,193,200, 96,
- 65,130, 56, 8, 64,164,112, 14, 63,229,197, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0,
- 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177,
- 0, 0, 0, 0, 65,130, 56, 8, 64,164,112, 14, 63,229,197, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,178,216, 66, 15, 0, 0, 0, 0,
- 0, 0, 0, 0, 38,112,222,138, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 28,112,222,138, 53,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,
-128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,
-128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68,
- 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,200, 96, 0, 0, 0, 0,
- 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,230, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,234, 32,
- 3,160,226, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 49, 52, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 4, 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, 8,194,232,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,193,200,144, 66, 2, 38,176,
- 64,164,112, 14, 63,229,149, 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,
- 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
-178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0,
- 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,
- 66, 2, 38,176, 64,164,112, 14, 63,229,149, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,177,214,137,120,177,162,159,176, 0, 0, 0, 0,
- 38,112,222,138, 63,128, 0, 0, 37, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 54,127,255,254, 52,255,255,255, 52,127,255,255, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,
-164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,
-187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2,
- 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
-201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,200,144, 0, 0, 0, 0, 0, 0, 0, 1,
- 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,234, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,238, 32, 3,160,230, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 49, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 8,194,243,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,200,192, 66, 2, 38,176, 64,164,112, 14,
- 63,229,149, 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, 65, 34,159,178,
- 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151,
- 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0, 66, 2, 38,176,
- 64,164,112, 14, 63,229,149, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,177,214,137,120,177,162,159,176, 0, 0, 0, 0, 38,112,222,138,
- 63,128, 0, 0, 37, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 54,127,255,254,
- 52,255,255,255, 52,127,255,255, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65,
- 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,
-191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56,
- 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,200,192, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32,
- 0, 0, 79, 66, 0, 0, 3, 80, 3,160,238, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,242, 32, 3,160,234, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 49, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,254, 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, 8,193,200,240,194, 2, 10,237, 64,164,112, 14, 63,229,147,184,
- 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, 34,159,178, 65, 34,159,178,
- 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,194, 2, 10,237, 64,164,112, 14,
- 63,229,147,184, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254, 51, 7,206,130, 0, 0, 0, 0, 0, 0, 0, 0, 38,112,222,138, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 28,112,222,138, 53,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51,
- 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203,
- 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0,
- 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,200,240, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66,
- 0, 0, 3, 80, 3,160,242, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,246, 32, 3,160,238, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 49, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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,
- 8,195, 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, 8,193,201, 32,194, 2, 10,237, 64,164,112, 14, 63,229,147,184, 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, 34,159,178, 65, 34,159,178, 65, 34,159,177,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,194, 2, 10,237, 64,164,112, 14, 63,229,147,184,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,127,255,254, 51, 7,206,130, 0, 0, 0, 0, 0, 0, 0, 0, 38,112,222,138, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 28,112,222,138, 53,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,
-128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180,
- 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169,
- 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,201, 32, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80,
- 3,160,246, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,160,250, 32, 3,160,242, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,
-101, 99,107,101,114,115, 46, 48, 49, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 19,176,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,201, 80,194, 34,134, 13,192, 63, 92, 58, 63,229,147,184, 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, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 63,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 53, 77,252,144, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0,193, 34,159,178, 53, 77,252,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,194, 34,134, 13,192, 63, 92, 58, 63,229,147,184, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 49,154,187, 34, 23,196,149,225, 0, 0, 0, 0, 39,194, 58, 16, 63,128, 0, 0, 37,162,159,177, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 61,201,126,231, 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0,
- 48,172, 66,235,189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0,
- 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0,
- 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 0, 1, 64, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,201, 80, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,250, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,160,254, 32, 3,160,246, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,
-114,115, 46, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 30, 96, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,201,128,194, 34,134, 13,192, 63, 92, 58, 63,229,147,184, 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, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 63,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 77,252,144,
- 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0,193, 34,159,178, 53, 77,252,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0,194, 34,134, 13,192, 63, 92, 58, 63,229,147,184, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 49,154,187, 34, 23,196,149,225, 0, 0, 0, 0, 39,194, 58, 16, 63,128, 0, 0, 37,162,159,177, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231,
- 48,171,145,219, 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,
-189,201,126,231, 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33,
- 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 1, 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, 0, 0, 4,
- 8,193,201,128, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,160,254, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,161, 2, 32, 3,160,250, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
- 50, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 41, 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,
- 8,193,201,176, 66, 34,160,176,192, 63, 67, 28, 63,229,149, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,128, 0, 0, 0,191,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 77,252,144,193, 34,159,178,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178, 53, 77,252,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 34,159,177, 0, 0, 0, 0, 66, 34,160,176,192, 63, 67, 28, 63,229,149, 45, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,177,154,187, 34,
- 0, 0, 0, 0, 0, 0, 0, 0,167,194, 58, 16, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,156,194, 58, 16, 52,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219,
- 30,247,120,240,128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231,
- 49,251,201, 70,128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1,
- 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 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, 0, 0, 0, 1,
- 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, 0, 0, 4, 8,193,201,176,
- 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 2, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,161, 6, 32, 3,160,254, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 50, 49, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 51,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,193,201,224,
- 66, 34,160,176,192, 63, 67, 28, 63,229,149, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 0, 0, 0,191,201, 15,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 77,252,144,193, 34,159,178, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 34,159,178, 53, 77,252,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177,
- 0, 0, 0, 0, 66, 34,160,176,192, 63, 67, 28, 63,229,149, 45, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,177,154,187, 34, 0, 0, 0, 0,
- 0, 0, 0, 0,167,194, 58, 16, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,156,194, 58, 16, 52,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,
-128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,
-128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68,
- 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,201,224, 0, 0, 0, 0,
- 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 6, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 10, 32,
- 3,161, 2, 32, 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, 0, 1, 4, 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, 8,193,168,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 57, 42,
- 64, 11,114,237, 64,121, 99,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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,103, 90, 85,190,186, 45,254,
- 63,128,209,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,
-191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0,
- 65,110, 57, 42, 64, 11,114,237, 64,121, 99,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,179, 43,249, 60, 51, 37,175,234, 0, 0, 0, 0,
- 51, 84, 6,193, 63,128, 0, 0, 50, 73,103, 94, 0, 0, 0, 0, 51, 49,123,229, 49,185, 95,236, 63,128, 0, 0, 0, 0, 0, 0,
-169, 5, 28,236,167,139, 7,241,181, 64, 0, 0, 63,128, 0, 0, 62,255,247,138,191, 44, 21,164, 63, 11,203,251,128, 0, 0, 0,
- 62,182, 26,141, 63, 59,248,176, 63, 20, 7, 45,128, 0, 0, 0,191, 74, 39, 37,189,194, 67, 9, 63, 27, 45,217,128, 0, 0, 0,
-193,142, 14,147, 64,234,125, 35,192, 0,119, 85, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1,
- 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
-201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 79, 66, 0, 0, 3, 80, 3,161, 10, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,161, 14, 32, 3,161, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,171,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191,210, 76, 84,193, 71,162,178, 64,178,186,210, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,103, 90, 85,
-190,186, 45,254, 63,128,209,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138,
- 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47,
- 0, 0, 0, 0,191,210, 76, 84,193, 71,162,178, 64,178,186,210, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 1, 52,184, 23,192,179,213, 54,101,
- 0, 0, 0, 0,178,225,250,166, 63,127,255,248, 52, 5,159,109, 0, 0, 0, 0, 50,117, 31,137,179,130, 0,234, 63,128, 0, 1,
- 0, 0, 0, 0,180,255,255,253,182,191,255,250, 53,127,255,245, 63,128, 0, 0, 62,255,247,136,191, 44, 21,164, 63, 11,203,251,
-128, 0, 0, 0, 62,182, 26,139, 63, 59,248,173, 63, 20, 7, 44,128, 0, 0, 0,191, 74, 39, 36,189,194, 67, 17, 63, 27, 45,217,
-128, 0, 0, 0, 63,189,129,191,192,104,159,176,192, 53,194,132, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0, 0, 0, 0, 68,
- 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 14, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,161, 18, 32, 3,161, 10, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 50, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,184,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,193, 16,188,238,193, 57,119,229, 65,141,218, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 15, 79,202,191, 12,100,179, 63,234, 92,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 96,197,171, 63, 83, 27,149,
- 63, 5,118, 10, 0, 0, 0, 0,191, 99,218,142, 61, 75, 4,109,190,232, 3,179, 0, 0, 0, 0,190,204,142,233,191, 16, 64,104,
- 63, 57, 28,174, 0, 0, 0, 0,193, 16,188,238,193, 57,119,229, 65,141,218, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254,178,181,144,174,
- 52, 21, 37,184, 0, 0, 0, 0,178,176,221,147, 63,128, 0, 0, 51,252, 33,177, 0, 0, 0, 0,179, 70,191,185, 49,245, 47, 3,
- 63,128, 0, 1, 0, 0, 0, 0,181,127,255,255,182, 0, 0, 0, 53,255,255,255, 63,128, 0, 0,190, 96,197,175,191, 99,218,143,
-190,204,142,235,128, 0, 0, 0, 63, 5,118, 11,190,232, 3,179, 63, 57, 28,172,128, 0, 0, 0,191, 83, 27,150,189, 75, 4,119,
- 63, 16, 64,105,128, 0, 0, 0,193, 14,181,128,191, 61,177,214,193,128,133, 29, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0,
- 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 18, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,161, 22, 32, 3,161, 14, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48,
- 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,175, 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, 64,104,147,176,193, 23, 84, 42, 64,171, 77,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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,103, 90, 85,190,186, 45,254, 63,128,209,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,247,136,
- 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,
-191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0, 64,104,147,176,193, 23, 84, 42, 64,171, 77,116, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-180, 17,201,197, 50,102,220, 99, 0, 0, 0, 0, 50,191,165,123, 63,127,255,254, 50,140,194, 10, 0, 0, 0, 0,178,180,160, 41,
- 50, 73,103, 91, 63,127,255,254, 0, 0, 0, 0, 52,127,255,254,181,127,255,254, 52,255,255,253, 63,128, 0, 0, 62,255,247,137,
-191, 44, 21,165, 63, 11,203,251,128, 0, 0, 0, 62,182, 26,141, 63, 59,248,176, 63, 20, 7, 46,128, 0, 0, 0,191, 74, 39, 37,
-189,194, 67, 20, 63, 27, 45,217,128, 0, 0, 0,192, 93, 99, 91,190, 80, 98,136,192,112,119,223, 63,128, 0, 0, 0, 0, 0, 1,
- 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80,
- 3,161, 22, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 26, 32, 3,161, 18, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,
-109,112, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,178, 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,192,251,147,249,193, 24, 0,206,192,104,131, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,103, 90, 85,190,186, 45,254, 63,128,209,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0,
- 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0,192,251,147,249,193, 24, 0,206,192,104,131, 67, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,127,255,254, 50,222,105, 55, 51, 17,168,186, 0, 0, 0, 0,178, 47,228,243, 63,128, 0, 0,178,155, 76, 81, 0, 0, 0, 0,
- 50, 22,191,170, 51, 50, 89,214, 63,127,255,254, 0, 0, 0, 0,181,127,255,254,181,128, 0, 0,168,136, 5, 35, 63,128, 0, 0,
- 62,255,247,137,191, 44, 21,165, 63, 11,203,251,128, 0, 0, 0, 62,182, 26,139, 63, 59,248,176, 63, 20, 7, 45,128, 0, 0, 0,
-191, 74, 39, 36,189,194, 67, 19, 63, 27, 45,217,128, 0, 0, 0, 64,176,142,147,191,170, 22, 97, 64,246, 28, 27, 63,128, 0, 0,
- 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0,
- 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66,
- 0, 0, 3, 80, 3,161, 26, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 30, 32, 3,161, 22, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 76, 97,109,112, 46, 48, 48, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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,
- 8,193,181, 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, 65, 54, 41,142,191,115,124, 24,192, 58,215,162, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,103, 90, 85,190,186, 45,254, 63,128,209,115, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176,
- 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0, 65, 54, 41,142,191,115,124, 24,192, 58,215,162,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0,178, 47,228,244, 51, 37,175,235, 0, 0, 0, 0, 51, 84, 6,195, 63,128, 0, 0, 50, 73,103, 94,
- 0, 0, 0, 0, 51, 49,123,230, 49,185, 95,239, 63,128, 0, 0, 0, 0, 0, 0, 53,127,255,255, 51,127,255,252,181, 63,255,255,
- 63,128, 0, 0, 62,255,247,136,191, 44, 21,164, 63, 11,203,251,128, 0, 0, 0, 62,182, 26,139, 63, 59,248,175, 63, 20, 7, 46,
-128, 0, 0, 0,191, 74, 39, 36,189,194, 67, 25, 63, 27, 45,217,128, 0, 0, 0,193, 49,192,139, 65, 36, 99, 40, 63,249,156, 89,
- 63,128, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169,
- 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 30, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 34, 32, 3,161, 26, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,184,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,193, 19,239,220,193, 54,239,215, 65, 60, 9, 42,
- 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,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,103,251, 67,191, 24, 27,164, 64, 3,136, 37, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,190,197,143, 31, 63, 59,184,209, 63, 15, 80,138, 0, 0, 0, 0,191, 64, 66, 57, 61,210,119,132,
-191, 38,249,118, 0, 0, 0, 0,191, 9, 43, 37,191, 44, 15, 35, 63, 2,212,114, 0, 0, 0, 0,193, 19,239,220,193, 54,239,215,
- 65, 60, 9, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,179,254, 23,172, 52, 71,224,218, 0, 0, 0, 0,178, 16, 68, 59, 63,128, 0, 0,
-179, 18, 70,107, 0, 0, 0, 0,178,240,247,161,179,181, 50, 89, 63,128, 0, 1, 0, 0, 0, 0, 53,128, 0, 0,169,254, 23,172,
- 42, 71,224,218, 63,128, 0, 0,190,197,143, 31,191, 64, 66, 56,191, 9, 43, 35,128, 0, 0, 0, 63, 15, 80,139,191, 38,249,117,
- 63, 2,212,112,128, 0, 0, 0,191, 59,184,208,189,210,119,142, 63, 44, 15, 35,128, 0, 0, 0,193, 0,135,195,190,148,252,127,
-193, 48,180, 8, 63,128, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0,
- 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 34, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 38, 32, 3,161, 30, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 8,193,187,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,164, 99,104,193, 51,244,239,
- 64, 19,110,188, 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,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,103, 90, 85,190,186, 45,254, 63,128,209,115,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164,
- 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0,192,164, 99,104,
-193, 51,244,239, 64, 19,110,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,178,142, 78, 41, 51,156,219,142, 0, 0, 0, 0,178, 47,228,245,
- 63,128, 0, 0, 50, 73,103, 93, 0, 0, 0, 0,179, 90, 80, 22, 51,153, 44,237, 63,128, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,255,247,137,191, 44, 21,165, 63, 11,203,251,128, 0, 0, 0, 62,182, 26,139,
- 63, 59,248,178, 63, 20, 7, 45,128, 0, 0, 0,191, 74, 39, 36,189,194, 67, 18, 63, 27, 45,217,128, 0, 0, 0, 64, 91, 24, 96,
-192,108, 50,226, 63,219, 9,101, 63,128, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56,
- 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 38, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 42, 32,
- 3,161, 34, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 4, 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, 8,193,190,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,188, 75,145,
-193,107,197, 44, 64, 81,147, 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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218, 37,128, 0, 0,
- 37,127,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 37,127,255,255,165,128, 0, 0, 0, 0, 0, 0,
- 37,127,255,255, 51,162, 33,105, 63,128, 0, 0, 0, 0, 0, 0, 37,128, 0, 0,191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0,
- 63,188, 75,145,193,107,197, 44, 64, 81,147, 5, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,127,255,254, 53,107,197, 44,180, 81,147, 4, 0, 0, 0, 0,
- 37,127,255,253, 63,128, 0, 0, 48,136, 90, 64, 0, 0, 0, 0,165,127,255,254,155,107,197, 44, 63,128, 0, 0, 0, 0, 0, 0,
- 51,255,255,254,181,255,255,255, 52,127,255,254, 63,128, 0, 0, 63,128, 0, 0,178, 23, 25, 45,179, 75,199,107,128, 0, 0, 0,
-165,128, 0, 1, 63,128, 0, 0, 40, 0, 0, 0,128, 0, 0, 0,177,108,127, 0, 50, 29, 9,206, 63,128, 0, 0,128, 0, 0, 0,
-191,189,159, 32,191,188,164, 47,192,153,188,150, 63,128, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1,
- 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
-201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 79, 66, 0, 0, 3, 80, 3,161, 42, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,161, 46, 32, 3,161, 38, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 0, 0,108, 97,110,101,
- 46, 48, 48, 51, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,136, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,193,202, 16,
- 60,102,131, 0, 64,164,112, 14, 63,229,211, 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, 65, 34,159,178, 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 0, 0, 0,178, 89,250,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0,
- 0, 0, 0, 0, 52, 10,120,151, 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177,
- 0, 0, 0, 0, 60,102,131, 0, 64,164,112, 14, 63,229,211, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,165,143,118,252, 0, 0, 0, 0,
- 0, 0, 0, 0,165,168,193,176, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,155, 40,193,176, 53, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,201,126,231, 48,171,145,219, 30,247,120,240,
-128, 0, 0, 0,164,217,209, 65, 49,255, 57, 51, 61,201,126,232,128, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70,
-128, 0, 0, 0,187, 29,136, 18,191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68,
- 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,202, 16, 0, 0, 0, 0,
- 0, 0, 0, 1, 3,161, 86, 32, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 46, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 50, 32,
- 3,161, 42, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 68, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,193,202, 64,189, 7, 82,100,
-191,103,204, 21, 63,230,165,241, 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,155, 39,153, 64,155, 39,153, 64,155, 39,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218, 37,192, 0, 0,
- 36,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,155, 39,153, 38, 27, 39,152,166,232,187,102, 0, 0, 0, 0,
- 38,232,187,102, 52,196,134,157, 64,155, 39,153, 0, 0, 0, 0, 38, 27, 39,154,192,155, 39,153, 52,196,134,157, 0, 0, 0, 0,
-189, 7, 82,100,191,103,204, 21, 63,230,165,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,152,206, 48,236, 24, 41, 66, 9, 0, 0, 0, 0,
-152, 60, 55,216, 63,128, 0, 0,166,105,133, 88, 0, 0, 0, 0,151, 91,159,226, 38, 93,218, 64, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 83, 50, 25, 36,158,101,147, 35,211, 50, 27,128, 0, 0, 0,
-164,158,101,147, 62, 83, 50, 25, 38,189,119, 59,128, 0, 0, 0,173,204, 94, 0,175, 96, 79,158, 62, 83, 50, 25,128, 0, 0, 0,
- 59,153, 62,135,185,110, 94,217, 63,238, 71,118, 63,128, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2,
- 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
-201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 4, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,202, 64, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 50, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 54, 32, 3,161, 46, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 50, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 8,194,107,224, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,202,160, 8,193,202,160, 8,193,202,112,191,213,187,242, 63,134,145,194,
- 64, 35,100,254, 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, 28, 0,243,
- 65, 28, 0,246, 65, 28, 0,243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,135,110, 48, 62, 59,169,180,191, 1,115,138,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 6, 49,198,192,148,154,115,191,227,113, 3, 0, 0, 0, 0, 64,106,250,159,
- 64, 91,207,189, 65, 5,170, 80, 0, 0, 0, 0,192, 86,151, 46,192,251, 94,125, 64,150,127,188, 0, 0, 0, 0,191,213,187,242,
- 63,134,145,194, 64, 35,100,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 1, 49,153,198,100,179,110, 73,125, 0, 0, 0, 0, 49,211, 40,194,
- 63,128, 0, 0, 50,145,137, 64, 0, 0, 0, 0, 48, 35, 64,101, 51, 39,164,144, 63,128, 0, 0, 0, 0, 0, 0,166, 83, 40,194,
-180, 0, 0, 0,167, 17,137, 64, 63,128, 0, 0, 61,180,174,143, 61, 30, 48,160,189, 16,118,223,128, 0, 0, 0,188,153, 29,162,
- 61,179,248, 38, 61, 74,162,115,128, 0, 0, 0, 61, 72, 21, 15,189, 19,250,160, 61,169, 57, 88,128, 0, 0, 0, 63, 50,107, 4,
-190,204, 46, 88, 63, 79,206,177, 63,128, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56,
- 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,202,112, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 68, 8,193,202,160, 0, 0, 0, 78, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 31, 83,117, 98,115,117,114,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, 1, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80,
- 3,161, 54, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 58, 32, 3,161, 50, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,
-101,118,105,101,119, 46, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2, 71,170, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 62,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, 8,193,203, 16,187,203,194, 16, 63, 45, 89,155, 63,230,153,244, 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, 72,135, 56, 63, 72,135, 56, 63, 72,135, 56, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 72,135, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 72,135, 56, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 72,135, 56, 0, 0, 0, 0,187,203,194, 16, 63, 45, 89,155, 63,230,153,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47,200,135, 57,178,200,135, 57, 63,128, 0, 1, 0, 0, 0, 0,176,192, 0, 0, 51,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,163,104,144,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 34, 52, 33, 50, 51,206,250,252, 63,163,104,144,128, 0, 0, 0,
-173,202,240, 60,191,163,104,144, 51,204, 63,183,128, 0, 0, 0,187,173, 93,105,193, 88,176,172,186,118, 52, 95, 63,128, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0,
- 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1,
- 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 0, 1, 64, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 71,158,160, 2, 71,164, 96,
- 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, 68, 65, 84, 65,
- 0, 0, 0, 4, 8,193,203, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 58, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,161, 62, 32, 3,161, 54, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,
-119, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 62,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, 8,193,203, 64, 58, 10, 31, 0, 63,236, 94, 59, 63,231, 84,236, 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,110,188, 91, 63,110,188, 91, 63,110,188, 91, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,201, 15,218,128, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,110,188, 91,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,151, 50, 90, 63,110,188, 91, 0, 0, 0, 0, 0, 0, 0, 0,
-191,110,188, 91, 51,151, 50, 90, 0, 0, 0, 0, 58, 10, 31, 0, 63,236, 94, 59, 63,231, 84,236, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,127,255,254,179, 25, 53,226, 0, 0, 0, 0, 0, 0, 0, 0,
-167, 50,115, 84, 63,128, 0, 1, 0, 0, 0, 0,174,128, 0, 1,179,255,255,254, 39,153, 53,226, 63,128, 0, 0, 63,137, 65,160,
-128, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,150,221,204,136, 63,137, 65,160, 40, 40,226,194,128, 0, 0, 0, 45, 14,127,248,
-176,150,195,159, 63,137, 65,161,128, 0, 0, 0,188, 63, 80, 29,187,226, 95, 62, 65, 74, 19, 87, 63,128, 0, 0, 0, 0, 0, 16,
- 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 32, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 1, 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, 0, 0, 4,
- 8,193,203, 64, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 62, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,161, 66, 32, 3,161, 58, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48,
- 53, 0, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,193,165, 96, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,189,195,155,128, 64,188,145, 20, 65, 88,220, 94, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,134,180,221, 37,141,190, 48, 35, 57, 55,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 35, 57, 55,253,
-165,141,190, 48, 0, 0, 0, 0, 37,112,128,219, 62,253,177, 52, 63, 94, 93, 94, 0, 0, 0, 0, 37, 22,133, 52,191, 94, 93, 94,
- 62,253,177, 52, 0, 0, 0, 0,189,195,155,128, 64,188,145, 20, 65, 88,220, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 25, 31, 42,118,
-153,131,108,242, 0, 0, 0, 0,176, 0, 0, 0, 63,128, 0, 0,178, 66, 21,210, 0, 0, 0, 0,176, 0, 0, 5, 50,158,245, 25,
- 63,128, 0, 1, 0, 0, 0, 0, 50, 0, 0, 0, 11,159, 42,118,140, 3,108,242, 63,128, 0, 0, 63,128, 0, 0, 37,112,128,219,
- 37, 22,133, 53,128, 0, 0, 0,174,231, 90, 80, 63, 94, 93, 94, 62,253,177, 52,128, 0, 0, 0,172,239, 68, 0,190,253,177, 50,
- 63, 94, 93, 95,128, 0, 0, 0, 61,174, 98,150,193,144,101, 85, 64,253,124,196, 63,128, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0,
- 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 66, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 3,161, 70, 32, 3,161, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,
-119, 46, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 87, 96, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,193,203,112,190,252, 52, 94, 65,228,101,174, 65, 17,116,141, 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, 30,239,235, 66, 30,239,236, 66, 30,239,235, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 95,174,138, 37,123,132, 98,165, 87, 56, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 30,239,235,
-168, 5,158,105,168, 28, 39,108, 0, 0, 0, 0, 40, 77,129,212, 65,204, 15, 66, 65,243,186,158, 0, 0, 0, 0,165, 13, 89, 55,
-193,243,186,156, 65,204, 15, 65, 0, 0, 0, 0,190,252, 52, 94, 65,228,101,174, 65, 17,116,141, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 24,232,169,151, 25,157,190,151, 0, 0, 0, 0, 24,149, 24, 21, 63,128, 0, 0,178, 59,157,109, 0, 0, 0, 0,153, 64,231,191,
-178,199,158, 1, 63,128, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 60,206, 43,101,
- 35, 5, 74, 25,159,183, 90,141,128, 0, 0, 0,162,202,143, 41, 60,158, 20,101, 60,132, 89,193,128, 0, 0, 0, 34,173, 83,188,
-188,132, 89,192, 60,158, 20,103,128, 0, 0, 0, 60, 70,215, 11,191, 67, 43, 61, 63, 31,241,185, 63,128, 0, 0, 0, 0, 0, 64,
- 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205,
- 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 1, 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, 0, 0, 4,
- 8,193,203,112, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 70, 32, 0, 0, 0,113,
- 0, 0, 0, 1, 3,161, 74, 32, 3,161, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 99,117, 98,
-101, 0,117, 98,101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 95, 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,
- 8,193,203,160, 59, 88,253,128, 63,160,118,220, 64, 37, 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, 64, 68, 88, 84, 64, 68, 88, 84, 64, 68, 88, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,237,190, 1,190,217,230,108, 63, 52,151, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 38, 67, 63,231,228,191,
- 63,162, 31,186, 0, 0, 0, 0,192, 13,118, 35, 63,220, 61, 2, 63,160, 44, 31, 0, 0, 0, 0, 60,234, 52,166,191,227,223,102,
- 64, 31,229, 55, 0, 0, 0, 0, 59, 88,253,128, 63,160,118,220, 64, 37, 15, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,178,173,119, 22,
- 48,207, 79,155, 0, 0, 0, 0,179, 33,101,225, 63,128, 0, 0,178,235,101,178, 0, 0, 0, 0, 50,194,156,191, 50,154, 60, 97,
- 63,128, 0, 1, 0, 0, 0, 0, 51,149, 0, 0,180, 0, 0, 0,180,128, 0, 1, 63,128, 0, 0, 62,103,115, 10,190,112,122,201,
- 59, 71, 17,255,128, 0, 0, 0, 62, 9,205,116, 62, 8, 36,205, 62,135,232,136,128, 0, 0, 0,190, 69, 27, 1,190, 59, 50,224,
- 62, 65,176, 25,128, 0, 0, 0,192, 16,176,110,192, 9, 71,158, 63,244, 90,115, 63,128, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
- 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236,
- 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 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, 0, 0, 0, 1,
- 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, 0, 0, 4, 8,193,203,160,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 80, 3,161, 74, 32, 0, 0, 0,113, 0, 0, 0, 1,
- 3,161, 78, 32, 3,161, 70, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119,104, 97,105,114, 0,108, 97,
-110,101, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 8,194,147, 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, 8,194,100, 96, 8,194,100, 96, 8,193,203,208,
- 63,200, 92, 86, 63,227,205, 7,189, 9,199,149, 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, 47,126,234, 64, 47,126,234, 64, 47,126,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2, 80,225,
-191, 15,211, 5, 62, 18,219, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 18,254,224, 62,169,209, 23, 63,186,251, 27,
- 0, 0, 0, 0,191,133,254, 71, 64, 17, 40,207, 63,144,194,229, 0, 0, 0, 0,191,137, 38, 78,191,192,162, 48, 64, 1,176,125,
- 0, 0, 0, 0, 63,200, 92, 86, 63,227,205, 7,189, 9,199,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,179, 25,128,225,179, 88,103,157,
- 0, 0, 0, 0, 50,132,162,249, 63,128, 0, 1, 51,139,156, 89, 0, 0, 0, 0,179,139,204,225,178,185, 96,160, 63,128, 0, 0,
- 0, 0, 0, 0, 52, 0, 0, 1,180, 0, 0, 1,180, 84, 0, 1, 63,128, 0, 0, 62,156,100,244,190, 14,143,135,190, 17,235, 52,
-128, 0, 0, 0, 62, 70,239,175, 62, 26, 4,102, 62,137,251, 72,128, 0, 0, 0,189, 52,172,174,190,154,112,211, 62, 76,243, 67,
-128, 0, 0, 0,191, 36, 56,149,192, 66, 98,139, 64, 68, 5,168, 63,128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 68,
- 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100,
- 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0,
- 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4, 0, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 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,193,204,176, 8,193,204,176, 8,193,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,193,203,208, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,193,204, 0, 0, 0, 0,115, 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, 61,204,204,205,
- 62, 76,204,205, 60,163,215, 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,
- 0, 0, 1, 64, 8,193,204,176, 0, 0, 1, 49, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3,163,162, 32, 7,246,240, 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,
- 62,156,100,244,190, 14,143,134,190, 17,235, 52, 0, 0, 0, 0, 61, 52,172,172, 62,154,112,211,190, 76,243, 69, 0, 0, 0, 0,
- 62, 70,239,176, 62, 26, 4,102, 62,137,251, 73, 0, 0, 0, 0,191, 12,211,188,190,160,176,198, 63, 22,156, 56, 63,128, 0, 0,
- 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,194,100, 32, 68, 65, 84, 65, 0, 0,147,168, 7,246,240, 32, 0, 0, 1, 47,
- 0, 0, 0,150, 0, 0, 0, 0,192, 17,135, 20,192, 97,121, 36, 63,141, 32,112,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,206, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32, 96, 77, 62,160,201,185, 63, 6, 3,160,190,248, 34, 11,
- 60,185, 53,206, 61,178,197,192, 63, 53,184,174,190,162,172,223, 62,224,136,109,191, 61,173,142, 60, 10, 96,180, 61,163,196,200,
- 63, 99,182, 78, 60,180,242,165, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,150,112,248, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 7, 46,111,192, 60, 26,143, 63,207,147, 28,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,207, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,229,121, 6,191, 41, 50,108,191, 7,152,136,190,146,100,156,191, 25,141,146,
- 62,142, 92, 39, 63, 18,104,212,190,105,105,227, 62, 96,156,113,191, 69,226,137, 61, 17,247,147, 62, 44,172, 51, 63, 54,125, 17,
- 61,169,195, 69, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,245, 63,144,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-189,174,103,224,192, 17, 88, 60, 64, 76, 35,230,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,
-190, 61,137,200,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,208, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,155,160,101, 62,152, 87, 59,191, 84,199,118, 62,183, 89, 86, 62,231,103,118,189,177, 47,110,
-191, 4, 8,155, 62,199, 60,100,189,177, 40,197, 62, 46, 14, 2, 62, 39, 96,102, 61,242,119,101, 62,146,168,189, 62,221, 9, 55,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 87, 36,135, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192,131,102, 75,
- 63, 26,241,196, 64, 76,198,140,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,190, 61,137,206,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,209, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 39, 80, 49,190,218, 26,171, 63, 16,118, 89,190,138, 72,130,190,122,255,169,191, 14,111,185, 63, 38,207, 21,
- 61,211,252, 73,191, 80,177,198,189,203,154, 43, 61, 53,146,227, 63,115,180, 63, 59, 42,113,216, 58,144, 63,125, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,142, 95,175, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,226, 43, 64,191,220, 85,253,
- 64,101,104,225,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,210, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 45, 97,119,190,205, 47,119, 63, 19,117, 35, 62, 98,125,166, 62, 73,195,242, 62,243,228,124, 63, 11, 86,119, 62, 89,156, 70,
- 63, 88,232,230,190,204, 53,130, 62,128,120,250, 62, 20,194, 19, 62, 90, 15, 61, 62,200, 30, 92, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,253,129, 53, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,129,159,108, 63, 6,210, 8, 64,152,221, 35,
-191, 55, 81,190,191, 71,243,107, 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,205,191, 80, 38,157, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,211, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,210,167, 41,
- 62,139,172,194, 63, 35,220,250,191, 22,182, 30, 61,136, 3,122,190,176,164,109,190,147,153, 30,188, 10,248,255,190,160, 90,234,
-190,205,241, 89, 63, 25,235,148, 62,146,172,206, 61, 52,195,137, 61,139,142, 99, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 77,227, 37, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,189,167,114,192,104, 59,217, 63,184,179,184,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,212, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,121, 45, 57, 63, 98,126,120,
-189,135,171, 60,190,200,174,139, 63, 21,142,220,191, 40, 70, 77, 62,150, 70,118, 61, 92,245, 4,190,174,118,159, 63, 49,217,176,
- 60,104,167,120, 60,235,104,166, 63, 73,251,218, 62, 44, 25, 13, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62,247, 2,217, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 30,112, 86,192, 82, 69,111, 64, 51,191, 59,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,213, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,137,227, 49,191, 71,195,206,190, 96, 31, 70,
- 63, 5, 46,127,189,214, 51, 99,191, 67, 61,228, 62, 2, 90,134,190,146,214,120, 62, 33,111, 34,190,187,229,136, 60,241,112, 27,
- 60,177,187, 0, 62,171,134, 4, 63, 29, 35,164, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 56,192,130, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,176,148,118, 63, 1,200, 88, 64,146, 48, 89,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,214, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 82,169, 42, 63, 57,214,102,191, 36,112, 55, 62, 9,205, 59,
- 63, 5,139,184,190, 43, 32,105,191, 37, 62,120, 63, 15,215,220, 63, 8, 2,180, 62,163,170,198, 63, 8,178,160, 62,184,164,185,
- 61, 63, 72, 68, 61,112,104, 16, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,192,249, 97, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191,168, 80,200,191,165,154, 8, 64, 80,248,229,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,215, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 5,145, 56, 62,126, 77, 83,191, 63,133, 14, 62,167, 5,190,190, 96,212,123,
- 62,176,136,233,189, 80,193, 25, 62, 18, 49,147, 62, 25, 40,222,191, 10,204, 59, 62,104, 46,177, 62,150,106, 36, 62,138, 61, 2,
- 62, 86,131, 4, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 19, 27, 39,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-189,246,190, 0,192, 90,129,233, 64, 20,155,224,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,
-190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,216, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 14, 77, 30, 62,154, 81,231,191, 22,220, 41,191, 0,189,104,190,160,167,214,190, 22, 60,140,
- 63, 74, 85, 37,191, 8,253, 32, 61, 23,146, 96,190,177, 30,196, 60,187, 25, 79, 60,194,244,207, 62,253,234, 53, 62,234, 52,233,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 79, 21,218, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190, 67,231,176,
-189, 11,105,144, 64,153,111,210,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,217, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,205,110, 74,191, 27,226,146, 61,219, 95, 73, 63, 45, 3, 75,190,147,109,222, 63, 40,196,152,190,116,136, 36,
-190,190, 21,181,190,213, 38,211, 62,183,230,114, 63, 24,217,206, 62, 25,222, 59, 61,134, 50, 0, 62, 63,161,139, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,127, 67,180, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,158,217, 58,192, 17,225,122,
- 64,120,158,213,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,218, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 22, 95,176,190,210, 95,172,191, 46, 70,114, 62, 26, 71, 67, 61,234,164,188,191, 78,120,121,188,108,229,186,190, 72,225,144,
-190, 42,218,197,191,114,104, 83, 62, 73,213, 34, 61, 49,230,217, 61,187,117,217, 63, 42,253,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 95,144,226, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,127,205, 29,191,142,116,231, 64,100, 64,116,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,219, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,132, 25,196,
-191, 41,167, 67,190,174,145,249, 63, 41,227,171, 62, 94,208, 84, 63, 50, 21, 98,191, 46,162,138,191, 56, 53,136, 62,160, 44, 9,
-190,188, 42, 15, 62,145,124,109, 62,135, 84, 47, 62, 95, 56, 95, 62,111, 38,104, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 87,116,183, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 67,106,143, 62,236, 1,239, 64,105,139,230,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,220, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 72, 62, 61, 62,176,226,147,
-191, 48,185, 67,191, 26,215,255,187,254,158,242,190,201,238, 89, 63, 39,166, 99,191, 3,238,102, 62, 10,229,206, 62,230, 53,165,
- 62,100,227, 37, 63, 54, 38,230, 61, 43, 4, 87, 60,190, 1,166, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 61,126, 26,213, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 58, 63,114,191,102, 44,242, 64,119,155,239,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,221, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,131,238,198,191, 58, 99, 49, 63, 26,180, 63,
-190,162, 92,201, 62,209,254,113, 63, 12, 67,151, 62,197,138, 80,191, 72,116,197,190,182,129,117, 62, 76,137,180, 62,178,134,232,
- 62,113,134, 23, 62, 46,242,235, 62,122,121, 45, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 62,169, 12,248, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,175,173,244, 61,141,194,136, 64,164,239, 0,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,222, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28, 38,213, 60,166,248, 66,191, 67,199,227,190, 83,123,127,
-190,224,119,122, 62,149, 46, 73, 62, 62, 43,135, 62,199,175, 30, 63, 2,224, 97, 62,250,198,180, 63, 48, 97,211, 61,130,134, 38,
- 61, 8, 53,167, 62, 91, 40, 56, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,157,115, 93, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 36,188,127,192, 42,192, 83, 63,202, 24, 20,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,223, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 82,121, 10,190,216,142,233,191, 83,156, 94, 62,158, 73,222, 63, 3,207,170,
-191, 39, 41, 63, 62,147,164, 2,191, 38,187, 36, 62,218, 1, 0,191, 32,119,145, 60,154,242,191, 62,130,165, 14, 63, 49,236,127,
- 60,253, 44,163, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,130,194, 13,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 51,117,191,192, 44,247, 40, 64, 82, 59, 84,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 59, 71,176, 89,191, 18, 55,214,190,223, 82, 67, 63, 50, 2,142, 61,202, 17,235, 62,199,118, 51,
- 63, 72,125,129,191, 36,250, 86, 61, 90, 99, 70, 63, 25, 38,125, 61,227, 50,218, 61,110,152, 48, 62,104, 58,166, 63, 26,161,121,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 35, 69, 21, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 44,218, 23,
-190,159,112,131, 64, 80,196, 68,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,225, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191, 39, 65, 62,190,203,203,175,191, 8, 58, 24,190,185,178,132, 63, 27,133, 48, 63, 35,150,166,189,174,164,195,
-189,209, 20,146,191, 3, 43,124, 63, 54,188,219, 62, 53,126, 23, 63, 22,113, 93, 62, 42,104, 29, 61,140,168,166, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,222,122, 90, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 61,253,222,190, 43,216,212,
- 64,140,239,219,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,226, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-190,251, 62, 59, 62,132,207,154,191, 19,198,191,191, 25, 82,122,190,169,114,179,191, 46, 80,242,189,100, 92,161, 62,188,103,125,
-191, 23,234, 0, 63, 22,140, 12, 62,252, 36, 24, 62,121,130,191, 61,198,245, 96, 62, 42,186, 98, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 89,205, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,212,168,192,192, 30,175, 47, 64, 12,228, 94,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,227, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6,136,242,
-191, 58,135,240, 61,233,198, 89, 63, 41,148, 57,190,189,188,151,190,189, 72,156, 63, 86, 14,184,190,165, 54,185, 62, 49,220,131,
-189,189, 87, 60, 61,167,198,118, 62, 80,200, 92, 63, 10,210,157, 62, 48, 9,240, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,181,132,186, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,238,184,114,191,230,206,237, 64, 85,122,208,191, 55, 81,190,
-191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,228, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 30,165,128,190,249, 50,161,
-189, 86,213,180,191, 29, 10,178,191, 49,247,227,189, 7,139,215,189,154,249,222,191, 23, 77,153, 63, 14, 58,160, 61, 15, 47, 72,
- 62, 94,132,138, 62, 48,190,167, 62,136, 41,203, 62,176, 52,157, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62,233,177, 38, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,104, 19, 67,191,254,122,179, 64,123, 37,115,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,229, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,181,231, 69, 63, 51, 19, 36,191, 6, 5,126,
-190,170, 27,231,189, 35,253,128,189,151, 11,182, 62,178,171, 74, 63, 49,231,127, 62,128,146,204, 62, 17,100, 88, 62,124,245,197,
- 61,130,108, 30, 61,229,152,201, 63, 19,193,242, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 79,156, 56, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,191,106,172,192, 42,225,110, 64,110,170, 2,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98,
- 62,214,163,236,190,183,206,197,190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,230, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 27,227, 49, 63, 26, 83, 17,191, 2,229, 27, 61,135, 48, 83,
- 62,134,244,199,190,151, 37, 55,189,237,195,210, 63, 17, 39,249, 61, 76, 1,154,191, 79,194, 75, 61,249, 99,240, 60,249, 88,190,
- 61,183, 20,174, 63, 66, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,178, 40,150, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 12, 3,121,190,252, 11, 63, 64, 89,136,146,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,231, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 20, 59,104, 63, 17, 36, 30,190,252, 57,112, 62,162,101, 32, 62,160, 6,139,
- 61, 80,160, 57, 61,245,243,109,190,224, 18, 41,188,227,154,182,190,139,196,238, 62,108, 28,173, 62,246,152,191, 62, 61, 50,199,
- 61,210,254, 31, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 56,166, 20,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191,187,104,250,189,139, 86, 56, 64,131, 23,145,191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,
-190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,232, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 19, 80,228,191, 16,138,118,191, 6,210,122, 62,138, 14,139, 62,189, 65, 73,189,244, 89, 19,
- 62, 83, 5,205,190,107,159, 94, 62,255,199, 19,190, 48,124, 14, 62,208, 67, 15, 62,190, 57,184, 61,219,154,119, 61,234,114,111,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,223, 51,203, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,161, 56, 52,
-191,207,221,255, 64,120,110,202,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,233, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 47,124,138, 63, 0,193, 12, 62,176, 39,124,190,204, 3, 68, 61, 43,180,132,189,104,184, 66,191, 54,173, 69,
-189,116,239, 24,190, 53,183,191,190,198, 91,120, 62,150, 33,123, 61,226, 30, 68, 62, 27,121,224, 62,227,154, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 35, 22,117, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 41, 89, 63,192, 25,107,117,
- 63,222,245,174,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,234, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,207,202, 66, 63, 47, 32,211,191, 0,219,139,190,172,212,197, 63, 65, 68,195,190,217,152,105,190,214,218,159,190, 84,113, 85,
-190,158,108,194, 61,235,217,229, 60,202,179, 82, 62,157,106,197, 63, 33,197,211, 61, 18,243, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,102,162, 1, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,220,238, 94,191,150, 70, 91, 64, 72,192,203,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,235, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22, 95,176,
-190,210, 95,172,191, 46, 70,114, 62, 26, 71, 67, 61,234,164,188,191, 78,120,121,188,108,229,186,190, 72,225,144,190, 42,218,197,
-191,114,104, 83, 62, 77,183, 13, 62,182,153,158, 62,143, 59, 65, 62, 38,159, 52, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 95,144,226, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192,116,234, 61,188,238,101,224, 64, 56, 20,165,191, 55, 81,190,
-191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,236, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 6,136,242,191, 58,135,240,
- 61,233,198, 89, 63, 41,148, 57,190,189,188,151,190,189, 72,156, 63, 86, 14,184,190,165, 54,185, 62, 49,220,131,189,189, 87, 60,
- 60,242,255, 31, 63, 83,194,231, 62, 5, 56,189, 60, 85,188, 68, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 61,181,132,186, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,240,209,128, 63, 95,183,178, 64,176, 67, 5,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,237, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 86,114,107,191, 2,141,137, 61,105,140,227,
-190, 63,121, 70, 62,218,242,130,190,132,163,237, 60, 16,235,219, 62,248,203, 85,191, 80,244, 79, 62,148, 0,103, 63, 85,189,153,
- 61,200,104,151, 60,142, 55,246, 61, 76, 57, 74, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 33,252, 31, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,192, 25, 54,206, 62,162,197,171, 64,121, 16, 6,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98,
- 62,214,163,236,190,183,206,197,190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,238, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,244,100,219,191, 91, 69,182,189,144,137, 60, 62, 59,126,161,
-190,200,228, 28, 62,170, 49, 60,189,250,139,225, 62,111,143,244,191,100,103,252, 62, 79, 32,148, 62,163,246,104, 63, 16,201, 91,
- 61,136,104, 24, 61, 66,230,227, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63, 41, 88,182, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 61, 57, 29,191, 39, 53,236, 64, 55,221,173,191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,
-190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,239, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 35, 43,167, 61,225,210,242, 63, 30, 58,197, 63, 67, 8,229, 61,222,176,215,
- 63, 12, 15, 70, 62,165,195, 80, 61,227, 72,218,191, 87, 66,188, 62,195,213,145, 61,212,218, 39, 63, 25, 20,242, 62,118, 70,122,
- 61,107,226,159, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 64, 74,173,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 40, 62,249, 63, 26,113, 16, 64,160,179, 50,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,240, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,190,224, 29,190, 63, 4, 44,239, 63, 49,217,125,190,121, 25,107, 62,217,172,117,190,116, 98,242,
- 63, 42,162,148,190,199,178,142,191, 13,105, 54,190,163,107, 83, 63, 45,186, 64, 62, 91,122,109, 61, 21,134, 32, 61,144,118, 21,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 73,107,113, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,138, 51, 90,
-192,110, 14,199, 63,203, 66, 18,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,241, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 39, 78, 36,190,251, 50,128,190,189,185,139, 62,226, 4,175,190,153, 23,118,190,120,228, 67,191, 42,226, 50,
-191, 86,243,239,190,189, 42, 37,190,190, 1, 66, 59,153,223,235, 59,243,174, 21, 63, 60,160,231, 62,128,135,251, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,105,245,167, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,186, 75, 44,191,204,205,170,
- 64, 61,169,132,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,242, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,155,223,118,191, 3,196,249,190,163, 12,115,191, 60, 73,212, 62, 85,208, 59, 62,155, 11, 65,189,173, 17, 28,190,254, 16, 20,
- 63, 32,229,213,189, 28,221,216, 62, 52, 19, 79, 62,146, 52,229, 62,171,228,191, 62, 79,185,106, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 37,184, 45, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,219,119, 4,192, 28, 73,231, 64,128,117, 83,
-191, 55, 81,188,191, 71,243,109, 63, 42,237,100, 62,214,163,233,190,183,206,202,190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,243, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,254,109,168,
- 63, 4,146,210, 63, 23,131,232, 62,187,212, 66,190,158,109, 9, 62,216, 12, 71, 59,153, 20, 64, 62, 7, 2, 11, 62, 91,134, 92,
-191, 33,128, 43, 62, 51, 75,186, 60,144,251,206, 61, 19, 49,198, 63, 69,114, 22, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,115,100,221, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,194, 59,172,192, 13, 29, 35, 64, 30,208, 13,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,244, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,155,223,118,191, 3,196,249,
-190,163, 12,115,191, 60, 73,212, 62, 85,208, 59, 62,155, 11, 65,189,173, 17, 28,190,254, 16, 20, 63, 32,229,213,189, 28,221,216,
- 61,227, 31, 97, 62,104,207,168, 62,237, 89, 38, 62, 74,238, 93, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 37,184, 45, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 82,190,197, 62,174,148,251, 64, 91,189, 29,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,245, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 10,132,170, 62,237, 61, 82,190,223,191,127,
- 63, 12,148, 11, 62, 92,142,236, 63, 32,199, 17,189,242,206,157, 63, 15,114,199,191, 33, 82, 91,190,167,247, 3, 62, 37, 10,210,
- 63, 65,152,124, 61,106,110, 28, 60,207,189,179, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 62,140, 23, 40, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,190,163,157,120, 63, 33,219, 44, 64,167, 25,250,191, 55, 81,190,191, 71,243,107, 63, 42,237,102,
- 62,214,163,237,190,183,206,199,190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,246, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 4,175,102,190, 50,200,160, 63, 77,214,248,190,110,194,226,
- 61,198, 10,138, 62, 62,213,210, 61,253,163,141, 61,160,130,106,191,101,229,201, 62, 50,145,103, 63, 61,192, 52, 62, 23, 50, 16,
- 61, 1, 56, 40, 61,162,254, 43, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 60,220, 81, 89, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 79, 63,131,191,203,225, 22, 64,133, 83,183,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,247, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,194,155, 70,191, 3, 93, 82,191, 19,133, 23,191, 2,146,179, 62,104,198,131,
- 63, 93,189, 15,190,209,226, 77,191, 21,122,159,190,234,192,169, 63, 35,128, 16, 62,167,188, 9, 61,138,167,141, 61,185,163,186,
- 63, 3,152,147, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 59,236,249, 25,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 89,218, 20,192, 81, 21,169, 64, 38,226, 50,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,
-190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,248, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 52,169,139, 62,156,163, 97,190,184,132, 26, 63, 7, 25, 82, 62,151,117,127, 62,247,206,254,
- 63, 76,144, 27, 62,204, 57,150,188,246,181,184, 63, 19,222,196, 61, 18,237,175, 61, 0, 0, 50, 62,208, 45,180, 63, 6,186, 72,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,186,195, 61, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,166, 91,192,
- 62,151,138,203, 64,159, 4,232,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,201,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,249, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 7,240,212,191, 18, 2,213,191, 5, 90,228, 62,178, 92,221, 63, 16,236, 8, 62,151,216, 90, 62,128,193,155,
-188,245, 60, 56,190,160,129,118,191,113,157, 47, 63, 40,117,114, 62, 37, 92,164, 61, 78,198, 72, 62, 5, 28, 6, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,226, 96,137, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,191,137,104,190,208,156,143,
- 64,116,245,234,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,202,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,250, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 49,218,173,191, 23,109,113, 62, 55, 16, 32,190,188,117, 54, 62,208, 20, 25,191, 46,245,118,186,236,158, 72,191, 97, 10, 55,
- 62,183,128,140,190,146,230,177, 62,174,217,121, 62,188, 55, 45, 62, 25, 76, 41, 62, 16,146,138, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 48, 85, 96, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 78, 6,218,191, 2,247,240, 64,131,181, 2,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,251, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,236, 25,179,
- 63, 27,158,127, 62,239,235,123, 63, 33,108, 59,190,103,198,244, 62,187,192,251,190,101, 39,179, 62,138,210,110,191, 54,168,145,
-190, 63, 20,208, 62,211,209,237, 62,129,168, 1, 62, 7,237,108, 62, 77, 30,188, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,109,210, 2, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,251,181,100, 63, 79, 67,160, 64,143,115, 83,191, 55, 81,190,
-191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,193,252, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,237,243,122,190,169,234, 11,
-191, 55,226,211,191, 25,175,184, 63, 39,201, 24,190, 71, 23,204, 62,218, 61, 87, 63, 39,211, 31,190,215,101,108,189,244,125, 35,
- 62,250, 56, 31, 62,248,208,174, 60, 79, 43, 50, 60, 79,186,252, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 61,186,130, 83, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 16,143,166,192, 31, 40,219, 63,240,165,188,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,193,253, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 15,157,192,190,205, 51, 47,190,136, 40,152,
- 63, 44,122,128, 63, 92,144,194,190, 99, 36,235,190,206, 22,244, 62,220, 32,143, 63, 19,244,169,189,238,205,160, 61, 69,255, 93,
- 62,129,237,131, 63, 29,113,199, 61,169,188, 16, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61,151,139,249, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,192, 46, 16, 47, 62, 17,135,234, 64,101,174,196,191, 55, 81,190,191, 71,243,107, 63, 42,237,100,
- 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,254, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,162,110,186,190,105,104,145, 62,239,168,247, 63, 74,235, 3,
-190,178, 77,140, 63, 72, 49, 80, 62,112, 45,164, 63, 44,101, 43, 62,173,162, 95,190,104,215,180, 62,112,185,132, 63, 31,198, 76,
- 61,186,148, 82, 61, 75,140,149, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 61,120,174,161, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 34, 76,221,191,220, 63,195, 64, 19, 92,101,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,193,255, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 32, 89,101, 63, 82, 91,234, 60, 86, 78,243, 63, 12, 61, 22,190,178,120,249,
-191, 37, 19,203, 63, 24, 65,128, 63, 52,226,196,191, 0,214,219,190,210,228,203, 61,144, 5,191, 62,203,251, 27, 62,232,217, 8,
- 61,156,169,185, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,113,165, 7,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191,208,209, 0,192, 57, 98,175, 63,244, 39,214,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 6,136,242,191, 58,135,240, 61,233,198, 89, 63, 41,148, 57,190,189,188,151,190,189, 72,156,
- 63, 86, 14,184,190,165, 54,185, 62, 49,220,131,189,189, 87, 60, 61,100,142, 40, 62, 18, 81,206, 63, 34,238, 52, 62, 40,209,214,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,181,132,186, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 19,146,156,
- 63, 38,169,132, 64,133,240,119,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191,104,191,123,190,172, 12, 91, 62,112, 97,100, 61,150, 67,240, 61,241,234,237,190, 65, 15,121, 62, 61, 2,224,
-190,233, 38,159,187,191, 62,118, 63, 29,119,107, 62,202, 98,177, 63, 14,134,157, 60,213,140,246, 60,179,116, 97, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 69,173,159, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,211,209,100,192, 64, 57, 80,
- 64,100, 52,239,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-190,157, 46,129,191, 47,142,239, 60,219,129, 7, 63, 40,203,124,189,122,175, 5, 62,139, 33,180, 61, 63, 8,162,191, 26,191, 75,
- 61,189,191, 52,190,100,188,125, 61,112,222,131, 60,161,149,150, 61,202,188,127, 63, 82,141,219, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 58, 78, 34, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,195, 40,204,192, 22, 66,169, 64, 88, 69, 56,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 3, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25, 69,168,
- 62,124,123, 76,191, 32,238,100, 62,220,140,234, 61,120,159, 84, 61,244,254,187, 63, 59,215,103,190, 71,235,244,191, 73,172, 9,
-190,165,228, 94, 62, 39,198,237, 61,180,166,232, 62,106, 45, 33, 63, 4,238, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,104,255,128, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124, 41,179,192, 92, 52,215, 64, 56,194, 1,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 4, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,175,191,249, 63, 67,210, 72,
-190,255, 44, 91, 62, 97,232, 36,191, 70, 89,183,190,246, 37, 58, 61,211,174,112,189,119,174,231,191,119, 2,237, 62, 35,205,180,
- 59,158,119,225, 59, 89,185, 62, 62,150, 41, 58, 63, 50,212,186, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 32,102, 78, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 66,215, 78,189, 17,102, 16, 64, 82, 64,251,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 5, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,158, 15, 40,191, 27, 48, 97,191, 41,181, 48,
-190,160, 19, 31,189,153, 23, 91,190,110,243,100,190,164,169,182,191,120,129, 97, 60, 90,101,145, 61,186, 53,193, 62, 31, 65, 94,
- 63, 45, 57,152, 61,248,240,117, 61, 61,128, 59, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61,137, 79,196, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,243,234,243,192, 50,199, 12, 64,118,173,246,191, 55, 81,192,191, 71,243,107, 63, 42,237, 98,
- 62,214,163,235,190,183,206,197,190, 61,137,205,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 6, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,136,137,130,191,106, 7,101,190,155,249,249, 60,155,218,146,
-188,184,212,179,189,201,215, 68,191, 61,244, 40, 61, 70,234,114,191, 1,226,154, 63, 91,139,119, 61,207, 64,202, 60, 89,106, 46,
- 61, 13, 53, 30, 63, 89,222,236, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63, 87, 40, 6, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191, 54,176,174,191,187,173, 99, 64, 93, 31,209,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 7, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 71,176, 89,191, 18, 55,214,190,223, 82, 67, 63, 50, 2,142, 61,202, 17,235,
- 62,199,118, 51, 63, 72,125,129,191, 36,250, 86, 61, 90, 99, 70, 63, 25, 38,125, 62,129,144,101, 62, 91, 1,185, 62,121, 67, 60,
- 62,148, 77, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 35, 69, 21,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-192,100,131,238,191, 81,185,222, 64, 27, 50, 40,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 8, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,190, 35, 43,167, 61,225,210,242, 63, 30, 58,197, 63, 67, 8,229, 61,222,176,215, 63, 12, 15, 70,
- 62,165,195, 80, 61,227, 72,218,191, 87, 66,188, 62,195,213,145, 60, 70,146,197, 63, 44,125, 83, 62,156,124, 64, 60, 10,144,125,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 64, 74,173, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,248, 77,226,
-190,103,109, 12, 64,143,231,230,191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,199,190, 61,137,204,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 9, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,190,251, 62, 59, 62,132,207,154,191, 19,198,191,191, 25, 82,122,190,169,114,179,191, 46, 80,242,189,100, 92,161,
- 62,188,103,125,191, 23,234, 0, 63, 22,140, 12, 63, 3,173, 53, 62, 78,233,187, 61,187,225, 77, 62, 68,112,203, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 89,205, 62, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 10, 80,129,192, 74,130,253,
- 64,109,179,124,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 10, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 59, 71,176, 89,191, 18, 55,214,190,223, 82, 67, 63, 50, 2,142, 61,202, 17,235, 62,199,118, 51, 63, 72,125,129,191, 36,250, 86,
- 61, 90, 99, 70, 63, 25, 38,125, 60,202, 2,215, 59,181,116, 38, 60,204,167,240, 63,113,223,193, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 35, 69, 21, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 55, 37, 73,191,210, 44, 92, 64, 12, 20,134,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 11, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 15, 7, 34,
-190, 46,194,135, 62,148, 82, 36,191, 66, 22,185, 63, 53,135,211,190,172, 29,111, 62,229, 68,200, 62,140,167,253,190, 99,223,181,
-190,176,226, 35, 61, 50,158,144, 62,230,247, 53, 62,236, 25,253, 61, 52,215,226, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,214,199,202, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,152,163, 4,192, 16,189,233, 64, 39, 29,148,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 12, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,236, 25,179, 63, 27,158,127,
- 62,239,235,123, 63, 33,108, 59,190,103,198,244, 62,187,192,251,190,101, 39,179, 62,138,210,110,191, 54,168,145,190, 63, 20,208,
- 61,250,136,113, 62, 71, 45,109, 62,222,240,248, 62,125,172,108, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,109,210, 2, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,213,219, 83,192, 77,221,119, 64, 90,157, 98,191, 55, 81,192,191, 71,243,107,
- 63, 42,237, 98, 62,214,163,235,190,183,206,197,190, 61,137,205,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 13, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 4,225, 56, 63, 35,172,239,191, 4, 44, 92,
-190,112,166, 88,190,176,149,229, 63, 6,184,233,191, 44,120, 91, 63, 20, 36,208, 63, 79, 84,165, 61, 89,145,190, 60,192,154,154,
- 60, 43,233,206, 62, 0, 13, 68, 63, 87, 72, 51, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 32,131, 34, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,106, 39,118, 63,114, 29,130, 64,164,123,156,191, 55, 81,190,191, 71,243,107, 63, 42,237,102,
- 62,214,163,235,190,183,206,200,190, 61,137,205,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 14, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 97,119,190,205, 47,119, 63, 19,117, 35, 62, 98,125,166,
- 62, 73,195,242, 62,243,228,124, 63, 11, 86,119, 62, 89,156, 70, 63, 88,232,230,190,204, 53,130, 63, 54, 27,149, 62,133, 38,243,
- 60, 53, 55,232, 60,143,130, 91, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,253,129, 53, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192,102, 71, 4,190,194,109,241, 64, 47, 39,108,191, 55, 81,192,191, 71,243,107, 63, 42,237,100, 62,214,163,233,
-190,183,206,198,190, 61,137,204,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 15, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,105,157,127, 62,184, 8,148,191, 7,109,181,191, 68,194,177,190,220, 77,163,
- 63,101,120, 58, 61, 25,105,241, 62, 86,197, 69,190,236, 78,214, 63, 46,136,126, 61, 22,203,152, 63, 61,161,132, 62, 79,196, 67,
- 60,160, 22, 79, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 93,148,112,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,214,224, 12,192, 5,182,225, 64,136, 59,246,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 24, 46,192,191, 43, 20, 41, 62,183,184,186, 62,136,173, 42, 63, 50, 75, 75, 62,126, 83, 40,
- 63, 8,195,188, 62,238,211,234, 61,152, 36, 69, 62,145,106,235, 62,131, 28,211, 60, 46,255, 24, 60,139,165, 11, 63, 55, 88,113,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 57,122, 93, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 92,158, 95,
-192, 67,243,117, 64, 70,154, 16,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 17, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191, 4,175,102,190, 50,200,160, 63, 77,214,248,190,110,194,226, 61,198, 10,138, 62, 62,213,210, 61,253,163,141,
- 61,160,130,106,191,101,229,201, 62, 50,145,103, 61,104, 55,112, 61, 9, 23, 14, 62,129, 82,208, 63, 40, 65,176, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 60,220, 81, 89, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 31,234, 87,192, 65,234,204,
- 63,172,200,110,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 18, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 99,180,162, 62,145,169,127, 62,174, 95,114,189,223,121,169, 63, 73,190,173,190, 51, 72,118,190,162, 48,116,189,139, 98, 59,
- 62,191,245, 77, 61,253,124, 75, 60, 48,252,197, 62, 62,176,163, 63, 72, 93,216, 60,166, 65, 94, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 12, 69, 81, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,189,122, 76,191,102,243,238, 64, 93,253,158,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 19, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,218,139, 33,
-190,222, 81,160,190,151, 71, 75,191, 88, 33, 47,190,128,174,152,190,107,218, 43,190, 66, 96, 40,190,113, 29,219,190,184,240, 89,
- 62,204, 92,153, 62,135,159,101, 62,174,216,253, 62, 96, 99,217, 62, 50,171,104, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,207, 27, 5, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, 75,227, 61, 78,124, 48, 64,171,150,200,191, 55, 81,190,
-191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,190, 19, 92, 62,147,203,188,
- 62, 2,242, 19, 63, 95,138,223, 60, 24, 50,144, 63, 64,174,148,191, 11,158,196, 63, 64, 22,220,190, 19, 35, 98, 62, 44, 93,217,
- 63, 58,115,191, 60, 2,198,121, 59,167,102,254, 62,132,100,178, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62, 27,176,189, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,139, 37, 24, 63, 62,231, 4, 64,179,205,174,191, 55, 81,188,191, 71,243,107,
- 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,206,191, 80, 38,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 21, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,239,220, 87,191, 46,204,168, 61, 84, 95, 78,
-191, 58,105, 8, 63, 43,245,231, 62,151,254, 91, 61,206,143, 77, 63, 42,139,177,190,196,107, 26,190,139,211,150, 63, 92, 23, 50,
- 61, 15, 27,169, 60, 83, 43, 8, 61,189, 83, 59, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 49,221,121, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,225,247, 32,192, 81,175, 37, 63,198,254,248,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 22, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,130,132, 59,190,120,166,131,191,109,191, 15, 61,238,164,170,
-190, 78, 93, 20,189,231,164,245, 62, 16,254,254,190,234,189, 61,189,116,167,116, 63, 16,175, 67, 61, 2,132, 66, 61,189, 37,191,
- 63, 64, 5,173, 62, 0,181, 91, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63, 2, 93,129, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,165,110,200, 62,239, 43,183, 64,169,243,129,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 23, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 49,218,173,191, 23,109,113, 62, 55, 16, 32,190,188,117, 54, 62,208, 20, 25,
-191, 46,245,118,186,236,158, 72,191, 97, 10, 55, 62,183,128,140,190,146,230,177, 63, 66,109, 62, 61,170,159,244, 60,243,150, 79,
- 62, 2,136, 69, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 48, 85, 96,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191,243,158, 12,192,104,237,244, 63,155, 34,138,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 49, 22,155, 62,165,232,223,191, 6,208,133,190,190,253, 93,190,194,234,190,191, 29, 89,239,
-191, 23,110,134,191, 30,217, 8,190,205,159,107,190,185, 94, 18, 60, 92,106,228, 61, 35, 25, 23, 63, 93,111,136, 61,167,105,211,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,132,153,252, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 8, 74,118,
-192, 1,240, 0, 64,108,123, 28,191, 55, 81,190,191, 71,243,107, 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,205,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 25, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,104,155,217,190, 29,164,215,190,179, 60,175, 62, 43,201,201, 61, 67, 60,100,189, 90, 42,171,191, 4, 85, 68,
- 62,130,249, 67,190,133,199,230, 63,107, 14,149, 62,101,242,233, 61,181,120,181, 62, 43,136,231, 63, 4,241,245, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,108,179,252, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,231, 24, 26,191, 21,105, 44,
- 64, 98, 32,186,191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 26, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 49, 52,126, 63, 43, 9,201,190, 96,234,166,190, 37,210,182, 61, 54, 58,206, 63, 63, 1,231,191, 34,173,133,190,170,154, 5,
- 63, 51,112, 93,191, 23, 61, 18, 62,138,189, 66, 62,210,103,114, 62, 62,128,117, 62, 7, 54, 35, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,126,132, 33, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 5, 52,141,192, 49,103, 10, 64, 37,154,230,
-191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 27, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32, 96, 77,
- 62,160,201,185, 63, 6, 3,160,190,248, 34, 11, 60,185, 53,206, 61,178,197,192, 63, 53,184,174,190,162,172,223, 62,224,136,109,
-191, 61,173,142, 61,184, 47,132, 61,207,157,244, 62,225, 0,168, 62,189, 11,249, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,150,112,248, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,177, 45,136, 63, 99,253, 22, 64,155, 58, 8,191, 55, 81,190,
-191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,202,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 28, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55,202, 47,190, 89,235,249,
-190, 92, 18,127,191, 32,129,146,190, 8,212, 7,190,171, 50,167, 62,123,120, 97,189,249,152,232, 62,149, 18,140, 61, 13,111, 37,
- 63, 28,253,147, 62,184,184,231, 60, 58, 48, 48, 60,111, 78, 59, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 18, 61,115, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 57,255, 42,192, 65, 4,235, 64, 19, 7, 77,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 29, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,133,218,208,189,176, 10,116, 63, 10,237,186,
- 63, 85, 61, 14,190, 38,219,182, 62,206,175,174, 63, 10,240, 47,190,114,232, 31,190,207,162, 91,190,193, 85,173, 61,128,255,228,
- 61,172, 32, 76, 63, 5,152,147, 62,169,134,205, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 60,212, 38, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,137, 68,184, 61,226,177,204, 64,141,247,196,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 30, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,146,138,133,187, 8, 75,133, 62, 68,235, 28, 63,122,141,122,
- 63, 92,117,116,190,125,147, 7,190,147, 49, 87, 63, 41, 88, 9, 63, 2,255, 63, 61,126, 44, 71, 63, 0,166,107, 62,154, 29, 23,
- 61,165,214, 34, 61,236,130, 42, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,103,170,241, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 82,103, 22,191,201, 75, 73, 64, 0,247, 1,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,168,120,231,191, 7,154,179, 63, 48,180, 41,190,187,232,239,191,104, 35, 9,
- 62,114, 8,222,190,177,143, 76,191, 28, 29,107, 62,234,112,210,190, 92,249, 9, 59,118,109, 73, 63, 4,155,168, 62,243, 2, 73,
- 59,108,198,186, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,184, 4, 74,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191,246,241,194, 62,236,130, 87, 64,135,209, 50,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,223,197,124,190,189,243, 32,190,140,213,199,191, 69,149, 13,190,199,235,221, 62,240, 79,159,
-190, 14,202,113,190, 60,168,186,190,220,145, 5, 62,148, 8, 42, 62,219, 99, 49, 62,242, 73, 85, 61, 79, 14,127, 61, 67,141, 68,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,192,236,157, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,149,228,224,
-190,221, 13,233, 64,145,251,210,191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,199,190, 61,137,204,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 33, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,190,190, 19, 92, 62,147,203,188, 62, 2,242, 19, 63, 95,138,223, 60, 24, 50,144, 63, 64,174,148,191, 11,158,196,
- 63, 64, 22,220,190, 19, 35, 98, 62, 44, 93,217, 63, 4,141,198, 62, 19, 71, 3, 61,174,186, 60, 62,129,146, 99, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 27,176,189, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 89,120, 0,190,120,169,164,
- 64,155, 78, 26,191, 55, 81,192,191, 71,243,109, 63, 42,237, 98, 62,214,163,234,190,183,206,197,190, 61,137,202,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 34, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 94,201,118, 62,213,189,192, 62, 67, 27,142,190, 55, 93,214,190,131,154, 6,190,178, 48,133,190,192, 11,139,189,147,123, 39,
-191, 57,130, 29,190, 33,253, 46, 63, 24, 89,224, 61,198,174,189, 61,101,152, 2, 62,128,237,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,117,122, 59, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 26, 80, 92,189,239, 3,232, 64, 99,210,182,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 35, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,153, 16,148,
-191, 33, 1,224, 62,168,253, 43, 63, 35, 36,254,191, 19,255,124,190,138, 97, 70, 62, 6,109,188,190,223, 58, 64,189,189,121,154,
- 62,170,126, 9, 62,126,248,115, 63, 12, 41, 84, 62, 4, 55,153, 61,152, 85, 62, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,106,244, 74, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190, 70,245, 80,192, 37,148,136, 64, 57,107, 41,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 36, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,246, 44, 62,140,102,200,
- 63, 10,199,154, 63, 32,102, 40,191, 19, 10, 78,190,250,238,224,190,111, 13, 0, 61,187,232,243, 62, 99, 10,106, 62,221, 96,163,
- 61,239,237,208, 61,210, 34, 10, 62,181,101, 62, 62,218, 22,205, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 25,143, 35, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 25,172,253,191,249,234, 68, 64, 73,217, 59,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 37, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,109,205,190,189, 47, 67,189,155,119,205,
-191, 79, 53,238,191, 88,144,223, 62,146,163, 88,190,208, 99, 63, 62,130,235,236,190, 17, 10, 72, 63, 15,223,124, 62, 64,172, 12,
- 62, 51, 24,160, 62,156, 49,145, 62,169,236, 26, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 72,237,254, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,192, 60, 63, 77,191,245, 70,192, 63,248,177,246,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 38, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 16,162, 50,190,219,180, 33,190,177,166, 24,191, 29, 8,234,
-190, 48, 26, 24,190,115, 70,240, 63, 54,197, 0, 62, 75,201, 69,189, 10,174, 28, 63, 78,128, 81, 60,175,109,172, 62,214,135, 7,
- 63, 9, 12, 59, 60,198,154,150, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,138, 50, 34, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,162,125, 6,192, 64,233, 63, 64, 86,167,147,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 39, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 11,120,234,190,253, 35,200,190,233,152, 2,191, 0, 38, 0,191, 36, 3,214,
-190, 45,239, 3,191, 9,175,135,190, 42,130, 18, 63, 38,197,156,190,238, 37,181, 61,119, 49, 4, 60,224,251,119, 62, 47, 5, 94,
- 63, 61,195,188, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,191,162, 89,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-192, 27, 96,184,191,179, 23,251, 64, 38, 77,193,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 40, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 32,231,177, 62,239, 89,150,190,188,156,128,191, 0, 45,225, 62,210,133,247, 63, 40,169, 51,
- 63, 26,184,146,190,223, 39,209,191, 15,238,182,190,146, 63, 75, 61,213,161,166, 62,218,242,217, 62,191, 18, 39, 61,194, 74, 89,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,129,236, 81, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 21, 0,185,
-192, 14,241,137, 64, 61, 27,206,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 41, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,190,213, 79,214, 63, 10, 19, 95,191, 56, 25, 60, 62, 10,193,193,190, 10,232,127,190, 93,126,162, 63, 7,169, 25,
-190,221,209, 38, 62,186,214, 52,191, 41, 63, 21, 62, 27, 36, 58, 62, 28,151,245, 62,179, 23, 82, 62,177, 10,148, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 41,241, 98, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189, 57, 80, 64,191,166, 80,193,
- 64,123,172,242,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 42, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,232,174,160, 61,164, 99, 64, 63, 12,108, 41,191, 50,126,106, 62,124,117, 66, 63, 82, 54,134, 62,191, 55, 38,190,197,232,121,
-189, 70,203,188,191, 51, 88, 26, 62,170,225,199, 62, 23, 67,114, 62, 33, 56,202, 62,184,224, 26, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,138,213,216, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,219,106,202, 63,127,216, 17, 64,173,251,140,
-191, 55, 81,190,191, 71,243,110, 63, 42,237, 98, 62,214,163,235,190,183,206,198,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 43, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,213, 79,214,
- 63, 10, 19, 95,191, 56, 25, 60, 62, 10,193,193,190, 10,232,127,190, 93,126,162, 63, 7,169, 25,190,221,209, 38, 62,186,214, 52,
-191, 41, 63, 21, 63, 79,203, 10, 62, 32, 14,104, 60, 44,238,252, 60,175,180, 55, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 41,241, 98, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 91, 39,111,191,150, 81, 64, 64, 15, 68, 89,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 44, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0,212,130,191, 38,161, 15,
-190,123,203,131,191, 3, 48,207, 63, 64, 6,112,190, 34, 53,137,191, 6,202,175, 62, 19,241, 66,190, 85,105,119, 61,146,246,149,
- 60, 25, 88, 25, 63, 25, 74, 85, 62,196,185,199, 59,249,179,210, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 90,223,198, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 40, 17,231,190,153, 44,141, 64,161,123, 68,191, 55, 81,190,191, 71,243,107,
- 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,205,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 45, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 68,219, 69, 62, 74, 75,190, 62,229,129,250,
-190,210, 78,198,188, 59, 63, 65, 62,214,173,173, 62, 85,159, 18,189,185,160, 25,191, 46,193,169,190, 77, 21,177, 63, 32,133,202,
- 61, 36,163, 25, 60,225,136, 45, 62,156, 71,133, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61,141,208, 22, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 95, 50,191,249,101, 34, 64,132, 96,176,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 46, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,236, 25,179, 63, 27,158,127, 62,239,235,123, 63, 33,108, 59,
-190,103,198,244, 62,187,192,251,190,101, 39,179, 62,138,210,110,191, 54,168,145,190, 63, 20,208, 62,138, 45, 62, 61, 30,142, 35,
- 61,128, 78,173, 63, 32,246,170, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,109,210, 2, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 6,133,111,191,225,152,167, 64, 32, 16, 84,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 47, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,241, 57,184, 62,173,244,209, 61,188,195,202, 63, 79, 10,229,191, 34,223, 15,
-190, 40, 65,171, 61, 38,228,158, 63, 12,225,187,189, 13,196,198,191, 14,253,185, 61,217,107,245, 62,174,147,253, 62,218,232,227,
- 62, 0, 80, 70, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,183,168, 8,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-190,228, 99, 80,191, 51, 59, 44, 64,133, 75,221,191, 55, 81,192,191, 71,243,109, 63, 42,237, 98, 62,214,163,234,190,183,206,197,
-190, 61,137,202,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 48, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 23,191, 52, 62, 82,209,247, 62,204, 21, 34, 63, 43, 58, 21, 61,139, 3, 1, 61,135,159, 52,
-189, 36,117, 30, 62,244,123,230, 62,185,104, 79, 63, 33, 73, 17, 62,213,208,117, 62, 76,118,118, 62, 5,254, 32, 62,128,245, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 4,246,179, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 74,101, 85,
-191,105,185,166, 64, 36,141, 18,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 49, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 3,157,221, 62,215, 81, 67, 63, 5, 46,135,191, 9,108,121,190, 16, 83, 37,190,130,244, 37, 62,216, 18,191,
- 63, 53, 44,221,189,162,136,153,190,252,138, 80, 61,102,214,221, 63, 25, 22, 50, 62,157, 42,139, 61, 30,113,164, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 26,208,145, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,218,234,122,191,232,177, 50,
- 64, 42,174,108,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 50, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 59, 41, 98, 61,252, 70,236,191, 25, 96, 77,190,154,195, 33,190,242,119, 31,190,204, 79,125,190, 18, 53, 23,190,214, 31,102,
-190,199,174,165,188,169,105, 48, 62, 8, 50,229, 62,148,251,227, 62,206, 65,133, 62, 49, 82, 75, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 5,230, 44, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,206,106,254, 62,150, 36,205, 64,137, 42, 96,
-191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 23,191, 52,
- 62, 82,209,247, 62,204, 21, 34, 63, 43, 58, 21, 61,139, 3, 1, 61,135,159, 52,189, 36,117, 30, 62,244,123,230, 62,185,104, 79,
- 63, 33, 73, 17, 62,231, 15, 87, 62,207,237, 49, 61,141, 43,254, 61,150,225,226, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 4,246,179, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,167, 61,200,191,171, 5,119, 64,147,214, 86,191, 55, 81,190,
-191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 52, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70, 39,111,188,218,103, 91,
- 63, 30, 24, 44, 62, 12, 81, 28, 63, 16,129, 26, 61,162,153,215,191, 31,203, 11, 63, 2,132,222,190,154, 4, 26, 62,100,112,202,
- 62,214, 36,216, 60,122, 85,172, 60,142,247, 44, 63, 12,140,132, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,115, 61, 48, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,251, 14,194,190,105,213, 44, 64,109,188,165,191, 55, 81,190,191, 71,243,107,
- 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 53, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 3, 49,173, 63, 9,133,178, 63, 16, 18,104,
- 62,186, 16,159, 62,245,147,183, 62,111, 88,220, 63, 2, 25,220,191, 77, 44, 80, 62,152,136, 76, 61,176,242,126, 62,155, 13,239,
- 62,234, 17, 40, 62, 13,128, 92, 61,208,130,226, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 62,208,147, 65, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,192, 46, 47,102, 63, 45,212, 64, 64,127, 35, 61,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 54, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48,164, 8,191, 38,100, 32,190,157,157,163, 61,167, 78, 10,
- 59, 54, 8, 4,190,147,155,139, 63, 50, 41, 11, 62,140,101, 27, 63,110,237,241, 59,179,188, 18, 62,165, 31, 74, 63, 37,208,207,
- 60,141,227, 74, 60, 76, 28, 8, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62, 80, 24,129, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191, 83,203, 10,192, 29, 15,133, 64, 42, 82,237,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 55, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,232,194, 41, 63, 35,110,156,190, 75,200,233,191, 22,158,170,189,193,122, 83,
-189,149, 58,217,191, 18, 15, 80,189,145, 37, 66,189,219,184, 98,191, 86,185, 70, 61,239,150, 21, 62, 24,193,130, 62,217, 71, 46,
- 62,158,114,141, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 75,231,122,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,102, 71, 47,191, 44, 13, 16, 64,156,187, 24,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,
-190, 61,137,201,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 56, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,190, 61, 40,120,191, 15,196,150,191, 54,219,159, 62,191,195,234,190,122, 96,104,191, 74, 71,193,
-190, 56,230, 15, 61,203,156, 61, 61,177, 39,227,190,193,222, 25, 63, 13,206,178, 60,237,101,144, 60,198,227, 16, 62,201, 30, 16,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,189,137, 74, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,252,210,140,
-191, 44, 58,216, 64,149,217, 98,191, 55, 81,192,191, 71,243,109, 63, 42,237, 98, 62,214,163,234,190,183,206,197,190, 61,137,202,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 57, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,152, 86,191, 17,225,169,189,140,217, 57,190,254,124, 67, 62, 17, 65, 13, 63, 15,204,229, 62,241,148,180,
-191, 73,210,175, 63, 21,161,182,188,169,222,186, 63, 4,174,235, 61,156,216,125, 61,115,228,114, 62,176,239,124, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61,165,104, 86, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 46,210,181,191,135, 4, 59,
- 64, 44, 99,164,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,202,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 58, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 45, 97,119,190,205, 47,119, 63, 19,117, 35, 62, 98,125,166, 62, 73,195,242, 62,243,228,124, 63, 11, 86,119, 62, 89,156, 70,
- 63, 88,232,230,190,204, 53,130, 61,201, 69,154, 63, 3,143, 74, 62,162, 10,155, 61,146, 21,186, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,253,129, 53, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60, 64,235, 64, 63,147,210,203, 64,185, 32,205,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 59, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,136,137,130,
-191,106, 7,101,190,155,249,249, 60,155,218,146,188,184,212,179,189,201,215, 68,191, 61,244, 40, 61, 70,234,114,191, 1,226,154,
- 63, 91,139,119, 63,109,168,135, 61,112, 44, 87, 59,115, 72,106, 60, 24, 90,214, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 87, 40, 6, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 0,185,160,192, 38,235,197, 63,245,221,182,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 60, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,241, 54,241,190, 60, 75, 25,
-190,166, 31,137, 63, 76,162, 26, 62,180, 23,214,191, 22, 28,134, 62,184,125,189, 63, 49,143,170, 62,208,100, 42, 63, 12,182,201,
- 61,103,123, 85, 62, 90, 65,230, 63, 29,215, 33, 61,233, 5,124, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 78, 6,233, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,247,118,132,192, 8, 66, 87, 64, 20, 88, 93,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 61, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,157,149,183, 62,150,241,169, 63, 5, 72,210,
-191, 61, 98,196,191,103, 43, 94, 62, 13,249,141,190, 28, 40,108,189, 89,143,180, 62,180,169,159, 63,102,210, 50, 61,186,245, 15,
- 62,140,211,252, 62,252,184,237, 62, 15,107,164, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,126, 53,234, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,190, 2,252, 96,192, 63, 32,189, 64, 40,176,249,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98,
- 62,214,163,235,190,183,206,198,190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 62, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,185,185,227,190,133, 55, 69, 62,246,101, 76,191, 65, 32,146,
-190, 47,142, 11,191, 16,240,207, 60,250, 47,178, 62,135, 12,147,190,192,130,250, 63, 63,224,182, 61,141,251,109, 61,135, 15,209,
- 62,212,122,152, 62,230, 66,150, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,201, 22,194, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192, 60, 37,186,192, 19, 36,209, 63,212,102,200,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 63, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,253,116,133, 63, 23,178,160,191, 32, 78,114, 61,221, 97, 57,189,236,244,191,
- 62,214, 56,206,191, 40,142, 77, 61,161, 48, 31, 63, 7, 95, 82,190, 62, 70,244, 59,141,146,144, 62,182,189, 24, 63, 34, 24, 12,
- 59,183, 33,242, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 90, 4, 51,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,155,165, 62,191,200,188, 35, 64,140,201,156,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 64, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,205,198, 68, 63, 99, 21, 50,190, 86,246, 18,189,178, 24,237, 62, 74,177,229,190,174, 94,233,
-189, 17,113, 14, 62,211,148,144,190, 80,182,157,191, 66,214, 18, 62,182,112, 54, 61, 2,202,156, 61, 40,146, 65, 63, 18, 18, 24,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,124, 84,229, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 48,150,
- 62,211, 14,133, 64,175,209,120,191, 55, 81,190,191, 71,243,107, 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,205,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 60,181, 0, 30, 63, 39, 21,183,191, 42, 28,174, 62,185,254,206, 61,180,101, 60, 62,162,164,224,191, 78, 22,169,
-190,146,164, 15, 62,188, 47, 66,191, 63,255,233, 63, 76, 61, 26, 60,171,234,214, 60, 47,187,230, 62, 46,146,126, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 41,195,113, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 98,144,196,191,112,190, 62,
- 64,138,224,153,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-190,148, 80,255, 63, 5,138, 17, 62, 38, 16,171,191, 73, 50,107, 63, 32,126,214, 62,148, 14,143,191, 4, 31,183, 62,145,152, 70,
-189, 89, 32, 21, 62,100,239, 63, 62,220,212, 51, 61,238, 96, 49, 61,205,246, 1, 62,180, 22, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 76, 33,247, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 2,243, 80,191, 91, 84, 18, 64, 77, 0,110,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 67, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 69,146, 49,
-190, 69,123,236,191, 26,188,179,189, 47,182,207,191,105, 14, 96,190, 31,120, 55, 62, 18, 41,138,189,183, 73,210,189, 57, 99,105,
-190,137,155, 32, 62, 79,143,112, 62,220, 36, 13, 62,119,171,207, 62, 0,124,168, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,199,151,184, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 34, 81,228,192, 39, 55,178, 64, 68, 36, 87,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 68, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 3,148,230, 62,239, 68,224,
- 62,241, 64, 72,191, 11, 35, 71,191, 31,202,248, 62,182, 98, 68,191, 48,127, 18,189, 26,108,158,190,173, 93,145,191, 16,155,161,
- 61,244, 72,144, 61,173, 98,152, 62,154,243, 16, 62,252,162, 38, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62,245,111, 69, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,132,206,226,191,254,157,153, 64, 57, 78, 61,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 69, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,217, 64, 45,190,213, 24,151, 61,187,174, 94,
- 63, 76,136,102, 63, 32, 1, 27,189,162, 95,236,191, 29, 18,124,190,155, 78, 75,191, 43,134,124,190,184,202,174, 62, 35,138, 49,
- 62, 85,209,237, 62,186, 75,126, 62,137, 6,113, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 61, 76,100,111, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,237,163,228,192, 58, 20, 55, 64, 64,122, 9,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 70, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189, 55, 95, 82,190,181, 21, 43,191,101, 3,230, 62,137,248, 87,
- 62, 75,208, 4, 59,115,115, 0,190, 95,196,100, 62, 83, 15,191,191, 81,222, 84, 62,169, 58, 36, 61,163,215,187, 61, 92,207, 90,
- 62,152,248,188, 63, 17, 59,182, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,112,119,230, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191,148, 59,202,191, 56,242,188, 64,113,111,189,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 71, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,192, 21,202, 63, 8, 22,216, 63, 66, 84,188, 62,186, 70,158, 62, 98,211,240,
- 62,155, 7,124, 62,246,134, 10,190, 79, 16,110,189,252,197,248, 63, 39,188, 81, 62,169,204, 42, 62,154,195,204, 62, 51,225,146,
- 62, 66,254,125, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 81, 26,123,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-191,252,179, 34,191,184,102, 86, 64, 51,174,169,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 72, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,190,144, 50,232,191, 50, 31,207,191, 40,203,179,189, 45, 99,214,190, 34,153,109,191, 10, 94,239,
-190,212,186,115,190, 19,234, 42,191, 97, 26, 72, 61, 99,105,122, 62, 21,210, 46, 62,186, 32,250, 62,178,126,195, 62, 16,238, 85,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 60,124,240,131, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 77,244, 1,
-190,163, 52, 51, 64, 62,234, 30,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,190, 61,137,202,
-191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 73, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,112, 41,126, 61,164,166, 56, 61,240, 4, 91, 62,161,172, 15,190,191,126,106, 63, 64, 33,117, 62,184,227,130,
-190,244, 20, 92,189,180,168,210,191, 43, 25, 60, 61,198,246, 89, 63, 46,130, 30, 62, 54,241,223, 61, 46, 41,221, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,107,196,190, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,122, 27,255,191,133,229,179,
- 64,149, 39, 66,191, 55, 81,190,191, 71,243,107, 63, 42,237,102, 62,214,163,235,190,183,206,200,190, 61,137,205,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 74, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 24, 46,192,191, 43, 20, 41, 62,183,184,186, 62,136,173, 42, 63, 50, 75, 75, 62,126, 83, 40, 63, 8,195,188, 62,238,211,234,
- 61,152, 36, 69, 62,145,106,235, 62,239, 4,216, 61, 21,100,235, 61, 20, 73,174, 62,235,197, 83, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 57,122, 93, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,151, 66, 20,192, 62,139,208, 64, 5,118, 98,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 75, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 32,160,159,
-191, 52, 39,190,191, 9,138,142, 62,224, 13,138, 62,242,218,166, 63, 26, 71, 93, 62, 52, 22, 36, 62,124, 52,231,190,192, 91,165,
-191, 86,111,148, 61,120,101,212, 61,221, 26, 72, 63, 22, 82,158, 62,122, 14,241, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 22, 96,195, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190, 46, 63,224,191,107,105,222, 64,132,191,198,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,201,190, 61,137,200,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 76, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55,202, 47,190, 89,235,249,
-190, 92, 18,127,191, 32,129,146,190, 8,212, 7,190,171, 50,167, 62,123,120, 97,189,249,152,232, 62,149, 18,140, 61, 13,111, 37,
- 62,204,238, 89, 62, 39, 90, 10, 62, 6,156,123, 62,156, 22, 98, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 18, 61,115, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,234,148,250,192, 97,179, 11, 64, 3,215, 16,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 77, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,248,227,177,190,192,134,160, 62,184,159,155,
- 63, 51,157,105, 63, 54, 56, 2, 62,182,126, 88,187, 4,207,108, 62,198,216, 38,191, 73, 66,140, 61,248,126,139, 60,119, 26,251,
- 60,150,207, 34, 63, 20,176,170, 62,197,120,225, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 62,216,234,208, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,135,177,202,192, 86,220,150, 63,239, 9,144,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 78, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 18,122,201,190,163, 68,155,191, 39, 36,236,190,194,182,221,
-190, 98, 47,217,190,230, 46, 97, 62,134,236,197, 60,187, 40,216,189,179, 92,111, 63, 54, 17, 71, 61, 5,169, 87, 61, 92,116,120,
- 63, 38,253,179, 62,133,192,225, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 60,154, 58,100, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,192,108,105,213, 62,223,145,125, 64, 82,182,192,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,
-190,183,206,198,190, 61,137,206,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 79, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 32,244,195,190,218,189,174, 62, 55, 11,163,191, 95, 75,157,190,243,155, 33,
-191, 90, 86,180, 62, 86,237, 57,190,126,198,226, 61,101, 34, 30,190,180,239, 93, 61,204, 82,206, 63, 89,113, 44, 61, 23, 63, 63,
- 60,100, 33,220, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 50, 63, 6,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,243, 23, 76,191,166,133, 46, 64,134,153, 78,191, 55, 81,192,191, 71,243,109, 63, 42,237, 98, 62,214,163,234,190,183,206,197,
-190, 61,137,202,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 80, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 49,218,173,191, 23,109,113, 62, 55, 16, 32,190,188,117, 54, 62,208, 20, 25,191, 46,245,118,
-186,236,158, 72,191, 97, 10, 55, 62,183,128,140,190,146,230,177, 62,190, 2,159, 61,193,141, 29, 61,214, 93,214, 62,220, 2,164,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 48, 85, 96, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,214,192,130,
-192, 73, 57,182, 64, 23, 83,175,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 81, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,191, 34,172,206, 62,187, 79, 64, 62, 11,197,140, 63, 42,135,199, 61,148, 91,100, 60, 25, 75,123,189,232,126, 54,
-189,220,190,210, 62,186,158, 9,190,225, 62,182, 61, 84,103,211, 61,115,194, 92, 62,253,216,148, 62,201, 34, 41, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,162,103, 38, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192,133, 4,122, 62,128,136,109,
- 64, 58, 58,136,191, 55, 81,190,191, 71,243,107, 63, 42,237, 98, 62,214,163,235,190,183,206,198,190, 61,137,206,191, 80, 38,157,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 82, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,137,206,147, 63, 11,207,234, 62,225,144,195, 63, 40,225,162,190,148, 69, 24, 61,190,238, 50,191, 86, 31, 13, 63, 71,106,217,
- 62, 1, 60,247, 62,136,250,162, 58,156, 80, 70, 63,108,100,142, 61,153, 72, 15, 58, 17, 35,116, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 60, 41,199,174, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 12, 40,132,192, 1, 32,102, 64, 95,178,222,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 83, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95, 57,157,
- 62,214,148,238, 62,109,249, 87,189,204,220,227,189,221,118,238,191, 19,162,121,191, 48, 50,203,190, 80,232, 58,191, 8,100,141,
- 63, 19,142,229, 62, 88,196,223, 61,237, 94,134, 62, 97, 5,141, 62,231,195, 43, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 15, 11, 75, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 80,109,211,192, 20,210, 96, 64,103,253,246,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 84, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,133, 32, 88,190,189,201, 13,
- 63, 66, 43, 55, 62,239,254, 76, 62,179,163,254,188,171,181, 15, 60,196, 8,130,191, 14, 27,214,190,128, 32, 86,190,208, 27,190,
- 62, 53,196, 69, 61,135,184,136, 62, 35,250,240, 63, 24,153, 34, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62,234, 93,224, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,147,142,240,190,166, 7, 43, 64,130, 69, 61,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 85, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,246, 44, 62,140,102,200, 63, 10,199,154,
- 63, 32,102, 40,191, 19, 10, 78,190,250,238,224,190,111, 13, 0, 61,187,232,243, 62, 99, 10,106, 62,221, 96,163, 62,206,243, 56,
- 62,159,170,109, 62, 2,145,224, 62, 32, 50,211, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63, 25,143, 35, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 89,254, 2,192, 85,197,195, 63,254,197,176,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 86, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,204,125,122, 63, 46, 10, 37,190, 26, 71, 69, 63, 24,168,130,
-190, 36,105,117, 63, 32,220,144, 62,231,167, 11, 62,179,145,151,190, 36, 72, 33,191, 50, 67, 42, 61, 11, 3,111, 61, 76, 2,241,
- 63, 28,181,231, 62,155,179,103, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,188,186,244, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191,253, 46, 24, 61,214,126,200, 64,125, 1,248,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,
-190,183,206,197,190, 61,137,202,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 87, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,181,218,171, 63, 80,100,162,190,175, 18, 86,190,157, 51,142,191, 4, 35, 18,
- 62,210,113,207, 63, 11,170, 0,190,165,126,134, 62, 59, 47,141,191, 62,163,104, 62,181,251, 18, 62,242,163,225, 61,191, 98, 90,
- 61,158, 33,220, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,104, 76, 83,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-192, 94, 18,115, 61, 49, 61,112, 64, 71,153, 90,191, 55, 81,190,191, 71,243,109, 63, 42,237, 98, 62,214,163,236,190,183,206,197,
-190, 61,137,202,191, 80, 38,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 88, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,112, 41,126, 61,164,166, 56, 61,240, 4, 91, 62,161,172, 15,190,191,126,106, 63, 64, 33,117,
- 62,184,227,130,190,244, 20, 92,189,180,168,210,191, 43, 25, 60, 61,190,188,141, 63, 68,157,118, 61,224,119,105, 60,239,129,112,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,107,196,190, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191,141, 34, 38,
-192, 39,140,222, 64, 25, 55,182,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 89, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 85, 40,193,190,146, 79,120,190,203,249, 68, 62,131,217,207, 63, 22, 65,229, 63, 63,104,120,189,124,135,173,
-190,190,179,131, 62,171, 81,208, 63, 69,132,211, 61,189, 6,122, 62, 23,195, 58, 62,254,114, 6, 62,134,106,189, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 20,102,179, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 63, 14,149,191,165,204, 64,
- 64, 24, 96, 12,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 90, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 30, 81, 54, 62,223, 39,157, 63, 11, 30,214, 62,186, 51, 76, 62, 83,228,206, 61, 0,146,209, 63,121,106, 22,187, 6,124, 44,
-187, 71,233,128, 62,173,190,218, 61, 83, 67, 14, 63, 4,186,192, 62,197,206, 39, 61, 50,159,178, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 60, 52, 19,208, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 22,180,183,192, 4,173,126, 64, 8,189,240,
-191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 91, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 20, 59,104,
- 63, 17, 36, 30,190,252, 57,112, 62,162,101, 32, 62,160, 6,139, 61, 80,160, 57, 61,245,243,109,190,224, 18, 41,188,227,154,182,
-190,139,196,238, 61,131, 49,133, 62,167, 33,130, 63, 5,225,160, 61,177, 59,124, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 56,166, 20, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 97,160, 35,191,163,220,129, 64,141,248,194,191, 55, 81,190,
-191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,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,
- 8,194, 92, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,157,149,183, 62,150,241,169,
- 63, 5, 72,210,191, 61, 98,196,191,103, 43, 94, 62, 13,249,141,190, 28, 40,108,189, 89,143,180, 62,180,169,159, 63,102,210, 50,
- 62,206,174, 78, 61, 93,159, 68, 61,118, 84,160, 62,246,211, 54, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,126, 53,234, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,192, 18,223, 4,191,140,169,155, 64, 57, 18,151,191, 55, 81,190,191, 71,243,109,
- 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,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, 8,194, 93, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 44, 63,186, 62,136,104,134, 63, 32,117, 44,
-190,147,227,178, 63, 90, 77,254,190,175,117, 0, 62,167, 69,119, 61,138, 73,238, 62,189,211, 58,191, 37, 28,210, 62, 21, 96,245,
- 62,227,104, 35, 62,154, 62, 83, 61,222,164, 64, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 62,151, 27,130, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,191,179,193,100,192, 78,111,251, 63,228, 64,166,191, 55, 81,190,191, 71,243,109, 63, 42,237,100,
- 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 94, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 4,101,129, 63, 0, 90,237,190,239,125,104, 63, 3, 31,131,
-190,212,160,200, 63, 27,217,115,190, 6,189, 55,190, 22,223,131,190,223,241, 4,190, 0, 70, 4, 61, 35,242, 37, 61,171,214,204,
- 63, 46, 25,175, 62, 72,177, 82, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 62,202,249,184, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0,191,124, 90, 93,191,212, 48,113, 64, 74,208, 56,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,
-190,183,206,200,190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 95, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,236, 25,179, 63, 27,158,127, 62,239,235,123, 63, 33,108, 59,190,103,198,244,
- 62,187,192,251,190,101, 39,179, 62,138,210,110,191, 54,168,145,190, 63, 20,208, 62, 81,178,187, 62,108, 57,176, 62,153,177, 93,
- 62,135, 88,108, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,109,210, 2,
- 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-192, 33,231,251,191, 59, 2,132, 64, 66,162, 78,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,
-190, 61,137,199,191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 96, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,191, 24, 46,192,191, 43, 20, 41, 62,183,184,186, 62,136,173, 42, 63, 50, 75, 75, 62,126, 83, 40,
- 63, 8,195,188, 62,238,211,234, 61,152, 36, 69, 62,145,106,235, 62, 30, 15,217, 63, 4,209,227, 62,117,148,178, 61,178, 39,218,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 57,122, 93, 0, 0, 0, 0,
-255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,138,185, 2,
-192, 41,128,191, 64, 97,193,139,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,
-191, 80, 38,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 97, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,168,120,231,191, 7,154,179, 63, 48,180, 41,190,187,232,239,191,104, 35, 9, 62,114, 8,222,190,177,143, 76,
-191, 28, 29,107, 62,234,112,210,190, 92,249, 9, 61,250,196, 0, 61, 62,120, 79, 62, 31, 12,195, 63, 44,252,202, 0, 0, 0, 0,
- 0, 0, 0, 0, 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62,184, 4, 74, 0, 0, 0, 0,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,190,243, 63,242,191,159,176, 86,
- 64,111,150,245,191, 55, 81,190,191, 71,243,109, 63, 42,237,100, 62,214,163,234,190,183,206,200,190, 61,137,199,191, 80, 38,158,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 98, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-191, 58, 26,166, 62,159, 70, 1, 63, 2,111,113,190,173,187,235, 62,237, 51,116, 62,247, 53,130,190, 26,199,243,189,172, 88,235,
- 62,244,115,118,191, 5,147, 34, 62,158, 77,217, 62, 72,131, 43, 62, 68,208,119, 62,155, 8, 86, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,200, 0, 0, 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,110,152,253, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,191, 48,178,198, 62, 52, 39,138, 64,149,252, 39,
-191, 55, 81,190,191, 71,243,107, 63, 42,237,100, 62,214,163,235,190,183,206,198,190, 61,137,203,191, 80, 38,157, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,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, 8,194, 99, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,210,167, 41,
- 62,139,172,194, 63, 35,220,250,191, 22,182, 30, 61,136, 3,122,190,176,164,109,190,147,153, 30,188, 10,248,255,190,160, 90,234,
-190,205,241, 89, 63, 19, 71, 62, 62,107,215,111, 61,138, 71, 63, 62, 1,231,243, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0,
- 66,200, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 77,227, 37, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,206, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255,
- 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 15, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 84,231, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,151, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 15, 62,124,224, 31, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,207, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255, 63, 65,123,219,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152,
- 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,208, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223, 63, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,168, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,223,251,
- 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 59, 62, 65,155,142, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 23,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,209, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7,
- 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,223,255, 63, 2, 71,186,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 8, 61, 14, 61,255, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,199, 61,124,224, 15, 63,127,101,123, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,171,
- 61,197,143, 15, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,136, 62, 14, 62, 15, 63,187,172,163,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,151, 63,216,177,182, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 84,255, 62,124,224, 31, 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,210, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 7, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,243,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 15, 61,124,223,251, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 5, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,180, 62, 14, 62, 8, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,142,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,211, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7, 59,124,223,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,126,200, 61, 14, 61,247, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,135,
- 61,124,224, 7, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,107, 61,197,143, 11, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,104, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,137,251, 62, 65,155,145, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,231,
- 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,212, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,235, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 11,
- 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,213, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136,
- 61, 14, 61,247, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,223,251, 63,127,101,125,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 5, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 8, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,142, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 23, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,214, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 15, 63, 2, 71,188, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 71, 61,124,224, 23, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 43, 61,197,143, 18,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,152, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 31, 62,124,224, 34, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,215, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,223,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,132, 61, 14, 62, 3, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,252, 61,124,224, 19, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,207, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,169,
- 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 50, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7, 62,124,224, 31, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,216, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,143, 62,131,146, 56, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,250, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 4,
- 63,127,101,124, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 11, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 11, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 43, 62, 65,155,146, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 26,
- 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,217, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 87, 7,
- 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,199, 60,124,223,255, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 71, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11,
- 61,197,143, 11, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,192, 62, 14, 62, 11, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,145, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 25, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,218, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 7, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,239,
- 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,239, 63,127,101,127, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,184, 62, 14, 62, 3, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,135,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 17, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,219, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 71, 59,124,223,239, 62,131,146, 58,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,120, 61, 14, 62, 2, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,247,
- 61,124,224, 17, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,165, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 48, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7,
- 62,124,224, 28, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,220, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,255, 63, 65,123,221, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 21, 43, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 7,
- 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,143, 63,216,177,186, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 23, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,221, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84,231, 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136,
- 61, 14, 62, 3, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 17, 63,127,101,125,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,211, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 53,
- 62, 65,155,148, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 10, 62,124,224, 29, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,222, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 71, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 43, 61,197,143, 15,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 83, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 27, 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,223, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 15, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,219, 61,197,143, 23, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168,
- 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 27, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,224, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,223,247,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 5, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 59, 62, 65,155,138, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 19,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,225, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7,
- 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,188,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11,
- 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 11, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 83, 62, 65,155,143, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 27, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,226, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 71, 60,124,223,223, 63, 2, 71,189, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,247,
- 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 7, 63,127,101,127, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 11, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,176, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,145,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,227, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,127, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,247, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7,
- 61,124,224, 7, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 11, 63,158, 2, 82,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,145, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11,
- 62,124,224, 25, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,228, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 84,135, 59,124,224, 63, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,231, 60,124,224, 55,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 62, 17, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 30, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,203, 61,197,143, 24, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,164, 62, 14, 62, 18,
- 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 55, 62, 65,155,155, 63,216,177,183, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 9, 62,124,224, 36, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,229, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168,
- 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,223,255, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67,
- 62, 65,155,139, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 19, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,230, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,255, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 39, 61,124,224, 15, 63,127,101,124, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 15,
- 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 15, 63,187,172,163, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,151, 63,216,177,182, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 31, 62,124,224, 31, 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,231, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 71,
- 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 62, 7, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 23, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,235, 61,197,143, 19, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176,
- 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,232, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,191, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,223,247, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127, 72, 61, 14, 62, 0, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 14,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,171, 61,197,143, 13, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 27, 62, 65,155,147, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,251, 62,124,224, 27,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,233, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7,
- 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 39, 60,124,223,223, 63, 2, 71,186,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,184, 61, 14, 61,247, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 31, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,243,
- 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,188, 62, 14, 62, 7, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,141, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 17, 62,124,224, 22, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,234, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 7, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,255,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,176, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,147,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,235, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 71, 59,124,223,255, 62,131,146, 58,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255,
- 61,124,224, 23, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,211, 61,197,143, 19, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,170, 62, 14, 62, 15, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 56, 62, 65,155,147, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 13,
- 62,124,224, 25, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,236, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 84, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,224, 63,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72, 61, 14, 62, 15, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,199, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,171, 61,197,143, 7, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 11,
- 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 27, 62, 65,155,147, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 19, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,237, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8,
- 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85,103, 61,124,223,255, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 75, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,216, 62, 14, 62, 7, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91,
- 62, 65,155,143, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 23, 63,245, 17,143,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,238, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 31, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 71, 61,124,224, 23, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 43, 61,197,143, 27,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 19, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,155, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 31, 62,124,224, 35, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,239, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135,
- 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,104, 61, 14, 61,255, 63, 65,123,219,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,187, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152,
- 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 35, 62, 65,155,143, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,240, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,255, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 15,
- 63,127,101,128, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 13, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 75, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 29,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,241, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 31, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 7, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,231, 61,124,224, 23, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203,
- 61,197,143, 19, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,149, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 33, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,242, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,215, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,144, 61, 14, 62, 7,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,251, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,207, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,166, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 45, 62, 65,155,147,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 8, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,243, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,222,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39,
- 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,142,255, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,139, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31,
- 62,124,224, 15, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,244, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,219, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 13,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,145, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 29, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,245, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 61,255, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,224, 15, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 23, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,246, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7, 59,124,223,255,
- 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 83,135, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,126,200, 61, 14, 61,239, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 84,135, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20, 75, 61,197,142,255,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127, 88, 62, 14, 61,255, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,137,219, 62, 65,155,135, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 84,223, 62,124,224, 15, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,247, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 85, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,239, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,235, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184,
- 62, 14, 62, 3, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,137, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11, 62,124,224, 15, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,248, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,127, 62,131,146, 56, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,251, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 3,
- 63,127,101,124, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 8, 63,158, 2, 80, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 10, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 27, 62, 65,155,143, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,247, 62,124,224, 24,
- 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,249, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7,
- 59,124,224,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 63, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 15, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 31, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11,
- 61,197,143, 27, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,216, 62, 14, 62, 23, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,157, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 37, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,193,250, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 87, 7, 59,124,224, 15, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85,135, 60,124,224, 19, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,232, 61, 14, 62, 12,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,224, 28, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 25, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,200, 62, 14, 62, 19, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,155,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 35, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,251, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,224, 63, 62,131,146, 58,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 3, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7,
- 61,124,224, 19, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,148, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11,
- 62,124,224, 29, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,252, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,224, 33, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 29,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 11, 63, 65,123,221, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 24, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 21, 43, 61,197,143, 24, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 18,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,157, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 37, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,193,253, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 71, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 15, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 27, 62,124,224, 23, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,193,254, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 8, 61, 14, 62, 7, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 84,167, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,139, 61,197,143, 15,
- 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,136, 62, 14, 62, 11, 63,187,172,163, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 11, 62, 65,155,143, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 84,247, 62,124,224, 23, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,193,255, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,215,
- 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 61,255, 63, 65,123,219,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,223, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,174,
- 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 57, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 12, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 0, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15,
- 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 75, 62, 65,155,147, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 31,
- 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 1, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7,
- 59,124,223,191, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 15, 63, 2, 71,188,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 23, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11,
- 61,197,143, 17, 63,158, 2, 83, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 14, 63,187,172,165,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,146, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 26, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 2, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,239,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,139,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 19, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 3, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,127, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 71, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23,
- 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,251, 61,197,143, 3, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,192, 62, 14, 62, 6, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,140, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19,
- 62,124,224, 21, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 4, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 84, 7, 59,124,223,127, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,247, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,235, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,141, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 5, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,224, 15, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,143, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 23, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 6, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,224,255,
- 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,224, 63, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72, 61, 14, 62, 47, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 84,231, 61,124,224, 63, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 47,
- 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 27, 63,187,172,163, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,167, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 84,255, 62,124,224, 51, 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 7, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,135, 59,124,224, 31, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199,
- 60,124,224, 31, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 62, 16, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,215, 61,197,143, 22, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,172,
- 62, 14, 62, 17, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 53, 62, 65,155,151, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 9, 62,124,224, 32, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 8, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,136, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,247, 61,124,223,255,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 59, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 23,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 9, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,223,191, 63, 2, 71,186,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,104, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,231, 61,124,223,247, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,171,
- 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 7, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 35, 62, 65,155,145, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 84,255, 62,124,224, 26, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 10, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 7, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,255,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,143,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 11, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,191, 59,124,222,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,229, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,154, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7,
- 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,232, 61,197,143, 7, 63,158, 2, 82,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,182, 62, 14, 62, 7, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 65, 62, 65,155,139, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 16,
- 62,124,224, 19, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 12, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,224, 31,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,247, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,219, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7, 62,124,224, 31, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 13, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,224,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84,135, 60,124,224, 63, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72,
- 61, 14, 62, 47, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 47, 63,127,101,125,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,171, 61,197,143, 47, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 27, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 27,
- 62, 65,155,167, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,247, 62,124,224, 49, 63,245, 17,139,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 14, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255,
- 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,223,191, 63, 2, 71,186, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 8, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 84,167, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,107, 61,197,143, 11,
- 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,104, 62, 14, 62, 9, 63,187,172,163, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,137,251, 62, 65,155,143, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 84,239, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 15, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72, 61, 14, 62, 15, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,171, 61,197,143, 31, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152,
- 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 11, 62, 65,155,159, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,247, 62,124,224, 39, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 16, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,255,
- 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,192, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 67, 62, 65,155,139, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 19,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 17, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 7, 61,124,223,247, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235,
- 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 5, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,138, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 19, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 18, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 7, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,168, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,147,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 19, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,231, 60,124,224, 15, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,247,
- 61,124,224, 19, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 17, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,164, 62, 14, 62, 14, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,148, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7,
- 62,124,224, 30, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 20, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 83, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 71, 60,124,223,191,
- 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 40, 61, 14, 61,223, 63, 65,123,218, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,199, 61,124,223,239, 63,127,101,124, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,155, 61,197,142,255, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,128, 62, 14, 61,255,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 11, 62, 65,155,131, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,243, 62,124,224, 15, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 21, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84,135, 60,124,223,191, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72,
- 61, 14, 61,239, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,199, 61,124,223,255, 63,127,101,124,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,139, 61,197,142,247, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,120, 62, 14, 61,255, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,137,251,
- 62, 65,155,131, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,239, 62,124,224, 11, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 22, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 39, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 23,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 39, 62,124,224, 27, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 23, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 86, 7, 59,124,222,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135,
- 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,239, 63, 65,123,221,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85,103, 61,124,223,255, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 21, 43, 61,197,142,255, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200,
- 62, 14, 62, 3, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,135, 63,216,177,186,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 19, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 24, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,200, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,224, 15,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 91, 62, 65,155,151, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 27,
- 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 25, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7,
- 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,191, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,231, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,215, 61,124,223,231, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,171,
- 61,197,142,247, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 1, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 27, 62, 65,155,135, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 84,251, 62,124,224, 15, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 26, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 83, 7, 59,124,223,191, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,135, 60,124,223,239, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,104, 61, 14, 62, 3,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,187, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,152, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 35, 62, 65,155,145,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 25, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 27, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,224, 63, 62,131,146, 56,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 47, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 15, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7,
- 61,124,224, 29, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 24, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 17, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,155, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7,
- 62,124,224, 35, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 28, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255,
- 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 23, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 21, 43, 61,197,143, 23, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,216, 62, 14, 62, 15,
- 63,187,172,166, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,150, 63,216,177,186, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 30, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 29, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 15, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 62, 11, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 23, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 19, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 17, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,151, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 33, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 30, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,191,
- 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 15, 63, 2, 71,188, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 39, 61,124,224, 19, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 17,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 14, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,151, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 23, 62,124,224, 34, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 31, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,103, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,191,
- 60,124,224, 63, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,144, 61, 14, 62, 15, 63, 65,123,219,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 3, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,223, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,174,
- 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 63, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 32, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,191, 62,131,146, 59, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 3, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,128, 8, 61, 14, 62, 4, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 18,
- 63,127,101,128, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 43, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 14, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 91, 62, 65,155,149, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 26,
- 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 33, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,191, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,247, 61,124,223,247, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203,
- 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,160, 62, 14, 62, 7, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,145, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 7, 62,124,224, 25, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 34, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 87, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85,199, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 40, 61, 14, 62, 15,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 27, 61,197,143, 31, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,208, 62, 14, 62, 27, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,163,
- 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 27, 62,124,224, 43, 63,245, 17,140, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 35, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 59,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39,
- 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 19, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23,
- 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 36, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,207,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,244, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,254, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 21, 11, 61,197,143, 5, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 9,
- 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 25, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 37, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,241, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168,
- 61, 14, 61,253, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 11, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 13, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 12, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59,
- 62, 65,155,146, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11, 62,124,224, 27, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 38, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,199, 59,124,222,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,247, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,160, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 11, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,231, 61,197,143, 15,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,178, 62, 14, 62, 7, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 61, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 14, 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 39, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,239, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,223,239, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,203, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184,
- 62, 14, 62, 3, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,137, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 17, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 40, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,215, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,140, 61, 14, 62, 15, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,251, 61,124,224, 15,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,178, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 61, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 41, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7,
- 59,124,224, 13, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 31, 63, 2, 71,188,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 9, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 22, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235,
- 61,197,143, 16, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 14, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,148, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 30, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 42, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,199, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,231, 60,124,223,159, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,144, 61, 14, 61,231,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,223,239, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,217, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,175, 62, 14, 62, 5, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 56, 62, 65,155,140,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11, 62,124,224, 21, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 43, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,224,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 63, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,128, 72, 61, 14, 62, 31, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85,103,
- 61,124,224, 47, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 75, 61,197,143, 39, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,248, 62, 14, 62, 27, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138,139, 62, 65,155,163, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 55,
- 62,124,224, 43, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 44, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,219, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 11,
- 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,139, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 19, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 45, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84, 71, 60,124,223,191, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72,
- 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,223,255, 63,127,101,125,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,187, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,152, 62, 14, 62, 3, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 35,
- 62, 65,155,139, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 19, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 46, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 71, 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 23, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,251, 61,197,143, 7,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,139, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 19, 62,124,224, 19, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 47, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,199, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,231,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 62, 15, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 3, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,180,
- 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 63, 62, 65,155,147, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 27, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 48, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 39, 60,124,224, 31, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,168, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 39,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,227, 61,197,143, 33, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 24, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 67, 62, 65,155,162, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 17, 62,124,224, 45,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 49, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7,
- 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219,
- 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 11, 63,187,172,165,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 19, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 50, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,231, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 62, 7,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,168, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,147,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 9, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 51, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7, 59,124,223,223, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84, 7, 60,124,223,235, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,126,200, 61, 14, 61,251, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,167,
- 61,124,224, 9, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,107, 61,197,143, 11, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,120, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,137,251, 62, 65,155,145, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,239,
- 62,124,224, 28, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 52, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,222,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 39, 60,124,223,191,
- 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 21, 3, 61,197,143, 7, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,196, 62, 14, 62, 7,
- 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 87, 62, 65,155,143, 63,216,177,183, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 29, 62,124,224, 23, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 53, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,191, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72,
- 61, 14, 61,251, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,199, 61,124,224, 11, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,155, 61,197,143, 13, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,136, 62, 14, 62, 12, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 19,
- 62, 65,155,144, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,247, 62,124,224, 24, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 54, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,224, 31, 63, 2, 71,188, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 7, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 71, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 11,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 31, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 55, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,239, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 3, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,219, 61,197,143, 17, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168,
- 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,149, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 29, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 56, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,103, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,248, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 55, 61,124,224, 15,
- 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 35, 61,197,143, 15, 63,158, 2, 80, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,220, 62, 14, 62, 15, 63,187,172,162, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138,107, 62, 65,155,151, 63,216,177,182, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 37, 62,124,224, 31,
- 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 57, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86,135,
- 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,103, 60,124,223,255, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,184, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235,
- 61,197,143, 31, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,180, 62, 14, 62, 23, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 71, 62, 65,155,159, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 18, 62,124,224, 43, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 58, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,222,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 39, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 15,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 15, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,243, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,184, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 83, 62, 65,155,151,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 25, 62,124,224, 27, 63,245, 17,140, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 59, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,222,255, 62,131,146, 58,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,239, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71,
- 61,124,223,255, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 75, 61,197,143, 7, 63,158, 2, 82,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,216, 62, 14, 62, 7, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138,107, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31,
- 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 60, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 63,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,219, 61,197,143, 23, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 15,
- 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,151, 63,216,177,185, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 31, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 61, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 71, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 15, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59,
- 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 31, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 62, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,143,
- 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,186, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,251, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 39, 61,124,224, 2, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 11,
- 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 11, 63,187,172,163, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,145, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 7, 62,124,224, 27, 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 63, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 15, 63, 65,123,219,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,235, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176,
- 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67, 62, 65,155,147, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 64, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,231, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,152, 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 15, 61,124,223,255,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 75, 62, 65,155,143, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 23,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 65, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,223,191, 63, 2, 71,186,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 8, 61, 14, 61,239, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,199, 61,124,223,239, 63,127,101,124, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,139,
- 61,197,142,247, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,120, 62, 14, 61,251, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 11, 62, 65,155,131, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 84,239, 62,124,224, 11, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 66, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 85, 39, 60,124,223,191, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,176, 61, 14, 61,239,
- 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 19, 61,124,223,239, 63,127,101,125, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,231, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,179, 62, 14, 62, 5, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 65, 62, 65,155,139,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 16, 62,124,224, 21, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 67, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,104, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,239,
- 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 11, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,164, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,145, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11,
- 62,124,224, 25, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 68, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,223,127, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,207,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,243, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,251, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,235, 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 7,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,141, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 69, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168,
- 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51,
- 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11, 62,124,224, 27, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 70, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,127,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,247, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 7, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 3,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 6, 63,187,172,164, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,141, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 23, 62,124,224, 22, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 71, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 71,
- 60,124,224, 13, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 5, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 19, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,227, 61,197,143, 17, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176,
- 62, 14, 62, 14, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,149, 63,216,177,185,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 13, 62,124,224, 31, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 72, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,151, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,219, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,140, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,249, 61,124,224, 15,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,205, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 51, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 10, 62,124,224, 27,
- 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 73, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7,
- 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 15, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 11,
- 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200, 62, 14, 62, 7, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,143, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 27, 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 74, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,175, 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,224, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,142, 61, 14, 61,239,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 1, 61,124,223,239, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,207, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,164, 62, 14, 62, 3, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 42, 62, 65,155,135,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 4, 62,124,224, 15, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 75, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 31, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,200, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39,
- 61,124,224, 23, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 19, 63,158, 2, 82,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,147, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23,
- 62,124,224, 31, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 76, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,223,127, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 39, 60,124,223,223,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,176, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 19, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,231, 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,178, 62, 14, 62, 9,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 63, 62, 65,155,143, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 24, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 77, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 31, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136,
- 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 19, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75,
- 62, 65,155,151, 63,216,177,186, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 31, 63,245, 17,143,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 78, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 7, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 7, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,151, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 23, 62,124,224, 31, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 79, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135,
- 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72, 61, 14, 61,255, 63, 65,123,217,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,123, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168,
- 62, 14, 62, 11, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,147, 63,216,177,182,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 7, 62,124,224, 27, 63,245, 17,139, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 80, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 71, 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 39, 60,124,223,255, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,144, 61, 14, 62, 15, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 31,
- 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,223, 61,197,143, 31, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 23, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 63, 62, 65,155,161, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 14, 62,124,224, 43,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 81, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,224, 15, 63, 2, 71,188,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 84,231, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203,
- 61,197,143, 17, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,150, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 30, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 82, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7, 59,124,223,255, 62,131,146, 56, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,135, 60,124,223,255, 63, 2, 71,185, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127, 72, 61, 14, 61,255,
- 63, 65,123,217, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,231, 61,124,223,255, 63,127,101,123, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 15, 63,158, 2, 80, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,152, 62, 14, 62, 7, 63,187,172,163, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,143,
- 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,255, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 83, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,127, 62,131,146, 56,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,168, 61, 14, 61,247, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23,
- 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 3, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 7, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,141, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15,
- 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 84, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 86, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 61,239, 63, 65,123,220, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,223,255, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,235, 61,197,143, 3, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 5,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,139, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 21, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 85, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 59, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 85,135, 60,124,223,255, 63, 2, 71,189, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200,
- 61, 14, 62, 1, 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 16, 63,127,101,127,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 15, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 13, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 67,
- 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 30, 63,245, 17,142,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 86, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,223, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 7, 61,124,224, 7, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203, 61,197,143, 11,
- 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,145, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 23, 62,124,224, 29, 63,245, 17,143, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 87, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 86, 7, 59,124,223,191, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85,135,
- 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,128, 8, 61, 14, 62, 11, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 39, 61,124,224, 19, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 21, 11, 61,197,143, 21, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,200,
- 62, 14, 62, 17, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 91, 62, 65,155,153, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 31, 62,124,224, 33, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 88, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 86, 7, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,128, 8, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 71, 61,124,224, 15,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 21, 43, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,216, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138,107, 62, 65,155,147, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 39, 62,124,224, 27,
- 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 89, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7,
- 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,255, 63, 2, 71,188,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 62, 7, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203,
- 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 13, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 43, 62, 65,155,147, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 15, 62,124,224, 31, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 90, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,199, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,255,
- 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 15, 63,127,101,126, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,215, 61,197,143, 7, 63,158, 2, 82, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,174, 62, 14, 62, 11, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 57, 62, 65,155,143,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 13, 62,124,224, 23, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 91, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,231, 60,124,223,255, 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127,168, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 15,
- 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,211, 61,197,143, 23, 63,158, 2, 82,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,165, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,147, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 11,
- 62,124,224, 27, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 92, 32,
- 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
-186,145, 85, 7, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,247, 60,124,223,191,
- 63, 2, 71,187, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0,
- 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 11, 61,124,223,255, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
-188,227, 20,227, 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,180, 62, 14, 62, 7,
- 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 73, 62, 65,155,143, 63,216,177,184, 66,175, 0, 0,
- 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 20, 62,124,224, 23, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,216, 8,194, 93, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,135, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0,
- 0, 0, 0, 0,187,145, 84,231, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136,
- 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,255, 61,124,224, 15, 63,127,101,126,
- 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,211, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0,
- 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 15, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 55,
- 62, 65,155,147, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 12, 62,124,224, 27, 63,245, 17,141,
- 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 94, 32, 0, 0, 1, 44, 0, 0, 0, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 86, 7, 59,124,223,255,
- 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,224, 63, 63, 2, 71,187, 65,200, 0, 0,
- 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,200, 61, 14, 62, 15, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,
-188,145, 85, 7, 61,124,224, 31, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,235, 61,197,143, 23,
- 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,184, 62, 14, 62, 15, 63,187,172,164, 66,150, 0, 0,
- 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 75, 62, 65,155,151, 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
-189,145, 85, 23, 62,124,224, 35, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216,
- 8,194, 95, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0,186,145, 84,135, 59,124,224, 15, 62,131,146, 58, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,199,
- 60,124,223,251, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,152, 61, 14, 62, 8, 63, 65,123,220,
- 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 7, 61,124,224, 22, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0,188,227, 20,219, 61,197,143, 17, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,172,
- 62, 14, 62, 15, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 51, 62, 65,155,148, 63,216,177,184,
- 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 9, 62,124,224, 30, 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 96, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 85, 7, 59,124,223,255, 62,131,146, 58, 65, 72, 0, 0,
- 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,
-188, 35,127,168, 61, 14, 61,255, 63, 65,123,220, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 85, 23, 61,124,224, 15,
- 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,219, 61,197,143, 15, 63,158, 2, 81, 66,122, 0, 0,
- 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,176, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
-189, 94,138, 67, 62, 65,155,147, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 19, 62,124,224, 27,
- 63,245, 17,141, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 97, 32, 0, 0, 1, 44,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 84, 7,
- 59,124,222,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 85, 7, 60,124,223,191, 63, 2, 71,187,
- 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,136, 61, 14, 61,239, 63, 65,123,219, 66, 22, 0, 0, 63, 32, 0, 0,
- 0, 0, 0, 0,188,145, 85, 7, 61,124,223,239, 63,127,101,126, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,203,
- 61,197,142,255, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,168, 62, 14, 62, 3, 63,187,172,164,
- 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 59, 62, 65,155,137, 63,216,177,184, 66,175, 0, 0, 62, 0, 0, 0,
- 0, 0, 0, 0,189,145, 85, 23, 62,124,224, 17, 63,245, 17,142, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,216, 8,194, 98, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0,186,145, 84,111, 59,124,223,255, 62,131,146, 57, 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,
-187,145, 84,173, 60,124,223,255, 63, 2, 71,188, 65,200, 0, 0, 63, 64, 0, 0, 0, 0, 0, 0,188, 35,127,116, 61, 14, 61,255,
- 63, 65,123,221, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,245, 61,124,224, 15, 63,127,101,127, 66, 72, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,199, 61,197,143, 13, 63,158, 2, 81, 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,
-189, 35,127,163, 62, 14, 62, 13, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,189, 94,138, 47, 62, 65,155,147,
- 63,216,177,185, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 85, 6, 62,124,224, 28, 63,245, 17,142, 66,200, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 8,194, 99, 32, 0, 0, 1, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,186,145, 82, 7, 59,124,223,127, 62,131,146, 57,
- 65, 72, 0, 0, 63, 96, 0, 0, 0, 0, 0, 0,187,145, 84,135, 60,124,223,223, 63, 2, 71,186, 65,200, 0, 0, 63, 64, 0, 0,
- 0, 0, 0, 0,188, 35,127, 8, 61, 14, 61,247, 63, 65,123,218, 66, 22, 0, 0, 63, 32, 0, 0, 0, 0, 0, 0,188,145, 84,199,
- 61,124,224, 7, 63,127,101,125, 66, 72, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,188,227, 20,139, 61,197,143, 7, 63,158, 2, 81,
- 66,122, 0, 0, 62,192, 0, 0, 0, 0, 0, 0,189, 35,127,136, 62, 14, 62, 11, 63,187,172,164, 66,150, 0, 0, 62,128, 0, 0,
- 0, 0, 0, 0,189, 94,138, 27, 62, 65,155,147, 63,216,177,183, 66,175, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,189,145, 84,247,
- 62,124,224, 28, 63,245, 17,140, 66,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 8,194,100, 32,
- 0, 0, 0,116, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 76, 8,194,100, 96, 0, 0, 0,104, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 23,
- 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 32, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,193,204,176, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66,
- 0, 0, 3, 80, 3,161, 78, 32, 0, 0, 0,113, 0, 0, 0, 1, 3,161, 82, 32, 3,161, 74, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66,112,114,101,118,105,101,119,108, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 97,109,112, 0, 1, 4, 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,
- 8,193,161,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,211,197,192, 65, 59,229, 76, 64,184,106,208, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 98,215,247, 63, 72, 11, 71, 63, 6,248,230, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 29, 14,212, 62,182,225,149,191, 52, 76, 84, 0, 0, 0, 0,191, 74, 40, 22, 62,139, 74,201,191, 12,198,228,
- 0, 0, 0, 0,187,157,213, 84, 63,100,190,151, 62,229,223,145, 0, 0, 0, 0,188,211,197,192, 65, 59,229, 76, 64,184,106,208,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 51, 25, 39,147,179, 63, 47, 43, 0, 0, 0, 0, 50,247,108, 9, 63,128, 0, 0,178,142, 92, 26,
- 0, 0, 0, 0,179,114, 4, 43,178,141, 59, 32, 63,128, 0, 1, 0, 0, 0, 0,177,127,255,135, 40, 10,214,130,181, 0, 0, 1,
- 63,128, 0, 0, 63, 29, 14,213,191, 74, 40, 23,187,157,211,254,128, 0, 0, 0,191, 52, 76, 83,191, 12,198,227, 62,229,223,148,
-128, 0, 0, 0,190,182,225,149,190,139, 74,202,191,100,190,152,128, 0, 0, 0,192,158, 36,208,192,110,186,100,193,169, 43, 99,
- 63,128, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 60,208, 19,169,
- 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 4, 0, 0, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 3, 80, 3,161, 82, 32, 0, 0, 0,113, 0, 0, 0, 1, 0, 0, 0, 0, 3,161, 78, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 46, 48, 48, 53, 0, 0, 0, 0, 0, 1, 4, 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, 8,195, 76, 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, 8,194,100,224,188,183, 16, 61,191,103,204, 21, 63,228,234, 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, 64,155, 39,153, 64,155, 39,153,
- 64,155, 39,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218, 37,192, 0, 0, 36,255,255,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 64,155, 39,153, 38, 27, 39,152,166,232,187,102, 0, 0, 0, 0, 38,232,187,102, 52,196,134,157,
- 64,155, 39,153, 0, 0, 0, 0, 38, 27, 39,154,192,155, 39,153, 52,196,134,157, 0, 0, 0, 0,188,183, 16, 61,191,103,204, 21,
- 63,228,234, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,152,206, 48,236, 24, 41, 66, 9, 0, 0, 0, 0,152, 60, 55,216, 63,128, 0, 0,
-166,105,133, 88, 0, 0, 0, 0,151, 91,159,226, 38, 93,218, 64, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 62, 83, 50, 25, 36,158,101,147, 35,211, 50, 27,128, 0, 0, 0,164,158,101,147, 62, 83, 50, 25,
- 38,189,119, 59,128, 0, 0, 0,173, 44, 24, 0,175, 94,165,224, 62, 83, 50, 25,128, 0, 0, 0, 59, 33,251,236, 59, 40, 37,135,
- 63,238, 71,118, 63,128, 0, 0, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 0, 0, 0, 0, 79, 66, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0,
- 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 56, 81,236, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 4, 4, 1, 1, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 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, 0, 0, 4, 8,194,100,224, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 65,
- 0, 0, 2,108, 3,161, 86, 32, 0, 0, 0, 42, 0, 0, 0, 1, 3,161, 90, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 65, 99,104,101, 99,107,101,114,100, 97,114,107, 0, 0, 0, 97,116,101,114,105, 97, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 0, 0, 61,221, 1,116, 61,220,251,200, 61,220,251,200, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 89,153,154,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 2, 0, 2, 0, 1, 0, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 18, 59,163,215, 10, 59,163,215, 10, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 3, 1, 64, 0, 3, 0, 1, 0, 4, 0, 12, 0, 4, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0, 61,204,204,205, 63, 0, 0, 0, 61,204,204,205, 61,204,204,205, 63,128, 0, 0,
- 8, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 8,194,101, 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, 8,194,101,192, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 76,204,205, 63, 76,204,205,
- 63, 76,204,205, 61, 76,204,205, 61,204,204,205, 63,166,102,102, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,136, 8,194,101, 16, 0, 0, 0, 33, 0, 0, 0, 1, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,106,160,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63,192, 0, 1, 63,192, 0, 1, 63,192, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,209,183, 23, 56,209,177,184, 56,209,177,184, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32,
- 8,194,101,192, 0, 0, 0, 19, 0, 0, 0, 1, 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, 77, 65, 0, 0, 2,108, 3,161, 90, 32, 0, 0, 0, 42, 0, 0, 0, 1,
- 3,161, 94, 32, 3,161, 86, 32, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 99,104,101, 99,107,101,114,108,105,103,104,116, 0, 0,
- 0, 97,116,101,114,105, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 62,157, 65,188, 62,157, 61,178,
- 62,157, 61,178, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 89,153,154, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0,
- 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2, 0, 1, 0, 6, 63,128, 0, 0, 63,128, 0, 0,
- 0, 18, 0, 18, 59,163,215, 10, 59,163,215, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 3, 1, 64, 0, 3,
- 0, 1, 0, 4, 0, 12, 0, 4, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0, 61,204,204,205,
- 63, 0, 0, 0, 61,204,204,205, 61,204,204,205, 63,128, 0, 0, 8, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 8,194,102, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 61, 76,204,205, 61,204,204,205, 63,166,102,102,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,136, 8,194,102, 16, 0, 0, 0, 33, 0, 0, 0, 1,
- 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,106,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,209,183, 23,
- 56,209,177,184, 56,209,177,184, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 62, 76,204,205, 0, 0, 0, 0, 0, 0, 77, 65, 0, 0, 2,108, 3,161, 94, 32, 0, 0, 0, 42, 0, 0, 0, 1, 3,161,102, 32,
- 3,161, 90, 32, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,112,114,101,118,105,101,119, 0, 0, 97,116,101,114,105, 97,108, 0, 0,
- 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 54,232, 61, 63, 23,161,184,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 68,248,188, 63,128, 0, 0, 63, 76,204,205,
- 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,130,121,198, 63,160, 0, 0, 0, 0, 0, 0, 63,160, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2, 0, 50, 0, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 18,
- 59,163,215, 10, 59,163,215, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 0, 3, 3, 17, 0, 3, 0, 1, 0, 4,
- 0, 12, 0, 4, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0, 61,204,204,205, 63, 0, 0, 0,
- 61,204,204,205, 61,204,204,205, 63,128, 0, 0, 8, 16, 0, 1, 3,161, 98, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 8,194,102,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,194,103,112,
- 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 61, 76,204,205, 61,204,204,205, 63,166,102,102, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,136, 8,194,102,192, 0, 0, 0, 33, 0, 0, 0, 1, 0, 16, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,194,105, 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, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 8, 3,161, 98, 32, 0, 0, 0, 36, 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, 62,220, 40,245, 0, 0, 0, 0, 63,125,112,164, 63,128, 0, 0,
- 63, 24,214,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 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, 68, 65, 84, 65, 8, 1, 0, 0,
+192,101,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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, 56,121,154, 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, 24, 0, 0, 0, 56,121,154, 3,
+ 53, 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,
+ 76, 65, 0, 0,132, 1, 0, 0,248,102,179, 3, 40, 0, 0, 0, 1, 0, 0, 0,232,105,179, 3, 8,100,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 52, 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, 16, 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,205,204,204, 62,247,255,239, 65,
+ 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63,200,182, 27, 63, 0, 0,128, 63,176,104,179, 3, 1, 0, 0, 0, 46, 26,128, 63,
+ 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 1, 0, 0,
+176,104,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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, 24,171,153, 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,
- 68, 65, 84, 65, 0, 0, 0, 32, 8,194,103,112, 0, 0, 0, 19, 0, 0, 0, 1, 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, 77, 65, 0, 0, 2,108, 3,161,102, 32,
- 0, 0, 0, 42, 0, 0, 0, 1, 3,161,110, 32, 3,161, 94, 32, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,120,116,117,114,
-101, 0,114,101,118,105,101,119, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,160, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2, 0, 50, 0, 6,
- 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 18, 59,163,215, 10, 59,163,215, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 1, 0, 71, 3, 1, 0, 67, 0, 1, 0, 4, 0, 12, 0, 4, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24,171,153, 3,
+ 53, 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,
+ 76, 65, 0, 0,132, 1, 0, 0,232,105,179, 3, 40, 0, 0, 0, 1, 0, 0, 0, 40,109,179, 3,248,102,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 54, 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, 2, 0, 0, 0, 8, 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,160, 64, 0, 0, 52, 66,
+ 0, 0, 72, 66,171,156, 8, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,160,107,179, 3, 2, 0, 0, 0, 78,207, 68, 65,
+ 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0,
- 63, 0, 0, 0, 61,204,204,205, 63, 0, 0, 0, 61,204,204,205, 61,204,204,205, 63,128, 0, 0, 8, 1, 0,129, 3,161,106, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 8,194,103,192, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,194,104,112, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 61, 76,204,205,
- 61,204,204,205, 63,166,102,102, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,216,108,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,
+160,107,179, 3, 55, 1, 0, 0, 1, 0, 0, 0, 1, 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, 64,198,153, 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, 68, 65, 84, 65, 0, 0, 0,136, 8,194,103,192,
- 0, 0, 0, 33, 0, 0, 0, 1, 0, 1, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,105, 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, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 8, 3,161,106, 32, 0, 0, 0, 36,
- 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, 62,220, 40,245,
- 0, 0, 0, 0, 63,125,112,164, 63,128, 0, 0, 63, 24,214,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,198,153, 3,
+ 53, 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,216,108,179, 3, 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, 76, 65, 0, 0,132, 1, 0, 0, 40,109,179, 3,
+ 40, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,105,179, 3, 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,
+ 1, 0, 0, 0, 1, 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,192, 63, 0, 0,160, 65, 0, 0, 52, 66,154,153, 25, 62, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63,224,110,179, 3, 1, 0, 0, 0, 0, 0, 0, 63, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0,128, 63,
+ 0, 0, 64, 64, 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0,224,110,179, 3, 55, 1, 0, 0, 1, 0, 0, 0,
+ 1, 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, 96,241,157, 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, 24, 0, 0, 0, 96,241,157, 3, 53, 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, 87, 79, 0, 0,112, 1, 0, 0, 24,112,179, 3,
+124, 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,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,141, 47, 79, 62, 64, 19,209, 62, 73, 23, 14, 63, 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,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, 1, 0, 32, 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, 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, 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, 0, 0, 0, 32, 8,194,104,112, 0, 0, 0, 19, 0, 0, 0, 1,
- 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, 77, 65, 0, 0, 2,108, 3,161,110, 32, 0, 0, 0, 42, 0, 0, 0, 1, 0, 0, 0, 0, 3,161,102, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 65,116,101,120,116,117,114,101, 46, 48, 48, 49, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 2, 0, 2, 0, 50, 0, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 18, 59,163,215, 10, 59,163,215, 10,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 3, 3, 1, 0, 3, 0, 1, 0, 4, 0, 12, 0, 4, 63, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 2,
- 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0, 61,204,204,205, 63, 0, 0, 0, 61,204,204,205, 61,204,204,205,
- 63,128, 0, 0, 0, 0, 0, 0, 3,161,114, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0,184,113,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+184,113,179, 3, 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, 84, 88, 0, 0,120, 0, 0, 0,224, 45, 96, 1, 28, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 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, 7, 0, 0, 0, 1, 0, 0, 0,
+ 0, 89,155, 3, 0, 89,155, 3, 0, 89,155, 3, 0, 89,155, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,114,179, 3,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 0, 89,155, 3, 26, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,127,159, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,240,127,159, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 71, 82, 0, 0,
+ 76, 0, 0, 0,168,141,156, 3,252, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 82, 79,118,101,114,114,105,100,101, 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,104,122, 74, 1,160,119,179, 3,255,255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 24, 0, 0, 0,104,122, 74, 1,251, 0, 0, 0, 1, 0, 0, 0, 56,118,179, 3, 0, 0, 0, 0, 32,225,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,118,179, 3,251, 0, 0, 0, 1, 0, 0, 0,128,118,179, 3,
+104,122, 74, 1,144,221,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,118,179, 3,
+251, 0, 0, 0, 1, 0, 0, 0,200,118,179, 3, 56,118,179, 3, 0,218,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 0, 0, 0,200,118,179, 3,251, 0, 0, 0, 1, 0, 0, 0, 16,119,179, 3,128,118,179, 3, 40,249,179, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,119,179, 3,251, 0, 0, 0, 1, 0, 0, 0,
+ 88,119,179, 3,200,118,179, 3, 80,207,179, 3,192, 36,203, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
+ 88,119,179, 3,251, 0, 0, 0, 1, 0, 0, 0,160,119,179, 3, 16,119,179, 3,112,214,179, 3,200,104,155, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,119,179, 3,251, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,119,179, 3,
+224,210,179, 3,136, 77,156, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,232,119,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,120,123,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 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, 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,152, 85,179, 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, 78,199, 41,188,225,230, 30,193,216,129,230, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0, 0,128, 0, 0, 0,128, 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,105, 33,162, 51,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191,105, 33,162, 51, 0, 0, 0, 0, 78,199, 41,188,225,230, 30,193,
+216,129,230, 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,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,
+ 64, 90,136, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 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, 40, 0, 0, 0, 0, 0, 0, 0, 0, 64, 90,136,176, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 40, 19,212, 50,
+ 63,252, 17,180, 0, 0,128, 63, 0, 8, 0, 0, 0, 0, 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,236, 81, 56, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 79, 66, 0, 0, 92, 3, 0, 0,120,123,179, 3,115, 0, 0, 0, 1, 0, 0, 0, 8,127,179, 3,232,119,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 65,116,109,111, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 1, 0, 0, 4,
+ 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 86,179, 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, 78,199, 41,188,225,230, 30,193,216,129,230, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+173, 47,244, 63,162,155,113, 37, 40, 80,170, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 40, 80,170, 37,
+162,155,113,165, 0, 0, 0, 0, 39, 80,170, 37,157, 64,169,190,163,155,113, 63, 0, 0, 0, 0,165,155,113, 37,163,155,113,191,
+157, 64,169,190, 0, 0, 0, 0, 78,199, 41,188,225,230, 30,193,216,129,230, 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,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,187, 35, 58,154,
+139, 2,174, 25, 0, 0, 0, 0,151, 29,171, 37, 1, 0,128, 63, 33,110, 77, 51, 0, 0, 0, 0,135,255,255, 45,158, 64,169, 50,
+ 0, 0,128, 63, 0, 0, 0, 0, 30, 0,128, 48, 5, 80, 56, 53,157,216,128, 52, 0, 0,128, 63, 0, 0,128, 63, 39, 80,170, 37,
+166,155,113, 37, 0, 0, 0, 0,162,155,113,165,164,155,113, 63,158, 64,169,190, 0, 0, 0, 0, 40, 80,170,165,159, 64,169, 62,
+162,155,113, 63, 0, 0, 0, 0,144, 57, 41, 26,134,234,185,178,154,138, 18,180, 0, 0,128, 63,223, 13, 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,210, 32, 80, 63,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,194,104,192, 63, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 76,204,205,
- 63, 76,204,205, 63, 76,204,205, 61, 76,204,205, 61,204,204,205, 63,166,102,102, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 92, 3, 0, 0, 8,127,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,152,130,179, 3,120,123,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 49, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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,248,188,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,139,182, 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,184, 71,158, 3,240, 71,158, 3, 1, 0, 0, 0, 1, 0, 0, 0,113, 36,122, 61,157, 24,186,192, 28, 38, 71, 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, 0, 0, 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,113, 36,122, 61,157, 24,186,192,
+ 28, 38, 71, 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,116, 38, 13, 49,213,214,162, 50,
+ 0, 0,128, 63, 0, 0, 0, 0, 72, 95,202, 47,255,255,127,191,162,181,187, 51, 0, 0, 0, 0, 34, 75,146,189, 36,181,131,192,
+ 95,202,167,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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,
- 68, 65, 84, 65, 0, 0, 3, 8, 3,161,114, 32, 0, 0, 0, 36, 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, 62,220, 40,245, 0, 0, 0, 0, 63,125,112,164, 63,128, 0, 0, 63, 24,214,106,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 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,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,
0, 0, 0, 0, 0, 0, 0, 0, 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,164,206, 3,248,176,206, 3, 25, 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, 4, 0, 0, 0,184, 71,158, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+240, 71,158, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,152,130,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 40,134,179, 3, 8,127,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 50, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 96,182, 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, 40,163,160, 3,240,159,160, 3, 1, 0, 0, 0, 1, 0, 0, 0,113, 36,122, 61,157, 24,186,192, 28, 38, 71, 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, 0, 0, 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,113, 36,122, 61,157, 24,186,192,
+ 28, 38, 71, 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,116, 38, 13, 49,213,214,162, 50,
+ 0, 0,128, 63, 0, 0, 0, 0, 72, 95,202, 47,255,255,127,191,162,181,187, 51, 0, 0, 0, 0, 34, 75,146,189, 36,181,131,192,
+ 95,202,167,191, 0, 0,128, 63, 14, 4, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+ 96,244,206, 3,120,243,198, 3, 25, 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, 4, 0, 0, 0, 40,163,160, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+240,159,160, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 40,134,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,184,137,179, 3,152,130,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 51, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,181,182, 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,240,159,163, 3, 8,207,156, 3, 1, 0, 0, 0, 1, 0, 0, 0, 0,131,102, 60, 14,112,164, 64, 24,211,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 0,131,102, 60, 14,112,164, 64,
+ 24,211,229, 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,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,252,118,143,165, 0, 0, 0, 0, 0, 0, 0, 0,176,193,168,165, 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,176,193, 40,155, 0, 0, 0, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,231,126,201, 61,219,145,171, 48, 32, 19, 70, 29, 0, 0, 0, 0, 65,209,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,235, 66,172, 48,231,126,201,189, 79,216,251, 49, 0, 0, 0, 0, 18,136, 29,187,203,200,189,191,
+139,139, 9, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,240,159,163, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 8,207,156, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,184,137,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 72,141,179, 3, 40,134,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 52, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,164,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,215,182, 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,224,144, 74, 1,104,206,160, 3, 1, 0, 0, 0, 1, 0, 0, 0, 38, 84,207,191, 0,225,239,192, 15,169, 70, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 33,162, 51, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191,105, 33,162, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 38, 84,207,191, 0,225,239,192,
+ 15,169, 70, 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,105, 33,162, 51, 0, 0, 0, 0, 0, 0, 0, 0, 64, 90,136,176, 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,136, 93,191,179,218, 88,190,180,
+ 0, 0,128, 52, 0, 0,128, 63, 91,184, 22, 52, 0, 0,128,191, 28,112, 97, 51, 0, 0, 0, 0,104, 33,162, 51,176, 22,140, 39,
+ 0, 0,128, 63, 0, 0, 0, 0,255,255,127,191, 0,152, 86,179, 0, 58, 50, 51, 0, 0, 0, 0,131,217, 27,192,152, 0,206,191,
+ 70,208,166,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+ 16,140,206, 3, 56,152,206, 3, 25, 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, 4, 0, 0, 0,224,144, 74, 1, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+104,206,160, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 72,141,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,216,144,179, 3,184,137,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 53, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,139,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 2,183, 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,136,114,155, 3,152,178,155, 3, 1, 0, 0, 0, 1, 0, 0, 0, 38, 84,207,191, 0,225,239,192, 15,169, 70, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 33,162, 51, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191,105, 33,162, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 38, 84,207,191, 0,225,239,192,
+ 15,169, 70, 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,105, 33,162, 51, 0, 0, 0, 0, 0, 0, 0, 0, 64, 90,136,176, 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,136, 93,191,179,218, 88,190,180,
+ 0, 0,128, 52, 0, 0,128, 63, 91,184, 22, 52, 0, 0,128,191, 28,112, 97, 51, 0, 0, 0, 0,104, 33,162, 51,176, 22,140, 39,
+ 0, 0,128, 63, 0, 0, 0, 0,255,255,127,191, 0,152, 86,179, 0, 58, 50, 51, 0, 0, 0, 0,131,217, 27,192,152, 0,206,191,
+ 70,208,166,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+120,115,206, 3,120,127,206, 3, 25, 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, 4, 0, 0, 0,136,114,155, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+152,178,155, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,216,144,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,104,148,179, 3, 72,141,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 54, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 44,183, 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,136, 60,158, 3,144, 64,158, 3, 1, 0, 0, 0, 1, 0, 0, 0, 93, 0,223, 63,205,220,239,192,222,170, 70, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 33,162, 51, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,105, 33,162, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 93, 0,223, 63,205,220,239,192,
+222,170, 70, 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,105, 33,162,179,105, 33, 34,167, 0, 0, 0, 0, 64, 90,136, 48, 0, 0,128, 63,
+ 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 66, 72,191, 51, 87, 98,185,180,
+ 0, 0, 0, 53, 0, 0,128, 63,223,139, 24, 52, 0, 0,128, 63,138, 8, 26,179, 0, 0, 0, 0,104, 33,162,179, 91, 81,180, 39,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2,184,145,179,211, 40, 97, 51, 0, 0, 0, 0,231,225, 27, 64,237, 83,224,191,
+227,211,166,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+224, 90,206, 3,224,102,206, 3, 25, 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, 4, 0, 0, 0,136, 60,158, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+144, 64,158, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,104,148,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,248,151,179, 3,216,144,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 55, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 59,159, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,183, 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,176,127,153, 3,232, 15,160, 3, 1, 0, 0, 0, 1, 0, 0, 0, 93, 0,223, 63,205,220,239,192,222,170, 70, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 33,162, 51, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,105, 33,162, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 93, 0,223, 63,205,220,239,192,
+222,170, 70, 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,105, 33,162,179,105, 33, 34,167, 0, 0, 0, 0, 64, 90,136, 48, 0, 0,128, 63,
+ 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 66, 72,191, 51, 87, 98,185,180,
+ 0, 0, 0, 53, 0, 0,128, 63,223,139, 24, 52, 0, 0,128, 63,138, 8, 26,179, 0, 0, 0, 0,104, 33,162,179, 91, 81,180, 39,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2,184,145,179,211, 40, 97, 51, 0, 0, 0, 0,231,225, 27, 64,237, 83,224,191,
+227,211,166,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+ 32, 73,206, 3, 0, 82,206, 3, 25, 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, 4, 0, 0, 0,176,127,153, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+232, 15,160, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,248,151,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,136,155,179, 3,104,148,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 56, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 61,195, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,130,183, 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,232,160, 3, 96, 76,154, 3, 1, 0, 0, 0, 1, 0, 0, 0,185,115,122, 61, 28,209, 18,193, 27, 38, 71, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15, 73,192, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191,105, 33, 34,180, 0, 0, 0, 0, 0, 0, 0, 0,105, 33, 34, 52, 0, 0,128,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,185,115,122, 61, 28,209, 18,193,
+ 27, 38, 71, 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,128,167, 0, 0, 0, 0, 0,164, 5, 47, 0, 0,128, 63,
+ 0,164, 5,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,146,243,109, 49, 0,157, 30, 50,
+146,243,109,153, 0, 0,128, 63, 0, 0,128,191,106, 33, 34, 52,203,167,116, 28, 0, 0, 0, 0,112, 57,108, 48, 6, 39,170,179,
+ 0, 0,128, 63, 0, 0, 0, 0,106, 33, 34, 52, 1, 0,128, 63,255,255,159, 51, 0, 0, 0, 0,213,114,146, 61, 78, 92, 65, 63,
+ 93,202,167,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+192,114,155, 3, 16,158,155, 3, 25, 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, 4, 0, 0, 0,168,232,160, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 96, 76,154, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,136,155,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,159,179, 3,248,151,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 57, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,176,137,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,173,183, 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,112,223,154, 3, 24,159,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,185,115,122, 61, 28,209, 18,193, 27, 38, 71, 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, 0, 0, 0, 0, 0, 0, 0,128,218, 15, 73,192, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191,105, 33, 34,180, 0, 0, 0, 0, 0, 0, 0, 0,105, 33, 34, 52, 0, 0,128,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,185,115,122, 61, 28,209, 18,193,
+ 27, 38, 71, 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,128,167, 0, 0, 0, 0, 0,164, 5, 47, 0, 0,128, 63,
+ 0,164, 5,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,146,243,109, 49, 0,157, 30, 50,
+146,243,109,153, 0, 0,128, 63, 0, 0,128,191,106, 33, 34, 52,203,167,116, 28, 0, 0, 0, 0,112, 57,108, 48, 6, 39,170,179,
+ 0, 0,128, 63, 0, 0, 0, 0,106, 33, 34, 52, 1, 0,128, 63,255,255,159, 51, 0, 0, 0, 0,213,114,146, 61, 78, 92, 65, 63,
+ 93,202,167,191, 0, 0,128, 63, 14, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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,
+ 80, 6,154, 3, 40, 1,155, 3, 25, 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, 4, 0, 0, 0,112,223,154, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,159,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,159,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,163,179, 3,136,155,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 48, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,215,183, 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,224,162,179, 3, 24,163,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,227,252,129,193, 14,112,164, 64, 9,197,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,227,252,129,193, 14,112,164, 64,
+ 9,197,229, 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,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, 17, 66,216,178, 0, 0, 0, 0, 0, 0, 0, 0,176,193,168,165, 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,176,193, 40, 27, 0, 0, 0,181,
+ 0, 0, 0, 52, 0, 0,128, 63,231,126,201, 61, 54,219, 4,178,204,187,104, 43, 0, 0, 0, 0, 95, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,219,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0,148,126,204, 63,204,200,189,191,
+ 75,156, 20, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,162,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,163,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,163,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,167,179, 3, 80,159,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 49, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,228,183, 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,224,166,179, 3, 24,167,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,227,252,129,193, 14,112,164, 64, 9,197,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,227,252,129,193, 14,112,164, 64,
+ 9,197,229, 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,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, 17, 66,216,178, 0, 0, 0, 0, 0, 0, 0, 0,176,193,168,165, 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,176,193, 40, 27, 0, 0, 0,181,
+ 0, 0, 0, 52, 0, 0,128, 63,231,126,201, 61, 54,219, 4,178,204,187,104, 43, 0, 0, 0, 0, 95, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,219,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0,148,126,204, 63,204,200,189,191,
+ 75,156, 20, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,166,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,167,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,167,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,171,179, 3, 80,163,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 50, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,241,183, 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,224,170,179, 3, 24,171,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 8, 56,130, 65, 14,112,164, 64, 35,197,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 8, 56,130, 65, 14,112,164, 64,
+ 35,197,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63, 15, 66,216,178, 0, 0, 0, 0, 0, 0, 0, 0,138,222,112, 38, 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,138,222,112, 28, 0, 0,128, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,230,126,201, 61, 91, 75,181,177, 58,240,226,171, 0, 0, 0, 0, 94, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,217,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0,127, 30,205,191,203,200,189,191,
+211,135, 20, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,170,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,171,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,171,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,175,179, 3, 80,167,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 51, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,254,183, 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,224,174,179, 3, 24,175,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 8, 56,130, 65, 14,112,164, 64, 35,197,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 8, 56,130, 65, 14,112,164, 64,
+ 35,197,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63, 15, 66,216,178, 0, 0, 0, 0, 0, 0, 0, 0,138,222,112, 38, 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,138,222,112, 28, 0, 0,128, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,230,126,201, 61, 91, 75,181,177, 58,240,226,171, 0, 0, 0, 0, 94, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,217,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0,127, 30,205,191,203,200,189,191,
+211,135, 20, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,174,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,175,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,175,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,179,179, 3, 80,171,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 52, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 12,184, 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,224,178,179, 3, 24,179,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,176, 38, 2, 66, 14,112,164, 64, 46,149,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,176, 38, 2, 66, 14,112,164, 64,
+ 46,149,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63,120,137,214,177,176,159,162,177, 0, 0, 0, 0,138,222,112, 38, 0, 0,128, 63,
+177,159, 34, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,254,255,127, 54,255,255,255, 52,
+255,255,127, 52, 0, 0,128, 63,231,126,201, 61,224,158,198, 48,128, 51,197,170, 0, 0, 0, 0, 95, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,218,145,171, 48,231,126,201,189,160,222,251, 49, 0, 0, 0, 0,125,242, 76,192,203,200,189,191,
+246, 70, 58, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,178,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,179,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,179,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,183,179, 3, 80,175,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 53, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 25,184, 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,224,182,179, 3, 24,183,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,176, 38, 2, 66, 14,112,164, 64, 46,149,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,176, 38, 2, 66, 14,112,164, 64,
+ 46,149,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63,120,137,214,177,176,159,162,177, 0, 0, 0, 0,138,222,112, 38, 0, 0,128, 63,
+177,159, 34, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,254,255,127, 54,255,255,255, 52,
+255,255,127, 52, 0, 0,128, 63,231,126,201, 61,224,158,198, 48,128, 51,197,170, 0, 0, 0, 0, 95, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,218,145,171, 48,231,126,201,189,160,222,251, 49, 0, 0, 0, 0,125,242, 76,192,203,200,189,191,
+246, 70, 58, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,182,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,183,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,183,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,187,179, 3, 80,179,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 54, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 38,184, 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,224,186,179, 3, 24,187,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,237, 10, 2,194, 14,112,164, 64,184,147,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,237, 10, 2,194, 14,112,164, 64,
+184,147,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63,130,206, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0,138,222,112, 38, 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,138,222,112, 28, 0, 0,128, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,231,126,201, 61, 24, 67,144,176, 48,212, 86, 43, 0, 0, 0, 0, 94, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,218,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0, 98,165, 76, 64,203,200,189,191,
+ 86,109, 59, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,186,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,187,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,187,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,191,179, 3, 80,183,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 55, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 51,184, 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,224,190,179, 3, 24,191,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,237, 10, 2,194, 14,112,164, 64,184,147,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,237, 10, 2,194, 14,112,164, 64,
+184,147,229, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,254,255,127, 63,130,206, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0,138,222,112, 38, 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,138,222,112, 28, 0, 0,128, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,231,126,201, 61, 24, 67,144,176, 48,212, 86, 43, 0, 0, 0, 0, 94, 81,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,218,145,171, 48,231,126,201,189,161,222,251, 49, 0, 0, 0, 0, 98,165, 76, 64,203,200,189,191,
+ 86,109, 59, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,190,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,191,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,191,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,195,179, 3, 80,187,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 56, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 64,184, 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,224,194,179, 3, 24,195,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 13,134, 34,194, 58, 92, 63,192,184,147,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,252, 77, 53,178,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34,193,144,252, 77, 53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 13,134, 34,194, 58, 92, 63,192,
+184,147,229, 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,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, 34,187,154, 49,225,149,196, 23, 0, 0, 0, 0, 16, 58,194, 39, 0, 0,128, 63,
+177,159,162, 37, 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, 56,150, 2, 50,231,126,201,189, 48, 48, 63,171, 0, 0, 0, 0, 51, 57,255, 49,130,163, 33, 38,
+232,126,201, 61, 0, 0, 0, 0,231,126,201,189, 54, 57,255,177,162,222,251, 49, 0, 0, 0, 0,240,212, 46,191,239,198,127,192,
+ 86,109, 59, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,194,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,195,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,195,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,199,179, 3, 80,191,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 49, 57, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 78,184, 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,224,198,179, 3, 24,199,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 13,134, 34,194, 58, 92, 63,192,184,147,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,252, 77, 53,178,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34,193,144,252, 77, 53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 13,134, 34,194, 58, 92, 63,192,
+184,147,229, 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,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, 34,187,154, 49,225,149,196, 23, 0, 0, 0, 0, 16, 58,194, 39, 0, 0,128, 63,
+177,159,162, 37, 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, 56,150, 2, 50,231,126,201,189, 48, 48, 63,171, 0, 0, 0, 0, 51, 57,255, 49,130,163, 33, 38,
+232,126,201, 61, 0, 0, 0, 0,231,126,201,189, 54, 57,255,177,162,222,251, 49, 0, 0, 0, 0,240,212, 46,191,239,198,127,192,
+ 86,109, 59, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,198,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,199,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,199,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,203,179, 3, 80,195,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 50, 48, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 91,184, 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,224,202,179, 3, 24,203,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,176,160, 34, 66, 28, 67, 63,192, 45,149,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,252, 77, 53,178,159, 34,193, 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,144,252, 77, 53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,176,160, 34, 66, 28, 67, 63,192,
+ 45,149,229, 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,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, 34,187,154,177, 0, 0, 0, 0, 0, 0, 0, 0, 16, 58,194,167, 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, 16, 58,194,156, 0, 0,128, 52,
+ 0, 0, 0, 0, 0, 0,128, 63, 28,240,238, 49,231,126,201, 61,240, 90, 33,171, 0, 0, 0, 0, 51, 57,255,177,130,163, 33, 38,
+232,126,201, 61, 0, 0, 0, 0,231,126,201, 61, 54, 57,255,177,163,222,251, 49, 0, 0, 0, 0,210,222, 46, 63, 34, 9,128,192,
+191, 71, 58, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,202,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,203,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,203,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 80,207,179, 3, 80,199,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 50, 49, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,104,184, 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,224,206,179, 3, 24,207,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,176,160, 34, 66, 28, 67, 63,192, 45,149,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,218, 15,201,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,252, 77, 53,178,159, 34,193, 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,144,252, 77, 53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,176,160, 34, 66, 28, 67, 63,192,
+ 45,149,229, 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,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, 34,187,154,177, 0, 0, 0, 0, 0, 0, 0, 0, 16, 58,194,167, 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, 16, 58,194,156, 0, 0,128, 52,
+ 0, 0, 0, 0, 0, 0,128, 63, 28,240,238, 49,231,126,201, 61,240, 90, 33,171, 0, 0, 0, 0, 51, 57,255,177,130,163, 33, 38,
+232,126,201, 61, 0, 0, 0, 0,231,126,201, 61, 54, 57,255,177,163,222,251, 49, 0, 0, 0, 0,210,222, 46, 63, 34, 9,128,192,
+191, 71, 58, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0,224,206,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+ 24,207,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 80,207,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,224,210,179, 3, 80,203,179, 3, 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, 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,136, 93,179, 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,170, 77,152, 65,248,108, 90,191, 90,202,168,191,
+ 0, 0, 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, 85, 90,103, 63,254, 45,186,190,115,209,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,
+176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,170, 77,152, 65,248,108, 90,191,
+ 90,202,168,191, 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,220, 19,149,176,206,185,149,179, 0, 0, 0, 0,101, 61, 84, 51, 1, 0,128, 63,
+ 45,173,146, 51, 0, 0, 0, 0,180,106, 15, 51, 67, 91, 19,178, 0, 0,128, 63, 0, 0, 0, 0,229,162, 50, 53,251, 88,214, 52,
+187,255,179, 53, 0, 0,128, 63,136,247,255, 62,164, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,138, 26,182, 62,176,248, 59, 63,
+ 46, 7, 20, 63, 0, 0, 0, 0, 36, 39, 74,191, 26, 67,194,189,218, 45, 27, 63, 0, 0, 0, 0, 4, 80,121,193,162,189, 99, 65,
+ 13, 24, 70,192, 0, 0,128, 63, 30, 4, 0, 0, 0, 20, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 79, 66, 0, 0, 92, 3, 0, 0,224,210,179, 3,115, 0, 0, 0, 1, 0, 0, 0,112,214,179, 3, 80,207,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 49, 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, 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,200, 96,179, 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, 98,160, 52,193, 56,135, 93,193,153,227, 19,193, 0, 0, 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,
+ 85, 90,103, 63,254, 45,186,190,115,209,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,
+138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191,
+ 47, 7, 20, 63, 0, 0, 0, 0, 98,160, 52,193, 56,135, 93,193,153,227, 19,193, 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, 12, 73,149, 51,
+183,223, 34,179, 0, 0, 0, 0,180, 66, 41, 50, 0, 0,128, 63,176, 27,138, 49, 0, 0, 0, 0,201, 75, 13, 50, 76, 10,177, 50,
+ 1, 0,128, 63, 0, 0, 0, 0, 41,189, 56,179,113,162,231,180, 67,151,100,180, 0, 0,128, 63,139,247,255, 62,165, 21, 44,191,
+252,203, 11, 63, 0, 0, 0, 0,141, 26,182, 62,176,248, 59, 63, 46, 7, 20, 63, 0, 0, 0, 0, 36, 39, 74,191, 19, 67,194,189,
+216, 45, 27, 63, 0, 0, 0, 0, 42,133, 74, 65, 29, 20,102, 63,116,194, 34, 65, 0, 0,128, 63, 30, 4, 0, 0, 0, 20, 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,236, 81, 56, 62,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 92, 3, 0, 0,112,214,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 0,218,179, 3,224,210,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 50, 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, 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,232,105,179, 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,111, 56,183,192, 61, 86, 90,193,242,190, 40, 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,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,143,104,191, 93, 33, 11,191,232, 45, 17, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,134,194, 12,191, 1,236, 39, 63,180, 97, 4, 63, 0, 0, 0, 0, 37,182, 59,191,170, 20,169,189,
+ 65,200, 44,191, 0, 0, 0, 0, 11,208,204,190, 93, 18, 64,191,215,191, 6, 63, 0, 0, 0, 0,111, 56,183,192, 61, 86, 90,193,
+242,190, 40, 65, 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,238,165, 47,180,227,129, 13, 50, 0, 0, 0, 0,163, 29,131,178, 1, 0,128, 63,
+ 76,221,150,177, 0, 0, 0, 0, 14, 36, 14,179,106,112,163, 48, 0, 0,128, 63, 0, 0, 0, 0,255,187,156,179, 91, 51,158,181,
+179,247,156,180, 0, 0,128, 63,135,194, 12,191, 35,182, 59,191, 12,208,204,190, 0, 0, 0, 0,181, 97, 4, 63, 65,200, 44,191,
+213,191, 6, 63, 0, 0, 0, 0, 0,236, 39,191,162, 20,169, 61, 92, 18, 64, 63, 0, 0, 0, 0,135, 79,167,192, 33,228,179, 63,
+ 21,212, 26,193, 0, 0,128, 63, 30, 4, 0, 0, 0, 20, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 79, 66, 0, 0, 92, 3, 0, 0, 0,218,179, 3,115, 0, 0, 0, 1, 0, 0, 0,144,221,179, 3,112,214,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 51, 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, 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, 8,100,179, 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,176,147,104, 64, 42, 84, 23,193,116, 77,171, 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,
+ 85, 90,103, 63,254, 45,186,190,115,209,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,
+138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191,
+ 47, 7, 20, 63, 0, 0, 0, 0,176,147,104, 64, 42, 84, 23,193,116, 77,171, 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,197,201, 17,180,
+ 99,220,102, 50, 0, 0, 0, 0,123,165,191, 50,254,255,127, 63, 10,194,140, 50, 0, 0, 0, 0, 41,160,180,178, 91,103, 73, 50,
+254,255,127, 63, 0, 0, 0, 0,254,255,127, 52,254,255,127,181,253,255,255, 52, 0, 0,128, 63,136,247,255, 62,164, 21, 44,191,
+251,203, 11, 63, 0, 0, 0, 0,138, 26,182, 62,175,248, 59, 63, 45, 7, 20, 63, 0, 0, 0, 0, 37, 39, 74,191, 18, 67,194,189,
+217, 45, 27, 63, 0, 0, 0, 0, 88, 99, 93,192,122, 98, 80,190,223,119,112,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 20, 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,236, 81, 56, 62,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 92, 3, 0, 0,144,221,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 32,225,179, 3, 0,218,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 52, 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, 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,248,102,179, 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,249,147,251,192,206, 0, 24,193, 67,131,104,192,
+ 0, 0, 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, 85, 90,103, 63,254, 45,186,190,115,209,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,
+176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,249,147,251,192,206, 0, 24,193,
+ 67,131,104,192, 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,254,255,127, 63, 55,105,222, 50,186,168, 17, 51, 0, 0, 0, 0,243,228, 47,178, 0, 0,128, 63,
+ 81, 76,155,178, 0, 0, 0, 0,170,191, 22, 50,214, 89, 50, 51,254,255,127, 63, 0, 0, 0, 0,254,255,127,181, 0, 0,128,181,
+ 35, 5,136,168, 0, 0,128, 63,139,247,255, 62,165, 21, 44,191,252,203, 11, 63, 0, 0, 0, 0,140, 26,182, 62,175,248, 59, 63,
+ 45, 7, 20, 63, 0, 0, 0, 0, 36, 39, 74,191, 20, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,147,142,176, 64,101, 22,170,191,
+ 27, 28,246, 64, 0, 0,128, 63, 1, 0, 0, 0, 0, 20, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 79, 66, 0, 0, 92, 3, 0, 0, 32,225,179, 3,115, 0, 0, 0, 1, 0, 0, 0,176,228,179, 3,144,221,179, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 56, 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, 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, 40,109,179, 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,145, 75,188, 63, 44,197,107,193, 5,147, 81, 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,
+218, 15,201, 63, 0, 0,128, 37,255,255,127, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,255,255,127, 37,
+ 0, 0,128,165, 0, 0, 0, 0,255,255,127, 37,105, 33,162, 51, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 37, 0, 0,128,191,
+105, 33,162, 51, 0, 0, 0, 0,145, 75,188, 63, 44,197,107,193, 5,147, 81, 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,254,255,127, 63, 44,197,107, 53,
+ 4,147, 81,180, 0, 0, 0, 0,253,255,127, 37, 0, 0,128, 63, 64, 90,136, 48, 0, 0, 0, 0,254,255,127,165, 44,197,107,155,
+ 0, 0,128, 63, 0, 0, 0, 0,254,255,255, 51,255,255,255,181,254,255,127, 52, 0, 0,128, 63, 0, 0,128, 63, 25, 58,194,178,
+ 67,191,128,179, 0, 0, 0, 0, 4, 0,128,165, 0, 0,128, 63,254,255,255, 39, 0, 0, 0, 0,156, 90,241, 49,220, 13,171,177,
+255,255,127, 63, 0, 0, 0, 0, 33,159,189,191, 47,164,188,191,151,188,153,192, 0, 0,128, 63, 32, 0, 0, 0, 0, 16, 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,236, 81, 56, 62,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,176,228,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,176,232,179, 3, 32,225,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 0, 0,
+108, 97,110,101, 46, 48, 48, 51, 0, 0, 0, 0, 1, 0, 0, 4, 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,216,194,182, 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, 64,232,179, 3,120,232,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 0,131,102, 60, 14,112,164, 64, 24,211,229, 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,178,159, 34, 65,178,159, 34, 65,
+177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 0,131,102, 60, 14,112,164, 64,
+ 24,211,229, 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,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,252,118,143,165, 0, 0, 0, 0, 0, 0, 0, 0,176,193,168,165, 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,176,193, 40,155, 0, 0, 0, 53,
+ 0, 0, 0, 0, 0, 0,128, 63,231,126,201, 61,219,145,171, 48, 32, 19, 70, 29, 0, 0, 0, 0, 65,209,217,164, 51, 57,255, 49,
+232,126,201, 61, 0, 0, 0, 0,235, 66,172, 48,231,126,201,189, 79,216,251, 49, 0, 0, 0, 0, 18,136, 29,187,203,200,189,191,
+139,139, 9, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0, 64,232,179, 3, 0, 0, 0, 0, 1, 0, 0, 0,152, 64,181, 3, 68, 65, 84, 65, 4, 0, 0, 0,
+120,232,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,176,232,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0,176,236,179, 3,176,228,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,162,186, 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, 64,236,179, 3,120,236,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,100, 82, 7,189, 21,204,103,191,241,165,230, 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,153, 39,155, 64,153, 39,155, 64,
+153, 39,155, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0,192, 37,255,255,255, 36, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153, 39,155, 64,152, 39, 27, 38,102,187,232,166, 0, 0, 0, 0,102,187,232, 38,157,134,196, 52,
+153, 39,155, 64, 0, 0, 0, 0,154, 39, 27, 38,153, 39,155,192,157,134,196, 52, 0, 0, 0, 0,100, 82, 7,189, 21,204,103,191,
+241,165,230, 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,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,236, 48,206,152, 9, 66, 41, 24, 0, 0, 0, 0,216, 55, 60,152, 0, 0,128, 63,
+ 88,133,105,166, 0, 0, 0, 0,226,159, 91,151, 64,218, 93, 38, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 25, 50, 83, 62,147,101,158, 36, 27, 50,211, 35, 0, 0, 0, 0,147,101,158,164, 25, 50, 83, 62,
+ 59,119,189, 38, 0, 0, 0, 0, 0, 94,204,173, 16, 58, 97,175, 25, 50, 83, 62, 0, 0, 0, 0,135, 62,153, 59,184, 97,110,185,
+118, 71,238, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 4, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0, 64,236,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
+120,236,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,176,236,179, 3,115, 0, 0, 0,
+ 1, 0, 0, 0, 40,241,179, 3,176,232,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48,
+ 50, 0, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 94,181, 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,176,240,179, 3,
+176,240,179, 3, 64,240,179, 3,120,240,179, 3, 1, 0, 0, 0, 1, 0, 0, 0,242,187,213,191,194,145,134, 63,254,100, 35, 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,243, 0, 28, 65,246, 0, 28, 65,
+243, 0, 28, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,110,135, 63,180,169, 59, 62,138,115, 1,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,198, 49, 6, 65,115,154,148,192, 3,113,227,191, 0, 0, 0, 0,159,250,106, 64,189,207, 91, 64,
+ 80,170, 5, 65, 0, 0, 0, 0, 46,151, 86,192,125, 94,251,192,188,127,150, 64, 0, 0, 0, 0,242,187,213,191,194,145,134, 63,
+254,100, 35, 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,220,198, 33,177, 33, 91, 79,179, 0, 0, 0, 0,132, 62,152, 49, 0, 0,128, 63,
+ 52,168,172, 50, 0, 0, 0, 0, 31, 6, 96,177,234,190, 21, 51, 0, 0,128, 63, 0, 0, 0, 0,212, 90,228, 50,171,224,143,179,
+223, 27,189,175, 0, 0,128, 63,143,174,180, 61,160, 48, 30, 61,223,118, 16,189, 0, 0, 0, 0,162, 29,153,188, 38,248,179, 61,
+115,162, 74, 61, 0, 0, 0, 0, 15, 21, 72, 61,160,250, 19,189, 88, 57,169, 61, 0, 0, 0, 0, 4,107, 50, 63, 88, 46,204,190,
+177,206, 79, 63, 0, 0,128, 63, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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,
+ 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 4, 0, 0, 0, 64,240,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
+120,240,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0,176,240,179, 3, 79, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 31, 0, 0, 0, 83,117, 98,115,117,114,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, 1, 0,
+ 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 40,241,179, 3,115, 0, 0, 0, 1, 0, 0, 0,
+ 40,245,179, 3,176,236,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 51, 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, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,243,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,117,184, 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,
+184,244,179, 3,240,244,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 16,194,203,187,155, 89, 45, 63,244,153,230, 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, 56,135, 72, 63, 56,135, 72, 63, 56,135, 72, 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, 56,135, 72, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,135, 72, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,135, 72, 63, 0, 0, 0, 0, 16,194,203,187,155, 89, 45, 63,244,153,230, 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,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, 57,135,200, 47, 57,135,200,178, 1, 0,128, 63, 0, 0, 0, 0,180,192,175,176, 32,132,146, 51,193, 40, 10,179,
+ 0, 0,128, 63,144,104,163, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 33, 52, 34,252,250,206, 51,144,104,163, 63,
+ 0, 0, 0, 0, 60,240,202,173,144,104,163,191,130, 64,204, 51, 0, 0, 0, 0,105, 93,173,187,172,176, 88,193,178, 56,118,186,
+ 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 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,144,189,206, 3,
+176, 1,206, 3, 25, 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,
+ 4, 0, 0, 0,184,244,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,240,244,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 40,245,179, 3,115, 0, 0, 0, 1, 0, 0, 0,
+ 40,249,179, 3, 40,241,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 52, 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, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,117,184, 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,
+184,248,179, 3,240,248,179, 3, 1, 0, 0, 0, 1, 0, 0, 0, 0, 31, 10, 58, 59, 94,236, 63,236, 84,231, 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, 91,188,110, 63, 91,188,110, 63, 91,188,110, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 91,188,110, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 50,151, 51, 91,188,110, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 91,188,110,191, 90, 50,151, 51, 0, 0, 0, 0, 0, 31, 10, 58, 59, 94,236, 63,236, 84,231, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 1, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,255,127, 63,226, 53, 25,179,
+ 0, 0, 0, 0, 0, 0, 0, 0,167,120,247,166, 1, 0,128, 63, 0, 0, 0, 0,183,132, 39,174,239,106,181,179,116,226,155,179,
+ 0, 0,128, 63,160, 65,137, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,204,221,150,160, 65,137, 63,194,226, 40, 40,
+ 0, 0, 0, 0,248,127, 14, 45,115,141,149,176,161, 65,137, 63, 0, 0, 0, 0, 29, 80, 63,188,103, 95,226,187, 87, 19, 74, 65,
+ 0, 0,128, 63, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 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, 0, 0, 0, 0,
+ 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, 68, 65, 84, 65,
+ 4, 0, 0, 0,184,248,179, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,240,248,179, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 40,249,179, 3,115, 0, 0, 0, 1, 0, 0, 0,
+184,252,179, 3, 40,245,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 53, 0, 48, 48,
+ 51, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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, 72, 90,179, 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,128,155,195,189, 20,145,188, 64, 94,220, 88, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,180,134, 63, 48,190,141, 37,253, 55, 57, 35, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,253, 55, 57, 35, 48,190,141,165, 0, 0, 0, 0,219,128,112, 37, 52,177,253, 62, 94, 93, 94, 63,
+ 0, 0, 0, 0, 52,133, 22, 37, 94, 93, 94,191, 52,177,253, 62, 0, 0, 0, 0,128,155,195,189, 20,145,188, 64, 94,220, 88, 65,
+ 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,118, 42, 31, 25,242,108,131,153, 0, 0, 0, 0, 0, 0, 0,176, 0, 0,128, 63,210, 21, 66,178,
+ 0, 0, 0, 0, 5, 0, 0,176, 25,245,158, 50, 1, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 50,118, 42,159, 11,242,108, 3,140,
+ 0, 0,128, 63, 0, 0,128, 63,219,128,112, 37, 53,133, 22, 37, 0, 0, 0, 0, 80, 90,231,174, 94, 93, 94, 63, 52,177,253, 62,
+ 0, 0, 0, 0, 0, 68,239,172, 50,177,253,190, 95, 93, 94, 63, 0, 0, 0, 0,150, 98,174, 61, 85,101,144,193,196,124,253, 64,
+ 0, 0,128, 63, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 5, 0, 1, 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,236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 4, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 92, 3, 0, 0,184,252,179, 3,115, 0, 0, 0, 1, 0, 0, 0,184, 0,180, 3, 40,249,179, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 54, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,185,186, 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, 72, 0,180, 3,128, 0,180, 3, 1, 0, 0, 0, 1, 0, 0, 0,
+ 94, 52,252,190,174,101,228, 65,141,116, 17, 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,235,239, 30, 66,236,239, 30, 66,235,239, 30, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138,174, 95, 63,
+ 98,132,123, 37, 61, 56, 87,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235,239, 30, 66,105,158, 5,168,108, 39, 28,168,
+ 0, 0, 0, 0,212,129, 77, 40, 66, 15,204, 65,158,186,243, 65, 0, 0, 0, 0, 55, 89, 13,165,156,186,243,193, 65, 15,204, 65,
+ 0, 0, 0, 0, 94, 52,252,190,174,101,228, 65,141,116, 17, 65, 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,151,169,232, 24,151,190,157, 25,
+ 0, 0, 0, 0, 21, 24,149, 24, 0, 0,128, 63,109,157, 59,178, 0, 0, 0, 0,191,231, 64,153, 1,158,199,178, 1, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,101, 43,206, 60, 25, 74, 5, 35,141, 90,183,159,
+ 0, 0, 0, 0, 41,143,202,162,101, 20,158, 60,193, 89,132, 60, 0, 0, 0, 0,188, 83,173, 34,192, 89,132,188,103, 20,158, 60,
+ 0, 0, 0, 0, 11,215, 70, 60, 61, 43, 67,191,185,241, 31, 63, 0, 0,128, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,
+143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0, 72, 0,180, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,128, 0,180, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 92, 3, 0, 0,184, 0,180, 3,115, 0, 0, 0, 1, 0, 0, 0,184, 4,180, 3,184,252,179, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66,112,114,101,118,105,101,119, 99,117, 98,101, 0,117, 98,101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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, 64,193,186, 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, 72, 4,180, 3,128, 4,180, 3, 1, 0, 0, 0, 1, 0, 0, 0,
+128,253, 88, 59,220,118,160, 63, 0, 15, 37, 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, 84, 88, 68, 64, 84, 88, 68, 64, 83, 88, 68, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,190,237, 62,
+108,230,217,190, 20,151, 52, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 38, 8, 64,191,228,231, 63,186, 31,162, 63,
+ 0, 0, 0, 0, 35,118, 13,192, 2, 61,220, 63, 31, 44,160, 63, 0, 0, 0, 0,166, 52,234, 60,102,223,227,191, 55,229, 31, 64,
+ 0, 0, 0, 0,128,253, 88, 59,220,118,160, 63, 0, 15, 37, 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,187,122,172,178,103,144, 8, 50,
+ 0, 0, 0, 0, 7,239, 27,179, 0, 0,128, 63,247,131,152,178, 0, 0, 0, 0,149,110,134, 50,189,195,169, 50, 1, 0,128, 63,
+ 0, 0, 0, 0,255,223,172, 50, 56, 88,136,179,159,134, 16,180, 0, 0,128, 63, 10,115,103, 62,201,122,112,190,191, 17, 71, 59,
+ 0, 0, 0, 0,116,205, 9, 62,205, 36, 8, 62,136,232,135, 62, 0, 0, 0, 0, 1, 27, 69,190,224, 50, 59,190, 25,176, 65, 62,
+ 0, 0, 0, 0,110,176, 16,192,158, 71, 9,192,115, 90,244, 63, 0, 0,128, 63, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,
+143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0, 72, 4,180, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,128, 4,180, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 92, 3, 0, 0,184, 4,180, 3,115, 0, 0, 0, 1, 0, 0, 0, 8, 57,181, 3,184, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66,112,114,101,118,105,101,119,104, 97,105,114, 0,108, 97,110,101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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, 8,208,182, 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, 16,137,156, 3, 16,137,156, 3, 72, 8,180, 3,128, 8,180, 3, 1, 0, 0, 0, 1, 0, 0, 0,
+ 86, 92,200, 63, 7,205,227, 63,149,199, 9,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,234,126, 47, 64,234,126, 47, 64,236,126, 47, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,225, 80, 2, 63,
+ 5,211, 15,191, 92,219, 18, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,254, 18, 64, 23,209,169, 62, 27,251,186, 63,
+ 0, 0, 0, 0, 71,254,133,191,207, 40, 17, 64,229,194,144, 63, 0, 0, 0, 0, 78, 38,137,191, 48,162,192,191,125,176, 1, 64,
+ 0, 0, 0, 0, 86, 92,200, 63, 7,205,227, 63,149,199, 9,189, 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,225,128, 25,179,157,103, 88,179,
+ 0, 0, 0, 0,249,162,132, 50, 1, 0,128, 63, 89,156,139, 51, 0, 0, 0, 0,225,204,139,179,160, 96,185,178, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 0, 52, 1, 0, 0,180, 1, 0, 84,180, 0, 0,128, 63,244,100,156, 62,135,143, 14,190, 52,235, 17,190,
+ 0, 0, 0, 0,175,239, 70, 62,102, 4, 26, 62, 72,251,137, 62, 0, 0, 0, 0,174,172, 52,189,211,112,154,190, 67,243, 76, 62,
+ 0, 0, 0, 0,149, 56, 36,191,139, 98, 66,192,168, 5, 68, 64, 0, 0,128, 63, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 2, 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,236, 81, 56, 62, 0, 0, 0, 0,
+143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,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,168, 90,154, 3,168, 90,154, 3,184, 8,180, 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, 25, 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, 4, 0, 0, 0, 72, 8,180, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,128, 8,180, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+128, 0, 0, 0,184, 8,180, 3,117, 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,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, 0, 0, 0, 0, 68, 65, 84, 65, 76, 1, 0, 0,168, 90,154, 3, 66, 1, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,203,186, 3,104, 9,180, 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,
+244,100,156, 62,134,143, 14,190, 52,235, 17,190, 0, 0, 0, 0,172,172, 52, 61,211,112,154, 62, 69,243, 76,190, 0, 0, 0, 0,
+176,239, 70, 62,102, 4, 26, 62, 73,251,137, 62, 0, 0, 0, 0,188,211, 12,191,198,176,160,190, 56,156, 22, 63, 0, 0,128, 63,
+ 0, 0, 0, 64, 0, 0, 0, 0, 17, 2, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 55,181, 3, 68, 65, 84, 65,168,147, 0, 0,104, 9,180, 3, 64, 1, 0, 0,
+150, 0, 0, 0, 0, 0, 0, 0, 20,135, 17,192, 36,121, 97,192,112, 32,141, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,157,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 96, 32, 63,185,201,160, 62,160, 3, 6, 63, 11, 34,248,190,
+206, 53,185, 60,192,197,178, 61,174,184, 53, 63,223,172,162,190,109,136,224, 62,142,173, 61,191,180, 96, 10, 60,200,196,163, 61,
+ 78,182, 99, 63,165,242,180, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+248,112,150, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,111, 46, 7,192,143, 26, 60,192, 28,147,207, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,158,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,121,229,190,108, 50, 41,191,136,152, 7,191,156,100,146,190,146,141, 25,191,
+ 39, 92,142, 62,212,104, 18, 63,227,105,105,190,113,156, 96, 62,137,226, 69,191,147,247, 17, 61, 51,172, 44, 62, 17,125, 54, 63,
+ 69,195,169, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,144, 63,245, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+224,103,174,189, 60, 88, 17,192,230, 35, 76, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,
+200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,159,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,101,160,155, 62, 59, 87,152, 62,118,199, 84,191, 86, 89,183, 62,118,103,231, 62,110, 47,177,189,
+155, 8, 4,191,100, 60,199, 62,197, 40,177,189, 2, 14, 46, 62,102, 96, 39, 62,101,119,242, 61,189,168,146, 62, 55, 9,221, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,135, 36, 87, 61, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75,102,131,192,
+196,241, 26, 63,140,198, 76, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,206,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,160,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 49, 80, 39, 63,171, 26,218,190, 89,118, 16, 63,130, 72,138,190,169,255,122,190,185,111, 14,191, 21,207, 38, 63,
+ 73,252,211, 61,198,177, 80,191, 43,154,203,189,227,146, 53, 61, 63,180,115, 63,216,113, 42, 59,125, 63,144, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,175, 95,142, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 43,226,189,253, 85,220,191,
+225,104,101, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,161,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 97, 45, 63,119, 47,205,190, 35,117, 19, 63,166,125, 98, 62,242,195, 73, 62,124,228,243, 62,119, 86, 11, 63, 70,156, 89, 62,
+230,232, 88, 63,130, 53,204,190,250,120,128, 62, 19,194, 20, 62, 61, 15, 90, 62, 92, 30,200, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,108,159,129,191, 8,210, 6, 63, 35,221,152, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,235,163,214, 62,200,206,183,190,205,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,104,162,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,167,210,190,
+194,172,139, 62,250,220, 35, 63, 30,182, 22,191,122, 3,136, 61,109,164,176,190, 30,153,147,190,255,248, 10,188,234, 90,160,190,
+ 89,241,205,190,148,235, 25, 63,206,172,146, 62,137,195, 52, 61, 99,142,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 37,227, 77, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,167,189,191,217, 59,104,192,184,179,184, 63,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+112,163,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 45,121, 62,120,126, 98, 63,
+ 60,171,135,189,139,174,200,190,220,142, 21, 63, 77, 70, 40,191,118, 70,150, 62, 4,245, 92, 61,159,118,174,190,176,217, 49, 63,
+120,167,104, 60,166,104,235, 60,218,251, 73, 63, 13, 25, 44, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,217, 2,247, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,112, 30, 63,111, 69, 82,192, 59,191, 51, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,164,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,227,137,190,206,195, 71,191, 70, 31, 96,190,
+127, 46, 5, 63, 99, 51,214,189,228, 61, 67,191,134, 90, 2, 62,120,214,146,190, 34,111, 33, 62,136,229,187,190, 27,112,241, 60,
+ 0,187,177, 60, 4,134,171, 62,164, 35, 29, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,130,192, 56, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118,148,176,191, 88,200, 1, 63, 89, 48,146, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,165,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,169, 82,190,102,214, 57, 63, 55,112, 36,191, 59,205, 9, 62,
+184,139, 5, 63,105, 32, 43,190,120, 62, 37,191,220,215, 15, 63,180, 2, 8, 63,198,170,163, 62,160,178, 8, 63,185,164,184, 62,
+ 68, 72, 63, 61, 16,104,112, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 97,249,192, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,200, 80,168,191, 8,154,165,191,229,248, 80, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,166,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,145, 5,191, 83, 77,126, 62, 14,133, 63,191,190, 5,167, 62,123,212, 96,190,
+233,136,176, 62, 25,193, 80,189,147, 49, 18, 62,222, 40, 25, 62, 59,204, 10,191,177, 46,104, 62, 36,106,150, 62, 2, 61,138, 62,
+ 4,131, 86, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 39, 27, 19, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,190,246,189,233,129, 90,192,224,155, 20, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,
+206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,167,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 77, 14,191,231, 81,154, 62, 41,220, 22,191,104,189, 0,191,214,167,160,190,140, 60, 22,190,
+ 37, 85, 74, 63, 32,253, 8,191, 96,146, 23, 61,196, 30,177,190, 79, 25,187, 60,207,244,194, 60, 53,234,253, 62,233, 52,234, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,218, 21, 79, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,231, 67,190,
+144,105, 11,189,210,111,153, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,168,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 74,110,205, 62,146,226, 27,191, 73, 95,219, 61, 75, 3, 45, 63,222,109,147,190,152,196, 40, 63, 36,136,116,190,
+181, 21,190,190,211, 38,213,190,114,230,183, 62,206,217, 24, 63, 59,222, 25, 62, 0, 50,134, 61,139,161, 63, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,180, 67,127, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,217,158, 63,122,225, 17,192,
+213,158,120, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160,169,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176, 95, 22, 63,172, 95,210,190,114, 70, 46,191, 67, 71, 26, 62,188,164,234, 61,121,120, 78,191,186,229,108,188,144,225, 72,190,
+197,218, 42,190, 83,104,114,191, 34,213, 73, 62,217,230, 49, 61,217,117,187, 61,143,253, 42, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,226,144, 95, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29,205,127,191,231,116,142,191,116, 64,100, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,168,170,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 25,132,189,
+ 67,167, 41,191,249,145,174,190,171,227, 41, 63, 84,208, 94, 62, 98, 21, 50, 63,138,162, 46,191,136, 53, 56,191, 9, 44,160, 62,
+ 15, 42,188,190,109,124,145, 62, 47, 84,135, 62, 95, 56, 95, 62,104, 38,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,183,116, 87, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,106, 67,192,239, 1,236, 62,230,139,105, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176,171,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 72, 62,147,226,176, 62,
+ 67,185, 48,191,255,215, 26,191,242,158,254,187, 89,238,201,190, 99,166, 39, 63,102,238, 3,191,206,229, 10, 62,165, 53,230, 62,
+ 37,227,100, 62,230, 38, 54, 63, 87, 4, 43, 61,166, 1,190, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,213, 26,126, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 63, 58,191,242, 44,102,191,239,155,119, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,172,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198,238,131, 61, 49, 99, 58,191, 63,180, 26, 63,
+201, 92,162,190,113,254,209, 62,151, 67, 12, 63, 80,138,197, 62,197,116, 72,191,117,129,182,190,180,137, 76, 62,232,134,178, 62,
+ 23,134,113, 62,235,242, 46, 62, 45,121,122, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,248, 12,169, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,244,173,175, 62,136,194,141, 61, 0,239,164, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,173,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213, 38, 28, 63, 66,248,166, 60,227,199, 67,191,127,123, 83,190,
+122,119,224,190, 73, 46,149, 62,135, 43, 62, 62, 30,175,199, 62, 97,224, 2, 63,180,198,250, 62,211, 97, 48, 63, 38,134,130, 61,
+167, 53, 8, 61, 56, 40, 91, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 93,115,157, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,127,188, 36,192, 83,192, 42,192, 20, 24,202, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,174,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,121, 82,190,233,142,216,190, 94,156, 83,191,222, 73,158, 62,170,207, 3, 63,
+ 63, 41, 39,191, 2,164,147, 62, 36,187, 38,191, 0, 1,218, 62,145,119, 32,191,191,242,154, 60, 14,165,130, 62,127,236, 49, 63,
+163, 44,253, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 13,194,130, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+191,117, 51, 63, 40,247, 44,192, 84, 59, 82, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,175,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 89,176, 71, 59,214, 55, 18,191, 67, 82,223,190,142, 2, 50, 63,235, 17,202, 61, 51,118,199, 62,
+129,125, 72, 63, 86,250, 36,191, 70, 99, 90, 61,125, 38, 25, 63,218, 50,227, 61, 48,152,110, 61,166, 58,104, 62,121,161, 26, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,218, 44,192,
+131,112,159,190, 68,196, 80, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,176,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 62, 65, 39,191,175,203,203,190, 24, 58, 8,191,132,178,185,190, 48,133, 27, 63,166,150, 35, 63,195,164,174,189,
+146, 20,209,189,124, 43, 3,191,219,188, 54, 63, 23,126, 53, 62, 93,113, 22, 63, 29,104, 42, 62,166,168,140, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 90,122,222, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,253, 61,191,212,216, 43,190,
+219,239,140, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224,177,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 59, 62,251,190,154,207,132, 62,191,198, 19,191,122, 82, 25,191,179,114,169,190,242, 80, 46,191,161, 92,100,189,125,103,188, 62,
+ 0,234, 23,191, 12,140, 22, 63, 24, 36,252, 62,191,130,121, 62, 96,245,198, 61, 98,186, 42, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 62,205, 89, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,168,212,191, 47,175, 30,192, 94,228, 12, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232,178,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,136, 6, 62,
+240,135, 58,191, 89,198,233, 61, 57,148, 41, 63,151,188,189,190,156, 72,189,190,184, 14, 86, 63,185, 54,165,190,131,220, 49, 62,
+ 60, 87,189,189,118,198,167, 61, 92,200, 80, 62,157,210, 10, 63,240, 9, 48, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,184,238,190,237,206,230,191,208,122, 85, 64,190, 81, 55,191,
+107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240,179,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,165, 30, 63,161, 50,249,190,
+180,213, 86,189,178, 10, 29,191,227,247, 49,191,215,139, 7,189,222,249,154,189,153, 77, 23,191,160, 58, 14, 63, 72, 47, 15, 61,
+138,132, 94, 62,167,190, 48, 62,203, 41,136, 62,157, 52,176, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 38,177,233, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 19,104, 63,179,122,254,191,115, 37,123, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,180,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,231,181, 62, 36, 19, 51, 63,126, 5, 6,191,
+231, 27,170,190,128,253, 35,189,182, 11,151,189, 74,171,178, 62,127,231, 49, 63,204,146,128, 62, 88,100, 17, 62,197,245,124, 62,
+ 30,108,130, 61,201,152,229, 61,242,193, 19, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 56,156, 79, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,172,106,191, 63,110,225, 42,192, 2,170,110, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,
+236,163,214, 62,197,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,227, 27,191, 17, 83, 26, 63, 27,229, 2,191, 83, 48,135, 61,
+199,244,134, 62, 55, 37,151,190,210,195,237,189,249, 39, 17, 63,154, 1, 76, 61, 75,194, 79,191,240, 99,249, 61,190, 88,249, 60,
+174, 20,183, 61, 39, 38, 66, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+150, 40,178, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,121, 3, 12,192, 63, 11,252,190,146,136, 89, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,183,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 59, 20,191, 30, 36, 17, 63,112, 57,252,190, 32,101,162, 62,139, 6,160, 62,
+ 57,160, 80, 61,109,243,245, 61, 41, 18,224,190,182,154,227,188,238,196,139,190,173, 28,108, 62,191,152,246, 62,199, 50, 61, 62,
+ 31,254,210, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 20,166, 56, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+250,104,187,191, 56, 86,139,189,145, 23,131, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,
+203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,184,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,228, 80, 19,191,118,138, 16,191,122,210, 6,191,139, 14,138, 62, 73, 65,189, 62, 19, 89,244,189,
+205, 5, 83, 62, 94,159,107,190, 19,199,255, 62, 14,124, 48,190, 15, 67,208, 62,184, 57,190, 62,119,154,219, 61,111,114,234, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,203, 51,223, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 56,161, 62,
+255,221,207,191,202,110,120, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,185,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,138,124, 47, 63, 12,193, 0, 63,124, 39,176, 62, 68, 3,204,190,132,180, 43, 61, 66,184,104,189, 69,173, 54,191,
+ 24,239,116,189,191,183, 53,190,120, 91,198,190,123, 33,150, 62, 68, 30,226, 61,224,121, 27, 62, 4,154,227, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,117, 22, 35, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89, 41,192,117,107, 25,192,
+174,245,222, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32,186,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66,202,207, 62,211, 32, 47, 63,139,219, 0,191,197,212,172,190,195, 68, 65, 63,105,152,217,190,159,218,214,190, 85,113, 84,190,
+194,108,158,190,229,217,235, 61, 82,179,202, 60,197,106,157, 62,211,197, 33, 63, 9,243, 18, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 1,162,102, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94,238,220,191, 91, 70,150,191,203,192, 72, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40,187,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 95, 22, 63,
+172, 95,210,190,114, 70, 46,191, 67, 71, 26, 62,188,164,234, 61,121,120, 78,191,186,229,108,188,144,225, 72,190,197,218, 42,190,
+ 83,104,114,191, 13,183, 77, 62,158,153,182, 62, 65, 59,143, 62, 52,159, 38, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,226,144, 95, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,234,116,192,224,101,238,188,165, 20, 56, 64,190, 81, 55,191,
+107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48,188,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,136, 6, 62,240,135, 58,191,
+ 89,198,233, 61, 57,148, 41, 63,151,188,189,190,156, 72,189,190,184, 14, 86, 63,185, 54,165,190,131,220, 49, 62, 60, 87,189,189,
+ 31,255,242, 60,231,194, 83, 63,189, 56, 5, 62, 68,188, 85, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,209,240,189,178,183, 95, 63, 5, 67,176, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,189,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,114, 86,191,137,141, 2,191,227,140,105, 61,
+ 70,121, 63,190,130,242,218, 62,237,163,132,190,219,235, 16, 60, 85,203,248, 62, 79,244, 80,191,103, 0,148, 62,153,189, 85, 63,
+151,104,200, 61,246, 55,142, 60, 74, 57, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 31,252, 33, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,206, 54, 25,192,171,197,162, 62, 6, 16,121, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,
+236,163,214, 62,197,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,190,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,100,244,190,182, 69, 91,191, 60,137,144,189,161,126, 59, 62,
+ 28,228,200,190, 60, 49,170, 62,225,139,250,189,244,143,111, 62,252,103,100,191,148, 32, 79, 62,104,246,163, 62, 91,201, 16, 63,
+ 24,104,136, 61,227,230, 66, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+182, 88, 41, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 29, 57, 61,192,236, 53, 39,191,173,221, 55, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,
+198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,191,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 43, 35,190,242,210,225, 61,197, 58, 30, 63,229, 8, 67, 63,215,176,222, 61,
+ 70, 15, 12, 63, 80,195,165, 62,218, 72,227, 61,188, 66, 87,191,145,213,195, 62, 39,218,212, 61,242, 20, 25, 63,122, 70,118, 62,
+159,226,107, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,173, 74, 64, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+249, 62, 40,191, 16,113, 26, 63, 50,179,160, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,192,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,190, 29,224,190,239, 44, 4, 63,125,217, 49, 63,107, 25,121,190,117,172,217, 62,242, 98,116,190,
+148,162, 42, 63,142,178,199,190, 54,105, 13,191, 83,107,163,190, 64,186, 45, 63,109,122, 91, 62, 32,134, 21, 61, 21,118,144, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,113,107, 73, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 51,138,191,
+199, 14,110,192, 18, 66,203, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,193,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 36, 78, 39, 63,128, 50,251,190,139,185,189,190,175, 4,226, 62,118, 23,153,190, 67,228,120,190, 50,226, 42,191,
+239,243, 86,191, 37, 42,189,190, 66, 1,190,190,235,223,153, 59, 21,174,243, 59,231,160, 60, 63,251,135,128, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,167,245,105, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 75,186,191,170,205,204,191,
+132,169, 61, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,194,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118,223,155, 62,249,196, 3,191,115, 12,163,190,212, 73, 60,191, 59,208, 85, 62, 65, 11,155, 62, 28, 17,173,189, 20, 16,254,190,
+213,229, 32, 63,216,221, 28,189, 79, 19, 52, 62,229, 52,146, 62,191,228,171, 62,106,185, 79, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 45,184, 37, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,119,219, 63,231, 73, 28,192, 83,117,128, 64,
+188, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,104,195,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,109,254, 62,
+210,146, 4, 63,232,131, 23, 63, 66,212,187, 62, 9,109,158,190, 71, 12,216, 62, 64, 20,153, 59, 11, 2, 7, 62, 92,134, 91, 62,
+ 43,128, 33,191,186, 75, 51, 62,206,251,144, 60,198, 49, 19, 61, 22,114, 69, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,221,100,115, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 59,194,191, 35, 29, 13,192, 13,208, 30, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+112,196,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,223,155, 62,249,196, 3,191,
+115, 12,163,190,212, 73, 60,191, 59,208, 85, 62, 65, 11,155, 62, 28, 17,173,189, 20, 16,254,190,213,229, 32, 63,216,221, 28,189,
+ 97, 31,227, 61,168,207,104, 62, 38, 89,237, 62, 93,238, 74, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 45,184, 37, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,190, 82,192,251,148,174, 62, 29,189, 91, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,197,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,132, 10,191, 82, 61,237, 62,127,191,223,190,
+ 11,148, 12, 63,236,142, 92, 62, 17,199, 32, 63,157,206,242,189,199,114, 15, 63, 91, 82, 33,191, 3,247,167,190,210, 10, 37, 62,
+124,152, 65, 63, 28,110,106, 61,179,189,207, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 40, 23,140, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,157,163,190, 44,219, 33, 63,250, 25,167, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,
+237,163,214, 62,199,206,183,190,206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,175, 4,191,160,200, 50,190,248,214, 77, 63,226,194,110,190,
+138, 10,198, 61,210,213, 62, 62,141,163,253, 61,106,130,160, 61,201,229,101,191,103,145, 50, 62, 52,192, 61, 63, 16, 50, 23, 62,
+ 40, 56, 1, 61, 43,254,162, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 89, 81,220, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,131, 63, 79, 63, 22,225,203,191,183, 83,133, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,199,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,155,194,190, 82, 93, 3,191, 23,133, 19,191,179,146, 2,191,131,198,104, 62,
+ 15,189, 93, 63, 77,226,209,190,159,122, 21,191,169,192,234,190, 16,128, 35, 63, 9,188,167, 62,141,167,138, 61,186,163,185, 61,
+147,152, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 25,249,236, 59,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 20,218, 89, 62,169, 21, 81,192, 50,226, 38, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,
+206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,200,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,139,169, 52, 63, 97,163,156, 62, 26,132,184,190, 82, 25, 7, 63,127,117,151, 62,254,206,247, 62,
+ 27,144, 76, 63,150, 57,204, 62,184,181,246,188,196,222, 19, 63,175,237, 18, 61, 50, 0, 0, 61,180, 45,208, 62, 72,186, 6, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 61,195,186, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 91,166,190,
+203,138,151, 62,232, 4,159, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,201,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,201,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,212,240, 7, 63,213, 2, 18,191,228, 90, 5,191,221, 92,178, 62, 8,236, 16, 63, 90,216,151, 62,155,193,128, 62,
+ 56, 60,245,188,118,129,160,190, 47,157,113,191,114,117, 40, 63,164, 92, 37, 62, 72,198, 78, 61, 6, 28, 5, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,137, 96,226, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,137,191,191,143,156,208,190,
+234,245,116, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,202,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160,202,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+173,218, 49,191,113,109, 23,191, 32, 16, 55, 62, 54,117,188,190, 25, 20,208, 62,118,245, 46,191, 72,158,236,186, 55, 10, 97,191,
+140,128,183, 62,177,230,146,190,121,217,174, 62, 45, 55,188, 62, 41, 76, 25, 62,138,146, 16, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 6, 78,191,240,247, 2,191, 2,181,131, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,168,203,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 25,236,189,
+127,158, 27, 63,123,235,239, 62, 59,108, 33, 63,244,198,103,190,251,192,187, 62,179, 39,101,190,110,210,138, 62,145,168, 54,191,
+208, 20, 63,190,237,209,211, 62, 1,168,129, 62,108,237, 7, 62,188, 30, 77, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,181,251,191,160, 67, 79, 63, 83,115,143, 64,190, 81, 55,191,
+109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176,204,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122,243,237, 61, 11,234,169,190,
+211,226, 55,191,184,175, 25,191, 24,201, 39, 63,204, 23, 71,190, 87, 61,218, 62, 31,211, 39, 63,108,101,215,190, 35,125,244,189,
+ 31, 56,250, 62,174,208,248, 62, 50, 43, 79, 60,252,186, 79, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 83,130,186, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,166,143, 16,192,219, 40, 31,192,188,165,240, 63,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,205,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,157, 15,191, 47, 51,205,190,152, 40,136,190,
+128,122, 44, 63,194,144, 92, 63,235, 36, 99,190,244, 22,206,190,143, 32,220, 62,169,244, 19, 63,160,205,238,189, 93,255, 69, 61,
+131,237,129, 62,199,113, 29, 63, 16,188,169, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,249,139,151, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 47, 16, 46,192,234,135, 17, 62,196,174,101, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,
+235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,206,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,110,162,190,145,104,105,190,247,168,239, 62, 3,235, 74, 63,
+140, 77,178,190, 80, 49, 72, 63,164, 45,112, 62, 43,101, 44, 63, 95,162,173, 62,180,215,104,190,132,185,112, 62, 76,198, 31, 63,
+ 82,148,186, 61,149,140, 75, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+161,174,120, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,221, 76, 34,192,195, 63,220,191,101, 92, 19, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,207,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,101, 89, 32, 62,234, 91, 82, 63,243, 78, 86, 60, 22, 61, 12, 63,249,120,178,190,
+203, 19, 37,191,128, 65, 24, 63,196,226, 52, 63,219,214, 0,191,203,228,210,190,191, 5,144, 61, 27,251,203, 62, 8,217,232, 62,
+185,169,156, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 7,165,113, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,209,208,191,175, 98, 57,192,214, 39,244, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,208,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,242,136, 6, 62,240,135, 58,191, 89,198,233, 61, 57,148, 41, 63,151,188,189,190,156, 72,189,190,
+184, 14, 86, 63,185, 54,165,190,131,220, 49, 62, 60, 87,189,189, 40,142,100, 61,206, 81, 18, 62, 52,238, 34, 63,214,209, 40, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,156,146, 19,192,
+132,169, 38, 63,119,240,133, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,209,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,123,191,104,191, 91, 12,172,190,100, 97,112, 62,240, 67,150, 61,237,234,241, 61,121, 15, 65,190,224, 2, 61, 62,
+159, 38,233,190,118, 62,191,187,107,119, 29, 63,177, 98,202, 62,157,134, 14, 63,246,140,213, 60, 97,116,179, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,159,173, 69, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,209,211, 63, 80, 57, 64,192,
+239, 52,100, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224,210,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+129, 46,157,190,239,142, 47,191, 7,129,219, 60,124,203, 40, 63, 5,175,122,189,180, 33,139, 62,162, 8, 63, 61, 75,191, 26,191,
+ 52,191,189, 61,125,188,100,190,131,222,112, 61,150,149,161, 60,127,188,202, 61,219,141, 82, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 34, 78, 58, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,204, 40,195, 62,169, 66, 22,192, 56, 69, 88, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232,211,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 69, 25, 63,
+ 76,123,124, 62,100,238, 32,191,234,140,220, 62, 84,159,120, 61,187,254,244, 61,103,215, 59, 63,244,235, 71,190, 9,172, 73,191,
+ 94,228,165,190,237,198, 39, 62,232,166,180, 61, 33, 45,106, 62, 32,238, 4, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,128,255,104, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 41,124, 63,215, 52, 92,192, 1,194, 56, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240,212,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,191,175, 62, 72,210, 67, 63,
+ 91, 44,255,190, 36,232, 97, 62,183, 89, 70,191, 58, 37,246,190,112,174,211, 61,231,174,119,189,237, 2,119,191,180,205, 35, 62,
+225,119,158, 59, 62,185, 89, 59, 58, 41,150, 62,186,212, 50, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 78,102, 32, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,215, 66,192, 16,102, 17,189,251, 64, 82, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,213,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 15,158,190, 97, 48, 27,191, 48,181, 41,191,
+ 31, 19,160,190, 91, 23,153,189,100,243,110,190,182,169,164,190, 97,129,120,191,145,101, 90, 60,193, 53,186, 61, 94, 65, 31, 62,
+152, 57, 45, 63,117,240,248, 61, 59,128, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,196, 79,137, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,243,234,243, 63, 12,199, 50,192,246,173,118, 64,192, 81, 55,191,107,243, 71,191, 98,237, 42, 63,
+235,163,214, 62,197,206,183,190,205,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,137,136, 62,101, 7,106,191,249,249,155,190,146,218,155, 60,
+179,212,184,188, 68,215,201,189, 40,244, 61,191,114,234, 70, 61,154,226, 1,191,119,139, 91, 63,202, 64,207, 61, 46,106, 89, 60,
+ 30, 53, 13, 61,236,222, 89, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 6, 40, 87, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,174,176, 54,191, 99,173,187,191,209, 31, 93, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,216,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89,176, 71, 59,214, 55, 18,191, 67, 82,223,190,142, 2, 50, 63,235, 17,202, 61,
+ 51,118,199, 62,129,125, 72, 63, 86,250, 36,191, 70, 99, 90, 61,125, 38, 25, 63,101,144,129, 62,185, 1, 91, 62, 60, 67,121, 62,
+ 32, 77,148, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+238,131,100,192,222,185, 81,191, 40, 50, 27, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,217,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,167, 43, 35,190,242,210,225, 61,197, 58, 30, 63,229, 8, 67, 63,215,176,222, 61, 70, 15, 12, 63,
+ 80,195,165, 62,218, 72,227, 61,188, 66, 87,191,145,213,195, 62,197,146, 70, 60, 83,125, 44, 63, 64,124,156, 62,125,144, 10, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,173, 74, 64, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 77,248,190,
+ 12,109,103,190,230,231,143, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,199,206,183,190,204,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,218,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 59, 62,251,190,154,207,132, 62,191,198, 19,191,122, 82, 25,191,179,114,169,190,242, 80, 46,191,161, 92,100,189,
+125,103,188, 62, 0,234, 23,191, 12,140, 22, 63, 53,173, 3, 63,187,233, 78, 62, 77,225,187, 61,203,112, 68, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 62,205, 89, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 80, 10, 64,253,130, 74,192,
+124,179,109, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32,219,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 89,176, 71, 59,214, 55, 18,191, 67, 82,223,190,142, 2, 50, 63,235, 17,202, 61, 51,118,199, 62,129,125, 72, 63, 86,250, 36,191,
+ 70, 99, 90, 61,125, 38, 25, 63,215, 2,202, 60, 38,116,181, 59,240,167,204, 60,193,223,113, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 37, 55,192, 92, 44,210,191,134, 20, 12, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40,220,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 7, 15, 63,
+135,194, 46,190, 36, 82,148, 62,185, 22, 66,191,211,135, 53, 63,111, 29,172,190,200, 68,229, 62,253,167,140, 62,181,223, 99,190,
+ 35,226,176,190,144,158, 50, 61, 53,247,230, 62,253, 25,236, 62,226,215, 52, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,202,199,214, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,163,152,191,233,189, 16,192,148, 29, 39, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48,221,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 25,236,189,127,158, 27, 63,
+123,235,239, 62, 59,108, 33, 63,244,198,103,190,251,192,187, 62,179, 39,101,190,110,210,138, 62,145,168, 54,191,208, 20, 63,190,
+113,136,250, 61,109, 45, 71, 62,248,240,222, 62,108,172,125, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,219,213, 63,119,221, 77,192, 98,157, 90, 64,192, 81, 55,191,107,243, 71,191,
+ 98,237, 42, 63,235,163,214, 62,197,206,183,190,205,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,222,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,225, 4,191,239,172, 35, 63, 92, 44, 4,191,
+ 88,166,112,190,229,149,176,190,233,184, 6, 63, 91,120, 44,191,208, 36, 20, 63,165, 84, 79, 63,190,145, 89, 61,154,154,192, 60,
+206,233, 43, 60, 68, 13, 0, 62, 51, 72, 87, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 34,131, 32, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 39,106,191,130, 29,114, 63,156,123,164, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,
+235,163,214, 62,200,206,183,190,205,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,223,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 97, 45, 63,119, 47,205,190, 35,117, 19, 63,166,125, 98, 62,
+242,195, 73, 62,124,228,243, 62,119, 86, 11, 63, 70,156, 89, 62,230,232, 88, 63,130, 53,204,190,149, 27, 54, 63,243, 38,133, 62,
+232, 55, 53, 60, 91,130,143, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 71,102,192,241,109,194,190,108, 39, 47, 64,192, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+198,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,224,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,157,105,188,148, 8,184, 62,181,109, 7,191,177,194, 68,191,163, 77,220,190,
+ 58,120,101, 63,241,105, 25, 61, 69,197, 86, 62,214, 78,236,190,126,136, 46, 63,152,203, 22, 61,132,161, 61, 63, 67,196, 79, 62,
+ 79, 22,160, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,112,148, 93, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 12,224,214, 63,225,182, 5,192,246, 59,136, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,225,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192, 46, 24,191, 41, 20, 43,191,186,184,183, 62, 42,173,136, 62, 75, 75, 50, 63, 40, 83,126, 62,
+188,195, 8, 63,234,211,238, 62, 69, 36,152, 61,235,106,145, 62,211, 28,131, 62, 24,255, 46, 60, 11,165,139, 60,113, 88, 55, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95,158, 92, 63,
+117,243, 67,192, 16,154, 70, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,226,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,102,175, 4,191,160,200, 50,190,248,214, 77, 63,226,194,110,190,138, 10,198, 61,210,213, 62, 62,141,163,253, 61,
+106,130,160, 61,201,229,101,191,103,145, 50, 62,112, 55,104, 61, 14, 23, 9, 61,208, 82,129, 62,176, 65, 40, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 89, 81,220, 60, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,234, 31,192,204,234, 65,192,
+110,200,172, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,227,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+162,180, 99, 63,127,169,145, 62,114, 95,174, 62,169,121,223,189,173,190, 73, 63,118, 72, 51,190,116, 48,162,190, 59, 98,139,189,
+ 77,245,191, 62, 75,124,253, 61,197,252, 48, 60,163,176, 62, 62,216, 93, 72, 63, 94, 65,166, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 81, 69, 12, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,122,189,191,238,243,102,191,158,253, 93, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,104,228,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,139,218,189,
+160, 81,222,190, 75, 71,151,190, 47, 33, 88,191,152,174,128,190, 43,218,107,190, 40, 96, 66,190,219, 29,113,190, 89,240,184,190,
+153, 92,204, 62,101,159,135, 62,253,216,174, 62,217, 99, 96, 62,104,171, 50, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 5, 27,207, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,227, 75, 67, 63, 48,124, 78, 61,200,150,171, 64,190, 81, 55,191,
+107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+112,229,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 19,190,190,188,203,147, 62,
+ 19,242, 2, 62,223,138, 95, 63,144, 50, 24, 60,148,174, 64, 63,196,158, 11,191,220, 22, 64, 63, 98, 35, 19,190,217, 93, 44, 62,
+191,115, 58, 63,121,198, 2, 60,254,102,167, 59,178,100,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,189,176, 27, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 37,139, 62, 4,231, 62, 63,174,205,179, 64,188, 81, 55,191,107,243, 71,191,
+102,237, 42, 63,235,163,214, 62,200,206,183,190,206,137, 61,190,156, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,230,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,220,239, 60,168,204, 46,191, 78, 95, 84, 61,
+ 8,105, 58,191,231,245, 43, 63, 91,254,151, 62, 77,143,206, 61,177,139, 42, 63, 26,107,196,190,150,211,139,190, 50, 23, 92, 63,
+169, 27, 15, 61, 8, 43, 83, 60, 59, 83,189, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,121,221, 49, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32,247,225,191, 37,175, 81,192,248,254,198, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,231,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59,132,130, 62,131,166,120,190, 15,191,109,191,170,164,238, 61,
+ 20, 93, 78,190,245,164,231,189,254,254, 16, 62, 61,189,234,190,116,167,116,189, 67,175, 16, 63, 66,132, 2, 61,191, 37,189, 61,
+173, 5, 64, 63, 91,181, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+129, 93, 2, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,200,110,165, 61,183, 43,239, 62,129,243,169, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,232,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173,218, 49,191,113,109, 23,191, 32, 16, 55, 62, 54,117,188,190, 25, 20,208, 62,
+118,245, 46,191, 72,158,236,186, 55, 10, 97,191,140,128,183, 62,177,230,146,190, 62,109, 66, 63,244,159,170, 61, 79,150,243, 60,
+ 69,136, 2, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 12,158,243,191,244,237,104,192,138, 34,155, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,233,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,155, 22, 49,191,223,232,165, 62,133,208, 6,191, 93,253,190,190,190,234,194,190,239, 89, 29,191,
+134,110, 23,191, 8,217, 30,191,107,159,205,190, 18, 94,185,190,228,106, 92, 60, 23, 25, 35, 61,136,111, 93, 63,211,105,167, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,252,153,132, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 74, 8, 63,
+ 0,240, 1,192, 28,123,108, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,235,163,214, 62,200,206,183,190,205,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,234,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,217,155,104, 63,215,164, 29,190,175, 60,179,190,201,201, 43, 62,100, 60, 67, 61,171, 42, 90,189, 68, 85, 4,191,
+ 67,249,130, 62,230,199,133,190,149, 14,107, 63,233,242,101, 62,181,120,181, 61,231,136, 43, 62,245,241, 4, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,252,179,108, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 24,231,191, 44,105, 21,191,
+186, 32, 98, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160,235,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+126, 52, 49,191,201, 9, 43, 63,166,234, 96,190,182,210, 37,190,206, 58, 54, 61,231, 1, 63, 63,133,173, 34,191, 5,154,170,190,
+ 93,112, 51, 63, 18, 61, 23,191, 66,189,138, 62,114,103,210, 62,117,128, 62, 62, 35, 54, 7, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 33,132,126, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 52, 5,191, 10,103, 49,192,230,154, 37, 64,
+190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,168,236,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 96, 32, 63,
+185,201,160, 62,160, 3, 6, 63, 11, 34,248,190,206, 53,185, 60,192,197,178, 61,174,184, 53, 63,223,172,162,190,109,136,224, 62,
+142,173, 61,191,132, 47,184, 61,244,157,207, 61,168, 0,225, 62,249, 11,189, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,248,112,150, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 45,177,191, 22,253, 99, 63, 8, 58,155, 64,190, 81, 55,191,
+109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176,237,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,202, 55, 63,249,235, 89,190,
+127, 18, 92,190,146,129, 32,191, 7,212, 8,190,167, 50,171,190, 97,120,123, 62,232,152,249,189,140, 18,149, 62, 37,111, 13, 61,
+147,253, 28, 63,231,184,184, 62, 48, 48, 58, 60, 59, 78,111, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,115, 61, 18, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,255, 57,191,235, 4, 65,192, 77, 7, 19, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,238,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,218,133,189,116, 10,176,189,186,237, 10, 63,
+ 14, 61, 85, 63,182,219, 38,190,174,175,206, 62, 47,240, 10, 63, 31,232,114,190, 91,162,207,190,173, 85,193,190,228,255,128, 61,
+ 76, 32,172, 61,147,152, 5, 63,205,134,169, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 62, 38,212, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 68,137,191,204,177,226, 61,196,247,141, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,239,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133,138,146, 61,133, 75, 8,187, 28,235, 68, 62,122,141,122, 63,
+116,117, 92, 63, 7,147,125,190, 87, 49,147,190, 9, 88, 41, 63, 63,255, 2, 63, 71, 44,126, 61,107,166, 0, 63, 23, 29,154, 62,
+ 34,214,165, 61, 42,130,236, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+241,170,103, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 22,103, 82,192, 73, 75,201,191, 1,247, 0, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,240,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231,120,168, 62,179,154, 7,191, 41,180, 48, 63,239,232,187,190, 9, 35,104,191,
+222, 8,114, 62, 76,143,177,190,107, 29, 28,191,210,112,234, 62, 9,249, 92,190, 73,109,118, 59,168,155, 4, 63, 73, 2,243, 62,
+186,198,108, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74, 4,184, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+194,241,246,191, 87,130,236, 62, 50,209,135, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,241,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,124,197,223, 62, 32,243,189,190,199,213,140,190, 13,149, 69,191,221,235,199,190,159, 79,240, 62,
+113,202, 14,190,186,168, 60,190, 5,145,220,190, 42, 8,148, 62, 49, 99,219, 62, 85, 73,242, 62,127, 14, 79, 61, 68,141, 67, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,157,236,192, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,228,149,189,
+233, 13,221,190,210,251,145, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,199,206,183,190,204,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,242,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 92, 19,190,190,188,203,147, 62, 19,242, 2, 62,223,138, 95, 63,144, 50, 24, 60,148,174, 64, 63,196,158, 11,191,
+220, 22, 64, 63, 98, 35, 19,190,217, 93, 44, 62,198,141, 4, 63, 3, 71, 19, 62, 60,186,174, 61, 99,146,129, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,189,176, 27, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 89, 62,164,169,120,190,
+ 26, 78,155, 64,192, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,197,206,183,190,202,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224,243,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118,201, 94, 63,192,189,213, 62,142, 27, 67, 62,214, 93, 55,190, 6,154,131,190,133, 48,178,190,139, 11,192,190, 39,123,147,189,
+ 29,130, 57,191, 46,253, 33,190,224, 89, 24, 63,189,174,198, 61, 2,152,101, 61,143,237,128, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 59,122,117, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 80, 26,192,232, 3,239,189,182,210, 99, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232,244,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 16,153,190,
+224, 1, 33,191, 43,253,168, 62,254, 36, 35, 63,124,255, 19,191, 70, 97,138,190,188,109, 6, 62, 64, 58,223,190,154,121,189,189,
+ 9,126,170, 62,115,248,126, 62, 84, 41, 12, 63,153, 55, 4, 62, 62, 85,152, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74,244,106, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,245, 70,190,136,148, 37,192, 41,107, 57, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240,245,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,246,249, 62,200,102,140, 62,
+154,199, 10, 63, 40,102, 32, 63, 78, 10, 19,191,224,238,250,190, 0, 13,111,190,243,232,187, 61,106, 10, 99, 62,163, 96,221, 62,
+208,237,239, 61, 10, 34,210, 61, 62,101,181, 62,205, 22,218, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 35,143, 25, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,172, 25,191, 68,234,249,191, 59,217, 73, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,246,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,109,230, 62, 67, 47,189,190,205,119,155,189,
+238, 53, 79,191,223,144, 88,191, 88,163,146, 62, 63, 99,208,190,236,235,130, 62, 72, 10, 17,190,124,223, 15, 63, 12,172, 64, 62,
+160, 24, 51, 62,145, 49,156, 62, 26,236,169, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,254,237, 72, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 63, 60,192,192, 70,245,191,246,177,248, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,180, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,162, 16, 63, 33,180,219,190, 24,166,177,190,234, 8, 29,191,
+ 24, 26, 48,190,240, 70,115,190, 0,197, 54, 63, 69,201, 75, 62, 28,174, 10,189, 81,128, 78, 63,172,109,175, 60, 7,135,214, 62,
+ 59, 12, 9, 63,150,154,198, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 34, 50,138, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6,125,162, 63, 63,233, 64,192,147,167, 86, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,249,180, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234,120, 11, 63,200, 35,253,190, 2,152,233,190, 0, 38, 0,191,214, 3, 36,191,
+ 3,239, 45,190,135,175, 9,191, 18,130, 42,190,156,197, 38, 63,181, 37,238,190, 4, 49,119, 61,119,251,224, 60, 94, 5, 47, 62,
+188,195, 61, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 89,162,191, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184, 96, 27,192,251, 23,179,191,193, 77, 38, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,250,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,177,231, 32,191,150, 89,239, 62,128,156,188,190,225, 45, 0,191,247,133,210, 62, 51,169, 40, 63,
+146,184, 26, 63,209, 39,223,190,182,238, 15,191, 75, 63,146,190,166,161,213, 61,217,242,218, 62, 39, 18,191, 62, 89, 74,194, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 81,236,129, 61, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,185, 0, 21,191,
+137,241, 14,192,206, 27, 61, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,251,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,214, 79,213,190, 95, 19, 10, 63, 60, 25, 56,191,193,193, 10, 62,127,232, 10,190,162,126, 93,190, 25,169, 7, 63,
+ 38,209,221,190, 52,214,186, 62, 21, 63, 41,191, 58, 36, 27, 62,245,151, 28, 62, 82, 23,179, 62,148, 10,177, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 98,241, 41, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 80, 57,189,193, 80,166,191,
+242,172,123, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32,252,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160,174,232, 62, 64, 99,164, 61, 41,108, 12, 63,106,126, 50,191, 66,117,124, 62,134, 54, 82, 63, 38, 55,191, 62,121,232,197,190,
+188,203, 70,189, 26, 88, 51,191,199,225,170, 62,114, 67, 23, 62,202, 56, 33, 62, 26,224,184, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,216,213,138, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,202,106,219,190, 17,216,127, 63,140,251,173, 64,
+190, 81, 55,191,110,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40,253,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214, 79,213,190,
+ 95, 19, 10, 63, 60, 25, 56,191,193,193, 10, 62,127,232, 10,190,162,126, 93,190, 25,169, 7, 63, 38,209,221,190, 52,214,186, 62,
+ 21, 63, 41,191, 10,203, 79, 63,104, 14, 32, 62,252,238, 44, 60, 55,180,175, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 98,241, 41, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 39, 91,192, 64, 81,150,191, 89, 68, 15, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48,254,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,212, 0,191, 15,161, 38,191,
+131,203,123,190,207, 48, 3,191,112, 6, 64, 63,137, 53, 34,190,175,202, 6,191, 66,241, 19, 62,119,105, 85,190,149,246,146, 61,
+ 25, 88, 25, 60, 85, 74, 25, 63,199,185,196, 62,210,179,249, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,198,223, 90, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 17, 40, 63,141, 44,153,190, 68,123,161, 64,190, 81, 55,191,107,243, 71,191,
+102,237, 42, 63,235,163,214, 62,200,206,183,190,205,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,255,180, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,219, 68, 63,190, 75, 74, 62,250,129,229, 62,
+198, 78,210,190, 65, 63, 59,188,173,173,214, 62, 18,159, 85, 62, 25,160,185,189,169,193, 46,191,177, 21, 77,190,202,133, 32, 63,
+ 25,163, 36, 61, 45,136,225, 60,133, 71,156, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 22,208,141, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 50, 95,160, 63, 34,101,249,191,176, 96,132, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 25,236,189,127,158, 27, 63,123,235,239, 62, 59,108, 33, 63,
+244,198,103,190,251,192,187, 62,179, 39,101,190,110,210,138, 62,145,168, 54,191,208, 20, 63,190, 62, 45,138, 62, 35,142, 30, 61,
+173, 78,128, 61,170,246, 32, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+ 2,210,109, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,111,133, 6,192,167,152,225,191, 84, 16, 32, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 57,241, 62,209,244,173, 62,202,195,188, 61,229, 10, 79, 63, 15,223, 34,191,
+171, 65, 40,190,158,228, 38, 61,187,225, 12, 63,198,196, 13,189,185,253, 14,191,245,107,217, 61,253,147,174, 62,227,232,218, 62,
+ 70, 80, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 8,168,183, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80, 99,228,190, 44, 59, 51,191,221, 75,133, 64,192, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,197,206,183,190,
+202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 2,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 52,191, 23, 63,247,209, 82, 62, 34, 21,204, 62, 21, 58, 43, 63, 1, 3,139, 61, 52,159,135, 61,
+ 30,117, 36,189,230,123,244, 62, 79,104,185, 62, 17, 73, 33, 63,117,208,213, 62,118,118, 76, 62, 32,254, 5, 62, 65,245,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,246, 4, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85,101, 74,192,
+166,185,105,191, 18,141, 36, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 3,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,221,157, 3, 63, 67, 81,215, 62,135, 46, 5, 63,121,108, 9,191, 37, 83, 16,190, 37,244,130,190,191, 18,216, 62,
+221, 44, 53, 63,153,136,162,189, 80,138,252,190,221,214,102, 61, 50, 22, 25, 63,139, 42,157, 62,164,113, 30, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,145,208, 26, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,122,234,218,191, 50,177,232,191,
+108,174, 42, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96, 4,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 98, 41, 59,191,236, 70,252, 61, 77, 96, 25,191, 33,195,154,190, 31,119,242,190,125, 79,204,190, 23, 53, 18,190,102, 31,214,190,
+165,174,199,190, 48,105,169,188,229, 50, 8, 62,227,251,148, 62,133, 65,206, 62, 75, 82, 49, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 44,230, 5, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,106,206,191,205, 36,150, 62, 96, 42,137, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,104, 5,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,191, 23, 63,
+247,209, 82, 62, 34, 21,204, 62, 21, 58, 43, 63, 1, 3,139, 61, 52,159,135, 61, 30,117, 36,189,230,123,244, 62, 79,104,185, 62,
+ 17, 73, 33, 63, 87, 15,231, 62, 49,237,207, 62,254, 43,141, 61,226,225,150, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,246, 4, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 61,167, 63,119, 5,171,191, 86,214,147, 64,190, 81, 55,191,
+109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+112, 6,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 39, 70, 63, 91,103,218,188,
+ 44, 24, 30, 63, 28, 81, 12, 62, 26,129, 16, 63,215,153,162, 61, 11,203, 31,191,222,132, 2, 63, 26, 4,154,190,202,112,100, 62,
+216, 36,214, 62,172, 85,122, 60, 44,247,142, 60,132,140, 12, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 48, 61,115, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 14,251,191, 44,213,105,190,165,188,109, 64,190, 81, 55,191,107,243, 71,191,
+100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 7,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173, 49, 3,191,178,133, 9, 63,104, 18, 16, 63,
+159, 16,186, 62,183,147,245, 62,220, 88,111, 62,220, 25, 2, 63, 80, 44, 77,191, 76,136,152, 62,126,242,176, 61,239, 13,155, 62,
+ 40, 17,234, 62, 92,128, 13, 62,226,130,208, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 65,147,208, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,102, 47, 46,192, 64,212, 45, 63, 61, 35,127, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,164, 48, 63, 32,100, 38,191,163,157,157,190, 10, 78,167, 61,
+ 4, 8, 54, 59,139,155,147,190, 11, 41, 50, 63, 27,101,140, 62,241,237,110, 63, 18,188,179, 59, 74, 31,165, 62,207,208, 37, 63,
+ 74,227,141, 60, 8, 28, 76, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+129, 24, 80, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10,203, 83,191,133, 15, 29,192,237, 82, 42, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 9,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,194,232,190,156,110, 35, 63,233,200, 75,190,170,158, 22,191, 83,122,193,189,
+217, 58,149,189, 80, 15, 18,191, 66, 37,145,189, 98,184,219,189, 70,185, 86,191, 21,150,239, 61,130,193, 24, 62, 46, 71,217, 62,
+141,114,158, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,122,231, 75, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 71,102, 63, 16, 13, 44,191, 24,187,156, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,
+201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 10,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120, 40, 61,190,150,196, 15,191,159,219, 54,191,234,195,191, 62,104, 96,122,190,193, 71, 74,191,
+ 15,230, 56,190, 61,156,203, 61,227, 39,177, 61, 25,222,193,190,178,206, 13, 63,144,101,237, 60, 16,227,198, 60, 16, 30,201, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74,137,189, 61, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,210,252, 62,
+216, 58, 44,191, 98,217,149, 64,192, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,197,206,183,190,202,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 11,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86,152, 38, 63,169,225, 17,191, 57,217,140,189, 67,124,254,190, 13, 65, 17, 62,229,204, 15, 63,180,148,241, 62,
+175,210, 73,191,182,161, 21, 63,186,222,169,188,235,174, 4, 63,125,216,156, 61,114,228,115, 61,124,239,176, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 86,104,165, 61, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,210, 46,192, 59, 4,135,191,
+164, 99, 44, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,202,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 12,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 97, 45, 63,119, 47,205,190, 35,117, 19, 63,166,125, 98, 62,242,195, 73, 62,124,228,243, 62,119, 86, 11, 63, 70,156, 89, 62,
+230,232, 88, 63,130, 53,204,190,154, 69,201, 61, 74,143, 3, 63,155, 10,162, 62,186, 21,146, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,235, 64, 60,203,210,147, 63,205, 32,185, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,168, 13,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,137,136, 62,
+101, 7,106,191,249,249,155,190,146,218,155, 60,179,212,184,188, 68,215,201,189, 40,244, 61,191,114,234, 70, 61,154,226, 1,191,
+119,139, 91, 63,135,168,109, 63, 87, 44,112, 61,106, 72,115, 59,214, 90, 24, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 6, 40, 87, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,185, 0,192,197,235, 38,192,182,221,245, 63,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176, 14,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 54,241, 62, 25, 75, 60,190,
+137, 31,166,190, 26,162, 76, 63,214, 23,180, 62,134, 28, 22,191,189,125,184, 62,170,143, 49, 63, 42,100,208, 62,201,182, 12, 63,
+ 85,123,103, 61,230, 65, 90, 62, 33,215, 29, 63,124, 5,233, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,233, 6, 78, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,132,118,247,191, 87, 66, 8,192, 93, 88, 20, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 15,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,149,157, 62,169,241,150, 62,210, 72, 5, 63,
+196, 98, 61,191, 94, 43,103,191,141,249, 13, 62,108, 40, 28,190,180,143, 89,189,159,169,180, 62, 50,210,102, 63, 15,245,186, 61,
+252,211,140, 62,237,184,252, 62,164,107, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,234, 53,126, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,252, 2,190,189, 32, 63,192,249,176, 40, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,
+235,163,214, 62,198,206,183,190,206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 16,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,227,185,185, 62, 69, 55,133,190, 76,101,246, 62,146, 32, 65,191,
+ 11,142, 47,190,207,240, 16,191,178, 47,250, 60,147, 12,135, 62,250,130,192,190,182,224, 63, 63,109,251,141, 61,209, 15,135, 61,
+152,122,212, 62,150, 66,230, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+194, 22,201, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,186, 37, 60,192,209, 36, 19,192,200,102,212, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 17,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133,116,253,190,160,178, 23, 63,114, 78, 32,191, 57, 97,221, 61,191,244,236,189,
+206, 56,214, 62, 77,142, 40,191, 31, 48,161, 61, 82, 95, 7, 63,244, 70, 62,190,144,146,141, 59, 24,189,182, 62, 12, 24, 34, 63,
+242, 33,183, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 51, 4, 90, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 62,165,155, 63, 35,188,200,191,156,201,140, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 18,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,198,205, 62, 50, 21, 99, 63, 18,246, 86,190,237, 24,178,189,229,177, 74, 62,233, 94,174,190,
+ 14,113, 17,189,144,148,211, 62,157,182, 80,190, 18,214, 66,191, 54,112,182, 62,156,202, 2, 61, 65,146, 40, 61, 24, 18, 18, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,229, 84,124, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 48, 1, 63,
+133, 14,211, 62,120,209,175, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,235,163,214, 62,200,206,183,190,205,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 19,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 30, 0,181, 60,183, 21, 39, 63,174, 28, 42,191,206,254,185, 62, 60,101,180, 61,224,164,162, 62,169, 22, 78,191,
+ 15,164,146,190, 66, 47,188, 62,233,255, 63,191, 26, 61, 76, 63,214,234,171, 60,230,187, 47, 60,126,146, 46, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,113,195, 41, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,144, 98, 62, 62,190,112,191,
+153,224,138, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224, 20,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255, 80,148,190, 17,138, 5, 63,171, 16, 38, 62,107, 50, 73,191,214,126, 32, 63,143, 14,148, 62,183, 31, 4,191, 70,152,145, 62,
+ 21, 32, 89,189, 63,239,100, 62, 51,212,220, 62, 49, 96,238, 61, 1,246,205, 61, 64, 22,180, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,247, 33, 76, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,243, 2,192, 18, 84, 91,191,110, 0, 77, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 21,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,146, 69,191,
+236,123, 69,190,179,188, 26,191,207,182, 47,189, 96, 14,105,191, 55,120, 31,190,138, 41, 18, 62,210, 73,183,189,105, 99, 57,189,
+ 32,155,137,190,112,143, 79, 62, 13, 36,220, 62,207,171,119, 62,168,124, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,184,151,199, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 81, 34, 62,178, 55, 39,192, 87, 36, 68, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 22,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,148, 3, 63,224, 68,239, 62,
+ 72, 64,241, 62, 71, 35, 11,191,248,202, 31,191, 68, 98,182, 62, 18,127, 48,191,158,108, 26,189,145, 93,173,190,161,155, 16,191,
+144, 72,244, 61,152, 98,173, 61, 16,243,154, 62, 38,162,252, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63, 69,111,245, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,226,206,132,191,153,157,254,191, 61, 78, 57, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 23,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 64,217, 62,151, 24,213,190, 94,174,187, 61,
+102,136, 76, 63, 27, 1, 32, 63,236, 95,162,189,124, 18, 29,191, 75, 78,155,190,124,134, 43,191,174,202,184,190, 49,138, 35, 62,
+237,209, 85, 62,126, 75,186, 62,113, 6,137, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,111,100, 76, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,228,163,237, 62, 55, 20, 58,192, 9,122, 64, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 95, 55,189, 43, 21,181,190,230, 3,101,191, 87,248,137, 62,
+ 4,208, 75, 62, 0,115,115, 59,100,196, 95,190,191, 15, 83, 62, 84,222, 81,191, 36, 58,169, 62,187,215,163, 61, 90,207, 92, 61,
+188,248,152, 62,182, 59, 17, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+230,119,112, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,202, 59,148,191,188,242, 56,191,189,111,113, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 26,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202, 21,192, 61,216, 22, 8, 63,188, 84, 66, 63,158, 70,186, 62,240,211, 98, 62,
+124, 7,155, 62, 10,134,246, 62,110, 16, 79,190,248,197,252,189, 81,188, 39, 63, 42,204,169, 62,204,195,154, 62,146,225, 51, 62,
+125,254, 66, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,123, 26, 81, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 34,179,252,191, 86,102,184,191,169,174, 51, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 27,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 50,144,190,207, 31, 50,191,179,203, 40,191,214, 99, 45,189,109,153, 34,190,239, 94, 10,191,
+115,186,212,190, 42,234, 19,190, 72, 26, 97,191,122,105, 99, 61, 46,210, 21, 62,250, 32,186, 62,195,126,178, 62, 85,238, 16, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,131,240,124, 60, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,244, 77,192,
+ 51, 52,163,190, 30,234, 62, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,202,137, 61,190,
+157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 28,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 41,112, 63, 56,166,164, 61, 91, 4,240, 61, 15,172,161, 62,106,126,191,190,117, 33, 64, 63,130,227,184, 62,
+ 92, 20,244,190,210,168,180,189, 60, 25, 43,191, 89,246,198, 61, 30,130, 46, 63,223,241, 54, 62,221, 41, 46, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,190,196,107, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 27,122, 63,179,229,133,191,
+ 66, 39,149, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,235,163,214, 62,200,206,183,190,205,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 29,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+192, 46, 24,191, 41, 20, 43,191,186,184,183, 62, 42,173,136, 62, 75, 75, 50, 63, 40, 83,126, 62,188,195, 8, 63,234,211,238, 62,
+ 69, 36,152, 61,235,106,145, 62,216, 4,239, 62,235,100, 21, 61,174, 73, 20, 61, 83,197,235, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 66,151,191,208,139, 62,192, 98,118, 5, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40, 30,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,160, 32,190,
+190, 39, 52,191,142,138, 9,191,138, 13,224, 62,166,218,242, 62, 93, 71, 26, 63, 36, 22, 52, 62,231, 52,124, 62,165, 91,192,190,
+148,111, 86,191,212,101,120, 61, 72, 26,221, 61,158, 82, 22, 63,241, 14,122, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,195, 96, 22, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 63, 46,190,222,105,107,191,198,191,132, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 31,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,202, 55, 63,249,235, 89,190,
+127, 18, 92,190,146,129, 32,191, 7,212, 8,190,167, 50,171,190, 97,120,123, 62,232,152,249,189,140, 18,149, 62, 37,111, 13, 61,
+ 89,238,204, 62, 10, 90, 39, 62,123,156, 6, 62, 98, 22,156, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,115, 61, 18, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,148,234,190, 11,179, 97,192, 16,215, 3, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 32,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,227,248,190,160,134,192,190,155,159,184, 62,
+105,157, 51, 63, 2, 56, 54, 63, 88,126,182, 62,108,207, 4,187, 38,216,198, 62,140, 66, 73,191,139,126,248, 61,251, 26,119, 60,
+ 34,207,150, 60,170,176, 20, 63,225,120,197, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,208,234,216, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,202,177,135,191,150,220, 86,192,144, 9,239, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 33,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201,122, 18,191,155, 68,163,190,236, 36, 39,191,221,182,194,190,
+217, 47, 98,190, 97, 46,230,190,197,236,134, 62,216, 40,187, 60,111, 92,179,189, 71, 17, 54, 63, 87,169, 5, 61,120,116, 92, 61,
+179,253, 38, 63,225,192,133, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+100, 58,154, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,213,105,108,192,125,145,223, 62,192,182, 82, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,
+198,206,183,190,206,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 34,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,244, 32,190,174,189,218,190,163, 11, 55, 62,157, 75, 95,191, 33,155,243,190,
+180, 86, 90,191, 57,237, 86, 62,226,198,126,190, 30, 34,101, 61, 93,239,180,190,206, 82,204, 61, 44,113, 89, 63, 63, 63, 23, 61,
+220, 33,100, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 6, 63, 50, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 76, 23,243, 62, 46,133,166,191, 78,153,134, 64,192, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,197,206,183,190,
+202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 35,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,173,218, 49,191,113,109, 23,191, 32, 16, 55, 62, 54,117,188,190, 25, 20,208, 62,118,245, 46,191,
+ 72,158,236,186, 55, 10, 97,191,140,128,183, 62,177,230,146,190,159, 2,190, 62, 29,141,193, 61,214, 93,214, 61,164, 2,220, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,192,214,190,
+182, 57, 73,192,175, 83, 23, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 36,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,206,172, 34,191, 64, 79,187, 62,140,197, 11, 62,199,135, 42, 63,100, 91,148, 61,123, 75, 25, 60, 54,126,232,189,
+210,190,220,189, 9,158,186, 62,182, 62,225,190,211,103, 84, 61, 92,194,115, 61,148,216,253, 62, 41, 34,201, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 38,103,162, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 4,133,192,109,136,128, 62,
+136, 58, 58, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,235,163,214, 62,198,206,183,190,206,137, 61,190,157, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96, 37,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+147,206,137, 62,234,207, 11, 63,195,144,225, 62,162,225, 40, 63, 24, 69,148,190, 50,238,190, 61, 13, 31, 86,191,217,106, 71, 63,
+247, 60, 1, 62,162,250,136, 62, 70, 80,156, 58,142,100,108, 63, 15, 72,153, 61,116, 35, 17, 58, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,174,199, 41, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 40, 12, 62,102, 32, 1,192,222,178, 95, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,104, 38,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 57, 95, 63,
+238,148,214, 62, 87,249,109, 62,227,220,204,189,238,118,221,189,121,162, 19,191,203, 50, 48,191, 58,232, 80,190,141,100, 8,191,
+229,142, 19, 63,223,196, 88, 62,134, 94,237, 61,141, 5, 97, 62, 43,195,231, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 75, 11, 15, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,109, 80, 63, 96,210, 20,192,246,253,103, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+112, 39,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 32,133, 62, 13,201,189,190,
+ 55, 43, 66, 63, 76,254,239, 62,254,163,179, 62, 15,181,171,188,130, 8,196, 60,214, 27, 14,191, 86, 32,128,190,190, 27,208,190,
+ 69,196, 53, 62,136,184,135, 61,240,250, 35, 62, 34,153, 24, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,224, 93,234, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,142,147,191, 43, 7,166,190, 61, 69,130, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 40,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,246,249, 62,200,102,140, 62,154,199, 10, 63,
+ 40,102, 32, 63, 78, 10, 19,191,224,238,250,190, 0, 13,111,190,243,232,187, 61,106, 10, 99, 62,163, 96,221, 62, 56,243,206, 62,
+109,170,159, 62,224,145, 2, 62,211, 50, 32, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 35,143, 25, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2,254, 89,191,195,197, 85,192,176,197,254, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 41,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122,125,204, 62, 37, 10, 46, 63, 69, 71, 26,190,130,168, 24, 63,
+117,105, 36,190,144,220, 32, 63, 11,167,231, 62,151,145,179, 62, 33, 72, 36,190, 42, 67, 50,191,111, 3, 11, 61,241, 2, 76, 61,
+231,181, 28, 63,103,179,155, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+244,186,188, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 24, 46,253,191,200,126,214, 61,248, 1,125, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,
+197,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 42,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,218,181,190,162,100, 80, 63, 86, 18,175,190,142, 51,157,190, 18, 35, 4,191,
+207,113,210, 62, 0,170, 11, 63,134,126,165,190,141, 47, 59, 62,104,163, 62,191, 18,251,181, 62,225,163,242, 62, 90, 98,191, 61,
+220, 33,158, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 83, 76,104, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+115, 18, 94,192,112, 61, 49, 61, 90,153, 71, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,236,163,214, 62,197,206,183,190,
+202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 43,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,126, 41,112, 63, 56,166,164, 61, 91, 4,240, 61, 15,172,161, 62,106,126,191,190,117, 33, 64, 63,
+130,227,184, 62, 92, 20,244,190,210,168,180,189, 60, 25, 43,191,141,188,190, 61,118,157, 68, 63,105,119,224, 61,112,129,239, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,190,196,107, 62, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 34,141,191,
+222,140, 39,192,182, 55, 25, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 44,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,193, 40, 85, 63,120, 79,146,190, 68,249,203,190,207,217,131, 62,229, 65, 22, 63,120,104, 63, 63,173,135,124,189,
+131,179,190,190,208, 81,171, 62,211,132, 69, 63,122, 6,189, 61, 58,195, 23, 62, 6,114,254, 62,189,106,134, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,102, 20, 63, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 14, 63,192, 64,204,165,191,
+ 12, 96, 24, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 45,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 54, 81, 30,191,157, 39,223, 62,214, 30, 11, 63, 76, 51,186, 62,206,228, 83, 62,209,146, 0, 61, 22,106,121, 63, 44,124, 6,187,
+128,233, 71,187,218,190,173, 62, 14, 67, 83, 61,192,186, 4, 63, 39,206,197, 62,178,159, 50, 61, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,208, 19, 52, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,180, 22,192,126,173, 4,192,240,189, 8, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,168, 46,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 59, 20,191,
+ 30, 36, 17, 63,112, 57,252,190, 32,101,162, 62,139, 6,160, 62, 57,160, 80, 61,109,243,245, 61, 41, 18,224,190,182,154,227,188,
+238,196,139,190,133, 49,131, 61,130, 33,167, 62,160,225, 5, 63,124, 59,177, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 20,166, 56, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35,160, 97, 63,129,220,163,191,194,248,141, 64,190, 81, 55,191,
+109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+176, 47,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,149,157, 62,169,241,150, 62,
+210, 72, 5, 63,196, 98, 61,191, 94, 43,103,191,141,249, 13, 62,108, 40, 28,190,180,143, 89,189,159,169,180, 62, 50,210,102, 63,
+ 78,174,206, 62, 68,159, 93, 61,160, 84,118, 61, 54,211,246, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0,128, 63,234, 53,126, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,223, 18,192,155,169,140,191,151, 18, 57, 64,190, 81, 55,191,109,243, 71,191,
+100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 48,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186, 63, 44, 63,134,104,136, 62, 44,117, 32, 63,
+178,227,147,190,254, 77, 90, 63, 0,117,175,190,119, 69,167, 62,238, 73,138, 61, 58,211,189, 62,210, 28, 37,191,245, 96, 21, 62,
+ 35,104,227, 62, 83, 62,154, 62, 64,164,222, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0,128, 63,130, 27,151, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,100,193,179,191,251,111, 78,192,166, 64,228, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,
+234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 49,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129,101, 4,191,237, 90, 0, 63,104,125,239,190,131, 31, 3, 63,
+200,160,212,190,115,217, 27, 63, 55,189, 6,190,131,223, 22,190, 4,241,223,190, 4, 70, 0,190, 37,242, 35, 61,204,214,171, 61,
+175, 25, 46, 63, 82,177, 72, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,
+184,249,202, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 93, 90,124,191,113, 48,212,191, 56,208, 74, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,
+200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 50,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 25,236,189,127,158, 27, 63,123,235,239, 62, 59,108, 33, 63,244,198,103,190,
+251,192,187, 62,179, 39,101,190,110,210,138, 62,145,168, 54,191,208, 20, 63,190,187,178, 81, 62,176, 57,108, 62, 93,177,153, 62,
+108, 88,135, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+251,231, 33,192,132, 2, 59,191, 78,162, 66, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,
+199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 51,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192, 46, 24,191, 41, 20, 43,191,186,184,183, 62, 42,173,136, 62, 75, 75, 50, 63, 40, 83,126, 62,
+188,195, 8, 63,234,211,238, 62, 69, 36,152, 61,235,106,145, 62,217, 15, 30, 62,227,209, 4, 63,178,148,117, 62,218, 39,178, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,
+255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,185,138, 63,
+191,128, 41,192,139,193, 97, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,
+158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 52,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,231,120,168, 62,179,154, 7,191, 41,180, 48, 63,239,232,187,190, 9, 35,104,191,222, 8,114, 62, 76,143,177,190,
+107, 29, 28,191,210,112,234, 62, 9,249, 92,190, 0,196,250, 61, 79,120, 62, 61,195, 12, 31, 62,202,252, 44, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74, 4,184, 62, 0, 0, 0, 0,255,255,255,255,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,242, 63,243,190, 86,176,159,191,
+245,150,111, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,224, 53,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+166, 26, 58,191, 1, 70,159, 62,113,111, 2, 63,235,187,173,190,116, 51,237, 62,130, 53,247, 62,243,199, 26,190,235, 88,172,189,
+118,115,244, 62, 34,147, 5,191,217, 77,158, 62, 43,131, 72, 62,119,208, 68, 62, 86, 8,155, 62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,253,152,110, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,198,178, 48,191,138, 39, 52, 62, 39,252,149, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,235,163,214, 62,198,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 54,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,167,210,190,
+194,172,139, 62,250,220, 35, 63, 30,182, 22,191,122, 3,136, 61,109,164,176,190, 30,153,147,190,255,248, 10,188,234, 90,160,190,
+ 89,241,205,190, 62, 71, 19, 63,111,215,107, 62, 63, 71,138, 61,243,231, 1, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 37,227, 77, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,157,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59,
+ 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+231, 84,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 15, 85,145,189, 31,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 72,158,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,219,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189,
+ 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80,159,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186, 63,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+168,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,251,223,124, 61,
+125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 59,138, 94,189,142,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,160,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 82,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,123,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 15, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,151,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 31,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96,161,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,243, 61, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 15, 85,145,188,251,223,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 5,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+180,127, 35,189, 8, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,142,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,104,162,180, 3, 60, 1, 0, 0, 9, 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, 7, 82,145,186,255,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,200,126, 35,188,247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,135, 84,145,188,
+ 7,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188, 11,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0,251,137, 94,189,145,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189,
+ 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112,163,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+235, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,
+165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,120,164,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,251,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 5,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 8, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+142,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,165,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 15,224,124, 60,188, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 71, 85,145,188, 23,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188, 18,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,152,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 31, 85,145,189, 34,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+136,166,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,223, 84,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,132,127, 35,188, 3, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,252, 84,145,188, 19,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,207, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,169,127, 35,189,
+ 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 50,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,167,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,143,223,124, 59, 56,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,250, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 4,224,124, 61,
+124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 11,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 43,138, 94,189,146,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 26,224,124, 62,
+140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,152,168,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 87,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 11,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,192,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,145,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160,169,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,
+221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,239,223,124, 61,127,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+184,127, 35,189, 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,135,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 17,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168,170,180, 3, 60, 1, 0, 0, 9, 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, 71, 84,145,186,239,223,124, 59, 58,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,120,127, 35,188, 2, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188,
+ 17,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,165,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 48,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189,
+ 28,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176,171,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+ 43, 21,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,
+165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,143,155, 65, 62,186,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 23,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,184,172,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 3, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 17,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,211, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 53,138, 94,189,
+148,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 10, 85,145,189, 29,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,173,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 71, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188, 15,143,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 27, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+200,174,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,219, 20,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189,
+ 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 27,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,175,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,247,223,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 5, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 59,138, 94,189,138,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 19,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,176,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 86,145,186,
+255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 27, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,224,177,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 71, 85,145,187,223,223,124, 60,189, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,247, 61, 14, 61,
+221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 7,224,124, 61,127,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+176,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,145,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,232,178,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,127,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,168,127, 35,188,247, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,
+ 7,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 11,143,197, 61, 82, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 43,138, 94,189,145,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189,
+ 25,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240,179,180, 3,
+ 60, 1, 0, 0, 9, 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,
+135, 84,145,186, 63,224,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187, 55,224,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 17, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 30,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+203, 20,227,188, 24,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,164,127, 35,189, 18, 62, 14, 62,
+163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 55,138, 94,189,155,155, 65, 62,183,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 9, 85,145,189, 36,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,248,180,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 19,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0,182,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 39, 85,145,188, 15,224,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 15,143,197, 61,
+ 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,163,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,151,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 31, 85,145,189, 31,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 8,183,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 85,145,187,
+255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 7, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189,
+ 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,184,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,191,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,247,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+ 72,127, 35,188, 0, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 14,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188, 13,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 27,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,251, 84,145,189, 27,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 24,185,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 85,145,186,
+127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187,223,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,184,127, 35,188,247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 31, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,243, 20,227,188,
+ 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,188,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,141,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 17, 85,145,189, 22,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32,186,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,255, 61, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+176,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,147,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 40,187,180, 3, 60, 1, 0, 0, 9, 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, 71, 84,145,186,255,223,124, 59, 58,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188,
+ 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,211, 20,227,188, 19,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,170,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 56,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 13, 85,145,189,
+ 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,188,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187, 63,224,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+171, 20,227,188, 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 11, 62, 14, 62,
+163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 19,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0, 56,189,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,103, 85,145,188,255,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 21,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,216,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 23,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,190,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 31,224,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 71, 85,145,188, 23,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188, 27,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 19, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 31, 85,145,189, 35,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 72,191,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,
+191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,255, 61, 14, 61,219,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,187, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189,
+ 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,143,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80,192,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,
+128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 13, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 75,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 29,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,193,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 31,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 19,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,149,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 33,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96,194,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+215, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,144,127, 35,188, 7, 62, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,251, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,207, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+166,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 45,138, 94,189,147,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 8, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,104,195,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,222,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,
+255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,255,142,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 91,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189,
+ 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112,196,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+219, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 13, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,145,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 29,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,120,197,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,198,180, 3, 60, 1, 0, 0, 9, 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, 7, 82,145,186,255,223,124, 59,
+ 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 83,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,126, 35,188,239, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+135, 84,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,255,142,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0, 88,127, 35,189,255, 61, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0,219,137, 94,189,135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+223, 84,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+136,199,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,239, 61, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189,
+ 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,137,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,200,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,251, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 3,224,124, 61,
+124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 8,143,197, 61, 80, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 10, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 27,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 24,224,124, 62,
+140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,152,201,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 86,145,186,
+255,224,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 31,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 27,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,216,127, 35,189, 23, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,157,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 31, 85,145,189, 37,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160,202,180, 3, 60, 1, 0, 0, 9, 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, 7, 87,145,186, 15,224,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+135, 85,145,187, 19,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,232,127, 35,188, 12, 62, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 28,224,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 25,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+200,127, 35,189, 19, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,155,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 35,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168,203,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186, 63,224,124, 59, 58,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,168,127, 35,188, 3, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,
+ 19,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 51,138, 94,189,148,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189,
+ 29,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176,204,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186, 33,224,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 29,224,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 11, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 24,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+ 43, 21,227,188, 24,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 18, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,157,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 37,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,184,205,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 71, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 27, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,206,180, 3, 60, 1, 0, 0, 9, 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, 7, 82,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188, 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+167, 84,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 15,143,197, 61,
+ 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+247, 84,145,189, 23,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+200,207,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,215, 84,145,187,
+191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188,255, 61, 14, 61,219,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,223, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,174,127, 35,189,
+ 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 57,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 12, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,208,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,
+127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 75,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,
+143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,209,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 86,145,186,
+191,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 15,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 23,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 17,143,197, 61, 83, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 14, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,146,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 26,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,224,210,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+135, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,139,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 19,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,232,211,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,127,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,168,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,
+255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188, 3,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,192,127, 35,189, 6, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 67,138, 94,189,140,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189,
+ 21,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240,212,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 84,145,186,127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+235, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,141,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,248,213,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0,215,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,224,124, 59,
+ 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188, 47, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+231, 84,145,188, 63,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 47,143,197, 61,
+ 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 27, 62, 14, 62,163,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,167,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+255, 84,145,189, 51,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 8,216,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186, 31,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,
+ 31,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 16, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,215, 20,227,188, 22,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,172,127, 35,189,
+ 17, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 53,138, 94,189,151,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 9, 85,145,189, 32,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,217,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+136,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188,255,223,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 59,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 23,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 24,218,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188,247,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,145,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 26,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32,219,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 40,220,180, 3, 60, 1, 0, 0, 9, 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,191, 84,145,186,255,222,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,229, 84,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,154,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,
+255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,232, 20,227,188, 7,143,197, 61, 82, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,182,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 65,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 16, 85,145,189,
+ 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,221,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187, 31,224,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+219, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0, 56,222,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+ 47, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 47,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188, 47,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189, 27, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,
+167,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 49,224,124, 62,139, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,223,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59,
+ 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+167, 84,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188, 11,143,197, 61,
+ 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 9, 62, 14, 62,163,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+239, 84,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 72,224,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188, 15, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,171, 20,227,188, 31,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189,
+ 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,159,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 39,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80,225,180, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,
+125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,192,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 67,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 19,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,226,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,247,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 5, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,138,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96,227,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+135, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+168,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,104,228,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187, 15,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188,
+ 19,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 17,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,164,127, 35,189, 14, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 51,138, 94,189,148,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189,
+ 30,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112,229,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 83,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 84,145,187,191,223,124, 60,
+186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 40,127, 35,188,223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,239,223,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+155, 20,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,128,127, 35,189,255, 61, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,131,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0,243, 84,145,189, 15,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,120,230,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+239, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,255,223,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,247,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,120,127, 35,189,255, 61, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,
+131,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,239, 84,145,189, 11,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,231,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 39, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 23,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 39, 85,145,189, 27,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+136,232,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,222,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,
+191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,239, 61, 14, 61,221,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,103, 85,145,188,255,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0, 43, 21,227,188,255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189,
+ 3, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,135,155, 65, 62,186,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 19,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,233,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+200,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 91,138, 94,189,151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 27,224,124, 62,
+143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,152,234,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 85,145,186,
+127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,231, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,215, 84,145,188,231,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+247,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 1, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,251, 84,145,189, 15,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160,235,180, 3, 60, 1, 0, 0, 9, 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, 7, 83,145,186,191,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+135, 84,145,187,239,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188, 3, 62, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+152,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,145,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168,236,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186, 63,224,124, 59, 56,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 47,224,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,
+ 29,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 24,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 17, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 59,138, 94,189,155,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189,
+ 35,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176,237,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,
+188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 23,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+ 43, 21,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,216,127, 35,189, 15, 62, 14, 62,
+166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,150,155, 65, 62,186,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 30,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,184,238,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 15,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 11, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 23,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 17, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 33,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,239,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,191,223,124, 59,
+ 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 15,224,124, 60,188, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 39, 85,145,188, 19,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 17,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 14, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 23, 85,145,189, 34,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+200,240,180, 3, 60, 1, 0, 0, 9, 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,103, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,191, 84,145,187,
+ 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,144,127, 35,188, 15, 62, 14, 61,219,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 3, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,223, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,174,127, 35,189,
+ 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 63,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,241,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,191,223,124, 59, 59,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 3,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+ 8,128, 35,188, 4, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 18,224,124, 61,
+128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 14, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 91,138, 94,189,149,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 26,224,124, 62,
+143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,242,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188,247,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,160,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,145,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,224,243,180, 3, 60, 1, 0, 0, 9, 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, 7, 87,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+199, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 40,128, 35,188, 15, 62, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0, 27, 21,227,188, 31,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+208,127, 35,189, 27, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,163,155, 65, 62,
+183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 27, 85,145,189, 43,224,124, 62,140, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,232,244,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 59,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,
+ 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 75,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189,
+ 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240,245,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186,127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,207,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,244, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,254,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+ 11, 21,227,188, 5,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 9, 62, 14, 62,
+165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 25,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,248,246,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,241,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+253, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 11,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 13,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 12, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+146,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 27,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0,248,180, 3, 60, 1, 0, 0, 9, 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,199, 84,145,186,255,222,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,247, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,160,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 11, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,231, 20,227,188, 15,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,178,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 61,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 14, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 8,249,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,239, 61, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,203, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189,
+ 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,137,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 17,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,250,180, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,215, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+140,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,251, 84,145,188, 15,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,178,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 61,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 24,251,180, 3, 60, 1, 0, 0,
+ 9, 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, 7, 85,145,186,
+ 13,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 31,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 9, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 23, 85,145,188, 22,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 16,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 14, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,148,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 30,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32,252,180, 3, 60, 1, 0, 0, 9, 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,199, 84,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+231, 84,145,187,159,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,144,127, 35,188,231, 61, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,217, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+175,127, 35,189, 5, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 56,138, 94,189,140,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 21,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 40,253,180, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,224,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 63,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0, 72,128, 35,188, 31, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,103, 85,145,188,
+ 47,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 21,227,188, 39,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,248,127, 35,189, 27, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0,139,138, 94,189,163,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 55, 85,145,189,
+ 43,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,254,180, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+219, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 11, 62, 14, 62,
+165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0, 56,255,180, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 71, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189, 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 19,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64, 0,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 23, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188, 7,143,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 19, 85,145,189, 19,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 72, 1,181, 3, 60, 1, 0, 0, 9, 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,199, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 15, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 3, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,180,127, 35,189,
+ 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 63,138, 94,189,147,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80, 2,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187, 31,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+168,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 39,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,227, 20,227,188, 33,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 24, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 67,138, 94,189,162,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 17, 85,145,189, 45,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88, 3,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 85,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 11, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96, 4,181, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+231, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 7, 62, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,147,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 9, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,104, 5,181, 3, 60, 1, 0, 0, 9, 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, 7, 82,145,186,223,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,235,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,200,126, 35,188,251, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,167, 84,145,188,
+ 9,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188, 11,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,120,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0,251,137, 94,189,145,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,239, 84,145,189,
+ 28,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112, 6,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187,191,223,124, 60,
+186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+ 3, 21,227,188, 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,196,127, 35,189, 7, 62, 14, 62,
+163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 87,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 29, 85,145,189, 23,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,120, 7,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,191,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+251, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 11,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,155, 20,227,188, 13,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 12, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 19,138, 94,189,
+144,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 24,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128, 8,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 31,224,124, 60,188, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 71, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 11,143,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 31, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+136, 9,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+239,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 3, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,219, 20,227,188, 17,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189,
+ 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,149,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 29,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144, 10,181, 3, 60, 1, 0, 0, 9, 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,135, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,103, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+248,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 55, 85,145,188, 15,224,124, 61,
+125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 35, 21,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,220,127, 35,189, 15, 62, 14, 62,162,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+107,138, 94,189,151,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 37, 85,145,189, 31,224,124, 62,
+139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,152, 11,181, 3, 60, 1, 0, 0,
+ 9, 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,135, 86,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,103, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,184,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 31,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,180,127, 35,189, 23, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 71,138, 94,189,159,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 18, 85,145,189, 43,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160, 12,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 39, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 15, 85,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,243, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+184,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,151,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 25, 85,145,189, 27,224,124, 62,140, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168, 13,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,222,124, 59, 58,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0, 8,128, 35,188,239, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188,
+255,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 21,227,188, 7,143,197, 61, 82, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,216,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0,107,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189,
+ 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176, 14,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+219, 20,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 15, 62, 14, 62,
+165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,184, 15,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 71, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192, 16,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,143,223,124, 59,
+ 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,251, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 39, 85,145,188, 2,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 11,143,197, 61,
+ 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,145,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 7, 85,145,189, 27,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+200, 17,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,219,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,235, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189,
+ 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,147,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208, 18,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+152,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 15, 85,145,188,255,223,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 75,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 23,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216, 19,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,239, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188,239,223,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+247,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,120,127, 35,189,251, 61, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,131,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,239, 84,145,189, 11,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,224, 20,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+ 39, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,176,127, 35,188,239, 61, 14, 61,
+219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 19, 85,145,188,239,223,124, 61,125,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,231, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+179,127, 35,189, 5, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 65,138, 94,189,139,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 16, 85,145,189, 21,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,232, 21,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,104,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,239, 84,145,188,
+ 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 11,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,164,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 51,138, 94,189,145,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189,
+ 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240, 22,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186,127,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,207,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,243, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,251,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+235, 20,227,188, 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,141,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,248, 23,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+ 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,
+147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 27,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0, 25,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,127,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,247, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 3,143,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 6, 62, 14, 62,164,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,141,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 23, 85,145,189, 22,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 8, 26,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 85,145,187,
+ 13,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 5, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 19,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,227, 20,227,188, 17,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189,
+ 14, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,149,155, 65, 62,185,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 13, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16, 27,181, 3, 60, 1, 0, 0, 9, 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,151, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0,219, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+140,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,249, 84,145,188, 15,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,205, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 51,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 10, 85,145,189, 27,224,124, 62,
+142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 24, 28,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 86,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 27, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32, 29,181, 3, 60, 1, 0, 0, 9, 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,175, 84,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+224, 84,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,142,127, 35,188,239, 61, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 1, 85,145,188,239,223,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,207, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+164,127, 35,189, 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 42,138, 94,189,135,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 4, 85,145,189, 15,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 40, 30,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 31,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,200,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,
+ 23,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 82, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189,
+ 31,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48, 31,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187,223,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,176,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 19, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+231, 20,227,188, 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,178,127, 35,189, 9, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 63,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 24,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0, 56, 32,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 31,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64, 33,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 7, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 23, 85,145,189, 31,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+ 72, 34,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,
+255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,255, 61, 14, 61,217,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,123,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189,
+ 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,182,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80, 35,181, 3, 60, 1, 0, 0, 9, 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, 71, 85,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+144,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 31,224,124, 61,
+125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,223, 20,227,188, 31,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 23, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 63,138, 94,189,161,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 14, 85,145,189, 43,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88, 36,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187, 15,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 17,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,150,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 30,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96, 37,181, 3, 60, 1, 0, 0, 9, 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, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+135, 84,145,187,255,223,124, 60,185, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,255, 61, 14, 61,
+217,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,123,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+152,127, 35,189, 7, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,143,155, 65, 62,
+184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,104, 38,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,127,223,124, 59, 56,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,168,127, 35,188,247, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188,
+255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 3,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 59,138, 94,189,141,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189,
+ 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112, 39,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+235, 20,227,188, 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 5, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 21,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,120, 40,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,189, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 1, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 16,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 13, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 30,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128, 41,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 7, 85,145,188, 7,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 11,143,197, 61,
+ 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,145,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 23, 85,145,189, 29,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+136, 42,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,191,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,
+255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 11, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 19,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0, 11, 21,227,188, 21,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189,
+ 17, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,153,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 33,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144, 43,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 86,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+ 8,128, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,216,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+107,138, 94,189,147,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 39, 85,145,189, 27,224,124, 62,
+140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,152, 44,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 86,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160, 45,181, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,
+220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,215, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+174,127, 35,189, 11, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 57,138, 94,189,143,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 13, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168, 46,181, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 15, 85,145,188,
+ 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,211, 20,227,188, 23,143,197, 61, 82, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 51,138, 94,189,147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189,
+ 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176, 47,181, 3,
+ 60, 1, 0, 0, 9, 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,
+ 7, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,247, 84,145,187,191,223,124, 60,
+187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66,
+ 0, 0, 32, 63, 0, 0, 0, 0, 11, 85,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,
+227, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,180,127, 35,189, 7, 62, 14, 62,
+164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 73,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66,
+ 0, 0, 0, 62, 0, 0, 0, 0, 20, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,216, 0, 0, 0,184, 48,181, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,211, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 55,138, 94,189,
+147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 12, 85,145,189, 27,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192, 49,181, 3, 60, 1, 0, 0, 9, 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, 7, 86,145,186,255,223,124, 59,
+ 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65,
+ 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,
+ 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 23,143,197, 61,
+ 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66,
+ 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,
+ 23, 85,145,189, 35,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,
+200, 50,181, 3, 60, 1, 0, 0, 9, 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,135, 84,145,186, 15,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,
+251,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 8, 62, 14, 61,220,123, 65, 63,
+ 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 22,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63,
+ 0, 0, 0, 0,219, 20,227,188, 17,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,172,127, 35,189,
+ 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,148,155, 65, 62,184,177,216, 63,
+ 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 9, 85,145,189, 30,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208, 51,181, 3, 60, 1, 0, 0, 9, 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, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65,
+ 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,
+168,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,
+126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66,
+ 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,
+ 67,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 27,224,124, 62,
+141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216, 52,181, 3, 60, 1, 0, 0,
+ 9, 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, 7, 84,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 3, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,137,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 17,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,224, 53,181, 3, 60, 1, 0, 0, 9, 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,111, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,
+173, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,116,127, 35,188,255, 61, 14, 61,
+221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,245, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66,
+ 0, 0, 0, 63, 0, 0, 0, 0,199, 20,227,188, 13,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,
+163,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 47,138, 94,189,147,155, 65, 62,
+185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 6, 85,145,189, 28,224,124, 62,142, 17,245, 63, 0, 0,200, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,232, 54,181, 3, 60, 1, 0, 0, 9, 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, 7, 82,145,186,127,223,124, 59, 57,146,131, 62,
+ 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63,
+ 0, 0, 0, 0, 8,127, 35,188,247, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,
+ 7,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 7,143,197, 61, 81, 2,158, 63,
+ 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62,
+ 0, 0, 0, 0, 27,138, 94,189,147,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189,
+ 28,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0,240, 55,181, 3,
+119, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,137,156, 3,105, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,
+101,109, 32, 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,168, 90,154, 3,
+ 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0, 8, 57,181, 3,
+115, 0, 0, 0, 1, 0, 0, 0,152, 60,181, 3,184, 4,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,
+119,108, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 97,109,112, 1, 0, 0, 4, 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, 8, 87,179, 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,192,197,211,188, 76,229, 59, 65,
+208,106,184, 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,247,215, 98,191, 71, 11, 72, 63,230,248, 6, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212, 14, 29, 63,149,225,182, 62, 84, 76, 52,191, 0, 0, 0, 0, 22, 40, 74,191,
+201, 74,139, 62,228,198, 12,191, 0, 0, 0, 0, 84,213,157,187,151,190,100, 63,145,223,229, 62, 0, 0, 0, 0,192,197,211,188,
+ 76,229, 59, 65,208,106,184, 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,147, 39, 25, 51, 43, 47, 63,179, 0, 0, 0, 0, 9,108,247, 50,
+ 0, 0,128, 63, 26, 92,142,178, 0, 0, 0, 0, 43, 4,114,179, 32, 59,141,178, 1, 0,128, 63, 0, 0, 0, 0,135,255,127,177,
+130,214, 10, 40, 1, 0, 0,181, 0, 0,128, 63,213, 14, 29, 63, 23, 40, 74,191,254,211,157,187, 0, 0, 0, 0, 83, 76, 52,191,
+227,198, 12,191,148,223,229, 62, 0, 0, 0, 0,149,225,182,190,202, 74,139,190,152,190,100,191, 0, 0, 0, 0,208, 36,158,192,
+100,186,110,192, 99, 43,169,193, 0, 0,128, 63, 0, 8, 0, 0, 0, 0, 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,236, 81, 56, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 0, 0, 92, 3, 0, 0,152, 60,181, 3,115, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 57,181, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 46, 48, 48, 53, 0, 0, 0, 0,
+ 1, 0, 0, 4, 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,160,170,186, 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, 40, 64,181, 3, 96, 64,181, 3,
+ 1, 0, 0, 0, 1, 0, 0, 0, 61, 16,183,188, 21,204,103,191, 48,234,228, 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,153, 39,155, 64,153, 39,155, 64,153, 39,155, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,218, 15,201, 63, 0, 0,192, 37,255,255,255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 39,155, 64,
+152, 39, 27, 38,102,187,232,166, 0, 0, 0, 0,102,187,232, 38,157,134,196, 52,153, 39,155, 64, 0, 0, 0, 0,154, 39, 27, 38,
+153, 39,155,192,157,134,196, 52, 0, 0, 0, 0, 61, 16,183,188, 21,204,103,191, 48,234,228, 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,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,
+236, 48,206,152, 9, 66, 41, 24, 0, 0, 0, 0,216, 55, 60,152, 0, 0,128, 63, 88,133,105,166, 0, 0, 0, 0,226,159, 91,151,
+ 64,218, 93, 38, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 25, 50, 83, 62,
+147,101,158, 36, 27, 50,211, 35, 0, 0, 0, 0,147,101,158,164, 25, 50, 83, 62, 59,119,189, 38, 0, 0, 0, 0, 0, 24, 44,173,
+ 0,179,115,175, 25, 50, 83, 62, 0, 0, 0, 0,236,251, 33, 59, 88, 37, 40, 59,118, 71,238, 63, 0, 0,128, 63, 32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 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,
+236, 81, 56, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 4, 4, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 25, 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, 4, 0, 0, 0, 40, 64,181, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, 96, 64,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 77, 65, 0, 0,112, 2, 0, 0,152, 64,181, 3, 42, 0, 0, 0, 1, 0, 0, 0, 64, 68,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 99,104,101, 99,107,101,114,100, 97,114,107, 0, 0, 0, 97,116,101,114,105, 97, 0, 0,
+ 11, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,124, 36, 57, 62,187, 31, 57, 62,187, 31, 57, 62,
+ 0, 0,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, 63,154,153, 89, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63,
+ 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,160, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 1, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0,
+ 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 64, 1, 3, 0, 64, 1, 1, 0, 4, 0,
+ 12, 0, 4, 0, 0, 0, 0, 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,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,128, 63, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 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, 16, 8, 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, 56, 67,181, 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,240, 67,181, 3,
+ 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0, 56, 67,181, 3, 33, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104, 93,181, 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, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,192, 63,
+ 1, 0,192, 63, 1, 0,192, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,183,209, 56,184,177,209, 56,
+184,177,209, 56, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62,
+ 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,240, 67,181, 3, 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, 77, 65, 0, 0,112, 2, 0, 0,
+ 64, 68,181, 3, 42, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3,152, 64,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 99,104,
+101, 99,107,101,114,108,105,103,104,116, 0, 0, 0, 97,116,101,114,105, 0, 0, 11, 0, 0, 0, 23, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,158, 56, 23, 63,187, 52, 23, 63,187, 52, 23, 63, 0, 0,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, 63,154,153, 89, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,
+ 2, 0, 2, 0, 1, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 64, 1, 3, 0, 64, 1, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 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,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,128, 63, 0, 0, 0, 0, 0, 0, 2, 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,
+ 16, 8, 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,224, 70,181, 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,152, 71,181, 3, 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,205,204, 76, 63,205,204, 76, 63,
+205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 8,194,104,192, 0, 0, 0, 19, 0, 0, 0, 1, 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, 84, 69, 0, 0, 1, 16, 8,194,105, 16, 0, 0, 0, 38,
- 0, 0, 0, 1, 8,194,106,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69,112,114,101,118,105,101,119, 0,101,120,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 64,160, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0,
- 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 60,204,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 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, 8,194,106, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32, 8,194,106, 80,
- 0, 0, 0, 19, 0, 0, 0, 1, 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, 84, 69, 0, 0, 1, 16, 8,194,106,160, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 0,
- 8,194,105, 16, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69,102, 97,107,101,115,104, 97,100,111,119, 0, 0, 76,101,110,100, 0,101,
-120, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 64,160, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0,
- 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 40, 0, 5, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 60,204,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,107,224, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,194,113,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 46, 48, 48, 49, 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, 8,194,109, 32, 3,161,214, 32, 7,247,144, 32, 0, 0, 0, 0, 3,161,118, 32, 3,161,166, 32,
- 0, 0, 0, 0, 3,161,254, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,109, 80, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,110,208, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,112, 80, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,249,
- 0, 0, 3,237, 0, 0, 1,244, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 61, 88,133,192,189, 85, 45,184,190, 24,181,196,
- 63, 35, 71,185, 62,235, 31,153, 62,203,102,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 4, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,194,109, 32, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 94, 32, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,109, 80, 0, 0, 1, 42,
- 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, 3,161,118, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 47, 88,
- 3,161,118, 32, 0, 0, 0, 58, 0, 0, 1,249, 62,131,144,140, 60,200,163,119, 62, 85, 9,156, 92,125,170, 70, 21,228, 0,255,
- 0, 0, 0, 0,190, 26,222, 50, 60,200,163,119, 62, 85, 9,156,163,131,170, 70, 21,228, 0,255, 0, 0, 0, 0, 62,146,126, 61,
-188, 8, 37,223, 62, 47,183, 99, 76,247,194,191, 81,228, 2,255, 0, 0, 0, 0,190, 56,185,147,188, 8, 37,223, 62, 47,183, 99,
-179, 9,194,191, 81,228, 2,255, 0, 0, 0, 0, 62,157,176,129,188,217, 91,211, 61,246,238,244, 84, 31,181,226, 61,191, 2,255,
- 0, 0, 0, 0,190, 79, 30, 28,188,217, 91,211, 61,246,238,244,171,225,181,226, 61,191, 2,255, 0, 0, 0, 0, 62, 94, 19,115,
-189,128,251,103, 62, 14, 32,150, 9,241,144,155, 62, 64, 2,255, 0, 0, 0, 0,189,227,161, 26,189,128,251,103, 62, 14, 32,150,
-246, 15,144,155, 62, 64, 2,255, 0, 0, 0, 0, 62, 94, 19,115,189, 25,118,251, 62, 62,165, 20, 14,184,163,144, 87, 76, 2,255,
- 0, 0, 0, 0,189,227,161, 26,189, 25,118,251, 62, 62,165, 20,241, 72,163,144, 87, 76, 2,255, 0, 0, 0, 0, 62, 94, 19,115,
- 60, 34,107,232, 62, 92,128,116, 3, 3,131,121, 29,110, 0,255, 0, 0, 0, 0,189,227,161, 26, 60, 34,107,232, 62, 92,128,116,
-252,253,131,121, 29,110, 0,255, 0, 0, 0, 0, 62, 56,193, 58, 60,200,163,119, 62, 99,247, 77,171, 56,167,117, 36,206, 0,255,
- 0, 0, 0, 0,189,152,252,168, 60,200,163,119, 62, 99,247, 77, 84,200,167,117, 36,206, 0,255, 0, 0, 0, 0, 62, 23, 42,109,
-188, 8, 37,223, 62, 73,215, 88,217,152,203,122,110, 56, 0,255, 0, 0, 0, 0, 62, 0,197,229,188,217, 91,211, 62, 29, 14, 71,
-184,179,175, 93, 69, 66, 2,255, 0, 0, 0, 0,188,164, 23,249,188,217, 91,211, 62, 29, 14, 71, 71, 77,175, 93, 69, 66, 2,255,
- 0, 0, 0, 0, 61,182,231, 88, 61,121,154,159, 62, 32,201,179,151,181,255,104, 74, 51, 2,255, 0, 0, 0, 0, 60,134,121,207,
- 61,121,154,159, 62, 32,201,179,104, 75,255,104, 74, 51, 2,255, 0, 0, 0, 0, 61,242,158, 25, 61,121,154,159, 62, 73,215, 88,
-171, 78,255,150, 95,246, 2,255, 0, 0, 0, 0,188, 80,194,110, 61,121,154,159, 62, 73,215, 88, 84,178,255,150, 95,246, 2,255,
- 0, 0, 0, 0, 62, 41,211,138, 61,121,154,159, 62, 99,247, 77,133,152,254,153, 37, 98, 0,255, 0, 0, 0, 0,189,118, 66,143,
- 61,121,154,159, 62, 99,247, 77,122,104,254,153, 37, 98, 0,255, 0, 0, 0, 0, 62, 56,193, 58, 61,206,232,154, 62, 99,247, 77,
-170, 24, 88, 13, 35, 89, 0,255, 0, 0, 0, 0,189,152,252,168, 61,206,232,154, 62, 99,247, 77, 85,232, 88, 13, 35, 89, 0,255,
- 0, 0, 0, 0, 62, 23, 42,109, 62, 5, 79,173, 62, 73,215, 88,200,249, 65,221, 94,244, 2,255, 0, 0, 0, 0,189, 43,158, 31,
- 62, 5, 79,173, 62, 73,215, 88, 55, 7, 65,221, 94,244, 2,255, 0, 0, 0, 0, 62, 0,197,229, 62, 27,180, 54, 62, 29, 14, 71,
-186, 51, 78, 86, 73, 78, 2,255, 0, 0, 0, 0,188,164, 23,249, 62, 27,180, 54, 62, 29, 14, 71, 69,205, 78, 86, 73, 78, 2,255,
- 0, 0, 0, 0, 62, 94, 19,115, 62, 65, 6,111, 62, 14, 32,150, 11, 2,107,152, 68,114, 2,255, 0, 0, 0, 0,189,227,161, 26,
- 62, 65, 6,111, 62, 14, 32,150,244,254,107,152, 68,114, 2,255, 0, 0, 0, 0, 62, 94, 19,115, 62, 35, 43, 14, 62, 62,165, 20,
- 14,201, 91,180, 88, 14, 2,255, 0, 0, 0, 0,189,227,161, 26, 62, 35, 43, 14, 62, 62,165, 20,241, 55, 91,180, 88, 14, 2,255,
- 0, 0, 0, 0, 62, 94, 19,115, 61,236,195,250, 62, 92,128,116, 2,134,125, 29, 26,228, 0,255, 0, 0, 0, 0,189,227,161, 26,
- 61,236,195,250, 62, 92,128,116,253,122,125, 29, 26,228, 0,255, 0, 0, 0, 0, 62,131,144,140, 61,206,232,154, 62, 85, 9,156,
- 93, 54, 85, 67, 20,154, 0,255, 0, 0, 0, 0,190, 26,222, 50, 61,206,232,154, 62, 85, 9,156,162,202, 85, 67, 20,154, 0,255,
- 0, 0, 0, 0, 62,146,126, 61, 62, 5, 79,173, 62, 47,183, 99, 76,241, 60,161, 82, 97, 2,255, 0, 0, 0, 0,190, 56,185,147,
- 62, 5, 79,173, 62, 47,183, 99,179, 15, 60,161, 82, 97, 2,255, 0, 0, 0, 0, 62,157,176,129, 62, 27,180, 54, 61,246,238,244,
- 83,179, 71,157, 65, 45, 2,255, 0, 0, 0, 0,190, 79, 30, 28, 62, 27,180, 54, 61,246,238,244,172, 77, 71,157, 65, 45, 2,255,
- 0, 0, 0, 0, 62,176, 89,157, 61,121,154,159, 61,232, 1, 67,111, 40,255,113, 63,117, 2,255, 0, 0, 0, 0,190,116,112, 84,
- 61,121,154,159, 61,232, 1, 67,144,216,255,113, 63,117, 2,255, 0, 0, 0, 0, 62,161,107,237, 61,121,154,159, 62, 40, 64,139,
-100, 48,255,154, 79,167, 2,255, 0, 0, 0, 0,190, 86,148,244, 61,121,154,159, 62, 40, 64,139,155,208,255,154, 79,167, 2,255,
- 0, 0, 0, 0, 62,139, 7,100, 61,121,154,159, 62, 81, 78, 48,126,117,254,181, 19,185, 0,255, 0, 0, 0, 0,190, 41,203,227,
- 61,121,154,159, 62, 81, 78, 48,129,139,254,181, 19,185, 0,255, 0, 0, 0, 0, 62,140,229, 26, 61,121,154,159, 62, 88,197, 8,
-120,160,254,106, 42,198, 2,255, 0, 0, 0, 0,190, 45,135, 79, 61,121,154,159, 62, 88,197, 8,135, 96,254,106, 42,198, 2,255,
- 0, 0, 0, 0, 62,133,110, 66, 61,214, 95,114, 62, 92,128,116, 93,173, 74,126, 45, 93, 2,255, 0, 0, 0, 0,190, 30,153,158,
- 61,214, 95,114, 62, 92,128,116,162, 83, 74,126, 45, 93, 2,255, 0, 0, 0, 0, 62, 94, 19,115, 61,251,177,170, 62,103,178,185,
- 11, 9,115, 31, 54,216, 2,255, 0, 0, 0, 0,189,227,161, 26, 61,251,177,170, 62,103,178,185,244,247,115, 31, 54,216, 2,255,
- 0, 0, 0, 0, 62, 53, 5,206, 61,214, 95,114, 62,111, 41,145,181, 9, 80,184, 65, 43, 2,255, 0, 0, 0, 0,189,145,133,208,
- 61,214, 95,114, 62,111, 41,145, 74,247, 80,184, 65, 43, 2,255, 0, 0, 0, 0, 62, 34, 92,178, 61,121,154,159, 62,111, 41,145,
-146,116,254, 57, 66, 43, 2,255, 0, 0, 0, 0,189, 88,103, 48, 61,121,154,159, 62,111, 41,145,109,140,254, 57, 66, 43, 2,255,
- 0, 0, 0, 0, 62, 53, 5,206, 60,170,200, 22, 62,111, 41,145,182, 34,173,181, 64,115, 2,255, 0, 0, 0, 0,189,145,133,208,
- 60,170,200, 22, 62,111, 41,145, 73,222,173,181, 64,115, 2,255, 0, 0, 0, 0, 62, 94, 19,115, 61,121,154,159, 62,114,228,253,
- 24, 74,255,139,125,171, 2,255, 0, 0, 0, 0,189,227,161, 26, 61,121,154,159, 62,114,228,253,231,182,255,139,125,171, 2,255,
- 0, 0, 0, 0, 62, 94, 19,115, 59, 43,249,149, 62,103,178,185, 10,218,140,140, 54, 45, 2,255, 0, 0, 0, 0,189,227,161, 26,
- 59, 43,249,149, 62,103,178,185,245, 38,140,140, 54, 45, 2,255, 0, 0, 0, 0, 62,133,110, 66, 60,170,200, 22, 62, 92,128,116,
- 92,141,179,203, 44,210, 2,255, 0, 0, 0, 0,190, 30,153,158, 60,170,200, 22, 62, 92,128,116,163,115,179,203, 44,210, 2,255,
- 0, 0, 0, 0, 61, 88,133,203, 62, 23,248,202, 62, 73,215, 88, 0, 0,124, 43, 31, 17, 0,255, 0, 0, 0, 0, 61, 88,133,203,
- 61,229, 77, 34, 62,111, 41,145, 0, 0,249, 63,127,209, 0,255, 0, 0, 0, 0, 61, 88,133,203,190,188,254,150, 62, 70, 27,236,
- 0, 0,251,204,127,237, 0,255, 0, 0, 0, 0, 61, 88,133,203,190, 78, 79,191, 62, 92,128,116, 0, 0,150, 33, 71,238, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,190, 14,221,146, 62, 99,247, 77, 0, 0,100, 28, 79,192, 0,255, 0, 0, 0, 0, 61, 88,133,203,
-190,211, 99, 30, 62, 62,165, 20, 0, 0,142,184, 59,147, 2,255, 0, 0, 0, 0, 61, 88,133,203, 62, 12,198,133, 62, 6,169,190,
- 0, 0,103,143, 75, 57, 0,255, 0, 0, 0, 0, 61, 88,133,203, 62, 91, 38, 99, 61,239,120, 28, 0, 0, 78,115,101, 34, 0,255,
- 0, 0, 0, 0, 61, 88,133,203, 62,187,243, 16,190,206,250,170, 0, 0,110,190,191,212, 2,255, 0, 0, 0, 0, 61, 88,133,203,
- 62, 87,106,247,191, 11,224,178, 0, 0, 35,144,133, 12, 3,255, 0, 0, 0, 0, 61, 88,133,203,188,157,165, 18,191, 9, 20, 33,
- 0, 0,214,194,134,213, 2,255, 0, 0, 0, 0, 61, 88,133,203,190,108, 43, 32,190,160, 83,227, 0, 0,134,154,215,113, 2,255,
- 0, 0, 0, 0, 62, 23, 42,109,190, 14,221,146, 61,232, 1, 67,113,144,198,122, 13, 79, 0,255, 0, 0, 0, 0,189, 43,158, 31,
-190, 14,221,146, 61,232, 1, 67,142,112,198,122, 13, 79, 0,255, 0, 0, 0, 0, 62, 75,106, 87,190,131, 37,138, 61,239,120, 28,
-122,196, 31, 19, 18,152, 2,255, 0, 0, 0, 0,189,190, 78,225,190,131, 37,138, 61,239,120, 28,133, 60, 31, 19, 18,152, 2,255,
- 0, 0, 0, 0, 62, 94, 19,115,190,192,186, 2, 61,239,120, 28,125,167, 12,146, 20,226, 0,255, 0, 0, 0, 0,189,227,161, 26,
-190,192,186, 2, 61,239,120, 28,130, 89, 12,146, 20,226, 0,255, 0, 0, 0, 0, 62,101,138, 75,190,239, 96,200, 61,202, 37,227,
-124,113,242,142, 26,196, 2,255, 0, 0, 0, 0,189,242,142,203,190,239, 96,200, 61,202, 37,227,131,143,242,142, 26,196, 2,255,
- 0, 0, 0, 0, 62, 82,225, 47,190,252,112,195, 61,194,175, 10, 79,159,159, 44, 25,210, 2,255, 0, 0, 0, 0,189,205, 60,146,
-190,252,112,195, 61,194,175, 10,176, 97,159, 44, 25,210, 2,255, 0, 0, 0, 0, 62, 11,248, 41,191, 1, 4,242, 61,224,138,107,
- 19,143,131, 13, 19,178, 2,255, 0, 0, 0, 0,188,253,170, 27,191, 1, 4,242, 61,224,138,107,236,113,131, 13, 19,178, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,191, 2,226,168, 61,246,238,244, 0, 0,130, 75, 24, 21, 2,255, 0, 0, 0, 0, 62,131,144,140,
-189,240,242, 18, 61,202, 37,227, 47,114,137,117, 8,232, 2,255, 0, 0, 0, 0,190, 26,222, 50,189,240,242, 18, 61,202, 37,227,
-208,142,137,117, 8,232, 2,255, 0, 0, 0, 0, 62,178, 55, 83,189,143,233, 23, 61,209,156,187, 77, 25,154,198, 13,214, 2,255,
- 0, 0, 0, 0,190,120, 43,193,189,143,233, 23, 61,209,156,187,178,231,154,198, 13,214, 2,255, 0, 0, 0, 0, 62,224,222, 26,
- 60,140,236,182, 61,112, 21, 49,113,216,198,247, 12,255, 2,255, 0, 0, 0, 0,190,170,188,167, 60,140,236,182, 61,112, 21, 49,
-142, 40,198,247, 12,255, 2,255, 0, 0, 0, 0, 62,232, 84,243, 62, 23,248,202, 62, 2,238, 82,113,104, 51, 31, 30, 32, 2,255,
- 0, 0, 0, 0,190,178, 51,128, 62, 23,248,202, 62, 2,238, 82,142,152, 51, 31, 30, 32, 2,255, 0, 0, 0, 0, 62,196,224,112,
- 62, 50, 24,190, 62, 17,220, 2, 64,216,106,225, 27,121, 0,255, 0, 0, 0, 0,190,142,190,253, 62, 50, 24,190, 62, 17,220, 2,
-191, 40,106,225, 27,121, 0,255, 0, 0, 0, 0, 62,144,160,134, 62,106, 20, 20, 62, 47,183, 99, 75,137,101, 82, 20, 70, 0,255,
- 0, 0, 0, 0,190, 52,254, 39, 62,106, 20, 20, 62, 47,183, 99,180,119,101, 82, 20, 70, 0,255, 0, 0, 0, 0, 62, 79, 37,195,
- 62,154, 92, 67, 62, 70, 27,236, 38,241,119, 19, 26, 54, 2,255, 0, 0, 0, 0,189,197,197,186, 62,154, 92, 67, 62, 70, 27,236,
-217, 15,119, 19, 26, 54, 2,255, 0, 0, 0, 0, 62, 0,197,229, 62,145, 7,181, 62, 81, 78, 48,175, 21, 96, 54, 24, 12, 2,255,
- 0, 0, 0, 0,188,164, 23,249, 62,145, 7,181, 62, 81, 78, 48, 80,235, 96, 54, 24, 12, 2,255, 0, 0, 0, 0, 61,167,249,168,
- 62, 53,212, 42, 62, 77,146,196,155,174, 76,128, 21,151, 0,255, 0, 0, 0, 0, 60,194, 48,144, 62, 53,212, 42, 62, 77,146,196,
-100, 82, 76,128, 21,151, 0,255, 0, 0, 0, 0, 62, 4,129, 81, 62, 16,129,241, 62, 88,197, 8, 25, 0,237, 4,124, 22, 0,255,
- 0, 0, 0, 0,188,193,243, 89, 62, 16,129,241, 62, 88,197, 8,231, 0,237, 4,124, 22, 0,255, 0, 0, 0, 0, 61,227,176,105,
- 61,184,132, 17, 62, 85, 9,156,255,160,232,126,125,209, 0,255, 0, 0, 0, 0,187,178,169,214, 61,184,132, 17, 62, 85, 9,156,
- 0, 96,232,126,125,209, 0,255, 0, 0, 0, 0,189, 43,158, 31,188, 8, 37,223, 62, 73,215, 88, 38,104,203,122,110, 56, 0,255,
- 0, 0, 0, 0, 62,105, 69,184,189, 55, 82, 92, 62, 55, 46, 59, 34,106,200,119,110, 16, 0,255, 0, 0, 0, 0,189,250, 5,163,
-189, 55, 82, 92, 62, 55, 46, 59,221,150,200,119,110, 16, 0,255, 0, 0, 0, 0, 62,144,160,134,188,187,128,115, 62, 40, 64,139,
- 55,161,207, 60,104,115, 0,255, 0, 0, 0, 0,190, 52,254, 39,188,187,128,115, 62, 40, 64,139,200, 95,207, 60,104,115, 0,255,
- 0, 0, 0, 0, 62,176, 89,157, 61, 17, 26,205, 62, 29, 14, 71, 58,181,226,123,109,214, 0,255, 0, 0, 0, 0,190,116,112, 84,
- 61, 17, 26,205, 62, 29, 14, 71,197, 75,226,123,109,214, 0,255, 0, 0, 0, 0, 62,180, 21, 9, 61,177, 13, 57, 62, 29, 14, 71,
- 49,157,230, 61,115, 36, 0,255, 0, 0, 0, 0,190,123,231, 45, 61,177, 13, 57, 62, 29, 14, 71,206, 99,230, 61,115, 36, 0,255,
- 0, 0, 0, 0, 62,170,192,123, 61,251,177,170, 62, 36,133, 31, 39,206,234,175,119,196, 0,255, 0, 0, 0, 0,190,105, 62, 16,
- 61,251,177,170, 62, 36,133, 31,216, 50,234,175,119,196, 0,255, 0, 0, 0, 0, 62,129,178,214, 62, 27,180, 54, 62, 62,165, 20,
- 24, 62,255, 85,125,173, 0,255, 0, 0, 0, 0,190, 23, 34,198, 62, 27,180, 54, 62, 62,165, 20,231,194,255, 85,125,173, 0,255,
- 0, 0, 0, 0, 62, 45,142,246, 62, 42,161,230, 62, 81, 78, 48, 31,251,247, 40,123,158, 0,255, 0, 0, 0, 0,189,130,152, 32,
- 62, 42,161,230, 62, 81, 78, 48,224, 5,247, 40,123,158, 0,255, 0, 0, 0, 0, 61, 88,133,203,190,209,133,104, 62, 70, 27,236,
- 0, 0,210,148,119,170, 0,255, 0, 0, 0, 0, 61,212,194,185,190,198, 83, 36, 62, 70, 27,236, 19, 39,222, 65,121,248, 0,255,
- 0, 0, 0, 0, 58,240,196,191,190,198, 83, 36, 62, 70, 27,236,236,217,222, 65,121,248, 0,255, 0, 0, 0, 0, 61,220, 57,145,
-190,226, 80,207, 62, 58,233,167, 2,134,217,132,122, 12, 0,255, 0, 0, 0, 0,186,236,241, 77,190,226, 80,207, 62, 58,233,167,
-253,122,217,132,122, 12, 0,255, 0, 0, 0, 0, 61,167,249,168,190,237,131, 19, 62, 51,114,207,252, 13,214,169,121, 18, 0,255,
- 0, 0, 0, 0, 60,194, 48,144,190,237,131, 19, 62, 51,114,207, 3,243,214,169,121, 18, 0,255, 0, 0, 0, 0, 61, 88,133,203,
-190,239, 96,200, 62, 47,183, 99, 0, 0,219,150,122,180, 0,255, 0, 0, 0, 0, 61, 88,133,203,190, 18,152,254, 62, 77,146,196,
- 0, 0, 97, 46, 83, 76, 0,255, 0, 0, 0, 0, 61, 88,133,203,189,240,242, 18, 62, 73,215, 88, 0, 0,104,197, 73,134, 0,255,
- 0, 0, 0, 0, 61,205, 75,225,189,248,104,235, 62, 73,215, 88, 36, 52, 53, 2,110,187, 0,255, 0, 0, 0, 0, 59,179,158,179,
-189,248,104,235, 62, 73,215, 88,219,204, 53, 2,110,187, 0,255, 0, 0, 0, 0, 61,227,176,105,190, 33,134,174, 62, 77,146,196,
- 95,187,212, 14, 72,182, 0,255, 0, 0, 0, 0,187,178,169,214,190, 33,134,174, 62, 77,146,196,160, 69,212, 14, 72,182, 0,255,
- 0, 0, 0, 0, 61,190, 94, 48,190, 63, 98, 15, 62, 73,215, 88, 64,117,207,117, 99, 90, 0,255, 0, 0, 0, 0, 60, 81, 60,220,
-190, 63, 98, 15, 62, 73,215, 88,191,139,207,117, 99, 90, 0,255, 0, 0, 0, 0, 62,116,119,252,189,151, 95,239, 62, 40, 64,139,
- 49,103,196,157,102, 13, 0,255, 0, 0, 0, 0,190, 8, 53, 22,189,151, 95,239, 62, 40, 64,139,206,153,196,157,102, 13, 0,255,
- 0, 0, 0, 0, 62,174,123,231,188,217, 91,211, 62, 17,220, 2, 59,142,204,107,100,223, 2,255, 0, 0, 0, 0,190,112,180,232,
-188,217, 91,211, 62, 17,220, 2,196,114,204,107,100,223, 2,255, 0, 0, 0, 0, 62,200,155,220, 61, 46,246, 45, 62, 6,169,190,
- 66,102,217, 11,102, 65, 0,255, 0, 0, 0, 0,190,146,122,105, 61, 46,246, 45, 62, 6,169,190,189,154,217, 11,102, 65, 0,255,
- 0, 0, 0, 0, 62,204, 87, 72, 61,251,177,170, 62, 32,201,179, 54, 87,228,142,112,151, 0,255, 0, 0, 0, 0,190,150, 53,213,
- 61,251,177,170, 62, 32,201,179,201,169,228,142,112,151, 0,255, 0, 0, 0, 0, 62,191, 71, 78, 62, 16,129,241, 62, 66, 96,128,
- 42, 82,247, 97,120,125, 2,255, 0, 0, 0, 0,190,137, 37,219, 62, 16,129,241, 62, 66, 96,128,213,174,247, 97,120,125, 2,255,
- 0, 0, 0, 0, 62,131,144,140, 62, 79,244, 31, 62, 99,247, 77, 41,192,254,216,120,253, 0,255, 0, 0, 0, 0,190, 26,222, 50,
- 62, 79,244, 31, 62, 99,247, 77,214, 64,254,216,120,253, 0,255, 0, 0, 0, 0, 62, 75,106, 87, 62,124,189, 48, 62,118,160,105,
- 28,217, 7, 53,124,126, 0,255, 0, 0, 0, 0,189,190, 78,225, 62,124,189, 48, 62,118,160,105,227, 39, 7, 53,124,126, 0,255,
- 0, 0, 0, 0, 62, 23, 42,109, 62,113,138,236, 62,126, 23, 65,255,125, 5, 44,127,227, 0,255, 0, 0, 0, 0,189, 43,158, 31,
- 62,113,138,236, 62,126, 23, 65, 0,131, 5, 44,127,227, 0,255, 0, 0, 0, 0, 61,205, 75,225, 62, 23,248,202, 62,122, 91,213,
-238,130, 2, 89,126,197, 0,255, 0, 0, 0, 0, 59,179,158,179, 62, 23,248,202, 62,122, 91,213, 17,126, 2, 89,126,197, 0,255,
- 0, 0, 0, 0, 61,227,176,105,189,203,159,217, 62,107,110, 37, 23,115,230, 27,123, 34, 0,255, 0, 0, 0, 0,187,178,169,214,
-189,203,159,217, 62,107,110, 37,232,141,230, 27,123, 34, 0,255, 0, 0, 0, 0, 62, 26,229,218,190,133, 3, 64, 62, 58,233,167,
- 74,212, 14, 28,102,225, 2,255, 0, 0, 0, 0,189, 58,139,207,190,133, 3, 64, 62, 58,233,167,181, 44, 14, 28,102,225, 2,255,
- 0, 0, 0, 0, 62, 45,142,246,190,194,151,184, 62, 47,183, 99, 72,235,252, 17,105, 31, 2,255, 0, 0, 0, 0,189,130,152, 32,
-190,194,151,184, 62, 47,183, 99,183, 21,252, 17,105, 31, 2,255, 0, 0, 0, 0, 62, 53, 5,206,190,222,149, 99, 62, 36,133, 31,
- 66,179,225,197,104,249, 2,255, 0, 0, 0, 0,189,145,133,208,190,222,149, 99, 62, 36,133, 31,189, 77,225,197,104,249, 2,255,
- 0, 0, 0, 0, 62, 38, 24, 30,190,244,249,234, 62, 21,151,111, 44, 62,183, 4, 95, 98, 2,255, 0, 0, 0, 0,189,103, 84,224,
-190,244,249,234, 62, 21,151,111,211,194,183, 4, 95, 98, 2,255, 0, 0, 0, 0, 62, 4,129, 81,190,248,181, 86, 62, 21,151,111,
- 19,155,158, 52, 80, 54, 2,255, 0, 0, 0, 0,188,193,243, 89,190,248,181, 86, 62, 21,151,111,236,101,158, 52, 80, 54, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,190,252,112,195, 62, 25, 82,219, 0, 0,154,201, 78, 88, 2,255, 0, 0, 0, 0, 61, 88,133,203,
-188,247, 55, 52, 62, 66, 96,128, 0, 0,252, 2,127,239, 0,255, 0, 0, 0, 0, 61, 88,133,203, 61, 61,227,222, 62, 85, 9,156,
- 0, 0,227,112,124,196, 0,255, 0, 0, 0, 0, 62, 82,225, 47, 62, 46, 93, 82, 62, 73,215, 88, 21, 58,254,234,126, 56, 0,255,
- 0, 0, 0, 0,189,205, 60,146, 62, 46, 93, 82, 62, 73,215, 88,234,198,254,234,126, 56, 0,255, 0, 0, 0, 0, 62, 4,129, 81,
- 60, 94, 34,170, 62, 77,146,196,214, 37,232,110,118,163, 0,255, 0, 0, 0, 0,188,193,243, 89, 60, 94, 34,170, 62, 77,146,196,
- 41,219,232,110,118,163, 0,255, 0, 0, 0, 0, 61,235, 39, 65, 61, 61,227,222, 62, 81, 78, 48,232,150,230,127,123, 57, 0,255,
- 0, 0, 0, 0,188, 21, 11,173, 61, 61,227,222, 62, 81, 78, 48, 23,106,230,127,123, 57, 0,255, 0, 0, 0, 0, 61,220, 57,145,
-190,190,220, 76, 62, 70, 27,236, 20,117,248,197,126, 36, 0,255, 0, 0, 0, 0,186,236,241, 77,190,190,220, 76, 62, 70, 27,236,
-235,139,248,197,126, 36, 0,255, 0, 0, 0, 0, 61,182,231, 88,190,133, 3, 64, 62, 77,146,196, 19, 43, 0,128,126,141, 2,255,
- 0, 0, 0, 0, 60,134,121,207,190,133, 3, 64, 62, 77,146,196,236,213, 0,128,126,141, 2,255, 0, 0, 0, 0, 61, 88,133,203,
-190,133, 3, 64, 62, 77,146,196, 0, 0,255,122,127,254, 0,255, 0, 0, 0, 0, 61, 88,133,203,190, 82, 11, 43, 62, 73,215, 88,
- 0, 0,184,121,106, 36, 0,255, 0, 0, 0, 0, 61,197,213, 8,190, 55,235, 55, 62, 92,128,116, 66,167,160,139, 53, 45, 2,255,
- 0, 0, 0, 0, 60, 21,134, 27,190, 55,235, 55, 62, 92,128,116,189, 89,160,139, 53, 45, 2,255, 0, 0, 0, 0, 61,235, 39, 65,
-190, 33,134,174, 62, 99,247, 77,118,133,224,215, 36,239, 2,255, 0, 0, 0, 0,188, 21, 11,173,190, 33,134,174, 62, 99,247, 77,
-137,123,224,215, 36,239, 2,255, 0, 0, 0, 0, 61,212,194,185,189,233,123, 57, 62, 92,128,116, 81,167, 95,141, 24, 49, 2,255,
- 0, 0, 0, 0, 58,240,196,191,189,233,123, 57, 62, 92,128,116,174, 89, 95,141, 24, 49, 2,255, 0, 0, 0, 0, 61,145,149, 31,
-189,226, 4, 97, 62, 92,128,116,200,189,108,160, 39, 26, 2,255, 0, 0, 0, 0, 61, 13,225, 89,189,226, 4, 97, 62, 92,128,116,
- 55, 67,108,160, 39, 26, 2,255, 0, 0, 0, 0, 61, 88,133,203,190, 22, 84,106, 62,114,228,253, 0, 0, 23, 42,125,225, 0,255,
- 0, 0, 0, 0, 61,153, 11,247,189,248,104,235, 62,107,110, 37,231,186, 78, 89, 98, 66, 2,255, 0, 0, 0, 0, 60,253,231, 82,
-189,248,104,235, 62,107,110, 37, 24, 70, 78, 89, 98, 66, 2,255, 0, 0, 0, 0, 61,197,213, 8,189,255,223,195, 62,107,110, 37,
- 43, 88, 62,134,102,237, 2,255, 0, 0, 0, 0, 60, 21,134, 27,189,255,223,195, 62,107,110, 37,212,168, 62,134,102,237, 2,255,
- 0, 0, 0, 0, 61,212,194,185,190, 33,134,174, 62,114,228,253, 46,247,233, 89,116,228, 2,255, 0, 0, 0, 0, 58,240,196,191,
-190, 33,134,174, 62,114,228,253,209, 9,233, 89,116,228, 2,255, 0, 0, 0, 0, 61,182,231, 88,190, 44,184,243, 62,103,178,185,
- 31, 46,181,198, 99,128, 2,255, 0, 0, 0, 0, 60,134,121,207,190, 44,184,243, 62,103,178,185,224,210,181,198, 99,128, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,190, 63, 98, 15, 62,103,178,185, 0, 0,191,185,110,175, 2,255, 0, 0, 0, 0, 62, 49, 74, 98,
-190, 74,148, 83, 61,224,138,107,120, 23, 41, 34, 16, 99, 0,255, 0, 0, 0, 0,189,138, 14,248,190, 74,148, 83, 61,224,138,107,
-135,233, 41, 34, 16, 99, 0,255, 0, 0, 0, 0, 62, 4,129, 81,190, 40,253,134, 62, 58,233,167, 80,251,250, 26, 98,241, 0,255,
- 0, 0, 0, 0,188,193,243, 89,190, 40,253,134, 62, 58,233,167,175, 5,250, 26, 98,241, 0,255, 0, 0, 0, 0, 62, 11,248, 41,
-190, 74,148, 83, 62, 58,233,167, 83,215, 16,153, 95, 71, 0,255, 0, 0, 0, 0,188,253,170, 27,190, 74,148, 83, 62, 58,233,167,
-172, 41, 16,153, 95, 71, 0,255, 0, 0, 0, 0, 62, 38, 24, 30,190, 44,184,243, 61,224,138,107,122, 24, 35, 67, 15, 64, 0,255,
- 0, 0, 0, 0,189,103, 84,224,190, 44,184,243, 61,224,138,107,133,232, 35, 67, 15, 64, 0,255, 0, 0, 0, 0, 61, 88,133,203,
-190,235,165, 93, 62, 47,183, 99, 0, 0, 86,139, 94, 77, 0,255, 0, 0, 0, 0, 61,153, 11,247,190,233,199,167, 62, 47,183, 99,
-206,144, 70,200, 94,125, 0,255, 0, 0, 0, 0, 60,253,231, 82,190,233,199,167, 62, 47,183, 99, 49,112, 70,200, 94,125, 0,255,
- 0, 0, 0, 0, 61,197,213, 8,190,222,149, 99, 62, 58,233,167,164,253, 17,109, 88, 75, 0,255, 0, 0, 0, 0, 60, 21,134, 27,
-190,222,149, 99, 62, 58,233,167, 91, 3, 17,109, 88, 75, 0,255, 0, 0, 0, 0, 61,197,213, 8,190,203,236, 70, 62, 66, 96,128,
-225,141,168, 87, 88, 39, 0,255, 0, 0, 0, 0, 60, 21,134, 27,190,203,236, 70, 62, 66, 96,128, 30,115,168, 87, 88, 39, 0,255,
- 0, 0, 0, 0, 61, 88,133,203,190,213, 64,212, 62, 32,201,179, 0, 0,159, 20, 83,153, 0,255, 0, 0, 0, 0, 61,197,213, 8,
-190,205,201,252, 62, 36,133, 31,230, 5,177,250, 98, 20, 0,255, 0, 0, 0, 0, 60, 21,134, 27,190,205,201,252, 62, 36,133, 31,
- 25,251,177,250, 98, 20, 0,255, 0, 0, 0, 0, 61,197,213, 8,190,220,183,173, 62, 25, 82,219,152, 18, 24, 8, 70,188, 0,255,
- 0, 0, 0, 0, 60, 21,134, 27,190,220,183,173, 62, 25, 82,219,103,238, 24, 8, 70,188, 0,255, 0, 0, 0, 0, 61,153, 11,247,
-190,230, 12, 59, 62, 21,151,111,222, 26, 49,242,112,221, 0,255, 0, 0, 0, 0, 60,253,231, 82,190,230, 12, 59, 62, 21,151,111,
- 33,230, 49,242,112,221, 0,255, 0, 0, 0, 0, 61, 88,133,203,190,231,233,241, 62, 21,151,111, 0, 0, 60, 18,113, 5, 0,255,
- 0, 0, 0, 0, 62, 8, 60,189, 61, 76,209,142, 62, 92,128,116, 30, 4,244, 93,123,225, 0,255, 0, 0, 0, 0,188,223,206,186,
- 61, 76,209,142, 62, 92,128,116,225,252,244, 93,123,225, 0,255, 0, 0, 0, 0, 62, 15,179,149, 60,170,200, 22, 62, 88,197, 8,
- 9, 71,251, 34,127,144, 0,255, 0, 0, 0, 0,189, 13,194,190, 60,170,200, 22, 62, 88,197, 8,246,185,251, 34,127,144, 0,255,
- 0, 0, 0, 0, 62, 86,156,155, 62, 23,248,202, 62, 81, 78, 48, 17, 81, 2, 74,126,204, 0,255, 0, 0, 0, 0,189,212,179,106,
- 62, 23,248,202, 62, 81, 78, 48,238,175, 2, 74,126,204, 0,255, 0, 0, 0, 0, 62, 56,193, 58, 62, 20, 61, 94, 62, 88,197, 8,
- 25,218,253,177,125, 86, 2,255, 0, 0, 0, 0,189,152,252,168, 62, 20, 61, 94, 62, 88,197, 8,230, 38,253,177,125, 86, 2,255,
- 0, 0, 0, 0, 62,127,170, 64, 62, 9, 11, 25, 62, 88,197, 8, 21,182,240,210,125, 57, 2,255, 0, 0, 0, 0,190, 19,103, 90,
- 62, 9, 11, 25, 62, 88,197, 8,234, 74,240,210,125, 57, 2,255, 0, 0, 0, 0, 62,161,107,237, 61,229, 77, 34, 62, 51,114,207,
- 28,143,237,249,123,117, 0,255, 0, 0, 0, 0,190, 86,148,244, 61,229, 77, 34, 62, 51,114,207,227,113,237,249,123,117, 0,255,
- 0, 0, 0, 0, 62,167, 5, 15, 61,169,150, 97, 62, 47,183, 99, 15,209,246,217,126,175, 0,255, 0, 0, 0, 0,190, 97,199, 56,
- 61,169,150, 97, 62, 47,183, 99,240, 47,246,217,126,175, 0,255, 0, 0, 0, 0, 62,165, 39, 89, 61, 32, 8,125, 62, 43,251,247,
- 24,177,253,190,125,146, 0,255, 0, 0, 0, 0,190, 94, 11,204, 61, 32, 8,125, 62, 43,251,247,231, 79,253,190,125,146, 0,255,
- 0, 0, 0, 0, 62,140,229, 26,187,152,222, 60, 62, 62,165, 20, 33, 20, 2, 75,123,160, 0,255, 0, 0, 0, 0,190, 45,135, 79,
-187,152,222, 60, 62, 62,165, 20,222,236, 2, 75,123,160, 0,255, 0, 0, 0, 0, 62,105, 69,184,188,187,128,115, 62, 73,215, 88,
- 26, 85,248,238,125, 14, 0,255, 0, 0, 0, 0,189,250, 5,163,188,187,128,115, 62, 73,215, 88,229,171,248,238,125, 14, 0,255,
- 0, 0, 0, 0, 62, 34, 92,178,186,133,194,226, 62, 92,128,116, 7, 8,250,142,127,175, 0,255, 0, 0, 0, 0,189, 88,103, 48,
-186,133,194,226, 62, 92,128,116,248,248,250,142,127,175, 0,255, 0, 0, 0, 0, 62, 11,248, 41, 61,177, 13, 57, 62, 92,128,116,
- 34,169,240, 2,122, 43, 0,255, 0, 0, 0, 0,188,253,170, 27, 61,177, 13, 57, 62, 92,128,116,221, 87,240, 2,122, 43, 0,255,
- 0, 0, 0, 0, 62, 26,229,218, 61,251,177,170, 62, 92,128,116, 27,126,239,108,123,231, 0,255, 0, 0, 0, 0,189, 58,139,207,
- 61,251,177,170, 62, 92,128,116,228,130,239,108,123,231, 0,255, 0, 0, 0, 0, 62, 38, 24, 30, 61,236,195,250, 62, 81, 78, 48,
- 64,226,207, 13, 98,224, 0,255, 0, 0, 0, 0,189,103, 84,224, 61,236,195,250, 62, 81, 78, 48,191, 30,207, 13, 98,224, 0,255,
- 0, 0, 0, 0, 62, 19,111, 1, 61,177, 13, 57, 62, 81, 78, 48, 96, 29,229,169, 80, 81, 0,255, 0, 0, 0, 0,189, 28,176,110,
- 61,177, 13, 57, 62, 81, 78, 48,159,227,229,169, 80, 81, 0,255, 0, 0, 0, 0, 62, 41,211,138, 59,205,106, 77, 62, 81, 78, 48,
- 55, 36, 71,122, 90,188, 0,255, 0, 0, 0, 0,189,118, 66,143, 59,205,106, 77, 62, 81, 78, 48,200,220, 71,122, 90,188, 0,255,
- 0, 0, 0, 0, 62,105, 69,184,188, 67,220,161, 62, 66, 96,128, 21, 76, 78, 90, 98,241, 0,255, 0, 0, 0, 0,189,250, 5,163,
-188, 67,220,161, 62, 66, 96,128,234,180, 78, 90, 98,241, 0,255, 0, 0, 0, 0, 62,137, 41,174, 59, 43,249,149, 62, 55, 46, 59,
-245, 85, 69, 69,107, 25, 0,255, 0, 0, 0, 0,190, 38, 16,118, 59, 43,249,149, 62, 55, 46, 59, 10,171, 69, 69,107, 25, 0,255,
- 0, 0, 0, 0, 62,157,176,129, 61, 61,227,222, 62, 40, 64,139,223,232, 29,211,120, 67, 0,255, 0, 0, 0, 0,190, 79, 30, 28,
- 61, 61,227,222, 62, 40, 64,139, 32, 24, 29,211,120, 67, 0,255, 0, 0, 0, 0, 62,159,142, 55, 61,162, 31,137, 62, 40, 64,139,
-210,148,238,123,118, 95, 0,255, 0, 0, 0, 0,190, 82,217,136, 61,162, 31,137, 62, 40, 64,139, 45,108,238,123,118, 95, 0,255,
- 0, 0, 0, 0, 62,153,245, 21, 61,214, 95,114, 62, 43,251,247,229,216,179,108, 99, 43, 0,255, 0, 0, 0, 0,190, 71,167, 67,
- 61,214, 95,114, 62, 43,251,247, 26, 40,179,108, 99, 43, 0,255, 0, 0, 0, 0, 62,123,238,212, 62, 5, 79,173, 62, 77,146,196,
-237,202,158,179, 81, 35, 2,255, 0, 0, 0, 0,190, 15,171,238, 62, 5, 79,173, 62, 77,146,196, 18, 54,158,179, 81, 35, 2,255,
- 0, 0, 0, 0, 62, 60,124,166, 62, 9, 11, 25, 62, 85, 9,156, 39, 24,212,118,113,214, 2,255, 0, 0, 0, 0,189,160,115,129,
- 62, 9, 11, 25, 62, 85, 9,156,216,232,212,118,113,214, 2,255, 0, 0, 0, 0, 62, 86,156,155, 62, 12,198,133, 62, 77,146,196,
- 1,213,193,189,111,208, 0,255, 0, 0, 0, 0,189,212,179,106, 62, 12,198,133, 62, 77,146,196,254, 43,193,189,111,208, 0,255,
- 0, 0, 0, 0, 62, 23, 42,109, 60,230,126,216, 62, 77,146,196, 84,226, 42,192, 85,187, 0,255, 0, 0, 0, 0,189, 43,158, 31,
- 60,230,126,216, 62, 77,146,196,171, 30, 42,192, 85,187, 0,255, 0, 0, 0, 0, 62, 19,111, 1, 61, 91,191, 63, 62, 77,146,196,
-102,235, 2,196, 76, 11, 0,255, 0, 0, 0, 0,189, 28,176,110, 61, 91,191, 63, 62, 77,146,196,153, 21, 2,196, 76, 11, 0,255,
- 0, 0, 0, 0, 61,212,194,185, 62, 38,230,122, 62, 10,101, 42,182,183,104,118,246, 5, 0,255, 0, 0, 0, 0, 58,240,196,191,
- 62, 38,230,122, 62, 10,101, 42, 73, 73,104,118,246, 5, 0,255, 0, 0, 0, 0, 62, 19,111, 1, 62,131,247,186, 62, 14, 32,150,
-192,208, 66,221,167, 3, 2,255, 0, 0, 0, 0,189, 28,176,110, 62,131,247,186, 62, 14, 32,150, 63, 48, 66,221,167, 3, 2,255,
- 0, 0, 0, 0, 62, 86,156,155, 62,137,144,220, 62, 2,238, 82, 9, 59, 90, 89,165,208, 2,255, 0, 0, 0, 0,189,212,179,106,
- 62,137,144,220, 62, 2,238, 82,246,197, 90, 89,165,208, 2,255, 0, 0, 0, 0, 62,142,194,208, 62, 83,175,139, 61,224,138,107,
- 37,165,114,104,212,176, 0,255, 0, 0, 0, 0,190, 49, 66,187, 62, 83,175,139, 61,224,138,107,218, 91,114,104,212,176, 0,255,
- 0, 0, 0, 0, 62,189,105,152, 62, 35, 43, 14, 61,164,211,170, 45, 67,116, 40,227, 1, 0,255, 0, 0, 0, 0,190,135, 72, 37,
- 62, 35, 43, 14, 61,164,211,170,210,189,116, 40,227, 1, 0,255, 0, 0, 0, 0, 62,217,103, 66, 62, 12,198,133, 61,134,248, 73,
- 94,100, 79,237,223, 18, 0,255, 0, 0, 0, 0,190,163, 69,207, 62, 12,198,133, 61,134,248, 73,161,156, 79,237,223, 18, 0,255,
- 0, 0, 0, 0, 62,211,206, 32, 60,200,163,119, 60,211,115,252,120,247,221,255,231,165, 0,255, 0, 0, 0, 0,190,157,172,173,
- 60,200,163,119, 60,211,115,252,135, 9,221,255,231,165, 0,255, 0, 0, 0, 0, 62,170,192,123,189, 85, 45,188, 61, 52, 94,112,
- 76,155,154,106,242, 19, 0,255, 0, 0, 0, 0,190,105, 62, 16,189, 85, 45,188, 61, 52, 94,112,179,101,154,106,242, 19, 0,255,
- 0, 0, 0, 0, 62,131,144,140,189,196, 41, 0, 61,142,111, 33, 56,204,142, 26, 13,138, 0,255, 0, 0, 0, 0,190, 26,222, 50,
-189,196, 41, 0, 61,142,111, 33,199, 52,142, 26, 13,138, 0,255, 0, 0, 0, 0, 61, 88,133,203, 62,187,243, 16,188,105,242, 89,
- 0, 0,106,155, 70,214, 2,255, 0, 0, 0, 0, 61, 88,133,203, 62,208,121,226,190, 62, 7,254, 0, 0,127,243, 3, 82, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,190, 18,152,254,190,236,214, 11, 0, 0,164, 54,166,204, 3,255, 0, 0, 0, 0, 61, 88,133,203,
-190,136,190,173,189,124,142,139, 0, 0,129,179,235, 65, 0,255, 0, 0, 0, 0, 61, 88,133,203,191, 1,243,205, 61,134,248, 73,
- 0, 0,151,182,181,204, 2,255, 0, 0, 0, 0, 61, 88,133,203,190,218,217,247, 60, 56, 12,241, 0, 0,221,231,132,162, 2,255,
- 0, 0, 0, 0, 61, 88,133,203,190,162,222,161, 57,157, 21,147, 0, 0,212, 16,135,201, 0,255, 0, 0, 0, 0, 61, 88,133,203,
-190,142, 87,207,188,146,212,141, 0, 0,147,245,187, 97, 0,255, 0, 0, 0, 0, 62,230,119, 61, 61,106,172,239,189,253, 43,161,
-125,164,235,181, 13,156, 0,255, 0, 0, 0, 0,190,176, 85,202, 61,106,172,239,189,253, 43,161,130, 92,235,181, 13,156, 0,255,
- 0, 0, 0, 0, 62,232, 84,243, 61,199,113,194,190, 47, 26, 78,126,174,238, 23,252, 66, 0,255, 0, 0, 0, 0,190,178, 51,128,
- 61,199,113,194,190, 47, 26, 78,129, 82,238, 23,252, 66, 0,255, 0, 0, 0, 0, 62,211,206, 32, 61,147, 49,216,190,180,218,181,
- 81, 70, 13,148,158, 15, 1,255, 0, 0, 0, 0,190,157,172,173, 61,147, 49,216,190,180,218,181,174,186, 13,148,158, 15, 1,255,
- 0, 0, 0, 0, 62,137, 41,174, 62, 27,180, 54,190,244, 76,226, 58,123, 21,228,144, 70, 3,255, 0, 0, 0, 0,190, 38, 16,118,
- 62, 27,180, 54,190,244, 76,226,197,133, 21,228,144, 70, 3,255, 0, 0, 0, 0, 62,202,121,146,189,151, 95,239,189,238, 61,240,
- 89, 76,164,139, 6,161, 2,255, 0, 0, 0, 0,190,148, 88, 31,189,151, 95,239,189,238, 61,240,166,180,164,139, 6,161, 2,255,
- 0, 0, 0, 0, 62,168,226,197,189,226, 4, 97,190,103, 21,163, 38, 93,134, 34, 7,182, 0,255, 0, 0, 0, 0,190,101,130,164,
-189,226, 4, 97,190,103, 21,163,217,163,134, 34, 7,182, 0,255, 0, 0, 0, 0, 62,180, 21, 9,189,100, 27,109,190,178,252,255,
- 43,106,170,219,170,222, 1,255, 0, 0, 0, 0,190,123,231, 45,189,100, 27,109,190,178,252,255,212,150,170,219,170,222, 1,255,
- 0, 0, 0, 0, 62, 86,156,155,188,217, 91,211,190,234,248, 85, 55,168,213,109,148,229, 2,255, 0, 0, 0, 0,189,212,179,106,
-188,217, 91,211,190,234,248, 85,200, 88,213,109,148,229, 2,255, 0, 0, 0, 0, 62, 38, 24, 30,190, 93, 61,112, 61, 37,112,191,
-120,197,255, 36,213,158, 0,255, 0, 0, 0, 0,189,103, 84,224,190, 93, 61,112, 61, 37,112,191,135, 59,255, 36,213,158, 0,255,
- 0, 0, 0, 0, 62, 11,248, 41,190,123, 24,209,188,236,102,176, 84,188,181, 20,196, 24, 0,255, 0, 0, 0, 0,188,253,170, 27,
-190,123, 24,209,188,236,102,176,171, 68,181, 20,196, 24, 0,255, 0, 0, 0, 0, 62, 64, 56, 19,190,196,117,110, 60,241, 79, 92,
- 79,131,254, 86,155,183, 2,255, 0, 0, 0, 0,189,167,234, 89,190,196,117,110, 60,241, 79, 92,176,125,254, 86,155,183, 2,255,
- 0, 0, 0, 0, 62, 45,142,246,190,146, 19, 59, 61, 7,149, 95, 99, 5, 1, 8,174,231, 0,255, 0, 0, 0, 0,189,130,152, 32,
-190,146, 19, 59, 61, 7,149, 95,156,251, 1, 8,174,231, 0,255, 0, 0, 0, 0, 62, 82,225, 47,190,244,249,234, 61, 22,131, 15,
- 62, 65,185,227,168,224, 2,255, 0, 0, 0, 0,189,205, 60,146,190,244,249,234, 61, 22,131, 15,193,191,185,227,168,224, 2,255,
- 0, 0, 0, 0, 61,242,158, 25,190,207,167,178, 60,181,152,155, 16,133,232,208,131, 55, 0,255, 0, 0, 0, 0,188, 80,194,110,
-190,207,167,178, 60,181,152,155,239,123,232,208,131, 55, 0,255, 0, 0, 0, 0, 61,227,176,105,190,155,103,201, 60,151,189, 58,
- 48, 7,224,163,141,149, 0,255, 0, 0, 0, 0,187,178,169,214,190,155,103,201, 60,151,189, 58,207,249,224,163,141,149, 0,255,
- 0, 0, 0, 0, 62, 4,129, 81,190,252,112,195, 61, 97, 39,129, 12, 68,158,218,173,147, 0,255, 0, 0, 0, 0,188,193,243, 89,
-190,252,112,195, 61, 97, 39,129,243,188,158,218,173,147, 0,255, 0, 0, 0, 0, 62, 30,161, 70,190, 59,166,163, 61, 82, 57,208,
-124,195,227,106,255,203, 0,255, 0, 0, 0, 0,189, 73,121,127,190, 59,166,163, 61, 82, 57,208,131, 61,227,106,255,203, 0,255,
- 0, 0, 0, 0, 62, 26,229,218,190, 33,134,174, 61,142,111, 33,120, 29,231,105, 36,193, 0,255, 0, 0, 0, 0,189, 58,139,207,
-190, 33,134,174, 61,142,111, 33,135,227,231,105, 36,193, 0,255, 0, 0, 0, 0, 62, 23, 42,109,190, 7,102,186, 61,172, 74,130,
-101,160,182,164, 25,240, 0,255, 0, 0, 0, 0,189, 43,158, 31,190, 7,102,186, 61,172, 74,130,154, 96,182,164, 25,240, 0,255,
- 0, 0, 0, 0, 62, 26,229,218,190,111,230,140,189,148,171,206, 84,120,159,221,253,198, 0,255, 0, 0, 0, 0,189, 58,139,207,
-190,111,230,140,189,148,171,206,171,136,159,221,253,198, 0,255, 0, 0, 0, 0, 62, 67,243,127,190, 74,148, 83,190,139,205, 16,
- 67,255,151, 42,228, 73, 2,255, 0, 0, 0, 0,189,175, 97, 49,190, 74,148, 83,190,139,205, 16,188, 1,151, 42,228, 73, 2,255,
- 0, 0, 0, 0, 62, 90, 88, 7,189,248,104,235,190,205, 28,244, 63,201,176, 25,179, 0, 3,255, 0, 0, 0, 0,189,220, 42, 66,
-189,248,104,235,190,205, 28,244,192, 55,176, 25,179, 0, 3,255, 0, 0, 0, 0, 62,135, 75,248, 62,180,124, 55,190,167,202,187,
- 56, 34, 95,160,192, 17, 2,255, 0, 0, 0, 0,190, 34, 85, 10, 62,180,124, 55,190,167,202,187,199,222, 95,160,192, 17, 2,255,
- 0, 0, 0, 0, 62,135, 75,248, 62,195,105,232,190, 58, 76,146, 55, 54,115,120, 0,239, 2,255, 0, 0, 0, 0,190, 34, 85, 10,
- 62,195,105,232,190, 58, 76,146,200,202,115,120, 0,239, 2,255, 0, 0, 0, 0, 62,135, 75,248, 62,176,192,203,189, 34,252,105,
- 63,239, 92,164, 60,238, 2,255, 0, 0, 0, 0,190, 34, 85, 10, 62,176,192,203,189, 34,252,105,192, 17, 92,164, 60,238, 2,255,
- 0, 0, 0, 0, 62,137, 41,174, 62, 68,193,219, 61, 82, 57,208, 49,123,102,255, 57,170, 0,255, 0, 0, 0, 0,190, 38, 16,118,
- 62, 68,193,219, 61, 82, 57,208,206,133,102,255, 57,170, 0,255, 0, 0, 0, 0, 62,200,155,220, 62, 12,198,133, 59,248,172, 95,
- 98,142, 73,198, 35, 6, 0,255, 0, 0, 0, 0,190,146,122,105, 62, 12,198,133, 59,248,172, 95,157,114, 73,198, 35, 6, 0,255,
- 0, 0, 0, 0, 62,178, 55, 83, 62, 35, 43, 14,188,146,212,141, 61,129,106,254, 33,241, 0,255, 0, 0, 0, 0,190,120, 43,193,
- 62, 35, 43, 14,188,146,212,141,194,127,106,254, 33,241, 0,255, 0, 0, 0, 0, 62,180, 21, 9, 62,141, 76, 72,189,253, 43,161,
- 76,234, 87,151, 52,221, 0,255, 0, 0, 0, 0,190,123,231, 45, 62,141, 76, 72,189,253, 43,161,179, 22, 87,151, 52,221, 0,255,
- 0, 0, 0, 0, 62,217,103, 66, 62, 87,106,247,189,185,254, 7,101,187, 66, 28, 40,199, 2,255, 0, 0, 0, 0,190,163, 69,207,
- 62, 87,106,247,189,185,254, 7,154, 69, 66, 28, 40,199, 2,255, 0, 0, 0, 0, 62,217,103, 66, 62,113,138,236,190, 80,177, 26,
-113,183, 58, 68,248,119, 2,255, 0, 0, 0, 0,190,163, 69,207, 62,113,138,236,190, 80,177, 26,142, 73, 58, 68,248,119, 2,255,
- 0, 0, 0, 0, 62,180, 21, 9, 62,152,126,141,190,118, 3, 83, 86,235, 93,238,253,205, 0,255, 0, 0, 0, 0,190,123,231, 45,
- 62,152,126,141,190,118, 3, 83,169, 21, 93,238,253,205, 0,255, 0, 0, 0, 0, 62,180, 21, 9, 62,135,179, 38,190,182,184,107,
- 85,232, 70,154,192,157, 2,255, 0, 0, 0, 0,190,123,231, 45, 62,135,179, 38,190,182,184,107,170, 24, 70,154,192,157, 2,255,
- 0, 0, 0, 0, 62,217,103, 66, 62, 76, 56,179,190,162, 49,153,110,166, 42,177,207,222, 2,255, 0, 0, 0, 0,190,163, 69,207,
- 62, 76, 56,179,190,162, 49,153,145, 90, 42,177,207,222, 2,255, 0, 0, 0, 0, 62,174,123,231, 61,206,232,154,190,216, 79, 56,
- 75, 58, 1, 57,152,116, 3,255, 0, 0, 0, 0,190,112,180,232, 61,206,232,154,190,216, 79, 56,180,198, 1, 57,152,116, 3,255,
- 0, 0, 0, 0, 62,142,194,208,189, 40,100,171,190,206,250,170, 70, 73,187,147,173,200, 1,255, 0, 0, 0, 0,190, 49, 66,187,
-189, 40,100,171,190,206,250,170,185,183,187,147,173,200, 0,255, 0, 0, 0, 0, 62,223, 0,100, 61,206,232,154,190,121,190,191,
-114,194, 41, 80, 38,207, 0,255, 0, 0, 0, 0,190,168,222,241, 61,206,232,154,190,121,190,191,141, 62, 41, 80, 38,207, 0,255,
- 0, 0, 0, 0, 62,120, 51,104,190, 7,102,186,189,163,153,127, 74,232,154,153, 22, 28, 0,255, 0, 0, 0, 0,190, 11,240,130,
-190, 7,102,186,189,163,153,127,181, 24,154,153, 22, 28, 0,255, 0, 0, 0, 0, 62,129,178,214,190, 18,152,254,190,125,122, 44,
- 71, 89,151,115,237, 1, 0,255, 0, 0, 0, 0,190, 23, 34,198,190, 18,152,254,190,125,122, 44,184,167,151,115,237, 1, 0,255,
- 0, 0, 0, 0, 62,239,203,202, 62, 12,198,133,190,132, 86, 56,220, 72, 93,207, 79,106, 2,255, 0, 0, 0, 0,190,185,170, 88,
- 62, 12,198,133,190,132, 86, 56, 35,184, 93,207, 79,106, 2,255, 0, 0, 0, 0, 62,211,206, 32,189,240,242, 18,190, 84,108,135,
- 15, 30,150, 34, 70, 84, 2,255, 0, 0, 0, 0,190,157,172,173,189,240,242, 18,190, 84,108,135,240,226,150, 34, 70, 84, 2,255,
- 0, 0, 0, 0, 63, 9,160, 38,189,203,159,217,190,154,186,192, 67,164,166,138, 61,172, 0,255, 0, 0, 0, 0,190,221, 30,219,
-189,203,159,217,190,154,186,192,188, 92,166,138, 61,172, 0,255, 0, 0, 0, 0, 63, 38,140,172,188,217, 91,211,190,178,252,255,
- 83,179,206,223, 83,114, 0,255, 0, 0, 0, 0,191, 11,123,244,188,217, 91,211,190,178,252,255,172, 77,206,223, 83,114, 0,255,
- 0, 0, 0, 0, 63, 46,242, 95, 61,199,113,194,190,177, 31, 73, 92, 54, 12,232, 87,210, 2,255, 0, 0, 0, 0,191, 19,225,167,
- 61,199,113,194,190,177, 31, 73,163,202, 12,232, 87,210, 2,255, 0, 0, 0, 0, 63, 32,243,138, 62, 61, 75, 3,190,177, 31, 73,
- 62,247, 83,221, 73, 97, 0,255, 0, 0, 0, 0,191, 5,226,209, 62, 61, 75, 3,190,177, 31, 73,193, 9, 83,221, 73, 97, 0,255,
- 0, 0, 0, 0, 63, 7,194,112, 62, 46, 93, 82,190,150,255, 84, 5,181,111, 80, 62,236, 0,255, 0, 0, 0, 0,190,217, 99,111,
- 62, 46, 93, 82,190,150,255, 84,250, 75,111, 80, 62,236, 0,255, 0, 0, 0, 0, 63, 6,211,149, 62, 16,129,241,190,145,102, 50,
- 69,236,239,117,105,236, 0,255, 0, 0, 0, 0,190,215,133,185, 62, 16,129,241,190,145,102, 50,186, 20,239,117,105,236, 0,255,
- 0, 0, 0, 0, 63, 27, 90,104, 62, 27,180, 54,190,169,168,113, 24, 34,231,205,123, 89, 0,255, 0, 0, 0, 0,191, 0, 73,175,
- 62, 27,180, 54,190,169,168,113,231,222,231,205,123, 89, 0,255, 0, 0, 0, 0, 63, 36,174,246, 61,169,150, 97,190,173, 99,221,
-223, 69,252, 16,123,173, 0,255, 0, 0, 0, 0,191, 9,158, 62, 61,169,150, 97,190,173, 99,221, 32,187,252, 16,123,173, 0,255,
- 0, 0, 0, 0, 63, 30, 38,249,188,127,147, 98,190,173, 99,221,239,171, 39, 0,120,207, 0,255, 0, 0, 0, 0,191, 3, 22, 64,
-188,127,147, 98,190,173, 99,221, 16, 85, 39, 0,120,207, 0,255, 0, 0, 0, 0, 63, 8,177, 75,189,143,233, 23,190,149, 33,158,
- 51, 9, 45, 56,108, 82, 0,255, 0, 0, 0, 0,190,219, 65, 37,189,143,233, 23,190,149, 33,158,204,247, 45, 56,108, 82, 0,255,
- 0, 0, 0, 0, 62,224,222, 26,189,173,196,120,190, 88, 39,243, 38,147, 62,224,104,153, 2,255, 0, 0, 0, 0,190,170,188,167,
-189,173,196,120,190, 88, 39,243,217,109, 62,224,104,153, 2,255, 0, 0, 0, 0, 62,247, 66,162, 61,236,195,250,190,128,154,204,
- 62,218,243,152,110,206, 2,255, 0, 0, 0, 0,190,193, 33, 48, 61,236,195,250,190,128,154,204,193, 38,243,152,110,206, 2,255,
- 0, 0, 0, 0, 62,252,219,196, 61,184,132, 17,190,145,102, 50, 87, 10,182, 73, 58, 19, 0,255, 0, 0, 0, 0,190,198,186, 82,
- 61,184,132, 17,190,145,102, 50,168,246,182, 73, 58, 19, 0,255, 0, 0, 0, 0, 62,237,238, 21,189,128,251,103,190,125,122, 44,
- 15,232,121,106, 37, 64, 0,255, 0, 0, 0, 0,190,183,204,162,189,128,251,103,190,125,122, 44,240, 24,121,106, 37, 64, 0,255,
- 0, 0, 0, 0, 63, 9,160, 38,189, 85, 45,188,190,164, 15, 79,239,157,122, 89, 33,212, 0,255, 0, 0, 0, 0,190,221, 30,219,
-189, 85, 45,188,190,164, 15, 79, 16, 99,122, 89, 33,212, 0,255, 0, 0, 0, 0, 63, 27, 90,104,188, 8, 37,223,190,182,184,107,
-158, 8, 81,202, 9,185, 0,255, 0, 0, 0, 0,191, 0, 73,175,188, 8, 37,223,190,182,184,107, 97,248, 81,202, 9,185, 0,255,
- 0, 0, 0, 0, 63, 32,243,138, 61,132, 68, 40,190,182,184,107,131, 60,239,145, 23, 95, 0,255, 0, 0, 0, 0,191, 5,226,209,
- 61,132, 68, 40,190,182,184,107,124,196,239,145, 23, 95, 0,255, 0, 0, 0, 0, 63, 25,124,178, 61,236,195,250,190,180,218,181,
-228, 27,153, 22, 70,206, 0,255, 0, 0, 0, 0,190,252,215,242, 61,236,195,250,190,180,218,181, 27,229,153, 22, 70,206, 0,255,
- 0, 0, 0, 0, 63, 7,194,112, 61,221,214, 74,190,162, 49,153, 68, 65,168,253, 64,113, 0,255, 0, 0, 0, 0,190,217, 99,111,
- 61,221,214, 74,190,162, 49,153,187,191,168,253, 64,113, 0,255, 0, 0, 0, 0, 62,228,153,135, 61,169,150, 97,190,125,122, 44,
- 86,113,222,190, 88, 87, 0,255, 0, 0, 0, 0,190,174,120, 20, 61,169,150, 97,190,125,122, 44,169,143,222,190, 88, 87, 0,255,
- 0, 0, 0, 0, 62,226,187,209, 60,230,126,216,190,141,170,198, 95,196,182,107, 42,100, 0,255, 0, 0, 0, 0,190,172,154, 93,
- 60,230,126,216,190,141,170,198,160, 60,182,107, 42,100, 0,255, 0, 0, 0, 0, 62,208, 18,180,188, 8, 37,223,190,141,170,198,
-111, 42, 14, 21, 61,220, 0,255, 0, 0, 0, 0,190,153,241, 65,188, 8, 37,223,190,141,170,198,144,214, 14, 21, 61,220, 0,255,
- 0, 0, 0, 0, 62,223, 0,100,188, 67,220,161,190,141,170,198, 79, 3, 91, 4, 43, 19, 2,255, 0, 0, 0, 0,190,168,222,241,
-188, 67,220,161,190,141,170,198,176,253, 91, 4, 43, 19, 2,255, 0, 0, 0, 0, 62,228,153,135,189, 55, 82, 92,190,141,170,198,
-107,207,254,198, 68,250, 2,255, 0, 0, 0, 0,190,174,120, 20,189, 55, 82, 92,190,141,170,198,148, 49,254,198, 68,250, 2,255,
- 0, 0, 0, 0, 62,221, 34,174,189,115, 9, 29,190,141,170,198, 82, 7, 64,225, 73,200, 0,255, 0, 0, 0, 0,190,167, 1, 59,
-189,115, 9, 29,190,141,170,198,173,249, 64,225, 73,200, 0,255, 0, 0, 0, 0, 62,200,155,220,189, 85, 45,188,190, 58, 76,146,
-117, 38,207, 66,239, 47, 0,255, 0, 0, 0, 0,190,146,122,105,189, 85, 45,188,190, 58, 76,146,138,218,207, 66,239, 47, 0,255,
- 0, 0, 0, 0, 62,198,190, 38,189,128,251,103,190,106,209, 15, 97,150, 18,139, 80,184, 0,255, 0, 0, 0, 0,190,144,156,179,
-189,128,251,103,190,106,209, 15,158,106, 18,139, 80,184, 0,255, 0, 0, 0, 0, 62,198,190, 38,189, 10,137, 74,190,114, 71,231,
-116, 17,240, 66, 51,154, 0,255, 0, 0, 0, 0,190,144,156,179,189, 10,137, 74,190,114, 71,231,139,239,240, 66, 51,154, 0,255,
- 0, 0, 0, 0, 62,217,103, 66, 61, 46,246, 45,190,125,122, 44,113,112,204,245, 30, 39, 0,255, 0, 0, 0, 0,190,163, 69,207,
- 61, 46,246, 45,190,125,122, 44,142,144,204,245, 30, 39, 0,255, 0, 0, 0, 0, 62,239,203,202, 61,121,154,159,190,139,205, 16,
- 90,105,185, 61, 56,146, 0,255, 0, 0, 0, 0,190,185,170, 88, 61,121,154,159,190,139,205, 16,165,151,185, 61, 56,146, 0,255,
- 0, 0, 0, 0, 62,239,203,202, 61,106,172,239,190,152,221, 10, 82,191,204,102, 82,230, 0,255, 0, 0, 0, 0,190,185,170, 88,
- 61,106,172,239,190,152,221, 10,173, 65,204,102, 82,230, 0,255, 0, 0, 0, 0, 62,221, 34,174,189,115, 9, 29,190,152,221, 10,
- 29,246, 98, 64, 76, 94, 0,255, 0, 0, 0, 0,190,167, 1, 59,189,115, 9, 29,190,152,221, 10,226, 10, 98, 64, 76, 94, 0,255,
- 0, 0, 0, 0, 62,230,119, 61,189, 55, 82, 92,190,152,221, 10, 77,150, 17,111,100, 75, 0,255, 0, 0, 0, 0,190,176, 85,202,
-189, 55, 82, 92,190,152,221, 10,178,106, 17,111,100, 75, 0,255, 0, 0, 0, 0, 62,224,222, 26,188,127,147, 98,190,152,221, 10,
- 60,239, 60,190, 94,195, 0,255, 0, 0, 0, 0,190,170,188,167,188,127,147, 98,190,152,221, 10,195, 17, 60,190, 94,195, 0,255,
- 0, 0, 0, 0, 62,209,240,106,188, 8, 37,223,190,152,221, 10, 83,199, 23,178, 93,209, 0,255, 0, 0, 0, 0,190,155,206,247,
-188, 8, 37,223,190,152,221, 10,172, 57, 23,178, 93,209, 0,255, 0, 0, 0, 0, 62,228,153,135, 60,230,126,216,190,152,221, 10,
- 73, 98,200, 1, 88,170, 0,255, 0, 0, 0, 0,190,174,120, 20, 60,230,126,216,190,152,221, 10,182,158,200, 1, 88,170, 0,255,
- 0, 0, 0, 0, 63, 9,160, 38, 61,206,232,154,190,175, 65,147, 68, 23,223,166,103,112, 0,255, 0, 0, 0, 0,190,221, 30,219,
- 61,206,232,154,190,175, 65,147,187,233,223,166,103,112, 0,255, 0, 0, 0, 0, 63, 27, 90,104, 61,221,214, 74,190,192, 12,249,
- 18,165,216,156,120, 89, 0,255, 0, 0, 0, 0,191, 0, 73,175, 61,221,214, 74,190,192, 12,249,237, 91,216,156,120, 89, 0,255,
- 0, 0, 0, 0, 63, 35,192, 27, 61,121,154,159,190,193,234,175,185, 25,231, 29,103,157, 0,255, 0, 0, 0, 0,191, 8,175, 98,
- 61,121,154,159,190,193,234,175, 70,231,231, 29,103,157, 0,255, 0, 0, 0, 0, 63, 30, 38,249,188, 67,220,161,190,192, 12,249,
-209, 43, 64, 0,100,119, 0,255, 0, 0, 0, 0,191, 3, 22, 64,188, 67,220,161,190,192, 12,249, 46,213, 64, 0,100,119, 0,255,
- 0, 0, 0, 0, 63, 10,143, 1,189, 85, 45,188,190,177, 31, 73, 26, 52, 92,240, 84, 3, 0,255, 0, 0, 0, 0,190,222,252,145,
-189, 85, 45,188,190,177, 31, 73,229,204, 92,240, 84, 3, 0,255, 0, 0, 0, 0, 62,237,238, 21,189,115, 9, 29,190,139,205, 16,
- 8, 58,111,116, 62,101, 0,255, 0, 0, 0, 0,190,183,204,162,189,115, 9, 29,190,139,205, 16,247,198,111,116, 62,101, 0,255,
- 0, 0, 0, 0, 62,254,185,122, 61,169,150, 97,190,158,118, 45, 80,198,213,102, 89,175, 0,255, 0, 0, 0, 0,190,200,152, 8,
- 61,169,150, 97,190,158,118, 45,175, 58,213,102, 89,175, 0,255, 0, 0, 0, 0, 62,239,203,202,186,133,194,226,190,154,186,192,
- 25,136, 0,130,125,108, 0,255, 0, 0, 0, 0,190,185,170, 88,186,133,194,226,190,154,186,192,230,120, 0,130,125,108, 0,255,
- 0, 0, 0, 0, 62,250,254, 14,188,187,128,115,190,156,152,119, 27, 2, 30, 58,121,104, 0,255, 0, 0, 0, 0,190,196,220,156,
-188,187,128,115,190,156,152,119,228,254, 30, 58,121,104, 0,255, 0, 0, 0, 0, 63, 4,245,223, 59,205,106, 77,190,164, 15, 79,
- 55,218,253,126,115, 35, 0,255, 0, 0, 0, 0,190,211,202, 76, 59,205,106, 77,190,164, 15, 79,200, 38,253,126,115, 35, 0,255,
- 0, 0, 0, 0, 63, 0, 75,152, 60,230,126,216,190,160, 83,227, 41,164,255,199,121, 8, 0,255, 0, 0, 0, 0,190,202,117,190,
- 60,230,126,216,190,160, 83,227,214, 92,255,199,121, 8, 0,255, 0, 0, 0, 0, 63, 6,211,149, 61,106,172,239,190,165,237, 5,
- 39,237, 9,191,121, 55, 0,255, 0, 0, 0, 0,190,215,133,185, 61,106,172,239,190,165,237, 5,216, 19, 9,191,121, 55, 0,255,
- 0, 0, 0, 0, 63, 11,125,220, 61, 17, 26,205,190,167,202,187, 46,208,244, 41,118,137, 0,255, 0, 0, 0, 0,190,224,218, 71,
- 61, 17, 26,205,190,167,202,187,209, 48,244, 41,118,137, 0,255, 0, 0, 0, 0, 63, 18, 5,218, 61, 61,227,222,190,169,168,113,
- 53, 70, 3, 84,116, 85, 2,255, 0, 0, 0, 0,190,237,234, 65, 61, 61,227,222,190,169,168,113,202,186, 3, 84,116, 85, 2,255,
- 0, 0, 0, 0, 63, 15, 57, 73, 61,154,168,176,190,169,168,113, 44, 99, 38, 36,113,212, 2,255, 0, 0, 0, 0,190,232, 81, 31,
- 61,154,168,176,190,169,168,113,211,157, 38, 36,113,212, 2,255, 0, 0, 0, 0, 63, 7,194,112, 62, 27,180, 54,190,192, 12,249,
-198,249, 72, 3,166,222, 3,255, 0, 0, 0, 0,190,217, 99,111, 62, 27,180, 54,190,192, 12,249, 57, 7, 72, 3,166,222, 3,255,
- 0, 0, 0, 0, 63, 34,209, 64, 62, 42,161,230,190,206,250,170, 37,198, 68,123,154,174, 3,255, 0, 0, 0, 0,191, 7,192,135,
- 62, 42,161,230,190,206,250,170,218, 58, 68,123,154,174, 3,255, 0, 0, 0, 0, 63, 48,208, 21, 61,177, 13, 57,190,195,200,102,
-121, 3, 17,201,218, 73, 3,255, 0, 0, 0, 0,191, 21,191, 93, 61,177, 13, 57,190,195,200,102,134,253, 17,201,218, 73, 3,255,
- 0, 0, 0, 0, 63, 42, 72, 24,188,217, 91,211,190,203, 63, 62, 82, 59,200, 75,175, 70, 3,255, 0, 0, 0, 0,191, 15, 55, 96,
-188,217, 91,211,190,203, 63, 62,173,197,200, 75,175, 70, 3,255, 0, 0, 0, 0, 63, 9,160, 38,189,188,178, 40,190,193,234,175,
-249,134,165,184,165,129, 3,255, 0, 0, 0, 0,190,221, 30,219,189,188,178, 40,190,193,234,175, 6,122,165,184,165,129, 3,255,
- 0, 0, 0, 0, 62,215,137,140,189,226, 4, 97,190,154,186,192,249,126,163,122,167,205, 1,255, 0, 0, 0, 0,190,161,104, 25,
-189,226, 4, 97,190,154,186,192, 6,130,163,122,167,205, 1,255, 0, 0, 0, 0, 62,232, 84,243, 62, 1,148, 65,190,167,202,187,
-193, 93, 65,224,165,229, 1,255, 0, 0, 0, 0,190,178, 51,128, 62, 1,148, 65,190,167,202,187, 62,163, 65,224,165,229, 1,255,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,110,208, 0, 0, 1, 42, 0, 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, 3,161,166, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 47, 28, 3,161,166, 32, 0, 0, 0, 55, 0, 0, 3,237,
- 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 43,
- 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 41, 0, 0, 0, 43,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 9,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 8,
- 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 34,
- 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 14,
- 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 6,
- 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 19, 0, 0, 0, 34,
- 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 20,
- 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 25,
- 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 31,
- 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 30,
- 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 30, 0, 0, 0, 34,
- 0, 0, 0, 23, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 35,
- 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 30,
- 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 39, 0, 0, 0, 41, 0, 0, 0, 34,
- 0, 0, 0, 38, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 45,
- 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 47,
- 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 45, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 34,
- 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 51,
- 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 50,
- 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 34,
- 0, 0, 0, 24, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 55,
- 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 57, 0, 0, 0, 34,
- 0, 0, 0, 13, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 58,
- 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 63, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 47,
- 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 60, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 56,
- 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 34,
- 0, 0, 0, 51, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,171, 0, 0, 0, 34, 0, 0, 0,171,
- 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 89, 0, 0, 0, 34,
- 0, 0, 0,172, 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89,
- 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,169, 0, 0, 0, 34, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0, 34, 0, 0, 0, 85,
- 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0,170, 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,170, 0, 0, 0, 34,
- 0, 0, 0, 86, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,167, 0, 0, 0, 34, 0, 0, 0,167, 0, 0, 0,169,
- 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0,168, 0, 0, 0,170, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0,168, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0,165, 0, 0, 0, 34,
- 0, 0, 0,165, 0, 0, 0,167, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0,166, 0, 0, 0,168,
- 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0,166, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 79,
- 0, 0, 0,163, 0, 0, 0, 34, 0, 0, 0,163, 0, 0, 0,165, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 81, 0, 0, 0, 34,
- 0, 0, 0,164, 0, 0, 0,166, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0,164, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 82,
- 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0, 34, 0, 0, 0,143,
- 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0, 34,
- 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,162, 0, 0, 0, 34, 0, 0, 0,144, 0, 0, 0,162,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0,145, 0, 0, 0, 34, 0, 0, 0,143,
- 0, 0, 0,145, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0,146, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0,144, 0, 0, 0,146, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0,147,
- 0, 0, 0, 34, 0, 0, 0,145, 0, 0, 0,147, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0,148, 0, 0, 0, 34, 0, 0, 0, 93,
- 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0,146, 0, 0, 0,148, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 96, 0, 0, 0, 34,
- 0, 0, 0, 96, 0, 0, 0,149, 0, 0, 0, 34, 0, 0, 0,147, 0, 0, 0,149, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,150,
- 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0,148, 0, 0, 0,150, 0, 0, 0, 34, 0, 0, 0, 96,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,151, 0, 0, 0, 34, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0, 34,
- 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0,150, 0, 0, 0,152,
- 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,153, 0, 0, 0, 34, 0, 0, 0,151,
- 0, 0, 0,153, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,154, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0,152, 0, 0, 0,154, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,155,
- 0, 0, 0, 34, 0, 0, 0,153, 0, 0, 0,155, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,156, 0, 0, 0, 34, 0, 0, 0,101,
- 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,154, 0, 0, 0,156, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,104, 0, 0, 0, 34,
- 0, 0, 0,104, 0, 0, 0,157, 0, 0, 0, 34, 0, 0, 0,155, 0, 0, 0,157, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,158,
- 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,156, 0, 0, 0,158, 0, 0, 0, 34, 0, 0, 0,104,
- 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0,157, 0, 0, 0,159, 0, 0, 0, 34,
- 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,158, 0, 0, 0,160,
- 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,160, 0, 0, 0, 34,
- 0, 0, 0,108, 0, 0, 0,125, 0, 0, 0, 34, 0, 0, 0,125, 0, 0, 0,157, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,159,
- 0, 0, 0, 34, 0, 0, 0,126, 0, 0, 0,158, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,126, 0, 0, 0, 34, 0, 0, 0,109,
- 0, 0, 0,160, 0, 0, 0, 34, 0, 0, 0,125, 0, 0, 0,176, 0, 0, 0, 34, 0, 0, 0,155, 0, 0, 0,176, 0, 0, 0, 34,
- 0, 0, 0,156, 0, 0, 0,177, 0, 0, 0, 34, 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0, 34, 0, 0, 0,123, 0, 0, 0,153,
- 0, 0, 0, 34, 0, 0, 0,123, 0, 0, 0,176, 0, 0, 0, 34, 0, 0, 0,124, 0, 0, 0,154, 0, 0, 0, 34, 0, 0, 0,124,
- 0, 0, 0,177, 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,151, 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,123, 0, 0, 0, 34,
- 0, 0, 0,122, 0, 0, 0,152, 0, 0, 0, 34, 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0, 34, 0, 0, 0,119, 0, 0, 0,149,
- 0, 0, 0, 34, 0, 0, 0,119, 0, 0, 0,121, 0, 0, 0, 34, 0, 0, 0,120, 0, 0, 0,150, 0, 0, 0, 34, 0, 0, 0,120,
- 0, 0, 0,122, 0, 0, 0, 34, 0, 0, 0,117, 0, 0, 0,147, 0, 0, 0, 34, 0, 0, 0,117, 0, 0, 0,119, 0, 0, 0, 34,
- 0, 0, 0,118, 0, 0, 0,148, 0, 0, 0, 34, 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 34, 0, 0, 0,115, 0, 0, 0,145,
- 0, 0, 0, 34, 0, 0, 0,115, 0, 0, 0,117, 0, 0, 0, 34, 0, 0, 0,116, 0, 0, 0,146, 0, 0, 0, 34, 0, 0, 0,116,
- 0, 0, 0,118, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,143, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34,
- 0, 0, 0,114, 0, 0, 0,144, 0, 0, 0, 34, 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,162,
- 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0, 34, 0, 0, 0,161,
- 0, 0, 0,174, 0, 0, 0, 34, 0, 0, 0,174, 0, 0, 0,179, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0, 34,
- 0, 0, 0,162, 0, 0, 0,174, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0,175, 0, 0, 0, 34, 0, 0, 0,175, 0, 0, 0,180, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,180, 0, 0, 0, 34,
- 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0, 34, 0, 0, 0,175, 0, 0, 0,181, 0, 0, 0, 34, 0, 0, 0,178, 0, 0, 0,180,
- 0, 0, 0, 34, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 32, 0, 0, 0,179, 0, 0, 0,181, 0, 0, 0, 34, 0, 0, 0,132,
- 0, 0, 0,134, 0, 0, 0, 34, 0, 0, 0,134, 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0, 34,
- 0, 0, 0,133, 0, 0, 0,134, 0, 0, 0, 34, 0, 0, 0,133, 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0,130, 0, 0, 0,132,
- 0, 0, 0, 34, 0, 0, 0,130, 0, 0, 0,169, 0, 0, 0, 34, 0, 0, 0,131, 0, 0, 0,133, 0, 0, 0, 34, 0, 0, 0,131,
- 0, 0, 0,170, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,130, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,167, 0, 0, 0, 34,
- 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0, 34, 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0, 34, 0, 0, 0,163, 0, 0, 0,184,
- 0, 0, 0, 34, 0, 0, 0,182, 0, 0, 0,184, 0, 0, 0, 34, 0, 0, 0,165, 0, 0, 0,182, 0, 0, 0, 34, 0, 0, 0,183,
- 0, 0, 0,185, 0, 0, 0, 34, 0, 0, 0,164, 0, 0, 0,185, 0, 0, 0, 34, 0, 0, 0,166, 0, 0, 0,183, 0, 0, 0, 34,
- 0, 0, 0,128, 0, 0, 0,182, 0, 0, 0, 34, 0, 0, 0,129, 0, 0, 0,183, 0, 0, 0, 34, 0, 0, 0,141, 0, 0, 0,187,
- 0, 0, 0, 34, 0, 0, 0,186, 0, 0, 0,187, 0, 0, 0, 32, 0, 0, 0,184, 0, 0, 0,186, 0, 0, 0, 34, 0, 0, 0,141,
- 0, 0, 0,184, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,187, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,185, 0, 0, 0, 34,
- 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,186, 0, 0, 0, 32, 0, 0, 0, 67, 0, 0, 0,182,
- 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,183, 0, 0, 0, 34, 0, 0, 0,127, 0, 0, 0,128, 0, 0, 0, 34, 0, 0, 0, 67,
- 0, 0, 0,127, 0, 0, 0, 32, 0, 0, 0,127, 0, 0, 0,129, 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,190, 0, 0, 0, 34,
- 0, 0, 0,188, 0, 0, 0,190, 0, 0, 0, 34, 0, 0, 0,141, 0, 0, 0,188, 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,141,
- 0, 0, 0, 34, 0, 0, 0,189, 0, 0, 0,191, 0, 0, 0, 34, 0, 0, 0,140, 0, 0, 0,191, 0, 0, 0, 34, 0, 0, 0,140,
- 0, 0, 0,142, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,189, 0, 0, 0, 34, 0, 0, 0,137, 0, 0, 0,192, 0, 0, 0, 34,
- 0, 0, 0,190, 0, 0, 0,192, 0, 0, 0, 34, 0, 0, 0,137, 0, 0, 0,139, 0, 0, 0, 34, 0, 0, 0,191, 0, 0, 0,193,
- 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,193, 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0, 34, 0, 0, 0,136,
- 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,192, 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,137, 0, 0, 0, 34,
- 0, 0, 0,193, 0, 0, 0,195, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,195, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,138,
- 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,135, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,135,
- 0, 0, 0,136, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,195, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,188, 0, 0, 0, 34,
- 0, 0, 0, 68, 0, 0, 0,187, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,189, 0, 0, 0, 34, 0, 0, 0,188, 0, 0, 0,203,
- 0, 0, 0, 34, 0, 0, 0,203, 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0,189,
- 0, 0, 0,204, 0, 0, 0, 34, 0, 0, 0,204, 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,196, 0, 0, 0, 34,
- 0, 0, 0,196, 0, 0, 0,197, 0, 0, 0, 34, 0, 0, 0,194, 0, 0, 0,197, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,198,
- 0, 0, 0, 34, 0, 0, 0,195, 0, 0, 0,198, 0, 0, 0, 34, 0, 0, 0,197, 0, 0, 0,199, 0, 0, 0, 34, 0, 0, 0,192,
- 0, 0, 0,199, 0, 0, 0, 34, 0, 0, 0,198, 0, 0, 0,200, 0, 0, 0, 34, 0, 0, 0,193, 0, 0, 0,200, 0, 0, 0, 34,
- 0, 0, 0,199, 0, 0, 0,201, 0, 0, 0, 34, 0, 0, 0,190, 0, 0, 0,201, 0, 0, 0, 34, 0, 0, 0,200, 0, 0, 0,202,
- 0, 0, 0, 34, 0, 0, 0,191, 0, 0, 0,202, 0, 0, 0, 34, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0, 34, 0, 0, 0,202,
- 0, 0, 0,204, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,201, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,202, 0, 0, 0, 34,
- 0, 0, 0,196, 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0,137, 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,174,
- 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,162, 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0, 34, 0, 0, 0,161,
- 0, 0, 0,208, 0, 0, 0, 34, 0, 0, 0,140, 0, 0, 0,209, 0, 0, 0, 34, 0, 0, 0,162, 0, 0, 0,209, 0, 0, 0, 34,
- 0, 0, 0,141, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,208, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,211,
- 0, 0, 0, 34, 0, 0, 0,209, 0, 0, 0,211, 0, 0, 0, 34, 0, 0, 0,163, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,164,
- 0, 0, 0,211, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,206, 0, 0, 0, 34, 0, 0, 0,206, 0, 0, 0,210, 0, 0, 0, 34,
- 0, 0, 0,207, 0, 0, 0,211, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0,207, 0, 0, 0, 34, 0, 0, 0,206, 0, 0, 0,212,
- 0, 0, 0, 34, 0, 0, 0,208, 0, 0, 0,212, 0, 0, 0, 34, 0, 0, 0,209, 0, 0, 0,213, 0, 0, 0, 34, 0, 0, 0,207,
- 0, 0, 0,213, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0,212, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 34,
- 0, 0, 0, 70, 0, 0, 0,127, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,219,
- 0, 0, 0, 34, 0, 0, 0,129, 0, 0, 0,220, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,220, 0, 0, 0, 34, 0, 0, 0,217,
- 0, 0, 0,219, 0, 0, 0, 34, 0, 0, 0,130, 0, 0, 0,217, 0, 0, 0, 34, 0, 0, 0,131, 0, 0, 0,218, 0, 0, 0, 34,
- 0, 0, 0,218, 0, 0, 0,220, 0, 0, 0, 34, 0, 0, 0,215, 0, 0, 0,217, 0, 0, 0, 34, 0, 0, 0,132, 0, 0, 0,215,
- 0, 0, 0, 34, 0, 0, 0,133, 0, 0, 0,216, 0, 0, 0, 34, 0, 0, 0,216, 0, 0, 0,218, 0, 0, 0, 34, 0, 0, 0,214,
- 0, 0, 0,215, 0, 0, 0, 34, 0, 0, 0,134, 0, 0, 0,214, 0, 0, 0, 34, 0, 0, 0,214, 0, 0, 0,216, 0, 0, 0, 34,
- 0, 0, 0,215, 0, 0, 0,226, 0, 0, 0, 34, 0, 0, 0,226, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,214, 0, 0, 0,228,
- 0, 0, 0, 34, 0, 0, 0,216, 0, 0, 0,227, 0, 0, 0, 34, 0, 0, 0,227, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,217,
- 0, 0, 0,224, 0, 0, 0, 34, 0, 0, 0,224, 0, 0, 0,226, 0, 0, 0, 34, 0, 0, 0,218, 0, 0, 0,225, 0, 0, 0, 34,
- 0, 0, 0,225, 0, 0, 0,227, 0, 0, 0, 34, 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0, 34, 0, 0, 0,222, 0, 0, 0,224,
- 0, 0, 0, 34, 0, 0, 0,220, 0, 0, 0,223, 0, 0, 0, 34, 0, 0, 0,223, 0, 0, 0,225, 0, 0, 0, 34, 0, 0, 0, 70,
- 0, 0, 0,221, 0, 0, 0, 34, 0, 0, 0,221, 0, 0, 0,222, 0, 0, 0, 34, 0, 0, 0,221, 0, 0, 0,223, 0, 0, 0, 34,
- 0, 0, 0,221, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,222, 0, 0, 0,226, 0, 0, 0, 34, 0, 0, 0,223, 0, 0, 0,227,
- 0, 0, 0, 34, 0, 0, 0,178, 0, 0, 0,231, 0, 0, 0, 34, 0, 0, 0,229, 0, 0, 0,231, 0, 0, 0, 34, 0, 0, 0,180,
- 0, 0, 0,229, 0, 0, 0, 34, 0, 0, 0,179, 0, 0, 0,232, 0, 0, 0, 34, 0, 0, 0,181, 0, 0, 0,230, 0, 0, 0, 34,
- 0, 0, 0,230, 0, 0, 0,232, 0, 0, 0, 34, 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,251,
- 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,252, 0, 0, 0, 34, 0, 0, 0,230, 0, 0, 0,252, 0, 0, 0, 34, 0, 0, 0,251,
- 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,254, 0, 0, 0, 34,
- 0, 0, 0,252, 0, 0, 0,254, 0, 0, 0, 34, 0, 0, 0,231, 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,250,
- 0, 0, 0, 34, 0, 0, 0,232, 0, 0, 0,250, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0, 34, 0, 0, 0,247,
- 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0,114, 0, 0, 0,248, 0, 0, 0, 34, 0, 0, 0,248, 0, 0, 0,250, 0, 0, 0, 34,
- 0, 0, 0,115, 0, 0, 0,245, 0, 0, 0, 34, 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 34, 0, 0, 0,116, 0, 0, 0,246,
- 0, 0, 0, 34, 0, 0, 0,246, 0, 0, 0,248, 0, 0, 0, 34, 0, 0, 0,117, 0, 0, 0,243, 0, 0, 0, 34, 0, 0, 0,243,
- 0, 0, 0,245, 0, 0, 0, 34, 0, 0, 0,118, 0, 0, 0,244, 0, 0, 0, 34, 0, 0, 0,244, 0, 0, 0,246, 0, 0, 0, 34,
- 0, 0, 0,119, 0, 0, 0,241, 0, 0, 0, 34, 0, 0, 0,241, 0, 0, 0,243, 0, 0, 0, 34, 0, 0, 0,120, 0, 0, 0,242,
- 0, 0, 0, 34, 0, 0, 0,242, 0, 0, 0,244, 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0, 34, 0, 0, 0,239,
- 0, 0, 0,241, 0, 0, 0, 34, 0, 0, 0,122, 0, 0, 0,240, 0, 0, 0, 34, 0, 0, 0,240, 0, 0, 0,242, 0, 0, 0, 34,
- 0, 0, 0,123, 0, 0, 0,237, 0, 0, 0, 34, 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 34, 0, 0, 0,124, 0, 0, 0,238,
- 0, 0, 0, 34, 0, 0, 0,238, 0, 0, 0,240, 0, 0, 0, 34, 0, 0, 0,176, 0, 0, 0,233, 0, 0, 0, 34, 0, 0, 0,233,
- 0, 0, 0,237, 0, 0, 0, 34, 0, 0, 0,177, 0, 0, 0,234, 0, 0, 0, 34, 0, 0, 0,234, 0, 0, 0,238, 0, 0, 0, 34,
- 0, 0, 0,125, 0, 0, 0,235, 0, 0, 0, 34, 0, 0, 0,233, 0, 0, 0,235, 0, 0, 0, 34, 0, 0, 0,126, 0, 0, 0,236,
- 0, 0, 0, 34, 0, 0, 0,234, 0, 0, 0,236, 0, 0, 0, 34, 0, 0, 0,235, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,236,
- 0, 0, 0,254, 0, 0, 0, 34, 0, 0, 0,253, 0, 0, 0,255, 0, 0, 0, 34, 0, 0, 0,255, 0, 0, 1, 17, 0, 0, 0, 34,
- 0, 0, 0,235, 0, 0, 1, 17, 0, 0, 0, 34, 0, 0, 0,254, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0,236, 0, 0, 1, 18,
- 0, 0, 0, 34, 0, 0, 1, 0, 0, 0, 1, 18, 0, 0, 0, 34, 0, 0, 1, 17, 0, 0, 1, 19, 0, 0, 0, 34, 0, 0, 0,233,
- 0, 0, 1, 19, 0, 0, 0, 34, 0, 0, 0,234, 0, 0, 1, 20, 0, 0, 0, 34, 0, 0, 1, 18, 0, 0, 1, 20, 0, 0, 0, 34,
- 0, 0, 1, 15, 0, 0, 1, 19, 0, 0, 0, 34, 0, 0, 0,237, 0, 0, 1, 15, 0, 0, 0, 34, 0, 0, 0,238, 0, 0, 1, 16,
- 0, 0, 0, 34, 0, 0, 1, 16, 0, 0, 1, 20, 0, 0, 0, 34, 0, 0, 1, 13, 0, 0, 1, 15, 0, 0, 0, 34, 0, 0, 0,239,
- 0, 0, 1, 13, 0, 0, 0, 34, 0, 0, 0,240, 0, 0, 1, 14, 0, 0, 0, 34, 0, 0, 1, 14, 0, 0, 1, 16, 0, 0, 0, 34,
- 0, 0, 1, 11, 0, 0, 1, 13, 0, 0, 0, 34, 0, 0, 0,241, 0, 0, 1, 11, 0, 0, 0, 34, 0, 0, 0,242, 0, 0, 1, 12,
- 0, 0, 0, 34, 0, 0, 1, 12, 0, 0, 1, 14, 0, 0, 0, 34, 0, 0, 1, 9, 0, 0, 1, 11, 0, 0, 0, 34, 0, 0, 0,243,
- 0, 0, 1, 9, 0, 0, 0, 34, 0, 0, 0,244, 0, 0, 1, 10, 0, 0, 0, 34, 0, 0, 1, 10, 0, 0, 1, 12, 0, 0, 0, 34,
- 0, 0, 1, 7, 0, 0, 1, 9, 0, 0, 0, 34, 0, 0, 0,245, 0, 0, 1, 7, 0, 0, 0, 34, 0, 0, 0,246, 0, 0, 1, 8,
- 0, 0, 0, 34, 0, 0, 1, 8, 0, 0, 1, 10, 0, 0, 0, 34, 0, 0, 1, 5, 0, 0, 1, 7, 0, 0, 0, 34, 0, 0, 0,247,
- 0, 0, 1, 5, 0, 0, 0, 34, 0, 0, 0,248, 0, 0, 1, 6, 0, 0, 0, 34, 0, 0, 1, 6, 0, 0, 1, 8, 0, 0, 0, 34,
- 0, 0, 1, 3, 0, 0, 1, 5, 0, 0, 0, 34, 0, 0, 0,249, 0, 0, 1, 3, 0, 0, 0, 34, 0, 0, 0,250, 0, 0, 1, 4,
- 0, 0, 0, 34, 0, 0, 1, 4, 0, 0, 1, 6, 0, 0, 0, 34, 0, 0, 1, 3, 0, 0, 1, 21, 0, 0, 0, 34, 0, 0, 0,231,
- 0, 0, 1, 21, 0, 0, 0, 34, 0, 0, 0,232, 0, 0, 1, 22, 0, 0, 0, 34, 0, 0, 1, 4, 0, 0, 1, 22, 0, 0, 0, 34,
- 0, 0, 0,251, 0, 0, 1, 1, 0, 0, 0, 34, 0, 0, 0,255, 0, 0, 1, 1, 0, 0, 0, 34, 0, 0, 0,252, 0, 0, 1, 2,
- 0, 0, 0, 34, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 0, 34, 0, 0, 0,229, 0, 0, 1, 23, 0, 0, 0, 34, 0, 0, 1, 1,
- 0, 0, 1, 23, 0, 0, 0, 34, 0, 0, 0,230, 0, 0, 1, 24, 0, 0, 0, 34, 0, 0, 1, 2, 0, 0, 1, 24, 0, 0, 0, 34,
- 0, 0, 1, 21, 0, 0, 1, 23, 0, 0, 0, 34, 0, 0, 1, 22, 0, 0, 1, 24, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 1, 25,
- 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 1, 25, 0, 0, 0, 38, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0,107,
- 0, 0, 1, 26, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 1, 26, 0, 0, 0, 38, 0, 0, 0,104, 0, 0, 1, 27, 0, 0, 0, 34,
- 0, 0, 1, 25, 0, 0, 1, 27, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 1, 28, 0, 0, 0, 34, 0, 0, 1, 26, 0, 0, 1, 28,
- 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 1, 29, 0, 0, 0, 34, 0, 0, 1, 27, 0, 0, 1, 29, 0, 0, 0, 34, 0, 0, 0,103,
- 0, 0, 1, 30, 0, 0, 0, 34, 0, 0, 1, 28, 0, 0, 1, 30, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 1, 31, 0, 0, 0, 34,
- 0, 0, 1, 29, 0, 0, 1, 31, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 1, 32, 0, 0, 0, 34, 0, 0, 1, 30, 0, 0, 1, 32,
- 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 1, 33, 0, 0, 0, 34, 0, 0, 1, 31, 0, 0, 1, 33, 0, 0, 0, 38, 0, 0, 0, 99,
- 0, 0, 1, 34, 0, 0, 0, 34, 0, 0, 1, 32, 0, 0, 1, 34, 0, 0, 0, 38, 0, 0, 0, 96, 0, 0, 1, 35, 0, 0, 0, 34,
- 0, 0, 1, 33, 0, 0, 1, 35, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 1, 36, 0, 0, 0, 34, 0, 0, 1, 34, 0, 0, 1, 36,
- 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 1, 37, 0, 0, 0, 34, 0, 0, 1, 35, 0, 0, 1, 37, 0, 0, 0, 34, 0, 0, 0, 95,
- 0, 0, 1, 38, 0, 0, 0, 34, 0, 0, 1, 36, 0, 0, 1, 38, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 1, 39, 0, 0, 0, 34,
- 0, 0, 1, 37, 0, 0, 1, 39, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 1, 40, 0, 0, 0, 34, 0, 0, 1, 38, 0, 0, 1, 40,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 1, 41, 0, 0, 0, 34, 0, 0, 1, 39, 0, 0, 1, 41, 0, 0, 0, 34, 0, 0, 0, 91,
- 0, 0, 1, 42, 0, 0, 0, 34, 0, 0, 1, 40, 0, 0, 1, 42, 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 50, 0, 0, 0, 38,
- 0, 0, 1, 50, 0, 0, 1, 69, 0, 0, 0, 34, 0, 0, 1, 69, 0, 0, 1, 79, 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 79,
- 0, 0, 0, 34, 0, 0, 1, 50, 0, 0, 1, 70, 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 70,
- 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 48, 0, 0, 1, 49, 0, 0, 0, 38, 0, 0, 1, 77, 0, 0, 1, 79, 0, 0, 0, 34,
- 0, 0, 1, 48, 0, 0, 1, 77, 0, 0, 0, 34, 0, 0, 1, 48, 0, 0, 1, 78, 0, 0, 0, 34, 0, 0, 1, 78, 0, 0, 1, 80,
- 0, 0, 0, 34, 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 0, 38, 0, 0, 1, 77, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 1, 47,
- 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 1, 47, 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 1, 78, 0, 0, 1, 82, 0, 0, 0, 34,
- 0, 0, 0, 89, 0, 0, 1, 47, 0, 0, 0, 38, 0, 0, 0, 87, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 1, 82,
- 0, 0, 0, 34, 0, 0, 1, 75, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 1, 75, 0, 0, 0, 34, 0, 0, 0, 86,
- 0, 0, 1, 76, 0, 0, 0, 34, 0, 0, 1, 76, 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 75, 0, 0, 0, 34,
- 0, 0, 0, 83, 0, 0, 1, 71, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 1, 72, 0, 0, 0, 34, 0, 0, 1, 72, 0, 0, 1, 76,
- 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 73, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 1, 73, 0, 0, 0, 34, 0, 0, 0, 82,
- 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 72, 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 77, 0, 0, 0, 34,
- 0, 0, 1, 73, 0, 0, 1, 79, 0, 0, 0, 34, 0, 0, 1, 72, 0, 0, 1, 78, 0, 0, 0, 34, 0, 0, 1, 74, 0, 0, 1, 80,
- 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 73, 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 69, 0, 0, 0, 34, 0, 0, 1, 68,
- 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 68, 0, 0, 1, 70, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 1, 67, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 1, 68, 0, 0, 0, 34, 0, 0, 0,206, 0, 0, 1, 83, 0, 0, 0, 34, 0, 0, 1, 83, 0, 0, 1, 85,
- 0, 0, 0, 34, 0, 0, 0,212, 0, 0, 1, 85, 0, 0, 0, 34, 0, 0, 1, 84, 0, 0, 1, 86, 0, 0, 0, 34, 0, 0, 0,207,
- 0, 0, 1, 84, 0, 0, 0, 34, 0, 0, 0,213, 0, 0, 1, 86, 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 83, 0, 0, 0, 34,
- 0, 0, 1, 68, 0, 0, 1, 84, 0, 0, 0, 34, 0, 0, 1, 85, 0, 0, 1, 87, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 1, 87,
- 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 1, 88, 0, 0, 0, 34, 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 0, 34, 0, 0, 1, 41,
- 0, 0, 1, 87, 0, 0, 0, 34, 0, 0, 1, 42, 0, 0, 1, 88, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 1, 65, 0, 0, 0, 34,
- 0, 0, 1, 65, 0, 0, 1, 93, 0, 0, 0, 34, 0, 0, 1, 45, 0, 0, 1, 93, 0, 0, 0, 39, 0, 0, 0, 75, 0, 0, 1, 45,
- 0, 0, 0, 38, 0, 0, 1, 66, 0, 0, 1, 94, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 1, 66, 0, 0, 0, 34, 0, 0, 1, 45,
- 0, 0, 1, 94, 0, 0, 0, 39, 0, 0, 1, 91, 0, 0, 1, 93, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 91, 0, 0, 0, 34,
- 0, 0, 0, 76, 0, 0, 1, 45, 0, 0, 0, 38, 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 92,
- 0, 0, 0, 34, 0, 0, 1, 89, 0, 0, 1, 91, 0, 0, 0, 34, 0, 0, 1, 46, 0, 0, 1, 89, 0, 0, 0, 34, 0, 0, 0, 76,
- 0, 0, 1, 46, 0, 0, 0, 38, 0, 0, 1, 90, 0, 0, 1, 92, 0, 0, 0, 34, 0, 0, 1, 46, 0, 0, 1, 90, 0, 0, 0, 34,
- 0, 0, 1, 69, 0, 0, 1, 89, 0, 0, 0, 34, 0, 0, 1, 46, 0, 0, 1, 50, 0, 0, 0, 38, 0, 0, 1, 70, 0, 0, 1, 90,
- 0, 0, 0, 34, 0, 0, 1, 83, 0, 0, 1, 89, 0, 0, 0, 34, 0, 0, 1, 84, 0, 0, 1, 90, 0, 0, 0, 34, 0, 0, 1, 39,
- 0, 0, 1, 59, 0, 0, 0, 34, 0, 0, 1, 51, 0, 0, 1, 59, 0, 0, 0, 34, 0, 0, 1, 37, 0, 0, 1, 51, 0, 0, 0, 34,
- 0, 0, 1, 40, 0, 0, 1, 60, 0, 0, 0, 34, 0, 0, 1, 38, 0, 0, 1, 52, 0, 0, 0, 34, 0, 0, 1, 52, 0, 0, 1, 60,
- 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 1, 57, 0, 0, 0, 39, 0, 0, 1, 57, 0, 0, 1, 65, 0, 0, 0, 34, 0, 0, 0, 74,
- 0, 0, 0, 75, 0, 0, 0, 38, 0, 0, 1, 58, 0, 0, 1, 66, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 1, 58, 0, 0, 0, 39,
- 0, 0, 1, 43, 0, 0, 1, 99, 0, 0, 0, 34, 0, 0, 1, 97, 0, 0, 1, 99, 0, 0, 0, 34, 0, 0, 1, 44, 0, 0, 1, 97,
- 0, 0, 0, 34, 0, 0, 1, 43, 0, 0, 1, 44, 0, 0, 0, 38, 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 0, 34, 0, 0, 1, 43,
- 0, 0, 1,100, 0, 0, 0, 34, 0, 0, 1, 44, 0, 0, 1, 98, 0, 0, 0, 34, 0, 0, 1, 95, 0, 0, 1, 97, 0, 0, 0, 34,
- 0, 0, 0, 73, 0, 0, 1, 95, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 1, 44, 0, 0, 0, 38, 0, 0, 1, 96, 0, 0, 1, 98,
- 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 1, 96, 0, 0, 0, 34, 0, 0, 1, 57, 0, 0, 1, 95, 0, 0, 0, 34, 0, 0, 0, 73,
- 0, 0, 0, 74, 0, 0, 0, 38, 0, 0, 1, 58, 0, 0, 1, 96, 0, 0, 0, 34, 0, 0, 1, 35, 0, 0, 1,103, 0, 0, 0, 34,
- 0, 0, 1,103, 0, 0, 1,105, 0, 0, 0, 34, 0, 0, 1, 33, 0, 0, 1,105, 0, 0, 0, 34, 0, 0, 1, 36, 0, 0, 1,104,
- 0, 0, 0, 34, 0, 0, 1, 34, 0, 0, 1,106, 0, 0, 0, 34, 0, 0, 1,104, 0, 0, 1,106, 0, 0, 0, 34, 0, 0, 1,103,
- 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1,107, 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1,105, 0, 0, 1,107, 0, 0, 0, 34,
- 0, 0, 1,104, 0, 0, 1,110, 0, 0, 0, 34, 0, 0, 1,106, 0, 0, 1,108, 0, 0, 0, 34, 0, 0, 1,108, 0, 0, 1,110,
- 0, 0, 0, 34, 0, 0, 1,109, 0, 0, 1,111, 0, 0, 0, 34, 0, 0, 1,111, 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1,107,
- 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1,110, 0, 0, 1,112, 0, 0, 0, 34, 0, 0, 1,108, 0, 0, 1,114, 0, 0, 0, 34,
- 0, 0, 1,112, 0, 0, 1,114, 0, 0, 0, 34, 0, 0, 1,111, 0, 0, 1,117, 0, 0, 0, 34, 0, 0, 1,115, 0, 0, 1,117,
- 0, 0, 0, 34, 0, 0, 1,113, 0, 0, 1,115, 0, 0, 0, 34, 0, 0, 1,112, 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1,114,
- 0, 0, 1,116, 0, 0, 0, 34, 0, 0, 1,116, 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1,119, 0, 0, 0, 39,
- 0, 0, 1,115, 0, 0, 1,119, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1,117, 0, 0, 0, 34, 0, 0, 1,116, 0, 0, 1,120,
- 0, 0, 0, 34, 0, 0, 1, 56, 0, 0, 1,120, 0, 0, 0, 39, 0, 0, 1, 56, 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1, 95,
- 0, 0, 1,115, 0, 0, 0, 34, 0, 0, 1, 57, 0, 0, 1,119, 0, 0, 0, 39, 0, 0, 1, 96, 0, 0, 1,116, 0, 0, 0, 34,
- 0, 0, 1, 58, 0, 0, 1,120, 0, 0, 0, 39, 0, 0, 1, 97, 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1, 98, 0, 0, 1,114,
- 0, 0, 0, 34, 0, 0, 1, 99, 0, 0, 1,107, 0, 0, 0, 34, 0, 0, 1,100, 0, 0, 1,108, 0, 0, 0, 34, 0, 0, 1, 99,
- 0, 0, 1,101, 0, 0, 0, 34, 0, 0, 1,101, 0, 0, 1,105, 0, 0, 0, 34, 0, 0, 1,102, 0, 0, 1,106, 0, 0, 0, 34,
- 0, 0, 1,100, 0, 0, 1,102, 0, 0, 0, 34, 0, 0, 1, 31, 0, 0, 1,101, 0, 0, 0, 34, 0, 0, 1, 32, 0, 0, 1,102,
- 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 1,101, 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 1, 43, 0, 0, 0, 38, 0, 0, 0, 72,
- 0, 0, 1,102, 0, 0, 0, 34, 0, 0, 1, 25, 0, 0, 1, 31, 0, 0, 0, 38, 0, 0, 1, 26, 0, 0, 1, 32, 0, 0, 0, 38,
- 0, 0, 0, 72, 0, 0, 1, 25, 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 1, 26, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72,
- 0, 0, 0, 38, 0, 0, 1, 51, 0, 0, 1,103, 0, 0, 0, 34, 0, 0, 1, 52, 0, 0, 1,104, 0, 0, 0, 34, 0, 0, 1, 51,
- 0, 0, 1, 53, 0, 0, 0, 34, 0, 0, 1, 53, 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,110, 0, 0, 0, 34,
- 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 34, 0, 0, 1, 53, 0, 0, 1,123, 0, 0, 0, 34, 0, 0, 1,111, 0, 0, 1,123,
- 0, 0, 0, 34, 0, 0, 1,112, 0, 0, 1,124, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,124, 0, 0, 0, 34, 0, 0, 1, 55,
- 0, 0, 1,123, 0, 0, 0, 34, 0, 0, 1, 56, 0, 0, 1,124, 0, 0, 0, 34, 0, 0, 1, 91, 0, 0, 1,127, 0, 0, 0, 34,
- 0, 0, 1,125, 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1, 89, 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 92, 0, 0, 1,128,
- 0, 0, 0, 34, 0, 0, 1, 90, 0, 0, 1,126, 0, 0, 0, 34, 0, 0, 1,126, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 1, 59,
- 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1, 59, 0, 0, 1, 61, 0, 0, 0, 34,
- 0, 0, 1, 60, 0, 0, 1,126, 0, 0, 0, 34, 0, 0, 1, 60, 0, 0, 1, 62, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,128,
- 0, 0, 0, 34, 0, 0, 1, 41, 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 42, 0, 0, 1,126, 0, 0, 0, 34, 0, 0, 1, 41,
- 0, 0, 1, 85, 0, 0, 0, 34, 0, 0, 1, 83, 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 42, 0, 0, 1, 86, 0, 0, 0, 34,
- 0, 0, 1, 84, 0, 0, 1,126, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1, 63, 0, 0, 0, 34, 0, 0, 1, 63, 0, 0, 1,121,
- 0, 0, 0, 39, 0, 0, 1,119, 0, 0, 1,121, 0, 0, 0, 34, 0, 0, 1, 64, 0, 0, 1,122, 0, 0, 0, 39, 0, 0, 1, 56,
- 0, 0, 1, 64, 0, 0, 0, 34, 0, 0, 1,120, 0, 0, 1,122, 0, 0, 0, 34, 0, 0, 1, 65, 0, 0, 1,121, 0, 0, 0, 34,
- 0, 0, 1, 66, 0, 0, 1,122, 0, 0, 0, 34, 0, 0, 1,121, 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1, 63,
- 0, 0, 0, 34, 0, 0, 1,122, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 0, 34, 0, 0, 1, 93,
- 0, 0, 1,121, 0, 0, 0, 39, 0, 0, 1, 94, 0, 0, 1,122, 0, 0, 0, 39, 0, 0, 1,129, 0, 0, 1,141, 0, 0, 0, 34,
- 0, 0, 1,129, 0, 0, 1,155, 0, 0, 0, 34, 0, 0, 1,143, 0, 0, 1,155, 0, 0, 0, 34, 0, 0, 1,141, 0, 0, 1,143,
- 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 1,156, 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 1,142, 0, 0, 0, 34, 0, 0, 1,142,
- 0, 0, 1,144, 0, 0, 0, 34, 0, 0, 1,144, 0, 0, 1,156, 0, 0, 0, 34, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 0, 34,
- 0, 0, 1,139, 0, 0, 1,145, 0, 0, 0, 34, 0, 0, 1,139, 0, 0, 1,141, 0, 0, 0, 34, 0, 0, 1,144, 0, 0, 1,146,
- 0, 0, 0, 34, 0, 0, 1,140, 0, 0, 1,142, 0, 0, 0, 34, 0, 0, 1,140, 0, 0, 1,146, 0, 0, 0, 34, 0, 0, 1,145,
- 0, 0, 1,147, 0, 0, 0, 34, 0, 0, 1,137, 0, 0, 1,147, 0, 0, 0, 34, 0, 0, 1,137, 0, 0, 1,139, 0, 0, 0, 34,
- 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 34, 0, 0, 1,138, 0, 0, 1,140, 0, 0, 0, 34, 0, 0, 1,138, 0, 0, 1,148,
- 0, 0, 0, 34, 0, 0, 1,147, 0, 0, 1,149, 0, 0, 0, 34, 0, 0, 1,135, 0, 0, 1,149, 0, 0, 0, 34, 0, 0, 1,135,
- 0, 0, 1,137, 0, 0, 0, 34, 0, 0, 1,148, 0, 0, 1,150, 0, 0, 0, 34, 0, 0, 1,136, 0, 0, 1,138, 0, 0, 0, 34,
- 0, 0, 1,136, 0, 0, 1,150, 0, 0, 0, 34, 0, 0, 1,149, 0, 0, 1,151, 0, 0, 0, 34, 0, 0, 1,133, 0, 0, 1,151,
- 0, 0, 0, 34, 0, 0, 1,133, 0, 0, 1,135, 0, 0, 0, 34, 0, 0, 1,150, 0, 0, 1,152, 0, 0, 0, 34, 0, 0, 1,134,
- 0, 0, 1,136, 0, 0, 0, 34, 0, 0, 1,134, 0, 0, 1,152, 0, 0, 0, 34, 0, 0, 1,151, 0, 0, 1,153, 0, 0, 0, 34,
- 0, 0, 1,131, 0, 0, 1,153, 0, 0, 0, 34, 0, 0, 1,131, 0, 0, 1,133, 0, 0, 0, 34, 0, 0, 1,152, 0, 0, 1,154,
- 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,134, 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,154, 0, 0, 0, 34, 0, 0, 1,151,
- 0, 0, 1,161, 0, 0, 0, 34, 0, 0, 1,159, 0, 0, 1,161, 0, 0, 0, 34, 0, 0, 1,153, 0, 0, 1,159, 0, 0, 0, 34,
- 0, 0, 1,160, 0, 0, 1,162, 0, 0, 0, 34, 0, 0, 1,152, 0, 0, 1,162, 0, 0, 0, 34, 0, 0, 1,154, 0, 0, 1,160,
- 0, 0, 0, 34, 0, 0, 1,149, 0, 0, 1,163, 0, 0, 0, 34, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 34, 0, 0, 1,162,
- 0, 0, 1,164, 0, 0, 0, 34, 0, 0, 1,150, 0, 0, 1,164, 0, 0, 0, 34, 0, 0, 1,147, 0, 0, 1,165, 0, 0, 0, 34,
- 0, 0, 1,163, 0, 0, 1,165, 0, 0, 0, 34, 0, 0, 1,164, 0, 0, 1,166, 0, 0, 0, 34, 0, 0, 1,148, 0, 0, 1,166,
- 0, 0, 0, 34, 0, 0, 1,145, 0, 0, 1,167, 0, 0, 0, 34, 0, 0, 1,165, 0, 0, 1,167, 0, 0, 0, 34, 0, 0, 1,166,
- 0, 0, 1,168, 0, 0, 0, 34, 0, 0, 1,146, 0, 0, 1,168, 0, 0, 0, 34, 0, 0, 1,143, 0, 0, 1,169, 0, 0, 0, 34,
- 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 34, 0, 0, 1,168, 0, 0, 1,170, 0, 0, 0, 34, 0, 0, 1,144, 0, 0, 1,170,
- 0, 0, 0, 34, 0, 0, 1,155, 0, 0, 1,157, 0, 0, 0, 34, 0, 0, 1,157, 0, 0, 1,169, 0, 0, 0, 34, 0, 0, 1,156,
- 0, 0, 1,158, 0, 0, 0, 34, 0, 0, 1,158, 0, 0, 1,170, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1,185, 0, 0, 0, 34,
- 0, 0, 1,183, 0, 0, 1,185, 0, 0, 0, 34, 0, 0, 1, 59, 0, 0, 1,183, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,186,
- 0, 0, 0, 34, 0, 0, 1, 60, 0, 0, 1,184, 0, 0, 0, 34, 0, 0, 1,184, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1, 61,
- 0, 0, 1,131, 0, 0, 0, 34, 0, 0, 1,153, 0, 0, 1,185, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,132, 0, 0, 0, 34,
- 0, 0, 1,154, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1, 53, 0, 0, 1,183, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,184,
- 0, 0, 0, 34, 0, 0, 1,123, 0, 0, 1,171, 0, 0, 0, 34, 0, 0, 1,155, 0, 0, 1,171, 0, 0, 0, 34, 0, 0, 1,123,
- 0, 0, 1,129, 0, 0, 0, 34, 0, 0, 1,156, 0, 0, 1,172, 0, 0, 0, 34, 0, 0, 1,124, 0, 0, 1,172, 0, 0, 0, 34,
- 0, 0, 1,124, 0, 0, 1,130, 0, 0, 0, 34, 0, 0, 1,159, 0, 0, 1,181, 0, 0, 0, 34, 0, 0, 1,181, 0, 0, 1,185,
- 0, 0, 0, 34, 0, 0, 1,160, 0, 0, 1,182, 0, 0, 0, 34, 0, 0, 1,182, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1,179,
- 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,185, 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,179, 0, 0, 1,181, 0, 0, 0, 34,
- 0, 0, 1,186, 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,180, 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,180, 0, 0, 1,182,
- 0, 0, 0, 34, 0, 0, 1,175, 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,177, 0, 0, 1,179, 0, 0, 0, 34, 0, 0, 1,175,
- 0, 0, 1,177, 0, 0, 0, 34, 0, 0, 1,176, 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 0, 34,
- 0, 0, 1,178, 0, 0, 1,180, 0, 0, 0, 34, 0, 0, 1,173, 0, 0, 1,189, 0, 0, 0, 34, 0, 0, 1,187, 0, 0, 1,189,
- 0, 0, 0, 34, 0, 0, 1,173, 0, 0, 1,175, 0, 0, 0, 34, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,174,
- 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,174, 0, 0, 1,176, 0, 0, 0, 34, 0, 0, 1,171, 0, 0, 1,189, 0, 0, 0, 34,
- 0, 0, 1,173, 0, 0, 1,191, 0, 0, 0, 34, 0, 0, 1,171, 0, 0, 1,191, 0, 0, 0, 32, 0, 0, 1,172, 0, 0, 1,190,
- 0, 0, 0, 34, 0, 0, 1,172, 0, 0, 1,192, 0, 0, 0, 32, 0, 0, 1,174, 0, 0, 1,192, 0, 0, 0, 34, 0, 0, 1,157,
- 0, 0, 1,191, 0, 0, 0, 34, 0, 0, 1,158, 0, 0, 1,192, 0, 0, 0, 34, 0, 0, 1, 53, 0, 0, 1,189, 0, 0, 0, 34,
- 0, 0, 1, 54, 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,183, 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,184, 0, 0, 1,188,
- 0, 0, 0, 34, 0, 0, 1,191, 0, 0, 1,193, 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,157,
- 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,192, 0, 0, 1,194, 0, 0, 0, 34, 0, 0, 1,158, 0, 0, 1,218, 0, 0, 0, 34,
- 0, 0, 1,194, 0, 0, 1,218, 0, 0, 0, 34, 0, 0, 1,173, 0, 0, 1,203, 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,203,
- 0, 0, 0, 34, 0, 0, 1,174, 0, 0, 1,204, 0, 0, 0, 34, 0, 0, 1,194, 0, 0, 1,204, 0, 0, 0, 34, 0, 0, 1,175,
- 0, 0, 1,201, 0, 0, 0, 34, 0, 0, 1,201, 0, 0, 1,203, 0, 0, 0, 34, 0, 0, 1,176, 0, 0, 1,202, 0, 0, 0, 34,
- 0, 0, 1,202, 0, 0, 1,204, 0, 0, 0, 34, 0, 0, 1,177, 0, 0, 1,199, 0, 0, 0, 34, 0, 0, 1,199, 0, 0, 1,201,
- 0, 0, 0, 34, 0, 0, 1,178, 0, 0, 1,200, 0, 0, 0, 34, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 34, 0, 0, 1,179,
- 0, 0, 1,197, 0, 0, 0, 34, 0, 0, 1,197, 0, 0, 1,199, 0, 0, 0, 34, 0, 0, 1,180, 0, 0, 1,198, 0, 0, 0, 34,
- 0, 0, 1,198, 0, 0, 1,200, 0, 0, 0, 34, 0, 0, 1,181, 0, 0, 1,195, 0, 0, 0, 34, 0, 0, 1,195, 0, 0, 1,197,
- 0, 0, 0, 34, 0, 0, 1,182, 0, 0, 1,196, 0, 0, 0, 34, 0, 0, 1,196, 0, 0, 1,198, 0, 0, 0, 34, 0, 0, 1,159,
- 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,195, 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,160, 0, 0, 1,216, 0, 0, 0, 34,
- 0, 0, 1,196, 0, 0, 1,216, 0, 0, 0, 34, 0, 0, 1,205, 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,169, 0, 0, 1,205,
- 0, 0, 0, 34, 0, 0, 1,170, 0, 0, 1,206, 0, 0, 0, 34, 0, 0, 1,206, 0, 0, 1,218, 0, 0, 0, 34, 0, 0, 1,205,
- 0, 0, 1,207, 0, 0, 0, 34, 0, 0, 1,167, 0, 0, 1,207, 0, 0, 0, 34, 0, 0, 1,168, 0, 0, 1,208, 0, 0, 0, 34,
- 0, 0, 1,206, 0, 0, 1,208, 0, 0, 0, 34, 0, 0, 1,207, 0, 0, 1,209, 0, 0, 0, 34, 0, 0, 1,165, 0, 0, 1,209,
- 0, 0, 0, 34, 0, 0, 1,166, 0, 0, 1,210, 0, 0, 0, 34, 0, 0, 1,208, 0, 0, 1,210, 0, 0, 0, 34, 0, 0, 1,209,
- 0, 0, 1,211, 0, 0, 0, 34, 0, 0, 1,163, 0, 0, 1,211, 0, 0, 0, 34, 0, 0, 1,164, 0, 0, 1,212, 0, 0, 0, 34,
- 0, 0, 1,210, 0, 0, 1,212, 0, 0, 0, 34, 0, 0, 1,211, 0, 0, 1,213, 0, 0, 0, 34, 0, 0, 1,161, 0, 0, 1,213,
- 0, 0, 0, 34, 0, 0, 1,162, 0, 0, 1,214, 0, 0, 0, 34, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 34, 0, 0, 1,213,
- 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,214, 0, 0, 1,216, 0, 0, 0, 34, 0, 0, 1,197, 0, 0, 1,221, 0, 0, 0, 34,
- 0, 0, 1,219, 0, 0, 1,221, 0, 0, 0, 34, 0, 0, 1,199, 0, 0, 1,219, 0, 0, 0, 34, 0, 0, 1,198, 0, 0, 1,222,
- 0, 0, 0, 34, 0, 0, 1,200, 0, 0, 1,220, 0, 0, 0, 34, 0, 0, 1,220, 0, 0, 1,222, 0, 0, 0, 34, 0, 0, 1,221,
- 0, 0, 1,223, 0, 0, 0, 34, 0, 0, 1,223, 0, 0, 1,225, 0, 0, 0, 32, 0, 0, 1,219, 0, 0, 1,225, 0, 0, 0, 34,
- 0, 0, 1,222, 0, 0, 1,224, 0, 0, 0, 34, 0, 0, 1,220, 0, 0, 1,226, 0, 0, 0, 34, 0, 0, 1,224, 0, 0, 1,226,
- 0, 0, 0, 32, 0, 0, 1,223, 0, 0, 1,229, 0, 0, 0, 34, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 34, 0, 0, 1,225,
- 0, 0, 1,227, 0, 0, 0, 34, 0, 0, 1,224, 0, 0, 1,230, 0, 0, 0, 34, 0, 0, 1,226, 0, 0, 1,228, 0, 0, 0, 34,
- 0, 0, 1,228, 0, 0, 1,230, 0, 0, 0, 34, 0, 0, 1,229, 0, 0, 1,231, 0, 0, 0, 34, 0, 0, 1,231, 0, 0, 1,233,
- 0, 0, 0, 34, 0, 0, 1,227, 0, 0, 1,233, 0, 0, 0, 34, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 0, 34, 0, 0, 1,228,
- 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,232, 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,217, 0, 0, 1,227, 0, 0, 0, 34,
- 0, 0, 1,205, 0, 0, 1,233, 0, 0, 0, 34, 0, 0, 1,218, 0, 0, 1,228, 0, 0, 0, 34, 0, 0, 1,206, 0, 0, 1,234,
- 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,225, 0, 0, 0, 34, 0, 0, 1,194, 0, 0, 1,226, 0, 0, 0, 34, 0, 0, 1,203,
- 0, 0, 1,219, 0, 0, 0, 34, 0, 0, 1,204, 0, 0, 1,220, 0, 0, 0, 34, 0, 0, 1,215, 0, 0, 1,221, 0, 0, 0, 34,
- 0, 0, 1,216, 0, 0, 1,222, 0, 0, 0, 34, 0, 0, 1,213, 0, 0, 1,223, 0, 0, 0, 34, 0, 0, 1,214, 0, 0, 1,224,
- 0, 0, 0, 34, 0, 0, 1,211, 0, 0, 1,229, 0, 0, 0, 34, 0, 0, 1,212, 0, 0, 1,230, 0, 0, 0, 34, 0, 0, 1,209,
- 0, 0, 1,231, 0, 0, 0, 34, 0, 0, 1,210, 0, 0, 1,232, 0, 0, 0, 34, 0, 0, 1,207, 0, 0, 1,233, 0, 0, 0, 34,
- 0, 0, 1,208, 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,131, 0, 0, 1,245, 0, 0, 0, 34, 0, 0, 1,243, 0, 0, 1,245,
- 0, 0, 0, 39, 0, 0, 1,133, 0, 0, 1,243, 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,246, 0, 0, 0, 34, 0, 0, 1,134,
- 0, 0, 1,244, 0, 0, 0, 34, 0, 0, 1,244, 0, 0, 1,246, 0, 0, 0, 39, 0, 0, 1,241, 0, 0, 1,243, 0, 0, 0, 39,
- 0, 0, 1,135, 0, 0, 1,241, 0, 0, 0, 34, 0, 0, 1,136, 0, 0, 1,242, 0, 0, 0, 34, 0, 0, 1,242, 0, 0, 1,244,
- 0, 0, 0, 39, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 39, 0, 0, 1,137, 0, 0, 1,239, 0, 0, 0, 34, 0, 0, 1,138,
- 0, 0, 1,240, 0, 0, 0, 34, 0, 0, 1,240, 0, 0, 1,242, 0, 0, 0, 39, 0, 0, 1,237, 0, 0, 1,239, 0, 0, 0, 39,
- 0, 0, 1,139, 0, 0, 1,237, 0, 0, 0, 34, 0, 0, 1,140, 0, 0, 1,238, 0, 0, 0, 34, 0, 0, 1,238, 0, 0, 1,240,
- 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,237, 0, 0, 0, 39, 0, 0, 1,141, 0, 0, 1,235, 0, 0, 0, 34, 0, 0, 1,142,
- 0, 0, 1,236, 0, 0, 0, 34, 0, 0, 1,236, 0, 0, 1,238, 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,247, 0, 0, 0, 39,
- 0, 0, 1,129, 0, 0, 1,247, 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 1,248, 0, 0, 0, 34, 0, 0, 1,236, 0, 0, 1,248,
- 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,243, 0, 0, 0, 34, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 34, 0, 0, 1,236,
- 0, 0, 1,244, 0, 0, 0, 34, 0, 0, 1,246, 0, 0, 1,248, 0, 0, 0, 34, 0, 0, 1,237, 0, 0, 1,241, 0, 0, 0, 34,
- 0, 0, 1,238, 0, 0, 1,242, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1,247, 0, 0, 0, 39, 0, 0, 1, 56, 0, 0, 1,248,
- 0, 0, 0, 39, 0, 0, 1, 63, 0, 0, 1,245, 0, 0, 0, 39, 0, 0, 1, 64, 0, 0, 1,246, 0, 0, 0, 39, 0, 0, 0, 14,
- 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0,178, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0,113, 0, 0, 0, 34,
- 0, 0, 0, 14, 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0,112,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0,112, 0, 0, 0, 34, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,112, 80, 0, 0, 1, 42, 0, 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, 3,161,214, 32, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0,
+136, 0, 0, 0,224, 70,181, 3, 33, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 93,181, 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,
+ 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,183,209, 56,184,177,209, 56,184,177,209, 56, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152, 71,181, 3, 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, 77, 65, 0, 0,112, 2, 0, 0,232, 71,181, 3, 42, 0, 0, 0, 1, 0, 0, 0,
+200, 78,181, 3, 64, 68,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,112,114,101,118,105,101,119, 0, 0, 97,116,101,114,105,
+ 97,108, 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,128, 63,
+ 61,232, 54, 63,184,161, 23, 63, 0, 0,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, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,188,248, 68, 62,
+ 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198,121,130, 63, 0, 0,160, 63,
+ 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63,
+ 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 17, 3,
+ 3, 0, 17, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 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,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,128, 63,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 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, 16, 8, 1, 0, 64, 75,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,136, 74,181, 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,120, 78,181, 3, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0,136, 74,181, 3, 33, 0, 0, 0,
+ 1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 91,181, 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, 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, 16, 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,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63,
+ 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65, 8, 3, 0, 0, 64, 75,181, 3, 36, 0, 0, 0, 1, 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,245, 40,220, 62, 0, 0, 0, 0,
+164,112,125, 63, 0, 0,128, 63,106,214, 24, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 78,181, 3, 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, 77, 65, 0, 0,
+112, 2, 0, 0,200, 78,181, 3, 42, 0, 0, 0, 1, 0, 0, 0,168, 85,181, 3,232, 71,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 65,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 46, 48, 48, 49, 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, 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, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204,204, 61, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 1, 3, 67, 0, 1, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 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,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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 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, 1, 8,129, 0, 32, 82,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+104, 81,181, 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, 88, 85,181, 3, 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,205,204, 76, 63,
+205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,136, 0, 0, 0,104, 81,181, 3, 33, 0, 0, 0, 1, 0, 0, 0, 1, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+208, 91,181, 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, 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,
+ 16, 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, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 3, 0, 0, 32, 82,181, 3, 36, 0, 0, 0, 1, 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,245, 40,220, 62, 0, 0, 0, 0,164,112,125, 63, 0, 0,128, 63,106,214, 24, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 1, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+ 88, 85,181, 3, 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, 77, 65, 0, 0,112, 2, 0, 0,168, 85,181, 3, 42, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,200, 78,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,120,116,117,114,101, 46, 48, 48, 49, 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,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,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, 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, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63,
+ 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 3,
+ 3, 0, 1, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 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,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,128, 63,
+ 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 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, 72, 88,181, 3, 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, 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, 91,181, 3, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 0, 0, 72, 88,181, 3, 36, 0, 0, 0,
+ 1, 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,245, 40,220, 62,
+ 0, 0, 0, 0,164,112,125, 63, 0, 0,128, 63,106,214, 24, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 91,181, 3, 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,
+ 84, 69, 0, 0, 24, 1, 0, 0,208, 91,181, 3, 38, 0, 0, 0, 1, 0, 0, 0,104, 93,181, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69,112,114,101,118,105,101,119, 0,101,120, 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,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, 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, 5, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 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,
+ 24, 93,181, 3, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 93,181, 3, 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,
+ 84, 69, 0, 0, 24, 1, 0, 0,104, 93,181, 3, 38, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 91,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69,102, 97,107,101,115,104, 97,100,111,119, 0, 0, 76,101,110,100, 0,101,120, 0, 0, 0, 2, 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, 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, 5, 0, 40, 0, 5, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 24, 1, 0, 0,176, 94,181, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+112, 96,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 46, 48, 48, 49, 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,248, 95,181, 3,160,195,181, 3,224,234,181, 3, 0, 0, 0, 0,184, 97,181, 3,200,146,181, 3,
+ 0, 0, 0, 0, 0, 65,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 96,181, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,145,181, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24,194,181, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+249, 1, 0, 0,237, 3, 0, 0,244, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,192,133, 88, 61,184, 45, 85,189,
+196,181, 24,190,185, 71, 35, 63,153, 31,235, 62,130,102,203, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 4, 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,
+248, 95,181, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 68, 65, 84, 65, 84, 1, 0, 0, 48, 96,181, 3, 58, 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,184, 97,181, 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, 68, 65, 84, 65, 88, 47, 0, 0,
+184, 97,181, 3, 58, 0, 0, 0,249, 1, 0, 0,140,144,131, 62,119,163,200, 60,156, 9, 85, 62,125, 92, 70,170,228, 21,255, 0,
+ 0, 0, 0, 0, 50,222, 26,190,119,163,200, 60,156, 9, 85, 62,131,163, 70,170,228, 21,255, 0, 0, 0, 0, 0, 61,126,146, 62,
+223, 37, 8,188, 99,183, 47, 62,247, 76,191,194,228, 81,255, 0, 2, 0, 0, 0,147,185, 56,190,223, 37, 8,188, 99,183, 47, 62,
+ 9,179,191,194,228, 81,255, 0, 2, 0, 0, 0,129,176,157, 62,211, 91,217,188,244,238,246, 61, 31, 84,226,181,191, 61,255, 0,
+ 2, 0, 0, 0, 28, 30, 79,190,211, 91,217,188,244,238,246, 61,225,171,226,181,191, 61,255, 0, 2, 0, 0, 0,115, 19, 94, 62,
+103,251,128,189,150, 32, 14, 62,241, 9,155,144, 64, 62,255, 0, 2, 0, 0, 0, 26,161,227,189,103,251,128,189,150, 32, 14, 62,
+ 15,246,155,144, 64, 62,255, 0, 2, 0, 0, 0,115, 19, 94, 62,251,118, 25,189, 20,165, 62, 62,184, 14,144,163, 76, 87,255, 0,
+ 2, 0, 0, 0, 26,161,227,189,251,118, 25,189, 20,165, 62, 62, 72,241,144,163, 76, 87,255, 0, 2, 0, 0, 0,115, 19, 94, 62,
+232,107, 34, 60,116,128, 92, 62, 3, 3,121,131,110, 29,255, 0, 0, 0, 0, 0, 26,161,227,189,232,107, 34, 60,116,128, 92, 62,
+253,252,121,131,110, 29,255, 0, 0, 0, 0, 0, 58,193, 56, 62,119,163,200, 60, 77,247, 99, 62, 56,171,117,167,206, 36,255, 0,
+ 0, 0, 0, 0,168,252,152,189,119,163,200, 60, 77,247, 99, 62,200, 84,117,167,206, 36,255, 0, 0, 0, 0, 0,109, 42, 23, 62,
+223, 37, 8,188, 88,215, 73, 62,152,217,122,203, 56,110,255, 0, 0, 0, 0, 0,229,197, 0, 62,211, 91,217,188, 71, 14, 29, 62,
+179,184, 93,175, 66, 69,255, 0, 2, 0, 0, 0,249, 23,164,188,211, 91,217,188, 71, 14, 29, 62, 77, 71, 93,175, 66, 69,255, 0,
+ 2, 0, 0, 0, 88,231,182, 61,159,154,121, 61,179,201, 32, 62,181,151,104,255, 51, 74,255, 0, 2, 0, 0, 0,207,121,134, 60,
+159,154,121, 61,179,201, 32, 62, 75,104,104,255, 51, 74,255, 0, 2, 0, 0, 0, 25,158,242, 61,159,154,121, 61, 88,215, 73, 62,
+ 78,171,150,255,246, 95,255, 0, 2, 0, 0, 0,110,194, 80,188,159,154,121, 61, 88,215, 73, 62,178, 84,150,255,246, 95,255, 0,
+ 2, 0, 0, 0,138,211, 41, 62,159,154,121, 61, 77,247, 99, 62,152,133,153,254, 98, 37,255, 0, 0, 0, 0, 0,143, 66,118,189,
+159,154,121, 61, 77,247, 99, 62,104,122,153,254, 98, 37,255, 0, 0, 0, 0, 0, 58,193, 56, 62,154,232,206, 61, 77,247, 99, 62,
+ 24,170, 13, 88, 89, 35,255, 0, 0, 0, 0, 0,168,252,152,189,154,232,206, 61, 77,247, 99, 62,232, 85, 13, 88, 89, 35,255, 0,
+ 0, 0, 0, 0,109, 42, 23, 62,173, 79, 5, 62, 88,215, 73, 62,249,200,221, 65,244, 94,255, 0, 2, 0, 0, 0, 31,158, 43,189,
+173, 79, 5, 62, 88,215, 73, 62, 7, 55,221, 65,244, 94,255, 0, 2, 0, 0, 0,229,197, 0, 62, 54,180, 27, 62, 71, 14, 29, 62,
+ 51,186, 86, 78, 78, 73,255, 0, 2, 0, 0, 0,249, 23,164,188, 54,180, 27, 62, 71, 14, 29, 62,205, 69, 86, 78, 78, 73,255, 0,
+ 2, 0, 0, 0,115, 19, 94, 62,111, 6, 65, 62,150, 32, 14, 62, 2, 11,152,107,114, 68,255, 0, 2, 0, 0, 0, 26,161,227,189,
+111, 6, 65, 62,150, 32, 14, 62,254,244,152,107,114, 68,255, 0, 2, 0, 0, 0,115, 19, 94, 62, 14, 43, 35, 62, 20,165, 62, 62,
+201, 14,180, 91, 14, 88,255, 0, 2, 0, 0, 0, 26,161,227,189, 14, 43, 35, 62, 20,165, 62, 62, 55,241,180, 91, 14, 88,255, 0,
+ 2, 0, 0, 0,115, 19, 94, 62,250,195,236, 61,116,128, 92, 62,134, 2, 29,125,228, 26,255, 0, 0, 0, 0, 0, 26,161,227,189,
+250,195,236, 61,116,128, 92, 62,122,253, 29,125,228, 26,255, 0, 0, 0, 0, 0,140,144,131, 62,154,232,206, 61,156, 9, 85, 62,
+ 54, 93, 67, 85,154, 20,255, 0, 0, 0, 0, 0, 50,222, 26,190,154,232,206, 61,156, 9, 85, 62,202,162, 67, 85,154, 20,255, 0,
+ 0, 0, 0, 0, 61,126,146, 62,173, 79, 5, 62, 99,183, 47, 62,241, 76,161, 60, 97, 82,255, 0, 2, 0, 0, 0,147,185, 56,190,
+173, 79, 5, 62, 99,183, 47, 62, 15,179,161, 60, 97, 82,255, 0, 2, 0, 0, 0,129,176,157, 62, 54,180, 27, 62,244,238,246, 61,
+179, 83,157, 71, 45, 65,255, 0, 2, 0, 0, 0, 28, 30, 79,190, 54,180, 27, 62,244,238,246, 61, 77,172,157, 71, 45, 65,255, 0,
+ 2, 0, 0, 0,157, 89,176, 62,159,154,121, 61, 67, 1,232, 61, 40,111,113,255,117, 63,255, 0, 2, 0, 0, 0, 84,112,116,190,
+159,154,121, 61, 67, 1,232, 61,216,144,113,255,117, 63,255, 0, 2, 0, 0, 0,237,107,161, 62,159,154,121, 61,139, 64, 40, 62,
+ 48,100,154,255,167, 79,255, 0, 2, 0, 0, 0,244,148, 86,190,159,154,121, 61,139, 64, 40, 62,208,155,154,255,167, 79,255, 0,
+ 2, 0, 0, 0,100, 7,139, 62,159,154,121, 61, 48, 78, 81, 62,117,126,181,254,185, 19,255, 0, 0, 0, 0, 0,227,203, 41,190,
+159,154,121, 61, 48, 78, 81, 62,139,129,181,254,185, 19,255, 0, 0, 0, 0, 0, 26,229,140, 62,159,154,121, 61, 8,197, 88, 62,
+160,120,106,254,198, 42,255, 0, 2, 0, 0, 0, 79,135, 45,190,159,154,121, 61, 8,197, 88, 62, 96,135,106,254,198, 42,255, 0,
+ 2, 0, 0, 0, 66,110,133, 62,114, 95,214, 61,116,128, 92, 62,173, 93,126, 74, 93, 45,255, 0, 2, 0, 0, 0,158,153, 30,190,
+114, 95,214, 61,116,128, 92, 62, 83,162,126, 74, 93, 45,255, 0, 2, 0, 0, 0,115, 19, 94, 62,170,177,251, 61,185,178,103, 62,
+ 9, 11, 31,115,216, 54,255, 0, 2, 0, 0, 0, 26,161,227,189,170,177,251, 61,185,178,103, 62,247,244, 31,115,216, 54,255, 0,
+ 2, 0, 0, 0,206, 5, 53, 62,114, 95,214, 61,145, 41,111, 62, 9,181,184, 80, 43, 65,255, 0, 2, 0, 0, 0,208,133,145,189,
+114, 95,214, 61,145, 41,111, 62,247, 74,184, 80, 43, 65,255, 0, 2, 0, 0, 0,178, 92, 34, 62,159,154,121, 61,145, 41,111, 62,
+116,146, 57,254, 43, 66,255, 0, 2, 0, 0, 0, 48,103, 88,189,159,154,121, 61,145, 41,111, 62,140,109, 57,254, 43, 66,255, 0,
+ 2, 0, 0, 0,206, 5, 53, 62, 22,200,170, 60,145, 41,111, 62, 34,182,181,173,115, 64,255, 0, 2, 0, 0, 0,208,133,145,189,
+ 22,200,170, 60,145, 41,111, 62,222, 73,181,173,115, 64,255, 0, 2, 0, 0, 0,115, 19, 94, 62,159,154,121, 61,253,228,114, 62,
+ 74, 24,139,255,171,125,255, 0, 2, 0, 0, 0, 26,161,227,189,159,154,121, 61,253,228,114, 62,182,231,139,255,171,125,255, 0,
+ 2, 0, 0, 0,115, 19, 94, 62,149,249, 43, 59,185,178,103, 62,218, 10,140,140, 45, 54,255, 0, 2, 0, 0, 0, 26,161,227,189,
+149,249, 43, 59,185,178,103, 62, 38,245,140,140, 45, 54,255, 0, 2, 0, 0, 0, 66,110,133, 62, 22,200,170, 60,116,128, 92, 62,
+141, 92,203,179,210, 44,255, 0, 2, 0, 0, 0,158,153, 30,190, 22,200,170, 60,116,128, 92, 62,115,163,203,179,210, 44,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,202,248, 23, 62, 88,215, 73, 62, 0, 0, 43,124, 17, 31,255, 0, 0, 0, 0, 0,203,133, 88, 61,
+ 34, 77,229, 61,145, 41,111, 62, 0, 0, 63,249,209,127,255, 0, 0, 0, 0, 0,203,133, 88, 61,150,254,188,190,236, 27, 70, 62,
+ 0, 0,204,251,237,127,255, 0, 0, 0, 0, 0,203,133, 88, 61,191, 79, 78,190,116,128, 92, 62, 0, 0, 33,150,238, 71,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,146,221, 14,190, 77,247, 99, 62, 0, 0, 28,100,192, 79,255, 0, 0, 0, 0, 0,203,133, 88, 61,
+ 30, 99,211,190, 20,165, 62, 62, 0, 0,184,142,147, 59,255, 0, 2, 0, 0, 0,203,133, 88, 61,133,198, 12, 62,190,169, 6, 62,
+ 0, 0,143,103, 57, 75,255, 0, 0, 0, 0, 0,203,133, 88, 61, 99, 38, 91, 62, 28,120,239, 61, 0, 0,115, 78, 34,101,255, 0,
+ 0, 0, 0, 0,203,133, 88, 61, 16,243,187, 62,170,250,206,190, 0, 0,190,110,212,191,255, 0, 2, 0, 0, 0,203,133, 88, 61,
+247,106, 87, 62,178,224, 11,191, 0, 0,144, 35, 12,133,255, 0, 3, 0, 0, 0,203,133, 88, 61, 18,165,157,188, 33, 20, 9,191,
+ 0, 0,194,214,213,134,255, 0, 2, 0, 0, 0,203,133, 88, 61, 32, 43,108,190,227, 83,160,190, 0, 0,154,134,113,215,255, 0,
+ 2, 0, 0, 0,109, 42, 23, 62,146,221, 14,190, 67, 1,232, 61,144,113,122,198, 79, 13,255, 0, 0, 0, 0, 0, 31,158, 43,189,
+146,221, 14,190, 67, 1,232, 61,112,142,122,198, 79, 13,255, 0, 0, 0, 0, 0, 87,106, 75, 62,138, 37,131,190, 28,120,239, 61,
+196,122, 19, 31,152, 18,255, 0, 2, 0, 0, 0,225, 78,190,189,138, 37,131,190, 28,120,239, 61, 60,133, 19, 31,152, 18,255, 0,
+ 2, 0, 0, 0,115, 19, 94, 62, 2,186,192,190, 28,120,239, 61,167,125,146, 12,226, 20,255, 0, 0, 0, 0, 0, 26,161,227,189,
+ 2,186,192,190, 28,120,239, 61, 89,130,146, 12,226, 20,255, 0, 0, 0, 0, 0, 75,138,101, 62,200, 96,239,190,227, 37,202, 61,
+113,124,142,242,196, 26,255, 0, 2, 0, 0, 0,203,142,242,189,200, 96,239,190,227, 37,202, 61,143,131,142,242,196, 26,255, 0,
+ 2, 0, 0, 0, 47,225, 82, 62,195,112,252,190, 10,175,194, 61,159, 79, 44,159,210, 25,255, 0, 2, 0, 0, 0,146, 60,205,189,
+195,112,252,190, 10,175,194, 61, 97,176, 44,159,210, 25,255, 0, 2, 0, 0, 0, 41,248, 11, 62,242, 4, 1,191,107,138,224, 61,
+143, 19, 13,131,178, 19,255, 0, 2, 0, 0, 0, 27,170,253,188,242, 4, 1,191,107,138,224, 61,113,236, 13,131,178, 19,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,168,226, 2,191,244,238,246, 61, 0, 0, 75,130, 21, 24,255, 0, 2, 0, 0, 0,140,144,131, 62,
+ 18,242,240,189,227, 37,202, 61,114, 47,117,137,232, 8,255, 0, 2, 0, 0, 0, 50,222, 26,190, 18,242,240,189,227, 37,202, 61,
+142,208,117,137,232, 8,255, 0, 2, 0, 0, 0, 83, 55,178, 62, 23,233,143,189,187,156,209, 61, 25, 77,198,154,214, 13,255, 0,
+ 2, 0, 0, 0,193, 43,120,190, 23,233,143,189,187,156,209, 61,231,178,198,154,214, 13,255, 0, 2, 0, 0, 0, 26,222,224, 62,
+182,236,140, 60, 49, 21,112, 61,216,113,247,198,255, 12,255, 0, 2, 0, 0, 0,167,188,170,190,182,236,140, 60, 49, 21,112, 61,
+ 40,142,247,198,255, 12,255, 0, 2, 0, 0, 0,243, 84,232, 62,202,248, 23, 62, 82,238, 2, 62,104,113, 31, 51, 32, 30,255, 0,
+ 2, 0, 0, 0,128, 51,178,190,202,248, 23, 62, 82,238, 2, 62,152,142, 31, 51, 32, 30,255, 0, 2, 0, 0, 0,112,224,196, 62,
+190, 24, 50, 62, 2,220, 17, 62,216, 64,225,106,121, 27,255, 0, 0, 0, 0, 0,253,190,142,190,190, 24, 50, 62, 2,220, 17, 62,
+ 40,191,225,106,121, 27,255, 0, 0, 0, 0, 0,134,160,144, 62, 20, 20,106, 62, 99,183, 47, 62,137, 75, 82,101, 70, 20,255, 0,
+ 0, 0, 0, 0, 39,254, 52,190, 20, 20,106, 62, 99,183, 47, 62,119,180, 82,101, 70, 20,255, 0, 0, 0, 0, 0,195, 37, 79, 62,
+ 67, 92,154, 62,236, 27, 70, 62,241, 38, 19,119, 54, 26,255, 0, 2, 0, 0, 0,186,197,197,189, 67, 92,154, 62,236, 27, 70, 62,
+ 15,217, 19,119, 54, 26,255, 0, 2, 0, 0, 0,229,197, 0, 62,181, 7,145, 62, 48, 78, 81, 62, 21,175, 54, 96, 12, 24,255, 0,
+ 2, 0, 0, 0,249, 23,164,188,181, 7,145, 62, 48, 78, 81, 62,235, 80, 54, 96, 12, 24,255, 0, 2, 0, 0, 0,168,249,167, 61,
+ 42,212, 53, 62,196,146, 77, 62,174,155,128, 76,151, 21,255, 0, 0, 0, 0, 0,144, 48,194, 60, 42,212, 53, 62,196,146, 77, 62,
+ 82,100,128, 76,151, 21,255, 0, 0, 0, 0, 0, 81,129, 4, 62,241,129, 16, 62, 8,197, 88, 62, 0, 25, 4,237, 22,124,255, 0,
+ 0, 0, 0, 0, 89,243,193,188,241,129, 16, 62, 8,197, 88, 62, 0,231, 4,237, 22,124,255, 0, 0, 0, 0, 0,105,176,227, 61,
+ 17,132,184, 61,156, 9, 85, 62,160,255,126,232,209,125,255, 0, 0, 0, 0, 0,214,169,178,187, 17,132,184, 61,156, 9, 85, 62,
+ 96, 0,126,232,209,125,255, 0, 0, 0, 0, 0, 31,158, 43,189,223, 37, 8,188, 88,215, 73, 62,104, 38,122,203, 56,110,255, 0,
+ 0, 0, 0, 0,184, 69,105, 62, 92, 82, 55,189, 59, 46, 55, 62,106, 34,119,200, 16,110,255, 0, 0, 0, 0, 0,163, 5,250,189,
+ 92, 82, 55,189, 59, 46, 55, 62,150,221,119,200, 16,110,255, 0, 0, 0, 0, 0,134,160,144, 62,115,128,187,188,139, 64, 40, 62,
+161, 55, 60,207,115,104,255, 0, 0, 0, 0, 0, 39,254, 52,190,115,128,187,188,139, 64, 40, 62, 95,200, 60,207,115,104,255, 0,
+ 0, 0, 0, 0,157, 89,176, 62,205, 26, 17, 61, 71, 14, 29, 62,181, 58,123,226,214,109,255, 0, 0, 0, 0, 0, 84,112,116,190,
+205, 26, 17, 61, 71, 14, 29, 62, 75,197,123,226,214,109,255, 0, 0, 0, 0, 0, 9, 21,180, 62, 57, 13,177, 61, 71, 14, 29, 62,
+157, 49, 61,230, 36,115,255, 0, 0, 0, 0, 0, 45,231,123,190, 57, 13,177, 61, 71, 14, 29, 62, 99,206, 61,230, 36,115,255, 0,
+ 0, 0, 0, 0,123,192,170, 62,170,177,251, 61, 31,133, 36, 62,206, 39,175,234,196,119,255, 0, 0, 0, 0, 0, 16, 62,105,190,
+170,177,251, 61, 31,133, 36, 62, 50,216,175,234,196,119,255, 0, 0, 0, 0, 0,214,178,129, 62, 54,180, 27, 62, 20,165, 62, 62,
+ 62, 24, 85,255,173,125,255, 0, 0, 0, 0, 0,198, 34, 23,190, 54,180, 27, 62, 20,165, 62, 62,194,231, 85,255,173,125,255, 0,
+ 0, 0, 0, 0,246,142, 45, 62,230,161, 42, 62, 48, 78, 81, 62,251, 31, 40,247,158,123,255, 0, 0, 0, 0, 0, 32,152,130,189,
+230,161, 42, 62, 48, 78, 81, 62, 5,224, 40,247,158,123,255, 0, 0, 0, 0, 0,203,133, 88, 61,104,133,209,190,236, 27, 70, 62,
+ 0, 0,148,210,170,119,255, 0, 0, 0, 0, 0,185,194,212, 61, 36, 83,198,190,236, 27, 70, 62, 39, 19, 65,222,248,121,255, 0,
+ 0, 0, 0, 0,191,196,240, 58, 36, 83,198,190,236, 27, 70, 62,217,236, 65,222,248,121,255, 0, 0, 0, 0, 0,145, 57,220, 61,
+207, 80,226,190,167,233, 58, 62,134, 2,132,217, 12,122,255, 0, 0, 0, 0, 0, 77,241,236,186,207, 80,226,190,167,233, 58, 62,
+122,253,132,217, 12,122,255, 0, 0, 0, 0, 0,168,249,167, 61, 19,131,237,190,207,114, 51, 62, 13,252,169,214, 18,121,255, 0,
+ 0, 0, 0, 0,144, 48,194, 60, 19,131,237,190,207,114, 51, 62,243, 3,169,214, 18,121,255, 0, 0, 0, 0, 0,203,133, 88, 61,
+200, 96,239,190, 99,183, 47, 62, 0, 0,150,219,180,122,255, 0, 0, 0, 0, 0,203,133, 88, 61,254,152, 18,190,196,146, 77, 62,
+ 0, 0, 46, 97, 76, 83,255, 0, 0, 0, 0, 0,203,133, 88, 61, 18,242,240,189, 88,215, 73, 62, 0, 0,197,104,134, 73,255, 0,
+ 0, 0, 0, 0,225, 75,205, 61,235,104,248,189, 88,215, 73, 62, 52, 36, 2, 53,187,110,255, 0, 0, 0, 0, 0,179,158,179, 59,
+235,104,248,189, 88,215, 73, 62,204,219, 2, 53,187,110,255, 0, 0, 0, 0, 0,105,176,227, 61,174,134, 33,190,196,146, 77, 62,
+187, 95, 14,212,182, 72,255, 0, 0, 0, 0, 0,214,169,178,187,174,134, 33,190,196,146, 77, 62, 69,160, 14,212,182, 72,255, 0,
+ 0, 0, 0, 0, 48, 94,190, 61, 15, 98, 63,190, 88,215, 73, 62,117, 64,117,207, 90, 99,255, 0, 0, 0, 0, 0,220, 60, 81, 60,
+ 15, 98, 63,190, 88,215, 73, 62,139,191,117,207, 90, 99,255, 0, 0, 0, 0, 0,252,119,116, 62,239, 95,151,189,139, 64, 40, 62,
+103, 49,157,196, 13,102,255, 0, 0, 0, 0, 0, 22, 53, 8,190,239, 95,151,189,139, 64, 40, 62,153,206,157,196, 13,102,255, 0,
+ 0, 0, 0, 0,231,123,174, 62,211, 91,217,188, 2,220, 17, 62,142, 59,107,204,223,100,255, 0, 2, 0, 0, 0,232,180,112,190,
+211, 91,217,188, 2,220, 17, 62,114,196,107,204,223,100,255, 0, 2, 0, 0, 0,220,155,200, 62, 45,246, 46, 61,190,169, 6, 62,
+102, 66, 11,217, 65,102,255, 0, 0, 0, 0, 0,105,122,146,190, 45,246, 46, 61,190,169, 6, 62,154,189, 11,217, 65,102,255, 0,
+ 0, 0, 0, 0, 72, 87,204, 62,170,177,251, 61,179,201, 32, 62, 87, 54,142,228,151,112,255, 0, 0, 0, 0, 0,213, 53,150,190,
+170,177,251, 61,179,201, 32, 62,169,201,142,228,151,112,255, 0, 0, 0, 0, 0, 78, 71,191, 62,241,129, 16, 62,128, 96, 66, 62,
+ 82, 42, 97,247,125,120,255, 0, 2, 0, 0, 0,219, 37,137,190,241,129, 16, 62,128, 96, 66, 62,174,213, 97,247,125,120,255, 0,
+ 2, 0, 0, 0,140,144,131, 62, 31,244, 79, 62, 77,247, 99, 62,192, 41,216,254,253,120,255, 0, 0, 0, 0, 0, 50,222, 26,190,
+ 31,244, 79, 62, 77,247, 99, 62, 64,214,216,254,253,120,255, 0, 0, 0, 0, 0, 87,106, 75, 62, 48,189,124, 62,105,160,118, 62,
+217, 28, 53, 7,126,124,255, 0, 0, 0, 0, 0,225, 78,190,189, 48,189,124, 62,105,160,118, 62, 39,227, 53, 7,126,124,255, 0,
+ 0, 0, 0, 0,109, 42, 23, 62,236,138,113, 62, 65, 23,126, 62,125,255, 44, 5,227,127,255, 0, 0, 0, 0, 0, 31,158, 43,189,
+236,138,113, 62, 65, 23,126, 62,131, 0, 44, 5,227,127,255, 0, 0, 0, 0, 0,225, 75,205, 61,202,248, 23, 62,213, 91,122, 62,
+130,238, 89, 2,197,126,255, 0, 0, 0, 0, 0,179,158,179, 59,202,248, 23, 62,213, 91,122, 62,126, 17, 89, 2,197,126,255, 0,
+ 0, 0, 0, 0,105,176,227, 61,217,159,203,189, 37,110,107, 62,115, 23, 27,230, 34,123,255, 0, 0, 0, 0, 0,214,169,178,187,
+217,159,203,189, 37,110,107, 62,141,232, 27,230, 34,123,255, 0, 0, 0, 0, 0,218,229, 26, 62, 64, 3,133,190,167,233, 58, 62,
+212, 74, 28, 14,225,102,255, 0, 2, 0, 0, 0,207,139, 58,189, 64, 3,133,190,167,233, 58, 62, 44,181, 28, 14,225,102,255, 0,
+ 2, 0, 0, 0,246,142, 45, 62,184,151,194,190, 99,183, 47, 62,235, 72, 17,252, 31,105,255, 0, 2, 0, 0, 0, 32,152,130,189,
+184,151,194,190, 99,183, 47, 62, 21,183, 17,252, 31,105,255, 0, 2, 0, 0, 0,206, 5, 53, 62, 99,149,222,190, 31,133, 36, 62,
+179, 66,197,225,249,104,255, 0, 2, 0, 0, 0,208,133,145,189, 99,149,222,190, 31,133, 36, 62, 77,189,197,225,249,104,255, 0,
+ 2, 0, 0, 0, 30, 24, 38, 62,234,249,244,190,111,151, 21, 62, 62, 44, 4,183, 98, 95,255, 0, 2, 0, 0, 0,224, 84,103,189,
+234,249,244,190,111,151, 21, 62,194,211, 4,183, 98, 95,255, 0, 2, 0, 0, 0, 81,129, 4, 62, 86,181,248,190,111,151, 21, 62,
+155, 19, 52,158, 54, 80,255, 0, 2, 0, 0, 0, 89,243,193,188, 86,181,248,190,111,151, 21, 62,101,236, 52,158, 54, 80,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,195,112,252,190,219, 82, 25, 62, 0, 0,201,154, 88, 78,255, 0, 2, 0, 0, 0,203,133, 88, 61,
+ 52, 55,247,188,128, 96, 66, 62, 0, 0, 2,252,239,127,255, 0, 0, 0, 0, 0,203,133, 88, 61,222,227, 61, 61,156, 9, 85, 62,
+ 0, 0,112,227,196,124,255, 0, 0, 0, 0, 0, 47,225, 82, 62, 82, 93, 46, 62, 88,215, 73, 62, 58, 21,234,254, 56,126,255, 0,
+ 0, 0, 0, 0,146, 60,205,189, 82, 93, 46, 62, 88,215, 73, 62,198,234,234,254, 56,126,255, 0, 0, 0, 0, 0, 81,129, 4, 62,
+170, 34, 94, 60,196,146, 77, 62, 37,214,110,232,163,118,255, 0, 0, 0, 0, 0, 89,243,193,188,170, 34, 94, 60,196,146, 77, 62,
+219, 41,110,232,163,118,255, 0, 0, 0, 0, 0, 65, 39,235, 61,222,227, 61, 61, 48, 78, 81, 62,150,232,127,230, 57,123,255, 0,
+ 0, 0, 0, 0,173, 11, 21,188,222,227, 61, 61, 48, 78, 81, 62,106, 23,127,230, 57,123,255, 0, 0, 0, 0, 0,145, 57,220, 61,
+ 76,220,190,190,236, 27, 70, 62,117, 20,197,248, 36,126,255, 0, 0, 0, 0, 0, 77,241,236,186, 76,220,190,190,236, 27, 70, 62,
+139,235,197,248, 36,126,255, 0, 0, 0, 0, 0, 88,231,182, 61, 64, 3,133,190,196,146, 77, 62, 43, 19,128, 0,141,126,255, 0,
+ 2, 0, 0, 0,207,121,134, 60, 64, 3,133,190,196,146, 77, 62,213,236,128, 0,141,126,255, 0, 2, 0, 0, 0,203,133, 88, 61,
+ 64, 3,133,190,196,146, 77, 62, 0, 0,122,255,254,127,255, 0, 0, 0, 0, 0,203,133, 88, 61, 43, 11, 82,190, 88,215, 73, 62,
+ 0, 0,121,184, 36,106,255, 0, 0, 0, 0, 0, 8,213,197, 61, 55,235, 55,190,116,128, 92, 62,167, 66,139,160, 45, 53,255, 0,
+ 2, 0, 0, 0, 27,134, 21, 60, 55,235, 55,190,116,128, 92, 62, 89,189,139,160, 45, 53,255, 0, 2, 0, 0, 0, 65, 39,235, 61,
+174,134, 33,190, 77,247, 99, 62,133,118,215,224,239, 36,255, 0, 2, 0, 0, 0,173, 11, 21,188,174,134, 33,190, 77,247, 99, 62,
+123,137,215,224,239, 36,255, 0, 2, 0, 0, 0,185,194,212, 61, 57,123,233,189,116,128, 92, 62,167, 81,141, 95, 49, 24,255, 0,
+ 2, 0, 0, 0,191,196,240, 58, 57,123,233,189,116,128, 92, 62, 89,174,141, 95, 49, 24,255, 0, 2, 0, 0, 0, 31,149,145, 61,
+ 97, 4,226,189,116,128, 92, 62,189,200,160,108, 26, 39,255, 0, 2, 0, 0, 0, 89,225, 13, 61, 97, 4,226,189,116,128, 92, 62,
+ 67, 55,160,108, 26, 39,255, 0, 2, 0, 0, 0,203,133, 88, 61,106, 84, 22,190,253,228,114, 62, 0, 0, 42, 23,225,125,255, 0,
+ 0, 0, 0, 0,247, 11,153, 61,235,104,248,189, 37,110,107, 62,186,231, 89, 78, 66, 98,255, 0, 2, 0, 0, 0, 82,231,253, 60,
+235,104,248,189, 37,110,107, 62, 70, 24, 89, 78, 66, 98,255, 0, 2, 0, 0, 0, 8,213,197, 61,195,223,255,189, 37,110,107, 62,
+ 88, 43,134, 62,237,102,255, 0, 2, 0, 0, 0, 27,134, 21, 60,195,223,255,189, 37,110,107, 62,168,212,134, 62,237,102,255, 0,
+ 2, 0, 0, 0,185,194,212, 61,174,134, 33,190,253,228,114, 62,247, 46, 89,233,228,116,255, 0, 2, 0, 0, 0,191,196,240, 58,
+174,134, 33,190,253,228,114, 62, 9,209, 89,233,228,116,255, 0, 2, 0, 0, 0, 88,231,182, 61,243,184, 44,190,185,178,103, 62,
+ 46, 31,198,181,128, 99,255, 0, 2, 0, 0, 0,207,121,134, 60,243,184, 44,190,185,178,103, 62,210,224,198,181,128, 99,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61, 15, 98, 63,190,185,178,103, 62, 0, 0,185,191,175,110,255, 0, 2, 0, 0, 0, 98, 74, 49, 62,
+ 83,148, 74,190,107,138,224, 61, 23,120, 34, 41, 99, 16,255, 0, 0, 0, 0, 0,248, 14,138,189, 83,148, 74,190,107,138,224, 61,
+233,135, 34, 41, 99, 16,255, 0, 0, 0, 0, 0, 81,129, 4, 62,134,253, 40,190,167,233, 58, 62,251, 80, 26,250,241, 98,255, 0,
+ 0, 0, 0, 0, 89,243,193,188,134,253, 40,190,167,233, 58, 62, 5,175, 26,250,241, 98,255, 0, 0, 0, 0, 0, 41,248, 11, 62,
+ 83,148, 74,190,167,233, 58, 62,215, 83,153, 16, 71, 95,255, 0, 0, 0, 0, 0, 27,170,253,188, 83,148, 74,190,167,233, 58, 62,
+ 41,172,153, 16, 71, 95,255, 0, 0, 0, 0, 0, 30, 24, 38, 62,243,184, 44,190,107,138,224, 61, 24,122, 67, 35, 64, 15,255, 0,
+ 0, 0, 0, 0,224, 84,103,189,243,184, 44,190,107,138,224, 61,232,133, 67, 35, 64, 15,255, 0, 0, 0, 0, 0,203,133, 88, 61,
+ 93,165,235,190, 99,183, 47, 62, 0, 0,139, 86, 77, 94,255, 0, 0, 0, 0, 0,247, 11,153, 61,167,199,233,190, 99,183, 47, 62,
+144,206,200, 70,125, 94,255, 0, 0, 0, 0, 0, 82,231,253, 60,167,199,233,190, 99,183, 47, 62,112, 49,200, 70,125, 94,255, 0,
+ 0, 0, 0, 0, 8,213,197, 61, 99,149,222,190,167,233, 58, 62,253,164,109, 17, 75, 88,255, 0, 0, 0, 0, 0, 27,134, 21, 60,
+ 99,149,222,190,167,233, 58, 62, 3, 91,109, 17, 75, 88,255, 0, 0, 0, 0, 0, 8,213,197, 61, 70,236,203,190,128, 96, 66, 62,
+141,225, 87,168, 39, 88,255, 0, 0, 0, 0, 0, 27,134, 21, 60, 70,236,203,190,128, 96, 66, 62,115, 30, 87,168, 39, 88,255, 0,
+ 0, 0, 0, 0,203,133, 88, 61,212, 64,213,190,179,201, 32, 62, 0, 0, 20,159,153, 83,255, 0, 0, 0, 0, 0, 8,213,197, 61,
+252,201,205,190, 31,133, 36, 62, 5,230,250,177, 20, 98,255, 0, 0, 0, 0, 0, 27,134, 21, 60,252,201,205,190, 31,133, 36, 62,
+251, 25,250,177, 20, 98,255, 0, 0, 0, 0, 0, 8,213,197, 61,173,183,220,190,219, 82, 25, 62, 18,152, 8, 24,188, 70,255, 0,
+ 0, 0, 0, 0, 27,134, 21, 60,173,183,220,190,219, 82, 25, 62,238,103, 8, 24,188, 70,255, 0, 0, 0, 0, 0,247, 11,153, 61,
+ 59, 12,230,190,111,151, 21, 62, 26,222,242, 49,221,112,255, 0, 0, 0, 0, 0, 82,231,253, 60, 59, 12,230,190,111,151, 21, 62,
+230, 33,242, 49,221,112,255, 0, 0, 0, 0, 0,203,133, 88, 61,241,233,231,190,111,151, 21, 62, 0, 0, 18, 60, 5,113,255, 0,
+ 0, 0, 0, 0,189, 60, 8, 62,142,209, 76, 61,116,128, 92, 62, 4, 30, 93,244,225,123,255, 0, 0, 0, 0, 0,186,206,223,188,
+142,209, 76, 61,116,128, 92, 62,252,225, 93,244,225,123,255, 0, 0, 0, 0, 0,149,179, 15, 62, 22,200,170, 60, 8,197, 88, 62,
+ 71, 9, 34,251,144,127,255, 0, 0, 0, 0, 0,190,194, 13,189, 22,200,170, 60, 8,197, 88, 62,185,246, 34,251,144,127,255, 0,
+ 0, 0, 0, 0,155,156, 86, 62,202,248, 23, 62, 48, 78, 81, 62, 81, 17, 74, 2,204,126,255, 0, 0, 0, 0, 0,106,179,212,189,
+202,248, 23, 62, 48, 78, 81, 62,175,238, 74, 2,204,126,255, 0, 0, 0, 0, 0, 58,193, 56, 62, 94, 61, 20, 62, 8,197, 88, 62,
+218, 25,177,253, 86,125,255, 0, 2, 0, 0, 0,168,252,152,189, 94, 61, 20, 62, 8,197, 88, 62, 38,230,177,253, 86,125,255, 0,
+ 2, 0, 0, 0, 64,170,127, 62, 25, 11, 9, 62, 8,197, 88, 62,182, 21,210,240, 57,125,255, 0, 2, 0, 0, 0, 90,103, 19,190,
+ 25, 11, 9, 62, 8,197, 88, 62, 74,234,210,240, 57,125,255, 0, 2, 0, 0, 0,237,107,161, 62, 34, 77,229, 61,207,114, 51, 62,
+143, 28,249,237,117,123,255, 0, 0, 0, 0, 0,244,148, 86,190, 34, 77,229, 61,207,114, 51, 62,113,227,249,237,117,123,255, 0,
+ 0, 0, 0, 0, 15, 5,167, 62, 97,150,169, 61, 99,183, 47, 62,209, 15,217,246,175,126,255, 0, 0, 0, 0, 0, 56,199, 97,190,
+ 97,150,169, 61, 99,183, 47, 62, 47,240,217,246,175,126,255, 0, 0, 0, 0, 0, 89, 39,165, 62,125, 8, 32, 61,247,251, 43, 62,
+177, 24,190,253,146,125,255, 0, 0, 0, 0, 0,204, 11, 94,190,125, 8, 32, 61,247,251, 43, 62, 79,231,190,253,146,125,255, 0,
+ 0, 0, 0, 0, 26,229,140, 62, 60,222,152,187, 20,165, 62, 62, 20, 33, 75, 2,160,123,255, 0, 0, 0, 0, 0, 79,135, 45,190,
+ 60,222,152,187, 20,165, 62, 62,236,222, 75, 2,160,123,255, 0, 0, 0, 0, 0,184, 69,105, 62,115,128,187,188, 88,215, 73, 62,
+ 85, 26,238,248, 14,125,255, 0, 0, 0, 0, 0,163, 5,250,189,115,128,187,188, 88,215, 73, 62,171,229,238,248, 14,125,255, 0,
+ 0, 0, 0, 0,178, 92, 34, 62,226,194,133,186,116,128, 92, 62, 8, 7,142,250,175,127,255, 0, 0, 0, 0, 0, 48,103, 88,189,
+226,194,133,186,116,128, 92, 62,248,248,142,250,175,127,255, 0, 0, 0, 0, 0, 41,248, 11, 62, 57, 13,177, 61,116,128, 92, 62,
+169, 34, 2,240, 43,122,255, 0, 0, 0, 0, 0, 27,170,253,188, 57, 13,177, 61,116,128, 92, 62, 87,221, 2,240, 43,122,255, 0,
+ 0, 0, 0, 0,218,229, 26, 62,170,177,251, 61,116,128, 92, 62,126, 27,108,239,231,123,255, 0, 0, 0, 0, 0,207,139, 58,189,
+170,177,251, 61,116,128, 92, 62,130,228,108,239,231,123,255, 0, 0, 0, 0, 0, 30, 24, 38, 62,250,195,236, 61, 48, 78, 81, 62,
+226, 64, 13,207,224, 98,255, 0, 0, 0, 0, 0,224, 84,103,189,250,195,236, 61, 48, 78, 81, 62, 30,191, 13,207,224, 98,255, 0,
+ 0, 0, 0, 0, 1,111, 19, 62, 57, 13,177, 61, 48, 78, 81, 62, 29, 96,169,229, 81, 80,255, 0, 0, 0, 0, 0,110,176, 28,189,
+ 57, 13,177, 61, 48, 78, 81, 62,227,159,169,229, 81, 80,255, 0, 0, 0, 0, 0,138,211, 41, 62, 77,106,205, 59, 48, 78, 81, 62,
+ 36, 55,122, 71,188, 90,255, 0, 0, 0, 0, 0,143, 66,118,189, 77,106,205, 59, 48, 78, 81, 62,220,200,122, 71,188, 90,255, 0,
+ 0, 0, 0, 0,184, 69,105, 62,161,220, 67,188,128, 96, 66, 62, 76, 21, 90, 78,241, 98,255, 0, 0, 0, 0, 0,163, 5,250,189,
+161,220, 67,188,128, 96, 66, 62,180,234, 90, 78,241, 98,255, 0, 0, 0, 0, 0,174, 41,137, 62,149,249, 43, 59, 59, 46, 55, 62,
+ 85,245, 69, 69, 25,107,255, 0, 0, 0, 0, 0,118, 16, 38,190,149,249, 43, 59, 59, 46, 55, 62,171, 10, 69, 69, 25,107,255, 0,
+ 0, 0, 0, 0,129,176,157, 62,222,227, 61, 61,139, 64, 40, 62,232,223,211, 29, 67,120,255, 0, 0, 0, 0, 0, 28, 30, 79,190,
+222,227, 61, 61,139, 64, 40, 62, 24, 32,211, 29, 67,120,255, 0, 0, 0, 0, 0, 55,142,159, 62,137, 31,162, 61,139, 64, 40, 62,
+148,210,123,238, 95,118,255, 0, 0, 0, 0, 0,136,217, 82,190,137, 31,162, 61,139, 64, 40, 62,108, 45,123,238, 95,118,255, 0,
+ 0, 0, 0, 0, 21,245,153, 62,114, 95,214, 61,247,251, 43, 62,216,229,108,179, 43, 99,255, 0, 0, 0, 0, 0, 67,167, 71,190,
+114, 95,214, 61,247,251, 43, 62, 40, 26,108,179, 43, 99,255, 0, 0, 0, 0, 0,212,238,123, 62,173, 79, 5, 62,196,146, 77, 62,
+202,237,179,158, 35, 81,255, 0, 2, 0, 0, 0,238,171, 15,190,173, 79, 5, 62,196,146, 77, 62, 54, 18,179,158, 35, 81,255, 0,
+ 2, 0, 0, 0,166,124, 60, 62, 25, 11, 9, 62,156, 9, 85, 62, 24, 39,118,212,214,113,255, 0, 2, 0, 0, 0,129,115,160,189,
+ 25, 11, 9, 62,156, 9, 85, 62,232,216,118,212,214,113,255, 0, 2, 0, 0, 0,155,156, 86, 62,133,198, 12, 62,196,146, 77, 62,
+213, 1,189,193,208,111,255, 0, 0, 0, 0, 0,106,179,212,189,133,198, 12, 62,196,146, 77, 62, 43,254,189,193,208,111,255, 0,
+ 0, 0, 0, 0,109, 42, 23, 62,216,126,230, 60,196,146, 77, 62,226, 84,192, 42,187, 85,255, 0, 0, 0, 0, 0, 31,158, 43,189,
+216,126,230, 60,196,146, 77, 62, 30,171,192, 42,187, 85,255, 0, 0, 0, 0, 0, 1,111, 19, 62, 63,191, 91, 61,196,146, 77, 62,
+235,102,196, 2, 11, 76,255, 0, 0, 0, 0, 0,110,176, 28,189, 63,191, 91, 61,196,146, 77, 62, 21,153,196, 2, 11, 76,255, 0,
+ 0, 0, 0, 0,185,194,212, 61,122,230, 38, 62, 42,101, 10, 62,183,182,118,104, 5,246,255, 0, 0, 0, 0, 0,191,196,240, 58,
+122,230, 38, 62, 42,101, 10, 62, 73, 73,118,104, 5,246,255, 0, 0, 0, 0, 0, 1,111, 19, 62,186,247,131, 62,150, 32, 14, 62,
+208,192,221, 66, 3,167,255, 0, 2, 0, 0, 0,110,176, 28,189,186,247,131, 62,150, 32, 14, 62, 48, 63,221, 66, 3,167,255, 0,
+ 2, 0, 0, 0,155,156, 86, 62,220,144,137, 62, 82,238, 2, 62, 59, 9, 89, 90,208,165,255, 0, 2, 0, 0, 0,106,179,212,189,
+220,144,137, 62, 82,238, 2, 62,197,246, 89, 90,208,165,255, 0, 2, 0, 0, 0,208,194,142, 62,139,175, 83, 62,107,138,224, 61,
+165, 37,104,114,176,212,255, 0, 0, 0, 0, 0,187, 66, 49,190,139,175, 83, 62,107,138,224, 61, 91,218,104,114,176,212,255, 0,
+ 0, 0, 0, 0,152,105,189, 62, 14, 43, 35, 62,170,211,164, 61, 67, 45, 40,116, 1,227,255, 0, 0, 0, 0, 0, 37, 72,135,190,
+ 14, 43, 35, 62,170,211,164, 61,189,210, 40,116, 1,227,255, 0, 0, 0, 0, 0, 66,103,217, 62,133,198, 12, 62, 73,248,134, 61,
+100, 94,237, 79, 18,223,255, 0, 0, 0, 0, 0,207, 69,163,190,133,198, 12, 62, 73,248,134, 61,156,161,237, 79, 18,223,255, 0,
+ 0, 0, 0, 0, 32,206,211, 62,119,163,200, 60,252,115,211, 60,247,120,255,221,165,231,255, 0, 0, 0, 0, 0,173,172,157,190,
+119,163,200, 60,252,115,211, 60, 9,135,255,221,165,231,255, 0, 0, 0, 0, 0,123,192,170, 62,188, 45, 85,189,112, 94, 52, 61,
+155, 76,106,154, 19,242,255, 0, 0, 0, 0, 0, 16, 62,105,190,188, 45, 85,189,112, 94, 52, 61,101,179,106,154, 19,242,255, 0,
+ 0, 0, 0, 0,140,144,131, 62, 0, 41,196,189, 33,111,142, 61,204, 56, 26,142,138, 13,255, 0, 0, 0, 0, 0, 50,222, 26,190,
+ 0, 41,196,189, 33,111,142, 61, 52,199, 26,142,138, 13,255, 0, 0, 0, 0, 0,203,133, 88, 61, 16,243,187, 62, 89,242,105,188,
+ 0, 0,155,106,214, 70,255, 0, 2, 0, 0, 0,203,133, 88, 61,226,121,208, 62,254, 7, 62,190, 0, 0,243,127, 82, 3,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,254,152, 18,190, 11,214,236,190, 0, 0, 54,164,204,166,255, 0, 3, 0, 0, 0,203,133, 88, 61,
+173,190,136,190,139,142,124,189, 0, 0,179,129, 65,235,255, 0, 0, 0, 0, 0,203,133, 88, 61,205,243, 1,191, 73,248,134, 61,
+ 0, 0,182,151,204,181,255, 0, 2, 0, 0, 0,203,133, 88, 61,247,217,218,190,241, 12, 56, 60, 0, 0,231,221,162,132,255, 0,
+ 2, 0, 0, 0,203,133, 88, 61,161,222,162,190,147, 21,157, 57, 0, 0, 16,212,201,135,255, 0, 0, 0, 0, 0,203,133, 88, 61,
+207, 87,142,190,141,212,146,188, 0, 0,245,147, 97,187,255, 0, 0, 0, 0, 0, 61,119,230, 62,239,172,106, 61,161, 43,253,189,
+164,125,181,235,156, 13,255, 0, 0, 0, 0, 0,202, 85,176,190,239,172,106, 61,161, 43,253,189, 92,130,181,235,156, 13,255, 0,
+ 0, 0, 0, 0,243, 84,232, 62,194,113,199, 61, 78, 26, 47,190,174,126, 23,238, 66,252,255, 0, 0, 0, 0, 0,128, 51,178,190,
+194,113,199, 61, 78, 26, 47,190, 82,129, 23,238, 66,252,255, 0, 0, 0, 0, 0, 32,206,211, 62,216, 49,147, 61,181,218,180,190,
+ 70, 81,148, 13, 15,158,255, 0, 1, 0, 0, 0,173,172,157,190,216, 49,147, 61,181,218,180,190,186,174,148, 13, 15,158,255, 0,
+ 1, 0, 0, 0,174, 41,137, 62, 54,180, 27, 62,226, 76,244,190,123, 58,228, 21, 70,144,255, 0, 3, 0, 0, 0,118, 16, 38,190,
+ 54,180, 27, 62,226, 76,244,190,133,197,228, 21, 70,144,255, 0, 3, 0, 0, 0,146,121,202, 62,239, 95,151,189,240, 61,238,189,
+ 76, 89,139,164,161, 6,255, 0, 2, 0, 0, 0, 31, 88,148,190,239, 95,151,189,240, 61,238,189,180,166,139,164,161, 6,255, 0,
+ 2, 0, 0, 0,197,226,168, 62, 97, 4,226,189,163, 21,103,190, 93, 38, 34,134,182, 7,255, 0, 0, 0, 0, 0,164,130,101,190,
+ 97, 4,226,189,163, 21,103,190,163,217, 34,134,182, 7,255, 0, 0, 0, 0, 0, 9, 21,180, 62,109, 27,100,189,255,252,178,190,
+106, 43,219,170,222,170,255, 0, 1, 0, 0, 0, 45,231,123,190,109, 27,100,189,255,252,178,190,150,212,219,170,222,170,255, 0,
+ 1, 0, 0, 0,155,156, 86, 62,211, 91,217,188, 85,248,234,190,168, 55,109,213,229,148,255, 0, 2, 0, 0, 0,106,179,212,189,
+211, 91,217,188, 85,248,234,190, 88,200,109,213,229,148,255, 0, 2, 0, 0, 0, 30, 24, 38, 62,112, 61, 93,190,191,112, 37, 61,
+197,120, 36,255,158,213,255, 0, 0, 0, 0, 0,224, 84,103,189,112, 61, 93,190,191,112, 37, 61, 59,135, 36,255,158,213,255, 0,
+ 0, 0, 0, 0, 41,248, 11, 62,209, 24,123,190,176,102,236,188,188, 84, 20,181, 24,196,255, 0, 0, 0, 0, 0, 27,170,253,188,
+209, 24,123,190,176,102,236,188, 68,171, 20,181, 24,196,255, 0, 0, 0, 0, 0, 19, 56, 64, 62,110,117,196,190, 92, 79,241, 60,
+131, 79, 86,254,183,155,255, 0, 2, 0, 0, 0, 89,234,167,189,110,117,196,190, 92, 79,241, 60,125,176, 86,254,183,155,255, 0,
+ 2, 0, 0, 0,246,142, 45, 62, 59, 19,146,190, 95,149, 7, 61, 5, 99, 8, 1,231,174,255, 0, 0, 0, 0, 0, 32,152,130,189,
+ 59, 19,146,190, 95,149, 7, 61,251,156, 8, 1,231,174,255, 0, 0, 0, 0, 0, 47,225, 82, 62,234,249,244,190, 15,131, 22, 61,
+ 65, 62,227,185,224,168,255, 0, 2, 0, 0, 0,146, 60,205,189,234,249,244,190, 15,131, 22, 61,191,193,227,185,224,168,255, 0,
+ 2, 0, 0, 0, 25,158,242, 61,178,167,207,190,155,152,181, 60,133, 16,208,232, 55,131,255, 0, 0, 0, 0, 0,110,194, 80,188,
+178,167,207,190,155,152,181, 60,123,239,208,232, 55,131,255, 0, 0, 0, 0, 0,105,176,227, 61,201,103,155,190, 58,189,151, 60,
+ 7, 48,163,224,149,141,255, 0, 0, 0, 0, 0,214,169,178,187,201,103,155,190, 58,189,151, 60,249,207,163,224,149,141,255, 0,
+ 0, 0, 0, 0, 81,129, 4, 62,195,112,252,190,129, 39, 97, 61, 68, 12,218,158,147,173,255, 0, 0, 0, 0, 0, 89,243,193,188,
+195,112,252,190,129, 39, 97, 61,188,243,218,158,147,173,255, 0, 0, 0, 0, 0, 70,161, 30, 62,163,166, 59,190,208, 57, 82, 61,
+195,124,106,227,203,255,255, 0, 0, 0, 0, 0,127,121, 73,189,163,166, 59,190,208, 57, 82, 61, 61,131,106,227,203,255,255, 0,
+ 0, 0, 0, 0,218,229, 26, 62,174,134, 33,190, 33,111,142, 61, 29,120,105,231,193, 36,255, 0, 0, 0, 0, 0,207,139, 58,189,
+174,134, 33,190, 33,111,142, 61,227,135,105,231,193, 36,255, 0, 0, 0, 0, 0,109, 42, 23, 62,186,102, 7,190,130, 74,172, 61,
+160,101,164,182,240, 25,255, 0, 0, 0, 0, 0, 31,158, 43,189,186,102, 7,190,130, 74,172, 61, 96,154,164,182,240, 25,255, 0,
+ 0, 0, 0, 0,218,229, 26, 62,140,230,111,190,206,171,148,189,120, 84,221,159,198,253,255, 0, 0, 0, 0, 0,207,139, 58,189,
+140,230,111,190,206,171,148,189,136,171,221,159,198,253,255, 0, 0, 0, 0, 0,127,243, 67, 62, 83,148, 74,190, 16,205,139,190,
+255, 67, 42,151, 73,228,255, 0, 2, 0, 0, 0, 49, 97,175,189, 83,148, 74,190, 16,205,139,190, 1,188, 42,151, 73,228,255, 0,
+ 2, 0, 0, 0, 7, 88, 90, 62,235,104,248,189,244, 28,205,190,201, 63, 25,176, 0,179,255, 0, 3, 0, 0, 0, 66, 42,220,189,
+235,104,248,189,244, 28,205,190, 55,192, 25,176, 0,179,255, 0, 3, 0, 0, 0,248, 75,135, 62, 55,124,180, 62,187,202,167,190,
+ 34, 56,160, 95, 17,192,255, 0, 2, 0, 0, 0, 10, 85, 34,190, 55,124,180, 62,187,202,167,190,222,199,160, 95, 17,192,255, 0,
+ 2, 0, 0, 0,248, 75,135, 62,232,105,195, 62,146, 76, 58,190, 54, 55,120,115,239, 0,255, 0, 2, 0, 0, 0, 10, 85, 34,190,
+232,105,195, 62,146, 76, 58,190,202,200,120,115,239, 0,255, 0, 2, 0, 0, 0,248, 75,135, 62,203,192,176, 62,105,252, 34,189,
+239, 63,164, 92,238, 60,255, 0, 2, 0, 0, 0, 10, 85, 34,190,203,192,176, 62,105,252, 34,189, 17,192,164, 92,238, 60,255, 0,
+ 2, 0, 0, 0,174, 41,137, 62,219,193, 68, 62,208, 57, 82, 61,123, 49,255,102,170, 57,255, 0, 0, 0, 0, 0,118, 16, 38,190,
+219,193, 68, 62,208, 57, 82, 61,133,206,255,102,170, 57,255, 0, 0, 0, 0, 0,220,155,200, 62,133,198, 12, 62, 95,172,248, 59,
+142, 98,198, 73, 6, 35,255, 0, 0, 0, 0, 0,105,122,146,190,133,198, 12, 62, 95,172,248, 59,114,157,198, 73, 6, 35,255, 0,
+ 0, 0, 0, 0, 83, 55,178, 62, 14, 43, 35, 62,141,212,146,188,129, 61,254,106,241, 33,255, 0, 0, 0, 0, 0,193, 43,120,190,
+ 14, 43, 35, 62,141,212,146,188,127,194,254,106,241, 33,255, 0, 0, 0, 0, 0, 9, 21,180, 62, 72, 76,141, 62,161, 43,253,189,
+234, 76,151, 87,221, 52,255, 0, 0, 0, 0, 0, 45,231,123,190, 72, 76,141, 62,161, 43,253,189, 22,179,151, 87,221, 52,255, 0,
+ 0, 0, 0, 0, 66,103,217, 62,247,106, 87, 62, 7,254,185,189,187,101, 28, 66,199, 40,255, 0, 2, 0, 0, 0,207, 69,163,190,
+247,106, 87, 62, 7,254,185,189, 69,154, 28, 66,199, 40,255, 0, 2, 0, 0, 0, 66,103,217, 62,236,138,113, 62, 26,177, 80,190,
+183,113, 68, 58,119,248,255, 0, 2, 0, 0, 0,207, 69,163,190,236,138,113, 62, 26,177, 80,190, 73,142, 68, 58,119,248,255, 0,
+ 2, 0, 0, 0, 9, 21,180, 62,141,126,152, 62, 83, 3,118,190,235, 86,238, 93,205,253,255, 0, 0, 0, 0, 0, 45,231,123,190,
+141,126,152, 62, 83, 3,118,190, 21,169,238, 93,205,253,255, 0, 0, 0, 0, 0, 9, 21,180, 62, 38,179,135, 62,107,184,182,190,
+232, 85,154, 70,157,192,255, 0, 2, 0, 0, 0, 45,231,123,190, 38,179,135, 62,107,184,182,190, 24,170,154, 70,157,192,255, 0,
+ 2, 0, 0, 0, 66,103,217, 62,179, 56, 76, 62,153, 49,162,190,166,110,177, 42,222,207,255, 0, 2, 0, 0, 0,207, 69,163,190,
+179, 56, 76, 62,153, 49,162,190, 90,145,177, 42,222,207,255, 0, 2, 0, 0, 0,231,123,174, 62,154,232,206, 61, 56, 79,216,190,
+ 58, 75, 57, 1,116,152,255, 0, 3, 0, 0, 0,232,180,112,190,154,232,206, 61, 56, 79,216,190,198,180, 57, 1,116,152,255, 0,
+ 3, 0, 0, 0,208,194,142, 62,171,100, 40,189,170,250,206,190, 73, 70,147,187,200,173,255, 0, 1, 0, 0, 0,187, 66, 49,190,
+171,100, 40,189,170,250,206,190,183,185,147,187,200,173,255, 0, 0, 0, 0, 0,100, 0,223, 62,154,232,206, 61,191,190,121,190,
+194,114, 80, 41,207, 38,255, 0, 0, 0, 0, 0,241,222,168,190,154,232,206, 61,191,190,121,190, 62,141, 80, 41,207, 38,255, 0,
+ 0, 0, 0, 0,104, 51,120, 62,186,102, 7,190,127,153,163,189,232, 74,153,154, 28, 22,255, 0, 0, 0, 0, 0,130,240, 11,190,
+186,102, 7,190,127,153,163,189, 24,181,153,154, 28, 22,255, 0, 0, 0, 0, 0,214,178,129, 62,254,152, 18,190, 44,122,125,190,
+ 89, 71,115,151, 1,237,255, 0, 0, 0, 0, 0,198, 34, 23,190,254,152, 18,190, 44,122,125,190,167,184,115,151, 1,237,255, 0,
+ 0, 0, 0, 0,202,203,239, 62,133,198, 12, 62, 56, 86,132,190, 72,220,207, 93,106, 79,255, 0, 2, 0, 0, 0, 88,170,185,190,
+133,198, 12, 62, 56, 86,132,190,184, 35,207, 93,106, 79,255, 0, 2, 0, 0, 0, 32,206,211, 62, 18,242,240,189,135,108, 84,190,
+ 30, 15, 34,150, 84, 70,255, 0, 2, 0, 0, 0,173,172,157,190, 18,242,240,189,135,108, 84,190,226,240, 34,150, 84, 70,255, 0,
+ 2, 0, 0, 0, 38,160, 9, 63,217,159,203,189,192,186,154,190,164, 67,138,166,172, 61,255, 0, 0, 0, 0, 0,219, 30,221,190,
+217,159,203,189,192,186,154,190, 92,188,138,166,172, 61,255, 0, 0, 0, 0, 0,172,140, 38, 63,211, 91,217,188,255,252,178,190,
+179, 83,223,206,114, 83,255, 0, 0, 0, 0, 0,244,123, 11,191,211, 91,217,188,255,252,178,190, 77,172,223,206,114, 83,255, 0,
+ 0, 0, 0, 0, 95,242, 46, 63,194,113,199, 61, 73, 31,177,190, 54, 92,232, 12,210, 87,255, 0, 2, 0, 0, 0,167,225, 19,191,
+194,113,199, 61, 73, 31,177,190,202,163,232, 12,210, 87,255, 0, 2, 0, 0, 0,138,243, 32, 63, 3, 75, 61, 62, 73, 31,177,190,
+247, 62,221, 83, 97, 73,255, 0, 0, 0, 0, 0,209,226, 5,191, 3, 75, 61, 62, 73, 31,177,190, 9,193,221, 83, 97, 73,255, 0,
+ 0, 0, 0, 0,112,194, 7, 63, 82, 93, 46, 62, 84,255,150,190,181, 5, 80,111,236, 62,255, 0, 0, 0, 0, 0,111, 99,217,190,
+ 82, 93, 46, 62, 84,255,150,190, 75,250, 80,111,236, 62,255, 0, 0, 0, 0, 0,149,211, 6, 63,241,129, 16, 62, 50,102,145,190,
+236, 69,117,239,236,105,255, 0, 0, 0, 0, 0,185,133,215,190,241,129, 16, 62, 50,102,145,190, 20,186,117,239,236,105,255, 0,
+ 0, 0, 0, 0,104, 90, 27, 63, 54,180, 27, 62,113,168,169,190, 34, 24,205,231, 89,123,255, 0, 0, 0, 0, 0,175, 73, 0,191,
+ 54,180, 27, 62,113,168,169,190,222,231,205,231, 89,123,255, 0, 0, 0, 0, 0,246,174, 36, 63, 97,150,169, 61,221, 99,173,190,
+ 69,223, 16,252,173,123,255, 0, 0, 0, 0, 0, 62,158, 9,191, 97,150,169, 61,221, 99,173,190,187, 32, 16,252,173,123,255, 0,
+ 0, 0, 0, 0,249, 38, 30, 63, 98,147,127,188,221, 99,173,190,171,239, 0, 39,207,120,255, 0, 0, 0, 0, 0, 64, 22, 3,191,
+ 98,147,127,188,221, 99,173,190, 85, 16, 0, 39,207,120,255, 0, 0, 0, 0, 0, 75,177, 8, 63, 23,233,143,189,158, 33,149,190,
+ 9, 51, 56, 45, 82,108,255, 0, 0, 0, 0, 0, 37, 65,219,190, 23,233,143,189,158, 33,149,190,247,204, 56, 45, 82,108,255, 0,
+ 0, 0, 0, 0, 26,222,224, 62,120,196,173,189,243, 39, 88,190,147, 38,224, 62,153,104,255, 0, 2, 0, 0, 0,167,188,170,190,
+120,196,173,189,243, 39, 88,190,109,217,224, 62,153,104,255, 0, 2, 0, 0, 0,162, 66,247, 62,250,195,236, 61,204,154,128,190,
+218, 62,152,243,206,110,255, 0, 2, 0, 0, 0, 48, 33,193,190,250,195,236, 61,204,154,128,190, 38,193,152,243,206,110,255, 0,
+ 2, 0, 0, 0,196,219,252, 62, 17,132,184, 61, 50,102,145,190, 10, 87, 73,182, 19, 58,255, 0, 0, 0, 0, 0, 82,186,198,190,
+ 17,132,184, 61, 50,102,145,190,246,168, 73,182, 19, 58,255, 0, 0, 0, 0, 0, 21,238,237, 62,103,251,128,189, 44,122,125,190,
+232, 15,106,121, 64, 37,255, 0, 0, 0, 0, 0,162,204,183,190,103,251,128,189, 44,122,125,190, 24,240,106,121, 64, 37,255, 0,
+ 0, 0, 0, 0, 38,160, 9, 63,188, 45, 85,189, 79, 15,164,190,157,239, 89,122,212, 33,255, 0, 0, 0, 0, 0,219, 30,221,190,
+188, 45, 85,189, 79, 15,164,190, 99, 16, 89,122,212, 33,255, 0, 0, 0, 0, 0,104, 90, 27, 63,223, 37, 8,188,107,184,182,190,
+ 8,158,202, 81,185, 9,255, 0, 0, 0, 0, 0,175, 73, 0,191,223, 37, 8,188,107,184,182,190,248, 97,202, 81,185, 9,255, 0,
+ 0, 0, 0, 0,138,243, 32, 63, 40, 68,132, 61,107,184,182,190, 60,131,145,239, 95, 23,255, 0, 0, 0, 0, 0,209,226, 5,191,
+ 40, 68,132, 61,107,184,182,190,196,124,145,239, 95, 23,255, 0, 0, 0, 0, 0,178,124, 25, 63,250,195,236, 61,181,218,180,190,
+ 27,228, 22,153,206, 70,255, 0, 0, 0, 0, 0,242,215,252,190,250,195,236, 61,181,218,180,190,229, 27, 22,153,206, 70,255, 0,
+ 0, 0, 0, 0,112,194, 7, 63, 74,214,221, 61,153, 49,162,190, 65, 68,253,168,113, 64,255, 0, 0, 0, 0, 0,111, 99,217,190,
+ 74,214,221, 61,153, 49,162,190,191,187,253,168,113, 64,255, 0, 0, 0, 0, 0,135,153,228, 62, 97,150,169, 61, 44,122,125,190,
+113, 86,190,222, 87, 88,255, 0, 0, 0, 0, 0, 20,120,174,190, 97,150,169, 61, 44,122,125,190,143,169,190,222, 87, 88,255, 0,
+ 0, 0, 0, 0,209,187,226, 62,216,126,230, 60,198,170,141,190,196, 95,107,182,100, 42,255, 0, 0, 0, 0, 0, 93,154,172,190,
+216,126,230, 60,198,170,141,190, 60,160,107,182,100, 42,255, 0, 0, 0, 0, 0,180, 18,208, 62,223, 37, 8,188,198,170,141,190,
+ 42,111, 21, 14,220, 61,255, 0, 0, 0, 0, 0, 65,241,153,190,223, 37, 8,188,198,170,141,190,214,144, 21, 14,220, 61,255, 0,
+ 0, 0, 0, 0,100, 0,223, 62,161,220, 67,188,198,170,141,190, 3, 79, 4, 91, 19, 43,255, 0, 2, 0, 0, 0,241,222,168,190,
+161,220, 67,188,198,170,141,190,253,176, 4, 91, 19, 43,255, 0, 2, 0, 0, 0,135,153,228, 62, 92, 82, 55,189,198,170,141,190,
+207,107,198,254,250, 68,255, 0, 2, 0, 0, 0, 20,120,174,190, 92, 82, 55,189,198,170,141,190, 49,148,198,254,250, 68,255, 0,
+ 2, 0, 0, 0,174, 34,221, 62, 29, 9,115,189,198,170,141,190, 7, 82,225, 64,200, 73,255, 0, 0, 0, 0, 0, 59, 1,167,190,
+ 29, 9,115,189,198,170,141,190,249,173,225, 64,200, 73,255, 0, 0, 0, 0, 0,220,155,200, 62,188, 45, 85,189,146, 76, 58,190,
+ 38,117, 66,207, 47,239,255, 0, 0, 0, 0, 0,105,122,146,190,188, 45, 85,189,146, 76, 58,190,218,138, 66,207, 47,239,255, 0,
+ 0, 0, 0, 0, 38,190,198, 62,103,251,128,189, 15,209,106,190,150, 97,139, 18,184, 80,255, 0, 0, 0, 0, 0,179,156,144,190,
+103,251,128,189, 15,209,106,190,106,158,139, 18,184, 80,255, 0, 0, 0, 0, 0, 38,190,198, 62, 74,137, 10,189,231, 71,114,190,
+ 17,116, 66,240,154, 51,255, 0, 0, 0, 0, 0,179,156,144,190, 74,137, 10,189,231, 71,114,190,239,139, 66,240,154, 51,255, 0,
+ 0, 0, 0, 0, 66,103,217, 62, 45,246, 46, 61, 44,122,125,190,112,113,245,204, 39, 30,255, 0, 0, 0, 0, 0,207, 69,163,190,
+ 45,246, 46, 61, 44,122,125,190,144,142,245,204, 39, 30,255, 0, 0, 0, 0, 0,202,203,239, 62,159,154,121, 61, 16,205,139,190,
+105, 90, 61,185,146, 56,255, 0, 0, 0, 0, 0, 88,170,185,190,159,154,121, 61, 16,205,139,190,151,165, 61,185,146, 56,255, 0,
+ 0, 0, 0, 0,202,203,239, 62,239,172,106, 61, 10,221,152,190,191, 82,102,204,230, 82,255, 0, 0, 0, 0, 0, 88,170,185,190,
+239,172,106, 61, 10,221,152,190, 65,173,102,204,230, 82,255, 0, 0, 0, 0, 0,174, 34,221, 62, 29, 9,115,189, 10,221,152,190,
+246, 29, 64, 98, 94, 76,255, 0, 0, 0, 0, 0, 59, 1,167,190, 29, 9,115,189, 10,221,152,190, 10,226, 64, 98, 94, 76,255, 0,
+ 0, 0, 0, 0, 61,119,230, 62, 92, 82, 55,189, 10,221,152,190,150, 77,111, 17, 75,100,255, 0, 0, 0, 0, 0,202, 85,176,190,
+ 92, 82, 55,189, 10,221,152,190,106,178,111, 17, 75,100,255, 0, 0, 0, 0, 0, 26,222,224, 62, 98,147,127,188, 10,221,152,190,
+239, 60,190, 60,195, 94,255, 0, 0, 0, 0, 0,167,188,170,190, 98,147,127,188, 10,221,152,190, 17,195,190, 60,195, 94,255, 0,
+ 0, 0, 0, 0,106,240,209, 62,223, 37, 8,188, 10,221,152,190,199, 83,178, 23,209, 93,255, 0, 0, 0, 0, 0,247,206,155,190,
+223, 37, 8,188, 10,221,152,190, 57,172,178, 23,209, 93,255, 0, 0, 0, 0, 0,135,153,228, 62,216,126,230, 60, 10,221,152,190,
+ 98, 73, 1,200,170, 88,255, 0, 0, 0, 0, 0, 20,120,174,190,216,126,230, 60, 10,221,152,190,158,182, 1,200,170, 88,255, 0,
+ 0, 0, 0, 0, 38,160, 9, 63,154,232,206, 61,147, 65,175,190, 23, 68,166,223,112,103,255, 0, 0, 0, 0, 0,219, 30,221,190,
+154,232,206, 61,147, 65,175,190,233,187,166,223,112,103,255, 0, 0, 0, 0, 0,104, 90, 27, 63, 74,214,221, 61,249, 12,192,190,
+165, 18,156,216, 89,120,255, 0, 0, 0, 0, 0,175, 73, 0,191, 74,214,221, 61,249, 12,192,190, 91,237,156,216, 89,120,255, 0,
+ 0, 0, 0, 0, 27,192, 35, 63,159,154,121, 61,175,234,193,190, 25,185, 29,231,157,103,255, 0, 0, 0, 0, 0, 98,175, 8,191,
+159,154,121, 61,175,234,193,190,231, 70, 29,231,157,103,255, 0, 0, 0, 0, 0,249, 38, 30, 63,161,220, 67,188,249, 12,192,190,
+ 43,209, 0, 64,119,100,255, 0, 0, 0, 0, 0, 64, 22, 3,191,161,220, 67,188,249, 12,192,190,213, 46, 0, 64,119,100,255, 0,
+ 0, 0, 0, 0, 1,143, 10, 63,188, 45, 85,189, 73, 31,177,190, 52, 26,240, 92, 3, 84,255, 0, 0, 0, 0, 0,145,252,222,190,
+188, 45, 85,189, 73, 31,177,190,204,229,240, 92, 3, 84,255, 0, 0, 0, 0, 0, 21,238,237, 62, 29, 9,115,189, 16,205,139,190,
+ 58, 8,116,111,101, 62,255, 0, 0, 0, 0, 0,162,204,183,190, 29, 9,115,189, 16,205,139,190,198,247,116,111,101, 62,255, 0,
+ 0, 0, 0, 0,122,185,254, 62, 97,150,169, 61, 45,118,158,190,198, 80,102,213,175, 89,255, 0, 0, 0, 0, 0, 8,152,200,190,
+ 97,150,169, 61, 45,118,158,190, 58,175,102,213,175, 89,255, 0, 0, 0, 0, 0,202,203,239, 62,226,194,133,186,192,186,154,190,
+136, 25,130, 0,108,125,255, 0, 0, 0, 0, 0, 88,170,185,190,226,194,133,186,192,186,154,190,120,230,130, 0,108,125,255, 0,
+ 0, 0, 0, 0, 14,254,250, 62,115,128,187,188,119,152,156,190, 2, 27, 58, 30,104,121,255, 0, 0, 0, 0, 0,156,220,196,190,
+115,128,187,188,119,152,156,190,254,228, 58, 30,104,121,255, 0, 0, 0, 0, 0,223,245, 4, 63, 77,106,205, 59, 79, 15,164,190,
+218, 55,126,253, 35,115,255, 0, 0, 0, 0, 0, 76,202,211,190, 77,106,205, 59, 79, 15,164,190, 38,200,126,253, 35,115,255, 0,
+ 0, 0, 0, 0,152, 75, 0, 63,216,126,230, 60,227, 83,160,190,164, 41,199,255, 8,121,255, 0, 0, 0, 0, 0,190,117,202,190,
+216,126,230, 60,227, 83,160,190, 92,214,199,255, 8,121,255, 0, 0, 0, 0, 0,149,211, 6, 63,239,172,106, 61, 5,237,165,190,
+237, 39,191, 9, 55,121,255, 0, 0, 0, 0, 0,185,133,215,190,239,172,106, 61, 5,237,165,190, 19,216,191, 9, 55,121,255, 0,
+ 0, 0, 0, 0,220,125, 11, 63,205, 26, 17, 61,187,202,167,190,208, 46, 41,244,137,118,255, 0, 0, 0, 0, 0, 71,218,224,190,
+205, 26, 17, 61,187,202,167,190, 48,209, 41,244,137,118,255, 0, 0, 0, 0, 0,218, 5, 18, 63,222,227, 61, 61,113,168,169,190,
+ 70, 53, 84, 3, 85,116,255, 0, 2, 0, 0, 0, 65,234,237,190,222,227, 61, 61,113,168,169,190,186,202, 84, 3, 85,116,255, 0,
+ 2, 0, 0, 0, 73, 57, 15, 63,176,168,154, 61,113,168,169,190, 99, 44, 36, 38,212,113,255, 0, 2, 0, 0, 0, 31, 81,232,190,
+176,168,154, 61,113,168,169,190,157,211, 36, 38,212,113,255, 0, 2, 0, 0, 0,112,194, 7, 63, 54,180, 27, 62,249, 12,192,190,
+249,198, 3, 72,222,166,255, 0, 3, 0, 0, 0,111, 99,217,190, 54,180, 27, 62,249, 12,192,190, 7, 57, 3, 72,222,166,255, 0,
+ 3, 0, 0, 0, 64,209, 34, 63,230,161, 42, 62,170,250,206,190,198, 37,123, 68,174,154,255, 0, 3, 0, 0, 0,135,192, 7,191,
+230,161, 42, 62,170,250,206,190, 58,218,123, 68,174,154,255, 0, 3, 0, 0, 0, 21,208, 48, 63, 57, 13,177, 61,102,200,195,190,
+ 3,121,201, 17, 73,218,255, 0, 3, 0, 0, 0, 93,191, 21,191, 57, 13,177, 61,102,200,195,190,253,134,201, 17, 73,218,255, 0,
+ 3, 0, 0, 0, 24, 72, 42, 63,211, 91,217,188, 62, 63,203,190, 59, 82, 75,200, 70,175,255, 0, 3, 0, 0, 0, 96, 55, 15,191,
+211, 91,217,188, 62, 63,203,190,197,173, 75,200, 70,175,255, 0, 3, 0, 0, 0, 38,160, 9, 63, 40,178,188,189,175,234,193,190,
+134,249,184,165,129,165,255, 0, 3, 0, 0, 0,219, 30,221,190, 40,178,188,189,175,234,193,190,122, 6,184,165,129,165,255, 0,
+ 3, 0, 0, 0,140,137,215, 62, 97, 4,226,189,192,186,154,190,126,249,122,163,205,167,255, 0, 1, 0, 0, 0, 25,104,161,190,
+ 97, 4,226,189,192,186,154,190,130, 6,122,163,205,167,255, 0, 1, 0, 0, 0,243, 84,232, 62, 65,148, 1, 62,187,202,167,190,
+ 93,193,224, 65,229,165,255, 0, 1, 0, 0, 0,128, 51,178,190, 65,148, 1, 62,187,202,167,190,163, 62,224, 65,229,165,255, 0,
+ 1, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 64,145,181, 3, 58, 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,200,146,181, 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, 68, 65, 84, 65, 28, 47, 0, 0,200,146,181, 3, 55, 0, 0, 0,237, 3, 0, 0,
+ 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 46, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 42, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 10, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 34, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 34, 0, 24, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 26, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 31, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0,
+ 32, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0,
+ 23, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 34, 0, 0, 0,
+ 0, 0, 34, 0, 24, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0,
+ 34, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0,
+ 38, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 42, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 34, 0, 36, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 45, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 34, 0, 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,
+ 52, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0,
+ 24, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0,
+ 13, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 61, 0, 0, 0,
+ 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0,
+ 62, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 48, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 59, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 51, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0,171, 0, 0, 0,
+173, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0,
+172, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0,
+ 0, 0, 34, 0, 85, 0, 0, 0,169, 0, 0, 0, 0, 0, 34, 0,169, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0,
+ 87, 0, 0, 0, 0, 0, 34, 0,170, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,170, 0, 0, 0, 0, 0, 34, 0,
+ 86, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0,167, 0, 0, 0,169, 0, 0, 0,
+ 0, 0, 34, 0, 83, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0,168, 0, 0, 0,170, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+168, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,165, 0, 0, 0, 0, 0, 34, 0,
+165, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0,166, 0, 0, 0,168, 0, 0, 0,
+ 0, 0, 34, 0, 82, 0, 0, 0,166, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,
+163, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,165, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0,
+164, 0, 0, 0,166, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,164, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 82, 0, 0, 0,
+ 0, 0, 34, 0, 77, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,143, 0, 0, 0, 0, 0, 34, 0,143, 0, 0, 0,
+161, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,144, 0, 0, 0, 0, 0, 34, 0,
+ 78, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,162, 0, 0, 0, 0, 0, 34, 0,144, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,145, 0, 0, 0, 0, 0, 34, 0,143, 0, 0, 0,
+145, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+144, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0,147, 0, 0, 0,
+ 0, 0, 34, 0,145, 0, 0, 0,147, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,
+ 95, 0, 0, 0, 0, 0, 34, 0,146, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0,
+ 96, 0, 0, 0,149, 0, 0, 0, 0, 0, 34, 0,147, 0, 0, 0,149, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,150, 0, 0, 0,
+ 0, 0, 34, 0, 95, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0,148, 0, 0, 0,150, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,149, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,
+ 99, 0, 0, 0,152, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0,150, 0, 0, 0,152, 0, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,153, 0, 0, 0, 0, 0, 34, 0,151, 0, 0, 0,
+153, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+152, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,155, 0, 0, 0,
+ 0, 0, 34, 0,153, 0, 0, 0,155, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,156, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,
+103, 0, 0, 0, 0, 0, 34, 0,154, 0, 0, 0,156, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,
+104, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,155, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,158, 0, 0, 0,
+ 0, 0, 34, 0,103, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,156, 0, 0, 0,158, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,
+106, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,159, 0, 0, 0, 0, 0, 34, 0,157, 0, 0, 0,159, 0, 0, 0, 0, 0, 34, 0,
+107, 0, 0, 0,160, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,158, 0, 0, 0,160, 0, 0, 0,
+ 0, 0, 34, 0, 65, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+159, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,160, 0, 0, 0, 0, 0, 34, 0,
+108, 0, 0, 0,125, 0, 0, 0, 0, 0, 34, 0,125, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,159, 0, 0, 0,
+ 0, 0, 34, 0,126, 0, 0, 0,158, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,126, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,
+160, 0, 0, 0, 0, 0, 34, 0,125, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,155, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,
+156, 0, 0, 0,177, 0, 0, 0, 0, 0, 34, 0,126, 0, 0, 0,177, 0, 0, 0, 0, 0, 34, 0,123, 0, 0, 0,153, 0, 0, 0,
+ 0, 0, 34, 0,123, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,
+177, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,123, 0, 0, 0, 0, 0, 34, 0,
+122, 0, 0, 0,152, 0, 0, 0, 0, 0, 34, 0,122, 0, 0, 0,124, 0, 0, 0, 0, 0, 34, 0,119, 0, 0, 0,149, 0, 0, 0,
+ 0, 0, 34, 0,119, 0, 0, 0,121, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,150, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,
+122, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,147, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,119, 0, 0, 0, 0, 0, 34, 0,
+118, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0,118, 0, 0, 0,120, 0, 0, 0, 0, 0, 34, 0,115, 0, 0, 0,145, 0, 0, 0,
+ 0, 0, 34, 0,115, 0, 0, 0,117, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,
+118, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,143, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,
+114, 0, 0, 0,144, 0, 0, 0, 0, 0, 34, 0,114, 0, 0, 0,116, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 34, 0,112, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,174, 0, 0, 0,178, 0, 0, 0, 0, 0, 34, 0,161, 0, 0, 0,
+174, 0, 0, 0, 0, 0, 34, 0,174, 0, 0, 0,179, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,179, 0, 0, 0, 0, 0, 34, 0,
+162, 0, 0, 0,174, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0,109, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+175, 0, 0, 0, 0, 0, 34, 0,175, 0, 0, 0,180, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,180, 0, 0, 0, 0, 0, 34, 0,
+111, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,175, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,178, 0, 0, 0,180, 0, 0, 0,
+ 0, 0, 34, 0,174, 0, 0, 0,175, 0, 0, 0, 0, 0, 32, 0,179, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,
+134, 0, 0, 0, 0, 0, 34, 0,134, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0,
+133, 0, 0, 0,134, 0, 0, 0, 0, 0, 34, 0,133, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0,130, 0, 0, 0,132, 0, 0, 0,
+ 0, 0, 34, 0,130, 0, 0, 0,169, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,133, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,
+170, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,130, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0,
+129, 0, 0, 0,131, 0, 0, 0, 0, 0, 34, 0,129, 0, 0, 0,168, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,184, 0, 0, 0,
+ 0, 0, 34, 0,182, 0, 0, 0,184, 0, 0, 0, 0, 0, 34, 0,165, 0, 0, 0,182, 0, 0, 0, 0, 0, 34, 0,183, 0, 0, 0,
+185, 0, 0, 0, 0, 0, 34, 0,164, 0, 0, 0,185, 0, 0, 0, 0, 0, 34, 0,166, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,
+128, 0, 0, 0,182, 0, 0, 0, 0, 0, 34, 0,129, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,187, 0, 0, 0,
+ 0, 0, 34, 0,186, 0, 0, 0,187, 0, 0, 0, 0, 0, 32, 0,184, 0, 0, 0,186, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,
+184, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,187, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,185, 0, 0, 0, 0, 0, 34, 0,
+185, 0, 0, 0,186, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,186, 0, 0, 0, 0, 0, 32, 0, 67, 0, 0, 0,182, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,127, 0, 0, 0,128, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,
+127, 0, 0, 0, 0, 0, 32, 0,127, 0, 0, 0,129, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,190, 0, 0, 0, 0, 0, 34, 0,
+188, 0, 0, 0,190, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,188, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,141, 0, 0, 0,
+ 0, 0, 34, 0,189, 0, 0, 0,191, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,191, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,
+142, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,189, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,192, 0, 0, 0, 0, 0, 34, 0,
+190, 0, 0, 0,192, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,139, 0, 0, 0, 0, 0, 34, 0,191, 0, 0, 0,193, 0, 0, 0,
+ 0, 0, 34, 0,138, 0, 0, 0,193, 0, 0, 0, 0, 0, 34, 0,138, 0, 0, 0,140, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,
+194, 0, 0, 0, 0, 0, 34, 0,192, 0, 0, 0,194, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,137, 0, 0, 0, 0, 0, 34, 0,
+193, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,138, 0, 0, 0,
+ 0, 0, 34, 0, 69, 0, 0, 0,135, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,194, 0, 0, 0, 0, 0, 34, 0,135, 0, 0, 0,
+136, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,188, 0, 0, 0, 0, 0, 34, 0,
+ 68, 0, 0, 0,187, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,189, 0, 0, 0, 0, 0, 34, 0,188, 0, 0, 0,203, 0, 0, 0,
+ 0, 0, 34, 0,203, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0,189, 0, 0, 0,
+204, 0, 0, 0, 0, 0, 34, 0,204, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,196, 0, 0, 0, 0, 0, 34, 0,
+196, 0, 0, 0,197, 0, 0, 0, 0, 0, 34, 0,194, 0, 0, 0,197, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,198, 0, 0, 0,
+ 0, 0, 34, 0,195, 0, 0, 0,198, 0, 0, 0, 0, 0, 34, 0,197, 0, 0, 0,199, 0, 0, 0, 0, 0, 34, 0,192, 0, 0, 0,
+199, 0, 0, 0, 0, 0, 34, 0,198, 0, 0, 0,200, 0, 0, 0, 0, 0, 34, 0,193, 0, 0, 0,200, 0, 0, 0, 0, 0, 34, 0,
+199, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,190, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,200, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 34, 0,191, 0, 0, 0,202, 0, 0, 0, 0, 0, 34, 0,201, 0, 0, 0,203, 0, 0, 0, 0, 0, 34, 0,202, 0, 0, 0,
+204, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,202, 0, 0, 0, 0, 0, 34, 0,
+196, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,174, 0, 0, 0,
+ 0, 0, 34, 0,138, 0, 0, 0,162, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,208, 0, 0, 0, 0, 0, 34, 0,161, 0, 0, 0,
+208, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,209, 0, 0, 0, 0, 0, 34, 0,162, 0, 0, 0,209, 0, 0, 0, 0, 0, 34, 0,
+141, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,208, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,211, 0, 0, 0,
+ 0, 0, 34, 0,209, 0, 0, 0,211, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,164, 0, 0, 0,
+211, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,206, 0, 0, 0, 0, 0, 34, 0,206, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,
+207, 0, 0, 0,211, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,207, 0, 0, 0, 0, 0, 34, 0,206, 0, 0, 0,212, 0, 0, 0,
+ 0, 0, 34, 0,208, 0, 0, 0,212, 0, 0, 0, 0, 0, 34, 0,209, 0, 0, 0,213, 0, 0, 0, 0, 0, 34, 0,207, 0, 0, 0,
+213, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0,212, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,213, 0, 0, 0, 0, 0, 34, 0,
+ 70, 0, 0, 0,127, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,219, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,219, 0, 0, 0,
+ 0, 0, 34, 0,129, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0,217, 0, 0, 0,
+219, 0, 0, 0, 0, 0, 34, 0,130, 0, 0, 0,217, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,218, 0, 0, 0, 0, 0, 34, 0,
+218, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0,215, 0, 0, 0,217, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,215, 0, 0, 0,
+ 0, 0, 34, 0,133, 0, 0, 0,216, 0, 0, 0, 0, 0, 34, 0,216, 0, 0, 0,218, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,
+215, 0, 0, 0, 0, 0, 34, 0,134, 0, 0, 0,214, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,216, 0, 0, 0, 0, 0, 34, 0,
+215, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,226, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,228, 0, 0, 0,
+ 0, 0, 34, 0,216, 0, 0, 0,227, 0, 0, 0, 0, 0, 34, 0,227, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,217, 0, 0, 0,
+224, 0, 0, 0, 0, 0, 34, 0,224, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,218, 0, 0, 0,225, 0, 0, 0, 0, 0, 34, 0,
+225, 0, 0, 0,227, 0, 0, 0, 0, 0, 34, 0,219, 0, 0, 0,222, 0, 0, 0, 0, 0, 34, 0,222, 0, 0, 0,224, 0, 0, 0,
+ 0, 0, 34, 0,220, 0, 0, 0,223, 0, 0, 0, 0, 0, 34, 0,223, 0, 0, 0,225, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,
+221, 0, 0, 0, 0, 0, 34, 0,221, 0, 0, 0,222, 0, 0, 0, 0, 0, 34, 0,221, 0, 0, 0,223, 0, 0, 0, 0, 0, 34, 0,
+221, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,222, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,223, 0, 0, 0,227, 0, 0, 0,
+ 0, 0, 34, 0,178, 0, 0, 0,231, 0, 0, 0, 0, 0, 34, 0,229, 0, 0, 0,231, 0, 0, 0, 0, 0, 34, 0,180, 0, 0, 0,
+229, 0, 0, 0, 0, 0, 34, 0,179, 0, 0, 0,232, 0, 0, 0, 0, 0, 34, 0,181, 0, 0, 0,230, 0, 0, 0, 0, 0, 34, 0,
+230, 0, 0, 0,232, 0, 0, 0, 0, 0, 34, 0,229, 0, 0, 0,251, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,251, 0, 0, 0,
+ 0, 0, 34, 0,111, 0, 0, 0,252, 0, 0, 0, 0, 0, 34, 0,230, 0, 0, 0,252, 0, 0, 0, 0, 0, 34, 0,251, 0, 0, 0,
+253, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,253, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,254, 0, 0, 0, 0, 0, 34, 0,
+252, 0, 0, 0,254, 0, 0, 0, 0, 0, 34, 0,231, 0, 0, 0,249, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,250, 0, 0, 0,
+ 0, 0, 34, 0,232, 0, 0, 0,250, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,247, 0, 0, 0, 0, 0, 34, 0,247, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 34, 0,114, 0, 0, 0,248, 0, 0, 0, 0, 0, 34, 0,248, 0, 0, 0,250, 0, 0, 0, 0, 0, 34, 0,
+115, 0, 0, 0,245, 0, 0, 0, 0, 0, 34, 0,245, 0, 0, 0,247, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,246, 0, 0, 0,
+ 0, 0, 34, 0,246, 0, 0, 0,248, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,243, 0, 0, 0, 0, 0, 34, 0,243, 0, 0, 0,
+245, 0, 0, 0, 0, 0, 34, 0,118, 0, 0, 0,244, 0, 0, 0, 0, 0, 34, 0,244, 0, 0, 0,246, 0, 0, 0, 0, 0, 34, 0,
+119, 0, 0, 0,241, 0, 0, 0, 0, 0, 34, 0,241, 0, 0, 0,243, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,242, 0, 0, 0,
+ 0, 0, 34, 0,242, 0, 0, 0,244, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,239, 0, 0, 0, 0, 0, 34, 0,239, 0, 0, 0,
+241, 0, 0, 0, 0, 0, 34, 0,122, 0, 0, 0,240, 0, 0, 0, 0, 0, 34, 0,240, 0, 0, 0,242, 0, 0, 0, 0, 0, 34, 0,
+123, 0, 0, 0,237, 0, 0, 0, 0, 0, 34, 0,237, 0, 0, 0,239, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,238, 0, 0, 0,
+ 0, 0, 34, 0,238, 0, 0, 0,240, 0, 0, 0, 0, 0, 34, 0,176, 0, 0, 0,233, 0, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,
+237, 0, 0, 0, 0, 0, 34, 0,177, 0, 0, 0,234, 0, 0, 0, 0, 0, 34, 0,234, 0, 0, 0,238, 0, 0, 0, 0, 0, 34, 0,
+125, 0, 0, 0,235, 0, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,235, 0, 0, 0, 0, 0, 34, 0,126, 0, 0, 0,236, 0, 0, 0,
+ 0, 0, 34, 0,234, 0, 0, 0,236, 0, 0, 0, 0, 0, 34, 0,235, 0, 0, 0,253, 0, 0, 0, 0, 0, 34, 0,236, 0, 0, 0,
+254, 0, 0, 0, 0, 0, 34, 0,253, 0, 0, 0,255, 0, 0, 0, 0, 0, 34, 0,255, 0, 0, 0, 17, 1, 0, 0, 0, 0, 34, 0,
+235, 0, 0, 0, 17, 1, 0, 0, 0, 0, 34, 0,254, 0, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0,236, 0, 0, 0, 18, 1, 0, 0,
+ 0, 0, 34, 0, 0, 1, 0, 0, 18, 1, 0, 0, 0, 0, 34, 0, 17, 1, 0, 0, 19, 1, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,
+ 19, 1, 0, 0, 0, 0, 34, 0,234, 0, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0, 18, 1, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0,
+ 15, 1, 0, 0, 19, 1, 0, 0, 0, 0, 34, 0,237, 0, 0, 0, 15, 1, 0, 0, 0, 0, 34, 0,238, 0, 0, 0, 16, 1, 0, 0,
+ 0, 0, 34, 0, 16, 1, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0, 13, 1, 0, 0, 15, 1, 0, 0, 0, 0, 34, 0,239, 0, 0, 0,
+ 13, 1, 0, 0, 0, 0, 34, 0,240, 0, 0, 0, 14, 1, 0, 0, 0, 0, 34, 0, 14, 1, 0, 0, 16, 1, 0, 0, 0, 0, 34, 0,
+ 11, 1, 0, 0, 13, 1, 0, 0, 0, 0, 34, 0,241, 0, 0, 0, 11, 1, 0, 0, 0, 0, 34, 0,242, 0, 0, 0, 12, 1, 0, 0,
+ 0, 0, 34, 0, 12, 1, 0, 0, 14, 1, 0, 0, 0, 0, 34, 0, 9, 1, 0, 0, 11, 1, 0, 0, 0, 0, 34, 0,243, 0, 0, 0,
+ 9, 1, 0, 0, 0, 0, 34, 0,244, 0, 0, 0, 10, 1, 0, 0, 0, 0, 34, 0, 10, 1, 0, 0, 12, 1, 0, 0, 0, 0, 34, 0,
+ 7, 1, 0, 0, 9, 1, 0, 0, 0, 0, 34, 0,245, 0, 0, 0, 7, 1, 0, 0, 0, 0, 34, 0,246, 0, 0, 0, 8, 1, 0, 0,
+ 0, 0, 34, 0, 8, 1, 0, 0, 10, 1, 0, 0, 0, 0, 34, 0, 5, 1, 0, 0, 7, 1, 0, 0, 0, 0, 34, 0,247, 0, 0, 0,
+ 5, 1, 0, 0, 0, 0, 34, 0,248, 0, 0, 0, 6, 1, 0, 0, 0, 0, 34, 0, 6, 1, 0, 0, 8, 1, 0, 0, 0, 0, 34, 0,
+ 3, 1, 0, 0, 5, 1, 0, 0, 0, 0, 34, 0,249, 0, 0, 0, 3, 1, 0, 0, 0, 0, 34, 0,250, 0, 0, 0, 4, 1, 0, 0,
+ 0, 0, 34, 0, 4, 1, 0, 0, 6, 1, 0, 0, 0, 0, 34, 0, 3, 1, 0, 0, 21, 1, 0, 0, 0, 0, 34, 0,231, 0, 0, 0,
+ 21, 1, 0, 0, 0, 0, 34, 0,232, 0, 0, 0, 22, 1, 0, 0, 0, 0, 34, 0, 4, 1, 0, 0, 22, 1, 0, 0, 0, 0, 34, 0,
+251, 0, 0, 0, 1, 1, 0, 0, 0, 0, 34, 0,255, 0, 0, 0, 1, 1, 0, 0, 0, 0, 34, 0,252, 0, 0, 0, 2, 1, 0, 0,
+ 0, 0, 34, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 34, 0,229, 0, 0, 0, 23, 1, 0, 0, 0, 0, 34, 0, 1, 1, 0, 0,
+ 23, 1, 0, 0, 0, 0, 34, 0,230, 0, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0, 2, 1, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0,
+ 21, 1, 0, 0, 23, 1, 0, 0, 0, 0, 34, 0, 22, 1, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0,106, 0, 0, 0, 25, 1, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 25, 1, 0, 0, 0, 0, 38, 0, 65, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,
+ 26, 1, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 26, 1, 0, 0, 0, 0, 38, 0,104, 0, 0, 0, 27, 1, 0, 0, 0, 0, 34, 0,
+ 25, 1, 0, 0, 27, 1, 0, 0, 0, 0, 34, 0,105, 0, 0, 0, 28, 1, 0, 0, 0, 0, 34, 0, 26, 1, 0, 0, 28, 1, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0, 29, 1, 0, 0, 0, 0, 34, 0, 27, 1, 0, 0, 29, 1, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,
+ 30, 1, 0, 0, 0, 0, 34, 0, 28, 1, 0, 0, 30, 1, 0, 0, 0, 0, 34, 0,100, 0, 0, 0, 31, 1, 0, 0, 0, 0, 34, 0,
+ 29, 1, 0, 0, 31, 1, 0, 0, 0, 0, 34, 0,101, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 0, 30, 1, 0, 0, 32, 1, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0, 33, 1, 0, 0, 0, 0, 34, 0, 31, 1, 0, 0, 33, 1, 0, 0, 0, 0, 38, 0, 99, 0, 0, 0,
+ 34, 1, 0, 0, 0, 0, 34, 0, 32, 1, 0, 0, 34, 1, 0, 0, 0, 0, 38, 0, 96, 0, 0, 0, 35, 1, 0, 0, 0, 0, 34, 0,
+ 33, 1, 0, 0, 35, 1, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0, 36, 1, 0, 0, 0, 0, 34, 0, 34, 1, 0, 0, 36, 1, 0, 0,
+ 0, 0, 34, 0, 94, 0, 0, 0, 37, 1, 0, 0, 0, 0, 34, 0, 35, 1, 0, 0, 37, 1, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,
+ 38, 1, 0, 0, 0, 0, 34, 0, 36, 1, 0, 0, 38, 1, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 39, 1, 0, 0, 0, 0, 34, 0,
+ 37, 1, 0, 0, 39, 1, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0, 40, 1, 0, 0, 0, 0, 34, 0, 38, 1, 0, 0, 40, 1, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 41, 1, 0, 0, 0, 0, 34, 0, 39, 1, 0, 0, 41, 1, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,
+ 42, 1, 0, 0, 0, 0, 34, 0, 40, 1, 0, 0, 42, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 50, 1, 0, 0, 0, 0, 38, 0,
+ 50, 1, 0, 0, 69, 1, 0, 0, 0, 0, 34, 0, 69, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 79, 1, 0, 0,
+ 0, 0, 34, 0, 50, 1, 0, 0, 70, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 80, 1, 0, 0, 0, 0, 34, 0, 70, 1, 0, 0,
+ 80, 1, 0, 0, 0, 0, 34, 0, 48, 1, 0, 0, 49, 1, 0, 0, 0, 0, 38, 0, 77, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0,
+ 48, 1, 0, 0, 77, 1, 0, 0, 0, 0, 34, 0, 48, 1, 0, 0, 78, 1, 0, 0, 0, 0, 34, 0, 78, 1, 0, 0, 80, 1, 0, 0,
+ 0, 0, 34, 0, 47, 1, 0, 0, 48, 1, 0, 0, 0, 0, 38, 0, 77, 1, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 47, 1, 0, 0,
+ 81, 1, 0, 0, 0, 0, 34, 0, 47, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0, 78, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0,
+ 89, 0, 0, 0, 47, 1, 0, 0, 0, 0, 38, 0, 87, 0, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 82, 1, 0, 0,
+ 0, 0, 34, 0, 75, 1, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0, 75, 1, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,
+ 76, 1, 0, 0, 0, 0, 34, 0, 76, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0, 71, 1, 0, 0, 75, 1, 0, 0, 0, 0, 34, 0,
+ 83, 0, 0, 0, 71, 1, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 72, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 76, 1, 0, 0,
+ 0, 0, 34, 0, 71, 1, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0,
+ 74, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 74, 1, 0, 0, 0, 0, 34, 0, 71, 1, 0, 0, 77, 1, 0, 0, 0, 0, 34, 0,
+ 73, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 78, 1, 0, 0, 0, 0, 34, 0, 74, 1, 0, 0, 80, 1, 0, 0,
+ 0, 0, 34, 0, 67, 1, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 67, 1, 0, 0, 69, 1, 0, 0, 0, 0, 34, 0, 68, 1, 0, 0,
+ 74, 1, 0, 0, 0, 0, 34, 0, 68, 1, 0, 0, 70, 1, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 67, 1, 0, 0, 0, 0, 34, 0,
+ 80, 0, 0, 0, 68, 1, 0, 0, 0, 0, 34, 0,206, 0, 0, 0, 83, 1, 0, 0, 0, 0, 34, 0, 83, 1, 0, 0, 85, 1, 0, 0,
+ 0, 0, 34, 0,212, 0, 0, 0, 85, 1, 0, 0, 0, 0, 34, 0, 84, 1, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0,207, 0, 0, 0,
+ 84, 1, 0, 0, 0, 0, 34, 0,213, 0, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0, 67, 1, 0, 0, 83, 1, 0, 0, 0, 0, 34, 0,
+ 68, 1, 0, 0, 84, 1, 0, 0, 0, 0, 34, 0, 85, 1, 0, 0, 87, 1, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0, 87, 1, 0, 0,
+ 0, 0, 34, 0, 78, 0, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 41, 1, 0, 0,
+ 87, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 65, 1, 0, 0, 0, 0, 34, 0,
+ 65, 1, 0, 0, 93, 1, 0, 0, 0, 0, 34, 0, 45, 1, 0, 0, 93, 1, 0, 0, 0, 0, 39, 0, 75, 0, 0, 0, 45, 1, 0, 0,
+ 0, 0, 38, 0, 66, 1, 0, 0, 94, 1, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 66, 1, 0, 0, 0, 0, 34, 0, 45, 1, 0, 0,
+ 94, 1, 0, 0, 0, 0, 39, 0, 91, 1, 0, 0, 93, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 91, 1, 0, 0, 0, 0, 34, 0,
+ 76, 0, 0, 0, 45, 1, 0, 0, 0, 0, 38, 0, 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 92, 1, 0, 0,
+ 0, 0, 34, 0, 89, 1, 0, 0, 91, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0,
+ 46, 1, 0, 0, 0, 0, 38, 0, 90, 1, 0, 0, 92, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 90, 1, 0, 0, 0, 0, 34, 0,
+ 69, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 50, 1, 0, 0, 0, 0, 38, 0, 70, 1, 0, 0, 90, 1, 0, 0,
+ 0, 0, 34, 0, 83, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 84, 1, 0, 0, 90, 1, 0, 0, 0, 0, 34, 0, 39, 1, 0, 0,
+ 59, 1, 0, 0, 0, 0, 34, 0, 51, 1, 0, 0, 59, 1, 0, 0, 0, 0, 34, 0, 37, 1, 0, 0, 51, 1, 0, 0, 0, 0, 34, 0,
+ 40, 1, 0, 0, 60, 1, 0, 0, 0, 0, 34, 0, 38, 1, 0, 0, 52, 1, 0, 0, 0, 0, 34, 0, 52, 1, 0, 0, 60, 1, 0, 0,
+ 0, 0, 34, 0, 74, 0, 0, 0, 57, 1, 0, 0, 0, 0, 39, 0, 57, 1, 0, 0, 65, 1, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0,
+ 75, 0, 0, 0, 0, 0, 38, 0, 58, 1, 0, 0, 66, 1, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 58, 1, 0, 0, 0, 0, 39, 0,
+ 43, 1, 0, 0, 99, 1, 0, 0, 0, 0, 34, 0, 97, 1, 0, 0, 99, 1, 0, 0, 0, 0, 34, 0, 44, 1, 0, 0, 97, 1, 0, 0,
+ 0, 0, 34, 0, 43, 1, 0, 0, 44, 1, 0, 0, 0, 0, 38, 0, 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 34, 0, 43, 1, 0, 0,
+100, 1, 0, 0, 0, 0, 34, 0, 44, 1, 0, 0, 98, 1, 0, 0, 0, 0, 34, 0, 95, 1, 0, 0, 97, 1, 0, 0, 0, 0, 34, 0,
+ 73, 0, 0, 0, 95, 1, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 44, 1, 0, 0, 0, 0, 38, 0, 96, 1, 0, 0, 98, 1, 0, 0,
+ 0, 0, 34, 0, 73, 0, 0, 0, 96, 1, 0, 0, 0, 0, 34, 0, 57, 1, 0, 0, 95, 1, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0,
+ 74, 0, 0, 0, 0, 0, 38, 0, 58, 1, 0, 0, 96, 1, 0, 0, 0, 0, 34, 0, 35, 1, 0, 0,103, 1, 0, 0, 0, 0, 34, 0,
+103, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0, 33, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0, 36, 1, 0, 0,104, 1, 0, 0,
+ 0, 0, 34, 0, 34, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,104, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,103, 1, 0, 0,
+109, 1, 0, 0, 0, 0, 34, 0,107, 1, 0, 0,109, 1, 0, 0, 0, 0, 34, 0,105, 1, 0, 0,107, 1, 0, 0, 0, 0, 34, 0,
+104, 1, 0, 0,110, 1, 0, 0, 0, 0, 34, 0,106, 1, 0, 0,108, 1, 0, 0, 0, 0, 34, 0,108, 1, 0, 0,110, 1, 0, 0,
+ 0, 0, 34, 0,109, 1, 0, 0,111, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,113, 1, 0, 0, 0, 0, 34, 0,107, 1, 0, 0,
+113, 1, 0, 0, 0, 0, 34, 0,110, 1, 0, 0,112, 1, 0, 0, 0, 0, 34, 0,108, 1, 0, 0,114, 1, 0, 0, 0, 0, 34, 0,
+112, 1, 0, 0,114, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,117, 1, 0, 0, 0, 0, 34, 0,115, 1, 0, 0,117, 1, 0, 0,
+ 0, 0, 34, 0,113, 1, 0, 0,115, 1, 0, 0, 0, 0, 34, 0,112, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0,114, 1, 0, 0,
+116, 1, 0, 0, 0, 0, 34, 0,116, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,119, 1, 0, 0, 0, 0, 39, 0,
+115, 1, 0, 0,119, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,117, 1, 0, 0, 0, 0, 34, 0,116, 1, 0, 0,120, 1, 0, 0,
+ 0, 0, 34, 0, 56, 1, 0, 0,120, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0, 95, 1, 0, 0,
+115, 1, 0, 0, 0, 0, 34, 0, 57, 1, 0, 0,119, 1, 0, 0, 0, 0, 39, 0, 96, 1, 0, 0,116, 1, 0, 0, 0, 0, 34, 0,
+ 58, 1, 0, 0,120, 1, 0, 0, 0, 0, 39, 0, 97, 1, 0, 0,113, 1, 0, 0, 0, 0, 34, 0, 98, 1, 0, 0,114, 1, 0, 0,
+ 0, 0, 34, 0, 99, 1, 0, 0,107, 1, 0, 0, 0, 0, 34, 0,100, 1, 0, 0,108, 1, 0, 0, 0, 0, 34, 0, 99, 1, 0, 0,
+101, 1, 0, 0, 0, 0, 34, 0,101, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0,102, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,
+100, 1, 0, 0,102, 1, 0, 0, 0, 0, 34, 0, 31, 1, 0, 0,101, 1, 0, 0, 0, 0, 34, 0, 32, 1, 0, 0,102, 1, 0, 0,
+ 0, 0, 34, 0, 72, 0, 0, 0,101, 1, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 43, 1, 0, 0, 0, 0, 38, 0, 72, 0, 0, 0,
+102, 1, 0, 0, 0, 0, 34, 0, 25, 1, 0, 0, 31, 1, 0, 0, 0, 0, 38, 0, 26, 1, 0, 0, 32, 1, 0, 0, 0, 0, 38, 0,
+ 72, 0, 0, 0, 25, 1, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 26, 1, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 38, 0, 51, 1, 0, 0,103, 1, 0, 0, 0, 0, 34, 0, 52, 1, 0, 0,104, 1, 0, 0, 0, 0, 34, 0, 51, 1, 0, 0,
+ 53, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,109, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,110, 1, 0, 0, 0, 0, 34, 0,
+ 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,123, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,123, 1, 0, 0,
+ 0, 0, 34, 0,112, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,
+123, 1, 0, 0, 0, 0, 34, 0, 56, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 91, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0,
+125, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 89, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 92, 1, 0, 0,128, 1, 0, 0,
+ 0, 0, 34, 0, 90, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0,126, 1, 0, 0,128, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0,
+125, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0, 61, 1, 0, 0, 0, 0, 34, 0,
+ 60, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 60, 1, 0, 0, 62, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,128, 1, 0, 0,
+ 0, 0, 34, 0, 41, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 41, 1, 0, 0,
+ 85, 1, 0, 0, 0, 0, 34, 0, 83, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0,
+ 84, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0, 63, 1, 0, 0, 0, 0, 34, 0, 63, 1, 0, 0,121, 1, 0, 0,
+ 0, 0, 39, 0,119, 1, 0, 0,121, 1, 0, 0, 0, 0, 34, 0, 64, 1, 0, 0,122, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,
+ 64, 1, 0, 0, 0, 0, 34, 0,120, 1, 0, 0,122, 1, 0, 0, 0, 0, 34, 0, 65, 1, 0, 0,121, 1, 0, 0, 0, 0, 34, 0,
+ 66, 1, 0, 0,122, 1, 0, 0, 0, 0, 34, 0,121, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0, 63, 1, 0, 0,
+ 0, 0, 34, 0,122, 1, 0, 0,128, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 34, 0, 93, 1, 0, 0,
+121, 1, 0, 0, 0, 0, 39, 0, 94, 1, 0, 0,122, 1, 0, 0, 0, 0, 39, 0,129, 1, 0, 0,141, 1, 0, 0, 0, 0, 34, 0,
+129, 1, 0, 0,155, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,155, 1, 0, 0, 0, 0, 34, 0,141, 1, 0, 0,143, 1, 0, 0,
+ 0, 0, 34, 0,130, 1, 0, 0,156, 1, 0, 0, 0, 0, 34, 0,130, 1, 0, 0,142, 1, 0, 0, 0, 0, 34, 0,142, 1, 0, 0,
+144, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,156, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,145, 1, 0, 0, 0, 0, 34, 0,
+139, 1, 0, 0,145, 1, 0, 0, 0, 0, 34, 0,139, 1, 0, 0,141, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,146, 1, 0, 0,
+ 0, 0, 34, 0,140, 1, 0, 0,142, 1, 0, 0, 0, 0, 34, 0,140, 1, 0, 0,146, 1, 0, 0, 0, 0, 34, 0,145, 1, 0, 0,
+147, 1, 0, 0, 0, 0, 34, 0,137, 1, 0, 0,147, 1, 0, 0, 0, 0, 34, 0,137, 1, 0, 0,139, 1, 0, 0, 0, 0, 34, 0,
+146, 1, 0, 0,148, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,140, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,148, 1, 0, 0,
+ 0, 0, 34, 0,147, 1, 0, 0,149, 1, 0, 0, 0, 0, 34, 0,135, 1, 0, 0,149, 1, 0, 0, 0, 0, 34, 0,135, 1, 0, 0,
+137, 1, 0, 0, 0, 0, 34, 0,148, 1, 0, 0,150, 1, 0, 0, 0, 0, 34, 0,136, 1, 0, 0,138, 1, 0, 0, 0, 0, 34, 0,
+136, 1, 0, 0,150, 1, 0, 0, 0, 0, 34, 0,149, 1, 0, 0,151, 1, 0, 0, 0, 0, 34, 0,133, 1, 0, 0,151, 1, 0, 0,
+ 0, 0, 34, 0,133, 1, 0, 0,135, 1, 0, 0, 0, 0, 34, 0,150, 1, 0, 0,152, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,
+136, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,152, 1, 0, 0, 0, 0, 34, 0,151, 1, 0, 0,153, 1, 0, 0, 0, 0, 34, 0,
+131, 1, 0, 0,153, 1, 0, 0, 0, 0, 34, 0,131, 1, 0, 0,133, 1, 0, 0, 0, 0, 34, 0,152, 1, 0, 0,154, 1, 0, 0,
+ 0, 0, 34, 0,132, 1, 0, 0,134, 1, 0, 0, 0, 0, 34, 0,132, 1, 0, 0,154, 1, 0, 0, 0, 0, 34, 0,151, 1, 0, 0,
+161, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,161, 1, 0, 0, 0, 0, 34, 0,153, 1, 0, 0,159, 1, 0, 0, 0, 0, 34, 0,
+160, 1, 0, 0,162, 1, 0, 0, 0, 0, 34, 0,152, 1, 0, 0,162, 1, 0, 0, 0, 0, 34, 0,154, 1, 0, 0,160, 1, 0, 0,
+ 0, 0, 34, 0,149, 1, 0, 0,163, 1, 0, 0, 0, 0, 34, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 34, 0,162, 1, 0, 0,
+164, 1, 0, 0, 0, 0, 34, 0,150, 1, 0, 0,164, 1, 0, 0, 0, 0, 34, 0,147, 1, 0, 0,165, 1, 0, 0, 0, 0, 34, 0,
+163, 1, 0, 0,165, 1, 0, 0, 0, 0, 34, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 34, 0,148, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 34, 0,145, 1, 0, 0,167, 1, 0, 0, 0, 0, 34, 0,165, 1, 0, 0,167, 1, 0, 0, 0, 0, 34, 0,166, 1, 0, 0,
+168, 1, 0, 0, 0, 0, 34, 0,146, 1, 0, 0,168, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,
+167, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,168, 1, 0, 0,170, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,170, 1, 0, 0,
+ 0, 0, 34, 0,155, 1, 0, 0,157, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,156, 1, 0, 0,
+158, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,170, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0,
+183, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0,183, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,186, 1, 0, 0,
+ 0, 0, 34, 0, 60, 1, 0, 0,184, 1, 0, 0, 0, 0, 34, 0,184, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,
+131, 1, 0, 0, 0, 0, 34, 0,153, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,132, 1, 0, 0, 0, 0, 34, 0,
+154, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,183, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,184, 1, 0, 0,
+ 0, 0, 34, 0,123, 1, 0, 0,171, 1, 0, 0, 0, 0, 34, 0,155, 1, 0, 0,171, 1, 0, 0, 0, 0, 34, 0,123, 1, 0, 0,
+129, 1, 0, 0, 0, 0, 34, 0,156, 1, 0, 0,172, 1, 0, 0, 0, 0, 34, 0,124, 1, 0, 0,172, 1, 0, 0, 0, 0, 34, 0,
+124, 1, 0, 0,130, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,181, 1, 0, 0, 0, 0, 34, 0,181, 1, 0, 0,185, 1, 0, 0,
+ 0, 0, 34, 0,160, 1, 0, 0,182, 1, 0, 0, 0, 0, 34, 0,182, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,
+187, 1, 0, 0, 0, 0, 34, 0,185, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,181, 1, 0, 0, 0, 0, 34, 0,
+186, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,182, 1, 0, 0,
+ 0, 0, 34, 0,175, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,177, 1, 0, 0,179, 1, 0, 0, 0, 0, 34, 0,175, 1, 0, 0,
+177, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,178, 1, 0, 0, 0, 0, 34, 0,
+178, 1, 0, 0,180, 1, 0, 0, 0, 0, 34, 0,173, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,187, 1, 0, 0,189, 1, 0, 0,
+ 0, 0, 34, 0,173, 1, 0, 0,175, 1, 0, 0, 0, 0, 34, 0,188, 1, 0, 0,190, 1, 0, 0, 0, 0, 34, 0,174, 1, 0, 0,
+190, 1, 0, 0, 0, 0, 34, 0,174, 1, 0, 0,176, 1, 0, 0, 0, 0, 34, 0,171, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,
+173, 1, 0, 0,191, 1, 0, 0, 0, 0, 34, 0,171, 1, 0, 0,191, 1, 0, 0, 0, 0, 32, 0,172, 1, 0, 0,190, 1, 0, 0,
+ 0, 0, 34, 0,172, 1, 0, 0,192, 1, 0, 0, 0, 0, 32, 0,174, 1, 0, 0,192, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,
+191, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,192, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,
+ 54, 1, 0, 0,190, 1, 0, 0, 0, 0, 34, 0,183, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,184, 1, 0, 0,188, 1, 0, 0,
+ 0, 0, 34, 0,191, 1, 0, 0,193, 1, 0, 0, 0, 0, 34, 0,193, 1, 0, 0,217, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,
+217, 1, 0, 0, 0, 0, 34, 0,192, 1, 0, 0,194, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,
+194, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,173, 1, 0, 0,203, 1, 0, 0, 0, 0, 34, 0,193, 1, 0, 0,203, 1, 0, 0,
+ 0, 0, 34, 0,174, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,194, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,175, 1, 0, 0,
+201, 1, 0, 0, 0, 0, 34, 0,201, 1, 0, 0,203, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,202, 1, 0, 0, 0, 0, 34, 0,
+202, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,177, 1, 0, 0,199, 1, 0, 0, 0, 0, 34, 0,199, 1, 0, 0,201, 1, 0, 0,
+ 0, 0, 34, 0,178, 1, 0, 0,200, 1, 0, 0, 0, 0, 34, 0,200, 1, 0, 0,202, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,
+197, 1, 0, 0, 0, 0, 34, 0,197, 1, 0, 0,199, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,198, 1, 0, 0, 0, 0, 34, 0,
+198, 1, 0, 0,200, 1, 0, 0, 0, 0, 34, 0,181, 1, 0, 0,195, 1, 0, 0, 0, 0, 34, 0,195, 1, 0, 0,197, 1, 0, 0,
+ 0, 0, 34, 0,182, 1, 0, 0,196, 1, 0, 0, 0, 0, 34, 0,196, 1, 0, 0,198, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 34, 0,195, 1, 0, 0,215, 1, 0, 0, 0, 0, 34, 0,160, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,
+196, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,205, 1, 0, 0,217, 1, 0, 0, 0, 0, 34, 0,169, 1, 0, 0,205, 1, 0, 0,
+ 0, 0, 34, 0,170, 1, 0, 0,206, 1, 0, 0, 0, 0, 34, 0,206, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,205, 1, 0, 0,
+207, 1, 0, 0, 0, 0, 34, 0,167, 1, 0, 0,207, 1, 0, 0, 0, 0, 34, 0,168, 1, 0, 0,208, 1, 0, 0, 0, 0, 34, 0,
+206, 1, 0, 0,208, 1, 0, 0, 0, 0, 34, 0,207, 1, 0, 0,209, 1, 0, 0, 0, 0, 34, 0,165, 1, 0, 0,209, 1, 0, 0,
+ 0, 0, 34, 0,166, 1, 0, 0,210, 1, 0, 0, 0, 0, 34, 0,208, 1, 0, 0,210, 1, 0, 0, 0, 0, 34, 0,209, 1, 0, 0,
+211, 1, 0, 0, 0, 0, 34, 0,163, 1, 0, 0,211, 1, 0, 0, 0, 0, 34, 0,164, 1, 0, 0,212, 1, 0, 0, 0, 0, 34, 0,
+210, 1, 0, 0,212, 1, 0, 0, 0, 0, 34, 0,211, 1, 0, 0,213, 1, 0, 0, 0, 0, 34, 0,161, 1, 0, 0,213, 1, 0, 0,
+ 0, 0, 34, 0,162, 1, 0, 0,214, 1, 0, 0, 0, 0, 34, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 34, 0,213, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 34, 0,214, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,197, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,
+219, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,199, 1, 0, 0,219, 1, 0, 0, 0, 0, 34, 0,198, 1, 0, 0,222, 1, 0, 0,
+ 0, 0, 34, 0,200, 1, 0, 0,220, 1, 0, 0, 0, 0, 34, 0,220, 1, 0, 0,222, 1, 0, 0, 0, 0, 34, 0,221, 1, 0, 0,
+223, 1, 0, 0, 0, 0, 34, 0,223, 1, 0, 0,225, 1, 0, 0, 0, 0, 32, 0,219, 1, 0, 0,225, 1, 0, 0, 0, 0, 34, 0,
+222, 1, 0, 0,224, 1, 0, 0, 0, 0, 34, 0,220, 1, 0, 0,226, 1, 0, 0, 0, 0, 34, 0,224, 1, 0, 0,226, 1, 0, 0,
+ 0, 0, 32, 0,223, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,225, 1, 0, 0,
+227, 1, 0, 0, 0, 0, 34, 0,224, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,226, 1, 0, 0,228, 1, 0, 0, 0, 0, 34, 0,
+228, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,229, 1, 0, 0,231, 1, 0, 0, 0, 0, 34, 0,231, 1, 0, 0,233, 1, 0, 0,
+ 0, 0, 34, 0,227, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 34, 0,228, 1, 0, 0,
+234, 1, 0, 0, 0, 0, 34, 0,232, 1, 0, 0,234, 1, 0, 0, 0, 0, 34, 0,217, 1, 0, 0,227, 1, 0, 0, 0, 0, 34, 0,
+205, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,218, 1, 0, 0,228, 1, 0, 0, 0, 0, 34, 0,206, 1, 0, 0,234, 1, 0, 0,
+ 0, 0, 34, 0,193, 1, 0, 0,225, 1, 0, 0, 0, 0, 34, 0,194, 1, 0, 0,226, 1, 0, 0, 0, 0, 34, 0,203, 1, 0, 0,
+219, 1, 0, 0, 0, 0, 34, 0,204, 1, 0, 0,220, 1, 0, 0, 0, 0, 34, 0,215, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,
+216, 1, 0, 0,222, 1, 0, 0, 0, 0, 34, 0,213, 1, 0, 0,223, 1, 0, 0, 0, 0, 34, 0,214, 1, 0, 0,224, 1, 0, 0,
+ 0, 0, 34, 0,211, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,212, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,209, 1, 0, 0,
+231, 1, 0, 0, 0, 0, 34, 0,210, 1, 0, 0,232, 1, 0, 0, 0, 0, 34, 0,207, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,
+208, 1, 0, 0,234, 1, 0, 0, 0, 0, 34, 0,131, 1, 0, 0,245, 1, 0, 0, 0, 0, 34, 0,243, 1, 0, 0,245, 1, 0, 0,
+ 0, 0, 39, 0,133, 1, 0, 0,243, 1, 0, 0, 0, 0, 34, 0,132, 1, 0, 0,246, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 34, 0,244, 1, 0, 0,246, 1, 0, 0, 0, 0, 39, 0,241, 1, 0, 0,243, 1, 0, 0, 0, 0, 39, 0,
+135, 1, 0, 0,241, 1, 0, 0, 0, 0, 34, 0,136, 1, 0, 0,242, 1, 0, 0, 0, 0, 34, 0,242, 1, 0, 0,244, 1, 0, 0,
+ 0, 0, 39, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 39, 0,137, 1, 0, 0,239, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,
+240, 1, 0, 0, 0, 0, 34, 0,240, 1, 0, 0,242, 1, 0, 0, 0, 0, 39, 0,237, 1, 0, 0,239, 1, 0, 0, 0, 0, 39, 0,
+139, 1, 0, 0,237, 1, 0, 0, 0, 0, 34, 0,140, 1, 0, 0,238, 1, 0, 0, 0, 0, 34, 0,238, 1, 0, 0,240, 1, 0, 0,
+ 0, 0, 39, 0,235, 1, 0, 0,237, 1, 0, 0, 0, 0, 39, 0,141, 1, 0, 0,235, 1, 0, 0, 0, 0, 34, 0,142, 1, 0, 0,
+236, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 39, 0,235, 1, 0, 0,247, 1, 0, 0, 0, 0, 39, 0,
+129, 1, 0, 0,247, 1, 0, 0, 0, 0, 34, 0,130, 1, 0, 0,248, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,248, 1, 0, 0,
+ 0, 0, 39, 0,235, 1, 0, 0,243, 1, 0, 0, 0, 0, 34, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 34, 0,246, 1, 0, 0,248, 1, 0, 0, 0, 0, 34, 0,237, 1, 0, 0,241, 1, 0, 0, 0, 0, 34, 0,
+238, 1, 0, 0,242, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,247, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,248, 1, 0, 0,
+ 0, 0, 39, 0, 63, 1, 0, 0,245, 1, 0, 0, 0, 0, 39, 0, 64, 1, 0, 0,246, 1, 0, 0, 0, 0, 39, 0, 14, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,178, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,
+ 14, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0,112, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 24,194,181, 3, 58, 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,160,195,181, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 7,247,144, 32, 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,224,234,181, 3, 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, 3,161,254, 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, 68, 65, 84, 65, 0, 0, 39, 16, 3,161,214, 32, 0, 0, 0, 54, 0, 0, 1,244, 0, 0, 0, 45, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 43, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 46, 0, 0, 0, 44, 0, 0, 0, 1,
- 0, 0, 0, 43, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 44,
- 0, 0, 0, 42, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 7,
- 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 2,
- 0, 0, 0, 1, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 12,
- 0, 0, 0, 14, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,112, 0, 0, 0, 13, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 1,
- 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0,112, 0, 0, 0, 9,
- 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 19, 0, 0, 0, 17, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 18,
- 0, 0, 0, 20, 0, 0, 0,112, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 14,
- 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 23,
- 0, 0, 0, 25, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 0, 24, 0, 0, 0, 22, 0, 0, 0, 20, 0, 0, 0, 1,
- 0, 0, 0, 19, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 26, 0, 0, 0, 20,
- 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 29, 0, 0, 0, 27, 0, 0, 0, 1, 0, 0, 0, 30,
- 0, 0, 0, 32, 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0, 23, 0, 0, 0, 33, 0, 0, 0, 31, 0, 0, 0, 25,
- 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0, 0, 35,
- 0, 0, 0, 37, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 38, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 1,
- 0, 0, 0, 31, 0, 0, 0, 37, 0, 0, 0, 39, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 40, 0, 0, 0, 38, 0, 0, 0, 32,
- 0, 0, 0, 30, 0, 0, 0, 1, 0, 0, 0, 37, 0, 0, 0, 43, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 1, 0, 0, 0, 42,
- 0, 0, 0, 44, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0, 43, 0, 0, 0, 37,
- 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 45, 0, 0, 0, 35,
- 0, 0, 0, 49, 0, 0, 0, 47, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 0, 36, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 1,
- 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0, 49, 0, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 36,
- 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0, 0, 23, 0, 0, 0, 53, 0, 0, 0, 51, 0, 0, 0, 1, 0, 0, 0, 54,
- 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 23, 0, 0, 0, 21, 0, 0, 0, 55, 0, 0, 0, 53,
- 0, 0, 0, 1, 0, 0, 0, 56, 0, 0, 0, 22, 0, 0, 0, 24, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 12,
- 0, 0, 0, 57, 0, 0, 0, 55, 0, 0, 0, 1, 0, 0, 0, 58, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 56, 0, 0, 0, 1,
- 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, 62, 0, 0, 0, 11, 0, 0, 0, 13,
- 0, 0, 0, 58, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 61, 0, 0, 0, 1, 0, 0, 0, 64,
- 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 47, 0, 0, 0, 63,
- 0, 0, 0, 1, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 63,
- 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 48, 0, 0, 0, 64, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 61, 0, 0, 0, 63, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 62,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 62,
- 0, 0, 0, 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 57, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 58, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 53,
- 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 56, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 59, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 54, 0, 0, 0, 52, 0, 0, 0, 60,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 52,
- 0, 0, 0, 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 0, 48, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87, 0, 0, 0,171,
- 0, 0, 0,173, 0, 0, 0, 89, 0, 0, 0, 1, 0, 0, 0,173, 0, 0, 0,172, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 1,
- 0, 0, 0, 85, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0, 87, 0, 0, 0, 1, 0, 0, 0,172, 0, 0, 0,170, 0, 0, 0, 86,
- 0, 0, 0, 88, 0, 0, 0, 1, 0, 0, 0, 83, 0, 0, 0,167, 0, 0, 0,169, 0, 0, 0, 85, 0, 0, 0, 1, 0, 0, 0,170,
- 0, 0, 0,168, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 1, 0, 0, 0, 81, 0, 0, 0,165, 0, 0, 0,167, 0, 0, 0, 83,
- 0, 0, 0, 1, 0, 0, 0,168, 0, 0, 0,166, 0, 0, 0, 82, 0, 0, 0, 84, 0, 0, 0, 1, 0, 0, 0, 79, 0, 0, 0,163,
- 0, 0, 0,165, 0, 0, 0, 81, 0, 0, 0, 1, 0, 0, 0,166, 0, 0, 0,164, 0, 0, 0, 80, 0, 0, 0, 82, 0, 0, 0, 1,
- 0, 0, 0, 77, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,144, 0, 0, 0, 91, 0, 0, 0, 78,
- 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0, 90, 0, 0, 0, 92, 0, 0, 0,145, 0, 0, 0,143, 0, 0, 0, 1, 0, 0, 0,146,
- 0, 0, 0, 93, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 92, 0, 0, 0, 94, 0, 0, 0,147, 0, 0, 0,145,
- 0, 0, 0, 1, 0, 0, 0,148, 0, 0, 0, 95, 0, 0, 0, 93, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 94, 0, 0, 0, 96,
- 0, 0, 0,149, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,150, 0, 0, 0, 97, 0, 0, 0, 95, 0, 0, 0,148, 0, 0, 0, 1,
- 0, 0, 0, 96, 0, 0, 0, 98, 0, 0, 0,151, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0,152, 0, 0, 0, 99, 0, 0, 0, 97,
- 0, 0, 0,150, 0, 0, 0, 1, 0, 0, 0, 98, 0, 0, 0,100, 0, 0, 0,153, 0, 0, 0,151, 0, 0, 0, 1, 0, 0, 0,154,
- 0, 0, 0,101, 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0,102, 0, 0, 0,155, 0, 0, 0,153,
- 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,103, 0, 0, 0,101, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,102, 0, 0, 0,104,
- 0, 0, 0,157, 0, 0, 0,155, 0, 0, 0, 1, 0, 0, 0,158, 0, 0, 0,105, 0, 0, 0,103, 0, 0, 0,156, 0, 0, 0, 1,
- 0, 0, 0,104, 0, 0, 0,106, 0, 0, 0,159, 0, 0, 0,157, 0, 0, 0, 1, 0, 0, 0,160, 0, 0, 0,107, 0, 0, 0,105,
- 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0,106, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 66,
- 0, 0, 0, 65, 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,108, 0, 0, 0,125, 0, 0, 0,157, 0, 0, 0,159,
- 0, 0, 0, 1, 0, 0, 0,158, 0, 0, 0,126, 0, 0, 0,109, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,125, 0, 0, 0,176,
- 0, 0, 0,155, 0, 0, 0,157, 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,177, 0, 0, 0,126, 0, 0, 0,158, 0, 0, 0, 1,
- 0, 0, 0,123, 0, 0, 0,153, 0, 0, 0,155, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,154, 0, 0, 0,124,
- 0, 0, 0,177, 0, 0, 0, 1, 0, 0, 0,121, 0, 0, 0,151, 0, 0, 0,153, 0, 0, 0,123, 0, 0, 0, 1, 0, 0, 0,154,
- 0, 0, 0,152, 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0,119, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0,121,
- 0, 0, 0, 1, 0, 0, 0,152, 0, 0, 0,150, 0, 0, 0,120, 0, 0, 0,122, 0, 0, 0, 1, 0, 0, 0,117, 0, 0, 0,147,
- 0, 0, 0,149, 0, 0, 0,119, 0, 0, 0, 1, 0, 0, 0,150, 0, 0, 0,148, 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 1,
- 0, 0, 0,115, 0, 0, 0,145, 0, 0, 0,147, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0,148, 0, 0, 0,146, 0, 0, 0,116,
- 0, 0, 0,118, 0, 0, 0, 1, 0, 0, 0,113, 0, 0, 0,143, 0, 0, 0,145, 0, 0, 0,115, 0, 0, 0, 1, 0, 0, 0,146,
- 0, 0, 0,144, 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0,161, 0, 0, 0,143, 0, 0, 0,113,
- 0, 0, 0, 1, 0, 0, 0,144, 0, 0, 0,162, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0,178,
- 0, 0, 0,174, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,174, 0, 0, 0,179, 0, 0, 0,112, 0, 0, 0,162, 0, 0, 0, 1,
- 0, 0, 0,108, 0, 0, 0,159, 0, 0, 0, 66, 0, 0, 0,110, 0, 0, 0, 1, 0, 0, 0, 66, 0, 0, 0,160, 0, 0, 0,109,
- 0, 0, 0,111, 0, 0, 0, 1, 0, 0, 0,110, 0, 0, 0, 66, 0, 0, 0,175, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0,175,
- 0, 0, 0, 66, 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0,180, 0, 0, 0,175,
- 0, 0, 0, 1, 0, 0, 0,181, 0, 0, 0,179, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,132, 0, 0, 0,134,
- 0, 0, 0,173, 0, 0, 0,171, 0, 0, 0, 1, 0, 0, 0,173, 0, 0, 0,134, 0, 0, 0,133, 0, 0, 0,172, 0, 0, 0, 1,
- 0, 0, 0,130, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0,172, 0, 0, 0,133, 0, 0, 0,131,
- 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0,130, 0, 0, 0,169, 0, 0, 0,167, 0, 0, 0, 1, 0, 0, 0,170,
- 0, 0, 0,131, 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0,163, 0, 0, 0,184, 0, 0, 0,182, 0, 0, 0,165,
- 0, 0, 0, 1, 0, 0, 0,183, 0, 0, 0,185, 0, 0, 0,164, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0,167,
- 0, 0, 0,165, 0, 0, 0,182, 0, 0, 0, 1, 0, 0, 0,166, 0, 0, 0,168, 0, 0, 0,129, 0, 0, 0,183, 0, 0, 0, 1,
- 0, 0, 0,141, 0, 0, 0,187, 0, 0, 0,186, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0,186, 0, 0, 0,187, 0, 0, 0,142,
- 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0,182, 0, 0, 0,184, 0, 0, 0,186, 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,186,
- 0, 0, 0,185, 0, 0, 0,183, 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,127, 0, 0, 0,128, 0, 0, 0,182, 0, 0, 0, 67,
- 0, 0, 0, 1, 0, 0, 0,183, 0, 0, 0,129, 0, 0, 0,127, 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,139, 0, 0, 0,190,
- 0, 0, 0,188, 0, 0, 0,141, 0, 0, 0, 1, 0, 0, 0,189, 0, 0, 0,191, 0, 0, 0,140, 0, 0, 0,142, 0, 0, 0, 1,
- 0, 0, 0,137, 0, 0, 0,192, 0, 0, 0,190, 0, 0, 0,139, 0, 0, 0, 1, 0, 0, 0,191, 0, 0, 0,193, 0, 0, 0,138,
- 0, 0, 0,140, 0, 0, 0, 1, 0, 0, 0,136, 0, 0, 0,194, 0, 0, 0,192, 0, 0, 0,137, 0, 0, 0, 1, 0, 0, 0,193,
- 0, 0, 0,195, 0, 0, 0,136, 0, 0, 0,138, 0, 0, 0, 1, 0, 0, 0,135, 0, 0, 0, 69, 0, 0, 0,194, 0, 0, 0,136,
- 0, 0, 0, 1, 0, 0, 0,195, 0, 0, 0, 69, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0, 1, 0, 0, 0,187, 0, 0, 0,141,
- 0, 0, 0,188, 0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0,189, 0, 0, 0,142, 0, 0, 0,187, 0, 0, 0, 68, 0, 0, 0, 1,
- 0, 0, 0, 68, 0, 0, 0,188, 0, 0, 0,203, 0, 0, 0,205, 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,189, 0, 0, 0, 68,
- 0, 0, 0,205, 0, 0, 0, 1, 0, 0, 0, 69, 0, 0, 0,196, 0, 0, 0,197, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,198,
- 0, 0, 0,196, 0, 0, 0, 69, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,194, 0, 0, 0,197, 0, 0, 0,199, 0, 0, 0,192,
- 0, 0, 0, 1, 0, 0, 0,200, 0, 0, 0,198, 0, 0, 0,195, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,192, 0, 0, 0,199,
- 0, 0, 0,201, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0,200, 0, 0, 0,193, 0, 0, 0,191, 0, 0, 0, 1,
- 0, 0, 0,190, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0,188, 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,202, 0, 0, 0,191,
- 0, 0, 0,189, 0, 0, 0, 1, 0, 0, 0,196, 0, 0, 0,201, 0, 0, 0,199, 0, 0, 0,197, 0, 0, 0, 1, 0, 0, 0,200,
- 0, 0, 0,202, 0, 0, 0,196, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,196, 0, 0, 0,205, 0, 0, 0,203, 0, 0, 0,201,
- 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,205, 0, 0, 0,196, 0, 0, 0,202, 0, 0, 0, 1, 0, 0, 0,136, 0, 0, 0,137,
- 0, 0, 0,161, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0,162, 0, 0, 0,138, 0, 0, 0,136, 0, 0, 0,174, 0, 0, 0, 1,
- 0, 0, 0,137, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,209, 0, 0, 0,140, 0, 0, 0,138,
- 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0,139, 0, 0, 0,141, 0, 0, 0,210, 0, 0, 0,208, 0, 0, 0, 1, 0, 0, 0,211,
- 0, 0, 0,142, 0, 0, 0,140, 0, 0, 0,209, 0, 0, 0, 1, 0, 0, 0,141, 0, 0, 0,184, 0, 0, 0,163, 0, 0, 0,210,
- 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0,185, 0, 0, 0,142, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 79, 0, 0, 0,206,
- 0, 0, 0,210, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,211, 0, 0, 0,207, 0, 0, 0, 80, 0, 0, 0,164, 0, 0, 0, 1,
- 0, 0, 0,206, 0, 0, 0,212, 0, 0, 0,208, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0,209, 0, 0, 0,213, 0, 0, 0,207,
- 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 0,161, 0, 0, 0,208, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0,209,
- 0, 0, 0,162, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0,127, 0, 0, 0, 70, 0, 0, 0,219,
- 0, 0, 0, 1, 0, 0, 0, 70, 0, 0, 0,127, 0, 0, 0,129, 0, 0, 0,220, 0, 0, 0, 1, 0, 0, 0,130, 0, 0, 0,128,
- 0, 0, 0,219, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,220, 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0,218, 0, 0, 0, 1,
- 0, 0, 0,132, 0, 0, 0,130, 0, 0, 0,217, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,218, 0, 0, 0,131, 0, 0, 0,133,
- 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,134, 0, 0, 0,132, 0, 0, 0,215, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,216,
- 0, 0, 0,133, 0, 0, 0,134, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,214, 0, 0, 0,215, 0, 0, 0,226, 0, 0, 0,228,
- 0, 0, 0, 1, 0, 0, 0,227, 0, 0, 0,216, 0, 0, 0,214, 0, 0, 0,228, 0, 0, 0, 1, 0, 0, 0,215, 0, 0, 0,217,
- 0, 0, 0,224, 0, 0, 0,226, 0, 0, 0, 1, 0, 0, 0,225, 0, 0, 0,218, 0, 0, 0,216, 0, 0, 0,227, 0, 0, 0, 1,
- 0, 0, 0,217, 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0,224, 0, 0, 0, 1, 0, 0, 0,223, 0, 0, 0,220, 0, 0, 0,218,
- 0, 0, 0,225, 0, 0, 0, 1, 0, 0, 0,219, 0, 0, 0, 70, 0, 0, 0,221, 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0,221,
- 0, 0, 0, 70, 0, 0, 0,220, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0,221, 0, 0, 0,228, 0, 0, 0,226, 0, 0, 0,222,
- 0, 0, 0, 1, 0, 0, 0,227, 0, 0, 0,228, 0, 0, 0,221, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0,222, 0, 0, 0,226,
- 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,225, 0, 0, 0,227, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0,180, 0, 0, 0,178, 0, 0, 0,231, 0, 0, 0,229, 0, 0, 0, 1, 0, 0, 0,232, 0, 0, 0,179, 0, 0, 0,181,
- 0, 0, 0,230, 0, 0, 0, 1, 0, 0, 0,110, 0, 0, 0,180, 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 1, 0, 0, 0,230,
- 0, 0, 0,181, 0, 0, 0,111, 0, 0, 0,252, 0, 0, 0, 1, 0, 0, 0,108, 0, 0, 0,110, 0, 0, 0,251, 0, 0, 0,253,
- 0, 0, 0, 1, 0, 0, 0,252, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,254, 0, 0, 0, 1, 0, 0, 0,178, 0, 0, 0, 14,
- 0, 0, 0,249, 0, 0, 0,231, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0,232, 0, 0, 0, 1,
- 0, 0, 0, 14, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0,249, 0, 0, 0, 1, 0, 0, 0,248, 0, 0, 0,114, 0, 0, 0,112,
- 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 1, 0, 0, 0,246,
- 0, 0, 0,116, 0, 0, 0,114, 0, 0, 0,248, 0, 0, 0, 1, 0, 0, 0,115, 0, 0, 0,117, 0, 0, 0,243, 0, 0, 0,245,
- 0, 0, 0, 1, 0, 0, 0,244, 0, 0, 0,118, 0, 0, 0,116, 0, 0, 0,246, 0, 0, 0, 1, 0, 0, 0,117, 0, 0, 0,119,
- 0, 0, 0,241, 0, 0, 0,243, 0, 0, 0, 1, 0, 0, 0,242, 0, 0, 0,120, 0, 0, 0,118, 0, 0, 0,244, 0, 0, 0, 1,
- 0, 0, 0,119, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0,241, 0, 0, 0, 1, 0, 0, 0,240, 0, 0, 0,122, 0, 0, 0,120,
- 0, 0, 0,242, 0, 0, 0, 1, 0, 0, 0,121, 0, 0, 0,123, 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 1, 0, 0, 0,238,
- 0, 0, 0,124, 0, 0, 0,122, 0, 0, 0,240, 0, 0, 0, 1, 0, 0, 0,123, 0, 0, 0,176, 0, 0, 0,233, 0, 0, 0,237,
- 0, 0, 0, 1, 0, 0, 0,234, 0, 0, 0,177, 0, 0, 0,124, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0,176, 0, 0, 0,125,
- 0, 0, 0,235, 0, 0, 0,233, 0, 0, 0, 1, 0, 0, 0,236, 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0,234, 0, 0, 0, 1,
- 0, 0, 0,125, 0, 0, 0,108, 0, 0, 0,253, 0, 0, 0,235, 0, 0, 0, 1, 0, 0, 0,254, 0, 0, 0,109, 0, 0, 0,126,
- 0, 0, 0,236, 0, 0, 0, 1, 0, 0, 0,235, 0, 0, 0,253, 0, 0, 0,255, 0, 0, 1, 17, 0, 0, 0, 1, 0, 0, 1, 0,
- 0, 0, 0,254, 0, 0, 0,236, 0, 0, 1, 18, 0, 0, 0, 1, 0, 0, 0,233, 0, 0, 0,235, 0, 0, 1, 17, 0, 0, 1, 19,
- 0, 0, 0, 1, 0, 0, 1, 18, 0, 0, 0,236, 0, 0, 0,234, 0, 0, 1, 20, 0, 0, 0, 1, 0, 0, 0,237, 0, 0, 0,233,
- 0, 0, 1, 19, 0, 0, 1, 15, 0, 0, 0, 1, 0, 0, 1, 20, 0, 0, 0,234, 0, 0, 0,238, 0, 0, 1, 16, 0, 0, 0, 1,
- 0, 0, 0,239, 0, 0, 0,237, 0, 0, 1, 15, 0, 0, 1, 13, 0, 0, 0, 1, 0, 0, 1, 16, 0, 0, 0,238, 0, 0, 0,240,
- 0, 0, 1, 14, 0, 0, 0, 1, 0, 0, 0,241, 0, 0, 0,239, 0, 0, 1, 13, 0, 0, 1, 11, 0, 0, 0, 1, 0, 0, 1, 14,
- 0, 0, 0,240, 0, 0, 0,242, 0, 0, 1, 12, 0, 0, 0, 1, 0, 0, 0,243, 0, 0, 0,241, 0, 0, 1, 11, 0, 0, 1, 9,
- 0, 0, 0, 1, 0, 0, 1, 12, 0, 0, 0,242, 0, 0, 0,244, 0, 0, 1, 10, 0, 0, 0, 1, 0, 0, 0,245, 0, 0, 0,243,
- 0, 0, 1, 9, 0, 0, 1, 7, 0, 0, 0, 1, 0, 0, 1, 10, 0, 0, 0,244, 0, 0, 0,246, 0, 0, 1, 8, 0, 0, 0, 1,
- 0, 0, 0,247, 0, 0, 0,245, 0, 0, 1, 7, 0, 0, 1, 5, 0, 0, 0, 1, 0, 0, 1, 8, 0, 0, 0,246, 0, 0, 0,248,
- 0, 0, 1, 6, 0, 0, 0, 1, 0, 0, 0,249, 0, 0, 0,247, 0, 0, 1, 5, 0, 0, 1, 3, 0, 0, 0, 1, 0, 0, 1, 6,
- 0, 0, 0,248, 0, 0, 0,250, 0, 0, 1, 4, 0, 0, 0, 1, 0, 0, 0,231, 0, 0, 0,249, 0, 0, 1, 3, 0, 0, 1, 21,
- 0, 0, 0, 1, 0, 0, 1, 4, 0, 0, 0,250, 0, 0, 0,232, 0, 0, 1, 22, 0, 0, 0, 1, 0, 0, 0,253, 0, 0, 0,251,
- 0, 0, 1, 1, 0, 0, 0,255, 0, 0, 0, 1, 0, 0, 1, 2, 0, 0, 0,252, 0, 0, 0,254, 0, 0, 1, 0, 0, 0, 0, 1,
- 0, 0, 0,251, 0, 0, 0,229, 0, 0, 1, 23, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 24, 0, 0, 0,230, 0, 0, 0,252,
- 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0,229, 0, 0, 0,231, 0, 0, 1, 21, 0, 0, 1, 23, 0, 0, 0, 1, 0, 0, 1, 22,
- 0, 0, 0,232, 0, 0, 0,230, 0, 0, 1, 24, 0, 0, 0, 1, 0, 0, 0, 65, 0, 0, 0,106, 0, 0, 1, 25, 0, 0, 0, 71,
- 0, 0, 0, 1, 0, 0, 1, 26, 0, 0, 0,107, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 1, 0, 0, 0,106, 0, 0, 0,104,
- 0, 0, 1, 27, 0, 0, 1, 25, 0, 0, 0, 1, 0, 0, 1, 28, 0, 0, 0,105, 0, 0, 0,107, 0, 0, 1, 26, 0, 0, 0, 1,
- 0, 0, 0,104, 0, 0, 0,102, 0, 0, 1, 29, 0, 0, 1, 27, 0, 0, 0, 1, 0, 0, 1, 30, 0, 0, 0,103, 0, 0, 0,105,
- 0, 0, 1, 28, 0, 0, 0, 1, 0, 0, 0,102, 0, 0, 0,100, 0, 0, 1, 31, 0, 0, 1, 29, 0, 0, 0, 1, 0, 0, 1, 32,
- 0, 0, 0,101, 0, 0, 0,103, 0, 0, 1, 30, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 98, 0, 0, 1, 33, 0, 0, 1, 31,
- 0, 0, 0, 1, 0, 0, 1, 34, 0, 0, 0, 99, 0, 0, 0,101, 0, 0, 1, 32, 0, 0, 0, 1, 0, 0, 0, 98, 0, 0, 0, 96,
- 0, 0, 1, 35, 0, 0, 1, 33, 0, 0, 0, 1, 0, 0, 1, 36, 0, 0, 0, 97, 0, 0, 0, 99, 0, 0, 1, 34, 0, 0, 0, 1,
- 0, 0, 0, 96, 0, 0, 0, 94, 0, 0, 1, 37, 0, 0, 1, 35, 0, 0, 0, 1, 0, 0, 1, 38, 0, 0, 0, 95, 0, 0, 0, 97,
- 0, 0, 1, 36, 0, 0, 0, 1, 0, 0, 0, 94, 0, 0, 0, 92, 0, 0, 1, 39, 0, 0, 1, 37, 0, 0, 0, 1, 0, 0, 1, 40,
- 0, 0, 0, 93, 0, 0, 0, 95, 0, 0, 1, 38, 0, 0, 0, 1, 0, 0, 0, 92, 0, 0, 0, 90, 0, 0, 1, 41, 0, 0, 1, 39,
- 0, 0, 0, 1, 0, 0, 1, 42, 0, 0, 0, 91, 0, 0, 0, 93, 0, 0, 1, 40, 0, 0, 0, 1, 0, 0, 1, 49, 0, 0, 1, 50,
- 0, 0, 1, 69, 0, 0, 1, 79, 0, 0, 0, 1, 0, 0, 1, 70, 0, 0, 1, 50, 0, 0, 1, 49, 0, 0, 1, 80, 0, 0, 0, 1,
- 0, 0, 1, 48, 0, 0, 1, 49, 0, 0, 1, 79, 0, 0, 1, 77, 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 49, 0, 0, 1, 48,
- 0, 0, 1, 78, 0, 0, 0, 1, 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 1, 77, 0, 0, 1, 81, 0, 0, 0, 1, 0, 0, 1, 78,
- 0, 0, 1, 48, 0, 0, 1, 47, 0, 0, 1, 82, 0, 0, 0, 1, 0, 0, 0, 87, 0, 0, 0, 89, 0, 0, 1, 47, 0, 0, 1, 81,
- 0, 0, 0, 1, 0, 0, 1, 47, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 1, 82, 0, 0, 0, 1, 0, 0, 0, 85, 0, 0, 0, 87,
- 0, 0, 1, 81, 0, 0, 1, 75, 0, 0, 0, 1, 0, 0, 1, 82, 0, 0, 0, 88, 0, 0, 0, 86, 0, 0, 1, 76, 0, 0, 0, 1,
- 0, 0, 0, 83, 0, 0, 0, 85, 0, 0, 1, 75, 0, 0, 1, 71, 0, 0, 0, 1, 0, 0, 1, 76, 0, 0, 0, 86, 0, 0, 0, 84,
- 0, 0, 1, 72, 0, 0, 0, 1, 0, 0, 0, 81, 0, 0, 0, 83, 0, 0, 1, 71, 0, 0, 1, 73, 0, 0, 0, 1, 0, 0, 1, 72,
- 0, 0, 0, 84, 0, 0, 0, 82, 0, 0, 1, 74, 0, 0, 0, 1, 0, 0, 1, 71, 0, 0, 1, 77, 0, 0, 1, 79, 0, 0, 1, 73,
- 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 78, 0, 0, 1, 72, 0, 0, 1, 74, 0, 0, 0, 1, 0, 0, 1, 71, 0, 0, 1, 75,
- 0, 0, 1, 81, 0, 0, 1, 77, 0, 0, 0, 1, 0, 0, 1, 82, 0, 0, 1, 76, 0, 0, 1, 72, 0, 0, 1, 78, 0, 0, 0, 1,
- 0, 0, 1, 67, 0, 0, 1, 73, 0, 0, 1, 79, 0, 0, 1, 69, 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 74, 0, 0, 1, 68,
- 0, 0, 1, 70, 0, 0, 0, 1, 0, 0, 0, 79, 0, 0, 0, 81, 0, 0, 1, 73, 0, 0, 1, 67, 0, 0, 0, 1, 0, 0, 1, 74,
- 0, 0, 0, 82, 0, 0, 0, 80, 0, 0, 1, 68, 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 1, 83, 0, 0, 1, 85, 0, 0, 0,212,
- 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 1, 84, 0, 0, 0,207, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 79, 0, 0, 1, 67,
- 0, 0, 1, 83, 0, 0, 0,206, 0, 0, 0, 1, 0, 0, 1, 84, 0, 0, 1, 68, 0, 0, 0, 80, 0, 0, 0,207, 0, 0, 0, 1,
- 0, 0, 0, 77, 0, 0, 0,212, 0, 0, 1, 85, 0, 0, 1, 87, 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 0,213, 0, 0, 0, 78,
- 0, 0, 1, 88, 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 1, 87, 0, 0, 1, 41, 0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 1, 42,
- 0, 0, 1, 88, 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 1, 0, 0, 0, 75, 0, 0, 1, 65, 0, 0, 1, 93, 0, 0, 1, 45,
- 0, 0, 0, 1, 0, 0, 1, 94, 0, 0, 1, 66, 0, 0, 0, 75, 0, 0, 1, 45, 0, 0, 0, 1, 0, 0, 1, 45, 0, 0, 1, 93,
- 0, 0, 1, 91, 0, 0, 0, 76, 0, 0, 0, 1, 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 1, 45, 0, 0, 0, 76, 0, 0, 0, 1,
- 0, 0, 0, 76, 0, 0, 1, 91, 0, 0, 1, 89, 0, 0, 1, 46, 0, 0, 0, 1, 0, 0, 1, 90, 0, 0, 1, 92, 0, 0, 0, 76,
- 0, 0, 1, 46, 0, 0, 0, 1, 0, 0, 1, 46, 0, 0, 1, 89, 0, 0, 1, 69, 0, 0, 1, 50, 0, 0, 0, 1, 0, 0, 1, 70,
- 0, 0, 1, 90, 0, 0, 1, 46, 0, 0, 1, 50, 0, 0, 0, 1, 0, 0, 1, 67, 0, 0, 1, 69, 0, 0, 1, 89, 0, 0, 1, 83,
- 0, 0, 0, 1, 0, 0, 1, 90, 0, 0, 1, 70, 0, 0, 1, 68, 0, 0, 1, 84, 0, 0, 0, 1, 0, 0, 1, 37, 0, 0, 1, 39,
- 0, 0, 1, 59, 0, 0, 1, 51, 0, 0, 0, 1, 0, 0, 1, 60, 0, 0, 1, 40, 0, 0, 1, 38, 0, 0, 1, 52, 0, 0, 0, 1,
- 0, 0, 0, 74, 0, 0, 1, 57, 0, 0, 1, 65, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 1, 66, 0, 0, 1, 58, 0, 0, 0, 74,
- 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 1, 43, 0, 0, 1, 99, 0, 0, 1, 97, 0, 0, 1, 44, 0, 0, 0, 1, 0, 0, 1, 98,
- 0, 0, 1,100, 0, 0, 1, 43, 0, 0, 1, 44, 0, 0, 0, 1, 0, 0, 1, 44, 0, 0, 1, 97, 0, 0, 1, 95, 0, 0, 0, 73,
- 0, 0, 0, 1, 0, 0, 1, 96, 0, 0, 1, 98, 0, 0, 1, 44, 0, 0, 0, 73, 0, 0, 0, 1, 0, 0, 0, 73, 0, 0, 1, 95,
- 0, 0, 1, 57, 0, 0, 0, 74, 0, 0, 0, 1, 0, 0, 1, 58, 0, 0, 1, 96, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 1,
- 0, 0, 1, 33, 0, 0, 1, 35, 0, 0, 1,103, 0, 0, 1,105, 0, 0, 0, 1, 0, 0, 1,104, 0, 0, 1, 36, 0, 0, 1, 34,
- 0, 0, 1,106, 0, 0, 0, 1, 0, 0, 1,105, 0, 0, 1,103, 0, 0, 1,109, 0, 0, 1,107, 0, 0, 0, 1, 0, 0, 1,110,
- 0, 0, 1,104, 0, 0, 1,106, 0, 0, 1,108, 0, 0, 0, 1, 0, 0, 1,107, 0, 0, 1,109, 0, 0, 1,111, 0, 0, 1,113,
- 0, 0, 0, 1, 0, 0, 1,112, 0, 0, 1,110, 0, 0, 1,108, 0, 0, 1,114, 0, 0, 0, 1, 0, 0, 1,113, 0, 0, 1,111,
- 0, 0, 1,117, 0, 0, 1,115, 0, 0, 0, 1, 0, 0, 1,118, 0, 0, 1,112, 0, 0, 1,114, 0, 0, 1,116, 0, 0, 0, 1,
- 0, 0, 1, 55, 0, 0, 1,119, 0, 0, 1,115, 0, 0, 1,117, 0, 0, 0, 1, 0, 0, 1,116, 0, 0, 1,120, 0, 0, 1, 56,
- 0, 0, 1,118, 0, 0, 0, 1, 0, 0, 1, 57, 0, 0, 1, 95, 0, 0, 1,115, 0, 0, 1,119, 0, 0, 0, 1, 0, 0, 1,116,
- 0, 0, 1, 96, 0, 0, 1, 58, 0, 0, 1,120, 0, 0, 0, 1, 0, 0, 1, 95, 0, 0, 1, 97, 0, 0, 1,113, 0, 0, 1,115,
- 0, 0, 0, 1, 0, 0, 1,114, 0, 0, 1, 98, 0, 0, 1, 96, 0, 0, 1,116, 0, 0, 0, 1, 0, 0, 1, 97, 0, 0, 1, 99,
- 0, 0, 1,107, 0, 0, 1,113, 0, 0, 0, 1, 0, 0, 1,108, 0, 0, 1,100, 0, 0, 1, 98, 0, 0, 1,114, 0, 0, 0, 1,
- 0, 0, 1, 99, 0, 0, 1,101, 0, 0, 1,105, 0, 0, 1,107, 0, 0, 0, 1, 0, 0, 1,106, 0, 0, 1,102, 0, 0, 1,100,
- 0, 0, 1,108, 0, 0, 0, 1, 0, 0, 1, 31, 0, 0, 1, 33, 0, 0, 1,105, 0, 0, 1,101, 0, 0, 0, 1, 0, 0, 1,106,
- 0, 0, 1, 34, 0, 0, 1, 32, 0, 0, 1,102, 0, 0, 0, 1, 0, 0, 0, 72, 0, 0, 1,101, 0, 0, 1, 99, 0, 0, 1, 43,
- 0, 0, 0, 1, 0, 0, 1,100, 0, 0, 1,102, 0, 0, 0, 72, 0, 0, 1, 43, 0, 0, 0, 1, 0, 0, 1, 25, 0, 0, 1, 27,
- 0, 0, 1, 29, 0, 0, 1, 31, 0, 0, 0, 1, 0, 0, 1, 30, 0, 0, 1, 28, 0, 0, 1, 26, 0, 0, 1, 32, 0, 0, 0, 1,
- 0, 0, 1, 25, 0, 0, 1, 31, 0, 0, 1,101, 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 1,102, 0, 0, 1, 32, 0, 0, 1, 26,
- 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 0, 71, 0, 0, 1, 25, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,
- 0, 0, 1, 26, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 35, 0, 0, 1, 37, 0, 0, 1, 51, 0, 0, 1,103,
- 0, 0, 0, 1, 0, 0, 1, 52, 0, 0, 1, 38, 0, 0, 1, 36, 0, 0, 1,104, 0, 0, 0, 1, 0, 0, 1, 51, 0, 0, 1, 53,
- 0, 0, 1,109, 0, 0, 1,103, 0, 0, 0, 1, 0, 0, 1,110, 0, 0, 1, 54, 0, 0, 1, 52, 0, 0, 1,104, 0, 0, 0, 1,
- 0, 0, 1, 53, 0, 0, 1,123, 0, 0, 1,111, 0, 0, 1,109, 0, 0, 0, 1, 0, 0, 1,112, 0, 0, 1,124, 0, 0, 1, 54,
- 0, 0, 1,110, 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,117, 0, 0, 1,111, 0, 0, 1,123, 0, 0, 0, 1, 0, 0, 1,112,
- 0, 0, 1,118, 0, 0, 1, 56, 0, 0, 1,124, 0, 0, 0, 1, 0, 0, 1, 89, 0, 0, 1, 91, 0, 0, 1,127, 0, 0, 1,125,
- 0, 0, 0, 1, 0, 0, 1,128, 0, 0, 1, 92, 0, 0, 1, 90, 0, 0, 1,126, 0, 0, 0, 1, 0, 0, 1, 59, 0, 0, 1,125,
- 0, 0, 1,127, 0, 0, 1, 61, 0, 0, 0, 1, 0, 0, 1,128, 0, 0, 1,126, 0, 0, 1, 60, 0, 0, 1, 62, 0, 0, 0, 1,
- 0, 0, 1, 39, 0, 0, 1, 41, 0, 0, 1,125, 0, 0, 1, 59, 0, 0, 0, 1, 0, 0, 1,126, 0, 0, 1, 42, 0, 0, 1, 40,
- 0, 0, 1, 60, 0, 0, 0, 1, 0, 0, 1, 41, 0, 0, 1, 85, 0, 0, 1, 83, 0, 0, 1,125, 0, 0, 0, 1, 0, 0, 1, 84,
- 0, 0, 1, 86, 0, 0, 1, 42, 0, 0, 1,126, 0, 0, 0, 1, 0, 0, 1, 83, 0, 0, 1, 89, 0, 0, 1,125, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 1,126, 0, 0, 1, 90, 0, 0, 1, 84, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 41, 0, 0, 1, 87,
- 0, 0, 1, 85, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 1, 55, 0, 0, 1, 63, 0, 0, 1,121, 0, 0, 1,119, 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1, 64, 0, 0, 1, 56,
- 0, 0, 1,120, 0, 0, 0, 1, 0, 0, 1, 57, 0, 0, 1,119, 0, 0, 1,121, 0, 0, 1, 65, 0, 0, 0, 1, 0, 0, 1,122,
- 0, 0, 1,120, 0, 0, 1, 58, 0, 0, 1, 66, 0, 0, 0, 1, 0, 0, 1, 61, 0, 0, 1,127, 0, 0, 1,121, 0, 0, 1, 63,
- 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1,128, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 0, 1, 0, 0, 1, 91, 0, 0, 1, 93,
- 0, 0, 1,121, 0, 0, 1,127, 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1, 94, 0, 0, 1, 92, 0, 0, 1,128, 0, 0, 0, 1,
- 0, 0, 1, 65, 0, 0, 1,121, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 94, 0, 0, 1,122, 0, 0, 1, 66,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,129, 0, 0, 1,155, 0, 0, 1,143, 0, 0, 0, 1, 0, 0, 1,156,
- 0, 0, 1,130, 0, 0, 1,142, 0, 0, 1,144, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 1,139,
- 0, 0, 0, 1, 0, 0, 1,146, 0, 0, 1,144, 0, 0, 1,142, 0, 0, 1,140, 0, 0, 0, 1, 0, 0, 1,139, 0, 0, 1,145,
- 0, 0, 1,147, 0, 0, 1,137, 0, 0, 0, 1, 0, 0, 1,148, 0, 0, 1,146, 0, 0, 1,140, 0, 0, 1,138, 0, 0, 0, 1,
- 0, 0, 1,137, 0, 0, 1,147, 0, 0, 1,149, 0, 0, 1,135, 0, 0, 0, 1, 0, 0, 1,150, 0, 0, 1,148, 0, 0, 1,138,
- 0, 0, 1,136, 0, 0, 0, 1, 0, 0, 1,135, 0, 0, 1,149, 0, 0, 1,151, 0, 0, 1,133, 0, 0, 0, 1, 0, 0, 1,152,
- 0, 0, 1,150, 0, 0, 1,136, 0, 0, 1,134, 0, 0, 0, 1, 0, 0, 1,133, 0, 0, 1,151, 0, 0, 1,153, 0, 0, 1,131,
- 0, 0, 0, 1, 0, 0, 1,154, 0, 0, 1,152, 0, 0, 1,134, 0, 0, 1,132, 0, 0, 0, 1, 0, 0, 1,151, 0, 0, 1,161,
- 0, 0, 1,159, 0, 0, 1,153, 0, 0, 0, 1, 0, 0, 1,160, 0, 0, 1,162, 0, 0, 1,152, 0, 0, 1,154, 0, 0, 0, 1,
- 0, 0, 1,149, 0, 0, 1,163, 0, 0, 1,161, 0, 0, 1,151, 0, 0, 0, 1, 0, 0, 1,162, 0, 0, 1,164, 0, 0, 1,150,
- 0, 0, 1,152, 0, 0, 0, 1, 0, 0, 1,147, 0, 0, 1,165, 0, 0, 1,163, 0, 0, 1,149, 0, 0, 0, 1, 0, 0, 1,164,
- 0, 0, 1,166, 0, 0, 1,148, 0, 0, 1,150, 0, 0, 0, 1, 0, 0, 1,145, 0, 0, 1,167, 0, 0, 1,165, 0, 0, 1,147,
- 0, 0, 0, 1, 0, 0, 1,166, 0, 0, 1,168, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 1, 0, 0, 1,143, 0, 0, 1,169,
- 0, 0, 1,167, 0, 0, 1,145, 0, 0, 0, 1, 0, 0, 1,168, 0, 0, 1,170, 0, 0, 1,144, 0, 0, 1,146, 0, 0, 0, 1,
- 0, 0, 1,143, 0, 0, 1,155, 0, 0, 1,157, 0, 0, 1,169, 0, 0, 0, 1, 0, 0, 1,158, 0, 0, 1,156, 0, 0, 1,144,
- 0, 0, 1,170, 0, 0, 0, 1, 0, 0, 1, 59, 0, 0, 1, 61, 0, 0, 1,185, 0, 0, 1,183, 0, 0, 0, 1, 0, 0, 1,186,
- 0, 0, 1, 62, 0, 0, 1, 60, 0, 0, 1,184, 0, 0, 0, 1, 0, 0, 1, 61, 0, 0, 1,131, 0, 0, 1,153, 0, 0, 1,185,
- 0, 0, 0, 1, 0, 0, 1,154, 0, 0, 1,132, 0, 0, 1, 62, 0, 0, 1,186, 0, 0, 0, 1, 0, 0, 1, 51, 0, 0, 1, 59,
- 0, 0, 1,183, 0, 0, 1, 53, 0, 0, 0, 1, 0, 0, 1,184, 0, 0, 1, 60, 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 1,
- 0, 0, 1,123, 0, 0, 1,171, 0, 0, 1,155, 0, 0, 1,129, 0, 0, 0, 1, 0, 0, 1,156, 0, 0, 1,172, 0, 0, 1,124,
- 0, 0, 1,130, 0, 0, 0, 1, 0, 0, 1,153, 0, 0, 1,159, 0, 0, 1,181, 0, 0, 1,185, 0, 0, 0, 1, 0, 0, 1,182,
- 0, 0, 1,160, 0, 0, 1,154, 0, 0, 1,186, 0, 0, 0, 1, 0, 0, 1,179, 0, 0, 1,187, 0, 0, 1,185, 0, 0, 1,181,
- 0, 0, 0, 1, 0, 0, 1,186, 0, 0, 1,188, 0, 0, 1,180, 0, 0, 1,182, 0, 0, 0, 1, 0, 0, 1,175, 0, 0, 1,187,
- 0, 0, 1,179, 0, 0, 1,177, 0, 0, 0, 1, 0, 0, 1,180, 0, 0, 1,188, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 0, 1,
- 0, 0, 1,173, 0, 0, 1,189, 0, 0, 1,187, 0, 0, 1,175, 0, 0, 0, 1, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 1,174,
- 0, 0, 1,176, 0, 0, 0, 1, 0, 0, 1,171, 0, 0, 1,189, 0, 0, 1,173, 0, 0, 1,191, 0, 0, 0, 1, 0, 0, 1,174,
- 0, 0, 1,190, 0, 0, 1,172, 0, 0, 1,192, 0, 0, 0, 1, 0, 0, 1,155, 0, 0, 1,171, 0, 0, 1,191, 0, 0, 1,157,
- 0, 0, 0, 1, 0, 0, 1,192, 0, 0, 1,172, 0, 0, 1,156, 0, 0, 1,158, 0, 0, 0, 1, 0, 0, 1, 53, 0, 0, 1,189,
- 0, 0, 1,171, 0, 0, 1,123, 0, 0, 0, 1, 0, 0, 1,172, 0, 0, 1,190, 0, 0, 1, 54, 0, 0, 1,124, 0, 0, 0, 1,
- 0, 0, 1, 53, 0, 0, 1,183, 0, 0, 1,187, 0, 0, 1,189, 0, 0, 0, 1, 0, 0, 1,188, 0, 0, 1,184, 0, 0, 1, 54,
- 0, 0, 1,190, 0, 0, 0, 1, 0, 0, 1,183, 0, 0, 1,185, 0, 0, 1,187, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,188,
- 0, 0, 1,186, 0, 0, 1,184, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,157, 0, 0, 1,191, 0, 0, 1,193, 0, 0, 1,217,
- 0, 0, 0, 1, 0, 0, 1,194, 0, 0, 1,192, 0, 0, 1,158, 0, 0, 1,218, 0, 0, 0, 1, 0, 0, 1,191, 0, 0, 1,173,
- 0, 0, 1,203, 0, 0, 1,193, 0, 0, 0, 1, 0, 0, 1,204, 0, 0, 1,174, 0, 0, 1,192, 0, 0, 1,194, 0, 0, 0, 1,
- 0, 0, 1,173, 0, 0, 1,175, 0, 0, 1,201, 0, 0, 1,203, 0, 0, 0, 1, 0, 0, 1,202, 0, 0, 1,176, 0, 0, 1,174,
- 0, 0, 1,204, 0, 0, 0, 1, 0, 0, 1,175, 0, 0, 1,177, 0, 0, 1,199, 0, 0, 1,201, 0, 0, 0, 1, 0, 0, 1,200,
- 0, 0, 1,178, 0, 0, 1,176, 0, 0, 1,202, 0, 0, 0, 1, 0, 0, 1,177, 0, 0, 1,179, 0, 0, 1,197, 0, 0, 1,199,
- 0, 0, 0, 1, 0, 0, 1,198, 0, 0, 1,180, 0, 0, 1,178, 0, 0, 1,200, 0, 0, 0, 1, 0, 0, 1,179, 0, 0, 1,181,
- 0, 0, 1,195, 0, 0, 1,197, 0, 0, 0, 1, 0, 0, 1,196, 0, 0, 1,182, 0, 0, 1,180, 0, 0, 1,198, 0, 0, 0, 1,
- 0, 0, 1,181, 0, 0, 1,159, 0, 0, 1,215, 0, 0, 1,195, 0, 0, 0, 1, 0, 0, 1,216, 0, 0, 1,160, 0, 0, 1,182,
- 0, 0, 1,196, 0, 0, 0, 1, 0, 0, 1,169, 0, 0, 1,157, 0, 0, 1,217, 0, 0, 1,205, 0, 0, 0, 1, 0, 0, 1,218,
- 0, 0, 1,158, 0, 0, 1,170, 0, 0, 1,206, 0, 0, 0, 1, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 1,205, 0, 0, 1,207,
- 0, 0, 0, 1, 0, 0, 1,206, 0, 0, 1,170, 0, 0, 1,168, 0, 0, 1,208, 0, 0, 0, 1, 0, 0, 1,165, 0, 0, 1,167,
- 0, 0, 1,207, 0, 0, 1,209, 0, 0, 0, 1, 0, 0, 1,208, 0, 0, 1,168, 0, 0, 1,166, 0, 0, 1,210, 0, 0, 0, 1,
- 0, 0, 1,163, 0, 0, 1,165, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 1, 0, 0, 1,210, 0, 0, 1,166, 0, 0, 1,164,
- 0, 0, 1,212, 0, 0, 0, 1, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 1,211, 0, 0, 1,213, 0, 0, 0, 1, 0, 0, 1,212,
- 0, 0, 1,164, 0, 0, 1,162, 0, 0, 1,214, 0, 0, 0, 1, 0, 0, 1,159, 0, 0, 1,161, 0, 0, 1,213, 0, 0, 1,215,
- 0, 0, 0, 1, 0, 0, 1,214, 0, 0, 1,162, 0, 0, 1,160, 0, 0, 1,216, 0, 0, 0, 1, 0, 0, 1,199, 0, 0, 1,197,
- 0, 0, 1,221, 0, 0, 1,219, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,198, 0, 0, 1,200, 0, 0, 1,220, 0, 0, 0, 1,
- 0, 0, 1,219, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 1,225, 0, 0, 0, 1, 0, 0, 1,224, 0, 0, 1,222, 0, 0, 1,220,
- 0, 0, 1,226, 0, 0, 0, 1, 0, 0, 1,225, 0, 0, 1,223, 0, 0, 1,229, 0, 0, 1,227, 0, 0, 0, 1, 0, 0, 1,230,
- 0, 0, 1,224, 0, 0, 1,226, 0, 0, 1,228, 0, 0, 0, 1, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 1,231, 0, 0, 1,233,
- 0, 0, 0, 1, 0, 0, 1,232, 0, 0, 1,230, 0, 0, 1,228, 0, 0, 1,234, 0, 0, 0, 1, 0, 0, 1,205, 0, 0, 1,217,
- 0, 0, 1,227, 0, 0, 1,233, 0, 0, 0, 1, 0, 0, 1,228, 0, 0, 1,218, 0, 0, 1,206, 0, 0, 1,234, 0, 0, 0, 1,
- 0, 0, 1,193, 0, 0, 1,225, 0, 0, 1,227, 0, 0, 1,217, 0, 0, 0, 1, 0, 0, 1,228, 0, 0, 1,226, 0, 0, 1,194,
- 0, 0, 1,218, 0, 0, 0, 1, 0, 0, 1,193, 0, 0, 1,203, 0, 0, 1,219, 0, 0, 1,225, 0, 0, 0, 1, 0, 0, 1,220,
- 0, 0, 1,204, 0, 0, 1,194, 0, 0, 1,226, 0, 0, 0, 1, 0, 0, 1,199, 0, 0, 1,219, 0, 0, 1,203, 0, 0, 1,201,
- 0, 0, 0, 1, 0, 0, 1,204, 0, 0, 1,220, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 1, 0, 0, 1,195, 0, 0, 1,215,
- 0, 0, 1,221, 0, 0, 1,197, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,216, 0, 0, 1,196, 0, 0, 1,198, 0, 0, 0, 1,
- 0, 0, 1,213, 0, 0, 1,223, 0, 0, 1,221, 0, 0, 1,215, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,224, 0, 0, 1,214,
- 0, 0, 1,216, 0, 0, 0, 1, 0, 0, 1,211, 0, 0, 1,229, 0, 0, 1,223, 0, 0, 1,213, 0, 0, 0, 1, 0, 0, 1,224,
- 0, 0, 1,230, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 1, 0, 0, 1,209, 0, 0, 1,231, 0, 0, 1,229, 0, 0, 1,211,
- 0, 0, 0, 1, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 1,210, 0, 0, 1,212, 0, 0, 0, 1, 0, 0, 1,207, 0, 0, 1,233,
- 0, 0, 1,231, 0, 0, 1,209, 0, 0, 0, 1, 0, 0, 1,232, 0, 0, 1,234, 0, 0, 1,208, 0, 0, 1,210, 0, 0, 0, 1,
- 0, 0, 1,205, 0, 0, 1,233, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,208, 0, 0, 1,234, 0, 0, 1,206,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,133, 0, 0, 1,131, 0, 0, 1,245, 0, 0, 1,243, 0, 0, 0, 1, 0, 0, 1,246,
- 0, 0, 1,132, 0, 0, 1,134, 0, 0, 1,244, 0, 0, 0, 1, 0, 0, 1,135, 0, 0, 1,133, 0, 0, 1,243, 0, 0, 1,241,
- 0, 0, 0, 1, 0, 0, 1,244, 0, 0, 1,134, 0, 0, 1,136, 0, 0, 1,242, 0, 0, 0, 1, 0, 0, 1,137, 0, 0, 1,135,
- 0, 0, 1,241, 0, 0, 1,239, 0, 0, 0, 1, 0, 0, 1,242, 0, 0, 1,136, 0, 0, 1,138, 0, 0, 1,240, 0, 0, 0, 1,
- 0, 0, 1,139, 0, 0, 1,137, 0, 0, 1,239, 0, 0, 1,237, 0, 0, 0, 1, 0, 0, 1,240, 0, 0, 1,138, 0, 0, 1,140,
- 0, 0, 1,238, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,139, 0, 0, 1,237, 0, 0, 1,235, 0, 0, 0, 1, 0, 0, 1,238,
- 0, 0, 1,140, 0, 0, 1,142, 0, 0, 1,236, 0, 0, 0, 1, 0, 0, 1,129, 0, 0, 1,141, 0, 0, 1,235, 0, 0, 1,247,
- 0, 0, 0, 1, 0, 0, 1,236, 0, 0, 1,142, 0, 0, 1,130, 0, 0, 1,248, 0, 0, 0, 1, 0, 0, 1,235, 0, 0, 1,243,
- 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1,244, 0, 0, 1,236, 0, 0, 1,248, 0, 0, 0, 1,
- 0, 0, 1,235, 0, 0, 1,237, 0, 0, 1,241, 0, 0, 1,243, 0, 0, 0, 1, 0, 0, 1,242, 0, 0, 1,238, 0, 0, 1,236,
- 0, 0, 1,244, 0, 0, 0, 1, 0, 0, 1,237, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,242,
- 0, 0, 1,240, 0, 0, 1,238, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,123, 0, 0, 1,129, 0, 0, 1,247,
- 0, 0, 0, 1, 0, 0, 1,130, 0, 0, 1,124, 0, 0, 1, 56, 0, 0, 1,248, 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,247,
- 0, 0, 1,245, 0, 0, 1, 63, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1,248, 0, 0, 1, 56, 0, 0, 1, 64, 0, 0, 0, 1,
- 0, 0, 1, 61, 0, 0, 1, 63, 0, 0, 1,245, 0, 0, 1,131, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1, 64, 0, 0, 1, 62,
- 0, 0, 1,132, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 85,240, 7,247,144, 32, 0, 0, 0, 65, 0, 0, 1,244, 63, 28,112, 3,
- 62,236,178,185, 63, 27,124,224, 62,232, 65,235, 63, 30, 63,144, 62,226,195,233, 63, 32,152,118, 62,236,167, 37, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,209,232, 2, 62,226, 21,222, 62,215,109,102, 62,231,147,222, 62,213,135, 28, 62,236, 4,172,
- 62,205, 54, 56, 62,235,249, 22, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 32,152,118, 62,236,167, 37, 63, 30, 63,144,
- 62,226,195,233, 63, 33,235,108, 62,220,235,197, 63, 37,151,209, 62,236,161, 89, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,202,144, 76, 62,220, 61,186, 62,209,232, 2, 62,226, 21,222, 62,205, 54, 56, 62,235,249, 22, 62,195, 55,128, 62,235,243, 70,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 30, 63,144, 62,226,195,233, 63, 25, 55, 20, 62,223, 35, 1, 63, 25,178,200,
- 62,214,233, 77, 63, 33,235,108, 62,220,235,197, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,219, 1,146, 62,214, 59, 66,
- 62,219,248,248, 62,222,116,246, 62,209,232, 2, 62,226, 21,222, 62,202,144, 76, 62,220, 61,186, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 27,124,224, 62,232, 65,235, 63, 24,252, 87, 62,230,111, 93, 63, 25, 55, 20, 62,223, 35, 1, 63, 30, 63,144,
- 62,226,195,233, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,219,248,248, 62,222,116,246, 62,220,110,118, 62,229,193, 78,
- 62,215,109,102, 62,231,147,222, 62,209,232, 2, 62,226, 21,222, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 24,252, 87,
- 62,230,111, 93, 63, 22,195, 22, 62,232, 90,195, 63, 20, 91,191, 62,227, 18,193, 63, 25, 55, 20, 62,223, 35, 1, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,229,175,162, 62,226,100,178, 62,224,224,248, 62,231,172,182, 62,220,110,118, 62,229,193, 78,
- 62,219,248,248, 62,222,116,246, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 55, 20, 62,223, 35, 1, 63, 20, 91,191,
- 62,227, 18,193, 63, 17,165,187, 62,221, 6,225, 63, 25,178,200, 62,214,233, 77, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,235, 27,170, 62,220, 88,214, 62,229,175,162, 62,226,100,178, 62,219,248,248, 62,222,116,246, 62,219, 1,146, 62,214, 59, 66,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 20, 91,191, 62,227, 18,193, 63, 18, 18,164, 62,236,201,173, 63, 13,231,157,
- 62,236,161, 89, 63, 17,165,187, 62,221, 6,225, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,242,151,232, 62,235,243, 70,
- 62,234, 65,216, 62,236, 27,158, 62,229,175,162, 62,226,100,178, 62,235, 27,170, 62,220, 88,214, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 22,195, 22, 62,232, 90,195, 63, 21,202, 11, 62,236,189, 1, 63, 18, 18,164, 62,236,201,173, 63, 20, 91,191,
- 62,227, 18,193, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,234, 65,216, 62,236, 27,158, 62,226,211, 12, 62,236, 14,246,
- 62,224,224,248, 62,231,172,182, 62,229,175,162, 62,226,100,178, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 21,202, 11,
- 62,236,189, 1, 63, 22,202,215, 62,241,124,237, 63, 20,105,125, 62,246, 71, 1, 63, 18, 18,164, 62,236,201,173, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,229,148, 42, 62,245,152,246, 62,224,209,112, 62,240,206,226, 62,226,211, 12, 62,236, 14,246,
- 62,234, 65,216, 62,236, 27,158, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 18, 18,164, 62,236,201,173, 63, 20,105,125,
- 62,246, 71, 1, 63, 17,173, 44, 62,252,149,231, 63, 13,231,157, 62,236,161, 89, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,235, 12,206, 62,251,231,218, 62,229,148, 42, 62,245,152,246, 62,234, 65,216, 62,236, 27,158, 62,242,151,232, 62,235,243, 70,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 20,105,125, 62,246, 71, 1, 63, 25, 59, 37, 62,250, 73, 49, 63, 25,178,108,
- 63, 1,108,218, 63, 17,173, 44, 62,252,149,231, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,219, 2, 76, 63, 1, 21,213,
- 62,219,240,216, 62,249,155, 38, 62,229,148, 42, 62,245,152,246, 62,235, 12,206, 62,251,231,218, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 22,202,215, 62,241,124,237, 63, 25, 1,195, 62,243,102,169, 63, 25, 59, 37, 62,250, 73, 49, 63, 20,105,125,
- 62,246, 71, 1, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,219,240,216, 62,249,155, 38, 62,220, 99,156, 62,242,184,154,
- 62,224,209,112, 62,240,206,226, 62,229,148, 42, 62,245,152,246, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 1,195,
- 62,243,102,169, 63, 27,125,176, 62,241,145,149, 63, 30, 74,167, 62,246,153, 3, 63, 25, 59, 37, 62,250, 73, 49, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,209,209,212, 62,245,234,246, 62,215,107,192, 62,240,227,138, 62,220, 99,156, 62,242,184,154,
- 62,219,240,216, 62,249,155, 38, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 59, 37, 62,250, 73, 49, 63, 30, 74,167,
- 62,246,153, 3, 63, 33,230,204, 62,252,232,107, 63, 25,178,108, 63, 1,108,218, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,202,153,132, 62,252, 58, 94, 62,209,209,212, 62,245,234,246, 62,219,240,216, 62,249,155, 38, 62,219, 2, 76, 63, 1, 21,213,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 30, 74,167, 62,246,153, 3, 63, 32,152,118, 62,236,167, 37, 63, 37,151,209,
- 62,236,161, 89, 63, 33,230,204, 62,252,232,107, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,195, 55,128, 62,235,243, 70,
- 62,205, 54, 56, 62,235,249, 22, 62,209,209,212, 62,245,234,246, 62,202,153,132, 62,252, 58, 94, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 27,125,176, 62,241,145,149, 63, 28,112, 3, 62,236,178,185, 63, 32,152,118, 62,236,167, 37, 63, 30, 74,167,
- 62,246,153, 3, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,205, 54, 56, 62,235,249, 22, 62,213,135, 28, 62,236, 4,172,
- 62,215,107,192, 62,240,227,138, 62,209,209,212, 62,245,234,246, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 28,112, 3,
- 62,236,178,185, 63, 27,125,176, 62,241,145,149, 63, 27, 39, 42, 62,241, 1, 57, 63, 27,249,140, 62,236,186,115, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,216, 24,206, 62,240, 83, 46, 62,215,107,192, 62,240,227,138, 62,213,135, 28, 62,236, 4,172,
- 62,214,116, 8, 62,236, 12,102, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 27,125,176, 62,241,145,149, 63, 25, 1,195,
- 62,243,102,169, 63, 24,248, 6, 62,242, 91,185, 63, 27, 39, 42, 62,241, 1, 57, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,220,119, 22, 62,241,173,174, 62,220, 99,156, 62,242,184,154, 62,215,107,192, 62,240,227,138, 62,216, 24,206, 62,240, 83, 46,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 1,195, 62,243,102,169, 63, 22,202,215, 62,241,124,237, 63, 23, 38,157,
- 62,240,173,225, 63, 24,248, 6, 62,242, 91,185, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,224, 25,234, 62,239,255,214,
- 62,224,209,112, 62,240,206,226, 62,220, 99,156, 62,242,184,154, 62,220,119, 22, 62,241,173,174, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 22,202,215, 62,241,124,237, 63, 21,202, 11, 62,236,189, 1, 63, 22, 89, 13, 62,236,196,247, 63, 23, 38,157,
- 62,240,173,225, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,225,181, 8, 62,236, 22,234, 62,226,211, 12, 62,236, 14,246,
- 62,224,209,112, 62,240,206,226, 62,224, 25,234, 62,239,255,214, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 21,202, 11,
- 62,236,189, 1, 63, 22,195, 22, 62,232, 90,195, 63, 23, 33, 88, 62,233, 47, 69, 63, 22, 89, 13, 62,236,196,247, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62,224, 36,112, 62,232,129, 58, 62,224,224,248, 62,231,172,182, 62,226,211, 12, 62,236, 14,246,
- 62,225,181, 8, 62,236, 22,234, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 22,195, 22, 62,232, 90,195, 63, 24,252, 87,
- 62,230,111, 93, 63, 24,243,100, 62,231,123, 5, 63, 23, 33, 88, 62,233, 47, 69, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,220,128, 90, 62,230,204,248, 62,220,110,118, 62,229,193, 78, 62,224,224,248, 62,231,172,182, 62,224, 36,112, 62,232,129, 58,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 24,252, 87, 62,230,111, 93, 63, 27,124,224, 62,232, 65,235, 63, 27, 37,169,
- 62,232,211, 35, 63, 24,243,100, 62,231,123, 5, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,216, 27,206, 62,232, 37, 22,
- 62,215,109,102, 62,231,147,222, 62,220,110,118, 62,229,193, 78, 62,220,128, 90, 62,230,204,248, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,240, 63, 27,124,224, 62,232, 65,235, 63, 28,112, 3, 62,236,178,185, 63, 27,249,140, 62,236,186,115, 63, 27, 37,169,
- 62,232,211, 35, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,214,116, 8, 62,236, 12,102, 62,213,135, 28, 62,236, 4,172,
- 62,215,109,102, 62,231,147,222, 62,216, 27,206, 62,232, 37, 22, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,240, 63, 24,242,138,
- 62,236,194, 21, 63, 27, 37,169, 62,232,211, 35, 63, 27,249,140, 62,236,186,115, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,112, 62,214,116, 8, 62,236, 12,102, 62,216, 27,206, 62,232, 37, 22, 62,220,130, 16, 62,236, 20, 6,
- 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,243,100, 62,231,123, 5, 63, 27, 37,169,
- 62,232,211, 35, 63, 24,242,138, 62,236,194, 21, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112,
- 62,220,130, 16, 62,236, 20, 6, 62,216, 27,206, 62,232, 37, 22, 62,220,128, 90, 62,230,204,248, 63,128, 0, 0, 63,128, 0, 0,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 23, 33, 88, 62,233, 47, 69, 63, 24,243,100,
- 62,231,123, 5, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 62,220,128, 90, 62,230,204,248,
- 62,224, 36,112, 62,232,129, 58, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 22, 89, 13, 62,236,196,247, 63, 23, 33, 88, 62,233, 47, 69, 63,128, 0, 0,
- 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 62,224, 36,112, 62,232,129, 58, 62,225,181, 8, 62,236, 22,234,
- 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138,
- 62,236,194, 21, 63, 23, 38,157, 62,240,173,225, 63, 22, 89, 13, 62,236,196,247, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,112, 62,225,181, 8, 62,236, 22,234, 62,224, 25,234, 62,239,255,214, 62,220,130, 16, 62,236, 20, 6,
- 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 24,248, 6,
- 62,242, 91,185, 63, 23, 38,157, 62,240,173,225, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112,
- 62,224, 25,234, 62,239,255,214, 62,220,119, 22, 62,241,173,174, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,
- 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 27, 39, 42, 62,241, 1, 57, 63, 24,248, 6,
- 62,242, 91,185, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 62,220,119, 22, 62,241,173,174,
- 62,216, 24,206, 62,240, 83, 46, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5,
- 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 27,249,140, 62,236,186,115, 63, 27, 39, 42, 62,241, 1, 57, 63,128, 0, 0,
- 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 62,216, 24,206, 62,240, 83, 46, 62,214,116, 8, 62,236, 12,102,
- 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 61, 0, 0, 5, 0, 0, 0,112, 63, 16,254,174,
- 62, 34, 45, 94, 63, 13,190, 79, 62, 46,193,160, 63, 3,199,220, 62, 24,219, 89, 63, 3,199,219, 61,229, 28, 18, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 16, 63, 3,199,220, 62, 24,219, 89, 62,243,150, 14, 62, 47, 79,204, 62,236,248,140, 62, 34,202,182,
- 63, 3,199,219, 61,229, 28, 18, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 21,152,184, 62, 53, 47,182, 63, 16,104,250,
- 62, 55,113, 16, 63, 13,190, 79, 62, 46,193,160, 63, 16,254,174, 62, 34, 45, 94, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128,
- 62,243,150, 14, 62, 47, 79,204, 62,238, 68,200, 62, 56, 62, 76, 62,227,207,183, 62, 54, 75,250, 62,236,248,140, 62, 34,202,182,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 63, 22, 57,137, 62, 61, 93, 81, 63, 16,186,206, 62, 72,129, 85, 63, 16,104,250,
- 62, 55,113, 16, 63, 21,152,184, 62, 53, 47,182, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,238, 68,200, 62, 56, 62, 76,
- 62,237,187,192, 62, 73,118,194, 62,226,152,122, 62, 62,166,190, 62,227,207,183, 62, 54, 75,250, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 22,249,250, 62, 88,251,160, 63, 16, 32,222, 62, 93,106, 34, 63, 16,186,206, 62, 72,129, 85, 63, 22, 57,137,
- 62, 61, 93, 81, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,237,187,192, 62, 73,118,194, 62,239, 19, 21, 62, 94,110,121,
- 62,225, 83, 90, 62, 90,153, 21, 62,226,152,122, 62, 62,166,190, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 15,243,206, 62,136,207,182, 63, 16, 32,222, 62, 93,106, 34, 63, 22,249,250, 62, 88,251,160, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,239, 19, 21, 62, 94,110,121, 62,239,193, 92, 62,137, 61,113, 62,221, 42, 54, 62,133, 25,209,
- 62,225, 83, 90, 62, 90,153, 21, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 37, 94, 91,
- 62,187,120,107, 63, 30, 21, 66, 62,200,139,178, 63, 12,237,158, 62,187,241, 38, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,211,125,139, 62,200,171,170, 62,197, 28,156, 62,187,130,166, 62,216, 21,115, 62,166,177, 14, 62,245,175, 15, 62,188, 14,188,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37, 94, 91, 62,187,120,107, 63, 43, 57, 87, 62,206, 58,222, 63, 39,163, 24,
- 62,216, 95,174, 63, 30, 21, 66, 62,200,139,178, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,191,194, 98, 62,216, 94, 42,
- 62,184,207,130, 62,206, 27, 42, 62,197, 28,156, 62,187,130,166, 62,211,125,139, 62,200,171,170, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 43, 57, 87, 62,206, 58,222, 63, 50,229, 38, 62,226, 32,169, 63, 43, 79,177, 62,231,194,202, 63, 39,163, 24,
- 62,216, 95,174, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,183,201, 60, 62,231,218, 82, 62,168, 39,196, 62,226, 11,206,
- 62,184,207,130, 62,206, 27, 42, 62,191,194, 98, 62,216, 94, 42, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 50,229, 38,
- 62,226, 32,169, 63, 48,134, 62, 62,249,107, 37, 63, 43,190,154, 62,249, 0,192, 63, 43, 79,177, 62,231,194,202, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,182,190,138, 62,249, 49, 35, 62,172,229,172, 62,249,127,116, 62,168, 39,196, 62,226, 11,206,
- 62,183,201, 60, 62,231,218, 82, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 48,134, 62, 62,249,107, 37, 63, 46, 88,238,
- 63, 2,223,146, 63, 40,207,123, 62,254,175,218, 63, 43,190,154, 62,249, 0,192, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,188,184, 2, 62,255, 0,140, 62,177, 87,173, 63, 3, 9,102, 62,172,229,172, 62,249,127,116, 62,182,190,138, 62,249, 49, 35,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 46, 88,238, 63, 2,223,146, 63, 34,158,220, 63, 10, 23,175, 63, 30, 77,126,
- 63, 5, 88,156, 63, 40,207,123, 62,254,175,218, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,210, 65, 89, 63, 5,158, 56,
- 62,201,109,124, 63, 10,121, 72, 62,177, 87,173, 63, 3, 9,102, 62,188,184, 2, 62,255, 0,140, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 34,158,220, 63, 10, 23,175, 63, 26,105, 28, 63, 11,194,242, 63, 25,120,244, 63, 7,242, 78, 63, 30, 77,126,
- 63, 5, 88,156, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,220, 39, 0, 63, 8, 58,252, 62,218, 73,220, 63, 12, 31,169,
- 62,201,109,124, 63, 10,121, 72, 62,210, 65, 89, 63, 5,158, 56, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 26,105, 28,
- 63, 11,194,242, 63, 22,244,173, 63, 11,215,236, 63, 22, 47,202, 63, 8, 60,156, 63, 25,120,244, 63, 7,242, 78, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,226,221, 11, 63, 8,125, 90, 62,225, 89,220, 63, 12, 42, 77, 62,218, 73,220, 63, 12, 31,169,
- 62,220, 39, 0, 63, 8, 58,252, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,244,173, 63, 11,215,236, 63, 11,169, 67,
- 63, 11,197, 18, 63, 12,252,106, 63, 3,173,180, 63, 22, 47,202, 63, 8, 60,156, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,245,114, 35, 63, 3,196,233, 62,248, 72, 55, 63, 11,232, 91, 62,225, 89,220, 63, 12, 42, 77, 62,226,221, 11, 63, 8,125, 90,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 11,169, 67, 63, 11,197, 18, 63, 3,232,148, 63, 11, 17,164, 63, 3,220,162,
- 63, 0, 88, 45, 63, 12,252,106, 63, 3,173,180, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,220,162, 63, 0, 88, 45,
- 63, 3,232,148, 63, 11, 17,164, 62,248, 72, 55, 63, 11,232, 91, 62,245,114, 35, 63, 3,196,233, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120, 63, 22, 81,240, 63, 1, 70,114, 63, 22, 47,202, 63, 8, 60,156, 63, 12,252,106,
- 63, 3,173,180, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,226,221, 11, 63, 8,125, 90, 62,226,128,106, 63, 1,111,198,
- 62,236,213,209, 62,255,250, 4, 62,245,114, 35, 63, 3,196,233, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22, 81,240,
- 63, 1, 70,114, 63, 25,182,151, 63, 1, 9,130, 63, 25,120,244, 63, 7,242, 78, 63, 22, 47,202, 63, 8, 60,156, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,220, 39, 0, 63, 8, 58,252, 62,219,150,213, 63, 1, 55, 50, 62,226,128,106, 63, 1,111,198,
- 62,226,221, 11, 63, 8,125, 90, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 30, 49, 96, 62,254,229,121, 63, 30, 77,126,
- 63, 5, 88,156, 63, 25,120,244, 63, 7,242, 78, 63, 25,182,151, 63, 1, 9,130, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,220, 39, 0, 63, 8, 58,252, 62,210, 65, 89, 63, 5,158, 56, 62,210,116,176, 62,255, 62,227, 62,219,150,213, 63, 1, 55, 50,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37,113, 25, 62,247,157, 35, 63, 40,207,123, 62,254,175,218, 63, 30, 77,126,
- 63, 5, 88,156, 63, 30, 49, 96, 62,254,229,121, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,210, 65, 89, 63, 5,158, 56,
- 62,188,184, 2, 62,255, 0,140, 62,195,165,189, 62,247,232,139, 62,210,116,176, 62,255, 62,227, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 39, 62, 92, 62,240, 75,121, 63, 43,190,154, 62,249, 0,192, 63, 40,207,123, 62,254,175,218, 63, 37,113, 25,
- 62,247,157, 35, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,184, 2, 62,255, 0,140, 62,182,190,138, 62,249, 49, 35,
- 62,192, 10,222, 62,240,128,163, 62,195,165,189, 62,247,232,139, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 38,149,140,
- 62,229, 95, 38, 63, 43, 79,177, 62,231,194,202, 63, 43,190,154, 62,249, 0,192, 63, 39, 62, 92, 62,240, 75,121, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,182,190,138, 62,249, 49, 35, 62,183,201, 60, 62,231,218, 82, 62,193,140,168, 62,229,129, 94,
- 62,192, 10,222, 62,240,128,163, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 33,120, 14, 62,214,238,166, 63, 39,163, 24,
- 62,216, 95,174, 63, 43, 79,177, 62,231,194,202, 63, 38,149,140, 62,229, 95, 38, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,183,201, 60, 62,231,218, 82, 62,191,194, 98, 62,216, 94, 42, 62,204, 75,168, 62,215, 7, 62, 62,193,140,168, 62,229,129, 94,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,178,165, 62,208, 17,128, 63, 30, 21, 66, 62,200,139,178, 63, 39,163, 24,
- 62,216, 95,174, 63, 33,120, 14, 62,214,238,166, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,191,194, 98, 62,216, 94, 42,
- 62,211,125,139, 62,200,171,170, 62,216, 24, 6, 62,208, 57,128, 62,204, 75,168, 62,215, 7, 62, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 17, 97, 15, 62,214, 34,220, 63, 12,237,158, 62,187,241, 38, 63, 30, 21, 66, 62,200,139,178, 63, 27,178,165,
- 62,208, 17,128, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,211,125,139, 62,200,171,170, 62,245,175, 15, 62,188, 14,188,
- 62,236,200,217, 62,214, 49,134, 62,216, 24, 6, 62,208, 57,128, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 97, 15,
- 62,214, 34,220, 63, 14,244,149, 62,221, 42, 4, 63, 3,230,147, 62,208, 47, 78, 63, 12,237,158, 62,187,241, 38, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,230,147, 62,208, 47, 78, 62,241,144,141, 62,221, 52,244, 62,236,200,217, 62,214, 49,134,
- 62,245,175, 15, 62,188, 14,188, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120, 63, 12,252,106,
- 63, 3,173,180, 63, 3,220,162, 63, 0, 88, 45, 63, 13, 25, 71, 62,243,163,116, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 3,220,162, 63, 0, 88, 45, 62,245,114, 35, 63, 3,196,233, 62,236,213,209, 62,255,250, 4, 62,245, 45, 0, 62,243,185,206,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 25, 71, 62,243,163,116, 63, 3,220,162, 63, 0, 88, 45, 63, 3,220,215,
- 62,231,189,148, 63, 13, 2, 64, 62,230,215, 52, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,220,215, 62,231,189,148,
- 63, 3,220,162, 63, 0, 88, 45, 62,245, 45, 0, 62,243,185,206, 62,245,100,219, 62,230,230,184, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,230,147, 62,208, 47, 78, 63, 14,244,149, 62,221, 42, 4, 63, 13, 2, 64, 62,230,215, 52, 63, 3,220,215,
- 62,231,189,148, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,245,100,219, 62,230,230,184, 62,241,144,141, 62,221, 52,244,
- 63, 3,230,147, 62,208, 47, 78, 63, 3,220,215, 62,231,189,148, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 7, 61,250,
- 62, 54, 31,148, 63, 3,202,193, 62, 49,174,214, 63, 3,199,220, 62, 24,219, 89, 63, 13,190, 79, 62, 46,193,160, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,199,220, 62, 24,219, 89, 63, 3,202,193, 62, 49,174,214, 63, 0, 87,175, 62, 54, 90,251,
- 62,243,150, 14, 62, 47, 79,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,214, 68, 62, 66,237,246, 63, 7, 61,250,
- 62, 54, 31,148, 63, 13,190, 79, 62, 46,193,160, 63, 16,104,250, 62, 55,113, 16, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,243,150, 14, 62, 47, 79,204, 63, 0, 87,175, 62, 54, 90,251, 62,251,137,104, 62, 67, 92,179, 62,238, 68,200, 62, 56, 62, 76,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,221,237, 62, 91, 90,218, 63, 9,214, 68, 62, 66,237,246, 63, 16,104,250,
- 62, 55,113, 16, 63, 16,186,206, 62, 72,129, 85, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,238, 68,200, 62, 56, 62, 76,
- 62,251,137,104, 62, 67, 92,179, 62,253,153, 39, 62, 91,195, 27, 62,237,187,192, 62, 73,118,194, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 15,243,206, 62,136,207,182, 63, 8, 32, 77, 62,139, 39, 10, 63, 9,117, 22, 62, 97,203,146, 63, 16, 32,222,
- 62, 93,106, 34, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,252,110,192, 62, 98, 68, 79, 62,255, 89,219, 62,139, 79,116,
- 62,239,193, 92, 62,137, 61,113, 62,239, 19, 21, 62, 94,110,121, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,221,237,
- 62, 91, 90,218, 63, 16,186,206, 62, 72,129, 85, 63, 16, 32,222, 62, 93,106, 34, 63, 9,117, 22, 62, 97,203,146, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,239, 19, 21, 62, 94,110,121, 62,237,187,192, 62, 73,118,194, 62,253,153, 39, 62, 91,195, 27,
- 62,252,110,192, 62, 98, 68, 79, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,125,119, 62,158,112, 7, 63, 3,233, 70,
- 62,154, 27, 88, 63, 3,229,235, 62,139,108, 97, 63, 8, 32, 77, 62,139, 39, 10, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 3,229,235, 62,139,108, 97, 63, 3,233, 70, 62,154, 27, 88, 62,252,179,165, 62,158,140,163, 62,255, 89,219, 62,139, 79,116,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,117, 22, 62, 97,203,146, 63, 8, 32, 77, 62,139, 39, 10, 63, 3,229,235,
- 62,139,108, 97, 63, 3,215,246, 62,101, 56,143, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,229,235, 62,139,108, 97,
- 62,255, 89,219, 62,139, 79,116, 62,252,110,192, 62, 98, 68, 79, 63, 3,215,246, 62,101, 56,143, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,210,147, 62, 86, 95,221, 63, 8,221,237, 62, 91, 90,218, 63, 9,117, 22, 62, 97,203,146, 63, 3,215,246,
- 62,101, 56,143, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,252,110,192, 62, 98, 68, 79, 62,253,153, 39, 62, 91,195, 27,
- 63, 3,210,147, 62, 86, 95,221, 63, 3,215,246, 62,101, 56,143, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 12, 54, 5,
- 62,167,183,188, 63, 9, 61,250, 62,168,214,252, 63, 8,143,152, 62,163,107, 45, 63, 9,125,119, 62,158,112, 7, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,254,136,100, 62,163,123, 38, 62,253, 39,110, 62,168,224,103, 62,247, 68, 98, 62,167,206,146,
- 62,252,179,165, 62,158,140,163, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 10,196,135, 62,178,208, 52, 63, 8,233, 25,
- 62,175,110,116, 63, 9, 61,250, 62,168,214,252, 63, 12, 54, 5, 62,167,183,188, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,253, 39,110, 62,168,224,103, 62,253,195,102, 62,175,102,184, 62,250, 14, 98, 62,178,202,149, 62,247, 68, 98, 62,167,206,146,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 4, 17, 69, 62,182,176,105, 63, 6,138, 69, 62,177,180, 80, 63, 8,233, 25,
- 62,175,110,116, 63, 10,196,135, 62,178,208, 52, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,253,195,102, 62,175,102,184,
- 63, 1, 49, 14, 62,177,150, 62, 63, 4, 17, 69, 62,182,176,105, 62,250, 14, 98, 62,178,202,149, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,124,209, 62,177, 0, 70, 63, 3,232, 11, 62,174, 4,140, 63, 6,138, 69, 62,177,180, 80, 63, 4, 17, 69,
- 62,182,176,105, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 49, 14, 62,177,150, 62, 63, 3,232, 11, 62,174, 4,140,
- 63, 3,124,209, 62,177, 0, 70, 63, 4, 17, 69, 62,182,176,105, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,233, 70,
- 62,154, 27, 88, 63, 9,125,119, 62,158,112, 7, 63, 8,143,152, 62,163,107, 45, 63, 3,232,212, 62,158,152, 58, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,254,136,100, 62,163,123, 38, 62,252,179,165, 62,158,140,163, 63, 3,233, 70, 62,154, 27, 88,
- 63, 3,232,212, 62,158,152, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,232,212, 62,158,152, 58, 63, 8,143,152,
- 62,163,107, 45, 63, 7, 91,121, 62,166, 51,134, 63, 3,231,205, 62,162,149, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 0,116, 44, 62,166, 56,255, 62,254,136,100, 62,163,123, 38, 63, 3,232,212, 62,158,152, 58, 63, 3,231,205, 62,162,149, 58,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,232, 11, 62,174, 4,140, 63, 3,233,214, 62,170,154,198, 63, 6,110,233,
- 62,174,152, 94, 63, 6,138, 69, 62,177,180, 80, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 82,228, 62,174,140, 95,
- 63, 3,233,214, 62,170,154,198, 63, 3,232, 11, 62,174, 4,140, 63, 1, 49, 14, 62,177,150, 62, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 6,138, 69, 62,177,180, 80, 63, 6,110,233, 62,174,152, 94, 63, 7,236, 59, 62,173,123, 19, 63, 8,233, 25,
- 62,175,110,116, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,255,185,217, 62,173,116, 92, 63, 1, 82,228, 62,174,140, 95,
- 63, 1, 49, 14, 62,177,150, 62, 62,253,195,102, 62,175,102,184, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,233, 25,
- 62,175,110,116, 63, 7,236, 59, 62,173,123, 19, 63, 7,249, 85, 62,169, 52, 92, 63, 9, 61,250, 62,168,214,252, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,255,169,160, 62,169, 57, 6, 62,255,185,217, 62,173,116, 92, 62,253,195,102, 62,175,102,184,
- 62,253, 39,110, 62,168,224,103, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9, 61,250, 62,168,214,252, 63, 7,249, 85,
- 62,169, 52, 92, 63, 7, 91,121, 62,166, 51,134, 63, 8,143,152, 62,163,107, 45, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 0,116, 44, 62,166, 56,255, 62,255,169,160, 62,169, 57, 6, 62,253, 39,110, 62,168,224,103, 62,254,136,100, 62,163,123, 38,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,233,214, 62,170,154,198, 63, 7,249, 85, 62,169, 52, 92, 63, 7,236, 59,
- 62,173,123, 19, 63, 6,110,233, 62,174,152, 94, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,255,185,217, 62,173,116, 92,
- 62,255,169,160, 62,169, 57, 6, 63, 3,233,214, 62,170,154,198, 63, 1, 82,228, 62,174,140, 95, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,233,214, 62,170,154,198, 63, 3,231,205, 62,162,149, 58, 63, 7, 91,121, 62,166, 51,134, 63, 7,249, 85,
- 62,169, 52, 92, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 0,116, 44, 62,166, 56,255, 63, 3,231,205, 62,162,149, 58,
- 63, 3,233,214, 62,170,154,198, 62,255,169,160, 62,169, 57, 6, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 4, 17, 69,
- 62,182,176,105, 63, 10,196,135, 62,178,208, 52, 63, 12,237,158, 62,187,241, 38, 63, 3,230,147, 62,208, 47, 78, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,245,175, 15, 62,188, 14,188, 62,250, 14, 98, 62,178,202,149, 63, 4, 17, 69, 62,182,176,105,
- 63, 3,230,147, 62,208, 47, 78, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 10,196,135, 62,178,208, 52, 63, 12, 54, 5,
- 62,167,183,188, 63, 16, 0,112, 62,164,246,254, 63, 12,237,158, 62,187,241, 38, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,239,187,207, 62,165, 42, 19, 62,247, 68, 98, 62,167,206,146, 62,250, 14, 98, 62,178,202,149, 62,245,175, 15, 62,188, 14,188,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 12, 54, 5, 62,167,183,188, 63, 9,125,119, 62,158,112, 7, 63, 15,250, 44,
- 62,154, 0,109, 63, 16, 0,112, 62,164,246,254, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,205, 56, 62,154, 71, 8,
- 62,252,179,165, 62,158,140,163, 62,247, 68, 98, 62,167,206,146, 62,239,187,207, 62,165, 42, 19, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 9,125,119, 62,158,112, 7, 63, 8, 32, 77, 62,139, 39, 10, 63, 15,243,206, 62,136,207,182, 63, 15,250, 44,
- 62,154, 0,109, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,193, 92, 62,137, 61,113, 62,255, 89,219, 62,139, 79,116,
- 62,252,179,165, 62,158,140,163, 62,239,205, 56, 62,154, 71, 8, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 27, 46,208, 62,148, 35,149, 63, 15,250, 44, 62,154, 0,109, 63, 15,243,206, 62,136,207,182, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,239,205, 56, 62,154, 71, 8, 62,217,166,238, 62,148,221,229, 62,221, 42, 54, 62,133, 25,209,
- 62,239,193, 92, 62,137, 61,113, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27, 46,208, 62,148, 35,149, 63, 27,177, 36,
- 62,156,151,158, 63, 16, 0,112, 62,164,246,254, 63, 15,250, 44, 62,154, 0,109, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,239,187,207, 62,165, 42, 19, 62,216,160, 0, 62,157, 44,127, 62,217,166,238, 62,148,221,229, 62,239,205, 56, 62,154, 71, 8,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 12,237,158, 62,187,241, 38, 63, 16, 0,112,
- 62,164,246,254, 63, 27,177, 36, 62,156,151,158, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,187,207, 62,165, 42, 19,
- 62,245,175, 15, 62,188, 14,188, 62,216, 21,115, 62,166,177, 14, 62,216,160, 0, 62,157, 44,127, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 8,221,237, 62, 91, 90,218, 63, 3,210,147, 62, 86, 95,221, 63, 3,211,129, 62, 83,168,248, 63, 8, 33,170,
- 62, 86,149,254, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,211,129, 62, 83,168,248, 63, 3,210,147, 62, 86, 95,221,
- 62,253,153, 39, 62, 91,195, 27, 62,255, 14, 8, 62, 86,232, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,214, 68,
- 62, 66,237,246, 63, 8,221,237, 62, 91, 90,218, 63, 8, 33,170, 62, 86,149,254, 63, 8,180, 20, 62, 69, 29, 94, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,255, 14, 8, 62, 86,232, 58, 62,253,153, 39, 62, 91,195, 27, 62,251,137,104, 62, 67, 92,179,
- 62,253,210, 19, 62, 69,114, 55, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 7, 61,250, 62, 54, 31,148, 63, 9,214, 68,
- 62, 66,237,246, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 82,168, 62, 57, 43, 80, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,253,210, 19, 62, 69,114, 55, 62,251,137,104, 62, 67, 92,179, 63, 0, 87,175, 62, 54, 90,251, 63, 1, 68, 48, 62, 57, 84,166,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,202,193, 62, 49,174,214, 63, 7, 61,250, 62, 54, 31,148, 63, 6, 82,168,
- 62, 57, 43, 80, 63, 3,202,205, 62, 54, 22, 8, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 68, 48, 62, 57, 84,166,
- 63, 0, 87,175, 62, 54, 90,251, 63, 3,202,193, 62, 49,174,214, 63, 3,202,205, 62, 54, 22, 8, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,202,205, 62, 54, 22, 8, 63, 6, 82,168, 62, 57, 43, 80, 63, 5, 24,246, 62, 66,150, 26, 63, 3,205,213,
- 62, 64,232,220, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 2,131, 29, 62, 66,172, 22, 63, 1, 68, 48, 62, 57, 84,166,
- 63, 3,202,205, 62, 54, 22, 8, 63, 3,205,213, 62, 64,232,220, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 6, 82,168,
- 62, 57, 43, 80, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 83, 39, 62, 70,114,191, 63, 5, 24,246, 62, 66,150, 26, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 75,185, 62, 70,160,222, 62,253,210, 19, 62, 69,114, 55, 63, 1, 68, 48, 62, 57, 84,166,
- 63, 2,131, 29, 62, 66,172, 22, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,180, 20, 62, 69, 29, 94, 63, 8, 33,170,
- 62, 86,149,254, 63, 6,111, 4, 62, 76,172, 40, 63, 6, 83, 39, 62, 70,114,191, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 1, 51,157, 62, 76,218,158, 62,255, 14, 8, 62, 86,232, 58, 62,253,210, 19, 62, 69,114, 55, 63, 1, 75,185, 62, 70,160,222,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8, 33,170, 62, 86,149,254, 63, 3,211,129, 62, 83,168,248, 63, 3,208,234,
- 62, 75, 43,146, 63, 6,111, 4, 62, 76,172, 40, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,208,234, 62, 75, 43,146,
- 63, 3,211,129, 62, 83,168,248, 62,255, 14, 8, 62, 86,232, 58, 63, 1, 51,157, 62, 76,218,158, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,208,234, 62, 75, 43,146, 63, 3,205,213, 62, 64,232,220, 63, 5, 24,246, 62, 66,150, 26, 63, 6,111, 4,
- 62, 76,172, 40, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 2,131, 29, 62, 66,172, 22, 63, 3,205,213, 62, 64,232,220,
- 63, 3,208,234, 62, 75, 43,146, 63, 1, 51,157, 62, 76,218,158, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 6,111, 4,
- 62, 76,172, 40, 63, 5, 24,246, 62, 66,150, 26, 63, 6, 83, 39, 62, 70,114,191, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 75,185, 62, 70,160,222, 63, 2,131, 29, 62, 66,172, 22, 63, 1, 51,157, 62, 76,218,158,
- 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 2, 64, 62,230,215, 52, 63, 14,244,149,
- 62,221, 42, 4, 63, 16,216, 4, 62,224, 24,160, 63, 15,200,120, 62,231,255, 84, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,237,193,119, 62,224, 38,190, 62,241,144,141, 62,221, 52,244, 62,245,100,219, 62,230,230,184, 62,239,211, 21, 62,232, 18,185,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 25, 71, 62,243,163,116, 63, 13, 2, 64, 62,230,215, 52, 63, 15,200,120,
- 62,231,255, 84, 63, 16,171,184, 62,241,133, 40, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,211, 21, 62,232, 18,185,
- 62,245,100,219, 62,230,230,184, 62,245, 45, 0, 62,243,185,206, 62,237,252,218, 62,241,160, 62, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120, 63, 13, 25, 71, 62,243,163,116, 63, 16,171,184, 62,241,133, 40, 63, 19, 44, 55,
- 62,250, 21, 86, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,237,252,218, 62,241,160, 62, 62,245, 45, 0, 62,243,185,206,
- 62,236,213,209, 62,255,250, 4, 62,232,228,153, 62,250, 67,154, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 14,244,149,
- 62,221, 42, 4, 63, 17, 97, 15, 62,214, 34,220, 63, 19, 53,217, 62,218,211, 16, 63, 16,216, 4, 62,224, 24,160, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,233, 14, 8, 62,218,226, 66, 62,236,200,217, 62,214, 49,134, 62,241,144,141, 62,221, 52,244,
- 62,237,193,119, 62,224, 38,190, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 97, 15, 62,214, 34,220, 63, 27,178,165,
- 62,208, 17,128, 63, 26,198,205, 62,214,184,124, 63, 19, 53,217, 62,218,211, 16, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,217,214,216, 62,214,224,218, 62,216, 24, 6, 62,208, 57,128, 62,236,200,217, 62,214, 49,134, 62,233, 14, 8, 62,218,226, 66,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,178,165, 62,208, 17,128, 63, 33,120, 14, 62,214,238,166, 63, 31,136,156,
- 62,219,138,194, 63, 26,198,205, 62,214,184,124, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,208, 30,254, 62,219,177,204,
- 62,204, 75,168, 62,215, 7, 62, 62,216, 24, 6, 62,208, 57,128, 62,217,214,216, 62,214,224,218, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 33,120, 14, 62,214,238,166, 63, 38,149,140, 62,229, 95, 38, 63, 36, 9, 79, 62,229,224, 94, 63, 31,136,156,
- 62,219,138,194, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,198,192,148, 62,230, 11,182, 62,193,140,168, 62,229,129, 94,
- 62,204, 75,168, 62,215, 7, 62, 62,208, 30,254, 62,219,177,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 38,149,140,
- 62,229, 95, 38, 63, 39, 62, 92, 62,240, 75,121, 63, 36, 49, 14, 62,239, 88,253, 63, 36, 9, 79, 62,229,224, 94, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,198, 71, 97, 62,239,149,192, 62,192, 10,222, 62,240,128,163, 62,193,140,168, 62,229,129, 94,
- 62,198,192,148, 62,230, 11,182, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 39, 62, 92, 62,240, 75,121, 63, 37,113, 25,
- 62,247,157, 35, 63, 35, 33,243, 62,245,143, 80, 63, 36, 49, 14, 62,239, 88,253, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,200, 99, 87, 62,245,217,172, 62,195,165,189, 62,247,232,139, 62,192, 10,222, 62,240,128,163, 62,198, 71, 97, 62,239,149,192,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37,113, 25, 62,247,157, 35, 63, 30, 49, 96, 62,254,229,121, 63, 29, 49,223,
- 62,250,140,199, 63, 35, 33,243, 62,245,143, 80, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,212,124,147, 62,250,215,146,
- 62,210,116,176, 62,255, 62,227, 62,195,165,189, 62,247,232,139, 62,200, 99, 87, 62,245,217,172, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 30, 49, 96, 62,254,229,121, 63, 25,182,151, 63, 1, 9,130, 63, 25,181, 50, 62,253,111,118, 63, 29, 49,223,
- 62,250,140,199, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,219,151, 52, 62,253,186, 68, 62,219,150,213, 63, 1, 55, 50,
- 62,210,116,176, 62,255, 62,227, 62,212,124,147, 62,250,215,146, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25,182,151,
- 63, 1, 9,130, 63, 22, 81,240, 63, 1, 70,114, 63, 22,188,241, 62,253,149, 28, 63, 25,181, 50, 62,253,111,118, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,225,163,212, 62,253,215, 91, 62,226,128,106, 63, 1,111,198, 62,219,150,213, 63, 1, 55, 50,
- 62,219,151, 52, 62,253,186, 68, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22, 81,240, 63, 1, 70,114, 63, 17, 59,103,
- 62,255,195,120, 63, 19, 44, 55, 62,250, 21, 86, 63, 22,188,241, 62,253,149, 28, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,232,228,153, 62,250, 67,154, 62,236,213,209, 62,255,250, 4, 62,226,128,106, 63, 1,111,198, 62,225,163,212, 62,253,215, 91,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,188,241, 62,253,149, 28, 63, 19, 44, 55, 62,250, 21, 86, 63, 20,165, 9,
- 62,247, 99,248, 63, 23, 0, 20, 62,251, 57, 6, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,229,232,232, 62,247,142, 74,
- 62,232,228,153, 62,250, 67,154, 62,225,163,212, 62,253,215, 91, 62,225, 26,145, 62,251,116,114, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 25,181, 50, 62,253,111,118, 63, 22,188,241, 62,253,149, 28, 63, 23, 0, 20, 62,251, 57, 6, 63, 25,144,130,
- 62,251, 7,128, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,225, 26,145, 62,251,116,114, 62,225,163,212, 62,253,215, 91,
- 62,219,151, 52, 62,253,186, 68, 62,219,225,177, 62,251, 75, 67, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 29, 49,223,
- 62,250,140,199, 63, 25,181, 50, 62,253,111,118, 63, 25,144,130, 62,251, 7,128, 63, 28,195, 80, 62,248,166, 55, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,219,225,177, 62,251, 75, 67, 62,219,151, 52, 62,253,186, 68, 62,212,124,147, 62,250,215,146,
- 62,213, 95,233, 62,248,237, 20, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 35, 33,243, 62,245,143, 80, 63, 29, 49,223,
- 62,250,140,199, 63, 28,195, 80, 62,248,166, 55, 63, 33,164, 22, 62,243, 75,102, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,213, 95,233, 62,248,237, 20, 62,212,124,147, 62,250,215,146, 62,200, 99, 87, 62,245,217,172, 62,203,114, 65, 62,243,143,159,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 36, 49, 14, 62,239, 88,253, 63, 35, 33,243, 62,245,143, 80, 63, 33,164, 22,
- 62,243, 75,102, 63, 34,160, 30, 62,238, 47,169, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,203,114, 65, 62,243,143,159,
- 62,200, 99, 87, 62,245,217,172, 62,198, 71, 97, 62,239,149,192, 62,201,128,188, 62,238,110,126, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 36, 9, 79, 62,229,224, 94, 63, 36, 49, 14, 62,239, 88,253, 63, 34,160, 30, 62,238, 47,169, 63, 34,144,131,
- 62,231, 87,253, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,201,128,188, 62,238,110,126, 62,198, 71, 97, 62,239,149,192,
- 62,198,192,148, 62,230, 11,182, 62,201,190,141, 62,231,140,124, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 31,136,156,
- 62,219,138,194, 63, 36, 9, 79, 62,229,224, 94, 63, 34,144,131, 62,231, 87,253, 63, 30,208, 21, 62,221,182,174, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,201,190,141, 62,231,140,124, 62,198,192,148, 62,230, 11,182, 62,208, 30,254, 62,219,177,204,
- 62,209,133,168, 62,221,221, 51, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 26,198,205, 62,214,184,124, 63, 31,136,156,
- 62,219,138,194, 63, 30,208, 21, 62,221,182,174, 63, 26,218,128, 62,217,206, 68, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,209,133,168, 62,221,221, 51, 62,208, 30,254, 62,219,177,204, 62,217,214,216, 62,214,224,218, 62,217,157, 11, 62,217,243, 64,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 19, 53,217, 62,218,211, 16, 63, 26,198,205, 62,214,184,124, 63, 26,218,128,
- 62,217,206, 68, 63, 20, 53,103, 62,221, 84,236, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,217,157, 11, 62,217,243, 64,
- 62,217,214,216, 62,214,224,218, 62,233, 14, 8, 62,218,226, 66, 62,231, 5, 68, 62,221,101,234, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 16,216, 4, 62,224, 24,160, 63, 19, 53,217, 62,218,211, 16, 63, 20, 53,103, 62,221, 84,236, 63, 18, 87, 81,
- 62,226,175, 33, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,231, 5, 68, 62,221,101,234, 62,233, 14, 8, 62,218,226, 66,
- 62,237,193,119, 62,224, 38,190, 62,234,187,180, 62,226,190,249, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 19, 44, 55,
- 62,250, 21, 86, 63, 16,171,184, 62,241,133, 40, 63, 18, 68, 98, 62,240,197,150, 63, 20,165, 9, 62,247, 99,248, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,234,197, 35, 62,240,226,215, 62,237,252,218, 62,241,160, 62, 62,232,228,153, 62,250, 67,154,
- 62,229,232,232, 62,247,142, 74, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 16,171,184, 62,241,133, 40, 63, 15,200,120,
- 62,231,255, 84, 63, 18, 4,161, 62,232,184,138, 63, 18, 68, 98, 62,240,197,150, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,235, 85,154, 62,232,206, 92, 62,239,211, 21, 62,232, 18,185, 62,237,252,218, 62,241,160, 62, 62,234,197, 35, 62,240,226,215,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 15,200,120, 62,231,255, 84, 63, 16,216, 4, 62,224, 24,160, 63, 18, 87, 81,
- 62,226,175, 33, 63, 18, 4,161, 62,232,184,138, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,234,187,180, 62,226,190,249,
- 62,237,193,119, 62,224, 38,190, 62,239,211, 21, 62,232, 18,185, 62,235, 85,154, 62,232,206, 92, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,232,148, 63, 11, 17,164, 63, 11,169, 67, 63, 11,197, 18, 63, 13,120,216, 63, 23, 81,160, 63, 4, 15,147,
- 63, 23,248,227, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,245, 27, 64, 63, 23,166,100, 62,248, 72, 55, 63, 11,232, 91,
- 63, 3,232,148, 63, 11, 17,164, 63, 4, 15,147, 63, 23,248,227, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 11,169, 67,
- 63, 11,197, 18, 63, 22,244,173, 63, 11,215,236, 63, 23,233, 94, 63, 16, 60,186, 63, 13,120,216, 63, 23, 81,160, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,223,130,109, 63, 16,165,118, 62,225, 89,220, 63, 12, 42, 77, 62,248, 72, 55, 63, 11,232, 91,
- 62,245, 27, 64, 63, 23,166,100, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,244,173, 63, 11,215,236, 63, 26,105, 28,
- 63, 11,194,242, 63, 28, 56,220, 63, 14,250, 66, 63, 23,233, 94, 63, 16, 60,186, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,214,161,157, 63, 15,110,219, 62,218, 73,220, 63, 12, 31,169, 62,225, 89,220, 63, 12, 42, 77, 62,223,130,109, 63, 16,165,118,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 26,105, 28, 63, 11,194,242, 63, 34,158,220, 63, 10, 23,175, 63, 39, 44,109,
- 63, 19,221,107, 63, 28, 56,220, 63, 14,250, 66, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,192, 26,156, 63, 20,139, 31,
- 62,201,109,124, 63, 10,121, 72, 62,218, 73,220, 63, 12, 31,169, 62,214,161,157, 63, 15,110,219, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 34,158,220, 63, 10, 23,175, 63, 46, 88,238, 63, 2,223,146, 63, 56, 80,242, 63, 6,244, 44, 63, 39, 44,109,
- 63, 19,221,107, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 62,156,208, 61, 63, 7, 16,204, 62,177, 87,173, 63, 3, 9,102,
- 62,201,109,124, 63, 10,121, 72, 62,192, 26,156, 63, 20,139, 31, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 63, 46, 88,238,
- 63, 2,223,146, 63, 48,134, 62, 62,249,107, 37, 63, 54,173,195, 62,252,106,239, 63, 56, 80,242, 63, 6,244, 44, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,128, 62,160, 36,202, 62,252, 51, 94, 62,172,229,172, 62,249,127,116, 62,177, 87,173, 63, 3, 9,102,
- 62,156,208, 61, 63, 7, 16,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 63, 48,134, 62, 62,249,107, 37, 63, 50,229, 38,
- 62,226, 32,169, 63, 53, 88,154, 62,221,146,240, 63, 54,173,195, 62,252,106,239, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64,
- 62,162,172,128, 62,221,169, 17, 62,168, 39,196, 62,226, 11,206, 62,172,229,172, 62,249,127,116, 62,160, 36,202, 62,252, 51, 94,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 63, 50,229, 38, 62,226, 32,169, 63, 43, 57, 87, 62,206, 58,222, 63, 49,117,240,
- 62,198,138,164, 63, 53, 88,154, 62,221,146,240, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 62,172,137,147, 62,198, 19,148,
- 62,184,207,130, 62,206, 27, 42, 62,168, 39,196, 62,226, 11,206, 62,162,172,128, 62,221,169, 17, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0,128, 63, 43, 57, 87, 62,206, 58,222, 63, 37, 94, 91, 62,187,120,107, 63, 41,160,156, 62,182,175, 56, 63, 49,117,240,
- 62,198,138,164, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,212,202, 62,182,163,245, 62,197, 28,156, 62,187,130,166,
- 62,184,207,130, 62,206, 27, 42, 62,172,137,147, 62,198, 19,148, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 48,252,165,
- 62, 85, 33,133, 63, 48, 54,112, 62, 96, 19, 20, 63, 46, 36,172, 62,129, 7,208, 63, 42, 17,240, 62, 97, 84,129, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,181, 71, 76, 62,131,200,204, 62,175,121,117, 62,106,185,183, 62,172, 24,217, 62, 92,237, 21,
- 62,187, 81,138, 62,103, 40, 59, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 48, 89,204, 62, 4,194,134, 63, 48,252,165,
- 62, 85, 33,133, 63, 42, 17,240, 62, 97, 84,129, 63, 37,125,160, 62, 46,211, 50, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16,
- 62,187, 81,138, 62,103, 40, 59, 62,172, 24,217, 62, 92,237, 21, 62,172,197, 94, 62, 4,200,109, 62,195,121, 25, 62, 48,253, 46,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 20, 44, 11, 61,163, 26, 20, 63, 48, 89,204, 62, 4,194,134, 63, 37,125,160,
- 62, 46,211, 50, 63, 24, 92, 40, 62, 21,184,214, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 62,195,121, 25, 62, 48,253, 46,
- 62,172,197, 94, 62, 4,200,109, 62,230,122,140, 61,161,248,202, 62,222, 13,216, 62, 22,116,222, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 32, 63, 16,254,174, 62, 34, 45, 94, 63, 3,199,219, 61,229, 28, 18, 63, 20, 44, 11, 61,163, 26, 20, 63, 24, 92, 40,
- 62, 21,184,214, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 62,230,122,140, 61,161,248,202, 63, 3,199,219, 61,229, 28, 18,
- 62,236,248,140, 62, 34,202,182, 62,222, 13,216, 62, 22,116,222, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 21,152,184,
- 62, 53, 47,182, 63, 16,254,174, 62, 34, 45, 94, 63, 24, 92, 40, 62, 21,184,214, 63, 25, 52,209, 62, 51,140, 76, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 32, 62,222, 13,216, 62, 22,116,222, 62,236,248,140, 62, 34,202,182, 62,227,207,183, 62, 54, 75,250,
- 62,220,137,229, 62, 52,228,185, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 63, 22, 57,137, 62, 61, 93, 81, 63, 21,152,184,
- 62, 53, 47,182, 63, 25, 52,209, 62, 51,140, 76, 63, 30,166,193, 62, 73,168,114, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,220,137,229, 62, 52,228,185, 62,227,207,183, 62, 54, 75,250, 62,226,152,122, 62, 62,166,190, 62,209,198, 54, 62, 75,240, 18,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,249,250, 62, 88,251,160, 63, 22, 57,137, 62, 61, 93, 81, 63, 30,166,193,
- 62, 73,168,114, 63, 36, 0, 75, 62,116, 47,229, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,209,198, 54, 62, 75,240, 18,
- 62,226,152,122, 62, 62,166,190, 62,225, 83, 90, 62, 90,153, 21, 62,199,231,211, 62,119,237,216, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 30,166,193, 62, 73,168,114, 63, 37,125,160, 62, 46,211, 50, 63, 42, 17,240, 62, 97, 84,129, 63, 36, 0, 75,
- 62,116, 47,229, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,187, 81,138, 62,103, 40, 59, 62,195,121, 25, 62, 48,253, 46,
- 62,209,198, 54, 62, 75,240, 18, 62,199,231,211, 62,119,237,216, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 30,166,193,
- 62, 73,168,114, 63, 25, 52,209, 62, 51,140, 76, 63, 24, 92, 40, 62, 21,184,214, 63, 37,125,160, 62, 46,211, 50, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,222, 13,216, 62, 22,116,222, 62,220,137,229, 62, 52,228,185, 62,209,198, 54, 62, 75,240, 18,
- 62,195,121, 25, 62, 48,253, 46, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 36,163, 37, 62,140,168,191, 63, 36, 0, 75,
- 62,116, 47,229, 63, 42, 17,240, 62, 97, 84,129, 63, 46, 36,172, 62,129, 7,208, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,187, 81,138, 62,103, 40, 59, 62,199,231,211, 62,119,237,216, 62,199, 64, 6, 62,142, 6,105, 62,181, 71, 76, 62,131,200,204,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25, 81, 20, 62,132, 56, 17, 63, 22,249,250, 62, 88,251,160, 63, 36, 0, 75,
- 62,116, 47,229, 63, 36,163, 37, 62,140,168,191, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,199,231,211, 62,119,237,216,
- 62,225, 83, 90, 62, 90,153, 21, 62,221, 42, 54, 62,133, 25,209, 62,199, 64, 6, 62,142, 6,105, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 27, 46,208, 62,148, 35,149, 63, 36, 60, 91, 62,150,222,221, 63, 33,170,222, 62,158,126, 74, 63, 27,177, 36,
- 62,156,151,158, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,204,234, 72, 62,159, 63, 56, 62,199,245,150, 62,152, 15, 85,
- 62,217,166,238, 62,148,221,229, 62,216,160, 0, 62,157, 44,127, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 36,163, 37, 62,140,168,191, 63, 36, 60, 91, 62,150,222,221, 63, 27, 46,208, 62,148, 35,149, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,199,245,150, 62,152, 15, 85, 62,199, 64, 6, 62,142, 6,105, 62,221, 42, 54, 62,133, 25,209,
- 62,217,166,238, 62,148,221,229, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 27,177, 36,
- 62,156,151,158, 63, 33,170,222, 62,158,126, 74, 63, 31,212,102, 62,164,192,144, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,204,234, 72, 62,159, 63, 56, 62,216,160, 0, 62,157, 44,127, 62,216, 21,115, 62,166,177, 14, 62,208,119, 17, 62,165, 65,201,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 31,212,102, 62,164,192,144, 63, 41,160,156,
- 62,182,175, 56, 63, 37, 94, 91, 62,187,120,107, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,212,202, 62,182,163,245,
- 62,208,119, 17, 62,165, 65,201, 62,216, 21,115, 62,166,177, 14, 62,197, 28,156, 62,187,130,166, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,194,119,104, 63, 82,189,164, 62,212, 73, 23, 63, 90,239,152, 62,205,192,100, 63, 97,238, 46, 62,185, 56, 38,
- 63, 91,154, 72, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,141, 94,228, 63,100,234, 86, 62,150, 66, 84, 63, 94,154,114,
- 62,173, 86,230, 63, 98, 66, 79, 62,162,143, 20, 63,106,173, 44, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 63, 87,122, 72,
- 62, 62, 8,216, 63, 84,106,202, 62,113,185,137, 63, 72, 77,226, 62,121, 21,204, 63, 71,225,158, 62, 68, 34,113, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 16, 62,137, 32,132, 62,121, 65,181, 62,107,179,168, 62,103,127,139, 62,114,147,210, 62, 61,116,212,
- 62,142,125,248, 62, 80, 4, 30, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 71,225,158, 62, 68, 34,113, 63, 72, 77,226,
- 62,121, 21,204, 63, 51, 7, 8, 62,130,186, 5, 63, 49,166, 3, 62, 96, 57,232, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,172,197, 18, 62,133,112, 41, 62,137, 32,132, 62,121, 65,181, 62,142,125,248, 62, 80, 4, 30, 62,174,228,121, 62,109, 79, 52,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 49,166, 3, 62, 96, 57,232, 63, 51, 7, 8, 62,130,186, 5, 63, 46, 36,172,
- 62,129, 7,208, 63, 48, 54,112, 62, 96, 19, 20, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,181, 71, 76, 62,131,200,204,
- 62,172,197, 18, 62,133,112, 41, 62,174,228,121, 62,109, 79, 52, 62,175,121,117, 62,106,185,183, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 36,163, 37, 62,140,168,191, 63, 46, 36,172, 62,129, 7,208, 63, 51, 7, 8, 62,130,186, 5, 63, 36, 60, 91,
- 62,150,222,221, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,172,197, 18, 62,133,112, 41, 62,181, 71, 76, 62,131,200,204,
- 62,199, 64, 6, 62,142, 6,105, 62,199,245,150, 62,152, 15, 85, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 53, 88,154,
- 62,221,146,240, 63, 49,117,240, 62,198,138,164, 63, 69, 19,224, 62,190, 68, 24, 63, 74, 64, 53, 62,224, 31,171, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 16, 62,134, 78,250, 62,186,213,148, 62,172,137,147, 62,198, 19,148, 62,162,172,128, 62,221,169, 17,
- 62,114,112,184, 62,220,169,248, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 62,214, 74, 54, 63, 70, 55, 20, 62,233,130, 48,
- 63, 83, 69,188, 62,212, 73, 23, 63, 90,239,152, 62,194,119,104, 63, 82,189,164, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,150, 66, 84, 63, 94,154,114, 62,153, 1, 66, 63, 81,149,245, 62,185, 56, 38, 63, 83,110,102, 62,173, 86,230, 63, 98, 66, 79,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 63, 66,242,106, 63, 25, 94,202, 63, 70,100,190, 63, 15,234,222, 63, 77,189, 90,
- 63, 17, 88,233, 63, 74,206, 8, 63, 27,118, 88, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 96, 32, 22, 63, 16, 60, 66,
- 62,125, 87, 86, 63, 15, 5,174, 62,132,187, 78, 63, 24, 44,180, 62,108, 79, 26, 63, 26, 1,124, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 74,206, 8, 63, 27,118, 88, 63, 77,189, 90, 63, 17, 88,233, 63, 85,139, 72, 63, 19, 51,103, 63, 85,119,220,
- 63, 31, 71, 77, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 64,199, 64, 63, 18, 40, 26, 62, 96, 32, 22, 63, 16, 60, 66,
- 62,108, 79, 26, 63, 26, 1,124, 62, 67,191, 44, 63, 30, 89, 90, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 85,119,220,
- 63, 31, 71, 77, 63, 85,139, 72, 63, 19, 51,103, 63,100,213,228, 63, 20,156, 72, 63, 96, 82, 18, 63, 34,133,128, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,128, 62, 1, 50,226, 63, 20, 68,184, 62, 64,199, 64, 63, 18, 40, 26, 62, 67,191, 44, 63, 30, 89, 90,
- 62, 24,204,194, 63, 34,186, 32, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 63, 56, 80,242, 63, 6,244, 44, 63, 54,173,195,
- 62,252,106,239, 63, 60,205,115, 62,253,150,213, 63, 64, 14,166, 63, 4, 80, 81, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16,
- 62,147, 85,190, 62,252,176, 91, 62,160, 36,202, 62,252, 51, 94, 62,156,208, 61, 63, 7, 16,204, 62,140,121,160, 63, 3,197, 74,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 64, 14,166, 63, 4, 80, 81, 63, 60,205,115, 62,253,150,213, 63, 73,103, 68,
- 63, 0,248,233, 63, 75, 12,248, 63, 8,206, 64, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,115, 59,144, 62,255,143,102,
- 62,147, 85,190, 62,252,176, 91, 62,140,121,160, 63, 3,197, 74, 62,107,135, 78, 63, 7,182, 88, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 75, 12,248, 63, 8,206, 64, 63, 73,103, 68, 63, 0,248,233, 63, 82,151,239, 63, 3,223, 86, 63, 82,227,181,
- 63, 11,102,189, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 77, 17, 82, 63, 2, 98,162, 62,115, 59,144, 62,255,143,102,
- 62,107,135, 78, 63, 7,182, 88, 62, 75, 98,202, 63, 10, 43,108, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 82,227,181,
- 63, 11,102,189, 63, 82,151,239, 63, 3,223, 86, 63, 91,224, 92, 63, 5,144,239, 63, 90,148,161, 63, 13, 95,146, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 38, 40,178, 63, 3,230, 14, 62, 77, 17, 82, 63, 2, 98,162, 62, 75, 98,202, 63, 10, 43,108,
- 62, 43,162, 10, 63, 12, 50, 8, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,103, 89,120, 63, 2, 76,105, 63,103,179,170,
- 63, 12,105,142, 63, 90,148,161, 63, 13, 95,146, 63, 91,224, 92, 63, 5,144,239, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 43,162, 10, 63, 12, 50, 8, 61,231, 41,168, 63, 11, 83,158, 61,234,128,116, 63, 0, 39,200, 62, 38, 40,178, 63, 3,230, 14,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,213,228, 63, 20,156, 72, 63, 85,139, 72, 63, 19, 51,103, 63, 90,148,161,
- 63, 13, 95,146, 63,103,179,170, 63, 12,105,142, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 43,162, 10, 63, 12, 50, 8,
- 62, 64,199, 64, 63, 18, 40, 26, 62, 1, 50,226, 63, 20, 68,184, 61,231, 41,168, 63, 11, 83,158, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 85,139, 72, 63, 19, 51,103, 63, 77,189, 90, 63, 17, 88,233, 63, 82,227,181, 63, 11,102,189, 63, 90,148,161,
- 63, 13, 95,146, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 75, 98,202, 63, 10, 43,108, 62, 96, 32, 22, 63, 16, 60, 66,
- 62, 64,199, 64, 63, 18, 40, 26, 62, 43,162, 10, 63, 12, 50, 8, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 77,189, 90,
- 63, 17, 88,233, 63, 70,100,190, 63, 15,234,222, 63, 75, 12,248, 63, 8,206, 64, 63, 82,227,181, 63, 11,102,189, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,107,135, 78, 63, 7,182, 88, 62,125, 87, 86, 63, 15, 5,174, 62, 96, 32, 22, 63, 16, 60, 66,
- 62, 75, 98,202, 63, 10, 43,108, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 70,100,190, 63, 15,234,222, 63, 60,235, 82,
- 63, 12, 12, 27, 63, 64, 14,166, 63, 4, 80, 81, 63, 75, 12,248, 63, 8,206, 64, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,140,121,160, 63, 3,197, 74, 62,145,230, 78, 63, 11,225,148, 62,125, 87, 86, 63, 15, 5,174, 62,107,135, 78, 63, 7,182, 88,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 57,118, 31, 63, 12, 79,230, 63, 56, 80,242, 63, 6,244, 44, 63, 64, 14,166,
- 63, 4, 80, 81, 63, 60,235, 82, 63, 12, 12, 27, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 62,140,121,160, 63, 3,197, 74,
- 62,156,208, 61, 63, 7, 16,204, 62,152,199, 0, 63, 12,133, 13, 62,145,230, 78, 63, 11,225,148, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 32, 63, 57,240,195, 63, 23,138, 10, 63, 60,235, 82, 63, 12, 12, 27, 63, 70,100,190, 63, 15,234,222, 63, 66,242,106,
- 63, 25, 94,202, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,125, 87, 86, 63, 15, 5,174, 62,145,230, 78, 63, 11,225,148,
- 62,150, 7,247, 63, 23, 12, 96, 62,132,187, 78, 63, 24, 44,180, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13,120,216,
- 63, 23, 81,160, 63, 23,233, 94, 63, 16, 60,186, 63, 28, 56,220, 63, 14,250, 66, 63, 39, 44,109, 63, 19,221,107, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,214,161,157, 63, 15,110,219, 62,223,130,109, 63, 16,165,118, 62,245, 27, 64, 63, 23,166,100,
- 62,192, 26,156, 63, 20,139, 31, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 56, 29,176, 63, 20,206, 88, 63, 57,118, 31,
- 63, 12, 79,230, 63, 60,235, 82, 63, 12, 12, 27, 63, 57,240,195, 63, 23,138, 10, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,145,230, 78, 63, 11,225,148, 62,152,199, 0, 63, 12,133, 13, 62,153,211,239, 63, 20,159,220, 62,150, 7,247, 63, 23, 12, 96,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 54,148, 48, 63, 22,206,220, 63, 56, 29,176, 63, 20,206, 88, 63, 57,240,195,
- 63, 23,138, 10, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,150, 7,247, 63, 23, 12, 96,
- 62,153,211,239, 63, 20,159,220, 62,156,106,108, 63, 22,154,146, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 54,173,195, 62,252,106,239, 63, 53, 88,154, 62,221,146,240, 63, 74, 64, 53, 62,224, 31,171, 63, 60,205,115,
- 62,253,150,213, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 62,114,112,184, 62,220,169,248, 62,162,172,128, 62,221,169, 17,
- 62,160, 36,202, 62,252, 51, 94, 62,147, 85,190, 62,252,176, 91, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 63, 74, 64, 53,
- 62,224, 31,171, 63, 81,106,217, 62,232,214, 14, 63, 73,103, 68, 63, 0,248,233, 63, 60,205,115, 62,253,150,213, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,115, 59,144, 62,255,143,102, 62, 84, 93, 88, 62,228,105, 50, 62,114,112,184, 62,220,169,248,
- 62,147, 85,190, 62,252,176, 91, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 81,106,217, 62,232,214, 14, 63, 93,154,106,
- 62,233, 26,226, 63, 82,151,239, 63, 3,223, 86, 63, 73,103, 68, 63, 0,248,233, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 77, 17, 82, 63, 2, 98,162, 62, 33, 1,128, 62,226,210, 70, 62, 84, 93, 88, 62,228,105, 50, 62,115, 59,144, 62,255,143,102,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,103, 89,120, 63, 2, 76,105, 63, 91,224, 92, 63, 5,144,239, 63, 82,151,239,
- 63, 3,223, 86, 63, 93,154,106, 62,233, 26,226, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 77, 17, 82, 63, 2, 98,162,
- 62, 38, 40,178, 63, 3,230, 14, 61,234,128,116, 63, 0, 39,200, 62, 33, 1,128, 62,226,210, 70, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 51, 7, 8, 62,130,186, 5, 63, 72, 77,226, 62,121, 21,204, 63, 73,254,154, 62,140, 82,178, 63, 56,188, 90,
- 62,159,207,103, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,130,249,249, 62,137,175,246, 62,137, 32,132, 62,121, 65,181,
- 62,172,197, 18, 62,133,112, 41, 62,161, 5,192, 62,159, 40,228, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 69, 19,224,
- 62,190, 68, 24, 63, 56,188, 90, 62,159,207,103, 63, 73,254,154, 62,140, 82,178, 63, 77,217,216, 62,157,228, 7, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,128, 62,130,249,249, 62,137,175,246, 62,161, 5,192, 62,159, 40,228, 62,134, 78,250, 62,186,213,148,
- 62,111,118,154, 62,152,108,120, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 63, 49,117,240, 62,198,138,164, 63, 41,160,156,
- 62,182,175, 56, 63, 56,188, 90, 62,159,207,103, 63, 69, 19,224, 62,190, 68, 24, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,161, 5,192, 62,159, 40,228, 62,188,212,202, 62,182,163,245, 62,172,137,147, 62,198, 19,148, 62,134, 78,250, 62,186,213,148,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 41,160,156, 62,182,175, 56, 63, 33,170,222, 62,158,126, 74, 63, 36, 60, 91,
- 62,150,222,221, 63, 56,188, 90, 62,159,207,103, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,199,245,150, 62,152, 15, 85,
- 62,204,234, 72, 62,159, 63, 56, 62,188,212,202, 62,182,163,245, 62,161, 5,192, 62,159, 40,228, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 36, 60, 91, 62,150,222,221, 63, 51, 7, 8, 62,130,186, 5, 63, 56,188, 90, 62,159,207,103, 63,128, 0, 0,
- 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,161, 5,192, 62,159, 40,228, 62,172,197, 18, 62,133,112, 41,
- 62,199,245,150, 62,152, 15, 85, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 41,160,156,
- 62,182,175, 56, 63, 31,212,102, 62,164,192,144, 63, 33,170,222, 62,158,126, 74, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,204,234, 72, 62,159, 63, 56, 62,208,119, 17, 62,165, 65,201, 62,188,212,202, 62,182,163,245,
- 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,245, 44,226, 63, 96,140,129, 62,227,135, 42,
- 63,101, 2, 58, 62,219,168,136, 63, 95,236, 30, 62,238, 30,135, 63, 90, 41,200, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62,137,240,216, 63, 93,226, 90, 62,122,103,110, 63, 92,255,236, 62,120, 84, 74, 63, 83, 32,104, 62,138,193, 32, 63, 83, 3, 16,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,233,130, 48, 63, 83, 69,188, 62,238, 30,135, 63, 90, 41,200, 62,219,168,136,
- 63, 95,236, 30, 62,212, 73, 23, 63, 90,239,152, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 62,137,240,216, 63, 93,226, 90,
- 62,138,193, 32, 63, 83, 3, 16, 62,153, 1, 66, 63, 81,149,245, 62,150, 66, 84, 63, 94,154,114, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0,240, 63, 77,217,216, 62,157,228, 7, 63, 73,254,154, 62,140, 82,178, 63, 90, 61, 33, 62,124,207,195, 63, 90,225,160,
- 62,137,121,110, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 62, 81,207, 98, 62,110, 1,109, 62,130,249,249, 62,137,175,246,
- 62,111,118,154, 62,152,108,120, 62, 74,125,166, 62,130, 30,252, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 72, 77,226,
- 62,121, 21,204, 63, 84,106,202, 62,113,185,137, 63, 90, 61, 33, 62,124,207,195, 63, 73,254,154, 62,140, 82,178, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 81,207, 98, 62,110, 1,109, 62,107,179,168, 62,103,127,139, 62,137, 32,132, 62,121, 65,181,
- 62,130,249,249, 62,137,175,246, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,212, 73, 23, 63, 90,239,152, 62,219,168,136,
- 63, 95,236, 30, 62,205,192,100, 63, 97,238, 46, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112,
- 62,141, 94,228, 63,100,234, 86, 62,137,240,216, 63, 93,226, 90, 62,150, 66, 84, 63, 94,154,114, 63,128, 0, 0, 63,128, 0, 0,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 63,109,178, 31, 62,228, 68,224, 63,102,178, 46, 62,232,184,100, 63,101,251,100,
- 62,227,198,238, 63,107,173, 94, 62,225,130,168, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,249,209, 68, 62,219,134, 70,
- 61,242,216,120, 62,225, 40,124, 61,177, 27, 28, 62,219,240, 42, 61,196,131, 76, 62,216, 97,196, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,109,178, 31, 62,228, 68,224, 63,107,173, 94, 62,225,130,168, 63,114,102,144, 62,220, 23,198, 63,116, 76, 41,
- 62,222,153,139, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,120,163, 56, 62,208,252, 58, 61,196,131, 76, 62,216, 97,196,
- 61,177, 27, 28, 62,219,240, 42, 61, 73,183,128, 62,213,108, 84, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,116, 76, 41,
- 62,222,153,139, 63,114,102,144, 62,220, 23,198, 63,117, 87, 84, 62,211,255,221, 63,119,115,183, 62,215, 49,140, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 61, 55, 29,144, 62,194,183,207, 61,120,163, 56, 62,208,252, 58, 61, 73,183,128, 62,213,108, 84,
- 60,231,111,224, 62,198,142,100, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,119,115,183, 62,215, 49,140, 63,117, 87, 84,
- 62,211,255,221, 63,118, 20,150, 62,196,110, 60, 63,122, 12, 49, 62,197, 8,246, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,103,197, 96, 62,170,206, 15, 61, 55, 29,144, 62,194,183,207, 60,231,111,224, 62,198,142,100, 61, 16, 54,240, 62,167, 4,120,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,122, 12, 49, 62,197, 8,246, 63,118, 20,150, 62,196,110, 60, 63,108,155, 17,
- 62,178,201,130, 63,110,190, 84, 62,172, 77,223, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,246,252,148, 62,160,116,164,
- 61,103,197, 96, 62,170,206, 15, 61, 16, 54,240, 62,167, 4,120, 61,246, 66, 8, 62,152,161, 28, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,110,190, 84, 62,172, 77,223, 63,108,155, 17, 62,178,201,130, 63, 92,180, 21, 62,173, 95,202, 63, 90, 5,151,
- 62,167, 61,138, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 54,216,144, 62,163, 76, 35, 61,246,252,148, 62,160,116,164,
- 61,246, 66, 8, 62,152,161, 28, 62, 66,251,194, 62,158,102,163, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,108,155, 17,
- 62,178,201,130, 63,109,132,198, 62,186,157,182, 63, 97, 32, 68, 62,178, 12,192, 63, 92,180, 21, 62,173, 95,202, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 36,185, 48, 62,166, 7, 16, 61,221, 91, 40, 62,167,194, 4, 61,246,252,148, 62,160,116,164,
- 62, 54,216,144, 62,163, 76, 35, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,118, 20,150, 62,196,110, 60, 63,115,225, 84,
- 62,198, 85,208, 63,109,132,198, 62,186,157,182, 63,108,155, 17, 62,178,201,130, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,221, 91, 40, 62,167,194, 4, 61,134,221,244, 62,175,164,121, 61,103,197, 96, 62,170,206, 15, 61,246,252,148, 62,160,116,164,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,117, 87, 84, 62,211,255,221, 63,116, 48,222, 62,209, 8,169, 63,115,225, 84,
- 62,198, 85,208, 63,118, 20,150, 62,196,110, 60, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,134,221,244, 62,175,164,121,
- 61, 93,108,160, 62,190,207, 17, 61, 55, 29,144, 62,194,183,207, 61,103,197, 96, 62,170,206, 15, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,114,102,144, 62,220, 23,198, 63,113,151,174, 62,214,229, 26, 63,116, 48,222, 62,209, 8,169, 63,117, 87, 84,
- 62,211,255,221, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61, 93,108,160, 62,190,207, 17, 61,135,155, 12, 62,201, 39,166,
- 61,120,163, 56, 62,208,252, 58, 61, 55, 29,144, 62,194,183,207, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,107,173, 94,
- 62,225,130,168, 63,107,239,228, 62,218, 59, 62, 63,113,151,174, 62,214,229, 26, 63,114,102,144, 62,220, 23,198, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 61,135,155, 12, 62,201, 39,166, 61,195, 47,128, 62,207, 11, 6, 61,196,131, 76, 62,216, 97,196,
- 61,120,163, 56, 62,208,252, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,107,173, 94, 62,225,130,168, 63,101,251,100,
- 62,227,198,238, 63,102,205, 71, 62,219, 94,132, 63,107,239,228, 62,218, 59, 62, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,244,157,192, 62,209,137,157, 61,249,209, 68, 62,219,134, 70, 61,196,131, 76, 62,216, 97,196, 61,195, 47,128, 62,207, 11, 6,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 69, 19,224, 62,190, 68, 24, 63, 77,217,216, 62,157,228, 7, 63, 85, 35,236,
- 62,181,201,164, 63, 78, 92, 56, 62,188,114,177, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 32, 62, 80, 91,122, 62,174, 18, 72,
- 62,111,118,154, 62,152,108,120, 62,134, 78,250, 62,186,213,148, 62,104,163,162, 62,182,180,150, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 32, 63, 77,217,216, 62,157,228, 7, 63, 90, 5,151, 62,167, 61,138, 63, 92,180, 21, 62,173, 95,202, 63, 85, 35,236,
- 62,181,201,164, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 62, 54,216,144, 62,163, 76, 35, 62, 66,251,194, 62,158,102,163,
- 62,111,118,154, 62,152,108,120, 62, 80, 91,122, 62,174, 18, 72, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 63, 74, 64, 53,
- 62,224, 31,171, 63, 69, 19,224, 62,190, 68, 24, 63, 78, 92, 56, 62,188,114,177, 63, 81,106,217, 62,232,214, 14, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,104,163,162, 62,182,180,150, 62,134, 78,250, 62,186,213,148, 62,114,112,184, 62,220,169,248,
- 62, 84, 93, 88, 62,228,105, 50, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 93,154,106, 62,233, 26,226, 63, 94,229,196,
- 62,224,195,128, 63,101,251,100, 62,227,198,238, 63,102,178, 46, 62,232,184,100, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,249,209, 68, 62,219,134, 70, 62, 28,187,108, 62,217, 86, 48, 62, 33, 1,128, 62,226,210, 70, 61,242,216,120, 62,225, 40,124,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 92,180, 21, 62,173, 95,202, 63, 97, 32, 68, 62,178, 12,192, 63, 94,215, 9,
- 62,186, 54, 4, 63, 85, 35,236, 62,181,201,164, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 41,122, 60, 62,175, 58, 16,
- 62, 36,185, 48, 62,166, 7, 16, 62, 54,216,144, 62,163, 76, 35, 62, 80, 91,122, 62,174, 18, 72, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 95, 78,230, 62,189,233, 4, 63, 86,188, 32, 62,190, 62, 44, 63, 85, 35,236, 62,181,201,164, 63, 94,215, 9,
- 62,186, 54, 4, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 80, 91,122, 62,174, 18, 72, 62, 71,118, 78, 62,182, 49, 27,
- 62, 37,225, 52, 62,179, 12, 40, 62, 41,122, 60, 62,175, 58, 16, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 92,166, 70,
- 62,197,166, 0, 63, 86,188, 32, 62,190, 62, 44, 63, 95, 78,230, 62,189,233, 4, 63, 95, 13,226, 62,194,152, 37, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 37,225, 52, 62,179, 12, 40, 62, 71,118, 78, 62,182, 49, 27, 62, 45,143,142, 62,188, 37,237,
- 62, 36,230,106, 62,184, 27,222, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 90,248, 62,207,122,100, 63, 90,249,108,
- 62,212,199, 58, 63, 86,188, 32, 62,190, 62, 44, 63, 92,166, 70, 62,197,166, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 71,118, 78, 62,182, 49, 27, 62, 48, 56,110, 62,205, 43,230, 62, 30,250,174, 62,198, 12, 26, 62, 45,143,142, 62,188, 37,237,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 94,229,196, 62,224,195,128, 63, 90,249,108, 62,212,199, 58, 63, 95, 90,248,
- 62,207,122,100, 63, 98,104, 92, 62,215,136,197, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 30,250,174, 62,198, 12, 26,
- 62, 48, 56,110, 62,205, 43,230, 62, 28,187,108, 62,217, 86, 48, 62, 15, 59,212, 62,206, 50,224, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,101,251,100, 62,227,198,238, 63, 94,229,196, 62,224,195,128, 63, 98,104, 92, 62,215,136,197, 63,102,205, 71,
- 62,219, 94,132, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 15, 59,212, 62,206, 50,224, 62, 28,187,108, 62,217, 86, 48,
- 61,249,209, 68, 62,219,134, 70, 61,244,157,192, 62,209,137,157, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 81,106,217,
- 62,232,214, 14, 63, 90,249,108, 62,212,199, 58, 63, 94,229,196, 62,224,195,128, 63, 93,154,106, 62,233, 26,226, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 28,187,108, 62,217, 86, 48, 62, 48, 56,110, 62,205, 43,230, 62, 84, 93, 88, 62,228,105, 50,
- 62, 33, 1,128, 62,226,210, 70, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 81,106,217, 62,232,214, 14, 63, 78, 92, 56,
- 62,188,114,177, 63, 86,188, 32, 62,190, 62, 44, 63, 90,249,108, 62,212,199, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 71,118, 78, 62,182, 49, 27, 62,104,163,162, 62,182,180,150, 62, 84, 93, 88, 62,228,105, 50, 62, 48, 56,110, 62,205, 43,230,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 78, 92, 56, 62,188,114,177, 63, 85, 35,236, 62,181,201,164, 63, 86,188, 32,
- 62,190, 62, 44, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 71,118, 78, 62,182, 49, 27,
- 62, 80, 91,122, 62,174, 18, 72, 62,104,163,162, 62,182,180,150, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,102,205, 71, 62,219, 94,132, 63, 98,104, 92, 62,215,136,197, 63,100,109,182, 62,210,255,149, 63,104, 86, 54,
- 62,214,241,209, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 7,107,160, 62,200,103, 34, 62, 15, 59,212, 62,206, 50,224,
- 61,244,157,192, 62,209,137,157, 61,232, 2, 8, 62,203,214, 20, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 98,104, 92,
- 62,215,136,197, 63, 95, 90,248, 62,207,122,100, 63, 97,206,112, 62,204,202, 10, 63,100,109,182, 62,210,255,149, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 21, 68, 64, 62,194, 55,107, 62, 30,250,174, 62,198, 12, 26, 62, 15, 59,212, 62,206, 50,224,
- 62, 7,107,160, 62,200,103, 34, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 90,248, 62,207,122,100, 63, 92,166, 70,
- 62,197,166, 0, 63, 94,241, 82, 62,198,103, 40, 63, 97,206,112, 62,204,202, 10, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 35,225, 20, 62,188, 50, 39, 62, 45,143,142, 62,188, 37,237, 62, 30,250,174, 62,198, 12, 26, 62, 21, 68, 64, 62,194, 55,107,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 92,166, 70, 62,197,166, 0, 63, 95, 13,226, 62,194,152, 37, 63, 97, 1,118,
- 62,195,226, 47, 63, 94,241, 82, 62,198,103, 40, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 28, 43, 12, 62,184,177,186,
- 62, 36,230,106, 62,184, 27,222, 62, 45,143,142, 62,188, 37,237, 62, 35,225, 20, 62,188, 50, 39, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 95, 13,226, 62,194,152, 37, 63, 95, 78,230, 62,189,233, 4, 63, 97,113, 51, 62,189,151, 92, 63, 97, 1,118,
- 62,195,226, 47, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 29, 67,104, 62,177,199, 58, 62, 37,225, 52, 62,179, 12, 40,
- 62, 36,230,106, 62,184, 27,222, 62, 28, 43, 12, 62,184,177,186, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 78,230,
- 62,189,233, 4, 63, 94,215, 9, 62,186, 54, 4, 63, 96, 69, 96, 62,187,133,152, 63, 97,113, 51, 62,189,151, 92, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 35, 14,140, 62,176, 19, 33, 62, 41,122, 60, 62,175, 58, 16, 62, 37,225, 52, 62,179, 12, 40,
- 62, 29, 67,104, 62,177,199, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 94,215, 9, 62,186, 54, 4, 63, 97, 32, 68,
- 62,178, 12,192, 63, 98, 91,112, 62,182,128,149, 63, 96, 69, 96, 62,187,133,152, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 29,107,228, 62,169,230, 95, 62, 36,185, 48, 62,166, 7, 16, 62, 41,122, 60, 62,175, 58, 16, 62, 35, 14,140, 62,176, 19, 33,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,107,239,228, 62,218, 59, 62, 63,102,205, 71, 62,219, 94,132, 63,104, 86, 54,
- 62,214,241,209, 63,109, 27, 34, 62,214,254,155, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,232, 2, 8, 62,203,214, 20,
- 61,244,157,192, 62,209,137,157, 61,195, 47,128, 62,207, 11, 6, 61,184,174, 36, 62,202,130,216, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,113,151,174, 62,214,229, 26, 63,107,239,228, 62,218, 59, 62, 63,109, 27, 34, 62,214,254,155, 63,113,134, 69,
- 62,212, 82,156, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,184,174, 36, 62,202,130,216, 61,195, 47,128, 62,207, 11, 6,
- 61,135,155, 12, 62,201, 39,166, 61,138,114, 60, 62,197, 61, 28, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,116, 48,222,
- 62,209, 8,169, 63,113,151,174, 62,214,229, 26, 63,113,134, 69, 62,212, 82,156, 63,114,143, 42, 62,207,168, 24, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 61,138,114, 60, 62,197, 61, 28, 61,135,155, 12, 62,201, 39,166, 61, 93,108,160, 62,190,207, 17,
- 61,132, 85,184, 62,189,211, 22, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,115,225, 84, 62,198, 85,208, 63,116, 48,222,
- 62,209, 8,169, 63,114,143, 42, 62,207,168, 24, 63,114,125,203, 62,200,114, 96, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,132, 85,184, 62,189,211, 22, 61, 93,108,160, 62,190,207, 17, 61,134,221,244, 62,175,164,121, 61,145,152, 16, 62,179,214, 84,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,132,198, 62,186,157,182, 63,115,225, 84, 62,198, 85,208, 63,114,125,203,
- 62,200,114, 96, 63,109,192,177, 62,190,240,152, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,145,152, 16, 62,179,214, 84,
- 61,134,221,244, 62,175,164,121, 61,221, 91, 40, 62,167,194, 4, 61,208,226, 64, 62,172, 58,232, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 97, 32, 68, 62,178, 12,192, 63,109,132,198, 62,186,157,182, 63,109,192,177, 62,190,240,152, 63, 98, 91,112,
- 62,182,128,149, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,208,226, 64, 62,172, 58,232, 61,221, 91, 40, 62,167,194, 4,
- 62, 36,185, 48, 62,166, 7, 16, 62, 29,107,228, 62,169,230, 95, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 97, 1,118,
- 62,195,226, 47, 63, 97,113, 51, 62,189,151, 92, 63,102,139,215, 62,193,109, 15, 63,100, 47, 54, 62,198,115,186, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 5,169, 92, 62,179,115,168, 62, 29, 67,104, 62,177,199, 58, 62, 28, 43, 12, 62,184,177,186,
- 62, 13, 97, 50, 62,186, 42, 50, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,100, 47, 54, 62,198,115,186, 63,102,139,215,
- 62,193,109, 15, 63,105,241,174, 62,200, 8,204, 63,103,233, 71, 62,204, 42,178, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,229,171,228, 62,185, 42, 41, 62, 5,169, 92, 62,179,115,168, 62, 13, 97, 50, 62,186, 42, 50, 61,243,248, 92, 62,191, 22, 96,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,103,233, 71, 62,204, 42,178, 63,105,241,174, 62,200, 8,204, 63,108, 37, 51,
- 62,205, 3,249, 63,106,212, 56, 62,208,238, 96, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,202, 99,120, 62,190, 49,192,
- 61,229,171,228, 62,185, 42, 41, 61,243,248, 92, 62,191, 22, 96, 61,211,209,160, 62,195,159,108, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,106,212, 56, 62,208,238, 96, 63,108, 37, 51, 62,205, 3,249, 63,110, 73, 56, 62,206,119,186, 63,109,191, 46,
- 62,210, 64, 92, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,179,234,244, 62,190,219,240, 61,202, 99,120, 62,190, 49,192,
- 61,211,209,160, 62,195,159,108, 61,181,129,196, 62,196, 14,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,109, 27, 34,
- 62,214,254,155, 63,104, 86, 54, 62,214,241,209, 63,106,212, 56, 62,208,238, 96, 63,109,191, 46, 62,210, 64, 92, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 61,211,209,160, 62,195,159,108, 61,232, 2, 8, 62,203,214, 20, 61,184,174, 36, 62,202,130,216,
- 61,181,129,196, 62,196, 14,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,109,182, 62,210,255,149, 63,103,233, 71,
- 62,204, 42,178, 63,106,212, 56, 62,208,238, 96, 63,104, 86, 54, 62,214,241,209, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,211,209,160, 62,195,159,108, 61,243,248, 92, 62,191, 22, 96, 62, 7,107,160, 62,200,103, 34, 61,232, 2, 8, 62,203,214, 20,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,109,182, 62,210,255,149, 63, 97,206,112, 62,204,202, 10, 63,100, 47, 54,
- 62,198,115,186, 63,103,233, 71, 62,204, 42,178, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 13, 97, 50, 62,186, 42, 50,
- 62, 21, 68, 64, 62,194, 55,107, 62, 7,107,160, 62,200,103, 34, 61,243,248, 92, 62,191, 22, 96, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 97, 1,118, 62,195,226, 47, 63,100, 47, 54, 62,198,115,186, 63, 97,206,112, 62,204,202, 10, 63, 94,241, 82,
- 62,198,103, 40, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62, 21, 68, 64, 62,194, 55,107, 62, 13, 97, 50, 62,186, 42, 50,
- 62, 28, 43, 12, 62,184,177,186, 62, 35,225, 20, 62,188, 50, 39, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63, 96, 69, 96,
- 62,187,133,152, 63, 98, 91,112, 62,182,128,149, 63,102,139,215, 62,193,109, 15, 63, 97,113, 51, 62,189,151, 92, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 62, 5,169, 92, 62,179,115,168, 62, 29,107,228, 62,169,230, 95, 62, 35, 14,140, 62,176, 19, 33,
- 62, 29, 67,104, 62,177,199, 58, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,192,177, 62,190,240,152, 63,105,241,174,
- 62,200, 8,204, 63,102,139,215, 62,193,109, 15, 63, 98, 91,112, 62,182,128,149, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 62, 5,169, 92, 62,179,115,168, 61,229,171,228, 62,185, 42, 41, 61,208,226, 64, 62,172, 58,232, 62, 29,107,228, 62,169,230, 95,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,114,125,203, 62,200,114, 96, 63,108, 37, 51, 62,205, 3,249, 63,105,241,174,
- 62,200, 8,204, 63,109,192,177, 62,190,240,152, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,229,171,228, 62,185, 42, 41,
- 61,202, 99,120, 62,190, 49,192, 61,145,152, 16, 62,179,214, 84, 61,208,226, 64, 62,172, 58,232, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,114,143, 42, 62,207,168, 24, 63,110, 73, 56, 62,206,119,186, 63,108, 37, 51, 62,205, 3,249, 63,114,125,203,
- 62,200,114, 96, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,202, 99,120, 62,190, 49,192, 61,179,234,244, 62,190,219,240,
- 61,132, 85,184, 62,189,211, 22, 61,145,152, 16, 62,179,214, 84, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,113,134, 69,
- 62,212, 82,156, 63,109,191, 46, 62,210, 64, 92, 63,110, 73, 56, 62,206,119,186, 63,114,143, 42, 62,207,168, 24, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 61,179,234,244, 62,190,219,240, 61,181,129,196, 62,196, 14,204, 61,138,114, 60, 62,197, 61, 28,
- 61,132, 85,184, 62,189,211, 22, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,109, 27, 34, 62,214,254,155, 63,109,191, 46,
- 62,210, 64, 92, 63,113,134, 69, 62,212, 82,156, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 61,138,114, 60, 62,197, 61, 28, 61,181,129,196, 62,196, 14,204, 61,184,174, 36, 62,202,130,216, 63,128, 0, 0, 63,128, 0, 0,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,110,190, 84, 62,172, 77,223, 63, 90, 5,151, 62,167, 61,138, 63, 96, 25, 22,
- 62,149,248,246, 63,122,176,162, 62,161,215,145, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 62, 54,234, 64, 62,140,219,146,
- 62, 66,251,194, 62,158,102,163, 61,246, 66, 8, 62,152,161, 28, 61,189,241,172, 62,132,107, 13, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0, 0, 63,122, 12, 49, 62,197, 8,246, 63,110,190, 84, 62,172, 77,223, 63,122,176,162, 62,161,215,145, 63,126,255,188,
- 62,198,248,115, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 61,189,241,172, 62,132,107, 13, 61,246, 66, 8, 62,152,161, 28,
- 61, 16, 54,240, 62,167, 4,120, 58,163, 8, 0, 62,162, 69, 39, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 63,119,115,183,
- 62,215, 49,140, 63,122, 12, 49, 62,197, 8,246, 63,126,255,188, 62,198,248,115, 63,122, 6, 47, 62,216,157,248, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0, 0, 58,163, 8, 0, 62,162, 69, 39, 61, 16, 54,240, 62,167, 4,120, 60,231,111,224, 62,198,142,100,
- 60, 14,248,224, 62,198,141, 70, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 63,116, 76, 41, 62,222,153,139, 63,119,115,183,
- 62,215, 49,140, 63,122, 6, 47, 62,216,157,248, 63,119, 98,134, 62,225, 37,204, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0,
- 60, 14,248,224, 62,198,141, 70, 60,231,111,224, 62,198,142,100, 61, 73,183,128, 62,213,108, 84, 60,229,210, 80, 62,218,239, 32,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,178, 31, 62,228, 68,224, 63,116, 76, 41, 62,222,153,139, 63,119, 98,134,
- 62,225, 37,204, 63,115,185, 46, 62,234,157, 90, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,128, 60,229,210, 80, 62,218,239, 32,
- 61, 73,183,128, 62,213,108, 84, 61,177, 27, 28, 62,219,240, 42, 61,122,103, 56, 62,230, 10, 30, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0,128, 63,102,178, 46, 62,232,184,100, 63,109,178, 31, 62,228, 68,224, 63,115,185, 46, 62,234,157, 90, 63,106,134,244,
- 62,246, 64,234, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 61,122,103, 56, 62,230, 10, 30, 61,177, 27, 28, 62,219,240, 42,
- 61,242,216,120, 62,225, 40,124, 61,209,222,212, 62,240,123,238, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16, 63, 5,188,235,
- 63, 98, 74,252, 62,248,111,200, 63,112,105,197, 62,231, 49, 0, 63,107,190,118, 62,255, 57,150, 63, 96, 14, 53, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62, 95, 99, 80, 63, 94,194,149, 62, 62, 8, 58, 63, 89,154, 10, 62, 92, 24, 40, 63, 74, 82, 14,
- 62,112, 11,112, 63, 78,133,157, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 63, 5,188,235, 63, 98, 74,252, 63, 12,139,136,
- 63,101,233,138, 63, 6, 45,116, 63,113,245,112, 62,248,111,200, 63,112,105,197, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240,
- 62, 36,219, 68, 63, 81,186,249, 62, 65,254, 28, 63, 70, 55, 20, 62, 92, 24, 40, 63, 74, 82, 14, 62, 62, 8, 58, 63, 89,154, 10,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 63, 12,139,136, 63,101,233,138, 63, 12,130, 5, 63,108,216,149, 63, 6, 45,116,
- 63,113,245,112, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,112, 62, 36,219, 68, 63, 81,186,249,
- 62, 42, 1, 76, 63, 73,178, 39, 62, 65,254, 28, 63, 70, 55, 20, 63,128, 0, 0, 63,128, 0, 0, 8,193,158,224, 1, 0, 0, 5,
- 0, 0, 0,112, 63,103, 89,120, 63, 2, 76,105, 63, 93,154,106, 62,233, 26,226, 63,102,178, 46, 62,232,184,100, 63,106,134,244,
- 62,246, 64,234, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 61,242,216,120, 62,225, 40,124, 62, 33, 1,128, 62,226,210, 70,
- 61,234,128,116, 63, 0, 39,200, 61,209,222,212, 62,240,123,238, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 0, 62,245, 44,226,
- 63, 96,140,129, 62,255, 57,150, 63, 96, 14, 53, 62,231, 49, 0, 63,107,190,118, 62,227,135, 42, 63,101, 2, 58, 8,193,158,224,
- 1, 0, 0, 5, 0, 0, 0,240, 62, 95, 99, 80, 63, 94,194,149, 62,112, 11,112, 63, 78,133,157, 62,120, 84, 74, 63, 83, 32,104,
- 62,122,103,110, 63, 92,255,236, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0,240, 63, 77,217,216, 62,157,228, 7, 63, 90,225,160,
- 62,137,121,110, 63, 96, 25, 22, 62,149,248,246, 63, 90, 5,151, 62,167, 61,138, 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 16,
- 62, 54,234, 64, 62,140,219,146, 62, 74,125,166, 62,130, 30,252, 62,111,118,154, 62,152,108,120, 62, 66,251,194, 62,158,102,163,
- 8,193,158,224, 1, 0, 0, 5, 0, 0, 0, 64, 68, 65, 84, 65, 0, 0, 31, 64, 3,161,254, 32, 0, 0, 0, 59, 0, 0, 7,208,
+ 0, 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,182, 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, 68, 65, 84, 65, 16, 39, 0, 0,160,195,181, 3, 54, 0, 0, 0,244, 1, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 1, 0, 0, 0, 46, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 1,
+ 43, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0,
+ 42, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0,
+ 9, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 1, 9, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0, 12, 0, 0, 0,
+ 14, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1,112, 0, 0, 0, 13, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1,
+ 8, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0,112, 0, 0, 0, 9, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0, 19, 0, 0, 0, 17, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 1, 18, 0, 0, 0,
+ 20, 0, 0, 0,112, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 1, 20, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 1, 21, 0, 0, 0, 23, 0, 0, 0,
+ 25, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 1, 26, 0, 0, 0, 24, 0, 0, 0, 22, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1,
+ 19, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 28, 0, 0, 0, 26, 0, 0, 0, 20, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 0, 1, 25, 0, 0, 0, 31, 0, 0, 0, 29, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 1, 30, 0, 0, 0,
+ 32, 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 1, 23, 0, 0, 0, 33, 0, 0, 0, 31, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 1, 32, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0,
+ 37, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 1, 38, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 1,
+ 31, 0, 0, 0, 37, 0, 0, 0, 39, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 38, 0, 0, 0, 32, 0, 0, 0,
+ 30, 0, 0, 0, 0, 0, 0, 1, 37, 0, 0, 0, 43, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 1, 42, 0, 0, 0,
+ 44, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 1, 35, 0, 0, 0, 45, 0, 0, 0, 43, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 1, 44, 0, 0, 0, 46, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 0,
+ 49, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 1, 50, 0, 0, 0, 36, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 1,
+ 35, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 1, 52, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0,
+ 50, 0, 0, 0, 0, 0, 0, 1, 33, 0, 0, 0, 23, 0, 0, 0, 53, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 1, 54, 0, 0, 0,
+ 24, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 1, 23, 0, 0, 0, 21, 0, 0, 0, 55, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 1, 56, 0, 0, 0, 22, 0, 0, 0, 24, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 1, 21, 0, 0, 0, 12, 0, 0, 0,
+ 57, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 1, 58, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 1,
+ 12, 0, 0, 0, 10, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 1, 62, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0,
+ 58, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0,
+ 1, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 45, 0, 0, 0, 47, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 1, 48, 0, 0, 0, 46, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 63, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 0, 0, 0, 64, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 61, 0, 0, 0, 63, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 64, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0, 0, 0,
+ 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 55, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 58, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 53, 0, 0, 0,
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 56, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 59, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 54, 0, 0, 0, 52, 0, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 52, 0, 0, 0,
+ 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 50, 0, 0, 0, 48, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0, 0,171, 0, 0, 0,
+173, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1,173, 0, 0, 0,172, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1,
+ 85, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 1,172, 0, 0, 0,170, 0, 0, 0, 86, 0, 0, 0,
+ 88, 0, 0, 0, 0, 0, 0, 1, 83, 0, 0, 0,167, 0, 0, 0,169, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 1,170, 0, 0, 0,
+168, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0,165, 0, 0, 0,167, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 0, 1,168, 0, 0, 0,166, 0, 0, 0, 82, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0,163, 0, 0, 0,
+165, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 1,166, 0, 0, 0,164, 0, 0, 0, 80, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 1,
+ 77, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 1,144, 0, 0, 0, 91, 0, 0, 0, 78, 0, 0, 0,
+162, 0, 0, 0, 0, 0, 0, 1, 90, 0, 0, 0, 92, 0, 0, 0,145, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 1,146, 0, 0, 0,
+ 93, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 1, 92, 0, 0, 0, 94, 0, 0, 0,147, 0, 0, 0,145, 0, 0, 0,
+ 0, 0, 0, 1,148, 0, 0, 0, 95, 0, 0, 0, 93, 0, 0, 0,146, 0, 0, 0, 0, 0, 0, 1, 94, 0, 0, 0, 96, 0, 0, 0,
+149, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 1,150, 0, 0, 0, 97, 0, 0, 0, 95, 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 1,
+ 96, 0, 0, 0, 98, 0, 0, 0,151, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0, 99, 0, 0, 0, 97, 0, 0, 0,
+150, 0, 0, 0, 0, 0, 0, 1, 98, 0, 0, 0,100, 0, 0, 0,153, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 1,154, 0, 0, 0,
+101, 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 1,100, 0, 0, 0,102, 0, 0, 0,155, 0, 0, 0,153, 0, 0, 0,
+ 0, 0, 0, 1,156, 0, 0, 0,103, 0, 0, 0,101, 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 1,102, 0, 0, 0,104, 0, 0, 0,
+157, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 1,158, 0, 0, 0,105, 0, 0, 0,103, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 1,
+104, 0, 0, 0,106, 0, 0, 0,159, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 1,160, 0, 0, 0,107, 0, 0, 0,105, 0, 0, 0,
+158, 0, 0, 0, 0, 0, 0, 1,106, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 1, 66, 0, 0, 0,
+ 65, 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 1,108, 0, 0, 0,125, 0, 0, 0,157, 0, 0, 0,159, 0, 0, 0,
+ 0, 0, 0, 1,158, 0, 0, 0,126, 0, 0, 0,109, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 1,125, 0, 0, 0,176, 0, 0, 0,
+155, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 1,156, 0, 0, 0,177, 0, 0, 0,126, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 1,
+123, 0, 0, 0,153, 0, 0, 0,155, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 1,156, 0, 0, 0,154, 0, 0, 0,124, 0, 0, 0,
+177, 0, 0, 0, 0, 0, 0, 1,121, 0, 0, 0,151, 0, 0, 0,153, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 1,154, 0, 0, 0,
+152, 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 1,119, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0,121, 0, 0, 0,
+ 0, 0, 0, 1,152, 0, 0, 0,150, 0, 0, 0,120, 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0,147, 0, 0, 0,
+149, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 1,150, 0, 0, 0,148, 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 1,
+115, 0, 0, 0,145, 0, 0, 0,147, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 1,148, 0, 0, 0,146, 0, 0, 0,116, 0, 0, 0,
+118, 0, 0, 0, 0, 0, 0, 1,113, 0, 0, 0,143, 0, 0, 0,145, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 1,146, 0, 0, 0,
+144, 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0,161, 0, 0, 0,143, 0, 0, 0,113, 0, 0, 0,
+ 0, 0, 0, 1,144, 0, 0, 0,162, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0,178, 0, 0, 0,
+174, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 1,174, 0, 0, 0,179, 0, 0, 0,112, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 1,
+108, 0, 0, 0,159, 0, 0, 0, 66, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 1, 66, 0, 0, 0,160, 0, 0, 0,109, 0, 0, 0,
+111, 0, 0, 0, 0, 0, 0, 1,110, 0, 0, 0, 66, 0, 0, 0,175, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 1,175, 0, 0, 0,
+ 66, 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0, 0, 0, 0, 1,174, 0, 0, 0,178, 0, 0, 0,180, 0, 0, 0,175, 0, 0, 0,
+ 0, 0, 0, 1,181, 0, 0, 0,179, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 1,132, 0, 0, 0,134, 0, 0, 0,
+173, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 1,173, 0, 0, 0,134, 0, 0, 0,133, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 1,
+130, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0,169, 0, 0, 0, 0, 0, 0, 1,172, 0, 0, 0,133, 0, 0, 0,131, 0, 0, 0,
+170, 0, 0, 0, 0, 0, 0, 1,128, 0, 0, 0,130, 0, 0, 0,169, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 1,170, 0, 0, 0,
+131, 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 1,163, 0, 0, 0,184, 0, 0, 0,182, 0, 0, 0,165, 0, 0, 0,
+ 0, 0, 0, 1,183, 0, 0, 0,185, 0, 0, 0,164, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 1,128, 0, 0, 0,167, 0, 0, 0,
+165, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 1,166, 0, 0, 0,168, 0, 0, 0,129, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 1,
+141, 0, 0, 0,187, 0, 0, 0,186, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 1,186, 0, 0, 0,187, 0, 0, 0,142, 0, 0, 0,
+185, 0, 0, 0, 0, 0, 0, 1,182, 0, 0, 0,184, 0, 0, 0,186, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,186, 0, 0, 0,
+185, 0, 0, 0,183, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,127, 0, 0, 0,128, 0, 0, 0,182, 0, 0, 0, 67, 0, 0, 0,
+ 0, 0, 0, 1,183, 0, 0, 0,129, 0, 0, 0,127, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0,190, 0, 0, 0,
+188, 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 1,189, 0, 0, 0,191, 0, 0, 0,140, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 1,
+137, 0, 0, 0,192, 0, 0, 0,190, 0, 0, 0,139, 0, 0, 0, 0, 0, 0, 1,191, 0, 0, 0,193, 0, 0, 0,138, 0, 0, 0,
+140, 0, 0, 0, 0, 0, 0, 1,136, 0, 0, 0,194, 0, 0, 0,192, 0, 0, 0,137, 0, 0, 0, 0, 0, 0, 1,193, 0, 0, 0,
+195, 0, 0, 0,136, 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 1,135, 0, 0, 0, 69, 0, 0, 0,194, 0, 0, 0,136, 0, 0, 0,
+ 0, 0, 0, 1,195, 0, 0, 0, 69, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 1,187, 0, 0, 0,141, 0, 0, 0,
+188, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 1,189, 0, 0, 0,142, 0, 0, 0,187, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 1,
+ 68, 0, 0, 0,188, 0, 0, 0,203, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 1,204, 0, 0, 0,189, 0, 0, 0, 68, 0, 0, 0,
+205, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 0,196, 0, 0, 0,197, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 1,198, 0, 0, 0,
+196, 0, 0, 0, 69, 0, 0, 0,195, 0, 0, 0, 0, 0, 0, 1,194, 0, 0, 0,197, 0, 0, 0,199, 0, 0, 0,192, 0, 0, 0,
+ 0, 0, 0, 1,200, 0, 0, 0,198, 0, 0, 0,195, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 1,192, 0, 0, 0,199, 0, 0, 0,
+201, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 1,202, 0, 0, 0,200, 0, 0, 0,193, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 1,
+190, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 1,204, 0, 0, 0,202, 0, 0, 0,191, 0, 0, 0,
+189, 0, 0, 0, 0, 0, 0, 1,196, 0, 0, 0,201, 0, 0, 0,199, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 1,200, 0, 0, 0,
+202, 0, 0, 0,196, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 1,196, 0, 0, 0,205, 0, 0, 0,203, 0, 0, 0,201, 0, 0, 0,
+ 0, 0, 0, 1,204, 0, 0, 0,205, 0, 0, 0,196, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 1,136, 0, 0, 0,137, 0, 0, 0,
+161, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 1,162, 0, 0, 0,138, 0, 0, 0,136, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 1,
+137, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,140, 0, 0, 0,138, 0, 0, 0,
+162, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0,141, 0, 0, 0,210, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 1,211, 0, 0, 0,
+142, 0, 0, 0,140, 0, 0, 0,209, 0, 0, 0, 0, 0, 0, 1,141, 0, 0, 0,184, 0, 0, 0,163, 0, 0, 0,210, 0, 0, 0,
+ 0, 0, 0, 1,164, 0, 0, 0,185, 0, 0, 0,142, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0,206, 0, 0, 0,
+210, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 1,211, 0, 0, 0,207, 0, 0, 0, 80, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 1,
+206, 0, 0, 0,212, 0, 0, 0,208, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,213, 0, 0, 0,207, 0, 0, 0,
+211, 0, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0,161, 0, 0, 0,208, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,
+162, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 1,128, 0, 0, 0,127, 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0,
+ 0, 0, 0, 1, 70, 0, 0, 0,127, 0, 0, 0,129, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 1,130, 0, 0, 0,128, 0, 0, 0,
+219, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 1,220, 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 1,
+132, 0, 0, 0,130, 0, 0, 0,217, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 1,218, 0, 0, 0,131, 0, 0, 0,133, 0, 0, 0,
+216, 0, 0, 0, 0, 0, 0, 1,134, 0, 0, 0,132, 0, 0, 0,215, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 1,216, 0, 0, 0,
+133, 0, 0, 0,134, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 1,214, 0, 0, 0,215, 0, 0, 0,226, 0, 0, 0,228, 0, 0, 0,
+ 0, 0, 0, 1,227, 0, 0, 0,216, 0, 0, 0,214, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 1,215, 0, 0, 0,217, 0, 0, 0,
+224, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 1,225, 0, 0, 0,218, 0, 0, 0,216, 0, 0, 0,227, 0, 0, 0, 0, 0, 0, 1,
+217, 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 1,223, 0, 0, 0,220, 0, 0, 0,218, 0, 0, 0,
+225, 0, 0, 0, 0, 0, 0, 1,219, 0, 0, 0, 70, 0, 0, 0,221, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 1,221, 0, 0, 0,
+ 70, 0, 0, 0,220, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 1,221, 0, 0, 0,228, 0, 0, 0,226, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 0, 1,227, 0, 0, 0,228, 0, 0, 0,221, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 1,222, 0, 0, 0,226, 0, 0, 0,
+224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,225, 0, 0, 0,227, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+180, 0, 0, 0,178, 0, 0, 0,231, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 1,232, 0, 0, 0,179, 0, 0, 0,181, 0, 0, 0,
+230, 0, 0, 0, 0, 0, 0, 1,110, 0, 0, 0,180, 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 1,230, 0, 0, 0,
+181, 0, 0, 0,111, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 1,108, 0, 0, 0,110, 0, 0, 0,251, 0, 0, 0,253, 0, 0, 0,
+ 0, 0, 0, 1,252, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 1,178, 0, 0, 0, 14, 0, 0, 0,
+249, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 1,250, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 1,
+ 14, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 1,248, 0, 0, 0,114, 0, 0, 0,112, 0, 0, 0,
+250, 0, 0, 0, 0, 0, 0, 1,113, 0, 0, 0,115, 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 1,246, 0, 0, 0,
+116, 0, 0, 0,114, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 1,115, 0, 0, 0,117, 0, 0, 0,243, 0, 0, 0,245, 0, 0, 0,
+ 0, 0, 0, 1,244, 0, 0, 0,118, 0, 0, 0,116, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0,119, 0, 0, 0,
+241, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 1,242, 0, 0, 0,120, 0, 0, 0,118, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 1,
+119, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0,241, 0, 0, 0, 0, 0, 0, 1,240, 0, 0, 0,122, 0, 0, 0,120, 0, 0, 0,
+242, 0, 0, 0, 0, 0, 0, 1,121, 0, 0, 0,123, 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 1,238, 0, 0, 0,
+124, 0, 0, 0,122, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 1,123, 0, 0, 0,176, 0, 0, 0,233, 0, 0, 0,237, 0, 0, 0,
+ 0, 0, 0, 1,234, 0, 0, 0,177, 0, 0, 0,124, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 1,176, 0, 0, 0,125, 0, 0, 0,
+235, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 1,236, 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 1,
+125, 0, 0, 0,108, 0, 0, 0,253, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 1,254, 0, 0, 0,109, 0, 0, 0,126, 0, 0, 0,
+236, 0, 0, 0, 0, 0, 0, 1,235, 0, 0, 0,253, 0, 0, 0,255, 0, 0, 0, 17, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
+254, 0, 0, 0,236, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 1,233, 0, 0, 0,235, 0, 0, 0, 17, 1, 0, 0, 19, 1, 0, 0,
+ 0, 0, 0, 1, 18, 1, 0, 0,236, 0, 0, 0,234, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 1,237, 0, 0, 0,233, 0, 0, 0,
+ 19, 1, 0, 0, 15, 1, 0, 0, 0, 0, 0, 1, 20, 1, 0, 0,234, 0, 0, 0,238, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 1,
+239, 0, 0, 0,237, 0, 0, 0, 15, 1, 0, 0, 13, 1, 0, 0, 0, 0, 0, 1, 16, 1, 0, 0,238, 0, 0, 0,240, 0, 0, 0,
+ 14, 1, 0, 0, 0, 0, 0, 1,241, 0, 0, 0,239, 0, 0, 0, 13, 1, 0, 0, 11, 1, 0, 0, 0, 0, 0, 1, 14, 1, 0, 0,
+240, 0, 0, 0,242, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 1,243, 0, 0, 0,241, 0, 0, 0, 11, 1, 0, 0, 9, 1, 0, 0,
+ 0, 0, 0, 1, 12, 1, 0, 0,242, 0, 0, 0,244, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 1,245, 0, 0, 0,243, 0, 0, 0,
+ 9, 1, 0, 0, 7, 1, 0, 0, 0, 0, 0, 1, 10, 1, 0, 0,244, 0, 0, 0,246, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 1,
+247, 0, 0, 0,245, 0, 0, 0, 7, 1, 0, 0, 5, 1, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0,246, 0, 0, 0,248, 0, 0, 0,
+ 6, 1, 0, 0, 0, 0, 0, 1,249, 0, 0, 0,247, 0, 0, 0, 5, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0,
+248, 0, 0, 0,250, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 1,231, 0, 0, 0,249, 0, 0, 0, 3, 1, 0, 0, 21, 1, 0, 0,
+ 0, 0, 0, 1, 4, 1, 0, 0,250, 0, 0, 0,232, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1,253, 0, 0, 0,251, 0, 0, 0,
+ 1, 1, 0, 0,255, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0,252, 0, 0, 0,254, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
+251, 0, 0, 0,229, 0, 0, 0, 23, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 24, 1, 0, 0,230, 0, 0, 0,252, 0, 0, 0,
+ 2, 1, 0, 0, 0, 0, 0, 1,229, 0, 0, 0,231, 0, 0, 0, 21, 1, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 22, 1, 0, 0,
+232, 0, 0, 0,230, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 1, 65, 0, 0, 0,106, 0, 0, 0, 25, 1, 0, 0, 71, 0, 0, 0,
+ 0, 0, 0, 1, 26, 1, 0, 0,107, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1,106, 0, 0, 0,104, 0, 0, 0,
+ 27, 1, 0, 0, 25, 1, 0, 0, 0, 0, 0, 1, 28, 1, 0, 0,105, 0, 0, 0,107, 0, 0, 0, 26, 1, 0, 0, 0, 0, 0, 1,
+104, 0, 0, 0,102, 0, 0, 0, 29, 1, 0, 0, 27, 1, 0, 0, 0, 0, 0, 1, 30, 1, 0, 0,103, 0, 0, 0,105, 0, 0, 0,
+ 28, 1, 0, 0, 0, 0, 0, 1,102, 0, 0, 0,100, 0, 0, 0, 31, 1, 0, 0, 29, 1, 0, 0, 0, 0, 0, 1, 32, 1, 0, 0,
+101, 0, 0, 0,103, 0, 0, 0, 30, 1, 0, 0, 0, 0, 0, 1,100, 0, 0, 0, 98, 0, 0, 0, 33, 1, 0, 0, 31, 1, 0, 0,
+ 0, 0, 0, 1, 34, 1, 0, 0, 99, 0, 0, 0,101, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 1, 98, 0, 0, 0, 96, 0, 0, 0,
+ 35, 1, 0, 0, 33, 1, 0, 0, 0, 0, 0, 1, 36, 1, 0, 0, 97, 0, 0, 0, 99, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 1,
+ 96, 0, 0, 0, 94, 0, 0, 0, 37, 1, 0, 0, 35, 1, 0, 0, 0, 0, 0, 1, 38, 1, 0, 0, 95, 0, 0, 0, 97, 0, 0, 0,
+ 36, 1, 0, 0, 0, 0, 0, 1, 94, 0, 0, 0, 92, 0, 0, 0, 39, 1, 0, 0, 37, 1, 0, 0, 0, 0, 0, 1, 40, 1, 0, 0,
+ 93, 0, 0, 0, 95, 0, 0, 0, 38, 1, 0, 0, 0, 0, 0, 1, 92, 0, 0, 0, 90, 0, 0, 0, 41, 1, 0, 0, 39, 1, 0, 0,
+ 0, 0, 0, 1, 42, 1, 0, 0, 91, 0, 0, 0, 93, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 49, 1, 0, 0, 50, 1, 0, 0,
+ 69, 1, 0, 0, 79, 1, 0, 0, 0, 0, 0, 1, 70, 1, 0, 0, 50, 1, 0, 0, 49, 1, 0, 0, 80, 1, 0, 0, 0, 0, 0, 1,
+ 48, 1, 0, 0, 49, 1, 0, 0, 79, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 1, 80, 1, 0, 0, 49, 1, 0, 0, 48, 1, 0, 0,
+ 78, 1, 0, 0, 0, 0, 0, 1, 47, 1, 0, 0, 48, 1, 0, 0, 77, 1, 0, 0, 81, 1, 0, 0, 0, 0, 0, 1, 78, 1, 0, 0,
+ 48, 1, 0, 0, 47, 1, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 87, 0, 0, 0, 89, 0, 0, 0, 47, 1, 0, 0, 81, 1, 0, 0,
+ 0, 0, 0, 1, 47, 1, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 87, 0, 0, 0,
+ 81, 1, 0, 0, 75, 1, 0, 0, 0, 0, 0, 1, 82, 1, 0, 0, 88, 0, 0, 0, 86, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 1,
+ 83, 0, 0, 0, 85, 0, 0, 0, 75, 1, 0, 0, 71, 1, 0, 0, 0, 0, 0, 1, 76, 1, 0, 0, 86, 0, 0, 0, 84, 0, 0, 0,
+ 72, 1, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 83, 0, 0, 0, 71, 1, 0, 0, 73, 1, 0, 0, 0, 0, 0, 1, 72, 1, 0, 0,
+ 84, 0, 0, 0, 82, 0, 0, 0, 74, 1, 0, 0, 0, 0, 0, 1, 71, 1, 0, 0, 77, 1, 0, 0, 79, 1, 0, 0, 73, 1, 0, 0,
+ 0, 0, 0, 1, 80, 1, 0, 0, 78, 1, 0, 0, 72, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 1, 71, 1, 0, 0, 75, 1, 0, 0,
+ 81, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 1, 82, 1, 0, 0, 76, 1, 0, 0, 72, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 1,
+ 67, 1, 0, 0, 73, 1, 0, 0, 79, 1, 0, 0, 69, 1, 0, 0, 0, 0, 0, 1, 80, 1, 0, 0, 74, 1, 0, 0, 68, 1, 0, 0,
+ 70, 1, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0, 81, 0, 0, 0, 73, 1, 0, 0, 67, 1, 0, 0, 0, 0, 0, 1, 74, 1, 0, 0,
+ 82, 0, 0, 0, 80, 0, 0, 0, 68, 1, 0, 0, 0, 0, 0, 1,206, 0, 0, 0, 83, 1, 0, 0, 85, 1, 0, 0,212, 0, 0, 0,
+ 0, 0, 0, 1, 86, 1, 0, 0, 84, 1, 0, 0,207, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0, 67, 1, 0, 0,
+ 83, 1, 0, 0,206, 0, 0, 0, 0, 0, 0, 1, 84, 1, 0, 0, 68, 1, 0, 0, 80, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 1,
+ 77, 0, 0, 0,212, 0, 0, 0, 85, 1, 0, 0, 87, 1, 0, 0, 0, 0, 0, 1, 86, 1, 0, 0,213, 0, 0, 0, 78, 0, 0, 0,
+ 88, 1, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0, 87, 1, 0, 0, 41, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 1, 42, 1, 0, 0,
+ 88, 1, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 1, 75, 0, 0, 0, 65, 1, 0, 0, 93, 1, 0, 0, 45, 1, 0, 0,
+ 0, 0, 0, 1, 94, 1, 0, 0, 66, 1, 0, 0, 75, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 45, 1, 0, 0, 93, 1, 0, 0,
+ 91, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 92, 1, 0, 0, 94, 1, 0, 0, 45, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1,
+ 76, 0, 0, 0, 91, 1, 0, 0, 89, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 1, 90, 1, 0, 0, 92, 1, 0, 0, 76, 0, 0, 0,
+ 46, 1, 0, 0, 0, 0, 0, 1, 46, 1, 0, 0, 89, 1, 0, 0, 69, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 1, 70, 1, 0, 0,
+ 90, 1, 0, 0, 46, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 1, 67, 1, 0, 0, 69, 1, 0, 0, 89, 1, 0, 0, 83, 1, 0, 0,
+ 0, 0, 0, 1, 90, 1, 0, 0, 70, 1, 0, 0, 68, 1, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 37, 1, 0, 0, 39, 1, 0, 0,
+ 59, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 1, 60, 1, 0, 0, 40, 1, 0, 0, 38, 1, 0, 0, 52, 1, 0, 0, 0, 0, 0, 1,
+ 74, 0, 0, 0, 57, 1, 0, 0, 65, 1, 0, 0, 75, 0, 0, 0, 0, 0, 0, 1, 66, 1, 0, 0, 58, 1, 0, 0, 74, 0, 0, 0,
+ 75, 0, 0, 0, 0, 0, 0, 1, 43, 1, 0, 0, 99, 1, 0, 0, 97, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 1, 98, 1, 0, 0,
+100, 1, 0, 0, 43, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 1, 44, 1, 0, 0, 97, 1, 0, 0, 95, 1, 0, 0, 73, 0, 0, 0,
+ 0, 0, 0, 1, 96, 1, 0, 0, 98, 1, 0, 0, 44, 1, 0, 0, 73, 0, 0, 0, 0, 0, 0, 1, 73, 0, 0, 0, 95, 1, 0, 0,
+ 57, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 1, 58, 1, 0, 0, 96, 1, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 1,
+ 33, 1, 0, 0, 35, 1, 0, 0,103, 1, 0, 0,105, 1, 0, 0, 0, 0, 0, 1,104, 1, 0, 0, 36, 1, 0, 0, 34, 1, 0, 0,
+106, 1, 0, 0, 0, 0, 0, 1,105, 1, 0, 0,103, 1, 0, 0,109, 1, 0, 0,107, 1, 0, 0, 0, 0, 0, 1,110, 1, 0, 0,
+104, 1, 0, 0,106, 1, 0, 0,108, 1, 0, 0, 0, 0, 0, 1,107, 1, 0, 0,109, 1, 0, 0,111, 1, 0, 0,113, 1, 0, 0,
+ 0, 0, 0, 1,112, 1, 0, 0,110, 1, 0, 0,108, 1, 0, 0,114, 1, 0, 0, 0, 0, 0, 1,113, 1, 0, 0,111, 1, 0, 0,
+117, 1, 0, 0,115, 1, 0, 0, 0, 0, 0, 1,118, 1, 0, 0,112, 1, 0, 0,114, 1, 0, 0,116, 1, 0, 0, 0, 0, 0, 1,
+ 55, 1, 0, 0,119, 1, 0, 0,115, 1, 0, 0,117, 1, 0, 0, 0, 0, 0, 1,116, 1, 0, 0,120, 1, 0, 0, 56, 1, 0, 0,
+118, 1, 0, 0, 0, 0, 0, 1, 57, 1, 0, 0, 95, 1, 0, 0,115, 1, 0, 0,119, 1, 0, 0, 0, 0, 0, 1,116, 1, 0, 0,
+ 96, 1, 0, 0, 58, 1, 0, 0,120, 1, 0, 0, 0, 0, 0, 1, 95, 1, 0, 0, 97, 1, 0, 0,113, 1, 0, 0,115, 1, 0, 0,
+ 0, 0, 0, 1,114, 1, 0, 0, 98, 1, 0, 0, 96, 1, 0, 0,116, 1, 0, 0, 0, 0, 0, 1, 97, 1, 0, 0, 99, 1, 0, 0,
+107, 1, 0, 0,113, 1, 0, 0, 0, 0, 0, 1,108, 1, 0, 0,100, 1, 0, 0, 98, 1, 0, 0,114, 1, 0, 0, 0, 0, 0, 1,
+ 99, 1, 0, 0,101, 1, 0, 0,105, 1, 0, 0,107, 1, 0, 0, 0, 0, 0, 1,106, 1, 0, 0,102, 1, 0, 0,100, 1, 0, 0,
+108, 1, 0, 0, 0, 0, 0, 1, 31, 1, 0, 0, 33, 1, 0, 0,105, 1, 0, 0,101, 1, 0, 0, 0, 0, 0, 1,106, 1, 0, 0,
+ 34, 1, 0, 0, 32, 1, 0, 0,102, 1, 0, 0, 0, 0, 0, 1, 72, 0, 0, 0,101, 1, 0, 0, 99, 1, 0, 0, 43, 1, 0, 0,
+ 0, 0, 0, 1,100, 1, 0, 0,102, 1, 0, 0, 72, 0, 0, 0, 43, 1, 0, 0, 0, 0, 0, 1, 25, 1, 0, 0, 27, 1, 0, 0,
+ 29, 1, 0, 0, 31, 1, 0, 0, 0, 0, 0, 1, 30, 1, 0, 0, 28, 1, 0, 0, 26, 1, 0, 0, 32, 1, 0, 0, 0, 0, 0, 1,
+ 25, 1, 0, 0, 31, 1, 0, 0,101, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 1,102, 1, 0, 0, 32, 1, 0, 0, 26, 1, 0, 0,
+ 72, 0, 0, 0, 0, 0, 0, 1, 71, 0, 0, 0, 25, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 72, 0, 0, 0,
+ 26, 1, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 35, 1, 0, 0, 37, 1, 0, 0, 51, 1, 0, 0,103, 1, 0, 0,
+ 0, 0, 0, 1, 52, 1, 0, 0, 38, 1, 0, 0, 36, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 1, 51, 1, 0, 0, 53, 1, 0, 0,
+109, 1, 0, 0,103, 1, 0, 0, 0, 0, 0, 1,110, 1, 0, 0, 54, 1, 0, 0, 52, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 1,
+ 53, 1, 0, 0,123, 1, 0, 0,111, 1, 0, 0,109, 1, 0, 0, 0, 0, 0, 1,112, 1, 0, 0,124, 1, 0, 0, 54, 1, 0, 0,
+110, 1, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,117, 1, 0, 0,111, 1, 0, 0,123, 1, 0, 0, 0, 0, 0, 1,112, 1, 0, 0,
+118, 1, 0, 0, 56, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 1, 89, 1, 0, 0, 91, 1, 0, 0,127, 1, 0, 0,125, 1, 0, 0,
+ 0, 0, 0, 1,128, 1, 0, 0, 92, 1, 0, 0, 90, 1, 0, 0,126, 1, 0, 0, 0, 0, 0, 1, 59, 1, 0, 0,125, 1, 0, 0,
+127, 1, 0, 0, 61, 1, 0, 0, 0, 0, 0, 1,128, 1, 0, 0,126, 1, 0, 0, 60, 1, 0, 0, 62, 1, 0, 0, 0, 0, 0, 1,
+ 39, 1, 0, 0, 41, 1, 0, 0,125, 1, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1,126, 1, 0, 0, 42, 1, 0, 0, 40, 1, 0, 0,
+ 60, 1, 0, 0, 0, 0, 0, 1, 41, 1, 0, 0, 85, 1, 0, 0, 83, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 1, 84, 1, 0, 0,
+ 86, 1, 0, 0, 42, 1, 0, 0,126, 1, 0, 0, 0, 0, 0, 1, 83, 1, 0, 0, 89, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,126, 1, 0, 0, 90, 1, 0, 0, 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 1, 0, 0, 87, 1, 0, 0,
+ 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 86, 1, 0, 0, 88, 1, 0, 0, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 55, 1, 0, 0, 63, 1, 0, 0,121, 1, 0, 0,119, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0, 64, 1, 0, 0, 56, 1, 0, 0,
+120, 1, 0, 0, 0, 0, 0, 1, 57, 1, 0, 0,119, 1, 0, 0,121, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0,
+120, 1, 0, 0, 58, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 1, 61, 1, 0, 0,127, 1, 0, 0,121, 1, 0, 0, 63, 1, 0, 0,
+ 0, 0, 0, 1,122, 1, 0, 0,128, 1, 0, 0, 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 1, 91, 1, 0, 0, 93, 1, 0, 0,
+121, 1, 0, 0,127, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0, 94, 1, 0, 0, 92, 1, 0, 0,128, 1, 0, 0, 0, 0, 0, 1,
+ 65, 1, 0, 0,121, 1, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 94, 1, 0, 0,122, 1, 0, 0, 66, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1,141, 1, 0, 0,129, 1, 0, 0,155, 1, 0, 0,143, 1, 0, 0, 0, 0, 0, 1,156, 1, 0, 0,
+130, 1, 0, 0,142, 1, 0, 0,144, 1, 0, 0, 0, 0, 0, 1,141, 1, 0, 0,143, 1, 0, 0,145, 1, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 1,146, 1, 0, 0,144, 1, 0, 0,142, 1, 0, 0,140, 1, 0, 0, 0, 0, 0, 1,139, 1, 0, 0,145, 1, 0, 0,
+147, 1, 0, 0,137, 1, 0, 0, 0, 0, 0, 1,148, 1, 0, 0,146, 1, 0, 0,140, 1, 0, 0,138, 1, 0, 0, 0, 0, 0, 1,
+137, 1, 0, 0,147, 1, 0, 0,149, 1, 0, 0,135, 1, 0, 0, 0, 0, 0, 1,150, 1, 0, 0,148, 1, 0, 0,138, 1, 0, 0,
+136, 1, 0, 0, 0, 0, 0, 1,135, 1, 0, 0,149, 1, 0, 0,151, 1, 0, 0,133, 1, 0, 0, 0, 0, 0, 1,152, 1, 0, 0,
+150, 1, 0, 0,136, 1, 0, 0,134, 1, 0, 0, 0, 0, 0, 1,133, 1, 0, 0,151, 1, 0, 0,153, 1, 0, 0,131, 1, 0, 0,
+ 0, 0, 0, 1,154, 1, 0, 0,152, 1, 0, 0,134, 1, 0, 0,132, 1, 0, 0, 0, 0, 0, 1,151, 1, 0, 0,161, 1, 0, 0,
+159, 1, 0, 0,153, 1, 0, 0, 0, 0, 0, 1,160, 1, 0, 0,162, 1, 0, 0,152, 1, 0, 0,154, 1, 0, 0, 0, 0, 0, 1,
+149, 1, 0, 0,163, 1, 0, 0,161, 1, 0, 0,151, 1, 0, 0, 0, 0, 0, 1,162, 1, 0, 0,164, 1, 0, 0,150, 1, 0, 0,
+152, 1, 0, 0, 0, 0, 0, 1,147, 1, 0, 0,165, 1, 0, 0,163, 1, 0, 0,149, 1, 0, 0, 0, 0, 0, 1,164, 1, 0, 0,
+166, 1, 0, 0,148, 1, 0, 0,150, 1, 0, 0, 0, 0, 0, 1,145, 1, 0, 0,167, 1, 0, 0,165, 1, 0, 0,147, 1, 0, 0,
+ 0, 0, 0, 1,166, 1, 0, 0,168, 1, 0, 0,146, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 1,143, 1, 0, 0,169, 1, 0, 0,
+167, 1, 0, 0,145, 1, 0, 0, 0, 0, 0, 1,168, 1, 0, 0,170, 1, 0, 0,144, 1, 0, 0,146, 1, 0, 0, 0, 0, 0, 1,
+143, 1, 0, 0,155, 1, 0, 0,157, 1, 0, 0,169, 1, 0, 0, 0, 0, 0, 1,158, 1, 0, 0,156, 1, 0, 0,144, 1, 0, 0,
+170, 1, 0, 0, 0, 0, 0, 1, 59, 1, 0, 0, 61, 1, 0, 0,185, 1, 0, 0,183, 1, 0, 0, 0, 0, 0, 1,186, 1, 0, 0,
+ 62, 1, 0, 0, 60, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 1, 61, 1, 0, 0,131, 1, 0, 0,153, 1, 0, 0,185, 1, 0, 0,
+ 0, 0, 0, 1,154, 1, 0, 0,132, 1, 0, 0, 62, 1, 0, 0,186, 1, 0, 0, 0, 0, 0, 1, 51, 1, 0, 0, 59, 1, 0, 0,
+183, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 1,184, 1, 0, 0, 60, 1, 0, 0, 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 0, 1,
+123, 1, 0, 0,171, 1, 0, 0,155, 1, 0, 0,129, 1, 0, 0, 0, 0, 0, 1,156, 1, 0, 0,172, 1, 0, 0,124, 1, 0, 0,
+130, 1, 0, 0, 0, 0, 0, 1,153, 1, 0, 0,159, 1, 0, 0,181, 1, 0, 0,185, 1, 0, 0, 0, 0, 0, 1,182, 1, 0, 0,
+160, 1, 0, 0,154, 1, 0, 0,186, 1, 0, 0, 0, 0, 0, 1,179, 1, 0, 0,187, 1, 0, 0,185, 1, 0, 0,181, 1, 0, 0,
+ 0, 0, 0, 1,186, 1, 0, 0,188, 1, 0, 0,180, 1, 0, 0,182, 1, 0, 0, 0, 0, 0, 1,175, 1, 0, 0,187, 1, 0, 0,
+179, 1, 0, 0,177, 1, 0, 0, 0, 0, 0, 1,180, 1, 0, 0,188, 1, 0, 0,176, 1, 0, 0,178, 1, 0, 0, 0, 0, 0, 1,
+173, 1, 0, 0,189, 1, 0, 0,187, 1, 0, 0,175, 1, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,190, 1, 0, 0,174, 1, 0, 0,
+176, 1, 0, 0, 0, 0, 0, 1,171, 1, 0, 0,189, 1, 0, 0,173, 1, 0, 0,191, 1, 0, 0, 0, 0, 0, 1,174, 1, 0, 0,
+190, 1, 0, 0,172, 1, 0, 0,192, 1, 0, 0, 0, 0, 0, 1,155, 1, 0, 0,171, 1, 0, 0,191, 1, 0, 0,157, 1, 0, 0,
+ 0, 0, 0, 1,192, 1, 0, 0,172, 1, 0, 0,156, 1, 0, 0,158, 1, 0, 0, 0, 0, 0, 1, 53, 1, 0, 0,189, 1, 0, 0,
+171, 1, 0, 0,123, 1, 0, 0, 0, 0, 0, 1,172, 1, 0, 0,190, 1, 0, 0, 54, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 1,
+ 53, 1, 0, 0,183, 1, 0, 0,187, 1, 0, 0,189, 1, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,184, 1, 0, 0, 54, 1, 0, 0,
+190, 1, 0, 0, 0, 0, 0, 1,183, 1, 0, 0,185, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,
+186, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,157, 1, 0, 0,191, 1, 0, 0,193, 1, 0, 0,217, 1, 0, 0,
+ 0, 0, 0, 1,194, 1, 0, 0,192, 1, 0, 0,158, 1, 0, 0,218, 1, 0, 0, 0, 0, 0, 1,191, 1, 0, 0,173, 1, 0, 0,
+203, 1, 0, 0,193, 1, 0, 0, 0, 0, 0, 1,204, 1, 0, 0,174, 1, 0, 0,192, 1, 0, 0,194, 1, 0, 0, 0, 0, 0, 1,
+173, 1, 0, 0,175, 1, 0, 0,201, 1, 0, 0,203, 1, 0, 0, 0, 0, 0, 1,202, 1, 0, 0,176, 1, 0, 0,174, 1, 0, 0,
+204, 1, 0, 0, 0, 0, 0, 1,175, 1, 0, 0,177, 1, 0, 0,199, 1, 0, 0,201, 1, 0, 0, 0, 0, 0, 1,200, 1, 0, 0,
+178, 1, 0, 0,176, 1, 0, 0,202, 1, 0, 0, 0, 0, 0, 1,177, 1, 0, 0,179, 1, 0, 0,197, 1, 0, 0,199, 1, 0, 0,
+ 0, 0, 0, 1,198, 1, 0, 0,180, 1, 0, 0,178, 1, 0, 0,200, 1, 0, 0, 0, 0, 0, 1,179, 1, 0, 0,181, 1, 0, 0,
+195, 1, 0, 0,197, 1, 0, 0, 0, 0, 0, 1,196, 1, 0, 0,182, 1, 0, 0,180, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 1,
+181, 1, 0, 0,159, 1, 0, 0,215, 1, 0, 0,195, 1, 0, 0, 0, 0, 0, 1,216, 1, 0, 0,160, 1, 0, 0,182, 1, 0, 0,
+196, 1, 0, 0, 0, 0, 0, 1,169, 1, 0, 0,157, 1, 0, 0,217, 1, 0, 0,205, 1, 0, 0, 0, 0, 0, 1,218, 1, 0, 0,
+158, 1, 0, 0,170, 1, 0, 0,206, 1, 0, 0, 0, 0, 0, 1,167, 1, 0, 0,169, 1, 0, 0,205, 1, 0, 0,207, 1, 0, 0,
+ 0, 0, 0, 1,206, 1, 0, 0,170, 1, 0, 0,168, 1, 0, 0,208, 1, 0, 0, 0, 0, 0, 1,165, 1, 0, 0,167, 1, 0, 0,
+207, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 1,208, 1, 0, 0,168, 1, 0, 0,166, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 1,
+163, 1, 0, 0,165, 1, 0, 0,209, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 1,210, 1, 0, 0,166, 1, 0, 0,164, 1, 0, 0,
+212, 1, 0, 0, 0, 0, 0, 1,161, 1, 0, 0,163, 1, 0, 0,211, 1, 0, 0,213, 1, 0, 0, 0, 0, 0, 1,212, 1, 0, 0,
+164, 1, 0, 0,162, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 1,159, 1, 0, 0,161, 1, 0, 0,213, 1, 0, 0,215, 1, 0, 0,
+ 0, 0, 0, 1,214, 1, 0, 0,162, 1, 0, 0,160, 1, 0, 0,216, 1, 0, 0, 0, 0, 0, 1,199, 1, 0, 0,197, 1, 0, 0,
+221, 1, 0, 0,219, 1, 0, 0, 0, 0, 0, 1,222, 1, 0, 0,198, 1, 0, 0,200, 1, 0, 0,220, 1, 0, 0, 0, 0, 0, 1,
+219, 1, 0, 0,221, 1, 0, 0,223, 1, 0, 0,225, 1, 0, 0, 0, 0, 0, 1,224, 1, 0, 0,222, 1, 0, 0,220, 1, 0, 0,
+226, 1, 0, 0, 0, 0, 0, 1,225, 1, 0, 0,223, 1, 0, 0,229, 1, 0, 0,227, 1, 0, 0, 0, 0, 0, 1,230, 1, 0, 0,
+224, 1, 0, 0,226, 1, 0, 0,228, 1, 0, 0, 0, 0, 0, 1,227, 1, 0, 0,229, 1, 0, 0,231, 1, 0, 0,233, 1, 0, 0,
+ 0, 0, 0, 1,232, 1, 0, 0,230, 1, 0, 0,228, 1, 0, 0,234, 1, 0, 0, 0, 0, 0, 1,205, 1, 0, 0,217, 1, 0, 0,
+227, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 1,228, 1, 0, 0,218, 1, 0, 0,206, 1, 0, 0,234, 1, 0, 0, 0, 0, 0, 1,
+193, 1, 0, 0,225, 1, 0, 0,227, 1, 0, 0,217, 1, 0, 0, 0, 0, 0, 1,228, 1, 0, 0,226, 1, 0, 0,194, 1, 0, 0,
+218, 1, 0, 0, 0, 0, 0, 1,193, 1, 0, 0,203, 1, 0, 0,219, 1, 0, 0,225, 1, 0, 0, 0, 0, 0, 1,220, 1, 0, 0,
+204, 1, 0, 0,194, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 1,199, 1, 0, 0,219, 1, 0, 0,203, 1, 0, 0,201, 1, 0, 0,
+ 0, 0, 0, 1,204, 1, 0, 0,220, 1, 0, 0,200, 1, 0, 0,202, 1, 0, 0, 0, 0, 0, 1,195, 1, 0, 0,215, 1, 0, 0,
+221, 1, 0, 0,197, 1, 0, 0, 0, 0, 0, 1,222, 1, 0, 0,216, 1, 0, 0,196, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 1,
+213, 1, 0, 0,223, 1, 0, 0,221, 1, 0, 0,215, 1, 0, 0, 0, 0, 0, 1,222, 1, 0, 0,224, 1, 0, 0,214, 1, 0, 0,
+216, 1, 0, 0, 0, 0, 0, 1,211, 1, 0, 0,229, 1, 0, 0,223, 1, 0, 0,213, 1, 0, 0, 0, 0, 0, 1,224, 1, 0, 0,
+230, 1, 0, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 1,209, 1, 0, 0,231, 1, 0, 0,229, 1, 0, 0,211, 1, 0, 0,
+ 0, 0, 0, 1,230, 1, 0, 0,232, 1, 0, 0,210, 1, 0, 0,212, 1, 0, 0, 0, 0, 0, 1,207, 1, 0, 0,233, 1, 0, 0,
+231, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 1,232, 1, 0, 0,234, 1, 0, 0,208, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 1,
+205, 1, 0, 0,233, 1, 0, 0,207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,208, 1, 0, 0,234, 1, 0, 0,206, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1,133, 1, 0, 0,131, 1, 0, 0,245, 1, 0, 0,243, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0,
+132, 1, 0, 0,134, 1, 0, 0,244, 1, 0, 0, 0, 0, 0, 1,135, 1, 0, 0,133, 1, 0, 0,243, 1, 0, 0,241, 1, 0, 0,
+ 0, 0, 0, 1,244, 1, 0, 0,134, 1, 0, 0,136, 1, 0, 0,242, 1, 0, 0, 0, 0, 0, 1,137, 1, 0, 0,135, 1, 0, 0,
+241, 1, 0, 0,239, 1, 0, 0, 0, 0, 0, 1,242, 1, 0, 0,136, 1, 0, 0,138, 1, 0, 0,240, 1, 0, 0, 0, 0, 0, 1,
+139, 1, 0, 0,137, 1, 0, 0,239, 1, 0, 0,237, 1, 0, 0, 0, 0, 0, 1,240, 1, 0, 0,138, 1, 0, 0,140, 1, 0, 0,
+238, 1, 0, 0, 0, 0, 0, 1,141, 1, 0, 0,139, 1, 0, 0,237, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 1,238, 1, 0, 0,
+140, 1, 0, 0,142, 1, 0, 0,236, 1, 0, 0, 0, 0, 0, 1,129, 1, 0, 0,141, 1, 0, 0,235, 1, 0, 0,247, 1, 0, 0,
+ 0, 0, 0, 1,236, 1, 0, 0,142, 1, 0, 0,130, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1,235, 1, 0, 0,243, 1, 0, 0,
+245, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0,244, 1, 0, 0,236, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1,
+235, 1, 0, 0,237, 1, 0, 0,241, 1, 0, 0,243, 1, 0, 0, 0, 0, 0, 1,242, 1, 0, 0,238, 1, 0, 0,236, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 0, 1,237, 1, 0, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,242, 1, 0, 0,
+240, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,123, 1, 0, 0,129, 1, 0, 0,247, 1, 0, 0,
+ 0, 0, 0, 1,130, 1, 0, 0,124, 1, 0, 0, 56, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,247, 1, 0, 0,
+245, 1, 0, 0, 63, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0,248, 1, 0, 0, 56, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 1,
+ 61, 1, 0, 0, 63, 1, 0, 0,245, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0, 64, 1, 0, 0, 62, 1, 0, 0,
+132, 1, 0, 0, 0, 0, 0, 1, 68, 65, 84, 65,240, 85, 0, 0,224,234,181, 3, 65, 0, 0, 0,244, 1, 0, 0, 3,112, 28, 63,
+185,178,236, 62,224,124, 27, 63,235, 65,232, 62,144, 63, 30, 63,233,195,226, 62,118,152, 32, 63, 37,167,236, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0, 2,232,209, 62,222, 21,226, 62,102,109,215, 62,222,147,231, 62, 28,135,213, 62,172, 4,236, 62,
+ 56, 54,205, 62, 22,249,235, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,118,152, 32, 63, 37,167,236, 62,144, 63, 30, 63,
+233,195,226, 62,108,235, 33, 63,197,235,220, 62,209,151, 37, 63, 89,161,236, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+ 76,144,202, 62,186, 61,220, 62, 2,232,209, 62,222, 21,226, 62, 56, 54,205, 62, 22,249,235, 62,128, 55,195, 62, 70,243,235, 62,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,144, 63, 30, 63,233,195,226, 62, 20, 55, 25, 63, 1, 35,223, 62,200,178, 25, 63,
+ 77,233,214, 62,108,235, 33, 63,197,235,220, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,146, 1,219, 62, 66, 59,214, 62,
+248,248,219, 62,246,116,222, 62, 2,232,209, 62,222, 21,226, 62, 76,144,202, 62,186, 61,220, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0,224,124, 27, 63,235, 65,232, 62, 87,252, 24, 63, 93,111,230, 62, 20, 55, 25, 63, 1, 35,223, 62,144, 63, 30, 63,
+233,195,226, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,248,248,219, 62,246,116,222, 62,118,110,220, 62, 78,193,229, 62,
+102,109,215, 62,222,147,231, 62, 2,232,209, 62,222, 21,226, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 87,252, 24, 63,
+ 93,111,230, 62, 22,195, 22, 63,195, 90,232, 62,191, 91, 20, 63,193, 18,227, 62, 20, 55, 25, 63, 1, 35,223, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0,162,175,229, 62,178,100,226, 62,248,224,224, 62,182,172,231, 62,118,110,220, 62, 78,193,229, 62,
+248,248,219, 62,246,116,222, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 20, 55, 25, 63, 1, 35,223, 62,191, 91, 20, 63,
+193, 18,227, 62,187,165, 17, 63,225, 6,221, 62,200,178, 25, 63, 77,233,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+170, 27,235, 62,214, 88,220, 62,162,175,229, 62,178,100,226, 62,248,248,219, 62,246,116,222, 62,146, 1,219, 62, 66, 59,214, 62,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,191, 91, 20, 63,193, 18,227, 62,164, 18, 18, 63,173,201,236, 62,157,231, 13, 63,
+ 89,161,236, 62,187,165, 17, 63,225, 6,221, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,232,151,242, 62, 70,243,235, 62,
+216, 65,234, 62,158, 27,236, 62,162,175,229, 62,178,100,226, 62,170, 27,235, 62,214, 88,220, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0, 22,195, 22, 63,195, 90,232, 62, 11,202, 21, 63, 1,189,236, 62,164, 18, 18, 63,173,201,236, 62,191, 91, 20, 63,
+193, 18,227, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,216, 65,234, 62,158, 27,236, 62, 12,211,226, 62,246, 14,236, 62,
+248,224,224, 62,182,172,231, 62,162,175,229, 62,178,100,226, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 11,202, 21, 63,
+ 1,189,236, 62,215,202, 22, 63,237,124,241, 62,125,105, 20, 63, 1, 71,246, 62,164, 18, 18, 63,173,201,236, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0, 42,148,229, 62,246,152,245, 62,112,209,224, 62,226,206,240, 62, 12,211,226, 62,246, 14,236, 62,
+216, 65,234, 62,158, 27,236, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,164, 18, 18, 63,173,201,236, 62,125,105, 20, 63,
+ 1, 71,246, 62, 44,173, 17, 63,231,149,252, 62,157,231, 13, 63, 89,161,236, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+206, 12,235, 62,218,231,251, 62, 42,148,229, 62,246,152,245, 62,216, 65,234, 62,158, 27,236, 62,232,151,242, 62, 70,243,235, 62,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,125,105, 20, 63, 1, 71,246, 62, 37, 59, 25, 63, 49, 73,250, 62,108,178, 25, 63,
+218,108, 1, 63, 44,173, 17, 63,231,149,252, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 76, 2,219, 62,213, 21, 1, 63,
+216,240,219, 62, 38,155,249, 62, 42,148,229, 62,246,152,245, 62,206, 12,235, 62,218,231,251, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0,215,202, 22, 63,237,124,241, 62,195, 1, 25, 63,169,102,243, 62, 37, 59, 25, 63, 49, 73,250, 62,125,105, 20, 63,
+ 1, 71,246, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,216,240,219, 62, 38,155,249, 62,156, 99,220, 62,154,184,242, 62,
+112,209,224, 62,226,206,240, 62, 42,148,229, 62,246,152,245, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,195, 1, 25, 63,
+169,102,243, 62,176,125, 27, 63,149,145,241, 62,167, 74, 30, 63, 3,153,246, 62, 37, 59, 25, 63, 49, 73,250, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0,212,209,209, 62,246,234,245, 62,192,107,215, 62,138,227,240, 62,156, 99,220, 62,154,184,242, 62,
+216,240,219, 62, 38,155,249, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 37, 59, 25, 63, 49, 73,250, 62,167, 74, 30, 63,
+ 3,153,246, 62,204,230, 33, 63,107,232,252, 62,108,178, 25, 63,218,108, 1, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+132,153,202, 62, 94, 58,252, 62,212,209,209, 62,246,234,245, 62,216,240,219, 62, 38,155,249, 62, 76, 2,219, 62,213, 21, 1, 63,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,167, 74, 30, 63, 3,153,246, 62,118,152, 32, 63, 37,167,236, 62,209,151, 37, 63,
+ 89,161,236, 62,204,230, 33, 63,107,232,252, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,128, 55,195, 62, 70,243,235, 62,
+ 56, 54,205, 62, 22,249,235, 62,212,209,209, 62,246,234,245, 62,132,153,202, 62, 94, 58,252, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0,176,125, 27, 63,149,145,241, 62, 3,112, 28, 63,185,178,236, 62,118,152, 32, 63, 37,167,236, 62,167, 74, 30, 63,
+ 3,153,246, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 56, 54,205, 62, 22,249,235, 62, 28,135,213, 62,172, 4,236, 62,
+192,107,215, 62,138,227,240, 62,212,209,209, 62,246,234,245, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 3,112, 28, 63,
+185,178,236, 62,176,125, 27, 63,149,145,241, 62, 42, 39, 27, 63, 57, 1,241, 62,140,249, 27, 63,115,186,236, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0,206, 24,216, 62, 46, 83,240, 62,192,107,215, 62,138,227,240, 62, 28,135,213, 62,172, 4,236, 62,
+ 8,116,214, 62,102, 12,236, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,176,125, 27, 63,149,145,241, 62,195, 1, 25, 63,
+169,102,243, 62, 6,248, 24, 63,185, 91,242, 62, 42, 39, 27, 63, 57, 1,241, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+ 22,119,220, 62,174,173,241, 62,156, 99,220, 62,154,184,242, 62,192,107,215, 62,138,227,240, 62,206, 24,216, 62, 46, 83,240, 62,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,195, 1, 25, 63,169,102,243, 62,215,202, 22, 63,237,124,241, 62,157, 38, 23, 63,
+225,173,240, 62, 6,248, 24, 63,185, 91,242, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,234, 25,224, 62,214,255,239, 62,
+112,209,224, 62,226,206,240, 62,156, 99,220, 62,154,184,242, 62, 22,119,220, 62,174,173,241, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0,215,202, 22, 63,237,124,241, 62, 11,202, 21, 63, 1,189,236, 62, 13, 89, 22, 63,247,196,236, 62,157, 38, 23, 63,
+225,173,240, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 8,181,225, 62,234, 22,236, 62, 12,211,226, 62,246, 14,236, 62,
+112,209,224, 62,226,206,240, 62,234, 25,224, 62,214,255,239, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 11,202, 21, 63,
+ 1,189,236, 62, 22,195, 22, 63,195, 90,232, 62, 88, 33, 23, 63, 69, 47,233, 62, 13, 89, 22, 63,247,196,236, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0,112, 36,224, 62, 58,129,232, 62,248,224,224, 62,182,172,231, 62, 12,211,226, 62,246, 14,236, 62,
+ 8,181,225, 62,234, 22,236, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 22,195, 22, 63,195, 90,232, 62, 87,252, 24, 63,
+ 93,111,230, 62,100,243, 24, 63, 5,123,231, 62, 88, 33, 23, 63, 69, 47,233, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+ 90,128,220, 62,248,204,230, 62,118,110,220, 62, 78,193,229, 62,248,224,224, 62,182,172,231, 62,112, 36,224, 62, 58,129,232, 62,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0, 87,252, 24, 63, 93,111,230, 62,224,124, 27, 63,235, 65,232, 62,169, 37, 27, 63,
+ 35,211,232, 62,100,243, 24, 63, 5,123,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,206, 27,216, 62, 22, 37,232, 62,
+102,109,215, 62,222,147,231, 62,118,110,220, 62, 78,193,229, 62, 90,128,220, 62,248,204,230, 62, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,240, 0,224,124, 27, 63,235, 65,232, 62, 3,112, 28, 63,185,178,236, 62,140,249, 27, 63,115,186,236, 62,169, 37, 27, 63,
+ 35,211,232, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 8,116,214, 62,102, 12,236, 62, 28,135,213, 62,172, 4,236, 62,
+102,109,215, 62,222,147,231, 62,206, 27,216, 62, 22, 37,232, 62, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,240, 0,138,242, 24, 63,
+ 21,194,236, 62,169, 37, 27, 63, 35,211,232, 62,140,249, 27, 63,115,186,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,112, 0, 8,116,214, 62,102, 12,236, 62,206, 27,216, 62, 22, 37,232, 62, 16,130,220, 62, 6, 20,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,100,243, 24, 63, 5,123,231, 62,169, 37, 27, 63,
+ 35,211,232, 62,138,242, 24, 63, 21,194,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0,
+ 16,130,220, 62, 6, 20,236, 62,206, 27,216, 62, 22, 37,232, 62, 90,128,220, 62,248,204,230, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 88, 33, 23, 63, 69, 47,233, 62,100,243, 24, 63,
+ 5,123,231, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0, 90,128,220, 62,248,204,230, 62,
+112, 36,224, 62, 58,129,232, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 13, 89, 22, 63,247,196,236, 62, 88, 33, 23, 63, 69, 47,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0,112, 36,224, 62, 58,129,232, 62, 8,181,225, 62,234, 22,236, 62,
+ 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63,
+ 21,194,236, 62,157, 38, 23, 63,225,173,240, 62, 13, 89, 22, 63,247,196,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,112, 0, 8,181,225, 62,234, 22,236, 62,234, 25,224, 62,214,255,239, 62, 16,130,220, 62, 6, 20,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 6,248, 24, 63,
+185, 91,242, 62,157, 38, 23, 63,225,173,240, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0,
+234, 25,224, 62,214,255,239, 62, 22,119,220, 62,174,173,241, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 42, 39, 27, 63, 57, 1,241, 62, 6,248, 24, 63,
+185, 91,242, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0, 22,119,220, 62,174,173,241, 62,
+206, 24,216, 62, 46, 83,240, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0,
+ 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62,140,249, 27, 63,115,186,236, 62, 42, 39, 27, 63, 57, 1,241, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0,206, 24,216, 62, 46, 83,240, 62, 8,116,214, 62,102, 12,236, 62,
+ 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 61, 0, 5, 0, 0, 0,112, 0,174,254, 16, 63,
+ 94, 45, 34, 62, 79,190, 13, 63,160,193, 46, 62,220,199, 3, 63, 89,219, 24, 62,219,199, 3, 63, 18, 28,229, 61, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 16, 0,220,199, 3, 63, 89,219, 24, 62, 14,150,243, 62,204, 79, 47, 62,140,248,236, 62,182,202, 34, 62,
+219,199, 3, 63, 18, 28,229, 61, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,184,152, 21, 63,182, 47, 53, 62,250,104, 16, 63,
+ 16,113, 55, 62, 79,190, 13, 63,160,193, 46, 62,174,254, 16, 63, 94, 45, 34, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,
+ 14,150,243, 62,204, 79, 47, 62,200, 68,238, 62, 76, 62, 56, 62,183,207,227, 62,250, 75, 54, 62,140,248,236, 62,182,202, 34, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,137, 57, 22, 63, 81, 93, 61, 62,206,186, 16, 63, 85,129, 72, 62,250,104, 16, 63,
+ 16,113, 55, 62,184,152, 21, 63,182, 47, 53, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,200, 68,238, 62, 76, 62, 56, 62,
+192,187,237, 62,194,118, 73, 62,122,152,226, 62,190,166, 62, 62,183,207,227, 62,250, 75, 54, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,250,249, 22, 63,160,251, 88, 62,222, 32, 16, 63, 34,106, 93, 62,206,186, 16, 63, 85,129, 72, 62,137, 57, 22, 63,
+ 81, 93, 61, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,192,187,237, 62,194,118, 73, 62, 21, 19,239, 62,121,110, 94, 62,
+ 90, 83,225, 62, 21,153, 90, 62,122,152,226, 62,190,166, 62, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63,
+ 17, 56,132, 62,206,243, 15, 63,182,207,136, 62,222, 32, 16, 63, 34,106, 93, 62,250,249, 22, 63,160,251, 88, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 21, 19,239, 62,121,110, 94, 62, 92,193,239, 62,113, 61,137, 62, 54, 42,221, 62,209, 25,133, 62,
+ 90, 83,225, 62, 21,153, 90, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62, 91, 94, 37, 63,
+107,120,187, 62, 66, 21, 30, 63,178,139,200, 62,158,237, 12, 63, 38,241,187, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+139,125,211, 62,170,171,200, 62,156, 28,197, 62,166,130,187, 62,115, 21,216, 62, 14,177,166, 62, 15,175,245, 62,188, 14,188, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 91, 94, 37, 63,107,120,187, 62, 87, 57, 43, 63,222, 58,206, 62, 24,163, 39, 63,
+174, 95,216, 62, 66, 21, 30, 63,178,139,200, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 98,194,191, 62, 42, 94,216, 62,
+130,207,184, 62, 42, 27,206, 62,156, 28,197, 62,166,130,187, 62,139,125,211, 62,170,171,200, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 87, 57, 43, 63,222, 58,206, 62, 38,229, 50, 63,169, 32,226, 62,177, 79, 43, 63,202,194,231, 62, 24,163, 39, 63,
+174, 95,216, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 60,201,183, 62, 82,218,231, 62,196, 39,168, 62,206, 11,226, 62,
+130,207,184, 62, 42, 27,206, 62, 98,194,191, 62, 42, 94,216, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 38,229, 50, 63,
+169, 32,226, 62, 62,134, 48, 63, 37,107,249, 62,154,190, 43, 63,192, 0,249, 62,177, 79, 43, 63,202,194,231, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,138,190,182, 62, 35, 49,249, 62,172,229,172, 62,116,127,249, 62,196, 39,168, 62,206, 11,226, 62,
+ 60,201,183, 62, 82,218,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 62,134, 48, 63, 37,107,249, 62,238, 88, 46, 63,
+146,223, 2, 63,123,207, 40, 63,218,175,254, 62,154,190, 43, 63,192, 0,249, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 2,184,188, 62,140, 0,255, 62,173, 87,177, 62,102, 9, 3, 63,172,229,172, 62,116,127,249, 62,138,190,182, 62, 35, 49,249, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,238, 88, 46, 63,146,223, 2, 63,220,158, 34, 63,175, 23, 10, 63,126, 77, 30, 63,
+156, 88, 5, 63,123,207, 40, 63,218,175,254, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 89, 65,210, 62, 56,158, 5, 63,
+124,109,201, 62, 72,121, 10, 63,173, 87,177, 62,102, 9, 3, 63, 2,184,188, 62,140, 0,255, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,220,158, 34, 63,175, 23, 10, 63, 28,105, 26, 63,242,194, 11, 63,244,120, 25, 63, 78,242, 7, 63,126, 77, 30, 63,
+156, 88, 5, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 0, 39,220, 62,252, 58, 8, 63,220, 73,218, 62,169, 31, 12, 63,
+124,109,201, 62, 72,121, 10, 63, 89, 65,210, 62, 56,158, 5, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 28,105, 26, 63,
+242,194, 11, 63,173,244, 22, 63,236,215, 11, 63,202, 47, 22, 63,156, 60, 8, 63,244,120, 25, 63, 78,242, 7, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 11,221,226, 62, 90,125, 8, 63,220, 89,225, 62, 77, 42, 12, 63,220, 73,218, 62,169, 31, 12, 63,
+ 0, 39,220, 62,252, 58, 8, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,173,244, 22, 63,236,215, 11, 63, 67,169, 11, 63,
+ 18,197, 11, 63,106,252, 12, 63,180,173, 3, 63,202, 47, 22, 63,156, 60, 8, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 35,114,245, 62,233,196, 3, 63, 55, 72,248, 62, 91,232, 11, 63,220, 89,225, 62, 77, 42, 12, 63, 11,221,226, 62, 90,125, 8, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 67,169, 11, 63, 18,197, 11, 63,148,232, 3, 63,164, 17, 11, 63,162,220, 3, 63,
+ 45, 88, 0, 63,106,252, 12, 63,180,173, 3, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,162,220, 3, 63, 45, 88, 0, 63,
+148,232, 3, 63,164, 17, 11, 63, 55, 72,248, 62, 91,232, 11, 63, 35,114,245, 62,233,196, 3, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62,240, 81, 22, 63,114, 70, 1, 63,202, 47, 22, 63,156, 60, 8, 63,106,252, 12, 63,
+180,173, 3, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 11,221,226, 62, 90,125, 8, 63,106,128,226, 62,198,111, 1, 63,
+209,213,236, 62, 4,250,255, 62, 35,114,245, 62,233,196, 3, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,240, 81, 22, 63,
+114, 70, 1, 63,151,182, 25, 63,130, 9, 1, 63,244,120, 25, 63, 78,242, 7, 63,202, 47, 22, 63,156, 60, 8, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 0, 39,220, 62,252, 58, 8, 63,213,150,219, 62, 50, 55, 1, 63,106,128,226, 62,198,111, 1, 63,
+ 11,221,226, 62, 90,125, 8, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 96, 49, 30, 63,121,229,254, 62,126, 77, 30, 63,
+156, 88, 5, 63,244,120, 25, 63, 78,242, 7, 63,151,182, 25, 63,130, 9, 1, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 0, 39,220, 62,252, 58, 8, 63, 89, 65,210, 62, 56,158, 5, 63,176,116,210, 62,227, 62,255, 62,213,150,219, 62, 50, 55, 1, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 25,113, 37, 63, 35,157,247, 62,123,207, 40, 63,218,175,254, 62,126, 77, 30, 63,
+156, 88, 5, 63, 96, 49, 30, 63,121,229,254, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 89, 65,210, 62, 56,158, 5, 63,
+ 2,184,188, 62,140, 0,255, 62,189,165,195, 62,139,232,247, 62,176,116,210, 62,227, 62,255, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 92, 62, 39, 63,121, 75,240, 62,154,190, 43, 63,192, 0,249, 62,123,207, 40, 63,218,175,254, 62, 25,113, 37, 63,
+ 35,157,247, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 2,184,188, 62,140, 0,255, 62,138,190,182, 62, 35, 49,249, 62,
+222, 10,192, 62,163,128,240, 62,189,165,195, 62,139,232,247, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,140,149, 38, 63,
+ 38, 95,229, 62,177, 79, 43, 63,202,194,231, 62,154,190, 43, 63,192, 0,249, 62, 92, 62, 39, 63,121, 75,240, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,138,190,182, 62, 35, 49,249, 62, 60,201,183, 62, 82,218,231, 62,168,140,193, 62, 94,129,229, 62,
+222, 10,192, 62,163,128,240, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 14,120, 33, 63,166,238,214, 62, 24,163, 39, 63,
+174, 95,216, 62,177, 79, 43, 63,202,194,231, 62,140,149, 38, 63, 38, 95,229, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 60,201,183, 62, 82,218,231, 62, 98,194,191, 62, 42, 94,216, 62,168, 75,204, 62, 62, 7,215, 62,168,140,193, 62, 94,129,229, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,165,178, 27, 63,128, 17,208, 62, 66, 21, 30, 63,178,139,200, 62, 24,163, 39, 63,
+174, 95,216, 62, 14,120, 33, 63,166,238,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 98,194,191, 62, 42, 94,216, 62,
+139,125,211, 62,170,171,200, 62, 6, 24,216, 62,128, 57,208, 62,168, 75,204, 62, 62, 7,215, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 15, 97, 17, 63,220, 34,214, 62,158,237, 12, 63, 38,241,187, 62, 66, 21, 30, 63,178,139,200, 62,165,178, 27, 63,
+128, 17,208, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,139,125,211, 62,170,171,200, 62, 15,175,245, 62,188, 14,188, 62,
+217,200,236, 62,134, 49,214, 62, 6, 24,216, 62,128, 57,208, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 15, 97, 17, 63,
+220, 34,214, 62,149,244, 14, 63, 4, 42,221, 62,147,230, 3, 63, 78, 47,208, 62,158,237, 12, 63, 38,241,187, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,147,230, 3, 63, 78, 47,208, 62,141,144,241, 62,244, 52,221, 62,217,200,236, 62,134, 49,214, 62,
+ 15,175,245, 62,188, 14,188, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62,106,252, 12, 63,
+180,173, 3, 63,162,220, 3, 63, 45, 88, 0, 63, 71, 25, 13, 63,116,163,243, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+162,220, 3, 63, 45, 88, 0, 63, 35,114,245, 62,233,196, 3, 63,209,213,236, 62, 4,250,255, 62, 0, 45,245, 62,206,185,243, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 71, 25, 13, 63,116,163,243, 62,162,220, 3, 63, 45, 88, 0, 63,215,220, 3, 63,
+148,189,231, 62, 64, 2, 13, 63, 52,215,230, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,215,220, 3, 63,148,189,231, 62,
+162,220, 3, 63, 45, 88, 0, 63, 0, 45,245, 62,206,185,243, 62,219,100,245, 62,184,230,230, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,147,230, 3, 63, 78, 47,208, 62,149,244, 14, 63, 4, 42,221, 62, 64, 2, 13, 63, 52,215,230, 62,215,220, 3, 63,
+148,189,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,219,100,245, 62,184,230,230, 62,141,144,241, 62,244, 52,221, 62,
+147,230, 3, 63, 78, 47,208, 62,215,220, 3, 63,148,189,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 7, 63,
+148, 31, 54, 62,193,202, 3, 63,214,174, 49, 62,220,199, 3, 63, 89,219, 24, 62, 79,190, 13, 63,160,193, 46, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,220,199, 3, 63, 89,219, 24, 62,193,202, 3, 63,214,174, 49, 62,175, 87, 0, 63,251, 90, 54, 62,
+ 14,150,243, 62,204, 79, 47, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 68,214, 9, 63,246,237, 66, 62,250, 61, 7, 63,
+148, 31, 54, 62, 79,190, 13, 63,160,193, 46, 62,250,104, 16, 63, 16,113, 55, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 14,150,243, 62,204, 79, 47, 62,175, 87, 0, 63,251, 90, 54, 62,104,137,251, 62,179, 92, 67, 62,200, 68,238, 62, 76, 62, 56, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,237,221, 8, 63,218, 90, 91, 62, 68,214, 9, 63,246,237, 66, 62,250,104, 16, 63,
+ 16,113, 55, 62,206,186, 16, 63, 85,129, 72, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,200, 68,238, 62, 76, 62, 56, 62,
+104,137,251, 62,179, 92, 67, 62, 39,153,253, 62, 27,195, 91, 62,192,187,237, 62,194,118, 73, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,206,243, 15, 63,182,207,136, 62, 77, 32, 8, 63, 10, 39,139, 62, 22,117, 9, 63,146,203, 97, 62,222, 32, 16, 63,
+ 34,106, 93, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,192,110,252, 62, 79, 68, 98, 62,219, 89,255, 62,116, 79,139, 62,
+ 92,193,239, 62,113, 61,137, 62, 21, 19,239, 62,121,110, 94, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,237,221, 8, 63,
+218, 90, 91, 62,206,186, 16, 63, 85,129, 72, 62,222, 32, 16, 63, 34,106, 93, 62, 22,117, 9, 63,146,203, 97, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 21, 19,239, 62,121,110, 94, 62,192,187,237, 62,194,118, 73, 62, 39,153,253, 62, 27,195, 91, 62,
+192,110,252, 62, 79, 68, 98, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,119,125, 9, 63, 7,112,158, 62, 70,233, 3, 63,
+ 88, 27,154, 62,235,229, 3, 63, 97,108,139, 62, 77, 32, 8, 63, 10, 39,139, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+235,229, 3, 63, 97,108,139, 62, 70,233, 3, 63, 88, 27,154, 62,165,179,252, 62,163,140,158, 62,219, 89,255, 62,116, 79,139, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 22,117, 9, 63,146,203, 97, 62, 77, 32, 8, 63, 10, 39,139, 62,235,229, 3, 63,
+ 97,108,139, 62,246,215, 3, 63,143, 56,101, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,235,229, 3, 63, 97,108,139, 62,
+219, 89,255, 62,116, 79,139, 62,192,110,252, 62, 79, 68, 98, 62,246,215, 3, 63,143, 56,101, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,147,210, 3, 63,221, 95, 86, 62,237,221, 8, 63,218, 90, 91, 62, 22,117, 9, 63,146,203, 97, 62,246,215, 3, 63,
+143, 56,101, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,192,110,252, 62, 79, 68, 98, 62, 39,153,253, 62, 27,195, 91, 62,
+147,210, 3, 63,221, 95, 86, 62,246,215, 3, 63,143, 56,101, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 5, 54, 12, 63,
+188,183,167, 62,250, 61, 9, 63,252,214,168, 62,152,143, 8, 63, 45,107,163, 62,119,125, 9, 63, 7,112,158, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,100,136,254, 62, 38,123,163, 62,110, 39,253, 62,103,224,168, 62, 98, 68,247, 62,146,206,167, 62,
+165,179,252, 62,163,140,158, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,135,196, 10, 63, 52,208,178, 62, 25,233, 8, 63,
+116,110,175, 62,250, 61, 9, 63,252,214,168, 62, 5, 54, 12, 63,188,183,167, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+110, 39,253, 62,103,224,168, 62,102,195,253, 62,184,102,175, 62, 98, 14,250, 62,149,202,178, 62, 98, 68,247, 62,146,206,167, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 69, 17, 4, 63,105,176,182, 62, 69,138, 6, 63, 80,180,177, 62, 25,233, 8, 63,
+116,110,175, 62,135,196, 10, 63, 52,208,178, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,102,195,253, 62,184,102,175, 62,
+ 14, 49, 1, 63, 62,150,177, 62, 69, 17, 4, 63,105,176,182, 62, 98, 14,250, 62,149,202,178, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,209,124, 3, 63, 70, 0,177, 62, 11,232, 3, 63,140, 4,174, 62, 69,138, 6, 63, 80,180,177, 62, 69, 17, 4, 63,
+105,176,182, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 14, 49, 1, 63, 62,150,177, 62, 11,232, 3, 63,140, 4,174, 62,
+209,124, 3, 63, 70, 0,177, 62, 69, 17, 4, 63,105,176,182, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 70,233, 3, 63,
+ 88, 27,154, 62,119,125, 9, 63, 7,112,158, 62,152,143, 8, 63, 45,107,163, 62,212,232, 3, 63, 58,152,158, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,100,136,254, 62, 38,123,163, 62,165,179,252, 62,163,140,158, 62, 70,233, 3, 63, 88, 27,154, 62,
+212,232, 3, 63, 58,152,158, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,212,232, 3, 63, 58,152,158, 62,152,143, 8, 63,
+ 45,107,163, 62,121, 91, 7, 63,134, 51,166, 62,205,231, 3, 63, 58,149,162, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 44,116, 0, 63,255, 56,166, 62,100,136,254, 62, 38,123,163, 62,212,232, 3, 63, 58,152,158, 62,205,231, 3, 63, 58,149,162, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 11,232, 3, 63,140, 4,174, 62,214,233, 3, 63,198,154,170, 62,233,110, 6, 63,
+ 94,152,174, 62, 69,138, 6, 63, 80,180,177, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,228, 82, 1, 63, 95,140,174, 62,
+214,233, 3, 63,198,154,170, 62, 11,232, 3, 63,140, 4,174, 62, 14, 49, 1, 63, 62,150,177, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 69,138, 6, 63, 80,180,177, 62,233,110, 6, 63, 94,152,174, 62, 59,236, 7, 63, 19,123,173, 62, 25,233, 8, 63,
+116,110,175, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217,185,255, 62, 92,116,173, 62,228, 82, 1, 63, 95,140,174, 62,
+ 14, 49, 1, 63, 62,150,177, 62,102,195,253, 62,184,102,175, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 25,233, 8, 63,
+116,110,175, 62, 59,236, 7, 63, 19,123,173, 62, 85,249, 7, 63, 92, 52,169, 62,250, 61, 9, 63,252,214,168, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,160,169,255, 62, 6, 57,169, 62,217,185,255, 62, 92,116,173, 62,102,195,253, 62,184,102,175, 62,
+110, 39,253, 62,103,224,168, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 9, 63,252,214,168, 62, 85,249, 7, 63,
+ 92, 52,169, 62,121, 91, 7, 63,134, 51,166, 62,152,143, 8, 63, 45,107,163, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 44,116, 0, 63,255, 56,166, 62,160,169,255, 62, 6, 57,169, 62,110, 39,253, 62,103,224,168, 62,100,136,254, 62, 38,123,163, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,214,233, 3, 63,198,154,170, 62, 85,249, 7, 63, 92, 52,169, 62, 59,236, 7, 63,
+ 19,123,173, 62,233,110, 6, 63, 94,152,174, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217,185,255, 62, 92,116,173, 62,
+160,169,255, 62, 6, 57,169, 62,214,233, 3, 63,198,154,170, 62,228, 82, 1, 63, 95,140,174, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,214,233, 3, 63,198,154,170, 62,205,231, 3, 63, 58,149,162, 62,121, 91, 7, 63,134, 51,166, 62, 85,249, 7, 63,
+ 92, 52,169, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 44,116, 0, 63,255, 56,166, 62,205,231, 3, 63, 58,149,162, 62,
+214,233, 3, 63,198,154,170, 62,160,169,255, 62, 6, 57,169, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 69, 17, 4, 63,
+105,176,182, 62,135,196, 10, 63, 52,208,178, 62,158,237, 12, 63, 38,241,187, 62,147,230, 3, 63, 78, 47,208, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 15,175,245, 62,188, 14,188, 62, 98, 14,250, 62,149,202,178, 62, 69, 17, 4, 63,105,176,182, 62,
+147,230, 3, 63, 78, 47,208, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,135,196, 10, 63, 52,208,178, 62, 5, 54, 12, 63,
+188,183,167, 62,112, 0, 16, 63,254,246,164, 62,158,237, 12, 63, 38,241,187, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+207,187,239, 62, 19, 42,165, 62, 98, 68,247, 62,146,206,167, 62, 98, 14,250, 62,149,202,178, 62, 15,175,245, 62,188, 14,188, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 5, 54, 12, 63,188,183,167, 62,119,125, 9, 63, 7,112,158, 62, 44,250, 15, 63,
+109, 0,154, 62,112, 0, 16, 63,254,246,164, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 56,205,239, 62, 8, 71,154, 62,
+165,179,252, 62,163,140,158, 62, 98, 68,247, 62,146,206,167, 62,207,187,239, 62, 19, 42,165, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,119,125, 9, 63, 7,112,158, 62, 77, 32, 8, 63, 10, 39,139, 62,206,243, 15, 63,182,207,136, 62, 44,250, 15, 63,
+109, 0,154, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 92,193,239, 62,113, 61,137, 62,219, 89,255, 62,116, 79,139, 62,
+165,179,252, 62,163,140,158, 62, 56,205,239, 62, 8, 71,154, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63,
+ 17, 56,132, 62,208, 46, 27, 63,149, 35,148, 62, 44,250, 15, 63,109, 0,154, 62,206,243, 15, 63,182,207,136, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 56,205,239, 62, 8, 71,154, 62,238,166,217, 62,229,221,148, 62, 54, 42,221, 62,209, 25,133, 62,
+ 92,193,239, 62,113, 61,137, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,208, 46, 27, 63,149, 35,148, 62, 36,177, 27, 63,
+158,151,156, 62,112, 0, 16, 63,254,246,164, 62, 44,250, 15, 63,109, 0,154, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+207,187,239, 62, 19, 42,165, 62, 0,160,216, 62,127, 44,157, 62,238,166,217, 62,229,221,148, 62, 56,205,239, 62, 8, 71,154, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62,158,237, 12, 63, 38,241,187, 62,112, 0, 16, 63,
+254,246,164, 62, 36,177, 27, 63,158,151,156, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,207,187,239, 62, 19, 42,165, 62,
+ 15,175,245, 62,188, 14,188, 62,115, 21,216, 62, 14,177,166, 62, 0,160,216, 62,127, 44,157, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,237,221, 8, 63,218, 90, 91, 62,147,210, 3, 63,221, 95, 86, 62,129,211, 3, 63,248,168, 83, 62,170, 33, 8, 63,
+254,149, 86, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,129,211, 3, 63,248,168, 83, 62,147,210, 3, 63,221, 95, 86, 62,
+ 39,153,253, 62, 27,195, 91, 62, 8, 14,255, 62, 58,232, 86, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 68,214, 9, 63,
+246,237, 66, 62,237,221, 8, 63,218, 90, 91, 62,170, 33, 8, 63,254,149, 86, 62, 20,180, 8, 63, 94, 29, 69, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 8, 14,255, 62, 58,232, 86, 62, 39,153,253, 62, 27,195, 91, 62,104,137,251, 62,179, 92, 67, 62,
+ 19,210,253, 62, 55,114, 69, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 7, 63,148, 31, 54, 62, 68,214, 9, 63,
+246,237, 66, 62, 20,180, 8, 63, 94, 29, 69, 62,168, 82, 6, 63, 80, 43, 57, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 19,210,253, 62, 55,114, 69, 62,104,137,251, 62,179, 92, 67, 62,175, 87, 0, 63,251, 90, 54, 62, 48, 68, 1, 63,166, 84, 57, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,193,202, 3, 63,214,174, 49, 62,250, 61, 7, 63,148, 31, 54, 62,168, 82, 6, 63,
+ 80, 43, 57, 62,205,202, 3, 63, 8, 22, 54, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 48, 68, 1, 63,166, 84, 57, 62,
+175, 87, 0, 63,251, 90, 54, 62,193,202, 3, 63,214,174, 49, 62,205,202, 3, 63, 8, 22, 54, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,205,202, 3, 63, 8, 22, 54, 62,168, 82, 6, 63, 80, 43, 57, 62,246, 24, 5, 63, 26,150, 66, 62,213,205, 3, 63,
+220,232, 64, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 29,131, 2, 63, 22,172, 66, 62, 48, 68, 1, 63,166, 84, 57, 62,
+205,202, 3, 63, 8, 22, 54, 62,213,205, 3, 63,220,232, 64, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,168, 82, 6, 63,
+ 80, 43, 57, 62, 20,180, 8, 63, 94, 29, 69, 62, 39, 83, 6, 63,191,114, 70, 62,246, 24, 5, 63, 26,150, 66, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,185, 75, 1, 63,222,160, 70, 62, 19,210,253, 62, 55,114, 69, 62, 48, 68, 1, 63,166, 84, 57, 62,
+ 29,131, 2, 63, 22,172, 66, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 20,180, 8, 63, 94, 29, 69, 62,170, 33, 8, 63,
+254,149, 86, 62, 4,111, 6, 63, 40,172, 76, 62, 39, 83, 6, 63,191,114, 70, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+157, 51, 1, 63,158,218, 76, 62, 8, 14,255, 62, 58,232, 86, 62, 19,210,253, 62, 55,114, 69, 62,185, 75, 1, 63,222,160, 70, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,170, 33, 8, 63,254,149, 86, 62,129,211, 3, 63,248,168, 83, 62,234,208, 3, 63,
+146, 43, 75, 62, 4,111, 6, 63, 40,172, 76, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,234,208, 3, 63,146, 43, 75, 62,
+129,211, 3, 63,248,168, 83, 62, 8, 14,255, 62, 58,232, 86, 62,157, 51, 1, 63,158,218, 76, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,234,208, 3, 63,146, 43, 75, 62,213,205, 3, 63,220,232, 64, 62,246, 24, 5, 63, 26,150, 66, 62, 4,111, 6, 63,
+ 40,172, 76, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 29,131, 2, 63, 22,172, 66, 62,213,205, 3, 63,220,232, 64, 62,
+234,208, 3, 63,146, 43, 75, 62,157, 51, 1, 63,158,218, 76, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 4,111, 6, 63,
+ 40,172, 76, 62,246, 24, 5, 63, 26,150, 66, 62, 39, 83, 6, 63,191,114, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,185, 75, 1, 63,222,160, 70, 62, 29,131, 2, 63, 22,172, 66, 62,157, 51, 1, 63,158,218, 76, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 64, 2, 13, 63, 52,215,230, 62,149,244, 14, 63,
+ 4, 42,221, 62, 4,216, 16, 63,160, 24,224, 62,120,200, 15, 63, 84,255,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+119,193,237, 62,190, 38,224, 62,141,144,241, 62,244, 52,221, 62,219,100,245, 62,184,230,230, 62, 21,211,239, 62,185, 18,232, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 71, 25, 13, 63,116,163,243, 62, 64, 2, 13, 63, 52,215,230, 62,120,200, 15, 63,
+ 84,255,231, 62,184,171, 16, 63, 40,133,241, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 21,211,239, 62,185, 18,232, 62,
+219,100,245, 62,184,230,230, 62, 0, 45,245, 62,206,185,243, 62,218,252,237, 62, 62,160,241, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62, 71, 25, 13, 63,116,163,243, 62,184,171, 16, 63, 40,133,241, 62, 55, 44, 19, 63,
+ 86, 21,250, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,218,252,237, 62, 62,160,241, 62, 0, 45,245, 62,206,185,243, 62,
+209,213,236, 62, 4,250,255, 62,153,228,232, 62,154, 67,250, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,149,244, 14, 63,
+ 4, 42,221, 62, 15, 97, 17, 63,220, 34,214, 62,217, 53, 19, 63, 16,211,218, 62, 4,216, 16, 63,160, 24,224, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 8, 14,233, 62, 66,226,218, 62,217,200,236, 62,134, 49,214, 62,141,144,241, 62,244, 52,221, 62,
+119,193,237, 62,190, 38,224, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 15, 97, 17, 63,220, 34,214, 62,165,178, 27, 63,
+128, 17,208, 62,205,198, 26, 63,124,184,214, 62,217, 53, 19, 63, 16,211,218, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+216,214,217, 62,218,224,214, 62, 6, 24,216, 62,128, 57,208, 62,217,200,236, 62,134, 49,214, 62, 8, 14,233, 62, 66,226,218, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,165,178, 27, 63,128, 17,208, 62, 14,120, 33, 63,166,238,214, 62,156,136, 31, 63,
+194,138,219, 62,205,198, 26, 63,124,184,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,254, 30,208, 62,204,177,219, 62,
+168, 75,204, 62, 62, 7,215, 62, 6, 24,216, 62,128, 57,208, 62,216,214,217, 62,218,224,214, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 14,120, 33, 63,166,238,214, 62,140,149, 38, 63, 38, 95,229, 62, 79, 9, 36, 63, 94,224,229, 62,156,136, 31, 63,
+194,138,219, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,148,192,198, 62,182, 11,230, 62,168,140,193, 62, 94,129,229, 62,
+168, 75,204, 62, 62, 7,215, 62,254, 30,208, 62,204,177,219, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,140,149, 38, 63,
+ 38, 95,229, 62, 92, 62, 39, 63,121, 75,240, 62, 14, 49, 36, 63,253, 88,239, 62, 79, 9, 36, 63, 94,224,229, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 97, 71,198, 62,192,149,239, 62,222, 10,192, 62,163,128,240, 62,168,140,193, 62, 94,129,229, 62,
+148,192,198, 62,182, 11,230, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 92, 62, 39, 63,121, 75,240, 62, 25,113, 37, 63,
+ 35,157,247, 62,243, 33, 35, 63, 80,143,245, 62, 14, 49, 36, 63,253, 88,239, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 87, 99,200, 62,172,217,245, 62,189,165,195, 62,139,232,247, 62,222, 10,192, 62,163,128,240, 62, 97, 71,198, 62,192,149,239, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 25,113, 37, 63, 35,157,247, 62, 96, 49, 30, 63,121,229,254, 62,223, 49, 29, 63,
+199,140,250, 62,243, 33, 35, 63, 80,143,245, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,147,124,212, 62,146,215,250, 62,
+176,116,210, 62,227, 62,255, 62,189,165,195, 62,139,232,247, 62, 87, 99,200, 62,172,217,245, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 96, 49, 30, 63,121,229,254, 62,151,182, 25, 63,130, 9, 1, 63, 50,181, 25, 63,118,111,253, 62,223, 49, 29, 63,
+199,140,250, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 52,151,219, 62, 68,186,253, 62,213,150,219, 62, 50, 55, 1, 63,
+176,116,210, 62,227, 62,255, 62,147,124,212, 62,146,215,250, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,151,182, 25, 63,
+130, 9, 1, 63,240, 81, 22, 63,114, 70, 1, 63,241,188, 22, 63, 28,149,253, 62, 50,181, 25, 63,118,111,253, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,212,163,225, 62, 91,215,253, 62,106,128,226, 62,198,111, 1, 63,213,150,219, 62, 50, 55, 1, 63,
+ 52,151,219, 62, 68,186,253, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,240, 81, 22, 63,114, 70, 1, 63,103, 59, 17, 63,
+120,195,255, 62, 55, 44, 19, 63, 86, 21,250, 62,241,188, 22, 63, 28,149,253, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+153,228,232, 62,154, 67,250, 62,209,213,236, 62, 4,250,255, 62,106,128,226, 62,198,111, 1, 63,212,163,225, 62, 91,215,253, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,241,188, 22, 63, 28,149,253, 62, 55, 44, 19, 63, 86, 21,250, 62, 9,165, 20, 63,
+248, 99,247, 62, 20, 0, 23, 63, 6, 57,251, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,232,232,229, 62, 74,142,247, 62,
+153,228,232, 62,154, 67,250, 62,212,163,225, 62, 91,215,253, 62,145, 26,225, 62,114,116,251, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 50,181, 25, 63,118,111,253, 62,241,188, 22, 63, 28,149,253, 62, 20, 0, 23, 63, 6, 57,251, 62,130,144, 25, 63,
+128, 7,251, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,145, 26,225, 62,114,116,251, 62,212,163,225, 62, 91,215,253, 62,
+ 52,151,219, 62, 68,186,253, 62,177,225,219, 62, 67, 75,251, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,223, 49, 29, 63,
+199,140,250, 62, 50,181, 25, 63,118,111,253, 62,130,144, 25, 63,128, 7,251, 62, 80,195, 28, 63, 55,166,248, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,177,225,219, 62, 67, 75,251, 62, 52,151,219, 62, 68,186,253, 62,147,124,212, 62,146,215,250, 62,
+233, 95,213, 62, 20,237,248, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,243, 33, 35, 63, 80,143,245, 62,223, 49, 29, 63,
+199,140,250, 62, 80,195, 28, 63, 55,166,248, 62, 22,164, 33, 63,102, 75,243, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+233, 95,213, 62, 20,237,248, 62,147,124,212, 62,146,215,250, 62, 87, 99,200, 62,172,217,245, 62, 65,114,203, 62,159,143,243, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 14, 49, 36, 63,253, 88,239, 62,243, 33, 35, 63, 80,143,245, 62, 22,164, 33, 63,
+102, 75,243, 62, 30,160, 34, 63,169, 47,238, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 65,114,203, 62,159,143,243, 62,
+ 87, 99,200, 62,172,217,245, 62, 97, 71,198, 62,192,149,239, 62,188,128,201, 62,126,110,238, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 79, 9, 36, 63, 94,224,229, 62, 14, 49, 36, 63,253, 88,239, 62, 30,160, 34, 63,169, 47,238, 62,131,144, 34, 63,
+253, 87,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,188,128,201, 62,126,110,238, 62, 97, 71,198, 62,192,149,239, 62,
+148,192,198, 62,182, 11,230, 62,141,190,201, 62,124,140,231, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,156,136, 31, 63,
+194,138,219, 62, 79, 9, 36, 63, 94,224,229, 62,131,144, 34, 63,253, 87,231, 62, 21,208, 30, 63,174,182,221, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,141,190,201, 62,124,140,231, 62,148,192,198, 62,182, 11,230, 62,254, 30,208, 62,204,177,219, 62,
+168,133,209, 62, 51,221,221, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,205,198, 26, 63,124,184,214, 62,156,136, 31, 63,
+194,138,219, 62, 21,208, 30, 63,174,182,221, 62,128,218, 26, 63, 68,206,217, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+168,133,209, 62, 51,221,221, 62,254, 30,208, 62,204,177,219, 62,216,214,217, 62,218,224,214, 62, 11,157,217, 62, 64,243,217, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217, 53, 19, 63, 16,211,218, 62,205,198, 26, 63,124,184,214, 62,128,218, 26, 63,
+ 68,206,217, 62,103, 53, 20, 63,236, 84,221, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 11,157,217, 62, 64,243,217, 62,
+216,214,217, 62,218,224,214, 62, 8, 14,233, 62, 66,226,218, 62, 68, 5,231, 62,234,101,221, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 4,216, 16, 63,160, 24,224, 62,217, 53, 19, 63, 16,211,218, 62,103, 53, 20, 63,236, 84,221, 62, 81, 87, 18, 63,
+ 33,175,226, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 68, 5,231, 62,234,101,221, 62, 8, 14,233, 62, 66,226,218, 62,
+119,193,237, 62,190, 38,224, 62,180,187,234, 62,249,190,226, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 55, 44, 19, 63,
+ 86, 21,250, 62,184,171, 16, 63, 40,133,241, 62, 98, 68, 18, 63,150,197,240, 62, 9,165, 20, 63,248, 99,247, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 35,197,234, 62,215,226,240, 62,218,252,237, 62, 62,160,241, 62,153,228,232, 62,154, 67,250, 62,
+232,232,229, 62, 74,142,247, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,184,171, 16, 63, 40,133,241, 62,120,200, 15, 63,
+ 84,255,231, 62,161, 4, 18, 63,138,184,232, 62, 98, 68, 18, 63,150,197,240, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+154, 85,235, 62, 92,206,232, 62, 21,211,239, 62,185, 18,232, 62,218,252,237, 62, 62,160,241, 62, 35,197,234, 62,215,226,240, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120,200, 15, 63, 84,255,231, 62, 4,216, 16, 63,160, 24,224, 62, 81, 87, 18, 63,
+ 33,175,226, 62,161, 4, 18, 63,138,184,232, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,180,187,234, 62,249,190,226, 62,
+119,193,237, 62,190, 38,224, 62, 21,211,239, 62,185, 18,232, 62,154, 85,235, 62, 92,206,232, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,148,232, 3, 63,164, 17, 11, 63, 67,169, 11, 63, 18,197, 11, 63,216,120, 13, 63,160, 81, 23, 63,147, 15, 4, 63,
+227,248, 23, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 64, 27,245, 62,100,166, 23, 63, 55, 72,248, 62, 91,232, 11, 63,
+148,232, 3, 63,164, 17, 11, 63,147, 15, 4, 63,227,248, 23, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 67,169, 11, 63,
+ 18,197, 11, 63,173,244, 22, 63,236,215, 11, 63, 94,233, 23, 63,186, 60, 16, 63,216,120, 13, 63,160, 81, 23, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,109,130,223, 62,118,165, 16, 63,220, 89,225, 62, 77, 42, 12, 63, 55, 72,248, 62, 91,232, 11, 63,
+ 64, 27,245, 62,100,166, 23, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,173,244, 22, 63,236,215, 11, 63, 28,105, 26, 63,
+242,194, 11, 63,220, 56, 28, 63, 66,250, 14, 63, 94,233, 23, 63,186, 60, 16, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+157,161,214, 62,219,110, 15, 63,220, 73,218, 62,169, 31, 12, 63,220, 89,225, 62, 77, 42, 12, 63,109,130,223, 62,118,165, 16, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 28,105, 26, 63,242,194, 11, 63,220,158, 34, 63,175, 23, 10, 63,109, 44, 39, 63,
+107,221, 19, 63,220, 56, 28, 63, 66,250, 14, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,156, 26,192, 62, 31,139, 20, 63,
+124,109,201, 62, 72,121, 10, 63,220, 73,218, 62,169, 31, 12, 63,157,161,214, 62,219,110, 15, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,220,158, 34, 63,175, 23, 10, 63,238, 88, 46, 63,146,223, 2, 63,242, 80, 56, 63, 44,244, 6, 63,109, 44, 39, 63,
+107,221, 19, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 61,208,156, 62,204, 16, 7, 63,173, 87,177, 62,102, 9, 3, 63,
+124,109,201, 62, 72,121, 10, 63,156, 26,192, 62, 31,139, 20, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,238, 88, 46, 63,
+146,223, 2, 63, 62,134, 48, 63, 37,107,249, 62,195,173, 54, 63,239,106,252, 62,242, 80, 56, 63, 44,244, 6, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,128, 0,202, 36,160, 62, 94, 51,252, 62,172,229,172, 62,116,127,249, 62,173, 87,177, 62,102, 9, 3, 63,
+ 61,208,156, 62,204, 16, 7, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0, 62,134, 48, 63, 37,107,249, 62, 38,229, 50, 63,
+169, 32,226, 62,154, 88, 53, 63,240,146,221, 62,195,173, 54, 63,239,106,252, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,
+128,172,162, 62, 17,169,221, 62,196, 39,168, 62,206, 11,226, 62,172,229,172, 62,116,127,249, 62,202, 36,160, 62, 94, 51,252, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0, 38,229, 50, 63,169, 32,226, 62, 87, 57, 43, 63,222, 58,206, 62,240,117, 49, 63,
+164,138,198, 62,154, 88, 53, 63,240,146,221, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,147,137,172, 62,148, 19,198, 62,
+130,207,184, 62, 42, 27,206, 62,196, 39,168, 62,206, 11,226, 62,128,172,162, 62, 17,169,221, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0,128, 0, 87, 57, 43, 63,222, 58,206, 62, 91, 94, 37, 63,107,120,187, 62,156,160, 41, 63, 56,175,182, 62,240,117, 49, 63,
+164,138,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,202,212,188, 62,245,163,182, 62,156, 28,197, 62,166,130,187, 62,
+130,207,184, 62, 42, 27,206, 62,147,137,172, 62,148, 19,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,165,252, 48, 63,
+133, 33, 85, 62,112, 54, 48, 63, 20, 19, 96, 62,172, 36, 46, 63,208, 7,129, 62,240, 17, 42, 63,129, 84, 97, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 76, 71,181, 62,204,200,131, 62,117,121,175, 62,183,185,106, 62,217, 24,172, 62, 21,237, 92, 62,
+138, 81,187, 62, 59, 40,103, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,204, 89, 48, 63,134,194, 4, 62,165,252, 48, 63,
+133, 33, 85, 62,240, 17, 42, 63,129, 84, 97, 62,160,125, 37, 63, 50,211, 46, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,
+138, 81,187, 62, 59, 40,103, 62,217, 24,172, 62, 21,237, 92, 62, 94,197,172, 62,109,200, 4, 62, 25,121,195, 62, 46,253, 48, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 11, 44, 20, 63, 20, 26,163, 61,204, 89, 48, 63,134,194, 4, 62,160,125, 37, 63,
+ 50,211, 46, 62, 40, 92, 24, 63,214,184, 21, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0, 25,121,195, 62, 46,253, 48, 62,
+ 94,197,172, 62,109,200, 4, 62,140,122,230, 62,202,248,161, 61,216, 13,222, 62,222,116, 22, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 32, 0,174,254, 16, 63, 94, 45, 34, 62,219,199, 3, 63, 18, 28,229, 61, 11, 44, 20, 63, 20, 26,163, 61, 40, 92, 24, 63,
+214,184, 21, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,140,122,230, 62,202,248,161, 61,219,199, 3, 63, 18, 28,229, 61,
+140,248,236, 62,182,202, 34, 62,216, 13,222, 62,222,116, 22, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,184,152, 21, 63,
+182, 47, 53, 62,174,254, 16, 63, 94, 45, 34, 62, 40, 92, 24, 63,214,184, 21, 62,209, 52, 25, 63, 76,140, 51, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 32, 0,216, 13,222, 62,222,116, 22, 62,140,248,236, 62,182,202, 34, 62,183,207,227, 62,250, 75, 54, 62,
+229,137,220, 62,185,228, 52, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0,137, 57, 22, 63, 81, 93, 61, 62,184,152, 21, 63,
+182, 47, 53, 62,209, 52, 25, 63, 76,140, 51, 62,193,166, 30, 63,114,168, 73, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+229,137,220, 62,185,228, 52, 62,183,207,227, 62,250, 75, 54, 62,122,152,226, 62,190,166, 62, 62, 54,198,209, 62, 18,240, 75, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,250,249, 22, 63,160,251, 88, 62,137, 57, 22, 63, 81, 93, 61, 62,193,166, 30, 63,
+114,168, 73, 62, 75, 0, 36, 63,229, 47,116, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 54,198,209, 62, 18,240, 75, 62,
+122,152,226, 62,190,166, 62, 62, 90, 83,225, 62, 21,153, 90, 62,211,231,199, 62,216,237,119, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,193,166, 30, 63,114,168, 73, 62,160,125, 37, 63, 50,211, 46, 62,240, 17, 42, 63,129, 84, 97, 62, 75, 0, 36, 63,
+229, 47,116, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,138, 81,187, 62, 59, 40,103, 62, 25,121,195, 62, 46,253, 48, 62,
+ 54,198,209, 62, 18,240, 75, 62,211,231,199, 62,216,237,119, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,193,166, 30, 63,
+114,168, 73, 62,209, 52, 25, 63, 76,140, 51, 62, 40, 92, 24, 63,214,184, 21, 62,160,125, 37, 63, 50,211, 46, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,216, 13,222, 62,222,116, 22, 62,229,137,220, 62,185,228, 52, 62, 54,198,209, 62, 18,240, 75, 62,
+ 25,121,195, 62, 46,253, 48, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 37,163, 36, 63,191,168,140, 62, 75, 0, 36, 63,
+229, 47,116, 62,240, 17, 42, 63,129, 84, 97, 62,172, 36, 46, 63,208, 7,129, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+138, 81,187, 62, 59, 40,103, 62,211,231,199, 62,216,237,119, 62, 6, 64,199, 62,105, 6,142, 62, 76, 71,181, 62,204,200,131, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63, 17, 56,132, 62,250,249, 22, 63,160,251, 88, 62, 75, 0, 36, 63,
+229, 47,116, 62, 37,163, 36, 63,191,168,140, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,211,231,199, 62,216,237,119, 62,
+ 90, 83,225, 62, 21,153, 90, 62, 54, 42,221, 62,209, 25,133, 62, 6, 64,199, 62,105, 6,142, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,208, 46, 27, 63,149, 35,148, 62, 91, 60, 36, 63,221,222,150, 62,222,170, 33, 63, 74,126,158, 62, 36,177, 27, 63,
+158,151,156, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 72,234,204, 62, 56, 63,159, 62,150,245,199, 62, 85, 15,152, 62,
+238,166,217, 62,229,221,148, 62, 0,160,216, 62,127, 44,157, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63,
+ 17, 56,132, 62, 37,163, 36, 63,191,168,140, 62, 91, 60, 36, 63,221,222,150, 62,208, 46, 27, 63,149, 35,148, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,150,245,199, 62, 85, 15,152, 62, 6, 64,199, 62,105, 6,142, 62, 54, 42,221, 62,209, 25,133, 62,
+238,166,217, 62,229,221,148, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62, 36,177, 27, 63,
+158,151,156, 62,222,170, 33, 63, 74,126,158, 62,102,212, 31, 63,144,192,164, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 72,234,204, 62, 56, 63,159, 62, 0,160,216, 62,127, 44,157, 62,115, 21,216, 62, 14,177,166, 62, 17,119,208, 62,201, 65,165, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62,102,212, 31, 63,144,192,164, 62,156,160, 41, 63,
+ 56,175,182, 62, 91, 94, 37, 63,107,120,187, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,202,212,188, 62,245,163,182, 62,
+ 17,119,208, 62,201, 65,165, 62,115, 21,216, 62, 14,177,166, 62,156, 28,197, 62,166,130,187, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,104,119,194, 62,164,189, 82, 63, 23, 73,212, 62,152,239, 90, 63,100,192,205, 62, 46,238, 97, 63, 38, 56,185, 62,
+ 72,154, 91, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,228, 94,141, 62, 86,234,100, 63, 84, 66,150, 62,114,154, 94, 63,
+230, 86,173, 62, 79, 66, 98, 63, 20,143,162, 62, 44,173,106, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 72,122, 87, 63,
+216, 8, 62, 62,202,106, 84, 63,137,185,113, 62,226, 77, 72, 63,204, 21,121, 62,158,225, 71, 63,113, 34, 68, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 16, 0,132, 32,137, 62,181, 65,121, 62,168,179,107, 62,139,127,103, 62,210,147,114, 62,212,116, 61, 62,
+248,125,142, 62, 30, 4, 80, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,158,225, 71, 63,113, 34, 68, 62,226, 77, 72, 63,
+204, 21,121, 62, 8, 7, 51, 63, 5,186,130, 62, 3,166, 49, 63,232, 57, 96, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 18,197,172, 62, 41,112,133, 62,132, 32,137, 62,181, 65,121, 62,248,125,142, 62, 30, 4, 80, 62,121,228,174, 62, 52, 79,109, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 3,166, 49, 63,232, 57, 96, 62, 8, 7, 51, 63, 5,186,130, 62,172, 36, 46, 63,
+208, 7,129, 62,112, 54, 48, 63, 20, 19, 96, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 76, 71,181, 62,204,200,131, 62,
+ 18,197,172, 62, 41,112,133, 62,121,228,174, 62, 52, 79,109, 62,117,121,175, 62,183,185,106, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 37,163, 36, 63,191,168,140, 62,172, 36, 46, 63,208, 7,129, 62, 8, 7, 51, 63, 5,186,130, 62, 91, 60, 36, 63,
+221,222,150, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 18,197,172, 62, 41,112,133, 62, 76, 71,181, 62,204,200,131, 62,
+ 6, 64,199, 62,105, 6,142, 62,150,245,199, 62, 85, 15,152, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,154, 88, 53, 63,
+240,146,221, 62,240,117, 49, 63,164,138,198, 62,224, 19, 69, 63, 24, 68,190, 62, 53, 64, 74, 63,171, 31,224, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 16, 0,250, 78,134, 62,148,213,186, 62,147,137,172, 62,148, 19,198, 62,128,172,162, 62, 17,169,221, 62,
+184,112,114, 62,248,169,220, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 54, 74,214, 62, 20, 55, 70, 63, 48,130,233, 62,
+188, 69, 83, 63, 23, 73,212, 62,152,239, 90, 63,104,119,194, 62,164,189, 82, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+ 84, 66,150, 62,114,154, 94, 63, 66, 1,153, 62,245,149, 81, 63, 38, 56,185, 62,102,110, 83, 63,230, 86,173, 62, 79, 66, 98, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,106,242, 66, 63,202, 94, 25, 63,190,100, 70, 63,222,234, 15, 63, 90,189, 77, 63,
+233, 88, 17, 63, 8,206, 74, 63, 88,118, 27, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 22, 32, 96, 62, 66, 60, 16, 63,
+ 86, 87,125, 62,174, 5, 15, 63, 78,187,132, 62,180, 44, 24, 63, 26, 79,108, 62,124, 1, 26, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 8,206, 74, 63, 88,118, 27, 63, 90,189, 77, 63,233, 88, 17, 63, 72,139, 85, 63,103, 51, 19, 63,220,119, 85, 63,
+ 77, 71, 31, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 64,199, 64, 62, 26, 40, 18, 63, 22, 32, 96, 62, 66, 60, 16, 63,
+ 26, 79,108, 62,124, 1, 26, 63, 44,191, 67, 62, 90, 89, 30, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,220,119, 85, 63,
+ 77, 71, 31, 63, 72,139, 85, 63,103, 51, 19, 63,228,213,100, 63, 72,156, 20, 63, 18, 82, 96, 63,128,133, 34, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,128, 0,226, 50, 1, 62,184, 68, 20, 63, 64,199, 64, 62, 26, 40, 18, 63, 44,191, 67, 62, 90, 89, 30, 63,
+194,204, 24, 62, 32,186, 34, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,242, 80, 56, 63, 44,244, 6, 63,195,173, 54, 63,
+239,106,252, 62,115,205, 60, 63,213,150,253, 62,166, 14, 64, 63, 81, 80, 4, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,
+190, 85,147, 62, 91,176,252, 62,202, 36,160, 62, 94, 51,252, 62, 61,208,156, 62,204, 16, 7, 63,160,121,140, 62, 74,197, 3, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,166, 14, 64, 63, 81, 80, 4, 63,115,205, 60, 63,213,150,253, 62, 68,103, 73, 63,
+233,248, 0, 63,248, 12, 75, 63, 64,206, 8, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,144, 59,115, 62,102,143,255, 62,
+190, 85,147, 62, 91,176,252, 62,160,121,140, 62, 74,197, 3, 63, 78,135,107, 62, 88,182, 7, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,248, 12, 75, 63, 64,206, 8, 63, 68,103, 73, 63,233,248, 0, 63,239,151, 82, 63, 86,223, 3, 63,181,227, 82, 63,
+189,102, 11, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 82, 17, 77, 62,162, 98, 2, 63,144, 59,115, 62,102,143,255, 62,
+ 78,135,107, 62, 88,182, 7, 63,202, 98, 75, 62,108, 43, 10, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,181,227, 82, 63,
+189,102, 11, 63,239,151, 82, 63, 86,223, 3, 63, 92,224, 91, 63,239,144, 5, 63,161,148, 90, 63,146, 95, 13, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,178, 40, 38, 62, 14,230, 3, 63, 82, 17, 77, 62,162, 98, 2, 63,202, 98, 75, 62,108, 43, 10, 63,
+ 10,162, 43, 62, 8, 50, 12, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120, 89,103, 63,105, 76, 2, 63,170,179,103, 63,
+142,105, 12, 63,161,148, 90, 63,146, 95, 13, 63, 92,224, 91, 63,239,144, 5, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 10,162, 43, 62, 8, 50, 12, 63,168, 41,231, 61,158, 83, 11, 63,116,128,234, 61,200, 39, 0, 63,178, 40, 38, 62, 14,230, 3, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,228,213,100, 63, 72,156, 20, 63, 72,139, 85, 63,103, 51, 19, 63,161,148, 90, 63,
+146, 95, 13, 63,170,179,103, 63,142,105, 12, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 10,162, 43, 62, 8, 50, 12, 63,
+ 64,199, 64, 62, 26, 40, 18, 63,226, 50, 1, 62,184, 68, 20, 63,168, 41,231, 61,158, 83, 11, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 72,139, 85, 63,103, 51, 19, 63, 90,189, 77, 63,233, 88, 17, 63,181,227, 82, 63,189,102, 11, 63,161,148, 90, 63,
+146, 95, 13, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,202, 98, 75, 62,108, 43, 10, 63, 22, 32, 96, 62, 66, 60, 16, 63,
+ 64,199, 64, 62, 26, 40, 18, 63, 10,162, 43, 62, 8, 50, 12, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 90,189, 77, 63,
+233, 88, 17, 63,190,100, 70, 63,222,234, 15, 63,248, 12, 75, 63, 64,206, 8, 63,181,227, 82, 63,189,102, 11, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 78,135,107, 62, 88,182, 7, 63, 86, 87,125, 62,174, 5, 15, 63, 22, 32, 96, 62, 66, 60, 16, 63,
+202, 98, 75, 62,108, 43, 10, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,190,100, 70, 63,222,234, 15, 63, 82,235, 60, 63,
+ 27, 12, 12, 63,166, 14, 64, 63, 81, 80, 4, 63,248, 12, 75, 63, 64,206, 8, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+160,121,140, 62, 74,197, 3, 63, 78,230,145, 62,148,225, 11, 63, 86, 87,125, 62,174, 5, 15, 63, 78,135,107, 62, 88,182, 7, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 31,118, 57, 63,230, 79, 12, 63,242, 80, 56, 63, 44,244, 6, 63,166, 14, 64, 63,
+ 81, 80, 4, 63, 82,235, 60, 63, 27, 12, 12, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0,160,121,140, 62, 74,197, 3, 63,
+ 61,208,156, 62,204, 16, 7, 63, 0,199,152, 62, 13,133, 12, 63, 78,230,145, 62,148,225, 11, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 32, 0,195,240, 57, 63, 10,138, 23, 63, 82,235, 60, 63, 27, 12, 12, 63,190,100, 70, 63,222,234, 15, 63,106,242, 66, 63,
+202, 94, 25, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 86, 87,125, 62,174, 5, 15, 63, 78,230,145, 62,148,225, 11, 63,
+247, 7,150, 62, 96, 12, 23, 63, 78,187,132, 62,180, 44, 24, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,216,120, 13, 63,
+160, 81, 23, 63, 94,233, 23, 63,186, 60, 16, 63,220, 56, 28, 63, 66,250, 14, 63,109, 44, 39, 63,107,221, 19, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,157,161,214, 62,219,110, 15, 63,109,130,223, 62,118,165, 16, 63, 64, 27,245, 62,100,166, 23, 63,
+156, 26,192, 62, 31,139, 20, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,176, 29, 56, 63, 88,206, 20, 63, 31,118, 57, 63,
+230, 79, 12, 63, 82,235, 60, 63, 27, 12, 12, 63,195,240, 57, 63, 10,138, 23, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 78,230,145, 62,148,225, 11, 63, 0,199,152, 62, 13,133, 12, 63,239,211,153, 62,220,159, 20, 63,247, 7,150, 62, 96, 12, 23, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 48,148, 54, 63,220,206, 22, 63,176, 29, 56, 63, 88,206, 20, 63,195,240, 57, 63,
+ 10,138, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,247, 7,150, 62, 96, 12, 23, 63,
+239,211,153, 62,220,159, 20, 63,108,106,156, 62,146,154, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,195,173, 54, 63,239,106,252, 62,154, 88, 53, 63,240,146,221, 62, 53, 64, 74, 63,171, 31,224, 62,115,205, 60, 63,
+213,150,253, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0,184,112,114, 62,248,169,220, 62,128,172,162, 62, 17,169,221, 62,
+202, 36,160, 62, 94, 51,252, 62,190, 85,147, 62, 91,176,252, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0, 53, 64, 74, 63,
+171, 31,224, 62,217,106, 81, 63, 14,214,232, 62, 68,103, 73, 63,233,248, 0, 63,115,205, 60, 63,213,150,253, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,144, 59,115, 62,102,143,255, 62, 88, 93, 84, 62, 50,105,228, 62,184,112,114, 62,248,169,220, 62,
+190, 85,147, 62, 91,176,252, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63, 14,214,232, 62,106,154, 93, 63,
+226, 26,233, 62,239,151, 82, 63, 86,223, 3, 63, 68,103, 73, 63,233,248, 0, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 82, 17, 77, 62,162, 98, 2, 63,128, 1, 33, 62, 70,210,226, 62, 88, 93, 84, 62, 50,105,228, 62,144, 59,115, 62,102,143,255, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120, 89,103, 63,105, 76, 2, 63, 92,224, 91, 63,239,144, 5, 63,239,151, 82, 63,
+ 86,223, 3, 63,106,154, 93, 63,226, 26,233, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 82, 17, 77, 62,162, 98, 2, 63,
+178, 40, 38, 62, 14,230, 3, 63,116,128,234, 61,200, 39, 0, 63,128, 1, 33, 62, 70,210,226, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 8, 7, 51, 63, 5,186,130, 62,226, 77, 72, 63,204, 21,121, 62,154,254, 73, 63,178, 82,140, 62, 90,188, 56, 63,
+103,207,159, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,249,249,130, 62,246,175,137, 62,132, 32,137, 62,181, 65,121, 62,
+ 18,197,172, 62, 41,112,133, 62,192, 5,161, 62,228, 40,159, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,224, 19, 69, 63,
+ 24, 68,190, 62, 90,188, 56, 63,103,207,159, 62,154,254, 73, 63,178, 82,140, 62,216,217, 77, 63, 7,228,157, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,128, 0,249,249,130, 62,246,175,137, 62,192, 5,161, 62,228, 40,159, 62,250, 78,134, 62,148,213,186, 62,
+154,118,111, 62,120,108,152, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,240,117, 49, 63,164,138,198, 62,156,160, 41, 63,
+ 56,175,182, 62, 90,188, 56, 63,103,207,159, 62,224, 19, 69, 63, 24, 68,190, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+192, 5,161, 62,228, 40,159, 62,202,212,188, 62,245,163,182, 62,147,137,172, 62,148, 19,198, 62,250, 78,134, 62,148,213,186, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,156,160, 41, 63, 56,175,182, 62,222,170, 33, 63, 74,126,158, 62, 91, 60, 36, 63,
+221,222,150, 62, 90,188, 56, 63,103,207,159, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,150,245,199, 62, 85, 15,152, 62,
+ 72,234,204, 62, 56, 63,159, 62,202,212,188, 62,245,163,182, 62,192, 5,161, 62,228, 40,159, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 91, 60, 36, 63,221,222,150, 62, 8, 7, 51, 63, 5,186,130, 62, 90,188, 56, 63,103,207,159, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,192, 5,161, 62,228, 40,159, 62, 18,197,172, 62, 41,112,133, 62,
+150,245,199, 62, 85, 15,152, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,156,160, 41, 63,
+ 56,175,182, 62,102,212, 31, 63,144,192,164, 62,222,170, 33, 63, 74,126,158, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 72,234,204, 62, 56, 63,159, 62, 17,119,208, 62,201, 65,165, 62,202,212,188, 62,245,163,182, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,226, 44,245, 62,129,140, 96, 63, 42,135,227, 62,
+ 58, 2,101, 63,136,168,219, 62, 30,236, 95, 63,135, 30,238, 62,200, 41, 90, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+216,240,137, 62, 90,226, 93, 63,110,103,122, 62,236,255, 92, 63, 74, 84,120, 62,104, 32, 83, 63, 32,193,138, 62, 16, 3, 83, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0, 48,130,233, 62,188, 69, 83, 63,135, 30,238, 62,200, 41, 90, 63,136,168,219, 62,
+ 30,236, 95, 63, 23, 73,212, 62,152,239, 90, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,216,240,137, 62, 90,226, 93, 63,
+ 32,193,138, 62, 16, 3, 83, 63, 66, 1,153, 62,245,149, 81, 63, 84, 66,150, 62,114,154, 94, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0,240, 0,216,217, 77, 63, 7,228,157, 62,154,254, 73, 63,178, 82,140, 62, 33, 61, 90, 63,195,207,124, 62,160,225, 90, 63,
+110,121,137, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0, 98,207, 81, 62,109, 1,110, 62,249,249,130, 62,246,175,137, 62,
+154,118,111, 62,120,108,152, 62,166,125, 74, 62,252, 30,130, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,226, 77, 72, 63,
+204, 21,121, 62,202,106, 84, 63,137,185,113, 62, 33, 61, 90, 63,195,207,124, 62,154,254, 73, 63,178, 82,140, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 98,207, 81, 62,109, 1,110, 62,168,179,107, 62,139,127,103, 62,132, 32,137, 62,181, 65,121, 62,
+249,249,130, 62,246,175,137, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 23, 73,212, 62,152,239, 90, 63,136,168,219, 62,
+ 30,236, 95, 63,100,192,205, 62, 46,238, 97, 63, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0,
+228, 94,141, 62, 86,234,100, 63,216,240,137, 62, 90,226, 93, 63, 84, 66,150, 62,114,154, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0, 31,178,109, 63,224, 68,228, 62, 46,178,102, 63,100,184,232, 62,100,251,101, 63,
+238,198,227, 62, 94,173,107, 63,168,130,225, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 68,209,249, 61, 70,134,219, 62,
+120,216,242, 61,124, 40,225, 62, 28, 27,177, 61, 42,240,219, 62, 76,131,196, 61,196, 97,216, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 31,178,109, 63,224, 68,228, 62, 94,173,107, 63,168,130,225, 62,144,102,114, 63,198, 23,220, 62, 41, 76,116, 63,
+139,153,222, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 56,163,120, 61, 58,252,208, 62, 76,131,196, 61,196, 97,216, 62,
+ 28, 27,177, 61, 42,240,219, 62,128,183, 73, 61, 84,108,213, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 41, 76,116, 63,
+139,153,222, 62,144,102,114, 63,198, 23,220, 62, 84, 87,117, 63,221,255,211, 62,183,115,119, 63,140, 49,215, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,144, 29, 55, 61,207,183,194, 62, 56,163,120, 61, 58,252,208, 62,128,183, 73, 61, 84,108,213, 62,
+224,111,231, 60,100,142,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,183,115,119, 63,140, 49,215, 62, 84, 87,117, 63,
+221,255,211, 62,150, 20,118, 63, 60,110,196, 62, 49, 12,122, 63,246, 8,197, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 96,197,103, 61, 15,206,170, 62,144, 29, 55, 61,207,183,194, 62,224,111,231, 60,100,142,198, 62,240, 54, 16, 61,120, 4,167, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 49, 12,122, 63,246, 8,197, 62,150, 20,118, 63, 60,110,196, 62, 17,155,108, 63,
+130,201,178, 62, 84,190,110, 63,223, 77,172, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,148,252,246, 61,164,116,160, 62,
+ 96,197,103, 61, 15,206,170, 62,240, 54, 16, 61,120, 4,167, 62, 8, 66,246, 61, 28,161,152, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 84,190,110, 63,223, 77,172, 62, 17,155,108, 63,130,201,178, 62, 21,180, 92, 63,202, 95,173, 62,151, 5, 90, 63,
+138, 61,167, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,144,216, 54, 62, 35, 76,163, 62,148,252,246, 61,164,116,160, 62,
+ 8, 66,246, 61, 28,161,152, 62,194,251, 66, 62,163,102,158, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 17,155,108, 63,
+130,201,178, 62,198,132,109, 63,182,157,186, 62, 68, 32, 97, 63,192, 12,178, 62, 21,180, 92, 63,202, 95,173, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 48,185, 36, 62, 16, 7,166, 62, 40, 91,221, 61, 4,194,167, 62,148,252,246, 61,164,116,160, 62,
+144,216, 54, 62, 35, 76,163, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,150, 20,118, 63, 60,110,196, 62, 84,225,115, 63,
+208, 85,198, 62,198,132,109, 63,182,157,186, 62, 17,155,108, 63,130,201,178, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 40, 91,221, 61, 4,194,167, 62,244,221,134, 61,121,164,175, 62, 96,197,103, 61, 15,206,170, 62,148,252,246, 61,164,116,160, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 84, 87,117, 63,221,255,211, 62,222, 48,116, 63,169, 8,209, 62, 84,225,115, 63,
+208, 85,198, 62,150, 20,118, 63, 60,110,196, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,244,221,134, 61,121,164,175, 62,
+160,108, 93, 61, 17,207,190, 62,144, 29, 55, 61,207,183,194, 62, 96,197,103, 61, 15,206,170, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,144,102,114, 63,198, 23,220, 62,174,151,113, 63, 26,229,214, 62,222, 48,116, 63,169, 8,209, 62, 84, 87,117, 63,
+221,255,211, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,160,108, 93, 61, 17,207,190, 62, 12,155,135, 61,166, 39,201, 62,
+ 56,163,120, 61, 58,252,208, 62,144, 29, 55, 61,207,183,194, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 94,173,107, 63,
+168,130,225, 62,228,239,107, 63, 62, 59,218, 62,174,151,113, 63, 26,229,214, 62,144,102,114, 63,198, 23,220, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 12,155,135, 61,166, 39,201, 62,128, 47,195, 61, 6, 11,207, 62, 76,131,196, 61,196, 97,216, 62,
+ 56,163,120, 61, 58,252,208, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 94,173,107, 63,168,130,225, 62,100,251,101, 63,
+238,198,227, 62, 71,205,102, 63,132, 94,219, 62,228,239,107, 63, 62, 59,218, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+192,157,244, 61,157,137,209, 62, 68,209,249, 61, 70,134,219, 62, 76,131,196, 61,196, 97,216, 62,128, 47,195, 61, 6, 11,207, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,224, 19, 69, 63, 24, 68,190, 62,216,217, 77, 63, 7,228,157, 62,236, 35, 85, 63,
+164,201,181, 62, 56, 92, 78, 63,177,114,188, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 32, 0,122, 91, 80, 62, 72, 18,174, 62,
+154,118,111, 62,120,108,152, 62,250, 78,134, 62,148,213,186, 62,162,163,104, 62,150,180,182, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 32, 0,216,217, 77, 63, 7,228,157, 62,151, 5, 90, 63,138, 61,167, 62, 21,180, 92, 63,202, 95,173, 62,236, 35, 85, 63,
+164,201,181, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,144,216, 54, 62, 35, 76,163, 62,194,251, 66, 62,163,102,158, 62,
+154,118,111, 62,120,108,152, 62,122, 91, 80, 62, 72, 18,174, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 53, 64, 74, 63,
+171, 31,224, 62,224, 19, 69, 63, 24, 68,190, 62, 56, 92, 78, 63,177,114,188, 62,217,106, 81, 63, 14,214,232, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,162,163,104, 62,150,180,182, 62,250, 78,134, 62,148,213,186, 62,184,112,114, 62,248,169,220, 62,
+ 88, 93, 84, 62, 50,105,228, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,106,154, 93, 63,226, 26,233, 62,196,229, 94, 63,
+128,195,224, 62,100,251,101, 63,238,198,227, 62, 46,178,102, 63,100,184,232, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 68,209,249, 61, 70,134,219, 62,108,187, 28, 62, 48, 86,217, 62,128, 1, 33, 62, 70,210,226, 62,120,216,242, 61,124, 40,225, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 21,180, 92, 63,202, 95,173, 62, 68, 32, 97, 63,192, 12,178, 62, 9,215, 94, 63,
+ 4, 54,186, 62,236, 35, 85, 63,164,201,181, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 60,122, 41, 62, 16, 58,175, 62,
+ 48,185, 36, 62, 16, 7,166, 62,144,216, 54, 62, 35, 76,163, 62,122, 91, 80, 62, 72, 18,174, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,230, 78, 95, 63, 4,233,189, 62, 32,188, 86, 63, 44, 62,190, 62,236, 35, 85, 63,164,201,181, 62, 9,215, 94, 63,
+ 4, 54,186, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,122, 91, 80, 62, 72, 18,174, 62, 78,118, 71, 62, 27, 49,182, 62,
+ 52,225, 37, 62, 40, 12,179, 62, 60,122, 41, 62, 16, 58,175, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 70,166, 92, 63,
+ 0,166,197, 62, 32,188, 86, 63, 44, 62,190, 62,230, 78, 95, 63, 4,233,189, 62,226, 13, 95, 63, 37,152,194, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 52,225, 37, 62, 40, 12,179, 62, 78,118, 71, 62, 27, 49,182, 62,142,143, 45, 62,237, 37,188, 62,
+106,230, 36, 62,222, 27,184, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,248, 90, 95, 63,100,122,207, 62,108,249, 90, 63,
+ 58,199,212, 62, 32,188, 86, 63, 44, 62,190, 62, 70,166, 92, 63, 0,166,197, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 78,118, 71, 62, 27, 49,182, 62,110, 56, 48, 62,230, 43,205, 62,174,250, 30, 62, 26, 12,198, 62,142,143, 45, 62,237, 37,188, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,196,229, 94, 63,128,195,224, 62,108,249, 90, 63, 58,199,212, 62,248, 90, 95, 63,
+100,122,207, 62, 92,104, 98, 63,197,136,215, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,174,250, 30, 62, 26, 12,198, 62,
+110, 56, 48, 62,230, 43,205, 62,108,187, 28, 62, 48, 86,217, 62,212, 59, 15, 62,224, 50,206, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,100,251,101, 63,238,198,227, 62,196,229, 94, 63,128,195,224, 62, 92,104, 98, 63,197,136,215, 62, 71,205,102, 63,
+132, 94,219, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,212, 59, 15, 62,224, 50,206, 62,108,187, 28, 62, 48, 86,217, 62,
+ 68,209,249, 61, 70,134,219, 62,192,157,244, 61,157,137,209, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63,
+ 14,214,232, 62,108,249, 90, 63, 58,199,212, 62,196,229, 94, 63,128,195,224, 62,106,154, 93, 63,226, 26,233, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,108,187, 28, 62, 48, 86,217, 62,110, 56, 48, 62,230, 43,205, 62, 88, 93, 84, 62, 50,105,228, 62,
+128, 1, 33, 62, 70,210,226, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63, 14,214,232, 62, 56, 92, 78, 63,
+177,114,188, 62, 32,188, 86, 63, 44, 62,190, 62,108,249, 90, 63, 58,199,212, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 78,118, 71, 62, 27, 49,182, 62,162,163,104, 62,150,180,182, 62, 88, 93, 84, 62, 50,105,228, 62,110, 56, 48, 62,230, 43,205, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 56, 92, 78, 63,177,114,188, 62,236, 35, 85, 63,164,201,181, 62, 32,188, 86, 63,
+ 44, 62,190, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 78,118, 71, 62, 27, 49,182, 62,
+122, 91, 80, 62, 72, 18,174, 62,162,163,104, 62,150,180,182, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 71,205,102, 63,132, 94,219, 62, 92,104, 98, 63,197,136,215, 62,182,109,100, 63,149,255,210, 62, 54, 86,104, 63,
+209,241,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,160,107, 7, 62, 34,103,200, 62,212, 59, 15, 62,224, 50,206, 62,
+192,157,244, 61,157,137,209, 62, 8, 2,232, 61, 20,214,203, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 92,104, 98, 63,
+197,136,215, 62,248, 90, 95, 63,100,122,207, 62,112,206, 97, 63, 10,202,204, 62,182,109,100, 63,149,255,210, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 64, 68, 21, 62,107, 55,194, 62,174,250, 30, 62, 26, 12,198, 62,212, 59, 15, 62,224, 50,206, 62,
+160,107, 7, 62, 34,103,200, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,248, 90, 95, 63,100,122,207, 62, 70,166, 92, 63,
+ 0,166,197, 62, 82,241, 94, 63, 40,103,198, 62,112,206, 97, 63, 10,202,204, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 20,225, 35, 62, 39, 50,188, 62,142,143, 45, 62,237, 37,188, 62,174,250, 30, 62, 26, 12,198, 62, 64, 68, 21, 62,107, 55,194, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 70,166, 92, 63, 0,166,197, 62,226, 13, 95, 63, 37,152,194, 62,118, 1, 97, 63,
+ 47,226,195, 62, 82,241, 94, 63, 40,103,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 12, 43, 28, 62,186,177,184, 62,
+106,230, 36, 62,222, 27,184, 62,142,143, 45, 62,237, 37,188, 62, 20,225, 35, 62, 39, 50,188, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,226, 13, 95, 63, 37,152,194, 62,230, 78, 95, 63, 4,233,189, 62, 51,113, 97, 63, 92,151,189, 62,118, 1, 97, 63,
+ 47,226,195, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,104, 67, 29, 62, 58,199,177, 62, 52,225, 37, 62, 40, 12,179, 62,
+106,230, 36, 62,222, 27,184, 62, 12, 43, 28, 62,186,177,184, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,230, 78, 95, 63,
+ 4,233,189, 62, 9,215, 94, 63, 4, 54,186, 62, 96, 69, 96, 63,152,133,187, 62, 51,113, 97, 63, 92,151,189, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,140, 14, 35, 62, 33, 19,176, 62, 60,122, 41, 62, 16, 58,175, 62, 52,225, 37, 62, 40, 12,179, 62,
+104, 67, 29, 62, 58,199,177, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 9,215, 94, 63, 4, 54,186, 62, 68, 32, 97, 63,
+192, 12,178, 62,112, 91, 98, 63,149,128,182, 62, 96, 69, 96, 63,152,133,187, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+228,107, 29, 62, 95,230,169, 62, 48,185, 36, 62, 16, 7,166, 62, 60,122, 41, 62, 16, 58,175, 62,140, 14, 35, 62, 33, 19,176, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,228,239,107, 63, 62, 59,218, 62, 71,205,102, 63,132, 94,219, 62, 54, 86,104, 63,
+209,241,214, 62, 34, 27,109, 63,155,254,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 8, 2,232, 61, 20,214,203, 62,
+192,157,244, 61,157,137,209, 62,128, 47,195, 61, 6, 11,207, 62, 36,174,184, 61,216,130,202, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,174,151,113, 63, 26,229,214, 62,228,239,107, 63, 62, 59,218, 62, 34, 27,109, 63,155,254,214, 62, 69,134,113, 63,
+156, 82,212, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 36,174,184, 61,216,130,202, 62,128, 47,195, 61, 6, 11,207, 62,
+ 12,155,135, 61,166, 39,201, 62, 60,114,138, 61, 28, 61,197, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,222, 48,116, 63,
+169, 8,209, 62,174,151,113, 63, 26,229,214, 62, 69,134,113, 63,156, 82,212, 62, 42,143,114, 63, 24,168,207, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 60,114,138, 61, 28, 61,197, 62, 12,155,135, 61,166, 39,201, 62,160,108, 93, 61, 17,207,190, 62,
+184, 85,132, 61, 22,211,189, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 84,225,115, 63,208, 85,198, 62,222, 48,116, 63,
+169, 8,209, 62, 42,143,114, 63, 24,168,207, 62,203,125,114, 63, 96,114,200, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+184, 85,132, 61, 22,211,189, 62,160,108, 93, 61, 17,207,190, 62,244,221,134, 61,121,164,175, 62, 16,152,145, 61, 84,214,179, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,198,132,109, 63,182,157,186, 62, 84,225,115, 63,208, 85,198, 62,203,125,114, 63,
+ 96,114,200, 62,177,192,109, 63,152,240,190, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 16,152,145, 61, 84,214,179, 62,
+244,221,134, 61,121,164,175, 62, 40, 91,221, 61, 4,194,167, 62, 64,226,208, 61,232, 58,172, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 68, 32, 97, 63,192, 12,178, 62,198,132,109, 63,182,157,186, 62,177,192,109, 63,152,240,190, 62,112, 91, 98, 63,
+149,128,182, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 64,226,208, 61,232, 58,172, 62, 40, 91,221, 61, 4,194,167, 62,
+ 48,185, 36, 62, 16, 7,166, 62,228,107, 29, 62, 95,230,169, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,118, 1, 97, 63,
+ 47,226,195, 62, 51,113, 97, 63, 92,151,189, 62,215,139,102, 63, 15,109,193, 62, 54, 47,100, 63,186,115,198, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 92,169, 5, 62,168,115,179, 62,104, 67, 29, 62, 58,199,177, 62, 12, 43, 28, 62,186,177,184, 62,
+ 50, 97, 13, 62, 50, 42,186, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 54, 47,100, 63,186,115,198, 62,215,139,102, 63,
+ 15,109,193, 62,174,241,105, 63,204, 8,200, 62, 71,233,103, 63,178, 42,204, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+228,171,229, 61, 41, 42,185, 62, 92,169, 5, 62,168,115,179, 62, 50, 97, 13, 62, 50, 42,186, 62, 92,248,243, 61, 96, 22,191, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 71,233,103, 63,178, 42,204, 62,174,241,105, 63,204, 8,200, 62, 51, 37,108, 63,
+249, 3,205, 62, 56,212,106, 63, 96,238,208, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120, 99,202, 61,192, 49,190, 62,
+228,171,229, 61, 41, 42,185, 62, 92,248,243, 61, 96, 22,191, 62,160,209,211, 61,108,159,195, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 56,212,106, 63, 96,238,208, 62, 51, 37,108, 63,249, 3,205, 62, 56, 73,110, 63,186,119,206, 62, 46,191,109, 63,
+ 92, 64,210, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,244,234,179, 61,240,219,190, 62,120, 99,202, 61,192, 49,190, 62,
+160,209,211, 61,108,159,195, 62,196,129,181, 61,204, 14,196, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 34, 27,109, 63,
+155,254,214, 62, 54, 86,104, 63,209,241,214, 62, 56,212,106, 63, 96,238,208, 62, 46,191,109, 63, 92, 64,210, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,160,209,211, 61,108,159,195, 62, 8, 2,232, 61, 20,214,203, 62, 36,174,184, 61,216,130,202, 62,
+196,129,181, 61,204, 14,196, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,182,109,100, 63,149,255,210, 62, 71,233,103, 63,
+178, 42,204, 62, 56,212,106, 63, 96,238,208, 62, 54, 86,104, 63,209,241,214, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+160,209,211, 61,108,159,195, 62, 92,248,243, 61, 96, 22,191, 62,160,107, 7, 62, 34,103,200, 62, 8, 2,232, 61, 20,214,203, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,182,109,100, 63,149,255,210, 62,112,206, 97, 63, 10,202,204, 62, 54, 47,100, 63,
+186,115,198, 62, 71,233,103, 63,178, 42,204, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 50, 97, 13, 62, 50, 42,186, 62,
+ 64, 68, 21, 62,107, 55,194, 62,160,107, 7, 62, 34,103,200, 62, 92,248,243, 61, 96, 22,191, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0,118, 1, 97, 63, 47,226,195, 62, 54, 47,100, 63,186,115,198, 62,112,206, 97, 63, 10,202,204, 62, 82,241, 94, 63,
+ 40,103,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 64, 68, 21, 62,107, 55,194, 62, 50, 97, 13, 62, 50, 42,186, 62,
+ 12, 43, 28, 62,186,177,184, 62, 20,225, 35, 62, 39, 50,188, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 96, 69, 96, 63,
+152,133,187, 62,112, 91, 98, 63,149,128,182, 62,215,139,102, 63, 15,109,193, 62, 51,113, 97, 63, 92,151,189, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 92,169, 5, 62,168,115,179, 62,228,107, 29, 62, 95,230,169, 62,140, 14, 35, 62, 33, 19,176, 62,
+104, 67, 29, 62, 58,199,177, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,177,192,109, 63,152,240,190, 62,174,241,105, 63,
+204, 8,200, 62,215,139,102, 63, 15,109,193, 62,112, 91, 98, 63,149,128,182, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 92,169, 5, 62,168,115,179, 62,228,171,229, 61, 41, 42,185, 62, 64,226,208, 61,232, 58,172, 62,228,107, 29, 62, 95,230,169, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,203,125,114, 63, 96,114,200, 62, 51, 37,108, 63,249, 3,205, 62,174,241,105, 63,
+204, 8,200, 62,177,192,109, 63,152,240,190, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,228,171,229, 61, 41, 42,185, 62,
+120, 99,202, 61,192, 49,190, 62, 16,152,145, 61, 84,214,179, 62, 64,226,208, 61,232, 58,172, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 42,143,114, 63, 24,168,207, 62, 56, 73,110, 63,186,119,206, 62, 51, 37,108, 63,249, 3,205, 62,203,125,114, 63,
+ 96,114,200, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120, 99,202, 61,192, 49,190, 62,244,234,179, 61,240,219,190, 62,
+184, 85,132, 61, 22,211,189, 62, 16,152,145, 61, 84,214,179, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 69,134,113, 63,
+156, 82,212, 62, 46,191,109, 63, 92, 64,210, 62, 56, 73,110, 63,186,119,206, 62, 42,143,114, 63, 24,168,207, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0,244,234,179, 61,240,219,190, 62,196,129,181, 61,204, 14,196, 62, 60,114,138, 61, 28, 61,197, 62,
+184, 85,132, 61, 22,211,189, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 34, 27,109, 63,155,254,214, 62, 46,191,109, 63,
+ 92, 64,210, 62, 69,134,113, 63,156, 82,212, 62, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+ 60,114,138, 61, 28, 61,197, 62,196,129,181, 61,204, 14,196, 62, 36,174,184, 61,216,130,202, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 84,190,110, 63,223, 77,172, 62,151, 5, 90, 63,138, 61,167, 62, 22, 25, 96, 63,
+246,248,149, 62,162,176,122, 63,145,215,161, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0, 64,234, 54, 62,146,219,140, 62,
+194,251, 66, 62,163,102,158, 62, 8, 66,246, 61, 28,161,152, 62,172,241,189, 61, 13,107,132, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0, 0, 0, 49, 12,122, 63,246, 8,197, 62, 84,190,110, 63,223, 77,172, 62,162,176,122, 63,145,215,161, 62,188,255,126, 63,
+115,248,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0,172,241,189, 61, 13,107,132, 62, 8, 66,246, 61, 28,161,152, 62,
+240, 54, 16, 61,120, 4,167, 62, 0, 8,163, 58, 39, 69,162, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0,183,115,119, 63,
+140, 49,215, 62, 49, 12,122, 63,246, 8,197, 62,188,255,126, 63,115,248,198, 62, 47, 6,122, 63,248,157,216, 62, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0, 0, 0, 0, 8,163, 58, 39, 69,162, 62,240, 54, 16, 61,120, 4,167, 62,224,111,231, 60,100,142,198, 62,
+224,248, 14, 60, 70,141,198, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0, 41, 76,116, 63,139,153,222, 62,183,115,119, 63,
+140, 49,215, 62, 47, 6,122, 63,248,157,216, 62,134, 98,119, 63,204, 37,225, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,
+224,248, 14, 60, 70,141,198, 62,224,111,231, 60,100,142,198, 62,128,183, 73, 61, 84,108,213, 62, 80,210,229, 60, 32,239,218, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0, 31,178,109, 63,224, 68,228, 62, 41, 76,116, 63,139,153,222, 62,134, 98,119, 63,
+204, 37,225, 62, 46,185,115, 63, 90,157,234, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,128, 0, 80,210,229, 60, 32,239,218, 62,
+128,183, 73, 61, 84,108,213, 62, 28, 27,177, 61, 42,240,219, 62, 56,103,122, 61, 30, 10,230, 62, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0,128, 0, 46,178,102, 63,100,184,232, 62, 31,178,109, 63,224, 68,228, 62, 46,185,115, 63, 90,157,234, 62,244,134,106, 63,
+234, 64,246, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 56,103,122, 61, 30, 10,230, 62, 28, 27,177, 61, 42,240,219, 62,
+120,216,242, 61,124, 40,225, 62,212,222,209, 61,238,123,240, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,235,188, 5, 63,
+252, 74, 98, 63,200,111,248, 62,197,105,112, 63, 0, 49,231, 62,118,190,107, 63,150, 57,255, 62, 53, 14, 96, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0, 80, 99, 95, 62,149,194, 94, 63, 58, 8, 62, 62, 10,154, 89, 63, 40, 24, 92, 62, 14, 82, 74, 63,
+112, 11,112, 62,157,133, 78, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,235,188, 5, 63,252, 74, 98, 63,136,139, 12, 63,
+138,233,101, 63,116, 45, 6, 63,112,245,113, 63,200,111,248, 62,197,105,112, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,
+ 68,219, 36, 62,249,186, 81, 63, 28,254, 65, 62, 20, 55, 70, 63, 40, 24, 92, 62, 14, 82, 74, 63, 58, 8, 62, 62, 10,154, 89, 63,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,136,139, 12, 63,138,233,101, 63, 5,130, 12, 63,149,216,108, 63,116, 45, 6, 63,
+112,245,113, 63, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,112, 0, 68,219, 36, 62,249,186, 81, 63,
+ 76, 1, 42, 62, 39,178, 73, 63, 28,254, 65, 62, 20, 55, 70, 63, 0, 0,128, 63, 0, 0,128, 63, 56, 82,179, 3, 1, 0, 5, 0,
+ 0, 0,112, 0,120, 89,103, 63,105, 76, 2, 63,106,154, 93, 63,226, 26,233, 62, 46,178,102, 63,100,184,232, 62,244,134,106, 63,
+234, 64,246, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,120,216,242, 61,124, 40,225, 62,128, 1, 33, 62, 70,210,226, 62,
+116,128,234, 61,200, 39, 0, 63,212,222,209, 61,238,123,240, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 0, 0,226, 44,245, 62,
+129,140, 96, 63,150, 57,255, 62, 53, 14, 96, 63, 0, 49,231, 62,118,190,107, 63, 42,135,227, 62, 58, 2,101, 63, 56, 82,179, 3,
+ 1, 0, 5, 0, 0, 0,240, 0, 80, 99, 95, 62,149,194, 94, 63,112, 11,112, 62,157,133, 78, 63, 74, 84,120, 62,104, 32, 83, 63,
+110,103,122, 62,236,255, 92, 63, 56, 82,179, 3, 1, 0, 5, 0, 0, 0,240, 0,216,217, 77, 63, 7,228,157, 62,160,225, 90, 63,
+110,121,137, 62, 22, 25, 96, 63,246,248,149, 62,151, 5, 90, 63,138, 61,167, 62, 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 16, 0,
+ 64,234, 54, 62,146,219,140, 62,166,125, 74, 62,252, 30,130, 62,154,118,111, 62,120,108,152, 62,194,251, 66, 62,163,102,158, 62,
+ 56, 82,179, 3, 1, 0, 5, 0, 0, 0, 64, 0, 68, 65, 84, 65, 64, 31, 0, 0, 0, 65,182, 3, 59, 0, 0, 0,208, 7, 0, 0,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -7553,19 +7848,19 @@ char datatoc_preview_blend[]= {
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 0, 0, 77, 69, 0, 0, 1, 24, 8,194,113,208, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,119,192, 8,194,107,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 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, 8,194,115, 16,
- 3,162, 52, 32, 3,162, 58, 32, 0, 0, 0, 0, 3,162, 30, 32, 3,162, 42, 32, 0, 0, 0, 0, 3,162, 68, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,194,115, 64, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,116,192, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,118, 64, 0, 0, 0, 3,
- 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,115, 16, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,115, 64, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 0, 0, 24, 1, 0, 0,112, 96,182, 3, 52, 0, 0, 0, 1, 0, 0, 0,152,139,182, 3,176, 94,181, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 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,184, 97,182, 3,
+ 16,123,182, 3, 64,127,182, 3, 0, 0, 0, 0,120, 99,182, 3, 16,112,182, 3, 0, 0, 0, 0, 56,136,182, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 97,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,136,110,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,121,182, 3,
+ 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,
+214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 97,182, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,240, 97,182, 3, 58, 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, 3,162, 30, 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,120, 99,182, 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,
@@ -7574,661 +7869,661 @@ char datatoc_preview_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, 0, 0, 10,224, 3,162, 30, 32, 0, 0, 0, 58, 0, 0, 0,116,
- 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,
- 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,
- 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-191,215, 33, 37, 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,
- 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-184,140,212,127, 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,
- 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,
- 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244, 63,255,192, 1,
- 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,
-192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,
- 64,190, 35,238, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 64,190, 35,238, 63,255,192, 1,
- 90,129, 0,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-192, 87, 32,102, 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,
- 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,
- 64, 87, 29,217, 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,
- 64,190, 35,244,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,
- 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 65, 6,115,159, 64,215, 30,146,192,190, 36, 74, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,100, 43,135,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 64,215, 30,150, 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,
-191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 63,152, 29, 14,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,
- 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,190, 36, 72,192, 1,192, 1,
- 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,
-184,136, 91,213, 65,114, 3, 43,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,
- 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110, 64,100, 43,129,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-184,136, 91,213, 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,
- 63,152, 28,234,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 63,152, 28,246,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,
-191,152, 29, 30,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,191,152, 29, 18,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-184,136, 91,213, 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,
-192,100, 43,153,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,100, 43,147,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-184,136, 91,213, 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-191,215, 33,222, 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,
-192,100, 43,154, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,191,152, 29, 32, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-193, 6,115,182, 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,
-192,190, 36, 78, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78, 63,255,192, 1,
- 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,
-192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5, 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,191, 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181,
- 64,100, 43,139, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,
- 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,
-191,152, 28,253, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,
-192,100, 43,136, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 63,215, 28,201, 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-184,138,163,172, 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,192, 1,192, 1,
- 90,129, 2,255, 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,116,192, 0, 0, 1, 42, 0, 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, 3,162, 42, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 9, 72, 3,162, 42, 32, 0, 0, 0, 55, 0, 0, 0,198, 0, 0, 0, 21,
- 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 34,
- 0, 0, 0, 18, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 53,
- 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 27,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34,
- 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 24,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 29,
- 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34,
- 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 35, 0, 0, 0, 34,
- 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 33,
- 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 40,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 39, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0,100, 0, 0, 0, 34,
- 0, 0, 0, 37, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 41, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 40,
- 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 86,
- 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 50,
- 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,115, 0, 0, 0, 34,
- 0, 0, 0, 52, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,114,
- 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 42,
- 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34,
- 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47,
- 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 55,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 34,
- 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 57,
- 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57,
- 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34,
- 0, 0, 0, 63, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 66,
- 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 52,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 53, 0, 0, 0, 34,
- 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 65,
- 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 71,
- 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 97, 0, 0, 0, 34,
- 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 0, 85,
- 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0, 73,
- 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 77, 0, 0, 0, 34,
- 0, 0, 0, 81, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,112,
- 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 34,
- 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 88,
- 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 86,
- 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 92,
- 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 86,
- 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34,
- 0, 0, 0, 92, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81,
- 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 95, 0, 0, 0, 34,
- 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101,
- 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99,
- 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34,
- 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34,
- 0, 0, 0,109, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,112,
- 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,106,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34,
- 0, 0, 0,112, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,111,
- 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,118, 64, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,224, 10, 0, 0,120, 99,182, 3, 58, 0, 0, 0,116, 0, 0, 0,
+223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,
+242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,
+250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 37, 33,215,191,175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,
+250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+127,212,140,184,242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,
+250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,
+248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,255, 63, 1,192,
+129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,
+ 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,
+238, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,183,115, 6,193,127, 31,215, 64,238, 35,190, 64,255, 63, 1,192,
+129, 90,255, 0, 0, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+102, 32, 87,192, 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,
+244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,
+217, 29, 87, 64,112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,
+244, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64,
+247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+159,115, 6, 65,146, 30,215, 64, 74, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,135, 43,100,192,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+150, 30,215, 64,151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,
+ 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 14, 29,152, 63,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,
+135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,
+129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,
+213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,
+129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,129, 43,100, 64,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+213, 91,136,184, 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,
+234, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,246, 28,152, 63,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,
+ 30, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 18, 29,152,191,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+213, 91,136,184, 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,
+153, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,147, 43,100,192,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+213, 91,136,184, 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+222, 33,215,191,183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,
+154, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 32, 29,152,191,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+182,115, 6,193,128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,
+ 78, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,255, 63, 1,192,
+129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,122, 31,215,192,180,115, 6, 65,
+ 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,
+139, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,
+ 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,
+253, 28,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,
+136, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+201, 28,215, 63,172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+172,163,138,184,181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192, 1,192, 1,192,
+129, 90,255, 0, 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,136,110,182, 3, 58, 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, 16,112,182, 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, 68, 65, 84, 65, 72, 9, 0, 0, 16,112,182, 3, 55, 0, 0, 0,198, 0, 0, 0, 21, 0, 0, 0,
+ 82, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0,
+ 18, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 34, 0, 28, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0,
+ 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0,
+ 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0,
+ 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0,
+ 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 29, 0, 0, 0,
+ 0, 0, 34, 0, 6, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0,
+ 23, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 34, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0,
+ 37, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0,
+ 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0,
+ 41, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+ 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 86, 0, 0, 0,
+ 0, 0, 34, 0, 56, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,
+114, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,
+ 52, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,114, 0, 0, 0,
+ 0, 0, 34, 0, 42, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0,
+ 43, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0,
+ 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0,
+ 0, 0, 34, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0,
+ 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0,
+ 58, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0,
+ 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0,
+ 61, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0,
+ 63, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 66, 0, 0, 0,
+ 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0,
+ 46, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 65, 0, 0, 0,
+ 0, 0, 34, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,
+102, 0, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0,
+ 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 85, 0, 0, 0,
+ 0, 0, 34, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0,
+ 77, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0,
+ 81, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,112, 0, 0, 0,
+ 0, 0, 34, 0, 78, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+ 85, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0,
+ 85, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 88, 0, 0, 0,
+ 0, 0, 34, 0, 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,
+ 87, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+ 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 92, 0, 0, 0,
+ 0, 0, 34, 0, 87, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,
+ 90, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0,
+ 92, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,
+ 97, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 78, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,
+103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,
+105, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,
+109, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,112, 0, 0, 0,
+ 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,
+112, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,111, 0, 0, 0,
+ 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,136,121,182, 3, 58, 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, 86, 84,101,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, 3,162, 52, 32, 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, 0, 85, 86, 84,101,
-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, 3,162, 58, 32,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,123,182, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,
+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, 64,127,182, 3,
+ 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,
- 3,162, 68, 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, 68, 65, 84, 65, 0, 0, 3,252, 3,162, 52, 32, 0, 0, 0, 54, 0, 0, 0, 51,
- 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4,
- 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4,
- 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6,
- 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8,
- 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15,
- 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14,
- 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44,
- 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0,
- 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53,
- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55,
- 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57,
- 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0,
- 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76,
- 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27,
- 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88,
- 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75,
- 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0,
- 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97,
- 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97,
- 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79,
- 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36,
- 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0,
- 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100,
- 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51,
- 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104,
- 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112,
- 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0,
- 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111,
- 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 8,196, 3,162, 58, 32, 0, 0, 0, 65, 0, 0, 0, 51, 63, 27,168,250, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96,
- 62,203,162, 84, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21,
- 59, 93,211, 96, 63, 81,128,146, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
- 63,158,151,225, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,149, 59, 93,211, 96, 63, 27,168,251,
- 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,227, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,246, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 62,203,162, 85,
- 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 24, 59, 93,211, 96,
- 63, 81,128,142, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,176,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226,
- 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96,
- 63, 27,168,248, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44,
- 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99,
- 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76,
- 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99,
- 63, 41, 47, 72, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,174, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188,
- 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52,
- 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44,
- 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96,
- 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244, 61,104, 84,200, 63, 79, 65,242,
- 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,200, 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,
-190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160,
- 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64,
- 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 63, 0,188,188,
- 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131,180, 62,186, 19,116,
- 63,159,140,244, 63, 3, 28, 50, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,174, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,226,112, 61,135, 38, 64, 63,114,244,240,
- 62, 91,221, 4, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 61,135, 44, 96, 62,181, 84, 61,189,169,104,176,
- 63, 0,189, 93,190,109, 1, 80, 63, 38,207,248,189,169,109,144, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174,
- 63, 41, 47,116, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 62,186, 21, 0, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185, 61,135, 44, 96,
- 63, 38,207, 51, 62, 91,224, 24, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52,
- 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 0,188,188, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 52, 63, 3, 28,248,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 14, 62,186, 21, 0, 61,104, 82,144, 62, 91,223,128, 62, 82, 94,138,
- 61,135, 43, 48, 62,181, 84,122, 62, 91,224, 32, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102,
- 62,181, 84,127, 63, 79, 65,242, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62, 82, 95, 26, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122,
- 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 56, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,127, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,189,188,106,128, 62,186, 20,176,
- 61,104, 84,160, 63, 3, 29, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 48, 3,162, 68, 32,
- 0, 0, 0, 59, 0, 0, 0,204,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24,
- 8,194,119,192, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,125,176, 8,194,113,208, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108,
- 97,110,101, 46, 48, 48, 49, 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, 8,194,121, 0, 3,162, 94, 32, 3,162, 98, 32,
- 0, 0, 0, 0, 3,162, 72, 32, 3,162, 84, 32, 0, 0, 0, 0, 3,162,108, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,121, 48, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,122,176, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,124, 48, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,121, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,121, 48, 0, 0, 1, 42, 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, 3,162, 72, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,176, 3,162, 72, 32, 0, 0, 0, 58, 0, 0, 0,114, 63,215, 28,223, 65, 87, 31, 77,
-192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,192, 1,192, 1,
- 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182,
-192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-184,138,163,172, 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175,
-192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 63,215, 28,201, 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242,
-192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107,
-192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,
-192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,
-191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,
- 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-192,161, 87,191, 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5, 65, 60, 59,114,
- 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,
-192,161, 87,192, 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,
-192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78, 63,255,192, 1,
- 90,129, 0,255, 0, 0, 0, 0,193, 6,115,182, 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,
-193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,
-191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154, 90,129,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,
- 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,
-192,100, 43,147,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,
- 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,
-191,152, 29, 18,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,
- 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,
- 63,152, 28,246,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,
- 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110,
- 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,190, 36, 72,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,
-192,190, 36, 72,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,
- 63,152, 29, 14,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,
-192,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217,
-192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,
- 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,
- 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,
- 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244,165,127,165,127,
- 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,
- 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,
-192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,
- 64,190, 35,242, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244, 63,255,192, 1,
- 90,129, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
- 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,
- 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-184,140,212,127, 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,
- 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-191,215, 33, 37, 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,
- 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,
-192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,
- 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244, 0, 0, 0, 0,
-127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,
- 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16,
- 64,190, 35,245, 0, 0,221, 42,123, 41, 2,255, 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16,192,190, 36, 74, 0, 0,221, 42,
-132,215, 2,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,122,176, 0, 0, 1, 42, 0, 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, 3,162, 84, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 9, 0, 3,162, 84, 32, 0, 0, 0, 55,
- 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34,
- 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34,
- 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11,
- 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15,
- 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 21,
- 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 35, 0, 0, 0, 34,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 28,
- 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 22,
- 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 33, 0, 0, 0, 34,
- 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 28,
- 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 26,
- 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 34,
- 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37,
- 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34,
- 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 22,
- 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 42, 0, 0, 0, 34,
- 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 45,
- 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 57,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 34,
- 0, 0, 0, 46, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49,
- 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 47,
- 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 50, 0, 0, 0, 34,
- 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 56,
- 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 50,
- 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34,
- 0, 0, 0, 56, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56,
- 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 54,
- 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34,
- 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 68,
- 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 69,
- 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 72, 0, 0, 0, 34,
- 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 6,
- 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 34,
- 0, 0, 0, 71, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 76,
- 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 74, 0, 0, 0, 34, 0, 0, 0, 17,
- 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 95, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 83,
- 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,110, 0, 0, 0, 34,
- 0, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 88,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0,107,
- 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 90,
- 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96,
- 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34,
- 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100,
- 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98,
- 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34,
- 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107,
- 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109,
- 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34,
- 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 83,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 60,
- 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 31, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 90,
- 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,124, 48, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0,
+ 56,136,182, 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, 68, 65, 84, 65,252, 3, 0, 0, 16,123,182, 3, 54, 0, 0, 0, 51, 0, 0, 0,
+ 18, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 5, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0,
+ 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 12, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 16, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0,
+ 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0,
+ 49, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0,
+ 48, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0,
+ 56, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0,
+ 0, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0,
+ 68, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+115, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0,
+ 85, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
+ 21, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0,
+ 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0,
+ 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0,
+ 60, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0,
+ 73, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0,
+ 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+ 98, 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,
+109, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0,
+ 0, 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,
+108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,
+113, 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,
+112, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+196, 8, 0, 0, 64,127,182, 3, 65, 0, 0, 0, 51, 0, 0, 0,250,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59,
+ 84,162,203, 62, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63,
+ 96,211, 93, 59,146,128, 81, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,227,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,
+225,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,149,128, 81, 63, 96,211, 93, 59,251,168, 27, 63,
+ 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+227,151,158, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,246,168, 27, 63, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59, 85,162,203, 62,
+ 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 24,172,131, 63, 96,211, 93, 59,
+142,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,176,131,185, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,
+247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63,
+ 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,
+248,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,
+236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63,
+ 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63,
+ 72, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,
+174,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,
+173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,
+111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,
+188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,
+236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,
+120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,242, 65, 79, 63,
+ 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,122, 84,181, 62,
+113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+200, 84,104, 61,242, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63,
+ 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,
+242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,
+122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,
+216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,
+173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,180,131,140, 63,116, 19,186, 62,
+244,140,159, 63, 50, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,174,225, 76, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,112,226, 76, 63, 64, 38,135, 61,240,244,114, 63,
+ 4,221, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63, 96, 44,135, 61, 61, 84,181, 62,176,104,169,189,
+ 93,189, 0, 63, 80, 1,109,190,248,207, 38, 63,144,109,169,189, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,
+116, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 96, 44,135, 61,
+ 51,207, 38, 63, 24,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,
+236, 65, 79, 63,174,225, 76, 63,116, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+188,188, 0, 63,120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 52,207, 38, 63,248, 28, 3, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 14, 95, 82, 62, 0, 21,186, 62,144, 82,104, 61,128,223, 91, 62,138, 94, 82, 62,
+ 48, 43,135, 61,122, 84,181, 62, 32,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63,
+127, 84,181, 62,242, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 26, 95, 82, 62,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62,
+248, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63, 56,207, 38, 63,111,179,141, 63,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,127, 84,181, 62,242, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,128,106,188,189,176, 20,186, 62,
+160, 84,104, 61, 0, 29, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 3, 0, 0, 56,136,182, 3,
+ 59, 0, 0, 0,204, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,
+152,139,182, 3, 52, 0, 0, 0, 1, 0, 0, 0,168,181,182, 3,112, 96,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108,
+ 97,110,101, 46, 48, 48, 49, 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,224,140,182, 3,192,165,182, 3,200,169,182, 3,
+ 0, 0, 0, 0,160,142,182, 3, 8,155,182, 3, 0, 0, 0, 0,104,178,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 24,141,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,153,182, 3,
+ 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,164,182, 3, 3, 0, 0, 0, 5, 0, 0, 0,
+ 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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,224,140,182, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 24,141,182, 3, 58, 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,160,142,182, 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, 68, 65, 84, 65,176, 10, 0, 0,160,142,182, 3, 58, 0, 0, 0,114, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,
+ 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192, 1,192, 1,192,
+129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,
+ 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+172,163,138,184,181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,
+ 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+201, 28,215, 63,172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,
+ 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,
+ 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,
+148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,
+ 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,
+244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,114, 59, 60, 65,
+127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,
+192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,
+ 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,255, 63, 1,192,
+129, 90,255, 0, 0, 0, 0, 0,182,115, 6,193,128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,
+ 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,129, 90,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,
+199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,
+147, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,
+199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,
+ 18, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,
+199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,
+246, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,
+199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,
+129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,
+ 72, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+ 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,
+ 14, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+ 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,
+135, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,
+ 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,
+127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64,
+247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+150, 30,215, 64,151,115, 6, 65,244, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,
+239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,127,165,127,165,
+ 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63,
+244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,
+ 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,
+242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,255, 63, 1,192,
+129, 90,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64,
+245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+127,212,140,184,242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64,
+245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 37, 33,215,191,175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65,
+245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,
+ 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65,
+247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64, 0, 0, 0, 0,
+255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,
+223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191,
+245, 35,190, 64, 0, 0, 42,221, 41,123,255, 0, 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191, 74, 36,190,192, 0, 0, 42,221,
+215,132,255, 0, 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,128,153,182, 3, 58, 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, 8,155,182, 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, 68, 65, 84, 65, 0, 9, 0, 0, 8,155,182, 3, 55, 0, 0, 0,
+192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0,
+ 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0,
+ 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0,
+ 18, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 23, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 25, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 34, 0, 23, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0,
+ 23, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0,
+ 28, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 34, 0, 27, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0,
+ 30, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0,
+ 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 34, 0, 2, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0,
+ 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 34, 0, 30, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 42, 0, 0, 0, 0, 0, 34, 0,
+ 13, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 34, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0,
+ 46, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0,
+ 0, 0, 34, 0, 48, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 51, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 34, 0, 51, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,
+ 51, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0,
+ 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0,
+ 58, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,
+ 70, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 69, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0,
+ 71, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0,
+ 33, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 50, 0, 0, 0,
+ 0, 0, 34, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0,
+ 71, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 76, 0, 0, 0,
+ 0, 0, 34, 0, 15, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0,
+ 73, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 34, 0, 81, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+105, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,
+ 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0, 86, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0,
+ 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 34, 0, 91, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,
+ 91, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+ 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 34, 0, 95, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,
+100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0,
+ 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,
+102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,
+104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,
+111, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,
+106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0,
+ 84, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+ 31, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 90, 0, 0, 0,
+ 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0, 56,164,182, 3, 58, 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, 86, 84,101,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, 3,162, 94, 32, 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, 0, 85, 86, 84,101,
-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, 3,162, 98, 32,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,165,182, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,
+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,200,169,182, 3,
+ 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,
- 3,162,108, 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, 68, 65, 84, 65, 0, 0, 3,212, 3,162, 94, 32, 0, 0, 0, 54, 0, 0, 0, 49,
- 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 3,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7,
- 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0, 0,
- 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14,
- 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75,
- 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 25,
- 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 24,
- 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 58,
- 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0, 28,
- 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91,
- 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0,
- 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47,
- 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 57,
- 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 51,
- 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 84,
- 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0,
- 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0, 57,
- 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70,
- 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0, 77,
- 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 94,
- 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0, 0,
- 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0, 89,
- 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103,
- 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0, 84,
- 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 86,
- 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0,
- 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,108, 3,162, 98, 32,
- 0, 0, 0, 65, 0, 0, 0, 49, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0,
- 62, 82, 95, 26, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,190, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,160, 63, 3, 29, 0,189,188,106,128, 62,186, 20,176, 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14, 62,186, 21, 0,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,127, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,122,
- 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111,
- 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185,
- 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188, 63, 41, 47,120,
- 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 63, 41, 47,116, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122,
- 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84, 61,189,169,104,176, 63, 0,188,185, 61,135, 44, 96, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24,
- 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174,
- 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185, 61,135, 44, 96, 63, 38,207,248,189,169,109,144, 63, 76,226,112, 61,135, 38, 64,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244,240, 62, 91,221, 4, 63,140,131,180, 62,186, 19,116, 63,114,244, 42,
- 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,189,188,105,128,
- 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200,
- 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102,
- 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 63, 38,207, 56,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102,
- 63, 76,225,174, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76,
- 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44,
- 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44,
- 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,131,172, 22,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96,
- 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,176,
- 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85,
- 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,226, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,142, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96,
- 63,158,151,227, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63,131,172, 24,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96,
- 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,225,
- 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,146, 59, 93,211, 96, 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96,
- 63, 81,128,149, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 16, 3,162,108, 32,
- 0, 0, 0, 59, 0, 0, 0,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+104,178,182, 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, 68, 65, 84, 65,212, 3, 0, 0,192,165,182, 3, 54, 0, 0, 0, 49, 0, 0, 0,
+ 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+ 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0,
+ 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+ 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0,
+ 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0,
+ 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 25, 0, 0, 0,
+ 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 24, 0, 0, 0,
+ 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+ 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,
+ 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0,
+ 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0,
+ 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0,
+ 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 84, 0, 0, 0,
+ 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0,
+ 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0,
+ 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0,
+ 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0,
+ 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,
+100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0,
+ 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,
+102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0, 84, 0, 0, 0,
+ 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 86, 0, 0, 0,
+ 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,
+ 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,108, 8, 0, 0,200,169,182, 3,
+ 65, 0, 0, 0, 49, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63,
+ 26, 95, 82, 62,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,
+102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,190,188, 0, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+160, 84,104, 61, 0, 29, 3, 63,128,106,188,189,176, 20,186, 62,144, 82,104, 61,128,223, 91, 62, 14, 95, 82, 62, 0, 21,186, 62,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,127, 84,181, 62,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,122, 84,181, 62,
+248, 28, 3, 63,188,188, 0, 63,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,
+190,188, 0, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,122, 84,181, 62,248, 28, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63,
+ 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,236, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63,
+ 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63,116, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+ 32,224, 91, 62,138, 94, 82, 62, 48, 43,135, 61, 61, 84,181, 62,176,104,169,189,185,188, 0, 63, 96, 44,135, 61, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,
+174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,
+116, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 51,207, 38, 63, 24,224, 91, 62,185,188, 0, 63, 96, 44,135, 61,248,207, 38, 63,144,109,169,189,112,226, 76, 63, 64, 38,135, 61,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,240,244,114, 63, 4,221, 91, 62,180,131,140, 63,116, 19,186, 62, 42,244,114, 63,
+244, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,
+ 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,
+128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,
+102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,
+113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,
+200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,
+120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,
+244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63, 96,105,188,189,120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63,
+ 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63, 56,207, 38, 63,
+111,179,141, 63, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,
+188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,
+174,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,190,188, 0, 63,171,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,
+161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,
+236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,
+236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 22,172,131, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,
+248,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,176,131,185, 63,
+ 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62,
+ 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+226,151,158, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,142,128, 81, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,247,168, 27, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,
+227,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 24,172,131, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,251,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59,
+ 86,162,203, 62, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,225,151,158, 63,
+ 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,146,128, 81, 63, 96,211, 93, 59,250,168, 27, 63, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,
+149,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 3, 0, 0,104,178,182, 3,
+ 59, 0, 0, 0,196, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24,
- 8,194,125,176, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,136, 96, 8,194,119,192, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108,
- 97,110,101, 46, 48, 48, 50, 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, 8,194,126,240, 8,194,133, 80, 8,194,134, 32,
- 0, 0, 0, 0, 3,162,112, 32, 8,194,130, 32, 0, 0, 0, 0, 8,194,135,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,127, 32, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,128,160, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,131,208, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 4, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,126,240, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,127, 32, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,
+168,181,182, 3, 52, 0, 0, 0, 1, 0, 0, 0,216,194,182, 3,152,139,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108,
+ 97,110,101, 46, 48, 48, 50, 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,240,182,182, 3,200,191,182, 3,152,192,182, 3,
+ 0, 0, 0, 0,176,184,182, 3,144,188,182, 3, 0, 0, 0, 0, 40,194,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 40,183,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,187,182, 3,
+ 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,190,182, 3, 3, 0, 0, 0, 5, 0, 0, 0,
+ 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 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, 4,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,240,182,182, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 40,183,182, 3, 58, 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, 3,162,112, 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,176,184,182, 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,
@@ -8237,27 +8532,27 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,162,112, 32, 0, 0, 0, 58, 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,
-190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
-191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,
-179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
-190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,
- 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
-191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,
-191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
- 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0,
- 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
- 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,
- 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1,
- 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,128,160, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 2, 0, 0,176,184,182, 3, 58, 0, 0, 0, 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,
+208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,
+ 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,
+197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,
+212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,
+214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,
+ 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128,
+ 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 8,187,182, 3, 58, 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, 8,194,130, 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,144,188,182, 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,
@@ -8266,65 +8561,65 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 1,128, 8,194,130, 32, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2,
- 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35,
- 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12,
- 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7,
- 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8,
- 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35,
- 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12,
- 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17,
- 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22,
- 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,131,208, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,144,188,182, 3, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0,
+ 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
+ 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0,
+ 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 64,190,182, 3, 58, 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, 8,194,133, 80, 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,200,191,182, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,134, 32, 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,152,192,182, 3, 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, 8,194,135,176, 0, 0, 0, 0,
+ 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,194,182, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,194,133, 80, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2,
- 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18,
- 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20,
- 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96,
- 8,194,134, 32, 0, 0, 0, 65, 0, 0, 0, 8, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162, 62,137,192, 18, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154,
- 63,125,226,162, 63, 17, 5, 34, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152,
- 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,194,135,176, 0, 0, 0, 59, 0, 0, 0, 32,
+ 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,191,182, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2,
+ 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0,
+ 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0,
+152,192,182, 3, 65, 0, 0, 0, 8, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 0,229,213, 62,162,226,125, 63, 18,192,137, 62,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,
+162,226,125, 63, 34, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,
+162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 40,194,182, 3, 59, 0, 0, 0, 32, 0, 0, 0,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 0, 0, 77, 69, 0, 0, 1, 24, 8,194,136, 96, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,147, 16, 8,194,125,176, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 51, 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, 8,194,137,160,
- 8,194,144, 0, 8,194,144,208, 0, 0, 0, 0, 3,162,116, 32, 8,194,140,208, 0, 0, 0, 0, 8,194,146, 96, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,194,137,208, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,139, 80, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,142,128, 0, 0, 0, 3,
- 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,137,160, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,137,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 0, 0, 24, 1, 0, 0,216,194,182, 3, 52, 0, 0, 0, 1, 0, 0, 0, 8,208,182, 3,168,181,182, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 51, 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, 32,196,182, 3,
+248,204,182, 3,200,205,182, 3, 0, 0, 0, 0,224,197,182, 3,192,201,182, 3, 0, 0, 0, 0, 88,207,182, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,196,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 56,200,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,203,182, 3,
+ 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,
+214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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, 32,196,182, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 88,196,182, 3, 58, 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, 3,162,116, 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,224,197,182, 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,
@@ -8333,27 +8628,27 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,162,116, 32, 0, 0, 0, 58, 0, 0, 0, 23,
- 62,204,205, 47,180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,
-190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,
- 62,204,205, 47,180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,
- 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,
- 63, 76,205, 0, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,
-191, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,
-190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,
- 63, 76,204,210, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,
-191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,
-180,144, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,
-182, 70, 0, 0, 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,
-190,204,204,216, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1,
- 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,139, 80, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 2, 0, 0,224,197,182, 3, 58, 0, 0, 0, 23, 0, 0, 0,
+ 47,205,204, 62, 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,
+208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0,
+ 47,205,204, 62, 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,
+213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0,205, 76, 63, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,
+214,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0,
+ 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,
+210,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0,
+ 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,
+ 0, 0,144,180, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 70,182, 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,
+216,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128,
+ 0, 0, 0, 0, 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 56,200,182, 3, 58, 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, 8,194,140,208,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,201,182, 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,
@@ -8362,66 +8657,66 @@ char datatoc_preview_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, 0, 0, 1,128, 8,194,140,208, 0, 0, 0, 55,
- 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5,
- 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10,
- 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20,
- 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,142,128, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,192,201,182, 3, 55, 0, 0, 0,
+ 32, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 34, 0, 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 11, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0,
+ 19, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,112,203,182, 3, 58, 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, 8,194,144, 0, 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, 0, 85, 86, 84,101,
-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, 8,194,144,208,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,204,182, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,
+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,200,205,182, 3,
+ 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,
- 8,194,146, 96, 0, 0, 0, 0, 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,207,182, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,194,144, 0, 0, 0, 0, 54, 0, 0, 0, 8,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6,
- 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15,
- 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19,
- 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 96, 8,194,144,208, 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162,
- 62,213,229, 0, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,137,192, 18, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12,
- 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,194,146, 96,
- 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248,204,182, 3, 54, 0, 0, 0, 8, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0,
+ 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 96, 1, 0, 0,200,205,182, 3, 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63,
+ 0,229,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 18,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,
+162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 88,207,182, 3,
+ 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,147, 16, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,154,144,
- 8,194,136, 96, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 52, 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, 8,194,148, 80, 8,194,153,240, 8,194,154, 48, 0, 0, 0, 0, 8,194,150, 0, 8,194,152, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,148,128, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,194,150,144, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,194,152,112, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0, 52, 64, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 2, 63,128, 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, 4,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,148, 80,
- 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 94, 32, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,148,128, 0, 0, 1, 42, 0, 0, 0, 5,
+255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 8,208,182, 3, 52, 0, 0, 0, 1, 0, 0, 0,184,215,182, 3,
+216,194,182, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 52, 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, 80,209,182, 3, 16,215,182, 3, 88,215,182, 3, 0, 0, 0, 0, 16,211,182, 3, 40,213,182, 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,136,209,182, 3, 1, 0, 0, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,211,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,136,213,182, 3, 2, 0, 0, 0, 5, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128,179, 0, 0, 64, 52, 0, 0, 0, 0,
+ 0, 0,128, 63, 2, 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, 4, 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, 80,209,182, 3,
+ 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 68, 65, 84, 65, 84, 1, 0, 0,136,209,182, 3, 58, 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,
- 8,194,150, 0, 0, 0, 0, 0, 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,211,182, 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,
@@ -8429,13 +8724,13 @@ char datatoc_preview_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, 0, 0, 96, 8,194,150, 0,
- 0, 0, 0, 58, 0, 0, 0, 4, 63,128, 0, 0, 63,127,255,255, 0, 0, 0, 0, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0,
- 63,128, 0, 0,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0,191,128, 0, 1,191,127,255,253,
- 0, 0, 0, 0, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0,191,127,255,250, 63,128, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
-127,255, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,150,144, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 96, 0, 0, 0, 16,211,182, 3,
+ 58, 0, 0, 0, 4, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 1, 0,128,191,253,255,127,191,
+ 0, 0, 0, 0, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0,250,255,127,191, 3, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+255,127,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,160,211,182, 3, 58, 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, 8,194,152, 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, 40,213,182, 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,
@@ -8444,1461 +8739,1461 @@ char datatoc_preview_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, 0, 0, 0, 48, 8,194,152, 16, 0, 0, 0, 55,
- 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,152,112,
- 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 48, 0, 0, 0, 40,213,182, 3, 55, 0, 0, 0,
+ 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,136,213,182, 3,
+ 58, 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, 86, 84,101,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, 8,194,153,240, 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, 16,215,182, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,154, 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, 88,215,182, 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, 68, 65, 84, 65,
- 0, 0, 0, 20, 8,194,153,240, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1,
- 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 0, 44, 8,194,154, 48, 0, 0, 0, 65, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,154,144, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,160,128, 8,194,147, 16,
+ 20, 0, 0, 0, 16,215,182, 3, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 2, 68, 65, 84, 65, 44, 0, 0, 0, 88,215,182, 3, 65, 0, 0, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 77, 69, 0, 0, 24, 1, 0, 0,184,215,182, 3, 52, 0, 0, 0, 1, 0, 0, 0,224, 2,183, 3, 8,208,182, 3,
0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 53, 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,
- 8,194,155,208, 3,162,142, 32, 3,162,148, 32, 0, 0, 0, 0, 3,162,120, 32, 3,162,132, 32, 0, 0, 0, 0, 3,162,158, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,156, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,157,128, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,159, 0,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140,
- 63,127,255,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,155,208, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,156, 0, 0, 0, 1, 42, 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, 3,162,120, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,224, 3,162,120, 32, 0, 0, 0, 58,
- 0, 0, 0,116, 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175,
- 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194,
- 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13,
- 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,140,212,127, 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44,
- 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222,
- 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36,
- 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 64,190, 35,238,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240,
- 64, 87, 32, 2, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151, 64,190, 35,244,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193,
- 64, 87, 30, 62, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127,
- 64,161, 86,217,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 56, 53,234, 98,
-191,215, 33, 38,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,100, 43,135,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43,
- 64,215, 31,117,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 63,152, 29, 14,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43,
- 64,215, 31,117, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,190, 36, 72,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64,161, 86,177,
- 65, 33, 87,146, 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110, 64,100, 43,129,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177,
- 65, 33, 87,146, 63,152, 28,234,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 63,152, 28,246,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177,
- 65, 33, 87,146,191,152, 29, 30,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,191,152, 29, 18,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177,
- 65, 33, 87,146,192,100, 43,153,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,100, 43,147,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170,
- 64,161, 87,190,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33,222, 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,193, 6,115,183,
- 64,215, 31,127,192,100, 43,154, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,191,152, 29, 32,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,182, 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183,
- 64,215, 31,127,192,190, 36, 78, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5, 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,191, 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121,
- 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173,
- 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226,
- 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208,
- 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243,
- 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,157,128, 0, 0, 1, 42, 0, 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, 3,162,132, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 9, 72, 3,162,132, 32, 0, 0, 0, 55, 0, 0, 0,198,
- 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 84,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34,
- 0, 0, 0, 27, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7,
- 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11,
- 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13,
- 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 34,
- 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 13,
- 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 26, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 27,
- 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 14,
- 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 31, 0, 0, 0, 34,
- 0, 0, 0, 40, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 39, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0,100,
- 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 41, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 36,
- 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34,
- 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,101,
- 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 60,
- 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 34,
- 0, 0, 0, 50, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,115,
- 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51,
- 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34,
- 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45,
- 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 46,
- 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34,
- 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 54,
- 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55,
- 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34,
- 0, 0, 0, 57, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64,
- 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 62,
- 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 34,
- 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68,
- 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 62,
- 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 65, 0, 0, 0, 34,
- 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 53,
- 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 42,
- 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,106, 0, 0, 0, 34,
- 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 97,
- 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 76,
- 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 34,
- 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 77,
- 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 79,
- 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34,
- 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 83,
- 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 34,
- 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 93,
- 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 91,
- 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34,
- 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97,
- 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 91,
- 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 94, 0, 0, 0, 34,
- 0, 0, 0, 81, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100,
- 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34,
- 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102,
- 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104,
- 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34,
- 0, 0, 0,103, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106,
- 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,108,
- 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,111, 0, 0, 0, 34,
- 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115,
- 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,110,
- 0, 0, 0,111, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,159, 0, 0, 0, 1, 42, 0, 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, 3,162,142, 32,
- 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, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,217,182, 3, 88,242,182, 3,136,246,182, 3, 0, 0, 0, 0,192,218,182, 3, 88,231,182, 3, 0, 0, 0, 0,128,255,182, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,217,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,208,229,182, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+208,240,182, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0,
+ 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,
+140, 0,128, 63,214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 0,217,182, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 56,217,182, 3, 58, 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,192,218,182, 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, 68, 65, 84, 65,224, 10, 0, 0,192,218,182, 3, 58, 0, 0, 0,
+116, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,
+144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,
+179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,
+244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,
+113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,
+239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191,
+ 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,183,115, 6,193,127, 31,215, 64,238, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192,
+ 2, 32, 87, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,244, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64,
+ 62, 30, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,
+217, 86,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 98,234, 53, 56,
+ 38, 33,215,191, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,135, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,
+117, 31,215, 64, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 14, 29,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,
+117, 31,215, 64,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 72, 36,190,192,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,177, 86,161, 64,
+146, 87, 33, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,129, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,
+146, 87, 33, 65,234, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,246, 28,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,
+146, 87, 33, 65, 30, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 18, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,
+146, 87, 33, 65,153, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,147, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,
+190, 87,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,222, 33,215,191,183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,183,115, 6,193,
+127, 31,215, 64,154, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 32, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,182,115, 6,193,128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,
+127, 31,215, 64, 78, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,
+181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,
+170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,
+179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,172,163,138,184,181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,
+146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,
+112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,208,229,182, 3, 58, 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,231,182, 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, 68, 65, 84, 65, 72, 9, 0, 0, 88,231,182, 3, 55, 0, 0, 0,198, 0, 0, 0,
+ 21, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 84, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 53, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0,
+ 27, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0,
+ 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0,
+ 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,
+ 24, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 27, 0, 0, 0,
+ 0, 0, 34, 0, 1, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,
+ 29, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0,
+ 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 34, 0, 23, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0,
+ 40, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0,100, 0, 0, 0,
+ 0, 0, 34, 0, 37, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0,
+ 50, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0,
+ 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 34, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0,
+ 86, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0,
+ 50, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,115, 0, 0, 0,
+ 0, 0, 34, 0, 52, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,
+114, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0,
+ 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 34, 0, 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0,
+ 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 54, 0, 0, 0,
+ 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0,
+ 57, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 34, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0,
+ 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 63, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0,
+ 66, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0,
+ 52, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 34, 0, 46, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0,
+ 65, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,
+ 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 34, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0,
+ 85, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0,
+ 73, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 77, 0, 0, 0,
+ 0, 0, 34, 0, 81, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,
+112, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0,
+ 84, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 34, 0, 85, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+ 88, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0,
+ 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 93, 0, 0, 0,
+ 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0,
+ 86, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 34, 0, 92, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,
+ 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,
+ 81, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 34, 0, 78, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0,
+ 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0,
+ 0, 0, 34, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,
+105, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,
+103, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0,
+ 0, 0, 34, 0,109, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,
+112, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,
+106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0,
+ 0, 0, 34, 0,112, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,
+111, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,208,240,182, 3, 58, 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, 88,242,182, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 3,162,148, 32, 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,
+136,246,182, 3, 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, 3,162,158, 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, 68, 65, 84, 65, 0, 0, 3,252, 3,162,142, 32, 0, 0, 0, 54,
- 0, 0, 0, 51, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19,
- 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7,
- 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11,
- 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0,
- 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29,
- 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45,
- 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44,
- 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1,
- 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0,
- 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58,
- 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65,
- 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22,
- 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0,
- 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89,
- 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89,
- 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91,
- 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93,
- 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0,
- 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80,
- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37,
- 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38,
- 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104,
- 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0,
- 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103,
- 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113,
- 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107,
- 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80,
- 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 8,196, 3,162,148, 32, 0, 0, 0, 65, 0, 0, 0, 51, 63, 27,168,250, 59, 93,211, 96, 62,203,162, 84,
- 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,131,172, 21, 59, 93,211, 96, 63, 81,128,146, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,185,131,174,
- 59, 93,211, 96, 63,158,151,225, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,149, 59, 93,211, 96,
- 63, 27,168,251, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,246, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96,
- 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 24,
- 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 63,185,131,176, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,226, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 86,
- 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96,
- 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,224,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99,
- 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52,
- 63,141,179,111, 63, 76,225,174, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44,
- 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,
- 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102,
- 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
-189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244, 61,104, 84,200,
- 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171,
- 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128,
- 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242,
- 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,
-190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131,180,
- 62,186, 19,116, 63,159,140,244, 63, 3, 28, 50, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,226,112, 61,135, 38, 64,
- 63,114,244,240, 62, 91,221, 4, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 61,135, 44, 96, 62,181, 84, 61,
-189,169,104,176, 63, 0,189, 93,190,109, 1, 80, 63, 38,207,248,189,169,109,144, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,225,174, 63, 41, 47,116, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 62,186, 21, 0, 63,114,244, 42, 63, 3, 28,244,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185,
- 61,135, 44, 96, 63, 38,207, 51, 62, 91,224, 24, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102,
- 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,188, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 52,
- 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 14, 62,186, 21, 0, 61,104, 82,144, 62, 91,223,128,
- 62, 82, 94,138, 61,135, 43, 48, 62,181, 84,122, 62, 91,224, 32, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190,
- 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 79, 65,236, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 14, 62,186, 21, 0,
- 62,181, 84,122, 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 56,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,127, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,189,188,106,128,
- 62,186, 20,176, 61,104, 84,160, 63, 3, 29, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 48,
- 3,162,158, 32, 0, 0, 0, 59, 0, 0, 0,204,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,194,160,128, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,166,112, 8,194,154,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 48, 54, 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, 8,194,161,192, 3,162,184, 32,
- 3,162,188, 32, 0, 0, 0, 0, 3,162,162, 32, 3,162,174, 32, 0, 0, 0, 0, 3,162,198, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,161,240, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,163,112,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,164,240, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,161,192, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,161,240, 0, 0, 1, 42, 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, 3,162,162, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,176, 3,162,162, 32, 0, 0, 0, 58, 0, 0, 0,114, 63,215, 28,223,
- 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6,
- 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37,
- 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127,
- 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191,
- 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,191, 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5,
- 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,182, 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183,
- 64,215, 31,127,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240,
- 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112,192,100, 43,147,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112,191,152, 29, 18,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112, 63,152, 28,246,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225,
- 65, 60, 59,110, 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,190, 36, 72,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,192,190, 36, 72,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151, 63,152, 29, 14,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,192,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127,
- 64,161, 86,217,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193,
- 64, 87, 30, 62, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102,
- 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244,
- 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220,
- 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,140,212,127, 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201,
- 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172,
- 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18,
- 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 60,152, 10,
-191,215, 33, 16, 64,190, 35,245, 0, 0,221, 42,123, 41, 2,255, 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16,192,190, 36, 74,
- 0, 0,221, 42,132,215, 2,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,163,112, 0, 0, 1, 42, 0, 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,
- 3,162,174, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 9, 0, 3,162,174, 32,
- 0, 0, 0, 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22,
- 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 33,
- 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 27,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 26, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 32,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 36,
- 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 44,
- 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 39, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 42,
- 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 70, 0, 0, 0, 34,
- 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 48,
- 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 34,
- 0, 0, 0, 47, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 52,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 55, 0, 0, 0, 34,
- 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34,
- 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 34,
- 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 72,
- 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 34,
- 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64,
- 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 25,
- 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74,
- 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 14,
- 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 74, 0, 0, 0, 34,
- 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 78,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34,
- 0, 0, 0, 84, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87,
- 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 92,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,109, 0, 0, 0, 34,
- 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,101,
- 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 95,
- 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34,
- 0, 0, 0, 94, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99,
- 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34,
- 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34,
- 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0,111, 0, 0, 0, 34,
- 0, 0, 0, 60, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 93,
- 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 33,
- 0, 0, 0, 90, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,164,240, 0, 0, 1, 42, 0, 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, 3,162,184, 32,
- 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, 0,
+ 0, 0, 0, 0,128,255,182, 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, 68, 65, 84, 65,252, 3, 0, 0, 88,242,182, 3, 54, 0, 0, 0,
+ 51, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0,
+ 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0,
+ 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0,
+ 44, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0,
+ 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0,
+ 53, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0,
+ 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 64, 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0,
+ 0, 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0,
+ 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,
+ 27, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0,
+ 88, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0,
+ 75, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,
+ 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,
+ 97, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0,
+ 79, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0,
+ 36, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0,
+ 0, 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,
+100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,
+ 51, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,
+104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,
+112, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,
+111, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,196, 8, 0, 0,136,246,182, 3, 65, 0, 0, 0, 51, 0, 0, 0,250,168, 27, 63, 96,211, 93, 59, 84,162,203, 62,
+ 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 21,172,131, 63, 96,211, 93, 59,146,128, 81, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,227,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,174,131,185, 63,
+ 96,211, 93, 59,225,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,149,128, 81, 63, 96,211, 93, 59,
+251,168, 27, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,227,151,158, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59,226,151,158, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,246,168, 27, 63, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,
+ 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 24,172,131, 63,
+ 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+176,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63,
+ 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+226,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 86,162,203, 62,
+ 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,
+144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,224,151,158, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63,
+ 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 72, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,
+111,179,141, 63,174,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,
+188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,
+236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63,
+ 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63,
+ 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,
+102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,
+242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,
+122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,200, 84,104, 61,242, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,
+120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63,
+ 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,
+113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63,
+ 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,180,131,140, 63,
+116, 19,186, 62,244,140,159, 63, 50, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,112,226, 76, 63, 64, 38,135, 61,
+240,244,114, 63, 4,221, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63, 96, 44,135, 61, 61, 84,181, 62,
+176,104,169,189, 93,189, 0, 63, 80, 1,109,190,248,207, 38, 63,144,109,169,189, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+174,225, 76, 63,116, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 42,244,114, 63,244, 28, 3, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63,
+ 96, 44,135, 61, 51,207, 38, 63, 24,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63,
+ 52,207, 38, 63,236, 65, 79, 63,174,225, 76, 63,116, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,188,188, 0, 63,120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 52,207, 38, 63,
+248, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 14, 95, 82, 62, 0, 21,186, 62,144, 82,104, 61,128,223, 91, 62,
+138, 94, 82, 62, 48, 43,135, 61,122, 84,181, 62, 32,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,
+102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,
+122, 84,181, 62,248, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63, 56,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,127, 84,181, 62,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,128,106,188,189,
+176, 20,186, 62,160, 84,104, 61, 0, 29, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 3, 0, 0,
+128,255,182, 3, 59, 0, 0, 0,204, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0,224, 2,183, 3, 52, 0, 0, 0, 1, 0, 0, 0,240, 44,183, 3,184,215,182, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 48, 54, 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, 40, 4,183, 3, 8, 29,183, 3,
+ 16, 33,183, 3, 0, 0, 0, 0,232, 5,183, 3, 80, 18,183, 3, 0, 0, 0, 0,176, 41,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96, 4,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200, 16,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 27,183, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 40, 4,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 96, 4,183, 3, 58, 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,232, 5,183, 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, 68, 65, 84, 65,176, 10, 0, 0,232, 5,183, 3, 58, 0, 0, 0,114, 0, 0, 0,223, 28,215, 63,
+ 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,
+182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,172,163,138,184,181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,
+175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,
+242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,
+107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,
+114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,182,115, 6,193,128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,
+127, 31,215, 64, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192,
+ 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,147, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65, 18, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,246, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,
+110, 59, 60, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65, 14, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,135, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,
+217, 86,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64,
+ 62, 30, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,244, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192,
+ 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,
+240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,
+172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,
+181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,
+147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 10,152, 60, 56,
+ 16, 33,215,191,245, 35,190, 64, 0, 0, 42,221, 41,123,255, 0, 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191, 74, 36,190,192,
+ 0, 0, 42,221,215,132,255, 0, 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,200, 16,183, 3, 58, 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,
+ 80, 18,183, 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, 68, 65, 84, 65, 0, 9, 0, 0, 80, 18,183, 3,
+ 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 34, 0, 25, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 34, 0, 28, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 26, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0,
+ 45, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0,
+ 22, 0, 0, 0, 40, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 42, 0, 0, 0,
+ 0, 0, 34, 0, 13, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 45, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0,
+ 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 46, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0,
+ 47, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 50, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0,
+ 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0,
+ 0, 0, 34, 0, 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0,
+ 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0,
+ 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 69, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 34, 0, 33, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0,
+ 50, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0,
+ 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 74, 0, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,
+ 76, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 73, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,
+ 83, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0,
+ 84, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,
+ 88, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0,
+ 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,
+ 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 94, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,
+100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0,
+ 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,
+109, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+ 83, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,
+ 60, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 93, 0, 0, 0,
+ 0, 0, 34, 0, 31, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0,
+ 90, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,128, 27,183, 3, 58, 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, 8, 29,183, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 3,162,188, 32, 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,
+ 16, 33,183, 3, 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, 3,162,198, 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, 68, 65, 84, 65, 0, 0, 3,212, 3,162,184, 32, 0, 0, 0, 54,
- 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6,
- 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10,
- 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0,
- 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36,
- 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50,
- 0, 0, 0, 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28,
- 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0,
- 0, 0, 0, 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27,
- 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90,
- 0, 0, 0, 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31,
- 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0,
- 0, 0, 0, 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0,
- 0, 0, 0, 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50,
- 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110,
- 0, 0, 0, 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59,
- 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61,
- 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0,
- 0, 0, 0, 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64,
- 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95,
- 0, 0, 0, 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83,
- 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88,
- 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0,
- 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105,
- 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106,
- 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109,
- 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,108,
- 3,162,188, 32, 0, 0, 0, 65, 0, 0, 0, 49, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 3, 29, 0, 62, 82, 95, 26, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,190, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,160, 63, 3, 29, 0,189,188,106,128, 62,186, 20,176, 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14,
- 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,127, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120,
- 62,181, 84,122, 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56,
- 63,141,179,111, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32,
- 63, 0,188,185, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188,
- 63, 41, 47,120, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 63, 41, 47,116, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,122, 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84, 61,189,169,104,176, 63, 0,188,185, 61,135, 44, 96,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51,
- 62, 91,224, 24, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236,
- 63, 76,225,174, 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185, 61,135, 44, 96, 63, 38,207,248,189,169,109,144, 63, 76,226,112,
- 61,135, 38, 64, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244,240, 62, 91,221, 4, 63,140,131,180, 62,186, 19,116,
- 63,114,244, 42, 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122,
- 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120,
- 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64,
- 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173,
- 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174,
- 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161,
- 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,185,131,176, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96,
- 62,203,162, 85, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,142, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174,
- 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96,
- 63,131,172, 24, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84,
- 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,225, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,146, 59, 93,211, 96, 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251,
- 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 16,
- 3,162,198, 32, 0, 0, 0, 59, 0, 0, 0,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,194,166,112, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,172, 96, 8,194,160,128, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 48, 55, 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, 8,194,167,176, 3,162,224, 32,
- 3,162,228, 32, 0, 0, 0, 0, 3,162,202, 32, 3,162,214, 32, 0, 0, 0, 0, 3,162,238, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,167,224, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,169, 96,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,170,224, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,167,176, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,167,224, 0, 0, 1, 42, 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, 3,162,202, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,176, 3,162,202, 32, 0, 0, 0, 58, 0, 0, 0,114, 63,215, 28,223,
- 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6,
- 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37,
- 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127,
- 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191,
- 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192,161, 87,191, 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5,
- 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,182, 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183,
- 64,215, 31,127,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240,
- 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112,192,100, 43,147,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112,191,152, 29, 18,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112, 63,152, 28,246,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225,
- 65, 60, 59,110, 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,190, 36, 72,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,192,190, 36, 72,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151, 63,152, 29, 14,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,192,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127,
- 64,161, 86,217,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193,
- 64, 87, 30, 62, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102,
- 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244,
- 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220,
- 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,140,212,127, 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201,
- 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172,
- 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18,
- 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 60,152, 10,
-191,215, 33, 16, 64,190, 35,245, 0, 0,221, 42,123, 41, 2,255, 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16,192,190, 36, 74,
- 0, 0,221, 42,132,215, 2,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,169, 96, 0, 0, 1, 42, 0, 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,
- 3,162,214, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 9, 0, 3,162,214, 32,
- 0, 0, 0, 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22,
- 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 33,
- 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 27,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34,
- 0, 0, 0, 26, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 32,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 36,
- 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 44,
- 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 39, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 42,
- 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 70, 0, 0, 0, 34,
- 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 48,
- 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 34,
- 0, 0, 0, 47, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 52,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 55, 0, 0, 0, 34,
- 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55,
- 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34,
- 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60,
- 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 34,
- 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 72,
- 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 34,
- 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64,
- 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 25,
- 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74,
- 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 14,
- 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 74, 0, 0, 0, 34,
- 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 78,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34,
- 0, 0, 0, 84, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87,
- 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 92,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,109, 0, 0, 0, 34,
- 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,101,
- 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 95,
- 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34,
- 0, 0, 0, 94, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99,
- 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34,
- 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34,
- 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 66,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0,111, 0, 0, 0, 34,
- 0, 0, 0, 60, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 93,
- 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 33,
- 0, 0, 0, 90, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,170,224, 0, 0, 1, 42, 0, 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, 3,162,224, 32,
- 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, 0,
+ 0, 0, 0, 0,176, 41,183, 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, 68, 65, 84, 65,212, 3, 0, 0, 8, 29,183, 3, 54, 0, 0, 0,
+ 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0,
+ 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0,
+ 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0,
+ 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0,
+ 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
+ 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0,
+ 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0,
+ 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
+ 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,
+ 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0,
+ 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,
+ 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0,
+ 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0,
+ 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0,
+ 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0,
+ 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0,
+ 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,
+103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,
+ 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0,
+ 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0,
+ 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,108, 8, 0, 0,
+ 16, 33,183, 3, 65, 0, 0, 0, 49, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+ 0, 29, 3, 63, 26, 95, 82, 62,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,
+ 26, 95, 82, 62,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,190,188, 0, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,160, 84,104, 61, 0, 29, 3, 63,128,106,188,189,176, 20,186, 62,144, 82,104, 61,128,223, 91, 62, 14, 95, 82, 62,
+ 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,127, 84,181, 62,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,
+122, 84,181, 62,248, 28, 3, 63,188,188, 0, 63,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,
+111,179,141, 63,190,188, 0, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,248, 28, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,
+185,188, 0, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,236, 65, 79, 63,188,188, 0, 63,
+120, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63,116, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62, 32,224, 91, 62,138, 94, 82, 62, 48, 43,135, 61, 61, 84,181, 62,176,104,169,189,185,188, 0, 63, 96, 44,135, 61,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 51,207, 38, 63,
+ 24,224, 91, 62,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,
+174,225, 76, 63,116, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 51,207, 38, 63, 24,224, 91, 62,185,188, 0, 63, 96, 44,135, 61,248,207, 38, 63,144,109,169,189,112,226, 76, 63,
+ 64, 38,135, 61, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,240,244,114, 63, 4,221, 91, 62,180,131,140, 63,116, 19,186, 62,
+ 42,244,114, 63,244, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,
+160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,
+113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,
+216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,
+ 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,
+128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,
+102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+200, 84,104, 61,244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63, 96,105,188,189,120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,
+ 56,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,
+172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,
+102, 84,117, 63,174,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 52,207, 38, 63,111,179,141, 63,190,188, 0, 63,171,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63,
+ 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,
+210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63,
+ 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+176,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59,
+ 85,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,226,151,158, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,142,128, 81, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,
+247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63,
+ 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59,
+ 24,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,251,168, 27, 63, 96,211, 93, 59, 84,162,203, 62,
+ 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+225,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,146,128, 81, 63, 96,211, 93, 59,250,168, 27, 63, 96,211, 93, 59,251,168, 27, 63,
+ 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 3, 0, 0,
+176, 41,183, 3, 59, 0, 0, 0,196, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0,240, 44,183, 3, 52, 0, 0, 0, 1, 0, 0, 0, 0, 87,183, 3,224, 2,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 48, 55, 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, 56, 46,183, 3, 24, 71,183, 3,
+ 32, 75,183, 3, 0, 0, 0, 0,248, 47,183, 3, 96, 60,183, 3, 0, 0, 0, 0,192, 83,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,112, 46,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216, 58,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 69,183, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 56, 46,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,112, 46,183, 3, 58, 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,248, 47,183, 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, 68, 65, 84, 65,176, 10, 0, 0,248, 47,183, 3, 58, 0, 0, 0,114, 0, 0, 0,223, 28,215, 63,
+ 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,
+182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,172,163,138,184,181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,
+175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,
+242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,
+107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,
+114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,182,115, 6,193,128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,
+127, 31,215, 64, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192,
+ 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,147, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65, 18, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,246, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,
+110, 59, 60, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65, 14, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,135, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,
+217, 86,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64,
+ 62, 30, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,244, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192,
+ 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,
+240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,
+172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,
+181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,
+147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 10,152, 60, 56,
+ 16, 33,215,191,245, 35,190, 64, 0, 0, 42,221, 41,123,255, 0, 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191, 74, 36,190,192,
+ 0, 0, 42,221,215,132,255, 0, 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,216, 58,183, 3, 58, 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,
+ 96, 60,183, 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, 68, 65, 84, 65, 0, 9, 0, 0, 96, 60,183, 3,
+ 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 34, 0, 25, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 34, 0, 28, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 26, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0,
+ 45, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0,
+ 22, 0, 0, 0, 40, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 42, 0, 0, 0,
+ 0, 0, 34, 0, 13, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 45, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0,
+ 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 46, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0,
+ 47, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 50, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0,
+ 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0,
+ 0, 0, 34, 0, 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0,
+ 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0,
+ 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 69, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 34, 0, 33, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0,
+ 50, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0,
+ 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 74, 0, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,
+ 76, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 73, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,
+ 83, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0,
+ 84, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,
+ 88, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0,
+ 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,
+ 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 94, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,
+100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0,
+ 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,
+109, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+ 83, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,
+ 60, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 93, 0, 0, 0,
+ 0, 0, 34, 0, 31, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0,
+ 90, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,144, 69,183, 3, 58, 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, 24, 71,183, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 3,162,228, 32, 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,
+ 32, 75,183, 3, 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, 3,162,238, 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, 68, 65, 84, 65, 0, 0, 3,212, 3,162,224, 32, 0, 0, 0, 54,
- 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6,
- 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10,
- 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0,
- 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36,
- 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50,
- 0, 0, 0, 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28,
- 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0,
- 0, 0, 0, 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27,
- 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90,
- 0, 0, 0, 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31,
- 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0,
- 0, 0, 0, 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0,
- 0, 0, 0, 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50,
- 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110,
- 0, 0, 0, 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59,
- 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61,
- 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0,
- 0, 0, 0, 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64,
- 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95,
- 0, 0, 0, 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83,
- 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88,
- 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0,
- 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105,
- 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106,
- 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109,
- 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,108,
- 3,162,228, 32, 0, 0, 0, 65, 0, 0, 0, 49, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 3, 29, 0, 62, 82, 95, 26, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,190, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,160, 63, 3, 29, 0,189,188,106,128, 62,186, 20,176, 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14,
- 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,127, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120,
- 62,181, 84,122, 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56,
- 63,141,179,111, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32,
- 63, 0,188,185, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188,
- 63, 41, 47,120, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 63, 41, 47,116, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,122, 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84, 61,189,169,104,176, 63, 0,188,185, 61,135, 44, 96,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51,
- 62, 91,224, 24, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236,
- 63, 76,225,174, 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185, 61,135, 44, 96, 63, 38,207,248,189,169,109,144, 63, 76,226,112,
- 61,135, 38, 64, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244,240, 62, 91,221, 4, 63,140,131,180, 62,186, 19,116,
- 63,114,244, 42, 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122,
- 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120,
- 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64,
- 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160,
- 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173,
- 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174,
- 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161,
- 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,185,131,176, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96,
- 62,203,162, 85, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,142, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174,
- 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96,
- 63,131,172, 24, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84,
- 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,158,151,225, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,146, 59, 93,211, 96, 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251,
- 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 16,
- 3,162,238, 32, 0, 0, 0, 59, 0, 0, 0,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,194,172, 96, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,178, 80, 8,194,166,112, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 48, 56, 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, 8,194,173,160, 3,163, 8, 32,
- 3,163, 14, 32, 0, 0, 0, 0, 3,162,242, 32, 3,162,254, 32, 0, 0, 0, 0, 3,163, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,173,208, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,175, 80,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,176,208, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,173,160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,173,208, 0, 0, 1, 42, 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, 3,162,242, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,224, 3,162,242, 32, 0, 0, 0, 58, 0, 0, 0,116, 63,215, 28,223,
- 65, 87, 31, 77, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144, 64,190, 35,242,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6,
- 65, 6,115,182, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179, 64,190, 35,250,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,138,163,172, 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37,
- 64,215, 31,175, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244, 64,190, 35,250,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127,
- 64,161, 87,242, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113, 64,190, 35,250,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191,
- 64, 87, 32,107, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113, 64,190, 35,239, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 64,190, 35,238,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 64,190, 35,238, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102,
- 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4,
- 63,215, 29,150, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62, 64,190, 35,247,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146, 64,190, 35,242, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159,
- 64,215, 30,146,192,190, 36, 74, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,
-184, 41, 3,226,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,100, 43,135,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 63,152, 29, 14,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,190, 36, 72,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110, 64,100, 43,129,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 63,152, 28,246,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,191,152, 29, 18,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,100, 43,147,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33,222,
- 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,182,
- 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,190, 36, 78,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147,192,190, 36, 74, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,190, 36, 72,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192, 87, 32, 5, 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,191,
- 65, 33, 87,148, 64,100, 43,133, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181, 64,100, 43,139,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147, 63,152, 29, 0, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 63,152, 29, 12,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147,191,152, 29, 9, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,191,152, 28,253,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147,192,100, 43,142, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,100, 43,136,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220,
- 64,161, 87,240,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,140,212,127, 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201,
- 64,215, 31,172,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172,
- 65, 6,115,181,192,190, 36, 71, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18,
- 65, 33, 87,147,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,175, 80, 0, 0, 1, 42, 0, 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, 3,162,254, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 9, 72, 3,162,254, 32, 0, 0, 0, 55, 0, 0, 0,198, 0, 0, 0, 21, 0, 0, 0, 82,
- 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 18,
- 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 34,
- 0, 0, 0, 28, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 56,
- 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3,
- 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34,
- 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8,
- 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6,
- 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12,
- 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6,
- 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34,
- 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16,
- 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 34,
- 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 18,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 24, 0, 0, 0, 34,
- 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 28,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 29, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 23,
- 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 33, 0, 0, 0, 34,
- 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 98,
- 0, 0, 0, 34, 0, 0, 0, 39, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 37,
- 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 41, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 34,
- 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41,
- 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 68,
- 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 34,
- 0, 0, 0, 56, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,114,
- 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 52,
- 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,114, 0, 0, 0, 34,
- 0, 0, 0, 42, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43,
- 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 44,
- 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34,
- 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56,
- 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 56,
- 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34,
- 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 58,
- 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 63,
- 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 34,
- 0, 0, 0, 58, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 63,
- 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 34,
- 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 68,
- 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 46,
- 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0, 34,
- 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0,102,
- 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 74,
- 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 34,
- 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 77,
- 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 81,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,112, 0, 0, 0, 34,
- 0, 0, 0, 78, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 85,
- 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 85,
- 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 34,
- 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87,
- 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 92,
- 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 92, 0, 0, 0, 34,
- 0, 0, 0, 87, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 90,
- 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 92,
- 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 34,
- 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 97,
- 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 78,
- 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103,
- 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105,
- 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34,
- 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107,
- 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109,
- 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,112, 0, 0, 0, 34,
- 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107,
- 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0,112,
- 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,111, 0, 0, 0, 34,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,176,208, 0, 0, 1, 42, 0, 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, 3,163, 8, 32, 0, 0, 0, 5, 0, 0, 0, 20,
+ 0, 0, 0, 0,192, 83,183, 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, 68, 65, 84, 65,212, 3, 0, 0, 24, 71,183, 3, 54, 0, 0, 0,
+ 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0,
+ 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0,
+ 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0,
+ 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0,
+ 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
+ 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0,
+ 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0,
+ 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
+ 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,
+ 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0,
+ 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,
+ 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0,
+ 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0,
+ 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0,
+ 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0,
+ 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0,
+ 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,
+103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,
+ 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0,
+ 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0,
+ 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,108, 8, 0, 0,
+ 32, 75,183, 3, 65, 0, 0, 0, 49, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+ 0, 29, 3, 63, 26, 95, 82, 62,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,
+ 26, 95, 82, 62,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,190,188, 0, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,160, 84,104, 61, 0, 29, 3, 63,128,106,188,189,176, 20,186, 62,144, 82,104, 61,128,223, 91, 62, 14, 95, 82, 62,
+ 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,127, 84,181, 62,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,
+122, 84,181, 62,248, 28, 3, 63,188,188, 0, 63,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,
+111,179,141, 63,190,188, 0, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,248, 28, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,
+185,188, 0, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,236, 65, 79, 63,188,188, 0, 63,
+120, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63,116, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62, 32,224, 91, 62,138, 94, 82, 62, 48, 43,135, 61, 61, 84,181, 62,176,104,169,189,185,188, 0, 63, 96, 44,135, 61,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 51,207, 38, 63,
+ 24,224, 91, 62,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,
+174,225, 76, 63,116, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 51,207, 38, 63, 24,224, 91, 62,185,188, 0, 63, 96, 44,135, 61,248,207, 38, 63,144,109,169,189,112,226, 76, 63,
+ 64, 38,135, 61, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,240,244,114, 63, 4,221, 91, 62,180,131,140, 63,116, 19,186, 62,
+ 42,244,114, 63,244, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,
+160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,
+113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,
+216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,
+ 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,
+128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,
+102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+200, 84,104, 61,244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63, 96,105,188,189,120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,
+ 56,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,
+172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,
+102, 84,117, 63,174,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 52,207, 38, 63,111,179,141, 63,190,188, 0, 63,171,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63,
+ 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,
+210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63,
+ 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+176,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59,
+ 85,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,226,151,158, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,142,128, 81, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,
+247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63,
+ 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59,
+ 24,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,251,168, 27, 63, 96,211, 93, 59, 84,162,203, 62,
+ 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+225,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,146,128, 81, 63, 96,211, 93, 59,250,168, 27, 63, 96,211, 93, 59,251,168, 27, 63,
+ 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 3, 0, 0,
+192, 83,183, 3, 59, 0, 0, 0,196, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0, 0, 87,183, 3, 52, 0, 0, 0, 1, 0, 0, 0, 40,130,183, 3,240, 44,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 48, 56, 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, 72, 88,183, 3,160,113,183, 3,
+208,117,183, 3, 0, 0, 0, 0, 8, 90,183, 3,160,102,183, 3, 0, 0, 0, 0,200,126,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,128, 88,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,101,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,112,183, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 72, 88,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,128, 88,183, 3, 58, 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, 8, 90,183, 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, 68, 65, 84, 65,224, 10, 0, 0, 8, 90,183, 3, 58, 0, 0, 0,116, 0, 0, 0,223, 28,215, 63,
+ 77, 31, 87, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,242, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,
+182,115, 6, 65,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,250, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,172,163,138,184,181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,
+175, 31,215, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,250, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,
+242, 87,161, 64,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,250, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,
+107, 32, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,239, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,238, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,183,115, 6,193,127, 31,215, 64,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192,
+ 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,244, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,
+150, 29,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64,247, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64,242, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,
+146, 30,215, 64, 74, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,
+226, 3, 41,184, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,135, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 14, 29,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,246, 28,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 18, 29,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,147, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222, 33,215,191,
+183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,182,115, 6,193,
+128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 78, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65, 74, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 72, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 5, 32, 87,192,114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,191, 87,161,192,
+148, 87, 33, 65,133, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,139, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65, 0, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 12, 29,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65, 9, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,253, 28,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65,142, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,136, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,
+240, 87,161, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,127,212,140,184,242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,
+172, 31,215, 64, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,
+181,115, 6, 65, 71, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,
+147, 87, 33, 65, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 24,101,183, 3, 58, 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,160,102,183, 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, 68, 65, 84, 65, 72, 9, 0, 0,160,102,183, 3, 55, 0, 0, 0,198, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0,
+ 0, 0, 34, 0, 20, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0,
+ 85, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0,
+ 28, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0,
+ 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0,
+ 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0,
+ 9, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 29, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0,
+ 6, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0,
+ 30, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0,
+ 16, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 34, 0, 39, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0,
+ 0, 0, 34, 0, 51, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,
+ 94, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0,
+ 56, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,114, 0, 0, 0,
+ 0, 0, 34, 0, 65, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,
+115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,
+ 42, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0,
+ 46, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0,
+ 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0,
+ 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 58, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0,
+ 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0,
+ 58, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0,
+ 0, 0, 34, 0, 64, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0,
+ 67, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0,
+ 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 51, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0,
+ 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,102, 0, 0, 0,
+ 0, 0, 34, 0, 72, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0,
+ 93, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0,
+ 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 77, 0, 0, 0,
+ 0, 0, 34, 0, 74, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,
+ 78, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 85, 0, 0, 0,
+ 0, 0, 34, 0, 83, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0,
+ 89, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0,
+ 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0,
+ 0, 0, 34, 0, 82, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,
+ 93, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0,
+ 87, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 90, 0, 0, 0,
+ 0, 0, 34, 0, 93, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,
+ 94, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,
+114, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,
+104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,
+113, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,
+107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0,
+ 0, 0, 34, 0,106, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,
+113, 0, 0, 0, 0, 0, 34, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 24,112,183, 3, 58, 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,160,113,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 3,163, 14, 32, 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, 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, 3,163, 24, 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, 68, 65, 84, 65, 0, 0, 3,252, 3,163, 8, 32, 0, 0, 0, 54, 0, 0, 0, 51, 0, 0, 0, 18,
- 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5,
- 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12,
- 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14,
- 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16,
- 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0,
- 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42,
- 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49,
- 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48,
- 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56,
- 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0,
- 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68,
- 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115,
- 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85,
- 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21,
- 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0,
- 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74,
- 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60,
- 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96,
- 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73,
- 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0,
- 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50,
- 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98,
- 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101,
- 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109,
- 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0,
- 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108,
- 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113,
- 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112,
- 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,196,
- 3,163, 14, 32, 0, 0, 0, 65, 0, 0, 0, 51, 63, 27,168,250, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 84,
- 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96,
- 63, 81,128,146, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,225,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,149, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96,
- 63, 27,168,246, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227,
- 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,246, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 24, 59, 93,211, 96, 63, 81,128,142,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,185,131,174, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96,
- 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,248,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,
- 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226,
- 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99,
- 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,174,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173,
- 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188,
- 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,
-190,118,127, 56, 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244, 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200,
- 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64,
- 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,
-189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,
-190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131,180, 62,186, 19,116, 63,159,140,244,
- 63, 3, 28, 50, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,225,174, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,226,112, 61,135, 38, 64, 63,114,244,240, 62, 91,221, 4,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 61,135, 44, 96, 62,181, 84, 61,189,169,104,176, 63, 0,189, 93,
-190,109, 1, 80, 63, 38,207,248,189,169,109,144, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63, 41, 47,116,
- 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 62,186, 21, 0, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,185, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185, 61,135, 44, 96, 63, 38,207, 51,
- 62, 91,224, 24, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236,
- 63, 76,225,174, 63, 41, 47,116, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188,
- 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 52, 63, 3, 28,248, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 14, 62,186, 21, 0, 61,104, 82,144, 62, 91,223,128, 62, 82, 94,138, 61,135, 43, 48,
- 62,181, 84,122, 62, 91,224, 32, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 62,181, 84,127,
- 63, 79, 65,242, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 63, 3, 28,248,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 56, 63,141,179,111, 63, 0,188,188,
- 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,127, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,189,188,106,128, 62,186, 20,176, 61,104, 84,160,
- 63, 3, 29, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 48, 3,163, 24, 32, 0, 0, 0, 59,
- 0, 0, 0,204,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,178, 80,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,194,184, 64, 8,194,172, 96, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
- 48, 48, 57, 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, 8,194,179,144, 3,163, 50, 32, 3,163, 56, 32, 0, 0, 0, 0,
- 3,163, 28, 32, 3,163, 40, 32, 0, 0, 0, 0, 3,163, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,179,192,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,181, 64, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,182,192, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213,
- 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,194,179,144, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,179,192, 0, 0, 1, 42, 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, 3,163, 28, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 10,224, 3,163, 28, 32, 0, 0, 0, 58, 0, 0, 0,116, 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18,
- 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172,
- 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201,
- 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220,
- 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,142,158,222, 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192,
- 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 64,190, 35,238, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,191,215, 33,222,
- 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43, 64,190, 35,244, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 64,190, 35,239,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,
-184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159,
- 64,215, 30,146, 64,190, 35,242, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4,
- 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 56, 53,234, 98,191,215, 33, 38,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43,
- 64,215, 31,117,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,191,152, 28,250,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 63,152, 29, 14,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43,
- 64,215, 31,117, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,100, 43,141,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,190, 36, 72,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217,
- 65, 60, 59,112,192,190, 36, 77,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,190, 36, 72,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110, 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199,
- 65, 87, 31, 78, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,100, 43,141,
- 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 63,152, 28,246,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199,
- 65, 87, 31, 78, 63,152, 29, 2,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 63,152, 29, 14,
- 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,191,152, 29, 18,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199,
- 65, 87, 31, 78,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,191,152, 28,250,
- 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,100, 43,147,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199,
- 65, 87, 31, 78,192,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43,192,100, 43,135,
- 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102,
- 63,215, 33, 14,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33,222, 56,135,190,183,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183,
- 64,215, 31,127, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,182, 64,215, 31,128, 64,100, 43,127,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,190, 36, 78, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,190, 36, 74,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5,
- 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,191, 65, 33, 87,148, 64,100, 43,133,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121, 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,191,152, 29, 9,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7,
- 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,100, 43,142,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191,
- 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127,
- 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37,
- 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6,
- 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 63,215, 28,223,
- 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,181, 64,
- 0, 0, 1, 42, 0, 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, 3,163, 40, 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,208,117,183, 3, 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,200,126,183, 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, 68, 65, 84, 65,252, 3, 0, 0,160,113,183, 3, 54, 0, 0, 0, 51, 0, 0, 0, 18, 0, 0, 0,
+ 22, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0,
+ 9, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+ 42, 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0,
+ 43, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0,
+ 48, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0,
+ 60, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0,
+ 58, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0,
+ 67, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0,
+ 51, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0,
+ 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0,
+ 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0,
+ 82, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0,
+ 93, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0,
+ 86, 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0,
+ 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
+ 78, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0,
+ 72, 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,
+105, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,
+106, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,
+115, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0,
+ 0, 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,196, 8, 0, 0,
+208,117,183, 3, 65, 0, 0, 0, 51, 0, 0, 0,250,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59, 84,162,203, 62,
+ 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,
+146,128, 81, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,227,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,225,151,158, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,149,128, 81, 63, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,
+246,168, 27, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,227,151,158, 63,
+ 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,246,168, 27, 63, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,
+247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 24,172,131, 63, 96,211, 93, 59,142,128, 81, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+174,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,247,168, 27, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59,
+ 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,248,168, 27, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+144,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63,
+ 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63,
+ 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 72, 47, 41, 63,
+ 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,174,225, 76, 63,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,
+172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,
+173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63,
+ 56,127,118,190,220, 28, 3, 63, 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,
+102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,
+242, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,
+122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,
+216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,
+113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,
+128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,
+113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,
+ 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63,
+122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,180,131,140, 63,116, 19,186, 62,244,140,159, 63,
+ 50, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+174,225, 76, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,112,226, 76, 63, 64, 38,135, 61,240,244,114, 63, 4,221, 91, 62,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63, 96, 44,135, 61, 61, 84,181, 62,176,104,169,189, 93,189, 0, 63,
+ 80, 1,109,190,248,207, 38, 63,144,109,169,189, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,116, 47, 41, 63,
+ 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,185,188, 0, 63, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 96, 44,135, 61, 51,207, 38, 63,
+ 24,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,
+174,225, 76, 63,116, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,
+120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 52,207, 38, 63,248, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 14, 95, 82, 62, 0, 21,186, 62,144, 82,104, 61,128,223, 91, 62,138, 94, 82, 62, 48, 43,135, 61,
+122, 84,181, 62, 32,224, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63,127, 84,181, 62,
+242, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62,248, 28, 3, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63, 56,207, 38, 63,111,179,141, 63,188,188, 0, 63,
+173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,
+160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,127, 84,181, 62,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,128,106,188,189,176, 20,186, 62,160, 84,104, 61,
+ 0, 29, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 3, 0, 0,200,126,183, 3, 59, 0, 0, 0,
+204, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 40,130,183, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0, 80,173,183, 3, 0, 87,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
+ 48, 48, 57, 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,112,131,183, 3,200,156,183, 3,248,160,183, 3, 0, 0, 0, 0,
+ 48,133,183, 3,200,145,183, 3, 0, 0, 0, 0,240,169,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,131,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,144,183, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,155,183, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,198, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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,112,131,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+168,131,183, 3, 58, 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, 48,133,183, 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,
+ 68, 65, 84, 65,224, 10, 0, 0, 48,133,183, 3, 58, 0, 0, 0,116, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,
+147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,
+181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,
+172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,
+240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222,158,142,184,239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,
+147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0,183,115, 6,193,127, 31,215, 64,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,222, 33,215,191,
+183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,239, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,244, 35,190, 64, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,
+226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,
+146, 30,215, 64,242, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,
+150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 98,234, 53, 56, 38, 33,215,191, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,135, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,
+117, 31,215, 64,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,250, 28,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 14, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,
+117, 31,215, 64, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,141, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,
+112, 59, 60, 65, 77, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 72, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63,
+ 78, 31, 87, 65,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,141, 43,100, 64,
+ 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,246, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63,
+ 78, 31, 87, 65, 2, 29,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65, 14, 29,152, 63,
+ 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 18, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63,
+ 78, 31, 87, 65, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,250, 28,152,191,
+ 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,147, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63,
+ 78, 31, 87, 65,141, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,135, 43,100,192,
+ 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192,
+ 14, 33,215, 63, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,222, 33,215,191,183,190,135, 56, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,
+127, 31,215, 64,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,182,115, 6,193,128, 31,215, 64,127, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 78, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,
+114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,
+113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,142, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,
+107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,
+242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,
+175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,
+182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,223, 28,215, 63,
+ 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 64,144,183, 3,
+ 58, 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,200,145,183, 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,
@@ -9907,535 +10202,535 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 9, 72, 3,163, 40, 32, 0, 0, 0, 55, 0, 0, 0,198, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 85, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 54,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 29,
- 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 20,
- 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 22,
- 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 25,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 29, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 28,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 34,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 32,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 39,
- 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0, 41, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 51,
- 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 34,
- 0, 0, 0, 64, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 82,
- 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 65,
- 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0,115, 0, 0, 0, 34,
- 0, 0, 0, 51, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 42,
- 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 34,
- 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 48,
- 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54,
- 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 53,
- 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 62,
- 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 64,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 67, 0, 0, 0, 34,
- 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66,
- 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 51,
- 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 34,
- 0, 0, 0, 44, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 72,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 75, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 81,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 74,
- 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0,110, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,113,
- 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 83,
- 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 88,
- 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 82,
- 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 91,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 93,
- 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 96, 0, 0, 0, 34,
- 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 80,
- 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 34,
- 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104,
- 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98,
- 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 34,
- 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102,
- 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,113, 0, 0, 0, 34,
- 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,106,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,113, 0, 0, 0, 34,
- 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,111, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,182,192, 0, 0, 1, 42, 0, 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, 3,163, 50, 32, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 9, 0, 0,200,145,183, 3, 55, 0, 0, 0,198, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 83, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0,
+ 22, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 54, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0,
+ 48, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 34, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0,
+ 14, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0,
+ 99, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+ 41, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,
+ 64, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 82, 0, 0, 0,
+ 0, 0, 34, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,
+114, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,
+ 51, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 50, 0, 0, 0,
+ 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0,
+ 44, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0,
+ 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0,
+ 55, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0,
+ 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 34, 0, 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0,
+ 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0,
+ 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0,
+ 0, 0, 34, 0, 61, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,
+ 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0,
+ 44, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0, 70, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+ 75, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0, 81, 0, 0, 0,
+ 0, 0, 34, 0, 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0,
+ 75, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,
+ 80, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,113, 0, 0, 0,
+ 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,
+ 84, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0,
+ 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 88, 0, 0, 0,
+ 0, 0, 34, 0, 83, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0,
+ 86, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+ 88, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 91, 0, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,
+ 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0,
+ 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,
+101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0,
+ 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,
+ 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,
+105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,
+103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,
+108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 34, 0,107, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,
+111, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+ 64,155,183, 3, 58, 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,200,156,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 3,163, 56, 32, 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,248,160,183, 3, 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, 3,163, 66, 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,
- 68, 65, 84, 65, 0, 0, 3,252, 3,163, 50, 32, 0, 0, 0, 54, 0, 0, 0, 51, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 26,
- 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 8,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 25,
- 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 17,
- 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 17,
- 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 33,
- 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 65,
- 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0,
- 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 46,
- 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 28,
- 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 59,
- 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 59,
- 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0, 0,
- 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0, 66,
- 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 20,
- 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 56,
- 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83,
- 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0,
- 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 90,
- 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 90,
- 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 81,
- 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 52,
- 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 0,
- 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0, 41,
- 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103,
- 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,114,
- 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 70,
- 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0,
- 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 52,
- 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 81,
- 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,196, 3,163, 56, 32, 0, 0, 0, 65,
- 0, 0, 0, 51, 63, 27,168,250, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 63, 27,168,251,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,146, 59, 93,211, 96,
- 63, 81,128,149, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,225, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,149, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96,
- 63, 81,128,142, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,131,172, 22,
- 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 27,168,246, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 24, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96,
- 63,158,151,226, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247,
- 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,185,131,176,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161,
- 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174,
- 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,174, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173,
- 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174,
- 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188,
- 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236,
- 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,
-190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244, 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113,
- 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,242,189,188,105, 96,
- 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64,
- 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188,
- 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,
-189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122,
- 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160,
- 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131,180, 62,186, 19,116, 63,159,140,244, 63, 3, 28, 50, 63,140,131, 99,
- 63, 41, 47, 76, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 62,186, 21, 0,
- 63, 38,207, 51, 62, 91,224, 24, 63, 76,226,112, 61,135, 38, 64, 63,114,244,240, 62, 91,221, 4, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,185, 61,135, 44, 96, 62,181, 84, 61,189,169,104,176, 63, 0,189, 93,190,109, 1, 80, 63, 38,207,248,
-189,169,109,144, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63, 41, 47,116, 63, 38,207, 52, 63, 3, 28,248,
- 63, 76,225,174, 62,186, 21, 0, 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185,
- 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185, 61,135, 44, 96, 63, 38,207, 51, 62, 91,224, 24, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116,
- 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63, 41, 47,120, 62,181, 84,122,
- 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 52, 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 14, 62,186, 21, 0, 61,104, 82,144, 62, 91,223,128, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84,122, 62, 91,224, 32,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,188,
- 63, 41, 47,120, 63, 38,207, 52, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63, 41, 47,120,
- 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 56, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242,
- 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,127, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128,
- 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,189,188,106,128, 62,186, 20,176, 61,104, 84,160, 63, 3, 29, 0, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 48, 3,163, 66, 32, 0, 0, 0, 59, 0, 0, 0,204,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,184, 64, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,194,190, 48, 8,194,178, 80, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 48, 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, 8,194,185,128, 3,163, 92, 32, 3,163, 96, 32, 0, 0, 0, 0, 3,163, 70, 32, 3,163, 82, 32,
- 0, 0, 0, 0, 3,163,106, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,185,176, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,187, 48, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,188,176, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,
- 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0,
- 63,128, 0, 30, 63,128, 0,140, 63,127,255,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,194,185,128, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,185,176, 0, 0, 1, 42,
- 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, 3,163, 70, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 10,176,
- 3,163, 70, 32, 0, 0, 0, 58, 0, 0, 0,114, 63,215, 28,223, 65, 87, 31, 77,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 64,161, 86,175, 65, 33, 87,144,192,190, 36, 74,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,133,229,243,
- 65, 60, 59,112,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147,192,190, 36, 69,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,161, 87,194, 64,215, 31,179,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,208,
- 65, 33, 87,146,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 87, 32, 13, 64,161, 87,244,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,226,
- 65, 6,115,179,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33, 44, 64, 87, 32,113,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,173,
- 64,215, 31,170,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240,192,190, 36, 71,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107,192,190, 36, 69, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,142,158,222, 63,215, 33,239,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,192,100, 43,136, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,100, 43,142,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,100, 43,148, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,100, 43,154, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,191,152, 28,253, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,191,152, 29, 9,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,191,152, 29, 20, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180, 63,152, 29, 12, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 63,152, 29, 0,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 63,152, 28,244, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81, 63,152, 28,232, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,121,
- 65, 6,115,181, 64,100, 43,139, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,161, 87,191, 65, 33, 87,148, 64,100, 43,133,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192, 87, 32, 5, 65, 60, 59,114, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,191,215, 33, 32, 65, 87, 31, 81, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,122,
- 65, 6,115,180,192,190, 36, 72, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147,192,190, 36, 74,
- 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113,192,190, 36, 77, 63,255,192, 1, 90,129, 0,255,
- 0, 0, 0, 0,191,215, 33, 36, 65, 87, 31, 81,192,190, 36, 78, 63,255,192, 1, 90,129, 0,255, 0, 0, 0, 0,193, 6,115,182,
- 64,215, 31,128, 64,100, 43,127, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127, 63,152, 28,232,
- 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,191,152, 29, 32, 90,129,165,127, 0, 0, 2,255,
- 0, 0, 0, 0,193, 6,115,183, 64,215, 31,127,192,100, 43,154, 90,129,165,127, 0, 0, 2,255, 0, 0, 0, 0,191,215, 33,222,
- 56,135,190,183,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14,192,190, 36, 72,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192,215, 31,170, 64,161, 87,190,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,192,100, 43,135, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,192,100, 43,141,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,100, 43,147,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,192,100, 43,153,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,191,152, 28,250, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78,191,152, 29, 6,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,191,152, 29, 18,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146,191,152, 29, 30,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43, 63,152, 29, 14, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 63,152, 29, 2,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 63,152, 28,246,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 63,152, 28,234,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43, 64,100, 43,141, 0, 0,128, 2, 0, 0, 2,255, 0, 0, 0, 0, 63,215, 28,199, 65, 87, 31, 78, 64,100, 43,135,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,225, 65, 60, 59,110, 64,100, 43,129,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 64,161, 86,177, 65, 33, 87,146, 64,100, 43,129,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,184,136, 91,213,
- 65,114, 3, 43,192,190, 36, 72,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112,192,190, 36, 77,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,190, 36, 72,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 64,100, 43,135,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151, 64,100, 43,141,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117, 63,152, 29, 2,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 63,152, 29, 14,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,191,152, 29, 6,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150,
- 65, 6,115,151,191,152, 28,250,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115, 43, 64,215, 31,117,192,100, 43,141,
-165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151,192,100, 43,135,165,127,165,127, 0, 0, 2,255,
- 0, 0, 0, 0, 63,215, 33, 15,184, 41, 3,226,192,190, 36, 67, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 32, 4,
- 63,215, 29,150,192,190, 36, 68, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62,192,190, 36, 69,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217,192,190, 36, 72, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 65, 6,115,159, 64,215, 30,146,192,190, 36, 74,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 65, 6,115,159,
- 64,215, 30,146, 64,190, 35,242,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0, 64,215, 31,127, 64,161, 86,217, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 87,193, 64, 87, 30, 62, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 32, 4, 63,215, 29,150, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 33, 15,
-184, 41, 3,226, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,215, 30,150, 65, 6,115,151, 64,190, 35,244,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 64, 87, 29,217, 65, 60, 59,112, 64,190, 35,239,192, 1,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,184,136, 91,213, 65,114, 3, 43, 64,190, 35,244,165,127,165,127, 0, 0, 2,255, 0, 0, 0, 0,192,215, 31,170,
- 64,161, 87,190, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,240, 64, 87, 32, 2, 64,190, 35,244,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32,102, 63,215, 33, 14, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,215, 33,222, 56,135,190,183, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 36,
- 65, 87, 31, 81, 64,190, 35,238, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192, 87, 32, 7, 65, 60, 59,113, 64,190, 35,239,
- 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,192,161, 87,192, 65, 33, 87,147, 64,190, 35,242, 63,255,192, 1, 90,129, 2,255,
- 0, 0, 0, 0,192,215, 31,122, 65, 6,115,180, 64,190, 35,244, 63,255,192, 1, 90,129, 2,255, 0, 0, 0, 0,184,142,158,222,
- 63,215, 33,239, 64,190, 35,248, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,191, 64, 87, 32,107, 64,190, 35,247,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 87, 29,220, 64,161, 87,240, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64,161, 86,173, 64,215, 31,170, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 44,
- 64, 87, 32,113, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,140,212,127, 64,161, 87,242, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,215, 28,201, 64,215, 31,172, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 87, 29,226, 65, 6,115,179, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 13,
- 64,161, 87,244, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 37, 64,215, 31,175, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,184,138,163,172, 65, 6,115,181, 64,190, 35,245, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 63,215, 28,208, 65, 33, 87,146, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,161, 87,194,
- 64,215, 31,179, 64,190, 35,250, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 87, 32, 6, 65, 6,115,182, 64,190, 35,248,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,215, 33, 18, 65, 33, 87,147, 64,190, 35,247, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,184,133,229,243, 65, 60, 59,112, 64,190, 35,244, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,161, 86,175,
- 65, 33, 87,144, 64,190, 35,242,192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 63,215, 28,223, 65, 87, 31, 77, 64,190, 35,242,
-192, 1,192, 1, 90,129, 2,255, 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16, 64,190, 35,245, 0, 0,221, 42,123, 41, 2,255,
- 0, 0, 0, 0, 56, 60,152, 10,191,215, 33, 16,192,190, 36, 74, 0, 0,221, 42,132,215, 2,255, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,187, 48, 0, 0, 1, 42, 0, 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, 3,163, 82, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 9, 0, 3,163, 82, 32, 0, 0, 0, 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7,
- 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11,
- 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13,
- 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 24,
- 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 18,
- 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 34,
- 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 24,
- 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 22,
- 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 34,
- 0, 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 31,
- 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 37,
- 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34,
- 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 38,
- 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 18,
- 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 34,
- 0, 0, 0, 9, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 72,
- 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 61,
- 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 62, 0, 0, 0, 34,
- 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 52,
- 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 46,
- 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34,
- 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 52,
- 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 50,
- 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 57, 0, 0, 0, 34,
- 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 60,
- 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34,
- 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68,
- 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 67,
- 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 34,
- 0, 0, 0, 64, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 1,
- 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 0, 34,
- 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 46,
- 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 75,
- 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 77, 0, 0, 0, 34,
- 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 75,
- 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 74, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 82,
- 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34,
- 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 82,
- 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0, 83,
- 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 34,
- 0, 0, 0, 84, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,106,
- 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 89,
- 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34,
- 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 92,
- 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34,
- 0, 0, 0, 96, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 99,
- 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0,101,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0,100, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103,
- 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105,
- 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34,
- 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103,
- 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,108,
- 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34,
- 0, 0, 0, 65, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 85,
- 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 61,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 92, 0, 0, 0, 34,
- 0, 0, 0, 32, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 90, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,188,176, 0, 0, 1, 42, 0, 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, 3,163, 92, 32, 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, 0, 0, 0, 0, 0,240,169,183, 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,
+ 68, 65, 84, 65,252, 3, 0, 0,200,156,183, 3, 54, 0, 0, 0, 51, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 26, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0,
+ 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0,
+114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0,
+ 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0,
+ 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0, 66, 0, 0, 0,
+ 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0,
+ 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0,
+ 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0,
+ 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0,
+ 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0,
+ 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 81, 0, 0, 0,
+ 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 52, 0, 0, 0,
+ 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,
+100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0, 41, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,
+102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0,
+ 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 70, 0, 0, 0,
+ 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,
+111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 52, 0, 0, 0,
+ 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0,
+ 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,196, 8, 0, 0,248,160,183, 3, 65, 0, 0, 0,
+ 51, 0, 0, 0,250,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59,251,168, 27, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,146,128, 81, 63, 96,211, 93, 59,
+149,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,227,151,158, 63,
+ 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,225,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,149,128, 81, 63, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,
+142,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,227,151,158, 63, 96,211, 93, 59, 22,172,131, 63,
+ 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+246,168, 27, 63, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 24,172,131, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,
+226,151,158, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63,
+ 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59,176,131,185, 63,
+ 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63,
+ 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,
+210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 72, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,
+102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,174,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63,
+ 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,
+102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,
+173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,
+172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,
+111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63,
+ 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,
+188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,242, 65, 79, 63, 96,105,188,189,
+120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,
+216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,
+160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,
+173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,
+128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,
+128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,
+242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,180,131,140, 63,116, 19,186, 62,244,140,159, 63, 50, 28, 3, 63, 99,131,140, 63,
+ 76, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63, 0, 21,186, 62,
+ 51,207, 38, 63, 24,224, 91, 62,112,226, 76, 63, 64, 38,135, 61,240,244,114, 63, 4,221, 91, 62, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,185,188, 0, 63, 96, 44,135, 61, 61, 84,181, 62,176,104,169,189, 93,189, 0, 63, 80, 1,109,190,248,207, 38, 63,
+144,109,169,189, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,116, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,
+174,225, 76, 63, 0, 21,186, 62, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,185,188, 0, 63,
+ 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 96, 44,135, 61, 51,207, 38, 63, 24,224, 91, 62, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,174,225, 76, 63,116, 47, 41, 63,
+ 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,120, 47, 41, 63,122, 84,181, 62,
+248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 52,207, 38, 63,248, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 14, 95, 82, 62, 0, 21,186, 62,144, 82,104, 61,128,223, 91, 62,138, 94, 82, 62, 48, 43,135, 61,122, 84,181, 62, 32,224, 91, 62,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,188,188, 0, 63,
+120, 47, 41, 63, 52,207, 38, 63,236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,120, 47, 41, 63,
+160, 84,104, 61, 0, 29, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62,248, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,190,188, 0, 63,102, 84,117, 63, 56,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,
+113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,
+ 26, 95, 82, 62,120, 47, 41, 63,127, 84,181, 62,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,
+120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,128,106,188,189,176, 20,186, 62,160, 84,104, 61, 0, 29, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 3, 0, 0,240,169,183, 3, 59, 0, 0, 0,204, 0, 0, 0,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 80,173,183, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+ 96,215,183, 3, 40,130,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 48, 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,152,174,183, 3,120,199,183, 3,128,203,183, 3, 0, 0, 0, 0, 88,176,183, 3,192,188,183, 3,
+ 0, 0, 0, 0, 32,212,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,174,183, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,187,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240,197,183, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+114, 0, 0, 0,192, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63,
+ 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 4, 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,
+152,174,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,208,174,183, 3, 58, 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, 88,176,183, 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, 68, 65, 84, 65,176, 10, 0, 0,
+ 88,176,183, 3, 58, 0, 0, 0,114, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,175, 86,161, 64,144, 87, 33, 65, 74, 36,190,192, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,243,229,133,184,
+112, 59, 60, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65, 69, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,194, 87,161,192,179, 31,215, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,208, 28,215, 63,
+146, 87, 33, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 13, 32, 87,192,244, 87,161, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,226, 29, 87, 64,
+179,115, 6, 65, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 44, 33,215,191,113, 32, 87, 64, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,173, 86,161, 64,
+170, 31,215, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64, 71, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64, 69, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,222,158,142,184,239, 33,215, 63, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65,136, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,142, 43,100,192,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,148, 43,100,192,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,154, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65,253, 28,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 9, 29,152,191,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 20, 29,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65, 12, 29,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 0, 29,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,244, 28,152, 63,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65,232, 28,152, 63,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,121, 31,215,192,
+181,115, 6, 65,139, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,191, 87,161,192,148, 87, 33, 65,133, 43,100, 64,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0, 5, 32, 87,192,114, 59, 60, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 32, 33,215,191, 81, 31, 87, 65,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,122, 31,215,192,
+180,115, 6, 65, 72, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,192, 87,161,192,147, 87, 33, 65, 74, 36,190,192,
+255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65, 77, 36,190,192,255, 63, 1,192,129, 90,255, 0,
+ 0, 0, 0, 0, 36, 33,215,191, 81, 31, 87, 65, 78, 36,190,192,255, 63, 1,192,129, 90,255, 0, 0, 0, 0, 0,182,115, 6,193,
+128, 31,215, 64,127, 43,100, 64,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,232, 28,152, 63,
+129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64, 32, 29,152,191,129, 90,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,183,115, 6,193,127, 31,215, 64,154, 43,100,192,129, 90,127,165, 0, 0,255, 0, 2, 0, 0, 0,222, 33,215,191,
+183,190,135, 56, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63, 72, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,170, 31,215,192,190, 87,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,135, 43,100,192, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,141, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,147, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,153, 43,100,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,250, 28,152,191, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 6, 29,152,191,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 18, 29,152,191,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65, 30, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65, 14, 29,152, 63, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65, 2, 29,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,246, 28,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,234, 28,152, 63,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65,141, 43,100, 64, 0, 0, 2,128, 0, 0,255, 0, 2, 0, 0, 0,199, 28,215, 63, 78, 31, 87, 65,135, 43,100, 64,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,225, 29, 87, 64,110, 59, 60, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0,177, 86,161, 64,146, 87, 33, 65,129, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,213, 91,136,184,
+ 43, 3,114, 65, 72, 36,190,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65, 77, 36,190,192,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 72, 36,190,192, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,135, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,141, 43,100, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 2, 29,152, 63,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65, 14, 29,152, 63,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64, 6, 29,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,
+151,115, 6, 65,250, 28,152,191,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0, 43,115, 6, 65,117, 31,215, 64,141, 43,100,192,
+127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,135, 43,100,192,127,165,127,165, 0, 0,255, 0,
+ 2, 0, 0, 0, 15, 33,215, 63,226, 3, 41,184, 67, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 4, 32, 87, 64,
+150, 29,215, 63, 68, 36,190,192, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64, 69, 36,190,192,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64, 72, 36,190,192, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,159,115, 6, 65,146, 30,215, 64, 74, 36,190,192,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,159,115, 6, 65,
+146, 30,215, 64,242, 35,190, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,127, 31,215, 64,217, 86,161, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,193, 87,161, 64, 62, 30, 87, 64,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 4, 32, 87, 64,150, 29,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 15, 33,215, 63,
+226, 3, 41,184,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,150, 30,215, 64,151,115, 6, 65,244, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,217, 29, 87, 64,112, 59, 60, 65,239, 35,190, 64, 1,192, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,213, 91,136,184, 43, 3,114, 65,244, 35,190, 64,127,165,127,165, 0, 0,255, 0, 2, 0, 0, 0,170, 31,215,192,
+190, 87,161, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,240, 87,161,192, 2, 32, 87, 64,244, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,102, 32, 87,192, 14, 33,215, 63,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,222, 33,215,191,183,190,135, 56,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 36, 33,215,191,
+ 81, 31, 87, 65,238, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0, 7, 32, 87,192,113, 59, 60, 65,239, 35,190, 64,
+255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,192, 87,161,192,147, 87, 33, 65,242, 35,190, 64,255, 63, 1,192,129, 90,255, 0,
+ 2, 0, 0, 0,122, 31,215,192,180,115, 6, 65,244, 35,190, 64,255, 63, 1,192,129, 90,255, 0, 2, 0, 0, 0,222,158,142,184,
+239, 33,215, 63,248, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,191, 28,215, 63,107, 32, 87, 64,247, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,220, 29, 87, 64,240, 87,161, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,173, 86,161, 64,170, 31,215, 64,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 44, 33,215,191,
+113, 32, 87, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,127,212,140,184,242, 87,161, 64,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,201, 28,215, 63,172, 31,215, 64,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,226, 29, 87, 64,179,115, 6, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 13, 32, 87,192,
+244, 87,161, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 37, 33,215,191,175, 31,215, 64,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,172,163,138,184,181,115, 6, 65,245, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,208, 28,215, 63,146, 87, 33, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,194, 87,161,192,
+179, 31,215, 64,250, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 6, 32, 87,192,182,115, 6, 65,248, 35,190, 64,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 18, 33,215,191,147, 87, 33, 65,247, 35,190, 64, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,243,229,133,184,112, 59, 60, 65,244, 35,190, 64, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,175, 86,161, 64,
+144, 87, 33, 65,242, 35,190, 64, 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0,223, 28,215, 63, 77, 31, 87, 65,242, 35,190, 64,
+ 1,192, 1,192,129, 90,255, 0, 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191,245, 35,190, 64, 0, 0, 42,221, 41,123,255, 0,
+ 2, 0, 0, 0, 10,152, 60, 56, 16, 33,215,191, 74, 36,190,192, 0, 0, 42,221,215,132,255, 0, 2, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 56,187,183, 3, 58, 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,192,188,183, 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, 68, 65, 84, 65, 0, 9, 0, 0,192,188,183, 3, 55, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0,
+ 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 36, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0,
+ 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 34, 0, 23, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0,
+ 28, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 31, 0, 0, 0,
+ 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0,
+ 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 34, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0,
+ 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 38, 0, 0, 0,
+ 0, 0, 34, 0, 26, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 40, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0,
+ 41, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 42, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0,
+ 9, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0,
+ 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0,
+ 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 52, 0, 0, 0,
+ 0, 0, 34, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0,
+ 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 52, 0, 0, 0,
+ 0, 0, 34, 0, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,
+ 54, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0,
+ 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0,
+ 61, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0,
+ 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 68, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,
+ 69, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0,
+ 64, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0,
+ 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 46, 0, 0, 0,
+ 0, 0, 34, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0,
+ 76, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0,
+ 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 75, 0, 0, 0,
+ 0, 0, 34, 0, 16, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 73, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0,
+ 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0,
+ 79, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 82, 0, 0, 0,
+ 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,
+ 97, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,
+ 84, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,106, 0, 0, 0,
+ 0, 0, 34, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0,
+ 94, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0,
+ 93, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,108, 0, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,
+ 93, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0,
+ 96, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 99, 0, 0, 0,
+ 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,
+103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,
+ 65, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 85, 0, 0, 0,
+ 0, 0, 34, 0, 59, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0,
+ 32, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+240,197,183, 3, 58, 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,199,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 3,163, 96, 32, 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,128,203,183, 3, 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, 3,163,106, 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,
- 68, 65, 84, 65, 0, 0, 3,212, 3,163, 92, 32, 0, 0, 0, 54, 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5,
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5,
- 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9,
- 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0,
- 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16,
- 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0,
- 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41,
- 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27,
- 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54,
- 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38,
- 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0,
- 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52,
- 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53,
- 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59,
- 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0,
- 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66,
- 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67,
- 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72,
- 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79,
- 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0,
- 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95,
- 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105,
- 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99,
- 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107,
- 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0,
- 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106,
- 0, 0, 0,107, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 8,108, 3,163, 96, 32, 0, 0, 0, 65, 0, 0, 0, 49, 61,104, 84,160,
- 63, 79, 65,242,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 26, 63, 41, 47,120, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242,
- 63, 0,188,190, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 3, 29, 0,189,188,106,128,
- 62,186, 20,176, 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,127, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248,
- 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174,
- 63, 41, 47,116, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48,
- 62,181, 84, 61,189,169,104,176, 63, 0,188,185, 61,135, 44, 96, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185,
- 61,135, 44, 96, 63, 38,207,248,189,169,109,144, 63, 76,226,112, 61,135, 38, 64, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,114,244,240, 62, 91,221, 4, 63,140,131,180, 62,186, 19,116, 63,114,244, 42, 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,
-189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188,
- 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242,
- 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128,
- 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128,
- 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160,
- 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,
-190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,
-189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188,
- 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102,
- 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44,
- 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171,
- 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99,
- 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96,
- 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,176, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 63,158,151,224, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 24,
- 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 81,128,142, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96,
- 63, 81,128,149, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,225, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,146,
- 59, 93,211, 96, 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 16, 3,163,106, 32, 0, 0, 0, 59, 0, 0, 0,196,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,212,183, 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,
+ 68, 65, 84, 65,212, 3, 0, 0,120,199,183, 3, 54, 0, 0, 0, 49, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0,
+ 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+ 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+ 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0,
+ 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0,
+ 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
+ 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0,
+ 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0,
+ 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
+ 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
+ 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0,
+ 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,
+111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0,
+ 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0,
+ 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0,
+ 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,
+110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,
+104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0,
+ 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,
+103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,
+ 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,108, 8, 0, 0,128,203,183, 3, 65, 0, 0, 0, 49, 0, 0, 0,160, 84,104, 61,
+242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63, 26, 95, 82, 62,120, 47, 41, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,
+190,188, 0, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61, 0, 29, 3, 63,128,106,188,189,
+176, 20,186, 62,144, 82,104, 61,128,223, 91, 62, 14, 95, 82, 62, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+127, 84,181, 62,242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,188,188, 0, 63,120, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,190,188, 0, 63,102, 84,117, 63, 52,207, 38, 63,
+236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,248, 28, 3, 63,
+ 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 0, 21,186, 62, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 52,207, 38, 63,236, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,174,225, 76, 63,
+116, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62, 32,224, 91, 62,138, 94, 82, 62, 48, 43,135, 61,
+ 61, 84,181, 62,176,104,169,189,185,188, 0, 63, 96, 44,135, 61, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,116, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 51,207, 38, 63, 24,224, 91, 62,185,188, 0, 63,
+ 96, 44,135, 61,248,207, 38, 63,144,109,169,189,112,226, 76, 63, 64, 38,135, 61, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+240,244,114, 63, 4,221, 91, 62,180,131,140, 63,116, 19,186, 62, 42,244,114, 63,244, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,
+128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,
+173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,
+160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,
+120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,
+122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,
+120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,
+242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63,
+ 56,127,118,190,220, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,
+113,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,
+ 96,105,188,189,120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63, 56,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,
+188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,
+111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,
+173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63,
+ 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 60, 0, 1, 0,
+ 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,174,225, 76, 63,102, 84,117, 63, 44,244,114, 63,
+236, 65, 79, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,190,188, 0, 63,171,188,160, 63,
+188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0,
+ 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63,
+ 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63,
+ 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,
+226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,176,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+224,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,
+247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 24,172,131, 63,
+ 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+142,128, 81, 63, 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,226,151,158, 63,
+ 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,
+149,128, 81, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,251,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,246,168, 27, 63,
+ 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,225,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,146,128, 81, 63,
+ 96,211, 93, 59,250,168, 27, 63, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 3, 0, 0, 32,212,183, 3, 59, 0, 0, 0,196, 0, 0, 0,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -10449,20 +10744,20 @@ char datatoc_preview_blend[]= {
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,190, 48, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,194,200,224, 8,194,184, 64, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 49, 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, 8,194,191,112, 8,194,197,208, 8,194,198,160, 0, 0, 0, 0, 3,163,110, 32, 8,194,194,160,
- 0, 0, 0, 0, 8,194,200, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,191,160, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,193, 32, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,196, 80, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,
- 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,205, 4, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,194,191,112, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,191,160, 0, 0, 1, 42,
- 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,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 96,215,183, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+144,228,183, 3, 80,173,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 49, 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,168,216,183, 3,128,225,183, 3, 80,226,183, 3, 0, 0, 0, 0,104,218,183, 3, 72,222,183, 3,
+ 0, 0, 0, 0,224,227,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,216,183, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,220,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,248,223,183, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 0, 0, 0, 32, 0, 0, 0, 8, 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, 4,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 5, 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,
+168,216,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,224,216,183, 3, 58, 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, 3,163,110, 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,104,218,183, 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,
@@ -10470,28 +10765,28 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40,
- 3,163,110, 32, 0, 0, 0, 58, 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,193, 32,
- 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,
+104,218,183, 3, 58, 0, 0, 0, 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,192,220,183, 3,
+ 58, 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, 8,194,194,160, 0, 0, 0, 0, 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,222,183, 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,
@@ -10500,65 +10795,65 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 1,128, 8,194,194,160, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11,
- 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3,
- 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8,
- 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16,
- 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15,
- 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21,
- 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,196, 80, 0, 0, 1, 42,
- 0, 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, 8,194,197,208, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+128, 1, 0, 0, 72,222,183, 3, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0,
+ 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 35, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0,
+ 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 35, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 35, 0, 14, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,248,223,183, 3, 58, 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,128,225,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,198,160, 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, 80,226,183, 3, 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, 8,194,200, 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,224,227,183, 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, 68, 65, 84, 65, 0, 0, 0,160,
- 8,194,197,208, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2,
- 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,194,198,160, 0, 0, 0, 65, 0, 0, 0, 8,
- 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,128, 8,194,200, 48, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,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, 68, 65, 84, 65,160, 0, 0, 0,
+128,225,183, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2,
+ 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0,
+ 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 2, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0,
+ 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0, 80,226,183, 3, 65, 0, 0, 0, 8, 0, 0, 0,
+ 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 0,229,213, 62,162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,
+162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,128, 0, 0, 0,224,227,183, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,200,224,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,194,211,144, 8,194,190, 48, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
- 48, 49, 50, 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, 8,194,202, 32, 8,194,208,128, 8,194,209, 80, 0, 0, 0, 0,
- 3,163,114, 32, 8,194,205, 80, 0, 0, 0, 0, 8,194,210,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,202, 80,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,203,208, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,207, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,180, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,194,202, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,202, 80, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,144,228,183, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0,192,241,183, 3, 96,215,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
+ 48, 49, 50, 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,216,229,183, 3,176,238,183, 3,128,239,183, 3, 0, 0, 0, 0,
+152,231,183, 3,120,235,183, 3, 0, 0, 0, 0, 16,241,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16,230,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,233,183, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,237,183, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,216,229,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+ 16,230,183, 3, 58, 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, 3,163,114, 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,152,231,183, 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,
@@ -10567,27 +10862,27 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,114, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,203,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 2, 0, 0,152,231,183, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0,240,233,183, 3, 58, 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, 8,194,205, 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,120,235,183, 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,
@@ -10596,65 +10891,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,194,205, 80, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 6,
- 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 14,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 17,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,207, 0, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,120,235,183, 3, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+ 40,237,183, 3, 58, 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, 8,194,208,128, 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,176,238,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,209, 80, 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,128,239,183, 3, 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, 8,194,210,224, 0, 0, 0, 0, 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,241,183, 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,
- 68, 65, 84, 65, 0, 0, 0,160, 8,194,208,128, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 96, 8,194,209, 80,
- 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 18, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,194,210,224, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,
+ 68, 65, 84, 65,160, 0, 0, 0,176,238,183, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0,128,239,183, 3,
+ 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 18,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 16,241,183, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,194,211,144, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,222, 64, 8,194,200,224, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 49, 51, 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, 8,194,212,208, 8,194,219, 48,
- 8,194,220, 0, 0, 0, 0, 0, 3,163,118, 32, 8,194,216, 0, 0, 0, 0, 0, 8,194,221,144, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,213, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,214,128,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,217,176, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,212,208, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,213, 0, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0,192,241,183, 3, 52, 0, 0, 0, 1, 0, 0, 0,240,254,183, 3,144,228,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 49, 51, 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, 8,243,183, 3,224,251,183, 3,
+176,252,183, 3, 0, 0, 0, 0,200,244,183, 3,168,248,183, 3, 0, 0, 0, 0, 64,254,183, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 64,243,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,247,183, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,250,183, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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, 8,243,183, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 64,243,183, 3, 58, 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, 3,163,118, 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,200,244,183, 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,
@@ -10663,27 +10958,27 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40, 3,163,118, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,214,128, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 2, 0, 0,200,244,183, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 32,247,183, 3, 58, 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, 8,194,216, 0, 0, 0, 0, 0,
+ 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,248,183, 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,
@@ -10692,65 +10987,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,194,216, 0, 0, 0, 0, 55, 0, 0, 0, 32,
- 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,217,176, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,168,248,183, 3, 55, 0, 0, 0, 32, 0, 0, 0,
+ 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0,
+ 11, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 88,250,183, 3, 58, 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, 8,194,219, 48, 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,224,251,183, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,220, 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, 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, 8,194,221,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,252,183, 3, 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, 64,254,183, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,194,219, 48, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11,
- 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0,
- 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 96, 8,194,220, 0, 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 62,137,192, 18, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,194,221,144, 0, 0, 0, 59,
- 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,224,251,183, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0,
+ 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 96, 1, 0, 0,176,252,183, 3, 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 18,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 64,254,183, 3, 59, 0, 0, 0,
+ 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,222, 64, 0, 0, 0, 52, 0, 0, 0, 1, 8,194,232,240, 8,194,211,144,
+255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,240,254,183, 3, 52, 0, 0, 0, 1, 0, 0, 0, 32, 12,184, 3,192,241,183, 3,
0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 52, 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,
- 8,194,223,128, 8,194,229,224, 8,194,230,176, 0, 0, 0, 0, 3,163,122, 32, 8,194,226,176, 0, 0, 0, 0, 8,194,232, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,223,176, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,225, 48, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,228, 96,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 4, 55, 39,197,172,
- 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,223,128, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,223,176, 0, 0, 1, 42, 0, 0, 0, 5, 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,
+ 56, 0,184, 3, 16, 9,184, 3,224, 9,184, 3, 0, 0, 0, 0,248, 1,184, 3,216, 5,184, 3, 0, 0, 0, 0,112, 11,184, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 4,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136, 7,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0,
+ 8, 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, 4,205, 76, 63,
+172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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, 56, 0,184, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,112, 0,184, 3, 58, 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, 3,163,122, 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,248, 1,184, 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,
@@ -10759,28 +11054,28 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,122, 32, 0, 0, 0, 58,
- 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,225, 48, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,248, 1,184, 3, 58, 0, 0, 0,
+ 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 80, 4,184, 3, 58, 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,
- 8,194,226,176, 0, 0, 0, 0, 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, 5,184, 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,
@@ -10788,66 +11083,66 @@ char datatoc_preview_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, 0, 1,128, 8,194,226,176,
- 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 13,
- 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 6,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 0, 16,
- 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 35,
- 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0, 22,
- 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21, 0, 0, 0, 35, 0, 0, 0, 14,
- 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,228, 96, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,216, 5,184, 3,
+ 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,136, 7,184, 3, 58, 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, 8,194,229,224,
- 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, 0,
+ 0, 0, 0, 0, 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, 9,184, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 8,194,230,176, 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,
+224, 9,184, 3, 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, 8,194,232, 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,112, 11,184, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,194,229,224, 0, 0, 0, 54,
- 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2,
- 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18,
- 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14,
- 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,194,230,176, 0, 0, 0, 65, 0, 0, 0, 8, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,229, 0,
- 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128,
- 8,194,232, 64, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 16, 9,184, 3, 54, 0, 0, 0,
+ 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2,
+ 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0,
+ 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0,224, 9,184, 3, 65, 0, 0, 0, 8, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 0,229,213, 62,
+162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,
+112, 11,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,232,240, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,194,243,160, 8,194,222, 64, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 53, 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, 8,194,234, 48, 8,194,240,144, 8,194,241, 96, 0, 0, 0, 0, 3,163,126, 32, 8,194,237, 96,
- 0, 0, 0, 0, 8,194,242,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,234, 96, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,235,224, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,239, 16, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,
- 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,205, 4, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,194,234, 48, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,234, 96, 0, 0, 1, 42,
- 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,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 32, 12,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+ 80, 25,184, 3,240,254,183, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 53, 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,104, 13,184, 3, 64, 22,184, 3, 16, 23,184, 3, 0, 0, 0, 0, 40, 15,184, 3, 8, 19,184, 3,
+ 0, 0, 0, 0,160, 24,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 13,184, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 17,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 20,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 0, 0, 0, 32, 0, 0, 0, 8, 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, 4,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 5, 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,
+104, 13,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,160, 13,184, 3, 58, 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, 3,163,126, 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, 40, 15,184, 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,
@@ -10855,28 +11150,28 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40,
- 3,163,126, 32, 0, 0, 0, 58, 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,235,224,
- 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,
+ 40, 15,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,128, 17,184, 3,
+ 58, 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, 8,194,237, 96, 0, 0, 0, 0, 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, 19,184, 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,
@@ -10885,65 +11180,65 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 1,128, 8,194,237, 96, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11,
- 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3,
- 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8,
- 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16,
- 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15,
- 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21,
- 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,194,239, 16, 0, 0, 1, 42,
- 0, 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, 8,194,240,144, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+128, 1, 0, 0, 8, 19,184, 3, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0,
+ 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 35, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0,
+ 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 35, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 35, 0, 14, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,184, 20,184, 3, 58, 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, 64, 22,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,241, 96, 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, 16, 23,184, 3, 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, 8,194,242,240, 0, 0, 0, 0, 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, 24,184, 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, 68, 65, 84, 65, 0, 0, 0,160,
- 8,194,240,144, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2,
- 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,194,241, 96, 0, 0, 0, 65, 0, 0, 0, 8,
- 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,128, 8,194,242,240, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,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, 68, 65, 84, 65,160, 0, 0, 0,
+ 64, 22,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2,
+ 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0,
+ 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 2, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0,
+ 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0, 16, 23,184, 3, 65, 0, 0, 0, 8, 0, 0, 0,
+ 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 0,229,213, 62,162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,
+162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,128, 0, 0, 0,160, 24,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,194,243,160,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,194,254, 80, 8,194,232,240, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
- 48, 49, 54, 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, 8,194,244,224, 8,194,251, 64, 8,194,252, 16, 0, 0, 0, 0,
- 3,163,130, 32, 8,194,248, 16, 0, 0, 0, 0, 8,194,253,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,245, 16,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,246,144, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,194,249,192, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,180, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,194,244,224, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,245, 16, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 80, 25,184, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0,128, 38,184, 3, 32, 12,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
+ 48, 49, 54, 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,152, 26,184, 3,112, 35,184, 3, 64, 36,184, 3, 0, 0, 0, 0,
+ 88, 28,184, 3, 56, 32,184, 3, 0, 0, 0, 0,208, 37,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+208, 26,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 30,184, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 33,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,152, 26,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+208, 26,184, 3, 58, 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, 3,163,130, 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, 88, 28,184, 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,
@@ -10952,27 +11247,27 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,130, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,194,246,144, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 2, 0, 0, 88, 28,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0,176, 30,184, 3, 58, 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, 8,194,248, 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, 56, 32,184, 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,
@@ -10981,65 +11276,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,194,248, 16, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 6,
- 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 14,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 17,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,194,249,192, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0, 56, 32,184, 3, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+232, 33,184, 3, 58, 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, 8,194,251, 64, 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,112, 35,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,194,252, 16, 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, 64, 36,184, 3, 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, 8,194,253,160, 0, 0, 0, 0, 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, 37,184, 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,
- 68, 65, 84, 65, 0, 0, 0,160, 8,194,251, 64, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 96, 8,194,252, 16,
- 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 18, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,194,253,160, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,
+ 68, 65, 84, 65,160, 0, 0, 0,112, 35,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, 64, 36,184, 3,
+ 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 18,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,208, 37,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,194,254, 80, 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 9, 0, 8,194,243,160, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 49, 55, 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, 8,194,255,144, 8,195, 5,240,
- 8,195, 6,192, 0, 0, 0, 0, 3,163,134, 32, 8,195, 2,192, 0, 0, 0, 0, 8,195, 8, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,194,255,192, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 1, 64,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 4,112, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,194,255,144, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,194,255,192, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0,128, 38,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,176, 51,184, 3, 80, 25,184, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 49, 55, 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,200, 39,184, 3,160, 48,184, 3,
+112, 49,184, 3, 0, 0, 0, 0,136, 41,184, 3,104, 45,184, 3, 0, 0, 0, 0, 0, 51,184, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+224, 43,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 47,184, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,200, 39,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 0, 40,184, 3, 58, 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, 3,163,134, 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,136, 41,184, 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,
@@ -11048,27 +11343,27 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40, 3,163,134, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 1, 64, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 2, 0, 0,136, 41,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,224, 43,184, 3, 58, 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, 8,195, 2,192, 0, 0, 0, 0,
+ 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, 45,184, 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,
@@ -11077,65 +11372,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,195, 2,192, 0, 0, 0, 55, 0, 0, 0, 32,
- 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 4,112, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,104, 45,184, 3, 55, 0, 0, 0, 32, 0, 0, 0,
+ 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0,
+ 11, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 24, 47,184, 3, 58, 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, 8,195, 5,240, 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,160, 48,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 6,192, 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, 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, 8,195, 8, 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,112, 49,184, 3, 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, 0, 51,184, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,195, 5,240, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11,
- 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0,
- 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 96, 8,195, 6,192, 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 62,137,192, 18, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,195, 8, 80, 0, 0, 0, 59,
- 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,160, 48,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0,
+ 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 96, 1, 0, 0,112, 49,184, 3, 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 18,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 0, 51,184, 3, 59, 0, 0, 0,
+ 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 9, 0, 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 19,176, 8,194,254, 80,
+255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,176, 51,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,224, 64,184, 3,128, 38,184, 3,
0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 56, 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,
- 8,195, 10, 64, 8,195, 16,160, 8,195, 17,112, 0, 0, 0, 0, 3,163,138, 32, 8,195, 13,112, 0, 0, 0, 0, 8,195, 19, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 10,112, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 11,240, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 15, 32,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 4, 55, 39,197,172,
- 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 10, 64, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 10,112, 0, 0, 1, 42, 0, 0, 0, 5, 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,
+248, 52,184, 3,208, 61,184, 3,160, 62,184, 3, 0, 0, 0, 0,184, 54,184, 3,152, 58,184, 3, 0, 0, 0, 0, 48, 64,184, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 53,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 57,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 60,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0,
+ 8, 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, 4,205, 76, 63,
+172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,248, 52,184, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 48, 53,184, 3, 58, 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, 3,163,138, 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,184, 54,184, 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,
@@ -11144,28 +11439,28 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,138, 32, 0, 0, 0, 58,
- 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 11,240, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,184, 54,184, 3, 58, 0, 0, 0,
+ 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 16, 57,184, 3, 58, 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,
- 8,195, 13,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,
+152, 58,184, 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,
@@ -11173,66 +11468,66 @@ char datatoc_preview_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, 0, 1,128, 8,195, 13,112,
- 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 13,
- 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 6,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 0, 16,
- 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 35,
- 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0, 22,
- 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21, 0, 0, 0, 35, 0, 0, 0, 14,
- 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 15, 32, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,152, 58,184, 3,
+ 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0, 72, 60,184, 3, 58, 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, 8,195, 16,160,
- 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, 0,
+ 0, 0, 0, 0, 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, 61,184, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 8,195, 17,112, 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,
+160, 62,184, 3, 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, 8,195, 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, 48, 64,184, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,195, 16,160, 0, 0, 0, 54,
- 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2,
- 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18,
- 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14,
- 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,195, 17,112, 0, 0, 0, 65, 0, 0, 0, 8, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,229, 0,
- 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128,
- 8,195, 19, 0, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,208, 61,184, 3, 54, 0, 0, 0,
+ 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2,
+ 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0,
+ 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0,160, 62,184, 3, 65, 0, 0, 0, 8, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 0,229,213, 62,
+162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,
+ 48, 64,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 19,176, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,195, 30, 96, 8,195, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 57, 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, 8,195, 20,240, 8,195, 27, 80, 8,195, 28, 32, 0, 0, 0, 0, 3,163,142, 32, 8,195, 24, 32,
- 0, 0, 0, 0, 8,195, 29,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 21, 32, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 22,160, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 25,208, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,
- 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,205, 4, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,195, 20,240, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 21, 32, 0, 0, 1, 42,
- 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,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,224, 64,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+ 16, 78,184, 3,176, 51,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 49, 57, 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, 40, 66,184, 3, 0, 75,184, 3,208, 75,184, 3, 0, 0, 0, 0,232, 67,184, 3,200, 71,184, 3,
+ 0, 0, 0, 0, 96, 77,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 66,184, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 70,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120, 73,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 0, 0, 0, 32, 0, 0, 0, 8, 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, 4,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 5, 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,
+ 40, 66,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 96, 66,184, 3, 58, 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, 3,163,142, 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,232, 67,184, 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,
@@ -11240,28 +11535,28 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40,
- 3,163,142, 32, 0, 0, 0, 58, 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 22,160,
- 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,
+232, 67,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 64, 70,184, 3,
+ 58, 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, 8,195, 24, 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,200, 71,184, 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,
@@ -11270,65 +11565,65 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 1,128, 8,195, 24, 32, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11,
- 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3,
- 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8,
- 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16,
- 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15,
- 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21,
- 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 25,208, 0, 0, 1, 42,
- 0, 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, 8,195, 27, 80, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+128, 1, 0, 0,200, 71,184, 3, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0,
+ 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 35, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0,
+ 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 35, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 35, 0, 14, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,120, 73,184, 3, 58, 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, 0, 75,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 28, 32, 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,208, 75,184, 3, 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, 8,195, 29,176, 0, 0, 0, 0, 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, 77,184, 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, 68, 65, 84, 65, 0, 0, 0,160,
- 8,195, 27, 80, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2,
- 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2,
- 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,195, 28, 32, 0, 0, 0, 65, 0, 0, 0, 8,
- 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,128, 8,195, 29,176, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,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, 68, 65, 84, 65,160, 0, 0, 0,
+ 0, 75,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2,
+ 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0,
+ 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 2, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0,
+ 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0,208, 75,184, 3, 65, 0, 0, 0, 8, 0, 0, 0,
+ 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 0,229,213, 62,162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,
+162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,128, 0, 0, 0, 96, 77,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 30, 96,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 41, 16, 8,195, 19,176, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
- 48, 50, 48, 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, 8,195, 31,160, 8,195, 38, 0, 8,195, 38,208, 0, 0, 0, 0,
- 3,163,146, 32, 8,195, 34,208, 0, 0, 0, 0, 8,195, 40, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 31,208,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 33, 80, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 36,128, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,180, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 31,160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 31,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 16, 78,184, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0, 64, 91,184, 3,224, 64,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
+ 48, 50, 48, 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, 88, 79,184, 3, 48, 88,184, 3, 0, 89,184, 3, 0, 0, 0, 0,
+ 24, 81,184, 3,248, 84,184, 3, 0, 0, 0, 0,144, 90,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+144, 79,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 83,184, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 86,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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, 88, 79,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+144, 79,184, 3, 58, 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, 3,163,146, 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, 24, 81,184, 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,
@@ -11337,27 +11632,27 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,146, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,191, 76,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 62, 0, 0,
- 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,195, 33, 80, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 2, 0, 0, 24, 81,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0,112, 83,184, 3, 58, 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, 8,195, 34,208, 0, 0, 0, 0, 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, 84,184, 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,
@@ -11366,65 +11661,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,195, 34,208, 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 6,
- 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 14,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 17,
- 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 36,128, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0,248, 84,184, 3, 55, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+168, 86,184, 3, 58, 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, 8,195, 38, 0, 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, 48, 88,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 38,208, 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, 89,184, 3, 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, 8,195, 40, 96, 0, 0, 0, 0, 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, 90,184, 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,
- 68, 65, 84, 65, 0, 0, 0,160, 8,195, 38, 0, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5,
- 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 96, 8,195, 38,208,
- 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 18, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,195, 40, 96, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,
+ 68, 65, 84, 65,160, 0, 0, 0, 48, 88,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 1, 0, 0, 0, 89,184, 3,
+ 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 18,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,144, 90,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,195, 41, 16, 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 51,192, 8,195, 30, 96, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 50, 49, 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, 8,195, 42, 80, 8,195, 48,176,
- 8,195, 49,128, 0, 0, 0, 0, 3,163,150, 32, 8,195, 45,128, 0, 0, 0, 0, 8,195, 51, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 42,128, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 44, 0,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 47, 48, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 42, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 42,128, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0, 64, 91,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,112,104,184, 3, 16, 78,184, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 80,108, 97,110,101, 46, 48, 50, 49, 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,136, 92,184, 3, 96,101,184, 3,
+ 48,102,184, 3, 0, 0, 0, 0, 72, 94,184, 3, 40, 98,184, 3, 0, 0, 0, 0,192,103,184, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192, 92,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 96,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 99,184, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,136, 92,184, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,192, 92,184, 3, 58, 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, 3,163,150, 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, 72, 94,184, 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,
@@ -11433,27 +11728,27 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 2, 40, 3,163,150, 32, 0, 0, 0, 58, 0, 0, 0, 23, 62,204,205, 47,
-180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 47,
-180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216,
- 0, 0,128, 1, 0, 0, 2, 0, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 44, 0, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 2, 0, 0, 72, 94,184, 3, 58, 0, 0, 0, 23, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204, 62,
+ 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190,
+ 0, 0, 1,128, 0, 0, 0, 0, 2, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 0, 0,
+ 2, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,160, 96,184, 3, 58, 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, 8,195, 45,128, 0, 0, 0, 0,
+ 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, 98,184, 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,
@@ -11462,65 +11757,65 @@ char datatoc_preview_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, 0, 0, 1,128, 8,195, 45,128, 0, 0, 0, 55, 0, 0, 0, 32,
- 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 47, 48, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0, 40, 98,184, 3, 55, 0, 0, 0, 32, 0, 0, 0,
+ 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0,
+ 11, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 34, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,216, 99,184, 3, 58, 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, 8,195, 48,176, 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, 96,101,184, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 49,128, 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, 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, 8,195, 51, 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, 48,102,184, 3, 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,192,103,184, 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, 68, 65, 84, 65, 0, 0, 0,160, 8,195, 48,176, 0, 0, 0, 54, 0, 0, 0, 8, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11,
- 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0,
- 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 96, 8,195, 49,128, 0, 0, 0, 65, 0, 0, 0, 8, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 62,137,192, 18, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 8,195, 51, 16, 0, 0, 0, 59,
- 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 96,101,184, 3, 54, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0,
+ 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 96, 1, 0, 0, 48,102,184, 3, 65, 0, 0, 0, 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 18,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,192,103,184, 3, 59, 0, 0, 0,
+ 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 51,192, 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 62,112, 8,195, 41, 16,
+255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,112,104,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,160,117,184, 3, 64, 91,184, 3,
0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 50, 50, 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,
- 8,195, 53, 0, 8,195, 59, 96, 8,195, 60, 48, 0, 0, 0, 0, 3,163,154, 32, 8,195, 56, 48, 0, 0, 0, 0, 8,195, 61,192,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 53, 48, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 54,176, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 57,224,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 4, 55, 39,197,172,
- 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 53, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 53, 48, 0, 0, 1, 42, 0, 0, 0, 5, 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,
+184,105,184, 3,144,114,184, 3, 96,115,184, 3, 0, 0, 0, 0,120,107,184, 3, 88,111,184, 3, 0, 0, 0, 0,240,116,184, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,105,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,208,109,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,113,184, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0,
+ 8, 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, 4,205, 76, 63,
+172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 5, 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,105,184, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,240,105,184, 3, 58, 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, 3,163,154, 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,120,107,184, 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,
@@ -11529,28 +11824,28 @@ char datatoc_preview_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, 0, 0, 2, 40, 3,163,154, 32, 0, 0, 0, 58,
- 0, 0, 0, 23,191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55,
- 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,190,204,205, 47,
- 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,191, 76,205, 4, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0,182, 70, 0, 0,
- 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 62,204,204,221,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 63, 76,205, 0,
- 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 3, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 54,176, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65, 40, 2, 0, 0,120,107,184, 3, 58, 0, 0, 0,
+ 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190,
+ 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204,190,
+ 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 70,182,
+ 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 1, 0,
+ 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 0,205, 76, 63,
+ 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 47,205,204, 62, 0, 0,128,180,200,204,204,190,
+ 0, 0, 1,128, 0, 0, 1, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,208,109,184, 3, 58, 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,
- 8,195, 56, 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,
+ 88,111,184, 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,
@@ -11558,3861 +11853,3861 @@ char datatoc_preview_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, 0, 1,128, 8,195, 56, 48,
- 0, 0, 0, 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 13,
- 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 5,
- 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 6,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 35,
- 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 0, 16,
- 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 35,
- 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0, 22,
- 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 21, 0, 0, 0, 35, 0, 0, 0, 14,
- 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 57,224, 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,128, 1, 0, 0, 88,111,184, 3,
+ 55, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0,
+ 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 35, 0, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 35, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0,
+ 18, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 35, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0, 8,113,184, 3, 58, 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, 8,195, 59, 96,
- 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, 0,
+ 0, 0, 0, 0, 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,114,184, 3,
+ 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, 0, 0, 0, 0,
85, 86, 84,101,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,
- 8,195, 60, 48, 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,
+ 96,115,184, 3, 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, 8,195, 61,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0,160, 8,195, 59, 96, 0, 0, 0, 54,
- 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4,
- 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2,
- 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18,
- 0, 0, 0, 17, 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22,
- 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14,
- 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 96, 8,195, 60, 48, 0, 0, 0, 65, 0, 0, 0, 8, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,229, 0,
- 63,125,226,162, 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128,
- 8,195, 61,192, 0, 0, 0, 59, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 62,112, 0, 0, 0, 52, 0, 0, 0, 1,
- 8,195, 68, 96, 8,195, 51,192, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 0, 0, 0, 0,112,104,101,
-114,101, 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, 8,195, 63,176, 7,248,144, 32, 7,249, 0, 32, 0, 0, 0, 0, 7,247,240, 32, 7,248, 48, 32,
- 0, 0, 0, 0, 7,254, 48, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 63,224, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 65, 96, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 66,224, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,130,
- 0, 0, 7,128, 0, 0, 5, 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,
- 64,186,224,117, 64,187, 13, 91, 64,186,240,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 8,195, 63,176, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 94, 32, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 63,224, 0, 0, 1, 42,
- 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, 7,247,240, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 60, 48,
- 7,247,240, 32, 0, 0, 0, 58, 0, 0, 2,130,191,141,136, 28, 62,244,243, 12,192,183, 86,198,231,212, 10,117,130,191, 3,255,
- 0, 0, 0, 0,192,131,102,240, 64,119,183, 30,191,199,169,109,166, 58, 84,158,221,230, 3,255, 0, 0, 0, 0, 63,239,108,119,
- 64,156, 85,213,192, 40, 58,188, 40,228,106,207,198,137, 3,255, 0, 0, 0, 0, 64,146,135, 95,191, 14, 54, 63,192,102,194,241,
-100, 27,243,219,177, 45, 3,255, 0, 0, 0, 0, 62,141, 84,239,192,157,220, 16,192, 73, 2, 14, 6, 8,148, 39,187, 86, 3,255,
- 0, 0, 0, 0,192,162,239,132,192, 12,165,206,191,240, 45,150,144,175,207,245,214,251, 3,255, 0, 0, 0, 0,190,141, 84,239,
- 64,157,220, 16, 64, 73, 2, 14,249,248,107,217, 68,170, 3,255, 0, 0, 0, 0, 64,162,239,132, 64, 12,165,206, 63,240, 45,150,
-111, 81, 48, 11, 41, 5, 3,255, 0, 0, 0, 0, 64,131,102,240,192,119,183, 30, 63,199,169,109, 89,198,171, 98, 34, 26, 3,255,
- 0, 0, 0, 0,191,239,108,119,192,156, 85,213, 64, 40, 58,188,215, 28,149, 49, 57,119, 3,255, 0, 0, 0, 0,192,146,135, 95,
- 63, 14, 54, 63, 64,102,194,241,155,229, 12, 37, 78,211, 3,255, 0, 0, 0, 0, 63,141,136, 28,190,244,243, 12, 64,183, 86,198,
- 24, 44,245,139,125, 65, 3,255, 0, 0, 0, 0,192, 68, 17,114, 64, 35,153,226,192,137, 26,154,189, 6, 55,226,162, 85, 3,255,
- 0, 0, 0, 0, 62,230, 40,155, 64, 73,199,239,192,157, 52,176, 9,211, 68,237,148,153, 3,255, 0, 0, 0, 0,191,168, 55,124,
- 64,164,177,224,192, 29,144, 58,227, 69,112,132,202, 46, 3,255, 0, 0, 0, 0,192,105, 35, 94,191,129, 88,230,192,143, 14,195,
-176, 93,233,233,158, 68, 3,255, 0, 0, 0, 0,192,173, 2, 37, 63,123,187,137,192, 1, 68, 56,137,206, 21,127,211,216, 3,255,
- 0, 0, 0, 0, 64, 2,168,234,189, 57,158,231,192,175,149, 65, 44,162,255, 3,136, 11, 3,255, 0, 0, 0, 0, 64,114,159, 19,
- 64, 34,226,254,192,106,133,196, 82,225, 55,164,175,228, 3,255, 0, 0, 0, 0,190,249,176,105,192, 39,148, 21,192,166,214,217,
-245, 87,198,194,142, 5, 3,255, 0, 0, 0, 0, 64, 54,163,227,192, 78,121, 86,192,125,202, 22, 62, 99,185,120,169, 79, 3,255,
- 0, 0, 0, 0,192, 53, 40,241,192,134, 31,200,192, 60,188,229,194, 30,164, 94,191,136, 3,255, 0, 0, 0, 0,192,181,230, 96,
-191,119, 24, 33, 63,130, 26,174,131,186,234,231, 22, 56, 3,255, 0, 0, 0, 0,192,163, 93,103, 64, 38,128,136, 63,153,235, 83,
-144,100, 56,224, 26, 74, 3,255, 0, 0, 0, 0,192, 36,219,238, 64,165,151,132, 63,109,226,165,199,176,113, 33, 20, 80, 3,255,
- 0, 0, 0, 0, 63,111,237, 24, 64,184,174,118, 62,154, 34,212, 20,125,126, 44, 6,148, 3,255, 0, 0, 0, 0, 64,130,244,163,
- 64,133, 58,157,190,226, 95,125, 89,119, 91, 5,246, 86, 3,255, 0, 0, 0, 0, 64,181,230, 96, 63,119, 24, 33,191,130, 26,174,
-124, 70, 21, 25,233,200, 3,255, 0, 0, 0, 0, 64,163, 93,103,192, 38,128,136,191,153,235, 83,111,156,199, 32,229,182, 3,255,
- 0, 0, 0, 0, 64, 36,219,238,192,165,151,132,191,109,226,165, 56, 80,142,223,235,176, 3,255, 0, 0, 0, 0,191,111,237, 24,
-192,184,174,118,190,154, 34,212,235,131,129,212,249,108, 3,255, 0, 0, 0, 0,192,130,244,163,192,133, 58,157, 62,226, 95,125,
-166,137,164,251, 9,170, 3,255, 0, 0, 0, 0,192, 54,163,227, 64, 78,121, 86, 64,125,202, 22,193,157, 70,136, 86,177, 3,255,
- 0, 0, 0, 0, 64, 53, 40,241, 64,134, 31,200, 64, 60,188,229, 61,226, 91,162, 64,120, 3,255, 0, 0, 0, 0, 64,173, 2, 37,
-191,123,187,137, 64, 1, 68, 56,118, 50,234,129, 44, 40, 3,255, 0, 0, 0, 0, 63,168, 55,124,192,164,177,224, 64, 29,144, 58,
- 28,187,143,124, 53,210, 3,255, 0, 0, 0, 0,192,114,159, 19,192, 34,226,254, 64,106,133,196,173, 31,200, 92, 80, 28, 3,255,
- 0, 0, 0, 0,192, 2,168,234, 61, 57,158,231, 64,175,149, 65,211, 94, 0,253,119,245, 3,255, 0, 0, 0, 0, 62,249,176,105,
- 64, 39,148, 21, 64,166,214,217, 10,169, 57, 62,113,251, 3,255, 0, 0, 0, 0, 64,105, 35, 94, 63,129, 88,230, 64,143, 14,195,
- 79,163, 22, 23, 97,188, 3,255, 0, 0, 0, 0, 64, 68, 17,114,192, 35,153,226, 64,137, 26,154, 66,250,200, 30, 93,171, 3,255,
- 0, 0, 0, 0,190,230, 40,155,192, 73,199,239, 64,157, 52,176,246, 45,187, 19,107,103, 3,255, 0, 0, 0, 0,192, 10,178, 37,
- 63,201,231,138,192,166,143,149,209,129, 33,140,141,145, 3,255, 0, 0, 0, 0,192,110,132, 3, 64, 85,203,243,192, 66,107,151,
-174, 16, 73,158,190,209, 3,255, 0, 0, 0, 0,190,174,161,116, 63,241,152, 81,192,177, 2,110,247,217, 40, 15,134,182, 3,255,
- 0, 0, 0, 0, 63,154, 91,138, 64,133,179,218,192,122,222,209, 27, 0, 92, 30,171, 86, 3,255, 0, 0, 0, 0,192, 52, 82, 7,
- 64,149,252, 82,192, 5,202, 64,193, 39,101,227,210,181, 3,255, 0, 0, 0, 0, 62,148, 12,179, 64,166,221,251,192, 41, 87,188,
- 7,192,113,224,198, 21, 3,255, 0, 0, 0, 0,192, 29,246,216,190,141,156, 17,192,169,167,209,203, 47,250,160,139,137, 3,255,
- 0, 0, 0, 0,192,145, 72, 99,191,213,114, 79,192, 83, 35,183,156, 26,219, 3,185, 12, 3,255, 0, 0, 0, 0,192,158, 58,115,
- 64, 33,120,129,191,238, 41,198,148,126, 56,116,215,137, 3,255, 0, 0, 0, 0,192,174,158,118,191, 33,148,103,192, 1,156,140,
-136,218,240,198,211,203, 3,255, 0, 0, 0, 0, 62,249, 14, 55, 62,102,133, 95,192,186,143,210, 9, 56, 5, 40,128,113, 3,255,
- 0, 0, 0, 0, 64, 92, 61,220,190,159,230, 56,192,151, 61, 6, 76, 94,248,242,153,135, 3,255, 0, 0, 0, 0, 64, 60, 86, 7,
- 64,119, 48, 60,192, 81, 88, 93, 63,119, 85,124,184,246, 3,255, 0, 0, 0, 0, 64,139, 55,252, 63,132, 95, 62,192,113,216,225,
- 95,118, 21, 54,173,107, 3,255, 0, 0, 0, 0,191, 84, 6, 18,191,142, 96,251,192,182, 4, 76,237,158,233, 20,131,109, 3,255,
- 0, 0, 0, 0,189,225, 74,109,192,123, 54, 51,192,138,246, 34,253,241,169, 39,162, 1, 3,255, 0, 0, 0, 0, 64,119, 66,153,
-191,251,154,127,192,123,220,161, 85, 59,214, 59,170, 34, 3,255, 0, 0, 0, 0, 63,208, 59,201,192,135,182,241,192,108,101,212,
- 34,103,162,133,175,160, 3,255, 0, 0, 0, 0,191,169,246,161,192,151,196,235,192, 74,149,170,228, 95,151,253,186,184, 3,255,
- 0, 0, 0, 0,192,131,198, 33,192, 84,137,218,192, 32,134, 37,164,247,184, 77,201,167, 3,255, 0, 0, 0, 0,192,179, 61,176,
-191,210,110,138,190,228,220, 24,133,210,219,130,244,238, 3,255, 0, 0, 0, 0,192,170,182, 73,190, 90, 16,136, 64, 25,194, 90,
-139,224,252, 8, 53,174, 3,255, 0, 0, 0, 0,192,153, 55, 75, 64, 87, 78, 4,190, 62, 54, 12,151,200, 74, 29,250,179, 3,255,
- 0, 0, 0, 0,192,161, 19,235, 63,210, 12,207, 64, 31,242,210,146, 50, 34,244, 55,182, 3,255, 0, 0, 0, 0,192, 94, 75, 60,
- 64,150,115,189,190,167,211,186,179, 98,102, 49,247,183, 3,255, 0, 0, 0, 0,191,189,191,186, 64,168, 32, 63, 64, 7,100,213,
-224,161,114,191, 47, 61, 3,255, 0, 0, 0, 0, 63,186,205,242, 64,177, 65,141,191,154,219,127, 32, 82,120,177,228, 61, 3,255,
- 0, 0, 0, 0, 62,175,245, 99, 64,178, 12, 97, 63,228,253,255, 6,247,121, 65, 40, 98, 3,255, 0, 0, 0, 0, 64, 70, 92,226,
- 64,150,131, 8,191,204, 77,182, 66,193,103, 37,220, 32, 3,255, 0, 0, 0, 0, 64,152,194,200, 64, 83,155,180, 63, 62,217,154,
-104,207, 71,101, 17, 87, 3,255, 0, 0, 0, 0, 64,170,182, 73, 62, 90, 16,136,192, 25,194, 90,116, 32, 3,248,202, 82, 3,255,
- 0, 0, 0, 0, 64,179, 61,176, 63,210,110,138, 62,228,220, 24,122, 46, 36,126, 11, 18, 3,255, 0, 0, 0, 0, 64,161, 19,235,
-191,210, 12,207,192, 31,242,210,109,206,221, 12,200, 74, 3,255, 0, 0, 0, 0, 64,153, 55, 75,192, 87, 78, 4, 62, 62, 54, 12,
-104, 56,181,227, 5, 77, 3,255, 0, 0, 0, 0, 63,189,191,186,192,168, 32, 63,192, 7,100,213, 31, 95,141, 65,208,195, 3,255,
- 0, 0, 0, 0, 64, 94, 75, 60,192,150,115,189, 62,167,211,186, 76,158,153,207, 8, 73, 3,255, 0, 0, 0, 0,190,175,245, 99,
-192,178, 12, 97,191,228,253,255,249, 9,134,191,215,158, 3,255, 0, 0, 0, 0,191,186,205,242,192,177, 65,141, 63,154,219,127,
-223,174,135, 79, 27,195, 3,255, 0, 0, 0, 0,192,152,194,200,192, 83,155,180,191, 62,217,154,151, 49,184,155,238,169, 3,255,
- 0, 0, 0, 0,192, 70, 92,226,192,150,131, 8, 63,204, 77,182,189, 63,152,219, 35,224, 3,255, 0, 0, 0, 0,191,208, 59,201,
- 64,135,182,241, 64,108,101,212,221,153, 93,123, 80, 96, 3,255, 0, 0, 0, 0,192,119, 66,153, 63,251,154,127, 64,123,220,161,
-170,197, 41,197, 85,222, 3,255, 0, 0, 0, 0, 63,169,246,161, 64,151,196,235, 64, 74,149,170, 27,161,104, 3, 69, 72, 3,255,
- 0, 0, 0, 0, 64,131,198, 33, 64, 84,137,218, 64, 32,134, 37, 91, 9, 71,179, 54, 89, 3,255, 0, 0, 0, 0, 64,174,158,118,
- 63, 33,148,103, 64, 1,156,140,119, 38, 15, 58, 44, 53, 3,255, 0, 0, 0, 0, 64,158, 58,115,192, 33,120,129, 63,238, 41,198,
-107,130,199,140, 40,119, 3,255, 0, 0, 0, 0, 64, 52, 82, 7,192,149,252, 82, 64, 5,202, 64, 62,217,154, 29, 45, 75, 3,255,
- 0, 0, 0, 0,190,148, 12,179,192,166,221,251, 64, 41, 87,188,248, 64,142, 32, 57,235, 3,255, 0, 0, 0, 0,192, 60, 86, 7,
-192,119, 48, 60, 64, 81, 88, 93,192,137,170,132, 71, 10, 3,255, 0, 0, 0, 0,192,139, 55,252,191,132, 95, 62, 64,113,216,225,
-160,138,234,202, 82,149, 3,255, 0, 0, 0, 0,192, 92, 61,220, 62,159,230, 56, 64,151, 61, 6,179,162, 7, 14,102,121, 3,255,
- 0, 0, 0, 0,190,249, 14, 55,190,102,133, 95, 64,186,143,210,246,200,250,216,127,143, 3,255, 0, 0, 0, 0, 61,225, 74,109,
- 64,123, 54, 51, 64,138,246, 34, 2, 15, 86,217, 93,255, 3,255, 0, 0, 0, 0, 63, 84, 6, 18, 63,142, 96,251, 64,182, 4, 76,
- 18, 98, 22,236,124,147, 3,255, 0, 0, 0, 0, 64,145, 72, 99, 63,213,114, 79, 64, 83, 35,183, 99,230, 36,253, 70,244, 3,255,
- 0, 0, 0, 0, 64, 29,246,216, 62,141,156, 17, 64,169,167,209, 52,209, 5, 96,116,119, 3,255, 0, 0, 0, 0, 64,110,132, 3,
-192, 85,203,243, 64, 66,107,151, 81,240,182, 98, 65, 47, 3,255, 0, 0, 0, 0, 64, 10,178, 37,191,201,231,138, 64,166,143,149,
- 46,127,222,116,114,111, 3,255, 0, 0, 0, 0,191,154, 91,138,192,133,179,218, 64,122,222,209,229, 0,163,226, 84,170, 3,255,
- 0, 0, 0, 0, 62,174,161,116,191,241,152, 81, 64,177, 2,110, 8, 39,215,241,121, 74, 3,255, 0, 0, 0, 0,192, 19, 76, 36,
- 64,129,151, 25,192, 98,254,212,206,231, 88, 97,177,131, 3,255, 0, 0, 0, 0,191,175,232, 93, 64, 64, 23,177,192,154,186, 69,
-225,227, 66,235,151, 34, 3,255, 0, 0, 0, 0,190,232,190,208, 64,139,160, 93,192,120, 33,191,244,183, 94,205,170,192, 3,255,
- 0, 0, 0, 0,192,142,126,210, 63,238, 49, 43,192, 84, 30,112,158,187, 39, 95,182,183, 3,255, 0, 0, 0, 0,192, 97,165,138,
- 63, 80, 9, 92,192,147, 74, 20,177,183, 17,233,156, 86, 3,255, 0, 0, 0, 0,192,152, 61, 98,188,106, 63, 87,192, 90, 97, 6,
-152,127, 0,251,180,183, 3,255, 0, 0, 0, 0, 64, 14,173,200, 64, 63,183,155,192,144, 75,192, 48,206, 64, 45,156,152, 3,255,
- 0, 0, 0, 0, 63,167,162, 95, 63,209, 29,144,192,174,245, 25, 29,250, 36, 75,136,250, 3,255, 0, 0, 0, 0, 64, 68, 62,211,
- 63,168, 56, 51,192,153,245, 13, 65,241, 29,192,150,106, 3,255, 0, 0, 0, 0, 64, 36,182, 33,191,220, 38, 34,192,159, 5,150,
- 54,233,217,211,146,223, 3,255, 0, 0, 0, 0, 63, 81, 34, 16,191,179, 64,129,192,180, 5,162, 18,242,224, 93,133,111, 3,255,
- 0, 0, 0, 0, 63,159, 56,212,192, 68,166,172,192,154,108,212, 27,176,190, 32,149,208, 3,255, 0, 0, 0, 0,191,223, 76,204,
-192,101, 32,170,192,137, 83, 65,216,199,178,195,161,198, 3,255, 0, 0, 0, 0,192, 10,249,249,191,244, 52, 62,192,162,236, 25,
-208, 9,213, 0,145,102, 3,255, 0, 0, 0, 0,192, 89,207, 42,192, 47, 6,251,192,121,165, 27,182,209,196, 18,169,198, 3,255,
- 0, 0, 0, 0,192,176,215,137, 63,241, 62, 25,190,219,254,179,134,179, 39,232,247, 78, 3,255, 0, 0, 0, 0,192,186,150, 28,
- 60, 28, 16,150,191, 7, 9,191,128,118, 1,131,245, 77, 3,255, 0, 0, 0, 0,192,181,132, 34, 63, 92, 60, 99, 63,149, 81,217,
-131,181, 18,238, 23,252, 3,255, 0, 0, 0, 0,190, 74,242,175, 64,183,173,164,191,145,105,227,250,117,125,160,232, 31, 3,255,
- 0, 0, 0, 0,192, 2,227,219, 64,173,164, 96,191, 78, 71,200,212,164,119, 52,238,226, 3,255, 0, 0, 0, 0,191, 92,140,181,
- 64,184, 38, 75, 63, 37,148,176,236,224,125,237, 12,159, 3,255, 0, 0, 0, 0, 64,159,104, 75, 63,236, 56,212,192, 29,126,240,
-108,211, 41,166,203, 9, 3,255, 0, 0, 0, 0, 64,132,159,215, 64, 97,184, 84,192, 10, 44, 30, 91,176, 76, 19,209, 56, 3,255,
- 0, 0, 0, 0, 64,164,122, 95, 64, 44,143,199,191, 68, 78, 53,112, 17, 59, 17,237,185, 3,255, 0, 0, 0, 0, 64, 54,176,255,
-192,141, 84,243,192, 36,176,237, 63,192,160, 9,200, 63, 3,255, 0, 0, 0, 0, 64,133,229, 93,192, 68, 21,217,192, 45,226,157,
- 90,249,187,187,197, 78, 3,255, 0, 0, 0, 0, 64,129, 56,203,192,130,211, 21,191,143,115,187, 87,252,166,194,229,252, 3,255,
- 0, 0, 0, 0,192,104,239,189,192,140,142, 82,191,168,178,178,177,134,158,245,227,155, 3,255, 0, 0, 0, 0,191,253,141, 50,
-192,167,155, 52,191,218,181,170,211,125,141,166,219,155, 3,255, 0, 0, 0, 0,192, 41, 58,164,192,167, 34,172, 61,151,232,206,
-197,232,141,243, 0, 26, 3,255, 0, 0, 0, 0,192,133,229, 93, 64, 68, 21,217, 64, 45,226,157,165, 7, 68, 69, 58,178, 3,255,
- 0, 0, 0, 0,192,129, 56,203, 64,130,211, 21, 63,143,115,187,168, 4, 89, 62, 26, 4, 3,255, 0, 0, 0, 0,192, 54,176,255,
- 64,141, 84,243, 64, 36,176,237,192, 64, 95,247, 55,193, 3,255, 0, 0, 0, 0, 63,253,141, 50, 64,167,155, 52, 63,218,181,170,
- 44,131,114, 90, 36,101, 3,255, 0, 0, 0, 0, 64, 41, 58,164, 64,167, 34,172,189,151,232,206, 58, 24,114, 13,255,230, 3,255,
- 0, 0, 0, 0, 64,104,239,189, 64,140,142, 82, 63,168,178,178, 78,122, 97, 11, 28,101, 3,255, 0, 0, 0, 0, 64,186,150, 28,
-188, 28, 16,150, 63, 7, 9,191,127,138,254,125, 10,179, 3,255, 0, 0, 0, 0, 64,181,132, 34,191, 92, 60, 99,191,149, 81,217,
-124, 75,237, 18,232, 4, 3,255, 0, 0, 0, 0, 64,176,215,137,191,241, 62, 25, 62,219,254,179,121, 77,216, 24, 8,178, 3,255,
- 0, 0, 0, 0, 64, 2,227,219,192,173,164, 96, 63, 78, 71,200, 43, 92,136,204, 17, 30, 3,255, 0, 0, 0, 0, 63, 92,140,181,
-192,184, 38, 75,191, 37,148,176, 19, 32,130, 19,243, 97, 3,255, 0, 0, 0, 0, 62, 74,242,175,192,183,173,164, 63,145,105,227,
- 5,139,130, 96, 23,225, 3,255, 0, 0, 0, 0,192,132,159,215,192, 97,184, 84, 64, 10, 44, 30,164, 80,179,237, 46,200, 3,255,
- 0, 0, 0, 0,192,164,122, 95,192, 44,143,199, 63, 68, 78, 53,143,239,196,239, 18, 71, 3,255, 0, 0, 0, 0,192,159,104, 75,
-191,236, 56,212, 64, 29,126,240,147, 45,214, 90, 52,247, 3,255, 0, 0, 0, 0,191,159, 56,212, 64, 68,166,172, 64,154,108,212,
-228, 80, 65,224,106, 48, 3,255, 0, 0, 0, 0,192, 36,182, 33, 63,220, 38, 34, 64,159, 5,150,201, 23, 38, 45,109, 33, 3,255,
- 0, 0, 0, 0,191, 81, 34, 16, 63,179, 64,129, 64,180, 5,162,237, 14, 31,163,122,145, 3,255, 0, 0, 0, 0, 64, 89,207, 42,
- 64, 47, 6,251, 64,121,165, 27, 73, 47, 59,238, 86, 58, 3,255, 0, 0, 0, 0, 63,223, 76,208, 64,101, 32,170, 64,137, 83, 65,
- 39, 57, 77, 61, 94, 58, 3,255, 0, 0, 0, 0, 64, 10,249,249, 63,244, 52, 62, 64,162,236, 25, 47,247, 43, 0,110,154, 3,255,
- 0, 0, 0, 0, 64,142,126,210,191,238, 49, 43, 64, 84, 30,112, 97, 69,216,161, 73, 73, 3,255, 0, 0, 0, 0, 64,152, 61, 98,
- 60,106, 63, 87, 64, 90, 97, 6,103,129,255, 5, 75, 73, 3,255, 0, 0, 0, 0, 64, 97,165,138,191, 80, 9, 92, 64,147, 74, 20,
- 78, 73,238, 23, 99,170, 3,255, 0, 0, 0, 0, 62,232,190,208,192,139,160, 93, 64,120, 33,191, 11, 73,161, 51, 85, 64, 3,255,
- 0, 0, 0, 0, 64, 19, 76, 36,192,129,151, 25, 64, 98,254,212, 49, 25,167,159, 78,125, 3,255, 0, 0, 0, 0, 63,175,232, 93,
-192, 64, 23,177, 64,154,186, 69, 30, 29,189, 21,104,222, 3,255, 0, 0, 0, 0,192, 68, 62,211,191,168, 56, 51, 64,153,245, 13,
-190, 15,226, 64,105,150, 3,255, 0, 0, 0, 0,192, 14,173,200,192, 63,183,155, 64,144, 75,192,207, 50,191,211, 99,104, 3,255,
- 0, 0, 0, 0,191,167,162, 95,191,209, 29,144, 64,174,245, 25,226, 6,219,181,119, 6, 3,255, 0, 0, 0, 0,191,211,156,158,
- 63,132,228,185,192,176,207,190,220,164, 21,231,134,244, 3,255, 0, 0, 0, 0,192, 41, 76, 0, 64, 5,199,190,192,153,157, 83,
-198,146, 45, 75,150,246, 3,255, 0, 0, 0, 0,192,125, 83,204, 64,105, 55,169,192, 20,162,244,169, 72, 79,246,206, 82, 3,255,
- 0, 0, 0, 0,192, 91,215,178, 64, 62,235,222,192,108,254,190,180,215, 65, 87,175,155, 3,255, 0, 0, 0, 0,191, 59, 63,242,
- 63,152,237,210,192,182, 21,251,239,125, 25, 26,131,149, 3,255, 0, 0, 0, 0, 61, 94,230, 86, 64, 35, 30,198,192,169, 15,233,
- 0,238, 55, 52,140,135, 3,255, 0, 0, 0, 0, 63,199, 4,220, 64,146,145, 7,192, 83,186,104, 34,109,100,137,184,168, 3,255,
- 0, 0, 0, 0, 63, 86,120, 9, 64,109, 91,149,192,142,242, 79, 18,133, 81, 64,158,218, 3,255, 0, 0, 0, 0,192, 95,243,103,
- 64,138, 91,221,191,236, 15,186,178,170, 93,219,216, 25, 3,255, 0, 0, 0, 0,192, 5,206, 46, 64,159, 41,121,192, 19, 91,154,
-209,230,108, 96,205,226, 3,255, 0, 0, 0, 0, 63,139,200,169, 64,163, 78,198,192, 42,146,201, 24,247,111, 59,197,206, 3,255,
- 0, 0, 0, 0,191, 4,128,187, 64,167,181,206,192, 37, 92, 74,245, 57,114, 96,199,145, 3,255, 0, 0, 0, 0,191,231, 16,151,
- 61,209,166,160,192,178, 95,167,217,136, 2,196,133,245, 3,255, 0, 0, 0, 0,192, 69,200,163,191, 38,143,178,192,158, 48,148,
-188,243,242, 11,147,223, 3,255, 0, 0, 0, 0,192,155,192, 43,191,250, 6,151,192, 39, 82,170,149, 79,212,247,199,231, 3,255,
- 0, 0, 0, 0,192,132,118,233,191,173,111,217,192,123,122, 67,165,100,226, 58,170,165, 3,255, 0, 0, 0, 0,192,146, 85,238,
- 64, 78,205,178,191,221, 54, 70,156,183, 71,134,218,120, 3,255, 0, 0, 0, 0,192,167,137, 76, 63,227, 31,111,191,251, 57,158,
-141,234, 39, 54,213, 59, 3,255, 0, 0, 0, 0,192,170,143, 39,191,183, 15,167,191,252, 85,251,139,217,223,169,213, 13, 3,255,
- 0, 0, 0, 0,192,175,214, 8, 62, 53,124,177,192, 2,241,206,136, 23, 3, 89,211, 92, 3,255, 0, 0, 0, 0,190,160,160, 77,
- 62,182, 20, 9,192,186,232,108,248, 8, 7,241,128,128, 3,255, 0, 0, 0, 0, 63,163,144, 33, 61,186,144,151,192,183, 47, 50,
- 27, 97, 2, 19,130,252, 3,255, 0, 0, 0, 0, 64,129,179,222,190,224,147,234,192,134,180, 38, 89, 83,246, 64,164,218, 3,255,
- 0, 0, 0, 0, 64, 49,138,114,190, 57, 97,246,192,165, 76, 57, 60,250,251,247,143,138, 3,255, 0, 0, 0, 0, 64, 27,158,249,
- 64,141,118,197,192, 62,196, 58, 52, 90, 97, 70,191, 90, 3,255, 0, 0, 0, 0, 64, 89,244, 98, 64, 79,120, 8,192, 96,128, 65,
- 74, 8, 71, 39,179,151, 3,255, 0, 0, 0, 0, 64,144,100, 13, 62,118,214,200,192,110,205, 64, 98,182, 4, 37,174,161, 3,255,
- 0, 0, 0, 0, 64,131,202, 42, 63,231,161, 60,192,112,245,142, 90, 10, 38,255,173,209, 3,255, 0, 0, 0, 0,191,122, 51,149,
-190,163,151, 52,192,184,157, 15,234,118,250, 36,129,248, 3,255, 0, 0, 0, 0,191, 42,113, 5,191,241,112, 31,192,176,119, 15,
-241, 93,215, 84,135,135, 3,255, 0, 0, 0, 0, 61,172, 55, 60,192,143, 64, 22,192,113,246,164, 2, 27,157,132,174, 71, 3,255,
- 0, 0, 0, 0,190,154,173,167,192, 83,224,111,192,154,169,198,249,136,183, 89,150,211, 3,255, 0, 0, 0, 0, 64,136,133,151,
-191,162,249, 9,192,115,219,106, 93,175,229, 47,173, 3, 3,255, 0, 0, 0, 0, 64, 89,124,110,192, 40, 6,135,192,127,195,223,
- 74,120,199, 31,168,208, 3,255, 0, 0, 0, 0, 63,117,248,244,192,148, 90,109,192, 93, 0,123, 20, 8,154, 66,180,249, 3,255,
- 0, 0, 0, 0, 64, 17, 0,162,192,113,196, 63,192,119,239, 52, 49, 10,173, 64,171,144, 3,255, 0, 0, 0, 0,191, 7,217,162,
-192,156,117, 21,192, 75,238,222,245,139,149, 20,186,108, 3,255, 0, 0, 0, 0,192, 6,144,171,192,144,158,112,192, 69,241,198,
-210,156,157, 55,188,115, 3,255, 0, 0, 0, 0,192,148,238,110,192, 50,109,115,192, 13,197,187,153,170,195,231,208, 17, 3,255,
- 0, 0, 0, 0,192, 96,252, 79,192,115, 40,140,192, 48,165,116,178,226,173, 98,195,236, 3,255, 0, 0, 0, 0,192,172,228,100,
-191,248,128,217,191,150, 93, 8,138, 91,213, 53,229, 86, 3,255, 0, 0, 0, 0,192,182,171, 82,191,168,250,216, 62,147, 15, 15,
-131,122,226,250, 5,203, 3,255, 0, 0, 0, 0,192,160, 73,215, 62, 49,165,124, 64, 66, 85,232,147, 33, 4, 84, 67, 42, 3,255,
- 0, 0, 0, 0,192,178, 89,171,191, 24,115,192, 63,221,116, 78,134,129,243, 64, 38, 50, 3,255, 0, 0, 0, 0,192,143,206, 51,
- 64,105,250,133,191, 97,251,119,158, 85, 80, 53,235,193, 3,255, 0, 0, 0, 0,192,160, 32, 62, 64, 65, 38,163, 63, 3,117,164,
-146,236, 66, 24, 10,193, 3,255, 0, 0, 0, 0,192,155,108,216, 63,141,255, 59, 64, 69,117,189,150, 61, 23,119, 68, 42, 3,255,
- 0, 0, 0, 0,192,164, 27, 85, 64, 9, 78,244, 63,239,193, 87,144, 33, 46,128, 41, 73, 3,255, 0, 0, 0, 0,192,117, 35,134,
- 64,138,152, 39,191,116, 86, 73,171,230, 94, 2,234, 73, 3,255, 0, 0, 0, 0,192, 67,220, 35, 64,159,218, 6, 62,155,103,242,
-188,240,108,215, 6, 55, 3,255, 0, 0, 0, 0,191, 99, 79,130, 64,164,182,215, 64, 42, 4, 10,237,118,112, 50, 58,190, 3,255,
- 0, 0, 0, 0,192, 3, 86,161, 64,168,205, 14, 63,197, 55, 60,211,148,115, 31, 33,255, 3,255, 0, 0, 0, 0, 63,215,101,229,
- 64,168,141, 84,191,248, 90, 16, 37, 11,114,148,212,159, 3,255, 0, 0, 0, 0, 63,155, 52, 99, 64,183, 17,198,190,235,199,232,
- 26,159,124,192,245,120, 3,255, 0, 0, 0, 0, 61, 10,179,105, 64,169,185, 25, 64, 31,119,120, 0, 77,115,101, 55, 96, 3,255,
- 0, 0, 0, 0, 63, 37,198,143, 64,183,120,123, 63,135,108,160, 13,240,125, 8, 23,144, 3,255, 0, 0, 0, 0, 64, 32,174,180,
- 64,155, 13, 65,192, 8,167,238, 53,247,105,245,208,163, 3,255, 0, 0, 0, 0, 64,104,199, 69, 64,143,135,177,191,132, 12, 41,
- 79, 10, 98, 10,233, 31, 3,255, 0, 0, 0, 0, 64,159,134,121, 64, 49,245, 49, 63,169,166,210,109, 27, 59,242, 29,190, 3,255,
- 0, 0, 0, 0, 64,143,133, 52, 64,113,200,119, 62, 29,206,186, 98, 20, 82, 39, 3,190, 3,255, 0, 0, 0, 0, 64,160, 73,215,
-190, 49,165,124,192, 66, 85,232,108,223,251,172,188,214, 3,255, 0, 0, 0, 0, 64,178, 89,171, 63, 24,115,192,191,221,116, 78,
-121,127, 12,192,217,206, 3,255, 0, 0, 0, 0, 64,172,228,100, 63,248,128,217, 63,150, 93, 8,117,165, 42,203, 26,170, 3,255,
- 0, 0, 0, 0, 64,182,171, 82, 63,168,250,216,190,147, 15, 15,124,134, 29, 6,250, 53, 3,255, 0, 0, 0, 0, 64,155,108,216,
-191,141,255, 59,192, 69,117,189,105,195,232,137,187,214, 3,255, 0, 0, 0, 0, 64,164, 27, 85,192, 9, 78,244,191,239,193, 87,
-111,223,209,128,214,183, 3,255, 0, 0, 0, 0, 64,143,206, 51,192,105,250,133, 63, 97,251,119, 97,171,175,203, 20, 63, 3,255,
- 0, 0, 0, 0, 64,160, 32, 62,192, 65, 38,163,191, 3,117,164,109, 20,189,232,245, 63, 3,255, 0, 0, 0, 0, 63, 99, 79,130,
-192,164,182,215,192, 42, 4, 10, 18,138,143,206,197, 66, 3,255, 0, 0, 0, 0, 64, 3, 86,161,192,168,205, 14,191,197, 55, 60,
- 44,108,140,225,222, 1, 3,255, 0, 0, 0, 0, 64,117, 35,134,192,138,152, 39, 63,116, 86, 73, 84, 26,161,254, 21,183, 3,255,
- 0, 0, 0, 0, 64, 67,220, 35,192,159,218, 6,190,155,103,242, 67, 16,147, 41,249,201, 3,255, 0, 0, 0, 0,189, 10,179,105,
-192,169,185, 25,192, 31,119,120,255,179,140,155,200,160, 3,255, 0, 0, 0, 0,191, 37,198,143,192,183,120,123,191,135,108,160,
-242, 16,130,248,232,112, 3,255, 0, 0, 0, 0,191,215,101,229,192,168,141, 84, 63,248, 90, 16,218,245,141,108, 43, 97, 3,255,
- 0, 0, 0, 0,191,155, 52, 99,192,183, 17,198, 62,235,199,232,229, 97,131, 64, 10,136, 3,255, 0, 0, 0, 0,192,159,134,121,
-192, 49,245, 49,191,169,166,210,146,229,196, 14,226, 66, 3,255, 0, 0, 0, 0,192,143,133, 52,192,113,200,119,190, 29,206,186,
-157,236,173,217,252, 66, 3,255, 0, 0, 0, 0,192, 32,174,180,192,155, 13, 65, 64, 8,167,238,202, 9,150, 11, 47, 93, 3,255,
- 0, 0, 0, 0,192,104,199, 69,192,143,135,177, 63,132, 12, 41,176,246,157,246, 22,225, 3,255, 0, 0, 0, 0,191,117,248,244,
- 64,148, 90,109, 64, 93, 0,123,235,248,101,190, 75, 7, 3,255, 0, 0, 0, 0,192, 17, 0,162, 64,113,196, 63, 64,119,239, 52,
-206,246, 82,192, 84,112, 3,255, 0, 0, 0, 0,192,136,133,151, 63,162,249, 9, 64,115,219,106,162, 81, 26,209, 82,253, 3,255,
- 0, 0, 0, 0,192, 89,124,110, 64, 40, 6,135, 64,127,195,223,181,136, 56,225, 87, 48, 3,255, 0, 0, 0, 0, 63, 7,217,162,
- 64,156,117, 21, 64, 75,238,222, 10,117,106,236, 69,148, 3,255, 0, 0, 0, 0, 64, 6,144,171, 64,144,158,112, 64, 69,241,198,
- 45,100, 98,201, 67,141, 3,255, 0, 0, 0, 0, 64,148,238,110, 64, 50,109,115, 64, 13,197,187,102, 86, 60, 25, 47,239, 3,255,
- 0, 0, 0, 0, 64, 96,252, 79, 64,115, 40,140, 64, 48,165,116, 77, 30, 82,158, 60, 20, 3,255, 0, 0, 0, 0, 64,170,143, 39,
- 63,183, 15,167, 63,252, 85,251,116, 39, 32, 87, 42,243, 3,255, 0, 0, 0, 0, 64,175,214, 8,190, 53,124,177, 64, 2,241,206,
-119,233,252,167, 44,164, 3,255, 0, 0, 0, 0, 64,146, 85,238,192, 78,205,178, 63,221, 54, 70, 99, 73,184,122, 37,136, 3,255,
- 0, 0, 0, 0, 64,167,137, 76,191,227, 31,111, 63,251, 57,158,114, 22,216,202, 42,197, 3,255, 0, 0, 0, 0, 64, 95,243,103,
-192,138, 91,221, 63,236, 15,186, 77, 86,162, 37, 39,231, 3,255, 0, 0, 0, 0, 64, 5,206, 46,192,159, 41,121, 64, 19, 91,154,
- 46, 26,147,160, 50, 30, 3,255, 0, 0, 0, 0,191,139,200,169,192,163, 78,198, 64, 42,146,201,231, 9,144,197, 58, 50, 3,255,
- 0, 0, 0, 0, 63, 4,128,187,192,167,181,206, 64, 37, 92, 74, 10,199,141,160, 56,111, 3,255, 0, 0, 0, 0,192, 27,158,249,
-192,141,118,197, 64, 62,196, 58,203,166,158,186, 64,166, 3,255, 0, 0, 0, 0,192, 89,244, 98,192, 79,120, 8, 64, 96,128, 65,
-181,248,184,217, 76,105, 3,255, 0, 0, 0, 0,192,144,100, 13,190,118,214,200, 64,110,205, 64,157, 74,251,219, 81, 95, 3,255,
- 0, 0, 0, 0,192,131,202, 42,191,231,161, 60, 64,112,245,142,165,246,217, 1, 82, 47, 3,255, 0, 0, 0, 0,192,129,179,222,
- 62,224,147,234, 64,134,180, 38,166,173, 9,192, 91, 38, 3,255, 0, 0, 0, 0,192, 49,138,114, 62, 57, 97,246, 64,165, 76, 57,
-195, 6, 4, 9,112,118, 3,255, 0, 0, 0, 0, 62,160,160, 77,190,182, 20, 9, 64,186,232,108, 7,248,248, 15,127,128, 3,255,
- 0, 0, 0, 0,191,163,144, 33,189,186,144,151, 64,183, 47, 50,228,159,253,237,125, 4, 3,255, 0, 0, 0, 0,189,172, 55, 60,
- 64,143, 64, 22, 64,113,246,164,253,229, 98,124, 81,185, 3,255, 0, 0, 0, 0, 62,154,173,167, 64, 83,224,111, 64,154,169,198,
- 6,120, 72,167,105, 45, 3,255, 0, 0, 0, 0, 63,122, 51,149, 62,163,151, 52, 64,184,157, 15, 21,138, 5,220,126, 8, 3,255,
- 0, 0, 0, 0, 63, 42,113, 5, 63,241,112, 31, 64,176,119, 15, 14,163, 40,172,120,121, 3,255, 0, 0, 0, 0, 64,155,192, 43,
- 63,250, 6,151, 64, 39, 82,170,106,177, 43, 9, 56, 25, 3,255, 0, 0, 0, 0, 64,132,118,233, 63,173,111,217, 64,123,122, 67,
- 90,156, 29,198, 85, 91, 3,255, 0, 0, 0, 0, 63,231, 16,151,189,209,166,160, 64,178, 95,167, 38,120,253, 60,122, 11, 3,255,
- 0, 0, 0, 0, 64, 69,200,163, 63, 38,143,178, 64,158, 48,148, 67, 13, 13,245,108, 33, 3,255, 0, 0, 0, 0, 64,125, 83,204,
-192,105, 55,169, 64, 20,162,244, 86,184,176, 10, 49,174, 3,255, 0, 0, 0, 0, 64, 91,215,178,192, 62,235,222, 64,108,254,190,
- 75, 41,190,169, 80,101, 3,255, 0, 0, 0, 0, 63,211,156,158,191,132,228,185, 64,176,207,190, 35, 92,234, 25,121, 12, 3,255,
- 0, 0, 0, 0, 64, 41, 76, 0,192, 5,199,190, 64,153,157, 83, 57,110,210,181,105, 10, 3,255, 0, 0, 0, 0,191,199, 4,220,
-192,146,145, 7, 64, 83,186,104,221,147,155,119, 71, 88, 3,255, 0, 0, 0, 0,191, 86,120, 9,192,109, 91,149, 64,142,242, 79,
-237,123,174,192, 97, 38, 3,255, 0, 0, 0, 0, 63, 59, 63,242,191,152,237,210, 64,182, 21,251, 16,131,230,230,124,107, 3,255,
- 0, 0, 0, 0,189, 94,230, 86,192, 35, 30,198, 64,169, 15,233,255, 18,200,204,115,121, 3,255, 0, 0, 0, 0,192, 46, 27,208,
- 64, 86,104,124,192,126, 52, 85,197,137, 72,226,168,134, 3,255, 0, 0, 0, 0,191,234,168, 82, 64,149, 62, 87,192, 67, 12,118,
-217, 5,101,188,188,210, 3,255, 0, 0, 0, 0,192, 16, 10,186, 64, 52,106,249,192,147,253,210,206,182, 62,131,155,198, 3,255,
- 0, 0, 0, 0,190,240, 33, 93, 64, 71,199,191,192,158, 47,142,245,214, 69, 40,148,199, 3,255, 0, 0, 0, 0,187, 71, 46, 19,
- 64,115,240,194,192,142,166,175,254,240, 82,161,158, 66, 3,255, 0, 0, 0, 0,191,101,194,188, 64,154, 84, 17,192, 77,193,240,
-235, 76,104,214,185,142, 3,255, 0, 0, 0, 0,192,115,246,246, 64, 15, 86,183,192,118,168, 51,172,249, 47,229,171, 45, 3,255,
- 0, 0, 0, 0,192,160, 1,101, 63,184,146, 47,192, 45, 38,153,146,225, 30, 96,196,102, 3,255, 0, 0, 0, 0,192, 85,229,215,
- 63,218,178,166,192,144, 55,183,182, 38, 37,133,158,110, 3,255, 0, 0, 0, 0,192,104,178,151,189,205,107,245,192,147, 60,175,
-175,178,253,205,156, 91, 3,255, 0, 0, 0, 0,192,136, 81,192,191, 4,239, 55,192,127,222, 24,163,130,245,158,168, 35, 3,255,
- 0, 0, 0, 0,192,164,241, 70, 62,251,218,102,192, 48, 82,143,143,222, 11,210,195,110, 3,255, 0, 0, 0, 0, 63,173,230,209,
- 64, 71,135,231,192,152,234, 27, 29,148, 67, 4,151, 11, 3,255, 0, 0, 0, 0, 64, 67,103,158, 64, 51,206, 82,192,132,168, 39,
- 66,203, 60, 63,164,242, 3,255, 0, 0, 0, 0, 63,100,131,136, 64, 27, 95, 16,192,168,115, 4, 20,122, 53,138,141,143, 3,255,
- 0, 0, 0, 0, 63,217,154, 77, 63, 78, 69,185,192,177,196,221, 38, 53, 17,236,135, 42, 3,255, 0, 0, 0, 0, 64, 37,195,107,
- 63, 36,213, 4,192,167, 33, 20, 55,151, 14,194,141,168, 3,255, 0, 0, 0, 0, 64, 94,139,103, 63,250,146,153,192,137,141, 72,
- 75, 19, 43,156,161,245, 3,255, 0, 0, 0, 0, 64, 21,195,231,191,101, 58,236,192,169,178,218, 49,247,236, 31,139,218, 3,255,
- 0, 0, 0, 0, 64, 48, 32,142,192, 32,140,155,192,145, 1,195, 59, 3,200,178,156,204, 3,255, 0, 0, 0, 0, 63,185,155, 70,
-191, 59,202, 12,192,180, 86,163, 32,149,239, 73,133, 91, 3,255, 0, 0, 0, 0, 62, 43, 97, 29,192, 2,118,144,192,175,231,125,
- 4,106,210,160,136,103, 3,255, 0, 0, 0, 0, 62,196,116, 97,192, 56,176, 10,192,162,239,120, 8,164,194, 20,144, 81, 3,255,
- 0, 0, 0, 0, 64, 5, 2,185,192, 76,105,217,192,142,173,135, 45,218,187, 79,158, 56, 3,255, 0, 0, 0, 0,191,144,243,163,
-192, 73, 41,252,192,154, 66,148,230,134,188, 73,150,107, 3,255, 0, 0, 0, 0,192, 20,133,147,192,124, 55,234,192,107, 3,176,
-204,110,170,196,175,164, 3,255, 0, 0, 0, 0,192, 60,186, 42,191,189,128,219,192,155, 43, 23,191, 41,222,189,150,199, 3,255,
- 0, 0, 0, 0,191,172,164, 52,192, 18,240,106,192,167, 58,141,226, 76,204,213,142,128, 3,255, 0, 0, 0, 0,192,100,171, 12,
-191,243, 33,249,192,135,221,106,178,248,214,143,162,143, 3,255, 0, 0, 0, 0,192, 74, 78,195,192, 96,206,241,192, 94, 88, 98,
-188, 4,179, 34,179,129, 3,255, 0, 0, 0, 0,192,177,110, 41, 63,186, 30, 81,191,158,249,105,134,160, 30,165,229, 86, 3,255,
- 0, 0, 0, 0,192,172,138, 45, 64, 17,149,114, 62,200,203,127,137,251, 48,171, 9, 56, 3,255, 0, 0, 0, 0,192,182, 94, 10,
- 63, 1, 5, 48,191,165, 81, 86,131,156, 12, 24,228, 94, 3,255, 0, 0, 0, 0,192,186,224,117,190,247,234, 37, 62,126, 56,147,
-128,132,246,101, 6, 46, 3,255, 0, 0, 0, 0,192,184, 78,204,189, 89,193, 19, 63,141,163,187,130, 22,254,208, 22,241, 3,255,
- 0, 0, 0, 0,192,174,232,105, 63,224,187,151, 63,153,183,156,136,137, 38,137, 25, 3, 3,255, 0, 0, 0, 0,191, 68,118, 42,
- 64,176,173,101,191,233,132,114,238, 57,120,142,216,217, 3,255, 0, 0, 0, 0, 62,191,172, 81, 64,186,208, 67,190,216,163,195,
- 7, 75,127,131,247,159, 3,255, 0, 0, 0, 0,191,218, 2,113, 64,171,151,172,191,212, 25,114,219,243,117,116,220, 30, 3,255,
- 0, 0, 0, 0,192, 21,244,251, 64,172, 12, 28, 61,128,151, 13,205,229,117,196, 1,226, 3,255, 0, 0, 0, 0,191,223, 39, 51,
- 64,177, 94,248, 63, 76,122,104,217,155,121, 3, 16, 65, 3,255, 0, 0, 0, 0, 61, 28,208, 72, 64,187, 13, 91, 62,245,215, 64,
- 0,187,127,168, 9, 66, 3,255, 0, 0, 0, 0, 64,142, 93, 45, 64, 14,137, 70,192, 70,202,147, 96,241, 49,173,188,202, 3,255,
- 0, 0, 0, 0, 64,173, 23,106, 63,182,131,157,191,225,176,175,118, 7, 32, 20,218, 72, 3,255, 0, 0, 0, 0, 64,128,203, 78,
- 64, 69, 14,124,192, 61, 0, 55, 88,168, 66, 80,191,199, 3,255, 0, 0, 0, 0, 64,133,175,133, 64,121,149, 28,191,168,212, 51,
- 92, 4, 84, 86,227,170, 3,255, 0, 0, 0, 0, 64,149,211, 8, 64, 94,166, 84,191, 29, 24, 68,101,221, 76, 30,241,113, 3,255,
- 0, 0, 0, 0, 64,175,169, 31, 63,237,176,138,191,103,168, 15,119,152, 40,128,235, 11, 3,255, 0, 0, 0, 0, 64, 57, 78,122,
-192,120, 12,224,192, 84, 56, 7, 64, 62,171,247,183,239, 3,255, 0, 0, 0, 0, 64, 48, 74, 0,192,155,165,245,191,227, 87,208,
- 61, 38,150, 68,217,192, 3,255, 0, 0, 0, 0, 64,100,108, 85,192, 76, 47,115,192, 88,224,149, 77,102,185, 90,182,131, 3,255,
- 0, 0, 0, 0, 64,150,191,173,192, 55,233,227,191,254,101,198,102,121,192, 79,213, 73, 3,255, 0, 0, 0, 0, 64,148, 97,119,
-192, 89, 33,200,191,150,225, 24,101, 7,182, 44,229, 20, 3,255, 0, 0, 0, 0, 64, 86,171, 75,192,150, 83, 36,191,133, 36, 22,
- 72,220,153,131,232, 32, 3,255, 0, 0, 0, 0,192, 81,251,116,192,139, 80,115,192, 10,124, 57,185, 81,160, 53,208,254, 3,255,
- 0, 0, 0, 0,192,122,239, 70,192,138,220, 53,190,227, 86,113,171, 68,160,132,246,195, 3,255, 0, 0, 0, 0,192, 28, 50, 14,
-192,153, 4,245,192, 23, 39,141,201,187,151,215,205, 33, 3,255, 0, 0, 0, 0,191,189,123, 34,192,178,168,203,191,130,106,149,
-222,209,134, 63,234,158, 3,255, 0, 0, 0, 0,191,232,127,176,192,178,107,177,189,236,189, 47,216, 65,134,100,252, 66, 3,255,
- 0, 0, 0, 0,192, 90,168, 53,192,152, 83,169, 62,133,201,227,181, 29,152, 77, 4,136, 3,255, 0, 0, 0, 0,192,150,191,173,
- 64, 55,233,227, 63,254,101,198,153,135, 63,177, 42,183, 3,255, 0, 0, 0, 0,192,100,108, 85, 64, 76, 47,115, 64, 88,224,149,
-178,154, 70,166, 73,125, 3,255, 0, 0, 0, 0,192,148, 97,119, 64, 89, 33,200, 63,150,225, 24,154,249, 73,212, 26,236, 3,255,
- 0, 0, 0, 0,192, 86,171, 75, 64,150, 83, 36, 63,133, 36, 22,183, 36,102,125, 23,224, 3,255, 0, 0, 0, 0,192, 48, 74, 0,
- 64,155,165,245, 63,227, 87,208,194,218,105,188, 38, 64, 3,255, 0, 0, 0, 0,192, 57, 78,122, 64,120, 12,224, 64, 84, 56, 7,
-191,194, 84, 9, 72, 17, 3,255, 0, 0, 0, 0, 63,189,123, 34, 64,178,168,203, 63,130,106,149, 33, 47,121,193, 21, 98, 3,255,
- 0, 0, 0, 0, 64, 28, 50, 14, 64,153, 4,245, 64, 23, 39,141, 54, 69,104, 41, 50,223, 3,255, 0, 0, 0, 0, 63,232,127,176,
- 64,178,107,177, 61,236,189, 47, 39,191,121,156, 3,190, 3,255, 0, 0, 0, 0, 64, 90,168, 53, 64,152, 83,169,190,133,201,227,
- 74,227,103,179,251,120, 3,255, 0, 0, 0, 0, 64,122,239, 70, 64,138,220, 53, 62,227, 86,113, 84,188, 95,124, 9, 61, 3,255,
- 0, 0, 0, 0, 64, 81,251,116, 64,139, 80,115, 64, 10,124, 57, 70,175, 95,203, 47, 2, 3,255, 0, 0, 0, 0, 64,186,224,117,
- 62,247,234, 37,190,126, 56,147,127,124, 9,155,249,210, 3,255, 0, 0, 0, 0, 64,182, 94, 10,191, 1, 5, 48, 63,165, 81, 86,
-124,100,243,232, 27,162, 3,255, 0, 0, 0, 0, 64,184, 78,204, 61, 89,193, 19,191,141,163,187,125,234, 1, 48,233, 15, 3,255,
- 0, 0, 0, 0, 64,174,232,105,191,224,187,151,191,153,183,156,119,119,217,119,230,253, 3,255, 0, 0, 0, 0, 64,172,138, 45,
-192, 17,149,114,190,200,203,127,118, 5,207, 85,246,200, 3,255, 0, 0, 0, 0, 64,177,110, 41,191,186, 30, 81, 63,158,249,105,
-121, 96,225, 91, 26,170, 3,255, 0, 0, 0, 0, 64, 21,244,251,192,172, 12, 28,189,128,151, 13, 50, 27,138, 60,254, 30, 3,255,
- 0, 0, 0, 0, 63,218, 2,113,192,171,151,172, 63,212, 25,114, 36, 13,138,140, 35,226, 3,255, 0, 0, 0, 0, 63,223, 39, 51,
-192,177, 94,248,191, 76,122,104, 38,101,134,253,239,191, 3,255, 0, 0, 0, 0,189, 28,208, 72,192,187, 13, 91,190,245,215, 64,
-255, 69,128, 88,246,190, 3,255, 0, 0, 0, 0,190,191,172, 81,192,186,208, 67, 62,216,163,195,248,181,128,125, 8, 97, 3,255,
- 0, 0, 0, 0, 63, 68,118, 42,192,176,173,101, 63,233,132,114, 17,199,135,114, 39, 39, 3,255, 0, 0, 0, 0,192,133,175,133,
-192,121,149, 28, 63,168,212, 51,163,252,171,170, 28, 86, 3,255, 0, 0, 0, 0,192,128,203, 78,192, 69, 14,124, 64, 61, 0, 55,
-167, 88,189,176, 64, 57, 3,255, 0, 0, 0, 0,192,175,169, 31,191,237,176,138, 63,103,168, 15,136,104,215,128, 20,245, 3,255,
- 0, 0, 0, 0,192,149,211, 8,192, 94,166, 84, 63, 29, 24, 68,154, 35,179,226, 14,143, 3,255, 0, 0, 0, 0,192,173, 23,106,
-191,182,131,157, 63,225,176,175,137,249,223,236, 37,184, 3,255, 0, 0, 0, 0,192,142, 93, 45,192, 14,137, 70, 64, 70,202,147,
-159, 15,206, 83, 67, 54, 3,255, 0, 0, 0, 0,192, 5, 2,185, 64, 76,105,217, 64,142,173,135,210, 38, 68,177, 97,200, 3,255,
- 0, 0, 0, 0,190,196,116, 97, 64, 56,176, 10, 64,162,239,120,247, 92, 61,236,111,175, 3,255, 0, 0, 0, 0,192, 48, 32,142,
- 64, 32,140,155, 64,145, 1,195,196,253, 55, 78, 99, 52, 3,255, 0, 0, 0, 0,192, 21,195,231, 63,101, 58,236, 64,169,178,218,
-206, 9, 19,225,116, 38, 3,255, 0, 0, 0, 0,191,185,155, 70, 63, 59,202, 12, 64,180, 86,163,223,107, 16,183,122,165, 3,255,
- 0, 0, 0, 0,190, 43, 97, 29, 64, 2,118,144, 64,175,231,125,251,150, 45, 96,119,153, 3,255, 0, 0, 0, 0, 64, 74, 78,195,
- 64, 96,206,241, 64, 94, 88, 98, 67,252, 76,222, 76,127, 3,255, 0, 0, 0, 0, 64,100,171, 12, 63,243, 33,249, 64,135,221,106,
- 77, 8, 41,113, 93,113, 3,255, 0, 0, 0, 0, 64, 20,133,147, 64,124, 55,234, 64,107, 3,176, 51,146, 85, 60, 80, 92, 3,255,
- 0, 0, 0, 0, 63,144,243,164, 64, 73, 41,252, 64,154, 66,148, 25,122, 67,183,105,149, 3,255, 0, 0, 0, 0, 63,172,164, 52,
- 64, 18,240,106, 64,167, 58,141, 29,180, 51, 43,113,128, 3,255, 0, 0, 0, 0, 64, 60,186, 42, 63,189,128,219, 64,155, 43, 23,
- 64,215, 33, 67,105, 57, 3,255, 0, 0, 0, 0, 64,160, 1,101,191,184,146, 47, 64, 45, 38,153,109, 31,225,160, 59,154, 3,255,
- 0, 0, 0, 0, 64,115,246,246,192, 15, 86,183, 64,118,168, 51, 83, 7,208, 27, 84,211, 3,255, 0, 0, 0, 0, 64,164,241, 70,
-190,251,218,102, 64, 48, 82,143,112, 34,244, 46, 60,146, 3,255, 0, 0, 0, 0, 64,136, 81,192, 63, 4,239, 55, 64,127,222, 24,
- 92,126, 10, 98, 87,221, 3,255, 0, 0, 0, 0, 64,104,178,151, 61,205,107,245, 64,147, 60,175, 80, 78, 2, 51, 99,165, 3,255,
- 0, 0, 0, 0, 64, 85,229,215,191,218,178,166, 64,144, 55,183, 73,218,218,123, 97,146, 3,255, 0, 0, 0, 0, 63,101,194,188,
-192,154, 84, 17, 64, 77,193,240, 20,180,151, 42, 70,114, 3,255, 0, 0, 0, 0, 59, 71, 46, 19,192,115,240,194, 64,142,166,175,
- 1, 16,173, 95, 97,190, 3,255, 0, 0, 0, 0, 63,234,168, 82,192,149, 62, 87, 64, 67, 12,118, 38,251,154, 68, 67, 46, 3,255,
- 0, 0, 0, 0, 64, 46, 27,208,192, 86,104,124, 64,126, 52, 85, 58,119,183, 30, 87,122, 3,255, 0, 0, 0, 0, 64, 16, 10,186,
-192, 52,106,249, 64,147,253,210, 49, 74,193,125,100, 58, 3,255, 0, 0, 0, 0, 62,240, 33, 93,192, 71,199,191, 64,158, 47,142,
- 10, 42,186,216,107, 57, 3,255, 0, 0, 0, 0,192, 94,139,103,191,250,146,153, 64,137,141, 72,180,237,212,100, 94, 11, 3,255,
- 0, 0, 0, 0,192, 37,195,107,191, 36,213, 4, 64,167, 33, 20,200,105,241, 62,114, 88, 3,255, 0, 0, 0, 0,192, 67,103,158,
-192, 51,206, 82, 64,132,168, 39,189, 53,195,193, 91, 14, 3,255, 0, 0, 0, 0,191,173,230,209,192, 71,135,231, 64,152,234, 27,
-226,108,188,252,104,245, 3,255, 0, 0, 0, 0,191,217,154, 77,191, 78, 69,185, 64,177,196,221,217,203,238, 20,120,214, 3,255,
- 0, 0, 0, 0,191,100,131,136,192, 27, 95, 16, 64,168,115, 4,235,134,202,118,114,113, 3,255, 0, 0, 0, 0,192, 37,220,139,
- 64,141,135,245,192, 54,173,114,199, 45, 96, 95,193,211, 3,255, 0, 0, 0, 0,192, 84,119,204, 64,130, 73, 93,192, 38,107,212,
-183, 58, 88,223,199,137, 3,255, 0, 0, 0, 0,192, 67, 76,208, 64,111,120, 62,192, 85, 89, 14,189, 80, 81,196,183,140, 3,255,
- 0, 0, 0, 0,191,238,147, 68, 64,100,230,166,192,136, 9,234,215,216, 78,130,163, 59, 3,255, 0, 0, 0, 0,191,109,149, 30,
- 64,111, 18, 40,192,141,100,171,235, 37, 81,201,159,199, 3,255, 0, 0, 0, 0,191,178,237,144, 64,136,136, 25,192,113, 1,121,
-225,117, 92,189,173, 62, 3,255, 0, 0, 0, 0, 63, 66, 82,214, 64,152,115,128,192, 85, 25,164, 16,241,104, 27,183,126, 3,255,
- 0, 0, 0, 0,189,171,155,119, 64,155, 40,138,192, 83, 96,113,254,128,105,196,183,238, 3,255, 0, 0, 0, 0, 62,194,138, 67,
- 64,138, 97,177,192,124,158, 75, 8,112, 94,134,170, 29, 3,255, 0, 0, 0, 0,191, 94,106,158, 64, 30,106,167,192,167,240,254,
-236,229, 53,187,141,105, 3,255, 0, 0, 0, 0,191,229,114, 22, 64, 20, 96,193,192,162,167,253,217, 22, 50, 93,144,244, 3,255,
- 0, 0, 0, 0,191,162,210, 45, 63,224,211,233,192,174, 67,184,228, 69, 37,245,136,244, 3,255, 0, 0, 0, 0,192,152, 61, 37,
- 64, 14, 9,230,192, 39,179,137,152, 85, 48,183,198,226, 3,255, 0, 0, 0, 0,192,140,187,232, 64, 62, 96, 6,192, 30,247,107,
-160, 7, 65, 68,202, 11, 3,255, 0, 0, 0, 0,192,132,134,116, 64, 40,130, 40,192, 77,207,237,165,139, 57,149,186, 30, 3,255,
- 0, 0, 0, 0,192,129,129, 12, 63,173,129,231,192,128,125,159,167, 62, 29, 15,168,123, 3,255, 0, 0, 0, 0,192,134,112,254,
- 62,207,146,126,192,130, 19,159,164, 15, 9,119,167,117, 3,255, 0, 0, 0, 0,192,149,121,189, 63,111,192,142,192, 90, 95, 76,
-154, 95, 20,107,180,236, 3,255, 0, 0, 0, 0,192,162, 65, 12,191,149, 84, 11,192, 44,202,172,145, 60,230, 47,197, 75, 3,255,
- 0, 0, 0, 0,192,165,120, 74,190,167, 78, 95,192, 48, 51,139,143, 54,248,140,195,244, 3,255, 0, 0, 0, 0,192,150,161, 61,
-191, 89,221,107,192, 89,113,118,153, 40,237, 79,182, 35, 3,255, 0, 0, 0, 0,192, 66, 56, 52, 62,139, 40,206,192,160,116, 21,
-190, 13, 6, 19,146,121, 3,255, 0, 0, 0, 0,192, 56,120,245, 63,154,213,118,192,158,227, 81,193, 81, 26, 47,147,133, 3,255,
- 0, 0, 0, 0,192, 22,104,220, 63, 40,221,204,192,170,137,115,205, 16, 14, 89,139,117, 3,255, 0, 0, 0, 0, 64, 39,143,145,
- 64, 94, 49,190,192,124, 27,165, 56,238, 75,252,170, 43, 3,255, 0, 0, 0, 0, 64, 6,168,130, 64,130,132,190,192,105, 96, 12,
- 45,226, 89, 91,176,173, 3,255, 0, 0, 0, 0, 63,222,169, 76, 64,104,107,205,192,136,142,150, 38, 23, 79,105,163, 33, 3,255,
- 0, 0, 0, 0, 63,229,207,137, 64, 22, 63, 30,192,161,235,207, 39,198, 50,227,145,127, 3,255, 0, 0, 0, 0, 64, 14, 11,239,
- 63,191,114,175,192,166,208,254, 48,133, 33, 81,142, 87, 3,255, 0, 0, 0, 0, 64, 43,222,239, 64, 11,226,212,192,151, 71,227,
- 58, 33, 47,140,152, 91, 3,255, 0, 0, 0, 0, 64,124,245, 0, 62,187, 32, 27,192,138, 6, 57, 86,138, 7,176,162, 2, 3,255,
- 0, 0, 0, 0, 64,112, 75, 42, 63,152, 42,228,192,139, 44, 25, 82, 0, 25,159,161, 31, 3,255, 0, 0, 0, 0, 64, 82,218,178,
- 63, 1,247,178,192,154,129,211, 72, 35, 11, 4,150,217, 3,255, 0, 0, 0, 0, 63,104,203,208, 63,113, 6,146,192,183, 5,108,
- 19,132, 20,150,131, 49, 3,255, 0, 0, 0, 0, 62,251, 68, 26, 63,228, 38,111,192,178, 48,114, 10,139, 38,158,134,109, 3,255,
- 0, 0, 0, 0, 61,149, 78,163, 63,137, 25, 65,192,184,102,234, 1, 54, 23, 52,130, 34, 3,255, 0, 0, 0, 0, 64, 80,140, 98,
-191,238,205,169,192,144, 69, 83, 71, 70,215,145,157,173, 3,255, 0, 0, 0, 0, 64,109, 39,177,191,147,213,155,192,140,143,238,
- 81, 57,230,247,160, 77, 3,255, 0, 0, 0, 0, 64, 66,225,100,191,131,191,146,192,157, 18,152, 66,178,233,128,149, 25, 3,255,
- 0, 0, 0, 0, 63,220, 24,190,191,202,163,163,192,171,244,160, 37, 99,220,199,138,196, 3,255, 0, 0, 0, 0, 63,133,219,227,
-192, 17, 47,172,192,169,160, 93, 23,126,206,164,140, 68, 3,255, 0, 0, 0, 0, 63,247,202, 46,192, 27,140, 23,192,158,252,116,
- 41,217,203, 77,147, 32, 3,255, 0, 0, 0, 0, 63, 68,220, 36,192,132,143, 24,192,130,105, 20, 16,163,165, 66,167, 72, 3,255,
- 0, 0, 0, 0, 63,185,255, 60,192,108,244,215,192,138, 7,129, 31,113,175, 11,161,251, 3,255, 0, 0, 0, 0, 63, 19, 18,220,
-192, 98,186,168,192,148,136, 66, 12,155,178,121,154,241, 3,255, 0, 0, 0, 0,187,172,119,131,191,162,209,182,192,183, 73,170,
-255,209,228,144,130,251, 3,255, 0, 0, 0, 0, 63, 40,230,165,191, 24,111,246,192,185,150, 50, 14, 19,243, 18,129,113, 3,255,
- 0, 0, 0, 0,190, 50, 45,123,190,230, 16,213,192,186,240,160,251,231,246,124,128,109, 3,255, 0, 0, 0, 0,191,199, 22,221,
-192,134,211, 71,192,113,161, 37,222, 98,163,255,173,157, 3,255, 0, 0, 0, 0,191, 58,131,171,192,140,178, 57,192,115,174,214,
-240,105,159,201,173, 11, 3,255, 0, 0, 0, 0,191,112,119,228,192,115, 46, 49,192,139,222,186,235,152,172,221,160,217, 3,255,
- 0, 0, 0, 0,191,254, 75,122,192, 50, 36, 18,192,152, 70, 84,211,253,195, 46,152, 87, 3,255, 0, 0, 0, 0,192, 52,239,190,
-192, 22,186,193,192,145,240,166,194,167,204, 3,156,108, 3,255, 0, 0, 0, 0,192, 39, 23, 51,192, 76,245, 14,192,132,248,105,
-199, 29,186,137,164,200, 3,255, 0, 0, 0, 0,192,140,137,202,192, 33,234, 4,192, 60,117,152,159,215,200,216,192, 6, 3,255,
- 0, 0, 0, 0,192,115,176, 68,192, 68, 49, 85,192, 79,173, 65,172,178,189, 81,185, 81, 3,255, 0, 0, 0, 0,192,128,173,131,
-192, 14,170, 50,192,105, 71,247,168, 30,207, 64,176,189, 3,255, 0, 0, 0, 0,192, 22, 80,230,191,141,155, 50,192,168, 95,108,
-205, 3,232, 6,141, 19, 3,255, 0, 0, 0, 0,191,194,113, 96,191,195,184,166,192,174,160, 31,222,205,222,245,136,227, 3,255,
- 0, 0, 0, 0,191,213,244,249,191, 52, 33, 10,192,178, 94,248,219,172,241, 3,134, 48, 3,255, 0, 0, 0, 0,192,167, 26, 30,
- 64, 42, 11, 62,190,159,163,199,142, 45, 58, 26,248,236, 3,255, 0, 0, 0, 0,192,157,242, 15, 64, 63, 35,177,191,132,230,242,
-148,115, 65,134,233, 39, 3,255, 0, 0, 0, 0,192,169,163, 58, 64, 14,207,184,191,148, 92, 43,140,122, 48,250,230,193, 3,255,
- 0, 0, 0, 0,192,184, 83,241, 63,117,241, 33,190,248, 69,204,130, 32, 20,245,246, 22, 3,255, 0, 0, 0, 0,192,186,178, 88,
- 62,226, 33,180, 62,165,211, 69,128,153, 10, 65, 6,196, 3,255, 0, 0, 0, 0,192,181,194,100, 63,178, 37,227, 62,191, 51, 65,
-131,199, 29,217, 7,201, 3,255, 0, 0, 0, 0,192,168, 68,140, 63, 57,100,162, 64, 31, 41, 90,141, 91, 15,195, 54,175, 3,255,
- 0, 0, 0, 0,192,173,114,185, 63,162, 11,147, 63,237,131,136,137,204, 27,106, 40,187, 3,255, 0, 0, 0, 0,192,178, 82, 90,
- 62,168, 0,181, 63,231, 64,125,134,136, 7, 78, 39,175, 3,255, 0, 0, 0, 0,192,185, 52,235,191, 83,185,191,190,252,176, 39,
-129,201,237,211,244,241, 3,255, 0, 0, 0, 0,192,182,222, 95,190,161, 32,178,191,165, 92, 48,131, 90,248,208,227,211, 3,255,
- 0, 0, 0, 0,192,179,119, 52,191,147,204,223,191,160,141,116,133,169,230,113,228,103, 3,255, 0, 0, 0, 0, 63, 35, 88,109,
- 64,182,186,129,191,152, 8,207, 14, 5,124,127,229,202, 3,255, 0, 0, 0, 0, 63, 99, 54,226, 64,174,134,172,191,250, 98, 96,
- 19,180,118,244,213, 14, 3,255, 0, 0, 0, 0, 61, 60,195,150, 64,177,121, 46,191,245, 6,174, 1, 84,120,249,214, 55, 3,255,
- 0, 0, 0, 0,191,145,160,228, 64,181, 59,121,191,123,252,246,231, 63,123,214,235, 42, 3,255, 0, 0, 0, 0,191,188,166, 29,
- 64,181,120,167,189,165,224, 4,224, 81,123,253,253,203, 3,255, 0, 0, 0, 0,191, 9,186, 26, 64,186,142,104,190,126, 74,128,
-243,158,127, 69,250, 88, 3,255, 0, 0, 0, 0,191, 19,205,179, 64,175,145, 33, 63,253,151,102,243,125,119,171, 43,167, 3,255,
- 0, 0, 0, 0,190,134,114,163, 64,183, 94, 81, 63,157,210, 73,250, 40,124,240, 27, 49, 3,255, 0, 0, 0, 0,191,151,217,253,
- 64,178, 89, 90, 63,178,246,210,230, 89,121,146, 30,187, 3,255, 0, 0, 0, 0,192, 50,200,107, 64,164, 21, 4,191, 18,252,143,
-194,229,111,189,243, 58, 3,255, 0, 0, 0, 0,192, 29,140,219, 64,163,216,164,191,187,160,163,202, 2,111,148,224, 27, 3,255,
- 0, 0, 0, 0,192, 76, 63, 8, 64,152, 92,149,191,157, 6,201,185,254,103,184,229, 25, 3,255, 0, 0, 0, 0, 64,167, 31,102,
- 63,133,113, 18,192, 29,150,122,113,214, 22,149,202, 5, 3,255, 0, 0, 0, 0, 64,157, 48,115, 63, 33,183, 74,192, 72,172, 21,
-107, 50, 13,106,187, 91, 3,255, 0, 0, 0, 0, 64,151, 48,250, 63,186,157,117,192, 74, 37,236,103, 41, 31,126,187, 23, 3,255,
- 0, 0, 0, 0, 64,148, 31,118, 64, 46, 99,144,192, 21,237, 95,101,101, 59,141,205,115, 3,255, 0, 0, 0, 0, 64,150,177, 40,
- 64, 73,250,101,191,189,252,104,103, 13, 68,113,223, 39, 3,255, 0, 0, 0, 0, 64,164, 67, 59, 64, 19,116,106,191,209,145, 96,
-111,204, 50,223,219,255, 3,255, 0, 0, 0, 0, 64,168, 99, 9, 64, 32,173,184, 63, 27, 16,129,114,228, 54,189, 13,164, 3,255,
- 0, 0, 0, 0, 64,174, 1,225, 64, 12,167, 65,190, 38, 1,199,118,149, 48, 17,252,195, 3,255, 0, 0, 0, 0, 64,160,156,172,
- 64, 66,121, 23,188, 53,253,220,109,155, 66, 25, 0, 0, 3,255, 0, 0, 0, 0, 64,106,184,230, 64,133, 83,117,191,243, 95, 76,
- 79,202, 90,251,214, 77, 3,255, 0, 0, 0, 0, 64,101,166,116, 64,111,107, 67,192, 47,233, 69, 78, 23, 81,219,196, 34, 3,255,
- 0, 0, 0, 0, 64, 68, 20,109, 64,139, 9,202,192, 29,255,124, 66,138, 95, 22,202, 6, 3,255, 0, 0, 0, 0, 64, 12,138, 46,
-192,156,168,195,192, 23,240, 99, 47,172,149, 54,203,252, 3,255, 0, 0, 0, 0, 63,201,189,110,192,154, 28, 48,192, 60,148,180,
- 34, 2,150,195,191,147, 3,255, 0, 0, 0, 0, 64, 17, 55, 21,192,140, 67,125,192, 75, 8,118, 49, 61,160, 50,186,221, 3,255,
- 0, 0, 0, 0, 64,100,126, 85,192,114,211,103,192, 43,176,187, 78, 60,172,241,198, 2, 3,255, 0, 0, 0, 0, 64,133,112, 29,
-192,104, 45,168,191,249, 44, 95, 90,154,176, 96,213, 48, 3,255, 0, 0, 0, 0, 64, 95,193,192,192,138, 5,221,191,239,219, 42,
- 76,181,162, 61,214,177, 3,255, 0, 0, 0, 0, 64,134, 21, 28,192,130,231,185, 62,133,210,175, 91,128,166,182, 6, 33, 3,255,
- 0, 0, 0, 0, 64,115,101,128,192,142,100,106,190,205,174,214, 83, 32,159, 12,247,127, 3,255, 0, 0, 0, 0, 64,142,250,187,
-192,113,123,178,190,242,120, 90, 97, 99,173,142,245,244, 3,255, 0, 0, 0, 0, 64,149, 83,115,192, 24,118, 25,192, 41, 5, 96,
-101,195,204, 61,198, 36, 3,255, 0, 0, 0, 0, 64,130, 97,236,192, 34,248,181,192, 87,132, 49, 89, 17,200,184,182,144, 3,255,
- 0, 0, 0, 0, 64,144,103,186,191,234, 9, 91,192, 80,226,150, 98,152,216,121,184,152, 3,255, 0, 0, 0, 0,192,136, 74,208,
-192,121,117,231,191,133,193, 32,162,248,171, 42,232,249, 3,255, 0, 0, 0, 0,192,144, 84, 31,192, 87, 19, 24,191,211, 65, 53,
-157, 74,182,248,219,224, 3,255, 0, 0, 0, 0,192,123, 90, 7,192,121,238,107,191,247,227,115,170, 22,171, 1,213,218, 3,255,
- 0, 0, 0, 0,192, 54,112,161,192,156, 77, 94,191,196,107,207,193,198,149, 23,223, 32, 3,255, 0, 0, 0, 0,192, 22, 41, 24,
-192,169,197, 1,191, 84, 68,191,204, 45,140,105,237,172, 3,255, 0, 0, 0, 0,192, 75,243, 73,192,156, 16, 86,191, 33,150,180,
-186,216,149, 63,241,194, 3,255, 0, 0, 0, 0,192, 19,246,140,192,166, 60,148, 63,182, 70, 11,205,164,142,159, 31,127, 3,255,
- 0, 0, 0, 0,192, 58, 21, 17,192,160,209,224, 63, 88,100,103,192,202,146, 72, 18,171, 3,255, 0, 0, 0, 0,192, 4,252,151,
-192,174, 89, 71, 63, 38, 93,215,210,148,137, 55, 14,122, 3,255, 0, 0, 0, 0,191,150,176, 53,192,174,252,238,191,226,172, 37,
-230,114,136,199,217, 20, 3,255, 0, 0, 0, 0,191,214,105,225,192,161,177,211,192, 29,229,160,219,197,145,175,202, 38, 3,255,
- 0, 0, 0, 0,191, 88,213, 62,192,167, 70,193,192, 32,217,212,237,221,141,232,200,230, 3,255, 0, 0, 0, 0,192,130, 97,236,
- 64, 34,248,181, 64, 87,132, 49,166,239, 55, 72, 73,112, 3,255, 0, 0, 0, 0,192,144,103,186, 63,234, 9, 91, 64, 80,226,150,
-157,104, 39,135, 71,104, 3,255, 0, 0, 0, 0,192,149, 83,115, 64, 24,118, 25, 64, 41, 5, 96,154, 61, 51,195, 57,220, 3,255,
- 0, 0, 0, 0,192,133,112, 29, 64,104, 45,168, 63,249, 44, 95,165,102, 79,160, 42,208, 3,255, 0, 0, 0, 0,192, 95,193,192,
- 64,138, 5,221, 63,239,219, 42,179, 75, 93,195, 41, 79, 3,255, 0, 0, 0, 0,192,100,126, 85, 64,114,211,103, 64, 43,176,187,
-177,196, 83, 15, 57,254, 3,255, 0, 0, 0, 0,191,201,189,110, 64,154, 28, 48, 64, 60,148,180,221,254,105, 61, 64,109, 3,255,
- 0, 0, 0, 0,192, 17, 55, 21, 64,140, 67,125, 64, 75, 8,118,206,195, 95,206, 69, 35, 3,255, 0, 0, 0, 0,192, 12,138, 46,
- 64,156,168,195, 64, 23,240, 99,208, 84,106,202, 52, 4, 3,255, 0, 0, 0, 0,192,115,101,128, 64,142,100,106, 62,205,174,214,
-172,224, 96,244, 8,129, 3,255, 0, 0, 0, 0,192,142,250,187, 64,113,123,178, 62,242,120, 90,158,157, 82,114, 10, 12, 3,255,
- 0, 0, 0, 0,192,134, 21, 28, 64,130,231,185,190,133,210,175,164,128, 89, 74,249,223, 3,255, 0, 0, 0, 0, 63,214,105,225,
- 64,161,177,211, 64, 29,229,160, 36, 59,110, 81, 53,218, 3,255, 0, 0, 0, 0, 63, 88,213, 62, 64,167, 70,193, 64, 32,217,212,
- 18, 35,114, 24, 55, 26, 3,255, 0, 0, 0, 0, 63,150,176, 53, 64,174,252,238, 63,226,172, 37, 25,142,119, 57, 38,236, 3,255,
- 0, 0, 0, 0, 64, 22, 41, 24, 64,169,197, 1, 63, 84, 68,191, 51,211,115,151, 18, 84, 3,255, 0, 0, 0, 0, 64, 75,243, 73,
- 64,156, 16, 86, 63, 33,150,180, 69, 40,106,193, 14, 62, 3,255, 0, 0, 0, 0, 64, 54,112,161, 64,156, 77, 94, 63,196,107,208,
- 62, 58,106,233, 32,224, 3,255, 0, 0, 0, 0, 64,144, 84, 31, 64, 87, 19, 24, 63,211, 65, 53, 98,182, 73, 8, 36, 32, 3,255,
- 0, 0, 0, 0, 64,123, 90, 7, 64,121,238,107, 63,247,227,115, 85,234, 84,255, 42, 38, 3,255, 0, 0, 0, 0, 64,136, 74,208,
- 64,121,117,231, 63,133,193, 32, 93, 8, 84,214, 23, 7, 3,255, 0, 0, 0, 0, 64, 58, 21, 17, 64,160,209,224,191, 88,100,103,
- 63, 54,109,184,237, 85, 3,255, 0, 0, 0, 0, 64, 4,252,151, 64,174, 89, 71,191, 38, 93,215, 45,108,118,201,241,134, 3,255,
- 0, 0, 0, 0, 64, 19,246,140, 64,166, 60,148,191,182, 70, 11, 50, 92,113, 97,224,129, 3,255, 0, 0, 0, 0, 64,182,222, 95,
- 62,161, 32,178, 63,165, 92, 48,124,166, 7, 48, 28, 45, 3,255, 0, 0, 0, 0, 64,179,119, 52, 63,147,204,223, 63,160,141,116,
-122, 87, 25,143, 27,153, 3,255, 0, 0, 0, 0, 64,185, 52,235, 63, 83,185,191, 62,252,176, 39,126, 55, 18, 45, 11, 15, 3,255,
- 0, 0, 0, 0, 64,186,178, 88,190,226, 33,180,190,165,211, 69,127,103,245,191,249, 60, 3,255, 0, 0, 0, 0, 64,181,194,100,
-191,178, 37,227,190,191, 51, 65,124, 57,226, 39,248, 55, 3,255, 0, 0, 0, 0, 64,184, 83,241,191,117,241, 33, 62,248, 69,204,
-125,224,235, 11, 9,234, 3,255, 0, 0, 0, 0, 64,157,242, 15,192, 63, 35,177, 63,132,230,242,107,141,190,122, 22,217, 3,255,
- 0, 0, 0, 0, 64,169,163, 58,192, 14,207,184, 63,148, 92, 43,115,134,207, 6, 25, 63, 3,255, 0, 0, 0, 0, 64,167, 26, 30,
-192, 42, 11, 62, 62,159,163,199,113,211,197,230, 7, 20, 3,255, 0, 0, 0, 0, 64,173,114,185,191,162, 11,147,191,237,131,136,
-118, 52,228,150,215, 69, 3,255, 0, 0, 0, 0, 64,178, 82, 90,190,168, 0,181,191,231, 64,125,121,120,248,178,216, 81, 3,255,
- 0, 0, 0, 0, 64,168, 68,140,191, 57,100,162,192, 31, 41, 90,114,165,240, 61,201, 81, 3,255, 0, 0, 0, 0, 64, 29,140,219,
-192,163,216,164, 63,187,160,163, 53,254,144,108, 31,229, 3,255, 0, 0, 0, 0, 64, 76, 63, 8,192,152, 92,149, 63,157, 6,201,
- 70, 2,152, 72, 26,231, 3,255, 0, 0, 0, 0, 64, 50,200,107,192,164, 21, 4, 63, 18,252,143, 61, 27,144, 67, 12,198, 3,255,
- 0, 0, 0, 0, 63,188,166, 29,192,181,120,167, 61,165,224, 4, 31,175,132, 3, 2, 53, 3,255, 0, 0, 0, 0, 63, 9,186, 26,
-192,186,142,104, 62,126, 74,128, 12, 98,128,187, 5,168, 3,255, 0, 0, 0, 0, 63,145,160,228,192,181, 59,121, 63,123,252,246,
- 24,193,132, 42, 20,214, 3,255, 0, 0, 0, 0,191, 99, 54,226,192,174,134,172, 63,250, 98, 96,236, 76,137, 12, 42,242, 3,255,
- 0, 0, 0, 0,189, 60,195,150,192,177,121, 46, 63,245, 6,174,254,172,135, 7, 41,201, 3,255, 0, 0, 0, 0,191, 35, 88,109,
-192,182,186,129, 63,152, 8,207,241,251,131,129, 26, 54, 3,255, 0, 0, 0, 0, 62,134,114,163,192,183, 94, 81,191,157,210, 73,
- 5,216,131, 16,228,207, 3,255, 0, 0, 0, 0, 63,151,217,253,192,178, 89, 90,191,178,246,210, 25,167,134,110,225, 69, 3,255,
- 0, 0, 0, 0, 63, 19,205,179,192,175,145, 33,191,253,151,102, 12,131,136, 85,212, 89, 3,255, 0, 0, 0, 0,192,101,166,116,
-192,111,107, 67, 64, 47,233, 69,177,233,174, 37, 59,222, 3,255, 0, 0, 0, 0,192, 68, 20,109,192,139, 9,202, 64, 29,255,124,
-189,118,160,234, 53,250, 3,255, 0, 0, 0, 0,192,106,184,230,192,133, 83,117, 63,243, 95, 76,176, 54,165, 5, 41,179, 3,255,
- 0, 0, 0, 0,192,150,177, 40,192, 73,250,101, 63,189,252,104,152,243,187,143, 32,217, 3,255, 0, 0, 0, 0,192,164, 67, 59,
-192, 19,116,106, 63,209,145, 96,144, 52,205, 33, 36, 1, 3,255, 0, 0, 0, 0,192,148, 31,118,192, 46, 99,144, 64, 21,237, 95,
-154,155,196,115, 50,141, 3,255, 0, 0, 0, 0,192,157, 48,115,191, 33,183, 74, 64, 72,172, 21,148,206,242,150, 68,165, 3,255,
- 0, 0, 0, 0,192,151, 48,250,191,186,157,117, 64, 74, 37,236,152,215,224,130, 68,233, 3,255, 0, 0, 0, 0,192,167, 31,102,
-191,133,113, 18, 64, 29,150,122,142, 42,233,107, 53,251, 3,255, 0, 0, 0, 0,192,174, 1,225,192, 12,167, 65, 62, 38, 1,199,
-137,107,207,239, 3, 61, 3,255, 0, 0, 0, 0,192,160,156,172,192, 66,121, 23, 60, 53,253,220,146,101,189,231, 0, 0, 3,255,
- 0, 0, 0, 0,192,168, 99, 9,192, 32,173,184,191, 27, 16,129,141, 28,201, 67,242, 92, 3,255, 0, 0, 0, 0,191, 19, 18,220,
- 64, 98,186,168, 64,148,136, 66,243,101, 77,135,101, 15, 3,255, 0, 0, 0, 0,191, 68,220, 36, 64,132,143, 24, 64,130,105, 20,
-239, 93, 90,190, 88,184, 3,255, 0, 0, 0, 0,191,185,255, 60, 64,108,244,215, 64,138, 7,129,224,143, 80,245, 94, 5, 3,255,
- 0, 0, 0, 0,191,247,202, 46, 64, 27,140, 23, 64,158,252,116,214, 39, 52,179,108,224, 3,255, 0, 0, 0, 0,191,220, 24,190,
- 63,202,163,163, 64,171,244,160,218,157, 35, 57,117, 60, 3,255, 0, 0, 0, 0,191,133,219,227, 64, 17, 47,172, 64,169,160, 93,
-232,130, 49, 92,115,188, 3,255, 0, 0, 0, 0, 62, 50, 45,123, 62,230, 16,213, 64,186,240,160, 4, 25, 9,132,127,147, 3,255,
- 0, 0, 0, 0, 59,172,119,131, 63,162,209,182, 64,183, 73,170, 0, 47, 27,112,125, 5, 3,255, 0, 0, 0, 0,191, 40,230,165,
- 63, 24,111,246, 64,185,150, 50,241,237, 12,238,126,143, 3,255, 0, 0, 0, 0,192, 66,225,100, 63,131,191,146, 64,157, 18,152,
-189, 78, 22,128,106,231, 3,255, 0, 0, 0, 0,192, 80,140, 98, 63,238,205,169, 64,144, 69, 83,184,186, 40,111, 98, 83, 3,255,
- 0, 0, 0, 0,192,109, 39,177, 63,147,213,154, 64,140,143,239,174,199, 25, 9, 95,179, 3,255, 0, 0, 0, 0, 64,128,173,131,
- 64, 14,170, 50, 64,105, 71,247, 87,226, 48,192, 79, 67, 3,255, 0, 0, 0, 0, 64,140,137,202, 64, 33,234, 4, 64, 60,117,152,
- 96, 41, 55, 40, 63,250, 3,255, 0, 0, 0, 0, 64,115,176, 68, 64, 68, 49, 85, 64, 79,173, 65, 83, 78, 66,175, 70,175, 3,255,
- 0, 0, 0, 0, 64, 39, 23, 51, 64, 76,245, 14, 64,132,248,105, 56,227, 69,119, 91, 56, 3,255, 0, 0, 0, 0, 63,254, 75,122,
- 64, 50, 36, 17, 64,152, 70, 83, 44, 3, 60,210,103,169, 3,255, 0, 0, 0, 0, 64, 52,239,190, 64, 22,186,193, 64,145,240,166,
- 61, 89, 51,253, 99,148, 3,255, 0, 0, 0, 0, 63,213,244,249, 63, 52, 33, 10, 64,178, 94,248, 36, 84, 14,253,121,208, 3,255,
- 0, 0, 0, 0, 64, 22, 80,230, 63,141,155, 50, 64,168, 95,108, 50,253, 23,250,114,237, 3,255, 0, 0, 0, 0, 63,194,113, 96,
- 63,195,184,166, 64,174,160, 31, 33, 51, 33, 11,119, 29, 3,255, 0, 0, 0, 0, 63,112,119,228, 64,115, 46, 49, 64,139,222,186,
- 20,104, 83, 35, 95, 40, 3,255, 0, 0, 0, 0, 63,199, 22,221, 64,134,211, 71, 64,113,161, 37, 33,158, 92, 1, 82, 99, 3,255,
- 0, 0, 0, 0, 63, 58,131,170, 64,140,178, 58, 64,115,174,213, 15,151, 96, 55, 82,245, 3,255, 0, 0, 0, 0, 64,132,134,116,
-192, 40,130, 40, 64, 77,207,237, 90,117,198,107, 69,226, 3,255, 0, 0, 0, 0, 64,140,187,232,192, 62, 96, 6, 64, 30,247,107,
- 95,249,190,188, 53,245, 3,255, 0, 0, 0, 0, 64,152, 61, 37,192, 14, 9,230, 64, 39,179,137,103,171,207, 73, 57, 30, 3,255,
- 0, 0, 0, 0, 64,149,121,189,191,111,192,142, 64, 90, 95, 76,101,161,235,149, 75, 20, 3,255, 0, 0, 0, 0, 64,134,112,254,
-190,207,146,126, 64,130, 19,159, 91,241,246,137, 88,139, 3,255, 0, 0, 0, 0, 64,129,129, 12,191,173,129,231, 64,128,125,159,
- 88,194,226,241, 87,133, 3,255, 0, 0, 0, 0, 64, 22,104,220,191, 40,221,204, 64,170,137,115, 50,240,241,167,116,139, 3,255,
- 0, 0, 0, 0, 64, 56,120,245,191,154,213,118, 64,158,227, 81, 62,175,229,209,108,123, 3,255, 0, 0, 0, 0, 64, 66, 56, 52,
-190,139, 40,206, 64,160,116, 21, 65,243,249,237,109,135, 3,255, 0, 0, 0, 0, 64,150,161, 61, 63, 89,221,107, 64, 89,113,118,
-102,216, 18,177, 73,221, 3,255, 0, 0, 0, 0, 64,165,120, 74, 62,167, 78, 95, 64, 48, 51,139,112,202, 7,116, 60, 12, 3,255,
- 0, 0, 0, 0, 64,162, 65, 12, 63,149, 84, 11, 64, 44,202,172,110,196, 25,209, 58,181, 3,255, 0, 0, 0, 0,190,194,138, 67,
-192,138, 97,177, 64,124,158, 75,247,144,161,122, 85,227, 3,255, 0, 0, 0, 0,191, 66, 82,214,192,152,115,128, 64, 85, 25,164,
-239, 15,151,229, 72,130, 3,255, 0, 0, 0, 0, 61,171,155,119,192,155, 40,138, 64, 83, 96,113, 1,128,150, 60, 72, 18, 3,255,
- 0, 0, 0, 0, 63,178,237,144,192,136,136, 25, 64,113, 1,121, 30,139,163, 67, 82,194, 3,255, 0, 0, 0, 0, 63,238,147, 68,
-192,100,230,166, 64,136, 9,234, 40, 40,177,126, 92,197, 3,255, 0, 0, 0, 0, 63,109,149, 30,192,111, 18, 40, 64,141,100,171,
- 20,219,174, 55, 96, 57, 3,255, 0, 0, 0, 0, 63,162,210, 45,191,224,211,233, 64,174, 67,184, 27,187,218, 11,119, 12, 3,255,
- 0, 0, 0, 0, 63, 94,106,158,192, 30,106,167, 64,167,240,254, 19, 27,202, 69,114,151, 3,255, 0, 0, 0, 0, 63,229,114, 22,
-192, 20, 96,193, 64,162,167,253, 38,234,205,163,111, 12, 3,255, 0, 0, 0, 0, 64, 67, 76,208,192,111,120, 62, 64, 85, 89, 14,
- 66,176,174, 60, 72,116, 3,255, 0, 0, 0, 0, 64, 37,220,139,192,141,135,245, 64, 54,173,114, 56,211,159,161, 62, 45, 3,255,
- 0, 0, 0, 0, 64, 84,119,204,192,130, 73, 93, 64, 38,107,212, 72,198,167, 33, 56,119, 3,255, 0, 0, 0, 0,192, 82,218,178,
-191, 1,247,178, 64,154,129,211,183,221,244,252,105, 39, 3,255, 0, 0, 0, 0,192,124,245, 0,190,187, 32, 27, 64,138, 6, 57,
-169,118,248, 80, 93,254, 3,255, 0, 0, 0, 0,192,112, 75, 42,191,152, 42,228, 64,139, 44, 25,174, 0,230, 97, 94,225, 3,255,
- 0, 0, 0, 0,192, 43,222,239,192, 11,226,212, 64,151, 71,227,197,223,208,116,103,165, 3,255, 0, 0, 0, 0,191,229,207,137,
-192, 22, 63, 30, 64,161,235,207,216, 58,205, 29,110,129, 3,255, 0, 0, 0, 0,192, 14, 11,239,191,191,114,175, 64,166,208,254,
-207,123,222,175,113,169, 3,255, 0, 0, 0, 0,189,149, 78,163,191,137, 25, 65, 64,184,102,234,254,202,232,204,125,222, 3,255,
- 0, 0, 0, 0,191,104,203,208,191,113, 6,146, 64,183, 5,108,236,124,235,106,124,207, 3,255, 0, 0, 0, 0,190,251, 68, 26,
-191,228, 38,111, 64,178, 48,114,245,117,217, 98,121,147, 3,255, 0, 0, 0, 0,191,222,169, 76,192,104,107,205, 64,136,142,150,
-217,233,176,151, 92,223, 3,255, 0, 0, 0, 0,192, 39,143,145,192, 94, 49,190, 64,124, 27,165,199, 18,180, 4, 85,213, 3,255,
- 0, 0, 0, 0,192, 6,168,130,192,130,132,190, 64,105, 96, 12,210, 30,166,165, 79, 83, 3,255, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 84, 8,195, 65, 96, 0, 0, 1, 42, 0, 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, 7,248, 48, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 90, 0, 7,248, 48, 32, 0, 0, 0, 55, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 0,162,
- 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 0,162, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0, 42,
- 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 0,164, 0, 0, 0, 35,
- 0, 0, 0, 12, 0, 0, 0,165, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 0,165, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,166,
- 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 0,167, 0, 0, 0, 35, 0, 0, 0, 44,
- 0, 0, 0,167, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0,168, 0, 0, 0, 35,
- 0, 0, 0, 13, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,170,
- 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0,171, 0, 0, 0, 35, 0, 0, 0, 46,
- 0, 0, 0,171, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 0, 47, 0, 0, 0,172, 0, 0, 0, 35,
- 0, 0, 0, 14, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0, 47, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,174,
- 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0, 48,
- 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0,176, 0, 0, 0, 35,
- 0, 0, 0, 15, 0, 0, 0,177, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0,177, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,178,
- 0, 0, 0, 35, 0, 0, 0, 50, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0, 50,
- 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 0,180, 0, 0, 0, 35,
- 0, 0, 0, 16, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,182,
- 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 0,182, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0,183, 0, 0, 0, 35, 0, 0, 0, 52,
- 0, 0, 0,183, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 0,184, 0, 0, 0, 35,
- 0, 0, 0, 17, 0, 0, 0,185, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 0,185, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,186,
- 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 0,186, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0,187, 0, 0, 0, 35, 0, 0, 0, 54,
- 0, 0, 0,187, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 0, 35, 0, 0, 0, 55, 0, 0, 0,188, 0, 0, 0, 35,
- 0, 0, 0, 18, 0, 0, 0,189, 0, 0, 0, 35, 0, 0, 0, 55, 0, 0, 0,189, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,190,
- 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 0,190, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0,191, 0, 0, 0, 35, 0, 0, 0, 56,
- 0, 0, 0,191, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,192, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 0,192, 0, 0, 0, 35,
- 0, 0, 0, 19, 0, 0, 0,193, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 0,193, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,194,
- 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 0,194, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0,195, 0, 0, 0, 35, 0, 0, 0, 58,
- 0, 0, 0,195, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,196, 0, 0, 0, 35, 0, 0, 0, 59, 0, 0, 0,196, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 0,197, 0, 0, 0, 35, 0, 0, 0, 59, 0, 0, 0,197, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,198,
- 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 0,198, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0,199, 0, 0, 0, 35, 0, 0, 0, 60,
- 0, 0, 0,199, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,200, 0, 0, 0, 35, 0, 0, 0, 61, 0, 0, 0,200, 0, 0, 0, 35,
- 0, 0, 0, 21, 0, 0, 0,201, 0, 0, 0, 35, 0, 0, 0, 61, 0, 0, 0,201, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,202,
- 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 0,202, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 0,203, 0, 0, 0, 35, 0, 0, 0, 62,
- 0, 0, 0,203, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,204, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 0,204, 0, 0, 0, 35,
- 0, 0, 0, 22, 0, 0, 0,205, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 0,205, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,206,
- 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 0,206, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 0,207, 0, 0, 0, 35, 0, 0, 0, 64,
- 0, 0, 0,207, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,208, 0, 0, 0, 35, 0, 0, 0, 65, 0, 0, 0,208, 0, 0, 0, 35,
- 0, 0, 0, 23, 0, 0, 0,209, 0, 0, 0, 35, 0, 0, 0, 65, 0, 0, 0,209, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,210,
- 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 0,210, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 0,211, 0, 0, 0, 35, 0, 0, 0, 66,
- 0, 0, 0,211, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,212, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 0,212, 0, 0, 0, 35,
- 0, 0, 0, 24, 0, 0, 0,213, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 0,213, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,214,
- 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 0,214, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 0,215, 0, 0, 0, 35, 0, 0, 0, 68,
- 0, 0, 0,215, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,216, 0, 0, 0, 35, 0, 0, 0, 69, 0, 0, 0,216, 0, 0, 0, 35,
- 0, 0, 0, 25, 0, 0, 0,217, 0, 0, 0, 35, 0, 0, 0, 69, 0, 0, 0,217, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,218,
- 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 0,218, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 0,219, 0, 0, 0, 35, 0, 0, 0, 70,
- 0, 0, 0,219, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,220, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 0,220, 0, 0, 0, 35,
- 0, 0, 0, 26, 0, 0, 0,221, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 0,221, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,222,
- 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 0,222, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 0,223, 0, 0, 0, 35, 0, 0, 0, 72,
- 0, 0, 0,223, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,224, 0, 0, 0, 35, 0, 0, 0, 73, 0, 0, 0,224, 0, 0, 0, 35,
- 0, 0, 0, 27, 0, 0, 0,225, 0, 0, 0, 35, 0, 0, 0, 73, 0, 0, 0,225, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,226,
- 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 0,226, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 0,227, 0, 0, 0, 35, 0, 0, 0, 74,
- 0, 0, 0,227, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,228, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 0,228, 0, 0, 0, 35,
- 0, 0, 0, 28, 0, 0, 0,229, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 0,229, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,230,
- 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 0,230, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0,231, 0, 0, 0, 35, 0, 0, 0, 76,
- 0, 0, 0,231, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,232, 0, 0, 0, 35, 0, 0, 0, 77, 0, 0, 0,232, 0, 0, 0, 35,
- 0, 0, 0, 29, 0, 0, 0,233, 0, 0, 0, 35, 0, 0, 0, 77, 0, 0, 0,233, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,234,
- 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 0,234, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 0,235, 0, 0, 0, 35, 0, 0, 0, 78,
- 0, 0, 0,235, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0,236, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 0,236, 0, 0, 0, 35,
- 0, 0, 0, 30, 0, 0, 0,237, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 0,237, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,238,
- 0, 0, 0, 35, 0, 0, 0, 80, 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0,239, 0, 0, 0, 35, 0, 0, 0, 80,
- 0, 0, 0,239, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0,240, 0, 0, 0, 35, 0, 0, 0, 81, 0, 0, 0,240, 0, 0, 0, 35,
- 0, 0, 0, 31, 0, 0, 0,241, 0, 0, 0, 35, 0, 0, 0, 81, 0, 0, 0,241, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,242,
- 0, 0, 0, 35, 0, 0, 0, 82, 0, 0, 0,242, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 0,243, 0, 0, 0, 35, 0, 0, 0, 82,
- 0, 0, 0,243, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,244, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 0,244, 0, 0, 0, 35,
- 0, 0, 0, 32, 0, 0, 0,245, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 0,245, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,246,
- 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 0,246, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 0,247, 0, 0, 0, 35, 0, 0, 0, 84,
- 0, 0, 0,247, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,248, 0, 0, 0, 35, 0, 0, 0, 85, 0, 0, 0,248, 0, 0, 0, 35,
- 0, 0, 0, 33, 0, 0, 0,249, 0, 0, 0, 35, 0, 0, 0, 85, 0, 0, 0,249, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,250,
- 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 0,250, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0,251, 0, 0, 0, 35, 0, 0, 0, 86,
- 0, 0, 0,251, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,252, 0, 0, 0, 35, 0, 0, 0, 87, 0, 0, 0,252, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0,253, 0, 0, 0, 35, 0, 0, 0, 87, 0, 0, 0,253, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,254,
- 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 0,254, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 0, 35, 0, 0, 0, 88,
- 0, 0, 0,255, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 0, 89, 0, 0, 1, 0, 0, 0, 0, 35,
- 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 0, 35, 0, 0, 0, 89, 0, 0, 1, 1, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 1, 2,
- 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 1, 2, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1, 3, 0, 0, 0, 35, 0, 0, 0, 90,
- 0, 0, 1, 3, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 1, 4, 0, 0, 0, 35, 0, 0, 0, 91, 0, 0, 1, 4, 0, 0, 0, 35,
- 0, 0, 0, 36, 0, 0, 1, 5, 0, 0, 0, 35, 0, 0, 0, 91, 0, 0, 1, 5, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 1, 6,
- 0, 0, 0, 35, 0, 0, 0, 92, 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1, 7, 0, 0, 0, 35, 0, 0, 0, 92,
- 0, 0, 1, 7, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 8, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 1, 8, 0, 0, 0, 35,
- 0, 0, 0, 37, 0, 0, 1, 9, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 1, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 1, 10,
- 0, 0, 0, 35, 0, 0, 0, 94, 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1, 11, 0, 0, 0, 35, 0, 0, 0, 94,
- 0, 0, 1, 11, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 12, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 1, 12, 0, 0, 0, 35,
- 0, 0, 0, 38, 0, 0, 1, 13, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 1, 13, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 1, 14,
- 0, 0, 0, 35, 0, 0, 0, 96, 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1, 15, 0, 0, 0, 35, 0, 0, 0, 96,
- 0, 0, 1, 15, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 16, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 1, 16, 0, 0, 0, 35,
- 0, 0, 0, 39, 0, 0, 1, 17, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 1, 17, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 1, 18,
- 0, 0, 0, 35, 0, 0, 0, 98, 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1, 19, 0, 0, 0, 35, 0, 0, 0, 98,
- 0, 0, 1, 19, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 20, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 1, 20, 0, 0, 0, 35,
- 0, 0, 0, 40, 0, 0, 1, 21, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 1, 21, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 1, 22,
- 0, 0, 0, 35, 0, 0, 0,100, 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1, 23, 0, 0, 0, 35, 0, 0, 0,100,
- 0, 0, 1, 23, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 0,101, 0, 0, 1, 24, 0, 0, 0, 35,
- 0, 0, 0, 41, 0, 0, 1, 25, 0, 0, 0, 35, 0, 0, 0,101, 0, 0, 1, 25, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 26,
- 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1, 26, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 27, 0, 0, 0, 35, 0, 0, 0,102,
- 0, 0, 1, 27, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1, 28, 0, 0, 0, 35,
- 0, 0, 0, 13, 0, 0, 1, 29, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1, 29, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 1, 30,
- 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 31, 0, 0, 0, 35, 0, 0, 0,104,
- 0, 0, 1, 31, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 32, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1, 32, 0, 0, 0, 35,
- 0, 0, 0, 16, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 34,
- 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1, 34, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 35, 0, 0, 0, 35, 0, 0, 0,106,
- 0, 0, 1, 35, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1, 36, 0, 0, 0, 35,
- 0, 0, 0, 16, 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 1, 38,
- 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1, 38, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 39, 0, 0, 0, 35, 0, 0, 0,108,
- 0, 0, 1, 39, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1, 40, 0, 0, 0, 35,
- 0, 0, 0, 17, 0, 0, 1, 41, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1, 41, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 1, 42,
- 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 43, 0, 0, 0, 35, 0, 0, 0,110,
- 0, 0, 1, 43, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 1, 44, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1, 44, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 1, 46,
- 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 47, 0, 0, 0, 35, 0, 0, 0,112,
- 0, 0, 1, 47, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1, 48, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 1, 49, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1, 49, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 50,
- 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1, 50, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 51, 0, 0, 0, 35, 0, 0, 0,114,
- 0, 0, 1, 51, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 52, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1, 52, 0, 0, 0, 35,
- 0, 0, 0, 19, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 54,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 55, 0, 0, 0, 35, 0, 0, 0,116,
- 0, 0, 1, 55, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 1, 56, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1, 56, 0, 0, 0, 35,
- 0, 0, 0, 23, 0, 0, 1, 57, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1, 57, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 1, 58,
- 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1, 58, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1, 59, 0, 0, 0, 35, 0, 0, 0,118,
- 0, 0, 1, 59, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1, 60, 0, 0, 0, 35,
- 0, 0, 0, 23, 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 62,
- 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1, 62, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 63, 0, 0, 0, 35, 0, 0, 0,120,
- 0, 0, 1, 63, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 64, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1, 64, 0, 0, 0, 35,
- 0, 0, 0, 24, 0, 0, 1, 65, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1, 65, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 1, 66,
- 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 0,122,
- 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 68, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1, 68, 0, 0, 0, 35,
- 0, 0, 0, 27, 0, 0, 1, 69, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1, 69, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 70,
- 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1, 70, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 71, 0, 0, 0, 35, 0, 0, 0,124,
- 0, 0, 1, 71, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1, 72, 0, 0, 0, 35,
- 0, 0, 0, 27, 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 1, 74,
- 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1, 74, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1, 75, 0, 0, 0, 35, 0, 0, 0,126,
- 0, 0, 1, 75, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 1, 76, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1, 76, 0, 0, 0, 35,
- 0, 0, 0, 28, 0, 0, 1, 77, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1, 77, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 1, 78,
- 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 0,128,
- 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 80, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 1, 80, 0, 0, 0, 35,
- 0, 0, 0, 31, 0, 0, 1, 81, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 1, 81, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 82,
- 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 1, 82, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1, 83, 0, 0, 0, 35, 0, 0, 0,130,
- 0, 0, 1, 83, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 1, 84, 0, 0, 0, 35,
- 0, 0, 0, 31, 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 1, 86,
- 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 1, 86, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1, 87, 0, 0, 0, 35, 0, 0, 0,132,
- 0, 0, 1, 87, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 1, 88, 0, 0, 0, 35,
- 0, 0, 0, 24, 0, 0, 1, 89, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 1, 89, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 1, 90,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1, 91, 0, 0, 0, 35, 0, 0, 0,134,
- 0, 0, 1, 91, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 92, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 1, 92, 0, 0, 0, 35,
- 0, 0, 0, 33, 0, 0, 1, 93, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 1, 93, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 94,
- 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 95, 0, 0, 0, 35, 0, 0, 0,136,
- 0, 0, 1, 95, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 1, 96, 0, 0, 0, 35,
- 0, 0, 0, 33, 0, 0, 1, 97, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 1, 97, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 1, 98,
- 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 1, 98, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1, 99, 0, 0, 0, 35, 0, 0, 0,138,
- 0, 0, 1, 99, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 1,100, 0, 0, 0, 35,
- 0, 0, 0, 28, 0, 0, 1,101, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 1,101, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 1,102,
- 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1,103, 0, 0, 0, 35, 0, 0, 0,140,
- 0, 0, 1,103, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1,104, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 1,104, 0, 0, 0, 35,
- 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1,106,
- 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1,107, 0, 0, 0, 35, 0, 0, 0,142,
- 0, 0, 1,107, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 1,108, 0, 0, 0, 35,
- 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 1,110,
- 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 1,110, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,111, 0, 0, 0, 35, 0, 0, 0,144,
- 0, 0, 1,111, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1,112, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 1,112, 0, 0, 0, 35,
- 0, 0, 0, 31, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1,114,
- 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,115, 0, 0, 0, 35, 0, 0, 0,146,
- 0, 0, 1,115, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1,116, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 1,116, 0, 0, 0, 35,
- 0, 0, 0, 38, 0, 0, 1,117, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 1,117, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1,118,
- 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 1,118, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,119, 0, 0, 0, 35, 0, 0, 0,148,
- 0, 0, 1,119, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 1,120, 0, 0, 0, 35,
- 0, 0, 0, 38, 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 1,122,
- 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 1,122, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,123, 0, 0, 0, 35, 0, 0, 0,150,
- 0, 0, 1,123, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 1,124, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 1,124, 0, 0, 0, 35,
- 0, 0, 0, 38, 0, 0, 1,125, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 1,125, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1,126,
- 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 0,152,
- 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1,128, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 1,128, 0, 0, 0, 35,
- 0, 0, 0, 40, 0, 0, 1,129, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 1,129, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1,130,
- 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 1,130, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,131, 0, 0, 0, 35, 0, 0, 0,154,
- 0, 0, 1,131, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 1,132, 0, 0, 0, 35,
- 0, 0, 0, 40, 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1,134,
- 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,135, 0, 0, 0, 35, 0, 0, 0,156,
- 0, 0, 1,135, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1,136, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 1,136, 0, 0, 0, 35,
- 0, 0, 0, 40, 0, 0, 1,137, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 1,137, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1,138,
- 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 0,158,
- 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,140, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 1,140, 0, 0, 0, 35,
- 0, 0, 0, 37, 0, 0, 1,141, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 1,141, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,142,
- 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 1,142, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,143, 0, 0, 0, 35, 0, 0, 0,160,
- 0, 0, 1,143, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 1,144, 0, 0, 0, 35,
- 0, 0, 0, 41, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 1,146,
- 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 1,147, 0, 0, 0, 33, 0, 0, 0, 46,
- 0, 0, 1,147, 0, 0, 0, 33, 0, 0, 0, 43, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,148, 0, 0, 0, 35,
- 0, 0, 0,102, 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1,150,
- 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 0,104,
- 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 1,152, 0, 0, 0, 33, 0, 0, 0, 47, 0, 0, 1,152, 0, 0, 0, 33,
- 0, 0, 0, 47, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 1,154,
- 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 0,103,
- 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1,156, 0, 0, 0, 35,
- 0, 0, 0, 42, 0, 0, 1,157, 0, 0, 0, 33, 0, 0, 0, 44, 0, 0, 1,157, 0, 0, 0, 33, 0, 0, 0, 50, 0, 0, 1,158,
- 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,158, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 1,159, 0, 0, 0, 33, 0, 0, 0, 50,
- 0, 0, 1,159, 0, 0, 0, 33, 0, 0, 0, 43, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,160, 0, 0, 0, 35,
- 0, 0, 0,105, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1,162,
- 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 0,107,
- 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,164, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 1,164, 0, 0, 0, 33,
- 0, 0, 0, 51, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,166,
- 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 0,106,
- 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1,168, 0, 0, 0, 35,
- 0, 0, 0, 42, 0, 0, 1,169, 0, 0, 0, 33, 0, 0, 0, 48, 0, 0, 1,169, 0, 0, 0, 33, 0, 0, 0, 54, 0, 0, 1,170,
- 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 1,171, 0, 0, 0, 33, 0, 0, 0, 54,
- 0, 0, 1,171, 0, 0, 0, 33, 0, 0, 0, 45, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,172, 0, 0, 0, 35,
- 0, 0, 0,108, 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1,174,
- 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 0,110,
- 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 1,176, 0, 0, 0, 33, 0, 0, 0, 55, 0, 0, 1,176, 0, 0, 0, 33,
- 0, 0, 0, 55, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 1,178,
- 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 0,109,
- 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1,180, 0, 0, 0, 35,
- 0, 0, 0, 44, 0, 0, 1,181, 0, 0, 0, 33, 0, 0, 0, 52, 0, 0, 1,181, 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 1,182,
- 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 1,183, 0, 0, 0, 33, 0, 0, 0, 58,
- 0, 0, 1,183, 0, 0, 0, 33, 0, 0, 0, 53, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,184, 0, 0, 0, 35,
- 0, 0, 0,111, 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1,186,
- 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 0,113,
- 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 1,188, 0, 0, 0, 33, 0, 0, 0, 59, 0, 0, 1,188, 0, 0, 0, 33,
- 0, 0, 0, 59, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 1,190,
- 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 0,112,
- 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1,192, 0, 0, 0, 35,
- 0, 0, 0, 52, 0, 0, 1,193, 0, 0, 0, 33, 0, 0, 0, 56, 0, 0, 1,193, 0, 0, 0, 33, 0, 0, 0, 60, 0, 0, 1,194,
- 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 1,195, 0, 0, 0, 33, 0, 0, 0, 60,
- 0, 0, 1,195, 0, 0, 0, 33, 0, 0, 0, 57, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,196, 0, 0, 0, 35,
- 0, 0, 0,114, 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1,198,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 0,116,
- 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,200, 0, 0, 0, 33, 0, 0, 0, 61, 0, 0, 1,200, 0, 0, 0, 33,
- 0, 0, 0, 61, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,202,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 0,115,
- 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1,204, 0, 0, 0, 35,
- 0, 0, 0, 48, 0, 0, 1,205, 0, 0, 0, 33, 0, 0, 0, 56, 0, 0, 1,205, 0, 0, 0, 33, 0, 0, 0, 64, 0, 0, 1,206,
- 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,206, 0, 0, 0, 35, 0, 0, 0, 50, 0, 0, 1,207, 0, 0, 0, 33, 0, 0, 0, 64,
- 0, 0, 1,207, 0, 0, 0, 33, 0, 0, 0, 50, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,208, 0, 0, 0, 35,
- 0, 0, 0,117, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1,210,
- 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 0,119,
- 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 1,212, 0, 0, 0, 33, 0, 0, 0, 65, 0, 0, 1,212, 0, 0, 0, 33,
- 0, 0, 0, 65, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 1,214,
- 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 0,118,
- 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1,216, 0, 0, 0, 35,
- 0, 0, 0, 51, 0, 0, 1,217, 0, 0, 0, 33, 0, 0, 0, 62, 0, 0, 1,217, 0, 0, 0, 33, 0, 0, 0, 68, 0, 0, 1,218,
- 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,218, 0, 0, 0, 35, 0, 0, 0, 47, 0, 0, 1,219, 0, 0, 0, 33, 0, 0, 0, 68,
- 0, 0, 1,219, 0, 0, 0, 33, 0, 0, 0, 47, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,220, 0, 0, 0, 35,
- 0, 0, 0,120, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1,222,
- 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 0,122,
- 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 1,224, 0, 0, 0, 33, 0, 0, 0, 69, 0, 0, 1,224, 0, 0, 0, 33,
- 0, 0, 0, 69, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 1,226,
- 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 0,121,
- 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1,228, 0, 0, 0, 35,
- 0, 0, 0, 46, 0, 0, 1,229, 0, 0, 0, 33, 0, 0, 0, 66, 0, 0, 1,229, 0, 0, 0, 33, 0, 0, 0, 72, 0, 0, 1,230,
- 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,230, 0, 0, 0, 35, 0, 0, 0, 55, 0, 0, 1,231, 0, 0, 0, 33, 0, 0, 0, 72,
- 0, 0, 1,231, 0, 0, 0, 33, 0, 0, 0, 55, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,232, 0, 0, 0, 35,
- 0, 0, 0,123, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1,234,
- 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 0,125,
- 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 1,236, 0, 0, 0, 33, 0, 0, 0, 73, 0, 0, 1,236, 0, 0, 0, 33,
- 0, 0, 0, 73, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 1,238,
- 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 0,124,
- 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1,240, 0, 0, 0, 35,
- 0, 0, 0, 54, 0, 0, 1,241, 0, 0, 0, 33, 0, 0, 0, 70, 0, 0, 1,241, 0, 0, 0, 33, 0, 0, 0, 76, 0, 0, 1,242,
- 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,242, 0, 0, 0, 35, 0, 0, 0, 59, 0, 0, 1,243, 0, 0, 0, 33, 0, 0, 0, 76,
- 0, 0, 1,243, 0, 0, 0, 33, 0, 0, 0, 59, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,244, 0, 0, 0, 35,
- 0, 0, 0,126, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1,246,
- 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 0,128,
- 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 1,248, 0, 0, 0, 33, 0, 0, 0, 77, 0, 0, 1,248, 0, 0, 0, 33,
- 0, 0, 0, 77, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 1,250,
- 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 0,127,
- 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1,252, 0, 0, 0, 35,
- 0, 0, 0, 58, 0, 0, 1,253, 0, 0, 0, 33, 0, 0, 0, 74, 0, 0, 1,253, 0, 0, 0, 33, 0, 0, 0, 80, 0, 0, 1,254,
- 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 1,254, 0, 0, 0, 35, 0, 0, 0, 61, 0, 0, 1,255, 0, 0, 0, 33, 0, 0, 0, 80,
- 0, 0, 1,255, 0, 0, 0, 33, 0, 0, 0, 61, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 2, 0, 0, 0, 0, 35,
- 0, 0, 0,129, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 2, 2,
- 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 0,131,
- 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 4, 0, 0, 0, 33, 0, 0, 0, 81, 0, 0, 2, 4, 0, 0, 0, 33,
- 0, 0, 0, 81, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 6,
- 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 0,130,
- 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 2, 8, 0, 0, 0, 35,
- 0, 0, 0, 60, 0, 0, 2, 9, 0, 0, 0, 33, 0, 0, 0, 78, 0, 0, 2, 9, 0, 0, 0, 33, 0, 0, 0, 83, 0, 0, 2, 10,
- 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0, 65, 0, 0, 2, 11, 0, 0, 0, 33, 0, 0, 0, 83,
- 0, 0, 2, 11, 0, 0, 0, 33, 0, 0, 0, 65, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 12, 0, 0, 0, 35,
- 0, 0, 0,132, 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 2, 14,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 0,134,
- 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 2, 16, 0, 0, 0, 33, 0, 0, 0, 82, 0, 0, 2, 16, 0, 0, 0, 33,
- 0, 0, 0, 82, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 2, 18,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 0,133,
- 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 2, 20, 0, 0, 0, 35,
- 0, 0, 0, 64, 0, 0, 2, 21, 0, 0, 0, 33, 0, 0, 0, 66, 0, 0, 2, 21, 0, 0, 0, 33, 0, 0, 0, 84, 0, 0, 2, 22,
- 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0, 69, 0, 0, 2, 23, 0, 0, 0, 33, 0, 0, 0, 84,
- 0, 0, 2, 23, 0, 0, 0, 33, 0, 0, 0, 69, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 24, 0, 0, 0, 35,
- 0, 0, 0,135, 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 2, 26,
- 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 0,137,
- 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 2, 28, 0, 0, 0, 33, 0, 0, 0, 85, 0, 0, 2, 28, 0, 0, 0, 33,
- 0, 0, 0, 85, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 2, 30,
- 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 0,136,
- 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 2, 32, 0, 0, 0, 35,
- 0, 0, 0, 68, 0, 0, 2, 33, 0, 0, 0, 33, 0, 0, 0, 70, 0, 0, 2, 33, 0, 0, 0, 33, 0, 0, 0, 86, 0, 0, 2, 34,
- 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0, 73, 0, 0, 2, 35, 0, 0, 0, 33, 0, 0, 0, 86,
- 0, 0, 2, 35, 0, 0, 0, 33, 0, 0, 0, 73, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 36, 0, 0, 0, 35,
- 0, 0, 0,138, 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 2, 38,
- 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 0,140,
- 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 2, 40, 0, 0, 0, 33, 0, 0, 0, 87, 0, 0, 2, 40, 0, 0, 0, 33,
- 0, 0, 0, 87, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 2, 42,
- 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 0,139,
- 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 2, 44, 0, 0, 0, 35,
- 0, 0, 0, 72, 0, 0, 2, 45, 0, 0, 0, 33, 0, 0, 0, 74, 0, 0, 2, 45, 0, 0, 0, 33, 0, 0, 0, 88, 0, 0, 2, 46,
- 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0, 77, 0, 0, 2, 47, 0, 0, 0, 33, 0, 0, 0, 88,
- 0, 0, 2, 47, 0, 0, 0, 33, 0, 0, 0, 77, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 48, 0, 0, 0, 35,
- 0, 0, 0,141, 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 2, 50,
- 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 0,143,
- 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 52, 0, 0, 0, 33, 0, 0, 0, 89, 0, 0, 2, 52, 0, 0, 0, 33,
- 0, 0, 0, 89, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 54,
- 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 0,142,
- 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 2, 56, 0, 0, 0, 35,
- 0, 0, 0, 76, 0, 0, 2, 57, 0, 0, 0, 33, 0, 0, 0, 78, 0, 0, 2, 57, 0, 0, 0, 33, 0, 0, 0, 90, 0, 0, 2, 58,
- 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 0, 81, 0, 0, 2, 59, 0, 0, 0, 33, 0, 0, 0, 90,
- 0, 0, 2, 59, 0, 0, 0, 33, 0, 0, 0, 81, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 60, 0, 0, 0, 35,
- 0, 0, 0,144, 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 2, 62,
- 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 0,146,
- 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 2, 64, 0, 0, 0, 33, 0, 0, 0, 91, 0, 0, 2, 64, 0, 0, 0, 33,
- 0, 0, 0, 91, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 2, 66,
- 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 0,145,
- 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 0, 80, 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 2, 68, 0, 0, 0, 35,
- 0, 0, 0, 62, 0, 0, 2, 69, 0, 0, 0, 33, 0, 0, 0, 80, 0, 0, 2, 69, 0, 0, 0, 33, 0, 0, 0, 94, 0, 0, 2, 70,
- 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 70, 0, 0, 0, 35, 0, 0, 0, 82, 0, 0, 2, 71, 0, 0, 0, 33, 0, 0, 0, 94,
- 0, 0, 2, 71, 0, 0, 0, 33, 0, 0, 0, 82, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 72, 0, 0, 0, 35,
- 0, 0, 0,147, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 2, 74,
- 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 0,149,
- 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 2, 76, 0, 0, 0, 33, 0, 0, 0, 95, 0, 0, 2, 76, 0, 0, 0, 33,
- 0, 0, 0, 95, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 2, 78,
- 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 0, 92, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 0,148,
- 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 2, 80, 0, 0, 0, 35,
- 0, 0, 0, 83, 0, 0, 2, 81, 0, 0, 0, 33, 0, 0, 0, 92, 0, 0, 2, 81, 0, 0, 0, 33, 0, 0, 0, 96, 0, 0, 2, 82,
- 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 82, 0, 0, 0, 35, 0, 0, 0, 85, 0, 0, 2, 83, 0, 0, 0, 33, 0, 0, 0, 96,
- 0, 0, 2, 83, 0, 0, 0, 33, 0, 0, 0, 85, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 84, 0, 0, 0, 35,
- 0, 0, 0,150, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 2, 86,
- 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 0,152,
- 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 2, 88, 0, 0, 0, 33, 0, 0, 0, 97, 0, 0, 2, 88, 0, 0, 0, 33,
- 0, 0, 0, 97, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 2, 90,
- 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 0, 94, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 0,151,
- 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 2, 92, 0, 0, 0, 35,
- 0, 0, 0, 84, 0, 0, 2, 93, 0, 0, 0, 33, 0, 0, 0, 94, 0, 0, 2, 93, 0, 0, 0, 33, 0, 0, 0, 98, 0, 0, 2, 94,
- 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 94, 0, 0, 0, 35, 0, 0, 0, 87, 0, 0, 2, 95, 0, 0, 0, 33, 0, 0, 0, 98,
- 0, 0, 2, 95, 0, 0, 0, 33, 0, 0, 0, 87, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 96, 0, 0, 0, 35,
- 0, 0, 0,153, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 2, 98,
- 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 0,155,
- 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 2,100, 0, 0, 0, 33, 0, 0, 0, 99, 0, 0, 2,100, 0, 0, 0, 33,
- 0, 0, 0, 99, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 2,102,
- 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 0, 96, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 0,154,
- 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 2,104, 0, 0, 0, 35,
- 0, 0, 0, 86, 0, 0, 2,105, 0, 0, 0, 33, 0, 0, 0, 96, 0, 0, 2,105, 0, 0, 0, 33, 0, 0, 0,100, 0, 0, 2,106,
- 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,106, 0, 0, 0, 35, 0, 0, 0, 89, 0, 0, 2,107, 0, 0, 0, 33, 0, 0, 0,100,
- 0, 0, 2,107, 0, 0, 0, 33, 0, 0, 0, 89, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,108, 0, 0, 0, 35,
- 0, 0, 0,156, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 2,110,
- 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 0,158,
- 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 2,112, 0, 0, 0, 33, 0, 0, 0,101, 0, 0, 2,112, 0, 0, 0, 33,
- 0, 0, 0,101, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 2,114,
- 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 0, 98, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 0,157,
- 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 2,116, 0, 0, 0, 35,
- 0, 0, 0, 88, 0, 0, 2,117, 0, 0, 0, 33, 0, 0, 0, 98, 0, 0, 2,117, 0, 0, 0, 33, 0, 0, 0, 92, 0, 0, 2,118,
- 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,118, 0, 0, 0, 35, 0, 0, 0, 91, 0, 0, 2,119, 0, 0, 0, 33, 0, 0, 0, 92,
- 0, 0, 2,119, 0, 0, 0, 33, 0, 0, 0, 91, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,120, 0, 0, 0, 35,
- 0, 0, 0,159, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 2,122,
- 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 0,161,
- 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 2,124, 0, 0, 0, 33, 0, 0, 0,101, 0, 0, 2,124, 0, 0, 0, 33,
- 0, 0, 0, 93, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 0,101, 0, 0, 2,126,
- 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 0,100, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 0,160,
- 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 2,128, 0, 0, 0, 35,
- 0, 0, 0, 90, 0, 0, 2,129, 0, 0, 0, 33, 0, 0, 0,100, 0, 0, 2,129, 0, 0, 0, 33, 0, 0, 1, 27, 0, 0, 1,146,
- 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1, 27, 0, 0, 0, 35, 0, 0, 1,146,
- 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 1,147, 0, 0, 1,148, 0, 0, 0, 35,
- 0, 0, 0,165, 0, 0, 1, 26, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 1, 26, 0, 0, 1,148,
- 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0,170,
- 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 1, 26, 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 1, 28, 0, 0, 1,149, 0, 0, 0, 35,
- 0, 0, 1, 26, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 1,149, 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 1,149, 0, 0, 1,151,
- 0, 0, 0, 35, 0, 0, 1,150, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 27, 0, 0, 1, 31, 0, 0, 0, 35, 0, 0, 1, 31,
- 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 27, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 30, 0, 0, 1,150, 0, 0, 0, 35,
- 0, 0, 1, 29, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 1, 29, 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 1,152,
- 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 1,152, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 1,152,
- 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 1,152, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 1,153, 0, 0, 1,154, 0, 0, 0, 35,
- 0, 0, 0,169, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 1, 30, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 1,154,
- 0, 0, 0, 35, 0, 0, 1, 31, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 1, 31, 0, 0, 0, 35, 0, 0, 0,173,
- 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 1, 29, 0, 0, 1,155, 0, 0, 0, 35,
- 0, 0, 0,167, 0, 0, 1, 29, 0, 0, 0, 35, 0, 0, 1,155, 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 1,155, 0, 0, 1,157,
- 0, 0, 0, 35, 0, 0, 1,156, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0,162,
- 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 1,156, 0, 0, 0, 35,
- 0, 0, 0,163, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 1, 28, 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 1, 33, 0, 0, 1,158,
- 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1,158, 0, 0, 0, 35, 0, 0, 1,158,
- 0, 0, 1,159, 0, 0, 0, 35, 0, 0, 1,159, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 1,158, 0, 0, 1,160, 0, 0, 0, 35,
- 0, 0, 0,165, 0, 0, 1, 32, 0, 0, 0, 35, 0, 0, 1, 32, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 1,160,
- 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 1,159, 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 1,159, 0, 0, 0, 35, 0, 0, 0,164,
- 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 1, 32, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 1, 32, 0, 0, 1, 34, 0, 0, 0, 35,
- 0, 0, 1, 34, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 1,161, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 1,162, 0, 0, 1,163,
- 0, 0, 0, 35, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 33, 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 1, 33,
- 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 37, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 36, 0, 0, 1,162, 0, 0, 0, 35,
- 0, 0, 1, 35, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 1, 35, 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 1,164,
- 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 1,164, 0, 0, 0, 35, 0, 0, 1,164,
- 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 1,165, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 1,164, 0, 0, 1,166, 0, 0, 0, 35,
- 0, 0, 0,177, 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 1, 36, 0, 0, 1,166,
- 0, 0, 0, 35, 0, 0, 1, 37, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0,181,
- 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1, 35, 0, 0, 0, 35,
- 0, 0, 1, 35, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 1,167, 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 1,168, 0, 0, 1,169,
- 0, 0, 0, 35, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0,174,
- 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 1,168, 0, 0, 0, 35,
- 0, 0, 1, 34, 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 1, 34, 0, 0, 0, 35, 0, 0, 1, 39, 0, 0, 1,170,
- 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1, 39, 0, 0, 0, 35, 0, 0, 1,170,
- 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 1,170, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 1,171, 0, 0, 1,172, 0, 0, 0, 35,
- 0, 0, 0,169, 0, 0, 1, 38, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 1, 38, 0, 0, 1,172,
- 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 0,186, 0, 0, 0, 35, 0, 0, 0,186,
- 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 1, 38, 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 1, 40, 0, 0, 1,173, 0, 0, 0, 35,
- 0, 0, 1, 38, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 1,173, 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 1,173, 0, 0, 1,175,
- 0, 0, 0, 35, 0, 0, 1,174, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 39, 0, 0, 1, 43, 0, 0, 0, 35, 0, 0, 1, 43,
- 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 39, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 42, 0, 0, 1,174, 0, 0, 0, 35,
- 0, 0, 1, 41, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 1, 41, 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 1,176,
- 0, 0, 0, 35, 0, 0, 0,188, 0, 0, 1,176, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 0,188, 0, 0, 0, 35, 0, 0, 1,176,
- 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 1,177, 0, 0, 1,178, 0, 0, 0, 35,
- 0, 0, 0,185, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 1, 42, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 1,178,
- 0, 0, 0, 35, 0, 0, 1, 43, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,189, 0, 0, 1, 43, 0, 0, 0, 35, 0, 0, 0,189,
- 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 1, 41, 0, 0, 1,179, 0, 0, 0, 35,
- 0, 0, 0,183, 0, 0, 1, 41, 0, 0, 0, 35, 0, 0, 1,179, 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 1,179, 0, 0, 1,181,
- 0, 0, 0, 35, 0, 0, 1,180, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,182, 0, 0, 0, 35, 0, 0, 0,166,
- 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,182, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 1,180, 0, 0, 0, 35,
- 0, 0, 0,167, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 1, 40, 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 1, 45, 0, 0, 1,182,
- 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 1,182,
- 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 1,182, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 1,183, 0, 0, 1,184, 0, 0, 0, 35,
- 0, 0, 0,185, 0, 0, 1, 44, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 1, 44, 0, 0, 1,184,
- 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 0,194, 0, 0, 0, 35, 0, 0, 0,194,
- 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 1, 44, 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 1, 46, 0, 0, 1,185, 0, 0, 0, 35,
- 0, 0, 1, 44, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 1,185, 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 1,185, 0, 0, 1,187,
- 0, 0, 0, 35, 0, 0, 1,186, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 45, 0, 0, 1, 49, 0, 0, 0, 35, 0, 0, 1, 49,
- 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 45, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 48, 0, 0, 1,186, 0, 0, 0, 35,
- 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 1, 47, 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 1,188,
- 0, 0, 0, 35, 0, 0, 0,196, 0, 0, 1,188, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 0,196, 0, 0, 0, 35, 0, 0, 1,188,
- 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 1,189, 0, 0, 1,190, 0, 0, 0, 35,
- 0, 0, 0,193, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 1, 48, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 0,193, 0, 0, 1,190,
- 0, 0, 0, 35, 0, 0, 1, 49, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,197, 0, 0, 1, 49, 0, 0, 0, 35, 0, 0, 0,197,
- 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,191, 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 1, 47, 0, 0, 1,191, 0, 0, 0, 35,
- 0, 0, 0,191, 0, 0, 1, 47, 0, 0, 0, 35, 0, 0, 1,191, 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 1,191, 0, 0, 1,193,
- 0, 0, 0, 35, 0, 0, 1,192, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,182, 0, 0, 0,190, 0, 0, 0, 35, 0, 0, 0,182,
- 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,190, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 1,192, 0, 0, 0, 35,
- 0, 0, 0,183, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 1, 46, 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 1, 51, 0, 0, 1,194,
- 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1, 51, 0, 0, 0, 35, 0, 0, 1,194,
- 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 1,194, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 1,195, 0, 0, 1,196, 0, 0, 0, 35,
- 0, 0, 0,193, 0, 0, 1, 50, 0, 0, 0, 35, 0, 0, 0,193, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 1, 50, 0, 0, 1,196,
- 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 0,198, 0, 0, 0, 35, 0, 0, 0,198,
- 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 1, 50, 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 1, 53, 0, 0, 1,197, 0, 0, 0, 35,
- 0, 0, 1, 50, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 1,197, 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 1,197, 0, 0, 1,199,
- 0, 0, 0, 35, 0, 0, 1,198, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 51, 0, 0, 1, 55, 0, 0, 0, 35, 0, 0, 1, 55,
- 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 51, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 54, 0, 0, 1,198, 0, 0, 0, 35,
- 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 1, 52, 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 1,200,
- 0, 0, 0, 35, 0, 0, 0,200, 0, 0, 1,200, 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,200, 0, 0, 0, 35, 0, 0, 1,200,
- 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 1,201, 0, 0, 1,202, 0, 0, 0, 35,
- 0, 0, 0,177, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 1, 54, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 1,202,
- 0, 0, 0, 35, 0, 0, 1, 55, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,201, 0, 0, 1, 55, 0, 0, 0, 35, 0, 0, 0,201,
- 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 1, 52, 0, 0, 1,203, 0, 0, 0, 35,
- 0, 0, 0,175, 0, 0, 1, 52, 0, 0, 0, 35, 0, 0, 1,203, 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 1,203, 0, 0, 1,205,
- 0, 0, 0, 35, 0, 0, 1,204, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 0,190, 0, 0, 0, 35, 0, 0, 0,190,
- 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,191, 0, 0, 1,204, 0, 0, 0, 35,
- 0, 0, 0,191, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 1, 53, 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 1, 57, 0, 0, 1,206,
- 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 1, 57, 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 1,206, 0, 0, 0, 35, 0, 0, 1,206,
- 0, 0, 1,207, 0, 0, 0, 35, 0, 0, 1,207, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 1,206, 0, 0, 1,208, 0, 0, 0, 35,
- 0, 0, 0,179, 0, 0, 1, 56, 0, 0, 0, 35, 0, 0, 1, 56, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1,208,
- 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 1,207, 0, 0, 0, 35, 0, 0, 0,206, 0, 0, 1,207, 0, 0, 0, 35, 0, 0, 0,178,
- 0, 0, 0,206, 0, 0, 0, 35, 0, 0, 1, 56, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 1, 56, 0, 0, 1, 58, 0, 0, 0, 35,
- 0, 0, 1, 58, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 1,209, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 1,210, 0, 0, 1,211,
- 0, 0, 0, 35, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 57, 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 1, 57,
- 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 61, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 60, 0, 0, 1,210, 0, 0, 0, 35,
- 0, 0, 1, 59, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 1, 59, 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 1,212,
- 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 0,208, 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 1,212, 0, 0, 0, 35, 0, 0, 1,212,
- 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 1,213, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 35,
- 0, 0, 0,205, 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0,205, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 1, 60, 0, 0, 1,214,
- 0, 0, 0, 35, 0, 0, 1, 61, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0,209,
- 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 1, 59, 0, 0, 0, 35,
- 0, 0, 1, 59, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 1,215, 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 1,216, 0, 0, 1,217,
- 0, 0, 0, 35, 0, 0, 1,215, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 0,202, 0, 0, 0, 35, 0, 0, 0,202,
- 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1,216, 0, 0, 0, 35,
- 0, 0, 1, 58, 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1, 58, 0, 0, 0, 35, 0, 0, 1, 63, 0, 0, 1,218,
- 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 1, 63, 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 1,218, 0, 0, 0, 35, 0, 0, 1,218,
- 0, 0, 1,219, 0, 0, 0, 35, 0, 0, 1,219, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 1,218, 0, 0, 1,220, 0, 0, 0, 35,
- 0, 0, 0,173, 0, 0, 1, 62, 0, 0, 0, 35, 0, 0, 1, 62, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 1,220,
- 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 1,219, 0, 0, 0, 35, 0, 0, 0,214, 0, 0, 1,219, 0, 0, 0, 35, 0, 0, 0,172,
- 0, 0, 0,214, 0, 0, 0, 35, 0, 0, 1, 62, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 0, 35,
- 0, 0, 1, 64, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 1,221, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 1,222, 0, 0, 1,223,
- 0, 0, 0, 35, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 63, 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 1, 63,
- 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 67, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 66, 0, 0, 1,222, 0, 0, 0, 35,
- 0, 0, 1, 65, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 1, 65, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 1,224,
- 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 0,216, 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 1,224, 0, 0, 0, 35, 0, 0, 1,224,
- 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 1,225, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 1,224, 0, 0, 1,226, 0, 0, 0, 35,
- 0, 0, 0,213, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0,213, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 1, 66, 0, 0, 1,226,
- 0, 0, 0, 35, 0, 0, 1, 67, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0,217,
- 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 1, 65, 0, 0, 0, 35,
- 0, 0, 1, 65, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 1,227, 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 1,228, 0, 0, 1,229,
- 0, 0, 0, 35, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,170, 0, 0, 0,210, 0, 0, 0, 35, 0, 0, 0,210,
- 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,170, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1,228, 0, 0, 0, 35,
- 0, 0, 1, 64, 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1, 64, 0, 0, 0, 35, 0, 0, 1, 69, 0, 0, 1,230,
- 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 1, 69, 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 1,230, 0, 0, 0, 35, 0, 0, 1,230,
- 0, 0, 1,231, 0, 0, 0, 35, 0, 0, 1,231, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 0, 35,
- 0, 0, 0,189, 0, 0, 1, 68, 0, 0, 0, 35, 0, 0, 1, 68, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,189, 0, 0, 1,232,
- 0, 0, 0, 35, 0, 0, 0,188, 0, 0, 1,231, 0, 0, 0, 35, 0, 0, 0,222, 0, 0, 1,231, 0, 0, 0, 35, 0, 0, 0,188,
- 0, 0, 0,222, 0, 0, 0, 35, 0, 0, 1, 68, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 1, 68, 0, 0, 1, 70, 0, 0, 0, 35,
- 0, 0, 1, 70, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 1,233, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 1,234, 0, 0, 1,235,
- 0, 0, 0, 35, 0, 0, 1,233, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 69, 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 1, 69,
- 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 73, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 72, 0, 0, 1,234, 0, 0, 0, 35,
- 0, 0, 1, 71, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 1, 71, 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 1,236,
- 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 0,224, 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 1,236, 0, 0, 0, 35, 0, 0, 1,236,
- 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 1,237, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 1,236, 0, 0, 1,238, 0, 0, 0, 35,
- 0, 0, 0,221, 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0,221, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 1, 72, 0, 0, 1,238,
- 0, 0, 0, 35, 0, 0, 1, 73, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0,225,
- 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 1, 71, 0, 0, 0, 35,
- 0, 0, 1, 71, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 1,239, 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 1,240, 0, 0, 1,241,
- 0, 0, 0, 35, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,186, 0, 0, 0,218, 0, 0, 0, 35, 0, 0, 0,218,
- 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,186, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1,240, 0, 0, 0, 35,
- 0, 0, 1, 70, 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1, 70, 0, 0, 0, 35, 0, 0, 1, 75, 0, 0, 1,242,
- 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 1, 75, 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 1,242, 0, 0, 0, 35, 0, 0, 1,242,
- 0, 0, 1,243, 0, 0, 0, 35, 0, 0, 1,243, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 1,242, 0, 0, 1,244, 0, 0, 0, 35,
- 0, 0, 0,197, 0, 0, 1, 74, 0, 0, 0, 35, 0, 0, 1, 74, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,197, 0, 0, 1,244,
- 0, 0, 0, 35, 0, 0, 0,196, 0, 0, 1,243, 0, 0, 0, 35, 0, 0, 0,230, 0, 0, 1,243, 0, 0, 0, 35, 0, 0, 0,196,
- 0, 0, 0,230, 0, 0, 0, 35, 0, 0, 1, 74, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 1, 74, 0, 0, 1, 76, 0, 0, 0, 35,
- 0, 0, 1, 76, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 1,245, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 1,246, 0, 0, 1,247,
- 0, 0, 0, 35, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 75, 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 1, 75,
- 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 79, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 78, 0, 0, 1,246, 0, 0, 0, 35,
- 0, 0, 1, 77, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 1, 77, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 1,248,
- 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 0,232, 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 1,248, 0, 0, 0, 35, 0, 0, 1,248,
- 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 1,249, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 1,248, 0, 0, 1,250, 0, 0, 0, 35,
- 0, 0, 0,229, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0,229, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 1, 78, 0, 0, 1,250,
- 0, 0, 0, 35, 0, 0, 1, 79, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0,233,
- 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 1, 77, 0, 0, 0, 35,
- 0, 0, 1, 77, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 1,251, 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 1,252, 0, 0, 1,253,
- 0, 0, 0, 35, 0, 0, 1,251, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,194, 0, 0, 0,226, 0, 0, 0, 35, 0, 0, 0,226,
- 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,194, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1,252, 0, 0, 0, 35,
- 0, 0, 1, 76, 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1, 76, 0, 0, 0, 35, 0, 0, 1, 81, 0, 0, 1,254,
- 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 1, 81, 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 1,254, 0, 0, 0, 35, 0, 0, 1,254,
- 0, 0, 1,255, 0, 0, 0, 35, 0, 0, 1,255, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 1,254, 0, 0, 2, 0, 0, 0, 0, 35,
- 0, 0, 0,201, 0, 0, 1, 80, 0, 0, 0, 35, 0, 0, 1, 80, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,201, 0, 0, 2, 0,
- 0, 0, 0, 35, 0, 0, 0,200, 0, 0, 1,255, 0, 0, 0, 35, 0, 0, 0,238, 0, 0, 1,255, 0, 0, 0, 35, 0, 0, 0,200,
- 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 1, 80, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 1, 80, 0, 0, 1, 82, 0, 0, 0, 35,
- 0, 0, 1, 82, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 2, 1, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 2, 2, 0, 0, 2, 3,
- 0, 0, 0, 35, 0, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 81, 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 1, 81,
- 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 85, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 84, 0, 0, 2, 2, 0, 0, 0, 35,
- 0, 0, 1, 83, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 1, 83, 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 2, 4,
- 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 0,240, 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 2, 4, 0, 0, 0, 35, 0, 0, 2, 4,
- 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 2, 5, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 2, 4, 0, 0, 2, 6, 0, 0, 0, 35,
- 0, 0, 0,237, 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0,237, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 1, 84, 0, 0, 2, 6,
- 0, 0, 0, 35, 0, 0, 1, 85, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0,241,
- 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 1, 83, 0, 0, 0, 35,
- 0, 0, 1, 83, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 2, 7, 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 2, 8, 0, 0, 2, 9,
- 0, 0, 0, 35, 0, 0, 2, 7, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,198, 0, 0, 0,234, 0, 0, 0, 35, 0, 0, 0,234,
- 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,198, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 2, 8, 0, 0, 0, 35,
- 0, 0, 1, 82, 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1, 82, 0, 0, 0, 35, 0, 0, 1, 87, 0, 0, 2, 10,
- 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 1, 87, 0, 0, 0, 35, 0, 0, 2, 10,
- 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 2, 10, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 2, 11, 0, 0, 2, 12, 0, 0, 0, 35,
- 0, 0, 0,209, 0, 0, 1, 86, 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 1, 86, 0, 0, 2, 12,
- 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 0,244, 0, 0, 0, 35, 0, 0, 0,244,
- 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 1, 86, 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 1, 88, 0, 0, 2, 13, 0, 0, 0, 35,
- 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 2, 13, 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 2, 13, 0, 0, 2, 15,
- 0, 0, 0, 35, 0, 0, 2, 14, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 87, 0, 0, 1, 91, 0, 0, 0, 35, 0, 0, 1, 91,
- 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 87, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 90, 0, 0, 2, 14, 0, 0, 0, 35,
- 0, 0, 1, 89, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 1, 89, 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 2, 16,
- 0, 0, 0, 35, 0, 0, 0,242, 0, 0, 2, 16, 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 0,242, 0, 0, 0, 35, 0, 0, 2, 16,
- 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 2, 16, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 2, 17, 0, 0, 2, 18, 0, 0, 0, 35,
- 0, 0, 0,213, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 1, 90, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 0,213, 0, 0, 2, 18,
- 0, 0, 0, 35, 0, 0, 1, 91, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,243, 0, 0, 1, 91, 0, 0, 0, 35, 0, 0, 0,243,
- 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 1, 89, 0, 0, 2, 19, 0, 0, 0, 35,
- 0, 0, 0,211, 0, 0, 1, 89, 0, 0, 0, 35, 0, 0, 2, 19, 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 2, 19, 0, 0, 2, 21,
- 0, 0, 0, 35, 0, 0, 2, 20, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,206, 0, 0, 0,210, 0, 0, 0, 35, 0, 0, 0,206,
- 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,210, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 2, 20, 0, 0, 0, 35,
- 0, 0, 0,207, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 1, 88, 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 1, 93, 0, 0, 2, 22,
- 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 1, 93, 0, 0, 0, 35, 0, 0, 2, 22,
- 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 2, 22, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 2, 23, 0, 0, 2, 24, 0, 0, 0, 35,
- 0, 0, 0,217, 0, 0, 1, 92, 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 1, 92, 0, 0, 2, 24,
- 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 0,246, 0, 0, 0, 35, 0, 0, 0,246,
- 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 1, 92, 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 1, 94, 0, 0, 2, 25, 0, 0, 0, 35,
- 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 2, 25, 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 2, 25, 0, 0, 2, 27,
- 0, 0, 0, 35, 0, 0, 2, 26, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 93, 0, 0, 1, 97, 0, 0, 0, 35, 0, 0, 1, 97,
- 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 93, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 96, 0, 0, 2, 26, 0, 0, 0, 35,
- 0, 0, 1, 95, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 1, 95, 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 2, 28,
- 0, 0, 0, 35, 0, 0, 0,248, 0, 0, 2, 28, 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 0,248, 0, 0, 0, 35, 0, 0, 2, 28,
- 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 2, 28, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 2, 29, 0, 0, 2, 30, 0, 0, 0, 35,
- 0, 0, 0,221, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 1, 96, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 0,221, 0, 0, 2, 30,
- 0, 0, 0, 35, 0, 0, 1, 97, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,249, 0, 0, 1, 97, 0, 0, 0, 35, 0, 0, 0,249,
- 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 1, 95, 0, 0, 2, 31, 0, 0, 0, 35,
- 0, 0, 0,219, 0, 0, 1, 95, 0, 0, 0, 35, 0, 0, 2, 31, 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 2, 31, 0, 0, 2, 33,
- 0, 0, 0, 35, 0, 0, 2, 32, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,214, 0, 0, 0,218, 0, 0, 0, 35, 0, 0, 0,214,
- 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,218, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 2, 32, 0, 0, 0, 35,
- 0, 0, 0,215, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 1, 94, 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 1, 99, 0, 0, 2, 34,
- 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 1, 99, 0, 0, 0, 35, 0, 0, 2, 34,
- 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 2, 34, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 2, 35, 0, 0, 2, 36, 0, 0, 0, 35,
- 0, 0, 0,225, 0, 0, 1, 98, 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 1, 98, 0, 0, 2, 36,
- 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 0,250, 0, 0, 0, 35, 0, 0, 0,250,
- 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 1, 98, 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 1,100, 0, 0, 2, 37, 0, 0, 0, 35,
- 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 2, 37, 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 2, 37, 0, 0, 2, 39,
- 0, 0, 0, 35, 0, 0, 2, 38, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1, 99, 0, 0, 1,103, 0, 0, 0, 35, 0, 0, 1,103,
- 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1, 99, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1,102, 0, 0, 2, 38, 0, 0, 0, 35,
- 0, 0, 1,101, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 1,101, 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 2, 40,
- 0, 0, 0, 35, 0, 0, 0,252, 0, 0, 2, 40, 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 0,252, 0, 0, 0, 35, 0, 0, 2, 40,
- 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 2, 40, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 2, 41, 0, 0, 2, 42, 0, 0, 0, 35,
- 0, 0, 0,229, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 1,102, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 0,229, 0, 0, 2, 42,
- 0, 0, 0, 35, 0, 0, 1,103, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,253, 0, 0, 1,103, 0, 0, 0, 35, 0, 0, 0,253,
- 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 1,101, 0, 0, 2, 43, 0, 0, 0, 35,
- 0, 0, 0,227, 0, 0, 1,101, 0, 0, 0, 35, 0, 0, 2, 43, 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 2, 43, 0, 0, 2, 45,
- 0, 0, 0, 35, 0, 0, 2, 44, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,222, 0, 0, 0,226, 0, 0, 0, 35, 0, 0, 0,222,
- 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,226, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 2, 44, 0, 0, 0, 35,
- 0, 0, 0,223, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 1,100, 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 2, 46,
- 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 2, 46,
- 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 2, 46, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 2, 47, 0, 0, 2, 48, 0, 0, 0, 35,
- 0, 0, 0,233, 0, 0, 1,104, 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 1,104, 0, 0, 2, 48,
- 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 0,254, 0, 0, 0, 35, 0, 0, 0,254,
- 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 1,104, 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 1,106, 0, 0, 2, 49, 0, 0, 0, 35,
- 0, 0, 1,104, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 2, 49, 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 2, 49, 0, 0, 2, 51,
- 0, 0, 0, 35, 0, 0, 2, 50, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 1,109,
- 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,108, 0, 0, 2, 50, 0, 0, 0, 35,
- 0, 0, 1,107, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 1,107, 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 2, 52,
- 0, 0, 0, 35, 0, 0, 1, 0, 0, 0, 2, 52, 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 2, 52,
- 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 2, 52, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 2, 53, 0, 0, 2, 54, 0, 0, 0, 35,
- 0, 0, 0,237, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 1,108, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 0,237, 0, 0, 2, 54,
- 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 1, 1,
- 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 1,107, 0, 0, 2, 55, 0, 0, 0, 35,
- 0, 0, 0,235, 0, 0, 1,107, 0, 0, 0, 35, 0, 0, 2, 55, 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 2, 55, 0, 0, 2, 57,
- 0, 0, 0, 35, 0, 0, 2, 56, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,230, 0, 0, 0,234, 0, 0, 0, 35, 0, 0, 0,230,
- 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,234, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 2, 56, 0, 0, 0, 35,
- 0, 0, 0,231, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 1,106, 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 1,111, 0, 0, 2, 58,
- 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 1,111, 0, 0, 0, 35, 0, 0, 2, 58,
- 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 2, 58, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 2, 59, 0, 0, 2, 60, 0, 0, 0, 35,
- 0, 0, 0,241, 0, 0, 1,110, 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 1,110, 0, 0, 2, 60,
- 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 1, 2, 0, 0, 0, 35, 0, 0, 1, 2,
- 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 1,110, 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 1,113, 0, 0, 2, 61, 0, 0, 0, 35,
- 0, 0, 1,110, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 2, 61, 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 2, 61, 0, 0, 2, 63,
- 0, 0, 0, 35, 0, 0, 2, 62, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,111, 0, 0, 1,115, 0, 0, 0, 35, 0, 0, 1,115,
- 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,111, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,114, 0, 0, 2, 62, 0, 0, 0, 35,
- 0, 0, 1,112, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 1,112, 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 2, 64,
- 0, 0, 0, 35, 0, 0, 1, 4, 0, 0, 2, 64, 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 1, 4, 0, 0, 0, 35, 0, 0, 2, 64,
- 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 2, 64, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 2, 65, 0, 0, 2, 66, 0, 0, 0, 35,
- 0, 0, 0,205, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 1,114, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 0,205, 0, 0, 2, 66,
- 0, 0, 0, 35, 0, 0, 1,115, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 1, 5, 0, 0, 1,115, 0, 0, 0, 35, 0, 0, 1, 5,
- 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 1,112, 0, 0, 2, 67, 0, 0, 0, 35,
- 0, 0, 0,203, 0, 0, 1,112, 0, 0, 0, 35, 0, 0, 2, 67, 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 2, 67, 0, 0, 2, 69,
- 0, 0, 0, 35, 0, 0, 2, 68, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,202, 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 0,238,
- 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,202, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 2, 68, 0, 0, 0, 35,
- 0, 0, 0,239, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 1,113, 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 1,117, 0, 0, 2, 70,
- 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 1,117, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 2, 70, 0, 0, 0, 35, 0, 0, 2, 70,
- 0, 0, 2, 71, 0, 0, 0, 35, 0, 0, 2, 71, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 2, 70, 0, 0, 2, 72, 0, 0, 0, 35,
- 0, 0, 0,243, 0, 0, 1,116, 0, 0, 0, 35, 0, 0, 1,116, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,243, 0, 0, 2, 72,
- 0, 0, 0, 35, 0, 0, 0,242, 0, 0, 2, 71, 0, 0, 0, 35, 0, 0, 1, 10, 0, 0, 2, 71, 0, 0, 0, 35, 0, 0, 0,242,
- 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 1,116, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 1,116, 0, 0, 1,118, 0, 0, 0, 35,
- 0, 0, 1,118, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 2, 73, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 2, 74, 0, 0, 2, 75,
- 0, 0, 0, 35, 0, 0, 2, 73, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,117, 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 1,117,
- 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,121, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,120, 0, 0, 2, 74, 0, 0, 0, 35,
- 0, 0, 1,119, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 1,119, 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 2, 76,
- 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 1, 12, 0, 0, 0, 35, 0, 0, 1, 12, 0, 0, 2, 76, 0, 0, 0, 35, 0, 0, 2, 76,
- 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 2, 77, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 2, 76, 0, 0, 2, 78, 0, 0, 0, 35,
- 0, 0, 1, 9, 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 1,120, 0, 0, 2, 78,
- 0, 0, 0, 35, 0, 0, 1,121, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 1, 13,
- 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 1,119, 0, 0, 0, 35,
- 0, 0, 1,119, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 2, 79, 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 2, 80, 0, 0, 2, 81,
- 0, 0, 0, 35, 0, 0, 2, 79, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,244, 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 1, 6,
- 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,244, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 2, 80, 0, 0, 0, 35,
- 0, 0, 1,118, 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 1,118, 0, 0, 0, 35, 0, 0, 1,123, 0, 0, 2, 82,
- 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 1,123, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 2, 82, 0, 0, 0, 35, 0, 0, 2, 82,
- 0, 0, 2, 83, 0, 0, 0, 35, 0, 0, 2, 83, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 2, 82, 0, 0, 2, 84, 0, 0, 0, 35,
- 0, 0, 0,249, 0, 0, 1,122, 0, 0, 0, 35, 0, 0, 1,122, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,249, 0, 0, 2, 84,
- 0, 0, 0, 35, 0, 0, 0,248, 0, 0, 2, 83, 0, 0, 0, 35, 0, 0, 1, 14, 0, 0, 2, 83, 0, 0, 0, 35, 0, 0, 0,248,
- 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 1,122, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 1,122, 0, 0, 1,124, 0, 0, 0, 35,
- 0, 0, 1,124, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 2, 85, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 2, 86, 0, 0, 2, 87,
- 0, 0, 0, 35, 0, 0, 2, 85, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,123, 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 1,123,
- 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,127, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,126, 0, 0, 2, 86, 0, 0, 0, 35,
- 0, 0, 1,125, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 1,125, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 1, 12, 0, 0, 2, 88,
- 0, 0, 0, 35, 0, 0, 1, 12, 0, 0, 1, 16, 0, 0, 0, 35, 0, 0, 1, 16, 0, 0, 2, 88, 0, 0, 0, 35, 0, 0, 2, 88,
- 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 2, 89, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 2, 88, 0, 0, 2, 90, 0, 0, 0, 35,
- 0, 0, 1, 13, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 1,126, 0, 0, 2, 90,
- 0, 0, 0, 35, 0, 0, 1,127, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 1, 17,
- 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 1,125, 0, 0, 0, 35,
- 0, 0, 1,125, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 2, 91, 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 2, 92, 0, 0, 2, 93,
- 0, 0, 0, 35, 0, 0, 2, 91, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,246, 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 1, 10,
- 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,246, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 2, 92, 0, 0, 0, 35,
- 0, 0, 1,124, 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 1,124, 0, 0, 0, 35, 0, 0, 1,129, 0, 0, 2, 94,
- 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 1,129, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 2, 94, 0, 0, 0, 35, 0, 0, 2, 94,
- 0, 0, 2, 95, 0, 0, 0, 35, 0, 0, 2, 95, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 2, 94, 0, 0, 2, 96, 0, 0, 0, 35,
- 0, 0, 0,253, 0, 0, 1,128, 0, 0, 0, 35, 0, 0, 1,128, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,253, 0, 0, 2, 96,
- 0, 0, 0, 35, 0, 0, 0,252, 0, 0, 2, 95, 0, 0, 0, 35, 0, 0, 1, 18, 0, 0, 2, 95, 0, 0, 0, 35, 0, 0, 0,252,
- 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 1,128, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 1,128, 0, 0, 1,130, 0, 0, 0, 35,
- 0, 0, 1,130, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 2, 97, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 2, 98, 0, 0, 2, 99,
- 0, 0, 0, 35, 0, 0, 2, 97, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,129, 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 1,129,
- 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,133, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,132, 0, 0, 2, 98, 0, 0, 0, 35,
- 0, 0, 1,131, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 1,131, 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 1, 16, 0, 0, 2,100,
- 0, 0, 0, 35, 0, 0, 1, 16, 0, 0, 1, 20, 0, 0, 0, 35, 0, 0, 1, 20, 0, 0, 2,100, 0, 0, 0, 35, 0, 0, 2,100,
- 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 2,101, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 2,100, 0, 0, 2,102, 0, 0, 0, 35,
- 0, 0, 1, 17, 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 1,132, 0, 0, 2,102,
- 0, 0, 0, 35, 0, 0, 1,133, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 1, 21,
- 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 1,131, 0, 0, 0, 35,
- 0, 0, 1,131, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 2,103, 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 2,104, 0, 0, 2,105,
- 0, 0, 0, 35, 0, 0, 2,103, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,250, 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 1, 14,
- 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,250, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 2,104, 0, 0, 0, 35,
- 0, 0, 1,130, 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 1,130, 0, 0, 0, 35, 0, 0, 1,135, 0, 0, 2,106,
- 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 1,135, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 2,106, 0, 0, 0, 35, 0, 0, 2,106,
- 0, 0, 2,107, 0, 0, 0, 35, 0, 0, 2,107, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 2,106, 0, 0, 2,108, 0, 0, 0, 35,
- 0, 0, 1, 1, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 2,108,
- 0, 0, 0, 35, 0, 0, 1, 0, 0, 0, 2,107, 0, 0, 0, 35, 0, 0, 1, 22, 0, 0, 2,107, 0, 0, 0, 35, 0, 0, 1, 0,
- 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 1,136, 0, 0, 0, 35,
- 0, 0, 1,136, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 2,109, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 2,110, 0, 0, 2,111,
- 0, 0, 0, 35, 0, 0, 2,109, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,135, 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 1,135,
- 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,139, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,138, 0, 0, 2,110, 0, 0, 0, 35,
- 0, 0, 1,137, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 1,137, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 1, 20, 0, 0, 2,112,
- 0, 0, 0, 35, 0, 0, 1, 20, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 1, 24, 0, 0, 2,112, 0, 0, 0, 35, 0, 0, 2,112,
- 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 2,113, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 2,112, 0, 0, 2,114, 0, 0, 0, 35,
- 0, 0, 1, 21, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 1,138, 0, 0, 2,114,
- 0, 0, 0, 35, 0, 0, 1,139, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 1, 25,
- 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 1,137, 0, 0, 0, 35,
- 0, 0, 1,137, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 2,115, 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 2,116, 0, 0, 2,117,
- 0, 0, 0, 35, 0, 0, 2,115, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,254, 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 1, 18,
- 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,254, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 2,116, 0, 0, 0, 35,
- 0, 0, 1,136, 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,136, 0, 0, 0, 35, 0, 0, 1,141, 0, 0, 2,118,
- 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 1,141, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 2,118, 0, 0, 0, 35, 0, 0, 2,118,
- 0, 0, 2,119, 0, 0, 0, 35, 0, 0, 2,119, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 2,118, 0, 0, 2,120, 0, 0, 0, 35,
- 0, 0, 1, 5, 0, 0, 1,140, 0, 0, 0, 35, 0, 0, 1,140, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 1, 5, 0, 0, 2,120,
- 0, 0, 0, 35, 0, 0, 1, 4, 0, 0, 2,119, 0, 0, 0, 35, 0, 0, 1, 6, 0, 0, 2,119, 0, 0, 0, 35, 0, 0, 1, 4,
- 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 1,140, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 1,140, 0, 0, 1,142, 0, 0, 0, 35,
- 0, 0, 1,142, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 2,121, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 2,122, 0, 0, 2,123,
- 0, 0, 0, 35, 0, 0, 2,121, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,141, 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 1,141,
- 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,144, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,145, 0, 0, 2,122, 0, 0, 0, 35,
- 0, 0, 1,143, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 1, 24, 0, 0, 2,124,
- 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 2,124, 0, 0, 0, 35, 0, 0, 2,124,
- 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 2,125, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 2,124, 0, 0, 2,126, 0, 0, 0, 35,
- 0, 0, 1, 25, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 1,145, 0, 0, 2,126,
- 0, 0, 0, 35, 0, 0, 1,144, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 1, 9,
- 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 1,143, 0, 0, 0, 35,
- 0, 0, 1,143, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 2,127, 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 2,128, 0, 0, 2,129,
- 0, 0, 0, 35, 0, 0, 2,127, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 2, 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 1, 22,
- 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 2, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 2,128, 0, 0, 0, 35,
- 0, 0, 1,142, 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 1,142, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 66,224, 0, 0, 1, 42, 0, 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, 7,248,144, 32, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,240,116,184, 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, 68, 65, 84, 65,160, 0, 0, 0,144,114,184, 3, 54, 0, 0, 0,
+ 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2,
+ 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0,
+ 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 2, 68, 65, 84, 65, 96, 1, 0, 0, 96,115,184, 3, 65, 0, 0, 0, 8, 0, 0, 0, 12,192,137, 62,162,226,125, 63,
+144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+144,108,246, 61,162,226,125, 63, 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 0,229,213, 62,
+162,226,125, 63, 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63,252,228,213, 62,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0,
+240,116,184, 3, 59, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,160,117,184, 3, 52, 0, 0, 0, 1, 0, 0, 0,
+216,162,186, 3,112,104,184, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 0, 0, 0, 0,112,104,101,
+114,101, 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,232,118,184, 3, 72, 18,185, 3,120,118,185, 3, 0, 0, 0, 0,168,120,184, 3,144,182,184, 3,
+ 0, 0, 0, 0,168, 82,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,119,184, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,181,184, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192, 16,185, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+130, 2, 0, 0,128, 7, 0, 0, 0, 5, 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,117,224,186, 64, 91, 13,187, 64,160,240,186, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 0, 0, 0, 30, 0, 4, 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,
+232,118,184, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 68, 65, 84, 65, 84, 1, 0, 0, 32,119,184, 3, 58, 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,168,120,184, 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, 68, 65, 84, 65, 48, 60, 0, 0,
+168,120,184, 3, 58, 0, 0, 0,130, 2, 0, 0, 28,136,141,191, 12,243,244, 62,198, 86,183,192,212,231,117, 10,191,130,255, 0,
+ 3, 0, 0, 0,240,102,131,192, 30,183,119, 64,109,169,199,191, 58,166,158, 84,230,221,255, 0, 3, 0, 0, 0,119,108,239, 63,
+213, 85,156, 64,188, 58, 40,192,228, 40,207,106,137,198,255, 0, 3, 0, 0, 0, 95,135,146, 64, 63, 54, 14,191,241,194,102,192,
+ 27,100,219,243, 45,177,255, 0, 3, 0, 0, 0,239, 84,141, 62, 16,220,157,192, 14, 2, 73,192, 8, 6, 39,148, 86,187,255, 0,
+ 3, 0, 0, 0,132,239,162,192,206,165, 12,192,150, 45,240,191,175,144,245,207,251,214,255, 0, 3, 0, 0, 0,239, 84,141,190,
+ 16,220,157, 64, 14, 2, 73, 64,248,249,217,107,170, 68,255, 0, 3, 0, 0, 0,132,239,162, 64,206,165, 12, 64,150, 45,240, 63,
+ 81,111, 11, 48, 5, 41,255, 0, 3, 0, 0, 0,240,102,131, 64, 30,183,119,192,109,169,199, 63,198, 89, 98,171, 26, 34,255, 0,
+ 3, 0, 0, 0,119,108,239,191,213, 85,156,192,188, 58, 40, 64, 28,215, 49,149,119, 57,255, 0, 3, 0, 0, 0, 95,135,146,192,
+ 63, 54, 14, 63,241,194,102, 64,229,155, 37, 12,211, 78,255, 0, 3, 0, 0, 0, 28,136,141, 63, 12,243,244,190,198, 86,183, 64,
+ 44, 24,139,245, 65,125,255, 0, 3, 0, 0, 0,114, 17, 68,192,226,153, 35, 64,154, 26,137,192, 6,189,226, 55, 85,162,255, 0,
+ 3, 0, 0, 0,155, 40,230, 62,239,199, 73, 64,176, 52,157,192,211, 9,237, 68,153,148,255, 0, 3, 0, 0, 0,124, 55,168,191,
+224,177,164, 64, 58,144, 29,192, 69,227,132,112, 46,202,255, 0, 3, 0, 0, 0, 94, 35,105,192,230, 88,129,191,195, 14,143,192,
+ 93,176,233,233, 68,158,255, 0, 3, 0, 0, 0, 37, 2,173,192,137,187,123, 63, 56, 68, 1,192,206,137,127, 21,216,211,255, 0,
+ 3, 0, 0, 0,234,168, 2, 64,231,158, 57,189, 65,149,175,192,162, 44, 3,255, 11,136,255, 0, 3, 0, 0, 0, 19,159,114, 64,
+254,226, 34, 64,196,133,106,192,225, 82,164, 55,228,175,255, 0, 3, 0, 0, 0,105,176,249,190, 21,148, 39,192,217,214,166,192,
+ 87,245,194,198, 5,142,255, 0, 3, 0, 0, 0,227,163, 54, 64, 86,121, 78,192, 22,202,125,192, 99, 62,120,185, 79,169,255, 0,
+ 3, 0, 0, 0,241, 40, 53,192,200, 31,134,192,229,188, 60,192, 30,194, 94,164,136,191,255, 0, 3, 0, 0, 0, 96,230,181,192,
+ 33, 24,119,191,174, 26,130, 63,186,131,231,234, 56, 22,255, 0, 3, 0, 0, 0,103, 93,163,192,136,128, 38, 64, 83,235,153, 63,
+100,144,224, 56, 74, 26,255, 0, 3, 0, 0, 0,238,219, 36,192,132,151,165, 64,165,226,109, 63,176,199, 33,113, 80, 20,255, 0,
+ 3, 0, 0, 0, 24,237,111, 63,118,174,184, 64,212, 34,154, 62,125, 20, 44,126,148, 6,255, 0, 3, 0, 0, 0,163,244,130, 64,
+157, 58,133, 64,125, 95,226,190,119, 89, 5, 91, 86,246,255, 0, 3, 0, 0, 0, 96,230,181, 64, 33, 24,119, 63,174, 26,130,191,
+ 70,124, 25, 21,200,233,255, 0, 3, 0, 0, 0,103, 93,163, 64,136,128, 38,192, 83,235,153,191,156,111, 32,199,182,229,255, 0,
+ 3, 0, 0, 0,238,219, 36, 64,132,151,165,192,165,226,109,191, 80, 56,223,142,176,235,255, 0, 3, 0, 0, 0, 24,237,111,191,
+118,174,184,192,212, 34,154,190,131,235,212,129,108,249,255, 0, 3, 0, 0, 0,163,244,130,192,157, 58,133,192,125, 95,226, 62,
+137,166,251,164,170, 9,255, 0, 3, 0, 0, 0,227,163, 54,192, 86,121, 78, 64, 22,202,125, 64,157,193,136, 70,177, 86,255, 0,
+ 3, 0, 0, 0,241, 40, 53, 64,200, 31,134, 64,229,188, 60, 64,226, 61,162, 91,120, 64,255, 0, 3, 0, 0, 0, 37, 2,173, 64,
+137,187,123,191, 56, 68, 1, 64, 50,118,129,234, 40, 44,255, 0, 3, 0, 0, 0,124, 55,168, 63,224,177,164,192, 58,144, 29, 64,
+187, 28,124,143,210, 53,255, 0, 3, 0, 0, 0, 19,159,114,192,254,226, 34,192,196,133,106, 64, 31,173, 92,200, 28, 80,255, 0,
+ 3, 0, 0, 0,234,168, 2,192,231,158, 57, 61, 65,149,175, 64, 94,211,253, 0,245,119,255, 0, 3, 0, 0, 0,105,176,249, 62,
+ 21,148, 39, 64,217,214,166, 64,169, 10, 62, 57,251,113,255, 0, 3, 0, 0, 0, 94, 35,105, 64,230, 88,129, 63,195, 14,143, 64,
+163, 79, 23, 22,188, 97,255, 0, 3, 0, 0, 0,114, 17, 68, 64,226,153, 35,192,154, 26,137, 64,250, 66, 30,200,171, 93,255, 0,
+ 3, 0, 0, 0,155, 40,230,190,239,199, 73,192,176, 52,157, 64, 45,246, 19,187,103,107,255, 0, 3, 0, 0, 0, 37,178, 10,192,
+138,231,201, 63,149,143,166,192,129,209,140, 33,145,141,255, 0, 3, 0, 0, 0, 3,132,110,192,243,203, 85, 64,151,107, 66,192,
+ 16,174,158, 73,209,190,255, 0, 3, 0, 0, 0,116,161,174,190, 81,152,241, 63,110, 2,177,192,217,247, 15, 40,182,134,255, 0,
+ 3, 0, 0, 0,138, 91,154, 63,218,179,133, 64,209,222,122,192, 0, 27, 30, 92, 86,171,255, 0, 3, 0, 0, 0, 7, 82, 52,192,
+ 82,252,149, 64, 64,202, 5,192, 39,193,227,101,181,210,255, 0, 3, 0, 0, 0,179, 12,148, 62,251,221,166, 64,188, 87, 41,192,
+192, 7,224,113, 21,198,255, 0, 3, 0, 0, 0,216,246, 29,192, 17,156,141,190,209,167,169,192, 47,203,160,250,137,139,255, 0,
+ 3, 0, 0, 0, 99, 72,145,192, 79,114,213,191,183, 35, 83,192, 26,156, 3,219, 12,185,255, 0, 3, 0, 0, 0,115, 58,158,192,
+129,120, 33, 64,198, 41,238,191,126,148,116, 56,137,215,255, 0, 3, 0, 0, 0,118,158,174,192,103,148, 33,191,140,156, 1,192,
+218,136,198,240,203,211,255, 0, 3, 0, 0, 0, 55, 14,249, 62, 95,133,102, 62,210,143,186,192, 56, 9, 40, 5,113,128,255, 0,
+ 3, 0, 0, 0,220, 61, 92, 64, 56,230,159,190, 6, 61,151,192, 94, 76,242,248,135,153,255, 0, 3, 0, 0, 0, 7, 86, 60, 64,
+ 60, 48,119, 64, 93, 88, 81,192,119, 63,124, 85,246,184,255, 0, 3, 0, 0, 0,252, 55,139, 64, 62, 95,132, 63,225,216,113,192,
+118, 95, 54, 21,107,173,255, 0, 3, 0, 0, 0, 18, 6, 84,191,251, 96,142,191, 76, 4,182,192,158,237, 20,233,109,131,255, 0,
+ 3, 0, 0, 0,109, 74,225,189, 51, 54,123,192, 34,246,138,192,241,253, 39,169, 1,162,255, 0, 3, 0, 0, 0,153, 66,119, 64,
+127,154,251,191,161,220,123,192, 59, 85, 59,214, 34,170,255, 0, 3, 0, 0, 0,201, 59,208, 63,241,182,135,192,212,101,108,192,
+103, 34,133,162,160,175,255, 0, 3, 0, 0, 0,161,246,169,191,235,196,151,192,170,149, 74,192, 95,228,253,151,184,186,255, 0,
+ 3, 0, 0, 0, 33,198,131,192,218,137, 84,192, 37,134, 32,192,247,164, 77,184,167,201,255, 0, 3, 0, 0, 0,176, 61,179,192,
+138,110,210,191, 24,220,228,190,210,133,130,219,238,244,255, 0, 3, 0, 0, 0, 73,182,170,192,136, 16, 90,190, 90,194, 25, 64,
+224,139, 8,252,174, 53,255, 0, 3, 0, 0, 0, 75, 55,153,192, 4, 78, 87, 64, 12, 54, 62,190,200,151, 29, 74,179,250,255, 0,
+ 3, 0, 0, 0,235, 19,161,192,207, 12,210, 63,210,242, 31, 64, 50,146,244, 34,182, 55,255, 0, 3, 0, 0, 0, 60, 75, 94,192,
+189,115,150, 64,186,211,167,190, 98,179, 49,102,183,247,255, 0, 3, 0, 0, 0,186,191,189,191, 63, 32,168, 64,213,100, 7, 64,
+161,224,191,114, 61, 47,255, 0, 3, 0, 0, 0,242,205,186, 63,141, 65,177, 64,127,219,154,191, 82, 32,177,120, 61,228,255, 0,
+ 3, 0, 0, 0, 99,245,175, 62, 97, 12,178, 64,255,253,228, 63,247, 6, 65,121, 98, 40,255, 0, 3, 0, 0, 0,226, 92, 70, 64,
+ 8,131,150, 64,182, 77,204,191,193, 66, 37,103, 32,220,255, 0, 3, 0, 0, 0,200,194,152, 64,180,155, 83, 64,154,217, 62, 63,
+207,104,101, 71, 87, 17,255, 0, 3, 0, 0, 0, 73,182,170, 64,136, 16, 90, 62, 90,194, 25,192, 32,116,248, 3, 82,202,255, 0,
+ 3, 0, 0, 0,176, 61,179, 64,138,110,210, 63, 24,220,228, 62, 46,122,126, 36, 18, 11,255, 0, 3, 0, 0, 0,235, 19,161, 64,
+207, 12,210,191,210,242, 31,192,206,109, 12,221, 74,200,255, 0, 3, 0, 0, 0, 75, 55,153, 64, 4, 78, 87,192, 12, 54, 62, 62,
+ 56,104,227,181, 77, 5,255, 0, 3, 0, 0, 0,186,191,189, 63, 63, 32,168,192,213,100, 7,192, 95, 31, 65,141,195,208,255, 0,
+ 3, 0, 0, 0, 60, 75, 94, 64,189,115,150,192,186,211,167, 62,158, 76,207,153, 73, 8,255, 0, 3, 0, 0, 0, 99,245,175,190,
+ 97, 12,178,192,255,253,228,191, 9,249,191,134,158,215,255, 0, 3, 0, 0, 0,242,205,186,191,141, 65,177,192,127,219,154, 63,
+174,223, 79,135,195, 27,255, 0, 3, 0, 0, 0,200,194,152,192,180,155, 83,192,154,217, 62,191, 49,151,155,184,169,238,255, 0,
+ 3, 0, 0, 0,226, 92, 70,192, 8,131,150,192,182, 77,204, 63, 63,189,219,152,224, 35,255, 0, 3, 0, 0, 0,201, 59,208,191,
+241,182,135, 64,212,101,108, 64,153,221,123, 93, 96, 80,255, 0, 3, 0, 0, 0,153, 66,119,192,127,154,251, 63,161,220,123, 64,
+197,170,197, 41,222, 85,255, 0, 3, 0, 0, 0,161,246,169, 63,235,196,151, 64,170,149, 74, 64,161, 27, 3,104, 72, 69,255, 0,
+ 3, 0, 0, 0, 33,198,131, 64,218,137, 84, 64, 37,134, 32, 64, 9, 91,179, 71, 89, 54,255, 0, 3, 0, 0, 0,118,158,174, 64,
+103,148, 33, 63,140,156, 1, 64, 38,119, 58, 15, 53, 44,255, 0, 3, 0, 0, 0,115, 58,158, 64,129,120, 33,192,198, 41,238, 63,
+130,107,140,199,119, 40,255, 0, 3, 0, 0, 0, 7, 82, 52, 64, 82,252,149,192, 64,202, 5, 64,217, 62, 29,154, 75, 45,255, 0,
+ 3, 0, 0, 0,179, 12,148,190,251,221,166,192,188, 87, 41, 64, 64,248, 32,142,235, 57,255, 0, 3, 0, 0, 0, 7, 86, 60,192,
+ 60, 48,119,192, 93, 88, 81, 64,137,192,132,170, 10, 71,255, 0, 3, 0, 0, 0,252, 55,139,192, 62, 95,132,191,225,216,113, 64,
+138,160,202,234,149, 82,255, 0, 3, 0, 0, 0,220, 61, 92,192, 56,230,159, 62, 6, 61,151, 64,162,179, 14, 7,121,102,255, 0,
+ 3, 0, 0, 0, 55, 14,249,190, 95,133,102,190,210,143,186, 64,200,246,216,250,143,127,255, 0, 3, 0, 0, 0,109, 74,225, 61,
+ 51, 54,123, 64, 34,246,138, 64, 15, 2,217, 86,255, 93,255, 0, 3, 0, 0, 0, 18, 6, 84, 63,251, 96,142, 63, 76, 4,182, 64,
+ 98, 18,236, 22,147,124,255, 0, 3, 0, 0, 0, 99, 72,145, 64, 79,114,213, 63,183, 35, 83, 64,230, 99,253, 36,244, 70,255, 0,
+ 3, 0, 0, 0,216,246, 29, 64, 17,156,141, 62,209,167,169, 64,209, 52, 96, 5,119,116,255, 0, 3, 0, 0, 0, 3,132,110, 64,
+243,203, 85,192,151,107, 66, 64,240, 81, 98,182, 47, 65,255, 0, 3, 0, 0, 0, 37,178, 10, 64,138,231,201,191,149,143,166, 64,
+127, 46,116,222,111,114,255, 0, 3, 0, 0, 0,138, 91,154,191,218,179,133,192,209,222,122, 64, 0,229,226,163,170, 84,255, 0,
+ 3, 0, 0, 0,116,161,174, 62, 81,152,241,191,110, 2,177, 64, 39, 8,241,215, 74,121,255, 0, 3, 0, 0, 0, 36, 76, 19,192,
+ 25,151,129, 64,212,254, 98,192,231,206, 97, 88,131,177,255, 0, 3, 0, 0, 0, 93,232,175,191,177, 23, 64, 64, 69,186,154,192,
+227,225,235, 66, 34,151,255, 0, 3, 0, 0, 0,208,190,232,190, 93,160,139, 64,191, 33,120,192,183,244,205, 94,192,170,255, 0,
+ 3, 0, 0, 0,210,126,142,192, 43, 49,238, 63,112, 30, 84,192,187,158, 95, 39,183,182,255, 0, 3, 0, 0, 0,138,165, 97,192,
+ 92, 9, 80, 63, 20, 74,147,192,183,177,233, 17, 86,156,255, 0, 3, 0, 0, 0, 98, 61,152,192, 87, 63,106,188, 6, 97, 90,192,
+127,152,251, 0,183,180,255, 0, 3, 0, 0, 0,200,173, 14, 64,155,183, 63, 64,192, 75,144,192,206, 48, 45, 64,152,156,255, 0,
+ 3, 0, 0, 0, 95,162,167, 63,144, 29,209, 63, 25,245,174,192,250, 29, 75, 36,250,136,255, 0, 3, 0, 0, 0,211, 62, 68, 64,
+ 51, 56,168, 63, 13,245,153,192,241, 65,192, 29,106,150,255, 0, 3, 0, 0, 0, 33,182, 36, 64, 34, 38,220,191,150, 5,159,192,
+233, 54,211,217,223,146,255, 0, 3, 0, 0, 0, 16, 34, 81, 63,129, 64,179,191,162, 5,180,192,242, 18, 93,224,111,133,255, 0,
+ 3, 0, 0, 0,212, 56,159, 63,172,166, 68,192,212,108,154,192,176, 27, 32,190,208,149,255, 0, 3, 0, 0, 0,204, 76,223,191,
+170, 32,101,192, 65, 83,137,192,199,216,195,178,198,161,255, 0, 3, 0, 0, 0,249,249, 10,192, 62, 52,244,191, 25,236,162,192,
+ 9,208, 0,213,102,145,255, 0, 3, 0, 0, 0, 42,207, 89,192,251, 6, 47,192, 27,165,121,192,209,182, 18,196,198,169,255, 0,
+ 3, 0, 0, 0,137,215,176,192, 25, 62,241, 63,179,254,219,190,179,134,232, 39, 78,247,255, 0, 3, 0, 0, 0, 28,150,186,192,
+150, 16, 28, 60,191, 9, 7,191,118,128,131, 1, 77,245,255, 0, 3, 0, 0, 0, 34,132,181,192, 99, 60, 92, 63,217, 81,149, 63,
+181,131,238, 18,252, 23,255, 0, 3, 0, 0, 0,175,242, 74,190,164,173,183, 64,227,105,145,191,117,250,160,125, 31,232,255, 0,
+ 3, 0, 0, 0,219,227, 2,192, 96,164,173, 64,200, 71, 78,191,164,212, 52,119,226,238,255, 0, 3, 0, 0, 0,181,140, 92,191,
+ 75, 38,184, 64,176,148, 37, 63,224,236,237,125,159, 12,255, 0, 3, 0, 0, 0, 75,104,159, 64,212, 56,236, 63,240,126, 29,192,
+211,108,166, 41, 9,203,255, 0, 3, 0, 0, 0,215,159,132, 64, 84,184, 97, 64, 30, 44, 10,192,176, 91, 19, 76, 56,209,255, 0,
+ 3, 0, 0, 0, 95,122,164, 64,199,143, 44, 64, 53, 78, 68,191, 17,112, 17, 59,185,237,255, 0, 3, 0, 0, 0,255,176, 54, 64,
+243, 84,141,192,237,176, 36,192,192, 63, 9,160, 63,200,255, 0, 3, 0, 0, 0, 93,229,133, 64,217, 21, 68,192,157,226, 45,192,
+249, 90,187,187, 78,197,255, 0, 3, 0, 0, 0,203, 56,129, 64, 21,211,130,192,187,115,143,191,252, 87,194,166,252,229,255, 0,
+ 3, 0, 0, 0,189,239,104,192, 82,142,140,192,178,178,168,191,134,177,245,158,155,227,255, 0, 3, 0, 0, 0, 50,141,253,191,
+ 52,155,167,192,170,181,218,191,125,211,166,141,155,219,255, 0, 3, 0, 0, 0,164, 58, 41,192,172, 34,167,192,206,232,151, 61,
+232,197,243,141, 26, 0,255, 0, 3, 0, 0, 0, 93,229,133,192,217, 21, 68, 64,157,226, 45, 64, 7,165, 69, 68,178, 58,255, 0,
+ 3, 0, 0, 0,203, 56,129,192, 21,211,130, 64,187,115,143, 63, 4,168, 62, 89, 4, 26,255, 0, 3, 0, 0, 0,255,176, 54,192,
+243, 84,141, 64,237,176, 36, 64, 64,192,247, 95,193, 55,255, 0, 3, 0, 0, 0, 50,141,253, 63, 52,155,167, 64,170,181,218, 63,
+131, 44, 90,114,101, 36,255, 0, 3, 0, 0, 0,164, 58, 41, 64,172, 34,167, 64,206,232,151,189, 24, 58, 13,114,230,255,255, 0,
+ 3, 0, 0, 0,189,239,104, 64, 82,142,140, 64,178,178,168, 63,122, 78, 11, 97,101, 28,255, 0, 3, 0, 0, 0, 28,150,186, 64,
+150, 16, 28,188,191, 9, 7, 63,138,127,125,254,179, 10,255, 0, 3, 0, 0, 0, 34,132,181, 64, 99, 60, 92,191,217, 81,149,191,
+ 75,124, 18,237, 4,232,255, 0, 3, 0, 0, 0,137,215,176, 64, 25, 62,241,191,179,254,219, 62, 77,121, 24,216,178, 8,255, 0,
+ 3, 0, 0, 0,219,227, 2, 64, 96,164,173,192,200, 71, 78, 63, 92, 43,204,136, 30, 17,255, 0, 3, 0, 0, 0,181,140, 92, 63,
+ 75, 38,184,192,176,148, 37,191, 32, 19, 19,130, 97,243,255, 0, 3, 0, 0, 0,175,242, 74, 62,164,173,183,192,227,105,145, 63,
+139, 5, 96,130,225, 23,255, 0, 3, 0, 0, 0,215,159,132,192, 84,184, 97,192, 30, 44, 10, 64, 80,164,237,179,200, 46,255, 0,
+ 3, 0, 0, 0, 95,122,164,192,199,143, 44,192, 53, 78, 68, 63,239,143,239,196, 71, 18,255, 0, 3, 0, 0, 0, 75,104,159,192,
+212, 56,236,191,240,126, 29, 64, 45,147, 90,214,247, 52,255, 0, 3, 0, 0, 0,212, 56,159,191,172,166, 68, 64,212,108,154, 64,
+ 80,228,224, 65, 48,106,255, 0, 3, 0, 0, 0, 33,182, 36,192, 34, 38,220, 63,150, 5,159, 64, 23,201, 45, 38, 33,109,255, 0,
+ 3, 0, 0, 0, 16, 34, 81,191,129, 64,179, 63,162, 5,180, 64, 14,237,163, 31,145,122,255, 0, 3, 0, 0, 0, 42,207, 89, 64,
+251, 6, 47, 64, 27,165,121, 64, 47, 73,238, 59, 58, 86,255, 0, 3, 0, 0, 0,208, 76,223, 63,170, 32,101, 64, 65, 83,137, 64,
+ 57, 39, 61, 77, 58, 94,255, 0, 3, 0, 0, 0,249,249, 10, 64, 62, 52,244, 63, 25,236,162, 64,247, 47, 0, 43,154,110,255, 0,
+ 3, 0, 0, 0,210,126,142, 64, 43, 49,238,191,112, 30, 84, 64, 69, 97,161,216, 73, 73,255, 0, 3, 0, 0, 0, 98, 61,152, 64,
+ 87, 63,106, 60, 6, 97, 90, 64,129,103, 5,255, 73, 75,255, 0, 3, 0, 0, 0,138,165, 97, 64, 92, 9, 80,191, 20, 74,147, 64,
+ 73, 78, 23,238,170, 99,255, 0, 3, 0, 0, 0,208,190,232, 62, 93,160,139,192,191, 33,120, 64, 73, 11, 51,161, 64, 85,255, 0,
+ 3, 0, 0, 0, 36, 76, 19, 64, 25,151,129,192,212,254, 98, 64, 25, 49,159,167,125, 78,255, 0, 3, 0, 0, 0, 93,232,175, 63,
+177, 23, 64,192, 69,186,154, 64, 29, 30, 21,189,222,104,255, 0, 3, 0, 0, 0,211, 62, 68,192, 51, 56,168,191, 13,245,153, 64,
+ 15,190, 64,226,150,105,255, 0, 3, 0, 0, 0,200,173, 14,192,155,183, 63,192,192, 75,144, 64, 50,207,211,191,104, 99,255, 0,
+ 3, 0, 0, 0, 95,162,167,191,144, 29,209,191, 25,245,174, 64, 6,226,181,219, 6,119,255, 0, 3, 0, 0, 0,158,156,211,191,
+185,228,132, 63,190,207,176,192,164,220,231, 21,244,134,255, 0, 3, 0, 0, 0, 0, 76, 41,192,190,199, 5, 64, 83,157,153,192,
+146,198, 75, 45,246,150,255, 0, 3, 0, 0, 0,204, 83,125,192,169, 55,105, 64,244,162, 20,192, 72,169,246, 79, 82,206,255, 0,
+ 3, 0, 0, 0,178,215, 91,192,222,235, 62, 64,190,254,108,192,215,180, 87, 65,155,175,255, 0, 3, 0, 0, 0,242, 63, 59,191,
+210,237,152, 63,251, 21,182,192,125,239, 26, 25,149,131,255, 0, 3, 0, 0, 0, 86,230, 94, 61,198, 30, 35, 64,233, 15,169,192,
+238, 0, 52, 55,135,140,255, 0, 3, 0, 0, 0,220, 4,199, 63, 7,145,146, 64,104,186, 83,192,109, 34,137,100,168,184,255, 0,
+ 3, 0, 0, 0, 9,120, 86, 63,149, 91,109, 64, 79,242,142,192,133, 18, 64, 81,218,158,255, 0, 3, 0, 0, 0,103,243, 95,192,
+221, 91,138, 64,186, 15,236,191,170,178,219, 93, 25,216,255, 0, 3, 0, 0, 0, 46,206, 5,192,121, 41,159, 64,154, 91, 19,192,
+230,209, 96,108,226,205,255, 0, 3, 0, 0, 0,169,200,139, 63,198, 78,163, 64,201,146, 42,192,247, 24, 59,111,206,197,255, 0,
+ 3, 0, 0, 0,187,128, 4,191,206,181,167, 64, 74, 92, 37,192, 57,245, 96,114,145,199,255, 0, 3, 0, 0, 0,151, 16,231,191,
+160,166,209, 61,167, 95,178,192,136,217,196, 2,245,133,255, 0, 3, 0, 0, 0,163,200, 69,192,178,143, 38,191,148, 48,158,192,
+243,188, 11,242,223,147,255, 0, 3, 0, 0, 0, 43,192,155,192,151, 6,250,191,170, 82, 39,192, 79,149,247,212,231,199,255, 0,
+ 3, 0, 0, 0,233,118,132,192,217,111,173,191, 67,122,123,192,100,165, 58,226,165,170,255, 0, 3, 0, 0, 0,238, 85,146,192,
+178,205, 78, 64, 70, 54,221,191,183,156,134, 71,120,218,255, 0, 3, 0, 0, 0, 76,137,167,192,111, 31,227, 63,158, 57,251,191,
+234,141, 54, 39, 59,213,255, 0, 3, 0, 0, 0, 39,143,170,192,167, 15,183,191,251, 85,252,191,217,139,169,223, 13,213,255, 0,
+ 3, 0, 0, 0, 8,214,175,192,177,124, 53, 62,206,241, 2,192, 23,136, 89, 3, 92,211,255, 0, 3, 0, 0, 0, 77,160,160,190,
+ 9, 20,182, 62,108,232,186,192, 8,248,241, 7,128,128,255, 0, 3, 0, 0, 0, 33,144,163, 63,151,144,186, 61, 50, 47,183,192,
+ 97, 27, 19, 2,252,130,255, 0, 3, 0, 0, 0,222,179,129, 64,234,147,224,190, 38,180,134,192, 83, 89, 64,246,218,164,255, 0,
+ 3, 0, 0, 0,114,138, 49, 64,246, 97, 57,190, 57, 76,165,192,250, 60,247,251,138,143,255, 0, 3, 0, 0, 0,249,158, 27, 64,
+197,118,141, 64, 58,196, 62,192, 90, 52, 70, 97, 90,191,255, 0, 3, 0, 0, 0, 98,244, 89, 64, 8,120, 79, 64, 65,128, 96,192,
+ 8, 74, 39, 71,151,179,255, 0, 3, 0, 0, 0, 13,100,144, 64,200,214,118, 62, 64,205,110,192,182, 98, 37, 4,161,174,255, 0,
+ 3, 0, 0, 0, 42,202,131, 64, 60,161,231, 63,142,245,112,192, 10, 90,255, 38,209,173,255, 0, 3, 0, 0, 0,149, 51,122,191,
+ 52,151,163,190, 15,157,184,192,118,234, 36,250,248,129,255, 0, 3, 0, 0, 0, 5,113, 42,191, 31,112,241,191, 15,119,176,192,
+ 93,241, 84,215,135,135,255, 0, 3, 0, 0, 0, 60, 55,172, 61, 22, 64,143,192,164,246,113,192, 27, 2,132,157, 71,174,255, 0,
+ 3, 0, 0, 0,167,173,154,190,111,224, 83,192,198,169,154,192,136,249, 89,183,211,150,255, 0, 3, 0, 0, 0,151,133,136, 64,
+ 9,249,162,191,106,219,115,192,175, 93, 47,229, 3,173,255, 0, 3, 0, 0, 0,110,124, 89, 64,135, 6, 40,192,223,195,127,192,
+120, 74, 31,199,208,168,255, 0, 3, 0, 0, 0,244,248,117, 63,109, 90,148,192,123, 0, 93,192, 8, 20, 66,154,249,180,255, 0,
+ 3, 0, 0, 0,162, 0, 17, 64, 63,196,113,192, 52,239,119,192, 10, 49, 64,173,144,171,255, 0, 3, 0, 0, 0,162,217, 7,191,
+ 21,117,156,192,222,238, 75,192,139,245, 20,149,108,186,255, 0, 3, 0, 0, 0,171,144, 6,192,112,158,144,192,198,241, 69,192,
+156,210, 55,157,115,188,255, 0, 3, 0, 0, 0,110,238,148,192,115,109, 50,192,187,197, 13,192,170,153,231,195, 17,208,255, 0,
+ 3, 0, 0, 0, 79,252, 96,192,140, 40,115,192,116,165, 48,192,226,178, 98,173,236,195,255, 0, 3, 0, 0, 0,100,228,172,192,
+217,128,248,191, 8, 93,150,191, 91,138, 53,213, 86,229,255, 0, 3, 0, 0, 0, 82,171,182,192,216,250,168,191, 15, 15,147, 62,
+122,131,250,226,203, 5,255, 0, 3, 0, 0, 0,215, 73,160,192,124,165, 49, 62,232, 85, 66, 64, 33,147, 84, 4, 42, 67,255, 0,
+ 3, 0, 0, 0,171, 89,178,192,192,115, 24,191, 78,116,221, 63,129,134, 64,243, 50, 38,255, 0, 3, 0, 0, 0, 51,206,143,192,
+133,250,105, 64,119,251, 97,191, 85,158, 53, 80,193,235,255, 0, 3, 0, 0, 0, 62, 32,160,192,163, 38, 65, 64,164,117, 3, 63,
+236,146, 24, 66,193, 10,255, 0, 3, 0, 0, 0,216,108,155,192, 59,255,141, 63,189,117, 69, 64, 61,150,119, 23, 42, 68,255, 0,
+ 3, 0, 0, 0, 85, 27,164,192,244, 78, 9, 64, 87,193,239, 63, 33,144,128, 46, 73, 41,255, 0, 3, 0, 0, 0,134, 35,117,192,
+ 39,152,138, 64, 73, 86,116,191,230,171, 2, 94, 73,234,255, 0, 3, 0, 0, 0, 35,220, 67,192, 6,218,159, 64,242,103,155, 62,
+240,188,215,108, 55, 6,255, 0, 3, 0, 0, 0,130, 79, 99,191,215,182,164, 64, 10, 4, 42, 64,118,237, 50,112,190, 58,255, 0,
+ 3, 0, 0, 0,161, 86, 3,192, 14,205,168, 64, 60, 55,197, 63,148,211, 31,115,255, 33,255, 0, 3, 0, 0, 0,229,101,215, 63,
+ 84,141,168, 64, 16, 90,248,191, 11, 37,148,114,159,212,255, 0, 3, 0, 0, 0, 99, 52,155, 63,198, 17,183, 64,232,199,235,190,
+159, 26,192,124,120,245,255, 0, 3, 0, 0, 0,105,179, 10, 61, 25,185,169, 64,120,119, 31, 64, 77, 0,101,115, 96, 55,255, 0,
+ 3, 0, 0, 0,143,198, 37, 63,123,120,183, 64,160,108,135, 63,240, 13, 8,125,144, 23,255, 0, 3, 0, 0, 0,180,174, 32, 64,
+ 65, 13,155, 64,238,167, 8,192,247, 53,245,105,163,208,255, 0, 3, 0, 0, 0, 69,199,104, 64,177,135,143, 64, 41, 12,132,191,
+ 10, 79, 10, 98, 31,233,255, 0, 3, 0, 0, 0,121,134,159, 64, 49,245, 49, 64,210,166,169, 63, 27,109,242, 59,190, 29,255, 0,
+ 3, 0, 0, 0, 52,133,143, 64,119,200,113, 64,186,206, 29, 62, 20, 98, 39, 82,190, 3,255, 0, 3, 0, 0, 0,215, 73,160, 64,
+124,165, 49,190,232, 85, 66,192,223,108,172,251,214,188,255, 0, 3, 0, 0, 0,171, 89,178, 64,192,115, 24, 63, 78,116,221,191,
+127,121,192, 12,206,217,255, 0, 3, 0, 0, 0,100,228,172, 64,217,128,248, 63, 8, 93,150, 63,165,117,203, 42,170, 26,255, 0,
+ 3, 0, 0, 0, 82,171,182, 64,216,250,168, 63, 15, 15,147,190,134,124, 6, 29, 53,250,255, 0, 3, 0, 0, 0,216,108,155, 64,
+ 59,255,141,191,189,117, 69,192,195,105,137,232,214,187,255, 0, 3, 0, 0, 0, 85, 27,164, 64,244, 78, 9,192, 87,193,239,191,
+223,111,128,209,183,214,255, 0, 3, 0, 0, 0, 51,206,143, 64,133,250,105,192,119,251, 97, 63,171, 97,203,175, 63, 20,255, 0,
+ 3, 0, 0, 0, 62, 32,160, 64,163, 38, 65,192,164,117, 3,191, 20,109,232,189, 63,245,255, 0, 3, 0, 0, 0,130, 79, 99, 63,
+215,182,164,192, 10, 4, 42,192,138, 18,206,143, 66,197,255, 0, 3, 0, 0, 0,161, 86, 3, 64, 14,205,168,192, 60, 55,197,191,
+108, 44,225,140, 1,222,255, 0, 3, 0, 0, 0,134, 35,117, 64, 39,152,138,192, 73, 86,116, 63, 26, 84,254,161,183, 21,255, 0,
+ 3, 0, 0, 0, 35,220, 67, 64, 6,218,159,192,242,103,155,190, 16, 67, 41,147,201,249,255, 0, 3, 0, 0, 0,105,179, 10,189,
+ 25,185,169,192,120,119, 31,192,179,255,155,140,160,200,255, 0, 3, 0, 0, 0,143,198, 37,191,123,120,183,192,160,108,135,191,
+ 16,242,248,130,112,232,255, 0, 3, 0, 0, 0,229,101,215,191, 84,141,168,192, 16, 90,248, 63,245,218,108,141, 97, 43,255, 0,
+ 3, 0, 0, 0, 99, 52,155,191,198, 17,183,192,232,199,235, 62, 97,229, 64,131,136, 10,255, 0, 3, 0, 0, 0,121,134,159,192,
+ 49,245, 49,192,210,166,169,191,229,146, 14,196, 66,226,255, 0, 3, 0, 0, 0, 52,133,143,192,119,200,113,192,186,206, 29,190,
+236,157,217,173, 66,252,255, 0, 3, 0, 0, 0,180,174, 32,192, 65, 13,155,192,238,167, 8, 64, 9,202, 11,150, 93, 47,255, 0,
+ 3, 0, 0, 0, 69,199,104,192,177,135,143,192, 41, 12,132, 63,246,176,246,157,225, 22,255, 0, 3, 0, 0, 0,244,248,117,191,
+109, 90,148, 64,123, 0, 93, 64,248,235,190,101, 7, 75,255, 0, 3, 0, 0, 0,162, 0, 17,192, 63,196,113, 64, 52,239,119, 64,
+246,206,192, 82,112, 84,255, 0, 3, 0, 0, 0,151,133,136,192, 9,249,162, 63,106,219,115, 64, 81,162,209, 26,253, 82,255, 0,
+ 3, 0, 0, 0,110,124, 89,192,135, 6, 40, 64,223,195,127, 64,136,181,225, 56, 48, 87,255, 0, 3, 0, 0, 0,162,217, 7, 63,
+ 21,117,156, 64,222,238, 75, 64,117, 10,236,106,148, 69,255, 0, 3, 0, 0, 0,171,144, 6, 64,112,158,144, 64,198,241, 69, 64,
+100, 45,201, 98,141, 67,255, 0, 3, 0, 0, 0,110,238,148, 64,115,109, 50, 64,187,197, 13, 64, 86,102, 25, 60,239, 47,255, 0,
+ 3, 0, 0, 0, 79,252, 96, 64,140, 40,115, 64,116,165, 48, 64, 30, 77,158, 82, 20, 60,255, 0, 3, 0, 0, 0, 39,143,170, 64,
+167, 15,183, 63,251, 85,252, 63, 39,116, 87, 32,243, 42,255, 0, 3, 0, 0, 0, 8,214,175, 64,177,124, 53,190,206,241, 2, 64,
+233,119,167,252,164, 44,255, 0, 3, 0, 0, 0,238, 85,146, 64,178,205, 78,192, 70, 54,221, 63, 73, 99,122,184,136, 37,255, 0,
+ 3, 0, 0, 0, 76,137,167, 64,111, 31,227,191,158, 57,251, 63, 22,114,202,216,197, 42,255, 0, 3, 0, 0, 0,103,243, 95, 64,
+221, 91,138,192,186, 15,236, 63, 86, 77, 37,162,231, 39,255, 0, 3, 0, 0, 0, 46,206, 5, 64,121, 41,159,192,154, 91, 19, 64,
+ 26, 46,160,147, 30, 50,255, 0, 3, 0, 0, 0,169,200,139,191,198, 78,163,192,201,146, 42, 64, 9,231,197,144, 50, 58,255, 0,
+ 3, 0, 0, 0,187,128, 4, 63,206,181,167,192, 74, 92, 37, 64,199, 10,160,141,111, 56,255, 0, 3, 0, 0, 0,249,158, 27,192,
+197,118,141,192, 58,196, 62, 64,166,203,186,158,166, 64,255, 0, 3, 0, 0, 0, 98,244, 89,192, 8,120, 79,192, 65,128, 96, 64,
+248,181,217,184,105, 76,255, 0, 3, 0, 0, 0, 13,100,144,192,200,214,118,190, 64,205,110, 64, 74,157,219,251, 95, 81,255, 0,
+ 3, 0, 0, 0, 42,202,131,192, 60,161,231,191,142,245,112, 64,246,165, 1,217, 47, 82,255, 0, 3, 0, 0, 0,222,179,129,192,
+234,147,224, 62, 38,180,134, 64,173,166,192, 9, 38, 91,255, 0, 3, 0, 0, 0,114,138, 49,192,246, 97, 57, 62, 57, 76,165, 64,
+ 6,195, 9, 4,118,112,255, 0, 3, 0, 0, 0, 77,160,160, 62, 9, 20,182,190,108,232,186, 64,248, 7, 15,248,128,127,255, 0,
+ 3, 0, 0, 0, 33,144,163,191,151,144,186,189, 50, 47,183, 64,159,228,237,253, 4,125,255, 0, 3, 0, 0, 0, 60, 55,172,189,
+ 22, 64,143, 64,164,246,113, 64,229,253,124, 98,185, 81,255, 0, 3, 0, 0, 0,167,173,154, 62,111,224, 83, 64,198,169,154, 64,
+120, 6,167, 72, 45,105,255, 0, 3, 0, 0, 0,149, 51,122, 63, 52,151,163, 62, 15,157,184, 64,138, 21,220, 5, 8,126,255, 0,
+ 3, 0, 0, 0, 5,113, 42, 63, 31,112,241, 63, 15,119,176, 64,163, 14,172, 40,121,120,255, 0, 3, 0, 0, 0, 43,192,155, 64,
+151, 6,250, 63,170, 82, 39, 64,177,106, 9, 43, 25, 56,255, 0, 3, 0, 0, 0,233,118,132, 64,217,111,173, 63, 67,122,123, 64,
+156, 90,198, 29, 91, 85,255, 0, 3, 0, 0, 0,151, 16,231, 63,160,166,209,189,167, 95,178, 64,120, 38, 60,253, 11,122,255, 0,
+ 3, 0, 0, 0,163,200, 69, 64,178,143, 38, 63,148, 48,158, 64, 13, 67,245, 13, 33,108,255, 0, 3, 0, 0, 0,204, 83,125, 64,
+169, 55,105,192,244,162, 20, 64,184, 86, 10,176,174, 49,255, 0, 3, 0, 0, 0,178,215, 91, 64,222,235, 62,192,190,254,108, 64,
+ 41, 75,169,190,101, 80,255, 0, 3, 0, 0, 0,158,156,211, 63,185,228,132,191,190,207,176, 64, 92, 35, 25,234, 12,121,255, 0,
+ 3, 0, 0, 0, 0, 76, 41, 64,190,199, 5,192, 83,157,153, 64,110, 57,181,210, 10,105,255, 0, 3, 0, 0, 0,220, 4,199,191,
+ 7,145,146,192,104,186, 83, 64,147,221,119,155, 88, 71,255, 0, 3, 0, 0, 0, 9,120, 86,191,149, 91,109,192, 79,242,142, 64,
+123,237,192,174, 38, 97,255, 0, 3, 0, 0, 0,242, 63, 59, 63,210,237,152,191,251, 21,182, 64,131, 16,230,230,107,124,255, 0,
+ 3, 0, 0, 0, 86,230, 94,189,198, 30, 35,192,233, 15,169, 64, 18,255,204,200,121,115,255, 0, 3, 0, 0, 0,208, 27, 46,192,
+124,104, 86, 64, 85, 52,126,192,137,197,226, 72,134,168,255, 0, 3, 0, 0, 0, 82,168,234,191, 87, 62,149, 64,118, 12, 67,192,
+ 5,217,188,101,210,188,255, 0, 3, 0, 0, 0,186, 10, 16,192,249,106, 52, 64,210,253,147,192,182,206,131, 62,198,155,255, 0,
+ 3, 0, 0, 0, 93, 33,240,190,191,199, 71, 64,142, 47,158,192,214,245, 40, 69,199,148,255, 0, 3, 0, 0, 0, 19, 46, 71,187,
+194,240,115, 64,175,166,142,192,240,254,161, 82, 66,158,255, 0, 3, 0, 0, 0,188,194,101,191, 17, 84,154, 64,240,193, 77,192,
+ 76,235,214,104,142,185,255, 0, 3, 0, 0, 0,246,246,115,192,183, 86, 15, 64, 51,168,118,192,249,172,229, 47, 45,171,255, 0,
+ 3, 0, 0, 0,101, 1,160,192, 47,146,184, 63,153, 38, 45,192,225,146, 96, 30,102,196,255, 0, 3, 0, 0, 0,215,229, 85,192,
+166,178,218, 63,183, 55,144,192, 38,182,133, 37,110,158,255, 0, 3, 0, 0, 0,151,178,104,192,245,107,205,189,175, 60,147,192,
+178,175,205,253, 91,156,255, 0, 3, 0, 0, 0,192, 81,136,192, 55,239, 4,191, 24,222,127,192,130,163,158,245, 35,168,255, 0,
+ 3, 0, 0, 0, 70,241,164,192,102,218,251, 62,143, 82, 48,192,222,143,210, 11,110,195,255, 0, 3, 0, 0, 0,209,230,173, 63,
+231,135, 71, 64, 27,234,152,192,148, 29, 4, 67, 11,151,255, 0, 3, 0, 0, 0,158,103, 67, 64, 82,206, 51, 64, 39,168,132,192,
+203, 66, 63, 60,242,164,255, 0, 3, 0, 0, 0,136,131,100, 63, 16, 95, 27, 64, 4,115,168,192,122, 20,138, 53,143,141,255, 0,
+ 3, 0, 0, 0, 77,154,217, 63,185, 69, 78, 63,221,196,177,192, 53, 38,236, 17, 42,135,255, 0, 3, 0, 0, 0,107,195, 37, 64,
+ 4,213, 36, 63, 20, 33,167,192,151, 55,194, 14,168,141,255, 0, 3, 0, 0, 0,103,139, 94, 64,153,146,250, 63, 72,141,137,192,
+ 19, 75,156, 43,245,161,255, 0, 3, 0, 0, 0,231,195, 21, 64,236, 58,101,191,218,178,169,192,247, 49, 31,236,218,139,255, 0,
+ 3, 0, 0, 0,142, 32, 48, 64,155,140, 32,192,195, 1,145,192, 3, 59,178,200,204,156,255, 0, 3, 0, 0, 0, 70,155,185, 63,
+ 12,202, 59,191,163, 86,180,192,149, 32, 73,239, 91,133,255, 0, 3, 0, 0, 0, 29, 97, 43, 62,144,118, 2,192,125,231,175,192,
+106, 4,160,210,103,136,255, 0, 3, 0, 0, 0, 97,116,196, 62, 10,176, 56,192,120,239,162,192,164, 8, 20,194, 81,144,255, 0,
+ 3, 0, 0, 0,185, 2, 5, 64,217,105, 76,192,135,173,142,192,218, 45, 79,187, 56,158,255, 0, 3, 0, 0, 0,163,243,144,191,
+252, 41, 73,192,148, 66,154,192,134,230, 73,188,107,150,255, 0, 3, 0, 0, 0,147,133, 20,192,234, 55,124,192,176, 3,107,192,
+110,204,196,170,164,175,255, 0, 3, 0, 0, 0, 42,186, 60,192,219,128,189,191, 23, 43,155,192, 41,191,189,222,199,150,255, 0,
+ 3, 0, 0, 0, 52,164,172,191,106,240, 18,192,141, 58,167,192, 76,226,213,204,128,142,255, 0, 3, 0, 0, 0, 12,171,100,192,
+249, 33,243,191,106,221,135,192,248,178,143,214,143,162,255, 0, 3, 0, 0, 0,195, 78, 74,192,241,206, 96,192, 98, 88, 94,192,
+ 4,188, 34,179,129,179,255, 0, 3, 0, 0, 0, 41,110,177,192, 81, 30,186, 63,105,249,158,191,160,134,165, 30, 86,229,255, 0,
+ 3, 0, 0, 0, 45,138,172,192,114,149, 17, 64,127,203,200, 62,251,137,171, 48, 56, 9,255, 0, 3, 0, 0, 0, 10, 94,182,192,
+ 48, 5, 1, 63, 86, 81,165,191,156,131, 24, 12, 94,228,255, 0, 3, 0, 0, 0,117,224,186,192, 37,234,247,190,147, 56,126, 62,
+132,128,101,246, 46, 6,255, 0, 3, 0, 0, 0,204, 78,184,192, 19,193, 89,189,187,163,141, 63, 22,130,208,254,241, 22,255, 0,
+ 3, 0, 0, 0,105,232,174,192,151,187,224, 63,156,183,153, 63,137,136,137, 38, 3, 25,255, 0, 3, 0, 0, 0, 42,118, 68,191,
+101,173,176, 64,114,132,233,191, 57,238,142,120,217,216,255, 0, 3, 0, 0, 0, 81,172,191, 62, 67,208,186, 64,195,163,216,190,
+ 75, 7,131,127,159,247,255, 0, 3, 0, 0, 0,113, 2,218,191,172,151,171, 64,114, 25,212,191,243,219,116,117, 30,220,255, 0,
+ 3, 0, 0, 0,251,244, 21,192, 28, 12,172, 64, 13,151,128, 61,229,205,196,117,226, 1,255, 0, 3, 0, 0, 0, 51, 39,223,191,
+248, 94,177, 64,104,122, 76, 63,155,217, 3,121, 65, 16,255, 0, 3, 0, 0, 0, 72,208, 28, 61, 91, 13,187, 64, 64,215,245, 62,
+187, 0,168,127, 66, 9,255, 0, 3, 0, 0, 0, 45, 93,142, 64, 70,137, 14, 64,147,202, 70,192,241, 96,173, 49,202,188,255, 0,
+ 3, 0, 0, 0,106, 23,173, 64,157,131,182, 63,175,176,225,191, 7,118, 20, 32, 72,218,255, 0, 3, 0, 0, 0, 78,203,128, 64,
+124, 14, 69, 64, 55, 0, 61,192,168, 88, 80, 66,199,191,255, 0, 3, 0, 0, 0,133,175,133, 64, 28,149,121, 64, 51,212,168,191,
+ 4, 92, 86, 84,170,227,255, 0, 3, 0, 0, 0, 8,211,149, 64, 84,166, 94, 64, 68, 24, 29,191,221,101, 30, 76,113,241,255, 0,
+ 3, 0, 0, 0, 31,169,175, 64,138,176,237, 63, 15,168,103,191,152,119,128, 40, 11,235,255, 0, 3, 0, 0, 0,122, 78, 57, 64,
+224, 12,120,192, 7, 56, 84,192, 62, 64,247,171,239,183,255, 0, 3, 0, 0, 0, 0, 74, 48, 64,245,165,155,192,208, 87,227,191,
+ 38, 61, 68,150,192,217,255, 0, 3, 0, 0, 0, 85,108,100, 64,115, 47, 76,192,149,224, 88,192,102, 77, 90,185,131,182,255, 0,
+ 3, 0, 0, 0,173,191,150, 64,227,233, 55,192,198,101,254,191,121,102, 79,192, 73,213,255, 0, 3, 0, 0, 0,119, 97,148, 64,
+200, 33, 89,192, 24,225,150,191, 7,101, 44,182, 20,229,255, 0, 3, 0, 0, 0, 75,171, 86, 64, 36, 83,150,192, 22, 36,133,191,
+220, 72,131,153, 32,232,255, 0, 3, 0, 0, 0,116,251, 81,192,115, 80,139,192, 57,124, 10,192, 81,185, 53,160,254,208,255, 0,
+ 3, 0, 0, 0, 70,239,122,192, 53,220,138,192,113, 86,227,190, 68,171,132,160,195,246,255, 0, 3, 0, 0, 0, 14, 50, 28,192,
+245, 4,153,192,141, 39, 23,192,187,201,215,151, 33,205,255, 0, 3, 0, 0, 0, 34,123,189,191,203,168,178,192,149,106,130,191,
+209,222, 63,134,158,234,255, 0, 3, 0, 0, 0,176,127,232,191,177,107,178,192, 47,189,236,189, 65,216,100,134, 66,252,255, 0,
+ 3, 0, 0, 0, 53,168, 90,192,169, 83,152,192,227,201,133, 62, 29,181, 77,152,136, 4,255, 0, 3, 0, 0, 0,173,191,150,192,
+227,233, 55, 64,198,101,254, 63,135,153,177, 63,183, 42,255, 0, 3, 0, 0, 0, 85,108,100,192,115, 47, 76, 64,149,224, 88, 64,
+154,178,166, 70,125, 73,255, 0, 3, 0, 0, 0,119, 97,148,192,200, 33, 89, 64, 24,225,150, 63,249,154,212, 73,236, 26,255, 0,
+ 3, 0, 0, 0, 75,171, 86,192, 36, 83,150, 64, 22, 36,133, 63, 36,183,125,102,224, 23,255, 0, 3, 0, 0, 0, 0, 74, 48,192,
+245,165,155, 64,208, 87,227, 63,218,194,188,105, 64, 38,255, 0, 3, 0, 0, 0,122, 78, 57,192,224, 12,120, 64, 7, 56, 84, 64,
+194,191, 9, 84, 17, 72,255, 0, 3, 0, 0, 0, 34,123,189, 63,203,168,178, 64,149,106,130, 63, 47, 33,193,121, 98, 21,255, 0,
+ 3, 0, 0, 0, 14, 50, 28, 64,245, 4,153, 64,141, 39, 23, 64, 69, 54, 41,104,223, 50,255, 0, 3, 0, 0, 0,176,127,232, 63,
+177,107,178, 64, 47,189,236, 61,191, 39,156,121,190, 3,255, 0, 3, 0, 0, 0, 53,168, 90, 64,169, 83,152, 64,227,201,133,190,
+227, 74,179,103,120,251,255, 0, 3, 0, 0, 0, 70,239,122, 64, 53,220,138, 64,113, 86,227, 62,188, 84,124, 95, 61, 9,255, 0,
+ 3, 0, 0, 0,116,251, 81, 64,115, 80,139, 64, 57,124, 10, 64,175, 70,203, 95, 2, 47,255, 0, 3, 0, 0, 0,117,224,186, 64,
+ 37,234,247, 62,147, 56,126,190,124,127,155, 9,210,249,255, 0, 3, 0, 0, 0, 10, 94,182, 64, 48, 5, 1,191, 86, 81,165, 63,
+100,124,232,243,162, 27,255, 0, 3, 0, 0, 0,204, 78,184, 64, 19,193, 89, 61,187,163,141,191,234,125, 48, 1, 15,233,255, 0,
+ 3, 0, 0, 0,105,232,174, 64,151,187,224,191,156,183,153,191,119,119,119,217,253,230,255, 0, 3, 0, 0, 0, 45,138,172, 64,
+114,149, 17,192,127,203,200,190, 5,118, 85,207,200,246,255, 0, 3, 0, 0, 0, 41,110,177, 64, 81, 30,186,191,105,249,158, 63,
+ 96,121, 91,225,170, 26,255, 0, 3, 0, 0, 0,251,244, 21, 64, 28, 12,172,192, 13,151,128,189, 27, 50, 60,138, 30,254,255, 0,
+ 3, 0, 0, 0,113, 2,218, 63,172,151,171,192,114, 25,212, 63, 13, 36,140,138,226, 35,255, 0, 3, 0, 0, 0, 51, 39,223, 63,
+248, 94,177,192,104,122, 76,191,101, 38,253,134,191,239,255, 0, 3, 0, 0, 0, 72,208, 28,189, 91, 13,187,192, 64,215,245,190,
+ 69,255, 88,128,190,246,255, 0, 3, 0, 0, 0, 81,172,191,190, 67,208,186,192,195,163,216, 62,181,248,125,128, 97, 8,255, 0,
+ 3, 0, 0, 0, 42,118, 68, 63,101,173,176,192,114,132,233, 63,199, 17,114,135, 39, 39,255, 0, 3, 0, 0, 0,133,175,133,192,
+ 28,149,121,192, 51,212,168, 63,252,163,170,171, 86, 28,255, 0, 3, 0, 0, 0, 78,203,128,192,124, 14, 69,192, 55, 0, 61, 64,
+ 88,167,176,189, 57, 64,255, 0, 3, 0, 0, 0, 31,169,175,192,138,176,237,191, 15,168,103, 63,104,136,128,215,245, 20,255, 0,
+ 3, 0, 0, 0, 8,211,149,192, 84,166, 94,192, 68, 24, 29, 63, 35,154,226,179,143, 14,255, 0, 3, 0, 0, 0,106, 23,173,192,
+157,131,182,191,175,176,225, 63,249,137,236,223,184, 37,255, 0, 3, 0, 0, 0, 45, 93,142,192, 70,137, 14,192,147,202, 70, 64,
+ 15,159, 83,206, 54, 67,255, 0, 3, 0, 0, 0,185, 2, 5,192,217,105, 76, 64,135,173,142, 64, 38,210,177, 68,200, 97,255, 0,
+ 3, 0, 0, 0, 97,116,196,190, 10,176, 56, 64,120,239,162, 64, 92,247,236, 61,175,111,255, 0, 3, 0, 0, 0,142, 32, 48,192,
+155,140, 32, 64,195, 1,145, 64,253,196, 78, 55, 52, 99,255, 0, 3, 0, 0, 0,231,195, 21,192,236, 58,101, 63,218,178,169, 64,
+ 9,206,225, 19, 38,116,255, 0, 3, 0, 0, 0, 70,155,185,191, 12,202, 59, 63,163, 86,180, 64,107,223,183, 16,165,122,255, 0,
+ 3, 0, 0, 0, 29, 97, 43,190,144,118, 2, 64,125,231,175, 64,150,251, 96, 45,153,119,255, 0, 3, 0, 0, 0,195, 78, 74, 64,
+241,206, 96, 64, 98, 88, 94, 64,252, 67,222, 76,127, 76,255, 0, 3, 0, 0, 0, 12,171,100, 64,249, 33,243, 63,106,221,135, 64,
+ 8, 77,113, 41,113, 93,255, 0, 3, 0, 0, 0,147,133, 20, 64,234, 55,124, 64,176, 3,107, 64,146, 51, 60, 85, 92, 80,255, 0,
+ 3, 0, 0, 0,164,243,144, 63,252, 41, 73, 64,148, 66,154, 64,122, 25,183, 67,149,105,255, 0, 3, 0, 0, 0, 52,164,172, 63,
+106,240, 18, 64,141, 58,167, 64,180, 29, 43, 51,128,113,255, 0, 3, 0, 0, 0, 42,186, 60, 64,219,128,189, 63, 23, 43,155, 64,
+215, 64, 67, 33, 57,105,255, 0, 3, 0, 0, 0,101, 1,160, 64, 47,146,184,191,153, 38, 45, 64, 31,109,160,225,154, 59,255, 0,
+ 3, 0, 0, 0,246,246,115, 64,183, 86, 15,192, 51,168,118, 64, 7, 83, 27,208,211, 84,255, 0, 3, 0, 0, 0, 70,241,164, 64,
+102,218,251,190,143, 82, 48, 64, 34,112, 46,244,146, 60,255, 0, 3, 0, 0, 0,192, 81,136, 64, 55,239, 4, 63, 24,222,127, 64,
+126, 92, 98, 10,221, 87,255, 0, 3, 0, 0, 0,151,178,104, 64,245,107,205, 61,175, 60,147, 64, 78, 80, 51, 2,165, 99,255, 0,
+ 3, 0, 0, 0,215,229, 85, 64,166,178,218,191,183, 55,144, 64,218, 73,123,218,146, 97,255, 0, 3, 0, 0, 0,188,194,101, 63,
+ 17, 84,154,192,240,193, 77, 64,180, 20, 42,151,114, 70,255, 0, 3, 0, 0, 0, 19, 46, 71, 59,194,240,115,192,175,166,142, 64,
+ 16, 1, 95,173,190, 97,255, 0, 3, 0, 0, 0, 82,168,234, 63, 87, 62,149,192,118, 12, 67, 64,251, 38, 68,154, 46, 67,255, 0,
+ 3, 0, 0, 0,208, 27, 46, 64,124,104, 86,192, 85, 52,126, 64,119, 58, 30,183,122, 87,255, 0, 3, 0, 0, 0,186, 10, 16, 64,
+249,106, 52,192,210,253,147, 64, 74, 49,125,193, 58,100,255, 0, 3, 0, 0, 0, 93, 33,240, 62,191,199, 71,192,142, 47,158, 64,
+ 42, 10,216,186, 57,107,255, 0, 3, 0, 0, 0,103,139, 94,192,153,146,250,191, 72,141,137, 64,237,180,100,212, 11, 94,255, 0,
+ 3, 0, 0, 0,107,195, 37,192, 4,213, 36,191, 20, 33,167, 64,105,200, 62,241, 88,114,255, 0, 3, 0, 0, 0,158,103, 67,192,
+ 82,206, 51,192, 39,168,132, 64, 53,189,193,195, 14, 91,255, 0, 3, 0, 0, 0,209,230,173,191,231,135, 71,192, 27,234,152, 64,
+108,226,252,188,245,104,255, 0, 3, 0, 0, 0, 77,154,217,191,185, 69, 78,191,221,196,177, 64,203,217, 20,238,214,120,255, 0,
+ 3, 0, 0, 0,136,131,100,191, 16, 95, 27,192, 4,115,168, 64,134,235,118,202,113,114,255, 0, 3, 0, 0, 0,139,220, 37,192,
+245,135,141, 64,114,173, 54,192, 45,199, 95, 96,211,193,255, 0, 3, 0, 0, 0,204,119, 84,192, 93, 73,130, 64,212,107, 38,192,
+ 58,183,223, 88,137,199,255, 0, 3, 0, 0, 0,208, 76, 67,192, 62,120,111, 64, 14, 89, 85,192, 80,189,196, 81,140,183,255, 0,
+ 3, 0, 0, 0, 68,147,238,191,166,230,100, 64,234, 9,136,192,216,215,130, 78, 59,163,255, 0, 3, 0, 0, 0, 30,149,109,191,
+ 40, 18,111, 64,171,100,141,192, 37,235,201, 81,199,159,255, 0, 3, 0, 0, 0,144,237,178,191, 25,136,136, 64,121, 1,113,192,
+117,225,189, 92, 62,173,255, 0, 3, 0, 0, 0,214, 82, 66, 63,128,115,152, 64,164, 25, 85,192,241, 16, 27,104,126,183,255, 0,
+ 3, 0, 0, 0,119,155,171,189,138, 40,155, 64,113, 96, 83,192,128,254,196,105,238,183,255, 0, 3, 0, 0, 0, 67,138,194, 62,
+177, 97,138, 64, 75,158,124,192,112, 8,134, 94, 29,170,255, 0, 3, 0, 0, 0,158,106, 94,191,167,106, 30, 64,254,240,167,192,
+229,236,187, 53,105,141,255, 0, 3, 0, 0, 0, 22,114,229,191,193, 96, 20, 64,253,167,162,192, 22,217, 93, 50,244,144,255, 0,
+ 3, 0, 0, 0, 45,210,162,191,233,211,224, 63,184, 67,174,192, 69,228,245, 37,244,136,255, 0, 3, 0, 0, 0, 37, 61,152,192,
+230, 9, 14, 64,137,179, 39,192, 85,152,183, 48,226,198,255, 0, 3, 0, 0, 0,232,187,140,192, 6, 96, 62, 64,107,247, 30,192,
+ 7,160, 68, 65, 11,202,255, 0, 3, 0, 0, 0,116,134,132,192, 40,130, 40, 64,237,207, 77,192,139,165,149, 57, 30,186,255, 0,
+ 3, 0, 0, 0, 12,129,129,192,231,129,173, 63,159,125,128,192, 62,167, 15, 29,123,168,255, 0, 3, 0, 0, 0,254,112,134,192,
+126,146,207, 62,159, 19,130,192, 15,164,119, 9,117,167,255, 0, 3, 0, 0, 0,189,121,149,192,142,192,111, 63, 76, 95, 90,192,
+ 95,154,107, 20,236,180,255, 0, 3, 0, 0, 0, 12, 65,162,192, 11, 84,149,191,172,202, 44,192, 60,145, 47,230, 75,197,255, 0,
+ 3, 0, 0, 0, 74,120,165,192, 95, 78,167,190,139, 51, 48,192, 54,143,140,248,244,195,255, 0, 3, 0, 0, 0, 61,161,150,192,
+107,221, 89,191,118,113, 89,192, 40,153, 79,237, 35,182,255, 0, 3, 0, 0, 0, 52, 56, 66,192,206, 40,139, 62, 21,116,160,192,
+ 13,190, 19, 6,121,146,255, 0, 3, 0, 0, 0,245,120, 56,192,118,213,154, 63, 81,227,158,192, 81,193, 47, 26,133,147,255, 0,
+ 3, 0, 0, 0,220,104, 22,192,204,221, 40, 63,115,137,170,192, 16,205, 89, 14,117,139,255, 0, 3, 0, 0, 0,145,143, 39, 64,
+190, 49, 94, 64,165, 27,124,192,238, 56,252, 75, 43,170,255, 0, 3, 0, 0, 0,130,168, 6, 64,190,132,130, 64, 12, 96,105,192,
+226, 45, 91, 89,173,176,255, 0, 3, 0, 0, 0, 76,169,222, 63,205,107,104, 64,150,142,136,192, 23, 38,105, 79, 33,163,255, 0,
+ 3, 0, 0, 0,137,207,229, 63, 30, 63, 22, 64,207,235,161,192,198, 39,227, 50,127,145,255, 0, 3, 0, 0, 0,239, 11, 14, 64,
+175,114,191, 63,254,208,166,192,133, 48, 81, 33, 87,142,255, 0, 3, 0, 0, 0,239,222, 43, 64,212,226, 11, 64,227, 71,151,192,
+ 33, 58,140, 47, 91,152,255, 0, 3, 0, 0, 0, 0,245,124, 64, 27, 32,187, 62, 57, 6,138,192,138, 86,176, 7, 2,162,255, 0,
+ 3, 0, 0, 0, 42, 75,112, 64,228, 42,152, 63, 25, 44,139,192, 0, 82,159, 25, 31,161,255, 0, 3, 0, 0, 0,178,218, 82, 64,
+178,247, 1, 63,211,129,154,192, 35, 72, 4, 11,217,150,255, 0, 3, 0, 0, 0,208,203,104, 63,146, 6,113, 63,108, 5,183,192,
+132, 19,150, 20, 49,131,255, 0, 3, 0, 0, 0, 26, 68,251, 62,111, 38,228, 63,114, 48,178,192,139, 10,158, 38,109,134,255, 0,
+ 3, 0, 0, 0,163, 78,149, 61, 65, 25,137, 63,234,102,184,192, 54, 1, 52, 23, 34,130,255, 0, 3, 0, 0, 0, 98,140, 80, 64,
+169,205,238,191, 83, 69,144,192, 70, 71,145,215,173,157,255, 0, 3, 0, 0, 0,177, 39,109, 64,155,213,147,191,238,143,140,192,
+ 57, 81,247,230, 77,160,255, 0, 3, 0, 0, 0,100,225, 66, 64,146,191,131,191,152, 18,157,192,178, 66,128,233, 25,149,255, 0,
+ 3, 0, 0, 0,190, 24,220, 63,163,163,202,191,160,244,171,192, 99, 37,199,220,196,138,255, 0, 3, 0, 0, 0,227,219,133, 63,
+172, 47, 17,192, 93,160,169,192,126, 23,164,206, 68,140,255, 0, 3, 0, 0, 0, 46,202,247, 63, 23,140, 27,192,116,252,158,192,
+217, 41, 77,203, 32,147,255, 0, 3, 0, 0, 0, 36,220, 68, 63, 24,143,132,192, 20,105,130,192,163, 16, 66,165, 72,167,255, 0,
+ 3, 0, 0, 0, 60,255,185, 63,215,244,108,192,129, 7,138,192,113, 31, 11,175,251,161,255, 0, 3, 0, 0, 0,220, 18, 19, 63,
+168,186, 98,192, 66,136,148,192,155, 12,121,178,241,154,255, 0, 3, 0, 0, 0,131,119,172,187,182,209,162,191,170, 73,183,192,
+209,255,144,228,251,130,255, 0, 3, 0, 0, 0,165,230, 40, 63,246,111, 24,191, 50,150,185,192, 19, 14, 18,243,113,129,255, 0,
+ 3, 0, 0, 0,123, 45, 50,190,213, 16,230,190,160,240,186,192,231,251,124,246,109,128,255, 0, 3, 0, 0, 0,221, 22,199,191,
+ 71,211,134,192, 37,161,113,192, 98,222,255,163,157,173,255, 0, 3, 0, 0, 0,171,131, 58,191, 57,178,140,192,214,174,115,192,
+105,240,201,159, 11,173,255, 0, 3, 0, 0, 0,228,119,112,191, 49, 46,115,192,186,222,139,192,152,235,221,172,217,160,255, 0,
+ 3, 0, 0, 0,122, 75,254,191, 18, 36, 50,192, 84, 70,152,192,253,211, 46,195, 87,152,255, 0, 3, 0, 0, 0,190,239, 52,192,
+193,186, 22,192,166,240,145,192,167,194, 3,204,108,156,255, 0, 3, 0, 0, 0, 51, 23, 39,192, 14,245, 76,192,105,248,132,192,
+ 29,199,137,186,200,164,255, 0, 3, 0, 0, 0,202,137,140,192, 4,234, 33,192,152,117, 60,192,215,159,216,200, 6,192,255, 0,
+ 3, 0, 0, 0, 68,176,115,192, 85, 49, 68,192, 65,173, 79,192,178,172, 81,189, 81,185,255, 0, 3, 0, 0, 0,131,173,128,192,
+ 50,170, 14,192,247, 71,105,192, 30,168, 64,207,189,176,255, 0, 3, 0, 0, 0,230, 80, 22,192, 50,155,141,191,108, 95,168,192,
+ 3,205, 6,232, 19,141,255, 0, 3, 0, 0, 0, 96,113,194,191,166,184,195,191, 31,160,174,192,205,222,245,222,227,136,255, 0,
+ 3, 0, 0, 0,249,244,213,191, 10, 33, 52,191,248, 94,178,192,172,219, 3,241, 48,134,255, 0, 3, 0, 0, 0, 30, 26,167,192,
+ 62, 11, 42, 64,199,163,159,190, 45,142, 26, 58,236,248,255, 0, 3, 0, 0, 0, 15,242,157,192,177, 35, 63, 64,242,230,132,191,
+115,148,134, 65, 39,233,255, 0, 3, 0, 0, 0, 58,163,169,192,184,207, 14, 64, 43, 92,148,191,122,140,250, 48,193,230,255, 0,
+ 3, 0, 0, 0,241, 83,184,192, 33,241,117, 63,204, 69,248,190, 32,130,245, 20, 22,246,255, 0, 3, 0, 0, 0, 88,178,186,192,
+180, 33,226, 62, 69,211,165, 62,153,128, 65, 10,196, 6,255, 0, 3, 0, 0, 0,100,194,181,192,227, 37,178, 63, 65, 51,191, 62,
+199,131,217, 29,201, 7,255, 0, 3, 0, 0, 0,140, 68,168,192,162,100, 57, 63, 90, 41, 31, 64, 91,141,195, 15,175, 54,255, 0,
+ 3, 0, 0, 0,185,114,173,192,147, 11,162, 63,136,131,237, 63,204,137,106, 27,187, 40,255, 0, 3, 0, 0, 0, 90, 82,178,192,
+181, 0,168, 62,125, 64,231, 63,136,134, 78, 7,175, 39,255, 0, 3, 0, 0, 0,235, 52,185,192,191,185, 83,191, 39,176,252,190,
+201,129,211,237,241,244,255, 0, 3, 0, 0, 0, 95,222,182,192,178, 32,161,190, 48, 92,165,191, 90,131,208,248,211,227,255, 0,
+ 3, 0, 0, 0, 52,119,179,192,223,204,147,191,116,141,160,191,169,133,113,230,103,228,255, 0, 3, 0, 0, 0,109, 88, 35, 63,
+129,186,182, 64,207, 8,152,191, 5, 14,127,124,202,229,255, 0, 3, 0, 0, 0,226, 54, 99, 63,172,134,174, 64, 96, 98,250,191,
+180, 19,244,118, 14,213,255, 0, 3, 0, 0, 0,150,195, 60, 61, 46,121,177, 64,174, 6,245,191, 84, 1,249,120, 55,214,255, 0,
+ 3, 0, 0, 0,228,160,145,191,121, 59,181, 64,246,252,123,191, 63,231,214,123, 42,235,255, 0, 3, 0, 0, 0, 29,166,188,191,
+167,120,181, 64, 4,224,165,189, 81,224,253,123,203,253,255, 0, 3, 0, 0, 0, 26,186, 9,191,104,142,186, 64,128, 74,126,190,
+158,243, 69,127, 88,250,255, 0, 3, 0, 0, 0,179,205, 19,191, 33,145,175, 64,102,151,253, 63,125,243,171,119,167, 43,255, 0,
+ 3, 0, 0, 0,163,114,134,190, 81, 94,183, 64, 73,210,157, 63, 40,250,240,124, 49, 27,255, 0, 3, 0, 0, 0,253,217,151,191,
+ 90, 89,178, 64,210,246,178, 63, 89,230,146,121,187, 30,255, 0, 3, 0, 0, 0,107,200, 50,192, 4, 21,164, 64,143,252, 18,191,
+229,194,189,111, 58,243,255, 0, 3, 0, 0, 0,219,140, 29,192,164,216,163, 64,163,160,187,191, 2,202,148,111, 27,224,255, 0,
+ 3, 0, 0, 0, 8, 63, 76,192,149, 92,152, 64,201, 6,157,191,254,185,184,103, 25,229,255, 0, 3, 0, 0, 0,102, 31,167, 64,
+ 18,113,133, 63,122,150, 29,192,214,113,149, 22, 5,202,255, 0, 3, 0, 0, 0,115, 48,157, 64, 74,183, 33, 63, 21,172, 72,192,
+ 50,107,106, 13, 91,187,255, 0, 3, 0, 0, 0,250, 48,151, 64,117,157,186, 63,236, 37, 74,192, 41,103,126, 31, 23,187,255, 0,
+ 3, 0, 0, 0,118, 31,148, 64,144, 99, 46, 64, 95,237, 21,192,101,101,141, 59,115,205,255, 0, 3, 0, 0, 0, 40,177,150, 64,
+101,250, 73, 64,104,252,189,191, 13,103,113, 68, 39,223,255, 0, 3, 0, 0, 0, 59, 67,164, 64,106,116, 19, 64, 96,145,209,191,
+204,111,223, 50,255,219,255, 0, 3, 0, 0, 0, 9, 99,168, 64,184,173, 32, 64,129, 16, 27, 63,228,114,189, 54,164, 13,255, 0,
+ 3, 0, 0, 0,225, 1,174, 64, 65,167, 12, 64,199, 1, 38,190,149,118, 17, 48,195,252,255, 0, 3, 0, 0, 0,172,156,160, 64,
+ 23,121, 66, 64,220,253, 53,188,155,109, 25, 66, 0, 0,255, 0, 3, 0, 0, 0,230,184,106, 64,117, 83,133, 64, 76, 95,243,191,
+202, 79,251, 90, 77,214,255, 0, 3, 0, 0, 0,116,166,101, 64, 67,107,111, 64, 69,233, 47,192, 23, 78,219, 81, 34,196,255, 0,
+ 3, 0, 0, 0,109, 20, 68, 64,202, 9,139, 64,124,255, 29,192,138, 66, 22, 95, 6,202,255, 0, 3, 0, 0, 0, 46,138, 12, 64,
+195,168,156,192, 99,240, 23,192,172, 47, 54,149,252,203,255, 0, 3, 0, 0, 0,110,189,201, 63, 48, 28,154,192,180,148, 60,192,
+ 2, 34,195,150,147,191,255, 0, 3, 0, 0, 0, 21, 55, 17, 64,125, 67,140,192,118, 8, 75,192, 61, 49, 50,160,221,186,255, 0,
+ 3, 0, 0, 0, 85,126,100, 64,103,211,114,192,187,176, 43,192, 60, 78,241,172, 2,198,255, 0, 3, 0, 0, 0, 29,112,133, 64,
+168, 45,104,192, 95, 44,249,191,154, 90, 96,176, 48,213,255, 0, 3, 0, 0, 0,192,193, 95, 64,221, 5,138,192, 42,219,239,191,
+181, 76, 61,162,177,214,255, 0, 3, 0, 0, 0, 28, 21,134, 64,185,231,130,192,175,210,133, 62,128, 91,182,166, 33, 6,255, 0,
+ 3, 0, 0, 0,128,101,115, 64,106,100,142,192,214,174,205,190, 32, 83, 12,159,127,247,255, 0, 3, 0, 0, 0,187,250,142, 64,
+178,123,113,192, 90,120,242,190, 99, 97,142,173,244,245,255, 0, 3, 0, 0, 0,115, 83,149, 64, 25,118, 24,192, 96, 5, 41,192,
+195,101, 61,204, 36,198,255, 0, 3, 0, 0, 0,236, 97,130, 64,181,248, 34,192, 49,132, 87,192, 17, 89,184,200,144,182,255, 0,
+ 3, 0, 0, 0,186,103,144, 64, 91, 9,234,191,150,226, 80,192,152, 98,121,216,152,184,255, 0, 3, 0, 0, 0,208, 74,136,192,
+231,117,121,192, 32,193,133,191,248,162, 42,171,249,232,255, 0, 3, 0, 0, 0, 31, 84,144,192, 24, 19, 87,192, 53, 65,211,191,
+ 74,157,248,182,224,219,255, 0, 3, 0, 0, 0, 7, 90,123,192,107,238,121,192,115,227,247,191, 22,170, 1,171,218,213,255, 0,
+ 3, 0, 0, 0,161,112, 54,192, 94, 77,156,192,207,107,196,191,198,193, 23,149, 32,223,255, 0, 3, 0, 0, 0, 24, 41, 22,192,
+ 1,197,169,192,191, 68, 84,191, 45,204,105,140,172,237,255, 0, 3, 0, 0, 0, 73,243, 75,192, 86, 16,156,192,180,150, 33,191,
+216,186, 63,149,194,241,255, 0, 3, 0, 0, 0,140,246, 19,192,148, 60,166,192, 11, 70,182, 63,164,205,159,142,127, 31,255, 0,
+ 3, 0, 0, 0, 17, 21, 58,192,224,209,160,192,103,100, 88, 63,202,192, 72,146,171, 18,255, 0, 3, 0, 0, 0,151,252, 4,192,
+ 71, 89,174,192,215, 93, 38, 63,148,210, 55,137,122, 14,255, 0, 3, 0, 0, 0, 53,176,150,191,238,252,174,192, 37,172,226,191,
+114,230,199,136, 20,217,255, 0, 3, 0, 0, 0,225,105,214,191,211,177,161,192,160,229, 29,192,197,219,175,145, 38,202,255, 0,
+ 3, 0, 0, 0, 62,213, 88,191,193, 70,167,192,212,217, 32,192,221,237,232,141,230,200,255, 0, 3, 0, 0, 0,236, 97,130,192,
+181,248, 34, 64, 49,132, 87, 64,239,166, 72, 55,112, 73,255, 0, 3, 0, 0, 0,186,103,144,192, 91, 9,234, 63,150,226, 80, 64,
+104,157,135, 39,104, 71,255, 0, 3, 0, 0, 0,115, 83,149,192, 25,118, 24, 64, 96, 5, 41, 64, 61,154,195, 51,220, 57,255, 0,
+ 3, 0, 0, 0, 29,112,133,192,168, 45,104, 64, 95, 44,249, 63,102,165,160, 79,208, 42,255, 0, 3, 0, 0, 0,192,193, 95,192,
+221, 5,138, 64, 42,219,239, 63, 75,179,195, 93, 79, 41,255, 0, 3, 0, 0, 0, 85,126,100,192,103,211,114, 64,187,176, 43, 64,
+196,177, 15, 83,254, 57,255, 0, 3, 0, 0, 0,110,189,201,191, 48, 28,154, 64,180,148, 60, 64,254,221, 61,105,109, 64,255, 0,
+ 3, 0, 0, 0, 21, 55, 17,192,125, 67,140, 64,118, 8, 75, 64,195,206,206, 95, 35, 69,255, 0, 3, 0, 0, 0, 46,138, 12,192,
+195,168,156, 64, 99,240, 23, 64, 84,208,202,106, 4, 52,255, 0, 3, 0, 0, 0,128,101,115,192,106,100,142, 64,214,174,205, 62,
+224,172,244, 96,129, 8,255, 0, 3, 0, 0, 0,187,250,142,192,178,123,113, 64, 90,120,242, 62,157,158,114, 82, 12, 10,255, 0,
+ 3, 0, 0, 0, 28, 21,134,192,185,231,130, 64,175,210,133,190,128,164, 74, 89,223,249,255, 0, 3, 0, 0, 0,225,105,214, 63,
+211,177,161, 64,160,229, 29, 64, 59, 36, 81,110,218, 53,255, 0, 3, 0, 0, 0, 62,213, 88, 63,193, 70,167, 64,212,217, 32, 64,
+ 35, 18, 24,114, 26, 55,255, 0, 3, 0, 0, 0, 53,176,150, 63,238,252,174, 64, 37,172,226, 63,142, 25, 57,119,236, 38,255, 0,
+ 3, 0, 0, 0, 24, 41, 22, 64, 1,197,169, 64,191, 68, 84, 63,211, 51,151,115, 84, 18,255, 0, 3, 0, 0, 0, 73,243, 75, 64,
+ 86, 16,156, 64,180,150, 33, 63, 40, 69,193,106, 62, 14,255, 0, 3, 0, 0, 0,161,112, 54, 64, 94, 77,156, 64,208,107,196, 63,
+ 58, 62,233,106,224, 32,255, 0, 3, 0, 0, 0, 31, 84,144, 64, 24, 19, 87, 64, 53, 65,211, 63,182, 98, 8, 73, 32, 36,255, 0,
+ 3, 0, 0, 0, 7, 90,123, 64,107,238,121, 64,115,227,247, 63,234, 85,255, 84, 38, 42,255, 0, 3, 0, 0, 0,208, 74,136, 64,
+231,117,121, 64, 32,193,133, 63, 8, 93,214, 84, 7, 23,255, 0, 3, 0, 0, 0, 17, 21, 58, 64,224,209,160, 64,103,100, 88,191,
+ 54, 63,184,109, 85,237,255, 0, 3, 0, 0, 0,151,252, 4, 64, 71, 89,174, 64,215, 93, 38,191,108, 45,201,118,134,241,255, 0,
+ 3, 0, 0, 0,140,246, 19, 64,148, 60,166, 64, 11, 70,182,191, 92, 50, 97,113,129,224,255, 0, 3, 0, 0, 0, 95,222,182, 64,
+178, 32,161, 62, 48, 92,165, 63,166,124, 48, 7, 45, 28,255, 0, 3, 0, 0, 0, 52,119,179, 64,223,204,147, 63,116,141,160, 63,
+ 87,122,143, 25,153, 27,255, 0, 3, 0, 0, 0,235, 52,185, 64,191,185, 83, 63, 39,176,252, 62, 55,126, 45, 18, 15, 11,255, 0,
+ 3, 0, 0, 0, 88,178,186, 64,180, 33,226,190, 69,211,165,190,103,127,191,245, 60,249,255, 0, 3, 0, 0, 0,100,194,181, 64,
+227, 37,178,191, 65, 51,191,190, 57,124, 39,226, 55,248,255, 0, 3, 0, 0, 0,241, 83,184, 64, 33,241,117,191,204, 69,248, 62,
+224,125, 11,235,234, 9,255, 0, 3, 0, 0, 0, 15,242,157, 64,177, 35, 63,192,242,230,132, 63,141,107,122,190,217, 22,255, 0,
+ 3, 0, 0, 0, 58,163,169, 64,184,207, 14,192, 43, 92,148, 63,134,115, 6,207, 63, 25,255, 0, 3, 0, 0, 0, 30, 26,167, 64,
+ 62, 11, 42,192,199,163,159, 62,211,113,230,197, 20, 7,255, 0, 3, 0, 0, 0,185,114,173, 64,147, 11,162,191,136,131,237,191,
+ 52,118,150,228, 69,215,255, 0, 3, 0, 0, 0, 90, 82,178, 64,181, 0,168,190,125, 64,231,191,120,121,178,248, 81,216,255, 0,
+ 3, 0, 0, 0,140, 68,168, 64,162,100, 57,191, 90, 41, 31,192,165,114, 61,240, 81,201,255, 0, 3, 0, 0, 0,219,140, 29, 64,
+164,216,163,192,163,160,187, 63,254, 53,108,144,229, 31,255, 0, 3, 0, 0, 0, 8, 63, 76, 64,149, 92,152,192,201, 6,157, 63,
+ 2, 70, 72,152,231, 26,255, 0, 3, 0, 0, 0,107,200, 50, 64, 4, 21,164,192,143,252, 18, 63, 27, 61, 67,144,198, 12,255, 0,
+ 3, 0, 0, 0, 29,166,188, 63,167,120,181,192, 4,224,165, 61,175, 31, 3,132, 53, 2,255, 0, 3, 0, 0, 0, 26,186, 9, 63,
+104,142,186,192,128, 74,126, 62, 98, 12,187,128,168, 5,255, 0, 3, 0, 0, 0,228,160,145, 63,121, 59,181,192,246,252,123, 63,
+193, 24, 42,132,214, 20,255, 0, 3, 0, 0, 0,226, 54, 99,191,172,134,174,192, 96, 98,250, 63, 76,236, 12,137,242, 42,255, 0,
+ 3, 0, 0, 0,150,195, 60,189, 46,121,177,192,174, 6,245, 63,172,254, 7,135,201, 41,255, 0, 3, 0, 0, 0,109, 88, 35,191,
+129,186,182,192,207, 8,152, 63,251,241,129,131, 54, 26,255, 0, 3, 0, 0, 0,163,114,134, 62, 81, 94,183,192, 73,210,157,191,
+216, 5, 16,131,207,228,255, 0, 3, 0, 0, 0,253,217,151, 63, 90, 89,178,192,210,246,178,191,167, 25,110,134, 69,225,255, 0,
+ 3, 0, 0, 0,179,205, 19, 63, 33,145,175,192,102,151,253,191,131, 12, 85,136, 89,212,255, 0, 3, 0, 0, 0,116,166,101,192,
+ 67,107,111,192, 69,233, 47, 64,233,177, 37,174,222, 59,255, 0, 3, 0, 0, 0,109, 20, 68,192,202, 9,139,192,124,255, 29, 64,
+118,189,234,160,250, 53,255, 0, 3, 0, 0, 0,230,184,106,192,117, 83,133,192, 76, 95,243, 63, 54,176, 5,165,179, 41,255, 0,
+ 3, 0, 0, 0, 40,177,150,192,101,250, 73,192,104,252,189, 63,243,152,143,187,217, 32,255, 0, 3, 0, 0, 0, 59, 67,164,192,
+106,116, 19,192, 96,145,209, 63, 52,144, 33,205, 1, 36,255, 0, 3, 0, 0, 0,118, 31,148,192,144, 99, 46,192, 95,237, 21, 64,
+155,154,115,196,141, 50,255, 0, 3, 0, 0, 0,115, 48,157,192, 74,183, 33,191, 21,172, 72, 64,206,148,150,242,165, 68,255, 0,
+ 3, 0, 0, 0,250, 48,151,192,117,157,186,191,236, 37, 74, 64,215,152,130,224,233, 68,255, 0, 3, 0, 0, 0,102, 31,167,192,
+ 18,113,133,191,122,150, 29, 64, 42,142,107,233,251, 53,255, 0, 3, 0, 0, 0,225, 1,174,192, 65,167, 12,192,199, 1, 38, 62,
+107,137,239,207, 61, 3,255, 0, 3, 0, 0, 0,172,156,160,192, 23,121, 66,192,220,253, 53, 60,101,146,231,189, 0, 0,255, 0,
+ 3, 0, 0, 0, 9, 99,168,192,184,173, 32,192,129, 16, 27,191, 28,141, 67,201, 92,242,255, 0, 3, 0, 0, 0,220, 18, 19,191,
+168,186, 98, 64, 66,136,148, 64,101,243,135, 77, 15,101,255, 0, 3, 0, 0, 0, 36,220, 68,191, 24,143,132, 64, 20,105,130, 64,
+ 93,239,190, 90,184, 88,255, 0, 3, 0, 0, 0, 60,255,185,191,215,244,108, 64,129, 7,138, 64,143,224,245, 80, 5, 94,255, 0,
+ 3, 0, 0, 0, 46,202,247,191, 23,140, 27, 64,116,252,158, 64, 39,214,179, 52,224,108,255, 0, 3, 0, 0, 0,190, 24,220,191,
+163,163,202, 63,160,244,171, 64,157,218, 57, 35, 60,117,255, 0, 3, 0, 0, 0,227,219,133,191,172, 47, 17, 64, 93,160,169, 64,
+130,232, 92, 49,188,115,255, 0, 3, 0, 0, 0,123, 45, 50, 62,213, 16,230, 62,160,240,186, 64, 25, 4,132, 9,147,127,255, 0,
+ 3, 0, 0, 0,131,119,172, 59,182,209,162, 63,170, 73,183, 64, 47, 0,112, 27, 5,125,255, 0, 3, 0, 0, 0,165,230, 40,191,
+246,111, 24, 63, 50,150,185, 64,237,241,238, 12,143,126,255, 0, 3, 0, 0, 0,100,225, 66,192,146,191,131, 63,152, 18,157, 64,
+ 78,189,128, 22,231,106,255, 0, 3, 0, 0, 0, 98,140, 80,192,169,205,238, 63, 83, 69,144, 64,186,184,111, 40, 83, 98,255, 0,
+ 3, 0, 0, 0,177, 39,109,192,154,213,147, 63,239,143,140, 64,199,174, 9, 25,179, 95,255, 0, 3, 0, 0, 0,131,173,128, 64,
+ 50,170, 14, 64,247, 71,105, 64,226, 87,192, 48, 67, 79,255, 0, 3, 0, 0, 0,202,137,140, 64, 4,234, 33, 64,152,117, 60, 64,
+ 41, 96, 40, 55,250, 63,255, 0, 3, 0, 0, 0, 68,176,115, 64, 85, 49, 68, 64, 65,173, 79, 64, 78, 83,175, 66,175, 70,255, 0,
+ 3, 0, 0, 0, 51, 23, 39, 64, 14,245, 76, 64,105,248,132, 64,227, 56,119, 69, 56, 91,255, 0, 3, 0, 0, 0,122, 75,254, 63,
+ 17, 36, 50, 64, 83, 70,152, 64, 3, 44,210, 60,169,103,255, 0, 3, 0, 0, 0,190,239, 52, 64,193,186, 22, 64,166,240,145, 64,
+ 89, 61,253, 51,148, 99,255, 0, 3, 0, 0, 0,249,244,213, 63, 10, 33, 52, 63,248, 94,178, 64, 84, 36,253, 14,208,121,255, 0,
+ 3, 0, 0, 0,230, 80, 22, 64, 50,155,141, 63,108, 95,168, 64,253, 50,250, 23,237,114,255, 0, 3, 0, 0, 0, 96,113,194, 63,
+166,184,195, 63, 31,160,174, 64, 51, 33, 11, 33, 29,119,255, 0, 3, 0, 0, 0,228,119,112, 63, 49, 46,115, 64,186,222,139, 64,
+104, 20, 35, 83, 40, 95,255, 0, 3, 0, 0, 0,221, 22,199, 63, 71,211,134, 64, 37,161,113, 64,158, 33, 1, 92, 99, 82,255, 0,
+ 3, 0, 0, 0,170,131, 58, 63, 58,178,140, 64,213,174,115, 64,151, 15, 55, 96,245, 82,255, 0, 3, 0, 0, 0,116,134,132, 64,
+ 40,130, 40,192,237,207, 77, 64,117, 90,107,198,226, 69,255, 0, 3, 0, 0, 0,232,187,140, 64, 6, 96, 62,192,107,247, 30, 64,
+249, 95,188,190,245, 53,255, 0, 3, 0, 0, 0, 37, 61,152, 64,230, 9, 14,192,137,179, 39, 64,171,103, 73,207, 30, 57,255, 0,
+ 3, 0, 0, 0,189,121,149, 64,142,192,111,191, 76, 95, 90, 64,161,101,149,235, 20, 75,255, 0, 3, 0, 0, 0,254,112,134, 64,
+126,146,207,190,159, 19,130, 64,241, 91,137,246,139, 88,255, 0, 3, 0, 0, 0, 12,129,129, 64,231,129,173,191,159,125,128, 64,
+194, 88,241,226,133, 87,255, 0, 3, 0, 0, 0,220,104, 22, 64,204,221, 40,191,115,137,170, 64,240, 50,167,241,139,116,255, 0,
+ 3, 0, 0, 0,245,120, 56, 64,118,213,154,191, 81,227,158, 64,175, 62,209,229,123,108,255, 0, 3, 0, 0, 0, 52, 56, 66, 64,
+206, 40,139,190, 21,116,160, 64,243, 65,237,249,135,109,255, 0, 3, 0, 0, 0, 61,161,150, 64,107,221, 89, 63,118,113, 89, 64,
+216,102,177, 18,221, 73,255, 0, 3, 0, 0, 0, 74,120,165, 64, 95, 78,167, 62,139, 51, 48, 64,202,112,116, 7, 12, 60,255, 0,
+ 3, 0, 0, 0, 12, 65,162, 64, 11, 84,149, 63,172,202, 44, 64,196,110,209, 25,181, 58,255, 0, 3, 0, 0, 0, 67,138,194,190,
+177, 97,138,192, 75,158,124, 64,144,247,122,161,227, 85,255, 0, 3, 0, 0, 0,214, 82, 66,191,128,115,152,192,164, 25, 85, 64,
+ 15,239,229,151,130, 72,255, 0, 3, 0, 0, 0,119,155,171, 61,138, 40,155,192,113, 96, 83, 64,128, 1, 60,150, 18, 72,255, 0,
+ 3, 0, 0, 0,144,237,178, 63, 25,136,136,192,121, 1,113, 64,139, 30, 67,163,194, 82,255, 0, 3, 0, 0, 0, 68,147,238, 63,
+166,230,100,192,234, 9,136, 64, 40, 40,126,177,197, 92,255, 0, 3, 0, 0, 0, 30,149,109, 63, 40, 18,111,192,171,100,141, 64,
+219, 20, 55,174, 57, 96,255, 0, 3, 0, 0, 0, 45,210,162, 63,233,211,224,191,184, 67,174, 64,187, 27, 11,218, 12,119,255, 0,
+ 3, 0, 0, 0,158,106, 94, 63,167,106, 30,192,254,240,167, 64, 27, 19, 69,202,151,114,255, 0, 3, 0, 0, 0, 22,114,229, 63,
+193, 96, 20,192,253,167,162, 64,234, 38,163,205, 12,111,255, 0, 3, 0, 0, 0,208, 76, 67, 64, 62,120,111,192, 14, 89, 85, 64,
+176, 66, 60,174,116, 72,255, 0, 3, 0, 0, 0,139,220, 37, 64,245,135,141,192,114,173, 54, 64,211, 56,161,159, 45, 62,255, 0,
+ 3, 0, 0, 0,204,119, 84, 64, 93, 73,130,192,212,107, 38, 64,198, 72, 33,167,119, 56,255, 0, 3, 0, 0, 0,178,218, 82,192,
+178,247, 1,191,211,129,154, 64,221,183,252,244, 39,105,255, 0, 3, 0, 0, 0, 0,245,124,192, 27, 32,187,190, 57, 6,138, 64,
+118,169, 80,248,254, 93,255, 0, 3, 0, 0, 0, 42, 75,112,192,228, 42,152,191, 25, 44,139, 64, 0,174, 97,230,225, 94,255, 0,
+ 3, 0, 0, 0,239,222, 43,192,212,226, 11,192,227, 71,151, 64,223,197,116,208,165,103,255, 0, 3, 0, 0, 0,137,207,229,191,
+ 30, 63, 22,192,207,235,161, 64, 58,216, 29,205,129,110,255, 0, 3, 0, 0, 0,239, 11, 14,192,175,114,191,191,254,208,166, 64,
+123,207,175,222,169,113,255, 0, 3, 0, 0, 0,163, 78,149,189, 65, 25,137,191,234,102,184, 64,202,254,204,232,222,125,255, 0,
+ 3, 0, 0, 0,208,203,104,191,146, 6,113,191,108, 5,183, 64,124,236,106,235,207,124,255, 0, 3, 0, 0, 0, 26, 68,251,190,
+111, 38,228,191,114, 48,178, 64,117,245, 98,217,147,121,255, 0, 3, 0, 0, 0, 76,169,222,191,205,107,104,192,150,142,136, 64,
+233,217,151,176,223, 92,255, 0, 3, 0, 0, 0,145,143, 39,192,190, 49, 94,192,165, 27,124, 64, 18,199, 4,180,213, 85,255, 0,
+ 3, 0, 0, 0,130,168, 6,192,190,132,130,192, 12, 96,105, 64, 30,210,165,166, 83, 79,255, 0, 3, 0, 0, 0, 68, 65, 84, 65,
+ 84, 1, 0, 0, 8,181,184, 3, 58, 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,144,182,184, 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, 68, 65, 84, 65, 0, 90, 0, 0,144,182,184, 3, 55, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 35, 0, 42, 0, 0, 0,162, 0, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,
+163, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,164, 0, 0, 0, 0, 0, 35, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 35, 0,
+ 12, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0, 43, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,166, 0, 0, 0,
+ 0, 0, 35, 0, 44, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,
+167, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,168, 0, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 35, 0,
+ 13, 0, 0, 0,169, 0, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,169, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,170, 0, 0, 0,
+ 0, 0, 35, 0, 46, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,
+171, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0, 47, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,
+ 14, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0, 47, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,174, 0, 0, 0,
+ 0, 0, 35, 0, 48, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0,175, 0, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,
+175, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0,
+ 15, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,178, 0, 0, 0,
+ 0, 0, 35, 0, 50, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0, 50, 0, 0, 0,
+179, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0,
+ 16, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,182, 0, 0, 0,
+ 0, 0, 35, 0, 52, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0,183, 0, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,
+183, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,184, 0, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 35, 0,
+ 17, 0, 0, 0,185, 0, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,185, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,186, 0, 0, 0,
+ 0, 0, 35, 0, 54, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0,187, 0, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,
+187, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,188, 0, 0, 0, 0, 0, 35, 0, 55, 0, 0, 0,188, 0, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0,189, 0, 0, 0, 0, 0, 35, 0, 55, 0, 0, 0,189, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,190, 0, 0, 0,
+ 0, 0, 35, 0, 56, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0,191, 0, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,
+191, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,192, 0, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 35, 0,
+ 19, 0, 0, 0,193, 0, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,193, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,194, 0, 0, 0,
+ 0, 0, 35, 0, 58, 0, 0, 0,194, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0,195, 0, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,
+195, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,196, 0, 0, 0, 0, 0, 35, 0, 59, 0, 0, 0,196, 0, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0,197, 0, 0, 0, 0, 0, 35, 0, 59, 0, 0, 0,197, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,198, 0, 0, 0,
+ 0, 0, 35, 0, 60, 0, 0, 0,198, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0,199, 0, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0,
+199, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,200, 0, 0, 0, 0, 0, 35, 0, 61, 0, 0, 0,200, 0, 0, 0, 0, 0, 35, 0,
+ 21, 0, 0, 0,201, 0, 0, 0, 0, 0, 35, 0, 61, 0, 0, 0,201, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 35, 0, 62, 0, 0, 0,202, 0, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,203, 0, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0,
+203, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,204, 0, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,204, 0, 0, 0, 0, 0, 35, 0,
+ 22, 0, 0, 0,205, 0, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,205, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,206, 0, 0, 0,
+ 0, 0, 35, 0, 64, 0, 0, 0,206, 0, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0,207, 0, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0,
+207, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,208, 0, 0, 0, 0, 0, 35, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 35, 0,
+ 23, 0, 0, 0,209, 0, 0, 0, 0, 0, 35, 0, 65, 0, 0, 0,209, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,210, 0, 0, 0,
+ 0, 0, 35, 0, 66, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0,211, 0, 0, 0, 0, 0, 35, 0, 66, 0, 0, 0,
+211, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,212, 0, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,212, 0, 0, 0, 0, 0, 35, 0,
+ 24, 0, 0, 0,213, 0, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,213, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,214, 0, 0, 0,
+ 0, 0, 35, 0, 68, 0, 0, 0,214, 0, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0,215, 0, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0,
+215, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,216, 0, 0, 0, 0, 0, 35, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 35, 0,
+ 25, 0, 0, 0,217, 0, 0, 0, 0, 0, 35, 0, 69, 0, 0, 0,217, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,218, 0, 0, 0,
+ 0, 0, 35, 0, 70, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0,219, 0, 0, 0, 0, 0, 35, 0, 70, 0, 0, 0,
+219, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,220, 0, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,220, 0, 0, 0, 0, 0, 35, 0,
+ 26, 0, 0, 0,221, 0, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,221, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 35, 0, 72, 0, 0, 0,222, 0, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0,223, 0, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0,
+223, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,224, 0, 0, 0, 0, 0, 35, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 35, 0,
+ 27, 0, 0, 0,225, 0, 0, 0, 0, 0, 35, 0, 73, 0, 0, 0,225, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,226, 0, 0, 0,
+ 0, 0, 35, 0, 74, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0,227, 0, 0, 0, 0, 0, 35, 0, 74, 0, 0, 0,
+227, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,228, 0, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,228, 0, 0, 0, 0, 0, 35, 0,
+ 28, 0, 0, 0,229, 0, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,229, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,230, 0, 0, 0,
+ 0, 0, 35, 0, 76, 0, 0, 0,230, 0, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,231, 0, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0,
+231, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,232, 0, 0, 0, 0, 0, 35, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 35, 0,
+ 29, 0, 0, 0,233, 0, 0, 0, 0, 0, 35, 0, 77, 0, 0, 0,233, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,234, 0, 0, 0,
+ 0, 0, 35, 0, 78, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0,235, 0, 0, 0, 0, 0, 35, 0, 78, 0, 0, 0,
+235, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0,236, 0, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0,236, 0, 0, 0, 0, 0, 35, 0,
+ 30, 0, 0, 0,237, 0, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0,237, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,238, 0, 0, 0,
+ 0, 0, 35, 0, 80, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0,239, 0, 0, 0, 0, 0, 35, 0, 80, 0, 0, 0,
+239, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0,240, 0, 0, 0, 0, 0, 35, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 35, 0,
+ 31, 0, 0, 0,241, 0, 0, 0, 0, 0, 35, 0, 81, 0, 0, 0,241, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,242, 0, 0, 0,
+ 0, 0, 35, 0, 82, 0, 0, 0,242, 0, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,243, 0, 0, 0, 0, 0, 35, 0, 82, 0, 0, 0,
+243, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,244, 0, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0,244, 0, 0, 0, 0, 0, 35, 0,
+ 32, 0, 0, 0,245, 0, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0,245, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,246, 0, 0, 0,
+ 0, 0, 35, 0, 84, 0, 0, 0,246, 0, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,247, 0, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0,
+247, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,248, 0, 0, 0, 0, 0, 35, 0, 85, 0, 0, 0,248, 0, 0, 0, 0, 0, 35, 0,
+ 33, 0, 0, 0,249, 0, 0, 0, 0, 0, 35, 0, 85, 0, 0, 0,249, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,250, 0, 0, 0,
+ 0, 0, 35, 0, 86, 0, 0, 0,250, 0, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,251, 0, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,
+251, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,252, 0, 0, 0, 0, 0, 35, 0, 87, 0, 0, 0,252, 0, 0, 0, 0, 0, 35, 0,
+ 34, 0, 0, 0,253, 0, 0, 0, 0, 0, 35, 0, 87, 0, 0, 0,253, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,254, 0, 0, 0,
+ 0, 0, 35, 0, 88, 0, 0, 0,254, 0, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,255, 0, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,
+255, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 89, 0, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0,
+ 35, 0, 0, 0, 1, 1, 0, 0, 0, 0, 35, 0, 89, 0, 0, 0, 1, 1, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 2, 1, 0, 0,
+ 0, 0, 35, 0, 90, 0, 0, 0, 2, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0, 3, 1, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0,
+ 3, 1, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0, 4, 1, 0, 0, 0, 0, 35, 0, 91, 0, 0, 0, 4, 1, 0, 0, 0, 0, 35, 0,
+ 36, 0, 0, 0, 5, 1, 0, 0, 0, 0, 35, 0, 91, 0, 0, 0, 5, 1, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0, 6, 1, 0, 0,
+ 0, 0, 35, 0, 92, 0, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0, 7, 1, 0, 0, 0, 0, 35, 0, 92, 0, 0, 0,
+ 7, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 8, 1, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 8, 1, 0, 0, 0, 0, 35, 0,
+ 37, 0, 0, 0, 9, 1, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 9, 1, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 10, 1, 0, 0,
+ 0, 0, 35, 0, 94, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0, 11, 1, 0, 0, 0, 0, 35, 0, 94, 0, 0, 0,
+ 11, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 1, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 12, 1, 0, 0, 0, 0, 35, 0,
+ 38, 0, 0, 0, 13, 1, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 13, 1, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 14, 1, 0, 0,
+ 0, 0, 35, 0, 96, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0, 15, 1, 0, 0, 0, 0, 35, 0, 96, 0, 0, 0,
+ 15, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 16, 1, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0, 16, 1, 0, 0, 0, 0, 35, 0,
+ 39, 0, 0, 0, 17, 1, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0, 17, 1, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 1, 0, 0,
+ 0, 0, 35, 0, 98, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0, 19, 1, 0, 0, 0, 0, 35, 0, 98, 0, 0, 0,
+ 19, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 20, 1, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0, 20, 1, 0, 0, 0, 0, 35, 0,
+ 40, 0, 0, 0, 21, 1, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0, 21, 1, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 22, 1, 0, 0,
+ 0, 0, 35, 0,100, 0, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0, 23, 1, 0, 0, 0, 0, 35, 0,100, 0, 0, 0,
+ 23, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0,101, 0, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0, 25, 1, 0, 0, 0, 0, 35, 0,101, 0, 0, 0, 25, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 26, 1, 0, 0,
+ 0, 0, 35, 0,102, 0, 0, 0, 26, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 27, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0,
+ 27, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0,
+ 13, 0, 0, 0, 29, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0, 29, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 30, 1, 0, 0,
+ 0, 0, 35, 0,104, 0, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,
+ 31, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 32, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0, 32, 1, 0, 0, 0, 0, 35, 0,
+ 16, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 34, 1, 0, 0,
+ 0, 0, 35, 0,106, 0, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 35, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,
+ 35, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0,
+ 16, 0, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 38, 1, 0, 0,
+ 0, 0, 35, 0,108, 0, 0, 0, 38, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 39, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0,
+ 39, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0,
+ 17, 0, 0, 0, 41, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0, 41, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 42, 1, 0, 0,
+ 0, 0, 35, 0,110, 0, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,
+ 43, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 44, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0, 44, 1, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0, 45, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0, 45, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 46, 1, 0, 0,
+ 0, 0, 35, 0,112, 0, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 47, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,
+ 47, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 50, 1, 0, 0,
+ 0, 0, 35, 0,114, 0, 0, 0, 50, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 51, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0,
+ 51, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 52, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0, 52, 1, 0, 0, 0, 0, 35, 0,
+ 19, 0, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 54, 1, 0, 0,
+ 0, 0, 35, 0,116, 0, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,
+ 55, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 56, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0, 56, 1, 0, 0, 0, 0, 35, 0,
+ 23, 0, 0, 0, 57, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0, 57, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 58, 1, 0, 0,
+ 0, 0, 35, 0,118, 0, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0, 59, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,
+ 59, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0,
+ 23, 0, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 62, 1, 0, 0,
+ 0, 0, 35, 0,120, 0, 0, 0, 62, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 63, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0,
+ 63, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0,
+ 24, 0, 0, 0, 65, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0, 65, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 66, 1, 0, 0,
+ 0, 0, 35, 0,122, 0, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,
+ 67, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 68, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0, 68, 1, 0, 0, 0, 0, 35, 0,
+ 27, 0, 0, 0, 69, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0, 69, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 70, 1, 0, 0,
+ 0, 0, 35, 0,124, 0, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 71, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,
+ 71, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0,
+ 27, 0, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 35, 0,126, 0, 0, 0, 74, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0, 75, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0,
+ 75, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0,
+ 28, 0, 0, 0, 77, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0, 77, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0, 78, 1, 0, 0,
+ 0, 0, 35, 0,128, 0, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,
+ 79, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 80, 1, 0, 0, 0, 0, 35, 0,129, 0, 0, 0, 80, 1, 0, 0, 0, 0, 35, 0,
+ 31, 0, 0, 0, 81, 1, 0, 0, 0, 0, 35, 0,129, 0, 0, 0, 81, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 82, 1, 0, 0,
+ 0, 0, 35, 0,130, 0, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0, 83, 1, 0, 0, 0, 0, 35, 0,130, 0, 0, 0,
+ 83, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0,
+ 31, 0, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 86, 1, 0, 0,
+ 0, 0, 35, 0,132, 0, 0, 0, 86, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0, 87, 1, 0, 0, 0, 0, 35, 0,132, 0, 0, 0,
+ 87, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0,
+ 24, 0, 0, 0, 89, 1, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 89, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 90, 1, 0, 0,
+ 0, 0, 35, 0,134, 0, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0,134, 0, 0, 0,
+ 91, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 92, 1, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 92, 1, 0, 0, 0, 0, 35, 0,
+ 33, 0, 0, 0, 93, 1, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 93, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 94, 1, 0, 0,
+ 0, 0, 35, 0,136, 0, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 95, 1, 0, 0, 0, 0, 35, 0,136, 0, 0, 0,
+ 95, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0,
+ 33, 0, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0, 98, 1, 0, 0,
+ 0, 0, 35, 0,138, 0, 0, 0, 98, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0, 99, 1, 0, 0, 0, 0, 35, 0,138, 0, 0, 0,
+ 99, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0,100, 1, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,100, 1, 0, 0, 0, 0, 35, 0,
+ 28, 0, 0, 0,101, 1, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,101, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0,102, 1, 0, 0,
+ 0, 0, 35, 0,140, 0, 0, 0,102, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,
+103, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,104, 1, 0, 0, 0, 0, 35, 0,141, 0, 0, 0,104, 1, 0, 0, 0, 0, 35, 0,
+ 35, 0, 0, 0,105, 1, 0, 0, 0, 0, 35, 0,141, 0, 0, 0,105, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,106, 1, 0, 0,
+ 0, 0, 35, 0,142, 0, 0, 0,106, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0,107, 1, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,
+107, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,143, 0, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,
+ 35, 0, 0, 0,109, 1, 0, 0, 0, 0, 35, 0,143, 0, 0, 0,109, 1, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0,110, 1, 0, 0,
+ 0, 0, 35, 0,144, 0, 0, 0,110, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,111, 1, 0, 0, 0, 0, 35, 0,144, 0, 0, 0,
+111, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,112, 1, 0, 0, 0, 0, 35, 0,145, 0, 0, 0,112, 1, 0, 0, 0, 0, 35, 0,
+ 31, 0, 0, 0,113, 1, 0, 0, 0, 0, 35, 0,145, 0, 0, 0,113, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,114, 1, 0, 0,
+ 0, 0, 35, 0,146, 0, 0, 0,114, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,115, 1, 0, 0, 0, 0, 35, 0,146, 0, 0, 0,
+115, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,116, 1, 0, 0, 0, 0, 35, 0,147, 0, 0, 0,116, 1, 0, 0, 0, 0, 35, 0,
+ 38, 0, 0, 0,117, 1, 0, 0, 0, 0, 35, 0,147, 0, 0, 0,117, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,118, 1, 0, 0,
+ 0, 0, 35, 0,148, 0, 0, 0,118, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,119, 1, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,
+119, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,120, 1, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,120, 1, 0, 0, 0, 0, 35, 0,
+ 38, 0, 0, 0,121, 1, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,121, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,122, 1, 0, 0,
+ 0, 0, 35, 0,150, 0, 0, 0,122, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0,123, 1, 0, 0, 0, 0, 35, 0,150, 0, 0, 0,
+123, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,124, 1, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,124, 1, 0, 0, 0, 0, 35, 0,
+ 38, 0, 0, 0,125, 1, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,125, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0,126, 1, 0, 0,
+ 0, 0, 35, 0,152, 0, 0, 0,126, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0,127, 1, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,
+127, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,128, 1, 0, 0, 0, 0, 35, 0,153, 0, 0, 0,128, 1, 0, 0, 0, 0, 35, 0,
+ 40, 0, 0, 0,129, 1, 0, 0, 0, 0, 35, 0,153, 0, 0, 0,129, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,130, 1, 0, 0,
+ 0, 0, 35, 0,154, 0, 0, 0,130, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0,131, 1, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,
+131, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0,132, 1, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,132, 1, 0, 0, 0, 0, 35, 0,
+ 40, 0, 0, 0,133, 1, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,133, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,134, 1, 0, 0,
+ 0, 0, 35, 0,156, 0, 0, 0,134, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0,135, 1, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,
+135, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,136, 1, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,136, 1, 0, 0, 0, 0, 35, 0,
+ 40, 0, 0, 0,137, 1, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,137, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0,138, 1, 0, 0,
+ 0, 0, 35, 0,158, 0, 0, 0,138, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0,139, 1, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,
+139, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,140, 1, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,140, 1, 0, 0, 0, 0, 35, 0,
+ 37, 0, 0, 0,141, 1, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,141, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,142, 1, 0, 0,
+ 0, 0, 35, 0,160, 0, 0, 0,142, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0,143, 1, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,
+143, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,144, 1, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,144, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0,145, 1, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,145, 1, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,146, 1, 0, 0,
+ 0, 0, 35, 0,102, 0, 0, 0,146, 1, 0, 0, 0, 0, 35, 0, 43, 0, 0, 0,147, 1, 0, 0, 0, 0, 33, 0, 46, 0, 0, 0,
+147, 1, 0, 0, 0, 0, 33, 0, 43, 0, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,
+102, 0, 0, 0,149, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,149, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,150, 1, 0, 0,
+ 0, 0, 35, 0,104, 0, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0,151, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,
+151, 1, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,152, 1, 0, 0, 0, 0, 33, 0, 47, 0, 0, 0,152, 1, 0, 0, 0, 0, 33, 0,
+ 47, 0, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,153, 1, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,154, 1, 0, 0,
+ 0, 0, 35, 0,104, 0, 0, 0,154, 1, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,155, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,
+155, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,156, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,156, 1, 0, 0, 0, 0, 35, 0,
+ 42, 0, 0, 0,157, 1, 0, 0, 0, 0, 33, 0, 44, 0, 0, 0,157, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,158, 1, 0, 0,
+ 0, 0, 35, 0,105, 0, 0, 0,158, 1, 0, 0, 0, 0, 35, 0, 43, 0, 0, 0,159, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,
+159, 1, 0, 0, 0, 0, 33, 0, 43, 0, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,
+105, 0, 0, 0,161, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,161, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,162, 1, 0, 0,
+ 0, 0, 35, 0,107, 0, 0, 0,162, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0,163, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,
+163, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,164, 1, 0, 0, 0, 0, 33, 0, 51, 0, 0, 0,164, 1, 0, 0, 0, 0, 33, 0,
+ 51, 0, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,165, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,166, 1, 0, 0,
+ 0, 0, 35, 0,107, 0, 0, 0,166, 1, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,167, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,
+167, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,
+ 42, 0, 0, 0,169, 1, 0, 0, 0, 0, 33, 0, 48, 0, 0, 0,169, 1, 0, 0, 0, 0, 33, 0, 54, 0, 0, 0,170, 1, 0, 0,
+ 0, 0, 35, 0,108, 0, 0, 0,170, 1, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,171, 1, 0, 0, 0, 0, 33, 0, 54, 0, 0, 0,
+171, 1, 0, 0, 0, 0, 33, 0, 45, 0, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,
+108, 0, 0, 0,173, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,173, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,174, 1, 0, 0,
+ 0, 0, 35, 0,110, 0, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0,175, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,
+175, 1, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,176, 1, 0, 0, 0, 0, 33, 0, 55, 0, 0, 0,176, 1, 0, 0, 0, 0, 33, 0,
+ 55, 0, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,177, 1, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,178, 1, 0, 0,
+ 0, 0, 35, 0,110, 0, 0, 0,178, 1, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,179, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,
+179, 1, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,180, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,180, 1, 0, 0, 0, 0, 35, 0,
+ 44, 0, 0, 0,181, 1, 0, 0, 0, 0, 33, 0, 52, 0, 0, 0,181, 1, 0, 0, 0, 0, 33, 0, 58, 0, 0, 0,182, 1, 0, 0,
+ 0, 0, 35, 0,111, 0, 0, 0,182, 1, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,183, 1, 0, 0, 0, 0, 33, 0, 58, 0, 0, 0,
+183, 1, 0, 0, 0, 0, 33, 0, 53, 0, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,
+111, 0, 0, 0,185, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,185, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,186, 1, 0, 0,
+ 0, 0, 35, 0,113, 0, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0,187, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,
+187, 1, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,188, 1, 0, 0, 0, 0, 33, 0, 59, 0, 0, 0,188, 1, 0, 0, 0, 0, 33, 0,
+ 59, 0, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,189, 1, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,190, 1, 0, 0,
+ 0, 0, 35, 0,113, 0, 0, 0,190, 1, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,191, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,
+191, 1, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,192, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,192, 1, 0, 0, 0, 0, 35, 0,
+ 52, 0, 0, 0,193, 1, 0, 0, 0, 0, 33, 0, 56, 0, 0, 0,193, 1, 0, 0, 0, 0, 33, 0, 60, 0, 0, 0,194, 1, 0, 0,
+ 0, 0, 35, 0,114, 0, 0, 0,194, 1, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,195, 1, 0, 0, 0, 0, 33, 0, 60, 0, 0, 0,
+195, 1, 0, 0, 0, 0, 33, 0, 57, 0, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,
+114, 0, 0, 0,197, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,197, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,198, 1, 0, 0,
+ 0, 0, 35, 0,116, 0, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0,199, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,
+199, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,200, 1, 0, 0, 0, 0, 33, 0, 61, 0, 0, 0,200, 1, 0, 0, 0, 0, 33, 0,
+ 61, 0, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,201, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,202, 1, 0, 0,
+ 0, 0, 35, 0,116, 0, 0, 0,202, 1, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,203, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,
+203, 1, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,204, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,204, 1, 0, 0, 0, 0, 35, 0,
+ 48, 0, 0, 0,205, 1, 0, 0, 0, 0, 33, 0, 56, 0, 0, 0,205, 1, 0, 0, 0, 0, 33, 0, 64, 0, 0, 0,206, 1, 0, 0,
+ 0, 0, 35, 0,117, 0, 0, 0,206, 1, 0, 0, 0, 0, 35, 0, 50, 0, 0, 0,207, 1, 0, 0, 0, 0, 33, 0, 64, 0, 0, 0,
+207, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,
+117, 0, 0, 0,209, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,209, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,210, 1, 0, 0,
+ 0, 0, 35, 0,119, 0, 0, 0,210, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,211, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,
+211, 1, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,212, 1, 0, 0, 0, 0, 33, 0, 65, 0, 0, 0,212, 1, 0, 0, 0, 0, 33, 0,
+ 65, 0, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,213, 1, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,214, 1, 0, 0,
+ 0, 0, 35, 0,119, 0, 0, 0,214, 1, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0,215, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,
+215, 1, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,
+ 51, 0, 0, 0,217, 1, 0, 0, 0, 0, 33, 0, 62, 0, 0, 0,217, 1, 0, 0, 0, 0, 33, 0, 68, 0, 0, 0,218, 1, 0, 0,
+ 0, 0, 35, 0,120, 0, 0, 0,218, 1, 0, 0, 0, 0, 35, 0, 47, 0, 0, 0,219, 1, 0, 0, 0, 0, 33, 0, 68, 0, 0, 0,
+219, 1, 0, 0, 0, 0, 33, 0, 47, 0, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,
+120, 0, 0, 0,221, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,221, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,222, 1, 0, 0,
+ 0, 0, 35, 0,122, 0, 0, 0,222, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0,223, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,
+223, 1, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,224, 1, 0, 0, 0, 0, 33, 0, 69, 0, 0, 0,224, 1, 0, 0, 0, 0, 33, 0,
+ 69, 0, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,225, 1, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,226, 1, 0, 0,
+ 0, 0, 35, 0,122, 0, 0, 0,226, 1, 0, 0, 0, 0, 35, 0, 66, 0, 0, 0,227, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,
+227, 1, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,
+ 46, 0, 0, 0,229, 1, 0, 0, 0, 0, 33, 0, 66, 0, 0, 0,229, 1, 0, 0, 0, 0, 33, 0, 72, 0, 0, 0,230, 1, 0, 0,
+ 0, 0, 35, 0,123, 0, 0, 0,230, 1, 0, 0, 0, 0, 35, 0, 55, 0, 0, 0,231, 1, 0, 0, 0, 0, 33, 0, 72, 0, 0, 0,
+231, 1, 0, 0, 0, 0, 33, 0, 55, 0, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,
+123, 0, 0, 0,233, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,233, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,234, 1, 0, 0,
+ 0, 0, 35, 0,125, 0, 0, 0,234, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,235, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,
+235, 1, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,236, 1, 0, 0, 0, 0, 33, 0, 73, 0, 0, 0,236, 1, 0, 0, 0, 0, 33, 0,
+ 73, 0, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,237, 1, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,238, 1, 0, 0,
+ 0, 0, 35, 0,125, 0, 0, 0,238, 1, 0, 0, 0, 0, 35, 0, 70, 0, 0, 0,239, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,
+239, 1, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,
+ 54, 0, 0, 0,241, 1, 0, 0, 0, 0, 33, 0, 70, 0, 0, 0,241, 1, 0, 0, 0, 0, 33, 0, 76, 0, 0, 0,242, 1, 0, 0,
+ 0, 0, 35, 0,126, 0, 0, 0,242, 1, 0, 0, 0, 0, 35, 0, 59, 0, 0, 0,243, 1, 0, 0, 0, 0, 33, 0, 76, 0, 0, 0,
+243, 1, 0, 0, 0, 0, 33, 0, 59, 0, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,
+126, 0, 0, 0,245, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,245, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,246, 1, 0, 0,
+ 0, 0, 35, 0,128, 0, 0, 0,246, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0,247, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,
+247, 1, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,248, 1, 0, 0, 0, 0, 33, 0, 77, 0, 0, 0,248, 1, 0, 0, 0, 0, 33, 0,
+ 77, 0, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,249, 1, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,250, 1, 0, 0,
+ 0, 0, 35, 0,128, 0, 0, 0,250, 1, 0, 0, 0, 0, 35, 0, 74, 0, 0, 0,251, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,
+251, 1, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,
+ 58, 0, 0, 0,253, 1, 0, 0, 0, 0, 33, 0, 74, 0, 0, 0,253, 1, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0,254, 1, 0, 0,
+ 0, 0, 35, 0,129, 0, 0, 0,254, 1, 0, 0, 0, 0, 35, 0, 61, 0, 0, 0,255, 1, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0,
+255, 1, 0, 0, 0, 0, 33, 0, 61, 0, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,129, 0, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,
+129, 0, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 2, 2, 0, 0,
+ 0, 0, 35, 0,131, 0, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0,129, 0, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0,
+ 3, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 4, 2, 0, 0, 0, 0, 33, 0, 81, 0, 0, 0, 4, 2, 0, 0, 0, 0, 33, 0,
+ 81, 0, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 6, 2, 0, 0,
+ 0, 0, 35, 0,131, 0, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0, 78, 0, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0,
+ 7, 2, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0,
+ 60, 0, 0, 0, 9, 2, 0, 0, 0, 0, 33, 0, 78, 0, 0, 0, 9, 2, 0, 0, 0, 0, 33, 0, 83, 0, 0, 0, 10, 2, 0, 0,
+ 0, 0, 35, 0,132, 0, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0, 65, 0, 0, 0, 11, 2, 0, 0, 0, 0, 33, 0, 83, 0, 0, 0,
+ 11, 2, 0, 0, 0, 0, 33, 0, 65, 0, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,
+132, 0, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 14, 2, 0, 0,
+ 0, 0, 35, 0,134, 0, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0,
+ 15, 2, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0, 16, 2, 0, 0, 0, 0, 33, 0, 82, 0, 0, 0, 16, 2, 0, 0, 0, 0, 33, 0,
+ 82, 0, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0, 18, 2, 0, 0,
+ 0, 0, 35, 0,134, 0, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0, 66, 0, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0,
+ 19, 2, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0,
+ 64, 0, 0, 0, 21, 2, 0, 0, 0, 0, 33, 0, 66, 0, 0, 0, 21, 2, 0, 0, 0, 0, 33, 0, 84, 0, 0, 0, 22, 2, 0, 0,
+ 0, 0, 35, 0,135, 0, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0, 69, 0, 0, 0, 23, 2, 0, 0, 0, 0, 33, 0, 84, 0, 0, 0,
+ 23, 2, 0, 0, 0, 0, 33, 0, 69, 0, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,
+135, 0, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 26, 2, 0, 0,
+ 0, 0, 35, 0,137, 0, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0,
+ 27, 2, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0, 28, 2, 0, 0, 0, 0, 33, 0, 85, 0, 0, 0, 28, 2, 0, 0, 0, 0, 33, 0,
+ 85, 0, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0, 30, 2, 0, 0,
+ 0, 0, 35, 0,137, 0, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0, 70, 0, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0,
+ 31, 2, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0,
+ 68, 0, 0, 0, 33, 2, 0, 0, 0, 0, 33, 0, 70, 0, 0, 0, 33, 2, 0, 0, 0, 0, 33, 0, 86, 0, 0, 0, 34, 2, 0, 0,
+ 0, 0, 35, 0,138, 0, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0, 73, 0, 0, 0, 35, 2, 0, 0, 0, 0, 33, 0, 86, 0, 0, 0,
+ 35, 2, 0, 0, 0, 0, 33, 0, 73, 0, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,
+138, 0, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0, 38, 2, 0, 0,
+ 0, 0, 35, 0,140, 0, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,
+ 39, 2, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0, 40, 2, 0, 0, 0, 0, 33, 0, 87, 0, 0, 0, 40, 2, 0, 0, 0, 0, 33, 0,
+ 87, 0, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0, 42, 2, 0, 0,
+ 0, 0, 35, 0,140, 0, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0, 74, 0, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,
+ 43, 2, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0,
+ 72, 0, 0, 0, 45, 2, 0, 0, 0, 0, 33, 0, 74, 0, 0, 0, 45, 2, 0, 0, 0, 0, 33, 0, 88, 0, 0, 0, 46, 2, 0, 0,
+ 0, 0, 35, 0,141, 0, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0, 77, 0, 0, 0, 47, 2, 0, 0, 0, 0, 33, 0, 88, 0, 0, 0,
+ 47, 2, 0, 0, 0, 0, 33, 0, 77, 0, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,141, 0, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,
+141, 0, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0, 50, 2, 0, 0,
+ 0, 0, 35, 0,143, 0, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,141, 0, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0,
+ 51, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 52, 2, 0, 0, 0, 0, 33, 0, 89, 0, 0, 0, 52, 2, 0, 0, 0, 0, 33, 0,
+ 89, 0, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 54, 2, 0, 0,
+ 0, 0, 35, 0,143, 0, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0, 78, 0, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,
+ 55, 2, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0,
+ 76, 0, 0, 0, 57, 2, 0, 0, 0, 0, 33, 0, 78, 0, 0, 0, 57, 2, 0, 0, 0, 0, 33, 0, 90, 0, 0, 0, 58, 2, 0, 0,
+ 0, 0, 35, 0,144, 0, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0, 81, 0, 0, 0, 59, 2, 0, 0, 0, 0, 33, 0, 90, 0, 0, 0,
+ 59, 2, 0, 0, 0, 0, 33, 0, 81, 0, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,144, 0, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,
+144, 0, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0, 62, 2, 0, 0,
+ 0, 0, 35, 0,146, 0, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,144, 0, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0,
+ 63, 2, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0, 64, 2, 0, 0, 0, 0, 33, 0, 91, 0, 0, 0, 64, 2, 0, 0, 0, 0, 33, 0,
+ 91, 0, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0, 66, 2, 0, 0,
+ 0, 0, 35, 0,146, 0, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0,
+ 67, 2, 0, 0, 0, 0, 35, 0, 80, 0, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0,
+ 62, 0, 0, 0, 69, 2, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0, 69, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0, 70, 2, 0, 0,
+ 0, 0, 35, 0,147, 0, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0, 82, 0, 0, 0, 71, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0,
+ 71, 2, 0, 0, 0, 0, 33, 0, 82, 0, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,147, 0, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,
+147, 0, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0, 74, 2, 0, 0,
+ 0, 0, 35, 0,149, 0, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,147, 0, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,
+ 75, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 76, 2, 0, 0, 0, 0, 33, 0, 95, 0, 0, 0, 76, 2, 0, 0, 0, 0, 33, 0,
+ 95, 0, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 78, 2, 0, 0,
+ 0, 0, 35, 0,149, 0, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0, 92, 0, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,
+ 79, 2, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,
+ 83, 0, 0, 0, 81, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0, 81, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0, 82, 2, 0, 0,
+ 0, 0, 35, 0,150, 0, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0, 85, 0, 0, 0, 83, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0,
+ 83, 2, 0, 0, 0, 0, 33, 0, 85, 0, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,150, 0, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,
+150, 0, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0, 86, 2, 0, 0,
+ 0, 0, 35, 0,152, 0, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,150, 0, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,
+ 87, 2, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 88, 2, 0, 0, 0, 0, 33, 0, 97, 0, 0, 0, 88, 2, 0, 0, 0, 0, 33, 0,
+ 97, 0, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 90, 2, 0, 0,
+ 0, 0, 35, 0,152, 0, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0, 94, 0, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,
+ 91, 2, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,
+ 84, 0, 0, 0, 93, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0, 93, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0, 94, 2, 0, 0,
+ 0, 0, 35, 0,153, 0, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0, 87, 0, 0, 0, 95, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0,
+ 95, 2, 0, 0, 0, 0, 33, 0, 87, 0, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,153, 0, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,
+153, 0, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0, 98, 2, 0, 0,
+ 0, 0, 35, 0,155, 0, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,153, 0, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,
+ 99, 2, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0,100, 2, 0, 0, 0, 0, 33, 0, 99, 0, 0, 0,100, 2, 0, 0, 0, 0, 33, 0,
+ 99, 0, 0, 0,101, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,101, 2, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0,102, 2, 0, 0,
+ 0, 0, 35, 0,155, 0, 0, 0,102, 2, 0, 0, 0, 0, 35, 0, 96, 0, 0, 0,103, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,
+103, 2, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,
+ 86, 0, 0, 0,105, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0,105, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,106, 2, 0, 0,
+ 0, 0, 35, 0,156, 0, 0, 0,106, 2, 0, 0, 0, 0, 35, 0, 89, 0, 0, 0,107, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,
+107, 2, 0, 0, 0, 0, 33, 0, 89, 0, 0, 0,108, 2, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,108, 2, 0, 0, 0, 0, 35, 0,
+156, 0, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,110, 2, 0, 0,
+ 0, 0, 35, 0,158, 0, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,
+111, 2, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0,112, 2, 0, 0, 0, 0, 33, 0,101, 0, 0, 0,112, 2, 0, 0, 0, 0, 33, 0,
+101, 0, 0, 0,113, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,113, 2, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0,114, 2, 0, 0,
+ 0, 0, 35, 0,158, 0, 0, 0,114, 2, 0, 0, 0, 0, 35, 0, 98, 0, 0, 0,115, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,
+115, 2, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,
+ 88, 0, 0, 0,117, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0,117, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0,118, 2, 0, 0,
+ 0, 0, 35, 0,159, 0, 0, 0,118, 2, 0, 0, 0, 0, 35, 0, 91, 0, 0, 0,119, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0,
+119, 2, 0, 0, 0, 0, 33, 0, 91, 0, 0, 0,120, 2, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,120, 2, 0, 0, 0, 0, 35, 0,
+159, 0, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,122, 2, 0, 0,
+ 0, 0, 35, 0,161, 0, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,
+123, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0,124, 2, 0, 0, 0, 0, 33, 0,101, 0, 0, 0,124, 2, 0, 0, 0, 0, 33, 0,
+ 93, 0, 0, 0,125, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,125, 2, 0, 0, 0, 0, 35, 0,101, 0, 0, 0,126, 2, 0, 0,
+ 0, 0, 35, 0,161, 0, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,100, 0, 0, 0,127, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,
+127, 2, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0,128, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,128, 2, 0, 0, 0, 0, 35, 0,
+ 90, 0, 0, 0,129, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,129, 2, 0, 0, 0, 0, 33, 0, 27, 1, 0, 0,146, 1, 0, 0,
+ 0, 0, 35, 0,171, 0, 0, 0,146, 1, 0, 0, 0, 0, 35, 0,171, 0, 0, 0, 27, 1, 0, 0, 0, 0, 35, 0,146, 1, 0, 0,
+147, 1, 0, 0, 0, 0, 35, 0,146, 1, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,147, 1, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,
+165, 0, 0, 0, 26, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,148, 1, 0, 0, 0, 0, 35, 0, 26, 1, 0, 0,148, 1, 0, 0,
+ 0, 0, 35, 0,164, 0, 0, 0,147, 1, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,
+147, 1, 0, 0, 0, 0, 35, 0, 26, 1, 0, 0,149, 1, 0, 0, 0, 0, 35, 0, 28, 1, 0, 0,149, 1, 0, 0, 0, 0, 35, 0,
+ 26, 1, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0,149, 1, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,149, 1, 0, 0,151, 1, 0, 0,
+ 0, 0, 35, 0,150, 1, 0, 0,151, 1, 0, 0, 0, 0, 35, 0, 27, 1, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0, 31, 1, 0, 0,
+151, 1, 0, 0, 0, 0, 35, 0, 27, 1, 0, 0,151, 1, 0, 0, 0, 0, 35, 0, 30, 1, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,
+ 29, 1, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0, 29, 1, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,152, 1, 0, 0,
+ 0, 0, 35, 0,172, 0, 0, 0,152, 1, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,152, 1, 0, 0,
+153, 1, 0, 0, 0, 0, 35, 0,152, 1, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,153, 1, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,
+169, 0, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0, 30, 1, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,154, 1, 0, 0,
+ 0, 0, 35, 0, 31, 1, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0,
+153, 1, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,155, 1, 0, 0, 0, 0, 35, 0, 29, 1, 0, 0,155, 1, 0, 0, 0, 0, 35, 0,
+167, 0, 0, 0, 29, 1, 0, 0, 0, 0, 35, 0,155, 1, 0, 0,156, 1, 0, 0, 0, 0, 35, 0,155, 1, 0, 0,157, 1, 0, 0,
+ 0, 0, 35, 0,156, 1, 0, 0,157, 1, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,
+157, 1, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,157, 1, 0, 0, 0, 0, 35, 0,163, 0, 0, 0,156, 1, 0, 0, 0, 0, 35, 0,
+163, 0, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0, 28, 1, 0, 0,156, 1, 0, 0, 0, 0, 35, 0, 33, 1, 0, 0,158, 1, 0, 0,
+ 0, 0, 35, 0,179, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 0,179, 0, 0, 0,158, 1, 0, 0, 0, 0, 35, 0,158, 1, 0, 0,
+159, 1, 0, 0, 0, 0, 35, 0,159, 1, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,158, 1, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,
+165, 0, 0, 0, 32, 1, 0, 0, 0, 0, 35, 0, 32, 1, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,160, 1, 0, 0,
+ 0, 0, 35, 0,164, 0, 0, 0,159, 1, 0, 0, 0, 0, 35, 0,178, 0, 0, 0,159, 1, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,
+178, 0, 0, 0, 0, 0, 35, 0, 32, 1, 0, 0,161, 1, 0, 0, 0, 0, 35, 0, 32, 1, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0,
+ 34, 1, 0, 0,161, 1, 0, 0, 0, 0, 35, 0,161, 1, 0, 0,162, 1, 0, 0, 0, 0, 35, 0,162, 1, 0, 0,163, 1, 0, 0,
+ 0, 0, 35, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 35, 0, 33, 1, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0, 33, 1, 0, 0,
+163, 1, 0, 0, 0, 0, 35, 0, 37, 1, 0, 0,163, 1, 0, 0, 0, 0, 35, 0, 36, 1, 0, 0,162, 1, 0, 0, 0, 0, 35, 0,
+ 35, 1, 0, 0,162, 1, 0, 0, 0, 0, 35, 0, 35, 1, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,164, 1, 0, 0,
+ 0, 0, 35, 0,176, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0,180, 0, 0, 0,164, 1, 0, 0, 0, 0, 35, 0,164, 1, 0, 0,
+165, 1, 0, 0, 0, 0, 35, 0,165, 1, 0, 0,166, 1, 0, 0, 0, 0, 35, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 35, 0,
+177, 0, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,166, 1, 0, 0, 0, 0, 35, 0, 36, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 35, 0, 37, 1, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0,
+ 37, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,167, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0, 35, 1, 0, 0, 0, 0, 35, 0,
+ 35, 1, 0, 0,167, 1, 0, 0, 0, 0, 35, 0,167, 1, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,168, 1, 0, 0,169, 1, 0, 0,
+ 0, 0, 35, 0,167, 1, 0, 0,169, 1, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,
+169, 1, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,169, 1, 0, 0, 0, 0, 35, 0,163, 0, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,
+ 34, 1, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,163, 0, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0, 39, 1, 0, 0,170, 1, 0, 0,
+ 0, 0, 35, 0,187, 0, 0, 0,170, 1, 0, 0, 0, 0, 35, 0,187, 0, 0, 0, 39, 1, 0, 0, 0, 0, 35, 0,170, 1, 0, 0,
+171, 1, 0, 0, 0, 0, 35, 0,170, 1, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,171, 1, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,
+169, 0, 0, 0, 38, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,172, 1, 0, 0, 0, 0, 35, 0, 38, 1, 0, 0,172, 1, 0, 0,
+ 0, 0, 35, 0,168, 0, 0, 0,171, 1, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0,186, 0, 0, 0,
+171, 1, 0, 0, 0, 0, 35, 0, 38, 1, 0, 0,173, 1, 0, 0, 0, 0, 35, 0, 40, 1, 0, 0,173, 1, 0, 0, 0, 0, 35, 0,
+ 38, 1, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0,173, 1, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,173, 1, 0, 0,175, 1, 0, 0,
+ 0, 0, 35, 0,174, 1, 0, 0,175, 1, 0, 0, 0, 0, 35, 0, 39, 1, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0, 43, 1, 0, 0,
+175, 1, 0, 0, 0, 0, 35, 0, 39, 1, 0, 0,175, 1, 0, 0, 0, 0, 35, 0, 42, 1, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,
+ 41, 1, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0, 41, 1, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,184, 0, 0, 0,176, 1, 0, 0,
+ 0, 0, 35, 0,188, 0, 0, 0,176, 1, 0, 0, 0, 0, 35, 0,184, 0, 0, 0,188, 0, 0, 0, 0, 0, 35, 0,176, 1, 0, 0,
+177, 1, 0, 0, 0, 0, 35, 0,176, 1, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,177, 1, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,
+185, 0, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0, 42, 1, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0,178, 1, 0, 0,
+ 0, 0, 35, 0, 43, 1, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0,
+177, 1, 0, 0, 0, 0, 35, 0,183, 0, 0, 0,179, 1, 0, 0, 0, 0, 35, 0, 41, 1, 0, 0,179, 1, 0, 0, 0, 0, 35, 0,
+183, 0, 0, 0, 41, 1, 0, 0, 0, 0, 35, 0,179, 1, 0, 0,180, 1, 0, 0, 0, 0, 35, 0,179, 1, 0, 0,181, 1, 0, 0,
+ 0, 0, 35, 0,180, 1, 0, 0,181, 1, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,
+181, 1, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,181, 1, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,180, 1, 0, 0, 0, 0, 35, 0,
+167, 0, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0, 40, 1, 0, 0,180, 1, 0, 0, 0, 0, 35, 0, 45, 1, 0, 0,182, 1, 0, 0,
+ 0, 0, 35, 0,195, 0, 0, 0,182, 1, 0, 0, 0, 0, 35, 0,195, 0, 0, 0, 45, 1, 0, 0, 0, 0, 35, 0,182, 1, 0, 0,
+183, 1, 0, 0, 0, 0, 35, 0,182, 1, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,183, 1, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,
+185, 0, 0, 0, 44, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0,184, 1, 0, 0, 0, 0, 35, 0, 44, 1, 0, 0,184, 1, 0, 0,
+ 0, 0, 35, 0,184, 0, 0, 0,183, 1, 0, 0, 0, 0, 35, 0,184, 0, 0, 0,194, 0, 0, 0, 0, 0, 35, 0,194, 0, 0, 0,
+183, 1, 0, 0, 0, 0, 35, 0, 44, 1, 0, 0,185, 1, 0, 0, 0, 0, 35, 0, 46, 1, 0, 0,185, 1, 0, 0, 0, 0, 35, 0,
+ 44, 1, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0,185, 1, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,185, 1, 0, 0,187, 1, 0, 0,
+ 0, 0, 35, 0,186, 1, 0, 0,187, 1, 0, 0, 0, 0, 35, 0, 45, 1, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0, 49, 1, 0, 0,
+187, 1, 0, 0, 0, 0, 35, 0, 45, 1, 0, 0,187, 1, 0, 0, 0, 0, 35, 0, 48, 1, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,
+ 47, 1, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0, 47, 1, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,192, 0, 0, 0,188, 1, 0, 0,
+ 0, 0, 35, 0,196, 0, 0, 0,188, 1, 0, 0, 0, 0, 35, 0,192, 0, 0, 0,196, 0, 0, 0, 0, 0, 35, 0,188, 1, 0, 0,
+189, 1, 0, 0, 0, 0, 35, 0,188, 1, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,189, 1, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,
+193, 0, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0, 48, 1, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0,190, 1, 0, 0,
+ 0, 0, 35, 0, 49, 1, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0,
+189, 1, 0, 0, 0, 0, 35, 0,191, 0, 0, 0,191, 1, 0, 0, 0, 0, 35, 0, 47, 1, 0, 0,191, 1, 0, 0, 0, 0, 35, 0,
+191, 0, 0, 0, 47, 1, 0, 0, 0, 0, 35, 0,191, 1, 0, 0,192, 1, 0, 0, 0, 0, 35, 0,191, 1, 0, 0,193, 1, 0, 0,
+ 0, 0, 35, 0,192, 1, 0, 0,193, 1, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,
+193, 1, 0, 0, 0, 0, 35, 0,190, 0, 0, 0,193, 1, 0, 0, 0, 0, 35, 0,183, 0, 0, 0,192, 1, 0, 0, 0, 0, 35, 0,
+183, 0, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0, 46, 1, 0, 0,192, 1, 0, 0, 0, 0, 35, 0, 51, 1, 0, 0,194, 1, 0, 0,
+ 0, 0, 35, 0,199, 0, 0, 0,194, 1, 0, 0, 0, 0, 35, 0,199, 0, 0, 0, 51, 1, 0, 0, 0, 0, 35, 0,194, 1, 0, 0,
+195, 1, 0, 0, 0, 0, 35, 0,194, 1, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,195, 1, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,
+193, 0, 0, 0, 50, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0,196, 1, 0, 0, 0, 0, 35, 0, 50, 1, 0, 0,196, 1, 0, 0,
+ 0, 0, 35, 0,192, 0, 0, 0,195, 1, 0, 0, 0, 0, 35, 0,192, 0, 0, 0,198, 0, 0, 0, 0, 0, 35, 0,198, 0, 0, 0,
+195, 1, 0, 0, 0, 0, 35, 0, 50, 1, 0, 0,197, 1, 0, 0, 0, 0, 35, 0, 53, 1, 0, 0,197, 1, 0, 0, 0, 0, 35, 0,
+ 50, 1, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0,197, 1, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,197, 1, 0, 0,199, 1, 0, 0,
+ 0, 0, 35, 0,198, 1, 0, 0,199, 1, 0, 0, 0, 0, 35, 0, 51, 1, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0, 55, 1, 0, 0,
+199, 1, 0, 0, 0, 0, 35, 0, 51, 1, 0, 0,199, 1, 0, 0, 0, 0, 35, 0, 54, 1, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,
+ 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0, 52, 1, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,200, 1, 0, 0,
+ 0, 0, 35, 0,200, 0, 0, 0,200, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,200, 0, 0, 0, 0, 0, 35, 0,200, 1, 0, 0,
+201, 1, 0, 0, 0, 0, 35, 0,200, 1, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,201, 1, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,
+177, 0, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0, 54, 1, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,202, 1, 0, 0,
+ 0, 0, 35, 0, 55, 1, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,201, 0, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0,201, 0, 0, 0,
+201, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,203, 1, 0, 0, 0, 0, 35, 0, 52, 1, 0, 0,203, 1, 0, 0, 0, 0, 35, 0,
+175, 0, 0, 0, 52, 1, 0, 0, 0, 0, 35, 0,203, 1, 0, 0,204, 1, 0, 0, 0, 0, 35, 0,203, 1, 0, 0,205, 1, 0, 0,
+ 0, 0, 35, 0,204, 1, 0, 0,205, 1, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0,190, 0, 0, 0,
+205, 1, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,205, 1, 0, 0, 0, 0, 35, 0,191, 0, 0, 0,204, 1, 0, 0, 0, 0, 35, 0,
+191, 0, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0, 53, 1, 0, 0,204, 1, 0, 0, 0, 0, 35, 0, 57, 1, 0, 0,206, 1, 0, 0,
+ 0, 0, 35, 0,207, 0, 0, 0, 57, 1, 0, 0, 0, 0, 35, 0,207, 0, 0, 0,206, 1, 0, 0, 0, 0, 35, 0,206, 1, 0, 0,
+207, 1, 0, 0, 0, 0, 35, 0,207, 1, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,206, 1, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,
+179, 0, 0, 0, 56, 1, 0, 0, 0, 0, 35, 0, 56, 1, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,179, 0, 0, 0,208, 1, 0, 0,
+ 0, 0, 35, 0,178, 0, 0, 0,207, 1, 0, 0, 0, 0, 35, 0,206, 0, 0, 0,207, 1, 0, 0, 0, 0, 35, 0,178, 0, 0, 0,
+206, 0, 0, 0, 0, 0, 35, 0, 56, 1, 0, 0,209, 1, 0, 0, 0, 0, 35, 0, 56, 1, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0,
+ 58, 1, 0, 0,209, 1, 0, 0, 0, 0, 35, 0,209, 1, 0, 0,210, 1, 0, 0, 0, 0, 35, 0,210, 1, 0, 0,211, 1, 0, 0,
+ 0, 0, 35, 0,209, 1, 0, 0,211, 1, 0, 0, 0, 0, 35, 0, 57, 1, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0, 57, 1, 0, 0,
+211, 1, 0, 0, 0, 0, 35, 0, 61, 1, 0, 0,211, 1, 0, 0, 0, 0, 35, 0, 60, 1, 0, 0,210, 1, 0, 0, 0, 0, 35, 0,
+ 59, 1, 0, 0,210, 1, 0, 0, 0, 0, 35, 0, 59, 1, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0,204, 0, 0, 0,212, 1, 0, 0,
+ 0, 0, 35, 0,204, 0, 0, 0,208, 0, 0, 0, 0, 0, 35, 0,208, 0, 0, 0,212, 1, 0, 0, 0, 0, 35, 0,212, 1, 0, 0,
+213, 1, 0, 0, 0, 0, 35, 0,213, 1, 0, 0,214, 1, 0, 0, 0, 0, 35, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 35, 0,
+205, 0, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0,205, 0, 0, 0,214, 1, 0, 0, 0, 0, 35, 0, 60, 1, 0, 0,214, 1, 0, 0,
+ 0, 0, 35, 0, 61, 1, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,209, 0, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,209, 0, 0, 0,
+ 61, 1, 0, 0, 0, 0, 35, 0,203, 0, 0, 0,215, 1, 0, 0, 0, 0, 35, 0,203, 0, 0, 0, 59, 1, 0, 0, 0, 0, 35, 0,
+ 59, 1, 0, 0,215, 1, 0, 0, 0, 0, 35, 0,215, 1, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,216, 1, 0, 0,217, 1, 0, 0,
+ 0, 0, 35, 0,215, 1, 0, 0,217, 1, 0, 0, 0, 0, 35, 0,180, 0, 0, 0,202, 0, 0, 0, 0, 0, 35, 0,202, 0, 0, 0,
+217, 1, 0, 0, 0, 0, 35, 0,180, 0, 0, 0,217, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,
+ 58, 1, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0, 63, 1, 0, 0,218, 1, 0, 0,
+ 0, 0, 35, 0,215, 0, 0, 0, 63, 1, 0, 0, 0, 0, 35, 0,215, 0, 0, 0,218, 1, 0, 0, 0, 0, 35, 0,218, 1, 0, 0,
+219, 1, 0, 0, 0, 0, 35, 0,219, 1, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,218, 1, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,
+173, 0, 0, 0, 62, 1, 0, 0, 0, 0, 35, 0, 62, 1, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0,220, 1, 0, 0,
+ 0, 0, 35, 0,172, 0, 0, 0,219, 1, 0, 0, 0, 0, 35, 0,214, 0, 0, 0,219, 1, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,
+214, 0, 0, 0, 0, 0, 35, 0, 62, 1, 0, 0,221, 1, 0, 0, 0, 0, 35, 0, 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0,
+ 64, 1, 0, 0,221, 1, 0, 0, 0, 0, 35, 0,221, 1, 0, 0,222, 1, 0, 0, 0, 0, 35, 0,222, 1, 0, 0,223, 1, 0, 0,
+ 0, 0, 35, 0,221, 1, 0, 0,223, 1, 0, 0, 0, 0, 35, 0, 63, 1, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0, 63, 1, 0, 0,
+223, 1, 0, 0, 0, 0, 35, 0, 67, 1, 0, 0,223, 1, 0, 0, 0, 0, 35, 0, 66, 1, 0, 0,222, 1, 0, 0, 0, 0, 35, 0,
+ 65, 1, 0, 0,222, 1, 0, 0, 0, 0, 35, 0, 65, 1, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0,212, 0, 0, 0,224, 1, 0, 0,
+ 0, 0, 35, 0,212, 0, 0, 0,216, 0, 0, 0, 0, 0, 35, 0,216, 0, 0, 0,224, 1, 0, 0, 0, 0, 35, 0,224, 1, 0, 0,
+225, 1, 0, 0, 0, 0, 35, 0,225, 1, 0, 0,226, 1, 0, 0, 0, 0, 35, 0,224, 1, 0, 0,226, 1, 0, 0, 0, 0, 35, 0,
+213, 0, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0,213, 0, 0, 0,226, 1, 0, 0, 0, 0, 35, 0, 66, 1, 0, 0,226, 1, 0, 0,
+ 0, 0, 35, 0, 67, 1, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,217, 0, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,217, 0, 0, 0,
+ 67, 1, 0, 0, 0, 0, 35, 0,211, 0, 0, 0,227, 1, 0, 0, 0, 0, 35, 0,211, 0, 0, 0, 65, 1, 0, 0, 0, 0, 35, 0,
+ 65, 1, 0, 0,227, 1, 0, 0, 0, 0, 35, 0,227, 1, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,228, 1, 0, 0,229, 1, 0, 0,
+ 0, 0, 35, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0,210, 0, 0, 0,
+229, 1, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,229, 1, 0, 0, 0, 0, 35, 0,171, 0, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,
+ 64, 1, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,171, 0, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0, 69, 1, 0, 0,230, 1, 0, 0,
+ 0, 0, 35, 0,223, 0, 0, 0, 69, 1, 0, 0, 0, 0, 35, 0,223, 0, 0, 0,230, 1, 0, 0, 0, 0, 35, 0,230, 1, 0, 0,
+231, 1, 0, 0, 0, 0, 35, 0,231, 1, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,
+189, 0, 0, 0, 68, 1, 0, 0, 0, 0, 35, 0, 68, 1, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0,232, 1, 0, 0,
+ 0, 0, 35, 0,188, 0, 0, 0,231, 1, 0, 0, 0, 0, 35, 0,222, 0, 0, 0,231, 1, 0, 0, 0, 0, 35, 0,188, 0, 0, 0,
+222, 0, 0, 0, 0, 0, 35, 0, 68, 1, 0, 0,233, 1, 0, 0, 0, 0, 35, 0, 68, 1, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0,
+ 70, 1, 0, 0,233, 1, 0, 0, 0, 0, 35, 0,233, 1, 0, 0,234, 1, 0, 0, 0, 0, 35, 0,234, 1, 0, 0,235, 1, 0, 0,
+ 0, 0, 35, 0,233, 1, 0, 0,235, 1, 0, 0, 0, 0, 35, 0, 69, 1, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0, 69, 1, 0, 0,
+235, 1, 0, 0, 0, 0, 35, 0, 73, 1, 0, 0,235, 1, 0, 0, 0, 0, 35, 0, 72, 1, 0, 0,234, 1, 0, 0, 0, 0, 35, 0,
+ 71, 1, 0, 0,234, 1, 0, 0, 0, 0, 35, 0, 71, 1, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0,220, 0, 0, 0,236, 1, 0, 0,
+ 0, 0, 35, 0,220, 0, 0, 0,224, 0, 0, 0, 0, 0, 35, 0,224, 0, 0, 0,236, 1, 0, 0, 0, 0, 35, 0,236, 1, 0, 0,
+237, 1, 0, 0, 0, 0, 35, 0,237, 1, 0, 0,238, 1, 0, 0, 0, 0, 35, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 35, 0,
+221, 0, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0,221, 0, 0, 0,238, 1, 0, 0, 0, 0, 35, 0, 72, 1, 0, 0,238, 1, 0, 0,
+ 0, 0, 35, 0, 73, 1, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,225, 0, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,225, 0, 0, 0,
+ 73, 1, 0, 0, 0, 0, 35, 0,219, 0, 0, 0,239, 1, 0, 0, 0, 0, 35, 0,219, 0, 0, 0, 71, 1, 0, 0, 0, 0, 35, 0,
+ 71, 1, 0, 0,239, 1, 0, 0, 0, 0, 35, 0,239, 1, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,240, 1, 0, 0,241, 1, 0, 0,
+ 0, 0, 35, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 35, 0,186, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0,218, 0, 0, 0,
+241, 1, 0, 0, 0, 0, 35, 0,186, 0, 0, 0,241, 1, 0, 0, 0, 0, 35, 0,187, 0, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,
+ 70, 1, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,187, 0, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0, 75, 1, 0, 0,242, 1, 0, 0,
+ 0, 0, 35, 0,231, 0, 0, 0, 75, 1, 0, 0, 0, 0, 35, 0,231, 0, 0, 0,242, 1, 0, 0, 0, 0, 35, 0,242, 1, 0, 0,
+243, 1, 0, 0, 0, 0, 35, 0,243, 1, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,242, 1, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,
+197, 0, 0, 0, 74, 1, 0, 0, 0, 0, 35, 0, 74, 1, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0,244, 1, 0, 0,
+ 0, 0, 35, 0,196, 0, 0, 0,243, 1, 0, 0, 0, 0, 35, 0,230, 0, 0, 0,243, 1, 0, 0, 0, 0, 35, 0,196, 0, 0, 0,
+230, 0, 0, 0, 0, 0, 35, 0, 74, 1, 0, 0,245, 1, 0, 0, 0, 0, 35, 0, 74, 1, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0,
+ 76, 1, 0, 0,245, 1, 0, 0, 0, 0, 35, 0,245, 1, 0, 0,246, 1, 0, 0, 0, 0, 35, 0,246, 1, 0, 0,247, 1, 0, 0,
+ 0, 0, 35, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 35, 0, 75, 1, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0, 75, 1, 0, 0,
+247, 1, 0, 0, 0, 0, 35, 0, 79, 1, 0, 0,247, 1, 0, 0, 0, 0, 35, 0, 78, 1, 0, 0,246, 1, 0, 0, 0, 0, 35, 0,
+ 77, 1, 0, 0,246, 1, 0, 0, 0, 0, 35, 0, 77, 1, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0,228, 0, 0, 0,248, 1, 0, 0,
+ 0, 0, 35, 0,228, 0, 0, 0,232, 0, 0, 0, 0, 0, 35, 0,232, 0, 0, 0,248, 1, 0, 0, 0, 0, 35, 0,248, 1, 0, 0,
+249, 1, 0, 0, 0, 0, 35, 0,249, 1, 0, 0,250, 1, 0, 0, 0, 0, 35, 0,248, 1, 0, 0,250, 1, 0, 0, 0, 0, 35, 0,
+229, 0, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0,229, 0, 0, 0,250, 1, 0, 0, 0, 0, 35, 0, 78, 1, 0, 0,250, 1, 0, 0,
+ 0, 0, 35, 0, 79, 1, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,233, 0, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,233, 0, 0, 0,
+ 79, 1, 0, 0, 0, 0, 35, 0,227, 0, 0, 0,251, 1, 0, 0, 0, 0, 35, 0,227, 0, 0, 0, 77, 1, 0, 0, 0, 0, 35, 0,
+ 77, 1, 0, 0,251, 1, 0, 0, 0, 0, 35, 0,251, 1, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,252, 1, 0, 0,253, 1, 0, 0,
+ 0, 0, 35, 0,251, 1, 0, 0,253, 1, 0, 0, 0, 0, 35, 0,194, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0,226, 0, 0, 0,
+253, 1, 0, 0, 0, 0, 35, 0,194, 0, 0, 0,253, 1, 0, 0, 0, 0, 35, 0,195, 0, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,
+ 76, 1, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,195, 0, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0, 81, 1, 0, 0,254, 1, 0, 0,
+ 0, 0, 35, 0,239, 0, 0, 0, 81, 1, 0, 0, 0, 0, 35, 0,239, 0, 0, 0,254, 1, 0, 0, 0, 0, 35, 0,254, 1, 0, 0,
+255, 1, 0, 0, 0, 0, 35, 0,255, 1, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,254, 1, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,
+201, 0, 0, 0, 80, 1, 0, 0, 0, 0, 35, 0, 80, 1, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,201, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 35, 0,200, 0, 0, 0,255, 1, 0, 0, 0, 0, 35, 0,238, 0, 0, 0,255, 1, 0, 0, 0, 0, 35, 0,200, 0, 0, 0,
+238, 0, 0, 0, 0, 0, 35, 0, 80, 1, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0, 80, 1, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0,
+ 82, 1, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0, 1, 2, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0, 2, 2, 0, 0, 3, 2, 0, 0,
+ 0, 0, 35, 0, 1, 2, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0, 81, 1, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0, 81, 1, 0, 0,
+ 3, 2, 0, 0, 0, 0, 35, 0, 85, 1, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0, 84, 1, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0,
+ 83, 1, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0, 83, 1, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0,236, 0, 0, 0, 4, 2, 0, 0,
+ 0, 0, 35, 0,236, 0, 0, 0,240, 0, 0, 0, 0, 0, 35, 0,240, 0, 0, 0, 4, 2, 0, 0, 0, 0, 35, 0, 4, 2, 0, 0,
+ 5, 2, 0, 0, 0, 0, 35, 0, 5, 2, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0, 4, 2, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0,
+237, 0, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0,237, 0, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0, 84, 1, 0, 0, 6, 2, 0, 0,
+ 0, 0, 35, 0, 85, 1, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,241, 0, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,241, 0, 0, 0,
+ 85, 1, 0, 0, 0, 0, 35, 0,235, 0, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0,235, 0, 0, 0, 83, 1, 0, 0, 0, 0, 35, 0,
+ 83, 1, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0, 7, 2, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0, 8, 2, 0, 0, 9, 2, 0, 0,
+ 0, 0, 35, 0, 7, 2, 0, 0, 9, 2, 0, 0, 0, 0, 35, 0,198, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0,234, 0, 0, 0,
+ 9, 2, 0, 0, 0, 0, 35, 0,198, 0, 0, 0, 9, 2, 0, 0, 0, 0, 35, 0,199, 0, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0,
+ 82, 1, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0,199, 0, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0, 87, 1, 0, 0, 10, 2, 0, 0,
+ 0, 0, 35, 0,245, 0, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0,245, 0, 0, 0, 87, 1, 0, 0, 0, 0, 35, 0, 10, 2, 0, 0,
+ 11, 2, 0, 0, 0, 0, 35, 0, 10, 2, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0, 11, 2, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,
+209, 0, 0, 0, 86, 1, 0, 0, 0, 0, 35, 0,209, 0, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0, 86, 1, 0, 0, 12, 2, 0, 0,
+ 0, 0, 35, 0,208, 0, 0, 0, 11, 2, 0, 0, 0, 0, 35, 0,208, 0, 0, 0,244, 0, 0, 0, 0, 0, 35, 0,244, 0, 0, 0,
+ 11, 2, 0, 0, 0, 0, 35, 0, 86, 1, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0, 88, 1, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0,
+ 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0, 13, 2, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0, 13, 2, 0, 0, 15, 2, 0, 0,
+ 0, 0, 35, 0, 14, 2, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0, 87, 1, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0, 91, 1, 0, 0,
+ 15, 2, 0, 0, 0, 0, 35, 0, 87, 1, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0, 90, 1, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0,
+ 89, 1, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0, 89, 1, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0,212, 0, 0, 0, 16, 2, 0, 0,
+ 0, 0, 35, 0,242, 0, 0, 0, 16, 2, 0, 0, 0, 0, 35, 0,212, 0, 0, 0,242, 0, 0, 0, 0, 0, 35, 0, 16, 2, 0, 0,
+ 17, 2, 0, 0, 0, 0, 35, 0, 16, 2, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0, 17, 2, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0,
+213, 0, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0, 90, 1, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0,213, 0, 0, 0, 18, 2, 0, 0,
+ 0, 0, 35, 0, 91, 1, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0,243, 0, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0,243, 0, 0, 0,
+ 17, 2, 0, 0, 0, 0, 35, 0,211, 0, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0, 89, 1, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0,
+211, 0, 0, 0, 89, 1, 0, 0, 0, 0, 35, 0, 19, 2, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0, 19, 2, 0, 0, 21, 2, 0, 0,
+ 0, 0, 35, 0, 20, 2, 0, 0, 21, 2, 0, 0, 0, 0, 35, 0,206, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0,206, 0, 0, 0,
+ 21, 2, 0, 0, 0, 0, 35, 0,210, 0, 0, 0, 21, 2, 0, 0, 0, 0, 35, 0,207, 0, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0,
+207, 0, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0, 88, 1, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0, 93, 1, 0, 0, 22, 2, 0, 0,
+ 0, 0, 35, 0,247, 0, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0,247, 0, 0, 0, 93, 1, 0, 0, 0, 0, 35, 0, 22, 2, 0, 0,
+ 23, 2, 0, 0, 0, 0, 35, 0, 22, 2, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0, 23, 2, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,
+217, 0, 0, 0, 92, 1, 0, 0, 0, 0, 35, 0,217, 0, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0, 92, 1, 0, 0, 24, 2, 0, 0,
+ 0, 0, 35, 0,216, 0, 0, 0, 23, 2, 0, 0, 0, 0, 35, 0,216, 0, 0, 0,246, 0, 0, 0, 0, 0, 35, 0,246, 0, 0, 0,
+ 23, 2, 0, 0, 0, 0, 35, 0, 92, 1, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0, 94, 1, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0,
+ 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0, 25, 2, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0, 25, 2, 0, 0, 27, 2, 0, 0,
+ 0, 0, 35, 0, 26, 2, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0, 93, 1, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0, 97, 1, 0, 0,
+ 27, 2, 0, 0, 0, 0, 35, 0, 93, 1, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0, 96, 1, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0,
+ 95, 1, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0, 95, 1, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0,220, 0, 0, 0, 28, 2, 0, 0,
+ 0, 0, 35, 0,248, 0, 0, 0, 28, 2, 0, 0, 0, 0, 35, 0,220, 0, 0, 0,248, 0, 0, 0, 0, 0, 35, 0, 28, 2, 0, 0,
+ 29, 2, 0, 0, 0, 0, 35, 0, 28, 2, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0, 29, 2, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0,
+221, 0, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0, 96, 1, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0,221, 0, 0, 0, 30, 2, 0, 0,
+ 0, 0, 35, 0, 97, 1, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0,249, 0, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0,249, 0, 0, 0,
+ 29, 2, 0, 0, 0, 0, 35, 0,219, 0, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0, 95, 1, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0,
+219, 0, 0, 0, 95, 1, 0, 0, 0, 0, 35, 0, 31, 2, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0, 31, 2, 0, 0, 33, 2, 0, 0,
+ 0, 0, 35, 0, 32, 2, 0, 0, 33, 2, 0, 0, 0, 0, 35, 0,214, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0,214, 0, 0, 0,
+ 33, 2, 0, 0, 0, 0, 35, 0,218, 0, 0, 0, 33, 2, 0, 0, 0, 0, 35, 0,215, 0, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0,
+215, 0, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0, 94, 1, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0, 99, 1, 0, 0, 34, 2, 0, 0,
+ 0, 0, 35, 0,251, 0, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0,251, 0, 0, 0, 99, 1, 0, 0, 0, 0, 35, 0, 34, 2, 0, 0,
+ 35, 2, 0, 0, 0, 0, 35, 0, 34, 2, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0, 35, 2, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,
+225, 0, 0, 0, 98, 1, 0, 0, 0, 0, 35, 0,225, 0, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0, 98, 1, 0, 0, 36, 2, 0, 0,
+ 0, 0, 35, 0,224, 0, 0, 0, 35, 2, 0, 0, 0, 0, 35, 0,224, 0, 0, 0,250, 0, 0, 0, 0, 0, 35, 0,250, 0, 0, 0,
+ 35, 2, 0, 0, 0, 0, 35, 0, 98, 1, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0,100, 1, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0,
+ 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 35, 0, 37, 2, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0, 37, 2, 0, 0, 39, 2, 0, 0,
+ 0, 0, 35, 0, 38, 2, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0, 99, 1, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,103, 1, 0, 0,
+ 39, 2, 0, 0, 0, 0, 35, 0, 99, 1, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0,102, 1, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,
+101, 1, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,101, 1, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,228, 0, 0, 0, 40, 2, 0, 0,
+ 0, 0, 35, 0,252, 0, 0, 0, 40, 2, 0, 0, 0, 0, 35, 0,228, 0, 0, 0,252, 0, 0, 0, 0, 0, 35, 0, 40, 2, 0, 0,
+ 41, 2, 0, 0, 0, 0, 35, 0, 40, 2, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0, 41, 2, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,
+229, 0, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,102, 1, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,229, 0, 0, 0, 42, 2, 0, 0,
+ 0, 0, 35, 0,103, 1, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0,253, 0, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,253, 0, 0, 0,
+ 41, 2, 0, 0, 0, 0, 35, 0,227, 0, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0,101, 1, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0,
+227, 0, 0, 0,101, 1, 0, 0, 0, 0, 35, 0, 43, 2, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0, 43, 2, 0, 0, 45, 2, 0, 0,
+ 0, 0, 35, 0, 44, 2, 0, 0, 45, 2, 0, 0, 0, 0, 35, 0,222, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0,222, 0, 0, 0,
+ 45, 2, 0, 0, 0, 0, 35, 0,226, 0, 0, 0, 45, 2, 0, 0, 0, 0, 35, 0,223, 0, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0,
+223, 0, 0, 0,100, 1, 0, 0, 0, 0, 35, 0,100, 1, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0,105, 1, 0, 0, 46, 2, 0, 0,
+ 0, 0, 35, 0,255, 0, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0,255, 0, 0, 0,105, 1, 0, 0, 0, 0, 35, 0, 46, 2, 0, 0,
+ 47, 2, 0, 0, 0, 0, 35, 0, 46, 2, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0, 47, 2, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,
+233, 0, 0, 0,104, 1, 0, 0, 0, 0, 35, 0,233, 0, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,104, 1, 0, 0, 48, 2, 0, 0,
+ 0, 0, 35, 0,232, 0, 0, 0, 47, 2, 0, 0, 0, 0, 35, 0,232, 0, 0, 0,254, 0, 0, 0, 0, 0, 35, 0,254, 0, 0, 0,
+ 47, 2, 0, 0, 0, 0, 35, 0,104, 1, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,106, 1, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,
+104, 1, 0, 0,106, 1, 0, 0, 0, 0, 35, 0, 49, 2, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0, 49, 2, 0, 0, 51, 2, 0, 0,
+ 0, 0, 35, 0, 50, 2, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,105, 1, 0, 0,109, 1, 0, 0, 0, 0, 35, 0,109, 1, 0, 0,
+ 51, 2, 0, 0, 0, 0, 35, 0,105, 1, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,108, 1, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,
+107, 1, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,107, 1, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,236, 0, 0, 0, 52, 2, 0, 0,
+ 0, 0, 35, 0, 0, 1, 0, 0, 52, 2, 0, 0, 0, 0, 35, 0,236, 0, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 52, 2, 0, 0,
+ 53, 2, 0, 0, 0, 0, 35, 0, 52, 2, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0, 53, 2, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,
+237, 0, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,108, 1, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,237, 0, 0, 0, 54, 2, 0, 0,
+ 0, 0, 35, 0,109, 1, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0,109, 1, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0,
+ 53, 2, 0, 0, 0, 0, 35, 0,235, 0, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0,107, 1, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0,
+235, 0, 0, 0,107, 1, 0, 0, 0, 0, 35, 0, 55, 2, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0, 55, 2, 0, 0, 57, 2, 0, 0,
+ 0, 0, 35, 0, 56, 2, 0, 0, 57, 2, 0, 0, 0, 0, 35, 0,230, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0,230, 0, 0, 0,
+ 57, 2, 0, 0, 0, 0, 35, 0,234, 0, 0, 0, 57, 2, 0, 0, 0, 0, 35, 0,231, 0, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0,
+231, 0, 0, 0,106, 1, 0, 0, 0, 0, 35, 0,106, 1, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0,111, 1, 0, 0, 58, 2, 0, 0,
+ 0, 0, 35, 0, 3, 1, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0, 3, 1, 0, 0,111, 1, 0, 0, 0, 0, 35, 0, 58, 2, 0, 0,
+ 59, 2, 0, 0, 0, 0, 35, 0, 58, 2, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0, 59, 2, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,
+241, 0, 0, 0,110, 1, 0, 0, 0, 0, 35, 0,241, 0, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,110, 1, 0, 0, 60, 2, 0, 0,
+ 0, 0, 35, 0,240, 0, 0, 0, 59, 2, 0, 0, 0, 0, 35, 0,240, 0, 0, 0, 2, 1, 0, 0, 0, 0, 35, 0, 2, 1, 0, 0,
+ 59, 2, 0, 0, 0, 0, 35, 0,110, 1, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,113, 1, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,
+110, 1, 0, 0,113, 1, 0, 0, 0, 0, 35, 0, 61, 2, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0, 61, 2, 0, 0, 63, 2, 0, 0,
+ 0, 0, 35, 0, 62, 2, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,111, 1, 0, 0,115, 1, 0, 0, 0, 0, 35, 0,115, 1, 0, 0,
+ 63, 2, 0, 0, 0, 0, 35, 0,111, 1, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,114, 1, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,
+112, 1, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,112, 1, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,204, 0, 0, 0, 64, 2, 0, 0,
+ 0, 0, 35, 0, 4, 1, 0, 0, 64, 2, 0, 0, 0, 0, 35, 0,204, 0, 0, 0, 4, 1, 0, 0, 0, 0, 35, 0, 64, 2, 0, 0,
+ 65, 2, 0, 0, 0, 0, 35, 0, 64, 2, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0, 65, 2, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,
+205, 0, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,114, 1, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,205, 0, 0, 0, 66, 2, 0, 0,
+ 0, 0, 35, 0,115, 1, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0,115, 1, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0,
+ 65, 2, 0, 0, 0, 0, 35, 0,203, 0, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0,112, 1, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0,
+203, 0, 0, 0,112, 1, 0, 0, 0, 0, 35, 0, 67, 2, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0, 67, 2, 0, 0, 69, 2, 0, 0,
+ 0, 0, 35, 0, 68, 2, 0, 0, 69, 2, 0, 0, 0, 0, 35, 0,202, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0,238, 0, 0, 0,
+ 69, 2, 0, 0, 0, 0, 35, 0,202, 0, 0, 0, 69, 2, 0, 0, 0, 0, 35, 0,239, 0, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0,
+239, 0, 0, 0,113, 1, 0, 0, 0, 0, 35, 0,113, 1, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0,117, 1, 0, 0, 70, 2, 0, 0,
+ 0, 0, 35, 0, 11, 1, 0, 0,117, 1, 0, 0, 0, 0, 35, 0, 11, 1, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0, 70, 2, 0, 0,
+ 71, 2, 0, 0, 0, 0, 35, 0, 71, 2, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0, 70, 2, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,
+243, 0, 0, 0,116, 1, 0, 0, 0, 0, 35, 0,116, 1, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,243, 0, 0, 0, 72, 2, 0, 0,
+ 0, 0, 35, 0,242, 0, 0, 0, 71, 2, 0, 0, 0, 0, 35, 0, 10, 1, 0, 0, 71, 2, 0, 0, 0, 0, 35, 0,242, 0, 0, 0,
+ 10, 1, 0, 0, 0, 0, 35, 0,116, 1, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0,116, 1, 0, 0,118, 1, 0, 0, 0, 0, 35, 0,
+118, 1, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0, 73, 2, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0, 74, 2, 0, 0, 75, 2, 0, 0,
+ 0, 0, 35, 0, 73, 2, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,117, 1, 0, 0,121, 1, 0, 0, 0, 0, 35, 0,117, 1, 0, 0,
+ 75, 2, 0, 0, 0, 0, 35, 0,121, 1, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,120, 1, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,
+119, 1, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,119, 1, 0, 0,120, 1, 0, 0, 0, 0, 35, 0, 8, 1, 0, 0, 76, 2, 0, 0,
+ 0, 0, 35, 0, 8, 1, 0, 0, 12, 1, 0, 0, 0, 0, 35, 0, 12, 1, 0, 0, 76, 2, 0, 0, 0, 0, 35, 0, 76, 2, 0, 0,
+ 77, 2, 0, 0, 0, 0, 35, 0, 77, 2, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0, 76, 2, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0,
+ 9, 1, 0, 0,120, 1, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0,120, 1, 0, 0, 78, 2, 0, 0,
+ 0, 0, 35, 0,121, 1, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0,
+121, 1, 0, 0, 0, 0, 35, 0, 7, 1, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0, 7, 1, 0, 0,119, 1, 0, 0, 0, 0, 35, 0,
+119, 1, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0, 79, 2, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0, 80, 2, 0, 0, 81, 2, 0, 0,
+ 0, 0, 35, 0, 79, 2, 0, 0, 81, 2, 0, 0, 0, 0, 35, 0,244, 0, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0, 6, 1, 0, 0,
+ 81, 2, 0, 0, 0, 0, 35, 0,244, 0, 0, 0, 81, 2, 0, 0, 0, 0, 35, 0,245, 0, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,
+118, 1, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,245, 0, 0, 0,118, 1, 0, 0, 0, 0, 35, 0,123, 1, 0, 0, 82, 2, 0, 0,
+ 0, 0, 35, 0, 15, 1, 0, 0,123, 1, 0, 0, 0, 0, 35, 0, 15, 1, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0, 82, 2, 0, 0,
+ 83, 2, 0, 0, 0, 0, 35, 0, 83, 2, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0, 82, 2, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,
+249, 0, 0, 0,122, 1, 0, 0, 0, 0, 35, 0,122, 1, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,249, 0, 0, 0, 84, 2, 0, 0,
+ 0, 0, 35, 0,248, 0, 0, 0, 83, 2, 0, 0, 0, 0, 35, 0, 14, 1, 0, 0, 83, 2, 0, 0, 0, 0, 35, 0,248, 0, 0, 0,
+ 14, 1, 0, 0, 0, 0, 35, 0,122, 1, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0,122, 1, 0, 0,124, 1, 0, 0, 0, 0, 35, 0,
+124, 1, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0, 85, 2, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0, 86, 2, 0, 0, 87, 2, 0, 0,
+ 0, 0, 35, 0, 85, 2, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,123, 1, 0, 0,127, 1, 0, 0, 0, 0, 35, 0,123, 1, 0, 0,
+ 87, 2, 0, 0, 0, 0, 35, 0,127, 1, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,126, 1, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,
+125, 1, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,125, 1, 0, 0,126, 1, 0, 0, 0, 0, 35, 0, 12, 1, 0, 0, 88, 2, 0, 0,
+ 0, 0, 35, 0, 12, 1, 0, 0, 16, 1, 0, 0, 0, 0, 35, 0, 16, 1, 0, 0, 88, 2, 0, 0, 0, 0, 35, 0, 88, 2, 0, 0,
+ 89, 2, 0, 0, 0, 0, 35, 0, 89, 2, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0, 88, 2, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0,
+ 13, 1, 0, 0,126, 1, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0,126, 1, 0, 0, 90, 2, 0, 0,
+ 0, 0, 35, 0,127, 1, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0,
+127, 1, 0, 0, 0, 0, 35, 0, 11, 1, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0, 11, 1, 0, 0,125, 1, 0, 0, 0, 0, 35, 0,
+125, 1, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0, 91, 2, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0, 92, 2, 0, 0, 93, 2, 0, 0,
+ 0, 0, 35, 0, 91, 2, 0, 0, 93, 2, 0, 0, 0, 0, 35, 0,246, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0, 10, 1, 0, 0,
+ 93, 2, 0, 0, 0, 0, 35, 0,246, 0, 0, 0, 93, 2, 0, 0, 0, 0, 35, 0,247, 0, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,
+124, 1, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,247, 0, 0, 0,124, 1, 0, 0, 0, 0, 35, 0,129, 1, 0, 0, 94, 2, 0, 0,
+ 0, 0, 35, 0, 19, 1, 0, 0,129, 1, 0, 0, 0, 0, 35, 0, 19, 1, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0, 94, 2, 0, 0,
+ 95, 2, 0, 0, 0, 0, 35, 0, 95, 2, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0, 94, 2, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,
+253, 0, 0, 0,128, 1, 0, 0, 0, 0, 35, 0,128, 1, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,253, 0, 0, 0, 96, 2, 0, 0,
+ 0, 0, 35, 0,252, 0, 0, 0, 95, 2, 0, 0, 0, 0, 35, 0, 18, 1, 0, 0, 95, 2, 0, 0, 0, 0, 35, 0,252, 0, 0, 0,
+ 18, 1, 0, 0, 0, 0, 35, 0,128, 1, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0,128, 1, 0, 0,130, 1, 0, 0, 0, 0, 35, 0,
+130, 1, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0, 97, 2, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0, 98, 2, 0, 0, 99, 2, 0, 0,
+ 0, 0, 35, 0, 97, 2, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,129, 1, 0, 0,133, 1, 0, 0, 0, 0, 35, 0,129, 1, 0, 0,
+ 99, 2, 0, 0, 0, 0, 35, 0,133, 1, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,132, 1, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,
+131, 1, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,131, 1, 0, 0,132, 1, 0, 0, 0, 0, 35, 0, 16, 1, 0, 0,100, 2, 0, 0,
+ 0, 0, 35, 0, 16, 1, 0, 0, 20, 1, 0, 0, 0, 0, 35, 0, 20, 1, 0, 0,100, 2, 0, 0, 0, 0, 35, 0,100, 2, 0, 0,
+101, 2, 0, 0, 0, 0, 35, 0,101, 2, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,100, 2, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,
+ 17, 1, 0, 0,132, 1, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,132, 1, 0, 0,102, 2, 0, 0,
+ 0, 0, 35, 0,133, 1, 0, 0,101, 2, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,101, 2, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,
+133, 1, 0, 0, 0, 0, 35, 0, 15, 1, 0, 0,103, 2, 0, 0, 0, 0, 35, 0, 15, 1, 0, 0,131, 1, 0, 0, 0, 0, 35, 0,
+131, 1, 0, 0,103, 2, 0, 0, 0, 0, 35, 0,103, 2, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,104, 2, 0, 0,105, 2, 0, 0,
+ 0, 0, 35, 0,103, 2, 0, 0,105, 2, 0, 0, 0, 0, 35, 0,250, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0, 14, 1, 0, 0,
+105, 2, 0, 0, 0, 0, 35, 0,250, 0, 0, 0,105, 2, 0, 0, 0, 0, 35, 0,251, 0, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,
+130, 1, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,251, 0, 0, 0,130, 1, 0, 0, 0, 0, 35, 0,135, 1, 0, 0,106, 2, 0, 0,
+ 0, 0, 35, 0, 23, 1, 0, 0,135, 1, 0, 0, 0, 0, 35, 0, 23, 1, 0, 0,106, 2, 0, 0, 0, 0, 35, 0,106, 2, 0, 0,
+107, 2, 0, 0, 0, 0, 35, 0,107, 2, 0, 0,108, 2, 0, 0, 0, 0, 35, 0,106, 2, 0, 0,108, 2, 0, 0, 0, 0, 35, 0,
+ 1, 1, 0, 0,134, 1, 0, 0, 0, 0, 35, 0,134, 1, 0, 0,108, 2, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0,108, 2, 0, 0,
+ 0, 0, 35, 0, 0, 1, 0, 0,107, 2, 0, 0, 0, 0, 35, 0, 22, 1, 0, 0,107, 2, 0, 0, 0, 0, 35, 0, 0, 1, 0, 0,
+ 22, 1, 0, 0, 0, 0, 35, 0,134, 1, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,134, 1, 0, 0,136, 1, 0, 0, 0, 0, 35, 0,
+136, 1, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,109, 2, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,110, 2, 0, 0,111, 2, 0, 0,
+ 0, 0, 35, 0,109, 2, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,135, 1, 0, 0,139, 1, 0, 0, 0, 0, 35, 0,135, 1, 0, 0,
+111, 2, 0, 0, 0, 0, 35, 0,139, 1, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,138, 1, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,
+137, 1, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,137, 1, 0, 0,138, 1, 0, 0, 0, 0, 35, 0, 20, 1, 0, 0,112, 2, 0, 0,
+ 0, 0, 35, 0, 20, 1, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0, 24, 1, 0, 0,112, 2, 0, 0, 0, 0, 35, 0,112, 2, 0, 0,
+113, 2, 0, 0, 0, 0, 35, 0,113, 2, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,112, 2, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,
+ 21, 1, 0, 0,138, 1, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,138, 1, 0, 0,114, 2, 0, 0,
+ 0, 0, 35, 0,139, 1, 0, 0,113, 2, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,113, 2, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,
+139, 1, 0, 0, 0, 0, 35, 0, 19, 1, 0, 0,115, 2, 0, 0, 0, 0, 35, 0, 19, 1, 0, 0,137, 1, 0, 0, 0, 0, 35, 0,
+137, 1, 0, 0,115, 2, 0, 0, 0, 0, 35, 0,115, 2, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,116, 2, 0, 0,117, 2, 0, 0,
+ 0, 0, 35, 0,115, 2, 0, 0,117, 2, 0, 0, 0, 0, 35, 0,254, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0, 18, 1, 0, 0,
+117, 2, 0, 0, 0, 0, 35, 0,254, 0, 0, 0,117, 2, 0, 0, 0, 0, 35, 0,255, 0, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,
+136, 1, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,255, 0, 0, 0,136, 1, 0, 0, 0, 0, 35, 0,141, 1, 0, 0,118, 2, 0, 0,
+ 0, 0, 35, 0, 7, 1, 0, 0,141, 1, 0, 0, 0, 0, 35, 0, 7, 1, 0, 0,118, 2, 0, 0, 0, 0, 35, 0,118, 2, 0, 0,
+119, 2, 0, 0, 0, 0, 35, 0,119, 2, 0, 0,120, 2, 0, 0, 0, 0, 35, 0,118, 2, 0, 0,120, 2, 0, 0, 0, 0, 35, 0,
+ 5, 1, 0, 0,140, 1, 0, 0, 0, 0, 35, 0,140, 1, 0, 0,120, 2, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0,120, 2, 0, 0,
+ 0, 0, 35, 0, 4, 1, 0, 0,119, 2, 0, 0, 0, 0, 35, 0, 6, 1, 0, 0,119, 2, 0, 0, 0, 0, 35, 0, 4, 1, 0, 0,
+ 6, 1, 0, 0, 0, 0, 35, 0,140, 1, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,140, 1, 0, 0,142, 1, 0, 0, 0, 0, 35, 0,
+142, 1, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,121, 2, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,122, 2, 0, 0,123, 2, 0, 0,
+ 0, 0, 35, 0,121, 2, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,141, 1, 0, 0,144, 1, 0, 0, 0, 0, 35, 0,141, 1, 0, 0,
+123, 2, 0, 0, 0, 0, 35, 0,144, 1, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,145, 1, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,
+143, 1, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,143, 1, 0, 0,145, 1, 0, 0, 0, 0, 35, 0, 24, 1, 0, 0,124, 2, 0, 0,
+ 0, 0, 35, 0, 8, 1, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0, 8, 1, 0, 0,124, 2, 0, 0, 0, 0, 35, 0,124, 2, 0, 0,
+125, 2, 0, 0, 0, 0, 35, 0,125, 2, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,124, 2, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,
+ 25, 1, 0, 0,145, 1, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,145, 1, 0, 0,126, 2, 0, 0,
+ 0, 0, 35, 0,144, 1, 0, 0,125, 2, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0,125, 2, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0,
+144, 1, 0, 0, 0, 0, 35, 0, 23, 1, 0, 0,127, 2, 0, 0, 0, 0, 35, 0, 23, 1, 0, 0,143, 1, 0, 0, 0, 0, 35, 0,
+143, 1, 0, 0,127, 2, 0, 0, 0, 0, 35, 0,127, 2, 0, 0,128, 2, 0, 0, 0, 0, 35, 0,128, 2, 0, 0,129, 2, 0, 0,
+ 0, 0, 35, 0,127, 2, 0, 0,129, 2, 0, 0, 0, 0, 35, 0, 2, 1, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0, 22, 1, 0, 0,
+129, 2, 0, 0, 0, 0, 35, 0, 2, 1, 0, 0,129, 2, 0, 0, 0, 0, 35, 0, 3, 1, 0, 0,128, 2, 0, 0, 0, 0, 35, 0,
+142, 1, 0, 0,128, 2, 0, 0, 0, 0, 35, 0, 3, 1, 0, 0,142, 1, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,
+192, 16,185, 3, 58, 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, 72, 18,185, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 7,249, 0, 32, 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,120,118,185, 3, 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, 7,254, 48, 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,
- 68, 65, 84, 65, 0, 0,100, 0, 7,248,144, 32, 0, 0, 0, 54, 0, 0, 5, 0, 0, 0, 1, 27, 0, 0, 0,102, 0, 0, 1,146,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,146, 0, 0, 0,171, 0, 0, 1, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 14,
- 0, 0, 1, 27, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,171, 0, 0, 1,146, 0, 0, 0, 46, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,147, 0, 0, 0, 46, 0, 0, 1,146, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,146, 0, 0, 1,148,
- 0, 0, 1,147, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 43, 0, 0, 1,147, 0, 0, 1,148, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,148, 0, 0, 1,146, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 26, 0, 0, 0, 12, 0, 0, 0,165,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,165, 0, 0, 1,148, 0, 0, 1, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,102,
- 0, 0, 1, 26, 0, 0, 1,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,148, 0, 0, 0,165, 0, 0, 0, 43, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,147, 0, 0, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,164, 0, 0, 0,170,
- 0, 0, 1,147, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 46, 0, 0, 1,147, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,170, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 26, 0, 0, 0,102, 0, 0, 1,149,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,149, 0, 0, 1, 28, 0, 0, 1, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 12,
- 0, 0, 1, 26, 0, 0, 1, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 28, 0, 0, 1,149, 0, 0, 0,103, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,150, 0, 0, 0,103, 0, 0, 1,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,149, 0, 0, 1,151,
- 0, 0, 1,150, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,104, 0, 0, 1,150, 0, 0, 1,151, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,151, 0, 0, 1,149, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 27, 0, 0, 0, 14, 0, 0, 1, 31,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 31, 0, 0, 1,151, 0, 0, 1, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,102,
- 0, 0, 1, 27, 0, 0, 1,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,151, 0, 0, 1, 31, 0, 0, 0,104, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,150, 0, 0, 0,104, 0, 0, 1, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 30, 0, 0, 1, 29,
- 0, 0, 1,150, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,103, 0, 0, 1,150, 0, 0, 1, 29, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 29, 0, 0, 1, 30, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,168, 0, 0, 0, 45, 0, 0, 1,152,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,152, 0, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2,
- 0, 0, 0,168, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,172, 0, 0, 1,152, 0, 0, 0, 47, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,153, 0, 0, 0, 47, 0, 0, 1,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,152, 0, 0, 1,154,
- 0, 0, 1,153, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,104, 0, 0, 1,153, 0, 0, 1,154, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,154, 0, 0, 1,152, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,169, 0, 0, 0, 13, 0, 0, 1, 30,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 30, 0, 0, 1,154, 0, 0, 0,169, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 45,
- 0, 0, 0,169, 0, 0, 1,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,154, 0, 0, 1, 30, 0, 0, 0,104, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,153, 0, 0, 0,104, 0, 0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 31, 0, 0, 0,173,
- 0, 0, 1,153, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 47, 0, 0, 1,153, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,173, 0, 0, 1, 31, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,167, 0, 0, 0, 44, 0, 0, 1,155,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,155, 0, 0, 1, 29, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 13,
- 0, 0, 0,167, 0, 0, 1, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 29, 0, 0, 1,155, 0, 0, 0,103, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,156, 0, 0, 0,103, 0, 0, 1,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,155, 0, 0, 1,157,
- 0, 0, 1,156, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 42, 0, 0, 1,156, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,157, 0, 0, 1,155, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0,162,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,162, 0, 0, 1,157, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 44,
- 0, 0, 0,166, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,157, 0, 0, 0,162, 0, 0, 0, 42, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,156, 0, 0, 0, 42, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,163, 0, 0, 1, 28,
- 0, 0, 1,156, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,103, 0, 0, 1,156, 0, 0, 1, 28, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 28, 0, 0, 0,163, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,158, 0, 0, 0,105, 0, 0, 1, 33,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 33, 0, 0, 0,179, 0, 0, 1,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 50,
- 0, 0, 1,158, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,179, 0, 0, 1, 33, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,158, 0, 0, 0, 50, 0, 0, 1,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,159, 0, 0, 1,160,
- 0, 0, 1,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,105, 0, 0, 1,158, 0, 0, 1,160, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,160, 0, 0, 1,159, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,165, 0, 0, 0, 12, 0, 0, 1, 32,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 32, 0, 0, 1,160, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 43,
- 0, 0, 0,165, 0, 0, 1,160, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,160, 0, 0, 1, 32, 0, 0, 0,105, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,164, 0, 0, 0, 43, 0, 0, 1,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,159, 0, 0, 0,178,
- 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,178, 0, 0, 1,159, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,161, 0, 0, 0,105, 0, 0, 1, 32,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 32, 0, 0, 1, 34, 0, 0, 1,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,106,
- 0, 0, 1,161, 0, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 34, 0, 0, 1, 32, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,161, 0, 0, 0,106, 0, 0, 1,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,162, 0, 0, 1,163,
- 0, 0, 1,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,105, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,163, 0, 0, 1,162, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 37, 0, 0, 0, 16, 0, 0, 1, 33,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 33, 0, 0, 1,163, 0, 0, 1, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,107,
- 0, 0, 1, 37, 0, 0, 1,163, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,163, 0, 0, 1, 33, 0, 0, 0,105, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 36, 0, 0, 0,107, 0, 0, 1,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,162, 0, 0, 1, 35,
- 0, 0, 1, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 15, 0, 0, 1, 36, 0, 0, 1, 35, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 35, 0, 0, 1,162, 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,164, 0, 0, 0, 49, 0, 0, 0,176,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,176, 0, 0, 0,180, 0, 0, 1,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 51,
- 0, 0, 1,164, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,180, 0, 0, 0,176, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,164, 0, 0, 0, 51, 0, 0, 1,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,165, 0, 0, 1,166,
- 0, 0, 1,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 49, 0, 0, 1,164, 0, 0, 1,166, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,166, 0, 0, 1,165, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 36, 0, 0, 0, 15, 0, 0, 0,177,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,177, 0, 0, 1,166, 0, 0, 1, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,107,
- 0, 0, 1, 36, 0, 0, 1,166, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,166, 0, 0, 0,177, 0, 0, 0, 49, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 37, 0, 0, 0,107, 0, 0, 1,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,165, 0, 0, 0,181,
- 0, 0, 1, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 16, 0, 0, 1, 37, 0, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,181, 0, 0, 1,165, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,167, 0, 0, 0, 48, 0, 0, 0,175,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,175, 0, 0, 1, 35, 0, 0, 1,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,106,
- 0, 0, 1,167, 0, 0, 1, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 35, 0, 0, 0,175, 0, 0, 0, 15, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,167, 0, 0, 0,106, 0, 0, 1,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,168, 0, 0, 1,169,
- 0, 0, 1,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 48, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,169, 0, 0, 1,168, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,174,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,174, 0, 0, 1,169, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 42,
- 0, 0, 0,162, 0, 0, 1,169, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,169, 0, 0, 0,174, 0, 0, 0, 48, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,163, 0, 0, 0, 42, 0, 0, 1,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,168, 0, 0, 1, 34,
- 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 12, 0, 0, 0,163, 0, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 34, 0, 0, 1,168, 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 39, 0, 0, 0,108, 0, 0, 1,170,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,170, 0, 0, 0,187, 0, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 18,
- 0, 0, 1, 39, 0, 0, 0,187, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,187, 0, 0, 1,170, 0, 0, 0, 54, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,171, 0, 0, 0, 54, 0, 0, 1,170, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,170, 0, 0, 1,172,
- 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 45, 0, 0, 1,171, 0, 0, 1,172, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,172, 0, 0, 1,170, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 38, 0, 0, 0, 13, 0, 0, 0,169,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,169, 0, 0, 1,172, 0, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,108,
- 0, 0, 1, 38, 0, 0, 1,172, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,172, 0, 0, 0,169, 0, 0, 0, 45, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,171, 0, 0, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,168, 0, 0, 0,186,
- 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 54, 0, 0, 1,171, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,186, 0, 0, 0,168, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 38, 0, 0, 0,108, 0, 0, 1,173,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,173, 0, 0, 1, 40, 0, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 13,
- 0, 0, 1, 38, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 40, 0, 0, 1,173, 0, 0, 0,109, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,174, 0, 0, 0,109, 0, 0, 1,173, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,173, 0, 0, 1,175,
- 0, 0, 1,174, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,110, 0, 0, 1,174, 0, 0, 1,175, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,175, 0, 0, 1,173, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 39, 0, 0, 0, 18, 0, 0, 1, 43,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 43, 0, 0, 1,175, 0, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,108,
- 0, 0, 1, 39, 0, 0, 1,175, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,175, 0, 0, 1, 43, 0, 0, 0,110, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,174, 0, 0, 0,110, 0, 0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 42, 0, 0, 1, 41,
- 0, 0, 1,174, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,109, 0, 0, 1,174, 0, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 41, 0, 0, 1, 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0, 53, 0, 0, 1,176,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,176, 0, 0, 0,188, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3,
- 0, 0, 0,184, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 1,176, 0, 0, 0, 55, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,177, 0, 0, 0, 55, 0, 0, 1,176, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,176, 0, 0, 1,178,
- 0, 0, 1,177, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,110, 0, 0, 1,177, 0, 0, 1,178, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,178, 0, 0, 1,176, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,185, 0, 0, 0, 17, 0, 0, 1, 42,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 42, 0, 0, 1,178, 0, 0, 0,185, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 53,
- 0, 0, 0,185, 0, 0, 1,178, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,178, 0, 0, 1, 42, 0, 0, 0,110, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,177, 0, 0, 0,110, 0, 0, 1, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 43, 0, 0, 0,189,
- 0, 0, 1,177, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 55, 0, 0, 1,177, 0, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,189, 0, 0, 1, 43, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,183, 0, 0, 0, 52, 0, 0, 1,179,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,179, 0, 0, 1, 41, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 17,
- 0, 0, 0,183, 0, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 41, 0, 0, 1,179, 0, 0, 0,109, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,180, 0, 0, 0,109, 0, 0, 1,179, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,179, 0, 0, 1,181,
- 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 1,180, 0, 0, 1,181, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,181, 0, 0, 1,179, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 0,166,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,166, 0, 0, 1,181, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 52,
- 0, 0, 0,182, 0, 0, 1,181, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,181, 0, 0, 0,166, 0, 0, 0, 44, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,180, 0, 0, 0, 44, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,167, 0, 0, 1, 40,
- 0, 0, 1,180, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,109, 0, 0, 1,180, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 40, 0, 0, 0,167, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 45, 0, 0, 0,111, 0, 0, 1,182,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,182, 0, 0, 0,195, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 20,
- 0, 0, 1, 45, 0, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,195, 0, 0, 1,182, 0, 0, 0, 58, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,183, 0, 0, 0, 58, 0, 0, 1,182, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,182, 0, 0, 1,184,
- 0, 0, 1,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 53, 0, 0, 1,183, 0, 0, 1,184, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,184, 0, 0, 1,182, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 44, 0, 0, 0, 17, 0, 0, 0,185,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,185, 0, 0, 1,184, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,111,
- 0, 0, 1, 44, 0, 0, 1,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,184, 0, 0, 0,185, 0, 0, 0, 53, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,183, 0, 0, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0,194,
- 0, 0, 1,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 58, 0, 0, 1,183, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,194, 0, 0, 0,184, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 44, 0, 0, 0,111, 0, 0, 1,185,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,185, 0, 0, 1, 46, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 17,
- 0, 0, 1, 44, 0, 0, 1, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 46, 0, 0, 1,185, 0, 0, 0,112, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,186, 0, 0, 0,112, 0, 0, 1,185, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,185, 0, 0, 1,187,
- 0, 0, 1,186, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,113, 0, 0, 1,186, 0, 0, 1,187, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,187, 0, 0, 1,185, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 45, 0, 0, 0, 20, 0, 0, 1, 49,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 49, 0, 0, 1,187, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,111,
- 0, 0, 1, 45, 0, 0, 1,187, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,187, 0, 0, 1, 49, 0, 0, 0,113, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,186, 0, 0, 0,113, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 48, 0, 0, 1, 47,
- 0, 0, 1,186, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,112, 0, 0, 1,186, 0, 0, 1, 47, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,192, 0, 0, 0, 57, 0, 0, 1,188,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,188, 0, 0, 0,196, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4,
- 0, 0, 0,192, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,196, 0, 0, 1,188, 0, 0, 0, 59, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,189, 0, 0, 0, 59, 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,188, 0, 0, 1,190,
- 0, 0, 1,189, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,113, 0, 0, 1,189, 0, 0, 1,190, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,190, 0, 0, 1,188, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,193, 0, 0, 0, 19, 0, 0, 1, 48,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 48, 0, 0, 1,190, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 57,
- 0, 0, 0,193, 0, 0, 1,190, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,190, 0, 0, 1, 48, 0, 0, 0,113, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,189, 0, 0, 0,113, 0, 0, 1, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 49, 0, 0, 0,197,
- 0, 0, 1,189, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 59, 0, 0, 1,189, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,197, 0, 0, 1, 49, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,191, 0, 0, 0, 56, 0, 0, 1,191,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,191, 0, 0, 1, 47, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 19,
- 0, 0, 0,191, 0, 0, 1, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 47, 0, 0, 1,191, 0, 0, 0,112, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,192, 0, 0, 0,112, 0, 0, 1,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,191, 0, 0, 1,193,
- 0, 0, 1,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 1,192, 0, 0, 1,193, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,193, 0, 0, 1,191, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0,182,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,182, 0, 0, 1,193, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 56,
- 0, 0, 0,190, 0, 0, 1,193, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,193, 0, 0, 0,182, 0, 0, 0, 52, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,192, 0, 0, 0, 52, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,183, 0, 0, 1, 46,
- 0, 0, 1,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,112, 0, 0, 1,192, 0, 0, 1, 46, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 46, 0, 0, 0,183, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 51, 0, 0, 0,114, 0, 0, 1,194,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,194, 0, 0, 0,199, 0, 0, 1, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 21,
- 0, 0, 1, 51, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,199, 0, 0, 1,194, 0, 0, 0, 60, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,195, 0, 0, 0, 60, 0, 0, 1,194, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,194, 0, 0, 1,196,
- 0, 0, 1,195, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 57, 0, 0, 1,195, 0, 0, 1,196, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,196, 0, 0, 1,194, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 50, 0, 0, 0, 19, 0, 0, 0,193,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,193, 0, 0, 1,196, 0, 0, 1, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,114,
- 0, 0, 1, 50, 0, 0, 1,196, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,196, 0, 0, 0,193, 0, 0, 0, 57, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,195, 0, 0, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,192, 0, 0, 0,198,
- 0, 0, 1,195, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 60, 0, 0, 1,195, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,198, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 50, 0, 0, 0,114, 0, 0, 1,197,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,197, 0, 0, 1, 53, 0, 0, 1, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 19,
- 0, 0, 1, 50, 0, 0, 1, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 53, 0, 0, 1,197, 0, 0, 0,115, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,198, 0, 0, 0,115, 0, 0, 1,197, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,197, 0, 0, 1,199,
- 0, 0, 1,198, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,116, 0, 0, 1,198, 0, 0, 1,199, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,199, 0, 0, 1,197, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 51, 0, 0, 0, 21, 0, 0, 1, 55,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 55, 0, 0, 1,199, 0, 0, 1, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,114,
- 0, 0, 1, 51, 0, 0, 1,199, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,199, 0, 0, 1, 55, 0, 0, 0,116, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,198, 0, 0, 0,116, 0, 0, 1, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 54, 0, 0, 1, 52,
- 0, 0, 1,198, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,115, 0, 0, 1,198, 0, 0, 1, 52, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,176, 0, 0, 0, 49, 0, 0, 1,200,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,200, 0, 0, 0,200, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0,176, 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,200, 0, 0, 1,200, 0, 0, 0, 61, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,201, 0, 0, 0, 61, 0, 0, 1,200, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,200, 0, 0, 1,202,
- 0, 0, 1,201, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,116, 0, 0, 1,201, 0, 0, 1,202, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,202, 0, 0, 1,200, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,177, 0, 0, 0, 15, 0, 0, 1, 54,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 54, 0, 0, 1,202, 0, 0, 0,177, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 49,
- 0, 0, 0,177, 0, 0, 1,202, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,202, 0, 0, 1, 54, 0, 0, 0,116, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,201, 0, 0, 0,116, 0, 0, 1, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 55, 0, 0, 0,201,
- 0, 0, 1,201, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 61, 0, 0, 1,201, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,201, 0, 0, 1, 55, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,175, 0, 0, 0, 48, 0, 0, 1,203,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,203, 0, 0, 1, 52, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 15,
- 0, 0, 0,175, 0, 0, 1, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 52, 0, 0, 1,203, 0, 0, 0,115, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,204, 0, 0, 0,115, 0, 0, 1,203, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,203, 0, 0, 1,205,
- 0, 0, 1,204, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, 1,204, 0, 0, 1,205, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,205, 0, 0, 1,203, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 0,190,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,190, 0, 0, 1,205, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 48,
- 0, 0, 0,174, 0, 0, 1,205, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,205, 0, 0, 0,190, 0, 0, 0, 56, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,204, 0, 0, 0, 56, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,191, 0, 0, 1, 53,
- 0, 0, 1,204, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,115, 0, 0, 1,204, 0, 0, 1, 53, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 53, 0, 0, 0,191, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,206, 0, 0, 0,117, 0, 0, 1, 57,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 57, 0, 0, 0,207, 0, 0, 1,206, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 64,
- 0, 0, 1,206, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,207, 0, 0, 1, 57, 0, 0, 0, 23, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,206, 0, 0, 0, 64, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,207, 0, 0, 1,208,
- 0, 0, 1,206, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,117, 0, 0, 1,206, 0, 0, 1,208, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,208, 0, 0, 1,207, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,179, 0, 0, 0, 16, 0, 0, 1, 56,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 56, 0, 0, 1,208, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 50,
- 0, 0, 0,179, 0, 0, 1,208, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,208, 0, 0, 1, 56, 0, 0, 0,117, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,178, 0, 0, 0, 50, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,207, 0, 0, 0,206,
- 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,178, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,206, 0, 0, 1,207, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,209, 0, 0, 0,117, 0, 0, 1, 56,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 56, 0, 0, 1, 58, 0, 0, 1,209, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,118,
- 0, 0, 1,209, 0, 0, 1, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 58, 0, 0, 1, 56, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,209, 0, 0, 0,118, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,210, 0, 0, 1,211,
- 0, 0, 1,209, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,117, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,211, 0, 0, 1,210, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 61, 0, 0, 0, 23, 0, 0, 1, 57,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 57, 0, 0, 1,211, 0, 0, 1, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,119,
- 0, 0, 1, 61, 0, 0, 1,211, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,211, 0, 0, 1, 57, 0, 0, 0,117, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 60, 0, 0, 0,119, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,210, 0, 0, 1, 59,
- 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 22, 0, 0, 1, 60, 0, 0, 1, 59, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 59, 0, 0, 1,210, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,212, 0, 0, 0, 63, 0, 0, 0,204,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,204, 0, 0, 0,208, 0, 0, 1,212, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 65,
- 0, 0, 1,212, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,208, 0, 0, 0,204, 0, 0, 0, 10, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,212, 0, 0, 0, 65, 0, 0, 1,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,213, 0, 0, 1,214,
- 0, 0, 1,212, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 63, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,214, 0, 0, 1,213, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 60, 0, 0, 0, 22, 0, 0, 0,205,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,205, 0, 0, 1,214, 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,119,
- 0, 0, 1, 60, 0, 0, 1,214, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,214, 0, 0, 0,205, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 61, 0, 0, 0,119, 0, 0, 1,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,213, 0, 0, 0,209,
- 0, 0, 1, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 23, 0, 0, 1, 61, 0, 0, 0,209, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,209, 0, 0, 1,213, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,215, 0, 0, 0, 62, 0, 0, 0,203,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,203, 0, 0, 1, 59, 0, 0, 1,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,118,
- 0, 0, 1,215, 0, 0, 1, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 59, 0, 0, 0,203, 0, 0, 0, 22, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,215, 0, 0, 0,118, 0, 0, 1,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,216, 0, 0, 1,217,
- 0, 0, 1,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 62, 0, 0, 1,215, 0, 0, 1,217, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,217, 0, 0, 1,216, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,180, 0, 0, 0, 5, 0, 0, 0,202,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,202, 0, 0, 1,217, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 51,
- 0, 0, 0,180, 0, 0, 1,217, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,217, 0, 0, 0,202, 0, 0, 0, 62, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,181, 0, 0, 0, 51, 0, 0, 1,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,216, 0, 0, 1, 58,
- 0, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 16, 0, 0, 0,181, 0, 0, 1, 58, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 58, 0, 0, 1,216, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,218, 0, 0, 0,120, 0, 0, 1, 63,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 63, 0, 0, 0,215, 0, 0, 1,218, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 68,
- 0, 0, 1,218, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,215, 0, 0, 1, 63, 0, 0, 0, 25, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,218, 0, 0, 0, 68, 0, 0, 1,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,219, 0, 0, 1,220,
- 0, 0, 1,218, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,120, 0, 0, 1,218, 0, 0, 1,220, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,220, 0, 0, 1,219, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,173, 0, 0, 0, 14, 0, 0, 1, 62,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 62, 0, 0, 1,220, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 47,
- 0, 0, 0,173, 0, 0, 1,220, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,220, 0, 0, 1, 62, 0, 0, 0,120, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,172, 0, 0, 0, 47, 0, 0, 1,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,219, 0, 0, 0,214,
- 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0,172, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,214, 0, 0, 1,219, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,221, 0, 0, 0,120, 0, 0, 1, 62,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 1,221, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,121,
- 0, 0, 1,221, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 64, 0, 0, 1, 62, 0, 0, 0, 14, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,221, 0, 0, 0,121, 0, 0, 1,222, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,222, 0, 0, 1,223,
- 0, 0, 1,221, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,120, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,223, 0, 0, 1,222, 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 67, 0, 0, 0, 25, 0, 0, 1, 63,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 63, 0, 0, 1,223, 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,122,
- 0, 0, 1, 67, 0, 0, 1,223, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,223, 0, 0, 1, 63, 0, 0, 0,120, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 66, 0, 0, 0,122, 0, 0, 1,222, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,222, 0, 0, 1, 65,
- 0, 0, 1, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 1, 66, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 65, 0, 0, 1,222, 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,224, 0, 0, 0, 67, 0, 0, 0,212,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,212, 0, 0, 0,216, 0, 0, 1,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 69,
- 0, 0, 1,224, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,216, 0, 0, 0,212, 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,224, 0, 0, 0, 69, 0, 0, 1,225, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,225, 0, 0, 1,226,
- 0, 0, 1,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 67, 0, 0, 1,224, 0, 0, 1,226, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,226, 0, 0, 1,225, 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 66, 0, 0, 0, 24, 0, 0, 0,213,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,213, 0, 0, 1,226, 0, 0, 1, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,122,
- 0, 0, 1, 66, 0, 0, 1,226, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,226, 0, 0, 0,213, 0, 0, 0, 67, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 67, 0, 0, 0,122, 0, 0, 1,225, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,225, 0, 0, 0,217,
- 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 25, 0, 0, 1, 67, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,217, 0, 0, 1,225, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,227, 0, 0, 0, 66, 0, 0, 0,211,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,211, 0, 0, 1, 65, 0, 0, 1,227, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,121,
- 0, 0, 1,227, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 65, 0, 0, 0,211, 0, 0, 0, 24, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,227, 0, 0, 0,121, 0, 0, 1,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,228, 0, 0, 1,229,
- 0, 0, 1,227, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 66, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,229, 0, 0, 1,228, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,210,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,210, 0, 0, 1,229, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 46,
- 0, 0, 0,170, 0, 0, 1,229, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,229, 0, 0, 0,210, 0, 0, 0, 66, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,171, 0, 0, 0, 46, 0, 0, 1,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,228, 0, 0, 1, 64,
- 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0,171, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 64, 0, 0, 1,228, 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,230, 0, 0, 0,123, 0, 0, 1, 69,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 69, 0, 0, 0,223, 0, 0, 1,230, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 72,
- 0, 0, 1,230, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,223, 0, 0, 1, 69, 0, 0, 0, 27, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,230, 0, 0, 0, 72, 0, 0, 1,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,231, 0, 0, 1,232,
- 0, 0, 1,230, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,123, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,232, 0, 0, 1,231, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,189, 0, 0, 0, 18, 0, 0, 1, 68,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 68, 0, 0, 1,232, 0, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 55,
- 0, 0, 0,189, 0, 0, 1,232, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,232, 0, 0, 1, 68, 0, 0, 0,123, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 0, 55, 0, 0, 1,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,231, 0, 0, 0,222,
- 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,222, 0, 0, 1,231, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,233, 0, 0, 0,123, 0, 0, 1, 68,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 68, 0, 0, 1, 70, 0, 0, 1,233, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,124,
- 0, 0, 1,233, 0, 0, 1, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 70, 0, 0, 1, 68, 0, 0, 0, 18, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,233, 0, 0, 0,124, 0, 0, 1,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,234, 0, 0, 1,235,
- 0, 0, 1,233, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,123, 0, 0, 1,233, 0, 0, 1,235, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,235, 0, 0, 1,234, 0, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 73, 0, 0, 0, 27, 0, 0, 1, 69,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 69, 0, 0, 1,235, 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,125,
- 0, 0, 1, 73, 0, 0, 1,235, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,235, 0, 0, 1, 69, 0, 0, 0,123, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 72, 0, 0, 0,125, 0, 0, 1,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,234, 0, 0, 1, 71,
- 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 26, 0, 0, 1, 72, 0, 0, 1, 71, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 71, 0, 0, 1,234, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,236, 0, 0, 0, 71, 0, 0, 0,220,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,220, 0, 0, 0,224, 0, 0, 1,236, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 73,
- 0, 0, 1,236, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,224, 0, 0, 0,220, 0, 0, 0, 7, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,236, 0, 0, 0, 73, 0, 0, 1,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,237, 0, 0, 1,238,
- 0, 0, 1,236, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 71, 0, 0, 1,236, 0, 0, 1,238, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,238, 0, 0, 1,237, 0, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 72, 0, 0, 0, 26, 0, 0, 0,221,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,221, 0, 0, 1,238, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,125,
- 0, 0, 1, 72, 0, 0, 1,238, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,238, 0, 0, 0,221, 0, 0, 0, 71, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 73, 0, 0, 0,125, 0, 0, 1,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,237, 0, 0, 0,225,
- 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 27, 0, 0, 1, 73, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,225, 0, 0, 1,237, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,239, 0, 0, 0, 70, 0, 0, 0,219,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,219, 0, 0, 1, 71, 0, 0, 1,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,124,
- 0, 0, 1,239, 0, 0, 1, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 71, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,239, 0, 0, 0,124, 0, 0, 1,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,240, 0, 0, 1,241,
- 0, 0, 1,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 70, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,241, 0, 0, 1,240, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,186, 0, 0, 0, 2, 0, 0, 0,218,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,218, 0, 0, 1,241, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 54,
- 0, 0, 0,186, 0, 0, 1,241, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,241, 0, 0, 0,218, 0, 0, 0, 70, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,187, 0, 0, 0, 54, 0, 0, 1,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,240, 0, 0, 1, 70,
- 0, 0, 0,187, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 18, 0, 0, 0,187, 0, 0, 1, 70, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 70, 0, 0, 1,240, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,242, 0, 0, 0,126, 0, 0, 1, 75,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 75, 0, 0, 0,231, 0, 0, 1,242, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 76,
- 0, 0, 1,242, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,231, 0, 0, 1, 75, 0, 0, 0, 29, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,242, 0, 0, 0, 76, 0, 0, 1,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,243, 0, 0, 1,244,
- 0, 0, 1,242, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,126, 0, 0, 1,242, 0, 0, 1,244, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,244, 0, 0, 1,243, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,197, 0, 0, 0, 20, 0, 0, 1, 74,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 74, 0, 0, 1,244, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 59,
- 0, 0, 0,197, 0, 0, 1,244, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,244, 0, 0, 1, 74, 0, 0, 0,126, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,196, 0, 0, 0, 59, 0, 0, 1,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,243, 0, 0, 0,230,
- 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0,196, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,230, 0, 0, 1,243, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,245, 0, 0, 0,126, 0, 0, 1, 74,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 74, 0, 0, 1, 76, 0, 0, 1,245, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,127,
- 0, 0, 1,245, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 76, 0, 0, 1, 74, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,245, 0, 0, 0,127, 0, 0, 1,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,246, 0, 0, 1,247,
- 0, 0, 1,245, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,126, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,247, 0, 0, 1,246, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 79, 0, 0, 0, 29, 0, 0, 1, 75,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 75, 0, 0, 1,247, 0, 0, 1, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,128,
- 0, 0, 1, 79, 0, 0, 1,247, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,247, 0, 0, 1, 75, 0, 0, 0,126, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 78, 0, 0, 0,128, 0, 0, 1,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,246, 0, 0, 1, 77,
- 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 28, 0, 0, 1, 78, 0, 0, 1, 77, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 77, 0, 0, 1,246, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,248, 0, 0, 0, 75, 0, 0, 0,228,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,228, 0, 0, 0,232, 0, 0, 1,248, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 77,
- 0, 0, 1,248, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,232, 0, 0, 0,228, 0, 0, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,248, 0, 0, 0, 77, 0, 0, 1,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,249, 0, 0, 1,250,
- 0, 0, 1,248, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 75, 0, 0, 1,248, 0, 0, 1,250, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,250, 0, 0, 1,249, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 78, 0, 0, 0, 28, 0, 0, 0,229,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,229, 0, 0, 1,250, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,128,
- 0, 0, 1, 78, 0, 0, 1,250, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,250, 0, 0, 0,229, 0, 0, 0, 75, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 79, 0, 0, 0,128, 0, 0, 1,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,249, 0, 0, 0,233,
- 0, 0, 1, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 29, 0, 0, 1, 79, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,233, 0, 0, 1,249, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,251, 0, 0, 0, 74, 0, 0, 0,227,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,227, 0, 0, 1, 77, 0, 0, 1,251, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,127,
- 0, 0, 1,251, 0, 0, 1, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 77, 0, 0, 0,227, 0, 0, 0, 28, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,251, 0, 0, 0,127, 0, 0, 1,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,252, 0, 0, 1,253,
- 0, 0, 1,251, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 74, 0, 0, 1,251, 0, 0, 1,253, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,253, 0, 0, 1,252, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,194, 0, 0, 0, 3, 0, 0, 0,226,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 1,253, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 58,
- 0, 0, 0,194, 0, 0, 1,253, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,253, 0, 0, 0,226, 0, 0, 0, 74, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,195, 0, 0, 0, 58, 0, 0, 1,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,252, 0, 0, 1, 76,
- 0, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0,195, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 76, 0, 0, 1,252, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,254, 0, 0, 0,129, 0, 0, 1, 81,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 81, 0, 0, 0,239, 0, 0, 1,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 80,
- 0, 0, 1,254, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,239, 0, 0, 1, 81, 0, 0, 0, 31, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,254, 0, 0, 0, 80, 0, 0, 1,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,255, 0, 0, 2, 0,
- 0, 0, 1,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,129, 0, 0, 1,254, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 0, 0, 0, 1,255, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,201, 0, 0, 0, 21, 0, 0, 1, 80,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 80, 0, 0, 2, 0, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 61,
- 0, 0, 0,201, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 1, 80, 0, 0, 0,129, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,200, 0, 0, 0, 61, 0, 0, 1,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,255, 0, 0, 0,238,
- 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,200, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,238, 0, 0, 1,255, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 1, 0, 0, 0,129, 0, 0, 1, 80,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 80, 0, 0, 1, 82, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,130,
- 0, 0, 2, 1, 0, 0, 1, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 82, 0, 0, 1, 80, 0, 0, 0, 21, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 1, 0, 0, 0,130, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 0, 0, 2, 3,
- 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,129, 0, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 3, 0, 0, 2, 2, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 85, 0, 0, 0, 31, 0, 0, 1, 81,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 81, 0, 0, 2, 3, 0, 0, 1, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,131,
- 0, 0, 1, 85, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 3, 0, 0, 1, 81, 0, 0, 0,129, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 84, 0, 0, 0,131, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 0, 0, 1, 83,
- 0, 0, 1, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 1, 84, 0, 0, 1, 83, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 83, 0, 0, 2, 2, 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 4, 0, 0, 0, 79, 0, 0, 0,236,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,236, 0, 0, 0,240, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 81,
- 0, 0, 2, 4, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,240, 0, 0, 0,236, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 4, 0, 0, 0, 81, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 5, 0, 0, 2, 6,
- 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 79, 0, 0, 2, 4, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 6, 0, 0, 2, 5, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 84, 0, 0, 0, 30, 0, 0, 0,237,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,237, 0, 0, 2, 6, 0, 0, 1, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,131,
- 0, 0, 1, 84, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 6, 0, 0, 0,237, 0, 0, 0, 79, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 85, 0, 0, 0,131, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 5, 0, 0, 0,241,
- 0, 0, 1, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 31, 0, 0, 1, 85, 0, 0, 0,241, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,241, 0, 0, 2, 5, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 7, 0, 0, 0, 78, 0, 0, 0,235,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,235, 0, 0, 1, 83, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,130,
- 0, 0, 2, 7, 0, 0, 1, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 83, 0, 0, 0,235, 0, 0, 0, 30, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 7, 0, 0, 0,130, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 8, 0, 0, 2, 9,
- 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 78, 0, 0, 2, 7, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 9, 0, 0, 2, 8, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,198, 0, 0, 0, 4, 0, 0, 0,234,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,234, 0, 0, 2, 9, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 60,
- 0, 0, 0,198, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 9, 0, 0, 0,234, 0, 0, 0, 78, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,199, 0, 0, 0, 60, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 8, 0, 0, 1, 82,
- 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 21, 0, 0, 0,199, 0, 0, 1, 82, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 82, 0, 0, 2, 8, 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 87, 0, 0, 0,132, 0, 0, 2, 10,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 10, 0, 0, 0,245, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 32,
- 0, 0, 1, 87, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,245, 0, 0, 2, 10, 0, 0, 0, 83, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 11, 0, 0, 0, 83, 0, 0, 2, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 10, 0, 0, 2, 12,
- 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 65, 0, 0, 2, 11, 0, 0, 2, 12, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 12, 0, 0, 2, 10, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 86, 0, 0, 0, 23, 0, 0, 0,209,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,209, 0, 0, 2, 12, 0, 0, 1, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,132,
- 0, 0, 1, 86, 0, 0, 2, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 12, 0, 0, 0,209, 0, 0, 0, 65, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 11, 0, 0, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,208, 0, 0, 0,244,
- 0, 0, 2, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 83, 0, 0, 2, 11, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,244, 0, 0, 0,208, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 86, 0, 0, 0,132, 0, 0, 2, 13,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 13, 0, 0, 1, 88, 0, 0, 1, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 23,
- 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 88, 0, 0, 2, 13, 0, 0, 0,133, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 14, 0, 0, 0,133, 0, 0, 2, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 13, 0, 0, 2, 15,
- 0, 0, 2, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,134, 0, 0, 2, 14, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 15, 0, 0, 2, 13, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 87, 0, 0, 0, 32, 0, 0, 1, 91,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 91, 0, 0, 2, 15, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,132,
- 0, 0, 1, 87, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 15, 0, 0, 1, 91, 0, 0, 0,134, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 14, 0, 0, 0,134, 0, 0, 1, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 90, 0, 0, 1, 89,
- 0, 0, 2, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,133, 0, 0, 2, 14, 0, 0, 1, 89, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 89, 0, 0, 1, 90, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,212, 0, 0, 0, 67, 0, 0, 2, 16,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 16, 0, 0, 0,242, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6,
- 0, 0, 0,212, 0, 0, 0,242, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,242, 0, 0, 2, 16, 0, 0, 0, 82, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 17, 0, 0, 0, 82, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 16, 0, 0, 2, 18,
- 0, 0, 2, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,134, 0, 0, 2, 17, 0, 0, 2, 18, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 18, 0, 0, 2, 16, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,213, 0, 0, 0, 24, 0, 0, 1, 90,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 90, 0, 0, 2, 18, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 67,
- 0, 0, 0,213, 0, 0, 2, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 18, 0, 0, 1, 90, 0, 0, 0,134, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 17, 0, 0, 0,134, 0, 0, 1, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 91, 0, 0, 0,243,
- 0, 0, 2, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 82, 0, 0, 2, 17, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,243, 0, 0, 1, 91, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,211, 0, 0, 0, 66, 0, 0, 2, 19,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 19, 0, 0, 1, 89, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 24,
- 0, 0, 0,211, 0, 0, 1, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 89, 0, 0, 2, 19, 0, 0, 0,133, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 20, 0, 0, 0,133, 0, 0, 2, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 19, 0, 0, 2, 21,
- 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 64, 0, 0, 2, 20, 0, 0, 2, 21, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 21, 0, 0, 2, 19, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0,206,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,206, 0, 0, 2, 21, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 66,
- 0, 0, 0,210, 0, 0, 2, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 21, 0, 0, 0,206, 0, 0, 0, 64, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 20, 0, 0, 0, 64, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,207, 0, 0, 1, 88,
- 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,133, 0, 0, 2, 20, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 88, 0, 0, 0,207, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 93, 0, 0, 0,135, 0, 0, 2, 22,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 22, 0, 0, 0,247, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 33,
- 0, 0, 1, 93, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,247, 0, 0, 2, 22, 0, 0, 0, 84, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 23, 0, 0, 0, 84, 0, 0, 2, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 22, 0, 0, 2, 24,
- 0, 0, 2, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 69, 0, 0, 2, 23, 0, 0, 2, 24, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 24, 0, 0, 2, 22, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 92, 0, 0, 0, 25, 0, 0, 0,217,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,217, 0, 0, 2, 24, 0, 0, 1, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,135,
- 0, 0, 1, 92, 0, 0, 2, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 24, 0, 0, 0,217, 0, 0, 0, 69, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 23, 0, 0, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,216, 0, 0, 0,246,
- 0, 0, 2, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 84, 0, 0, 2, 23, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,246, 0, 0, 0,216, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 92, 0, 0, 0,135, 0, 0, 2, 25,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 25, 0, 0, 1, 94, 0, 0, 1, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 25,
- 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 94, 0, 0, 2, 25, 0, 0, 0,136, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 26, 0, 0, 0,136, 0, 0, 2, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 25, 0, 0, 2, 27,
- 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,137, 0, 0, 2, 26, 0, 0, 2, 27, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 27, 0, 0, 2, 25, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 93, 0, 0, 0, 33, 0, 0, 1, 97,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 97, 0, 0, 2, 27, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,135,
- 0, 0, 1, 93, 0, 0, 2, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 27, 0, 0, 1, 97, 0, 0, 0,137, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 26, 0, 0, 0,137, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 96, 0, 0, 1, 95,
- 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,136, 0, 0, 2, 26, 0, 0, 1, 95, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 95, 0, 0, 1, 96, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,220, 0, 0, 0, 71, 0, 0, 2, 28,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 28, 0, 0, 0,248, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7,
- 0, 0, 0,220, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,248, 0, 0, 2, 28, 0, 0, 0, 85, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 29, 0, 0, 0, 85, 0, 0, 2, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 28, 0, 0, 2, 30,
- 0, 0, 2, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,137, 0, 0, 2, 29, 0, 0, 2, 30, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 30, 0, 0, 2, 28, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,221, 0, 0, 0, 26, 0, 0, 1, 96,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 96, 0, 0, 2, 30, 0, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 71,
- 0, 0, 0,221, 0, 0, 2, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 30, 0, 0, 1, 96, 0, 0, 0,137, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 29, 0, 0, 0,137, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 97, 0, 0, 0,249,
- 0, 0, 2, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 85, 0, 0, 2, 29, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,249, 0, 0, 1, 97, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,219, 0, 0, 0, 70, 0, 0, 2, 31,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 31, 0, 0, 1, 95, 0, 0, 0,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 26,
- 0, 0, 0,219, 0, 0, 1, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 95, 0, 0, 2, 31, 0, 0, 0,136, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 32, 0, 0, 0,136, 0, 0, 2, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 31, 0, 0, 2, 33,
- 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 68, 0, 0, 2, 32, 0, 0, 2, 33, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 33, 0, 0, 2, 31, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,218, 0, 0, 0, 2, 0, 0, 0,214,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,214, 0, 0, 2, 33, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 70,
- 0, 0, 0,218, 0, 0, 2, 33, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 33, 0, 0, 0,214, 0, 0, 0, 68, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 32, 0, 0, 0, 68, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,215, 0, 0, 1, 94,
- 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,136, 0, 0, 2, 32, 0, 0, 1, 94, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 94, 0, 0, 0,215, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 99, 0, 0, 0,138, 0, 0, 2, 34,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 34, 0, 0, 0,251, 0, 0, 1, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 34,
- 0, 0, 1, 99, 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,251, 0, 0, 2, 34, 0, 0, 0, 86, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 35, 0, 0, 0, 86, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 34, 0, 0, 2, 36,
- 0, 0, 2, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 73, 0, 0, 2, 35, 0, 0, 2, 36, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 36, 0, 0, 2, 34, 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 98, 0, 0, 0, 27, 0, 0, 0,225,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,225, 0, 0, 2, 36, 0, 0, 1, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,138,
- 0, 0, 1, 98, 0, 0, 2, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 36, 0, 0, 0,225, 0, 0, 0, 73, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 35, 0, 0, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,224, 0, 0, 0,250,
- 0, 0, 2, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 86, 0, 0, 2, 35, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,250, 0, 0, 0,224, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 98, 0, 0, 0,138, 0, 0, 2, 37,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 37, 0, 0, 1,100, 0, 0, 1, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 27,
- 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,100, 0, 0, 2, 37, 0, 0, 0,139, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 38, 0, 0, 0,139, 0, 0, 2, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 37, 0, 0, 2, 39,
- 0, 0, 2, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,140, 0, 0, 2, 38, 0, 0, 2, 39, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 39, 0, 0, 2, 37, 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 99, 0, 0, 0, 34, 0, 0, 1,103,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,103, 0, 0, 2, 39, 0, 0, 1, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,138,
- 0, 0, 1, 99, 0, 0, 2, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 39, 0, 0, 1,103, 0, 0, 0,140, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 38, 0, 0, 0,140, 0, 0, 1,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,102, 0, 0, 1,101,
- 0, 0, 2, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,139, 0, 0, 2, 38, 0, 0, 1,101, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,101, 0, 0, 1,102, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,228, 0, 0, 0, 75, 0, 0, 2, 40,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 40, 0, 0, 0,252, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 8,
- 0, 0, 0,228, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,252, 0, 0, 2, 40, 0, 0, 0, 87, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 41, 0, 0, 0, 87, 0, 0, 2, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 40, 0, 0, 2, 42,
- 0, 0, 2, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,140, 0, 0, 2, 41, 0, 0, 2, 42, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 42, 0, 0, 2, 40, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,229, 0, 0, 0, 28, 0, 0, 1,102,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,102, 0, 0, 2, 42, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 75,
- 0, 0, 0,229, 0, 0, 2, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 42, 0, 0, 1,102, 0, 0, 0,140, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 41, 0, 0, 0,140, 0, 0, 1,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,103, 0, 0, 0,253,
- 0, 0, 2, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 87, 0, 0, 2, 41, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,253, 0, 0, 1,103, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,227, 0, 0, 0, 74, 0, 0, 2, 43,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 43, 0, 0, 1,101, 0, 0, 0,227, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 28,
- 0, 0, 0,227, 0, 0, 1,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,101, 0, 0, 2, 43, 0, 0, 0,139, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 44, 0, 0, 0,139, 0, 0, 2, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 43, 0, 0, 2, 45,
- 0, 0, 2, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 72, 0, 0, 2, 44, 0, 0, 2, 45, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 45, 0, 0, 2, 43, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 0, 3, 0, 0, 0,222,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,222, 0, 0, 2, 45, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 74,
- 0, 0, 0,226, 0, 0, 2, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 45, 0, 0, 0,222, 0, 0, 0, 72, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 44, 0, 0, 0, 72, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,223, 0, 0, 1,100,
- 0, 0, 2, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,139, 0, 0, 2, 44, 0, 0, 1,100, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,100, 0, 0, 0,223, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,105, 0, 0, 0,141, 0, 0, 2, 46,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 46, 0, 0, 0,255, 0, 0, 1,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35,
- 0, 0, 1,105, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255, 0, 0, 2, 46, 0, 0, 0, 88, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 47, 0, 0, 0, 88, 0, 0, 2, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 46, 0, 0, 2, 48,
- 0, 0, 2, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 77, 0, 0, 2, 47, 0, 0, 2, 48, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 48, 0, 0, 2, 46, 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,104, 0, 0, 0, 29, 0, 0, 0,233,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,233, 0, 0, 2, 48, 0, 0, 1,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,141,
- 0, 0, 1,104, 0, 0, 2, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 48, 0, 0, 0,233, 0, 0, 0, 77, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 47, 0, 0, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,232, 0, 0, 0,254,
- 0, 0, 2, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 88, 0, 0, 2, 47, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,254, 0, 0, 0,232, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,104, 0, 0, 0,141, 0, 0, 2, 49,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 49, 0, 0, 1,106, 0, 0, 1,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 29,
- 0, 0, 1,104, 0, 0, 1,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,106, 0, 0, 2, 49, 0, 0, 0,142, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 50, 0, 0, 0,142, 0, 0, 2, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 49, 0, 0, 2, 51,
- 0, 0, 2, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,143, 0, 0, 2, 50, 0, 0, 2, 51, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 51, 0, 0, 2, 49, 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 1,109,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,109, 0, 0, 2, 51, 0, 0, 1,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,141,
- 0, 0, 1,105, 0, 0, 2, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 51, 0, 0, 1,109, 0, 0, 0,143, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 50, 0, 0, 0,143, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,108, 0, 0, 1,107,
- 0, 0, 2, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,142, 0, 0, 2, 50, 0, 0, 1,107, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,107, 0, 0, 1,108, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,236, 0, 0, 0, 79, 0, 0, 2, 52,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 52, 0, 0, 1, 0, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 9,
- 0, 0, 0,236, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 2, 52, 0, 0, 0, 89, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 53, 0, 0, 0, 89, 0, 0, 2, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 52, 0, 0, 2, 54,
- 0, 0, 2, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,143, 0, 0, 2, 53, 0, 0, 2, 54, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 54, 0, 0, 2, 52, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,237, 0, 0, 0, 30, 0, 0, 1,108,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,108, 0, 0, 2, 54, 0, 0, 0,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 79,
- 0, 0, 0,237, 0, 0, 2, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 54, 0, 0, 1,108, 0, 0, 0,143, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 53, 0, 0, 0,143, 0, 0, 1,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,109, 0, 0, 1, 1,
- 0, 0, 2, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 2, 53, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 1, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,235, 0, 0, 0, 78, 0, 0, 2, 55,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 55, 0, 0, 1,107, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 30,
- 0, 0, 0,235, 0, 0, 1,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,107, 0, 0, 2, 55, 0, 0, 0,142, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 56, 0, 0, 0,142, 0, 0, 2, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 55, 0, 0, 2, 57,
- 0, 0, 2, 56, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 76, 0, 0, 2, 56, 0, 0, 2, 57, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 57, 0, 0, 2, 55, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,234, 0, 0, 0, 4, 0, 0, 0,230,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,230, 0, 0, 2, 57, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 78,
- 0, 0, 0,234, 0, 0, 2, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 57, 0, 0, 0,230, 0, 0, 0, 76, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 56, 0, 0, 0, 76, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,231, 0, 0, 1,106,
- 0, 0, 2, 56, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,142, 0, 0, 2, 56, 0, 0, 1,106, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,106, 0, 0, 0,231, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,111, 0, 0, 0,144, 0, 0, 2, 58,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 58, 0, 0, 1, 3, 0, 0, 1,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 36,
- 0, 0, 1,111, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 3, 0, 0, 2, 58, 0, 0, 0, 90, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 59, 0, 0, 0, 90, 0, 0, 2, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 58, 0, 0, 2, 60,
- 0, 0, 2, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 81, 0, 0, 2, 59, 0, 0, 2, 60, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 60, 0, 0, 2, 58, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,110, 0, 0, 0, 31, 0, 0, 0,241,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,241, 0, 0, 2, 60, 0, 0, 1,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,144,
- 0, 0, 1,110, 0, 0, 2, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 60, 0, 0, 0,241, 0, 0, 0, 81, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 59, 0, 0, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,240, 0, 0, 1, 2,
- 0, 0, 2, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 90, 0, 0, 2, 59, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 2, 0, 0, 0,240, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,110, 0, 0, 0,144, 0, 0, 2, 61,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 61, 0, 0, 1,113, 0, 0, 1,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 31,
- 0, 0, 1,110, 0, 0, 1,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,113, 0, 0, 2, 61, 0, 0, 0,145, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 62, 0, 0, 0,145, 0, 0, 2, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 61, 0, 0, 2, 63,
- 0, 0, 2, 62, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,146, 0, 0, 2, 62, 0, 0, 2, 63, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 63, 0, 0, 2, 61, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,111, 0, 0, 0, 36, 0, 0, 1,115,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,115, 0, 0, 2, 63, 0, 0, 1,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,144,
- 0, 0, 1,111, 0, 0, 2, 63, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 63, 0, 0, 1,115, 0, 0, 0,146, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 62, 0, 0, 0,146, 0, 0, 1,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,114, 0, 0, 1,112,
- 0, 0, 2, 62, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,145, 0, 0, 2, 62, 0, 0, 1,112, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,112, 0, 0, 1,114, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,204, 0, 0, 0, 63, 0, 0, 2, 64,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 64, 0, 0, 1, 4, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 10,
- 0, 0, 0,204, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 4, 0, 0, 2, 64, 0, 0, 0, 91, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 65, 0, 0, 0, 91, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 64, 0, 0, 2, 66,
- 0, 0, 2, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,146, 0, 0, 2, 65, 0, 0, 2, 66, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 66, 0, 0, 2, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,205, 0, 0, 0, 22, 0, 0, 1,114,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,114, 0, 0, 2, 66, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 63,
- 0, 0, 0,205, 0, 0, 2, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 66, 0, 0, 1,114, 0, 0, 0,146, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 65, 0, 0, 0,146, 0, 0, 1,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,115, 0, 0, 1, 5,
- 0, 0, 2, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 91, 0, 0, 2, 65, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 5, 0, 0, 1,115, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,203, 0, 0, 0, 62, 0, 0, 2, 67,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 67, 0, 0, 1,112, 0, 0, 0,203, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 22,
- 0, 0, 0,203, 0, 0, 1,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,112, 0, 0, 2, 67, 0, 0, 0,145, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 68, 0, 0, 0,145, 0, 0, 2, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 67, 0, 0, 2, 69,
- 0, 0, 2, 68, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 80, 0, 0, 2, 68, 0, 0, 2, 69, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 69, 0, 0, 2, 67, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,202, 0, 0, 0, 5, 0, 0, 0,238,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,238, 0, 0, 2, 69, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 62,
- 0, 0, 0,202, 0, 0, 2, 69, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 69, 0, 0, 0,238, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 68, 0, 0, 0, 80, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,239, 0, 0, 1,113,
- 0, 0, 2, 68, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,145, 0, 0, 2, 68, 0, 0, 1,113, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,113, 0, 0, 0,239, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 70, 0, 0, 0,147, 0, 0, 1,117,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,117, 0, 0, 1, 11, 0, 0, 2, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 94,
- 0, 0, 2, 70, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 11, 0, 0, 1,117, 0, 0, 0, 38, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 70, 0, 0, 0, 94, 0, 0, 2, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 71, 0, 0, 2, 72,
- 0, 0, 2, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,147, 0, 0, 2, 70, 0, 0, 2, 72, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 72, 0, 0, 2, 71, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,243, 0, 0, 0, 32, 0, 0, 1,116,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,116, 0, 0, 2, 72, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 82,
- 0, 0, 0,243, 0, 0, 2, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 72, 0, 0, 1,116, 0, 0, 0,147, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,242, 0, 0, 0, 82, 0, 0, 2, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 71, 0, 0, 1, 10,
- 0, 0, 0,242, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0,242, 0, 0, 1, 10, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 10, 0, 0, 2, 71, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 73, 0, 0, 0,147, 0, 0, 1,116,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,116, 0, 0, 1,118, 0, 0, 2, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,148,
- 0, 0, 2, 73, 0, 0, 1,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,118, 0, 0, 1,116, 0, 0, 0, 32, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 73, 0, 0, 0,148, 0, 0, 2, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 74, 0, 0, 2, 75,
- 0, 0, 2, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,147, 0, 0, 2, 73, 0, 0, 2, 75, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 75, 0, 0, 2, 74, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,121, 0, 0, 0, 38, 0, 0, 1,117,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,117, 0, 0, 2, 75, 0, 0, 1,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,149,
- 0, 0, 1,121, 0, 0, 2, 75, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 75, 0, 0, 1,117, 0, 0, 0,147, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,120, 0, 0, 0,149, 0, 0, 2, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 74, 0, 0, 1,119,
- 0, 0, 1,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 37, 0, 0, 1,120, 0, 0, 1,119, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,119, 0, 0, 2, 74, 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 76, 0, 0, 0, 93, 0, 0, 1, 8,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 8, 0, 0, 1, 12, 0, 0, 2, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 95,
- 0, 0, 2, 76, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 12, 0, 0, 1, 8, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 76, 0, 0, 0, 95, 0, 0, 2, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 77, 0, 0, 2, 78,
- 0, 0, 2, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 93, 0, 0, 2, 76, 0, 0, 2, 78, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 78, 0, 0, 2, 77, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,120, 0, 0, 0, 37, 0, 0, 1, 9,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 9, 0, 0, 2, 78, 0, 0, 1,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,149,
- 0, 0, 1,120, 0, 0, 2, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 78, 0, 0, 1, 9, 0, 0, 0, 93, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,121, 0, 0, 0,149, 0, 0, 2, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 77, 0, 0, 1, 13,
- 0, 0, 1,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 38, 0, 0, 1,121, 0, 0, 1, 13, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 13, 0, 0, 2, 77, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 79, 0, 0, 0, 92, 0, 0, 1, 7,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 7, 0, 0, 1,119, 0, 0, 2, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,148,
- 0, 0, 2, 79, 0, 0, 1,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,119, 0, 0, 1, 7, 0, 0, 0, 37, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 79, 0, 0, 0,148, 0, 0, 2, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 80, 0, 0, 2, 81,
- 0, 0, 2, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 92, 0, 0, 2, 79, 0, 0, 2, 81, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 81, 0, 0, 2, 80, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,244, 0, 0, 0, 10, 0, 0, 1, 6,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 6, 0, 0, 2, 81, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 83,
- 0, 0, 0,244, 0, 0, 2, 81, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 81, 0, 0, 1, 6, 0, 0, 0, 92, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,245, 0, 0, 0, 83, 0, 0, 2, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 80, 0, 0, 1,118,
- 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0,245, 0, 0, 1,118, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,118, 0, 0, 2, 80, 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 82, 0, 0, 0,150, 0, 0, 1,123,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,123, 0, 0, 1, 15, 0, 0, 2, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 96,
- 0, 0, 2, 82, 0, 0, 1, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 15, 0, 0, 1,123, 0, 0, 0, 39, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 82, 0, 0, 0, 96, 0, 0, 2, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 83, 0, 0, 2, 84,
- 0, 0, 2, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,150, 0, 0, 2, 82, 0, 0, 2, 84, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 84, 0, 0, 2, 83, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,249, 0, 0, 0, 33, 0, 0, 1,122,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,122, 0, 0, 2, 84, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 85,
- 0, 0, 0,249, 0, 0, 2, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 84, 0, 0, 1,122, 0, 0, 0,150, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,248, 0, 0, 0, 85, 0, 0, 2, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 83, 0, 0, 1, 14,
- 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0,248, 0, 0, 1, 14, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 14, 0, 0, 2, 83, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 85, 0, 0, 0,150, 0, 0, 1,122,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,122, 0, 0, 1,124, 0, 0, 2, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,151,
- 0, 0, 2, 85, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,124, 0, 0, 1,122, 0, 0, 0, 33, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 85, 0, 0, 0,151, 0, 0, 2, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 86, 0, 0, 2, 87,
- 0, 0, 2, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,150, 0, 0, 2, 85, 0, 0, 2, 87, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 87, 0, 0, 2, 86, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,127, 0, 0, 0, 39, 0, 0, 1,123,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,123, 0, 0, 2, 87, 0, 0, 1,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,152,
- 0, 0, 1,127, 0, 0, 2, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 87, 0, 0, 1,123, 0, 0, 0,150, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,126, 0, 0, 0,152, 0, 0, 2, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 86, 0, 0, 1,125,
- 0, 0, 1,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 38, 0, 0, 1,126, 0, 0, 1,125, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,125, 0, 0, 2, 86, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 88, 0, 0, 0, 95, 0, 0, 1, 12,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 12, 0, 0, 1, 16, 0, 0, 2, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 97,
- 0, 0, 2, 88, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 16, 0, 0, 1, 12, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 88, 0, 0, 0, 97, 0, 0, 2, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 89, 0, 0, 2, 90,
- 0, 0, 2, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 2, 88, 0, 0, 2, 90, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 90, 0, 0, 2, 89, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,126, 0, 0, 0, 38, 0, 0, 1, 13,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 13, 0, 0, 2, 90, 0, 0, 1,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,152,
- 0, 0, 1,126, 0, 0, 2, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 90, 0, 0, 1, 13, 0, 0, 0, 95, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,127, 0, 0, 0,152, 0, 0, 2, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 89, 0, 0, 1, 17,
- 0, 0, 1,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 39, 0, 0, 1,127, 0, 0, 1, 17, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 17, 0, 0, 2, 89, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 91, 0, 0, 0, 94, 0, 0, 1, 11,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 11, 0, 0, 1,125, 0, 0, 2, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,151,
- 0, 0, 2, 91, 0, 0, 1,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,125, 0, 0, 1, 11, 0, 0, 0, 38, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 91, 0, 0, 0,151, 0, 0, 2, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 92, 0, 0, 2, 93,
- 0, 0, 2, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 94, 0, 0, 2, 91, 0, 0, 2, 93, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 93, 0, 0, 2, 92, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,246, 0, 0, 0, 6, 0, 0, 1, 10,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 10, 0, 0, 2, 93, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 84,
- 0, 0, 0,246, 0, 0, 2, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 93, 0, 0, 1, 10, 0, 0, 0, 94, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,247, 0, 0, 0, 84, 0, 0, 2, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 92, 0, 0, 1,124,
- 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 33, 0, 0, 0,247, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,124, 0, 0, 2, 92, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 94, 0, 0, 0,153, 0, 0, 1,129,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,129, 0, 0, 1, 19, 0, 0, 2, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 98,
- 0, 0, 2, 94, 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 19, 0, 0, 1,129, 0, 0, 0, 40, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 94, 0, 0, 0, 98, 0, 0, 2, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 95, 0, 0, 2, 96,
- 0, 0, 2, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,153, 0, 0, 2, 94, 0, 0, 2, 96, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 96, 0, 0, 2, 95, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 1,128,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,128, 0, 0, 2, 96, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 87,
- 0, 0, 0,253, 0, 0, 2, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 96, 0, 0, 1,128, 0, 0, 0,153, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,252, 0, 0, 0, 87, 0, 0, 2, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 95, 0, 0, 1, 18,
- 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0,252, 0, 0, 1, 18, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 18, 0, 0, 2, 95, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 97, 0, 0, 0,153, 0, 0, 1,128,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,128, 0, 0, 1,130, 0, 0, 2, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,154,
- 0, 0, 2, 97, 0, 0, 1,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,130, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2, 97, 0, 0, 0,154, 0, 0, 2, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 98, 0, 0, 2, 99,
- 0, 0, 2, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,153, 0, 0, 2, 97, 0, 0, 2, 99, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 99, 0, 0, 2, 98, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,133, 0, 0, 0, 40, 0, 0, 1,129,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,129, 0, 0, 2, 99, 0, 0, 1,133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,155,
- 0, 0, 1,133, 0, 0, 2, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 99, 0, 0, 1,129, 0, 0, 0,153, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,132, 0, 0, 0,155, 0, 0, 2, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 98, 0, 0, 1,131,
- 0, 0, 1,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 39, 0, 0, 1,132, 0, 0, 1,131, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,131, 0, 0, 2, 98, 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,100, 0, 0, 0, 97, 0, 0, 1, 16,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 16, 0, 0, 1, 20, 0, 0, 2,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 99,
- 0, 0, 2,100, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 20, 0, 0, 1, 16, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,100, 0, 0, 0, 99, 0, 0, 2,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,101, 0, 0, 2,102,
- 0, 0, 2,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 97, 0, 0, 2,100, 0, 0, 2,102, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,102, 0, 0, 2,101, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,132, 0, 0, 0, 39, 0, 0, 1, 17,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 17, 0, 0, 2,102, 0, 0, 1,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,155,
- 0, 0, 1,132, 0, 0, 2,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,102, 0, 0, 1, 17, 0, 0, 0, 97, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,133, 0, 0, 0,155, 0, 0, 2,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,101, 0, 0, 1, 21,
- 0, 0, 1,133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 40, 0, 0, 1,133, 0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 21, 0, 0, 2,101, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,103, 0, 0, 0, 96, 0, 0, 1, 15,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 15, 0, 0, 1,131, 0, 0, 2,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,154,
- 0, 0, 2,103, 0, 0, 1,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,131, 0, 0, 1, 15, 0, 0, 0, 39, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,103, 0, 0, 0,154, 0, 0, 2,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,104, 0, 0, 2,105,
- 0, 0, 2,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 96, 0, 0, 2,103, 0, 0, 2,105, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,105, 0, 0, 2,104, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,250, 0, 0, 0, 7, 0, 0, 1, 14,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 14, 0, 0, 2,105, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 86,
- 0, 0, 0,250, 0, 0, 2,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,105, 0, 0, 1, 14, 0, 0, 0, 96, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,251, 0, 0, 0, 86, 0, 0, 2,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,104, 0, 0, 1,130,
- 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0,251, 0, 0, 1,130, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,130, 0, 0, 2,104, 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,106, 0, 0, 0,156, 0, 0, 1,135,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,135, 0, 0, 1, 23, 0, 0, 2,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,100,
- 0, 0, 2,106, 0, 0, 1, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 23, 0, 0, 1,135, 0, 0, 0, 41, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,106, 0, 0, 0,100, 0, 0, 2,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,107, 0, 0, 2,108,
- 0, 0, 2,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,156, 0, 0, 2,106, 0, 0, 2,108, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,108, 0, 0, 2,107, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 1, 0, 0, 0, 35, 0, 0, 1,134,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,134, 0, 0, 2,108, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 89,
- 0, 0, 1, 1, 0, 0, 2,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,108, 0, 0, 1,134, 0, 0, 0,156, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 89, 0, 0, 2,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,107, 0, 0, 1, 22,
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 1, 22, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 22, 0, 0, 2,107, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,109, 0, 0, 0,156, 0, 0, 1,134,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,134, 0, 0, 1,136, 0, 0, 2,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,157,
- 0, 0, 2,109, 0, 0, 1,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,136, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,109, 0, 0, 0,157, 0, 0, 2,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,110, 0, 0, 2,111,
- 0, 0, 2,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,156, 0, 0, 2,109, 0, 0, 2,111, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,111, 0, 0, 2,110, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,139, 0, 0, 0, 41, 0, 0, 1,135,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,135, 0, 0, 2,111, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,158,
- 0, 0, 1,139, 0, 0, 2,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,111, 0, 0, 1,135, 0, 0, 0,156, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,138, 0, 0, 0,158, 0, 0, 2,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,110, 0, 0, 1,137,
- 0, 0, 1,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 40, 0, 0, 1,138, 0, 0, 1,137, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,137, 0, 0, 2,110, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,112, 0, 0, 0, 99, 0, 0, 1, 20,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 20, 0, 0, 1, 24, 0, 0, 2,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,101,
- 0, 0, 2,112, 0, 0, 1, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 24, 0, 0, 1, 20, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,112, 0, 0, 0,101, 0, 0, 2,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,113, 0, 0, 2,114,
- 0, 0, 2,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 99, 0, 0, 2,112, 0, 0, 2,114, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,114, 0, 0, 2,113, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,138, 0, 0, 0, 40, 0, 0, 1, 21,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 21, 0, 0, 2,114, 0, 0, 1,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,158,
- 0, 0, 1,138, 0, 0, 2,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,114, 0, 0, 1, 21, 0, 0, 0, 99, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,139, 0, 0, 0,158, 0, 0, 2,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,113, 0, 0, 1, 25,
- 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 41, 0, 0, 1,139, 0, 0, 1, 25, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 25, 0, 0, 2,113, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,115, 0, 0, 0, 98, 0, 0, 1, 19,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 19, 0, 0, 1,137, 0, 0, 2,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,157,
- 0, 0, 2,115, 0, 0, 1,137, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,137, 0, 0, 1, 19, 0, 0, 0, 40, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,115, 0, 0, 0,157, 0, 0, 2,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,116, 0, 0, 2,117,
- 0, 0, 2,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 98, 0, 0, 2,115, 0, 0, 2,117, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,117, 0, 0, 2,116, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,254, 0, 0, 0, 8, 0, 0, 1, 18,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 18, 0, 0, 2,117, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 88,
- 0, 0, 0,254, 0, 0, 2,117, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,117, 0, 0, 1, 18, 0, 0, 0, 98, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,255, 0, 0, 0, 88, 0, 0, 2,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,116, 0, 0, 1,136,
- 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,136, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,136, 0, 0, 2,116, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,118, 0, 0, 0,159, 0, 0, 1,141,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,141, 0, 0, 1, 7, 0, 0, 2,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 92,
- 0, 0, 2,118, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 7, 0, 0, 1,141, 0, 0, 0, 37, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,118, 0, 0, 0, 92, 0, 0, 2,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,119, 0, 0, 2,120,
- 0, 0, 2,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,159, 0, 0, 2,118, 0, 0, 2,120, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,120, 0, 0, 2,119, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 5, 0, 0, 0, 36, 0, 0, 1,140,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,140, 0, 0, 2,120, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 91,
- 0, 0, 1, 5, 0, 0, 2,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,120, 0, 0, 1,140, 0, 0, 0,159, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 4, 0, 0, 0, 91, 0, 0, 2,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,119, 0, 0, 1, 6,
- 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 1, 4, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 6, 0, 0, 2,119, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,121, 0, 0, 0,159, 0, 0, 1,140,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,140, 0, 0, 1,142, 0, 0, 2,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,160,
- 0, 0, 2,121, 0, 0, 1,142, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,142, 0, 0, 1,140, 0, 0, 0, 36, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,121, 0, 0, 0,160, 0, 0, 2,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,122, 0, 0, 2,123,
- 0, 0, 2,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,159, 0, 0, 2,121, 0, 0, 2,123, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,123, 0, 0, 2,122, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,144, 0, 0, 0, 37, 0, 0, 1,141,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,141, 0, 0, 2,123, 0, 0, 1,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,161,
- 0, 0, 1,144, 0, 0, 2,123, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,123, 0, 0, 1,141, 0, 0, 0,159, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,145, 0, 0, 0,161, 0, 0, 2,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,122, 0, 0, 1,143,
- 0, 0, 1,145, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 41, 0, 0, 1,145, 0, 0, 1,143, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,143, 0, 0, 2,122, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,124, 0, 0, 0,101, 0, 0, 1, 24,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 24, 0, 0, 1, 8, 0, 0, 2,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 93,
- 0, 0, 2,124, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 8, 0, 0, 1, 24, 0, 0, 0, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,124, 0, 0, 0, 93, 0, 0, 2,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,125, 0, 0, 2,126,
- 0, 0, 2,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,101, 0, 0, 2,124, 0, 0, 2,126, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,126, 0, 0, 2,125, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,145, 0, 0, 0, 41, 0, 0, 1, 25,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 25, 0, 0, 2,126, 0, 0, 1,145, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,161,
- 0, 0, 1,145, 0, 0, 2,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,126, 0, 0, 1, 25, 0, 0, 0,101, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1,144, 0, 0, 0,161, 0, 0, 2,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,125, 0, 0, 1, 9,
- 0, 0, 1,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 37, 0, 0, 1,144, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 9, 0, 0, 2,125, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,127, 0, 0, 0,100, 0, 0, 1, 23,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 23, 0, 0, 1,143, 0, 0, 2,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,160,
- 0, 0, 2,127, 0, 0, 1,143, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,143, 0, 0, 1, 23, 0, 0, 0, 41, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 2,127, 0, 0, 0,160, 0, 0, 2,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,128, 0, 0, 2,129,
- 0, 0, 2,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,100, 0, 0, 2,127, 0, 0, 2,129, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2,129, 0, 0, 2,128, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 9, 0, 0, 1, 22,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 22, 0, 0, 2,129, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 90,
- 0, 0, 1, 2, 0, 0, 2,129, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,129, 0, 0, 1, 22, 0, 0, 0,100, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 1, 3, 0, 0, 0, 90, 0, 0, 2,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,128, 0, 0, 1,142,
- 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 1, 3, 0, 0, 1,142, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,142, 0, 0, 2,128, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 3, 68, 65, 84, 65, 0, 0,220, 0, 7,249, 0, 32,
- 0, 0, 0, 65, 0, 0, 5, 0, 63,110,222,166, 63, 55,205, 9, 63,105,132,212, 63, 65,236,201, 63,103,153,218, 63, 54,155,119,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,103,153,218, 63, 54,155,119, 63,108,148,118,
- 63, 44,160,211, 63,110,222,166, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 36, 63, 45, 28, 36, 63,110,222,166, 63, 55,205, 9, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,148,118, 63, 44,160,211, 63,103,153,218, 63, 54,155,119, 63,102, 17, 87,
- 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 81, 56, 63, 52, 55,170,
- 63,102, 17, 87, 63, 43, 52,229, 63,103,153,218, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,103,153,218, 63, 54,155,119, 63, 97, 75, 9, 63, 63,233, 92, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 60, 86, 49, 63, 96, 81, 56, 63, 52, 55,170,
- 63, 97, 75, 9, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 97, 75, 9,
- 63, 63,233, 92, 63,103,153,218, 63, 54,155,119, 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 98,167,103, 63, 75, 39,168, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,139, 63, 71,153,255,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 71,153,255, 63, 97, 75, 9,
- 63, 63,233, 92, 63, 98,167,103, 63, 75, 39,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,105,132,212, 63, 65,236,201, 63, 98,167,103, 63, 75, 39,168, 63, 97, 75, 9, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 97, 75, 9, 63, 63,233, 92, 63, 89,153,139, 63, 71,153,255, 63, 89,153,138,
- 63, 60, 86, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 81, 56, 63, 52, 55,170,
- 63, 89,153,138, 63, 60, 86, 49, 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 89,153,139, 63, 49, 12, 79, 63, 95,182,205, 63, 40,228,222, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 17, 87, 63, 43, 52,229, 63, 96, 81, 56, 63, 52, 55,170,
- 63, 95,182,205, 63, 40,228,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,182,205,
- 63, 40,228,222, 63, 89,153,139, 63, 49, 12, 79, 63, 89,153,139, 63, 37,200, 45, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 98,167,103, 63, 75, 39,168, 63,105,132,212, 63, 65,236,201, 63,109, 83,168, 63, 78, 83,207,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 83,168, 63, 78, 83,207, 63,101, 85,135,
- 63, 88, 64,148, 63, 98,167,103, 63, 75, 39,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,138, 63, 82,228, 39, 63, 98,167,103, 63, 75, 39,168, 63,101, 85,135, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 85,135, 63, 88, 64,148, 63,109, 83,168, 63, 78, 83,207, 63,115, 51, 36,
- 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 18,162, 63, 78, 83,207,
- 63,115, 51, 36, 63, 90, 56, 22, 63,109, 83,168, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,109, 83,168, 63, 78, 83,207, 63,115, 51, 36, 63, 67, 23,115, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,121, 18,162, 63, 78, 83,207,
- 63,115, 51, 36, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36,
- 63, 67, 23,115, 63,109, 83,168, 63, 78, 83,207, 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 45, 28, 36, 63,119,135,163, 63, 55,205, 11,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,119,135,163, 63, 55,205, 11, 63,115, 51, 36,
- 63, 67, 23,115, 63,110,222,166, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,105,132,212, 63, 65,236,201, 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 67, 23,115, 63,119,135,163, 63, 55,205, 11, 63,124,225,116,
- 63, 65,236,202, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 18,162, 63, 78, 83,207,
- 63,124,225,116, 63, 65,236,202, 63,129,223,113, 63, 75, 39,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,129,223,113, 63, 75, 39,170, 63,128,136, 98, 63, 88, 64,148, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,121, 18,162, 63, 78, 83,207,
- 63,128,136, 98, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 59,136, 98, 95,
- 63, 88, 64,148, 60,111,184,160, 63, 75, 39,170, 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,243, 63, 49, 12, 82, 61, 76,203,246, 63, 60, 86, 53, 60,194,162, 31, 63, 52, 55,172,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,194,162, 31, 63, 52, 55,172, 60,213,239,111,
- 63, 40,228,223, 61, 76,203,243, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,246, 63, 37,200, 48, 61, 76,203,243, 63, 49, 12, 82, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,213,239,111, 63, 40,228,223, 60,194,162, 31, 63, 52, 55,172, 58,169,226,120,
- 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,204,111, 63, 54,155,121,
- 63,128, 42,121, 63, 43, 52,230, 63,131, 10,136, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,131, 10,136, 63, 52, 55,172, 63,130,141,160, 63, 63,233, 95, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,126,204,111, 63, 54,155,121,
- 63,130,141,160, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,163,104, 11,
- 63, 63,233, 95, 60,194,162, 31, 63, 52, 55,172, 61, 76,203,246, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,244, 63, 71,154, 2, 61, 76,203,243, 63, 82,228, 41, 60,111,184,160, 63, 75, 39,170,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,111,184,160, 63, 75, 39,170, 60,163,104, 11,
- 63, 63,233, 95, 61, 76,203,244, 63, 71,154, 2, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,246, 63, 60, 86, 53, 61, 76,203,244, 63, 71,154, 2, 60,163,104, 11, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,130,141,160, 63, 63,233, 95, 63,129,223,113, 63, 75, 39,170, 63,124,225,116,
- 63, 65,236,202, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,204,111, 63, 54,155,121,
- 63,124,225,116, 63, 65,236,202, 63,119,135,163, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,119,135,163, 63, 55,205, 11, 63,121,209,210, 63, 44,160,212, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 42,121, 63, 43, 52,230, 63,126,204,111, 63, 54,155,121,
- 63,121,209,210, 63, 44,160,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,209,210,
- 63, 44,160,212, 63,119,135,163, 63, 55,205, 11, 63,115, 51, 36, 63, 45, 28, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,134,102, 95, 63, 94, 46, 79, 63,134,102, 95, 63,105,114, 22, 63,124,205, 52, 63, 99, 26, 58,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,205, 52, 63, 99, 26, 58, 63,128,136, 98,
- 63, 88, 64,148, 63,134,102, 95, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,243, 63, 82,228, 41, 61, 76,203,234, 63, 94, 46, 79, 59,136, 98, 95, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,128,136, 98, 63, 88, 64,148, 63,124,205, 52, 63, 99, 26, 58, 63,115, 51, 36,
- 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,153, 21, 63, 99, 26, 58,
- 63,115, 51, 36, 63, 90, 56, 22, 63,124,205, 52, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,124,205, 52, 63, 99, 26, 58, 63,115, 51, 32, 63,109,154,212, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63,105,114, 19, 63,105,153, 21, 63, 99, 26, 58,
- 63,115, 51, 32, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 32,
- 63,109,154,212, 63,124,205, 52, 63, 99, 26, 58, 63,134,102, 95, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,134,102, 95, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 89,153,136, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,136, 63,116,187,242, 63,115, 51, 32,
- 63,109,154,212, 63,134,102, 95, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,134,102, 95, 63,105,114, 22, 63,134,102, 95, 63,116,187,242, 63,115, 51, 32, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 32, 63,109,154,212, 63, 89,153,136, 63,116,187,242, 63, 89,153,138,
- 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,153, 21, 63, 99, 26, 58,
- 63, 89,153,138, 63,105,114, 19, 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 89,153,138, 63, 94, 46, 77, 63,101, 85,135, 63, 88, 64,148, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,105,153, 21, 63, 99, 26, 58,
- 63,101, 85,135, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 85,135,
- 63, 88, 64,148, 63, 89,153,138, 63, 94, 46, 77, 63, 89,153,138, 63, 82,228, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,153, 67, 63, 54,155,113, 63, 73,174, 74, 63, 65,236,193, 63, 68, 84,124, 63, 55,204,255,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 70,158,169,
- 63, 44,160,200, 63, 75,153, 67, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 77, 33,196, 63, 43, 52,221, 63, 75,153, 67, 63, 54,155,113, 63, 70,158,169, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,158,169, 63, 44,160,200, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0,
- 63, 45, 28, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,153, 67, 63, 54,155,113,
- 63, 77, 33,196, 63, 43, 52,221, 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 82,225,225, 63, 52, 55,165, 63, 81,232, 16, 63, 63,233, 89, 63, 75,153, 67, 63, 54,155,113, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 75,153, 67, 63, 54,155,113,
- 63, 81,232, 16, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 81,232, 16,
- 63, 63,233, 89, 63, 82,225,225, 63, 52, 55,165, 63, 89,153,138, 63, 60, 86, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 71,153,255, 63, 89,153,138, 63, 82,228, 39, 63, 80,139,179, 63, 75, 39,164,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 81,232, 16,
- 63, 63,233, 89, 63, 89,153,139, 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,138, 63, 60, 86, 49, 63, 89,153,139, 63, 71,153,255, 63, 81,232, 16, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 81,232, 16, 63, 63,233, 89, 63, 80,139,179, 63, 75, 39,164, 63, 73,174, 74,
- 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 49, 12, 79,
- 63, 89,153,138, 63, 60, 86, 49, 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 82,225,225, 63, 52, 55,165, 63, 83,124, 75, 63, 40,228,217, 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 89,153,139, 63, 49, 12, 79,
- 63, 83,124, 75, 63, 40,228,217, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,124, 75,
- 63, 40,228,217, 63, 82,225,225, 63, 52, 55,165, 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 69,223,120, 63, 78, 83,198, 63, 73,174, 74, 63, 65,236,193, 63, 80,139,179, 63, 75, 39,164,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 77,221,148,
- 63, 88, 64,140, 63, 69,223,120, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 90, 56, 12, 63, 69,223,120, 63, 78, 83,198, 63, 77,221,148, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 77,221,148, 63, 88, 64,140, 63, 80,139,179, 63, 75, 39,164, 63, 89,153,138,
- 63, 82,228, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 69,223,120, 63, 78, 83,198,
- 63, 64, 0, 0, 63, 90, 56, 12, 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 58, 32,136, 63, 78, 83,198, 63, 64, 0, 0, 63, 67, 23,106, 63, 69,223,120, 63, 78, 83,198, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 69,223,120, 63, 78, 83,198,
- 63, 64, 0, 0, 63, 67, 23,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0,
- 63, 67, 23,106, 63, 58, 32,136, 63, 78, 83,198, 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 45, 28, 24, 63, 68, 84,124, 63, 55,204,255,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0,
- 63, 67, 23,106, 63, 59,171,132, 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 54, 81,182, 63, 65,236,193, 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 67, 23,106, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 67, 23,106, 63, 68, 84,124, 63, 55,204,255, 63, 73,174, 74,
- 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,116, 77, 63, 75, 39,164,
- 63, 54, 81,182, 63, 65,236,193, 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 58, 32,136, 63, 78, 83,198, 63, 50, 34,108, 63, 88, 64,140, 63, 47,116, 77, 63, 75, 39,164, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 82,228, 38, 63, 47,116, 77, 63, 75, 39,164,
- 63, 50, 34,108, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 50, 34,108,
- 63, 88, 64,140, 63, 58, 32,136, 63, 78, 83,198, 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 30, 31, 63, 52, 55,165, 63, 38,102,117, 63, 60, 86, 50, 63, 38,102,117, 63, 49, 12, 78,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 49, 12, 78, 63, 44,131,181,
- 63, 40,228,216, 63, 45, 30, 31, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 50,222, 60, 63, 43, 52,221, 63, 45, 30, 31, 63, 52, 55,165, 63, 44,131,181, 63, 40,228,216, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117,
- 63, 37,200, 45, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 30, 31, 63, 52, 55,165,
- 63, 50,222, 60, 63, 43, 52,221, 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 52,102,189, 63, 54,155,113, 63, 46, 23,240, 63, 63,233, 89, 63, 45, 30, 31, 63, 52, 55,165, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 60, 86, 50, 63, 45, 30, 31, 63, 52, 55,165,
- 63, 46, 23,240, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 46, 23,240,
- 63, 63,233, 89, 63, 52,102,189, 63, 54,155,113, 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,116, 77, 63, 75, 39,164, 63, 38,102,118, 63, 82,228, 38, 63, 38,102,117, 63, 71,153,255,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 71,153,255, 63, 46, 23,240,
- 63, 63,233, 89, 63, 47,116, 77, 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 54, 81,182, 63, 65,236,193, 63, 47,116, 77, 63, 75, 39,164, 63, 46, 23,240, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 46, 23,240, 63, 63,233, 89, 63, 38,102,117, 63, 71,153,255, 63, 38,102,117,
- 63, 60, 86, 50, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 59,171,132, 63, 55,204,255,
- 63, 54, 81,182, 63, 65,236,193, 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 52,102,189, 63, 54,155,113, 63, 57, 97, 87, 63, 44,160,200, 63, 59,171,132, 63, 55,204,255, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 59,171,132, 63, 55,204,255,
- 63, 57, 97, 87, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 97, 87,
- 63, 44,160,200, 63, 52,102,189, 63, 54,155,113, 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,101,250, 63, 99, 26, 51, 63, 38,102,118, 63,105,114, 19, 63, 38,102,118, 63, 94, 46, 77,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 94, 46, 77, 63, 50, 34,108,
- 63, 88, 64,140, 63, 54,101,250, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 90, 56, 12, 63, 54,101,250, 63, 99, 26, 51, 63, 50, 34,108, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 50, 34,108, 63, 88, 64,140, 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118,
- 63, 82,228, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,101,250, 63, 99, 26, 51,
- 63, 64, 0, 0, 63, 90, 56, 12, 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 73,154, 6, 63, 99, 26, 51, 63, 64, 0, 0, 63,109,154,206, 63, 54,101,250, 63, 99, 26, 51, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63,105,114, 19, 63, 54,101,250, 63, 99, 26, 51,
- 63, 64, 0, 0, 63,109,154,206, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0,
- 63,109,154,206, 63, 73,154, 6, 63, 99, 26, 51, 63, 89,153,138, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,136, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 38,102,120, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,120, 63,116,187,242, 63, 64, 0, 0,
- 63,109,154,206, 63, 89,153,136, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,138, 63,105,114, 19, 63, 89,153,136, 63,116,187,242, 63, 64, 0, 0, 63,109,154,206, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63,109,154,206, 63, 38,102,120, 63,116,187,242, 63, 38,102,118,
- 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 94, 46, 77,
- 63, 89,153,138, 63,105,114, 19, 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 73,154, 6, 63, 99, 26, 51, 63, 77,221,148, 63, 88, 64,140, 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,138, 63, 94, 46, 77,
- 63, 77,221,148, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 77,221,148,
- 63, 88, 64,140, 63, 73,154, 6, 63, 99, 26, 51, 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 8, 71,167, 63, 55,205, 7, 61,229,192,170, 63, 65,236,200, 61,214,104,203, 63, 54,155,120,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,214,104,203, 63, 54,155,120, 61,254, 61,201,
- 63, 44,160,207, 62, 8, 71,167, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,173, 63, 45, 28, 27, 62, 8, 71,167, 63, 55,205, 7, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,254, 61,201, 63, 44,160,207, 61,214,104,203, 63, 54,155,120, 61,202, 36,175,
- 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156, 35,145, 63, 52, 55,172,
- 61,202, 36,175, 63, 43, 52,228, 61,214,104,203, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,214,104,203, 63, 54,155,120, 61,163,242, 32, 63, 63,233, 96, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 60, 86, 53, 61,156, 35,145, 63, 52, 55,172,
- 61,163,242, 32, 63, 63,233, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,163,242, 32,
- 63, 63,233, 96, 61,214,104,203, 63, 54,155,120, 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,174,213, 17, 63, 75, 39,171, 61, 76,203,243, 63, 82,228, 41, 61, 76,203,244, 63, 71,154, 2,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,244, 63, 71,154, 2, 61,163,242, 32,
- 63, 63,233, 96, 61,174,213, 17, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,229,192,170, 63, 65,236,200, 61,174,213, 17, 63, 75, 39,171, 61,163,242, 32, 63, 63,233, 96, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,163,242, 32, 63, 63,233, 96, 61, 76,203,244, 63, 71,154, 2, 61, 76,203,246,
- 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156, 35,145, 63, 52, 55,172,
- 61, 76,203,246, 63, 60, 86, 53, 61, 76,203,243, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 76,203,243, 63, 49, 12, 82, 61,151, 80, 53, 63, 40,228,223, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,202, 36,175, 63, 43, 52,228, 61,156, 35,145, 63, 52, 55,172,
- 61,151, 80, 53, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,151, 80, 53,
- 63, 40,228,223, 61, 76,203,243, 63, 49, 12, 82, 61, 76,203,246, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,174,213, 17, 63, 75, 39,171, 61,229,192,170, 63, 65,236,200, 62, 2, 27,169, 63, 78, 83,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 2, 27,169, 63, 78, 83,204, 61,196, 70, 23,
- 63, 88, 64,147, 61,174,213, 17, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,243, 63, 82,228, 41, 61,174,213, 17, 63, 75, 39,171, 61,196, 70, 23, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,196, 70, 23, 63, 88, 64,147, 62, 2, 27,169, 63, 78, 83,204, 62, 25,153,160,
- 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 49, 23,162, 63, 78, 83,195,
- 62, 25,153,160, 63, 90, 56, 14, 62, 2, 27,169, 63, 78, 83,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 2, 27,169, 63, 78, 83,204, 62, 25,153,172, 63, 67, 23,108, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 49, 23,162, 63, 78, 83,195,
- 62, 25,153,172, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,172,
- 63, 67, 23,108, 62, 2, 27,169, 63, 78, 83,204, 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,173, 63, 45, 28, 27, 62, 42,235,173, 63, 55,204,254,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 42,235,173, 63, 55,204,254, 62, 25,153,172,
- 63, 67, 23,108, 62, 8, 71,167, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,229,192,170, 63, 65,236,200, 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,172, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,172, 63, 67, 23,108, 62, 42,235,173, 63, 55,204,254, 62, 64, 82,240,
- 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 49, 23,162, 63, 78, 83,195,
- 62, 64, 82,240, 63, 65,236,183, 62, 91,200,166, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 91,200,166, 63, 75, 39,147, 62, 81, 16, 34, 63, 88, 64,131, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 62, 49, 23,162, 63, 78, 83,195,
- 62, 81, 16, 34, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 81, 16, 34,
- 63, 88, 64,131, 62, 91,200,166, 63, 75, 39,147, 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 49, 12, 47, 62,128, 0, 0, 63, 60, 86, 19, 62,101, 33, 92, 63, 52, 55,146,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101, 33, 92, 63, 52, 55,146, 62,103,139, 14,
- 63, 40,228,199, 62,128, 0, 0, 63, 49, 12, 47, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 37,200, 23, 62,128, 0, 0, 63, 49, 12, 47, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,103,139, 14, 63, 40,228,199, 62,101, 33, 92, 63, 52, 55,146, 62, 78, 32,230,
- 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 71,254,223, 63, 54,155,102,
- 62, 78, 32,230, 63, 43, 52,211, 62,101, 33, 92, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,101, 33, 92, 63, 52, 55,146, 62, 97, 58, 23, 63, 63,233, 69, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 71,254,223, 63, 54,155,102,
- 62, 97, 58, 23, 63, 63,233, 69, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 97, 58, 23,
- 63, 63,233, 69, 62,101, 33, 92, 63, 52, 55,146, 62,128, 0, 0, 63, 60, 86, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0, 63, 82,228, 13, 62, 91,200,166, 63, 75, 39,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 91,200,166, 63, 75, 39,147, 62, 97, 58, 23,
- 63, 63,233, 69, 62,128, 0, 0, 63, 71,153,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 60, 86, 19, 62,128, 0, 0, 63, 71,153,228, 62, 97, 58, 23, 63, 63,233, 69, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 97, 58, 23, 63, 63,233, 69, 62, 91,200,166, 63, 75, 39,147, 62, 64, 82,240,
- 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 71,254,223, 63, 54,155,102,
- 62, 64, 82,240, 63, 65,236,183, 62, 42,235,173, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 42,235,173, 63, 55,204,254, 62, 52, 20,105, 63, 44,160,198, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 78, 32,230, 63, 43, 52,211, 62, 71,254,223, 63, 54,155,102,
- 62, 52, 20,105, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52, 20,105,
- 63, 44,160,198, 62, 42,235,173, 63, 55,204,254, 62, 25,153,173, 63, 45, 28, 27, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 94, 46, 58, 62,128, 0, 0, 63,105,114, 8, 62, 64, 1,230, 63, 99, 26, 49,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 1,230, 63, 99, 26, 49, 62, 81, 16, 34,
- 63, 88, 64,131, 62,128, 0, 0, 63, 94, 46, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 82,228, 13, 62,128, 0, 0, 63, 94, 46, 58, 62, 81, 16, 34, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 81, 16, 34, 63, 88, 64,131, 62, 64, 1,230, 63, 99, 26, 49, 62, 25,153,160,
- 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,230, 98,164, 63, 99, 26, 58,
- 62, 25,153,160, 63, 90, 56, 14, 62, 64, 1,230, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 64, 1,230, 63, 99, 26, 49, 62, 25,153,159, 63,109,154,210, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,237, 63,105,114, 22, 61,230, 98,164, 63, 99, 26, 58,
- 62, 25,153,159, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,159,
- 63,109,154,210, 62, 64, 1,230, 63, 99, 26, 49, 62,128, 0, 0, 63,105,114, 8, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,116,187,232, 63, 59,153, 3, 63,128, 0, 0, 63,134,102, 95, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,210, 63,116,187,242, 62, 25,153,159,
- 63,109,154,210, 62,128, 0, 0, 63,116,187,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63,105,114, 8, 62,128, 0, 0, 63,116,187,232, 62, 25,153,159, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,159, 63,109,154,210, 61, 76,203,210, 63,116,187,242, 61, 76,203,237,
- 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,230, 98,164, 63, 99, 26, 58,
- 61, 76,203,237, 63,105,114, 22, 61, 76,203,234, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 76,203,234, 63, 94, 46, 79, 61,196, 70, 23, 63, 88, 64,147, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 61,230, 98,164, 63, 99, 26, 58,
- 61,196, 70, 23, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,196, 70, 23,
- 63, 88, 64,147, 61, 76,203,234, 63, 94, 46, 79, 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,170,138, 42, 63, 55,204,254, 62,159,214,136, 63, 65,236,183, 62,156, 0,145, 63, 54,155,102,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,156, 0,145, 63, 54,155,102, 62,165,245,204,
- 63, 44,160,198, 62,170,138, 42, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 42, 63, 45, 28, 28, 62,170,138, 42, 63, 55,204,254, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,245,204, 63, 44,160,198, 62,156, 0,145, 63, 54,155,102, 62,152,239,141,
- 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,111, 82, 63, 52, 55,146,
- 62,152,239,141, 63, 43, 52,211, 62,156, 0,145, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,156, 0,145, 63, 54,155,102, 62,143, 98,245, 63, 63,233, 68, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 60, 86, 19, 62,141,111, 82, 63, 52, 55,146,
- 62,143, 98,245, 63, 63,233, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,143, 98,245,
- 63, 63,233, 68, 62,156, 0,145, 63, 54,155,102, 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,146, 27,173, 63, 75, 39,147, 62,128, 0, 0, 63, 82,228, 13, 62,128, 0, 0, 63, 71,153,228,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 71,153,228, 62,143, 98,245,
- 63, 63,233, 68, 62,146, 27,173, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,159,214,136, 63, 65,236,183, 62,146, 27,173, 63, 75, 39,147, 62,143, 98,245, 63, 63,233, 68, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,143, 98,245, 63, 63,233, 68, 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0,
- 63, 60, 86, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,111, 82, 63, 52, 55,146,
- 62,128, 0, 0, 63, 60, 86, 19, 62,128, 0, 0, 63, 49, 12, 47, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 49, 12, 47, 62,140, 58,121, 63, 40,228,199, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,152,239,141, 63, 43, 52,211, 62,141,111, 82, 63, 52, 55,146,
- 62,140, 58,121, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,140, 58,121,
- 63, 40,228,199, 62,128, 0, 0, 63, 49, 12, 47, 62,128, 0, 0, 63, 37,200, 23, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,146, 27,173, 63, 75, 39,147, 62,159,214,136, 63, 65,236,183, 62,167,116, 47, 63, 78, 83,195,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,167,116, 47, 63, 78, 83,195, 62,151,119,239,
- 63, 88, 64,131, 62,146, 27,173, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 82,228, 13, 62,146, 27,173, 63, 75, 39,147, 62,151,119,239, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151,119,239, 63, 88, 64,131, 62,167,116, 47, 63, 78, 83,195, 62,179, 51, 49,
- 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,190,242, 44, 63, 78, 83,205,
- 62,179, 51, 49, 63, 90, 56, 14, 62,167,116, 47, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,167,116, 47, 63, 78, 83,195, 62,179, 51, 42, 63, 67, 23,108, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,190,242, 44, 63, 78, 83,205,
- 62,179, 51, 42, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42,
- 63, 67, 23,108, 62,167,116, 47, 63, 78, 83,195, 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 45, 28, 28, 62,187,220, 45, 63, 55,205, 7,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,187,220, 45, 63, 55,205, 7, 62,179, 51, 42,
- 63, 67, 23,108, 62,170,138, 42, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,159,214,136, 63, 65,236,183, 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42, 63, 67, 23,108, 62,187,220, 45, 63, 55,205, 7, 62,198,143,214,
- 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,190,242, 44, 63, 78, 83,205,
- 62,198,143,214, 63, 65,236,200, 62,212, 74,188, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,212, 74,188, 63, 75, 39,171, 62,206,238,122, 63, 88, 64,147, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,190,242, 44, 63, 78, 83,205,
- 62,206,238,122, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,206,238,122,
- 63, 88, 64,147, 62,212, 74,188, 63, 75, 39,171, 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 49, 12, 82, 62,230,102,129, 63, 60, 86, 53, 62,216,247, 28, 63, 52, 55,172,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,247, 28, 63, 52, 55,172, 62,218, 43,243,
- 63, 40,228,223, 62,230,102,130, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,129, 63, 37,200, 48, 62,230,102,130, 63, 49, 12, 82, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,218, 43,243, 63, 40,228,223, 62,216,247, 28, 63, 52, 55,172, 62,205,118,212,
- 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,101,206, 63, 54,155,120,
- 62,205,118,212, 63, 43, 52,228, 62,216,247, 28, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,216,247, 28, 63, 52, 55,172, 62,215, 3,120, 63, 63,233, 95, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,202,101,206, 63, 54,155,120,
- 62,215, 3,120, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,215, 3,120,
- 63, 63,233, 95, 62,216,247, 28, 63, 52, 55,172, 62,230,102,129, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 71,154, 1, 62,230,102,130, 63, 82,228, 41, 62,212, 74,188, 63, 75, 39,171,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,212, 74,188, 63, 75, 39,171, 62,215, 3,120,
- 63, 63,233, 95, 62,230,102,130, 63, 71,154, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,129, 63, 60, 86, 53, 62,230,102,130, 63, 71,154, 1, 62,215, 3,120, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,215, 3,120, 63, 63,233, 95, 62,212, 74,188, 63, 75, 39,171, 62,198,143,214,
- 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,101,206, 63, 54,155,120,
- 62,198,143,214, 63, 65,236,200, 62,187,220, 45, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,187,220, 45, 63, 55,205, 7, 62,192,112,142, 63, 44,160,207, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,205,118,212, 63, 43, 52,228, 62,202,101,206, 63, 54,155,120,
- 62,192,112,142, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,112,142,
- 63, 44,160,207, 62,187,220, 45, 63, 55,205, 7, 62,179, 51, 42, 63, 45, 28, 28, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,131, 63, 94, 46, 79, 62,230,102,131, 63,105,114, 22, 62,198,103, 87, 63, 99, 26, 58,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,103, 87, 63, 99, 26, 58, 62,206,238,122,
- 63, 88, 64,147, 62,230,102,131, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,130, 63, 82,228, 41, 62,230,102,131, 63, 94, 46, 79, 62,206,238,122, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,206,238,122, 63, 88, 64,147, 62,198,103, 87, 63, 99, 26, 58, 62,179, 51, 49,
- 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,255, 14, 63, 99, 26, 49,
- 62,179, 51, 49, 63, 90, 56, 14, 62,198,103, 87, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,198,103, 87, 63, 99, 26, 58, 62,179, 51, 49, 63,109,154,210, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,105,114, 8, 62,159,255, 14, 63, 99, 26, 49,
- 62,179, 51, 49, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49,
- 63,109,154,210, 62,198,103, 87, 63, 99, 26, 58, 62,230,102,131, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,134, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,128, 0, 0, 63,116,187,232,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,116,187,232, 62,179, 51, 49,
- 63,109,154,210, 62,230,102,134, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,131, 63,105,114, 22, 62,230,102,134, 63,116,187,242, 62,179, 51, 49, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63,109,154,210, 62,128, 0, 0, 63,116,187,232, 62,128, 0, 0,
- 63,105,114, 8, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,255, 14, 63, 99, 26, 49,
- 62,128, 0, 0, 63,105,114, 8, 62,128, 0, 0, 63, 94, 46, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 94, 46, 58, 62,151,119,239, 63, 88, 64,131, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,159,255, 14, 63, 99, 26, 49,
- 62,151,119,239, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151,119,239,
- 63, 88, 64,131, 62,128, 0, 0, 63, 94, 46, 58, 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 8,120, 93, 63, 55,205, 11, 63, 3, 30,140, 63, 65,236,201, 63, 1, 51,145, 63, 54,155,121,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 51,145, 63, 54,155,121, 63, 6, 46, 46,
- 63, 44,160,211, 63, 8,120, 93, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,220, 63, 45, 28, 35, 63, 8,120, 93, 63, 55,205, 11, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 46, 46, 63, 44,160,211, 63, 1, 51,145, 63, 54,155,121, 62,255, 86, 30,
- 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,213,222, 63, 52, 55,172,
- 62,255, 86, 30, 63, 43, 52,230, 63, 1, 51,145, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 1, 51,145, 63, 54,155,121, 62,245,201,128, 63, 63,233, 94, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 60, 86, 53, 62,243,213,222, 63, 52, 55,172,
- 62,245,201,128, 63, 63,233, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,245,201,128,
- 63, 63,233, 94, 63, 1, 51,145, 63, 54,155,121, 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,248,130, 59, 63, 75, 39,169, 62,230,102,130, 63, 82,228, 41, 62,230,102,130, 63, 71,154, 1,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 71,154, 1, 62,245,201,128,
- 63, 63,233, 94, 62,248,130, 59, 63, 75, 39,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 3, 30,140, 63, 65,236,201, 62,248,130, 59, 63, 75, 39,169, 62,245,201,128, 63, 63,233, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,245,201,128, 63, 63,233, 94, 62,230,102,130, 63, 71,154, 1, 62,230,102,129,
- 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,213,222, 63, 52, 55,172,
- 62,230,102,129, 63, 60, 86, 53, 62,230,102,130, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,230,102,130, 63, 49, 12, 82, 62,242,161, 9, 63, 40,228,223, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,255, 86, 30, 63, 43, 52,230, 62,243,213,222, 63, 52, 55,172,
- 62,242,161, 9, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,242,161, 9,
- 63, 40,228,223, 62,230,102,130, 63, 49, 12, 82, 62,230,102,129, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,248,130, 59, 63, 75, 39,169, 63, 3, 30,140, 63, 65,236,201, 63, 6,237, 94, 63, 78, 83,207,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,237, 94, 63, 78, 83,207, 62,253,222,118,
- 63, 88, 64,148, 62,248,130, 59, 63, 75, 39,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,130, 63, 82,228, 41, 62,248,130, 59, 63, 75, 39,169, 62,253,222,118, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,222,118, 63, 88, 64,148, 63, 6,237, 94, 63, 78, 83,207, 63, 12,204,220,
- 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,172, 88, 63, 78, 83,207,
- 63, 12,204,220, 63, 90, 56, 22, 63, 6,237, 94, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 6,237, 94, 63, 78, 83,207, 63, 12,204,220, 63, 67, 23,115, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 18,172, 88, 63, 78, 83,207,
- 63, 12,204,220, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220,
- 63, 67, 23,115, 63, 6,237, 94, 63, 78, 83,207, 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 45, 28, 35, 63, 17, 33, 91, 63, 55,205, 9,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 17, 33, 91, 63, 55,205, 9, 63, 12,204,220,
- 63, 67, 23,115, 63, 8,120, 93, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 3, 30,140, 63, 65,236,201, 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 67, 23,115, 63, 17, 33, 91, 63, 55,205, 9, 63, 22,123, 44,
- 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,172, 88, 63, 78, 83,207,
- 63, 22,123, 44, 63, 65,236,201, 63, 29, 88,153, 63, 75, 39,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 29, 88,153, 63, 75, 39,167, 63, 26,170,121, 63, 88, 64,147, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 18,172, 88, 63, 78, 83,207,
- 63, 26,170,121, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 26,170,121,
- 63, 88, 64,147, 63, 29, 88,153, 63, 75, 39,167, 63, 38,102,118, 63, 82,228, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117, 63, 60, 86, 50, 63, 31,174,200, 63, 52, 55,169,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,174,200, 63, 52, 55,169, 63, 32, 73, 51,
- 63, 40,228,221, 63, 38,102,117, 63, 49, 12, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,117, 63, 37,200, 45, 63, 38,102,117, 63, 49, 12, 78, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 73, 51, 63, 40,228,221, 63, 31,174,200, 63, 52, 55,169, 63, 25,238,169,
- 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,102, 39, 63, 54,155,119,
- 63, 25,238,169, 63, 43, 52,229, 63, 31,174,200, 63, 52, 55,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 31,174,200, 63, 52, 55,169, 63, 30,180,246, 63, 63,233, 92, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 24,102, 39, 63, 54,155,119,
- 63, 30,180,246, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 30,180,246,
- 63, 63,233, 92, 63, 31,174,200, 63, 52, 55,169, 63, 38,102,117, 63, 60, 86, 50, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 71,153,255, 63, 38,102,118, 63, 82,228, 38, 63, 29, 88,153, 63, 75, 39,167,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 29, 88,153, 63, 75, 39,167, 63, 30,180,246,
- 63, 63,233, 92, 63, 38,102,117, 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,117, 63, 60, 86, 50, 63, 38,102,117, 63, 71,153,255, 63, 30,180,246, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 30,180,246, 63, 63,233, 92, 63, 29, 88,153, 63, 75, 39,167, 63, 22,123, 44,
- 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,102, 39, 63, 54,155,119,
- 63, 22,123, 44, 63, 65,236,201, 63, 17, 33, 91, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 17, 33, 91, 63, 55,205, 9, 63, 19,107,138, 63, 44,160,211, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,238,169, 63, 43, 52,229, 63, 24,102, 39, 63, 54,155,119,
- 63, 19,107,138, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,107,138,
- 63, 44,160,211, 63, 17, 33, 91, 63, 55,205, 9, 63, 12,204,220, 63, 45, 28, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118, 63,105,114, 19, 63, 22,102,235, 63, 99, 26, 59,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,102,235, 63, 99, 26, 59, 63, 26,170,121,
- 63, 88, 64,147, 63, 38,102,118, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,118, 63, 82,228, 38, 63, 38,102,118, 63, 94, 46, 77, 63, 26,170,121, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 26,170,121, 63, 88, 64,147, 63, 22,102,235, 63, 99, 26, 59, 63, 12,204,220,
- 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 50,204, 63, 99, 26, 58,
- 63, 12,204,220, 63, 90, 56, 22, 63, 22,102,235, 63, 99, 26, 59, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 22,102,235, 63, 99, 26, 59, 63, 12,204,224, 63,109,154,212, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,131, 63,105,114, 22, 63, 3, 50,204, 63, 99, 26, 58,
- 63, 12,204,224, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,224,
- 63,109,154,212, 63, 22,102,235, 63, 99, 26, 59, 63, 38,102,118, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,120, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,230,102,134, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,134, 63,116,187,242, 63, 12,204,224,
- 63,109,154,212, 63, 38,102,120, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,118, 63,105,114, 19, 63, 38,102,120, 63,116,187,242, 63, 12,204,224, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,224, 63,109,154,212, 62,230,102,134, 63,116,187,242, 62,230,102,131,
- 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 50,204, 63, 99, 26, 58,
- 62,230,102,131, 63,105,114, 22, 62,230,102,131, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,230,102,131, 63, 94, 46, 79, 62,253,222,118, 63, 88, 64,148, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 3, 50,204, 63, 99, 26, 58,
- 62,253,222,118, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,222,118,
- 63, 88, 64,148, 62,230,102,131, 63, 94, 46, 79, 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,233,213, 63, 21, 48, 35, 63, 70,235,176, 63, 22,209,226, 63, 73,234, 80, 63, 11,111,146,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 79,200, 1,
- 63, 9,152, 94, 63, 76,233,213, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 82,215, 19, 63, 19, 29,252, 63, 76,233,213, 63, 21, 48, 35, 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,200, 1, 63, 9,152, 94, 63, 73,234, 80, 63, 11,111,146, 63, 76,204,193,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,233,213, 63, 21, 48, 35,
- 63, 82,215, 19, 63, 19, 29,252, 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 80, 41,220, 63, 31, 60,105, 63, 73,219,164, 63, 33, 23,173, 63, 76,233,213, 63, 21, 48, 35, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 76,233,213, 63, 21, 48, 35,
- 63, 73,219,164, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,219,164,
- 63, 33, 23,173, 63, 80, 41,220, 63, 31, 60,105, 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,158,169, 63, 44,160,200, 63, 64, 0, 0, 63, 45, 28, 24, 63, 67,171, 5, 63, 34, 17,216,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 73,219,164,
- 63, 33, 23,173, 63, 70,158,169, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 77, 33,196, 63, 43, 52,221, 63, 70,158,169, 63, 44,160,200, 63, 73,219,164, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,219,164, 63, 33, 23,173, 63, 67,171, 5, 63, 34, 17,216, 63, 70,235,176,
- 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,124, 75, 63, 40,228,217,
- 63, 77, 33,196, 63, 43, 52,221, 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 80, 41,220, 63, 31, 60,105, 63, 86, 20,218, 63, 28,140,143, 63, 83,124, 75, 63, 40,228,217, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 83,124, 75, 63, 40,228,217,
- 63, 86, 20,218, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 20,218,
- 63, 28,140,143, 63, 80, 41,220, 63, 31, 60,105, 63, 82,215, 19, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 23, 32,182, 63, 70,235,176, 63, 22,209,226, 63, 67,171, 5, 63, 34, 17,216,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 60, 84,251,
- 63, 34, 17,216, 63, 64, 0, 0, 63, 23, 32,182, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 57, 20, 80, 63, 22,209,226, 63, 64, 0, 0, 63, 23, 32,182, 63, 60, 84,251, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60, 84,251, 63, 34, 17,216, 63, 67,171, 5, 63, 34, 17,216, 63, 64, 0, 0,
- 63, 45, 28, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 23, 32,182,
- 63, 57, 20, 80, 63, 22,209,226, 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96, 63, 67, 99, 87, 63, 11,116, 96, 63, 64, 0, 0, 63, 23, 32,182, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 64, 0, 0, 63, 23, 32,182,
- 63, 67, 99, 87, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67, 99, 87,
- 63, 11,116, 96, 63, 60,156,169, 63, 11,116, 96, 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 76,204,193, 63, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 67, 99, 87,
- 63, 11,116, 96, 63, 70,102, 96, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 67, 99, 87, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67, 99, 87, 63, 11,116, 96, 63, 73,234, 80, 63, 11,111,146, 63, 70,235,176,
- 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244,
- 63, 64, 0, 0, 63, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96, 63, 54, 21,176, 63, 11,111,146, 63, 57,153,160, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 51, 63, 63, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244,
- 63, 54, 21,176, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 21,176,
- 63, 11,111,146, 63, 60,156,169, 63, 11,116, 96, 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,217, 58, 93, 63, 57, 61,144, 62,217,196, 19, 63, 60,123, 85, 62,198,230,253,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,123, 85, 62,198,230,253, 63, 67,132,171,
- 62,198,230,253, 63, 64, 0, 0, 62,217, 58, 93, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 70,194,112, 62,217,196, 19, 63, 64, 0, 0, 62,217, 58, 93, 63, 67,132,171, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,132,171, 62,198,230,253, 63, 60,123, 85, 62,198,230,253, 63, 64, 0, 0,
- 62,180,111,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,217, 58, 93,
- 63, 70,194,112, 62,217,196, 19, 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42, 63, 60,171,131, 62,236,211, 42, 63, 64, 0, 0, 62,217, 58, 93, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 61,144, 62,217,196, 19, 63, 64, 0, 0, 62,217, 58, 93,
- 63, 60,171,131, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,171,131,
- 62,236,211, 42, 63, 67, 84,125, 62,236,211, 42, 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 51, 51, 63, 63, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63, 60,171,131,
- 62,236,211, 42, 63, 57,153,160, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 60,171,131, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,171,131, 62,236,211, 42, 63, 54, 46,128, 62,236,207, 75, 63, 57, 61,144,
- 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244,
- 63, 64, 0, 0, 63, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42, 63, 73,209,128, 62,236,207, 75, 63, 70,102, 96, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,204,193, 63, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244,
- 63, 73,209,128, 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,209,128,
- 62,236,207, 75, 63, 67, 84,125, 62,236,211, 42, 63, 70,194,112, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 22, 43, 63, 21, 48, 35, 63, 45, 40,237, 63, 19, 29,252, 63, 48, 55,255, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 54, 21,176,
- 63, 11,111,146, 63, 51, 22, 43, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 57, 20, 80, 63, 22,209,226, 63, 51, 22, 43, 63, 21, 48, 35, 63, 54, 21,176, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 21,176, 63, 11,111,146, 63, 48, 55,255, 63, 9,152, 94, 63, 51, 51, 63,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 22, 43, 63, 21, 48, 35,
- 63, 57, 20, 80, 63, 22,209,226, 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 54, 36, 91, 63, 33, 23,173, 63, 47,214, 36, 63, 31, 60,105, 63, 51, 22, 43, 63, 21, 48, 35, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 40,237, 63, 19, 29,252, 63, 51, 22, 43, 63, 21, 48, 35,
- 63, 47,214, 36, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,214, 36,
- 63, 31, 60,105, 63, 54, 36, 91, 63, 33, 23,173, 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 37,200, 45, 63, 41,235, 38, 63, 28,140,141,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,235, 38, 63, 28,140,141, 63, 47,214, 36,
- 63, 31, 60,105, 63, 44,131,181, 63, 40,228,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 50,222, 60, 63, 43, 52,221, 63, 44,131,181, 63, 40,228,216, 63, 47,214, 36, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,214, 36, 63, 31, 60,105, 63, 41,235, 38, 63, 28,140,141, 63, 45, 40,237,
- 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 97, 87, 63, 44,160,200,
- 63, 50,222, 60, 63, 43, 52,221, 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 54, 36, 91, 63, 33, 23,173, 63, 60, 84,251, 63, 34, 17,216, 63, 57, 97, 87, 63, 44,160,200, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 57, 97, 87, 63, 44,160,200,
- 63, 60, 84,251, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60, 84,251,
- 63, 34, 17,216, 63, 54, 36, 91, 63, 33, 23,173, 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 14,134, 63, 21, 48, 39, 63,122, 30,227, 63, 22,209,233, 63,125, 29,138, 63, 11,111,150,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,129,125,159,
- 63, 9,152, 94, 63,128, 14,134, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 60,193, 73,174, 63, 19, 29,253, 57,232, 92,209, 63, 21, 48, 39, 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,125,159, 63, 9,152, 94, 63,125, 29,138, 63, 11,111,150, 63,128, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 57,232, 92,209, 63, 21, 48, 39,
- 60,193, 73,174, 63, 19, 29,253, 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,129,174,136, 63, 31, 60,110, 63,125, 14,213, 63, 33, 23,180, 63,128, 14,134, 63, 21, 48, 39, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,128, 14,134, 63, 21, 48, 39,
- 63,125, 14,213, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 14,213,
- 63, 33, 23,180, 63,129,174,136, 63, 31, 60,110, 63,128, 42,121, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,121,209,210, 63, 44,160,212, 63,115, 51, 36, 63, 45, 28, 36, 63,118,222, 49, 63, 34, 17,226,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,125, 14,213,
- 63, 33, 23,180, 63,121,209,210, 63, 44,160,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,128, 42,121, 63, 43, 52,230, 63,121,209,210, 63, 44,160,212, 63,125, 14,213, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 14,213, 63, 33, 23,180, 63,118,222, 49, 63, 34, 17,226, 63,122, 30,227,
- 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,213,239,111, 63, 40,228,223,
- 58,169,226,120, 63, 43, 52,230, 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 60, 87, 67,214, 63, 31, 60,110, 61, 20,129, 13, 63, 28,140,143, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 37,200, 48, 60,213,239,111, 63, 40,228,223,
- 61, 20,129, 13, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 20,129, 13,
- 63, 28,140,143, 60, 87, 67,214, 63, 31, 60,110, 60,193, 73,174, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 44, 63, 23, 32,188, 63,122, 30,227, 63, 22,209,233, 63,118,222, 49, 63, 34, 17,226,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,111,136, 31,
- 63, 34, 17,225, 63,115, 51, 44, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,108, 71,116, 63, 22,209,232, 63,115, 51, 44, 63, 23, 32,188, 63,111,136, 31, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,136, 31, 63, 34, 17,225, 63,118,222, 49, 63, 34, 17,226, 63,115, 51, 36,
- 63, 45, 28, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 44, 63, 23, 32,188,
- 63,108, 71,116, 63, 22,209,232, 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,111,207,213, 63, 11,116,100, 63,118,150,138, 63, 11,116,101, 63,115, 51, 44, 63, 23, 32,188, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,115, 51, 44, 63, 23, 32,188,
- 63,118,150,138, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,150,138,
- 63, 11,116,101, 63,111,207,213, 63, 11,116,100, 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 29,138, 63, 11,111,150,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,118,150,138,
- 63, 11,116,101, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 51, 63, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,118,150,138, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,150,138, 63, 11,116,101, 63,125, 29,138, 63, 11,111,150, 63,122, 30,227,
- 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,204,205, 63, 0, 1,244,
- 63,115, 51, 51, 63, 0, 0, 0, 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,111,207,213, 63, 11,116,100, 63,105, 72,213, 63, 11,111,149, 63,108,204,205, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,102,101, 63, 0, 0, 0, 63,108,204,205, 63, 0, 1,244,
- 63,105, 72,213, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 72,213,
- 63, 11,111,149, 63,111,207,213, 63, 11,116,100, 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 58, 62,217, 58, 73, 63,108,112,192, 62,217,196, 4, 63,111,174,139, 62,198,230,223,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,174,139, 62,198,230,223, 63,118,183,239,
- 62,198,230,227, 63,115, 51, 58, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,121,245,179, 62,217,196, 6, 63,115, 51, 58, 62,217, 58, 73, 63,118,183,239, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,183,239, 62,198,230,227, 63,111,174,139, 62,198,230,223, 63,115, 51, 65,
- 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 58, 62,217, 58, 73,
- 63,121,245,179, 62,217,196, 6, 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,118,135,185, 62,236,211, 30, 63,111,222,180, 62,236,211, 30, 63,115, 51, 58, 62,217, 58, 73, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,112,192, 62,217,196, 4, 63,115, 51, 58, 62,217, 58, 73,
- 63,111,222,180, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,222,180,
- 62,236,211, 30, 63,118,135,185, 62,236,211, 30, 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,102,102,101, 63, 0, 0, 0, 63,105, 97,170, 62,236,207, 65,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,111,222,180,
- 62,236,211, 30, 63,108,204,205, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 51, 63, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,111,222,180, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,222,180, 62,236,211, 30, 63,105, 97,170, 62,236,207, 65, 63,108,112,192,
- 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,153,154, 63, 0, 1,244,
- 63,115, 51, 51, 63, 0, 0, 0, 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,118,135,185, 62,236,211, 30, 63,125, 4,194, 62,236,207, 67, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,121,153,154, 63, 0, 1,244,
- 63,125, 4,194, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 4,194,
- 62,236,207, 67, 63,118,135,185, 62,236,211, 30, 63,121,245,179, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 73, 76, 63, 21, 48, 38, 63, 96, 92, 11, 63, 19, 29,253, 63, 99,107, 33, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63,105, 72,213,
- 63, 11,111,149, 63,102, 73, 76, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,108, 71,116, 63, 22,209,232, 63,102, 73, 76, 63, 21, 48, 38, 63,105, 72,213, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 72,213, 63, 11,111,149, 63, 99,107, 33, 63, 9,152, 94, 63,102,102,101,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 73, 76, 63, 21, 48, 38,
- 63,108, 71,116, 63, 22,209,232, 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,105, 87,124, 63, 33, 23,180, 63, 99, 9, 65, 63, 31, 60,109, 63,102, 73, 76, 63, 21, 48, 38, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 92, 11, 63, 19, 29,253, 63,102, 73, 76, 63, 21, 48, 38,
- 63, 99, 9, 65, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 9, 65,
- 63, 31, 60,109, 63,105, 87,124, 63, 33, 23,180, 63,102, 17, 87, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,182,205, 63, 40,228,222, 63, 89,153,139, 63, 37,200, 45, 63, 93, 30, 63, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 30, 63, 63, 28,140,143, 63, 99, 9, 65,
- 63, 31, 60,109, 63, 95,182,205, 63, 40,228,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,102, 17, 87, 63, 43, 52,229, 63, 95,182,205, 63, 40,228,222, 63, 99, 9, 65, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 9, 65, 63, 31, 60,109, 63, 93, 30, 63, 63, 28,140,143, 63, 96, 92, 11,
- 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,148,118, 63, 44,160,211,
- 63,102, 17, 87, 63, 43, 52,229, 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,105, 87,124, 63, 33, 23,180, 63,111,136, 31, 63, 34, 17,225, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 45, 28, 36, 63,108,148,118, 63, 44,160,211,
- 63,111,136, 31, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,136, 31,
- 63, 34, 17,225, 63,105, 87,124, 63, 33, 23,180, 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 77, 65, 65, 63, 21, 48, 32, 62, 53, 72,152, 63, 22,209,229, 62, 65, 67, 47, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 88,185,255,
- 63, 9,152, 90, 62, 77, 65, 65, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,100,246, 64, 63, 19, 29,246, 62, 77, 65, 65, 63, 21, 48, 32, 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 88,185,255, 63, 9,152, 90, 62, 65, 67, 47, 63, 11,111,147, 62, 76,204,254,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 77, 65, 65, 63, 21, 48, 32,
- 62,100,246, 64, 63, 19, 29,246, 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 90, 65, 89, 63, 31, 60, 94, 62, 65, 8,107, 63, 33, 23,170, 62, 77, 65, 65, 63, 21, 48, 32, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 77, 65, 65, 63, 21, 48, 32,
- 62, 65, 8,107, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 8,107,
- 63, 33, 23,170, 62, 90, 65, 89, 63, 31, 60, 94, 62, 78, 32,230, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 52, 20,105, 63, 44,160,198, 62, 25,153,173, 63, 45, 28, 27, 62, 40, 69,216, 63, 34, 17,220,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 65, 8,107,
- 63, 33, 23,170, 62, 52, 20,105, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 78, 32,230, 63, 43, 52,211, 62, 52, 20,105, 63, 44,160,198, 62, 65, 8,107, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 8,107, 63, 33, 23,170, 62, 40, 69,216, 63, 34, 17,220, 62, 53, 72,152,
- 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,103,139, 14, 63, 40,228,199,
- 62, 78, 32,230, 63, 43, 52,211, 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 90, 65, 89, 63, 31, 60, 94, 62,113,237, 83, 63, 28,140,130, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 37,200, 23, 62,103,139, 14, 63, 40,228,199,
- 62,113,237, 83, 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,113,237, 83,
- 63, 28,140,130, 62, 90, 65, 89, 63, 31, 60, 94, 62,100,246, 64, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,180, 63, 23, 32,185, 62, 53, 72,152, 63, 22,209,229, 62, 40, 69,216, 63, 34, 17,220,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 10,237,133,
- 63, 34, 17,219, 62, 25,153,180, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,251,213,147, 63, 22,209,228, 62, 25,153,180, 63, 23, 32,185, 62, 10,237,133, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 10,237,133, 63, 34, 17,219, 62, 40, 69,216, 63, 34, 17,220, 62, 25,153,173,
- 63, 45, 28, 27, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,180, 63, 23, 32,185,
- 61,251,213,147, 63, 22,209,228, 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98, 62, 39, 39, 34, 63, 11,116, 98, 62, 25,153,180, 63, 23, 32,185, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 25,153,180, 63, 23, 32,185,
- 62, 39, 39, 34, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 39, 39, 34,
- 63, 11,116, 98, 62, 12, 12, 67, 63, 11,116, 98, 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 76,204,254, 63, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 39, 39, 34,
- 63, 11,116, 98, 62, 51, 51, 92, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,181, 63, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 39, 39, 34, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 39, 39, 34, 63, 11,116, 98, 62, 65, 67, 47, 63, 11,111,147, 62, 53, 72,152,
- 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244,
- 62, 25,153,181, 63, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98, 61,227,224,109, 63, 11,111,147, 62, 0, 0, 8, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,204,204,215, 63, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244,
- 61,227,224,109, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,227,224,109,
- 63, 11,111,147, 62, 12, 12, 67, 63, 11,116, 98, 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,196, 62,217, 58, 73, 61,253, 31,171, 62,217,196, 6, 62, 11,135, 1, 62,198,230,228,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 11,135, 1, 62,198,230,228, 62, 39,172,153,
- 62,198,230,230, 62, 25,153,196, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 52,163,179, 62,217,196, 7, 62, 25,153,196, 62,217, 58, 73, 62, 39,172,153, 62,198,230,230, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 39,172,153, 62,198,230,230, 62, 11,135, 1, 62,198,230,228, 62, 25,153,214,
- 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,196, 62,217, 58, 73,
- 62, 52,163,179, 62,217,196, 7, 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 38,235,202, 62,236,211, 33, 62, 12, 71,173, 62,236,211, 31, 62, 25,153,196, 62,217, 58, 73, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,253, 31,171, 62,217,196, 6, 62, 25,153,196, 62,217, 58, 73,
- 62, 12, 71,173, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 12, 71,173,
- 62,236,211, 31, 62, 38,235,202, 62,236,211, 33, 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 61,204,204,215, 63, 0, 0, 0, 61,228,166,251, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 62, 12, 71,173,
- 62,236,211, 31, 62, 0, 0, 8, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,181, 63, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 62, 12, 71,173, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 12, 71,173, 62,236,211, 31, 61,228,166,251, 62,236,207, 67, 61,253, 31,171,
- 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244,
- 62, 25,153,181, 63, 0, 0, 0, 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 38,235,202, 62,236,211, 33, 62, 64,223,251, 62,236,207, 67, 62, 51, 51, 92, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 76,204,254, 63, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244,
- 62, 64,223,251, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64,223,251,
- 62,236,207, 67, 62, 38,235,202, 62,236,211, 33, 62, 52,163,179, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,203,228, 42, 63, 21, 48, 37, 61,156,122, 1, 63, 19, 29,254, 61,180,242,172, 63, 9,152, 96,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,227,224,109,
- 63, 11,111,147, 61,203,228, 42, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,251,213,147, 63, 22,209,228, 61,203,228, 42, 63, 21, 48, 37, 61,227,224,109, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,227,224,109, 63, 11,111,147, 61,180,242,172, 63, 9,152, 96, 61,204,204,215,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,203,228, 42, 63, 21, 48, 37,
- 61,251,213,147, 63, 22,209,228, 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,228, 85,208, 63, 33, 23,179, 61,177,227,212, 63, 31, 60,110, 61,203,228, 42, 63, 21, 48, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156,122, 1, 63, 19, 29,254, 61,203,228, 42, 63, 21, 48, 37,
- 61,177,227,212, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,177,227,212,
- 63, 31, 60,110, 61,228, 85,208, 63, 33, 23,179, 61,202, 36,175, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,151, 80, 53, 63, 40,228,223, 61, 76,203,246, 63, 37,200, 48, 61,130,139,166, 63, 28,140,145,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,130,139,166, 63, 28,140,145, 61,177,227,212,
- 63, 31, 60,110, 61,151, 80, 53, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,202, 36,175, 63, 43, 52,228, 61,151, 80, 53, 63, 40,228,223, 61,177,227,212, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,177,227,212, 63, 31, 60,110, 61,130,139,166, 63, 28,140,145, 61,156,122, 1,
- 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,254, 61,201, 63, 44,160,207,
- 61,202, 36,175, 63, 43, 52,228, 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,228, 85,208, 63, 33, 23,179, 62, 10,237,133, 63, 34, 17,219, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,173, 63, 45, 28, 27, 61,254, 61,201, 63, 44,160,207,
- 62, 10,237,133, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 10,237,133,
- 63, 34, 17,219, 61,228, 85,208, 63, 33, 23,179, 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,205, 6,245, 63, 21, 48, 37, 62,193, 10,155, 63, 22,209,229, 62,199, 7,229, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,210,195, 85,
- 63, 9,152, 96, 62,205, 6,245, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,216,225,128, 63, 19, 29,254, 62,205, 6,245, 63, 21, 48, 37, 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,210,195, 85, 63, 9,152, 96, 62,199, 7,229, 63, 11,111,147, 62,204,204,202,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,205, 6,245, 63, 21, 48, 37,
- 62,216,225,128, 63, 19, 29,254, 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,211,135, 11, 63, 31, 60,110, 62,198,234,140, 63, 33, 23,179, 62,205, 6,245, 63, 21, 48, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,205, 6,245, 63, 21, 48, 37,
- 62,198,234,140, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,234,140,
- 63, 33, 23,179, 62,211,135, 11, 63, 31, 60,110, 62,205,118,212, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,192,112,142, 63, 44,160,207, 62,179, 51, 42, 63, 45, 28, 28, 62,186,137, 61, 63, 34, 17,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,198,234,140,
- 63, 33, 23,179, 62,192,112,142, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,205,118,212, 63, 43, 52,228, 62,192,112,142, 63, 44,160,207, 62,198,234,140, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,234,140, 63, 33, 23,179, 62,186,137, 61, 63, 34, 17,219, 62,193, 10,155,
- 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,218, 43,243, 63, 40,228,223,
- 62,205,118,212, 63, 43, 52,228, 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,211,135, 11, 63, 31, 60,110, 62,223, 93, 22, 63, 28,140,145, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 37,200, 48, 62,218, 43,243, 63, 40,228,223,
- 62,223, 93, 22, 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 93, 22,
- 63, 28,140,145, 62,211,135, 11, 63, 31, 60,110, 62,216,225,128, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 38, 63, 23, 32,185, 62,193, 10,155, 63, 22,209,229, 62,186,137, 61, 63, 34, 17,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,171,221, 20,
- 63, 34, 17,219, 62,179, 51, 38, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,165, 91,180, 63, 22,209,229, 62,179, 51, 38, 63, 23, 32,185, 62,171,221, 20, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,171,221, 20, 63, 34, 17,219, 62,186,137, 61, 63, 34, 17,219, 62,179, 51, 42,
- 63, 45, 28, 28, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 38, 63, 23, 32,185,
- 62,165, 91,180, 63, 22,209,229, 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,172,108,111, 63, 11,116, 98, 62,185,249,222, 63, 11,116, 98, 62,179, 51, 38, 63, 23, 32,185, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,179, 51, 38, 63, 23, 32,185,
- 62,185,249,222, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,185,249,222,
- 63, 11,116, 98, 62,172,108,111, 63, 11,116, 98, 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,204,204,202, 63, 0, 0, 0, 62,199, 7,229, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,185,249,222,
- 63, 11,116, 98, 62,191,255,252, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 38, 63, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,185,249,222, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,185,249,222, 63, 11,116, 98, 62,199, 7,229, 63, 11,111,147, 62,193, 10,155,
- 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244,
- 62,179, 51, 38, 63, 0, 0, 0, 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,172,108,111, 63, 11,116, 98, 62,159, 94,104, 63, 11,111,147, 62,166,102, 82, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153,153,129, 63, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244,
- 62,159, 94,104, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159, 94,104,
- 63, 11,111,147, 62,172,108,111, 63, 11,116, 98, 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 30, 62,217, 58, 73, 62,165,174, 39, 62,217,196, 7, 62,172, 41,180, 62,198,230,227,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172, 41,180, 62,198,230,227, 62,186, 60,127,
- 62,198,230,225, 62,179, 51, 30, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,192,184, 21, 62,217,196, 6, 62,179, 51, 30, 62,217, 58, 73, 62,186, 60,127, 62,198,230,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186, 60,127, 62,198,230,225, 62,172, 41,180, 62,198,230,227, 62,179, 51, 21,
- 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 30, 62,217, 58, 73,
- 62,192,184, 21, 62,217,196, 6, 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,185,220, 42, 62,236,211, 31, 62,172,138, 27, 62,236,211, 33, 62,179, 51, 30, 62,217, 58, 73, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,174, 39, 62,217,196, 7, 62,179, 51, 30, 62,217, 58, 73,
- 62,172,138, 27, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172,138, 27,
- 62,236,211, 33, 62,185,220, 42, 62,236,211, 31, 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,153,153,129, 63, 0, 0, 0, 62,159,144, 3, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 62,172,138, 27,
- 62,236,211, 33, 62,166,102, 82, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 38, 63, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,172,138, 27, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172,138, 27, 62,236,211, 33, 62,159,144, 3, 62,236,207, 67, 62,165,174, 39,
- 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,191,255,252, 63, 0, 1,244,
- 62,179, 51, 38, 63, 0, 0, 0, 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,185,220, 42, 62,236,211, 31, 62,198,214, 65, 62,236,207, 67, 62,191,255,252, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204,204,202, 63, 0, 0, 0, 62,191,255,252, 63, 0, 1,244,
- 62,198,214, 65, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,214, 65,
- 62,236,207, 67, 62,185,220, 42, 62,236,211, 31, 62,192,184, 21, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,153, 95, 95, 63, 21, 48, 32, 62,141,132,224, 63, 19, 29,246, 62,147,163, 1, 63, 9,152, 91,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,159, 94,104,
- 63, 11,111,147, 62,153, 95, 95, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,165, 91,180, 63, 22,209,229, 62,153, 95, 95, 63, 21, 48, 32, 62,159, 94,104, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159, 94,104, 63, 11,111,147, 62,147,163, 1, 63, 9,152, 91, 62,153,153,129,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153, 95, 95, 63, 21, 48, 32,
- 62,165, 91,180, 63, 22,209,229, 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,159,123,203, 63, 33, 23,170, 62,146,223, 84, 63, 31, 60, 94, 62,153, 95, 95, 63, 21, 48, 32, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,132,224, 63, 19, 29,246, 62,153, 95, 95, 63, 21, 48, 32,
- 62,146,223, 84, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,146,223, 84,
- 63, 31, 60, 94, 62,159,123,203, 63, 33, 23,170, 62,152,239,141, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,140, 58,121, 63, 40,228,199, 62,128, 0, 0, 63, 37,200, 23, 62,135, 9, 86, 63, 28,140,130,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 9, 86, 63, 28,140,130, 62,146,223, 84,
- 63, 31, 60, 94, 62,140, 58,121, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,152,239,141, 63, 43, 52,211, 62,140, 58,121, 63, 40,228,199, 62,146,223, 84, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,146,223, 84, 63, 31, 60, 94, 62,135, 9, 86, 63, 28,140,130, 62,141,132,224,
- 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,245,204, 63, 44,160,198,
- 62,152,239,141, 63, 43, 52,211, 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,159,123,203, 63, 33, 23,170, 62,171,221, 20, 63, 34, 17,219, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42, 63, 45, 28, 28, 62,165,245,204, 63, 44,160,198,
- 62,171,221, 20, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,171,221, 20,
- 63, 34, 17,219, 62,159,123,203, 63, 33, 23,170, 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,182,180, 63, 21, 48, 38, 63, 19,184,140, 63, 22,209,232, 63, 22,183, 43, 63, 11,111,149,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 28,148,223,
- 63, 9,152, 94, 63, 25,182,180, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 31,163,245, 63, 19, 29,253, 63, 25,182,180, 63, 21, 48, 38, 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,148,223, 63, 9,152, 94, 63, 22,183, 43, 63, 11,111,149, 63, 25,153,155,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,182,180, 63, 21, 48, 38,
- 63, 31,163,245, 63, 19, 29,253, 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,246,191, 63, 31, 60,109, 63, 22,168,132, 63, 33, 23,180, 63, 25,182,180, 63, 21, 48, 38, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 25,182,180, 63, 21, 48, 38,
- 63, 22,168,132, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,168,132,
- 63, 33, 23,180, 63, 28,246,191, 63, 31, 60,109, 63, 25,238,169, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,107,138, 63, 44,160,211, 63, 12,204,220, 63, 45, 28, 35, 63, 16,119,225, 63, 34, 17,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 22,168,132,
- 63, 33, 23,180, 63, 19,107,138, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 25,238,169, 63, 43, 52,229, 63, 19,107,138, 63, 44,160,211, 63, 22,168,132, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,168,132, 63, 33, 23,180, 63, 16,119,225, 63, 34, 17,225, 63, 19,184,140,
- 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 73, 51, 63, 40,228,221,
- 63, 25,238,169, 63, 43, 52,229, 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,246,191, 63, 31, 60,109, 63, 34,225,192, 63, 28,140,142, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 37,200, 45, 63, 32, 73, 51, 63, 40,228,221,
- 63, 34,225,192, 63, 28,140,142, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,225,192,
- 63, 28,140,142, 63, 28,246,191, 63, 31, 60,109, 63, 31,163,245, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,212, 63, 23, 32,188, 63, 19,184,140, 63, 22,209,232, 63, 16,119,225, 63, 34, 17,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 9, 33,207,
- 63, 34, 17,226, 63, 12,204,212, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 5,225, 29, 63, 22,209,233, 63, 12,204,212, 63, 23, 32,188, 63, 9, 33,207, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 33,207, 63, 34, 17,226, 63, 16,119,225, 63, 34, 17,225, 63, 12,204,220,
- 63, 45, 28, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,212, 63, 23, 32,188,
- 63, 5,225, 29, 63, 22,209,233, 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 9,105,118, 63, 11,116,101, 63, 16, 48, 43, 63, 11,116,100, 63, 12,204,212, 63, 23, 32,188, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 12,204,212, 63, 23, 32,188,
- 63, 16, 48, 43, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 48, 43,
- 63, 11,116,100, 63, 9,105,118, 63, 11,116,101, 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 25,153,155, 63, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 16, 48, 43,
- 63, 11,116,100, 63, 19, 51, 51, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,205, 63, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 16, 48, 43, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 48, 43, 63, 11,116,100, 63, 22,183, 43, 63, 11,111,149, 63, 19,184,140,
- 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244,
- 63, 12,204,205, 63, 0, 0, 0, 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 9,105,118, 63, 11,116,101, 63, 2,226,118, 63, 11,111,149, 63, 6,102,102, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244,
- 63, 2,226,118, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,226,118,
- 63, 11,111,149, 63, 9,105,118, 63, 11,116,101, 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,198, 62,217, 58, 72, 63, 6, 10, 77, 62,217,196, 6, 63, 9, 72, 17, 62,198,230,227,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 72, 17, 62,198,230,227, 63, 16, 81,117,
- 62,198,230,223, 63, 12,204,198, 62,217, 58, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 19,143, 64, 62,217,196, 4, 63, 12,204,198, 62,217, 58, 72, 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 81,117, 62,198,230,223, 63, 9, 72, 17, 62,198,230,227, 63, 12,204,191,
- 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,198, 62,217, 58, 72,
- 63, 19,143, 64, 62,217,196, 4, 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30, 63, 9,120, 71, 62,236,211, 30, 63, 12,204,198, 62,217, 58, 72, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 10, 77, 62,217,196, 6, 63, 12,204,198, 62,217, 58, 72,
- 63, 9,120, 71, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9,120, 71,
- 62,236,211, 30, 63, 16, 33, 76, 62,236,211, 30, 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 0, 0, 0, 63, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63, 9,120, 71,
- 62,236,211, 30, 63, 6,102,102, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,205, 63, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 9,120, 71, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9,120, 71, 62,236,211, 30, 63, 2,251, 62, 62,236,207, 67, 63, 6, 10, 77,
- 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244,
- 63, 12,204,205, 63, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30, 63, 22,158, 86, 62,236,207, 65, 63, 19, 51, 51, 63, 0, 1,244, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,153,155, 63, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244,
- 63, 22,158, 86, 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,158, 86,
- 62,236,207, 65, 63, 16, 33, 76, 62,236,211, 30, 63, 19,143, 64, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,255,197,233, 63, 21, 48, 39, 62,243,235,101, 63, 19, 29,252, 62,250, 9,132, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 63, 2,226,118,
- 63, 11,111,149, 62,255,197,233, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 5,225, 29, 63, 22,209,233, 62,255,197,233, 63, 21, 48, 39, 63, 2,226,118, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,226,118, 63, 11,111,149, 62,250, 9,132, 63, 9,152, 94, 63, 0, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,255,197,233, 63, 21, 48, 39,
- 63, 5,225, 29, 63, 22,209,233, 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 2,241, 43, 63, 33, 23,181, 62,249, 69,225, 63, 31, 60,110, 62,255,197,233, 63, 21, 48, 39, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,235,101, 63, 19, 29,252, 62,255,197,233, 63, 21, 48, 39,
- 62,249, 69,225, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249, 69,225,
- 63, 31, 60,110, 63, 2,241, 43, 63, 33, 23,181, 62,255, 86, 30, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,242,161, 9, 63, 40,228,223, 62,230,102,129, 63, 37,200, 48, 62,237,111,222, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237,111,222, 63, 28,140,143, 62,249, 69,225,
- 63, 31, 60,110, 62,242,161, 9, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,255, 86, 30, 63, 43, 52,230, 62,242,161, 9, 63, 40,228,223, 62,249, 69,225, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249, 69,225, 63, 31, 60,110, 62,237,111,222, 63, 28,140,143, 62,243,235,101,
- 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 46, 46, 63, 44,160,211,
- 62,255, 86, 30, 63, 43, 52,230, 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 2,241, 43, 63, 33, 23,181, 63, 9, 33,207, 63, 34, 17,226, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 45, 28, 35, 63, 6, 46, 46, 63, 44,160,211,
- 63, 9, 33,207, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 33,207,
- 63, 34, 17,226, 63, 2,241, 43, 63, 33, 23,181, 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 85,238,138, 62,187,220, 72, 63, 82,173,218, 62,210, 92, 55, 63, 79,189,229, 62,189,208,173,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,189,229, 62,189,208,173, 63, 82,250,230,
- 62,166,190,117, 63, 85,238,138, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,149, 62,165,199,201, 63, 85,238,138, 62,187,220, 72, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,250,230, 62,166,190,117, 63, 79,189,229, 62,189,208,173, 63, 76,119,198,
- 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,111,170, 62,193,135, 68,
- 63, 76,119,198, 62,169,150, 90, 63, 79,189,229, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 79,189,229, 62,189,208,173, 63, 76,175,176, 62,213,159,192, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,194,112, 62,217,196, 19, 63, 73,111,170, 62,193,135, 68,
- 63, 76,175,176, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,175,176,
- 62,213,159,192, 63, 79,189,229, 62,189,208,173, 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 76,204,193, 63, 0, 0, 0, 63, 73,209,128, 62,236,207, 75,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63, 76,175,176,
- 62,213,159,192, 63, 79,175, 52, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 82,173,218, 62,210, 92, 55, 63, 79,175, 52, 62,233, 32,218, 63, 76,175,176, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,175,176, 62,213,159,192, 63, 73,209,128, 62,236,207, 75, 63, 70,194,112,
- 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,111,170, 62,193,135, 68,
- 63, 70,194,112, 62,217,196, 19, 63, 67,132,171, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 67,132,171, 62,198,230,253, 63, 70, 29, 61, 62,174, 54,114, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,119,198, 62,169,150, 90, 63, 73,111,170, 62,193,135, 68,
- 63, 70, 29, 61, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70, 29, 61,
- 62,174, 54,114, 63, 67,132,171, 62,198,230,253, 63, 64, 0, 0, 62,180,111,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 82,173,218, 62,210, 92, 55, 63, 86, 54, 56, 62,233, 23, 58,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63, 83, 51, 41,
- 62,255,252, 24, 63, 79,175, 52, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,204,193, 63, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 83, 51, 41, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83, 51, 41, 62,255,252, 24, 63, 86, 54, 56, 62,233, 23, 58, 63, 89,153,147,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58,
- 63, 89,153,147, 63, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63, 89,153,147, 62,209,190,143, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 92,252,239, 62,233, 23, 58,
- 63, 89,153,147, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147,
- 62,209,190,143, 63, 86, 54, 56, 62,233, 23, 58, 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 85,238,138, 62,187,220, 72, 63, 89,153,149, 62,165,199,201, 63, 93, 68,159, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 68,159, 62,187,220, 72, 63, 89,153,147,
- 62,209,190,143, 63, 85,238,138, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 82,173,218, 62,210, 92, 55, 63, 85,238,138, 62,187,220, 72, 63, 89,153,147, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 62,209,190,143, 63, 93, 68,159, 62,187,220, 72, 63, 96,133, 78,
- 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58,
- 63, 96,133, 78, 62,210, 92, 55, 63, 99,131,242, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 99,131,242, 62,233, 32,218, 63, 95,255,254, 62,255,252, 24, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58,
- 63, 95,255,254, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,255,254,
- 62,255,252, 24, 63, 99,131,242, 62,233, 32,218, 63,102,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,111,174,139, 62,198,230,223, 63,108,112,192, 62,217,196, 4, 63,105,195,133, 62,193,135, 37,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,195,133, 62,193,135, 37, 63,109, 21,249,
- 62,174, 54, 65, 63,111,174,139, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 65, 62,180,111,160, 63,111,174,139, 62,198,230,223, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 21,249, 62,174, 54, 65, 63,105,195,133, 62,193,135, 37, 63,102,187,106,
- 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,117, 70, 62,189,208,155,
- 63,102,187,106, 62,169,150, 54, 63,105,195,133, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,105,195,133, 62,193,135, 37, 63,102,131,123, 62,213,159,181, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 99,117, 70, 62,189,208,155,
- 63,102,131,123, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,131,123,
- 62,213,159,181, 63,105,195,133, 62,193,135, 37, 63,108,112,192, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,102,102,101, 63, 0, 0, 0, 63, 99,131,242, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,131,242, 62,233, 32,218, 63,102,131,123,
- 62,213,159,181, 63,105, 97,170, 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,108,112,192, 62,217,196, 4, 63,105, 97,170, 62,236,207, 65, 63,102,131,123, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,131,123, 62,213,159,181, 63, 99,131,242, 62,233, 32,218, 63, 96,133, 78,
- 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,117, 70, 62,189,208,155,
- 63, 96,133, 78, 62,210, 92, 55, 63, 93, 68,159, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 93, 68,159, 62,187,220, 72, 63, 96, 56, 71, 62,166,190, 99, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,187,106, 62,169,150, 54, 63, 99,117, 70, 62,189,208,155,
- 63, 96, 56, 71, 62,166,190, 99, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 56, 71,
- 62,166,190, 99, 63, 93, 68,159, 62,187,220, 72, 63, 89,153,149, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63, 96, 92, 11, 63, 19, 29,253, 63, 92,238, 21, 63, 9,150,112,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63, 95,255,254,
- 62,255,252, 24, 63, 99,107, 33, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,102,102,101, 63, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63, 95,255,254, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,255,254, 62,255,252, 24, 63, 92,238, 21, 63, 9,150,112, 63, 89,153,147,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112,
- 63, 89,153,147, 63, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63, 89,153,143, 63, 19, 98,219, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,215, 19, 63, 19, 29,252, 63, 86, 69, 14, 63, 9,150,112,
- 63, 89,153,143, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,143,
- 63, 19, 98,219, 63, 92,238, 21, 63, 9,150,112, 63, 96, 92, 11, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,139, 63, 37,200, 45, 63, 86, 20,218, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 20,218, 63, 28,140,143, 63, 89,153,143,
- 63, 19, 98,219, 63, 93, 30, 63, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 96, 92, 11, 63, 19, 29,253, 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,143, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,143, 63, 19, 98,219, 63, 86, 20,218, 63, 28,140,143, 63, 82,215, 19,
- 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112,
- 63, 82,215, 19, 63, 19, 29,252, 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 79,200, 1, 63, 9,152, 94, 63, 83, 51, 41, 62,255,252, 24, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112,
- 63, 83, 51, 41, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83, 51, 41,
- 62,255,252, 24, 63, 79,200, 1, 63, 9,152, 94, 63, 76,204,193, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 18, 28,237, 62,187,220, 60, 60,188, 35,151, 62,210, 92, 46, 60, 60, 74,218, 62,189,208,150,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60, 60, 74,218, 62,189,208,150, 60,197,197,195,
- 62,166,190, 89, 61, 18, 28,237, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,205,194, 62,165,199,186, 61, 18, 28,237, 62,187,220, 60, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131, 23, 23, 62,166,190, 89, 63,129,120,150, 62,189,208,150, 63,127,171, 15,
- 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,162,241, 62,193,135, 36,
- 63,127,171, 15, 62,169,150, 52, 63,129,120,150, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,129,120,150, 62,189,208,150, 63,127,226,244, 62,213,159,179, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,245,179, 62,217,196, 6, 63,124,162,241, 62,193,135, 36,
- 63,127,226,244, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,127,226,244,
- 62,213,159,179, 63,129,120,150, 62,189,208,150, 63,130,240,142, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,129,113, 59, 62,233, 32,214, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 4,194, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,127,226,244,
- 62,213,159,179, 63,129,113, 59, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,130,240,142, 62,210, 92, 46, 63,129,113, 59, 62,233, 32,214, 63,127,226,244, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,127,226,244, 62,213,159,179, 63,125, 4,194, 62,236,207, 67, 63,121,245,179,
- 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,162,241, 62,193,135, 36,
- 63,121,245,179, 62,217,196, 6, 63,118,183,239, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,118,183,239, 62,198,230,227, 63,121, 80,133, 62,174, 54, 65, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,127,171, 15, 62,169,150, 52, 63,124,162,241, 62,193,135, 36,
- 63,121, 80,133, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 80,133,
- 62,174, 54, 65, 63,118,183,239, 62,198,230,227, 63,115, 51, 65, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 60, 56,157,110, 62,233, 32,214, 60,188, 35,151, 62,210, 92, 46, 61, 22,151, 95, 62,233, 23, 55,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 60,204,204,176,
- 62,255,252, 24, 60, 56,157,110, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 38, 11, 79,167, 63, 0, 0, 0, 60, 56,157,110, 62,233, 32,214, 60,204,204,176, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,204,204,176, 62,255,252, 24, 61, 22,151, 95, 62,233, 23, 55, 61, 76,204,215,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57,
- 61, 76,204,215, 63, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 61, 76,205, 68, 62,209,190,135, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,129,129, 87, 62,233, 23, 57,
- 61, 76,205, 68, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205, 68,
- 62,209,190,135, 61, 22,151, 95, 62,233, 23, 55, 60,188, 35,151, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 18, 28,237, 62,187,220, 60, 61, 76,205,194, 62,165,199,186, 61,131,191, 7, 62,187,220, 62,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,131,191, 7, 62,187,220, 62, 61, 76,205, 68,
- 62,209,190,135, 61, 18, 28,237, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 60,188, 35,151, 62,210, 92, 46, 61, 18, 28,237, 62,187,220, 60, 61, 76,205, 68, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205, 68, 62,209,190,135, 61,131,191, 7, 62,187,220, 62, 61,157,196, 92,
- 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57,
- 61,157,196, 92, 62,210, 92, 49, 61,181,185, 89, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,181,185, 89, 62,233, 32,214, 61,153,153,154, 62,255,252, 25, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57,
- 61,153,153,154, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,153,153,154,
- 62,255,252, 25, 61,181,185, 89, 62,233, 32,214, 61,204,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 11,135, 1, 62,198,230,228, 61,253, 31,171, 62,217,196, 6, 61,231,181,251, 62,193,135, 38,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,231,181,251, 62,193,135, 38, 62, 1, 36,204,
- 62,174, 54, 70, 62, 11,135, 1, 62,198,230,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,214, 62,180,111,165, 62, 11,135, 1, 62,198,230,228, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 1, 36,204, 62,174, 54, 70, 61,231,181,251, 62,193,135, 38, 61,207,117, 70,
- 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181, 68, 35, 62,189,208,153,
- 61,207,117, 70, 62,169,150, 54, 61,231,181,251, 62,193,135, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,231,181,251, 62,193,135, 38, 61,205,181,164, 62,213,159,180, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,181, 68, 35, 62,189,208,153,
- 61,205,181,164, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,205,181,164,
- 62,213,159,180, 61,231,181,251, 62,193,135, 38, 61,253, 31,171, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 61,204,204,215, 63, 0, 0, 0, 61,181,185, 89, 62,233, 32,214,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181,185, 89, 62,233, 32,214, 61,205,181,164,
- 62,213,159,180, 61,228,166,251, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,253, 31,171, 62,217,196, 6, 61,228,166,251, 62,236,207, 67, 61,205,181,164, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,205,181,164, 62,213,159,180, 61,181,185, 89, 62,233, 32,214, 61,157,196, 92,
- 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181, 68, 35, 62,189,208,153,
- 61,157,196, 92, 62,210, 92, 49, 61,131,191, 7, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,131,191, 7, 62,187,220, 62, 61,155, 92, 79, 62,166,190, 91, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,207,117, 70, 62,169,150, 54, 61,181, 68, 35, 62,189,208,153,
- 61,155, 92, 79, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,155, 92, 79,
- 62,166,190, 91, 61,131,191, 7, 62,187,220, 62, 61, 76,205,194, 62,165,199,186, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,156,122, 1, 63, 19, 29,254, 61,129, 10,100, 63, 9,150,113,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 61,153,153,154,
- 62,255,252, 25, 61,180,242,172, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,204,204,215, 63, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,153,153,154, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,153,153,154, 62,255,252, 25, 61,129, 10,100, 63, 9,150,113, 61, 76,204,215,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 23,132,109, 63, 9,150,113,
- 61, 76,204,215, 63, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 61, 76,204, 91, 63, 19, 98,220, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,193, 73,174, 63, 19, 29,253, 61, 23,132,109, 63, 9,150,113,
- 61, 76,204, 91, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204, 91,
- 63, 19, 98,220, 61,129, 10,100, 63, 9,150,113, 61,156,122, 1, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,130,139,166, 63, 28,140,145, 61, 76,203,246, 63, 37,200, 48, 61, 20,129, 13, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 20,129, 13, 63, 28,140,143, 61, 76,204, 91,
- 63, 19, 98,220, 61,130,139,166, 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,156,122, 1, 63, 19, 29,254, 61,130,139,166, 63, 28,140,145, 61, 76,204, 91, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204, 91, 63, 19, 98,220, 61, 20,129, 13, 63, 28,140,143, 60,193, 73,174,
- 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 23,132,109, 63, 9,150,113,
- 60,193, 73,174, 63, 19, 29,253, 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 60, 62,207,114, 63, 9,152, 94, 60,204,204,176, 62,255,252, 24, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61, 23,132,109, 63, 9,150,113,
- 60,204,204,176, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,204,204,176,
- 62,255,252, 24, 60, 62,207,114, 63, 9,152, 94, 38, 11, 79,167, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,113, 83,237, 62,187,220, 79, 62,100, 81, 63, 62,210, 92, 60, 62, 88,145,110, 62,189,208,167,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 88,145,110, 62,189,208,167, 62,101,133, 91,
- 62,166,190,112, 62,113, 83,237, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 62,165,199,206, 62,113, 83,237, 62,187,220, 79, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101,133, 91, 62,166,190,112, 62, 88,145,110, 62,189,208,167, 62, 75,120,239,
- 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 63, 88,144, 62,193,135, 46,
- 62, 75,120,239, 62,169,150, 70, 62, 88,145,110, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 88,145,110, 62,189,208,167, 62, 76, 88,170, 62,213,159,187, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,163,179, 62,217,196, 7, 62, 63, 88,144, 62,193,135, 46,
- 62, 76, 88,170, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 76, 88,170,
- 62,213,159,187, 62, 88,145,110, 62,189,208,167, 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62, 76,204,254, 63, 0, 0, 0, 62, 64,223,251, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 62, 76, 88,170,
- 62,213,159,187, 62, 88, 86,190, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,100, 81, 63, 62,210, 92, 60, 62, 88, 86,190, 62,233, 32,221, 62, 76, 88,170, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 76, 88,170, 62,213,159,187, 62, 64,223,251, 62,236,207, 67, 62, 52,163,179,
- 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 63, 88,144, 62,193,135, 46,
- 62, 52,163,179, 62,217,196, 7, 62, 39,172,153, 62,198,230,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 39,172,153, 62,198,230,230, 62, 50, 14,213, 62,174, 54, 78, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 75,120,239, 62,169,150, 70, 62, 63, 88,144, 62,193,135, 46,
- 62, 50, 14,213, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 50, 14,213,
- 62,174, 54, 78, 62, 39,172,153, 62,198,230,230, 62, 25,153,214, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62,100, 81, 63, 62,210, 92, 60, 62,114,114,166, 62,233, 23, 63,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 62,102,102,126,
- 62,255,252, 25, 62, 88, 86,190, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 76,204,254, 63, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62,102,102,126, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,102,102,126, 62,255,252, 25, 62,114,114,166, 62,233, 23, 63, 62,128, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,198,173, 62,233, 23, 63,
- 62,128, 0, 0, 63, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 62,128, 0, 0, 62,209,190,149, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,134,198,173, 62,233, 23, 63,
- 62,128, 0, 0, 62,209,190,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0,
- 62,209,190,149, 62,114,114,166, 62,233, 23, 63, 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,165,199,206, 62,135, 86, 9, 62,187,220, 79,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 86, 9, 62,187,220, 79, 62,128, 0, 0,
- 62,209,190,149, 62,113, 83,237, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,100, 81, 63, 62,210, 92, 60, 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,209,190,149, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,209,190,149, 62,135, 86, 9, 62,187,220, 79, 62,141,215, 97,
- 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,198,173, 62,233, 23, 63,
- 62,141,215, 97, 62,210, 92, 60, 62,147,212,161, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,147,212,161, 62,233, 32,221, 62,140,204,193, 62,255,252, 25, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,134,198,173, 62,233, 23, 63,
- 62,140,204,193, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,140,204,193,
- 62,255,252, 25, 62,147,212,161, 62,233, 32,221, 62,153,153,129, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,172, 41,180, 62,198,230,227, 62,165,174, 39, 62,217,196, 7, 62,160, 83,184, 62,193,135, 46,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,160, 83,184, 62,193,135, 46, 62,166,248,150,
- 62,174, 54, 78, 62,172, 41,180, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 21, 62,180,111,165, 62,172, 41,180, 62,198,230,227, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,166,248,150, 62,174, 54, 78, 62,160, 83,184, 62,193,135, 46, 62,154, 67,137,
- 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,183, 73, 62,189,208,167,
- 62,154, 67,137, 62,169,150, 70, 62,160, 83,184, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,160, 83,184, 62,193,135, 46, 62,153,211,171, 62,213,159,187, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,147,183, 73, 62,189,208,167,
- 62,153,211,171, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153,211,171,
- 62,213,159,187, 62,160, 83,184, 62,193,135, 46, 62,165,174, 39, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 62,153,153,129, 63, 0, 0, 0, 62,147,212,161, 62,233, 32,221,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,212,161, 62,233, 32,221, 62,153,211,171,
- 62,213,159,187, 62,159,144, 3, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,165,174, 39, 62,217,196, 7, 62,159,144, 3, 62,236,207, 67, 62,153,211,171, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153,211,171, 62,213,159,187, 62,147,212,161, 62,233, 32,221, 62,141,215, 97,
- 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,183, 73, 62,189,208,167,
- 62,141,215, 97, 62,210, 92, 60, 62,135, 86, 9, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,135, 86, 9, 62,187,220, 79, 62,141, 61, 82, 62,166,190,112, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,154, 67,137, 62,169,150, 70, 62,147,183, 73, 62,189,208,167,
- 62,141, 61, 82, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141, 61, 82,
- 62,166,190,112, 62,135, 86, 9, 62,187,220, 79, 62,128, 0, 0, 62,165,199,206, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,141,132,224, 63, 19, 29,246, 62,134,168,251, 63, 9,150,107,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 62,140,204,193,
- 62,255,252, 25, 62,147,163, 1, 63, 9,152, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,153,153,129, 63, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,140,204,193, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,140,204,193, 62,255,252, 25, 62,134,168,251, 63, 9,150,107, 62,128, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,174, 11, 63, 9,150,107,
- 62,128, 0, 0, 63, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 62,128, 0, 0, 63, 19, 98,209, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,100,246, 64, 63, 19, 29,246, 62,114,174, 11, 63, 9,150,107,
- 62,128, 0, 0, 63, 19, 98,209, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0,
- 63, 19, 98,209, 62,134,168,251, 63, 9,150,107, 62,141,132,224, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 37,200, 23, 62,113,237, 83, 63, 28,140,130,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,113,237, 83, 63, 28,140,130, 62,128, 0, 0,
- 63, 19, 98,209, 62,135, 9, 86, 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,141,132,224, 63, 19, 29,246, 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 19, 98,209, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 19, 98,209, 62,113,237, 83, 63, 28,140,130, 62,100,246, 64,
- 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,174, 11, 63, 9,150,107,
- 62,100,246, 64, 63, 19, 29,246, 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 88,185,255, 63, 9,152, 90, 62,102,102,126, 62,255,252, 25, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,114,174, 11, 63, 9,150,107,
- 62,102,102,126, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,102,102,126,
- 62,255,252, 25, 62, 88,185,255, 63, 9,152, 90, 62, 76,204,254, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 16, 63, 62,187,220, 62, 62,216,142,233, 62,210, 92, 49, 62,210,174,248, 62,189,208,153,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,210,174,248, 62,189,208,153, 62,217, 40,237,
- 62,166,190, 91, 62,223, 16, 63, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102, 72, 62,165,199,183, 62,223, 16, 63, 62,187,220, 62, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217, 40,237, 62,166,190, 91, 62,210,174,248, 62,189,208,153, 62,204, 34,175,
- 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198, 18,129, 62,193,135, 37,
- 62,204, 34,175, 62,169,150, 54, 62,210,174,248, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,210,174,248, 62,189,208,153, 62,204,146,151, 62,213,159,180, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,184, 21, 62,217,196, 6, 62,198, 18,129, 62,193,135, 37,
- 62,204,146,151, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204,146,151,
- 62,213,159,180, 62,210,174,248, 62,189,208,153, 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,204,204,202, 63, 0, 0, 0, 62,198,214, 65, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 62,204,146,151,
- 62,213,159,180, 62,210,145,170, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,216,142,233, 62,210, 92, 49, 62,210,145,170, 62,233, 32,214, 62,204,146,151, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204,146,151, 62,213,159,180, 62,198,214, 65, 62,236,207, 67, 62,192,184, 21,
- 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198, 18,129, 62,193,135, 37,
- 62,192,184, 21, 62,217,196, 6, 62,186, 60,127, 62,198,230,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,186, 60,127, 62,198,230,225, 62,191,109,154, 62,174, 54, 68, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204, 34,175, 62,169,150, 54, 62,198, 18,129, 62,193,135, 37,
- 62,191,109,154, 62,174, 54, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,191,109,154,
- 62,174, 54, 68, 62,186, 60,127, 62,198,230,225, 62,179, 51, 21, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,216,142,233, 62,210, 92, 49, 62,223,159,171, 62,233, 23, 57,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 62,217,153,154,
- 62,255,252, 24, 62,210,145,170, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,204,204,202, 63, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,217,153,154, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217,153,154, 62,255,252, 24, 62,223,159,171, 62,233, 23, 57, 62,230,102,101,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55,
- 62,230,102,101, 63, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 62,230,102, 88, 62,209,190,135, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,237, 45, 20, 62,233, 23, 55,
- 62,230,102, 88, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 88,
- 62,209,190,135, 62,223,159,171, 62,233, 23, 57, 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 16, 63, 62,187,220, 62, 62,230,102, 72, 62,165,199,183, 62,237,188, 99, 62,187,220, 60,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237,188, 99, 62,187,220, 60, 62,230,102, 88,
- 62,209,190,135, 62,223, 16, 63, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,216,142,233, 62,210, 92, 49, 62,223, 16, 63, 62,187,220, 62, 62,230,102, 88, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 88, 62,209,190,135, 62,237,188, 99, 62,187,220, 60, 62,244, 61,199,
- 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55,
- 62,244, 61,199, 62,210, 92, 46, 62,250, 59, 21, 62,233, 32,213, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213, 62,243, 51, 53, 62,255,252, 24, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55,
- 62,243, 51, 53, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243, 51, 53,
- 62,255,252, 24, 62,250, 59, 21, 62,233, 32,213, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 72, 17, 62,198,230,227, 63, 6, 10, 77, 62,217,196, 6, 63, 3, 93, 15, 62,193,135, 36,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 93, 15, 62,193,135, 36, 63, 6,175,123,
- 62,174, 54, 65, 63, 9, 72, 17, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,191, 62,180,111,160, 63, 9, 72, 17, 62,198,230,227, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,175,123, 62,174, 54, 65, 63, 3, 93, 15, 62,193,135, 36, 63, 0, 84,241,
- 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 29,169, 62,189,208,150,
- 63, 0, 84,241, 62,169,150, 52, 63, 3, 93, 15, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 3, 93, 15, 62,193,135, 36, 63, 0, 29, 12, 62,213,159,179, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,250, 29,169, 62,189,208,150,
- 63, 0, 29, 12, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 29, 12,
- 62,213,159,179, 63, 3, 93, 15, 62,193,135, 36, 63, 6, 10, 77, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63, 0, 0, 0, 63, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213, 63, 0, 29, 12,
- 62,213,159,179, 63, 2,251, 62, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 6, 10, 77, 62,217,196, 6, 63, 2,251, 62, 62,236,207, 67, 63, 0, 29, 12, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 29, 12, 62,213,159,179, 62,250, 59, 21, 62,233, 32,213, 62,244, 61,199,
- 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 29,169, 62,189,208,150,
- 62,244, 61,199, 62,210, 92, 46, 62,237,188, 99, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,237,188, 99, 62,187,220, 60, 62,243,163,164, 62,166,190, 89, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 84,241, 62,169,150, 52, 62,250, 29,169, 62,189,208,150,
- 62,243,163,164, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,163,164,
- 62,166,190, 89, 62,237,188, 99, 62,187,220, 60, 62,230,102, 72, 62,165,199,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 62,243,235,101, 63, 19, 29,252, 62,237, 15,114, 63, 9,150,113,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 62,243, 51, 53,
- 62,255,252, 24, 62,250, 9,132, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 62,243, 51, 53, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243, 51, 53, 62,255,252, 24, 62,237, 15,114, 63, 9,150,113, 62,230,102,101,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,189,103, 63, 9,150,112,
- 62,230,102,101, 63, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 62,230,102,117, 63, 19, 98,220, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,225,128, 63, 19, 29,254, 62,223,189,103, 63, 9,150,112,
- 62,230,102,117, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,117,
- 63, 19, 98,220, 62,237, 15,114, 63, 9,150,113, 62,243,235,101, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,237,111,222, 63, 28,140,143, 62,230,102,129, 63, 37,200, 48, 62,223, 93, 22, 63, 28,140,145,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 93, 22, 63, 28,140,145, 62,230,102,117,
- 63, 19, 98,220, 62,237,111,222, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,243,235,101, 63, 19, 29,252, 62,237,111,222, 63, 28,140,143, 62,230,102,117, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,117, 63, 19, 98,220, 62,223, 93, 22, 63, 28,140,145, 62,216,225,128,
- 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,189,103, 63, 9,150,112,
- 62,216,225,128, 63, 19, 29,254, 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,210,195, 85, 63, 9,152, 96, 62,217,153,154, 62,255,252, 24, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,223,189,103, 63, 9,150,112,
- 62,217,153,154, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217,153,154,
- 62,255,252, 24, 62,210,195, 85, 63, 9,152, 96, 62,204,204,202, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,187, 97, 62,187,220, 72, 63, 31,122,178, 62,210, 92, 55, 63, 28,138,186, 62,189,208,155,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,138,186, 62,189,208,155, 63, 31,199,185,
- 62,166,190, 96, 63, 34,187, 97, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,107, 62,165,199,201, 63, 34,187, 97, 62,187,220, 72, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,199,185, 62,166,190, 96, 63, 28,138,186, 62,189,208,155, 63, 25, 68,150,
- 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22, 60,123, 62,193,135, 36,
- 63, 25, 68,150, 62,169,150, 54, 63, 28,138,186, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,138,186, 62,189,208,155, 63, 25,124,133, 62,213,159,181, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,143, 64, 62,217,196, 4, 63, 22, 60,123, 62,193,135, 36,
- 63, 25,124,133, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,124,133,
- 62,213,159,181, 63, 28,138,186, 62,189,208,155, 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 25,153,155, 63, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63, 25,124,133,
- 62,213,159,181, 63, 28,124, 14, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 31,122,178, 62,210, 92, 55, 63, 28,124, 14, 62,233, 32,218, 63, 25,124,133, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,124,133, 62,213,159,181, 63, 22,158, 86, 62,236,207, 65, 63, 19,143, 64,
- 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22, 60,123, 62,193,135, 36,
- 63, 19,143, 64, 62,217,196, 4, 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 16, 81,117, 62,198,230,223, 63, 18,234, 7, 62,174, 54, 65, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25, 68,150, 62,169,150, 54, 63, 22, 60,123, 62,193,135, 36,
- 63, 18,234, 7, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,234, 7,
- 62,174, 54, 65, 63, 16, 81,117, 62,198,230,223, 63, 12,204,191, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 31,122,178, 62,210, 92, 55, 63, 35, 3, 17, 62,233, 23, 58,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63, 32, 0, 2,
- 62,255,252, 24, 63, 28,124, 14, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 25,153,155, 63, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 32, 0, 2, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 0, 2, 62,255,252, 24, 63, 35, 3, 17, 62,233, 23, 58, 63, 38,102,109,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58,
- 63, 38,102,109, 63, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63, 38,102,109, 62,209,190,143, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 41,201,200, 62,233, 23, 58,
- 63, 38,102,109, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109,
- 62,209,190,143, 63, 35, 3, 17, 62,233, 23, 58, 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,187, 97, 62,187,220, 72, 63, 38,102,107, 62,165,199,201, 63, 42, 17,118, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42, 17,118, 62,187,220, 72, 63, 38,102,109,
- 62,209,190,143, 63, 34,187, 97, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 31,122,178, 62,210, 92, 55, 63, 34,187, 97, 62,187,220, 72, 63, 38,102,109, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 62,209,190,143, 63, 42, 17,118, 62,187,220, 72, 63, 45, 82, 38,
- 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58,
- 63, 45, 82, 38, 62,210, 92, 55, 63, 48, 80,204, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218, 63, 44,204,215, 62,255,252, 23, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58,
- 63, 44,204,215, 62,255,252, 23, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44,204,215,
- 62,255,252, 23, 63, 48, 80,204, 62,233, 32,218, 63, 51, 51, 63, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,123, 85, 62,198,230,253, 63, 57, 61,144, 62,217,196, 19, 63, 54,144, 86, 62,193,135, 68,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,144, 86, 62,193,135, 68, 63, 57,226,196,
- 62,174, 54,114, 63, 60,123, 85, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 62,180,111,211, 63, 60,123, 85, 62,198,230,253, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,226,196, 62,174, 54,114, 63, 54,144, 86, 62,193,135, 68, 63, 51,136, 58,
- 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 66, 27, 62,189,208,173,
- 63, 51,136, 58, 62,169,150, 90, 63, 54,144, 86, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 54,144, 86, 62,193,135, 68, 63, 51, 80, 80, 62,213,159,192, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 48, 66, 27, 62,189,208,173,
- 63, 51, 80, 80, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 80, 80,
- 62,213,159,192, 63, 54,144, 86, 62,193,135, 68, 63, 57, 61,144, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63, 51, 51, 63, 63, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218, 63, 51, 80, 80,
- 62,213,159,192, 63, 54, 46,128, 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 57, 61,144, 62,217,196, 19, 63, 54, 46,128, 62,236,207, 75, 63, 51, 80, 80, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 80, 80, 62,213,159,192, 63, 48, 80,204, 62,233, 32,218, 63, 45, 82, 38,
- 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 66, 27, 62,189,208,173,
- 63, 45, 82, 38, 62,210, 92, 55, 63, 42, 17,118, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 42, 17,118, 62,187,220, 72, 63, 45, 5, 26, 62,166,190,117, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51,136, 58, 62,169,150, 90, 63, 48, 66, 27, 62,189,208,173,
- 63, 45, 5, 26, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 5, 26,
- 62,166,190,117, 63, 42, 17,118, 62,187,220, 72, 63, 38,102,107, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 45, 40,237, 63, 19, 29,252, 63, 41,186,242, 63, 9,150,112,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63, 44,204,215,
- 62,255,252, 23, 63, 48, 55,255, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 51, 51, 63, 63, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 44,204,215, 62,255,252, 23, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44,204,215, 62,255,252, 23, 63, 41,186,242, 63, 9,150,112, 63, 38,102,109,
- 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112,
- 63, 38,102,109, 63, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63, 38,102,113, 63, 19, 98,219, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,163,245, 63, 19, 29,253, 63, 35, 17,235, 63, 9,150,112,
- 63, 38,102,113, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,113,
- 63, 19, 98,219, 63, 41,186,242, 63, 9,150,112, 63, 45, 40,237, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,235, 38, 63, 28,140,141, 63, 38,102,117, 63, 37,200, 45, 63, 34,225,192, 63, 28,140,142,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,225,192, 63, 28,140,142, 63, 38,102,113,
- 63, 19, 98,219, 63, 41,235, 38, 63, 28,140,141, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 45, 40,237, 63, 19, 29,252, 63, 41,235, 38, 63, 28,140,141, 63, 38,102,113, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,113, 63, 19, 98,219, 63, 34,225,192, 63, 28,140,142, 63, 31,163,245,
- 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112,
- 63, 31,163,245, 63, 19, 29,253, 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,148,223, 63, 9,152, 94, 63, 32, 0, 2, 62,255,252, 24, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112,
- 63, 32, 0, 2, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 0, 2,
- 62,255,252, 24, 63, 28,148,223, 63, 9,152, 94, 63, 25,153,155, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,107,129,188, 62,128, 45, 66, 63, 99, 71,235, 62,120, 76,222, 63,106, 37, 94, 62, 83, 97, 84,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65,
- 62, 97,151,248, 63,107,129,188, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 65, 62,135, 83,151, 63,107,129,188, 62,128, 45, 66, 63,115, 51, 65, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 97,151,248, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65,
- 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,107,129,188, 62,128, 45, 66,
- 63,115, 51, 65, 62,135, 83,151, 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,108,123,142, 62,151,144,169, 63,101, 50,231, 62,146,201, 17, 63,107,129,188, 62,128, 45, 66, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63,107,129,188, 62,128, 45, 66,
- 63,101, 50,231, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 50,231,
- 62,146,201, 17, 63,108,123,142, 62,151,144,169, 63,102,187,106, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 56, 71, 62,166,190, 99, 63, 89,153,149, 62,165,199,201, 63, 93,238, 22, 62,144,101,243,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63,101, 50,231,
- 62,146,201, 17, 63, 96, 56, 71, 62,166,190, 99, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,102,187,106, 62,169,150, 54, 63, 96, 56, 71, 62,166,190, 99, 63,101, 50,231, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 50,231, 62,146,201, 17, 63, 93,238, 22, 62,144,101,243, 63, 99, 71,235,
- 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 21,249, 62,174, 54, 65,
- 63,102,187,106, 62,169,150, 54, 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,108,123,142, 62,151,144,169, 63,115, 51, 65, 62,157,231, 93, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,180,111,160, 63,109, 21,249, 62,174, 54, 65,
- 63,115, 51, 65, 62,157,231, 93, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65,
- 62,157,231, 93, 63,108,123,142, 62,151,144,169, 63,115, 51, 65, 62,135, 83,151, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,115,162, 79, 63, 99, 71,235, 62,120, 76,222, 63, 93,238, 22, 62,144,101,243,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63, 85, 69, 21,
- 62,144,102, 3, 63, 89,153,149, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 79,235, 68, 62,120, 77, 37, 63, 89,153,149, 62,115,162, 79, 63, 85, 69, 21, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 85, 69, 21, 62,144,102, 3, 63, 93,238, 22, 62,144,101,243, 63, 89,153,149,
- 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,115,162, 79,
- 63, 79,235, 68, 62,120, 77, 37, 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 83,186, 24, 62, 70,176,245, 63, 95,121, 22, 62, 70,176,204, 63, 89,153,149, 62,115,162, 79, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63, 89,153,149, 62,115,162, 79,
- 63, 95,121, 22, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,121, 22,
- 62, 70,176,204, 63, 83,186, 24, 62, 70,176,245, 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,103,119, 61, 62, 30,253,179, 63,115, 51, 65, 62, 52,111, 90, 63,106, 37, 94, 62, 83, 97, 84,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63, 95,121, 22,
- 62, 70,176,204, 63,103,119, 61, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,152, 62, 23, 31,198, 63,103,119, 61, 62, 30,253,179, 63, 95,121, 22, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,121, 22, 62, 70,176,204, 63,106, 37, 94, 62, 83, 97, 84, 63, 99, 71,235,
- 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,187,248, 62, 30,253,241,
- 63, 89,153,152, 62, 23, 31,198, 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 83,186, 24, 62, 70,176,245, 63, 73, 13,214, 62, 83, 97,181, 63, 75,187,248, 62, 30,253,241, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 75,187,248, 62, 30,253,241,
- 63, 73, 13,214, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73, 13,214,
- 62, 83, 97,181, 63, 83,186, 24, 62, 70,176,245, 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,152, 61,147, 41,111, 63, 64, 0, 0, 61,180,111,195, 63, 64, 0, 0, 61, 52, 65,111,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61, 52, 65,111, 63,117, 49, 38,
- 61, 52, 64,225, 63, 89,153,152, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 65, 61,180,111, 83, 63, 89,153,152, 61,147, 41,111, 63,117, 49, 38, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,117, 49, 38, 61, 52, 64,225, 63, 64, 0, 0, 61, 52, 65,111, 63,121,222,208,
-178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,152, 61,147, 41,111,
- 63,115, 51, 65, 61,180,111, 83, 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 99, 51,172, 61,231, 46, 48, 63, 79,255,135, 61,231, 46,120, 63, 89,153,152, 61,147, 41,111, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61,180,111,195, 63, 89,153,152, 61,147, 41,111,
- 63, 79,255,135, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,255,135,
- 61,231, 46,120, 63, 99, 51,172, 61,231, 46, 48, 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,187,248, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 64, 0, 0, 62, 7, 71, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 7, 71, 24, 63, 79,255,135,
- 61,231, 46,120, 63, 75,187,248, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,152, 62, 23, 31,198, 63, 75,187,248, 62, 30,253,241, 63, 79,255,135, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,255,135, 61,231, 46,120, 63, 64, 0, 0, 62, 7, 71, 24, 63, 64, 0, 0,
- 61,180,111,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,103,119, 61, 62, 30,253,179,
- 63, 89,153,152, 62, 23, 31,198, 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 99, 51,172, 61,231, 46, 48, 63,115, 51, 66, 62, 7, 70,199, 63,103,119, 61, 62, 30,253,179, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,103,119, 61, 62, 30,253,179,
- 63,115, 51, 66, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 66,
- 62, 7, 70,199, 63, 99, 51,172, 61,231, 46, 48, 63,115, 51, 65, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 71,177,122, 62,128, 45,120, 63, 64, 0, 0, 62,135, 83,218, 63, 64, 0, 0, 62, 97,152,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 97,152,115, 63, 73, 13,214,
- 62, 83, 97,181, 63, 71,177,122, 62,128, 45,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 79,235, 68, 62,120, 77, 37, 63, 71,177,122, 62,128, 45,120, 63, 73, 13,214, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73, 13,214, 62, 83, 97,181, 63, 64, 0, 0, 62, 97,152,115, 63, 64, 0, 0,
- 62, 52,111,202, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 71,177,122, 62,128, 45,120,
- 63, 79,235, 68, 62,120, 77, 37, 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 78, 0, 72, 62,146,201, 52, 63, 70,183,169, 62,151,144,219, 63, 71,177,122, 62,128, 45,120, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,135, 83,218, 63, 71,177,122, 62,128, 45,120,
- 63, 70,183,169, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,183,169,
- 62,151,144,219, 63, 78, 0, 72, 62,146,201, 52, 63, 76,119,198, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70, 29, 61, 62,174, 54,114, 63, 64, 0, 0, 62,180,111,211, 63, 64, 0, 0, 62,157,231,162,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,157,231,162, 63, 70,183,169,
- 62,151,144,219, 63, 70, 29, 61, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,119,198, 62,169,150, 90, 63, 70, 29, 61, 62,174, 54,114, 63, 70,183,169, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,183,169, 62,151,144,219, 63, 64, 0, 0, 62,157,231,162, 63, 64, 0, 0,
- 62,135, 83,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,250,230, 62,166,190,117,
- 63, 76,119,198, 62,169,150, 90, 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 78, 0, 72, 62,146,201, 52, 63, 85, 69, 21, 62,144,102, 3, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,165,199,201, 63, 82,250,230, 62,166,190,117,
- 63, 85, 69, 21, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 85, 69, 21,
- 62,144,102, 3, 63, 78, 0, 72, 62,146,201, 52, 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,245,167,179, 62,128, 45, 72, 61,179,217, 94, 62,120, 76,222, 61,234,196,202, 62, 83, 97,100,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 62, 25,153,212,
- 62, 97,152, 2, 61,245,167,179, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,214, 62,135, 83,156, 61,245,167,179, 62,128, 45, 72, 62, 25,153,212, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,212, 62, 97,152, 2, 61,234,196,202, 62, 83, 97,100, 62, 25,153,214,
- 62, 52,111,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,245,167,179, 62,128, 45, 72,
- 62, 25,153,214, 62,135, 83,156, 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,253,118, 62, 62,151,144,174, 61,195, 49, 53, 62,146,201, 17, 61,245,167,179, 62,128, 45, 72, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61,245,167,179, 62,128, 45, 72,
- 61,195, 49, 53, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,195, 49, 53,
- 62,146,201, 17, 61,253,118, 62, 62,151,144,174, 61,207,117, 70, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,155, 92, 79, 62,166,190, 91, 61, 76,205,194, 62,165,199,186, 61,137, 10,212, 62,144,101,238,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61,195, 49, 53,
- 62,146,201, 17, 61,155, 92, 79, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,207,117, 70, 62,169,150, 54, 61,155, 92, 79, 62,166,190, 91, 61,195, 49, 53, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,195, 49, 53, 62,146,201, 17, 61,137, 10,212, 62,144,101,238, 61,179,217, 94,
- 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 1, 36,204, 62,174, 54, 70,
- 61,207,117, 70, 62,169,150, 54, 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,253,118, 62, 62,151,144,174, 62, 25,153,213, 62,157,231,100, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,180,111,165, 62, 1, 36,204, 62,174, 54, 70,
- 62, 25,153,213, 62,157,231,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,213,
- 62,157,231,100, 61,253,118, 62, 62,151,144,174, 62, 25,153,214, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,188, 62,115,162, 53, 61,179,217, 94, 62,120, 76,222, 61,137, 10,212, 62,144,101,238,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61, 7,133,207,
- 62,144,101,236, 61, 76,205,188, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 60, 71,162,255, 62,120, 76,216, 61, 76,205,188, 62,115,162, 53, 61, 7,133,207, 62,144,101,236, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 7,133,207, 62,144,101,236, 61,137, 10,212, 62,144,101,238, 61, 76,205,194,
- 62,165,199,186, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,188, 62,115,162, 53,
- 60, 71,162,255, 62,120, 76,216, 60,221,171,190, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 60,221,171,190, 62, 70,176,194, 61,149, 98,194, 62, 70,176,194, 61, 76,205,188, 62,115,162, 53, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61, 76,205,188, 62,115,162, 53,
- 61,149, 98,194, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,149, 98,194,
- 62, 70,176,194, 60,221,171,190, 62, 70,176,194, 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,213, 83,198, 62, 30,253,179, 62, 25,153,214, 62, 52,111,106, 61,234,196,202, 62, 83, 97,100,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 61,149, 98,194,
- 62, 70,176,194, 61,213, 83,198, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,205,193, 62, 23, 31,168, 61,213, 83,198, 62, 30,253,179, 61,149, 98,194, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,149, 98,194, 62, 70,176,194, 61,234,196,202, 62, 83, 97,100, 61,179,217, 94,
- 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,239, 59, 62, 30,253,174,
- 63,131,105,154, 62, 23, 31,168, 63,131,118,175, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,131,118,175, 62, 70,176,194, 63,124, 65, 30, 62, 83, 97, 90, 63,126,239, 59, 62, 30,253,174, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,126,239, 59, 62, 30,253,174,
- 63,124, 65, 30, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124, 65, 30,
- 62, 83, 97, 90, 63,131,118,175, 62, 70,176,194, 63,129,143, 70, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,131,105,156, 61,147, 41,101, 63,115, 51, 65, 61,180,111, 83, 63,117, 49, 38, 61, 52, 64,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,117, 49, 38, 61, 52, 64,225, 63,135,148,232,
- 60,125,158,144, 63,131,105,156, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,215, 61,180,111,104, 61,128,245,122, 61,147, 41,101, 62, 25,153,224, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,135,148,232, 60,125,158,144, 63,117, 49, 38, 61, 52, 64,225, 63,121,222,208,
-178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,128,245,122, 61,147, 41,101,
- 62, 25,153,215, 61,180,111,104, 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,179, 55, 89, 61,231, 46, 38, 60,208,147, 96, 61,231, 46, 48, 61,128,245,122, 61,147, 41,101, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 61,180,111, 83, 63,131,105,156, 61,147, 41,101,
- 63,129,153,102, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,208,147, 96,
- 61,231, 46, 48, 61,179, 55, 89, 61,231, 46, 38, 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,126,239, 59, 62, 30,253,174, 63,115, 51, 65, 62, 52,111, 90, 63,115, 51, 66, 62, 7, 70,199,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 66, 62, 7, 70,199, 63,129,153,102,
- 61,231, 46, 48, 63,126,239, 59, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,131,105,154, 62, 23, 31,168, 63,126,239, 59, 62, 30,253,174, 63,129,153,102, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,153,102, 61,231, 46, 48, 63,115, 51, 66, 62, 7, 70,199, 63,115, 51, 65,
- 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,213, 83,198, 62, 30,253,179,
- 61, 76,205,193, 62, 23, 31,168, 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,179, 55, 89, 61,231, 46, 38, 62, 25,153,217, 62, 7, 70,204, 61,213, 83,198, 62, 30,253,179, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 61,213, 83,198, 62, 30,253,179,
- 62, 25,153,217, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,217,
- 62, 7, 70,204, 61,179, 55, 89, 61,231, 46, 38, 62, 25,153,215, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,122,228,192, 62,128, 45, 66, 63,115, 51, 65, 62,135, 83,151, 63,115, 51, 65, 62, 97,151,248,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 97,151,248, 63,124, 65, 30,
- 62, 83, 97, 90, 63,122,228,192, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,129,143, 70, 62,120, 76,216, 63,122,228,192, 62,128, 45, 66, 63,124, 65, 30, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124, 65, 30, 62, 83, 97, 90, 63,115, 51, 65, 62, 97,151,248, 63,115, 51, 65,
- 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,122,228,192, 62,128, 45, 66,
- 63,129,143, 70, 62,120, 76,216, 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,128,153,201, 62,146,201, 14, 63,121,234,239, 62,151,144,169, 63,122,228,192, 62,128, 45, 66, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,135, 83,151, 63,122,228,192, 62,128, 45, 66,
- 63,121,234,239, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,234,239,
- 62,151,144,169, 63,128,153,201, 62,146,201, 14, 63,127,171, 15, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 80,133, 62,174, 54, 65, 63,115, 51, 65, 62,180,111,160, 63,115, 51, 65, 62,157,231, 93,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,157,231, 93, 63,121,234,239,
- 62,151,144,169, 63,121, 80,133, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,127,171, 15, 62,169,150, 52, 63,121, 80,133, 62,174, 54, 65, 63,121,234,239, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,234,239, 62,151,144,169, 63,115, 51, 65, 62,157,231, 93, 63,115, 51, 65,
- 62,135, 83,151, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131, 23, 23, 62,166,190, 89,
- 63,127,171, 15, 62,169,150, 52, 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 59,153,200,136, 62,146,201, 14, 61, 7,133,207, 62,144,101,236, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,194, 62,165,199,186, 60,197,197,195, 62,166,190, 89,
- 61, 7,133,207, 62,144,101,236, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 7,133,207,
- 62,144,101,236, 59,153,200,136, 62,146,201, 14, 60, 71,162,255, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,163,208, 32, 62,128, 45, 79, 62,147, 92,147, 62,120, 76,252, 62,161, 23,102, 62, 83, 97,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 22,
- 62, 97,152, 2, 62,163,208, 32, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 21, 62,135, 83,156, 62,163,208, 32, 62,128, 45, 79, 62,179, 51, 22, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 22, 62, 97,152, 2, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 21,
- 62, 52,111,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,163,208, 32, 62,128, 45, 79,
- 62,179, 51, 21, 62,135, 83,156, 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,165,195,194, 62,151,144,181, 62,151, 50,134, 62,146,201, 29, 62,163,208, 32, 62,128, 45, 79, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,163,208, 32, 62,128, 45, 79,
- 62,151, 50,134, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151, 50,134,
- 62,146,201, 29, 62,165,195,194, 62,151,144,181, 62,154, 67,137, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,141, 61, 82, 62,166,190,112, 62,128, 0, 0, 62,165,199,206, 62,136,168,247, 62,144,102, 3,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,151, 50,134,
- 62,146,201, 29, 62,141, 61, 82, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,154, 67,137, 62,169,150, 70, 62,141, 61, 82, 62,166,190,112, 62,151, 50,134, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151, 50,134, 62,146,201, 29, 62,136,168,247, 62,144,102, 3, 62,147, 92,147,
- 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,166,248,150, 62,174, 54, 78,
- 62,154, 67,137, 62,169,150, 70, 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,165,195,194, 62,151,144,181, 62,179, 51, 21, 62,157,231, 98, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,180,111,165, 62,166,248,150, 62,174, 54, 78,
- 62,179, 51, 21, 62,157,231, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21,
- 62,157,231, 98, 62,165,195,194, 62,151,144,181, 62,179, 51, 21, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,115,162, 89, 62,147, 92,147, 62,120, 76,252, 62,136,168,247, 62,144,102, 3,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,110,174, 18,
- 62,144,102, 3, 62,128, 0, 0, 62,115,162, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 89, 70,217, 62,120, 76,252, 62,128, 0, 0, 62,115,162, 89, 62,110,174, 18, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,110,174, 18, 62,144,102, 3, 62,136,168,247, 62,144,102, 3, 62,128, 0, 0,
- 62,165,199,206, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,115,162, 89,
- 62, 89, 70,217, 62,120, 76,252, 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,104,130, 30, 62, 70,176,230, 62,139,190,241, 62, 70,176,230, 62,128, 0, 0, 62,115,162, 89, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,128, 0, 0, 62,115,162, 89,
- 62,139,190,241, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,139,190,241,
- 62, 70,176,230, 62,104,130, 30, 62, 70,176,230, 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,155,187, 41, 62, 30,253,205, 62,179, 51, 21, 62, 52,111,101, 62,161, 23,102, 62, 83, 97,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,139,190,241,
- 62, 70,176,230, 62,155,187, 41, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 62, 23, 31,208, 62,155,187, 41, 62, 30,253,205, 62,139,190,241, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,139,190,241, 62, 70,176,230, 62,161, 23,102, 62, 83, 97,115, 62,147, 92,147,
- 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 72,137,174, 62, 30,253,205,
- 62,128, 0, 0, 62, 23, 31,208, 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,104,130, 30, 62, 70,176,230, 62, 61,209, 51, 62, 83, 97,115, 62, 72,137,174, 62, 30,253,205, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 62, 72,137,174, 62, 30,253,205,
- 62, 61,209, 51, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 61,209, 51,
- 62, 83, 97,115, 62,104,130, 30, 62, 70,176,230, 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,127,255,255, 61,147, 41,141, 62, 25,153,215, 61,180,111,104, 62, 25,153,224, 61, 52, 64,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,224, 61, 52, 64,225, 62,179, 51, 15,
- 61, 52, 64,225, 62,127,255,255, 61,147, 41,141, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 20, 61,180,111,104, 62,127,255,255, 61,147, 41,141, 62,179, 51, 15, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 15, 61, 52, 64,225, 62, 25,153,224, 61, 52, 64,225, 62,161,175,144,
-178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,127,255,255, 61,147, 41,141,
- 62,179, 51, 20, 61,180,111,104, 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,147, 52, 12, 61,231, 46,109, 62, 89,151,231, 61,231, 46,109, 62,127,255,255, 61,147, 41,141, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,215, 61,180,111,104, 62,127,255,255, 61,147, 41,141,
- 62, 89,151,231, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 89,151,231,
- 61,231, 46,109, 62,147, 52, 12, 61,231, 46,109, 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 72,137,174, 62, 30,253,205, 62, 25,153,214, 62, 52,111,106, 62, 25,153,217, 62, 7, 70,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,217, 62, 7, 70,204, 62, 89,151,231,
- 61,231, 46,109, 62, 72,137,174, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 62, 23, 31,208, 62, 72,137,174, 62, 30,253,205, 62, 89,151,231, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 89,151,231, 61,231, 46,109, 62, 25,153,217, 62, 7, 70,204, 62, 25,153,215,
- 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,155,187, 41, 62, 30,253,205,
- 62,128, 0, 0, 62, 23, 31,208, 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,147, 52, 12, 61,231, 46,109, 62,179, 51, 19, 62, 7, 70,204, 62,155,187, 41, 62, 30,253,205, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,155,187, 41, 62, 30,253,205,
- 62,179, 51, 19, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 19,
- 62, 7, 70,204, 62,147, 52, 12, 61,231, 46,109, 62,179, 51, 20, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 56, 95,192, 62,128, 45, 79, 62, 25,153,214, 62,135, 83,156, 62, 25,153,212, 62, 97,152, 2,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,212, 62, 97,152, 2, 62, 61,209, 51,
- 62, 83, 97,115, 62, 56, 95,192, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 89, 70,217, 62,120, 76,252, 62, 56, 95,192, 62,128, 45, 79, 62, 61,209, 51, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 61,209, 51, 62, 83, 97,115, 62, 25,153,212, 62, 97,152, 2, 62, 25,153,214,
- 62, 52,111,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 56, 95,192, 62,128, 45, 79,
- 62, 89, 70,217, 62,120, 76,252, 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 81,154,245, 62,146,201, 29, 62, 52,120,125, 62,151,144,181, 62, 56, 95,192, 62,128, 45, 79, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,135, 83,156, 62, 56, 95,192, 62,128, 45, 79,
- 62, 52,120,125, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,120,125,
- 62,151,144,181, 62, 81,154,245, 62,146,201, 29, 62, 75,120,239, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 50, 14,213, 62,174, 54, 78, 62, 25,153,214, 62,180,111,165, 62, 25,153,213, 62,157,231,100,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,213, 62,157,231,100, 62, 52,120,125,
- 62,151,144,181, 62, 50, 14,213, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 75,120,239, 62,169,150, 70, 62, 50, 14,213, 62,174, 54, 78, 62, 52,120,125, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,120,125, 62,151,144,181, 62, 25,153,213, 62,157,231,100, 62, 25,153,214,
- 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101,133, 91, 62,166,190,112,
- 62, 75,120,239, 62,169,150, 70, 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 81,154,245, 62,146,201, 29, 62,110,174, 18, 62,144,102, 3, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,165,199,206, 62,101,133, 91, 62,166,190,112,
- 62,110,174, 18, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,110,174, 18,
- 62,144,102, 3, 62, 81,154,245, 62,146,201, 29, 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 5, 27, 64, 62,128, 45, 66, 62,249,194,232, 62,120, 76,216, 63, 3,190,226, 62, 83, 97, 90,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191,
- 62, 97,151,248, 63, 5, 27, 64, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,191, 62,135, 83,149, 63, 5, 27, 64, 62,128, 45, 66, 63, 12,204,191, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 97,151,248, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191,
- 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 5, 27, 64, 62,128, 45, 66,
- 63, 12,204,191, 62,135, 83,149, 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 6, 21, 17, 62,151,144,169, 62,253,152,222, 62,146,201, 14, 63, 5, 27, 64, 62,128, 45, 66, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 63, 5, 27, 64, 62,128, 45, 66,
- 62,253,152,222, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,152,222,
- 62,146,201, 14, 63, 6, 21, 17, 62,151,144,169, 63, 0, 84,241, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,243,163,164, 62,166,190, 89, 62,230,102, 72, 62,165,199,183, 62,239, 15, 70, 62,144,101,233,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,253,152,222,
- 62,146,201, 14, 62,243,163,164, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 0, 84,241, 62,169,150, 52, 62,243,163,164, 62,166,190, 89, 62,253,152,222, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,152,222, 62,146,201, 14, 62,239, 15, 70, 62,144,101,233, 62,249,194,232,
- 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,175,123, 62,174, 54, 65,
- 63, 0, 84,241, 62,169,150, 52, 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 6, 21, 17, 62,151,144,169, 63, 12,204,191, 62,157,231, 90, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,180,111,160, 63, 6,175,123, 62,174, 54, 65,
- 63, 12,204,191, 62,157,231, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191,
- 62,157,231, 90, 63, 6, 21, 17, 62,151,144,169, 63, 12,204,191, 62,135, 83,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,115,162, 53, 62,249,194,232, 62,120, 76,216, 62,239, 15, 70, 62,144,101,233,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,221,189, 75,
- 62,144,101,238, 62,230,102, 72, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,211, 9,168, 62,120, 76,222, 62,230,102, 72, 62,115,162, 53, 62,221,189, 75, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,221,189, 75, 62,144,101,238, 62,239, 15, 70, 62,144,101,233, 62,230,102, 72,
- 62,165,199,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,115,162, 53,
- 62,211, 9,168, 62,120, 76,222, 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,218,167, 80, 62, 70,176,194, 62,242, 37, 68, 62, 70,176,194, 62,230,102, 72, 62,115,162, 53, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 62,230,102, 72, 62,115,162, 53,
- 62,242, 37, 68, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,242, 37, 68,
- 62, 70,176,194, 62,218,167, 80, 62, 70,176,194, 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 16,197, 62, 30,253,174, 63, 12,204,191, 62, 52,111, 90, 63, 3,190,226, 62, 83, 97, 90,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 62,242, 37, 68,
- 62, 70,176,194, 63, 1, 16,197, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102, 72, 62, 23, 31,168, 63, 1, 16,197, 62, 30,253,174, 62,242, 37, 68, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,242, 37, 68, 62, 70,176,194, 63, 3,190,226, 62, 83, 97, 90, 62,249,194,232,
- 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,171, 14, 62, 30,253,179,
- 62,230,102, 72, 62, 23, 31,168, 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,218,167, 80, 62, 70,176,194, 62,197, 78,205, 62, 83, 97, 95, 62,202,171, 14, 62, 30,253,179, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,202,171, 14, 62, 30,253,179,
- 62,197, 78,205, 62, 83, 97, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,197, 78,205,
- 62, 83, 97, 95, 62,218,167, 80, 62, 70,176,194, 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 63, 61,147, 41,101, 62,179, 51, 20, 61,180,111,104, 62,179, 51, 15, 61, 52, 64,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 15, 61, 52, 64,225, 63, 12,204,189,
- 61, 52, 64,225, 62,230,102, 63, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,191, 61,180,111, 83, 62,230,102, 63, 61,147, 41,101, 63, 12,204,189, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,189, 61, 52, 64,225, 62,179, 51, 15, 61, 52, 64,225, 62,161,175,144,
-178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 63, 61,147, 41,101,
- 63, 12,204,191, 61,180,111, 83, 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,249,154,104, 61,231, 46, 48, 62,211, 50, 42, 61,231, 46, 48, 62,230,102, 63, 61,147, 41,101, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 20, 61,180,111,104, 62,230,102, 63, 61,147, 41,101,
- 62,211, 50, 42, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211, 50, 42,
- 61,231, 46, 48, 62,249,154,104, 61,231, 46, 48, 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,202,171, 14, 62, 30,253,179, 62,179, 51, 21, 62, 52,111,101, 62,179, 51, 19, 62, 7, 70,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 19, 62, 7, 70,204, 62,211, 50, 42,
- 61,231, 46, 48, 62,202,171, 14, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102, 72, 62, 23, 31,168, 62,202,171, 14, 62, 30,253,179, 62,211, 50, 42, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211, 50, 42, 61,231, 46, 48, 62,179, 51, 19, 62, 7, 70,204, 62,179, 51, 20,
- 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 16,197, 62, 30,253,174,
- 62,230,102, 72, 62, 23, 31,168, 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,249,154,104, 61,231, 46, 48, 63, 12,204,191, 62, 7, 70,199, 63, 1, 16,197, 62, 30,253,174, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 1, 16,197, 62, 30,253,174,
- 63, 12,204,191, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191,
- 62, 7, 70,199, 62,249,154,104, 61,231, 46, 48, 63, 12,204,191, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,194,150, 19, 62,128, 45, 72, 62,179, 51, 21, 62,135, 83,156, 62,179, 51, 22, 62, 97,152, 2,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 22, 62, 97,152, 2, 62,197, 78,205,
- 62, 83, 97, 95, 62,194,150, 19, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,211, 9,168, 62,120, 76,222, 62,194,150, 19, 62,128, 45, 72, 62,197, 78,205, 62, 83, 97, 95, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,197, 78,205, 62, 83, 97, 95, 62,179, 51, 22, 62, 97,152, 2, 62,179, 51, 21,
- 62, 52,111,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,194,150, 19, 62,128, 45, 72,
- 62,211, 9,168, 62,120, 76,222, 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,207, 51,179, 62,146,201, 17, 62,192,162,113, 62,151,144,174, 62,194,150, 19, 62,128, 45, 72, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,135, 83,156, 62,194,150, 19, 62,128, 45, 72,
- 62,192,162,113, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,162,113,
- 62,151,144,174, 62,207, 51,179, 62,146,201, 17, 62,204, 34,175, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,191,109,154, 62,174, 54, 68, 62,179, 51, 21, 62,180,111,165, 62,179, 51, 21, 62,157,231, 98,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,157,231, 98, 62,192,162,113,
- 62,151,144,174, 62,191,109,154, 62,174, 54, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,204, 34,175, 62,169,150, 54, 62,191,109,154, 62,174, 54, 68, 62,192,162,113, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,162,113, 62,151,144,174, 62,179, 51, 21, 62,157,231, 98, 62,179, 51, 21,
- 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217, 40,237, 62,166,190, 91,
- 62,204, 34,175, 62,169,150, 54, 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,207, 51,179, 62,146,201, 17, 62,221,189, 75, 62,144,101,238, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,165,199,183, 62,217, 40,237, 62,166,190, 91,
- 62,221,189, 75, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,221,189, 75,
- 62,144,101,238, 62,207, 51,179, 62,146,201, 17, 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 56, 78,134, 62,128, 45,117, 63, 48, 20,188, 62,120, 77, 37, 63, 54,242, 42, 62, 83, 97,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0,
- 62, 97,152,115, 63, 56, 78,134, 62,128, 45,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 62,135, 83,218, 63, 56, 78,134, 62,128, 45,117, 63, 64, 0, 0, 62, 97,152,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 97,152,115, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0,
- 62, 52,111,202, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 56, 78,134, 62,128, 45,117,
- 63, 64, 0, 0, 62,135, 83,218, 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 57, 72, 87, 62,151,144,219, 63, 49,255,184, 62,146,201, 52, 63, 56, 78,134, 62,128, 45,117, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 56, 78,134, 62,128, 45,117,
- 63, 49,255,184, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 49,255,184,
- 62,146,201, 52, 63, 57, 72, 87, 62,151,144,219, 63, 51,136, 58, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 5, 26, 62,166,190,117, 63, 38,102,107, 62,165,199,201, 63, 42,186,235, 62,144,102, 5,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 49,255,184,
- 62,146,201, 52, 63, 45, 5, 26, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 51,136, 58, 62,169,150, 90, 63, 45, 5, 26, 62,166,190,117, 63, 49,255,184, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 49,255,184, 62,146,201, 52, 63, 42,186,235, 62,144,102, 5, 63, 48, 20,188,
- 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,226,196, 62,174, 54,114,
- 63, 51,136, 58, 62,169,150, 90, 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 57, 72, 87, 62,151,144,219, 63, 64, 0, 0, 62,157,231,162, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,180,111,211, 63, 57,226,196, 62,174, 54,114,
- 63, 64, 0, 0, 62,157,231,162, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0,
- 62,157,231,162, 63, 57, 72, 87, 62,151,144,219, 63, 64, 0, 0, 62,135, 83,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,115,162, 79, 63, 48, 20,188, 62,120, 77, 37, 63, 42,186,235, 62,144,102, 5,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 34, 17,234,
- 62,144,101,243, 63, 38,102,107, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 28,184, 21, 62,120, 76,222, 63, 38,102,107, 62,115,162, 79, 63, 34, 17,234, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34, 17,234, 62,144,101,243, 63, 42,186,235, 62,144,102, 5, 63, 38,102,107,
- 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,115,162, 79,
- 63, 28,184, 21, 62,120, 76,222, 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 32,134,234, 62, 70,176,204, 63, 44, 69,233, 62, 70,176,245, 63, 38,102,107, 62,115,162, 79, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 38,102,107, 62,115,162, 79,
- 63, 44, 69,233, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44, 69,233,
- 62, 70,176,245, 63, 32,134,234, 62, 70,176,204, 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 52, 68, 9, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 54,242, 42, 62, 83, 97,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 44, 69,233,
- 62, 70,176,245, 63, 52, 68, 9, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,104, 62, 23, 31,198, 63, 52, 68, 9, 62, 30,253,241, 63, 44, 69,233, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44, 69,233, 62, 70,176,245, 63, 54,242, 42, 62, 83, 97,181, 63, 48, 20,188,
- 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,136,195, 62, 30,253,179,
- 63, 38,102,104, 62, 23, 31,198, 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 32,134,234, 62, 70,176,204, 63, 21,218,162, 62, 83, 97, 84, 63, 24,136,195, 62, 30,253,179, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 24,136,195, 62, 30,253,179,
- 63, 21,218,162, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 21,218,162,
- 62, 83, 97, 84, 63, 32,134,234, 62, 70,176,204, 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,104, 61,147, 41,111, 63, 12,204,191, 61,180,111, 83, 63, 12,204,189, 61, 52, 64,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,189, 61, 52, 64,225, 63, 64, 0, 0,
- 61, 52, 65,111, 63, 38,102,104, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 61,180,111,195, 63, 38,102,104, 61,147, 41,111, 63, 64, 0, 0, 61, 52, 65,111, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61, 52, 65,111, 63, 12,204,189, 61, 52, 64,225, 63,121,222,208,
-178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,104, 61,147, 41,111,
- 63, 64, 0, 0, 61,180,111,195, 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 48, 0,122, 61,231, 46,120, 63, 28,204, 85, 61,231, 46, 48, 63, 38,102,104, 61,147, 41,111, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 61,180,111, 83, 63, 38,102,104, 61,147, 41,111,
- 63, 28,204, 85, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,204, 85,
- 61,231, 46, 48, 63, 48, 0,122, 61,231, 46,120, 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,136,195, 62, 30,253,179, 63, 12,204,191, 62, 52,111, 90, 63, 12,204,191, 62, 7, 70,199,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 7, 70,199, 63, 28,204, 85,
- 61,231, 46, 48, 63, 24,136,195, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,104, 62, 23, 31,198, 63, 24,136,195, 62, 30,253,179, 63, 28,204, 85, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,204, 85, 61,231, 46, 48, 63, 12,204,191, 62, 7, 70,199, 63, 12,204,191,
- 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 52, 68, 9, 62, 30,253,241,
- 63, 38,102,104, 62, 23, 31,198, 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 48, 0,122, 61,231, 46,120, 63, 64, 0, 0, 62, 7, 71, 24, 63, 52, 68, 9, 62, 30,253,241, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 52, 68, 9, 62, 30,253,241,
- 63, 64, 0, 0, 62, 7, 71, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0,
- 62, 7, 71, 24, 63, 48, 0,122, 61,231, 46,120, 63, 64, 0, 0, 61,180,111,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 20,126, 68, 62,128, 45, 64, 63, 12,204,191, 62,135, 83,149, 63, 12,204,191, 62, 97,151,248,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 97,151,248, 63, 21,218,162,
- 62, 83, 97, 84, 63, 20,126, 68, 62,128, 45, 64, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 28,184, 21, 62,120, 76,222, 63, 20,126, 68, 62,128, 45, 64, 63, 21,218,162, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 21,218,162, 62, 83, 97, 84, 63, 12,204,191, 62, 97,151,248, 63, 12,204,191,
- 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 20,126, 68, 62,128, 45, 64,
- 63, 28,184, 21, 62,120, 76,222, 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 26,205, 25, 62,146,201, 14, 63, 19,132,114, 62,151,144,169, 63, 20,126, 68, 62,128, 45, 64, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,135, 83,149, 63, 20,126, 68, 62,128, 45, 64,
- 63, 19,132,114, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,132,114,
- 62,151,144,169, 63, 26,205, 25, 62,146,201, 14, 63, 25, 68,150, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,234, 7, 62,174, 54, 65, 63, 12,204,191, 62,180,111,160, 63, 12,204,191, 62,157,231, 90,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,157,231, 90, 63, 19,132,114,
- 62,151,144,169, 63, 18,234, 7, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 25, 68,150, 62,169,150, 54, 63, 18,234, 7, 62,174, 54, 65, 63, 19,132,114, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,132,114, 62,151,144,169, 63, 12,204,191, 62,157,231, 90, 63, 12,204,191,
- 62,135, 83,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,199,185, 62,166,190, 96,
- 63, 25, 68,150, 62,169,150, 54, 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 26,205, 25, 62,146,201, 14, 63, 34, 17,234, 62,144,101,243, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,165,199,201, 63, 31,199,185, 62,166,190, 96,
- 63, 34, 17,234, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34, 17,234,
- 62,144,101,243, 63, 26,205, 25, 62,146,201, 14, 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 80, 0, 7,254, 48, 32, 0, 0, 0, 59, 0, 0, 20, 0,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 82,186, 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,
+ 68, 65, 84, 65, 0,100, 0, 0, 72, 18,185, 3, 54, 0, 0, 0, 0, 5, 0, 0, 27, 1, 0, 0,102, 0, 0, 0,146, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,146, 1, 0, 0,171, 0, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 0, 0, 0,
+ 27, 1, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,171, 0, 0, 0,146, 1, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,147, 1, 0, 0, 46, 0, 0, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1, 0, 0,148, 1, 0, 0,
+147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 0, 0, 0,147, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+148, 1, 0, 0,146, 1, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 1, 0, 0, 12, 0, 0, 0,165, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,165, 0, 0, 0,148, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 0, 0, 0,
+ 26, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,148, 1, 0, 0,165, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,147, 1, 0, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,164, 0, 0, 0,170, 0, 0, 0,
+147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 0, 0, 0,147, 1, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+170, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 1, 0, 0,102, 0, 0, 0,149, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,149, 1, 0, 0, 28, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 0, 0, 0,
+ 26, 1, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 1, 0, 0,149, 1, 0, 0,103, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,150, 1, 0, 0,103, 0, 0, 0,149, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,149, 1, 0, 0,151, 1, 0, 0,
+150, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 0, 0, 0,150, 1, 0, 0,151, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+151, 1, 0, 0,149, 1, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 1, 0, 0, 14, 0, 0, 0, 31, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 31, 1, 0, 0,151, 1, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 0, 0, 0,
+ 27, 1, 0, 0,151, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,151, 1, 0, 0, 31, 1, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,150, 1, 0, 0,104, 0, 0, 0, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 1, 0, 0, 29, 1, 0, 0,
+150, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 0, 0, 0,150, 1, 0, 0, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 29, 1, 0, 0, 30, 1, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 0, 0, 0, 45, 0, 0, 0,152, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,152, 1, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0,
+168, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 0, 0, 0,152, 1, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,153, 1, 0, 0, 47, 0, 0, 0,152, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,152, 1, 0, 0,154, 1, 0, 0,
+153, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 0, 0, 0,153, 1, 0, 0,154, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+154, 1, 0, 0,152, 1, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,169, 0, 0, 0, 13, 0, 0, 0, 30, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 30, 1, 0, 0,154, 1, 0, 0,169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 0, 0, 0,
+169, 0, 0, 0,154, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,154, 1, 0, 0, 30, 1, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,153, 1, 0, 0,104, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 1, 0, 0,173, 0, 0, 0,
+153, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 0, 0, 0,153, 1, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+173, 0, 0, 0, 31, 1, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 0, 0, 0, 44, 0, 0, 0,155, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,155, 1, 0, 0, 29, 1, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 0, 0, 0,
+167, 0, 0, 0, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 1, 0, 0,155, 1, 0, 0,103, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,156, 1, 0, 0,103, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,155, 1, 0, 0,157, 1, 0, 0,
+156, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 0, 0, 0,156, 1, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+157, 1, 0, 0,155, 1, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,166, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,162, 0, 0, 0,157, 1, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 0, 0, 0,
+166, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,157, 1, 0, 0,162, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,156, 1, 0, 0, 42, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,163, 0, 0, 0, 28, 1, 0, 0,
+156, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 0, 0, 0,156, 1, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 28, 1, 0, 0,163, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,158, 1, 0, 0,105, 0, 0, 0, 33, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 33, 1, 0, 0,179, 0, 0, 0,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 0, 0, 0,
+158, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 33, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,158, 1, 0, 0, 50, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 1, 0, 0,160, 1, 0, 0,
+158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 0, 0, 0,158, 1, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+160, 1, 0, 0,159, 1, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 0, 0, 0, 12, 0, 0, 0, 32, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 32, 1, 0, 0,160, 1, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 0, 0, 0,
+165, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160, 1, 0, 0, 32, 1, 0, 0,105, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,164, 0, 0, 0, 43, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 1, 0, 0,178, 0, 0, 0,
+164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0,164, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+178, 0, 0, 0,159, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,161, 1, 0, 0,105, 0, 0, 0, 32, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 32, 1, 0, 0, 34, 1, 0, 0,161, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 0, 0, 0,
+161, 1, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 1, 0, 0, 32, 1, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,161, 1, 0, 0,106, 0, 0, 0,162, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 1, 0, 0,163, 1, 0, 0,
+161, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 0, 0, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+163, 1, 0, 0,162, 1, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 1, 0, 0, 16, 0, 0, 0, 33, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 33, 1, 0, 0,163, 1, 0, 0, 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 0, 0, 0,
+ 37, 1, 0, 0,163, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,163, 1, 0, 0, 33, 1, 0, 0,105, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 36, 1, 0, 0,107, 0, 0, 0,162, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 1, 0, 0, 35, 1, 0, 0,
+ 36, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 0, 0, 0, 36, 1, 0, 0, 35, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 35, 1, 0, 0,162, 1, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,164, 1, 0, 0, 49, 0, 0, 0,176, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,176, 0, 0, 0,180, 0, 0, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 0, 0, 0,
+164, 1, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,180, 0, 0, 0,176, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,164, 1, 0, 0, 51, 0, 0, 0,165, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 1, 0, 0,166, 1, 0, 0,
+164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 0, 0, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+166, 1, 0, 0,165, 1, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 1, 0, 0, 15, 0, 0, 0,177, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,177, 0, 0, 0,166, 1, 0, 0, 36, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 0, 0, 0,
+ 36, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,166, 1, 0, 0,177, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 37, 1, 0, 0,107, 0, 0, 0,165, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 1, 0, 0,181, 0, 0, 0,
+ 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 0, 0, 0, 37, 1, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+181, 0, 0, 0,165, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 1, 0, 0, 48, 0, 0, 0,175, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,175, 0, 0, 0, 35, 1, 0, 0,167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 0, 0, 0,
+167, 1, 0, 0, 35, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 35, 1, 0, 0,175, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,167, 1, 0, 0,106, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 1, 0, 0,169, 1, 0, 0,
+167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 0, 0, 0,167, 1, 0, 0,169, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+169, 1, 0, 0,168, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 0, 0, 0, 0, 0, 0, 0,174, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,174, 0, 0, 0,169, 1, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 0, 0, 0,
+162, 0, 0, 0,169, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,169, 1, 0, 0,174, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,163, 0, 0, 0, 42, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 1, 0, 0, 34, 1, 0, 0,
+163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 0, 0, 0,163, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 34, 1, 0, 0,168, 1, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 1, 0, 0,108, 0, 0, 0,170, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,170, 1, 0, 0,187, 0, 0, 0, 39, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 0, 0, 0,
+ 39, 1, 0, 0,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,187, 0, 0, 0,170, 1, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,171, 1, 0, 0, 54, 0, 0, 0,170, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,170, 1, 0, 0,172, 1, 0, 0,
+171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 0, 0, 0,171, 1, 0, 0,172, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+172, 1, 0, 0,170, 1, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 1, 0, 0, 13, 0, 0, 0,169, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,169, 0, 0, 0,172, 1, 0, 0, 38, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 0, 0, 0,
+ 38, 1, 0, 0,172, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 1, 0, 0,169, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,171, 1, 0, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 0, 0, 0,186, 0, 0, 0,
+171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 0, 0, 0,171, 1, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+186, 0, 0, 0,168, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 1, 0, 0,108, 0, 0, 0,173, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,173, 1, 0, 0, 40, 1, 0, 0, 38, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 0, 0, 0,
+ 38, 1, 0, 0, 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 1, 0, 0,173, 1, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,174, 1, 0, 0,109, 0, 0, 0,173, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,173, 1, 0, 0,175, 1, 0, 0,
+174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 0, 0, 0,174, 1, 0, 0,175, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+175, 1, 0, 0,173, 1, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 1, 0, 0, 18, 0, 0, 0, 43, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 43, 1, 0, 0,175, 1, 0, 0, 39, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 0, 0, 0,
+ 39, 1, 0, 0,175, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,175, 1, 0, 0, 43, 1, 0, 0,110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,174, 1, 0, 0,110, 0, 0, 0, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 1, 0, 0, 41, 1, 0, 0,
+174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 0, 0, 0,174, 1, 0, 0, 41, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 41, 1, 0, 0, 42, 1, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 0, 0, 0, 53, 0, 0, 0,176, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,176, 1, 0, 0,188, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,
+184, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,188, 0, 0, 0,176, 1, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,177, 1, 0, 0, 55, 0, 0, 0,176, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 1, 0, 0,178, 1, 0, 0,
+177, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 0, 0, 0,177, 1, 0, 0,178, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+178, 1, 0, 0,176, 1, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 0, 0, 0, 17, 0, 0, 0, 42, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 42, 1, 0, 0,178, 1, 0, 0,185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 53, 0, 0, 0,
+185, 0, 0, 0,178, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,178, 1, 0, 0, 42, 1, 0, 0,110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,177, 1, 0, 0,110, 0, 0, 0, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 1, 0, 0,189, 0, 0, 0,
+177, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 0, 0, 0,177, 1, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+189, 0, 0, 0, 43, 1, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,183, 0, 0, 0, 52, 0, 0, 0,179, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,179, 1, 0, 0, 41, 1, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 0, 0, 0,
+183, 0, 0, 0, 41, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 1, 0, 0,179, 1, 0, 0,109, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,180, 1, 0, 0,109, 0, 0, 0,179, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 1, 0, 0,181, 1, 0, 0,
+180, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 0, 0, 0,180, 1, 0, 0,181, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+181, 1, 0, 0,179, 1, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,166, 0, 0, 0,181, 1, 0, 0,182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 0, 0, 0,
+182, 0, 0, 0,181, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,181, 1, 0, 0,166, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,180, 1, 0, 0, 44, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 0, 0, 0, 40, 1, 0, 0,
+180, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 0, 0, 0,180, 1, 0, 0, 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 40, 1, 0, 0,167, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 1, 0, 0,111, 0, 0, 0,182, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,182, 1, 0, 0,195, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 0, 0, 0,
+ 45, 1, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0,182, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,183, 1, 0, 0, 58, 0, 0, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 1, 0, 0,184, 1, 0, 0,
+183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 53, 0, 0, 0,183, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+184, 1, 0, 0,182, 1, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 1, 0, 0, 17, 0, 0, 0,185, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,185, 0, 0, 0,184, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 0, 0, 0,
+ 44, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 1, 0, 0,185, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,183, 1, 0, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 0, 0, 0,194, 0, 0, 0,
+183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 0, 0, 0,183, 1, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+194, 0, 0, 0,184, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 1, 0, 0,111, 0, 0, 0,185, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,185, 1, 0, 0, 46, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 0, 0, 0,
+ 44, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 1, 0, 0,185, 1, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,186, 1, 0, 0,112, 0, 0, 0,185, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 1, 0, 0,187, 1, 0, 0,
+186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 0, 0, 0,186, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+187, 1, 0, 0,185, 1, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 1, 0, 0, 20, 0, 0, 0, 49, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 49, 1, 0, 0,187, 1, 0, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 0, 0, 0,
+ 45, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,187, 1, 0, 0, 49, 1, 0, 0,113, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,186, 1, 0, 0,113, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 1, 0, 0, 47, 1, 0, 0,
+186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 0, 0, 0,186, 1, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 47, 1, 0, 0, 48, 1, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,192, 0, 0, 0, 57, 0, 0, 0,188, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,188, 1, 0, 0,196, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0,
+192, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,196, 0, 0, 0,188, 1, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,189, 1, 0, 0, 59, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,188, 1, 0, 0,190, 1, 0, 0,
+189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 0, 0, 0,189, 1, 0, 0,190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+190, 1, 0, 0,188, 1, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,193, 0, 0, 0, 19, 0, 0, 0, 48, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 48, 1, 0, 0,190, 1, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 0, 0, 0,
+193, 0, 0, 0,190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,190, 1, 0, 0, 48, 1, 0, 0,113, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,189, 1, 0, 0,113, 0, 0, 0, 49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 1, 0, 0,197, 0, 0, 0,
+189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 59, 0, 0, 0,189, 1, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+197, 0, 0, 0, 49, 1, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 0, 0, 0, 56, 0, 0, 0,191, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,191, 1, 0, 0, 47, 1, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 0, 0, 0,
+191, 0, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 1, 0, 0,191, 1, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,192, 1, 0, 0,112, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 1, 0, 0,193, 1, 0, 0,
+192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 0, 0, 0,192, 1, 0, 0,193, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+193, 1, 0, 0,191, 1, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,190, 0, 0, 0, 0, 0, 0, 0,182, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,182, 0, 0, 0,193, 1, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 56, 0, 0, 0,
+190, 0, 0, 0,193, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,193, 1, 0, 0,182, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,192, 1, 0, 0, 52, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,183, 0, 0, 0, 46, 1, 0, 0,
+192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 0, 0, 0,192, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 46, 1, 0, 0,183, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 1, 0, 0,114, 0, 0, 0,194, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,194, 1, 0, 0,199, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 0, 0, 0,
+ 51, 1, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,199, 0, 0, 0,194, 1, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,195, 1, 0, 0, 60, 0, 0, 0,194, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,194, 1, 0, 0,196, 1, 0, 0,
+195, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 0, 0, 0,195, 1, 0, 0,196, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+196, 1, 0, 0,194, 1, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 1, 0, 0, 19, 0, 0, 0,193, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,193, 0, 0, 0,196, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 0, 0, 0,
+ 50, 1, 0, 0,196, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,196, 1, 0, 0,193, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,195, 1, 0, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,192, 0, 0, 0,198, 0, 0, 0,
+195, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 0, 0, 0,195, 1, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+198, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 1, 0, 0,114, 0, 0, 0,197, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,197, 1, 0, 0, 53, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 0, 0, 0,
+ 50, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 53, 1, 0, 0,197, 1, 0, 0,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,198, 1, 0, 0,115, 0, 0, 0,197, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 1, 0, 0,199, 1, 0, 0,
+198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 0, 0, 0,198, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+199, 1, 0, 0,197, 1, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 1, 0, 0, 21, 0, 0, 0, 55, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 55, 1, 0, 0,199, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 0, 0, 0,
+ 51, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,199, 1, 0, 0, 55, 1, 0, 0,116, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,198, 1, 0, 0,116, 0, 0, 0, 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 1, 0, 0, 52, 1, 0, 0,
+198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 0, 0, 0,198, 1, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 52, 1, 0, 0, 54, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 0, 0, 0, 49, 0, 0, 0,200, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,200, 1, 0, 0,200, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 0, 0, 0,
+176, 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,200, 0, 0, 0,200, 1, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,201, 1, 0, 0, 61, 0, 0, 0,200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,200, 1, 0, 0,202, 1, 0, 0,
+201, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 0, 0, 0,201, 1, 0, 0,202, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+202, 1, 0, 0,200, 1, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,177, 0, 0, 0, 15, 0, 0, 0, 54, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 54, 1, 0, 0,202, 1, 0, 0,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 0, 0, 0,
+177, 0, 0, 0,202, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,202, 1, 0, 0, 54, 1, 0, 0,116, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,201, 1, 0, 0,116, 0, 0, 0, 55, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 1, 0, 0,201, 0, 0, 0,
+201, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 0, 0, 0,201, 1, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+201, 0, 0, 0, 55, 1, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,175, 0, 0, 0, 48, 0, 0, 0,203, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,203, 1, 0, 0, 52, 1, 0, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 0, 0, 0,
+175, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 1, 0, 0,203, 1, 0, 0,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,204, 1, 0, 0,115, 0, 0, 0,203, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 1, 0, 0,205, 1, 0, 0,
+204, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 56, 0, 0, 0,204, 1, 0, 0,205, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+205, 1, 0, 0,203, 1, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,174, 0, 0, 0, 0, 0, 0, 0,190, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,190, 0, 0, 0,205, 1, 0, 0,174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 0, 0, 0,
+174, 0, 0, 0,205, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,205, 1, 0, 0,190, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,204, 1, 0, 0, 56, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 0, 0, 0, 53, 1, 0, 0,
+204, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 0, 0, 0,204, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 53, 1, 0, 0,191, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,206, 1, 0, 0,117, 0, 0, 0, 57, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 57, 1, 0, 0,207, 0, 0, 0,206, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 0, 0, 0,
+206, 1, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0, 57, 1, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,206, 1, 0, 0, 64, 0, 0, 0,207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 1, 0, 0,208, 1, 0, 0,
+206, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 0, 0, 0,206, 1, 0, 0,208, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+208, 1, 0, 0,207, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 16, 0, 0, 0, 56, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 56, 1, 0, 0,208, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 0, 0, 0,
+179, 0, 0, 0,208, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 1, 0, 0, 56, 1, 0, 0,117, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,178, 0, 0, 0, 50, 0, 0, 0,207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 1, 0, 0,206, 0, 0, 0,
+178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0,178, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+206, 0, 0, 0,207, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,209, 1, 0, 0,117, 0, 0, 0, 56, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 56, 1, 0, 0, 58, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 0, 0, 0,
+209, 1, 0, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 1, 0, 0, 56, 1, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,209, 1, 0, 0,118, 0, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 1, 0, 0,211, 1, 0, 0,
+209, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 0, 0, 0,209, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+211, 1, 0, 0,210, 1, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 1, 0, 0, 23, 0, 0, 0, 57, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 57, 1, 0, 0,211, 1, 0, 0, 61, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 0, 0, 0,
+ 61, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,211, 1, 0, 0, 57, 1, 0, 0,117, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 60, 1, 0, 0,119, 0, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 1, 0, 0, 59, 1, 0, 0,
+ 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 0, 0, 0, 60, 1, 0, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 59, 1, 0, 0,210, 1, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,212, 1, 0, 0, 63, 0, 0, 0,204, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,204, 0, 0, 0,208, 0, 0, 0,212, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 0, 0, 0,
+212, 1, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 0, 0, 0,204, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,212, 1, 0, 0, 65, 0, 0, 0,213, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 1, 0, 0,214, 1, 0, 0,
+212, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 0, 0, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+214, 1, 0, 0,213, 1, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 1, 0, 0, 22, 0, 0, 0,205, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,205, 0, 0, 0,214, 1, 0, 0, 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 0, 0, 0,
+ 60, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,214, 1, 0, 0,205, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 61, 1, 0, 0,119, 0, 0, 0,213, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 1, 0, 0,209, 0, 0, 0,
+ 61, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 0, 0, 0, 61, 1, 0, 0,209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+209, 0, 0, 0,213, 1, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 1, 0, 0, 62, 0, 0, 0,203, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,203, 0, 0, 0, 59, 1, 0, 0,215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 0, 0, 0,
+215, 1, 0, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 59, 1, 0, 0,203, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,215, 1, 0, 0,118, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 1, 0, 0,217, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 0, 0, 0,215, 1, 0, 0,217, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+217, 1, 0, 0,216, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,180, 0, 0, 0, 5, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,202, 0, 0, 0,217, 1, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 0, 0, 0,
+180, 0, 0, 0,217, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,217, 1, 0, 0,202, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,181, 0, 0, 0, 51, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 1, 0, 0, 58, 1, 0, 0,
+181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 0, 0, 0,181, 0, 0, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 58, 1, 0, 0,216, 1, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,218, 1, 0, 0,120, 0, 0, 0, 63, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 63, 1, 0, 0,215, 0, 0, 0,218, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 0, 0, 0,
+218, 1, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 0, 0, 0, 63, 1, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,218, 1, 0, 0, 68, 0, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 1, 0, 0,220, 1, 0, 0,
+218, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 0, 0, 0,218, 1, 0, 0,220, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+220, 1, 0, 0,219, 1, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,173, 0, 0, 0, 14, 0, 0, 0, 62, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 62, 1, 0, 0,220, 1, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 0, 0, 0,
+173, 0, 0, 0,220, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,220, 1, 0, 0, 62, 1, 0, 0,120, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,172, 0, 0, 0, 47, 0, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 1, 0, 0,214, 0, 0, 0,
+172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0,172, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+214, 0, 0, 0,219, 1, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,221, 1, 0, 0,120, 0, 0, 0, 62, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 62, 1, 0, 0, 64, 1, 0, 0,221, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 0, 0, 0,
+221, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 1, 0, 0, 62, 1, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,221, 1, 0, 0,121, 0, 0, 0,222, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,222, 1, 0, 0,223, 1, 0, 0,
+221, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 0, 0, 0,221, 1, 0, 0,223, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+223, 1, 0, 0,222, 1, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 1, 0, 0, 25, 0, 0, 0, 63, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 63, 1, 0, 0,223, 1, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 0, 0, 0,
+ 67, 1, 0, 0,223, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 1, 0, 0, 63, 1, 0, 0,120, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 66, 1, 0, 0,122, 0, 0, 0,222, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,222, 1, 0, 0, 65, 1, 0, 0,
+ 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 0, 0, 0, 66, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 65, 1, 0, 0,222, 1, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 1, 0, 0, 67, 0, 0, 0,212, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,212, 0, 0, 0,216, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 0, 0, 0,
+224, 1, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 0, 0, 0,212, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,224, 1, 0, 0, 69, 0, 0, 0,225, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,225, 1, 0, 0,226, 1, 0, 0,
+224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 0, 0, 0,224, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+226, 1, 0, 0,225, 1, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 1, 0, 0, 24, 0, 0, 0,213, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,213, 0, 0, 0,226, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 0, 0, 0,
+ 66, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,226, 1, 0, 0,213, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 67, 1, 0, 0,122, 0, 0, 0,225, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,225, 1, 0, 0,217, 0, 0, 0,
+ 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 0, 0, 0, 67, 1, 0, 0,217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+217, 0, 0, 0,225, 1, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,227, 1, 0, 0, 66, 0, 0, 0,211, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,211, 0, 0, 0, 65, 1, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 0, 0, 0,
+227, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 1, 0, 0,211, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,227, 1, 0, 0,121, 0, 0, 0,228, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 1, 0, 0,229, 1, 0, 0,
+227, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 0, 0, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+229, 1, 0, 0,228, 1, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,170, 0, 0, 0, 1, 0, 0, 0,210, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 0,229, 1, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 0, 0, 0,
+170, 0, 0, 0,229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,229, 1, 0, 0,210, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,171, 0, 0, 0, 46, 0, 0, 0,228, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 1, 0, 0, 64, 1, 0, 0,
+171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 0, 0, 0,171, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 64, 1, 0, 0,228, 1, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,230, 1, 0, 0,123, 0, 0, 0, 69, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 69, 1, 0, 0,223, 0, 0, 0,230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 0, 0, 0,
+230, 1, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 0, 0, 0, 69, 1, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,230, 1, 0, 0, 72, 0, 0, 0,231, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 1, 0, 0,232, 1, 0, 0,
+230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 0, 0, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+232, 1, 0, 0,231, 1, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,189, 0, 0, 0, 18, 0, 0, 0, 68, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 68, 1, 0, 0,232, 1, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 0, 0, 0,
+189, 0, 0, 0,232, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 1, 0, 0, 68, 1, 0, 0,123, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,188, 0, 0, 0, 55, 0, 0, 0,231, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 1, 0, 0,222, 0, 0, 0,
+188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,188, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+222, 0, 0, 0,231, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,233, 1, 0, 0,123, 0, 0, 0, 68, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 68, 1, 0, 0, 70, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 0, 0, 0,
+233, 1, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 1, 0, 0, 68, 1, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,233, 1, 0, 0,124, 0, 0, 0,234, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 1, 0, 0,235, 1, 0, 0,
+233, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 0, 0, 0,233, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+235, 1, 0, 0,234, 1, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 1, 0, 0, 27, 0, 0, 0, 69, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 69, 1, 0, 0,235, 1, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 0, 0, 0,
+ 73, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,235, 1, 0, 0, 69, 1, 0, 0,123, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 72, 1, 0, 0,125, 0, 0, 0,234, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 1, 0, 0, 71, 1, 0, 0,
+ 72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 72, 1, 0, 0, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 71, 1, 0, 0,234, 1, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,236, 1, 0, 0, 71, 0, 0, 0,220, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,220, 0, 0, 0,224, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 0, 0, 0,
+236, 1, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 0, 0, 0,220, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,236, 1, 0, 0, 73, 0, 0, 0,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 1, 0, 0,238, 1, 0, 0,
+236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 0, 0, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+238, 1, 0, 0,237, 1, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 1, 0, 0, 26, 0, 0, 0,221, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,221, 0, 0, 0,238, 1, 0, 0, 72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 0, 0, 0,
+ 72, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,238, 1, 0, 0,221, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 73, 1, 0, 0,125, 0, 0, 0,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 1, 0, 0,225, 0, 0, 0,
+ 73, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 0, 0, 0, 73, 1, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+225, 0, 0, 0,237, 1, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 1, 0, 0, 70, 0, 0, 0,219, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,219, 0, 0, 0, 71, 1, 0, 0,239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 0, 0, 0,
+239, 1, 0, 0, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 1, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,239, 1, 0, 0,124, 0, 0, 0,240, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 1, 0, 0,241, 1, 0, 0,
+239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 0, 0, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+241, 1, 0, 0,240, 1, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,186, 0, 0, 0, 2, 0, 0, 0,218, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,218, 0, 0, 0,241, 1, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 0, 0, 0,
+186, 0, 0, 0,241, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,241, 1, 0, 0,218, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,187, 0, 0, 0, 54, 0, 0, 0,240, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 1, 0, 0, 70, 1, 0, 0,
+187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 0, 0, 0,187, 0, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 70, 1, 0, 0,240, 1, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,242, 1, 0, 0,126, 0, 0, 0, 75, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 75, 1, 0, 0,231, 0, 0, 0,242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 0, 0, 0,
+242, 1, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 0, 0, 0, 75, 1, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,242, 1, 0, 0, 76, 0, 0, 0,243, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 1, 0, 0,244, 1, 0, 0,
+242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 0, 0, 0,242, 1, 0, 0,244, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+244, 1, 0, 0,243, 1, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 0, 20, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 74, 1, 0, 0,244, 1, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 59, 0, 0, 0,
+197, 0, 0, 0,244, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,244, 1, 0, 0, 74, 1, 0, 0,126, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,196, 0, 0, 0, 59, 0, 0, 0,243, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 1, 0, 0,230, 0, 0, 0,
+196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0,196, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+230, 0, 0, 0,243, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,245, 1, 0, 0,126, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 74, 1, 0, 0, 76, 1, 0, 0,245, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 0, 0, 0,
+245, 1, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 1, 0, 0, 74, 1, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,245, 1, 0, 0,127, 0, 0, 0,246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 1, 0, 0,247, 1, 0, 0,
+245, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 0, 0, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+247, 1, 0, 0,246, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 1, 0, 0, 29, 0, 0, 0, 75, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 75, 1, 0, 0,247, 1, 0, 0, 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 0, 0, 0,
+ 79, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,247, 1, 0, 0, 75, 1, 0, 0,126, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 78, 1, 0, 0,128, 0, 0, 0,246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 1, 0, 0, 77, 1, 0, 0,
+ 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 0, 0, 0, 78, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 77, 1, 0, 0,246, 1, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 1, 0, 0, 75, 0, 0, 0,228, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,228, 0, 0, 0,232, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 0, 0, 0,
+248, 1, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 0,228, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,248, 1, 0, 0, 77, 0, 0, 0,249, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 1, 0, 0,250, 1, 0, 0,
+248, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 0,248, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+250, 1, 0, 0,249, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 1, 0, 0, 28, 0, 0, 0,229, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,229, 0, 0, 0,250, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 0, 0, 0,
+ 78, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,250, 1, 0, 0,229, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 79, 1, 0, 0,128, 0, 0, 0,249, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 1, 0, 0,233, 0, 0, 0,
+ 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 0, 0, 0, 79, 1, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+233, 0, 0, 0,249, 1, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,251, 1, 0, 0, 74, 0, 0, 0,227, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,227, 0, 0, 0, 77, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 0, 0, 0,
+251, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 1, 0, 0,227, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,251, 1, 0, 0,127, 0, 0, 0,252, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 1, 0, 0,253, 1, 0, 0,
+251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 0, 0, 0,251, 1, 0, 0,253, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+253, 1, 0, 0,252, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,194, 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,226, 0, 0, 0,253, 1, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 0, 0, 0,
+194, 0, 0, 0,253, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,253, 1, 0, 0,226, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,195, 0, 0, 0, 58, 0, 0, 0,252, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 1, 0, 0, 76, 1, 0, 0,
+195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 0, 0, 0,195, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 76, 1, 0, 0,252, 1, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 1, 0, 0,129, 0, 0, 0, 81, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 81, 1, 0, 0,239, 0, 0, 0,254, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 0, 0, 0,
+254, 1, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 0, 0, 0, 81, 1, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,254, 1, 0, 0, 80, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 1, 0, 0, 0, 2, 0, 0,
+254, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 0, 0, 0,254, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 0, 2, 0, 0,255, 1, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,201, 0, 0, 0, 21, 0, 0, 0, 80, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 80, 1, 0, 0, 0, 2, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 0, 0, 0,
+201, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 80, 1, 0, 0,129, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,200, 0, 0, 0, 61, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 1, 0, 0,238, 0, 0, 0,
+200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 0, 0, 0,200, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+238, 0, 0, 0,255, 1, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0, 0,129, 0, 0, 0, 80, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 80, 1, 0, 0, 82, 1, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,130, 0, 0, 0,
+ 1, 2, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 1, 0, 0, 80, 1, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 1, 2, 0, 0,130, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 0, 3, 2, 0, 0,
+ 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 0, 0, 0, 1, 2, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 3, 2, 0, 0, 2, 2, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 1, 0, 0, 31, 0, 0, 0, 81, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 81, 1, 0, 0, 3, 2, 0, 0, 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,131, 0, 0, 0,
+ 85, 1, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, 0, 0, 81, 1, 0, 0,129, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 84, 1, 0, 0,131, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 0, 83, 1, 0, 0,
+ 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 0, 0, 0, 84, 1, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 83, 1, 0, 0, 2, 2, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 0, 0, 79, 0, 0, 0,236, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,236, 0, 0, 0,240, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 0, 0, 0,
+ 4, 2, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 0, 0,236, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 4, 2, 0, 0, 81, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 0, 0, 6, 2, 0, 0,
+ 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 0, 0, 0, 4, 2, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 6, 2, 0, 0, 5, 2, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 1, 0, 0, 30, 0, 0, 0,237, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,237, 0, 0, 0, 6, 2, 0, 0, 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,131, 0, 0, 0,
+ 84, 1, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 2, 0, 0,237, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 85, 1, 0, 0,131, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 0, 0,241, 0, 0, 0,
+ 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 0, 0, 0, 85, 1, 0, 0,241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+241, 0, 0, 0, 5, 2, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 2, 0, 0, 78, 0, 0, 0,235, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,235, 0, 0, 0, 83, 1, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,130, 0, 0, 0,
+ 7, 2, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 1, 0, 0,235, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 7, 2, 0, 0,130, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0, 9, 2, 0, 0,
+ 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 0, 0, 0, 7, 2, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 9, 2, 0, 0, 8, 2, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,198, 0, 0, 0, 4, 0, 0, 0,234, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,234, 0, 0, 0, 9, 2, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 0, 0, 0,
+198, 0, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 2, 0, 0,234, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,199, 0, 0, 0, 60, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0, 82, 1, 0, 0,
+199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 0, 0, 0,199, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 82, 1, 0, 0, 8, 2, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 1, 0, 0,132, 0, 0, 0, 10, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 10, 2, 0, 0,245, 0, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0,
+ 87, 1, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,245, 0, 0, 0, 10, 2, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 11, 2, 0, 0, 83, 0, 0, 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 2, 0, 0, 12, 2, 0, 0,
+ 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 0, 0, 0, 11, 2, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 12, 2, 0, 0, 10, 2, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 1, 0, 0, 23, 0, 0, 0,209, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,209, 0, 0, 0, 12, 2, 0, 0, 86, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,132, 0, 0, 0,
+ 86, 1, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 2, 0, 0,209, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 11, 2, 0, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 0, 0, 0,244, 0, 0, 0,
+ 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 0, 0, 0, 11, 2, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+244, 0, 0, 0,208, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 1, 0, 0,132, 0, 0, 0, 13, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 13, 2, 0, 0, 88, 1, 0, 0, 86, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 0, 0, 0,
+ 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 1, 0, 0, 13, 2, 0, 0,133, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 14, 2, 0, 0,133, 0, 0, 0, 13, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 2, 0, 0, 15, 2, 0, 0,
+ 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 0, 0, 0, 14, 2, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 15, 2, 0, 0, 13, 2, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 1, 0, 0, 32, 0, 0, 0, 91, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 91, 1, 0, 0, 15, 2, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,132, 0, 0, 0,
+ 87, 1, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 2, 0, 0, 91, 1, 0, 0,134, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 14, 2, 0, 0,134, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 1, 0, 0, 89, 1, 0, 0,
+ 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 0, 0, 0, 14, 2, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 89, 1, 0, 0, 90, 1, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,212, 0, 0, 0, 67, 0, 0, 0, 16, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 16, 2, 0, 0,242, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 0, 0,
+212, 0, 0, 0,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,242, 0, 0, 0, 16, 2, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 17, 2, 0, 0, 82, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 2, 0, 0, 18, 2, 0, 0,
+ 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 0, 0, 0, 17, 2, 0, 0, 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 18, 2, 0, 0, 16, 2, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 0, 0, 0, 24, 0, 0, 0, 90, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 90, 1, 0, 0, 18, 2, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 0, 0, 0,
+213, 0, 0, 0, 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 2, 0, 0, 90, 1, 0, 0,134, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 17, 2, 0, 0,134, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 1, 0, 0,243, 0, 0, 0,
+ 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 0, 0, 0, 17, 2, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+243, 0, 0, 0, 91, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,211, 0, 0, 0, 66, 0, 0, 0, 19, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 19, 2, 0, 0, 89, 1, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 0, 0, 0,
+211, 0, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 1, 0, 0, 19, 2, 0, 0,133, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 20, 2, 0, 0,133, 0, 0, 0, 19, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 2, 0, 0, 21, 2, 0, 0,
+ 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 20, 2, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 21, 2, 0, 0, 19, 2, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,206, 0, 0, 0, 21, 2, 0, 0,210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 0, 0, 0,
+210, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 2, 0, 0,206, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 20, 2, 0, 0, 64, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0, 88, 1, 0, 0,
+ 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 0, 0, 0, 20, 2, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 88, 1, 0, 0,207, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 1, 0, 0,135, 0, 0, 0, 22, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 22, 2, 0, 0,247, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 0, 0, 0,
+ 93, 1, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,247, 0, 0, 0, 22, 2, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 23, 2, 0, 0, 84, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 2, 0, 0, 24, 2, 0, 0,
+ 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 0, 0, 0, 23, 2, 0, 0, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 24, 2, 0, 0, 22, 2, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 1, 0, 0, 25, 0, 0, 0,217, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,217, 0, 0, 0, 24, 2, 0, 0, 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,135, 0, 0, 0,
+ 92, 1, 0, 0, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 2, 0, 0,217, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 23, 2, 0, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 0, 0, 0,246, 0, 0, 0,
+ 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 0, 0, 0, 23, 2, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+246, 0, 0, 0,216, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 1, 0, 0,135, 0, 0, 0, 25, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 25, 2, 0, 0, 94, 1, 0, 0, 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 0, 0, 0,
+ 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 1, 0, 0, 25, 2, 0, 0,136, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 26, 2, 0, 0,136, 0, 0, 0, 25, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 2, 0, 0, 27, 2, 0, 0,
+ 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 0, 0, 0, 26, 2, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 27, 2, 0, 0, 25, 2, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 1, 0, 0, 33, 0, 0, 0, 97, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 97, 1, 0, 0, 27, 2, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,135, 0, 0, 0,
+ 93, 1, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 2, 0, 0, 97, 1, 0, 0,137, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 26, 2, 0, 0,137, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 1, 0, 0, 95, 1, 0, 0,
+ 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 0, 0, 0, 26, 2, 0, 0, 95, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 95, 1, 0, 0, 96, 1, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,220, 0, 0, 0, 71, 0, 0, 0, 28, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 28, 2, 0, 0,248, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 0, 0, 0,
+220, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 0, 0, 0, 28, 2, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 29, 2, 0, 0, 85, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 2, 0, 0, 30, 2, 0, 0,
+ 29, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 0, 0, 0, 29, 2, 0, 0, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 30, 2, 0, 0, 28, 2, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,221, 0, 0, 0, 26, 0, 0, 0, 96, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 96, 1, 0, 0, 30, 2, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 0, 0, 0,
+221, 0, 0, 0, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 2, 0, 0, 96, 1, 0, 0,137, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 29, 2, 0, 0,137, 0, 0, 0, 97, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 1, 0, 0,249, 0, 0, 0,
+ 29, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 0, 0, 0, 29, 2, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+249, 0, 0, 0, 97, 1, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 0, 0, 0, 70, 0, 0, 0, 31, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 31, 2, 0, 0, 95, 1, 0, 0,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 0, 0, 0,
+219, 0, 0, 0, 95, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 1, 0, 0, 31, 2, 0, 0,136, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 32, 2, 0, 0,136, 0, 0, 0, 31, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 2, 0, 0, 33, 2, 0, 0,
+ 32, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 0, 0, 0, 32, 2, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 33, 2, 0, 0, 31, 2, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,218, 0, 0, 0, 2, 0, 0, 0,214, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,214, 0, 0, 0, 33, 2, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 0, 0, 0,
+218, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 2, 0, 0,214, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 32, 2, 0, 0, 68, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 0, 0, 0, 94, 1, 0, 0,
+ 32, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 0, 0, 0, 32, 2, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 94, 1, 0, 0,215, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 1, 0, 0,138, 0, 0, 0, 34, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 34, 2, 0, 0,251, 0, 0, 0, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 0, 0, 0,
+ 99, 1, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,251, 0, 0, 0, 34, 2, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 35, 2, 0, 0, 86, 0, 0, 0, 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 2, 0, 0, 36, 2, 0, 0,
+ 35, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 0, 0, 0, 35, 2, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 36, 2, 0, 0, 34, 2, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 1, 0, 0, 27, 0, 0, 0,225, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,225, 0, 0, 0, 36, 2, 0, 0, 98, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,138, 0, 0, 0,
+ 98, 1, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 2, 0, 0,225, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 35, 2, 0, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 0, 0, 0,250, 0, 0, 0,
+ 35, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 0, 0, 0, 35, 2, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+250, 0, 0, 0,224, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 1, 0, 0,138, 0, 0, 0, 37, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 37, 2, 0, 0,100, 1, 0, 0, 98, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 0, 0, 0,
+ 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 1, 0, 0, 37, 2, 0, 0,139, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 38, 2, 0, 0,139, 0, 0, 0, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 2, 0, 0, 39, 2, 0, 0,
+ 38, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 0, 0, 0, 38, 2, 0, 0, 39, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 39, 2, 0, 0, 37, 2, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 1, 0, 0, 34, 0, 0, 0,103, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,103, 1, 0, 0, 39, 2, 0, 0, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,138, 0, 0, 0,
+ 99, 1, 0, 0, 39, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 2, 0, 0,103, 1, 0, 0,140, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 38, 2, 0, 0,140, 0, 0, 0,102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 1, 0, 0,101, 1, 0, 0,
+ 38, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 0, 0, 0, 38, 2, 0, 0,101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+101, 1, 0, 0,102, 1, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 0, 0, 0, 75, 0, 0, 0, 40, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 40, 2, 0, 0,252, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 0, 0, 0,
+228, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 0, 0, 0, 40, 2, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 41, 2, 0, 0, 87, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 2, 0, 0, 42, 2, 0, 0,
+ 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 0, 0, 0, 41, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 42, 2, 0, 0, 40, 2, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,229, 0, 0, 0, 28, 0, 0, 0,102, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,102, 1, 0, 0, 42, 2, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 0,
+229, 0, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 2, 0, 0,102, 1, 0, 0,140, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 41, 2, 0, 0,140, 0, 0, 0,103, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 1, 0, 0,253, 0, 0, 0,
+ 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 0, 0, 0, 41, 2, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+253, 0, 0, 0,103, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,227, 0, 0, 0, 74, 0, 0, 0, 43, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 43, 2, 0, 0,101, 1, 0, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 0, 0, 0,
+227, 0, 0, 0,101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 1, 0, 0, 43, 2, 0, 0,139, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 44, 2, 0, 0,139, 0, 0, 0, 43, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 2, 0, 0, 45, 2, 0, 0,
+ 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 0, 0, 0, 44, 2, 0, 0, 45, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 45, 2, 0, 0, 43, 2, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,226, 0, 0, 0, 3, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,222, 0, 0, 0, 45, 2, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 0, 0, 0,
+226, 0, 0, 0, 45, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 2, 0, 0,222, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 44, 2, 0, 0, 72, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 0, 0, 0,100, 1, 0, 0,
+ 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 0, 0, 0, 44, 2, 0, 0,100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+100, 1, 0, 0,223, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 1, 0, 0,141, 0, 0, 0, 46, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 46, 2, 0, 0,255, 0, 0, 0,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 35, 0, 0, 0,
+105, 1, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 0, 0, 0, 46, 2, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 47, 2, 0, 0, 88, 0, 0, 0, 46, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 2, 0, 0, 48, 2, 0, 0,
+ 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 0, 0, 0, 47, 2, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 48, 2, 0, 0, 46, 2, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 1, 0, 0, 29, 0, 0, 0,233, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,233, 0, 0, 0, 48, 2, 0, 0,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,141, 0, 0, 0,
+104, 1, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 2, 0, 0,233, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 47, 2, 0, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 0,254, 0, 0, 0,
+ 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 0, 0, 0, 47, 2, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+254, 0, 0, 0,232, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 1, 0, 0,141, 0, 0, 0, 49, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 49, 2, 0, 0,106, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 0, 0, 0,
+104, 1, 0, 0,106, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 1, 0, 0, 49, 2, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 50, 2, 0, 0,142, 0, 0, 0, 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 2, 0, 0, 51, 2, 0, 0,
+ 50, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 0, 0, 0, 50, 2, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 51, 2, 0, 0, 49, 2, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 1, 0, 0, 35, 0, 0, 0,109, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,109, 1, 0, 0, 51, 2, 0, 0,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,141, 0, 0, 0,
+105, 1, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 2, 0, 0,109, 1, 0, 0,143, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 50, 2, 0, 0,143, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 1, 0, 0,107, 1, 0, 0,
+ 50, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 0, 0, 0, 50, 2, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+107, 1, 0, 0,108, 1, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,236, 0, 0, 0, 79, 0, 0, 0, 52, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 52, 2, 0, 0, 0, 1, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 0, 0, 0,
+236, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 52, 2, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 53, 2, 0, 0, 89, 0, 0, 0, 52, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 2, 0, 0, 54, 2, 0, 0,
+ 53, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 0, 0, 0, 53, 2, 0, 0, 54, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 54, 2, 0, 0, 52, 2, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 0, 0, 0, 30, 0, 0, 0,108, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,108, 1, 0, 0, 54, 2, 0, 0,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 0, 0, 0,
+237, 0, 0, 0, 54, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 2, 0, 0,108, 1, 0, 0,143, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 53, 2, 0, 0,143, 0, 0, 0,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 1, 0, 0, 1, 1, 0, 0,
+ 53, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 0, 0, 0, 53, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 1, 1, 0, 0,109, 1, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,235, 0, 0, 0, 78, 0, 0, 0, 55, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 55, 2, 0, 0,107, 1, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 0, 0, 0,
+235, 0, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 1, 0, 0, 55, 2, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 56, 2, 0, 0,142, 0, 0, 0, 55, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 2, 0, 0, 57, 2, 0, 0,
+ 56, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 0, 0, 0, 56, 2, 0, 0, 57, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 57, 2, 0, 0, 55, 2, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 0, 0, 0, 4, 0, 0, 0,230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,230, 0, 0, 0, 57, 2, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 0, 0, 0,
+234, 0, 0, 0, 57, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 2, 0, 0,230, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 56, 2, 0, 0, 76, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 0, 0, 0,106, 1, 0, 0,
+ 56, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 0, 0, 0, 56, 2, 0, 0,106, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+106, 1, 0, 0,231, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 1, 0, 0,144, 0, 0, 0, 58, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 58, 2, 0, 0, 3, 1, 0, 0,111, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0,
+111, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 58, 2, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 59, 2, 0, 0, 90, 0, 0, 0, 58, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 2, 0, 0, 60, 2, 0, 0,
+ 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 0, 0, 0, 59, 2, 0, 0, 60, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 60, 2, 0, 0, 58, 2, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 1, 0, 0, 31, 0, 0, 0,241, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,241, 0, 0, 0, 60, 2, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,144, 0, 0, 0,
+110, 1, 0, 0, 60, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 2, 0, 0,241, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 59, 2, 0, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 0, 0, 2, 1, 0, 0,
+ 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 0, 0, 0, 59, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 2, 1, 0, 0,240, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 1, 0, 0,144, 0, 0, 0, 61, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 61, 2, 0, 0,113, 1, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 0, 0, 0,
+110, 1, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 1, 0, 0, 61, 2, 0, 0,145, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 62, 2, 0, 0,145, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 2, 0, 0, 63, 2, 0, 0,
+ 62, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 0, 0, 0, 62, 2, 0, 0, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 63, 2, 0, 0, 61, 2, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 1, 0, 0, 36, 0, 0, 0,115, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,115, 1, 0, 0, 63, 2, 0, 0,111, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,144, 0, 0, 0,
+111, 1, 0, 0, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 2, 0, 0,115, 1, 0, 0,146, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 62, 2, 0, 0,146, 0, 0, 0,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 1, 0, 0,112, 1, 0, 0,
+ 62, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 0, 0, 0, 62, 2, 0, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+112, 1, 0, 0,114, 1, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,204, 0, 0, 0, 63, 0, 0, 0, 64, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 64, 2, 0, 0, 4, 1, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 0, 0, 0,
+204, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 1, 0, 0, 64, 2, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 65, 2, 0, 0, 91, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 2, 0, 0, 66, 2, 0, 0,
+ 65, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 0, 0, 0, 65, 2, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 66, 2, 0, 0, 64, 2, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,205, 0, 0, 0, 22, 0, 0, 0,114, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,114, 1, 0, 0, 66, 2, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 0, 0, 0,
+205, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 2, 0, 0,114, 1, 0, 0,146, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 65, 2, 0, 0,146, 0, 0, 0,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 1, 0, 0, 5, 1, 0, 0,
+ 65, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 0, 0, 0, 65, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 5, 1, 0, 0,115, 1, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 0, 0, 0, 62, 0, 0, 0, 67, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 67, 2, 0, 0,112, 1, 0, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 0, 0, 0,
+203, 0, 0, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 1, 0, 0, 67, 2, 0, 0,145, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 68, 2, 0, 0,145, 0, 0, 0, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 2, 0, 0, 69, 2, 0, 0,
+ 68, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 0, 0, 0, 68, 2, 0, 0, 69, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 69, 2, 0, 0, 67, 2, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,202, 0, 0, 0, 5, 0, 0, 0,238, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,238, 0, 0, 0, 69, 2, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 0, 0, 0,
+202, 0, 0, 0, 69, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 2, 0, 0,238, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 68, 2, 0, 0, 80, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 0, 0, 0,113, 1, 0, 0,
+ 68, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 0, 0, 0, 68, 2, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+113, 1, 0, 0,239, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 2, 0, 0,147, 0, 0, 0,117, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,117, 1, 0, 0, 11, 1, 0, 0, 70, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 0, 0, 0,
+ 70, 2, 0, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, 0, 0,117, 1, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 70, 2, 0, 0, 94, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 2, 0, 0, 72, 2, 0, 0,
+ 70, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,147, 0, 0, 0, 70, 2, 0, 0, 72, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 72, 2, 0, 0, 71, 2, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 0, 0, 0, 32, 0, 0, 0,116, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,116, 1, 0, 0, 72, 2, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 0, 0, 0,
+243, 0, 0, 0, 72, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 2, 0, 0,116, 1, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,242, 0, 0, 0, 82, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 2, 0, 0, 10, 1, 0, 0,
+242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 0, 0,242, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 10, 1, 0, 0, 71, 2, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 2, 0, 0,147, 0, 0, 0,116, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,116, 1, 0, 0,118, 1, 0, 0, 73, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,148, 0, 0, 0,
+ 73, 2, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 1, 0, 0,116, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 73, 2, 0, 0,148, 0, 0, 0, 74, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 2, 0, 0, 75, 2, 0, 0,
+ 73, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,147, 0, 0, 0, 73, 2, 0, 0, 75, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 75, 2, 0, 0, 74, 2, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 1, 0, 0, 38, 0, 0, 0,117, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,117, 1, 0, 0, 75, 2, 0, 0,121, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,149, 0, 0, 0,
+121, 1, 0, 0, 75, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 2, 0, 0,117, 1, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,120, 1, 0, 0,149, 0, 0, 0, 74, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 2, 0, 0,119, 1, 0, 0,
+120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 0, 0, 0,120, 1, 0, 0,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+119, 1, 0, 0, 74, 2, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 2, 0, 0, 93, 0, 0, 0, 8, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 8, 1, 0, 0, 12, 1, 0, 0, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 0, 0, 0,
+ 76, 2, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 1, 0, 0, 8, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 76, 2, 0, 0, 95, 0, 0, 0, 77, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 2, 0, 0, 78, 2, 0, 0,
+ 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 0, 0, 0, 76, 2, 0, 0, 78, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 78, 2, 0, 0, 77, 2, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 1, 0, 0, 37, 0, 0, 0, 9, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 9, 1, 0, 0, 78, 2, 0, 0,120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,149, 0, 0, 0,
+120, 1, 0, 0, 78, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 2, 0, 0, 9, 1, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,121, 1, 0, 0,149, 0, 0, 0, 77, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 2, 0, 0, 13, 1, 0, 0,
+121, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 0, 0, 0,121, 1, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 13, 1, 0, 0, 77, 2, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 2, 0, 0, 92, 0, 0, 0, 7, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 7, 1, 0, 0,119, 1, 0, 0, 79, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,148, 0, 0, 0,
+ 79, 2, 0, 0,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 1, 0, 0, 7, 1, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 79, 2, 0, 0,148, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 2, 0, 0, 81, 2, 0, 0,
+ 79, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 0, 0, 0, 79, 2, 0, 0, 81, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 81, 2, 0, 0, 80, 2, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,244, 0, 0, 0, 10, 0, 0, 0, 6, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 6, 1, 0, 0, 81, 2, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 0, 0, 0,
+244, 0, 0, 0, 81, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 2, 0, 0, 6, 1, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,245, 0, 0, 0, 83, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 2, 0, 0,118, 1, 0, 0,
+245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0,245, 0, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+118, 1, 0, 0, 80, 2, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 2, 0, 0,150, 0, 0, 0,123, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,123, 1, 0, 0, 15, 1, 0, 0, 82, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 0, 0, 0,
+ 82, 2, 0, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 1, 0, 0,123, 1, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 82, 2, 0, 0, 96, 0, 0, 0, 83, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 2, 0, 0, 84, 2, 0, 0,
+ 82, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,150, 0, 0, 0, 82, 2, 0, 0, 84, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 84, 2, 0, 0, 83, 2, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 0, 0, 0, 33, 0, 0, 0,122, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,122, 1, 0, 0, 84, 2, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 0, 0, 0,
+249, 0, 0, 0, 84, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 2, 0, 0,122, 1, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,248, 0, 0, 0, 85, 0, 0, 0, 83, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 2, 0, 0, 14, 1, 0, 0,
+248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 0, 0, 0,248, 0, 0, 0, 14, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 14, 1, 0, 0, 83, 2, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 2, 0, 0,150, 0, 0, 0,122, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,122, 1, 0, 0,124, 1, 0, 0, 85, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,151, 0, 0, 0,
+ 85, 2, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 1, 0, 0,122, 1, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 85, 2, 0, 0,151, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 2, 0, 0, 87, 2, 0, 0,
+ 85, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,150, 0, 0, 0, 85, 2, 0, 0, 87, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 87, 2, 0, 0, 86, 2, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 1, 0, 0, 39, 0, 0, 0,123, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,123, 1, 0, 0, 87, 2, 0, 0,127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,152, 0, 0, 0,
+127, 1, 0, 0, 87, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 2, 0, 0,123, 1, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,126, 1, 0, 0,152, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 2, 0, 0,125, 1, 0, 0,
+126, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 0, 0, 0,126, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+125, 1, 0, 0, 86, 2, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 2, 0, 0, 95, 0, 0, 0, 12, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 12, 1, 0, 0, 16, 1, 0, 0, 88, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 0, 0, 0,
+ 88, 2, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 1, 0, 0, 12, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 88, 2, 0, 0, 97, 0, 0, 0, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 2, 0, 0, 90, 2, 0, 0,
+ 88, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 0, 0, 0, 88, 2, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 90, 2, 0, 0, 89, 2, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 1, 0, 0, 38, 0, 0, 0, 13, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 13, 1, 0, 0, 90, 2, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,152, 0, 0, 0,
+126, 1, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 2, 0, 0, 13, 1, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,127, 1, 0, 0,152, 0, 0, 0, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 2, 0, 0, 17, 1, 0, 0,
+127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 0, 0, 0,127, 1, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 17, 1, 0, 0, 89, 2, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 2, 0, 0, 94, 0, 0, 0, 11, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, 0, 0,125, 1, 0, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,151, 0, 0, 0,
+ 91, 2, 0, 0,125, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 1, 0, 0, 11, 1, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 91, 2, 0, 0,151, 0, 0, 0, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 2, 0, 0, 93, 2, 0, 0,
+ 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 0, 0, 0, 91, 2, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 93, 2, 0, 0, 92, 2, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 0, 0, 0, 6, 0, 0, 0, 10, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 10, 1, 0, 0, 93, 2, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 0, 0, 0,
+246, 0, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 2, 0, 0, 10, 1, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,247, 0, 0, 0, 84, 0, 0, 0, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 2, 0, 0,124, 1, 0, 0,
+247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 0, 0, 0,247, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+124, 1, 0, 0, 92, 2, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 2, 0, 0,153, 0, 0, 0,129, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,129, 1, 0, 0, 19, 1, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 0, 0, 0,
+ 94, 2, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 1, 0, 0,129, 1, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 94, 2, 0, 0, 98, 0, 0, 0, 95, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 2, 0, 0, 96, 2, 0, 0,
+ 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,153, 0, 0, 0, 94, 2, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 96, 2, 0, 0, 95, 2, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,253, 0, 0, 0, 34, 0, 0, 0,128, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,128, 1, 0, 0, 96, 2, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 0, 0, 0,
+253, 0, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 2, 0, 0,128, 1, 0, 0,153, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,252, 0, 0, 0, 87, 0, 0, 0, 95, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 2, 0, 0, 18, 1, 0, 0,
+252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 0, 0, 0,252, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 18, 1, 0, 0, 95, 2, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 2, 0, 0,153, 0, 0, 0,128, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,128, 1, 0, 0,130, 1, 0, 0, 97, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,154, 0, 0, 0,
+ 97, 2, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,130, 1, 0, 0,128, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 97, 2, 0, 0,154, 0, 0, 0, 98, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 2, 0, 0, 99, 2, 0, 0,
+ 97, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,153, 0, 0, 0, 97, 2, 0, 0, 99, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 99, 2, 0, 0, 98, 2, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 1, 0, 0, 40, 0, 0, 0,129, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,129, 1, 0, 0, 99, 2, 0, 0,133, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,155, 0, 0, 0,
+133, 1, 0, 0, 99, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 2, 0, 0,129, 1, 0, 0,153, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,132, 1, 0, 0,155, 0, 0, 0, 98, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 2, 0, 0,131, 1, 0, 0,
+132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 0, 0, 0,132, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+131, 1, 0, 0, 98, 2, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 2, 0, 0, 97, 0, 0, 0, 16, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 16, 1, 0, 0, 20, 1, 0, 0,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 0, 0, 0,
+100, 2, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 1, 0, 0, 16, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,100, 2, 0, 0, 99, 0, 0, 0,101, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 2, 0, 0,102, 2, 0, 0,
+100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 0, 0, 0,100, 2, 0, 0,102, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+102, 2, 0, 0,101, 2, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,132, 1, 0, 0, 39, 0, 0, 0, 17, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 17, 1, 0, 0,102, 2, 0, 0,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,155, 0, 0, 0,
+132, 1, 0, 0,102, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 2, 0, 0, 17, 1, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,133, 1, 0, 0,155, 0, 0, 0,101, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 2, 0, 0, 21, 1, 0, 0,
+133, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 0, 0, 0,133, 1, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 21, 1, 0, 0,101, 2, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 2, 0, 0, 96, 0, 0, 0, 15, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 15, 1, 0, 0,131, 1, 0, 0,103, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,154, 0, 0, 0,
+103, 2, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,131, 1, 0, 0, 15, 1, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,103, 2, 0, 0,154, 0, 0, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 2, 0, 0,105, 2, 0, 0,
+103, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 0, 0, 0,103, 2, 0, 0,105, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+105, 2, 0, 0,104, 2, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,250, 0, 0, 0, 7, 0, 0, 0, 14, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 14, 1, 0, 0,105, 2, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 0, 0, 0,
+250, 0, 0, 0,105, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 2, 0, 0, 14, 1, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,251, 0, 0, 0, 86, 0, 0, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 2, 0, 0,130, 1, 0, 0,
+251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 0, 0, 0,251, 0, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+130, 1, 0, 0,104, 2, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 2, 0, 0,156, 0, 0, 0,135, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,135, 1, 0, 0, 23, 1, 0, 0,106, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 0, 0, 0,
+106, 2, 0, 0, 23, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 1, 0, 0,135, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,106, 2, 0, 0,100, 0, 0, 0,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 2, 0, 0,108, 2, 0, 0,
+106, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,156, 0, 0, 0,106, 2, 0, 0,108, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+108, 2, 0, 0,107, 2, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 35, 0, 0, 0,134, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,134, 1, 0, 0,108, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 0, 0, 0,
+ 1, 1, 0, 0,108, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 2, 0, 0,134, 1, 0, 0,156, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 1, 0, 0, 89, 0, 0, 0,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 2, 0, 0, 22, 1, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 0, 0, 0, 0, 1, 0, 0, 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 22, 1, 0, 0,107, 2, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 2, 0, 0,156, 0, 0, 0,134, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,134, 1, 0, 0,136, 1, 0, 0,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,157, 0, 0, 0,
+109, 2, 0, 0,136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 1, 0, 0,134, 1, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,109, 2, 0, 0,157, 0, 0, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 2, 0, 0,111, 2, 0, 0,
+109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,156, 0, 0, 0,109, 2, 0, 0,111, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+111, 2, 0, 0,110, 2, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 1, 0, 0, 41, 0, 0, 0,135, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,135, 1, 0, 0,111, 2, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,158, 0, 0, 0,
+139, 1, 0, 0,111, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 2, 0, 0,135, 1, 0, 0,156, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,138, 1, 0, 0,158, 0, 0, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 2, 0, 0,137, 1, 0, 0,
+138, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 0, 0, 0,138, 1, 0, 0,137, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+137, 1, 0, 0,110, 2, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 2, 0, 0, 99, 0, 0, 0, 20, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 20, 1, 0, 0, 24, 1, 0, 0,112, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 0, 0, 0,
+112, 2, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 1, 0, 0, 20, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,112, 2, 0, 0,101, 0, 0, 0,113, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 2, 0, 0,114, 2, 0, 0,
+112, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 0, 0, 0,112, 2, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+114, 2, 0, 0,113, 2, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,138, 1, 0, 0, 40, 0, 0, 0, 21, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 21, 1, 0, 0,114, 2, 0, 0,138, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,158, 0, 0, 0,
+138, 1, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 2, 0, 0, 21, 1, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,139, 1, 0, 0,158, 0, 0, 0,113, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 2, 0, 0, 25, 1, 0, 0,
+139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 0, 0, 0,139, 1, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 25, 1, 0, 0,113, 2, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 2, 0, 0, 98, 0, 0, 0, 19, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 19, 1, 0, 0,137, 1, 0, 0,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,157, 0, 0, 0,
+115, 2, 0, 0,137, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 1, 0, 0, 19, 1, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,115, 2, 0, 0,157, 0, 0, 0,116, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 2, 0, 0,117, 2, 0, 0,
+115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 0, 0, 0,115, 2, 0, 0,117, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+117, 2, 0, 0,116, 2, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 0, 0, 0, 8, 0, 0, 0, 18, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 18, 1, 0, 0,117, 2, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 0, 0, 0,
+254, 0, 0, 0,117, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 2, 0, 0, 18, 1, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,255, 0, 0, 0, 88, 0, 0, 0,116, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 2, 0, 0,136, 1, 0, 0,
+255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 35, 0, 0, 0,255, 0, 0, 0,136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+136, 1, 0, 0,116, 2, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 2, 0, 0,159, 0, 0, 0,141, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,141, 1, 0, 0, 7, 1, 0, 0,118, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 0, 0, 0,
+118, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 1, 0, 0,141, 1, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,118, 2, 0, 0, 92, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 2, 0, 0,120, 2, 0, 0,
+118, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 0, 0, 0,118, 2, 0, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+120, 2, 0, 0,119, 2, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 1, 0, 0, 36, 0, 0, 0,140, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,140, 1, 0, 0,120, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 0, 0, 0,
+ 5, 1, 0, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 2, 0, 0,140, 1, 0, 0,159, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 4, 1, 0, 0, 91, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 2, 0, 0, 6, 1, 0, 0,
+ 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 0, 0, 0, 4, 1, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 6, 1, 0, 0,119, 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 2, 0, 0,159, 0, 0, 0,140, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,140, 1, 0, 0,142, 1, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160, 0, 0, 0,
+121, 2, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 1, 0, 0,140, 1, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,121, 2, 0, 0,160, 0, 0, 0,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 2, 0, 0,123, 2, 0, 0,
+121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 0, 0, 0,121, 2, 0, 0,123, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+123, 2, 0, 0,122, 2, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,144, 1, 0, 0, 37, 0, 0, 0,141, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,141, 1, 0, 0,123, 2, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,161, 0, 0, 0,
+144, 1, 0, 0,123, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 2, 0, 0,141, 1, 0, 0,159, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,145, 1, 0, 0,161, 0, 0, 0,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 2, 0, 0,143, 1, 0, 0,
+145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 0, 0, 0,145, 1, 0, 0,143, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+143, 1, 0, 0,122, 2, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 2, 0, 0,101, 0, 0, 0, 24, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 24, 1, 0, 0, 8, 1, 0, 0,124, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 0, 0, 0,
+124, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 1, 0, 0, 24, 1, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,124, 2, 0, 0, 93, 0, 0, 0,125, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 2, 0, 0,126, 2, 0, 0,
+124, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 0, 0, 0,124, 2, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+126, 2, 0, 0,125, 2, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 1, 0, 0, 41, 0, 0, 0, 25, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 25, 1, 0, 0,126, 2, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,161, 0, 0, 0,
+145, 1, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 2, 0, 0, 25, 1, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,144, 1, 0, 0,161, 0, 0, 0,125, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 2, 0, 0, 9, 1, 0, 0,
+144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 0, 0, 0,144, 1, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 9, 1, 0, 0,125, 2, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 2, 0, 0,100, 0, 0, 0, 23, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 23, 1, 0, 0,143, 1, 0, 0,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160, 0, 0, 0,
+127, 2, 0, 0,143, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 1, 0, 0, 23, 1, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,127, 2, 0, 0,160, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 2, 0, 0,129, 2, 0, 0,
+127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 0, 0, 0,127, 2, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+129, 2, 0, 0,128, 2, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 9, 0, 0, 0, 22, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 22, 1, 0, 0,129, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 0, 0, 0,
+ 2, 1, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 2, 0, 0, 22, 1, 0, 0,100, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 3, 1, 0, 0, 90, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 2, 0, 0,142, 1, 0, 0,
+ 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0, 3, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+142, 1, 0, 0,128, 2, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 65, 84, 65, 0,220, 0, 0,120,118,185, 3,
+ 65, 0, 0, 0, 0, 5, 0, 0,166,222,110, 63, 9,205, 55, 63,212,132,105, 63,201,236, 65, 63,218,153,103, 63,119,155, 54, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218,153,103, 63,119,155, 54, 63,118,148,108, 63,
+211,160, 44, 63,166,222,110, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 36, 51,115, 63, 36, 28, 45, 63,166,222,110, 63, 9,205, 55, 63,118,148,108, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,148,108, 63,211,160, 44, 63,218,153,103, 63,119,155, 54, 63, 87, 17,102, 63,
+229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56, 81, 96, 63,170, 55, 52, 63,
+ 87, 17,102, 63,229, 52, 43, 63,218,153,103, 63,119,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,218,153,103, 63,119,155, 54, 63, 9, 75, 97, 63, 92,233, 63, 63, 56, 81, 96, 63,170, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 49, 86, 60, 63, 56, 81, 96, 63,170, 55, 52, 63,
+ 9, 75, 97, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 75, 97, 63,
+ 92,233, 63, 63,218,153,103, 63,119,155, 54, 63,212,132,105, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,103,167, 98, 63,168, 39, 75, 63,138,153, 89, 63, 39,228, 82, 63,139,153, 89, 63,255,153, 71, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63,255,153, 71, 63, 9, 75, 97, 63,
+ 92,233, 63, 63,103,167, 98, 63,168, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,132,105, 63,201,236, 65, 63,103,167, 98, 63,168, 39, 75, 63, 9, 75, 97, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 75, 97, 63, 92,233, 63, 63,139,153, 89, 63,255,153, 71, 63,138,153, 89, 63,
+ 49, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56, 81, 96, 63,170, 55, 52, 63,
+138,153, 89, 63, 49, 86, 60, 63,139,153, 89, 63, 79, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,139,153, 89, 63, 79, 12, 49, 63,205,182, 95, 63,222,228, 40, 63, 56, 81, 96, 63,170, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 17,102, 63,229, 52, 43, 63, 56, 81, 96, 63,170, 55, 52, 63,
+205,182, 95, 63,222,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,182, 95, 63,
+222,228, 40, 63,139,153, 89, 63, 79, 12, 49, 63,139,153, 89, 63, 45,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,103,167, 98, 63,168, 39, 75, 63,212,132,105, 63,201,236, 65, 63,168, 83,109, 63,207, 83, 78, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,168, 83,109, 63,207, 83, 78, 63,135, 85,101, 63,
+148, 64, 88, 63,103,167, 98, 63,168, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,153, 89, 63, 39,228, 82, 63,103,167, 98, 63,168, 39, 75, 63,135, 85,101, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,135, 85,101, 63,148, 64, 88, 63,168, 83,109, 63,207, 83, 78, 63, 36, 51,115, 63,
+ 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 18,121, 63,207, 83, 78, 63,
+ 36, 51,115, 63, 22, 56, 90, 63,168, 83,109, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,168, 83,109, 63,207, 83, 78, 63, 36, 51,115, 63,115, 23, 67, 63,162, 18,121, 63,207, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116,225,124, 63,202,236, 65, 63,162, 18,121, 63,207, 83, 78, 63,
+ 36, 51,115, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63,
+115, 23, 67, 63,168, 83,109, 63,207, 83, 78, 63,212,132,105, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,166,222,110, 63, 9,205, 55, 63, 36, 51,115, 63, 36, 28, 45, 63,163,135,119, 63, 11,205, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,163,135,119, 63, 11,205, 55, 63, 36, 51,115, 63,
+115, 23, 67, 63,166,222,110, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,132,105, 63,201,236, 65, 63,166,222,110, 63, 9,205, 55, 63, 36, 51,115, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63,115, 23, 67, 63,163,135,119, 63, 11,205, 55, 63,116,225,124, 63,
+202,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 18,121, 63,207, 83, 78, 63,
+116,225,124, 63,202,236, 65, 63,113,223,129, 63,170, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,113,223,129, 63,170, 39, 75, 63, 98,136,128, 63,148, 64, 88, 63,162, 18,121, 63,207, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 22, 56, 90, 63,162, 18,121, 63,207, 83, 78, 63,
+ 98,136,128, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95, 98,136, 59,
+148, 64, 88, 63,160,184,111, 60,170, 39, 75, 63,243,203, 76, 61, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,243,203, 76, 61, 82, 12, 49, 63,246,203, 76, 61, 53, 86, 60, 63, 31,162,194, 60,172, 55, 52, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31,162,194, 60,172, 55, 52, 63,111,239,213, 60,
+223,228, 40, 63,243,203, 76, 61, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+246,203, 76, 61, 48,200, 37, 63,243,203, 76, 61, 82, 12, 49, 63,111,239,213, 60,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,239,213, 60,223,228, 40, 63, 31,162,194, 60,172, 55, 52, 63,120,226,169, 58,
+230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,204,126, 63,121,155, 54, 63,
+121, 42,128, 63,230, 52, 43, 63,136, 10,131, 63,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,136, 10,131, 63,172, 55, 52, 63,160,141,130, 63, 95,233, 63, 63,111,204,126, 63,121,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116,225,124, 63,202,236, 65, 63,111,204,126, 63,121,155, 54, 63,
+160,141,130, 63, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11,104,163, 60,
+ 95,233, 63, 63, 31,162,194, 60,172, 55, 52, 63,246,203, 76, 61, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,244,203, 76, 61, 2,154, 71, 63,243,203, 76, 61, 41,228, 82, 63,160,184,111, 60,170, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,184,111, 60,170, 39, 75, 63, 11,104,163, 60,
+ 95,233, 63, 63,244,203, 76, 61, 2,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+246,203, 76, 61, 53, 86, 60, 63,244,203, 76, 61, 2,154, 71, 63, 11,104,163, 60, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,141,130, 63, 95,233, 63, 63,113,223,129, 63,170, 39, 75, 63,116,225,124, 63,
+202,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,204,126, 63,121,155, 54, 63,
+116,225,124, 63,202,236, 65, 63,163,135,119, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,163,135,119, 63, 11,205, 55, 63,210,209,121, 63,212,160, 44, 63,111,204,126, 63,121,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121, 42,128, 63,230, 52, 43, 63,111,204,126, 63,121,155, 54, 63,
+210,209,121, 63,212,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,210,209,121, 63,
+212,160, 44, 63,163,135,119, 63, 11,205, 55, 63, 36, 51,115, 63, 36, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 95,102,134, 63, 79, 46, 94, 63, 95,102,134, 63, 22,114,105, 63, 52,205,124, 63, 58, 26, 99, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 52,205,124, 63, 58, 26, 99, 63, 98,136,128, 63,
+148, 64, 88, 63, 95,102,134, 63, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+243,203, 76, 61, 41,228, 82, 63,234,203, 76, 61, 79, 46, 94, 63, 95, 98,136, 59,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 98,136,128, 63,148, 64, 88, 63, 52,205,124, 63, 58, 26, 99, 63, 36, 51,115, 63,
+ 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,153,105, 63, 58, 26, 99, 63,
+ 36, 51,115, 63, 22, 56, 90, 63, 52,205,124, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 52,205,124, 63, 58, 26, 99, 63, 32, 51,115, 63,212,154,109, 63, 21,153,105, 63, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 19,114,105, 63, 21,153,105, 63, 58, 26, 99, 63,
+ 32, 51,115, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32, 51,115, 63,
+212,154,109, 63, 52,205,124, 63, 58, 26, 99, 63, 95,102,134, 63, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 95,102,134, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,136,153, 89, 63,242,187,116, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,136,153, 89, 63,242,187,116, 63, 32, 51,115, 63,
+212,154,109, 63, 95,102,134, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 95,102,134, 63, 22,114,105, 63, 95,102,134, 63,242,187,116, 63, 32, 51,115, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32, 51,115, 63,212,154,109, 63,136,153, 89, 63,242,187,116, 63,138,153, 89, 63,
+ 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,153,105, 63, 58, 26, 99, 63,
+138,153, 89, 63, 19,114,105, 63,138,153, 89, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,138,153, 89, 63, 77, 46, 94, 63,135, 85,101, 63,148, 64, 88, 63, 21,153,105, 63, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 22, 56, 90, 63, 21,153,105, 63, 58, 26, 99, 63,
+135, 85,101, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,135, 85,101, 63,
+148, 64, 88, 63,138,153, 89, 63, 77, 46, 94, 63,138,153, 89, 63, 39,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 67,153, 75, 63,113,155, 54, 63, 74,174, 73, 63,193,236, 65, 63,124, 84, 68, 63,255,204, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,124, 84, 68, 63,255,204, 55, 63,169,158, 70, 63,
+200,160, 44, 63, 67,153, 75, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+196, 33, 77, 63,221, 52, 43, 63, 67,153, 75, 63,113,155, 54, 63,169,158, 70, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,158, 70, 63,200,160, 44, 63,124, 84, 68, 63,255,204, 55, 63, 0, 0, 64, 63,
+ 24, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 67,153, 75, 63,113,155, 54, 63,
+196, 33, 77, 63,221, 52, 43, 63,225,225, 82, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,225,225, 82, 63,165, 55, 52, 63, 16,232, 81, 63, 89,233, 63, 63, 67,153, 75, 63,113,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 74,174, 73, 63,193,236, 65, 63, 67,153, 75, 63,113,155, 54, 63,
+ 16,232, 81, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 16,232, 81, 63,
+ 89,233, 63, 63,225,225, 82, 63,165, 55, 52, 63,138,153, 89, 63, 49, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63,255,153, 71, 63,138,153, 89, 63, 39,228, 82, 63,179,139, 80, 63,164, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,139, 80, 63,164, 39, 75, 63, 16,232, 81, 63,
+ 89,233, 63, 63,139,153, 89, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,153, 89, 63, 49, 86, 60, 63,139,153, 89, 63,255,153, 71, 63, 16,232, 81, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 16,232, 81, 63, 89,233, 63, 63,179,139, 80, 63,164, 39, 75, 63, 74,174, 73, 63,
+193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 79, 12, 49, 63,
+138,153, 89, 63, 49, 86, 60, 63,225,225, 82, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,225,225, 82, 63,165, 55, 52, 63, 75,124, 83, 63,217,228, 40, 63,139,153, 89, 63, 79, 12, 49, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 45,200, 37, 63,139,153, 89, 63, 79, 12, 49, 63,
+ 75,124, 83, 63,217,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 75,124, 83, 63,
+217,228, 40, 63,225,225, 82, 63,165, 55, 52, 63,196, 33, 77, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,120,223, 69, 63,198, 83, 78, 63, 74,174, 73, 63,193,236, 65, 63,179,139, 80, 63,164, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,139, 80, 63,164, 39, 75, 63,148,221, 77, 63,
+140, 64, 88, 63,120,223, 69, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 12, 56, 90, 63,120,223, 69, 63,198, 83, 78, 63,148,221, 77, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,148,221, 77, 63,140, 64, 88, 63,179,139, 80, 63,164, 39, 75, 63,138,153, 89, 63,
+ 39,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120,223, 69, 63,198, 83, 78, 63,
+ 0, 0, 64, 63, 12, 56, 90, 63,136, 32, 58, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,136, 32, 58, 63,198, 83, 78, 63, 0, 0, 64, 63,106, 23, 67, 63,120,223, 69, 63,198, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 74,174, 73, 63,193,236, 65, 63,120,223, 69, 63,198, 83, 78, 63,
+ 0, 0, 64, 63,106, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,
+106, 23, 67, 63,136, 32, 58, 63,198, 83, 78, 63,182, 81, 54, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,132,171, 59, 63,255,204, 55, 63, 0, 0, 64, 63, 24, 28, 45, 63,124, 84, 68, 63,255,204, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,124, 84, 68, 63,255,204, 55, 63, 0, 0, 64, 63,
+106, 23, 67, 63,132,171, 59, 63,255,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+182, 81, 54, 63,193,236, 65, 63,132,171, 59, 63,255,204, 55, 63, 0, 0, 64, 63,106, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,106, 23, 67, 63,124, 84, 68, 63,255,204, 55, 63, 74,174, 73, 63,
+193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77,116, 47, 63,164, 39, 75, 63,
+182, 81, 54, 63,193,236, 65, 63,136, 32, 58, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,136, 32, 58, 63,198, 83, 78, 63,108, 34, 50, 63,140, 64, 88, 63, 77,116, 47, 63,164, 39, 75, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 38,228, 82, 63, 77,116, 47, 63,164, 39, 75, 63,
+108, 34, 50, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,108, 34, 50, 63,
+140, 64, 88, 63,136, 32, 58, 63,198, 83, 78, 63, 0, 0, 64, 63, 12, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 31, 30, 45, 63,165, 55, 52, 63,117,102, 38, 63, 50, 86, 60, 63,117,102, 38, 63, 78, 12, 49, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 78, 12, 49, 63,181,131, 44, 63,
+216,228, 40, 63, 31, 30, 45, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 60,222, 50, 63,221, 52, 43, 63, 31, 30, 45, 63,165, 55, 52, 63,181,131, 44, 63,216,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,181,131, 44, 63,216,228, 40, 63,117,102, 38, 63, 78, 12, 49, 63,117,102, 38, 63,
+ 45,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 30, 45, 63,165, 55, 52, 63,
+ 60,222, 50, 63,221, 52, 43, 63,189,102, 52, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,189,102, 52, 63,113,155, 54, 63,240, 23, 46, 63, 89,233, 63, 63, 31, 30, 45, 63,165, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 50, 86, 60, 63, 31, 30, 45, 63,165, 55, 52, 63,
+240, 23, 46, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 23, 46, 63,
+ 89,233, 63, 63,189,102, 52, 63,113,155, 54, 63,182, 81, 54, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 77,116, 47, 63,164, 39, 75, 63,118,102, 38, 63, 38,228, 82, 63,117,102, 38, 63,255,153, 71, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63,255,153, 71, 63,240, 23, 46, 63,
+ 89,233, 63, 63, 77,116, 47, 63,164, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+182, 81, 54, 63,193,236, 65, 63, 77,116, 47, 63,164, 39, 75, 63,240, 23, 46, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 23, 46, 63, 89,233, 63, 63,117,102, 38, 63,255,153, 71, 63,117,102, 38, 63,
+ 50, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132,171, 59, 63,255,204, 55, 63,
+182, 81, 54, 63,193,236, 65, 63,189,102, 52, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,189,102, 52, 63,113,155, 54, 63, 87, 97, 57, 63,200,160, 44, 63,132,171, 59, 63,255,204, 55, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 24, 28, 45, 63,132,171, 59, 63,255,204, 55, 63,
+ 87, 97, 57, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 97, 57, 63,
+200,160, 44, 63,189,102, 52, 63,113,155, 54, 63, 60,222, 50, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,250,101, 54, 63, 51, 26, 99, 63,118,102, 38, 63, 19,114,105, 63,118,102, 38, 63, 77, 46, 94, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 77, 46, 94, 63,108, 34, 50, 63,
+140, 64, 88, 63,250,101, 54, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 12, 56, 90, 63,250,101, 54, 63, 51, 26, 99, 63,108, 34, 50, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,108, 34, 50, 63,140, 64, 88, 63,118,102, 38, 63, 77, 46, 94, 63,118,102, 38, 63,
+ 38,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,250,101, 54, 63, 51, 26, 99, 63,
+ 0, 0, 64, 63, 12, 56, 90, 63, 6,154, 73, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 6,154, 73, 63, 51, 26, 99, 63, 0, 0, 64, 63,206,154,109, 63,250,101, 54, 63, 51, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 19,114,105, 63,250,101, 54, 63, 51, 26, 99, 63,
+ 0, 0, 64, 63,206,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,
+206,154,109, 63, 6,154, 73, 63, 51, 26, 99, 63,138,153, 89, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,136,153, 89, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,120,102, 38, 63,242,187,116, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120,102, 38, 63,242,187,116, 63, 0, 0, 64, 63,
+206,154,109, 63,136,153, 89, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,153, 89, 63, 19,114,105, 63,136,153, 89, 63,242,187,116, 63, 0, 0, 64, 63,206,154,109, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,206,154,109, 63,120,102, 38, 63,242,187,116, 63,118,102, 38, 63,
+ 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 77, 46, 94, 63,
+138,153, 89, 63, 19,114,105, 63, 6,154, 73, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 6,154, 73, 63, 51, 26, 99, 63,148,221, 77, 63,140, 64, 88, 63,138,153, 89, 63, 77, 46, 94, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 39,228, 82, 63,138,153, 89, 63, 77, 46, 94, 63,
+148,221, 77, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,148,221, 77, 63,
+140, 64, 88, 63, 6,154, 73, 63, 51, 26, 99, 63, 0, 0, 64, 63, 12, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,167, 71, 8, 62, 7,205, 55, 63,170,192,229, 61,200,236, 65, 63,203,104,214, 61,120,155, 54, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,203,104,214, 61,120,155, 54, 63,201, 61,254, 61,
+207,160, 44, 63,167, 71, 8, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+173,153, 25, 62, 27, 28, 45, 63,167, 71, 8, 62, 7,205, 55, 63,201, 61,254, 61,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,201, 61,254, 61,207,160, 44, 63,203,104,214, 61,120,155, 54, 63,175, 36,202, 61,
+228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 35,156, 61,172, 55, 52, 63,
+175, 36,202, 61,228, 52, 43, 63,203,104,214, 61,120,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,203,104,214, 61,120,155, 54, 63, 32,242,163, 61, 96,233, 63, 63,145, 35,156, 61,172, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 53, 86, 60, 63,145, 35,156, 61,172, 55, 52, 63,
+ 32,242,163, 61, 96,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32,242,163, 61,
+ 96,233, 63, 63,203,104,214, 61,120,155, 54, 63,170,192,229, 61,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 17,213,174, 61,171, 39, 75, 63,243,203, 76, 61, 41,228, 82, 63,244,203, 76, 61, 2,154, 71, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,244,203, 76, 61, 2,154, 71, 63, 32,242,163, 61,
+ 96,233, 63, 63, 17,213,174, 61,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+170,192,229, 61,200,236, 65, 63, 17,213,174, 61,171, 39, 75, 63, 32,242,163, 61, 96,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32,242,163, 61, 96,233, 63, 63,244,203, 76, 61, 2,154, 71, 63,246,203, 76, 61,
+ 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 35,156, 61,172, 55, 52, 63,
+246,203, 76, 61, 53, 86, 60, 63,243,203, 76, 61, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,243,203, 76, 61, 82, 12, 49, 63, 53, 80,151, 61,223,228, 40, 63,145, 35,156, 61,172, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 36,202, 61,228, 52, 43, 63,145, 35,156, 61,172, 55, 52, 63,
+ 53, 80,151, 61,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 80,151, 61,
+223,228, 40, 63,243,203, 76, 61, 82, 12, 49, 63,246,203, 76, 61, 48,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 17,213,174, 61,171, 39, 75, 63,170,192,229, 61,200,236, 65, 63,169, 27, 2, 62,204, 83, 78, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169, 27, 2, 62,204, 83, 78, 63, 23, 70,196, 61,
+147, 64, 88, 63, 17,213,174, 61,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+243,203, 76, 61, 41,228, 82, 63, 17,213,174, 61,171, 39, 75, 63, 23, 70,196, 61,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 70,196, 61,147, 64, 88, 63,169, 27, 2, 62,204, 83, 78, 63,160,153, 25, 62,
+ 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 23, 49, 62,195, 83, 78, 63,
+160,153, 25, 62, 14, 56, 90, 63,169, 27, 2, 62,204, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,169, 27, 2, 62,204, 83, 78, 63,172,153, 25, 62,108, 23, 67, 63,162, 23, 49, 62,195, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 82, 64, 62,183,236, 65, 63,162, 23, 49, 62,195, 83, 78, 63,
+172,153, 25, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,172,153, 25, 62,
+108, 23, 67, 63,169, 27, 2, 62,204, 83, 78, 63,170,192,229, 61,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,167, 71, 8, 62, 7,205, 55, 63,173,153, 25, 62, 27, 28, 45, 63,173,235, 42, 62,254,204, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,235, 42, 62,254,204, 55, 63,172,153, 25, 62,
+108, 23, 67, 63,167, 71, 8, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+170,192,229, 61,200,236, 65, 63,167, 71, 8, 62, 7,205, 55, 63,172,153, 25, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,172,153, 25, 62,108, 23, 67, 63,173,235, 42, 62,254,204, 55, 63,240, 82, 64, 62,
+183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 23, 49, 62,195, 83, 78, 63,
+240, 82, 64, 62,183,236, 65, 63,166,200, 91, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,166,200, 91, 62,147, 39, 75, 63, 34, 16, 81, 62,131, 64, 88, 63,162, 23, 49, 62,195, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 25, 62, 14, 56, 90, 63,162, 23, 49, 62,195, 83, 78, 63,
+ 34, 16, 81, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 34, 16, 81, 62,
+131, 64, 88, 63,166,200, 91, 62,147, 39, 75, 63, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 62, 19, 86, 60, 63, 92, 33,101, 62,146, 55, 52, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92, 33,101, 62,146, 55, 52, 63, 14,139,103, 62,
+199,228, 40, 63, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 23,200, 37, 63, 0, 0,128, 62, 47, 12, 49, 63, 14,139,103, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,139,103, 62,199,228, 40, 63, 92, 33,101, 62,146, 55, 52, 63,230, 32, 78, 62,
+211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,223,254, 71, 62,102,155, 54, 63,
+230, 32, 78, 62,211, 52, 43, 63, 92, 33,101, 62,146, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 92, 33,101, 62,146, 55, 52, 63, 23, 58, 97, 62, 69,233, 63, 63,223,254, 71, 62,102,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 82, 64, 62,183,236, 65, 63,223,254, 71, 62,102,155, 54, 63,
+ 23, 58, 97, 62, 69,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 58, 97, 62,
+ 69,233, 63, 63, 92, 33,101, 62,146, 55, 52, 63, 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 62, 13,228, 82, 63,166,200, 91, 62,147, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,166,200, 91, 62,147, 39, 75, 63, 23, 58, 97, 62,
+ 69,233, 63, 63, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 62,228,153, 71, 63, 23, 58, 97, 62, 69,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 58, 97, 62, 69,233, 63, 63,166,200, 91, 62,147, 39, 75, 63,240, 82, 64, 62,
+183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,223,254, 71, 62,102,155, 54, 63,
+240, 82, 64, 62,183,236, 65, 63,173,235, 42, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,173,235, 42, 62,254,204, 55, 63,105, 20, 52, 62,198,160, 44, 63,223,254, 71, 62,102,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230, 32, 78, 62,211, 52, 43, 63,223,254, 71, 62,102,155, 54, 63,
+105, 20, 52, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,105, 20, 52, 62,
+198,160, 44, 63,173,235, 42, 62,254,204, 55, 63,173,153, 25, 62, 27, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 62, 8,114,105, 63,230, 1, 64, 62, 49, 26, 99, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230, 1, 64, 62, 49, 26, 99, 63, 34, 16, 81, 62,
+131, 64, 88, 63, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 62, 58, 46, 94, 63, 34, 16, 81, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 34, 16, 81, 62,131, 64, 88, 63,230, 1, 64, 62, 49, 26, 99, 63,160,153, 25, 62,
+ 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164, 98,230, 61, 58, 26, 99, 63,
+160,153, 25, 62, 14, 56, 90, 63,230, 1, 64, 62, 49, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,230, 1, 64, 62, 49, 26, 99, 63,159,153, 25, 62,210,154,109, 63,164, 98,230, 61, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237,203, 76, 61, 22,114,105, 63,164, 98,230, 61, 58, 26, 99, 63,
+159,153, 25, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,159,153, 25, 62,
+210,154,109, 63,230, 1, 64, 62, 49, 26, 99, 63, 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,232,187,116, 63, 3,153, 59, 63, 0, 0,128, 63, 95,102,134, 63,242,187,116, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,210,203, 76, 61,242,187,116, 63,159,153, 25, 62,
+210,154,109, 63, 0, 0,128, 62,232,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 62,232,187,116, 63,159,153, 25, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,159,153, 25, 62,210,154,109, 63,210,203, 76, 61,242,187,116, 63,237,203, 76, 61,
+ 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164, 98,230, 61, 58, 26, 99, 63,
+237,203, 76, 61, 22,114,105, 63,234,203, 76, 61, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,234,203, 76, 61, 79, 46, 94, 63, 23, 70,196, 61,147, 64, 88, 63,164, 98,230, 61, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 25, 62, 14, 56, 90, 63,164, 98,230, 61, 58, 26, 99, 63,
+ 23, 70,196, 61,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 70,196, 61,
+147, 64, 88, 63,234,203, 76, 61, 79, 46, 94, 63,243,203, 76, 61, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 42,138,170, 62,254,204, 55, 63,136,214,159, 62,183,236, 65, 63,145, 0,156, 62,102,155, 54, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 0,156, 62,102,155, 54, 63,204,245,165, 62,
+198,160, 44, 63, 42,138,170, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42, 51,179, 62, 28, 28, 45, 63, 42,138,170, 62,254,204, 55, 63,204,245,165, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204,245,165, 62,198,160, 44, 63,145, 0,156, 62,102,155, 54, 63,141,239,152, 62,
+211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,111,141, 62,146, 55, 52, 63,
+141,239,152, 62,211, 52, 43, 63,145, 0,156, 62,102,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,145, 0,156, 62,102,155, 54, 63,245, 98,143, 62, 68,233, 63, 63, 82,111,141, 62,146, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 19, 86, 60, 63, 82,111,141, 62,146, 55, 52, 63,
+245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245, 98,143, 62,
+ 68,233, 63, 63,145, 0,156, 62,102,155, 54, 63,136,214,159, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 62,228,153, 71, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,228,153, 71, 63,245, 98,143, 62,
+ 68,233, 63, 63,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136,214,159, 62,183,236, 65, 63,173, 27,146, 62,147, 39, 75, 63,245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 62,
+ 19, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,111,141, 62,146, 55, 52, 63,
+ 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0,128, 62, 47, 12, 49, 63,121, 58,140, 62,199,228, 40, 63, 82,111,141, 62,146, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,141,239,152, 62,211, 52, 43, 63, 82,111,141, 62,146, 55, 52, 63,
+121, 58,140, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121, 58,140, 62,
+199,228, 40, 63, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 62, 23,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,173, 27,146, 62,147, 39, 75, 63,136,214,159, 62,183,236, 65, 63, 47,116,167, 62,195, 83, 78, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 47,116,167, 62,195, 83, 78, 63,239,119,151, 62,
+131, 64, 88, 63,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 13,228, 82, 63,173, 27,146, 62,147, 39, 75, 63,239,119,151, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,119,151, 62,131, 64, 88, 63, 47,116,167, 62,195, 83, 78, 63, 49, 51,179, 62,
+ 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,242,190, 62,205, 83, 78, 63,
+ 49, 51,179, 62, 14, 56, 90, 63, 47,116,167, 62,195, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 47,116,167, 62,195, 83, 78, 63, 42, 51,179, 62,108, 23, 67, 63, 44,242,190, 62,205, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,143,198, 62,200,236, 65, 63, 44,242,190, 62,205, 83, 78, 63,
+ 42, 51,179, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 51,179, 62,
+108, 23, 67, 63, 47,116,167, 62,195, 83, 78, 63,136,214,159, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 42,138,170, 62,254,204, 55, 63, 42, 51,179, 62, 28, 28, 45, 63, 45,220,187, 62, 7,205, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 45,220,187, 62, 7,205, 55, 63, 42, 51,179, 62,
+108, 23, 67, 63, 42,138,170, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136,214,159, 62,183,236, 65, 63, 42,138,170, 62,254,204, 55, 63, 42, 51,179, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 51,179, 62,108, 23, 67, 63, 45,220,187, 62, 7,205, 55, 63,214,143,198, 62,
+200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,242,190, 62,205, 83, 78, 63,
+214,143,198, 62,200,236, 65, 63,188, 74,212, 62,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,188, 74,212, 62,171, 39, 75, 63,122,238,206, 62,147, 64, 88, 63, 44,242,190, 62,205, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62, 14, 56, 90, 63, 44,242,190, 62,205, 83, 78, 63,
+122,238,206, 62,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,238,206, 62,
+147, 64, 88, 63,188, 74,212, 62,171, 39, 75, 63,130,102,230, 62, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 82, 12, 49, 63,129,102,230, 62, 53, 86, 60, 63, 28,247,216, 62,172, 55, 52, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 28,247,216, 62,172, 55, 52, 63,243, 43,218, 62,
+223,228, 40, 63,130,102,230, 62, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+129,102,230, 62, 48,200, 37, 63,130,102,230, 62, 82, 12, 49, 63,243, 43,218, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243, 43,218, 62,223,228, 40, 63, 28,247,216, 62,172, 55, 52, 63,212,118,205, 62,
+228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,206,101,202, 62,120,155, 54, 63,
+212,118,205, 62,228, 52, 43, 63, 28,247,216, 62,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 28,247,216, 62,172, 55, 52, 63,120, 3,215, 62, 95,233, 63, 63,206,101,202, 62,120,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,143,198, 62,200,236, 65, 63,206,101,202, 62,120,155, 54, 63,
+120, 3,215, 62, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120, 3,215, 62,
+ 95,233, 63, 63, 28,247,216, 62,172, 55, 52, 63,129,102,230, 62, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 1,154, 71, 63,130,102,230, 62, 41,228, 82, 63,188, 74,212, 62,171, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188, 74,212, 62,171, 39, 75, 63,120, 3,215, 62,
+ 95,233, 63, 63,130,102,230, 62, 1,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+129,102,230, 62, 53, 86, 60, 63,130,102,230, 62, 1,154, 71, 63,120, 3,215, 62, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120, 3,215, 62, 95,233, 63, 63,188, 74,212, 62,171, 39, 75, 63,214,143,198, 62,
+200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,206,101,202, 62,120,155, 54, 63,
+214,143,198, 62,200,236, 65, 63, 45,220,187, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 45,220,187, 62, 7,205, 55, 63,142,112,192, 62,207,160, 44, 63,206,101,202, 62,120,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,118,205, 62,228, 52, 43, 63,206,101,202, 62,120,155, 54, 63,
+142,112,192, 62,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,142,112,192, 62,
+207,160, 44, 63, 45,220,187, 62, 7,205, 55, 63, 42, 51,179, 62, 28, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,131,102,230, 62, 79, 46, 94, 63,131,102,230, 62, 22,114,105, 63, 87,103,198, 62, 58, 26, 99, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87,103,198, 62, 58, 26, 99, 63,122,238,206, 62,
+147, 64, 88, 63,131,102,230, 62, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+130,102,230, 62, 41,228, 82, 63,131,102,230, 62, 79, 46, 94, 63,122,238,206, 62,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,238,206, 62,147, 64, 88, 63, 87,103,198, 62, 58, 26, 99, 63, 49, 51,179, 62,
+ 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,255,159, 62, 49, 26, 99, 63,
+ 49, 51,179, 62, 14, 56, 90, 63, 87,103,198, 62, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 87,103,198, 62, 58, 26, 99, 63, 49, 51,179, 62,210,154,109, 63, 14,255,159, 62, 49, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 8,114,105, 63, 14,255,159, 62, 49, 26, 99, 63,
+ 49, 51,179, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62,
+210,154,109, 63, 87,103,198, 62, 58, 26, 99, 63,131,102,230, 62, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,134,102,230, 62,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63, 0, 0,128, 62,232,187,116, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,232,187,116, 63, 49, 51,179, 62,
+210,154,109, 63,134,102,230, 62,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+131,102,230, 62, 22,114,105, 63,134,102,230, 62,242,187,116, 63, 49, 51,179, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62,210,154,109, 63, 0, 0,128, 62,232,187,116, 63, 0, 0,128, 62,
+ 8,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,255,159, 62, 49, 26, 99, 63,
+ 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0,128, 62, 58, 46, 94, 63,239,119,151, 62,131, 64, 88, 63, 14,255,159, 62, 49, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62, 14, 56, 90, 63, 14,255,159, 62, 49, 26, 99, 63,
+239,119,151, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,119,151, 62,
+131, 64, 88, 63, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 93,120, 8, 63, 11,205, 55, 63,140, 30, 3, 63,201,236, 65, 63,145, 51, 1, 63,121,155, 54, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 51, 1, 63,121,155, 54, 63, 46, 46, 6, 63,
+211,160, 44, 63, 93,120, 8, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+220,204, 12, 63, 35, 28, 45, 63, 93,120, 8, 63, 11,205, 55, 63, 46, 46, 6, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 46, 46, 6, 63,211,160, 44, 63,145, 51, 1, 63,121,155, 54, 63, 30, 86,255, 62,
+230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,213,243, 62,172, 55, 52, 63,
+ 30, 86,255, 62,230, 52, 43, 63,145, 51, 1, 63,121,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,145, 51, 1, 63,121,155, 54, 63,128,201,245, 62, 94,233, 63, 63,222,213,243, 62,172, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 53, 86, 60, 63,222,213,243, 62,172, 55, 52, 63,
+128,201,245, 62, 94,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,201,245, 62,
+ 94,233, 63, 63,145, 51, 1, 63,121,155, 54, 63,140, 30, 3, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 59,130,248, 62,169, 39, 75, 63,130,102,230, 62, 41,228, 82, 63,130,102,230, 62, 1,154, 71, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 1,154, 71, 63,128,201,245, 62,
+ 94,233, 63, 63, 59,130,248, 62,169, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+140, 30, 3, 63,201,236, 65, 63, 59,130,248, 62,169, 39, 75, 63,128,201,245, 62, 94,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,201,245, 62, 94,233, 63, 63,130,102,230, 62, 1,154, 71, 63,129,102,230, 62,
+ 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,213,243, 62,172, 55, 52, 63,
+129,102,230, 62, 53, 86, 60, 63,130,102,230, 62, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,130,102,230, 62, 82, 12, 49, 63, 9,161,242, 62,223,228, 40, 63,222,213,243, 62,172, 55, 52, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 86,255, 62,230, 52, 43, 63,222,213,243, 62,172, 55, 52, 63,
+ 9,161,242, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9,161,242, 62,
+223,228, 40, 63,130,102,230, 62, 82, 12, 49, 63,129,102,230, 62, 48,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 59,130,248, 62,169, 39, 75, 63,140, 30, 3, 63,201,236, 65, 63, 94,237, 6, 63,207, 83, 78, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94,237, 6, 63,207, 83, 78, 63,118,222,253, 62,
+148, 64, 88, 63, 59,130,248, 62,169, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+130,102,230, 62, 41,228, 82, 63, 59,130,248, 62,169, 39, 75, 63,118,222,253, 62,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,222,253, 62,148, 64, 88, 63, 94,237, 6, 63,207, 83, 78, 63,220,204, 12, 63,
+ 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,172, 18, 63,207, 83, 78, 63,
+220,204, 12, 63, 22, 56, 90, 63, 94,237, 6, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 94,237, 6, 63,207, 83, 78, 63,220,204, 12, 63,115, 23, 67, 63, 88,172, 18, 63,207, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,123, 22, 63,201,236, 65, 63, 88,172, 18, 63,207, 83, 78, 63,
+220,204, 12, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63,
+115, 23, 67, 63, 94,237, 6, 63,207, 83, 78, 63,140, 30, 3, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 93,120, 8, 63, 11,205, 55, 63,220,204, 12, 63, 35, 28, 45, 63, 91, 33, 17, 63, 9,205, 55, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91, 33, 17, 63, 9,205, 55, 63,220,204, 12, 63,
+115, 23, 67, 63, 93,120, 8, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+140, 30, 3, 63,201,236, 65, 63, 93,120, 8, 63, 11,205, 55, 63,220,204, 12, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63,115, 23, 67, 63, 91, 33, 17, 63, 9,205, 55, 63, 44,123, 22, 63,
+201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,172, 18, 63,207, 83, 78, 63,
+ 44,123, 22, 63,201,236, 65, 63,153, 88, 29, 63,167, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,153, 88, 29, 63,167, 39, 75, 63,121,170, 26, 63,147, 64, 88, 63, 88,172, 18, 63,207, 83, 78, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 22, 56, 90, 63, 88,172, 18, 63,207, 83, 78, 63,
+121,170, 26, 63,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121,170, 26, 63,
+147, 64, 88, 63,153, 88, 29, 63,167, 39, 75, 63,118,102, 38, 63, 38,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 78, 12, 49, 63,117,102, 38, 63, 50, 86, 60, 63,200,174, 31, 63,169, 55, 52, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,200,174, 31, 63,169, 55, 52, 63, 51, 73, 32, 63,
+221,228, 40, 63,117,102, 38, 63, 78, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102, 38, 63, 45,200, 37, 63,117,102, 38, 63, 78, 12, 49, 63, 51, 73, 32, 63,221,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 73, 32, 63,221,228, 40, 63,200,174, 31, 63,169, 55, 52, 63,169,238, 25, 63,
+229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,102, 24, 63,119,155, 54, 63,
+169,238, 25, 63,229, 52, 43, 63,200,174, 31, 63,169, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,200,174, 31, 63,169, 55, 52, 63,246,180, 30, 63, 92,233, 63, 63, 39,102, 24, 63,119,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,123, 22, 63,201,236, 65, 63, 39,102, 24, 63,119,155, 54, 63,
+246,180, 30, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,180, 30, 63,
+ 92,233, 63, 63,200,174, 31, 63,169, 55, 52, 63,117,102, 38, 63, 50, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63,255,153, 71, 63,118,102, 38, 63, 38,228, 82, 63,153, 88, 29, 63,167, 39, 75, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,153, 88, 29, 63,167, 39, 75, 63,246,180, 30, 63,
+ 92,233, 63, 63,117,102, 38, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102, 38, 63, 50, 86, 60, 63,117,102, 38, 63,255,153, 71, 63,246,180, 30, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,180, 30, 63, 92,233, 63, 63,153, 88, 29, 63,167, 39, 75, 63, 44,123, 22, 63,
+201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,102, 24, 63,119,155, 54, 63,
+ 44,123, 22, 63,201,236, 65, 63, 91, 33, 17, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 91, 33, 17, 63, 9,205, 55, 63,138,107, 19, 63,211,160, 44, 63, 39,102, 24, 63,119,155, 54, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,238, 25, 63,229, 52, 43, 63, 39,102, 24, 63,119,155, 54, 63,
+138,107, 19, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,107, 19, 63,
+211,160, 44, 63, 91, 33, 17, 63, 9,205, 55, 63,220,204, 12, 63, 35, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 77, 46, 94, 63,118,102, 38, 63, 19,114,105, 63,235,102, 22, 63, 59, 26, 99, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235,102, 22, 63, 59, 26, 99, 63,121,170, 26, 63,
+147, 64, 88, 63,118,102, 38, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,102, 38, 63, 38,228, 82, 63,118,102, 38, 63, 77, 46, 94, 63,121,170, 26, 63,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121,170, 26, 63,147, 64, 88, 63,235,102, 22, 63, 59, 26, 99, 63,220,204, 12, 63,
+ 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 50, 3, 63, 58, 26, 99, 63,
+220,204, 12, 63, 22, 56, 90, 63,235,102, 22, 63, 59, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,235,102, 22, 63, 59, 26, 99, 63,224,204, 12, 63,212,154,109, 63,204, 50, 3, 63, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,102,230, 62, 22,114,105, 63,204, 50, 3, 63, 58, 26, 99, 63,
+224,204, 12, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,204, 12, 63,
+212,154,109, 63,235,102, 22, 63, 59, 26, 99, 63,118,102, 38, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,120,102, 38, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,134,102,230, 62,242,187,116, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134,102,230, 62,242,187,116, 63,224,204, 12, 63,
+212,154,109, 63,120,102, 38, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,102, 38, 63, 19,114,105, 63,120,102, 38, 63,242,187,116, 63,224,204, 12, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,204, 12, 63,212,154,109, 63,134,102,230, 62,242,187,116, 63,131,102,230, 62,
+ 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 50, 3, 63, 58, 26, 99, 63,
+131,102,230, 62, 22,114,105, 63,131,102,230, 62, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,131,102,230, 62, 79, 46, 94, 63,118,222,253, 62,148, 64, 88, 63,204, 50, 3, 63, 58, 26, 99, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 22, 56, 90, 63,204, 50, 3, 63, 58, 26, 99, 63,
+118,222,253, 62,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,222,253, 62,
+148, 64, 88, 63,131,102,230, 62, 79, 46, 94, 63,130,102,230, 62, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,213,233, 76, 63, 35, 48, 21, 63,176,235, 70, 63,226,209, 22, 63, 80,234, 73, 63,146,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80,234, 73, 63,146,111, 11, 63, 1,200, 79, 63,
+ 94,152, 9, 63,213,233, 76, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 19,215, 82, 63,252, 29, 19, 63,213,233, 76, 63, 35, 48, 21, 63, 1,200, 79, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,200, 79, 63, 94,152, 9, 63, 80,234, 73, 63,146,111, 11, 63,193,204, 76, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213,233, 76, 63, 35, 48, 21, 63,
+ 19,215, 82, 63,252, 29, 19, 63,220, 41, 80, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,220, 41, 80, 63,105, 60, 31, 63,164,219, 73, 63,173, 23, 33, 63,213,233, 76, 63, 35, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,235, 70, 63,226,209, 22, 63,213,233, 76, 63, 35, 48, 21, 63,
+164,219, 73, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,219, 73, 63,
+173, 23, 33, 63,220, 41, 80, 63,105, 60, 31, 63,196, 33, 77, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,169,158, 70, 63,200,160, 44, 63, 0, 0, 64, 63, 24, 28, 45, 63, 5,171, 67, 63,216, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 5,171, 67, 63,216, 17, 34, 63,164,219, 73, 63,
+173, 23, 33, 63,169,158, 70, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+196, 33, 77, 63,221, 52, 43, 63,169,158, 70, 63,200,160, 44, 63,164,219, 73, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,219, 73, 63,173, 23, 33, 63, 5,171, 67, 63,216, 17, 34, 63,176,235, 70, 63,
+226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 75,124, 83, 63,217,228, 40, 63,
+196, 33, 77, 63,221, 52, 43, 63,220, 41, 80, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,220, 41, 80, 63,105, 60, 31, 63,218, 20, 86, 63,143,140, 28, 63, 75,124, 83, 63,217,228, 40, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 45,200, 37, 63, 75,124, 83, 63,217,228, 40, 63,
+218, 20, 86, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218, 20, 86, 63,
+143,140, 28, 63,220, 41, 80, 63,105, 60, 31, 63, 19,215, 82, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,182, 32, 23, 63,176,235, 70, 63,226,209, 22, 63, 5,171, 67, 63,216, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 5,171, 67, 63,216, 17, 34, 63,251, 84, 60, 63,
+216, 17, 34, 63, 0, 0, 64, 63,182, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80, 20, 57, 63,226,209, 22, 63, 0, 0, 64, 63,182, 32, 23, 63,251, 84, 60, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251, 84, 60, 63,216, 17, 34, 63, 5,171, 67, 63,216, 17, 34, 63, 0, 0, 64, 63,
+ 24, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,182, 32, 23, 63,
+ 80, 20, 57, 63,226,209, 22, 63,169,156, 60, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,169,156, 60, 63, 96,116, 11, 63, 87, 99, 67, 63, 96,116, 11, 63, 0, 0, 64, 63,182, 32, 23, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,235, 70, 63,226,209, 22, 63, 0, 0, 64, 63,182, 32, 23, 63,
+ 87, 99, 67, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 99, 67, 63,
+ 96,116, 11, 63,169,156, 60, 63, 96,116, 11, 63, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 96,102, 70, 63,244, 1, 0, 63,193,204, 76, 63, 0, 0, 0, 63, 80,234, 73, 63,146,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80,234, 73, 63,146,111, 11, 63, 87, 99, 67, 63,
+ 96,116, 11, 63, 96,102, 70, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 0, 0, 0, 63, 96,102, 70, 63,244, 1, 0, 63, 87, 99, 67, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 99, 67, 63, 96,116, 11, 63, 80,234, 73, 63,146,111, 11, 63,176,235, 70, 63,
+226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 57, 63,244, 1, 0, 63,
+ 0, 0, 64, 63, 0, 0, 0, 63,169,156, 60, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,169,156, 60, 63, 96,116, 11, 63,176, 21, 54, 63,146,111, 11, 63,160,153, 57, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 51, 51, 63, 0, 0, 0, 63,160,153, 57, 63,244, 1, 0, 63,
+176, 21, 54, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176, 21, 54, 63,
+146,111, 11, 63,169,156, 60, 63, 96,116, 11, 63, 80, 20, 57, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 93, 58,217, 62,144, 61, 57, 63, 19,196,217, 62, 85,123, 60, 63,253,230,198, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 85,123, 60, 63,253,230,198, 62,171,132, 67, 63,
+253,230,198, 62, 0, 0, 64, 63, 93, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+112,194, 70, 63, 19,196,217, 62, 0, 0, 64, 63, 93, 58,217, 62,171,132, 67, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171,132, 67, 63,253,230,198, 62, 85,123, 60, 63,253,230,198, 62, 0, 0, 64, 63,
+211,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 93, 58,217, 62,
+112,194, 70, 63, 19,196,217, 62,125, 84, 67, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,125, 84, 67, 63, 42,211,236, 62,131,171, 60, 63, 42,211,236, 62, 0, 0, 64, 63, 93, 58,217, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 61, 57, 63, 19,196,217, 62, 0, 0, 64, 63, 93, 58,217, 62,
+131,171, 60, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,171, 60, 63,
+ 42,211,236, 62,125, 84, 67, 63, 42,211,236, 62, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,160,153, 57, 63,244, 1, 0, 63, 63, 51, 51, 63, 0, 0, 0, 63,128, 46, 54, 63, 75,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128, 46, 54, 63, 75,207,236, 62,131,171, 60, 63,
+ 42,211,236, 62,160,153, 57, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 0, 0, 0, 63,160,153, 57, 63,244, 1, 0, 63,131,171, 60, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,171, 60, 63, 42,211,236, 62,128, 46, 54, 63, 75,207,236, 62,144, 61, 57, 63,
+ 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 96,102, 70, 63,244, 1, 0, 63,
+ 0, 0, 64, 63, 0, 0, 0, 63,125, 84, 67, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,125, 84, 67, 63, 42,211,236, 62,128,209, 73, 63, 75,207,236, 62, 96,102, 70, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,204, 76, 63, 0, 0, 0, 63, 96,102, 70, 63,244, 1, 0, 63,
+128,209, 73, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,209, 73, 63,
+ 75,207,236, 62,125, 84, 67, 63, 42,211,236, 62,112,194, 70, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 43, 22, 51, 63, 35, 48, 21, 63,237, 40, 45, 63,252, 29, 19, 63,255, 55, 48, 63, 94,152, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255, 55, 48, 63, 94,152, 9, 63,176, 21, 54, 63,
+146,111, 11, 63, 43, 22, 51, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80, 20, 57, 63,226,209, 22, 63, 43, 22, 51, 63, 35, 48, 21, 63,176, 21, 54, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176, 21, 54, 63,146,111, 11, 63,255, 55, 48, 63, 94,152, 9, 63, 63, 51, 51, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43, 22, 51, 63, 35, 48, 21, 63,
+ 80, 20, 57, 63,226,209, 22, 63, 91, 36, 54, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 91, 36, 54, 63,173, 23, 33, 63, 36,214, 47, 63,105, 60, 31, 63, 43, 22, 51, 63, 35, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40, 45, 63,252, 29, 19, 63, 43, 22, 51, 63, 35, 48, 21, 63,
+ 36,214, 47, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36,214, 47, 63,
+105, 60, 31, 63, 91, 36, 54, 63,173, 23, 33, 63, 60,222, 50, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,181,131, 44, 63,216,228, 40, 63,117,102, 38, 63, 45,200, 37, 63, 38,235, 41, 63,141,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38,235, 41, 63,141,140, 28, 63, 36,214, 47, 63,
+105, 60, 31, 63,181,131, 44, 63,216,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 60,222, 50, 63,221, 52, 43, 63,181,131, 44, 63,216,228, 40, 63, 36,214, 47, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36,214, 47, 63,105, 60, 31, 63, 38,235, 41, 63,141,140, 28, 63,237, 40, 45, 63,
+252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 97, 57, 63,200,160, 44, 63,
+ 60,222, 50, 63,221, 52, 43, 63, 91, 36, 54, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 91, 36, 54, 63,173, 23, 33, 63,251, 84, 60, 63,216, 17, 34, 63, 87, 97, 57, 63,200,160, 44, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 24, 28, 45, 63, 87, 97, 57, 63,200,160, 44, 63,
+251, 84, 60, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251, 84, 60, 63,
+216, 17, 34, 63, 91, 36, 54, 63,173, 23, 33, 63, 80, 20, 57, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,134, 14,128, 63, 39, 48, 21, 63,227, 30,122, 63,233,209, 22, 63,138, 29,125, 63,150,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138, 29,125, 63,150,111, 11, 63,159,125,129, 63,
+ 94,152, 9, 63,134, 14,128, 63, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+174, 73,193, 60,253, 29, 19, 63,209, 92,232, 57, 39, 48, 21, 63,114,207, 62, 60, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,159,125,129, 63, 94,152, 9, 63,138, 29,125, 63,150,111, 11, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,209, 92,232, 57, 39, 48, 21, 63,
+174, 73,193, 60,253, 29, 19, 63,214, 67, 87, 60,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,136,174,129, 63,110, 60, 31, 63,213, 14,125, 63,180, 23, 33, 63,134, 14,128, 63, 39, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,227, 30,122, 63,233,209, 22, 63,134, 14,128, 63, 39, 48, 21, 63,
+213, 14,125, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 14,125, 63,
+180, 23, 33, 63,136,174,129, 63,110, 60, 31, 63,121, 42,128, 63,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,210,209,121, 63,212,160, 44, 63, 36, 51,115, 63, 36, 28, 45, 63, 49,222,118, 63,226, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49,222,118, 63,226, 17, 34, 63,213, 14,125, 63,
+180, 23, 33, 63,210,209,121, 63,212,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+121, 42,128, 63,230, 52, 43, 63,210,209,121, 63,212,160, 44, 63,213, 14,125, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 14,125, 63,180, 23, 33, 63, 49,222,118, 63,226, 17, 34, 63,227, 30,122, 63,
+233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,239,213, 60,223,228, 40, 63,
+120,226,169, 58,230, 52, 43, 63,214, 67, 87, 60,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,214, 67, 87, 60,110, 60, 31, 63, 13,129, 20, 61,143,140, 28, 63,111,239,213, 60,223,228, 40, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 48,200, 37, 63,111,239,213, 60,223,228, 40, 63,
+ 13,129, 20, 61,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 13,129, 20, 61,
+143,140, 28, 63,214, 67, 87, 60,110, 60, 31, 63,174, 73,193, 60,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 44, 51,115, 63,188, 32, 23, 63,227, 30,122, 63,233,209, 22, 63, 49,222,118, 63,226, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49,222,118, 63,226, 17, 34, 63, 31,136,111, 63,
+225, 17, 34, 63, 44, 51,115, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+116, 71,108, 63,232,209, 22, 63, 44, 51,115, 63,188, 32, 23, 63, 31,136,111, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31,136,111, 63,225, 17, 34, 63, 49,222,118, 63,226, 17, 34, 63, 36, 51,115, 63,
+ 36, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44, 51,115, 63,188, 32, 23, 63,
+116, 71,108, 63,232,209, 22, 63,213,207,111, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,213,207,111, 63,100,116, 11, 63,138,150,118, 63,101,116, 11, 63, 44, 51,115, 63,188, 32, 23, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,227, 30,122, 63,233,209, 22, 63, 44, 51,115, 63,188, 32, 23, 63,
+138,150,118, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,150,118, 63,
+101,116, 11, 63,213,207,111, 63,100,116, 11, 63, 51, 51,115, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,138, 29,125, 63,150,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138, 29,125, 63,150,111, 11, 63,138,150,118, 63,
+101,116, 11, 63,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 51, 51,115, 63, 0, 0, 0, 63,154,153,121, 63,244, 1, 0, 63,138,150,118, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,150,118, 63,101,116, 11, 63,138, 29,125, 63,150,111, 11, 63,227, 30,122, 63,
+233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,204,108, 63,244, 1, 0, 63,
+ 51, 51,115, 63, 0, 0, 0, 63,213,207,111, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,213,207,111, 63,100,116, 11, 63,213, 72,105, 63,149,111, 11, 63,205,204,108, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,102, 63, 0, 0, 0, 63,205,204,108, 63,244, 1, 0, 63,
+213, 72,105, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 72,105, 63,
+149,111, 11, 63,213,207,111, 63,100,116, 11, 63,116, 71,108, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 58, 51,115, 63, 73, 58,217, 62,192,112,108, 63, 4,196,217, 62,139,174,111, 63,223,230,198, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,174,111, 63,223,230,198, 62,239,183,118, 63,
+227,230,198, 62, 58, 51,115, 63, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179,245,121, 63, 6,196,217, 62, 58, 51,115, 63, 73, 58,217, 62,239,183,118, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,183,118, 63,227,230,198, 62,139,174,111, 63,223,230,198, 62, 65, 51,115, 63,
+160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58, 51,115, 63, 73, 58,217, 62,
+179,245,121, 63, 6,196,217, 62,185,135,118, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,185,135,118, 63, 30,211,236, 62,180,222,111, 63, 30,211,236, 62, 58, 51,115, 63, 73, 58,217, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,112,108, 63, 4,196,217, 62, 58, 51,115, 63, 73, 58,217, 62,
+180,222,111, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,222,111, 63,
+ 30,211,236, 62,185,135,118, 63, 30,211,236, 62, 51, 51,115, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,205,204,108, 63,244, 1, 0, 63,101,102,102, 63, 0, 0, 0, 63,170, 97,105, 63, 65,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170, 97,105, 63, 65,207,236, 62,180,222,111, 63,
+ 30,211,236, 62,205,204,108, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 51, 51,115, 63, 0, 0, 0, 63,205,204,108, 63,244, 1, 0, 63,180,222,111, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,222,111, 63, 30,211,236, 62,170, 97,105, 63, 65,207,236, 62,192,112,108, 63,
+ 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,121, 63,244, 1, 0, 63,
+ 51, 51,115, 63, 0, 0, 0, 63,185,135,118, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,185,135,118, 63, 30,211,236, 62,194, 4,125, 63, 67,207,236, 62,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63,154,153,121, 63,244, 1, 0, 63,
+194, 4,125, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194, 4,125, 63,
+ 67,207,236, 62,185,135,118, 63, 30,211,236, 62,179,245,121, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 76, 73,102, 63, 38, 48, 21, 63, 11, 92, 96, 63,253, 29, 19, 63, 33,107, 99, 63, 94,152, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 33,107, 99, 63, 94,152, 9, 63,213, 72,105, 63,
+149,111, 11, 63, 76, 73,102, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+116, 71,108, 63,232,209, 22, 63, 76, 73,102, 63, 38, 48, 21, 63,213, 72,105, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 72,105, 63,149,111, 11, 63, 33,107, 99, 63, 94,152, 9, 63,101,102,102, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 76, 73,102, 63, 38, 48, 21, 63,
+116, 71,108, 63,232,209, 22, 63,124, 87,105, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,124, 87,105, 63,180, 23, 33, 63, 65, 9, 99, 63,109, 60, 31, 63, 76, 73,102, 63, 38, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11, 92, 96, 63,253, 29, 19, 63, 76, 73,102, 63, 38, 48, 21, 63,
+ 65, 9, 99, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 9, 99, 63,
+109, 60, 31, 63,124, 87,105, 63,180, 23, 33, 63, 87, 17,102, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,205,182, 95, 63,222,228, 40, 63,139,153, 89, 63, 45,200, 37, 63, 63, 30, 93, 63,143,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 30, 93, 63,143,140, 28, 63, 65, 9, 99, 63,
+109, 60, 31, 63,205,182, 95, 63,222,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 17,102, 63,229, 52, 43, 63,205,182, 95, 63,222,228, 40, 63, 65, 9, 99, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 9, 99, 63,109, 60, 31, 63, 63, 30, 93, 63,143,140, 28, 63, 11, 92, 96, 63,
+253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,148,108, 63,211,160, 44, 63,
+ 87, 17,102, 63,229, 52, 43, 63,124, 87,105, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,124, 87,105, 63,180, 23, 33, 63, 31,136,111, 63,225, 17, 34, 63,118,148,108, 63,211,160, 44, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 36, 28, 45, 63,118,148,108, 63,211,160, 44, 63,
+ 31,136,111, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31,136,111, 63,
+225, 17, 34, 63,124, 87,105, 63,180, 23, 33, 63,116, 71,108, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 65, 65, 77, 62, 32, 48, 21, 63,152, 72, 53, 62,229,209, 22, 63, 47, 67, 65, 62,147,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 47, 67, 65, 62,147,111, 11, 63,255,185, 88, 62,
+ 90,152, 9, 63, 65, 65, 77, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 64,246,100, 62,246, 29, 19, 63, 65, 65, 77, 62, 32, 48, 21, 63,255,185, 88, 62, 90,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255,185, 88, 62, 90,152, 9, 63, 47, 67, 65, 62,147,111, 11, 63,254,204, 76, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 65, 77, 62, 32, 48, 21, 63,
+ 64,246,100, 62,246, 29, 19, 63, 89, 65, 90, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 89, 65, 90, 62, 94, 60, 31, 63,107, 8, 65, 62,170, 23, 33, 63, 65, 65, 77, 62, 32, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152, 72, 53, 62,229,209, 22, 63, 65, 65, 77, 62, 32, 48, 21, 63,
+107, 8, 65, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107, 8, 65, 62,
+170, 23, 33, 63, 89, 65, 90, 62, 94, 60, 31, 63,230, 32, 78, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,105, 20, 52, 62,198,160, 44, 63,173,153, 25, 62, 27, 28, 45, 63,216, 69, 40, 62,220, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,216, 69, 40, 62,220, 17, 34, 63,107, 8, 65, 62,
+170, 23, 33, 63,105, 20, 52, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+230, 32, 78, 62,211, 52, 43, 63,105, 20, 52, 62,198,160, 44, 63,107, 8, 65, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107, 8, 65, 62,170, 23, 33, 63,216, 69, 40, 62,220, 17, 34, 63,152, 72, 53, 62,
+229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,139,103, 62,199,228, 40, 63,
+230, 32, 78, 62,211, 52, 43, 63, 89, 65, 90, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 89, 65, 90, 62, 94, 60, 31, 63, 83,237,113, 62,130,140, 28, 63, 14,139,103, 62,199,228, 40, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 23,200, 37, 63, 14,139,103, 62,199,228, 40, 63,
+ 83,237,113, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 83,237,113, 62,
+130,140, 28, 63, 89, 65, 90, 62, 94, 60, 31, 63, 64,246,100, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,180,153, 25, 62,185, 32, 23, 63,152, 72, 53, 62,229,209, 22, 63,216, 69, 40, 62,220, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,216, 69, 40, 62,220, 17, 34, 63,133,237, 10, 62,
+219, 17, 34, 63,180,153, 25, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+147,213,251, 61,228,209, 22, 63,180,153, 25, 62,185, 32, 23, 63,133,237, 10, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133,237, 10, 62,219, 17, 34, 63,216, 69, 40, 62,220, 17, 34, 63,173,153, 25, 62,
+ 27, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,153, 25, 62,185, 32, 23, 63,
+147,213,251, 61,228,209, 22, 63, 67, 12, 12, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 67, 12, 12, 62, 98,116, 11, 63, 34, 39, 39, 62, 98,116, 11, 63,180,153, 25, 62,185, 32, 23, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152, 72, 53, 62,229,209, 22, 63,180,153, 25, 62,185, 32, 23, 63,
+ 34, 39, 39, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 34, 39, 39, 62,
+ 98,116, 11, 63, 67, 12, 12, 62, 98,116, 11, 63,181,153, 25, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 92, 51, 51, 62,244, 1, 0, 63,254,204, 76, 62, 0, 0, 0, 63, 47, 67, 65, 62,147,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 47, 67, 65, 62,147,111, 11, 63, 34, 39, 39, 62,
+ 98,116, 11, 63, 92, 51, 51, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+181,153, 25, 62, 0, 0, 0, 63, 92, 51, 51, 62,244, 1, 0, 63, 34, 39, 39, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 34, 39, 39, 62, 98,116, 11, 63, 47, 67, 65, 62,147,111, 11, 63,152, 72, 53, 62,
+229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 62,244, 1, 0, 63,
+181,153, 25, 62, 0, 0, 0, 63, 67, 12, 12, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 67, 12, 12, 62, 98,116, 11, 63,109,224,227, 61,147,111, 11, 63, 8, 0, 0, 62,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204,204, 61, 0, 0, 0, 63, 8, 0, 0, 62,244, 1, 0, 63,
+109,224,227, 61,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,224,227, 61,
+147,111, 11, 63, 67, 12, 12, 62, 98,116, 11, 63,147,213,251, 61,228,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,196,153, 25, 62, 73, 58,217, 62,171, 31,253, 61, 6,196,217, 62, 1,135, 11, 62,228,230,198, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,135, 11, 62,228,230,198, 62,153,172, 39, 62,
+230,230,198, 62,196,153, 25, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179,163, 52, 62, 7,196,217, 62,196,153, 25, 62, 73, 58,217, 62,153,172, 39, 62,230,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,153,172, 39, 62,230,230,198, 62, 1,135, 11, 62,228,230,198, 62,214,153, 25, 62,
+165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,153, 25, 62, 73, 58,217, 62,
+179,163, 52, 62, 7,196,217, 62,202,235, 38, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,202,235, 38, 62, 33,211,236, 62,173, 71, 12, 62, 31,211,236, 62,196,153, 25, 62, 73, 58,217, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171, 31,253, 61, 6,196,217, 62,196,153, 25, 62, 73, 58,217, 62,
+173, 71, 12, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173, 71, 12, 62,
+ 31,211,236, 62,202,235, 38, 62, 33,211,236, 62,181,153, 25, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 62,244, 1, 0, 63,215,204,204, 61, 0, 0, 0, 63,251,166,228, 61, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,166,228, 61, 67,207,236, 62,173, 71, 12, 62,
+ 31,211,236, 62, 8, 0, 0, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+181,153, 25, 62, 0, 0, 0, 63, 8, 0, 0, 62,244, 1, 0, 63,173, 71, 12, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173, 71, 12, 62, 31,211,236, 62,251,166,228, 61, 67,207,236, 62,171, 31,253, 61,
+ 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92, 51, 51, 62,244, 1, 0, 63,
+181,153, 25, 62, 0, 0, 0, 63,202,235, 38, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,202,235, 38, 62, 33,211,236, 62,251,223, 64, 62, 67,207,236, 62, 92, 51, 51, 62,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,254,204, 76, 62, 0, 0, 0, 63, 92, 51, 51, 62,244, 1, 0, 63,
+251,223, 64, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,223, 64, 62,
+ 67,207,236, 62,202,235, 38, 62, 33,211,236, 62,179,163, 52, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 42,228,203, 61, 37, 48, 21, 63, 1,122,156, 61,254, 29, 19, 63,172,242,180, 61, 96,152, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,172,242,180, 61, 96,152, 9, 63,109,224,227, 61,
+147,111, 11, 63, 42,228,203, 61, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+147,213,251, 61,228,209, 22, 63, 42,228,203, 61, 37, 48, 21, 63,109,224,227, 61,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,224,227, 61,147,111, 11, 63,172,242,180, 61, 96,152, 9, 63,215,204,204, 61,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,228,203, 61, 37, 48, 21, 63,
+147,213,251, 61,228,209, 22, 63,208, 85,228, 61,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,208, 85,228, 61,179, 23, 33, 63,212,227,177, 61,110, 60, 31, 63, 42,228,203, 61, 37, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,122,156, 61,254, 29, 19, 63, 42,228,203, 61, 37, 48, 21, 63,
+212,227,177, 61,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,227,177, 61,
+110, 60, 31, 63,208, 85,228, 61,179, 23, 33, 63,175, 36,202, 61,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 53, 80,151, 61,223,228, 40, 63,246,203, 76, 61, 48,200, 37, 63,166,139,130, 61,145,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,166,139,130, 61,145,140, 28, 63,212,227,177, 61,
+110, 60, 31, 63, 53, 80,151, 61,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+175, 36,202, 61,228, 52, 43, 63, 53, 80,151, 61,223,228, 40, 63,212,227,177, 61,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,227,177, 61,110, 60, 31, 63,166,139,130, 61,145,140, 28, 63, 1,122,156, 61,
+254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,201, 61,254, 61,207,160, 44, 63,
+175, 36,202, 61,228, 52, 43, 63,208, 85,228, 61,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,208, 85,228, 61,179, 23, 33, 63,133,237, 10, 62,219, 17, 34, 63,201, 61,254, 61,207,160, 44, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,153, 25, 62, 27, 28, 45, 63,201, 61,254, 61,207,160, 44, 63,
+133,237, 10, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133,237, 10, 62,
+219, 17, 34, 63,208, 85,228, 61,179, 23, 33, 63,147,213,251, 61,228,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,245, 6,205, 62, 37, 48, 21, 63,155, 10,193, 62,229,209, 22, 63,229, 7,199, 62,147,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,229, 7,199, 62,147,111, 11, 63, 85,195,210, 62,
+ 96,152, 9, 63,245, 6,205, 62, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128,225,216, 62,254, 29, 19, 63,245, 6,205, 62, 37, 48, 21, 63, 85,195,210, 62, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 85,195,210, 62, 96,152, 9, 63,229, 7,199, 62,147,111, 11, 63,202,204,204, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245, 6,205, 62, 37, 48, 21, 63,
+128,225,216, 62,254, 29, 19, 63, 11,135,211, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 11,135,211, 62,110, 60, 31, 63,140,234,198, 62,179, 23, 33, 63,245, 6,205, 62, 37, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155, 10,193, 62,229,209, 22, 63,245, 6,205, 62, 37, 48, 21, 63,
+140,234,198, 62,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,234,198, 62,
+179, 23, 33, 63, 11,135,211, 62,110, 60, 31, 63,212,118,205, 62,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,142,112,192, 62,207,160, 44, 63, 42, 51,179, 62, 28, 28, 45, 63, 61,137,186, 62,219, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61,137,186, 62,219, 17, 34, 63,140,234,198, 62,
+179, 23, 33, 63,142,112,192, 62,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,118,205, 62,228, 52, 43, 63,142,112,192, 62,207,160, 44, 63,140,234,198, 62,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,234,198, 62,179, 23, 33, 63, 61,137,186, 62,219, 17, 34, 63,155, 10,193, 62,
+229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243, 43,218, 62,223,228, 40, 63,
+212,118,205, 62,228, 52, 43, 63, 11,135,211, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 11,135,211, 62,110, 60, 31, 63, 22, 93,223, 62,145,140, 28, 63,243, 43,218, 62,223,228, 40, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 48,200, 37, 63,243, 43,218, 62,223,228, 40, 63,
+ 22, 93,223, 62,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22, 93,223, 62,
+145,140, 28, 63, 11,135,211, 62,110, 60, 31, 63,128,225,216, 62,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62,185, 32, 23, 63,155, 10,193, 62,229,209, 22, 63, 61,137,186, 62,219, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61,137,186, 62,219, 17, 34, 63, 20,221,171, 62,
+219, 17, 34, 63, 38, 51,179, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+180, 91,165, 62,229,209, 22, 63, 38, 51,179, 62,185, 32, 23, 63, 20,221,171, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20,221,171, 62,219, 17, 34, 63, 61,137,186, 62,219, 17, 34, 63, 42, 51,179, 62,
+ 28, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62,185, 32, 23, 63,
+180, 91,165, 62,229,209, 22, 63,111,108,172, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,111,108,172, 62, 98,116, 11, 63,222,249,185, 62, 98,116, 11, 63, 38, 51,179, 62,185, 32, 23, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155, 10,193, 62,229,209, 22, 63, 38, 51,179, 62,185, 32, 23, 63,
+222,249,185, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,249,185, 62,
+ 98,116, 11, 63,111,108,172, 62, 98,116, 11, 63, 38, 51,179, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,252,255,191, 62,244, 1, 0, 63,202,204,204, 62, 0, 0, 0, 63,229, 7,199, 62,147,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,229, 7,199, 62,147,111, 11, 63,222,249,185, 62,
+ 98,116, 11, 63,252,255,191, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 38, 51,179, 62, 0, 0, 0, 63,252,255,191, 62,244, 1, 0, 63,222,249,185, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,249,185, 62, 98,116, 11, 63,229, 7,199, 62,147,111, 11, 63,155, 10,193, 62,
+229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,102,166, 62,244, 1, 0, 63,
+ 38, 51,179, 62, 0, 0, 0, 63,111,108,172, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,111,108,172, 62, 98,116, 11, 63,104, 94,159, 62,147,111, 11, 63, 82,102,166, 62,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,153,153, 62, 0, 0, 0, 63, 82,102,166, 62,244, 1, 0, 63,
+104, 94,159, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104, 94,159, 62,
+147,111, 11, 63,111,108,172, 62, 98,116, 11, 63,180, 91,165, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 30, 51,179, 62, 73, 58,217, 62, 39,174,165, 62, 7,196,217, 62,180, 41,172, 62,227,230,198, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180, 41,172, 62,227,230,198, 62,127, 60,186, 62,
+225,230,198, 62, 30, 51,179, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21,184,192, 62, 6,196,217, 62, 30, 51,179, 62, 73, 58,217, 62,127, 60,186, 62,225,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,127, 60,186, 62,225,230,198, 62,180, 41,172, 62,227,230,198, 62, 21, 51,179, 62,
+165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 51,179, 62, 73, 58,217, 62,
+ 21,184,192, 62, 6,196,217, 62, 42,220,185, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 42,220,185, 62, 31,211,236, 62, 27,138,172, 62, 33,211,236, 62, 30, 51,179, 62, 73, 58,217, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,174,165, 62, 7,196,217, 62, 30, 51,179, 62, 73, 58,217, 62,
+ 27,138,172, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27,138,172, 62,
+ 33,211,236, 62, 42,220,185, 62, 31,211,236, 62, 38, 51,179, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 82,102,166, 62,244, 1, 0, 63,129,153,153, 62, 0, 0, 0, 63, 3,144,159, 62, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3,144,159, 62, 67,207,236, 62, 27,138,172, 62,
+ 33,211,236, 62, 82,102,166, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 38, 51,179, 62, 0, 0, 0, 63, 82,102,166, 62,244, 1, 0, 63, 27,138,172, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27,138,172, 62, 33,211,236, 62, 3,144,159, 62, 67,207,236, 62, 39,174,165, 62,
+ 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,252,255,191, 62,244, 1, 0, 63,
+ 38, 51,179, 62, 0, 0, 0, 63, 42,220,185, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 42,220,185, 62, 31,211,236, 62, 65,214,198, 62, 67,207,236, 62,252,255,191, 62,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,202,204,204, 62, 0, 0, 0, 63,252,255,191, 62,244, 1, 0, 63,
+ 65,214,198, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65,214,198, 62,
+ 67,207,236, 62, 42,220,185, 62, 31,211,236, 62, 21,184,192, 62, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 95, 95,153, 62, 32, 48, 21, 63,224,132,141, 62,246, 29, 19, 63, 1,163,147, 62, 91,152, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,163,147, 62, 91,152, 9, 63,104, 94,159, 62,
+147,111, 11, 63, 95, 95,153, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+180, 91,165, 62,229,209, 22, 63, 95, 95,153, 62, 32, 48, 21, 63,104, 94,159, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104, 94,159, 62,147,111, 11, 63, 1,163,147, 62, 91,152, 9, 63,129,153,153, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95, 95,153, 62, 32, 48, 21, 63,
+180, 91,165, 62,229,209, 22, 63,203,123,159, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,203,123,159, 62,170, 23, 33, 63, 84,223,146, 62, 94, 60, 31, 63, 95, 95,153, 62, 32, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,132,141, 62,246, 29, 19, 63, 95, 95,153, 62, 32, 48, 21, 63,
+ 84,223,146, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 84,223,146, 62,
+ 94, 60, 31, 63,203,123,159, 62,170, 23, 33, 63,141,239,152, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,121, 58,140, 62,199,228, 40, 63, 0, 0,128, 62, 23,200, 37, 63, 86, 9,135, 62,130,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 86, 9,135, 62,130,140, 28, 63, 84,223,146, 62,
+ 94, 60, 31, 63,121, 58,140, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+141,239,152, 62,211, 52, 43, 63,121, 58,140, 62,199,228, 40, 63, 84,223,146, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 84,223,146, 62, 94, 60, 31, 63, 86, 9,135, 62,130,140, 28, 63,224,132,141, 62,
+246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204,245,165, 62,198,160, 44, 63,
+141,239,152, 62,211, 52, 43, 63,203,123,159, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,203,123,159, 62,170, 23, 33, 63, 20,221,171, 62,219, 17, 34, 63,204,245,165, 62,198,160, 44, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 51,179, 62, 28, 28, 45, 63,204,245,165, 62,198,160, 44, 63,
+ 20,221,171, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20,221,171, 62,
+219, 17, 34, 63,203,123,159, 62,170, 23, 33, 63,180, 91,165, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,180,182, 25, 63, 38, 48, 21, 63,140,184, 19, 63,232,209, 22, 63, 43,183, 22, 63,149,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43,183, 22, 63,149,111, 11, 63,223,148, 28, 63,
+ 94,152, 9, 63,180,182, 25, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+245,163, 31, 63,253, 29, 19, 63,180,182, 25, 63, 38, 48, 21, 63,223,148, 28, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,223,148, 28, 63, 94,152, 9, 63, 43,183, 22, 63,149,111, 11, 63,155,153, 25, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,182, 25, 63, 38, 48, 21, 63,
+245,163, 31, 63,253, 29, 19, 63,191,246, 28, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,191,246, 28, 63,109, 60, 31, 63,132,168, 22, 63,180, 23, 33, 63,180,182, 25, 63, 38, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,184, 19, 63,232,209, 22, 63,180,182, 25, 63, 38, 48, 21, 63,
+132,168, 22, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132,168, 22, 63,
+180, 23, 33, 63,191,246, 28, 63,109, 60, 31, 63,169,238, 25, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,138,107, 19, 63,211,160, 44, 63,220,204, 12, 63, 35, 28, 45, 63,225,119, 16, 63,225, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,225,119, 16, 63,225, 17, 34, 63,132,168, 22, 63,
+180, 23, 33, 63,138,107, 19, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,238, 25, 63,229, 52, 43, 63,138,107, 19, 63,211,160, 44, 63,132,168, 22, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132,168, 22, 63,180, 23, 33, 63,225,119, 16, 63,225, 17, 34, 63,140,184, 19, 63,
+232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 73, 32, 63,221,228, 40, 63,
+169,238, 25, 63,229, 52, 43, 63,191,246, 28, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,191,246, 28, 63,109, 60, 31, 63,192,225, 34, 63,142,140, 28, 63, 51, 73, 32, 63,221,228, 40, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 45,200, 37, 63, 51, 73, 32, 63,221,228, 40, 63,
+192,225, 34, 63,142,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,225, 34, 63,
+142,140, 28, 63,191,246, 28, 63,109, 60, 31, 63,245,163, 31, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,212,204, 12, 63,188, 32, 23, 63,140,184, 19, 63,232,209, 22, 63,225,119, 16, 63,225, 17, 34, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,225,119, 16, 63,225, 17, 34, 63,207, 33, 9, 63,
+226, 17, 34, 63,212,204, 12, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 29,225, 5, 63,233,209, 22, 63,212,204, 12, 63,188, 32, 23, 63,207, 33, 9, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,207, 33, 9, 63,226, 17, 34, 63,225,119, 16, 63,225, 17, 34, 63,220,204, 12, 63,
+ 35, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,204, 12, 63,188, 32, 23, 63,
+ 29,225, 5, 63,233,209, 22, 63,118,105, 9, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,118,105, 9, 63,101,116, 11, 63, 43, 48, 16, 63,100,116, 11, 63,212,204, 12, 63,188, 32, 23, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,184, 19, 63,232,209, 22, 63,212,204, 12, 63,188, 32, 23, 63,
+ 43, 48, 16, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43, 48, 16, 63,
+100,116, 11, 63,118,105, 9, 63,101,116, 11, 63,205,204, 12, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 51, 51, 19, 63,244, 1, 0, 63,155,153, 25, 63, 0, 0, 0, 63, 43,183, 22, 63,149,111, 11, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43,183, 22, 63,149,111, 11, 63, 43, 48, 16, 63,
+100,116, 11, 63, 51, 51, 19, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+205,204, 12, 63, 0, 0, 0, 63, 51, 51, 19, 63,244, 1, 0, 63, 43, 48, 16, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43, 48, 16, 63,100,116, 11, 63, 43,183, 22, 63,149,111, 11, 63,140,184, 19, 63,
+232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102,102, 6, 63,244, 1, 0, 63,
+205,204, 12, 63, 0, 0, 0, 63,118,105, 9, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,118,105, 9, 63,101,116, 11, 63,118,226, 2, 63,149,111, 11, 63,102,102, 6, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,102,102, 6, 63,244, 1, 0, 63,
+118,226, 2, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,226, 2, 63,
+149,111, 11, 63,118,105, 9, 63,101,116, 11, 63, 29,225, 5, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,198,204, 12, 63, 72, 58,217, 62, 77, 10, 6, 63, 6,196,217, 62, 17, 72, 9, 63,227,230,198, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 17, 72, 9, 63,227,230,198, 62,117, 81, 16, 63,
+223,230,198, 62,198,204, 12, 63, 72, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 64,143, 19, 63, 4,196,217, 62,198,204, 12, 63, 72, 58,217, 62,117, 81, 16, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117, 81, 16, 63,223,230,198, 62, 17, 72, 9, 63,227,230,198, 62,191,204, 12, 63,
+160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,204, 12, 63, 72, 58,217, 62,
+ 64,143, 19, 63, 4,196,217, 62, 76, 33, 16, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 76, 33, 16, 63, 30,211,236, 62, 71,120, 9, 63, 30,211,236, 62,198,204, 12, 63, 72, 58,217, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77, 10, 6, 63, 6,196,217, 62,198,204, 12, 63, 72, 58,217, 62,
+ 71,120, 9, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 71,120, 9, 63,
+ 30,211,236, 62, 76, 33, 16, 63, 30,211,236, 62,205,204, 12, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,102,102, 6, 63,244, 1, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 62,251, 2, 63, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 62,251, 2, 63, 67,207,236, 62, 71,120, 9, 63,
+ 30,211,236, 62,102,102, 6, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+205,204, 12, 63, 0, 0, 0, 63,102,102, 6, 63,244, 1, 0, 63, 71,120, 9, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 71,120, 9, 63, 30,211,236, 62, 62,251, 2, 63, 67,207,236, 62, 77, 10, 6, 63,
+ 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 51, 19, 63,244, 1, 0, 63,
+205,204, 12, 63, 0, 0, 0, 63, 76, 33, 16, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 76, 33, 16, 63, 30,211,236, 62, 86,158, 22, 63, 65,207,236, 62, 51, 51, 19, 63,244, 1, 0, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155,153, 25, 63, 0, 0, 0, 63, 51, 51, 19, 63,244, 1, 0, 63,
+ 86,158, 22, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 86,158, 22, 63,
+ 65,207,236, 62, 76, 33, 16, 63, 30,211,236, 62, 64,143, 19, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,233,197,255, 62, 39, 48, 21, 63,101,235,243, 62,252, 29, 19, 63,132, 9,250, 62, 94,152, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132, 9,250, 62, 94,152, 9, 63,118,226, 2, 63,
+149,111, 11, 63,233,197,255, 62, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 29,225, 5, 63,233,209, 22, 63,233,197,255, 62, 39, 48, 21, 63,118,226, 2, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,226, 2, 63,149,111, 11, 63,132, 9,250, 62, 94,152, 9, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233,197,255, 62, 39, 48, 21, 63,
+ 29,225, 5, 63,233,209, 22, 63, 43,241, 2, 63,181, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 43,241, 2, 63,181, 23, 33, 63,225, 69,249, 62,110, 60, 31, 63,233,197,255, 62, 39, 48, 21, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,235,243, 62,252, 29, 19, 63,233,197,255, 62, 39, 48, 21, 63,
+225, 69,249, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,225, 69,249, 62,
+110, 60, 31, 63, 43,241, 2, 63,181, 23, 33, 63, 30, 86,255, 62,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 9,161,242, 62,223,228, 40, 63,129,102,230, 62, 48,200, 37, 63,222,111,237, 62,143,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,111,237, 62,143,140, 28, 63,225, 69,249, 62,
+110, 60, 31, 63, 9,161,242, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30, 86,255, 62,230, 52, 43, 63, 9,161,242, 62,223,228, 40, 63,225, 69,249, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,225, 69,249, 62,110, 60, 31, 63,222,111,237, 62,143,140, 28, 63,101,235,243, 62,
+252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 46, 46, 6, 63,211,160, 44, 63,
+ 30, 86,255, 62,230, 52, 43, 63, 43,241, 2, 63,181, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 43,241, 2, 63,181, 23, 33, 63,207, 33, 9, 63,226, 17, 34, 63, 46, 46, 6, 63,211,160, 44, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 35, 28, 45, 63, 46, 46, 6, 63,211,160, 44, 63,
+207, 33, 9, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,207, 33, 9, 63,
+226, 17, 34, 63, 43,241, 2, 63,181, 23, 33, 63, 29,225, 5, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,138,238, 85, 63, 72,220,187, 62,218,173, 82, 63, 55, 92,210, 62,229,189, 79, 63,173,208,189, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,229,189, 79, 63,173,208,189, 62,230,250, 82, 63,
+117,190,166, 62,138,238, 85, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+149,153, 89, 63,201,199,165, 62,138,238, 85, 63, 72,220,187, 62,230,250, 82, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230,250, 82, 63,117,190,166, 62,229,189, 79, 63,173,208,189, 62,198,119, 76, 63,
+ 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,111, 73, 63, 68,135,193, 62,
+198,119, 76, 63, 90,150,169, 62,229,189, 79, 63,173,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,229,189, 79, 63,173,208,189, 62,176,175, 76, 63,192,159,213, 62,170,111, 73, 63, 68,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,112,194, 70, 63, 19,196,217, 62,170,111, 73, 63, 68,135,193, 62,
+176,175, 76, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,175, 76, 63,
+192,159,213, 62,229,189, 79, 63,173,208,189, 62,218,173, 82, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 52,175, 79, 63,218, 32,233, 62,193,204, 76, 63, 0, 0, 0, 63,128,209, 73, 63, 75,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,209, 73, 63, 75,207,236, 62,176,175, 76, 63,
+192,159,213, 62, 52,175, 79, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218,173, 82, 63, 55, 92,210, 62, 52,175, 79, 63,218, 32,233, 62,176,175, 76, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,175, 76, 63,192,159,213, 62,128,209, 73, 63, 75,207,236, 62,112,194, 70, 63,
+ 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,111, 73, 63, 68,135,193, 62,
+112,194, 70, 63, 19,196,217, 62,171,132, 67, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,171,132, 67, 63,253,230,198, 62, 61, 29, 70, 63,114, 54,174, 62,170,111, 73, 63, 68,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,119, 76, 63, 90,150,169, 62,170,111, 73, 63, 68,135,193, 62,
+ 61, 29, 70, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61, 29, 70, 63,
+114, 54,174, 62,171,132, 67, 63,253,230,198, 62, 0, 0, 64, 63,211,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 52,175, 79, 63,218, 32,233, 62,218,173, 82, 63, 55, 92,210, 62, 56, 54, 86, 63, 58, 23,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56, 54, 86, 63, 58, 23,233, 62, 41, 51, 83, 63,
+ 24,252,255, 62, 52,175, 79, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+193,204, 76, 63, 0, 0, 0, 63, 52,175, 79, 63,218, 32,233, 62, 41, 51, 83, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 41, 51, 83, 63, 24,252,255, 62, 56, 54, 86, 63, 58, 23,233, 62,147,153, 89, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,252, 92, 63, 58, 23,233, 62,
+147,153, 89, 63, 0, 0, 0, 63, 56, 54, 86, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 56, 54, 86, 63, 58, 23,233, 62,147,153, 89, 63,143,190,209, 62,239,252, 92, 63, 58, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 78,133, 96, 63, 55, 92,210, 62,239,252, 92, 63, 58, 23,233, 62,
+147,153, 89, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63,
+143,190,209, 62, 56, 54, 86, 63, 58, 23,233, 62,218,173, 82, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,138,238, 85, 63, 72,220,187, 62,149,153, 89, 63,201,199,165, 62,159, 68, 93, 63, 72,220,187, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,159, 68, 93, 63, 72,220,187, 62,147,153, 89, 63,
+143,190,209, 62,138,238, 85, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218,173, 82, 63, 55, 92,210, 62,138,238, 85, 63, 72,220,187, 62,147,153, 89, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63,143,190,209, 62,159, 68, 93, 63, 72,220,187, 62, 78,133, 96, 63,
+ 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,252, 92, 63, 58, 23,233, 62,
+ 78,133, 96, 63, 55, 92,210, 62,242,131, 99, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,242,131, 99, 63,218, 32,233, 62,254,255, 95, 63, 24,252,255, 62,239,252, 92, 63, 58, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63, 0, 0, 0, 63,239,252, 92, 63, 58, 23,233, 62,
+254,255, 95, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,254,255, 95, 63,
+ 24,252,255, 62,242,131, 99, 63,218, 32,233, 62,101,102,102, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,139,174,111, 63,223,230,198, 62,192,112,108, 63, 4,196,217, 62,133,195,105, 63, 37,135,193, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133,195,105, 63, 37,135,193, 62,249, 21,109, 63,
+ 65, 54,174, 62,139,174,111, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63,160,111,180, 62,139,174,111, 63,223,230,198, 62,249, 21,109, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,249, 21,109, 63, 65, 54,174, 62,133,195,105, 63, 37,135,193, 62,106,187,102, 63,
+ 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117, 99, 63,155,208,189, 62,
+106,187,102, 63, 54,150,169, 62,133,195,105, 63, 37,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,133,195,105, 63, 37,135,193, 62,123,131,102, 63,181,159,213, 62, 70,117, 99, 63,155,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 78,133, 96, 63, 55, 92,210, 62, 70,117, 99, 63,155,208,189, 62,
+123,131,102, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123,131,102, 63,
+181,159,213, 62,133,195,105, 63, 37,135,193, 62,192,112,108, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,170, 97,105, 63, 65,207,236, 62,101,102,102, 63, 0, 0, 0, 63,242,131, 99, 63,218, 32,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,242,131, 99, 63,218, 32,233, 62,123,131,102, 63,
+181,159,213, 62,170, 97,105, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+192,112,108, 63, 4,196,217, 62,170, 97,105, 63, 65,207,236, 62,123,131,102, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123,131,102, 63,181,159,213, 62,242,131, 99, 63,218, 32,233, 62, 78,133, 96, 63,
+ 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117, 99, 63,155,208,189, 62,
+ 78,133, 96, 63, 55, 92,210, 62,159, 68, 93, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,159, 68, 93, 63, 72,220,187, 62, 71, 56, 96, 63, 99,190,166, 62, 70,117, 99, 63,155,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,106,187,102, 63, 54,150,169, 62, 70,117, 99, 63,155,208,189, 62,
+ 71, 56, 96, 63, 99,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 71, 56, 96, 63,
+ 99,190,166, 62,159, 68, 93, 63, 72,220,187, 62,149,153, 89, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 33,107, 99, 63, 94,152, 9, 63, 11, 92, 96, 63,253, 29, 19, 63, 21,238, 92, 63,112,150, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,238, 92, 63,112,150, 9, 63,254,255, 95, 63,
+ 24,252,255, 62, 33,107, 99, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+101,102,102, 63, 0, 0, 0, 63, 33,107, 99, 63, 94,152, 9, 63,254,255, 95, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,254,255, 95, 63, 24,252,255, 62, 21,238, 92, 63,112,150, 9, 63,147,153, 89, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14, 69, 86, 63,112,150, 9, 63,
+147,153, 89, 63, 0, 0, 0, 63, 21,238, 92, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 21,238, 92, 63,112,150, 9, 63,143,153, 89, 63,219, 98, 19, 63, 14, 69, 86, 63,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,215, 82, 63,252, 29, 19, 63, 14, 69, 86, 63,112,150, 9, 63,
+143,153, 89, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,143,153, 89, 63,
+219, 98, 19, 63, 21,238, 92, 63,112,150, 9, 63, 11, 92, 96, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 63, 30, 93, 63,143,140, 28, 63,139,153, 89, 63, 45,200, 37, 63,218, 20, 86, 63,143,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218, 20, 86, 63,143,140, 28, 63,143,153, 89, 63,
+219, 98, 19, 63, 63, 30, 93, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 11, 92, 96, 63,253, 29, 19, 63, 63, 30, 93, 63,143,140, 28, 63,143,153, 89, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,143,153, 89, 63,219, 98, 19, 63,218, 20, 86, 63,143,140, 28, 63, 19,215, 82, 63,
+252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14, 69, 86, 63,112,150, 9, 63,
+ 19,215, 82, 63,252, 29, 19, 63, 1,200, 79, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 1,200, 79, 63, 94,152, 9, 63, 41, 51, 83, 63, 24,252,255, 62, 14, 69, 86, 63,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63, 0, 0, 0, 63, 14, 69, 86, 63,112,150, 9, 63,
+ 41, 51, 83, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 41, 51, 83, 63,
+ 24,252,255, 62, 1,200, 79, 63, 94,152, 9, 63,193,204, 76, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,237, 28, 18, 61, 60,220,187, 62,151, 35,188, 60, 46, 92,210, 62,218, 74, 60, 60,150,208,189, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218, 74, 60, 60,150,208,189, 62,195,197,197, 60,
+ 89,190,166, 62,237, 28, 18, 61, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194,205, 76, 61,186,199,165, 62,237, 28, 18, 61, 60,220,187, 62,195,197,197, 60, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 23,131, 63, 89,190,166, 62,150,120,129, 63,150,208,189, 62, 15,171,127, 63,
+ 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,162,124, 63, 36,135,193, 62,
+ 15,171,127, 63, 52,150,169, 62,150,120,129, 63,150,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,150,120,129, 63,150,208,189, 62,244,226,127, 63,179,159,213, 62,241,162,124, 63, 36,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,245,121, 63, 6,196,217, 62,241,162,124, 63, 36,135,193, 62,
+244,226,127, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,244,226,127, 63,
+179,159,213, 62,150,120,129, 63,150,208,189, 62,142,240,130, 63, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 59,113,129, 63,214, 32,233, 62, 0, 0,128, 63, 0, 0, 0, 63,194, 4,125, 63, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194, 4,125, 63, 67,207,236, 62,244,226,127, 63,
+179,159,213, 62, 59,113,129, 63,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+142,240,130, 63, 46, 92,210, 62, 59,113,129, 63,214, 32,233, 62,244,226,127, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,244,226,127, 63,179,159,213, 62,194, 4,125, 63, 67,207,236, 62,179,245,121, 63,
+ 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,162,124, 63, 36,135,193, 62,
+179,245,121, 63, 6,196,217, 62,239,183,118, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,239,183,118, 63,227,230,198, 62,133, 80,121, 63, 65, 54,174, 62,241,162,124, 63, 36,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15,171,127, 63, 52,150,169, 62,241,162,124, 63, 36,135,193, 62,
+133, 80,121, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133, 80,121, 63,
+ 65, 54,174, 62,239,183,118, 63,227,230,198, 62, 65, 51,115, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,110,157, 56, 60,214, 32,233, 62,151, 35,188, 60, 46, 92,210, 62, 95,151, 22, 61, 55, 23,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95,151, 22, 61, 55, 23,233, 62,176,204,204, 60,
+ 24,252,255, 62,110,157, 56, 60,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+167, 79, 11, 38, 0, 0, 0, 63,110,157, 56, 60,214, 32,233, 62,176,204,204, 60, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,204,204, 60, 24,252,255, 62, 95,151, 22, 61, 55, 23,233, 62,215,204, 76, 61,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87,129,129, 61, 57, 23,233, 62,
+215,204, 76, 61, 0, 0, 0, 63, 95,151, 22, 61, 55, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 95,151, 22, 61, 55, 23,233, 62, 68,205, 76, 61,135,190,209, 62, 87,129,129, 61, 57, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92,196,157, 61, 49, 92,210, 62, 87,129,129, 61, 57, 23,233, 62,
+ 68,205, 76, 61,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,205, 76, 61,
+135,190,209, 62, 95,151, 22, 61, 55, 23,233, 62,151, 35,188, 60, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,237, 28, 18, 61, 60,220,187, 62,194,205, 76, 61,186,199,165, 62, 7,191,131, 61, 62,220,187, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 7,191,131, 61, 62,220,187, 62, 68,205, 76, 61,
+135,190,209, 62,237, 28, 18, 61, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+151, 35,188, 60, 46, 92,210, 62,237, 28, 18, 61, 60,220,187, 62, 68,205, 76, 61,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,205, 76, 61,135,190,209, 62, 7,191,131, 61, 62,220,187, 62, 92,196,157, 61,
+ 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87,129,129, 61, 57, 23,233, 62,
+ 92,196,157, 61, 49, 92,210, 62, 89,185,181, 61,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 89,185,181, 61,214, 32,233, 62,154,153,153, 61, 25,252,255, 62, 87,129,129, 61, 57, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 76, 61, 0, 0, 0, 63, 87,129,129, 61, 57, 23,233, 62,
+154,153,153, 61, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,153, 61,
+ 25,252,255, 62, 89,185,181, 61,214, 32,233, 62,215,204,204, 61, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 1,135, 11, 62,228,230,198, 62,171, 31,253, 61, 6,196,217, 62,251,181,231, 61, 38,135,193, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,181,231, 61, 38,135,193, 62,204, 36, 1, 62,
+ 70, 54,174, 62, 1,135, 11, 62,228,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+214,153, 25, 62,165,111,180, 62, 1,135, 11, 62,228,230,198, 62,204, 36, 1, 62, 70, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 36, 1, 62, 70, 54,174, 62,251,181,231, 61, 38,135,193, 62, 70,117,207, 61,
+ 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 35, 68,181, 61,153,208,189, 62,
+ 70,117,207, 61, 54,150,169, 62,251,181,231, 61, 38,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,251,181,231, 61, 38,135,193, 62,164,181,205, 61,180,159,213, 62, 35, 68,181, 61,153,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92,196,157, 61, 49, 92,210, 62, 35, 68,181, 61,153,208,189, 62,
+164,181,205, 61,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,181,205, 61,
+180,159,213, 62,251,181,231, 61, 38,135,193, 62,171, 31,253, 61, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,251,166,228, 61, 67,207,236, 62,215,204,204, 61, 0, 0, 0, 63, 89,185,181, 61,214, 32,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 89,185,181, 61,214, 32,233, 62,164,181,205, 61,
+180,159,213, 62,251,166,228, 61, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171, 31,253, 61, 6,196,217, 62,251,166,228, 61, 67,207,236, 62,164,181,205, 61,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,181,205, 61,180,159,213, 62, 89,185,181, 61,214, 32,233, 62, 92,196,157, 61,
+ 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 35, 68,181, 61,153,208,189, 62,
+ 92,196,157, 61, 49, 92,210, 62, 7,191,131, 61, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 7,191,131, 61, 62,220,187, 62, 79, 92,155, 61, 91,190,166, 62, 35, 68,181, 61,153,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117,207, 61, 54,150,169, 62, 35, 68,181, 61,153,208,189, 62,
+ 79, 92,155, 61, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 79, 92,155, 61,
+ 91,190,166, 62, 7,191,131, 61, 62,220,187, 62,194,205, 76, 61,186,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,172,242,180, 61, 96,152, 9, 63, 1,122,156, 61,254, 29, 19, 63,100, 10,129, 61,113,150, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,100, 10,129, 61,113,150, 9, 63,154,153,153, 61,
+ 25,252,255, 62,172,242,180, 61, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+215,204,204, 61, 0, 0, 0, 63,172,242,180, 61, 96,152, 9, 63,154,153,153, 61, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,153, 61, 25,252,255, 62,100, 10,129, 61,113,150, 9, 63,215,204, 76, 61,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,132, 23, 61,113,150, 9, 63,
+215,204, 76, 61, 0, 0, 0, 63,100, 10,129, 61,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,100, 10,129, 61,113,150, 9, 63, 91,204, 76, 61,220, 98, 19, 63,109,132, 23, 61,113,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174, 73,193, 60,253, 29, 19, 63,109,132, 23, 61,113,150, 9, 63,
+ 91,204, 76, 61,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91,204, 76, 61,
+220, 98, 19, 63,100, 10,129, 61,113,150, 9, 63, 1,122,156, 61,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,166,139,130, 61,145,140, 28, 63,246,203, 76, 61, 48,200, 37, 63, 13,129, 20, 61,143,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 13,129, 20, 61,143,140, 28, 63, 91,204, 76, 61,
+220, 98, 19, 63,166,139,130, 61,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 1,122,156, 61,254, 29, 19, 63,166,139,130, 61,145,140, 28, 63, 91,204, 76, 61,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91,204, 76, 61,220, 98, 19, 63, 13,129, 20, 61,143,140, 28, 63,174, 73,193, 60,
+253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,132, 23, 61,113,150, 9, 63,
+174, 73,193, 60,253, 29, 19, 63,114,207, 62, 60, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,114,207, 62, 60, 94,152, 9, 63,176,204,204, 60, 24,252,255, 62,109,132, 23, 61,113,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 76, 61, 0, 0, 0, 63,109,132, 23, 61,113,150, 9, 63,
+176,204,204, 60, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,204,204, 60,
+ 24,252,255, 62,114,207, 62, 60, 94,152, 9, 63,167, 79, 11, 38, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,237, 83,113, 62, 79,220,187, 62, 63, 81,100, 62, 60, 92,210, 62,110,145, 88, 62,167,208,189, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,110,145, 88, 62,167,208,189, 62, 91,133,101, 62,
+112,190,166, 62,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,206,199,165, 62,237, 83,113, 62, 79,220,187, 62, 91,133,101, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91,133,101, 62,112,190,166, 62,110,145, 88, 62,167,208,189, 62,239,120, 75, 62,
+ 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 88, 63, 62, 46,135,193, 62,
+239,120, 75, 62, 70,150,169, 62,110,145, 88, 62,167,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,110,145, 88, 62,167,208,189, 62,170, 88, 76, 62,187,159,213, 62,144, 88, 63, 62, 46,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,163, 52, 62, 7,196,217, 62,144, 88, 63, 62, 46,135,193, 62,
+170, 88, 76, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170, 88, 76, 62,
+187,159,213, 62,110,145, 88, 62,167,208,189, 62, 63, 81,100, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,190, 86, 88, 62,221, 32,233, 62,254,204, 76, 62, 0, 0, 0, 63,251,223, 64, 62, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,223, 64, 62, 67,207,236, 62,170, 88, 76, 62,
+187,159,213, 62,190, 86, 88, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 63, 81,100, 62, 60, 92,210, 62,190, 86, 88, 62,221, 32,233, 62,170, 88, 76, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170, 88, 76, 62,187,159,213, 62,251,223, 64, 62, 67,207,236, 62,179,163, 52, 62,
+ 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 88, 63, 62, 46,135,193, 62,
+179,163, 52, 62, 7,196,217, 62,153,172, 39, 62,230,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,153,172, 39, 62,230,230,198, 62,213, 14, 50, 62, 78, 54,174, 62,144, 88, 63, 62, 46,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,120, 75, 62, 70,150,169, 62,144, 88, 63, 62, 46,135,193, 62,
+213, 14, 50, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 14, 50, 62,
+ 78, 54,174, 62,153,172, 39, 62,230,230,198, 62,214,153, 25, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,190, 86, 88, 62,221, 32,233, 62, 63, 81,100, 62, 60, 92,210, 62,166,114,114, 62, 63, 23,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,166,114,114, 62, 63, 23,233, 62,126,102,102, 62,
+ 25,252,255, 62,190, 86, 88, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+254,204, 76, 62, 0, 0, 0, 63,190, 86, 88, 62,221, 32,233, 62,126,102,102, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,126,102,102, 62, 25,252,255, 62,166,114,114, 62, 63, 23,233, 62, 0, 0,128, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,198,134, 62, 63, 23,233, 62,
+ 0, 0,128, 62, 0, 0, 0, 63,166,114,114, 62, 63, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,166,114,114, 62, 63, 23,233, 62, 0, 0,128, 62,149,190,209, 62,173,198,134, 62, 63, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,215,141, 62, 60, 92,210, 62,173,198,134, 62, 63, 23,233, 62,
+ 0, 0,128, 62,149,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,
+149,190,209, 62,166,114,114, 62, 63, 23,233, 62, 63, 81,100, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 62,206,199,165, 62, 9, 86,135, 62, 79,220,187, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 62,
+149,190,209, 62,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 63, 81,100, 62, 60, 92,210, 62,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 62,149,190,209, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,149,190,209, 62, 9, 86,135, 62, 79,220,187, 62, 97,215,141, 62,
+ 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,198,134, 62, 63, 23,233, 62,
+ 97,215,141, 62, 60, 92,210, 62,161,212,147, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,161,212,147, 62,221, 32,233, 62,193,204,140, 62, 25,252,255, 62,173,198,134, 62, 63, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63,173,198,134, 62, 63, 23,233, 62,
+193,204,140, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,204,140, 62,
+ 25,252,255, 62,161,212,147, 62,221, 32,233, 62,129,153,153, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,180, 41,172, 62,227,230,198, 62, 39,174,165, 62, 7,196,217, 62,184, 83,160, 62, 46,135,193, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,184, 83,160, 62, 46,135,193, 62,150,248,166, 62,
+ 78, 54,174, 62,180, 41,172, 62,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 51,179, 62,165,111,180, 62,180, 41,172, 62,227,230,198, 62,150,248,166, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150,248,166, 62, 78, 54,174, 62,184, 83,160, 62, 46,135,193, 62,137, 67,154, 62,
+ 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 73,183,147, 62,167,208,189, 62,
+137, 67,154, 62, 70,150,169, 62,184, 83,160, 62, 46,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,184, 83,160, 62, 46,135,193, 62,171,211,153, 62,187,159,213, 62, 73,183,147, 62,167,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,215,141, 62, 60, 92,210, 62, 73,183,147, 62,167,208,189, 62,
+171,211,153, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171,211,153, 62,
+187,159,213, 62,184, 83,160, 62, 46,135,193, 62, 39,174,165, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 3,144,159, 62, 67,207,236, 62,129,153,153, 62, 0, 0, 0, 63,161,212,147, 62,221, 32,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,161,212,147, 62,221, 32,233, 62,171,211,153, 62,
+187,159,213, 62, 3,144,159, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 39,174,165, 62, 7,196,217, 62, 3,144,159, 62, 67,207,236, 62,171,211,153, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171,211,153, 62,187,159,213, 62,161,212,147, 62,221, 32,233, 62, 97,215,141, 62,
+ 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 73,183,147, 62,167,208,189, 62,
+ 97,215,141, 62, 60, 92,210, 62, 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 9, 86,135, 62, 79,220,187, 62, 82, 61,141, 62,112,190,166, 62, 73,183,147, 62,167,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,137, 67,154, 62, 70,150,169, 62, 73,183,147, 62,167,208,189, 62,
+ 82, 61,141, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82, 61,141, 62,
+112,190,166, 62, 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 62,206,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 1,163,147, 62, 91,152, 9, 63,224,132,141, 62,246, 29, 19, 63,251,168,134, 62,107,150, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,168,134, 62,107,150, 9, 63,193,204,140, 62,
+ 25,252,255, 62, 1,163,147, 62, 91,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+129,153,153, 62, 0, 0, 0, 63, 1,163,147, 62, 91,152, 9, 63,193,204,140, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,204,140, 62, 25,252,255, 62,251,168,134, 62,107,150, 9, 63, 0, 0,128, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11,174,114, 62,107,150, 9, 63,
+ 0, 0,128, 62, 0, 0, 0, 63,251,168,134, 62,107,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,251,168,134, 62,107,150, 9, 63, 0, 0,128, 62,209, 98, 19, 63, 11,174,114, 62,107,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,246,100, 62,246, 29, 19, 63, 11,174,114, 62,107,150, 9, 63,
+ 0, 0,128, 62,209, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,
+209, 98, 19, 63,251,168,134, 62,107,150, 9, 63,224,132,141, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 62, 23,200, 37, 63, 83,237,113, 62,130,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 83,237,113, 62,130,140, 28, 63, 0, 0,128, 62,
+209, 98, 19, 63, 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+224,132,141, 62,246, 29, 19, 63, 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 62,209, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,209, 98, 19, 63, 83,237,113, 62,130,140, 28, 63, 64,246,100, 62,
+246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11,174,114, 62,107,150, 9, 63,
+ 64,246,100, 62,246, 29, 19, 63,255,185, 88, 62, 90,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,255,185, 88, 62, 90,152, 9, 63,126,102,102, 62, 25,252,255, 62, 11,174,114, 62,107,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63, 11,174,114, 62,107,150, 9, 63,
+126,102,102, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,126,102,102, 62,
+ 25,252,255, 62,255,185, 88, 62, 90,152, 9, 63,254,204, 76, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 63, 16,223, 62, 62,220,187, 62,233,142,216, 62, 49, 92,210, 62,248,174,210, 62,153,208,189, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,248,174,210, 62,153,208,189, 62,237, 40,217, 62,
+ 91,190,166, 62, 63, 16,223, 62, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 72,102,230, 62,183,199,165, 62, 63, 16,223, 62, 62,220,187, 62,237, 40,217, 62, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40,217, 62, 91,190,166, 62,248,174,210, 62,153,208,189, 62,175, 34,204, 62,
+ 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129, 18,198, 62, 37,135,193, 62,
+175, 34,204, 62, 54,150,169, 62,248,174,210, 62,153,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,248,174,210, 62,153,208,189, 62,151,146,204, 62,180,159,213, 62,129, 18,198, 62, 37,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,184,192, 62, 6,196,217, 62,129, 18,198, 62, 37,135,193, 62,
+151,146,204, 62,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,151,146,204, 62,
+180,159,213, 62,248,174,210, 62,153,208,189, 62,233,142,216, 62, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,170,145,210, 62,214, 32,233, 62,202,204,204, 62, 0, 0, 0, 63, 65,214,198, 62, 67,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65,214,198, 62, 67,207,236, 62,151,146,204, 62,
+180,159,213, 62,170,145,210, 62,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+233,142,216, 62, 49, 92,210, 62,170,145,210, 62,214, 32,233, 62,151,146,204, 62,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,151,146,204, 62,180,159,213, 62, 65,214,198, 62, 67,207,236, 62, 21,184,192, 62,
+ 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129, 18,198, 62, 37,135,193, 62,
+ 21,184,192, 62, 6,196,217, 62,127, 60,186, 62,225,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,127, 60,186, 62,225,230,198, 62,154,109,191, 62, 68, 54,174, 62,129, 18,198, 62, 37,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 34,204, 62, 54,150,169, 62,129, 18,198, 62, 37,135,193, 62,
+154,109,191, 62, 68, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,109,191, 62,
+ 68, 54,174, 62,127, 60,186, 62,225,230,198, 62, 21, 51,179, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,170,145,210, 62,214, 32,233, 62,233,142,216, 62, 49, 92,210, 62,171,159,223, 62, 57, 23,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171,159,223, 62, 57, 23,233, 62,154,153,217, 62,
+ 24,252,255, 62,170,145,210, 62,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+202,204,204, 62, 0, 0, 0, 63,170,145,210, 62,214, 32,233, 62,154,153,217, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,217, 62, 24,252,255, 62,171,159,223, 62, 57, 23,233, 62,101,102,230, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 45,237, 62, 55, 23,233, 62,
+101,102,230, 62, 0, 0, 0, 63,171,159,223, 62, 57, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,171,159,223, 62, 57, 23,233, 62, 88,102,230, 62,135,190,209, 62, 20, 45,237, 62, 55, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,199, 61,244, 62, 46, 92,210, 62, 20, 45,237, 62, 55, 23,233, 62,
+ 88,102,230, 62,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,102,230, 62,
+135,190,209, 62,171,159,223, 62, 57, 23,233, 62,233,142,216, 62, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 63, 16,223, 62, 62,220,187, 62, 72,102,230, 62,183,199,165, 62, 99,188,237, 62, 60,220,187, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 99,188,237, 62, 60,220,187, 62, 88,102,230, 62,
+135,190,209, 62, 63, 16,223, 62, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+233,142,216, 62, 49, 92,210, 62, 63, 16,223, 62, 62,220,187, 62, 88,102,230, 62,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,102,230, 62,135,190,209, 62, 99,188,237, 62, 60,220,187, 62,199, 61,244, 62,
+ 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 45,237, 62, 55, 23,233, 62,
+199, 61,244, 62, 46, 92,210, 62, 21, 59,250, 62,213, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 21, 59,250, 62,213, 32,233, 62, 53, 51,243, 62, 24,252,255, 62, 20, 45,237, 62, 55, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,230, 62, 0, 0, 0, 63, 20, 45,237, 62, 55, 23,233, 62,
+ 53, 51,243, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 51,243, 62,
+ 24,252,255, 62, 21, 59,250, 62,213, 32,233, 62, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 17, 72, 9, 63,227,230,198, 62, 77, 10, 6, 63, 6,196,217, 62, 15, 93, 3, 63, 36,135,193, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15, 93, 3, 63, 36,135,193, 62,123,175, 6, 63,
+ 65, 54,174, 62, 17, 72, 9, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,160,111,180, 62, 17, 72, 9, 63,227,230,198, 62,123,175, 6, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123,175, 6, 63, 65, 54,174, 62, 15, 93, 3, 63, 36,135,193, 62,241, 84, 0, 63,
+ 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169, 29,250, 62,150,208,189, 62,
+241, 84, 0, 63, 52,150,169, 62, 15, 93, 3, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 15, 93, 3, 63, 36,135,193, 62, 12, 29, 0, 63,179,159,213, 62,169, 29,250, 62,150,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,199, 61,244, 62, 46, 92,210, 62,169, 29,250, 62,150,208,189, 62,
+ 12, 29, 0, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 12, 29, 0, 63,
+179,159,213, 62, 15, 93, 3, 63, 36,135,193, 62, 77, 10, 6, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 62,251, 2, 63, 67,207,236, 62, 0, 0, 0, 63, 0, 0, 0, 63, 21, 59,250, 62,213, 32,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 59,250, 62,213, 32,233, 62, 12, 29, 0, 63,
+179,159,213, 62, 62,251, 2, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 77, 10, 6, 63, 6,196,217, 62, 62,251, 2, 63, 67,207,236, 62, 12, 29, 0, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 12, 29, 0, 63,179,159,213, 62, 21, 59,250, 62,213, 32,233, 62,199, 61,244, 62,
+ 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169, 29,250, 62,150,208,189, 62,
+199, 61,244, 62, 46, 92,210, 62, 99,188,237, 62, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 99,188,237, 62, 60,220,187, 62,164,163,243, 62, 89,190,166, 62,169, 29,250, 62,150,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241, 84, 0, 63, 52,150,169, 62,169, 29,250, 62,150,208,189, 62,
+164,163,243, 62, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,163,243, 62,
+ 89,190,166, 62, 99,188,237, 62, 60,220,187, 62, 72,102,230, 62,183,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,132, 9,250, 62, 94,152, 9, 63,101,235,243, 62,252, 29, 19, 63,114, 15,237, 62,113,150, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,114, 15,237, 62,113,150, 9, 63, 53, 51,243, 62,
+ 24,252,255, 62,132, 9,250, 62, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63,132, 9,250, 62, 94,152, 9, 63, 53, 51,243, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 51,243, 62, 24,252,255, 62,114, 15,237, 62,113,150, 9, 63,101,102,230, 62,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,189,223, 62,112,150, 9, 63,
+101,102,230, 62, 0, 0, 0, 63,114, 15,237, 62,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,114, 15,237, 62,113,150, 9, 63,117,102,230, 62,220, 98, 19, 63,103,189,223, 62,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,225,216, 62,254, 29, 19, 63,103,189,223, 62,112,150, 9, 63,
+117,102,230, 62,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102,230, 62,
+220, 98, 19, 63,114, 15,237, 62,113,150, 9, 63,101,235,243, 62,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,222,111,237, 62,143,140, 28, 63,129,102,230, 62, 48,200, 37, 63, 22, 93,223, 62,145,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22, 93,223, 62,145,140, 28, 63,117,102,230, 62,
+220, 98, 19, 63,222,111,237, 62,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+101,235,243, 62,252, 29, 19, 63,222,111,237, 62,143,140, 28, 63,117,102,230, 62,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102,230, 62,220, 98, 19, 63, 22, 93,223, 62,145,140, 28, 63,128,225,216, 62,
+254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,189,223, 62,112,150, 9, 63,
+128,225,216, 62,254, 29, 19, 63, 85,195,210, 62, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 85,195,210, 62, 96,152, 9, 63,154,153,217, 62, 24,252,255, 62,103,189,223, 62,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,230, 62, 0, 0, 0, 63,103,189,223, 62,112,150, 9, 63,
+154,153,217, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,217, 62,
+ 24,252,255, 62, 85,195,210, 62, 96,152, 9, 63,202,204,204, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 97,187, 34, 63, 72,220,187, 62,178,122, 31, 63, 55, 92,210, 62,186,138, 28, 63,155,208,189, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,186,138, 28, 63,155,208,189, 62,185,199, 31, 63,
+ 96,190,166, 62, 97,187, 34, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+107,102, 38, 63,201,199,165, 62, 97,187, 34, 63, 72,220,187, 62,185,199, 31, 63, 96,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,185,199, 31, 63, 96,190,166, 62,186,138, 28, 63,155,208,189, 62,150, 68, 25, 63,
+ 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123, 60, 22, 63, 36,135,193, 62,
+150, 68, 25, 63, 54,150,169, 62,186,138, 28, 63,155,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,186,138, 28, 63,155,208,189, 62,133,124, 25, 63,181,159,213, 62,123, 60, 22, 63, 36,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,143, 19, 63, 4,196,217, 62,123, 60, 22, 63, 36,135,193, 62,
+133,124, 25, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133,124, 25, 63,
+181,159,213, 62,186,138, 28, 63,155,208,189, 62,178,122, 31, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 14,124, 28, 63,218, 32,233, 62,155,153, 25, 63, 0, 0, 0, 63, 86,158, 22, 63, 65,207,236, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 86,158, 22, 63, 65,207,236, 62,133,124, 25, 63,
+181,159,213, 62, 14,124, 28, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+178,122, 31, 63, 55, 92,210, 62, 14,124, 28, 63,218, 32,233, 62,133,124, 25, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133,124, 25, 63,181,159,213, 62, 86,158, 22, 63, 65,207,236, 62, 64,143, 19, 63,
+ 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123, 60, 22, 63, 36,135,193, 62,
+ 64,143, 19, 63, 4,196,217, 62,117, 81, 16, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,117, 81, 16, 63,223,230,198, 62, 7,234, 18, 63, 65, 54,174, 62,123, 60, 22, 63, 36,135,193, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150, 68, 25, 63, 54,150,169, 62,123, 60, 22, 63, 36,135,193, 62,
+ 7,234, 18, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 7,234, 18, 63,
+ 65, 54,174, 62,117, 81, 16, 63,223,230,198, 62,191,204, 12, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 14,124, 28, 63,218, 32,233, 62,178,122, 31, 63, 55, 92,210, 62, 17, 3, 35, 63, 58, 23,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 17, 3, 35, 63, 58, 23,233, 62, 2, 0, 32, 63,
+ 24,252,255, 62, 14,124, 28, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+155,153, 25, 63, 0, 0, 0, 63, 14,124, 28, 63,218, 32,233, 62, 2, 0, 32, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 32, 63, 24,252,255, 62, 17, 3, 35, 63, 58, 23,233, 62,109,102, 38, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,200,201, 41, 63, 58, 23,233, 62,
+109,102, 38, 63, 0, 0, 0, 63, 17, 3, 35, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 17, 3, 35, 63, 58, 23,233, 62,109,102, 38, 63,143,190,209, 62,200,201, 41, 63, 58, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 82, 45, 63, 55, 92,210, 62,200,201, 41, 63, 58, 23,233, 62,
+109,102, 38, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63,
+143,190,209, 62, 17, 3, 35, 63, 58, 23,233, 62,178,122, 31, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 97,187, 34, 63, 72,220,187, 62,107,102, 38, 63,201,199,165, 62,118, 17, 42, 63, 72,220,187, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118, 17, 42, 63, 72,220,187, 62,109,102, 38, 63,
+143,190,209, 62, 97,187, 34, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+178,122, 31, 63, 55, 92,210, 62, 97,187, 34, 63, 72,220,187, 62,109,102, 38, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63,143,190,209, 62,118, 17, 42, 63, 72,220,187, 62, 38, 82, 45, 63,
+ 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,200,201, 41, 63, 58, 23,233, 62,
+ 38, 82, 45, 63, 55, 92,210, 62,204, 80, 48, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,204, 80, 48, 63,218, 32,233, 62,215,204, 44, 63, 23,252,255, 62,200,201, 41, 63, 58, 23,233, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63, 0, 0, 0, 63,200,201, 41, 63, 58, 23,233, 62,
+215,204, 44, 63, 23,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 44, 63,
+ 23,252,255, 62,204, 80, 48, 63,218, 32,233, 62, 63, 51, 51, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 85,123, 60, 63,253,230,198, 62,144, 61, 57, 63, 19,196,217, 62, 86,144, 54, 63, 68,135,193, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 86,144, 54, 63, 68,135,193, 62,196,226, 57, 63,
+114, 54,174, 62, 85,123, 60, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,211,111,180, 62, 85,123, 60, 63,253,230,198, 62,196,226, 57, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,226, 57, 63,114, 54,174, 62, 86,144, 54, 63, 68,135,193, 62, 58,136, 51, 63,
+ 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27, 66, 48, 63,173,208,189, 62,
+ 58,136, 51, 63, 90,150,169, 62, 86,144, 54, 63, 68,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 86,144, 54, 63, 68,135,193, 62, 80, 80, 51, 63,192,159,213, 62, 27, 66, 48, 63,173,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 82, 45, 63, 55, 92,210, 62, 27, 66, 48, 63,173,208,189, 62,
+ 80, 80, 51, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80, 80, 51, 63,
+192,159,213, 62, 86,144, 54, 63, 68,135,193, 62,144, 61, 57, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,128, 46, 54, 63, 75,207,236, 62, 63, 51, 51, 63, 0, 0, 0, 63,204, 80, 48, 63,218, 32,233, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 80, 48, 63,218, 32,233, 62, 80, 80, 51, 63,
+192,159,213, 62,128, 46, 54, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+144, 61, 57, 63, 19,196,217, 62,128, 46, 54, 63, 75,207,236, 62, 80, 80, 51, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80, 80, 51, 63,192,159,213, 62,204, 80, 48, 63,218, 32,233, 62, 38, 82, 45, 63,
+ 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27, 66, 48, 63,173,208,189, 62,
+ 38, 82, 45, 63, 55, 92,210, 62,118, 17, 42, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,118, 17, 42, 63, 72,220,187, 62, 26, 5, 45, 63,117,190,166, 62, 27, 66, 48, 63,173,208,189, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58,136, 51, 63, 90,150,169, 62, 27, 66, 48, 63,173,208,189, 62,
+ 26, 5, 45, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 26, 5, 45, 63,
+117,190,166, 62,118, 17, 42, 63, 72,220,187, 62,107,102, 38, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,255, 55, 48, 63, 94,152, 9, 63,237, 40, 45, 63,252, 29, 19, 63,242,186, 41, 63,112,150, 9, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,242,186, 41, 63,112,150, 9, 63,215,204, 44, 63,
+ 23,252,255, 62,255, 55, 48, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 63, 51, 51, 63, 0, 0, 0, 63,255, 55, 48, 63, 94,152, 9, 63,215,204, 44, 63, 23,252,255, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 44, 63, 23,252,255, 62,242,186, 41, 63,112,150, 9, 63,109,102, 38, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 17, 35, 63,112,150, 9, 63,
+109,102, 38, 63, 0, 0, 0, 63,242,186, 41, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,242,186, 41, 63,112,150, 9, 63,113,102, 38, 63,219, 98, 19, 63,235, 17, 35, 63,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245,163, 31, 63,253, 29, 19, 63,235, 17, 35, 63,112,150, 9, 63,
+113,102, 38, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,113,102, 38, 63,
+219, 98, 19, 63,242,186, 41, 63,112,150, 9, 63,237, 40, 45, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 38,235, 41, 63,141,140, 28, 63,117,102, 38, 63, 45,200, 37, 63,192,225, 34, 63,142,140, 28, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,225, 34, 63,142,140, 28, 63,113,102, 38, 63,
+219, 98, 19, 63, 38,235, 41, 63,141,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+237, 40, 45, 63,252, 29, 19, 63, 38,235, 41, 63,141,140, 28, 63,113,102, 38, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,113,102, 38, 63,219, 98, 19, 63,192,225, 34, 63,142,140, 28, 63,245,163, 31, 63,
+253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 17, 35, 63,112,150, 9, 63,
+245,163, 31, 63,253, 29, 19, 63,223,148, 28, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,223,148, 28, 63, 94,152, 9, 63, 2, 0, 32, 63, 24,252,255, 62,235, 17, 35, 63,112,150, 9, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63, 0, 0, 0, 63,235, 17, 35, 63,112,150, 9, 63,
+ 2, 0, 32, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 32, 63,
+ 24,252,255, 62,223,148, 28, 63, 94,152, 9, 63,155,153, 25, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,188,129,107, 63, 66, 45,128, 62,235, 71, 99, 63,222, 76,120, 62, 94, 37,106, 63, 84, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94, 37,106, 63, 84, 97, 83, 62, 65, 51,115, 63,
+248,151, 97, 62,188,129,107, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63,151, 83,135, 62,188,129,107, 63, 66, 45,128, 62, 65, 51,115, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,248,151, 97, 62, 94, 37,106, 63, 84, 97, 83, 62, 65, 51,115, 63,
+ 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,129,107, 63, 66, 45,128, 62,
+ 65, 51,115, 63,151, 83,135, 62,142,123,108, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,142,123,108, 63,169,144,151, 62,231, 50,101, 63, 17,201,146, 62,188,129,107, 63, 66, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 71, 99, 63,222, 76,120, 62,188,129,107, 63, 66, 45,128, 62,
+231, 50,101, 63, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,231, 50,101, 63,
+ 17,201,146, 62,142,123,108, 63,169,144,151, 62,106,187,102, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 71, 56, 96, 63, 99,190,166, 62,149,153, 89, 63,201,199,165, 62, 22,238, 93, 63,243,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22,238, 93, 63,243,101,144, 62,231, 50,101, 63,
+ 17,201,146, 62, 71, 56, 96, 63, 99,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+106,187,102, 63, 54,150,169, 62, 71, 56, 96, 63, 99,190,166, 62,231, 50,101, 63, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,231, 50,101, 63, 17,201,146, 62, 22,238, 93, 63,243,101,144, 62,235, 71, 99, 63,
+222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,249, 21,109, 63, 65, 54,174, 62,
+106,187,102, 63, 54,150,169, 62,142,123,108, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,142,123,108, 63,169,144,151, 62, 65, 51,115, 63, 93,231,157, 62,249, 21,109, 63, 65, 54,174, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,160,111,180, 62,249, 21,109, 63, 65, 54,174, 62,
+ 65, 51,115, 63, 93,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,
+ 93,231,157, 62,142,123,108, 63,169,144,151, 62, 65, 51,115, 63,151, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63, 79,162,115, 62,235, 71, 99, 63,222, 76,120, 62, 22,238, 93, 63,243,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22,238, 93, 63,243,101,144, 62, 21, 69, 85, 63,
+ 3,102,144, 62,149,153, 89, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68,235, 79, 63, 37, 77,120, 62,149,153, 89, 63, 79,162,115, 62, 21, 69, 85, 63, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 69, 85, 63, 3,102,144, 62, 22,238, 93, 63,243,101,144, 62,149,153, 89, 63,
+201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63, 79,162,115, 62,
+ 68,235, 79, 63, 37, 77,120, 62, 24,186, 83, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 24,186, 83, 63,245,176, 70, 62, 22,121, 95, 63,204,176, 70, 62,149,153, 89, 63, 79,162,115, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 71, 99, 63,222, 76,120, 62,149,153, 89, 63, 79,162,115, 62,
+ 22,121, 95, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22,121, 95, 63,
+204,176, 70, 62, 24,186, 83, 63,245,176, 70, 62,152,153, 89, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 61,119,103, 63,179,253, 30, 62, 65, 51,115, 63, 90,111, 52, 62, 94, 37,106, 63, 84, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94, 37,106, 63, 84, 97, 83, 62, 22,121, 95, 63,
+204,176, 70, 62, 61,119,103, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+152,153, 89, 63,198, 31, 23, 62, 61,119,103, 63,179,253, 30, 62, 22,121, 95, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22,121, 95, 63,204,176, 70, 62, 94, 37,106, 63, 84, 97, 83, 62,235, 71, 99, 63,
+222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,248,187, 75, 63,241,253, 30, 62,
+152,153, 89, 63,198, 31, 23, 62, 24,186, 83, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 24,186, 83, 63,245,176, 70, 62,214, 13, 73, 63,181, 97, 83, 62,248,187, 75, 63,241,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,202,111, 52, 62,248,187, 75, 63,241,253, 30, 62,
+214, 13, 73, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214, 13, 73, 63,
+181, 97, 83, 62, 24,186, 83, 63,245,176, 70, 62, 68,235, 79, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,111, 41,147, 61, 0, 0, 64, 63,195,111,180, 61, 0, 0, 64, 63,111, 65, 52, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,111, 65, 52, 61, 38, 49,117, 63,
+225, 64, 52, 61,152,153, 89, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63, 83,111,180, 61,152,153, 89, 63,111, 41,147, 61, 38, 49,117, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 49,117, 63,225, 64, 52, 61, 0, 0, 64, 63,111, 65, 52, 61,208,222,121, 63,
+102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,111, 41,147, 61,
+ 65, 51,115, 63, 83,111,180, 61,172, 51, 99, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,172, 51, 99, 63, 48, 46,231, 61,135,255, 79, 63,120, 46,231, 61,152,153, 89, 63,111, 41,147, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,195,111,180, 61,152,153, 89, 63,111, 41,147, 61,
+135,255, 79, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,135,255, 79, 63,
+120, 46,231, 61,172, 51, 99, 63, 48, 46,231, 61,152,153, 89, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,248,187, 75, 63,241,253, 30, 62, 0, 0, 64, 63,202,111, 52, 62, 0, 0, 64, 63, 24, 71, 7, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 24, 71, 7, 62,135,255, 79, 63,
+120, 46,231, 61,248,187, 75, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+152,153, 89, 63,198, 31, 23, 62,248,187, 75, 63,241,253, 30, 62,135,255, 79, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,135,255, 79, 63,120, 46,231, 61, 0, 0, 64, 63, 24, 71, 7, 62, 0, 0, 64, 63,
+195,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61,119,103, 63,179,253, 30, 62,
+152,153, 89, 63,198, 31, 23, 62,172, 51, 99, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,172, 51, 99, 63, 48, 46,231, 61, 66, 51,115, 63,199, 70, 7, 62, 61,119,103, 63,179,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 90,111, 52, 62, 61,119,103, 63,179,253, 30, 62,
+ 66, 51,115, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 66, 51,115, 63,
+199, 70, 7, 62,172, 51, 99, 63, 48, 46,231, 61, 65, 51,115, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,122,177, 71, 63,120, 45,128, 62, 0, 0, 64, 63,218, 83,135, 62, 0, 0, 64, 63,115,152, 97, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,115,152, 97, 62,214, 13, 73, 63,
+181, 97, 83, 62,122,177, 71, 63,120, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68,235, 79, 63, 37, 77,120, 62,122,177, 71, 63,120, 45,128, 62,214, 13, 73, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214, 13, 73, 63,181, 97, 83, 62, 0, 0, 64, 63,115,152, 97, 62, 0, 0, 64, 63,
+202,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,177, 71, 63,120, 45,128, 62,
+ 68,235, 79, 63, 37, 77,120, 62, 72, 0, 78, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 72, 0, 78, 63, 52,201,146, 62,169,183, 70, 63,219,144,151, 62,122,177, 71, 63,120, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,218, 83,135, 62,122,177, 71, 63,120, 45,128, 62,
+169,183, 70, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,183, 70, 63,
+219,144,151, 62, 72, 0, 78, 63, 52,201,146, 62,198,119, 76, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 61, 29, 70, 63,114, 54,174, 62, 0, 0, 64, 63,211,111,180, 62, 0, 0, 64, 63,162,231,157, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,162,231,157, 62,169,183, 70, 63,
+219,144,151, 62, 61, 29, 70, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+198,119, 76, 63, 90,150,169, 62, 61, 29, 70, 63,114, 54,174, 62,169,183, 70, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,183, 70, 63,219,144,151, 62, 0, 0, 64, 63,162,231,157, 62, 0, 0, 64, 63,
+218, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230,250, 82, 63,117,190,166, 62,
+198,119, 76, 63, 90,150,169, 62, 72, 0, 78, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 72, 0, 78, 63, 52,201,146, 62, 21, 69, 85, 63, 3,102,144, 62,230,250, 82, 63,117,190,166, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63,201,199,165, 62,230,250, 82, 63,117,190,166, 62,
+ 21, 69, 85, 63, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 69, 85, 63,
+ 3,102,144, 62, 72, 0, 78, 63, 52,201,146, 62, 68,235, 79, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,179,167,245, 61, 72, 45,128, 62, 94,217,179, 61,222, 76,120, 62,202,196,234, 61,100, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,202,196,234, 61,100, 97, 83, 62,212,153, 25, 62,
+ 2,152, 97, 62,179,167,245, 61, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+214,153, 25, 62,156, 83,135, 62,179,167,245, 61, 72, 45,128, 62,212,153, 25, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,153, 25, 62, 2,152, 97, 62,202,196,234, 61,100, 97, 83, 62,214,153, 25, 62,
+106,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,167,245, 61, 72, 45,128, 62,
+214,153, 25, 62,156, 83,135, 62, 62,118,253, 61,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 62,118,253, 61,174,144,151, 62, 53, 49,195, 61, 17,201,146, 62,179,167,245, 61, 72, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94,217,179, 61,222, 76,120, 62,179,167,245, 61, 72, 45,128, 62,
+ 53, 49,195, 61, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 49,195, 61,
+ 17,201,146, 62, 62,118,253, 61,174,144,151, 62, 70,117,207, 61, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 79, 92,155, 61, 91,190,166, 62,194,205, 76, 61,186,199,165, 62,212, 10,137, 61,238,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212, 10,137, 61,238,101,144, 62, 53, 49,195, 61,
+ 17,201,146, 62, 79, 92,155, 61, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 70,117,207, 61, 54,150,169, 62, 79, 92,155, 61, 91,190,166, 62, 53, 49,195, 61, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 49,195, 61, 17,201,146, 62,212, 10,137, 61,238,101,144, 62, 94,217,179, 61,
+222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 36, 1, 62, 70, 54,174, 62,
+ 70,117,207, 61, 54,150,169, 62, 62,118,253, 61,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 62,118,253, 61,174,144,151, 62,213,153, 25, 62,100,231,157, 62,204, 36, 1, 62, 70, 54,174, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,165,111,180, 62,204, 36, 1, 62, 70, 54,174, 62,
+213,153, 25, 62,100,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213,153, 25, 62,
+100,231,157, 62, 62,118,253, 61,174,144,151, 62,214,153, 25, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,188,205, 76, 61, 53,162,115, 62, 94,217,179, 61,222, 76,120, 62,212, 10,137, 61,238,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212, 10,137, 61,238,101,144, 62,207,133, 7, 61,
+236,101,144, 62,188,205, 76, 61, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+255,162, 71, 60,216, 76,120, 62,188,205, 76, 61, 53,162,115, 62,207,133, 7, 61,236,101,144, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,207,133, 7, 61,236,101,144, 62,212, 10,137, 61,238,101,144, 62,194,205, 76, 61,
+186,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,205, 76, 61, 53,162,115, 62,
+255,162, 71, 60,216, 76,120, 62,190,171,221, 60,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,190,171,221, 60,194,176, 70, 62,194, 98,149, 61,194,176, 70, 62,188,205, 76, 61, 53,162,115, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94,217,179, 61,222, 76,120, 62,188,205, 76, 61, 53,162,115, 62,
+194, 98,149, 61,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194, 98,149, 61,
+194,176, 70, 62,190,171,221, 60,194,176, 70, 62,193,205, 76, 61,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,198, 83,213, 61,179,253, 30, 62,214,153, 25, 62,106,111, 52, 62,202,196,234, 61,100, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,202,196,234, 61,100, 97, 83, 62,194, 98,149, 61,
+194,176, 70, 62,198, 83,213, 61,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+193,205, 76, 61,168, 31, 23, 62,198, 83,213, 61,179,253, 30, 62,194, 98,149, 61,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194, 98,149, 61,194,176, 70, 62,202,196,234, 61,100, 97, 83, 62, 94,217,179, 61,
+222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,239,126, 63,174,253, 30, 62,
+154,105,131, 63,168, 31, 23, 62,175,118,131, 63,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,175,118,131, 63,194,176, 70, 62, 30, 65,124, 63, 90, 97, 83, 62, 59,239,126, 63,174,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 90,111, 52, 62, 59,239,126, 63,174,253, 30, 62,
+ 30, 65,124, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 65,124, 63,
+ 90, 97, 83, 62,175,118,131, 63,194,176, 70, 62, 70,143,129, 63,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,156,105,131, 63,101, 41,147, 61, 65, 51,115, 63, 83,111,180, 61, 38, 49,117, 63,225, 64, 52, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 49,117, 63,225, 64, 52, 61,232,148,135, 63,
+144,158,125, 60,156,105,131, 63,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+215,153, 25, 62,104,111,180, 61,122,245,128, 61,101, 41,147, 61,224,153, 25, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,232,148,135, 63,144,158,125, 60, 38, 49,117, 63,225, 64, 52, 61,208,222,121, 63,
+102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,245,128, 61,101, 41,147, 61,
+215,153, 25, 62,104,111,180, 61, 89, 55,179, 61, 38, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 89, 55,179, 61, 38, 46,231, 61, 96,147,208, 60, 48, 46,231, 61,122,245,128, 61,101, 41,147, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 83,111,180, 61,156,105,131, 63,101, 41,147, 61,
+102,153,129, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 96,147,208, 60,
+ 48, 46,231, 61, 89, 55,179, 61, 38, 46,231, 61,193,205, 76, 61,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 59,239,126, 63,174,253, 30, 62, 65, 51,115, 63, 90,111, 52, 62, 66, 51,115, 63,199, 70, 7, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 66, 51,115, 63,199, 70, 7, 62,102,153,129, 63,
+ 48, 46,231, 61, 59,239,126, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,105,131, 63,168, 31, 23, 62, 59,239,126, 63,174,253, 30, 62,102,153,129, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102,153,129, 63, 48, 46,231, 61, 66, 51,115, 63,199, 70, 7, 62, 65, 51,115, 63,
+ 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198, 83,213, 61,179,253, 30, 62,
+193,205, 76, 61,168, 31, 23, 62, 89, 55,179, 61, 38, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 89, 55,179, 61, 38, 46,231, 61,217,153, 25, 62,204, 70, 7, 62,198, 83,213, 61,179,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,106,111, 52, 62,198, 83,213, 61,179,253, 30, 62,
+217,153, 25, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,217,153, 25, 62,
+204, 70, 7, 62, 89, 55,179, 61, 38, 46,231, 61,215,153, 25, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,192,228,122, 63, 66, 45,128, 62, 65, 51,115, 63,151, 83,135, 62, 65, 51,115, 63,248,151, 97, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,248,151, 97, 62, 30, 65,124, 63,
+ 90, 97, 83, 62,192,228,122, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 70,143,129, 63,216, 76,120, 62,192,228,122, 63, 66, 45,128, 62, 30, 65,124, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 65,124, 63, 90, 97, 83, 62, 65, 51,115, 63,248,151, 97, 62, 65, 51,115, 63,
+ 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,228,122, 63, 66, 45,128, 62,
+ 70,143,129, 63,216, 76,120, 62,201,153,128, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,201,153,128, 63, 14,201,146, 62,239,234,121, 63,169,144,151, 62,192,228,122, 63, 66, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,151, 83,135, 62,192,228,122, 63, 66, 45,128, 62,
+239,234,121, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,234,121, 63,
+169,144,151, 62,201,153,128, 63, 14,201,146, 62, 15,171,127, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,133, 80,121, 63, 65, 54,174, 62, 65, 51,115, 63,160,111,180, 62, 65, 51,115, 63, 93,231,157, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 93,231,157, 62,239,234,121, 63,
+169,144,151, 62,133, 80,121, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 15,171,127, 63, 52,150,169, 62,133, 80,121, 63, 65, 54,174, 62,239,234,121, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,234,121, 63,169,144,151, 62, 65, 51,115, 63, 93,231,157, 62, 65, 51,115, 63,
+151, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 23,131, 63, 89,190,166, 62,
+ 15,171,127, 63, 52,150,169, 62,201,153,128, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,136,200,153, 59, 14,201,146, 62,207,133, 7, 61,236,101,144, 62,195,197,197, 60, 89,190,166, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194,205, 76, 61,186,199,165, 62,195,197,197, 60, 89,190,166, 62,
+207,133, 7, 61,236,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,207,133, 7, 61,
+236,101,144, 62,136,200,153, 59, 14,201,146, 62,255,162, 71, 60,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 32,208,163, 62, 79, 45,128, 62,147, 92,147, 62,252, 76,120, 62,102, 23,161, 62,115, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102, 23,161, 62,115, 97, 83, 62, 22, 51,179, 62,
+ 2,152, 97, 62, 32,208,163, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 51,179, 62,156, 83,135, 62, 32,208,163, 62, 79, 45,128, 62, 22, 51,179, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22, 51,179, 62, 2,152, 97, 62,102, 23,161, 62,115, 97, 83, 62, 21, 51,179, 62,
+101,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32,208,163, 62, 79, 45,128, 62,
+ 21, 51,179, 62,156, 83,135, 62,194,195,165, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,194,195,165, 62,181,144,151, 62,134, 50,151, 62, 29,201,146, 62, 32,208,163, 62, 79, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147, 92,147, 62,252, 76,120, 62, 32,208,163, 62, 79, 45,128, 62,
+134, 50,151, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 50,151, 62,
+ 29,201,146, 62,194,195,165, 62,181,144,151, 62,137, 67,154, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 82, 61,141, 62,112,190,166, 62, 0, 0,128, 62,206,199,165, 62,247,168,136, 62, 3,102,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,247,168,136, 62, 3,102,144, 62,134, 50,151, 62,
+ 29,201,146, 62, 82, 61,141, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+137, 67,154, 62, 70,150,169, 62, 82, 61,141, 62,112,190,166, 62,134, 50,151, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 50,151, 62, 29,201,146, 62,247,168,136, 62, 3,102,144, 62,147, 92,147, 62,
+252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150,248,166, 62, 78, 54,174, 62,
+137, 67,154, 62, 70,150,169, 62,194,195,165, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,194,195,165, 62,181,144,151, 62, 21, 51,179, 62, 98,231,157, 62,150,248,166, 62, 78, 54,174, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,165,111,180, 62,150,248,166, 62, 78, 54,174, 62,
+ 21, 51,179, 62, 98,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,
+ 98,231,157, 62,194,195,165, 62,181,144,151, 62, 21, 51,179, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 89,162,115, 62,147, 92,147, 62,252, 76,120, 62,247,168,136, 62, 3,102,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,247,168,136, 62, 3,102,144, 62, 18,174,110, 62,
+ 3,102,144, 62, 0, 0,128, 62, 89,162,115, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 62, 89,162,115, 62, 18,174,110, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 18,174,110, 62, 3,102,144, 62,247,168,136, 62, 3,102,144, 62, 0, 0,128, 62,
+206,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 89,162,115, 62,
+217, 70, 89, 62,252, 76,120, 62, 30,130,104, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 30,130,104, 62,230,176, 70, 62,241,190,139, 62,230,176, 70, 62, 0, 0,128, 62, 89,162,115, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147, 92,147, 62,252, 76,120, 62, 0, 0,128, 62, 89,162,115, 62,
+241,190,139, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,190,139, 62,
+230,176, 70, 62, 30,130,104, 62,230,176, 70, 62, 0, 0,128, 62,208, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 41,187,155, 62,205,253, 30, 62, 21, 51,179, 62,101,111, 52, 62,102, 23,161, 62,115, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102, 23,161, 62,115, 97, 83, 62,241,190,139, 62,
+230,176, 70, 62, 41,187,155, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,208, 31, 23, 62, 41,187,155, 62,205,253, 30, 62,241,190,139, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,190,139, 62,230,176, 70, 62,102, 23,161, 62,115, 97, 83, 62,147, 92,147, 62,
+252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174,137, 72, 62,205,253, 30, 62,
+ 0, 0,128, 62,208, 31, 23, 62, 30,130,104, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 30,130,104, 62,230,176, 70, 62, 51,209, 61, 62,115, 97, 83, 62,174,137, 72, 62,205,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,106,111, 52, 62,174,137, 72, 62,205,253, 30, 62,
+ 51,209, 61, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51,209, 61, 62,
+115, 97, 83, 62, 30,130,104, 62,230,176, 70, 62,217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,255,255,127, 62,141, 41,147, 61,215,153, 25, 62,104,111,180, 61,224,153, 25, 62,225, 64, 52, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,153, 25, 62,225, 64, 52, 61, 15, 51,179, 62,
+225, 64, 52, 61,255,255,127, 62,141, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 20, 51,179, 62,104,111,180, 61,255,255,127, 62,141, 41,147, 61, 15, 51,179, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15, 51,179, 62,225, 64, 52, 61,224,153, 25, 62,225, 64, 52, 61,144,175,161, 62,
+102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255,255,127, 62,141, 41,147, 61,
+ 20, 51,179, 62,104,111,180, 61, 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 12, 52,147, 62,109, 46,231, 61,231,151, 89, 62,109, 46,231, 61,255,255,127, 62,141, 41,147, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,153, 25, 62,104,111,180, 61,255,255,127, 62,141, 41,147, 61,
+231,151, 89, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,231,151, 89, 62,
+109, 46,231, 61, 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 62,208, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,174,137, 72, 62,205,253, 30, 62,214,153, 25, 62,106,111, 52, 62,217,153, 25, 62,204, 70, 7, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,217,153, 25, 62,204, 70, 7, 62,231,151, 89, 62,
+109, 46,231, 61,174,137, 72, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,208, 31, 23, 62,174,137, 72, 62,205,253, 30, 62,231,151, 89, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,231,151, 89, 62,109, 46,231, 61,217,153, 25, 62,204, 70, 7, 62,215,153, 25, 62,
+104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 41,187,155, 62,205,253, 30, 62,
+ 0, 0,128, 62,208, 31, 23, 62, 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 12, 52,147, 62,109, 46,231, 61, 19, 51,179, 62,204, 70, 7, 62, 41,187,155, 62,205,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,101,111, 52, 62, 41,187,155, 62,205,253, 30, 62,
+ 19, 51,179, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19, 51,179, 62,
+204, 70, 7, 62, 12, 52,147, 62,109, 46,231, 61, 20, 51,179, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,192, 95, 56, 62, 79, 45,128, 62,214,153, 25, 62,156, 83,135, 62,212,153, 25, 62, 2,152, 97, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,153, 25, 62, 2,152, 97, 62, 51,209, 61, 62,
+115, 97, 83, 62,192, 95, 56, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+217, 70, 89, 62,252, 76,120, 62,192, 95, 56, 62, 79, 45,128, 62, 51,209, 61, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51,209, 61, 62,115, 97, 83, 62,212,153, 25, 62, 2,152, 97, 62,214,153, 25, 62,
+106,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192, 95, 56, 62, 79, 45,128, 62,
+217, 70, 89, 62,252, 76,120, 62,245,154, 81, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,245,154, 81, 62, 29,201,146, 62,125,120, 52, 62,181,144,151, 62,192, 95, 56, 62, 79, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,156, 83,135, 62,192, 95, 56, 62, 79, 45,128, 62,
+125,120, 52, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,125,120, 52, 62,
+181,144,151, 62,245,154, 81, 62, 29,201,146, 62,239,120, 75, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,213, 14, 50, 62, 78, 54,174, 62,214,153, 25, 62,165,111,180, 62,213,153, 25, 62,100,231,157, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213,153, 25, 62,100,231,157, 62,125,120, 52, 62,
+181,144,151, 62,213, 14, 50, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,120, 75, 62, 70,150,169, 62,213, 14, 50, 62, 78, 54,174, 62,125,120, 52, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,125,120, 52, 62,181,144,151, 62,213,153, 25, 62,100,231,157, 62,214,153, 25, 62,
+156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91,133,101, 62,112,190,166, 62,
+239,120, 75, 62, 70,150,169, 62,245,154, 81, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,245,154, 81, 62, 29,201,146, 62, 18,174,110, 62, 3,102,144, 62, 91,133,101, 62,112,190,166, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,206,199,165, 62, 91,133,101, 62,112,190,166, 62,
+ 18,174,110, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 18,174,110, 62,
+ 3,102,144, 62,245,154, 81, 62, 29,201,146, 62,217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 64, 27, 5, 63, 66, 45,128, 62,232,194,249, 62,216, 76,120, 62,226,190, 3, 63, 90, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,226,190, 3, 63, 90, 97, 83, 62,191,204, 12, 63,
+248,151, 97, 62, 64, 27, 5, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,149, 83,135, 62, 64, 27, 5, 63, 66, 45,128, 62,191,204, 12, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,248,151, 97, 62,226,190, 3, 63, 90, 97, 83, 62,191,204, 12, 63,
+ 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64, 27, 5, 63, 66, 45,128, 62,
+191,204, 12, 63,149, 83,135, 62, 17, 21, 6, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 17, 21, 6, 63,169,144,151, 62,222,152,253, 62, 14,201,146, 62, 64, 27, 5, 63, 66, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,232,194,249, 62,216, 76,120, 62, 64, 27, 5, 63, 66, 45,128, 62,
+222,152,253, 62, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,152,253, 62,
+ 14,201,146, 62, 17, 21, 6, 63,169,144,151, 62,241, 84, 0, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,164,163,243, 62, 89,190,166, 62, 72,102,230, 62,183,199,165, 62, 70, 15,239, 62,233,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70, 15,239, 62,233,101,144, 62,222,152,253, 62,
+ 14,201,146, 62,164,163,243, 62, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+241, 84, 0, 63, 52,150,169, 62,164,163,243, 62, 89,190,166, 62,222,152,253, 62, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,152,253, 62, 14,201,146, 62, 70, 15,239, 62,233,101,144, 62,232,194,249, 62,
+216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123,175, 6, 63, 65, 54,174, 62,
+241, 84, 0, 63, 52,150,169, 62, 17, 21, 6, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 17, 21, 6, 63,169,144,151, 62,191,204, 12, 63, 90,231,157, 62,123,175, 6, 63, 65, 54,174, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,160,111,180, 62,123,175, 6, 63, 65, 54,174, 62,
+191,204, 12, 63, 90,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,
+ 90,231,157, 62, 17, 21, 6, 63,169,144,151, 62,191,204, 12, 63,149, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62, 53,162,115, 62,232,194,249, 62,216, 76,120, 62, 70, 15,239, 62,233,101,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70, 15,239, 62,233,101,144, 62, 75,189,221, 62,
+238,101,144, 62, 72,102,230, 62, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+168, 9,211, 62,222, 76,120, 62, 72,102,230, 62, 53,162,115, 62, 75,189,221, 62,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 75,189,221, 62,238,101,144, 62, 70, 15,239, 62,233,101,144, 62, 72,102,230, 62,
+183,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62, 53,162,115, 62,
+168, 9,211, 62,222, 76,120, 62, 80,167,218, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 80,167,218, 62,194,176, 70, 62, 68, 37,242, 62,194,176, 70, 62, 72,102,230, 62, 53,162,115, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,232,194,249, 62,216, 76,120, 62, 72,102,230, 62, 53,162,115, 62,
+ 68, 37,242, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 37,242, 62,
+194,176, 70, 62, 80,167,218, 62,194,176, 70, 62, 72,102,230, 62,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,197, 16, 1, 63,174,253, 30, 62,191,204, 12, 63, 90,111, 52, 62,226,190, 3, 63, 90, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,226,190, 3, 63, 90, 97, 83, 62, 68, 37,242, 62,
+194,176, 70, 62,197, 16, 1, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 72,102,230, 62,168, 31, 23, 62,197, 16, 1, 63,174,253, 30, 62, 68, 37,242, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 37,242, 62,194,176, 70, 62,226,190, 3, 63, 90, 97, 83, 62,232,194,249, 62,
+216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,171,202, 62,179,253, 30, 62,
+ 72,102,230, 62,168, 31, 23, 62, 80,167,218, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 80,167,218, 62,194,176, 70, 62,205, 78,197, 62, 95, 97, 83, 62, 14,171,202, 62,179,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,101,111, 52, 62, 14,171,202, 62,179,253, 30, 62,
+205, 78,197, 62, 95, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205, 78,197, 62,
+ 95, 97, 83, 62, 80,167,218, 62,194,176, 70, 62,168, 9,211, 62,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 63,102,230, 62,101, 41,147, 61, 20, 51,179, 62,104,111,180, 61, 15, 51,179, 62,225, 64, 52, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15, 51,179, 62,225, 64, 52, 61,189,204, 12, 63,
+225, 64, 52, 61, 63,102,230, 62,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63, 83,111,180, 61, 63,102,230, 62,101, 41,147, 61,189,204, 12, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,189,204, 12, 63,225, 64, 52, 61, 15, 51,179, 62,225, 64, 52, 61,144,175,161, 62,
+102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63,102,230, 62,101, 41,147, 61,
+191,204, 12, 63, 83,111,180, 61,104,154,249, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,104,154,249, 62, 48, 46,231, 61, 42, 50,211, 62, 48, 46,231, 61, 63,102,230, 62,101, 41,147, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 51,179, 62,104,111,180, 61, 63,102,230, 62,101, 41,147, 61,
+ 42, 50,211, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 50,211, 62,
+ 48, 46,231, 61,104,154,249, 62, 48, 46,231, 61, 72,102,230, 62,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 14,171,202, 62,179,253, 30, 62, 21, 51,179, 62,101,111, 52, 62, 19, 51,179, 62,204, 70, 7, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19, 51,179, 62,204, 70, 7, 62, 42, 50,211, 62,
+ 48, 46,231, 61, 14,171,202, 62,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 72,102,230, 62,168, 31, 23, 62, 14,171,202, 62,179,253, 30, 62, 42, 50,211, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 50,211, 62, 48, 46,231, 61, 19, 51,179, 62,204, 70, 7, 62, 20, 51,179, 62,
+104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,197, 16, 1, 63,174,253, 30, 62,
+ 72,102,230, 62,168, 31, 23, 62,104,154,249, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,104,154,249, 62, 48, 46,231, 61,191,204, 12, 63,199, 70, 7, 62,197, 16, 1, 63,174,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 90,111, 52, 62,197, 16, 1, 63,174,253, 30, 62,
+191,204, 12, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,
+199, 70, 7, 62,104,154,249, 62, 48, 46,231, 61,191,204, 12, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 19,150,194, 62, 72, 45,128, 62, 21, 51,179, 62,156, 83,135, 62, 22, 51,179, 62, 2,152, 97, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 22, 51,179, 62, 2,152, 97, 62,205, 78,197, 62,
+ 95, 97, 83, 62, 19,150,194, 62, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+168, 9,211, 62,222, 76,120, 62, 19,150,194, 62, 72, 45,128, 62,205, 78,197, 62, 95, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205, 78,197, 62, 95, 97, 83, 62, 22, 51,179, 62, 2,152, 97, 62, 21, 51,179, 62,
+101,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,150,194, 62, 72, 45,128, 62,
+168, 9,211, 62,222, 76,120, 62,179, 51,207, 62, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,179, 51,207, 62, 17,201,146, 62,113,162,192, 62,174,144,151, 62, 19,150,194, 62, 72, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,156, 83,135, 62, 19,150,194, 62, 72, 45,128, 62,
+113,162,192, 62,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,113,162,192, 62,
+174,144,151, 62,179, 51,207, 62, 17,201,146, 62,175, 34,204, 62, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,154,109,191, 62, 68, 54,174, 62, 21, 51,179, 62,165,111,180, 62, 21, 51,179, 62, 98,231,157, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62, 98,231,157, 62,113,162,192, 62,
+174,144,151, 62,154,109,191, 62, 68, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+175, 34,204, 62, 54,150,169, 62,154,109,191, 62, 68, 54,174, 62,113,162,192, 62,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,113,162,192, 62,174,144,151, 62, 21, 51,179, 62, 98,231,157, 62, 21, 51,179, 62,
+156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40,217, 62, 91,190,166, 62,
+175, 34,204, 62, 54,150,169, 62,179, 51,207, 62, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,179, 51,207, 62, 17,201,146, 62, 75,189,221, 62,238,101,144, 62,237, 40,217, 62, 91,190,166, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62,183,199,165, 62,237, 40,217, 62, 91,190,166, 62,
+ 75,189,221, 62,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 75,189,221, 62,
+238,101,144, 62,179, 51,207, 62, 17,201,146, 62,168, 9,211, 62,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,134, 78, 56, 63,117, 45,128, 62,188, 20, 48, 63, 37, 77,120, 62, 42,242, 54, 63,181, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,242, 54, 63,181, 97, 83, 62, 0, 0, 64, 63,
+115,152, 97, 62,134, 78, 56, 63,117, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,218, 83,135, 62,134, 78, 56, 63,117, 45,128, 62, 0, 0, 64, 63,115,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,115,152, 97, 62, 42,242, 54, 63,181, 97, 83, 62, 0, 0, 64, 63,
+202,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 78, 56, 63,117, 45,128, 62,
+ 0, 0, 64, 63,218, 83,135, 62, 87, 72, 57, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 87, 72, 57, 63,219,144,151, 62,184,255, 49, 63, 52,201,146, 62,134, 78, 56, 63,117, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188, 20, 48, 63, 37, 77,120, 62,134, 78, 56, 63,117, 45,128, 62,
+184,255, 49, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,184,255, 49, 63,
+ 52,201,146, 62, 87, 72, 57, 63,219,144,151, 62, 58,136, 51, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 26, 5, 45, 63,117,190,166, 62,107,102, 38, 63,201,199,165, 62,235,186, 42, 63, 5,102,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235,186, 42, 63, 5,102,144, 62,184,255, 49, 63,
+ 52,201,146, 62, 26, 5, 45, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 58,136, 51, 63, 90,150,169, 62, 26, 5, 45, 63,117,190,166, 62,184,255, 49, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,184,255, 49, 63, 52,201,146, 62,235,186, 42, 63, 5,102,144, 62,188, 20, 48, 63,
+ 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,226, 57, 63,114, 54,174, 62,
+ 58,136, 51, 63, 90,150,169, 62, 87, 72, 57, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 87, 72, 57, 63,219,144,151, 62, 0, 0, 64, 63,162,231,157, 62,196,226, 57, 63,114, 54,174, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,211,111,180, 62,196,226, 57, 63,114, 54,174, 62,
+ 0, 0, 64, 63,162,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,
+162,231,157, 62, 87, 72, 57, 63,219,144,151, 62, 0, 0, 64, 63,218, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63, 79,162,115, 62,188, 20, 48, 63, 37, 77,120, 62,235,186, 42, 63, 5,102,144, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235,186, 42, 63, 5,102,144, 62,234, 17, 34, 63,
+243,101,144, 62,107,102, 38, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21,184, 28, 63,222, 76,120, 62,107,102, 38, 63, 79,162,115, 62,234, 17, 34, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,234, 17, 34, 63,243,101,144, 62,235,186, 42, 63, 5,102,144, 62,107,102, 38, 63,
+201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63, 79,162,115, 62,
+ 21,184, 28, 63,222, 76,120, 62,234,134, 32, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,234,134, 32, 63,204,176, 70, 62,233, 69, 44, 63,245,176, 70, 62,107,102, 38, 63, 79,162,115, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188, 20, 48, 63, 37, 77,120, 62,107,102, 38, 63, 79,162,115, 62,
+233, 69, 44, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233, 69, 44, 63,
+245,176, 70, 62,234,134, 32, 63,204,176, 70, 62,104,102, 38, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 9, 68, 52, 63,241,253, 30, 62, 0, 0, 64, 63,202,111, 52, 62, 42,242, 54, 63,181, 97, 83, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,242, 54, 63,181, 97, 83, 62,233, 69, 44, 63,
+245,176, 70, 62, 9, 68, 52, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104,102, 38, 63,198, 31, 23, 62, 9, 68, 52, 63,241,253, 30, 62,233, 69, 44, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233, 69, 44, 63,245,176, 70, 62, 42,242, 54, 63,181, 97, 83, 62,188, 20, 48, 63,
+ 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,195,136, 24, 63,179,253, 30, 62,
+104,102, 38, 63,198, 31, 23, 62,234,134, 32, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,234,134, 32, 63,204,176, 70, 62,162,218, 21, 63, 84, 97, 83, 62,195,136, 24, 63,179,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 90,111, 52, 62,195,136, 24, 63,179,253, 30, 62,
+162,218, 21, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162,218, 21, 63,
+ 84, 97, 83, 62,234,134, 32, 63,204,176, 70, 62, 21,184, 28, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,111, 41,147, 61,191,204, 12, 63, 83,111,180, 61,189,204, 12, 63,225, 64, 52, 61,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,189,204, 12, 63,225, 64, 52, 61, 0, 0, 64, 63,
+111, 65, 52, 61,104,102, 38, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,195,111,180, 61,104,102, 38, 63,111, 41,147, 61, 0, 0, 64, 63,111, 65, 52, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,111, 65, 52, 61,189,204, 12, 63,225, 64, 52, 61,208,222,121, 63,
+102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,111, 41,147, 61,
+ 0, 0, 64, 63,195,111,180, 61,122, 0, 48, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,122, 0, 48, 63,120, 46,231, 61, 85,204, 28, 63, 48, 46,231, 61,104,102, 38, 63,111, 41,147, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 83,111,180, 61,104,102, 38, 63,111, 41,147, 61,
+ 85,204, 28, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 85,204, 28, 63,
+ 48, 46,231, 61,122, 0, 48, 63,120, 46,231, 61,104,102, 38, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,195,136, 24, 63,179,253, 30, 62,191,204, 12, 63, 90,111, 52, 62,191,204, 12, 63,199, 70, 7, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,199, 70, 7, 62, 85,204, 28, 63,
+ 48, 46,231, 61,195,136, 24, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104,102, 38, 63,198, 31, 23, 62,195,136, 24, 63,179,253, 30, 62, 85,204, 28, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 85,204, 28, 63, 48, 46,231, 61,191,204, 12, 63,199, 70, 7, 62,191,204, 12, 63,
+ 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 68, 52, 63,241,253, 30, 62,
+104,102, 38, 63,198, 31, 23, 62,122, 0, 48, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0,122, 0, 48, 63,120, 46,231, 61, 0, 0, 64, 63, 24, 71, 7, 62, 9, 68, 52, 63,241,253, 30, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,202,111, 52, 62, 9, 68, 52, 63,241,253, 30, 62,
+ 0, 0, 64, 63, 24, 71, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,
+ 24, 71, 7, 62,122, 0, 48, 63,120, 46,231, 61, 0, 0, 64, 63,195,111,180, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 68,126, 20, 63, 64, 45,128, 62,191,204, 12, 63,149, 83,135, 62,191,204, 12, 63,248,151, 97, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,248,151, 97, 62,162,218, 21, 63,
+ 84, 97, 83, 62, 68,126, 20, 63, 64, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21,184, 28, 63,222, 76,120, 62, 68,126, 20, 63, 64, 45,128, 62,162,218, 21, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162,218, 21, 63, 84, 97, 83, 62,191,204, 12, 63,248,151, 97, 62,191,204, 12, 63,
+ 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,126, 20, 63, 64, 45,128, 62,
+ 21,184, 28, 63,222, 76,120, 62, 25,205, 26, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 25,205, 26, 63, 14,201,146, 62,114,132, 19, 63,169,144,151, 62, 68,126, 20, 63, 64, 45,128, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,149, 83,135, 62, 68,126, 20, 63, 64, 45,128, 62,
+114,132, 19, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,114,132, 19, 63,
+169,144,151, 62, 25,205, 26, 63, 14,201,146, 62,150, 68, 25, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 7,234, 18, 63, 65, 54,174, 62,191,204, 12, 63,160,111,180, 62,191,204, 12, 63, 90,231,157, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 90,231,157, 62,114,132, 19, 63,
+169,144,151, 62, 7,234, 18, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+150, 68, 25, 63, 54,150,169, 62, 7,234, 18, 63, 65, 54,174, 62,114,132, 19, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,114,132, 19, 63,169,144,151, 62,191,204, 12, 63, 90,231,157, 62,191,204, 12, 63,
+149, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,185,199, 31, 63, 96,190,166, 62,
+150, 68, 25, 63, 54,150,169, 62, 25,205, 26, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 25,205, 26, 63, 14,201,146, 62,234, 17, 34, 63,243,101,144, 62,185,199, 31, 63, 96,190,166, 62, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63,201,199,165, 62,185,199, 31, 63, 96,190,166, 62,
+234, 17, 34, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,234, 17, 34, 63,
+243,101,144, 62, 25,205, 26, 63, 14,201,146, 62, 21,184, 28, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 80, 0, 0,168, 82,186, 3, 59, 0, 0, 0, 0, 20, 0, 0,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -16052,20 +16347,20 @@ char datatoc_preview_blend[]= {
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69,
- 0, 0, 1, 24, 8,195, 68, 96, 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 76, 48, 8,195, 62,112, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 69,112,114,101,118,105,101,119, 46, 48, 48, 50, 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, 8,195, 69,160, 8,195, 75, 80,
- 8,195, 75,144, 0, 0, 0, 0, 8,195, 71, 80, 8,195, 73,112, 0, 0, 0, 0, 8,195, 75,240, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,195, 69,208, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 71,240,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 73,208, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,179,128, 0, 0, 52, 64, 0, 0,188,142, 92,235, 63,128, 0, 0, 63,128, 0, 2, 60,142, 92,235, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 69,160, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 94, 32,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 69,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+ 24, 1, 0, 0,216,162,186, 3, 52, 0, 0, 0, 1, 0, 0, 0,160,170,186, 3,160,117,184, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69,112,114,101,118,105,101,119, 46, 48, 48, 50, 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, 32,164,186, 3,248,169,186, 3,
+ 64,170,186, 3, 0, 0, 0, 0,224,165,186, 3, 16,168,186, 3, 0, 0, 0, 0,176,163,159, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,164,186, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136,166,186, 3, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,168,186, 3, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,179, 0, 0, 64, 52,235, 92,142,188, 0, 0,128, 63, 2, 0,128, 63,235, 92,142, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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, 32,164,186, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3,
+ 68, 65, 84, 65, 84, 1, 0, 0, 88,164,186, 3, 58, 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, 8,195, 71, 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,224,165,186, 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,
@@ -16074,14 +16369,14 @@ char datatoc_preview_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, 68, 65, 84, 65, 0, 0, 0,120, 8,195, 71, 80, 0, 0, 0, 58, 0, 0, 0, 5, 65, 6,116, 0,
- 63,127,255,254, 39,228,117, 42, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 65, 6,116, 0,191,127,255,254,167,177, 59, 43,
- 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0,193, 6,116, 0,191,127,255,250,167,228,117, 39, 0, 0, 0, 0,127,255, 3,255,
- 0, 0, 0, 0,193, 6,115,252, 63,128, 0, 1, 39,177, 59, 49, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 59,110,239, 0,
- 60, 26,164,131,189, 14, 92,235, 12,228, 33, 95,133, 28, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 71,240,
- 0, 0, 1, 42, 0, 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, 68, 65, 84, 65,120, 0, 0, 0,224,165,186, 3, 58, 0, 0, 0, 5, 0, 0, 0, 0,116, 6, 65,
+254,255,127, 63, 42,117,228, 39, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 0,116, 6, 65,254,255,127,191, 43, 59,177,167,
+ 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 0,116, 6,193,250,255,127,191, 39,117,228,167, 0, 0, 0, 0,255,127,255, 0,
+ 3, 0, 0, 0,252,115, 6,193, 1, 0,128, 63, 49, 59,177, 39, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 0,239,110, 59,
+131,164, 26, 60,235, 92, 14,189,228, 12, 95, 33, 28,133,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,136,166,186, 3,
+ 58, 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, 8,195, 73,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, 16,168,186, 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,
@@ -16090,37 +16385,37 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 0, 48, 8,195, 73,112, 0, 0, 0, 55, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 73,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 0, 0, 0, 16,168,186, 3, 55, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,112,168,186, 3, 58, 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, 86, 84,101,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, 8,195, 75, 80, 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,248,169,186, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 75,144, 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, 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, 8,195, 75,240,
+ 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,186, 3, 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,176,163,159, 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, 68, 65, 84, 65, 0, 0, 0, 20, 8,195, 75, 80, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 0, 44, 8,195, 75,144, 0, 0, 0, 65,
- 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 16, 8,195, 75,240, 0, 0, 0, 59,
- 0, 0, 0, 4,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 76, 48,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 87, 96, 8,195, 68, 96, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
-119, 46, 48, 48, 51, 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, 8,195, 77,112, 8,195, 84, 0, 8,195, 84,224, 0, 0, 0, 0,
- 3,163,158, 32, 8,195, 80,160, 0, 0, 0, 0, 8,195, 86,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 77,160,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 79, 32, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 82,128, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0,179,128, 0, 0,
- 52, 64, 0, 0, 28,192, 0, 0, 63,128, 0, 0, 63,128, 0, 2, 55, 39,197,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 77,112, 0, 0, 0, 0, 0, 0, 0, 1, 3,161,102, 32, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 77,160, 0, 0, 1, 42, 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, 68, 65, 84, 65, 20, 0, 0, 0,248,169,186, 3, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 44, 0, 0, 0, 64,170,186, 3, 65, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,176,163,159, 3, 59, 0, 0, 0,
+ 4, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,160,170,186, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0,144,185,186, 3,216,162,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
+119, 46, 48, 48, 51, 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,232,171,186, 3, 40,182,186, 3, 16,183,186, 3, 0, 0, 0, 0,
+168,173,186, 3,192,178,186, 3, 0, 0, 0, 0,208,184,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32,172,186, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,177,186, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,180,186, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128,179, 0, 0, 64, 52, 0, 0,192, 28, 0, 0,128, 63, 2, 0,128, 63,172,197, 39, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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,232,171,186, 3, 0, 0, 0, 0, 1, 0, 0, 0,200, 78,181, 3, 68, 65, 84, 65, 84, 1, 0, 0,
+ 32,172,186, 3, 58, 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, 3,163,158, 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,168,173,186, 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,
@@ -16129,37 +16424,37 @@ char datatoc_preview_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, 0, 0, 3, 96, 3,163,158, 32, 0, 0, 0, 58, 0, 0, 0, 36, 63,128, 0, 0, 63,127,255,255, 39,251,255,255,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 63,128, 0, 0,191,128, 0, 0,168, 2, 0, 0, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,191,128, 0, 1,191,127,255,253,167,251,255,253, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,191,127,255,250,
- 63,128, 0, 3, 40, 2, 0, 3, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 63,250,113, 63,128, 3, 7, 48,113,201, 79,
- 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0, 64, 63,250,114,191,127,249,242, 48,113,200,107, 0, 0, 0, 0,128, 1, 2,255,
- 0, 0, 0, 0, 63,127,233,206,191,127,249,245, 48,113,200, 95, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0, 63,127,233,206,
- 63,128, 3, 3, 48,113,201, 63, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,192, 63,235,185, 63,128, 9,197, 51,171, 82,138,
- 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,192, 63,235,185,191,127,236,113, 51,171, 82,137, 0, 0, 0, 0,128, 1, 2,255,
- 0, 0, 0, 0,191,127,174,232,191,127,236,110, 51,171, 82,137, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,191,127,174,236,
- 63,128, 9,201, 51,171, 82,138, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,192,159,242,181, 63,128, 15, 32, 43, 41,196,175,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,159,242,182,191,127,225,194, 43, 37,196,175, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,192, 63,229,108,191,127,225,197, 43, 37,180,175, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192, 63,229,108,
- 63,128, 15, 29, 43, 41,180,175, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,159,253,112, 63,128, 18,242, 51, 18,138, 85,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64,159,253,112,191,127,218, 27, 51, 18,138, 81, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0, 64, 63,250,223,191,127,218, 24, 51, 18,138, 81, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0, 64, 63,250,225,
- 63,128, 18,245, 51, 18,138, 85, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,223,236,178, 63,128, 14, 32,175,216,158, 81,
- 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,223,236,178,191,127,227,192,175,216,160, 81, 0, 0, 0, 0,127,255, 2,255,
- 0, 0, 0, 0,193, 15,246, 89,191,127,227,188,175,216,160, 73, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,193, 15,246, 89,
- 63,128, 14, 35,175,216,158, 73, 0, 0, 0, 0,127,255, 2,255, 0, 0, 0, 0,192,159,239,217, 63,128, 8,204, 51,170,121,151,
- 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,192,159,239,217,191,127,238,104, 51,170,121,150, 0, 0, 0, 0,128, 1, 2,255,
- 0, 0, 0, 0,192,223,239,217,191,127,238,108, 51,170,121,150, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0,192,223,239,217,
- 63,128, 8,200, 51,170,121,151, 0, 0, 0, 0,128, 1, 2,255, 0, 0, 0, 0, 64,223,247,233, 63,128, 24,219,180,155,136, 78,
- 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 64,223,247,233,191,127,206, 76,180,155,136, 79, 0, 0, 0, 0,127,255, 3,255,
- 0, 0, 0, 0, 65, 15,251,245,191,127,206, 80,180,155,136, 79, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 65, 15,251,245,
- 63,128, 24,216,180,155,136, 78, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 64,159,247,179, 63,128, 8,233,180,173, 96,180,
- 0, 0, 0, 0,128, 1, 3,255, 0, 0, 0, 0, 64,159,247,179,191,127,238, 42,180,173, 96,181, 0, 0, 0, 0,128, 1, 3,255,
- 0, 0, 0, 0, 64,223,247,178,191,127,238, 38,180,173, 96,181, 0, 0, 0, 0,128, 1, 3,255, 0, 0, 0, 0, 64,223,247,177,
- 63,128, 8,237,180,173, 96,180, 0, 0, 0, 0,128, 1, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 79, 32,
- 0, 0, 1, 42, 0, 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,
+ 68, 65, 84, 65, 96, 3, 0, 0,168,173,186, 3, 58, 0, 0, 0, 36, 0, 0, 0, 0, 0,128, 63,255,255,127, 63,255,255,251, 39,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0, 2,168, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 1, 0,128,191,253,255,127,191,253,255,251,167, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,250,255,127,191,
+ 3, 0,128, 63, 3, 0, 2, 40, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,113,250, 63, 64, 7, 3,128, 63, 79,201,113, 48,
+ 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,114,250, 63, 64,242,249,127,191,107,200,113, 48, 0, 0, 0, 0, 1,128,255, 0,
+ 2, 0, 0, 0,206,233,127, 63,245,249,127,191, 95,200,113, 48, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,206,233,127, 63,
+ 3, 3,128, 63, 63,201,113, 48, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,185,235, 63,192,197, 9,128, 63,138, 82,171, 51,
+ 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,185,235, 63,192,113,236,127,191,137, 82,171, 51, 0, 0, 0, 0, 1,128,255, 0,
+ 2, 0, 0, 0,232,174,127,191,110,236,127,191,137, 82,171, 51, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,236,174,127,191,
+201, 9,128, 63,138, 82,171, 51, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,181,242,159,192, 32, 15,128, 63,175,196, 41, 43,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,182,242,159,192,194,225,127,191,175,196, 37, 43, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,108,229, 63,192,197,225,127,191,175,180, 37, 43, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,108,229, 63,192,
+ 29, 15,128, 63,175,180, 41, 43, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,112,253,159, 64,242, 18,128, 63, 85,138, 18, 51,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,112,253,159, 64, 27,218,127,191, 81,138, 18, 51, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0,223,250, 63, 64, 24,218,127,191, 81,138, 18, 51, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,225,250, 63, 64,
+245, 18,128, 63, 85,138, 18, 51, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,178,236,223,192, 32, 14,128, 63, 81,158,216,175,
+ 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,178,236,223,192,192,227,127,191, 81,160,216,175, 0, 0, 0, 0,255,127,255, 0,
+ 2, 0, 0, 0, 89,246, 15,193,188,227,127,191, 73,160,216,175, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0, 89,246, 15,193,
+ 35, 14,128, 63, 73,158,216,175, 0, 0, 0, 0,255,127,255, 0, 2, 0, 0, 0,217,239,159,192,204, 8,128, 63,151,121,170, 51,
+ 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,217,239,159,192,104,238,127,191,150,121,170, 51, 0, 0, 0, 0, 1,128,255, 0,
+ 2, 0, 0, 0,217,239,223,192,108,238,127,191,150,121,170, 51, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,217,239,223,192,
+200, 8,128, 63,151,121,170, 51, 0, 0, 0, 0, 1,128,255, 0, 2, 0, 0, 0,233,247,223, 64,219, 24,128, 63, 78,136,155,180,
+ 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0,233,247,223, 64, 76,206,127,191, 79,136,155,180, 0, 0, 0, 0,255,127,255, 0,
+ 3, 0, 0, 0,245,251, 15, 65, 80,206,127,191, 79,136,155,180, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0,245,251, 15, 65,
+216, 24,128, 63, 78,136,155,180, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0,179,247,159, 64,233, 8,128, 63,180, 96,173,180,
+ 0, 0, 0, 0, 1,128,255, 0, 3, 0, 0, 0,179,247,159, 64, 42,238,127,191,181, 96,173,180, 0, 0, 0, 0, 1,128,255, 0,
+ 3, 0, 0, 0,178,247,223, 64, 38,238,127,191,181, 96,173,180, 0, 0, 0, 0, 1,128,255, 0, 3, 0, 0, 0,177,247,223, 64,
+237, 8,128, 63,180, 96,173,180, 0, 0, 0, 0, 1,128,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 56,177,186, 3,
+ 58, 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, 8,195, 80,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192,178,186, 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,
@@ -16168,69 +16463,69 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 1,176, 8,195, 80,160, 0, 0, 0, 55, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 8,
- 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15,
- 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 16,
- 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 23,
- 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24,
- 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 34,
- 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0, 28, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0, 30,
- 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 35, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 82,128, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+176, 1, 0, 0,192,178,186, 3, 55, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 23, 0, 0, 0,
+ 0, 0, 34, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0,
+ 27, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0,
+ 29, 0, 0, 0, 28, 0, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0, 28, 0, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0, 30, 0, 0, 0,
+ 0, 0, 35, 0, 29, 0, 0, 0, 30, 0, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0, 33, 0, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0, 32, 0, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 35, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0,160,180,186, 3, 58, 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, 86, 84,101,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, 8,195, 84, 0, 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, 40,182,186, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 84,224, 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, 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, 8,195, 86,160,
+ 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,183,186, 3, 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,208,184,186, 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, 68, 65, 84, 65, 0, 0, 0,180, 8,195, 84, 0, 0, 0, 0, 54, 0, 0, 0, 9, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6,
- 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 23, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 24, 0, 0, 0, 25,
- 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 2, 0, 0, 0, 32,
- 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1,140, 8,195, 84,224, 0, 0, 0, 65,
- 0, 0, 0, 9, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,144, 8,195, 86,160, 0, 0, 0, 59,
- 0, 0, 0, 36,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,180, 0, 0, 0, 40,182,186, 3, 54, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 23, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0,
+ 35, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65,140, 1, 0, 0, 16,183,186, 3, 65, 0, 0, 0,
+ 9, 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, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 1, 0, 3, 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, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 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, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,208,184,186, 3, 59, 0, 0, 0,
+ 36, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 87, 96,
- 0, 0, 0, 52, 0, 0, 0, 1, 8,195, 95, 32, 8,195, 76, 48, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
-119, 46, 48, 48, 52, 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, 8,195, 88,160, 8,195, 94, 64, 8,195, 94,128, 0, 0, 0, 0,
- 8,195, 90, 80, 8,195, 92, 96, 0, 0, 0, 0, 8,195, 94,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 88,208,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 90,224, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 92,192, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0,
- 52, 64, 0, 0, 28,192, 0, 0, 63,128, 0, 0, 63,128, 0, 2, 55, 39,197,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 88,160, 0, 0, 0, 0, 0, 0, 0, 1, 3,161,110, 32, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 88,208, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0,144,185,186, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0, 64,193,186, 3,160,170,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
+119, 46, 48, 48, 52, 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,216,186,186, 3,152,192,186, 3,224,192,186, 3, 0, 0, 0, 0,
+152,188,186, 3,176,190,186, 3, 0, 0, 0, 0,136,201,163, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16,187,186, 3, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,189,186, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,191,186, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0,128,179, 0, 0, 64, 52, 0, 0,192, 28, 0, 0,128, 63, 2, 0,128, 63,172,197, 39, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 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,216,186,186, 3, 0, 0, 0, 0, 1, 0, 0, 0,168, 85,181, 3, 68, 65, 84, 65, 84, 1, 0, 0,
+ 16,187,186, 3, 58, 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, 8,195, 90, 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,152,188,186, 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,
@@ -16239,13 +16534,13 @@ char datatoc_preview_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, 0, 0, 0, 96, 8,195, 90, 80, 0, 0, 0, 58, 0, 0, 0, 4, 64,175, 49, 50, 63,127,255,255, 51,152,159, 28,
- 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 64,175, 49, 50,191,128, 0, 0,179,152,159, 33, 0, 0, 0, 0,127,255, 3,255,
- 0, 0, 0, 0,192,175, 49, 50,191,127,255,252,179,152,159, 31, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0,192,175, 49, 45,
- 63,128, 0, 4, 51,152,159, 33, 0, 0, 0, 0,127,255, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 90,224,
- 0, 0, 1, 42, 0, 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,
+ 68, 65, 84, 65, 96, 0, 0, 0,152,188,186, 3, 58, 0, 0, 0, 4, 0, 0, 0, 50, 49,175, 64,255,255,127, 63, 28,159,152, 51,
+ 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 50, 49,175, 64, 0, 0,128,191, 33,159,152,179, 0, 0, 0, 0,255,127,255, 0,
+ 3, 0, 0, 0, 50, 49,175,192,252,255,127,191, 31,159,152,179, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 45, 49,175,192,
+ 4, 0,128, 63, 33,159,152, 51, 0, 0, 0, 0,255,127,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 40,189,186, 3,
+ 58, 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, 8,195, 92, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,176,190,186, 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,
@@ -16254,37 +16549,37 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 0, 48, 8,195, 92, 96, 0, 0, 0, 55, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 92,192, 0, 0, 1, 42, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 0, 0, 0,176,190,186, 3, 55, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0,
+ 68, 65, 84, 65, 84, 1, 0, 0, 16,191,186, 3, 58, 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, 86, 84,101,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, 8,195, 94, 64, 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,152,192,186, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195, 94,128, 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, 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, 8,195, 94,224,
+ 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,192,186, 3, 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,136,201,163, 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, 68, 65, 84, 65, 0, 0, 0, 20, 8,195, 94, 64, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 0, 44, 8,195, 94,128, 0, 0, 0, 65,
- 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 16, 8,195, 94,224, 0, 0, 0, 59,
- 0, 0, 0, 4,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 77, 69, 0, 0, 1, 24, 8,195, 95, 32,
- 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 8,195, 87, 96, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 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, 8,195, 96, 96, 8,195,102,192, 8,195,103, 96, 0, 0, 0, 0,
- 8,195, 98, 16, 8,195,100,128, 0, 0, 0, 0, 8,195,104,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 96,144,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 8,195, 99, 0, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 8,195,101, 64, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 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, 51,128, 0, 0,
-180, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 4, 63,128, 0, 4, 63,128, 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, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 8,195, 96, 96, 0, 0, 0, 0, 0, 0, 0, 1, 3,161, 94, 32, 68, 65, 84, 65, 0, 0, 1, 84,
- 8,195, 96,144, 0, 0, 1, 42, 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, 68, 65, 84, 65, 20, 0, 0, 0,152,192,186, 3, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 44, 0, 0, 0,224,192,186, 3, 65, 0, 0, 0,
+ 1, 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, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,136,201,163, 3, 59, 0, 0, 0,
+ 4, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0, 24, 1, 0, 0, 64,193,186, 3,
+ 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,185,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 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,136,194,186, 3, 8,201,186, 3,176,201,186, 3, 0, 0, 0, 0,
+ 72,196,186, 3,192,198,186, 3, 0, 0, 0, 0,232,202,186, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+192,194,186, 3, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,197,186, 3, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,199,186, 3, 3, 0, 0, 0, 5, 0, 0, 0, 80, 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, 4, 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,136,194,186, 3, 0, 0, 0, 0, 1, 0, 0, 0,232, 71,181, 3, 68, 65, 84, 65, 84, 1, 0, 0,
+192,194,186, 3, 58, 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, 8,195, 98, 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, 72,196,186, 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,
@@ -16293,16 +16588,16 @@ char datatoc_preview_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, 0, 0, 0,192, 8,195, 98, 16, 0, 0, 0, 58, 0, 0, 0, 8, 63,128, 0, 0, 63,127,255,255,191,128, 0, 0,
- 73,230, 73,230,182, 26, 3,255, 0, 0, 0, 0, 63,128, 0, 0,191,128, 0, 0,191,128, 0, 0, 73,230,182, 26,182, 26, 3,255,
- 0, 0, 0, 0,191,128, 0, 1,191,127,255,253,191,128, 0, 0,182, 26,182, 26,182, 26, 3,255, 0, 0, 0, 0,191,127,255,250,
- 63,128, 0, 3,191,128, 0, 0,182, 26, 73,230,182, 26, 3,255, 0, 0, 0, 0, 63,128, 0, 4, 63,127,255,247, 63,128, 0, 0,
- 73,230, 73,230, 73,230, 3,255, 0, 0, 0, 0, 63,127,255,245,191,128, 0, 5, 63,128, 0, 0, 73,230,182, 26, 73,230, 3,255,
- 0, 0, 0, 0,191,128, 0, 3,191,127,255,250, 63,128, 0, 0,182, 26,182, 26, 73,230, 3,255, 0, 0, 0, 0,191,127,255,255,
- 63,128, 0, 0, 63,128, 0, 0,182, 26, 73,230, 73,230, 3,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 84, 8,195, 99, 0,
- 0, 0, 1, 42, 0, 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,
+ 68, 65, 84, 65,192, 0, 0, 0, 72,196,186, 3, 58, 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, 0, 3, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255, 0,
+ 3, 0, 0, 0, 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255, 0, 3, 0, 0, 0,250,255,127,191,
+ 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182,255, 0, 3, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,
+230, 73,230, 73,230, 73,255, 0, 3, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255, 0,
+ 3, 0, 0, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255, 0, 3, 0, 0, 0,255,255,127,191,
+ 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, 56,197,186, 3,
+ 58, 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, 8,195,100,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192,198,186, 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,
@@ -16311,660 +16606,697 @@ char datatoc_preview_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, 68, 65, 84, 65,
- 0, 0, 0,144, 8,195,100,128, 0, 0, 0, 55, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35,
- 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7,
- 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 84, 8,195,101, 64, 0, 0, 1, 42, 0, 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, 8,195,102,192, 0, 0, 0, 5, 0, 0, 0, 20,
+144, 0, 0, 0,192,198,186, 3, 55, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0,
+ 4, 0, 0, 0, 5, 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, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,
+ 4, 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,
+ 68, 65, 84, 65, 84, 1, 0, 0,128,199,186, 3, 58, 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, 8,201,186, 3, 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, 0, 0, 0, 0, 85, 86, 84,101,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, 8,195,103, 96, 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, 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, 8,195,104,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,201,186, 3, 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,232,202,186, 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, 68, 65, 84, 65, 0, 0, 0,120, 8,195,102,192, 0, 0, 0, 54, 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 5,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 2,
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 1, 8, 8,195,103, 96,
- 0, 0, 0, 65, 0, 0, 0, 6, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 8,195,104,144, 0, 0, 0, 59,
- 0, 0, 0, 24,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0, 8,201,186, 3, 54, 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, 68, 65, 84, 65, 8, 1, 0, 0,176,201,186, 3,
+ 65, 0, 0, 0, 6, 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, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,232,202,186, 3, 59, 0, 0, 0,
+ 24, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 0, 0, 80, 65, 0, 0, 1,224, 3,163,162, 32, 0, 0, 1, 48, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255, 80, 65, 0, 0,244, 1, 0, 0,120,203,186, 3, 65, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 80, 65, 80, 83,121,115, 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, 18, 0, 2, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
- 0, 6, 0, 0, 0, 0, 0, 4, 0, 6, 0, 8, 0, 5, 0, 5, 0, 3, 0,100, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2,
- 0, 4, 0, 5, 0, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128,
- 63,128, 0, 0, 61,204,204,205, 63, 76,204,205, 63,128, 0, 0, 66,200, 0, 0, 66, 72, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 10, 63,182, 41,128,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,189, 35,214,240, 0, 0, 0, 0,
-189,196,155,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 76,204,205, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 63,128, 0, 0,
- 62, 76,204,205, 62,153,153,154, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 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, 68, 78, 65, 49, 0, 0,173,128,
- 7,223,224, 32, 0, 0, 0, 0, 0, 0, 0, 1, 83, 68, 78, 65, 78, 65, 77, 69, 0, 0, 9,113, 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,
-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,110, 97,109,101, 91, 51, 50, 93, 0,116,121,112,101, 0,115,117, 98,116,121,112,101,
- 0,102,108, 97,103, 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,
-101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,
-114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,
-110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0,
- 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0,112, 97,100,
- 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,
-114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116,
- 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114,
- 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,
-120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,
-101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,
-112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,
-105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93,
- 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,
-121, 0,115,108,117,114,112,104, 0, 42, 42,115, 99,114,105,112,116,115, 0, 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,
-112,116, 0,116,111,116,115, 99,114,105,112,116, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,
-108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,
-112, 97,100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0,
- 42,115,101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,
-102, 0,117,110,100,111, 95,112,111,115, 0,117,110,100,111, 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, 97,110,103,
-108,101, 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, 89, 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95,
- 98,107,104, 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,116, 0,115, 99,114,105,112,116,108,105,110,107, 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,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 2, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 8, 0, 5, 0, 5, 0, 3, 0,100, 0,
+ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 4, 0, 5, 0, 3, 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,128, 7, 0, 0,128, 63,205,204,204, 61,205,204, 76, 63, 0, 0,128, 63, 0, 0,200, 66,
+ 0, 0, 72, 66, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+128, 41,182, 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, 0, 0, 0, 0,128, 63,240,214, 35,189,
+ 0, 0, 0, 0,184,155,196,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204, 76, 62, 0, 0, 0, 64, 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, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,205,204, 76, 62,154,153,153, 62, 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, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 1, 2, 3, 4, 5, 6, 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, 68, 78, 65, 49,204,208, 0, 0, 32, 77,162, 3, 0, 0, 0, 0, 1, 0, 0, 0,
+ 83, 68, 78, 65, 78, 65, 77, 69, 59, 10, 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,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,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,
+109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100,
+ 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,
+108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93,
+ 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116,
+ 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49,
+ 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,
+121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,
+107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,
+105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,
+111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,
+115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120,
+ 0, 42, 97,100,116, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,
+122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,
+104, 0, 42, 42,115, 99,114,105,112,116,115, 0, 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,112,116, 0,116,111,116,115,
+ 99,114,105,112,116, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,
+115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0,
+ 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,
+117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,
+112,111,115, 0,117,110,100,111, 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, 97,110,103,108,101, 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, 89,
+ 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115,
+ 0, 89, 70, 95, 98,107,104,114,111,116, 0,115, 99,114,105,112,116,108,105,110,107, 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,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, 42,118,110,111,100,101, 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,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,112, 97,100, 91, 50, 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,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119,
- 97,114,112,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,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,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,120,114,101,112,101,
- 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 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, 99,111, 98,
- 97, 0, 42,101,110,118, 0,117,115,101, 95,110,111,100,101,115, 0,112, 97,100, 91, 55, 93, 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,112, 97,
-100, 51, 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,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,
-115, 0,115,111,102,116, 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, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,115, 0, 89, 70, 95,110,117,109,
-115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,113,109, 99, 0, 89, 70, 95, 98,
-117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99, 98,108,117,114, 0, 89, 70, 95,
-108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,108,111,119,111,102,115, 0, 89,
- 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120, 91, 49, 56, 93, 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,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,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, 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101,
- 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,100,115,109,112, 0, 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,
-105,116, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99, 97,108,101, 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, 42,109,
- 97,116, 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,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,
-115, 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, 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,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,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,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,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,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, 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, 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,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,101,100,103,101, 95, 98,111,117,110,100, 97,114,
-121, 95,115,116, 97,116,101,115, 0, 42,118,101,114,116, 95,101,100,103,101, 95,109, 97,112, 0, 42,118,101,114,116, 95,102, 97,
- 99,101, 95,109, 97,112, 0, 42,109, 97,112, 95,109,101,109, 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, 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,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,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,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, 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, 97, 98,115,111,114,112,116,105,111,110, 0,116,105,109,101,
- 0, 42, 98,118,104,116,114,101,101, 0, 42,100,109, 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,110,101,101,100, 98,105,110,100, 0, 42, 98,
-105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 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,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,115,121,115, 0,114,116, 91, 50, 93, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101,
- 99,116, 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,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,118,101, 99, 91, 56, 93, 91, 51, 93, 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, 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,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,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,105,112,111,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,112,114,111,116,101, 99,116,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, 99,116,105,109,101,
- 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,115,105,122,101,102, 97, 99, 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,100,116, 0,100,116,120, 0, 97, 99,116, 99,111,108, 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,112,
-100, 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, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,116, 0,102,111,
-114, 99,101,102,105,101,108,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,102,
- 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, 97,109,112, 0,
-109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,102, 95,
-112,111,119,101,114, 95,114, 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,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,
-107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 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,
-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, 42,112, 97,114,116,105, 99,108,101,115, 0,116,111,116,112,111,105,110,116, 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,110,111,100,101,109, 97,115,115, 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,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,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,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,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,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,
-101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 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,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,104,101,109,105,114,101,115, 0,109, 97,120,105,116,101,114, 0,100,114, 97,119,116,121,112,101, 0,115,117,
- 98,115,104,111,111,116,112, 0,115,117, 98,115,104,111,111,116,101, 0,110,111,100,101,108,105,109, 0,109, 97,120,115,117, 98,
-108, 97,109,112, 0,112, 97,109, 97, 0,112, 97,109,105, 0,101,108,109, 97, 0,101,108,109,105, 0,109, 97,120,110,111,100,101,
- 0, 99,111,110,118,101,114,103,101,110, 99,101, 0,114, 97,100,102, 97, 99, 0,103, 97,109,109, 97, 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,
- 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,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, 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,102,102, 99,111,
-100,101, 99,100, 97,116, 97, 0, 99,102,114, 97, 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, 49, 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,114,112, 97,100, 0,114,112, 97,100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,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,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,112,111,115,116,109,117,108, 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, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0,
- 71, 73,109,101,116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65,
- 65, 0, 89, 70,101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,
-114,103, 98, 0,121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,112,116,104, 0, 71,
- 73,112,105,120,101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,117,110,116, 0, 71,
- 73,109,105,120,112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0, 89, 70, 95,114, 97,
-121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,112,108,101,115, 0,
-121,102,112, 97,100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,102,105,110,101,109,
-101,110,116, 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70, 95,103, 97,109,109,
- 97, 0, 89, 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,
-120,101,108,115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,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,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,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, 99,111,108, 91, 51, 93, 0,102,114, 97,109,101, 0,110, 97,109,101, 91, 54, 52, 93, 0, 42, 98,114,117,115,104, 0,116,111,
-111,108, 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,116,101,112, 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,100,114, 97,119, 95,116,105,
-109,101,100, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 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,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, 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,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,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,112, 97,100, 51, 91, 50, 93, 0,100,105,114, 0,118,105,101,119, 0, 42,115,101,115,
-115,105,111,110, 0, 42, 99,117,109, 97,112, 0,100,114, 97,119, 98,114,117,115,104, 0,115,109,111,111,116,104, 98,114,117,115,
-104, 0,112,105,110, 99,104, 98,114,117,115,104, 0,105,110,102,108, 97,116,101, 98,114,117,115,104, 0,103,114, 97, 98, 98,114,
-117,115,104, 0,108, 97,121,101,114, 98,114,117,115,104, 0,102,108, 97,116,116,101,110, 98,114,117,115,104, 0,112,105,118,111,
-116, 91, 51, 93, 0, 98,114,117,115,104, 95,116,121,112,101, 0,116,101,120,110,114, 0,116,101,120,114,101,112,116, 0,116,101,
-120,102, 97,100,101, 0,116,101,120,115,101,112, 0, 97,118,101,114, 97,103,105,110,103, 0,116, 97, 98,108,101,116, 95,115,105,
-122,101, 0,116, 97, 98,108,101,116, 95,115,116,114,101,110,103,116,104, 0,115,121,109,109, 0,114, 97,107,101, 0, 97,120,105,
-115,108,111, 99,107, 0, 42, 99, 97,109,101,114, 97, 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, 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,101,100,105,116, 98,117,116,115,105,122,101, 0,115,101,108,101, 99,116,109,
-111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0, 97,117,116,111,109,
-101,114,103,101, 0,112, 97,100, 53, 0,112, 97,100, 54, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 42,101,100, 0,
- 42,114, 97,100,105,111, 0,102,114, 97,109,105,110,103, 0, 42,116,111,111,108,115,101,116,116,105,110,103,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,106,117,109,112,102,114, 97,109,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, 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,115, 99,117,108,112,116,
-100, 97,116, 97, 0,102,114, 97,109,101, 95,115,116,101,112, 0,122,111,111,109, 0, 98,108,101,110,100, 0,120,105,109, 0,121,
-105,109, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 42, 97,114,101, 97, 0, 98,108,
-111, 99,107,104, 97,110,100,108,101,114, 91, 56, 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,119,105,110,109, 97,116, 49, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 49, 91, 52, 93, 91,
- 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0,108, 97,121, 95,117,115,101,100, 0,112,101,114,
-115,112, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 42, 98,103,112,105, 99, 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,111, 98, 95, 99,
-101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,108,111, 99, 97,108,118,105,101,119, 0,108, 97,121, 97, 99,116, 0,
-115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0, 99, 97,109,122,111,111,109, 0,112,105,118,111,116, 95,108,
- 97,115,116, 0,103,114,105,100, 0,103,114,105,100,118,105,101,119, 0,112,105,120,115,105,122,101, 0,110,101, 97,114, 0,102,
- 97,114, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,103,114,105,100,108,105,110,101,115, 0,118,105,101,119, 98,117,116,
- 0,103,114,105,100,102,108, 97,103, 0,109,111,100,101,115,101,108,101, 99,116, 0,116,119,116,121,112,101, 0,116,119,109,111,
-100,101, 0,116,119,102,108, 97,103, 0,116,119,100,114, 97,119,102,108, 97,103, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93,
- 0, 99,108,105,112, 91, 52, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 97,102,116,101,114,100,114, 97,119, 0,122, 98,
-117,102, 0,120,114, 97,121, 0,102,108, 97,103, 50, 0,103,114,105,100,115,117, 98,100,105,118, 0,107,101,121,102,108, 97,103,
-115, 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, 42,103,112,100, 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,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,107,101,101,112,
-116,111,116, 0,107,101,101,112, 97,115,112,101, 99,116, 0,107,101,101,112,122,111,111,109, 0,111,108,100,119,105,110,120, 0,
-111,108,100,119,105,110,121, 0, 99,117,114,115,111,114, 91, 50, 93, 0,114,111,119, 98,117,116, 0,118, 50,100, 0, 42,101,100,
-105,116,105,112,111, 0,105,112,111,107,101,121, 0, 97, 99,116,110, 97,109,101, 91, 51, 50, 93, 0, 99,111,110,115,116,110, 97,
-109,101, 91, 51, 50, 93, 0, 98,111,110,101,110, 97,109,101, 91, 51, 50, 93, 0,116,111,116,105,112,111, 0,112,105,110, 0, 98,
-117,116,111,102,115, 0, 99,104, 97,110,110,101,108, 0,108,111, 99,107, 0,109,101,100,105, 97,110, 91, 51, 93, 0, 99,117,114,
-115,101,110,115, 0, 99,117,114, 97, 99,116, 0, 97,108,105,103,110, 0,116, 97, 98,111, 0,109, 97,105,110, 98, 0,109, 97,105,
-110, 98,111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,102,114,111,109, 0,115,104,111,119,103,114,111,117,112, 0,
-109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,108,111, 99,107, 0,114,101, 95, 97,108,105,103,110, 0,111,
-108,100,107,101,121,112,114,101,115,115, 0,116, 97, 98, 91, 55, 93, 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, 42,102,105,108,101,108,105,115,116, 0,116,111,116,102,105,108,101, 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,111,102,115, 0,
-115,111,114,116, 0,109, 97,120,110, 97,109,101,108,101,110, 0, 99,111,108,108,117,109,115, 0,102, 95,102,112, 0,102,112, 95,
-115,116,114, 91, 56, 93, 0, 42,108,105, 98,102,105,108,101,100, 97,116, 97, 0,114,101,116,118, 97,108, 0,109,101,110,117, 0,
- 97, 99,116, 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,111,111,112,115, 0,
-118,105,115,105,102,108, 97,103, 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,100,101,112,115,
- 95,102,108, 97,103,115, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,114, 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,112, 97,100, 91, 53, 93, 0, 99,
-101,110,116,120, 0, 99,101,110,116,121, 0, 97,117,116,111,115,110, 97,112, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,
-101,119,108,105,110,101,115, 0,102,111,110,116, 95,105,100, 0,108,104,101,105,103,104,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, 99,117,114,114,116, 97, 98, 95,115,101,116, 0,115,
-104,111,119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,101, 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, 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,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, 42,101,100,
-105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0, 42,102,105,108,101,115, 0, 97, 99,116,105,118,101, 95,102,105,
-108,101, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,116,105,108,101,115,121, 0,115,101,108,115,116, 97,116,101, 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, 97, 99,116,105,118,101, 95, 98,
-111,111,107,109, 97,114,107, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 42,105,109,103, 0,111,117,116,108,105,110,101,
- 91, 52, 93, 0,110,101,117,116,114, 97,108, 91, 52, 93, 0, 97, 99,116,105,111,110, 91, 52, 93, 0,115,101,116,116,105,110,103,
- 91, 52, 93, 0,115,101,116,116,105,110,103, 49, 91, 52, 93, 0,115,101,116,116,105,110,103, 50, 91, 52, 93, 0,110,117,109, 91,
- 52, 93, 0,116,101,120,116,102,105,101,108,100, 91, 52, 93, 0,116,101,120,116,102,105,101,108,100, 95,104,105, 91, 52, 93, 0,
-112,111,112,117,112, 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,109,101,110,117,
- 95, 98, 97, 99,107, 91, 52, 93, 0,109,101,110,117, 95,105,116,101,109, 91, 52, 93, 0,109,101,110,117, 95,104,105,108,105,116,
-101, 91, 52, 93, 0,109,101,110,117, 95,116,101,120,116, 91, 52, 93, 0,109,101,110,117, 95,116,101,120,116, 95,104,105, 91, 52,
- 93, 0, 98,117,116, 95,100,114, 97,119,116,121,112,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107,
- 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,112, 97,110,101,108, 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,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, 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,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,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, 97,114,109, 91, 50, 48, 93, 0, 98,112, 97,100, 91, 52, 93, 0, 98,112,
- 97,100, 49, 91, 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,121,102,101,120,112,111,114,116,100,105,114, 91,
- 49, 54, 48, 93, 0,118,101,114,115,105,111,110,115, 0,118,114,109,108,102,108, 97,103, 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, 99,111,110,115,111,108,101, 95, 98,117,102,102,101,
-114, 0, 99,111,110,115,111,108,101, 95,111,117,116, 0,109,105,120, 98,117,102,115,105,122,101, 0,102,111,110,116,115,105,122,
-101, 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,102,111,110,116,110, 97,109,101, 91, 50, 53, 54, 93,
- 0,116,104,101,109,101,115, 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,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,112, 97,100, 91, 56, 93,
- 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, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0, 99,111, 98, 97, 95,119,
-101,105,103,104,116, 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,115, 99,101,110,101, 0,101,110,100,120, 0,101,110,100,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,115, 99,
-101,110,101,110,114, 0,115, 99,114,101,101,110,110,114, 0,102,117,108,108, 0,109, 97,105,110,119,105,110, 0,119,105,110, 97,
-107,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,
-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, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,111,108,
-100, 95,111,102,115,120, 0,111,108,100, 95,111,102,115,121, 0,115,111,114,116, 99,111,117,110,116,101,114, 0, 42,112, 97,110,
-101,108,116, 97, 98, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93,
- 0,104,101, 97,100,114, 99,116, 0,119,105,110,114, 99,116, 0,104,101, 97,100,119,105,110, 0,119,105,110, 0,104,101, 97,100,
-101,114,116,121,112,101, 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,119,105,110,120, 0,119,105,110,121, 0,104,101,
- 97,100, 95,115,119, 97,112, 0,104,101, 97,100, 95,101,113,117, 97,108, 0,119,105,110, 95,115,119, 97,112, 0,119,105,110, 95,
-101,113,117, 97,108, 0,104,101, 97,100, 98,117,116,108,101,110, 0,104,101, 97,100, 98,117,116,111,102,115, 0, 99,117,114,115,
-111,114, 0,115,112, 97, 99,101,100, 97,116, 97, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 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,100,105,115,112,108, 97,121,109,111,100,101, 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,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,
-115, 97,116,117,114, 97,116,105,111,110, 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,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,102, 97, 99,102, 48, 0,102, 97, 99,102,
- 49, 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,111,117,
-110,100, 0, 42,104,100, 97,117,100,105,111, 0,108,101,118,101,108, 0,112, 97,110, 0, 99,117,114,112,111,115, 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,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, 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,100,120, 0,100,121, 0,108,105,110,107, 0,111,116,121,112,
-101, 0,111,108,100, 0, 42,112,111,105,110, 0, 42,111,108,100,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, 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,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,109,111,100,117,108,101,
- 91, 54, 52, 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,115,110,100,110,
-114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, 99,111,112,121,109, 97,100,101, 0,112, 97,100, 50,
- 91, 49, 93, 0,116,114, 97, 99,107, 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, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,109,105,110, 0,109, 97,
-120, 0,118,105,115,105,102, 97, 99, 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,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,103,111, 0, 97, 99, 99,101,108,108,101,114, 97,116,105,111,110,
- 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100, 0,109, 97,120,116,105,108,116,115,112,101,
-101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,112, 0, 42,115, 97,109,112,108,101, 0, 42,115,
-116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 42,115,110,100, 95,115,111,117,110,100, 0,
-112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,112,105,116, 99,104, 0,109,105,110, 95,103, 97,
-105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99,101, 0,115,116,114,101, 97,109,108,101,110, 0, 99,
-104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97,100, 91, 49, 48, 93, 0,103, 97,105,110, 0,100,111,
-112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114,118,101,108,111, 99,105,116,121, 0,110,117,109,115,
-111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117,110,100,115,103, 97,109,101,101,110,103,105,110,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, 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,112, 97,116,104,102,108, 97,103, 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, 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, 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, 42, 99,117,115,116,111,109, 0, 99,104, 97,110, 98, 97,115,101, 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, 99,117,115,
-116,111,109, 67,111,108, 0, 99,115, 0, 42,103,114,112, 0,114,101,115,101,114,118,101,100, 49, 0,103,114,111,117,112,115, 0,
- 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 0,116,105,109,
-101,115,108,105,100,101, 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, 42,116, 97,114, 0,115,117, 98,116, 97,114,103,101,
-116, 91, 51, 50, 93, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0, 42,112,114,111,112, 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,114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,
+ 0, 42,112,114,101,118,105,101,119, 0, 42,114,101,110,100,101,114, 95,116,101,120,116, 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,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,112, 97,100, 91, 50, 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,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115,
+112,102, 97, 99, 0,119, 97,114,112,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,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,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,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 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, 99,111, 98, 97, 0, 42,101,110,118, 0,117,115,101, 95,110,111,100,101,115, 0,112, 97,100, 91, 55, 93, 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,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105,
+ 97,115, 0,115,111,102,116, 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, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,115, 0, 89, 70, 95,110,117,
+109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,113,109, 99, 0, 89, 70, 95,
+ 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99, 98,108,117,114, 0, 89, 70,
+ 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,108,111,119,111,102,115, 0,
+ 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120, 91, 49, 56, 93, 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,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, 89, 70, 95, 97,114, 0, 89,
+ 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,
+100,115,109,112, 0, 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,105,116, 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,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,118,101,
+ 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,115, 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, 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,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, 98,112, 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, 99,117, 98,101,109,
+ 97,112,115,105,122,101, 0,100,114, 97,119,102,108, 97,103, 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, 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,
+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,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,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, 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, 97, 98,115,111,114,112,116,105,111,110, 0,116,105,109,101, 0, 42, 98,118,104,116,114,101,101, 0, 42,100,109, 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,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,
+100, 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,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,115,121,115, 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, 42,117,110,100,111, 95,118,101,114,116,115, 0,117,110,100,111, 95,118,101,114,116,115, 95,116,111,
+116, 0,117,110,100,111, 95,115,105,103,110, 97,108, 0,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,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,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, 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, 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,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,115,105,122,101,102, 97, 99, 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,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, 53, 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,112,100, 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, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,
+116, 0,102,111,114, 99,101,102,105,101,108,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,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100,
+ 97,109,112, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,
+100, 0,102, 95,112,111,119,101,114, 95,114, 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,116,101,120, 95,109,111,100,101, 0,107,105,110,107,
+ 0,107,105,110,107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,102,114, 97,109,
+101, 0,116,111,116,112,111,105,110,116, 0, 42,120,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,120,100, 97,116, 97, 95,116,121,112,101, 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,109,101,109, 95, 99, 97, 99,104,101, 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, 42,112, 97,114,116,105, 99,108,101,115, 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,110,111,100,101,109, 97,115,115, 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,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,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,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,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,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97,
+109, 98,107, 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,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,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, 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,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,
+112, 97,100, 91, 51, 93, 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,102,102, 99,111,100,101, 99,100, 97,116, 97, 0, 97,117,100,105,111, 0, 99,102,114, 97, 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, 49, 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,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,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, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101,
+116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70,
+101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0,
+121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120,
+101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120,
+112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0, 89, 70, 95,114, 97,121,100,101,112,
+116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,112,108,101,115, 0,121,102,112, 97,
+100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,102,105,110,101,109,101,110,116, 0,
+ 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89, 70,
+ 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,115,
+105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,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,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,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, 99,111,108,
+ 91, 51, 93, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 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, 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,100,114, 97,119, 95,116,105,109,101,100, 0,115,101,108,101, 99,116,109,
+111,100,101, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 42,115,101,115,115,105,111,110, 0,
+112,105,118,111,116, 91, 51, 93, 0,116,101,120,115,101,112, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,
+101,116, 95,115,116,114,101,110,103,116,104, 0,112, 97,100, 91, 53, 93, 0,103, 97,109,109, 97, 0,109,117,108, 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, 42,115, 99,117,108,112,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,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,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, 42, 99, 97,109,101,114, 97, 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, 42,101,100, 0,102,114, 97,109,105,110,103, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,
+115, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 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,102,114, 97,109,101, 95,115,
+116,101,112, 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,
+ 98,108,101,110,100, 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,108, 97,115,116,109,111,100,101, 0,114,102,108, 97,103, 0,118,105,101,119,108,
+111, 99,107, 0,112,101,114,115,112, 0,118,105,101,119, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98,
+ 98, 0, 42,103,112,100, 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,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, 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,108, 97,121, 97, 99,116, 0,
+100,114, 97,119,116,121,112,101, 0,108,111, 99, 97,108,118,105,101,119, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,
+117,110,100, 0,102,108, 97,103, 50, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,103,114,105,100,118,105,
+101,119, 0,112, 97,100,102, 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,116,119,100,114, 97,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, 99,117,114,115,111,114, 91, 50, 93, 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,112,105,110, 0,108,111, 99,107, 0, 99,117,
+114,115,101,110,115, 0, 99,117,114, 97, 99,116, 0,112,114,101,118,105,101,119, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,
+111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,110,114, 0,116,101,120,102,114,111,109, 0,115,104,111,119,103,114,
+111,117,112, 0,109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,108,111, 99,107, 0,114,101, 95, 97,108,105,
+103,110, 0,111,108,100,107,101,121,112,114,101,115,115, 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,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,109,101,110,117,
+ 0,102,112, 95,115,116,114, 91, 56, 93, 0, 42,112,117,112,109,101,110,117, 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,108,111, 97,100,105,109, 97,103,101, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 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,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,101,110,116,120, 0, 99,101,110,116,121, 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,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,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,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, 56, 93, 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,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,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,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, 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,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,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, 51,
+ 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, 97,114,109, 91, 50, 48, 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,
+121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93, 0,118,101,114,115,105,111,110,115, 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,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,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,119,109,112, 97,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,105,112,111, 95,110,101,119, 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, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 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,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,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,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,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,115, 97,116,117,114, 97,116,105,111,110, 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,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,102, 97,
+ 99,102, 48, 0,102, 97, 99,102, 49, 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,111,117,110,100, 0, 42,104,100, 97,117,100,105,111, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,
+101,110,101,110,114, 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,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, 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,111,116,121,112,101, 0,111,108,100, 0, 42,112,111,105,110, 0, 42,111,108,100,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, 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,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,109,111,100,117,108,101, 91, 54, 52, 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,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, 99,111,
+112,121,109, 97,100,101, 0,112, 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107, 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, 98,117,116,115,116, 97, 0, 98,117,
+116,101,110,100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,105,102, 97, 99, 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,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,103,111, 0, 97, 99,
+ 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100,
+ 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,112,
+ 0, 42,115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0,
+ 42,115,110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,112,
+105,116, 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99,101, 0,
+115,116,114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97,100, 91,
+ 49, 48, 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114,118,101,
+108,111, 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117,110,100,
+115,103, 97,109,101,101,110,103,105,110,101, 0, 42, 97,114,101, 97, 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, 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,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,114,111,112, 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,114,111,116,
+109,111,100,101, 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, 42, 99,117,115,116,111,109, 0, 99,104, 97,110, 98, 97,115,101, 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,
+ 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,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,
+ 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 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, 42,116, 97,114, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50,
+ 93, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 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,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,
@@ -16974,93 +17306,125 @@ char datatoc_preview_blend[]= {
51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 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, 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,117,115,101,114,110, 97,109,101, 91, 51, 50, 93, 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,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 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, 42,115,101,108,105,110, 0, 42,115,101,108,111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 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, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 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, 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,105,116,101,114, 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,115, 97,116, 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,
-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,112,114,101,118,105,101,119, 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,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, 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,111,102,102,115,101,116, 91, 50, 93, 0,105,110,
-110,101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0, 99,108,111,110,101, 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,101,100,105,116,102,108, 97,103, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,
-118,101, 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, 97,110,100, 91, 51, 93, 0, 42,115,116,105, 99,107, 95,111, 98, 0,112,114,101,
-118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0,105, 95,114,111,116, 91, 52, 93, 0,114, 95,114,111,116, 91, 52, 93, 0,
-114, 95, 97,118,101, 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, 0,100,105,101,116,105,109,101, 0, 98, 97,110,107, 0,115,105,
-122,101,109,117,108, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, 0, 97,108,105,118,101, 0,108,111,111,112,
- 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0,114,111,116,109,111,100,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,100,114, 97,119, 95,115,116,101,112, 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,110, 98,101,116,
-119,101,101,110, 0, 98,111,105,100,110,101,105,103,104, 98,111,117,114,115, 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,102,108, 97,103, 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,107,101,121,101,100, 95,116,105,109,101, 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, 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, 97, 98,115,108,101,110,103,116,104, 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,104,105,108,100,115,112,114,101, 97,100, 0, 99,108,117,109,112,102, 97, 99, 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, 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,109, 97,120, 95,108, 97,116, 95, 97, 99, 99, 0,109, 97,120, 95,116, 97,110, 95, 97, 99, 99, 0, 97,118,
-101,114, 97,103,101, 95,118,101,108, 0, 98, 97,110,107,105,110,103, 0,109, 97,120, 95, 98, 97,110,107, 0,103,114,111,117,110,
-100,122, 0, 98,111,105,100,102, 97, 99, 91, 56, 93, 0, 98,111,105,100,114,117,108,101, 91, 56, 93, 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,
-101,100,105,116, 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,116, 97,114,103,
-101,116, 95,111, 98, 0, 42,107,101,121,101,100, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,116,111,
-114,115, 0,114,101, 97, 99,116,101,118,101,110,116,115, 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,107,101,121,101,
-100, 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, 99, 97, 99,104,101, 0, 67,100,105,115, 0, 67,118,105, 0, 91, 51, 93,
- 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,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,112,114,101,115,101,116,115, 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, 42,112,111,105,110,116,115, 0,116,111,116,112,111,105,110,116,115, 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, 0, 0, 0, 84, 89, 80, 69, 0, 0, 1, 99,
+ 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,117,115,101,114,110, 97,109,101, 91, 51, 50, 93, 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,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, 42,115,101,108,105,110, 0, 42,115,101,108,
+111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 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,116, 99,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,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, 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,105,116,101,114, 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,115, 97,116, 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,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,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, 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,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,105,110,110,
+101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,114,111,116, 0,115, 99,117,108,112,116, 95,
+116,111,111,108, 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,101,100,105,116,102,108, 97,103, 0,118,101,108, 91, 51, 93,
+ 0,114,111,116, 91, 52, 93, 0, 97,118,101, 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, 97,110,100, 91, 51, 93, 0, 42,115,116,105,
+ 99,107, 95,111, 98, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0,105, 95,114,111,116, 91, 52, 93, 0,
+114, 95,114,111,116, 91, 52, 93, 0,114, 95, 97,118,101, 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, 0,100,105,101,116,105,109,
+101, 0, 98, 97,110,107, 0,115,105,122,101,109,117,108, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, 0, 97,
+108,105,118,101, 0,108,111,111,112, 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,114,116, 50, 91, 51, 93, 0,100,114, 97,119, 95,
+115,116,101,112, 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,110, 98,101,116,119,101,101,110, 0, 98,111,105,100,110,101,105,103,104, 98,111,117,
+114,115, 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,102,108, 97,103, 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, 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,
+102, 97, 99, 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,109, 97,120, 95,108, 97,116, 95, 97, 99,
+ 99, 0,109, 97,120, 95,116, 97,110, 95, 97, 99, 99, 0, 97,118,101,114, 97,103,101, 95,118,101,108, 0, 98, 97,110,107,105,110,
+103, 0,109, 97,120, 95, 98, 97,110,107, 0,103,114,111,117,110,100,122, 0, 98,111,105,100,102, 97, 99, 91, 56, 93, 0, 98,111,
+105,100,114,117,108,101, 91, 56, 93, 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,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116,
+ 41, 40, 41, 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,116, 97,114,103,101,
+116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,116,111,114,115, 0,114,101, 97, 99,116,101,118,101,
+110,116,115, 0,107,101,121,101,100, 95,116, 97,114,103,101,116,115, 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, 99, 97, 99,104,101, 0, 67,100,105,115, 0, 67,118,105, 0, 91, 51, 93, 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,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,112,114,101,115,101,116,115, 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, 42,112,111,105,110,116,115, 0,116,111,116,112,111,105,110,116,115, 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,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,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,107,101,121,109, 97,
+112,115, 0, 42,103,104,111,115,116,119,105,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,116,105,109,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, 42,112,116,114,
+ 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,107,101,121,109, 97,112, 0,110, 97,109,101,105,100, 91, 54, 52, 93, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,
+111,110,105,100, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,114,101,112,111,114,116,115, 0,109,118, 97,108, 91, 50,
+ 93, 0,112,114,101,118,120, 0,112,114,101,118,121, 0,117,110,105, 99,111,100,101, 0, 97,115, 99,105,105, 0, 42,107,101,121,
+109, 97,112, 95,105,100,110, 97,109,101, 0, 99,117,115,116,111,109, 0, 99,117,115,116,111,109,100, 97,116, 97,102,114,101,101,
+ 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, 42,114,110, 97, 95,
+112, 97,116,104, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93,
+ 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 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,105,100,116,121,
+112,101, 0,116,101,109,112,108, 97,116,101,115, 0,103,114,111,117,112,109,111,100,101, 0,112, 97,116,104,115, 0,107,101,121,
+105,110,103,102,108, 97,103, 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, 0, 84, 89, 80, 69,161, 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,105, 0,118,101, 99, 50,
@@ -17069,684 +17433,899 @@ char datatoc_preview_blend[]= {
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, 83, 99,114,105,112,116, 76,105,110,107, 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, 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, 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, 87, 97,118,101, 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, 67,117,114,
-118,101, 0, 80, 97,116,104, 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, 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,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,117,108,116,105,114,101,
-115, 77, 97,112, 78,111,100,101, 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, 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, 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, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 98, 65,
- 99,116,105,111,110, 0, 98, 80,111,115,101, 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, 82, 78, 71, 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, 82, 97,100,105,111, 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, 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, 70,114, 97,109,
-105,110,103, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,
-115, 0, 66,114,117,115,104, 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, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 66,114,117,115,104, 68, 97,116, 97, 0, 83, 99,117,108,112,
-116, 68, 97,116, 97, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 83, 99,101,110,101, 0, 68, 97,103, 70,111,114,
-101,115,116, 0, 66, 71,112,105, 99, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 83, 99,114, 65,114,
-101, 97, 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, 98, 71, 80,100, 97,116, 97, 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, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 83,112, 97,
- 99,101, 70,105,108,101, 0,100,105,114,101,110,116,114,121, 0, 66,108,101,110,100, 72, 97,110,100,108,101, 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,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, 0, 83,112, 97, 99,101, 78,111,
-100,101, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 70,105,108,101, 76,105,115,116, 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, 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, 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, 98, 83,111,117,110,100, 0,104,100, 97,117,100,105,111, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 69,100,105,116,105,110,
-103, 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, 79,111,112,115, 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, 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, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98,
- 67, 68, 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, 70,114,101,101, 67, 97,109,101,114, 97, 0, 98, 83, 97,109,112,108,101, 0, 98, 83,111,117,110,100, 76,
-105,115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83,111,117,110,100, 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, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, 65, 99,116,105,
-111,110, 71,114,111,117,112, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 83,112, 97, 99,101, 65, 99,116,105,
-111,110, 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, 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, 77,105,110, 77, 97,
-120, 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, 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, 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, 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,
- 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, 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, 72,
- 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101,
- 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 80,
- 97,114,116,105, 99,108,101, 69,100,105,116, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 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, 84, 76, 69, 78, 0, 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, 2, 40, 0, 0, 0, 32, 0,140, 3, 80, 0, 92, 0, 36, 0, 56, 0, 84, 0,112,
- 0,120, 0, 16, 0, 24, 0, 40, 0,120, 0, 20, 0,132, 0, 32, 1,128, 0, 0, 0, 0, 0, 0, 0,136, 1, 16, 1, 84, 0, 24,
- 3, 8, 0,168, 0, 0, 0,124, 0,132, 1,128, 1, 8, 0, 56, 2,108, 0, 76, 1, 68, 0, 0, 0,108, 0,104, 0,136, 0, 56,
- 0, 8, 0, 16, 1, 56, 0, 0, 1, 24, 0, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 24, 0, 76,
- 0, 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 1, 0, 0, 32, 0, 16, 0, 64, 0, 24, 0, 12, 0, 56, 0, 0, 0, 52,
- 0, 68, 0, 88, 0, 96, 0, 68, 0, 96, 0,116, 0, 64, 0, 60, 0,108, 0, 60, 0,148, 0,152, 0, 60, 0, 92, 0,104, 0,184,
- 0,100, 0,180, 0, 52, 0, 68, 0, 0, 0,132, 0, 28, 0, 20, 0,100, 0, 0, 0, 60, 0, 0, 0, 0, 0, 64, 0, 8, 0, 8,
- 0,216, 0, 76, 1, 64, 0, 64, 0, 64, 0, 60, 1,164, 0,108, 0,104, 0,116, 0, 40, 0, 84, 0, 56, 0,120, 0,128, 0,152,
- 0,208, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,108, 0, 40, 0, 28, 0,176, 0,144, 0, 52, 0, 16, 0, 72, 3,208, 0, 56,
- 0, 16, 0, 80, 0, 12, 0,184, 0, 8, 0, 72, 0, 80, 0,232, 0, 8, 0,168, 0, 0, 5,124, 0, 0, 0, 60, 3, 28, 0, 36,
- 0,204, 0, 0, 0, 0, 0, 0, 0, 20, 0,136, 0, 36, 1, 88, 0,220, 0,200, 1,200, 0, 0, 0, 0, 1, 8, 0, 12, 0, 12,
- 1, 8, 0,180, 0,128, 2, 80, 0, 36, 0,164, 0,220, 2,132, 0, 0, 0,152, 0,208, 0, 16, 14, 56, 0, 56, 12, 32, 0,120,
- 0, 20, 0, 24, 0,228, 0, 32, 0, 80, 0, 28, 0, 16, 0, 8, 0, 52, 0,244, 0,240, 1,168, 0,204, 1, 28, 0, 0, 0, 16,
- 0, 28, 0, 12, 0, 24, 0, 48, 0, 16, 0, 20, 0, 16, 0, 24, 1, 56, 0, 0, 0, 56, 0, 44, 0, 64, 0, 48, 0, 8, 0, 44,
- 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12,
- 0, 92, 0, 28, 0, 20, 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 60, 0, 56, 0,108, 0,140, 0, 4, 0, 20,
- 0, 12, 0, 8, 0, 40, 0, 0, 0, 68, 0,176, 0, 24, 1, 4, 0,116, 1,152, 0, 72, 0, 64, 0,192, 0, 44, 0, 64, 0,116,
- 0, 60, 0,104, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 28,
- 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 24, 0,204, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12,
- 0, 12, 1, 16, 0, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 32, 0, 12, 0, 44, 0, 20,
- 0, 68, 0, 24, 0, 56, 0, 72, 0,252, 1,224, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 0, 83, 84, 82, 67,
- 0, 0, 1, 57, 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, 4, 0, 5,
- 0, 4, 0, 6, 0, 15, 0, 2, 0, 7, 0, 5, 0, 7, 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, 0, 0, 19, 0, 2, 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, 20, 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, 6,
- 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0, 2, 0, 43, 0, 4, 0, 44, 0, 31, 0, 6, 0, 32, 0, 45,
- 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 18, 0, 2, 0, 20, 0, 0, 0, 48, 0, 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1,
- 0, 34, 0, 49, 0, 35, 0, 50, 0, 24, 0, 51, 0, 24, 0, 52, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 53, 0, 2, 0, 54,
- 0, 2, 0, 55, 0, 2, 0, 56, 0, 2, 0, 20, 0, 2, 0, 57, 0, 7, 0, 11, 0, 7, 0, 12, 0, 4, 0, 58, 0, 7, 0, 59,
- 0, 7, 0, 60, 0, 7, 0, 61, 0, 31, 0, 62, 0, 36, 0, 7, 0, 27, 0, 31, 0, 12, 0, 63, 0, 24, 0, 64, 0, 2, 0, 46,
- 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61,
- 0, 2, 0, 18, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 20, 0, 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71,
- 0, 0, 0, 17, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, 38, 0, 12, 0, 27, 0, 31, 0, 37, 0, 75, 0, 0, 0, 76,
- 0, 4, 0, 77, 0, 7, 0, 61, 0, 12, 0, 78, 0, 36, 0, 79, 0, 27, 0, 80, 0, 2, 0, 18, 0, 2, 0, 81, 0, 2, 0, 82,
- 0, 2, 0, 20, 0, 39, 0, 5, 0, 27, 0, 83, 0, 2, 0, 84, 0, 2, 0, 85, 0, 2, 0, 86, 0, 4, 0, 37, 0, 40, 0, 6,
- 0, 40, 0, 0, 0, 40, 0, 1, 0, 0, 0, 87, 0, 0, 0, 88, 0, 4, 0, 23, 0, 4, 0, 89, 0, 41, 0, 10, 0, 41, 0, 0,
- 0, 41, 0, 1, 0, 4, 0, 90, 0, 4, 0, 91, 0, 4, 0, 92, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 93, 0, 0, 0, 94,
- 0, 0, 0, 95, 0, 42, 0, 15, 0, 27, 0, 31, 0, 0, 0, 96, 0, 4, 0, 93, 0, 4, 0, 97, 0, 12, 0, 98, 0, 40, 0, 99,
- 0, 40, 0,100, 0, 4, 0,101, 0, 4, 0,102, 0, 12, 0,103, 0, 0, 0,104, 0, 4, 0,105, 0, 4, 0,106, 0, 9, 0,107,
- 0, 8, 0,108, 0, 43, 0, 5, 0, 4, 0,109, 0, 4, 0,110, 0, 4, 0, 93, 0, 4, 0, 37, 0, 9, 0, 2, 0, 44, 0, 20,
- 0, 27, 0, 31, 0, 2, 0, 18, 0, 2, 0, 20, 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, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0, 7, 0,121, 0, 2, 0,122, 0, 2, 0,123,
- 0, 7, 0,124, 0, 36, 0, 79, 0, 39, 0,125, 0, 32, 0,126, 0, 45, 0, 12, 0, 4, 0,127, 0, 4, 0,128, 0, 4, 0,129,
- 0, 4, 0,130, 0, 2, 0,131, 0, 2, 0,132, 0, 2, 0, 20, 0, 2, 0,133, 0, 2, 0,134, 0, 2, 0,135, 0, 2, 0,136,
- 0, 2, 0,137, 0, 46, 0, 32, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,138, 0, 47, 0,139, 0, 48, 0,140, 0, 49, 0,141,
- 0, 2, 0,133, 0, 2, 0, 20, 0, 2, 0,142, 0, 2, 0, 18, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,143, 0, 2, 0,144,
- 0, 2, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, 4, 0,150, 0, 4, 0,151, 0, 43, 0,152,
- 0, 30, 0,153, 0, 7, 0,154, 0, 4, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 7, 0,160,
- 0, 7, 0,161, 0, 9, 0,162, 0, 50, 0, 31, 0, 2, 0,163, 0, 2, 0,164, 0, 2, 0,165, 0, 2, 0,166, 0, 32, 0,167,
- 0, 51, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, 0, 0,173, 0, 7, 0,174, 0, 7, 0,175,
- 0, 2, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0, 2, 0,181, 0, 2, 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, 57, 0, 7, 0,188, 0, 7, 0,189, 0, 7, 0,190,
- 0, 7, 0,191, 0, 7, 0,192, 0, 52, 0, 15, 0, 0, 0,193, 0, 9, 0,194, 0, 0, 0,195, 0, 0, 0,196, 0, 4, 0,197,
- 0, 4, 0,198, 0, 9, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 4, 0,203, 0, 9, 0,204, 0, 9, 0,205,
- 0, 4, 0,206, 0, 4, 0, 37, 0, 53, 0, 6, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,207, 0, 7, 0, 67,
- 0, 4, 0, 64, 0, 54, 0, 5, 0, 2, 0, 20, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,208, 0, 53, 0,202, 0, 55, 0, 17,
- 0, 32, 0,167, 0, 46, 0,209, 0, 56, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 2, 0, 18, 0, 2, 0,213, 0, 7, 0,113,
- 0, 7, 0,114, 0, 7, 0,214, 0, 4, 0,215, 0, 2, 0,216, 0, 2, 0,217, 0, 4, 0,133, 0, 4, 0,143, 0, 2, 0,218,
- 0, 2, 0,219, 0, 51, 0, 56, 0, 27, 0, 31, 0, 7, 0,220, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224,
- 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 7, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 7, 0,232,
- 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 7, 0,239, 0, 2, 0,240,
- 0, 2, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 2, 0,244, 0, 2, 0,245, 0, 2, 0,246, 0, 2, 0, 20, 0, 2, 0, 18,
- 0, 2, 0,213, 0, 7, 0,247, 0, 7, 0,248, 0, 7, 0,249, 0, 7, 0,250, 0, 2, 0,251, 0, 2, 0,252, 0, 2, 0,253,
- 0, 2, 0,131, 0, 4, 0, 23, 0, 4, 0,128, 0, 4, 0,129, 0, 4, 0,130, 0, 7, 0,254, 0, 7, 0,255, 0, 7, 0,189,
- 0, 45, 1, 0, 0, 57, 1, 1, 0, 36, 0, 79, 0, 46, 0,209, 0, 52, 1, 2, 0, 54, 1, 3, 0, 55, 1, 4, 0, 30, 0,153,
- 0, 0, 1, 5, 0, 0, 1, 6, 0, 58, 0, 8, 0, 7, 1, 7, 0, 7, 1, 8, 0, 7, 0,175, 0, 4, 0, 20, 0, 7, 1, 9,
- 0, 7, 1, 10, 0, 7, 1, 11, 0, 32, 0, 45, 0, 59, 0, 80, 0, 27, 0, 31, 0, 2, 0, 18, 0, 2, 1, 12, 0, 4, 1, 13,
- 0, 2, 0,177, 0, 2, 1, 14, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 1, 15, 0, 7, 1, 16,
- 0, 7, 1, 17, 0, 7, 1, 18, 0, 7, 1, 19, 0, 7, 1, 20, 0, 7, 1, 21, 0, 7, 1, 22, 0, 7, 1, 23, 0, 7, 1, 24,
- 0, 7, 1, 25, 0, 60, 1, 26, 0, 2, 1, 27, 0, 2, 0, 70, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 1, 28, 0, 7, 1, 29,
- 0, 7, 1, 30, 0, 2, 1, 31, 0, 2, 1, 32, 0, 2, 1, 33, 0, 2, 1, 34, 0, 0, 1, 35, 0, 0, 1, 36, 0, 2, 1, 37,
- 0, 2, 1, 38, 0, 2, 1, 39, 0, 2, 1, 40, 0, 2, 1, 41, 0, 7, 1, 42, 0, 7, 1, 43, 0, 7, 1, 44, 0, 7, 1, 45,
- 0, 2, 1, 46, 0, 2, 0, 43, 0, 2, 1, 47, 0, 2, 1, 48, 0, 2, 1, 49, 0, 2, 1, 50, 0, 7, 1, 51, 0, 7, 1, 52,
- 0, 7, 1, 53, 0, 7, 1, 54, 0, 7, 1, 55, 0, 7, 1, 56, 0, 7, 1, 57, 0, 7, 1, 58, 0, 7, 1, 59, 0, 7, 1, 60,
- 0, 7, 1, 61, 0, 7, 1, 62, 0, 2, 1, 63, 0, 2, 1, 64, 0, 4, 1, 65, 0, 4, 1, 66, 0, 2, 1, 67, 0, 2, 1, 68,
- 0, 2, 1, 69, 0, 2, 1, 70, 0, 7, 1, 71, 0, 7, 1, 72, 0, 7, 1, 73, 0, 7, 1, 74, 0, 2, 1, 75, 0, 2, 1, 76,
- 0, 50, 1, 77, 0, 36, 0, 79, 0, 30, 0,153, 0, 39, 0,125, 0, 61, 0, 2, 0, 27, 0, 31, 0, 36, 0, 79, 0, 62, 0,129,
- 0, 27, 0, 31, 0, 2, 0,177, 0, 2, 0, 20, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 1, 78, 0, 7, 1, 79,
- 0, 7, 1, 80, 0, 7, 1, 81, 0, 7, 1, 82, 0, 7, 1, 83, 0, 7, 1, 84, 0, 7, 1, 85, 0, 7, 1, 86, 0, 7, 1, 87,
- 0, 7, 1, 88, 0, 7, 1, 89, 0, 7, 1, 90, 0, 7, 1, 91, 0, 7, 1, 92, 0, 7, 1, 93, 0, 7, 1, 94, 0, 7, 1, 95,
- 0, 7, 1, 96, 0, 7, 1, 97, 0, 7, 1, 98, 0, 7, 1, 99, 0, 7, 1,100, 0, 7, 1,101, 0, 7, 1,102, 0, 7, 1,103,
- 0, 7, 1,104, 0, 2, 1,105, 0, 2, 1,106, 0, 2, 1,107, 0, 0, 1,108, 0, 0, 1,109, 0, 7, 1,110, 0, 7, 1,111,
- 0, 2, 1,112, 0, 2, 1,113, 0, 7, 1,114, 0, 7, 1,115, 0, 7, 1,116, 0, 7, 1,117, 0, 2, 1,118, 0, 2, 1,119,
- 0, 4, 1, 13, 0, 4, 1,120, 0, 2, 1,121, 0, 2, 1,122, 0, 2, 1,123, 0, 2, 1,124, 0, 7, 1,125, 0, 7, 1,126,
- 0, 7, 1,127, 0, 7, 1,128, 0, 7, 1,129, 0, 7, 1,130, 0, 7, 1,131, 0, 7, 1,132, 0, 7, 1,133, 0, 7, 1,134,
- 0, 0, 1,135, 0, 7, 1,136, 0, 7, 1,137, 0, 7, 1,138, 0, 4, 1,139, 0, 0, 1,140, 0, 0, 1, 47, 0, 0, 1,141,
- 0, 0, 1, 5, 0, 2, 1,142, 0, 2, 1,143, 0, 2, 1, 64, 0, 2, 1,144, 0, 2, 1,145, 0, 2, 1,146, 0, 7, 1,147,
- 0, 7, 1,148, 0, 7, 1,149, 0, 7, 1,150, 0, 7, 1,151, 0, 2, 0,163, 0, 2, 0,164, 0, 54, 1,152, 0, 54, 1,153,
- 0, 0, 1,154, 0, 0, 1,155, 0, 0, 1,156, 0, 0, 1,157, 0, 2, 1,158, 0, 2, 1, 12, 0, 7, 1,159, 0, 7, 1,160,
- 0, 50, 1, 77, 0, 57, 1, 1, 0, 36, 0, 79, 0, 63, 1,161, 0, 30, 0,153, 0, 7, 1,162, 0, 7, 1,163, 0, 7, 1,164,
- 0, 7, 1,165, 0, 7, 1,166, 0, 2, 1,167, 0, 2, 0, 70, 0, 7, 1,168, 0, 7, 1,169, 0, 7, 1,170, 0, 7, 1,171,
- 0, 7, 1,172, 0, 7, 1,173, 0, 7, 1,174, 0, 7, 1,175, 0, 7, 1,176, 0, 2, 1,177, 0, 2, 1,178, 0, 7, 1,179,
- 0, 7, 1,180, 0, 7, 1,181, 0, 7, 1,182, 0, 7, 1,183, 0, 4, 1,184, 0, 4, 1,185, 0, 4, 1,186, 0, 39, 0,125,
- 0, 12, 1,187, 0, 64, 0, 6, 0, 27, 0, 31, 0, 0, 1,188, 0, 7, 1,189, 0, 7, 0, 37, 0, 65, 0, 2, 0, 43, 0,152,
- 0, 66, 0, 26, 0, 66, 0, 0, 0, 66, 0, 1, 0, 67, 1,190, 0, 4, 1,191, 0, 4, 1,192, 0, 4, 1,193, 0, 4, 1,194,
- 0, 4, 1,195, 0, 4, 1,196, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 1,197, 0, 2, 1,198, 0, 7, 0, 5, 0, 7, 0, 6,
- 0, 7, 0, 7, 0, 7, 1,199, 0, 7, 1,200, 0, 7, 1,201, 0, 7, 1,202, 0, 7, 1,203, 0, 7, 1,204, 0, 7, 1,205,
- 0, 7, 0, 23, 0, 7, 1,206, 0, 7, 1,207, 0, 68, 0, 15, 0, 27, 0, 31, 0, 67, 1,190, 0, 12, 1,208, 0, 12, 1,209,
- 0, 36, 0, 79, 0, 62, 1,210, 0, 2, 0, 20, 0, 2, 1,211, 0, 4, 0,176, 0, 7, 1, 7, 0, 7, 0,175, 0, 7, 1, 8,
- 0, 7, 1,212, 0, 7, 1,213, 0, 7, 1,214, 0, 35, 0, 10, 0, 7, 1,215, 0, 7, 1,216, 0, 7, 1,217, 0, 7, 1,218,
- 0, 2, 1,219, 0, 2, 1,220, 0, 0, 1,221, 0, 0, 1,222, 0, 0, 1,223, 0, 0, 1,224, 0, 34, 0, 7, 0, 7, 1,225,
- 0, 7, 1,216, 0, 7, 1,217, 0, 2, 1,221, 0, 2, 1,224, 0, 7, 1,218, 0, 7, 0, 37, 0, 69, 0, 21, 0, 69, 0, 0,
- 0, 69, 0, 1, 0, 2, 0, 18, 0, 2, 1,226, 0, 2, 1,224, 0, 2, 0, 20, 0, 2, 1,227, 0, 2, 1,228, 0, 2, 1,229,
- 0, 2, 1,230, 0, 2, 1,231, 0, 2, 1,232, 0, 2, 1,233, 0, 2, 1,234, 0, 7, 1,235, 0, 7, 1,236, 0, 34, 0, 49,
- 0, 35, 0, 50, 0, 2, 1,237, 0, 2, 1,238, 0, 4, 1,239, 0, 70, 0, 5, 0, 2, 1,240, 0, 2, 1,226, 0, 0, 0, 20,
- 0, 0, 0, 37, 0, 2, 0, 70, 0, 71, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 8, 0, 7, 1,241, 0, 72, 0, 57,
- 0, 27, 0, 31, 0, 67, 1,190, 0, 12, 1,242, 0, 12, 1,209, 0, 32, 1,243, 0, 32, 1,244, 0, 32, 1,245, 0, 36, 0, 79,
- 0, 73, 1,246, 0, 38, 1,247, 0, 62, 1,210, 0, 12, 1,248, 0, 7, 1, 7, 0, 7, 0,175, 0, 7, 1, 8, 0, 4, 0,176,
- 0, 2, 1,249, 0, 2, 1,211, 0, 2, 0, 20, 0, 2, 1,250, 0, 7, 1,251, 0, 7, 1,252, 0, 7, 1,253, 0, 2, 1,229,
- 0, 2, 1,230, 0, 2, 1,254, 0, 2, 1,255, 0, 4, 0, 70, 0, 2, 0, 23, 0, 2, 0, 98, 0, 2, 0, 67, 0, 2, 2, 0,
- 0, 7, 2, 1, 0, 7, 2, 2, 0, 7, 2, 3, 0, 7, 2, 4, 0, 7, 2, 5, 0, 7, 2, 6, 0, 7, 2, 7, 0, 7, 2, 8,
- 0, 7, 2, 9, 0, 7, 2, 10, 0, 0, 2, 11, 0, 0, 2, 12, 0, 64, 2, 13, 0, 64, 2, 14, 0, 64, 2, 15, 0, 64, 2, 16,
- 0, 4, 2, 17, 0, 4, 2, 18, 0, 4, 2, 19, 0, 4, 0, 37, 0, 71, 2, 20, 0, 4, 2, 21, 0, 4, 2, 22, 0, 70, 2, 23,
- 0, 70, 2, 24, 0, 74, 0, 39, 0, 27, 0, 31, 0, 67, 1,190, 0, 12, 2, 25, 0, 36, 0, 79, 0, 38, 1,247, 0, 62, 1,210,
- 0, 75, 2, 26, 0, 76, 2, 27, 0, 77, 2, 28, 0, 78, 2, 29, 0, 79, 2, 30, 0, 80, 2, 31, 0, 81, 2, 32, 0, 82, 2, 33,
- 0, 74, 2, 34, 0, 83, 2, 35, 0, 84, 2, 36, 0, 84, 2, 37, 0, 84, 2, 38, 0, 4, 0, 54, 0, 4, 2, 39, 0, 4, 2, 40,
- 0, 4, 2, 41, 0, 4, 2, 42, 0, 4, 0,176, 0, 7, 1, 7, 0, 7, 0,175, 0, 7, 1, 8, 0, 7, 2, 43, 0, 7, 0, 37,
- 0, 2, 2, 44, 0, 2, 0, 20, 0, 2, 2, 45, 0, 2, 2, 46, 0, 2, 1,211, 0, 2, 2, 47, 0, 85, 2, 48, 0, 86, 2, 49,
- 0, 9, 0,162, 0, 77, 0, 8, 0, 9, 2, 50, 0, 7, 2, 51, 0, 4, 2, 52, 0, 0, 0, 20, 0, 0, 2, 53, 0, 2, 1, 13,
- 0, 2, 2, 54, 0, 2, 2, 55, 0, 75, 0, 8, 0, 4, 2, 56, 0, 4, 2, 57, 0, 4, 2, 58, 0, 4, 2, 59, 0, 0, 0, 37,
- 0, 0, 1,226, 0, 0, 2, 60, 0, 0, 0, 20, 0, 79, 0, 5, 0, 4, 2, 56, 0, 4, 2, 57, 0, 0, 2, 61, 0, 0, 2, 62,
- 0, 2, 0, 20, 0, 87, 0, 2, 0, 4, 2, 63, 0, 7, 1,217, 0, 80, 0, 3, 0, 87, 2, 64, 0, 4, 2, 65, 0, 4, 0, 20,
- 0, 78, 0, 6, 0, 7, 2, 66, 0, 2, 2, 67, 0, 0, 0, 20, 0, 0, 1,226, 0, 0, 2, 62, 0, 0, 2, 68, 0, 81, 0, 4,
- 0, 0, 0,207, 0, 0, 0,183, 0, 0, 0,184, 0, 0, 0,185, 0, 88, 0, 6, 0, 46, 2, 50, 0, 0, 0, 20, 0, 0, 2, 53,
- 0, 2, 1, 13, 0, 2, 2, 54, 0, 2, 2, 55, 0, 89, 0, 1, 0, 7, 2, 69, 0, 90, 0, 5, 0, 0, 0,207, 0, 0, 0,183,
- 0, 0, 0,184, 0, 0, 0,185, 0, 4, 0, 37, 0, 82, 0, 1, 0, 7, 2, 70, 0, 83, 0, 2, 0, 4, 2, 71, 0, 4, 0, 18,
- 0, 76, 0, 7, 0, 7, 2, 51, 0, 46, 2, 50, 0, 0, 0, 20, 0, 0, 2, 53, 0, 2, 1, 13, 0, 2, 2, 54, 0, 2, 2, 55,
- 0, 91, 0, 1, 0, 7, 2, 72, 0, 92, 0, 1, 0, 4, 2, 73, 0, 93, 0, 1, 0, 0, 2, 74, 0, 94, 0, 1, 0, 7, 2, 51,
- 0, 95, 0, 4, 0, 7, 0,207, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 96, 0, 1, 0, 95, 2, 52, 0, 97, 0, 5,
- 0, 4, 2, 75, 0, 4, 2, 76, 0, 0, 0, 20, 0, 0, 1,226, 0, 0, 0,182, 0, 98, 0, 2, 0, 4, 2, 77, 0, 4, 2, 76,
- 0, 99, 0, 14, 0, 99, 0, 0, 0, 99, 0, 1, 0, 97, 2, 78, 0, 96, 2, 79, 0, 98, 2, 80, 0, 0, 2, 81, 0, 12, 2, 82,
- 0, 12, 2, 83, 0,100, 2, 84, 0, 4, 0, 54, 0, 4, 2, 40, 0, 4, 2, 39, 0, 4, 0, 37, 0, 78, 2, 85, 0, 85, 0, 14,
- 0, 12, 2, 86, 0, 78, 2, 85, 0, 0, 2, 87, 0, 0, 2, 88, 0, 0, 2, 89, 0, 0, 2, 90, 0, 0, 2, 91, 0, 0, 2, 92,
- 0, 0, 2, 93, 0, 0, 0, 20, 0, 84, 2, 36, 0, 84, 2, 38, 0, 2, 2, 94, 0, 0, 2, 95, 0, 86, 0, 8, 0, 4, 2, 96,
- 0, 4, 2, 97, 0, 75, 2, 98, 0, 79, 2, 99, 0, 4, 2, 40, 0, 4, 2, 39, 0, 4, 0, 54, 0, 4, 0, 37, 0,101, 0, 6,
- 0,101, 0, 0, 0,101, 0, 1, 0, 4, 0, 18, 0, 4, 1, 13, 0, 0, 0, 17, 0, 0, 2,100, 0,102, 0, 7, 0,101, 2,101,
- 0, 2, 2,102, 0, 2, 2, 86, 0, 2, 2,103, 0, 2, 0, 93, 0, 9, 2,104, 0, 9, 2,105, 0,103, 0, 3, 0,101, 2,101,
- 0, 32, 0,167, 0, 0, 0, 17, 0,104, 0, 5, 0,101, 2,101, 0, 32, 0,167, 0, 0, 0, 17, 0, 2, 2,106, 0, 0, 2,107,
- 0,105, 0, 5, 0,101, 2,101, 0, 7, 0, 91, 0, 7, 2,108, 0, 4, 2,109, 0, 4, 2,110, 0,106, 0, 5, 0,101, 2,101,
- 0, 32, 2,111, 0, 0, 0, 72, 0, 4, 1, 13, 0, 4, 0, 20, 0,107, 0, 13, 0,101, 2,101, 0, 32, 2,112, 0, 32, 2,113,
- 0, 32, 2,114, 0, 32, 2,115, 0, 7, 2,116, 0, 7, 2,117, 0, 7, 2,108, 0, 7, 2,118, 0, 4, 2,119, 0, 4, 2,120,
- 0, 4, 0, 93, 0, 4, 2,121, 0,108, 0, 5, 0,101, 2,101, 0, 2, 2,122, 0, 2, 0, 20, 0, 7, 2,123, 0, 32, 2,124,
- 0,109, 0, 3, 0,101, 2,101, 0, 7, 2,125, 0, 4, 0, 93, 0,110, 0, 10, 0,101, 2,101, 0, 7, 2,126, 0, 4, 2,127,
- 0, 4, 0, 37, 0, 2, 0, 93, 0, 2, 2,128, 0, 2, 2,129, 0, 2, 2,130, 0, 7, 2,131, 0, 0, 2,132, 0,111, 0, 3,
- 0,101, 2,101, 0, 7, 0, 37, 0, 4, 0, 18, 0,112, 0, 11, 0,101, 2,101, 0, 51, 2,133, 0, 7, 2,134, 0, 4, 2,135,
- 0, 0, 2,132, 0, 7, 2,136, 0, 4, 2,137, 0, 32, 2,138, 0, 0, 2,139, 0, 4, 2,140, 0, 4, 0, 37, 0,113, 0, 10,
- 0,101, 2,101, 0, 32, 2,141, 0, 46, 2,142, 0, 4, 0, 93, 0, 4, 2,143, 0, 7, 2,144, 0, 7, 2,145, 0, 0, 2,139,
- 0, 4, 2,140, 0, 4, 0, 37, 0,114, 0, 3, 0,101, 2,101, 0, 7, 2,146, 0, 4, 2,147, 0,115, 0, 5, 0,101, 2,101,
- 0, 7, 2,148, 0, 0, 2,132, 0, 2, 0, 20, 0, 2, 2,149, 0,116, 0, 8, 0,101, 2,101, 0, 32, 0,167, 0, 7, 2,148,
- 0, 7, 1,218, 0, 7, 0,109, 0, 0, 2,132, 0, 2, 0, 20, 0, 2, 0, 18, 0,117, 0, 21, 0,101, 2,101, 0, 32, 2,150,
- 0, 0, 2,132, 0, 51, 2,133, 0, 32, 2,138, 0, 2, 0, 20, 0, 2, 0, 37, 0, 7, 2,151, 0, 7, 2,152, 0, 7, 2,153,
- 0, 7, 1,251, 0, 7, 2,154, 0, 7, 2,155, 0, 7, 2,156, 0, 7, 2,157, 0, 4, 2,137, 0, 4, 2,140, 0, 0, 2,139,
- 0, 7, 2,158, 0, 7, 2,159, 0, 7, 0, 43, 0,118, 0, 7, 0,101, 2,101, 0, 2, 2,160, 0, 2, 2,161, 0, 4, 0, 70,
- 0, 32, 0,167, 0, 7, 2,162, 0, 0, 2,132, 0,119, 0, 9, 0,101, 2,101, 0, 32, 0,167, 0, 7, 2,163, 0, 7, 2,164,
- 0, 7, 2,157, 0, 4, 2,165, 0, 4, 2,166, 0, 7, 2,167, 0, 0, 0, 17, 0,120, 0, 1, 0,101, 2,101, 0,121, 0, 5,
- 0,101, 2,101, 0,122, 2,168, 0,123, 2,169, 0,124, 2,170, 0,125, 2,171, 0,126, 0, 14, 0,101, 2,101, 0, 78, 2,172,
- 0, 78, 2,173, 0, 78, 2,174, 0, 78, 2,175, 0, 78, 2,176, 0, 78, 2,177, 0, 75, 2,178, 0, 4, 2,179, 0, 4, 2,180,
- 0, 2, 2,181, 0, 2, 0, 37, 0, 7, 2,182, 0,127, 2,183, 0,128, 0, 3, 0,101, 2,101, 0,129, 2,184, 0,130, 2,183,
- 0,131, 0, 4, 0,101, 2,101, 0, 32, 0,167, 0, 4, 2,185, 0, 4, 0, 37, 0,132, 0, 2, 0, 4, 2,186, 0, 7, 1,217,
- 0,133, 0, 2, 0, 4, 0,129, 0, 4, 2,187, 0,134, 0, 20, 0,101, 2,101, 0, 32, 0,167, 0, 0, 2,132, 0, 2, 2,188,
- 0, 2, 2,189, 0, 2, 0, 20, 0, 2, 0, 37, 0, 7, 2,190, 0, 7, 2,191, 0, 4, 0, 54, 0, 4, 2,192, 0,133, 2,193,
- 0,132, 2,194, 0, 4, 2,195, 0, 4, 2,196, 0, 4, 2,197, 0, 4, 2,187, 0, 7, 2,198, 0, 7, 2,199, 0, 7, 2,200,
- 0,135, 0, 8, 0,101, 2,101, 0,136, 2,201, 0,129, 2,184, 0, 4, 2,202, 0, 4, 2,203, 0, 4, 2,204, 0, 2, 0, 20,
- 0, 2, 0, 57, 0,137, 0, 5, 0,101, 2,101, 0, 32, 0, 45, 0, 2, 2,205, 0, 2, 0, 20, 0, 2, 2,206, 0,138, 0, 5,
- 0,101, 2,101, 0, 4, 2,207, 0, 2, 0, 20, 0, 2, 2,208, 0, 7, 2,209, 0,139, 0, 3, 0,101, 2,101, 0,140, 2,210,
- 0,125, 2,171, 0,141, 0, 10, 0,101, 2,101, 0, 32, 2,211, 0, 32, 2,212, 0, 0, 2,213, 0, 7, 2,214, 0, 2, 2,215,
- 0, 2, 2,216, 0, 0, 2,217, 0, 0, 2,218, 0, 0, 2,107, 0,142, 0, 9, 0,101, 2,101, 0, 32, 2,219, 0, 0, 2,213,
- 0, 7, 2,220, 0, 7, 2,221, 0, 0, 1, 13, 0, 0, 2,122, 0, 0, 2,222, 0, 0, 0, 37, 0,143, 0, 24, 0, 27, 0, 31,
- 0, 2, 1,227, 0, 2, 1,228, 0, 2, 2,223, 0, 2, 0, 20, 0, 2, 2,224, 0, 2, 2,225, 0, 2, 2,226, 0, 2, 0, 70,
- 0, 0, 2,227, 0, 0, 2,228, 0, 0, 2,229, 0, 0, 0, 18, 0, 4, 0, 37, 0, 7, 2,230, 0, 7, 2,231, 0, 7, 2,232,
- 0, 7, 2,233, 0, 7, 2,234, 0, 7, 2,235, 0, 34, 2,236, 0, 36, 0, 79, 0, 38, 1,247, 0, 80, 2, 31, 0,144, 0, 3,
- 0,144, 0, 0, 0,144, 0, 1, 0, 0, 0, 17, 0, 67, 0, 3, 0, 7, 2,237, 0, 4, 0, 20, 0, 4, 0, 37, 0, 32, 0,111,
- 0, 27, 0, 31, 0, 2, 0, 18, 0, 2, 2,238, 0, 4, 2,239, 0, 4, 2,240, 0, 4, 2,241, 0, 0, 2,242, 0, 32, 0, 38,
- 0, 32, 2,243, 0, 32, 2,244, 0, 32, 2,245, 0, 32, 2,246, 0, 36, 0, 79, 0, 73, 1,246, 0, 67, 1,190, 0,145, 2,247,
- 0,145, 2,248, 0,146, 2,249, 0, 9, 0, 2, 0, 12, 2,250, 0, 12, 2, 25, 0, 12, 1,209, 0, 12, 2,251, 0, 12, 2,252,
- 0, 62, 1,210, 0, 7, 1, 7, 0, 7, 2,253, 0, 7, 2,254, 0, 7, 0,175, 0, 7, 2,255, 0, 7, 1, 8, 0, 7, 3, 0,
- 0, 7, 3, 1, 0, 7, 2,163, 0, 7, 3, 2, 0, 7, 0,211, 0, 4, 3, 3, 0, 2, 0, 20, 0, 2, 3, 4, 0, 2, 3, 5,
- 0, 2, 3, 6, 0, 2, 3, 7, 0, 2, 3, 8, 0, 2, 3, 9, 0, 2, 3, 10, 0, 2, 3, 11, 0, 2, 3, 12, 0, 2, 3, 13,
- 0, 2, 3, 14, 0, 4, 3, 15, 0, 4, 3, 16, 0, 4, 3, 17, 0, 4, 3, 18, 0, 7, 3, 19, 0, 7, 3, 20, 0, 7, 3, 21,
- 0, 7, 3, 22, 0, 7, 3, 23, 0, 7, 3, 24, 0, 7, 3, 25, 0, 7, 3, 26, 0, 7, 3, 27, 0, 7, 3, 28, 0, 7, 3, 29,
- 0, 7, 3, 30, 0, 0, 3, 31, 0, 0, 3, 32, 0, 0, 1,211, 0, 0, 3, 33, 0, 0, 3, 34, 0, 0, 3, 35, 0, 7, 3, 36,
- 0, 7, 3, 37, 0, 39, 0,125, 0, 12, 3, 38, 0, 12, 3, 39, 0, 12, 3, 40, 0, 12, 3, 41, 0, 7, 3, 42, 0, 2, 2, 71,
- 0, 2, 3, 43, 0, 7, 2, 52, 0, 4, 3, 44, 0, 4, 3, 45, 0,147, 3, 46, 0, 2, 3, 47, 0, 2, 0,218, 0, 7, 3, 48,
- 0, 12, 3, 49, 0, 12, 3, 50, 0, 12, 3, 51, 0, 12, 3, 52, 0,148, 3, 53, 0,149, 3, 54, 0, 63, 3, 55, 0, 2, 3, 56,
- 0, 2, 3, 57, 0, 2, 3, 58, 0, 2, 3, 59, 0, 7, 2, 44, 0, 2, 3, 60, 0, 2, 3, 61, 0,140, 3, 62, 0,129, 3, 63,
- 0,129, 3, 64, 0, 4, 3, 65, 0, 4, 3, 66, 0, 4, 3, 67, 0, 4, 0, 70, 0, 9, 0,162, 0, 12, 3, 68, 0,150, 0, 14,
- 0,150, 0, 0, 0,150, 0, 1, 0, 32, 0, 38, 0, 7, 2,163, 0, 7, 1, 9, 0, 7, 2,164, 0, 7, 2,157, 0, 0, 0, 17,
- 0, 4, 2,165, 0, 4, 2,166, 0, 4, 3, 69, 0, 2, 0, 18, 0, 2, 3, 70, 0, 7, 2,167, 0,148, 0, 36, 0, 2, 3, 71,
- 0, 2, 3, 72, 0, 2, 0, 20, 0, 2, 2,157, 0, 7, 3, 73, 0, 7, 3, 74, 0, 7, 3, 75, 0, 7, 3, 76, 0, 7, 3, 77,
- 0, 7, 3, 78, 0, 7, 3, 79, 0, 7, 3, 80, 0, 7, 3, 81, 0, 7, 3, 82, 0, 7, 3, 83, 0, 7, 3, 84, 0, 7, 3, 85,
- 0, 7, 3, 86, 0, 7, 3, 87, 0, 7, 3, 88, 0, 7, 3, 89, 0, 7, 3, 90, 0, 7, 3, 91, 0, 7, 3, 92, 0, 7, 3, 93,
- 0, 7, 3, 94, 0, 7, 3, 95, 0, 7, 3, 96, 0, 2, 3, 97, 0, 2, 3, 98, 0, 2, 3, 99, 0, 2, 3,100, 0, 51, 0,168,
- 0,151, 3,101, 0, 7, 3,102, 0, 4, 0, 37, 0,125, 0, 5, 0, 4, 0, 20, 0, 4, 3,103, 0, 4, 3,104, 0, 4, 3,105,
- 0, 4, 3,106, 0,152, 0, 1, 0, 7, 1,225, 0,147, 0, 30, 0, 4, 0, 20, 0, 7, 3,107, 0, 7, 3,108, 0, 7, 3,109,
- 0, 4, 3,110, 0, 4, 3,111, 0, 4, 3,112, 0, 4, 3,113, 0, 7, 3,114, 0, 7, 3,115, 0, 7, 3,116, 0, 7, 3,117,
- 0, 7, 3,118, 0, 7, 3,119, 0, 7, 3,120, 0, 7, 3,121, 0, 7, 3,122, 0, 7, 3,123, 0, 7, 3,124, 0, 7, 3,125,
- 0, 7, 3,126, 0, 7, 3,127, 0, 7, 3,128, 0, 7, 3,129, 0, 7, 3,130, 0, 7, 3,131, 0, 4, 3,132, 0, 4, 3,133,
- 0, 7, 3,134, 0, 7, 3, 27, 0,149, 0, 44, 0,136, 3,135, 0, 4, 3,136, 0, 4, 3,137, 0,153, 3,138, 0,154, 3,139,
- 0, 7, 0, 37, 0, 7, 3,140, 0, 7, 3,141, 0, 7, 3,142, 0, 7, 3,143, 0, 7, 3,144, 0, 7, 3,145, 0, 7, 3,146,
- 0, 7, 3,147, 0, 7, 3,148, 0, 7, 3,149, 0, 2, 3,150, 0, 2, 3,151, 0, 7, 3,152, 0, 7, 3,153, 0, 4, 0,130,
- 0, 4, 3,154, 0, 4, 3,155, 0, 2, 3,156, 0, 2, 3,157, 0,152, 3,158, 0, 4, 3,159, 0, 4, 0, 81, 0, 7, 3,160,
- 0, 7, 3,161, 0, 7, 3,162, 0, 7, 3,163, 0, 2, 3,164, 0, 2, 3,165, 0, 2, 3,166, 0, 2, 3,167, 0, 2, 3,168,
- 0, 2, 3,169, 0, 2, 3,170, 0, 2, 3,171, 0,155, 3,172, 0, 7, 3,173, 0, 7, 3,174, 0,125, 3,175, 0,140, 0, 48,
- 0, 2, 0, 18, 0, 2, 3,176, 0, 2, 3,177, 0, 2, 3,178, 0, 7, 3,179, 0, 2, 3,180, 0, 2, 3,181, 0, 7, 3,182,
- 0, 2, 3,183, 0, 2, 3,184, 0, 7, 3,185, 0, 7, 3,186, 0, 7, 3,187, 0, 7, 3,188, 0, 7, 3,189, 0, 7, 3,190,
- 0, 4, 3,191, 0, 7, 3,192, 0, 7, 3,193, 0, 7, 3,194, 0, 74, 3,195, 0, 74, 3,196, 0, 74, 3,197, 0, 0, 3,198,
- 0, 7, 3,199, 0, 7, 3,200, 0, 36, 0, 79, 0, 2, 3,201, 0, 0, 3,202, 0, 0, 3,203, 0, 7, 3,204, 0, 4, 3,205,
- 0, 7, 3,206, 0, 7, 3,207, 0, 4, 3,208, 0, 4, 0, 20, 0, 7, 3,209, 0, 7, 3,210, 0, 7, 3,211, 0, 78, 3,212,
- 0, 7, 3,213, 0, 7, 3,214, 0, 7, 3,215, 0, 7, 3,216, 0, 7, 3,217, 0, 7, 3,218, 0, 7, 3,219, 0, 4, 3,220,
- 0,156, 0, 71, 0, 27, 0, 31, 0, 2, 0,177, 0, 2, 1, 14, 0, 2, 1, 47, 0, 2, 3,221, 0, 7, 3,222, 0, 7, 3,223,
- 0, 7, 3,224, 0, 7, 3,225, 0, 7, 3,226, 0, 7, 3,227, 0, 7, 3,228, 0, 7, 3,229, 0, 7, 1, 84, 0, 7, 1, 86,
- 0, 7, 1, 85, 0, 7, 3,230, 0, 4, 3,231, 0, 7, 3,232, 0, 7, 3,233, 0, 7, 3,234, 0, 7, 3,235, 0, 7, 3,236,
- 0, 7, 3,237, 0, 7, 3,238, 0, 2, 3,239, 0, 2, 1, 13, 0, 2, 3,240, 0, 2, 3,241, 0, 2, 3,242, 0, 2, 3,243,
- 0, 2, 3,244, 0, 2, 3,245, 0, 7, 3,246, 0, 7, 3,247, 0, 7, 3,248, 0, 7, 3,249, 0, 7, 3,250, 0, 7, 3,251,
- 0, 7, 3,252, 0, 7, 3,253, 0, 7, 3,254, 0, 7, 3,255, 0, 7, 4, 0, 0, 7, 4, 1, 0, 2, 4, 2, 0, 2, 4, 3,
- 0, 2, 4, 4, 0, 2, 4, 5, 0, 7, 4, 6, 0, 7, 4, 7, 0, 7, 4, 8, 0, 7, 4, 9, 0, 2, 4, 10, 0, 2, 4, 11,
- 0, 2, 4, 12, 0, 2, 4, 13, 0, 7, 4, 14, 0, 7, 4, 15, 0, 7, 4, 16, 0, 7, 4, 17, 0, 2, 4, 18, 0, 2, 4, 19,
- 0, 2, 4, 20, 0, 2, 0, 43, 0, 7, 4, 21, 0, 7, 4, 22, 0, 36, 0, 79, 0, 50, 1, 77, 0, 30, 0,153, 0, 39, 0,125,
- 0,157, 0, 16, 0, 2, 4, 23, 0, 2, 4, 24, 0, 2, 4, 25, 0, 2, 0, 20, 0, 2, 4, 26, 0, 2, 4, 27, 0, 2, 4, 28,
- 0, 2, 4, 29, 0, 2, 4, 30, 0, 2, 4, 31, 0, 2, 4, 32, 0, 2, 4, 33, 0, 4, 4, 34, 0, 7, 4, 35, 0, 7, 4, 36,
- 0, 7, 4, 37, 0,158, 0, 8, 0,158, 0, 0, 0,158, 0, 1, 0, 4, 3, 3, 0, 4, 4, 38, 0, 4, 0, 20, 0, 2, 4, 39,
- 0, 2, 4, 40, 0, 32, 0,167, 0,159, 0, 13, 0, 9, 4, 41, 0, 9, 4, 42, 0, 4, 4, 43, 0, 4, 4, 44, 0, 4, 4, 45,
- 0, 4, 4, 46, 0, 4, 4, 47, 0, 4, 4, 48, 0, 4, 4, 49, 0, 4, 4, 50, 0, 4, 4, 51, 0, 4, 0, 37, 0, 0, 4, 52,
- 0,160, 0, 5, 0, 9, 4, 53, 0, 9, 4, 54, 0, 4, 4, 55, 0, 4, 0, 70, 0, 0, 4, 56, 0,161, 0, 13, 0, 4, 0, 18,
- 0, 4, 4, 57, 0, 4, 4, 58, 0, 4, 4, 59, 0, 4, 4, 60, 0, 4, 4, 61, 0, 4, 0, 93, 0, 4, 4, 62, 0, 4, 4, 63,
- 0, 4, 4, 64, 0, 4, 4, 65, 0, 4, 4, 66, 0, 26, 0, 30, 0,162, 0, 4, 0, 4, 4, 67, 0, 7, 4, 68, 0, 2, 0, 20,
- 0, 2, 2, 68, 0,163, 0, 11, 0,163, 0, 0, 0,163, 0, 1, 0, 0, 0, 17, 0, 62, 4, 69, 0, 63, 4, 70, 0, 4, 3, 3,
- 0, 4, 4, 71, 0, 4, 4, 72, 0, 4, 0, 37, 0, 4, 4, 73, 0, 4, 4, 74, 0,164, 0,130, 0,159, 4, 75, 0,160, 4, 76,
- 0,161, 4, 77, 0, 4, 4, 78, 0, 4, 0,130, 0, 4, 3,154, 0, 4, 4, 79, 0, 4, 4, 80, 0, 4, 4, 81, 0, 4, 4, 82,
- 0, 2, 0, 20, 0, 2, 4, 83, 0, 7, 3, 20, 0, 7, 4, 84, 0, 7, 4, 85, 0, 7, 4, 86, 0, 7, 4, 87, 0, 7, 4, 88,
- 0, 2, 4, 89, 0, 2, 4, 90, 0, 2, 4, 91, 0, 2, 4, 92, 0, 2, 0,217, 0, 2, 4, 93, 0, 2, 4, 94, 0, 2, 3,100,
- 0, 2, 4, 95, 0, 2, 4, 96, 0, 2, 1, 34, 0, 2, 0,109, 0, 2, 4, 97, 0, 2, 4, 98, 0, 2, 4, 99, 0, 2, 4,100,
- 0, 2, 4,101, 0, 2, 4,102, 0, 2, 4,103, 0, 2, 4,104, 0, 2, 4,105, 0, 2, 1, 35, 0, 2, 4,106, 0, 2, 4,107,
- 0, 2, 4,108, 0, 2, 4,109, 0, 4, 4,110, 0, 4, 1, 13, 0, 2, 4,111, 0, 2, 4,112, 0, 2, 4,113, 0, 2, 4,114,
- 0, 2, 4,115, 0, 2, 4,116, 0, 24, 4,117, 0, 24, 4,118, 0, 23, 4,119, 0, 12, 4,120, 0, 2, 4,121, 0, 2, 0, 37,
- 0, 7, 4,122, 0, 7, 4,123, 0, 7, 4,124, 0, 7, 4,125, 0, 7, 4,126, 0, 7, 4,127, 0, 7, 4,128, 0, 7, 4,129,
- 0, 7, 4,130, 0, 2, 4,131, 0, 2, 4,132, 0, 2, 4,133, 0, 2, 4,134, 0, 2, 4,135, 0, 2, 4,136, 0, 7, 4,137,
- 0, 7, 4,138, 0, 7, 4,139, 0, 2, 4,140, 0, 2, 4,141, 0, 2, 4,142, 0, 2, 4,143, 0, 2, 4,144, 0, 2, 4,145,
- 0, 2, 4,146, 0, 2, 4,147, 0, 2, 4,148, 0, 2, 4,149, 0, 4, 4,150, 0, 4, 4,151, 0, 4, 4,152, 0, 4, 4,153,
- 0, 4, 4,154, 0, 7, 4,155, 0, 4, 4,156, 0, 4, 4,157, 0, 4, 4,158, 0, 4, 4,159, 0, 7, 4,160, 0, 7, 4,161,
- 0, 7, 4,162, 0, 7, 4,163, 0, 7, 4,164, 0, 7, 4,165, 0, 7, 4,166, 0, 7, 4,167, 0, 7, 4,168, 0, 0, 4,169,
- 0, 0, 4,170, 0, 4, 4,171, 0, 2, 4,172, 0, 2, 1, 12, 0, 0, 4,173, 0, 7, 4,174, 0, 7, 4,175, 0, 4, 4,176,
- 0, 4, 4,177, 0, 7, 4,178, 0, 7, 4,179, 0, 2, 4,180, 0, 2, 4,181, 0, 7, 4,182, 0, 2, 4,183, 0, 2, 4,184,
- 0, 4, 4,185, 0, 2, 4,186, 0, 2, 4,187, 0, 2, 4,188, 0, 2, 4,189, 0, 7, 4,190, 0, 7, 0, 70, 0, 42, 4,191,
- 0,165, 0, 9, 0,165, 0, 0, 0,165, 0, 1, 0, 0, 0, 17, 0, 2, 4,192, 0, 2, 4,193, 0, 2, 4,194, 0, 2, 0, 43,
- 0, 7, 4,195, 0, 7, 0, 70, 0,166, 0, 5, 0, 7, 4,196, 0, 0, 0, 18, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 1, 12,
- 0,167, 0, 5, 0,167, 0, 0, 0,167, 0, 1, 0, 4, 4,197, 0, 0, 4,198, 0, 4, 0, 20, 0,168, 0, 5, 0,169, 4,199,
- 0, 2, 0, 20, 0, 2, 4,200, 0, 2, 4,201, 0, 2, 4,202, 0,170, 0, 4, 0, 2, 0,109, 0, 2, 2,134, 0, 2, 4,203,
- 0, 2, 4,204, 0,171, 0, 7, 0, 2, 0, 20, 0, 2, 4,205, 0, 2, 4,206, 0, 2, 4,207, 0,170, 4,208, 0, 7, 4,209,
- 0, 4, 4,210, 0,172, 0, 4, 0,172, 0, 0, 0,172, 0, 1, 0, 0, 4,211, 0, 7, 4,212, 0,173, 0, 56, 0, 2, 4,213,
- 0, 2, 4,214, 0, 7, 4,215, 0, 7, 4,216, 0, 2, 4,203, 0, 2, 4,217, 0, 7, 4,218, 0, 7, 4,219, 0, 2, 4,220,
- 0, 2, 4,221, 0, 2, 4,222, 0, 2, 4,223, 0, 7, 4,224, 0, 7, 4,225, 0, 7, 4,226, 0, 7, 0, 37, 0, 2, 4,227,
- 0, 2, 4,228, 0, 2, 4,229, 0, 2, 4,230, 0,168, 4,231, 0,171, 4,232, 0, 7, 4,233, 0, 7, 4,234, 0, 0, 4,235,
- 0, 0, 4,236, 0, 0, 4,237, 0, 0, 4,238, 0, 0, 4,239, 0, 0, 4,240, 0, 2, 4,241, 0, 7, 4,242, 0, 7, 4,243,
- 0, 7, 4,244, 0, 7, 4,245, 0, 7, 4,246, 0, 7, 4,247, 0, 7, 4,248, 0, 7, 4,249, 0, 7, 4,250, 0, 7, 4,251,
- 0, 2, 4,252, 0, 0, 4,253, 0, 0, 4,254, 0, 0, 4,255, 0, 0, 5, 0, 0, 32, 5, 1, 0, 0, 5, 2, 0, 0, 5, 3,
- 0, 0, 5, 4, 0, 0, 5, 5, 0, 0, 5, 6, 0, 0, 5, 7, 0, 0, 5, 8, 0, 0, 5, 9, 0, 0, 5, 10, 0,174, 0, 6,
- 0, 2, 0,109, 0, 0, 2,134, 0, 0, 5, 11, 0, 0, 5, 12, 0, 0, 0, 20, 0, 0, 0,182, 0,175, 0, 26, 0,176, 5, 13,
- 0, 50, 1, 77, 0, 60, 5, 14, 0,174, 5, 15, 0,174, 5, 16, 0,174, 5, 17, 0,174, 5, 18, 0,174, 5, 19, 0,174, 5, 20,
- 0,174, 5, 21, 0, 7, 5, 22, 0, 2, 5, 23, 0, 2, 1, 47, 0, 2, 5, 24, 0, 2, 2, 1, 0, 0, 5, 25, 0, 0, 5, 26,
- 0, 0, 5, 27, 0, 0, 5, 28, 0, 0, 0, 93, 0, 0, 5, 29, 0, 0, 5, 30, 0, 0, 5, 31, 0, 0, 5, 32, 0, 0, 5, 33,
- 0, 0, 0,182, 0,177, 0, 43, 0, 27, 0, 31, 0, 32, 5, 34, 0,156, 5, 35, 0,177, 5, 36, 0, 46, 0,209, 0, 12, 5, 37,
- 0,158, 5, 38, 0, 7, 5, 39, 0, 7, 5, 40, 0, 7, 5, 41, 0, 7, 5, 42, 0, 4, 3, 3, 0, 7, 5, 43, 0, 2, 5, 44,
- 0, 2, 5, 45, 0, 2, 5, 46, 0, 2, 5, 47, 0, 2, 5, 48, 0, 2, 5, 49, 0, 2, 5, 50, 0, 2, 1, 5, 0, 57, 1, 1,
- 0, 9, 5, 51, 0,157, 5, 52, 0,166, 5, 53, 0,173, 5, 54, 0,164, 0,183, 0,162, 5, 55, 0, 39, 0,125, 0, 12, 0,103,
- 0, 12, 5, 56, 0, 2, 5, 57, 0, 2, 5, 58, 0, 2, 5, 59, 0, 2, 5, 60, 0,178, 5, 61, 0, 2, 5, 62, 0, 2, 5, 63,
- 0, 2, 1, 64, 0, 2, 0,218, 0,175, 5, 64, 0, 4, 5, 65, 0, 4, 0, 37, 0,179, 0, 9, 0, 46, 0,209, 0, 45, 1, 0,
- 0, 7, 2, 8, 0, 7, 2, 9, 0, 7, 0,109, 0, 7, 5, 66, 0, 7, 5, 67, 0, 2, 5, 68, 0, 2, 5, 69, 0,180, 0, 75,
- 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0, 7, 5, 74, 0, 7, 5, 75,
- 0, 7, 5, 76, 0, 7, 5, 77, 0, 7, 5, 78, 0, 7, 5, 79, 0, 7, 5, 80, 0, 7, 1, 20, 0, 7, 5, 81, 0, 4, 5, 82,
- 0, 2, 5, 83, 0, 2, 5, 12, 0, 32, 5, 34, 0, 32, 5, 84, 0,179, 5, 85, 0,180, 5, 86, 0,183, 5, 87, 0,184, 5, 88,
- 0,185, 5, 89, 0, 0, 5, 90, 0, 2, 4, 25, 0, 2, 5, 91, 0, 4, 3, 3, 0, 4, 5, 92, 0, 2, 5, 93, 0, 2, 5, 94,
- 0, 2, 5, 95, 0, 0, 5, 96, 0, 0, 0, 43, 0, 7, 0,115, 0, 7, 5, 97, 0, 7, 5, 98, 0, 7, 5, 99, 0, 7, 5,100,
- 0, 7, 5,101, 0, 7, 5,102, 0, 7, 5,103, 0, 7, 0,174, 0, 7, 5, 39, 0, 2, 5,104, 0, 2, 5,105, 0, 2, 5,106,
- 0, 2, 5,107, 0, 2, 0,137, 0, 2, 5, 24, 0, 2, 5,108, 0, 2, 5,109, 0, 2, 5,110, 0, 2, 5,111, 0, 7, 5,112,
- 0, 7, 5,113, 0, 67, 5,114, 0, 12, 5,115, 0, 2, 5,116, 0, 2, 2, 53, 0, 2, 5,117, 0, 2, 0, 20, 0, 2, 5,118,
- 0, 2, 5,119, 0, 2, 5,120, 0, 0, 5,121, 0, 0, 5,122, 0, 9, 5,123, 0,186, 5,124, 0, 7, 5,125, 0, 2, 5,126,
- 0, 2, 5,127, 0, 2, 5, 48, 0, 2, 5, 49, 0,187, 0, 19, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 5,128, 0, 23, 5,129,
- 0, 23, 5,130, 0, 7, 5,131, 0, 7, 5,132, 0, 7, 5,133, 0, 7, 5,134, 0, 2, 5,135, 0, 2, 5,136, 0, 2, 5,137,
- 0, 2, 5,138, 0, 2, 5,139, 0, 2, 5,140, 0, 4, 0, 20, 0, 7, 5,141, 0, 2, 5, 94, 0, 0, 2,107, 0,181, 0, 6,
- 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,188, 0, 6, 0,181, 0, 0,
- 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,189, 0, 27, 0,181, 0, 0, 0,181, 0, 1,
- 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0, 4, 5,142, 0, 4, 0, 70, 0,187, 5,143, 0, 9, 5,144,
- 0, 12, 5,145, 0, 36, 0, 79, 0, 27, 0, 80, 0, 0, 5,146, 0, 0, 5,147, 0, 0, 5,148, 0, 2, 5,149, 0, 2, 5,150,
- 0, 2, 5,151, 0, 2, 5,152, 0, 2, 0, 65, 0, 2, 0, 46, 0, 2, 0,137, 0, 2, 5,153, 0, 4, 0, 20, 0, 7, 5,154,
- 0, 24, 0, 36, 0,190, 0, 29, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0,183, 5, 87,
- 0, 2, 5, 73, 0, 2, 5,155, 0, 2, 5,156, 0, 2, 5,157, 0, 2, 5,158, 0,187, 5,143, 0, 2, 5,159, 0, 2, 0,137,
- 0, 2, 5,150, 0, 2, 5,160, 0, 9, 5,161, 0, 2, 5, 24, 0, 0, 5,162, 0, 0, 5,163, 0, 2, 5,164, 0, 2, 5,165,
- 0, 2, 3, 12, 0, 2, 5,166, 0, 2, 5,167, 0, 0, 0, 37, 0, 0, 0, 20, 0, 0, 1, 47, 0, 0, 5,168, 0,191, 0, 16,
- 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,187, 5,143, 0, 7, 2, 8,
- 0, 7, 2, 9, 0, 2, 5,159, 0, 2, 5,169, 0, 2, 5,170, 0, 2, 5,171, 0, 4, 0, 20, 0, 7, 5, 66, 0,186, 5,124,
- 0,192, 0, 33, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,193, 5,172,
- 0, 4, 5,173, 0, 0, 5,174, 0, 0, 5,175, 0, 0, 5,176, 0, 2, 0, 18, 0, 2, 5,177, 0, 2, 0, 20, 0, 2, 5,178,
- 0, 2, 5,179, 0, 2, 5,180, 0, 2, 5,181, 0, 2, 0, 43, 0, 4, 0, 70, 0, 0, 5,182, 0,194, 5,183, 0, 2, 5,184,
- 0, 2, 5,185, 0, 2, 5,186, 0, 2, 0,208, 0, 9, 5,187, 0, 9, 5,188, 0, 9, 5,189, 0, 9, 5,190, 0, 9, 5,191,
- 0, 2, 5,192, 0, 0, 5,193, 0,195, 0, 23, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72,
- 0, 2, 5, 73, 0,187, 5,143, 0, 12, 5,194, 0, 2, 5,150, 0, 2, 5,195, 0, 2, 0, 20, 0, 2, 0, 57, 0, 9, 5,161,
- 0, 12, 5,196, 0,196, 5,197, 0, 0, 5,198, 0,197, 5,199, 0, 4, 5,200, 0, 4, 5,201, 0, 2, 0, 18, 0, 2, 5,202,
- 0, 2, 5,203, 0, 2, 5,204, 0,198, 0, 29, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72,
- 0, 2, 5, 73, 0,187, 5,143, 0, 46, 2,142, 0, 45, 1, 0, 0, 60, 5, 14, 0, 2, 1, 13, 0, 2, 0,137, 0, 2, 5,205,
- 0, 2, 5,206, 0, 4, 0, 20, 0, 2, 5, 44, 0, 2, 5,207, 0, 2, 5,153, 0, 2, 5,150, 0, 7, 5, 66, 0, 0, 5,208,
- 0, 0, 5,209, 0, 0, 5,210, 0, 0, 5,211, 0, 7, 2, 8, 0, 7, 2, 9, 0, 7, 5,212, 0, 7, 5,213, 0,186, 5,124,
- 0,199, 0, 11, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0, 2, 0,137,
- 0, 2, 5,153, 0, 2, 5,214, 0, 2, 0, 20, 0,187, 5,143, 0,200, 0, 24, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70,
- 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0, 42, 5,215, 0, 4, 5,216, 0, 4, 5,217, 0, 2, 0, 93, 0, 2, 0,137,
- 0, 4, 5,218, 0, 4, 5,219, 0, 4, 5,220, 0, 4, 5,221, 0, 4, 5,222, 0, 4, 5,223, 0, 4, 5,224, 0, 4, 5,225,
- 0, 7, 5,226, 0, 23, 5,227, 0, 23, 5,228, 0, 4, 5,229, 0, 4, 5,230, 0,201, 0, 10, 0, 27, 0, 31, 0, 9, 5,231,
- 0, 9, 5,232, 0, 9, 5,233, 0, 9, 5,234, 0, 9, 5,235, 0, 4, 0, 93, 0, 4, 5,236, 0, 0, 5,237, 0, 0, 5,238,
- 0,202, 0, 10, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0,201, 5,239, 0, 2, 0, 93,
- 0, 2, 0,137, 0, 4, 0, 43, 0, 9, 5,240, 0,203, 0, 8, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71,
- 0,182, 5, 72, 0,187, 5,143, 0, 4, 0, 20, 0, 4, 5,241, 0,204, 0, 21, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70,
- 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,187, 5,143, 0, 27, 5,242, 0, 27, 0, 80, 0, 2, 0, 20, 0, 2, 0,137,
- 0, 7, 5,243, 0, 9, 5,244, 0, 7, 2, 8, 0, 7, 2, 9, 0, 57, 1, 1, 0, 57, 5,245, 0, 4, 5,246, 0, 2, 5,162,
- 0, 2, 0, 37, 0,186, 5,124, 0,205, 0, 42, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72,
- 0, 2, 5, 73, 0,187, 5,143, 0,206, 5,247, 0, 0, 5,174, 0, 0, 5,175, 0, 0, 5,176, 0, 2, 0, 18, 0, 2, 5,185,
- 0, 2, 0, 20, 0, 2, 5,178, 0, 9, 5,244, 0, 4, 5,248, 0, 4, 5,249, 0, 4, 5,250, 0, 4, 5,251, 0, 23, 5,252,
- 0, 23, 5,253, 0, 7, 5,254, 0, 7, 5,255, 0, 7, 6, 0, 0, 7, 5,243, 0, 2, 5,184, 0, 2, 0,208, 0, 2, 1,102,
- 0, 2, 6, 1, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 6, 2, 0, 2, 6, 3, 0, 9, 5,187, 0, 9, 5,188, 0, 9, 5,189,
- 0, 9, 5,190, 0, 9, 5,191, 0, 2, 5,192, 0, 0, 5,193, 0, 56, 6, 4, 0,207, 0, 20, 0, 0, 6, 5, 0, 0, 6, 6,
- 0, 0, 6, 7, 0, 0, 6, 8, 0, 0, 6, 9, 0, 0, 6, 10, 0, 0, 6, 11, 0, 0, 6, 12, 0, 0, 6, 13, 0, 0, 6, 14,
- 0, 0, 6, 15, 0, 0, 6, 16, 0, 0, 6, 17, 0, 0, 6, 18, 0, 0, 6, 19, 0, 0, 6, 20, 0, 0, 6, 21, 0, 0, 6, 22,
- 0, 0, 2, 68, 0, 0, 6, 23, 0,208, 0, 54, 0, 0, 6, 24, 0, 0, 6, 15, 0, 0, 6, 16, 0, 0, 6, 25, 0, 0, 6, 26,
- 0, 0, 6, 27, 0, 0, 6, 28, 0, 0, 6, 29, 0, 0, 6, 30, 0, 0, 6, 31, 0, 0, 6, 32, 0, 0, 6, 33, 0, 0, 6, 34,
- 0, 0, 6, 35, 0, 0, 6, 36, 0, 0, 6, 37, 0, 0, 6, 38, 0, 0, 6, 39, 0, 0, 6, 40, 0, 0, 6, 41, 0, 0, 6, 42,
- 0, 0, 6, 43, 0, 0, 6, 44, 0, 0, 6, 45, 0, 0, 6, 46, 0, 0, 6, 47, 0, 0, 6, 48, 0, 0, 6, 49, 0, 0, 6, 50,
- 0, 0, 6, 51, 0, 0, 6, 52, 0, 0, 6, 53, 0, 0, 0, 95, 0, 0, 6, 54, 0, 0, 6, 55, 0, 0, 6, 56, 0, 0, 6, 57,
- 0, 0, 6, 58, 0, 0, 6, 59, 0, 0, 6, 60, 0, 0, 6, 61, 0, 0, 6, 62, 0, 0, 6, 63, 0, 0, 6, 64, 0, 0, 6, 65,
- 0, 0, 6, 66, 0, 0, 6, 67, 0, 0, 6, 68, 0, 0, 6, 69, 0, 0, 6, 70, 0, 0, 6, 71, 0, 0, 6, 72, 0, 0, 6, 73,
- 0, 0, 6, 74, 0,209, 0, 5, 0, 0, 6, 75, 0, 0, 6, 32, 0, 0, 6, 34, 0, 2, 0, 20, 0, 2, 0, 37, 0,210, 0, 22,
- 0,210, 0, 0, 0,210, 0, 1, 0, 0, 0, 17, 0,207, 6, 76, 0,208, 6, 77, 0,208, 6, 78, 0,208, 6, 79, 0,208, 6, 80,
- 0,208, 6, 81, 0,208, 6, 82, 0,208, 6, 83, 0,208, 6, 84, 0,208, 6, 85, 0,208, 6, 86, 0,208, 6, 87, 0,208, 6, 88,
- 0,208, 6, 89, 0,208, 6, 90, 0,208, 6, 91, 0,209, 6, 92, 0, 0, 6, 93, 0, 0, 6, 94, 0,211, 0, 5, 0, 4, 0, 20,
- 0, 4, 0, 37, 0, 7, 2, 52, 0, 7, 6, 95, 0, 7, 1,225, 0,212, 0, 66, 0, 4, 0, 20, 0, 4, 6, 96, 0, 4, 6, 97,
- 0, 0, 6, 98, 0, 0, 6, 99, 0, 0, 6,100, 0, 0, 6,101, 0, 0, 6,102, 0, 0, 6,103, 0, 0, 6,104, 0, 0, 6,105,
- 0, 0, 6,106, 0, 2, 6,107, 0, 2, 6,108, 0, 4, 6,109, 0, 4, 6,110, 0, 4, 6,111, 0, 4, 6,112, 0, 2, 6,113,
- 0, 2, 6,114, 0, 2, 6,115, 0, 2, 6,116, 0, 4, 6,117, 0, 4, 6,118, 0, 2, 6,119, 0, 2, 6,120, 0, 2, 6,121,
- 0, 2, 6,122, 0, 0, 6,123, 0, 12, 6,124, 0, 2, 6,125, 0, 2, 6,126, 0, 2, 6,127, 0, 2, 6,128, 0, 2, 6,129,
- 0, 2, 6,130, 0, 2, 6,131, 0, 2, 6,132, 0,211, 6,133, 0, 2, 6,134, 0, 2, 6,135, 0, 2, 6,136, 0, 2, 6,137,
- 0, 4, 6,138, 0, 4, 6,139, 0, 4, 6,140, 0, 4, 6,141, 0, 2, 6,142, 0, 2, 6,143, 0, 2, 6,144, 0, 2, 6,145,
- 0, 2, 6,146, 0, 2, 6,147, 0, 2, 6,148, 0, 2, 6,149, 0, 2, 6,150, 0, 2, 6,151, 0, 2, 6,152, 0, 2, 0, 37,
- 0, 0, 6,153, 0, 0, 6,154, 0, 0, 6,155, 0, 7, 6,156, 0, 2, 5, 50, 0, 2, 6,157, 0, 54, 6,158, 0,213, 0, 18,
- 0, 27, 0, 31, 0, 12, 6,159, 0, 12, 6,160, 0, 12, 6,161, 0,177, 6,162, 0, 2, 2,151, 0, 2, 6,163, 0, 2, 2,152,
- 0, 2, 6,164, 0, 2, 6,165, 0, 2, 6,166, 0, 2, 6,167, 0, 2, 6,168, 0, 2, 6,169, 0, 2, 0, 37, 0, 2, 6,170,
- 0, 2, 6,171, 0, 2, 6,172, 0,214, 0, 5, 0,214, 0, 0, 0,214, 0, 1, 0,214, 6,173, 0, 13, 6,174, 0, 4, 0, 20,
- 0,215, 0, 7, 0,215, 0, 0, 0,215, 0, 1, 0,214, 6,175, 0,214, 6,176, 0, 2, 4,118, 0, 2, 0, 20, 0, 4, 0, 37,
- 0,216, 0, 17, 0,216, 0, 0, 0,216, 0, 1, 0, 0, 6,177, 0, 0, 6,178, 0, 0, 6,179, 0, 2, 6,180, 0, 2, 6,181,
- 0, 2, 6,165, 0, 2, 6,166, 0, 2, 0, 20, 0, 2, 3, 70, 0, 2, 6,182, 0, 2, 6,183, 0, 2, 6,184, 0, 2, 6,185,
- 0, 4, 6,186, 0,216, 6,187, 0,182, 0, 30, 0,182, 0, 0, 0,182, 0, 1, 0,214, 6,175, 0,214, 6,176, 0,214, 6,188,
- 0,214, 6,189, 0,213, 6,190, 0, 7, 6,191, 0, 23, 0, 52, 0, 23, 6,192, 0, 23, 6,193, 0, 2, 6,194, 0, 2, 6,195,
- 0, 2, 6,196, 0, 0, 5, 70, 0, 0, 6,197, 0, 2, 6,198, 0, 2, 6,199, 0, 0, 6,200, 0, 0, 6,201, 0, 0, 6,202,
- 0, 0, 6,203, 0, 2, 6,204, 0, 2, 6,205, 0, 2, 6,206, 0, 2, 0, 20, 0, 39, 0,125, 0, 12, 6,207, 0, 12, 6,208,
- 0, 12, 6,209, 0,217, 0, 11, 0, 0, 6,210, 0, 2, 6,211, 0, 2, 6,212, 0, 2, 6,213, 0, 2, 6,214, 0, 2, 6,215,
- 0, 2, 4,102, 0, 9, 6,216, 0, 9, 6,217, 0, 4, 6,218, 0, 4, 6,219, 0,218, 0, 1, 0, 0, 6,220, 0,219, 0, 8,
- 0, 56, 6,221, 0, 56, 6,222, 0,219, 6,223, 0,219, 6,224, 0,219, 6,225, 0, 2, 0,133, 0, 2, 0, 20, 0, 4, 6,226,
- 0,220, 0, 4, 0, 4, 5,216, 0, 4, 6,227, 0, 4, 5,220, 0, 4, 6,228, 0,221, 0, 2, 0, 4, 6,229, 0, 4, 6,230,
- 0,222, 0, 7, 0, 7, 6,231, 0, 7, 6,232, 0, 7, 6,233, 0, 4, 0, 20, 0, 4, 0, 37, 0, 7, 3,232, 0, 7, 6,234,
- 0,223, 0, 3, 0, 0, 6,235, 0, 0, 5,176, 0, 48, 0,140, 0,224, 0, 21, 0,224, 0, 0, 0,224, 0, 1, 0, 4, 0, 57,
- 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 6,236, 0, 4, 6,237, 0, 4, 6,238, 0,218, 6,239, 0, 0, 6,235, 0, 4, 6,240,
- 0, 4, 6,241, 0,223, 2,244, 0,220, 6,242, 0,221, 6,243, 0,222, 6,244, 0,219, 6,245, 0,219, 6,246, 0,219, 6,247,
- 0, 56, 6,248, 0, 56, 6,249, 0,225, 0, 12, 0, 0, 1,188, 0, 9, 0,194, 0, 0, 0,195, 0, 4, 0,198, 0, 4, 0,206,
- 0, 9, 0,199, 0, 7, 0,201, 0, 7, 0,202, 0, 9, 6,250, 0, 9, 6,251, 0, 9, 0,203, 0, 9, 0,205, 0,226, 0, 45,
- 0,226, 0, 0, 0,226, 0, 1, 0, 9, 6,252, 0, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 20, 0, 4, 0, 18, 0, 4, 0, 23,
- 0, 4, 0, 91, 0, 4, 6,253, 0, 4, 6,254, 0, 4, 6,237, 0, 4, 6,238, 0, 4, 6,255, 0, 4, 0,217, 0, 4, 7, 0,
- 0, 4, 7, 1, 0, 7, 7, 2, 0, 7, 7, 3, 0, 4, 0,130, 0, 4, 7, 4, 0,224, 7, 5, 0, 36, 0, 79, 0,177, 6,162,
- 0, 48, 0,140, 0, 7, 7, 6, 0, 7, 7, 7, 0,225, 1, 2, 0,226, 7, 8, 0,226, 7, 9, 0,226, 7, 10, 0, 12, 7, 11,
- 0,227, 7, 12, 0,228, 7, 13, 0, 7, 7, 14, 0, 7, 7, 15, 0, 4, 7, 16, 0, 7, 7, 17, 0, 9, 7, 18, 0, 4, 7, 19,
- 0, 4, 7, 20, 0, 4, 7, 21, 0, 7, 7, 22, 0, 4, 6,167, 0, 4, 0, 37, 0,229, 0, 4, 0,229, 0, 0, 0,229, 0, 1,
- 0, 12, 7, 23, 0,226, 7, 24, 0,230, 0, 6, 0, 12, 7, 25, 0, 12, 7, 11, 0, 12, 7, 26, 0, 2, 0, 20, 0, 2, 0, 37,
- 0, 4, 0, 57, 0,231, 0, 4, 0, 7, 7, 27, 0, 7, 0,112, 0, 2, 7, 28, 0, 2, 7, 29, 0,232, 0, 6, 0, 7, 7, 30,
- 0, 7, 7, 31, 0, 7, 7, 32, 0, 7, 7, 33, 0, 4, 7, 34, 0, 4, 7, 35, 0,233, 0, 12, 0, 7, 7, 36, 0, 7, 7, 37,
- 0, 7, 7, 38, 0, 7, 7, 39, 0, 7, 7, 40, 0, 7, 7, 41, 0, 7, 7, 42, 0, 7, 7, 43, 0, 7, 7, 44, 0, 7, 7, 45,
- 0, 4, 2,146, 0, 4, 7, 46, 0,234, 0, 2, 0, 7, 4,196, 0, 7, 0, 37, 0,235, 0, 5, 0, 7, 7, 47, 0, 7, 7, 48,
- 0, 4, 0, 93, 0, 4, 2,108, 0, 4, 7, 49, 0,236, 0, 6, 0,236, 0, 0, 0,236, 0, 1, 0, 2, 0, 18, 0, 2, 0, 20,
- 0, 2, 7, 50, 0, 2, 0, 57, 0,237, 0, 8, 0,237, 0, 0, 0,237, 0, 1, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 7, 50,
- 0, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,130, 0,238, 0, 45, 0,238, 0, 0, 0,238, 0, 1, 0, 2, 0, 18, 0, 2, 0, 20,
- 0, 2, 7, 50, 0, 2, 0,213, 0, 2, 3,150, 0, 2, 7, 51, 0, 7, 7, 52, 0, 7, 0, 92, 0, 7, 2,159, 0, 4, 7, 53,
- 0, 4, 0, 81, 0, 4, 2,110, 0, 7, 7, 54, 0, 7, 7, 55, 0, 7, 7, 56, 0, 7, 7, 57, 0, 7, 7, 58, 0, 7, 7, 59,
- 0, 7, 2,156, 0, 7, 0,255, 0, 7, 7, 60, 0, 7, 7, 61, 0, 7, 0, 37, 0, 7, 7, 62, 0, 7, 7, 63, 0, 7, 7, 64,
- 0, 2, 7, 65, 0, 2, 7, 66, 0, 2, 7, 67, 0, 2, 7, 68, 0, 2, 7, 69, 0, 2, 7, 70, 0, 2, 7, 71, 0, 2, 7, 72,
- 0, 2, 5,118, 0, 2, 7, 73, 0, 2, 1,209, 0, 2, 7, 74, 0, 0, 7, 75, 0, 0, 7, 76, 0, 7, 0,211, 0,239, 7, 77,
- 0, 63, 1,161, 0,240, 0, 16, 0,240, 0, 0, 0,240, 0, 1, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 7, 50, 0, 2, 0,213,
- 0, 7, 2,151, 0, 7, 2,152, 0, 7, 2,153, 0, 7, 1,251, 0, 7, 2,154, 0, 7, 2,155, 0, 7, 7, 78, 0, 7, 2,156,
- 0, 7, 2,158, 0, 7, 2,159, 0,197, 0, 5, 0, 2, 0, 18, 0, 2, 6,226, 0, 2, 0, 20, 0, 2, 7, 79, 0, 27, 5,242,
- 0,196, 0, 3, 0, 4, 0, 69, 0, 4, 7, 80, 0,197, 0, 2, 0,241, 0, 12, 0,241, 0, 0, 0,241, 0, 1, 0, 2, 0, 18,
- 0, 2, 0, 20, 0, 2, 3, 31, 0, 2, 1,224, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 7, 81, 0, 7, 7, 82, 0, 27, 5,242,
- 0, 12, 7, 83, 0,242, 0, 11, 0,242, 0, 0, 0,242, 0, 1, 0, 0, 0, 17, 0, 2, 0, 18, 0, 2, 7, 84, 0, 4, 0, 22,
- 0, 4, 7, 85, 0, 2, 0, 20, 0, 2, 0, 37, 0, 9, 7, 86, 0, 9, 7, 87, 0,243, 0, 5, 0, 0, 0, 17, 0, 7, 1, 20,
- 0, 7, 7, 88, 0, 4, 7, 89, 0, 4, 0, 37, 0,244, 0, 4, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 0, 43, 0, 2, 0, 70,
- 0,245, 0, 4, 0, 0, 0, 17, 0, 62, 7, 90, 0, 7, 1, 20, 0, 7, 0, 37, 0,246, 0, 6, 0, 2, 7, 91, 0, 2, 7, 92,
- 0, 2, 0, 18, 0, 2, 7, 93, 0, 0, 7, 94, 0, 0, 7, 95, 0,247, 0, 5, 0, 4, 0, 18, 0, 4, 0, 37, 0, 0, 0, 17,
- 0, 0, 7, 96, 0, 0, 7, 97, 0,248, 0, 3, 0, 4, 0, 18, 0, 4, 0, 37, 0, 0, 0, 17, 0,249, 0, 4, 0, 2, 7, 98,
- 0, 2, 7, 99, 0, 2, 0, 20, 0, 2, 0, 37, 0,250, 0, 6, 0, 0, 0, 17, 0, 0, 7,100, 0, 2, 7,101, 0, 2, 2,156,
- 0, 2, 1, 13, 0, 2, 0, 70, 0,251, 0, 5, 0, 0, 0, 17, 0, 7, 0,112, 0, 7, 3,234, 0, 2, 0, 20, 0, 2, 2,122,
- 0,252, 0, 3, 0, 0, 0, 17, 0, 4, 2,110, 0, 4, 7, 98, 0,253, 0, 7, 0, 0, 0, 17, 0, 7, 3,234, 0, 0, 7,102,
- 0, 0, 7,103, 0, 2, 1, 13, 0, 2, 0, 43, 0, 4, 7,104, 0,254, 0, 3, 0, 32, 7,105, 0, 0, 7,106, 0, 0, 7,107,
- 0,255, 0, 18, 0,255, 0, 0, 0,255, 0, 1, 0, 2, 0, 18, 0, 2, 7, 84, 0, 2, 0, 20, 0, 2, 7,108, 0, 2, 7,109,
- 0, 2, 7,110, 0, 2, 0, 43, 0, 2, 0, 70, 0, 0, 0, 17, 0, 9, 0, 2, 1, 0, 7,111, 0, 32, 0, 45, 0, 2, 4,204,
- 0, 2, 7, 14, 0, 2, 7,112, 0, 2, 0, 37, 1, 1, 0, 11, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 7,113, 0, 2, 0, 20,
- 0, 2, 2,122, 0, 2, 7,114, 0, 4, 7,115, 0, 4, 7,116, 0, 4, 7,117, 0, 4, 7,118, 0, 4, 7,119, 1, 2, 0, 1,
- 0, 0, 7,120, 1, 3, 0, 4, 0, 42, 5,215, 0, 0, 7,121, 0, 4, 1, 13, 0, 4, 0, 20, 1, 0, 0, 18, 1, 0, 0, 0,
- 1, 0, 0, 1, 1, 0, 7,122, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 7,123, 0, 2, 7,110, 0, 2, 7, 84, 0, 2, 7,124,
- 0, 2, 0, 70, 0, 2, 1, 12, 0, 0, 0, 17, 0, 9, 0, 2, 1, 4, 7,111, 0,255, 7,125, 0, 2, 0, 15, 0, 2, 7,126,
- 0, 4, 7,127, 1, 5, 0, 3, 0, 4, 2,182, 0, 4, 0, 37, 0, 32, 0, 45, 1, 6, 0, 12, 0,145, 7,128, 0, 2, 0, 18,
- 0, 2, 0, 20, 0, 4, 7, 52, 0, 4, 0, 92, 0, 0, 0, 17, 0, 0, 7,129, 0, 2, 7,130, 0, 2, 7,131, 0, 2, 7,132,
- 0, 2, 7,133, 0, 7, 7,134, 1, 7, 0, 10, 0, 2, 0, 20, 0, 2, 7,135, 0, 4, 7, 52, 0, 4, 0, 92, 0, 2, 7,136,
- 0,227, 7, 12, 0, 2, 0, 18, 0, 2, 7,137, 0, 2, 7,138, 0, 2, 7,139, 1, 8, 0, 7, 0, 2, 0, 20, 0, 2, 7,135,
- 0, 4, 7, 52, 0, 4, 0, 92, 0, 2, 0, 18, 0, 2, 7,140, 0, 7, 3,109, 1, 9, 0, 11, 0, 4, 2,182, 0, 2, 0, 18,
- 0, 2, 0, 20, 0, 32, 0, 45, 0, 74, 7,141, 0, 0, 0, 17, 0, 7, 7,142, 0, 7, 7,143, 0, 7, 3, 21, 0, 2, 7,144,
- 0, 2, 7,145, 1, 10, 0, 5, 0, 2, 0, 18, 0, 2, 0, 20, 0, 4, 0, 37, 0,177, 6,162, 0, 32, 5, 34, 1, 11, 0, 5,
- 0, 4, 0, 20, 0, 4, 0, 18, 0, 0, 0, 17, 0, 0, 7, 96, 0, 32, 0, 45, 1, 12, 0, 13, 0, 2, 0, 20, 0, 2, 0, 18,
- 0, 2, 7, 84, 0, 2, 3, 22, 0, 7, 7,146, 0, 7, 7,147, 0, 7, 1, 7, 0, 7, 1, 8, 0, 7, 2,253, 0, 7, 3, 0,
- 0, 7, 7,148, 0, 7, 7,149, 0, 32, 7,150, 1, 13, 0, 10, 0, 2, 0, 20, 0, 2, 0, 18, 0, 4, 7, 52, 0, 4, 0, 92,
- 0, 0, 0, 17, 0, 0, 7,129, 0, 2, 0, 43, 0, 2, 0, 64, 0, 2, 7,151, 0, 2, 7,152, 1, 14, 0, 8, 0, 32, 0, 45,
- 0, 7, 2,153, 0, 7, 7,153, 0, 7, 7,154, 0, 7, 2,148, 0, 2, 0, 20, 0, 2, 2,122, 0, 7, 7,155, 1, 15, 0, 12,
- 0, 2, 0, 18, 0, 2, 1, 13, 0, 2, 0, 20, 0, 2, 2,156, 0, 2, 2,182, 0, 2, 7,156, 0, 4, 0, 37, 0, 7, 7,157,
- 0, 7, 7,158, 0, 7, 7,159, 0, 7, 7,160, 0, 0, 7,161, 1, 16, 0, 10, 0, 2, 0, 20, 0, 2, 0, 18, 0, 4, 7, 52,
- 0, 4, 0, 92, 0, 0, 0, 17, 0, 2, 2, 68, 0, 2, 0, 64, 0, 2, 7,151, 0, 2, 7,152, 0, 63, 1,161, 1, 17, 0, 7,
- 0, 4, 2,110, 0, 4, 7,162, 0, 4, 7,163, 0, 4, 7,164, 0, 7, 7,165, 0, 7, 7,166, 0, 0, 7,102, 1, 18, 0, 7,
- 0, 0, 7,167, 0, 32, 7,168, 0, 0, 7,106, 0, 2, 7,169, 0, 2, 0, 43, 0, 4, 0, 70, 0, 0, 7,107, 1, 19, 0, 6,
- 0, 2, 0, 20, 0, 2, 0, 18, 0, 4, 7, 52, 0, 4, 0, 92, 0, 0, 7,170, 0, 0, 7,171, 1, 20, 0, 1, 0, 4, 0, 20,
- 1, 21, 0, 6, 0, 0, 0, 95, 0, 2, 0, 18, 0, 2, 0, 20, 0, 4, 7,172, 0, 7, 7,173, 0, 42, 5,215, 1, 22, 0, 4,
- 0, 0, 0,182, 0, 2, 0, 20, 0, 4, 0, 18, 0, 32, 0, 45, 1, 23, 0, 2, 0, 4, 0, 18, 0, 4, 5,130, 1, 4, 0, 10,
- 1, 4, 0, 0, 1, 4, 0, 1, 1, 4, 7,122, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 7, 84, 0, 2, 7,174, 0, 0, 0, 17,
- 0, 9, 0, 2, 0, 32, 0, 45, 1, 24, 0, 10, 0, 7, 3, 21, 0, 7, 7,175, 0, 7, 7,176, 0, 7, 7,177, 0, 7, 7,178,
- 0, 4, 0, 20, 0, 7, 7,156, 0, 7, 7,179, 0, 7, 7,180, 0, 7, 0, 37, 0,227, 0, 20, 0, 27, 0, 31, 0, 0, 0,193,
- 1, 25, 7,181, 0, 9, 7,182, 0, 43, 0,152, 0, 43, 7,183, 0, 9, 7,184, 0, 36, 0, 79, 0, 7, 3,109, 0, 7, 7,185,
- 0, 7, 7,186, 0, 7, 7,187, 0, 7, 7,188, 0, 7, 7,189, 0, 7, 7,190, 0, 4, 0, 93, 0, 4, 7,191, 0, 0, 7,192,
- 0, 0, 7,193, 0, 0, 7,194, 1, 26, 0, 6, 0, 27, 0, 31, 0, 7, 7,195, 0, 7, 7,196, 0, 7, 7,197, 0, 2, 7,198,
- 0, 2, 7,199, 1, 27, 0, 14, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0,187, 5,143,
- 0,227, 7, 12, 0, 2, 1, 13, 0, 2, 7,135, 0, 2, 2, 8, 0, 2, 2, 9, 0, 2, 0, 20, 0, 2, 5,153, 0, 4, 0, 70,
- 1, 28, 0, 6, 1, 28, 0, 0, 1, 28, 0, 1, 0, 32, 0, 45, 0, 9, 7,200, 0, 4, 0,218, 0, 4, 0, 37, 0, 63, 0, 4,
- 0, 27, 0, 31, 0, 12, 7,201, 0, 4, 0,135, 0, 7, 7,202, 1, 29, 0, 25, 1, 29, 0, 0, 1, 29, 0, 1, 1, 29, 0, 38,
- 0, 12, 7,203, 0, 0, 0, 17, 0, 7, 7,204, 0, 7, 7,205, 0, 7, 7,206, 0, 7, 7,207, 0, 4, 0, 20, 0, 7, 7,208,
- 0, 7, 7,209, 0, 7, 7,210, 0, 7, 1, 20, 0, 7, 1,217, 0, 7, 7,211, 0, 7, 2,108, 0, 7, 7,212, 0, 7, 7,213,
- 0, 7, 7,214, 0, 7, 7,215, 0, 7, 7,216, 0, 7, 0,175, 0, 2, 0,135, 0, 2, 4,220, 1, 30, 0, 19, 0, 27, 0, 31,
- 0, 12, 7,217, 0, 12, 7,218, 0, 4, 0, 20, 0, 4, 4, 25, 0, 2, 2,160, 0, 2, 7,219, 0, 2, 0,135, 0, 2, 7,220,
- 0, 2, 7,221, 0, 2, 7,222, 0, 2, 7,223, 0, 2, 7,224, 0, 4, 7,225, 0, 4, 7,226, 0, 4, 7,227, 0, 4, 7,228,
- 0, 4, 7,229, 0, 4, 7,230, 1, 31, 0, 34, 1, 31, 0, 0, 1, 31, 0, 1, 0, 12, 3, 49, 0, 0, 0, 17, 0, 2, 0, 20,
- 0, 2, 7,231, 0, 2, 7,232, 0, 2, 7,233, 0, 2, 3, 10, 0, 2, 7,234, 0, 4, 1,249, 0, 4, 7,227, 0, 4, 7,228,
- 1, 29, 7,235, 1, 31, 0, 38, 1, 31, 7,236, 0, 12, 7,237, 0, 9, 7,238, 0, 9, 7,239, 0, 9, 7,240, 0, 7, 1, 7,
- 0, 7, 0,175, 0, 7, 1,199, 0, 7, 7,241, 0, 7, 7,242, 0, 7, 3, 2, 0, 7, 7,243, 0, 7, 7,244, 0, 7, 7,245,
- 0, 7, 7,246, 0, 7, 7,247, 0, 7, 7,248, 0, 7, 1,246, 0, 32, 7,249, 0,146, 0, 9, 0, 12, 7,250, 0, 2, 0, 20,
- 0, 2, 7,251, 0, 7, 3, 20, 0, 7, 7,252, 0, 7, 7,253, 0, 12, 7,254, 0, 4, 7,255, 0, 4, 0, 37, 1, 32, 0, 7,
- 1, 32, 0, 0, 1, 32, 0, 1, 0, 12, 7,192, 0, 4, 0, 20, 0, 4, 8, 0, 0, 0, 0, 17, 0,209, 8, 1, 1, 33, 0, 8,
- 1, 33, 0, 0, 1, 33, 0, 1, 1, 32, 8, 2, 0, 36, 0, 79, 0, 12, 2,250, 0, 4, 0, 20, 0, 0, 0, 17, 0, 4, 8, 3,
- 0,145, 0, 6, 0, 27, 0, 31, 0, 12, 7,250, 0, 12, 8, 4, 0, 12, 0,103, 0, 4, 8, 5, 0, 4, 0, 37, 1, 34, 0, 16,
- 0,181, 0, 0, 0,181, 0, 1, 0, 4, 5, 70, 0, 7, 5, 71, 0,182, 5, 72, 0, 2, 5, 73, 0,187, 5,143, 0,145, 2,247,
- 0, 0, 1, 13, 0, 0, 5,214, 0, 2, 0, 20, 0, 2, 8, 6, 0, 2, 5,150, 0, 2, 5,153, 0, 2, 8, 7, 0, 7, 8, 8,
- 1, 35, 0, 5, 1, 35, 0, 0, 1, 35, 0, 1, 0, 36, 0, 79, 0, 2, 0, 20, 0, 0, 8, 9, 1, 36, 0, 12, 1, 36, 0, 0,
- 1, 36, 0, 1, 0, 9, 0, 2, 0, 2, 0, 18, 0, 2, 0, 20, 0, 0, 8, 10, 0, 0, 8, 11, 0, 0, 8, 9, 0, 7, 8, 12,
- 0, 7, 8, 13, 0, 4, 0, 37, 0, 36, 0, 79, 1, 37, 0, 9, 1, 37, 0, 0, 1, 37, 0, 1, 0, 32, 8, 14, 0, 0, 8, 15,
- 0, 7, 8, 16, 0, 2, 8, 17, 0, 2, 0, 20, 0, 2, 0, 18, 0, 2, 0, 37, 1, 38, 0, 7, 0, 42, 5,215, 0, 26, 8, 18,
- 0, 4, 0, 20, 0, 4, 8, 19, 0, 12, 8, 20, 0, 32, 8, 14, 0, 0, 8, 15, 1, 39, 0, 12, 0, 32, 8, 14, 0, 2, 8, 21,
- 0, 2, 0, 20, 0, 2, 8, 22, 0, 2, 8, 23, 0, 0, 8, 15, 0, 32, 8, 24, 0, 0, 8, 25, 0, 7, 8, 26, 0, 7, 1,217,
- 0, 7, 8, 27, 0, 7, 8, 28, 1, 40, 0, 6, 0, 32, 8, 14, 0, 4, 8, 3, 0, 4, 8, 29, 0, 4, 0, 93, 0, 4, 0, 37,
- 0, 0, 8, 15, 1, 41, 0, 4, 0, 32, 8, 14, 0, 4, 0, 20, 0, 4, 8, 3, 0, 0, 8, 15, 1, 42, 0, 4, 0, 32, 8, 14,
- 0, 4, 0, 20, 0, 4, 8, 3, 0, 0, 8, 15, 1, 43, 0, 10, 0, 32, 8, 14, 0, 4, 8, 30, 0, 7, 0,129, 0, 4, 0, 20,
- 0, 2, 5,209, 0, 2, 8, 31, 0, 2, 0, 43, 0, 2, 0, 70, 0, 7, 8, 32, 0, 0, 8, 15, 1, 44, 0, 4, 0, 32, 8, 14,
- 0, 4, 0, 20, 0, 4, 8, 3, 0, 0, 8, 15, 1, 45, 0, 10, 0, 32, 8, 14, 0, 2, 0, 18, 0, 2, 3,156, 0, 4, 0, 91,
- 0, 4, 0, 92, 0, 7, 7,153, 0, 7, 7,154, 0, 4, 0, 37, 0,145, 7,128, 0, 0, 8, 15, 1, 46, 0, 4, 0, 32, 8, 14,
- 0, 4, 3, 7, 0, 4, 8, 33, 0, 0, 8, 15, 1, 47, 0, 5, 0, 32, 8, 14, 0, 7, 0,129, 0, 4, 8, 34, 0, 4, 3, 7,
- 0, 4, 3, 8, 1, 48, 0, 6, 0, 32, 8, 14, 0, 4, 8, 35, 0, 4, 8, 36, 0, 7, 8, 37, 0, 7, 8, 38, 0, 0, 8, 15,
- 1, 49, 0, 16, 0, 32, 8, 14, 0, 32, 7,236, 0, 4, 0, 18, 0, 7, 8, 39, 0, 7, 8, 40, 0, 7, 8, 41, 0, 7, 8, 42,
- 0, 7, 8, 43, 0, 7, 8, 44, 0, 7, 8, 45, 0, 7, 8, 46, 0, 7, 8, 47, 0, 2, 0, 20, 0, 2, 0, 37, 0, 2, 0, 43,
- 0, 2, 0, 70, 1, 50, 0, 3, 0, 32, 8, 14, 0, 4, 0, 20, 0, 4, 5,118, 1, 51, 0, 5, 0, 32, 8, 14, 0, 4, 0, 20,
- 0, 4, 0, 37, 0, 7, 8, 48, 0, 0, 8, 15, 1, 52, 0, 10, 0, 32, 8, 14, 0, 0, 8, 15, 0, 2, 8, 49, 0, 2, 8, 50,
- 0, 0, 8, 51, 0, 0, 8, 52, 0, 7, 8, 53, 0, 7, 8, 54, 0, 7, 8, 55, 0, 7, 8, 56, 1, 53, 0, 8, 0, 7, 0, 9,
- 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 8, 57, 0, 7, 8, 58, 0, 2, 0, 20, 0, 2, 5,118, 1, 54, 0, 8,
- 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 8, 57, 0, 7, 8, 58, 0, 2, 0, 20, 0, 2, 5,118,
- 1, 55, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 8, 57, 0, 7, 8, 58, 0, 2, 0, 20,
- 0, 2, 5,118, 1, 56, 0, 7, 0, 32, 8, 14, 0, 0, 8, 15, 0, 7, 1, 20, 0, 7, 1, 30, 0, 2, 0, 20, 0, 2, 1, 13,
- 0, 4, 0, 37, 1, 57, 0, 5, 0, 32, 2,211, 0, 7, 1, 20, 0, 2, 2,215, 0, 0, 2,217, 0, 0, 8, 59, 1, 58, 0, 10,
- 1, 58, 0, 0, 1, 58, 0, 1, 0, 2, 0, 18, 0, 2, 0, 20, 0, 0, 8, 60, 0, 7, 0,220, 0, 7, 0,221, 0, 2, 7,192,
- 0, 2, 8, 61, 0, 32, 0, 45, 1, 59, 0, 22, 1, 59, 0, 0, 1, 59, 0, 1, 0, 2, 0, 20, 0, 2, 1, 13, 0, 2, 8, 62,
- 0, 2, 8, 63, 0, 36, 0, 79, 0,145, 7,128, 0, 32, 0,167, 0, 7, 0, 91, 0, 7, 0, 92, 0, 7, 8, 64, 0, 7, 8, 65,
- 0, 7, 8, 66, 0, 7, 8, 67, 0, 7, 2,149, 0, 7, 1,189, 0, 7, 7,130, 0, 7, 8, 68, 0, 0, 8, 69, 0, 0, 8, 70,
- 0, 12, 2,252, 1, 60, 0, 8, 0, 7, 1,225, 0, 7, 7,153, 0, 7, 7,154, 0, 9, 0, 2, 0, 2, 8, 71, 0, 2, 8, 72,
- 0, 2, 8, 73, 0, 2, 8, 74, 1, 61, 0, 18, 1, 61, 0, 0, 1, 61, 0, 1, 1, 61, 8, 75, 0, 0, 0, 17, 1, 60, 8, 76,
- 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 8, 77, 0, 2, 8, 78, 0, 2, 8, 79, 0, 2, 8, 80, 0, 4, 0, 43, 0, 7, 8, 81,
- 0, 7, 8, 82, 0, 4, 8, 83, 0, 4, 8, 84, 1, 61, 8, 85, 1, 62, 8, 86, 1, 63, 0, 32, 1, 63, 0, 0, 1, 63, 0, 1,
- 1, 63, 8, 87, 0, 0, 0, 17, 0, 0, 8, 88, 0, 2, 0, 18, 0, 2, 0, 20, 0, 2, 6,236, 0, 2, 7, 14, 0, 2, 8, 89,
- 0, 2, 0,137, 0, 2, 8, 78, 0, 2, 6,226, 0, 12, 7,123, 0, 12, 8, 90, 0, 27, 5,242, 0, 9, 8, 91, 0, 7, 8, 81,
- 0, 7, 8, 82, 0, 7, 1,251, 0, 7, 8, 92, 0, 2, 8, 93, 0, 2, 8, 94, 0, 7, 8, 95, 0, 7, 8, 96, 0, 2, 8, 97,
- 0, 2, 8, 98, 0, 24, 8, 99, 0, 24, 8,100, 0, 24, 8,101, 1, 64, 0,153, 1, 65, 8,102, 1, 62, 0, 6, 1, 62, 0, 0,
- 1, 62, 0, 1, 1, 63, 8,103, 1, 63, 8,104, 1, 61, 8,105, 1, 61, 8, 85, 0, 57, 0, 16, 0, 27, 0, 31, 0, 12, 8,106,
- 0, 12, 8,107, 1, 60, 8,108, 0, 12, 8,109, 0, 4, 0, 18, 0, 4, 8,110, 0, 4, 8,111, 0, 4, 8,112, 0, 12, 8,113,
- 1, 65, 8,114, 1, 61, 8,115, 1, 61, 8,116, 0, 9, 8,117, 0, 9, 8,118, 0, 4, 8,119, 1, 66, 0, 6, 0, 4, 0,128,
- 0, 4, 0,130, 0, 4, 6,226, 0, 0, 8,120, 0, 0, 8,121, 0, 2, 0, 37, 1, 67, 0, 16, 0, 2, 6,165, 0, 2, 6,166,
- 0, 2, 8,122, 0, 2, 7,176, 0, 2, 8,123, 0, 2, 0, 68, 0, 7, 2,148, 0, 7, 8,124, 0, 7, 8,125, 0, 2, 1, 34,
- 0, 0, 8,126, 0, 0, 4, 37, 0, 2, 8,127, 0, 2, 0, 37, 0, 4, 8,128, 0, 4, 8,129, 1, 68, 0, 9, 0, 7, 8,130,
- 0, 7, 8,131, 0, 7, 7,190, 0, 7, 0,112, 0, 7, 8,132, 0, 7, 5, 66, 0, 2, 8,133, 0, 0, 8,134, 0, 0, 0, 37,
- 1, 69, 0, 4, 0, 7, 8,135, 0, 7, 8,136, 0, 2, 8,133, 0, 2, 0, 37, 1, 70, 0, 3, 0, 7, 8,137, 0, 7, 8,138,
- 0, 7, 0, 15, 1, 71, 0, 7, 0, 0, 1,188, 0, 2, 4,104, 0, 2, 4,105, 0, 2, 4,106, 0, 2, 4, 57, 0, 4, 0,130,
- 0, 4, 3,154, 1, 72, 0, 7, 0, 7, 8,139, 0, 7, 8,140, 0, 7, 8,141, 0, 7, 2, 4, 0, 7, 8,142, 0, 7, 8,143,
- 0, 7, 8,144, 1, 73, 0, 4, 0, 2, 8,145, 0, 2, 8,146, 0, 2, 8,147, 0, 2, 8,148, 1, 74, 0, 2, 0, 7, 0, 5,
- 0, 7, 0, 6, 1, 75, 0, 2, 0, 0, 0,169, 0, 0, 8,149, 1, 76, 0, 1, 0, 0, 0, 17, 1, 77, 0, 10, 0, 0, 8,150,
- 0, 0, 8,151, 0, 0, 8,152, 0, 0, 8,153, 0, 2, 8,122, 0, 2, 8,154, 0, 7, 8,155, 0, 7, 8,156, 0, 7, 8,157,
- 0, 7, 1,189, 1, 78, 0, 2, 0, 9, 8,158, 0, 9, 8,159, 1, 79, 0, 11, 0, 0, 4,106, 0, 0, 0, 18, 0, 0, 8,133,
- 0, 0, 0,112, 0, 0, 8,160, 0, 0, 0,109, 0, 0, 0,182, 0, 7, 8,161, 0, 7, 8,162, 0, 7, 8,163, 0, 7, 8,164,
- 1, 80, 0, 8, 0, 7, 7, 91, 0, 7, 0,129, 0, 7, 4, 37, 0, 7, 2, 72, 0, 7, 8,165, 0, 7, 0,207, 0, 7, 8,166,
- 0, 4, 0, 18, 1, 81, 0, 4, 0, 2, 8,167, 0, 2, 8,168, 0, 2, 8,169, 0, 2, 0, 37, 1, 82, 0, 1, 0, 0, 0, 17,
- 1, 83, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 20, 0, 2, 8,170, 1, 84, 0, 10, 0, 2, 3,136, 0, 2, 0, 20,
- 0, 7, 3,234, 0, 7, 8,171, 0, 7, 8,172, 0, 7, 8,173, 0, 7, 8,174, 1, 83, 8,175, 1, 83, 8,176, 1, 83, 8,177,
- 0, 60, 0, 9, 0, 4, 0, 20, 0, 4, 0, 64, 0, 24, 8,178, 0, 24, 8,179, 1, 84, 8,180, 0, 7, 8,181, 0, 7, 8,182,
- 0, 7, 8,183, 0, 7, 8,184, 1, 85, 0, 4, 0, 46, 2,142, 0, 7, 8,185, 0, 7, 1, 92, 0, 7, 0, 37, 0,169, 0, 13,
- 0, 27, 0, 31, 0, 2, 0, 20, 0, 2, 5, 67, 0, 4, 0,109, 0, 7, 8,186, 0, 7, 2, 1, 0, 7, 8,187, 0, 7, 8,188,
- 0, 7, 1, 92, 0, 2, 1, 47, 0, 2, 0, 37, 0, 50, 1, 77, 1, 85, 8,189, 1, 86, 0, 10, 0, 4, 0, 18, 0, 4, 0,129,
- 0, 4, 0, 20, 0, 4, 3, 70, 0, 4, 8,190, 0, 4, 8,191, 0, 4, 8,192, 0, 0, 0, 95, 0, 0, 0, 17, 0, 9, 0, 2,
- 0, 84, 0, 6, 1, 86, 8,193, 0, 4, 8,194, 0, 4, 8,195, 0, 4, 8,196, 0, 4, 0, 37, 0, 9, 8,197, 1, 87, 0, 5,
- 0, 7, 2, 66, 0, 7, 2,182, 0, 7, 1,217, 0, 2, 8,198, 0, 2, 0, 37, 1, 88, 0, 5, 0, 7, 2, 66, 0, 7, 8,199,
- 0, 7, 8,200, 0, 7, 8,201, 0, 7, 2,182, 1, 89, 0, 7, 0, 4, 8,202, 0, 4, 8,203, 0, 4, 8,204, 0, 7, 8,205,
- 0, 7, 8,206, 0, 7, 8,207, 0, 7, 8,208, 1, 90, 0, 26, 0, 32, 8,209, 1, 88, 3, 66, 1, 88, 8,210, 1, 87, 8,211,
- 1, 88, 7, 77, 0, 7, 8,212, 0, 7, 8,213, 0, 7, 8,214, 0, 7, 8,215, 0, 7, 8,206, 0, 7, 8,207, 0, 7, 2,182,
- 0, 7, 2,159, 0, 7, 8,216, 0, 7, 8,217, 0, 7, 0,109, 0, 7, 8,218, 0, 4, 8,202, 0, 4, 8,219, 0, 4, 0, 37,
- 0, 4, 0, 81, 0, 4, 8,220, 0, 2, 0, 20, 0, 2, 8,221, 0, 2, 8,222, 0, 2, 3,100, 1, 91, 0,112, 0, 27, 0, 31,
- 0, 4, 0, 20, 0, 2, 0, 18, 0, 2, 8, 49, 0, 2, 8,223, 0, 2, 8,224, 0, 2, 8,225, 0, 2, 8,226, 0, 2, 8,227,
- 0, 2, 8,228, 0, 2, 8,229, 0, 2, 8,230, 0, 2, 8,231, 0, 2, 8,232, 0, 2, 8,233, 0, 2, 8,234, 0, 2, 8,235,
- 0, 2, 8,236, 0, 2, 8,237, 0, 2, 1,209, 0, 2, 7, 70, 0, 2, 7, 46, 0, 2, 8,238, 0, 2, 8,239, 0, 2, 3, 98,
- 0, 2, 3, 99, 0, 2, 8,240, 0, 2, 8,241, 0, 2, 8,242, 0, 2, 8,243, 0, 2, 8,244, 0, 2, 8,245, 0, 7, 8,246,
- 0, 7, 8,247, 0, 7, 8,248, 0, 2, 8,249, 0, 2, 8,250, 0, 7, 8,251, 0, 7, 8,252, 0, 7, 8,253, 0, 7, 7, 52,
- 0, 7, 0, 92, 0, 7, 2,159, 0, 7, 7, 58, 0, 7, 8,254, 0, 7, 8,255, 0, 7, 9, 0, 0, 7, 9, 1, 0, 7, 0, 57,
- 0, 4, 7, 53, 0, 4, 7, 51, 0, 4, 9, 2, 0, 7, 7, 54, 0, 7, 7, 55, 0, 7, 7, 56, 0, 7, 9, 3, 0, 7, 9, 4,
- 0, 7, 9, 5, 0, 7, 9, 6, 0, 7, 9, 7, 0, 7, 9, 8, 0, 7, 9, 9, 0, 7, 9, 10, 0, 7, 3, 21, 0, 7, 0,109,
- 0, 7, 9, 11, 0, 7, 9, 12, 0, 7, 9, 13, 0, 7, 9, 14, 0, 7, 9, 15, 0, 7, 9, 16, 0, 7, 2,108, 0, 7, 9, 17,
- 0, 7, 9, 18, 0, 4, 9, 19, 0, 4, 9, 20, 0, 7, 9, 21, 0, 7, 9, 22, 0, 7, 9, 23, 0, 7, 9, 24, 0, 7, 9, 25,
- 0, 7, 9, 26, 0, 7, 9, 27, 0, 7, 9, 28, 0, 7, 3, 94, 0, 7, 3, 92, 0, 7, 3, 93, 0, 7, 9, 29, 0, 7, 9, 30,
- 0, 7, 9, 31, 0, 7, 9, 32, 0, 7, 9, 33, 0, 7, 9, 34, 0, 7, 9, 35, 0, 7, 9, 36, 0, 7, 9, 37, 0, 7, 3, 28,
- 0, 7, 9, 38, 0, 7, 9, 39, 0, 7, 9, 40, 0, 7, 9, 41, 0, 7, 9, 42, 0, 7, 9, 43, 0, 7, 9, 44, 0, 0, 9, 45,
- 0, 63, 3, 55, 0, 63, 9, 46, 0, 32, 9, 47, 0, 32, 9, 48, 0, 36, 0, 79, 0,148, 3, 53, 0,148, 9, 49, 0,136, 0, 37,
- 0,136, 0, 0, 0,136, 0, 1, 1, 91, 9, 50, 1, 90, 3,135, 1, 89, 7,236, 1, 92, 9, 51, 1, 93, 9, 52, 1, 93, 9, 53,
- 0, 12, 9, 54, 0, 12, 9, 55, 0,149, 3, 54, 0, 32, 9, 56, 0, 32, 9, 57, 0, 32, 9, 58, 0, 12, 9, 59, 0, 12, 9, 60,
- 0, 7, 0,211, 0, 7, 4, 78, 0, 4, 2,110, 0, 4, 0, 20, 0, 4, 7, 53, 0, 4, 9, 61, 0, 4, 9, 62, 0, 4, 9, 63,
- 0, 4, 0, 57, 0, 2, 0,218, 0, 2, 9, 64, 0, 2, 9, 65, 0, 2, 9, 66, 0, 2, 3, 47, 0, 2, 9, 67, 0, 0, 9, 68,
- 0, 2, 9, 69, 0, 2, 9, 70, 0, 2, 9, 71, 0, 9, 9, 72, 0,125, 3,175, 0,123, 0, 34, 1, 94, 9, 73, 0, 7, 3,147,
- 0, 7, 9, 74, 0, 7, 9, 75, 0, 7, 3,237, 0, 7, 9, 76, 0, 7, 3, 31, 0, 7, 3, 21, 0, 7, 9, 77, 0, 7, 2, 3,
- 0, 7, 9, 78, 0, 7, 9, 79, 0, 7, 9, 80, 0, 7, 9, 81, 0, 7, 9, 82, 0, 7, 9, 83, 0, 7, 3,148, 0, 7, 9, 84,
- 0, 7, 9, 85, 0, 7, 9, 86, 0, 7, 3,149, 0, 7, 3,145, 0, 7, 3,146, 0, 4, 9, 87, 0, 4, 0, 93, 0, 4, 9, 88,
- 0, 4, 9, 89, 0, 2, 9, 90, 0, 2, 9, 91, 0, 2, 9, 92, 0, 2, 9, 93, 0, 2, 9, 94, 0, 2, 0, 37, 0, 4, 0, 70,
- 0,124, 0, 8, 1, 94, 9, 95, 0, 7, 9, 96, 0, 7, 9, 97, 0, 7, 1,162, 0, 7, 9, 98, 0, 4, 0, 93, 0, 2, 9, 99,
- 0, 2, 9,100, 1, 95, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 9,101, 1, 96, 0, 6, 1, 96, 0, 0,
- 1, 96, 0, 1, 1, 95, 9,102, 0, 4, 9,103, 0, 2, 9,104, 0, 2, 0, 20, 1, 97, 0, 5, 1, 97, 0, 0, 1, 97, 0, 1,
- 0, 12, 9,105, 0, 4, 9,106, 0, 4, 0, 20, 1, 98, 0, 9, 1, 98, 0, 0, 1, 98, 0, 1, 0, 12, 0,128, 1, 97, 9,107,
- 0, 4, 0, 20, 0, 2, 9,104, 0, 2, 9,108, 0, 7, 0, 94, 0, 0, 9,109, 0,186, 0, 5, 0, 12, 4,120, 0, 4, 0, 20,
- 0, 2, 9,110, 0, 2, 9,111, 0, 9, 9,112, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+ 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 83, 99,114,105,112,116, 76,105,110,107,
+ 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, 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, 87, 97,118,101, 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, 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, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 32, 40, 49, 60, 60, 49, 41, 32,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 32, 40, 49, 60, 60, 50, 41, 32, 35,100,101,102,105,110,101, 32, 77,
+ 69, 95, 70, 71, 79, 78, 32, 40, 49, 60, 60, 51, 41, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69,
+ 78, 68, 69, 82, 32, 40, 49, 60, 60, 53, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69,
+ 32, 40, 49, 60, 60, 55, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 32, 40, 49, 60,
+ 60, 56, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 32, 40, 49, 60, 60, 57, 41, 32, 32, 32, 35,100,
+101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73,
+ 80, 86, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 32, 52, 32, 35,100,101,102,105,110,
+101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 32,
+ 49, 54, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 32, 51, 50, 32, 35,100,101,102,105,110,101, 32,
+ 77, 69, 95, 80, 82, 79, 74, 89, 90, 32, 54, 52, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 32, 49, 32,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86,
+ 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69,
+ 95, 86, 52, 86, 49, 32, 56, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 32, 49, 32, 35,100,101,
+102,105,110,101, 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 32, 50, 32, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95,
+ 86, 83, 69,108, 32, 48, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 32, 35,100,101,102,105,110,101,
+ 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 49, 32,
+ 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70,
+ 95, 83, 69, 76, 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 32, 56, 32, 35,100,101,102,105,110,
+101, 32, 84, 70, 95, 83, 69, 76, 51, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 32, 51, 50, 32,
+ 35,100,101,102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 32, 54, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95,
+ 68, 89, 78, 65, 77, 73, 67, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 32, 50,
+ 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65,
+ 82, 69, 68, 86, 69, 82, 84, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 32, 49, 54, 32, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70,
+ 95, 84, 73, 76, 69, 83, 32, 49, 50, 56, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68,
+ 32, 50, 53, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 32, 53, 49, 50, 32, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 32, 49, 48, 50, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70,
+ 95, 79, 66, 67, 79, 76, 32, 50, 48, 52, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68,
+ 50, 32, 52, 48, 57, 54, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 32, 56, 49, 57, 50, 32, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 32, 49, 54, 51, 56, 52, 32, 32, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 83, 79, 76, 73, 68, 32, 48, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 32, 49, 32, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 32, 52,
+ 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 32, 51, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95,
+ 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65,
+ 84, 69, 68, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 32, 52, 32,
+ 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 32, 56, 32, 35,100,101,102,105,110,101,
+ 32, 84, 70, 95, 80, 73, 78, 49, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 32, 51, 50, 32, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78,
+ 52, 32, 49, 50, 56, 32, 35,101,110,100,105,102, 32,117,108,116,105,114,101,115, 76,101,118,101,108, 59, 13, 10, 13, 10,116,121,
+112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 77,117,108,116,105,114,101,115, 32,123, 13, 10, 9, 76,105,115,116, 66, 97,
+115,101, 32,108,101,118,101,108,115, 59, 13, 10, 9, 77, 86,101,114,116, 32, 42,118,101,114,116,115, 59, 13, 10, 13, 10, 9,117,
+110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,108,101,118,101,108, 95, 99,111,117,110,116, 44, 32, 99,117,114,114,101,110,
+116, 44, 32,110,101,119,108,118,108, 44, 32,101,100,103,101,108,118,108, 44, 32,112,105,110,108,118,108, 44, 32,114,101,110,100,
+101,114,108,118,108, 59, 13, 10, 9,117,110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,117,115,101, 95, 99,111,108, 44, 32,
+102,108, 97,103, 59, 13, 10, 13, 10, 9, 47, 42, 32, 83,112,101, 99,105, 97,108, 32,108,101,118,101,108, 32, 49, 32,100, 97,116,
+ 97, 32,116,104, 97,116, 32, 99, 97,110,110,111,116, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32,102,114,111,109, 32,111,
+116,104,101,114, 32,108,101,118,101,108,115, 32, 42, 47, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,118,100, 97,116,
+ 97, 59, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,102,100, 97,116, 97, 59, 13, 10, 9,115,104,111,114,116, 32, 42,
+101,100,103,101, 95,102,108, 97,103,115, 59, 13, 10, 9, 99,104, 97,114, 32, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115,
+ 59, 13, 10,125, 32, 77,117,108,116,105,114,101,115, 59, 13, 10, 13, 10, 47, 42, 42, 32, 69,110,100, 32, 77,117,108,116,105,114,
+101,115, 32, 42, 42, 47, 13, 10, 13, 10,116,121,112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 80, 97,114,116,105, 97,108,
+ 86,105,115,105, 98,105,108,105,116,121, 32,123, 13, 10, 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32, 42,118,101,114,
+116, 95,109, 97,112, 59, 32, 47, 42, 32,118,101,114,116, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,
+101,119, 32, 73,110,100,101,120, 32, 42, 47, 13, 10, 9,105,110,116, 32, 42,101,100,103,101, 95,109, 97,112, 59, 32, 47, 42, 32,
+101,100,103,101, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,120, 44, 32,
+ 45, 49, 61, 32,104,105,100,100,101,110, 32, 42, 47, 13, 10, 9, 77, 70, 97, 99,101, 32, 42,111,108,100, 95,102, 97, 99,101,115,
+ 59, 13, 10, 9, 77, 69,100,103,101, 32, 42,111,108,100, 95,101,100,103,101,115, 59, 13, 10, 9,117,110,115,105,103,110,101,100,
+ 32,105,110,116, 32,116,111,116,102, 97, 99,101, 44, 32,116,111,116,101,100,103,101, 44, 32,116,111,116,118,101,114,116, 44, 32,
+112, 97,100, 59, 13, 10,125, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 59, 13, 10, 13, 10, 47, 42,
+ 32,109,118,101,114,116, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 32, 42, 47, 13, 10, 35,100,101,102,
+105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 83, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95,
+ 83, 80, 72, 69, 82, 69, 84, 69, 77, 80, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 72, 73, 68, 69, 9, 9, 9,
+ 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 69, 82, 84, 95, 77, 69, 82, 71, 69, 68, 9, 9, 40, 49, 60, 60,
+ 54, 41, 13, 10, 13, 10, 47, 42, 32,109,101,100,103,101, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 42,
+ 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 9, 9, 9, 40, 49, 60, 60, 49, 41, 13,
+ 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 9, 9, 9, 9, 40, 49, 60, 60, 50, 41, 13, 10, 35,100,101,102,
+105,110,101, 32, 77, 69, 95, 70, 71, 79, 78, 9, 9, 9, 9, 40, 49, 60, 60, 51, 41, 13, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,
+114,101,115,101,114,118,101, 32, 49, 54, 32,102,111,114, 32, 77, 69, 95, 72, 73, 68, 69, 32, 42, 47, 13, 10, 35,100,101,102,105,
+110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82, 9, 9, 40, 49, 60, 60, 53, 41, 13, 10, 35,100,101,102,105,110,
+101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 9, 9, 40, 49, 60, 60, 55, 41, 13, 10, 35,100,101,102,105,110,101, 32,
+ 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 9, 9, 40, 49, 60, 60, 56, 41, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69,
+ 95, 83, 72, 65, 82, 80, 9, 9, 9, 40, 49, 60, 60, 57, 41, 13, 10, 13, 10, 47, 42, 32,112,117,110,111, 32, 61, 32,118,101,114,
+116,101,120,110,111,114,109, 97,108, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 47, 42, 32,114,101,110,100,101,114, 32,
+ 97,115,115,117,109,101,115, 32,102,108,105,112,115, 32,116,111, 32, 98,101, 32,111,114,100,101,114,101,100, 32,108,105,107,101,
+ 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 9, 9, 49, 13, 10,
+ 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69,
+ 95, 70, 76, 73, 80, 86, 51, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 9, 9, 56,
+ 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101,
+ 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 9, 9, 51, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 89,
+ 90, 9, 9, 54, 52, 13, 10, 13, 10, 47, 42, 32,101,100, 99,111,100,101, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 35,
+100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86,
+ 50, 86, 51, 9, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 9, 9, 9, 52, 13, 10, 35,100,
+101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 52,
+ 86, 49, 9, 9, 9, 56, 13, 10, 13, 10, 47, 42, 32,102,108, 97,103, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 35,100,
+101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95,
+ 70, 65, 67, 69, 95, 83, 69, 76, 9, 9, 9, 50, 13, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,102,108, 97,103, 32, 77, 69, 95, 72,
+ 73, 68, 69, 61, 61, 49, 54, 32,105,115, 32,117,115,101,100, 32,104,101,114,101, 32,116,111,111, 32, 42, 47, 32, 13, 10, 47, 42,
+ 32,109,115,101,108,101, 99,116, 45, 62,116,121,112,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 83,
+ 69,108, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 13, 10, 35,100,101,102,105,110,101,
+ 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,102,108, 97,103, 32, 42, 47,
+ 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 9, 49, 32, 47, 42, 32,117,115,101, 32, 77, 70, 97,
+ 99,101, 32,104,105,100,101, 32,102,108, 97,103, 32, 40, 97,102,116,101,114, 32, 50, 46, 52, 51, 41, 44, 32,115,104,111,117,108,
+100, 32, 98,101, 32, 97, 98,108,101, 32,116,111, 32,114,101,117,115,101, 32, 97,102,116,101,114, 32, 50, 46, 52, 52, 32, 42, 47,
+ 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 9, 50, 32, 47, 42, 32,100,101,112,114,101, 99, 97,
+116,101,100, 33, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 49, 9, 9, 52, 13, 10, 35,100,101,
+102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 9, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 51,
+ 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 9, 9, 51, 50, 13, 10, 35,100,101,102,105,
+110,101, 32, 84, 70, 95, 72, 73, 68, 69, 9, 9, 54, 52, 32, 47, 42, 32,117,110,117,115,101,100, 44, 32,115, 97,109,101, 32, 97,
+115, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,109,111,100,
+101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, 65, 77, 73, 67, 9, 9, 49, 13, 10, 35,100,101,
+102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95,
+ 84, 69, 88, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 86, 69, 82, 84, 9, 56,
+ 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 9, 9, 49, 54, 13, 10, 13, 10, 35,100,101,102,105,110,
+101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 73,
+ 76, 69, 83, 9, 9, 49, 50, 56, 9, 9, 47, 42, 32,100,101,112,114,101, 99, 97,116,101,100, 32, 42, 47, 13, 10, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 9, 50, 53, 54, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70,
+ 95, 84, 87, 79, 83, 73, 68, 69, 9, 9, 53, 49, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 73, 78, 86, 73, 83, 73,
+ 66, 76, 69, 9, 49, 48, 50, 52, 13, 10, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, 79, 76, 9, 9, 50, 48,
+ 52, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 9, 52, 48, 57, 54, 9, 47,
+ 42, 32,119,105,116,104, 32, 90, 32, 97,120,105,115, 32, 99,111,110,115,116,114, 97,105,110,116, 32, 42, 47, 13, 10, 35,100,101,
+102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 9, 9, 56, 49, 57, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70,
+ 95, 66, 77, 70, 79, 78, 84, 9, 9, 49, 54, 51, 56, 52, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,116,114, 97,
+110,115,112, 44, 32,118, 97,108,117,101,115, 32, 49, 45, 52, 32, 97,114,101, 32,117,115,101,100, 32, 97,115, 32,102,108, 97,103,
+115, 32,105,110, 32,116,104,101, 32, 71, 76, 44, 32, 87, 65, 82, 78, 73, 78, 71, 44, 32, 84, 70, 95, 83, 85, 66, 32, 99, 97,110,
+116, 32,119,111,114,107, 32,119,105,116,104, 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95,
+ 83, 79, 76, 73, 68, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 9, 9, 49, 13, 10, 35,100,101,102,
+105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 9,
+ 9, 52, 32, 47, 42, 32, 99,108,105,112,109, 97,112, 32, 97,108,112,104, 97, 47, 98,105,110, 97,114,121, 32, 97,108,112,104, 97,
+ 32, 97,108,108, 32,111,114, 32,110,111,116,104,105,110,103, 33, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,115,117, 98, 32,105,115,
+ 32,110,111,116, 32, 97,118, 97,105,108, 97, 98,108,101, 32,105,110, 32,116,104,101, 32,117,115,101,114, 32,105,110,116,101,114,
+102, 97, 99,101, 32, 97,110,121,109,111,114,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 9,
+ 9, 51, 13, 10, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,117,110,119,114, 97,112, 32, 42, 47, 13, 10, 35,100,
+101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 50, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80,
+ 82, 69, 67, 65, 84, 69, 68, 51, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69,
+ 68, 52, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 49, 9, 9, 32, 32, 32, 32, 49, 54, 13, 10, 35,
+100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 9, 9, 32, 32, 32, 32, 51, 50, 13, 10, 35,100,101,102,105,110,101, 32,
+ 84, 70, 95, 80, 73, 78, 51, 9, 32, 32, 32, 9, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 52,
+ 9, 32, 32, 32, 32, 9, 49, 50, 56, 13, 10, 13, 10, 35,101,110,100,105,102, 13, 10, 35, 79, 67, 75, 33,110,101, 32, 67,249, 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, 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, 76, 97,116,116,105, 99,101,
+ 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 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, 82, 78, 71, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 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, 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, 70,114, 97,109,105,110,103, 0, 84,105,109,101, 77, 97,114,
+107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 66,114,117,115,104, 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,
+ 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 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, 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, 98, 71, 80,100, 97,116, 97,
+ 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,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, 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,
+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, 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, 72,101, 97,100,101,114, 0, 72,101, 97,100,101,114, 84,121,112,101, 0, 77,101,110,117, 0, 77,101,110,117, 84,121,
+112,101, 0, 83, 99,114, 65,114,101, 97, 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, 98, 83,111,117,110,100, 0,104,
+100, 97,117,100,105,111, 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, 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, 98, 83,111,117,110,100,
+ 65, 99,116,117, 97,116,111,114, 0, 98, 67, 68, 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, 70,114,101,101, 67, 97,109,101,114, 97, 0, 98, 83, 97,109,112,
+108,101, 0, 98, 83,111,117,110,100, 76,105,115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83,111,117,110,100, 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, 80,111,115,101, 67,104, 97,
+110,110,101,108, 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, 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, 77,105,110, 77, 97,120, 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, 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, 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, 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, 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, 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, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 67,104,105,
+108,100, 80, 97,114,116,105, 99,108,101, 0, 75,101,121,101,100, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80,
+ 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 80, 97,114,
+116,105, 99,108,101, 69,100,105,116, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 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,
+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, 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,109, 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, 68,114,105,118,101,114, 84, 97,114,103,101,116, 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, 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, 92, 3, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 48, 0, 16, 0, 24, 0, 40, 0,120, 0,
+ 12, 0,136, 0, 36, 0,220, 4,128, 1, 0, 0, 0, 0, 0, 0,136, 0, 24, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0,140, 0,
+132, 0,132, 1, 8, 1, 56, 0,112, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,140, 0, 56, 0, 8, 0, 16, 0, 76, 1, 0, 0,
+ 0, 0, 0, 0, 24, 1, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 24, 0, 76, 0, 32, 0,
+ 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 12, 0, 0, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 56, 0,
+ 72, 0, 92, 0,100, 0, 72, 0,100, 0,120, 0, 68, 0, 64, 0,112, 0, 64, 0,152, 0,156, 0, 64, 0, 96, 0,108, 0,188, 0,
+104, 0,184, 0, 56, 0, 76, 0, 0, 0,132, 0, 28, 0,232, 0,104, 0, 0, 0, 64, 0, 0, 0, 0, 0, 68, 0, 8, 0, 8, 0,
+220, 0, 80, 0, 76, 1, 76, 0, 68, 0, 68, 0, 64, 0,164, 1,112, 0,108, 0,188, 0, 40, 0, 92, 0, 56, 0,120, 0,128, 0,
+152, 0,208, 0, 0, 0, 24, 0, 16, 0, 0, 0, 0, 0, 0, 0,112, 1, 28, 0,176, 0,144, 0, 52, 0, 16, 0, 72, 0,224, 3,
+ 56, 0, 16, 0, 80, 0, 16, 0,196, 0, 8, 0, 84, 0, 80, 0, 32, 0, 0, 0, 32, 0, 36, 1, 32, 0, 24, 2, 0, 0, 0, 0,
+ 56, 0,216, 2, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 40, 0,136, 0, 48, 0,140, 0,196, 0, 20, 0,232, 0,
+204, 0,124, 1, 52, 0, 0, 0, 92, 0, 0, 0,248, 0, 12, 0, 12, 0,136, 0,188, 0,124, 2, 80, 2, 40, 0,168, 0,232, 0,
+ 52, 0,136, 2, 28, 0, 80, 0, 16, 1, 32, 0,224, 0, 32, 0, 32, 0, 48, 2, 16, 1, 16, 0,152, 20, 56, 0, 40, 11, 20, 0,
+ 24, 0, 56, 1, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0,112, 0, 0, 0,236, 0, 0, 0, 32, 0, 80, 0, 28, 0, 16, 0,
+ 8, 0, 52, 0,252, 0,240, 0,168, 1,196, 0, 28, 1, 0, 0, 16, 0, 12, 0, 24, 0, 48, 0, 16, 0, 20, 0, 16, 0, 24, 0,
+ 56, 1, 0, 0, 56, 0, 64, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 68, 0,
+ 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0, 28, 0, 20, 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0,
+ 96, 0, 60, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 40, 0, 0, 0, 68, 0,184, 0, 24, 0, 4, 1,120, 0,
+172, 1,104, 0,216, 0, 64, 0, 44, 0, 64, 0,116, 0, 60, 0,104, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0,
+ 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 28, 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,
+208, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0,
+ 24, 0, 32, 0, 8, 0, 32, 0, 12, 0, 44, 0, 20, 0, 68, 0, 24, 0, 56, 0, 72, 0, 28, 0,252, 0,244, 1, 0, 0, 0, 0,
+ 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 24, 0,140, 0,148, 0, 56, 0, 0, 0, 0, 0, 92, 0, 0, 0, 88, 0, 0, 0,
+ 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 88, 0, 24, 1, 16, 0, 68, 0, 0, 1, 20, 0,152, 0,
+ 88, 0, 96, 0, 88, 0, 20, 0, 56, 0, 0, 0, 83, 84, 82, 67,104, 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, 4, 0, 5, 0, 4, 0, 6, 0, 15, 0, 2, 0, 7, 0, 5, 0, 7, 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, 6, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0,
+ 2, 0, 43, 0, 4, 0, 44, 0, 31, 0, 6, 0, 32, 0, 45, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 17, 0, 2, 0, 19, 0,
+ 0, 0, 48, 0, 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 49, 0, 35, 0, 50, 0, 24, 0, 51, 0, 24, 0, 52, 0,
+ 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 56, 0, 2, 0, 19, 0, 2, 0, 57, 0,
+ 7, 0, 11, 0, 7, 0, 12, 0, 4, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 7, 0, 61, 0, 31, 0, 62, 0, 36, 0, 7, 0,
+ 27, 0, 31, 0, 12, 0, 63, 0, 24, 0, 64, 0, 2, 0, 46, 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 37, 0, 37, 0, 16, 0,
+ 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61, 0, 2, 0, 17, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 19, 0,
+ 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71, 0, 0, 0, 20, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0,
+ 38, 0, 13, 0, 27, 0, 31, 0, 39, 0, 75, 0, 37, 0, 76, 0, 0, 0, 77, 0, 4, 0, 78, 0, 7, 0, 61, 0, 12, 0, 79, 0,
+ 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 5, 0, 27, 0, 84, 0,
+ 2, 0, 85, 0, 2, 0, 86, 0, 2, 0, 87, 0, 4, 0, 37, 0, 41, 0, 6, 0, 41, 0, 0, 0, 41, 0, 1, 0, 0, 0, 88, 0,
+ 0, 0, 89, 0, 4, 0, 23, 0, 4, 0, 90, 0, 42, 0, 10, 0, 42, 0, 0, 0, 42, 0, 1, 0, 4, 0, 91, 0, 4, 0, 92, 0,
+ 4, 0, 93, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 94, 0, 0, 0, 95, 0, 0, 0, 96, 0, 43, 0, 15, 0, 27, 0, 31, 0,
+ 0, 0, 97, 0, 4, 0, 94, 0, 4, 0, 98, 0, 12, 0, 99, 0, 41, 0,100, 0, 41, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0,
+ 12, 0,104, 0, 0, 0,105, 0, 4, 0,106, 0, 4, 0,107, 0, 9, 0,108, 0, 8, 0,109, 0, 44, 0, 3, 0, 4, 0,110, 0,
+ 4, 0,111, 0, 9, 0, 2, 0, 45, 0, 21, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0,112, 0,
+ 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0,
+ 7, 0,121, 0, 7, 0,122, 0, 2, 0,123, 0, 2, 0,124, 0, 7, 0,125, 0, 36, 0, 80, 0, 40, 0,126, 0, 32, 0,127, 0,
+ 46, 0, 13, 0, 4, 0,128, 0, 4, 0,129, 0, 4, 0,130, 0, 4, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0, 19, 0,
+ 2, 0,134, 0, 2, 0,135, 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 47, 0,139, 0, 48, 0, 32, 0, 27, 0, 31, 0,
+ 0, 0, 34, 0, 12, 0,140, 0, 49, 0,141, 0, 50, 0,142, 0, 51, 0,143, 0, 2, 0,134, 0, 2, 0, 19, 0, 2, 0,144, 0,
+ 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0,
+ 2, 0,150, 0, 2, 0,151, 0, 4, 0,152, 0, 4, 0,153, 0, 44, 0,154, 0, 30, 0,155, 0, 0, 0,156, 0, 7, 0,157, 0,
+ 4, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 2, 0,161, 0, 2, 0,162, 0, 7, 0,163, 0, 7, 0,164, 0, 52, 0, 31, 0,
+ 2, 0,165, 0, 2, 0,166, 0, 2, 0,167, 0, 2, 0,168, 0, 32, 0,169, 0, 53, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0,
+ 0, 0,173, 0, 0, 0,174, 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0,
+ 2, 0,181, 0, 2, 0,182, 0, 2, 0,183, 0, 2, 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, 57, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 54, 0, 15, 0,
+ 0, 0,195, 0, 9, 0,196, 0, 0, 0,197, 0, 0, 0,198, 0, 4, 0,199, 0, 4, 0,200, 0, 9, 0,201, 0, 7, 0,202, 0,
+ 7, 0,203, 0, 7, 0,204, 0, 4, 0,205, 0, 9, 0,206, 0, 9, 0,207, 0, 4, 0,208, 0, 4, 0, 37, 0, 55, 0, 6, 0,
+ 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,209, 0, 7, 0, 67, 0, 4, 0, 64, 0, 56, 0, 5, 0, 2, 0, 19, 0,
+ 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,210, 0, 55, 0,204, 0, 57, 0, 17, 0, 32, 0,169, 0, 48, 0,211, 0, 58, 0,212, 0,
+ 7, 0,213, 0, 7, 0,214, 0, 2, 0, 17, 0, 2, 0,215, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,216, 0, 4, 0,217, 0,
+ 2, 0,218, 0, 2, 0,219, 0, 4, 0,134, 0, 4, 0,145, 0, 2, 0,220, 0, 2, 0,221, 0, 53, 0, 57, 0, 27, 0, 31, 0,
+ 39, 0, 75, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0,
+ 7, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,236, 0,
+ 7, 0,237, 0, 7, 0,238, 0, 7, 0,239, 0, 7, 0,240, 0, 7, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 2, 0,244, 0,
+ 2, 0,245, 0, 2, 0,246, 0, 2, 0,247, 0, 2, 0,248, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,215, 0, 7, 0,249, 0,
+ 7, 0,250, 0, 7, 0,251, 0, 7, 0,252, 0, 2, 0,253, 0, 2, 0,254, 0, 2, 0,255, 0, 2, 0,132, 0, 4, 0, 23, 0,
+ 4, 0,129, 0, 4, 0,130, 0, 4, 0,131, 0, 7, 0, 0, 1, 7, 0, 1, 1, 7, 0,191, 0, 46, 0, 2, 1, 59, 0, 3, 1,
+ 36, 0, 80, 0, 48, 0,211, 0, 54, 0, 4, 1, 56, 0, 5, 1, 57, 0, 6, 1, 30, 0,155, 0, 0, 0, 7, 1, 0, 0, 8, 1,
+ 60, 0, 8, 0, 7, 0, 9, 1, 7, 0, 10, 1, 7, 0,177, 0, 4, 0, 19, 0, 7, 0, 11, 1, 7, 0, 12, 1, 7, 0, 13, 1,
+ 32, 0, 45, 0, 61, 0, 81, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 14, 1, 2, 0,179, 0,
+ 2, 0, 15, 1, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 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, 25, 1, 7, 0, 26, 1,
+ 62, 0, 27, 1, 2, 0, 28, 1, 2, 0, 70, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1,
+ 2, 0, 32, 1, 2, 0, 33, 1, 2, 0, 34, 1, 2, 0, 35, 1, 0, 0, 36, 1, 0, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1,
+ 2, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 7, 0, 43, 1, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 2, 0, 47, 1,
+ 2, 0, 43, 0, 2, 0, 48, 1, 2, 0, 49, 1, 2, 0, 50, 1, 2, 0, 51, 1, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 54, 1,
+ 7, 0, 55, 1, 7, 0, 56, 1, 7, 0, 57, 1, 7, 0, 58, 1, 7, 0, 59, 1, 7, 0, 60, 1, 7, 0, 61, 1, 7, 0, 62, 1,
+ 7, 0, 63, 1, 2, 0, 64, 1, 2, 0, 65, 1, 4, 0, 66, 1, 4, 0, 67, 1, 2, 0, 68, 1, 2, 0, 69, 1, 2, 0, 70, 1,
+ 2, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 2, 0, 76, 1, 2, 0, 77, 1, 52, 0, 78, 1,
+ 36, 0, 80, 0, 30, 0,155, 0, 40, 0,126, 0, 63, 0, 2, 0, 27, 0, 31, 0, 36, 0, 80, 0, 64, 0,130, 0, 27, 0, 31, 0,
+ 39, 0, 75, 0, 2, 0, 79, 1, 2, 0, 19, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0, 80, 1, 7, 0, 81, 1,
+ 7, 0, 82, 1, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 7, 0, 89, 1,
+ 7, 0, 90, 1, 7, 0, 91, 1, 7, 0, 92, 1, 7, 0, 93, 1, 7, 0, 94, 1, 7, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1,
+ 7, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, 7, 0,104, 1, 7, 0,105, 1,
+ 7, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, 2, 0,109, 1, 0, 0,110, 1, 0, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1,
+ 2, 0,114, 1, 2, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, 7, 0,118, 1, 7, 0,119, 1, 2, 0,120, 1, 2, 0,121, 1,
+ 4, 0, 14, 1, 4, 0,122, 1, 2, 0,123, 1, 2, 0,124, 1, 2, 0,125, 1, 2, 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, 7, 0,135, 1, 7, 0,136, 1,
+ 0, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 4, 0,141, 1, 0, 0,142, 1, 0, 0, 48, 1, 0, 0,143, 1,
+ 0, 0, 7, 1, 2, 0,144, 1, 2, 0,145, 1, 2, 0, 65, 1, 2, 0,146, 1, 2, 0,147, 1, 2, 0,148, 1, 7, 0,149, 1,
+ 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 2, 0,165, 0, 2, 0,166, 0, 56, 0,154, 1, 56, 0,155, 1,
+ 0, 0,156, 1, 0, 0,157, 1, 0, 0,158, 1, 0, 0,159, 1, 2, 0,160, 1, 2, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1,
+ 52, 0, 78, 1, 59, 0, 3, 1, 36, 0, 80, 0, 65, 0,164, 1, 30, 0,155, 0, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1,
+ 7, 0,168, 1, 7, 0,169, 1, 2, 0,170, 1, 2, 0, 70, 0, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, 7, 0,174, 1,
+ 7, 0,175, 1, 7, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 2, 0,180, 1, 2, 0,181, 1, 7, 0,182, 1,
+ 7, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, 7, 0,186, 1, 4, 0,187, 1, 4, 0,188, 1, 4, 0,189, 1, 40, 0,126, 0,
+ 12, 0,190, 1, 66, 0, 4, 0, 27, 0, 31, 0, 0, 0,191, 1, 67, 0, 2, 0, 44, 0,154, 0, 68, 0, 26, 0, 68, 0, 0, 0,
+ 68, 0, 1, 0, 69, 0,192, 1, 4, 0,193, 1, 4, 0,194, 1, 4, 0,195, 1, 4, 0,196, 1, 4, 0,197, 1, 4, 0,198, 1,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,199, 1, 2, 0,200, 1, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,201, 1,
+ 7, 0,202, 1, 7, 0,203, 1, 7, 0,204, 1, 7, 0,205, 1, 7, 0,206, 1, 7, 0,207, 1, 7, 0, 23, 0, 7, 0,208, 1,
+ 7, 0,209, 1, 70, 0, 16, 0, 27, 0, 31, 0, 69, 0,192, 1, 12, 0,210, 1, 12, 0,211, 1, 12, 0,212, 1, 36, 0, 80, 0,
+ 64, 0,213, 1, 2, 0, 19, 0, 2, 0,214, 1, 4, 0,178, 0, 7, 0, 9, 1, 7, 0,177, 0, 7, 0, 10, 1, 7, 0,215, 1,
+ 7, 0,216, 1, 7, 0,217, 1, 35, 0, 11, 0, 7, 0,218, 1, 7, 0,219, 1, 7, 0,220, 1, 7, 0,221, 1, 2, 0, 55, 0,
+ 0, 0,222, 1, 0, 0,223, 1, 0, 0,224, 1, 0, 0,225, 1, 0, 0,226, 1, 0, 0,227, 1, 34, 0, 7, 0, 7, 0,228, 1,
+ 7, 0,219, 1, 7, 0,220, 1, 2, 0,224, 1, 2, 0,227, 1, 7, 0,221, 1, 7, 0, 37, 0, 71, 0, 21, 0, 71, 0, 0, 0,
+ 71, 0, 1, 0, 2, 0, 17, 0, 2, 0,229, 1, 2, 0,227, 1, 2, 0, 19, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,232, 1,
+ 2, 0,233, 1, 2, 0,234, 1, 2, 0,235, 1, 2, 0,236, 1, 2, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 34, 0, 49, 0,
+ 35, 0, 50, 0, 2, 0,240, 1, 2, 0,241, 1, 4, 0,242, 1, 72, 0, 5, 0, 2, 0,243, 1, 2, 0,229, 1, 0, 0, 19, 0,
+ 0, 0, 37, 0, 2, 0, 70, 0, 73, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 8, 0, 7, 0,244, 1, 74, 0, 62, 0,
+ 27, 0, 31, 0, 39, 0, 75, 0, 69, 0,192, 1, 12, 0,245, 1, 12, 0,211, 1, 12, 0,246, 1, 32, 0,247, 1, 32, 0,248, 1,
+ 32, 0,249, 1, 36, 0, 80, 0, 75, 0,250, 1, 38, 0,251, 1, 64, 0,213, 1, 12, 0,252, 1, 7, 0, 9, 1, 7, 0,177, 0,
+ 7, 0, 10, 1, 4, 0,178, 0, 2, 0,253, 1, 2, 0,214, 1, 2, 0, 19, 0, 2, 0,254, 1, 7, 0,255, 1, 7, 0, 0, 2,
+ 7, 0, 1, 2, 2, 0,232, 1, 2, 0,233, 1, 2, 0, 2, 2, 2, 0, 3, 2, 4, 0, 4, 2, 34, 0, 5, 2, 2, 0, 23, 0,
+ 2, 0, 99, 0, 2, 0, 67, 0, 2, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 11, 2,
+ 7, 0, 12, 2, 7, 0, 13, 2, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0, 16, 2, 0, 0, 17, 2, 76, 0, 18, 2, 77, 0, 19, 2,
+ 0, 0, 20, 2, 66, 0, 21, 2, 66, 0, 22, 2, 66, 0, 23, 2, 66, 0, 24, 2, 4, 0, 25, 2, 7, 0, 26, 2, 4, 0, 27, 2,
+ 4, 0, 28, 2, 73, 0, 29, 2, 4, 0, 30, 2, 4, 0, 31, 2, 72, 0, 32, 2, 72, 0, 33, 2, 78, 0, 39, 0, 27, 0, 31, 0,
+ 69, 0,192, 1, 12, 0, 34, 2, 36, 0, 80, 0, 38, 0,251, 1, 64, 0,213, 1, 79, 0, 35, 2, 80, 0, 36, 2, 81, 0, 37, 2,
+ 82, 0, 38, 2, 83, 0, 39, 2, 84, 0, 40, 2, 85, 0, 41, 2, 86, 0, 42, 2, 78, 0, 43, 2, 87, 0, 44, 2, 88, 0, 45, 2,
+ 89, 0, 46, 2, 89, 0, 47, 2, 89, 0, 48, 2, 4, 0, 54, 0, 4, 0, 49, 2, 4, 0, 50, 2, 4, 0, 51, 2, 4, 0, 52, 2,
+ 4, 0,178, 0, 7, 0, 9, 1, 7, 0,177, 0, 7, 0, 10, 1, 7, 0, 53, 2, 4, 0, 54, 2, 2, 0, 55, 2, 2, 0, 19, 0,
+ 2, 0, 56, 2, 2, 0, 57, 2, 2, 0,214, 1, 2, 0, 58, 2, 90, 0, 59, 2, 91, 0, 60, 2, 81, 0, 8, 0, 9, 0, 61, 2,
+ 7, 0, 62, 2, 4, 0, 63, 2, 0, 0, 19, 0, 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 79, 0, 7, 0,
+ 4, 0, 67, 2, 4, 0, 68, 2, 4, 0, 69, 2, 4, 0, 70, 2, 2, 0,229, 1, 0, 0, 71, 2, 0, 0, 19, 0, 83, 0, 5, 0,
+ 4, 0, 67, 2, 4, 0, 68, 2, 0, 0, 72, 2, 0, 0, 73, 2, 2, 0, 19, 0, 92, 0, 2, 0, 4, 0, 74, 2, 7, 0,220, 1,
+ 84, 0, 3, 0, 92, 0, 75, 2, 4, 0, 76, 2, 4, 0, 19, 0, 82, 0, 6, 0, 7, 0, 77, 2, 2, 0, 78, 2, 2, 0,229, 1,
+ 0, 0, 19, 0, 0, 0, 73, 2, 0, 0,184, 0, 85, 0, 4, 0, 0, 0,209, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,187, 0,
+ 93, 0, 6, 0, 48, 0, 61, 2, 0, 0, 19, 0, 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 94, 0, 1, 0,
+ 7, 0, 79, 2, 95, 0, 5, 0, 0, 0,209, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,187, 0, 4, 0, 37, 0, 86, 0, 1, 0,
+ 7, 0, 80, 2, 87, 0, 2, 0, 4, 0, 81, 2, 4, 0, 17, 0, 80, 0, 7, 0, 7, 0, 62, 2, 48, 0, 61, 2, 0, 0, 19, 0,
+ 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 96, 0, 1, 0, 7, 0, 82, 2, 97, 0, 1, 0, 4, 0, 83, 2,
+ 98, 0, 1, 0, 0, 0, 84, 2, 99, 0, 1, 0, 7, 0, 62, 2,100, 0, 3, 0, 4, 0, 85, 2, 0, 0, 96, 0, 7, 0, 86, 2,
+102, 0, 4, 0, 7, 0,209, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0,103, 0, 1, 0,102, 0, 63, 2,104, 0, 5, 0,
+ 4, 0, 87, 2, 4, 0, 88, 2, 0, 0, 19, 0, 0, 0,229, 1, 0, 0,184, 0,105, 0, 2, 0, 4, 0, 89, 2, 4, 0, 88, 2,
+106, 0, 10, 0,106, 0, 0, 0,106, 0, 1, 0,104, 0, 90, 2,103, 0, 91, 2,105, 0, 92, 2, 4, 0, 54, 0, 4, 0, 50, 2,
+ 4, 0, 49, 2, 4, 0, 37, 0, 82, 0, 93, 2, 90, 0, 14, 0, 12, 0, 94, 2, 82, 0, 93, 2, 0, 0, 95, 2, 0, 0, 96, 2,
+ 0, 0, 97, 2, 0, 0, 98, 2, 0, 0, 99, 2, 0, 0,100, 2, 0, 0,101, 2, 0, 0, 19, 0, 89, 0, 46, 2, 89, 0, 48, 2,
+ 2, 0,102, 2, 0, 0,103, 2, 91, 0, 8, 0, 4, 0,104, 2, 4, 0,105, 2, 79, 0,106, 2, 83, 0,107, 2, 4, 0, 50, 2,
+ 4, 0, 49, 2, 4, 0, 54, 0, 4, 0, 37, 0,107, 0, 7, 0,107, 0, 0, 0,107, 0, 1, 0, 4, 0, 17, 0, 4, 0, 14, 1,
+ 0, 0, 20, 0, 47, 0,139, 0, 0, 0,108, 2,108, 0, 7, 0,107, 0,109, 2, 2, 0,110, 2, 2, 0, 94, 2, 2, 0,111, 2,
+ 2, 0, 94, 0, 9, 0,112, 2, 9, 0,113, 2,109, 0, 3, 0,107, 0,109, 2, 32, 0,169, 0, 0, 0, 20, 0,110, 0, 5, 0,
+107, 0,109, 2, 32, 0,169, 0, 0, 0, 20, 0, 2, 0,114, 2, 0, 0,115, 2,111, 0, 5, 0,107, 0,109, 2, 7, 0, 92, 0,
+ 7, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2,112, 0, 5, 0,107, 0,109, 2, 32, 0,119, 2, 0, 0, 72, 0, 4, 0, 14, 1,
+ 4, 0, 19, 0,113, 0, 13, 0,107, 0,109, 2, 32, 0,120, 2, 32, 0,121, 2, 32, 0,122, 2, 32, 0,123, 2, 7, 0,124, 2,
+ 7, 0,125, 2, 7, 0,116, 2, 7, 0,126, 2, 4, 0,127, 2, 4, 0,128, 2, 4, 0, 94, 0, 4, 0,129, 2,114, 0, 5, 0,
+107, 0,109, 2, 2, 0,130, 2, 2, 0, 19, 0, 7, 0,131, 2, 32, 0,132, 2,115, 0, 3, 0,107, 0,109, 2, 7, 0,133, 2,
+ 4, 0, 94, 0,116, 0, 10, 0,107, 0,109, 2, 7, 0,134, 2, 4, 0,135, 2, 4, 0, 37, 0, 2, 0, 94, 0, 2, 0,136, 2,
+ 2, 0,137, 2, 2, 0,138, 2, 7, 0,139, 2, 0, 0,140, 2,117, 0, 3, 0,107, 0,109, 2, 7, 0, 37, 0, 4, 0, 17, 0,
+118, 0, 11, 0,107, 0,109, 2, 53, 0,141, 2, 7, 0,142, 2, 4, 0,143, 2, 0, 0,140, 2, 7, 0,144, 2, 4, 0,145, 2,
+ 32, 0,146, 2, 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0,119, 0, 10, 0,107, 0,109, 2, 32, 0,149, 2, 48, 0,150, 2,
+ 4, 0, 94, 0, 4, 0,151, 2, 7, 0,152, 2, 7, 0,153, 2, 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0,120, 0, 3, 0,
+107, 0,109, 2, 7, 0,154, 2, 4, 0,155, 2,121, 0, 5, 0,107, 0,109, 2, 7, 0,156, 2, 0, 0,140, 2, 2, 0, 19, 0,
+ 2, 0,157, 2,122, 0, 8, 0,107, 0,109, 2, 32, 0,169, 0, 7, 0,156, 2, 7, 0,221, 1, 7, 0,110, 0, 0, 0,140, 2,
+ 2, 0, 19, 0, 2, 0, 17, 0,123, 0, 21, 0,107, 0,109, 2, 32, 0,158, 2, 0, 0,140, 2, 53, 0,141, 2, 32, 0,146, 2,
+ 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2,
+ 7, 0,164, 2, 7, 0,165, 2, 4, 0,145, 2, 4, 0,148, 2, 0, 0,147, 2, 7, 0,166, 2, 7, 0,167, 2, 7, 0, 43, 0,
+124, 0, 7, 0,107, 0,109, 2, 2, 0,168, 2, 2, 0,169, 2, 4, 0, 70, 0, 32, 0,169, 0, 7, 0,170, 2, 0, 0,140, 2,
+125, 0, 9, 0,107, 0,109, 2, 32, 0,169, 0, 7, 0,171, 2, 7, 0,172, 2, 7, 0,165, 2, 4, 0,173, 2, 4, 0,174, 2,
+ 7, 0,175, 2, 0, 0, 20, 0,126, 0, 1, 0,107, 0,109, 2,127, 0, 6, 0,107, 0,109, 2, 47, 0,139, 0,128, 0,176, 2,
+129, 0,177, 2,130, 0,178, 2,131, 0,179, 2,132, 0, 14, 0,107, 0,109, 2, 82, 0,180, 2, 82, 0,181, 2, 82, 0,182, 2,
+ 82, 0,183, 2, 82, 0,184, 2, 82, 0,185, 2, 79, 0,186, 2, 4, 0,187, 2, 4, 0,188, 2, 2, 0,189, 2, 2, 0, 37, 0,
+ 7, 0,190, 2,133, 0,191, 2,134, 0, 3, 0,107, 0,109, 2,135, 0,192, 2,136, 0,191, 2,137, 0, 4, 0,107, 0,109, 2,
+ 32, 0,169, 0, 4, 0,193, 2, 4, 0, 37, 0,138, 0, 2, 0, 4, 0,194, 2, 7, 0,220, 1,139, 0, 2, 0, 4, 0,130, 0,
+ 4, 0,195, 2,140, 0, 20, 0,107, 0,109, 2, 32, 0,169, 0, 0, 0,140, 2, 2, 0,196, 2, 2, 0,197, 2, 2, 0, 19, 0,
+ 2, 0, 37, 0, 7, 0,198, 2, 7, 0,199, 2, 4, 0, 54, 0, 4, 0,200, 2,139, 0,201, 2,138, 0,202, 2, 4, 0,203, 2,
+ 4, 0,204, 2, 4, 0,205, 2, 4, 0,195, 2, 7, 0,206, 2, 7, 0,207, 2, 7, 0,208, 2,141, 0, 8, 0,107, 0,109, 2,
+142, 0,209, 2,135, 0,192, 2, 4, 0,210, 2, 4, 0,211, 2, 4, 0,212, 2, 2, 0, 19, 0, 2, 0, 57, 0,143, 0, 8, 0,
+107, 0,109, 2, 32, 0, 45, 0, 2, 0,213, 2, 2, 0, 19, 0, 2, 0,130, 2, 2, 0, 57, 0, 7, 0,214, 2, 7, 0,215, 2,
+144, 0, 5, 0,107, 0,109, 2, 4, 0,216, 2, 2, 0, 19, 0, 2, 0,217, 2, 7, 0,218, 2,145, 0, 7, 0,107, 0,109, 2,
+ 82, 0,219, 2, 4, 0,220, 2, 0, 0,221, 2, 0, 0,222, 2, 0, 0,223, 2, 0, 0,224, 2,146, 0, 3, 0,107, 0,109, 2,
+147, 0,225, 2,131, 0,179, 2,148, 0, 10, 0,107, 0,109, 2, 32, 0,226, 2, 32, 0,227, 2, 0, 0,228, 2, 7, 0,229, 2,
+ 2, 0,230, 2, 2, 0,231, 2, 0, 0,232, 2, 0, 0,233, 2, 0, 0,115, 2,149, 0, 9, 0,107, 0,109, 2, 32, 0,234, 2,
+ 0, 0,228, 2, 7, 0,235, 2, 7, 0,236, 2, 0, 0, 14, 1, 0, 0,130, 2, 0, 0,237, 2, 0, 0, 37, 0,150, 0, 27, 0,
+ 27, 0, 31, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,238, 2, 2, 0, 19, 0, 2, 0,239, 2, 2, 0,240, 2, 2, 0,241, 2,
+ 2, 0, 70, 0, 0, 0,242, 2, 0, 0,243, 2, 0, 0,244, 2, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0,245, 2, 7, 0,246, 2,
+ 7, 0,247, 2, 7, 0,248, 2, 7, 0,249, 2, 7, 0,250, 2, 34, 0,251, 2, 36, 0, 80, 0, 38, 0,251, 1, 84, 0, 40, 2,
+ 7, 0,252, 2, 7, 0,253, 2,150, 0,254, 2,151, 0, 3, 0,151, 0, 0, 0,151, 0, 1, 0, 0, 0, 20, 0, 69, 0, 3, 0,
+ 7, 0,255, 2, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,112, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 0, 3,
+ 4, 0, 1, 3, 4, 0, 2, 3, 4, 0, 3, 3, 0, 0, 4, 3, 32, 0, 38, 0, 32, 0, 5, 3, 32, 0, 6, 3, 32, 0, 7, 3,
+ 32, 0, 8, 3, 36, 0, 80, 0, 75, 0,250, 1, 69, 0,192, 1,152, 0, 9, 3,152, 0, 10, 3,153, 0, 11, 3, 9, 0, 2, 0,
+ 12, 0, 12, 3, 12, 0, 34, 2, 12, 0,211, 1, 12, 0, 13, 3, 12, 0, 14, 3, 64, 0,213, 1, 0, 0, 15, 3, 4, 0,214, 1,
+ 4, 0, 16, 3, 7, 0, 9, 1, 7, 0, 17, 3, 7, 0, 18, 3, 7, 0,177, 0, 7, 0, 19, 3, 7, 0, 10, 1, 7, 0, 20, 3,
+ 7, 0, 21, 3, 7, 0,171, 2, 7, 0, 22, 3, 7, 0,213, 0, 4, 0, 23, 3, 2, 0, 19, 0, 2, 0, 24, 3, 2, 0, 25, 3,
+ 2, 0, 26, 3, 2, 0, 27, 3, 2, 0, 28, 3, 2, 0, 29, 3, 2, 0, 30, 3, 2, 0, 31, 3, 2, 0, 32, 3, 2, 0, 33, 3,
+ 2, 0, 34, 3, 4, 0, 35, 3, 4, 0, 36, 3, 4, 0, 37, 3, 4, 0, 38, 3, 7, 0, 39, 3, 7, 0, 26, 2, 7, 0, 40, 3,
+ 7, 0, 41, 3, 7, 0, 42, 3, 7, 0, 43, 3, 7, 0, 44, 3, 7, 0, 45, 3, 7, 0, 46, 3, 7, 0, 47, 3, 7, 0, 48, 3,
+ 7, 0, 49, 3, 0, 0, 50, 3, 0, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 7, 0, 54, 3, 7, 0, 55, 3, 40, 0,126, 0,
+ 12, 0, 56, 3, 12, 0, 57, 3, 12, 0, 58, 3, 12, 0, 59, 3, 7, 0, 60, 3, 2, 0, 81, 2, 2, 0, 61, 3, 7, 0, 63, 2,
+ 4, 0, 62, 3, 4, 0, 63, 3,154, 0, 64, 3, 2, 0, 65, 3, 2, 0,220, 0, 7, 0, 66, 3, 12, 0, 67, 3, 12, 0, 68, 3,
+ 12, 0, 69, 3, 12, 0, 70, 3,155, 0, 71, 3,156, 0, 72, 3, 65, 0, 73, 3, 2, 0, 74, 3, 2, 0, 75, 3, 2, 0, 76, 3,
+ 2, 0, 77, 3, 7, 0, 55, 2, 2, 0, 78, 3, 2, 0, 79, 3,147, 0, 80, 3,135, 0, 81, 3,135, 0, 82, 3, 4, 0, 83, 3,
+ 4, 0, 84, 3, 4, 0, 85, 3, 4, 0, 70, 0, 12, 0, 86, 3,157, 0, 14, 0,157, 0, 0, 0,157, 0, 1, 0, 32, 0, 38, 0,
+ 7, 0,171, 2, 7, 0, 11, 1, 7, 0,172, 2, 7, 0,165, 2, 0, 0, 20, 0, 4, 0,173, 2, 4, 0,174, 2, 4, 0, 87, 3,
+ 2, 0, 17, 0, 2, 0, 88, 3, 7, 0,175, 2,155, 0, 36, 0, 2, 0, 89, 3, 2, 0, 90, 3, 2, 0, 19, 0, 2, 0,165, 2,
+ 7, 0, 91, 3, 7, 0, 92, 3, 7, 0, 93, 3, 7, 0, 94, 3, 7, 0, 95, 3, 7, 0, 96, 3, 7, 0, 97, 3, 7, 0, 98, 3,
+ 7, 0, 99, 3, 7, 0,100, 3, 7, 0,101, 3, 7, 0,102, 3, 7, 0,103, 3, 7, 0,104, 3, 7, 0,105, 3, 7, 0,106, 3,
+ 7, 0,107, 3, 7, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,111, 3, 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3,
+ 2, 0,115, 3, 2, 0,116, 3, 2, 0,117, 3, 2, 0,118, 3, 53, 0,170, 0,158, 0,119, 3, 7, 0,120, 3, 4, 0,118, 2,
+159, 0, 6, 0,159, 0, 0, 0,159, 0, 1, 0, 4, 0,121, 3, 4, 0,122, 3, 7, 0, 2, 0, 9, 0,123, 3,131, 0, 12, 0,
+ 4, 0, 19, 0, 4, 0,124, 3, 4, 0,125, 3, 4, 0,126, 3, 4, 0,127, 3, 4, 0,128, 3, 4, 0,129, 3, 4, 0,130, 3,
+ 0, 0,131, 3, 0, 0,132, 3, 0, 0,133, 3, 12, 0,134, 3,160, 0, 1, 0, 7, 0,228, 1,154, 0, 30, 0, 4, 0, 19, 0,
+ 7, 0,135, 3, 7, 0,136, 3, 7, 0,137, 3, 4, 0,138, 3, 4, 0,139, 3, 4, 0,140, 3, 4, 0,141, 3, 7, 0,142, 3,
+ 7, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 7, 0,146, 3, 7, 0,147, 3, 7, 0,148, 3, 7, 0,149, 3, 7, 0,150, 3,
+ 7, 0,151, 3, 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3, 7, 0,155, 3, 7, 0,156, 3, 7, 0,157, 3, 7, 0,158, 3,
+ 7, 0,159, 3, 4, 0,160, 3, 4, 0,161, 3, 7, 0,162, 3, 7, 0, 46, 3,156, 0, 44, 0,142, 0,163, 3, 4, 0,122, 3,
+ 4, 0,164, 3,161, 0,165, 3,162, 0,166, 3, 7, 0, 37, 0, 7, 0,167, 3, 7, 0,168, 3, 7, 0,169, 3, 7, 0,170, 3,
+ 7, 0,171, 3, 7, 0,172, 3, 7, 0,173, 3, 7, 0,174, 3, 7, 0,175, 3, 7, 0,176, 3, 2, 0,177, 3, 2, 0,178, 3,
+ 7, 0,179, 3, 7, 0,180, 3, 4, 0,131, 0, 4, 0,181, 3, 4, 0,182, 3, 2, 0,183, 3, 2, 0,184, 3,160, 0,185, 3,
+ 4, 0,186, 3, 4, 0, 82, 0, 7, 0,187, 3, 7, 0,188, 3, 7, 0,189, 3, 7, 0,190, 3, 2, 0,191, 3, 2, 0,192, 3,
+ 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3, 2, 0,196, 3, 2, 0,197, 3, 2, 0,198, 3,163, 0,199, 3, 7, 0,200, 3,
+ 7, 0,201, 3,131, 0,202, 3,147, 0, 48, 0, 2, 0, 17, 0, 2, 0,203, 3, 2, 0,204, 3, 2, 0,205, 3, 7, 0,206, 3,
+ 2, 0,207, 3, 2, 0,208, 3, 7, 0,209, 3, 2, 0,210, 3, 2, 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, 4, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3, 7, 0,221, 3, 78, 0,222, 3,
+ 78, 0,223, 3, 78, 0,224, 3, 0, 0,225, 3, 7, 0,226, 3, 7, 0,227, 3, 36, 0, 80, 0, 2, 0,228, 3, 0, 0,229, 3,
+ 0, 0,230, 3, 7, 0,231, 3, 4, 0,232, 3, 7, 0,233, 3, 7, 0,234, 3, 4, 0,235, 3, 4, 0, 19, 0, 7, 0,236, 3,
+ 7, 0,237, 3, 7, 0,238, 3, 82, 0,239, 3, 7, 0,240, 3, 7, 0,241, 3, 7, 0,242, 3, 7, 0,243, 3, 7, 0,244, 3,
+ 7, 0,245, 3, 7, 0,246, 3, 4, 0,247, 3,164, 0, 72, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,179, 0, 2, 0, 15, 1,
+ 2, 0, 48, 1, 2, 0,248, 3, 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3,
+ 7, 0,255, 3, 7, 0, 0, 4, 7, 0, 86, 1, 7, 0, 88, 1, 7, 0, 87, 1, 7, 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, 2, 0, 10, 4, 2, 0, 14, 1,
+ 2, 0, 11, 4, 2, 0, 12, 4, 2, 0, 13, 4, 2, 0, 14, 4, 2, 0, 15, 4, 2, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4,
+ 7, 0, 19, 4, 7, 0, 20, 4, 7, 0, 21, 4, 7, 0, 22, 4, 7, 0, 23, 4, 7, 0, 24, 4, 7, 0, 25, 4, 7, 0, 26, 4,
+ 7, 0, 27, 4, 7, 0, 28, 4, 2, 0, 29, 4, 2, 0, 30, 4, 2, 0, 31, 4, 2, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4,
+ 7, 0, 35, 4, 7, 0, 36, 4, 2, 0, 37, 4, 2, 0, 38, 4, 2, 0, 39, 4, 2, 0, 40, 4, 7, 0, 41, 4, 7, 0, 42, 4,
+ 7, 0, 43, 4, 7, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4, 2, 0, 47, 4, 2, 0, 19, 0, 7, 0, 48, 4, 7, 0, 49, 4,
+ 36, 0, 80, 0, 52, 0, 78, 1, 30, 0,155, 0, 40, 0,126, 0,165, 0, 8, 0,165, 0, 0, 0,165, 0, 1, 0, 4, 0, 23, 3,
+ 4, 0, 50, 4, 4, 0, 19, 0, 2, 0, 51, 4, 2, 0, 52, 4, 32, 0,169, 0,166, 0, 13, 0, 9, 0, 53, 4, 9, 0, 54, 4,
+ 4, 0, 55, 4, 4, 0, 56, 4, 4, 0, 57, 4, 4, 0, 58, 4, 4, 0, 59, 4, 4, 0, 60, 4, 4, 0, 61, 4, 4, 0, 62, 4,
+ 4, 0, 63, 4, 4, 0, 37, 0, 0, 0, 64, 4,167, 0, 5, 0, 9, 0, 65, 4, 9, 0, 66, 4, 4, 0, 67, 4, 4, 0, 70, 0,
+ 0, 0, 68, 4,168, 0, 13, 0, 4, 0, 17, 0, 4, 0, 69, 4, 4, 0, 70, 4, 4, 0, 71, 4, 4, 0, 72, 4, 4, 0, 73, 4,
+ 4, 0, 94, 0, 4, 0, 74, 4, 4, 0, 75, 4, 4, 0, 76, 4, 4, 0, 77, 4, 4, 0, 78, 4, 26, 0, 30, 0,169, 0, 4, 0,
+ 4, 0, 79, 4, 7, 0, 80, 4, 2, 0, 19, 0, 2, 0, 81, 4,170, 0, 11, 0,170, 0, 0, 0,170, 0, 1, 0, 0, 0, 20, 0,
+ 64, 0, 82, 4, 65, 0, 83, 4, 4, 0, 23, 3, 4, 0, 84, 4, 4, 0, 85, 4, 4, 0, 37, 0, 4, 0, 86, 4, 4, 0, 87, 4,
+171, 0,131, 0,166, 0, 88, 4,167, 0, 89, 4,168, 0, 90, 4,169, 0, 91, 4, 4, 0, 92, 4, 4, 0,131, 0, 4, 0,181, 3,
+ 4, 0, 93, 4, 4, 0, 94, 4, 4, 0, 95, 4, 4, 0, 96, 4, 2, 0, 19, 0, 2, 0, 97, 4, 7, 0, 26, 2, 7, 0, 98, 4,
+ 7, 0, 99, 4, 7, 0,100, 4, 7, 0,101, 4, 7, 0,102, 4, 2, 0,103, 4, 2, 0,104, 4, 2, 0,105, 4, 2, 0,106, 4,
+ 2, 0,219, 0, 2, 0,107, 4, 2, 0,108, 4, 2, 0,118, 3, 2, 0,109, 4, 2, 0,110, 4, 2, 0, 35, 1, 2, 0,110, 0,
+ 2, 0,111, 4, 2, 0,112, 4, 2, 0,113, 4, 2, 0,114, 4, 2, 0,115, 4, 2, 0,116, 4, 2, 0,117, 4, 2, 0,118, 4,
+ 2, 0,119, 4, 2, 0, 36, 1, 2, 0,120, 4, 2, 0,121, 4, 2, 0,122, 4, 2, 0,123, 4, 4, 0,124, 4, 4, 0, 14, 1,
+ 2, 0,125, 4, 2, 0,126, 4, 2, 0,127, 4, 2, 0,128, 4, 2, 0,129, 4, 2, 0,130, 4, 24, 0,131, 4, 24, 0,132, 4,
+ 23, 0,133, 4, 12, 0,134, 4, 2, 0,135, 4, 2, 0, 37, 0, 7, 0,136, 4, 7, 0,137, 4, 7, 0,138, 4, 7, 0,139, 4,
+ 4, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 2, 0,145, 4, 2, 0,146, 4, 2, 0,147, 4,
+ 2, 0,148, 4, 2, 0,149, 4, 2, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4, 2, 0,154, 4, 2, 0,155, 4,
+ 2, 0,156, 4, 2, 0,157, 4, 2, 0,158, 4, 2, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, 2, 0,162, 4, 2, 0,163, 4,
+ 4, 0,164, 4, 4, 0,165, 4, 4, 0,166, 4, 4, 0,167, 4, 4, 0,168, 4, 7, 0,169, 4, 4, 0,170, 4, 4, 0,171, 4,
+ 4, 0,172, 4, 4, 0,173, 4, 7, 0,174, 4, 7, 0,175, 4, 7, 0,176, 4, 7, 0,177, 4, 7, 0,178, 4, 7, 0,179, 4,
+ 7, 0,180, 4, 7, 0,181, 4, 7, 0,182, 4, 0, 0,183, 4, 0, 0,184, 4, 4, 0,185, 4, 2, 0,186, 4, 2, 0,161, 1,
+ 0, 0,187, 4, 7, 0,188, 4, 7, 0,189, 4, 4, 0,190, 4, 4, 0,191, 4, 7, 0,192, 4, 7, 0,193, 4, 2, 0,194, 4,
+ 2, 0,195, 4, 7, 0,196, 4, 2, 0,197, 4, 2, 0,198, 4, 4, 0,199, 4, 2, 0,200, 4, 2, 0,201, 4, 2, 0,202, 4,
+ 2, 0,203, 4, 7, 0,204, 4, 7, 0, 70, 0, 43, 0,205, 4,172, 0, 9, 0,172, 0, 0, 0,172, 0, 1, 0, 0, 0, 20, 0,
+ 2, 0,206, 4, 2, 0,207, 4, 2, 0,208, 4, 2, 0, 43, 0, 7, 0,209, 4, 7, 0, 70, 0,173, 0, 5, 0, 7, 0,210, 4,
+ 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,161, 1,174, 0, 5, 0,174, 0, 0, 0,174, 0, 1, 0, 4, 0,121, 3,
+ 0, 0,131, 3, 4, 0, 19, 0,175, 0, 6, 0,176, 0,211, 4, 2, 0, 19, 0, 2, 0,212, 4, 2, 0,213, 4, 2, 0,214, 4,
+ 9, 0,215, 4,177, 0, 4, 0, 2, 0,110, 0, 2, 0,142, 2, 2, 0,124, 3, 2, 0,216, 4,178, 0, 10, 0, 2, 0, 19, 0,
+ 2, 0,217, 4, 2, 0,218, 4, 2, 0,219, 4,177, 0,220, 4, 9, 0,215, 4, 7, 0,221, 4, 4, 0,222, 4, 4, 0,223, 4,
+ 4, 0, 37, 0,179, 0, 4, 0,179, 0, 0, 0,179, 0, 1, 0, 0, 0,224, 4, 7, 0,225, 4,180, 0, 8, 0,181, 0,226, 4,
+176, 0,211, 4, 7, 0,227, 4, 4, 0, 94, 0, 0, 0,228, 4, 0, 0,229, 4, 0, 0,230, 4, 0, 0,231, 4,182, 0, 9, 0,
+176, 0,211, 4, 7, 0,232, 4, 7, 0,233, 4, 2, 0, 14, 1, 2, 0, 19, 0, 4, 0, 36, 0, 4, 0,234, 4, 84, 0,235, 4,
+ 9, 0,215, 4,183, 0, 72, 0,182, 0,236, 4,182, 0,237, 4,180, 0,238, 4, 7, 0,239, 4, 2, 0,240, 4, 2, 0,241, 4,
+ 7, 0,242, 4, 7, 0,243, 4, 2, 0,124, 3, 2, 0,244, 4, 7, 0,245, 4, 7, 0,246, 4, 7, 0,247, 4, 2, 0,248, 4,
+ 2, 0,223, 4, 2, 0,249, 4, 2, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 7, 0,253, 4, 7, 0,254, 4, 7, 0,255, 4,
+ 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5,175, 0, 7, 5,
+178, 0, 8, 5, 7, 0, 9, 5, 7, 0, 10, 5, 7, 0, 11, 5, 2, 0, 12, 5, 2, 0, 70, 0, 0, 0, 13, 5, 0, 0, 14, 5,
+ 0, 0, 15, 5, 0, 0, 16, 5, 0, 0, 17, 5, 0, 0, 18, 5, 2, 0, 19, 5, 7, 0, 20, 5, 7, 0, 21, 5, 7, 0, 22, 5,
+ 7, 0, 23, 5, 7, 0, 24, 5, 7, 0, 25, 5, 7, 0, 26, 5, 7, 0, 27, 5, 7, 0, 28, 5, 7, 0, 29, 5, 2, 0, 30, 5,
+ 0, 0, 31, 5, 0, 0, 32, 5, 0, 0, 33, 5, 0, 0, 34, 5, 32, 0, 35, 5, 0, 0, 36, 5, 0, 0, 37, 5, 0, 0, 38, 5,
+ 0, 0, 39, 5, 0, 0, 40, 5, 0, 0, 41, 5, 0, 0, 42, 5, 0, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5,
+ 2, 0, 47, 5, 2, 0, 48, 5,184, 0, 8, 0, 4, 0, 49, 5, 4, 0, 50, 5, 4, 0, 51, 5, 4, 0, 52, 5, 4, 0, 53, 5,
+ 4, 0, 54, 5, 4, 0, 54, 0, 4, 0, 50, 2, 47, 0, 34, 0, 27, 0, 31, 0, 39, 0, 75, 0, 32, 0, 55, 5,164, 0, 56, 5,
+ 47, 0, 57, 5, 48, 0,211, 0, 12, 0, 58, 5,165, 0, 59, 5, 32, 0, 60, 5, 7, 0, 61, 5, 7, 0, 62, 5, 7, 0, 63, 5,
+ 7, 0, 64, 5, 4, 0, 23, 3, 2, 0, 19, 0, 2, 0, 7, 1, 59, 0, 3, 1,185, 0, 65, 5,173, 0, 66, 5,183, 0, 67, 5,
+186, 0, 68, 5,171, 0,185, 0,169, 0, 91, 4, 40, 0,126, 0, 12, 0,104, 0, 12, 0, 69, 5,187, 0, 70, 5, 2, 0, 71, 5,
+ 2, 0, 72, 5, 2, 0,220, 0, 2, 0, 73, 5, 4, 0, 74, 5, 4, 0, 75, 5, 12, 0, 76, 5,188, 0, 6, 0, 48, 0,211, 0,
+ 46, 0, 2, 1, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,110, 0, 7, 0, 77, 5,189, 0, 35, 0, 7, 0, 78, 5, 7, 0, 79, 5,
+ 7, 0, 80, 5, 7, 0, 81, 5, 7, 0, 82, 5, 7, 0, 83, 5, 7, 0, 84, 5, 7, 0, 85, 5, 7, 0, 86, 5, 7, 0, 21, 1,
+ 7, 0, 87, 5, 7, 0, 88, 5, 7, 0, 89, 5, 7, 0, 90, 5, 7, 0,176, 0, 2, 0, 91, 5, 2, 0, 92, 5, 4, 0, 93, 5,
+ 2, 0, 94, 5, 2, 0, 95, 5, 2, 0, 96, 5, 2, 0, 97, 5, 7, 0, 98, 5, 69, 0, 99, 5,190, 0,100, 5,189, 0,101, 5,
+191, 0,102, 5,192, 0,103, 5,193, 0,104, 5,194, 0,105, 5,195, 0,106, 5, 7, 0,107, 5, 2, 0,108, 5, 2, 0,109, 5,
+ 4, 0,161, 1,196, 0, 54, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,
+ 7, 0, 86, 5, 7, 0, 21, 1, 7, 0, 43, 0, 4, 0,114, 5, 2, 0, 96, 5, 2, 0, 97, 5, 32, 0, 55, 5, 32, 0,115, 5,
+188, 0,116, 5,196, 0,101, 5, 0, 0,117, 5, 4, 0, 23, 3, 4, 0,118, 5, 2, 0,119, 5, 2, 0,120, 5, 2, 0,121, 5,
+ 2, 0,122, 5, 2, 0,161, 1, 2, 0, 19, 0, 2, 0,123, 5, 2, 0,124, 5, 7, 0,116, 0, 7, 0,125, 5, 7, 0,126, 5,
+ 7, 0,127, 5, 7, 0,128, 5, 7, 0,129, 5, 7, 0,176, 0, 7, 0, 61, 5, 2, 0,130, 5, 2, 0, 65, 1, 2, 0,131, 5,
+ 2, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5, 2, 0,135, 5, 2, 0,136, 5, 2, 0,137, 5, 2, 0,138, 5, 4, 0,139, 5,
+ 12, 0,140, 5, 2, 0,141, 5, 2, 0, 64, 2, 2, 0,142, 5, 0, 0,143, 5, 0, 0,144, 5, 9, 0,145, 5,190, 0,100, 5,
+198, 0, 22, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0,146, 5, 23, 0,147, 5, 23, 0,148, 5, 7, 0,149, 5, 7, 0,150, 5,
+ 7, 0,151, 5, 7, 0,152, 5, 2, 0,153, 5, 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5, 2, 0,157, 5, 2, 0, 19, 0,
+ 2, 0,158, 5, 2, 0,159, 5, 2, 0,160, 5, 2, 0,161, 5, 2, 0,162, 5, 2, 0,122, 5, 7, 0,163, 5,197, 0, 6, 0,
+197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,199, 0, 8, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,200, 0,164, 5, 47, 0,139, 0,201, 0, 14, 0,
+197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,202, 0,166, 5,
+ 12, 0,167, 5, 2, 0, 14, 1, 2, 0, 19, 0, 2, 0,168, 5, 0, 0,169, 5, 0, 0,170, 5,203, 0, 31, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,191, 0,102, 5, 2, 0,171, 5, 2, 0,172, 5,
+ 2, 0,158, 5, 2, 0,173, 5,198, 0,165, 5, 2, 0,174, 5, 2, 0,138, 0, 2, 0,169, 5, 2, 0,175, 5, 9, 0,176, 5,
+ 2, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 2, 0,180, 5, 2, 0,181, 5, 2, 0, 32, 3, 2, 0,182, 5, 2, 0,183, 5,
+ 0, 0, 19, 0, 0, 0, 48, 1, 9, 0,250, 1, 4, 0,184, 5, 4, 0,185, 5, 27, 0,186, 5,204, 0, 16, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 7, 0, 14, 2, 7, 0, 15, 2,
+ 2, 0,174, 5, 2, 0,187, 5, 2, 0,188, 5, 2, 0,189, 5, 4, 0, 19, 0, 7, 0,190, 5,190, 0,100, 5,205, 0, 15, 0,
+ 0, 0,191, 5, 0, 0,192, 5, 0, 0,193, 5, 2, 0, 19, 0, 2, 0,194, 5, 2, 0,195, 5, 2, 0,104, 1, 2, 0,196, 5,
+ 2, 0, 37, 0, 4, 0,197, 5, 4, 0,198, 5, 2, 0,199, 5, 2, 0,200, 5, 0, 0,201, 5, 0, 0,202, 5,206, 0, 12, 0,
+197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 4, 0, 37, 0,205, 0,203, 5,207, 0,204, 5, 12, 0,205, 5,
+ 12, 0,206, 5,208, 0,207, 5,195, 0,208, 5,209, 0,209, 5,210, 0, 17, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5,
+ 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 12, 0,210, 5,211, 0,211, 5, 0, 0,212, 5,212, 0,213, 5,
+ 4, 0,214, 5, 4, 0,215, 5, 2, 0, 19, 0, 2, 0,216, 5, 2, 0,217, 5, 2, 0, 37, 0,213, 0, 29, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 48, 0,150, 2, 46, 0, 2, 1, 62, 0,218, 5,
+ 2, 0,138, 0, 2, 0,219, 5, 2, 0, 70, 0, 2, 0,220, 5, 4, 0, 19, 0, 2, 0,221, 5, 2, 0,170, 5, 2, 0,169, 5,
+ 2, 0,161, 1, 0, 0,222, 5, 0, 0,223, 5, 0, 0,224, 5, 0, 0,122, 5, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,190, 5,
+ 7, 0, 65, 1, 7, 0,225, 5, 7, 0,226, 5,190, 0,100, 5,214, 0, 11, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5,
+ 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 2, 0,168, 5, 2, 0, 19, 0, 4, 0, 37, 0,202, 0,166, 5,198, 0,165, 5,
+215, 0, 27, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 43, 0,227, 5,
+ 4, 0,228, 5, 4, 0,229, 5, 2, 0, 94, 0, 2, 0,138, 0, 2, 0,230, 5, 0, 0,231, 5, 0, 0,232, 5, 4, 0,233, 5,
+ 4, 0,234, 5, 4, 0,235, 5, 4, 0,236, 5, 2, 0,237, 5, 2, 0,238, 5, 7, 0,239, 5, 23, 0,240, 5, 23, 0,241, 5,
+ 4, 0,242, 5, 4, 0,243, 5, 0, 0,244, 5, 0, 0,245, 5,216, 0, 10, 0, 27, 0, 31, 0, 9, 0,246, 5, 9, 0,247, 5,
+ 9, 0,248, 5, 9, 0,249, 5, 9, 0,250, 5, 4, 0, 94, 0, 4, 0,251, 5, 0, 0,252, 5, 0, 0,253, 5,217, 0, 10, 0,
+197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5,216, 0,254, 5, 2, 0, 94, 0, 2, 0,138, 0,
+ 4, 0, 43, 0, 9, 0,255, 5,218, 0, 8, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5,
+198, 0,165, 5, 4, 0, 19, 0, 4, 0, 0, 6,219, 0, 23, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5,
+ 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 27, 0, 1, 6, 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,138, 0, 7, 0, 2, 6,
+ 9, 0, 3, 6, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0, 4, 6, 7, 0, 5, 6, 59, 0, 3, 1, 59, 0, 6, 6, 4, 0, 7, 6,
+ 2, 0,178, 5, 2, 0, 37, 0,190, 0,100, 5,220, 0, 10, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5,
+ 7, 0,112, 5, 2, 0,113, 5, 2, 0, 19, 0, 2, 0, 32, 3, 4, 0, 37, 0,190, 0,100, 5,221, 0, 42, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,207, 0,204, 5, 0, 0,191, 5,
+ 0, 0,192, 5, 0, 0,193, 5, 2, 0, 17, 0, 2, 0,200, 5, 2, 0, 19, 0, 2, 0,194, 5, 9, 0, 3, 6, 4, 0,197, 5,
+ 4, 0, 8, 6, 4, 0, 9, 6, 4, 0,198, 5, 23, 0, 10, 6, 23, 0, 11, 6, 7, 0, 12, 6, 7, 0, 13, 6, 7, 0, 14, 6,
+ 7, 0, 2, 6, 2, 0, 15, 6, 2, 0,210, 0, 2, 0,104, 1, 2, 0,196, 5, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 16, 6,
+ 2, 0, 17, 6, 9, 0, 18, 6, 9, 0, 19, 6, 9, 0, 20, 6, 9, 0, 21, 6, 9, 0, 22, 6, 2, 0, 23, 6, 0, 0,202, 5,
+ 58, 0, 24, 6,222, 0, 7, 0,222, 0, 0, 0,222, 0, 1, 0, 4, 0, 25, 6, 4, 0, 23, 0, 0, 0, 88, 0, 4, 0, 26, 6,
+ 4, 0, 17, 0,223, 0, 13, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,
+ 4, 0, 17, 0, 4, 0, 27, 6, 4, 0, 19, 0, 4, 0,230, 5, 12, 0, 28, 6, 12, 0, 29, 6, 0, 0, 30, 6,224, 0, 7, 0,
+224, 0, 0, 0,224, 0, 1, 0, 0, 0, 31, 6, 2, 0, 32, 6, 2, 0, 33, 6, 2, 0, 34, 6, 2, 0, 37, 0,225, 0, 12, 0,
+ 2, 0, 33, 6, 2, 0, 35, 6, 2, 0, 36, 6, 0, 0,115, 2, 2, 0, 37, 6, 2, 0, 38, 6, 2, 0, 39, 6, 2, 0, 40, 6,
+ 2, 0, 41, 6, 2, 0,158, 5, 7, 0, 42, 6, 7, 0, 43, 6,226, 0, 18, 0,226, 0, 0, 0,226, 0, 1, 0, 0, 0,131, 3,
+225, 0, 44, 6,225, 0, 45, 6,225, 0, 46, 6,225, 0, 47, 6, 7, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 51, 6,
+ 2, 0, 52, 6, 2, 0, 53, 6, 2, 0, 54, 6, 2, 0, 55, 6, 2, 0, 56, 6, 2, 0, 57, 6, 2, 0, 58, 6,227, 0, 10, 0,
+ 0, 0, 59, 6, 0, 0, 60, 6, 0, 0, 61, 6, 0, 0, 62, 6, 0, 0, 63, 6, 0, 0, 64, 6, 2, 0, 65, 6, 2, 0, 66, 6,
+ 2, 0, 67, 6, 2, 0, 37, 0,228, 0, 8, 0, 0, 0, 68, 6, 0, 0, 69, 6, 0, 0, 70, 6, 0, 0, 71, 6, 0, 0, 72, 6,
+ 0, 0, 73, 6, 7, 0, 77, 5, 7, 0, 37, 0,229, 0, 16, 0,227, 0, 74, 6,227, 0, 75, 6,227, 0, 76, 6,227, 0, 77, 6,
+227, 0, 78, 6,227, 0, 79, 6,227, 0, 80, 6,227, 0, 81, 6,227, 0, 82, 6,227, 0, 83, 6,227, 0, 84, 6,227, 0, 85, 6,
+227, 0, 86, 6,227, 0, 87, 6,228, 0, 88, 6, 0, 0, 89, 6,230, 0, 71, 0, 0, 0, 90, 6, 0, 0, 91, 6, 0, 0, 63, 6,
+ 0, 0, 92, 6, 0, 0, 93, 6, 0, 0, 94, 6, 0, 0, 95, 6, 0, 0, 96, 6, 0, 0, 97, 6, 0, 0, 98, 6, 0, 0, 99, 6,
+ 0, 0,100, 6, 0, 0,101, 6, 0, 0,102, 6, 0, 0,103, 6, 0, 0,104, 6, 0, 0,105, 6, 0, 0,106, 6, 0, 0,107, 6,
+ 0, 0,108, 6, 0, 0,109, 6, 0, 0,110, 6, 0, 0,111, 6, 0, 0,112, 6, 0, 0,113, 6, 0, 0,114, 6, 0, 0,115, 6,
+ 0, 0,116, 6, 0, 0,117, 6, 0, 0,118, 6, 0, 0,119, 6, 0, 0,120, 6, 0, 0,121, 6, 0, 0,122, 6, 0, 0,123, 6,
+ 0, 0,124, 6, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0,128, 6, 0, 0,129, 6, 0, 0,130, 6, 0, 0,131, 6,
+ 0, 0,132, 6, 0, 0,133, 6, 0, 0,134, 6, 0, 0,135, 6, 0, 0,136, 6, 0, 0,137, 6, 0, 0,138, 6, 0, 0,139, 6,
+ 0, 0,140, 6, 0, 0,141, 6, 0, 0,142, 6, 0, 0,143, 6, 0, 0,144, 6, 0, 0,145, 6, 0, 0,146, 6, 0, 0,147, 6,
+ 0, 0,148, 6, 0, 0,149, 6, 0, 0,150, 6, 0, 0,151, 6, 0, 0,152, 6, 0, 0,153, 6, 0, 0,154, 6, 0, 0,155, 6,
+ 0, 0,156, 6, 0, 0,157, 6, 0, 0,158, 6, 0, 0, 96, 0,231, 0, 5, 0, 0, 0,159, 6, 0, 0,114, 6, 0, 0,116, 6,
+ 2, 0, 19, 0, 2, 0, 37, 0,232, 0, 21, 0,232, 0, 0, 0,232, 0, 1, 0, 0, 0, 20, 0,229, 0,160, 6,230, 0,161, 6,
+230, 0,162, 6,230, 0,163, 6,230, 0,164, 6,230, 0,165, 6,230, 0,166, 6,230, 0,167, 6,230, 0,168, 6,230, 0,169, 6,
+230, 0,170, 6,230, 0,171, 6,230, 0,172, 6,230, 0,173, 6,230, 0,174, 6,230, 0,175, 6,230, 0,176, 6,231, 0,177, 6,
+233, 0, 5, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 63, 2, 7, 0,178, 6, 7, 0,228, 1,234, 0, 67, 0, 4, 0, 19, 0,
+ 4, 0,179, 6, 4, 0,180, 6, 0, 0,181, 6, 0, 0,182, 6, 0, 0,183, 6, 0, 0,184, 6, 0, 0,185, 6, 0, 0,186, 6,
+ 0, 0,187, 6, 0, 0,188, 6, 0, 0,189, 6, 2, 0,190, 6, 2, 0, 37, 0, 4, 0,191, 6, 4, 0,192, 6, 4, 0,193, 6,
+ 4, 0,194, 6, 2, 0,195, 6, 2, 0,196, 6, 4, 0,197, 6, 4, 0, 43, 0, 4, 0,198, 6, 2, 0,199, 6, 2, 0,200, 6,
+ 2, 0,201, 6, 2, 0,202, 6, 12, 0,203, 6, 12, 0,204, 6, 12, 0,205, 6, 2, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6,
+ 2, 0,209, 6, 2, 0,210, 6, 2, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6,233, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6,
+ 2, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6, 2, 0,220, 6, 2, 0,221, 6, 2, 0,222, 6, 4, 0,223, 6, 4, 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, 2, 0,234, 6, 2, 0,235, 6, 2, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 7, 0,239, 6, 2, 0, 12, 5,
+ 2, 0,240, 6, 56, 0,241, 6,200, 0, 21, 0, 27, 0, 31, 0, 12, 0,242, 6, 12, 0,243, 6, 12, 0,244, 6, 12, 0,110, 5,
+ 47, 0,139, 0, 47, 0,245, 6, 2, 0,246, 6, 2, 0,247, 6, 2, 0,248, 6, 2, 0,249, 6, 2, 0,250, 6, 2, 0,251, 6,
+ 2, 0,252, 6, 2, 0, 37, 0, 2, 0,253, 6, 2, 0,254, 6, 4, 0, 70, 0,195, 0,255, 6, 9, 0, 0, 7, 2, 0, 1, 7,
+235, 0, 5, 0,235, 0, 0, 0,235, 0, 1, 0,235, 0, 2, 7, 13, 0, 3, 7, 4, 0, 19, 0,236, 0, 7, 0,236, 0, 0, 0,
+236, 0, 1, 0,235, 0, 4, 7,235, 0, 5, 7, 2, 0,132, 4, 2, 0, 19, 0, 4, 0, 37, 0,237, 0, 23, 0,237, 0, 0, 0,
+237, 0, 1, 0,238, 0, 6, 7,239, 0,209, 5, 0, 0, 7, 7, 0, 0, 8, 7, 0, 0, 9, 7, 2, 0, 10, 7, 2, 0, 11, 7,
+ 2, 0, 12, 7, 2, 0, 13, 7, 2, 0, 14, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0, 15, 7, 2, 0, 16, 7, 2, 0, 17, 7,
+ 4, 0, 18, 7,237, 0, 19, 7, 9, 0, 20, 7, 4, 0, 21, 7, 4, 0, 22, 7, 0, 0, 23, 7,240, 0, 2, 0,241, 0, 6, 7,
+239, 0,209, 5,242, 0, 2, 0,243, 0, 6, 7,239, 0,209, 5,244, 0, 23, 0,244, 0, 0, 0,244, 0, 1, 0,235, 0, 4, 7,
+235, 0, 5, 7,235, 0, 24, 7,235, 0, 25, 7,200, 0, 26, 7, 23, 0, 52, 0, 0, 0,111, 5, 0, 0, 27, 7, 2, 0,159, 5,
+ 2, 0,160, 5, 2, 0, 28, 7, 2, 0, 37, 0, 2, 0,249, 6, 2, 0, 26, 6, 2, 0, 19, 0, 40, 0,126, 0,245, 0, 6, 7,
+ 12, 0, 29, 7, 12, 0,110, 5, 12, 0, 30, 7, 12, 0, 31, 7,246, 0, 21, 0,246, 0, 0, 0,246, 0, 1, 0,198, 0,165, 5,
+ 23, 0, 32, 7, 23, 0, 33, 7, 2, 0,159, 5, 2, 0,160, 5, 2, 0, 34, 7, 2, 0, 35, 7, 2, 0, 36, 7, 2, 0, 19, 0,
+ 7, 0, 10, 2, 2, 0,248, 6, 2, 0,252, 6, 4, 0, 43, 0,247, 0, 6, 7, 12, 0, 37, 7, 12, 0, 38, 7, 12, 0, 30, 7,
+ 0, 0, 39, 7, 9, 0, 40, 7,248, 0, 11, 0, 0, 0, 41, 7, 2, 0, 42, 7, 2, 0, 43, 7, 2, 0, 44, 7, 2, 0, 45, 7,
+ 2, 0,121, 4, 2, 0,116, 4,200, 0, 46, 7, 47, 0, 47, 7, 4, 0, 48, 7, 4, 0, 49, 7,249, 0, 1, 0, 0, 0, 50, 7,
+250, 0, 8, 0, 58, 0, 51, 7, 58, 0, 52, 7,250, 0, 53, 7,250, 0, 54, 7,250, 0, 55, 7, 2, 0,134, 0, 2, 0, 19, 0,
+ 4, 0, 56, 7,251, 0, 4, 0, 4, 0,228, 5, 4, 0, 57, 7, 4, 0,233, 5, 4, 0, 58, 7,252, 0, 2, 0, 4, 0, 59, 7,
+ 4, 0, 60, 7,253, 0, 7, 0, 7, 0, 61, 7, 7, 0, 62, 7, 7, 0, 63, 7, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 3, 4,
+ 7, 0, 64, 7,254, 0, 6, 0, 0, 0, 65, 7, 0, 0,193, 5, 50, 0,142, 0, 2, 0,110, 0, 2, 0,120, 4, 4, 0, 37, 0,
+255, 0, 21, 0,255, 0, 0, 0,255, 0, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 66, 7, 4, 0, 67, 7,
+ 4, 0, 68, 7,249, 0, 69, 7, 0, 0, 65, 7, 4, 0, 70, 7, 4, 0, 71, 7,254, 0, 6, 3,251, 0, 72, 7,252, 0, 73, 7,
+253, 0, 74, 7,250, 0, 75, 7,250, 0, 76, 7,250, 0, 77, 7, 58, 0, 78, 7, 58, 0, 79, 7, 0, 1, 12, 0, 0, 0,191, 1,
+ 9, 0,196, 0, 0, 0,197, 0, 4, 0,200, 0, 4, 0,208, 0, 9, 0,201, 0, 7, 0,203, 0, 7, 0,204, 0, 9, 0, 80, 7,
+ 9, 0, 81, 7, 9, 0,205, 0, 9, 0,207, 0, 1, 1, 43, 0, 1, 1, 0, 0, 1, 1, 1, 0, 9, 0, 82, 7, 9, 0, 26, 0,
+ 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 92, 0, 4, 0, 83, 7, 4, 0, 84, 7, 4, 0, 67, 7,
+ 4, 0, 68, 7, 4, 0, 85, 7, 4, 0,219, 0, 4, 0, 86, 7, 4, 0, 87, 7, 7, 0,233, 4, 7, 0, 88, 7, 4, 0,131, 0,
+ 4, 0, 89, 7,255, 0, 90, 7, 36, 0, 80, 0, 47, 0,139, 0, 50, 0,142, 0, 7, 0, 91, 7, 7, 0, 92, 7, 0, 1, 4, 1,
+ 1, 1, 93, 7, 1, 1, 94, 7, 1, 1, 95, 7, 12, 0, 96, 7, 2, 1, 97, 7, 3, 1, 98, 7, 7, 0, 99, 7, 7, 0,100, 7,
+ 4, 0,101, 7, 7, 0,102, 7, 9, 0,103, 7, 4, 0,104, 7, 4, 0,105, 7, 4, 0,106, 7, 7, 0,107, 7, 4, 1, 4, 0,
+ 4, 1, 0, 0, 4, 1, 1, 0, 12, 0,108, 7, 1, 1,109, 7,185, 0, 6, 0, 12, 0,110, 7, 12, 0, 96, 7, 12, 0,111, 7,
+ 1, 1,112, 7, 0, 0,113, 7, 0, 0,114, 7, 5, 1, 4, 0, 7, 0,115, 7, 7, 0,113, 0, 2, 0,116, 7, 2, 0,117, 7,
+ 6, 1, 6, 0, 7, 0,118, 7, 7, 0,119, 7, 7, 0,120, 7, 7, 0,121, 7, 4, 0,122, 7, 4, 0,123, 7, 7, 1, 12, 0,
+ 7, 0,124, 7, 7, 0,125, 7, 7, 0,126, 7, 7, 0,127, 7, 7, 0,128, 7, 7, 0,129, 7, 7, 0,130, 7, 7, 0,131, 7,
+ 7, 0,132, 7, 7, 0,133, 7, 4, 0,154, 2, 4, 0,134, 7, 8, 1, 2, 0, 7, 0,210, 4, 7, 0, 37, 0, 9, 1, 5, 0,
+ 7, 0,135, 7, 7, 0,136, 7, 4, 0, 94, 0, 4, 0,116, 2, 4, 0,137, 7, 10, 1, 6, 0, 10, 1, 0, 0, 10, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,138, 7, 2, 0, 57, 0, 11, 1, 8, 0, 11, 1, 0, 0, 11, 1, 1, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 2, 0,138, 7, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,131, 0, 12, 1, 45, 0, 12, 1, 0, 0, 12, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,138, 7, 2, 0,215, 0, 2, 0,177, 3, 2, 0,139, 7, 7, 0,140, 7, 7, 0, 93, 0,
+ 7, 0,167, 2, 4, 0,141, 7, 4, 0, 82, 0, 4, 0,118, 2, 7, 0,142, 7, 7, 0,143, 7, 7, 0,144, 7, 7, 0,145, 7,
+ 7, 0,146, 7, 7, 0,147, 7, 7, 0,164, 2, 7, 0, 1, 1, 7, 0,148, 7, 7, 0,149, 7, 7, 0, 37, 0, 7, 0,150, 7,
+ 7, 0,151, 7, 7, 0,152, 7, 2, 0,153, 7, 2, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7,
+ 2, 0,159, 7, 2, 0,160, 7, 2, 0,123, 5, 2, 0,161, 7, 2, 0,211, 1, 2, 0,162, 7, 0, 0,163, 7, 0, 0,164, 7,
+ 7, 0,213, 0, 13, 1,165, 7, 65, 0,164, 1, 14, 1, 16, 0, 14, 1, 0, 0, 14, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0,
+ 2, 0,138, 7, 2, 0,215, 0, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2,
+ 7, 0,166, 7, 7, 0,164, 2, 7, 0,166, 2, 7, 0,167, 2,212, 0, 5, 0, 2, 0, 17, 0, 2, 0, 56, 7, 2, 0, 19, 0,
+ 2, 0,167, 7, 27, 0, 1, 6,211, 0, 3, 0, 4, 0, 69, 0, 4, 0,168, 7,212, 0, 2, 0, 15, 1, 11, 0, 15, 1, 0, 0,
+ 15, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0,169, 7, 4, 0, 22, 0, 4, 0,170, 7, 2, 0, 19, 0, 2, 0, 37, 0,
+ 9, 0,171, 7, 9, 0,172, 7, 16, 1, 5, 0, 0, 0, 20, 0, 7, 0, 21, 1, 7, 0,173, 7, 4, 0,174, 7, 4, 0, 37, 0,
+ 17, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, 2, 0, 70, 0, 18, 1, 4, 0, 0, 0, 20, 0, 64, 0,175, 7,
+ 7, 0, 21, 1, 7, 0, 37, 0, 19, 1, 6, 0, 2, 0,176, 7, 2, 0,177, 7, 2, 0, 17, 0, 2, 0,178, 7, 0, 0,179, 7,
+ 0, 0,180, 7, 20, 1, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,181, 7, 0, 0,182, 7, 21, 1, 3, 0,
+ 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 22, 1, 4, 0, 2, 0,183, 7, 2, 0,184, 7, 2, 0, 19, 0, 2, 0, 37, 0,
+ 23, 1, 6, 0, 0, 0, 20, 0, 0, 0,185, 7, 2, 0,186, 7, 2, 0,164, 2, 2, 0, 14, 1, 2, 0, 70, 0, 24, 1, 5, 0,
+ 0, 0, 20, 0, 7, 0,113, 0, 7, 0, 5, 4, 2, 0, 19, 0, 2, 0,130, 2, 25, 1, 3, 0, 0, 0, 20, 0, 4, 0,118, 2,
+ 4, 0,183, 7, 26, 1, 7, 0, 0, 0, 20, 0, 7, 0, 5, 4, 0, 0,187, 7, 0, 0,188, 7, 2, 0, 14, 1, 2, 0, 43, 0,
+ 4, 0,189, 7, 27, 1, 3, 0, 32, 0,190, 7, 0, 0,191, 7, 0, 0,192, 7, 28, 1, 18, 0, 28, 1, 0, 0, 28, 1, 1, 0,
+ 2, 0, 17, 0, 2, 0,169, 7, 2, 0, 19, 0, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0, 43, 0, 2, 0, 70, 0,
+ 0, 0, 20, 0, 9, 0, 2, 0, 29, 1,196, 7, 32, 0, 45, 0, 2, 0,216, 4, 2, 0, 99, 7, 2, 0,197, 7, 2, 0, 37, 0,
+ 30, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,198, 7, 2, 0, 19, 0, 2, 0,130, 2, 2, 0,199, 7, 4, 0,200, 7,
+ 4, 0,201, 7, 4, 0,202, 7, 4, 0,203, 7, 4, 0,204, 7, 31, 1, 1, 0, 0, 0,205, 7, 32, 1, 4, 0, 43, 0,227, 5,
+ 0, 0,206, 7, 4, 0, 14, 1, 4, 0, 19, 0, 29, 1, 18, 0, 29, 1, 0, 0, 29, 1, 1, 0, 29, 1,207, 7, 2, 0, 17, 0,
+ 2, 0, 19, 0, 2, 0,208, 7, 2, 0,195, 7, 2, 0,169, 7, 2, 0,209, 7, 2, 0, 70, 0, 2, 0,161, 1, 0, 0, 20, 0,
+ 9, 0, 2, 0, 33, 1,196, 7, 28, 1,210, 7, 2, 0, 15, 0, 2, 0,211, 7, 4, 0,212, 7, 34, 1, 3, 0, 4, 0,190, 2,
+ 4, 0, 37, 0, 32, 0, 45, 0, 35, 1, 12, 0,152, 0,213, 7, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,140, 7, 4, 0, 93, 0,
+ 0, 0, 20, 0, 0, 0,214, 7, 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 7, 0,219, 7, 36, 1, 10, 0,
+ 2, 0, 19, 0, 2, 0,220, 7, 4, 0,140, 7, 4, 0, 93, 0, 2, 0,221, 7, 2, 1, 97, 7, 2, 0, 17, 0, 2, 0,222, 7,
+ 2, 0,223, 7, 2, 0,224, 7, 37, 1, 7, 0, 2, 0, 19, 0, 2, 0,220, 7, 4, 0,140, 7, 4, 0, 93, 0, 2, 0, 17, 0,
+ 2, 0,225, 7, 7, 0,137, 3, 38, 1, 11, 0, 4, 0,190, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 78, 0,226, 7,
+ 0, 0, 20, 0, 7, 0,227, 7, 7, 0,228, 7, 7, 0, 40, 3, 2, 0,229, 7, 2, 0,230, 7, 39, 1, 5, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 4, 0, 37, 0, 47, 0,139, 0, 32, 0, 55, 5, 40, 1, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 20, 0,
+ 0, 0,181, 7, 32, 0, 45, 0, 41, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,169, 7, 2, 0, 41, 3, 7, 0,231, 7,
+ 7, 0,232, 7, 7, 0, 9, 1, 7, 0, 10, 1, 7, 0, 17, 3, 7, 0, 20, 3, 7, 0,233, 7, 7, 0,234, 7, 32, 0,235, 7,
+ 42, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7, 4, 0, 93, 0, 0, 0, 20, 0, 0, 0,214, 7, 2, 0, 43, 0,
+ 2, 0, 64, 0, 2, 0,236, 7, 2, 0,237, 7, 43, 1, 8, 0, 32, 0, 45, 0, 7, 0,161, 2, 7, 0,238, 7, 7, 0,239, 7,
+ 7, 0,156, 2, 2, 0, 19, 0, 2, 0,130, 2, 7, 0,240, 7, 44, 1, 12, 0, 2, 0, 17, 0, 2, 0, 14, 1, 2, 0, 19, 0,
+ 2, 0,164, 2, 2, 0,190, 2, 2, 0,241, 7, 4, 0, 37, 0, 7, 0,242, 7, 7, 0,243, 7, 7, 0,244, 7, 7, 0,245, 7,
+ 0, 0,246, 7, 45, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7, 4, 0, 93, 0, 0, 0, 20, 0, 2, 0, 81, 4,
+ 2, 0, 64, 0, 2, 0,236, 7, 2, 0,237, 7, 65, 0,164, 1, 46, 1, 7, 0, 4, 0,118, 2, 4, 0,247, 7, 4, 0,248, 7,
+ 4, 0,249, 7, 7, 0,250, 7, 7, 0,251, 7, 0, 0,187, 7, 47, 1, 7, 0, 0, 0,252, 7, 32, 0,253, 7, 0, 0,191, 7,
+ 2, 0,254, 7, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0,192, 7, 48, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7,
+ 4, 0, 93, 0, 0, 0,255, 7, 0, 0, 0, 8, 49, 1, 1, 0, 4, 0, 19, 0, 50, 1, 6, 0, 0, 0, 96, 0, 2, 0, 17, 0,
+ 2, 0, 19, 0, 4, 0, 1, 8, 7, 0, 2, 8, 43, 0,227, 5, 51, 1, 4, 0, 0, 0,184, 0, 2, 0, 19, 0, 4, 0, 17, 0,
+ 32, 0, 45, 0, 52, 1, 2, 0, 4, 0, 17, 0, 4, 0,148, 5, 33, 1, 10, 0, 33, 1, 0, 0, 33, 1, 1, 0, 33, 1,207, 7,
+ 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,169, 7, 2, 0, 3, 8, 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0, 53, 1, 10, 0,
+ 7, 0, 40, 3, 7, 0, 4, 8, 7, 0, 5, 8, 7, 0, 6, 8, 7, 0, 7, 8, 4, 0, 19, 0, 7, 0,241, 7, 7, 0, 8, 8,
+ 7, 0, 9, 8, 7, 0, 37, 0, 2, 1, 20, 0, 27, 0, 31, 0, 0, 0,195, 0, 54, 1, 10, 8, 9, 0, 11, 8, 44, 0,154, 0,
+ 44, 0, 12, 8, 9, 0, 13, 8, 36, 0, 80, 0, 7, 0,137, 3, 7, 0, 14, 8, 7, 0, 15, 8, 7, 0, 16, 8, 7, 0, 17, 8,
+ 7, 0, 18, 8, 7, 0, 19, 8, 4, 0, 94, 0, 4, 0, 20, 8, 0, 0, 21, 8, 0, 0, 22, 8, 0, 0, 23, 8, 55, 1, 6, 0,
+ 27, 0, 31, 0, 7, 0, 24, 8, 7, 0, 25, 8, 7, 0, 26, 8, 2, 0, 27, 8, 2, 0, 28, 8, 56, 1, 15, 0,197, 0, 0, 0,
+197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5,244, 0, 29, 8,198, 0,165, 5, 2, 1, 97, 7, 2, 0, 14, 1,
+ 2, 0,220, 7, 2, 0, 14, 2, 2, 0, 15, 2, 2, 0, 19, 0, 2, 0,170, 5, 4, 0, 70, 0, 57, 1, 6, 0, 57, 1, 0, 0,
+ 57, 1, 1, 0, 32, 0, 45, 0, 9, 0, 30, 8, 4, 0,220, 0, 4, 0, 37, 0, 65, 0, 4, 0, 27, 0, 31, 0, 12, 0, 31, 8,
+ 4, 0,136, 0, 7, 0, 32, 8, 58, 1, 25, 0, 58, 1, 0, 0, 58, 1, 1, 0, 58, 1, 38, 0, 12, 0, 33, 8, 0, 0, 20, 0,
+ 7, 0, 34, 8, 7, 0, 35, 8, 7, 0, 36, 8, 7, 0, 37, 8, 4, 0, 19, 0, 7, 0, 38, 8, 7, 0, 39, 8, 7, 0, 40, 8,
+ 7, 0, 21, 1, 7, 0,220, 1, 7, 0, 41, 8, 7, 0,116, 2, 7, 0, 42, 8, 7, 0, 43, 8, 7, 0, 44, 8, 7, 0, 45, 8,
+ 7, 0, 46, 8, 7, 0,177, 0, 2, 0,136, 0, 2, 0,249, 4, 59, 1, 20, 0, 27, 0, 31, 0, 12, 0, 47, 8, 12, 0, 48, 8,
+ 12, 0, 49, 8, 4, 0, 19, 0, 4, 0,119, 5, 2, 0,168, 2, 2, 0,184, 5, 2, 0,136, 0, 2, 0, 50, 8, 2, 0, 51, 8,
+ 2, 0, 52, 8, 2, 0, 53, 8, 2, 0, 54, 8, 4, 0, 55, 8, 4, 0, 56, 8, 4, 0, 57, 8, 4, 0, 58, 8, 4, 0, 59, 8,
+ 4, 0, 60, 8, 60, 1, 38, 0, 60, 1, 0, 0, 60, 1, 1, 0, 26, 0, 61, 8, 12, 0, 67, 3, 0, 0, 20, 0, 2, 0, 19, 0,
+ 2, 0, 62, 8, 2, 0, 63, 8, 2, 0, 64, 8, 2, 0, 26, 3, 2, 0, 65, 8, 4, 0,253, 1, 4, 0, 57, 8, 4, 0, 58, 8,
+ 58, 1, 66, 8, 60, 1, 38, 0, 60, 1, 67, 8, 12, 0, 68, 8, 9, 0, 69, 8, 9, 0, 70, 8, 9, 0, 71, 8, 7, 0, 9, 1,
+ 7, 0,177, 0, 7, 0, 72, 8, 7, 0,201, 1, 2, 0, 73, 8, 2, 0, 37, 0, 7, 0, 74, 8, 7, 0, 75, 8, 7, 0, 22, 3,
+ 7, 0, 76, 8, 7, 0, 77, 8, 7, 0, 78, 8, 7, 0, 79, 8, 7, 0, 80, 8, 7, 0, 81, 8, 7, 0,250, 1, 32, 0, 82, 8,
+153, 0, 9, 0, 12, 0, 83, 8, 2, 0, 19, 0, 2, 0, 84, 8, 7, 0, 26, 2, 7, 0, 85, 8, 7, 0, 86, 8, 12, 0, 87, 8,
+ 4, 0, 88, 8, 4, 0, 37, 0, 61, 1, 7, 0, 61, 1, 0, 0, 61, 1, 1, 0, 12, 0, 21, 8, 4, 0, 19, 0, 4, 0, 89, 8,
+ 0, 0,131, 3,231, 0, 90, 8,152, 0, 7, 0, 27, 0, 31, 0, 12, 0, 91, 8, 12, 0, 83, 8, 12, 0, 92, 8, 12, 0,104, 0,
+ 4, 0, 19, 0, 4, 0, 93, 8,202, 0, 4, 0, 27, 0, 94, 8, 12, 0, 83, 8, 4, 0, 95, 8, 4, 0, 19, 0, 62, 1, 17, 0,
+197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,152, 0, 9, 3,
+202, 0, 96, 8, 0, 0, 14, 1, 0, 0,168, 5, 2, 0, 19, 0, 2, 0, 97, 8, 2, 0,169, 5, 2, 0,170, 5, 2, 0, 98, 8,
+ 7, 0, 99, 8, 63, 1, 8, 0, 63, 1, 0, 0, 63, 1, 1, 0, 61, 1,100, 8, 36, 0, 80, 0, 12, 0, 12, 3, 4, 0, 19, 0,
+ 0, 0, 20, 0, 4, 0,101, 8, 64, 1, 5, 0, 64, 1, 0, 0, 64, 1, 1, 0, 36, 0, 80, 0, 2, 0, 19, 0, 0, 0,102, 8,
+ 65, 1, 12, 0, 65, 1, 0, 0, 65, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,103, 8, 0, 0,104, 8,
+ 0, 0,102, 8, 7, 0,105, 8, 7, 0,106, 8, 4, 0, 37, 0, 36, 0, 80, 0, 66, 1, 9, 0, 66, 1, 0, 0, 66, 1, 1, 0,
+ 32, 0,107, 8, 0, 0,108, 8, 7, 0,109, 8, 2, 0,110, 8, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 37, 0, 67, 1, 7, 0,
+ 43, 0,227, 5, 26, 0, 61, 8, 4, 0, 19, 0, 4, 0,111, 8, 12, 0,112, 8, 32, 0,107, 8, 0, 0,108, 8, 68, 1, 12, 0,
+ 32, 0,107, 8, 2, 0,113, 8, 2, 0, 19, 0, 2, 0,114, 8, 2, 0,115, 8, 0, 0,108, 8, 32, 0,116, 8, 0, 0,117, 8,
+ 7, 0,118, 8, 7, 0,220, 1, 7, 0,119, 8, 7, 0,120, 8, 69, 1, 6, 0, 32, 0,107, 8, 4, 0,121, 8, 4, 0,122, 8,
+ 4, 0, 94, 0, 4, 0, 37, 0, 0, 0,108, 8, 70, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8,
+ 71, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8, 72, 1, 10, 0, 32, 0,107, 8, 4, 0,123, 8,
+ 7, 0,130, 0, 4, 0, 19, 0, 2, 0,223, 5, 2, 0,124, 8, 2, 0, 43, 0, 2, 0, 70, 0, 7, 0,125, 8, 0, 0,108, 8,
+ 73, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8, 74, 1, 10, 0, 32, 0,107, 8, 2, 0, 17, 0,
+ 2, 0,183, 3, 4, 0, 92, 0, 4, 0, 93, 0, 7, 0,238, 7, 7, 0,239, 7, 4, 0, 37, 0,152, 0,213, 7, 0, 0,108, 8,
+ 75, 1, 4, 0, 32, 0,107, 8, 4, 0, 27, 3, 4, 0,126, 8, 0, 0,108, 8, 76, 1, 5, 0, 32, 0,107, 8, 7, 0,130, 0,
+ 4, 0,127, 8, 4, 0, 27, 3, 4, 0, 28, 3, 77, 1, 6, 0, 32, 0,107, 8, 4, 0,128, 8, 4, 0,129, 8, 7, 0,130, 8,
+ 7, 0,131, 8, 0, 0,108, 8, 78, 1, 16, 0, 32, 0,107, 8, 32, 0, 67, 8, 4, 0, 17, 0, 7, 0,132, 8, 7, 0,133, 8,
+ 7, 0,134, 8, 7, 0,135, 8, 7, 0,136, 8, 7, 0,137, 8, 7, 0,138, 8, 7, 0,139, 8, 7, 0,140, 8, 2, 0, 19, 0,
+ 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0, 79, 1, 3, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,123, 5, 80, 1, 5, 0,
+ 32, 0,107, 8, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,141, 8, 0, 0,108, 8, 81, 1, 10, 0, 32, 0,107, 8, 0, 0,108, 8,
+ 2, 0,142, 8, 2, 0,143, 8, 0, 0,144, 8, 0, 0,145, 8, 7, 0,146, 8, 7, 0,147, 8, 7, 0,148, 8, 7, 0,149, 8,
+ 82, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8, 7, 0,151, 8, 2, 0, 19, 0,
+ 2, 0,123, 5, 83, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8, 7, 0,151, 8,
+ 2, 0, 19, 0, 2, 0,123, 5, 84, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8,
+ 7, 0,151, 8, 2, 0, 19, 0, 2, 0,123, 5, 85, 1, 7, 0, 32, 0,107, 8, 0, 0,108, 8, 7, 0, 21, 1, 7, 0, 31, 1,
+ 2, 0, 19, 0, 2, 0, 14, 1, 4, 0, 37, 0, 86, 1, 5, 0, 32, 0,226, 2, 7, 0, 21, 1, 2, 0,230, 2, 0, 0,232, 2,
+ 0, 0,152, 8, 87, 1, 10, 0, 87, 1, 0, 0, 87, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,153, 8, 7, 0,222, 0,
+ 7, 0,223, 0, 2, 0, 21, 8, 2, 0,154, 8, 32, 0, 45, 0, 88, 1, 22, 0, 88, 1, 0, 0, 88, 1, 1, 0, 2, 0, 19, 0,
+ 2, 0, 14, 1, 2, 0,155, 8, 2, 0,156, 8, 36, 0, 80, 0,152, 0,213, 7, 32, 0,169, 0, 7, 0, 92, 0, 7, 0, 93, 0,
+ 7, 0,157, 8, 7, 0,158, 8, 7, 0,159, 8, 7, 0,160, 8, 7, 0,157, 2, 7, 0,161, 8, 7, 0,215, 7, 7, 0,162, 8,
+ 0, 0,163, 8, 0, 0,164, 8, 12, 0, 14, 3, 89, 1, 8, 0, 7, 0,228, 1, 7, 0,238, 7, 7, 0,239, 7, 9, 0, 2, 0,
+ 2, 0,165, 8, 2, 0,166, 8, 2, 0,167, 8, 2, 0,168, 8, 90, 1, 18, 0, 90, 1, 0, 0, 90, 1, 1, 0, 90, 1,169, 8,
+ 0, 0, 20, 0, 89, 1,170, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,171, 8, 2, 0,172, 8, 2, 0,173, 8, 2, 0,174, 8,
+ 4, 0, 43, 0, 7, 0,175, 8, 7, 0,176, 8, 4, 0,177, 8, 4, 0,178, 8, 90, 1,179, 8, 91, 1,180, 8, 92, 1, 33, 0,
+ 92, 1, 0, 0, 92, 1, 1, 0, 92, 1,181, 8, 0, 0, 20, 0, 0, 0,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 66, 7,
+ 2, 0, 99, 7, 2, 0,183, 8, 2, 0,138, 0, 2, 0,172, 8, 2, 0, 56, 7, 12, 0,208, 7, 12, 0,184, 8, 27, 0, 1, 6,
+ 9, 0,185, 8, 7, 0,175, 8, 7, 0,176, 8, 7, 0,255, 1, 7, 0,186, 8, 2, 0,187, 8, 2, 0,188, 8, 7, 0,189, 8,
+ 7, 0,190, 8, 2, 0,191, 8, 2, 0,192, 8, 9, 0,193, 8, 24, 0,194, 8, 24, 0,195, 8, 24, 0,196, 8, 93, 1,155, 0,
+ 94, 1,197, 8, 91, 1, 8, 0, 91, 1, 0, 0, 91, 1, 1, 0, 92, 1,198, 8, 92, 1,199, 8, 90, 1,200, 8, 90, 1,179, 8,
+ 4, 0, 19, 0, 4, 0, 37, 0, 59, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 12, 0,201, 8, 12, 0,202, 8, 89, 1,203, 8,
+ 12, 0,204, 8, 4, 0, 17, 0, 4, 0,205, 8, 4, 0,206, 8, 4, 0,207, 8, 12, 0,208, 8, 94, 1,209, 8, 90, 1,210, 8,
+ 90, 1,211, 8, 9, 0,212, 8, 9, 0,213, 8, 4, 0,214, 8, 9, 0,215, 8, 9, 0,216, 8, 9, 0,217, 8, 95, 1, 6, 0,
+ 4, 0,129, 0, 4, 0,131, 0, 4, 0, 56, 7, 0, 0,218, 8, 0, 0,219, 8, 2, 0, 37, 0, 96, 1, 16, 0, 2, 0, 12, 7,
+ 2, 0, 13, 7, 2, 0,220, 8, 2, 0, 5, 8, 2, 0,221, 8, 2, 0, 68, 0, 7, 0,156, 2, 7, 0,222, 8, 7, 0,223, 8,
+ 2, 0, 35, 1, 0, 0,224, 8, 0, 0,232, 4, 2, 0,225, 8, 2, 0, 37, 0, 4, 0,226, 8, 4, 0,227, 8, 97, 1, 9, 0,
+ 7, 0,228, 8, 7, 0,229, 8, 7, 0, 19, 8, 7, 0,113, 0, 7, 0,230, 8, 7, 0,190, 5, 2, 0,231, 8, 0, 0,232, 8,
+ 0, 0, 37, 0, 98, 1, 4, 0, 7, 0,233, 8, 7, 0,234, 8, 2, 0,231, 8, 2, 0, 37, 0, 99, 1, 3, 0, 7, 0,235, 8,
+ 7, 0,236, 8, 7, 0, 15, 0,100, 1, 7, 0, 0, 0,191, 1, 2, 0,118, 4, 2, 0,119, 4, 2, 0,120, 4, 2, 0, 69, 4,
+ 4, 0,131, 0, 4, 0,181, 3,101, 1, 7, 0, 7, 0,237, 8, 7, 0,238, 8, 7, 0,239, 8, 7, 0, 10, 2, 7, 0,240, 8,
+ 7, 0,241, 8, 7, 0,242, 8,102, 1, 4, 0, 2, 0,243, 8, 2, 0,244, 8, 2, 0,245, 8, 2, 0,246, 8,103, 1, 2, 0,
+ 7, 0, 5, 0, 7, 0, 6, 0,104, 1, 2, 0, 0, 0,171, 0, 0, 0,247, 8,105, 1, 1, 0, 0, 0, 20, 0,106, 1, 10, 0,
+ 0, 0,248, 8, 0, 0,249, 8, 0, 0,173, 5, 0, 0,250, 8, 2, 0,220, 8, 2, 0,251, 8, 7, 0,252, 8, 7, 0,253, 8,
+ 7, 0,254, 8, 7, 0,161, 8,107, 1, 2, 0, 9, 0,255, 8, 9, 0, 0, 9,108, 1, 11, 0, 0, 0,120, 4, 0, 0, 17, 0,
+ 0, 0,231, 8, 0, 0,113, 0, 0, 0, 1, 9, 0, 0,110, 0, 0, 0,184, 0, 7, 0, 2, 9, 7, 0, 3, 9, 7, 0, 4, 9,
+ 7, 0, 5, 9,109, 1, 8, 0, 7, 0,176, 7, 7, 0,130, 0, 7, 0,232, 4, 7, 0, 82, 2, 7, 0, 6, 9, 7, 0,209, 0,
+ 7, 0, 7, 9, 4, 0, 17, 0,110, 1, 4, 0, 2, 0, 8, 9, 2, 0, 9, 9, 2, 0, 10, 9, 2, 0, 37, 0,111, 1, 1, 0,
+ 0, 0, 20, 0,112, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 11, 9,113, 1, 10, 0, 2, 0,122, 3,
+ 2, 0, 19, 0, 7, 0, 5, 4, 7, 0, 12, 9, 7, 0, 13, 9, 7, 0, 14, 9, 7, 0, 15, 9,112, 1, 16, 9,112, 1, 17, 9,
+112, 1, 18, 9, 62, 0, 9, 0, 4, 0, 19, 0, 4, 0, 64, 0, 24, 0, 19, 9, 24, 0, 20, 9,113, 1, 21, 9, 7, 0, 22, 9,
+ 7, 0, 23, 9, 7, 0, 24, 9, 7, 0, 25, 9,114, 1, 4, 0, 48, 0,150, 2, 7, 0, 26, 9, 7, 0, 94, 1, 7, 0, 37, 0,
+176, 0, 17, 0, 27, 0, 31, 0,114, 1, 27, 9, 62, 0, 16, 9, 52, 0, 78, 1, 2, 0, 19, 0, 2, 0, 77, 5, 4, 0,110, 0,
+ 7, 0, 28, 9, 7, 0, 7, 2, 7, 0, 29, 9, 7, 0, 30, 9, 7, 0, 94, 1, 7, 0, 31, 9, 2, 0, 48, 1, 0, 0, 32, 9,
+ 0, 0,115, 3, 0, 0, 96, 0,115, 1, 10, 0, 4, 0, 17, 0, 4, 0,130, 0, 4, 0, 19, 0, 4, 0, 88, 3, 4, 0, 33, 9,
+ 4, 0, 34, 9, 4, 0, 35, 9, 0, 0, 96, 0, 0, 0, 20, 0, 9, 0, 2, 0, 89, 0, 6, 0,115, 1, 36, 9, 4, 0, 37, 9,
+ 4, 0, 38, 9, 4, 0, 39, 9, 4, 0, 37, 0, 9, 0, 40, 9,116, 1, 5, 0, 7, 0, 77, 2, 7, 0,190, 2, 7, 0,220, 1,
+ 2, 0, 41, 9, 2, 0, 37, 0,117, 1, 5, 0, 7, 0, 77, 2, 7, 0, 42, 9, 7, 0, 43, 9, 7, 0, 44, 9, 7, 0,190, 2,
+118, 1, 7, 0, 4, 0, 45, 9, 4, 0, 46, 9, 4, 0, 47, 9, 7, 0, 48, 9, 7, 0, 49, 9, 7, 0, 50, 9, 7, 0, 51, 9,
+119, 1, 8, 0,119, 1, 0, 0,119, 1, 1, 0, 32, 0, 45, 0, 4, 0,213, 2, 2, 0, 19, 0, 2, 0, 57, 0, 7, 0,190, 2,
+ 7, 0,184, 7,120, 1, 26, 0, 32, 0, 52, 9,117, 1, 84, 3,117, 1, 53, 9,116, 1, 54, 9,117, 1,165, 7, 7, 0, 55, 9,
+ 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 49, 9, 7, 0, 50, 9, 7, 0,190, 2, 7, 0,167, 2, 7, 0, 59, 9,
+ 7, 0, 60, 9, 7, 0,110, 0, 7, 0, 61, 9, 4, 0, 45, 9, 4, 0, 62, 9, 4, 0, 37, 0, 4, 0, 82, 0, 4, 0, 63, 9,
+ 2, 0, 19, 0, 2, 0, 64, 9, 2, 0, 65, 9, 2, 0,118, 3,121, 1,117, 0, 27, 0, 31, 0, 39, 0, 75, 0, 4, 0, 19, 0,
+ 2, 0, 17, 0, 2, 0,142, 8, 2, 0, 66, 9, 2, 0, 67, 9, 2, 0, 73, 8, 2, 0, 68, 9, 2, 0, 69, 9, 2, 0, 70, 9,
+ 2, 0, 71, 9, 2, 0, 72, 9, 2, 0, 73, 9, 2, 0, 74, 9, 2, 0, 75, 9, 2, 0, 76, 9, 2, 0, 77, 9, 2, 0, 78, 9,
+ 2, 0, 79, 9, 2, 0, 80, 9, 2, 0, 81, 9, 2, 0,211, 1, 2, 0,158, 7, 2, 0,134, 7, 2, 0, 82, 9, 2, 0, 83, 9,
+ 2, 0,116, 3, 2, 0,117, 3, 2, 0, 84, 9, 2, 0, 85, 9, 2, 0, 86, 9, 2, 0, 87, 9, 2, 0, 88, 9, 2, 0, 89, 9,
+ 7, 0, 90, 9, 7, 0, 91, 9, 7, 0, 92, 9, 2, 0, 93, 9, 2, 0, 94, 9, 7, 0, 95, 9, 7, 0, 96, 9, 7, 0, 97, 9,
+ 7, 0,140, 7, 7, 0, 93, 0, 7, 0,167, 2, 7, 0,146, 7, 7, 0, 98, 9, 7, 0, 99, 9, 7, 0,100, 9, 4, 0,141, 7,
+ 4, 0,139, 7, 4, 0,101, 9, 7, 0,142, 7, 7, 0,143, 7, 7, 0,144, 7, 7, 0,102, 9, 7, 0,103, 9, 7, 0,104, 9,
+ 7, 0,105, 9, 7, 0,106, 9, 7, 0,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0, 40, 3, 7, 0,110, 0, 7, 0,110, 9,
+ 7, 0,111, 9, 7, 0,112, 9, 7, 0,113, 9, 7, 0,114, 9, 7, 0,115, 9, 7, 0,116, 9, 4, 0,117, 9, 4, 0,118, 9,
+ 7, 0,119, 9, 7, 0,120, 9, 7, 0,121, 9, 7, 0,122, 9, 7, 0,123, 9, 7, 0, 57, 0, 7, 0,124, 9, 7, 0,125, 9,
+ 7, 0,112, 3, 7, 0,110, 3, 7, 0,111, 3, 7, 0,126, 9, 7, 0,127, 9, 7, 0,128, 9, 7, 0,129, 9, 7, 0,130, 9,
+ 7, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9, 7, 0,138, 9,
+ 4, 0,139, 9, 4, 0,140, 9, 7, 0, 47, 3, 7, 0,141, 9, 7, 0,142, 9, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9,
+ 7, 0,146, 9, 7, 0,147, 9, 0, 0,148, 9, 65, 0, 73, 3, 65, 0,149, 9, 32, 0,150, 9, 32, 0,151, 9, 36, 0, 80, 0,
+155, 0, 71, 3,155, 0,152, 9,142, 0, 39, 0,142, 0, 0, 0,142, 0, 1, 0,121, 1,153, 9,120, 1,163, 3,118, 1, 67, 8,
+122, 1,154, 9, 9, 0,155, 9,123, 1,156, 9,123, 1,157, 9, 12, 0,158, 9, 12, 0,159, 9,156, 0, 72, 3, 32, 0,160, 9,
+ 32, 0,161, 9, 32, 0, 38, 0, 12, 0,162, 9, 12, 0,163, 9, 12, 0,164, 9, 7, 0,213, 0, 7, 0, 92, 4, 4, 0,118, 2,
+ 4, 0, 19, 0, 4, 0,141, 7, 4, 0,165, 9, 4, 0,166, 9, 4, 0,167, 9, 4, 0, 57, 0, 2, 0,220, 0, 2, 0,168, 9,
+ 2, 0,169, 9, 2, 0, 65, 3, 2, 0,170, 9, 2, 0,118, 3, 0, 0,171, 9, 2, 0,172, 9, 2, 0,173, 9, 2, 0,174, 9,
+ 9, 0,175, 9,131, 0,202, 3,129, 0, 34, 0,124, 1,176, 9, 7, 0,174, 3, 7, 0,177, 9, 7, 0,178, 9, 7, 0, 8, 4,
+ 7, 0,179, 9, 7, 0, 50, 3, 7, 0, 40, 3, 7, 0,180, 9, 7, 0, 9, 2, 7, 0,181, 9, 7, 0,182, 9, 7, 0,183, 9,
+ 7, 0,184, 9, 7, 0,185, 9, 7, 0,186, 9, 7, 0,175, 3, 7, 0,187, 9, 7, 0,188, 9, 7, 0,189, 9, 7, 0,176, 3,
+ 7, 0,172, 3, 7, 0,173, 3, 4, 0,190, 9, 4, 0, 94, 0, 4, 0,191, 9, 4, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9,
+ 2, 0,195, 9, 2, 0,196, 9, 2, 0,197, 9, 2, 0, 37, 0, 4, 0, 70, 0,130, 0, 8, 0,124, 1,198, 9, 7, 0,199, 9,
+ 7, 0,200, 9, 7, 0,165, 1, 7, 0,201, 9, 4, 0, 94, 0, 2, 0,202, 9, 2, 0,203, 9,125, 1, 4, 0, 7, 0, 5, 0,
+ 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,204, 9,126, 1, 6, 0,126, 1, 0, 0,126, 1, 1, 0,125, 1,205, 9, 4, 0,206, 9,
+ 2, 0,207, 9, 2, 0, 19, 0,127, 1, 5, 0,127, 1, 0, 0,127, 1, 1, 0, 12, 0,208, 9, 4, 0,209, 9, 4, 0, 19, 0,
+128, 1, 9, 0,128, 1, 0, 0,128, 1, 1, 0, 12, 0,129, 0,127, 1,210, 9, 4, 0, 19, 0, 2, 0,207, 9, 2, 0,211, 9,
+ 7, 0, 95, 0, 0, 0,212, 9,190, 0, 6, 0, 27, 0, 31, 0, 12, 0,134, 4, 4, 0, 19, 0, 2, 0,213, 9, 2, 0,214, 9,
+ 9, 0,215, 9,129, 1, 6, 0,129, 1, 0, 0,129, 1, 1, 0, 4, 0, 17, 0, 4, 0, 23, 0, 0, 0,216, 9, 0, 0,217, 9,
+130, 1, 5, 0, 12, 0,218, 9, 4, 0,219, 9, 4, 0,220, 9, 4, 0, 19, 0, 4, 0, 37, 0,131, 1, 13, 0, 27, 0, 31, 0,
+132, 1,221, 9,132, 1,222, 9, 12, 0,223, 9, 4, 0,224, 9, 2, 0,225, 9, 2, 0, 37, 0, 12, 0,226, 9, 12, 0,227, 9,
+130, 1,228, 9, 12, 0,229, 9, 12, 0,230, 9, 12, 0,231, 9,132, 1, 30, 0,132, 1, 0, 0,132, 1, 1, 0, 9, 0,232, 9,
+ 4, 0,247, 6, 4, 0, 37, 0,200, 0,164, 5,200, 0,233, 9, 0, 0,234, 9, 2, 0,235, 9, 2, 0,236, 9, 2, 0, 12, 7,
+ 2, 0, 13, 7, 2, 0,237, 9, 2, 0,238, 9, 2, 0, 88, 3, 2, 0, 26, 6, 2, 0,239, 9, 2, 0,240, 9, 4, 0,161, 1,
+133, 1,241, 9,134, 1,242, 9,135, 1,243, 9, 4, 0,244, 9, 4, 0,245, 9, 9, 0,246, 9, 12, 0,247, 9, 12, 0,227, 9,
+ 12, 0, 30, 7, 12, 0,248, 9, 12, 0,249, 9,136, 1, 12, 0,136, 1, 0, 0,136, 1, 1, 0, 0, 0,250, 9,137, 1,251, 9,
+ 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,252, 9, 2, 0,253, 9, 2, 0,254, 9, 2, 0,255, 9, 2, 0, 0, 10, 2, 0, 37, 0,
+138, 1, 6, 0,138, 1, 0, 0,138, 1, 1, 0, 12, 0, 1, 10, 0, 0, 2, 10, 4, 0, 3, 10, 4, 0, 4, 10,208, 0, 8, 0,
+208, 0, 0, 0,208, 0, 1, 0, 0, 0,250, 9, 26, 0, 30, 0,139, 1, 6, 7, 9, 0, 5, 10,137, 1,251, 9,130, 1, 6, 10,
+133, 1, 23, 0,133, 1, 0, 0,133, 1, 1, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 5, 0, 2, 0, 6, 0, 2, 0, 7, 10,
+ 2, 0, 8, 10, 2, 0, 9, 10, 2, 0, 10, 10, 0, 0, 11, 10, 0, 0, 37, 0, 2, 0,252, 9, 2, 0,253, 9, 2, 0,254, 9,
+ 2, 0,255, 9, 2, 0, 0, 10, 2, 0, 43, 0, 0, 0, 12, 10, 2, 0, 13, 10, 2, 0, 14, 10, 4, 0, 70, 0, 9, 0, 5, 10,
+140, 1, 8, 0,140, 1, 0, 0,140, 1, 1, 0, 9, 0, 2, 0, 9, 0, 15, 10, 0, 0,131, 3, 2, 0, 17, 0, 2, 0, 19, 0,
+ 7, 0, 16, 10,141, 1, 5, 0, 7, 0, 17, 10, 4, 0, 18, 10, 4, 0, 19, 10, 4, 0, 14, 1, 4, 0, 19, 0,142, 1, 6, 0,
+ 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 4, 0, 17, 0, 4, 0, 19, 0,143, 1, 5, 0, 7, 0,238, 7,
+ 7, 0,239, 7, 7, 0,190, 2, 2, 0,224, 1, 2, 0,225, 1,144, 1, 5, 0,143, 1, 2, 0, 4, 0, 54, 0, 7, 0, 24, 10,
+ 7, 0,238, 7, 7, 0,239, 7,145, 1, 4, 0, 2, 0, 25, 10, 2, 0, 26, 10, 2, 0, 27, 10, 2, 0, 28, 10,146, 1, 2, 0,
+ 43, 0,254, 5, 26, 0, 61, 8,147, 1, 3, 0, 24, 0, 29, 10, 4, 0, 19, 0, 4, 0, 37, 0,148, 1, 6, 0, 7, 0,110, 0,
+ 7, 0,142, 2, 7, 0, 30, 10, 7, 0, 37, 0, 2, 0,219, 0, 2, 0, 31, 10,149, 1, 7, 0,149, 1, 0, 0,149, 1, 1, 0,
+ 27, 0, 1, 6, 0, 0, 32, 10, 4, 0, 33, 10, 4, 0, 94, 0, 0, 0,131, 3,150, 1, 6, 0, 12, 0,112, 8, 0, 0, 34, 10,
+ 7, 0, 61, 0, 7, 0, 16, 10, 4, 0, 17, 0, 4, 0, 19, 0,151, 1, 3, 0, 7, 0, 35, 10, 4, 0, 19, 0, 4, 0, 37, 0,
+152, 1, 15, 0,152, 1, 0, 0,152, 1, 1, 0, 61, 1,100, 8,150, 1, 62, 0, 12, 0, 14, 3, 35, 0, 50, 0,151, 1, 36, 10,
+ 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0,255, 0, 4, 0, 33, 10, 0, 0, 32, 10, 4, 0, 37, 10, 7, 0, 38, 10,
+153, 1, 2, 0, 0, 0, 39, 10, 0, 0, 40, 10,154, 1, 4, 0,154, 1, 0, 0,154, 1, 1, 0,152, 0,226, 2, 12, 0, 41, 10,
+155, 1, 22, 0,155, 1, 0, 0,155, 1, 1, 0, 12, 0, 42, 10,152, 0,213, 7,154, 1, 43, 10, 12, 0, 44, 10, 12, 0, 14, 3,
+ 0, 0,131, 3, 7, 0, 16, 10, 7, 0, 45, 10, 7, 0, 92, 0, 7, 0, 93, 0, 7, 0,157, 8, 7, 0,158, 8, 7, 0,157, 2,
+ 7, 0,161, 8, 7, 0,215, 7, 7, 0,162, 8, 2, 0, 46, 10, 2, 0, 47, 10, 2, 0, 19, 0, 2, 0, 17, 0,156, 1, 6, 0,
+156, 1, 0, 0,156, 1, 1, 0, 12, 0, 42, 10, 4, 0, 19, 0, 4, 0, 81, 2, 0, 0,131, 3,157, 1, 10, 0,157, 1, 0, 0,
+157, 1, 1, 0, 27, 0, 1, 6, 0, 0, 48, 10, 4, 0, 49, 10, 4, 0, 50, 10, 0, 0, 32, 10, 4, 0, 33, 10, 2, 0, 19, 0,
+ 2, 0, 51, 10,158, 1, 6, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 52, 10, 0, 0,131, 3, 4, 0, 19, 0, 4, 0, 53, 10,
+159, 1, 5, 0,159, 1, 0, 0,159, 1, 1, 0, 0, 0, 32, 10, 4, 0, 33, 10, 7, 0,134, 2, 39, 0, 9, 0,152, 0, 9, 3,
+152, 0, 54, 10,154, 1, 43, 10, 12, 0, 55, 10,155, 1, 56, 10, 12, 0, 57, 10, 12, 0, 58, 10, 4, 0, 19, 0, 4, 0,220, 0,
+160, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0};
+
diff --git a/source/blender/editors/datafiles/splash.jpg.c b/source/blender/editors/datafiles/splash.png.c
index c1ca8b575e6..bbce480ecba 100644
--- a/source/blender/editors/datafiles/splash.jpg.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,7 +1,7 @@
-/* DataToC output of file <splash_jpg> */
+/* DataToC output of file <splash_png> */
-int datatoc_splash_jpg_size= 79258;
-char datatoc_splash_jpg[]= {
+int datatoc_splash_png_size= 79258;
+char datatoc_splash_png[]= {
255,216,255,224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 1, 0, 72, 0, 72, 0, 0,255,225, 0, 22, 69,120,
105,102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,255,219, 0, 67, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2,
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 735f1ffddb9..81ee2378717 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -67,279 +67,12 @@
#include "ED_sequencer.h"
#include "ED_util.h"
-#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
#include "gpencil_intern.h"
/* ************************************************** */
-/* GREASE PENCIL PANEL-UI DRAWING */
-
-/* Every space which implements Grease-Pencil functionality should have a panel
- * for the settings. All of the space-dependent parts should be coded in the panel
- * code for that space, but the rest is all handled by generic panel here.
- */
-
-/* ------- Callbacks ----------- */
-/* These are just 'dummy wrappers' around gpencil api calls */
-
-#if 0
-// XXX
-/* make layer active one after being clicked on */
-void gp_ui_activelayer_cb (void *gpd, void *gpl)
-{
- gpencil_layer_setactive(gpd, gpl);
-
- scrarea_queue_winredraw(curarea);
- allqueue(REDRAWACTION, 0);
-}
-
-/* rename layer and set active */
-void gp_ui_renamelayer_cb (void *gpd_arg, void *gpl_arg)
-{
- bGPdata *gpd= (bGPdata *)gpd_arg;
- bGPDlayer *gpl= (bGPDlayer *)gpl_arg;
-
- BLI_uniquename(&gpd->layers, gpl, "GP_Layer", '.', offsetof(bGPDlayer, info[0]), 128);
- gpencil_layer_setactive(gpd, gpl);
-
- scrarea_queue_winredraw(curarea);
- allqueue(REDRAWACTION, 0);
-}
-
-/* add a new layer */
-void gp_ui_addlayer_cb (void *gpd, void *dummy)
-{
- gpencil_layer_addnew(gpd);
-
- scrarea_queue_winredraw(curarea);
- allqueue(REDRAWACTION, 0);
-}
-
-/* delete active layer */
-void gp_ui_dellayer_cb (void *gpd, void *dummy)
-{
- gpencil_layer_delactive(gpd);
-
- scrarea_queue_winredraw(curarea);
- allqueue(REDRAWACTION, 0);
-}
-
-/* delete last stroke of active layer */
-void gp_ui_delstroke_cb (void *gpd, void *gpl)
-{
- bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
-
- if (gpf) {
- if (gpf->framenum != CFRA) return;
-
- gpencil_layer_setactive(gpd, gpl);
- gpencil_frame_delete_laststroke(gpl, gpf);
-
- scrarea_queue_winredraw(curarea);
- }
-}
-
-/* delete active frame of active layer */
-void gp_ui_delframe_cb (void *gpd, void *gpl)
-{
- bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
-
- gpencil_layer_setactive(gpd, gpl);
- gpencil_layer_delframe(gpl, gpf);
-
- scrarea_queue_winredraw(curarea);
- allqueue(REDRAWACTION, 0);
-}
-
-/* convert the active layer to geometry */
-void gp_ui_convertlayer_cb (void *gpd, void *gpl)
-{
- gpencil_layer_setactive(gpd, gpl);
- gpencil_convert_menu();
-
- scrarea_queue_winredraw(curarea);
-}
-#endif
-
-/* ------- Drawing Code ------- */
-
-#if 0
-/* XXX */
-/* draw the controls for a given layer */
-static void gp_drawui_layer (uiBlock *block, bGPdata *gpd, bGPDlayer *gpl, short *xco, short *yco)
-{
- uiBut *but;
- short active= (gpl->flag & GP_LAYER_ACTIVE);
- short width= 314;
- short height;
- int rb_col;
-
- /* unless button has own callback, it adds this callback to button */
- uiBlockSetFunc(block, gp_ui_activelayer_cb, gpd, gpl);
-
- /* draw header */
- {
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- /* rounded header */
- if (active) uiBlockSetCol(block, TH_BUT_ACTION);
- rb_col= (active)?-20:20;
- uiDefBut(block, ROUNDBOX, B_REDR, "", *xco-8, *yco-2, width, 24, NULL, 5.0, 0.0, 15.0, (float)(rb_col-20), "");
- if (active) uiBlockSetCol(block, TH_AUTO);
-
- /* lock toggle */
- uiDefIconButBitI(block, ICONTOG, GP_LAYER_LOCKED, B_REDR, ICON_UNLOCKED, *xco-7, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Layer cannot be modified");
- }
-
- /* when layer is locked or hidden, only draw header */
- if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) {
- char name[256]; /* gpl->info is 128, but we need space for 'locked/hidden' as well */
-
- height= 0;
-
- /* visibility button (only if hidden but not locked!) */
- if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED))
- uiDefIconButBitI(block, ICONTOG, GP_LAYER_HIDE, B_REDR, ICON_RESTRICT_VIEW_OFF, *xco+12, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Visibility of layer");
-
- /* name */
- if (gpl->flag & GP_LAYER_HIDE)
- sprintf(name, "%s (Hidden)", gpl->info);
- else
- sprintf(name, "%s (Locked)", gpl->info);
- uiDefBut(block, LABEL, 1, name, *xco+35, *yco, 240, 20, NULL, 0.0, 0.0, 0, 0, "Short description of what this layer is for (optional)");
-
- /* delete button (only if hidden but not locked!) */
- if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
- but= uiDefIconBut(block, BUT, B_REDR, ICON_X, *xco+(width-30), *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
- uiButSetFunc(but, gp_ui_dellayer_cb, gpd, NULL);
- }
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
- else {
- height= 97;
-
- /* draw rest of header */
- {
- /* visibility button */
- uiDefIconButBitI(block, ICONTOG, GP_LAYER_HIDE, B_REDR, ICON_RESTRICT_VIEW_OFF, *xco+12, *yco-1, 20, 20, &gpl->flag, 0.0, 0.0, 0, 0, "Visibility of layer");
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* name */
- but= uiDefButC(block, TEX, B_REDR, "Info:", *xco+36, *yco, 240, 19, gpl->info, 0, 127, 0, 0, "Short description of what this layer is for (optional)");
- uiButSetFunc(but, gp_ui_renamelayer_cb, gpd, gpl);
-
- /* delete 'button' */
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- but= uiDefIconBut(block, BUT, B_REDR, ICON_X, *xco+(width-30), *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
- uiButSetFunc(but, gp_ui_dellayer_cb, gpd, NULL);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
-
- /* draw backdrop */
- if (active) uiBlockSetCol(block, TH_BUT_ACTION);
- uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-8, *yco-height, width, height-1, NULL, 5.0, 0.0, 12.0, (float)rb_col, "");
- if (active) uiBlockSetCol(block, TH_AUTO);
-
- /* draw settings */
- {
- /* color */
- uiBlockBeginAlign(block);
- uiDefButF(block, COL, B_REDR, "", *xco, *yco-26, 150, 19, gpl->color, 0, 0, 0, 0, "Color to use for all strokes on this Grease Pencil Layer");
- uiDefButF(block, NUMSLI, B_REDR, "Opacity: ", *xco,*yco-45,150,19, &gpl->color[3], 0.3f, 1.0f, 0, 0, "Visibility of stroke (0.3 to 1.0)");
- uiBlockEndAlign(block);
-
- /* stroke thickness */
- uiDefButS(block, NUMSLI, B_REDR, "Thickness:", *xco, *yco-75, 150, 20, &gpl->thickness, 1, 10, 0, 0, "Thickness of strokes (in pixels)");
-
- /* debugging options */
- if (G.f & G_DEBUG) {
- uiDefButBitI(block, TOG, GP_LAYER_DRAWDEBUG, B_REDR, "Show Points", *xco, *yco-95, 150, 20, &gpl->flag, 0, 0, 0, 0, "Show points which form the strokes");
- }
-
- /* onion-skinning */
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, GP_LAYER_ONIONSKIN, B_REDR, "Onion-Skin", *xco+160, *yco-26, 140, 20, &gpl->flag, 0, 0, 0, 0, "Ghost frames on either side of frame");
- uiDefButS(block, NUMSLI, B_REDR, "GStep:", *xco+160, *yco-46, 140, 20, &gpl->gstep, 0, 120, 0, 0, "Max number of frames on either side of active frame to show (0 = just 'first' available sketch on either side)");
- uiBlockEndAlign(block);
-
- /* options */
- uiBlockBeginAlign(block);
- if (curarea->spacetype == SPACE_VIEW3D) {
- but= uiDefBut(block, BUT, B_REDR, "Convert to...", *xco+160, *yco-75, 140, 20, NULL, 0, 0, 0, 0, "Converts this layer's strokes to geometry (Hotkey = Alt-Shift-C)");
- uiButSetFunc(but, gp_ui_convertlayer_cb, gpd, gpl);
- }
- else {
- but= uiDefBut(block, BUT, B_REDR, "Del Active Frame", *xco+160, *yco-75, 140, 20, NULL, 0, 0, 0, 0, "Erases the the active frame for this layer (Hotkey = Alt-XKEY/DEL)");
- uiButSetFunc(but, gp_ui_delframe_cb, gpd, gpl);
- }
-
- but= uiDefBut(block, BUT, B_REDR, "Del Last Stroke", *xco+160, *yco-95, 140, 20, NULL, 0, 0, 0, 0, "Erases the last stroke from the active frame (Hotkey = Alt-XKEY/DEL)");
- uiButSetFunc(but, gp_ui_delstroke_cb, gpd, gpl);
- uiBlockEndAlign(block);
- }
- }
-
- /* adjust height for new to start */
- (*yco) -= (height + 27);
-}
-#endif
-/* Draw the contents for a grease-pencil panel. This assumes several things:
- * - that panel has been created, is 318 x 204. max yco is 225
- * - that a toggle for turning on/off gpencil drawing is 150 x 20, starting from (10,225)
- * which is basically the top left-hand corner
- * It will return the amount of extra space to extend the panel by
- */
-short draw_gpencil_panel (uiBlock *block, bGPdata *gpd, ScrArea *sa)
-{
-#if 0
- uiBut *but;
- bGPDlayer *gpl;
- short xco= 10, yco= 170;
-
- /* draw gpd settings first */
- {
- /* add new layer buttons */
- but= uiDefBut(block, BUT, B_REDR, "Add New Layer", 10,205,150,20, 0, 0, 0, 0, 0, "Adds a new Grease Pencil Layer");
- uiButSetFunc(but, gp_ui_addlayer_cb, gpd, NULL);
-
-
- /* show override lmb-clicks button + painting lock */
- uiBlockBeginAlign(block);
- if ((gpd->flag & GP_DATA_EDITPAINT)==0) {
- uiDefButBitI(block, TOG, GP_DATA_EDITPAINT, B_REDR, "Draw Mode", 170, 225, 130, 20, &gpd->flag, 0, 0, 0, 0, "Interpret click-drag as new strokes");
-
- uiBlockSetCol(block, TH_BUT_SETTING);
- uiDefIconButBitI(block, ICONTOG, GP_DATA_LMBPLOCK, B_REDR, ICON_UNLOCKED, 300, 225, 20, 20, &gpd->flag, 0.0, 0.0, 0, 0, "Painting cannot occur with Shift-LMB (when making selections)");
- uiBlockSetCol(block, TH_AUTO);
- }
- else
- uiDefButBitI(block, TOG, GP_DATA_EDITPAINT, B_REDR, "Draw Mode", 170, 225, 150, 20, &gpd->flag, 0, 0, 0, 0, "Interpret click-drag as new strokes");
- uiBlockEndAlign(block);
-
- /* 'view align' button (naming depends on context) */
- if (sa->spacetype == SPACE_VIEW3D)
- uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Sketch in 3D", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added in 3D-space");
- else
- uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Stick to View", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added on 2d-canvas");
- }
-
- /* draw for each layer */
- for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
- gp_drawui_layer(block, gpd, gpl, &xco, &yco);
- }
-
- /* return new height if necessary */
- return (yco < 0) ? (204 - yco) : 204;
-#endif
- return 0;
-}
-
-/* ************************************************** */
/* GREASE PENCIL DRAWING */
/* ----- General Defines ------ */
@@ -350,6 +83,7 @@ enum {
GP_DRAWDATA_ONLY3D = (1<<1), /* only draw 3d-strokes */
GP_DRAWDATA_ONLYV2D = (1<<2), /* only draw 'canvas' strokes */
GP_DRAWDATA_ONLYI2D = (1<<3), /* only draw 'image' strokes */
+ GP_DRAWDATA_IEDITHACK = (1<<4), /* special hack for drawing strokes in Image Editor (weird coordinates) */
};
/* thickness above which we should use special drawing */
@@ -389,11 +123,21 @@ static void gp_draw_stroke_buffer (tGPspoint *points, int totpoints, short thick
glBegin(GL_LINE_STRIP);
for (i=0, pt=points; i < totpoints && pt; i++, pt++) {
+ /* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
+ * and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
+ */
if (fabs(pt->pressure - oldpressure) > 0.2f) {
glEnd();
glLineWidth(pt->pressure * thickness);
glBegin(GL_LINE_STRIP);
+ /* need to roll-back one point to ensure that there are no gaps in the stroke */
+ if (i != 0) {
+ pt--;
+ glVertex2f(pt->x, pt->y);
+ pt++;
+ }
+ /* now the point we want... */
glVertex2f(pt->x, pt->y);
oldpressure = pt->pressure;
@@ -432,8 +176,8 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
co[1]= (points->y * winy) + offsy;
}
else {
- co[0]= (points->x / 1000 * winx);
- co[1]= (points->y / 1000 * winy);
+ co[0]= (points->x / 100 * winx);
+ co[1]= (points->y / 100 * winy);
}
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, simple dot looks ok
@@ -473,11 +217,21 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
/* draw stroke curve */
glBegin(GL_LINE_STRIP);
for (i=0, pt=points; i < totpoints && pt; i++, pt++) {
+ /* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
+ * and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
+ */
if (fabs(pt->pressure - oldpressure) > 0.2f) {
glEnd();
glLineWidth(pt->pressure * thickness);
glBegin(GL_LINE_STRIP);
+ /* need to roll-back one point to ensure that there are no gaps in the stroke */
+ if (i != 0) {
+ pt--;
+ glVertex3f(pt->x, pt->y, pt->z);
+ pt++;
+ }
+ /* now the point we want... */
glVertex3f(pt->x, pt->y, pt->z);
oldpressure = pt->pressure;
@@ -501,14 +255,12 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
/* draw a given stroke in 2d */
static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag,
short debug, int offsx, int offsy, int winx, int winy)
-{
- int spacetype= 0; // XXX make local gpencil state var?
-
+{
/* 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
*/
if ( (thickness < GP_DRAWTHICKNESS_SPECIAL) ||
- ((spacetype==SPACE_IMAGE) && (dflag & GP_DRAWDATA_ONLYV2D)) )
+ ((dflag & GP_DRAWDATA_IEDITHACK) && (dflag & GP_DRAWDATA_ONLYV2D)) )
{
bGPDspoint *pt;
int i;
@@ -525,8 +277,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(x, y);
}
else {
- const float x= (pt->x / 1000 * winx);
- const float y= (pt->y / 1000 * winy);
+ const float x= (pt->x / 100 * winx);
+ const float y= (pt->y / 100 * winy);
glVertex2f(x, y);
}
@@ -565,10 +317,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
s1[1]= (pt2->y * winy) + offsy;
}
else {
- s0[0]= (pt1->x / 1000 * winx);
- s0[1]= (pt1->y / 1000 * winy);
- s1[0]= (pt2->x / 1000 * winx);
- s1[1]= (pt2->y / 1000 * winy);
+ s0[0]= (pt1->x / 100 * winx);
+ s0[1]= (pt1->y / 100 * winy);
+ s1[0]= (pt2->x / 100 * winx);
+ s1[1]= (pt2->y / 100 * winy);
}
/* calculate gradient and normal - 'angle'=(ny/nx) */
@@ -713,8 +465,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(x, y);
}
else {
- const float x= (float)(pt->x / 1000 * winx);
- const float y= (float)(pt->y / 1000 * winy);
+ const float x= (float)(pt->x / 100 * winx);
+ const float y= (float)(pt->y / 100 * winy);
glVertex2f(x, y);
}
@@ -766,6 +518,9 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
{
bGPDlayer *gpl, *actlay=NULL;
+ /* reset line drawing style (in case previous user didn't reset) */
+ setlinestyle(0);
+
/* turn on smooth lines (i.e. anti-aliasing) */
glEnable(GL_LINE_SMOOTH);
@@ -872,47 +627,7 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* turn off alpha blending, then smooth lines */
glDisable(GL_BLEND); // alpha blending
glDisable(GL_LINE_SMOOTH); // smooth lines
-
- /* show info for debugging the status of gpencil */
-#if 0
- if ( ((dflag & GP_DRAWDATA_NOSTATUS)==0) && (gpd->flag & GP_DATA_DISPINFO) ) {
- char printable[256];
- short xmax;
-
- /* get text to display */
- if (actlay) {
- if (gpd->flag & GP_DATA_EDITPAINT)
- UI_ThemeColor(TH_BONE_POSE); // should be blue-ish
- else if (actlay->actframe == NULL)
- UI_ThemeColor(TH_REDALERT);
- else if (actlay->actframe->framenum == cfra)
- UI_ThemeColor(TH_VERTEX_SELECT); // should be yellow
- else
- UI_ThemeColor(TH_TEXT_HI);
-
- if (actlay->actframe) {
- sprintf(printable, "GPencil: Layer ('%s'), Frame (%d)%s",
- actlay->info, actlay->actframe->framenum,
- ((gpd->flag & GP_DATA_EDITPAINT)?" , Draw Mode On":"") );
- }
- else {
- sprintf(printable, "GPencil: Layer ('%s'), Frame <None>%s",
- actlay->info, ((gpd->flag & GP_DATA_EDITPAINT)?" , Draw Mode On":"") );
- }
- }
- else {
- UI_ThemeColor(TH_REDALERT);
- sprintf(printable, "GPencil: Layer <None>");
- }
- xmax= GetButStringLength(printable);
- /* only draw it if view is wide enough (assume padding of 20 is enough for now) */
- if (winx > (xmax + 20)) {
- BLF_draw_default(winx-xmax, winy-20, 0.0f, printable);
- }
- }
-#endif
-
/* restore initial gl conditions */
glLineWidth(1.0);
glPointSize(1.0);
@@ -921,6 +636,12 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* ----- Grease Pencil Sketches Drawing API ------ */
+// ............................
+// XXX
+// We need to review the calls below, since they may be/are not that suitable for
+// the new ways that we intend to be drawing data...
+// ............................
+
/* draw grease-pencil sketches to specified 2d-view that uses ibuf corrections */
void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf)
{
@@ -933,7 +654,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf)
/* check that we have grease-pencil stuff to draw */
if (ELEM(NULL, sa, ibuf)) return;
- gpd= gpencil_data_getactive(sa);
+ gpd= gpencil_data_get_active(C); // XXX
if (gpd == NULL) return;
/* calculate rect */
@@ -950,7 +671,7 @@ void draw_gpencil_2dimage (bContext *C, ImBuf *ibuf)
wmOrtho2(ar->v2d.cur.xmin, ar->v2d.cur.xmax, ar->v2d.cur.ymin, ar->v2d.cur.ymax);
- dflag |= GP_DRAWDATA_ONLYV2D;
+ dflag |= GP_DRAWDATA_ONLYV2D|GP_DRAWDATA_IEDITHACK;
}
break;
@@ -1007,9 +728,14 @@ void draw_gpencil_2dview (bContext *C, short onlyv2d)
/* check that we have grease-pencil stuff to draw */
if (sa == NULL) return;
- gpd= gpencil_data_getactive(sa);
+ gpd= gpencil_data_get_active(C); // XXX
if (gpd == NULL) return;
+ /* special hack for Image Editor */
+ // FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled
+ if (sa->spacetype == SPACE_IMAGE)
+ dflag |= GP_DRAWDATA_IEDITHACK;
+
/* draw it! */
if (onlyv2d) dflag |= (GP_DRAWDATA_ONLYV2D|GP_DRAWDATA_NOSTATUS);
gp_draw_data(gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag);
@@ -1020,14 +746,13 @@ void draw_gpencil_2dview (bContext *C, short onlyv2d)
*/
void draw_gpencil_3dview (bContext *C, short only3d)
{
- ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
Scene *scene= CTX_data_scene(C);
bGPdata *gpd;
int dflag = 0;
/* check that we have grease-pencil stuff to draw */
- gpd= gpencil_data_getactive(sa);
+ gpd= gpencil_data_get_active(C); // XXX
if (gpd == NULL) return;
/* draw it! */
@@ -1047,7 +772,7 @@ void draw_gpencil_oglrender (bContext *C)
/* assume gpencil data comes from v3d */
if (v3d == NULL) return;
- gpd= v3d->gpd;
+ gpd= gpencil_data_get_active(C);
if (gpd == NULL) return;
/* pass 1: draw 3d-strokes ------------ > */
@@ -1055,7 +780,7 @@ void draw_gpencil_oglrender (bContext *C)
/* pass 2: draw 2d-strokes ------------ > */
/* adjust view matrices */
- wmOrtho2(-0.375f, (float)(ar->winx)-0.375f, -0.375f, (float)(ar->winy)-0.375f);
+ wmOrtho2(-0.375f, (float)(ar->winx)-0.375f, -0.375f, (float)(ar->winy)-0.375f); // XXX may not be correct anymore
glLoadIdentity();
/* draw it! */
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
new file mode 100644
index 00000000000..b25de4d5f1d
--- /dev/null
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -0,0 +1,281 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008, Blender Foundation, Joshua Leung
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_listBase.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_gpencil.h"
+#include "BKE_utildefines.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_gpencil.h"
+#include "ED_sequencer.h"
+#include "ED_util.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "gpencil_intern.h"
+
+/* ************************************************** */
+/* GREASE PENCIL PANEL-UI DRAWING */
+
+/* Every space which implements Grease-Pencil functionality should have a panel
+ * for the settings. All of the space-dependent parts should be coded in the panel
+ * code for that space, but the rest is all handled by generic panel here.
+ */
+
+/* ------- Callbacks ----------- */
+/* These are just 'dummy wrappers' around gpencil api calls */
+
+/* make layer active one after being clicked on */
+void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
+{
+ gpencil_layer_setactive(gpd, gpl);
+
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
+}
+
+/* delete 'active' layer */
+void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl)
+{
+ /* make sure the layer we want to remove is the active one */
+ gpencil_layer_setactive(gpd, gpl);
+ gpencil_layer_delactive(gpd);
+
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
+}
+
+/* ------- Drawing Code ------- */
+
+/* draw the controls for a given layer */
+static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
+{
+ uiLayout *box=NULL, *split=NULL;
+ uiLayout *col=NULL, *subcol=NULL;
+ uiLayout *row=NULL, *subrow=NULL;
+ uiBlock *block;
+ uiBut *but;
+ PointerRNA ptr;
+ int icon;
+
+ /* make pointer to layer data */
+ RNA_pointer_create((ID *)gpd, &RNA_GPencilLayer, gpl, &ptr);
+
+ /* unless button has own callback, it adds this callback to button */
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetFunc(block, gp_ui_activelayer_cb, gpd, gpl);
+
+ /* draw header ---------------------------------- */
+ /* get layout-row + UI-block for header */
+ box= uiLayoutBox(layout);
+
+ row= uiLayoutRow(box, 0);
+ block= uiLayoutGetBlock(row); // err...
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ /* left-align ............................... */
+ subrow= uiLayoutRow(row, 1);
+ uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT);
+
+ /* active */
+ icon= (gpl->flag & GP_LAYER_ACTIVE) ? ICON_RADIOBUT_ON : ICON_RADIOBUT_OFF;
+ uiItemR(subrow, "", icon, &ptr, "active", 0);
+
+ /* locked */
+ icon= (gpl->flag & GP_LAYER_LOCKED) ? ICON_LOCKED : ICON_UNLOCKED;
+ uiItemR(subrow, "", icon, &ptr, "locked", 0);
+
+ /* when layer is locked or hidden, only draw header */
+ if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_HIDE)) {
+ char name[256]; /* gpl->info is 128, but we need space for 'locked/hidden' as well */
+
+ /* visibility button (only if hidden but not locked!) */
+ if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED))
+ uiItemR(subrow, "", ICON_RESTRICT_VIEW_ON, &ptr, "hide", 0);
+
+
+ /* name */
+ if (gpl->flag & GP_LAYER_HIDE)
+ sprintf(name, "%s (Hidden)", gpl->info);
+ else
+ sprintf(name, "%s (Locked)", gpl->info);
+ uiItemL(subrow, name, 0);
+
+ /* delete button (only if hidden but not locked!) */
+ if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
+ /* right-align ............................... */
+ subrow= uiLayoutRow(row, 1);
+ uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
+ block= uiLayoutGetBlock(subrow); // XXX... err...
+
+ but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
+ uiButSetFunc(but, gp_ui_dellayer_cb, gpd, gpl);
+ }
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ else {
+ /* draw rest of header -------------------------------- */
+ /* visibility button */
+ uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "hide", 0);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ /* name */
+ uiItemR(subrow, "", 0, &ptr, "info", 0);
+
+ /* delete 'button' */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ /* right-align ............................... */
+ subrow= uiLayoutRow(row, 1);
+ uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
+ block= uiLayoutGetBlock(subrow); // XXX... err...
+
+ but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Delete layer");
+ uiButSetFunc(but, gp_ui_dellayer_cb, gpd, gpl);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+
+ /* new backdrop ----------------------------------- */
+ box= uiLayoutBox(layout);
+ split= uiLayoutSplit(box, 0.5f);
+
+
+ /* draw settings ---------------------------------- */
+ /* left column ..................... */
+ col= uiLayoutColumn(split, 0);
+
+ /* color */
+ subcol= uiLayoutColumn(col, 1);
+ uiItemR(subcol, "", 0, &ptr, "color", 0);
+ uiItemR(subcol, NULL, 0, &ptr, "opacity", UI_ITEM_R_SLIDER);
+
+ /* stroke thickness */
+ subcol= uiLayoutColumn(col, 1);
+ uiItemR(subcol, NULL, 0, &ptr, "line_thickness", UI_ITEM_R_SLIDER);
+
+ /* debugging options */
+ if (G.f & G_DEBUG) {
+ subcol= uiLayoutColumn(col, 1);
+ uiItemR(subcol, NULL, 0, &ptr, "show_points", 0);
+ }
+
+ /* right column ................... */
+ col= uiLayoutColumn(split, 0);
+
+ /* onion-skinning */
+ subcol= uiLayoutColumn(col, 1);
+ uiItemR(subcol, "Onion Skinning", 0, &ptr, "use_onion_skinning", 0);
+ uiItemR(subcol, "Frames", 0, &ptr, "max_ghost_range", 0); // 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");
+ }
+}
+
+/* Draw the contents for a grease-pencil panel*/
+static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, PointerRNA *ctx_ptr)
+{
+ PointerRNA gpd_ptr;
+ bGPDlayer *gpl;
+ uiLayout *col;
+
+ /* make new PointerRNA for Grease Pencil block */
+ RNA_id_pointer_create((ID *)gpd, &gpd_ptr);
+
+ /* draw gpd settings first ------------------------------------- */
+ col= uiLayoutColumn(layout, 0);
+ /* current Grease Pencil block */
+ // TODO: show some info about who owns this?
+ 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");
+
+ /* sanity checks... */
+ if (gpd == NULL)
+ return;
+
+ /* draw each layer --------------------------------------------- */
+ for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
+ col= uiLayoutColumn(layout, 1);
+ gp_drawui_layer(col, gpd, gpl);
+ }
+
+ /* draw gpd drawing settings first ------------------------------------- */
+ col= uiLayoutColumn(layout, 0);
+ /* label */
+ uiItemL(col, "Drawing Settings:", 0);
+
+ /* 'stick to view' option */
+ uiItemR(col, NULL, 0, &gpd_ptr, "view_space_draw", 0);
+}
+
+
+/* Standard panel to be included whereever Grease Pencil is used... */
+void gpencil_panel_standard(const bContext *C, Panel *pa)
+{
+ bGPdata **gpd_ptr = NULL;
+ PointerRNA ptr;
+
+ //if (v3d->flag2 & V3D_DISPGP)... etc.
+
+ /* get pointer to Grease Pencil Data */
+ gpd_ptr= gpencil_data_get_pointers((bContext *)C, &ptr);
+
+ if (gpd_ptr)
+ draw_gpencil_panel((bContext *)C, pa->layout, *gpd_ptr, &ptr);
+}
+
+/* ************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index c0c1cbc7ac6..8cf1affa8c6 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2008, Blender Foundation
+ * The Original Code is Copyright (C) 2008, Blender Foundation, Joshua Leung
* This is a new part of Blender
*
* Contributor(s): Joshua Leung
@@ -25,6 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -59,6 +60,8 @@
#include "BKE_gpencil.h"
#include "BKE_image.h"
#include "BKE_library.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -67,6 +70,9 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+
#include "UI_view2d.h"
#include "ED_armature.h"
@@ -74,275 +80,312 @@
#include "ED_sequencer.h"
#include "ED_view3d.h"
-#include "PIL_time.h" /* sleep */
-
#include "gpencil_intern.h"
-/* XXX */
-static void BIF_undo_push() {}
-static void error() {}
-static int pupmenu() {return 0;}
-static void add_object_draw() {}
-static int get_activedevice() {return 0;}
-#define L_MOUSE 0
-#define R_MOUSE 0
-
-/* ************************************************** */
-/* XXX - OLD DEPRECEATED CODE... */
+/* ************************************************ */
+/* Context Wrangling... */
-/* ----------- GP-Datablock API ------------- */
-
-/* get the appropriate bGPdata from the active/given context */
-// XXX region or region data?
-bGPdata *gpencil_data_getactive (ScrArea *sa)
+/* Get pointer to active Grease Pencil datablock, and an RNA-pointer to trace back to whatever owns it */
+bGPdata **gpencil_data_get_pointers (bContext *C, PointerRNA *ptr)
{
- ScrArea *curarea= NULL; // XXX
+ Scene *scene= CTX_data_scene(C);
+ ScrArea *sa= CTX_wm_area(C);
- /* error checking */
- if ((sa == NULL) && (curarea == NULL))
- return NULL;
- if (sa == NULL)
- sa= curarea;
-
- /* handle depending on spacetype */
- switch (sa->spacetype) {
- case SPACE_VIEW3D:
- {
- View3D *v3d= sa->spacedata.first;
- return v3d->gpd;
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= sa->spacedata.first;
- return snode->gpd;
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= sa->spacedata.first;
+ /* if there's an active area, check if the particular editor may
+ * have defined any special Grease Pencil context for editing...
+ */
+ if (sa) {
+ switch (sa->spacetype) {
+ case SPACE_VIEW3D: /* 3D-View */
+ {
+ Object *ob= CTX_data_active_object(C);
+
+ // TODO: we can include other data-types such as bones later if need be...
+
+ /* just in case no active object */
+ if (ob) {
+ /* for now, as long as there's an object, default to using that in 3D-View */
+ if (ptr) RNA_id_pointer_create(&ob->id, ptr);
+ return &ob->gpd;
+ }
+ }
+ break;
- /* only applicable for image modes */
- if (sseq->mainb != SEQ_DRAW_SEQUENCE)
- return sseq->gpd;
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= sa->spacedata.first;
- return sima->gpd;
+ case SPACE_NODE: /* Nodes Editor */
+ {
+ //SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C);
+
+ /* return the GP data for the active node block/node */
+ }
+ break;
+
+ case SPACE_SEQ: /* Sequencer */
+ {
+ //SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C);
+
+ /* return the GP data for the active strips/image/etc. */
+ }
+ break;
+
+ case SPACE_IMAGE: /* Image/UV Editor */
+ {
+ SpaceImage *sima= (SpaceImage *)CTX_wm_space_data(C);
+
+ /* for now, Grease Pencil data is associated with the space... */
+ // XXX our convention for everything else is to link to data though...
+ if (ptr) RNA_pointer_create((ID *)CTX_wm_screen(C), &RNA_SpaceImageEditor, sima, ptr);
+ return &sima->gpd;
+ }
+ break;
+
+ default: /* unsupported space */
+ return NULL;
}
- break;
}
- /* nothing found */
- return NULL;
+ /* just fall back on the scene's GP data */
+ if (ptr) RNA_id_pointer_create((ID *)scene, ptr);
+ return (scene) ? &scene->gpd : NULL;
}
-/* set bGPdata for the active/given context, and return success/fail */
-short gpencil_data_setactive (ScrArea *sa, bGPdata *gpd)
+/* Get the active Grease Pencil datablock */
+bGPdata *gpencil_data_get_active (bContext *C)
{
- ScrArea *curarea= NULL; // XXX
-
- /* error checking */
- if ((sa == NULL) && (curarea == NULL))
- return 0;
- if (gpd == NULL)
- return 0;
- if (sa == NULL)
- sa= curarea;
-
- /* handle depending on spacetype */
- // TODO: someday we should have multi-user data, so no need to loose old data
- switch (sa->spacetype) {
- case SPACE_VIEW3D:
- {
- View3D *v3d= sa->spacedata.first;
-
- /* free the existing block */
- if (v3d->gpd)
- free_gpencil_data(v3d->gpd);
- v3d->gpd= gpd;
-
- return 1;
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= sa->spacedata.first;
-
- /* free the existing block */
- if (snode->gpd)
- free_gpencil_data(snode->gpd);
- snode->gpd= gpd;
-
- /* set special settings */
- gpd->flag |= GP_DATA_VIEWALIGN;
-
- return 1;
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= sa->spacedata.first;
-
- /* only applicable if right mode */
- if (sseq->mainb != SEQ_DRAW_SEQUENCE) {
- /* free the existing block */
- if (sseq->gpd)
- free_gpencil_data(sseq->gpd);
- sseq->gpd= gpd;
-
- return 1;
- }
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= sa->spacedata.first;
-
- if (sima->gpd)
- free_gpencil_data(sima->gpd);
- sima->gpd= gpd;
-
- return 1;
- }
- break;
- }
-
- /* failed to add */
- return 0;
+ bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
+ return (gpd_ptr) ? *(gpd_ptr) : NULL;
}
-/* return the ScrArea that has the given GP-datablock
- * - assumes that only searching in current screen
- * - is based on GP-datablocks only being able to
- * exist for one area at a time (i.e. not multiuser)
- */
-ScrArea *gpencil_data_findowner (bGPdata *gpd)
+/* ************************************************ */
+/* Panel Operators */
+
+/* poll callback for adding data/layers - special */
+static int gp_add_poll (bContext *C)
+{
+ /* the base line we have is that we have somewhere to add Grease Pencil data */
+ return gpencil_data_get_pointers(C, NULL) != NULL;
+}
+
+/* ******************* Add New Data ************************ */
+
+/* add new datablock - wrapper around API */
+static int gp_data_add_exec (bContext *C, wmOperator *op)
{
- bScreen *curscreen= NULL; // XXX
- ScrArea *sa;
+ bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
- /* error checking */
- if (gpd == NULL)
- return NULL;
-
- /* loop over all scrareas for current screen, and check if that area has this gpd */
- for (sa= curscreen->areabase.first; sa; sa= sa->next) {
- /* use get-active func to see if match */
- if (gpencil_data_getactive(sa) == gpd)
- return sa;
+ if (gpd_ptr == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ /* just add new datablock now */
+ *gpd_ptr= gpencil_data_addnew("GPencil");
}
- /* not found */
- return NULL;
+ /* notifiers */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
+
+ return OPERATOR_FINISHED;
}
-/* ************************************************** */
-/* GREASE-PENCIL EDITING - Tools */
+void GPENCIL_OT_data_add (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Grease Pencil Add New";
+ ot->idname= "GPENCIL_OT_data_add";
+ ot->description= "Add new Grease Pencil datablock.";
+
+ /* callbacks */
+ ot->exec= gp_data_add_exec;
+ ot->poll= gp_add_poll;
+}
-/* --------- Data Deletion ---------- */
+/* ******************* Unlink Data ************************ */
-/* delete the last stroke on the active layer */
-void gpencil_delete_laststroke (bGPdata *gpd, int cfra)
+/* poll callback for adding data/layers - special */
+static int gp_data_unlink_poll (bContext *C)
{
- bGPDlayer *gpl= gpencil_layer_getactive(gpd);
- bGPDframe *gpf= gpencil_layer_getframe(gpl, cfra, 0);
+ bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
- gpencil_frame_delete_laststroke(gpl, gpf);
+ /* if we have access to some active data, make sure there's a datablock before enabling this */
+ return (gpd_ptr && *gpd_ptr);
}
-/* delete the active frame */
-void gpencil_delete_actframe (bGPdata *gpd, int cfra)
+
+/* unlink datablock - wrapper around API */
+static int gp_data_unlink_exec (bContext *C, wmOperator *op)
{
- bGPDlayer *gpl= gpencil_layer_getactive(gpd);
- bGPDframe *gpf= gpencil_layer_getframe(gpl, cfra, 0);
+ bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
- gpencil_layer_delframe(gpl, gpf);
+ if (gpd_ptr == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ /* just unlink datablock now, decreasing its user count */
+ bGPdata *gpd= (*gpd_ptr);
+
+ gpd->id.us--;
+ *gpd_ptr= NULL;
+ }
+
+ /* notifiers */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
+
+ return OPERATOR_FINISHED;
}
+void GPENCIL_OT_data_unlink (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Grease Pencil Unlink";
+ ot->idname= "GPENCIL_OT_data_unlink";
+ ot->description= "Unlink active Grease Pencil datablock.";
+
+ /* callbacks */
+ ot->exec= gp_data_unlink_exec;
+ ot->poll= gp_data_unlink_poll;
+}
+/* ******************* Add New Layer ************************ */
-/* delete various grase-pencil elements
- * mode: 1 - last stroke
- * 2 - active frame
- * 3 - active layer
- */
-void gpencil_delete_operation (int cfra, short mode)
+/* add new layer - wrapper around API */
+static int gp_layer_add_exec (bContext *C, wmOperator *op)
{
- bGPdata *gpd;
-
- /* get datablock to work on */
- gpd= gpencil_data_getactive(NULL);
- if (gpd == NULL) return;
+ bGPdata **gpd_ptr= gpencil_data_get_pointers(C, NULL);
- switch (mode) {
- case 1: /* last stroke */
- gpencil_delete_laststroke(gpd, cfra);
- break;
- case 2: /* active frame */
- gpencil_delete_actframe(gpd, cfra);
- break;
- case 3: /* active layer */
- gpencil_layer_delactive(gpd);
- break;
+ /* if there's no existing Grease-Pencil data there, add some */
+ if (gpd_ptr == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Nowhere for Grease Pencil data to go");
+ return OPERATOR_CANCELLED;
}
+ if (*gpd_ptr == NULL)
+ *gpd_ptr= gpencil_data_addnew("GPencil");
+
+ /* add new layer now */
+ gpencil_layer_addnew(*gpd_ptr);
+
+ /* notifiers */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
- /* redraw and undo-push */
- BIF_undo_push("GPencil Delete");
+ return OPERATOR_FINISHED;
}
-/* display a menu for deleting different grease-pencil elements */
-void gpencil_delete_menu (void)
+void GPENCIL_OT_layer_add (wmOperatorType *ot)
{
- bGPdata *gpd= gpencil_data_getactive(NULL);
- int cfra= 0; // XXX
- short mode;
+ /* identifiers */
+ ot->name= "Add New Layer";
+ ot->idname= "GPENCIL_OT_layer_add";
+ ot->description= "Add new Grease Pencil layer for the active Grease Pencil datablock.";
+
+ /* callbacks */
+ ot->exec= gp_layer_add_exec;
+ ot->poll= gp_add_poll;
+}
+
+/* ******************* Delete Active Frame ************************ */
+
+static int gp_actframe_delete_poll (bContext *C)
+{
+ bGPdata *gpd= gpencil_data_get_active(C);
+ bGPDlayer *gpl= gpencil_layer_getactive(gpd);
+
+ /* only if there's an active layer with an active frame */
+ return (gpl && gpl->actframe);
+}
+
+/* delete active frame - wrapper around API calls */
+static int gp_actframe_delete_exec (bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ bGPdata *gpd= gpencil_data_get_active(C);
+ bGPDlayer *gpl= gpencil_layer_getactive(gpd);
+ bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
- /* only show menu if it will be relevant */
- if (gpd == NULL) return;
+ /* if there's no existing Grease-Pencil data there, add some */
+ if (gpd == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No Grease Pencil data");
+ return OPERATOR_CANCELLED;
+ }
+ if ELEM(NULL, gpl, gpf) {
+ BKE_report(op->reports, RPT_ERROR, "No active frame to delete");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* delete it... */
+ gpencil_layer_delframe(gpl, gpf);
- mode= pupmenu("Grease Pencil Erase...%t|Last Stroke%x1|Active Frame%x2|Active Layer%x3");
- if (mode <= 0) return;
+ /* notifiers */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
- gpencil_delete_operation(cfra, mode);
+ return OPERATOR_FINISHED;
}
-/* --------- Data Conversion ---------- */
+void GPENCIL_OT_active_frame_delete (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Active Frame";
+ ot->idname= "GPENCIL_OT_active_frame_delete";
+ ot->description= "Delete the active frame for the active Grease Pencil datablock.";
+
+ /* callbacks */
+ ot->exec= gp_actframe_delete_exec;
+ ot->poll= gp_actframe_delete_poll;
+}
-/* convert the coordinates from the given stroke point into 3d-coordinates */
-static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float p3d[3])
+/* ************************************************ */
+/* Grease Pencil to Data Operator */
+
+/* defines for possible modes */
+enum {
+ GP_STROKECONVERT_PATH = 1,
+ GP_STROKECONVERT_CURVE,
+};
+
+/* RNA enum define */
+static EnumPropertyItem prop_gpencil_convertmodes[] = {
+ {GP_STROKECONVERT_PATH, "PATH", 0, "Path", ""},
+ {GP_STROKECONVERT_CURVE, "CURVE", 0, "Bezier Curve", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* --- */
+
+/* convert the coordinates from the given stroke point into 3d-coordinates
+ * - assumes that the active space is the 3D-View
+ */
+static void gp_strokepoint_convertcoords (bContext *C, bGPDstroke *gps, bGPDspoint *pt, float p3d[3])
{
- ARegion *ar= NULL; // XXX
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
+ ARegion *ar= CTX_wm_region(C);
if (gps->flag & GP_STROKE_3DSPACE) {
/* directly use 3d-coordinates */
VecCopyf(p3d, &pt->x);
}
else {
+ float *fp= give_cursor(scene, v3d);
+ float dvec[3];
short mval[2];
int mx, my;
- float *fp= give_cursor(NULL, NULL); // XXX should be scene, v3d
- float dvec[3];
/* get screen coordinate */
if (gps->flag & GP_STROKE_2DSPACE) {
- // XXX
- // View2D *v2d= spacelink_get_view2d(curarea->spacedata.first);
- // UI_view2d_view_to_region(v2d, pt->x, pt->y, &mx, &my);
+ View2D *v2d= &ar->v2d;
+ UI_view2d_view_to_region(v2d, pt->x, pt->y, &mx, &my);
}
else {
- // XXX
- // mx= (short)(pt->x / 1000 * curarea->winx);
- // my= (short)(pt->y / 1000 * curarea->winy);
+ mx= (int)(pt->x / 100 * ar->winx);
+ my= (int)(pt->y / 100 * ar->winy);
}
+ mval[0]= (short)mx;
+ mval[1]= (short)my;
/* convert screen coordinate to 3d coordinates
* - method taken from editview.c - mouse_cursor()
*/
project_short_noclip(ar, fp, mval);
- window_to_3d_delta(ar, dvec, mval[0]-mx, mval[1]-my);
+ window_to_3d(ar, dvec, mval[0]-mx, mval[1]-my);
VecSubf(p3d, fp, dvec);
}
}
@@ -350,7 +393,7 @@ static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float
/* --- */
/* convert stroke to 3d path */
-static void gp_stroke_to_path (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
+static void gp_stroke_to_path (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
{
bGPDspoint *pt;
Nurb *nu;
@@ -373,7 +416,7 @@ static void gp_stroke_to_path (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
float p3d[3];
/* get coordinates to add at */
- gp_strokepoint_convertcoords(gps, pt, p3d);
+ gp_strokepoint_convertcoords(C, gps, pt, p3d);
VecCopyf(bp->vec, p3d);
/* set settings */
@@ -386,7 +429,7 @@ static void gp_stroke_to_path (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
}
/* convert stroke to 3d bezier */
-static void gp_stroke_to_bezier (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
+static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
{
bGPDspoint *pt;
Nurb *nu;
@@ -407,7 +450,7 @@ static void gp_stroke_to_bezier (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
float p3d[3];
/* get coordinates to add at */
- gp_strokepoint_convertcoords(gps, pt, p3d);
+ gp_strokepoint_convertcoords(C, gps, pt, p3d);
/* TODO: maybe in future the handles shouldn't be in same place */
VecCopyf(bezt->vec[0], p3d);
@@ -428,10 +471,12 @@ static void gp_stroke_to_bezier (bGPDlayer *gpl, bGPDstroke *gps, Curve *cu)
}
/* convert a given grease-pencil layer to a 3d-curve representation (using current view if appropriate) */
-static void gp_layer_to_curve (bGPdata *gpd, bGPDlayer *gpl, Scene *scene, short mode)
+static void gp_layer_to_curve (bContext *C, bGPdata *gpd, bGPDlayer *gpl, short mode)
{
- bGPDframe *gpf= gpencil_layer_getframe(gpl, scene->r.cfra, 0);
+ Scene *scene= CTX_data_scene(C);
+ bGPDframe *gpf= gpencil_layer_getframe(gpl, CFRA, 0);
bGPDstroke *gps;
+ Base *base= BASACT;
Object *ob;
Curve *cu;
@@ -446,8 +491,7 @@ static void gp_layer_to_curve (bGPdata *gpd, bGPDlayer *gpl, Scene *scene, short
/* init the curve object (remove rotation and get curve data from it)
* - must clear transforms set on object, as those skew our results
*/
- add_object_draw(OB_CURVE);
- ob= OBACT;
+ ob= add_object(scene, OB_CURVE);
ob->loc[0]= ob->loc[1]= ob->loc[2]= 0;
ob->rot[0]= ob->rot[1]= ob->rot[2]= 0;
cu= ob->data;
@@ -460,1240 +504,84 @@ static void gp_layer_to_curve (bGPdata *gpd, bGPDlayer *gpl, Scene *scene, short
/* add points to curve */
for (gps= gpf->strokes.first; gps; gps= gps->next) {
switch (mode) {
- case 1:
- gp_stroke_to_path(gpl, gps, cu);
+ case GP_STROKECONVERT_PATH:
+ gp_stroke_to_path(C, gpl, gps, cu);
break;
- case 2:
- gp_stroke_to_bezier(gpl, gps, cu);
+ case GP_STROKECONVERT_CURVE:
+ gp_stroke_to_bezier(C, gpl, gps, cu);
break;
}
}
+
+ /* restore old active object */
+ BASACT= base;
}
/* --- */
-/* convert a stroke to a bone chain */
-static void gp_stroke_to_bonechain (bGPDlayer *gpl, bGPDstroke *gps, bArmature *arm, ListBase *bones)
+static int gp_convert_poll (bContext *C)
{
- EditBone *ebo, *prev=NULL;
- bGPDspoint *pt, *ptn;
- int i;
-
- /* add each segment separately */
- for (i=0, pt=gps->points, ptn=gps->points+1; i < (gps->totpoints-1); prev=ebo, i++, pt++, ptn++) {
- float p3da[3], p3db[3];
-
- /* get coordinates to add at */
- gp_strokepoint_convertcoords(gps, pt, p3da);
- gp_strokepoint_convertcoords(gps, ptn, p3db);
-
- /* allocate new bone */
- ebo= MEM_callocN(sizeof(EditBone), "eBone");
-
- VecCopyf(ebo->head, p3da);
- VecCopyf(ebo->tail, p3db);
-
- /* add new bone - note: sync with editarmature.c::add_editbone() */
- {
- BLI_strncpy(ebo->name, "Stroke", 32);
- unique_editbone_name(bones, ebo->name, NULL);
-
- BLI_addtail(bones, ebo);
-
- if (i > 0)
- {
- ebo->flag |= BONE_CONNECTED;
- }
- ebo->weight= 1.0f;
- ebo->dist= 0.25f;
- ebo->xwidth= 0.1f;
- ebo->zwidth= 0.1f;
- ebo->ease1= 1.0f;
- ebo->ease2= 1.0f;
- ebo->rad_head= pt->pressure * gpl->thickness * 0.1f;
- ebo->rad_tail= ptn->pressure * gpl->thickness * 0.1f;
- ebo->segments= 1;
- ebo->layer= arm->layer;
- }
-
- /* set parenting */
- ebo->parent= prev;
- }
-}
-
-/* convert a given grease-pencil layer to a 3d-curve representation (using current view if appropriate) */
-// XXX depreceated... we now have etch-a-ton for this...
-static void gp_layer_to_armature (bGPdata *gpd, bGPDlayer *gpl, Scene *scene, View3D *v3d, short mode)
-{
- bGPDframe *gpf= gpencil_layer_getframe(gpl, scene->r.cfra, 0);
- bGPDstroke *gps;
- Object *ob;
- bArmature *arm;
-
- /* error checking */
- if (ELEM3(NULL, gpd, gpl, gpf))
- return;
-
- /* only convert if there are any strokes on this layer's frame to convert */
- if (gpf->strokes.first == NULL)
- return;
-
- /* init the armature object (remove rotation and assign armature data to it)
- * - must clear transforms set on object, as those skew our results
- */
- add_object_draw(OB_ARMATURE);
- ob= OBACT;
- ob->loc[0]= ob->loc[1]= ob->loc[2]= 0;
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0;
- arm= ob->data;
-
- /* rename object and armature to layer name */
- rename_id((ID *)ob, gpl->info);
- rename_id((ID *)arm, gpl->info);
-
- /* this is editmode armature */
- arm->edbo= MEM_callocN(sizeof(ListBase), "arm edbo");
-
- /* convert segments to bones, strokes to bone chains */
- for (gps= gpf->strokes.first; gps; gps= gps->next) {
- gp_stroke_to_bonechain(gpl, gps, arm, arm->edbo);
- }
-
- /* adjust roll of bones
- * - set object as EditMode object, but need to clear afterwards!
- * - use 'align to world z-up' option
- */
- {
- /* set our data as if we're in editmode to fool auto_align_armature() */
- scene->obedit= ob;
-
- /* WARNING: need to make sure this magic number doesn't change */
- auto_align_armature(scene, v3d, 2);
-
- scene->obedit= NULL;
- }
+ bGPdata *gpd= gpencil_data_get_active(C);
+ ScrArea *sa= CTX_wm_area(C);
- /* flush editbones to armature */
- ED_armature_from_edit(scene, ob);
- ED_armature_edit_free(ob);
+ /* only if there's valid data, and the current view is 3D View */
+ return ((sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
}
-/* --- */
-
-/* convert grease-pencil strokes to another representation
- * mode: 1 - Active layer to path
- * 2 - Active layer to bezier
- * 3 - Active layer to armature
- */
-void gpencil_convert_operation (short mode)
+static int gp_convert_layer_exec (bContext *C, wmOperator *op)
{
- Scene *scene= NULL; // XXX
- View3D *v3d= NULL; // XXX
- RegionView3D *rv3d= NULL; // XXX
- bGPdata *gpd;
+ bGPdata *gpd= gpencil_data_get_active(C);
+ bGPDlayer *gpl= gpencil_layer_getactive(gpd);
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
float *fp= give_cursor(scene, v3d);
+ int mode= RNA_enum_get(op->ptr, "type");
- /* get datablock to work on */
- gpd= gpencil_data_getactive(NULL);
- if (gpd == NULL) return;
+ /* check if there's data to work with */
+ if (gpd == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No Grease Pencil data to work on.");
+ return OPERATOR_CANCELLED;
+ }
/* initialise 3d-cursor correction globals */
- initgrabz(rv3d, fp[0], fp[1], fp[2]);
+ initgrabz(CTX_wm_region_view3d(C), fp[0], fp[1], fp[2]);
- /* handle selection modes */
+ /* handle conversion modes */
switch (mode) {
- case 1: /* active layer only (to path) */
- case 2: /* active layer only (to bezier) */
- {
- bGPDlayer *gpl= gpencil_layer_getactive(gpd);
- gp_layer_to_curve(gpd, gpl, scene, mode);
- }
- break;
- case 3: /* active layer only (to armature) */
- {
- bGPDlayer *gpl= gpencil_layer_getactive(gpd);
- gp_layer_to_armature(gpd, gpl, scene, v3d, mode);
- }
- break;
- }
-
- /* redraw and undo-push */
- BIF_undo_push("GPencil Convert");
-}
-
-/* ************************************************** */
-/* GREASE-PENCIL EDITING MODE - Painting */
-
-/* ---------- 'Globals' and Defines ----------------- */
-
-/* maximum sizes of gp-session buffer */
-#define GP_STROKE_BUFFER_MAX 5000
-
-/* Macros for accessing sensitivity thresholds... */
- /* minimum number of pixels mouse should move before new point created */
-#define MIN_MANHATTEN_PX (U.gp_manhattendist)
- /* minimum length of new segment before new point can be added */
-#define MIN_EUCLIDEAN_PX (U.gp_euclideandist)
-
-/* macro to test if only converting endpoints - only for use when converting! */
-#define GP_BUFFER2STROKE_ENDPOINTS ((gpd->flag & GP_DATA_EDITPAINT) && (ctrl))
-
-/* ------ */
-
-/* Temporary 'Stroke' Operation data */
-typedef struct tGPsdata {
- Scene *scene; /* current scene from context */
- ScrArea *sa; /* area where painting originated */
- ARegion *ar; /* region where painting originated */
- View2D *v2d; /* needed for GP_STROKE_2DSPACE */
-
- ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */
- struct IBufViewSettings {
- int offsx, offsy; /* offsets */
- int sizex, sizey; /* dimensions to use as scale-factor */
- } im2d_settings; /* needed for GP_STROKE_2DIMAGE */
-
- bGPdata *gpd; /* gp-datablock layer comes from */
- bGPDlayer *gpl; /* layer we're working on */
- bGPDframe *gpf; /* frame we're working on */
-
- short status; /* current status of painting */
- short paintmode; /* mode for painting */
-
- short mval[2]; /* current mouse-position */
- short mvalo[2]; /* previous recorded mouse-position */
-
- float pressure; /* current stylus pressure */
- float opressure; /* previous stylus pressure */
-
- short radius; /* radius of influence for eraser */
-} tGPsdata;
-
-/* values for tGPsdata->status */
-enum {
- GP_STATUS_NORMAL = 0, /* running normally */
- GP_STATUS_ERROR, /* something wasn't correctly set up */
- GP_STATUS_DONE /* painting done */
-};
-
-/* values for tGPsdata->paintmode */
-enum {
- GP_PAINTMODE_DRAW = 0,
- GP_PAINTMODE_ERASER
-};
-
-/* Return flags for adding points to stroke buffer */
-enum {
- GP_STROKEADD_INVALID = -2, /* error occurred - insufficient info to do so */
- GP_STROKEADD_OVERFLOW = -1, /* error occurred - cannot fit any more points */
- GP_STROKEADD_NORMAL, /* point was successfully added */
- GP_STROKEADD_FULL /* cannot add any more points to buffer */
-};
-
-/* ---------- Stroke Editing ------------ */
-
-/* clear the session buffers (call this before AND after a paint operation) */
-static void gp_session_validatebuffer (tGPsdata *p)
-{
- bGPdata *gpd= p->gpd;
-
- /* clear memory of buffer (or allocate it if starting a new session) */
- if (gpd->sbuffer)
- memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX);
- else
- gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer");
-
- /* reset indices */
- gpd->sbuffer_size = 0;
-
- /* reset flags */
- gpd->sbuffer_sflag= 0;
-}
-
-/* check if the current mouse position is suitable for adding a new point */
-static short gp_stroke_filtermval (tGPsdata *p, short mval[2], short pmval[2])
-{
- short dx= abs(mval[0] - pmval[0]);
- short dy= abs(mval[1] - pmval[1]);
-
- /* check if mouse moved at least certain distance on both axes (best case) */
- 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)
- return 1;
-
- /* mouse 'didn't move' */
- else
- return 0;
-}
-
-/* convert screen-coordinates to buffer-coordinates */
-static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
-{
- bGPdata *gpd= p->gpd;
-
- /* in 3d-space - pt->x/y/z are 3 side-by-side floats */
- if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
- const short mx=mval[0], my=mval[1];
- float *fp= give_cursor(p->scene, NULL); // XXX NULL could be v3d
- float dvec[3];
-
- /* Current method just converts each point in screen-coordinates to
- * 3D-coordinates using the 3D-cursor as reference. In general, this
- * works OK, but it could of course be improved.
- *
- * TODO:
- * - investigate using nearest point(s) on a previous stroke as
- * reference point instead or as offset, for easier stroke matching
- * - investigate projection onto geometry (ala retopo)
- */
-
- /* method taken from editview.c - mouse_cursor() */
- project_short_noclip(p->ar, fp, mval);
- window_to_3d_delta(p->ar, dvec, mval[0]-mx, mval[1]-my);
- VecSubf(out, fp, dvec);
- }
-
- /* 2d - on 'canvas' (assume that p->v2d is set) */
- else if ((gpd->sbuffer_sflag & GP_STROKE_2DSPACE) && (p->v2d)) {
- float x, y;
-
- UI_view2d_region_to_view(p->v2d, mval[0], mval[1], &x, &y);
-
- out[0]= x;
- out[1]= y;
- }
-
- /* 2d - on image 'canvas' (assume that p->v2d is set) */
- else if (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) {
- int sizex, sizey, offsx, offsy;
-
- /* get stored settings
- * - assume that these have been set already (there are checks that set sane 'defaults' just in case)
- */
- sizex= p->im2d_settings.sizex;
- sizey= p->im2d_settings.sizey;
- offsx= p->im2d_settings.offsx;
- offsy= p->im2d_settings.offsy;
-
- /* calculate new points */
- out[0]= (float)(mval[0] - offsx) / (float)sizex;
- out[1]= (float)(mval[1] - offsy) / (float)sizey;
- }
-
- /* 2d - relative to screen (viewport area) */
- else {
- out[0] = (float)(mval[0]) / (float)(p->sa->winx) * 1000;
- out[1] = (float)(mval[1]) / (float)(p->sa->winy) * 1000;
- }
-}
-
-/* add current stroke-point to buffer (returns whether point was successfully added) */
-static short gp_stroke_addpoint (tGPsdata *p, short mval[2], float pressure)
-{
- bGPdata *gpd= p->gpd;
- tGPspoint *pt;
-
- /* check if still room in buffer */
- if (gpd->sbuffer_size >= GP_STROKE_BUFFER_MAX)
- return GP_STROKEADD_OVERFLOW;
-
- /* get pointer to destination point */
- pt= ((tGPspoint *)(gpd->sbuffer) + gpd->sbuffer_size);
-
- /* store settings */
- pt->x= mval[0];
- pt->y= mval[1];
- pt->pressure= pressure;
-
- /* increment counters */
- gpd->sbuffer_size++;
-
- /* check if another operation can still occur */
- if (gpd->sbuffer_size == GP_STROKE_BUFFER_MAX)
- return GP_STROKEADD_FULL;
- else
- return GP_STROKEADD_NORMAL;
-}
-
-/* smooth a stroke (in buffer) before storing it */
-static void gp_stroke_smooth (tGPsdata *p)
-{
- bGPdata *gpd= p->gpd;
- int i=0, cmx=gpd->sbuffer_size;
- int ctrl= 0; // XXX
-
- /* only smooth if smoothing is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || GP_BUFFER2STROKE_ENDPOINTS)
- return;
-
- /* don't try if less than 2 points in buffer */
- if ((cmx <= 2) || (gpd->sbuffer == NULL))
- return;
-
- /* apply weighting-average (note doing this along path sequentially does introduce slight error) */
- for (i=0; i < gpd->sbuffer_size; i++) {
- tGPspoint *pc= (((tGPspoint *)gpd->sbuffer) + i);
- tGPspoint *pb= (i-1 > 0)?(pc-1):(pc);
- tGPspoint *pa= (i-2 > 0)?(pc-2):(pb);
- tGPspoint *pd= (i+1 < cmx)?(pc+1):(pc);
- tGPspoint *pe= (i+2 < cmx)?(pc+2):(pd);
-
- pc->x= (short)(0.1*pa->x + 0.2*pb->x + 0.4*pc->x + 0.2*pd->x + 0.1*pe->x);
- pc->y= (short)(0.1*pa->y + 0.2*pb->y + 0.4*pc->y + 0.2*pd->y + 0.1*pe->y);
- }
-}
-
-/* simplify a stroke (in buffer) before storing it
- * - applies a reverse Chaikin filter
- * - code adapted from etch-a-ton branch (editarmature_sketch.c)
- */
-static void gp_stroke_simplify (tGPsdata *p)
-{
- bGPdata *gpd= p->gpd;
- tGPspoint *old_points= (tGPspoint *)gpd->sbuffer;
- short num_points= gpd->sbuffer_size;
- short flag= gpd->sbuffer_sflag;
- short i, j;
- int ctrl= 0; // XXX
-
- /* only simplify if simlification is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || GP_BUFFER2STROKE_ENDPOINTS)
- return;
-
- /* don't simplify if less than 4 points in buffer */
- if ((num_points <= 2) || (old_points == NULL))
- return;
-
- /* clear buffer (but don't free mem yet) so that we can write to it
- * - firstly set sbuffer to NULL, so a new one is allocated
- * - secondly, reset flag after, as it gets cleared auto
- */
- gpd->sbuffer= NULL;
- gp_session_validatebuffer(p);
- gpd->sbuffer_sflag = flag;
-
-/* macro used in loop to get position of new point
- * - used due to the mixture of datatypes in use here
- */
-#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
- { \
- co[0] += (float)(old_points[offs].x * sfac); \
- co[1] += (float)(old_points[offs].y * sfac); \
- pressure += old_points[offs].pressure * sfac; \
- }
-
- for (i = 0, j = 0; i < num_points; i++)
- {
- if (i - j == 3)
- {
- float co[2], pressure;
- short mco[2];
-
- /* initialise values */
- co[0]= 0;
- co[1]= 0;
- pressure = 0;
-
- /* using macro, calculate new point */
- GP_SIMPLIFY_AVPOINT(j, -0.25f);
- GP_SIMPLIFY_AVPOINT(j+1, 0.75f);
- GP_SIMPLIFY_AVPOINT(j+2, 0.75f);
- GP_SIMPLIFY_AVPOINT(j+3, -0.25f);
-
- /* set values for adding */
- mco[0]= (short)co[0];
- mco[1]= (short)co[1];
-
- /* ignore return values on this... assume to be ok for now */
- gp_stroke_addpoint(p, mco, pressure);
-
- j += 2;
- }
- }
-
- /* free old buffer */
- MEM_freeN(old_points);
-}
-
-
-/* make a new stroke from the buffer data */
-static void gp_stroke_newfrombuffer (tGPsdata *p)
-{
- bGPdata *gpd= p->gpd;
- bGPDstroke *gps;
- bGPDspoint *pt;
- tGPspoint *ptc;
- int i, totelem;
- int ctrl= 0; // XXX
-
- /* get total number of points to allocate space for:
- * - in 'Draw Mode', holding the Ctrl-Modifier will only take endpoints
- * - otherwise, do whole stroke
- */
- if (GP_BUFFER2STROKE_ENDPOINTS)
- totelem = (gpd->sbuffer_size >= 2) ? 2: gpd->sbuffer_size;
- else
- totelem = gpd->sbuffer_size;
-
- /* exit with error if no valid points from this stroke */
- if (totelem == 0) {
- if (G.f & G_DEBUG)
- printf("Error: No valid points in stroke buffer to convert (tot=%d) \n", gpd->sbuffer_size);
- return;
- }
-
- /* allocate memory for a new stroke */
- gps= MEM_callocN(sizeof(bGPDstroke), "gp_stroke");
-
- /* allocate enough memory for a continuous array for storage points */
- pt= gps->points= MEM_callocN(sizeof(bGPDspoint)*totelem, "gp_stroke_points");
-
- /* copy appropriate settings for stroke */
- gps->totpoints= totelem;
- gps->thickness= p->gpl->thickness;
- gps->flag= gpd->sbuffer_sflag;
-
- /* copy points from the buffer to the stroke */
- if (GP_BUFFER2STROKE_ENDPOINTS) {
- /* 'Draw Mode' + Ctrl-Modifier - only endpoints */
- {
- /* first point */
- ptc= gpd->sbuffer;
-
- /* convert screen-coordinates to appropriate coordinates (and store them) */
- gp_stroke_convertcoords(p, &ptc->x, &pt->x);
-
- /* copy pressure */
- pt->pressure= ptc->pressure;
-
- pt++;
- }
-
- if (totelem == 2) {
- /* last point if applicable */
- ptc= ((tGPspoint *)gpd->sbuffer) + (gpd->sbuffer_size - 1);
-
- /* convert screen-coordinates to appropriate coordinates (and store them) */
- gp_stroke_convertcoords(p, &ptc->x, &pt->x);
-
- /* copy pressure */
- pt->pressure= ptc->pressure;
- }
- }
- else {
- /* convert all points (normal behaviour) */
- for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size && ptc; i++, ptc++) {
- /* convert screen-coordinates to appropriate coordinates (and store them) */
- gp_stroke_convertcoords(p, &ptc->x, &pt->x);
-
- /* copy pressure */
- pt->pressure= ptc->pressure;
-
- pt++;
- }
- }
-
- /* add stroke to frame */
- BLI_addtail(&p->gpf->strokes, gps);
-}
-
-/* --- 'Eraser' for 'Paint' Tool ------ */
-
-/* eraser tool - remove segment from stroke/split stroke (after lasso inside) */
-static short gp_stroke_eraser_splitdel (bGPDframe *gpf, bGPDstroke *gps, int i)
-{
- bGPDspoint *pt_tmp= gps->points;
- bGPDstroke *gsn = NULL;
-
- /* if stroke only had two points, get rid of stroke */
- if (gps->totpoints == 2) {
- /* free stroke points, then stroke */
- MEM_freeN(pt_tmp);
- BLI_freelinkN(&gpf->strokes, gps);
-
- /* nothing left in stroke, so stop */
- return 1;
- }
-
- /* if last segment, just remove segment from the stroke */
- else if (i == gps->totpoints - 2) {
- /* allocate new points array, and assign most of the old stroke there */
- gps->totpoints--;
- gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
- memcpy(gps->points, pt_tmp, sizeof(bGPDspoint)*gps->totpoints);
-
- /* free temp buffer */
- MEM_freeN(pt_tmp);
-
- /* nothing left in stroke, so stop */
- return 1;
- }
-
- /* if first segment, just remove segment from the stroke */
- else if (i == 0) {
- /* allocate new points array, and assign most of the old stroke there */
- gps->totpoints--;
- gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
- memcpy(gps->points, pt_tmp + 1, sizeof(bGPDspoint)*gps->totpoints);
-
- /* free temp buffer */
- MEM_freeN(pt_tmp);
-
- /* no break here, as there might still be stuff to remove in this stroke */
- return 0;
- }
-
- /* segment occurs in 'middle' of stroke, so split */
- else {
- /* duplicate stroke, and assign 'later' data to that stroke */
- gsn= MEM_dupallocN(gps);
- gsn->prev= gsn->next= NULL;
- BLI_insertlinkafter(&gpf->strokes, gps, gsn);
-
- gsn->totpoints= gps->totpoints - i;
- gsn->points= MEM_callocN(sizeof(bGPDspoint)*gsn->totpoints, "gp_stroke_points");
- memcpy(gsn->points, pt_tmp + i, sizeof(bGPDspoint)*gsn->totpoints);
-
- /* adjust existing stroke */
- gps->totpoints= i;
- gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
- memcpy(gps->points, pt_tmp, sizeof(bGPDspoint)*i);
-
- /* free temp buffer */
- MEM_freeN(pt_tmp);
-
- /* nothing left in stroke, so stop */
- return 1;
- }
-}
-
-/* eraser tool - check if part of stroke occurs within last segment drawn by eraser */
-static short gp_stroke_eraser_strokeinside (short mval[], short 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))
- return 1;
-
- /* not inside */
- return 0;
-}
-
-/* eraser tool - evaluation per stroke */
-static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[], short rad, rcti *rect, bGPDframe *gpf, bGPDstroke *gps)
-{
- bGPDspoint *pt1, *pt2;
- int x0=0, y0=0, x1=0, y1=0;
- short xyval[2];
- int i;
-
- if (gps->totpoints == 0) {
- /* just free stroke */
- if (gps->points)
- MEM_freeN(gps->points);
- BLI_freelinkN(&gpf->strokes, gps);
- }
- else if (gps->totpoints == 1) {
- /* get coordinates */
- if (gps->flag & GP_STROKE_3DSPACE) {
- project_short(p->ar, &gps->points->x, xyval);
- x0= xyval[0];
- y0= xyval[1];
- }
- else if (gps->flag & GP_STROKE_2DSPACE) {
- UI_view2d_view_to_region(p->v2d, gps->points->x, gps->points->y, &x0, &y0);
- }
- else if (gps->flag & GP_STROKE_2DIMAGE) {
- int offsx, offsy, sizex, sizey;
-
- /* get stored settings */
- sizex= p->im2d_settings.sizex;
- sizey= p->im2d_settings.sizey;
- offsx= p->im2d_settings.offsx;
- offsy= p->im2d_settings.offsy;
-
- /* calculate new points */
- x0= (short)((gps->points->x * sizex) + offsx);
- y0= (short)((gps->points->y * sizey) + offsy);
- }
- else {
- x0= (short)(gps->points->x / 1000 * p->sa->winx);
- y0= (short)(gps->points->y / 1000 * p->sa->winy);
- }
-
- /* do boundbox check first */
- if (BLI_in_rcti(rect, x0, y0)) {
- /* only check if point is inside */
- if ( ((x0-mval[0])*(x0-mval[0]) + (y0-mval[1])*(y0-mval[1])) <= rad*rad ) {
- /* free stroke */
- MEM_freeN(gps->points);
- BLI_freelinkN(&gpf->strokes, gps);
- }
- }
- }
- else {
- /* loop over the points in the stroke, checking for intersections
- * - an intersection will require the stroke to be split
- */
- for (i=0; (i+1) < gps->totpoints; i++) {
- /* get points to work with */
- pt1= gps->points + i;
- pt2= gps->points + i + 1;
-
- /* get coordinates */
- if (gps->flag & GP_STROKE_3DSPACE) {
- project_short(p->ar, &pt1->x, xyval);
- x0= xyval[0];
- y0= xyval[1];
-
- project_short(p->ar, &pt2->x, xyval);
- x1= xyval[0];
- y1= xyval[1];
- }
- else if (gps->flag & GP_STROKE_2DSPACE) {
- UI_view2d_view_to_region(p->v2d, pt1->x, pt1->y, &x0, &y0);
-
- UI_view2d_view_to_region(p->v2d, pt2->x, pt2->y, &x1, &y1);
- }
- else if (gps->flag & GP_STROKE_2DIMAGE) {
- int offsx, offsy, sizex, sizey;
-
- /* get stored settings */
- sizex= p->im2d_settings.sizex;
- sizey= p->im2d_settings.sizey;
- offsx= p->im2d_settings.offsx;
- offsy= p->im2d_settings.offsy;
-
- /* calculate new points */
- x0= (short)((pt1->x * sizex) + offsx);
- y0= (short)((pt1->y * sizey) + offsy);
-
- x1= (short)((pt2->x * sizex) + offsx);
- y1= (short)((pt2->y * sizey) + offsy);
- }
- else {
- x0= (short)(pt1->x / 1000 * p->sa->winx);
- y0= (short)(pt1->y / 1000 * p->sa->winy);
- x1= (short)(pt2->x / 1000 * p->sa->winx);
- y1= (short)(pt2->y / 1000 * p->sa->winy);
- }
-
- /* check that point segment of the boundbox of the eraser stroke */
- if (BLI_in_rcti(rect, x0, y0) || BLI_in_rcti(rect, x1, y1)) {
- /* check if point segment of stroke had anything to do with
- * eraser region (either within stroke painted, or on its lines)
- * - this assumes that linewidth is irrelevant
- */
- if (gp_stroke_eraser_strokeinside(mval, mvalo, rad, x0, y0, x1, y1)) {
- /* if function returns true, break this loop (as no more point to check) */
- if (gp_stroke_eraser_splitdel(gpf, gps, i))
- break;
- }
- }
- }
- }
-}
-
-/* erase strokes which fall under the eraser strokes */
-static void gp_stroke_doeraser (tGPsdata *p)
-{
- bGPDframe *gpf= p->gpf;
- bGPDstroke *gps, *gpn;
- rcti rect;
-
- /* rect is rectangle of eraser */
- rect.xmin= p->mval[0] - p->radius;
- rect.ymin= p->mval[1] - p->radius;
- rect.xmax= p->mval[0] + p->radius;
- rect.ymax= p->mval[1] + p->radius;
-
- /* loop over strokes, checking segments for intersections */
- for (gps= gpf->strokes.first; gps; gps= gpn) {
- gpn= gps->next;
- gp_stroke_eraser_dostroke(p, p->mval, p->mvalo, p->radius, &rect, gpf, gps);
- }
-}
-
-/* ---------- 'Paint' Tool ------------ */
-
-/* init new painting session */
-static void gp_session_initpaint (bContext *C, tGPsdata *p)
-{
- ScrArea *curarea= CTX_wm_area(C);
- ARegion *ar= CTX_wm_region(C);
-
- /* clear previous data (note: is on stack) */
- memset(p, 0, sizeof(tGPsdata));
-
- /* make sure the active view (at the starting time) is a 3d-view */
- if (curarea == NULL) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: No active view for painting \n");
- return;
- }
-
- /* pass on current scene */
- p->scene= CTX_data_scene(C);
-
- switch (curarea->spacetype) {
- /* supported views first */
- case SPACE_VIEW3D:
- {
- View3D *v3d= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
- p->ar= ar;
-
- /* check that gpencil data is allowed to be drawn */
- if ((v3d->flag2 & V3D_DISPGP)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
- p->ar= ar;
- p->v2d= &ar->v2d;
-
- /* check that gpencil data is allowed to be drawn */
- if ((snode->flag & SNODE_DISPGP)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
+ case GP_STROKECONVERT_PATH:
+ case GP_STROKECONVERT_CURVE:
+ gp_layer_to_curve(C, gpd, gpl, mode);
break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= curarea->spacedata.first;
-
- /* set current area */
- p->sa= curarea;
- p->ar= ar;
- p->v2d= &ar->v2d;
-
- /* check that gpencil data is allowed to be drawn */
- if (sseq->mainb == SEQ_DRAW_SEQUENCE) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
- return;
- }
- if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= curarea->spacedata.first;
-
- /* set the current area */
- p->sa= curarea;
- p->ar= ar;
- p->v2d= &ar->v2d;
- p->ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
- /* check that gpencil data is allowed to be drawn */
- if ((sima->flag & SI_DISPGP)==0) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: In active view, Grease Pencil not shown \n");
- return;
- }
- }
- break;
- /* unsupported views */
- default:
- {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: Active view not appropriate for Grease Pencil drawing \n");
- return;
- }
- break;
+ default: /* unsupoorted */
+ BKE_report(op->reports, RPT_ERROR, "Unknown conversion option.");
+ return OPERATOR_CANCELLED;
}
-
- /* get gp-data */
- p->gpd= gpencil_data_getactive(p->sa);
- if (p->gpd == NULL) {
- short ok;
- p->gpd= gpencil_data_addnew("GPencil");
- ok= gpencil_data_setactive(p->sa, p->gpd);
-
- /* most of the time, the following check isn't needed */
- if (ok == 0) {
- /* free gpencil data as it can't be used */
- free_gpencil_data(p->gpd);
- p->gpd= NULL;
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: Could not assign newly created Grease Pencil data to active area \n");
- return;
- }
- }
-
- /* set edit flags */
- G.f |= G_GREASEPENCIL;
+ /* notifiers */
+ WM_event_add_notifier(C, NC_OBJECT|NA_ADDED, NULL);
- /* clear out buffer (stored in gp-data) in case something contaminated it */
- gp_session_validatebuffer(p);
-
- /* set 'default' im2d_settings just in case something that uses this doesn't set it */
- p->im2d_settings.sizex= 1;
- p->im2d_settings.sizey= 1;
+ /* done */
+ return OPERATOR_FINISHED;
}
-/* cleanup after a painting session */
-static void gp_session_cleanup (tGPsdata *p)
+void GPENCIL_OT_convert (wmOperatorType *ot)
{
- bGPdata *gpd= p->gpd;
-
- /* error checking */
- if (gpd == NULL)
- return;
+ /* identifiers */
+ ot->name= "Convert Grease Pencil";
+ ot->idname= "GPENCIL_OT_convert";
+ ot->description= "Convert the active Grease Pencil layer to a new Object.";
- /* free stroke buffer */
- if (gpd->sbuffer) {
- MEM_freeN(gpd->sbuffer);
- gpd->sbuffer= NULL;
- }
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= gp_convert_layer_exec;
+ ot->poll= gp_convert_poll;
- /* clear flags */
- gpd->sbuffer_size= 0;
- gpd->sbuffer_sflag= 0;
-}
-
-/* init new stroke */
-static void gp_paint_initstroke (tGPsdata *p, short paintmode)
-{
- /* get active layer (or add a new one if non-existent) */
- p->gpl= gpencil_layer_getactive(p->gpd);
- if (p->gpl == NULL)
- p->gpl= gpencil_layer_addnew(p->gpd);
- if (p->gpl->flag & GP_LAYER_LOCKED) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: Cannot paint on locked layer \n");
- return;
- }
-
- /* get active frame (add a new one if not matching frame) */
- p->gpf= gpencil_layer_getframe(p->gpl, p->scene->r.cfra, 1);
- if (p->gpf == NULL) {
- p->status= GP_STATUS_ERROR;
- if (G.f & G_DEBUG)
- printf("Error: No frame created (gpencil_paint_init) \n");
- return;
- }
- else
- p->gpf->flag |= GP_FRAME_PAINT;
-
- /* set 'eraser' for this stroke if using eraser */
- p->paintmode= paintmode;
- if (p->paintmode == GP_PAINTMODE_ERASER)
- p->gpd->sbuffer_sflag |= GP_STROKE_ERASER;
-
- /* 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= (View3D *)p->sa->spacedata.first;
- RegionView3D *rv3d= NULL; // XXX
- float *fp= give_cursor(p->scene, v3d);
-
- initgrabz(rv3d, fp[0], fp[1], fp[2]);
-
- p->gpd->sbuffer_sflag |= GP_STROKE_3DSPACE;
- }
- break;
- case SPACE_NODE:
- {
- p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE;
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first;
- int rectx, recty;
- float zoom, zoomx, zoomy;
-
- /* set draw 2d-stroke flag */
- p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE;
-
- /* calculate zoom factor */
- zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom));
- if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
- zoomx = zoom * ((float)p->scene->r.xasp / (float)p->scene->r.yasp);
- zoomy = zoom;
- }
- else
- zoomx = zoomy = zoom;
-
- /* calculate rect size to use to calculate the size of the drawing area
- * - We use the size of the output image not the size of the ibuf being shown
- * as it is too messy getting the ibuf (and could be too slow). This should be
- * a reasonable for most cases anyway.
- */
- rectx= (p->scene->r.size * p->scene->r.xsch) / 100;
- recty= (p->scene->r.size * p->scene->r.ysch) / 100;
-
- /* set offset and scale values for opertations to use */
- p->im2d_settings.sizex= (int)(zoomx * rectx);
- p->im2d_settings.sizey= (int)(zoomy * recty);
- p->im2d_settings.offsx= (int)((p->sa->winx-p->im2d_settings.sizex)/2 + sseq->xof);
- p->im2d_settings.offsy= (int)((p->sa->winy-p->im2d_settings.sizey)/2 + sseq->yof);
- }
- break;
- case SPACE_IMAGE:
- {
- /* check if any ibuf available */
- if (p->ibuf)
- p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE;
- }
- break;
- }
- }
-}
-
-/* finish off a stroke (clears buffer, but doesn't finish the paint operation) */
-static void gp_paint_strokeend (tGPsdata *p)
-{
- /* check if doing eraser or not */
- if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) {
- /* smooth stroke before transferring? */
- gp_stroke_smooth(p);
-
- /* simplify stroke before transferring? */
- gp_stroke_simplify(p);
-
- /* transfer stroke to frame */
- gp_stroke_newfrombuffer(p);
- }
-
- /* clean up buffer now */
- gp_session_validatebuffer(p);
-}
-
-/* finish off stroke painting operation */
-static void gp_paint_cleanup (tGPsdata *p)
-{
- /* finish off a stroke */
- gp_paint_strokeend(p);
-
- /* "unlock" frame */
- p->gpf->flag &= ~GP_FRAME_PAINT;
-
- /* add undo-push so stroke can be undone */
- /* FIXME: currently disabled, as it's impossible to get this working nice
- * as gpenci data is on currently screen-level (which isn't saved to undo files)
- */
- //BIF_undo_push("GPencil Stroke");
-
- /* force redraw after drawing action */
- // XXX force_draw_plus(SPACE_ACTION, 0);
-}
-
-/* -------- */
-
-/* main call to paint a new stroke */
-// XXX will become modal(), gets event, includes all info!
-short gpencil_paint (bContext *C, short paintmode)
-{
- tGPsdata p;
- short ok = GP_STROKEADD_NORMAL;
-
- /* init paint-data */
- gp_session_initpaint(C, &p);
- if (p.status == GP_STATUS_ERROR) {
- gp_session_cleanup(&p);
- return 0;
- }
- gp_paint_initstroke(&p, paintmode);
- if (p.status == GP_STATUS_ERROR) {
- gp_session_cleanup(&p);
- return 0;
- }
-
- /* set cursor to indicate drawing */
- // XXX (cursor callbacks in regiontype) setcursor_space(p.sa->spacetype, CURSOR_VPAINT);
-
- /* init drawing-device settings */
- // XXX getmouseco_areawin(p.mval);
- // XXX p.pressure = get_pressure();
-
- p.mvalo[0]= p.mval[0];
- p.mvalo[1]= p.mval[1];
- p.opressure= p.pressure;
-
- /* radius for eraser circle is defined in userprefs now */
- // TODO: make this more easily tweaked...
- p.radius= U.gp_eraser;
-
- /* start drawing eraser-circle (if applicable) */
- //if (paintmode == GP_PAINTMODE_ERASER)
- // XXX draw_sel_circle(p.mval, NULL, p.radius, p.radius, 0); // draws frontbuffer, but sets backbuf again
-
- /* only allow painting of single 'dots' if:
- * - pressure is not excessive (as it can be on some windows tablets)
- * - draw-mode for active datablock is turned on
- * - not erasing
- */
- if (paintmode != GP_PAINTMODE_ERASER) {
- if (!(p.pressure >= 0.99f) || (p.gpd->flag & GP_DATA_EDITPAINT)) {
- gp_stroke_addpoint(&p, p.mval, p.pressure);
- }
- }
-
- /* XXX paint loop */
- if(0) {
- /* get current user input */
- // XXX getmouseco_areawin(p.mval);
- // XXX p.pressure = get_pressure();
-
- /* only add current point to buffer if mouse moved (otherwise wait until it does) */
- if (paintmode == GP_PAINTMODE_ERASER) {
- /* do 'live' erasing now */
- gp_stroke_doeraser(&p);
-
- // XXX draw_sel_circle(p.mval, p.mvalo, p.radius, p.radius, 0);
- // XXX force_draw(0);
-
- p.mvalo[0]= p.mval[0];
- p.mvalo[1]= p.mval[1];
- p.opressure= p.pressure;
- }
- else if (gp_stroke_filtermval(&p, p.mval, p.mvalo)) {
- /* try to add point */
- ok= gp_stroke_addpoint(&p, p.mval, p.pressure);
-
- /* handle errors while adding point */
- if ((ok == GP_STROKEADD_FULL) || (ok == GP_STROKEADD_OVERFLOW)) {
- /* finish off old stroke */
- gp_paint_strokeend(&p);
-
- /* start a new stroke, starting from previous point */
- gp_stroke_addpoint(&p, p.mvalo, p.opressure);
- ok= gp_stroke_addpoint(&p, p.mval, p.pressure);
- }
- else if (ok == GP_STROKEADD_INVALID) {
- /* the painting operation cannot continue... */
- error("Cannot paint stroke");
- p.status = GP_STATUS_ERROR;
-
- if (G.f & G_DEBUG)
- printf("Error: Grease-Pencil Paint - Add Point Invalid \n");
- // XXX break;
- }
- // XXX force_draw(0);
-
- p.mvalo[0]= p.mval[0];
- p.mvalo[1]= p.mval[1];
- p.opressure= p.pressure;
- }
-
- /* do mouse checking at the end, so don't check twice, and potentially
- * miss a short tap
- */
- }
-
- /* clear edit flags */
- G.f &= ~G_GREASEPENCIL;
-
- /* restore cursor to indicate end of drawing */
- // XXX (cursor callbacks in regiontype) setcursor_space(p.sa->spacetype, CURSOR_STD);
-
- /* check size of buffer before cleanup, to determine if anything happened here */
- if (paintmode == GP_PAINTMODE_ERASER) {
- ok= 1; /* assume that we did something... */
- // XXX draw_sel_circle(NULL, p.mvalo, 0, p.radius, 0);
- }
- else
- ok= p.gpd->sbuffer_size;
-
- /* cleanup */
- gp_paint_cleanup(&p);
- gp_session_cleanup(&p);
-
- /* done! return if a stroke was successfully added */
- return ok;
-}
-
-
-/* All event (loops) handling checking if stroke drawing should be initiated
- * should call this function.
- */
-short gpencil_do_paint (bContext *C)
-{
- ScrArea *sa= CTX_wm_area(C);
- bGPdata *gpd = gpencil_data_getactive(sa);
- short retval= 0;
- int alt= 0, shift= 0, mbut= 0; // XXX
-
- /* check if possible to do painting */
- if (gpd == NULL)
- return 0;
-
- /* currently, we will only 'paint' if:
- * 1. draw-mode on gpd is set (for accessibility reasons)
- * a) single dots are only available by this method if a single click is made
- * b) a straight line is drawn if ctrl-modifier is held (check is done when stroke is converted!)
- * 2. if shift-modifier is held + lmb -> 'quick paint'
- *
- * OR
- *
- * draw eraser stroke if:
- * 1. using the eraser on a tablet
- * 2. draw-mode on gpd is set (for accessiblity reasons)
- * (eraser is mapped to right-mouse)
- * 3. Alt + 'select' mouse-button
- * i.e. if LMB = select: Alt-LMB
- * if RMB = select: Alt-RMB
- */
- if (get_activedevice() == 2) {
- /* eraser on a tablet - always try to erase strokes */
- retval = gpencil_paint(C, GP_PAINTMODE_ERASER);
- }
- else if (gpd->flag & GP_DATA_EDITPAINT) {
- /* try to paint/erase */
- if (mbut == L_MOUSE)
- retval = gpencil_paint(C, GP_PAINTMODE_DRAW);
- else if (mbut == R_MOUSE)
- retval = gpencil_paint(C, GP_PAINTMODE_ERASER);
- }
- else if (!(gpd->flag & GP_DATA_LMBPLOCK)) {
- /* try to paint/erase as not locked */
- if (shift && (mbut == L_MOUSE)) {
- retval = gpencil_paint(C, GP_PAINTMODE_DRAW);
- }
- else if (alt) {
- if ((U.flag & USER_LMOUSESELECT) && (mbut == L_MOUSE))
- retval = gpencil_paint(C, GP_PAINTMODE_ERASER);
- else if (!(U.flag & USER_LMOUSESELECT) && (mbut == R_MOUSE))
- retval = gpencil_paint(C, GP_PAINTMODE_ERASER);
- }
- }
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* return result of trying to paint */
- return retval;
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_gpencil_convertmodes, 0, "Type", "");
}
-/* ************************************************** */
+/* ************************************************ */
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 721d8544225..57e8c882d20 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -29,8 +29,38 @@
#define ED_GPENCIL_INTERN_H
/* internal exports only */
+
+
+/* ***************************************************** */
+/* Operator Defines */
+
+struct wmOperatorType;
+
+/* drawing ---------- */
+
+void GPENCIL_OT_draw(struct wmOperatorType *ot);
+
+/* Paint Modes for operator*/
+typedef enum eGPencil_PaintModes {
+ GP_PAINTMODE_DRAW = 0,
+ GP_PAINTMODE_ERASER,
+ GP_PAINTMODE_DRAW_STRAIGHT,
+} eGPencil_PaintModes;
+
+/* buttons editing --- */
+
+void GPENCIL_OT_data_add(struct wmOperatorType *ot);
+void GPENCIL_OT_data_unlink(struct wmOperatorType *ot);
+
+void GPENCIL_OT_layer_add(struct wmOperatorType *ot);
+
+void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot);
+
+void GPENCIL_OT_convert(struct wmOperatorType *ot);
+
+
/******************************************************* */
-/* FILTERED ACTION DATA - TYPES */
+/* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */
/* XXX - TODO: replace this with the modern bAnimListElem... */
/* This struct defines a structure used for quick access */
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
new file mode 100644
index 00000000000..d311b39b9a3
--- /dev/null
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -0,0 +1,86 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009, Blender Foundation, Joshua Leung
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include "BLI_blenlib.h"
+
+#include "DNA_windowmanager_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "gpencil_intern.h"
+
+/* ****************************************** */
+/* Generic Editing Keymap */
+
+void ED_keymap_gpencil(wmWindowManager *wm)
+{
+ wmKeyMap *keymap= WM_keymap_find(wm, "Grease Pencil", 0, 0);
+ wmKeymapItem *kmi;
+
+ /* Draw */
+ /* draw */
+ WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, 0, DKEY);
+ /* draw - straight lines */
+ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, DKEY);
+ RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT);
+ /* erase */
+ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, 0, DKEY);
+ RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
+}
+
+/* ****************************************** */
+
+void ED_operatortypes_gpencil (void)
+{
+ /* Drawing ----------------------- */
+
+ WM_operatortype_append(GPENCIL_OT_draw);
+
+ /* Editing (Buttons) ------------ */
+
+ WM_operatortype_append(GPENCIL_OT_data_add);
+ WM_operatortype_append(GPENCIL_OT_data_unlink);
+
+ WM_operatortype_append(GPENCIL_OT_layer_add);
+
+ WM_operatortype_append(GPENCIL_OT_active_frame_delete);
+
+ WM_operatortype_append(GPENCIL_OT_convert);
+
+ /* Editing (Time) --------------- */
+}
+
+/* ****************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
new file mode 100644
index 00000000000..92ae2400666
--- /dev/null
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -0,0 +1,1434 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008, Blender Foundation, Joshua Leung
+ * This is a new part of Blender
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_gpencil.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_action_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_view2d_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "UI_view2d.h"
+
+#include "ED_armature.h"
+#include "ED_gpencil.h"
+#include "ED_sequencer.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "RNA_access.h"
+
+#include "RNA_define.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "gpencil_intern.h"
+
+/* ******************************************* */
+/* 'Globals' and Defines */
+
+/* Temporary 'Stroke' Operation data */
+typedef struct tGPsdata {
+ Scene *scene; /* current scene from context */
+ ScrArea *sa; /* area where painting originated */
+ ARegion *ar; /* region where painting originated */
+ View2D *v2d; /* needed for GP_STROKE_2DSPACE */
+
+#if 0 // XXX review this 2d image stuff...
+ ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */
+ struct IBufViewSettings {
+ int offsx, offsy; /* offsets */
+ int sizex, sizey; /* dimensions to use as scale-factor */
+ } im2d_settings; /* needed for GP_STROKE_2DIMAGE */
+#endif
+
+ PointerRNA ownerPtr;/* pointer to owner of gp-datablock */
+ bGPdata *gpd; /* gp-datablock layer comes from */
+ bGPDlayer *gpl; /* layer we're working on */
+ bGPDframe *gpf; /* frame we're working on */
+
+ short status; /* current status of painting */
+ short paintmode; /* mode for painting */
+
+ int mval[2]; /* current mouse-position */
+ int mvalo[2]; /* previous recorded mouse-position */
+
+ float pressure; /* current stylus pressure */
+ float opressure; /* previous stylus pressure */
+
+ short radius; /* radius of influence for eraser */
+ short flags; /* flags that can get set during runtime */
+} tGPsdata;
+
+/* values for tGPsdata->status */
+enum {
+ GP_STATUS_IDLING = 0, /* stroke isn't in progress yet */
+ GP_STATUS_PAINTING, /* a stroke is in progress */
+ GP_STATUS_ERROR, /* something wasn't correctly set up */
+ GP_STATUS_DONE /* painting done */
+};
+
+/* Return flags for adding points to stroke buffer */
+enum {
+ GP_STROKEADD_INVALID = -2, /* error occurred - insufficient info to do so */
+ GP_STROKEADD_OVERFLOW = -1, /* error occurred - cannot fit any more points */
+ GP_STROKEADD_NORMAL, /* point was successfully added */
+ GP_STROKEADD_FULL /* cannot add any more points to buffer */
+};
+
+/* Runtime flags */
+enum {
+ GP_PAINTFLAG_FIRSTRUN = (1<<0), /* operator just started */
+};
+
+/* ------ */
+
+/* maximum sizes of gp-session buffer */
+#define GP_STROKE_BUFFER_MAX 5000
+
+/* Macros for accessing sensitivity thresholds... */
+ /* minimum number of pixels mouse should move before new point created */
+#define MIN_MANHATTEN_PX (U.gp_manhattendist)
+ /* minimum length of new segment before new point can be added */
+#define MIN_EUCLIDEAN_PX (U.gp_euclideandist)
+
+/* ------ */
+/* Forward defines for some functions... */
+
+static void gp_session_validatebuffer(tGPsdata *p);
+
+/* ******************************************* */
+/* Context Wrangling... */
+
+/* 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);
+}
+
+/* ******************************************* */
+/* Calculations/Conversions */
+
+/* Utilities --------------------------------- */
+
+/* get the reference point for stroke-point conversions */
+static void gp_get_3d_reference (tGPsdata *p, float *vec)
+{
+ View3D *v3d= p->sa->spacedata.first;
+ float *fp= give_cursor(p->scene, v3d);
+
+ /* the reference point used depends on the owner... */
+ if (p->ownerPtr.type == &RNA_Object) {
+ Object *ob= (Object *)p->ownerPtr.data;
+
+ /* active Object
+ * - use relative distance of 3D-cursor from object center
+ */
+ VecSubf(vec, fp, ob->loc);
+ }
+ else {
+ /* use 3D-cursor */
+ VecCopyf(vec, fp);
+ }
+}
+
+/* Stroke Editing ---------------------------- */
+
+/* check if the current mouse position is suitable for adding a new point */
+static short gp_stroke_filtermval (tGPsdata *p, int mval[2], int pmval[2])
+{
+ int dx= abs(mval[0] - pmval[0]);
+ int dy= abs(mval[1] - pmval[1]);
+
+ /* if buffer is empty, just let this go through (i.e. so that dots will work) */
+ if (p->gpd->sbuffer_size == 0)
+ return 1;
+
+ /* check if mouse moved at least certain distance on both axes (best case) */
+ 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)
+ return 1;
+
+ /* mouse 'didn't move' */
+ else
+ return 0;
+}
+
+/* convert screen-coordinates to buffer-coordinates */
+// XXX this method needs a total overhaul!
+static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
+{
+ bGPdata *gpd= p->gpd;
+
+ /* in 3d-space - pt->x/y/z are 3 side-by-side floats */
+ if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
+ const short mx=mval[0], my=mval[1];
+ float rvec[3], dvec[3];
+
+ /* Current method just converts each point in screen-coordinates to
+ * 3D-coordinates using the 3D-cursor as reference. In general, this
+ * works OK, but it could of course be improved.
+ *
+ * TODO:
+ * - investigate using nearest point(s) on a previous stroke as
+ * reference point instead or as offset, for easier stroke matching
+ * - investigate projection onto geometry (ala retopo)
+ */
+ gp_get_3d_reference(p, rvec);
+
+ /* method taken from editview.c - mouse_cursor() */
+ project_short_noclip(p->ar, rvec, mval);
+ window_to_3d_delta(p->ar, dvec, mval[0]-mx, mval[1]-my);
+ VecSubf(out, rvec, dvec);
+ }
+
+ /* 2d - on 'canvas' (assume that p->v2d is set) */
+ else if ((gpd->sbuffer_sflag & GP_STROKE_2DSPACE) && (p->v2d)) {
+ float x, y;
+
+ UI_view2d_region_to_view(p->v2d, mval[0], mval[1], &x, &y);
+
+ out[0]= x;
+ out[1]= y;
+ }
+
+#if 0
+ /* 2d - on image 'canvas' (assume that p->v2d is set) */
+ else if (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) {
+ int sizex, sizey, offsx, offsy;
+
+ /* get stored settings
+ * - assume that these have been set already (there are checks that set sane 'defaults' just in case)
+ */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ out[0]= (float)(mval[0] - offsx) / (float)sizex;
+ out[1]= (float)(mval[1] - offsy) / (float)sizey;
+ }
+#endif
+
+ /* 2d - relative to screen (viewport area) */
+ else {
+ out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
+ out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
+ }
+}
+
+/* add current stroke-point to buffer (returns whether point was successfully added) */
+static short gp_stroke_addpoint (tGPsdata *p, int mval[2], float pressure)
+{
+ bGPdata *gpd= p->gpd;
+ tGPspoint *pt;
+
+ /* check painting mode */
+ if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT) {
+ /* straight lines only - i.e. only store start and end point in buffer */
+ if (gpd->sbuffer_size == 0) {
+ /* first point in buffer (start point) */
+ pt= (tGPspoint *)(gpd->sbuffer);
+
+ /* store settings */
+ pt->x= mval[0];
+ pt->y= mval[1];
+ pt->pressure= pressure;
+
+ /* increment buffer size */
+ gpd->sbuffer_size++;
+ }
+ else {
+ /* normally, we just reset the endpoint to the latest value
+ * - assume that pointers for this are always valid...
+ */
+ pt= ((tGPspoint *)(gpd->sbuffer) + 1);
+
+ /* store settings */
+ pt->x= mval[0];
+ pt->y= mval[1];
+ pt->pressure= pressure;
+
+ /* if this is just the second point we've added, increment the buffer size
+ * so that it will be drawn properly...
+ * otherwise, just leave it alone, otherwise we get problems
+ */
+ if (gpd->sbuffer_size != 2)
+ gpd->sbuffer_size= 2;
+ }
+
+ /* can keep carrying on this way :) */
+ return GP_STROKEADD_NORMAL;
+ }
+ else if (p->paintmode == GP_PAINTMODE_DRAW) { /* normal drawing */
+ /* check if still room in buffer */
+ if (gpd->sbuffer_size >= GP_STROKE_BUFFER_MAX)
+ return GP_STROKEADD_OVERFLOW;
+
+ /* get pointer to destination point */
+ pt= ((tGPspoint *)(gpd->sbuffer) + gpd->sbuffer_size);
+
+ /* store settings */
+ pt->x= mval[0];
+ pt->y= mval[1];
+ pt->pressure= pressure;
+
+ /* increment counters */
+ gpd->sbuffer_size++;
+
+ /* check if another operation can still occur */
+ if (gpd->sbuffer_size == GP_STROKE_BUFFER_MAX)
+ return GP_STROKEADD_FULL;
+ else
+ return GP_STROKEADD_NORMAL;
+ }
+
+ /* return invalid state for now... */
+ return GP_STROKEADD_INVALID;
+}
+
+/* smooth a stroke (in buffer) before storing it */
+static void gp_stroke_smooth (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+ int i=0, cmx=gpd->sbuffer_size;
+
+ /* only smooth if smoothing is enabled, and we're not doing a straight line */
+ if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
+ return;
+
+ /* don't try if less than 2 points in buffer */
+ if ((cmx <= 2) || (gpd->sbuffer == NULL))
+ return;
+
+ /* apply weighting-average (note doing this along path sequentially does introduce slight error) */
+ for (i=0; i < gpd->sbuffer_size; i++) {
+ tGPspoint *pc= (((tGPspoint *)gpd->sbuffer) + i);
+ tGPspoint *pb= (i-1 > 0)?(pc-1):(pc);
+ tGPspoint *pa= (i-2 > 0)?(pc-2):(pb);
+ tGPspoint *pd= (i+1 < cmx)?(pc+1):(pc);
+ tGPspoint *pe= (i+2 < cmx)?(pc+2):(pd);
+
+ pc->x= (short)(0.1*pa->x + 0.2*pb->x + 0.4*pc->x + 0.2*pd->x + 0.1*pe->x);
+ pc->y= (short)(0.1*pa->y + 0.2*pb->y + 0.4*pc->y + 0.2*pd->y + 0.1*pe->y);
+ }
+}
+
+/* simplify a stroke (in buffer) before storing it
+ * - applies a reverse Chaikin filter
+ * - code adapted from etch-a-ton branch (editarmature_sketch.c)
+ */
+static void gp_stroke_simplify (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+ tGPspoint *old_points= (tGPspoint *)gpd->sbuffer;
+ short num_points= gpd->sbuffer_size;
+ short flag= gpd->sbuffer_sflag;
+ short i, j;
+
+ /* only simplify if simlification 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))
+ return;
+
+ /* clear buffer (but don't free mem yet) so that we can write to it
+ * - firstly set sbuffer to NULL, so a new one is allocated
+ * - secondly, reset flag after, as it gets cleared auto
+ */
+ gpd->sbuffer= NULL;
+ gp_session_validatebuffer(p);
+ gpd->sbuffer_sflag = flag;
+
+/* macro used in loop to get position of new point
+ * - used due to the mixture of datatypes in use here
+ */
+#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
+ { \
+ co[0] += (float)(old_points[offs].x * sfac); \
+ co[1] += (float)(old_points[offs].y * sfac); \
+ pressure += old_points[offs].pressure * sfac; \
+ }
+
+ for (i = 0, j = 0; i < num_points; i++)
+ {
+ if (i - j == 3)
+ {
+ float co[2], pressure;
+ int mco[2];
+
+ /* initialise values */
+ co[0]= 0;
+ co[1]= 0;
+ pressure = 0;
+
+ /* using macro, calculate new point */
+ GP_SIMPLIFY_AVPOINT(j, -0.25f);
+ GP_SIMPLIFY_AVPOINT(j+1, 0.75f);
+ GP_SIMPLIFY_AVPOINT(j+2, 0.75f);
+ GP_SIMPLIFY_AVPOINT(j+3, -0.25f);
+
+ /* set values for adding */
+ mco[0]= (int)co[0];
+ mco[1]= (int)co[1];
+
+ /* ignore return values on this... assume to be ok for now */
+ gp_stroke_addpoint(p, mco, pressure);
+
+ j += 2;
+ }
+ }
+
+ /* free old buffer */
+ MEM_freeN(old_points);
+}
+
+
+/* make a new stroke from the buffer data */
+static void gp_stroke_newfrombuffer (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+ bGPDstroke *gps;
+ bGPDspoint *pt;
+ tGPspoint *ptc;
+ int i, totelem;
+
+ /* get total number of points to allocate space for
+ * - drawing straight-lines only requires the endpoints
+ */
+ if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT)
+ totelem = (gpd->sbuffer_size >= 2) ? 2: gpd->sbuffer_size;
+ else
+ totelem = gpd->sbuffer_size;
+
+ /* exit with error if no valid points from this stroke */
+ if (totelem == 0) {
+ if (G.f & G_DEBUG)
+ printf("Error: No valid points in stroke buffer to convert (tot=%d) \n", gpd->sbuffer_size);
+ return;
+ }
+
+ /* allocate memory for a new stroke */
+ gps= MEM_callocN(sizeof(bGPDstroke), "gp_stroke");
+
+ /* allocate enough memory for a continuous array for storage points */
+ pt= gps->points= MEM_callocN(sizeof(bGPDspoint)*totelem, "gp_stroke_points");
+
+ /* copy appropriate settings for stroke */
+ gps->totpoints= totelem;
+ gps->thickness= p->gpl->thickness;
+ gps->flag= gpd->sbuffer_sflag;
+
+ /* copy points from the buffer to the stroke */
+ if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT) {
+ /* straight lines only -> only endpoints */
+ {
+ /* first point */
+ ptc= gpd->sbuffer;
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &ptc->x, &pt->x);
+
+ /* copy pressure */
+ pt->pressure= ptc->pressure;
+
+ pt++;
+ }
+
+ if (totelem == 2) {
+ /* last point if applicable */
+ ptc= ((tGPspoint *)gpd->sbuffer) + (gpd->sbuffer_size - 1);
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &ptc->x, &pt->x);
+
+ /* copy pressure */
+ pt->pressure= ptc->pressure;
+ }
+ }
+ else {
+ /* convert all points (normal behaviour) */
+ for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size && ptc; i++, ptc++) {
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &ptc->x, &pt->x);
+
+ /* copy pressure */
+ pt->pressure= ptc->pressure;
+
+ pt++;
+ }
+ }
+
+ /* add stroke to frame */
+ BLI_addtail(&p->gpf->strokes, gps);
+}
+
+/* --- 'Eraser' for 'Paint' Tool ------ */
+
+/* eraser tool - remove segment from stroke/split stroke (after lasso inside) */
+static short gp_stroke_eraser_splitdel (bGPDframe *gpf, bGPDstroke *gps, int i)
+{
+ bGPDspoint *pt_tmp= gps->points;
+ bGPDstroke *gsn = NULL;
+
+ /* if stroke only had two points, get rid of stroke */
+ if (gps->totpoints == 2) {
+ /* free stroke points, then stroke */
+ MEM_freeN(pt_tmp);
+ BLI_freelinkN(&gpf->strokes, gps);
+
+ /* nothing left in stroke, so stop */
+ return 1;
+ }
+
+ /* if last segment, just remove segment from the stroke */
+ else if (i == gps->totpoints - 2) {
+ /* allocate new points array, and assign most of the old stroke there */
+ gps->totpoints--;
+ gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
+ memcpy(gps->points, pt_tmp, sizeof(bGPDspoint)*gps->totpoints);
+
+ /* free temp buffer */
+ MEM_freeN(pt_tmp);
+
+ /* nothing left in stroke, so stop */
+ return 1;
+ }
+
+ /* if first segment, just remove segment from the stroke */
+ else if (i == 0) {
+ /* allocate new points array, and assign most of the old stroke there */
+ gps->totpoints--;
+ gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
+ memcpy(gps->points, pt_tmp + 1, sizeof(bGPDspoint)*gps->totpoints);
+
+ /* free temp buffer */
+ MEM_freeN(pt_tmp);
+
+ /* no break here, as there might still be stuff to remove in this stroke */
+ return 0;
+ }
+
+ /* segment occurs in 'middle' of stroke, so split */
+ else {
+ /* duplicate stroke, and assign 'later' data to that stroke */
+ gsn= MEM_dupallocN(gps);
+ gsn->prev= gsn->next= NULL;
+ BLI_insertlinkafter(&gpf->strokes, gps, gsn);
+
+ gsn->totpoints= gps->totpoints - i;
+ gsn->points= MEM_callocN(sizeof(bGPDspoint)*gsn->totpoints, "gp_stroke_points");
+ memcpy(gsn->points, pt_tmp + i, sizeof(bGPDspoint)*gsn->totpoints);
+
+ /* adjust existing stroke */
+ gps->totpoints= i;
+ gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
+ memcpy(gps->points, pt_tmp, sizeof(bGPDspoint)*i);
+
+ /* free temp buffer */
+ MEM_freeN(pt_tmp);
+
+ /* nothing left in stroke, so stop */
+ return 1;
+ }
+}
+
+/* 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)
+{
+ /* simple within-radius check for now */
+ if (edge_inside_circle(mval[0], mval[1], rad, x0, y0, x1, y1))
+ return 1;
+
+ /* not inside */
+ return 0;
+}
+
+/* eraser tool - evaluation per stroke */
+// TODO: this could really do with some optimisation (KD-Tree/BVH?)
+static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], short rad, rcti *rect, bGPDframe *gpf, bGPDstroke *gps)
+{
+ bGPDspoint *pt1, *pt2;
+ int x0=0, y0=0, x1=0, y1=0;
+ short xyval[2];
+ int i;
+
+ if (gps->totpoints == 0) {
+ /* just free stroke */
+ if (gps->points)
+ MEM_freeN(gps->points);
+ BLI_freelinkN(&gpf->strokes, gps);
+ }
+ else if (gps->totpoints == 1) {
+ /* get coordinates */
+ if (gps->flag & GP_STROKE_3DSPACE) {
+ project_short(p->ar, &gps->points->x, xyval);
+ x0= xyval[0];
+ y0= xyval[1];
+ }
+ else if (gps->flag & GP_STROKE_2DSPACE) {
+ UI_view2d_view_to_region(p->v2d, gps->points->x, gps->points->y, &x0, &y0);
+ }
+#if 0
+ else if (gps->flag & GP_STROKE_2DIMAGE) {
+ int offsx, offsy, sizex, sizey;
+
+ /* get stored settings */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ x0= (int)((gps->points->x * sizex) + offsx);
+ y0= (int)((gps->points->y * sizey) + offsy);
+ }
+#endif
+ else {
+ x0= (int)(gps->points->x / 100 * p->ar->winx);
+ y0= (int)(gps->points->y / 100 * p->ar->winy);
+ }
+
+ /* do boundbox check first */
+ if (BLI_in_rcti(rect, x0, y0)) {
+ /* only check if point is inside */
+ if ( ((x0-mval[0])*(x0-mval[0]) + (y0-mval[1])*(y0-mval[1])) <= rad*rad ) {
+ /* free stroke */
+ MEM_freeN(gps->points);
+ BLI_freelinkN(&gpf->strokes, gps);
+ }
+ }
+ }
+ else {
+ /* loop over the points in the stroke, checking for intersections
+ * - an intersection will require the stroke to be split
+ */
+ for (i=0; (i+1) < gps->totpoints; i++) {
+ /* get points to work with */
+ pt1= gps->points + i;
+ pt2= gps->points + i + 1;
+
+ /* get coordinates */
+ if (gps->flag & GP_STROKE_3DSPACE) {
+ project_short(p->ar, &pt1->x, xyval);
+ x0= xyval[0];
+ y0= xyval[1];
+
+ project_short(p->ar, &pt2->x, xyval);
+ x1= xyval[0];
+ y1= xyval[1];
+ }
+ else if (gps->flag & GP_STROKE_2DSPACE) {
+ UI_view2d_view_to_region(p->v2d, pt1->x, pt1->y, &x0, &y0);
+
+ UI_view2d_view_to_region(p->v2d, pt2->x, pt2->y, &x1, &y1);
+ }
+#if 0
+ else if (gps->flag & GP_STROKE_2DIMAGE) {
+ int offsx, offsy, sizex, sizey;
+
+ /* get stored settings */
+ sizex= p->im2d_settings.sizex;
+ sizey= p->im2d_settings.sizey;
+ offsx= p->im2d_settings.offsx;
+ offsy= p->im2d_settings.offsy;
+
+ /* calculate new points */
+ x0= (int)((pt1->x * sizex) + offsx);
+ y0= (int)((pt1->y * sizey) + offsy);
+
+ x1= (int)((pt2->x * sizex) + offsx);
+ y1= (int)((pt2->y * sizey) + offsy);
+ }
+#endif
+ else {
+ x0= (int)(pt1->x / 100 * p->ar->winx);
+ y0= (int)(pt1->y / 100 * p->ar->winy);
+ x1= (int)(pt2->x / 100 * p->ar->winx);
+ y1= (int)(pt2->y / 100 * p->ar->winy);
+ }
+
+ /* check that point segment of the boundbox of the eraser stroke */
+ if (BLI_in_rcti(rect, x0, y0) || BLI_in_rcti(rect, x1, y1)) {
+ /* check if point segment of stroke had anything to do with
+ * eraser region (either within stroke painted, or on its lines)
+ * - this assumes that linewidth is irrelevant
+ */
+ if (gp_stroke_eraser_strokeinside(mval, mvalo, rad, x0, y0, x1, y1)) {
+ /* if function returns true, break this loop (as no more point to check) */
+ if (gp_stroke_eraser_splitdel(gpf, gps, i))
+ break;
+ }
+ }
+ }
+ }
+}
+
+/* erase strokes which fall under the eraser strokes */
+static void gp_stroke_doeraser (tGPsdata *p)
+{
+ bGPDframe *gpf= p->gpf;
+ bGPDstroke *gps, *gpn;
+ rcti rect;
+
+ /* rect is rectangle of eraser */
+ rect.xmin= p->mval[0] - p->radius;
+ rect.ymin= p->mval[1] - p->radius;
+ rect.xmax= p->mval[0] + p->radius;
+ rect.ymax= p->mval[1] + p->radius;
+
+ /* loop over strokes, checking segments for intersections */
+ for (gps= gpf->strokes.first; gps; gps= gpn) {
+ gpn= gps->next;
+ gp_stroke_eraser_dostroke(p, p->mval, p->mvalo, p->radius, &rect, gpf, gps);
+ }
+}
+
+/* ******************************************* */
+/* Sketching Operator */
+
+/* clear the session buffers (call this before AND after a paint operation) */
+static void gp_session_validatebuffer (tGPsdata *p)
+{
+ bGPdata *gpd= p->gpd;
+
+ /* clear memory of buffer (or allocate it if starting a new session) */
+ if (gpd->sbuffer)
+ memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX);
+ else
+ gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer");
+
+ /* reset indices */
+ gpd->sbuffer_size = 0;
+
+ /* reset flags */
+ gpd->sbuffer_sflag= 0;
+}
+
+/* init new painting session */
+static tGPsdata *gp_session_initpaint (bContext *C)
+{
+ tGPsdata *p = NULL;
+ bGPdata **gpd_ptr = NULL;
+ ScrArea *curarea= CTX_wm_area(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ /* make sure the active view (at the starting time) is a 3d-view */
+ if (curarea == NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error: No active view for painting \n");
+ return NULL;
+ }
+
+ /* create new context data */
+ p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
+
+ /* pass on current scene */
+ p->scene= CTX_data_scene(C);
+
+ switch (curarea->spacetype) {
+ /* supported views first */
+ case SPACE_VIEW3D:
+ {
+ //View3D *v3d= curarea->spacedata.first;
+
+ /* set current area
+ * - must verify that region data is 3D-view (and not something else)
+ */
+ p->sa= curarea;
+ p->ar= ar;
+
+ if (ar->regiondata == NULL) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n");
+ return p;
+ }
+
+#if 0 // XXX will this sort of antiquated stuff be restored?
+ /* check that gpencil data is allowed to be drawn */
+ if ((v3d->flag2 & V3D_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return p;
+ }
+#endif
+ }
+ break;
+#if 0 // XXX these other spaces will come over time...
+ case SPACE_NODE:
+ {
+ SpaceNode *snode= curarea->spacedata.first;
+
+ /* set current area */
+ p->sa= curarea;
+ p->ar= ar;
+ p->v2d= &ar->v2d;
+
+ /* check that gpencil data is allowed to be drawn */
+ if ((snode->flag & SNODE_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+ case SPACE_SEQ:
+ {
+ SpaceSeq *sseq= curarea->spacedata.first;
+
+ /* set current area */
+ p->sa= curarea;
+ p->ar= ar;
+ p->v2d= &ar->v2d;
+
+ /* check that gpencil data is allowed to be drawn */
+ if (sseq->mainb == SEQ_DRAW_SEQUENCE) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
+ return;
+ }
+ if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return;
+ }
+ }
+ break;
+#endif
+ case SPACE_IMAGE:
+ {
+ //SpaceImage *sima= curarea->spacedata.first;
+
+ /* set the current area */
+ p->sa= curarea;
+ p->ar= ar;
+ p->v2d= &ar->v2d;
+ //p->ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
+
+#if 0 // XXX disabled for now
+ /* check that gpencil data is allowed to be drawn */
+ if ((sima->flag & SI_DISPGP)==0) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: In active view, Grease Pencil not shown \n");
+ return p;
+ }
+#endif
+ }
+ break;
+
+ /* unsupported views */
+ default:
+ {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: Active view not appropriate for Grease Pencil drawing \n");
+ return p;
+ }
+ break;
+ }
+
+ /* get gp-data */
+ gpd_ptr= gpencil_data_get_pointers(C, &p->ownerPtr);
+ if (gpd_ptr == NULL) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: Current context doesn't allow for any Grease Pencil data \n");
+ return p;
+ }
+ else {
+ /* if no existing GPencil block exists, add one */
+ if (*gpd_ptr == NULL)
+ *gpd_ptr= gpencil_data_addnew("GPencil");
+ p->gpd= *gpd_ptr;
+ }
+
+ /* 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);
+
+#if 0
+ /* set 'default' im2d_settings just in case something that uses this doesn't set it */
+ p->im2d_settings.sizex= 1;
+ p->im2d_settings.sizey= 1;
+#endif
+
+ /* return context data for running paint operator */
+ return p;
+}
+
+/* cleanup after a painting session */
+static void gp_session_cleanup (tGPsdata *p)
+{
+ bGPdata *gpd= (p) ? p->gpd : NULL;
+
+ /* error checking */
+ if (gpd == NULL)
+ return;
+
+ /* free stroke buffer */
+ if (gpd->sbuffer) {
+ MEM_freeN(gpd->sbuffer);
+ gpd->sbuffer= NULL;
+ }
+
+ /* clear flags */
+ gpd->sbuffer_size= 0;
+ gpd->sbuffer_sflag= 0;
+}
+
+/* init new stroke */
+static void gp_paint_initstroke (tGPsdata *p, short paintmode)
+{
+ /* get active layer (or add a new one if non-existent) */
+ p->gpl= gpencil_layer_getactive(p->gpd);
+ if (p->gpl == NULL)
+ p->gpl= gpencil_layer_addnew(p->gpd);
+ if (p->gpl->flag & GP_LAYER_LOCKED) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: Cannot paint on locked layer \n");
+ return;
+ }
+
+ /* get active frame (add a new one if not matching frame) */
+ p->gpf= gpencil_layer_getframe(p->gpl, p->scene->r.cfra, 1);
+ if (p->gpf == NULL) {
+ p->status= GP_STATUS_ERROR;
+ if (G.f & G_DEBUG)
+ printf("Error: No frame created (gpencil_paint_init) \n");
+ return;
+ }
+ else
+ p->gpf->flag |= GP_FRAME_PAINT;
+
+ /* set 'eraser' for this stroke if using eraser */
+ p->paintmode= paintmode;
+ if (p->paintmode == GP_PAINTMODE_ERASER)
+ p->gpd->sbuffer_sflag |= GP_STROKE_ERASER;
+
+ /* 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:
+ {
+ RegionView3D *rv3d= p->ar->regiondata;
+ float rvec[3];
+
+ gp_get_3d_reference(p, rvec);
+ initgrabz(rv3d, rvec[0], rvec[1], rvec[2]);
+
+ p->gpd->sbuffer_sflag |= GP_STROKE_3DSPACE;
+ }
+ break;
+#if 0 // XXX other spacetypes to be restored in due course
+ case SPACE_NODE:
+ {
+ p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE;
+ }
+ break;
+ case SPACE_SEQ:
+ {
+ SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first;
+ int rectx, recty;
+ float zoom, zoomx, zoomy;
+
+ /* set draw 2d-stroke flag */
+ p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE;
+
+ /* calculate zoom factor */
+ zoom= (float)(SEQ_ZOOM_FAC(sseq->zoom));
+ if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
+ zoomx = zoom * ((float)p->scene->r.xasp / (float)p->scene->r.yasp);
+ zoomy = zoom;
+ }
+ else
+ zoomx = zoomy = zoom;
+
+ /* calculate rect size to use to calculate the size of the drawing area
+ * - We use the size of the output image not the size of the ibuf being shown
+ * as it is too messy getting the ibuf (and could be too slow). This should be
+ * a reasonable for most cases anyway.
+ */
+ rectx= (p->scene->r.size * p->scene->r.xsch) / 100;
+ recty= (p->scene->r.size * p->scene->r.ysch) / 100;
+
+ /* set offset and scale values for opertations to use */
+ p->im2d_settings.sizex= (int)(zoomx * rectx);
+ p->im2d_settings.sizey= (int)(zoomy * recty);
+ p->im2d_settings.offsx= (int)((p->sa->winx-p->im2d_settings.sizex)/2 + sseq->xof);
+ p->im2d_settings.offsy= (int)((p->sa->winy-p->im2d_settings.sizey)/2 + sseq->yof);
+ }
+ break;
+#endif
+ case SPACE_IMAGE:
+ {
+ p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE;
+ }
+ break;
+ }
+ }
+}
+
+/* finish off a stroke (clears buffer, but doesn't finish the paint operation) */
+static void gp_paint_strokeend (tGPsdata *p)
+{
+ /* check if doing eraser or not */
+ if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) {
+ /* smooth stroke before transferring? */
+ gp_stroke_smooth(p);
+
+ /* simplify stroke before transferring? */
+ gp_stroke_simplify(p);
+
+ /* transfer stroke to frame */
+ gp_stroke_newfrombuffer(p);
+ }
+
+ /* clean up buffer now */
+ gp_session_validatebuffer(p);
+}
+
+/* finish off stroke painting operation */
+static void gp_paint_cleanup (tGPsdata *p)
+{
+ /* finish off a stroke */
+ gp_paint_strokeend(p);
+
+ /* "unlock" frame */
+ p->gpf->flag &= ~GP_FRAME_PAINT;
+}
+
+/* ------------------------------- */
+
+
+static int gpencil_draw_init (bContext *C, wmOperator *op)
+{
+ tGPsdata *p;
+ int paintmode= RNA_enum_get(op->ptr, "mode");
+
+ /* check context */
+ p= op->customdata= gp_session_initpaint(C);
+ if ((p == NULL) || (p->status == GP_STATUS_ERROR)) {
+ /* something wasn't set correctly in context */
+ gp_session_cleanup(p);
+ return 0;
+ }
+
+ /* init painting data */
+ gp_paint_initstroke(p, paintmode);
+ if (p->status == GP_STATUS_ERROR) {
+ gp_session_cleanup(p);
+ return 0;
+ }
+
+ /* radius for eraser circle is defined in userprefs now */
+ p->radius= U.gp_eraser;
+
+ /* everything is now setup ok */
+ return 1;
+}
+
+/* ------------------------------- */
+
+static void gpencil_draw_exit (bContext *C, wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ /* clear edit flags */
+ G.f &= ~G_GREASEPENCIL;
+
+ /* restore cursor to indicate end of drawing */
+ WM_cursor_restore(CTX_wm_window(C));
+
+ /* check size of buffer before cleanup, to determine if anything happened here */
+ if (p->paintmode == GP_PAINTMODE_ERASER) {
+ // TODO clear radial cursor thing
+ // XXX draw_sel_circle(NULL, p.mvalo, 0, p.radius, 0);
+ }
+
+ /* cleanup */
+ gp_paint_cleanup(p);
+ gp_session_cleanup(p);
+
+ /* finally, free the temp data */
+ MEM_freeN(p);
+ op->customdata= NULL;
+}
+
+static int gpencil_draw_cancel (bContext *C, wmOperator *op)
+{
+ /* this is just a wrapper around exit() */
+ gpencil_draw_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+/* ------------------------------- */
+
+/* create a new stroke point at the point indicated by the painting context */
+static void gpencil_draw_apply (bContext *C, wmOperator *op, tGPsdata *p)
+{
+ /* handle drawing/erasing -> test for erasing first */
+ if (p->paintmode == GP_PAINTMODE_ERASER) {
+ /* do 'live' erasing now */
+ gp_stroke_doeraser(p);
+
+ /* store used values */
+ p->mvalo[0]= p->mval[0];
+ p->mvalo[1]= p->mval[1];
+ p->opressure= p->pressure;
+ }
+ /* only add current point to buffer if mouse moved (even though we got an event, it might be just noise) */
+ else if (gp_stroke_filtermval(p, p->mval, p->mvalo)) {
+ /* try to add point */
+ short ok= gp_stroke_addpoint(p, p->mval, p->pressure);
+
+ /* handle errors while adding point */
+ if ((ok == GP_STROKEADD_FULL) || (ok == GP_STROKEADD_OVERFLOW)) {
+ /* finish off old stroke */
+ gp_paint_strokeend(p);
+
+ /* start a new stroke, starting from previous point */
+ gp_stroke_addpoint(p, p->mvalo, p->opressure);
+ ok= gp_stroke_addpoint(p, p->mval, p->pressure);
+ }
+ else if (ok == GP_STROKEADD_INVALID) {
+ /* the painting operation cannot continue... */
+ BKE_report(op->reports, RPT_ERROR, "Cannot paint stroke");
+ p->status = GP_STATUS_ERROR;
+
+ if (G.f & G_DEBUG)
+ printf("Error: Grease-Pencil Paint - Add Point Invalid \n");
+ return;
+ }
+
+ /* store used values */
+ p->mvalo[0]= p->mval[0];
+ p->mvalo[1]= p->mval[1];
+ p->opressure= p->pressure;
+ }
+}
+
+/* handle draw event */
+static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *event)
+{
+ tGPsdata *p= op->customdata;
+ ARegion *ar= p->ar;
+ //PointerRNA itemptr;
+ //float mousef[2];
+ int tablet=0;
+
+ /* convert from window-space to area-space mouse coordintes */
+ // NOTE: float to ints conversions, +1 factor is probably used to ensure a bit more accurate rounding...
+ p->mval[0]= event->x - ar->winrct.xmin + 1;
+ p->mval[1]= event->y - ar->winrct.ymin + 1;
+
+ /* handle pressure sensitivity (which is supplied by tablets) */
+ if (event->custom == EVT_DATA_TABLET) {
+ wmTabletData *wmtab= event->customdata;
+
+ 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;
+
+ /* special exception for start of strokes (i.e. maybe for just a dot) */
+ if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
+ p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
+
+ p->mvalo[0]= p->mval[0];
+ p->mvalo[1]= p->mval[1];
+ p->opressure= p->pressure;
+
+ /* special exception here for too high pressure values on first touch in
+ * windows for some tablets, then we just skip first touch ..
+ */
+ if (tablet && (p->pressure >= 0.99f))
+ return;
+ }
+
+#if 0 // NOTE: disabled for now, since creating this data is currently useless anyways (and slows things down)
+ /* 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);
+#endif
+
+ /* apply the current latest drawing point */
+ gpencil_draw_apply(C, op, p);
+
+ /* force refresh */
+ ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
+}
+
+/* ------------------------------- */
+
+/* operator 'redo' (i.e. after changing some properties) */
+static int gpencil_draw_exec (bContext *C, wmOperator *op)
+{
+ tGPsdata *p = NULL;
+
+ //printf("GPencil - Starting Re-Drawing \n");
+
+ /* try to initialise context data needed while drawing */
+ if (!gpencil_draw_init(C, op)) {
+ if (op->customdata) MEM_freeN(op->customdata);
+ //printf("\tGP - no valid data \n");
+ return OPERATOR_CANCELLED;
+ }
+ else
+ p= op->customdata;
+
+ //printf("\tGP - Start redrawing stroke \n");
+
+ /* loop over the stroke RNA elements recorded (i.e. progress of mouse movement),
+ * setting the relevant values in context at each step, then applying
+ */
+ RNA_BEGIN(op->ptr, itemptr, "stroke")
+ {
+ float mousef[2];
+
+ //printf("\t\tGP - stroke elem \n");
+
+ /* get relevant data for this point from stroke */
+ RNA_float_get_array(&itemptr, "mouse", mousef);
+ p->mval[0] = (short)mousef[0];
+ p->mval[1] = (short)mousef[1];
+ p->pressure= RNA_float_get(&itemptr, "pressure");
+
+ /* if first run, set previous data too */
+ if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
+ p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
+
+ p->mvalo[0]= p->mval[0];
+ p->mvalo[1]= p->mval[1];
+ p->opressure= p->pressure;
+ }
+
+ /* apply this data as necessary now (as per usual) */
+ gpencil_draw_apply(C, op, p);
+ }
+ RNA_END;
+
+ //printf("\tGP - done \n");
+
+ /* cleanup */
+ gpencil_draw_exit(C, op);
+
+ /* refreshes */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+/* ------------------------------- */
+
+/* start of interactive drawing part of operator */
+static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
+{
+ tGPsdata *p = NULL;
+ wmWindow *win= CTX_wm_window(C);
+
+ //printf("GPencil - Starting Drawing \n");
+
+ /* try to initialise context data needed while drawing */
+ if (!gpencil_draw_init(C, op)) {
+ if (op->customdata) MEM_freeN(op->customdata);
+ printf("\tGP - no valid data \n");
+ return OPERATOR_CANCELLED;
+ }
+ else
+ p= op->customdata;
+
+ // TODO: set any additional settings that we can take from the events?
+ // TODO? if tablet is erasing, force eraser to be on?
+
+ /* 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..
+ }
+
+ /* set cursor */
+ if (p->paintmode == GP_PAINTMODE_ERASER)
+ WM_cursor_modal(win, BC_CROSSCURSOR); // XXX need a better cursor
+ else
+ WM_cursor_modal(win, BC_PAINTBRUSHCURSOR);
+
+ /* special hack: if there was an initial event, then we were invoked via a hotkey, and
+ * painting should start immediately. Otherwise, this was called from a toolbar, in which
+ * case we should wait for the mouse to be clicked.
+ */
+ if (event->type) {
+ /* hotkey invoked - start drawing */
+ //printf("\tGP - set first spot\n");
+ p->status= GP_STATUS_PAINTING;
+
+ /* handle the initial drawing - i.e. for just doing a simple dot */
+ gpencil_draw_apply_event(C, op, event);
+ }
+ else {
+ /* toolbar invoked - don't start drawing yet... */
+ //printf("\tGP - hotkey invoked... waiting for click-drag\n");
+ }
+
+ /* add a modal handler for this operator, so that we can then draw continuous strokes */
+ WM_event_add_modal_handler(C, op);
+ return OPERATOR_RUNNING_MODAL;
+}
+
+/* events handling during interactive drawing part of operator */
+static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
+{
+ tGPsdata *p= op->customdata;
+
+ //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
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ /* not painting, so start stroke (this should be mouse-button down) */
+ //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:
+ /* 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 */
+ if (p->status == GP_STATUS_ERROR) {
+ //printf("\t\t\tGP - error done! \n");
+ gpencil_draw_exit(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ }
+ break;
+
+ default:
+ //printf("\t\tGP unknown event - %d \n", event->type);
+ break;
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+/* ------------------------------- */
+
+static EnumPropertyItem prop_gpencil_drawmodes[] = {
+ {GP_PAINTMODE_DRAW, "DRAW", 0, "Draw Freehand", ""},
+ {GP_PAINTMODE_DRAW_STRAIGHT, "DRAW_STRAIGHT", 0, "Draw Straight Lines", ""},
+ {GP_PAINTMODE_ERASER, "ERASER", 0, "Eraser", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+void GPENCIL_OT_draw (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Grease Pencil Draw";
+ ot->idname= "GPENCIL_OT_draw";
+ ot->description= "Make annotations on the active data.";
+
+ /* api callbacks */
+ ot->exec= gpencil_draw_exec;
+ ot->invoke= gpencil_draw_invoke;
+ ot->modal= gpencil_draw_modal;
+ ot->cancel= gpencil_draw_cancel;
+ ot->poll= gpencil_draw_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* settings for drawing */
+ RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements.");
+ // xxx the stuff below is used only for redo operator, but is not really working
+ RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
+}
diff --git a/source/blender/editors/include/BIF_gl.h b/source/blender/editors/include/BIF_gl.h
index c1b3b056d62..3318d869378 100644
--- a/source/blender/editors/include/BIF_gl.h
+++ b/source/blender/editors/include/BIF_gl.h
@@ -31,30 +31,11 @@
#ifndef BIF_GL_H
#define BIF_GL_H
- /* Although not really a great idea to copy these defines
- * from Windows' winnt.h, this lets us use GL without including
- * windows.h everywhere (or BLI_winstuff.h) which is a good thing.
- */
-#ifdef WIN32
-#ifndef APIENTRY
-#define APIENTRY __stdcall
-#endif
-
-#ifndef CALLBACK
-#define CALLBACK __stdcall
-#endif
-
-#ifndef WINGDIAPI
-#define WINGDIAPI __declspec(dllimport)
-#endif
-#endif
-
#include "GL/glew.h"
/*
* these should be phased out. cpack should be replaced in
- * code with calls to glColor3ub, lrectwrite probably should
- * change to a function. - zr
+ * code with calls to glColor3ub. - zr
*/
/*
*
@@ -67,11 +48,5 @@
#define glMultMatrixf(x) glMultMatrixf( (float *)(x))
#define glLoadMatrixf(x) glLoadMatrixf( (float *)(x))
-#define lrectwrite(a, b, c, d, rect) {glRasterPos2i(a, b);glDrawPixels((c)-(a)+1, (d)-(b)+1, GL_RGBA, GL_UNSIGNED_BYTE, rect);}
-
-/* glStippleDefines, defined in glutil.c */
-extern GLubyte stipple_halftone[128];
-extern GLubyte stipple_quarttone[128];
-
#endif /* #ifdef BIF_GL_H */
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index 5c611365a7e..deee3e3c8b4 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -45,6 +45,9 @@ void sdrawXORline4(int nr, int x0, int y0, int x1, int y1);
void fdrawXORellipse(float xofs, float yofs, float hw, float hh);
void fdrawXORcirc(float xofs, float yofs, float rad);
+/* glStipple defines */
+extern unsigned char stipple_halftone[128];
+extern unsigned char stipple_quarttone[128];
/**
* Draw a lined (non-looping) arc with the given
@@ -129,10 +132,11 @@ void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, int row_w, int
* is expected to be in RGBA byte or float format, and the
* modelview and projection matrices are assumed to define a
* 1-to-1 mapping to screen space.
+ * @param gamma_correct Optionally gamma correct float sources to sRGB for display
*/
/* only for float rects, converts to 32 bits and draws */
-void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf);
+void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf, int gamma_correct);
void glaDrawPixelsTex (float x, float y, int img_w, int img_h, int format, void *rect);
@@ -202,7 +206,6 @@ int is_a_really_crappy_intel_card(void);
void set_inverted_drawing(int enable);
void setlinestyle(int nr);
-
/* own working polygon offset */
void bglPolygonOffset(float viewdist, float dist);
diff --git a/source/blender/editors/include/BIF_transform.h b/source/blender/editors/include/BIF_transform.h
deleted file mode 100644
index e02202eb8e0..00000000000
--- a/source/blender/editors/include/BIF_transform.h
+++ /dev/null
@@ -1,165 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 BIF_TRANSFORM_H
-#define BIF_TRANSFORM_H
-
-/* ******************* Registration Function ********************** */
-
-struct wmWindowManager;
-struct ListBase;
-struct wmEvent;
-struct bContext;
-struct Object;
-struct uiLayout;
-
-void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *keymap, int spaceid);
-void transform_operatortypes(void);
-
-/* ******************** Macros & Prototypes *********************** */
-
-/* MODE AND NUMINPUT FLAGS */
-enum {
- TFM_INIT = -1,
- TFM_DUMMY,
- TFM_TRANSLATION,
- TFM_ROTATION,
- TFM_RESIZE,
- TFM_TOSPHERE,
- TFM_SHEAR,
- TFM_WARP,
- TFM_SHRINKFATTEN,
- TFM_TILT,
- TFM_TRACKBALL,
- TFM_PUSHPULL,
- TFM_CREASE,
- TFM_MIRROR,
- TFM_BONESIZE,
- TFM_BONE_ENVELOPE,
- TFM_CURVE_SHRINKFATTEN,
- TFM_BONE_ROLL,
- TFM_TIME_TRANSLATE,
- TFM_TIME_SLIDE,
- TFM_TIME_SCALE,
- TFM_TIME_EXTEND,
- TFM_BAKE_TIME,
- TFM_BEVEL,
- TFM_BWEIGHT,
- TFM_ALIGN
-} TfmMode;
-
-/* TRANSFORM CONTEXTS */
-#define CTX_NONE 0
-#define CTX_TEXTURE 1
-#define CTX_EDGE 2
-#define CTX_NO_PET 4
-#define CTX_TWEAK 8
-#define CTX_NO_MIRROR 16
-#define CTX_AUTOCONFIRM 32
-#define CTX_BMESH 64
-#define CTX_NDOF 128
-
-/* Standalone call to get the transformation center corresponding to the current situation
- * returns 1 if successful, 0 otherwise (usually means there's no selection)
- * (if 0 is returns, *vec is unmodified)
- * */
-int calculateTransformCenter(struct bContext *C, struct wmEvent *event, int centerMode, float *vec);
-
-struct TransInfo;
-struct ScrArea;
-struct Base;
-struct Scene;
-struct Object;
-
-void BIF_setSingleAxisConstraint(float vec[3], char *text);
-void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text);
-void BIF_setLocalAxisConstraint(char axis, char *text);
-void BIF_setLocalLockConstraint(char axis, char *text);
-
-int BIF_snappingSupported(struct Object *obedit);
-
-struct TransformOrientation;
-struct bContext;
-
-void BIF_clearTransformOrientation(struct bContext *C);
-void BIF_removeTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
-void BIF_manageTransformOrientation(struct bContext *C, int confirm, int set);
-int BIF_menuselectTransformOrientation(void);
-void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
-void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
-
-void BIF_menuTransformOrientation(struct bContext *C, struct uiLayout *layout, void *arg);
-char * BIF_menustringTransformOrientation(const struct bContext *C, char *title); /* the returned value was allocated and needs to be freed after use */
-int BIF_countTransformOrientation(const struct bContext *C);
-
-void BIF_getPropCenter(float *center);
-
-void BIF_TransformSetUndo(char *str);
-
-void BIF_selectOrientation(void);
-
-/* view3d manipulators */
-void initManipulator(int mode);
-void ManipulatorTransform();
-
-//int BIF_do_manipulator(struct ScrArea *sa);
-//void BIF_draw_manipulator(struct ScrArea *sa);
-
-/* Snapping */
-
-
-typedef struct DepthPeel
-{
- struct DepthPeel *next, *prev;
-
- float depth;
- float p[3];
- float no[3];
- struct Object *ob;
- int flag;
-} DepthPeel;
-
-struct ListBase;
-
-typedef enum SnapMode
-{
- SNAP_ALL = 0,
- SNAP_NOT_SELECTED = 1,
- SNAP_NOT_OBEDIT = 2
-} SnapMode;
-
-#define SNAP_MIN_DISTANCE 30
-
-int peelObjectsTransForm(struct TransInfo *t, struct ListBase *depth_peels, short mval[2]);
-int peelObjectsContext(struct bContext *C, struct ListBase *depth_peels, short mval[2]);
-int snapObjectsTransform(struct TransInfo *t, short mval[2], int *dist, float *loc, float *no, SnapMode mode);
-int snapObjectsContext(struct bContext *C, short mval[2], int *dist, float *loc, float *no, SnapMode mode);
-
-#endif
-
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index efc0a0b9a57..7e7aba85363 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -30,18 +30,23 @@
#define ED_ANIM_API_H
struct ID;
-struct Scene;
struct ListBase;
+struct AnimData;
+
struct bContext;
struct wmWindowManager;
struct ScrArea;
struct ARegion;
struct View2D;
-struct gla2DDrawInfo;
+
+struct Scene;
struct Object;
+
struct bActionGroup;
struct FCurve;
-struct IpoCurve; // xxx
+struct FModifier;
+
+struct uiBlock;
/* ************************************************ */
/* ANIMATION CHANNEL FILTERING */
@@ -75,8 +80,9 @@ typedef enum eAnimCont_Types {
ANIMCONT_SHAPEKEY, /* shapekey (Key) */
ANIMCONT_GPENCIL, /* grease pencil (screen) */
ANIMCONT_DOPESHEET, /* dopesheet (bDopesheet) */
- ANIMCONT_FCURVES, /* animation F-Curves (bDopesheet) */ // XXX
+ ANIMCONT_FCURVES, /* animation F-Curves (bDopesheet) */
ANIMCONT_DRIVERS, /* drivers (bDopesheet) */
+ ANIMCONT_NLA, /* nla (bDopesheet) */
} eAnimCont_Types;
/* --------------- Channels -------------------- */
@@ -87,25 +93,30 @@ typedef enum eAnimCont_Types {
typedef struct bAnimListElem {
struct bAnimListElem *next, *prev;
- void *data; /* source data this elem represents */
- int type; /* one of the ANIMTYPE_* values */
- int flag; /* copy of elem's flags for quick access */
- int index; /* copy of adrcode where applicable */
+ void *data; /* source data this elem represents */
+ int type; /* one of the ANIMTYPE_* values */
+ int flag; /* copy of elem's flags for quick access */
+ int index; /* copy of adrcode where applicable */
- void *key_data; /* motion data - ipo or ipo-curve */
- short datatype; /* type of motion data to expect */
+ void *key_data; /* motion data - mostly F-Curves, but can be other types too */
+ short datatype; /* type of motion data to expect */
- struct ID *id; /* ID block that channel is attached to (may be used */
+ struct ID *id; /* ID block that channel is attached to */
+ struct AnimData *adt; /* source of the animation data attached to ID block (for convenience) */
- void *owner; /* group or channel which acts as this channel's owner */
- short ownertype; /* type of owner */
+ void *owner; /* group or channel which acts as this channel's owner */
+ short ownertype; /* type of owner */
} bAnimListElem;
-/* Some types for easier type-testing */
+/* Some types for easier type-testing
+ * NOTE: need to keep the order of these synchronised with the channels define code
+ * which is used for drawing and handling channel lists for
+ */
// XXX was ACTTYPE_*
typedef enum eAnim_ChannelType {
ANIMTYPE_NONE= 0,
+ ANIMTYPE_ANIMDATA,
ANIMTYPE_SPECIALDATA,
ANIMTYPE_SCENE,
@@ -116,6 +127,7 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_FILLACTD,
ANIMTYPE_FILLDRIVERS,
ANIMTYPE_FILLMATD,
+ ANIMTYPE_FILLPARTD,
ANIMTYPE_DSMAT,
ANIMTYPE_DSLAM,
@@ -123,11 +135,20 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_DSCUR,
ANIMTYPE_DSSKEY,
ANIMTYPE_DSWOR,
+ ANIMTYPE_DSPART,
+ ANIMTYPE_DSMBALL,
+ ANIMTYPE_DSARM,
ANIMTYPE_SHAPEKEY, // XXX probably can become depreceated???
ANIMTYPE_GPDATABLOCK,
ANIMTYPE_GPLAYER,
+
+ ANIMTYPE_NLATRACK,
+ ANIMTYPE_NLAACTION,
+
+ /* always as last item, the total number of channel types... */
+ ANIMTYPE_NUM_TYPES,
} eAnim_ChannelType;
/* types of keyframe data in bAnimListElem */
@@ -135,8 +156,8 @@ typedef enum eAnim_KeyType {
ALE_NONE = 0, /* no keyframe data */
ALE_FCURVE, /* F-Curve */
ALE_GPFRAME, /* Grease Pencil Frames */
+ ALE_NLASTRIP, /* NLA Strips */
- // XXX the following are for summaries... should these be kept?
ALE_SCE, /* Scene summary */
ALE_OB, /* Object summary */
ALE_ACT, /* Action summary */
@@ -156,7 +177,10 @@ typedef enum eAnimFilter_Flags {
ANIMFILTER_CHANNELS = (1<<5), /* make list for interface drawing */
ANIMFILTER_ACTGROUPED = (1<<6), /* belongs to the active actiongroup */
ANIMFILTER_CURVEVISIBLE = (1<<7), /* F-Curve is visible for editing/viewing in Graph Editor */
- ANIMFILTER_ACTIVE = (1<<8), /* channel should be 'active' */ // FIXME: this is only relevant for F-Curves for now
+ ANIMFILTER_ACTIVE = (1<<8), /* channel should be 'active' */
+ ANIMFILTER_ANIMDATA = (1<<9), /* only return the underlying AnimData blocks (not the tracks, etc.) data comes from */
+ ANIMFILTER_NLATRACKS = (1<<10), /* only include NLA-tracks */
+ ANIMFILTER_SELEDIT = (1<<11), /* link editability with selected status */
} eAnimFilter_Flags;
@@ -174,12 +198,16 @@ typedef enum eAnimFilter_Flags {
#define EXPANDED_OBJC(ob) ((ob->nlaflag & OB_ADS_COLLAPSED)==0)
/* 'Sub-object' channels (flags stored in Object block) */
#define FILTER_MAT_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWMATS))
+#define FILTER_PART_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWPARTS))
/* 'Sub-object' channels (flags stored in Data block) */
#define FILTER_SKE_OBJD(key) ((key->flag & KEYBLOCK_DS_EXPAND))
#define FILTER_MAT_OBJD(ma) ((ma->flag & MA_DS_EXPAND))
#define FILTER_LAM_OBJD(la) ((la->flag & LA_DS_EXPAND))
#define FILTER_CAM_OBJD(ca) ((ca->flag & CAM_DS_EXPAND))
#define FILTER_CUR_OBJD(cu) ((cu->flag & CU_DS_EXPAND))
+#define FILTER_PART_OBJD(part) ((part->flag & PART_DS_EXPAND))
+#define FILTER_MBALL_OBJD(mb) ((mb->flag2 & MB_DS_EXPAND))
+#define FILTER_ARM_OBJD(arm) ((arm->flag & ARM_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)
@@ -202,6 +230,10 @@ typedef enum eAnimFilter_Flags {
#define EDITABLE_GPL(gpl) ((gpl->flag & GP_LAYER_LOCKED)==0)
#define SEL_GPL(gpl) ((gpl->flag & GP_LAYER_ACTIVE) || (gpl->flag & GP_LAYER_SELECT))
+/* NLA only */
+#define SEL_NLT(nlt) (nlt->flag & NLATRACK_SELECTED)
+#define EDITABLE_NLT(nlt) ((nlt->flag & NLATRACK_PROTECTED)==0)
+
/* -------------- Channel Defines -------------- */
/* channel heights */
@@ -217,6 +249,22 @@ typedef enum eAnimFilter_Flags {
/* channel toggle-buttons */
#define ACHANNEL_BUTTON_WIDTH 16
+
+/* -------------- NLA Channel Defines -------------- */
+
+/* NLA channel heights */
+#define NLACHANNEL_FIRST -16
+#define NLACHANNEL_HEIGHT 24
+#define NLACHANNEL_HEIGHT_HALF 12
+#define NLACHANNEL_SKIP 2
+#define NLACHANNEL_STEP (NLACHANNEL_HEIGHT + NLACHANNEL_SKIP)
+
+/* channel widths */
+#define NLACHANNEL_NAMEWIDTH 200
+
+/* channel toggle-buttons */
+#define NLACHANNEL_BUTTON_WIDTH 16
+
/* ---------------- API -------------------- */
/* Obtain list of filtered Animation channels to operate on.
@@ -237,25 +285,89 @@ short ANIM_animdata_context_getdata(bAnimContext *ac);
/* ************************************************ */
/* ANIMATION CHANNELS LIST */
-/* anim_channels.c */
-
-/* ------------------------ API -------------------------- */
-
-/* Deselect all animation channels */
-void ANIM_deselect_anim_channels(void *data, short datatype, short test, short sel);
-
-/* Set the 'active' channel of type channel_type, in the given action */
-void ANIM_set_active_channel(void *data, short datatype, int filter, void *channel_data, short channel_type);
+/* anim_channels_*.c */
-/* --------------- Settings and/or Defines -------------- */
+/* ------------------------ Drawing TypeInfo -------------------------- */
/* flag-setting behaviour */
-enum {
+typedef enum eAnimChannels_SetFlag {
ACHANNEL_SETFLAG_CLEAR = 0,
ACHANNEL_SETFLAG_ADD,
ACHANNEL_SETFLAG_TOGGLE
} eAnimChannels_SetFlag;
+/* types of settings for AnimChanels */
+typedef enum eAnimChannel_Settings {
+ 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 */
+} eAnimChannel_Settings;
+
+
+/* Drawing, mouse handling, and flag setting behaviour... */
+typedef struct bAnimChannelType {
+ /* drawing */
+ /* draw backdrop strip for channel */
+ void (*draw_backdrop)(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc);
+ /* get depth of indention (relative to the depth channel is nested at) */
+ short (*get_indent_level)(bAnimContext *ac, bAnimListElem *ale);
+ /* get offset in pixels for the start of the channel (in addition to the indent depth) */
+ short (*get_offset)(bAnimContext *ac, bAnimListElem *ale);
+
+
+ /* get name (for channel lists) */
+ void (*name)(bAnimListElem *ale, char *name);
+ /* get icon (for channel lists) */
+ int (*icon)(bAnimListElem *ale);
+
+ /* settings */
+ /* check if the given setting is valid in the current context */
+ short (*has_setting)(bAnimContext *ac, bAnimListElem *ale, int setting);
+ /* get the flag used for this setting */
+ int (*setting_flag)(int setting, short *neg);
+ /* get the pointer to int/short where data is stored,
+ * with type being sizeof(ptr_data) which should be fine for runtime use...
+ * - assume that setting has been checked to be valid for current context
+ */
+ void *(*setting_ptr)(bAnimListElem *ale, int setting, short *type);
+} bAnimChannelType;
+
+/* ------------------------ Drawing API -------------------------- */
+
+/* Get typeinfo for the given channel */
+bAnimChannelType *ANIM_channel_get_typeinfo(bAnimListElem *ale);
+
+/* Draw the given channel */
+void ANIM_channel_draw(bAnimContext *ac, bAnimListElem *ale, float yminc, float ymaxc);
+/* Draw the widgets for the given channel */
+void ANIM_channel_draw_widgets(bAnimContext *ac, bAnimListElem *ale, struct uiBlock *block, float yminc, float ymaxc);
+
+
+/* ------------------------ Editing API -------------------------- */
+
+/* Check if some setting for a channel is enabled
+ * Returns: 1 = On, 0 = Off, -1 = Invalid
+ *
+ * - setting: eAnimChannel_Settings
+ */
+short ANIM_channel_setting_get(bAnimContext *ac, bAnimListElem *ale, int setting);
+
+/* Change value of some setting for a channel
+ * - setting: eAnimChannel_Settings
+ * - mode: eAnimChannels_SetFlag
+ */
+void ANIM_channel_setting_set(bAnimContext *ac, bAnimListElem *ale, int setting, short mode);
+
+
+/* Deselect all animation channels */
+void ANIM_deselect_anim_channels(void *data, short datatype, short test, short sel);
+
+/* Set the 'active' channel of type channel_type, in the given action */
+void ANIM_set_active_channel(bAnimContext *ac, void *data, short datatype, int filter, void *channel_data, short channel_type);
+
/* ************************************************ */
/* DRAWING API */
/* anim_draw.c */
@@ -283,34 +395,74 @@ void ANIM_draw_cfra(const struct bContext *C, struct View2D *v2d, short flag);
void ANIM_draw_previewrange(const struct bContext *C, struct View2D *v2d);
/* ************************************************* */
+/* F-MODIFIER TOOLS */
+
+struct uiLayout;
+
+/* draw a given F-Modifier for some layout/UI-Block */
+void ANIM_uiTemplate_fmodifier_draw(struct uiLayout *layout, struct ID *id, ListBase *modifiers, struct FModifier *fcm);
+
+/* ************************************************* */
/* ASSORTED TOOLS */
/* ------------ Animation F-Curves <-> Icons/Names Mapping ------------ */
/* anim_ipo_utils.c */
+/* Get icon for type of setting F-Curve is for */
+// XXX include this in the getname() method via RNA?
int geticon_anim_blocktype(short blocktype);
+/* Get name for channel-list displays for F-Curve */
void getname_anim_fcurve(char *name, struct ID *id, struct FCurve *fcu);
-
+/* Automatically determine a color for the nth F-Curve */
void ipo_rainbow(int cur, int tot, float *out);
-
/* ------------- NLA-Mapping ----------------------- */
/* anim_draw.c */
-/* Obtain the Object providing NLA-scaling for the given channel if applicable */
-struct Object *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale);
+/* Obtain the AnimData block providing NLA-scaling for the given channel if applicable */
+struct AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale);
+
+/* Apply/Unapply NLA mapping to all keyframes in the nominated F-Curve */
+void ANIM_nla_mapping_apply_fcurve(struct AnimData *adt, struct FCurve *fcu, short restore, short only_keys);
+
+/* ..... */
-/* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-scaled' time */
-void ANIM_nla_mapping_draw(struct gla2DDrawInfo *di, struct Object *ob, short restore);
+/* Perform auto-blending/extend refreshes after some operations */
+// NOTE: defined in space_nla/nla_edit.c, not in animation/
+void ED_nla_postop_refresh(bAnimContext *ac);
-/* Apply/Unapply NLA mapping to all keyframes in the nominated IPO block */
-void ANIM_nla_mapping_apply_fcurve(struct Object *ob, struct FCurve *fcu, short restore, short only_keys);
+/* ------------- Utility macros ----------------------- */
-/* ------------- xxx macros ----------------------- */
+/* provide access to Keyframe Type info in BezTriple
+ * NOTE: this is so that we can change it from being stored in 'hide'
+ */
+#define BEZKEYTYPE(bezt) ((bezt)->hide)
-#define BEZSELECTED(bezt) ((bezt->f2 & SELECT) || (bezt->f1 & SELECT) || (bezt->f3 & SELECT))
+/* set/clear/toggle macro
+ * - channel - channel with a 'flag' member that we're setting
+ * - smode - 0=clear, 1=set, 2=toggle
+ * - sflag - bitflag to set
+ */
+#define ACHANNEL_SET_FLAG(channel, smode, sflag) \
+ { \
+ if (smode == ACHANNEL_SETFLAG_TOGGLE) (channel)->flag ^= (sflag); \
+ else if (smode == ACHANNEL_SETFLAG_ADD) (channel)->flag |= (sflag); \
+ else (channel)->flag &= ~(sflag); \
+ }
+
+/* set/clear/toggle macro, where the flag is negative
+ * - channel - channel with a 'flag' member that we're setting
+ * - smode - 0=clear, 1=set, 2=toggle
+ * - sflag - bitflag to set
+ */
+#define ACHANNEL_SET_FLAG_NEG(channel, smode, sflag) \
+ { \
+ if (smode == ACHANNEL_SETFLAG_TOGGLE) (channel)->flag ^= (sflag); \
+ else if (smode == ACHANNEL_SETFLAG_ADD) (channel)->flag &= ~(sflag); \
+ else (channel)->flag |= (sflag); \
+ }
/* --------- anim_deps.c, animation updates -------- */
@@ -324,18 +476,6 @@ void ED_anim_object_flush_update(const struct bContext *C, struct Object *ob);
void ANIM_action_to_pose_sync(struct Object *ob);
void ANIM_pose_to_action_sync(struct Object *ob, struct ScrArea *sa);
-
-/* what types of animation data was changed (for sending notifiers from animation tools) */
-enum {
- ANIM_CHANGED_BOTH= 0,
- ANIM_CHANGED_KEYFRAMES_VALUES,
- ANIM_CHANGED_KEYFRAMES_SELECT,
- ANIM_CHANGED_CHANNELS
-} eAnimData_Changed;
-
-/* Send notifiers on behalf of animation editing tools, based on various context info */
-void ANIM_animdata_send_notifiers(struct bContext *C, bAnimContext *ac, short data_changed);
-
/* ************************************************* */
/* OPERATORS */
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 0f2ac6e3027..8bdfe41ef80 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -34,11 +34,13 @@ struct Base;
struct Bone;
struct bArmature;
struct bPoseChannel;
+struct wmOperator;
struct wmWindowManager;
struct ListBase;
struct View3D;
struct ViewContext;
struct RegionView3D;
+struct SK_Sketch;
typedef struct EditBone
{
@@ -93,27 +95,38 @@ void ED_operatortypes_armature(void);
void ED_keymap_armature(struct wmWindowManager *wm);
/* editarmature.c */
-void ED_armature_from_edit(struct Scene *scene, struct Object *obedit);
+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_edit_remake(struct Object *obedit);
+void ED_armature_deselectall(struct Object *obedit, int toggle, int doundo);
+
int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer,
short hits, short extend);
void 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]);
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 add_primitive_bone(struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d);
void transform_armature_mirror_update(struct Object *obedit);
void clear_armature(struct Scene *scene, struct Object *ob, char mode);
-void create_vgroups_from_armature(struct Scene *scene, struct Object *ob, struct Object *par);
void docenter_armature (struct Scene *scene, struct View3D *v3d, struct Object *ob, int centermode);
+void ED_armature_apply_transform(struct Object *ob, float mat[4][4]);
+
+#define ARM_GROUPS_NAME 1
+#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);
+
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 armature_bone_rename(struct Object *ob, char *oldnamep, char *newnamep);
+void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep);
void undo_push_armature(struct bContext *C, char *name);
@@ -122,27 +135,27 @@ 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, int doundo);
+void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob);
/* sketch */
int ED_operator_sketch_mode_active_stroke(struct bContext *C);
int ED_operator_sketch_full_mode(struct bContext *C);
-int ED_operator_sketch_mode(struct bContext *C);
+int ED_operator_sketch_mode(const struct bContext *C);
-void BIF_freeSketch(struct bContext *C);
void BIF_convertSketch(struct bContext *C);
void BIF_deleteSketch(struct bContext *C);
void BIF_selectAllSketch(struct bContext *C, int mode); /* -1: deselect, 0: select, 1: toggle */
-void BIF_makeListTemplates(struct bContext *C);
-char *BIF_listTemplates(struct bContext *C);
-int BIF_currentTemplate(struct bContext *C);
+void BIF_makeListTemplates(const struct bContext *C);
+char *BIF_listTemplates(const struct bContext *C);
+int BIF_currentTemplate(const struct bContext *C);
void BIF_freeTemplates(struct bContext *C);
void BIF_setTemplate(struct bContext *C, int index);
-int BIF_nbJointsTemplate(struct bContext *C);
-char * BIF_nameBoneTemplate(struct bContext *C);
+int BIF_nbJointsTemplate(const struct bContext *C);
+char * BIF_nameBoneTemplate(const struct bContext *C);
-void BDR_drawSketch(struct bContext *vc);
+void BDR_drawSketch(const struct bContext *vc);
int BDR_drawSketchNames(struct ViewContext *vc);
#endif /* ED_ARMATURE_H */
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 2cebc6a572a..4149c6a9cca 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -35,6 +35,7 @@ struct Object;
struct Scene;
struct Text;
struct View3D;
+struct wmOperator;
struct wmWindowManager;
/* curve_ops.c */
@@ -55,6 +56,8 @@ struct Nurb *add_nurbs_primitive(struct bContext *C, int type, int newname);
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 make_editText (struct Object *obedit);
diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h
index 5d24b93418b..993cbceae18 100644
--- a/source/blender/editors/include/ED_datafiles.h
+++ b/source/blender/editors/include/ED_datafiles.h
@@ -40,8 +40,8 @@ extern char datatoc_blenderbuttons[];
extern int datatoc_prvicons_size;
extern char datatoc_prvicons[];
-extern int datatoc_splash_jpg_size;
-extern char datatoc_splash_jpg[];
+extern int datatoc_splash_png_size;
+extern char datatoc_splash_png[];
extern int datatoc_Bfont_size;
extern char datatoc_Bfont[];
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index 34aefa91225..57ab6a5f8f6 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -29,34 +29,8 @@
#define ED_FILES_H
struct SpaceFile;
-
-#define FILE_SHORTDISPLAY 1
-#define FILE_LONGDISPLAY 2
-#define FILE_IMGDISPLAY 3
-
-typedef struct FileSelectParams {
- char title[24]; /* title, also used for the text of the execute button */
- char dir[240]; /* directory */
- char file[80]; /* file */
-
- short flag; /* settings for filter, hiding files and display mode */
- short sort; /* sort order */
- short display; /* display mode flag */
- short filter; /* filter when (flags & FILE_FILTER) is true */
-
- /* XXX - temporary, better move to filelist */
- short active_bookmark;
- int active_file;
- int selstate;
-
- /* XXX --- still unused -- */
- short f_fp; /* show font preview */
- char fp_str[8]; /* string to use for font preview */
-
- char *pupmenu; /* allows menu for save options - result stored in menup */
- short menu; /* currently selected option in pupmenu */
- /* XXX --- end unused -- */
-} FileSelectParams;
+struct ARegion;
+struct FileSelectParams;
#define FILE_LAYOUT_HOR 1
#define FILE_LAYOUT_VER 2
@@ -90,13 +64,14 @@ typedef struct FileLayout
short width;
short height;
short flag;
+ short dirty;
+ short textheight;
float column_widths[MAX_FILE_COLUMN];
} FileLayout;
-FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile);
+struct FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile);
-short ED_fileselect_set_params(struct SpaceFile *sfile, const char *title, const char *path,
- short flag, short display, short filter, short sort);
+short ED_fileselect_set_params(struct SpaceFile *sfile);
void ED_fileselect_reset_params(struct SpaceFile *sfile);
@@ -106,6 +81,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar);
FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar);
+int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar);
int ED_fileselect_layout_offset(FileLayout* layout, int x, int y);
void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, short *x, short *y);
diff --git a/source/blender/editors/include/ED_fluidsim.h b/source/blender/editors/include/ED_fluidsim.h
index 586f16f42aa..2859ec897bf 100644
--- a/source/blender/editors/include/ED_fluidsim.h
+++ b/source/blender/editors/include/ED_fluidsim.h
@@ -46,6 +46,8 @@ void fluidsimSettingsFree(struct FluidsimSettings* sb);
/* duplicate internal data */
struct FluidsimSettings* fluidsimSettingsCopy(struct FluidsimSettings* sb);
+/* memory estimate */
+void fluidsimEstimateMemory(struct Object *ob, struct FluidsimSettings *fs, char *value);
#endif /* ED_FLUIDSIM_H */
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index ad8124c89d7..388da9a2acc 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -38,38 +38,32 @@ struct SpaceSeq;
struct bGPdata;
struct bGPDlayer;
struct bGPDframe;
-struct bGPdata;
-struct uiBlock;
+struct PointerRNA;
+struct Panel;
struct ImBuf;
+struct wmWindowManager;
+/* ------------- Grease-Pencil Helpers ---------------- */
-/* ------------- Grease-Pencil Helpers -------------- */
-
-/* Temporary 'Stroke Point' data */
+/* Temporary 'Stroke Point' data
+ *
+ * Used as part of the 'stroke cache' used during drawing of new strokes
+ */
typedef struct tGPspoint {
short x, y; /* x and y coordinates of cursor (in relative to area) */
float pressure; /* pressure of tablet at this point */
} tGPspoint;
-/* ------------ Grease-Pencil Depreceated Stuff ------------------ */
+/* ----------- Grease Pencil Tools/Context ------------- */
-struct bGPdata *gpencil_data_getactive(struct ScrArea *sa);
-short gpencil_data_setactive(struct ScrArea *sa, struct bGPdata *gpd);
-struct ScrArea *gpencil_data_findowner(struct bGPdata *gpd);
+struct bGPdata **gpencil_data_get_pointers(struct bContext *C, struct PointerRNA *ptr);
+struct bGPdata *gpencil_data_get_active(struct bContext *C);
-/* ------------ Grease-Pencil Editing API ------------------ */
+/* ----------- Grease Pencil Operators ----------------- */
-void gpencil_delete_actframe(struct bGPdata *gpd, int cfra);
-void gpencil_delete_laststroke(struct bGPdata *gpd, int cfra);
-
-void gpencil_delete_operation(int cfra, short mode);
-void gpencil_delete_menu(void);
-
-void gpencil_convert_operation(short mode);
-void gpencil_convert_menu(void);
-
-short gpencil_do_paint(struct bContext *C);
+void ED_keymap_gpencil(struct wmWindowManager *wm);
+void ED_operatortypes_gpencil(void);
/* ------------ Grease-Pencil Drawing API ------------------ */
/* drawgpencil.c */
@@ -79,5 +73,7 @@ void draw_gpencil_2dview(struct bContext *C, short onlyv2d);
void draw_gpencil_3dview(struct bContext *C, short only3d);
void draw_gpencil_oglrender(struct bContext *C);
+void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
+
#endif /* ED_GPENCIL_H */
diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index 566105109b2..a4263f7bd77 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -53,9 +53,6 @@ int ED_space_image_show_paint(struct SpaceImage *sima);
int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
int ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit);
-void ED_image_uiblock_panel(const struct bContext *C, struct uiBlock *block, struct Image **ima_pp,
- struct ImageUser *iuser, short redraw, short imagechanged);
-
/* image_render.c, export for screen_ops.c, render operator */
void ED_space_image_output(struct bContext *C);
diff --git a/source/gameengine/Expressions/KX_Python_dynamic.h b/source/blender/editors/include/ED_info.h
index eb435bdf1c3..d09e174d71d 100644
--- a/source/gameengine/Expressions/KX_Python_dynamic.h
+++ b/source/blender/editors/include/ED_info.h
@@ -1,5 +1,5 @@
/**
- * $Id$
+ * $Id:
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -17,20 +17,16 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.
+ * The Original Code is Copyright (C) 2009, Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef KX_PYTHON_H
-#define KX_PYTHON_H
-//#define USE_DL_EXPORT
-#include "Python.h"
+#ifndef ED_INFO_H
+#define ED_INFO_H
-#endif // KX_PYTHON_H
+/* info_stats.c */
+void ED_info_stats_clear(struct Scene *scene);
+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 e104bce90f6..51d7c664fba 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -17,12 +17,12 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * The Original Code is Copyright (C) (C) 2009 Blender Foundation, Joshua Leung
* All rights reserved.
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Joshua Leung (full recode)
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -30,22 +30,34 @@
#ifndef ED_KEYFRAMES_DRAW_H
#define ED_KEYFRAMES_DRAW_H
+struct AnimData;
struct BezTriple;
struct FCurve;
-struct gla2DDrawInfo;
+struct bDopeSheet;
struct bAction;
struct bActionGroup;
struct Object;
struct ListBase;
struct bGPDlayer;
struct Scene;
+struct View2D;
+struct DLRBT_Tree;
/* ****************************** Base Structs ****************************** */
/* Keyframe Column Struct */
typedef struct ActKeyColumn {
+ /* ListBase linkage */
struct ActKeyColumn *next, *prev;
- short sel, handle_type;
+
+ /* sorting-tree linkage */
+ struct ActKeyColumn *left, *right; /* 'children' of this node, less than and greater than it (respectively) */
+ struct ActKeyColumn *parent; /* parent of this node in the tree */
+ char tree_col; /* DLRB_BLACK or DLRB_RED */
+
+ /* keyframe info */
+ char key_type; /* eBezTripe_KeyframeType */
+ short sel;
float cfra;
/* only while drawing - used to determine if long-keyframe needs to be drawn */
@@ -55,8 +67,17 @@ typedef struct ActKeyColumn {
/* 'Long Keyframe' Struct */
typedef struct ActKeyBlock {
+ /* ListBase linkage */
struct ActKeyBlock *next, *prev;
- short sel, handle_type;
+
+ /* sorting-tree linkage */
+ struct ActKeyBlock *left, *right; /* 'children' of this node, less than and greater than it (respectively) */
+ struct ActKeyBlock *parent; /* parent of this node in the tree */
+ char tree_col; /* DLRB_BLACK or DLRB_RED */
+
+ /* key-block info */
+ char sel;
+ short handle_type;
float val;
float start, end;
@@ -65,34 +86,42 @@ typedef struct ActKeyBlock {
short totcurve;
} ActKeyBlock;
+/* *********************** Keyframe Drawing ****************************** */
-/* Inclusion-Range Limiting Struct (optional) */
-typedef struct ActKeysInc {
- struct bDopeSheet *ads; /* dopesheet data (for dopesheet mode) */
- struct Object *ob; /* owner object for NLA-scaling info (if Object channels, is just Object) */
- short actmode; /* mode of the Action Editor (-1 is for NLA) */
-
- float start, end; /* frames (global-time) to only consider keys between */ // XXX not used anymore!
-} ActKeysInc;
+/* options for keyframe shape drawing */
+typedef enum eKeyframeShapeDrawOpts {
+ /* only the border */
+ KEYFRAME_SHAPE_FRAME = 0,
+ /* only the inside filling */
+ KEYFRAME_SHAPE_INSIDE,
+ /* the whole thing */
+ KEYFRAME_SHAPE_BOTH
+} 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);
/* ******************************* Methods ****************************** */
/* Channel Drawing */
-void draw_fcurve_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct FCurve *fcu, float ypos);
-void draw_agroup_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct bActionGroup *agrp, float ypos);
-void draw_action_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct bAction *act, float ypos);
-void draw_object_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct Object *ob, float ypos);
-void draw_scene_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct Scene *sce, float ypos);
-void draw_gpl_channel(struct gla2DDrawInfo *di, ActKeysInc *aki, struct bGPDlayer *gpl, float ypos);
+void draw_fcurve_channel(struct View2D *v2d, struct AnimData *adt, struct FCurve *fcu, float ypos);
+void draw_agroup_channel(struct View2D *v2d, struct AnimData *adt, struct bActionGroup *agrp, float ypos);
+void draw_action_channel(struct View2D *v2d, struct AnimData *adt, struct bAction *act, float ypos);
+void draw_object_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Object *ob, float ypos);
+void draw_scene_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Scene *sce, float ypos);
+void draw_gpl_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPDlayer *gpl, float ypos);
/* Keydata Generation */
-void fcurve_to_keylist(struct FCurve *fcu, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void agroup_to_keylist(struct bActionGroup *agrp, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void action_to_keylist(struct bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void action_nlascaled_to_keylist(struct Object *ob, struct bAction *act, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void ob_to_keylist(struct Object *ob, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void scene_to_keylist(struct Scene *sce, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
-void gpl_to_keylist(struct bGPDlayer *gpl, ListBase *keys, ListBase *blocks, ActKeysInc *aki);
+void fcurve_to_keylist(struct AnimData *adt, struct FCurve *fcu, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void agroup_to_keylist(struct AnimData *adt, struct bActionGroup *agrp, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void action_to_keylist(struct AnimData *adt, struct bAction *act, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void ob_to_keylist(struct bDopeSheet *ads, struct Object *ob, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void scene_to_keylist(struct bDopeSheet *ads, struct Scene *sce, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+
+/* Keyframe Finding */
+ActKeyColumn *cfra_find_actkeycolumn(ActKeyColumn *ak, float cframe);
+ActKeyColumn *cfra_find_nearest_next_ak(ActKeyColumn *ak, float cframe, short next);
#endif /* ED_KEYFRAMES_DRAW_H */
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index 77e95dc77de..b2bf05ea5ea 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -40,8 +40,6 @@ struct Scene;
/* --------- BezTriple Selection ------------- */
-#define BEZSELECTED(bezt) ((bezt->f2 & SELECT) || (bezt->f1 & SELECT) || (bezt->f3 & SELECT))
-
#define BEZ_SEL(bezt) { (bezt)->f1 |= SELECT; (bezt)->f2 |= SELECT; (bezt)->f3 |= SELECT; }
#define BEZ_DESEL(bezt) { (bezt)->f1 &= ~SELECT; (bezt)->f2 &= ~SELECT; (bezt)->f3 &= ~SELECT; }
#define BEZ_INVSEL(bezt) { (bezt)->f1 ^= SELECT; (bezt)->f2 ^= SELECT; (bezt)->f3 ^= SELECT; }
@@ -133,6 +131,7 @@ BeztEditFunc ANIM_editkeyframes_mirror(short mode);
BeztEditFunc ANIM_editkeyframes_select(short mode);
BeztEditFunc ANIM_editkeyframes_handles(short mode);
BeztEditFunc ANIM_editkeyframes_ipo(short mode);
+BeztEditFunc ANIM_editkeyframes_keytype(short mode);
/* ----------- BezTriple Callback (Assorted Utilities) ---------- */
@@ -148,6 +147,7 @@ void duplicate_fcurve_keys(struct FCurve *fcu);
void clean_fcurve(struct FCurve *fcu, float thresh);
void smooth_fcurve(struct FCurve *fcu);
+void sample_fcurve(struct FCurve *fcu);
/* ----------- */
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index 9d063910aa9..20c2301d2ac 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -30,6 +30,7 @@
struct ListBase;
struct ID;
+struct Scene;
struct KeyingSet;
@@ -43,6 +44,9 @@ struct bConstraint;
struct bContext;
struct wmOperatorType;
+struct PointerRNA;
+struct PropertyRNA;
+
/* ************ Keyframing Management **************** */
/* Get (or add relevant data to be able to do so) the Active Action for the given
@@ -61,13 +65,24 @@ struct FCurve *verify_fcurve(struct bAction *act, const char group[], const char
* Use this when validation of necessary animation data isn't necessary as it already
* exists, and there is a beztriple that can be directly copied into the array.
*/
-int insert_bezt_fcurve(struct FCurve *fcu, struct BezTriple *bezt);
+int insert_bezt_fcurve(struct FCurve *fcu, struct BezTriple *bezt, short flag);
/* Main Keyframing API call:
* Use this when validation of necessary animation data isn't necessary as it
* already exists. It will insert a keyframe using the current value being keyframed.
+ * Returns the index at which a keyframe was added (or -1 if failed)
*/
-void insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag);
+int insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag);
+
+/* -------- */
+
+/* Secondary Keyframing API calls:
+ * 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);
+
+
/* -------- */
@@ -96,8 +111,7 @@ void ANIM_OT_delete_keyframe(struct wmOperatorType *ot);
* required for each space.
*/
void ANIM_OT_insert_keyframe_menu(struct wmOperatorType *ot);
-void ANIM_OT_delete_keyframe_menu(struct wmOperatorType *ot); // xxx unimplemented yet
-void ANIM_OT_delete_keyframe_old(struct wmOperatorType *ot); // xxx rename and keep?
+void ANIM_OT_delete_keyframe_v3d(struct wmOperatorType *ot);
/* Keyframe managment operators for UI buttons. */
void ANIM_OT_insert_keyframe_button(struct wmOperatorType *ot);
@@ -143,19 +157,16 @@ void init_builtin_keyingsets(void);
/* -------- */
-/* KeyingSet Editing Operators:
- * These can add a new KeyingSet and/or add 'destinations' to the KeyingSets,
- * acting as a means by which they can be added outside the Outliner.
- */
-void ANIM_OT_keyingset_add_new(struct wmOperatorType *ot);
-void ANIM_OT_keyingset_add_destination(struct wmOperatorType *ot);
+/* KeyingSet managment operators for UI buttons. */
+void ANIM_OT_add_keyingset_button(struct wmOperatorType *ot);
+void ANIM_OT_remove_keyingset_button(struct wmOperatorType *ot);
/* ************ Drivers ********************** */
/* 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);
+short ANIM_add_driver (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)
@@ -184,8 +195,16 @@ void ANIM_OT_remove_driver_button(struct wmOperatorType *ot);
/* check if a flag is set for auto-keyframing (as userprefs only!) */
#define IS_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);
+
/* ************ Keyframe Checking ******************** */
+/* Lesser Keyframe Checking API call:
+ * - Used for the buttons to check for keyframes...
+ */
+short fcurve_frame_has_keyframe(struct FCurve *fcu, float frame, short filter);
+
/* Main Keyframe Checking API call:
* Checks whether a keyframe exists for the given ID-block one the given frame.
* - It is recommended to call this method over the other keyframe-checkers directly,
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index 048bbbd7463..4b7a2954206 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -54,7 +54,7 @@ void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short sel);
/* Operators ------------------------------ */
/* called in screen_ops.c:ED_operatortypes_screen() */
-void ED_marker_operatortypes(void);
+void ED_operatortypes_marker(void);
/* called in screen_ops.c:ED_keymap_screen() */
void ED_marker_keymap(struct wmWindowManager *wm);
diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h
new file mode 100644
index 00000000000..49c1d856a27
--- /dev/null
+++ b/source/blender/editors/include/ED_mball.h
@@ -0,0 +1,45 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+struct bContext;
+struct Object;
+struct wmWindowManager;
+
+void ED_operatortypes_metaball(void);
+void ED_keymap_metaball(struct wmWindowManager *wm);
+
+struct MetaElem *add_metaball_primitive(struct bContext *C, int type, int newname);
+
+void mouse_mball(struct bContext *C, short mval[2], int extend);
+
+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);
+
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 937f6384f6a..634a3bc278b 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -36,6 +36,7 @@ struct EditVert;
struct EditEdge;
struct EditFace;
struct bContext;
+struct wmOperator;
struct wmWindowManager;
struct EditSelection;
struct ViewContext;
@@ -49,26 +50,25 @@ struct UvVertMap;
struct UvMapVert;
struct CustomData;
-// edge and face flag both
-#define EM_FGON 2
-// face flag
-#define EM_FGON_DRAW 1
+#define EM_FGON_DRAW 1 // face flag
+#define EM_FGON 2 // edge and face flag both
/* editbutflag */
-#define B_CLOCKWISE 1
-#define B_KEEPORIG 2
-#define B_BEAUTY 4
-#define B_SMOOTH 8
-#define B_BEAUTY_SHORT 16
-#define B_AUTOFGON 32
-#define B_KNIFE 0x80
+#define B_CLOCKWISE 1
+#define B_KEEPORIG 2
+#define B_BEAUTY 4
+#define B_SMOOTH 8
+#define B_BEAUTY_SHORT 0x10
+#define B_AUTOFGON 0x20
+#define B_KNIFE 0x80
#define B_PERCENTSUBD 0x40
#define B_MESH_X_MIRROR 0x100
#define B_JOINTRIA_UV 0x200
#define B_JOINTRIA_VCOL 0X400
#define B_JOINTRIA_SHARP 0X800
#define B_JOINTRIA_MAT 0X1000
-
+#define B_FRACTAL 0x2000
+#define B_SPHERE 0x4000
/* meshtools.c */
@@ -77,6 +77,8 @@ struct EditVert *editmesh_get_x_mirror_vert(struct Object *ob, struct EditMesh
int mesh_get_x_mirror_vert(struct Object *ob, int index);
int *mesh_get_x_mirror_faces(struct Object *ob, struct EditMesh *em);
+int join_mesh_exec(struct bContext *C, struct wmOperator *op);
+
/* mesh_ops.c */
void ED_operatortypes_mesh(void);
void ED_keymap_mesh(struct wmWindowManager *wm);
@@ -110,13 +112,13 @@ void undo_push_mesh(struct bContext *C, char *name);
struct EditFace *EM_get_actFace(struct EditMesh *em, int sloppy);
void EM_set_actFace(struct EditMesh *em, struct EditFace *efa);
float EM_face_area(struct EditFace *efa);
-void EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type);
void EM_select_edge(struct EditEdge *eed, int sel);
void EM_select_face(struct EditFace *efa, int sel);
void EM_select_face_fgon(struct EditMesh *em, struct EditFace *efa, int val);
void EM_select_swap(struct EditMesh *em);
void EM_toggle_select_all(struct EditMesh *em);
+void EM_select_all(struct EditMesh *em);
void EM_selectmode_flush(struct EditMesh *em);
void EM_deselect_flush(struct EditMesh *em);
void EM_selectmode_set(struct EditMesh *em);
@@ -134,6 +136,9 @@ struct UvVertMap *EM_make_uv_vert_map(struct EditMesh *em, int selected, int do_
struct UvMapVert *EM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v);
void EM_free_uv_vert_map(struct UvVertMap *vmap);
+void EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type);
+void EM_free_data_layer(struct EditMesh *em, struct CustomData *data, int type);
+
/* editmesh_mods.c */
extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
@@ -153,25 +158,31 @@ void EM_deselect_by_material(struct EditMesh *em, int index);
/* editface.c */
struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy);
-/* editdeform.c XXX rename functions? */
+/* object_vgroup.c */
#define WEIGHT_REPLACE 1
#define WEIGHT_ADD 2
#define WEIGHT_SUBTRACT 3
-void add_defgroup (Object *ob);
-void create_dverts(struct ID *id);
-float get_vert_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum);
-void remove_vert_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum);
-void remove_verts_defgroup (Object *obedit, int allverts);
-void vertexgroup_select_by_name(Object *ob, char *name);
-void add_vert_to_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum,
- float weight, int assignmode);
-
-struct bDeformGroup *add_defgroup_name (Object *ob, char *name);
-struct MDeformWeight *verify_defweight (struct MDeformVert *dv, int defgroup);
-struct MDeformWeight *get_defweight (struct MDeformVert *dv, int defgroup);
-
+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);
+void ED_vgroup_data_create(struct ID *id);
+
+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);
+
+struct MDeformWeight *ED_vgroup_weight_verify(struct MDeformVert *dv, int defgroup);
+struct MDeformWeight *ED_vgroup_weight_get(struct MDeformVert *dv, int defgroup);
+
+/*needed by edge slide*/
+struct EditVert *editedge_getOtherVert(struct EditEdge *eed, struct EditVert *eve);
+struct EditVert *editedge_getSharedVert(struct EditEdge *eed, struct EditEdge *eed2);
+int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
+int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
+int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
+short sharesFace(struct EditMesh *em, struct EditEdge *e1, struct EditEdge *e2);
#endif /* ED_MESH_H */
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 0cd5551f17f..305b2a64ffe 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -28,8 +28,22 @@
#ifndef ED_NODE_H
#define ED_NODE_H
+struct Material;
+struct Scene;
+struct Tex;
+struct bContext;
+struct bNode;
+
/* drawnode.c */
void ED_init_node_butfuncs(void);
+/* node_draw.c */
+void ED_node_changed_update(struct bContext *C, struct bNode *node);
+
+/* node_edit.c */
+void ED_node_shader_default(struct Material *ma);
+void ED_node_composit_default(struct Scene *sce);
+void ED_node_texture_default(struct Tex *tex);;
+
#endif /* ED_NODE_H */
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index e4e4b1d0486..363795afeab 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -35,7 +35,6 @@ struct bContext;
struct Base;
struct View3D;
struct bConstraint;
-struct bConstraintChannel;
struct KeyBlock;
struct Lattice;
struct Mesh;
@@ -55,9 +54,12 @@ void ED_base_object_activate(struct bContext *C, struct Base *base);
void ED_base_object_free_and_unlink(struct Scene *scene, struct Base *base);
void ED_object_apply_obmat(struct Object *ob);
- /* single object duplicate, if dupflag==0, fully linked, else it uses U.dupflag */
-struct Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int usedupflag);
+ /* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */
+struct Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int dupflag);
+void ED_object_parent(struct Object *ob, struct Object *parent, int type, const char *substr);
+
+void ED_object_toggle_modes(struct bContext *C, int mode);
/* bitflags for enter/exit editmode */
#define EM_FREEDATA 1
@@ -69,7 +71,10 @@ void ED_object_enter_editmode(struct bContext *C, int flag);
void ED_object_base_init_from_view(struct bContext *C, struct Base *base);
+void ED_object_single_users(struct Scene *scene, int full);
+
/* cleanup */
+int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
/* constraints */
@@ -78,21 +83,19 @@ void add_constraint_to_object(struct bConstraint *con, struct Object *ob);
struct ListBase *get_active_constraints(struct Object *ob);
struct bConstraint *get_active_constraint(struct Object *ob);
-struct bConstraintChannel *get_active_constraint_channel(struct Scene *scene, struct Object *ob);
void object_test_constraints(struct Object *ob);
void ED_object_constraint_rename(struct Object *ob, struct bConstraint *con, char *oldname);
void ED_object_constraint_set_active(struct Object *ob, struct bConstraint *con);
-int ED_object_constraint_delete(struct ReportList *reports, struct Object *ob, struct bConstraint *con);
-int ED_object_constraint_move_down(struct ReportList *reports, struct Object *ob, struct bConstraint *con);
-int ED_object_constraint_move_up(struct ReportList *reports, struct Object *ob, struct bConstraint *con);
+void ED_object_constraint_update(struct Object *ob);
+void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob);
-/* editlattice.c */
+/* object_lattice.c */
void mouse_lattice(struct bContext *C, short mval[2], int extend);
void undo_push_lattice(struct bContext *C, char *name);
-/* editkey.c */
+/* object_shapekey.c */
void insert_shapekey(struct Scene *scene, struct Object *ob);
void delete_key(struct Scene *scene, struct Object *ob);
void key_to_mesh(struct KeyBlock *kb, struct Mesh *me);
@@ -103,7 +106,8 @@ void key_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb)
void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
/* object_modifier.c */
-int ED_object_modifier_delete(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
+int ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, int type);
+int ED_object_modifier_remove(struct ReportList *reports, 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);
int ED_object_modifier_convert(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h
index 43cb5053f48..28807caa255 100644
--- a/source/blender/editors/include/ED_particle.h
+++ b/source/blender/editors/include/ED_particle.h
@@ -37,20 +37,19 @@ struct ParticleSystem;
struct RadialControl;
struct rcti;
struct wmWindowManager;
+struct PTCacheEdit;
/* particle edit mode */
-void PE_change_act(void *ob_v, void *act_v);
-void PE_change_act_psys(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys);
-int PE_can_edit(struct ParticleSystem *psys);
+void PE_free_ptcache_edit(struct PTCacheEdit *edit);
+int PE_start_edit(struct PTCacheEdit *edit);
/* access */
-struct ParticleSystem *PE_get_current(struct Scene *scene, struct Object *ob);
-short PE_get_current_num(struct Object *ob);
+struct PTCacheEdit *PE_get_current(struct Scene *scene, struct Object *ob);
int PE_minmax(struct Scene *scene, float *min, float *max);
struct ParticleEditSettings *PE_settings(Scene *scene);
/* update calls */
-void PE_hide_keys_time(struct Scene *scene, struct ParticleSystem *psys, float cfra);
+void PE_hide_keys_time(struct Scene *scene, struct PTCacheEdit *edit, float cfra);
void PE_update_object(struct Scene *scene, struct Object *ob, int useflag);
/* selection tools */
diff --git a/source/blender/editors/include/ED_pointcache.h b/source/blender/editors/include/ED_physics.h
index dc50e274fa9..6ab804230d0 100644
--- a/source/blender/editors/include/ED_pointcache.h
+++ b/source/blender/editors/include/ED_physics.h
@@ -31,7 +31,10 @@
#define ED_PHYSICS_H
/* operators */
+
+void ED_operatortypes_boids(void);
void ED_operatortypes_pointcache(void);
+void ED_operatortypes_fluid(void);
//void ED_keymap_pointcache(struct wmWindowManager *wm);
#endif /* ED_PHYSICS_H */
diff --git a/source/blender/editors/include/ED_previewrender.h b/source/blender/editors/include/ED_previewrender.h
index 10067510e53..7e0d71db7e1 100644
--- a/source/blender/editors/include/ED_previewrender.h
+++ b/source/blender/editors/include/ED_previewrender.h
@@ -34,6 +34,7 @@ struct Image;
struct Render;
struct bContext;
struct ID;
+struct MTex;
#define PREVIEW_RENDERSIZE 140
@@ -70,9 +71,9 @@ pr_method:
void ED_preview_init_dbase(void);
void ED_preview_free_dbase(void);
-void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID *id, int sizex, int sizey);
-void ED_preview_iconrender(struct Scene *scene, struct ID *id, int *rect, int sizex, int sizey);
+void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID *id, struct ID *parent, struct MTex *slot, int sizex, int sizey);
+void ED_preview_iconrender(struct Scene *scene, struct ID *id, unsigned int *rect, int sizex, int sizey);
-void ED_preview_draw(const struct bContext *C, void *idp, rcti *rect);
+void ED_preview_draw(const struct bContext *C, void *idp, void *parentp, void *slot, rcti *rect);
#endif
diff --git a/source/blender/editors/include/BIF_retopo.h b/source/blender/editors/include/ED_retopo.h
index cc2fda56b07..3d0b5f57661 100644
--- a/source/blender/editors/include/BIF_retopo.h
+++ b/source/blender/editors/include/ED_retopo.h
@@ -27,8 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef BIF_RETOPO_H
-#define BIF_RETOPO_H
+#ifndef ED_RETOPO_H
+#define ED_RETOPO_H
#include "DNA_vec_types.h"
@@ -108,3 +108,4 @@ 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 ef682c871bc..63b6a067389 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -50,17 +50,21 @@ void ED_region_do_listen(struct ARegion *ar, struct wmNotifier *note);
void ED_region_do_draw(struct bContext *C, struct ARegion *ar);
void ED_region_exit(struct bContext *C, struct ARegion *ar);
void ED_region_pixelspace(struct ARegion *ar);
+void ED_region_set(const struct bContext *C, struct ARegion *ar);
void ED_region_init(struct bContext *C, struct ARegion *ar);
void ED_region_tag_redraw(struct ARegion *ar);
void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
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);
+void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, 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);
+void region_scissor_winrct(struct ARegion *ar, struct rcti *winrct);
/* spaces */
void ED_spacetypes_init(void);
void ED_spacetypes_keymap(struct wmWindowManager *wm);
+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);
@@ -85,17 +89,22 @@ 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);
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);
+void ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
void ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event);
void ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
-void ED_screen_animation_timer(struct bContext *C, int redraws, int enable);
+void ED_screen_animation_timer(struct bContext *C, int redraws, int sync, int enable);
+void ED_screen_animation_timer_update(struct bContext *C, int redraws);
int ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type);
void ED_screen_full_prevspace(struct bContext *C);
+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);
-unsigned int ED_screen_view3d_layers(struct bScreen *screen);
void ED_operatortypes_screen(void);
void ED_keymap_screen(struct wmWindowManager *wm);
@@ -118,6 +127,7 @@ int ED_operator_node_active(struct bContext *C);
int ED_operator_ipo_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_object_active(struct bContext *C);
@@ -127,6 +137,8 @@ int ED_operator_editcurve(struct bContext *C);
int ED_operator_editsurf(struct bContext *C);
int ED_operator_editsurfcurve(struct bContext *C);
int ED_operator_editfont(struct bContext *C);
+int ED_operator_editlattice(struct bContext *C);
+int ED_operator_editmball(struct bContext *C);
int ED_operator_uvedit(struct bContext *C);
int ED_operator_uvmap(struct bContext *C);
int ED_operator_posemode(struct bContext *C);
@@ -138,6 +150,7 @@ int ED_operator_posemode(struct bContext *C);
#define ED_KEYMAP_MARKERS 4
#define ED_KEYMAP_ANIMATION 8
#define ED_KEYMAP_FRAMES 16
+#define ED_KEYMAP_GPENCIL 32
#endif /* ED_SCREEN_H */
diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h
index 37f2f4f051d..dcdc9e417e4 100644
--- a/source/blender/editors/include/ED_screen_types.h
+++ b/source/blender/editors/include/ED_screen_types.h
@@ -31,10 +31,24 @@
/* for animplayer */
typedef struct ScreenAnimData {
- ARegion *ar; /* do not read from this, only for comparing if region exists */
+ ARegion *ar; /* do not read from this, only for comparing if region exists */
int redraws;
+ int flag; /* flags for playback */
} ScreenAnimData;
+/* for animplayer */
+enum {
+ /* user-setting - frame range is played backwards */
+ ANIMPLAY_FLAG_REVERSE = (1<<0),
+ /* temporary - playback just jumped to the start/end */
+ ANIMPLAY_FLAG_JUMPED = (1<<1),
+ /* drop frames as needed to maintain framerate */
+ ANIMPLAY_FLAG_SYNC = (1<<2),
+ /* don't drop frames (and ignore AUDIO_SYNC flag) */
+ ANIMPLAY_FLAG_NO_SYNC = (1<<3),
+};
+
+
typedef struct AZone {
struct AZone *next, *prev;
@@ -45,7 +59,7 @@ typedef struct AZone {
/* internal */
short do_draw;
/* for draw */
- short x1, y1, x2, y2, x3, y3;
+ short x1, y1, x2, y2;
/* for clip */
rcti rect;
} AZone;
diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h
index c6a8881a0c6..a08f0576f42 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -33,10 +33,10 @@ struct wmWindowManager;
/* sculpt.c */
void ED_operatortypes_sculpt(void);
-void ED_keymap_sculpt(struct wmWindowManager *wm);
/* paint_ops.c */
void ED_operatortypes_paint(void);
+void ED_keymap_paint(struct wmWindowManager *wm);
/* paint_image.c */
void undo_imagepaint_step(int step);
diff --git a/source/blender/editors/include/ED_sound.h b/source/blender/editors/include/ED_sound.h
new file mode 100644
index 00000000000..afb2752fa6b
--- /dev/null
+++ b/source/blender/editors/include/ED_sound.h
@@ -0,0 +1,35 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef ED_SOUND_H
+#define ED_SOUND_H
+
+void ED_operatortypes_sound(void);
+
+#endif /* ED_SOUND_H */
+
diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h
index f2b46369d13..04b6be3bcaa 100644
--- a/source/blender/editors/include/ED_space_api.h
+++ b/source/blender/editors/include/ED_space_api.h
@@ -51,6 +51,8 @@ void ED_spacetype_script(void);
void ED_spacetype_text(void);
void ED_spacetype_sequencer(void);
void ED_spacetype_logic(void);
+void ED_spacetype_console(void);
+void ED_spacetype_userpref(void);
/* calls for instancing and freeing spacetype static data
called in WM_init_exit */
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index 1d47d8ad190..bf3111de5dc 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -1,12 +1,12 @@
/**
- * $Id:
+ * $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.
+ * 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
@@ -17,17 +17,156 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
- * Contributor(s): Blender Foundation
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef ED_TRANSFORM_H
#define ED_TRANSFORM_H
+/* ******************* Registration Function ********************** */
+
+struct wmWindowManager;
+struct wmOperatorType;
+struct ListBase;
+struct wmEvent;
+struct bContext;
+struct Object;
+struct uiLayout;
+struct EnumPropertyItem;
+struct wmOperatorType;
+struct wmKeyMap;
+
+void transform_keymap_for_space(struct wmWindowManager *wm, struct wmKeyMap *keymap, int spaceid);
+void transform_operatortypes(void);
+
+/* ******************** Macros & Prototypes *********************** */
+
+/* MODE AND NUMINPUT FLAGS */
+enum {
+ TFM_INIT = -1,
+ TFM_DUMMY,
+ TFM_TRANSLATION,
+ TFM_ROTATION,
+ TFM_RESIZE,
+ TFM_TOSPHERE,
+ TFM_SHEAR,
+ TFM_WARP,
+ TFM_SHRINKFATTEN,
+ TFM_TILT,
+ TFM_TRACKBALL,
+ TFM_PUSHPULL,
+ TFM_CREASE,
+ TFM_MIRROR,
+ TFM_BONESIZE,
+ TFM_BONE_ENVELOPE,
+ TFM_CURVE_SHRINKFATTEN,
+ TFM_BONE_ROLL,
+ TFM_TIME_TRANSLATE,
+ TFM_TIME_SLIDE,
+ TFM_TIME_SCALE,
+ TFM_TIME_EXTEND,
+ TFM_BAKE_TIME,
+ TFM_BEVEL,
+ TFM_BWEIGHT,
+ TFM_ALIGN,
+ TFM_EDGE_SLIDE
+} TfmMode;
+
+/* TRANSFORM CONTEXTS */
+#define CTX_NONE 0
+#define CTX_TEXTURE 1
+#define CTX_EDGE 2
+#define CTX_NO_PET 4
+#define CTX_TWEAK 8
+#define CTX_NO_MIRROR 16
+#define CTX_AUTOCONFIRM 32
+#define CTX_BMESH 64
+#define CTX_NDOF 128
+
+/* Standalone call to get the transformation center corresponding to the current situation
+ * returns 1 if successful, 0 otherwise (usually means there's no selection)
+ * (if 0 is returns, *vec is unmodified)
+ * */
+int calculateTransformCenter(struct bContext *C, struct wmEvent *event, int centerMode, float *vec);
+
+struct TransInfo;
+struct ScrArea;
+struct Base;
+struct Scene;
+struct Object;
+
+void BIF_setSingleAxisConstraint(float vec[3], char *text);
+void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text);
+void BIF_setLocalAxisConstraint(char axis, char *text);
+void BIF_setLocalLockConstraint(char axis, char *text);
+
+int BIF_snappingSupported(struct Object *obedit);
+
+struct TransformOrientation;
+struct bContext;
+
+void BIF_clearTransformOrientation(struct bContext *C);
+void BIF_removeTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
+void BIF_manageTransformOrientation(struct bContext *C, int confirm, int set);
+int BIF_menuselectTransformOrientation(void);
+void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *ts);
+void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
+
+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 */
+int BIF_countTransformOrientation(const struct bContext *C);
+
+void BIF_TransformSetUndo(char *str);
+
+void BIF_selectOrientation(void);
+
+/* to be able to add operator properties to other operators */
+
+void Properties_Proportional(struct wmOperatorType *ot);
+void Properties_Snapping(struct wmOperatorType *ot, short align);
+void Properties_Constraints(struct wmOperatorType *ot);
+
+/* view3d manipulators */
+
+int BIF_do_manipulator(struct bContext *C, struct wmEvent *event, struct wmOperator *op);
+void BIF_draw_manipulator(const struct bContext *C);
+
+/* Snapping */
+
+
+typedef struct DepthPeel
+{
+ struct DepthPeel *next, *prev;
+
+ float depth;
+ float p[3];
+ float no[3];
+ struct Object *ob;
+ int flag;
+} DepthPeel;
+
+struct ListBase;
+
+typedef enum SnapMode
+{
+ SNAP_ALL = 0,
+ SNAP_NOT_SELECTED = 1,
+ SNAP_NOT_OBEDIT = 2
+} SnapMode;
+
+#define SNAP_MIN_DISTANCE 30
+
+int peelObjectsTransForm(struct TransInfo *t, struct ListBase *depth_peels, short mval[2]);
+int peelObjectsContext(struct bContext *C, struct ListBase *depth_peels, short mval[2]);
+int snapObjectsTransform(struct TransInfo *t, short mval[2], int *dist, float *loc, float *no, SnapMode mode);
+int snapObjectsContext(struct bContext *C, short mval[2], int *dist, float *loc, float *no, SnapMode mode);
-#endif /* ED_TRANSFORM_H */
+#endif
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 7ccbf1ff18d..7b1c87f9cb2 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -44,6 +44,7 @@ void ED_editors_exit (struct bContext *C);
/* undo.c */
void ED_undo_push (struct bContext *C, 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);
void ED_undo_redo (struct bContext *C);
void ED_OT_undo (struct wmOperatorType *ot);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index b576299c1d0..fd1b7e1351d 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -70,6 +70,7 @@ float *give_cursor(struct Scene *scene, struct View3D *v3d);
void initgrabz(struct RegionView3D *rv3d, float x, float y, float z);
void window_to_3d(struct ARegion *ar, float *vec, short mx, short my);
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 */
float read_cached_depth(struct ViewContext *vc, int x, int y);
@@ -130,8 +131,6 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
int lasso_inside(short mcords[][2], short moves, short sx, short sy);
int lasso_inside_edge(short mcords[][2], short moves, int x0, int y0, int x1, int y1);
-/* modes */
-void ED_view3d_exit_paint_modes(struct bContext *C);
/* get 3d region from context, also if mouse is in header or toolbar */
struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C);
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 602e94838b7..f16fc9ebe05 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -101,7 +101,7 @@ DEF_ICON(ICON_RENDER_REGION)
DEF_ICON(ICON_BORDER_RECT)
DEF_ICON(ICON_BORDER_LASSO)
DEF_ICON(ICON_FREEZE)
-DEF_ICON(ICON_BLANK031)
+DEF_ICON(ICON_STYLUS_PRESSURE)
DEF_ICON(ICON_BLANK032)
DEF_ICON(ICON_BLANK033)
DEF_ICON(ICON_BLANK034)
@@ -158,10 +158,10 @@ DEF_ICON(ICON_NLA)
DEF_ICON(ICON_SCRIPTWIN)
DEF_ICON(ICON_TIME)
DEF_ICON(ICON_NODE)
-DEF_ICON(ICON_BLANK053)
-DEF_ICON(ICON_BLANK054)
-DEF_ICON(ICON_BLANK055)
-DEF_ICON(ICON_BLANK056)
+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)
@@ -179,7 +179,7 @@ DEF_ICON(ICON_WPAINT_HLT)
DEF_ICON(ICON_SCULPTMODE_HLT)
DEF_ICON(ICON_POSE_HLT)
DEF_ICON(ICON_PARTICLEMODE)
-DEF_ICON(ICON_BLANK062)
+DEF_ICON(ICON_LIGHTPAINT)
DEF_ICON(ICON_BLANK063)
DEF_ICON(ICON_BLANK064)
DEF_ICON(ICON_BLANK065)
@@ -235,13 +235,13 @@ DEF_ICON(ICON_RENDER_RESULT)
DEF_ICON(ICON_SURFACE_DATA)
DEF_ICON(ICON_EMPTY_DATA)
DEF_ICON(ICON_SETTINGS)
-DEF_ICON(ICON_BLANK080D)
+DEF_ICON(ICON_RENDER_ANIMATION)
DEF_ICON(ICON_BLANK080E)
DEF_ICON(ICON_BLANK080F)
-DEF_ICON(ICON_BLANK080)
+DEF_ICON(ICON_BOIDS)
DEF_ICON(ICON_STRANDS)
DEF_ICON(ICON_LIBRARY_DATA_INDIRECT)
-DEF_ICON(ICON_BLANK082)
+DEF_ICON(ICON_GREASEPENCIL)
DEF_ICON(ICON_BLANK083)
DEF_ICON(ICON_BLANK084)
DEF_ICON(ICON_GROUP_BONE)
@@ -538,7 +538,7 @@ DEF_ICON(ICON_MOD_CLOTH)
DEF_ICON(ICON_MOD_EXPLODE)
DEF_ICON(ICON_MOD_FLUIDSIM)
DEF_ICON(ICON_MOD_MULTIRES)
-DEF_ICON(ICON_BLANK157)
+DEF_ICON(ICON_MOD_SMOKE)
DEF_ICON(ICON_BLANK158)
DEF_ICON(ICON_BLANK159)
DEF_ICON(ICON_BLANK160)
@@ -570,7 +570,7 @@ DEF_ICON(ICON_PAUSE)
DEF_ICON(ICON_PREV_KEYFRAME)
DEF_ICON(ICON_NEXT_KEYFRAME)
DEF_ICON(ICON_PLAY_AUDIO)
-DEF_ICON(ICON_BLANK178)
+DEF_ICON(ICON_PLAY_REVERSE)
DEF_ICON(ICON_BLANK179)
DEF_ICON(ICON_BLANK180)
DEF_ICON(ICON_PMARKER_ACT)
@@ -686,10 +686,10 @@ DEF_ICON(ICON_BLANK231)
DEF_ICON(ICON_BLANK232)
DEF_ICON(ICON_BLANK233)
DEF_ICON(ICON_BLANK234)
-DEF_ICON(ICON_BLANK235)
-DEF_ICON(ICON_BLANK236)
-DEF_ICON(ICON_BLANK237)
-DEF_ICON(ICON_BLANK238)
+DEF_ICON(ICON_UV_VERTEXSEL)
+DEF_ICON(ICON_UV_EDGESEL)
+DEF_ICON(ICON_UV_FACESEL)
+DEF_ICON(ICON_UV_ISLANDSEL)
DEF_ICON(ICON_BLANK239)
DEF_ICON(ICON_BLANK240)
DEF_ICON(ICON_BLANK241)
@@ -819,9 +819,9 @@ DEF_ICON(ICON_MATSPHERE)
DEF_ICON(ICON_MATCUBE)
DEF_ICON(ICON_MONKEY)
DEF_ICON(ICON_HAIR)
-DEF_ICON(ICON_RING)
-DEF_ICON(ICON_BLANK317)
-DEF_ICON(ICON_BLANK318)
+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)
@@ -880,3 +880,5 @@ DEF_ICON(VICON_DISCLOSURE_TRI_DOWN)
DEF_ICON(VICON_MOVE_UP)
DEF_ICON(VICON_MOVE_DOWN)
DEF_ICON(VICON_X)
+DEF_ICON(VICON_SMALL_TRI_RIGHT)
+
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index b6d71759373..dc4744c9832 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -30,6 +30,8 @@
#ifndef UI_INTERFACE_H
#define UI_INTERFACE_H
+#include "RNA_types.h"
+
/* Struct Declarations */
struct ID;
@@ -51,10 +53,14 @@ struct rcti;
struct rctf;
struct uiStyle;
struct uiFontStyle;
+struct uiWidgetColors;
struct ColorBand;
struct CurveMapping;
struct Image;
struct ImageUser;
+struct uiWidgetColors;
+struct Tex;
+struct MTex;
typedef struct uiBut uiBut;
typedef struct uiBlock uiBlock;
@@ -94,6 +100,8 @@ typedef struct uiLayout uiLayout;
#define UI_BLOCK_KEEP_OPEN 256
#define UI_BLOCK_POPUP 512
#define UI_BLOCK_OUT_1 1024
+#define UI_BLOCK_NO_FLIP 2048
+#define UI_BLOCK_POPUP_MEMORY 4096
/* uiPopupBlockHandle->menuretval */
#define UI_RETURN_CANCEL 1 /* cancel all menus cascading */
@@ -137,6 +145,8 @@ typedef struct uiLayout uiLayout;
#define UI_BUT_ANIMATED_KEY (1<<21)
#define UI_BUT_DRIVEN (1<<22)
#define UI_BUT_INACTIVE (1<<23)
+#define UI_BUT_LAST_ACTIVE (1<<24)
+#define UI_BUT_UNDO (1<<25)
#define UI_PANEL_WIDTH 340
#define UI_COMPACT_PANEL_WIDTH 160
@@ -199,7 +209,11 @@ typedef struct uiLayout uiLayout;
#define SEARCH_MENU (40<<9)
#define BUT_EXTRA (41<<9)
#define HSVCIRCLE (42<<9)
-#define BUTTYPE (63<<9)
+#define LISTBOX (43<<9)
+#define LISTROW (44<<9)
+#define HOTKEYEVT (45<<9)
+
+#define BUTTYPE (63<<9)
/* Drawing
*
@@ -214,6 +228,11 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad);
void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, short direction);
void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
+/* state for scrolldrawing */
+#define UI_SCROLL_PRESSED 1
+#define UI_SCROLL_ARROWS 2
+void uiWidgetScrollDraw(struct uiWidgetColors *wcol, struct rcti *rect, struct rcti *slider, int state);
+
/* Menu Callbacks */
typedef void (*uiMenuCreateFunc)(struct bContext *C, struct uiLayout *layout, void *arg1);
@@ -238,8 +257,6 @@ void uiPupMenuNotice(struct bContext *C, char *str, ...);
void uiPupMenuError(struct bContext *C, char *str, ...);
void uiPupMenuReports(struct bContext *C, struct ReportList *reports);
-void uiPupMenuSetActive(int val);
-
/* Popup Blocks
*
* Functions used to create popup blocks. These are like popup menus
@@ -301,6 +318,10 @@ int uiButGetRetVal (uiBut *but);
void uiButSetFlag (uiBut *but, int flag);
void uiButClearFlag (uiBut *but, int flag);
+/* special button case, only draw it when used actively, for outliner etc */
+int uiButActiveOnly (const struct bContext *C, uiBlock *block, uiBut *but);
+
+
/* Buttons
*
* Functions to define various types of buttons in a block. Postfixes:
@@ -397,7 +418,8 @@ 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);
-int uiDefIDPoinButs(uiBlock *block, struct Main *main, struct ID *parid, struct ID *id, int id_code, short *pin_p, int x, int y, uiIDPoinFunc func, int events);
+
+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);
@@ -409,7 +431,8 @@ uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *
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);
-void 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, 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 *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip);
@@ -456,21 +479,22 @@ typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
/* use inside searchfunc to add items */
int uiSearchItemAdd(uiSearchItems *items, const char *name, void *poin, int iconid);
/* bfunc gets search item *poin as arg2, or if NULL the old string */
-void uiButSetSearchFunc (uiBut *but, uiButSearchFunc sfunc, void *arg1, uiButHandleFunc bfunc);
+void uiButSetSearchFunc (uiBut *but, uiButSearchFunc sfunc, void *arg1, uiButHandleFunc bfunc, void *active);
/* height in pixels, it's using hardcoded values still */
int uiSearchBoxhHeight(void);
void uiBlockSetHandleFunc(uiBlock *block, uiBlockHandleFunc func, void *arg);
void uiBlockSetButmFunc (uiBlock *block, uiMenuHandleFunc func, void *arg);
-
void uiBlockSetFunc (uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2);
-void uiBlockSetRenameFunc(uiBlock *block, uiButHandleRenameFunc func, void *arg1);
+void uiBlockSetNFunc (uiBlock *block, uiButHandleFunc func, void *argN, void *arg2);
+
+void uiButSetRenameFunc (uiBut *but, uiButHandleRenameFunc func, void *arg1);
void uiButSetFunc (uiBut *but, uiButHandleFunc func, void *arg1, void *arg2);
void uiButSetNFunc (uiBut *but, uiButHandleNFunc func, void *argN, void *arg2);
void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg);
-void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext *C, void *, struct rcti *rect));
+void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext *C, void *, void *, void *, struct rcti *rect), void *arg1, void *arg2);
/* Autocomplete
*
@@ -506,28 +530,6 @@ void UI_add_region_handlers(struct ListBase *handlers);
void UI_add_area_handlers(struct ListBase *handlers);
void UI_add_popup_handlers(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *menu);
-/* Legacy code
- * Callbacks and utils to get 2.48 work */
-
-void test_idbutton_cb(struct bContext *C, void *namev, void *arg2);
-void test_scriptpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_actionpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_obpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_meshobpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_meshpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_matpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_scenepoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_grouppoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_texpoin_but(struct bContext *C, char *name, struct ID **idpp);
-void test_imapoin_but(struct bContext *C, char *name, struct ID **idpp);
-void autocomplete_bone(struct bContext *C, char *str, void *arg_v);
-void autocomplete_vgroup(struct bContext *C, char *str, void *arg_v);
-
-struct rctf;
-void curvemap_buttons(uiBlock *block, struct CurveMapping *cumap, char labeltype, short event, short redraw, struct rctf *rect);
-void colorband_buttons(uiBlock *block, struct ColorBand *coba, struct rctf *rect, int small);
-
-
/* Module
*
* init and exit should be called before using this module. init_userdef must
@@ -537,11 +539,6 @@ void UI_init(void);
void UI_init_userdef(void);
void UI_exit(void);
-/* XXX hide this */
-
-uiBut *uiDefMenuButO(uiBlock *block, char *opname, char *name);
-uiBut *uiDefMenuSep(uiBlock *block);
-
/* Layout
*
* More automated layout of buttons. Has three levels:
@@ -568,16 +565,22 @@ uiBut *uiDefMenuSep(uiBlock *block);
#define UI_LAYOUT_ALIGN_CENTER 2
#define UI_LAYOUT_ALIGN_RIGHT 3
+#define UI_ITEM_O_RETURN_PROPS 1
+#define UI_ITEM_R_EXPAND 2
+#define UI_ITEM_R_SLIDER 4
+#define UI_ITEM_R_TOGGLE 8
+#define UI_ITEM_R_ICON_ONLY 16
+
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(const struct bContext *C, uiBlock *block, int *x, int *y);
+void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
uiBlock *uiLayoutGetBlock(uiLayout *layout);
-void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
void uiLayoutSetContextPointer(uiLayout *layout, char *name, struct PointerRNA *ptr);
+void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
void uiLayoutSetActive(uiLayout *layout, int active);
void uiLayoutSetEnabled(uiLayout *layout, int enabled);
void uiLayoutSetRedAlert(uiLayout *layout, int redalert);
@@ -586,38 +589,55 @@ void uiLayoutSetKeepAspect(uiLayout *layout, int keepaspect);
void uiLayoutSetScaleX(uiLayout *layout, float scale);
void uiLayoutSetScaleY(uiLayout *layout, float scale);
-
int uiLayoutGetOperatorContext(uiLayout *layout);
int uiLayoutGetActive(uiLayout *layout);
int uiLayoutGetEnabled(uiLayout *layout);
int uiLayoutGetRedAlert(uiLayout *layout);
int uiLayoutGetAlignment(uiLayout *layout);
int uiLayoutGetKeepAspect(uiLayout *layout);
+int uiLayoutGetWidth(uiLayout *layout);
float uiLayoutGetScaleX(uiLayout *layout);
float uiLayoutGetScaleY(uiLayout *layout);
+ListBase *uiLayoutBoxGetList(uiLayout *layout);
/* layout specifiers */
uiLayout *uiLayoutRow(uiLayout *layout, int align);
uiLayout *uiLayoutColumn(uiLayout *layout, int align);
uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align);
uiLayout *uiLayoutBox(uiLayout *layout);
+uiLayout *uiLayoutListBox(uiLayout *layout);
uiLayout *uiLayoutFree(uiLayout *layout, int align);
uiLayout *uiLayoutSplit(uiLayout *layout, float percentage);
uiBlock *uiLayoutFreeBlock(uiLayout *layout);
/* templates */
-void uiTemplateHeader(uiLayout *layout, struct bContext *C);
+void uiTemplateHeader(uiLayout *layout, struct bContext *C, int menus);
void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *unlinkop);
+ char *newop, char *openop, char *unlinkop);
uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr);
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
-void uiTemplatePreview(uiLayout *layout, struct ID *id);
-void uiTemplateColorRamp(uiLayout *layout, struct ColorBand *coba, int expand);
-void uiTemplateCurveMapping(uiLayout *layout, struct CurveMapping *cumap, int type);
+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 uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels);
+void uiTemplateTriColorSet(uiLayout *layout, struct PointerRNA *ptr, char *propname);
void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname);
+void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *userptr, int compact);
void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
-ListBase uiTemplateList(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *activeprop, int rows, int columns, int compact);
+void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
+void uiTemplateOperatorSearch(uiLayout *layout);
+void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
+void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, struct bContext *C);
+void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex);
+
+typedef struct uiListItem {
+ struct uiListItem *next, *prev;
+
+ struct PointerRNA data;
+ uiLayout *layout;
+} uiListItem;
+
+ListBase uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int type);
/* items */
void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
@@ -628,11 +648,12 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *
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);
-void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context);
+PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context, int flag);
-void uiItemR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int expand, int slider, int toggle);
-void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int expand, int slider, int toggle);
+void uiItemR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int flag);
+void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag);
void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value);
+void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value);
void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname);
void uiItemPointerR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname);
@@ -641,13 +662,13 @@ void uiItemM(uiLayout *layout, struct bContext *C, char *name, int icon, char *m
void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */
void uiItemS(uiLayout *layout); /* separator */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func);
+void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg);
void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname);
void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname);
-/* Animation */
-
+/* Helpers for Operators */
void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
+void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
/* Styled text draw */
void uiStyleFontSet(struct uiFontStyle *fs);
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index 4813b695795..38c4d82e6da 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -52,6 +52,8 @@ enum {
V2D_COMMONVIEW_STANDARD,
/* listview (i.e. Outliner) */
V2D_COMMONVIEW_LIST,
+ /* stackview (this is basically a list where new items are added at the top) */
+ V2D_COMMONVIEW_STACK,
/* headers (this is basically the same as listview, but no y-panning) */
V2D_COMMONVIEW_HEADER,
/* ui region containing panels */
@@ -97,12 +99,12 @@ enum {
/* ------ Defines for Scrollers ----- */
-/* scroller thickness */
-#define V2D_SCROLL_HEIGHT 16
-#define V2D_SCROLL_WIDTH 16
+/* scroller area */
+#define V2D_SCROLL_HEIGHT 17
+#define V2D_SCROLL_WIDTH 17
-/* half the size (in pixels) of scroller 'handles' */
-#define V2D_SCROLLER_HANDLE_SIZE 5
+/* scroller 'handles' hotspot radius for mouse */
+#define V2D_SCROLLER_HANDLE_SIZE 12
/* ------ Define for UI_view2d_sync ----- */
@@ -143,10 +145,15 @@ typedef struct View2DScrollers View2DScrollers;
void UI_view2d_region_reinit(struct View2D *v2d, short type, int winx, int winy);
void UI_view2d_curRect_validate(struct View2D *v2d);
+void UI_view2d_curRect_validate_resize(struct View2D *v2d, int resize);
void UI_view2d_curRect_reset(struct View2D *v2d);
void UI_view2d_sync(struct bScreen *screen, struct ScrArea *sa, struct View2D *v2dcur, int flag);
void UI_view2d_totRect_set(struct View2D *v2d, int width, int height);
+void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, int resize);
+
+/* per tab offsets, returns 1 if tab changed */
+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);
diff --git a/source/blender/editors/interface/Makefile b/source/blender/editors/interface/Makefile
index a3d0692f1e1..5968660eb91 100644
--- a/source/blender/editors/interface/Makefile
+++ b/source/blender/editors/interface/Makefile
@@ -48,6 +48,7 @@ CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../makesrna
CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../blenfont
+CPPFLAGS += -I../../python
# own include
diff --git a/source/blender/editors/interface/SConscript b/source/blender/editors/interface/SConscript
index bac3742c12f..e44de5410f1 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -9,6 +9,7 @@ for source in env.Glob('*_api.c'):
incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../makesrna ../../windowmanager #/intern/guardedalloc'
incs += ' #/extern/glew/include'
+incs += ' ../../python/' # python button eval
defs = []
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 3a61237e1cb..1b05958b679 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -48,6 +48,7 @@
#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BKE_unit.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -66,6 +67,8 @@
#include "RNA_access.h"
#include "RNA_types.h"
+#include "BPY_extern.h"
+
#include "interface_intern.h"
#define MENU_WIDTH 120
@@ -222,6 +225,7 @@ static void ui_text_bounds_block(uiBlock *block, float offset)
uiStyle *style= U.uistyles.first; // XXX pass on as arg
uiBut *bt;
int i = 0, j, x1addval= offset, nextcol;
+ int lastcol= 0, col= 0;
uiStyleFontSet(&style->widget);
@@ -234,18 +238,26 @@ static void ui_text_bounds_block(uiBlock *block, float offset)
if(j > i) i = j;
}
+
+ if(bt->next && bt->x1 < bt->next->x1)
+ lastcol++;
}
/* cope with multi collumns */
bt= block->buttons.first;
while(bt) {
- if(bt->next && bt->x1 < bt->next->x1)
+ if(bt->next && bt->x1 < bt->next->x1) {
nextcol= 1;
+ col++;
+ }
else nextcol= 0;
bt->x1 = x1addval;
bt->x2 = bt->x1 + i + block->bounds;
+ if(col == lastcol)
+ bt->x2= MAX2(bt->x2, offset + block->minbounds);
+
ui_check_but(bt); // clips text again
if(nextcol)
@@ -278,7 +290,7 @@ void ui_bounds_block(uiBlock *block)
if(bt->x2 > block->maxx) block->maxx= bt->x2;
if(bt->y2 > block->maxy) block->maxy= bt->y2;
-
+
bt= bt->next;
}
@@ -288,6 +300,8 @@ void ui_bounds_block(uiBlock *block)
block->maxy += block->bounds;
}
+ block->maxx= block->minx + MAX2(block->maxx - block->minx, block->minbounds);
+
/* hardcoded exception... but that one is annoying with larger safety */
bt= block->buttons.first;
if(bt && strncmp(bt->str, "ERROR", 5)==0) xof= 10;
@@ -442,7 +456,7 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut)
if(but->retval != oldbut->retval) return 0;
if(but->rnapoin.data != oldbut->rnapoin.data) return 0;
if(but->rnaprop != oldbut->rnaprop)
- if(but->rnaindex != oldbut->rnaindex) return 0;
+ if(but->rnaindex != oldbut->rnaindex) return 0;
if(but->func != oldbut->func) return 0;
if(but->funcN != oldbut->funcN) return 0;
if(oldbut->func_arg1 != oldbut && but->func_arg1 != oldbut->func_arg1) return 0;
@@ -496,6 +510,43 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
return found;
}
+/* needed for temporarily rename buttons, such as in outliner or fileselect,
+ they should keep calling uiDefButs to keep them alive */
+/* returns 0 when button removed */
+int uiButActiveOnly(const bContext *C, uiBlock *block, uiBut *but)
+{
+ uiBlock *oldblock;
+ uiBut *oldbut;
+ int activate= 0, found= 0, isactive= 0;
+
+ oldblock= block->oldblock;
+ if(!oldblock)
+ activate= 1;
+ else {
+ for(oldbut=oldblock->buttons.first; oldbut; oldbut=oldbut->next) {
+ if(ui_but_equals_old(oldbut, but)) {
+ found= 1;
+
+ if(oldbut->active)
+ isactive= 1;
+
+ break;
+ }
+ }
+ }
+ if(activate || found==0) {
+ ui_button_activate_do( (bContext *)C, CTX_wm_region(C), but);
+ }
+ else if(found && isactive==0) {
+
+ BLI_remlink(&block->buttons, but);
+ ui_free_but(C, but);
+ return 0;
+ }
+
+ return 1;
+}
+
void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
{
uiBut *but;
@@ -546,7 +597,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
if(but->context)
CTX_store_set((bContext*)C, but->context);
- if(ot==NULL || (ot->poll && ot->poll((bContext *)C)==0)) {
+ if(ot == NULL || WM_operator_poll((bContext*)C, ot)==0) {
but->flag |= UI_BUT_DISABLED;
but->lock = 1;
}
@@ -571,7 +622,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
}
/* handle pending stuff */
- if(block->layouts.first) uiBlockLayoutResolve(C, block, NULL, NULL);
+ if(block->layouts.first) uiBlockLayoutResolve(block, NULL, NULL);
ui_block_do_align(block);
if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block);
@@ -702,8 +753,9 @@ static void ui_is_but_sel(uiBut *but)
case BUT:
push= 2;
break;
+ case HOTKEYEVT:
case KEYEVT:
- if (value==-1) push= 1;
+ push= 2;
break;
case TOGBUT:
case TOG:
@@ -720,6 +772,7 @@ static void ui_is_but_sel(uiBut *but)
if(value==0.0) push= 1;
break;
case ROW:
+ case LISTROW:
if(value == but->hardmax) push= 1;
break;
case COL:
@@ -1036,7 +1089,7 @@ void ui_get_but_vectorf(uiBut *but, float *vec)
vec[0]= vec[1]= vec[2]= 0.0f;
if(RNA_property_type(prop) == PROP_FLOAT) {
- tot= RNA_property_array_length(prop);
+ tot= RNA_property_array_length(&but->rnapoin, prop);
tot= MIN2(tot, 3);
for(a=0; a<tot; a++)
@@ -1070,7 +1123,7 @@ void ui_set_but_vectorf(uiBut *but, float *vec)
prop= but->rnaprop;
if(RNA_property_type(prop) == PROP_FLOAT) {
- tot= RNA_property_array_length(prop);
+ tot= RNA_property_array_length(&but->rnapoin, prop);
tot= MIN2(tot, 3);
for(a=0; a<tot; a++)
@@ -1100,6 +1153,21 @@ int ui_is_but_float(uiBut *but)
return 0;
}
+int ui_is_but_unit(uiBut *but)
+{
+ Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
+ if(scene->unit.system == USER_UNIT_NONE)
+ return 0;
+
+ if(but->rnaprop==NULL)
+ return 0;
+
+ if(RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop))==0)
+ return 0;
+
+ return 1;
+}
+
double ui_get_but_val(uiBut *but)
{
PropertyRNA *prop;
@@ -1113,19 +1181,19 @@ double ui_get_but_val(uiBut *but)
switch(RNA_property_type(prop)) {
case PROP_BOOLEAN:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
value= RNA_property_boolean_get_index(&but->rnapoin, prop, but->rnaindex);
else
value= RNA_property_boolean_get(&but->rnapoin, prop);
break;
case PROP_INT:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
value= RNA_property_int_get_index(&but->rnapoin, prop, but->rnaindex);
else
value= RNA_property_int_get(&but->rnapoin, prop);
break;
case PROP_FLOAT:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
value= RNA_property_float_get_index(&but->rnapoin, prop, but->rnaindex);
else
value= RNA_property_float_get(&but->rnapoin, prop);
@@ -1177,19 +1245,19 @@ void ui_set_but_val(uiBut *but, double value)
if(RNA_property_editable(&but->rnapoin, prop)) {
switch(RNA_property_type(prop)) {
case PROP_BOOLEAN:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
RNA_property_boolean_set_index(&but->rnapoin, prop, but->rnaindex, value);
else
RNA_property_boolean_set(&but->rnapoin, prop, value);
break;
case PROP_INT:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, value);
else
RNA_property_int_set(&but->rnapoin, prop, value);
break;
case PROP_FLOAT:
- if(RNA_property_array_length(prop))
+ if(RNA_property_array_length(&but->rnapoin, prop))
RNA_property_float_set_index(&but->rnapoin, prop, but->rnaindex, value);
else
RNA_property_float_set(&but->rnapoin, prop, value);
@@ -1266,6 +1334,55 @@ int ui_get_but_string_max_length(uiBut *but)
return UI_MAX_DRAW_STR;
}
+static double ui_get_but_scale_unit(uiBut *but, double value)
+{
+ Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
+ int subtype= RNA_property_subtype(but->rnaprop);
+
+ if(subtype & PROP_UNIT_LENGTH) {
+ return value * scene->unit.scale_length;
+ }
+ else if(subtype & PROP_UNIT_TIME) { /* WARNING - using evil_C :| */
+ return FRA2TIME(value);
+ }
+ else {
+ return value;
+ }
+}
+
+static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double value, int pad)
+{
+ 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 precission= but->a2;
+
+ if(scene->unit.scale_length<0.0001) scene->unit.scale_length= 1.0; // XXX do_versions
+
+ /* Sanity checks */
+ if(precission>4) precission= 4;
+ else if(precission==0) precission= 2;
+
+ bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precission, scene->unit.system, unit_type, do_split, pad);
+}
+
+static float ui_get_but_step_unit(uiBut *but, double value, 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));
+ float step;
+
+ step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, value), scene->unit.system, unit_type);
+
+ if(step > 0.0) { /* -1 is an error value */
+ return (step/ui_get_but_scale_unit(but, 1.0))*100;
+ }
+ else {
+ return step_default;
+ }
+}
+
+
void ui_get_but_string(uiBut *but, char *str, int maxlen)
{
if(but->rnaprop && ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
@@ -1312,14 +1429,19 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen)
BLI_strncpy(str, but->poin, maxlen);
return;
}
+ else if(ui_but_anim_expression_get(but, str, maxlen))
+ ; /* driver expression */
else {
- /* number */
+ /* number editing */
double value;
value= ui_get_but_val(but);
if(ui_is_but_float(but)) {
- if(but->a2) { /* amount of digits defined */
+ if(ui_is_but_unit(but)) {
+ ui_get_but_string_unit(but, str, maxlen, value, 0);
+ }
+ else if(but->a2) { /* amount of digits defined */
if(but->a2==1) BLI_snprintf(str, maxlen, "%.1f", value);
else if(but->a2==2) BLI_snprintf(str, maxlen, "%.2f", value);
else if(but->a2==3) BLI_snprintf(str, maxlen, "%.3f", value);
@@ -1384,17 +1506,38 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
BLI_strncpy(but->poin, str, but->hardmax);
return 1;
}
+ else if(ui_but_anim_expression_set(but, str)) {
+ /* driver expression */
+ return 1;
+ }
else {
+ /* number editing */
double value;
- /* XXX 2.50 missing python api */
-#if 0
- if(BPY_button_eval(str, &value)) {
- BKE_report(CTX_reports(C), RPT_WARNING, "Invalid Python expression, check console");
- value = 0.0f; /* Zero out value on error */
-
- if(str[0])
- return 0;
+#ifndef DISABLE_PYTHON
+ {
+ char str_unit_convert[256];
+ int unit_type;
+ 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(scene->unit.system != USER_UNIT_NONE && unit_type) {
+ /* 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);
+ }
+
+ if(BPY_button_eval(C, str_unit_convert, &value)) {
+ value = ui_get_but_val(but); /* use its original value */
+
+ if(str[0])
+ return 0;
+ }
}
#else
value= atof(str);
@@ -1541,6 +1684,9 @@ void uiFreeBlock(const bContext *C, uiBlock *block)
ui_free_but(C, but);
}
+ if(block->func_argN)
+ MEM_freeN(block->func_argN);
+
CTX_store_free_list(&block->contexts);
BLI_freelistN(&block->saferct);
@@ -1615,6 +1761,7 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor
block= MEM_callocN(sizeof(uiBlock), "uiBlock");
block->active= 1;
block->dt= dt;
+ block->evil_C= (void*)C; // XXX
BLI_strncpy(block->name, name, sizeof(block->name));
if(region)
@@ -1739,6 +1886,12 @@ void ui_check_but(uiBut *but)
if(ui_is_but_float(but)) {
if(value == FLT_MAX) sprintf(but->drawstr, "%sinf", but->str);
else if(value == -FLT_MAX) sprintf(but->drawstr, "%s-inf", but->str);
+ /* support length type buttons */
+ else if(ui_is_but_unit(but)) {
+ char new_str[sizeof(but->drawstr)];
+ ui_get_but_string_unit(but, new_str, sizeof(new_str), value, TRUE);
+ BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%s", but->str, new_str);
+ }
else if(but->a2) { /* amount of digits defined */
if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value);
else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value);
@@ -1800,7 +1953,33 @@ void ui_check_but(uiBut *but)
strcat(but->drawstr, WM_key_event_string((short) ui_get_but_val(but)));
}
break;
-
+
+ case HOTKEYEVT:
+ if (but->flag & UI_SELECT) {
+ short *sp= (short *)but->func_arg3;
+
+ strcpy(but->drawstr, but->str);
+
+ if(*sp) {
+ char *str= but->drawstr;
+
+ if(*sp & KM_SHIFT)
+ str= strcat(str, "Shift ");
+ if(*sp & KM_CTRL)
+ str= strcat(str, "Ctrl ");
+ if(*sp & KM_ALT)
+ str= strcat(str, "Alt ");
+ if(*sp & KM_OSKEY)
+ str= strcat(str, "Cmd ");
+ }
+ else
+ strcat(but->drawstr, "Press a key ");
+ } else {
+ /* XXX todo, button currently only used temporarily */
+ strcpy(but->drawstr, WM_key_event_string((short) ui_get_but_val(but)));
+ }
+ break;
+
case BUT_TOGDUAL:
/* trying to get the dual-icon to left of text... not very nice */
if(but->str[0]) {
@@ -1814,10 +1993,8 @@ void ui_check_but(uiBut *but)
}
/* if we are doing text editing, this will override the drawstr */
- if(but->editstr) {
- strcpy(but->drawstr, but->str);
- strcat(but->drawstr, but->editstr);
- }
+ if(but->editstr)
+ strcpy(but->drawstr, but->editstr);
/* text clipping moved to widget drawing code itself */
}
@@ -2058,6 +2235,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
but->func= block->func;
but->func_arg1= block->func_arg1;
but->func_arg2= block->func_arg2;
+
+ but->funcN= block->funcN;
+ if(block->func_argN)
+ but->func_argN= MEM_dupallocN(block->func_argN);
but->pos= -1; /* cursor invisible */
@@ -2077,13 +2258,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
rgb_to_hsv(rgb[0], rgb[1], rgb[2], but->hsv, but->hsv+1, but->hsv+2);
}
- if((block->flag & UI_BLOCK_LOOP) || ELEM7(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU)) {
- but->flag |= UI_TEXT_LEFT;
- }
-
- if(but->type==BUT_TOGDUAL) {
+ if((block->flag & UI_BLOCK_LOOP) || ELEM7(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU))
+ but->flag |= (UI_TEXT_LEFT|UI_ICON_LEFT);
+ else if(but->type==BUT_TOGDUAL)
but->flag |= UI_ICON_LEFT;
- }
but->flag |= (block->flag & UI_BUT_ALIGN);
@@ -2093,6 +2271,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));
+ else if(ELEM5(but->type, SCROLL, SEPR, LINK, INLINK, FTPREVIEW));
+ else but->flag |= UI_BUT_UNDO;
+
BLI_addtail(&block->buttons, but);
if(block->curlayout)
@@ -2116,17 +2298,23 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
/* use rna values if parameters are not specified */
if(!str) {
if(type == MENU && proptype == PROP_ENUM) {
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
DynStr *dynstr;
- int i, totitem, value;
+ int i, totitem, value, free;
- RNA_property_enum_items(ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
value= RNA_property_enum_get(ptr, prop);
dynstr= BLI_dynstr_new();
BLI_dynstr_appendf(dynstr, "%s%%t", RNA_property_ui_name(prop));
for(i=0; i<totitem; i++) {
- if(item[i].icon)
+ if(!item[i].identifier[0]) {
+ if(item[i].name)
+ BLI_dynstr_appendf(dynstr, "|%s%%l", item[i].name);
+ else
+ BLI_dynstr_append(dynstr, "|%l");
+ }
+ else if(item[i].icon)
BLI_dynstr_appendf(dynstr, "|%s %%i%d %%x%d", item[i].name, item[i].icon, item[i].value);
else
BLI_dynstr_appendf(dynstr, "|%s %%x%d", item[i].name, item[i].value);
@@ -2137,15 +2325,18 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
str= BLI_dynstr_get_cstring(dynstr);
BLI_dynstr_free(dynstr);
+ if(free)
+ MEM_freeN(item);
+
freestr= 1;
}
- else if(type == ROW && proptype == PROP_ENUM) {
- const EnumPropertyItem *item;
- int i, totitem;
+ else if(ELEM(type, ROW, LISTROW) && proptype == PROP_ENUM) {
+ EnumPropertyItem *item;
+ int i, totitem, free;
- RNA_property_enum_items(ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
for(i=0; i<totitem; i++) {
- if(item[i].value == (int)max) {
+ if(item[i].identifier[0] && item[i].value == (int)max) {
str= (char*)item[i].name;
icon= item[i].icon;
}
@@ -2153,6 +2344,8 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
if(!str)
str= (char*)RNA_property_ui_name(prop);
+ if(free)
+ MEM_freeN(item);
}
else {
str= (char*)RNA_property_ui_name(prop);
@@ -2162,18 +2355,21 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
if(!tip) {
if(type == ROW && proptype == PROP_ENUM) {
- const EnumPropertyItem *item;
- int i, totitem;
+ EnumPropertyItem *item;
+ int i, totitem, free;
- RNA_property_enum_items(ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
for(i=0; i<totitem; i++) {
- if(item[i].value == (int)max) {
+ if(item[i].identifier[0] && item[i].value == (int)max) {
if(item[i].description[0])
tip= (char*)item[i].description;
break;
}
}
+
+ if(free)
+ MEM_freeN(item);
}
}
@@ -2187,7 +2383,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
RNA_property_int_range(ptr, prop, &hardmin, &hardmax);
RNA_property_int_ui_range(ptr, prop, &softmin, &softmax, &step);
- if(min == max) {
+ if(!ELEM(type, ROW, LISTROW) && min == max) {
min= hardmin;
max= hardmax;
}
@@ -2202,7 +2398,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
RNA_property_float_range(ptr, prop, &hardmin, &hardmax);
RNA_property_float_ui_range(ptr, prop, &softmin, &softmax, &step, &precision);
- if(min == max) {
+ if(!ELEM(type, ROW, LISTROW) && min == max) {
min= hardmin;
max= hardmax;
}
@@ -2229,7 +2425,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
but->rnapoin= *ptr;
but->rnaprop= prop;
- if(RNA_property_array_length(but->rnaprop))
+ if(RNA_property_array_length(&but->rnapoin, but->rnaprop))
but->rnaindex= index;
else
but->rnaindex= 0;
@@ -2247,6 +2443,10 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
but->lockstr = "";
}
+ /* If this button uses units, calculate the step from this */
+ if(ui_is_but_unit(but))
+ but->a1= ui_get_but_step_unit(but, ui_get_but_val(but), but->a1);
+
if(freestr)
MEM_freeN(str);
@@ -2258,7 +2458,7 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext
uiBut *but;
wmOperatorType *ot;
- ot= WM_operatortype_find(opname);
+ ot= WM_operatortype_find(opname, 0);
if(!str) {
if(ot) str= ot->name;
@@ -2622,26 +2822,6 @@ uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext,
return but;
}
-static int ui_menu_y(uiBlock *block)
-{
- uiBut *but= block->buttons.last;
-
- if(but) return but->y1;
- else return 0;
-}
-
-uiBut *uiDefMenuButO(uiBlock *block, char *opname, char *name)
-{
- int y= ui_menu_y(block) - MENU_ITEM_HEIGHT;
- return uiDefIconTextButO(block, BUT, opname, WM_OP_INVOKE_REGION_WIN, ICON_BLANK1, name, 0, y, MENU_WIDTH, MENU_ITEM_HEIGHT-1, NULL);
-}
-
-uiBut *uiDefMenuSep(uiBlock *block)
-{
- int y= ui_menu_y(block) - MENU_SEP_HEIGHT;
- return uiDefBut(block, SEPR, 0, "", 0, y, MENU_WIDTH, MENU_SEP_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
-}
-
/* END Button containing both string label and icon */
void uiSetButLink(uiBut *but, void **poin, void ***ppoin, short *tot, int from, int to)
@@ -2685,6 +2865,8 @@ void uiBlockFlipOrder(uiBlock *block)
if(U.uiflag & USER_MENUFIXEDORDER)
return;
+ else if(block->flag & UI_BLOCK_NO_FLIP)
+ return;
for(but= block->buttons.first; but; but= but->next) {
if(but->flag & UI_BUT_ALIGN) return;
@@ -2771,14 +2953,27 @@ void uiBlockSetFunc(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2
block->func_arg2= arg2;
}
-void uiBlockSetRenameFunc(uiBlock *block, uiButHandleRenameFunc func, void *arg1)
+void uiBlockSetNFunc(uiBlock *block, uiButHandleFunc func, void *argN, void *arg2)
{
-
+ if(block->func_argN)
+ MEM_freeN(block->func_argN);
+
+ block->funcN= func;
+ block->func_argN= argN;
+ block->func_arg2= arg2;
+}
+
+void uiButSetRenameFunc(uiBut *but, uiButHandleRenameFunc func, void *arg1)
+{
+ but->rename_func= func;
+ but->rename_arg1= arg1;
}
-void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const bContext *C, void *idv, rcti *rect))
+void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const bContext *C, void *idv, void *arg1, void *arg2, rcti *rect), void *arg1, void *arg2)
{
block->drawextra= func;
+ block->drawextra_arg1= arg1;
+ block->drawextra_arg2= arg2;
}
void uiButSetFunc(uiBut *but, uiButHandleFunc func, void *arg1, void *arg2)
@@ -2790,6 +2985,9 @@ void uiButSetFunc(uiBut *but, uiButHandleFunc func, void *arg1, void *arg2)
void uiButSetNFunc(uiBut *but, uiButHandleNFunc funcN, void *argN, void *arg2)
{
+ if(but->func_argN)
+ MEM_freeN(but->func_argN);
+
but->funcN= funcN;
but->func_argN= argN;
but->func_arg2= arg2;
@@ -2826,6 +3024,8 @@ uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *
{
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;
+ if(but->func_argN)
+ MEM_freeN(but->func_argN);
but->func_argN= argN;
ui_check_but(but);
return but;
@@ -2892,7 +3092,6 @@ uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int
but->flag|= UI_HAS_ICON;
but->flag|= UI_ICON_LEFT;
- but->flag|= UI_ICON_SUBMENU;
but->block_create_func= func;
ui_check_but(but);
@@ -2900,12 +3099,24 @@ uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int
return but;
}
-void 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, char *str, short x1, short y1, short x2, short y2, short *spoin, 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);
+ return but;
+}
+
+/* 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 *but= ui_def_but(block, HOTKEYEVT|SHO, retval, str, x1, y1, x2, y2, keypoin, 0.0, 0.0, 0.0, 0.0, tip);
+ but->func_arg3= modkeypoin; /* XXX hrmf, abuse! */
+ ui_check_but(but);
+ return but;
}
+
/* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */
uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip)
{
@@ -2922,15 +3133,15 @@ uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxle
}
/* arg is user value, searchfunc and handlefunc both get it as arg */
-void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandleFunc bfunc)
+/* if active set, button opens with this item visible and selected */
+void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandleFunc bfunc, void *active)
{
but->search_func= sfunc;
but->search_arg= arg;
- uiButSetFunc(but, bfunc, arg, NULL);
+ uiButSetFunc(but, bfunc, arg, active);
}
-
/* Program Init/Exit */
void UI_init(void)
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index 4a26db29160..8c41726b81b 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -10,6 +10,7 @@
#include "DNA_screen_types.h"
#include "BLI_listbase.h"
+#include "BLI_string.h"
#include "BKE_animsys.h"
#include "BKE_context.h"
@@ -18,6 +19,8 @@
#include "RNA_access.h"
#include "RNA_types.h"
+#include "ED_keyframing.h"
+
#include "UI_interface.h"
#include "WM_api.h"
@@ -25,46 +28,137 @@
#include "interface_intern.h"
-void ui_but_anim_flag(uiBut *but, float cfra)
+static FCurve *ui_but_get_fcurve(uiBut *but, bAction **action, int *driven)
{
- but->flag &= ~(UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN);
+ FCurve *fcu= NULL;
- if(but->rnaprop && but->rnapoin.id.data) {
+ *driven= 0;
+
+ /* there must be some RNA-pointer + property combo for this button */
+ if(but->rnaprop && but->rnapoin.id.data &&
+ RNA_property_animateable(&but->rnapoin, but->rnaprop))
+ {
AnimData *adt= BKE_animdata_from_id(but->rnapoin.id.data);
- FCurve *fcu;
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(&but->rnapoin, but->rnaprop);
-
- 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, but->rnaindex);
-
- if (fcu) {
- but->flag |= UI_BUT_ANIMATED;
-
- if (on_keyframe_fcurve(fcu, cfra))
- but->flag |= UI_BUT_ANIMATED_KEY;
- }
- }
/* if not animated, check if driven */
- if ((but->flag & UI_BUT_ANIMATED)==0 && (adt->drivers.first)) {
+ if(!fcu && (adt->drivers.first)) {
fcu= list_find_fcurve(&adt->drivers, path, but->rnaindex);
- if (fcu)
- but->flag |= UI_BUT_DRIVEN;
+ if(fcu)
+ *driven= 1;
}
-
+
+ if(fcu && action)
+ *action= adt->action;
+
MEM_freeN(path);
}
}
}
}
+
+ return fcu;
+}
+
+void ui_but_anim_flag(uiBut *but, float cfra)
+{
+ FCurve *fcu;
+ int driven;
+
+ but->flag &= ~(UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN);
+
+ fcu= ui_but_get_fcurve(but, NULL, &driven);
+
+ if(fcu) {
+ if(!driven) {
+ but->flag |= UI_BUT_ANIMATED;
+
+ if(fcurve_frame_has_keyframe(fcu, cfra, 0))
+ but->flag |= UI_BUT_ANIMATED_KEY;
+ }
+ else {
+ but->flag |= UI_BUT_DRIVEN;
+ }
+ }
+}
+
+int ui_but_anim_expression_get(uiBut *but, char *str, int maxlen)
+{
+ FCurve *fcu;
+ ChannelDriver *driver;
+ int driven;
+
+ fcu= ui_but_get_fcurve(but, NULL, &driven);
+
+ if(fcu && driven) {
+ driver= fcu->driver;
+
+ if(driver && driver->type == DRIVER_TYPE_PYTHON) {
+ BLI_strncpy(str, driver->expression, maxlen);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int ui_but_anim_expression_set(uiBut *but, const char *str)
+{
+ FCurve *fcu;
+ ChannelDriver *driver;
+ int driven;
+
+ fcu= ui_but_get_fcurve(but, NULL, &driven);
+
+ if(fcu && driven) {
+ driver= fcu->driver;
+
+ if(driver && driver->type == DRIVER_TYPE_PYTHON) {
+ BLI_strncpy(driver->expression, str, sizeof(driver->expression));
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void ui_but_anim_autokey(uiBut *but, Scene *scene, float cfra)
+{
+ ID *id;
+ bAction *action;
+ FCurve *fcu;
+ int driven;
+
+ fcu= ui_but_get_fcurve(but, &action, &driven);
+
+ if(fcu && !driven) {
+ id= but->rnapoin.id.data;
+
+ if(autokeyframe_cfra_can_key(scene, id)) {
+ short flag = 0;
+
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ flag |= INSERTKEY_NEEDED;
+ if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ flag |= INSERTKEY_MATRIX;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+ flag |= INSERTKEY_REPLACE;
+
+ fcu->flag &= ~FCURVE_SELECTED;
+ insert_keyframe(id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ }
+ }
}
void uiAnimContextProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
@@ -73,6 +167,10 @@ void uiAnimContextProperty(const bContext *C, struct PointerRNA *ptr, struct Pro
uiBlock *block;
uiBut *but;
+ memset(ptr, 0, sizeof(*ptr));
+ *prop= NULL;
+ *index= 0;
+
if(ar) {
for(block=ar->uiblocks.first; block; block=block->next) {
for(but=block->buttons.first; but; but= but->next) {
@@ -111,7 +209,18 @@ void ui_but_anim_remove_driver(bContext *C)
WM_operator_name_call(C, "ANIM_OT_remove_driver_button", WM_OP_INVOKE_DEFAULT, NULL);
}
-// TODO: refine the logic for adding/removing drivers...
+void ui_but_anim_add_keyingset(bContext *C)
+{
+ /* this operator calls uiAnimContextProperty above */
+ WM_operator_name_call(C, "ANIM_OT_add_keyingset_button", WM_OP_INVOKE_DEFAULT, NULL);
+}
+
+void ui_but_anim_remove_keyingset(bContext *C)
+{
+ /* this operator calls uiAnimContextProperty above */
+ WM_operator_name_call(C, "ANIM_OT_remove_keyingset_button", WM_OP_INVOKE_DEFAULT, NULL);
+}
+
void ui_but_anim_menu(bContext *C, uiBut *but)
{
uiPopupMenu *pup;
@@ -122,7 +231,7 @@ void ui_but_anim_menu(bContext *C, uiBut *but)
pup= uiPupMenuBegin(C, RNA_property_ui_name(but->rnaprop), 0);
layout= uiPupMenuLayout(pup);
- length= RNA_property_array_length(but->rnaprop);
+ length= RNA_property_array_length(&but->rnapoin, but->rnaprop);
if(but->flag & UI_BUT_ANIMATED_KEY) {
if(length) {
@@ -136,6 +245,7 @@ void ui_but_anim_menu(bContext *C, uiBut *but)
uiItemBooleanO(layout, "Delete Keyframe", 0, "ANIM_OT_delete_keyframe_button", "all", 0);
}
}
+ else if(but->flag & UI_BUT_DRIVEN);
else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
if(length) {
uiItemBooleanO(layout, "Insert Keyframes", 0, "ANIM_OT_insert_keyframe_button", "all", 1);
@@ -149,22 +259,37 @@ void ui_but_anim_menu(bContext *C, uiBut *but)
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 1);
- uiItemBooleanO(layout, "Remove Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Drivers", 0, "ANIM_OT_remove_driver_button", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
}
else
- uiItemBooleanO(layout, "Remove Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Driver", 0, "ANIM_OT_remove_driver_button", "all", 0);
}
+ else if(but->flag & UI_BUT_ANIMATED_KEY);
else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 1);
+ uiItemBooleanO(layout, "Add Drivers", 0, "ANIM_OT_add_driver_button", "all", 1);
uiItemBooleanO(layout, "Add Single Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
}
else
uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_add_driver_button", "all", 0);
}
+
+ if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ uiItemS(layout);
+
+ if(length) {
+ uiItemBooleanO(layout, "Add All to Keying Set", 0, "ANIM_OT_add_keyingset_button", "all", 1);
+ uiItemBooleanO(layout, "Add Single to Keying Set", 0, "ANIM_OT_add_keyingset_button", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_remove_keyingset_button");
+ }
+ else {
+ uiItemBooleanO(layout, "Add to Keying Set", 0, "ANIM_OT_add_keyingset_button", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_remove_keyingset_button");
+ }
+ }
uiPupMenuEnd(C, pup);
}
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 8400fee0c55..cded4753f61 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -788,7 +788,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
glGetMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
/* backdrop */
- glColor3ubv(wcol->inner);
+ glColor3ubv((unsigned char*)wcol->inner);
uiSetRoundBox(15);
gl_round_box(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f);
@@ -852,7 +852,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* AA circle */
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH );
- glColor3ubv(wcol->inner);
+ glColor3ubv((unsigned char*)wcol->inner);
glutil_draw_lined_arc(0.0f, M_PI*2.0, 100.0f, 32);
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH );
@@ -926,14 +926,14 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
if(cumap->flag & CUMA_DO_CLIP) {
glColor3ubvShade(wcol->inner, -20);
glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- glColor3ubv(wcol->inner);
+ glColor3ubv((unsigned char*)wcol->inner);
glRectf(rect->xmin + zoomx*(cumap->clipr.xmin-offsx),
rect->ymin + zoomy*(cumap->clipr.ymin-offsy),
rect->xmin + zoomx*(cumap->clipr.xmax-offsx),
rect->ymin + zoomy*(cumap->clipr.ymax-offsy));
}
else {
- glColor3ubv(wcol->inner);
+ glColor3ubv((unsigned char*)wcol->inner);
glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
}
@@ -989,7 +989,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
}*/
/* the curve */
- glColor3ubv(wcol->item);
+ glColor3ubv((unsigned char*)wcol->item);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBegin(GL_LINE_STRIP);
@@ -1043,7 +1043,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
/* outline */
- glColor3ubv(wcol->outline);
+ glColor3ubv((unsigned char*)wcol->outline);
fdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
}
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 5049fc0b130..b5de855cb80 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -32,6 +32,7 @@
#include "DNA_color_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
@@ -49,6 +50,7 @@
#include "BKE_utildefines.h"
#include "ED_screen.h"
+#include "ED_util.h"
#include "UI_interface.h"
@@ -112,6 +114,9 @@ typedef struct uiHandleButtonData {
/* tooltip */
ARegion *tooltip;
wmTimer *tooltiptimer;
+
+ /* auto open */
+ int used_mouse;
wmTimer *autoopentimer;
/* text selection/editing */
@@ -147,6 +152,10 @@ typedef struct uiAfterFunc {
uiButHandleNFunc funcN;
void *func_argN;
+ uiButHandleRenameFunc rename_func;
+ void *rename_arg1;
+ void *rename_orig;
+
uiBlockHandleFunc handle_func;
void *handle_func_arg;
int retval;
@@ -163,6 +172,10 @@ typedef struct uiAfterFunc {
PropertyRNA *rnaprop;
bContextStore *context;
+
+ char undostr[512];
+
+ int autokey;
} uiAfterFunc;
static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y);
@@ -171,6 +184,7 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata);
static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata);
static void ui_handler_remove_popup(bContext *C, void *userdata);
static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type);
+static void button_timers_tooltip_remove(bContext *C, uiBut *but);
/* ******************** menu navigation helpers ************** */
@@ -178,7 +192,7 @@ static uiBut *ui_but_prev(uiBut *but)
{
while(but->prev) {
but= but->prev;
- if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+ if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
}
return NULL;
}
@@ -187,7 +201,7 @@ static uiBut *ui_but_next(uiBut *but)
{
while(but->next) {
but= but->next;
- if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+ if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
}
return NULL;
}
@@ -198,7 +212,7 @@ static uiBut *ui_but_first(uiBlock *block)
but= block->buttons.first;
while(but) {
- if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+ if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
but= but->next;
}
return NULL;
@@ -210,7 +224,7 @@ static uiBut *ui_but_last(uiBlock *block)
but= block->buttons.last;
while(but) {
- if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+ if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
but= but->prev;
}
return NULL;
@@ -229,10 +243,16 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
* handling is done, i.e. menus are closed, in order to avoid conflicts
* with these functions removing the buttons we are working with */
- if(but->func || but->funcN || block->handle_func || (but->type == BUTM && block->butm_func) || but->optype || but->rnaprop) {
+ if(but->func || but->funcN || block->handle_func || but->rename_func || (but->type == BUTM && block->butm_func) || but->optype || but->rnaprop) {
after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc");
- after->func= but->func;
+ if(but->func && ELEM(but, but->func_arg1, but->func_arg2)) {
+ /* exception, this will crash due to removed button otherwise */
+ but->func(C, but->func_arg1, but->func_arg2);
+ }
+ else
+ after->func= but->func;
+
after->func_arg1= but->func_arg1;
after->func_arg2= but->func_arg2;
after->func_arg3= but->func_arg3;
@@ -240,6 +260,10 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
after->funcN= but->funcN;
after->func_argN= but->func_argN;
+ after->rename_func= but->rename_func;
+ after->rename_arg1= but->rename_arg1;
+ after->rename_orig= but->rename_orig; /* needs free! */
+
after->handle_func= block->handle_func;
after->handle_func_arg= block->handle_func_arg;
after->retval= but->retval;
@@ -268,9 +292,35 @@ static void ui_apply_but_func(bContext *C, uiBut *but)
}
}
+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) {
+ /* 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) {
+ after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc");
+ BLI_strncpy(after->undostr, str, sizeof(after->undostr));
+ BLI_addtail(&UIAfterFuncs, after);
+ }
+
+ /* try autokey */
+ ui_but_anim_autokey(but, scene, scene->r.cfra);
+}
+
static void ui_apply_but_funcs_after(bContext *C)
{
uiAfterFunc *afterf, after;
+ PointerRNA opptr;
ListBase funcs;
/* copy to avoid recursive calls */
@@ -284,23 +334,18 @@ static void ui_apply_but_funcs_after(bContext *C)
if(after.context)
CTX_store_set(C, after.context);
- if(after.func)
- after.func(C, after.func_arg1, after.func_arg2);
- if(after.funcN)
- after.funcN(C, after.func_argN, after.func_arg2);
-
- if(after.handle_func)
- after.handle_func(C, after.handle_func_arg, after.retval);
- if(after.butm_func)
- after.butm_func(C, after.butm_func_arg, after.a2);
-
- if(after.optype)
- WM_operator_name_call(C, after.optype->idname, after.opcontext, after.opptr);
if(after.opptr) {
- WM_operator_properties_free(after.opptr);
+ /* free in advance to avoid leak on exit */
+ opptr= *after.opptr,
MEM_freeN(after.opptr);
}
+ if(after.optype)
+ WM_operator_name_call(C, after.optype->idname, after.opcontext, (after.opptr)? &opptr: NULL);
+
+ if(after.opptr)
+ WM_operator_properties_free(&opptr);
+
if(after.rnapoin.data)
RNA_property_update(C, &after.rnapoin, after.rnaprop);
@@ -308,6 +353,24 @@ static void ui_apply_but_funcs_after(bContext *C)
CTX_store_set(C, NULL);
CTX_store_free(after.context);
}
+
+ if(after.func)
+ after.func(C, after.func_arg1, after.func_arg2);
+ if(after.funcN)
+ after.funcN(C, after.func_argN, after.func_arg2);
+
+ if(after.handle_func)
+ after.handle_func(C, after.handle_func_arg, after.retval);
+ if(after.butm_func)
+ after.butm_func(C, after.butm_func_arg, after.a2);
+
+ if(after.rename_func)
+ after.rename_func(C, after.rename_arg1, after.rename_orig);
+ if(after.rename_orig)
+ MEM_freeN(after.rename_orig);
+
+ if(after.undostr[0])
+ ED_undo_push(C, after.undostr);
}
}
@@ -410,7 +473,7 @@ static void ui_apply_but_ROW(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
/* states of other row buttons */
for(bt= block->buttons.first; bt; bt= bt->next)
- if(bt!=but && bt->poin==but->poin && bt->type==ROW)
+ if(bt!=but && bt->poin==but->poin && ELEM(bt->type, ROW, LISTROW))
ui_check_but(bt);
ui_apply_but_func(C, but);
@@ -429,10 +492,10 @@ static void ui_apply_but_TEX(bContext *C, uiBut *but, uiHandleButtonData *data)
/* give butfunc the original text too */
/* feature used for bone renaming, channels, etc */
- /* XXX goes via uiButHandleRenameFunc now */
-// if(but->func_arg2==NULL) but->func_arg2= data->origstr;
+ /* afterfunc frees origstr */
+ but->rename_orig= data->origstr;
+ data->origstr= NULL;
ui_apply_but_func(C, but);
-// if(but->func_arg2==data->origstr) but->func_arg2= NULL;
data->retval= but->retval;
data->applied= 1;
@@ -620,7 +683,11 @@ static void ui_add_link(uiBut *from, uiBut *to)
return;
}
- if (from->type==LINK && to->type==INLINK) {
+ if (from->type==INLINK && to->type==INLINK) {
+ printf("cannot link\n");
+ return;
+ }
+ else if (from->type==LINK && to->type==INLINK) {
if( from->link->tocode != (int)to->hardmin ) {
printf("cannot link\n");
return;
@@ -743,6 +810,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
ui_apply_but_TOG(C, block, but, data);
break;
case ROW:
+ case LISTROW:
ui_apply_but_ROW(C, block, but, data);
break;
case SCROLL:
@@ -787,6 +855,10 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
ui_apply_but_CHARTAB(C, but, data);
break;
#endif
+ case KEYEVT:
+ case HOTKEYEVT:
+ ui_apply_but_BUT(C, but, data);
+ break;
case LINK:
case INLINK:
ui_apply_but_LINK(C, but, data);
@@ -905,6 +977,20 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
}
+ /* operator button (any type) */
+ else if (but->optype) {
+ if(mode=='c') {
+ PointerRNA *opptr;
+ char *str;
+ opptr= uiButGetOperatorPtrRNA(but); /* allocated when needed, the button owns it */
+
+ str= WM_operator_pystring(C, but->optype, opptr, 0);
+
+ WM_clipboard_text_set(str, 0);
+
+ MEM_freeN(str);
+ }
+ }
}
/* ************* in-button text selection/editing ************* */
@@ -989,15 +1075,17 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho
/* XXX solve generic */
if(but->type==NUM || but->type==NUMSLI)
- startx += 20;
+ startx += (int)(0.5f*(but->y2 - but->y1));
+ else if(but->type==TEX)
+ startx += 5;
+ /* XXX does not take zoom level into account */
while((BLF_width(origstr+but->ofs) + startx) > x) {
if (but->pos <= 0) break;
but->pos--;
origstr[but->pos+but->ofs] = 0;
}
- but->pos -= strlen(but->str);
but->pos += but->ofs;
if(but->pos<0) but->pos= 0;
@@ -1321,7 +1409,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
but->editstr= data->str;
but->pos= strlen(data->str);
but->selsta= 0;
- but->selend= strlen(but->drawstr) - strlen(but->str);
+ but->selend= strlen(data->str);
/* optional searchbox */
if(but->type==SEARCH_MENU) {
@@ -1353,21 +1441,25 @@ static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
uiBut *but;
/* label and roundbox can overlap real buttons (backdrops...) */
- if(actbut->type==LABEL && actbut->type==ROUNDBOX)
+ if(ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
return;
for(but= actbut->next; but; but= but->next) {
if(ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
- data->postbut= but;
- data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
- return;
+ if(!(but->flag & UI_BUT_DISABLED)) {
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
+ return;
+ }
}
}
for(but= block->buttons.first; but!=actbut; but= but->next) {
if(ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
- data->postbut= but;
- data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
- return;
+ if(!(but->flag & UI_BUT_DISABLED)) {
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
+ return;
+ }
}
}
}
@@ -1377,21 +1469,25 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
uiBut *but;
/* label and roundbox can overlap real buttons (backdrops...) */
- if(actbut->type==LABEL && actbut->type==ROUNDBOX)
+ if(ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
return;
for(but= actbut->prev; but; but= but->prev) {
if(ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
- data->postbut= but;
- data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
- return;
+ if(!(but->flag & UI_BUT_DISABLED)) {
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
+ return;
+ }
}
}
for(but= block->buttons.last; but!=actbut; but= but->prev) {
if(ELEM7(but->type, TEX, NUM, NUMABS, NUMSLI, HSVSLI, IDPOIN, SEARCH_MENU)) {
- data->postbut= but;
- data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
- return;
+ if(!(but->flag & UI_BUT_DISABLED)) {
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_TEXT_EDITING;
+ return;
+ }
}
}
}
@@ -1399,7 +1495,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
- int mx, my, changed= 0, inbox=0, retval= WM_UI_HANDLER_CONTINUE;
+ int mx, my, changed= 0, inbox=0, update= 0, retval= WM_UI_HANDLER_CONTINUE;
switch(event->type) {
case WHEELUPMOUSE:
@@ -1514,6 +1610,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
/* there is a key conflict here, we can't tab with autocomplete */
if(but->autocomplete_func || data->searchbox) {
changed= ui_textedit_autocomplete(C, but, data);
+ update= 1; /* do live update for tab key */
retval= WM_UI_HANDLER_BREAK;
}
/* the hotkey here is not well defined, was G.qual so we check all */
@@ -1536,7 +1633,8 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
}
if(changed) {
- if(data->interactive) ui_apply_button(C, block, but, data, 1);
+ /* only update when typing for TAB key */
+ if(update && data->interactive) ui_apply_button(C, block, but, data, 1);
else ui_check_but(but);
if(data->searchbox)
@@ -1562,7 +1660,7 @@ static void ui_do_but_textedit_select(bContext *C, uiBlock *block, uiBut *but, u
break;
}
case LEFTMOUSE:
- if(event->val == 0)
+ if(event->val == KM_RELEASE)
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
retval= WM_UI_HANDLER_BREAK;
break;
@@ -1640,6 +1738,7 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
uiBlockCreateFunc func= NULL;
uiBlockHandleCreateFunc handlefunc= NULL;
uiMenuCreateFunc menufunc= NULL;
+ char *menustr= NULL;
void *arg= NULL;
switch(but->type) {
@@ -1664,16 +1763,15 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
data->value= data->origvalue;
but->editval= &data->value;
- handlefunc= ui_block_func_MENU;
- arg= but;
+ menustr= but->str;
}
break;
case ICONROW:
- handlefunc= ui_block_func_ICONROW;
+ menufunc= ui_block_func_ICONROW;
arg= but;
break;
case ICONTEXTROW:
- handlefunc= ui_block_func_ICONTEXTROW;
+ menufunc= ui_block_func_ICONTEXTROW;
arg= but;
break;
case COL:
@@ -1691,8 +1789,8 @@ static void ui_blockopen_begin(bContext *C, uiBut *but, uiHandleButtonData *data
if(but->block->handle)
data->menu->popup= but->block->handle->popup;
}
- else if(menufunc) {
- data->menu= ui_popup_menu_create(C, data->region, but, menufunc, arg);
+ else if(menufunc || menustr) {
+ data->menu= ui_popup_menu_create(C, data->region, but, menufunc, arg, menustr);
if(but->block->handle)
data->menu->popup= but->block->handle->popup;
}
@@ -1746,20 +1844,77 @@ static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEv
return WM_UI_HANDLER_CONTINUE;
}
-static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
if(data->state == BUTTON_STATE_HIGHLIGHT) {
if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
+ but->drawstr[0]= 0;
button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
return WM_UI_HANDLER_BREAK;
}
}
else if(data->state == BUTTON_STATE_WAIT_KEY_EVENT) {
+ short *sp= (short *)but->func_arg3;
+
+ if(event->type == MOUSEMOVE)
+ return WM_UI_HANDLER_CONTINUE;
+
+ if(ELEM(event->type, ESCKEY, LEFTMOUSE)) {
+ /* data->cancel doesnt work, this button opens immediate */
+ ui_set_but_val(but, 0);
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ return WM_UI_HANDLER_BREAK;
+ }
+
+ /* always set */
+ *sp= 0;
+ if(event->shift)
+ *sp |= KM_SHIFT;
+ if(event->alt)
+ *sp |= KM_ALT;
+ if(event->ctrl)
+ *sp |= KM_CTRL;
+ if(event->oskey)
+ *sp |= KM_OSKEY;
+
+ ui_check_but(but);
+ ED_region_tag_redraw(data->region);
+
+ if(event->val==KM_PRESS) {
+ if(ISHOTKEY(event->type)) {
+
+ if(WM_key_event_string(event->type)[0])
+ ui_set_but_val(but, event->type);
+ else
+ data->cancel= 1;
+
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ return WM_UI_HANDLER_BREAK;
+ }
+ }
+ }
+
+ return WM_UI_HANDLER_CONTINUE;
+}
+
+
+static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+{
+ if(data->state == BUTTON_STATE_HIGHLIGHT) {
+ if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) {
+ short event= (short)ui_get_but_val(but);
+ /* hardcoded prevention from editing or assigning ESC */
+ if(event!=ESCKEY)
+ button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+ return WM_UI_HANDLER_BREAK;
+ }
+ }
+ else if(data->state == BUTTON_STATE_WAIT_KEY_EVENT) {
if(event->type == MOUSEMOVE)
return WM_UI_HANDLER_CONTINUE;
if(event->val==KM_PRESS) {
- if(WM_key_event_string(event->type)[0])
+ if(event->type!=ESCKEY && WM_key_event_string(event->type)[0])
ui_set_but_val(but, event->type);
else
data->cancel= 1;
@@ -1968,7 +2123,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
wmTabletData *wmtab= event->customdata;
/* de-sensitise based on tablet pressure */
- if (ELEM(wmtab->Active, DEV_STYLUS, DEV_ERASER))
+ if (wmtab->Active != EVT_TABLET_NONE)
fac *= wmtab->Pressure;
}
@@ -3045,6 +3200,67 @@ static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, wmE
return WM_UI_HANDLER_CONTINUE;
}
+/* callback for hotkey change button/menu */
+static void do_menu_change_hotkey(bContext *C, void *but_v, void *key_v)
+{
+ uiBut *but= but_v;
+ IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+ short *key= key_v;
+ char buf[512], *butstr, *cpoin;
+
+ /* signal for escape */
+ if(key[0]==0) return;
+
+ WM_key_event_operator_change(C, but->optype->idname, but->opcontext, prop, key[0], key[1]);
+
+ /* complex code to change name of button */
+ if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+
+ butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps");
+
+ /* XXX but->str changed... should not, remove the hotkey from it */
+ cpoin= strchr(but->str, '|');
+ if(cpoin) *cpoin= 0;
+
+ strcpy(butstr, but->str);
+ strcat(butstr, "|");
+ strcat(butstr, buf);
+
+ but->str= but->strdata;
+ BLI_strncpy(but->str, butstr, sizeof(but->strdata));
+ MEM_freeN(butstr);
+
+ ui_check_but(but);
+ }
+
+}
+
+
+static uiBlock *menu_change_hotkey(bContext *C, ARegion *ar, void *arg_but)
+{
+ uiBlock *block;
+ uiBut *but= arg_but;
+ wmOperatorType *ot= WM_operatortype_find(but->optype->idname, 1);
+ static short dummy[2];
+ char buf[OP_MAX_TYPENAME+10];
+
+ dummy[0]= 0;
+ dummy[1]= 0;
+
+ block= uiBeginBlock(C, ar, "_popup", UI_EMBOSSP);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_MOVEMOUSE_QUIT|UI_BLOCK_RET_1);
+
+ BLI_strncpy(buf, ot->name, OP_MAX_TYPENAME);
+ strcat(buf, " |");
+
+ but= uiDefHotKeyevtButS(block, 0, buf, 0, 0, 200, 20, dummy, dummy+1, "");
+ uiButSetFunc(but, do_menu_change_hotkey, arg_but, dummy);
+
+ uiPopupBoundsBlock(block, 6.0f, 50, -10);
+ uiEndBlock(C, block);
+
+ return block;
+}
static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
{
@@ -3063,18 +3279,18 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
ui_but_copy_paste(C, but, data, (event->type == CKEY)? 'c': 'v');
return WM_UI_HANDLER_BREAK;
}
- /* handle keyframeing */
+ /* handle keyframing */
else if(event->type == IKEY && event->val == KM_PRESS) {
if(event->alt)
ui_but_anim_delete_keyframe(C);
else
ui_but_anim_insert_keyframe(C);
-
+
ED_region_tag_redraw(CTX_wm_region(C));
-
+
return WM_UI_HANDLER_BREAK;
}
- /* handle driver adding */
+ /* handle drivers */
else if(event->type == DKEY && event->val == KM_PRESS) {
if(event->alt)
ui_but_anim_remove_driver(C);
@@ -3085,10 +3301,35 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
return WM_UI_HANDLER_BREAK;
}
+ /* handle keyingsets */
+ else if(event->type == KKEY && event->val == KM_PRESS) {
+ if(event->alt)
+ ui_but_anim_remove_keyingset(C);
+ else
+ ui_but_anim_remove_keyingset(C);
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+
+ return WM_UI_HANDLER_BREAK;
+ }
/* handle menu */
else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) {
- ui_but_anim_menu(C, but);
- return WM_UI_HANDLER_BREAK;
+ /* RMB has two options now */
+ if(but->rnapoin.data && but->rnaprop) {
+ button_timers_tooltip_remove(C, but);
+ ui_but_anim_menu(C, but);
+ return WM_UI_HANDLER_BREAK;
+ }
+ else if((but->block->flag & UI_BLOCK_LOOP) && but->optype) {
+ IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+ char buf[512];
+
+ if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
+
+ uiPupBlock(C, menu_change_hotkey, but);
+
+ }
+ }
}
}
@@ -3117,6 +3358,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
case KEYEVT:
retval= ui_do_but_KEYEVT(C, but, data, event);
break;
+ case HOTKEYEVT:
+ retval= ui_do_but_HOTKEYEVT(C, but, data, event);
+ break;
case TOGBUT:
case TOG:
case TOGR:
@@ -3141,9 +3385,11 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
retval= ui_do_but_SLI(C, block, but, data, event);
break;
case ROUNDBOX:
+ case LISTBOX:
case LABEL:
case TOG3:
case ROW:
+ case LISTROW:
retval= ui_do_but_EXIT(C, but, data, event);
break;
case TEX:
@@ -3289,7 +3535,7 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
ui_window_to_block(ar, block, &mx, &my);
for(but=block->buttons.first; but; but= but->next) {
- if(ELEM3(but->type, LABEL, ROUNDBOX, SEPR))
+ if(ELEM4(but->type, LABEL, ROUNDBOX, SEPR, LISTBOX))
continue;
if(but->flag & UI_HIDDEN)
continue;
@@ -3312,6 +3558,27 @@ static int button_modal_state(uiHandleButtonState state)
BUTTON_STATE_TEXT_SELECTING, BUTTON_STATE_MENU_OPEN);
}
+static void button_timers_tooltip_remove(bContext *C, uiBut *but)
+{
+ uiHandleButtonData *data;
+
+ data= but->active;
+
+ if(data->tooltiptimer) {
+ WM_event_remove_window_timer(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_window_timer(data->window, data->autoopentimer);
+ data->autoopentimer= NULL;
+ }
+}
+
static void button_tooltip_timer_reset(uiBut *but)
{
uiHandleButtonData *data;
@@ -3344,7 +3611,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
/* automatic open pulldown block timer */
if(ELEM3(but->type, BLOCK, PULLDOWN, ICONTEXTROW)) {
- if(!data->autoopentimer) {
+ if(data->used_mouse && !data->autoopentimer) {
int time;
if(but->block->auto_open==2) time= 1; // test for toolbox
@@ -3359,20 +3626,7 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
}
else {
but->flag |= UI_SELECT;
-
- if(data->tooltiptimer) {
- WM_event_remove_window_timer(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_window_timer(data->window, data->autoopentimer);
- data->autoopentimer= NULL;
- }
+ button_timers_tooltip_remove(C, but);
}
/* text editing */
@@ -3407,11 +3661,11 @@ static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState s
if(!(but->block->handle && but->block->handle->popup)) {
if(button_modal_state(state)) {
if(!button_modal_state(data->state))
- WM_event_add_ui_handler(C, &data->window->handlers, ui_handler_region_menu, NULL, data);
+ WM_event_add_ui_handler(C, &data->window->modalhandlers, ui_handler_region_menu, NULL, data);
}
else {
if(button_modal_state(data->state))
- WM_event_remove_ui_handler(&data->window->handlers, ui_handler_region_menu, NULL, data);
+ WM_event_remove_ui_handler(&data->window->modalhandlers, ui_handler_region_menu, NULL, data);
}
}
@@ -3447,8 +3701,15 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
if(but->block->auto_open_last+BUTTON_AUTO_OPEN_THRESH < PIL_check_seconds_timer())
but->block->auto_open= 0;
+ if(type == BUTTON_ACTIVATE_OVER) {
+ data->used_mouse= 1;
+ }
button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+ /* activate right away */
+ if(but->type==HOTKEYEVT)
+ button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT);
+
if(type == BUTTON_ACTIVATE_OPEN) {
button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
@@ -3475,6 +3736,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *but, int mousemove)
{
uiBlock *block= but->block;
+ uiBut *bt;
/* ensure we are in the exit state */
if(data->state != BUTTON_STATE_EXIT)
@@ -3496,7 +3758,23 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
}
}
- /* disable tooltips until mousemove */
+ if(!data->cancel) {
+ /* autokey & undo push */
+ ui_apply_autokey_undo(C, but);
+
+ /* popup menu memory */
+ if(block->flag & UI_BLOCK_POPUP_MEMORY)
+ ui_popup_menu_memory(block, but);
+ }
+
+ /* disable tooltips until mousemove + last active flag */
+ for(block=data->region->uiblocks.first; block; block=block->next) {
+ for(bt=block->buttons.first; bt; bt=bt->next)
+ bt->flag &= ~UI_BUT_LAST_ACTIVE;
+
+ block->tooltipdisabled= 1;
+ }
+
ui_blocks_set_tooltips(data->region, 0);
/* clean up */
@@ -3512,6 +3790,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
MEM_freeN(but->active);
but->active= NULL;
but->flag &= ~(UI_ACTIVE|UI_SELECT);
+ but->flag |= UI_BUT_LAST_ACTIVE;
ui_check_but(but);
/* adds empty mousemove in queue for re-init handler, in case mouse is
@@ -3570,6 +3849,23 @@ static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar)
return WM_UI_HANDLER_CONTINUE;
}
+/* exported to interface.c: uiButActiveOnly() */
+void ui_button_activate_do(bContext *C, ARegion *ar, uiBut *but)
+{
+ wmWindow *win= CTX_wm_window(C);
+ wmEvent event;
+
+ button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
+
+ event= *(win->eventstate); /* XXX huh huh? make api call */
+ event.type= EVT_BUT_OPEN;
+ event.val= KM_PRESS;
+ event.customdata= but;
+ event.customdatafree= FALSE;
+
+ ui_do_button(C, but->block, but, &event);
+}
+
static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type)
{
uiBut *oldbut;
@@ -3765,12 +4061,18 @@ static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut *
button_activate_exit(C, data, but, 1);
}
else if(menu->menuretval == UI_RETURN_OUT) {
- if(ui_mouse_inside_button(data->region, but, event->x, event->y)) {
+ if(event->type==MOUSEMOVE && ui_mouse_inside_button(data->region, but, event->x, event->y)) {
button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
}
else {
- data->cancel= 1;
- button_activate_exit(C, data, but, 1);
+ if(event->type != MOUSEMOVE) {
+ but->active->used_mouse= 0;
+ button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+ }
+ else {
+ data->cancel= 1;
+ button_activate_exit(C, data, but, 1);
+ }
}
}
}
@@ -4299,7 +4601,7 @@ static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata)
uiPopupBlockHandle temp= *menu;
ui_popup_block_free(C, menu);
- WM_event_remove_ui_handler(&CTX_wm_window(C)->handlers, ui_handler_popup, ui_handler_remove_popup, menu);
+ WM_event_remove_ui_handler(&CTX_wm_window(C)->modalhandlers, ui_handler_popup, ui_handler_remove_popup, menu);
if(temp.menuretval == UI_RETURN_OK) {
if(temp.popup_func)
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 4d8ec5996be..6c4110c8c37 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -34,6 +34,7 @@
#else
#include <io.h>
#include <direct.h>
+#include "BLI_winstuff.h"
#endif
#include "MEM_guardedalloc.h"
@@ -342,6 +343,28 @@ 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)
+{
+ GLint pts[3][2];
+ int cx = x+w/2-4;
+ int cy = y+w/2;
+ int d = w/5, d2 = w/7;
+
+ viconutil_set_point(pts[0], cx-d2, cy+d);
+ viconutil_set_point(pts[1], cx-d2, cy-d);
+ viconutil_set_point(pts[2], cx+d2, cy);
+
+ glColor4f(0.2f, 0.2f, 0.2f, alpha);
+
+ glShadeModel(GL_SMOOTH);
+ glBegin(GL_TRIANGLES);
+ glVertex2iv(pts[0]);
+ glVertex2iv(pts[1]);
+ glVertex2iv(pts[2]);
+ glEnd();
+ glShadeModel(GL_FLAT);
+}
+
static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alpha)
{
GLint pts[3][2];
@@ -450,6 +473,7 @@ static void init_internal_icons()
def_internal_vicon(VICON_MOVE_UP, vicon_move_up_draw);
def_internal_vicon(VICON_MOVE_DOWN, vicon_move_down_draw);
def_internal_vicon(VICON_X, vicon_x_draw);
+ def_internal_vicon(VICON_SMALL_TRI_RIGHT, vicon_small_tri_right_draw);
IMB_freeImBuf(bbuf);
}
@@ -728,21 +752,28 @@ static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
}
/* create single icon from jpg, png etc. */
-static void icon_from_image(Image *img, int miplevel)
+static void icon_from_image(Scene *scene, Image *img, int miplevel)
{
+ ImBuf *ibuf= NULL;
+ ImageUser iuser;
+ PreviewImage *pi;
unsigned int pr_size;
short image_loaded = 0;
- struct ImBuf* ibuf=NULL;
- PreviewImage* pi;
/* img->ok is zero when Image cannot load */
if (img==NULL || img->ok==0)
return;
+ /* setup dummy image user */
+ memset(&iuser, 0, sizeof(ImageUser));
+ iuser.ok= iuser.framenr= 1;
+ iuser.scene= scene;
+
/* elubie: this needs to be changed: here image is always loaded if not
already there. Very expensive for large images. Need to find a way to
only get existing ibuf */
- ibuf = BKE_image_get_ibuf(img, NULL);
+
+ ibuf = BKE_image_get_ibuf(img, &iuser);
if(ibuf==NULL || ibuf->rect==NULL) {
return;
}
@@ -788,7 +819,7 @@ static void icon_set_image(Scene *scene, ID *id, PreviewImage* prv_img, int mipl
/* no drawing (see last parameter doDraw, just calculate preview image
- hopefully small enough to be fast */
if (GS(id->name) == ID_IM)
- icon_from_image((struct Image*)id, miplevel);
+ icon_from_image(scene, (struct Image*)id, miplevel);
else {
/* create the preview rect */
icon_create_mipmap(prv_img, miplevel);
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 1b16155c7e6..7ab99a83c4b 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -84,7 +84,8 @@ typedef enum {
UI_WTYPE_RGB_PICKER,
UI_WTYPE_NORMAL,
UI_WTYPE_BOX,
- UI_WTYPE_SCROLL
+ UI_WTYPE_SCROLL,
+ UI_WTYPE_LISTITEM
} uiWidgetTypeEnum;
@@ -185,7 +186,11 @@ struct uiBut {
uiButSearchFunc search_func;
void *search_arg;
-
+
+ uiButHandleRenameFunc rename_func;
+ void *rename_arg1;
+ void *rename_orig;
+
uiLink *link;
short linkto[2];
@@ -258,6 +263,9 @@ struct uiBlock {
void *func_arg1;
void *func_arg2;
+ uiButHandleNFunc funcN;
+ void *func_argN;
+
uiMenuHandleFunc butm_func;
void *butm_func_arg;
@@ -268,7 +276,9 @@ struct uiBlock {
int (*block_event_func)(const struct bContext *C, struct uiBlock *, struct wmEvent *);
/* extra draw function for custom blocks */
- void (*drawextra)(const struct bContext *C, void *idv, rcti *rect);
+ void (*drawextra)(const struct bContext *C, void *idv, void *arg1, void *arg2, rcti *rect);
+ void *drawextra_arg1;
+ void *drawextra_arg2;
int afterval, flag;
@@ -280,7 +290,8 @@ struct uiBlock {
char *lockstr;
float xofs, yofs; // offset to parent button
- int bounds, dobounds, mx, my; // for doing delayed
+ 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
@@ -290,6 +301,9 @@ struct uiBlock {
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
+
+ void *evil_C; // XXX hack for dynamic operator enums
};
typedef struct uiSafetyRct {
@@ -329,6 +343,7 @@ extern void ui_set_but_soft_range(uiBut *but, double value);
extern void ui_check_but(uiBut *but);
extern int ui_is_but_float(uiBut *but);
+extern int ui_is_but_unit(uiBut *but);
extern void ui_update_block_buts_hsv(uiBlock *block, float *hsv);
extern void ui_bounds_block(uiBlock *block);
@@ -362,14 +377,15 @@ struct uiPopupBlockHandle {
float retvec[3];
};
-uiBlock *ui_block_func_MENU(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
-uiBlock *ui_block_func_ICONROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
-uiBlock *ui_block_func_ICONTEXTROW(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
uiBlock *ui_block_func_COL(struct bContext *C, uiPopupBlockHandle *handle, void *arg_but);
+void ui_block_func_ICONROW(struct bContext *C, uiLayout *layout, void *arg_but);
+void ui_block_func_ICONTEXTROW(struct bContext *C, uiLayout *layout, void *arg_but);
struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
+uiBut *ui_popup_menu_memory(uiBlock *block, uiBut *but);
+
/* 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);
@@ -384,7 +400,8 @@ typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBl
uiPopupBlockHandle *ui_popup_block_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
uiBlockCreateFunc create_func, uiBlockHandleCreateFunc handle_create_func, void *arg);
uiPopupBlockHandle *ui_popup_menu_create(struct bContext *C, struct ARegion *butregion, uiBut *but,
- uiMenuCreateFunc create_func, void *arg);
+ uiMenuCreateFunc create_func, void *arg, char *str);
+
void ui_popup_block_free(struct bContext *C, uiPopupBlockHandle *handle);
void ui_set_name_menu(uiBut *but, int value);
@@ -412,6 +429,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rct
/* interface_handlers.c */
+extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but);
extern void ui_button_active_cancel(const struct bContext *C, uiBut *but);
extern int ui_button_is_active(struct ARegion *ar);
@@ -452,7 +470,12 @@ void ui_but_anim_insert_keyframe(struct bContext *C);
void ui_but_anim_delete_keyframe(struct bContext *C);
void ui_but_anim_add_driver(struct bContext *C);
void ui_but_anim_remove_driver(struct bContext *C);
+void ui_but_anim_add_keyingset(struct bContext *C);
+void ui_but_anim_remove_keyingset(struct bContext *C);
void ui_but_anim_menu(struct bContext *C, uiBut *but);
+int ui_but_anim_expression_get(uiBut *but, char *str, int maxlen);
+int ui_but_anim_expression_set(uiBut *but, const char *str);
+void ui_but_anim_autokey(uiBut *but, struct Scene *scene, float cfra);
#endif
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 94280ec37d3..afbbfb61cba 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -148,6 +148,7 @@ typedef struct uiLayoutItemFlow {
typedef struct uiLayoutItemBx {
uiLayout litem;
uiBut *roundbox;
+ ListBase items;
} uiLayoutItemBx;
typedef struct uiLayoutItemSplt {
@@ -214,16 +215,16 @@ 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)
+static int ui_text_icon_width(uiLayout *layout, char *name, int icon, int compact)
{
int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X;
- if(icon && strcmp(name, "") == 0)
+ if(icon && !name[0])
return UI_UNIT_X; /* icon only */
else if(icon)
- return (variable)? UI_GetStringWidth(name) + 4 + UI_UNIT_X: 10*UI_UNIT_X; /* icon + text */
+ return (variable)? UI_GetStringWidth(name) + (compact? 5: 10) + UI_UNIT_X: 10*UI_UNIT_X; /* icon + text */
else
- return (variable)? UI_GetStringWidth(name) + 4 + UI_UNIT_X: 10*UI_UNIT_X; /* text only */
+ return (variable)? UI_GetStringWidth(name) + (compact? 5: 10) + UI_UNIT_X: 10*UI_UNIT_X; /* text only */
}
static void ui_item_size(uiItem *item, int *r_w, int *r_h)
@@ -309,6 +310,30 @@ static uiLayout *ui_item_local_sublayout(uiLayout *test, uiLayout *layout, int a
return sub;
}
+static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index)
+{
+ wmWindow *win= CTX_wm_window(C);
+ uiBut *but= arg_but, *cbut;
+ PointerRNA *ptr= &but->rnapoin;
+ PropertyRNA *prop= but->rnaprop;
+ int i, index= GET_INT_FROM_POINTER(arg_index);
+ int shift= win->eventstate->shift;
+ int len= RNA_property_array_length(ptr, prop);
+
+ if(!shift) {
+ RNA_property_boolean_set_index(ptr, prop, index, 1);
+
+ for(i=0; i<len; i++)
+ if(i != index)
+ RNA_property_boolean_set_index(ptr, prop, i, 0);
+
+ RNA_property_update(C, ptr, prop);
+
+ for(cbut=but->block->buttons.first; cbut; cbut=cbut->next)
+ ui_check_but(cbut);
+ }
+}
+
/* 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)
{
@@ -317,7 +342,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
PropertyType type;
PropertySubType subtype;
uiLayout *sub;
- int a;
+ int a, b;
/* retrieve type and subtype */
type= RNA_property_type(prop);
@@ -331,9 +356,11 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
/* create buttons */
- if(type == PROP_BOOLEAN && len == 20) {
+ if(type == PROP_BOOLEAN && ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER)) {
/* special check for layer layout */
int butw, buth, unit;
+ int cols= (len >= 20)? 2: 1;
+ int colbuts= len/(2*cols);
uiBlockSetCurLayout(block, uiLayoutFree(layout, 0));
@@ -341,21 +368,23 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
butw= unit;
buth= unit;
- uiBlockBeginAlign(block);
- for(a=0; a<5; a++)
- uiDefAutoButR(block, ptr, prop, a, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth);
- for(a=0; a<5; a++)
- uiDefAutoButR(block, ptr, prop, a+10, "", ICON_BLANK1, x + butw*a, y, butw, buth);
- uiBlockEndAlign(block);
+ for(b=0; b<cols; b++) {
+ uiBlockBeginAlign(block);
- x += 5*butw + style->buttonspacex;
+ for(a=0; a<colbuts; a++) {
+ but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", ICON_BLANK1, 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(subtype == PROP_LAYER_MEMBER)
+ uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+len/2+b*colbuts));
+ }
+ uiBlockEndAlign(block);
- uiBlockBeginAlign(block);
- for(a=0; a<5; a++)
- uiDefAutoButR(block, ptr, prop, a+5, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth);
- for(a=0; a<5; a++)
- uiDefAutoButR(block, ptr, prop, a+15, "", ICON_BLANK1, x + butw*a, y, butw, buth);
- uiBlockEndAlign(block);
+ x += colbuts*butw + style->buttonspacex;
+ }
}
else if(subtype == PROP_MATRIX) {
/* matrix layout */
@@ -378,31 +407,25 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
but->type= NUMSLI;
}
}
- else if(len <= 4 && ELEM3(subtype, PROP_ROTATION, PROP_VECTOR, PROP_COLOR)) {
- if(subtype == PROP_COLOR)
+ else {
+ if(ELEM(subtype, PROP_COLOR, PROP_RGB))
uiDefAutoButR(block, ptr, prop, -1, "", 0, 0, 0, w, UI_UNIT_Y);
- if(subtype != PROP_COLOR || expand) {
+ if(!ELEM(subtype, PROP_COLOR, PROP_RGB) || expand) {
/* layout for known array subtypes */
- static char vectoritem[4]= {'X', 'Y', 'Z', 'W'};
- static char quatitem[4]= {'W', 'X', 'Y', 'Z'};
- static char coloritem[4]= {'R', 'G', 'B', 'A'};
char str[3];
for(a=0; a<len; a++) {
- if(len == 4 && subtype == PROP_ROTATION)
- str[0]= quatitem[a];
- else if(subtype == PROP_VECTOR || subtype == PROP_ROTATION)
- str[0]= vectoritem[a];
- else
- str[0]= coloritem[a];
-
- if(type == PROP_BOOLEAN) {
- str[1]= '\0';
- }
- else {
- str[1]= ':';
- str[2]= '\0';
+ str[0]= RNA_property_array_item_char(prop, a);
+
+ if(str[0]) {
+ if(type == PROP_BOOLEAN) {
+ str[1]= '\0';
+ }
+ else {
+ str[1]= ':';
+ str[2]= '\0';
+ }
}
but= uiDefAutoButR(block, ptr, prop, a, str, 0, 0, 0, w, UI_UNIT_Y);
@@ -410,41 +433,37 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
but->type= NUMSLI;
}
}
- else if(subtype == PROP_COLOR && len == 4) {
+ else if(ELEM(subtype, PROP_COLOR, PROP_RGB) && len == 4) {
but= uiDefAutoButR(block, ptr, prop, 3, "A:", 0, 0, 0, w, UI_UNIT_Y);
if(slider && but->type==NUM)
but->type= NUMSLI;
}
}
- else {
- for(a=0; a<len; a++) {
- but= uiDefAutoButR(block, ptr, prop, a, "", 0, 0, 0, w, UI_UNIT_Y);
- if(slider && but->type==NUM)
- but->type= NUMSLI;
- }
- }
uiBlockSetCurLayout(block, layout);
}
-static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h)
+static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only)
{
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
const char *identifier;
char *name;
- int a, totitem, itemw, icon, value;
+ int a, totitem, itemw, icon, value, free;
identifier= RNA_property_identifier(prop);
- RNA_property_enum_items(ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
uiBlockSetCurLayout(block, ui_item_local_sublayout(layout, layout, 1));
for(a=0; a<totitem; a++) {
+ if(!item[a].identifier[0])
+ continue;
+
name= (!uiname || uiname[0])? (char*)item[a].name: "";
icon= item[a].icon;
value= item[a].value;
- itemw= ui_text_icon_width(block->curlayout, name, icon);
+ itemw= ui_text_icon_width(block->curlayout, name, icon, 0);
- if(icon && strcmp(name, "") != 0)
+ if(icon && strcmp(name, "") != 0 && !icon_only)
uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
else if(icon)
uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
@@ -452,37 +471,79 @@ static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr,
uiDefButR(block, ROW, 0, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
}
uiBlockSetCurLayout(block, layout);
+
+ if(free)
+ MEM_freeN(item);
}
/* 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)
+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 icon_only)
{
uiLayout *sub;
uiBut *but;
+ PropertyType type;
PropertySubType subtype;
+ int labelw;
sub= uiLayoutRow(layout, 0);
uiBlockSetCurLayout(block, sub);
if(strcmp(name, "") != 0) {
- w= w/2;
- uiDefBut(block, LABEL, 0, name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, "");
+ /* XXX UI_GetStringWidth is not accurate
+ labelw= UI_GetStringWidth(name);
+ CLAMP(labelw, w/4, 3*w/4);*/
+ labelw= w/2;
+ uiDefBut(block, LABEL, 0, name, x, y, labelw, h, NULL, 0.0, 0.0, 0, 0, "");
+ w= w-labelw;
}
+ type= RNA_property_type(prop);
subtype= RNA_property_subtype(prop);
if(subtype == PROP_FILEPATH || subtype == PROP_DIRPATH) {
uiBlockSetCurLayout(block, uiLayoutRow(sub, 1));
uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w-UI_UNIT_X, h);
- but= uiDefIconBut(block, BUT, 0, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL, 0.0f, 0.0f, 0.0f, 0.0f, "DUMMY file select button"); /* XXX */
+
+ /* BUTTONS_OT_file_browse calls uiFileBrowseContextProperty */
+ but= uiDefIconButO(block, BUT, "BUTTONS_OT_file_browse", WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, "Browse for file or directory.");
}
+ else if(subtype == PROP_DIRECTION)
+ uiDefButR(block, BUT_NORMAL, 0, name, 0, 0, 100, 100, ptr, RNA_property_identifier(prop), index, 0, 0, -1, -1, NULL);
else
- but= uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w, h);
+ but= uiDefAutoButR(block, ptr, prop, index, (type == PROP_ENUM && !icon_only)? NULL: "", icon, x, y, w, h);
uiBlockSetCurLayout(block, layout);
return but;
}
+void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA **prop)
+{
+ ARegion *ar= CTX_wm_region(C);
+ uiBlock *block;
+ uiBut *but, *prevbut;
+
+ memset(ptr, 0, sizeof(*ptr));
+ *prop= NULL;
+
+ if(!ar)
+ return;
+
+ for(block=ar->uiblocks.first; block; block=block->next) {
+ for(but=block->buttons.first; but; but= but->next) {
+ prevbut= but->prev;
+
+ /* find the button before the active one */
+ if((but->flag & UI_BUT_LAST_ACTIVE) && prevbut && prevbut->rnapoin.data) {
+ if(RNA_property_type(prevbut->rnaprop) == PROP_STRING) {
+ *ptr= prevbut->rnapoin;
+ *prop= prevbut->rnaprop;
+ return;
+ }
+ }
+ }
+ }
+}
+
/********************* Button Items *************************/
/* disabled item */
@@ -497,7 +558,7 @@ static void ui_item_disabled(uiLayout *layout, char *name)
if(!name)
name= "";
- w= ui_text_icon_width(layout, name, 0);
+ 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->flag |= UI_BUT_DISABLED;
@@ -506,16 +567,16 @@ static void ui_item_disabled(uiLayout *layout, char *name)
}
/* operator items */
-void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context)
+PointerRNA uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context, int flag)
{
uiBlock *block= layout->root->block;
- wmOperatorType *ot= WM_operatortype_find(idname);
+ wmOperatorType *ot= WM_operatortype_find(idname, 0);
uiBut *but;
int w;
if(!ot) {
ui_item_disabled(layout, idname);
- return;
+ return PointerRNA_NULL;
}
if(!name)
@@ -526,7 +587,7 @@ void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDPropert
/* create button */
uiBlockSetCurLayout(block, layout);
- w= ui_text_icon_width(layout, name, icon);
+ w= ui_text_icon_width(layout, name, icon, 0);
if(icon && strcmp(name, "") != 0)
but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
@@ -536,15 +597,26 @@ void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDPropert
but= uiDefButO(block, BUT, ot->idname, context, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
/* assign properties */
- if(properties) {
+ if(properties || (flag & UI_ITEM_O_RETURN_PROPS)) {
PointerRNA *opptr= uiButGetOperatorPtrRNA(but);
- opptr->data= properties;
+
+ if(properties) {
+ opptr->data= properties;
+ }
+ else {
+ IDPropertyTemplate val = {0};
+ opptr->data= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
+ }
+
+ return *opptr;
}
+
+ return PointerRNA_NULL;
}
-static char *ui_menu_enumpropname(char *opname, char *propname, int retval)
+static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval)
{
- wmOperatorType *ot= WM_operatortype_find(opname);
+ wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
PropertyRNA *prop;
@@ -555,15 +627,18 @@ static char *ui_menu_enumpropname(char *opname, char *propname, int retval)
prop= RNA_struct_find_property(&ptr, propname);
if(prop) {
- const EnumPropertyItem *item;
- int totitem, i;
-
- RNA_property_enum_items(&ptr, prop, &item, &totitem);
-
- for (i=0; i<totitem; i++) {
- if(item[i].value==retval)
- return (char*)item[i].name;
+ EnumPropertyItem *item;
+ int totitem, free;
+ const char *name;
+
+ 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;
}
+
+ if(free)
+ MEM_freeN(item);
}
return "";
@@ -577,16 +652,18 @@ void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *pro
RNA_enum_set(&ptr, propname, value);
if(!name)
- name= ui_menu_enumpropname(opname, propname, value);
+ name= ui_menu_enumpropname(layout, opname, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
{
- wmOperatorType *ot= WM_operatortype_find(opname);
+ wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
PropertyRNA *prop;
+ uiBut *bt;
+ uiBlock *block= layout->root->block;
if(!ot || !ot->srna) {
ui_item_disabled(layout, opname);
@@ -597,13 +674,36 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
prop= RNA_struct_find_property(&ptr, propname);
if(prop && RNA_property_type(prop) == PROP_ENUM) {
- const EnumPropertyItem *item;
- int totitem, i;
+ EnumPropertyItem *item;
+ int totitem, i, free;
+ uiLayout *split= uiLayoutSplit(layout, 0);
+ uiLayout *column= uiLayoutColumn(split, 0);
- RNA_property_enum_items(&ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, &ptr, prop, &item, &totitem, &free);
+
+ for(i=0; i<totitem; i++) {
+ if(item[i].identifier[0]) {
+ uiItemEnumO(column, (char*)item[i].name, item[i].icon, opname, propname, item[i].value);
+ }
+ else {
+ if(item[i].name) {
+ if(i != 0) {
+ column= uiLayoutColumn(split, 0);
+ /* inconsistent, but menus with labels do not look good flipped */
+ block->flag |= UI_BLOCK_NO_FLIP;
+ }
+
+ uiItemL(column, (char*)item[i].name, 0);
+ bt= block->buttons.last;
+ bt->flag= UI_TEXT_LEFT;
+ }
+ else
+ uiItemS(column);
+ }
+ }
- for(i=0; i<totitem; i++)
- uiItemEnumO(layout, (char*)item[i].name, item[i].icon, opname, propname, item[i].value);
+ if(free)
+ MEM_freeN(item);
}
}
@@ -614,19 +714,22 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch
/* for getting the enum */
PropertyRNA *prop;
- const EnumPropertyItem *item;
- int totitem;
- int value;
+ EnumPropertyItem *item;
+ int value, free;
WM_operator_properties_create(&ptr, opname);
/* enum lookup */
if((prop= RNA_struct_find_property(&ptr, propname))) {
- RNA_property_enum_items(&ptr, prop, &item, &totitem);
- if(RNA_enum_value_from_id(item, value_str, &value)==0) {
+ RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free);
+ if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) {
+ if(free) MEM_freeN(item);
printf("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
return;
}
+
+ if(free)
+ MEM_freeN(item);
}
else {
printf("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
@@ -637,9 +740,9 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch
/* same as uiItemEnumO */
if(!name)
- name= ui_menu_enumpropname(opname, propname, value);
+ name= ui_menu_enumpropname(layout, opname, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
@@ -649,7 +752,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *
WM_operator_properties_create(&ptr, opname);
RNA_boolean_set(&ptr, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
@@ -659,7 +762,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop
WM_operator_properties_create(&ptr, opname);
RNA_int_set(&ptr, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value)
@@ -669,7 +772,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr
WM_operator_properties_create(&ptr, opname);
RNA_float_set(&ptr, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value)
@@ -679,36 +782,41 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p
WM_operator_properties_create(&ptr, opname);
RNA_string_set(&ptr, propname, value);
- uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, ptr.data, layout->root->opcontext, 0);
}
void uiItemO(uiLayout *layout, char *name, int icon, char *opname)
{
- uiItemFullO(layout, name, icon, opname, NULL, layout->root->opcontext);
+ uiItemFullO(layout, name, icon, opname, NULL, layout->root->opcontext, 0);
}
/* RNA property items */
-static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA *prop, int index, int *r_w, int *r_h)
+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)
{
PropertyType type;
PropertySubType subtype;
int len, w, h;
- w= ui_text_icon_width(layout, name, icon);
- h= UI_UNIT_Y;
-
/* arbitrary extended width by type */
type= RNA_property_type(prop);
subtype= RNA_property_subtype(prop);
- len= RNA_property_array_length(prop);
+ len= RNA_property_array_length(ptr, prop);
+
+ if(ELEM3(type, PROP_STRING, PROP_POINTER, PROP_ENUM) && !name[0] && !icon_only)
+ name= "non-empty text";
+ else if(type == PROP_BOOLEAN && !name[0] && !icon_only)
+ icon= ICON_DOT;
+
+ w= ui_text_icon_width(layout, name, icon, 0);
+ h= UI_UNIT_Y;
/* increase height for arrays */
if(index == RNA_NO_INDEX && len > 0) {
- if(strcmp(name, "") == 0 && icon == 0)
+ if(!name[0] && icon == 0)
h= 0;
- if(type == PROP_BOOLEAN && len == 20)
+ if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER))
h += 2*UI_UNIT_Y;
else if(subtype == PROP_MATRIX)
h += ceil(sqrt(len))*UI_UNIT_Y;
@@ -717,31 +825,30 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA
}
else if(ui_layout_vary_direction(layout) == UI_ITEM_VARY_X) {
if(type == PROP_BOOLEAN && strcmp(name, "") != 0)
- w += UI_UNIT_X;
+ w += UI_UNIT_X/5;
else if(type == PROP_ENUM)
- w += UI_UNIT_X/2;
+ w += UI_UNIT_X/4;
+ else if(type == PROP_FLOAT || type == PROP_INT)
+ w += UI_UNIT_X*3;
}
*r_w= w;
*r_h= h;
}
-void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int expand, int slider, int toggle)
+void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag)
{
uiBlock *block= layout->root->block;
uiBut *but;
PropertyType type;
char namestr[UI_MAX_NAME_STR];
- int len, w, h;
-
- if(!ptr->data || !prop)
- return;
+ int len, w, h, slider, toggle, expand, icon_only;
uiBlockSetCurLayout(block, layout);
/* retrieve info */
type= RNA_property_type(prop);
- len= RNA_property_array_length(prop);
+ len= RNA_property_array_length(ptr, prop);
/* set name and icon */
if(!name)
@@ -763,8 +870,13 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
icon= (RNA_property_enum_get(ptr, prop) == value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
}
+ slider= (flag & UI_ITEM_R_SLIDER);
+ toggle= (flag & UI_ITEM_R_TOGGLE);
+ expand= (flag & UI_ITEM_R_EXPAND);
+ icon_only= (flag & UI_ITEM_R_ICON_ONLY);
+
/* get size */
- ui_item_rna_size(layout, name, icon, prop, index, &w, &h);
+ ui_item_rna_size(layout, name, icon, ptr, prop, index, icon_only, &w, &h);
/* array property */
if(index == RNA_NO_INDEX && len > 0)
@@ -773,7 +885,7 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) {
char *identifier= (char*)RNA_property_identifier(prop);
- if(icon && strcmp(name, "") != 0)
+ if(icon && strcmp(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);
@@ -782,10 +894,10 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
}
/* expanded enum */
else if(type == PROP_ENUM && expand)
- ui_item_enum_row(layout, block, ptr, prop, name, 0, 0, w, h);
+ ui_item_enum_row(layout, block, ptr, prop, name, 0, 0, w, 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);
+ but= ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h, icon_only);
ui_but_add_search(but, ptr, prop, NULL, NULL);
}
/* single button */
@@ -800,14 +912,9 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper
}
}
-void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider, int toggle)
+void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int flag)
{
- PropertyRNA *prop;
-
- if(!ptr->data || !propname)
- return;
-
- prop= RNA_struct_find_property(ptr, propname);
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
ui_item_disabled(layout, propname);
@@ -815,30 +922,59 @@ void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *prop
return;
}
- uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, expand, slider, toggle);
+ uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, flag);
}
void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value)
{
- PropertyRNA *prop;
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
- if(!ptr->data || !propname)
+ if(!prop || RNA_property_type(prop) != PROP_ENUM) {
+ ui_item_disabled(layout, propname);
+ printf("uiItemEnumR: enum property not found: %s\n", propname);
return;
+ }
- prop= RNA_struct_find_property(ptr, propname);
+ uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0);
+}
- if(!prop) {
+void uiItemEnumR_string(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value)
+{
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
+ EnumPropertyItem *item;
+ int ivalue, a, free;
+
+ if(!prop || RNA_property_type(prop) != PROP_ENUM) {
+ ui_item_disabled(layout, propname);
+ printf("uiItemEnumR: enum property not found: %s\n", propname);
+ return;
+ }
+
+ RNA_property_enum_items(layout->root->block->evil_C, ptr, prop, &item, NULL, &free);
+
+ if(!RNA_enum_value_from_id(item, value, &ivalue)) {
+ if(free) MEM_freeN(item);
ui_item_disabled(layout, propname);
- printf("uiItemEnumR: property not found: %s\n", propname);
+ printf("uiItemEnumR: enum property value not found: %s\n", value);
return;
}
- uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0, 0, 0);
+ for(a=0; item[a].identifier; a++) {
+ if(item[a].value == ivalue) {
+ uiItemFullR(layout, (char*)item[a].name, item[a].icon, ptr, prop, RNA_ENUM_VALUE, ivalue, 0);
+ break;
+ }
+ }
+
+ if(free)
+ MEM_freeN(item);
}
void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
{
PropertyRNA *prop;
+ uiBlock *block= layout->root->block;
+ uiBut *bt;
prop= RNA_struct_find_property(ptr, propname);
@@ -848,13 +984,36 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
}
if(RNA_property_type(prop) == PROP_ENUM) {
- const EnumPropertyItem *item;
- int totitem, i;
+ EnumPropertyItem *item;
+ int totitem, i, free;
+ uiLayout *split= uiLayoutSplit(layout, 0);
+ uiLayout *column= uiLayoutColumn(split, 0);
- RNA_property_enum_items(ptr, prop, &item, &totitem);
+ RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
- for(i=0; i<totitem; i++)
- uiItemEnumR(layout, (char*)item[i].name, 0, ptr, propname, item[i].value);
+ for(i=0; i<totitem; i++) {
+ if(item[i].identifier[0]) {
+ uiItemEnumR(column, (char*)item[i].name, 0, ptr, propname, item[i].value);
+ }
+ else {
+ if(item[i].name) {
+ if(i != 0) {
+ column= uiLayoutColumn(split, 0);
+ /* inconsistent, but menus with labels do not look good flipped */
+ block->flag |= UI_BLOCK_NO_FLIP;
+ }
+
+ uiItemL(column, (char*)item[i].name, 0);
+ bt= block->buttons.last;
+ bt->flag= UI_TEXT_LEFT;
+ }
+ else
+ uiItemS(column);
+ }
+ }
+
+ if(free)
+ MEM_freeN(item);
}
}
@@ -934,9 +1093,9 @@ 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;
+ but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT|UI_BUT_UNDO;
- uiButSetSearchFunc(but, rna_search_cb, but, NULL);
+ uiButSetSearchFunc(but, rna_search_cb, but, NULL, NULL);
}
}
@@ -950,9 +1109,6 @@ void uiItemPointerR(uiLayout *layout, char *name, int icon, struct PointerRNA *p
int w, h;
/* validate arguments */
- if(!ptr->data || !searchptr->data)
- return;
-
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
@@ -988,8 +1144,8 @@ void uiItemPointerR(uiLayout *layout, char *name, int icon, struct PointerRNA *p
/* create button */
block= uiLayoutGetBlock(layout);
- ui_item_rna_size(layout, name, icon, prop, 0, &w, &h);
- but= ui_item_with_label(layout, block, name, icon, ptr, prop, 0, 0, 0, w, h);
+ ui_item_rna_size(layout, name, icon, ptr, prop, 0, 0, &w, &h);
+ but= ui_item_with_label(layout, block, name, icon, ptr, prop, 0, 0, 0, w, h, 0);
ui_but_add_search(but, ptr, prop, searchptr, searchprop);
}
@@ -1021,7 +1177,7 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
- w= ui_text_icon_width(layout, name, icon);
+ w= ui_text_icon_width(layout, name, icon, 1);
h= UI_UNIT_Y;
if(layout->root->type == UI_LAYOUT_HEADER) /* ugly .. */
@@ -1058,9 +1214,11 @@ void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL);
- break;
+ return;
}
}
+
+ printf("uiItemM: not found %s\n", menuname);
}
/* label item */
@@ -1077,7 +1235,7 @@ void uiItemL(uiLayout *layout, char *name, int icon)
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
- w= ui_text_icon_width(layout, name, 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, "");
@@ -1102,7 +1260,7 @@ void uiItemV(uiLayout *layout, char *name, int icon, int argval)
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
- w= ui_text_icon_width(layout, name, icon);
+ 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, "");
@@ -1122,12 +1280,12 @@ void uiItemS(uiLayout *layout)
}
/* level items */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func)
+void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg)
{
if(!func)
return;
- ui_item_menu(layout, name, icon, func, NULL, NULL);
+ ui_item_menu(layout, name, icon, func, arg, NULL);
}
typedef struct MenuItemLevel {
@@ -1147,7 +1305,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname)
{
- wmOperatorType *ot= WM_operatortype_find(opname);
+ wmOperatorType *ot= WM_operatortype_find(opname, 0);
MenuItemLevel *lvl;
if(!ot || !ot->srna) {
@@ -1224,7 +1382,7 @@ static void ui_litem_estimate_row(uiLayout *litem)
static int ui_litem_min_width(int itemw)
{
- return MIN2(UI_UNIT_X, itemw);
+ return MIN2(2*UI_UNIT_X, itemw);
}
static void ui_litem_layout_row(uiLayout *litem)
@@ -1737,7 +1895,7 @@ uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align)
return &flow->litem;
}
-uiLayout *uiLayoutBox(uiLayout *layout)
+static uiLayout *ui_layout_box(uiLayout *layout, int type)
{
uiLayoutItemBx *box;
@@ -1752,11 +1910,27 @@ uiLayout *uiLayoutBox(uiLayout *layout)
uiBlockSetCurLayout(layout->root->block, &box->litem);
- box->roundbox= uiDefBut(layout->root->block, ROUNDBOX, 0, "", 0, 0, 0, 0, NULL, 0.0, 0.0, 0, 0, "");
+ box->roundbox= uiDefBut(layout->root->block, type, 0, "", 0, 0, 0, 0, NULL, 0.0, 0.0, 0, 0, "");
return &box->litem;
}
+uiLayout *uiLayoutBox(uiLayout *layout)
+{
+ return ui_layout_box(layout, ROUNDBOX);
+}
+
+uiLayout *uiLayoutListBox(uiLayout *layout)
+{
+ return ui_layout_box(layout, LISTBOX);
+}
+
+ListBase *uiLayoutBoxGetList(uiLayout *layout)
+{
+ uiLayoutItemBx *box= (uiLayoutItemBx*)layout;
+ return &box->items;
+}
+
uiLayout *uiLayoutFree(uiLayout *layout, int align)
{
uiLayout *litem;
@@ -1864,6 +2038,11 @@ int uiLayoutGetAlignment(uiLayout *layout)
return layout->alignment;
}
+int uiLayoutGetWidth(uiLayout *layout)
+{
+ return layout->w;
+}
+
float uiLayoutGetScaleX(uiLayout *layout)
{
return layout->scale[0];
@@ -2031,18 +2210,13 @@ static void ui_item_layout(uiItem *item)
}
}
-static void ui_layout_items(const bContext *C, uiBlock *block, uiLayout *layout)
-{
- ui_item_estimate(&layout->item);
- ui_item_layout(&layout->item);
-}
-
-static void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y)
+static void ui_layout_end(uiBlock *block, uiLayout *layout, int *x, int *y)
{
if(layout->root->handlefunc)
uiBlockSetButmFunc(block, layout->root->handlefunc, layout->root->argv);
- ui_layout_items(C, block, layout);
+ ui_item_estimate(&layout->item);
+ ui_item_layout(&layout->item);
if(x) *x= layout->x;
if(y) *y= layout->y;
@@ -2061,6 +2235,9 @@ static void ui_layout_free(uiLayout *layout)
ui_layout_free((uiLayout*)item);
}
+ if(layout->item.type == ITEM_LAYOUT_BOX)
+ BLI_freelistN(&((uiLayoutItemBx*)layout)->items);
+
MEM_freeN(layout);
}
@@ -2147,7 +2324,7 @@ void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv)
layout->root->argv= argv;
}
-void uiBlockLayoutResolve(const bContext *C, uiBlock *block, int *x, int *y)
+void uiBlockLayoutResolve(uiBlock *block, int *x, int *y)
{
uiLayoutRoot *root;
@@ -2158,7 +2335,7 @@ void uiBlockLayoutResolve(const bContext *C, uiBlock *block, int *x, int *y)
for(root=block->layouts.first; root; root=root->next) {
/* NULL in advance so we don't interfere when adding button */
- ui_layout_end(C, block, root->layout, x, y);
+ ui_layout_end(block, root->layout, x, y);
ui_layout_free(root->layout);
}
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 06dc5d1e606..fa24aa72b9f 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -104,7 +104,11 @@ static int panel_aligned(ScrArea *sa, ARegion *ar)
SpaceButs *sbuts= sa->spacedata.first;
return sbuts->align;
}
- else if(ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_TOOLS))
+ else if(sa->spacetype==SPACE_USERPREF && ar->regiontype == RGN_TYPE_WINDOW)
+ return BUT_VERTICAL;
+ else if(sa->spacetype==SPACE_FILE && ar->regiontype == RGN_TYPE_CHANNELS)
+ return BUT_VERTICAL;
+ else if(ELEM3(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_TOOLS, RGN_TYPE_TOOL_PROPS))
return BUT_VERTICAL;
return 0;
@@ -126,6 +130,8 @@ static int panels_re_align(ScrArea *sa, ARegion *ar, Panel **r_pa)
}
else if(ar->regiontype==RGN_TYPE_UI)
return 1;
+ else if(sa->spacetype==SPACE_FILE && ar->regiontype == RGN_TYPE_CHANNELS)
+ return 1;
/* in case panel is added or disappears */
for(pa=ar->panels.first; pa; pa=pa->next) {
@@ -262,14 +268,19 @@ void uiEndPanel(uiBlock *block, int width, int height)
pa->sizex= width;
pa->sizey= height;
}
- else if(!(width == 0 || height == 0)) {
- if(pa->sizex != width || pa->sizey != height) {
+ else {
+ /* check if we need to do an animation */
+ if(!ELEM(width, 0, pa->sizex) || !ELEM(height, 0, pa->sizey)) {
pa->runtime_flag |= PNL_ANIM_ALIGN;
- pa->ofsy += pa->sizey-height;
+ if(height != 0)
+ pa->ofsy += pa->sizey-height;
}
- pa->sizex= width;
- pa->sizey= height;
+ /* update width/height if non-zero */
+ if(width != 0)
+ pa->sizex= width;
+ if(height != 0)
+ pa->sizey= height;
}
}
@@ -535,6 +546,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
int ofsx;
if(panel->paneltab) return;
+ if(panel->type && (panel->type->flag & PNL_NO_HEADER)) return;
/* calculate header rect */
/* + 0.001f to prevent flicker due to float inaccuracy */
@@ -640,6 +652,22 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
/************************** panel alignment *************************/
+static int get_panel_header(Panel *pa)
+{
+ if(pa->type && (pa->type->flag & PNL_NO_HEADER))
+ return 0;
+
+ return PNL_HEADER;
+}
+
+static int get_panel_size_y(uiStyle *style, Panel *pa)
+{
+ if(pa->type && (pa->type->flag & PNL_NO_HEADER))
+ return pa->sizey;
+
+ return PNL_HEADER + pa->sizey + style->panelouter;
+}
+
/* this function is needed because uiBlock and Panel itself dont
change sizey or location when closed */
static int get_panel_real_ofsy(Panel *pa)
@@ -652,8 +680,8 @@ static int get_panel_real_ofsy(Panel *pa)
static int get_panel_real_ofsx(Panel *pa)
{
- if(pa->flag & PNL_CLOSEDX) return pa->ofsx+PNL_HEADER;
- else if(pa->paneltab && (pa->paneltab->flag & PNL_CLOSEDX)) return pa->ofsx+PNL_HEADER;
+ if(pa->flag & PNL_CLOSEDX) return pa->ofsx+get_panel_header(pa);
+ else if(pa->paneltab && (pa->paneltab->flag & PNL_CLOSEDX)) return pa->ofsx+get_panel_header(pa);
else return pa->ofsx+pa->sizex;
}
@@ -758,18 +786,18 @@ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag)
/* no smart other default start loc! this keeps switching f5/f6/etc compatible */
ps= panelsort;
ps->pa->ofsx= 0;
- ps->pa->ofsy= -ps->pa->sizey-PNL_HEADER-style->panelouter;
+ ps->pa->ofsy= -get_panel_size_y(style, ps->pa);
for(a=0; a<tot-1; a++, ps++) {
psnext= ps+1;
if(align==BUT_VERTICAL) {
psnext->pa->ofsx= ps->pa->ofsx;
- psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-PNL_HEADER-style->panelouter;
+ psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - get_panel_size_y(style, psnext->pa);
}
else {
psnext->pa->ofsx= get_panel_real_ofsx(ps->pa);
- psnext->pa->ofsy= ps->pa->ofsy + ps->pa->sizey - psnext->pa->sizey;
+ psnext->pa->ofsy= ps->pa->ofsy + get_panel_size_y(style, ps->pa) - get_panel_size_y(style, psnext->pa);
}
}
@@ -935,6 +963,7 @@ static void check_panel_overlap(ARegion *ar, Panel *panel)
}
}
+#if 0 // XXX panel docking/tabbing code that's no longer used
static void test_add_new_tabs(ARegion *ar)
{
Panel *pa, *pasel=NULL, *palap=NULL;
@@ -962,6 +991,7 @@ static void test_add_new_tabs(ARegion *ar)
}
if(pasel==NULL || palap==NULL) return;
+ if(palap->type && palap->type->flag & PNL_NO_HEADER) return;
/* the overlapped panel becomes a tab */
palap->paneltab= pasel;
@@ -987,6 +1017,7 @@ static void test_add_new_tabs(ARegion *ar)
pa= pa->next;
}
}
+#endif
/************************ panel dragging ****************************/
@@ -1003,6 +1034,9 @@ static void ui_do_drag(const bContext *C, wmEvent *event, Panel *panel)
dx= (event->x-data->startx) & ~(PNL_GRID-1);
dy= (event->y-data->starty) & ~(PNL_GRID-1);
+
+ dx *= (float)(ar->v2d.cur.xmax - ar->v2d.cur.xmin)/(float)(ar->winrct.xmax - ar->winrct.xmin);
+ dy *= (float)(ar->v2d.cur.ymax - ar->v2d.cur.ymin)/(float)(ar->winrct.ymax - ar->winrct.ymin);
if(data->state == PANEL_STATE_DRAG_SCALE) {
panel->sizex = MAX2(data->startsizex+dx, UI_PANEL_MINX);
@@ -1196,6 +1230,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
uiBlock *block;
+ Panel *pa;
int retval, mx, my, inside_header= 0, inside_scale= 0, inside;
retval= WM_UI_HANDLER_CONTINUE;
@@ -1211,22 +1246,27 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
/* check if inside boundbox */
inside= 0;
+ pa= block->panel;
+
+ if(!pa || pa->paneltab!=NULL)
+ continue;
+ if(pa->type && pa->type->flag & PNL_NO_HEADER) // XXX - accessed freed panels when scripts reload, need to fix.
+ continue;
- if(block->panel && block->panel->paneltab==NULL)
- if(block->minx <= mx && block->maxx >= mx)
- if(block->miny <= my && block->maxy+PNL_HEADER >= my)
- inside= 1;
+ if(block->minx <= mx && block->maxx >= mx)
+ if(block->miny <= my && block->maxy+PNL_HEADER >= my)
+ inside= 1;
if(inside) {
/* clicked at panel header? */
- if(block->panel->flag & PNL_CLOSEDX) {
+ if(pa->flag & PNL_CLOSEDX) {
if(block->minx <= mx && block->minx+PNL_HEADER >= mx)
inside_header= 1;
}
else if((block->maxy <= my) && (block->maxy+PNL_HEADER >= my)) {
inside_header= 1;
}
- else if(block->panel->control & UI_PNL_SCALE) {
+ else if(pa->control & UI_PNL_SCALE) {
if(block->maxx-PNL_HEADER <= mx)
if(block->miny+PNL_HEADER >= my)
inside_scale= 1;
@@ -1238,8 +1278,8 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
ui_handle_panel_header(C, block, mx, my);
break;
}
- else if(inside_scale && !(block->panel->flag & PNL_CLOSED)) {
- panel_activate_state(C, block->panel, PANEL_STATE_DRAG_SCALE);
+ else if(inside_scale && !(pa->flag & PNL_CLOSED)) {
+ panel_activate_state(C, pa, PANEL_STATE_DRAG_SCALE);
break;
}
}
@@ -1254,7 +1294,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
int zoom=0;
/* if panel is closed, only zoom if mouse is over the header */
- if (block->panel->flag & (PNL_CLOSEDX|PNL_CLOSEDY)) {
+ if (pa->flag & (PNL_CLOSEDX|PNL_CLOSEDY)) {
if (inside_header)
zoom=1;
}
@@ -1267,7 +1307,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
SpaceLink *sl= sa->spacedata.first;
if(sa->spacetype!=SPACE_BUTS) {
- if(!(block->panel->control & UI_PNL_SCALE)) {
+ if(!(pa->control & UI_PNL_SCALE)) {
if(event->type==PADPLUSKEY) sl->blockscale+= 0.1;
else sl->blockscale-= 0.1;
CLAMP(sl->blockscale, 0.6, 1.0);
@@ -1288,6 +1328,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
/**************** window level modal panel interaction **************/
+/* note, this is modal handler and should not swallow events for animation */
static int ui_handler_panel(bContext *C, wmEvent *event, void *userdata)
{
Panel *panel= userdata;
@@ -1303,8 +1344,6 @@ static int ui_handler_panel(bContext *C, wmEvent *event, void *userdata)
panel_activate_state(C, panel, PANEL_STATE_ANIMATION);
else
panel_activate_state(C, panel, PANEL_STATE_EXIT);
-
- return WM_UI_HANDLER_BREAK;
}
else if(event->type == MOUSEMOVE) {
if(data->state == PANEL_STATE_WAIT_UNTAB)
@@ -1345,7 +1384,12 @@ static void panel_activate_state(const bContext *C, Panel *pa, uiHandlePanelStat
if(state == PANEL_STATE_EXIT || state == PANEL_STATE_ANIMATION) {
if(data && data->state != PANEL_STATE_ANIMATION) {
- test_add_new_tabs(ar); // also copies locations of tabs in dragged panel
+ /* XXX:
+ * - the panel tabbing function call below (test_add_new_tabs()) has been commented out
+ * "It is too easy to do by accident when reordering panels, is very hard to control and use, and has no real benefit." - BillRey
+ * Aligorith, 2009Sep
+ */
+ //test_add_new_tabs(ar); // also copies locations of tabs in dragged panel
check_panel_overlap(ar, NULL); // clears
}
@@ -1363,14 +1407,14 @@ static void panel_activate_state(const bContext *C, Panel *pa, uiHandlePanelStat
MEM_freeN(data);
pa->activedata= NULL;
- WM_event_remove_ui_handler(&win->handlers, ui_handler_panel, ui_handler_remove_panel, pa);
+ WM_event_remove_ui_handler(&win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa);
}
else {
if(!data) {
data= MEM_callocN(sizeof(uiHandlePanelData), "uiHandlePanelData");
pa->activedata= data;
- WM_event_add_ui_handler(C, &win->handlers, ui_handler_panel, ui_handler_remove_panel, pa);
+ WM_event_add_ui_handler(C, &win->modalhandlers, ui_handler_panel, ui_handler_remove_panel, pa);
}
if(ELEM(state, PANEL_STATE_ANIMATION, PANEL_STATE_DRAG))
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 61cf612e912..0f04333c6c5 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -38,6 +38,7 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_ghash.h"
#include "BKE_context.h"
#include "BKE_icons.h"
@@ -75,13 +76,14 @@
/*********************** Menu Data Parsing ********************* */
-typedef struct {
+typedef struct MenuEntry {
char *str;
int retval;
int icon;
+ int sepr;
} MenuEntry;
-typedef struct {
+typedef struct MenuData {
char *instr;
char *title;
int titleicon;
@@ -111,7 +113,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)
+static void menudata_add_item(MenuData *md, char *str, int retval, int icon, int sepr)
{
if (md->nitems==md->itemssize) {
int nsize= md->itemssize?(md->itemssize<<1):1;
@@ -129,6 +131,7 @@ static void menudata_add_item(MenuData *md, char *str, int retval, int icon)
md->items[md->nitems].str= str;
md->items[md->nitems].retval= retval;
md->items[md->nitems].icon= icon;
+ md->items[md->nitems].sepr= sepr;
md->nitems++;
}
@@ -142,12 +145,13 @@ void menudata_free(MenuData *md)
/**
* Parse menu description strings, string is of the
- * form "[sss%t|]{(sss[%xNN]|), (%l|)}", ssss%t indicates the
+ * form "[sss%t|]{(sss[%xNN]|), (%l|), (sss%l|)}", ssss%t indicates the
* menu title, sss or sss%xNN indicates an option,
* if %xNN is given then NN is the return value if
* that option is selected otherwise the return value
* is the index of the option (starting with 1). %l
- * indicates a seperator.
+ * indicates a seperator, sss%l indicates a label and
+ * new column.
*
* @param str String to be parsed.
* @retval new menudata structure, free with menudata_free()
@@ -157,7 +161,7 @@ MenuData *decompose_menu_string(char *str)
char *instr= BLI_strdup(str);
MenuData *md= menudata_new(instr);
char *nitem= NULL, *s= instr;
- int nicon=0, nretval= 1, nitem_is_title= 0;
+ int nicon=0, nretval= 1, nitem_is_title= 0, nitem_is_sepr= 0;
while (1) {
char c= *s;
@@ -174,7 +178,10 @@ MenuData *decompose_menu_string(char *str)
*s= '\0';
s++;
} else if (s[1]=='l') {
- nitem= "%l";
+ nitem_is_sepr= 1;
+ if(!nitem) nitem= "";
+
+ *s= '\0';
s++;
} else if (s[1]=='i') {
nicon= atoi(s+2);
@@ -186,15 +193,18 @@ MenuData *decompose_menu_string(char *str)
if (nitem) {
*s= '\0';
- if (nitem_is_title) {
+ if(nitem_is_title) {
menudata_set_title(md, nitem, nicon);
nitem_is_title= 0;
- } else {
+ }
+ else if(nitem_is_sepr) {
/* prevent separator to get a value */
- if(nitem[0]=='%' && nitem[1]=='l')
- menudata_add_item(md, nitem, -1, nicon);
- else
- menudata_add_item(md, nitem, nretval, nicon);
+ menudata_add_item(md, nitem, -1, nicon, 1);
+ nretval= md->nitems+1;
+ nitem_is_sepr= 0;
+ }
+ else {
+ menudata_add_item(md, nitem, nretval, nicon, 0);
nretval= md->nitems+1;
}
@@ -291,22 +301,39 @@ void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar)
/************************* Creating Tooltips **********************/
+#define MAX_TOOLTIP_LINES 8
+
typedef struct uiTooltipData {
rcti bbox;
uiFontStyle fstyle;
- char *tip;
+ char lines[MAX_TOOLTIP_LINES][512];
+ int linedark[MAX_TOOLTIP_LINES];
+ int totline;
+ int toth, spaceh, lineh;
} uiTooltipData;
static void ui_tooltip_region_draw(const bContext *C, ARegion *ar)
{
uiTooltipData *data= ar->regiondata;
+ rcti bbox= data->bbox;
+ int a;
ui_draw_menu_back(U.uistyles.first, NULL, &data->bbox);
/* draw text */
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
uiStyleFontSet(&data->fstyle);
- uiStyleFontDraw(&data->fstyle, &data->bbox, data->tip);
+
+ bbox.ymax= bbox.ymax - 0.5f*((bbox.ymax - bbox.ymin) - data->toth);
+ 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);
+
+ 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)
@@ -314,7 +341,6 @@ static void ui_tooltip_region_free(ARegion *ar)
uiTooltipData *data;
data= ar->regiondata;
- MEM_freeN(data->tip);
MEM_freeN(data);
ar->regiondata= NULL;
}
@@ -325,12 +351,75 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
static ARegionType type;
ARegion *ar;
uiTooltipData *data;
+ IDProperty *prop;
+ char buf[512];
float fonth, fontw, aspect= but->block->aspect;
float x1f, x2f, y1f, y2f;
- int x1, x2, y1, y2, winx, winy, ofsx, ofsy;
+ int x1, x2, y1, y2, winx, winy, ofsx, ofsy, w, h, a;
+
+ /* create tooltip data */
+ data= MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
+
+ if(but->tip && strlen(but->tip)) {
+ BLI_strncpy(data->lines[data->totline], but->tip, sizeof(data->lines[0]));
+ data->totline++;
+ }
+
+ if(but->optype && !(but->block->flag & UI_BLOCK_LOOP)) {
+ /* operator keymap (not menus, they already have it) */
+ prop= (but->opptr)? but->opptr->data: NULL;
+
+ 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->totline++;
+ }
+ }
+
+ if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
+ /* full string */
+ 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->totline++;
+ }
+ }
- if(!but->tip || strlen(but->tip)==0)
+ if(but->rnaprop) {
+ if(but->flag & UI_BUT_DRIVEN) {
+ 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->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++;
+ }
+ else if (but->optype) {
+ PointerRNA *opptr;
+ char *str;
+ opptr= uiButGetOperatorPtrRNA(but); /* allocated when needed, the button owns it */
+
+ 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++;
+
+ MEM_freeN(str);
+ }
+
+ if(data->totline == 0) {
+ MEM_freeN(data);
return NULL;
+ }
/* create area region */
ar= ui_add_temporary_region(CTX_wm_screen(C));
@@ -339,21 +428,30 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
type.draw= ui_tooltip_region_draw;
type.free= ui_tooltip_region_free;
ar->type= &type;
-
- /* create tooltip data */
- data= MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
- data->tip= BLI_strdup(but->tip);
/* set font, get bb */
data->fstyle= style->widget; /* copy struct */
data->fstyle.align= UI_STYLE_TEXT_CENTER;
ui_fontscale(&data->fstyle.points, aspect);
uiStyleFontSet(&data->fstyle);
- fontw= aspect * BLF_width(data->tip);
- fonth= aspect * BLF_height(data->tip);
+
+ h= BLF_height(data->lines[0]);
+
+ for(a=0, fontw=0, fonth=0; a<data->totline; a++) {
+ w= BLF_width(data->lines[a]);
+ fontw= MAX2(fontw, w);
+ fonth += (a == 0)? h: h+5;
+ }
+
+ fontw *= aspect;
+ fonth *= aspect;
ar->regiondata= data;
+ data->toth= fonth;
+ data->lineh= h*aspect;
+ data->spaceh= 5*aspect;
+
/* compute position */
ofsx= (but->block->panel)? but->block->panel->ofsx: 0;
ofsy= (but->block->panel)? but->block->panel->ofsy: 0;
@@ -437,6 +535,7 @@ struct uiSearchItems {
int *icons;
AutoComplete *autocpl;
+ void *active;
};
typedef struct uiSearchboxData {
@@ -459,6 +558,14 @@ int uiSearchItemAdd(uiSearchItems *items, const char *name, void *poin, int icon
return 1;
}
+ /* hijack for finding active item */
+ if(items->active) {
+ if(poin==items->active)
+ items->offset_i= items->totitem;
+ items->totitem++;
+ return 1;
+ }
+
if(items->totitem>=items->maxitem) {
items->more= 1;
return 0;
@@ -597,20 +704,52 @@ void ui_searchbox_update(bContext *C, ARegion *ar, uiBut *but, int reset)
/* reset vars */
data->items.totitem= 0;
data->items.more= 0;
- if(reset==0)
+ if(reset==0) {
data->items.offset_i= data->items.offset;
+ }
else {
data->items.offset_i= data->items.offset= 0;
data->active= 0;
+
+ /* handle active */
+ if(but->search_func && but->func_arg2) {
+ data->items.active= but->func_arg2;
+ but->search_func(C, but->search_arg, but->editstr, &data->items);
+ data->items.active= NULL;
+
+ /* found active item, calculate real offset by centering it */
+ if(data->items.totitem) {
+ /* first case, begin of list */
+ if(data->items.offset_i < data->items.maxitem) {
+ data->active= data->items.offset_i+1;
+ data->items.offset_i= 0;
+ }
+ else {
+ /* second case, end of list */
+ if(data->items.totitem - data->items.offset_i <= data->items.maxitem) {
+ data->active= 1 + data->items.offset_i - data->items.totitem + data->items.maxitem;
+ data->items.offset_i= data->items.totitem - data->items.maxitem;
+ }
+ else {
+ /* center active item */
+ data->items.offset_i -= data->items.maxitem/2;
+ data->active= 1 + data->items.maxitem/2;
+ }
+ }
+ }
+ data->items.offset= data->items.offset_i;
+ data->items.totitem= 0;
+ }
}
/* callback */
if(but->search_func)
but->search_func(C, but->search_arg, but->editstr, &data->items);
- if(reset) {
+ /* handle case where editstr is equal to one of items */
+ if(reset && data->active==0) {
int a;
- /* handle case where editstr is equal to one of items */
+
for(a=0; a<data->items.totitem; a++) {
char *cpoin= strchr(data->items.names[a], '|');
@@ -619,7 +758,7 @@ void ui_searchbox_update(bContext *C, ARegion *ar, uiBut *but, int reset)
data->active= a+1;
if(cpoin) cpoin[0]= '|';
}
- if(data->items.totitem==1)
+ if(data->items.totitem==1 && but->editstr[0])
data->active= 1;
}
@@ -633,12 +772,14 @@ void ui_searchbox_autocomplete(bContext *C, ARegion *ar, uiBut *but, char *str)
{
uiSearchboxData *data= ar->regiondata;
- data->items.autocpl= autocomplete_begin(str, ui_get_but_string_max_length(but));
+ if(str[0]) {
+ data->items.autocpl= autocomplete_begin(str, ui_get_but_string_max_length(but));
- but->search_func(C, but->search_arg, but->editstr, &data->items);
+ but->search_func(C, but->search_arg, but->editstr, &data->items);
- autocomplete_end(data->items.autocpl, str);
- data->items.autocpl= NULL;
+ autocomplete_end(data->items.autocpl, str);
+ data->items.autocpl= NULL;
+ }
}
static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
@@ -666,13 +807,15 @@ static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
}
/* indicate more */
if(data->items.more) {
+ ui_searchbox_butrect(&rect, data, data->items.maxitem-1);
glEnable(GL_BLEND);
- UI_icon_draw((data->bbox.xmax-data->bbox.xmin)/2, 8, ICON_TRIA_DOWN);
+ UI_icon_draw((rect.xmax-rect.xmin)/2, rect.ymin-9, ICON_TRIA_DOWN);
glDisable(GL_BLEND);
}
if(data->items.offset) {
+ ui_searchbox_butrect(&rect, data, 0);
glEnable(GL_BLEND);
- UI_icon_draw((data->bbox.xmax-data->bbox.xmin)/2, data->bbox.ymax-13, ICON_TRIA_UP);
+ UI_icon_draw((rect.xmax-rect.xmin)/2, rect.ymax-7, ICON_TRIA_UP);
glDisable(GL_BLEND);
}
}
@@ -694,6 +837,8 @@ static void ui_searchbox_region_free(ARegion *ar)
ar->regiondata= NULL;
}
+static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but, uiBlock *block);
+
ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
{
uiStyle *style= U.uistyles.first; // XXX pass on as arg
@@ -714,7 +859,7 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
/* create searchbox data */
data= MEM_callocN(sizeof(uiSearchboxData), "uiSearchboxData");
-
+
/* set font, get bb */
data->fstyle= style->widget; /* copy struct */
data->fstyle.align= UI_STYLE_TEXT_CENTER;
@@ -796,10 +941,14 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
}
}
if(y1 < 0) {
- y1 += 36;
- y2 += 36;
+ int newy1;
+ UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, 0, &newy1);
+ newy1 += butregion->winrct.ymin;
+
+ y2= y2-y1 + newy1;
+ y1= newy1;
}
-
+
/* widget rect, in region coords */
data->bbox.xmin= MENU_SHADOW_SIDE;
data->bbox.xmax= x2-x1 + MENU_SHADOW_SIDE;
@@ -1177,24 +1326,21 @@ void ui_popup_block_free(bContext *C, uiPopupBlockHandle *handle)
/***************************** Menu Button ***************************/
-uiBlock *ui_block_func_MENU(bContext *C, uiPopupBlockHandle *handle, void *arg_but)
+static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
{
- uiBut *but= arg_but;
- uiBlock *block;
+ uiBlock *block= uiLayoutGetBlock(layout);
+ uiPopupBlockHandle *handle= block->handle;
+ uiLayout *split, *column=NULL;
uiBut *bt;
MenuData *md;
- ListBase lb;
- float aspect;
- int width, height, boxh, columns, rows, startx, starty, x1, y1, xmax, a;
-
- /* create the block */
- block= uiBeginBlock(C, handle->region, "menu", UI_EMBOSSP);
- block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT;
+ MenuEntry *entry;
+ char *instr= arg_str;
+ int columns, rows, a, b;
/* compute menu data */
- md= decompose_menu_string(but->str);
+ md= decompose_menu_string(instr);
- /* columns and row calculation */
+ /* columns and row estimation */
columns= (md->nitems+20)/20;
if(columns<1)
columns= 1;
@@ -1206,180 +1352,114 @@ uiBlock *ui_block_func_MENU(bContext *C, uiPopupBlockHandle *handle, void *arg_b
rows= 1;
while(rows*columns<md->nitems)
rows++;
-
- /* prevent scaling up of pupmenu */
- aspect= but->block->aspect;
- if(aspect < 1.0f)
- aspect = 1.0f;
-
- /* size and location */
- if(md->title)
- width= 1.5*aspect*strlen(md->title)+UI_GetStringWidth(md->title);
- else
- width= 0;
- for(a=0; a<md->nitems; a++) {
- xmax= aspect*UI_GetStringWidth(md->items[a].str);
- if(md->items[a].icon)
- xmax += 20*aspect;
- if(xmax>width)
- width= xmax;
- }
-
- width+= 10;
- if(width < (but->x2 - but->x1))
- width = (but->x2 - but->x1);
- if(width<50)
- width=50;
-
- boxh= MENU_BUTTON_HEIGHT;
-
- height= rows*boxh;
- if(md->title)
- height+= boxh;
-
- /* here we go! */
- startx= but->x1;
- starty= but->y1;
-
+ /* create title */
if(md->title) {
- uiBut *bt;
-
- if (md->titleicon) {
- bt= uiDefIconTextBut(block, LABEL, 0, md->titleicon, md->title, startx, (short)(starty+rows*boxh), (short)width, (short)boxh, NULL, 0.0, 0.0, 0, 0, "");
- } else {
- bt= uiDefBut(block, LABEL, 0, md->title, startx, (short)(starty+rows*boxh), (short)width, (short)boxh, NULL, 0.0, 0.0, 0, 0, "");
+ if(md->titleicon) {
+ uiItemL(layout, md->title, md->titleicon);
+ }
+ else {
+ uiItemL(layout, md->title, 0);
+ bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
}
- for(a=0; a<md->nitems; a++) {
+ /* inconsistent, but menus with labels do not look good flipped */
+ for(a=0, b=0; a<md->nitems; a++, b++) {
+ entry= &md->items[a];
+
+ if(entry->sepr && entry->str[0])
+ block->flag |= UI_BLOCK_NO_FLIP;
+ }
+
+ /* create items */
+ split= uiLayoutSplit(layout, 0);
+
+ for(a=0, b=0; a<md->nitems; a++, b++) {
+ if(block->flag & UI_BLOCK_NO_FLIP)
+ entry= &md->items[a];
+ else
+ entry= &md->items[md->nitems-a-1];
- x1= startx + width*((int)(md->nitems-a-1)/rows);
- y1= starty - boxh*(rows - ((md->nitems - a - 1)%rows)) + (rows*boxh);
+ /* new column on N rows or on separation label */
+ if((b % rows == 0) || (entry->sepr && entry->str[0])) {
+ column= uiLayoutColumn(split, 0);
+ b= 0;
+ }
- if (strcmp(md->items[md->nitems-a-1].str, "%l")==0) {
- bt= uiDefBut(block, SEPR, B_NOP, "", x1, y1,(short)(width-(rows>1)), (short)(boxh-1), NULL, 0.0, 0.0, 0, 0, "");
+ if(entry->sepr) {
+ uiItemL(column, entry->str, entry->icon);
+ bt= block->buttons.last;
+ bt->flag= UI_TEXT_LEFT;
}
- else if(md->items[md->nitems-a-1].icon) {
- bt= uiDefIconTextButF(block, BUTM|FLO, B_NOP, md->items[md->nitems-a-1].icon ,md->items[md->nitems-a-1].str, x1, y1,(short)(width-(rows>1)), (short)(boxh-1), &handle->retvalue, (float) md->items[md->nitems-a-1].retval, 0.0, 0, 0, "");
+ else if(entry->icon) {
+ uiDefIconTextButF(block, BUTM|FLO, B_NOP, entry->icon, entry->str, 0, 0,
+ UI_UNIT_X*5, UI_UNIT_Y, &handle->retvalue, (float) entry->retval, 0.0, 0, 0, "");
}
else {
- bt= uiDefButF(block, BUTM|FLO, B_NOP, md->items[md->nitems-a-1].str, x1, y1,(short)(width-(rows>1)), (short)(boxh-1), &handle->retvalue, (float) md->items[md->nitems-a-1].retval, 0.0, 0, 0, "");
+ uiDefButF(block, BUTM|FLO, B_NOP, entry->str, 0, 0,
+ UI_UNIT_X*5, UI_UNIT_X, &handle->retvalue, (float) entry->retval, 0.0, 0, 0, "");
}
}
menudata_free(md);
-
- /* the code up here has flipped locations, because of change of preferred order */
- /* thats why we have to switch list order too, to make arrowkeys work */
-
- lb.first= lb.last= NULL;
- bt= block->buttons.first;
- while(bt) {
- uiBut *next= bt->next;
- BLI_remlink(&block->buttons, bt);
- BLI_addhead(&lb, bt);
- bt= next;
- }
- block->buttons= lb;
-
- block->direction= UI_TOP;
- uiEndBlock(C, block);
-
- return block;
}
-uiBlock *ui_block_func_ICONROW(bContext *C, uiPopupBlockHandle *handle, void *arg_but)
+void ui_block_func_ICONROW(bContext *C, uiLayout *layout, void *arg_but)
{
+ uiBlock *block= uiLayoutGetBlock(layout);
+ uiPopupBlockHandle *handle= block->handle;
uiBut *but= arg_but;
- uiBlock *block;
int a;
- block= uiBeginBlock(C, handle->region, "menu", UI_EMBOSSP);
- block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT;
-
- for(a=(int)but->hardmin; a<=(int)but->hardmax; a++) {
- uiDefIconButF(block, BUTM|FLO, B_NOP, but->icon+(a-but->hardmin), 0, (short)(18*a), (short)(but->x2-but->x1-4), 18, &handle->retvalue, (float)a, 0.0, 0, 0, "");
- }
-
- block->direction= UI_TOP;
-
- uiEndBlock(C, block);
-
- return block;
+ for(a=(int)but->hardmin; a<=(int)but->hardmax; a++)
+ uiDefIconButF(block, BUTM|FLO, B_NOP, but->icon+(a-but->hardmin), 0, 0, UI_UNIT_X*5, UI_UNIT_Y,
+ &handle->retvalue, (float)a, 0.0, 0, 0, "");
}
-uiBlock *ui_block_func_ICONTEXTROW(bContext *C, uiPopupBlockHandle *handle, void *arg_but)
+void ui_block_func_ICONTEXTROW(bContext *C, uiLayout *layout, void *arg_but)
{
- uiBut *but= arg_but;
- uiBlock *block;
+ uiBlock *block= uiLayoutGetBlock(layout);
+ uiPopupBlockHandle *handle= block->handle;
+ uiBut *but= arg_but, *bt;
MenuData *md;
- int width, xmax, ypos, a;
-
- block= uiBeginBlock(C, handle->region, "menu", UI_EMBOSSP);
- block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT;
+ MenuEntry *entry;
+ int a;
md= decompose_menu_string(but->str);
- /* size and location */
- /* expand menu width to fit labels */
- if(md->title)
- width= 2*strlen(md->title)+UI_GetStringWidth(md->title);
- else
- width= 0;
-
- for(a=0; a<md->nitems; a++) {
- xmax= UI_GetStringWidth(md->items[a].str);
- if(xmax>width) width= xmax;
+ /* title */
+ if(md->title) {
+ bt= uiDefBut(block, LABEL, 0, md->title, 0, 0, UI_UNIT_X*5, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ bt->flag= UI_TEXT_LEFT;
}
- width+= 30;
- if (width<50) width=50;
-
- ypos = 1;
-
/* loop through the menu options and draw them out with icons & text labels */
for(a=0; a<md->nitems; a++) {
+ entry= &md->items[md->nitems-a-1];
- /* add a space if there's a separator (%l) */
- if (strcmp(md->items[a].str, "%l")==0) {
- ypos +=3;
- }
- else {
- uiDefIconTextButF(block, BUTM|FLO, B_NOP, (short)((but->icon)+(md->items[a].retval-but->hardmin)), md->items[a].str, 0, ypos,(short)width, 19, &handle->retvalue, (float) md->items[a].retval, 0.0, 0, 0, "");
- ypos += 20;
- }
+ if(entry->sepr)
+ uiItemS(layout);
+ else
+ uiDefIconTextButF(block, BUTM|FLO, B_NOP, (short)((but->icon)+(entry->retval-but->hardmin)), entry->str,
+ 0, 0, UI_UNIT_X*5, UI_UNIT_Y, &handle->retvalue, (float) entry->retval, 0.0, 0, 0, "");
}
-
- if(md->title) {
- uiBut *bt;
- bt= uiDefBut(block, LABEL, 0, md->title, 0, ypos, (short)width, 19, NULL, 0.0, 0.0, 0, 0, "");
- bt->flag= UI_TEXT_LEFT;
- }
-
menudata_free(md);
-
- block->direction= UI_TOP;
-
- uiBoundsBlock(block, 3);
- uiEndBlock(C, block);
-
- return block;
}
+#if 0
static void ui_warp_pointer(short x, short y)
{
/* XXX 2.50 which function to use for this? */
-#if 0
/* OSX has very poor mousewarp support, it sends events;
this causes a menu being pressed immediately ... */
#ifndef __APPLE__
warp_pointer(x, y);
#endif
-#endif
}
+#endif
/********************* Color Button ****************/
@@ -1417,11 +1497,10 @@ static void update_picker_hex(uiBlock *block, float *rgb)
// this updates button strings, is hackish... but button pointers are on stack of caller function
for(bt= block->buttons.first; bt; bt= bt->next) {
- if(strcmp(bt->str, "Hex: ")==0) {
+ if(strcmp(bt->str, "Hex: ")==0)
strcpy(bt->poin, col);
- ui_check_but(bt);
- break;
- }
+
+ ui_check_but(bt);
}
}
@@ -1463,6 +1542,8 @@ void ui_update_block_buts_hsv(uiBlock *block, float *hsv)
ui_set_but_val(bt, hsv[2]);
}
}
+
+ ui_check_but(bt);
}
}
@@ -1504,6 +1585,8 @@ static void ui_update_block_buts_hex(uiBlock *block, char *hexcol)
ui_set_but_val(bt, v);
}
}
+
+ ui_check_but(bt);
}
}
@@ -2022,440 +2105,115 @@ void uiBlockColorbandButtons(uiBlock *block, ColorBand *coba, rctf *butr, int ev
}
-/* ******************** PUPmenu ****************** */
+/************************ Popup Menu Memory ****************************/
-static int pupmenu_set= 0;
-
-void uiPupMenuSetActive(int val)
+static int ui_popup_menu_hash(char *str)
{
- pupmenu_set= val;
+ return BLI_ghashutil_strhash(str);
}
-/* value== -1 read, otherwise set */
-static int pupmenu_memory(char *str, int value)
+/* but == NULL read, otherwise set */
+uiBut *ui_popup_menu_memory(uiBlock *block, uiBut *but)
{
static char mem[256], first=1;
- int val=0, nr=0;
+ int hash= block->puphash;
if(first) {
- memset(mem, 0, 256);
+ /* init */
+ memset(mem, -1, sizeof(mem));
first= 0;
}
- while(str[nr]) {
- val+= str[nr];
- nr++;
- }
-
- if(value >= 0) mem[ val & 255 ]= value;
- else return mem[ val & 255 ];
-
- return 0;
-}
-
-#define PUP_LABELH 6
-
-typedef struct uiPupMenuInfo {
- char *instr;
- int mx, my;
- int startx, starty;
- int maxrow;
-} uiPupMenuInfo;
-
-uiBlock *ui_block_func_PUPMENU(bContext *C, uiPopupBlockHandle *handle, void *arg_info)
-{
- uiBlock *block;
- uiPupMenuInfo *info;
- int columns, rows, mousemove[2]= {0, 0}, mousewarp= 0;
- int width, height, xmax, ymax, maxrow;
- int a, startx, starty, endx, endy, x1, y1;
- int lastselected;
- MenuData *md;
-
- info= arg_info;
- maxrow= info->maxrow;
- height= 0;
-
- /* block stuff first, need to know the font */
- block= uiBeginBlock(C, handle->region, "menu", UI_EMBOSSP);
- uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1|UI_BLOCK_NUMSELECT);
- block->direction= UI_DOWN;
-
- md= decompose_menu_string(info->instr);
-
- rows= md->nitems;
- if(rows<1)
- rows= 1;
-
- columns= 1;
-
- /* size and location, title slightly bigger for bold */
- if(md->title) {
- width= 2*strlen(md->title)+UI_GetStringWidth(md->title);
- width /= columns;
- }
- else width= 0;
-
- for(a=0; a<md->nitems; a++) {
- xmax= UI_GetStringWidth(md->items[a].str);
- if(xmax>width) width= xmax;
-
- if(strcmp(md->items[a].str, "%l")==0) height+= PUP_LABELH;
- else height+= MENU_BUTTON_HEIGHT;
- }
-
- width+= 10;
- if (width<50) width=50;
-
- wm_window_get_size(CTX_wm_window(C), &xmax, &ymax);
-
- /* set first item */
- lastselected= 0;
- if(pupmenu_set) {
- lastselected= pupmenu_set-1;
- pupmenu_set= 0;
- }
- else if(md->nitems>1) {
- lastselected= pupmenu_memory(info->instr, -1);
- }
-
- startx= info->mx-(0.8*(width));
- starty= info->my-height+MENU_BUTTON_HEIGHT/2;
- if(lastselected>=0 && lastselected<md->nitems) {
- for(a=0; a<md->nitems; a++) {
- if(a==lastselected) break;
- if( strcmp(md->items[a].str, "%l")==0) starty+= PUP_LABELH;
- else starty+=MENU_BUTTON_HEIGHT;
- }
-
- //starty= info->my-height+MENU_BUTTON_HEIGHT/2+lastselected*MENU_BUTTON_HEIGHT;
- }
-
- if(startx<10) {
- startx= 10;
- }
- if(starty<10) {
- mousemove[1]= 10-starty;
- starty= 10;
- }
-
- endx= startx+width*columns;
- endy= starty+height;
-
- if(endx>xmax) {
- endx= xmax-10;
- startx= endx-width*columns;
- }
- if(endy>ymax-20) {
- mousemove[1]= ymax-endy-20;
- endy= ymax-20;
- starty= endy-height;
- }
- if(mousemove[0] || mousemove[1]) {
- ui_warp_pointer(info->mx+mousemove[0], info->my+mousemove[1]);
- mousemove[0]= info->mx;
- mousemove[1]= info->my;
- mousewarp= 1;
+ if(but) {
+ /* set */
+ mem[hash & 255 ]= BLI_findindex(&block->buttons, but);
+ return NULL;
}
-
- /* here we go! */
- if(md->title) {
- uiBut *bt;
- char titlestr[256];
-
- if(md->titleicon) {
- width+= 20;
- sprintf(titlestr, " %s", md->title);
- uiDefIconTextBut(block, LABEL, 0, md->titleicon, titlestr, startx, (short)(starty+height), width, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
- }
- else {
- bt= uiDefBut(block, LABEL, 0, md->title, startx, (short)(starty+height), columns*width, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
- bt->flag= UI_TEXT_LEFT;
- }
-
- //uiDefBut(block, SEPR, 0, "", startx, (short)(starty+height)-MENU_SEPR_HEIGHT, width, MENU_SEPR_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
+ else {
+ /* get */
+ return BLI_findlink(&block->buttons, mem[hash & 255]);
}
+}
- x1= startx + width*((int)a/rows);
- y1= starty + height - MENU_BUTTON_HEIGHT; // - MENU_SEPR_HEIGHT;
-
- for(a=0; a<md->nitems; a++) {
- char *name= md->items[a].str;
- int icon = md->items[a].icon;
-
- if(strcmp(name, "%l")==0) {
- uiDefBut(block, SEPR, B_NOP, "", x1, y1, width, PUP_LABELH, NULL, 0, 0.0, 0, 0, "");
- y1 -= PUP_LABELH;
- }
- else if (icon) {
- uiDefIconButF(block, BUTM, B_NOP, icon, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, &handle->retvalue, (float) md->items[a].retval, 0.0, 0, 0, "");
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else {
- uiDefButF(block, BUTM, B_NOP, name, x1, y1, width, MENU_BUTTON_HEIGHT-1, &handle->retvalue, (float) md->items[a].retval, 0.0, 0, 0, "");
- y1 -= MENU_BUTTON_HEIGHT;
- }
- }
-
- uiBoundsBlock(block, 1);
- uiEndBlock(C, block);
+/******************** Popup Menu with callback or string **********************/
- menudata_free(md);
+struct uiPopupMenu {
+ uiBlock *block;
+ uiLayout *layout;
+ uiBut *but;
- /* XXX 2.5 need to store last selected */
-#if 0
- /* calculate last selected */
- if(event & ui_return_ok) {
- lastselected= 0;
- for(a=0; a<md->nitems; a++) {
- if(val==md->items[a].retval) lastselected= a;
- }
-
- pupmenu_memory(info->instr, lastselected);
- }
-#endif
-
- /* XXX 2.5 need to warp back */
-#if 0
- if(mousemove[1] && (event & ui_return_out)==0)
- ui_warp_pointer(mousemove[0], mousemove[1]);
- return val;
-#endif
+ int mx, my, popup, slideout;
+ int startx, starty, maxrow;
- return block;
-}
+ uiMenuCreateFunc menu_func;
+ void *menu_arg;
+};
-uiBlock *ui_block_func_PUPMENUCOL(bContext *C, uiPopupBlockHandle *handle, void *arg_info)
+static uiBlock *ui_block_func_POPUP(bContext *C, uiPopupBlockHandle *handle, void *arg_pup)
{
uiBlock *block;
- uiPupMenuInfo *info;
- int columns, rows, mousemove[2]= {0, 0}, mousewarp;
- int width, height, xmax, ymax, maxrow;
- int a, startx, starty, endx, endy, x1, y1;
- float fvalue;
- MenuData *md;
-
- info= arg_info;
- maxrow= info->maxrow;
- height= 0;
-
- /* block stuff first, need to know the font */
- block= uiBeginBlock(C, handle->region, "menu", UI_EMBOSSP);
- uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1|UI_BLOCK_NUMSELECT);
- block->direction= UI_DOWN;
-
- md= decompose_menu_string(info->instr);
-
- /* columns and row calculation */
- columns= (md->nitems+maxrow)/maxrow;
- if (columns<1) columns= 1;
-
- if(columns > 8) {
- maxrow += 5;
- columns= (md->nitems+maxrow)/maxrow;
- }
-
- rows= (int) md->nitems/columns;
- if (rows<1) rows= 1;
-
- while (rows*columns<(md->nitems+columns) ) rows++;
-
- /* size and location, title slightly bigger for bold */
- if(md->title) {
- width= 2*strlen(md->title)+UI_GetStringWidth(md->title);
- width /= columns;
- }
- else width= 0;
-
- for(a=0; a<md->nitems; a++) {
- xmax= UI_GetStringWidth(md->items[a].str);
- if(xmax>width) width= xmax;
- }
-
- width+= 10;
- if (width<50) width=50;
-
- height= rows*MENU_BUTTON_HEIGHT;
- if (md->title) height+= MENU_BUTTON_HEIGHT;
-
- wm_window_get_size(CTX_wm_window(C), &xmax, &ymax);
-
- /* find active item */
- fvalue= handle->retvalue;
- for(a=0; a<md->nitems; a++) {
- if( md->items[a].retval== (int)fvalue ) break;
- }
-
- /* no active item? */
- if(a==md->nitems) {
- if(md->title) a= -1;
- else a= 0;
- }
-
- if(a>0)
- startx = info->mx-width/2 - ((int)(a)/rows)*width;
- else
- startx= info->mx-width/2;
- starty = info->my-height + MENU_BUTTON_HEIGHT/2 + ((a)%rows)*MENU_BUTTON_HEIGHT;
-
- if (md->title) starty+= MENU_BUTTON_HEIGHT;
-
- if(startx<10) {
- mousemove[0]= 10-startx;
- startx= 10;
- }
- if(starty<10) {
- mousemove[1]= 10-starty;
- starty= 10;
- }
-
- endx= startx+width*columns;
- endy= starty+height;
-
- if(endx>xmax) {
- mousemove[0]= xmax-endx-10;
- endx= xmax-10;
- startx= endx-width*columns;
- }
- if(endy>ymax) {
- mousemove[1]= ymax-endy-10;
- endy= ymax-10;
- starty= endy-height;
- }
+ uiBut *bt;
+ ScrArea *sa;
+ ARegion *ar;
+ uiPopupMenu *pup= arg_pup;
+ int offset, direction, minwidth, flip;
- if(mousemove[0] || mousemove[1]) {
- ui_warp_pointer(info->mx+mousemove[0], info->my+mousemove[1]);
- mousemove[0]= info->mx;
- mousemove[1]= info->my;
- mousewarp= 1;
+ if(pup->menu_func) {
+ pup->block->handle= handle;
+ pup->menu_func(C, pup->layout, pup->menu_arg);
+ pup->block->handle= NULL;
}
- /* here we go! */
- if(md->title) {
- uiBut *bt;
+ if(pup->but) {
+ /* minimum width to enforece */
+ minwidth= pup->but->x2 - pup->but->x1;
- if(md->titleicon) {
+ if(pup->but->type == PULLDOWN || pup->but->menu_create_func) {
+ direction= UI_DOWN;
+ flip= 1;
}
else {
- bt= uiDefBut(block, LABEL, 0, md->title, startx, (short)(starty+rows*MENU_BUTTON_HEIGHT), columns*width, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
- bt->flag= UI_TEXT_LEFT;
+ direction= UI_TOP;
+ flip= 0;
}
}
-
- for(a=0; a<md->nitems; a++) {
- char *name= md->items[a].str;
- int icon = md->items[a].icon;
-
- x1= startx + width*((int)a/rows);
- y1= starty - MENU_BUTTON_HEIGHT*(a%rows) + (rows-1)*MENU_BUTTON_HEIGHT;
-
- if(strcmp(name, "%l")==0) {
- uiDefBut(block, SEPR, B_NOP, "", x1, y1, width, PUP_LABELH, NULL, 0, 0.0, 0, 0, "");
- y1 -= PUP_LABELH;
- }
- else if (icon) {
- uiDefIconButF(block, BUTM, B_NOP, icon, x1, y1, width+16, MENU_BUTTON_HEIGHT-1, &handle->retvalue, (float) md->items[a].retval, 0.0, 0, 0, "");
- y1 -= MENU_BUTTON_HEIGHT;
- }
- else {
- uiDefButF(block, BUTM, B_NOP, name, x1, y1, width, MENU_BUTTON_HEIGHT-1, &handle->retvalue, (float) md->items[a].retval, 0.0, 0, 0, "");
- y1 -= MENU_BUTTON_HEIGHT;
- }
+ else {
+ minwidth= 50;
+ direction= UI_DOWN;
+ flip= 1;
}
-
- uiBoundsBlock(block, 1);
- uiEndBlock(C, block);
-
- menudata_free(md);
-
- /* XXX 2.5 need to warp back */
-#if 0
- if((event & UI_RETURN_OUT)==0)
- ui_warp_pointer(mousemove[0], mousemove[1]);
-#endif
-
- return block;
-}
-/************************** Menu Definitions ***************************/
+ block= pup->block;
+
+ /* in some cases we create the block before the region,
+ so we set it delayed here if necessary */
+ if(BLI_findindex(&handle->region->uiblocks, block) == -1)
+ uiBlockSetRegion(block, handle->region);
-/* prototype */
-static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, void *arg_info);
+ block->direction= direction;
-struct uiPopupMenu {
- uiBlock *block;
- uiLayout *layout;
-};
+ uiBlockLayoutResolve(block, NULL, NULL);
-typedef struct uiMenuInfo {
- uiPopupMenu *pup;
- int mx, my, popup, slideout;
- int startx, starty;
-} uiMenuInfo;
+ if(pup->popup) {
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_RET_1);
+ uiBlockSetDirection(block, direction);
-/************************ Menu Definitions to uiBlocks ***********************/
+ /* offset the mouse position, possibly based on earlier selection */
+ offset= 1.5*MENU_BUTTON_HEIGHT;
-const char *ui_menu_enumpropname(char *opname, const char *propname, int retval)
-{
- wmOperatorType *ot= WM_operatortype_find(opname);
- PointerRNA ptr;
- PropertyRNA *prop;
+ if(block->flag & UI_BLOCK_POPUP_MEMORY) {
+ bt= ui_popup_menu_memory(block, NULL);
- if(!ot || !ot->srna)
- return "";
-
- RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- prop= RNA_struct_find_property(&ptr, propname);
-
- if(prop) {
- const EnumPropertyItem *item;
- int totitem, i;
-
- RNA_property_enum_items(&ptr, prop, &item, &totitem);
-
- for (i=0; i<totitem; i++) {
- if(item[i].value==retval)
- return item[i].name;
+ if(bt)
+ offset= -bt->y1 - 0.5f*MENU_BUTTON_HEIGHT;
}
- }
-
- return "";
-}
-
-typedef struct MenuItemLevel {
- int opcontext;
- char *opname;
- char *propname;
- PointerRNA rnapoin;
-} MenuItemLevel;
-static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, void *arg_info)
-{
- uiBlock *block;
- uiMenuInfo *info= arg_info;
- uiPopupMenu *pup;
- ScrArea *sa;
- ARegion *ar;
-
- pup= info->pup;
- block= pup->block;
-
- /* block stuff first, need to know the font */
- uiBlockSetRegion(block, handle->region);
- block->direction= UI_DOWN;
-
- uiBlockLayoutResolve(C, block, NULL, NULL);
-
- if(info->popup) {
- uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_RET_1);
- uiBlockSetDirection(block, UI_DOWN);
-
- /* here we set an offset for the mouse position */
- uiMenuPopupBoundsBlock(block, 1, 0, 1.5*MENU_BUTTON_HEIGHT);
+ block->minbounds= minwidth;
+ uiMenuPopupBoundsBlock(block, 1, 20, offset);
}
else {
/* for a header menu we set the direction automatic */
- if(!info->slideout) {
+ if(!pup->slideout && flip) {
sa= CTX_wm_area(C);
ar= CTX_wm_region(C);
@@ -2467,59 +2225,77 @@ static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle,
}
}
+ block->minbounds= minwidth;
uiTextBoundsBlock(block, 50);
}
/* if menu slides out of other menu, override direction */
- if(info->slideout)
+ if(pup->slideout)
uiBlockSetDirection(block, UI_RIGHT);
uiEndBlock(C, block);
-
- return block;
+
+ return pup->block;
}
-uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut *but, uiMenuCreateFunc menu_func, void *arg)
+uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut *but, uiMenuCreateFunc menu_func, void *arg, char *str)
{
+ wmWindow *window= CTX_wm_window(C);
uiStyle *style= U.uistyles.first;
uiPopupBlockHandle *handle;
uiPopupMenu *pup;
- uiMenuInfo info;
pup= MEM_callocN(sizeof(uiPopupMenu), "menu dummy");
- pup->block= uiBeginBlock(C, NULL, "ui_popup_menu_create", UI_EMBOSSP);
+ pup->block= uiBeginBlock(C, NULL, "ui_button_menu_create", UI_EMBOSSP);
pup->layout= uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
+ pup->slideout= (but && (but->block->flag & UI_BLOCK_LOOP));
+ pup->but= but;
uiLayoutSetOperatorContext(pup->layout, WM_OP_INVOKE_REGION_WIN);
- /* create in advance so we can let buttons point to retval already */
- pup->block->handle= MEM_callocN(sizeof(uiPopupBlockHandle), "uiPopupBlockHandle");
+ if(!but) {
+ /* no button to start from, means we are a popup */
+ pup->mx= window->eventstate->x;
+ pup->my= window->eventstate->y;
+ pup->popup= 1;
+ }
- menu_func(C, pup->layout, arg);
-
- memset(&info, 0, sizeof(info));
- info.pup= pup;
- info.slideout= (but && (but->block->flag & UI_BLOCK_LOOP));
+ if(str) {
+ /* menu is created from a string */
+ pup->menu_func= ui_block_func_MENUSTR;
+ pup->menu_arg= str;
+ }
+ else {
+ /* menu is created from a callback */
+ pup->menu_func= menu_func;
+ pup->menu_arg= arg;
+ }
- handle= ui_popup_block_create(C, butregion, but, NULL, ui_block_func_MENU_ITEM, &info);
+ handle= ui_popup_block_create(C, butregion, but, NULL, ui_block_func_POPUP, pup);
+
+ if(!but) {
+ handle->popup= 1;
+
+ UI_add_popup_handlers(C, &window->modalhandlers, handle);
+ WM_event_add_mousemove(C);
+ }
MEM_freeN(pup);
return handle;
}
-/*************************** Menu Creating API **************************/
-
-
-/*************************** Popup Menu API **************************/
+/******************** Popup Menu API with begin and end ***********************/
/* only return handler, and set optional title */
uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
{
uiStyle *style= U.uistyles.first;
- uiPopupMenu *pup= MEM_callocN(sizeof(uiPopupMenu), "menu start");
+ uiPopupMenu *pup= MEM_callocN(sizeof(uiPopupMenu), "popup menu");
uiBut *but;
pup->block= uiBeginBlock(C, NULL, "uiPupMenuBegin", UI_EMBOSSP);
+ pup->block->flag |= UI_BLOCK_POPUP_MEMORY;
+ pup->block->puphash= ui_popup_menu_hash((char*)title);
pup->layout= uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style);
uiLayoutSetOperatorContext(pup->layout, WM_OP_EXEC_REGION_WIN);
@@ -2538,8 +2314,6 @@ uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
but= uiDefBut(pup->block, LABEL, 0, (char*)title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
but->flag= UI_TEXT_LEFT;
}
-
- //uiDefBut(block, SEPR, 0, "", startx, (short)(starty+height)-MENU_SEPR_HEIGHT, width, MENU_SEPR_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
}
return pup;
@@ -2549,19 +2323,16 @@ uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
void uiPupMenuEnd(bContext *C, uiPopupMenu *pup)
{
wmWindow *window= CTX_wm_window(C);
- uiMenuInfo info;
uiPopupBlockHandle *menu;
- memset(&info, 0, sizeof(info));
- info.popup= 1;
- info.mx= window->eventstate->x;
- info.my= window->eventstate->y;
- info.pup= pup;
+ pup->popup= 1;
+ pup->mx= window->eventstate->x;
+ pup->my= window->eventstate->y;
- menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_MENU_ITEM, &info);
+ menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_POPUP, pup);
menu->popup= 1;
- UI_add_popup_handlers(C, &window->handlers, menu);
+ UI_add_popup_handlers(C, &window->modalhandlers, menu);
WM_event_add_mousemove(C);
MEM_freeN(pup);
@@ -2572,32 +2343,7 @@ uiLayout *uiPupMenuLayout(uiPopupMenu *pup)
return pup->layout;
}
-/* ************** standard pupmenus *************** */
-
-/* this one can called with operatortype name and operators */
-static uiPopupBlockHandle *ui_pup_menu(bContext *C, int maxrow, uiMenuHandleFunc func, void *arg, char *str, ...)
-{
- wmWindow *window= CTX_wm_window(C);
- uiPupMenuInfo info;
- uiPopupBlockHandle *menu;
-
- memset(&info, 0, sizeof(info));
- info.mx= window->eventstate->x;
- info.my= window->eventstate->y;
- info.maxrow= maxrow;
- info.instr= str;
-
- menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PUPMENU, &info);
- menu->popup= 1;
-
- UI_add_popup_handlers(C, &window->handlers, menu);
- WM_event_add_mousemove(C);
-
- menu->popup_func= func;
- menu->popup_arg= arg;
-
- return menu;
-}
+/*************************** Standard Popup Menus ****************************/
static void operator_name_cb(bContext *C, void *arg, int retval)
{
@@ -2607,17 +2353,6 @@ static void operator_name_cb(bContext *C, void *arg, int retval)
WM_operator_name_call(C, opname, WM_OP_EXEC_DEFAULT, NULL);
}
-static void vconfirm_opname(bContext *C, char *opname, char *title, char *itemfmt, va_list ap)
-{
- char *s, buf[512];
-
- s= buf;
- if (title) s+= sprintf(s, "%s%%t|", title);
- vsprintf(s, itemfmt, ap);
-
- ui_pup_menu(C, 0, operator_name_cb, opname, buf);
-}
-
static void operator_cb(bContext *C, void *arg, int retval)
{
wmOperator *op= arg;
@@ -2633,6 +2368,21 @@ 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)
+{
+ uiPopupBlockHandle *handle;
+ char *s, buf[512];
+
+ s= buf;
+ if (title) s+= sprintf(s, "%s%%t|", title);
+ vsprintf(s, itemfmt, ap);
+
+ handle= ui_popup_menu_create(C, NULL, NULL, NULL, NULL, buf);
+
+ handle->popup_func= operator_name_cb;
+ handle->popup_arg= opname;
+}
+
static void confirm_operator(bContext *C, wmOperator *op, char *title, char *item)
{
uiPopupBlockHandle *handle;
@@ -2641,11 +2391,13 @@ static void confirm_operator(bContext *C, wmOperator *op, char *title, char *ite
s= buf;
if (title) s+= sprintf(s, "%s%%t|%s", title, item);
- handle= ui_pup_menu(C, 0, operator_cb, op, buf);
+ handle= ui_popup_menu_create(C, NULL, NULL, NULL, NULL, buf);
+
+ handle->popup_func= operator_cb;
+ handle->popup_arg= op;
handle->cancel_func= confirm_cancel_operator;
}
-
void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
{
va_list ap;
@@ -2658,7 +2410,6 @@ void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
va_end(ap);
}
-
void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
{
size_t len= strlen(filename);
@@ -2674,7 +2425,7 @@ void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
if(BLI_exists(filename)==0)
operator_cb(C, op, 1);
else
- confirm_operator(C, op, "Save over", filename);
+ confirm_operator(C, op, "Save Over", filename);
}
void uiPupMenuNotice(bContext *C, char *str, ...)
@@ -2719,10 +2470,12 @@ void uiPupMenuReports(bContext *C, ReportList *reports)
BLI_dynstr_appendf(ds, "Error %%i%d%%t|%s", ICON_ERROR, report->message);
else if(report->type >= RPT_WARNING)
BLI_dynstr_appendf(ds, "Warning %%i%d%%t|%s", ICON_ERROR, report->message);
+ else if(report->type >= RPT_INFO)
+ BLI_dynstr_appendf(ds, "Info %%t|%s", report->message);
}
str= BLI_dynstr_get_cstring(ds);
- ui_pup_menu(C, 0, NULL, NULL, str);
+ ui_popup_menu_create(C, NULL, NULL, NULL, NULL, str);
MEM_freeN(str);
BLI_dynstr_free(ds);
@@ -2737,10 +2490,10 @@ void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, i
handle= ui_popup_block_create(C, NULL, NULL, func, NULL, arg);
handle->popup= 1;
- handle->optype= (opname)? WM_operatortype_find(opname): NULL;
+ handle->optype= (opname)? WM_operatortype_find(opname, 0): NULL;
handle->opcontext= opcontext;
- UI_add_popup_handlers(C, &window->handlers, handle);
+ UI_add_popup_handlers(C, &window->modalhandlers, handle);
WM_event_add_mousemove(C);
}
@@ -2763,6 +2516,7 @@ void uiPupBlockOperator(bContext *C, uiBlockCreateFunc func, wmOperator *op, int
handle->cancel_func= confirm_cancel_operator;
handle->opcontext= opcontext;
- UI_add_popup_handlers(C, &window->handlers, handle);
+ UI_add_popup_handlers(C, &window->modalhandlers, handle);
WM_event_add_mousemove(C);
}
+
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index e8fba38f793..cb9216ec1c5 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -89,44 +89,43 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
BLI_addtail(styles, style);
BLI_strncpy(style->name, name, MAX_STYLE_NAME);
+ style->panelzoom= 1.0;
+
style->paneltitle.uifont_id= UIFONT_DEFAULT;
- style->paneltitle.points= 13;
- style->paneltitle.kerning= 0.0;
- style->paneltitle.overlap= 0;
- style->paneltitle.shadow= 5;
- style->paneltitle.shadx= 2;
- style->paneltitle.shady= -2;
- style->paneltitle.shadowalpha= 0.25f;
- style->paneltitle.shadowcolor= 0.0f;
+ style->paneltitle.points= 12;
+ style->paneltitle.kerning= 1;
+ style->paneltitle.shadow= 1;
+ style->paneltitle.shadx= 0;
+ style->paneltitle.shady= -1;
+ style->paneltitle.shadowalpha= 0.15f;
+ style->paneltitle.shadowcolor= 1.0f;
style->grouplabel.uifont_id= UIFONT_DEFAULT;
style->grouplabel.points= 12;
- style->grouplabel.kerning= 0.0;
- style->grouplabel.overlap= 0;
+ style->grouplabel.kerning= 1;
style->grouplabel.shadow= 3;
- style->grouplabel.shadx= 1;
+ style->grouplabel.shadx= 0;
style->grouplabel.shady= -1;
style->grouplabel.shadowalpha= 0.25f;
style->widgetlabel.uifont_id= UIFONT_DEFAULT;
style->widgetlabel.points= 11;
- style->widgetlabel.kerning= 0.0;
- style->widgetlabel.overlap= 0;
+ style->widgetlabel.kerning= 1;
style->widgetlabel.shadow= 3;
- style->widgetlabel.shadx= 1;
+ style->widgetlabel.shadx= 0;
style->widgetlabel.shady= -1;
- style->widgetlabel.shadowalpha= 0.3f;
+ style->widgetlabel.shadowalpha= 0.15f;
style->widgetlabel.shadowcolor= 1.0f;
style->widget.uifont_id= UIFONT_DEFAULT;
style->widget.points= 11;
- style->widget.kerning= 0.0;
+ style->widget.kerning= 1;
style->widget.shadowalpha= 0.25f;
- style->columnspace= 5;
+ style->columnspace= 8;
style->templatespace= 5;
style->boxspace= 5;
- style->buttonspacex= 5;
+ style->buttonspacex= 8;
style->buttonspacey= 2;
style->panelspace= 8;
style->panelouter= 4;
@@ -174,15 +173,15 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
BLF_shadow_offset(fs->shadx, fs->shady);
}
- if (fs->overlap)
- BLF_enable(BLF_OVERLAP_CHAR);
+ if (fs->kerning == 1)
+ BLF_enable(BLF_KERNING_DEFAULT);
BLF_draw(str);
BLF_disable(BLF_CLIPPING);
if (fs->shadow)
BLF_disable(BLF_SHADOW);
- if (fs->overlap)
- BLF_disable(BLF_OVERLAP_CHAR);
+ if (fs->kerning == 1)
+ BLF_disable(BLF_KERNING_DEFAULT);
}
/* ************** helpers ************************ */
@@ -263,6 +262,5 @@ void uiStyleFontSet(uiFontStyle *fs)
BLF_set(font->blf_id);
BLF_size(fs->points, U.dpi);
- BLF_kerning(fs->kerning);
}
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index a006187c4aa..31f371c5553 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -36,6 +36,7 @@
#include "BKE_icons.h"
#include "BKE_global.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_utildefines.h"
#include "ED_screen.h"
@@ -56,12 +57,13 @@ void ui_template_fix_linking()
/********************** Header Template *************************/
-void uiTemplateHeader(uiLayout *layout, bContext *C)
+void uiTemplateHeader(uiLayout *layout, bContext *C, int menus)
{
uiBlock *block;
block= uiLayoutFreeBlock(layout);
- ED_area_header_standardbuttons(C, block, 0);
+ if(menus) ED_area_header_standardbuttons(C, block, 0);
+ else ED_area_header_switchbutton(C, block, 0);
}
/********************** Search Callbacks *************************/
@@ -74,7 +76,7 @@ typedef struct TemplateID {
} TemplateID;
/* Search browse menu, assign */
-static void id_search_call_cb(struct bContext *C, void *arg_template, void *item)
+static void id_search_call_cb(bContext *C, void *arg_template, void *item)
{
TemplateID *template= (TemplateID*)arg_template;
@@ -89,7 +91,7 @@ static void id_search_call_cb(struct bContext *C, void *arg_template, void *item
}
/* ID Search browse menu, do the search */
-static void id_search_cb(const struct bContext *C, void *arg_template, char *str, uiSearchItems *items)
+static void id_search_cb(const bContext *C, void *arg_template, char *str, uiSearchItems *items)
{
TemplateID *template= (TemplateID*)arg_template;
Scene *scene= CTX_data_scene(C);
@@ -99,11 +101,12 @@ static void id_search_cb(const struct bContext *C, void *arg_template, char *str
/* ID listbase */
for(id= lb->first; id; id= id->next) {
- iconid= ui_id_icon_get(scene, id);
+ if(BLI_strcasestr(id->name+2, str)) {
+ iconid= ui_id_icon_get(scene, id);
- if(BLI_strcasestr(id->name+2, str))
if(!uiSearchItemAdd(items, id->name+2, id, iconid))
break;
+ }
}
}
@@ -112,6 +115,7 @@ static uiBlock *search_menu(bContext *C, ARegion *ar, void *arg_litem)
{
static char search[256];
static TemplateID template;
+ PointerRNA idptr;
wmEvent event;
wmWindow *win= CTX_wm_window(C);
uiBlock *block;
@@ -122,6 +126,9 @@ static uiBlock *search_menu(bContext *C, ARegion *ar, void *arg_litem)
/* arg_litem is malloced, can be freed by parent button */
template= *((TemplateID*)arg_litem);
+ /* get active id for showing first item */
+ idptr= RNA_property_pointer_get(&template.ptr, template.prop);
+
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
@@ -129,7 +136,7 @@ static uiBlock *search_menu(bContext *C, ARegion *ar, void *arg_litem)
uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, "");
- uiButSetSearchFunc(but, id_search_cb, &template, id_search_call_cb);
+ uiButSetSearchFunc(but, id_search_cb, &template, id_search_call_cb, idptr.data);
uiBoundsBlock(block, 6);
uiBlockSetDirection(block, UI_DOWN);
@@ -151,15 +158,21 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
{
TemplateID *template= (TemplateID*)arg_litem;
PointerRNA idptr= RNA_property_pointer_get(&template->ptr, template->prop);
- ID *id= idptr.data;
+ ID *id= idptr.data, *newid;
int event= GET_INT_FROM_POINTER(arg_event);
switch(event) {
case UI_ID_BROWSE:
case UI_ID_PIN:
+ printf("warning, id event %d shouldnt come here\n", event);
+ break;
case UI_ID_OPEN:
case UI_ID_ADD_NEW:
- printf("warning, id event %d shouldnt come here\n", event);
+ if(template->idlb->last) {
+ RNA_id_pointer_create(template->idlb->last, &idptr);
+ RNA_property_pointer_set(&template->ptr, template->prop, idptr);
+ RNA_property_update(C, &template->ptr, template->prop);
+ }
break;
case UI_ID_DELETE:
memset(&idptr, 0, sizeof(idptr));
@@ -173,76 +186,158 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
}
else return;
break;
-#if 0
- case UI_ID_ALONE:
- if(!id || id->us < 1)
- return;
- break;
case UI_ID_LOCAL:
- if(!id || id->us < 1)
- return;
+ if(id) {
+ if(id_make_local(id, 0)) {
+ /* reassign to get get proper updates/notifiers */
+ idptr= RNA_property_pointer_get(&template->ptr, template->prop);
+ RNA_property_pointer_set(&template->ptr, template->prop, idptr);
+ RNA_property_update(C, &template->ptr, template->prop);
+ }
+ }
break;
+ case UI_ID_ALONE:
+ if(id) {
+ /* make copy */
+ if(id_copy(id, &newid, 0) && newid) {
+ /* us is 1 by convention, but RNA_property_pointer_set
+ will also incremement it, so set it to zero */
+ newid->us= 0;
+
+ /* assign copy */
+ RNA_id_pointer_create(newid, &idptr);
+ RNA_property_pointer_set(&template->ptr, template->prop, idptr);
+ RNA_property_update(C, &template->ptr, template->prop);
+ }
+ }
+ break;
+#if 0
case UI_ID_AUTO_NAME:
break;
#endif
}
}
-static void template_ID(bContext *C, uiBlock *block, TemplateID *template, StructRNA *type, int flag, char *newop, char *unlinkop)
+static void template_ID(bContext *C, uiBlock *block, TemplateID *template, StructRNA *type, int flag, char *newop, char *openop, char *unlinkop)
{
uiBut *but;
PointerRNA idptr;
ListBase *lb;
+ ID *id, *idfrom;
idptr= RNA_property_pointer_get(&template->ptr, template->prop);
+ id= idptr.data;
+ idfrom= template->ptr.id.data;
lb= template->idlb;
+ uiBlockBeginAlign(block);
+
if(idptr.type)
type= idptr.type;
- if(type)
- uiDefIconBut(block, LABEL, 0, RNA_struct_ui_icon(type), 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockBeginAlign(block);
- if(flag & UI_ID_BROWSE)
- uiDefBlockButN(block, search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X, UI_UNIT_Y, "Browse ID data");
+ if(flag & UI_ID_BROWSE) {
+ but= uiDefBlockButN(block, search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*1.6, UI_UNIT_Y, "Browse ID data");
+ if(type) {
+ but->icon= RNA_struct_ui_icon(type);
+ but->flag|= UI_HAS_ICON;
+ but->flag|= UI_ICON_LEFT;
+ }
+
+ if((idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ }
/* text button with name */
- if(idptr.data) {
+ if(id) {
char name[64];
- //text_idbutton(idptr.data, name);
+ //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(id->lib) {
+ if(id->flag & LIB_INDIRECT) {
+ but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_INDIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0,
+ "Indirect library datablock, cannot change.");
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ }
+ else {
+ but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_DIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0,
+ "Direct linked library datablock, click to make local.");
+ if(!id_make_local(id, 1 /* test */) || (idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ }
+
+ uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_LOCAL));
+ }
+
+ if(id->us > 1) {
+ char str[32];
+
+ sprintf(str, "%d", id->us);
+
+ if(id->us<10)
+ but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
+ else
+ but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X+10,UI_UNIT_Y, 0, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
+
+ uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ALONE));
+ if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ }
}
if(flag & UI_ID_ADD_NEW) {
- int w= idptr.data?UI_UNIT_X:UI_UNIT_X*6;
+ int w= id?UI_UNIT_X: (flag & UI_ID_OPEN)? UI_UNIT_X*3: UI_UNIT_X*6;
if(newop) {
- but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_REGION_WIN, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL);
+ but= uiDefIconTextButO(block, BUT, newop, WM_OP_EXEC_REGION_WIN, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL);
+ uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
}
else {
- but= uiDefIconTextBut(block, BUT, 0, ICON_ZOOMIN, "Add New", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+ but= uiDefIconTextBut(block, BUT, 0, ICON_ZOOMIN, (id)? "": "New", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ADD_NEW));
}
+
+ if((idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ }
+
+ if(flag & UI_ID_OPEN) {
+ int w= id?UI_UNIT_X: (flag & UI_ID_ADD_NEW)? UI_UNIT_X*3: UI_UNIT_X*6;
+
+ if(openop) {
+ but= uiDefIconTextButO(block, BUT, openop, WM_OP_INVOKE_REGION_WIN, ICON_FILESEL, (id)? "": "Open", 0, 0, w, UI_UNIT_Y, NULL);
+ uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_OPEN));
+ }
+ else {
+ but= uiDefIconTextBut(block, BUT, 0, ICON_FILESEL, (id)? "": "Open", 0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
+ uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_OPEN));
+ }
+
+ if((idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
}
/* delete button */
- if(idptr.data && (flag & UI_ID_DELETE)) {
+ if(id && (flag & UI_ID_DELETE)) {
if(unlinkop) {
- but= uiDefIconButO(block, BUT, unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ but= uiDefIconButO(block, BUT, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
}
else {
but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL);
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_DELETE));
}
+
+ if((idfrom && idfrom->lib))
+ uiButSetFlag(but, UI_BUT_DISABLED);
}
uiBlockEndAlign(block);
}
-void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *unlinkop)
+void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
{
TemplateID *template;
uiBlock *block;
@@ -250,9 +345,6 @@ void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname
StructRNA *type;
int flag;
- if(!ptr->data)
- return;
-
prop= RNA_struct_find_property(ptr, propname);
if(!prop || RNA_property_type(prop) != PROP_POINTER) {
@@ -268,6 +360,8 @@ void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname
if(newop)
flag |= UI_ID_ADD_NEW;
+ if(openop)
+ flag |= UI_ID_OPEN;
type= RNA_property_pointer_type(ptr, prop);
template->idlb= wich_libbase(CTX_data_main(C), RNA_type_to_ID_code(type));
@@ -275,7 +369,7 @@ void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname
if(template->idlb) {
uiLayoutRow(layout, 1);
block= uiLayoutGetBlock(layout);
- template_ID(C, block, template, type, flag, newop, unlinkop);
+ template_ID(C, block, template, type, flag, newop, openop, unlinkop);
}
MEM_freeN(template);
@@ -308,142 +402,15 @@ void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname
#include "ED_object.h"
-static void modifiers_del(bContext *C, void *ob_v, void *md_v)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ob_v;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_delete(&reports, ob_v, md_v)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- ED_undo_push(C, "Delete modifier");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
-static void modifiers_activate(bContext *C, void *ob_v, void *md_v)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ob_v;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-}
-
-static void modifiers_moveUp(bContext *C, void *ob_v, void *md_v)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ob_v;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_move_up(&reports, ob_v, md_v)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- ED_undo_push(C, "Move modifier");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
-static void modifiers_moveDown(bContext *C, void *ob_v, void *md_v)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ob_v;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_move_down(&reports, ob_v, md_v)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- ED_undo_push(C, "Move modifier");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
-static void modifiers_convertParticles(bContext *C, void *obv, void *mdv)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= obv;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_convert(&reports, scene, obv, mdv)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- ED_undo_push(C, "Convert particles to mesh object(s).");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
-static void modifiers_applyModifier(bContext *C, void *obv, void *mdv)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= obv;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_apply(&reports, scene, obv, mdv)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- ED_undo_push(C, "Apply modifier");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
-static void modifiers_copyModifier(bContext *C, void *ob_v, void *md_v)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ob_v;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- if(ED_object_modifier_copy(&reports, ob_v, md_v)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- ED_undo_push(C, "Copy modifier");
- }
- else
- uiPupMenuReports(C, &reports);
-
- BKE_reports_clear(&reports);
-}
-
static void modifiers_setOnCage(bContext *C, void *ob_v, void *md_v)
{
- Scene *scene= CTX_data_scene(C);
Object *ob = ob_v;
- ModifierData *md;
-
+ ModifierData *md= md_v;
int i, cageIndex = modifiers_getCageIndex(ob, NULL );
+ /* undo button operation */
+ md->mode ^= eModifierMode_OnCage;
+
for(i = 0, md=ob->modifiers.first; md; ++i, md=md->next) {
if(md == md_v) {
if(i >= cageIndex)
@@ -453,12 +420,11 @@ static void modifiers_setOnCage(bContext *C, void *ob_v, void *md_v)
}
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
{
- Scene *scene= CTX_data_scene(C);
Object *ob = ob_v;
ModifierData *md = md_v;
ModifierData *nmd = modifier_new(md->type);
@@ -471,22 +437,14 @@ 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_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
ED_undo_push(C, "Modifier convert to real");
}
static int modifier_can_delete(ModifierData *md)
{
- // deletion over the deflection panel
// fluid particle modifier can't be deleted here
-
- if(md->type==eModifierType_Fluidsim)
- return 0;
- if(md->type==eModifierType_Collision)
- return 0;
- if(md->type==eModifierType_Surface)
- return 0;
if(md->type == eModifierType_ParticleSystem)
if(((ParticleSystemModifierData *)md)->psys->part->type == PART_FLUID)
return 0;
@@ -500,12 +458,12 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i
PointerRNA ptr;
uiBut *but;
uiBlock *block;
- uiLayout *column, *row, *subrow, *result= NULL;
- int isVirtual = md->mode&eModifierMode_Virtual;
+ uiLayout *column, *row, *result= NULL;
+ int isVirtual = md->mode & eModifierMode_Virtual;
// XXX short color = md->error?TH_REDALERT:TH_BUT_NEUTRAL;
- short width = 295, buttonWidth = width-120-10;
char str[128];
+ /* create RNA pointer */
RNA_pointer_create(&ob->id, &RNA_Modifier, md, &ptr);
column= uiLayoutColumn(layout, 1);
@@ -516,131 +474,112 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i
/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
row= uiLayoutRow(uiLayoutBox(column), 0);
- block= uiLayoutGetBlock(row);
+ uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND);
- subrow= uiLayoutRow(row, 0);
- uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT);
+ block= uiLayoutGetBlock(row);
//uiDefBut(block, ROUNDBOX, 0, "", x-10, y-4, width, 25, NULL, 7.0, 0.0,
- // (!isVirtual && (md->mode&eModifierMode_Expanded))?3:15, 20, "");
+ // (!isVirtual && (md->mode & eModifierMode_Expanded))?3:15, 20, "");
/* XXX uiBlockSetCol(block, TH_AUTO); */
/* open/close icon */
- if (!isVirtual) {
+ if(!isVirtual) {
uiBlockSetEmboss(block, UI_EMBOSSN);
uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, 0, ICON_TRIA_RIGHT, 0, 0, UI_UNIT_X, UI_UNIT_Y, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier");
}
/* modifier-type icon */
- uiDefIconBut(block, BUT, 0, RNA_struct_ui_icon(ptr.type), 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Current Modifier Type");
+ uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
uiBlockSetEmboss(block, UI_EMBOSS);
- if (isVirtual) {
+ if(isVirtual) {
+ /* virtual modifier */
sprintf(str, "%s parent deform", md->name);
uiDefBut(block, LABEL, 0, str, 0, 0, 185, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Modifier name");
but = uiDefBut(block, BUT, 0, "Make Real", 0, 0, 80, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Convert virtual modifier to a real modifier");
uiButSetFunc(but, modifiers_convertToReal, ob, md);
- } else {
+ }
+ else {
+ /* real modifier */
uiBlockBeginAlign(block);
- uiDefBut(block, TEX, 0, "", 0, 0, buttonWidth-40, UI_UNIT_Y, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name");
+ uiItemR(row, "", 0, &ptr, "name", 0);
/* Softbody not allowed in this situation, enforce! */
- if (((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) && (md->type!=eModifierType_Surface)) {
- uiDefIconButBitI(block, TOG, eModifierMode_Render, 0, ICON_SCENE, 0, 0, 19, UI_UNIT_Y,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
- but= uiDefIconButBitI(block, TOG, eModifierMode_Realtime, 0, ICON_VIEW3D, 0, 0, 19, UI_UNIT_Y,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
- uiButSetFunc(but, modifiers_activate, ob, md);
- if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
- but= uiDefIconButBitI(block, TOG, eModifierMode_Editmode, 0, ICON_EDITMODE_HLT, 0, 0, 19, UI_UNIT_Y,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
- uiButSetFunc(but, modifiers_activate, ob, md);
- }
+ if(((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) && (md->type!=eModifierType_Surface)) {
+ uiItemR(row, "", ICON_SCENE, &ptr, "render", 0);
+ uiItemR(row, "", ICON_RESTRICT_VIEW_OFF, &ptr, "realtime", 0);
+
+ if(mti->flags & eModifierTypeFlag_SupportsEditmode)
+ uiItemR(row, "", ICON_EDITMODE_HLT, &ptr, "editmode", 0);
}
- uiBlockEndAlign(block);
+
/* XXX uiBlockSetEmboss(block, UI_EMBOSSR); */
- if (ob->type==OB_MESH && modifier_couldBeCage(md) && index<=lastCageIndex) {
- int icon; //, color;
-
- if (index==cageIndex) {
- // XXX color = TH_BUT_SETTING;
- icon = VICON_EDITMODE_HLT;
- } else if (index<cageIndex) {
- // XXX color = TH_BUT_NEUTRAL;
- icon = VICON_EDITMODE_DEHLT;
- } else {
- // XXX color = TH_BUT_NEUTRAL;
- icon = ICON_BLANK1;
- }
+ if(ob->type==OB_MESH && modifier_couldBeCage(md) && index<=lastCageIndex) {
/* XXX uiBlockSetCol(block, color); */
- but = uiDefIconBut(block, BUT, 0, icon, 0, 0, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
+ but = uiDefIconButBitI(block, TOG, eModifierMode_OnCage, 0, ICON_MESH_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
+ if(index < cageIndex)
+ uiButSetFlag(but, UI_BUT_DISABLED);
uiButSetFunc(but, modifiers_setOnCage, ob, md);
+ uiBlockEndAlign(block);
/* XXX uiBlockSetCol(block, TH_AUTO); */
}
}
- subrow= uiLayoutRow(row, 0);
- uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
-
+ /* up/down/delete */
if(!isVirtual) {
/* XXX uiBlockSetCol(block, TH_BUT_ACTION); */
-
- but = uiDefIconBut(block, BUT, 0, VICON_MOVE_UP, 0, 0, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier up in stack");
- uiButSetFunc(but, modifiers_moveUp, ob, md);
-
- but = uiDefIconBut(block, BUT, 0, VICON_MOVE_DOWN, 0, 0, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier down in stack");
- uiButSetFunc(but, modifiers_moveDown, ob, md);
+ uiBlockBeginAlign(block);
+ uiItemO(row, "", VICON_MOVE_UP, "OBJECT_OT_modifier_move_up");
+ uiItemO(row, "", VICON_MOVE_DOWN, "OBJECT_OT_modifier_move_down");
+ uiBlockEndAlign(block);
uiBlockSetEmboss(block, UI_EMBOSSN);
-
- if(modifier_can_delete(md)) {
- but = uiDefIconBut(block, BUT, 0, VICON_X, 0, 0, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Delete modifier");
- uiButSetFunc(but, modifiers_del, ob, md);
- }
+
+ if(modifier_can_delete(md))
+ uiItemO(row, "", VICON_X, "OBJECT_OT_modifier_remove");
+
/* XXX uiBlockSetCol(block, TH_AUTO); */
}
uiBlockSetEmboss(block, UI_EMBOSS);
- if(!isVirtual && (md->mode&eModifierMode_Expanded)) {
+ if(!isVirtual && (md->mode & eModifierMode_Expanded)) {
+ /* apply/convert/copy */
uiLayout *box;
box= uiLayoutBox(column);
row= uiLayoutRow(box, 1);
- if (!isVirtual && (md->type!=eModifierType_Collision) && (md->type!=eModifierType_Surface)) {
- uiBlockSetButLock(block, object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); /* only here obdata, the rest of modifiers is ob level */
+ if(!isVirtual && (md->type!=eModifierType_Collision) && (md->type!=eModifierType_Surface)) {
+ /* only here obdata, the rest of modifiers is ob level */
+ uiBlockSetButLock(block, object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- if (md->type==eModifierType_ParticleSystem) {
+ if(md->type==eModifierType_ParticleSystem) {
ParticleSystem *psys= ((ParticleSystemModifierData *)md)->psys;
- if(!(G.f & G_PARTICLEEDIT)) {
- if(ELEM3(psys->part->draw_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache) {
- but = uiDefBut(block, BUT, 0, "Convert", 0,0,60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
- uiButSetFunc(but, modifiers_convertParticles, ob, md);
- }
- }
- }
- else{
- but = uiDefBut(block, BUT, 0, "Apply", 0,0,60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");
- uiButSetFunc(but, modifiers_applyModifier, ob, md);
+ if(!(ob->mode & OB_MODE_PARTICLE_EDIT))
+ if(ELEM3(psys->part->ren_as, PART_DRAW_PATH, PART_DRAW_GR, PART_DRAW_OB) && psys->pathcache)
+ uiItemO(row, "Convert", 0, "OBJECT_OT_modifier_convert");
}
+ else
+ uiItemO(row, "Apply", 0, "OBJECT_OT_modifier_apply");
uiBlockClearButLock(block);
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
- if (md->type!=eModifierType_Fluidsim && md->type!=eModifierType_Softbody && md->type!=eModifierType_ParticleSystem && (md->type!=eModifierType_Cloth)) {
- but = uiDefBut(block, BUT, 0, "Copy", 0,0,60,19, 0, 0, 0, 0, 0, "Duplicate the current modifier at the same position in the stack");
- uiButSetFunc(but, modifiers_copyModifier, ob, md);
- }
+ if(!ELEM4(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth))
+ uiItemO(row, "Copy", 0, "OBJECT_OT_modifier_copy");
}
result= uiLayoutColumn(box, 0);
block= uiLayoutFreeBlock(box);
}
- if (md->error) {
+ if(md->error) {
row = uiLayoutRow(uiLayoutBox(column), 0);
/* XXX uiBlockSetCol(block, color); */
@@ -682,7 +621,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr)
for(i=0; vmd; i++, vmd=vmd->next) {
if(md == vmd)
return draw_modifier(layout, ob, md, i, cageIndex, lastCageIndex);
- else if(vmd->mode&eModifierMode_Virtual)
+ else if(vmd->mode & eModifierMode_Virtual)
i--;
}
@@ -735,8 +674,10 @@ void do_constraint_panels(bContext *C, void *arg, int event)
if(ob->pose) update_pose_constraint_flags(ob->pose);
- if(ob->type==OB_ARMATURE) DAG_object_flush_update(scene, ob, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_object_flush_update(scene, ob, OB_RECALC_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);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
// XXX allqueue(REDRAWVIEW3D, 0);
// XXX allqueue(REDRAWBUTSOBJECT, 0);
@@ -748,44 +689,22 @@ static void constraint_active_func(bContext *C, void *ob_v, void *con_v)
ED_object_constraint_set_active(ob_v, con_v);
}
-static void del_constraint_func (bContext *C, void *ob_v, void *con_v)
-{
- if(ED_object_constraint_delete(NULL, ob_v, con_v))
- ED_undo_push(C, "Delete Constraint");
-}
-
-static void verify_constraint_name_func (bContext *C, void *con_v, void *name_v)
+static void verify_constraint_name_func (bContext *C, void *con_v, void *dummy)
{
Object *ob= CTX_data_active_object(C);
bConstraint *con= con_v;
- char oldname[32];
if (!con)
return;
- /* put on the stack */
- BLI_strncpy(oldname, (char *)name_v, 32);
-
- ED_object_constraint_rename(ob, con, oldname);
+ ED_object_constraint_rename(ob, con, NULL);
ED_object_constraint_set_active(ob, con);
// XXX allqueue(REDRAWACTION, 0);
}
-static void constraint_moveUp(bContext *C, void *ob_v, void *con_v)
-{
- if(ED_object_constraint_move_up(NULL, ob_v, con_v))
- ED_undo_push(C, "Move Constraint");
-}
-
-static void constraint_moveDown(bContext *C, void *ob_v, void *con_v)
-{
- if(ED_object_constraint_move_down(NULL, ob_v, con_v))
- ED_undo_push(C, "Move Constraint");
-}
-
/* some commonly used macros in the constraints drawing code */
#define is_armature_target(target) (target && target->type==OB_ARMATURE)
-#define is_armature_owner(ob) ((ob->type == OB_ARMATURE) && (ob->flag & OB_POSEMODE))
+#define is_armature_owner(ob) ((ob->type == OB_ARMATURE) && (ob->mode & OB_MODE_POSE))
#define is_geom_target(target) (target && (ELEM(target->type, OB_MESH, OB_LATTICE)) )
/* Helper function for draw constraint - draws constraint space stuff
@@ -844,6 +763,22 @@ static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short
}
}
+static void test_obpoin_but(bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ id= CTX_data_main(C)->object.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_lib_extern(id); /* checks lib data, sets correct flag for saving then */
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
/* draw panel showing settings for a constraint */
static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
{
@@ -889,7 +824,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
box= uiLayoutBox(col);
row= uiLayoutRow(box, 0);
- block= uiLayoutFreeBlock(box);
+ block= uiLayoutGetBlock(box);
subrow= uiLayoutRow(row, 0);
uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT);
@@ -904,27 +839,19 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
uiDefIconButBitS(block, ICONTOG, CONSTRAINT_EXPAND, B_CONSTRAINT_TEST, ICON_TRIA_RIGHT, xco-10, yco, 20, 20, &con->flag, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Constraint");
/* name */
- if ((con->flag & CONSTRAINT_EXPAND) && (proxy_protected==0)) {
- /* XXX if (con->flag & CONSTRAINT_DISABLE)
- uiBlockSetCol(block, TH_REDALERT);*/
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ /* XXX if (con->flag & CONSTRAINT_DISABLE)
+ uiBlockSetCol(block, TH_REDALERT);*/
+
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ if(proxy_protected == 0) {
but = uiDefBut(block, TEX, B_CONSTRAINT_TEST, "", xco+120, yco, 85, 18, con->name, 0.0, 29.0, 0.0, 0.0, "Constraint name");
- uiButSetFunc(but, verify_constraint_name_func, con, NULL);
- }
- else {
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- /* XXX if (con->flag & CONSTRAINT_DISABLE)
- uiBlockSetCol(block, TH_REDALERT);*/
-
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, con->name, xco+120, yco-1, 135, 19, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiButSetFunc(but, verify_constraint_name_func, con, con->name);
}
+ else
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, con->name, xco+120, yco-1, 135, 19, NULL, 0.0, 0.0, 0.0, 0.0, "");
// XXX uiBlockSetCol(block, TH_AUTO);
@@ -968,25 +895,20 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
uiBlockBeginAlign(block);
uiBlockSetEmboss(block, UI_EMBOSS);
- if (show_upbut) {
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, xco+width-50, yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint up in constraint stack");
- uiButSetFunc(but, constraint_moveUp, ob, con);
- }
+ if (show_upbut)
+ uiDefIconButO(block, BUT, "CONSTRAINT_OT_move_up", WM_OP_INVOKE_DEFAULT, VICON_MOVE_UP, xco+width-50, yco, 16, 18, "Move constraint up in constraint stack");
- if (show_downbut) {
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, xco+width-50+18, yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint down in constraint stack");
- uiButSetFunc(but, constraint_moveDown, ob, con);
- }
+ if (show_downbut)
+ uiDefIconButO(block, BUT, "CONSTRAINT_OT_move_down", WM_OP_INVOKE_DEFAULT, VICON_MOVE_DOWN, xco+width-50+18, yco, 16, 18, "Move constraint down in constraint stack");
uiBlockEndAlign(block);
}
-
-
+
/* Close 'button' - emboss calls here disable drawing of 'button' behind X */
uiBlockSetEmboss(block, UI_EMBOSSN);
-
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_CHANGETARGET, ICON_X, xco+262, yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete constraint");
- uiButSetFunc(but, del_constraint_func, ob, con);
-
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, ICONTOGN, CONSTRAINT_OFF, B_CONSTRAINT_TEST, ICON_CHECKBOX_DEHLT, xco+243, yco, 19, 19, &con->flag, 0.0, 0.0, 0.0, 0.0, "enable/disable constraint");
+ uiDefIconButO(block, BUT, "CONSTRAINT_OT_delete", WM_OP_INVOKE_DEFAULT, ICON_X, xco+262, yco, 19, 19, "Delete constraint");
+ uiBlockEndAlign(block);
uiBlockSetEmboss(block, UI_EMBOSS);
}
@@ -1053,11 +975,11 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* subtarget */
if (is_armature_target(ct->tar)) {
but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", xco+120, yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)ct->tar);
+ //uiButSetCompleteFunc(but, autocomplete_bone, (void *)ct->tar);
}
else if (is_geom_target(ct->tar)) {
but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", xco+120, yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
- uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ct->tar);
+ //uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ct->tar);
}
else {
strcpy(ct->subtarget, "");
@@ -1083,95 +1005,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
draw_constraint_spaceselect(block, con, xco, yco-(73+theight), is_armature_owner(ob), -1);
}
break;
-#endif /* DISABLE_PYTHON */
- /*case CONSTRAINT_TYPE_CHILDOF:
- {
- // Inverse options
- uiBlockBeginAlign(block);
- but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Set Offset", xco, yco-151, (width/2),18, NULL, 0, 24, 0, 0, "Calculate current Parent-Inverse Matrix (i.e. restore offset from parent)");
- // XXX uiButSetFunc(but, childof_const_setinv, con, NULL);
-
- but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Clear Offset", xco+((width/2)+10), yco-151, (width/2),18, NULL, 0, 24, 0, 0, "Clear Parent-Inverse Matrix (i.e. clear offset from parent)");
- // XXX uiButSetFunc(but, childof_const_clearinv, con, NULL);
- uiBlockEndAlign(block);
- }
- break;
- */
-
- /*case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- if (data->type==CONSTRAINT_RB_GENERIC6DOF) {
- // Draw Pairs of LimitToggle+LimitValue
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMinX", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"min x limit");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMaxX", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"max x limit");
- uiBlockEndAlign(block);
-
- offsetY += 20;
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMinY", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"min y limit");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMaxY", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"max y limit");
- uiBlockEndAlign(block);
-
- offsetY += 20;
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMinZ", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"min z limit");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMaxZ", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"max z limit");
- uiBlockEndAlign(block);
- offsetY += 20;
- }
- if ((data->type==CONSTRAINT_RB_GENERIC6DOF) || (data->type==CONSTRAINT_RB_CONETWIST)) {
- // Draw Pairs of LimitToggle+LimitValue /
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMinX", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"min x limit");
- uiBlockEndAlign(block);
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMaxX", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"max x limit");
- uiBlockEndAlign(block);
-
- offsetY += 20;
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMinY", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"min y limit");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMaxY", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"max y limit");
- uiBlockEndAlign(block);
-
- offsetY += 20;
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMinZ", xco, yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+togButWidth, yco-offsetY, (textButWidth-5), 18, &(data->minLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"min z limit");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMaxZ", xco+(width-(textButWidth-5)-togButWidth), yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", xco+(width-textButWidth-5), yco-offsetY, (textButWidth), 18, &(data->maxLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"max z limit");
- uiBlockEndAlign(block);
- }
-
- }
- break;
- */
+#endif
case CONSTRAINT_TYPE_NULL:
{
@@ -1332,11 +1166,12 @@ uiLayout *uiTemplateGroup(uiLayout *layout, Object *ob, Group *group)
/************************* Preview Template ***************************/
+#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
+#include "DNA_world_types.h"
#define B_MATPRV 1
-
static void do_preview_buttons(bContext *C, void *arg, int event)
{
switch(event) {
@@ -1346,32 +1181,55 @@ static void do_preview_buttons(bContext *C, void *arg, int event)
}
}
-void uiTemplatePreview(uiLayout *layout, ID *id)
+void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
{
uiLayout *row, *col;
uiBlock *block;
- Material *ma;
+ Material *ma= NULL;
+ ID *pid, *pparent;
+ short *pr_texture= NULL;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
printf("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
return;
}
- block= uiLayoutGetBlock(layout);
+ /* decide what to render */
+ pid= id;
+ pparent= NULL;
+
+ if(id && (GS(id->name) == ID_TE)) {
+ if(parent && (GS(parent->name) == ID_MA))
+ pr_texture= &((Material*)parent)->pr_texture;
+ else if(parent && (GS(parent->name) == ID_WO))
+ pr_texture= &((World*)parent)->pr_texture;
+ else if(parent && (GS(parent->name) == ID_LA))
+ pr_texture= &((Lamp*)parent)->pr_texture;
+
+ if(pr_texture) {
+ if(*pr_texture == TEX_PR_OTHER)
+ pid= parent;
+ else if(*pr_texture == TEX_PR_BOTH)
+ pparent= parent;
+ }
+ }
+ /* layout */
+ block= uiLayoutGetBlock(layout);
row= uiLayoutRow(layout, 0);
-
col= uiLayoutColumn(row, 0);
uiLayoutSetKeepAspect(col, 1);
- uiDefBut(block, BUT_EXTRA, 0, "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, id, 0.0, 0.0, 0, 0, "");
- uiBlockSetDrawExtraFunc(block, ED_preview_draw);
-
+ /* add preview */
+ uiDefBut(block, BUT_EXTRA, 0, "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, pid, 0.0, 0.0, 0, 0, "");
+ uiBlockSetDrawExtraFunc(block, ED_preview_draw, pparent, slot);
uiBlockSetHandleFunc(block, do_preview_buttons, NULL);
- if(id) {
- if(GS(id->name) == ID_MA) {
- ma= (Material*)id;
+ /* add buttons */
+ if(pid) {
+ 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;
uiLayoutColumn(row, 1);
@@ -1380,43 +1238,535 @@ void uiTemplatePreview(uiLayout *layout, ID *id)
uiDefIconButC(block, ROW, B_MATPRV, ICON_MATCUBE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_CUBE, 0, 0, "Preview type: Cube");
uiDefIconButC(block, ROW, B_MATPRV, ICON_MONKEY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_MONKEY, 0, 0, "Preview type: Monkey");
uiDefIconButC(block, ROW, B_MATPRV, ICON_HAIR, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_HAIR, 0, 0, "Preview type: Hair strands");
- uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky");
+ uiDefIconButC(block, ROW, B_MATPRV, ICON_MAT_SPHERE_SKY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky");
+ }
+
+ if(pr_texture) {
+ uiLayoutRow(layout, 1);
+
+ uiDefButS(block, ROW, B_MATPRV, "Texture", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_TEXTURE, 0, 0, "");
+ if(GS(parent->name) == ID_MA)
+ uiDefButS(block, ROW, B_MATPRV, "Material", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, "");
+ else if(GS(parent->name) == ID_LA)
+ uiDefButS(block, ROW, B_MATPRV, "Lamp", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, "");
+ else if(GS(parent->name) == ID_WO)
+ uiDefButS(block, ROW, B_MATPRV, "World", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_OTHER, 0, 0, "");
+ uiDefButS(block, ROW, B_MATPRV, "Both", 0, 0,UI_UNIT_X*10,UI_UNIT_Y, pr_texture, 10, TEX_PR_BOTH, 0, 0, "");
}
}
}
/********************** ColorRamp Template **************************/
-void uiTemplateColorRamp(uiLayout *layout, ColorBand *coba, int expand)
+#include "BKE_texture.h"
+
+typedef struct RNAUpdateCb {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+} RNAUpdateCb;
+
+static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+{
+ RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
+
+ /* we call update here on the pointer property, this way the
+ owner of the curve mapping can still define it's own update
+ and notifier, even if the CurveMapping struct is shared. */
+ RNA_property_update(C, &cb->ptr, cb->prop);
+}
+
+#define B_BANDCOL 1
+
+static int vergcband(const void *a1, const void *a2)
+{
+ const CBData *x1=a1, *x2=a2;
+
+ if( x1->pos > x2->pos ) return 1;
+ else if( x1->pos < x2->pos) return -1;
+ return 0;
+}
+
+static void colorband_pos_cb(bContext *C, void *cb_v, void *coba_v)
+{
+ ColorBand *coba= coba_v;
+ int a;
+
+ if(coba->tot<2) return;
+
+ for(a=0; a<coba->tot; a++) coba->data[a].cur= a;
+ qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
+ for(a=0; a<coba->tot; a++) {
+ if(coba->data[a].cur==coba->cur) {
+ coba->cur= a;
+ break;
+ }
+ }
+
+ rna_update_cb(C, cb_v, NULL);
+}
+
+static void colorband_add_cb(bContext *C, void *cb_v, void *coba_v)
+{
+ ColorBand *coba= coba_v;
+
+ if(coba->tot < MAXCOLORBAND-1) coba->tot++;
+ coba->cur= coba->tot-1;
+
+ colorband_pos_cb(C, cb_v, coba_v);
+
+ ED_undo_push(C, "Add colorband");
+}
+
+static void colorband_del_cb(bContext *C, void *cb_v, void *coba_v)
{
+ ColorBand *coba= coba_v;
+ int a;
+
+ if(coba->tot<2) return;
+
+ for(a=coba->cur; a<coba->tot; a++) {
+ coba->data[a]= coba->data[a+1];
+ }
+ if(coba->cur) coba->cur--;
+ coba->tot--;
+
+ ED_undo_push(C, "Delete colorband");
+
+ rna_update_cb(C, cb_v, NULL);
+}
+
+
+/* offset aligns from bottom, standard width 300, height 115 */
+static void colorband_buttons_large(uiBlock *block, ColorBand *coba, int xoffs, int yoffs, RNAUpdateCb *cb)
+{
+
+ uiBut *bt;
+
+ if(coba==NULL) return;
+
+ bt= uiDefBut(block, BUT, 0, "Add", 0+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Add a new color stop to the colorband");
+ uiButSetNFunc(bt, colorband_add_cb, MEM_dupallocN(cb), coba);
+
+ bt= uiDefBut(block, BUT, 0, "Delete", 60+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Delete the active position");
+ uiButSetNFunc(bt, colorband_del_cb, MEM_dupallocN(cb), coba);
+
+ uiDefButS(block, NUM, 0, "", 120+xoffs,100+yoffs,80, 20, &coba->cur, 0.0, (float)(MAX2(0, coba->tot-1)), 0, 0, "Choose active color stop");
+
+ bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
+ 210+xoffs, 100+yoffs, 90, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Set interpolation between color stops");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+ uiBlockEndAlign(block);
+
+ bt= uiDefBut(block, BUT_COLORBAND, 0, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, "");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ if(coba->tot) {
+ CBData *cbd= coba->data + coba->cur;
+
+ bt= uiDefButF(block, NUM, 0, "Pos:", 0+xoffs,40+yoffs,100, 20, &cbd->pos, 0.0, 1.0, 10, 0, "The position of the active color stop");
+ uiButSetNFunc(bt, colorband_pos_cb, MEM_dupallocN(cb), coba);
+ bt= uiDefButF(block, COL, 0, "", 110+xoffs,40+yoffs,80,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "The color value for the active color stop");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+ bt= uiDefButF(block, NUMSLI, 0, "A ", 200+xoffs,40+yoffs,100,20, &cbd->a, 0.0, 1.0, 10, 0, "The alpha value of the active color stop");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+ }
+
+}
+
+static void colorband_buttons_small(uiBlock *block, ColorBand *coba, rctf *butr, RNAUpdateCb *cb)
+{
+ uiBut *bt;
+ float unit= (butr->xmax-butr->xmin)/14.0f;
+ float xs= butr->xmin;
+
+
+ bt= uiDefBut(block, BUT, 0, "Add", xs,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Add a new color stop to the colorband");
+ uiButSetNFunc(bt, colorband_add_cb, MEM_dupallocN(cb), coba);
+ bt= uiDefBut(block, BUT, 0, "Delete", xs+2.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Delete the active position");
+ uiButSetNFunc(bt, colorband_del_cb, MEM_dupallocN(cb), coba);
+
+ if(coba->tot) {
+ CBData *cbd= coba->data + coba->cur;
+ bt= uiDefButF(block, COL, 0, "", xs+4.0f*unit,butr->ymin+20.0f,2.0f*unit,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "The color value for the active color stop");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+ bt= uiDefButF(block, NUMSLI, 0, "A:", xs+6.0f*unit,butr->ymin+20.0f,4.0f*unit,20, &(cbd->a), 0.0f, 1.0f, 10, 2, "The alpha value of the active color stop");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+ }
+
+ bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
+ xs+10.0f*unit, butr->ymin+20.0f, unit*4, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Set interpolation between color stops");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ bt= uiDefBut(block, BUT_COLORBAND, 0, "", xs,butr->ymin,butr->xmax-butr->xmin,20.0f, coba, 0, 0, 0, 0, "");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ uiBlockEndAlign(block);
+}
+
+static void colorband_buttons_layout(uiBlock *block, ColorBand *coba, rctf *butr, int small, RNAUpdateCb *cb)
+{
+ if(small)
+ colorband_buttons_small(block, coba, butr, cb);
+ else
+ colorband_buttons_large(block, coba, 0, 0, cb);
+}
+
+void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+{
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
+ PointerRNA cptr;
+ RNAUpdateCb *cb;
uiBlock *block;
rctf rect;
- if(coba) {
- rect.xmin= 0; rect.xmax= 200;
- rect.ymin= 0; rect.ymax= 190;
-
- block= uiLayoutFreeBlock(layout);
- colorband_buttons(block, coba, &rect, !expand);
- }
+ if(!prop || RNA_property_type(prop) != PROP_POINTER)
+ return;
+
+ cptr= RNA_property_pointer_get(ptr, prop);
+ if(!cptr.data || !RNA_struct_is_a(cptr.type, &RNA_ColorRamp))
+ return;
+
+ cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
+ cb->ptr= *ptr;
+ cb->prop= prop;
+
+ rect.xmin= 0; rect.xmax= 200;
+ rect.ymin= 0; rect.ymax= 190;
+
+ block= uiLayoutFreeBlock(layout);
+ colorband_buttons_layout(block, cptr.data, &rect, !expand, cb);
+
+ MEM_freeN(cb);
}
/********************* CurveMapping Template ************************/
#include "DNA_color_types.h"
+#include "BKE_colortools.h"
+
+static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
+{
+ CurveMapping *cumap = cumap_v;
+ float d;
+
+ /* we allow 20 times zoom */
+ if( (cumap->curr.xmax - cumap->curr.xmin) > 0.04f*(cumap->clipr.xmax - cumap->clipr.xmin) ) {
+ d= 0.1154f*(cumap->curr.xmax - cumap->curr.xmin);
+ cumap->curr.xmin+= d;
+ cumap->curr.xmax-= d;
+ d= 0.1154f*(cumap->curr.ymax - cumap->curr.ymin);
+ cumap->curr.ymin+= d;
+ cumap->curr.ymax-= d;
+ }
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+}
+
+static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
+{
+ CurveMapping *cumap = cumap_v;
+ float d, d1;
+
+ /* we allow 20 times zoom, but dont view outside clip */
+ if( (cumap->curr.xmax - cumap->curr.xmin) < 20.0f*(cumap->clipr.xmax - cumap->clipr.xmin) ) {
+ d= d1= 0.15f*(cumap->curr.xmax - cumap->curr.xmin);
+
+ if(cumap->flag & CUMA_DO_CLIP)
+ if(cumap->curr.xmin-d < cumap->clipr.xmin)
+ d1= cumap->curr.xmin - cumap->clipr.xmin;
+ cumap->curr.xmin-= d1;
+
+ d1= d;
+ if(cumap->flag & CUMA_DO_CLIP)
+ if(cumap->curr.xmax+d > cumap->clipr.xmax)
+ d1= -cumap->curr.xmax + cumap->clipr.xmax;
+ cumap->curr.xmax+= d1;
+
+ d= d1= 0.15f*(cumap->curr.ymax - cumap->curr.ymin);
+
+ if(cumap->flag & CUMA_DO_CLIP)
+ if(cumap->curr.ymin-d < cumap->clipr.ymin)
+ d1= cumap->curr.ymin - cumap->clipr.ymin;
+ cumap->curr.ymin-= d1;
+
+ d1= d;
+ if(cumap->flag & CUMA_DO_CLIP)
+ if(cumap->curr.ymax+d > cumap->clipr.ymax)
+ d1= -cumap->curr.ymax + cumap->clipr.ymax;
+ cumap->curr.ymax+= d1;
+ }
-void uiTemplateCurveMapping(uiLayout *layout, CurveMapping *cumap, int type)
+ ED_region_tag_redraw(CTX_wm_region(C));
+}
+
+static void curvemap_buttons_setclip(bContext *C, void *cumap_v, void *unused)
+{
+ CurveMapping *cumap = cumap_v;
+
+ curvemapping_changed(cumap, 0);
+}
+
+static void curvemap_buttons_delete(bContext *C, void *cb_v, void *cumap_v)
+{
+ CurveMapping *cumap = cumap_v;
+
+ curvemap_remove(cumap->cm+cumap->cur, SELECT);
+ curvemapping_changed(cumap, 0);
+
+ rna_update_cb(C, cb_v, NULL);
+}
+
+/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
+static uiBlock *curvemap_clipping_func(bContext *C, struct ARegion *ar, void *cumap_v)
{
+ CurveMapping *cumap = cumap_v;
uiBlock *block;
- rctf rect;
+ uiBut *bt;
- if(cumap) {
- rect.xmin= 0; rect.xmax= 200;
- rect.ymin= 0; rect.ymax= 190;
-
- block= uiLayoutFreeBlock(layout);
- curvemap_buttons(block, cumap, type, 0, 0, &rect);
+ block= uiBeginBlock(C, ar, "curvemap_clipping_func", UI_EMBOSS);
+
+ /* use this for a fake extra empy space around the buttons */
+ uiDefBut(block, LABEL, 0, "", -4, 16, 128, 106, NULL, 0, 0, 0, 0, "");
+
+ bt= uiDefButBitI(block, TOG, CUMA_DO_CLIP, 1, "Use Clipping",
+ 0,100,120,18, &cumap->flag, 0.0, 0.0, 10, 0, "");
+ uiButSetFunc(bt, curvemap_buttons_setclip, cumap, NULL);
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, 0, "Min X ", 0,74,120,18, &cumap->clipr.xmin, -100.0, cumap->clipr.xmax, 10, 0, "");
+ uiDefButF(block, NUM, 0, "Min Y ", 0,56,120,18, &cumap->clipr.ymin, -100.0, cumap->clipr.ymax, 10, 0, "");
+ uiDefButF(block, NUM, 0, "Max X ", 0,38,120,18, &cumap->clipr.xmax, cumap->clipr.xmin, 100.0, 10, 0, "");
+ uiDefButF(block, NUM, 0, "Max Y ", 0,20,120,18, &cumap->clipr.ymax, cumap->clipr.ymin, 100.0, 10, 0, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+
+ uiEndBlock(C, block);
+ return block;
+}
+
+static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event)
+{
+ CurveMapping *cumap = cumap_v;
+ CurveMap *cuma= cumap->cm+cumap->cur;
+
+ switch(event) {
+ case 0:
+ curvemap_reset(cuma, &cumap->clipr);
+ curvemapping_changed(cumap, 0);
+ break;
+ case 1:
+ cumap->curr= cumap->clipr;
+ break;
+ case 2: /* set vector */
+ curvemap_sethandle(cuma, 1);
+ curvemapping_changed(cumap, 0);
+ break;
+ case 3: /* set auto */
+ curvemap_sethandle(cuma, 0);
+ curvemapping_changed(cumap, 0);
+ break;
+ case 4: /* extend horiz */
+ cuma->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
+ curvemapping_changed(cumap, 0);
+ break;
+ case 5: /* extend extrapolate */
+ cuma->flag |= CUMA_EXTEND_EXTRAPOLATE;
+ curvemapping_changed(cumap, 0);
+ break;
}
+ ED_region_tag_redraw(CTX_wm_region(C));
+}
+
+static uiBlock *curvemap_tools_func(bContext *C, struct ARegion *ar, void *cumap_v)
+{
+ uiBlock *block;
+ short yco= 0, menuwidth=120;
+
+ block= uiBeginBlock(C, ar, "curvemap_tools_func", UI_EMBOSS);
+ uiBlockSetButmFunc(block, curvemap_tools_dofunc, cumap_v);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Extrapolated", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 50);
+
+ uiEndBlock(C, block);
+ return block;
+}
+
+static void curvemap_buttons_redraw(bContext *C, void *arg1, void *arg2)
+{
+ ED_region_tag_redraw(CTX_wm_region(C));
+}
+
+static void curvemap_buttons_reset(bContext *C, void *cb_v, void *cumap_v)
+{
+ CurveMapping *cumap = cumap_v;
+ int a;
+
+ for(a=0; a<CM_TOT; a++)
+ curvemap_reset(cumap->cm+a, &cumap->clipr);
+
+ cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f;
+ cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f;
+ curvemapping_set_black_white(cumap, NULL, NULL);
+
+ curvemapping_changed(cumap, 0);
+
+ rna_update_cb(C, cb_v, NULL);
+}
+
+/* still unsure how this call evolves... we use labeltype for defining what curve-channels to show */
+static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labeltype, int levels, RNAUpdateCb *cb)
+{
+ CurveMapping *cumap= ptr->data;
+ uiLayout *row, *sub, *split;
+ uiBlock *block;
+ uiBut *bt;
+ float dx= UI_UNIT_X;
+ int icon, size;
+
+ block= uiLayoutGetBlock(layout);
+
+ /* curve chooser */
+ row= uiLayoutRow(layout, 0);
+
+ if(labeltype=='v') {
+ /* vector */
+ sub= uiLayoutRow(row, 1);
+ uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT);
+
+ if(cumap->cm[0].curve) {
+ bt= uiDefButI(block, ROW, 0, "X", 0, 0, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ if(cumap->cm[1].curve) {
+ bt= uiDefButI(block, ROW, 0, "Y", 0, 0, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ if(cumap->cm[2].curve) {
+ bt= uiDefButI(block, ROW, 0, "Z", 0, 0, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ }
+ else if(labeltype=='c') {
+ /* color */
+ sub= uiLayoutRow(row, 1);
+ uiLayoutSetAlignment(sub, UI_LAYOUT_ALIGN_LEFT);
+
+ if(cumap->cm[3].curve) {
+ bt= uiDefButI(block, ROW, 0, "C", 0, 0, dx, 16, &cumap->cur, 0.0, 3.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ if(cumap->cm[0].curve) {
+ bt= uiDefButI(block, ROW, 0, "R", 0, 0, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ if(cumap->cm[1].curve) {
+ bt= uiDefButI(block, ROW, 0, "G", 0, 0, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ if(cumap->cm[2].curve) {
+ bt= uiDefButI(block, ROW, 0, "B", 0, 0, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, "");
+ uiButSetFunc(bt, curvemap_buttons_redraw, NULL, NULL);
+ }
+ }
+ else
+ uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT);
+
+ /* operation buttons */
+ sub= uiLayoutRow(row, 1);
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ bt= uiDefIconBut(block, BUT, 0, ICON_ZOOMIN, 0, 0, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom in");
+ uiButSetFunc(bt, curvemap_buttons_zoom_in, cumap, NULL);
+
+ bt= uiDefIconBut(block, BUT, 0, ICON_ZOOMOUT, 0, 0, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom out");
+ uiButSetFunc(bt, curvemap_buttons_zoom_out, cumap, NULL);
+
+ bt= uiDefIconBlockBut(block, curvemap_tools_func, cumap, 0, ICON_MODIFIER, 0, 0, dx, 18, "Tools");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ if(cumap->flag & CUMA_DO_CLIP) icon= ICON_CLIPUV_HLT; else icon= ICON_CLIPUV_DEHLT;
+ bt= uiDefIconBlockBut(block, curvemap_clipping_func, cumap, 0, icon, 0, 0, dx, 18, "Clipping Options");
+ uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ bt= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, dx, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Delete points");
+ uiButSetNFunc(bt, curvemap_buttons_delete, MEM_dupallocN(cb), cumap);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ uiBlockSetNFunc(block, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ /* curve itself */
+ size= uiLayoutGetWidth(layout);
+ row= uiLayoutRow(layout, 0);
+ uiDefBut(block, BUT_CURVE, 0, "", 0, 0, size, MIN2(size, 200), cumap, 0.0f, 1.0f, 0, 0, "");
+
+ /* black/white levels */
+ if(levels) {
+ split= uiLayoutSplit(layout, 0);
+ uiItemR(uiLayoutColumn(split, 0), NULL, 0, ptr, "black_level", UI_ITEM_R_EXPAND);
+ uiItemR(uiLayoutColumn(split, 0), NULL, 0, ptr, "white_level", UI_ITEM_R_EXPAND);
+
+ 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");
+ uiButSetNFunc(bt, curvemap_buttons_reset, MEM_dupallocN(cb), cumap);
+ }
+
+ uiBlockSetNFunc(block, NULL, NULL, NULL);
+}
+
+void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, int type, int levels)
+{
+ RNAUpdateCb *cb;
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
+ PointerRNA cptr;
+
+ if(!prop || RNA_property_type(prop) != PROP_POINTER)
+ return;
+
+ cptr= RNA_property_pointer_get(ptr, prop);
+ if(!cptr.data || !RNA_struct_is_a(cptr.type, &RNA_CurveMapping))
+ return;
+
+ cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
+ cb->ptr= *ptr;
+ cb->prop= prop;
+
+ curvemap_buttons_layout(layout, &cptr, type, levels, cb);
+
+ MEM_freeN(cb);
+}
+
+/********************* TriColor (ThemeWireColorSet) Template ************************/
+
+void uiTemplateTriColorSet(uiLayout *layout, PointerRNA *ptr, char *propname)
+{
+ PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
+ uiLayout *row;
+ PointerRNA csPtr;
+
+ if (!prop) {
+ printf("uiTemplateTriColorSet: property not found: %s\n", propname);
+ return;
+ }
+
+ /* we lay out the data in a row as 3 color swatches */
+ row= uiLayoutRow(layout, 1);
+
+ /* nselected, selected, active color swatches */
+ csPtr= RNA_property_pointer_get(ptr, prop);
+
+ uiItemR(row, "", 0, &csPtr, "normal", 0);
+ uiItemR(row, "", 0, &csPtr, "selected", 0);
+ uiItemR(row, "", 0, &csPtr, "active", 0);
}
/********************* Layer Buttons Template ************************/
@@ -1433,9 +1783,6 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
int groups, cols, layers;
int group, col, layer, row;
- if (!ptr->data)
- return;
-
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
printf("uiTemplateLayer: layers property not found: %s\n", propname);
@@ -1448,12 +1795,15 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
* the 'remainder' is added to this, as it will be ok to have first row slightly wider if need be
* - for now, only split into groups if if group will have at least 5 items
*/
- layers= RNA_property_array_length(prop);
+ layers= RNA_property_array_length(ptr, prop);
cols= (layers / 2) + (layers % 2);
groups= ((cols / 2) < 5) ? (1) : (cols / 2);
/* layers are laid out going across rows, with the columns being divided into groups */
- uSplit= uiLayoutSplit(layout, (1.0f/(float)groups));
+ if (groups > 1)
+ uSplit= uiLayoutSplit(layout, (1.0f/(float)groups));
+ else
+ uSplit= layout;
for (group= 0; group < groups; group++) {
uCol= uiLayoutColumn(uSplit, 1);
@@ -1465,7 +1815,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
/* add layers as toggle buts */
for (col= 0; (col < cols) && (layer < layers); col++, layer++) {
int icon=0; // XXX - add some way of setting this...
- uiItemFullR(uRow, "", icon, ptr, prop, layer, 0, 0, 0, 1);
+ uiItemFullR(uRow, "", icon, ptr, prop, layer, 0, UI_ITEM_R_TOGGLE);
}
}
}
@@ -1475,204 +1825,322 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
/************************* List Template **************************/
#if 0
-typedef struct ListItem {
- PointerRNA ptr;
- PropertyRNA *prop;
- PropertyRNA *activeprop;
-
- PointerRNA activeptr;
- int activei;
-
- int selected;
-} ListItem;
-
-static void list_item_cb(bContext *C, void *arg_item, void *arg_unused)
+static void list_item_add(ListBase *lb, ListBase *itemlb, uiLayout *layout, PointerRNA *data)
{
- ListItem *item= (ListItem*)arg_item;
- PropertyType activetype;
- char *activename;
-
- if(item->selected) {
- activetype= RNA_property_type(item->activeprop);
-
- if(activetype == PROP_POINTER)
- RNA_property_pointer_set(&item->ptr, item->activeprop, item->activeptr);
- else if(activetype == PROP_INT)
- RNA_property_int_set(&item->ptr, item->activeprop, item->activei);
- else if(activetype == PROP_STRING) {
- activename= RNA_struct_name_get_alloc(&item->activeptr, NULL, 0);
- RNA_property_string_set(&item->ptr, item->activeprop, activename);
- MEM_freeN(activename);
- }
- }
+ CollectionPointerLink *link;
+ uiListItem *item;
+
+ /* add to list to store in box */
+ item= MEM_callocN(sizeof(uiListItem), "uiListItem");
+ item->layout= layout;
+ item->data= *data;
+ BLI_addtail(itemlb, item);
+
+ /* add to list to return from function */
+ link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
+ RNA_pointer_create(NULL, &RNA_UIListItem, item, &link->ptr);
+ BLI_addtail(lb, link);
}
#endif
-ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, char *activepropname, int rows, int columns, int compact)
+ListBase uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *activeptr, char *activepropname, int rows, int listtype)
{
- CollectionPointerLink *link;
- PropertyRNA *prop, *activeprop;
+ //Scene *scene= CTX_data_scene(C);
+ PropertyRNA *prop= NULL, *activeprop;
PropertyType type, activetype;
- PointerRNA activeptr;
- uiLayout *box, *row, *col;
+ StructRNA *ptype;
+ uiLayout *box, *row, *col, *subrow;
uiBlock *block;
uiBut *but;
- ListBase lb;
- char *name, *activename= NULL, str[32];
- int i= 1, activei= 0, len, items, found;
- static int scroll = 1;
+ Panel *pa;
+ ListBase lb, *itemlb;
+ char *name, str[32];
+ int icon=0, i= 0, activei= 0, len= 0, items, found, min, max;
lb.first= lb.last= NULL;
/* validate arguments */
- if(!ptr->data)
+ block= uiLayoutGetBlock(layout);
+ pa= block->panel;
+
+ if(!pa) {
+ printf("uiTemplateList: only works inside a panel.\n");
return lb;
-
- prop= RNA_struct_find_property(ptr, propname);
- if(!prop) {
- printf("uiTemplateList: property not found: %s\n", propname);
+ }
+
+ if(!activeptr->data)
return lb;
+
+ if(ptr->data) {
+ prop= RNA_struct_find_property(ptr, propname);
+ if(!prop) {
+ printf("uiTemplateList: property not found: %s\n", propname);
+ return lb;
+ }
}
- activeprop= RNA_struct_find_property(ptr, activepropname);
+ activeprop= RNA_struct_find_property(activeptr, activepropname);
if(!activeprop) {
printf("uiTemplateList: property not found: %s\n", activepropname);
return lb;
}
- type= RNA_property_type(prop);
- if(type != PROP_COLLECTION) {
- printf("uiTemplateList: expected collection property.\n");
- return lb;
+ if(prop) {
+ type= RNA_property_type(prop);
+ if(type != PROP_COLLECTION) {
+ printf("uiTemplateList: expected collection property.\n");
+ return lb;
+ }
}
activetype= RNA_property_type(activeprop);
- if(!ELEM3(activetype, PROP_POINTER, PROP_INT, PROP_STRING)) {
- printf("uiTemplateList: expected pointer, integer or string property.\n");
+ if(activetype != PROP_INT) {
+ printf("uiTemplateList: expected integer property.\n");
return lb;
}
+ /* get icon */
+ if(ptr->data && prop) {
+ ptype= RNA_property_pointer_type(ptr, prop);
+ icon= RNA_struct_ui_icon(ptype);
+ }
+
/* get active data */
- if(activetype == PROP_POINTER)
- activeptr= RNA_property_pointer_get(ptr, activeprop);
- else if(activetype == PROP_INT)
- activei= RNA_property_int_get(ptr, activeprop);
- else if(activetype == PROP_STRING)
- activename= RNA_property_string_get_alloc(ptr, activeprop, NULL, 0);
+ activei= RNA_property_int_get(activeptr, activeprop);
- block= uiLayoutGetBlock(layout);
+ if(listtype == 'i') {
+ box= uiLayoutListBox(layout);
+ col= uiLayoutColumn(box, 1);
+ row= uiLayoutRow(col, 0);
+
+ itemlb= uiLayoutBoxGetList(box);
+
+ if(ptr->data && prop) {
+ /* create list items */
+ RNA_PROP_BEGIN(ptr, itemptr, prop) {
+ /* create button */
+ if(i == 9)
+ row= uiLayoutRow(col, 0);
+
+ if(RNA_struct_is_a(itemptr.type, &RNA_TextureSlot)) {
+#if 0
+ MTex *mtex= itemptr.data;
- if(compact) {
+ if(mtex && mtex->tex)
+ icon= ui_id_icon_get(scene, &mtex->tex->id);
+#endif
+ }
+
+ uiDefIconButR(block, LISTROW, 0, icon, 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
+
+ //list_item_add(&lb, itemlb, uiLayoutRow(row, 1), &itemptr);
+
+ i++;
+ }
+ RNA_PROP_END;
+ }
+ }
+ else if(listtype == 'c') {
/* compact layout */
found= 0;
row= uiLayoutRow(layout, 1);
- RNA_PROP_BEGIN(ptr, itemptr, prop) {
- if(activetype == PROP_POINTER)
- found= (activeptr.data == itemptr.data);
- else if(activetype == PROP_INT)
+ if(ptr->data && prop) {
+ /* create list items */
+ RNA_PROP_BEGIN(ptr, itemptr, prop) {
found= (activei == i);
- else if(activetype == PROP_STRING)
- found= (strcmp(activename, name) == 0);
-
- if(found) {
- name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
- if(name) {
- uiItemL(row, name, RNA_struct_ui_icon(itemptr.type));
- MEM_freeN(name);
+
+ if(found) {
+ /* create button */
+ name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
+ uiItemL(row, (name)? name: "", icon);
+
+ if(name)
+ MEM_freeN(name);
+
+ /* add to list to return */
+ //list_item_add(&lb, itemlb, uiLayoutRow(row, 1), &itemptr);
}
- link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
- link->ptr= itemptr;
- BLI_addtail(&lb, link);
+ i++;
}
-
- i++;
+ RNA_PROP_END;
}
- RNA_PROP_END;
- if(i == 1)
+ /* if not found, add in dummy button */
+ if(i == 0)
uiItemL(row, "", 0);
- sprintf(str, "%d :", i-1);
- but= uiDefIconTextButR(block, NUM, 0, 0, str, 0,0,UI_UNIT_X*5,UI_UNIT_Y, ptr, activepropname, 0, 0, 0, 0, 0, "");
- if(i == 1)
+ /* next/prev button */
+ sprintf(str, "%d :", i);
+ but= uiDefIconTextButR(block, NUM, 0, 0, str, 0,0,UI_UNIT_X*5,UI_UNIT_Y, activeptr, activepropname, 0, 0, 0, 0, 0, "");
+ if(i == 0)
uiButSetFlag(but, UI_BUT_DISABLED);
}
else {
+ /* default rows */
if(rows == 0)
rows= 5;
- if(columns == 0)
- columns= 1;
-
- items= rows*columns;
- box= uiLayoutBox(layout);
+ /* layout */
+ box= uiLayoutListBox(layout);
row= uiLayoutRow(box, 0);
col = uiLayoutColumn(row, 1);
- uiBlockSetEmboss(block, UI_EMBOSSN);
+ /* init numbers */
+ RNA_property_int_range(activeptr, activeprop, &min, &max);
- len= RNA_property_collection_length(ptr, prop);
- scroll= MIN2(scroll, len-items+1);
- scroll= MAX2(scroll, 1);
+ if(prop)
+ len= RNA_property_collection_length(ptr, prop);
+ items= CLAMPIS(len, rows, 5);
- RNA_PROP_BEGIN(ptr, itemptr, prop) {
- if(i >= scroll && i<scroll+items) {
- name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
+ pa->list_scroll= MIN2(pa->list_scroll, len-items);
+ pa->list_scroll= MAX2(pa->list_scroll, 0);
- if(name) {
-#if 0
- ListItem *item= MEM_callocN(sizeof(ListItem), "uiTemplateList ListItem");
-
- item->ptr= *ptr;
- item->prop= prop;
- item->activeprop= activeprop;
- item->activeptr= itemptr;
- item->activei= i;
-
- if(activetype == PROP_POINTER)
- item->selected= (activeptr.data == itemptr.data)? i: -1;
- else if(activetype == PROP_INT)
- item->selected= (activei == i)? i: -1;
- else if(activetype == PROP_STRING)
- item->selected= (strcmp(activename, name) == 0)? i: -1;
-#endif
+ itemlb= uiLayoutBoxGetList(box);
+
+ if(ptr->data && prop) {
+ /* create list items */
+ RNA_PROP_BEGIN(ptr, itemptr, prop) {
+ if(i >= pa->list_scroll && i<pa->list_scroll+items) {
+ name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
- //but= uiDefIconTextButI(block, ROW, 0, RNA_struct_ui_icon(itemptr.type), name, 0,0,UI_UNIT_X*10,UI_UNIT_Y, &item->selected, 0, i, 0, 0, "");
- but= uiDefIconTextButR(block, ROW, 0, RNA_struct_ui_icon(itemptr.type), name, 0,0,UI_UNIT_X*10,UI_UNIT_Y, ptr, activepropname, 0/*&item->selected*/, 0, i, 0, 0, "");
+ subrow= uiLayoutRow(col, 0);
+
+ /* create button */
+ if(!icon || icon == ICON_DOT)
+ but= uiDefButR(block, LISTROW, 0, (name)? name: "", 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
+ else
+ but= uiDefIconTextButR(block, LISTROW, 0, icon, (name)? name: "", 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_ICON_LEFT|UI_TEXT_LEFT);
- //uiButSetNFunc(but, list_item_cb, item, NULL);
- MEM_freeN(name);
+ /* XXX hardcoded */
+ if(itemptr.type == &RNA_MeshTextureFaceLayer || itemptr.type == &RNA_MeshColorLayer) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiDefIconButR(block, TOG, 0, ICON_SCENE, 0, 0, UI_UNIT_X, UI_UNIT_Y, &itemptr, "active_render", 0, 0, 0, 0, 0, NULL);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+
+ if(name)
+ MEM_freeN(name);
- link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
- link->ptr= itemptr;
- BLI_addtail(&lb, link);
+ /* add to list to return */
+ //list_item_add(&lb, itemlb, subrow, &itemptr);
}
- }
- i++;
+ i++;
+ }
+ RNA_PROP_END;
}
- RNA_PROP_END;
- while(i < scroll+items) {
- if(i >= scroll)
+ /* add dummy buttons to fill space */
+ while(i < pa->list_scroll+items) {
+ if(i >= pa->list_scroll)
uiItemL(col, "", 0);
i++;
}
- uiBlockSetEmboss(block, UI_EMBOSS);
-
+ /* add scrollbar */
if(len > items) {
col= uiLayoutColumn(row, 0);
- uiDefButI(block, SCROLL, 0, "", 0,0,UI_UNIT_X*0.75,UI_UNIT_Y*items, &scroll, 1, len-items+1, items, 0, "");
+ uiDefButI(block, SCROLL, 0, "", 0,0,UI_UNIT_X*0.75,UI_UNIT_Y*items, &pa->list_scroll, 0, len-items, items, 0, "");
}
-
- //uiDefButI(block, SCROLL, 0, "", 0,0,UI_UNIT_X*15,UI_UNIT_Y*0.75, &scroll, 1, 16-5, 5, 0, "");
}
+ /* return items in list */
return lb;
}
+/************************* Operator Search Template **************************/
+
+static void operator_call_cb(bContext *C, void *arg1, void *arg2)
+{
+ wmOperatorType *ot= arg2;
+
+ if(ot)
+ 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)
+{
+ wmOperatorType *ot = WM_operatortype_first();
+
+ for(; ot; ot= ot->next) {
+
+ if(BLI_strcasestr(ot->name, str)) {
+ if(WM_operator_poll((bContext*)C, ot)) {
+ char name[256];
+ int len= strlen(ot->name);
+
+ /* display name for menu, can hold hotkey */
+ BLI_strncpy(name, ot->name, 256);
+
+ /* check for hotkey */
+ if(len < 256-6) {
+ if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, &name[len+1], 256-len-1))
+ name[len]= '|';
+ }
+
+ if(0==uiSearchItemAdd(items, name, ot, 0))
+ break;
+ }
+ }
+ }
+}
+
+void uiTemplateOperatorSearch(uiLayout *layout)
+{
+ uiBlock *block;
+ uiBut *but;
+ static char search[256]= "";
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetCurLayout(block, layout);
+
+ but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, sizeof(search), 0, 0, UI_UNIT_X*6, UI_UNIT_Y, "");
+ uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb, NULL);
+}
+
+/************************* Running Jobs Template **************************/
+
+#define B_STOPRENDER 1
+#define B_STOPCAST 2
+#define B_STOPANIM 3
+
+static void do_running_jobs(bContext *C, void *arg, int event)
+{
+ switch(event) {
+ case B_STOPRENDER:
+ G.afbreek= 1;
+ break;
+ case B_STOPCAST:
+ WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
+ break;
+ case B_STOPANIM:
+ WM_operator_name_call(C, "SCREEN_OT_animation_play", WM_OP_INVOKE_SCREEN, NULL);
+ break;
+ }
+}
+
+void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
+{
+ bScreen *screen= CTX_wm_screen(C);
+ Scene *scene= CTX_data_scene(C);
+ wmWindowManager *wm= CTX_wm_manager(C);
+ uiBlock *block;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetCurLayout(block, layout);
+
+ uiBlockSetHandleFunc(block, do_running_jobs, NULL);
+
+ if(WM_jobs_test(wm, scene))
+ uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_REC, "Render", 0,0,75,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering");
+ if(WM_jobs_test(wm, screen))
+ uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_REC, "Capture", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast");
+ if(screen->animtimer)
+ uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_REC, "Anim Player", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback");
+}
+
+
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 3ed81a3e9bc..1d56ed4fb6a 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -23,30 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include <math.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "MEM_guardedalloc.h"
-
-#include "DNA_action_types.h"
-#include "DNA_color_types.h"
-#include "DNA_listBase.h"
-#include "DNA_material_types.h"
#include "DNA_object_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_windowmanager_types.h"
-
-#include "BLI_blenlib.h"
-#include "BKE_colortools.h"
#include "BKE_context.h"
-#include "BKE_idprop.h"
-#include "BKE_icons.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -54,25 +37,13 @@
#include "UI_interface.h"
#include "UI_resources.h"
-#include "ED_screen.h"
-#include "ED_util.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "interface_intern.h"
-
-#define DEF_BUT_WIDTH 150
-#define DEF_ICON_BUT_WIDTH 20
-#define DEF_BUT_HEIGHT 20
-
/*************************** 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 *but=NULL;
const char *propname= RNA_property_identifier(prop);
- int arraylen= RNA_property_array_length(prop);
+ int arraylen= RNA_property_array_length(ptr, prop);
switch(RNA_property_type(prop)) {
case PROP_BOOLEAN: {
@@ -81,7 +52,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
if(arraylen && index == -1)
return NULL;
- length= RNA_property_array_length(prop);
+ length= RNA_property_array_length(ptr, prop);
if(length)
value= RNA_property_boolean_get_index(ptr, prop, index);
@@ -102,13 +73,18 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
if(RNA_property_subtype(prop) == PROP_COLOR)
but= uiDefButR(block, COL, 0, name, x1, y1, x2, y2, ptr, propname, 0, 0, 0, -1, -1, NULL);
}
- else if(RNA_property_subtype(prop) == PROP_PERCENTAGE)
+ else if(RNA_property_subtype(prop) == PROP_PERCENTAGE || RNA_property_subtype(prop) == PROP_FACTOR)
but= uiDefButR(block, NUMSLI, 0, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else
but= uiDefButR(block, NUM, 0, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
break;
case PROP_ENUM:
- but= uiDefButR(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
+ if(icon && name && strcmp(name, "") == 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);
+ else
+ 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)
@@ -152,8 +128,6 @@ void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int
uiLayout *split, *col;
char *name;
- uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0);
-
RNA_STRUCT_BEGIN(ptr, prop) {
if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
continue;
@@ -170,901 +144,41 @@ void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int
uiItemL(uiLayoutColumn(split, 0), name, 0);
col= uiLayoutColumn(split, 0);
}
+ else
+ col= NULL;
- /* temp hack to show normal button for spin/screw */
- if(strcmp(name, "Axis")==0) {
- uiDefButR(uiLayoutGetBlock(col), BUT_NORMAL, 0, name, 0, 0, 100, 100, ptr, "axis", -1, 0, 0, -1, -1, NULL);
- }
- else uiItemFullR(col, "", 0, ptr, prop, -1, 0, 0, 0, 0);
+ uiItemFullR(col, "", 0, ptr, prop, -1, 0, 0);
}
RNA_STRUCT_END;
}
/***************************** ID Utilities *******************************/
-/* note, C code version, will be replaced with version in interface_templates.c */
-
-typedef struct uiIDPoinParams {
- uiIDPoinFunc func;
- ListBase *lb;
- ID *id;
- short id_code;
- short browsenr;
-} uiIDPoinParams;
-
-static void idpoin_cb(bContext *C, void *arg_params, void *arg_event)
-{
- uiIDPoinParams *params= (uiIDPoinParams*)arg_params;
- ListBase *lb= params->lb;
- uiIDPoinFunc func= params->func;
- ID *id= params->id, *idtest;
- int nr, event= GET_INT_FROM_POINTER(arg_event);
-
- if(event == UI_ID_BROWSE && params->browsenr == 32767)
- event= UI_ID_ADD_NEW;
- else if(event == UI_ID_BROWSE && params->browsenr == 32766)
- event= UI_ID_OPEN;
-
- switch(event) {
- case UI_ID_RENAME:
- if(id) test_idbutton(id->name+2);
- else return;
- break;
- case UI_ID_BROWSE: {
- /* ID can be NULL, if nothing was assigned yet */
- if(lb->first==NULL) return;
-
- if(params->browsenr== -2) {
- /* XXX implement or find a replacement (ID can be NULL!)
- * activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &params->browsenr, do_global_buttons); */
- return;
- }
- if(params->browsenr < 0)
- return;
-
- for(idtest=lb->first, nr=1; idtest; idtest=idtest->next, nr++) {
- if(nr==params->browsenr) {
- if(id == idtest)
- return;
-
- id= idtest;
-
- break;
- }
- }
- break;
- }
- case UI_ID_DELETE:
- id= NULL;
- break;
- case UI_ID_FAKE_USER:
- if(id) {
- if(id->flag & LIB_FAKEUSER) id->us++;
- else id->us--;
- }
- else return;
- break;
- case UI_ID_PIN:
- break;
- case UI_ID_ADD_NEW:
- break;
- case UI_ID_OPEN:
- break;
- case UI_ID_ALONE:
- if(!id || id->us < 1)
- return;
- break;
- case UI_ID_LOCAL:
- if(!id || id->us < 1)
- return;
- break;
- case UI_ID_AUTO_NAME:
- break;
- }
-
- if(func)
- func(C, id, event);
-}
-
-/* ***************************** ID Search browse menu ********************** */
-
-static void id_search_call_cb(struct bContext *C, void *arg_params, void *item)
-{
- uiIDPoinParams *params= (uiIDPoinParams*)arg_params;
-
- if(item && params->func)
- params->func(C, item, UI_ID_BROWSE);
-
-}
-
-static void id_search_cb(const struct bContext *C, void *arg_params, char *str, uiSearchItems *items)
-{
- uiIDPoinParams *params= (uiIDPoinParams*)arg_params;
- ID *id;
-
- for(id= params->lb->first; id; id= id->next) {
- int iconid= 0;
-
-
- /* icon */
- switch(GS(id->name))
- {
- case ID_MA: /* fall through */
- case ID_TE: /* fall through */
- case ID_IM: /* fall through */
- case ID_WO: /* fall through */
- case ID_LA: /* fall through */
- iconid= BKE_icon_getid(id);
- break;
- default:
- break;
- }
-
- if(BLI_strcasestr(id->name+2, str)) {
- if(0==uiSearchItemAdd(items, id->name+2, id, iconid))
- break;
- }
- }
-}
-
-static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_params)
-{
- static char search[256];
- static uiIDPoinParams params;
- wmEvent event;
- wmWindow *win= CTX_wm_window(C);
- uiBlock *block;
- uiBut *but;
-
- /* clear initial search string, then all items show */
- search[0]= 0;
- /* params is malloced, can be freed by parent button */
- params= *((uiIDPoinParams*)arg_params);
-
- block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
- uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
-
- /* fake button, it holds space for search items */
- uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
-
- but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, "");
- uiButSetSearchFunc(but, id_search_cb, &params, id_search_call_cb);
-
- uiBoundsBlock(block, 6);
- uiBlockSetDirection(block, UI_DOWN);
- uiEndBlock(C, block);
-
- event= *(win->eventstate); /* XXX huh huh? make api call */
- event.type= EVT_BUT_OPEN;
- event.val= KM_PRESS;
- event.customdata= but;
- event.customdatafree= FALSE;
- wm_event_add(win, &event);
-
- return block;
-}
-
-/* ****************** */
-
-int uiDefIDPoinButs(uiBlock *block, Main *bmain, ID *parid, ID *id, int id_code, short *pin_p, int x, int y, uiIDPoinFunc func, int events)
-{
- uiBut *but;
- uiIDPoinParams *params, *dup_params;
- char str1[10];
- int len, add_addbutton=0;
-
- /* setup struct that we will pass on with the buttons */
- params= MEM_callocN(sizeof(uiIDPoinParams), "uiIDPoinParams");
- params->lb= wich_libbase(bmain, id_code);
- params->id= id;
- params->id_code= id_code;
- params->func= func;
-
- /* create buttons */
- uiBlockBeginAlign(block);
-
- /* XXX solve?
- if(id && id->us>1)
- uiBlockSetCol(block, TH_BUT_SETTING1);
-
- if((events & UI_ID_PIN) && *pin_p)
- uiBlockSetCol(block, TH_BUT_SETTING2);
- */
-
- /* pin button */
- if(id && (events & UI_ID_PIN)) {
- but= uiDefIconButS(block, ICONTOG, (events & UI_ID_PIN), ICON_KEY_DEHLT, x, y ,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, pin_p, 0, 0, 0, 0, "Keeps this view displaying the current data regardless of what object is selected");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_PIN));
- x+= DEF_ICON_BUT_WIDTH;
- }
-
- /* browse menu */
- if(events & UI_ID_BROWSE) {
- uiDefBlockButN(block, id_search_menu, MEM_dupallocN(params), "", x, y, DEF_ICON_BUT_WIDTH, DEF_BUT_HEIGHT, "Browse ID data");
- x+= DEF_ICON_BUT_WIDTH;
- }
-
-
-
- /* text button with name */
- if(id) {
- /* XXX solve?
- if(id->us > 1)
- uiBlockSetCol(block, TH_BUT_SETTING1);
- */
- /* pinned data?
- if((events & UI_ID_PIN) && *pin_p)
- uiBlockSetCol(block, TH_BUT_SETTING2);
- */
- /* redalert overrides pin color
- if(id->us<=0)
- uiBlockSetCol(block, TH_REDALERT);
- */
- uiBlockSetButLock(block, id->lib!=0, "Can't edit external libdata");
-
- /* name button */
- text_idbutton(id, str1);
-
- if(GS(id->name)==ID_IP) len= 110;
- else if((y) && (GS(id->name)==ID_AC)) len= 100; // comes from button panel (poselib)
- else if(y) len= 140; // comes from button panel
- else len= 120;
-
- but= uiDefBut(block, TEX, 0, str1,x, y, (short)len, DEF_BUT_HEIGHT, id->name+2, 0.0, 21.0, 0, 0, "Displays current Datablock name. Click to change.");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_RENAME));
-
- x+= len;
-
- uiBlockClearButLock(block);
-
- /* lib make local button */
- if(id->lib) {
- if(id->flag & LIB_INDIRECT) uiDefIconBut(block, BUT, 0, 0 /* XXX ICON_DATALIB */,x,y,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, 0, 0, 0, 0, 0, "Indirect Library Datablock. Cannot change.");
- else {
- but= uiDefIconBut(block, BUT, 0, 0 /* XXX ICON_PARLIB */, x,y,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, 0, 0, 0, 0, 0,
- (events & UI_ID_LOCAL)? "Direct linked Library Datablock. Click to make local.": "Direct linked Library Datablock, cannot make local.");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_ALONE));
- }
-
- x+= DEF_ICON_BUT_WIDTH;
- }
-
- /* number of users / make local button */
- if((events & UI_ID_ALONE) && id->us>1) {
- int butwidth;
-
- uiBlockSetButLock(block, (events & UI_ID_PIN) && *pin_p, "Can't make pinned data single-user");
-
- sprintf(str1, "%d", id->us);
- butwidth= (id->us<10)? DEF_ICON_BUT_WIDTH: DEF_ICON_BUT_WIDTH+10;
-
- but= uiDefBut(block, BUT, 0, str1, x, y, butwidth, DEF_BUT_HEIGHT, 0, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_ALONE));
- x+= butwidth;
-
- uiBlockClearButLock(block);
- }
-
- /* delete button */
- if(events & UI_ID_DELETE) {
- uiBlockSetButLock(block, (events & UI_ID_PIN) && *pin_p, "Can't unlink pinned data");
- if(parid && parid->lib);
- else {
- but= uiDefIconBut(block, BUT, 0, ICON_X, x,y,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, 0, 0, 0, 0, 0, "Deletes link to this Datablock");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_DELETE));
- x+= DEF_ICON_BUT_WIDTH;
- }
-
- uiBlockClearButLock(block);
- }
-
- /* auto name button */
- if(events & UI_ID_AUTO_NAME) {
- if(parid && parid->lib);
- else {
- but= uiDefIconBut(block, BUT, 0, ICON_AUTO,x,y,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, 0, 0, 0, 0, 0, "Generates an automatic name");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_AUTO_NAME));
- x+= DEF_ICON_BUT_WIDTH;
- }
- }
-
- /* fake user button */
- if(events & UI_ID_FAKE_USER) {
- but= uiDefButBitS(block, TOG, LIB_FAKEUSER, 0, "F", x,y,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, &id->flag, 0, 0, 0, 0, "Saves this datablock even if it has no users");
- uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_FAKE_USER));
- x+= DEF_ICON_BUT_WIDTH;
- }
- }
- /* add new button */
- else if(add_addbutton) {
- if(parid) uiBlockSetButLock(block, parid->lib!=0, "Can't edit external libdata");
- dup_params= MEM_dupallocN(params);
- but= uiDefButS(block, TOG, 0, "Add New", x, y, 110, DEF_BUT_HEIGHT, &dup_params->browsenr, params->browsenr, 32767.0, 0, 0, "Add new data block");
- uiButSetNFunc(but, idpoin_cb, dup_params, SET_INT_IN_POINTER(UI_ID_ADD_NEW));
- x+= 110;
- }
-
- uiBlockEndAlign(block);
-
- MEM_freeN(params);
-
- return x;
-}
-
-/* ****************************** default button callbacks ******************* */
-/* ************ LEGACY WARNING, only to get things work with 2.48 code! ****** */
-
-void test_idbutton_cb(struct bContext *C, void *namev, void *arg2)
-{
- char *name= namev;
-
- test_idbutton(name+2);
-}
-
-
-void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- id= CTX_data_main(C)->text.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
+int uiIconFromID(ID *id)
{
- ID *id;
-
- id= CTX_data_main(C)->action.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- id_us_plus(id);
- *idpp= id;
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
+ Object *ob;
+ PointerRNA ptr;
+ short idcode;
-
-void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
+ if(id==NULL)
+ return 0;
-// XXX if(idpp == (ID **)&(emptytex.object)) {
-// error("You must add a texture first");
-// *idpp= 0;
-// return;
-// }
-
- id= CTX_data_main(C)->object.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_lib_extern(id); /* checks lib data, sets correct flag for saving then */
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
+ idcode= GS(id->name);
-/* tests for an object of type OB_MESH */
-void test_meshobpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
+ /* exception for objects */
+ if(idcode == ID_OB) {
+ ob= (Object*)id;
- id = CTX_data_main(C)->object.first;
- while(id) {
- Object *ob = (Object *)id;
- if(ob->type == OB_MESH && strcmp(name, id->name + 2) == 0) {
- *idpp = id;
- /* checks lib data, sets correct flag for saving then */
- id_lib_extern(id);
- return;
- }
- id = id->next;
+ if(ob->type == OB_EMPTY)
+ return ICON_EMPTY_DATA;
+ else
+ return uiIconFromID(ob->data);
}
- *idpp = NULL;
-}
-void test_meshpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
+ /* otherwise get it through RNA, creating the pointer
+ will set the right type, also with subclassing */
+ RNA_id_pointer_create(id, &ptr);
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->mesh.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-void test_matpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->mat.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-void test_scenepoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->scene.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-void test_grouppoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->group.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-void test_texpoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->tex.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-void test_imapoin_but(struct bContext *C, char *name, ID **idpp)
-{
- ID *id;
-
- if( *idpp ) (*idpp)->us--;
-
- id= CTX_data_main(C)->image.first;
- while(id) {
- if( strcmp(name, id->name+2)==0 ) {
- *idpp= id;
- id_us_plus(id);
- return;
- }
- id= id->next;
- }
- *idpp= NULL;
-}
-
-/* autocomplete callback for buttons */
-void autocomplete_bone(struct bContext *C, char *str, void *arg_v)
-{
- Object *ob= (Object *)arg_v;
-
- if(ob==NULL || ob->pose==NULL) return;
-
- /* search if str matches the beginning of name */
- if(str[0]) {
- AutoComplete *autocpl= autocomplete_begin(str, 32);
- bPoseChannel *pchan;
-
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next)
- autocomplete_do_name(autocpl, pchan->name);
-
- autocomplete_end(autocpl, str);
- }
-}
-
-/* autocomplete callback for buttons */
-void autocomplete_vgroup(struct bContext *C, char *str, void *arg_v)
-{
- Object *ob= (Object *)arg_v;
-
- if(ob==NULL) return;
-
- /* search if str matches the beginning of a name */
- if(str[0]) {
- AutoComplete *autocpl= autocomplete_begin(str, 32);
- bDeformGroup *dg;
-
- for(dg= ob->defbase.first; dg; dg= dg->next)
- if(dg->name!=str)
- autocomplete_do_name(autocpl, dg->name);
-
- autocomplete_end(autocpl, str);
- }
-}
-
-
-/* ----------- custom button group ---------------------- */
-
-static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
-{
- CurveMapping *cumap = cumap_v;
- float d;
-
- /* we allow 20 times zoom */
- if( (cumap->curr.xmax - cumap->curr.xmin) > 0.04f*(cumap->clipr.xmax - cumap->clipr.xmin) ) {
- d= 0.1154f*(cumap->curr.xmax - cumap->curr.xmin);
- cumap->curr.xmin+= d;
- cumap->curr.xmax-= d;
- d= 0.1154f*(cumap->curr.ymax - cumap->curr.ymin);
- cumap->curr.ymin+= d;
- cumap->curr.ymax-= d;
- }
-}
-
-static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
-{
- CurveMapping *cumap = cumap_v;
- float d, d1;
-
- /* we allow 20 times zoom, but dont view outside clip */
- if( (cumap->curr.xmax - cumap->curr.xmin) < 20.0f*(cumap->clipr.xmax - cumap->clipr.xmin) ) {
- d= d1= 0.15f*(cumap->curr.xmax - cumap->curr.xmin);
-
- if(cumap->flag & CUMA_DO_CLIP)
- if(cumap->curr.xmin-d < cumap->clipr.xmin)
- d1= cumap->curr.xmin - cumap->clipr.xmin;
- cumap->curr.xmin-= d1;
-
- d1= d;
- if(cumap->flag & CUMA_DO_CLIP)
- if(cumap->curr.xmax+d > cumap->clipr.xmax)
- d1= -cumap->curr.xmax + cumap->clipr.xmax;
- cumap->curr.xmax+= d1;
-
- d= d1= 0.15f*(cumap->curr.ymax - cumap->curr.ymin);
-
- if(cumap->flag & CUMA_DO_CLIP)
- if(cumap->curr.ymin-d < cumap->clipr.ymin)
- d1= cumap->curr.ymin - cumap->clipr.ymin;
- cumap->curr.ymin-= d1;
-
- d1= d;
- if(cumap->flag & CUMA_DO_CLIP)
- if(cumap->curr.ymax+d > cumap->clipr.ymax)
- d1= -cumap->curr.ymax + cumap->clipr.ymax;
- cumap->curr.ymax+= d1;
- }
-}
-
-static void curvemap_buttons_setclip(bContext *C, void *cumap_v, void *unused)
-{
- CurveMapping *cumap = cumap_v;
-
- curvemapping_changed(cumap, 0);
-}
-
-static void curvemap_buttons_delete(bContext *C, void *cumap_v, void *unused)
-{
- CurveMapping *cumap = cumap_v;
-
- curvemap_remove(cumap->cm+cumap->cur, SELECT);
- curvemapping_changed(cumap, 0);
-}
-
-/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
-static uiBlock *curvemap_clipping_func(struct bContext *C, struct ARegion *ar, void *cumap_v)
-{
- CurveMapping *cumap = cumap_v;
- uiBlock *block;
- uiBut *bt;
-
- block= uiBeginBlock(C, ar, "curvemap_clipping_func", UI_EMBOSS);
-
- /* use this for a fake extra empy space around the buttons */
- uiDefBut(block, LABEL, 0, "", -4, 16, 128, 106, NULL, 0, 0, 0, 0, "");
-
- bt= uiDefButBitI(block, TOG, CUMA_DO_CLIP, 1, "Use Clipping",
- 0,100,120,18, &cumap->flag, 0.0, 0.0, 10, 0, "");
- uiButSetFunc(bt, curvemap_buttons_setclip, cumap, NULL);
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, 0, "Min X ", 0,74,120,18, &cumap->clipr.xmin, -100.0, cumap->clipr.xmax, 10, 0, "");
- uiDefButF(block, NUM, 0, "Min Y ", 0,56,120,18, &cumap->clipr.ymin, -100.0, cumap->clipr.ymax, 10, 0, "");
- uiDefButF(block, NUM, 0, "Max X ", 0,38,120,18, &cumap->clipr.xmax, cumap->clipr.xmin, 100.0, 10, 0, "");
- uiDefButF(block, NUM, 0, "Max Y ", 0,20,120,18, &cumap->clipr.ymax, cumap->clipr.ymin, 100.0, 10, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiEndBlock(C, block);
- return block;
-}
-
-
-static void curvemap_tools_dofunc(bContext *C, void *cumap_v, int event)
-{
- CurveMapping *cumap = cumap_v;
- CurveMap *cuma= cumap->cm+cumap->cur;
-
- switch(event) {
- case 0:
- curvemap_reset(cuma, &cumap->clipr);
- curvemapping_changed(cumap, 0);
- break;
- case 1:
- cumap->curr= cumap->clipr;
- break;
- case 2: /* set vector */
- curvemap_sethandle(cuma, 1);
- curvemapping_changed(cumap, 0);
- break;
- case 3: /* set auto */
- curvemap_sethandle(cuma, 0);
- curvemapping_changed(cumap, 0);
- break;
- case 4: /* extend horiz */
- cuma->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
- curvemapping_changed(cumap, 0);
- break;
- case 5: /* extend extrapolate */
- cuma->flag |= CUMA_EXTEND_EXTRAPOLATE;
- curvemapping_changed(cumap, 0);
- break;
- }
- ED_region_tag_redraw(CTX_wm_region(C));
-}
-
-static uiBlock *curvemap_tools_func(struct bContext *C, struct ARegion *ar, void *cumap_v)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "curvemap_tools_func", UI_EMBOSS);
- uiBlockSetButmFunc(block, curvemap_tools_dofunc, cumap_v);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Handle", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Extrapolated", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Curve", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 50);
-
- uiEndBlock(C, block);
- return block;
-}
-
-/* still unsure how this call evolves... we use labeltype for defining what curve-channels to show */
-void curvemap_buttons(uiBlock *block, CurveMapping *cumap, char labeltype, short event, short redraw, rctf *rect)
-{
- uiBut *bt;
- float dx, fy= rect->ymax-18.0f;
- int icon;
- short xco, yco;
-
- yco= (short)(rect->ymax-18.0f);
-
- /* curve choice options + tools/settings, 8 icons + spacer */
- dx= (rect->xmax-rect->xmin)/(9.0f);
-
- uiBlockBeginAlign(block);
- if(labeltype=='v') { /* vector */
- xco= (short)rect->xmin;
- if(cumap->cm[0].curve)
- uiDefButI(block, ROW, redraw, "X", xco, yco+2, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, "");
- xco= (short)(rect->xmin+1.0f*dx);
- if(cumap->cm[1].curve)
- uiDefButI(block, ROW, redraw, "Y", xco, yco+2, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, "");
- xco= (short)(rect->xmin+2.0f*dx);
- if(cumap->cm[2].curve)
- uiDefButI(block, ROW, redraw, "Z", xco, yco+2, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, "");
- }
- else if(labeltype=='c') { /* color */
- xco= (short)rect->xmin;
- if(cumap->cm[3].curve)
- uiDefButI(block, ROW, redraw, "C", xco, yco+2, dx, 16, &cumap->cur, 0.0, 3.0, 0.0, 0.0, "");
- xco= (short)(rect->xmin+1.0f*dx);
- if(cumap->cm[0].curve)
- uiDefButI(block, ROW, redraw, "R", xco, yco+2, dx, 16, &cumap->cur, 0.0, 0.0, 0.0, 0.0, "");
- xco= (short)(rect->xmin+2.0f*dx);
- if(cumap->cm[1].curve)
- uiDefButI(block, ROW, redraw, "G", xco, yco+2, dx, 16, &cumap->cur, 0.0, 1.0, 0.0, 0.0, "");
- xco= (short)(rect->xmin+3.0f*dx);
- if(cumap->cm[2].curve)
- uiDefButI(block, ROW, redraw, "B", xco, yco+2, dx, 16, &cumap->cur, 0.0, 2.0, 0.0, 0.0, "");
- }
- /* else no channels ! */
- uiBlockEndAlign(block);
-
- xco= (short)(rect->xmin+4.5f*dx);
- uiBlockSetEmboss(block, UI_EMBOSSN);
- bt= uiDefIconBut(block, BUT, redraw, ICON_ZOOMIN, xco, yco, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom in");
- uiButSetFunc(bt, curvemap_buttons_zoom_in, cumap, NULL);
-
- xco= (short)(rect->xmin+5.25f*dx);
- bt= uiDefIconBut(block, BUT, redraw, ICON_ZOOMOUT, xco, yco, dx, 14, NULL, 0.0, 0.0, 0.0, 0.0, "Zoom out");
- uiButSetFunc(bt, curvemap_buttons_zoom_out, cumap, NULL);
-
- xco= (short)(rect->xmin+6.0f*dx);
- bt= uiDefIconBlockBut(block, curvemap_tools_func, cumap, event, ICON_MODIFIER, xco, yco, dx, 18, "Tools");
-
- xco= (short)(rect->xmin+7.0f*dx);
- if(cumap->flag & CUMA_DO_CLIP) icon= ICON_CLIPUV_HLT; else icon= ICON_CLIPUV_DEHLT;
- bt= uiDefIconBlockBut(block, curvemap_clipping_func, cumap, event, icon, xco, yco, dx, 18, "Clipping Options");
-
- xco= (short)(rect->xmin+8.0f*dx);
- bt= uiDefIconBut(block, BUT, event, ICON_X, xco, yco, dx, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Delete points");
- uiButSetFunc(bt, curvemap_buttons_delete, cumap, NULL);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- uiDefBut(block, BUT_CURVE, event, "",
- rect->xmin, rect->ymin, rect->xmax-rect->xmin, fy-rect->ymin,
- cumap, 0.0f, 1.0f, 0, 0, "");
-}
-
-#define B_BANDCOL 1
-
-static int vergcband(const void *a1, const void *a2)
-{
- const CBData *x1=a1, *x2=a2;
-
- if( x1->pos > x2->pos ) return 1;
- else if( x1->pos < x2->pos) return -1;
- return 0;
-}
-
-static void colorband_pos_cb(bContext *C, void *coba_v, void *unused_v)
-{
- ColorBand *coba= coba_v;
- int a;
-
- if(coba->tot<2) return;
-
- for(a=0; a<coba->tot; a++) coba->data[a].cur= a;
- qsort(coba->data, coba->tot, sizeof(CBData), vergcband);
- for(a=0; a<coba->tot; a++) {
- if(coba->data[a].cur==coba->cur) {
- // XXX if(coba->cur!=a) addqueue(curarea->win, REDRAW, 0); /* button cur */
- coba->cur= a;
- break;
- }
- }
-}
-
-static void colorband_add_cb(bContext *C, void *coba_v, void *unused_v)
-{
- ColorBand *coba= coba_v;
-
- if(coba->tot < MAXCOLORBAND-1) coba->tot++;
- coba->cur= coba->tot-1;
-
- colorband_pos_cb(C, coba, NULL);
- ED_undo_push(C, "Add colorband");
-}
-
-static void colorband_del_cb(bContext *C, void *coba_v, void *unused_v)
-{
- ColorBand *coba= coba_v;
- int a;
-
- if(coba->tot<2) return;
-
- for(a=coba->cur; a<coba->tot; a++) {
- coba->data[a]= coba->data[a+1];
- }
- if(coba->cur) coba->cur--;
- coba->tot--;
-
- ED_undo_push(C, "Delete colorband");
- // XXX BIF_preview_changed(ID_TE);
-}
-
-
-/* offset aligns from bottom, standard width 300, height 115 */
-static void colorband_buttons_large(uiBlock *block, ColorBand *coba, int xoffs, int yoffs, int redraw)
-{
- CBData *cbd;
- uiBut *bt;
-
- if(coba==NULL) return;
-
- bt= uiDefBut(block, BUT, redraw, "Add", 80+xoffs,95+yoffs,37,20, 0, 0, 0, 0, 0, "Adds a new color position to the colorband");
- uiButSetFunc(bt, colorband_add_cb, coba, NULL);
- uiDefButS(block, NUM, redraw, "Cur:", 117+xoffs,95+yoffs,81,20, &coba->cur, 0.0, (float)(coba->tot-1), 0, 0, "Displays the active color from the colorband");
- bt= uiDefBut(block, BUT, redraw, "Del", 199+xoffs,95+yoffs,37,20, 0, 0, 0, 0, 0, "Deletes the active position");
- uiButSetFunc(bt, colorband_del_cb, coba, NULL);
-
- uiDefButS(block, MENU, redraw, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
- 236+xoffs, 95+yoffs, 64, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Sets interpolation type");
-
- uiDefBut(block, BUT_COLORBAND, redraw, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, "");
-
- cbd= coba->data + coba->cur;
-
- uiBlockBeginAlign(block);
- bt= uiDefButF(block, NUM, redraw, "Pos", xoffs,40+yoffs,110,20, &cbd->pos, 0.0, 1.0, 10, 0, "Sets the position of the active color");
- uiButSetFunc(bt, colorband_pos_cb, coba, NULL);
- uiDefButF(block, COL, redraw, "", xoffs,20+yoffs,110,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "");
- uiDefButF(block, NUMSLI, redraw, "A ", xoffs,yoffs,110,20, &cbd->a, 0.0, 1.0, 10, 0, "Sets the alpha value for this position");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, redraw, "R ", 115+xoffs,40+yoffs,185,20, &cbd->r, 0.0, 1.0, B_BANDCOL, 0, "Sets the red value for the active color");
- uiDefButF(block, NUMSLI, redraw, "G ", 115+xoffs,20+yoffs,185,20, &cbd->g, 0.0, 1.0, B_BANDCOL, 0, "Sets the green value for the active color");
- uiDefButF(block, NUMSLI, redraw, "B ", 115+xoffs,yoffs,185,20, &cbd->b, 0.0, 1.0, B_BANDCOL, 0, "Sets the blue value for the active color");
- uiBlockEndAlign(block);
-}
-
-static void colorband_buttons_small(uiBlock *block, ColorBand *coba, rctf *butr, int event)
-{
- CBData *cbd;
- uiBut *bt;
- float unit= (butr->xmax-butr->xmin)/14.0f;
- float xs= butr->xmin;
-
- cbd= coba->data + coba->cur;
-
- uiBlockBeginAlign(block);
- uiDefButF(block, COL, event, "", xs,butr->ymin+20.0f,2.0f*unit,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "");
- uiDefButF(block, NUM, event, "A:", xs+2.0f*unit,butr->ymin+20.0f,4.0f*unit,20, &(cbd->a), 0.0f, 1.0f, 10, 2, "");
- bt= uiDefBut(block, BUT, event, "Add", xs+6.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Adds a new color position to the colorband");
- uiButSetFunc(bt, colorband_add_cb, coba, NULL);
- bt= uiDefBut(block, BUT, event, "Del", xs+8.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Deletes the active position");
- uiButSetFunc(bt, colorband_del_cb, coba, NULL);
-
- uiDefButS(block, MENU, event, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
- xs+10.0f*unit, butr->ymin+20.0f, unit*4, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Sets interpolation type");
-
- uiDefBut(block, BUT_COLORBAND, event, "", xs,butr->ymin,butr->xmax-butr->xmin,20.0f, coba, 0, 0, 0, 0, "");
- uiBlockEndAlign(block);
-
-}
-
-void colorband_buttons(uiBlock *block, ColorBand *coba, rctf *butr, int small)
-{
- if(small)
- colorband_buttons_small(block, coba, butr, 0);
- else
- colorband_buttons_large(block, coba, 0, 0, 0);
+ return (ptr.type)? RNA_struct_ui_icon(ptr.type): 0;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 735cfe742c6..ac8750f84e6 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -85,15 +85,6 @@ typedef struct uiWidgetTrias {
} uiWidgetTrias;
-typedef struct uiWidgetStateColors {
- char inner_anim[4];
- char inner_anim_sel[4];
- char inner_key[4];
- char inner_key_sel[4];
- char inner_driven[4];
- char inner_driven_sel[4];
-} uiWidgetStateColors;
-
typedef struct uiWidgetBase {
int totvert, halfwayvert;
@@ -116,6 +107,7 @@ typedef struct uiWidgetType {
/* pointer to theme color definition */
uiWidgetColors *wcol_theme;
+ uiWidgetStateColors *wcol_state;
/* converted colors for state */
uiWidgetColors wcol;
@@ -137,17 +129,21 @@ static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820},
{0.219306 , -0.238501}, {-0.393286 , -0.110949}, {-0.024699 , 0.013908},
{0.343805 , 0.147431}, {-0.272855 , 0.269918}, {0.095909 , 0.388710}};
-static float num_tria_vert[19][2]= {
+static float num_tria_vert[3][2]= {
+{-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353}};
+
+static int num_tria_face[1][3]= {
+{0, 1, 2}};
+
+static float scroll_circle_vert[16][2]= {
{0.382684, 0.923879}, {0.000001, 1.000000}, {-0.382683, 0.923880}, {-0.707107, 0.707107},
{-0.923879, 0.382684}, {-1.000000, 0.000000}, {-0.923880, -0.382684}, {-0.707107, -0.707107},
{-0.382683, -0.923880}, {0.000000, -1.000000}, {0.382684, -0.923880}, {0.707107, -0.707107},
-{0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107},
-{-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.729843, -0.008353}};
+{0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107}};
-static int num_tria_face[19][3]= {
-{13, 14, 18}, {17, 5, 6}, {12, 13, 18}, {17, 6, 7}, {15, 18, 14}, {16, 4, 5}, {16, 5, 17}, {18, 11, 12},
-{18, 17, 10}, {18, 10, 11}, {17, 9, 10}, {15, 0, 18}, {18, 0, 16}, {3, 4, 16}, {8, 9, 17}, {8, 17, 7},
-{2, 3, 16}, {1, 2, 16}, {16, 0, 1}};
+static int scroll_circle_face[14][3]= {
+{0, 1, 2}, {2, 0, 3}, {3, 0, 15}, {3, 15, 4}, {4, 15, 14}, {4, 14, 5}, {5, 14, 13}, {5, 13, 6},
+{6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9}};
static float menu_tria_vert[6][2]= {
{-0.41, 0.16}, {0.41, 0.16}, {0, 0.82},
@@ -293,13 +289,15 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
float maxyi= maxy - 1.0f;
float facxi= 1.0f/(maxxi-minxi); /* for uv */
float facyi= 1.0f/(maxyi-minyi);
- int a, tot= 0;
+ int a, tot= 0, minsize;
- if(2.0f*rad > rect->ymax-rect->ymin)
- rad= 0.5f*(rect->ymax-rect->ymin);
+ minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+
+ if(2.0f*rad > minsize)
+ rad= 0.5f*minsize;
- if(2.0f*(radi+1.0f) > rect->ymax-rect->ymin)
- radi= 0.5f*(rect->ymax-rect->ymin) - 1.0f;
+ if(2.0f*(radi+1.0f) > minsize)
+ radi= 0.5f*minsize - 1.0f;
/* mult */
for(a=0; a<9; a++) {
@@ -433,28 +431,74 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, flo
/* based on button rect, return scaled array of triangles */
static void widget_num_tria(uiWidgetTrias *tria, rcti *rect, float triasize, char where)
{
- float centx, centy, size;
- int a;
+ float centx, centy, sizex, sizey, minsize;
+ int a, i1=0, i2=1;
+
+ minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin);
/* center position and size */
- centx= (float)rect->xmin + 0.5f*(rect->ymax-rect->ymin);
- centy= (float)rect->ymin + 0.5f*(rect->ymax-rect->ymin);
- size= -0.5f*triasize*(rect->ymax-rect->ymin);
+ centx= (float)rect->xmin + 0.5f*minsize;
+ centy= (float)rect->ymin + 0.5f*minsize;
+ sizex= sizey= -0.5f*triasize*minsize;
if(where=='r') {
- centx= (float)rect->xmax - 0.5f*(rect->ymax-rect->ymin);
- size= -size;
+ centx= (float)rect->xmax - 0.5f*minsize;
+ sizex= -sizex;
+ }
+ else if(where=='t') {
+ centy= (float)rect->ymax - 0.5f*minsize;
+ sizey= -sizey;
+ i2=0; i1= 1;
+ }
+ else if(where=='b') {
+ sizex= -sizex;
+ i2=0; i1= 1;
}
- for(a=0; a<19; a++) {
- tria->vec[a][0]= size*num_tria_vert[a][0] + centx;
- tria->vec[a][1]= size*num_tria_vert[a][1] + centy;
+ for(a=0; a<3; a++) {
+ tria->vec[a][0]= sizex*num_tria_vert[a][i1] + centx;
+ tria->vec[a][1]= sizey*num_tria_vert[a][i2] + centy;
}
- tria->tot= 19;
+ tria->tot= 1;
tria->index= num_tria_face;
}
+static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize, char where)
+{
+ float centx, centy, sizex, sizey, minsize;
+ int a, i1=0, i2=1;
+
+ minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+
+ /* center position and size */
+ centx= (float)rect->xmin + 0.5f*minsize;
+ centy= (float)rect->ymin + 0.5f*minsize;
+ sizex= sizey= -0.5f*triasize*minsize;
+
+ if(where=='r') {
+ centx= (float)rect->xmax - 0.5f*minsize;
+ sizex= -sizex;
+ }
+ else if(where=='t') {
+ centy= (float)rect->ymax - 0.5f*minsize;
+ sizey= -sizey;
+ i2=0; i1= 1;
+ }
+ else if(where=='b') {
+ sizex= -sizex;
+ i2=0; i1= 1;
+ }
+
+ for(a=0; a<16; a++) {
+ tria->vec[a][0]= sizex*scroll_circle_vert[a][i1] + centx;
+ tria->vec[a][1]= sizey*scroll_circle_vert[a][i2] + centy;
+ }
+
+ tria->tot= 14;
+ tria->index= scroll_circle_face;
+}
+
static void widget_trias_draw(uiWidgetTrias *tria)
{
int a;
@@ -525,13 +569,13 @@ static void shadecolors4(char *coltop, char *coldown, char *color, short shadeto
coldown[0]= CLAMPIS(color[0]+shadedown, 0, 255);
coldown[1]= CLAMPIS(color[1]+shadedown, 0, 255);
coldown[2]= CLAMPIS(color[2]+shadedown, 0, 255);
- coldown[3]= color[3];
+ coldown[3]= color[3];
}
static void round_box_shade_col4(char *col1, char *col2, float fac)
{
int faci, facm;
- char col[4];
+ unsigned char col[4];
faci= floor(255.1f*fac);
facm= 255-faci;
@@ -570,7 +614,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
if(wcol->shaded==0) {
/* filled center, solid */
- glColor4ubv(wcol->inner);
+ glColor4ubv((unsigned char*)wcol->inner);
glBegin(GL_POLYGON);
for(a=0; a<wtb->totvert; a++)
glVertex2fv(wtb->inner_v[a]);
@@ -677,7 +721,7 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, int blend, rcti *rect)
height= ICON_HEIGHT;
/* calculate blend color */
- if ELEM3(but->type, TOG, ROW, TOGN) {
+ if ELEM4(but->type, TOG, ROW, TOGN, LISTROW) {
if(but->flag & UI_SELECT);
else if(but->flag & UI_ACTIVE);
else blend= -60;
@@ -729,7 +773,8 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, int blend, rcti *rect)
/* sets but->ofs to make sure text is correctly visible */
static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
{
- int okwidth= rect->xmax-rect->xmin;
+ int border= (but->flag & UI_BUT_ALIGN_RIGHT)? 8: 10;
+ int okwidth= rect->xmax-rect->xmin - border;
/* need to set this first */
uiStyleFontSet(fstyle);
@@ -744,7 +789,7 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
/* textbut exception */
if(but->editstr && but->pos != -1) {
- int pos= but->pos+strlen(but->str);
+ int pos= but->pos+1;
if(pos-1 < but->ofs) {
pos= but->ofs-pos+1;
@@ -775,49 +820,45 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
/* text button selection and cursor */
if(but->editstr && but->pos != -1) {
- short t, pos, ch;
+ short t=0, pos=0, ch;
short selsta_tmp, selend_tmp, selsta_draw, selwidth_draw;
if ((but->selend - but->selsta) > 0) {
- /* XXX weak, why is this? (ton) */
- t= but->str[0]?1:-2;
-
/* text button selection */
- selsta_tmp = but->selsta + strlen(but->str);
- selend_tmp = but->selend + strlen(but->str);
+ selsta_tmp = but->selsta;
+ selend_tmp = but->selend;
if(but->drawstr[0]!=0) {
ch= but->drawstr[selsta_tmp];
but->drawstr[selsta_tmp]= 0;
- selsta_draw = BLF_width(but->drawstr+but->ofs) + t;
+ selsta_draw = BLF_width(but->drawstr+but->ofs);
but->drawstr[selsta_tmp]= ch;
ch= but->drawstr[selend_tmp];
but->drawstr[selend_tmp]= 0;
- selwidth_draw = BLF_width(but->drawstr+but->ofs) + t;
+ selwidth_draw = BLF_width(but->drawstr+but->ofs);
but->drawstr[selend_tmp]= ch;
-
- glColor3ubv(wcol->item);
- glRects(rect->xmin+selsta_draw+1, rect->ymin+2, rect->xmin+selwidth_draw+1, rect->ymax-2);
+
+ glColor3ubv((unsigned char*)wcol->item);
+ glRects(rect->xmin+selsta_draw, rect->ymin+2, rect->xmin+selwidth_draw, rect->ymax-2);
}
} else {
/* text cursor */
- pos= but->pos+strlen(but->str);
+ pos= but->pos;
if(pos >= but->ofs) {
if(but->drawstr[0]!=0) {
ch= but->drawstr[pos];
but->drawstr[pos]= 0;
- t= BLF_width(but->drawstr+but->ofs) + 1;
+ t= BLF_width(but->drawstr+but->ofs);
but->drawstr[pos]= ch;
}
- else t= 1;
-
+
glColor3ub(255,0,0);
glRects(rect->xmin+t, rect->ymin+2, rect->xmin+t+2, rect->ymax-2);
}
@@ -828,12 +869,14 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
// else transopts= ui_translate_buttons();
/* cut string in 2 parts - only for menu entries */
- if(ELEM5(but->type, SLI, NUM, TEX, NUMSLI, NUMABS)==0) {
- cpoin= strchr(but->drawstr, '|');
- if(cpoin) *cpoin= 0;
+ if((but->block->flag & UI_BLOCK_LOOP)) {
+ if(ELEM5(but->type, SLI, NUM, TEX, NUMSLI, NUMABS)==0) {
+ cpoin= strchr(but->drawstr, '|');
+ if(cpoin) *cpoin= 0;
+ }
}
- glColor3ubv(wcol->text);
+ glColor3ubv((unsigned char*)wcol->text);
uiStyleFontDraw(fstyle, rect, but->drawstr+but->ofs);
/* part text right aligned */
@@ -852,7 +895,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if(but==NULL) return;
/* cutting off from left part */
- if ELEM3(but->type, NUM, NUMABS, TEX) {
+ if ELEM5(but->type, NUM, NUMABS, NUMSLI, SLI, TEX) {
ui_text_leftclip(fstyle, but, rect);
}
else but->ofs= 0;
@@ -884,7 +927,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if(but->editstr || (but->flag & UI_TEXT_LEFT))
rect->xmin += 5;
}
- else if(but->flag & UI_TEXT_LEFT)
+ else if((but->flag & UI_TEXT_LEFT))
rect->xmin += 5;
/* always draw text for textbutton cursor */
@@ -905,6 +948,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
char inner_key_sel[4];
char inner_driven[4];
char inner_driven_sel[4];
+ float blend;
*/
@@ -912,9 +956,10 @@ static struct uiWidgetStateColors wcol_state= {
{115, 190, 76, 255},
{90, 166, 51, 255},
{240, 235, 100, 255},
- {148, 204, 76, 255},
+ {215, 211, 75, 255},
{180, 0, 255, 255},
- {153, 0, 230, 255}
+ {153, 0, 230, 255},
+ 0.5f, 0.0f
};
/* uiWidgetColors
@@ -1028,9 +1073,9 @@ static struct uiWidgetColors wcol_menu_back= {
{0, 0, 0, 255},
{25, 25, 25, 230},
{45, 45, 45, 230},
- {255, 255, 255, 255},
+ {100, 100, 100, 255},
- {255, 255, 255, 255},
+ {160, 160, 160, 255},
{255, 255, 255, 255},
0,
@@ -1074,7 +1119,7 @@ static struct uiWidgetColors wcol_tool= {
{255, 255, 255, 255},
1,
- 25, -25
+ 15, -15
};
static struct uiWidgetColors wcol_box= {
@@ -1104,16 +1149,29 @@ static struct uiWidgetColors wcol_toggle= {
};
static struct uiWidgetColors wcol_scroll= {
- {25, 25, 25, 255},
- {180, 180, 180, 255},
- {153, 153, 153, 255},
- {90, 90, 90, 255},
+ {50, 50, 50, 180},
+ {80, 80, 80, 180},
+ {100, 100, 100, 180},
+ {128, 128, 128, 255},
{0, 0, 0, 255},
{255, 255, 255, 255},
1,
- 0, -20
+ 5, -5
+};
+
+static struct uiWidgetColors wcol_list_item= {
+ {0, 0, 0, 255},
+ {0, 0, 0, 0},
+ {86, 128, 194, 255},
+ {0, 0, 0, 255},
+
+ {0, 0, 0, 255},
+ {0, 0, 0, 255},
+
+ 0,
+ 0, 0
};
/* free wcol struct to play with */
@@ -1134,7 +1192,6 @@ static struct uiWidgetColors wcol_tmp= {
/* called for theme init (new theme) and versions */
void ui_widget_color_init(ThemeUI *tui)
{
-
tui->wcol_regular= wcol_regular;
tui->wcol_tool= wcol_tool;
tui->wcol_text= wcol_text;
@@ -1149,24 +1206,38 @@ void ui_widget_color_init(ThemeUI *tui)
tui->wcol_menu_item= wcol_menu_item;
tui->wcol_box= wcol_box;
tui->wcol_scroll= wcol_scroll;
+ tui->wcol_list_item= wcol_list_item;
+
+ tui->wcol_state= wcol_state;
}
/* ************ button callbacks, state ***************** */
+static void widget_state_blend(char *cp, char *cpstate, float fac)
+{
+ if(fac != 0.0f) {
+ cp[0]= (int)((1.0f-fac)*cp[0] + fac*cpstate[0]);
+ cp[1]= (int)((1.0f-fac)*cp[1] + fac*cpstate[1]);
+ cp[2]= (int)((1.0f-fac)*cp[2] + fac*cpstate[2]);
+ }
+}
+
/* copy colors from theme, and set changes in it based on state */
static void widget_state(uiWidgetType *wt, int state)
{
+ uiWidgetStateColors *wcol_state= wt->wcol_state;
+
wt->wcol= *(wt->wcol_theme);
if(state & UI_SELECT) {
+ QUATCOPY(wt->wcol.inner, wt->wcol.inner_sel)
+
if(state & UI_BUT_ANIMATED_KEY)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_key_sel)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_key_sel, wcol_state->blend);
else if(state & UI_BUT_ANIMATED)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_anim_sel)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_anim_sel, wcol_state->blend);
else if(state & UI_BUT_DRIVEN)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_driven_sel)
- else
- QUATCOPY(wt->wcol.inner, wt->wcol.inner_sel)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_driven_sel, wcol_state->blend);
VECCOPY(wt->wcol.text, wt->wcol.text_sel);
@@ -1177,11 +1248,11 @@ static void widget_state(uiWidgetType *wt, int state)
}
else {
if(state & UI_BUT_ANIMATED_KEY)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_key)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_key, wcol_state->blend);
else if(state & UI_BUT_ANIMATED)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_anim)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_anim, wcol_state->blend);
else if(state & UI_BUT_DRIVEN)
- QUATCOPY(wt->wcol.inner, wcol_state.inner_driven)
+ widget_state_blend(wt->wcol.inner, wcol_state->inner_driven, wcol_state->blend);
if(state & UI_ACTIVE) { /* mouse over? */
wt->wcol.inner[0]= wt->wcol.inner[0]>=240? 255 : wt->wcol.inner[0]+15;
@@ -1204,6 +1275,10 @@ static void widget_state_label(uiWidgetType *wt, int state)
}
+static void widget_state_nothing(uiWidgetType *wt, int state)
+{
+ wt->wcol= *(wt->wcol_theme);
+}
/* special case, button that calls pulldown */
static void widget_state_pulldown(uiWidgetType *wt, int state)
@@ -1415,7 +1490,7 @@ static void ui_draw_but_HSVCUBE(uiBut *but, rcti *rect)
{
int a;
float h,s,v;
- float dx, dy, sx1, sx2, sy, x, y;
+ float dx, dy, sx1, sx2, sy, x=0.0f, y=0.0f;
float col0[4][3]; // left half, rect bottom to top
float col1[4][3]; // right half, rect bottom to top
@@ -1562,6 +1637,7 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
{
uiWidgetBase wtb;
float rad= 0.5f*(rect->ymax - rect->ymin);
+ int textoffs;
widget_init(&wtb);
@@ -1570,15 +1646,21 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
/* decoration */
if(!(state & UI_TEXTINPUT)) {
- widget_num_tria(&wtb.tria1, rect, 0.6f, 0);
+ widget_num_tria(&wtb.tria1, rect, 0.6f, 'l');
widget_num_tria(&wtb.tria2, rect, 0.6f, 'r');
}
widgetbase_draw(&wtb, wcol);
/* text space */
- rect->xmin += (rect->ymax-rect->ymin);
- rect->xmax -= (rect->ymax-rect->ymin);
-
+ if(!(state & UI_TEXTINPUT)) {
+ rect->xmin += (rect->ymax-rect->ymin);
+ rect->xmax -= (rect->ymax-rect->ymin);
+ }
+ else {
+ textoffs= rad;
+ rect->xmin += textoffs;
+ rect->xmax -= textoffs;
+ }
}
@@ -1599,8 +1681,8 @@ static int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol)
vec[2][0]= vec[3][0]-dist;
vec[2][1]= vec[3][1];
- forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, 2);
- forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0]+1, resol, 2);
+ forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, sizeof(float)*2);
+ forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0]+1, resol, sizeof(float)*2);
return 1;
}
@@ -1632,44 +1714,82 @@ void ui_draw_link_bezier(rcti *rect)
}
}
-static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+/* function in use for buttons and for view2d sliders */
+void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int state)
{
uiWidgetBase wtb;
- rcti rect1;
- double value;
- char inner[3];
- float fac, size, rad;
+ float rad;
int horizontal;
+ widget_init(&wtb);
+
/* determine horizontal/vertical */
horizontal= (rect->xmax - rect->xmin > rect->ymax - rect->ymin);
-
+
if(horizontal)
rad= 0.5f*(rect->ymax - rect->ymin);
else
rad= 0.5f*(rect->xmax - rect->xmin);
-
- widget_init(&wtb);
+
wtb.shadedir= (horizontal)? 1: 0;
-
+
/* draw back part, colors swapped and shading inverted */
- VECCOPY(inner, wcol->inner);
- VECCOPY(wcol->inner, wcol->item);
if(horizontal)
SWAP(short, wcol->shadetop, wcol->shadedown);
- if(state & UI_SELECT)
- SWAP(short, wcol->shadetop, wcol->shadedown);
- round_box_edges(&wtb, roundboxalign, rect, rad); /* XXX vertical gradient is wrong */
+ round_box_edges(&wtb, 15, rect, rad);
widgetbase_draw(&wtb, wcol);
-
- VECCOPY(wcol->inner, inner);
- if(horizontal)
- SWAP(short, wcol->shadetop, wcol->shadedown);
- if(state & UI_SELECT)
- SWAP(short, wcol->shadetop, wcol->shadedown);
- /* front part */
+ /* slider */
+ if(slider->xmax-slider->xmin<2 || slider->ymax-slider->ymin<2);
+ else {
+
+ SWAP(short, wcol->shadetop, wcol->shadedown);
+
+ QUATCOPY(wcol->inner, wcol->item);
+
+ if(wcol->shadetop>wcol->shadedown)
+ wcol->shadetop+= 20; /* XXX violates themes... */
+ else wcol->shadedown+= 20;
+
+ if(state & UI_SCROLL_PRESSED) {
+ wcol->inner[0]= wcol->inner[0]>=250? 255 : wcol->inner[0]+5;
+ wcol->inner[1]= wcol->inner[1]>=250? 255 : wcol->inner[1]+5;
+ wcol->inner[2]= wcol->inner[2]>=250? 255 : wcol->inner[2]+5;
+ }
+
+ /* draw */
+ wtb.emboss= 0; /* only emboss once */
+
+ round_box_edges(&wtb, 15, slider, rad);
+
+ if(state & UI_SCROLL_ARROWS) {
+ if(wcol->item[0] > 48) wcol->item[0]-= 48;
+ if(wcol->item[1] > 48) wcol->item[1]-= 48;
+ if(wcol->item[2] > 48) wcol->item[2]-= 48;
+ wcol->item[3]= 255;
+
+ if(horizontal) {
+ widget_scroll_circle(&wtb.tria1, slider, 0.6f, 'l');
+ widget_scroll_circle(&wtb.tria2, slider, 0.6f, 'r');
+ }
+ else {
+ widget_scroll_circle(&wtb.tria1, slider, 0.6f, 'b');
+ widget_scroll_circle(&wtb.tria2, slider, 0.6f, 't');
+ }
+ }
+ widgetbase_draw(&wtb, wcol);
+ }
+}
+
+static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+{
+ rcti rect1;
+ double value;
+ float fac, size, min;
+ int horizontal;
+
+ /* calculate slider part */
value= ui_get_but_val(but);
size= (but->softmax + but->a1 - but->softmin);
@@ -1678,28 +1798,49 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
/* position */
rect1= *rect;
+ /* determine horizontal/vertical */
+ horizontal= (rect->xmax - rect->xmin > rect->ymax - rect->ymin);
+
if(horizontal) {
- fac= (rect->xmax - rect->xmin)/(size-1);
+ fac= (rect->xmax - rect->xmin)/(size);
rect1.xmin= rect1.xmin + ceil(fac*(value - but->softmin));
rect1.xmax= rect1.xmin + ceil(fac*(but->a1 - but->softmin));
+
+ /* ensure minimium size */
+ min= rect->ymax - rect->ymin;
+
+ if(rect1.xmax - rect1.xmin < min) {
+ rect1.xmax= rect1.xmin + min;
+
+ if(rect1.xmax > rect->xmax) {
+ rect1.xmax= rect->xmax;
+ rect1.xmin= MAX2(rect1.xmax - min, rect->xmin);
+ }
+ }
}
else {
- fac= (rect->ymax - rect->ymin)/(size-1);
+ fac= (rect->ymax - rect->ymin)/(size);
rect1.ymax= rect1.ymax - ceil(fac*(value - but->softmin));
rect1.ymin= rect1.ymax - ceil(fac*(but->a1 - but->softmin));
- }
- /* draw */
- wtb.emboss= 0; /* only emboss once */
+ /* ensure minimium size */
+ min= rect->xmax - rect->xmin;
- if(!horizontal)
- SWAP(short, wcol->shadetop, wcol->shadedown);
+ if(rect1.ymax - rect1.ymin < min) {
+ rect1.ymax= rect1.ymin + min;
- round_box_edges(&wtb, roundboxalign, &rect1, rad); /* XXX vertical gradient is wrong */
- widgetbase_draw(&wtb, wcol);
+ if(rect1.ymax > rect->ymax) {
+ rect1.ymax= rect->ymax;
+ rect1.ymin= MAX2(rect1.ymax - min, rect->ymin);
+ }
+ }
+ }
- if(!horizontal)
- SWAP(short, wcol->shadetop, wcol->shadedown);
+ if(state & UI_SELECT)
+ state= UI_SCROLL_PRESSED;
+ else
+ state= 0;
+ uiWidgetScrollDraw(wcol, rect, &rect1, state);
}
static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
@@ -1726,6 +1867,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
rcti rect1;
double value;
float offs, fac;
+ int textoffs;
char outline[3];
widget_init(&wtb);
@@ -1735,6 +1877,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
/* fully rounded */
offs= 0.5f*(rect->ymax - rect->ymin);
+ textoffs= offs;
round_box_edges(&wtb, roundboxalign, rect, offs);
wtb.outline= 0;
@@ -1776,9 +1919,8 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
widgetbase_draw(&wtb, wcol);
/* text space */
- rect->xmin += (rect->ymax-rect->ymin);
- rect->xmax -= (rect->ymax-rect->ymin);
-
+ rect->xmin += textoffs;
+ rect->xmax -= textoffs;
}
static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
@@ -1789,7 +1931,7 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
widget_init(&wtb);
/* half rounded */
- round_box_edges(&wtb, roundboxalign, rect, 4.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 5.0f);
ui_get_but_vectorf(but, col);
wcol->inner[0]= FTOCHAR(col[0]);
@@ -1808,7 +1950,7 @@ static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roun
widget_init(&wtb);
/* half rounded */
- round_box_edges(&wtb, roundboxalign, rect, 5.0f);
+ round_box_edges(&wtb, roundboxalign, rect, 4.0f);
widgetbase_draw(&wtb, wcol);
@@ -1838,12 +1980,12 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
{
if(state & UI_ACTIVE) {
uiWidgetBase wtb;
- float rad= 0.5f*(rect->ymax - rect->ymin);
+ float rad= 0.5f*(rect->ymax - rect->ymin); // 4.0f
widget_init(&wtb);
- /* fully rounded */
- round_box_edges(&wtb, roundboxalign, rect, rad);
+ /* half rounded */
+ round_box_edges(&wtb, 15, rect, rad);
widgetbase_draw(&wtb, wcol);
}
@@ -1862,6 +2004,18 @@ 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)
+{
+ uiWidgetBase wtb;
+
+ widget_init(&wtb);
+
+ /* rounded, but no outline */
+ wtb.outline= 0;
+ round_box_edges(&wtb, 15, rect, 4.0f);
+
+ widgetbase_draw(&wtb, wcol);
+}
static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
@@ -1925,11 +2079,11 @@ static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundbox
static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
uiWidgetBase wtb;
- float rad= 0.5f*(rect->ymax - rect->ymin);
+ float rad= 5.0f; //0.5f*(rect->ymax - rect->ymin);
widget_init(&wtb);
- /* fully rounded */
+ /* half rounded */
round_box_edges(&wtb, roundboxalign, rect, rad);
widgetbase_draw(&wtb, wcol);
@@ -1947,11 +2101,11 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
if(but->block->drawextra) {
/* note: drawextra can change rect +1 or -1, to match round errors of existing previews */
- but->block->drawextra(C, but->poin, rect);
+ but->block->drawextra(C, but->poin, but->block->drawextra_arg1, but->block->drawextra_arg2, rect);
/* make mask to draw over image */
UI_GetThemeColor3ubv(TH_BACK, col);
- glColor3ubv(col);
+ glColor3ubv((unsigned char*)col);
round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
widgetbase_outline(&wtb);
@@ -1989,6 +2143,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
/* defaults */
wt.wcol_theme= &btheme->tui.wcol_regular;
+ wt.wcol_state= &btheme->tui.wcol_state;
wt.state= widget_state;
wt.draw= widget_but;
wt.custom= NULL;
@@ -2010,7 +2165,6 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
case UI_WTYPE_OPTION:
wt.wcol_theme= &btheme->tui.wcol_option;
wt.draw= widget_optionbut;
- wt.state= widget_state_label;
break;
case UI_WTYPE_RADIO:
@@ -2101,8 +2255,14 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
case UI_WTYPE_SCROLL:
wt.wcol_theme= &btheme->tui.wcol_scroll;
+ wt.state= widget_state_nothing;
wt.custom= widget_scroll;
break;
+
+ case UI_WTYPE_LISTITEM:
+ wt.wcol_theme= &btheme->tui.wcol_list_item;
+ wt.draw= widget_list_itembut;
+ break;
}
return &wt;
@@ -2210,6 +2370,10 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
case ROW:
wt= widget_type(UI_WTYPE_RADIO);
break;
+
+ case LISTROW:
+ wt= widget_type(UI_WTYPE_LISTITEM);
+ break;
case TEX:
wt= widget_type(UI_WTYPE_NAME);
@@ -2257,6 +2421,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
break;
case ROUNDBOX:
+ case LISTBOX:
wt= widget_type(UI_WTYPE_BOX);
break;
@@ -2379,7 +2544,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid,
rect->xmax -= BLF_width(cpoin+1) + 10;
}
- glColor3ubv(wt->wcol.text);
+ glColor3ubv((unsigned char*)wt->wcol.text);
uiStyleFontDraw(fstyle, rect, name);
/* part text right aligned */
diff --git a/source/blender/editors/interface/keyval.c b/source/blender/editors/interface/keyval.c
deleted file mode 100644
index f2172ac8cf0..00000000000
--- a/source/blender/editors/interface/keyval.c
+++ /dev/null
@@ -1,540 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "stdio.h"
-#include "ctype.h"
-#include "string.h"
-
-#include "BKE_global.h"
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-
-#include "WM_types.h"
-
-char *key_event_to_string(unsigned short event)
-{
-
- switch(event) {
- case AKEY:
- return "A";
- break;
- case BKEY:
- return "B";
- break;
- case CKEY:
- return "C";
- break;
- case DKEY:
- return "D";
- break;
- case EKEY:
- return "E";
- break;
- case FKEY:
- return "F";
- break;
- case GKEY:
- return "G";
- break;
- case HKEY:
- return "H";
- break;
- case IKEY:
- return "I";
- break;
- case JKEY:
- return "J";
- break;
- case KKEY:
- return "K";
- break;
- case LKEY:
- return "L";
- break;
- case MKEY:
- return "M";
- break;
- case NKEY:
- return "N";
- break;
- case OKEY:
- return "O";
- break;
- case PKEY:
- return "P";
- break;
- case QKEY:
- return "Q";
- break;
- case RKEY:
- return "R";
- break;
- case SKEY:
- return "S";
- break;
- case TKEY:
- return "T";
- break;
- case UKEY:
- return "U";
- break;
- case VKEY:
- return "V";
- break;
- case WKEY:
- return "W";
- break;
- case XKEY:
- return "X";
- break;
- case YKEY:
- return "Y";
- break;
- case ZKEY:
- return "Z";
- break;
-
- case ZEROKEY:
- return "Zero";
- break;
- case ONEKEY:
- return "One";
- break;
- case TWOKEY:
- return "Two";
- break;
- case THREEKEY:
- return "Three";
- break;
- case FOURKEY:
- return "Four";
- break;
- case FIVEKEY:
- return "Five";
- break;
- case SIXKEY:
- return "Six";
- break;
- case SEVENKEY:
- return "Seven";
- break;
- case EIGHTKEY:
- return "Eight";
- break;
- case NINEKEY:
- return "Nine";
- break;
-
- case LEFTCTRLKEY:
- return "Leftctrl";
- break;
- case LEFTALTKEY:
- return "Leftalt";
- break;
- case RIGHTALTKEY:
- return "Rightalt";
- break;
- case RIGHTCTRLKEY:
- return "Rightctrl";
- break;
- case RIGHTSHIFTKEY:
- return "Rightshift";
- break;
- case LEFTSHIFTKEY:
- return "Leftshift";
- break;
-
- case ESCKEY:
- return "Esc";
- break;
- case TABKEY:
- return "Tab";
- break;
- case RETKEY:
- return "Ret";
- break;
- case SPACEKEY:
- return "Space";
- break;
- case LINEFEEDKEY:
- return "Linefeed";
- break;
- case BACKSPACEKEY:
- return "Backspace";
- break;
- case DELKEY:
- return "Del";
- break;
- case SEMICOLONKEY:
- return "Semicolon";
- break;
- case PERIODKEY:
- return "Period";
- break;
- case COMMAKEY:
- return "Comma";
- break;
- case QUOTEKEY:
- return "Quote";
- break;
- case ACCENTGRAVEKEY:
- return "Accentgrave";
- break;
- case MINUSKEY:
- return "Minus";
- break;
- case SLASHKEY:
- return "Slash";
- break;
- case BACKSLASHKEY:
- return "Backslash";
- break;
- case EQUALKEY:
- return "Equal";
- break;
- case LEFTBRACKETKEY:
- return "Leftbracket";
- break;
- case RIGHTBRACKETKEY:
- return "Rightbracket";
- break;
-
- case LEFTARROWKEY:
- return "Leftarrow";
- break;
- case DOWNARROWKEY:
- return "Downarrow";
- break;
- case RIGHTARROWKEY:
- return "Rightarrow";
- break;
- case UPARROWKEY:
- return "Uparrow";
- break;
-
- case PAD2:
- return "Pad2";
- break;
- case PAD4:
- return "Pad4";
- break;
- case PAD6:
- return "Pad6";
- break;
- case PAD8:
- return "Pad8";
- break;
- case PAD1:
- return "Pad1";
- break;
- case PAD3:
- return "Pad3";
- break;
- case PAD5:
- return "Pad5";
- break;
- case PAD7:
- return "Pad7";
- break;
- case PAD9:
- return "Pad9";
- break;
-
- case PADPERIOD:
- return "Padperiod";
- break;
- case PADSLASHKEY:
- return "Padslash";
- break;
- case PADASTERKEY:
- return "Padaster";
- break;
-
- case PAD0:
- return "Pad0";
- break;
- case PADMINUS:
- return "Padminus";
- break;
- case PADENTER:
- return "Padenter";
- break;
- case PADPLUSKEY:
- return "Padplus";
- break;
-
- case F1KEY:
- return "F1";
- break;
- case F2KEY:
- return "F2";
- break;
- case F3KEY:
- return "F3";
- break;
- case F4KEY:
- return "F4";
- break;
- case F5KEY:
- return "F5";
- break;
- case F6KEY:
- return "F6";
- break;
- case F7KEY:
- return "F7";
- break;
- case F8KEY:
- return "F8";
- break;
- case F9KEY:
- return "F9";
- break;
- case F10KEY:
- return "F10";
- break;
- case F11KEY:
- return "F11";
- break;
- case F12KEY:
- return "F12";
- break;
-
- case PAUSEKEY:
- return "Pause";
- break;
- case INSERTKEY:
- return "Insert";
- break;
- case HOMEKEY:
- return "Home";
- break;
- case PAGEUPKEY:
- return "Pageup";
- break;
- case PAGEDOWNKEY:
- return "Pagedown";
- break;
- case ENDKEY:
- return "End";
- break;
- }
-
- return "";
-}
-
-/*
- * Decodes key combination strings [qual1+[qual2+[...]]]keyname
- * The '+'s may be replaced by '-' or ' ' characters to support different
- * formats. No additional whitespace is allowed. The keyname may be an internal
- * name, like "RETKEY", or a more common name, like "Return". Decoding is case-
- * insensitive.
- *
- * Example strings: "Ctrl+L", "ALT-ESC", "Shift A"
- *
- * Returns 1 if successful.
- */
-int decode_key_string(char *str, unsigned short *key, unsigned short *qual)
-{
- int i, prev, len, invalid=0;
-
- len= strlen(str);
- *key= *qual= 0;
-
- /* Convert to upper case */
- for (i=0; i<len; i++) {
- str[i]= toupper(str[i]);
- }
-
- /* Handle modifiers */
- for (prev=i=0; i<len; i++) {
- if (str[i]==' ' || str[i]=='+' || str[i]=='-') {
-// XXX if (!strncmp(str+prev, "CTRL", i-prev)) *qual |= LR_CTRLKEY;
-// else if (!strncmp(str+prev, "ALT", i-prev)) *qual |= LR_ALTKEY;
-// else if (!strncmp(str+prev, "SHIFT", i-prev)) *qual |= LR_SHIFTKEY;
-// else if (!strncmp(str+prev, "COMMAND", i-prev)) *qual |= LR_COMMANDKEY;
- prev=i+1;
- }
- }
-
- /* Compare last part against key names */
- if ((len-prev==1) || ((len-prev==4) && !strncmp(str+prev, "KEY", 3))) {
-
- if (str[prev]>='A' && str[prev]<='Z') {
- *key= str[prev]-'A'+AKEY;
- } else if (str[prev]>='0' && str[prev]<='9') {
- *key= str[prev]-'0'+ZEROKEY;
- } else {
- invalid= 1;
- }
-
- } else if (!strncmp(str+prev, "ZEROKEY", len-prev) || !strncmp(str+prev, "ZERO", len-prev)) {
- *key= ZEROKEY;
- } else if (!strncmp(str+prev, "ONEKEY", len-prev) || !strncmp(str+prev, "ONE", len-prev)) {
- *key= ONEKEY;
- } else if (!strncmp(str+prev, "TWOKEY", len-prev) || !strncmp(str+prev, "TWO", len-prev)) {
- *key= TWOKEY;
- } else if (!strncmp(str+prev, "THREEKEY", len-prev) || !strncmp(str+prev, "THREE", len-prev)) {
- *key= THREEKEY;
- } else if (!strncmp(str+prev, "FOURKEY", len-prev) || !strncmp(str+prev, "FOUR", len-prev)) {
- *key= FOURKEY;
- } else if (!strncmp(str+prev, "FIVEKEY", len-prev) || !strncmp(str+prev, "FIVE", len-prev)) {
- *key= FIVEKEY;
- } else if (!strncmp(str+prev, "SIZEKEY", len-prev) || !strncmp(str+prev, "SIX", len-prev)) {
- *key= SIXKEY;
- } else if (!strncmp(str+prev, "SEVENKEY", len-prev) || !strncmp(str+prev, "SEVEN", len-prev)) {
- *key= SEVENKEY;
- } else if (!strncmp(str+prev, "EIGHTKEY", len-prev) || !strncmp(str+prev, "EIGHT", len-prev)) {
- *key= EIGHTKEY;
- } else if (!strncmp(str+prev, "NINEKEY", len-prev) || !strncmp(str+prev, "NINE", len-prev)) {
- *key= NINEKEY;
-
- } else if (!strncmp(str+prev, "ESCKEY", len-prev) || !strncmp(str+prev, "ESC", len-prev)) {
- *key= ESCKEY;
- } else if (!strncmp(str+prev, "TABKEY", len-prev) || !strncmp(str+prev, "TAB", len-prev)) {
- *key= TABKEY;
- } else if (!strncmp(str+prev, "RETKEY", len-prev) || !strncmp(str+prev, "RETURN", len-prev) || !strncmp(str+prev, "ENTER", len-prev)) {
- *key= RETKEY;
- } else if (!strncmp(str+prev, "SPACEKEY", len-prev) || !strncmp(str+prev, "SPACE", len-prev)) {
- *key= SPACEKEY;
- } else if (!strncmp(str+prev, "LINEFEEDKEY", len-prev) || !strncmp(str+prev, "LINEFEED", len-prev)) {
- *key= LINEFEEDKEY;
- } else if (!strncmp(str+prev, "BACKSPACEKEY", len-prev) || !strncmp(str+prev, "BACKSPACE", len-prev)) {
- *key= BACKSPACEKEY;
- } else if (!strncmp(str+prev, "DELKEY", len-prev) || !strncmp(str+prev, "DELETE", len-prev)) {
- *key= DELKEY;
-
- } else if (!strncmp(str+prev, "SEMICOLONKEY", len-prev) || !strncmp(str+prev, "SEMICOLON", len-prev)) {
- *key= SEMICOLONKEY;
- } else if (!strncmp(str+prev, "PERIODKEY", len-prev) || !strncmp(str+prev, "PERIOD", len-prev)) {
- *key= PERIODKEY;
- } else if (!strncmp(str+prev, "COMMAKEY", len-prev) || !strncmp(str+prev, "COMMA", len-prev)) {
- *key= COMMAKEY;
- } else if (!strncmp(str+prev, "QUOTEKEY", len-prev) || !strncmp(str+prev, "QUOTE", len-prev)) {
- *key= QUOTEKEY;
- } else if (!strncmp(str+prev, "ACCENTGRAVEKEY", len-prev) || !strncmp(str+prev, "ACCENTGRAVE", len-prev)) {
- *key= ACCENTGRAVEKEY;
- } else if (!strncmp(str+prev, "MINUSKEY", len-prev) || !strncmp(str+prev, "MINUS", len-prev)) {
- *key= MINUSKEY;
- } else if (!strncmp(str+prev, "SLASHKEY", len-prev) || !strncmp(str+prev, "SLASH", len-prev)) {
- *key= SLASHKEY;
- } else if (!strncmp(str+prev, "BACKSLASHKEY", len-prev) || !strncmp(str+prev, "BACKSLASH", len-prev)) {
- *key= BACKSLASHKEY;
- } else if (!strncmp(str+prev, "EQUALKEY", len-prev) || !strncmp(str+prev, "EQUAL", len-prev)) {
- *key= EQUALKEY;
- } else if (!strncmp(str+prev, "LEFTBRACKETKEY", len-prev) || !strncmp(str+prev, "LEFTBRACKET", len-prev)) {
- *key= LEFTBRACKETKEY;
- } else if (!strncmp(str+prev, "RIGHTBRACKETKEY", len-prev) || !strncmp(str+prev, "RIGHTBRACKET", len-prev)) {
- *key= RIGHTBRACKETKEY;
- } else if (!strncmp(str+prev, "DELKEY", len-prev) || !strncmp(str+prev, "DELETE", len-prev)) {
- *key= DELKEY;
-
- } else if (!strncmp(str+prev, "LEFTARROWKEY", len-prev) || !strncmp(str+prev, "LEFTARROW", len-prev)) {
- *key= LEFTARROWKEY;
- } else if (!strncmp(str+prev, "DOWNARROWKEY", len-prev) || !strncmp(str+prev, "DOWNARROW", len-prev)) {
- *key= DOWNARROWKEY;
- } else if (!strncmp(str+prev, "RIGHTARROWKEY", len-prev) || !strncmp(str+prev, "RIGHTARROW", len-prev)) {
- *key= RIGHTARROWKEY;
- } else if (!strncmp(str+prev, "UPARROWKEY", len-prev) || !strncmp(str+prev, "UPARROW", len-prev)) {
- *key= UPARROWKEY;
-
- } else if (!strncmp(str+prev, "PAD", 3)) {
-
- if (len-prev<=4) {
-
- if (str[prev]>='0' && str[prev]<='9') {
- *key= str[prev]-'0'+ZEROKEY;
- } else {
- invalid= 1;
- }
-
- } else if (!strncmp(str+prev+3, "PERIODKEY", len-prev-3) || !strncmp(str+prev+3, "PERIOD", len-prev-3)) {
- *key= PADPERIOD;
- } else if (!strncmp(str+prev+3, "SLASHKEY", len-prev-3) || !strncmp(str+prev+3, "SLASH", len-prev-3)) {
- *key= PADSLASHKEY;
- } else if (!strncmp(str+prev+3, "ASTERKEY", len-prev-3) || !strncmp(str+prev+3, "ASTERISK", len-prev-3)) {
- *key= PADASTERKEY;
- } else if (!strncmp(str+prev+3, "MINUSKEY", len-prev-3) || !strncmp(str+prev+3, "MINUS", len-prev-3)) {
- *key= PADMINUS;
- } else if (!strncmp(str+prev+3, "ENTERKEY", len-prev-3) || !strncmp(str+prev+3, "ENTER", len-prev-3)) {
- *key= PADENTER;
- } else if (!strncmp(str+prev+3, "PLUSKEY", len-prev-3) || !strncmp(str+prev+3, "PLUS", len-prev-3)) {
- *key= PADPLUSKEY;
- } else {
- invalid= 1;
- }
-
- } else if (!strncmp(str+prev, "F1KEY", len-prev) || !strncmp(str+prev, "F1", len-prev)) {
- *key= F1KEY;
- } else if (!strncmp(str+prev, "F2KEY", len-prev) || !strncmp(str+prev, "F2", len-prev)) {
- *key= F2KEY;
- } else if (!strncmp(str+prev, "F3KEY", len-prev) || !strncmp(str+prev, "F3", len-prev)) {
- *key= F3KEY;
- } else if (!strncmp(str+prev, "F4KEY", len-prev) || !strncmp(str+prev, "F4", len-prev)) {
- *key= F4KEY;
- } else if (!strncmp(str+prev, "F5KEY", len-prev) || !strncmp(str+prev, "F5", len-prev)) {
- *key= F5KEY;
- } else if (!strncmp(str+prev, "F6KEY", len-prev) || !strncmp(str+prev, "F6", len-prev)) {
- *key= F6KEY;
- } else if (!strncmp(str+prev, "F7KEY", len-prev) || !strncmp(str+prev, "F7", len-prev)) {
- *key= F7KEY;
- } else if (!strncmp(str+prev, "F8KEY", len-prev) || !strncmp(str+prev, "F8", len-prev)) {
- *key= F8KEY;
- } else if (!strncmp(str+prev, "F9KEY", len-prev) || !strncmp(str+prev, "F9", len-prev)) {
- *key= F9KEY;
- } else if (!strncmp(str+prev, "F10KEY", len-prev) || !strncmp(str+prev, "F10", len-prev)) {
- *key= F10KEY;
- } else if (!strncmp(str+prev, "F11KEY", len-prev) || !strncmp(str+prev, "F11", len-prev)) {
- *key= F11KEY;
- } else if (!strncmp(str+prev, "F12KEY", len-prev) || !strncmp(str+prev, "F12", len-prev)) {
- *key= F12KEY;
-
- } else if (!strncmp(str+prev, "PAUSEKEY", len-prev) || !strncmp(str+prev, "PAUSE", len-prev)) {
- *key= PAUSEKEY;
- } else if (!strncmp(str+prev, "INSERTKEY", len-prev) || !strncmp(str+prev, "INSERT", len-prev)) {
- *key= INSERTKEY;
- } else if (!strncmp(str+prev, "HOMEKEY", len-prev) || !strncmp(str+prev, "HOME", len-prev)) {
- *key= HOMEKEY;
- } else if (!strncmp(str+prev, "PAGEUPKEY", len-prev) || !strncmp(str+prev, "PAGEUP", len-prev)) {
- *key= PAGEUPKEY;
- } else if (!strncmp(str+prev, "PAGEDOWNKEY", len-prev) || !strncmp(str+prev, "PAGEDOWN", len-prev)) {
- *key= PAGEDOWNKEY;
- } else if (!strncmp(str+prev, "ENDKEY", len-prev) || !strncmp(str+prev, "END", len-prev)) {
- *key= ENDKEY;
-
- } else {
- invalid= 1;
- }
-
- if (!invalid && *key) {
- return 1;
- }
-
- return 0;
-}
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index f83dee23417..87026bd1a5d 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -150,6 +150,9 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
case SPACE_INFO:
ts= &btheme->tinfo;
break;
+ case SPACE_USERPREF:
+ ts= &btheme->tuserpref;
+ break;
case SPACE_TIME:
ts= &btheme->ttime;
break;
@@ -402,6 +405,7 @@ static void ui_theme_init_new(bTheme *btheme)
ui_theme_init_new_do(&btheme->ttime);
ui_theme_init_new_do(&btheme->tnode);
ui_theme_init_new_do(&btheme->tlogic);
+ ui_theme_init_new_do(&btheme->tuserpref);
}
@@ -441,6 +445,7 @@ void ui_theme_init_userdef(void)
SETCOL(btheme->tv3d.text_hi, 255, 255, 255, 255);
SETCOLF(btheme->tv3d.header, 0.45, 0.45, 0.45, 1.0);
+ SETCOLF(btheme->tv3d.button, 0.45, 0.45, 0.45, 1.0);
SETCOL(btheme->tv3d.panel, 165, 165, 165, 127);
SETCOL(btheme->tv3d.shade1, 160, 160, 160, 100);
@@ -505,14 +510,19 @@ void ui_theme_init_userdef(void)
btheme->tact= btheme->tipo;
SETCOL(btheme->tact.strip, 12, 10, 10, 128);
SETCOL(btheme->tact.strip_select, 255, 140, 0, 255);
-
+
+ /* space nla */
+ btheme->tnla= btheme->tact;
+
/* space file */
/* to have something initialized */
btheme->tfile= btheme->tv3d;
- SETCOL(btheme->tfile.back, 90, 90, 90, 255);
+ SETCOLF(btheme->tfile.back, 0.3, 0.3, 0.3, 1);
+ SETCOLF(btheme->tfile.panel, 0.3, 0.3, 0.3, 1);
+ SETCOLF(btheme->tfile.list, 0.4, 0.4, 0.4, 1);
SETCOL(btheme->tfile.text, 250, 250, 250, 255);
SETCOL(btheme->tfile.text_hi, 15, 15, 15, 255);
- SETCOL(btheme->tfile.panel, 180, 180, 180, 255); // bookmark/ui regions
+ SETCOL(btheme->tfile.panel, 145, 145, 145, 255); // bookmark/ui regions
SETCOL(btheme->tfile.active, 130, 130, 130, 255); // selected files
SETCOL(btheme->tfile.hilite, 255, 140, 25, 255); // selected files
@@ -522,20 +532,6 @@ void ui_theme_init_userdef(void)
SETCOL(btheme->tfile.scene, 250, 250, 250, 255);
-
-
- /* space nla */
- btheme->tnla= btheme->tv3d;
- SETCOL(btheme->tnla.back, 116, 116, 116, 255);
- SETCOL(btheme->tnla.text, 0, 0, 0, 255);
- SETCOL(btheme->tnla.text_hi, 255, 255, 255, 255);
- SETCOL(btheme->tnla.grid, 94, 94, 94, 255);
- SETCOL(btheme->tnla.shade1, 172, 172, 172, 255); // sliders
- SETCOL(btheme->tnla.shade2, 84, 44, 31, 100); // bar
- SETCOL(btheme->tnla.hilite, 17, 27, 60, 100); // bar
- SETCOL(btheme->tnla.strip_select, 0xff, 0xff, 0xaa, 255);
- SETCOL(btheme->tnla.strip, 0xe4, 0x9c, 0xc6, 255);
-
/* space seq */
btheme->tseq= btheme->tv3d;
SETCOL(btheme->tseq.back, 116, 116, 116, 255);
@@ -592,7 +588,11 @@ void ui_theme_init_userdef(void)
/* space info */
btheme->tinfo= btheme->tv3d;
- SETCOL(btheme->tinfo.back, 153, 153, 153, 255);
+ SETCOLF(btheme->tinfo.back, 0.45, 0.45, 0.45, 1.0);
+
+ /* space user preferences */
+ btheme->tuserpref= btheme->tv3d;
+ SETCOLF(btheme->tuserpref.back, 0.45, 0.45, 0.45, 1.0);
/* space sound */
btheme->tsnd= btheme->tv3d;
@@ -606,11 +606,11 @@ void ui_theme_init_userdef(void)
/* space node, re-uses syntax color storage */
btheme->tnode= btheme->tv3d;
SETCOL(btheme->tnode.edge_select, 255, 255, 255, 255);
- SETCOL(btheme->tnode.syntaxl, 150, 150, 150, 255); /* TH_NODE, backdrop */
- SETCOL(btheme->tnode.syntaxn, 129, 131, 144, 255); /* in/output */
- SETCOL(btheme->tnode.syntaxb, 127,127,127, 255); /* operator */
- SETCOL(btheme->tnode.syntaxv, 142, 138, 145, 255); /* generator */
- SETCOL(btheme->tnode.syntaxc, 120, 145, 120, 255); /* group */
+ SETCOL(btheme->tnode.syntaxl, 155, 155, 155, 160); /* TH_NODE, backdrop */
+ SETCOL(btheme->tnode.syntaxn, 100, 100, 100, 255); /* in/output */
+ SETCOL(btheme->tnode.syntaxb, 108, 105, 111, 255); /* operator */
+ SETCOL(btheme->tnode.syntaxv, 104, 106, 117, 255); /* generator */
+ SETCOL(btheme->tnode.syntaxc, 105, 117, 110, 255); /* group */
/* space logic */
btheme->tlogic= btheme->tv3d;
@@ -1086,19 +1086,6 @@ void init_userdef_do_versions(void)
SETCOL(btheme->ttime.cframe, 0x60, 0xc0, 0x40, 255);
}
}
- if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 11)) {
- bTheme *btheme;
- for (btheme= U.themes.first; btheme; btheme= btheme->next) {
- /* 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);
- SETCOL(btheme->tnla.cframe, 0x60, 0xc0, 0x40, 255);
- SETCOL(btheme->tseq.cframe, 0x60, 0xc0, 0x40, 255);
- SETCOL(btheme->tsnd.cframe, 0x60, 0xc0, 0x40, 255);
- SETCOL(btheme->ttime.cframe, 0x60, 0xc0, 0x40, 255);
- }
- }
if ((G.main->versionfile < 245) || (G.main->versionfile == 245 && G.main->subversionfile < 13)) {
bTheme *btheme;
for (btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -1221,6 +1208,13 @@ void init_userdef_do_versions(void)
/* Graph Editor - Group Channel color */
SETCOL(btheme->tipo.group, 79, 101, 73, 255);
SETCOL(btheme->tipo.group_active, 135, 177, 125, 255);
+
+ /* Nla Editor - (Object) Channel color */
+ SETCOL(btheme->tnla.ds_channel, 82, 96, 110, 255);
+ SETCOL(btheme->tnla.ds_subchannel, 124, 137, 150, 255);
+ /* NLA Editor - New Strip colors */
+ SETCOL(btheme->tnla.strip, 12, 10, 10, 128);
+ SETCOL(btheme->tnla.strip_select, 255, 140, 0, 255);
}
/* adjust grease-pencil distances */
@@ -1248,8 +1242,23 @@ void init_userdef_do_versions(void)
btheme->tlogic= btheme->tv3d;
SETCOL(btheme->tlogic.back, 100, 100, 100, 255);
}
+
+ SETCOLF(btheme->tinfo.back, 0.45, 0.45, 0.45, 1.0);
+ SETCOLF(btheme->tuserpref.back, 0.45, 0.45, 0.45, 1.0);
}
}
+
+ if (G.main->versionfile < 250 || (G.main->versionfile == 250 && G.main->subversionfile < 3)) {
+ /* new audio system */
+ if(U.audiochannels == 0)
+ U.audiochannels = 2;
+ if(U.audiodevice == 0)
+ U.audiodevice = 2;
+ if(U.audioformat == 0)
+ U.audioformat = 0x24;
+ if(U.audiorate == 0)
+ U.audiorate = 44100;
+ }
/* GL Texture Garbage Collection (variable abused above!) */
if (U.textimeout == 0) {
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index 4621be6eda0..be58a78ca85 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -34,6 +34,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
#include "DNA_view2d_types.h"
#include "BLI_blenlib.h"
@@ -153,12 +154,15 @@ static void view2d_masks(View2D *v2d)
*/
void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
{
- short tot_changed= 0;
-
+ short tot_changed= 0, init= 0;
+ uiStyle *style= U.uistyles.first;
+
/* initialise data if there is a need for such */
if ((v2d->flag & V2D_IS_INITIALISED) == 0) {
/* set initialised flag so that View2D doesn't get reinitialised next time again */
v2d->flag |= V2D_IS_INITIALISED;
+
+ init= 1;
/* see eView2D_CommonViewTypes in UI_view2d.h for available view presets */
switch (type) {
@@ -168,7 +172,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
case V2D_COMMONVIEW_STANDARD:
{
/* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
- v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM);
+ v2d->keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM);
v2d->minzoom= 0.01f;
v2d->maxzoom= 1000.0f;
@@ -195,7 +199,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
case V2D_COMMONVIEW_LIST:
{
/* zoom + aspect ratio are locked */
- v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
v2d->minzoom= v2d->maxzoom= 1.0f;
/* tot rect has strictly regulated placement, and must only occur in +/- quadrant */
@@ -207,11 +211,28 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
}
break;
+ /* 'stack view' - practically the same as list/channel view, except is located in the pos y half instead.
+ * zoom, aspect ratio, and alignment restrictions are set here */
+ case V2D_COMMONVIEW_STACK:
+ {
+ /* zoom + aspect ratio are locked */
+ v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
+ v2d->minzoom= v2d->maxzoom= 1.0f;
+
+ /* tot rect has strictly regulated placement, and must only occur in +/+ quadrant */
+ v2d->align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y);
+ v2d->keeptot = V2D_KEEPTOT_STRICT;
+ tot_changed= 1;
+
+ /* scroller settings are currently not set here... that is left for regions... */
+ }
+ break;
+
/* 'header' regions - zoom, aspect ratio, alignment, and panning restrictions are set here */
case V2D_COMMONVIEW_HEADER:
{
/* zoom + aspect ratio are locked */
- v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
v2d->minzoom= v2d->maxzoom= 1.0f;
v2d->min[0]= v2d->max[0]= (float)(winx-1);
v2d->min[1]= v2d->max[1]= (float)(winy-1);
@@ -235,24 +256,35 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* panels view, with horizontal/vertical align */
case V2D_COMMONVIEW_PANELS_UI:
{
+ float panelzoom= (style) ? style->panelzoom : 1.0f;
+
/* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
- v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM);
+ v2d->keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM|V2D_KEEPZOOM);
v2d->minzoom= 0.5f;
v2d->maxzoom= 2.0f;
+ //tot_changed= 1;
v2d->align= (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
v2d->keeptot= V2D_KEEPTOT_BOUNDS;
+ v2d->scroll |= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+
v2d->tot.xmin= 0.0f;
v2d->tot.xmax= winx;
-
+
v2d->tot.ymax= 0.0f;
v2d->tot.ymin= -winy;
-
- v2d->cur= v2d->tot;
+
+ v2d->cur.xmin= 0.0f;
+ /* bad workaround for keeping zoom level with scrollers */
+ v2d->cur.xmax= (winx - V2D_SCROLL_WIDTH)*panelzoom;
+
+ v2d->cur.ymax= 0.0f;
+ /* bad workaround for keeping zoom level with scrollers */
+ v2d->cur.ymin= (-winy + V2D_SCROLL_HEIGHT)*panelzoom;
}
break;
-
+
/* other view types are completely defined using their own settings already */
default:
/* we don't do anything here, as settings should be fine, but just make sure that rect */
@@ -269,17 +301,16 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* set 'tot' rect before setting cur? */
if (tot_changed)
- UI_view2d_totRect_set(v2d, winx, winy);
+ UI_view2d_totRect_set_resize(v2d, winx, winy, !init);
else
- UI_view2d_curRect_validate(v2d);
-
+ UI_view2d_curRect_validate_resize(v2d, !init);
}
/* Ensure View2D rects remain in a viable configuration
* - cur is not allowed to be: larger than max, smaller than min, or outside of tot
*/
// XXX pre2.5 -> this used to be called test_view2d()
-void UI_view2d_curRect_validate(View2D *v2d)
+void UI_view2d_curRect_validate_resize(View2D *v2d, int resize)
{
float totwidth, totheight, curwidth, curheight, width, height;
float winx, winy;
@@ -316,10 +347,36 @@ void UI_view2d_curRect_validate(View2D *v2d)
if (v2d->keepzoom & V2D_LOCKZOOM_Y)
height= winy;
- /* keepzoom (V2D_KEEPZOOM set), indicates that zoom level on each axis must not exceed limits
+ /* values used to divide, so make it safe */
+ if(width<1) width= 1;
+ if(height<1) height= 1;
+ if(winx<1) winx= 1;
+ if(winy<1) winy= 1;
+
+ /* V2D_LIMITZOOM indicates that zoom level should be preserved when the window size changes */
+ if (resize && (v2d->keepzoom & V2D_KEEPZOOM)) {
+ float zoom, oldzoom;
+
+ if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) {
+ zoom= winx / width;
+ oldzoom= v2d->oldwinx / curwidth;
+
+ if(oldzoom != zoom)
+ width *= zoom/oldzoom;
+ }
+
+ if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) {
+ zoom= winy / height;
+ oldzoom= v2d->oldwiny / curheight;
+
+ if(oldzoom != zoom)
+ height *= zoom/oldzoom;
+ }
+ }
+ /* keepzoom (V2D_LIMITZOOM set), indicates that zoom level on each axis must not exceed limits
* NOTE: in general, it is not expected that the lock-zoom will be used in conjunction with this
*/
- if (v2d->keepzoom & V2D_KEEPZOOM) {
+ else if (v2d->keepzoom & V2D_LIMITZOOM) {
float zoom, fac;
/* check if excessive zoom on x-axis */
@@ -425,11 +482,17 @@ void UI_view2d_curRect_validate(View2D *v2d)
if ((width != curwidth) || (height != curheight)) {
float temp, dh;
- /* resize from centerpoint */
+ /* resize from centerpoint, unless otherwise specified */
if (width != curwidth) {
if (v2d->keepofs & V2D_LOCKOFS_X) {
cur->xmax += width - (cur->xmax - cur->xmin);
}
+ else if (v2d->keepofs & V2D_KEEPOFS_X) {
+ if(v2d->align & V2D_ALIGN_NO_POS_X)
+ cur->xmin -= width - (cur->xmax - cur->xmin);
+ else
+ cur->xmax += width - (cur->xmax - cur->xmin);
+ }
else {
temp= (cur->xmax + cur->xmin) * 0.5f;
dh= width * 0.5f;
@@ -442,6 +505,12 @@ void UI_view2d_curRect_validate(View2D *v2d)
if (v2d->keepofs & V2D_LOCKOFS_Y) {
cur->ymax += height - (cur->ymax - cur->ymin);
}
+ else if (v2d->keepofs & V2D_KEEPOFS_Y) {
+ if(v2d->align & V2D_ALIGN_NO_POS_Y)
+ cur->ymin -= height - (cur->ymax - cur->ymin);
+ else
+ cur->ymax += height - (cur->ymax - cur->ymin);
+ }
else {
temp= (cur->ymax + cur->ymin) * 0.5f;
dh= height * 0.5f;
@@ -461,7 +530,7 @@ void UI_view2d_curRect_validate(View2D *v2d)
curheight= cur->ymax - cur->ymin;
/* width */
- if ( (curwidth > totwidth) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_X)) ) {
+ if ( (curwidth > totwidth) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_X|V2D_LIMITZOOM)) ) {
/* if zoom doesn't have to be maintained, just clamp edges */
if (cur->xmin < tot->xmin) cur->xmin= tot->xmin;
if (cur->xmax > tot->xmax) cur->xmax= tot->xmax;
@@ -507,13 +576,13 @@ void UI_view2d_curRect_validate(View2D *v2d)
* We favour moving the 'minimum' across, as that's origin for most things
* (XXX - in the past, max was favoured... if there are bugs, swap!)
*/
- if ((cur->ymin < tot->ymin) && (cur->ymax > tot->ymax)) {
+ if ((cur->xmin < tot->xmin) && (cur->xmax > tot->xmax)) {
/* outside boundaries on both sides, so take middle-point of tot, and place in balanced way */
- temp= (tot->ymax + tot->ymin) * 0.5f;
+ temp= (tot->xmax + tot->xmin) * 0.5f;
diff= curheight * 0.5f;
- cur->ymin= temp - diff;
- cur->ymax= temp + diff;
+ cur->xmin= temp - diff;
+ cur->xmax= temp + diff;
}
else if (cur->xmin < tot->xmin) {
/* move cur across so that it sits at minimum of tot */
@@ -544,7 +613,7 @@ void UI_view2d_curRect_validate(View2D *v2d)
}
/* height */
- if ( (curheight > totheight) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_Y)) ) {
+ if ( (curheight > totheight) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_Y|V2D_LIMITZOOM)) ) {
/* if zoom doesn't have to be maintained, just clamp edges */
if (cur->ymin < tot->ymin) cur->ymin= tot->ymin;
if (cur->ymax > tot->ymax) cur->ymax= tot->ymax;
@@ -629,6 +698,11 @@ void UI_view2d_curRect_validate(View2D *v2d)
view2d_masks(v2d);
}
+void UI_view2d_curRect_validate(View2D *v2d)
+{
+ return UI_view2d_curRect_validate_resize(v2d, 0);
+}
+
/* ------------------ */
/* Called by menus to activate it, or by view2d operators to make sure 'related' views stay in synchrony */
@@ -748,7 +822,7 @@ void UI_view2d_curRect_reset (View2D *v2d)
/* ------------------ */
/* Change the size of the maximum viewable area (i.e. 'tot' rect) */
-void UI_view2d_totRect_set (View2D *v2d, int width, int height)
+void UI_view2d_totRect_set_resize (View2D *v2d, int width, int height, int resize)
{
int scroll= view2d_scroll_mapped(v2d->scroll);
@@ -806,7 +880,57 @@ void UI_view2d_totRect_set (View2D *v2d, int width, int height)
}
/* make sure that 'cur' rect is in a valid state as a result of these changes */
- UI_view2d_curRect_validate(v2d);
+ UI_view2d_curRect_validate_resize(v2d, resize);
+}
+
+void UI_view2d_totRect_set(View2D *v2d, int width, int height)
+{
+ UI_view2d_totRect_set_resize(v2d, width, height, 0);
+}
+
+int UI_view2d_tab_set(View2D *v2d, int tab)
+{
+ float default_offset[2]= {0.0f, 0.0f};
+ float *offset, *new_offset;
+ int changed= 0;
+
+ /* if tab changed, change offset */
+ if(tab != v2d->tab_cur && v2d->tab_offset) {
+ if(tab < v2d->tab_num)
+ offset= &v2d->tab_offset[tab*2];
+ else
+ offset= default_offset;
+
+ v2d->cur.xmax += offset[0] - v2d->cur.xmin;
+ v2d->cur.xmin= offset[0];
+
+ v2d->cur.ymin += offset[1] - v2d->cur.ymax;
+ v2d->cur.ymax= offset[1];
+
+ /* validation should happen in subsequent totRect_set */
+
+ changed= 1;
+ }
+
+ /* resize array if needed */
+ if(tab >= v2d->tab_num) {
+ new_offset= MEM_callocN(sizeof(float)*(tab+1)*2, "view2d tab offset");
+
+ if(v2d->tab_offset) {
+ memcpy(new_offset, v2d->tab_offset, sizeof(float)*v2d->tab_num*2);
+ MEM_freeN(v2d->tab_offset);
+ }
+
+ v2d->tab_offset= new_offset;
+ v2d->tab_num= tab+1;
+ }
+
+ /* set current tab and offset */
+ v2d->tab_cur= tab;
+ v2d->tab_offset[2*tab+0]= v2d->cur.xmin;
+ v2d->tab_offset[2*tab+1]= v2d->cur.ymax;
+
+ return changed;
}
/* *********************************************************************** */
@@ -895,7 +1019,14 @@ void UI_view2d_view_orthoSpecial(const bContext *C, View2D *v2d, short xaxis)
/* Restore view matrices after drawing */
void UI_view2d_view_restore(const bContext *C)
{
- ED_region_pixelspace(CTX_wm_region(C));
+ ARegion *ar= CTX_wm_region(C);
+ int width= ar->winrct.xmax-ar->winrct.xmin+1;
+ int height= ar->winrct.ymax-ar->winrct.ymin+1;
+
+ wmOrtho2(0.0f, (float)width, 0.0f, (float)height);
+ wmLoadIdentity();
+
+ // ED_region_pixelspace(CTX_wm_region(C));
}
/* *********************************************************************** */
@@ -1192,12 +1323,15 @@ void UI_view2d_grid_free(View2DGrid *grid)
* WARNING: the start of this struct must not change, as view2d_ops.c uses this too.
* For now, we don't need to have a separate (internal) header for structs like this...
*/
-struct View2DScrollers {
+struct View2DScrollers {
/* focus bubbles */
int vert_min, vert_max; /* vertical scrollbar */
int hor_min, hor_max; /* horizontal scrollbar */
- /* scales */
+ rcti hor, vert; /* exact size of slider backdrop */
+ int horfull, vertfull; /* set if sliders are full, we don't draw them */
+
+ /* scales */
View2DGrid *grid; /* grid for coordinate drawing */
short xunits, xclamp; /* units and clamping options for x-axis */
short yunits, yclamp; /* units and clamping options for y-axis */
@@ -1208,14 +1342,33 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
{
View2DScrollers *scrollers;
rcti vert, hor;
- float fac, totsize, scrollsize;
+ float fac1, fac2, totsize, scrollsize;
int scroll= view2d_scroll_mapped(v2d->scroll);
+ /* scrollers is allocated here... */
+ scrollers= MEM_callocN(sizeof(View2DScrollers), "View2DScrollers");
+
vert= v2d->vert;
hor= v2d->hor;
- /* scrollers is allocated here... */
- scrollers= MEM_callocN(sizeof(View2DScrollers), "View2DScrollers");
+ /* slider rects need to be smaller than region */
+ hor.xmin+=4;
+ hor.xmax-=4;
+ if (scroll & V2D_SCROLL_BOTTOM)
+ hor.ymin+=4;
+ else
+ hor.ymax-=4;
+
+ if (scroll & V2D_SCROLL_LEFT)
+ vert.xmin+=4;
+ else
+ vert.xmax-=4;
+ vert.ymin+=4;
+ vert.ymax-=4;
+
+ /* store in scrollers, used for drawing */
+ scrollers->vert= vert;
+ scrollers->hor= hor;
/* scroller 'buttons':
* - These should always remain within the visible region of the scrollbar
@@ -1228,14 +1381,30 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
totsize= v2d->tot.xmax - v2d->tot.xmin;
scrollsize= (float)(hor.xmax - hor.xmin);
- fac= (v2d->cur.xmin - v2d->tot.xmin) / totsize;
- scrollers->hor_min= (int)(hor.xmin + (fac * scrollsize));
+ fac1= (v2d->cur.xmin - v2d->tot.xmin) / totsize;
+ if(fac1<=0.0f)
+ scrollers->hor_min= hor.xmin;
+ else
+ scrollers->hor_min= (int)(hor.xmin + (fac1 * scrollsize));
- fac= (v2d->cur.xmax - v2d->tot.xmin) / totsize;
- scrollers->hor_max= (int)(hor.xmin + (fac * scrollsize));
+ fac2= (v2d->cur.xmax - v2d->tot.xmin) / totsize;
+ if(fac2>=1.0f)
+ scrollers->hor_max= hor.xmax;
+ else
+ scrollers->hor_max= (int)(hor.xmin + (fac2 * scrollsize));
+ /* prevent inverted sliders */
if (scrollers->hor_min > scrollers->hor_max)
scrollers->hor_min= scrollers->hor_max;
+ /* prevent sliders from being too small, and disappearing */
+ if ((scrollers->hor_max - scrollers->hor_min) < V2D_SCROLLER_HANDLE_SIZE)
+ scrollers->hor_max+= V2D_SCROLLER_HANDLE_SIZE;
+
+ /* check whether sliders can disappear */
+ if(v2d->keeptot) {
+ if(fac1 <= 0.0f && fac2 >= 1.0f)
+ scrollers->horfull= 1;
+ }
}
/* vertical scrollers */
@@ -1244,14 +1413,30 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
totsize= v2d->tot.ymax - v2d->tot.ymin;
scrollsize= (float)(vert.ymax - vert.ymin);
- fac= (v2d->cur.ymin- v2d->tot.ymin) / totsize;
- scrollers->vert_min= (int)(vert.ymin + (fac * scrollsize));
+ fac1= (v2d->cur.ymin- v2d->tot.ymin) / totsize;
+ if(fac1<=0.0f)
+ scrollers->vert_min= vert.ymin;
+ else
+ scrollers->vert_min= (int)(vert.ymin + (fac1 * scrollsize));
- fac= (v2d->cur.ymax - v2d->tot.ymin) / totsize;
- scrollers->vert_max= (int)(vert.ymin + (fac * scrollsize));
+ fac2= (v2d->cur.ymax - v2d->tot.ymin) / totsize;
+ if(fac2>=1.0f)
+ scrollers->vert_max= vert.ymax;
+ else
+ scrollers->vert_max= (int)(vert.ymin + (fac2 * scrollsize));
+ /* prevent inverted sliders */
if (scrollers->vert_min > scrollers->vert_max)
scrollers->vert_min= scrollers->vert_max;
+ /* prevent sliders from being too small, and disappearing */
+ if ((scrollers->vert_max - scrollers->vert_min) < V2D_SCROLLER_HANDLE_SIZE)
+ scrollers->vert_max+= V2D_SCROLLER_HANDLE_SIZE;
+
+ /* check whether sliders can disappear */
+ if(v2d->keeptot) {
+ if(fac1 <= 0.0f && fac2 >= 1.0f)
+ scrollers->vertfull= 1;
+ }
}
/* grid markings on scrollbars */
@@ -1281,7 +1466,7 @@ static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, f
* rotation values (hence 'degrees') are divided by 10 to
* be able to show the curves at the same time
*/
- if ELEM(unit, V2D_UNIT_DEGREES, V2D_UNIT_TIME) {
+ if (ELEM(unit, V2D_UNIT_DEGREES, V2D_UNIT_TIME)) {
power += 1;
val *= 10;
}
@@ -1375,97 +1560,41 @@ static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, f
BLF_draw_default(x, y, 0.0f, str);
}
-/* local defines for scrollers drawing */
- /* radius of scroller 'button' caps */
-#define V2D_SCROLLCAP_RAD 5
- /* shading factor for scroller 'bar' */
-#define V2D_SCROLLBAR_SHADE 0.1f
- /* shading factor for scroller 'button' caps */
-#define V2D_SCROLLCAP_SHADE 0.2f
-
/* Draw scrollbars in the given 2d-region */
void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *vs)
{
Scene *scene= CTX_data_scene(C);
- const short darker= -50, dark= -10, light= 20, lighter= 50;
- rcti vert, hor, corner;
+ rcti vert, hor;
int scroll= view2d_scroll_mapped(v2d->scroll);
/* make copies of rects for less typing */
- vert= v2d->vert;
- hor= v2d->hor;
+ vert= vs->vert;
+ hor= vs->hor;
/* horizontal scrollbar */
if (scroll & V2D_SCROLL_HORIZONTAL) {
- /* scroller backdrop */
- UI_ThemeColorShade(TH_SHADE1, light);
- glRecti(hor.xmin, hor.ymin, hor.xmax, hor.ymax);
-
- /* scroller 'button'
- * - if view is zoomable in x, draw handles too
- * - handles are drawn darker
- * - no slider when view is > total for non-zoomable views
- * (otherwise, zoomable ones tend to flicker)
- */
- if ( (v2d->scroll & V2D_SCROLL_SCALE_HORIZONTAL) ||
- ((v2d->tot.xmax - v2d->tot.xmin) > (v2d->cur.xmax - v2d->cur.xmin)) )
- {
- if (v2d->keepzoom & V2D_LOCKZOOM_X) {
- /* draw base bar as rounded shape */
- UI_ThemeColorShade(TH_SHADE1, dark);
- uiSetRoundBox(15);
-
- /* check that box is large enough for round drawing */
- if ((vs->hor_max - vs->hor_min) < (V2D_SCROLLCAP_RAD * 2)) {
- /* Rounded box still gets drawn at the minimum size limit
- * This doesn't represent extreme scaling well, but looks nicer...
- */
- float mid= 0.5f * (vs->hor_max + vs->hor_min);
-
- gl_round_box_shade(GL_POLYGON,
- mid-V2D_SCROLLCAP_RAD, (float)hor.ymin+2,
- mid+V2D_SCROLLCAP_RAD, (float)hor.ymax-2,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
- }
- else {
- /* draw rounded box as per normal */
- gl_round_box_shade(GL_POLYGON,
- (float)vs->hor_min, (float)hor.ymin+2,
- (float)vs->hor_max, (float)hor.ymax-2,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
- }
- }
- else {
- /* base bar drawn as shaded rect */
- UI_ThemeColorShade(TH_SHADE1, dark);
- uiSetRoundBox(0);
- gl_round_box_shade(GL_POLYGON,
- (float)vs->hor_min, (float)hor.ymin+2,
- (float)vs->hor_max, (float)hor.ymax-2,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
-
- /* 'minimum' handle */
- uiSetRoundBox(9);
- UI_ThemeColorShade(TH_SHADE1, darker);
-
- gl_round_box_shade(GL_POLYGON,
- (float)vs->hor_min-V2D_SCROLLER_HANDLE_SIZE, (float)hor.ymin+2,
- (float)vs->hor_min+V2D_SCROLLER_HANDLE_SIZE, (float)hor.ymax-2,
- V2D_SCROLLCAP_RAD, V2D_SCROLLCAP_SHADE, -V2D_SCROLLCAP_SHADE);
-
- /* maximum handle */
- uiSetRoundBox(6);
- UI_ThemeColorShade(TH_SHADE1, darker);
+ /* only draw scrollbar when it doesn't fill the entire space */
+ if(vs->horfull==0) {
+ bTheme *btheme= U.themes.first;
+ uiWidgetColors wcol= btheme->tui.wcol_scroll;
+ rcti slider;
+ int state;
+
+ slider.xmin= vs->hor_min;
+ slider.xmax= vs->hor_max;
+ slider.ymin= hor.ymin;
+ slider.ymax= hor.ymax;
+
+ state= (v2d->scroll_ui & V2D_SCROLL_H_ACTIVE)?UI_SCROLL_PRESSED:0;
+
+ // TODO: disable this for button regions...
+ if (!(v2d->keepzoom & V2D_LOCKZOOM_X))
+ state |= UI_SCROLL_ARROWS;
- gl_round_box_shade(GL_POLYGON,
- (float)vs->hor_max-V2D_SCROLLER_HANDLE_SIZE, (float)hor.ymin+2,
- (float)vs->hor_max+V2D_SCROLLER_HANDLE_SIZE, (float)hor.ymax-2,
- V2D_SCROLLCAP_RAD, V2D_SCROLLCAP_SHADE, -V2D_SCROLLCAP_SHADE);
- }
+ uiWidgetScrollDraw(&wcol, &hor, &slider, state);
}
/* scale indicators */
- // XXX will need to update the font drawing when the new stuff comes in
if ((scroll & V2D_SCROLL_SCALE_HORIZONTAL) && (vs->grid)) {
View2DGrid *grid= vs->grid;
float fac, dfac, fac2, val;
@@ -1496,19 +1625,26 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
/* draw numbers in the appropriate range */
if (dfac > 0.0f) {
- for (; fac < hor.xmax; fac+=dfac, val+=grid->dx) {
+ float h= 2.0f+(float)(hor.ymin);
+
+ for (; fac < hor.xmax-10; fac+=dfac, val+=grid->dx) {
+
+ /* make prints look nicer for scrollers */
+ if(fac < hor.xmin+10)
+ continue;
+
switch (vs->xunits) {
case V2D_UNIT_FRAMES: /* frames (as whole numbers)*/
- scroll_printstr(vs, scene, fac, 3.0f+(float)(hor.ymin), val, grid->powerx, V2D_UNIT_FRAMES, 'h');
+ scroll_printstr(vs, 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, 3.0f+(float)(hor.ymin), val, grid->powerx, V2D_UNIT_FRAMESCALE, 'h');
+ scroll_printstr(vs, 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, 3.0f+(float)(hor.ymin), fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
+ scroll_printstr(vs, scene, fac, h, fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
break;
case V2D_UNIT_SECONDSSEQ: /* seconds with special calculations (only used for sequencer only) */
@@ -1519,98 +1655,45 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
time= (float)floor(fac2);
fac2= fac2-time;
- scroll_printstr(vs, scene, fac, 3.0f+(float)(hor.ymin), time+(float)FPS*fac2/100.0f, grid->powerx, V2D_UNIT_SECONDSSEQ, 'h');
+ scroll_printstr(vs, 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, 3.0f+(float)(hor.ymin), val, grid->powerx, V2D_UNIT_DEGREES, 'v');
+ scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_DEGREES, 'v');
break;
}
}
}
}
-
- /* decoration outer bevel line */
- UI_ThemeColorShade(TH_SHADE1, lighter);
- if (scroll & (V2D_SCROLL_BOTTOM|V2D_SCROLL_BOTTOM_O))
- sdrawline(hor.xmin, hor.ymax, hor.xmax, hor.ymax);
- else if (scroll & V2D_SCROLL_TOP)
- sdrawline(hor.xmin, hor.ymin, hor.xmax, hor.ymin);
}
/* vertical scrollbar */
if (scroll & V2D_SCROLL_VERTICAL) {
- /* scroller backdrop */
- UI_ThemeColorShade(TH_SHADE1, light);
- glRecti(vert.xmin, vert.ymin, vert.xmax, vert.ymax);
-
- /* scroller 'button'
- * - if view is zoomable in y, draw handles too
- * - handles are drawn darker
- * - no slider when view is > total for non-zoomable views
- * (otherwise, zoomable ones tend to flicker)
- */
- if ( (v2d->scroll & V2D_SCROLL_SCALE_VERTICAL) ||
- ((v2d->tot.ymax - v2d->tot.ymin) > (v2d->cur.ymax - v2d->cur.ymin)) )
- {
- if (v2d->keepzoom & V2D_LOCKZOOM_Y) {
- /* draw base bar as rounded shape */
- UI_ThemeColorShade(TH_SHADE1, dark);
- uiSetRoundBox(15);
-
- /* check that box is large enough for round drawing */
- if ((vs->vert_max - vs->vert_min) < (V2D_SCROLLCAP_RAD * 2)) {
- /* Rounded box still gets drawn at the minimum size limit
- * This doesn't represent extreme scaling well, but looks nicer...
- */
- float mid= 0.5f * (vs->vert_max + vs->vert_min);
-
- gl_round_box_vertical_shade(GL_POLYGON,
- (float)vert.xmin+2, mid-V2D_SCROLLCAP_RAD,
- (float)vert.xmax-2, mid+V2D_SCROLLCAP_RAD,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
- }
- else {
- /* draw rounded box as per normal */
- gl_round_box_vertical_shade(GL_POLYGON,
- (float)vert.xmin+2, (float)vs->vert_min,
- (float)vert.xmax-2, (float)vs->vert_max,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
- }
- }
- else {
- /* base bar drawn as shaded rect */
- UI_ThemeColorShade(TH_SHADE1, dark);
- uiSetRoundBox(0);
- gl_round_box_vertical_shade(GL_POLYGON,
- (float)vert.xmin+2, (float)vs->vert_min,
- (float)vert.xmax-2, (float)vs->vert_max,
- V2D_SCROLLCAP_RAD, V2D_SCROLLBAR_SHADE, -V2D_SCROLLBAR_SHADE);
-
- /* 'minimum' handle */
- UI_ThemeColorShade(TH_SHADE1, darker);
- uiSetRoundBox(12);
-
- gl_round_box_vertical_shade(GL_POLYGON,
- (float)vert.xmin+2, (float)vs->vert_min-V2D_SCROLLER_HANDLE_SIZE,
- (float)vert.xmax-2, (float)vs->vert_min+V2D_SCROLLER_HANDLE_SIZE,
- V2D_SCROLLCAP_RAD, V2D_SCROLLCAP_SHADE, -V2D_SCROLLCAP_SHADE);
-
- /* maximum handle */
- UI_ThemeColorShade(TH_SHADE1, darker);
- uiSetRoundBox(3);
+ /* only draw scrollbar when it doesn't fill the entire space */
+ if(vs->vertfull==0) {
+ bTheme *btheme= U.themes.first;
+ uiWidgetColors wcol= btheme->tui.wcol_scroll;
+ rcti slider;
+ int state;
+
+ slider.xmin= vert.xmin;
+ slider.xmax= vert.xmax;
+ slider.ymin= vs->vert_min;
+ slider.ymax= vs->vert_max;
+
+ state= (v2d->scroll_ui & V2D_SCROLL_V_ACTIVE)?UI_SCROLL_PRESSED:0;
+
+ // TODO: disable this for button regions...
+ if (!(v2d->keepzoom & V2D_LOCKZOOM_Y))
+ state |= UI_SCROLL_ARROWS;
- gl_round_box_vertical_shade(GL_POLYGON,
- (float)vert.xmin+2, (float)vs->vert_max-V2D_SCROLLER_HANDLE_SIZE,
- (float)vert.xmax-2, (float)vs->vert_max+V2D_SCROLLER_HANDLE_SIZE,
- V2D_SCROLLCAP_RAD, V2D_SCROLLCAP_SHADE, -V2D_SCROLLCAP_SHADE);
- }
+ uiWidgetScrollDraw(&wcol, &vert, &slider, state);
}
+
/* scale indiators */
- // XXX will need to update the font drawing when the new stuff comes in
if ((scroll & V2D_SCROLL_SCALE_VERTICAL) && (vs->grid)) {
View2DGrid *grid= vs->grid;
float fac, dfac, val;
@@ -1638,42 +1721,23 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
/* draw vertical steps */
if (dfac > 0.0f) {
- for (; fac < vert.ymax; fac+= dfac, val += grid->dy) {
- scroll_printstr(vs, scene, (float)(vert.xmax)-14.0f, fac, val, grid->powery, vs->yunits, 'v');
+
+ BLF_default_rotation(90.0f);
+
+ for (; fac < vert.ymax-10; fac+= dfac, val += grid->dy) {
+
+ /* make prints look nicer for scrollers */
+ if(fac < vert.ymin+10)
+ continue;
+
+ scroll_printstr(vs, scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v');
}
+
+ BLF_default_rotation(0.0f);
}
}
-
- /* decoration outer bevel line */
- UI_ThemeColorShade(TH_SHADE1, lighter);
- if (scroll & V2D_SCROLL_RIGHT)
- sdrawline(vert.xmin, vert.ymin, vert.xmin, vert.ymax);
- else if (scroll & V2D_SCROLL_LEFT)
- sdrawline(vert.xmax, vert.ymin, vert.xmax, vert.ymax);
- }
-
- /* draw a 'sunken square' to cover up any overlapping corners resulting from intersection of overflowing scroller data */
- if ((scroll & V2D_SCROLL_VERTICAL) && (scroll & V2D_SCROLL_HORIZONTAL)) {
- /* set bounds (these should be right) */
- corner.xmin= vert.xmin;
- corner.xmax= vert.xmax;
- corner.ymin= hor.ymin;
- corner.ymax= hor.ymax;
-
- /* firstly, draw using background color to cover up any overlapping junk */
- UI_ThemeColor(TH_SHADE1);
- glRecti(corner.xmin, corner.ymin, corner.xmax, corner.ymax);
-
- /* now, draw suggestive highlighting... */
- /* first, dark lines on top to suggest scrollers overlap box */
- UI_ThemeColorShade(TH_SHADE1, darker);
- sdrawline(corner.xmin, corner.ymin, corner.xmin, corner.ymax);
- sdrawline(corner.xmin, corner.ymax, corner.xmax, corner.ymax);
- /* now, light lines on bottom to show box is sunken in */
- UI_ThemeColorShade(TH_SHADE1, lighter);
- sdrawline(corner.xmax, corner.ymin, corner.xmax, corner.ymax);
- sdrawline(corner.xmin, corner.ymin, corner.xmax, corner.ymin);
}
+
}
/* free temporary memory used for drawing scrollers */
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index bd1c734b870..0af5a5cac97 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -151,6 +151,13 @@ static void view_pan_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_area_tag_redraw(vpd->sa);
UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY);
+ WM_event_add_mousemove(C);
+
+ /* exceptions */
+ if(vpd->sa->spacetype==SPACE_OUTLINER) {
+ SpaceOops *soops= vpd->sa->spacedata.first;
+ soops->storeflag |= SO_TREESTORE_REDRAW;
+ }
}
/* cleanup temp customdata */
@@ -203,7 +210,7 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
WM_cursor_modal(window, BC_NSEW_SCROLLCURSOR);
/* add temp handler */
- WM_event_add_modal_handler(C, &window->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -228,8 +235,9 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
}
break;
+ case LEFTMOUSE:
case MIDDLEMOUSE:
- if (event->val==0) {
+ if (event->val==KM_RELEASE) {
/* calculate overall delta mouse-movement for redo */
RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx));
RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
@@ -249,6 +257,7 @@ void VIEW2D_OT_pan(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Pan View";
+ ot->description= "Pan the view.";
ot->idname= "VIEW2D_OT_pan";
/* api callbacks */
@@ -257,7 +266,7 @@ void VIEW2D_OT_pan(wmOperatorType *ot)
ot->modal= view_pan_modal;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_BLOCKING;
/* 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);
@@ -297,13 +306,14 @@ void VIEW2D_OT_scroll_right(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Right";
+ ot->description= "Scroll the view right.";
ot->idname= "VIEW2D_OT_scroll_right";
/* api callbacks */
ot->exec= view_scrollright_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* 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);
@@ -343,13 +353,14 @@ void VIEW2D_OT_scroll_left(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Left";
+ ot->description= "Scroll the view left.";
ot->idname= "VIEW2D_OT_scroll_left";
/* api callbacks */
ot->exec= view_scrollleft_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* 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);
@@ -388,13 +399,14 @@ void VIEW2D_OT_scroll_down(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Down";
+ ot->description= "Scroll the view down.";
ot->idname= "VIEW2D_OT_scroll_down";
/* api callbacks */
ot->exec= view_scrolldown_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* 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);
@@ -434,13 +446,14 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Up";
+ ot->description= "Scroll the view up.";
ot->idname= "VIEW2D_OT_scroll_up";
/* api callbacks */
ot->exec= view_scrollup_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* 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);
@@ -464,7 +477,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
/* ------------------ 'Shared' stuff ------------------------ */
/* check if step-zoom can be applied */
-static short view_zoomstep_ok(bContext *C)
+static int view_zoom_poll(bContext *C)
{
ARegion *ar= CTX_wm_region(C);
View2D *v2d;
@@ -487,17 +500,33 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
View2D *v2d= &ar->v2d;
- float dx, dy;
-
- /* calculate amount to move view by */
- dx= (v2d->cur.xmax - v2d->cur.xmin) * (float)RNA_float_get(op->ptr, "zoomfacx");
- dy= (v2d->cur.ymax - v2d->cur.ymin) * (float)RNA_float_get(op->ptr, "zoomfacy");
+ float dx, dy, facx, facy;
+ /* calculate amount to move view by, ensuring symmetry so the
+ * old zoom level is restored after zooming back the same amount */
+ facx= RNA_float_get(op->ptr, "zoomfacx");
+ facy= RNA_float_get(op->ptr, "zoomfacy");
+
+ if(facx >= 0.0f) {
+ dx= (v2d->cur.xmax - v2d->cur.xmin) * facx;
+ dy= (v2d->cur.ymax - v2d->cur.ymin) * facy;
+ }
+ else {
+ dx= ((v2d->cur.xmax - v2d->cur.xmin)/(1.0f + 2.0f*facx)) * facx;
+ dy= ((v2d->cur.ymax - v2d->cur.ymin)/(1.0f + 2.0f*facy)) * facy;
+ }
+
/* only resize view on an axis if change is allowed */
if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) {
if (v2d->keepofs & V2D_LOCKOFS_X) {
v2d->cur.xmax -= 2*dx;
}
+ else if (v2d->keepofs & V2D_KEEPOFS_X) {
+ if(v2d->align & V2D_ALIGN_NO_POS_X)
+ v2d->cur.xmin += 2*dx;
+ else
+ v2d->cur.xmax -= 2*dx;
+ }
else {
v2d->cur.xmin += dx;
v2d->cur.xmax -= dx;
@@ -507,18 +536,25 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
if (v2d->keepofs & V2D_LOCKOFS_Y) {
v2d->cur.ymax -= 2*dy;
}
+ else if (v2d->keepofs & V2D_KEEPOFS_Y) {
+ if(v2d->align & V2D_ALIGN_NO_POS_Y)
+ v2d->cur.ymin += 2*dy;
+ else
+ v2d->cur.ymax -= 2*dy;
+ }
else {
v2d->cur.ymin += dy;
v2d->cur.ymax -= dy;
}
}
-
+
/* validate that view is in valid configuration after this operation */
UI_view2d_curRect_validate(v2d);
-
+
/* request updates to be done... */
ED_area_tag_redraw(CTX_wm_area(C));
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
+ WM_event_add_mousemove(C);
}
/* --------------- Individual Operators ------------------- */
@@ -527,7 +563,7 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
static int view_zoomin_exec(bContext *C, wmOperator *op)
{
/* check that there's an active region, as View2D data resides there */
- if (!view_zoomstep_ok(C))
+ if (!view_zoom_poll(C))
return OPERATOR_PASS_THROUGH;
/* set RNA-Props - zooming in by uniform factor */
@@ -544,13 +580,14 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom In";
+ ot->description= "Zoom in the view.";
ot->idname= "VIEW2D_OT_zoom_in";
/* api callbacks */
ot->exec= view_zoomin_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* rna - must keep these in sync with the other operators */
RNA_def_float(ot->srna, "zoomfacx", 0, -FLT_MAX, FLT_MAX, "Zoom Factor X", "", -FLT_MAX, FLT_MAX);
@@ -563,7 +600,7 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot)
static int view_zoomout_exec(bContext *C, wmOperator *op)
{
/* check that there's an active region, as View2D data resides there */
- if (!view_zoomstep_ok(C))
+ if (!view_zoom_poll(C))
return OPERATOR_PASS_THROUGH;
/* set RNA-Props - zooming in by uniform factor */
@@ -580,13 +617,14 @@ void VIEW2D_OT_zoom_out(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom Out";
+ ot->description= "Zoom out the view.";
ot->idname= "VIEW2D_OT_zoom_out";
/* api callbacks */
ot->exec= view_zoomout_exec;
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER;
/* rna - must keep these in sync with the other operators */
RNA_def_float(ot->srna, "zoomfacx", 0, -FLT_MAX, FLT_MAX, "Zoom Factor X", "", -FLT_MAX, FLT_MAX);
@@ -675,6 +713,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_area_tag_redraw(CTX_wm_area(C));
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
+ WM_event_add_mousemove(C);
}
/* cleanup temp customdata */
@@ -725,7 +764,7 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event)
WM_cursor_modal(window, BC_NSEW_SCROLLCURSOR);
/* add temp handler */
- WM_event_add_modal_handler(C, &window->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -795,8 +834,9 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, wmEvent *event)
}
break;
+ case LEFTMOUSE:
case MIDDLEMOUSE:
- if (event->val==0) {
+ 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);
@@ -824,6 +864,7 @@ void VIEW2D_OT_zoom(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom View";
+ ot->description= "Zoom in/out the view.";
ot->idname= "VIEW2D_OT_zoom";
/* api callbacks */
@@ -831,8 +872,10 @@ void VIEW2D_OT_zoom(wmOperatorType *ot)
ot->invoke= view_zoomdrag_invoke;
ot->modal= view_zoomdrag_modal;
+ ot->poll= view_zoom_poll;
+
/* operator is repeatable */
- ot->flag= OPTYPE_REGISTER;
+ // ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING;
/* rna - must keep these in sync with the other operators */
RNA_def_float(ot->srna, "deltax", 0, -FLT_MAX, FLT_MAX, "Delta X", "", -FLT_MAX, FLT_MAX);
@@ -914,6 +957,7 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_area_tag_redraw(CTX_wm_area(C));
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
+ WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
@@ -922,6 +966,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom to Border";
+ ot->description= "Zoom in the view to the nearest item contained in the border.";
ot->idname= "VIEW2D_OT_zoom_border";
/* api callbacks */
@@ -929,7 +974,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot)
ot->exec= view_borderzoom_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= view_zoom_poll;
/* rna */
RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
@@ -1010,15 +1055,7 @@ static short mouse_in_scroller_handle(int mouse, int sc_min, int sc_max, int sh_
if (in_view == 0) {
- /* handles are only activated if the mouse is within the relative quater lengths of the scroller */
- int qLen = (sc_max + sc_min) / 4;
-
- if (mouse >= (sc_max - qLen))
- return SCROLLHANDLE_MAX;
- else if (mouse <= qLen)
- return SCROLLHANDLE_MIN;
- else
- return SCROLLHANDLE_BAR;
+ return SCROLLHANDLE_BAR;
}
/* check if mouse is in or past either handle */
@@ -1095,15 +1132,23 @@ static void scroller_activate_init(bContext *C, wmOperator *op, wmEvent *event,
vsm->zone= mouse_in_scroller_handle(y, v2d->vert.ymin, v2d->vert.ymax, scrollers->vert_min, scrollers->vert_max);
}
}
+
UI_view2d_scrollers_free(scrollers);
+ ED_region_tag_redraw(ar);
}
/* cleanup temp customdata */
static void scroller_activate_exit(bContext *C, wmOperator *op)
{
if (op->customdata) {
+ v2dScrollerMove *vsm= op->customdata;
+
+ vsm->v2d->scroll_ui &= ~(V2D_SCROLL_H_ACTIVE|V2D_SCROLL_V_ACTIVE);
+
MEM_freeN(op->customdata);
- op->customdata= NULL;
+ op->customdata= NULL;
+
+ ED_region_tag_redraw(CTX_wm_region(C));
}
}
@@ -1120,14 +1165,14 @@ static void scroller_activate_apply(bContext *C, wmOperator *op)
/* type of movement */
switch (vsm->zone) {
case SCROLLHANDLE_MIN:
+ case SCROLLHANDLE_MAX:
+
/* only expand view on axis if zoom is allowed */
if ((vsm->scroller == 'h') && !(v2d->keepzoom & V2D_LOCKZOOM_X))
v2d->cur.xmin -= temp;
if ((vsm->scroller == 'v') && !(v2d->keepzoom & V2D_LOCKZOOM_Y))
v2d->cur.ymin -= temp;
- break;
- case SCROLLHANDLE_MAX:
/* only expand view on axis if zoom is allowed */
if ((vsm->scroller == 'h') && !(v2d->keepzoom & V2D_LOCKZOOM_X))
v2d->cur.xmax += temp;
@@ -1154,6 +1199,7 @@ static void scroller_activate_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_area_tag_redraw(CTX_wm_area(C));
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! */
@@ -1198,7 +1244,7 @@ static int scroller_activate_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
case LEFTMOUSE:
- if (event->val==0) {
+ if (event->val==KM_RELEASE) {
scroller_activate_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -1240,8 +1286,13 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
+ if(vsm->scroller=='h')
+ v2d->scroll_ui |= V2D_SCROLL_H_ACTIVE;
+ else
+ v2d->scroll_ui |= V2D_SCROLL_V_ACTIVE;
+
/* still ok, so can add */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
else {
@@ -1255,7 +1306,11 @@ void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroller Activate";
+ ot->description= "Scroll view by mouse click and drag.";
ot->idname= "VIEW2D_OT_scroller_activate";
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke= scroller_activate_invoke;
@@ -1268,6 +1323,7 @@ void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
static int reset_exec(bContext *C, wmOperator *op)
{
+ uiStyle *style= U.uistyles.first;
ARegion *ar= CTX_wm_region(C);
View2D *v2d= &ar->v2d;
int winx, winy;
@@ -1278,26 +1334,26 @@ static int reset_exec(bContext *C, wmOperator *op)
v2d->cur.xmax= v2d->cur.xmin + winx;
v2d->cur.ymax= v2d->cur.ymin + winy;
-
+
/* align */
if(v2d->align) {
/* posx and negx flags are mutually exclusive, so watch out */
if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & V2D_ALIGN_NO_NEG_X)) {
v2d->cur.xmax= 0.0f;
- v2d->cur.xmin= v2d->winx;
+ v2d->cur.xmin= -winx*style->panelzoom;
}
else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & V2D_ALIGN_NO_POS_X)) {
- v2d->cur.xmax= v2d->cur.xmax - v2d->cur.xmin;
+ v2d->cur.xmax= winx*style->panelzoom;
v2d->cur.xmin= 0.0f;
}
/* - posx and negx flags are mutually exclusive, so watch out */
if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & V2D_ALIGN_NO_NEG_Y)) {
v2d->cur.ymax= 0.0f;
- v2d->cur.ymin= -v2d->winy;
+ v2d->cur.ymin= -winy*style->panelzoom;
}
else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & V2D_ALIGN_NO_POS_Y)) {
- v2d->cur.ymax= v2d->cur.ymax - v2d->cur.ymin;
+ v2d->cur.ymax= winy*style->panelzoom;
v2d->cur.ymin= 0.0f;
}
}
@@ -1308,6 +1364,7 @@ static int reset_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_area_tag_redraw(CTX_wm_area(C));
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
+ WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
@@ -1316,6 +1373,7 @@ void VIEW2D_OT_reset(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reset View";
+ ot->description= "Reset the view.";
ot->idname= "VIEW2D_OT_reset";
/* api callbacks */
@@ -1323,7 +1381,7 @@ void VIEW2D_OT_reset(wmOperatorType *ot)
ot->poll= view2d_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ // ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* ********************************************************* */
@@ -1351,7 +1409,7 @@ void ui_view2d_operatortypes(void)
void UI_view2d_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "View2D", 0, 0);
/* pan/scroll */
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
@@ -1387,7 +1445,7 @@ void UI_view2d_keymap(wmWindowManager *wm)
WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
/* Alternative keymap for buttons listview */
- keymap= WM_keymap_listbase(wm, "View2D Buttons List", 0, 0);
+ keymap= WM_keymap_find(wm, "View2D Buttons List", 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MIDDLEMOUSE, KM_PRESS, 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);
@@ -1395,5 +1453,6 @@ void UI_view2d_keymap(wmWindowManager *wm)
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_reset", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0);
}
diff --git a/source/blender/editors/mesh/editdeform.c b/source/blender/editors/mesh/editdeform.c
deleted file mode 100644
index 3ccd4d56ece..00000000000
--- a/source/blender/editors/mesh/editdeform.c
+++ /dev/null
@@ -1,1110 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
- * Creator-specific support for vertex deformation groups
- * Added: apply deform function (ton)
- */
-
-#include <string.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_cloth_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_object_types.h"
-#include "DNA_object_force.h"
-#include "DNA_scene_types.h"
-#include "DNA_particle_types.h"
-#include "DNA_windowmanager_types.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-
-#include "BKE_customdata.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_depsgraph.h"
-#include "BKE_deform.h"
-#include "BKE_displist.h"
-#include "BKE_global.h"
-#include "BKE_lattice.h"
-#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
-
-#include "ED_mesh.h"
-#include "ED_view3d.h"
-#include "mesh_intern.h"
-
-/* XXX */
-static void BIF_undo_push() {}
-static void error() {}
-
-static Lattice *def_get_lattice(Object *ob)
-{
- if(ob->type==OB_LATTICE) {
- Lattice *lt= ob->data;
- if(lt->editlatt)
- return lt->editlatt;
- return lt;
- }
- return NULL;
-}
-
-/* only in editmode */
-void sel_verts_defgroup (Object *obedit, int select)
-{
- EditVert *eve;
- Object *ob;
- int i;
- MDeformVert *dvert;
-
- ob= obedit;
-
- if (!ob)
- return;
-
- switch (ob->type){
- case OB_MESH:
- {
- Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- 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;
-
- break;
- }
- }
- }
- }
- /* this has to be called, because this function operates on vertices only */
- if(select) EM_select_flush(em); // vertices to edges/faces
- else EM_deselect_flush(em);
-
- BKE_mesh_end_editmesh(me, em);
- }
- break;
- case OB_LATTICE:
- {
- Lattice *lt= def_get_lattice(ob);
-
- if(lt->dvert) {
- BPoint *bp;
- int a, tot;
-
- dvert= lt->dvert;
-
- 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(select) bp->f1 |= SELECT;
- else bp->f1 &= ~SELECT;
-
- break;
- }
- }
- }
- }
- }
- break;
-
- default:
- break;
- }
-}
-
-/* check if deform vertex has defgroup index */
-MDeformWeight *get_defweight (MDeformVert *dv, int defgroup)
-{
- int i;
-
- if (!dv || defgroup<0)
- return NULL;
-
- for (i=0; i<dv->totweight; i++){
- if (dv->dw[i].def_nr == defgroup)
- return dv->dw+i;
- }
- return NULL;
-}
-
-/* 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 *verify_defweight (MDeformVert *dv, int defgroup)
-{
- MDeformWeight *newdw;
-
- /* do this check always, this function is used to check for it */
- if (!dv || defgroup<0)
- return NULL;
-
- newdw = get_defweight (dv, defgroup);
- if (newdw)
- return newdw;
-
- newdw = MEM_callocN (sizeof(MDeformWeight)*(dv->totweight+1), "deformWeight");
- if (dv->dw){
- memcpy (newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
- MEM_freeN (dv->dw);
- }
- dv->dw=newdw;
-
- dv->dw[dv->totweight].weight=0.0f;
- dv->dw[dv->totweight].def_nr=defgroup;
- /* Group index */
-
- dv->totweight++;
-
- return dv->dw+(dv->totweight-1);
-}
-
-bDeformGroup *add_defgroup_name (Object *ob, char *name)
-{
- bDeformGroup *defgroup;
-
- if (!ob)
- return NULL;
-
- defgroup = MEM_callocN (sizeof(bDeformGroup), "add deformGroup");
-
- BLI_strncpy (defgroup->name, name, 32);
-
- BLI_addtail(&ob->defbase, defgroup);
- unique_vertexgroup_name(defgroup, ob);
-
- ob->actdef = BLI_countlist(&ob->defbase);
-
- return defgroup;
-}
-
-void add_defgroup (Object *ob)
-{
- add_defgroup_name (ob, "Group");
-}
-
-
-void duplicate_defgroup ( Object *ob )
-{
- bDeformGroup *dg, *cdg;
- char name[32], s[32];
- MDeformWeight *org, *cpy;
- MDeformVert *dvert, *dvert_array;
- int i, idg, icdg, dvert_tot;
-
- if (ob->type != OB_MESH && ob->type != OB_LATTICE)
- return;
-
- dg = BLI_findlink (&ob->defbase, (ob->actdef-1));
- if (!dg)
- return;
-
- if (strstr(dg->name, "_copy")) {
- BLI_strncpy (name, dg->name, 32); /* will be renamed _copy.001... etc */
- } else {
- BLI_snprintf (name, 32, "%s_copy", dg->name);
- while (get_named_vertexgroup (ob, name)) {
- if ((strlen (name) + 6) > 32) {
- error ("Error: the name for the new group is > 32 characters");
- return;
- }
- strcpy (s, name);
- BLI_snprintf (name, 32, "%s_copy", s);
- }
- }
-
- cdg = copy_defgroup (dg);
- strcpy (cdg->name, name);
- unique_vertexgroup_name(cdg, ob);
-
- BLI_addtail (&ob->defbase, cdg);
-
- idg = (ob->actdef-1);
- ob->actdef = BLI_countlist (&ob->defbase);
- icdg = (ob->actdef-1);
-
- if(ob->type == OB_MESH) {
- Mesh *me = get_mesh (ob);
- dvert_array= me->dvert;
- dvert_tot= me->totvert;
- }
- else if (ob->type == OB_LATTICE) {
- Lattice *lt= (Lattice *)ob->data;
- dvert_array= lt->dvert;
- dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
- }
-
- if (!dvert_array)
- return;
-
- for (i = 0; i < dvert_tot; i++) {
- dvert = dvert_array+i;
- org = get_defweight (dvert, idg);
- if (org) {
- float weight = org->weight;
- /* verify_defweight re-allocs org so need to store the weight first */
- cpy = verify_defweight (dvert, icdg);
- cpy->weight = weight;
- }
- }
-}
-
-static void del_defgroup_update_users(Object *ob, int id)
-{
- ExplodeModifierData *emd;
- ModifierData *md;
- ParticleSystem *psys;
- ClothModifierData *clmd;
- ClothSimSettings *clsim;
- int a;
-
- /* these cases don't use names to refer to vertex groups, so when
- * they get deleted the numbers get out of sync, this corrects that */
-
- if(ob->soft) {
- if(ob->soft->vertgroup == id)
- ob->soft->vertgroup= 0;
- else if(ob->soft->vertgroup > id)
- ob->soft->vertgroup--;
- }
-
- for(md=ob->modifiers.first; md; md=md->next) {
- if(md->type == eModifierType_Explode) {
- emd= (ExplodeModifierData*)md;
-
- if(emd->vgroup == id)
- emd->vgroup= 0;
- else if(emd->vgroup > id)
- emd->vgroup--;
- }
- else if(md->type == eModifierType_Cloth) {
- clmd= (ClothModifierData*)md;
- clsim= clmd->sim_parms;
-
- if(clsim) {
- if(clsim->vgroup_mass == id)
- clsim->vgroup_mass= 0;
- else if(clsim->vgroup_mass > id)
- clsim->vgroup_mass--;
-
- if(clsim->vgroup_bend == id)
- clsim->vgroup_bend= 0;
- else if(clsim->vgroup_bend > id)
- clsim->vgroup_bend--;
-
- if(clsim->vgroup_struct == id)
- clsim->vgroup_struct= 0;
- else if(clsim->vgroup_struct > id)
- clsim->vgroup_struct--;
- }
- }
- }
-
- for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- for(a=0; a<PSYS_TOT_VG; a++)
- if(psys->vgroup[a] == id)
- psys->vgroup[a]= 0;
- else if(psys->vgroup[a] > id)
- psys->vgroup[a]--;
- }
-}
-
-void del_defgroup_in_object_mode ( Object *ob )
-{
- bDeformGroup *dg;
- MDeformVert *dvert_array, *dvert;
-
- int i, e, dvert_tot;
-
- if ((!ob) || (ob->type != OB_MESH && ob->type != OB_LATTICE))
- return;
-
- if(ob->type == OB_MESH) {
- Mesh *me = get_mesh (ob);
- dvert_array= me->dvert;
- dvert_tot= me->totvert;
- }
- else if (ob->type == OB_LATTICE) {
- Lattice *lt= (Lattice *)ob->data;
- dvert_array= lt->dvert;
- dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
- }
-
- dg = BLI_findlink (&ob->defbase, (ob->actdef-1));
- if (!dg)
- return;
-
- if (dvert_array) {
- for (i = 0; i < dvert_tot; i++) {
- dvert = dvert_array + i;
- if (dvert) {
- if (get_defweight (dvert, (ob->actdef-1)))
- remove_vert_defgroup (ob, dg, i);
- }
- }
-
- 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--;
- }
- }
- }
- }
-
- del_defgroup_update_users(ob, ob->actdef);
-
- /* Update the active deform index if necessary */
- if (ob->actdef == BLI_countlist(&ob->defbase))
- ob->actdef--;
-
- /* Remove the group */
- BLI_freelinkN (&ob->defbase, dg);
-}
-
-void del_defgroup (Object *ob)
-{
- bDeformGroup *defgroup;
- int i;
-
- if (!ob)
- return;
-
- if (!ob->actdef)
- return;
-
- defgroup = BLI_findlink(&ob->defbase, ob->actdef-1);
- if (!defgroup)
- return;
-
- /* Make sure that no verts are using this group */
- remove_verts_defgroup(ob, 1);
-
- /* Make sure that any verts with higher indices are adjusted accordingly */
- if(ob->type==OB_MESH) {
- Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve;
- MDeformVert *dvert;
-
- for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if (dvert)
- for (i=0; i<dvert->totweight; i++)
- if (dvert->dw[i].def_nr > (ob->actdef-1))
- dvert->dw[i].def_nr--;
- }
- BKE_mesh_end_editmesh(me, em);
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
- BPoint *bp;
- MDeformVert *dvert= lt->dvert;
- int a, tot;
-
- if (dvert) {
- 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))
- dvert->dw[i].def_nr--;
- }
- }
- }
- }
-
- del_defgroup_update_users(ob, ob->actdef);
-
- /* Update the active deform index if necessary */
- if (ob->actdef==BLI_countlist(&ob->defbase))
- ob->actdef--;
-
- /* Remove the group */
- BLI_freelinkN (&ob->defbase, defgroup);
-
- /* remove all dverts */
- if(ob->actdef==0) {
- if(ob->type==OB_MESH) {
- Mesh *me= ob->data;
- CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
- me->dvert= NULL;
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
- if (lt->dvert) {
- MEM_freeN(lt->dvert);
- lt->dvert= NULL;
- }
- }
- }
-}
-
-void del_all_defgroups (Object *ob)
-{
- /* Sanity check */
- if (ob == NULL)
- return;
-
- /* Remove all DVerts */
- if (ob->type==OB_MESH) {
- Mesh *me= ob->data;
- CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
- me->dvert= NULL;
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
- if (lt->dvert) {
- MEM_freeN(lt->dvert);
- lt->dvert= NULL;
- }
- }
-
- /* Remove all DefGroups */
- BLI_freelistN(&ob->defbase);
-
- /* Fix counters/indices */
- ob->actdef= 0;
-}
-
-void create_dverts(ID *id)
-{
- /* create deform verts
- */
-
- if( GS(id->name)==ID_ME) {
- Mesh *me= (Mesh *)id;
- me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, me->totvert);
- }
- else if( GS(id->name)==ID_LT) {
- Lattice *lt= (Lattice *)id;
- lt->dvert= MEM_callocN(sizeof(MDeformVert)*lt->pntsu*lt->pntsv*lt->pntsw, "lattice deformVert");
- }
-}
-
-/* for mesh in object mode
- lattice can be in editmode */
-void remove_vert_def_nr (Object *ob, int def_nr, int vertnum)
-{
- /* This routine removes the vertex from the deform
- * group with number def_nr.
- *
- * This routine is meant to be fast, so it is the
- * responsibility of the calling routine to:
- * a) test whether ob is non-NULL
- * b) test whether ob is a mesh
- * c) calculate def_nr
- */
-
- MDeformWeight *newdw;
- MDeformVert *dvert= NULL;
- int i;
-
- /* get the deform vertices corresponding to the
- * vertnum
- */
- if(ob->type==OB_MESH) {
- if( ((Mesh*)ob->data)->dvert )
- dvert = ((Mesh*)ob->data)->dvert + vertnum;
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
-
- if(lt->dvert)
- dvert = lt->dvert + vertnum;
- }
-
- if(dvert==NULL)
- return;
-
- /* for all of the deform weights in the
- * deform vert
- */
- for (i=dvert->totweight - 1 ; i>=0 ; i--){
-
- /* if the def_nr is the same as the one
- * for our weight group then remove it
- * from this deform vert.
- */
- if (dvert->dw[i].def_nr == def_nr) {
- dvert->totweight--;
-
- /* if there are still other deform weights
- * attached to this vert then remove this
- * deform weight, and reshuffle the others
- */
- if (dvert->totweight) {
- newdw = MEM_mallocN (sizeof(MDeformWeight)*(dvert->totweight),
- "deformWeight");
- if (dvert->dw){
- memcpy (newdw, dvert->dw, sizeof(MDeformWeight)*i);
- memcpy (newdw+i, dvert->dw+i+1,
- sizeof(MDeformWeight)*(dvert->totweight-i));
- MEM_freeN (dvert->dw);
- }
- dvert->dw=newdw;
- }
- /* if there are no other deform weights
- * left then just remove the deform weight
- */
- else {
- MEM_freeN (dvert->dw);
- dvert->dw = NULL;
- break;
- }
- }
- }
-
-}
-
-/* for Mesh in Object mode */
-/* allows editmode for Lattice */
-void add_vert_defnr (Object *ob, int def_nr, int vertnum,
- float weight, int assignmode)
-{
- /* add the vert to the deform group with the
- * specified number
- */
- MDeformVert *dv= NULL;
- MDeformWeight *newdw;
- int i;
-
- /* get the vert */
- if(ob->type==OB_MESH) {
- if(((Mesh*)ob->data)->dvert)
- dv = ((Mesh*)ob->data)->dvert + vertnum;
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
-
- if(lt->dvert)
- dv = lt->dvert + vertnum;
- }
-
- if(dv==NULL)
- return;
-
- /* Lets first check to see if this vert is
- * already in the weight group -- if so
- * lets update it
- */
- for (i=0; i<dv->totweight; i++){
-
- /* if this weight cooresponds to the
- * deform group, then add it using
- * the assign mode provided
- */
- if (dv->dw[i].def_nr == def_nr){
-
- switch (assignmode) {
- case WEIGHT_REPLACE:
- dv->dw[i].weight=weight;
- break;
- case WEIGHT_ADD:
- dv->dw[i].weight+=weight;
- if (dv->dw[i].weight >= 1.0)
- dv->dw[i].weight = 1.0;
- break;
- case WEIGHT_SUBTRACT:
- dv->dw[i].weight-=weight;
- /* if the weight is zero or less then
- * remove the vert from the deform group
- */
- if (dv->dw[i].weight <= 0.0)
- remove_vert_def_nr(ob, def_nr, vertnum);
- break;
- }
- return;
- }
- }
-
- /* if the vert wasn't in the deform group then
- * we must take a different form of action ...
- */
-
- switch (assignmode) {
- case WEIGHT_SUBTRACT:
- /* if we are subtracting then we don't
- * need to do anything
- */
- return;
-
- case WEIGHT_REPLACE:
- case WEIGHT_ADD:
- /* if we are doing an additive assignment, then
- * we need to create the deform weight
- */
- newdw = MEM_callocN (sizeof(MDeformWeight)*(dv->totweight+1),
- "deformWeight");
- if (dv->dw){
- memcpy (newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
- MEM_freeN (dv->dw);
- }
- dv->dw=newdw;
-
- dv->dw[dv->totweight].weight=weight;
- dv->dw[dv->totweight].def_nr=def_nr;
-
- dv->totweight++;
- break;
- }
-}
-
-/* called while not in editmode */
-void add_vert_to_defgroup (Object *ob, bDeformGroup *dg, int vertnum,
- float weight, int assignmode)
-{
- /* add the vert to the deform group with the
- * specified assign mode
- */
- int def_nr;
-
- /* get the deform group number, exit if
- * it can't be found
- */
- def_nr = get_defgroup_num(ob, dg);
- if (def_nr < 0) return;
-
- /* if there's no deform verts then
- * create some
- */
- if(ob->type==OB_MESH) {
- if (!((Mesh*)ob->data)->dvert)
- create_dverts(ob->data);
- }
- else if(ob->type==OB_LATTICE) {
- if (!((Lattice*)ob->data)->dvert)
- create_dverts(ob->data);
- }
-
- /* call another function to do the work
- */
- add_vert_defnr (ob, def_nr, vertnum, weight, assignmode);
-}
-
-/* Only available in editmode */
-void assign_verts_defgroup (Object *obedit, float weight)
-{
- Object *ob;
- EditVert *eve;
- bDeformGroup *dg, *eg;
- MDeformWeight *newdw;
- MDeformVert *dvert;
- int i, done;
-
-// XXX if(multires_level1_test()) return;
-
- ob= obedit;
-
- if (!ob)
- return;
-
- dg=BLI_findlink(&ob->defbase, ob->actdef-1);
- if (!dg){
- error ("No vertex group is active");
- return;
- }
-
- switch (ob->type){
- case OB_MESH:
- {
- Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- if (!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT))
- EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT);
-
- /* Go through the list of editverts and assign them */
- for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if (dvert && (eve->f & 1)){
- done=0;
- /* See if this vert already has a reference to this group */
- /* If so: Change its weight */
- done=0;
- for (i=0; i<dvert->totweight; i++){
- eg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
- /* Find the actual group */
- if (eg==dg){
- dvert->dw[i].weight= weight;
- done=1;
- break;
- }
- }
- /* If not: Add the group and set its weight */
- if (!done){
- newdw = MEM_callocN (sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight");
- if (dvert->dw){
- memcpy (newdw, dvert->dw, sizeof(MDeformWeight)*dvert->totweight);
- MEM_freeN (dvert->dw);
- }
- dvert->dw=newdw;
-
- dvert->dw[dvert->totweight].weight= weight;
- dvert->dw[dvert->totweight].def_nr= ob->actdef-1;
-
- dvert->totweight++;
-
- }
- }
- }
- BKE_mesh_end_editmesh(me, em);
- }
- break;
- case OB_LATTICE:
- {
- Lattice *lt= def_get_lattice(ob);
- BPoint *bp;
- int a, tot;
-
- if(lt->dvert==NULL)
- create_dverts(&lt->id);
-
- tot= lt->pntsu*lt->pntsv*lt->pntsw;
- for(a=0, bp= lt->def; a<tot; a++, bp++) {
- if(bp->f1 & SELECT)
- add_vert_defnr (ob, ob->actdef-1, a, weight, WEIGHT_REPLACE);
- }
- }
- break;
- default:
- printf ("Assigning deformation groups to unknown object type\n");
- break;
- }
-
-}
-
-/* mesh object mode, lattice can be in editmode */
-void remove_vert_defgroup (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)
- return;
-
- /* get the deform number that cooresponds
- * to this deform group, and abort if it
- * can not be found.
- */
- def_nr = get_defgroup_num(ob, dg);
- if (def_nr < 0) return;
-
- /* call another routine to do the work
- */
- remove_vert_def_nr (ob, def_nr, vertnum);
-}
-
-/* for mesh in object mode lattice can be in editmode */
-static float get_vert_def_nr (Object *ob, int def_nr, int vertnum)
-{
- MDeformVert *dvert= NULL;
- int i;
-
- /* get the deform vertices corresponding to the
- * vertnum
- */
- if(ob->type==OB_MESH) {
- if( ((Mesh*)ob->data)->dvert )
- dvert = ((Mesh*)ob->data)->dvert + vertnum;
- }
- else if(ob->type==OB_LATTICE) {
- Lattice *lt= def_get_lattice(ob);
-
- if(lt->dvert)
- dvert = lt->dvert + vertnum;
- }
-
- if(dvert==NULL)
- return 0.0f;
-
- for(i=dvert->totweight-1 ; i>=0 ; i--)
- if(dvert->dw[i].def_nr == def_nr)
- return dvert->dw[i].weight;
-
- return 0.0f;
-}
-
-/* mesh object mode, lattice can be in editmode */
-float get_vert_defgroup (Object *ob, bDeformGroup *dg, int vertnum)
-{
- int def_nr;
-
- if(!ob)
- return 0.0f;
-
- def_nr = get_defgroup_num(ob, dg);
- if(def_nr < 0) return 0.0f;
-
- return get_vert_def_nr (ob, def_nr, vertnum);
-}
-
-/* Only available in editmode */
-/* removes from active defgroup, if allverts==0 only selected vertices */
-void remove_verts_defgroup (Object *obedit, int allverts)
-{
- Object *ob;
- EditVert *eve;
- MDeformVert *dvert;
- MDeformWeight *newdw;
- bDeformGroup *dg, *eg;
- int i;
-
-// XXX if(multires_level1_test()) return;
-
- ob= obedit;
-
- if (!ob)
- return;
-
- dg=BLI_findlink(&ob->defbase, ob->actdef-1);
- if (!dg){
- error ("No vertex group is active");
- return;
- }
-
- switch (ob->type){
- case OB_MESH:
- {
- Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if (dvert && dvert->dw && ((eve->f & 1) || allverts)){
- for (i=0; i<dvert->totweight; i++){
- /* Find group */
- eg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
- if (eg == dg){
- dvert->totweight--;
- if (dvert->totweight){
- newdw = MEM_mallocN (sizeof(MDeformWeight)*(dvert->totweight), "deformWeight");
-
- if (dvert->dw){
- memcpy (newdw, dvert->dw, sizeof(MDeformWeight)*i);
- memcpy (newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
- MEM_freeN (dvert->dw);
- }
- dvert->dw=newdw;
- }
- else{
- MEM_freeN (dvert->dw);
- dvert->dw=NULL;
- break;
- }
- }
- }
- }
- }
- BKE_mesh_end_editmesh(me, em);
- }
- break;
- case OB_LATTICE:
- {
- Lattice *lt= def_get_lattice(ob);
-
- if(lt->dvert) {
- BPoint *bp;
- int a, tot= lt->pntsu*lt->pntsv*lt->pntsw;
-
- for(a=0, bp= lt->def; a<tot; a++, bp++) {
- if(allverts || (bp->f1 & SELECT))
- remove_vert_defgroup (ob, dg, a);
- }
- }
- }
- break;
-
- default:
- printf ("Removing deformation groups from unknown object type\n");
- break;
- }
-}
-
-/* Only available in editmode */
-/* removes from all defgroup, if allverts==0 only selected vertices */
-void remove_verts_defgroups(Object *obedit, int allverts)
-{
- Object *ob;
- int actdef, defCount;
-
-// XXX if (multires_level1_test()) return;
-
- ob= obedit;
- if (ob == NULL) return;
-
- actdef= ob->actdef;
- defCount= BLI_countlist(&ob->defbase);
-
- if (defCount == 0) {
- error("Object has no vertex groups");
- return;
- }
-
- /* To prevent code redundancy, we just use remove_verts_defgroup, 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++)
- remove_verts_defgroup(ob, allverts);
-
- ob->actdef= actdef;
-}
-
-void vertexgroup_select_by_name(Object *ob, char *name)
-{
- bDeformGroup *curdef;
- int actdef= 1;
-
- if(ob==NULL) return;
-
- for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++){
- if (!strcmp(curdef->name, name)) {
- ob->actdef= actdef;
- return;
- }
- }
- ob->actdef=0; // this signals on painting to create a new one, if a bone in posemode is selected */
-}
-
-/* This function provides a shortcut for adding/removing verts from
- * vertex groups. It is called by the Ctrl-G hotkey in EditMode for Meshes
- * and Lattices. (currently only restricted to those two)
- * It is only responsible for
- */
-void vgroup_assign_with_menu(Scene *scene, Object *ob)
-{
- VPaint *wp= scene->toolsettings->wpaint;
- int defCount;
- int mode= 0;
-
- /* prevent crashes */
- if (wp==NULL || ob==NULL) return;
-
- defCount= BLI_countlist(&ob->defbase);
-
- /* give user choices of adding to current/new or removing from current */
-// XXX if (defCount && ob->actdef)
-// mode = pupmenu("Vertex Groups %t|Add Selected to New Group %x1|Add Selected to Active Group %x2|Remove Selected from Active Group %x3|Remove Selected from All Groups %x4");
-// else
-// mode= pupmenu("Vertex Groups %t|Add Selected to New Group %x1");
-
- /* handle choices */
- switch (mode) {
- case 1: /* add to new group */
- add_defgroup(ob);
- assign_verts_defgroup(ob, wp->brush->alpha);
- BIF_undo_push("Assign to vertex group");
- break;
- case 2: /* add to current group */
- assign_verts_defgroup(ob, wp->brush->alpha);
- BIF_undo_push("Assign to vertex group");
- break;
- case 3: /* remove from current group */
- remove_verts_defgroup(ob, 0);
- BIF_undo_push("Remove from vertex group");
- break;
- case 4: /* remove from all groups */
- remove_verts_defgroups(ob, 0);
- BIF_undo_push("Remove from all vertex groups");
- break;
- }
-}
-
-/* This function provides a shortcut for commonly used vertex group
- * functions - change weight (not implemented), change active group, delete active group,
- * when Ctrl-Shift-G is used in EditMode, for Meshes and Lattices (only for now).
- */
-void vgroup_operation_with_menu(Object *ob)
-{
- int defCount;
- int mode= 0;
-
- /* prevent crashes and useless cases */
- if (ob==NULL) return;
-
- defCount= BLI_countlist(&ob->defbase);
- if (defCount == 0) return;
-
- /* give user choices of adding to current/new or removing from current */
-// XXX if (ob->actdef)
-// mode = pupmenu("Vertex Groups %t|Change Active Group%x1|Delete Active Group%x2|Delete All Groups%x3");
-// else
-// mode= pupmenu("Vertex Groups %t|Change Active Group%x1|Delete All Groups%x3");
-
- /* handle choices */
- switch (mode) {
- case 1: /* change active group*/
- {
- char *menustr= NULL; // XXX get_vertexgroup_menustr(ob);
- short nr;
-
- if (menustr) {
-// XXX nr= pupmenu(menustr);
-
- if ((nr >= 1) && (nr <= defCount))
- ob->actdef= nr;
-
- MEM_freeN(menustr);
- }
- }
- break;
- case 2: /* delete active group */
- {
- del_defgroup(ob);
- BIF_undo_push("Delete vertex group");
- }
- break;
- case 3: /* delete all groups */
- {
- del_all_defgroups(ob);
- BIF_undo_push("Delete all vertex groups");
- }
- break;
- }
-}
-
-
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index 7f5201f4704..980d699dda5 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -67,6 +67,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_pointcache.h"
#include "BKE_softbody.h"
#include "BKE_texture.h"
@@ -74,12 +75,12 @@
#include "LBM_fluidsim.h"
-#include "BIF_retopo.h"
#include "ED_mesh.h"
#include "ED_object.h"
-#include "ED_util.h"
+#include "ED_retopo.h"
#include "ED_screen.h"
+#include "ED_util.h"
#include "ED_view3d.h"
#include "RNA_access.h"
@@ -742,78 +743,6 @@ static void edge_drawflags(Mesh *me, EditMesh *em)
}
}
-static int editmesh_pointcache_edit(Scene *scene, Object *ob, int totvert, PTCacheID *pid_p, float mat[][4], int load)
-{
- Cloth *cloth;
- SoftBody *sb;
- ClothModifierData *clmd;
- PTCacheID pid, tmpid;
- int cfra= (int)scene->r.cfra, found= 0;
-
- pid.cache= NULL;
-
- /* check for cloth */
- if(modifiers_isClothEnabled(ob)) {
- clmd= (ClothModifierData*)modifiers_findByType(ob, eModifierType_Cloth);
- cloth= clmd->clothObject;
-
- BKE_ptcache_id_from_cloth(&tmpid, ob, clmd);
-
- /* verify vertex count and baked status */
- if(cloth && (totvert == cloth->numverts)) {
- if((tmpid.cache->flag & PTCACHE_BAKED) && (tmpid.cache->flag & PTCACHE_BAKE_EDIT)) {
- pid= tmpid;
-
- if(load && (pid.cache->flag & PTCACHE_BAKE_EDIT_ACTIVE))
- found= 1;
- }
- }
- }
-
- /* check for softbody */
- if(!found && ob->soft) {
- sb= ob->soft;
-
- BKE_ptcache_id_from_softbody(&tmpid, ob, sb);
-
- /* verify vertex count and baked status */
- if(sb->bpoint && (totvert == sb->totpoint)) {
- if((tmpid.cache->flag & PTCACHE_BAKED) && (tmpid.cache->flag & PTCACHE_BAKE_EDIT)) {
- pid= tmpid;
-
- if(load && (pid.cache->flag & PTCACHE_BAKE_EDIT_ACTIVE))
- found= 1;
- }
- }
- }
-
- /* if not making editmesh verify editing was active for this point cache */
- if(load) {
- if(found)
- pid.cache->flag &= ~PTCACHE_BAKE_EDIT_ACTIVE;
- else
- return 0;
- }
-
- /* check if we have cache for this frame */
- if(pid.cache && BKE_ptcache_id_exist(&pid, cfra)) {
- *pid_p = pid;
-
- if(load) {
- Mat4CpyMat4(mat, ob->obmat);
- }
- else {
- pid.cache->editframe= cfra;
- pid.cache->flag |= PTCACHE_BAKE_EDIT_ACTIVE;
- Mat4Invert(mat, ob->obmat); /* ob->imat is not up to date */
- }
-
- return 1;
- }
-
- return 0;
-}
-
/* turns Mesh into editmesh */
void make_editMesh(Scene *scene, Object *ob)
{
@@ -827,11 +756,8 @@ void make_editMesh(Scene *scene, Object *ob)
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
- PTCacheID pid;
- Cloth *cloth;
- SoftBody *sb;
- float cacheco[3], cachemat[4][4], *co;
- int tot, a, cacheedit= 0, eekadoodle= 0;
+ float *co;
+ int tot, a, eekadoodle= 0;
if(me->edit_mesh==NULL)
me->edit_mesh= MEM_callocN(sizeof(EditMesh), "editmesh");
@@ -866,32 +792,16 @@ void make_editMesh(Scene *scene, Object *ob)
CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
- cacheedit= editmesh_pointcache_edit(scene, ob, tot, &pid, cachemat, 0);
-
evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist");
for(a=0; a<tot; a++, mvert++) {
- if(cacheedit) {
- if(pid.type == PTCACHE_TYPE_CLOTH) {
- cloth= ((ClothModifierData*)pid.data)->clothObject;
- VECCOPY(cacheco, cloth->verts[a].x)
- }
- else if(pid.type == PTCACHE_TYPE_SOFTBODY) {
- sb= (SoftBody*)pid.data;
- VECCOPY(cacheco, sb->bpoint[a].pos)
- }
-
- Mat4MulVecfl(cachemat, cacheco);
- co= cacheco;
- }
- else
- co= mvert->co;
+ co= mvert->co;
eve= addvertlist(em, co, NULL);
evlist[a]= eve;
// face select sets selection in next loop
- if( (FACESEL_PAINT_TEST)==0 )
+ if(!paint_facesel_test(ob))
eve->f |= (mvert->flag & 1);
if (mvert->flag & ME_HIDE) eve->h= 1;
@@ -966,7 +876,7 @@ void make_editMesh(Scene *scene, Object *ob)
if(mface->flag & ME_FACE_SEL) {
efa->f |= SELECT;
- if(FACESEL_PAINT_TEST) {
+ if(paint_facesel_test(ob)) {
EM_select_face(efa, 1); /* flush down */
}
}
@@ -1010,11 +920,6 @@ void make_editMesh(Scene *scene, Object *ob)
if (EM_get_actFace(em, 0)==NULL) {
EM_set_actFace(em, em->faces.first ); /* will use the first face, this is so we alwats have an active face */
}
-
- /* vertex coordinates change with cache edit, need to recalc */
- if(cacheedit)
- recalc_editnormals(em);
-
}
/* makes Mesh out of editmesh */
@@ -1030,12 +935,8 @@ void load_editMesh(Scene *scene, Object *ob)
EditFace *efa, *efa_act;
EditEdge *eed;
EditSelection *ese;
- SoftBody *sb;
- Cloth *cloth;
- ClothModifierData *clmd;
- PTCacheID pid;
- float *fp, *newkey, *oldkey, nor[3], cacheco[3], cachemat[4][4];
- int i, a, ototvert, cacheedit= 0;
+ float *fp, *newkey, *oldkey, nor[3];
+ int i, a, ototvert;
/* this one also tests of edges are not in faces: */
/* eed->f2==0: not in face, f2==1: draw it */
@@ -1089,50 +990,10 @@ void load_editMesh(Scene *scene, Object *ob)
eve= em->verts.first;
a= 0;
- /* check for point cache editing */
- cacheedit= editmesh_pointcache_edit(scene, ob, em->totvert, &pid, cachemat, 1);
-
while(eve) {
- if(cacheedit) {
- if(pid.type == PTCACHE_TYPE_CLOTH) {
- clmd= (ClothModifierData*)pid.data;
- cloth= clmd->clothObject;
-
- /* assign position */
- VECCOPY(cacheco, cloth->verts[a].x)
- VECCOPY(cloth->verts[a].x, eve->co);
- Mat4MulVecfl(cachemat, cloth->verts[a].x);
-
- /* find plausible velocity, not physical correct but gives
- * nicer results when commented */
- VECSUB(cacheco, cloth->verts[a].x, cacheco);
- VecMulf(cacheco, clmd->sim_parms->stepsPerFrame*10.0f);
- VECADD(cloth->verts[a].v, cloth->verts[a].v, cacheco);
- }
- else if(pid.type == PTCACHE_TYPE_SOFTBODY) {
- sb= (SoftBody*)pid.data;
-
- /* assign position */
- VECCOPY(cacheco, sb->bpoint[a].pos)
- VECCOPY(sb->bpoint[a].pos, eve->co);
- Mat4MulVecfl(cachemat, sb->bpoint[a].pos);
+ VECCOPY(mvert->co, eve->co);
- /* changing velocity for softbody doesn't seem to give
- * good results? */
-#if 0
- VECSUB(cacheco, sb->bpoint[a].pos, cacheco);
- VecMulf(cacheco, sb->minloops*10.0f);
- VECADD(sb->bpoint[a].vec, sb->bpoint[a].pos, cacheco);
-#endif
- }
-
- if(oldverts)
- VECCOPY(mvert->co, oldverts[a].co)
- }
- else
- VECCOPY(mvert->co, eve->co);
-
- mvert->mat_nr= 255; /* what was this for, halos? */
+ mvert->mat_nr= 32767; /* what was this for, halos? */
/* vertex normal */
VECCOPY(nor, eve->no);
@@ -1154,14 +1015,6 @@ void load_editMesh(Scene *scene, Object *ob)
eve= eve->next;
mvert++;
}
-
- /* write changes to cache */
- if(cacheedit) {
- if(pid.type == PTCACHE_TYPE_CLOTH)
- cloth_write_cache(ob, pid.data, pid.cache->editframe);
- else if(pid.type == PTCACHE_TYPE_SOFTBODY)
- sbWriteCache(ob, pid.cache->editframe);
- }
/* the edges */
a= 0;
@@ -1218,14 +1071,14 @@ void load_editMesh(Scene *scene, Object *ob)
/* mat_nr in vertex */
if(me->totcol>1) {
mvert= me->mvert+mface->v1;
- if(mvert->mat_nr == (char)255) mvert->mat_nr= mface->mat_nr;
+ if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
mvert= me->mvert+mface->v2;
- if(mvert->mat_nr == (char)255) mvert->mat_nr= mface->mat_nr;
+ if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
mvert= me->mvert+mface->v3;
- if(mvert->mat_nr == (char)255) mvert->mat_nr= mface->mat_nr;
+ 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)255) mvert->mat_nr= mface->mat_nr;
+ if(mvert->mat_nr == (char)32767) mvert->mat_nr= mface->mat_nr;
}
}
@@ -1427,7 +1280,7 @@ void load_editMesh(Scene *scene, Object *ob)
void remake_editMesh(Scene *scene, Object *ob)
{
make_editMesh(scene, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Undo all changes");
}
@@ -1537,8 +1390,8 @@ static int mesh_separate_selected(Scene *scene, Base *editbase)
/* hashedges are invalid now, make new! */
editMesh_set_hash(em);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- DAG_object_flush_update(scene, basenew->object, OB_RECALC_DATA);
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_flush_update(&basenew->object->id, OB_RECALC_DATA);
BKE_mesh_end_editmesh(me, em);
@@ -1606,17 +1459,17 @@ static int mesh_separate_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Base *base= CTX_data_active_base(C);
- int retval= 0;
+ int retval= 0, type= RNA_enum_get(op->ptr, "type");
- if(RNA_enum_is_equal(op->ptr, "type", "SELECTED"))
+ if(type == 0)
retval= mesh_separate_selected(scene, base);
- else if(RNA_enum_is_equal(op->ptr, "type", "MATERIAL"))
+ else if(type == 1)
retval= mesh_separate_material (scene, base);
- else if(RNA_enum_is_equal(op->ptr, "type", "LOOSE"))
+ else if(type == 2)
retval= mesh_separate_loose(scene, base);
if(retval) {
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, base->object);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
return OPERATOR_FINISHED;
}
return OPERATOR_CANCELLED;
@@ -1625,7 +1478,8 @@ static int mesh_separate_exec(bContext *C, wmOperator *op)
void MESH_OT_separate(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mesh Separate";
+ ot->name= "Separate";
+ ot->description= "Separate selected geometry into a new mesh.";
ot->idname= "MESH_OT_separate";
/* api callbacks */
@@ -1669,8 +1523,8 @@ typedef struct EditEdgeC
typedef struct EditFaceC
{
int v1, v2, v3, v4;
- unsigned char mat_nr, flag, f, h, fgonf;
- short pad1;
+ unsigned char flag, f, h, fgonf, pad1;
+ short mat_nr;
} EditFaceC;
typedef struct EditSelectionC{
@@ -1947,26 +1801,35 @@ void EM_init_index_arrays(EditMesh *em, int forVert, int forEdge, int forFace)
if (forVert) {
em->totvert= BLI_countlist(&em->verts);
- g_em_vert_array = MEM_mallocN(sizeof(*g_em_vert_array)*em->totvert, "em_v_arr");
- for (i=0,eve=em->verts.first; eve; i++,eve=eve->next)
- g_em_vert_array[i] = eve;
+ if(em->totvert) {
+ g_em_vert_array = MEM_mallocN(sizeof(*g_em_vert_array)*em->totvert, "em_v_arr");
+
+ for (i=0,eve=em->verts.first; eve; i++,eve=eve->next)
+ g_em_vert_array[i] = eve;
+ }
}
if (forEdge) {
em->totedge= BLI_countlist(&em->edges);
- g_em_edge_array = MEM_mallocN(sizeof(*g_em_edge_array)*em->totedge, "em_e_arr");
- for (i=0,eed=em->edges.first; eed; i++,eed=eed->next)
- g_em_edge_array[i] = eed;
+ if(em->totedge) {
+ g_em_edge_array = MEM_mallocN(sizeof(*g_em_edge_array)*em->totedge, "em_e_arr");
+
+ for (i=0,eed=em->edges.first; eed; i++,eed=eed->next)
+ g_em_edge_array[i] = eed;
+ }
}
if (forFace) {
em->totface= BLI_countlist(&em->faces);
- g_em_face_array = MEM_mallocN(sizeof(*g_em_face_array)*em->totface, "em_f_arr");
- for (i=0,efa=em->faces.first; efa; i++,efa=efa->next)
- g_em_face_array[i] = efa;
+ if(em->totface) {
+ g_em_face_array = MEM_mallocN(sizeof(*g_em_face_array)*em->totface, "em_f_arr");
+
+ for (i=0,efa=em->faces.first; efa; i++,efa=efa->next)
+ g_em_face_array[i] = efa;
+ }
}
}
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index 8483aee52f4..4af5ddf56fa 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -61,15 +61,15 @@
#include "BKE_utildefines.h"
#include "BKE_report.h"
-#include "BIF_retopo.h"
-
#include "WM_api.h"
#include "WM_types.h"
#include "ED_mesh.h"
+#include "ED_retopo.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_util.h"
#include "ED_view3d.h"
-#include "ED_screen.h"
#include "mesh_intern.h"
@@ -217,8 +217,8 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
}
//retopo_do_all();
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
- DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, vc.obedit->data);
+ DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -227,6 +227,7 @@ void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Duplicate or Extrude at 3D Cursor";
+ ot->description= "Duplicate and extrude selected vertices, edges or faces towards 3D Cursor.";
ot->idname= "MESH_OT_dupli_extrude_cursor";
/* api callbacks */
@@ -342,9 +343,8 @@ 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_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -358,6 +358,7 @@ void MESH_OT_fgon_make(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Make F-gon";
+ ot->description= "Make fgon from selected faces.";
ot->idname= "MESH_OT_fgon_make";
/* api callbacks */
@@ -374,9 +375,8 @@ 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_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -390,6 +390,7 @@ void MESH_OT_fgon_clear(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clear F-gon";
+ ot->description= "Clear fgon from selected face.";
ot->idname= "MESH_OT_fgon_clear";
/* api callbacks */
@@ -663,7 +664,7 @@ void addfaces_from_edgenet(EditMesh *em)
EM_select_flush(em);
-// XXX DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// XXX DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
static void addedgeface_mesh(EditMesh *em, wmOperator *op)
@@ -692,7 +693,7 @@ static void addedgeface_mesh(EditMesh *em, wmOperator *op)
eed= addedgelist(em, neweve[0], neweve[1], NULL);
EM_select_edge(eed, 1);
- // XXX DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ // XXX DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return;
}
else if(amount > 4) {
@@ -789,9 +790,8 @@ static int addedgeface_mesh_exec(bContext *C, wmOperator *op)
addedgeface_mesh(em, op);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -801,6 +801,7 @@ void MESH_OT_edge_face_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Make Edge/Face";
+ ot->description= "Add an edge or face to selected.";
ot->idname= "MESH_OT_edge_face_add";
/* api callbacks */
@@ -1104,7 +1105,7 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
}
dia*=200;
- for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0,1,0);
+ for(a=1; a<subdiv; a++) esubdivideflag(obedit, em, 2, dia, 0, B_SPHERE,1,0);
/* and now do imat */
eve= em->verts.first;
while(eve) {
@@ -1281,9 +1282,9 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
Mat4One(primmat);
- if(rv3d)
+ if(rv3d && (U.flag & USER_ADD_VIEWALIGNED)) {
Mat3CpyMat4(vmat, rv3d->viewmat);
- else
+ } else
Mat3One(vmat);
/* inverse transform for view and object */
@@ -1295,9 +1296,9 @@ static float new_primitive_matrix(bContext *C, float primmat[][4])
/* center */
curs= give_cursor(scene, v3d);
VECCOPY(primmat[3], curs);
+ VECSUB(primmat[3], primmat[3], obedit->obmat[3]);
Mat3Inv(imat, mat);
Mat3MulVecfl(imat, primmat[3]);
- VECSUB(primmat[3], primmat[3], obedit->obmat[3]);
if(v3d) return v3d->grid;
return 1.0f;
@@ -1316,7 +1317,8 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_PLANE, mat, 4, 0, 0, dia, 0.0f, 0, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1325,6 +1327,7 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Plane";
+ ot->description= "Construct a filled planar mesh with 4 vertices.";
ot->idname= "MESH_OT_primitive_plane_add";
/* api callbacks */
@@ -1346,7 +1349,8 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_CUBE, mat, 4, 0, 0, dia, 1.0f, 1, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1355,6 +1359,7 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Cube";
+ ot->description= "Construct a cube mesh.";
ot->idname= "MESH_OT_primitive_cube_add";
/* api callbacks */
@@ -1376,7 +1381,8 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_CIRCLE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 0.0f, 0,
RNA_boolean_get(op->ptr, "fill"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1385,6 +1391,7 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Circle";
+ ot->description= "Construct a circle mesh.";
ot->idname= "MESH_OT_primitive_circle_add";
/* api callbacks */
@@ -1411,7 +1418,8 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia,
RNA_float_get(op->ptr, "depth"), 1, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1420,6 +1428,7 @@ void MESH_OT_primitive_cylinder_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Cylinder";
+ ot->description= "Construct a cylindrical mesh (ends filled).";
ot->idname= "MESH_OT_primitive_cylinder_add";
/* api callbacks */
@@ -1446,7 +1455,8 @@ static int add_primitive_tube_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia,
RNA_float_get(op->ptr, "depth"), 1, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1455,6 +1465,7 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Tube";
+ ot->description= "Construct a cylindrical mesh (ends not filled).";
ot->idname= "MESH_OT_primitive_tube_add";
/* api callbacks */
@@ -1481,7 +1492,8 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_CONE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia,
RNA_float_get(op->ptr, "depth"), 0, RNA_boolean_get(op->ptr, "cap_end"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1490,6 +1502,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Cone";
+ ot->description= "Construct a conic mesh (ends filled).";
ot->idname= "MESH_OT_primitive_cone_add";
/* api callbacks */
@@ -1518,7 +1531,8 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_GRID, mat, RNA_int_get(op->ptr, "x_subdivisions"),
RNA_int_get(op->ptr, "y_subdivisions"), 0, dia, 0.0f, 0, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1527,6 +1541,7 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Grid";
+ ot->description= "Construct a grid mesh.";
ot->idname= "MESH_OT_primitive_grid_add";
/* api callbacks */
@@ -1551,7 +1566,8 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_MONKEY, mat, 0, 0, 2, 0.0f, 0.0f, 0, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1560,6 +1576,7 @@ void MESH_OT_primitive_monkey_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Monkey";
+ ot->description= "Construct a Suzanne mesh.";
ot->idname= "MESH_OT_primitive_monkey_add";
/* api callbacks */
@@ -1581,7 +1598,8 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_UVSPHERE, mat, RNA_int_get(op->ptr, "rings"),
RNA_int_get(op->ptr, "segments"), 0, dia, 0.0f, 0, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1590,6 +1608,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add UV Sphere";
+ ot->description= "Construct a UV sphere mesh.";
ot->idname= "MESH_OT_primitive_uv_sphere_add";
/* api callbacks */
@@ -1616,7 +1635,8 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
make_prim(obedit, PRIM_ICOSPHERE, mat, 0, 0,
RNA_int_get(op->ptr, "subdivisions"), dia, 0.0f, 0, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -1625,6 +1645,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Ico Sphere";
+ ot->description= "Construct an Icosphere mesh.";
ot->idname= "MESH_OT_primitive_ico_sphere_add";
/* api callbacks */
@@ -1639,3 +1660,46 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, "Size", "", 0.001f, 100.00);
}
+/****************** add duplicate operator ***************/
+
+static int mesh_duplicate_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh(ob->data);
+
+ adduplicateflag(em, SELECT);
+
+ BKE_mesh_end_editmesh(ob->data, em);
+
+ DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ 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)
+{
+ WM_cursor_wait(1);
+ mesh_duplicate_exec(C, op);
+ WM_cursor_wait(0);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_duplicate(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Duplicate";
+ ot->description= "Duplicate selected vertices, edges or faces.";
+ ot->idname= "MESH_OT_duplicate";
+
+ /* api callbacks */
+ ot->invoke= mesh_duplicate_invoke;
+ ot->exec= mesh_duplicate_exec;
+
+ ot->poll= ED_operator_editmesh;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c
index afbf43c4d85..28103828dd4 100644
--- a/source/blender/editors/mesh/editmesh_loop.c
+++ b/source/blender/editors/mesh/editmesh_loop.c
@@ -60,6 +60,7 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv
#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_report.h"
#include "BKE_utildefines.h"
#include "PIL_time.h"
@@ -199,6 +200,7 @@ static void edgering_sel(EditMesh *em, EditEdge *startedge, int select, int prev
}
}
}
+
void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts)
{
ViewContext vc; // XXX
@@ -369,9 +371,9 @@ void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts)
fac= 1.0f;
// XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
fac= 0.292f*fac;
- esubdivideflag(obedit, em, SELECT,fac,B_SMOOTH,numcuts,SUBDIV_SELECT_LOOPCUT);
+ esubdivideflag(obedit, em, SELECT,fac,0,B_SMOOTH,numcuts,SUBDIV_SELECT_LOOPCUT);
} else {
- esubdivideflag(obedit, em, SELECT,0,0,numcuts,SUBDIV_SELECT_LOOPCUT);
+ esubdivideflag(obedit, em, SELECT,0,0,0,numcuts,SUBDIV_SELECT_LOOPCUT);
}
/* if this was a single cut, enter edgeslide mode */
if(numcuts == 1 && hasHidden == 0){
@@ -389,7 +391,7 @@ void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts)
EM_selectmode_set(em);
}
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return;
}
@@ -636,6 +638,10 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
int len=0;
short numcuts=1, mode= RNA_int_get(op->ptr, "type");
+ /* edit-object needed for matrix, and ar->regiondata for projections to work */
+ if (ELEM3(NULL, obedit, ar, ar->regiondata))
+ return OPERATOR_CANCELLED;
+
if (EM_nvertices_selected(em) < 2) {
error("No edges are selected to operate on");
BKE_mesh_end_editmesh(obedit->data, em);
@@ -689,9 +695,9 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
eed= eed->next;
}
- if (mode==KNIFE_MIDPOINT) esubdivideflag(obedit, em, SELECT, 0, B_KNIFE, 1, SUBDIV_SELECT_ORIG);
- else if (mode==KNIFE_MULTICUT) esubdivideflag(obedit, em, SELECT, 0, B_KNIFE, numcuts, SUBDIV_SELECT_ORIG);
- else esubdivideflag(obedit, em, SELECT, 0, B_KNIFE|B_PERCENTSUBD, 1, SUBDIV_SELECT_ORIG);
+ if (mode==KNIFE_MIDPOINT) esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE, 1, SUBDIV_SELECT_ORIG);
+ else if (mode==KNIFE_MULTICUT) esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE, numcuts, SUBDIV_SELECT_ORIG);
+ else esubdivideflag(obedit, em, SELECT, 0, 0, B_KNIFE|B_PERCENTSUBD, 1, SUBDIV_SELECT_ORIG);
eed=em->edges.first;
while(eed){
@@ -703,6 +709,10 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN);
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -712,13 +722,14 @@ void MESH_OT_knife_cut(wmOperatorType *ot)
PropertyRNA *prop;
ot->name= "Knife Cut";
+ ot->description= "Cut selected edges and faces into parts.";
ot->idname= "MESH_OT_knife_cut";
ot->invoke= WM_gesture_lines_invoke;
ot->modal= WM_gesture_lines_modal;
ot->exec= knife_cut_exec;
- ot->poll= ED_operator_editmesh;
+ ot->poll= EM_view3d_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index 70a0c6b82da..325a1aeec99 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -39,7 +39,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "MEM_guardedalloc.h"
-#include "MTC_matrixops.h"
+
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
@@ -65,6 +65,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
+#include "BKE_paint.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BKE_report.h"
@@ -92,7 +93,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BLO_sys_types.h" // for intptr_t support
/* XXX */
-static void waitcursor() {}
+static void waitcursor(int val) {}
static int pupmenu() {return 0;}
/* ****************************** MIRROR **************** */
@@ -126,7 +127,7 @@ void EM_automerge(int update)
// if (len) {
// em->totvert -= len; /* saves doing a countall */
// if (update) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
// }
// }
// }
@@ -242,7 +243,7 @@ int EM_mask_init_backbuf_border(ViewContext *vc, short mcords[][2], short tot, s
/* method in use for face selecting too */
if(vc->obedit==NULL) {
- if(FACESEL_PAINT_TEST);
+ if(paint_facesel_test(vc->obact));
else return 0;
}
else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
@@ -297,7 +298,7 @@ int EM_init_backbuf_circle(ViewContext *vc, short xs, short ys, short rads)
/* method in use for face selecting too */
if(vc->obedit==NULL) {
- if(FACESEL_PAINT_TEST);
+ if(paint_facesel_test(vc->obact));
else return 0;
}
else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
@@ -642,25 +643,24 @@ static int unified_findnearest(ViewContext *vc, EditVert **eve, EditEdge **eed,
/* **************** SIMILAR "group" SELECTS. FACE, EDGE AND VERTEX ************** */
-/* selects new faces/edges/verts based on the
- existing selection
+/* selects new faces/edges/verts based on the existing selection */
-FACES GROUP
- mode 1: same material
- mode 2: same image
- mode 3: same area
- mode 4: same perimeter
- mode 5: same normal
- mode 6: same co-planer
-*/
+/* FACES GROUP */
+
+#define SIMFACE_MATERIAL 201
+#define SIMFACE_IMAGE 202
+#define SIMFACE_AREA 203
+#define SIMFACE_PERIMETER 204
+#define SIMFACE_NORMAL 205
+#define SIMFACE_COPLANAR 206
static EnumPropertyItem prop_simface_types[] = {
- {1, "MATERIAL", 0, "Material", ""},
- {2, "IMAGE", 0, "Image", ""},
- {3, "AREA", 0, "Area", ""},
- {4, "PERIMETER", 0, "Perimeter", ""},
- {5, "NORMAL", 0, "Normal", ""},
- {6, "COPLANAR", 0, "Co-planar", ""},
+ {SIMFACE_MATERIAL, "MATERIAL", 0, "Material", ""},
+ {SIMFACE_IMAGE, "IMAGE", 0, "Image", ""},
+ {SIMFACE_AREA, "AREA", 0, "Area", ""},
+ {SIMFACE_PERIMETER, "PERIMETER", 0, "Perimeter", ""},
+ {SIMFACE_NORMAL, "NORMAL", 0, "Normal", ""},
+ {SIMFACE_COPLANAR, "COPLANAR", 0, "Co-planar", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -695,12 +695,11 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
if (!ok || !deselcount) /* no data selected OR no more data to select */
return 0;
- /*if mode is 3 then record face areas, 4 record perimeter */
- if (mode==3) {
+ if (mode==SIMFACE_AREA) {
for(efa= em->faces.first; efa; efa= efa->next) {
efa->tmp.fp= EM_face_area(efa);
}
- } else if (mode==4) {
+ } else if (mode==SIMFACE_PERIMETER) {
for(efa= em->faces.first; efa; efa= efa->next) {
efa->tmp.fp= EM_face_perimeter(efa);
}
@@ -708,7 +707,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
for(base_efa= em->faces.first; base_efa; base_efa= base_efa->next) {
if (base_efa->f1) { /* This was one of the faces originaly selected */
- if (mode==1) { /* same material */
+ if (mode==SIMFACE_MATERIAL) { /* same material */
for(efa= em->faces.first; efa; efa= efa->next) {
if (
!(efa->f & SELECT) &&
@@ -722,7 +721,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==2) { /* same image */
+ } else if (mode==SIMFACE_IMAGE) { /* same image */
MTFace *tf, *base_tf;
base_tf = (MTFace*)CustomData_em_get(&em->fdata, base_efa->data,
@@ -745,7 +744,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
}
}
}
- } else if (mode==3 || mode==4) { /* same area OR same perimeter, both use the same temp var */
+ } else if (mode==SIMFACE_AREA || mode==SIMFACE_PERIMETER) { /* same area OR same perimeter, both use the same temp var */
for(efa= em->faces.first; efa; efa= efa->next) {
if (
(!(efa->f & SELECT) && !efa->h) &&
@@ -758,11 +757,11 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==5) { /* same normal */
+ } else if (mode==SIMFACE_NORMAL) {
float angle;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= VecAngle2(base_efa->n, efa->n);
+ angle= RAD2DEG(VecAngle2(base_efa->n, efa->n));
if (angle/180.0<=thresh) {
EM_select_face(efa, 1);
selcount++;
@@ -772,12 +771,12 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode)
}
}
}
- } else if (mode==6) { /* same planer */
+ } else if (mode==SIMFACE_COPLANAR) { /* same planer */
float angle, base_dot, dot;
base_dot= Inpf(base_efa->cent, base_efa->n);
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= VecAngle2(base_efa->n, efa->n);
+ angle= RAD2DEG(VecAngle2(base_efa->n, efa->n));
if (angle/180.0<=thresh) {
dot=Inpf(efa->cent, base_efa->n);
if (fabs(base_dot-dot) <= thresh) {
@@ -808,7 +807,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
EM_selectmode_flush(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(me, em);
return OPERATOR_FINISHED;
}
@@ -817,49 +816,30 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void MESH_OT_faces_select_similar(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Similar Face Select";
- ot->idname= "MESH_OT_faces_select_similar";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= similar_face_select_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* properties */
- RNA_def_enum(ot->srna, "type", prop_simface_types, 0, "Type", "");
-}
-
/* ***************************************************** */
-/*
-EDGE GROUP
- mode 1: same length
- mode 2: same direction
- mode 3: same number of face users
- mode 4: similar face angles.
- mode 5: similar crease
- mode 6: similar seam
- mode 7: similar sharp
-*/
+/* EDGE GROUP */
+
+#define SIMEDGE_LENGTH 101
+#define SIMEDGE_DIR 102
+#define SIMEDGE_FACE 103
+#define SIMEDGE_FACE_ANGLE 104
+#define SIMEDGE_CREASE 105
+#define SIMEDGE_SEAM 106
+#define SIMEDGE_SHARP 107
static EnumPropertyItem prop_simedge_types[] = {
- {1, "LENGTH", 0, "Length", ""},
- {2, "DIR", 0, "Direction", ""},
- {3, "FACE", 0, "Amount of Vertices in Face", ""},
- {4, "FACE_ANGLE", 0, "Face Angles", ""},
- {5, "CREASE", 0, "Crease", ""},
- {6, "SEAM", 0, "Seam", ""},
- {7, "SHARP", 0, "Sharpness", ""},
+ {SIMEDGE_LENGTH, "LENGTH", 0, "Length", ""},
+ {SIMEDGE_DIR, "DIR", 0, "Direction", ""},
+ {SIMEDGE_FACE, "FACE", 0, "Amount of Vertices in Face", ""},
+ {SIMEDGE_FACE_ANGLE, "FACE_ANGLE", 0, "Face Angles", ""},
+ {SIMEDGE_CREASE, "CREASE", 0, "Crease", ""},
+ {SIMEDGE_SEAM, "SEAM", 0, "Seam", ""},
+ {SIMEDGE_SHARP, "SHARP", 0, "Sharpness", ""},
{0, NULL, 0, NULL, NULL}
};
-static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
+static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mode)
{
EditEdge *eed, *base_eed=NULL;
unsigned int selcount=0; /* count how many new edges we select*/
@@ -869,7 +849,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
unsigned int deselcount=0;
short ok=0;
- float thresh= scene->toolsettings->select_thresh;
+ float thresh= ts->select_thresh;
for(eed= em->edges.first; eed; eed= eed->next) {
if (!eed->h) {
@@ -883,19 +863,19 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
/* set all eed->tmp.l to 0 we use it later.
for counting face users*/
eed->tmp.l=0;
- eed->f2=0; /* only for mode 4, edge animations */
+ eed->f2=0; /* only for mode SIMEDGE_FACE_ANGLE, edge animations */
}
}
if (!ok || !deselcount) /* no data selected OR no more data to select*/
return 0;
- if (mode==1) { /*store length*/
+ if (mode==SIMEDGE_LENGTH) { /*store length*/
for(eed= em->edges.first; eed; eed= eed->next) {
if (!eed->h) /* dont calc data for hidden edges*/
eed->tmp.fp= VecLenf(eed->v1->co, eed->v2->co);
}
- } else if (mode==3) { /*store face users*/
+ } else if (mode==SIMEDGE_FACE) { /*store face users*/
EditFace *efa;
/* cound how many faces each edge uses use tmp->l */
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -904,7 +884,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
efa->e3->tmp.l++;
if (efa->e4) efa->e4->tmp.l++;
}
- } else if (mode==4) { /*store edge angles */
+ } else if (mode==SIMEDGE_FACE_ANGLE) { /*store edge angles */
EditFace *efa;
int j;
/* cound how many faces each edge uses use tmp.l */
@@ -936,7 +916,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
else if (eed->f2==0) /* first access, assign the face */
eed->tmp.f= efa;
else if (eed->f2==1) /* second, we assign the angle*/
- eed->tmp.fp= VecAngle2(eed->tmp.f->n, efa->n)/180;
+ eed->tmp.fp= RAD2DEG(VecAngle2(eed->tmp.f->n, efa->n))/180;
eed->f2++; /* f2==0 no face assigned. f2==1 one face found. f2==2 angle calculated.*/
}
j++;
@@ -946,7 +926,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
for(base_eed= em->edges.first; base_eed; base_eed= base_eed->next) {
if (base_eed->f1) {
- if (mode==1) { /* same length */
+ if (mode==SIMEDGE_LENGTH) { /* same length */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -960,13 +940,13 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==2) { /* same direction */
+ } else if (mode==SIMEDGE_DIR) { /* same direction */
float base_dir[3], dir[3], angle;
VecSubf(base_dir, base_eed->v1->co, base_eed->v2->co);
for(eed= em->edges.first; eed; eed= eed->next) {
if (!(eed->f & SELECT) && !eed->h) {
VecSubf(dir, eed->v1->co, eed->v2->co);
- angle= VecAngle2(base_dir, dir);
+ angle= RAD2DEG(VecAngle2(base_dir, dir));
if (angle>90) /* use the smallest angle between the edges */
angle= fabs(angle-180.0f);
@@ -980,7 +960,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
}
}
}
- } else if (mode==3) { /* face users */
+ } else if (mode==SIMEDGE_FACE) { /* face users */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -994,7 +974,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==4 && base_eed->f2==2) { /* edge angles, f2==2 means the edge has an angle. */
+ } else if (mode==SIMEDGE_FACE_ANGLE && base_eed->f2==2) { /* edge angles, f2==2 means the edge has an angle. */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -1009,7 +989,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==5) { /* edge crease */
+ } else if (mode==SIMEDGE_CREASE) { /* edge crease */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -1023,7 +1003,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==6) { /* edge seam */
+ } else if (mode==SIMEDGE_SEAM) { /* edge seam */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -1037,7 +1017,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
return selcount;
}
}
- } else if (mode==7) { /* edge sharp */
+ } else if (mode==SIMEDGE_SHARP) { /* edge sharp */
for(eed= em->edges.first; eed; eed= eed->next) {
if (
!(eed->f & SELECT) &&
@@ -1059,17 +1039,17 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
/* wrap the above function but do selection flushing edge to face */
static int similar_edge_select_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
+ 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(scene, em, RNA_int_get(op->ptr, "type"));
+ int selcount = similar_edge_select__internal(ts, em, RNA_int_get(op->ptr, "type"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
EM_selectmode_flush(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(me, em);
return OPERATOR_FINISHED;
}
@@ -1078,24 +1058,6 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void MESH_OT_edges_select_similar(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Similar Edge Select";
- ot->idname= "MESH_OT_edges_select_similar";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= similar_edge_select_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* properties */
- RNA_def_enum(ot->srna, "type", prop_simedge_types, 0, "Type", "");
-}
-
/* ********************************* */
/*
@@ -1104,17 +1066,22 @@ VERT GROUP
mode 2: same number of face users
mode 3: same vertex groups
*/
+
+#define SIMVERT_NORMAL 0
+#define SIMVERT_FACE 1
+#define SIMVERT_VGROUP 2
+
static EnumPropertyItem prop_simvertex_types[] = {
- {0, "NORMAL", 0, "Normal", ""},
- {1, "FACE", 0, "Amount of Vertices in Face", ""},
- {2, "VGROUP", 0, "Vertex Groups", ""},
+ {SIMVERT_NORMAL, "NORMAL", 0, "Normal", ""},
+ {SIMVERT_FACE, "FACE", 0, "Amount of Vertices in Face", ""},
+ {SIMVERT_VGROUP, "VGROUP", 0, "Vertex Groups", ""},
{0, NULL, 0, NULL, NULL}
};
static int similar_vert_select_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
+ 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);
@@ -1124,9 +1091,10 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
/*count how many visible selected edges there are,
so we can return when there are none left */
unsigned int deselcount=0;
+ int mode= RNA_enum_get(op->ptr, "type");
short ok=0;
- float thresh= scene->toolsettings->select_thresh;
+ float thresh= ts->select_thresh;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!eve->h) {
@@ -1148,7 +1116,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
return 0;
}
- if(RNA_enum_is_equal(op->ptr, "type", "FACE")) {
+ if(mode == SIMVERT_FACE) {
/* store face users */
EditFace *efa;
@@ -1165,11 +1133,11 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
for(base_eve= em->verts.first; base_eve; base_eve= base_eve->next) {
if (base_eve->f1) {
- if(RNA_enum_is_equal(op->ptr, "type", "NORMAL")) {
+ if(mode == SIMVERT_NORMAL) {
float angle;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!(eve->f & SELECT) && !eve->h) {
- angle= VecAngle2(base_eve->no, eve->no);
+ angle= RAD2DEG(VecAngle2(base_eve->no, eve->no));
if (angle/180.0<=thresh) {
eve->f |= SELECT;
selcount++;
@@ -1182,7 +1150,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
}
}
}
- else if(RNA_enum_is_equal(op->ptr, "type", "FACE")) {
+ else if(mode == SIMVERT_FACE) {
for(eve= em->verts.first; eve; eve= eve->next) {
if (
!(eve->f & SELECT) &&
@@ -1199,7 +1167,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
}
}
}
- else if(RNA_enum_is_equal(op->ptr, "type", "VGROUP")) {
+ else if(mode == SIMVERT_VGROUP) {
MDeformVert *dvert, *base_dvert;
short i, j; /* weight index */
@@ -1239,7 +1207,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
} /* end basevert loop */
if(selcount) {
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(me, em);
return OPERATOR_FINISHED;
}
@@ -1248,22 +1216,76 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void MESH_OT_vertices_select_similar(wmOperatorType *ot)
+static int select_similar_exec(bContext *C, wmOperator *op)
{
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if(type < 100)
+ return similar_vert_select_exec(C, op);
+ else if(type < 200)
+ return similar_edge_select_exec(C, op);
+ else
+ return similar_face_select_exec(C, op);
+}
+
+static EnumPropertyItem *select_similar_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Object *obedit;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(C==NULL) {
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, prop_simvertex_types);
+ RNA_enum_items_add(&item, &totitem, prop_simedge_types);
+ RNA_enum_items_add(&item, &totitem, prop_simface_types);
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+ }
+
+ obedit= CTX_data_edit_object(C);
+
+ if(obedit && obedit->type == OB_MESH) {
+ EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+
+ if(em->selectmode & SCE_SELECT_VERTEX)
+ RNA_enum_items_add(&item, &totitem, prop_simvertex_types);
+ else if(em->selectmode & SCE_SELECT_EDGE)
+ RNA_enum_items_add(&item, &totitem, prop_simedge_types);
+ else if(em->selectmode & SCE_SELECT_FACE)
+ RNA_enum_items_add(&item, &totitem, prop_simface_types);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
+ return NULL;
+}
+
+void MESH_OT_select_similar(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
/* identifiers */
- ot->name= "Similar Vertex Select";
- ot->idname= "MESH_OT_vertices_select_similar";
+ ot->name= "Select Similar";
+ ot->description= "Select similar vertices, edges or faces by property types.";
+ ot->idname= "MESH_OT_select_similar";
/* api callbacks */
ot->invoke= WM_menu_invoke;
- ot->exec= similar_vert_select_exec;
+ ot->exec= select_similar_exec;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", prop_simvertex_types, 0, "Type", "");
+ prop= RNA_def_enum(ot->srna, "type", prop_simvertex_types, 0, "Type", "");
+ RNA_def_enum_funcs(prop, select_similar_type_itemf);
}
/* ******************************************* */
@@ -1391,7 +1413,7 @@ void EM_mesh_copy_edge(EditMesh *em, short type)
}
if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -1422,7 +1444,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_ERROR, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1443,7 +1465,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_ERROR, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1456,7 +1478,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_ERROR, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1469,7 +1491,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_ERROR, "Mesh has no uv/image layers.");
return;
}
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -1483,7 +1505,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_ERROR, "Mesh has no color layers.");
return;
} else {
/* guess the 4th color if needs be */
@@ -1519,7 +1541,7 @@ void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type)
}
if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -1649,7 +1671,7 @@ void EM_mesh_copy_face_layer(EditMesh *em, wmOperator *op, short type)
}
if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
}
@@ -1969,7 +1991,7 @@ static int loop_multiselect(bContext *C, wmOperator *op)
MEM_freeN(edarray);
// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1979,6 +2001,7 @@ void MESH_OT_loop_multi_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Multi Select Loops";
+ ot->description= "Select a loop of connected edges by connection type.";
ot->idname= "MESH_OT_loop_multi_select";
/* api callbacks */
@@ -2010,6 +2033,9 @@ static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring
vc.mval[0]= mval[0];
vc.mval[1]= mval[1];
em= vc.em;
+
+ /* no afterqueue (yet), so we check it now, otherwise the em_xxxofs indices are bad */
+ view3d_validate_backbuf(&vc);
eed= findnearestedge(&vc, &dist);
if(eed) {
@@ -2037,7 +2063,7 @@ static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring
EM_selectmode_flush(em);
// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
}
}
@@ -2057,6 +2083,7 @@ void MESH_OT_loop_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Loop Select";
+ ot->description= "Select a loop of connected edges.";
ot->idname= "MESH_OT_loop_select";
/* api callbacks */
@@ -2086,6 +2113,9 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
vc.mval[1]= mval[1];
em= vc.em;
+ /* no afterqueue (yet), so we check it now, otherwise the em_xxxofs indices are bad */
+ view3d_validate_backbuf(&vc);
+
eed= findnearestedge(&vc, &dist);
if(eed) {
Mesh *me= vc.obedit->data;
@@ -2135,9 +2165,8 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
break;
}
- DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+ DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
}
}
@@ -2156,6 +2185,7 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Shortest Path Select";
+ ot->description= "Select shortest path between two selections.";
ot->idname= "MESH_OT_select_shortest_path";
/* api callbacks */
@@ -2236,7 +2266,7 @@ void mouse_mesh(bContext *C, short mval[2], short extend)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
}
@@ -2380,12 +2410,12 @@ static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event
/* return warning! */
if(limit) {
int retval= select_linked_limited_invoke(&vc, 0, sel);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return retval;
}
if( unified_findnearest(&vc, &eve, &eed, &efa)==0 ) {
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_CANCELLED;
}
@@ -2439,7 +2469,7 @@ static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event
// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
@@ -2447,6 +2477,7 @@ void MESH_OT_select_linked_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked";
+ ot->description= "(un)select all vertices linked to the active mesh.";
ot->idname= "MESH_OT_select_linked_pick";
/* api callbacks */
@@ -2519,7 +2550,7 @@ static int select_linked_exec(bContext *C, wmOperator *op)
else
selectconnected_mesh_all(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2529,6 +2560,7 @@ void MESH_OT_select_linked(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked All";
+ ot->description= "Select all vertices linked to the active mesh.";
ot->idname= "MESH_OT_select_linked";
/* api callbacks */
@@ -2644,7 +2676,7 @@ void EM_hide_mesh(EditMesh *em, int swap)
em->totedgesel= em->totfacesel= em->totvertsel= 0;
// if(EM_texFaceCheck())
- // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ // DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
static int hide_mesh_exec(bContext *C, wmOperator *op)
@@ -2654,7 +2686,7 @@ static int hide_mesh_exec(bContext *C, wmOperator *op)
EM_hide_mesh(em, RNA_boolean_get(op->ptr, "unselected"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2664,6 +2696,7 @@ void MESH_OT_hide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Hide Selection";
+ ot->description= "Hide (un)selected vertices, edges or faces.";
ot->idname= "MESH_OT_hide";
/* api callbacks */
@@ -2710,7 +2743,7 @@ void EM_reveal_mesh(EditMesh *em)
EM_selectmode_flush(em);
// if (EM_texFaceCheck())
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
static int reveal_mesh_exec(bContext *C, wmOperator *op)
@@ -2720,7 +2753,7 @@ static int reveal_mesh_exec(bContext *C, wmOperator *op)
EM_reveal_mesh(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2730,6 +2763,7 @@ void MESH_OT_reveal(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reveal Hidden";
+ ot->description= "Reveal all hidden vertices, edges and faces.";
ot->idname= "MESH_OT_reveal";
/* api callbacks */
@@ -2740,20 +2774,24 @@ void MESH_OT_reveal(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void select_faces_by_numverts(EditMesh *em, wmOperator *op, int numverts)
+int select_by_number_vertices_exec(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
EditFace *efa;
+ int numverts= RNA_enum_get(op->ptr, "type");
/* Selects trias/qiads or isolated verts, and edges that do not have 2 neighboring
* faces
*/
/* for loose vertices/edges, we first select all, loop below will deselect */
- if(numverts==5)
+ if(numverts==5) {
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");
- return;
+ return OPERATOR_CANCELLED;
}
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -2765,8 +2803,33 @@ void select_faces_by_numverts(EditMesh *em, wmOperator *op, int numverts)
}
}
-// if (EM_texFaceCheck())
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_by_number_vertices(wmOperatorType *ot)
+{
+ static const EnumPropertyItem type_items[]= {
+ {3, "TRIANGLES", 0, "Triangles", NULL},
+ {4, "QUADS", 0, "Triangles", NULL},
+ {5, "OTHER", 0, "Other", NULL},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Select by Number of Vertices";
+ ot->description= "Select vertices or faces by vertex count.";
+ ot->idname= "MESH_OT_select_by_number_vertices";
+
+ /* api callbacks */
+ ot->exec= select_by_number_vertices_exec;
+ ot->poll= ED_operator_editmesh;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_enum(ot->srna, "type", type_items, 3, "Type", "Type of elements to select.");
}
static int select_sharp_edges_exec(bContext *C, wmOperator *op)
@@ -2866,7 +2929,7 @@ static int select_sharp_edges_exec(bContext *C, wmOperator *op)
// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); //TODO is this needed ?
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); //TODO is this needed ?
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2876,6 +2939,7 @@ void MESH_OT_edges_select_sharp(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Sharp Edges";
+ ot->description= "Marked selected edges as sharp.";
ot->idname= "MESH_OT_edges_select_sharp";
/* api callbacks */
@@ -3033,7 +3097,7 @@ static int select_linked_flat_faces_exec(bContext *C, wmOperator *op)
select_linked_flat_faces(em, op, RNA_float_get(op->ptr, "sharpness"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3043,6 +3107,7 @@ void MESH_OT_faces_select_linked_flat(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked Flat Faces";
+ ot->description= "Select linked faces by angle.";
ot->idname= "MESH_OT_faces_select_linked_flat";
/* api callbacks */
@@ -3133,7 +3198,7 @@ static int select_non_manifold_exec(bContext *C, wmOperator *op)
select_non_manifold(em, op);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3143,6 +3208,7 @@ void MESH_OT_select_non_manifold(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Non Manifold";
+ ot->description= "Select all non-manifold vertices or edges.";
ot->idname= "MESH_OT_select_non_manifold";
/* api callbacks */
@@ -3189,27 +3255,28 @@ void EM_select_swap(EditMesh *em) /* exported for UV */
}
-static int select_invert_mesh_exec(bContext *C, wmOperator *op)
+static int select_inverse_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
EM_select_swap(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
-void MESH_OT_select_invert(wmOperatorType *ot)
+void MESH_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select Invert";
- ot->idname= "MESH_OT_select_invert";
+ ot->name= "Select Inverse";
+ ot->description= "Select inverse of (un)selected vertices, edges or faces.";
+ ot->idname= "MESH_OT_select_inverse";
/* api callbacks */
- ot->exec= select_invert_mesh_exec;
+ ot->exec= select_inverse_mesh_exec;
ot->poll= ED_operator_editmesh;
/* flags */
@@ -3226,6 +3293,11 @@ void EM_toggle_select_all(EditMesh *em) /* exported for UV */
EM_set_flag_all(em, SELECT);
}
+void EM_select_all(EditMesh *em)
+{
+ EM_set_flag_all(em, SELECT);
+}
+
static int toggle_select_all_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
@@ -3233,7 +3305,7 @@ static int toggle_select_all_exec(bContext *C, wmOperator *op)
EM_toggle_select_all(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3243,6 +3315,7 @@ void MESH_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select/Deselect All";
+ ot->description= "(de)select all vertices, edges or faces.";
ot->idname= "MESH_OT_select_all_toggle";
/* api callbacks */
@@ -3303,7 +3376,7 @@ static int select_more(bContext *C, wmOperator *op)
// if (EM_texFaceCheck(em))
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3313,6 +3386,7 @@ void MESH_OT_select_more(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select More";
+ ot->description= "Select more vertices, edges or faces connected to initial selection.";
ot->idname= "MESH_OT_select_more";
/* api callbacks */
@@ -3392,7 +3466,7 @@ static int select_less(bContext *C, wmOperator *op)
EM_select_less(em);
// if (EM_texFaceCheck(em))
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3402,6 +3476,7 @@ void MESH_OT_select_less(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Less";
+ ot->description= "Select less vertices, edges or faces connected to initial selection.";
ot->idname= "MESH_OT_select_less";
/* api callbacks */
@@ -3461,7 +3536,7 @@ static int mesh_select_random_exec(bContext *C, wmOperator *op)
selectrandom_mesh(em, RNA_float_get(op->ptr,"percent"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3471,17 +3546,19 @@ void MESH_OT_select_random(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Random";
+ ot->description= "Randomly select vertices.";
ot->idname= "MESH_OT_select_random";
/* api callbacks */
ot->exec= mesh_select_random_exec;
+ ot->invoke= WM_operator_props_popup;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "Percentage of vertices to select randomly.", 0.0001f, 1.0f);
+ RNA_def_float_percentage(ot->srna, "percent", 50.0f, 0.0f, 100.0f, "Percent", "Percentage of vertices to select randomly.", 0.0001f, 1.0f);
}
void EM_select_by_material(EditMesh *em, int index)
@@ -3510,7 +3587,7 @@ void EM_deselect_by_material(EditMesh *em, int index)
EM_selectmode_flush(em);
}
-static void mesh_selection_type(Scene *scene, EditMesh *em, int val)
+static void mesh_selection_type(ToolSettings *ts, EditMesh *em, int val)
{
if(val>0) {
if(val==1) {
@@ -3531,7 +3608,7 @@ static void mesh_selection_type(Scene *scene, EditMesh *em, int val)
/* note, em stores selectmode to be able to pass it on everywhere without scene,
this is only until all select modes and toolsettings are settled more */
- scene->toolsettings->selectmode= em->selectmode;
+ ts->selectmode= em->selectmode;
// if (EM_texFaceCheck())
}
}
@@ -3545,13 +3622,13 @@ static EnumPropertyItem prop_mesh_edit_types[] = {
static int mesh_selection_type_exec(bContext *C, wmOperator *op)
{
-
+ ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
- mesh_selection_type(CTX_data_scene(C), em, RNA_enum_get(op->ptr,"type"));
+ mesh_selection_type(ts, em, RNA_enum_get(op->ptr,"type"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3561,6 +3638,7 @@ void MESH_OT_selection_type(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Selection Mode";
+ ot->description= "Set the selection mode type.";
ot->idname= "MESH_OT_selection_type";
/* api callbacks */
@@ -3610,16 +3688,19 @@ static int editmesh_mark_seam(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
void MESH_OT_mark_seam(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mark seam";
+ ot->name= "Mark Seam";
+ ot->description= "(un)mark selected edges as a seam.";
ot->idname= "MESH_OT_mark_seam";
/* api callbacks */
@@ -3637,15 +3718,15 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
Mesh *me= ((Mesh *)obedit->data);
- int set = RNA_boolean_get(op->ptr, "set");
+ int clear = RNA_boolean_get(op->ptr, "clear");
EditEdge *eed;
/* auto-enable sharp edge drawing */
- if(set) {
+ if(clear == 0) {
me->drawflag |= ME_DRAWSHARP;
}
- if(set) {
+ if(!clear) {
eed= em->edges.first;
while(eed) {
if(!eed->h && (eed->f & SELECT)) eed->sharp = 1;
@@ -3659,16 +3740,19 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
void MESH_OT_mark_sharp(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mark sharp";
+ ot->name= "Mark Sharp";
+ ot->description= "(un)mark selected edges as sharp.";
ot->idname= "MESH_OT_mark_sharp";
/* api callbacks */
@@ -3678,167 +3762,9 @@ void MESH_OT_mark_sharp(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_boolean(ot->srna, "set", 0, "Set", "");
-}
-
-void BME_Menu() {
- short ret;
- ret= pupmenu("BME modeller%t|Select Edges of Vert%x1");
-
- switch(ret)
- {
- case 1:
- //BME_edges_of_vert();
- break;
- }
-}
-
-
-
-void Vertex_Menu(EditMesh *em)
-{
- short ret;
- ret= pupmenu("Vertex Specials%t|Remove Doubles%x1|Merge%x2|Smooth %x3|Select Vertex Path%x4|Blend From Shape%x5|Propagate To All Shapes%x6");
-
- switch(ret)
- {
- case 1:
-// XXX notice("Removed %d Vertices", removedoublesflag(1, 0, scene->toolsettings->doublimit));
- break;
- case 2:
-// XXX mergemenu(em);
- break;
- case 3:
-// XXX vertexsmooth(em);
- break;
- case 4:
-// XXX pathselect(em);
- break;
- case 5:
-// XXX shape_copy_select_from(em);
- break;
- case 6:
-// XXX shape_propagate(em);
- break;
- }
- /* some items crashed because this is in the original W menu but not here. should really manage this better */
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-}
-
-
-void Edge_Menu(EditMesh *em)
-{
- short ret;
-
- ret= pupmenu("Edge Specials%t|Mark Seam %x1|Clear Seam %x2|Rotate Edge CW%x3|Rotate Edge CCW%x4|Loopcut%x6|Edge Slide%x5|Edge Loop Select%x7|Edge Ring Select%x8|Loop to Region%x9|Region to Loop%x10|Mark Sharp%x11|Clear Sharp%x12");
-
- switch(ret)
- {
- case 1:
- //editmesh_mark_seam(em, 0);
- break;
- case 2:
- //editmesh_mark_seam(em, 1);
- break;
- case 3:
-// edge_rotate_selected(em, 2);
- break;
- case 4:
-// edge_rotate_selected(em, 1);
- break;
- case 5:
-// EdgeSlide(em, 0,0.0);
- break;
- case 6:
-// CutEdgeloop(em, 1);
- break;
- case 7:
-// loop_multiselect(em, 0);
- break;
- case 8:
-// loop_multiselect(em, 1);
- break;
- case 9:
-// loop_to_region(em);
- break;
- case 10:
-// region_to_loop(em);
- break;
- case 11:
-// editmesh_mark_sharp(em, 1);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 12:
-// editmesh_mark_sharp(em, 0);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- }
- /* some items crashed because this is in the original W menu but not here. should really manage this better */
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-}
-
-void Face_Menu(EditMesh *em)
-{
- short ret;
- ret= pupmenu(
- "Face Specials%t|Flip Normals%x1|Bevel%x2|Shade Smooth%x3|Shade Flat%x4|"
- "Triangulate (Ctrl T)%x5|Quads from Triangles (Alt J)%x6|Flip Triangle Edges (Ctrl Shift F)%x7|%l|"
- "Face Mode Set%x8|Face Mode Clear%x9|%l|"
- "UV Rotate (Shift - CCW)%x10|UV Mirror (Shift - Switch Axis)%x11|"
- "Color Rotate (Shift - CCW)%x12|Color Mirror (Shift - Switch Axis)%x13");
-
- switch(ret)
- {
- case 1:
-// flip_editnormals(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 2:
-// bevel_menu(em);
- break;
- case 3:
-// mesh_set_smooth_faces(em, 1);
- break;
- case 4:
-// mesh_set_smooth_faces(em, 0);
- break;
-
- case 5: /* Quads to Tris */
-// convert_to_triface(em, 0);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 6: /* Tris to Quads */
-// join_triangles(em);
- break;
- case 7: /* Flip triangle edges */
-// edge_flip(em);
- break;
- case 8:
-// mesh_set_face_flags(em, 1);
- break;
- case 9:
-// mesh_set_face_flags(em, 0);
- break;
-
- /* uv texface options */
- case 10:
-// mesh_rotate_uvs(em);
- break;
- case 11:
-// mesh_mirror_uvs(em);
- break;
- case 12:
-// mesh_rotate_colors(em);
- break;
- case 13:
-// mesh_mirror_colors(em);
- break;
- }
- /* some items crashed because this is in the original W menu but not here. should really manage this better */
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ RNA_def_boolean(ot->srna, "clear", 0, "Clear", "");
}
-
/* **************** NORMALS ************** */
/* XXX value of select is messed up, it means two things */
@@ -4047,7 +3973,7 @@ void righthandfaces(EditMesh *em, int select) /* makes faces righthand turning *
recalc_editnormals(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
waitcursor(0);
}
@@ -4063,9 +3989,11 @@ static int righthandfaces_exec(bContext *C, wmOperator *op)
// XXX need other args
righthandfaces(em, RNA_boolean_get(op->ptr, "inside"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); //TODO is this needed ?
-
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); //TODO is this needed ?
+
return OPERATOR_FINISHED;
}
@@ -4073,6 +4001,7 @@ void MESH_OT_normals_make_consistent(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Make Normals Consistent";
+ ot->description= "Flip all selected vertex and face normals in a consistent direction.";
ot->idname= "MESH_OT_normals_make_consistent";
/* api callbacks */
@@ -4263,22 +4192,15 @@ void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, wmOperator *o
static int smooth_vertex(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
+ ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
- Mesh *me= obedit->data;
- EditMesh *em= (EditMesh *)me;
-
+ EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
EditVert *eve, *eve_mir = NULL;
EditEdge *eed;
float *adror, *adr, fac;
float fvec[3];
int teller=0;
- ModifierData *md= obedit->modifiers.first;
-
- if(em==NULL) {
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_CANCELLED;
- }
+ ModifierData *md;
/* count */
eve= em->verts.first;
@@ -4306,8 +4228,8 @@ static int smooth_vertex(bContext *C, wmOperator *op)
/* if there is a mirror modifier with clipping, flag the verts that
* are within tolerance of the plane(s) of reflection
*/
- for (; md; md=md->next) {
- if (md->type==eModifierType_Mirror) {
+ for(md=obedit->modifiers.first; md; md=md->next) {
+ if(md->type==eModifierType_Mirror) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
@@ -4358,7 +4280,7 @@ static int smooth_vertex(bContext *C, wmOperator *op)
if(eve->f & SELECT) {
if(eve->f1) {
- if (scene->toolsettings->editbutflag & B_MESH_X_MIRROR) {
+ if (ts->editbutflag & B_MESH_X_MIRROR) {
eve_mir= editmesh_get_x_mirror_vert(obedit, em, eve->co);
}
@@ -4398,11 +4320,25 @@ static int smooth_vertex(bContext *C, wmOperator *op)
recalc_editnormals(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ BKE_mesh_end_editmesh(obedit->data, em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+static int smooth_vertex_exec(bContext *C, wmOperator *op)
+{
+ int repeat = RNA_int_get(op->ptr, "repeat");
+ int i;
+
+ if (!repeat) repeat = 1;
+
+ for (i=0; i<repeat; i++) {
+ smooth_vertex(C, op);
+ }
- BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -4410,14 +4346,17 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth Vertex";
+ ot->description= "Flatten angles of selected vertices.";
ot->idname= "MESH_OT_vertices_smooth";
/* api callbacks */
- ot->exec= smooth_vertex;
+ ot->exec= smooth_vertex_exec;
ot->poll= ED_operator_editmesh;
/* flags */
- ot->flag= OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "repeat", 1, 1, 100, "Smooth Iterations", "", 1, INT_MAX);
}
void vertexnoise(Object *obedit, EditMesh *em)
@@ -4461,7 +4400,7 @@ void vertexnoise(Object *obedit, EditMesh *em)
}
recalc_editnormals(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
@@ -4518,22 +4457,24 @@ static void vertices_to_sphere(Scene *scene, View3D *v3d, Object *obedit, EditMe
}
recalc_editnormals(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
static int vertices_to_sphere_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
View3D *v3d = CTX_wm_view3d(C);
- Scene *scene = CTX_data_scene(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
vertices_to_sphere(scene, v3d, obedit, em, RNA_float_get(op->ptr,"percent"));
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -4541,6 +4482,8 @@ void MESH_OT_vertices_transform_to_sphere(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Vertices to Sphere";
+ //added "around cursor" to differentiate between "TFM_OT_tosphere()"
+ ot->description= "Move selected vertices outward in a spherical shape around cursor.";
ot->idname= "MESH_OT_vertices_transform_to_sphere";
/* api callbacks */
@@ -4574,7 +4517,7 @@ void flipface(EditMesh *em, EditFace *efa)
}
-static int flip_editnormals(bContext *C, wmOperator *op)
+static int flip_normals(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
@@ -4592,19 +4535,25 @@ static int flip_editnormals(bContext *C, wmOperator *op)
recalc_editnormals(em);
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
-void MESH_OT_flip_editnormals(wmOperatorType *ot)
+void MESH_OT_flip_normals(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Flip Normals";
- ot->idname= "MESH_OT_flip_editnormals";
+ ot->description= "Toggle the direction of selected face's vertex and face normals.";
+ ot->idname= "MESH_OT_flip_normals";
/* api callbacks */
- ot->exec= flip_editnormals;
+ ot->exec= flip_normals;
ot->poll= ED_operator_editmesh;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index dc9c8c6b6d2..6e5ce92c904 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -1,4 +1,4 @@
- /* $Id:
+ /* $Id:
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -83,10 +83,10 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
#include "WM_types.h"
#include "ED_mesh.h"
-#include "ED_view3d.h"
-#include "ED_util.h"
#include "ED_screen.h"
-#include "BIF_transform.h"
+#include "ED_transform.h"
+#include "ED_util.h"
+#include "ED_view3d.h"
#include "UI_interface.h"
@@ -94,12 +94,10 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise
/* XXX */
static int extern_qread() {return 0;}
-static void waitcursor() {}
+static void waitcursor(int val) {}
static int pupmenu() {return 0;}
static int qtest() {return 0;}
#define add_numbut(a, b, c, d, e, f, g) {}
-static int snap_sel_to_curs() {return 0;}
-static int snap_to_center() {return 0;}
/* XXX */
@@ -133,7 +131,7 @@ struct facesort {
static int vergface(const void *v1, const void *v2)
{
const struct facesort *x1=v1, *x2=v2;
-
+
if( x1->x > x2->x ) return 1;
else if( x1->x < x2->x) return -1;
return 0;
@@ -142,11 +140,11 @@ static int vergface(const void *v1, const void *v2)
/* *********************************** */
-void convert_to_triface(EditMesh *em, int direction)
+static void convert_to_triface(EditMesh *em, int direction)
{
EditFace *efa, *efan, *next;
float fac;
-
+
efa= em->faces.last;
while(efa) {
next= efa->prev;
@@ -167,17 +165,17 @@ void convert_to_triface(EditMesh *em, int direction)
efan= EM_face_from_faces(em, efa, NULL, 1, 2, 3, -1);
if(efa->f & SELECT) EM_select_face(efan, 1);
}
-
+
BLI_remlink(&em->faces, efa);
free_editface(em, efa);
}
}
efa= next;
}
-
+
EM_fgon_flags(em); // redo flags and indices for fgons
-
+
}
int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /* return amount */
@@ -188,7 +186,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
Used for "Auto Weld" mode. warning.
limit - Quick manhattan distance between verts.
*/
-
+
/* all verts with (flag & 'flag') are being evaluated */
EditVert *eve, *v1, *nextve;
EditEdge *eed, *e1, *nexted;
@@ -196,8 +194,8 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
xvertsort *sortblock, *sb, *sb1;
struct facesort *vlsortblock, *vsb, *vsb1;
int a, b, test, amount;
-
-
+
+
/* flag 128 is cleared, count */
/* Normal non weld operation */
@@ -223,9 +221,9 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
}
qsort(sortblock, amount, sizeof(xvertsort), vergxco);
-
+
/* test for doubles */
- sb= sortblock;
+ sb= sortblock;
if (automerge) {
for(a=0; a<amount; a++, sb++) {
eve= sb->v1;
@@ -233,12 +231,12 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
sb1= sb+1;
for(b=a+1; b<amount && (eve->f & 128)==0; b++, sb1++) {
if(sb1->x - sb->x > limit) break;
-
+
/* when automarge, only allow unselected->selected */
v1= sb1->v1;
if( (v1->f & 128)==0 ) {
if ((eve->f & flag)==0 && (v1->f & flag)==1) {
- if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
(float)fabs(v1->co[1]-eve->co[1])<=limit &&
(float)fabs(v1->co[2]-eve->co[2])<=limit)
{ /* unique bit */
@@ -246,7 +244,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
eve->tmp.v = v1;
}
} else if( (eve->f & flag)==1 && (v1->f & flag)==0 ) {
- if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
(float)fabs(v1->co[1]-eve->co[1])<=limit &&
(float)fabs(v1->co[2]-eve->co[2])<=limit)
{ /* unique bit */
@@ -267,10 +265,10 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
/* first test: simpel dist */
if(sb1->x - sb->x > limit) break;
v1= sb1->v1;
-
+
/* second test: is vertex allowed */
if( (v1->f & 128)==0 ) {
- if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
(float)fabs(v1->co[1]-eve->co[1])<=limit &&
(float)fabs(v1->co[2]-eve->co[2])<=limit)
{
@@ -283,12 +281,12 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
}
}
MEM_freeN(sortblock);
-
+
if (!automerge)
for(eve = em->verts.first; eve; eve=eve->next)
if((eve->f & flag) && (eve->f & 128))
EM_data_interp_from_verts(em, eve, eve->tmp.v, eve->tmp.v, 0.5f);
-
+
/* test edges and insert again */
eed= em->edges.first;
while(eed) {
@@ -327,7 +325,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
else if(efa->v2->f & 128) efa->f1= 1;
else if(efa->v3->f & 128) efa->f1= 1;
else if(efa->v4 && (efa->v4->f & 128)) efa->f1= 1;
-
+
if(efa->f1==1) amount++;
efa= efa->next;
}
@@ -337,12 +335,12 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
while(efa) {
nextvl= efa->next;
if(efa->f1==1) {
-
+
if(efa->v1->f & 128) efa->v1= efa->v1->tmp.v;
if(efa->v2->f & 128) efa->v2= efa->v2->tmp.v;
if(efa->v3->f & 128) efa->v3= efa->v3->tmp.v;
if(efa->v4 && (efa->v4->f & 128)) efa->v4= efa->v4->tmp.v;
-
+
test= 0;
if(efa->v1==efa->v2) test+=1;
if(efa->v2==efa->v3) test+=2;
@@ -350,7 +348,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
if(efa->v4==efa->v1) test+=8;
if(efa->v3==efa->v4) test+=16;
if(efa->v2==efa->v4) test+=32;
-
+
if(test) {
if(efa->v4) {
if(test==1 || test==2) {
@@ -378,7 +376,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
amount--;
}
}
-
+
if(test==0) {
/* set edge pointers */
efa->e1= findedgelist(em, efa->v1, efa->v2);
@@ -423,9 +421,9 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
}
efa= efa->next;
}
-
+
qsort(vlsortblock, amount, sizeof(struct facesort), vergface);
-
+
vsb= vlsortblock;
for(a=0; a<amount; a++) {
efa= vsb->efa;
@@ -433,24 +431,24 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
vsb1= vsb+1;
for(b=a+1; b<amount; b++) {
-
+
/* first test: same pointer? */
if(vsb->x != vsb1->x) break;
-
+
/* second test: is test permitted? */
efa= vsb1->efa;
if( (efa->f1 & 128)==0 ) {
if( compareface(efa, vsb->efa)) efa->f1 |= 128;
-
+
}
vsb1++;
}
}
vsb++;
}
-
+
MEM_freeN(vlsortblock);
-
+
/* remove double faces */
efa= (struct EditFace *)em->faces.first;
while(efa) {
@@ -462,7 +460,7 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
efa= nextvl;
}
}
-
+
/* remove double vertices */
a= 0;
eve= (struct EditVert *)em->verts.first;
@@ -484,36 +482,40 @@ int removedoublesflag(EditMesh *em, short flag, short automerge, float limit) /
static int removedoublesflag_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
- char msg[100];
+ /*char msg[100];
- int cnt = removedoublesflag(em,1,0,scene->toolsettings->doublimit);
+ int cnt = removedoublesflag(em,1,0,RNA_float_get(op->ptr, "limit"));*/
+ /*XXX this messes up last operator panel
if(cnt)
{
sprintf(msg, "Removed %d vertices", cnt);
BKE_report(op->reports, RPT_INFO, msg);
- }
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+ }*/
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void MESH_OT_remove_doubles(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Remove Doubles";
+ ot->description= "Remove duplicate vertices.";
ot->idname= "MESH_OT_remove_doubles";
-
+
/* api callbacks */
ot->exec= removedoublesflag_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_float(ot->srna, "limit", 0.00001f, 0.000001f, 50.0f, "Merge Threshold", "Minimum distance between merged verts", 0.00001f, 10.0f);
}
// XXX is this needed?
@@ -533,18 +535,18 @@ void xsortvert_flag(bContext *C, int flag)
xvertsort *sortblock;
ListBase tbase;
int i, amount;
-
+
em_setup_viewcontext(C, &vc);
-
+
amount = BLI_countlist(&vc.em->verts);
sortblock = MEM_callocN(sizeof(xvertsort)*amount,"xsort");
for (i=0,eve= vc.em->verts.first; eve; i++,eve=eve->next)
if(eve->f & flag)
sortblock[i].v1 = eve;
-
+
mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, 0);
qsort(sortblock, amount, sizeof(xvertsort), vergxco);
-
+
/* make temporal listbase */
tbase.first= tbase.last= 0;
for (i=0; i<amount; i++) {
@@ -555,9 +557,9 @@ void xsortvert_flag(bContext *C, int flag)
BLI_addtail(&tbase, eve);
}
}
-
+
addlisttolist(&vc.em->verts, &tbase);
-
+
MEM_freeN(sortblock);
}
@@ -570,7 +572,7 @@ void hashvert_flag(EditMesh *em, int flag)
struct xvertsort *sortblock, *sb, onth, *newsort;
ListBase tbase;
int amount, a, b;
-
+
/* count */
eve= em->verts.first;
amount= 0;
@@ -579,7 +581,7 @@ void hashvert_flag(EditMesh *em, int flag)
eve= eve->next;
}
if(amount==0) return;
-
+
/* allocate memory */
sb= sortblock= (struct xvertsort *)MEM_mallocN(sizeof(struct xvertsort)*amount,"sortremovedoub");
eve= em->verts.first;
@@ -592,7 +594,7 @@ void hashvert_flag(EditMesh *em, int flag)
}
BLI_srand(1);
-
+
sb= sortblock;
for(a=0; a<amount; a++, sb++) {
b= (int)(amount*BLI_drand());
@@ -613,29 +615,31 @@ void hashvert_flag(EditMesh *em, int flag)
BLI_addtail(&tbase, eve);
sb++;
}
-
+
addlisttolist(&em->verts, &tbase);
-
+
MEM_freeN(sortblock);
}
/* generic extern called extruder */
-void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op)
+void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
{
- Scene *scene= NULL; // XXX CTX!
float nor[3]= {0.0, 0.0, 0.0};
short nr, transmode= 0;
+ /* extrude depends on totvertsel etc */
+ EM_stats_update(em);
+
if(em->selectmode & SCE_SELECT_VERTEX) {
if(em->totvertsel==0) nr= 0;
else if(em->totvertsel==1) nr= 4;
else if(em->totedgesel==0) nr= 4;
- else if(em->totfacesel==0)
+ else if(em->totfacesel==0)
nr= 3; // pupmenu("Extrude %t|Only Edges%x3|Only Vertices%x4");
else if(em->totfacesel==1)
nr= 1; // pupmenu("Extrude %t|Region %x1|Only Edges%x3|Only Vertices%x4");
- else
+ else
nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2|Only Edges%x3|Only Vertices%x4");
}
else if(em->selectmode & SCE_SELECT_EDGE) {
@@ -653,27 +657,27 @@ void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op)
else
nr= 1; // pupmenu("Extrude %t|Region %x1||Individual Faces %x2");
}
-
+
if(nr<1) return;
if(nr==1) transmode= extrudeflag(obedit, em, SELECT, nor);
else if(nr==4) transmode= extrudeflag_verts_indiv(em, SELECT, nor);
else if(nr==3) transmode= extrudeflag_edges_indiv(em, SELECT, nor);
else transmode= extrudeflag_face_indiv(em, SELECT, nor);
-
+
if(transmode==0) {
BKE_report(op->reports, RPT_ERROR, "Not a valid selection for extrude");
}
else {
EM_fgon_flags(em);
-
- /* We need to force immediate calculation here because
+
+ /* We need to force immediate calculation here because
* transform may use derived objects (which are now stale).
*
* This shouldn't be necessary, derived queries should be
* automatically building this data if invalid. Or something.
*/
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
object_handle_update(scene, obedit);
/* individual faces? */
@@ -698,51 +702,62 @@ void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op)
// XXX should be a menu item
static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+// int constraint_axis[3] = {0, 0, 1};
- extrude_mesh(obedit,em, op);
-
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+ extrude_mesh(scene, obedit, em, op);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ RNA_enum_set(op->ptr, "proportional", 0);
+ RNA_boolean_set(op->ptr, "mirror", 0);
+
+ /* the following two should only be set when extruding faces */
+// RNA_enum_set(op->ptr, "constraint_orientation", V3D_MANIP_NORMAL);
+// RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
+
+
+// WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
+ return OPERATOR_FINISHED;
}
/* 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(obedit,em, op);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ extrude_mesh(scene, obedit, em, op);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void MESH_OT_extrude(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Extrude Mesh";
+ ot->name= "Extrude";
+ ot->description= "Extrude selected vertices, edges or faces.";
ot->idname= "MESH_OT_extrude";
-
+
/* api callbacks */
ot->invoke= mesh_extrude_invoke;
ot->exec= mesh_extrude_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
}
static int split_mesh(bContext *C, wmOperator *op)
@@ -760,9 +775,9 @@ static int split_mesh(bContext *C, wmOperator *op)
WM_cursor_wait(0);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -770,13 +785,14 @@ static int split_mesh(bContext *C, wmOperator *op)
void MESH_OT_split(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Split Mesh";
+ ot->name= "Split";
+ ot->description= "Split selected geometry into separate disconnected mesh.";
ot->idname= "MESH_OT_split";
-
+
/* api callbacks */
ot->exec= split_mesh;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -787,10 +803,10 @@ static int extrude_repeat_mesh(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
- RegionView3D *rv3d = ED_view3d_context_rv3d(C);
-
+ RegionView3D *rv3d = ED_view3d_context_rv3d(C);
+
int steps = RNA_int_get(op->ptr,"steps");
-
+
float offs = RNA_float_get(op->ptr,"offset");
float dvec[3], tmat[3][3], bmat[3][3], nor[3]= {0.0, 0.0, 0.0};
@@ -814,14 +830,14 @@ static int extrude_repeat_mesh(bContext *C, wmOperator *op)
extrudeflag(obedit, em, SELECT, nor);
translateflag(em, SELECT, dvec);
}
-
+
recalc_editnormals(em);
-
+
EM_fgon_flags(em);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -830,15 +846,16 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Extrude Repeat Mesh";
+ ot->description= "Extrude selected vertices, edges or faces repeatedly.";
ot->idname= "MESH_OT_extrude_repeat";
-
+
/* api callbacks */
ot->exec= extrude_repeat_mesh;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* props */
RNA_def_float(ot->srna, "offset", 2.0f, 0.0f, 100.0f, "Offset", "", 0.0f, FLT_MAX);
RNA_def_int(ot->srna, "steps", 10, 0, 180, "Steps", "", 0, INT_MAX);
@@ -850,7 +867,7 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot)
static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float degr, int dupli )
{
Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
+ ToolSettings *ts= CTX_data_tool_settings(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditVert *eve,*nextve;
float nor[3]= {0.0f, 0.0f, 0.0f};
@@ -860,7 +877,7 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
short a, ok= 1;
RNA_float_get_array(op->ptr, "center", cent);
-
+
/* imat and center and size */
Mat3CpyMat4(bmat, obedit->obmat);
Mat3Inv(imat,bmat);
@@ -872,7 +889,7 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
phi= degr*M_PI/360.0;
phi/= steps;
- if(scene->toolsettings->editbutflag & B_CLOCKWISE) phi= -phi;
+ if(ts->editbutflag & B_CLOCKWISE) phi= -phi;
RNA_float_get_array(op->ptr, "axis", n);
Normalize(n);
@@ -887,14 +904,14 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
Mat3MulMat3(tmat,cmat,bmat);
Mat3MulMat3(bmat,imat,tmat);
- if(dupli==0)
- if(scene->toolsettings->editbutflag & B_KEEPORIG)
+ if(dupli==0)
+ if(ts->editbutflag & B_KEEPORIG)
adduplicateflag(em, 1);
for(a=0; a<steps; a++) {
if(dupli==0) ok= extrudeflag(obedit, em, SELECT, nor);
else adduplicateflag(em, SELECT);
-
+
if(ok==0)
break;
@@ -922,9 +939,9 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
EM_fgon_flags(em);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
-
+
BKE_mesh_end_editmesh(obedit->data, em);
return ok;
}
@@ -933,14 +950,16 @@ static int spin_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
int ok;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
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");
return OPERATOR_CANCELLED;
}
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -950,10 +969,10 @@ static int spin_mesh_invoke(bContext *C, wmOperator *op, wmEvent *event)
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= ED_view3d_context_rv3d(C);
-
+
RNA_float_set_array(op->ptr, "center", give_cursor(scene, v3d));
RNA_float_set_array(op->ptr, "axis", rv3d->viewinv[2]);
-
+
return spin_mesh_exec(C, op);
}
@@ -961,21 +980,22 @@ void MESH_OT_spin(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Spin";
+ ot->description= "Extrude selected vertices in a circle around the cursor in indicated viewport.";
ot->idname= "MESH_OT_spin";
-
+
/* api callbacks */
ot->invoke= spin_mesh_invoke;
ot->exec= spin_mesh_exec;
ot->poll= EM_view3d_poll;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* props */
RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, INT_MAX);
RNA_def_boolean(ot->srna, "dupli", 0, "Dupli", "Make Duplicates");
RNA_def_float(ot->srna, "degrees", 90.0f, -FLT_MAX, FLT_MAX, "Degrees", "Degrees", -360.0f, 360.0f);
-
+
RNA_def_float_vector(ot->srna, "center", 3, NULL, -FLT_MAX, FLT_MAX, "Center", "Center in global view space", -FLT_MAX, FLT_MAX);
RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -FLT_MAX, FLT_MAX);
@@ -992,7 +1012,7 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
turns= RNA_int_get(op->ptr, "turns");
steps= RNA_int_get(op->ptr, "steps");
-
+
/* clear flags */
for(eve= em->verts.first; eve; eve= eve->next)
eve->f1= 0;
@@ -1036,10 +1056,12 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
dvec[1]= -dvec[1];
dvec[2]= -dvec[2];
}
-
+
if(spin_mesh(C, op, dvec, turns*steps, 360.0f*turns, 0)) {
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- BKE_mesh_end_editmesh(obedit->data, em);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
else {
@@ -1047,8 +1069,6 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
- BKE_mesh_end_editmesh(obedit->data, em);
}
/* get center and axis, in global coords */
@@ -1057,10 +1077,10 @@ static int screw_mesh_invoke(bContext *C, wmOperator *op, wmEvent *event)
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= ED_view3d_context_rv3d(C);
-
+
RNA_float_set_array(op->ptr, "center", give_cursor(scene, v3d));
RNA_float_set_array(op->ptr, "axis", rv3d->viewinv[1]);
-
+
return screw_mesh_exec(C, op);
}
@@ -1068,16 +1088,17 @@ void MESH_OT_screw(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Screw";
+ ot->description= "Extrude selected vertices in screw-shaped rotation around the cursor in indicated viewport.";
ot->idname= "MESH_OT_screw";
-
+
/* api callbacks */
ot->invoke= screw_mesh_invoke;
ot->exec= screw_mesh_exec;
ot->poll= EM_view3d_poll;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/*props */
RNA_def_int(ot->srna, "steps", 9, 0, INT_MAX, "Steps", "Steps", 0, 256);
RNA_def_int(ot->srna, "turns", 1, 0, INT_MAX, "Turns", "Turns", 0, 256);
@@ -1089,7 +1110,7 @@ void MESH_OT_screw(wmOperatorType *ot)
static void erase_edges(EditMesh *em, ListBase *l)
{
EditEdge *ed, *nexted;
-
+
ed = (EditEdge *) l->first;
while(ed) {
nexted= ed->next;
@@ -1115,7 +1136,7 @@ static void erase_faces(EditMesh *em, ListBase *l)
}
f = nextf;
}
-}
+}
static void erase_vertices(EditMesh *em, ListBase *l)
{
@@ -1140,7 +1161,7 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
int count;
char *str="Erase";
-
+
if(event<1) return;
if(event==10 ) {
@@ -1148,7 +1169,7 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
erase_edges(em, &em->edges);
erase_faces(em, &em->faces);
erase_vertices(em, &em->verts);
- }
+ }
else if(event==6) {
if(!EdgeLoopDelete(em, op))
return;
@@ -1189,14 +1210,14 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
if( efa->v2->f & SELECT) event++;
if( efa->v3->f & SELECT) event++;
if(efa->v4 && (efa->v4->f & SELECT)) event++;
-
+
if(event>1) {
BLI_remlink(&em->faces, efa);
free_editface(em, efa);
}
efa= nextvl;
}
- }
+ }
else if(event==1) {
str= "Erase Edges";
// faces first
@@ -1208,7 +1229,7 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
if( efa->e2->f & SELECT) event++;
if( efa->e3->f & SELECT) event++;
if(efa->e4 && (efa->e4->f & SELECT)) event++;
-
+
if(event) {
BLI_remlink(&em->faces, efa);
free_editface(em, efa);
@@ -1267,8 +1288,6 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event)
}
EM_fgon_flags(em); // redo flags and indices for fgons
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
/* Note, these values must match delete_mesh() event values */
@@ -1287,11 +1306,12 @@ static int delete_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- delete_mesh(obedit,em, op,RNA_enum_get(op->ptr, "type"));
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ delete_mesh(obedit, em, op, RNA_enum_get(op->ptr, "type"));
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -1300,17 +1320,18 @@ void MESH_OT_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete";
+ ot->description= "Delete selected vertices, edges or faces.";
ot->idname= "MESH_OT_delete";
-
+
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= delete_mesh_exec;
-
+
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/*props */
RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data");
}
@@ -1329,75 +1350,76 @@ void MESH_OT_delete(wmOperatorType *ot)
#define DOUBLEOPFILL 16
/* calculates offset for co, based on fractal, sphere or smooth settings */
-static void alter_co(float *co, EditEdge *edge, float rad, int beauty, float perc)
+static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int beauty, float perc)
{
float vec1[3], fac;
-
+
if(beauty & B_SMOOTH) {
/* we calculate an offset vector vec1[], to be added to *co */
float len, fac, nor[3], nor1[3], nor2[3];
-
+
VecSubf(nor, edge->v1->co, edge->v2->co);
len= 0.5f*Normalize(nor);
-
+
VECCOPY(nor1, edge->v1->no);
VECCOPY(nor2, edge->v2->no);
-
+
/* cosine angle */
fac= nor[0]*nor1[0] + nor[1]*nor1[1] + nor[2]*nor1[2] ;
-
+
vec1[0]= fac*nor1[0];
vec1[1]= fac*nor1[1];
vec1[2]= fac*nor1[2];
-
+
/* cosine angle */
fac= -nor[0]*nor2[0] - nor[1]*nor2[1] - nor[2]*nor2[2] ;
-
+
vec1[0]+= fac*nor2[0];
vec1[1]+= fac*nor2[1];
vec1[2]+= fac*nor2[2];
-
- vec1[0]*= rad*len;
- vec1[1]*= rad*len;
- vec1[2]*= rad*len;
-
+
+ /* falloff for multi subdivide */
+ smooth *= sqrt(fabs(1.0f - 2.0f*fabs(0.5f-perc)));
+
+ vec1[0]*= smooth*len;
+ vec1[1]*= smooth*len;
+ vec1[2]*= smooth*len;
+
co[0] += vec1[0];
co[1] += vec1[1];
co[2] += vec1[2];
}
- else {
- if(rad > 0.0) { /* subdivide sphere */
- Normalize(co);
- co[0]*= rad;
- co[1]*= rad;
- co[2]*= rad;
- }
- else if(rad< 0.0) { /* fractal subdivide */
- fac= rad* VecLenf(edge->v1->co, edge->v2->co);
- vec1[0]= fac*(float)(0.5-BLI_drand());
- vec1[1]= fac*(float)(0.5-BLI_drand());
- vec1[2]= fac*(float)(0.5-BLI_drand());
- VecAddf(co, co, vec1);
- }
+ else if(beauty & B_SPHERE) { /* subdivide sphere */
+ Normalize(co);
+ co[0]*= smooth;
+ co[1]*= smooth;
+ co[2]*= smooth;
+ }
+ if(beauty & B_FRACTAL) {
+ fac= fractal*VecLenf(edge->v1->co, edge->v2->co);
+ vec1[0]= fac*(float)(0.5-BLI_drand());
+ vec1[1]= fac*(float)(0.5-BLI_drand());
+ vec1[2]= fac*(float)(0.5-BLI_drand());
+ VecAddf(co, co, vec1);
}
}
/* assumes in the edge is the correct interpolated vertices already */
-/* percent defines the interpolation, rad and beauty are for special options */
+/* percent defines the interpolation, smooth, fractal and beauty are for special options */
/* results in new vertex with correct coordinate, vertex normal and weight group info */
-static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float rad, int beauty, float percent)
+static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float smooth, float fractal, int beauty, float percent)
{
EditVert *ev;
float co[3];
-
+
co[0] = (edge->v2->co[0]-edge->v1->co[0])*percent + edge->v1->co[0];
co[1] = (edge->v2->co[1]-edge->v1->co[1])*percent + edge->v1->co[1];
- co[2] = (edge->v2->co[2]-edge->v1->co[2])*percent + edge->v1->co[2];
-
+ co[2] = (edge->v2->co[2]-edge->v1->co[2])*percent + edge->v1->co[2];
+
/* offset for smooth or sphere or fractal */
- alter_co(co, edge, rad, beauty, percent);
-
+ alter_co(co, edge, smooth, fractal, beauty, percent);
+
/* clip if needed by mirror modifier */
if (edge->v1->f2) {
if ( edge->v1->f2 & edge->v2->f2 & 1) {
@@ -1410,18 +1432,18 @@ static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float rad,
co[2]= 0.0f;
}
}
-
+
ev = addvertlist(em, co, NULL);
-
+
/* vert data (vgroups, ..) */
EM_data_interp_from_verts(em, edge->v1, edge->v2, ev, percent);
-
+
/* normal */
ev->no[0] = (edge->v2->no[0]-edge->v1->no[0])*percent + edge->v1->no[0];
ev->no[1] = (edge->v2->no[1]-edge->v1->no[1])*percent + edge->v1->no[1];
ev->no[2] = (edge->v2->no[2]-edge->v1->no[2])*percent + edge->v1->no[2];
Normalize(ev->no);
-
+
return ev;
}
@@ -1429,11 +1451,11 @@ static void flipvertarray(EditVert** arr, short size)
{
EditVert *hold;
int i;
-
+
for(i=0; i<size/2; i++) {
hold = arr[i];
arr[i] = arr[size-i-1];
- arr[size-i-1] = hold;
+ arr[size-i-1] = hold;
}
}
@@ -1446,15 +1468,15 @@ static void facecopy(EditMesh *em, EditFace *source, EditFace *target)
CustomData_em_copy_data(&em->fdata, &em->fdata, source->data, &target->data);
target->mat_nr = source->mat_nr;
- target->flag = source->flag;
+ target->flag = source->flag;
target->h = source->h;
-
+
InterpWeightsQ3Dfl(v1, v2, v3, v4, target->v1->co, w[0]);
InterpWeightsQ3Dfl(v1, v2, v3, v4, target->v2->co, w[1]);
InterpWeightsQ3Dfl(v1, v2, v3, v4, target->v3->co, w[2]);
if (target->v4)
InterpWeightsQ3Dfl(v1, v2, v3, v4, target->v4->co, w[3]);
-
+
CustomData_em_interp(&em->fdata, &source->data, NULL, (float*)w, 1, target->data);
}
@@ -1463,17 +1485,17 @@ static void fill_quad_single(EditMesh *em, EditFace *efa, struct GHash *gh, int
EditEdge *cedge=NULL;
EditVert *v[4], **verts;
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;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT) { cedge = efa->e1; start = 0;}
- else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
- else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
- else if(efa->e4->f & SELECT) { cedge = efa->e4; start = 3;}
+ else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
+ else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
+ else if(efa->e4->f & SELECT) { cedge = efa->e4; start = 3;}
// Point verts to the array of new verts for cedge
verts = BLI_ghash_lookup(gh, cedge);
@@ -1487,30 +1509,30 @@ static void fill_quad_single(EditMesh *em, EditFace *efa, struct GHash *gh, int
if(verts[0] != v[start]) {flipvertarray(verts,numcuts+2);}
end = (start+1)%4;
left = (start+2)%4;
- right = (start+3)%4;
-
+ right = (start+3)%4;
+
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
|---*---*---|
| |
- | |
| |
- -------------
+ | |
+ -------------
left right
where start,end,left, right are indexes of EditFace->v1, etc (stored in v)
and 0,1,2... are the indexes of the new verts stored in verts
We will fill this case like this or this depending on even or odd cuts
-
+
|---*---*---| |---*---|
| / \ | | / \ |
- | / \ | | / \ |
+ | / \ | | / \ |
|/ \| |/ \|
- ------------- ---------
+ ------------- ---------
*/
// Make center face
@@ -1519,7 +1541,7 @@ static void fill_quad_single(EditMesh *em, EditFace *efa, struct GHash *gh, int
hold->e2->f2 |= EDGEINNER;
hold->e4->f2 |= EDGEINNER;
}else{
- hold = addfacelist(em, verts[(vertsize-1)/2],v[left],v[right],NULL, NULL,NULL);
+ hold = addfacelist(em, verts[(vertsize-1)/2],v[left],v[right],NULL, NULL,NULL);
hold->e1->f2 |= EDGEINNER;
hold->e3->f2 |= EDGEINNER;
}
@@ -1527,21 +1549,21 @@ static void fill_quad_single(EditMesh *em, EditFace *efa, struct GHash *gh, int
// Make side faces
for(i=0;i<(vertsize-1)/2;i++) {
- hold = addfacelist(em, verts[i],verts[i+1],v[right],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[i],verts[i+1],v[right],NULL,NULL,NULL);
facecopy(em, efa,hold);
if(i+1 != (vertsize-1)/2) {
if(seltype == SUBDIV_SELECT_INNER) {
hold->e2->f2 |= EDGEINNER;
}
}
- hold = addfacelist(em, verts[vertsize-2-i],verts[vertsize-1-i],v[left],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[vertsize-2-i],verts[vertsize-1-i],v[left],NULL,NULL,NULL);
facecopy(em, efa,hold);
if(i+1 != (vertsize-1)/2) {
if(seltype == SUBDIV_SELECT_INNER) {
hold->e3->f2 |= EDGEINNER;
}
}
- }
+ }
}
static void fill_tri_single(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, int seltype)
@@ -1549,15 +1571,15 @@ static void fill_tri_single(EditMesh *em, EditFace *efa, struct GHash *gh, int n
EditEdge *cedge=NULL;
EditVert *v[3], **verts;
EditFace *hold;
- short start=0, end, op, vertsize,i;
-
+ short start=0, end, op, vertsize,i;
+
v[0] = efa->v1;
v[1] = efa->v2;
- v[2] = efa->v3;
+ v[2] = efa->v3;
if(efa->e1->f & SELECT) { cedge = efa->e1; start = 0;}
- else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
- else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
+ else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
+ else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
// Point verts to the array of new verts for cedge
verts = BLI_ghash_lookup(gh, cedge);
@@ -1571,30 +1593,30 @@ static void fill_tri_single(EditMesh *em, EditFace *efa, struct GHash *gh, int n
if(verts[0] != v[start]) {flipvertarray(verts,numcuts+2);}
end = (start+1)%3;
op = (start+2)%3;
-
+
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
|---*---*---|
\ |
- \ |
+ \ |
\ |
\ |
\ |
\ |
|op
-
+
where start,end,op are indexes of EditFace->v1, etc (stored in v)
and 0,1,2... are the indexes of the new verts stored in verts
We will fill this case like this or this depending on even or odd cuts
-
- 3 2 1 0
+
+ 3 2 1 0
|---*---*---|
\ \ \ |
- \ \ \ |
+ \ \ \ |
\ \ \ |
\ \ \|
\ \\|
@@ -1604,14 +1626,14 @@ static void fill_tri_single(EditMesh *em, EditFace *efa, struct GHash *gh, int n
// Make side faces
for(i=0;i<(vertsize-1);i++) {
- hold = addfacelist(em, verts[i],verts[i+1],v[op],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[i],verts[i+1],v[op],NULL,NULL,NULL);
if(i+1 != vertsize-1) {
if(seltype == SUBDIV_SELECT_INNER) {
hold->e2->f2 |= EDGEINNER;
}
}
facecopy(em, efa,hold);
- }
+ }
}
static void fill_quad_double_op(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1620,11 +1642,11 @@ static void fill_quad_double_op(EditMesh *em, EditFace *efa, struct GHash *gh, i
EditVert *v[4], **verts[2];
EditFace *hold;
short start=0, end, left, right, vertsize,i;
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT) { cedge[0] = efa->e1; cedge[1] = efa->e3; start = 0;}
else if(efa->e2->f & SELECT) { cedge[0] = efa->e2; cedge[1] = efa->e4; start = 1;}
@@ -1642,39 +1664,39 @@ static void fill_quad_double_op(EditMesh *em, EditFace *efa, struct GHash *gh, i
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
end = (start+1)%4;
left = (start+2)%4;
- right = (start+3)%4;
- if(verts[1][0] != v[left]) {flipvertarray(verts[1],numcuts+2);}
+ right = (start+3)%4;
+ if(verts[1][0] != v[left]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
|---*---*---|
| |
- | |
| |
- |---*---*---|
+ | |
+ |---*---*---|
0 1 2 3
left right
We will fill this case like this or this depending on even or odd cuts
-
+
|---*---*---|
| | | |
- | | | |
| | | |
- |---*---*---|
+ | | | |
+ |---*---*---|
*/
-
+
// Make side faces
for(i=0;i<vertsize-1;i++) {
- hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-2-i],verts[1][vertsize-1-i],NULL,NULL);
+ hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-2-i],verts[1][vertsize-1-i],NULL,NULL);
if(i < vertsize-2) {
hold->e2->f2 |= EDGEINNER;
hold->e2->f2 |= DOUBLEOPFILL;
}
facecopy(em, efa,hold);
- }
+ }
}
static void fill_quad_double_adj_path(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1684,11 +1706,11 @@ static void fill_quad_double_adj_path(EditMesh *em, EditFace *efa, struct GHash
EditFace *hold;
short start=0, start2=0, vertsize,i;
int ctrl= 0; // XXX
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT && efa->e2->f & SELECT) {cedge[0] = efa->e1; cedge[1] = efa->e2; start = 0; start2 = 1;}
if(efa->e2->f & SELECT && efa->e3->f & SELECT) {cedge[0] = efa->e2; cedge[1] = efa->e3; start = 1; start2 = 2;}
@@ -1706,53 +1728,53 @@ static void fill_quad_double_adj_path(EditMesh *em, EditFace *efa, struct GHash
// the array to the correct direction
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
start2 0|---*---*---|
| |
1* |
| |
- 2* |
+ 2* |
| |
- end2 3|-----------|
+ end2 3|-----------|
We will fill this case like this or this depending on even or odd cuts
|---*---*---|
| / / / |
* / / |
| / / |
- * / |
+ * / |
| / |
- |-----------|
+ |-----------|
*/
// Make outside tris
- hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
/* when ctrl is depressed, only want verts on the cutline selected */
if (ctrl)
hold->e3->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
hold = addfacelist(em, verts[0][0],verts[1][vertsize-1],v[(start2+2)%4],NULL,NULL,NULL);
/* when ctrl is depressed, only want verts on the cutline selected */
if (ctrl)
- hold->e1->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ hold->e1->f2 |= EDGEINNER;
+ facecopy(em, efa,hold);
//if(scene->toolsettings->editbutflag & B_AUTOFGON) {
// hold->e1->h |= EM_FGON;
- //}
+ //}
// Make side faces
for(i=0;i<numcuts;i++) {
- hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-1-(i+1)],verts[1][vertsize-1-i],NULL,NULL);
+ hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-1-(i+1)],verts[1][vertsize-1-i],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
facecopy(em, efa,hold);
}
//EM_fgon_flags(em);
-
+
}
static void fill_quad_double_adj_fan(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1761,18 +1783,18 @@ static void fill_quad_double_adj_fan(EditMesh *em, EditFace *efa, struct GHash *
EditVert *v[4], *op=NULL, **verts[2];
EditFace *hold;
short start=0, start2=0, vertsize,i;
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT && efa->e2->f & SELECT) {cedge[0] = efa->e1; cedge[1] = efa->e2; start = 0; start2 = 1; op = efa->v4;}
if(efa->e2->f & SELECT && efa->e3->f & SELECT) {cedge[0] = efa->e2; cedge[1] = efa->e3; start = 1; start2 = 2; op = efa->v1;}
if(efa->e3->f & SELECT && efa->e4->f & SELECT) {cedge[0] = efa->e3; cedge[1] = efa->e4; start = 2; start2 = 3; op = efa->v2;}
if(efa->e4->f & SELECT && efa->e1->f & SELECT) {cedge[0] = efa->e4; cedge[1] = efa->e1; start = 3; start2 = 0; op = efa->v3;}
-
+
// Point verts[0] and [1] to the array of new verts for cedge[0] and cedge[1]
verts[0] = BLI_ghash_lookup(gh, cedge[0]);
verts[1] = BLI_ghash_lookup(gh, cedge[1]);
@@ -1784,39 +1806,39 @@ static void fill_quad_double_adj_fan(EditMesh *em, EditFace *efa, struct GHash *
// the array to the correct direction
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
start2 0|---*---*---|
| |
1* |
| |
- 2* |
+ 2* |
| |
- end2 3|-----------|op
+ end2 3|-----------|op
We will fill this case like this or this (warning horrible ascii art follows)
|---*---*---|
| \ \ \ |
*---\ \ \ |
| \ \ \ \|
- *---- \ \ \ |
+ *---- \ \ \ |
| --- \\\|
- |-----------|
+ |-----------|
*/
for(i=0;i<=numcuts;i++) {
- hold = addfacelist(em, op,verts[1][numcuts-i],verts[1][numcuts-i+1],NULL,NULL,NULL);
+ hold = addfacelist(em, op,verts[1][numcuts-i],verts[1][numcuts-i+1],NULL,NULL,NULL);
hold->e1->f2 |= EDGEINNER;
facecopy(em, efa,hold);
- hold = addfacelist(em, op,verts[0][i],verts[0][i+1],NULL,NULL,NULL);
+ hold = addfacelist(em, op,verts[0][i],verts[0][i+1],NULL,NULL,NULL);
hold->e3->f2 |= EDGEINNER;
facecopy(em, efa,hold);
- }
+ }
}
static void fill_quad_double_adj_inner(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1826,18 +1848,18 @@ static void fill_quad_double_adj_inner(EditMesh *em, EditFace *efa, struct GHash
EditFace *hold;
short start=0, start2=0, vertsize,i;
float co[3];
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT && efa->e2->f & SELECT) {cedge[0] = efa->e1; cedge[1] = efa->e2; start = 0; start2 = 1; op = efa->v4;}
if(efa->e2->f & SELECT && efa->e3->f & SELECT) {cedge[0] = efa->e2; cedge[1] = efa->e3; start = 1; start2 = 2; op = efa->v1;}
if(efa->e3->f & SELECT && efa->e4->f & SELECT) {cedge[0] = efa->e3; cedge[1] = efa->e4; start = 2; start2 = 3; op = efa->v2;}
if(efa->e4->f & SELECT && efa->e1->f & SELECT) {cedge[0] = efa->e4; cedge[1] = efa->e1; start = 3; start2 = 0; op = efa->v3;}
-
+
// Point verts[0] and [1] to the array of new verts for cedge[0] and cedge[1]
verts[0] = BLI_ghash_lookup(gh, cedge[0]);
verts[1] = BLI_ghash_lookup(gh, cedge[1]);
@@ -1849,19 +1871,19 @@ static void fill_quad_double_adj_inner(EditMesh *em, EditFace *efa, struct GHash
// the array to the correct direction
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
start2 0|---*---*---|
| |
1* |
| |
- 2* |
+ 2* |
| |
- end2 3|-----------|op
+ end2 3|-----------|op
We will fill this case like this or this (warning horrible ascii art follows)
|---*-----*---|
@@ -1869,14 +1891,14 @@ static void fill_quad_double_adj_inner(EditMesh *em, EditFace *efa, struct GHash
* \ / |
| * |
| / \ |
- * \ |
+ * \ |
| \ |
- |-------------|
+ |-------------|
*/
// Add Inner Vert(s)
inner = MEM_mallocN(sizeof(EditVert*)*numcuts,"New inner verts");
-
+
for(i=0;i<numcuts;i++) {
co[0] = (verts[0][numcuts-i]->co[0] + verts[1][i+1]->co[0] ) / 2 ;
co[1] = (verts[0][numcuts-i]->co[1] + verts[1][i+1]->co[1] ) / 2 ;
@@ -1886,45 +1908,45 @@ static void fill_quad_double_adj_inner(EditMesh *em, EditFace *efa, struct GHash
EM_data_interp_from_verts(em, verts[0][numcuts-i], verts[1][i+1], inner[i], 0.5f);
}
-
+
// Add Corner Quad
- hold = addfacelist(em, verts[0][numcuts+1],verts[1][1],inner[0],verts[0][numcuts],NULL,NULL);
+ hold = addfacelist(em, verts[0][numcuts+1],verts[1][1],inner[0],verts[0][numcuts],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
hold->e3->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
// Add Bottom Quads
- hold = addfacelist(em, verts[0][0],verts[0][1],inner[numcuts-1],op,NULL,NULL);
+ hold = addfacelist(em, verts[0][0],verts[0][1],inner[numcuts-1],op,NULL,NULL);
hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
- hold = addfacelist(em, op,inner[numcuts-1],verts[1][numcuts],verts[1][numcuts+1],NULL,NULL);
+ hold = addfacelist(em, op,inner[numcuts-1],verts[1][numcuts],verts[1][numcuts+1],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
-
+ facecopy(em, efa,hold);
+
//if(scene->toolsettings->editbutflag & B_AUTOFGON) {
// hold->e1->h |= EM_FGON;
- //}
+ //}
// Add Fill Quads (if # cuts > 1)
for(i=0;i<numcuts-1;i++) {
- hold = addfacelist(em, inner[i],verts[1][i+1],verts[1][i+2],inner[i+1],NULL,NULL);
+ hold = addfacelist(em, inner[i],verts[1][i+1],verts[1][i+2],inner[i+1],NULL,NULL);
hold->e1->f2 |= EDGEINNER;
hold->e3->f2 |= EDGEINNER;
facecopy(em, efa,hold);
- hold = addfacelist(em, inner[i],inner[i+1],verts[0][numcuts-1-i],verts[0][numcuts-i],NULL,NULL);
+ hold = addfacelist(em, inner[i],inner[i+1],verts[0][numcuts-1-i],verts[0][numcuts-i],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
hold->e4->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
-
+ facecopy(em, efa,hold);
+
//if(scene->toolsettings->editbutflag & B_AUTOFGON) {
// hold->e1->h |= EM_FGON;
- //}
- }
-
+ //}
+ }
+
//EM_fgon_flags(em);
-
- MEM_freeN(inner);
+
+ MEM_freeN(inner);
}
static void fill_tri_double(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1933,7 +1955,7 @@ static void fill_tri_double(EditMesh *em, EditFace *efa, struct GHash *gh, int n
EditVert *v[3], **verts[2];
EditFace *hold;
short start=0, start2=0, vertsize,i;
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
@@ -1953,41 +1975,41 @@ static void fill_tri_double(EditMesh *em, EditFace *efa, struct GHash *gh, int n
// the array to the correct direction
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
/*
We should have something like this now
- end start
- 3 2 1 0
+ end start
+ 3 2 1 0
start2 0|---*---*---|
- | /
- 1* /
- | /
- 2* /
- | /
- end2 3|
+ | /
+ 1* /
+ | /
+ 2* /
+ | /
+ end2 3|
We will fill this case like this or this depending on even or odd cuts
|---*---*---|
- | / / /
- * / /
- | / /
- * /
- | /
+ | / / /
+ * / /
+ | / /
+ * /
+ | /
|
*/
// Make outside tri
- hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
hold->e3->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
// Make side faces
for(i=0;i<numcuts;i++) {
- hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-1-(i+1)],verts[1][vertsize-1-i],NULL,NULL);
+ hold = addfacelist(em, verts[0][i],verts[0][i+1],verts[1][vertsize-1-(i+1)],verts[1][vertsize-1-i],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
facecopy(em, efa,hold);
- }
+ }
}
static void fill_quad_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts)
@@ -1996,133 +2018,133 @@ static void fill_quad_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int
EditVert *v[4], **verts[3];
EditFace *hold;
short start=0, start2=0, start3=0, vertsize, i, repeats;
-
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
-
+ v[3] = efa->v4;
+
if(!(efa->e1->f & SELECT)) {
- cedge[0] = efa->e2;
- cedge[1] = efa->e3;
+ cedge[0] = efa->e2;
+ cedge[1] = efa->e3;
cedge[2] = efa->e4;
- start = 1;start2 = 2;start3 = 3;
+ start = 1;start2 = 2;start3 = 3;
}
if(!(efa->e2->f & SELECT)) {
- cedge[0] = efa->e3;
- cedge[1] = efa->e4;
+ cedge[0] = efa->e3;
+ cedge[1] = efa->e4;
cedge[2] = efa->e1;
- start = 2;start2 = 3;start3 = 0;
+ start = 2;start2 = 3;start3 = 0;
}
if(!(efa->e3->f & SELECT)) {
- cedge[0] = efa->e4;
- cedge[1] = efa->e1;
+ cedge[0] = efa->e4;
+ cedge[1] = efa->e1;
cedge[2] = efa->e2;
- start = 3;start2 = 0;start3 = 1;
+ start = 3;start2 = 0;start3 = 1;
}
if(!(efa->e4->f & SELECT)) {
- cedge[0] = efa->e1;
- cedge[1] = efa->e2;
+ cedge[0] = efa->e1;
+ cedge[1] = efa->e2;
cedge[2] = efa->e3;
- start = 0;start2 = 1;start3 = 2;
- }
+ start = 0;start2 = 1;start3 = 2;
+ }
// Point verts[0] and [1] to the array of new verts for cedge[0] and cedge[1]
verts[0] = BLI_ghash_lookup(gh, cedge[0]);
verts[1] = BLI_ghash_lookup(gh, cedge[1]);
verts[2] = BLI_ghash_lookup(gh, cedge[2]);
//This is the index size of the verts array
vertsize = numcuts+2;
-
+
// Is the original v1 the same as the first vert on the selected edge?
// if not, the edge is running the opposite direction in this face so flip
// the array to the correct direction
-
+
if(verts[0][0] != v[start]) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
- if(verts[2][0] != v[start3]) {flipvertarray(verts[2],numcuts+2);}
+ if(verts[1][0] != v[start2]) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[2][0] != v[start3]) {flipvertarray(verts[2],numcuts+2);}
/*
We should have something like this now
-
- start2
- 3 2 1 0
- start3 0|---*---*---|3
+
+ start2
+ 3 2 1 0
+ start3 0|---*---*---|3
| |
1* *2
| |
- 2* *1
+ 2* *1
| |
- 3|-----------|0 start
-
- We will fill this case like this or this depending on even or odd cuts
+ 3|-----------|0 start
+
+ We will fill this case like this or this depending on even or odd cuts
there are a couple of differences. For odd cuts, there is a tri in the
middle as well as 1 quad at the bottom (not including the extra quads
- for odd cuts > 1
-
+ for odd cuts > 1
+
For even cuts, there is a quad in the middle and 2 quads on the bottom
-
+
they are numbered here for clarity
-
+
1 outer tris and bottom quads
2 inner tri or quad
3 repeating quads
-
+
|---*---*---*---|
|1/ / \ \ 1|
|/ 3 / \ 3 \|
* / 2 \ *
| / \ |
- |/ \ |
+ |/ \ |
*---------------*
| 3 |
- | |
+ | |
*---------------*
| |
- | 1 |
+ | 1 |
| |
|---------------|
-
+
|---*---*---*---*---|
- | 1/ / \ \ 1|
- | / / \ \ |
+ | 1/ / \ \ 1|
+ | / / \ \ |
|/ 3 / \ 3 \|
* / \ *
- | / \ |
- | / 2 \ |
+ | / \ |
+ | / 2 \ |
|/ \|
*-------------------*
| |
| 3 |
- | |
+ | |
*-------------------*
| |
| 1 |
- | |
+ | |
*-------------------*
| |
| 1 |
- | |
+ | |
|-------------------|
-
+
*/
// Make outside tris
- hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
+ hold = addfacelist(em, verts[0][vertsize-2],verts[0][vertsize-1],verts[1][1],NULL,NULL,NULL);
hold->e3->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
- hold = addfacelist(em, verts[1][vertsize-2],verts[1][vertsize-1],verts[2][1],NULL,NULL,NULL);
+ facecopy(em, efa,hold);
+ hold = addfacelist(em, verts[1][vertsize-2],verts[1][vertsize-1],verts[2][1],NULL,NULL,NULL);
hold->e3->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
// Make bottom quad
- hold = addfacelist(em, verts[0][0],verts[0][1],verts[2][vertsize-2],verts[2][vertsize-1],NULL,NULL);
+ hold = addfacelist(em, verts[0][0],verts[0][1],verts[2][vertsize-2],verts[2][vertsize-1],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
//If it is even cuts, add the 2nd lower quad
if(numcuts % 2 == 0) {
- hold = addfacelist(em, verts[0][1],verts[0][2],verts[2][vertsize-3],verts[2][vertsize-2],NULL,NULL);
+ hold = addfacelist(em, verts[0][1],verts[0][2],verts[2][vertsize-3],verts[2][vertsize-2],NULL,NULL);
hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
// Also Make inner quad
- hold = addfacelist(em, verts[1][numcuts/2],verts[1][(numcuts/2)+1],verts[2][numcuts/2],verts[0][(numcuts/2)+1],NULL,NULL);
+ hold = addfacelist(em, verts[1][numcuts/2],verts[1][(numcuts/2)+1],verts[2][numcuts/2],verts[0][(numcuts/2)+1],NULL,NULL);
hold->e3->f2 |= EDGEINNER;
//if(scene->toolsettings->editbutflag & B_AUTOFGON) {
// hold->e3->h |= EM_FGON;
@@ -2130,47 +2152,47 @@ static void fill_quad_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int
facecopy(em, efa,hold);
repeats = (numcuts / 2) -1;
} else {
- // Make inner tri
- hold = addfacelist(em, verts[1][(numcuts/2)+1],verts[2][(numcuts/2)+1],verts[0][(numcuts/2)+1],NULL,NULL,NULL);
+ // Make inner tri
+ hold = addfacelist(em, verts[1][(numcuts/2)+1],verts[2][(numcuts/2)+1],verts[0][(numcuts/2)+1],NULL,NULL,NULL);
hold->e2->f2 |= EDGEINNER;
//if(scene->toolsettings->editbutflag & B_AUTOFGON) {
// hold->e2->h |= EM_FGON;
//}
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
repeats = ((numcuts+1) / 2)-1;
}
-
+
// cuts for 1 and 2 do not have the repeating quads
if(numcuts < 3) {repeats = 0;}
for(i=0;i<repeats;i++) {
//Make side repeating Quads
- hold = addfacelist(em, verts[1][i+1],verts[1][i+2],verts[0][vertsize-i-3],verts[0][vertsize-i-2],NULL,NULL);
- hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
- hold = addfacelist(em, verts[1][vertsize-i-3],verts[1][vertsize-i-2],verts[2][i+1],verts[2][i+2],NULL,NULL);
+ hold = addfacelist(em, verts[1][i+1],verts[1][i+2],verts[0][vertsize-i-3],verts[0][vertsize-i-2],NULL,NULL);
+ hold->e2->f2 |= EDGEINNER;
+ facecopy(em, efa,hold);
+ hold = addfacelist(em, verts[1][vertsize-i-3],verts[1][vertsize-i-2],verts[2][i+1],verts[2][i+2],NULL,NULL);
hold->e4->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
+ facecopy(em, efa,hold);
}
- // Do repeating bottom quads
+ // Do repeating bottom quads
for(i=0;i<repeats;i++) {
- if(numcuts % 2 == 1) {
- hold = addfacelist(em, verts[0][1+i],verts[0][2+i],verts[2][vertsize-3-i],verts[2][vertsize-2-i],NULL,NULL);
+ if(numcuts % 2 == 1) {
+ hold = addfacelist(em, verts[0][1+i],verts[0][2+i],verts[2][vertsize-3-i],verts[2][vertsize-2-i],NULL,NULL);
} else {
- hold = addfacelist(em, verts[0][2+i],verts[0][3+i],verts[2][vertsize-4-i],verts[2][vertsize-3-i],NULL,NULL);
+ hold = addfacelist(em, verts[0][2+i],verts[0][3+i],verts[2][vertsize-4-i],verts[2][vertsize-3-i],NULL,NULL);
}
hold->e2->f2 |= EDGEINNER;
- facecopy(em, efa,hold);
- }
+ facecopy(em, efa,hold);
+ }
//EM_fgon_flags(em);
}
-static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float rad, int beauty)
+static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float smooth, float fractal, int beauty)
{
EditVert **verts[4], ***innerverts;
- EditFace *hold;
+ EditFace *hold;
EditEdge temp;
short vertsize, i, j;
-
+
// Point verts[0] and [1] to the array of new verts for cedge[0] and cedge[1]
verts[0] = BLI_ghash_lookup(gh, efa->e1);
verts[1] = BLI_ghash_lookup(gh, efa->e2);
@@ -2185,87 +2207,87 @@ static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, i
// the array to the correct direction
if(verts[0][0] != efa->v1) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != efa->v2) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[1][0] != efa->v2) {flipvertarray(verts[1],numcuts+2);}
if(verts[2][0] == efa->v3) {flipvertarray(verts[2],numcuts+2);}
- if(verts[3][0] == efa->v4) {flipvertarray(verts[3],numcuts+2);}
+ if(verts[3][0] == efa->v4) {flipvertarray(verts[3],numcuts+2);}
/*
We should have something like this now
1
-
- 3 2 1 0
- 0|---*---*---|0
+
+ 3 2 1 0
+ 0|---*---*---|0
| |
1* *1
2 | | 4
- 2* *2
+ 2* *2
| |
- 3|---*---*---|3
+ 3|---*---*---|3
3 2 1 0
3
// we will fill a 2 dim array of editvert*s to make filling easier
// the innervert order is shown
- 0 0---1---2---3
+ 0 0---1---2---3
| | | |
- 1 0---1---2---3
+ 1 0---1---2---3
| | | |
- 2 0---1---2---3
+ 2 0---1---2---3
| | | |
- 3 0---1---2---3
-
+ 3 0---1---2---3
+
*/
- innerverts = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"quad-quad subdiv inner verts outer array");
+ innerverts = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"quad-quad subdiv inner verts outer array");
for(i=0;i<numcuts+2;i++) {
innerverts[i] = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"quad-quad subdiv inner verts inner array");
- }
-
+ }
+
// first row is e1 last row is e3
for(i=0;i<numcuts+2;i++) {
innerverts[0][i] = verts[0][(numcuts+1)-i];
innerverts[numcuts+1][i] = verts[2][(numcuts+1)-i];
}
-
+
for(i=1;i<=numcuts;i++) {
/* we create a fake edge for the next loop */
temp.v2 = innerverts[i][0] = verts[1][i];
temp.v1 = innerverts[i][numcuts+1] = verts[3][i];
-
- for(j=1;j<=numcuts;j++) {
+
+ for(j=1;j<=numcuts;j++) {
float percent= (float)j/(float)(numcuts+1);
- innerverts[i][(numcuts+1)-j]= subdivide_edge_addvert(em, &temp, rad, beauty, percent);
- }
- }
+ innerverts[i][(numcuts+1)-j]= subdivide_edge_addvert(em, &temp, smooth, fractal, beauty, percent);
+ }
+ }
// Fill with faces
for(i=0;i<numcuts+1;i++) {
for(j=0;j<numcuts+1;j++) {
- hold = addfacelist(em, innerverts[i][j+1],innerverts[i][j],innerverts[i+1][j],innerverts[i+1][j+1],NULL,NULL);
- hold->e1->f2 = EDGENEW;
- hold->e2->f2 = EDGENEW;
- hold->e3->f2 = EDGENEW;
- hold->e4->f2 = EDGENEW;
-
+ hold = addfacelist(em, innerverts[i][j+1],innerverts[i][j],innerverts[i+1][j],innerverts[i+1][j+1],NULL,NULL);
+ hold->e1->f2 = EDGENEW;
+ hold->e2->f2 = EDGENEW;
+ hold->e3->f2 = EDGENEW;
+ hold->e4->f2 = EDGENEW;
+
if(i != 0) { hold->e1->f2 |= EDGEINNER; }
if(j != 0) { hold->e2->f2 |= EDGEINNER; }
if(i != numcuts) { hold->e3->f2 |= EDGEINNER; }
if(j != numcuts) { hold->e4->f2 |= EDGEINNER; }
-
- facecopy(em, efa,hold);
- }
+
+ facecopy(em, efa,hold);
+ }
}
// Clean up our dynamic multi-dim array
for(i=0;i<numcuts+2;i++) {
- MEM_freeN(innerverts[i]);
- }
+ MEM_freeN(innerverts[i]);
+ }
MEM_freeN(innerverts);
}
-static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float rad, int beauty)
+static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int numcuts, float smooth, float fractal, int beauty)
{
EditVert **verts[3], ***innerverts;
short vertsize, i, j;
- EditFace *hold;
+ EditFace *hold;
EditEdge temp;
// Point verts[0] and [1] to the array of new verts for cedge[0] and cedge[1]
@@ -2281,20 +2303,20 @@ static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int n
// the array to the correct direction
if(verts[0][0] != efa->v1) {flipvertarray(verts[0],numcuts+2);}
- if(verts[1][0] != efa->v2) {flipvertarray(verts[1],numcuts+2);}
- if(verts[2][0] != efa->v3) {flipvertarray(verts[2],numcuts+2);}
+ if(verts[1][0] != efa->v2) {flipvertarray(verts[1],numcuts+2);}
+ if(verts[2][0] != efa->v3) {flipvertarray(verts[2],numcuts+2);}
/*
We should have something like this now
3
-
- 3 2 1 0
- 0|---*---*---|3
- | /
- 1 1* *2
- | /
- 2* *1 2
- | /
- 3|/
+
+ 3 2 1 0
+ 0|---*---*---|3
+ | /
+ 1 1* *2
+ | /
+ 2* *1 2
+ | /
+ 3|/
0
we will fill a 2 dim array of editvert*s to make filling easier
@@ -2302,68 +2324,68 @@ static void fill_tri_triple(EditMesh *em, EditFace *efa, struct GHash *gh, int n
3
0 0---1---2---3---4
- | / | / |/ | /
- 1 0---1----2---3
- 1 | / | / | /
+ | / | / |/ | /
+ 1 0---1----2---3
+ 1 | / | / | /
2 0----1---2 2
- | / | /
- |/ |/
- 3 0---1
+ | / | /
+ |/ |/
+ 3 0---1
| /
|/
- 4 0
-
+ 4 0
+
*/
-
- innerverts = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"tri-tri subdiv inner verts outer array");
+
+ innerverts = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"tri-tri subdiv inner verts outer array");
for(i=0;i<numcuts+2;i++) {
innerverts[i] = MEM_mallocN(sizeof(EditVert*)*((numcuts+2)-i),"tri-tri subdiv inner verts inner array");
}
//top row is e3 backwards
for(i=0;i<numcuts+2;i++) {
innerverts[0][i] = verts[2][(numcuts+1)-i];
- }
-
+ }
+
for(i=1;i<=numcuts+1;i++) {
//fake edge, first vert is from e1, last is from e2
temp.v1= innerverts[i][0] = verts[0][i];
temp.v2= innerverts[i][(numcuts+1)-i] = verts[1][(numcuts+1)-i];
-
+
for(j=1;j<(numcuts+1)-i;j++) {
float percent= (float)j/(float)((numcuts+1)-i);
- innerverts[i][((numcuts+1)-i)-j]= subdivide_edge_addvert(em, &temp, rad, beauty, 1-percent);
+ innerverts[i][((numcuts+1)-i)-j]= subdivide_edge_addvert(em, &temp, smooth, fractal, beauty, 1-percent);
}
}
// Now fill the verts with happy little tris :)
for(i=0;i<=numcuts+1;i++) {
- for(j=0;j<(numcuts+1)-i;j++) {
+ for(j=0;j<(numcuts+1)-i;j++) {
//We always do the first tri
- hold = addfacelist(em, innerverts[i][j+1],innerverts[i][j],innerverts[i+1][j],NULL,NULL,NULL);
- hold->e1->f2 |= EDGENEW;
- hold->e2->f2 |= EDGENEW;
- hold->e3->f2 |= EDGENEW;
+ hold = addfacelist(em, innerverts[i][j+1],innerverts[i][j],innerverts[i+1][j],NULL,NULL,NULL);
+ hold->e1->f2 |= EDGENEW;
+ hold->e2->f2 |= EDGENEW;
+ hold->e3->f2 |= EDGENEW;
if(i != 0) { hold->e1->f2 |= EDGEINNER; }
if(j != 0) { hold->e2->f2 |= EDGEINNER; }
if(j+1 != (numcuts+1)-i) {hold->e3->f2 |= EDGEINNER;}
-
- facecopy(em, efa,hold);
- //if there are more to come, we do the 2nd
+
+ facecopy(em, efa,hold);
+ //if there are more to come, we do the 2nd
if(j+1 <= numcuts-i) {
- hold = addfacelist(em, innerverts[i+1][j],innerverts[i+1][j+1],innerverts[i][j+1],NULL,NULL,NULL);
- facecopy(em, efa,hold);
- hold->e1->f2 |= EDGENEW;
- hold->e2->f2 |= EDGENEW;
- hold->e3->f2 |= EDGENEW;
+ hold = addfacelist(em, innerverts[i+1][j],innerverts[i+1][j+1],innerverts[i][j+1],NULL,NULL,NULL);
+ facecopy(em, efa,hold);
+ hold->e1->f2 |= EDGENEW;
+ hold->e2->f2 |= EDGENEW;
+ hold->e3->f2 |= EDGENEW;
}
- }
+ }
}
// Clean up our dynamic multi-dim array
for(i=0;i<numcuts+2;i++) {
- MEM_freeN(innerverts[i]);
- }
+ MEM_freeN(innerverts[i]);
+ }
MEM_freeN(innerverts);
}
@@ -2381,7 +2403,7 @@ static void fill_quad_doublevert(EditMesh *em, EditFace *efa, int v1, int v2)
| \ | | / |
--------X X--------
*/
-
+
if(v1 == 1 && v2 == 3){
hold= addfacelist(em, efa->v1, efa->v2, efa->v3, 0, efa, NULL);
hold->e1->f2 |= EDGENEW;
@@ -2389,7 +2411,7 @@ static void fill_quad_doublevert(EditMesh *em, EditFace *efa, int v1, int v2)
hold->e3->f2 |= EDGENEW;
hold->e3->f2 |= EDGEINNER;
facecopy(em, efa, hold);
-
+
hold= addfacelist(em, efa->v1, efa->v3, efa->v4, 0, efa, NULL);
hold->e1->f2 |= EDGENEW;
hold->e2->f2 |= EDGENEW;
@@ -2404,7 +2426,7 @@ static void fill_quad_doublevert(EditMesh *em, EditFace *efa, int v1, int v2)
hold->e3->f2 |= EDGENEW;
hold->e2->f2 |= EDGEINNER;
facecopy(em, efa, hold);
-
+
hold= addfacelist(em, efa->v2, efa->v3, efa->v4, 0, efa, NULL);
hold->e1->f2 |= EDGENEW;
hold->e2->f2 |= EDGENEW;
@@ -2419,17 +2441,17 @@ static void fill_quad_singlevert(EditMesh *em, EditFace *efa, struct GHash *gh)
EditEdge *cedge=NULL;
EditVert *v[4], **verts;
EditFace *hold;
- short start=0, end, left, right, vertsize;
-
+ short start=0, end, left, right, vertsize;
+
v[0] = efa->v1;
v[1] = efa->v2;
v[2] = efa->v3;
- v[3] = efa->v4;
+ v[3] = efa->v4;
if(efa->e1->f & SELECT) { cedge = efa->e1; start = 0;}
- else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
- else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
- else if(efa->e4->f & SELECT) { cedge = efa->e4; start = 3;}
+ else if(efa->e2->f & SELECT) { cedge = efa->e2; start = 1;}
+ else if(efa->e3->f & SELECT) { cedge = efa->e3; start = 2;}
+ else if(efa->e4->f & SELECT) { cedge = efa->e4; start = 3;}
// Point verts to the array of new verts for cedge
verts = BLI_ghash_lookup(gh, cedge);
@@ -2443,25 +2465,25 @@ static void fill_quad_singlevert(EditMesh *em, EditFace *efa, struct GHash *gh)
if(verts[0] != v[start]) {flipvertarray(verts,3);}
end = (start+1)%4;
left = (start+2)%4;
- right = (start+3)%4;
+ right = (start+3)%4;
/*
We should have something like this now
- end start
- 2 1 0
+ end start
+ 2 1 0
|-----*-----|
| |
- | |
| |
- -------------
+ | |
+ -------------
left right
where start,end,left, right are indexes of EditFace->v1, etc (stored in v)
and 0,1,2 are the indexes of the new verts stored in verts. We fill like
this, depending on whether its vertex 'left' or vertex 'right' thats
been knifed through...
-
+
|---*---| |---*---|
| / | | \ |
| / | | \ |
@@ -2477,7 +2499,7 @@ static void fill_quad_singlevert(EditMesh *em, EditFace *efa, struct GHash *gh)
hold->e3->f2 |= EDGENEW;
hold->e3->f2 |= EDGEINNER;
facecopy(em, efa, hold);
-
+
//quad is composed of cutvert, left, right and start
hold = addfacelist(em, verts[1],v[left],v[right],v[start], NULL, NULL);
hold->e1->f2 |= EDGENEW;
@@ -2504,30 +2526,30 @@ static void fill_quad_singlevert(EditMesh *em, EditFace *efa, struct GHash *gh)
hold->e4->f2 |= EDGEINNER;
facecopy(em, efa, hold);
}
-
-}
-// This function takes an example edge, the current point to create and
+}
+
+// This function takes an example edge, the current point to create and
// the total # of points to create, then creates the point and return the
// editvert pointer to it.
-static EditVert *subdivideedgenum(EditMesh *em, EditEdge *edge, int curpoint, int totpoint, float rad, int beauty)
+static EditVert *subdivideedgenum(EditMesh *em, EditEdge *edge, int curpoint, int totpoint, float smooth, float fractal, int beauty)
{
EditVert *ev;
float percent;
-
+
if (beauty & (B_PERCENTSUBD) && totpoint == 1)
//percent=(float)(edge->tmp.l)/32768.0f;
percent= edge->tmp.fp;
else
percent= (float)curpoint/(float)(totpoint+1);
- ev= subdivide_edge_addvert(em, edge, rad, beauty, percent);
+ ev= subdivide_edge_addvert(em, edge, smooth, fractal, beauty, percent);
ev->f = edge->v1->f;
-
+
return ev;
}
-void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beauty, int numcuts, int seltype)
+void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beauty, int numcuts, int seltype)
{
EditFace *ef;
EditEdge *eed, *cedge, *sort[4];
@@ -2537,7 +2559,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
int i, j, edgecount, touchcount, facetype,hold;
ModifierData *md= obedit->modifiers.first;
int ctrl= 0; // XXX
-
+
//Set faces f1 to 0 cause we need it later
for(ef=em->faces.first;ef;ef = ef->next) ef->f1 = 0;
for(eve=em->verts.first; eve; eve=eve->next) {
@@ -2548,8 +2570,8 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
for (; md; md=md->next) {
if (md->type==eModifierType_Mirror) {
- MirrorModifierData *mmd = (MirrorModifierData*) md;
-
+ MirrorModifierData *mmd = (MirrorModifierData*) md;
+
if(mmd->flag & MOD_MIR_CLIPPING) {
for (eve= em->verts.first; eve; eve= eve->next) {
eve->f2= 0;
@@ -2571,23 +2593,23 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
}
}
}
-
+
//Flush vertex flags upward to the edges
for(eed = em->edges.first;eed;eed = eed->next) {
//if(eed->f & flag && eed->v1->f == eed->v2->f) {
- // eed->f |= eed->v1->f;
+ // eed->f |= eed->v1->f;
// }
- eed->f2 = 0;
+ eed->f2 = 0;
if(eed->f & flag) {
eed->f2 |= EDGEOLD;
}
}
-
+
// We store an array of verts for each edge that is subdivided,
// we put this array as a value in a ghash which is keyed by the EditEdge*
// Now for beauty subdivide deselect edges based on length
- if(beauty & B_BEAUTY) {
+ if(beauty & B_BEAUTY) {
for(ef = em->faces.first;ef;ef = ef->next) {
if(!ef->v4) {
continue;
@@ -2596,12 +2618,12 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
VECCOPY(v1mat, ef->v1->co);
VECCOPY(v2mat, ef->v2->co);
VECCOPY(v3mat, ef->v3->co);
- VECCOPY(v4mat, ef->v4->co);
+ VECCOPY(v4mat, ef->v4->co);
Mat4Mul3Vecfl(obedit->obmat, v1mat);
- Mat4Mul3Vecfl(obedit->obmat, v2mat);
+ Mat4Mul3Vecfl(obedit->obmat, v2mat);
Mat4Mul3Vecfl(obedit->obmat, v3mat);
Mat4Mul3Vecfl(obedit->obmat, v4mat);
-
+
length[0] = VecLenf(v1mat, v2mat);
length[1] = VecLenf(v2mat, v3mat);
length[2] = VecLenf(v3mat, v4mat);
@@ -2610,20 +2632,20 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
sort[1] = ef->e2;
sort[2] = ef->e3;
sort[3] = ef->e4;
-
-
+
+
// Beauty Short Edges
if(beauty & B_BEAUTY_SHORT) {
for(j=0;j<2;j++) {
hold = -1;
for(i=0;i<4;i++) {
if(length[i] < 0) {
- continue;
- } else if(hold == -1) {
- hold = i;
+ continue;
+ } else if(hold == -1) {
+ hold = i;
} else {
if(length[hold] < length[i]) {
- hold = i;
+ hold = i;
}
}
}
@@ -2634,19 +2656,19 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
}
}
}
-
+
// Beauty Long Edges
else {
for(j=0;j<2;j++) {
hold = -1;
for(i=0;i<4;i++) {
if(length[i] < 0) {
- continue;
- } else if(hold == -1) {
- hold = i;
+ continue;
+ } else if(hold == -1) {
+ hold = i;
} else {
if(length[hold] > length[i]) {
- hold = i;
+ hold = i;
}
}
}
@@ -2661,18 +2683,18 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
}
}
- gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
// If we are knifing, We only need the selected edges that were cut, so deselect if it was not cut
- if(beauty & B_KNIFE) {
- for(eed= em->edges.first;eed;eed=eed->next) {
+ if(beauty & B_KNIFE) {
+ for(eed= em->edges.first;eed;eed=eed->next) {
if( eed->tmp.fp == 0 ) {
EM_select_edge(eed,0);
}
}
- }
+ }
// So for each edge, if it is selected, we allocate an array of size cuts+2
- // so we can have a place for the v1, the new verts and v2
+ // so we can have a place for the v1, the new verts and v2
for(eed=em->edges.first;eed;eed = eed->next) {
if(eed->f & flag) {
templist = MEM_mallocN(sizeof(EditVert*)*(numcuts+2),"vertlist");
@@ -2680,7 +2702,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
for(i=0;i<numcuts;i++) {
// This function creates the new vert and returns it back
// to the array
- templist[i+1] = subdivideedgenum(em, eed, i+1, numcuts, rad, beauty);
+ templist[i+1] = subdivideedgenum(em, eed, i+1, numcuts, smooth, fractal, beauty);
//while we are here, we can copy edge info from the original edge
cedge = addedgelist(em, templist[i],templist[i+1],eed);
// Also set the edge f2 to EDGENEW so that we can use this info later
@@ -2690,12 +2712,12 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
//Do the last edge too
cedge = addedgelist(em, templist[i],templist[i+1],eed);
cedge->f2 = EDGENEW;
- // Now that the edge is subdivided, we can put its verts in the ghash
- BLI_ghash_insert(gh, eed, templist);
- }
+ // Now that the edge is subdivided, we can put its verts in the ghash
+ BLI_ghash_insert(gh, eed, templist);
+ }
}
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
// 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) {
@@ -2707,7 +2729,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
if(ef->v4) {
facetype = 4;
if(ef->e4->f & flag) {edgecount++;}
- }
+ }
if(facetype == 4) {
switch(edgecount) {
case 0:
@@ -2719,9 +2741,9 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
if(ef->v3->f1) touchcount++;
if(ef->v4->f1) touchcount++;
if(touchcount == 2){
- if(ef->v1->f1 && ef->v3->f1){
+ if(ef->v1->f1 && ef->v3->f1){
ef->f1 = SELECT;
- fill_quad_doublevert(em, ef, 1, 3);
+ fill_quad_doublevert(em, ef, 1, 3);
}
else if(ef->v2->f1 && ef->v4->f1){
ef->f1 = SELECT;
@@ -2729,9 +2751,9 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
}
}
}
- break;
-
- case 1:
+ break;
+
+ case 1:
if(beauty & B_KNIFE && numcuts == 1){
/*Test for when knifing through an edge and one vert*/
touchcount = 0;
@@ -2739,14 +2761,14 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
if(ef->v2->f1) touchcount++;
if(ef->v3->f1) touchcount++;
if(ef->v4->f1) touchcount++;
-
+
if(touchcount == 1){
if( (ef->e1->f & flag && ( !ef->e1->v1->f1 && !ef->e1->v2->f1 )) ||
(ef->e2->f & flag && ( !ef->e2->v1->f1 && !ef->e2->v2->f1 )) ||
(ef->e3->f & flag && ( !ef->e3->v1->f1 && !ef->e3->v2->f1 )) ||
(ef->e4->f & flag && ( !ef->e4->v1->f1 && !ef->e4->v2->f1 )) ){
-
- ef->f1 = SELECT;
+
+ ef->f1 = SELECT;
fill_quad_singlevert(em, ef, gh);
}
else{
@@ -2754,64 +2776,64 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
fill_quad_single(em, ef, gh, numcuts, seltype);
}
}
- else{
- ef->f1 = SELECT;
+ else{
+ ef->f1 = SELECT;
fill_quad_single(em, ef, gh, numcuts, seltype);
}
}
- else{
+ else{
ef->f1 = SELECT;
fill_quad_single(em, ef, gh, numcuts, seltype);
}
- break;
+ break;
case 2: ef->f1 = SELECT;
// if there are 2, we check if edge 1 and 3 are either both on or off that way
// we can tell if the selected pair is Adjacent or Opposite of each other
- if((ef->e1->f & flag && ef->e3->f & flag) ||
+ if((ef->e1->f & flag && ef->e3->f & flag) ||
(ef->e2->f & flag && ef->e4->f & flag)) {
- fill_quad_double_op(em, ef, gh, numcuts);
+ fill_quad_double_op(em, ef, gh, numcuts);
}else{
switch(0) { // XXX scene->toolsettings->cornertype) {
case 0: fill_quad_double_adj_path(em, ef, gh, numcuts); break;
case 1: fill_quad_double_adj_inner(em, ef, gh, numcuts); break;
case 2: fill_quad_double_adj_fan(em, ef, gh, numcuts); break;
}
-
+
}
- break;
+ break;
case 3: ef->f1 = SELECT;
- fill_quad_triple(em, ef, gh, numcuts);
- break;
+ fill_quad_triple(em, ef, gh, numcuts);
+ break;
case 4: ef->f1 = SELECT;
- fill_quad_quadruple(em, ef, gh, numcuts, rad, beauty);
- break;
+ fill_quad_quadruple(em, ef, gh, numcuts, smooth, fractal, beauty);
+ break;
}
} else {
switch(edgecount) {
case 0: break;
case 1: ef->f1 = SELECT;
fill_tri_single(em, ef, gh, numcuts, seltype);
- break;
+ break;
case 2: ef->f1 = SELECT;
fill_tri_double(em, ef, gh, numcuts);
- break;
+ break;
case 3: ef->f1 = SELECT;
- fill_tri_triple(em, ef, gh, numcuts, rad, beauty);
- break;
- }
- }
+ fill_tri_triple(em, ef, gh, numcuts, smooth, fractal, beauty);
+ break;
+ }
+ }
}
-
+
// Delete Old Edges and Faces
for(eed = em->edges.first;eed;eed = eed->next) {
if(BLI_ghash_haskey(gh,eed)) {
- eed->f1 = SELECT;
+ eed->f1 = SELECT;
} else {
- eed->f1 = 0;
+ eed->f1 = 0;
}
- }
- free_tagged_edges_faces(em, em->edges.first, em->faces.first);
-
+ }
+ free_tagged_edges_faces(em, em->edges.first, em->faces.first);
+
if(seltype == SUBDIV_SELECT_ORIG && !ctrl) {
/* bugfix: vertex could get flagged as "not-selected"
// solution: clear flags before, not at the same time as setting SELECT flag -dg
@@ -2819,7 +2841,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
for(eed = em->edges.first;eed;eed = eed->next) {
if(!(eed->f2 & EDGENEW || eed->f2 & EDGEOLD)) {
eed->f &= !flag;
- EM_select_edge(eed,0);
+ EM_select_edge(eed,0);
}
}
for(eed = em->edges.first;eed;eed = eed->next) {
@@ -2832,14 +2854,14 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
for(eed = em->edges.first;eed;eed = eed->next) {
if(eed->f2 & EDGEINNER) {
eed->f |= flag;
- EM_select_edge(eed,1);
+ EM_select_edge(eed,1);
if(eed->v1->f & EDGEINNER) eed->v1->f |= SELECT;
if(eed->v2->f & EDGEINNER) eed->v2->f |= SELECT;
}else{
eed->f &= !flag;
- EM_select_edge(eed,0);
+ EM_select_edge(eed,0);
}
- }
+ }
} else if(seltype == SUBDIV_SELECT_LOOPCUT){
for(eed = em->edges.first;eed;eed = eed->next) {
if(eed->f2 & DOUBLEOPFILL){
@@ -2850,16 +2872,16 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
EM_select_edge(eed,0);
}
}
- }
+ }
if(em->selectmode & SCE_SELECT_VERTEX) {
for(eed = em->edges.first;eed;eed = eed->next) {
if(eed->f & SELECT) {
eed->v1->f |= SELECT;
eed->v2->f |= SELECT;
}
- }
+ }
}
-
+
//fix hide flags for edges. First pass, hide edges of hidden faces
for(ef=em->faces.first; ef; ef=ef->next){
if(ef->h){
@@ -2878,27 +2900,26 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut
if(ef->e4) ef->e4->h &= ~1;
}
}
-
- // Free the ghash and call MEM_freeN on all the value entries to return
+
+ // Free the ghash and call MEM_freeN on all the value entries to return
// that memory
- BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN);
-
+ BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN);
+
EM_selectmode_flush(em);
for(ef=em->faces.first;ef;ef = ef->next) {
if(ef->e4) {
if( (ef->e1->f & SELECT && ef->e2->f & SELECT) &&
(ef->e3->f & SELECT && ef->e4->f & SELECT) ) {
- ef->f |= SELECT;
- }
+ ef->f |= SELECT;
+ }
} else {
if( (ef->e1->f & SELECT && ef->e2->f & SELECT) && ef->e3->f & SELECT) {
- ef->f |= SELECT;
+ ef->f |= SELECT;
}
}
}
-
+
recalc_editnormals(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
static int count_selected_edges(EditEdge *ed)
@@ -2936,15 +2957,15 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
i++;
}
else eed->tmp.p = NULL;
-
+
eed= eed->next;
}
-
-
+
+
/* find edges pointing to 2 faces by procedure:
-
+
- run through faces and their edges, increase
- face counter e->f1 for each face
+ face counter e->f1 for each face
*/
while(efa) {
@@ -2989,20 +3010,20 @@ static int collect_quadedges(EVPTuple *efaa, EditEdge *eed, EditFace *efa)
}
-/* returns vertices of two adjacent triangles forming a quad
+/* returns vertices of two adjacent triangles forming a quad
- can be righthand or lefthand
4-----3
|\ |
| \ 2 | <- efa1
- | \ |
- efa-> | 1 \ |
- | \|
+ | \ |
+ efa-> | 1 \ |
+ | \|
1-----2
*/
#define VTEST(face, num, other) \
- (face->v##num != other->v1 && face->v##num != other->v2 && face->v##num != other->v3)
+ (face->v##num != other->v1 && face->v##num != other->v2 && face->v##num != other->v3)
static void givequadverts(EditFace *efa, EditFace *efa1, EditVert **v1, EditVert **v2, EditVert **v3, EditVert **v4, int *vindex)
{
@@ -3024,7 +3045,7 @@ static void givequadverts(EditFace *efa, EditFace *efa1, EditVert **v1, EditVert
vindex[0]= 2;
vindex[1]= 0;
}
-
+
if VTEST(efa1, 1, efa) {
*v3= efa1->v1;
*v4= efa1->v2;
@@ -3081,65 +3102,65 @@ static void free_tagged_edges_faces(EditMesh *em, EditEdge *eed, EditFace *efa)
free_editedge(em, eed);
}
eed= nexted;
- }
-}
+ }
+}
/* ******************** BEGIN TRIANGLE TO QUAD ************************************* */
static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, float limit)
{
-
+
/*gives a 'weight' to a pair of triangles that join an edge to decide how good a join they would make*/
/*Note: this is more complicated than it needs to be and should be cleaned up...*/
float measure = 0.0, noA1[3], noA2[3], noB1[3], noB2[3], normalADiff, normalBDiff,
edgeVec1[3], edgeVec2[3], edgeVec3[3], edgeVec4[3], diff,
minarea, maxarea, areaA, areaB;
-
+
/*First Test: Normal difference*/
CalcNormFloat(v1->co, v2->co, v3->co, noA1);
CalcNormFloat(v1->co, v3->co, v4->co, noA2);
-
+
if(noA1[0] == noA2[0] && noA1[1] == noA2[1] && noA1[2] == noA2[2]) normalADiff = 0.0;
- else normalADiff = VecAngle2(noA1, noA2);
+ else normalADiff = RAD2DEG(VecAngle2(noA1, noA2));
//if(!normalADiff) normalADiff = 179;
CalcNormFloat(v2->co, v3->co, v4->co, noB1);
CalcNormFloat(v4->co, v1->co, v2->co, noB2);
-
+
if(noB1[0] == noB2[0] && noB1[1] == noB2[1] && noB1[2] == noB2[2]) normalBDiff = 0.0;
- else normalBDiff = VecAngle2(noB1, noB2);
+ else normalBDiff = RAD2DEG(VecAngle2(noB1, noB2));
//if(!normalBDiff) normalBDiff = 179;
-
+
measure += (normalADiff/360) + (normalBDiff/360);
if(measure > limit) return measure;
-
+
/*Second test: Colinearity*/
VecSubf(edgeVec1, v1->co, v2->co);
VecSubf(edgeVec2, v2->co, v3->co);
VecSubf(edgeVec3, v3->co, v4->co);
VecSubf(edgeVec4, v4->co, v1->co);
-
+
diff = 0.0;
-
+
diff = (
- fabs(VecAngle2(edgeVec1, edgeVec2) - 90) +
- fabs(VecAngle2(edgeVec2, edgeVec3) - 90) +
- fabs(VecAngle2(edgeVec3, edgeVec4) - 90) +
- fabs(VecAngle2(edgeVec4, edgeVec1) - 90)) / 360;
+ fabs(RAD2DEG(VecAngle2(edgeVec1, edgeVec2)) - 90) +
+ fabs(RAD2DEG(VecAngle2(edgeVec2, edgeVec3)) - 90) +
+ fabs(RAD2DEG(VecAngle2(edgeVec3, edgeVec4)) - 90) +
+ fabs(RAD2DEG(VecAngle2(edgeVec4, edgeVec1)) - 90)) / 360;
if(!diff) return 0.0;
-
+
measure += diff;
if(measure > limit) return measure;
/*Third test: Concavity*/
areaA = AreaT3Dfl(v1->co, v2->co, v3->co) + AreaT3Dfl(v1->co, v3->co, v4->co);
areaB = AreaT3Dfl(v2->co, v3->co, v4->co) + AreaT3Dfl(v4->co, v1->co, v2->co);
-
+
if(areaA <= areaB) minarea = areaA;
else minarea = areaB;
-
+
if(areaA >= areaB) maxarea = areaA;
else maxarea = areaB;
-
+
if(!maxarea) measure += 1;
else measure += (1 - (minarea / maxarea));
@@ -3148,38 +3169,38 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert
#define T2QUV_LIMIT 0.005
#define T2QCOL_LIMIT 3
-static int compareFaceAttribs(EditMesh *em, EditFace *f1, EditFace *f2, EditEdge *eed)
+static int compareFaceAttribs(EditMesh *em, EditFace *f1, EditFace *f2, EditEdge *eed)
{
- /*Test to see if the per-face attributes for the joining edge match within limit*/
+ /*Test to see if the per-face attributes for the joining edge match within limit*/
MTFace *tf1, *tf2;
unsigned int *col1, *col2;
short i,attrok=0, flag = 0, /* XXX scene->toolsettings->editbutflag,*/ fe1[2], fe2[2];
-
+
tf1 = CustomData_em_get(&em->fdata, f1->data, CD_MTFACE);
tf2 = CustomData_em_get(&em->fdata, f2->data, CD_MTFACE);
col1 = CustomData_em_get(&em->fdata, f1->data, CD_MCOL);
col2 = CustomData_em_get(&em->fdata, f2->data, CD_MCOL);
-
+
/*store indices for faceedges*/
f1->v1->f1 = 0;
f1->v2->f1 = 1;
f1->v3->f1 = 2;
-
+
fe1[0] = eed->v1->f1;
fe1[1] = eed->v2->f1;
-
+
f2->v1->f1 = 0;
f2->v2->f1 = 1;
f2->v3->f1 = 2;
-
+
fe2[0] = eed->v1->f1;
fe2[1] = eed->v2->f1;
-
+
/*compare faceedges for each face attribute. Additional per face attributes can be added later*/
/*do UVs*/
if(flag & B_JOINTRIA_UV){
-
+
if(tf1 == NULL || tf2 == NULL) attrok |= B_JOINTRIA_UV;
else if(tf1->tpage != tf2->tpage); /*do nothing*/
else{
@@ -3189,7 +3210,7 @@ static int compareFaceAttribs(EditMesh *em, EditFace *f1, EditFace *f2, EditEdge
}
}
}
-
+
/*do VCOLs*/
if(flag & B_JOINTRIA_VCOL){
if(!col1 || !col2) attrok |= B_JOINTRIA_VCOL;
@@ -3198,7 +3219,7 @@ static int compareFaceAttribs(EditMesh *em, EditFace *f1, EditFace *f2, EditEdge
for(i = 0; i < 2; i++){
f1vcol = (char *)&(col1[fe1[i]]);
f2vcol = (char *)&(col2[fe2[i]]);
-
+
/*compare f1vcol with f2vcol*/
if( f1vcol[1] + T2QCOL_LIMIT > f2vcol[1] && f1vcol[1] - T2QCOL_LIMIT < f2vcol[1] &&
f1vcol[2] + T2QCOL_LIMIT > f2vcol[2] && f1vcol[2] - T2QCOL_LIMIT < f2vcol[2] &&
@@ -3206,18 +3227,18 @@ static int compareFaceAttribs(EditMesh *em, EditFace *f1, EditFace *f2, EditEdge
}
}
}
-
+
if( ((attrok & B_JOINTRIA_UV) == (flag & B_JOINTRIA_UV)) && ((attrok & B_JOINTRIA_VCOL) == (flag & B_JOINTRIA_VCOL)) ) return 1;
return 0;
-}
-
+}
+
static int fplcmp(const void *v1, const void *v2)
{
const EditEdge *e1= *((EditEdge**)v1), *e2=*((EditEdge**)v2);
-
+
if( e1->crease > e2->crease) return 1;
else if( e1->crease < e2->crease) return -1;
-
+
return 0;
}
@@ -3236,21 +3257,21 @@ void join_triangles(EditMesh *em)
float measure; /*Used to set tolerance*/
float limit = 0.0f; // XXX scene->toolsettings->jointrilimit;
int i, ok, totedge=0, totseledge=0, complexedges, vindex[4];
-
+
/*if we take a long time on very dense meshes we want waitcursor to display*/
waitcursor(1);
-
+
totseledge = count_selected_edges(em->edges.first);
if(totseledge==0) return;
-
+
/*abusing crease value to store weights for edge pairs. Nasty*/
for(eed=em->edges.first; eed; eed=eed->next) totedge++;
- if(totedge) creases = MEM_callocN(sizeof(float) * totedge, "Join Triangles Crease Array");
+ if(totedge) creases = MEM_callocN(sizeof(float) * totedge, "Join Triangles Crease Array");
for(eed=em->edges.first, i = 0; eed; eed=eed->next, i++){
- creases[i] = eed->crease;
+ creases[i] = eed->crease;
eed->crease = 0.0;
}
-
+
/*clear temp flags*/
for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = eve->f2 = 0;
for(eed=em->edges.first; eed; eed=eed->next) eed->f2 = eed->f1 = 0;
@@ -3260,11 +3281,11 @@ void join_triangles(EditMesh *em)
efaar= (EVPTuple *) MEM_callocN(totseledge * sizeof(EVPTuple), "Tri2Quad");
ok = collect_quadedges(efaar, em->edges.first, em->faces.first);
complexedges = 0;
-
+
if(ok){
-
-
- /*clear tmp.l flag and store number of faces that are selected and coincident to current face here.*/
+
+
+ /*clear tmp.l flag and store number of faces that are selected and coincident to current face here.*/
for(eed=em->edges.first; eed; eed=eed->next){
/* eed->f2 is 2 only if this edge is part of exactly two
triangles, and both are selected, and it has EVPTuple assigned */
@@ -3274,7 +3295,7 @@ void join_triangles(EditMesh *em)
efaa[1]->tmp.l++;
}
}
-
+
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f2 == 2){
efaa= (EVPtr *) eed->tmp.p;
@@ -3287,30 +3308,30 @@ void join_triangles(EditMesh *em)
efaa[0]->f1 = 1; //mark for join
efaa[1]->f1 = 1; //mark for join
}
- else{
-
+ else{
+
/* The face pair is part of a 'complex' island, so the rules for dealing with it are more involved.
Depending on what options the user has chosen, this face pair can be 'thrown out' based upon the following criteria:
-
+
1: the two faces do not share the same material
2: the edge joining the two faces is marked as sharp.
3: the two faces UV's do not make a good match
4: the two faces Vertex colors do not make a good match
-
+
If the face pair passes all the applicable tests, it is then given a 'weight' with the measure_facepair() function.
This measures things like concavity, colinearity ect. If this weight is below the threshold set by the user
the edge joining them is marked as being 'complex' and will be compared against other possible pairs which contain one of the
same faces in the current pair later.
-
+
This technique is based upon an algorithm that Campbell Barton developed for his Tri2Quad script that was previously part of
the python scripts bundled with Blender releases.
*/
-
+
// XXX if(scene->toolsettings->editbutflag & B_JOINTRIA_SHARP && eed->sharp); /*do nothing*/
// else if(scene->toolsettings->editbutflag & B_JOINTRIA_MAT && efaa[0]->mat_nr != efaa[1]->mat_nr); /*do nothing*/
// else if(((scene->toolsettings->editbutflag & B_JOINTRIA_UV) || (scene->toolsettings->editbutflag & B_JOINTRIA_VCOL)) &&
compareFaceAttribs(em, efaa[0], efaa[1], eed); // XXX == 0); /*do nothing*/
-// else{
+// else{
measure = measure_facepair(v1, v2, v3, v4, limit);
if(measure < limit){
complexedges++;
@@ -3322,7 +3343,7 @@ void join_triangles(EditMesh *em)
}
}
}
-
+
/*Quicksort the complex edges according to their weighting*/
if(complexedges){
edsortblock = edb = MEM_callocN(sizeof(EditEdge*) * complexedges, "Face Pairs quicksort Array");
@@ -3334,7 +3355,7 @@ void join_triangles(EditMesh *em)
}
qsort(edsortblock, complexedges, sizeof(EditEdge*), fplcmp);
/*now go through and mark the edges who get the highest weighting*/
- for(edb=edsortblock, i=0; i < complexedges; edb++, i++){
+ for(edb=edsortblock, i=0; i < complexedges; edb++, i++){
efaa = (EVPtr *)((*edb)->tmp.p); /*suspect!*/
if( !efaa[0]->f1 && !efaa[1]->f1){
efaa[0]->f1 = 1; //mark for join
@@ -3343,8 +3364,8 @@ void join_triangles(EditMesh *em)
}
}
}
-
- /*finally go through all edges marked for join (simple and complex) and create new faces*/
+
+ /*finally go through all edges marked for join (simple and complex) and create new faces*/
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f1 & T2QJOIN){
efaa= (EVPtr *)eed->tmp.p;
@@ -3364,10 +3385,10 @@ void join_triangles(EditMesh *em)
}
}
}
-
+
/*free data and cleanup*/
if(creases){
- for(eed=em->edges.first, i = 0; eed; eed=eed->next, i++) eed->crease = creases[i];
+ for(eed=em->edges.first, i = 0; eed; eed=eed->next, i++) eed->crease = creases[i];
MEM_freeN(creases);
}
for(eed=em->edges.first; eed; eed=eed->next){
@@ -3377,9 +3398,8 @@ void join_triangles(EditMesh *em)
free_tagged_edges_faces(em, em->edges.first, em->faces.first);
if(efaar) MEM_freeN(efaar);
if(edsortblock) MEM_freeN(edsortblock);
-
+
EM_selectmode_flush(em);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
/* ******************** END TRIANGLE TO QUAD ************************************* */
@@ -3396,7 +3416,7 @@ void edge_flip(EditMesh *em)
EVPTuple *efaar;
EVPtr *efaa;
int totedge, ok, vindex[4];
-
+
/* - all selected edges with two faces
* - find the faces: store them in edges (using datablock)
* - per edge: - test convex
@@ -3404,7 +3424,7 @@ void edge_flip(EditMesh *em)
- if true: remedge, addedge, all edges at the edge get new face pointers
*/
- EM_selectmode_flush(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
+ EM_selectmode_flush(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
totedge = count_selected_edges(em->edges.first);
if(totedge==0) return;
@@ -3413,15 +3433,15 @@ void edge_flip(EditMesh *em)
efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "edgeflip");
ok = collect_quadedges(efaar, em->edges.first, em->faces.first);
-
+
eed= em->edges.first;
while(eed) {
nexted= eed->next;
-
+
if(eed->f2==2) { /* points to 2 faces */
-
+
efaa= (EVPtr *) eed->tmp.p;
-
+
/* don't do it if flagged */
ok= 1;
@@ -3429,7 +3449,7 @@ void edge_flip(EditMesh *em)
if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
efa= efaa[1];
if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
-
+
if(ok) {
/* test convex */
givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex);
@@ -3438,8 +3458,8 @@ void edge_flip(EditMesh *em)
4-----3 4-----3
|\ | | /|
| \ 1 | | 1 / |
- | \ | -> | / |
- | 0 \ | | / 0 |
+ | \ | -> | / |
+ | 0 \ | | / 0 |
| \| |/ |
1-----2 1-----2
*/
@@ -3447,7 +3467,7 @@ void edge_flip(EditMesh *em)
if (v1 && v2 && v3) {
if( convex(v1->co, v2->co, v3->co, v4->co) ) {
if(exist_face(em, v1, v2, v3, v4)==0) {
- /* outch this may break seams */
+ /* outch this may break seams */
w= EM_face_from_faces(em, efaa[0], efaa[1], vindex[0],
vindex[1], 4+vindex[2], -1);
@@ -3462,8 +3482,8 @@ void edge_flip(EditMesh *em)
/* tag as to-be-removed */
FACE_MARKCLEAR(efaa[1]);
FACE_MARKCLEAR(efaa[0]);
- eed->f1 = 1;
-
+ eed->f1 = 1;
+
} /* endif test convex */
}
}
@@ -3473,21 +3493,34 @@ void edge_flip(EditMesh *em)
/* clear tagged edges and faces: */
free_tagged_edges_faces(em, em->edges.first, em->faces.first);
-
- MEM_freeN(efaar);
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ MEM_freeN(efaar);
}
-static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
+#define DIRECTION_CW 1
+#define DIRECTION_CCW 2
+
+static const EnumPropertyItem direction_items[]= {
+ {DIRECTION_CW, "CW", 0, "Clockwise", ""},
+ {DIRECTION_CCW, "CCW", 0, "Counter Clockwise", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+#define AXIS_X 1
+#define AXIS_Y 2
+
+static const EnumPropertyItem axis_items[]= {
+ {AXIS_X, "X", 0, "X", ""},
+ {AXIS_Y, "Y", 0, "Y", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed, int dir)
{
EditVert **verts[2];
EditFace *face[2], *efa, *newFace[2];
EditEdge **edges[2], **hiddenedges, *srchedge;
int facecount, p1, p2, p3, p4, fac1, fac2, i, j;
int numhidden, numshared, p[2][4];
-
+
/* check to make sure that the edge is only part of 2 faces */
facecount = 0;
for(efa = em->faces.first;efa;efa = efa->next) {
@@ -3502,7 +3535,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
}
}
}
-
+
if(facecount < 2)
return;
@@ -3512,7 +3545,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
if(face[1]->e4) fac2= 4;
else fac2= 3;
-
+
/* make a handy array for verts and edges */
verts[0]= &face[0]->v1;
edges[0]= &face[0]->e1;
@@ -3528,7 +3561,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
if(numshared > 1)
return;
-
+
/* we want to construct an array of vertex indicis in both faces, starting at
the last vertex of the edge being rotated.
- first we find the two vertices that lie on the rotating edge
@@ -3542,12 +3575,12 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
if(eed->v1 == verts[1][i]) p3 = i;
if(eed->v2 == verts[1][i]) p4 = i;
}
-
+
if((p1+1)%fac1 == p2)
SWAP(int, p1, p2);
if((p3+1)%fac2 == p4)
SWAP(int, p3, p4);
-
+
for (i = 0; i < 4; i++) {
p[0][i]= (p1 + i)%fac1;
p[1][i]= (p3 + i)%fac2;
@@ -3562,7 +3595,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
hiddenedges = MEM_mallocN(sizeof(EditVert*)*numhidden+1, "RotateEdgeHiddenVerts");
if(!hiddenedges) {
BKE_report(op->reports, RPT_ERROR, "Memory allocation failed");
- return;
+ return;
}
numhidden = 0;
@@ -3578,50 +3611,50 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
}
else if(fac1 == 4 && fac2 == 3) {
- if(dir == 1) {
+ if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], -1);
- } else if (dir == 2) {
+ } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], 4+p[1][1], p[0][0], p[0][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], 4+p[0][2], p[1][0], p[1][1], -1);
-
+
verts[0][p[0][2]]->f |= SELECT;
- verts[1][p[1][1]]->f |= SELECT;
+ verts[1][p[1][1]]->f |= SELECT;
}
}
else if(fac1 == 3 && fac2 == 4) {
- if(dir == 1) {
+ if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], 4+p[1][1], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
- } else if (dir == 2) {
+ } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][0], p[0][1], 4+p[1][2], -1);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], 4+p[0][1], 4+p[0][2]);
-
+
verts[0][p[0][1]]->f |= SELECT;
- verts[1][p[1][2]]->f |= SELECT;
+ verts[1][p[1][2]]->f |= SELECT;
}
-
+
}
else if(fac1 == 4 && fac2 == 4) {
- if(dir == 1) {
+ if(dir == DIRECTION_CW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][1], p[0][2], p[0][3], 4+p[1][1]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][1], p[1][2], p[1][3], 4+p[0][1]);
- } else if (dir == 2) {
+ } else if (dir == DIRECTION_CCW) {
newFace[0]= EM_face_from_faces(em, face[0], face[1], p[0][2], p[0][3], 4+p[1][1], 4+p[1][2]);
newFace[1]= EM_face_from_faces(em, face[1], face[0], p[1][2], p[1][3], 4+p[0][1], 4+p[0][2]);
-
+
verts[0][p[0][2]]->f |= SELECT;
- verts[1][p[1][2]]->f |= SELECT;
+ verts[1][p[1][2]]->f |= SELECT;
}
- }
+ }
else
return; /* This should never happen */
- if(dir == 1 || (fac1 == 3 && fac2 == 3)) {
+ if(dir == DIRECTION_CW || (fac1 == 3 && fac2 == 3)) {
verts[0][p[0][1]]->f |= SELECT;
verts[1][p[1][1]]->f |= SELECT;
}
-
+
/* copy old edge's flags to new center edge*/
for(srchedge=em->edges.first;srchedge;srchedge=srchedge->next) {
if((srchedge->v1->f & SELECT) && (srchedge->v2->f & SELECT)) {
@@ -3633,25 +3666,25 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir)
srchedge->bweight = eed->bweight;
}
}
-
+
/* resetting hidden flag */
for(numhidden--; numhidden>=0; numhidden--)
hiddenedges[numhidden]->h= 1;
-
+
/* check for orhphan edges */
for(srchedge=em->edges.first; srchedge; srchedge=srchedge->next)
- srchedge->f1= -1;
-
+ srchedge->f1= -1;
+
/* cleanup */
MEM_freeN(hiddenedges);
-
+
/* get rid of the old edge and faces*/
remedge(em, eed);
- free_editedge(em, eed);
+ free_editedge(em, eed);
BLI_remlink(&em->faces, face[0]);
- free_editface(em, face[0]);
+ free_editface(em, face[0]);
BLI_remlink(&em->faces, face[1]);
- free_editface(em, face[1]);
+ free_editface(em, face[1]);
}
// XXX ton please check
@@ -3660,19 +3693,18 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- int dir = RNA_int_get(op->ptr,"dir"); // dir == 2 when clockwise and ==1 for counter CW.
EditEdge *eed;
EditFace *efa;
+ int dir = RNA_int_get(op->ptr, "direction"); // dir == 2 when clockwise and ==1 for counter CW.
short edgeCount = 0;
-
+
/*clear new flag for new edges, count selected edges */
for(eed= em->edges.first; eed; eed= eed->next) {
eed->f1= 0;
eed->f2 &= ~2;
- if(eed->f & SELECT) edgeCount++;
+ if(eed->f & SELECT) edgeCount++;
}
-
+
if(edgeCount>1) {
/* more selected edges, check faces */
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -3695,7 +3727,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
}
}
}
- else
+ else
{
BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
BKE_mesh_end_editmesh(obedit->data, em);
@@ -3711,41 +3743,39 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
}
}
}
- else
- {
+ else {
BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
/* flush selected vertices (again) to edges/faces */
EM_select_flush(em);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
}
void MESH_OT_edge_rotate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Rotate Selected Edge";
+ ot->description= "Rotate selected edge or adjoining faces.";
ot->idname= "MESH_OT_edge_rotate";
-
+
/* api callbacks */
ot->exec= edge_rotate_selected;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* props */
- RNA_def_int(ot->srna, "dir", 1, 1, 2, "Direction", "Clockwise and Counter Clockwise", 1, 2);
+ RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "direction", "direction to rotate edge around.");
}
@@ -3753,7 +3783,7 @@ void MESH_OT_edge_rotate(wmOperatorType *ot)
/* XXX old bevel not ported yet */
-void bevel_menu(EditMesh *em)
+void bevel_menu(EditMesh *em)
{
BME_Mesh *bm;
BME_TransData_Head *td;
@@ -3808,7 +3838,7 @@ returns 0 if they do not, or if the function is passed the same edge 2 times
short sharesFace(EditMesh *em, EditEdge* e1, EditEdge* e2)
{
EditFace *search=NULL;
-
+
search = em->faces.first;
if (e1 == e2){
return 0 ;
@@ -3838,11 +3868,11 @@ typedef struct SlideVert {
EditVert origvert;
} SlideVert;
+#if 0
int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc)
{
return 0;
/* XXX REFACTOR - #if 0'd for now, otherwise can't make 64bit windows builds on 64bit machine */
-#if 0
useless:
goto useless // because it doesn't do anything right now
@@ -3859,38 +3889,38 @@ useless:
float shiftlabda= 0.0f,len = 0.0f;
int i = 0,j, numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0,flip=0;
int wasshift = 0;
-
+
/* UV correction vars */
GHash **uvarray= NULL;
int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
int uvlay_idx;
- SlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
+ SlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
float uv_tmp[2];
LinkNode *fuv_link;
-
+
short event, draw=1;
short mval[2], mvalo[2];
- char str[128];
+ char str[128];
float labda = 0.0f;
-
+
// initNumInput(&num);
-
+
// view3d_get_object_project_mat(curarea, obedit, projectMat);
-
- mvalo[0] = -1; mvalo[1] = -1;
- numsel =0;
-
+
+ mvalo[0] = -1; mvalo[1] = -1;
+ numsel =0;
+
// Get number of selected edges and clear some flags
for(eed=em->edges.first;eed;eed=eed->next) {
eed->f1 = 0;
- eed->f2 = 0;
+ eed->f2 = 0;
if(eed->f & SELECT) numsel++;
}
-
+
for(ev=em->verts.first;ev;ev=ev->next) {
- ev->f1 = 0;
- }
-
+ ev->f1 = 0;
+ }
+
//Make sure each edge only has 2 faces
// make sure loop doesn't cross face
for(efa=em->faces.first;efa;efa=efa->next) {
@@ -3900,7 +3930,7 @@ useless:
efa->e1->f1++;
if(efa->e1->f1 > 2) {
BKE_report(op->reports, RPT_ERROR, "3+ face edge");
- return 0;
+ return 0;
}
}
if(efa->e2->f & SELECT) {
@@ -3908,7 +3938,7 @@ useless:
efa->e2->f1++;
if(efa->e2->f1 > 2) {
BKE_report(op->reports, RPT_ERROR, "3+ face edge");
- return 0;
+ return 0;
}
}
if(efa->e3->f & SELECT) {
@@ -3916,7 +3946,7 @@ useless:
efa->e3->f1++;
if(efa->e3->f1 > 2) {
BKE_report(op->reports, RPT_ERROR, "3+ face edge");
- return 0;
+ return 0;
}
}
if(efa->e4 && efa->e4->f & SELECT) {
@@ -3924,26 +3954,26 @@ useless:
efa->e4->f1++;
if(efa->e4->f1 > 2) {
BKE_report(op->reports, RPT_ERROR, "3+ face edge");
- return 0;
+ return 0;
}
- }
- // Make sure loop is not 2 edges of same face
+ }
+ // Make sure loop is not 2 edges of same face
if(ct > 1) {
BKE_report(op->reports, RPT_ERROR, "Loop crosses itself");
- return 0;
+ return 0;
}
- }
+ }
// Get # of selected verts
- for(ev=em->verts.first;ev;ev=ev->next) {
+ for(ev=em->verts.first;ev;ev=ev->next) {
if(ev->f & SELECT) vertsel++;
- }
-
+ }
+
// Test for multiple segments
if(vertsel > numsel+1) {
BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop");
- return 0;
- }
-
+ return 0;
+ }
+
// Get the edgeloop in order - mark f1 with SELECT once added
for(eed=em->edges.first;eed;eed=eed->next) {
if((eed->f & SELECT) && !(eed->f1 & SELECT)) {
@@ -3952,35 +3982,35 @@ useless:
BLI_linklist_prepend(&edgelist,eed);
numadded++;
first = eed;
- last = eed;
+ last = eed;
eed->f1 = SELECT;
- } else {
+ } else {
if(editedge_getSharedVert(eed, last)) {
BLI_linklist_append(&edgelist,eed);
eed->f1 = SELECT;
numadded++;
- last = eed;
+ last = eed;
} else if(editedge_getSharedVert(eed, first)) {
BLI_linklist_prepend(&edgelist,eed);
eed->f1 = SELECT;
numadded++;
- first = eed;
- }
+ first = eed;
+ }
}
- }
+ }
if(eed->next == NULL && numadded != numsel) {
- eed=em->edges.first;
+ eed=em->edges.first;
timesthrough++;
}
-
+
// It looks like there was an unexpected case - Hopefully should not happen
if(timesthrough >= numsel*2) {
- BLI_linklist_free(edgelist,NULL);
+ BLI_linklist_free(edgelist,NULL);
BKE_report(op->reports, RPT_ERROR, "Could not order loop");
- return 0;
+ return 0;
}
}
-
+
// Put the verts in order in a linklist
look = edgelist;
while(look) {
@@ -3991,33 +4021,33 @@ useless:
//This is the first entry takes care of extra vert
if(eed->v1 != temp->v1 && eed->v1 != temp->v2) {
- BLI_linklist_append(&vertlist,eed->v1);
- eed->v1->f1 = 1;
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
} else {
- BLI_linklist_append(&vertlist,eed->v2);
- eed->v2->f1 = 1;
- }
+ BLI_linklist_append(&vertlist,eed->v2);
+ eed->v2->f1 = 1;
+ }
} else {
//This is the case that we only have 1 edge
- BLI_linklist_append(&vertlist,eed->v1);
- eed->v1->f1 = 1;
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
}
- }
+ }
// for all the entries
if(eed->v1->f1 != 1) {
- BLI_linklist_append(&vertlist,eed->v1);
- eed->v1->f1 = 1;
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
} else if(eed->v2->f1 != 1) {
- BLI_linklist_append(&vertlist,eed->v2);
- eed->v2->f1 = 1;
- }
- look = look->next;
- }
-
+ BLI_linklist_append(&vertlist,eed->v2);
+ eed->v2->f1 = 1;
+ }
+ look = look->next;
+ }
+
// populate the SlideVerts
-
- vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
- look = vertlist;
+
+ vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ look = vertlist;
while(look) {
i=0;
j=0;
@@ -4033,14 +4063,14 @@ useless:
tempsv->origvert.no[2] = ev->no[2];
// i is total edges that vert is on
// j is total selected edges that vert is on
-
+
for(eed=em->edges.first;eed;eed=eed->next) {
if(eed->v1 == ev || eed->v2 == ev) {
- i++;
+ i++;
if(eed->f & SELECT) {
- j++;
+ j++;
}
- }
+ }
}
// If the vert is in the middle of an edge loop, it touches 2 selected edges and 2 unselected edges
if(i == 4 && j == 2) {
@@ -4050,11 +4080,11 @@ useless:
if(!tempsv->up) {
tempsv->up = eed;
} else if (!(tempsv->down)) {
- tempsv->down = eed;
+ tempsv->down = eed;
}
}
- }
- }
+ }
+ }
}
// If it is on the end of the loop, it touches 1 selected and as least 2 more unselected
if(i >= 3 && j == 1) {
@@ -4066,63 +4096,63 @@ useless:
if(!tempsv->up) {
tempsv->up = efa->e1;
} else if (!(tempsv->down)) {
- tempsv->down = efa->e1;
- }
+ tempsv->down = efa->e1;
+ }
}
if(editedge_containsVert(efa->e2, ev) && efa->e2 != eed) {
if(!tempsv->up) {
tempsv->up = efa->e2;
} else if (!(tempsv->down)) {
- tempsv->down = efa->e2;
- }
- }
+ tempsv->down = efa->e2;
+ }
+ }
if(editedge_containsVert(efa->e3, ev) && efa->e3 != eed) {
if(!tempsv->up) {
tempsv->up = efa->e3;
} else if (!(tempsv->down)) {
- tempsv->down = efa->e3;
- }
- }
+ tempsv->down = efa->e3;
+ }
+ }
if(efa->e4) {
if(editedge_containsVert(efa->e4, ev) && efa->e4 != eed) {
if(!tempsv->up) {
tempsv->up = efa->e4;
} else if (!(tempsv->down)) {
- tempsv->down = efa->e4;
- }
+ tempsv->down = efa->e4;
+ }
}
- }
-
+ }
+
}
}
- }
- }
- }
+ }
+ }
+ }
if(i > 4 && j == 2) {
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
- BLI_linklist_free(vertlist,NULL);
- BLI_linklist_free(edgelist,NULL);
- return 0;
+ BLI_linklist_free(vertlist,NULL);
+ BLI_linklist_free(edgelist,NULL);
+ return 0;
}
BLI_ghash_insert(vertgh,ev,tempsv);
-
- look = look->next;
- }
-
+
+ look = look->next;
+ }
+
// make sure the UPs nad DOWNs are 'faceloops'
// Also find the nearest slidevert to the cursor
// XXX getmouseco_areawin(mval);
- look = vertlist;
+ look = vertlist;
nearest = NULL;
- vertdist = -1;
- while(look) {
+ vertdist = -1;
+ while(look) {
tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
-
+
if(!tempsv->up || !tempsv->down) {
BKE_report(op->reports, RPT_ERROR, "Missing rails");
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
- BLI_linklist_free(vertlist,NULL);
- BLI_linklist_free(edgelist,NULL);
+ BLI_linklist_free(vertlist,NULL);
+ BLI_linklist_free(edgelist,NULL);
return 0;
}
@@ -4153,39 +4183,39 @@ useless:
EditEdge *swap;
swap = sv->up;
sv->up = sv->down;
- sv->down = swap;
+ sv->down = swap;
}
// view3d_project_float(curarea, tempsv->origvert.co, co, projectMat);
-
+
tempdist = sqrt(pow(co[0] - mval[0],2)+pow(co[1] - mval[1],2));
if(vertdist < 0) {
vertdist = tempdist;
- nearest = (EditVert*)look->link;
+ nearest = (EditVert*)look->link;
} else if ( tempdist < vertdist ) {
vertdist = tempdist;
- nearest = (EditVert*)look->link;
- }
+ nearest = (EditVert*)look->link;
+ }
}
- }
-
-
-
- look = look->next;
- }
-
-
+ }
+
+
+
+ look = look->next;
+ }
+
+
if (uvlay_tot) { // XXX && (scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT)) {
int maxnum = 0;
uvarray = MEM_callocN( uvlay_tot * sizeof(GHash *), "SlideUVs Array");
suv_last = slideuvs = MEM_callocN( uvlay_tot * (numadded+1) * sizeof(SlideUv), "SlideUVs"); /* uvLayers * verts */
suv = NULL;
-
+
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
-
- uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
-
+
+ uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
for(ev=em->verts.first;ev;ev=ev->next) {
ev->tmp.l = 0;
}
@@ -4193,25 +4223,25 @@ useless:
while(look) {
float *uv_new;
tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
-
+
ev = look->link;
suv = NULL;
for(efa = em->faces.first;efa;efa=efa->next) {
if (ev->tmp.l != -1) { /* test for self, in this case its invalid */
int k=-1; /* face corner */
-
+
/* Is this vert in the faces corner? */
if (efa->v1==ev) k=0;
else if (efa->v2==ev) k=1;
else if (efa->v3==ev) k=2;
else if (efa->v4 && efa->v4==ev) k=3;
-
+
if (k != -1) {
MTFace *tf = CustomData_em_get_n(&em->fdata, efa->data, CD_MTFACE, uvlay_idx);
EditVert *ev_up, *ev_down;
-
+
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])) {
ev->tmp.l = -1; /* Tag as invalid */
@@ -4229,14 +4259,14 @@ useless:
suv->uv_up = suv->uv_down = NULL;
suv->origuv[0] = uv_new[0];
suv->origuv[1] = uv_new[1];
-
+
BLI_linklist_prepend(&suv->fuv_list, uv_new);
BLI_ghash_insert(uvarray[uvlay_idx],ev,suv);
-
+
suv_last++; /* advance to next slide UV */
maxnum++;
}
-
+
/* Now get the uvs along the up or down edge if we can */
if (suv) {
if (!suv->uv_up) {
@@ -4253,7 +4283,7 @@ useless:
else if (efa->v3==ev_down) suv->uv_down = tf->uv[2];
else if (efa->v4 && efa->v4==ev_down) suv->uv_down = tf->uv[3];
}
-
+
/* Copy the pointers to the face UV's */
BLI_linklist_prepend(&suv->fuv_list, uv_new);
}
@@ -4264,32 +4294,32 @@ useless:
}
} /* end uv layer loop */
} /* end uvlay_tot */
-
-
-
+
+
+
// we should have enough info now to slide
- len = 0.0f;
-
+ len = 0.0f;
+
percp = -1;
while(draw) {
- /* For the % calculation */
- short mval[2];
+ /* For the % calculation */
+ short mval[2];
float rc[2];
float v2[2], v3[2];
EditVert *centerVert, *upVert, *downVert;
-
-// XXX getmouseco_areawin(mval);
-
+
+// XXX getmouseco_areawin(mval);
+
if (!immediate && (mval[0] == mvalo[0] && mval[1] == mvalo[1])) {
PIL_sleep_ms(10);
} else {
char *p = str;
int ctrl= 0, shift= 0; // XXX
-
+
mvalo[0] = mval[0];
mvalo[1] = mval[1];
-
+
tempsv = BLI_ghash_lookup(vertgh,nearest);
@@ -4300,31 +4330,31 @@ useless:
// view3d_project_float(curarea, upVert->co, v2, projectMat);
// view3d_project_float(curarea, downVert->co, v3, projectMat);
- /* Determine the % on which the loop should be cut */
+ /* Determine the % on which the loop should be cut */
- rc[0]= v3[0]-v2[0];
- rc[1]= v3[1]-v2[1];
+ rc[0]= v3[0]-v2[0];
+ rc[1]= v3[1]-v2[1];
len= rc[0]*rc[0]+ rc[1]*rc[1];
if (len==0) {len = 0.0001;}
if (shift) {
wasshift = 0;
- labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len;
+ labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len;
}
else {
if (wasshift==0) {
wasshift = 1;
shiftlabda = labda;
- }
- labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len / 10.0 + shiftlabda;
+ }
+ labda= ( rc[0]*((mval[0]-v2[0])) + rc[1]*((mval[1]-v2[1])) )/len / 10.0 + shiftlabda;
}
-
- if(labda<=0.0) labda=0.0;
- else if(labda>=1.0)labda=1.0;
- perc=((1-labda)*2)-1;
-
+ if(labda<=0.0) labda=0.0;
+ else if(labda>=1.0)labda=1.0;
+
+ perc=((1-labda)*2)-1;
+
if(shift == 0 && ctrl==0) {
perc *= 100;
perc = floor(perc);
@@ -4332,20 +4362,20 @@ useless:
} else if (ctrl) {
perc *= 10;
perc = floor(perc);
- perc /= 10;
- }
-
+ perc /= 10;
+ }
+
if(prop == 0) {
len = VecLenf(upVert->co,downVert->co)*((perc+1)/2);
if(flip == 1) {
len = VecLenf(upVert->co,downVert->co) - len;
- }
+ }
}
-
+
if (0) // XXX hasNumInput(&num))
{
// XXX applyNumInput(&num, &perc);
-
+
if (prop)
{
perc = MIN2(perc, 1);
@@ -4360,19 +4390,19 @@ useless:
//Adjust Edgeloop
if(immediate) {
- perc = imperc;
+ perc = imperc;
}
percp = perc;
if(prop) {
- look = vertlist;
- while(look) {
+ look = vertlist;
+ while(look) {
EditVert *tempev;
ev = look->link;
tempsv = BLI_ghash_lookup(vertgh,ev);
-
+
tempev = editedge_getOtherVert((perc>=0)?tempsv->up:tempsv->down, ev);
VecLerpf(ev->co, tempsv->origvert.co, tempev->co, fabs(perc));
-
+
if (0) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
suv = BLI_ghash_lookup( uvarray[uvlay_idx], ev );
@@ -4386,14 +4416,14 @@ useless:
}
}
}
-
- look = look->next;
+
+ look = look->next;
}
}
else {
- //Non prop code
- look = vertlist;
- while(look) {
+ //Non prop code
+ look = vertlist;
+ while(look) {
float newlen;
ev = look->link;
tempsv = BLI_ghash_lookup(vertgh,ev);
@@ -4401,7 +4431,7 @@ useless:
if(newlen > 1.0) {newlen = 1.0;}
if(newlen < 0.0) {newlen = 0.0;}
if(flip == 0) {
- VecLerpf(ev->co, editedge_getOtherVert(tempsv->down,ev)->co, editedge_getOtherVert(tempsv->up,ev)->co, fabs(newlen));
+ VecLerpf(ev->co, editedge_getOtherVert(tempsv->down,ev)->co, editedge_getOtherVert(tempsv->up,ev)->co, fabs(newlen));
if (0) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
/* dont do anything if no UVs */
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
@@ -4417,8 +4447,8 @@ useless:
}
}
} else{
- VecLerpf(ev->co, editedge_getOtherVert(tempsv->up,ev)->co, editedge_getOtherVert(tempsv->down,ev)->co, fabs(newlen));
-
+ VecLerpf(ev->co, editedge_getOtherVert(tempsv->up,ev)->co, editedge_getOtherVert(tempsv->down,ev)->co, fabs(newlen));
+
if (0) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
/* dont do anything if no UVs */
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
@@ -4434,23 +4464,23 @@ useless:
}
}
}
- look = look->next;
+ look = look->next;
}
}
-
+
// Highlight the Control Edges
-// scrarea_do_windraw(curarea);
-// persp(PERSP_VIEW);
-// glPushMatrix();
+// scrarea_do_windraw(curarea);
+// persp(PERSP_VIEW);
+// glPushMatrix();
// mymultmatrix(obedit->obmat);
- glColor3ub(0, 255, 0);
+ glColor3ub(0, 255, 0);
glBegin(GL_LINES);
glVertex3fv(upVert->co);
glVertex3fv(downVert->co);
- glEnd();
-
+ glEnd();
+
if(prop == 0) {
// draw start edge for non-prop
glPointSize(5);
@@ -4459,24 +4489,24 @@ useless:
if(flip) {
glVertex3fv(upVert->co);
} else {
- glVertex3fv(downVert->co);
+ glVertex3fv(downVert->co);
}
- glEnd();
+ glEnd();
}
-
-
- glPopMatrix();
+
+
+ glPopMatrix();
if(prop) {
p += sprintf(str, "(P)ercentage: ");
} else {
p += sprintf(str, "Non (P)rop Length: ");
}
-
+
if (0) // XXX hasNumInput(&num))
{
char num_str[20];
-
+
// XX outputNumInput(&num, num_str);
p += sprintf(p, "%s", num_str);
}
@@ -4491,20 +4521,20 @@ useless:
p += sprintf(p, "%f", len);
}
}
-
-
+
+
if (prop == 0) {
p += sprintf(p, ", Press (F) to flip control side");
}
// headerprint(str);
-// screen_swapbuffers();
+// screen_swapbuffers();
}
if(!immediate) {
while(qtest()) {
- short val=0;
- event= extern_qread(&val); // extern_qread stores important events for the mainloop to handle
-
+ short val=0;
+ event= extern_qread(&val); // extern_qread stores important events for the mainloop to handle
+
/* val==0 on key-release event */
if (val) {
if(ELEM(event, ESCKEY, RIGHTMOUSE)) {
@@ -4516,7 +4546,7 @@ useless:
} else if(ELEM3(event, PADENTER, LEFTMOUSE, RETKEY)) {
draw = 0; // End looping now
} else if(event==MIDDLEMOUSE) {
- perc = 0;
+ perc = 0;
immediate = 1;
} else if(event==PKEY) {
// XXX initNumInput(&num); /* reset num input */
@@ -4527,61 +4557,61 @@ useless:
else {
prop = 1;
}
- mvalo[0] = -1;
+ mvalo[0] = -1;
} else if(event==FKEY) {
- (flip == 1) ? (flip = 0):(flip = 1);
- mvalo[0] = -1;
+ (flip == 1) ? (flip = 0):(flip = 1);
+ mvalo[0] = -1;
} else if(ELEM(event, RIGHTARROWKEY, WHEELUPMOUSE)) { // Scroll through Control Edges
- look = vertlist;
- while(look) {
+ look = vertlist;
+ while(look) {
if(nearest == (EditVert*)look->link) {
if(look->next == NULL) {
- nearest = (EditVert*)vertlist->link;
+ nearest = (EditVert*)vertlist->link;
} else {
nearest = (EditVert*)look->next->link;
- }
+ }
mvalo[0] = -1;
- break;
+ break;
}
- look = look->next;
- }
+ look = look->next;
+ }
} else if(ELEM(event, LEFTARROWKEY, WHEELDOWNMOUSE)) { // Scroll through Control Edges
- look = vertlist;
- while(look) {
+ look = vertlist;
+ while(look) {
if(look->next) {
if(look->next->link == nearest) {
nearest = (EditVert*)look->link;
mvalo[0] = -1;
break;
- }
+ }
} else {
if((EditVert*)vertlist->link == nearest) {
nearest = look->link;
mvalo[0] = -1;
- break;
- }
- }
- look = look->next;
- }
+ break;
+ }
+ }
+ look = look->next;
+ }
}
-
+
// XXX if (handleNumInput(&num, event))
{
mvalo[0] = -1; /* NEED A BETTER WAY TO TRIGGER REDRAW */
}
}
-
- }
+
+ }
} else {
draw = 0;
}
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
}
-
-
+
+
if(me->drawflag & ME_DRAW_EDGELEN) {
look = vertlist;
- while(look) {
+ while(look) {
tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
if(tempsv != NULL) {
tempsv->up->f &= !SELECT;
@@ -4590,26 +4620,26 @@ useless:
look = look->next;
}
}
-
+
// force_draw(0);
-
+
if(!immediate)
EM_automerge(0);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-// scrarea_queue_winredraw(curarea);
-
- //BLI_ghash_free(edgesgh, freeGHash, NULL);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+// scrarea_queue_winredraw(curarea);
+
+ //BLI_ghash_free(edgesgh, freeGHash, NULL);
BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
- BLI_linklist_free(vertlist,NULL);
- BLI_linklist_free(edgelist,NULL);
-
+ BLI_linklist_free(vertlist,NULL);
+ BLI_linklist_free(edgelist,NULL);
+
if (uvlay_tot) { // XXX && (scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT)) {
for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
BLI_ghash_free(uvarray[uvlay_idx], NULL, NULL);
}
MEM_freeN(uvarray);
MEM_freeN(slideuvs);
-
+
suv = suv_last-1;
while (suv >= slideuvs) {
if (suv->fuv_list) {
@@ -4624,29 +4654,32 @@ useless:
}
return 1;
-#endif // END OF XXX
}
+#endif // END OF XXX
-int EdgeLoopDelete(EditMesh *em, wmOperator *op)
+int EdgeLoopDelete(EditMesh *em, wmOperator *op)
{
-
+#if 0 //XXX won't work with new edgeslide
+
/* temporal flag setting so we keep UVs when deleting edge loops,
* this is a bit of a hack but it works how you would want in almost all cases */
- // short uvcalc_flag_orig = 0; // XXX scene->toolsettings->uvcalc_flag;
+ // short uvcalc_flag_orig = 0; // XXX scene->toolsettings->uvcalc_flag;
// scene->toolsettings->uvcalc_flag |= UVCALC_TRANSFORM_CORRECT;
-
+
if(!EdgeSlide(em, op, 1, 1)) {
return 0;
}
-
+
/* restore uvcalc flag */
// scene->toolsettings->uvcalc_flag = uvcalc_flag_orig;
-
+
EM_select_more(em);
removedoublesflag(em, 1,0, 0.001);
EM_select_flush(em);
- // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ // DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
return 1;
+#endif
+ return 0;
}
@@ -4662,12 +4695,12 @@ void mesh_set_face_flags(EditMesh *em, short mode)
m_billboard=0, m_shadow=0, m_text=0,
m_sort=0;
short flag = 0, change = 0;
-
+
// XXX if (!EM_texFaceCheck()) {
// error("not a mesh with uv/image layers");
// return;
// }
-
+
add_numbut(0, TOG|SHO, "Texture", 0, 0, &m_tex, NULL);
add_numbut(2, TOG|SHO, "Light", 0, 0, &m_light, NULL);
add_numbut(3, TOG|SHO, "Invisible", 0, 0, &m_invis, NULL);
@@ -4680,15 +4713,15 @@ void mesh_set_face_flags(EditMesh *em, short mode)
add_numbut(10, TOG|SHO, "Shadow", 0, 0, &m_shadow, NULL);
add_numbut(11, TOG|SHO, "Text", 0, 0, &m_text, NULL);
add_numbut(12, TOG|SHO, "Sort", 0, 0, &m_sort, NULL);
-
+
if (!do_clever_numbuts((mode ? "Set Flags" : "Clear Flags"), 13, REDRAW))
return;
-
+
/* these 2 cant both be on */
if (mode) /* are we seeting*/
if (m_halo)
m_billboard = 0;
-
+
if (m_tex) flag |= TF_TEX;
if (m_shared) flag |= TF_SHAREDCOL;
if (m_light) flag |= TF_LIGHT;
@@ -4701,10 +4734,10 @@ void mesh_set_face_flags(EditMesh *em, short mode)
if (m_shadow) flag |= TF_SHADOW;
if (m_text) flag |= TF_BMFONT;
if (m_sort) flag |= TF_ALPHASORT;
-
+
if (flag==0)
return;
-
+
efa= em->faces.first;
while(efa) {
if(efa->f & SELECT) {
@@ -4715,41 +4748,22 @@ void mesh_set_face_flags(EditMesh *em, short mode)
}
efa= efa->next;
}
-
-}
-#endif
-
-void mesh_set_smooth_faces(EditMesh *em, short event)
-{
- EditFace *efa;
- if(em==NULL) return;
-
- efa= em->faces.first;
- while(efa) {
- if(efa->f & SELECT) {
- if(event==1) efa->flag |= ME_SMOOTH;
- else if(event==0) efa->flag &= ~ME_SMOOTH;
- }
- efa= efa->next;
- }
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
}
+#endif
-/* ********************** mesh rip ********************** */
+/********************** Rip Operator *************************/
/* helper to find edge for edge_rip */
static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, short *mval)
{
float vec1[3], vec2[3], mvalf[2];
-
+
view3d_project_float(ar, co1, vec1, mat);
view3d_project_float(ar, co2, vec2, mat);
mvalf[0]= (float)mval[0];
mvalf[1]= (float)mval[1];
-
+
return PdistVL2Dfl(mvalf, vec1, vec2);
}
@@ -4761,16 +4775,16 @@ static void mesh_rip_setface(EditMesh *em, EditFace *sefa)
if(sefa->v2->tmp.v) sefa->v2= sefa->v2->tmp.v;
if(sefa->v3->tmp.v) sefa->v3= sefa->v3->tmp.v;
if(sefa->v4 && sefa->v4->tmp.v) sefa->v4= sefa->v4->tmp.v;
-
+
sefa->e1= addedgelist(em, sefa->v1, sefa->v2, sefa->e1);
sefa->e2= addedgelist(em, sefa->v2, sefa->v3, sefa->e2);
if(sefa->v4) {
sefa->e3= addedgelist(em, sefa->v3, sefa->v4, sefa->e3);
sefa->e4= addedgelist(em, sefa->v4, sefa->v1, sefa->e4);
}
- else
+ else
sefa->e3= addedgelist(em, sefa->v3, sefa->v1, sefa->e3);
-
+
}
/* based on mouse cursor position, it defines how is being ripped */
@@ -4784,32 +4798,26 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
EditEdge *eed, *seed= NULL;
EditFace *efa, *sefa= NULL;
float projectMat[4][4], vec[3], dist, mindist;
- short doit= 1, *mval= event->mval; // XXX ,propmode,prop;
-
-
-// XXX propmode = scene->prop_mode;
-// scene->prop_mode = 0;
-// prop = scene->proportional;
-// scene->proportional = 0;
-
+ short doit= 1, *mval= event->mval;
+
/* select flush... vertices are important */
EM_selectmode_set(em);
-
+
view3d_get_object_project_mat(rv3d, obedit, projectMat);
/* find best face, exclude triangles and break on face select or faces with 2 edges select */
mindist= 1000000.0f;
for(efa= em->faces.first; efa; efa=efa->next) {
- if( efa->f & 1)
+ if( efa->f & 1)
break;
if(efa->v4 && faceselectedOR(efa, SELECT) ) {
int totsel=0;
-
+
if(efa->e1->f & SELECT) totsel++;
if(efa->e2->f & SELECT) totsel++;
if(efa->e3->f & SELECT) totsel++;
if(efa->e4->f & SELECT) totsel++;
-
+
if(totsel>1)
break;
view3d_project_float(ar, efa->cent, vec, projectMat);
@@ -4820,7 +4828,7 @@ 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_mesh_end_editmesh(obedit->data, em);
@@ -4831,7 +4839,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
+
/* duplicate vertices, new vertices get selected */
for(eve = em->verts.last; eve; eve= eve->prev) {
@@ -4842,20 +4850,20 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
eve->tmp.v->f |= SELECT;
}
}
-
+
/* find the best candidate edge */
/* or one of sefa edges is selected... */
if(sefa->e1->f & SELECT) seed= sefa->e2;
if(sefa->e2->f & SELECT) seed= sefa->e1;
if(sefa->e3->f & SELECT) seed= sefa->e2;
if(sefa->e4 && sefa->e4->f & SELECT) seed= sefa->e3;
-
+
/* or we do the distance trick */
if(seed==NULL) {
mindist= 1000000.0f;
if(sefa->e1->v1->tmp.v || sefa->e1->v2->tmp.v) {
- dist = mesh_rip_edgedist(ar, projectMat,
- sefa->e1->v1->co,
+ dist = mesh_rip_edgedist(ar, projectMat,
+ sefa->e1->v1->co,
sefa->e1->v2->co, mval);
if(dist<mindist) {
seed= sefa->e1;
@@ -4864,7 +4872,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
if(sefa->e2->v1->tmp.v || sefa->e2->v2->tmp.v) {
dist = mesh_rip_edgedist(ar, projectMat,
- sefa->e2->v1->co,
+ sefa->e2->v1->co,
sefa->e2->v2->co, mval);
if(dist<mindist) {
seed= sefa->e2;
@@ -4872,8 +4880,8 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
if(sefa->e3->v1->tmp.v || sefa->e3->v2->tmp.v) {
- dist= mesh_rip_edgedist(ar, projectMat,
- sefa->e3->v1->co,
+ dist= mesh_rip_edgedist(ar, projectMat,
+ sefa->e3->v1->co,
sefa->e3->v2->co, mval);
if(dist<mindist) {
seed= sefa->e3;
@@ -4881,8 +4889,8 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
if(sefa->e4 && (sefa->e4->v1->tmp.v || sefa->e4->v2->tmp.v)) {
- dist= mesh_rip_edgedist(ar, projectMat,
- sefa->e4->v1->co,
+ dist= mesh_rip_edgedist(ar, projectMat,
+ sefa->e4->v1->co,
sefa->e4->v2->co, mval);
if(dist<mindist) {
seed= sefa->e4;
@@ -4890,13 +4898,13 @@ 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_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
+
faceloop_select(em, seed, 2); // tmp abuse for finding all edges that need duplicated, returns OK faces with f1
/* duplicate edges in the loop, with at least 1 vertex selected, needed for selection flip */
@@ -4904,8 +4912,8 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
eed->tmp.v = NULL;
if((eed->v1->tmp.v) || (eed->v2->tmp.v)) {
EditEdge *newed;
-
- newed= addedgelist(em, eed->v1->tmp.v?eed->v1->tmp.v:eed->v1,
+
+ newed= addedgelist(em, eed->v1->tmp.v?eed->v1->tmp.v:eed->v1,
eed->v2->tmp.v?eed->v2->tmp.v:eed->v2, eed);
if(eed->f & SELECT) {
EM_select_edge(eed, 0);
@@ -4921,16 +4929,16 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* put new vertices & edges && flag in best face */
mesh_rip_setface(em, sefa);
-
+
/* starting with neighbours of best face, we loop over the seam */
sefa->f1= 2;
doit= 1;
while(doit) {
doit= 0;
-
+
for(efa= em->faces.first; efa; efa=efa->next) {
/* new vert in face */
- if (efa->v1->tmp.v || efa->v2->tmp.v ||
+ if (efa->v1->tmp.v || efa->v2->tmp.v ||
efa->v3->tmp.v || (efa->v4 && efa->v4->tmp.v)) {
/* face is tagged with loop */
if(efa->f1==1) {
@@ -4939,9 +4947,9 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
doit= 1;
}
}
- }
+ }
}
-
+
/* remove loose edges, that were part of a ripped face */
for(eve = em->verts.first; eve; eve= eve->next) eve->f1= 0;
for(eed = em->edges.last; eed; eed= eed->prev) eed->f1= 0;
@@ -4951,11 +4959,11 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
efa->e3->f1= 1;
if(efa->e4) efa->e4->f1= 1;
}
-
+
for(eed = em->edges.last; eed; eed= seed) {
seed= eed->prev;
if(eed->f1==0) {
- if(eed->v1->tmp.v || eed->v2->tmp.v ||
+ if(eed->v1->tmp.v || eed->v2->tmp.v ||
(eed->v1->f & SELECT) || (eed->v2->f & SELECT)) {
remedge(em, eed);
free_editedge(em, eed);
@@ -4967,7 +4975,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
eed->v2->f1= 1;
}
}
-
+
/* and remove loose selected vertices, that got duplicated accidentally */
for(eve = em->verts.first; eve; eve= nextve) {
nextve= eve->next;
@@ -4976,14 +4984,16 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
free_editvert(em, eve);
}
}
-
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
-// scene->prop_mode = propmode;
-// XXX scene->proportional = prop;
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
+
+// RNA_enum_set(op->ptr, "proportional", 0);
+// RNA_boolean_set(op->ptr, "mirror", 0);
+// WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
return OPERATOR_FINISHED;
}
@@ -4991,21 +5001,23 @@ void MESH_OT_rip(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Rip";
+ ot->description= "Rip selection from mesh (quads only).";
ot->idname= "MESH_OT_rip";
-
+
/* api callbacks */
ot->invoke= mesh_rip_invoke;
ot->poll= EM_view3d_poll;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ Properties_Proportional(ot);
+ RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
}
-/* ************************************** */
+/************************ Shape Operators *************************/
void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
{
@@ -5014,39 +5026,39 @@ void shape_propagate(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
Key* ky = NULL;
KeyBlock* kb = NULL;
Base* base=NULL;
-
-
+
+
if(me->key){
ky = me->key;
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
return;
- }
+ }
if(ky->block.first){
for(ev = em->verts.first; ev ; ev = ev->next){
if(ev->f & SELECT){
for(kb=ky->block.first;kb;kb = kb->next){
- float *data;
- data = kb->data;
- VECCOPY(data+(ev->keyindex*3),ev->co);
+ float *data;
+ data = kb->data;
+ VECCOPY(data+(ev->keyindex*3),ev->co);
}
- }
- }
+ }
+ }
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
- return;
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
+ return;
}
-
+
//TAG Mesh Objects that share this data
for(base = scene->base.first; base; base = base->next){
if(base->object && base->object->data == me){
base->object->recalc = OB_RECALC_DATA;
}
- }
+ }
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- return;
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ return;
}
void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock)
@@ -5056,10 +5068,10 @@ void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock
float perc = 0;
char str[64];
float *data, *odata;
-
+
data = fromBlock->data;
odata = thisBlock->data;
-
+
// XXX getmouseco_areawin(mval);
curval[0] = mval[0] + 1; curval[1] = mval[1] + 1;
@@ -5068,55 +5080,55 @@ void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock
// XXX getmouseco_areawin(mval);
if (mval[0] != curval[0] || mval[1] != curval[1])
{
-
+
if(mval[0] > curval[0])
perc += 0.1;
else if(mval[0] < curval[0])
perc -= 0.1;
-
+
if(perc < 0) perc = 0;
if(perc > 1) perc = 1;
-
+
curval[0] = mval[0];
curval[1] = mval[1];
if(fullcopy == 1){
- perc = 1;
+ perc = 1;
}
for(ev = em->verts.first; ev ; ev = ev->next){
if(ev->f & SELECT){
VecLerpf(ev->co,odata+(ev->keyindex*3),data+(ev->keyindex*3),perc);
- }
- }
+ }
+ }
sprintf(str,"Blending at %d%c MMB to Copy at 100%c",(int)(perc*100),'%','%');
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
// headerprint(str);
-// force_draw(0);
+// force_draw(0);
if(fullcopy == 1){
- break;
+ break;
}
} else {
- PIL_sleep_ms(10);
+ PIL_sleep_ms(10);
}
while(qtest()) {
- short val=0;
- event= extern_qread(&val);
+ short val=0;
+ event= extern_qread(&val);
if(val){
if(ELEM3(event, PADENTER, LEFTMOUSE, RETKEY)){
finished = 1;
}
else if (event == MIDDLEMOUSE){
- fullcopy = 1;
+ fullcopy = 1;
}
else if (ELEM3(event,ESCKEY,RIGHTMOUSE,RIGHTMOUSE)){
canceled = 1;
finished = 1;
}
- }
+ }
}
}
if(!canceled);
@@ -5124,7 +5136,7 @@ void shape_copy_from_lerp(EditMesh *em, KeyBlock* thisBlock, KeyBlock* fromBlock
for(ev = em->verts.first; ev ; ev = ev->next){
if(ev->f & SELECT){
VECCOPY(ev->co, odata+(ev->keyindex*3));
- }
+ }
}
return;
}
@@ -5136,66 +5148,68 @@ void shape_copy_select_from(Object *obedit, EditMesh *em, wmOperator *op)
Mesh* me = (Mesh*)obedit->data;
EditVert *ev = NULL;
int totverts = 0,curshape = obedit->shapenr;
-
+
Key* ky = NULL;
KeyBlock *kb = NULL,*thisBlock = NULL;
int maxlen=32, nr=0, a=0;
char *menu;
-
+
if(me->key){
ky = me->key;
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Key");
return;
}
-
+
if(ky->block.first){
for(kb=ky->block.first;kb;kb = kb->next){
maxlen += 40; // Size of a block name
if(a == curshape-1){
- thisBlock = kb;
+ thisBlock = kb;
}
-
+
a++;
}
a=0;
menu = MEM_callocN(maxlen, "Copy Shape Menu Text");
strcpy(menu, "Copy Vert Positions from Shape %t|");
for(kb=ky->block.first;kb;kb = kb->next){
- if(a != curshape-1){
+ if(a != curshape-1){
sprintf(menu,"%s %s %cx%d|",menu,kb->name,'%',a);
}
a++;
}
// XXX nr = pupmenu_col(menu, 20);
- MEM_freeN(menu);
+ MEM_freeN(menu);
} else {
- BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
- return;
+ BKE_report(op->reports, RPT_ERROR, "Object Has No Blendshapes");
+ return;
}
-
+
a = 0;
-
+
for(kb=ky->block.first;kb;kb = kb->next){
if(a == nr){
-
+
for(ev = em->verts.first;ev;ev = ev->next){
totverts++;
}
-
+
if(me->totvert != totverts){
BKE_report(op->reports, RPT_ERROR, "Shape Has had Verts Added/Removed, please cycle editmode before copying");
- return;
+ return;
}
- shape_copy_from_lerp(em, thisBlock,kb);
-
+ shape_copy_from_lerp(em, thisBlock,kb);
+
return;
}
a++;
- }
+ }
return;
}
+/************************ Merge Operator *************************/
+
/* Collection Routines|Currently used by the improved merge code*/
/* buildEdge_collection() creates a list of lists*/
/* these lists are filled with edges that are topologically connected.*/
@@ -5219,17 +5233,17 @@ static void build_edgecollection(EditMesh *em, ListBase *allcollections)
EditEdge *eed;
Collection *edgecollection, *newcollection;
CollectedEdge *newedge;
-
+
int currtag = 1;
short ebalanced = 0;
short collectionfound = 0;
-
- for (eed=em->edges.first; eed; eed = eed->next){
+
+ for (eed=em->edges.first; eed; eed = eed->next){
eed->tmp.l = 0;
eed->v1->tmp.l = 0;
eed->v2->tmp.l = 0;
}
-
+
/*1st pass*/
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f&SELECT){
@@ -5238,26 +5252,26 @@ static void build_edgecollection(EditMesh *em, ListBase *allcollections)
currtag +=1;
}
}
-
+
/*2nd pass - Brute force. Loop through selected faces until there are no 'unbalanced' edges left (those with both vertices 'tmp.l' tag matching */
while(ebalanced == 0){
ebalanced = 1;
for(eed=em->edges.first; eed; eed = eed->next){
if(eed->f&SELECT){
if(eed->v1->tmp.l != eed->v2->tmp.l) /*unbalanced*/{
- if(eed->v1->tmp.l > eed->v2->tmp.l && eed->v2->tmp.l !=0) eed->v1->tmp.l = eed->v2->tmp.l;
- else if(eed->v1 != 0) eed->v2->tmp.l = eed->v1->tmp.l;
+ if(eed->v1->tmp.l > eed->v2->tmp.l && eed->v2->tmp.l !=0) eed->v1->tmp.l = eed->v2->tmp.l;
+ else if(eed->v1 != 0) eed->v2->tmp.l = eed->v1->tmp.l;
ebalanced = 0;
}
}
}
}
-
+
/*3rd pass, set all the edge flags (unnessecary?)*/
for(eed=em->edges.first; eed; eed = eed->next){
if(eed->f&SELECT) eed->tmp.l = eed->v1->tmp.l;
}
-
+
for(eed=em->edges.first; eed; eed=eed->next){
if(eed->f&SELECT){
if(allcollections->first){
@@ -5277,28 +5291,28 @@ static void build_edgecollection(EditMesh *em, ListBase *allcollections)
newcollection->index = eed->tmp.l;
newcollection->collectionbase.first = 0;
newcollection->collectionbase.last = 0;
-
+
newedge = MEM_mallocN(sizeof(CollectedEdge), "collected edge");
newedge->eed = eed;
-
+
BLI_addtail(&(newcollection->collectionbase), newedge);
BLI_addtail(allcollections, newcollection);
}
}
-
+
}
}
static void freecollections(ListBase *allcollections)
{
struct Collection *curcollection;
-
+
for(curcollection = allcollections->first; curcollection; curcollection = curcollection->next)
BLI_freelistN(&(curcollection->collectionbase));
BLI_freelistN(allcollections);
}
-/*Begin UV Edge Collapse Code
+/*Begin UV Edge Collapse Code
Like Edge subdivide, Edge Collapse should handle UV's intelligently, but since UV's are a per-face attribute, normal edge collapse will fail
in areas such as the boundries of 'UV islands'. So for each edge collection we need to build a set of 'welded' UV vertices and edges for it.
The welded UV edges can then be sorted and collapsed.
@@ -5328,7 +5342,7 @@ typedef struct wUVEdge{
typedef struct wUVEdgeCollect{ /*used for grouping*/
struct wUVEdgeCollect *next, *prev;
wUVEdge *uved;
- int id;
+ int id;
} wUVEdgeCollect;
static void append_weldedUV(EditMesh *em, EditFace *efa, EditVert *eve, int tfindex, ListBase *uvverts)
@@ -5337,9 +5351,9 @@ static void append_weldedUV(EditMesh *em, EditFace *efa, EditVert *eve, int tfin
wUVNode *newnode;
int found;
MTFace *tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-
+
found = 0;
-
+
for(curwvert=uvverts->first; curwvert; curwvert=curwvert->next){
if(curwvert->eve == eve && curwvert->u == tf->uv[tfindex][0] && curwvert->v == tf->uv[tfindex][1]){
newnode = MEM_callocN(sizeof(wUVNode), "Welded UV Vert Node");
@@ -5350,20 +5364,20 @@ static void append_weldedUV(EditMesh *em, EditFace *efa, EditVert *eve, int tfin
break;
}
}
-
+
if(!found){
newnode = MEM_callocN(sizeof(wUVNode), "Welded UV Vert Node");
newnode->u = &(tf->uv[tfindex][0]);
newnode->v = &(tf->uv[tfindex][1]);
-
+
newwvert = MEM_callocN(sizeof(wUV), "Welded UV Vert");
newwvert->u = *(newnode->u);
newwvert->v = *(newnode->v);
newwvert->eve = eve;
-
+
BLI_addtail(&(newwvert->nodes), newnode);
BLI_addtail(uvverts, newwvert);
-
+
}
}
@@ -5383,14 +5397,14 @@ static void append_weldedUVEdge(EditMesh *em, EditFace *efa, EditEdge *eed, List
wUVEdge *curwedge, *newwedge;
int v1tfindex, v2tfindex, found;
MTFace *tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
-
+
found = 0;
-
+
if(eed->v1 == efa->v1) v1tfindex = 0;
else if(eed->v1 == efa->v2) v1tfindex = 1;
else if(eed->v1 == efa->v3) v1tfindex = 2;
else /* if(eed->v1 == efa->v4) */ v1tfindex = 3;
-
+
if(eed->v2 == efa->v1) v2tfindex = 0;
else if(eed->v2 == efa->v2) v2tfindex = 1;
else if(eed->v2 == efa->v3) v2tfindex = 2;
@@ -5402,7 +5416,7 @@ static void append_weldedUVEdge(EditMesh *em, EditFace *efa, EditEdge *eed, List
break; //do nothing, we don't need another welded uv edge
}
}
-
+
if(!found){
newwedge = MEM_callocN(sizeof(wUVEdge), "Welded UV Edge");
newwedge->v1uv[0] = tf->uv[v1tfindex][0];
@@ -5410,7 +5424,7 @@ static void append_weldedUVEdge(EditMesh *em, EditFace *efa, EditEdge *eed, List
newwedge->v2uv[0] = tf->uv[v2tfindex][0];
newwedge->v2uv[1] = tf->uv[v2tfindex][1];
newwedge->eed = eed;
-
+
BLI_addtail(uvedges, newwedge);
}
}
@@ -5420,15 +5434,15 @@ static void build_weldedUVEdges(EditMesh *em, ListBase *uvedges, ListBase *uvver
wUV *curwvert;
wUVEdge *curwedge;
EditFace *efa;
-
+
for(efa=em->faces.first; efa; efa=efa->next){
if(efa->e1->f1) append_weldedUVEdge(em, efa, efa->e1, uvedges);
if(efa->e2->f1) append_weldedUVEdge(em, efa, efa->e2, uvedges);
if(efa->e3->f1) append_weldedUVEdge(em, efa, efa->e3, uvedges);
if(efa->e4 && efa->e4->f1) append_weldedUVEdge(em, efa, efa->e4, uvedges);
}
-
-
+
+
//link vertices: for each uvedge, search uvverts to populate v1 and v2 pointers
for(curwedge=uvedges->first; curwedge; curwedge=curwedge->next){
for(curwvert=uvverts->first; curwvert; curwvert=curwvert->next){
@@ -5465,20 +5479,20 @@ static void collapse_edgeuvs(EditMesh *em)
if (!EM_texFaceCheck(em))
return;
-
+
uvverts.first = uvverts.last = uvedges.first = uvedges.last = allcollections.first = allcollections.last = NULL;
-
+
build_weldedUVs(em, &uvverts);
build_weldedUVEdges(em, &uvedges, &uvverts);
-
+
curtag = 0;
-
+
for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next){
curwedge->v1->f = curtag;
curwedge->v2->f = curtag;
curtag +=1;
}
-
+
balanced = 0;
while(!balanced){
balanced = 1;
@@ -5490,10 +5504,10 @@ static void collapse_edgeuvs(EditMesh *em)
}
}
}
-
+
for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next) curwedge->f = curwedge->v1->f;
-
-
+
+
for(curwedge=uvedges.first; curwedge; curwedge=curwedge->next){
if(allcollections.first){
for(wuvecollection = allcollections.first; wuvecollection; wuvecollection=wuvecollection->next){
@@ -5504,7 +5518,7 @@ static void collapse_edgeuvs(EditMesh *em)
collectionfound = 1;
break;
}
-
+
else collectionfound = 0;
}
}
@@ -5513,32 +5527,32 @@ static void collapse_edgeuvs(EditMesh *em)
newcollection->index = curwedge->f;
newcollection->collectionbase.first = 0;
newcollection->collectionbase.last = 0;
-
+
newcollectedwuve = MEM_callocN(sizeof(wUVEdgeCollect), "Collected Welded UV Edge");
newcollectedwuve->uved = curwedge;
-
+
BLI_addtail(&(newcollection->collectionbase), newcollectedwuve);
BLI_addtail(&allcollections, newcollection);
}
}
-
+
for(wuvecollection=allcollections.first; wuvecollection; wuvecollection=wuvecollection->next){
-
+
vcount = avg[0] = avg[1] = 0;
-
+
for(collectedwuve= wuvecollection->collectionbase.first; collectedwuve; collectedwuve = collectedwuve->next){
avg[0] += collectedwuve->uved->v1uv[0];
avg[1] += collectedwuve->uved->v1uv[1];
-
+
avg[0] += collectedwuve->uved->v2uv[0];
avg[1] += collectedwuve->uved->v2uv[1];
-
+
vcount +=2;
-
+
}
-
+
avg[0] /= vcount; avg[1] /= vcount;
-
+
for(collectedwuve= wuvecollection->collectionbase.first; collectedwuve; collectedwuve = collectedwuve->next){
for(curwnode=collectedwuve->uved->v1->nodes.first; curwnode; curwnode=curwnode->next){
*(curwnode->u) = avg[0];
@@ -5550,7 +5564,7 @@ static void collapse_edgeuvs(EditMesh *em)
}
}
}
-
+
free_weldedUVs(&uvverts);
BLI_freelistN(&uvedges);
freecollections(&allcollections);
@@ -5567,11 +5581,11 @@ static void collapseuvs(EditMesh *em, EditVert *mergevert)
if (!EM_texFaceCheck(em))
return;
-
+
uvcount = 0;
uvav[0] = 0;
uvav[1] = 0;
-
+
for(efa = em->faces.first; efa; efa=efa->next){
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
@@ -5581,7 +5595,7 @@ static void collapseuvs(EditMesh *em, EditVert *mergevert)
uvcount += 1;
}
if(efa->v2->f1 && ELEM(mergevert, NULL, efa->v2)){
- uvav[0] += tf->uv[1][0];
+ uvav[0] += tf->uv[1][0];
uvav[1] += tf->uv[1][1];
uvcount += 1;
}
@@ -5596,11 +5610,11 @@ static void collapseuvs(EditMesh *em, EditVert *mergevert)
uvcount += 1;
}
}
-
+
if(uvcount > 0) {
- uvav[0] /= uvcount;
+ uvav[0] /= uvcount;
uvav[1] /= uvcount;
-
+
for(efa = em->faces.first; efa; efa=efa->next){
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
@@ -5609,7 +5623,7 @@ static void collapseuvs(EditMesh *em, EditVert *mergevert)
tf->uv[0][1] = uvav[1];
}
if(efa->v2->f1){
- tf->uv[1][0] = uvav[0];
+ tf->uv[1][0] = uvav[0];
tf->uv[1][1] = uvav[1];
}
if(efa->v3->f1){
@@ -5624,53 +5638,53 @@ static void collapseuvs(EditMesh *em, EditVert *mergevert)
}
}
-int collapseEdges(EditMesh *em)
+static int collapseEdges(EditMesh *em)
{
EditVert *eve;
EditEdge *eed;
-
+
ListBase allcollections;
CollectedEdge *curredge;
Collection *edgecollection;
-
+
int totedges, groupcount, mergecount,vcount;
float avgcount[3];
-
+
allcollections.first = 0;
allcollections.last = 0;
-
+
mergecount = 0;
-
+
build_edgecollection(em, &allcollections);
groupcount = BLI_countlist(&allcollections);
-
-
+
+
for(edgecollection = allcollections.first; edgecollection; edgecollection = edgecollection->next){
totedges = BLI_countlist(&(edgecollection->collectionbase));
mergecount += totedges;
avgcount[0] = 0; avgcount[1] = 0; avgcount[2] = 0;
-
+
vcount = 0;
-
+
for(curredge = edgecollection->collectionbase.first; curredge; curredge = curredge->next){
avgcount[0] += ((EditEdge*)curredge->eed)->v1->co[0];
avgcount[1] += ((EditEdge*)curredge->eed)->v1->co[1];
avgcount[2] += ((EditEdge*)curredge->eed)->v1->co[2];
-
+
avgcount[0] += ((EditEdge*)curredge->eed)->v2->co[0];
avgcount[1] += ((EditEdge*)curredge->eed)->v2->co[1];
avgcount[2] += ((EditEdge*)curredge->eed)->v2->co[2];
-
+
vcount +=2;
}
-
+
avgcount[0] /= vcount; avgcount[1] /=vcount; avgcount[2] /= vcount;
-
+
for(curredge = edgecollection->collectionbase.first; curredge; curredge = curredge->next){
VECCOPY(((EditEdge*)curredge->eed)->v1->co,avgcount);
VECCOPY(((EditEdge*)curredge->eed)->v2->co,avgcount);
}
-
+
if (EM_texFaceCheck(em)) {
/*uv collapse*/
for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = 0;
@@ -5682,59 +5696,102 @@ int collapseEdges(EditMesh *em)
}
collapse_edgeuvs(em);
}
-
+
}
freecollections(&allcollections);
removedoublesflag(em, 1, 0, MERGELIMIT);
- /*get rid of this!*/
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
-// if (EM_texFaceCheck())
return mergecount;
}
-int merge_firstlast(EditMesh *em, int first, int uvmerge)
+static int merge_firstlast(EditMesh *em, int first, int uvmerge)
{
EditVert *eve,*mergevert;
EditSelection *ese;
-
+
/* do sanity check in mergemenu in edit.c ?*/
- if(first == 0){
+ if(first == 0){
ese = em->selected.last;
mergevert= (EditVert*)ese->data;
}
- else{
+ else{
ese = em->selected.first;
mergevert = (EditVert*)ese->data;
}
-
+
if(mergevert->f&SELECT){
for (eve=em->verts.first; eve; eve=eve->next){
if (eve->f&SELECT)
VECCOPY(eve->co,mergevert->co);
}
}
-
+
if(uvmerge && CustomData_has_layer(&em->fdata, CD_MTFACE)){
-
+
for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=em->verts.first; eve; eve=eve->next){
if(eve->f&SELECT) eve->f1 = 1;
}
collapseuvs(em, mergevert);
}
-
+
return removedoublesflag(em, 1, 0, MERGELIMIT);
}
-int merge_target(EditMesh *em, int target, int uvmerge)
+static void em_snap_to_center(EditMesh *em)
{
EditVert *eve;
-
- if(target) snap_sel_to_curs();
- else snap_to_center();
-
+ float cent[3] = {0.0f, 0.0f, 0.0f};
+ int i=0;
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VecAddf(cent, cent, eve->co);
+ i++;
+ }
+ }
+
+ if (!i)
+ return;
+
+ VecMulf(cent, 1.0f / (float)i);
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VECCOPY(eve->co, cent);
+ }
+ }
+}
+
+static void em_snap_to_cursor(EditMesh *em, bContext *C)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob= CTX_data_edit_object(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ EditVert *eve;
+ float co[3], *vco, invmat[4][4];
+
+ Mat4Invert(invmat, ob->obmat);
+
+ vco = give_cursor(scene, v3d);
+ VECCOPY(co, vco);
+ Mat4MulVecfl(invmat, co);
+
+ for (eve=em->verts.first; eve; eve=eve->next) {
+ if (eve->f & SELECT) {
+ VECCOPY(eve->co, co);
+ }
+ }
+}
+
+static int merge_target(bContext *C, EditMesh *em, int target, int uvmerge)
+{
+ EditVert *eve;
+
+ // XXX not working
+ if(target) em_snap_to_cursor(em, C);
+ else em_snap_to_center(em);
+
if(uvmerge && CustomData_has_layer(&em->fdata, CD_MTFACE)){
for(eve=em->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=em->verts.first; eve; eve=eve->next){
@@ -5742,28 +5799,138 @@ int merge_target(EditMesh *em, int target, int uvmerge)
}
collapseuvs(em, NULL);
}
-
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
return removedoublesflag(em, 1, 0, MERGELIMIT);
-
}
#undef MERGELIMIT
-typedef struct PathNode{
+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");
+
+ switch(RNA_enum_get(op->ptr, "type")) {
+ case 3:
+ count = merge_target(C, em, 0, uvs);
+ break;
+ case 4:
+ count = merge_target(C, em, 1, uvs);
+ break;
+ case 1:
+ count = merge_firstlast(em, 0, uvs);
+ break;
+ case 6:
+ count = merge_firstlast(em, 1, uvs);
+ break;
+ case 5:
+ count = collapseEdges(em);
+ break;
+ }
+
+ if(!count)
+ return OPERATOR_CANCELLED;
+
+ BKE_reportf(op->reports, RPT_INFO, "Removed %d vertices.", count);
+
+ BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+static EnumPropertyItem merge_type_items[]= {
+ {6, "FIRST", 0, "At First", ""},
+ {1, "LAST", 0, "At Last", ""},
+ {3, "CENTER", 0, "At Center", ""},
+ {4, "CURSOR", 0, "At Cursor", ""},
+ {5, "COLLAPSE", 0, "Collapse", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Object *obedit;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(!C) /* needed for docs */
+ return merge_type_items;
+
+ obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type == OB_MESH) {
+ EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+
+ if(em->selectmode & SCE_SELECT_VERTEX) {
+ if(em->selected.first && em->selected.last &&
+ ((EditSelection*)em->selected.first)->type == EDITVERT && ((EditSelection*)em->selected.last)->type == EDITVERT) {
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 6);
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 1);
+ }
+ else if(em->selected.first && ((EditSelection*)em->selected.first)->type == EDITVERT)
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 1);
+ else if(em->selected.last && ((EditSelection*)em->selected.last)->type == EDITVERT)
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 6);
+ }
+
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 3);
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 4);
+ RNA_enum_items_add_value(&item, &totitem, merge_type_items, 5);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
+ return NULL;
+}
+
+void MESH_OT_merge(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Merge";
+ ot->description= "Merge selected vertices.";
+ ot->idname= "MESH_OT_merge";
+
+ /* api callbacks */
+ ot->exec= merge_exec;
+ ot->invoke= WM_menu_invoke;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ prop= RNA_def_enum(ot->srna, "type", merge_type_items, 3, "Type", "Merge method to use.");
+ RNA_def_enum_funcs(prop, merge_type_itemf);
+ RNA_def_boolean(ot->srna, "uvs", 0, "UVs", "Move UVs according to merge.");
+}
+
+/************************ Vertex Path Operator *************************/
+
+typedef struct PathNode {
int u;
int visited;
ListBase edges;
} PathNode;
-typedef struct PathEdge{
+typedef struct PathEdge {
struct PathEdge *next, *prev;
int v;
float w;
} PathEdge;
-void pathselect(EditMesh *em, wmOperator *op)
+#define PATH_SELECT_EDGE_LENGTH 0
+#define PATH_SELECT_TOPOLOGICAL 1
+
+static int select_vertex_path_exec(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditVert *eve, *s, *t;
EditEdge *eed;
EditSelection *ese;
@@ -5775,30 +5942,30 @@ void pathselect(EditMesh *em, wmOperator *op)
short physical;
float *cost;
Heap *heap; /*binary heap for sorting pointers to PathNodes based upon a 'cost'*/
-
+
s = t = NULL;
-
+
ese = ((EditSelection*)em->selected.last);
if(ese && ese->type == EDITVERT && ese->prev && ese->prev->type == EDITVERT){
physical= pupmenu("Distance Method? %t|Edge Length%x1|Topological%x0");
-
+
t = (EditVert*)ese->data;
s = (EditVert*)ese->prev->data;
-
+
/*need to find out if t is actually reachable by s....*/
- for(eve=em->verts.first; eve; eve=eve->next){
+ for(eve=em->verts.first; eve; eve=eve->next){
eve->f1 = 0;
}
-
+
s->f1 = 1;
-
+
unbalanced = 1;
totnodes = 1;
while(unbalanced){
unbalanced = 0;
for(eed=em->edges.first; eed; eed=eed->next){
if(!eed->h){
- if(eed->v1->f1 && !eed->v2->f1){
+ if(eed->v1->f1 && !eed->v2->f1){
eed->v2->f1 = 1;
totnodes++;
unbalanced = 1;
@@ -5811,10 +5978,8 @@ void pathselect(EditMesh *em, wmOperator *op)
}
}
}
-
-
-
- if(s->f1 && t->f1){ /*t can be reached by s*/
+
+ if(s->f1 && t->f1){ /* t can be reached by s */
Q = MEM_callocN(sizeof(PathNode)*totnodes, "Path Select Nodes");
totnodes = 0;
for(eve=em->verts.first; eve; eve=eve->next){
@@ -5828,12 +5993,12 @@ void pathselect(EditMesh *em, wmOperator *op)
}
else eve->tmp.p = NULL;
}
-
+
for(eed=em->edges.first; eed; eed=eed->next){
if(!eed->h){
if(eed->v1->f1){
currpn = ((PathNode*)eed->v1->tmp.p);
-
+
newpe = MEM_mallocN(sizeof(PathEdge), "Path Edge");
newpe->v = ((PathNode*)eed->v2->tmp.p)->u;
if(physical){
@@ -5843,9 +6008,9 @@ void pathselect(EditMesh *em, wmOperator *op)
newpe->next = 0;
newpe->prev = 0;
BLI_addtail(&(currpn->edges), newpe);
- }
+ }
if(eed->v2->f1){
- currpn = ((PathNode*)eed->v2->tmp.p);
+ currpn = ((PathNode*)eed->v2->tmp.p);
newpe = MEM_mallocN(sizeof(PathEdge), "Path Edge");
newpe->v = ((PathNode*)eed->v1->tmp.p)->u;
if(physical){
@@ -5858,28 +6023,28 @@ void pathselect(EditMesh *em, wmOperator *op)
}
}
}
-
+
heap = BLI_heap_new();
cost = MEM_callocN(sizeof(float)*totnodes, "Path Select Costs");
previous = MEM_callocN(sizeof(int)*totnodes, "PathNode indices");
-
+
for(v=0; v < totnodes; v++){
cost[v] = 1000000;
previous[v] = -1; /*array of indices*/
}
-
+
pnindex = ((PathNode*)s->tmp.p)->u;
cost[pnindex] = 0;
BLI_heap_insert(heap, 0.0f, SET_INT_IN_POINTER(pnindex));
-
+
while( !BLI_heap_empty(heap) ){
-
+
pnindex = GET_INT_FROM_POINTER(BLI_heap_popmin(heap));
currpn = &(Q[pnindex]);
-
+
if(currpn == (PathNode*)t->tmp.p) /*target has been reached....*/
break;
-
+
for(currpe=currpn->edges.first; currpe; currpe=currpe->next){
if(!Q[currpe->v].visited){
if( cost[currpe->v] > (cost[currpn->u ] + currpe->w) ){
@@ -5891,7 +6056,7 @@ void pathselect(EditMesh *em, wmOperator *op)
}
}
}
-
+
pathvert = ((PathNode*)t->tmp.p)->u;
while(pathvert != -1){
for(eve=em->verts.first; eve; eve=eve->next){
@@ -5901,61 +6066,91 @@ void pathselect(EditMesh *em, wmOperator *op)
}
pathvert = previous[pathvert];
}
-
+
for(v=0; v < totnodes; v++) BLI_freelistN(&(Q[v].edges));
MEM_freeN(Q);
MEM_freeN(cost);
MEM_freeN(previous);
BLI_heap_free(heap, NULL);
EM_select_flush(em);
- // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
-// if (EM_texFaceCheck())
}
}
- else{
+ else {
+ BKE_mesh_end_editmesh(obedit->data, em);
BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected");
- return;
+ return OPERATOR_CANCELLED;
}
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+ BKE_mesh_end_editmesh(obedit->data, em);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_vertex_path(wmOperatorType *ot)
+{
+ static const EnumPropertyItem type_items[] = {
+ {PATH_SELECT_EDGE_LENGTH, "EDGE_LENGTH", 0, "Edge Length", NULL},
+ {PATH_SELECT_TOPOLOGICAL, "TOPOLOGICAL", 0, "Topological", NULL},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Select Vertex Path";
+ ot->description= "Select shortest path between two vertices by distance type.";
+ ot->idname= "MESH_OT_select_vertex_path";
+
+ /* api callbacks */
+ ot->exec= select_vertex_path_exec;
+ ot->invoke= WM_menu_invoke;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", type_items, PATH_SELECT_EDGE_LENGTH, "Type", "Method to compute distance.");
}
+/********************** Region/Loop Operators *************************/
+
static int region_to_loop(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditEdge *eed;
EditFace *efa;
-
- if(em->totfacesel){
- for(eed=em->edges.first; eed; eed=eed->next) eed->f1 = 0;
-
- for(efa=em->faces.first; efa; efa=efa->next){
- if(efa->f&SELECT){
- efa->e1->f1++;
- efa->e2->f1++;
- efa->e3->f1++;
- if(efa->e4)
- efa->e4->f1++;
- }
- }
-
- EM_clear_flag_all(em, SELECT);
-
- for(eed=em->edges.first; eed; eed=eed->next){
- if(eed->f1 == 1) EM_select_edge(eed, 1);
+ int selected= 0;
+
+ for(eed=em->edges.first; eed; eed=eed->next) eed->f1 = 0;
+
+ for(efa=em->faces.first; efa; efa=efa->next){
+ if(efa->f&SELECT){
+ efa->e1->f1++;
+ efa->e2->f1++;
+ efa->e3->f1++;
+ if(efa->e4)
+ efa->e4->f1++;
+
+ selected= 1;
}
-
- em->selectmode = SCE_SELECT_EDGE;
- EM_selectmode_set(em);
- // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ }
-// if (EM_texFaceCheck())
+ if(!selected)
+ return OPERATOR_CANCELLED;
+
+ EM_clear_flag_all(em, SELECT);
+ for(eed=em->edges.first; eed; eed=eed->next){
+ if(eed->f1 == 1) EM_select_edge(eed, 1);
}
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ em->selectmode = SCE_SELECT_EDGE;
+ EM_selectmode_set(em);
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -5963,12 +6158,13 @@ void MESH_OT_region_to_loop(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Region to Loop";
+ ot->description= "Select a region as a loop of connected edges.";
ot->idname= "MESH_OT_region_to_loop";
-
+
/* api callbacks */
ot->exec= region_to_loop;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -5978,7 +6174,7 @@ static int validate_loop(EditMesh *em, Collection *edgecollection)
EditEdge *eed;
EditFace *efa;
CollectedEdge *curredge;
-
+
/*1st test*/
for(curredge = (CollectedEdge*)edgecollection->collectionbase.first; curredge; curredge=curredge->next){
curredge->eed->v1->f1 = 0;
@@ -5992,7 +6188,7 @@ static int validate_loop(EditMesh *em, Collection *edgecollection)
if(curredge->eed->v1->f1 > 2) return(0); else
if(curredge->eed->v2->f1 > 2) return(0);
}
-
+
/*2nd test*/
for(eed = em->edges.first; eed; eed=eed->next) eed->f1 = 0;
for(efa=em->faces.first; efa; efa=efa->next){
@@ -6008,20 +6204,20 @@ static int validate_loop(EditMesh *em, Collection *edgecollection)
}
static int loop_bisect(EditMesh *em, Collection *edgecollection){
-
+
EditFace *efa, *sf1, *sf2;
EditEdge *eed, *sed;
CollectedEdge *curredge;
int totsf1, totsf2, unbalanced,balancededges;
-
+
for(eed=em->edges.first; eed; eed=eed->next) eed->f1 = eed->f2 = 0;
- for(efa=em->faces.first; efa; efa=efa->next) efa->f1 = 0;
-
+ for(efa=em->faces.first; efa; efa=efa->next) efa->f1 = 0;
+
for(curredge = (CollectedEdge*)edgecollection->collectionbase.first; curredge; curredge=curredge->next) curredge->eed->f1 = 1;
-
+
sf1 = sf2 = NULL;
sed = ((CollectedEdge*)edgecollection->collectionbase.first)->eed;
-
+
for(efa=em->faces.first; efa; efa=efa->next){
if(sf2) break;
else if(sf1){
@@ -6031,24 +6227,24 @@ static int loop_bisect(EditMesh *em, Collection *edgecollection){
if(efa->e1 == sed || efa->e2 == sed || efa->e3 == sed || ( (efa->e4) ? efa->e4 == sed : 0) ) sf1 = efa;
}
}
-
+
if(sf1==NULL || sf2==NULL)
return(-1);
-
+
if(!(sf1->e1->f1)) sf1->e1->f2 = 1;
if(!(sf1->e2->f1)) sf1->e2->f2 = 1;
if(!(sf1->e3->f1)) sf1->e3->f2 = 1;
if(sf1->e4 && !(sf1->e4->f1)) sf1->e4->f2 = 1;
sf1->f1 = 1;
totsf1 = 1;
-
+
if(!(sf2->e1->f1)) sf2->e1->f2 = 2;
if(!(sf2->e2->f1)) sf2->e2->f2 = 2;
if(!(sf2->e3->f1)) sf2->e3->f2 = 2;
if(sf2->e4 && !(sf2->e4->f1)) sf2->e4->f2 = 2;
sf2->f1 = 2;
totsf2 = 1;
-
+
/*do sf1*/
unbalanced = 1;
while(unbalanced){
@@ -6070,7 +6266,7 @@ static int loop_bisect(EditMesh *em, Collection *edgecollection){
}
}
}
-
+
/*do sf2*/
unbalanced = 1;
while(unbalanced){
@@ -6092,7 +6288,7 @@ static int loop_bisect(EditMesh *em, Collection *edgecollection){
}
}
}
-
+
if(totsf1 < totsf2) return(1);
else return(2);
}
@@ -6107,9 +6303,9 @@ static int loop_to_region(bContext *C, wmOperator *op)
ListBase allcollections={NULL,NULL};
Collection *edgecollection;
int testflag;
-
+
build_edgecollection(em, &allcollections);
-
+
for(edgecollection = (Collection *)allcollections.first; edgecollection; edgecollection=edgecollection->next){
if(validate_loop(em, edgecollection)){
testflag = loop_bisect(em, edgecollection);
@@ -6121,18 +6317,16 @@ static int loop_to_region(bContext *C, wmOperator *op)
}
}
}
-
+
for(efa=em->faces.first; efa; efa=efa->next){ /*fix this*/
if(efa->f&SELECT) EM_select_face(efa,1);
}
-
+
freecollections(&allcollections);
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ BKE_mesh_end_editmesh(obedit->data, em);
-// if (EM_texFaceCheck())
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -6140,16 +6334,18 @@ void MESH_OT_loop_to_region(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Loop to Region";
+ ot->description= "Select a loop of connected edges as a region.";
ot->idname= "MESH_OT_loop_to_region";
-
+
/* api callbacks */
ot->exec= loop_to_region;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/********************** UV/Color Operators *************************/
// XXX please check if these functions do what you want them to
/* texface and vertex color editmode tools for the face menu */
@@ -6160,53 +6356,51 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa;
- short change = 0, ccw;
+ short change = 0;
MTFace *tf;
float u1, v1;
- int shift = 0; // XXX
+ 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_ERROR, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
- ccw = (shift);
-
+
for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
u1= tf->uv[0][0];
v1= tf->uv[0][1];
-
- if (ccw) {
+
+ if (dir == DIRECTION_CCW) {
if(efa->v4) {
tf->uv[0][0]= tf->uv[3][0];
tf->uv[0][1]= tf->uv[3][1];
-
+
tf->uv[3][0]= tf->uv[2][0];
tf->uv[3][1]= tf->uv[2][1];
} else {
tf->uv[0][0]= tf->uv[2][0];
tf->uv[0][1]= tf->uv[2][1];
}
-
+
tf->uv[2][0]= tf->uv[1][0];
tf->uv[2][1]= tf->uv[1][1];
-
+
tf->uv[1][0]= u1;
tf->uv[1][1]= v1;
- } else {
+ } else {
tf->uv[0][0]= tf->uv[1][0];
tf->uv[0][1]= tf->uv[1][1];
-
+
tf->uv[1][0]= tf->uv[2][0];
tf->uv[1][1]= tf->uv[2][1];
-
+
if(efa->v4) {
tf->uv[2][0]= tf->uv[3][0];
tf->uv[2][1]= tf->uv[3][1];
-
+
tf->uv[3][0]= u1;
tf->uv[3][1]= v1;
}
@@ -6218,13 +6412,15 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
change = 1;
}
}
-
- if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- }
-
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -6234,30 +6430,28 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa;
- short change = 0, altaxis;
+ short change = 0;
MTFace *tf;
float u1, v1;
- int shift= 0; // XXX
-
+ 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_ERROR, "Mesh has no uv/image layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
- altaxis = (shift);
-
+
for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (altaxis) {
+ if (axis == AXIS_Y) {
u1= tf->uv[1][0];
v1= tf->uv[1][1];
if(efa->v4) {
-
+
tf->uv[1][0]= tf->uv[2][0];
tf->uv[1][1]= tf->uv[2][1];
-
+
tf->uv[2][0]= u1;
tf->uv[2][1]= v1;
@@ -6266,7 +6460,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
tf->uv[3][0]= tf->uv[0][0];
tf->uv[3][1]= tf->uv[0][1];
-
+
tf->uv[0][0]= u1;
tf->uv[0][1]= v1;
}
@@ -6276,15 +6470,15 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
tf->uv[2][0]= u1;
tf->uv[2][1]= v1;
}
-
+
} else {
u1= tf->uv[0][0];
v1= tf->uv[0][1];
if(efa->v4) {
-
+
tf->uv[0][0]= tf->uv[1][0];
tf->uv[0][1]= tf->uv[1][1];
-
+
tf->uv[1][0]= u1;
tf->uv[1][1]= v1;
@@ -6293,7 +6487,7 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
tf->uv[3][0]= tf->uv[2][0];
tf->uv[3][1]= tf->uv[2][1];
-
+
tf->uv[2][0]= u1;
tf->uv[2][1]= v1;
}
@@ -6307,13 +6501,15 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op)
change = 1;
}
}
-
- if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- }
BKE_mesh_end_editmesh(obedit->data, em);
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -6323,24 +6519,22 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa;
- short change = 0, ccw;
+ short change = 0;
MCol tmpcol, *mcol;
- int shift= 0; // XXX
-
+ 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_ERROR, "Mesh has no color layers.");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
- ccw = (shift);
-
+
for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
tmpcol= mcol[0];
-
- if (ccw) {
+
+ if (dir == DIRECTION_CCW) {
if(efa->v4) {
mcol[0]= mcol[3];
mcol[3]= mcol[2];
@@ -6352,7 +6546,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
} else {
mcol[0]= mcol[1];
mcol[1]= mcol[2];
-
+
if(efa->v4) {
mcol[2]= mcol[3];
mcol[3]= tmpcol;
@@ -6363,13 +6557,15 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
change = 1;
}
}
-
- if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- }
-
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -6380,26 +6576,24 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
EditFace *efa;
- short change = 0, altaxis;
+ short change = 0;
MCol tmpcol, *mcol;
- int shift= 0; // XXX
-
+ int axis= RNA_enum_get(op->ptr, "axis");
+
if (!EM_vertColorCheck(em)) {
BKE_report(op->reports, RPT_ERROR, "Mesh has no color layers");
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_CANCELLED;
}
-
- altaxis = (shift);
-
+
for(efa=em->faces.first; efa; efa=efa->next) {
if (efa->f & SELECT) {
mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
- if (altaxis) {
+ if (axis == AXIS_Y) {
tmpcol= mcol[1];
mcol[1]= mcol[2];
mcol[2]= tmpcol;
-
+
if(efa->v4) {
tmpcol= mcol[0];
mcol[0]= mcol[3];
@@ -6409,7 +6603,7 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
tmpcol= mcol[0];
mcol[0]= mcol[1];
mcol[1]= tmpcol;
-
+
if(efa->v4) {
tmpcol= mcol[2];
mcol[2]= mcol[3];
@@ -6419,13 +6613,15 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op)
change = 1;
}
}
-
- if (change) {
-// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
- }
-
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -6433,247 +6629,120 @@ void MESH_OT_uvs_rotate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Rotate UVs";
+ ot->description= "Rotate selected UVs.";
ot->idname= "MESH_OT_uvs_rotate";
-
+
/* api callbacks */
ot->exec= mesh_rotate_uvs;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "Direction", "Direction to rotate UVs around.");
}
void MESH_OT_uvs_mirror(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mirror UVs";
+ ot->description= "Mirror selected UVs.";
ot->idname= "MESH_OT_uvs_mirror";
-
+
/* api callbacks */
ot->exec= mesh_mirror_uvs;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror UVs around.");
}
void MESH_OT_colors_rotate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Rotate Colors";
+ ot->description= "Rotate UV/image color layer.";
ot->idname= "MESH_OT_colors_rotate";
-
+
/* api callbacks */
ot->exec= mesh_rotate_colors;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_enum(ot->srna, "direction", direction_items, DIRECTION_CW, "Direction", "Direction to rotate edge around.");
}
void MESH_OT_colors_mirror(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mirror Colors";
+ ot->description= "Mirror UV/image color layer.";
ot->idname= "MESH_OT_colors_mirror";
-
+
/* api callbacks */
ot->exec= mesh_mirror_colors;
ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-static int subdivide_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
- EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, 1, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
-}
-
-void MESH_OT_subdivide(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide";
- ot->idname= "MESH_OT_subdivide";
-
- /* api callbacks */
- ot->exec= subdivide_exec;
- ot->poll= ED_operator_editmesh;
-
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-static int subdivide_multi_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
- EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, RNA_int_get(op->ptr,"number_cuts"), 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
-}
-
-void MESH_OT_subdivide_multi(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide Multi";
- ot->idname= "MESH_OT_subdivide_multi";
-
- /* api callbacks */
- ot->exec= subdivide_multi_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
/* props */
- RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX);
-}
-
-static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
- EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- esubdivideflag(obedit, em, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
+ RNA_def_enum(ot->srna, "axis", axis_items, DIRECTION_CW, "Axis", "Axis to mirror colors around.");
}
-void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide Multi Fractal";
- ot->idname= "MESH_OT_subdivide_multi_fractal";
-
- /* api callbacks */
- ot->exec= subdivide_multi_fractal_exec;
- ot->poll= ED_operator_editmesh;
+/********************** Subdivide Operator *************************/
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* properties */
- RNA_def_int(ot->srna, "number_cuts", 4, 1, 100, "Number of Cuts", "", 1, INT_MAX);
- RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f);
-}
-
-static int subdivide_smooth_exec(bContext *C, wmOperator *op)
+static int subdivide_exec(bContext *C, wmOperator *op)
{
+ ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
- Scene *scene = CTX_data_scene(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+ int cuts= RNA_int_get(op->ptr,"number_cuts");
+ float smooth= 0.292f*RNA_float_get(op->ptr, "smoothness");
+ float fractal= RNA_float_get(op->ptr, "fractal")/100;
+ int flag= 0;
- esubdivideflag(obedit, em, 1, 0.292f*RNA_float_get(op->ptr, "smoothness"), scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
- return OPERATOR_FINISHED;
-}
+ if(smooth != 0.0f)
+ flag |= B_SMOOTH;
+ if(fractal != 0.0f)
+ flag |= B_FRACTAL;
-void MESH_OT_subdivide_smooth(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide Smooth";
- ot->idname= "MESH_OT_subdivide_smooth";
-
- /* api callbacks */
- ot->exec= subdivide_smooth_exec;
- ot->poll= ED_operator_editmesh;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* props */
- RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX);
-}
-
-static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
+ esubdivideflag(obedit, em, 1, smooth, fractal, ts->editbutflag|flag, cuts, 0);
- pup= uiPupMenuBegin(C, "Subdivision Type", 0);
- layout= uiPupMenuLayout(pup);
- uiItemsEnumO(layout, "MESH_OT_subdivs", "type");
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
-static int subdivs_exec(bContext *C, wmOperator *op)
-{
- switch(RNA_int_get(op->ptr, "type"))
- {
- case 0: // simple
- subdivide_exec(C,op);
- break;
- case 1: // multi
- subdivide_multi_exec(C,op);
- break;
- case 2: // fractal;
- subdivide_multi_fractal_exec(C,op);
- break;
- case 3: //smooth
- subdivide_smooth_exec(C,op);
- break;
- }
-
return OPERATOR_FINISHED;
}
-void MESH_OT_subdivs(wmOperatorType *ot)
+void MESH_OT_subdivide(wmOperatorType *ot)
{
- static EnumPropertyItem type_items[]= {
- {0, "SIMPLE", 0, "Simple", ""},
- {1, "MULTI", 0, "Multi", ""},
- {2, "FRACTAL", 0, "Fractal", ""},
- {3, "SMOOTH", 0, "Smooth", ""},
- {0, NULL, 0, NULL, NULL}};
-
/* identifiers */
- ot->name= "subdivs";
- ot->idname= "MESH_OT_subdivs";
-
+ ot->name= "Subdivide";
+ ot->description= "Subdivide selected edges.";
+ ot->idname= "MESH_OT_subdivide";
+
/* api callbacks */
- ot->invoke= subdivs_invoke;
- ot->exec= subdivs_exec;
-
+ ot->exec= subdivide_exec;
ot->poll= ED_operator_editmesh;
-
+
/* 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", 4, 1, 10, "Number of Cuts", "", 1, INT_MAX);
- RNA_def_float(ot->srna, "random_factor", 5.0, 0.0f, FLT_MAX, "Random Factor", "", 0.0f, 1000.0f);
- RNA_def_float(ot->srna, "smoothness", 1.0f, 0.0f, 1000.0f, "Smoothness", "", 0.0f, FLT_MAX);
-
+
+ /* properties */
+ RNA_def_int(ot->srna, "number_cuts", 1, 1, 10, "Number of Cuts", "", 1, INT_MAX);
+ RNA_def_float(ot->srna, "fractal", 0.0, 0.0f, FLT_MAX, "Fractal", "Fractal randomness factor.", 0.0f, 1000.0f);
+ RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, 1000.0f, "Smoothness", "Smoothness factor.", 0.0f, FLT_MAX);
}
-/* ************************************* */
+/********************** Fill Operators *************************/
/* note; the EM_selectmode_set() calls here illustrate how badly constructed it all is... from before the
edge/face flags, with very mixed results.... */
@@ -6688,39 +6757,39 @@ static void beauty_fill(EditMesh *em)
EVPtr *efaa;
float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2;
int totedge, ok, notbeauty=8, onedone, vindex[4];
-
+
/* - all selected edges with two faces
* - find the faces: store them in edges (using datablock)
* - per edge: - test convex
* - test edge: flip?
* - if true: remedge, addedge, all edges at the edge get new face pointers
*/
-
- EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
-
+
+ EM_selectmode_set(em); // makes sure in selectmode 'face' the edges of selected faces are selected too
+
totedge = count_selected_edges(em->edges.first);
if(totedge==0) return;
-
+
/* temp block with face pointers */
efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill");
-
+
while (notbeauty) {
notbeauty--;
-
+
ok = collect_quadedges(efaar, em->edges.first, em->faces.first);
-
+
/* there we go */
onedone= 0;
-
+
eed= em->edges.first;
while(eed) {
nexted= eed->next;
-
+
/* f2 is set in collect_quadedges() */
if(eed->f2==2 && eed->h==0) {
-
+
efaa = (EVPtr *) eed->tmp.p;
-
+
/* none of the faces should be treated before, nor be part of fgon */
ok= 1;
efa= efaa[0];
@@ -6729,13 +6798,13 @@ static void beauty_fill(EditMesh *em)
efa= efaa[1];
if(efa->e1->f1 || efa->e2->f1 || efa->e3->f1) ok= 0;
if(efa->fgonf) ok= 0;
-
+
if(ok) {
/* test convex */
givequadverts(efaa[0], efaa[1], &v1, &v2, &v3, &v4, vindex);
if(v1 && v2 && v3 && v4) {
if( convex(v1->co, v2->co, v3->co, v4->co) ) {
-
+
/* test edges */
if( (v1) > (v3) ) {
dia1.v1= v3;
@@ -6745,7 +6814,7 @@ static void beauty_fill(EditMesh *em)
dia1.v1= v1;
dia1.v2= v3;
}
-
+
if( (v2) > (v4) ) {
dia2.v1= v4;
dia2.v2= v2;
@@ -6754,28 +6823,28 @@ static void beauty_fill(EditMesh *em)
dia2.v1= v2;
dia2.v2= v4;
}
-
+
/* testing rule:
* the area divided by the total edge lengths
*/
-
+
len1= VecLenf(v1->co, v2->co);
len2= VecLenf(v2->co, v3->co);
len3= VecLenf(v3->co, v4->co);
len4= VecLenf(v4->co, v1->co);
len5= VecLenf(v1->co, v3->co);
len6= VecLenf(v2->co, v4->co);
-
+
opp1= AreaT3Dfl(v1->co, v2->co, v3->co);
opp2= AreaT3Dfl(v1->co, v3->co, v4->co);
-
+
fac1= opp1/(len1+len2+len5) + opp2/(len3+len4+len5);
-
+
opp1= AreaT3Dfl(v2->co, v3->co, v4->co);
opp2= AreaT3Dfl(v2->co, v4->co, v1->co);
-
+
fac2= opp1/(len2+len3+len6) + opp2/(len4+len1+len6);
-
+
ok= 0;
if(fac1 > fac2) {
if(dia2.v1==eed->v1 && dia2.v2==eed->v2) {
@@ -6784,16 +6853,16 @@ static void beauty_fill(EditMesh *em)
efa->f1= 1;
efa= efaa[1];
efa->f1= 1;
-
+
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], vindex[1], 4+vindex[2], -1);
w->f |= SELECT;
-
-
+
+
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], 4+vindex[2], 4+vindex[3], -1);
w->f |= SELECT;
-
+
onedone= 1;
}
}
@@ -6804,39 +6873,39 @@ static void beauty_fill(EditMesh *em)
efa->f1= 1;
efa= efaa[1];
efa->f1= 1;
-
-
+
+
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[1], 4+vindex[2], 4+vindex[3], -1);
w->f |= SELECT;
-
-
+
+
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], 4+vindex[1], 4+vindex[3], -1);
w->f |= SELECT;
-
+
onedone= 1;
}
}
}
}
}
-
+
}
eed= nexted;
}
-
+
free_tagged_edges_faces(em, em->edges.first, em->faces.first);
-
+
if(onedone==0) break;
-
+
EM_selectmode_set(em); // new edges/faces were added
}
-
+
MEM_freeN(efaar);
-
+
EM_select_flush(em);
-
+
}
/* Got this from scanfill.c. You will need to juggle around the
@@ -6847,10 +6916,10 @@ static void fill_mesh(EditMesh *em)
EditEdge *eed,*e1,*nexted;
EditFace *efa,*nextvl, *efan;
short ok;
-
+
if(em==NULL) return;
waitcursor(1);
-
+
/* copy all selected vertices */
eve= em->verts.first;
while(eve) {
@@ -6867,7 +6936,7 @@ static void fill_mesh(EditMesh *em)
while(eed) {
if( (eed->v1->f & SELECT) && (eed->v2->f & SELECT) ) {
e1= BLI_addfilledge(eed->v1->tmp.v, eed->v2->tmp.v);
- e1->v1->xs++;
+ e1->v1->xs++;
e1->v2->xs++;
}
eed= eed->next;
@@ -6885,7 +6954,7 @@ static void fill_mesh(EditMesh *em)
efa->v3->tmp.v->xs--;
if(efa->v4) efa->v4->tmp.v->xs--;
ok= 1;
-
+
}
efa= nextvl;
}
@@ -6904,7 +6973,7 @@ static void fill_mesh(EditMesh *em)
efa= fillfacebase.first;
while(efa) {
/* normals default pointing up */
- efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v,
+ efan= addfacelist(em, efa->v3->tmp.v, efa->v2->tmp.v,
efa->v1->tmp.v, 0, NULL, NULL);
if(efan) EM_select_face(efan, 1);
efa= efa->next;
@@ -6919,32 +6988,33 @@ static void fill_mesh(EditMesh *em)
}
-
static int fill_mesh_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
+
fill_mesh(em);
- DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
-
+
}
void MESH_OT_fill(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Fill Mesh";
+ ot->name= "Fill";
+ ot->description= "Create a segment, edge or face.";
ot->idname= "MESH_OT_fill";
-
+
/* api callbacks */
ot->exec= fill_mesh_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -6953,12 +7023,14 @@ static int beauty_fill_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
+
beauty_fill(em);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
@@ -6966,25 +7038,29 @@ void MESH_OT_beauty_fill(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Beauty Fill";
+ ot->description= "Arrange geometry on a selected surface to avoid skinny faces.";
ot->idname= "MESH_OT_beauty_fill";
-
+
/* api callbacks */
ot->exec= beauty_fill_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/********************** Quad/Tri Operators *************************/
+
static int quads_convert_to_tris_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
+
convert_to_triface(em,0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -6993,12 +7069,13 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Quads to Tris";
+ ot->description= "Convert selected quads to triangles.";
ot->idname= "MESH_OT_quads_convert_to_tris";
-
+
/* api callbacks */
ot->exec= quads_convert_to_tris_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -7009,9 +7086,10 @@ static int tris_convert_to_quads_exec(bContext *C, wmOperator *op)
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
join_triangles(em);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -7020,12 +7098,13 @@ void MESH_OT_tris_convert_to_quads(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Tris to Quads";
+ ot->description= "Convert selected triangles to quads.";
ot->idname= "MESH_OT_tris_convert_to_quads";
-
+
/* api callbacks */
ot->exec= tris_convert_to_quads_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -7034,11 +7113,12 @@ static int edge_flip_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
+
edge_flip(em);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
@@ -7047,66 +7127,88 @@ void MESH_OT_edge_flip(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Edge Flip";
+ ot->description= "Flip selected edge or adjoining faces.";
ot->idname= "MESH_OT_edge_flip";
-
+
/* api callbacks */
ot->exec= edge_flip_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/********************** Smooth/Solid Operators *************************/
+
+static void mesh_set_smooth_faces(EditMesh *em, short smooth)
+{
+ EditFace *efa;
+
+ if(em==NULL) return;
+
+ for(efa= em->faces.first; efa; efa=efa->next) {
+ if(efa->f & SELECT) {
+ if(smooth) efa->flag |= ME_SMOOTH;
+ else efa->flag &= ~ME_SMOOTH;
+ }
+ }
+}
+
static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- mesh_set_smooth_faces(em,1);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
+
+ mesh_set_smooth_faces(em, 1);
+
BKE_mesh_end_editmesh(obedit->data, em);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
void MESH_OT_faces_shade_smooth(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Smooth Face Shading";
+ ot->name= "Shade Smooth";
+ ot->description= "Display faces 'smooth' (using vertex normals).";
ot->idname= "MESH_OT_faces_shade_smooth";
-
+
/* api callbacks */
ot->exec= mesh_faces_shade_smooth_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int mesh_faces_shade_solid_exec(bContext *C, wmOperator *op)
+static int mesh_faces_shade_flat_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
- mesh_set_smooth_faces(em,0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- BKE_mesh_end_editmesh(obedit->data, em);
+
+ mesh_set_smooth_faces(em, 0);
+
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
return OPERATOR_FINISHED;
}
-void MESH_OT_faces_shade_solid(wmOperatorType *ot)
+void MESH_OT_faces_shade_flat(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Flat Face Shading";
- ot->idname= "MESH_OT_faces_shade_solid";
-
+ ot->name= "Shade Flat";
+ ot->description= "Display faces 'flat'.";
+ ot->idname= "MESH_OT_faces_shade_flat";
+
/* api callbacks */
- ot->exec= mesh_faces_shade_solid_exec;
+ ot->exec= mesh_faces_shade_flat_exec;
ot->poll= ED_operator_editmesh;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c
new file mode 100644
index 00000000000..1adac71f40e
--- /dev/null
+++ b/source/blender/editors/mesh/loopcut.c
@@ -0,0 +1,451 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joseph Eagar, Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+
+#include "DNA_ID.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"
+
+#include "PIL_time.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h" /*for WM_operator_pystring */
+#include "BLI_editVert.h"
+
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_scene.h"
+#include "BKE_utildefines.h"
+#include "BKE_mesh.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h" /* for paint cursor */
+
+#include "IMB_imbuf_types.h"
+
+#include "ED_screen.h"
+#include "ED_util.h"
+#include "ED_space_api.h"
+#include "ED_view3d.h"
+#include "ED_mesh.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "mesh_intern.h"
+
+/* ringsel operator */
+
+/* struct for properties used while drawing */
+typedef struct tringselOpData {
+ ARegion *ar; /* region that ringsel was activated in */
+ void *draw_handle; /* for drawing preview loop */
+
+ float (*edges)[2][3];
+ int totedge;
+
+ ViewContext vc;
+
+ Object *ob;
+ EditMesh *em;
+ EditEdge *eed;
+
+ int extend;
+ int do_cut;
+} tringselOpData;
+
+/* modal loop selection drawing callback */
+static void ringsel_draw(const bContext *C, ARegion *ar, void *arg)
+{
+ int i;
+ tringselOpData *lcd = arg;
+
+ glDisable(GL_DEPTH_TEST);
+
+ glPushMatrix();
+ glMultMatrixf(lcd->ob->obmat);
+
+ glColor3ub(255, 0, 255);
+ glBegin(GL_LINES);
+ for (i=0; i<lcd->totedge; i++) {
+ glVertex3fv(lcd->edges[i][0]);
+ glVertex3fv(lcd->edges[i][1]);
+ }
+ glEnd();
+
+ glPopMatrix();
+ glEnable(GL_DEPTH_TEST);
+}
+
+static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
+{
+ EditMesh *em = lcd->em;
+ EditEdge *startedge = lcd->eed;
+ EditEdge *eed;
+ EditFace *efa;
+ EditVert *v[2][2];
+ float (*edges)[2][3] = NULL;
+ V_DYNDECLARE(edges);
+ float co[2][3];
+ int looking=1, i, tot=0;
+
+ if (!startedge)
+ return;
+
+ if (lcd->edges) {
+ MEM_freeN(lcd->edges);
+ lcd->edges = NULL;
+ lcd->totedge = 0;
+ }
+
+ if (!lcd->extend) {
+ EM_clear_flag_all(lcd->em, SELECT);
+ }
+
+ /* in eed->f1 we put the valence (amount of faces in edge) */
+ /* in eed->f2 we put tagged flag as correct loop */
+ /* in efa->f1 we put tagged flag as correct to select */
+
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ eed->f1= 0;
+ eed->f2= 0;
+ }
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ efa->f1= 0;
+ if(efa->h==0) {
+ efa->e1->f1++;
+ efa->e2->f1++;
+ efa->e3->f1++;
+ if(efa->e4) efa->e4->f1++;
+ }
+ }
+
+ // tag startedge OK
+ startedge->f2= 1;
+
+ while(looking) {
+ looking= 0;
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if(efa->e4 && efa->f1==0 && efa->h == 0) { // not done quad
+ if(efa->e1->f1<=2 && efa->e2->f1<=2 && efa->e3->f1<=2 && efa->e4->f1<=2) { // valence ok
+
+ // if edge tagged, select opposing edge and mark face ok
+ if(efa->e1->f2) {
+ efa->e3->f2= 1;
+ efa->f1= 1;
+ looking= 1;
+ }
+ else if(efa->e2->f2) {
+ efa->e4->f2= 1;
+ efa->f1= 1;
+ looking= 1;
+ }
+ if(efa->e3->f2) {
+ efa->e1->f2= 1;
+ efa->f1= 1;
+ looking= 1;
+ }
+ if(efa->e4->f2) {
+ efa->e2->f2= 1;
+ efa->f1= 1;
+ looking= 1;
+ }
+ }
+ }
+ }
+ }
+
+ if(previewlines > 0 && !select){
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if(efa->v4 == NULL) { continue; }
+ if(efa->h == 0){
+ if(efa->e1->f2 == 1){
+ if(efa->e1->h == 1 || efa->e3->h == 1 )
+ continue;
+
+ v[0][0] = efa->v1;
+ v[0][1] = efa->v2;
+ v[1][0] = efa->v4;
+ v[1][1] = efa->v3;
+ } else if(efa->e2->f2 == 1){
+ if(efa->e2->h == 1 || efa->e4->h == 1)
+ continue;
+ v[0][0] = efa->v2;
+ v[0][1] = efa->v3;
+ v[1][0] = efa->v1;
+ v[1][1] = efa->v4;
+ } else { continue; }
+
+ for(i=1;i<=previewlines;i++){
+ co[0][0] = (v[0][1]->co[0] - v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
+ co[0][1] = (v[0][1]->co[1] - v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
+ co[0][2] = (v[0][1]->co[2] - v[0][0]->co[2])*(i/((float)previewlines+1))+v[0][0]->co[2];
+
+ co[1][0] = (v[1][1]->co[0] - v[1][0]->co[0])*(i/((float)previewlines+1))+v[1][0]->co[0];
+ co[1][1] = (v[1][1]->co[1] - v[1][0]->co[1])*(i/((float)previewlines+1))+v[1][0]->co[1];
+ co[1][2] = (v[1][1]->co[2] - v[1][0]->co[2])*(i/((float)previewlines+1))+v[1][0]->co[2];
+
+ V_GROW(edges);
+ VECCOPY(edges[tot][0], co[0]);
+ VECCOPY(edges[tot][1], co[1]);
+ tot++;
+ }
+ }
+ }
+ } else {
+ select = (startedge->f & SELECT) == 0;
+
+ /* select the edges */
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->f2) EM_select_edge(eed, select);
+ }
+ }
+
+ lcd->edges = edges;
+ lcd->totedge = tot;
+}
+
+static void ringsel_find_edge(tringselOpData *lcd, const bContext *C, ARegion *ar)
+{
+ if (lcd->eed)
+ edgering_sel(lcd, 1, 0);
+}
+
+static void ringsel_finish(bContext *C, wmOperator *op)
+{
+ tringselOpData *lcd= op->customdata;
+
+ if (lcd->eed) {
+ edgering_sel(lcd, 0, 1);
+ if (lcd->do_cut) {
+ EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data);
+ esubdivideflag(lcd->ob, em, SELECT, 0.0f,
+ 0.0f, 0, 1, SUBDIV_SELECT_LOOPCUT);
+ }
+ }
+}
+
+/* called when modal loop selection is done... */
+static void ringsel_exit (bContext *C, wmOperator *op)
+{
+ tringselOpData *lcd= op->customdata;
+
+ /* deactivate the extra drawing stuff in 3D-View */
+ ED_region_draw_cb_exit(lcd->ar->type, lcd->draw_handle);
+
+ if (lcd->edges)
+ MEM_freeN(lcd->edges);
+
+ ED_region_tag_redraw(lcd->ar);
+
+ /* free the custom data */
+ MEM_freeN(lcd);
+ op->customdata= NULL;
+}
+
+/* called when modal loop selection gets set up... */
+static int ringsel_init (bContext *C, wmOperator *op, int do_cut)
+{
+ tringselOpData *lcd;
+
+ /* alloc new customdata */
+ lcd= op->customdata= MEM_callocN(sizeof(tringselOpData), "ringsel Modal Op Data");
+
+ /* assign the drawing handle for drawing preview line... */
+ lcd->ar= CTX_wm_region(C);
+ lcd->draw_handle= ED_region_draw_cb_activate(lcd->ar->type, ringsel_draw, lcd, REGION_DRAW_POST);
+ lcd->ob = CTX_data_edit_object(C);
+ lcd->em= BKE_mesh_get_editmesh((Mesh *)lcd->ob->data);
+ lcd->extend = do_cut ? 0 : RNA_boolean_get(op->ptr, "extend");
+ lcd->do_cut = do_cut;
+ em_setup_viewcontext(C, &lcd->vc);
+
+ ED_region_tag_redraw(lcd->ar);
+
+ return 1;
+}
+
+static int ringsel_cancel (bContext *C, wmOperator *op)
+{
+ /* this is just a wrapper around exit() */
+ ringsel_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tringselOpData *lcd;
+ EditEdge *edge;
+ int dist = 75;
+
+ view3d_operator_needs_opengl(C);
+
+ if (!ringsel_init(C, op, 0))
+ return OPERATOR_CANCELLED;
+
+ /* add a modal handler for this operator - handles loop selection */
+ WM_event_add_modal_handler(C, op);
+
+ lcd = op->customdata;
+ lcd->vc.mval[0] = evt->mval[0];
+ lcd->vc.mval[1] = evt->mval[1];
+
+ edge = findnearestedge(&lcd->vc, &dist);
+ if (edge != lcd->eed) {
+ lcd->eed = edge;
+ ringsel_find_edge(lcd, C, lcd->ar);
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+
+static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ tringselOpData *lcd;
+ EditEdge *edge;
+ int dist = 75;
+
+ view3d_operator_needs_opengl(C);
+
+ if (!ringsel_init(C, op, 1))
+ return OPERATOR_CANCELLED;
+
+ /* add a modal handler for this operator - handles loop selection */
+ WM_event_add_modal_handler(C, op);
+
+ lcd = op->customdata;
+ lcd->vc.mval[0] = evt->mval[0];
+ lcd->vc.mval[1] = evt->mval[1];
+
+ edge = findnearestedge(&lcd->vc, &dist);
+ if (edge != lcd->eed) {
+ lcd->eed = edge;
+ ringsel_find_edge(lcd, C, lcd->ar);
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int ringsel_modal (bContext *C, wmOperator *op, wmEvent *event)
+{
+ tringselOpData *lcd= op->customdata;
+
+ view3d_operator_needs_opengl(C);
+
+ switch (event->type) {
+ case RIGHTMOUSE:
+ case LEFTMOUSE: /* confirm */ // XXX hardcoded
+ if (event->val == KM_RELEASE) {
+ /* finish */
+ ED_region_tag_redraw(lcd->ar);
+
+ ringsel_finish(C, op);
+ ringsel_exit(C, op);
+
+ return OPERATOR_FINISHED;
+ }
+
+ ED_region_tag_redraw(lcd->ar);
+ break;
+ case MOUSEMOVE: { /* mouse moved somewhere to select another loop */
+ int dist = 75;
+ EditEdge *edge;
+
+ lcd->vc.mval[0] = event->mval[0];
+ lcd->vc.mval[1] = event->mval[1];
+ edge = findnearestedge(&lcd->vc, &dist);
+
+ if (edge != lcd->eed) {
+ lcd->eed = edge;
+ ringsel_find_edge(lcd, C, lcd->ar);
+ }
+
+ ED_region_tag_redraw(lcd->ar);
+ break;
+ }
+ }
+
+ /* keep going until the user confirms */
+ return OPERATOR_RUNNING_MODAL;
+}
+
+void MESH_OT_edgering_select (wmOperatorType *ot)
+{
+ /* description */
+ ot->name= "Edge Ring Select";
+ ot->idname= "MESH_OT_edgering_select";
+ ot->description= "Select an edge ring";
+
+ /* callbacks */
+ ot->invoke= ringsel_invoke;
+ ot->modal= ringsel_modal;
+ ot->cancel= ringsel_cancel;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the selection");
+}
+
+void MESH_OT_loopcut (wmOperatorType *ot)
+{
+ /* description */
+ ot->name= "Loop Cut";
+ ot->idname= "MESH_OT_loopcut";
+ ot->description= "Add a new loop between existing loops.";
+
+ /* callbacks */
+ ot->invoke= ringcut_invoke;
+ ot->modal= ringsel_modal;
+ ot->cancel= ringsel_cancel;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+}
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 83a4211dda1..37a6d0f384f 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -61,12 +61,6 @@ extern struct EditEdge *addedgelist(EditMesh *em, struct EditVert *v1, struct Ed
extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges);
extern struct EditEdge *findedgelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2);
-EditVert *editedge_getOtherVert(EditEdge *eed, EditVert *eve);
-EditVert *editedge_getSharedVert(EditEdge *eed, EditEdge *eed2);
-int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
-int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
-int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
-
void em_setup_viewcontext(struct bContext *C, ViewContext *vc);
void MESH_OT_separate(struct wmOperatorType *ot);
@@ -82,8 +76,10 @@ void MESH_OT_primitive_grid_add(struct wmOperatorType *ot);
void MESH_OT_primitive_monkey_add(struct wmOperatorType *ot);
void MESH_OT_primitive_uv_sphere_add(struct wmOperatorType *ot);
void MESH_OT_primitive_ico_sphere_add(struct wmOperatorType *ot);
-void MESH_OT_dupli_extrude_cursor(struct wmOperatorType *ot);
+
void MESH_OT_edge_face_add(struct wmOperatorType *ot);
+void MESH_OT_dupli_extrude_cursor(struct wmOperatorType *ot);
+void MESH_OT_duplicate(struct wmOperatorType *ot);
void MESH_OT_fgon_make(struct wmOperatorType *ot);
void MESH_OT_fgon_clear(struct wmOperatorType *ot);
@@ -149,19 +145,18 @@ void MESH_OT_loop_select(struct wmOperatorType *ot);
void MESH_OT_select_all_toggle(struct wmOperatorType *ot);
void MESH_OT_select_more(struct wmOperatorType *ot);
void MESH_OT_select_less(struct wmOperatorType *ot);
-void MESH_OT_select_invert(struct wmOperatorType *ot);
+void MESH_OT_select_inverse(struct wmOperatorType *ot);
void MESH_OT_select_non_manifold(struct wmOperatorType *ot);
void MESH_OT_select_linked(struct wmOperatorType *ot);
void MESH_OT_select_linked_pick(struct wmOperatorType *ot);
void MESH_OT_hide(struct wmOperatorType *ot);
void MESH_OT_reveal(struct wmOperatorType *ot);
+void MESH_OT_select_by_number_vertices(struct wmOperatorType *ot);
void MESH_OT_normals_make_consistent(struct wmOperatorType *ot);
void MESH_OT_faces_select_linked_flat(struct wmOperatorType *ot);
void MESH_OT_edges_select_sharp(struct wmOperatorType *ot);
void MESH_OT_select_shortest_path(struct wmOperatorType *ot);
-void MESH_OT_vertices_select_similar(struct wmOperatorType *ot);
-void MESH_OT_edges_select_similar(struct wmOperatorType *ot);
-void MESH_OT_faces_select_similar(struct wmOperatorType *ot);
+void MESH_OT_select_similar(struct wmOperatorType *ot);
void MESH_OT_select_random(struct wmOperatorType *ot);
void MESH_OT_vertices_transform_to_sphere(struct wmOperatorType *ot);
void MESH_OT_selection_type(struct wmOperatorType *ot);
@@ -169,7 +164,7 @@ 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_flip_editnormals(struct wmOperatorType *ot);
+void MESH_OT_flip_normals(struct wmOperatorType *ot);
extern EditEdge *findnearestedge(ViewContext *vc, int *dist);
extern void EM_automerge(int update);
@@ -200,14 +195,11 @@ extern EditVert *findnearestvert(ViewContext *vc, int *dist, short sel, short st
void join_triangles(EditMesh *em);
int removedoublesflag(EditMesh *em, short flag, short automerge, float limit); /* return amount */
-void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beauty, int numcuts, int seltype);
+void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float fractal, int beauty, int numcuts, int seltype);
int EdgeSlide(EditMesh *em, wmOperator *op, short immediate, float imperc);
+void MESH_OT_merge(struct wmOperatorType *ot);
void MESH_OT_subdivide(struct wmOperatorType *ot);
-void MESH_OT_subdivs(struct wmOperatorType *ot);
-void MESH_OT_subdivide_multi(struct wmOperatorType *ot);
-void MESH_OT_subdivide_multi_fractal(struct wmOperatorType *ot);
-void MESH_OT_subdivide_smooth(struct wmOperatorType *ot);
void MESH_OT_remove_doubles(struct wmOperatorType *ot);
void MESH_OT_extrude(struct wmOperatorType *ot);
void MESH_OT_spin(struct wmOperatorType *ot);
@@ -219,10 +211,11 @@ void MESH_OT_quads_convert_to_tris(struct wmOperatorType *ot);
void MESH_OT_tris_convert_to_quads(struct wmOperatorType *ot);
void MESH_OT_edge_flip(struct wmOperatorType *ot);
void MESH_OT_faces_shade_smooth(struct wmOperatorType *ot);
-void MESH_OT_faces_shade_solid(struct wmOperatorType *ot);
+void MESH_OT_faces_shade_flat(struct wmOperatorType *ot);
void MESH_OT_split(struct wmOperatorType *ot);
void MESH_OT_extrude_repeat(struct wmOperatorType *ot);
void MESH_OT_edge_rotate(struct wmOperatorType *ot);
+void MESH_OT_select_vertex_path(struct wmOperatorType *ot);
void MESH_OT_loop_to_region(struct wmOperatorType *ot);
void MESH_OT_region_to_loop(struct wmOperatorType *ot);
@@ -234,5 +227,17 @@ void MESH_OT_colors_mirror(struct wmOperatorType *ot);
void MESH_OT_delete(struct wmOperatorType *ot);
void MESH_OT_rip(struct wmOperatorType *ot);
+/* ******************* mesh_layers.c */
+
+void MESH_OT_uv_texture_add(struct wmOperatorType *ot);
+void MESH_OT_uv_texture_remove(struct wmOperatorType *ot);
+void MESH_OT_vertex_color_add(struct wmOperatorType *ot);
+void MESH_OT_vertex_color_remove(struct wmOperatorType *ot);
+void MESH_OT_sticky_add(struct wmOperatorType *ot);
+void MESH_OT_sticky_remove(struct wmOperatorType *ot);
+
+void MESH_OT_edgering_select(struct wmOperatorType *ot);
+void MESH_OT_loopcut(struct wmOperatorType *ot);
+
#endif // MESH_INTERN_H
diff --git a/source/blender/editors/mesh/mesh_layers.c b/source/blender/editors/mesh/mesh_layers.c
new file mode 100644
index 00000000000..a36c7a56b7c
--- /dev/null
+++ b/source/blender/editors/mesh/mesh_layers.c
@@ -0,0 +1,411 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_customdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_mesh.h"
+
+#include "BLI_editVert.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "ED_view3d.h"
+
+#include "mesh_intern.h"
+
+static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *layer)
+{
+ Mesh *me = ob->data;
+ CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
+ void *actlayerdata, *rndlayerdata, *clonelayerdata, *masklayerdata, *layerdata=layer->data;
+ int type= layer->type;
+ int index= CustomData_get_layer_index(data, type);
+ int i, actindex, rndindex, cloneindex, maskindex;
+
+ /* ok, deleting a non-active layer needs to preserve the active layer indices.
+ to do this, we store a pointer to the .data member of both layer and the active layer,
+ (to detect if we're deleting the active layer or not), then use the active
+ layer data pointer to find where the active layer has ended up.
+
+ this is necassary because the deletion functions only support deleting the active
+ layer. */
+ actlayerdata = data->layers[CustomData_get_active_layer_index(data, type)].data;
+ rndlayerdata = data->layers[CustomData_get_render_layer_index(data, type)].data;
+ clonelayerdata = data->layers[CustomData_get_clone_layer_index(data, type)].data;
+ masklayerdata = data->layers[CustomData_get_mask_layer_index(data, type)].data;
+ CustomData_set_layer_active(data, type, layer - &data->layers[index]);
+
+ if(me->edit_mesh) {
+ EM_free_data_layer(me->edit_mesh, data, type);
+ }
+ else {
+ CustomData_free_layer_active(data, type, me->totface);
+ mesh_update_customdata_pointers(me);
+ }
+
+ if(!CustomData_has_layer(data, type) && (type == CD_MCOL && (ob->mode & OB_MODE_VERTEX_PAINT)))
+ ED_object_toggle_modes(C, OB_MODE_VERTEX_PAINT);
+
+ /* reconstruct active layer */
+ if (actlayerdata != layerdata) {
+ /* find index */
+ actindex = CustomData_get_layer_index(data, type);
+ for (i=actindex; i<data->totlayer; i++) {
+ if (data->layers[i].data == actlayerdata) {
+ actindex = i - actindex;
+ break;
+ }
+ }
+
+ /* set index */
+ CustomData_set_layer_active(data, type, actindex);
+ }
+
+ if (rndlayerdata != layerdata) {
+ /* find index */
+ rndindex = CustomData_get_layer_index(data, type);
+ for (i=rndindex; i<data->totlayer; i++) {
+ if (data->layers[i].data == rndlayerdata) {
+ rndindex = i - rndindex;
+ break;
+ }
+ }
+
+ /* set index */
+ CustomData_set_layer_render(data, type, rndindex);
+ }
+
+ if (clonelayerdata != layerdata) {
+ /* find index */
+ cloneindex = CustomData_get_layer_index(data, type);
+ for (i=cloneindex; i<data->totlayer; i++) {
+ if (data->layers[i].data == clonelayerdata) {
+ cloneindex = i - cloneindex;
+ break;
+ }
+ }
+
+ /* set index */
+ CustomData_set_layer_clone(data, type, cloneindex);
+ }
+
+ if (masklayerdata != layerdata) {
+ /* find index */
+ maskindex = CustomData_get_layer_index(data, type);
+ for (i=maskindex; i<data->totlayer; i++) {
+ if (data->layers[i].data == masklayerdata) {
+ maskindex = i - maskindex;
+ break;
+ }
+ }
+
+ /* set index */
+ CustomData_set_layer_mask(data, type, maskindex);
+ }
+}
+
+/*********************** UV texture operators ************************/
+
+static int layers_poll(bContext *C)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ID *data= (ob)? ob->data: NULL;
+ return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib);
+}
+
+static int uv_texture_add_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+ EditMesh *em;
+ int layernum;
+
+ if(me->edit_mesh) {
+ em= me->edit_mesh;
+
+ layernum= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
+ if(layernum >= MAX_MTFACE)
+ return OPERATOR_CANCELLED;
+
+ EM_add_data_layer(em, &em->fdata, CD_MTFACE);
+ CustomData_set_layer_active(&em->fdata, CD_MTFACE, layernum);
+ }
+ else {
+ layernum= CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+ if(layernum >= MAX_MTFACE)
+ return OPERATOR_CANCELLED;
+
+ if(me->mtface)
+ CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DUPLICATE, me->mtface, me->totface);
+ else
+ CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
+
+ CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
+ mesh_update_customdata_pointers(me);
+ }
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_uv_texture_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add UV Texture";
+ ot->description= "Add UV texture layer.";
+ ot->idname= "MESH_OT_uv_texture_add";
+
+ /* api callbacks */
+ ot->poll= layers_poll;
+ ot->exec= uv_texture_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int uv_texture_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+ CustomDataLayer *cdl;
+ int index;
+
+ index= CustomData_get_active_layer_index(&me->fdata, CD_MTFACE);
+ cdl= (index == -1)? NULL: &me->fdata.layers[index];
+
+ if(!cdl)
+ return OPERATOR_CANCELLED;
+
+ delete_customdata_layer(C, ob, cdl);
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_uv_texture_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove UV Texture";
+ ot->description= "Remove UV texture layer.";
+ ot->idname= "MESH_OT_uv_texture_remove";
+
+ /* api callbacks */
+ ot->poll= layers_poll;
+ ot->exec= uv_texture_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/*********************** vertex color operators ************************/
+
+static int vertex_color_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+ EditMesh *em;
+ MCol *mcol;
+ int layernum;
+
+ if(me->edit_mesh) {
+ em= me->edit_mesh;
+
+ layernum= CustomData_number_of_layers(&em->fdata, CD_MCOL);
+ if(layernum >= MAX_MCOL)
+ return OPERATOR_CANCELLED;
+
+ EM_add_data_layer(em, &em->fdata, CD_MCOL);
+ CustomData_set_layer_active(&em->fdata, CD_MCOL, layernum);
+ }
+ else {
+ layernum= CustomData_number_of_layers(&me->fdata, CD_MCOL);
+ if(layernum >= MAX_MCOL)
+ return OPERATOR_CANCELLED;
+
+ mcol= me->mcol;
+
+ if(me->mcol)
+ CustomData_add_layer(&me->fdata, CD_MCOL, CD_DUPLICATE, me->mcol, me->totface);
+ else
+ CustomData_add_layer(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface);
+
+ CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
+ mesh_update_customdata_pointers(me);
+
+ if(!mcol)
+ shadeMeshMCol(scene, ob, me);
+ }
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_vertex_color_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Vertex Color";
+ ot->description= "Add vertex color layer.";
+ ot->idname= "MESH_OT_vertex_color_add";
+
+ /* api callbacks */
+ ot->poll= layers_poll;
+ ot->exec= vertex_color_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int vertex_color_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+ CustomDataLayer *cdl;
+ int index;
+
+ index= CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
+ cdl= (index == -1)? NULL: &me->fdata.layers[index];
+
+ if(!cdl)
+ return OPERATOR_CANCELLED;
+
+ delete_customdata_layer(C, ob, cdl);
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_vertex_color_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Vertex Color";
+ ot->description= "Remove vertex color layer.";
+ ot->idname= "MESH_OT_vertex_color_remove";
+
+ /* api callbacks */
+ ot->exec= vertex_color_remove_exec;
+ ot->poll= layers_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/*********************** sticky operators ************************/
+
+static int sticky_add_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+
+ if(me->msticky)
+ return OPERATOR_CANCELLED;
+
+ // XXX RE_make_sticky();
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_sticky_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Sticky";
+ ot->description= "Add sticky UV texture layer.";
+ ot->idname= "MESH_OT_sticky_add";
+
+ /* api callbacks */
+ ot->poll= layers_poll;
+ ot->exec= sticky_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int sticky_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Mesh *me= ob->data;
+
+ if(!me->msticky)
+ return OPERATOR_CANCELLED;
+
+ CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert);
+ me->msticky= NULL;
+
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_sticky_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Sticky";
+ ot->description= "Remove sticky UV texture layer.";
+ ot->idname= "MESH_OT_sticky_remove";
+
+ /* api callbacks */
+ ot->poll= layers_poll;
+ ot->exec= sticky_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 5a86180a60f..96f5e7452d1 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -54,64 +54,193 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_screen.h"
#include "ED_mesh.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_view3d.h"
-#include "BIF_transform.h"
+#include "UI_interface.h"
#include "mesh_intern.h"
+/******************************** menus *************************************/
-static int mesh_add_duplicate_exec(bContext *C, wmOperator *op)
+static int vertex_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- Object *ob= CTX_data_edit_object(C);
- EditMesh *em= BKE_mesh_get_editmesh(ob->data);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Vertex Specials", 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
+ uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
+ uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
+ uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path");
+ //uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
+ //uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
- adduplicateflag(em, SELECT);
+ uiPupMenuEnd(C, pup);
- BKE_mesh_end_editmesh(ob->data, em);
- return OPERATOR_FINISHED;
+ return OPERATOR_CANCELLED;
}
-static int mesh_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static void MESH_OT_vertex_specials(wmOperatorType *ot)
{
- WM_cursor_wait(1);
- mesh_add_duplicate_exec(C, op);
- WM_cursor_wait(0);
+ /* identifiers */
+ ot->name= "Vertex Specials";
+ //ot->description= "Perform special vertex operations.";
+ ot->idname= "MESH_OT_vertex_specials";
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+ /* api callbacks */
+ ot->invoke= vertex_specials_invoke;
+ ot->poll= ED_operator_editmesh;
+}
+
+static int edge_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Edge Specials", 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ uiItemO(layout, "Mark Seam", 0, "MESH_OT_mark_seam");
+ uiItemBooleanO(layout, "Clear Seam", 0, "MESH_OT_mark_seam", "clear", 1);
+ uiItemEnumO(layout, "Rotate Edge CW", 0, "MESH_OT_edge_rotate", "direction", 1);
+ uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
+ //uiItemO(layout, "Loopcut", 0, "MESH_OT_loop_cut"); // CutEdgeloop(em, 1);
+ //uiItemO(layout, "Edge Slide", 0, "MESH_OT_edge_slide"); // EdgeSlide(em, 0,0.0);
+ uiItemO(layout, "Edge Slide", 0, "TFM_OT_edge_slide");
+ uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
+ uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
+ uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region");
+ uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop");
+ uiItemO(layout, "Mark Sharp", 0, "MESH_OT_mark_sharp");
+ uiItemBooleanO(layout, "Clear Sharp", 0, "MESH_OT_mark_sharp", "clear", 1);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+static void MESH_OT_edge_specials(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Edge Specials";
+ //ot->description= "Perform special edge operations.";
+ ot->idname= "MESH_OT_edge_specials";
- return OPERATOR_FINISHED;
+ /* api callbacks */
+ ot->invoke= edge_specials_invoke;
+ ot->poll= ED_operator_editmesh;
}
-static void MESH_OT_duplicate_add(wmOperatorType *ot)
+static int face_specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Face Specials", 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
+ // uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_flat");
+ uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
+ uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
+ uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "MESH_OT_fill");
+ uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
+
+ uiItemS(layout);
+
+ // uiItemO(layout, NULL, 0, "MESH_OT_face_mode"); // mesh_set_face_flags(em, 1);
+ // uiItemBooleanO(layout, NULL, 0, "MESH_OT_face_mode", "clear", 1); // mesh_set_face_flags(em, 0);
+ //
+ // uiItemS(layout);
+
+ uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_rotate", "direction");
+ uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_uvs_mirror", "axis");
+ uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_rotate", "direction");
+ uiItemMenuEnumO(layout, NULL, 0, "MESH_OT_colors_mirror", "axis");
+
+ uiPupMenuEnd(C, pup);
+ return OPERATOR_CANCELLED;
+}
+
+static void MESH_OT_face_specials(wmOperatorType *ot)
+{
/* identifiers */
- ot->name= "Add Duplicate";
- ot->idname= "MESH_OT_duplicate_add";
+ ot->name= "Face Specials";
+ //ot->description= "Perform special face operations.";
+ ot->idname= "MESH_OT_face_specials";
/* api callbacks */
- ot->invoke= mesh_add_duplicate_invoke;
- ot->exec= mesh_add_duplicate_exec;
-
+ ot->invoke= face_specials_invoke;
ot->poll= ED_operator_editmesh;
+}
+
+static int specials_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Specials", 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ uiItemO(layout, "Subdivide", 0, "MESH_OT_subdivide");
+ uiItemFloatO(layout, "Subdivide Smooth", 0, "MESH_OT_subdivide", "smoothness", 1.0f);
+ uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
+ uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
+ uiItemO(layout, "Hide", 0, "MESH_OT_hide");
+ uiItemO(layout, "Reveal", 0, "MESH_OT_reveal");
+ uiItemO(layout, "Select Inverse", 0, "MESH_OT_select_inverse");
+ uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
+ uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
+ // uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
+ uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_flat");
+ //uiItemO(layout, "Blend From Shape", 0, "MESH_OT_blend_from_shape");
+ //uiItemO(layout, "Propagate to All Shapes", 0, "MESH_OT_shape_propagate_to_all");
+ uiItemO(layout, "Select Vertex Path", 0, "MESH_OT_select_vertex_path");
- /* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
}
+static void MESH_OT_specials(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Specials";
+ //ot->description= "Perform special vertice, edge or face operations.";
+ ot->idname= "MESH_OT_specials";
+
+ /* api callbacks */
+ ot->invoke= specials_invoke;
+ ot->poll= ED_operator_editmesh;
+}
-/* ************************** registration **********************************/
+/**************************** registration **********************************/
void ED_operatortypes_mesh(void)
{
+ wmOperatorType *ot;
+
WM_operatortype_append(MESH_OT_select_all_toggle);
WM_operatortype_append(MESH_OT_select_more);
WM_operatortype_append(MESH_OT_select_less);
- WM_operatortype_append(MESH_OT_select_invert);
+ WM_operatortype_append(MESH_OT_select_inverse);
WM_operatortype_append(MESH_OT_select_non_manifold);
WM_operatortype_append(MESH_OT_select_linked);
WM_operatortype_append(MESH_OT_select_linked_pick);
@@ -119,12 +248,10 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_selection_type);
WM_operatortype_append(MESH_OT_hide);
WM_operatortype_append(MESH_OT_reveal);
+ WM_operatortype_append(MESH_OT_select_by_number_vertices);
WM_operatortype_append(MESH_OT_normals_make_consistent);
+ WM_operatortype_append(MESH_OT_merge);
WM_operatortype_append(MESH_OT_subdivide);
- WM_operatortype_append(MESH_OT_subdivide_multi);
- WM_operatortype_append(MESH_OT_subdivide_multi_fractal);
- WM_operatortype_append(MESH_OT_subdivide_smooth);
- WM_operatortype_append(MESH_OT_subdivs);
WM_operatortype_append(MESH_OT_faces_select_linked_flat);
WM_operatortype_append(MESH_OT_edges_select_sharp);
WM_operatortype_append(MESH_OT_primitive_plane_add);
@@ -139,7 +266,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_primitive_ico_sphere_add);
WM_operatortype_append(MESH_OT_fgon_clear);
WM_operatortype_append(MESH_OT_fgon_make);
- WM_operatortype_append(MESH_OT_duplicate_add);
+ WM_operatortype_append(MESH_OT_duplicate);
WM_operatortype_append(MESH_OT_remove_doubles);
WM_operatortype_append(MESH_OT_extrude);
WM_operatortype_append(MESH_OT_spin);
@@ -149,6 +276,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_split);
WM_operatortype_append(MESH_OT_extrude_repeat);
WM_operatortype_append(MESH_OT_edge_rotate);
+ WM_operatortype_append(MESH_OT_select_vertex_path);
WM_operatortype_append(MESH_OT_loop_to_region);
WM_operatortype_append(MESH_OT_region_to_loop);
@@ -163,7 +291,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_tris_convert_to_quads);
WM_operatortype_append(MESH_OT_edge_flip);
WM_operatortype_append(MESH_OT_faces_shade_smooth);
- WM_operatortype_append(MESH_OT_faces_shade_solid);
+ WM_operatortype_append(MESH_OT_faces_shade_flat);
WM_operatortype_append(MESH_OT_delete);
@@ -172,42 +300,80 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_loop_select);
WM_operatortype_append(MESH_OT_edge_face_add);
WM_operatortype_append(MESH_OT_select_shortest_path);
- WM_operatortype_append(MESH_OT_vertices_select_similar);
- WM_operatortype_append(MESH_OT_edges_select_similar);
- WM_operatortype_append(MESH_OT_faces_select_similar);
+ WM_operatortype_append(MESH_OT_select_similar);
WM_operatortype_append(MESH_OT_loop_multi_select);
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_flip_editnormals);
+ WM_operatortype_append(MESH_OT_flip_normals);
WM_operatortype_append(MESH_OT_knife_cut);
WM_operatortype_append(MESH_OT_rip);
+ WM_operatortype_append(MESH_OT_uv_texture_add);
+ WM_operatortype_append(MESH_OT_uv_texture_remove);
+ WM_operatortype_append(MESH_OT_vertex_color_add);
+ WM_operatortype_append(MESH_OT_vertex_color_remove);
+ WM_operatortype_append(MESH_OT_sticky_add);
+ WM_operatortype_append(MESH_OT_sticky_remove);
+
+ WM_operatortype_append(MESH_OT_vertex_specials);
+ WM_operatortype_append(MESH_OT_edge_specials);
+ WM_operatortype_append(MESH_OT_face_specials);
+ WM_operatortype_append(MESH_OT_specials);
+
+ WM_operatortype_append(MESH_OT_edgering_select);
+ WM_operatortype_append(MESH_OT_loopcut);
+
+ /* macros */
+
+ /*combining operators with invoke and exec portions doesn't work yet.
+
+ ot= WM_operatortype_append_macro("MESH_OT_loopcut", "Loopcut", OPTYPE_UNDO|OPTYPE_REGISTER);
+ WM_operatortype_macro_define(ot, "MESH_OT_edgering_select");
+ WM_operatortype_macro_define(ot, "MESH_OT_subdivide");
+ */
+
+ ot= WM_operatortype_append_macro("MESH_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
+ WM_operatortype_macro_define(ot, "MESH_OT_duplicate");
+ WM_operatortype_macro_define(ot, "TFM_OT_translate");
+
+ ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER);
+ WM_operatortype_macro_define(ot, "MESH_OT_rip");
+ WM_operatortype_macro_define(ot, "TFM_OT_translate");
+
+ ot= WM_operatortype_append_macro("MESH_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER);
+ WM_operatortype_macro_define(ot, "MESH_OT_extrude");
+ WM_operatortype_macro_define(ot, "TFM_OT_translate");
+
}
/* note mesh keymap also for other space? */
void ED_keymap_mesh(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
+ wmKeyMap *keymap;
wmKeymapItem *kmi;
+ keymap= WM_keymap_find(wm, "EditMesh", 0, 0);
+ keymap->poll= ED_operator_editmesh;
+
+ WM_keymap_add_item(keymap, "MESH_OT_loopcut", ACTIONMOUSE, KM_PRESS, KM_CTRL, RKEY);
+
/* selecting */
/* standard mouse selection goes via space_view3d */
WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
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_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_boolean_set(kmi->ptr, "ring", 1);
- kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0);
+
+ kmi= 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);
- RNA_boolean_set(kmi->ptr, "ring", 1);
WM_keymap_add_item(keymap, "MESH_OT_select_shortest_path", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
-
+
WM_keymap_add_item(keymap, "MESH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MESH_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_select_non_manifold", MKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0);
WM_keymap_add_item(keymap, "MESH_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
@@ -217,19 +383,9 @@ void ED_keymap_mesh(wmWindowManager *wm)
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);
RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_edges_select_sharp", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
- WM_keymap_add_item(keymap, "MESH_OT_select_random", SPACEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_vertices_transform_to_sphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT , 0);
- WM_keymap_add_item(keymap, "MESH_OT_mark_seam", ONEKEY, KM_PRESS, KM_CTRL , 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_mark_seam", ONEKEY, KM_PRESS, KM_ALT , 0)->ptr,"clear",1);
-
- WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_CTRL , 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_ALT , 0)->ptr,"set",1);
-
- /* temp hotkeys! */
- WM_keymap_add_item(keymap, "MESH_OT_vertices_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_edges_select_similar", GKEY, KM_PRESS, KM_SHIFT2|KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MESH_OT_faces_select_similar", GKEY, KM_PRESS, KM_SHIFT|KM_CTRL2, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
/* selection mode */
WM_keymap_add_item(keymap, "MESH_OT_selection_type", TABKEY, KM_PRESS, KM_CTRL, 0);
@@ -242,24 +398,17 @@ void ED_keymap_mesh(wmWindowManager *wm)
/* tools */
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, "MESH_OT_vertices_smooth", THREEKEY, KM_PRESS, KM_CTRL , 0);
- WM_keymap_add_item(keymap, "MESH_OT_flip_editnormals", THREEKEY, KM_PRESS, KM_ALT , 0);
- WM_keymap_add_item(keymap, "MESH_OT_subdivs", WKEY, KM_PRESS, 0, 0); // this is the menu
- /*WM_keymap_add_item(keymap, "MESH_OT_subdivide_multi", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_subdivide_multi_fractal", WKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_subdivide_smooth", WKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);*/
- WM_keymap_add_item(keymap, "MESH_OT_remove_doubles", VKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MESH_OT_extrude", EKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_extrude_move", EKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_screw", NINEKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_editmesh_face_toolbox", FKEY, KM_PRESS, KM_CTRL, 0); /* operators below are in this toolbox */
WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "MESH_OT_beauty_fill", FKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_split", FOURKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_extrude_repeat", FOURKEY, KM_PRESS, KM_ALT, 0);
@@ -273,13 +422,14 @@ void ED_keymap_mesh(wmWindowManager *wm)
WM_keymap_add_item(keymap, "MESH_OT_colors_rotate",EIGHTKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_colors_mirror",EIGHTKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_rip",VKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_rip_move",VKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_merge", MKEY, KM_PRESS, KM_ALT, 0);
/* add/remove */
WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MESH_OT_duplicate_add", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, 0, 0);
/* use KM_RELEASE because same key is used for tweaks */
WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", LEFTMOUSE, KM_RELEASE, KM_CTRL, 0);
@@ -288,7 +438,13 @@ void ED_keymap_mesh(wmWindowManager *wm)
WM_keymap_add_item(keymap, "MESH_OT_fgon_make", FKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_fgon_clear", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
- WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, XKEY);
+
+ /* menus */
+ WM_keymap_add_item(keymap, "MESH_OT_vertex_specials", VKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_edge_specials", EKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_face_specials", FKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_specials", WKEY, KM_PRESS, 0, 0);
/* UV's */
WM_keymap_add_item(keymap, "UV_OT_mapping_menu", UKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index f8f0030b258..00893f10165 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -34,20 +34,22 @@
#include <stdlib.h>
#include <string.h>
#include <math.h>
+#include <float.h>
#include "MEM_guardedalloc.h"
#include "DNA_image_types.h"
-#include "DNA_mesh_types.h"
+#include "DNA_key_types.h"
+#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
-#include "DNA_material_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
-#include "DNA_world_types.h"
#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -58,10 +60,12 @@
#include "BKE_blender.h"
+#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_image.h"
+#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
@@ -86,16 +90,14 @@
#include "ED_object.h"
#include "ED_view3d.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
/* own include */
#include "mesh_intern.h"
-
-/* from rendercode.c */
-#define VECMUL(dest, f) dest[0]*= f; dest[1]*= f; dest[2]*= f
-
/* XXX */
-static void BIF_undo_push() {}
-static void waitcursor() {}
+static void waitcursor(int val) {}
static void error() {}
static int pupmenu() {return 0;}
/* XXX */
@@ -103,140 +105,189 @@ static int pupmenu() {return 0;}
/* * ********************** no editmode!!! *********** */
+/*********************** JOIN ***************************/
+
/* join selected meshes into the active mesh, context sensitive
return 0 if no join is made (error) and 1 of the join is done */
-int join_mesh(Scene *scene, View3D *v3d, wmOperator *op)
+
+int join_mesh_exec(bContext *C, wmOperator *op)
{
- Base *base, *nextb;
- Object *ob;
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
Material **matar, *ma;
Mesh *me;
- MVert *mvert, *mvertmain;
+ MVert *mvert, *mv, *mvertmain;
MEdge *medge = NULL, *medgemain;
MFace *mface = NULL, *mfacemain;
- float imat[4][4], cmat[4][4];
- int a, b, totcol, totedge=0, totvert=0, totface=0, ok=0, vertofs, map[MAXMAT];
- int i, j, index, haskey=0, hasmulti=0, edgeofs, faceofs;
+ Key *key, *nkey=NULL;
+ KeyBlock *kb, *okb, *kbn;
+ float imat[4][4], cmat[4][4], *fp1, *fp2, curpos;
+ int a, b, totcol, totmat=0, totedge=0, totvert=0, totface=0, ok=0;
+ int vertofs, *matmap;
+ int i, j, index, haskey=0, edgeofs, faceofs;
bDeformGroup *dg, *odg;
MDeformVert *dvert;
CustomData vdata, edata, fdata;
- if(scene->obedit) return 0;
+ if(scene->obedit)
+ return OPERATOR_CANCELLED;
- ob= OBACT;
- if(!ob || ob->type!=OB_MESH) return 0;
+ /* ob is the object we are adding geometry to */
+ if(!ob || ob->type!=OB_MESH)
+ return OPERATOR_CANCELLED;
- if (object_data_is_libdata(ob)) {
-// XXX error_libdata();
- return 0;
- }
-
/* count & check */
- base= FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(base)) { /* BGMODE since python can access */
- if(base->object->type==OB_MESH) {
- me= base->object->data;
- totvert+= me->totvert;
- totface+= me->totface;
-
- if(base->object == ob) ok= 1;
-
- if(me->key) {
- haskey= 1;
- break;
- }
- if(me->mr) {
- hasmulti= 1;
- break;
- }
- }
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if(base->object->type==OB_MESH) {
+ me= base->object->data;
+
+ totvert+= me->totvert;
+ totedge+= me->totedge;
+ totface+= me->totface;
+ totmat+= base->object->totcol;
+
+ if(base->object == ob)
+ ok= 1;
+
+ /* check for shapekeys */
+ if(me->key)
+ haskey++;
}
- base= base->next;
}
+ CTX_DATA_END;
- if(haskey) {
- BKE_report(op->reports, RPT_ERROR, "Can't join meshes with vertex keys");
- return 0;
- }
- if(hasmulti) {
- BKE_report(op->reports, RPT_ERROR, "Can't join meshes with Multires");
- return 0;
- }
/* that way the active object is always selected */
- if(ok==0) return 0;
+ if(ok==0)
+ return OPERATOR_CANCELLED;
- if(totvert==0 || totvert>MESH_MAX_VERTS) return 0;
-
- /* if needed add edges to other meshes */
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB_BGMODE(base)) {
- if(base->object->type==OB_MESH) {
- me= base->object->data;
- totedge += me->totedge;
- }
- }
- }
+ /* 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)
+ return OPERATOR_CANCELLED;
/* new material indices and material array */
- matar= MEM_callocN(sizeof(void *)*MAXMAT, "join_mesh");
+ matar= MEM_callocN(sizeof(void*)*totmat, "join_mesh matar");
+ matmap= MEM_callocN(sizeof(int)*totmat, "join_mesh matmap");
totcol= ob->totcol;
/* obact materials in new main array, is nicer start! */
- for(a=1; a<=ob->totcol; a++) {
- matar[a-1]= give_current_material(ob, a);
- id_us_plus((ID *)matar[a-1]);
+ for(a=0; a<ob->totcol; a++) {
+ matar[a]= give_current_material(ob, a+1);
+ id_us_plus((ID *)matar[a]);
/* increase id->us : will be lowered later */
}
- base= FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(base)) {
- if(ob!=base->object && base->object->type==OB_MESH) {
- me= base->object->data;
-
- // Join this object's vertex groups to the base one's
- for (dg=base->object->defbase.first; dg; dg=dg->next){
- /* See if this group exists in the object */
- for (odg=ob->defbase.first; odg; odg=odg->next){
- if (!strcmp(odg->name, dg->name)){
- break;
- }
- }
- if (!odg){
- odg = MEM_callocN (sizeof(bDeformGroup), "join deformGroup");
- memcpy (odg, dg, sizeof(bDeformGroup));
- BLI_addtail(&ob->defbase, odg);
+ /* - if destination mesh had shapekeys, move them somewhere safe, and set up placeholders
+ * with arrays that are large enough to hold shapekey data for all meshes
+ * - if destination mesh didn't have shapekeys, but we encountered some in the meshes we're
+ * joining, set up a new keyblock and assign to the mesh
+ */
+ if(key) {
+ /* make a duplicate copy that will only be used here... (must remember to free it!) */
+ nkey= copy_key(key);
+
+ /* for all keys in old block, clear data-arrays */
+ for(kb= key->block.first; kb; kb= kb->next) {
+ if(kb->data) MEM_freeN(kb->data);
+ kb->data= MEM_callocN(sizeof(float)*3*totvert, "join_shapekey");
+ kb->totelem= totvert;
+ kb->weights= NULL;
+ }
+ }
+ else if(haskey) {
+ /* add a new key-block and add to the mesh */
+ key= me->key= add_key((ID *)me);
+ key->type = KEY_RELATIVE;
+ }
+
+ /* first pass over objects - copying materials and vertexgroups across */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* only act if a mesh, and not the one we're joining to */
+ if((ob!=base->object) && (base->object->type==OB_MESH)) {
+ me= base->object->data;
+
+ /* Join this object's vertex groups to the base one's */
+ for(dg=base->object->defbase.first; dg; dg=dg->next) {
+ /* See if this group exists in the object (if it doesn't, add it to the end) */
+ for(odg=ob->defbase.first; odg; odg=odg->next) {
+ if(!strcmp(odg->name, dg->name)) {
+ break;
}
-
}
- if (ob->defbase.first && ob->actdef==0)
- ob->actdef=1;
-
- if(me->totvert) {
+ if(!odg) {
+ odg = MEM_callocN(sizeof(bDeformGroup), "join deformGroup");
+ memcpy(odg, dg, sizeof(bDeformGroup));
+ BLI_addtail(&ob->defbase, odg);
+ }
+ }
+ if(ob->defbase.first && ob->actdef==0)
+ ob->actdef=1;
+
+
+ if(me->totvert) {
+ /* Add this object's materials to the base one's if they don't exist already (but only if limits not exceeded yet) */
+ if(totcol < MAXMAT-1) {
for(a=1; a<=base->object->totcol; a++) {
ma= give_current_material(base->object, a);
- if(ma) {
- for(b=0; b<totcol; b++) {
- if(ma == matar[b]) break;
- }
- if(b==totcol) {
- matar[b]= ma;
+
+ for(b=0; b<totcol; b++) {
+ if(ma == matar[b]) break;
+ }
+ if(b==totcol) {
+ matar[b]= ma;
+ if(ma)
ma->id.us++;
- totcol++;
+ totcol++;
+ }
+ if(totcol>=MAXMAT-1)
+ break;
+ }
+ }
+
+ /* if this mesh has shapekeys, check if destination mesh already has matching entries too */
+ if(me->key && key) {
+ for(kb= me->key->block.first; kb; kb= kb->next) {
+ /* if key doesn't exist in destination mesh, add it */
+ if(key_get_named_keyblock(key, kb->name) == NULL) {
+ /* copy this existing one over to the new shapekey block */
+ kbn= MEM_dupallocN(kb);
+ kbn->prev= kbn->next= NULL;
+
+ /* adjust adrcode and other settings to fit (allocate a new data-array) */
+ kbn->data= MEM_callocN(sizeof(float)*3*totvert, "joined_shapekey");
+ kbn->totelem= totvert;
+ kbn->weights= NULL;
+
+ okb= key->block.last;
+ curpos= (okb) ? okb->pos : -0.1f;
+ if(key->type == KEY_RELATIVE)
+ kbn->pos= curpos + 0.1f;
+ else
+ kbn->pos= curpos;
+
+ BLI_addtail(&key->block, kbn);
+ kbn->adrcode= key->totkey;
+ key->totkey++;
+ if(key->totkey==1) key->refkey= kbn;
+
+ // XXX 2.5 Animato
+#if 0
+ /* also, copy corresponding ipo-curve to ipo-block if applicable */
+ if(me->key->ipo && key->ipo) {
+ // FIXME... this is a luxury item!
+ puts("FIXME: ignoring IPO's when joining shapekeys on Meshes for now...");
}
- if(totcol>=MAXMAT-1) break;
+#endif
}
}
}
}
- if(totcol>=MAXMAT-1) break;
}
- base= base->next;
}
-
- me= ob->data;
-
+ CTX_DATA_END;
+
+ /* setup new data for destination mesh */
memset(&vdata, 0, sizeof(vdata));
memset(&edata, 0, sizeof(edata));
memset(&fdata, 0, sizeof(fdata));
@@ -244,114 +295,177 @@ int join_mesh(Scene *scene, View3D *v3d, 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;
-
- /* inverse transorm all selected meshes in this object */
- Mat4Invert(imat, ob->obmat);
-
+
vertofs= 0;
edgeofs= 0;
faceofs= 0;
- base= FIRSTBASE;
- while(base) {
- nextb= base->next;
- if (TESTBASELIB_BGMODE(base)) {
- if(base->object->type==OB_MESH) {
+
+ /* inverse transform for all selected meshes in this object */
+ Mat4Invert(imat, ob->obmat);
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* only join if this is a mesh */
+ if(base->object->type==OB_MESH) {
+ me= base->object->data;
+
+ if(me->totvert) {
+ /* standard data */
+ CustomData_merge(&me->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert);
+ CustomData_copy_data(&me->vdata, &vdata, 0, vertofs, me->totvert);
- me= base->object->data;
+ /* vertex groups */
+ dvert= CustomData_get(&vdata, vertofs, CD_MDEFORMVERT);
- if(me->totvert) {
- CustomData_merge(&me->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert);
- CustomData_copy_data(&me->vdata, &vdata, 0, vertofs, me->totvert);
-
- dvert= CustomData_get(&vdata, vertofs, CD_MDEFORMVERT);
-
- /* NEW VERSION */
- if (dvert){
- for (i=0; i<me->totvert; i++){
- for (j=0; j<dvert[i].totweight; j++){
- // Find the old vertex group
- odg = BLI_findlink (&base->object->defbase, dvert[i].dw[j].def_nr);
- if(odg) {
- // Search for a match in the new object
- for (dg=ob->defbase.first, index=0; dg; dg=dg->next, index++){
- if (!strcmp(dg->name, odg->name)){
- dvert[i].dw[j].def_nr = index;
- break;
- }
+ /* NB: vertex groups here are new version */
+ if(dvert) {
+ for(i=0; i<me->totvert; i++) {
+ for(j=0; j<dvert[i].totweight; j++) {
+ /* Find the old vertex group */
+ odg = BLI_findlink(&base->object->defbase, dvert[i].dw[j].def_nr);
+ if(odg) {
+ /* Search for a match in the new object, and set new index */
+ for(dg=ob->defbase.first, index=0; dg; dg=dg->next, index++) {
+ if(!strcmp(dg->name, odg->name)) {
+ dvert[i].dw[j].def_nr = index;
+ break;
}
}
}
}
}
-
- if(base->object != ob) {
- /* watch this: switch matmul order really goes wrong */
- Mat4MulMat4(cmat, base->object->obmat, imat);
-
- a= me->totvert;
- while(a--) {
- Mat4MulVecfl(cmat, mvert->co);
- mvert++;
- }
- }
- else mvert+= me->totvert;
}
- if(me->totface) {
- /* make mapping for materials */
- memset(map, 0, 4*MAXMAT);
- for(a=1; a<=base->object->totcol; a++) {
- ma= give_current_material(base->object, a);
- if(ma) {
- for(b=0; b<totcol; b++) {
- if(ma == matar[b]) {
- map[a-1]= b;
- break;
+ /* if this is the object we're merging into, no need to do anything */
+ if(base->object != ob) {
+ /* watch this: switch matmul order really goes wrong */
+ Mat4MulMat4(cmat, base->object->obmat, imat);
+
+ /* transform vertex coordinates into new space */
+ for(a=0, mv=mvert; a < me->totvert; a++, mv++) {
+ Mat4MulVecfl(cmat, mv->co);
+ }
+
+ /* for each shapekey in destination mesh:
+ * - if there's a matching one, copy it across (will need to transform vertices into new space...)
+ * - otherwise, just copy own coordinates of mesh (no need to transform vertex coordinates into new space)
+ */
+ if(key) {
+ /* if this mesh has any shapekeys, check first, otherwise just copy coordinates */
+ for(kb= key->block.first; kb; kb= kb->next) {
+ /* get pointer to where to write data for this mesh in shapekey's data array */
+ fp1= ((float *)kb->data) + (vertofs*3);
+
+ /* check if this mesh has such a shapekey */
+ okb= key_get_named_keyblock(me->key, kb->name);
+ if(okb) {
+ /* copy this mesh's shapekey to the destination shapekey (need to transform first) */
+ fp2= ((float *)(okb->data));
+ for(a=0; a < me->totvert; a++, fp1+=3, fp2+=3) {
+ VECCOPY(fp1, fp2);
+ Mat4MulVecfl(cmat, fp1);
+ }
+ }
+ else {
+ /* copy this mesh's vertex coordinates to the destination shapekey */
+ mv= mvert;
+ for(a=0; a < me->totvert; a++, fp1+=3, mv++) {
+ VECCOPY(fp1, mv->co);
}
}
}
}
-
- CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
- CustomData_copy_data(&me->fdata, &fdata, 0, faceofs, me->totface);
-
- for(a=0; a<me->totface; a++, mface++) {
- mface->v1+= vertofs;
- mface->v2+= vertofs;
- mface->v3+= vertofs;
- if(mface->v4) mface->v4+= vertofs;
-
- mface->mat_nr= map[(int)mface->mat_nr];
+ }
+ else {
+ /* for each shapekey in destination mesh:
+ * - if it was an 'original', copy the appropriate data from nkey
+ * - otherwise, copy across plain coordinates (no need to transform coordinates)
+ */
+ if(key) {
+ for(kb= key->block.first; kb; kb= kb->next) {
+ /* get pointer to where to write data for this mesh in shapekey's data array */
+ fp1= ((float *)kb->data) + (vertofs*3);
+
+ /* check if this was one of the original shapekeys */
+ okb= key_get_named_keyblock(nkey, kb->name);
+ if(okb) {
+ /* copy this mesh's shapekey to the destination shapekey */
+ fp2= ((float *)(okb->data));
+ for(a=0; a < me->totvert; a++, fp1+=3, fp2+=3) {
+ VECCOPY(fp1, fp2);
+ }
+ }
+ else {
+ /* copy base-coordinates to the destination shapekey */
+ mv= mvert;
+ for(a=0; a < me->totvert; a++, fp1+=3, mv++) {
+ VECCOPY(fp1, mv->co);
+ }
+ }
+ }
}
-
- faceofs += me->totface;
}
- if(me->totedge) {
- CustomData_merge(&me->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
- CustomData_copy_data(&me->edata, &edata, 0, edgeofs, me->totedge);
-
- for(a=0; a<me->totedge; a++, medge++) {
- medge->v1+= vertofs;
- medge->v2+= vertofs;
+ /* advance mvert pointer to end of base mesh's data */
+ mvert+= me->totvert;
+ }
+
+ if(me->totface) {
+ /* make mapping for materials */
+ for(a=1; a<=base->object->totcol; a++) {
+ ma= give_current_material(base->object, a);
+
+ for(b=0; b<totcol; b++) {
+ if(ma == matar[b]) {
+ matmap[a-1]= b;
+ break;
+ }
}
-
- edgeofs += me->totedge;
}
- vertofs += me->totvert;
+ CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&me->fdata, &fdata, 0, faceofs, me->totface);
+
+ for(a=0; a<me->totface; a++, mface++) {
+ mface->v1+= vertofs;
+ mface->v2+= vertofs;
+ mface->v3+= vertofs;
+ if(mface->v4) mface->v4+= vertofs;
+
+ mface->mat_nr= matmap[(int)mface->mat_nr];
+ }
- if(base->object!=ob)
- ED_base_object_free_and_unlink(scene, base);
+ faceofs += me->totface;
}
+
+ if(me->totedge) {
+ CustomData_merge(&me->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+ CustomData_copy_data(&me->edata, &edata, 0, edgeofs, me->totedge);
+
+ for(a=0; a<me->totedge; a++, medge++) {
+ medge->v1+= vertofs;
+ medge->v2+= vertofs;
+ }
+
+ edgeofs += me->totedge;
+ }
+
+ /* vertofs is used to help newly added verts be reattached to their edge/face
+ * (cannot be set earlier, or else reattaching goes wrong)
+ */
+ vertofs += me->totvert;
+
+ /* free base, now that data is merged */
+ if(base->object != ob)
+ ED_base_object_free_and_unlink(scene, base);
}
- base= nextb;
}
+ CTX_DATA_END;
+ /* return to mesh we're merging to */
me= ob->data;
CustomData_free(&me->vdata, me->totvert);
@@ -378,30 +492,53 @@ int join_mesh(Scene *scene, View3D *v3d, wmOperator *op)
if(ma) ma->id.us--;
}
if(ob->mat) MEM_freeN(ob->mat);
+ if(ob->matbits) MEM_freeN(ob->matbits);
if(me->mat) MEM_freeN(me->mat);
- ob->mat= me->mat= 0;
+ ob->mat= me->mat= NULL;
+ ob->matbits= NULL;
if(totcol) {
me->mat= matar;
ob->mat= MEM_callocN(sizeof(void *)*totcol, "join obmatar");
+ ob->matbits= MEM_callocN(sizeof(char)*totcol, "join obmatbits");
}
- else MEM_freeN(matar);
+ else
+ MEM_freeN(matar);
ob->totcol= me->totcol= totcol;
ob->colbits= 0;
+
+ MEM_freeN(matmap);
/* other mesh users */
test_object_materials((ID *)me);
- DAG_scene_sort(scene); // removed objects, need to rebuild dag before editmode call
+ /* free temp copy of destination shapekeys (if applicable) */
+ if(nkey) {
+ // XXX 2.5 Animato
+#if 0
+ /* free it's ipo too - both are not actually freed from memory yet as ID-blocks */
+ if(nkey->ipo) {
+ free_ipo(nkey->ipo);
+ BLI_remlink(&G.main->ipo, nkey->ipo);
+ MEM_freeN(nkey->ipo);
+ }
+#endif
+
+ free_key(nkey);
+ BLI_remlink(&G.main->key, nkey);
+ MEM_freeN(nkey);
+ }
-// XXX enter_editmode(EM_WAITCURSOR);
-// exit_editmode(EM_FREEDATA|EM_WAITCURSOR); // freedata, but no undo
+ DAG_scene_sort(scene); // removed objects, need to rebuild dag before editmode call
- BIF_undo_push("Join Mesh");
- return 1;
-}
+ ED_object_enter_editmode(C, EM_WAITCURSOR);
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
+ return OPERATOR_FINISHED;
+}
/* ********************** SORT FACES ******************* */
@@ -495,7 +632,7 @@ void sort_faces(Scene *scene, View3D *v3d)
if (event == 1)
Mat4MulMat4(mat, OBACT->obmat, rv3d->viewmat); /* apply the view matrix to the object matrix */
else if (event == 2) { /* sort from cursor */
- if( v3d && v3d->localview ) {
+ if( v3d && v3d->localvd ) {
VECCOPY(cur, v3d->cursor);
} else {
VECCOPY(cur, scene->cursor);
@@ -515,14 +652,14 @@ void sort_faces(Scene *scene, View3D *v3d)
else face_sort_floats[i] = reverse;
} else {
/* find the faces center */
- VECADD(vec, (me->mvert+mf->v1)->co, (me->mvert+mf->v2)->co);
+ VecAddf(vec, (me->mvert+mf->v1)->co, (me->mvert+mf->v2)->co);
if (mf->v4) {
- VECADD(vec, vec, (me->mvert+mf->v3)->co);
- VECADD(vec, vec, (me->mvert+mf->v4)->co);
- VECMUL(vec, 0.25f);
+ VecAddf(vec, vec, (me->mvert+mf->v3)->co);
+ VecAddf(vec, vec, (me->mvert+mf->v4)->co);
+ VecMulf(vec, 0.25f);
} else {
- VECADD(vec, vec, (me->mvert+mf->v3)->co);
- VECMUL(vec, 1.0f/3.0f);
+ VecAddf(vec, vec, (me->mvert+mf->v3)->co);
+ VecMulf(vec, 1.0f/3.0f);
} /* done */
if (event == 1) { /* sort on view axis */
@@ -545,7 +682,7 @@ void sort_faces(Scene *scene, View3D *v3d)
MEM_freeN(index);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(ob->data, OB_RECALC_DATA);
}
diff --git a/source/blender/editors/metaball/Makefile b/source/blender/editors/metaball/Makefile
new file mode 100644
index 00000000000..d971ec9b412
--- /dev/null
+++ b/source/blender/editors/metaball/Makefile
@@ -0,0 +1,56 @@
+#
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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/SConscript b/source/blender/editors/metaball/SConscript
new file mode 100644
index 00000000000..4b1b4090631
--- /dev/null
+++ b/source/blender/editors/metaball/SConscript
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('*.c')
+
+incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+incs += ' #/intern/guardedalloc ../../gpu'
+incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
+
+env.BlenderLib ( 'bf_editors_metaball', sources, Split(incs), [], libtype=['core'], priority=[45] )
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
new file mode 100644
index 00000000000..6ad7fbabfcb
--- /dev/null
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -0,0 +1,686 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 <math.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "DNA_meta_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_userdef_types.h"
+
+#include "RNA_define.h"
+#include "RNA_access.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_depsgraph.h"
+#include "BKE_object.h"
+#include "BKE_context.h"
+
+#include "ED_screen.h"
+#include "ED_view3d.h"
+#include "ED_transform.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* This function is used to free all MetaElems from MetaBall */
+void free_editMball(Object *obedit)
+{
+}
+
+/* This function is called, when MetaBall Object is
+ * switched from object mode to edit mode */
+void make_editMball(Object *obedit)
+{
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml;/*, *newml;*/
+
+ ml= mb->elems.first;
+
+ while(ml) {
+ if(ml->flag & SELECT) mb->lastelem = ml;
+ ml= ml->next;
+ }
+
+ mb->editelems = &mb->elems;
+}
+
+/* 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 to object->data->elems. */
+void load_editMball(Object *obedit)
+{
+ MetaBall *mb = (MetaBall*)obedit->data;
+
+ mb->editelems= NULL;
+ mb->lastelem= NULL;
+}
+
+/* Add metaelem primitive to metaball object (which is in edit mode) */
+MetaElem *add_metaball_primitive(bContext *C, int type, int newname)
+{
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mball = (MetaBall*)obedit->data;
+ MetaElem *ml;
+ float *curs, mat[3][3], cent[3], imat[3][3], cmat[3][3];
+
+ if(!obedit) return NULL;
+
+ /* Deselect all existing metaelems */
+ ml= mball->editelems->first;
+ while(ml) {
+ ml->flag &= ~SELECT;
+ ml= ml->next;
+ }
+
+ Mat3CpyMat4(mat, obedit->obmat);
+ if(v3d) {
+ curs= give_cursor(scene, v3d);
+ VECCOPY(cent, curs);
+ }
+ else
+ cent[0]= cent[1]= cent[2]= 0.0f;
+
+ cent[0]-= obedit->obmat[3][0];
+ cent[1]-= obedit->obmat[3][1];
+ cent[2]-= obedit->obmat[3][2];
+
+ if (rv3d) {
+ if (!(newname) || U.flag & USER_ADD_VIEWALIGNED || !rv3d)
+ Mat3CpyMat4(imat, rv3d->viewmat);
+ else
+ Mat3One(imat);
+ Mat3MulVecfl(imat, cent);
+ Mat3MulMat3(cmat, imat, mat);
+ Mat3Inv(imat,cmat);
+ Mat3MulVecfl(imat, cent);
+ }
+ else
+ Mat3One(imat);
+
+ ml= MEM_callocN(sizeof(MetaElem), "metaelem");
+
+ ml->x= cent[0];
+ ml->y= cent[1];
+ ml->z= cent[2];
+ ml->quat[0]= 1.0;
+ ml->quat[1]= 0.0;
+ ml->quat[2]= 0.0;
+ ml->quat[3]= 0.0;
+ ml->rad= 2.0;
+ ml->s= 2.0;
+ ml->flag= SELECT | MB_SCALE_RAD;
+
+ switch(type) {
+ case MB_BALL:
+ ml->type = MB_BALL;
+ ml->expx= ml->expy= ml->expz= 1.0;
+ break;
+ case MB_TUBE:
+ ml->type = MB_TUBE;
+ ml->expx= ml->expy= ml->expz= 1.0;
+ break;
+ case MB_PLANE:
+ ml->type = MB_PLANE;
+ ml->expx= ml->expy= ml->expz= 1.0;
+ break;
+ case MB_ELIPSOID:
+ ml->type = MB_ELIPSOID;
+ ml->expx= 1.2f;
+ ml->expy= 0.8f;
+ ml->expz= 1.0;
+ break;
+ case MB_CUBE:
+ ml->type = MB_CUBE;
+ ml->expx= ml->expy= ml->expz= 1.0;
+ break;
+ default:
+ break;
+ }
+
+ mball->lastelem= ml;
+
+ return ml;
+}
+
+/***************************** Select/Deselect operator *****************************/
+
+/* Select or deselect all MetaElements */
+static int select_deselect_all_metaelems_exec(bContext *C, wmOperator *op)
+{
+ //Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml;
+ int any_sel= 0;
+
+ /* Is any metaelem selected? */
+ ml= mb->editelems->first;
+ if(ml) {
+ while(ml) {
+ if(ml->flag & SELECT) break;
+ ml= ml->next;
+ }
+ if(ml) any_sel= 1;
+
+ ml= mb->editelems->first;
+ while(ml) {
+ if(any_sel) ml->flag &= ~SELECT;
+ else ml->flag |= SELECT;
+ ml= ml->next;
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, mb);
+ //DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void MBALL_OT_select_deselect_all_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select/Deselect All";
+ ot->description= "(de)select all metaelements.";
+ ot->idname= "MBALL_OT_select_deselect_all_metaelems";
+
+ /* callback functions */
+ ot->exec= select_deselect_all_metaelems_exec;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/***************************** Select inverse operator *****************************/
+
+/* Invert metaball selection */
+static int select_inverse_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml;
+
+ ml= mb->editelems->first;
+ if(ml) {
+ while(ml) {
+ if(ml->flag & SELECT)
+ ml->flag &= ~SELECT;
+ else
+ ml->flag |= SELECT;
+ ml= ml->next;
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, mb);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void MBALL_OT_select_inverse_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Inverse";
+ ot->description= "Select inverse of (un)selected metaelements.";
+ ot->idname= "MBALL_OT_select_inverse_metaelems";
+
+ /* callback functions */
+ ot->exec= select_inverse_metaelems_exec;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/***************************** Select random operator *****************************/
+
+/* Random metaball selection */
+static int select_random_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml;
+ float percent= RNA_float_get(op->ptr, "percent");
+
+ if(percent == 0.0)
+ return OPERATOR_CANCELLED;
+
+ ml= mb->editelems->first;
+ BLI_srand( BLI_rand() ); /* Random seed */
+
+ /* Stupid version of random selection. Should be improved. */
+ while(ml) {
+ if(BLI_frand() < percent)
+ ml->flag |= SELECT;
+ else
+ ml->flag &= ~SELECT;
+ ml= ml->next;
+ }
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, mb);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Random...";
+ ot->description= "Randomly select metaelements.";
+ ot->idname= "MBALL_OT_select_random_metaelems";
+
+ /* callback functions */
+ ot->exec= select_random_metaelems_exec;
+ ot->invoke= WM_operator_props_popup;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "Percentage of metaelems to select randomly.", 0.0001f, 1.0f);
+}
+
+/***************************** Duplicate operator *****************************/
+
+/* Duplicate selected MetaElements */
+static int duplicate_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml, *newml;
+
+ ml= mb->editelems->last;
+ if(ml) {
+ while(ml) {
+ if(ml->flag & SELECT) {
+ newml= MEM_dupallocN(ml);
+ BLI_addtail(mb->editelems, newml);
+ mb->lastelem= newml;
+ ml->flag &= ~SELECT;
+ }
+ ml= ml->prev;
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ int retv= duplicate_metaelems_exec(C, op);
+
+ if (retv == OPERATOR_FINISHED) {
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+ }
+
+ return retv;
+}
+
+
+void MBALL_OT_duplicate_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Duplicate";
+ ot->description= "Delete selected metaelement(s).";
+ ot->idname= "MBALL_OT_duplicate_metaelems";
+
+ /* callback functions */
+ ot->exec= duplicate_metaelems_exec;
+ ot->invoke= duplicate_metaelems_invoke;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
+/***************************** Delete operator *****************************/
+
+/* Delete all selected MetaElems (not MetaBall) */
+static int delete_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb= (MetaBall*)obedit->data;
+ MetaElem *ml, *next;
+
+ ml= mb->editelems->first;
+ if(ml) {
+ while(ml) {
+ next= ml->next;
+ if(ml->flag & SELECT) {
+ if(mb->lastelem==ml) mb->lastelem= NULL;
+ BLI_remlink(mb->editelems, ml);
+ MEM_freeN(ml);
+ }
+ ml= next;
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void MBALL_OT_delete_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete";
+ ot->description= "Delete selected metaelement(s).";
+ ot->idname= "MBALL_OT_delete_metaelems";
+
+ /* callback functions */
+ ot->exec= delete_metaelems_exec;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/***************************** Hide operator *****************************/
+
+/* Hide selected MetaElems */
+static int hide_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb= (MetaBall*)obedit->data;
+ MetaElem *ml;
+ int hide_unselected= RNA_boolean_get(op->ptr, "unselected");
+
+ ml= mb->editelems->first;
+
+ if(ml) {
+ /* Hide unselected metaelems */
+ if(hide_unselected) {
+ while(ml){
+ if(!(ml->flag & SELECT))
+ ml->flag |= MB_HIDE;
+ ml= ml->next;
+ }
+ /* Hide selected metaelems */
+ } else {
+ while(ml){
+ if(ml->flag & SELECT)
+ ml->flag |= MB_HIDE;
+ ml= ml->next;
+ }
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void MBALL_OT_hide_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Hide";
+ ot->description= "Hide (un)selected metaelement(s).";
+ ot->idname= "MBALL_OT_hide_metaelems";
+
+ /* callback functions */
+ ot->exec= hide_metaelems_exec;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected.");
+}
+
+/***************************** Unhide operator *****************************/
+
+/* Unhide all edited MetaElems */
+static int reveal_metaelems_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ MetaBall *mb= (MetaBall*)obedit->data;
+ MetaElem *ml;
+
+ ml= mb->editelems->first;
+
+ if(ml) {
+ while(ml) {
+ ml->flag &= ~MB_HIDE;
+ ml= ml->next;
+ }
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void MBALL_OT_reveal_metaelems(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reveal";
+ ot->description= "Reveal all hidden metaelements.";
+ ot->idname= "MBALL_OT_reveal_metaelems";
+
+ /* callback functions */
+ ot->exec= reveal_metaelems_exec;
+ ot->poll= ED_operator_editmball;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* Select MetaElement with mouse click (user can select radius circle or
+ * stiffness circle) */
+void mouse_mball(bContext *C, short mval[2], int extend)
+{
+ static MetaElem *startelem=NULL;
+ Object *obedit= CTX_data_edit_object(C);
+ ViewContext vc;
+ MetaBall *mb = (MetaBall*)obedit->data;
+ MetaElem *ml, *act=NULL;
+ int a, hits;
+ unsigned int buffer[4*MAXPICKBUF];
+ rcti rect;
+
+ view3d_set_viewcontext(C, &vc);
+
+ rect.xmin= mval[0]-12;
+ rect.xmax= mval[0]+12;
+ rect.ymin= mval[1]-12;
+ rect.ymax= mval[1]+12;
+
+ hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
+
+ /* does startelem exist? */
+ ml= mb->editelems->first;
+ while(ml) {
+ if(ml==startelem) break;
+ ml= ml->next;
+ }
+
+ if(ml==NULL) startelem= mb->editelems->first;
+
+ if(hits>0) {
+ ml= startelem;
+ while(ml) {
+ for(a=0; a<hits; a++) {
+ /* index converted for gl stuff */
+ if(ml->selcol1==buffer[ 4 * a + 3 ]){
+ ml->flag |= MB_SCALE_RAD;
+ act= ml;
+ }
+ if(ml->selcol2==buffer[ 4 * a + 3 ]){
+ ml->flag &= ~MB_SCALE_RAD;
+ act= ml;
+ }
+ }
+ if(act) break;
+ ml= ml->next;
+ if(ml==NULL) ml= mb->editelems->first;
+ if(ml==startelem) break;
+ }
+
+ /* When some metaelem was found, then it is neccessary to select or
+ * deselet it. */
+ if(act) {
+ if(extend==0) {
+ /* Deselect all existing metaelems */
+ ml= mb->editelems->first;
+ while(ml) {
+ ml->flag &= ~SELECT;
+ ml= ml->next;
+ }
+ /* Select only metaelem clicked on */
+ act->flag |= SELECT;
+ }
+ else {
+ if(act->flag & SELECT)
+ act->flag &= ~SELECT;
+ else
+ act->flag |= SELECT;
+ }
+ mb->lastelem= act;
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, mb);
+ }
+ }
+}
+
+
+/* ************* undo for MetaBalls ************* */
+
+/* free all MetaElems from ListBase */
+static void freeMetaElemlist(ListBase *lb)
+{
+ MetaElem *ml, *next;
+
+ if(lb==NULL) return;
+
+ ml= lb->first;
+ while(ml){
+ next= ml->next;
+ BLI_remlink(lb, ml);
+ MEM_freeN(ml);
+ ml= next;
+ }
+
+ lb->first= lb->last= NULL;
+}
+
+
+static void undoMball_to_editMball(void *lbu, void *lbe)
+{
+ ListBase *lb= lbu;
+ ListBase *editelems= lbe;
+ MetaElem *ml, *newml;
+
+ freeMetaElemlist(editelems);
+
+ /* copy 'undo' MetaElems to 'edit' MetaElems */
+ ml= lb->first;
+ while(ml){
+ newml= MEM_dupallocN(ml);
+ BLI_addtail(editelems, newml);
+ ml= ml->next;
+ }
+
+}
+
+static void *editMball_to_undoMball(void *lbe)
+{
+ ListBase *editelems= lbe;
+ ListBase *lb;
+ MetaElem *ml, *newml;
+
+ /* allocate memory for undo ListBase */
+ lb= MEM_callocN(sizeof(ListBase), "listbase undo");
+ lb->first= lb->last= NULL;
+
+ /* copy contents of current ListBase to the undo ListBase */
+ ml= editelems->first;
+ while(ml){
+ newml= MEM_dupallocN(ml);
+ BLI_addtail(lb, newml);
+ ml= ml->next;
+ }
+
+ return lb;
+}
+
+/* free undo ListBase of MetaElems */
+static void free_undoMball(void *lbv)
+{
+ ListBase *lb= lbv;
+
+ freeMetaElemlist(lb);
+ MEM_freeN(lb);
+}
+
+ListBase *metaball_get_editelems(Object *ob)
+{
+ if(ob && ob->type==OB_MBALL) {
+ struct MetaBall *mb= (struct MetaBall*)ob->data;
+ return mb->editelems;
+ }
+ return NULL;
+}
+
+
+static void *get_data(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ return metaball_get_editelems(obedit);
+}
+
+/* this is undo system for MetaBalls */
+void undo_push_mball(bContext *C, char *name)
+{
+ undo_editmode_push(C, name, get_data, free_undoMball, undoMball_to_editMball, editMball_to_undoMball, NULL);
+}
+
diff --git a/source/blender/editors/metaball/mball_intern.h b/source/blender/editors/metaball/mball_intern.h
new file mode 100644
index 00000000000..8cf749733dd
--- /dev/null
+++ b/source/blender/editors/metaball/mball_intern.h
@@ -0,0 +1,47 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef ED_MBALL_INTERN_H
+#define ED_MBALL_INTERN_H
+
+#include "DNA_object_types.h"
+
+#include "DNA_windowmanager_types.h"
+
+void MBALL_OT_hide_metaelems(struct wmOperatorType *ot);
+void MBALL_OT_reveal_metaelems(struct wmOperatorType *ot);
+
+void MBALL_OT_delete_metaelems(struct wmOperatorType *ot);
+void MBALL_OT_duplicate_metaelems(struct wmOperatorType *ot);
+
+void MBALL_OT_select_deselect_all_metaelems(struct wmOperatorType *ot);
+void MBALL_OT_select_inverse_metaelems(struct wmOperatorType *ot);
+void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot);
+
+#endif
+
diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c
new file mode 100644
index 00000000000..dd8a18f385c
--- /dev/null
+++ b/source/blender/editors/metaball/mball_ops.c
@@ -0,0 +1,74 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+
+#include "DNA_listBase.h"
+#include "DNA_windowmanager_types.h"
+
+#include "ED_screen.h"
+
+#include "mball_intern.h"
+
+void ED_operatortypes_metaball(void)
+{
+ WM_operatortype_append(MBALL_OT_delete_metaelems);
+ WM_operatortype_append(MBALL_OT_duplicate_metaelems);
+
+ WM_operatortype_append(MBALL_OT_hide_metaelems);
+ WM_operatortype_append(MBALL_OT_reveal_metaelems);
+
+ WM_operatortype_append(MBALL_OT_select_deselect_all_metaelems);
+ WM_operatortype_append(MBALL_OT_select_inverse_metaelems);
+ WM_operatortype_append(MBALL_OT_select_random_metaelems);
+}
+
+void ED_keymap_metaball(wmWindowManager *wm)
+{
+ wmKeyMap *keymap;
+
+ keymap= WM_keymap_find(wm, "Metaball", 0, 0);
+ keymap->poll= ED_operator_editmball;
+
+ WM_keymap_add_item(keymap, "OBJECT_OT_metaball_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+
+ WM_keymap_add_item(keymap, "MBALL_OT_reveal_metaelems", HKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+
+ WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MBALL_OT_duplicate_metaelems", DKEY, KM_PRESS, KM_SHIFT, 0);
+
+ WM_keymap_add_item(keymap, "MBALL_OT_select_deselect_all_metaelems", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "MBALL_OT_select_inverse_metaelems", IKEY, KM_PRESS, KM_CTRL, 0);
+}
+
diff --git a/source/blender/editors/object/Makefile b/source/blender/editors/object/Makefile
index 70ada46c80f..fd2af305d87 100644
--- a/source/blender/editors/object/Makefile
+++ b/source/blender/editors/object/Makefile
@@ -47,6 +47,7 @@ CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../makesrna
CPPFLAGS += -I../../python
CPPFLAGS += -I../../imbuf
+CPPFLAGS += -I../../ikplugin
# own include
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index 3371e172a82..6ecc80f2d81 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -6,7 +6,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc'
incs += ' #/intern/guardedalloc'
-incs += ' ../../makesrna ../../python'
+incs += ' ../../makesrna ../../python ../../ikplugin'
defs = []
diff --git a/source/blender/editors/object/editconstraint.c b/source/blender/editors/object/editconstraint.c
deleted file mode 100644
index ff2f79e7cdb..00000000000
--- a/source/blender/editors/object/editconstraint.c
+++ /dev/null
@@ -1,1086 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Joshua Leung, Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <stdio.h>
-#include <string.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-#include "BLI_dynstr.h"
-
-#include "DNA_action_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_constraint_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_text_types.h"
-#include "DNA_view3d_types.h"
-
-#include "BKE_action.h"
-#include "BKE_armature.h"
-#include "BKE_constraint.h"
-#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
-#include "BKE_object.h"
-#include "BKE_report.h"
-#include "BKE_utildefines.h"
-
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h"
-#endif
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "RNA_access.h"
-#include "RNA_define.h"
-#include "RNA_enum_types.h"
-
-#include "ED_object.h"
-#include "ED_screen.h"
-
-#include "object_intern.h"
-
-/* XXX */
-static void BIF_undo_push() {}
-static void error() {}
-static int okee() {return 0;}
-static int pupmenu() {return 0;}
-
-/* -------------- Get Active Constraint Data ---------------------- */
-
-
-/* if object in posemode, active bone constraints, else object constraints */
-ListBase *get_active_constraints (Object *ob)
-{
- if (ob == NULL)
- return NULL;
-
- if (ob->flag & OB_POSEMODE) {
- bPoseChannel *pchan;
-
- pchan = get_active_posechannel(ob);
- if (pchan)
- return &pchan->constraints;
- }
- else
- return &ob->constraints;
-
- return NULL;
-}
-
-/* single constraint */
-bConstraint *get_active_constraint (Object *ob)
-{
- ListBase *lb= get_active_constraints(ob);
-
- if (lb) {
- bConstraint *con;
-
- for (con= lb->first; con; con=con->next) {
- if (con->flag & CONSTRAINT_ACTIVE)
- return con;
- }
- }
-
- return NULL;
-}
-
-/* single channel, for ipo */
-bConstraintChannel *get_active_constraint_channel (Scene *scene, Object *ob)
-{
- bConstraint *con;
-
- if (ob->flag & OB_POSEMODE) {
- //if (ob->action) { // XXX old animation system
- bPoseChannel *pchan;
-
- pchan = get_active_posechannel(ob);
- if (pchan) {
- for (con= pchan->constraints.first; con; con= con->next) {
- if (con->flag & CONSTRAINT_ACTIVE)
- break;
- }
-
- if (con) {
-#if 0 // XXX old animation system
- bActionChannel *achan = get_action_channel(ob->action, pchan->name);
- if (achan) {
- for (chan= achan->constraintChannels.first; chan; chan= chan->next) {
- if (!strcmp(chan->name, con->name))
- break;
- }
- return chan;
- }
-#endif // XXX old animation system
- }
- }
- //} // xxx old animation system
- }
- else {
- for (con= ob->constraints.first; con; con= con->next) {
- if (con->flag & CONSTRAINT_ACTIVE)
- break;
- }
-
- if (con) {
-#if 0 // XXX old animation system
- ListBase *lb= get_active_constraint_channels(scene, ob, 0);
-
- if (lb) {
- for (chan= lb->first; chan; chan= chan->next) {
- if (!strcmp(chan->name, con->name))
- break;
- }
-
- return chan;
- }
-#endif // XXX old animation system
- }
- }
-
- return NULL;
-}
-
-/* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */
-/* ------------- PyConstraints ------------------ */
-
-/* this callback sets the text-file to be used for selected menu item */
-void validate_pyconstraint_cb (void *arg1, void *arg2)
-{
- bPythonConstraint *data = arg1;
- Text *text= NULL;
- int index = *((int *)arg2);
- int i;
-
- /* exception for no script */
- if (index) {
- /* innovative use of a for...loop to search */
- for (text=G.main->text.first, i=1; text && index!=i; i++, text=text->id.next);
- }
- data->text = text;
-}
-
-#ifndef DISABLE_PYTHON
-/* this returns a string for the list of usable pyconstraint script names */
-char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
-{
- DynStr *pupds= BLI_dynstr_new();
- Text *text;
- char *str;
- char buf[64];
- int i;
-
- /* add title first */
- sprintf(buf, "Scripts: %%t|[None]%%x0|");
- BLI_dynstr_append(pupds, buf);
-
- /* init active-index first */
- if (con_text == NULL)
- *pyconindex= 0;
-
- /* loop through markers, adding them */
- for (text=G.main->text.first, i=1; text; i++, text=text->id.next) {
- /* this is important to ensure that right script is shown as active */
- if (text == con_text) *pyconindex = i;
-
- /* only include valid pyconstraint scripts */
- if (BPY_is_pyconstraint(text)) {
- BLI_dynstr_append(pupds, text->id.name+2);
-
- sprintf(buf, "%%x%d", i);
- BLI_dynstr_append(pupds, buf);
-
- if (text->id.next)
- BLI_dynstr_append(pupds, "|");
- }
- }
-
- /* convert to normal MEM_malloc'd string */
- str= BLI_dynstr_get_cstring(pupds);
- BLI_dynstr_free(pupds);
-
- return str;
-}
-#endif /* DISABLE_PYTHON */
-
-/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
-void update_pyconstraint_cb (void *arg1, void *arg2)
-{
- Object *owner= (Object *)arg1;
- bConstraint *con= (bConstraint *)arg2;
-#ifndef DISABLE_PYTHON
- if (owner && con)
- BPY_pyconstraint_update(owner, con);
-#endif
-}
-
-/* Creates a new constraint, initialises its data, and returns it */
-bConstraint *add_new_constraint (short type)
-{
- bConstraint *con;
- bConstraintTypeInfo *cti;
-
- con = MEM_callocN(sizeof(bConstraint), "Constraint");
-
- /* Set up a generic constraint datablock */
- con->type = type;
- con->flag |= CONSTRAINT_EXPAND;
- con->enforce = 1.0F;
- strcpy(con->name, "Const");
-
- /* Load the data for it */
- cti = constraint_get_typeinfo(con);
- if (cti) {
- con->data = MEM_callocN(cti->size, cti->structName);
-
- /* only constraints that change any settings need this */
- if (cti->new_data)
- cti->new_data(con->data);
- }
-
- return con;
-}
-
-/* Adds the given constraint to the Object-level set of constraints for the given Object */
-void add_constraint_to_object (bConstraint *con, Object *ob)
-{
- ListBase *list;
- list = &ob->constraints;
-
- if (list) {
- unique_constraint_name(con, list);
- BLI_addtail(list, con);
-
- if (proxylocked_constraints_owner(ob, NULL))
- con->flag |= CONSTRAINT_PROXY_LOCAL;
-
- con->flag |= CONSTRAINT_ACTIVE;
- for (con= con->prev; con; con= con->prev)
- con->flag &= ~CONSTRAINT_ACTIVE;
- }
-}
-
-/* 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)
-{
- bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
- ListBase targets = {NULL, NULL};
- bConstraintTarget *ct;
- int num_targets, i;
-
- if (cti && cti->get_constraint_targets) {
- cti->get_constraint_targets(con, &targets);
- num_targets= BLI_countlist(&targets);
-
- if (index < 0) {
- if (abs(index) < num_targets)
- index= num_targets - abs(index);
- else
- index= num_targets - 1;
- }
- else if (index >= num_targets) {
- index= num_targets - 1;
- }
-
- for (ct=targets.first, i=0; ct; ct= ct->next, i++) {
- if (i == index) {
- ct->tar= target;
- strcpy(ct->subtarget, subtarget);
- break;
- }
- }
-
- if (cti->flush_constraint_targets)
- cti->flush_constraint_targets(con, &targets, 0);
- }
-}
-
-/* context: active object in posemode, active channel, optional selected channel */
-void add_constraint (Scene *scene, View3D *v3d, short only_IK)
-{
- Object *ob= OBACT, *obsel=NULL;
- bPoseChannel *pchanact=NULL, *pchansel=NULL;
- bConstraint *con=NULL;
- Base *base;
- short nr;
-
- /* paranoia checks */
- if ((ob==NULL) || (ob==scene->obedit))
- return;
-
- if ((ob->pose) && (ob->flag & OB_POSEMODE)) {
- bArmature *arm= ob->data;
-
- /* find active channel */
- pchanact= get_active_posechannel(ob);
- if (pchanact==NULL)
- return;
-
- /* find selected bone */
- for (pchansel=ob->pose->chanbase.first; pchansel; pchansel=pchansel->next) {
- if (pchansel != pchanact) {
- if (pchansel->bone->flag & BONE_SELECTED) {
- if (pchansel->bone->layer & arm->layer)
- break;
- }
- }
- }
- }
-
- /* find selected object */
- for (base= FIRSTBASE; base; base= base->next) {
- if ((TESTBASE(v3d, base)) && (base->object!=ob))
- obsel= base->object;
- }
-
- /* the only_IK caller has checked for posemode! */
- if (only_IK) {
- for (con= pchanact->constraints.first; con; con= con->next) {
- if (con->type==CONSTRAINT_TYPE_KINEMATIC) break;
- }
- if (con) {
- error("Pose Channel already has IK");
- return;
- }
-
- if (pchansel)
- nr= pupmenu("Add IK Constraint%t|To Active Bone%x10");
- else if (obsel)
- nr= pupmenu("Add IK Constraint%t|To Active Object%x10");
- else
- nr= pupmenu("Add IK Constraint%t|To New Empty Object%x10|Without Target%x11");
- }
- else {
- if (pchanact) {
- if (pchansel)
- nr= pupmenu("Add Constraint to Active Bone%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
- else if ((obsel) && (obsel->type==OB_CURVE))
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17|Stretch To%x7|%l|Action%x16|Script%x18");
- else if ((obsel) && (obsel->type==OB_MESH))
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Shrinkwrap%x22|Stretch To%x7|%l|Action%x16|Script%x18");
- else if (obsel)
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
- else
- nr= pupmenu("Add Constraint to New Empty Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
- }
- else {
- if ((obsel) && (obsel->type==OB_CURVE))
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17|%l|Action%x16|Script%x18");
- else if ((obsel) && (obsel->type==OB_MESH))
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|Shrinkwrap%x22|%l|Action%x16|Script%x18");
- else if (obsel)
- nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
- else
- nr= pupmenu("Add Constraint to New Empty Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Limit Distance%x21|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
- }
- }
-
- if (nr < 1) return;
-
- /* handle IK separate */
- if (nr==10 || nr==11) {
- /* ik - prevent weird chains... */
- if (pchansel) {
- bPoseChannel *pchan= pchanact;
- while (pchan) {
- if (pchan==pchansel) break;
- pchan= pchan->parent;
- }
- if (pchan) {
- error("IK root cannot be linked to IK tip");
- return;
- }
-
- pchan= pchansel;
- while (pchan) {
- if (pchan==pchanact) break;
- pchan= pchan->parent;
- }
- if (pchan) {
- error("IK tip cannot be linked to IK root");
- return;
- }
- }
-
- con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
- BLI_addtail(&pchanact->constraints, con);
- unique_constraint_name(con, &pchanact->constraints);
- pchanact->constflag |= PCHAN_HAS_IK; /* for draw, but also for detecting while pose solving */
- if (nr==11)
- pchanact->constflag |= PCHAN_HAS_TARGET;
- if (proxylocked_constraints_owner(ob, pchanact))
- con->flag |= CONSTRAINT_PROXY_LOCAL;
- }
- else {
- /* normal constraints - add data */
- if (nr==1) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIKE);
- else if (nr==2) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIKE);
- else if (nr==3) con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
- else if (nr==4) con = add_new_constraint(CONSTRAINT_TYPE_MINMAX);
- else if (nr==5) con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
- else if (nr==6) {
- Curve *cu= obsel->data;
- cu->flag |= CU_PATH;
- con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
- }
- else if (nr==7) con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO);
- else if (nr==8) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIKE);
- else if (nr==13) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIMIT);
- else if (nr==14) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIMIT);
- else if (nr==15) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIMIT);
- else if (nr==16) {
- /* TODO: add a popup-menu to display list of available actions to use (like for pyconstraints) */
- con = add_new_constraint(CONSTRAINT_TYPE_ACTION);
- }
- else if (nr==17) {
- Curve *cu= obsel->data;
- cu->flag |= CU_PATH;
- con = add_new_constraint(CONSTRAINT_TYPE_CLAMPTO);
- }
- else if (nr==18) {
- char *menustr;
- int scriptint= 0;
-#ifndef DISABLE_PYTHON
- /* popup a list of usable scripts */
- menustr = buildmenu_pyconstraints(NULL, &scriptint);
- scriptint = pupmenu(menustr);
- MEM_freeN(menustr);
-
- /* only add constraint if a script was chosen */
- if (scriptint) {
- /* add constraint */
- con = add_new_constraint(CONSTRAINT_TYPE_PYTHON);
- validate_pyconstraint_cb(con->data, &scriptint);
-
- /* make sure target allowance is set correctly */
- BPY_pyconstraint_update(ob, con);
- }
-#endif
- }
- else if (nr==19) {
- con = add_new_constraint(CONSTRAINT_TYPE_CHILDOF);
-
- /* if this constraint is being added to a posechannel, make sure
- * the constraint gets evaluated in pose-space
- */
- if (pchanact) {
- con->ownspace = CONSTRAINT_SPACE_POSE;
- con->flag |= CONSTRAINT_SPACEONCE;
- }
- }
- else if (nr==20) con = add_new_constraint(CONSTRAINT_TYPE_TRANSFORM);
- else if (nr==21) con = add_new_constraint(CONSTRAINT_TYPE_DISTLIMIT);
- else if (nr==22) con = add_new_constraint(CONSTRAINT_TYPE_SHRINKWRAP);
-
- if (con==NULL) return; /* paranoia */
-
- if (pchanact) {
- BLI_addtail(&pchanact->constraints, con);
- unique_constraint_name(con, &pchanact->constraints);
- pchanact->constflag |= PCHAN_HAS_CONST; /* for draw */
- if (proxylocked_constraints_owner(ob, pchanact))
- con->flag |= CONSTRAINT_PROXY_LOCAL;
- }
- else {
- BLI_addtail(&ob->constraints, con);
- unique_constraint_name(con, &ob->constraints);
- if (proxylocked_constraints_owner(ob, NULL))
- con->flag |= CONSTRAINT_PROXY_LOCAL;
- }
- }
-
- /* set the target */
- if (pchansel) {
- set_constraint_nth_target(con, ob, pchansel->name, 0);
- }
- else if (obsel) {
- set_constraint_nth_target(con, obsel, "", 0);
- }
- else if (ELEM4(nr, 11, 13, 14, 15)==0) { /* add new empty as target */
- Base *base= BASACT, *newbase;
- Object *obt;
-
- obt= add_object(scene, OB_EMPTY);
- /* set layers OK */
- newbase= BASACT;
- newbase->lay= base->lay;
- obt->lay= newbase->lay;
-
- /* transform cent to global coords for loc */
- if (pchanact) {
- if (only_IK)
- VecMat4MulVecfl(obt->loc, ob->obmat, pchanact->pose_tail);
- else
- VecMat4MulVecfl(obt->loc, ob->obmat, pchanact->pose_head);
- }
- else
- VECCOPY(obt->loc, ob->obmat[3]);
-
- set_constraint_nth_target(con, obt, "", 0);
-
- /* restore, add_object sets active */
- BASACT= base;
- base->flag |= SELECT;
- }
-
- /* active flag */
- con->flag |= CONSTRAINT_ACTIVE;
- for (con= con->prev; con; con= con->prev)
- con->flag &= ~CONSTRAINT_ACTIVE;
-
- DAG_scene_sort(scene); // sort order of objects
-
- if (pchanact) {
- ob->pose->flag |= POSE_RECALC; // sort pose channels
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA); // and all its relations
- }
- else
- DAG_object_flush_update(scene, ob, OB_RECALC_OB); // and all its relations
-
- if (only_IK)
- BIF_undo_push("Add IK Constraint");
- else
- BIF_undo_push("Add Constraint");
-
-}
-
-/* Remove all constraints from the active object */
-void ob_clear_constraints (Scene *scene)
-{
- Object *ob= OBACT;
-
- /* paranoia checks */
- if ((ob==NULL) || (ob==scene->obedit) || (ob->flag & OB_POSEMODE))
- return;
-
- /* get user permission */
- if (okee("Clear Constraints")==0)
- return;
-
- /* do freeing */
- free_constraints(&ob->constraints);
-
- /* do updates */
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
-
- BIF_undo_push("Clear Constraint(s)");
-}
-
-/* ------------- Constraint Sanity Testing ------------------- */
-
-/* checks validity of object pointers, and NULLs,
- * if Bone doesnt exist it sets the CONSTRAINT_DISABLE flag
- */
-static void test_constraints (Object *owner, const char substring[])
-{
- bConstraint *curcon;
- ListBase *conlist= NULL;
- int type;
-
- if (owner==NULL) return;
-
- /* Check parents */
- if (strlen(substring)) {
- switch (owner->type) {
- case OB_ARMATURE:
- type = CONSTRAINT_OBTYPE_BONE;
- break;
- default:
- type = CONSTRAINT_OBTYPE_OBJECT;
- break;
- }
- }
- else
- type = CONSTRAINT_OBTYPE_OBJECT;
-
- /* Get the constraint list for this object */
- switch (type) {
- case CONSTRAINT_OBTYPE_OBJECT:
- conlist = &owner->constraints;
- break;
- case CONSTRAINT_OBTYPE_BONE:
- {
- Bone *bone;
- bPoseChannel *chan;
-
- bone = get_named_bone( ((bArmature *)owner->data), substring );
- chan = get_pose_channel(owner->pose, substring);
- if (bone && chan) {
- conlist = &chan->constraints;
- }
- }
- break;
- }
-
- /* Check all constraints - is constraint valid? */
- if (conlist) {
- for (curcon = conlist->first; curcon; curcon=curcon->next) {
- bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
- ListBase targets = {NULL, NULL};
- bConstraintTarget *ct;
-
- /* clear disabled-flag first */
- curcon->flag &= ~CONSTRAINT_DISABLE;
-
- if (curcon->type == CONSTRAINT_TYPE_KINEMATIC) {
- bKinematicConstraint *data = curcon->data;
-
- /* bad: we need a separate set of checks here as poletarget is
- * optional... otherwise poletarget must exist too or else
- * the constraint is deemed invalid
- */
- if (exist_object(data->tar) == 0) {
- data->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (data->tar == owner) {
- if (!get_named_bone(get_armature(owner), data->subtarget)) {
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- }
-
- if (data->poletar) {
- if (exist_object(data->poletar) == 0) {
- data->poletar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (data->poletar == owner) {
- if (!get_named_bone(get_armature(owner), data->polesubtarget)) {
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- }
- }
-
- /* targets have already been checked for this */
- continue;
- }
- else if (curcon->type == CONSTRAINT_TYPE_ACTION) {
- bActionConstraint *data = curcon->data;
-
- /* validate action */
- if (data->act == NULL)
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (curcon->type == CONSTRAINT_TYPE_FOLLOWPATH) {
- bFollowPathConstraint *data = curcon->data;
-
- /* don't allow track/up axes to be the same */
- if (data->upflag==data->trackflag)
- curcon->flag |= CONSTRAINT_DISABLE;
- if (data->upflag+3==data->trackflag)
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
- bTrackToConstraint *data = curcon->data;
-
- /* don't allow track/up axes to be the same */
- if (data->reserved2==data->reserved1)
- curcon->flag |= CONSTRAINT_DISABLE;
- if (data->reserved2+3==data->reserved1)
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (curcon->type == CONSTRAINT_TYPE_LOCKTRACK) {
- bLockTrackConstraint *data = curcon->data;
-
- if (data->lockflag==data->trackflag)
- curcon->flag |= CONSTRAINT_DISABLE;
- if (data->lockflag+3==data->trackflag)
- curcon->flag |= CONSTRAINT_DISABLE;
- }
-
- /* Check targets for constraints */
- if (cti && cti->get_constraint_targets) {
- cti->get_constraint_targets(curcon, &targets);
-
- /* disable and clear constraints targets that are incorrect */
- for (ct= targets.first; ct; ct= ct->next) {
- /* general validity checks (for those constraints that need this) */
- if (exist_object(ct->tar) == 0) {
- ct->tar = NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else if (ct->tar == owner) {
- if (!get_named_bone(get_armature(owner), ct->subtarget)) {
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- }
-
- /* target checks for specific constraints */
- if (ELEM(curcon->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO)) {
- if (ct->tar) {
- if (ct->tar->type != OB_CURVE) {
- ct->tar= NULL;
- curcon->flag |= CONSTRAINT_DISABLE;
- }
- else {
- Curve *cu= ct->tar->data;
-
- /* auto-set 'Path' setting on curve so this works */
- cu->flag |= CU_PATH;
- }
- }
- }
- }
-
- /* free any temporary targets */
- if (cti->flush_constraint_targets)
- cti->flush_constraint_targets(curcon, &targets, 0);
- }
- }
- }
-}
-
-static void test_bonelist_constraints (Object *owner, ListBase *list)
-{
- Bone *bone;
-
- for (bone = list->first; bone; bone = bone->next) {
- test_constraints(owner, bone->name);
- test_bonelist_constraints(owner, &bone->childbase);
- }
-}
-
-void object_test_constraints (Object *owner)
-{
- test_constraints(owner, "");
-
- if (owner->type==OB_ARMATURE) {
- bArmature *arm= get_armature(owner);
-
- if (arm)
- test_bonelist_constraints(owner, &arm->bonebase);
- }
-}
-
-/* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */
-
-/* ------------- Child-Of Constraint ------------------ */
-
-/* ChildOf Constraint - set inverse callback */
-void childof_const_setinv (void *conv, void *scenev)
-{
- bConstraint *con= (bConstraint *)conv;
- Scene *scene= (Scene *)scenev;
- bChildOfConstraint *data= (bChildOfConstraint *)con->data;
- Object *ob= OBACT;
- bPoseChannel *pchan= NULL;
-
- /* try to find a pose channel */
- if (ob && ob->pose)
- pchan= get_active_posechannel(ob);
-
- /* calculate/set inverse matrix */
- if (pchan) {
- float pmat[4][4], cinf;
- float imat[4][4], tmat[4][4];
-
- /* make copy of pchan's original pose-mat (for use later) */
- Mat4CpyMat4(pmat, pchan->pose_mat);
-
- /* disable constraint for pose to be solved without it */
- cinf= con->enforce;
- con->enforce= 0.0f;
-
- /* solve pose without constraint */
- where_is_pose(scene, ob);
-
- /* determine effect of constraint by removing the newly calculated
- * pchan->pose_mat from the original pchan->pose_mat, thus determining
- * the effect of the constraint
- */
- Mat4Invert(imat, pchan->pose_mat);
- Mat4MulMat4(tmat, imat, pmat);
- Mat4Invert(data->invmat, tmat);
-
- /* recalculate pose with new inv-mat */
- con->enforce= cinf;
- where_is_pose(scene, ob);
- }
- else if (ob) {
- Object workob;
- /* use what_does_parent to find inverse - just like for normal parenting.
- * NOTE: what_does_parent uses a static workob defined in object.c
- */
- what_does_parent(scene, ob, &workob);
- Mat4Invert(data->invmat, workob.obmat);
- }
- else
- Mat4One(data->invmat);
-}
-
-/* ChildOf Constraint - clear inverse callback */
-void childof_const_clearinv (void *conv, void *unused)
-{
- bConstraint *con= (bConstraint *)conv;
- bChildOfConstraint *data= (bChildOfConstraint *)con->data;
-
- /* simply clear the matrix */
- Mat4One(data->invmat);
-}
-
-/***************************** BUTTONS ****************************/
-
-/* Rename the given constraint, con already has the new name */
-void ED_object_constraint_rename(Object *ob, bConstraint *con, char *oldname)
-{
- bConstraint *tcon;
- ListBase *conlist= NULL;
- int from_object= 0;
- char *channame="";
-
- /* get context by searching for con (primitive...) */
- for (tcon= ob->constraints.first; tcon; tcon= tcon->next) {
- if (tcon==con)
- break;
- }
-
- if (tcon) {
- conlist= &ob->constraints;
- channame= "Object";
- from_object= 1;
- }
- else if (ob->pose) {
- bPoseChannel *pchan;
-
- for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- for (tcon= pchan->constraints.first; tcon; tcon= tcon->next) {
- if (tcon==con)
- break;
- }
- if (tcon)
- break;
- }
-
- if (tcon) {
- conlist= &pchan->constraints;
- channame= pchan->name;
- }
- }
-
- if (conlist==NULL) {
- printf("rename constraint failed\n"); /* should not happen in UI */
- return;
- }
-
- /* first make sure it's a unique name within context */
- unique_constraint_name (con, conlist);
-}
-
-
-
-
-void ED_object_constraint_set_active(Object *ob, bConstraint *con)
-{
- ListBase *lb;
- bConstraint *origcon= con;
-
- /* lets be nice and escape if its active already */
- if(con && (con->flag & CONSTRAINT_ACTIVE))
- return ;
-
- lb= get_active_constraints(ob);
- if(lb == NULL)
- return;
-
- for(con= lb->first; con; con= con->next) {
- if(con==origcon) con->flag |= CONSTRAINT_ACTIVE;
- else con->flag &= ~CONSTRAINT_ACTIVE;
- }
-
- /* make sure ipowin and buttons shows it */
- if(ob->ipowin==ID_CO) {
- // XXX allqueue(REDRAWIPO, ID_CO);
- // XXX allspace(REMAKEIPO, 0);
- // XXX allqueue(REDRAWNLA, 0);
- }
- // XXX allqueue(REDRAWBUTSOBJECT, 0);
-}
-
-int ED_object_constraint_delete(ReportList *reports, Object *ob, bConstraint *con)
-{
- bConstraintChannel *chan;
- ListBase *lb;
-
- /* remove ipo channel */
- lb= NULL; // XXX get_active_constraint_channels(ob, 0);
- if(lb) {
- chan = NULL; // XXX get_constraint_channel(lb, con->name);
- if(chan) {
- if(chan->ipo) chan->ipo->id.us--;
- BLI_freelinkN(lb, chan);
- }
- }
-
- /* remove constraint itself */
- lb= get_active_constraints(ob);
- free_constraint_data(con);
- BLI_freelinkN(lb, con);
-
- ED_object_constraint_set_active(ob, NULL);
-
- return 1;
-}
-
-int ED_object_constraint_move_down(ReportList *reports, Object *ob, bConstraint *constr)
-{
- bConstraint *con;
- ListBase *conlist;
-
- if(constr->next) {
- conlist = get_active_constraints(ob);
- for(con= conlist->first; con; con= con->next) {
- if(con==constr) {
- BLI_remlink(conlist, con);
- BLI_insertlink(conlist, con->next, con);
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-int ED_object_constraint_move_up(ReportList *reports, Object *ob, bConstraint *constr)
-{
- bConstraint *con;
- ListBase *conlist;
-
- if(constr->prev) {
- conlist = get_active_constraints(ob);
- for(con= conlist->first; con; con= con->next) {
- if(con==constr) {
- BLI_remlink(conlist, con);
- BLI_insertlink(conlist, con->prev->prev, con);
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-/***************************** OPERATORS ****************************/
-
-/************************ add constraint operator *********************/
-
-static int constraint_add_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob = CTX_data_active_object(C);
- bConstraint *con, *coniter;
- ListBase *list= get_active_constraints(ob);
- bPoseChannel *pchan= get_active_posechannel(ob);
- int type= RNA_enum_get(op->ptr, "type");
-
- con = add_new_constraint(type);
-
- if(list) {
- unique_constraint_name(con, list);
- BLI_addtail(list, con);
-
- if(proxylocked_constraints_owner(ob, pchan))
- con->flag |= CONSTRAINT_PROXY_LOCAL;
-
- con->flag |= CONSTRAINT_ACTIVE;
- for(coniter= con->prev; coniter; coniter= coniter->prev)
- coniter->flag &= ~CONSTRAINT_ACTIVE;
- }
-
- 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->flag & OB_POSEMODE) {
- con->ownspace = CONSTRAINT_SPACE_POSE;
- con->flag |= CONSTRAINT_SPACEONCE;
- }
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data;
-
- /* set selected first object as target - moved from new_constraint_data */
- data = (bRigidBodyJointConstraint*)con->data;
-
- CTX_DATA_BEGIN(C, Object*, selob, selected_objects) {
- if(selob != ob) {
- data->tar= selob;
- break;
- }
- }
- CTX_DATA_END;
- }
- break;
- default:
- break;
- }
-
- object_test_constraints(ob);
-
- if(ob->pose)
- update_pose_constraint_flags(ob->pose);
-
- if(ob->type==OB_ARMATURE)
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA|OB_RECALC_OB);
- else
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_constraint_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Add Constraint";
- ot->description = "Add a constraint to the active object.";
- ot->idname= "OBJECT_OT_constraint_add";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= constraint_add_exec;
-
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", "");
-}
-
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
new file mode 100644
index 00000000000..05905cd42a4
--- /dev/null
+++ b/source/blender/editors/object/object_add.c
@@ -0,0 +1,1490 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2002-2008 full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_object_fluidsim.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_vfont_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_listbase.h"
+
+#include "BKE_anim.h"
+#include "BKE_armature.h"
+#include "BKE_constraint.h"
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_group.h"
+#include "BKE_lattice.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_particle.h"
+#include "BKE_report.h"
+#include "BKE_sca.h"
+#include "BKE_scene.h"
+#include "BKE_texture.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_curve.h"
+#include "ED_mball.h"
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "object_intern.h"
+
+/************************** Exported *****************************/
+
+void ED_object_base_init_from_view(bContext *C, Base *base)
+{
+ View3D *v3d= CTX_wm_view3d(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= base->object;
+
+ if (scene==NULL)
+ return;
+
+ if (v3d==NULL) {
+ base->lay = scene->lay;
+ VECCOPY(ob->loc, scene->cursor);
+ }
+ else {
+ if (v3d->localvd) {
+ base->lay= ob->lay= v3d->layact | v3d->lay;
+ VECCOPY(ob->loc, v3d->cursor);
+ }
+ else {
+ base->lay= ob->lay= v3d->layact;
+ VECCOPY(ob->loc, scene->cursor);
+ }
+
+ if (U.flag & USER_ADD_VIEWALIGNED) {
+ ARegion *ar= CTX_wm_region(C);
+ if(ar) {
+ RegionView3D *rv3d= ar->regiondata;
+
+ rv3d->viewquat[0]= -rv3d->viewquat[0];
+ QuatToEul(rv3d->viewquat, ob->rot);
+ rv3d->viewquat[0]= -rv3d->viewquat[0];
+ }
+ }
+ }
+ where_is_object(scene, ob);
+}
+
+/********************* 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 */
+}
+
+/* for object add primitive operators */
+static Object *object_add_type(bContext *C, int type)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob;
+
+ /* for as long scene has editmode... */
+ if (CTX_data_edit_object(C))
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
+
+ /* deselects all, sets scene->basact */
+ ob= add_object(scene, type);
+ /* editor level activate, notifiers */
+ ED_base_object_activate(C, BASACT);
+
+ /* more editor stuff */
+ ED_object_base_init_from_view(C, BASACT);
+
+ DAG_scene_sort(scene);
+
+ return ob;
+}
+
+/* for object add operator */
+static int object_add_exec(bContext *C, wmOperator *op)
+{
+ object_add_type(C, RNA_enum_get(op->ptr, "type"));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Object";
+ ot->description = "Add an object to the scene.";
+ ot->idname= "OBJECT_OT_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_add_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", object_type_items, 0, "Type", "");
+}
+
+/* ***************** add primitives *************** */
+/* ****** work both in and outside editmode ****** */
+
+static EnumPropertyItem prop_mesh_types[] = {
+ {0, "PLANE", ICON_MESH_PLANE, "Plane", ""},
+ {1, "CUBE", ICON_MESH_CUBE, "Cube", ""},
+ {2, "CIRCLE", ICON_MESH_CIRCLE, "Circle", ""},
+ {3, "UVSPHERE", ICON_MESH_UVSPHERE, "UVsphere", ""},
+ {4, "ICOSPHERE", ICON_MESH_ICOSPHERE, "Icosphere", ""},
+ {5, "CYLINDER", ICON_MESH_TUBE, "Cylinder", ""},
+ {6, "CONE", ICON_MESH_CONE, "Cone", ""},
+ {0, "", 0, NULL, NULL},
+ {7, "GRID", ICON_MESH_GRID, "Grid", ""},
+ {8, "MONKEY", ICON_MESH_MONKEY, "Monkey", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int object_add_mesh_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ int newob= 0;
+
+ if(obedit==NULL || obedit->type!=OB_MESH) {
+ object_add_type(C, OB_MESH);
+ ED_object_enter_editmode(C, EM_DO_UNDO);
+ newob = 1;
+ }
+ else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+
+ switch(RNA_enum_get(op->ptr, "type")) {
+ case 0:
+ WM_operator_name_call(C, "MESH_OT_primitive_plane_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 1:
+ WM_operator_name_call(C, "MESH_OT_primitive_cube_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 2:
+ WM_operator_name_call(C, "MESH_OT_primitive_circle_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 3:
+ WM_operator_name_call(C, "MESH_OT_primitive_uv_sphere_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 4:
+ WM_operator_name_call(C, "MESH_OT_primitive_ico_sphere_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 5:
+ WM_operator_name_call(C, "MESH_OT_primitive_cylinder_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 6:
+ WM_operator_name_call(C, "MESH_OT_primitive_cone_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 7:
+ WM_operator_name_call(C, "MESH_OT_primitive_grid_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ case 8:
+ WM_operator_name_call(C, "MESH_OT_primitive_monkey_add", WM_OP_INVOKE_REGION_WIN, NULL);
+ break;
+ }
+ /* userdef */
+ if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OBJECT_OT_mesh_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Mesh";
+ ot->description = "Add a mesh object to the scene.";
+ ot->idname= "OBJECT_OT_mesh_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_add_mesh_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags: no register or undo, this operator calls operators */
+ ot->flag= 0; //OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_mesh_types, 0, "Primitive", "");
+}
+
+static EnumPropertyItem prop_curve_types[] = {
+ {CU_BEZIER|CU_PRIM_CURVE, "BEZIER_CURVE", ICON_CURVE_BEZCURVE, "Bezier Curve", ""},
+ {CU_BEZIER|CU_PRIM_CIRCLE, "BEZIER_CIRCLE", ICON_CURVE_BEZCIRCLE, "Bezier Circle", ""},
+ {CU_NURBS|CU_PRIM_CURVE, "NURBS_CURVE", ICON_CURVE_NCURVE, "NURBS Curve", ""},
+ {CU_NURBS|CU_PRIM_CIRCLE, "NURBS_CIRCLE", ICON_CURVE_NCIRCLE, "NURBS Circle", ""},
+ {CU_NURBS|CU_PRIM_PATH, "PATH", ICON_CURVE_PATH, "Path", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int object_add_curve_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ ListBase *editnurb;
+ Nurb *nu;
+ int newob= 0;
+
+ if(obedit==NULL || obedit->type!=OB_CURVE) {
+ object_add_type(C, OB_CURVE);
+ ED_object_enter_editmode(C, 0);
+ newob = 1;
+ }
+ else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+
+ obedit= CTX_data_edit_object(C);
+ nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
+ editnurb= curve_get_editcurve(obedit);
+ BLI_addtail(editnurb, nu);
+
+ /* userdef */
+ if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
+ if(!obedit || obedit->type == OB_CURVE)
+ uiItemsEnumO(layout, op->type->idname, "type");
+ else
+ uiItemsEnumO(layout, "OBJECT_OT_surface_add", "type");
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_curve_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Curve";
+ ot->description = "Add a curve object to the scene.";
+ ot->idname= "OBJECT_OT_curve_add";
+
+ /* api callbacks */
+ ot->invoke= object_add_curve_invoke;
+ ot->exec= object_add_curve_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", "");
+}
+
+static EnumPropertyItem prop_surface_types[]= {
+ {CU_PRIM_CURVE|CU_NURBS, "NURBS_CURVE", ICON_SURFACE_NCURVE, "NURBS Curve", ""},
+ {CU_PRIM_CIRCLE|CU_NURBS, "NURBS_CIRCLE", ICON_SURFACE_NCIRCLE, "NURBS Circle", ""},
+ {CU_PRIM_PATCH|CU_NURBS, "NURBS_SURFACE", ICON_SURFACE_NSURFACE, "NURBS Surface", ""},
+ {CU_PRIM_TUBE|CU_NURBS, "NURBS_TUBE", ICON_SURFACE_NTUBE, "NURBS Tube", ""},
+ {CU_PRIM_SPHERE|CU_NURBS, "NURBS_SPHERE", ICON_SURFACE_NSPHERE, "NURBS Sphere", ""},
+ {CU_PRIM_DONUT|CU_NURBS, "NURBS_DONUT", ICON_SURFACE_NDONUT, "NURBS Donut", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int object_add_surface_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ ListBase *editnurb;
+ Nurb *nu;
+ int newob= 0;
+
+ if(obedit==NULL || obedit->type!=OB_SURF) {
+ object_add_type(C, OB_SURF);
+ ED_object_enter_editmode(C, 0);
+ newob = 1;
+ }
+ else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+
+ obedit= CTX_data_edit_object(C);
+ nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
+ editnurb= curve_get_editcurve(obedit);
+ BLI_addtail(editnurb, nu);
+
+ /* userdef */
+ if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_surface_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Surface";
+ ot->description = "Add a surface object to the scene.";
+ ot->idname= "OBJECT_OT_surface_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_add_surface_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", "");
+}
+
+static EnumPropertyItem prop_metaball_types[]= {
+ {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""},
+ {MB_TUBE, "MBALL_TUBE", ICON_META_TUBE, "Meta Tube", ""},
+ {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);
+ MetaBall *mball;
+ MetaElem *elem;
+ int newob= 0;
+
+ if(obedit==NULL || obedit->type!=OB_MBALL) {
+ object_add_type(C, OB_MBALL);
+ ED_object_enter_editmode(C, 0);
+ newob = 1;
+ }
+ else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+
+ obedit= CTX_data_edit_object(C);
+ elem= (MetaElem*)add_metaball_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
+ mball= (MetaBall*)obedit->data;
+ BLI_addtail(mball->editelems, elem);
+
+ /* userdef */
+ if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, op->type->name, 0);
+ layout= uiPupMenuLayout(pup);
+ if(!obedit || obedit->type == OB_MBALL)
+ uiItemsEnumO(layout, op->type->idname, "type");
+ else
+ uiItemsEnumO(layout, "OBJECT_OT_metaball_add", "type");
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_metaball_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Metaball";
+ ot->description= "Add an metaball object to the scene.";
+ ot->idname= "OBJECT_OT_metaball_add";
+
+ /* api callbacks */
+ ot->invoke= object_metaball_add_invoke;
+ ot->exec= object_metaball_add_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", "");
+}
+static int object_add_text_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+
+ if(obedit && obedit->type==OB_FONT)
+ return OPERATOR_CANCELLED;
+
+ object_add_type(C, OB_FONT);
+ obedit= CTX_data_active_object(C);
+
+ if(U.flag & USER_ADD_EDITMODE)
+ ED_object_enter_editmode(C, 0);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_text_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Text";
+ ot->description = "Add a text object to the scene";
+ ot->idname= "OBJECT_OT_text_add";
+
+ /* api callbacks */
+ ot->exec= object_add_text_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+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;
+ int newob= 0;
+
+ if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) {
+ object_add_type(C, OB_ARMATURE);
+ ED_object_enter_editmode(C, 0);
+ newob = 1;
+ }
+ else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+
+ 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);
+
+ /* userdef */
+ if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_armature_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Armature";
+ ot->description = "Add an armature object to the scene.";
+ ot->idname= "OBJECT_OT_armature_add";
+
+ /* api callbacks */
+ ot->exec= object_armature_add_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int object_lamp_add_exec(bContext *C, wmOperator *op)
+{
+ Object *ob;
+ int type= RNA_enum_get(op->ptr, "type");
+
+ ob= object_add_type(C, OB_LAMP);
+ if(ob && ob->data)
+ ((Lamp*)ob->data)->type= type;
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_lamp_add(wmOperatorType *ot)
+{
+ static EnumPropertyItem lamp_type_items[] = {
+ {LA_LOCAL, "POINT", ICON_LAMP_POINT, "Point", "Omnidirectional point light source."},
+ {LA_SUN, "SUN", ICON_LAMP_SUN, "Sun", "Constant direction parallel ray light source."},
+ {LA_SPOT, "SPOT", ICON_LAMP_SPOT, "Spot", "Directional cone light source."},
+ {LA_HEMI, "HEMI", ICON_LAMP_HEMI, "Hemi", "180 degree constant light source."},
+ {LA_AREA, "AREA", ICON_LAMP_AREA, "Area", "Directional area light source."},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Add Lamp";
+ ot->description = "Add a lamp object to the scene.";
+ ot->idname= "OBJECT_OT_lamp_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_lamp_add_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", lamp_type_items, 0, "Type", "");
+}
+
+static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Add Object", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
+
+ uiItemMenuEnumO(layout, "Mesh", ICON_OUTLINER_OB_MESH, "OBJECT_OT_mesh_add", "type");
+ uiItemMenuEnumO(layout, "Curve", ICON_OUTLINER_OB_CURVE, "OBJECT_OT_curve_add", "type");
+ uiItemMenuEnumO(layout, "Surface", ICON_OUTLINER_OB_SURFACE, "OBJECT_OT_surface_add", "type");
+ uiItemMenuEnumO(layout, "Metaball", ICON_OUTLINER_OB_META, "OBJECT_OT_metaball_add", "type");
+ uiItemO(layout, "Text", ICON_OUTLINER_OB_FONT, "OBJECT_OT_text_add");
+ uiItemS(layout);
+ uiItemO(layout, "Armature", ICON_OUTLINER_OB_ARMATURE, "OBJECT_OT_armature_add");
+ uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_LATTICE, "OBJECT_OT_add", "type", OB_LATTICE);
+ uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_add", "type", OB_EMPTY);
+ uiItemS(layout);
+ uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_CAMERA, "OBJECT_OT_add", "type", OB_CAMERA);
+ uiItemMenuEnumO(layout, "Lamp", ICON_OUTLINER_OB_LAMP, "OBJECT_OT_lamp_add", "type");
+
+ uiPupMenuEnd(C, pup);
+
+ /* this operator is only for a menu, not used further */
+ return OPERATOR_CANCELLED;
+}
+
+/* only used as menu */
+void OBJECT_OT_primitive_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Primitive";
+ ot->description = "Add a primitive object.";
+ ot->idname= "OBJECT_OT_primitive_add";
+
+ /* api callbacks */
+ ot->invoke= object_primitive_add_invoke;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= 0;
+}
+
+/**************************** Delete Object *************************/
+
+/* remove base from a specific scene */
+/* note: now unlinks constraints as well */
+void ED_base_object_free_and_unlink(Scene *scene, Base *base)
+{
+ BLI_remlink(&scene->base, base);
+ free_libblock_us(&G.main->object, base->object);
+ if(scene->basact==base) scene->basact= NULL;
+ MEM_freeN(base);
+}
+
+static int object_delete_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ int islamp= 0;
+
+ if(CTX_data_edit_object(C))
+ return OPERATOR_CANCELLED;
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+
+ if(base->object->type==OB_LAMP) islamp= 1;
+
+ /* remove from current scene only */
+ ED_base_object_free_and_unlink(scene, base);
+ }
+ CTX_DATA_END;
+
+ if(islamp) reshadeall_displist(scene); /* only frees displist */
+
+ DAG_scene_sort(scene);
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_delete(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete";
+ ot->description = "Delete selected objects.";
+ ot->idname= "OBJECT_OT_delete";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= object_delete_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/**************************** Copy Utilities ******************************/
+
+static void copy_object__forwardModifierLinks(void *userData, Object *ob,
+ ID **idpoin)
+{
+ /* this is copied from ID_NEW; it might be better to have a macro */
+ if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
+}
+
+/* after copying objects, copied data should get new pointers */
+static void copy_object_set_idnew(bContext *C, int dupflag)
+{
+ Object *ob;
+ Material *ma, *mao;
+ ID *id;
+#if 0 // XXX old animation system
+ Ipo *ipo;
+ bActionStrip *strip;
+#endif // XXX old animation system
+ int a;
+
+ /* XXX check object pointers */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob= base->object;
+ relink_constraints(&ob->constraints);
+ if (ob->pose){
+ bPoseChannel *chan;
+ for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
+ relink_constraints(&chan->constraints);
+ }
+ }
+ modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
+ ID_NEW(ob->parent);
+ ID_NEW(ob->track);
+ ID_NEW(ob->proxy);
+ ID_NEW(ob->proxy_group);
+
+#if 0 // XXX old animation system
+ for(strip= ob->nlastrips.first; strip; strip= strip->next) {
+ bActionModifier *amod;
+ for(amod= strip->modifiers.first; amod; amod= amod->next)
+ ID_NEW(amod->ob);
+ }
+#endif // XXX old animation system
+ }
+ CTX_DATA_END;
+
+ /* materials */
+ if( dupflag & USER_DUP_MAT) {
+ mao= G.main->mat.first;
+ while(mao) {
+ if(mao->id.newid) {
+
+ ma= (Material *)mao->id.newid;
+
+ if(dupflag & USER_DUP_TEX) {
+ for(a=0; a<MAX_MTEX; a++) {
+ if(ma->mtex[a]) {
+ id= (ID *)ma->mtex[a]->tex;
+ if(id) {
+ ID_NEW_US(ma->mtex[a]->tex)
+ else ma->mtex[a]->tex= copy_texture(ma->mtex[a]->tex);
+ id->us--;
+ }
+ }
+ }
+ }
+#if 0 // XXX old animation system
+ id= (ID *)ma->ipo;
+ if(id) {
+ ID_NEW_US(ma->ipo)
+ else ma->ipo= copy_ipo(ma->ipo);
+ id->us--;
+ }
+#endif // XXX old animation system
+ }
+ mao= mao->id.next;
+ }
+ }
+
+#if 0 // XXX old animation system
+ /* lamps */
+ if( dupflag & USER_DUP_IPO) {
+ Lamp *la= G.main->lamp.first;
+ while(la) {
+ if(la->id.newid) {
+ Lamp *lan= (Lamp *)la->id.newid;
+ id= (ID *)lan->ipo;
+ if(id) {
+ ID_NEW_US(lan->ipo)
+ else lan->ipo= copy_ipo(lan->ipo);
+ id->us--;
+ }
+ }
+ la= la->id.next;
+ }
+ }
+
+ /* ipos */
+ ipo= G.main->ipo.first;
+ while(ipo) {
+ if(ipo->id.lib==NULL && ipo->id.newid) {
+ Ipo *ipon= (Ipo *)ipo->id.newid;
+ IpoCurve *icu;
+ for(icu= ipon->curve.first; icu; icu= icu->next) {
+ if(icu->driver) {
+ ID_NEW(icu->driver->ob);
+ }
+ }
+ }
+ ipo= ipo->id.next;
+ }
+#endif // XXX old animation system
+
+ set_sca_new_poins();
+
+ clear_id_newpoins();
+}
+
+/********************* Make Duplicates Real ************************/
+
+static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
+{
+ Base *basen;
+ Object *ob;
+ ListBase *lb;
+ DupliObject *dob;
+
+ if(!base && !(base = BASACT))
+ return;
+
+ if(!(base->object->transflag & OB_DUPLI))
+ return;
+
+ lb= object_duplilist(scene, base->object);
+
+ for(dob= lb->first; dob; dob= dob->next) {
+ ob= copy_object(dob->ob);
+ /* font duplis can have a totcol without material, we get them from parent
+ * should be implemented better...
+ */
+ if(ob->mat==NULL) ob->totcol= 0;
+
+ basen= MEM_dupallocN(base);
+ basen->flag &= ~OB_FROMDUPLI;
+ BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
+ basen->object= ob;
+ ob->ipo= NULL; /* make sure apply works */
+ ob->parent= ob->track= NULL;
+ ob->disp.first= ob->disp.last= NULL;
+ ob->transflag &= ~OB_DUPLI;
+
+ Mat4CpyMat4(ob->obmat, dob->mat);
+ ED_object_apply_obmat(ob);
+ }
+
+ copy_object_set_idnew(C, 0);
+
+ free_object_duplilist(lb);
+
+ base->object->transflag &= ~OB_DUPLI;
+}
+
+static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+
+ clear_id_newpoins();
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ make_object_duplilist_real(C, scene, base);
+ }
+ CTX_DATA_END;
+
+ DAG_scene_sort(scene);
+ ED_anim_dag_flush_update(C);
+ WM_event_add_notifier(C, NC_SCENE, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_duplicates_make_real(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Make Duplicates Real";
+ ot->description = "Make dupli objects attached to this object real.";
+ ot->idname= "OBJECT_OT_duplicates_make_real";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= object_duplicates_make_real_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/**************************** Convert **************************/
+
+static EnumPropertyItem convert_target_items[]= {
+ {OB_CURVE, "CURVE", 0, "Curve", ""},
+ {OB_MESH, "MESH", 0, "Mesh", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static void curvetomesh(Scene *scene, Object *ob)
+{
+ Curve *cu= ob->data;
+
+ if(cu->disp.first==0)
+ makeDispListCurveTypes(scene, ob, 0); /* force creation */
+
+ nurbs_to_mesh(ob); /* also does users */
+
+ if(ob->type == OB_MESH)
+ object_free_modifiers(ob);
+}
+
+static int convert_poll(bContext *C)
+{
+ Object *obact= CTX_data_active_object(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return (!scene->id.lib && obact && scene->obedit != obact && (obact->flag & SELECT));
+}
+
+static int convert_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Base *basen=NULL, *basact=NULL, *basedel=NULL;
+ Object *ob, *ob1, *obact= CTX_data_active_object(C);
+ DerivedMesh *dm;
+ Curve *cu;
+ Nurb *nu;
+ MetaBall *mb;
+ Mesh *me;
+ int target= RNA_enum_get(op->ptr, "target");
+ int keep_original= RNA_boolean_get(op->ptr, "keep_original");
+ int a;
+
+ /* don't forget multiple users! */
+
+ /* reset flags */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob= base->object;
+ ob->flag &= ~OB_DONE;
+ }
+ CTX_DATA_END;
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob= base->object;
+
+ if(ob->flag & OB_DONE)
+ continue;
+ else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
+ ob->flag |= OB_DONE;
+ basedel = base;
+
+ ob1= copy_object(ob);
+ ob1->recalc |= OB_RECALC;
+
+ basen= MEM_mallocN(sizeof(Base), "duplibase");
+ *basen= *base;
+ BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */
+ basen->object= ob1;
+ basen->flag |= SELECT;
+ base->flag &= ~SELECT;
+ ob->flag &= ~SELECT;
+
+ /* decrement original mesh's usage count */
+ me= ob1->data;
+ me->id.us--;
+
+ /* make a new copy of the mesh */
+ ob1->data= copy_mesh(me);
+
+ /* make new mesh data from the original copy */
+ dm= mesh_get_derived_final(scene, ob1, CD_MASK_MESH);
+ /* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
+
+ DM_to_mesh(dm, ob1->data);
+
+ dm->release(dm);
+ object_free_modifiers(ob1); /* after derivedmesh calls! */
+ }
+ else if(ob->type==OB_FONT) {
+ ob->flag |= OB_DONE;
+
+ ob->type= OB_CURVE;
+ cu= ob->data;
+
+ if(cu->vfont) {
+ cu->vfont->id.us--;
+ cu->vfont= 0;
+ }
+ if(cu->vfontb) {
+ cu->vfontb->id.us--;
+ cu->vfontb= 0;
+ }
+ if(cu->vfonti) {
+ cu->vfonti->id.us--;
+ cu->vfonti= 0;
+ }
+ if(cu->vfontbi) {
+ cu->vfontbi->id.us--;
+ cu->vfontbi= 0;
+ }
+ /* other users */
+ if(cu->id.us>1) {
+ for(ob1= G.main->object.first; ob1; ob1=ob1->id.next) {
+ if(ob1->data==cu) {
+ ob1->type= OB_CURVE;
+ ob1->recalc |= OB_RECALC;
+ }
+ }
+ }
+
+ for(nu=cu->nurb.first; nu; nu=nu->next)
+ nu->charidx= 0;
+
+ if(target == OB_MESH)
+ curvetomesh(scene, ob);
+ }
+ else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
+ ob->flag |= OB_DONE;
+
+ if(target == OB_MESH)
+ curvetomesh(scene, ob);
+ }
+ else if(ob->type==OB_MBALL) {
+ ob= find_basis_mball(scene, ob);
+
+ if(ob->disp.first && !(ob->flag & OB_DONE)) {
+ ob->flag |= OB_DONE;
+ basedel = base;
+
+ ob1= copy_object(ob);
+ ob1->recalc |= OB_RECALC;
+
+ basen= MEM_mallocN(sizeof(Base), "duplibase");
+ *basen= *base;
+ BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */
+ basen->object= ob1;
+ basen->flag |= SELECT;
+ basedel->flag &= ~SELECT;
+ ob->flag &= ~SELECT;
+
+ mb= ob1->data;
+ mb->id.us--;
+
+ ob1->data= add_mesh("Mesh");
+ ob1->type= OB_MESH;
+
+ me= ob1->data;
+ me->totcol= mb->totcol;
+ if(ob1->totcol) {
+ me->mat= MEM_dupallocN(mb->mat);
+ for(a=0; a<ob1->totcol; a++) id_us_plus((ID *)me->mat[a]);
+ }
+
+ mball_to_mesh(&ob->disp, ob1->data);
+
+ /* So we can see the wireframe */
+ BASACT= basen; // XXX hm
+ }
+ else
+ continue;
+ }
+ else
+ continue;
+
+ /* If the original object is active then make this object active */
+ if(basen) {
+ if(ob == obact) {
+ ED_base_object_activate(C, basen);
+ basact = basen;
+ }
+
+ basen= NULL;
+ }
+
+ /* delete original if needed */
+ if(basedel) {
+ if(!keep_original)
+ ED_base_object_free_and_unlink(scene, basedel);
+
+ basedel = NULL;
+ }
+ }
+ CTX_DATA_END;
+
+ /* delete object should renew depsgraph */
+ if(!keep_original)
+ DAG_scene_sort(scene);
+
+ /* texspace and normals */
+ if(!basen) BASACT= NULL; // XXX base;
+
+// XXX ED_object_enter_editmode(C, 0);
+// XXX exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
+ BASACT= basact;
+
+ DAG_scene_sort(scene);
+ WM_event_add_notifier(C, NC_SCENE, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+static int convert_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obact= CTX_data_active_object(C);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ char *title;
+
+ if(obact->type==OB_FONT) {
+ pup= uiPupMenuBegin(C, "Convert Font to", 0);
+ layout= uiPupMenuLayout(pup);
+
+ uiItemEnumO(layout, "Curve", 0, op->type->idname, "target", OB_CURVE);
+ }
+ else {
+ if(obact->type == OB_MBALL)
+ title= "Convert Metaball to";
+ else if(obact->type == OB_CURVE)
+ title= "Convert Curve to";
+ else if(obact->type == OB_SURF)
+ title= "Convert Nurbs Surface to";
+ else if(obact->type == OB_MESH)
+ title= "Convert Modifiers to";
+ else
+ return OPERATOR_CANCELLED;
+
+ pup= uiPupMenuBegin(C, title, 0);
+ layout= uiPupMenuLayout(pup);
+ }
+
+ uiItemBooleanO(layout, "Mesh (keep original)", 0, op->type->idname, "keep_original", 1);
+ uiItemBooleanO(layout, "Mesh (delete original)", 0, op->type->idname, "keep_original", 0);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_convert(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Convert";
+ ot->description = "Convert selected objects to another type.";
+ ot->idname= "OBJECT_OT_convert";
+
+ /* api callbacks */
+ ot->invoke= convert_invoke;
+ ot->exec= convert_exec;
+ ot->poll= convert_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "target", convert_target_items, OB_MESH, "Target", "Type of object to convert to.");
+ RNA_def_boolean(ot->srna, "keep_original", 0, "Keep Original", "Keep original objects instead of replacing them.");
+}
+
+/**************************** Duplicate ************************/
+
+/*
+ dupflag: a flag made from constants declared in DNA_userdef_types.h
+ The flag tells adduplicate() weather to copy data linked to the object, or to reference the existing data.
+ U.dupflag for default operations or you can construct a flag as python does
+ if the dupflag is 0 then no data will be copied (linked duplicate) */
+
+/* used below, assumes id.new is correct */
+/* leaves selection of base/object unaltered */
+static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag)
+{
+ Base *basen= NULL;
+ Material ***matarar;
+ Object *ob, *obn;
+ ID *id;
+ int a, didit;
+
+ ob= base->object;
+ if(ob->mode & OB_MODE_POSE) {
+ ; /* nothing? */
+ }
+ else {
+ obn= copy_object(ob);
+ obn->recalc |= OB_RECALC;
+
+ basen= MEM_mallocN(sizeof(Base), "duplibase");
+ *basen= *base;
+ BLI_addhead(&scene->base, basen); /* addhead: prevent eternal loop */
+ basen->object= obn;
+
+ if(basen->flag & OB_FROMGROUP) {
+ Group *group;
+ for(group= G.main->group.first; group; group= group->id.next) {
+ if(object_in_group(ob, group))
+ add_to_group(group, obn);
+ }
+ obn->flag |= OB_FROMGROUP; /* this flag is unset with copy_object() */
+ }
+
+ /* duplicates using userflags */
+#if 0 // XXX old animation system
+ if(dupflag & USER_DUP_IPO) {
+ bConstraintChannel *chan;
+ id= (ID *)obn->ipo;
+
+ if(id) {
+ ID_NEW_US( obn->ipo)
+ else obn->ipo= copy_ipo(obn->ipo);
+ id->us--;
+ }
+ /* Handle constraint ipos */
+ for (chan=obn->constraintChannels.first; chan; chan=chan->next){
+ id= (ID *)chan->ipo;
+ if(id) {
+ ID_NEW_US( chan->ipo)
+ else chan->ipo= copy_ipo(chan->ipo);
+ id->us--;
+ }
+ }
+ }
+ 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_MAT) {
+ for(a=0; a<obn->totcol; a++) {
+ id= (ID *)obn->mat[a];
+ if(id) {
+ ID_NEW_US(obn->mat[a])
+ else obn->mat[a]= copy_material(obn->mat[a]);
+ id->us--;
+ }
+ }
+ }
+ if(dupflag & USER_DUP_PSYS) {
+ ParticleSystem *psys;
+ for(psys=obn->particlesystem.first; psys; psys=psys->next) {
+ id= (ID*) psys->part;
+ if(id) {
+ ID_NEW_US(psys->part)
+ else psys->part= psys_copy_settings(psys->part);
+ id->us--;
+ }
+ }
+ }
+
+ id= obn->data;
+ didit= 0;
+
+ switch(obn->type) {
+ case OB_MESH:
+ if(dupflag & USER_DUP_MESH) {
+ ID_NEW_US2( obn->data )
+ else {
+ obn->data= copy_mesh(obn->data);
+
+ if(obn->fluidsimSettings) {
+ obn->fluidsimSettings->orgMesh = (Mesh *)obn->data;
+ }
+
+ didit= 1;
+ }
+ id->us--;
+ }
+ break;
+ case OB_CURVE:
+ if(dupflag & USER_DUP_CURVE) {
+ ID_NEW_US2(obn->data )
+ else {
+ obn->data= copy_curve(obn->data);
+ didit= 1;
+ }
+ id->us--;
+ }
+ break;
+ case OB_SURF:
+ if(dupflag & USER_DUP_SURF) {
+ ID_NEW_US2( obn->data )
+ else {
+ obn->data= copy_curve(obn->data);
+ didit= 1;
+ }
+ id->us--;
+ }
+ break;
+ case OB_FONT:
+ if(dupflag & USER_DUP_FONT) {
+ ID_NEW_US2( obn->data )
+ else {
+ obn->data= copy_curve(obn->data);
+ didit= 1;
+ }
+ id->us--;
+ }
+ break;
+ case OB_MBALL:
+ if(dupflag & USER_DUP_MBALL) {
+ ID_NEW_US2(obn->data )
+ else {
+ obn->data= copy_mball(obn->data);
+ didit= 1;
+ }
+ id->us--;
+ }
+ break;
+ case OB_LAMP:
+ if(dupflag & USER_DUP_LAMP) {
+ ID_NEW_US2(obn->data )
+ else obn->data= copy_lamp(obn->data);
+ id->us--;
+ }
+ break;
+
+ case OB_ARMATURE:
+ obn->recalc |= OB_RECALC_DATA;
+ if(obn->pose) obn->pose->flag |= POSE_RECALC;
+
+ if(dupflag & USER_DUP_ARM) {
+ ID_NEW_US2(obn->data )
+ else {
+ obn->data= copy_armature(obn->data);
+ armature_rebuild_pose(obn, obn->data);
+ didit= 1;
+ }
+ id->us--;
+ }
+
+ break;
+
+ case OB_LATTICE:
+ if(dupflag!=0) {
+ ID_NEW_US2(obn->data )
+ else obn->data= copy_lattice(obn->data);
+ id->us--;
+ }
+ break;
+ case OB_CAMERA:
+ if(dupflag!=0) {
+ ID_NEW_US2(obn->data )
+ else obn->data= copy_camera(obn->data);
+ 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--;
+ }
+ }
+ }
+ }
+ }
+ return basen;
+}
+
+/* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */
+/* leaves selection of base/object unaltered */
+Base *ED_object_add_duplicate(Scene *scene, Base *base, int dupflag)
+{
+ Base *basen;
+
+ clear_id_newpoins();
+ clear_sca_new_poins(); /* sensor/contr/act */
+
+ basen= object_add_duplicate_internal(scene, base, dupflag);
+
+ DAG_scene_sort(scene);
+
+ return basen;
+}
+
+/* contextual operator dupli */
+static int duplicate_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ int linked= RNA_boolean_get(op->ptr, "linked");
+ int dupflag= (linked)? 0: U.dupflag;
+
+ clear_id_newpoins();
+ clear_sca_new_poins(); /* sensor/contr/act */
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ Base *basen= object_add_duplicate_internal(scene, base, dupflag);
+
+ /* note that this is safe to do with this context iterator,
+ the list is made in advance */
+ ED_base_object_select(base, BA_DESELECT);
+
+ /* new object becomes active */
+ if(BASACT==base)
+ ED_base_object_activate(C, basen);
+
+ }
+ CTX_DATA_END;
+
+ copy_object_set_idnew(C, dupflag);
+
+ DAG_scene_sort(scene);
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_duplicate(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Duplicate";
+ ot->description = "Duplicate selected objects.";
+ ot->idname= "OBJECT_OT_duplicate";
+
+ /* api callbacks */
+ ot->exec= duplicate_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_boolean(ot->srna, "linked", 0, "Linked", "Duplicate object but not object data, linking to the original data.");
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
+/**************************** Join *************************/
+
+static int join_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+
+ if(scene->obedit) {
+ BKE_report(op->reports, RPT_ERROR, "This data does not support joining in editmode.");
+ return OPERATOR_CANCELLED;
+ }
+ else if(!ob) {
+ BKE_report(op->reports, RPT_ERROR, "Can't join unless there is an active object.");
+ return OPERATOR_CANCELLED;
+ }
+ else if(object_data_is_libdata(ob)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't edit external libdata.");
+ return OPERATOR_CANCELLED;
+ }
+
+ if(ob->type == OB_MESH)
+ return join_mesh_exec(C, op);
+ else if(ELEM(ob->type, OB_CURVE, OB_SURF))
+ return join_curve_exec(C, op);
+ else if(ob->type == OB_ARMATURE)
+ return join_armature_exec(C, op);
+
+ BKE_report(op->reports, RPT_ERROR, "This object type doesn't support joining.");
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_join(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Join";
+ ot->description = "Join selected objects into active object.";
+ ot->idname= "OBJECT_OT_join";
+
+ /* api callbacks */
+ ot->exec= join_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
new file mode 100644
index 00000000000..8c0da354938
--- /dev/null
+++ b/source/blender/editors/object/object_constraint.c
@@ -0,0 +1,1450 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Joshua Leung, Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_dynstr.h"
+
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_text_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_constraint.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+#include "BIK_api.h"
+
+#ifndef DISABLE_PYTHON
+#include "BPY_extern.h"
+#endif
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+#include "RNA_types.h"
+
+#include "ED_object.h"
+#include "ED_screen.h"
+
+#include "UI_interface.h"
+
+#include "object_intern.h"
+
+/* -------------- Get Active Constraint Data ---------------------- */
+
+/* if object in posemode, active bone constraints, else object constraints */
+ListBase *get_active_constraints (Object *ob)
+{
+ if (ob == NULL)
+ return NULL;
+
+ if (ob->mode & OB_MODE_POSE) {
+ bPoseChannel *pchan;
+
+ pchan = get_active_posechannel(ob);
+ if (pchan)
+ return &pchan->constraints;
+ }
+ else
+ return &ob->constraints;
+
+ return NULL;
+}
+
+/* single constraint */
+bConstraint *get_active_constraint (Object *ob)
+{
+ ListBase *lb= get_active_constraints(ob);
+
+ if (lb) {
+ bConstraint *con;
+
+ for (con= lb->first; con; con=con->next) {
+ if (con->flag & CONSTRAINT_ACTIVE)
+ return con;
+ }
+ }
+
+ return NULL;
+}
+/* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */
+/* ------------- PyConstraints ------------------ */
+
+/* this callback sets the text-file to be used for selected menu item */
+void validate_pyconstraint_cb (void *arg1, void *arg2)
+{
+ bPythonConstraint *data = arg1;
+ Text *text= NULL;
+ int index = *((int *)arg2);
+ int i;
+
+ /* exception for no script */
+ if (index) {
+ /* innovative use of a for...loop to search */
+ for (text=G.main->text.first, i=1; text && index!=i; i++, text=text->id.next);
+ }
+ data->text = text;
+}
+
+#ifndef DISABLE_PYTHON
+/* this returns a string for the list of usable pyconstraint script names */
+char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
+{
+ DynStr *pupds= BLI_dynstr_new();
+ Text *text;
+ char *str;
+ char buf[64];
+ int i;
+
+ /* add title first */
+ sprintf(buf, "Scripts: %%t|[None]%%x0|");
+ BLI_dynstr_append(pupds, buf);
+
+ /* init active-index first */
+ if (con_text == NULL)
+ *pyconindex= 0;
+
+ /* loop through markers, adding them */
+ for (text=G.main->text.first, i=1; text; i++, text=text->id.next) {
+ /* this is important to ensure that right script is shown as active */
+ if (text == con_text) *pyconindex = i;
+
+ /* only include valid pyconstraint scripts */
+ if (BPY_is_pyconstraint(text)) {
+ BLI_dynstr_append(pupds, text->id.name+2);
+
+ sprintf(buf, "%%x%d", i);
+ BLI_dynstr_append(pupds, buf);
+
+ if (text->id.next)
+ BLI_dynstr_append(pupds, "|");
+ }
+ }
+
+ /* convert to normal MEM_malloc'd string */
+ str= BLI_dynstr_get_cstring(pupds);
+ BLI_dynstr_free(pupds);
+
+ return str;
+}
+#endif /* DISABLE_PYTHON */
+
+/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
+void update_pyconstraint_cb (void *arg1, void *arg2)
+{
+ Object *owner= (Object *)arg1;
+ bConstraint *con= (bConstraint *)arg2;
+#ifndef DISABLE_PYTHON
+ if (owner && con)
+ BPY_pyconstraint_update(owner, con);
+#endif
+}
+
+/* Creates a new constraint, initialises its data, and returns it */
+bConstraint *add_new_constraint (short type)
+{
+ bConstraint *con;
+ bConstraintTypeInfo *cti;
+
+ con = MEM_callocN(sizeof(bConstraint), "Constraint");
+
+ /* Set up a generic constraint datablock */
+ con->type = type;
+ con->flag |= CONSTRAINT_EXPAND;
+ con->enforce = 1.0f;
+
+ /* Load the data for it */
+ cti = constraint_get_typeinfo(con);
+ if (cti) {
+ con->data = MEM_callocN(cti->size, cti->structName);
+
+ /* only constraints that change any settings need this */
+ if (cti->new_data)
+ cti->new_data(con->data);
+
+ /* set the name based on the type of constraint */
+ strcpy(con->name, cti->name);
+ }
+ else
+ strcpy(con->name, "Const");
+
+ return con;
+}
+
+/* Adds the given constraint to the Object-level set of constraints for the given Object */
+void add_constraint_to_object (bConstraint *con, Object *ob)
+{
+ ListBase *list;
+ list = &ob->constraints;
+
+ if (list) {
+ unique_constraint_name(con, list);
+ BLI_addtail(list, con);
+
+ if (proxylocked_constraints_owner(ob, NULL))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
+
+ con->flag |= CONSTRAINT_ACTIVE;
+ for (con= con->prev; con; con= con->prev)
+ con->flag &= ~CONSTRAINT_ACTIVE;
+ }
+}
+
+/* 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)
+{
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+ int num_targets, i;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+ num_targets= BLI_countlist(&targets);
+
+ if (index < 0) {
+ if (abs(index) < num_targets)
+ index= num_targets - abs(index);
+ else
+ index= num_targets - 1;
+ }
+ else if (index >= num_targets) {
+ index= num_targets - 1;
+ }
+
+ for (ct=targets.first, i=0; ct; ct= ct->next, i++) {
+ if (i == index) {
+ ct->tar= target;
+ strcpy(ct->subtarget, subtarget);
+ break;
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+}
+
+/* ------------- Constraint Sanity Testing ------------------- */
+
+/* checks validity of object pointers, and NULLs,
+ * if Bone doesnt exist it sets the CONSTRAINT_DISABLE flag
+ */
+static void test_constraints (Object *owner, const char substring[])
+{
+ bConstraint *curcon;
+ ListBase *conlist= NULL;
+ int type;
+
+ if (owner==NULL) return;
+
+ /* Check parents */
+ if (strlen(substring)) {
+ switch (owner->type) {
+ case OB_ARMATURE:
+ type = CONSTRAINT_OBTYPE_BONE;
+ break;
+ default:
+ type = CONSTRAINT_OBTYPE_OBJECT;
+ break;
+ }
+ }
+ else
+ type = CONSTRAINT_OBTYPE_OBJECT;
+
+ /* Get the constraint list for this object */
+ switch (type) {
+ case CONSTRAINT_OBTYPE_OBJECT:
+ conlist = &owner->constraints;
+ break;
+ case CONSTRAINT_OBTYPE_BONE:
+ {
+ Bone *bone;
+ bPoseChannel *chan;
+
+ bone = get_named_bone( ((bArmature *)owner->data), substring );
+ chan = get_pose_channel(owner->pose, substring);
+ if (bone && chan) {
+ conlist = &chan->constraints;
+ }
+ }
+ break;
+ }
+
+ /* Check all constraints - is constraint valid? */
+ if (conlist) {
+ for (curcon = conlist->first; curcon; curcon=curcon->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ /* clear disabled-flag first */
+ curcon->flag &= ~CONSTRAINT_DISABLE;
+
+ if (curcon->type == CONSTRAINT_TYPE_KINEMATIC) {
+ bKinematicConstraint *data = curcon->data;
+
+ /* bad: we need a separate set of checks here as poletarget is
+ * optional... otherwise poletarget must exist too or else
+ * the constraint is deemed invalid
+ */
+ /* default IK check ... */
+ if (exist_object(data->tar) == 0) {
+ data->tar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (data->tar == owner) {
+ if (!get_named_bone(get_armature(owner), data->subtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+
+ if (data->poletar) {
+ if (exist_object(data->poletar) == 0) {
+ data->poletar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (data->poletar == owner) {
+ if (!get_named_bone(get_armature(owner), data->polesubtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+ }
+ /* ... can be overwritten here */
+ BIK_test_constraint(owner, curcon);
+ /* targets have already been checked for this */
+ continue;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_ACTION) {
+ bActionConstraint *data = curcon->data;
+
+ /* validate action */
+ if (data->act == NULL)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_FOLLOWPATH) {
+ bFollowPathConstraint *data = curcon->data;
+
+ /* don't allow track/up axes to be the same */
+ if (data->upflag==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->upflag+3==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_TRACKTO) {
+ bTrackToConstraint *data = curcon->data;
+
+ /* don't allow track/up axes to be the same */
+ if (data->reserved2==data->reserved1)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->reserved2+3==data->reserved1)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (curcon->type == CONSTRAINT_TYPE_LOCKTRACK) {
+ bLockTrackConstraint *data = curcon->data;
+
+ if (data->lockflag==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ if (data->lockflag+3==data->trackflag)
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+
+ /* Check targets for constraints */
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(curcon, &targets);
+
+ /* disable and clear constraints targets that are incorrect */
+ for (ct= targets.first; ct; ct= ct->next) {
+ /* general validity checks (for those constraints that need this) */
+ if (exist_object(ct->tar) == 0) {
+ ct->tar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (ct->tar == owner) {
+ if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+
+ /* target checks for specific constraints */
+ if (ELEM(curcon->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO)) {
+ if (ct->tar) {
+ if (ct->tar->type != OB_CURVE) {
+ ct->tar= NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else {
+ Curve *cu= ct->tar->data;
+
+ /* auto-set 'Path' setting on curve so this works */
+ cu->flag |= CU_PATH;
+ }
+ }
+ }
+ }
+
+ /* free any temporary targets */
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(curcon, &targets, 0);
+ }
+ }
+ }
+}
+
+static void test_bonelist_constraints (Object *owner, ListBase *list)
+{
+ Bone *bone;
+
+ for (bone = list->first; bone; bone = bone->next) {
+ test_constraints(owner, bone->name);
+ test_bonelist_constraints(owner, &bone->childbase);
+ }
+}
+
+void object_test_constraints (Object *owner)
+{
+ test_constraints(owner, "");
+
+ if (owner->type==OB_ARMATURE) {
+ bArmature *arm= get_armature(owner);
+
+ if (arm)
+ test_bonelist_constraints(owner, &arm->bonebase);
+ }
+}
+
+/* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */
+
+/* ---------- Distance-Dependent Constraints ---------- */
+/* StretchTo, Limit Distance */
+
+static int stretchto_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint);
+ return (ptr.id.data && ptr.data);
+}
+
+static int stretchto_reset_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint);
+
+ /* just set original length to 0.0, which will cause a reset on next recalc */
+ RNA_float_set(&ptr, "original_length", 0.0f);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
+ return OPERATOR_FINISHED;
+}
+
+void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reset Original Length";
+ ot->idname= "CONSTRAINT_OT_stretchto_reset";
+ ot->description= "Reset original length of bone for Stretch To Constraint.";
+
+ ot->exec= stretchto_reset_exec;
+ ot->poll= stretchto_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+static int limitdistance_reset_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint);
+
+ /* just set distance to 0.0, which will cause a reset on next recalc */
+ RNA_float_set(&ptr, "distance", 0.0f);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
+ return OPERATOR_FINISHED;
+}
+
+static int limitdistance_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint);
+ return (ptr.id.data && ptr.data);
+}
+
+void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reset Distance";
+ ot->idname= "CONSTRAINT_OT_limitdistance_reset";
+ ot->description= "Reset limiting distance for Limit Distance Constraint.";
+
+ ot->exec= limitdistance_reset_exec;
+ ot->poll= limitdistance_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ------------- Child-Of Constraint ------------------ */
+
+static int childof_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint);
+ return (ptr.id.data && ptr.data);
+}
+
+/* ChildOf Constraint - set inverse callback */
+static int childof_set_inverse_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= ptr.id.data;
+ bConstraint *con= ptr.data;
+ bChildOfConstraint *data= (bChildOfConstraint *)con->data;
+ bPoseChannel *pchan= NULL;
+
+ /* try to find a pose channel */
+ // TODO: get from context instead?
+ if (ob && ob->pose)
+ pchan= get_active_posechannel(ob);
+
+ /* calculate/set inverse matrix */
+ if (pchan) {
+ float pmat[4][4], cinf;
+ float imat[4][4], tmat[4][4];
+
+ /* make copy of pchan's original pose-mat (for use later) */
+ Mat4CpyMat4(pmat, pchan->pose_mat);
+
+ /* disable constraint for pose to be solved without it */
+ cinf= con->enforce;
+ con->enforce= 0.0f;
+
+ /* solve pose without constraint */
+ where_is_pose(scene, ob);
+
+ /* determine effect of constraint by removing the newly calculated
+ * pchan->pose_mat from the original pchan->pose_mat, thus determining
+ * the effect of the constraint
+ */
+ Mat4Invert(imat, pchan->pose_mat);
+ Mat4MulMat4(tmat, imat, pmat);
+ Mat4Invert(data->invmat, tmat);
+
+ /* recalculate pose with new inv-mat */
+ con->enforce= cinf;
+ where_is_pose(scene, ob);
+ }
+ else if (ob) {
+ Object workob;
+ /* use what_does_parent to find inverse - just like for normal parenting.
+ * NOTE: what_does_parent uses a static workob defined in object.c
+ */
+ what_does_parent(scene, ob, &workob);
+ Mat4Invert(data->invmat, workob.obmat);
+ }
+ else
+ Mat4One(data->invmat);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Inverse";
+ ot->idname= "CONSTRAINT_OT_childof_set_inverse";
+ ot->description= "Set inverse correction for ChildOf constraint.";
+
+ ot->exec= childof_set_inverse_exec;
+ ot->poll= childof_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ChildOf Constraint - clear inverse callback */
+static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_ChildOfConstraint);
+ Object *ob= ptr.id.data;
+ bConstraint *con= ptr.data;
+ bChildOfConstraint *data= (bChildOfConstraint *)con->data;
+
+ /* simply clear the matrix */
+ Mat4One(data->invmat);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSTRAINT_OT_childof_clear_inverse (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Inverse";
+ ot->idname= "CONSTRAINT_OT_childof_clear_inverse";
+ ot->description= "Clear inverse correction for ChildOf constraint.";
+
+ ot->exec= childof_clear_inverse_exec;
+ ot->poll= childof_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/***************************** BUTTONS ****************************/
+
+/* Rename the given constraint, con already has the new name */
+void ED_object_constraint_rename(Object *ob, bConstraint *con, char *oldname)
+{
+ bConstraint *tcon;
+ ListBase *conlist= NULL;
+ int from_object= 0;
+
+ /* get context by searching for con (primitive...) */
+ for (tcon= ob->constraints.first; tcon; tcon= tcon->next) {
+ if (tcon==con)
+ break;
+ }
+
+ if (tcon) {
+ conlist= &ob->constraints;
+ from_object= 1;
+ }
+ else if (ob->pose) {
+ bPoseChannel *pchan;
+
+ for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (tcon= pchan->constraints.first; tcon; tcon= tcon->next) {
+ if (tcon==con)
+ break;
+ }
+ if (tcon)
+ break;
+ }
+
+ if (tcon) {
+ conlist= &pchan->constraints;
+ }
+ }
+
+ if (conlist==NULL) {
+ printf("rename constraint failed\n"); /* should not happen in UI */
+ return;
+ }
+
+ /* first make sure it's a unique name within context */
+ unique_constraint_name(con, conlist);
+}
+
+
+
+
+void ED_object_constraint_set_active(Object *ob, bConstraint *con)
+{
+ ListBase *lb;
+ bConstraint *origcon= con;
+
+ /* lets be nice and escape if its active already */
+ if(con && (con->flag & CONSTRAINT_ACTIVE))
+ return ;
+
+ lb= get_active_constraints(ob);
+ if(lb == NULL)
+ return;
+
+ for(con= lb->first; con; con= con->next) {
+ if(con==origcon) con->flag |= CONSTRAINT_ACTIVE;
+ else con->flag &= ~CONSTRAINT_ACTIVE;
+ }
+}
+
+void ED_object_constraint_update(Object *ob)
+{
+
+ if(ob->pose) update_pose_constraint_flags(ob->pose);
+
+ 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);
+}
+
+void ED_object_constraint_dependency_update(Scene *scene, Object *ob)
+{
+ ED_object_constraint_update(ob);
+
+ if(ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
+ DAG_scene_sort(scene);
+}
+
+static int constraint_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
+ return (ptr.id.data && ptr.data);
+}
+
+static int constraint_delete_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
+ Object *ob= ptr.id.data;
+ bConstraint *con= ptr.data;
+ ListBase *lb;
+
+ /* remove constraint itself */
+ lb= get_active_constraints(ob);
+ if (BLI_findindex(lb, con) == -1)
+ /* abnormal situation which happens on bone constraint when the armature is not in pose mode */
+ return OPERATOR_CANCELLED;
+
+ free_constraint_data(con);
+ BLI_freelinkN(lb, con);
+
+ ED_object_constraint_set_active(ob, NULL);
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSTRAINT_OT_delete (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Constraint";
+ ot->idname= "CONSTRAINT_OT_delete";
+ ot->description= "Remove constraitn from constraint stack.";
+
+ /* callbacks */
+ ot->exec= constraint_delete_exec;
+ ot->poll= constraint_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int constraint_move_down_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
+ Object *ob= ptr.id.data;
+ bConstraint *con= ptr.data;
+
+ if (con->next) {
+ ListBase *conlist= get_active_constraints(ob);
+ bConstraint *nextCon= con->next;
+
+ /* insert the nominated constraint after the one that used to be after it */
+ BLI_remlink(conlist, con);
+ BLI_insertlinkafter(conlist, nextCon, con);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void CONSTRAINT_OT_move_down (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move Constraint Down";
+ ot->idname= "CONSTRAINT_OT_move_down";
+ ot->description= "Move constraint down constraint stack.";
+
+ /* callbacks */
+ ot->exec= constraint_move_down_exec;
+ ot->poll= constraint_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+static int constraint_move_up_exec (bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
+ Object *ob= ptr.id.data;
+ bConstraint *con= ptr.data;
+
+ if (con->prev) {
+ ListBase *conlist= get_active_constraints(ob);
+ bConstraint *prevCon= con->prev;
+
+ /* insert the nominated constraint before the one that used to be before it */
+ BLI_remlink(conlist, con);
+ BLI_insertlinkbefore(conlist, prevCon, con);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void CONSTRAINT_OT_move_up (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move Constraint Up";
+ ot->idname= "CONSTRAINT_OT_move_up";
+ ot->description= "Move constraint up constraint stack.";
+
+ /* callbacks */
+ ot->exec= constraint_move_up_exec;
+ ot->poll= constraint_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/***************************** OPERATORS ****************************/
+
+/************************ remove constraint operators *********************/
+
+static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ Scene *scene= CTX_data_scene(C);
+
+ /* free constraints for all selected bones */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ free_constraints(&pchan->constraints);
+ pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_CONST);
+ }
+ CTX_DATA_END;
+
+ /* force depsgraph to get recalculated since relationships removed */
+ DAG_scene_sort(scene); /* sort order of objects */
+
+ /* do updates */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_constraints_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Clear Constraints";
+ ot->idname= "POSE_OT_constraints_clear";
+ ot->description= "Clear all the constraints for the selected bones.";
+
+ /* callbacks */
+ ot->exec= pose_constraints_clear_exec;
+ ot->poll= ED_operator_posemode; // XXX - do we want to ensure there are selected bones too?
+}
+
+
+static int object_constraints_clear_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ Scene *scene= CTX_data_scene(C);
+
+ /* do freeing */
+ // TODO: we should free constraints for all selected objects instead (to be more consistent with bones)
+ free_constraints(&ob->constraints);
+
+ /* force depsgraph to get recalculated since relationships removed */
+ DAG_scene_sort(scene); /* sort order of objects */
+
+ /* do updates */
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_constraints_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Clear Constraints";
+ ot->idname= "OBJECT_OT_constraints_clear";
+ ot->description= "Clear all the constraints for the active Object only.";
+
+ /* callbacks */
+ ot->exec= object_constraints_clear_exec;
+ ot->poll= ED_operator_object_active;
+}
+
+/************************ add constraint operators *********************/
+
+/* get the Object and/or PoseChannel to use as target */
+static short get_new_constraint_target(bContext *C, int con_type, Object **tar_ob, bPoseChannel **tar_pchan, short add)
+{
+ Object *obact= CTX_data_active_object(C);
+ bPoseChannel *pchanact= get_active_posechannel(obact);
+ short only_curve= 0, only_mesh= 0, only_ob= 0;
+ short found= 0;
+
+ /* clear tar_ob and tar_pchan fields before use
+ * - assume for now that both always exist...
+ */
+ *tar_ob= NULL;
+ *tar_pchan= NULL;
+
+ /* check if constraint type doesn't requires a target
+ * - if so, no need to get any targets
+ */
+ switch (con_type) {
+ /* no-target constraints --------------------------- */
+ /* null constraint - shouldn't even be added! */
+ case CONSTRAINT_TYPE_NULL:
+ /* limit constraints - no targets needed */
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ case CONSTRAINT_TYPE_ROTLIMIT:
+ case CONSTRAINT_TYPE_SIZELIMIT:
+ return 0;
+
+ /* restricted target-type constraints -------------- */
+ /* NOTE: for these, we cannot try to add a target object if no valid ones are found, since that doesn't work */
+ /* curve-based constraints - set the only_curve and only_ob flags */
+ case CONSTRAINT_TYPE_CLAMPTO:
+ case CONSTRAINT_TYPE_FOLLOWPATH:
+ only_curve= 1;
+ only_ob= 1;
+ add= 0;
+ break;
+
+ /* mesh only? */
+ case CONSTRAINT_TYPE_SHRINKWRAP:
+ only_mesh= 1;
+ only_ob= 1;
+ add= 0;
+ break;
+
+ /* object only - add here is ok? */
+ case CONSTRAINT_TYPE_RIGIDBODYJOINT:
+ only_ob= 1;
+ break;
+ }
+
+ /* if the active Object is Armature, and we can search for bones, do so... */
+ if ((obact->type == OB_ARMATURE) && (only_ob == 0)) {
+ /* search in list of selected Pose-Channels for target */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ /* just use the first one that we encounter, as long as it is not the active one */
+ if (pchan != pchanact) {
+ *tar_ob= obact;
+ *tar_pchan= pchan;
+ found= 1;
+
+ break;
+ }
+ }
+ CTX_DATA_END;
+ }
+
+ /* if not yet found, try selected Objects... */
+ if (found == 0) {
+ /* search in selected objects context */
+ CTX_DATA_BEGIN(C, Object*, ob, selected_objects)
+ {
+ /* just use the first object we encounter (that isn't the active object)
+ * and which fulfills the criteria for the object-target that we've got
+ */
+ if ( (ob != obact) &&
+ ((!only_curve) || (ob->type == OB_CURVE)) &&
+ ((!only_mesh) || (ob->type == OB_MESH)) )
+ {
+ /* set target */
+ *tar_ob= ob;
+ found= 1;
+
+ /* perform some special operations on the target */
+ if (only_curve) {
+ /* Curve-Path option must be enabled for follow-path constraints to be able to work */
+ Curve *cu= (Curve *)ob->data;
+ cu->flag |= CU_PATH;
+ }
+
+ break;
+ }
+ }
+ CTX_DATA_END;
+ }
+
+ /* if still not found, add a new empty to act as a target (if allowed) */
+ if ((found == 0) && (add)) {
+ Scene *scene= CTX_data_scene(C);
+ Base *base= BASACT, *newbase=NULL;
+ Object *obt;
+
+ /* add new target object */
+ obt= add_object(scene, OB_EMPTY);
+
+ /* set layers OK */
+ newbase= BASACT;
+ newbase->lay= base->lay;
+ obt->lay= newbase->lay;
+
+ /* transform cent to global coords for loc */
+ if (pchanact) {
+ /* since by default, IK targets the tip of the last bone, use the tip of the active PoseChannel
+ * if adding a target for an IK Constraint
+ */
+ if (con_type == CONSTRAINT_TYPE_KINEMATIC)
+ VecMat4MulVecfl(obt->loc, obact->obmat, pchanact->pose_tail);
+ else
+ VecMat4MulVecfl(obt->loc, obact->obmat, pchanact->pose_head);
+ }
+ else
+ VECCOPY(obt->loc, obact->obmat[3]);
+
+ /* restore, add_object sets active */
+ BASACT= base;
+ base->flag |= SELECT;
+
+ /* make our new target the new object */
+ *tar_ob= obt;
+ found= 1;
+ }
+
+ /* return whether there's any target */
+ return found;
+}
+
+/* used by add constraint operators to add the constraint required */
+static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase *list, int type, short setTarget)
+{
+ Scene *scene= CTX_data_scene(C);
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ bConstraint *con;
+
+ /* check if constraint to be added is valid for the given constraints stack */
+ if (type == CONSTRAINT_TYPE_NULL) {
+ return OPERATOR_CANCELLED;
+ }
+ if ( (type == CONSTRAINT_TYPE_RIGIDBODYJOINT) && (list != &ob->constraints) ) {
+ BKE_report(op->reports, RPT_ERROR, "Rigid Body Joint Constraint can only be added to Objects.");
+ return OPERATOR_CANCELLED;
+ }
+ if ( (type == CONSTRAINT_TYPE_KINEMATIC) && ((!pchan) || (list != &pchan->constraints)) ) {
+ BKE_report(op->reports, RPT_ERROR, "IK Constraint can only be added to Bones.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* create a new constraint of the type requried, and add it to the active/given constraints list */
+ con = add_new_constraint(type);
+
+ if (list) {
+ bConstraint *coniter;
+
+ /* add new constraint to end of list of constraints before ensuring that it has a unique name
+ * (otherwise unique-naming code will fail, since it assumes element exists in list)
+ */
+ BLI_addtail(list, con);
+ unique_constraint_name(con, list);
+
+ /* if the target list is a list on some PoseChannel belonging to a proxy-protected
+ * Armature layer, we must tag newly added constraints with a flag which allows them
+ * to persist after proxy syncing has been done
+ */
+ if (proxylocked_constraints_owner(ob, pchan))
+ con->flag |= CONSTRAINT_PROXY_LOCAL;
+
+ /* make this constraint the active one
+ * - since constraint was added at end of stack, we can just go
+ * through deactivating all previous ones
+ */
+ con->flag |= CONSTRAINT_ACTIVE;
+ for (coniter= con->prev; coniter; coniter= coniter->prev)
+ coniter->flag &= ~CONSTRAINT_ACTIVE;
+ }
+
+ /* get the first selected object/bone, and make that the target
+ * - apart from the buttons-window add buttons, we shouldn't add in this way
+ */
+ if (setTarget) {
+ Object *tar_ob= NULL;
+ bPoseChannel *tar_pchan= NULL;
+
+ /* get the target objects, adding them as need be */
+ if (get_new_constraint_target(C, type, &tar_ob, &tar_pchan, 1)) {
+ /* method of setting target depends on the type of target we've got
+ * - by default, just set the first target (distinction here is only for multiple-targetted constraints)
+ */
+ if (tar_pchan)
+ set_constraint_nth_target(con, tar_ob, tar_pchan->name, 0);
+ else
+ set_constraint_nth_target(con, tar_ob, "", 0);
+ }
+ }
+
+ /* do type-specific tweaking to the constraint settings */
+ 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
+ {
+ char *menustr;
+ int scriptint= 0;
+#ifndef DISABLE_PYTHON
+ /* popup a list of usable scripts */
+ menustr = buildmenu_pyconstraints(NULL, &scriptint);
+ // XXX scriptint = pupmenu(menustr);
+ MEM_freeN(menustr);
+
+ /* only add constraint if a script was chosen */
+ if (scriptint) {
+ /* add constraint */
+ validate_pyconstraint_cb(con->data, &scriptint);
+
+ /* make sure target allowance is set correctly */
+ BPY_pyconstraint_update(ob, con);
+ }
+#endif
+ }
+ default:
+ break;
+ }
+
+ /* make sure all settings are valid - similar to above checks, but sometimes can be wrong */
+ object_test_constraints(ob);
+
+ if (ob->pose)
+ update_pose_constraint_flags(ob->pose);
+
+
+ /* force depsgraph to get recalculated since new relationships added */
+ DAG_scene_sort(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);
+ }
+ else
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* notifiers for updates */
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_ADDED, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+/* ------------------ */
+
+/* dummy operator callback */
+static int object_constraint_add_exec(bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ int type= RNA_enum_get(op->ptr, "type");
+ short with_targets= 0;
+
+ /* get active object from context */
+ if (sa->spacetype == SPACE_BUTS)
+ ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ else
+ ob= CTX_data_active_object(C);
+
+ if (!ob) {
+ BKE_report(op->reports, RPT_ERROR, "No active object to add constraint to.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* hack: set constraint targets from selected objects in context is allowed when
+ * operator name included 'with_targets', since the menu doesn't allow multiple properties
+ */
+ if (strstr(op->idname, "with_targets"))
+ with_targets= 1;
+
+ return constraint_add_exec(C, op, ob, &ob->constraints, type, with_targets);
+}
+
+/* dummy operator callback */
+static int pose_constraint_add_exec(bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ Object *ob;
+ int type= RNA_enum_get(op->ptr, "type");
+ short with_targets= 0;
+
+ /* get active object from context */
+ if (sa->spacetype == SPACE_BUTS)
+ ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ else
+ ob= CTX_data_active_object(C);
+
+ if (!ob) {
+ BKE_report(op->reports, RPT_ERROR, "No active object to add constraint to.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* hack: set constraint targets from selected objects in context is allowed when
+ * operator name included 'with_targets', since the menu doesn't allow multiple properties
+ */
+ if (strstr(op->idname, "with_targets"))
+ with_targets= 1;
+
+ return constraint_add_exec(C, op, ob, get_active_constraints(ob), type, with_targets);
+}
+
+/* ------------------ */
+
+void OBJECT_OT_constraint_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Constraint";
+ ot->description = "Add a constraint to the active object.";
+ ot->idname= "OBJECT_OT_constraint_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_constraint_add_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", "");
+}
+
+void OBJECT_OT_constraint_add_with_targets(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Constraint (with Targets)";
+ ot->description = "Add a constraint to the active object, with target (where applicable) set to the selected Objects/Bones.";
+ ot->idname= "OBJECT_OT_constraint_add_with_targets";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_constraint_add_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", "");
+}
+
+void POSE_OT_constraint_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Constraint";
+ ot->description = "Add a constraint to the active bone.";
+ ot->idname= "POSE_OT_constraint_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= pose_constraint_add_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", "");
+}
+
+void POSE_OT_constraint_add_with_targets(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Constraint (with Targets)";
+ ot->description = "Add a constraint to the active bone, with target (where applicable) set to the selected Objects/Bones.";
+ ot->idname= "POSE_OT_constraint_add_with_targets";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= pose_constraint_add_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", "");
+}
+
+/************************ IK Constraint operators *********************/
+/* NOTE: only for Pose-Channels */
+// 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)
+{
+ Object *ob= CTX_data_active_object(C);
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ bConstraint *con= NULL;
+
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ Object *tar_ob= NULL;
+ bPoseChannel *tar_pchan= NULL;
+
+ /* must have active bone */
+ if (ELEM(NULL, ob, pchan)) {
+ BKE_report(op->reports, RPT_ERROR, "Must have active bone to add IK Constraint to.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* bone must not have any constraints already */
+ for (con= pchan->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) break;
+ }
+ if (con) {
+ BKE_report(op->reports, RPT_ERROR, "Bone already has IK Constraint.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* prepare popup menu to choose targetting options */
+ pup= uiPupMenuBegin(C, "Add IK", 0);
+ layout= uiPupMenuLayout(pup);
+
+ /* the type of targets we'll set determines the menu entries to show... */
+ if (get_new_constraint_target(C, CONSTRAINT_TYPE_KINEMATIC, &tar_ob, &tar_pchan, 0)) {
+ /* bone target, or object target?
+ * - 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);
+ else
+ uiItemBooleanO(layout, "To Active Object", 0, "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);
+ }
+
+ /* finish building the menu, and process it (should result in calling self again) */
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+/* call constraint_add_exec() to add the IK constraint */
+static int pose_ik_add_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ int with_targets= RNA_boolean_get(op->ptr, "with_targets");
+
+ /* add the constraint - all necessary checks should have been done by the invoke() callback already... */
+ return constraint_add_exec(C, op, ob, get_active_constraints(ob), CONSTRAINT_TYPE_KINEMATIC, with_targets);
+}
+
+void POSE_OT_ik_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add IK to Bone";
+ ot->description= "Add IK Constraint to the active Bone.";
+ ot->idname= "POSE_OT_ik_add";
+
+ /* api callbacks */
+ ot->invoke= pose_ik_add_invoke;
+ ot->exec= pose_ik_add_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "with_targets", 1, "With Targets", "Assign IK Constraint with targets derived from the select bones/objects");
+}
+
+/* ------------------ */
+
+/* remove IK constraints from selected bones */
+static int pose_ik_clear_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+
+ /* only remove IK Constraints */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans)
+ {
+ bConstraint *con, *next;
+
+ // TODO: should we be checking if these contraints were local before we try and remove them?
+ for (con= pchan->constraints.first; con; con= next) {
+ next= con->next;
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ free_constraint_data(con);
+ BLI_freelinkN(&pchan->constraints, con);
+ }
+ }
+ pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
+ }
+ CTX_DATA_END;
+
+ /* */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSE_OT_ik_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove IK";
+ ot->description= "Remove all IK Constraints from selected bones.";
+ ot->idname= "POSE_OT_ik_clear";
+
+ /* api callbacks */
+ ot->exec= pose_ik_clear_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 8102b1bfb9c..c734a7c606d 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -28,6 +28,8 @@
#include <string.h>
#include <math.h>
#include <time.h>
+#include <float.h>
+#include <ctype.h>
#include "MEM_guardedalloc.h"
@@ -98,7 +100,9 @@
#include "BKE_mesh.h"
#include "BKE_nla.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_property.h"
#include "BKE_report.h"
#include "BKE_sca.h"
@@ -114,18 +118,19 @@
#include "ED_curve.h"
#include "ED_particle.h"
#include "ED_mesh.h"
+#include "ED_mball.h"
#include "ED_object.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
#include "ED_view3d.h"
-#include "BIF_transform.h"
-
#include "UI_interface.h"
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
/* for menu/popup icons etc etc*/
#include "UI_interface.h"
@@ -138,10 +143,8 @@
/* ************* XXX **************** */
static void error() {}
-static void waitcursor() {}
-static int pupmenu() {return 0;}
-static int pupmenu_col() {return 0;}
-static int okee() {return 0;}
+static void waitcursor(int val) {}
+static int pupmenu(const char *msg) {return 0;}
/* port over here */
static bContext *C;
@@ -151,912 +154,6 @@ static void error_libdata() {}
/* --------------------------------- */
-/* simple API for object selection, rather than just using the flag
- * 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! */
-
-void ED_base_object_select(Base *base, short mode)
-{
- if (base) {
- if (mode==BA_SELECT) {
- if (!(base->object->restrictflag & OB_RESTRICT_SELECT))
- if (mode==BA_SELECT) base->flag |= SELECT;
- }
- else if (mode==BA_DESELECT) {
- base->flag &= ~SELECT;
- }
- base->object->flag= base->flag;
- }
-}
-
-/* also to set active NULL */
-void ED_base_object_activate(bContext *C, Base *base)
-{
- Scene *scene= CTX_data_scene(C);
- Base *tbase;
-
- /* activating a non-mesh, should end a couple of modes... */
- if(base && base->object->type!=OB_MESH)
- ED_view3d_exit_paint_modes(C);
-
- /* sets scene->basact */
- BASACT= base;
-
- if(base) {
-
- /* XXX old signals, remember to handle notifiers now! */
- // select_actionchannel_by_name(base->object->action, "Object", 1);
-
- /* disable temporal locks */
- for(tbase=FIRSTBASE; tbase; tbase= tbase->next) {
- if(base!=tbase && (tbase->object->shapeflag & OB_SHAPE_TEMPLOCK)) {
- tbase->object->shapeflag &= ~OB_SHAPE_TEMPLOCK;
- DAG_object_flush_update(scene, tbase->object, OB_RECALC_DATA);
- }
- }
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
- }
- else
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, NULL);
-}
-
-
-/* exported */
-void ED_object_base_init_from_view(bContext *C, Base *base)
-{
- View3D *v3d= CTX_wm_view3d(C);
- Scene *scene= CTX_data_scene(C);
- Object *ob= base->object;
-
- if (scene==NULL)
- return;
-
- if (v3d==NULL) {
- base->lay = scene->lay;
- VECCOPY(ob->loc, scene->cursor);
- }
- else {
- if (v3d->localview) {
- base->lay= ob->lay= v3d->layact | v3d->lay;
- VECCOPY(ob->loc, v3d->cursor);
- }
- else {
- base->lay= ob->lay= v3d->layact;
- VECCOPY(ob->loc, scene->cursor);
- }
-
- if (U.flag & USER_ADD_VIEWALIGNED) {
- ARegion *ar= CTX_wm_region(C);
- if(ar) {
- RegionView3D *rv3d= ar->regiondata;
-
- rv3d->viewquat[0]= -rv3d->viewquat[0];
- QuatToEul(rv3d->viewquat, ob->rot);
- rv3d->viewquat[0]= -rv3d->viewquat[0];
- }
- }
- }
- where_is_object(scene, ob);
-}
-
-/* ******************* add object operator ****************** */
-
-static EnumPropertyItem prop_object_types[] = {
- {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_ARMATURE, "ARMATURE", 0, "Armature", ""},
- {OB_LATTICE, "LATTICE", 0, "Lattice", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-
-
-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 */
-}
-
-/* for object add primitive operators */
-static Object *object_add_type(bContext *C, int type)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob;
-
- /* XXX hrms, this is editor level operator, remove? */
- ED_view3d_exit_paint_modes(C);
-
- /* for as long scene has editmode... */
- if (CTX_data_edit_object(C))
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
-
- /* deselects all, sets scene->basact */
- ob= add_object(scene, type);
- /* editor level activate, notifiers */
- ED_base_object_activate(C, BASACT);
-
- /* more editor stuff */
- ED_object_base_init_from_view(C, BASACT);
-
- DAG_scene_sort(scene);
-
- return ob;
-}
-
-/* for object add operator */
-static int object_add_exec(bContext *C, wmOperator *op)
-{
- object_add_type(C, RNA_int_get(op->ptr, "type"));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_object_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Add Object";
- ot->description = "Add an object to the scene.";
- ot->idname= "OBJECT_OT_object_add";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_add_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_object_types, 0, "Type", "");
-}
-
-/* ***************** add primitives *************** */
-/* ****** work both in and outside editmode ****** */
-
-static EnumPropertyItem prop_mesh_types[] = {
- {0, "PLANE", 0, "Plane", ""},
- {1, "CUBE", 0, "Cube", ""},
- {2, "CIRCLE", 0, "Circle", ""},
- {3, "UVSPHERE", 0, "UVsphere", ""},
- {4, "ICOSPHERE", 0, "Icosphere", ""},
- {5, "CYLINDER", 0, "Cylinder", ""},
- {6, "CONE", 0, "Cone", ""},
- {7, "GRID", 0, "Grid", ""},
- {8, "MONKEY", 0, "Monkey", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static int object_add_mesh_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- int newob= 0;
-
- if(obedit==NULL || obedit->type!=OB_MESH) {
- object_add_type(C, OB_MESH);
- ED_object_enter_editmode(C, EM_DO_UNDO);
- newob = 1;
- }
- else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- switch(RNA_enum_get(op->ptr, "type")) {
- case 0:
- WM_operator_name_call(C, "MESH_OT_primitive_plane_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 1:
- WM_operator_name_call(C, "MESH_OT_primitive_cube_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 2:
- WM_operator_name_call(C, "MESH_OT_primitive_circle_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 3:
- WM_operator_name_call(C, "MESH_OT_primitive_uv_sphere_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 4:
- WM_operator_name_call(C, "MESH_OT_primitive_ico_sphere_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 5:
- WM_operator_name_call(C, "MESH_OT_primitive_cylinder_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 6:
- WM_operator_name_call(C, "MESH_OT_primitive_cone_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 7:
- WM_operator_name_call(C, "MESH_OT_primitive_grid_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 8:
- WM_operator_name_call(C, "MESH_OT_primitive_monkey_add", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- }
- /* userdef */
- if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
- ED_object_exit_editmode(C, EM_FREEDATA);
- }
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- return OPERATOR_FINISHED;
-}
-
-
-void OBJECT_OT_mesh_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Mesh";
- ot->description = "Add a mesh object to the scene.";
- ot->idname= "OBJECT_OT_mesh_add";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_add_mesh_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags: no register or undo, this operator calls operators */
- ot->flag= 0; //OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_mesh_types, 0, "Primitive", "");
-}
-
-static EnumPropertyItem prop_curve_types[] = {
- {CU_BEZIER|CU_2D|CU_PRIM_CURVE, "BEZIER_CURVE", 0, "Bezier Curve", ""},
- {CU_BEZIER|CU_2D|CU_PRIM_CIRCLE, "BEZIER_CIRCLE", 0, "Bezier Circle", ""},
- {CU_NURBS|CU_2D|CU_PRIM_CURVE, "NURBS_CURVE", 0, "NURBS Curve", ""},
- {CU_NURBS|CU_2D|CU_PRIM_CIRCLE, "NURBS_CIRCLE", 0, "NURBS Circle", ""},
- {CU_NURBS|CU_2D|CU_PRIM_PATH, "PATH", 0, "Path", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static int object_add_curve_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb;
- Nurb *nu;
- int newob= 0;
-
- if(obedit==NULL || obedit->type!=OB_CURVE) {
- object_add_type(C, OB_CURVE);
- ED_object_enter_editmode(C, 0);
- newob = 1;
- }
- else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- obedit= CTX_data_edit_object(C);
- nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
- editnurb= curve_get_editcurve(obedit);
- BLI_addtail(editnurb, nu);
-
- /* userdef */
- if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
- ED_object_exit_editmode(C, EM_FREEDATA);
- }
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- return OPERATOR_FINISHED;
-}
-
-static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- Object *obedit= CTX_data_edit_object(C);
- uiPopupMenu *pup;
- uiLayout *layout;
-
- pup= uiPupMenuBegin(C, op->type->name, 0);
- layout= uiPupMenuLayout(pup);
- if(!obedit || obedit->type == OB_CURVE)
- uiItemsEnumO(layout, op->type->idname, "type");
- else
- uiItemsEnumO(layout, "OBJECT_OT_surface_add", "type");
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
-
-void OBJECT_OT_curve_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Curve";
- ot->description = "Add a curve object to the scene.";
- ot->idname= "OBJECT_OT_curve_add";
-
- /* api callbacks */
- ot->invoke= object_add_curve_invoke;
- ot->exec= object_add_curve_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", "");
-}
-
-static EnumPropertyItem prop_surface_types[]= {
- {CU_PRIM_CURVE|CU_NURBS, "NURBS_CURVE", 0, "NURBS Curve", ""},
- {CU_PRIM_CIRCLE|CU_NURBS, "NURBS_CIRCLE", 0, "NURBS Circle", ""},
- {CU_PRIM_PATCH|CU_NURBS, "NURBS_SURFACE", 0, "NURBS Surface", ""},
- {CU_PRIM_TUBE|CU_NURBS, "NURBS_TUBE", 0, "NURBS Tube", ""},
- {CU_PRIM_SPHERE|CU_NURBS, "NURBS_SPHERE", 0, "NURBS Sphere", ""},
- {CU_PRIM_DONUT|CU_NURBS, "NURBS_DONUT", 0, "NURBS Donut", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static int object_add_surface_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb;
- Nurb *nu;
- int newob= 0;
-
- if(obedit==NULL || obedit->type!=OB_SURF) {
- object_add_type(C, OB_SURF);
- ED_object_enter_editmode(C, 0);
- newob = 1;
- }
- else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- obedit= CTX_data_edit_object(C);
- nu= add_nurbs_primitive(C, RNA_enum_get(op->ptr, "type"), newob);
- editnurb= curve_get_editcurve(obedit);
- BLI_addtail(editnurb, nu);
-
- /* userdef */
- if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
- ED_object_exit_editmode(C, EM_FREEDATA);
- }
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_surface_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Surface";
- ot->description = "Add a surface object to the scene.";
- ot->idname= "OBJECT_OT_surface_add";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_add_surface_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", "");
-}
-
-static int object_add_text_exec(bContext *C, wmOperator *op)
-{
- Object *obedit= CTX_data_edit_object(C);
-
- if(obedit && obedit->type==OB_FONT)
- return OPERATOR_CANCELLED;
-
- object_add_type(C, OB_FONT);
- obedit= CTX_data_active_object(C);
-
- if(U.flag & USER_ADD_EDITMODE)
- ED_object_enter_editmode(C, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_text_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Text";
- ot->description = "Add a text object to the scene";
- ot->idname= "OBJECT_OT_text_add";
-
- /* api callbacks */
- ot->exec= object_add_text_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-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;
- int newob= 0;
-
- if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) {
- object_add_type(C, OB_ARMATURE);
- ED_object_enter_editmode(C, 0);
- newob = 1;
- }
- else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA);
-
- 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);
-
- /* userdef */
- if (newob && (U.flag & USER_ADD_EDITMODE)==0) {
- ED_object_exit_editmode(C, EM_FREEDATA);
- }
-
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_armature_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Armature";
- ot->description = "Add an armature object to the scene.";
- ot->idname= "OBJECT_OT_armature_add";
-
- /* api callbacks */
- ot->exec= object_armature_add_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-
-static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup= uiPupMenuBegin(C, "Add Object", 0);
- uiLayout *layout= uiPupMenuLayout(pup);
-
- uiItemMenuEnumO(layout, NULL, ICON_OUTLINER_OB_MESH, "OBJECT_OT_mesh_add", "type");
- uiItemMenuEnumO(layout, NULL, ICON_OUTLINER_OB_CURVE, "OBJECT_OT_curve_add", "type");
- uiItemMenuEnumO(layout, NULL, ICON_OUTLINER_OB_SURFACE, "OBJECT_OT_surface_add", "type");
- uiItemO(layout, NULL, ICON_OUTLINER_OB_FONT, "OBJECT_OT_text_add");
- uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_META, "OBJECT_OT_object_add", "type", OB_MBALL);
- uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_CAMERA, "OBJECT_OT_object_add", "type", OB_CAMERA);
- uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_LAMP, "OBJECT_OT_object_add", "type", OB_LAMP);
- uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_object_add", "type", OB_EMPTY);
- uiItemO(layout, NULL, ICON_OUTLINER_OB_ARMATURE, "OBJECT_OT_armature_add");
- uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_LATTICE, "OBJECT_OT_object_add", "type", OB_LATTICE);
-
- uiPupMenuEnd(C, pup);
-
- /* this operator is only for a menu, not used further */
- return OPERATOR_CANCELLED;
-}
-
-/* only used as menu */
-void OBJECT_OT_primitive_add(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Add Primitive";
- ot->description = "Add a primitive object.";
- ot->idname= "OBJECT_OT_primitive_add";
-
- /* api callbacks */
- ot->invoke= object_primitive_add_invoke;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= 0;
-}
-
-
-/* ******************************* */
-
-/* remove base from a specific scene */
-/* note: now unlinks constraints as well */
-void ED_base_object_free_and_unlink(Scene *scene, Base *base)
-{
- BLI_remlink(&scene->base, base);
- free_libblock_us(&G.main->object, base->object);
- if(scene->basact==base) scene->basact= NULL;
- MEM_freeN(base);
-}
-
-static int object_delete_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- int islamp= 0;
-
- if(CTX_data_edit_object(C))
- return OPERATOR_CANCELLED;
-
- ED_view3d_exit_paint_modes(C);
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
-
- if(base->object->type==OB_LAMP) islamp= 1;
-
- /* remove from current scene only */
- ED_base_object_free_and_unlink(scene, base);
- }
- CTX_DATA_END;
-
- if(islamp) reshadeall_displist(scene); /* only frees displist */
-
- DAG_scene_sort(scene);
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_delete(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Delete Objects";
- ot->description = "Delete the object.";
- ot->idname= "OBJECT_OT_delete";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_delete_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
-}
-
-
-static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
-{
- ID_NEW(*obpoin);
-}
-
-static void copy_object__forwardModifierLinks(void *userData, Object *ob,
- ID **idpoin)
-{
- /* this is copied from ID_NEW; it might be better to have a macro */
- if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
-}
-
-
-/* after copying objects, copied data should get new pointers */
-static void copy_object_set_idnew(Scene *scene, View3D *v3d, int dupflag)
-{
- Base *base;
- Object *ob;
- Material *ma, *mao;
- ID *id;
-#if 0 // XXX old animation system
- Ipo *ipo;
- bActionStrip *strip;
-#endif // XXX old animation system
- int a;
-
- /* XXX check object pointers */
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- ob= base->object;
- relink_constraints(&ob->constraints);
- if (ob->pose){
- bPoseChannel *chan;
- for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
- relink_constraints(&chan->constraints);
- }
- }
- modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
- ID_NEW(ob->parent);
- ID_NEW(ob->track);
- ID_NEW(ob->proxy);
- ID_NEW(ob->proxy_group);
-
-#if 0 // XXX old animation system
- for(strip= ob->nlastrips.first; strip; strip= strip->next) {
- bActionModifier *amod;
- for(amod= strip->modifiers.first; amod; amod= amod->next)
- ID_NEW(amod->ob);
- }
-#endif // XXX old animation system
- }
- }
-
- /* materials */
- if( dupflag & USER_DUP_MAT) {
- mao= G.main->mat.first;
- while(mao) {
- if(mao->id.newid) {
-
- ma= (Material *)mao->id.newid;
-
- if(dupflag & USER_DUP_TEX) {
- for(a=0; a<MAX_MTEX; a++) {
- if(ma->mtex[a]) {
- id= (ID *)ma->mtex[a]->tex;
- if(id) {
- ID_NEW_US(ma->mtex[a]->tex)
- else ma->mtex[a]->tex= copy_texture(ma->mtex[a]->tex);
- id->us--;
- }
- }
- }
- }
-#if 0 // XXX old animation system
- id= (ID *)ma->ipo;
- if(id) {
- ID_NEW_US(ma->ipo)
- else ma->ipo= copy_ipo(ma->ipo);
- id->us--;
- }
-#endif // XXX old animation system
- }
- mao= mao->id.next;
- }
- }
-
-#if 0 // XXX old animation system
- /* lamps */
- if( dupflag & USER_DUP_IPO) {
- Lamp *la= G.main->lamp.first;
- while(la) {
- if(la->id.newid) {
- Lamp *lan= (Lamp *)la->id.newid;
- id= (ID *)lan->ipo;
- if(id) {
- ID_NEW_US(lan->ipo)
- else lan->ipo= copy_ipo(lan->ipo);
- id->us--;
- }
- }
- la= la->id.next;
- }
- }
-
- /* ipos */
- ipo= G.main->ipo.first;
- while(ipo) {
- if(ipo->id.lib==NULL && ipo->id.newid) {
- Ipo *ipon= (Ipo *)ipo->id.newid;
- IpoCurve *icu;
- for(icu= ipon->curve.first; icu; icu= icu->next) {
- if(icu->driver) {
- ID_NEW(icu->driver->ob);
- }
- }
- }
- ipo= ipo->id.next;
- }
-#endif // XXX old animation system
-
- set_sca_new_poins();
-
- clear_id_newpoins();
-
-}
-
-static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float *cent)
-{
- EditVert *eve;
- int *index, nr, totvert=0;
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) totvert++;
- }
- if(totvert==0) return 0;
-
- *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
- *tot= totvert;
- nr= 0;
- cent[0]= cent[1]= cent[2]= 0.0;
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) {
- *index= nr; index++;
- VecAddf(cent, cent, eve->co);
- }
- nr++;
- }
-
- VecMulf(cent, 1.0f/(float)totvert);
-
- return totvert;
-}
-
-static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, float *cent)
-{
- MDeformVert *dvert;
- EditVert *eve;
- int i, totvert=0;
-
- cent[0]= cent[1]= cent[2]= 0.0;
-
- if(obedit->actdef) {
-
- /* find the vertices */
- for(eve= em->verts.first; eve; eve= eve->next) {
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
-
- if(dvert) {
- for(i=0; i<dvert->totweight; i++){
- if(dvert->dw[i].def_nr == (obedit->actdef-1)) {
- totvert++;
- VecAddf(cent, cent, eve->co);
- }
- }
- }
- }
- if(totvert) {
- bDeformGroup *defGroup = BLI_findlink(&obedit->defbase, obedit->actdef-1);
- strcpy(name, defGroup->name);
- VecMulf(cent, 1.0f/(float)totvert);
- return 1;
- }
- }
-
- return 0;
-}
-
-static void select_editmesh_hook(Object *ob, HookModifierData *hmd)
-{
- Mesh *me= ob->data;
- EditMesh *em= BKE_mesh_get_editmesh(me);
- EditVert *eve;
- int index=0, nr=0;
-
- for(eve= em->verts.first; eve; eve= eve->next, nr++) {
- if(nr==hmd->indexar[index]) {
- eve->f |= SELECT;
- if(index < hmd->totindex-1) index++;
- }
- }
- EM_select_flush(em);
-
- BKE_mesh_end_editmesh(me, em);
-}
-
-static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar, float *cent)
-{
- BPoint *bp;
- int *index, nr, totvert=0, a;
-
- /* count */
- a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
- bp= editlatt->def;
- while(a--) {
- if(bp->f1 & SELECT) {
- if(bp->hide==0) totvert++;
- }
- bp++;
- }
-
- if(totvert==0) return 0;
-
- *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
- *tot= totvert;
- nr= 0;
- cent[0]= cent[1]= cent[2]= 0.0;
-
- a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
- bp= editlatt->def;
- while(a--) {
- if(bp->f1 & SELECT) {
- if(bp->hide==0) {
- *index= nr; index++;
- VecAddf(cent, cent, bp->vec);
- }
- }
- bp++;
- nr++;
- }
-
- VecMulf(cent, 1.0f/(float)totvert);
-
- return totvert;
-}
-
-static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
-{
- Lattice *lt= obedit->data;
- BPoint *bp;
- int index=0, nr=0, a;
-
- /* count */
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
- while(a--) {
- if(hmd->indexar[index]==nr) {
- bp->f1 |= SELECT;
- if(index < hmd->totindex-1) index++;
- }
- nr++;
- bp++;
- }
-}
-
-static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, float *cent)
-{
- ListBase *editnurb= curve_get_editcurve(obedit);
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- int *index, a, nr, totvert=0;
-
- for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->f1 & SELECT) totvert++;
- if(bezt->f2 & SELECT) totvert++;
- if(bezt->f3 & SELECT) totvert++;
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->f1 & SELECT) totvert++;
- bp++;
- }
- }
- }
- if(totvert==0) return 0;
-
- *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
- *tot= totvert;
- nr= 0;
- cent[0]= cent[1]= cent[2]= 0.0;
-
- for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->f1 & SELECT) {
- *index= nr; index++;
- VecAddf(cent, cent, bezt->vec[0]);
- }
- nr++;
- if(bezt->f2 & SELECT) {
- *index= nr; index++;
- VecAddf(cent, cent, bezt->vec[1]);
- }
- nr++;
- if(bezt->f3 & SELECT) {
- *index= nr; index++;
- VecAddf(cent, cent, bezt->vec[2]);
- }
- nr++;
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->f1 & SELECT) {
- *index= nr; index++;
- VecAddf(cent, cent, bp->vec);
- }
- nr++;
- bp++;
- }
- }
- }
-
- VecMulf(cent, 1.0f/(float)totvert);
-
- return totvert;
-}
-
void ED_object_apply_obmat(Object *ob)
{
float mat[3][3], imat[3][3], tmat[3][3];
@@ -1081,967 +178,6 @@ void ED_object_apply_obmat(Object *ob)
}
-int hook_getIndexArray(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
-{
- *indexar= NULL;
- *tot= 0;
- name[0]= 0;
-
- switch(obedit->type) {
- case OB_MESH:
- {
- Mesh *me= obedit->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- /* check selected vertices first */
- if( return_editmesh_indexar(em, tot, indexar, cent_r)) {
- BKE_mesh_end_editmesh(me, em);
- return 1;
- } else {
- int ret = return_editmesh_vgroup(obedit, em, name, cent_r);
- BKE_mesh_end_editmesh(me, em);
- return ret;
- }
- }
- case OB_CURVE:
- case OB_SURF:
- return return_editcurve_indexar(obedit, tot, indexar, cent_r);
- case OB_LATTICE:
- {
- Lattice *lt= obedit->data;
- return return_editlattice_indexar(lt->editlatt, tot, indexar, cent_r);
- }
- default:
- return 0;
- }
-}
-
-static void select_editcurve_hook(Object *obedit, HookModifierData *hmd)
-{
- ListBase *editnurb= curve_get_editcurve(obedit);
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- int index=0, a, nr=0;
-
- for(nu= editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(nr == hmd->indexar[index]) {
- bezt->f1 |= SELECT;
- if(index<hmd->totindex-1) index++;
- }
- nr++;
- if(nr == hmd->indexar[index]) {
- bezt->f2 |= SELECT;
- if(index<hmd->totindex-1) index++;
- }
- nr++;
- if(nr == hmd->indexar[index]) {
- bezt->f3 |= SELECT;
- if(index<hmd->totindex-1) index++;
- }
- nr++;
-
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(nr == hmd->indexar[index]) {
- bp->f1 |= SELECT;
- if(index<hmd->totindex-1) index++;
- }
- nr++;
- bp++;
- }
- }
- }
-}
-
-void obedit_hook_select(Object *ob, HookModifierData *hmd)
-{
-
- if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd);
- else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd);
- else if(ob->type==OB_CURVE) select_editcurve_hook(ob, hmd);
- else if(ob->type==OB_SURF) select_editcurve_hook(ob, hmd);
-}
-
-
-void add_hook(Scene *scene, View3D *v3d, int mode)
-{
- ModifierData *md = NULL;
- HookModifierData *hmd = NULL;
- Object *ob=NULL;
- Object *obedit= scene->obedit; // XXX get from context
-
- if(obedit==NULL) return;
-
- /* preconditions */
- if(mode==2) { /* selected object */
- Base *base;
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- if(base!=BASACT) {
- ob= base->object;
- break;
- }
- }
- }
- if(ob==NULL) {
- error("Requires selected Object");
- return;
- }
- }
- else if(mode!=1) {
- int maxlen=0, a, nr;
- char *cp;
-
- /* make pupmenu with hooks */
- for(md=obedit->modifiers.first; md; md= md->next) {
- if (md->type==eModifierType_Hook)
- maxlen+=32;
- }
-
- if(maxlen==0) {
- error("Object has no hooks yet");
- return;
- }
-
- cp= MEM_callocN(maxlen+32, "temp string");
- if(mode==3) strcpy(cp, "Remove %t|");
- else if(mode==4) strcpy(cp, "Reassign %t|");
- else if(mode==5) strcpy(cp, "Select %t|");
- else if(mode==6) strcpy(cp, "Clear Offset %t|");
-
- for(md=obedit->modifiers.first; md; md= md->next) {
- if (md->type==eModifierType_Hook) {
- strcat(cp, md->name);
- strcat(cp, " |");
- }
- }
-
- nr= pupmenu(cp);
- MEM_freeN(cp);
-
- if(nr<1) return;
-
- a= 1;
- for(md=obedit->modifiers.first; md; md=md->next) {
- if (md->type==eModifierType_Hook) {
- if(a==nr) break;
- a++;
- }
- }
-
- hmd = (HookModifierData*) md;
- ob= hmd->object;
- }
-
- /* do it, new hooks or reassign */
- if(mode==1 || mode==2 || mode==4) {
- float cent[3];
- int tot, ok, *indexar;
- char name[32];
-
- ok = hook_getIndexArray(obedit, &tot, &indexar, name, cent);
-
- if(ok==0) {
- error("Requires selected vertices or active Vertex Group");
- }
- else {
-
- if(mode==1) {
- Base *base= BASACT, *newbase;
-
- ob= add_object(scene, OB_EMPTY);
- /* set layers OK */
- newbase= BASACT;
- newbase->lay= base->lay;
- ob->lay= newbase->lay;
-
- /* transform cent to global coords for loc */
- VecMat4MulVecfl(ob->loc, obedit->obmat, cent);
-
- /* restore, add_object sets active */
- BASACT= base;
- }
- /* if mode is 2 or 4, ob has been set */
-
- /* new hook */
- if(mode==1 || mode==2) {
- ModifierData *md = obedit->modifiers.first;
-
- while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
- md = md->next;
- }
-
- hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
- BLI_insertlinkbefore(&obedit->modifiers, md, hmd);
- sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);
- }
- else if (hmd->indexar) MEM_freeN(hmd->indexar); /* reassign, hook was set */
-
- hmd->object= ob;
- hmd->indexar= indexar;
- VECCOPY(hmd->cent, cent);
- hmd->totindex= tot;
- BLI_strncpy(hmd->name, name, 32);
-
- if(mode==1 || mode==2) {
- /* matrix calculus */
- /* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
- /* (parentinv ) */
-
- where_is_object(scene, ob);
-
- Mat4Invert(ob->imat, ob->obmat);
- /* apparently this call goes from right to left... */
- Mat4MulSerie(hmd->parentinv, ob->imat, obedit->obmat, NULL,
- NULL, NULL, NULL, NULL, NULL);
- }
- }
- }
- else if(mode==3) { /* remove */
- BLI_remlink(&obedit->modifiers, md);
- modifier_free(md);
- }
- else if(mode==5) { /* select */
- obedit_hook_select(obedit, hmd);
- }
- else if(mode==6) { /* clear offset */
- where_is_object(scene, ob); /* ob is hook->parent */
-
- Mat4Invert(ob->imat, ob->obmat);
- /* this call goes from right to left... */
- Mat4MulSerie(hmd->parentinv, ob->imat, obedit->obmat, NULL,
- NULL, NULL, NULL, NULL, NULL);
- }
-
- DAG_scene_sort(scene);
-}
-
-
-/* use this when the loc/size/rot of the parent has changed but the children should stay in the same place
- * apply-size-rot or object center for eg */
-static void ignore_parent_tx(Scene *scene, Object *ob )
-{
- Object workob;
- Object *ob_child;
-
- /* a change was made, adjust the children to compensate */
- for (ob_child=G.main->object.first; ob_child; ob_child=ob_child->id.next) {
- if (ob_child->parent == ob) {
- ED_object_apply_obmat(ob_child);
- what_does_parent(scene, ob_child, &workob);
- Mat4Invert(ob_child->parentinv, workob.obmat);
- }
- }
-}
-
-
-void add_hook_menu(Scene *scene, View3D *v3d)
-{
- Object *obedit= scene->obedit; // XXX get from context
- int mode;
-
- if(obedit==NULL) return;
-
- if(modifiers_findByType(obedit, eModifierType_Hook))
- mode= pupmenu("Hooks %t|Add, To New Empty %x1|Add, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
- else
- mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
-
- if(mode<1) return;
-
- /* do operations */
- add_hook(scene, v3d, mode);
-}
-
-/* ******************** clear parent operator ******************* */
-
-static EnumPropertyItem prop_clear_parent_types[] = {
- {0, "CLEAR", 0, "Clear Parent", ""},
- {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation (Clear Track)", ""},
- {2, "CLEAR_INVERSE", 0, "Clear Parent Inverse", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* note, poll should check for editable scene */
-static int parent_clear_exec(bContext *C, wmOperator *op)
-{
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
-
- if(RNA_enum_is_equal(op->ptr, "type", "CLEAR")) {
- ob->parent= NULL;
- }
- if(RNA_enum_is_equal(op->ptr, "type", "CLEAR_KEEP_TRANSFORM")) {
- ob->parent= NULL;
- ob->track= NULL;
- ED_object_apply_obmat(ob);
- }
- if(RNA_enum_is_equal(op->ptr, "type", "CLEAR_INVERSE")) {
- Mat4One(ob->parentinv);
- }
- ob->recalc |= OB_RECALC;
- }
- CTX_DATA_END;
-
- DAG_scene_sort(CTX_data_scene(C));
- ED_anim_dag_flush_update(C);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_parent_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear parent";
- ot->description = "Clear the object's parenting.";
- ot->idname= "OBJECT_OT_parent_clear";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= parent_clear_exec;
-
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_clear_parent_types, 0, "Type", "");
-}
-
-/* ******************** clear track operator ******************* */
-
-
-static EnumPropertyItem prop_clear_track_types[] = {
- {0, "CLEAR", 0, "Clear Track", ""},
- {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation (Clear Track)", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* note, poll should check for editable scene */
-static int object_track_clear_exec(bContext *C, wmOperator *op)
-{
- if(CTX_data_edit_object(C)) {
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
- return OPERATOR_CANCELLED;
- }
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- ob->track= NULL;
- ob->recalc |= OB_RECALC;
-
- if(RNA_enum_is_equal(op->ptr, "type", "CLEAR_KEEP_TRANSFORM")) {
- ED_object_apply_obmat(ob);
- }
- }
- CTX_DATA_END;
-
- DAG_scene_sort(CTX_data_scene(C));
- ED_anim_dag_flush_update(C);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_track_clear(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Clear track";
- ot->description = "Clear tracking constraint or flag from object.";
- ot->idname= "OBJECT_OT_track_clear";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_track_clear_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_clear_track_types, 0, "Type", "");
-}
-
-/* *****************Selection Operators******************* */
-static EnumPropertyItem prop_select_types[] = {
- {0, "EXCLUSIVE", 0, "Exclusive", ""},
- {1, "EXTEND", 0, "Extend", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* ****** Select by Type ****** */
-
-static int object_select_by_type_exec(bContext *C, wmOperator *op)
-{
- short obtype, seltype;
-
- obtype = RNA_enum_get(op->ptr, "type");
- seltype = RNA_enum_get(op->ptr, "seltype");
-
- if (seltype == 0) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
- }
- CTX_DATA_END;
- }
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if(base->object->type==obtype) {
- ED_base_object_select(base, BA_SELECT);
- }
- }
- CTX_DATA_END;
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_select_by_type(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Select By Type";
- ot->description = "Select all visible objects that are of a type.";
- ot->idname= "OBJECT_OT_select_by_type";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_select_by_type_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "seltype", prop_select_types, 0, "Selection", "Extend selection or clear selection then select");
- RNA_def_enum(ot->srna, "type", prop_object_types, 1, "Type", "");
-
-}
-/* ****** selection by links *******/
-
-static EnumPropertyItem prop_select_linked_types[] = {
- {1, "IPO", 0, "Object IPO", ""}, // XXX depreceated animation system stuff...
- {2, "OBDATA", 0, "Ob Data", ""},
- {3, "MATERIAL", 0, "Material", ""},
- {4, "TEXTURE", 0, "Texture", ""},
- {5, "DUPGROUP", 0, "Dupligroup", ""},
- {6, "PARTICLE", 0, "Particle System", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static int object_select_linked_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob;
- void *obdata = NULL;
- Material *mat = NULL, *mat1;
- Tex *tex=0;
- int a, b;
- int nr = RNA_enum_get(op->ptr, "type");
- short changed = 0, seltype;
- /* events (nr):
- * Object Ipo: 1
- * ObData: 2
- * Current Material: 3
- * Current Texture: 4
- * DupliGroup: 5
- * PSys: 6
- */
-
- seltype = RNA_enum_get(op->ptr, "seltype");
-
- if (seltype == 0) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
- }
- CTX_DATA_END;
- }
-
- ob= OBACT;
- if(ob==0){
- BKE_report(op->reports, RPT_ERROR, "No Active Object");
- return OPERATOR_CANCELLED;
- }
-
- if(nr==1) {
- // XXX old animation system
- //ipo= ob->ipo;
- //if(ipo==0) return OPERATOR_CANCELLED;
- return OPERATOR_CANCELLED;
- }
- else if(nr==2) {
- if(ob->data==0) return OPERATOR_CANCELLED;
- obdata= ob->data;
- }
- else if(nr==3 || nr==4) {
- mat= give_current_material(ob, ob->actcol);
- if(mat==0) return OPERATOR_CANCELLED;
- if(nr==4) {
- if(mat->mtex[ (int)mat->texact ]) tex= mat->mtex[ (int)mat->texact ]->tex;
- if(tex==0) return OPERATOR_CANCELLED;
- }
- }
- else if(nr==5) {
- if(ob->dup_group==NULL) return OPERATOR_CANCELLED;
- }
- else if(nr==6) {
- if(ob->particlesystem.first==NULL) return OPERATOR_CANCELLED;
- }
- else return OPERATOR_CANCELLED;
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if(nr==1) {
- // XXX old animation system
- //if(base->object->ipo==ipo) base->flag |= SELECT;
- //changed = 1;
- }
- else if(nr==2) {
- if(base->object->data==obdata) base->flag |= SELECT;
- changed = 1;
- }
- else if(nr==3 || nr==4) {
- ob= base->object;
-
- for(a=1; a<=ob->totcol; a++) {
- mat1= give_current_material(ob, a);
- if(nr==3) {
- if(mat1==mat) base->flag |= SELECT;
- changed = 1;
- }
- else if(mat1 && nr==4) {
- for(b=0; b<MAX_MTEX; b++) {
- if(mat1->mtex[b]) {
- if(tex==mat1->mtex[b]->tex) {
- base->flag |= SELECT;
- changed = 1;
- break;
- }
- }
- }
- }
- }
- }
- else if(nr==5) {
- if(base->object->dup_group==ob->dup_group) {
- base->flag |= SELECT;
- changed = 1;
- }
- }
- else if(nr==6) {
- /* loop through other, then actives particles*/
- ParticleSystem *psys;
- ParticleSystem *psys_act;
-
- for(psys=base->object->particlesystem.first; psys; psys=psys->next) {
- for(psys_act=ob->particlesystem.first; psys_act; psys_act=psys_act->next) {
- if (psys->part == psys_act->part) {
- base->flag |= SELECT;
- changed = 1;
- break;
- }
- }
-
- if (base->flag & SELECT) {
- break;
- }
- }
- }
- base->object->flag= base->flag;
- }
- CTX_DATA_END;
-
- if (changed) {
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
- return OPERATOR_FINISHED;
- }
-
- return OPERATOR_CANCELLED;
-}
-
-void OBJECT_OT_select_linked(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Select Linked";
- ot->description = "Select all visible objects that are linked.";
- ot->idname= "OBJECT_OT_select_linked";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_select_linked_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
- RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
-
-}
-/* ****** selection by layer *******/
-
-static int object_select_by_layer_exec(bContext *C, wmOperator *op)
-{
- unsigned int layernum;
- short seltype;
-
- seltype = RNA_enum_get(op->ptr, "seltype");
- layernum = RNA_int_get(op->ptr, "layer");
-
- if (seltype == 0) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
- }
- CTX_DATA_END;
- }
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if(base->lay == (1<< (layernum -1)))
- ED_base_object_select(base, BA_SELECT);
- }
- CTX_DATA_END;
-
- /* undo? */
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_select_by_layer(wmOperatorType *ot)
-{
- /* identifiers */
- 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;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_int(ot->srna, "layer", 1, 1, 20, "Layer", "", 1, 20);
- RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
-}
-
-/* ****** invert selection *******/
-static int object_select_invert_exec(bContext *C, wmOperator *op)
-{
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if (base->flag & SELECT)
- ED_base_object_select(base, BA_DESELECT);
- else
- ED_base_object_select(base, BA_SELECT);
- }
- CTX_DATA_END;
-
- /* undo? */
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_select_invert(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Invert selection";
- ot->description = "Invert th select of all visible objects.";
- ot->idname= "OBJECT_OT_select_invert";
-
- /* api callbacks */
- ot->exec= object_select_invert_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
-}
-/* ****** (de)select All *******/
-
-static int object_select_de_select_all_exec(bContext *C, wmOperator *op)
-{
-
- int a=0, ok=0;
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if (base->flag & SELECT) {
- ok= a= 1;
- break;
- }
- else ok=1;
- }
- CTX_DATA_END;
-
- if (!ok) return OPERATOR_PASS_THROUGH;
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if (a) ED_base_object_select(base, BA_DESELECT);
- else ED_base_object_select(base, BA_SELECT);
- }
- CTX_DATA_END;
-
- /* undo? */
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_select_all_toggle(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "deselect all";
- ot->description = "(de)select all visible objects in scene.";
- ot->idname= "OBJECT_OT_select_all_toggle";
-
- /* api callbacks */
- ot->exec= object_select_de_select_all_exec;
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
-}
-/* ****** random selection *******/
-
-static int object_select_random_exec(bContext *C, wmOperator *op)
-{
- float percent;
- short seltype;
-
- seltype = RNA_enum_get(op->ptr, "seltype");
-
- if (seltype == 0) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
- }
- CTX_DATA_END;
- }
- percent = RNA_float_get(op->ptr, "percent");
-
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if (BLI_frand() < percent) {
- ED_base_object_select(base, BA_SELECT);
- }
- }
- CTX_DATA_END;
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_select_random(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Random select";
- ot->description = "Set select on random visible objects.";
- ot->idname= "OBJECT_OT_select_random";
-
- /* 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;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "percentage of objects to randomly select", 0.0001f, 1.0f);
- RNA_def_enum(ot->srna, "seltype", prop_select_types, 1, "Selection", "Extend selection or clear selection then select");
-}
-
-/* ******** Clear object Translation *********** */
-
-static int object_location_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if((G.f & G_WEIGHTPAINT)==0) {
- 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;
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-
-void OBJECT_OT_location_clear(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Clear Object Location";
- ot->description = "Clear the object's location.";
- ot->idname= "OBJECT_OT_location_clear";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_location_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_rotation_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if((G.f & G_WEIGHTPAINT)==0) {
- /* eulers can only get cleared if they are not protected */
- 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;
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-
-void OBJECT_OT_rotation_clear(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Clear Object Rotation";
- ot->description = "Clear the object's rotation.";
- ot->idname= "OBJECT_OT_rotation_clear";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_rotation_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_scale_clear_exec(bContext *C, wmOperator *op)
-{
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if((G.f & G_WEIGHTPAINT)==0) {
- 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;
- }
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_scale_clear(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Clear Object Scale";
- ot->description = "Clear the object's scale.";
- ot->idname= "OBJECT_OT_scale_clear";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_scale_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_origin_clear_exec(bContext *C, wmOperator *op)
-{
- float *v1, *v3, mat[3][3];
- int armature_clear= 0;
-
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->parent) {
- v1= ob->loc;
- v3= ob->parentinv[3];
-
- Mat3CpyMat4(mat, ob->parentinv);
- VECCOPY(v3, v1);
- v3[0]= -v3[0];
- v3[1]= -v3[1];
- v3[2]= -v3[2];
- Mat3MulVecfl(mat, v3);
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- if(armature_clear==0) /* in this case flush was done */
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_origin_clear(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Clear Object Origin";
- ot->description = "Clear the object's origin.";
- ot->idname= "OBJECT_OT_origin_clear";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_origin_clear_exec;
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
/* ********* clear/set restrict view *********/
static int object_restrictview_clear_exec(bContext *C, wmOperator *op)
{
@@ -2072,12 +208,11 @@ void OBJECT_OT_restrictview_clear(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Clear restrict view";
+ ot->name= "Clear Restrict View";
ot->description = "Reveal the object by setting the restrictview flag.";
ot->idname= "OBJECT_OT_restrictview_clear";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
ot->exec= object_restrictview_clear_exec;
ot->poll= ED_operator_view3d_active;
@@ -2085,19 +220,14 @@ void OBJECT_OT_restrictview_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static EnumPropertyItem prop_set_restrictview_types[] = {
- {0, "SELECTED", 0, "Selected", ""},
- {1, "UNSELECTED", 0, "Unselected ", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
static int object_restrictview_set_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
short changed = 0;
+ int unselected= RNA_boolean_get(op->ptr, "unselected");
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- if(RNA_enum_is_equal(op->ptr, "type", "SELECTED")){
+ if(!unselected) {
if (base->flag & SELECT){
base->flag &= ~SELECT;
base->object->flag = base->flag;
@@ -2108,7 +238,7 @@ static int object_restrictview_set_exec(bContext *C, wmOperator *op)
}
}
}
- else if (RNA_enum_is_equal(op->ptr, "type", "UNSELECTED")){
+ else {
if (!(base->flag & SELECT)){
base->object->restrictflag |= OB_RESTRICT_VIEW;
changed = 1;
@@ -2130,1059 +260,22 @@ static int object_restrictview_set_exec(bContext *C, wmOperator *op)
void OBJECT_OT_restrictview_set(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Set restrict view";
+ ot->name= "Set Restrict View";
ot->description = "Hide the object by setting the restrictview flag.";
ot->idname= "OBJECT_OT_restrictview_set";
/* api callbacks */
- ot->invoke= WM_menu_invoke;
ot->exec= object_restrictview_set_exec;
ot->poll= ED_operator_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", prop_set_restrictview_types, 0, "Type", "");
-
-}
-/* ************* Slow Parent ******************* */
-static int object_slowparent_set_exec(bContext *C, wmOperator *op)
-{
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
-
- if(base->object->parent) base->object->partype |= PARSLOW;
- base->object->recalc |= OB_RECALC_OB;
-
- }
- CTX_DATA_END;
-
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_SCENE, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_slowparent_set(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Set Slow Parent";
- ot->description = "Set the object's slow parent.";
- ot->idname= "OBJECT_OT_slow_parent_set";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_slowparent_set_exec;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-static int object_slowparent_clear_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if(base->object->parent) {
- if(base->object->partype & PARSLOW) {
- base->object->partype -= PARSLOW;
- where_is_object(scene, base->object);
- base->object->partype |= PARSLOW;
- base->object->recalc |= OB_RECALC_OB;
- }
- }
-
- }
- CTX_DATA_END;
-
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_SCENE, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_slowparent_clear(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Clear Slow Parent";
- ot->description = "Clear the object's slow parent.";
- ot->idname= "OBJECT_OT_slow_parent_clear";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_slowparent_clear_exec;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-/* ******************** **************** */
-
-// XXX
-#define BEZSELECTED_HIDDENHANDLES(bezt) ((G.f & G_HIDDENHANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt))
-/* only in edit mode */
-void make_vertex_parent(Scene *scene, Object *obedit, View3D *v3d)
-{
- EditVert *eve;
- Base *base;
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
- Object *par, *ob;
- int a, v1=0, v2=0, v3=0, v4=0, nr=1;
-
- /* we need 1 to 3 selected vertices */
-
- if(obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- eve= em->verts.first;
- while(eve) {
- if(eve->f & 1) {
- if(v1==0) v1= nr;
- else if(v2==0) v2= nr;
- else if(v3==0) v3= nr;
- else if(v4==0) v4= nr;
- else break;
- }
- nr++;
- eve= eve->next;
- }
-
- BKE_mesh_end_editmesh(me, em);
- }
- else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) {
- ListBase *editnurb= curve_get_editcurve(obedit);
-
- nu= editnurb->first;
- while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(BEZSELECTED_HIDDENHANDLES(bezt)) {
- if(v1==0) v1= nr;
- else if(v2==0) v2= nr;
- else if(v3==0) v3= nr;
- else if(v4==0) v4= nr;
- else break;
- }
- nr++;
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->f1 & SELECT) {
- if(v1==0) v1= nr;
- else if(v2==0) v2= nr;
- else if(v3==0) v3= nr;
- else if(v4==0) v4= nr;
- else break;
- }
- nr++;
- bp++;
- }
- }
- nu= nu->next;
- }
- }
- else if(obedit->type==OB_LATTICE) {
- Lattice *lt= obedit->data;
-
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
- bp= lt->editlatt->def;
- while(a--) {
- if(bp->f1 & SELECT) {
- if(v1==0) v1= nr;
- else if(v2==0) v2= nr;
- else if(v3==0) v3= nr;
- else if(v4==0) v4= nr;
- else break;
- }
- nr++;
- bp++;
- }
- }
-
- if(v4 || !((v1 && v2==0 && v3==0) || (v1 && v2 && v3)) ) {
- error("Select either 1 or 3 vertices to parent to");
- return;
- }
-
- if(okee("Make vertex parent")==0) return;
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- if(base!=BASACT) {
-
- ob= base->object;
- ob->recalc |= OB_RECALC;
- par= BASACT->object->parent;
-
- while(par) {
- if(par==ob) break;
- par= par->parent;
- }
- if(par) {
- error("Loop in parents");
- }
- else {
- Object workob;
-
- ob->parent= BASACT->object;
- if(v3) {
- ob->partype= PARVERT3;
- ob->par1= v1-1;
- ob->par2= v2-1;
- ob->par3= v3-1;
-
- /* inverse parent matrix */
- what_does_parent(scene, ob, &workob);
- Mat4Invert(ob->parentinv, workob.obmat);
- }
- else {
- ob->partype= PARVERT1;
- ob->par1= v1-1;
-
- /* inverse parent matrix */
- what_does_parent(scene, ob, &workob);
- Mat4Invert(ob->parentinv, workob.obmat);
- }
- }
- }
- }
- }
-
- DAG_scene_sort(scene);
-}
-
-static Object *group_objects_menu(Group *group)
-{
- GroupObject *go;
- int len= 0;
- short a, nr;
- char *str;
-
- for(go= group->gobject.first; go; go= go->next) {
- if(go->ob)
- len++;
- }
- if(len==0) return NULL;
-
- str= MEM_callocN(40+32*len, "menu");
-
- strcpy(str, "Make Proxy for: %t");
- a= strlen(str);
- for(nr=1, go= group->gobject.first; go; go= go->next, nr++) {
- a+= sprintf(str+a, "|%s %%x%d", go->ob->id.name+2, nr);
- }
-
- a= pupmenu_col(str, 20);
- MEM_freeN(str);
- if(a>0) {
- go= BLI_findlink(&group->gobject, a-1);
- return go->ob;
- }
- return NULL;
-}
-
-
-/* adds empty object to become local replacement data of a library-linked object */
-void make_proxy(Scene *scene)
-{
- Object *ob= OBACT;
- Object *gob= NULL;
-
- if(scene->id.lib) return;
- if(ob==NULL) return;
-
-
- if(ob->dup_group && ob->dup_group->id.lib) {
- gob= ob;
- /* gives menu with list of objects in group */
- ob= group_objects_menu(ob->dup_group);
- }
- else if(ob->id.lib) {
- if(okee("Make Proxy Object")==0)
- return;
- }
- else {
- error("Can only make proxy for a referenced object or group");
- return;
- }
-
- if(ob) {
- Object *newob;
- Base *newbase, *oldbase= BASACT;
- char name[32];
-
- newob= add_object(scene, OB_EMPTY);
- if(gob)
- strcpy(name, gob->id.name+2);
- else
- strcpy(name, ob->id.name+2);
- strcat(name, "_proxy");
- rename_id(&newob->id, name);
-
- /* set layers OK */
- newbase= BASACT; /* add_object sets active... */
- newbase->lay= oldbase->lay;
- newob->lay= newbase->lay;
-
- /* remove base, leave user count of object, it gets linked in object_make_proxy */
- if(gob==NULL) {
- BLI_remlink(&scene->base, oldbase);
- MEM_freeN(oldbase);
- }
- object_make_proxy(newob, ob, gob);
-
- DAG_scene_sort(scene);
- DAG_object_flush_update(scene, newob, OB_RECALC);
- }
-}
-
-/* ******************** make parent operator *********************** */
-
-#define PAR_OBJECT 0
-#define PAR_ARMATURE 1
-#define PAR_BONE 2
-#define PAR_CURVE 3
-#define PAR_FOLLOW 4
-#define PAR_PATH_CONST 5
-#define PAR_LATTICE 6
-#define PAR_VERTEX 7
-#define PAR_TRIA 8
-
-static EnumPropertyItem prop_make_parent_types[] = {
- {PAR_OBJECT, "OBJECT", 0, "Object", ""},
- {PAR_ARMATURE, "ARMATURE", 0, "Armature Deform", ""},
- {PAR_BONE, "BONE", 0, "Bone", ""},
- {PAR_CURVE, "CURVE", 0, "Curve Deform", ""},
- {PAR_FOLLOW, "FOLLOW", 0, "Follow Path", ""},
- {PAR_PATH_CONST, "PATH_CONST", 0, "Path Constraint", ""},
- {PAR_LATTICE, "LATTICE", 0, "Lattice Deform", ""},
- {PAR_VERTEX, "VERTEX", 0, "Vertex", ""},
- {PAR_TRIA, "TRIA", 0, "Triangle", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-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);
-}
-
-
-static int parent_set_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- Object *par= CTX_data_active_object(C);
- bPoseChannel *pchan= NULL;
- int partype= RNA_enum_get(op->ptr, "type");
-
- par->recalc |= OB_RECALC_OB;
-
- /* preconditions */
- if(partype==PAR_FOLLOW || partype==PAR_PATH_CONST) {
- if(par->type!=OB_CURVE)
- return OPERATOR_CANCELLED;
- else {
- Curve *cu= par->data;
-
- if((cu->flag & CU_PATH)==0) {
- cu->flag |= CU_PATH|CU_FOLLOW;
- makeDispListCurveTypes(scene, par, 0); /* force creation of path data */
- }
- else cu->flag |= CU_FOLLOW;
-
- /* fall back on regular parenting now */
- partype= PAR_OBJECT;
- }
- }
- else if(partype==PAR_BONE) {
- pchan= get_active_posechannel(par);
-
- if(pchan==NULL) {
- error("No active Bone");
- return OPERATOR_CANCELLED;
- }
- }
-
- /* context itterator */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
-
- if(ob!=par) {
-
- if( test_parent_loop(par, ob) ) {
- error("Loop in parents");
- }
- else {
- Object workob;
-
- /* apply transformation of previous parenting */
- ED_object_apply_obmat(ob);
-
- ob->parent= par;
-
- /* handle types */
- if (pchan)
- strcpy (ob->parsubstr, pchan->name);
- else
- ob->parsubstr[0]= 0;
-
- /* constraint */
- if(partype==PAR_PATH_CONST) {
- bConstraint *con;
- bFollowPathConstraint *data;
- float cmat[4][4], vec[3];
-
- con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
- strcpy (con->name, "AutoPath");
-
- data = con->data;
- data->tar = par;
-
- add_constraint_to_object(con, ob);
-
- get_constraint_target_matrix(con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - give_timeoffset(ob));
- VecSubf(vec, ob->obmat[3], cmat[3]);
-
- ob->loc[0] = vec[0];
- ob->loc[1] = vec[1];
- }
- else if(partype==PAR_ARMATURE && ob->type==OB_MESH && par->type == OB_ARMATURE) {
-
- if(1) {
- /* Prompt the user as to whether he wants to
- * add some vertex groups based on the bones
- * in the parent armature.
- */
- create_vgroups_from_armature(scene, ob, par);
-
- /* get corrected inverse */
- ob->partype= PAROBJECT;
- what_does_parent(scene, ob, &workob);
-
- ob->partype= PARSKEL;
- }
- else
- what_does_parent(scene, ob, &workob);
-
- Mat4Invert(ob->parentinv, workob.obmat);
- }
- else {
- /* calculate inverse parent matrix */
- what_does_parent(scene, ob, &workob);
- Mat4Invert(ob->parentinv, workob.obmat);
- }
-
- ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
-
- if( ELEM3(partype, PAR_CURVE, PAR_ARMATURE, PAR_LATTICE) )
- ob->partype= PARSKEL; /* note, dna define, not operator property */
- else
- ob->partype= PAROBJECT; /* note, dna define, not operator property */
- }
- }
- }
- CTX_DATA_END;
-
- DAG_scene_sort(CTX_data_scene(C));
- ED_anim_dag_flush_update(C);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
-}
-
-static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- Object *ob= CTX_data_active_object(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", 0);
- uiLayout *layout= uiPupMenuLayout(pup);
-
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_OBJECT);
-
- /* ob becomes parent, make the associated menus */
- if(ob->type==OB_ARMATURE) {
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE);
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_BONE);
- }
- else if(ob->type==OB_CURVE) {
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_CURVE);
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_FOLLOW);
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_PATH_CONST);
- }
- else if(ob->type == OB_LATTICE) {
- uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_LATTICE);
- }
-
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
-
-
-void OBJECT_OT_parent_set(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Make parent";
- ot->description = "Set the object's parenting.";
- ot->idname= "OBJECT_OT_parent_set";
-
- /* api callbacks */
- ot->invoke= parent_set_invoke;
- ot->exec= parent_set_exec;
-
- ot->poll= ED_operator_object_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_make_parent_types, 0, "Type", "");
-}
-
-/* *** make track ***** */
-static EnumPropertyItem prop_make_track_types[] = {
- {1, "TRACKTO", 0, "TrackTo Constraint", ""},
- {2, "LOCKTRACK", 0, "LockTrack Constraint", ""},
- {3, "OLDTRACK", 0, "Old Track", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static int track_set_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
-
- if(RNA_enum_is_equal(op->ptr, "type", "TRACKTO")){
- bConstraint *con;
- bTrackToConstraint *data;
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if(base!=BASACT) {
- con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
- strcpy (con->name, "AutoTrack");
-
- data = con->data;
- data->tar = BASACT->object;
- base->object->recalc |= OB_RECALC;
-
- /* Lamp and Camera track differently by default */
- if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
- data->reserved1 = TRACK_nZ;
- data->reserved2 = UP_Y;
- }
-
- add_constraint_to_object(con, base->object);
- }
- }
- CTX_DATA_END;
- }
- else if(RNA_enum_is_equal(op->ptr, "type", "LOCKTRACK")){
- bConstraint *con;
- bLockTrackConstraint *data;
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if(base!=BASACT) {
- con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
- strcpy (con->name, "AutoTrack");
-
- data = con->data;
- data->tar = BASACT->object;
- base->object->recalc |= OB_RECALC;
-
- /* Lamp and Camera track differently by default */
- if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
- data->trackflag = TRACK_nZ;
- data->lockflag = LOCK_Y;
- }
-
- add_constraint_to_object(con, base->object);
- }
- }
- CTX_DATA_END;
- }
- else if(RNA_enum_is_equal(op->ptr, "type", "OLDTRACK")){
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if(base!=BASACT) {
- base->object->track= BASACT->object;
- base->object->recalc |= OB_RECALC;
- }
- }
- CTX_DATA_END;
- }
- DAG_scene_sort(CTX_data_scene(C));
- ED_anim_dag_flush_update(C);
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_track_set(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Make Track";
- ot->description = "Make the object track another object, either by constraint or old way or locked track.";
- ot->idname= "OBJECT_OT_track_set";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= track_set_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_make_track_types, 0, "Type", "");
-}
-
-/* ************* Make Dupli Real ********* */
-static void make_object_duplilist_real(Scene *scene, View3D *v3d, Base *base)
-{
- Base *basen;
- Object *ob;
- ListBase *lb;
- DupliObject *dob;
-
- if(!base && !(base = BASACT))
- return;
-
- if(!(base->object->transflag & OB_DUPLI))
- return;
-
- lb= object_duplilist(scene, base->object);
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects.");
- for(dob= lb->first; dob; dob= dob->next) {
- ob= copy_object(dob->ob);
- /* font duplis can have a totcol without material, we get them from parent
- * should be implemented better...
- */
- if(ob->mat==NULL) ob->totcol= 0;
-
- basen= MEM_dupallocN(base);
- basen->flag &= ~OB_FROMDUPLI;
- BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
- basen->object= ob;
- ob->ipo= NULL; /* make sure apply works */
- ob->parent= ob->track= NULL;
- ob->disp.first= ob->disp.last= NULL;
- ob->transflag &= ~OB_DUPLI;
-
- Mat4CpyMat4(ob->obmat, dob->mat);
- ED_object_apply_obmat(ob);
- }
-
- copy_object_set_idnew(scene, v3d, 0);
-
- free_object_duplilist(lb);
-
- base->object->transflag &= ~OB_DUPLI;
}
-static int object_dupli_set_real_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
-
- clear_id_newpoins();
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- make_object_duplilist_real(scene, v3d, base);
- }
- CTX_DATA_END;
-
- DAG_scene_sort(CTX_data_scene(C));
- ED_anim_dag_flush_update(C);
- WM_event_add_notifier(C, NC_SCENE, CTX_data_scene(C));
-
- return OPERATOR_FINISHED;
-}
-
-void OBJECT_OT_dupli_set_real(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Make Dupli Real";
- ot->description = "Make dupli objects attached to this object real.";
- ot->idname= "OBJECT_OT_dupli_set_real";
-
- /* api callbacks */
- ot->invoke= WM_operator_confirm;
- ot->exec= object_dupli_set_real_exec;
-
- ot->poll= ED_operator_scene_editable;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-/* ******************* Set Object Center ********************** */
-
-static EnumPropertyItem prop_set_center_types[] = {
- {0, "CENTER", 0, "ObData to Center", "Move object data around Object center"},
- {1, "CENTERNEW", 0, "Center New", "Move Object center to center of object data"},
- {2, "CENTERCURSOR", 0, "Center Cursor", "Move Object Center to position of the 3d cursor"},
- {0, NULL, 0, NULL, NULL}
-};
-
-/* 0 == do center, 1 == center new, 2 == center cursor */
-static int object_center_set_exec(bContext *C, wmOperator *op)
-{
- 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 *ob;
- Mesh *me, *tme;
- Curve *cu;
-/* BezTriple *bezt;
- BPoint *bp; */
- Nurb *nu, *nu1;
- EditVert *eve;
- float cent[3], centn[3], min[3], max[3], omat[3][3];
- int a, total= 0;
- int centermode = RNA_enum_get(op->ptr, "type");
-
- /* keep track of what is changed */
- int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
- MVert *mvert;
-
- if(scene->id.lib || v3d==NULL){
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data");
- return OPERATOR_CANCELLED;
- }
- if (obedit && centermode > 0) {
- BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
- return OPERATOR_CANCELLED;
- }
- cent[0]= cent[1]= cent[2]= 0.0;
-
- if(obedit) {
-
- INIT_MINMAX(min, max);
-
- if(obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(v3d->around==V3D_CENTROID) {
- total++;
- VECADD(cent, cent, eve->co);
- }
- else {
- DO_MINMAX(eve->co, min, max);
- }
- }
-
- if(v3d->around==V3D_CENTROID) {
- VecMulf(cent, 1.0f/(float)total);
- }
- else {
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- for(eve= em->verts.first; eve; eve= eve->next) {
- VecSubf(eve->co, eve->co, cent);
- }
-
- recalc_editnormals(em);
- tot_change++;
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- BKE_mesh_end_editmesh(me, em);
- }
- }
-
- /* reset flags */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- base->object->flag &= ~OB_DONE;
- }
- CTX_DATA_END;
-
- for (me= G.main->mesh.first; me; me= me->id.next) {
- me->flag &= ~ME_ISDONE;
- }
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- if((base->object->flag & OB_DONE)==0) {
- base->object->flag |= OB_DONE;
-
- if(obedit==NULL && (me=get_mesh(base->object)) ) {
- if (me->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- Mat4Invert(base->object->imat, base->object->obmat);
- Mat4MulVecfl(base->object->imat, cent);
- } else {
- INIT_MINMAX(min, max);
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- DO_MINMAX(mvert->co, min, max);
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- VecSubf(mvert->co, mvert->co, cent);
- }
-
- if (me->key) {
- KeyBlock *kb;
- for (kb=me->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- VecSubf(fp, fp, cent);
- }
- }
- }
-
- me->flag |= ME_ISDONE;
-
- if(centermode) {
- Mat3CpyMat4(omat, base->object->obmat);
-
- VECCOPY(centn, cent);
- Mat3MulVecfl(omat, centn);
- base->object->loc[0]+= centn[0];
- base->object->loc[1]+= centn[1];
- base->object->loc[2]+= centn[2];
-
- where_is_object(scene, base->object);
- ignore_parent_tx(scene, base->object);
-
- /* other users? */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- ob = base->object;
- if((ob->flag & OB_DONE)==0) {
- tme= get_mesh(ob);
-
- if(tme==me) {
-
- ob->flag |= OB_DONE;
- ob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
-
- Mat3CpyMat4(omat, ob->obmat);
- VECCOPY(centn, cent);
- Mat3MulVecfl(omat, centn);
- ob->loc[0]+= centn[0];
- ob->loc[1]+= centn[1];
- ob->loc[2]+= centn[2];
-
- where_is_object(scene, ob);
- ignore_parent_tx(scene, ob);
-
- if(tme && (tme->flag & ME_ISDONE)==0) {
- mvert= tme->mvert;
- for(a=0; a<tme->totvert; a++, mvert++) {
- VecSubf(mvert->co, mvert->co, cent);
- }
-
- if (tme->key) {
- KeyBlock *kb;
- for (kb=tme->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3) {
- VecSubf(fp, fp, cent);
- }
- }
- }
-
- tme->flag |= ME_ISDONE;
- }
- }
- }
-
- ob= ob->id.next;
- }
- CTX_DATA_END;
- }
- tot_change++;
- }
- }
- else if (ELEM(base->object->type, OB_CURVE, OB_SURF)) {
-
- /* weak code here... (ton) */
- if(obedit==base->object) {
- ListBase *editnurb= curve_get_editcurve(obedit);
-
- nu1= editnurb->first;
- cu= obedit->data;
- }
- else {
- cu= base->object->data;
- nu1= cu->nurb.first;
- }
-
- if (cu->id.lib) {
- tot_lib_error++;
- } else {
- if(centermode==2) {
- VECCOPY(cent, give_cursor(scene, v3d));
- Mat4Invert(base->object->imat, base->object->obmat);
- Mat4MulVecfl(base->object->imat, cent);
-
- /* don't allow Z change if curve is 2D */
- if( !( cu->flag & CU_3D ) )
- cent[2] = 0.0;
- }
- else {
- INIT_MINMAX(min, max);
-
- nu= nu1;
- while(nu) {
- minmaxNurb(nu, min, max);
- nu= nu->next;
- }
-
- cent[0]= (min[0]+max[0])/2.0f;
- cent[1]= (min[1]+max[1])/2.0f;
- cent[2]= (min[2]+max[2])/2.0f;
- }
-
- nu= nu1;
- while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
- a= nu->pntsu;
- while (a--) {
- VecSubf(nu->bezt[a].vec[0], nu->bezt[a].vec[0], cent);
- VecSubf(nu->bezt[a].vec[1], nu->bezt[a].vec[1], cent);
- VecSubf(nu->bezt[a].vec[2], nu->bezt[a].vec[2], cent);
- }
- }
- else {
- a= nu->pntsu*nu->pntsv;
- while (a--)
- VecSubf(nu->bp[a].vec, nu->bp[a].vec, cent);
- }
- nu= nu->next;
- }
-
- if(centermode && obedit==0) {
- Mat3CpyMat4(omat, base->object->obmat);
-
- Mat3MulVecfl(omat, cent);
- base->object->loc[0]+= cent[0];
- base->object->loc[1]+= cent[1];
- base->object->loc[2]+= cent[2];
-
- where_is_object(scene, base->object);
- ignore_parent_tx(scene, base->object);
- }
-
- tot_change++;
- if(obedit) {
- if (centermode==0) {
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- }
- break;
- }
- }
- }
- else if(base->object->type==OB_FONT) {
- /* get from bb */
-
- cu= base->object->data;
-
- if(cu->bb==0) {
- /* do nothing*/
- } else if (cu->id.lib) {
- tot_lib_error++;
- } else {
- cu->xof= -0.5f*( cu->bb->vec[4][0] - cu->bb->vec[0][0]);
- cu->yof= -0.5f -0.5f*( cu->bb->vec[0][1] - cu->bb->vec[2][1]); /* extra 0.5 is the height o above line */
-
- /* not really ok, do this better once! */
- cu->xof /= cu->fsize;
- cu->yof /= cu->fsize;
-
- tot_change++;
- }
- }
- else if(base->object->type==OB_ARMATURE) {
- bArmature *arm = base->object->data;
-
- if (arm->id.lib) {
- tot_lib_error++;
- } else if(arm->id.us>1) {
- /*error("Can't apply to a multi user armature");
- return;*/
- tot_multiuser_arm_error++;
- } else {
- /* Function to recenter armatures in editarmature.c
- * Bone + object locations are handled there.
- */
- docenter_armature(scene, v3d, base->object, centermode);
- tot_change++;
-
- where_is_object(scene, base->object);
- ignore_parent_tx(scene, base->object);
-
- if(obedit)
- break;
- }
- }
- base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA;
- }
- }
- CTX_DATA_END;
-
- if (tot_change) {
- ED_anim_dag_flush_update(C);
- }
-
- /* Warn if any errors occured */
- if (tot_lib_error+tot_multiuser_arm_error) {
- BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change);
- if (tot_lib_error)
- BKE_reportf(op->reports, RPT_WARNING, "|%i linked library objects",tot_lib_error);
- if (tot_multiuser_arm_error)
- BKE_reportf(op->reports, RPT_WARNING, "|%i multiuser armature object(s)",tot_multiuser_arm_error);
- }
-
- return OPERATOR_FINISHED;
-}
-void OBJECT_OT_center_set(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Set Center";
- ot->description = "Set the object's center, by either moving the data, or set to center of data, or use 3d cursor";
- ot->idname= "OBJECT_OT_center_set";
-
- /* api callbacks */
- ot->invoke= WM_menu_invoke;
- ot->exec= object_center_set_exec;
-
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "type", prop_set_center_types, 0, "Type", "");
-}
/* ******************* toggle editmode operator ***************** */
void ED_object_exit_editmode(bContext *C, int flag)
@@ -3208,13 +301,17 @@ void ED_object_exit_editmode(bContext *C, int flag)
}
load_editMesh(scene, obedit);
- if(freedata) free_editMesh(me->edit_mesh);
+ if(freedata) {
+ free_editMesh(me->edit_mesh);
+ MEM_freeN(me->edit_mesh);
+ me->edit_mesh= NULL;
+ }
- if(G.f & G_WEIGHTPAINT)
+ if(obedit->restore_mode & OB_MODE_WEIGHT_PAINT)
mesh_octree_table(obedit, NULL, NULL, 'e');
}
else if (obedit->type==OB_ARMATURE) {
- ED_armature_from_edit(scene, obedit);
+ ED_armature_from_edit(obedit);
if(freedata)
ED_armature_edit_free(obedit);
}
@@ -3231,18 +328,29 @@ void ED_object_exit_editmode(bContext *C, int flag)
if(freedata) free_editLatt(obedit);
}
else if(obedit->type==OB_MBALL) {
-// extern ListBase editelems;
-// load_editMball();
-// if(freedata) BLI_freelistN(&editelems);
+ load_editMball(obedit);
+ if(freedata) free_editMball(obedit);
}
-
+
/* freedata only 0 now on file saves */
if(freedata) {
+ ListBase pidlist;
+ PTCacheID *pid;
+
/* for example; displist make is different in editmode */
scene->obedit= NULL; // XXX for context
+
+ /* flag object caches as outdated */
+ BKE_ptcache_ids_from_object(&pidlist, obedit);
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->type != PTCACHE_TYPE_PARTICLES) /* particles don't need reset on geometry change */
+ pid->cache->flag |= PTCACHE_OUTDATED;
+ }
+ BKE_ptcache_object_reset(scene, obedit, PTCACHE_RESET_OUTDATED);
+
/* also flush ob recalc, doesn't take much overhead, but used for particles */
- DAG_object_flush_update(scene, obedit, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_flush_update(&obedit->id, OB_RECALC_OB|OB_RECALC_DATA);
ED_undo_push(C, "Editmode");
@@ -3250,6 +358,9 @@ void ED_object_exit_editmode(bContext *C, int flag)
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, scene);
}
+
+ obedit->mode &= ~OB_MODE_EDIT;
+ ED_object_toggle_modes(C, obedit->restore_mode);
}
@@ -3257,7 +368,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
{
Scene *scene= CTX_data_scene(C);
Base *base= CTX_data_active_base(C);
- Object *ob= base->object;
+ Object *ob;
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= NULL;
int ok= 0;
@@ -3265,11 +376,15 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(scene->id.lib) return;
if(base==NULL) return;
- if(sa->spacetype==SPACE_VIEW3D)
+ if(sa && sa->spacetype==SPACE_VIEW3D)
v3d= sa->spacedata.first;
- if((v3d==NULL || (base->lay & v3d->lay))==0) return;
-
+ if(v3d && (base->lay & v3d->lay)==0) return;
+ else if(!v3d && (base->lay & scene->lay)==0) return;
+
+ ob = base->object;
+
+ if(ob==NULL) return;
if(ob->data==NULL) return;
if (object_data_is_libdata(ob)) {
@@ -3279,7 +394,10 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(flag & EM_WAITCURSOR) waitcursor(1);
- ED_view3d_exit_paint_modes(C);
+ ob->restore_mode = ob->mode;
+ ED_object_toggle_modes(C, ob->mode);
+
+ ob->mode |= OB_MODE_EDIT;
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
@@ -3311,7 +429,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_object_flush_update(scene, ob, OB_RECALC);
+ DAG_id_flush_update(&ob->id, OB_RECALC);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, scene);
}
@@ -3319,14 +437,15 @@ void ED_object_enter_editmode(bContext *C, int flag)
scene->obedit= ob; // XXX for context
ok= 1;
make_editText(ob);
+
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_TEXT, scene);
}
else if(ob->type==OB_MBALL) {
scene->obedit= ob; // XXX for context
-// ok= 1;
-// XXX make_editMball();
+ ok= 1;
+ make_editMball(ob);
+
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MBALL, scene);
-
}
else if(ob->type==OB_LATTICE) {
scene->obedit= ob; // XXX for context
@@ -3344,7 +463,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
}
if(ok) {
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
scene->obedit= NULL; // XXX for context
@@ -3366,6 +485,16 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+static int editmode_toggle_poll(bContext *C)
+{
+ Object *ob = CTX_data_active_object(C);
+
+ return ob && (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);
+}
+
void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
{
@@ -3377,7 +506,7 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
/* api callbacks */
ot->exec= editmode_toggle_exec;
- ot->poll= ED_operator_object_active;
+ ot->poll= editmode_toggle_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -3385,66 +514,51 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
/* *************************** */
-
-void check_editmode(int type)
-{
- Object *obedit= NULL; // XXX
-
- if (obedit==NULL || obedit->type==type) return;
-
-// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
-}
-void movetolayer(Scene *scene, View3D *v3d)
+static int posemode_exec(bContext *C, wmOperator *op)
{
- Base *base;
- unsigned int lay= 0, local;
- int islamp= 0;
-
- if(scene->id.lib) return;
-
- for(base= FIRSTBASE; base; base= base->next) {
- if (TESTBASE(v3d, base)) lay |= base->lay;
- }
- if(lay==0) return;
- lay &= 0xFFFFFF;
-
- if(lay==0) return;
+ Base *base= CTX_data_active_base(C);
- if(v3d->localview) {
- /* now we can move out of localview. */
- if (!okee("Move from localview")) return;
- for(base= FIRSTBASE; base; base= base->next) {
- if (TESTBASE(v3d, base)) {
- lay= base->lay & ~v3d->lay;
- base->lay= lay;
- base->object->lay= lay;
- base->object->flag &= ~SELECT;
- base->flag &= ~SELECT;
- if(base->object->type==OB_LAMP) islamp= 1;
- }
+ if(base->object->type==OB_ARMATURE) {
+ if(base->object==CTX_data_edit_object(C)) {
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ ED_armature_enter_posemode(C, base);
}
- } else {
-// XXX if( movetolayer_buts(&lay, NULL)==0 ) return;
+ else if(base->object->mode & OB_MODE_POSE)
+ ED_armature_exit_posemode(C, base);
+ else
+ ED_armature_enter_posemode(C, base);
- /* normal non localview operation */
- for(base= FIRSTBASE; base; base= base->next) {
- if (TESTBASE(v3d, base)) {
- /* upper byte is used for local view */
- local= base->lay & 0xFF000000;
- base->lay= lay + local;
- base->object->lay= lay;
- if(base->object->type==OB_LAMP) islamp= 1;
- }
- }
+ return OPERATOR_FINISHED;
}
- if(islamp) reshadeall_displist(scene); /* only frees */
- /* warning, active object may be hidden now */
+ return OPERATOR_PASS_THROUGH;
+}
+
+void OBJECT_OT_posemode_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Pose Mode";
+ ot->idname= "OBJECT_OT_posemode_toggle";
+ ot->description= "Enables or disables posing/selecting bones";
- DAG_scene_sort(scene);
+ /* api callbacks */
+ ot->exec= posemode_exec;
+ ot->poll= ED_operator_object_active;
+ /* flag */
+ ot->flag= OPTYPE_REGISTER;
}
+/* *********************** */
+
+void check_editmode(int type)
+{
+ Object *obedit= NULL; // XXX
+
+ if (obedit==NULL || obedit->type==type) return;
+
+// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
+}
#if 0
// XXX should be in view3d?
@@ -3575,18 +689,16 @@ void special_editmenu(Scene *scene, View3D *v3d)
// XXX static short numcuts= 2;
Object *ob= OBACT;
Object *obedit= NULL; // XXX
- float fac;
int nr,ret=0;
- short randfac;
if(ob==NULL) return;
if(obedit==NULL) {
- if(ob->flag & OB_POSEMODE) {
+ if(ob->mode & OB_MODE_POSE) {
// XXX pose_special_editmenu();
}
- else if(FACESEL_PAINT_TEST) {
+ else if(paint_facesel_test(ob)) {
Mesh *me= get_mesh(ob);
MTFace *tface;
MFace *mface;
@@ -3630,9 +742,9 @@ void special_editmenu(Scene *scene, View3D *v3d)
}
}
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
- else if(G.f & G_VERTEXPAINT) {
+ else if(ob->mode & OB_MODE_VERTEX_PAINT) {
Mesh *me= get_mesh(ob);
if(me==0 || (me->mcol==NULL && me->mtface==NULL) ) return;
@@ -3642,20 +754,20 @@ void special_editmenu(Scene *scene, View3D *v3d)
// XXX do_shared_vertexcol(me);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
- else if(G.f & G_WEIGHTPAINT) {
+ else if(ob->mode & OB_MODE_WEIGHT_PAINT) {
Object *par= modifiers_isDeformedByArmature(ob);
- if(par && (par->flag & OB_POSEMODE)) {
+ if(par && (par->mode & OB_MODE_POSE)) {
nr= pupmenu("Specials%t|Apply Bone Envelopes to Vertex Groups %x1|Apply Bone Heat Weights to Vertex Groups %x2");
// XXX if(nr==1 || nr==2)
// XXX pose_adds_vgroups(ob, (nr == 2));
}
}
- else if(G.f & G_PARTICLEEDIT) {
+ else if(ob->mode & OB_MODE_PARTICLE_EDIT) {
#if 0
// XXX
ParticleSystem *psys = PE_get_current(ob);
@@ -3689,7 +801,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
break;
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
if(nr>0) waitcursor(0);
#endif
@@ -3766,144 +878,8 @@ void special_editmenu(Scene *scene, View3D *v3d)
}
}
else if(obedit->type==OB_MESH) {
- /* This is all that is needed, since all other functionality is in Ctrl+ V/E/F but some users didnt like, so for now have the old/big menu */
- /*
- nr= pupmenu("Subdivide Mesh%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x4");
- switch(nr) {
- case 1:
- waitcursor(1);
- esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, 1, 0);
-
- break;
- case 2:
- if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
- waitcursor(1);
- esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, numcuts, 0);
- break;
- case 3:
- if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
- randfac= 10;
- if(button(&randfac, 1, 100, "Rand fac:")==0) return;
- waitcursor(1);
- fac= -( (float)randfac )/100;
- esubdivideflag(1, fac, scene->toolsettings->editbutflag, numcuts, 0);
- break;
-
- case 4:
- fac= 1.0f;
- if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
- fac= 0.292f*fac;
-
- waitcursor(1);
- esubdivideflag(1, fac, scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
- break;
- }
- */
-
- nr= pupmenu("Specials%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x12|Merge%x4|Remove Doubles%x5|Hide%x6|Reveal%x7|Select Swap%x8|Flip Normals %x9|Smooth %x10|Bevel %x11|Set Smooth %x14|Set Solid %x15|Blend From Shape%x16|Propagate To All Shapes%x17|Select Vertex Path%x18");
-
- switch(nr) {
- case 1:
- waitcursor(1);
-// XXX esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, 1, 0);
-
- break;
- case 2:
-// XXX if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
- waitcursor(1);
-// XXX esubdivideflag(1, 0.0, scene->toolsettings->editbutflag, numcuts, 0);
- break;
- case 3:
-// XXX if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
- randfac= 10;
-// XXX if(button(&randfac, 1, 100, "Rand fac:")==0) return;
- waitcursor(1);
- fac= -( (float)randfac )/100;
-// XXX esubdivideflag(1, fac, scene->toolsettings->editbutflag, numcuts, 0);
- break;
-
- case 12: /* smooth */
- /* if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return; */
- fac= 1.0f;
-// XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
-// XXX fac= 0.292f*fac;
-
- waitcursor(1);
-// XXX esubdivideflag(1, fac, scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
- break;
-
- case 4:
-// XXX mergemenu();
- break;
- case 5:
-// XXX notice("Removed %d Vertices", removedoublesflag(1, 0, scene->toolsettings->doublimit));
- break;
- case 6:
-// XXX hide_mesh(0);
- break;
- case 7:
-// XXX reveal_mesh();
- break;
- case 8:
-// XXX selectswap_mesh();
- break;
- case 9:
-// XXX flip_editnormals();
- break;
- case 10:
-// XXX vertexsmooth();
- break;
- case 11:
-// XXX bevel_menu();
- break;
- case 14:
-// XXX mesh_set_smooth_faces(1);
- break;
- case 15:
-// XXX mesh_set_smooth_faces(0);
- break;
- case 16:
-// XXX shape_copy_select_from();
- break;
- case 17:
-// XXX shape_propagate();
- break;
- case 18:
-// XXX pathselect();
- break;
- }
-
-
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-
- if(nr>0) waitcursor(0);
-
}
else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) {
-
- nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set Goal Weight%x3|Set Radius%x4|Smooth%x5|Smooth Radius%x6");
-
- switch(nr) {
- case 1:
-// XXX subdivideNurb();
- break;
- case 2:
-// XXX switchdirectionNurb2();
- break;
- case 3:
-// XXX setweightNurb();
- break;
- case 4:
-// XXX setradiusNurb();
- break;
- case 5:
-// XXX smoothNurb();
- break;
- case 6:
-// XXX smoothradiusNurb();
- break;
- }
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
}
else if(obedit->type==OB_ARMATURE) {
nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Switch Direction%x7|Flip Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName Top-Bottom%x6");
@@ -3940,241 +916,6 @@ void special_editmenu(Scene *scene, View3D *v3d)
}
-static void curvetomesh(Scene *scene, Object *ob)
-{
- Curve *cu;
- DispList *dl;
-
- ob->flag |= OB_DONE;
- cu= ob->data;
-
- dl= cu->disp.first;
- if(dl==0) makeDispListCurveTypes(scene, ob, 0); /* force creation */
-
- nurbs_to_mesh(ob); /* also does users */
- if (ob->type != OB_MESH) {
- error("can't convert curve to mesh");
- } else {
- object_free_modifiers(ob);
- }
-}
-
-void convertmenu(Scene *scene, View3D *v3d)
-{
- Base *base, *basen=NULL, *basact, *basedel=NULL;
- Object *obact, *ob, *ob1;
- Object *obedit= NULL; // XXX
- Curve *cu;
- Nurb *nu;
- MetaBall *mb;
- Mesh *me;
- int ok=0, nr = 0, a;
-
- if(scene->id.lib) return;
-
- obact= OBACT;
- if (obact == NULL) return;
- if(!obact->flag & SELECT) return;
- if(obedit) return;
-
- basact= BASACT; /* will be restored */
-
- if(obact->type==OB_FONT) {
- nr= pupmenu("Convert Font to%t|Curve%x1|Curve (Single filling group)%x2|Mesh%x3");
- if(nr>0) ok= 1;
- }
- else if(obact->type==OB_MBALL) {
- nr= pupmenu("Convert Metaball to%t|Mesh (keep original)%x1|Mesh (Delete Original)%x2");
- if(nr>0) ok= 1;
- }
- else if(obact->type==OB_CURVE) {
- nr= pupmenu("Convert Curve to%t|Mesh");
- if(nr>0) ok= 1;
- }
- else if(obact->type==OB_SURF) {
- nr= pupmenu("Convert Nurbs Surface to%t|Mesh");
- if(nr>0) ok= 1;
- }
- else if(obact->type==OB_MESH) {
- nr= pupmenu("Convert Modifiers to%t|Mesh (Keep Original)%x1|Mesh (Delete Original)%x2");
- if(nr>0) ok= 1;
- }
- if(ok==0) return;
-
- /* don't forget multiple users! */
-
- /* reset flags */
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- base->object->flag &= ~OB_DONE;
- }
- }
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
-
- ob= base->object;
-
- if(ob->flag & OB_DONE);
- else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
- DerivedMesh *dm;
-
- basedel = base;
-
- ob->flag |= OB_DONE;
-
- ob1= copy_object(ob);
- ob1->recalc |= OB_RECALC;
-
- basen= MEM_mallocN(sizeof(Base), "duplibase");
- *basen= *base;
- BLI_addhead(&scene->base, basen); /* addhead: otherwise eternal loop */
- basen->object= ob1;
- basen->flag |= SELECT;
- base->flag &= ~SELECT;
- ob->flag &= ~SELECT;
-
- /* decrement original mesh's usage count */
- me= ob1->data;
- me->id.us--;
-
- /* make a new copy of the mesh */
- ob1->data= copy_mesh(me);
-
- /* make new mesh data from the original copy */
- dm= mesh_get_derived_final(scene, ob1, CD_MASK_MESH);
- /* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
-
- DM_to_mesh(dm, ob1->data);
-
- dm->release(dm);
- object_free_modifiers(ob1); /* after derivedmesh calls! */
-
- /* If the original object is active then make this object active */
- if (ob == obact) {
- // XXX ED_base_object_activate(C, basen);
- basact = basen;
- }
- }
- else if(ob->type==OB_FONT) {
- ob->flag |= OB_DONE;
-
- ob->type= OB_CURVE;
- cu= ob->data;
-
- if(cu->vfont) {
- cu->vfont->id.us--;
- cu->vfont= 0;
- }
- if(cu->vfontb) {
- cu->vfontb->id.us--;
- cu->vfontb= 0;
- }
- if(cu->vfonti) {
- cu->vfonti->id.us--;
- cu->vfonti= 0;
- }
- if(cu->vfontbi) {
- cu->vfontbi->id.us--;
- cu->vfontbi= 0;
- }
- /* other users */
- if(cu->id.us>1) {
- ob1= G.main->object.first;
- while(ob1) {
- if(ob1->data==cu) {
- ob1->type= OB_CURVE;
- ob1->recalc |= OB_RECALC;
- }
- ob1= ob1->id.next;
- }
- }
- if (nr==2 || nr==3) {
- nu= cu->nurb.first;
- while(nu) {
- nu->charidx= 0;
- nu= nu->next;
- }
- }
- if (nr==3) {
- curvetomesh(scene, ob);
- }
- }
- else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- if(nr==1) {
- curvetomesh(scene, ob);
- }
- }
- else if(ob->type==OB_MBALL) {
-
- if(nr==1 || nr == 2) {
- ob= find_basis_mball(scene, ob);
-
- if(ob->disp.first && !(ob->flag&OB_DONE)) {
- basedel = base;
-
- ob->flag |= OB_DONE;
-
- ob1= copy_object(ob);
- ob1->recalc |= OB_RECALC;
-
- basen= MEM_mallocN(sizeof(Base), "duplibase");
- *basen= *base;
- BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
- basen->object= ob1;
- basen->flag |= SELECT;
- basedel->flag &= ~SELECT;
- ob->flag &= ~SELECT;
-
- mb= ob1->data;
- mb->id.us--;
-
- ob1->data= add_mesh("Mesh");
- ob1->type= OB_MESH;
-
- me= ob1->data;
- me->totcol= mb->totcol;
- if(ob1->totcol) {
- me->mat= MEM_dupallocN(mb->mat);
- for(a=0; a<ob1->totcol; a++) id_us_plus((ID *)me->mat[a]);
- }
-
- mball_to_mesh(&ob->disp, ob1->data);
-
- /* So we can see the wireframe */
- BASACT= basen;
-
- /* If the original object is active then make this object active */
- if (ob == obact) {
- // XXX ED_base_object_activate(C, basen);
- basact = basen;
- }
-
- }
- }
- }
- }
- if(basedel != NULL && nr == 2) {
- ED_base_object_free_and_unlink(scene, basedel);
- }
- basedel = NULL;
- }
-
- /* delete object should renew depsgraph */
- if(nr==2)
- DAG_scene_sort(scene);
-
- /* texspace and normals */
- if(!basen) BASACT= base;
-
-// XXX ED_object_enter_editmode(C, 0);
-// XXX exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
- BASACT= basact;
-
-
- DAG_scene_sort(scene);
-}
-
/* Change subdivision or particle properties of mesh object ob, if level==-1
* then toggle subsurf, else set to level set allows to toggle multiple
* selections */
@@ -4248,7 +989,7 @@ static void object_flip_subdivison_particles(Scene *scene, Object *ob, int *set,
}
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
if(ob->dup_group && depth<=4) {
@@ -4852,1306 +1593,74 @@ void copy_attr_menu(Scene *scene, View3D *v3d)
copy_attr(scene, v3d, event);
}
+/********************** Smooth/Flat *********************/
-void link_to_scene(unsigned short nr)
-{
-#if 0
- Scene *sce= (Scene*) BLI_findlink(&G.main->scene, G.curscreen->scenenr-1);
- Base *base, *nbase;
-
- if(sce==0) return;
- if(sce->id.lib) return;
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASE(v3d, base)) {
-
- nbase= MEM_mallocN( sizeof(Base), "newbase");
- *nbase= *base;
- BLI_addhead( &(sce->base), nbase);
- id_us_plus((ID *)base->object);
- }
- }
-#endif
-}
-
-
-void make_links(Scene *scene, View3D *v3d, short event)
-{
- Object *ob, *obt;
- Base *base, *nbase, *sbase;
- Scene *sce = NULL;
- ID *id;
- int a;
- short nr=0;
- char *strp;
-
- if(!(ob=OBACT)) return;
-
- if(event==1) {
- IDnames_to_pupstring(&strp, NULL, NULL, &(G.main->scene), 0, &nr);
-
- if(nr == -2) {
- MEM_freeN(strp);
-
-// XXX activate_databrowse((ID *)scene, ID_SCE, 0, B_INFOSCE, &(G.curscreen->scenenr), link_to_scene );
-
- return;
- }
- else {
- event= pupmenu_col(strp, 20);
- MEM_freeN(strp);
-
- if(event<= 0) return;
-
- nr= 1;
- sce= G.main->scene.first;
- while(sce) {
- if(nr==event) break;
- nr++;
- sce= sce->id.next;
- }
- if(sce==scene) {
- error("This is the current scene");
- return;
- }
- if(sce==0 || sce->id.lib) return;
-
- /* remember: is needed below */
- event= 1;
- }
- }
-
- /* All non group linking */
- for(base= FIRSTBASE; base; base= base->next) {
- if(event==1 || base != BASACT) {
-
- obt= base->object;
-
- if(TESTBASE(v3d, base)) {
-
- if(event==1) { /* to scene */
-
- /* test if already linked */
- sbase= sce->base.first;
- while(sbase) {
- if(sbase->object==base->object) break;
- sbase= sbase->next;
- }
- if(sbase) { /* remove */
- continue;
- }
-
- nbase= MEM_mallocN( sizeof(Base), "newbase");
- *nbase= *base;
- BLI_addhead( &(sce->base), nbase);
- id_us_plus((ID *)base->object);
- }
- }
- if(TESTBASELIB(v3d, base)) {
- if(event==2 || event==5) { /* obdata */
- if(ob->type==obt->type) {
-
- id= obt->data;
- id->us--;
-
- id= ob->data;
- id_us_plus(id);
- obt->data= id;
-
- /* if amount of material indices changed: */
- test_object_materials(obt->data);
-
- obt->recalc |= OB_RECALC_DATA;
- }
- }
- else if(event==4) { /* ob ipo */
-#if 0 // XXX old animation system
- if(obt->ipo) obt->ipo->id.us--;
- obt->ipo= ob->ipo;
- if(obt->ipo) {
- id_us_plus((ID *)obt->ipo);
- do_ob_ipo(scene, obt);
- }
-#endif // XXX old animation system
- }
- else if(event==6) {
- if(ob->dup_group) ob->dup_group->id.us--;
- obt->dup_group= ob->dup_group;
- if(obt->dup_group) {
- id_us_plus((ID *)obt->dup_group);
- obt->transflag |= OB_DUPLIGROUP;
- }
- }
- else if(event==3) { /* materials */
-
- /* new approach, using functions from kernel */
- for(a=0; a<ob->totcol; a++) {
- Material *ma= give_current_material(ob, a+1);
- assign_material(obt, ma, a+1); /* also works with ma==NULL */
- }
- }
- }
- }
- }
-
- ED_anim_dag_flush_update(C);
-
-}
-
-void make_links_menu(Scene *scene, View3D *v3d)
+static int shade_smooth_exec(bContext *C, wmOperator *op)
{
Object *ob;
- short event=0;
- char str[140];
-
- if(!(ob=OBACT)) return;
-
- strcpy(str, "Make Links %t|To Scene...%x1|%l|Object Ipo%x4");
-
- if(ob->type==OB_MESH)
- strcat(str, "|Mesh Data%x2|Materials%x3");
- else if(ob->type==OB_CURVE)
- strcat(str, "|Curve Data%x2|Materials%x3");
- else if(ob->type==OB_FONT)
- strcat(str, "|Text Data%x2|Materials%x3");
- else if(ob->type==OB_SURF)
- strcat(str, "|Surface Data%x2|Materials%x3");
- else if(ob->type==OB_MBALL)
- strcat(str, "|Materials%x3");
- else if(ob->type==OB_CAMERA)
- strcat(str, "|Camera Data%x2");
- else if(ob->type==OB_LAMP)
- strcat(str, "|Lamp Data%x2");
- else if(ob->type==OB_LATTICE)
- strcat(str, "|Lattice Data%x2");
- else if(ob->type==OB_ARMATURE)
- strcat(str, "|Armature Data%x2");
-
- event= pupmenu(str);
-
- if(event<= 0) return;
-
- make_links(scene, v3d, event);
-}
-
-static void apply_objects_internal(Scene *scene, View3D *v3d, int apply_scale, int apply_rot )
-{
- Base *base, *basact;
- Object *ob;
- bArmature *arm;
- Mesh *me;
Curve *cu;
Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- MVert *mvert;
- float mat[3][3];
- int a, change = 0;
-
- if (!apply_scale && !apply_rot) {
- /* do nothing? */
- error("Nothing to do!");
- return;
- }
- /* first check if we can execute */
- for (base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- ob= base->object;
- if(ob->type==OB_MESH) {
- me= ob->data;
-
- if(me->id.us>1) {
- error("Can't apply to a multi user mesh, doing nothing.");
- return;
- }
- }
- else if (ob->type==OB_ARMATURE) {
- arm= ob->data;
-
- if(arm->id.us>1) {
- error("Can't apply to a multi user armature, doing nothing.");
- return;
- }
- }
- else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- cu= ob->data;
-
- if(cu->id.us>1) {
- error("Can't apply to a multi user curve, doing nothing.");
- return;
- }
- if(cu->key) {
- error("Can't apply to a curve with vertex keys, doing nothing.");
- return;
- }
- }
- }
- }
-
- /* now execute */
- basact= BASACT;
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- ob= base->object;
-
- if(ob->type==OB_MESH) {
- /* calculate matrix */
- if (apply_scale && apply_rot)
- object_to_mat3(ob, mat);
- else if (apply_scale)
- object_scale_to_mat3(ob, mat);
- else
- object_rot_to_mat3(ob, mat);
-
- /* get object data */
- me= ob->data;
-
- /* adjust data */
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- Mat3MulVecfl(mat, mvert->co);
- }
-
- if (me->key) {
- KeyBlock *kb;
-
- for (kb=me->key->block.first; kb; kb=kb->next) {
- float *fp= kb->data;
-
- for (a=0; a<kb->totelem; a++, fp+=3)
- Mat3MulVecfl(mat, fp);
- }
- }
-
- /* adjust transforms */
- 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;
- /*QuatOne(ob->quat);*/ /* Quats arnt used yet */
-
- where_is_object(scene, ob);
-
- /* texspace and normals */
- BASACT= base;
-// XXX ED_object_enter_editmode(C, 0);
-// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
- BASACT= basact;
-
- change = 1;
- }
- else if (ob->type==OB_ARMATURE) {
- if (apply_scale && apply_rot)
- object_to_mat3(ob, mat);
- else if (apply_scale)
- object_scale_to_mat3(ob, mat);
- else
- object_rot_to_mat3(ob, mat);
- arm= ob->data;
-
- /* see checks above */
-// XXX apply_rot_armature(ob, mat);
-
- /* Reset the object's transforms */
- if (apply_scale)
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- if (apply_rot)
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
- /*QuatOne(ob->quat); (not used anymore)*/
-
- where_is_object(scene, ob);
-
- change = 1;
- }
- else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
- float scale;
- if (apply_scale && apply_rot)
- object_to_mat3(ob, mat);
- else if (apply_scale)
- object_scale_to_mat3(ob, mat);
- else
- object_rot_to_mat3(ob, mat);
- scale = Mat3ToScalef(mat);
- cu= ob->data;
-
- /* see checks above */
-
- nu= cu->nurb.first;
- while(nu) {
- if( (nu->type & 7)==CU_BEZIER) {
- a= nu->pntsu;
- bezt= nu->bezt;
- while(a--) {
- Mat3MulVecfl(mat, bezt->vec[0]);
- Mat3MulVecfl(mat, bezt->vec[1]);
- Mat3MulVecfl(mat, bezt->vec[2]);
- bezt->radius *= scale;
- bezt++;
- }
- }
- else {
- a= nu->pntsu*nu->pntsv;
- bp= nu->bp;
- while(a--) {
- Mat3MulVecfl(mat, bp->vec);
- bp++;
- }
- }
- nu= nu->next;
- }
- if (apply_scale)
- ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
- if (apply_rot)
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
- /*QuatOne(ob->quat); (quats arnt used anymore)*/
-
- where_is_object(scene, ob);
-
- /* texspace and normals */
- BASACT= base;
-// XXX ED_object_enter_editmode(C, 0);
-// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
- BASACT= basact;
-
- change = 1;
- } else {
- continue;
- }
-
- ignore_parent_tx(scene, ob);
- }
- }
- if (change) {
- }
-}
-
-void apply_objects_locrot(Scene *scene, View3D *v3d)
-{
- apply_objects_internal(scene, v3d, 1, 1);
-}
-
-void apply_objects_scale(Scene *scene, View3D *v3d)
-{
- apply_objects_internal(scene, v3d, 1, 0);
-}
-
-void apply_objects_rot(Scene *scene, View3D *v3d)
-{
- apply_objects_internal(scene, v3d, 0, 1);
-}
-
-void apply_objects_visual_tx( Scene *scene, View3D *v3d )
-{
- Base *base;
- Object *ob;
- int change = 0;
-
- for (base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- ob= base->object;
- where_is_object(scene, ob);
- VECCOPY(ob->loc, ob->obmat[3]);
- Mat4ToSize(ob->obmat, ob->size);
- Mat4ToEul(ob->obmat, ob->rot);
-
- where_is_object(scene, ob);
-
- change = 1;
- }
- }
- if (change) {
- }
-}
-
-/* ************************************** */
-
-
-void single_object_users(Scene *scene, View3D *v3d, int flag)
-{
- Base *base;
- Object *ob, *obn;
-
- clear_sca_new_poins(); /* sensor/contr/act */
-
- /* duplicate (must set newid) */
- for(base= FIRSTBASE; base; base= base->next) {
- ob= base->object;
-
- if( (base->flag & flag)==flag ) {
- if(ob->id.lib==NULL && ob->id.us>1) {
- /* base gets copy of object */
- obn= copy_object(ob);
- base->object= obn;
- ob->id.us--;
- }
- }
- }
-
- ID_NEW(scene->camera);
- if(v3d) ID_NEW(v3d->camera);
-
- /* object pointers */
- for(base= FIRSTBASE; base; base= base->next) {
- ob= base->object;
- if(ob->id.lib==NULL) {
- relink_constraints(&base->object->constraints);
- if (base->object->pose){
- bPoseChannel *chan;
- for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
- relink_constraints(&chan->constraints);
- }
- }
- modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
-
- ID_NEW(ob->parent);
- ID_NEW(ob->track);
- }
- }
-
- set_sca_new_poins();
-}
-
-void new_id_matar(Material **matar, int totcol)
-{
- ID *id;
- int a;
-
- for(a=0; a<totcol; a++) {
- id= (ID *)matar[a];
- if(id && id->lib==0) {
- if(id->newid) {
- matar[a]= (Material *)id->newid;
- id_us_plus(id->newid);
- id->us--;
- }
- else if(id->us>1) {
- matar[a]= copy_material(matar[a]);
- id->us--;
- id->newid= (ID *)matar[a];
- }
- }
- }
-}
+ int clear= (strcmp(op->idname, "OBJECT_OT_shade_flat") == 0);
+ int done= 0;
-void single_obdata_users(Scene *scene, View3D *v3d, int flag)
-{
- Object *ob;
- Lamp *la;
- Curve *cu;
- //Camera *cam;
- Base *base;
- Mesh *me;
- ID *id;
- int a;
-
- for(base= FIRSTBASE; base; base= base->next) {
- ob= base->object;
- if(ob->id.lib==NULL && (base->flag & flag)==flag ) {
- id= ob->data;
-
- if(id && id->us>1 && id->lib==0) {
- ob->recalc= OB_RECALC_DATA;
-
- 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);
- }
- }
- }
- break;
- case OB_CAMERA:
- ob->data= copy_camera(ob->data);
- break;
- case OB_MESH:
- me= ob->data= copy_mesh(ob->data);
- //if(me && me->key)
- // ipo_idnew(me->key->ipo); /* drivers */
- break;
- case OB_MBALL:
- ob->data= copy_mball(ob->data);
- break;
- case OB_CURVE:
- case OB_SURF:
- case OB_FONT:
- ob->data= cu= copy_curve(ob->data);
- ID_NEW(cu->bevobj);
- ID_NEW(cu->taperobj);
- break;
- case OB_LATTICE:
- ob->data= copy_lattice(ob->data);
- break;
- case OB_ARMATURE:
- ob->recalc |= OB_RECALC_DATA;
- ob->data= copy_armature(ob->data);
- armature_rebuild_pose(ob, ob->data);
- break;
- default:
- printf("ERROR single_obdata_users: %s\n", id->name);
- error("Read console");
- return;
- }
-
- id->us--;
- id->newid= ob->data;
-
- }
-
-#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
- }
- }
-
- me= G.main->mesh.first;
- while(me) {
- ID_NEW(me->texcomesh);
- me= me->id.next;
- }
-}
-
-void single_ipo_users(Scene *scene, View3D *v3d, 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 */
- }
- }
- }
-#endif // XXX old animation system
-}
-
-void single_mat_users(Scene *scene, View3D *v3d, int flag)
-{
- Object *ob;
- Base *base;
- Material *ma, *man;
- Tex *tex;
- int a, b;
-
-
- for(base= FIRSTBASE; base; base= base->next) {
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->id.lib==NULL && (flag==0 || (base->flag & SELECT)) ) {
-
- for(a=1; a<=ob->totcol; a++) {
- ma= give_current_material(ob, a);
- if(ma) {
- /* do not test for LIB_NEW: this functions guaranteed delivers single_users! */
-
- if(ma->id.us>1) {
- man= copy_material(ma);
-
- 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
-
- for(b=0; b<MAX_MTEX; b++) {
- if(ma->mtex[b] && ma->mtex[b]->tex) {
- tex= ma->mtex[b]->tex;
- if(tex->id.us>1) {
- ma->mtex[b]->tex= copy_texture(tex);
- tex->id.us--;
- }
- }
- }
-
- }
- }
- }
- }
- }
-}
-
-void do_single_tex_user(Tex **from)
-{
- Tex *tex, *texn;
-
- tex= *from;
- if(tex==0) return;
-
- if(tex->id.newid) {
- *from= (Tex *)tex->id.newid;
- id_us_plus(tex->id.newid);
- tex->id.us--;
- }
- else if(tex->id.us>1) {
- texn= copy_texture(tex);
- tex->id.newid= (ID *)texn;
- tex->id.us--;
- *from= texn;
- }
-
-}
-
-void single_tex_users_expand()
-{
- /* only when 'parent' blocks are LIB_NEW */
- Material *ma;
- Lamp *la;
- World *wo;
- int b;
-
- ma= G.main->mat.first;
- while(ma) {
- if(ma->id.flag & LIB_NEW) {
- for(b=0; b<MAX_MTEX; b++) {
- if(ma->mtex[b] && ma->mtex[b]->tex) {
- do_single_tex_user( &(ma->mtex[b]->tex) );
- }
- }
- }
- ma= ma->id.next;
- }
-
- la= G.main->lamp.first;
- while(la) {
- if(la->id.flag & LIB_NEW) {
- for(b=0; b<MAX_MTEX; b++) {
- if(la->mtex[b] && la->mtex[b]->tex) {
- do_single_tex_user( &(la->mtex[b]->tex) );
- }
- }
- }
- la= la->id.next;
- }
- wo= G.main->world.first;
- while(wo) {
- if(wo->id.flag & LIB_NEW) {
- for(b=0; b<MAX_MTEX; b++) {
- if(wo->mtex[b] && wo->mtex[b]->tex) {
- do_single_tex_user( &(wo->mtex[b]->tex) );
- }
- }
- }
- wo= wo->id.next;
- }
-}
-
-void single_mat_users_expand(void)
-{
- /* only when 'parent' blocks are LIB_NEW */
-
- Object *ob;
- Mesh *me;
- Curve *cu;
- MetaBall *mb;
- Material *ma;
- int a;
-
- ob= G.main->object.first;
- while(ob) {
- if(ob->id.flag & LIB_NEW) {
- new_id_matar(ob->mat, ob->totcol);
- }
- ob= ob->id.next;
- }
-
- me= G.main->mesh.first;
- while(me) {
- if(me->id.flag & LIB_NEW) {
- new_id_matar(me->mat, me->totcol);
- }
- me= me->id.next;
- }
-
- cu= G.main->curve.first;
- while(cu) {
- if(cu->id.flag & LIB_NEW) {
- new_id_matar(cu->mat, cu->totcol);
- }
- cu= cu->id.next;
- }
-
- mb= G.main->mball.first;
- while(mb) {
- if(mb->id.flag & LIB_NEW) {
- new_id_matar(mb->mat, mb->totcol);
- }
- mb= mb->id.next;
- }
- /* material imats */
- ma= G.main->mat.first;
- while(ma) {
- if(ma->id.flag & LIB_NEW) {
- for(a=0; a<MAX_MTEX; a++) {
- if(ma->mtex[a]) {
- ID_NEW(ma->mtex[a]->object);
- }
- }
- }
- ma= ma->id.next;
- }
-}
-
-void single_user(Scene *scene, View3D *v3d)
-{
- int nr;
-
- if(scene->id.lib) return;
-
- clear_id_newpoins();
-
- nr= pupmenu("Make Single User%t|Object|Object & ObData|Object & ObData & Materials+Tex|Materials+Tex|Ipos");
- if(nr>0) {
-
- if(nr==1) single_object_users(scene, v3d, 1);
-
- else if(nr==2) {
- single_object_users(scene, v3d, 1);
- single_obdata_users(scene, v3d, 1);
- }
- else if(nr==3) {
- single_object_users(scene, v3d, 1);
- single_obdata_users(scene, v3d, 1);
- single_mat_users(scene, v3d, 1); /* also tex */
-
- }
- else if(nr==4) {
- single_mat_users(scene, v3d, 1);
- }
- else if(nr==5) {
- single_ipo_users(scene, v3d, 1);
- }
-
-
- clear_id_newpoins();
-
- }
-}
-
-/* ************************************************************* */
-
-/* helper for below, ma was checked to be not NULL */
-static void make_local_makelocalmaterial(Material *ma)
-{
- //ID *id;
- int b;
-
- make_local_material(ma);
-
- for(b=0; b<MAX_MTEX; b++) {
- if(ma->mtex[b] && ma->mtex[b]->tex) {
- make_local_texture(ma->mtex[b]->tex);
- }
- }
-
-#if 0 // XXX old animation system
- id= (ID *)ma->ipo;
- if(id && id->lib) make_local_ipo(ma->ipo);
-#endif // XXX old animation system
-
- /* nodetree? XXX */
-}
-
-void make_local(Scene *scene, View3D *v3d, int mode)
-{
- Base *base;
- Object *ob;
- //bActionStrip *strip;
- ParticleSystem *psys;
- Material *ma, ***matarar;
- Lamp *la;
- Curve *cu;
- ID *id;
- int a, b;
-
- /* WATCH: the function new_id(..) re-inserts the id block!!! */
- if(scene->id.lib) return;
-
- if(mode==3) {
- all_local(NULL, 0); /* NULL is all libs */
- return;
- }
- else if(mode<1) return;
-
- clear_id_newpoins();
-
- for(base= FIRSTBASE; base; base= base->next) {
- if( TESTBASE(v3d, base) ) {
- ob= base->object;
- if(ob->id.lib) {
- make_local_object(ob);
- }
- }
- }
-
- /* maybe object pointers */
- for(base= FIRSTBASE; base; base= base->next) {
- if( TESTBASE(v3d, base) ) {
- ob= base->object;
- if(ob->id.lib==NULL) {
- ID_NEW(ob->parent);
- ID_NEW(ob->track);
- }
- }
- }
-
- for(base= FIRSTBASE; base; base= base->next) {
- if( TESTBASE(v3d, base) ) {
- ob= base->object;
- id= ob->data;
-
- if(id && mode>1) {
-
- switch(ob->type) {
- case OB_LAMP:
- make_local_lamp((Lamp *)id);
-
- la= ob->data;
-#if 0 // XXX old animation system
- id= (ID *)la->ipo;
- if(id && id->lib) make_local_ipo(la->ipo);
-#endif // XXX old animation system
- break;
- case OB_CAMERA:
- make_local_camera((Camera *)id);
- break;
- case OB_MESH:
- make_local_mesh((Mesh *)id);
- make_local_key( ((Mesh *)id)->key );
- break;
- case OB_MBALL:
- make_local_mball((MetaBall *)id);
- break;
- case OB_CURVE:
- case OB_SURF:
- case OB_FONT:
- cu= (Curve *)id;
- make_local_curve(cu);
-#if 0 // XXX old animation system
- id= (ID *)cu->ipo;
- if(id && id->lib) make_local_ipo(cu->ipo);
-#endif // XXX old animation system
- make_local_key( cu->key );
- break;
- case OB_LATTICE:
- make_local_lattice((Lattice *)id);
- make_local_key( ((Lattice *)id)->key );
- break;
- case OB_ARMATURE:
- make_local_armature ((bArmature *)id);
- break;
- }
+ if(ob->type==OB_MESH) {
+ mesh_set_smooth_flag(ob, !clear);
- for(psys=ob->particlesystem.first; psys; psys=psys->next)
- make_local_particlesettings(psys->part);
- }
-
-#if 0 // XXX old animation system
- id= (ID *)ob->ipo;
- if(id && id->lib) make_local_ipo(ob->ipo);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
- id= (ID *)ob->action;
- if(id && id->lib) make_local_action(ob->action);
-
- for(strip=ob->nlastrips.first; strip; strip=strip->next) {
- if(strip->act && strip->act->id.lib)
- make_local_action(strip->act);
- }
-#endif // XXX old animation system
+ done= 1;
}
- }
+ else if ELEM(ob->type, OB_SURF, OB_CURVE) {
+ cu= ob->data;
- if(mode>1) {
- for(base= FIRSTBASE; base; base= base->next) {
- if( TESTBASE(v3d, base) ) {
- ob= base->object;
- if(ob->type==OB_LAMP) {
- la= ob->data;
- for(b=0; b<MAX_MTEX; b++) {
- if(la->mtex[b] && la->mtex[b]->tex) {
- make_local_texture(la->mtex[b]->tex);
- }
- }
- }
- else {
-
- for(a=0; a<ob->totcol; a++) {
- ma= ob->mat[a];
- if(ma)
- make_local_makelocalmaterial(ma);
- }
-
- matarar= (Material ***)give_matarar(ob);
- if (matarar) {
- for(a=0; a<ob->totcol; a++) {
- ma= (*matarar)[a];
- if(ma)
- make_local_makelocalmaterial(ma);
- }
- }
- }
+ for(nu=cu->nurb.first; nu; nu=nu->next) {
+ if(!clear) nu->flag |= ME_SMOOTH;
+ else nu->flag &= ~ME_SMOOTH;
}
- }
- }
-}
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
-void make_local_menu(Scene *scene, View3D *v3d)
-{
- int mode;
-
- /* If you modify this menu, please remember to update view3d_edit_object_makelocalmenu
- * in header_view3d.c and the menu in toolbox.c
- */
-
- if(scene->id.lib) return;
-
- mode = pupmenu("Make Local%t|Selected Objects %x1|Selected Objects and Data %x2|All %x3");
-
- if (mode <= 0) return;
-
- make_local(scene, v3d, mode);
-}
-
-/* ************************ ADD DUPLICATE ******************** */
-
-/*
- dupflag: a flag made from constants declared in DNA_userdef_types.h
- The flag tells adduplicate() weather to copy data linked to the object, or to reference the existing data.
- U.dupflag for default operations or you can construct a flag as python does
- if the dupflag is 0 then no data will be copied (linked duplicate) */
-
-/* used below, assumes id.new is correct */
-/* leaves selection of base/object unaltered */
-static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag)
-{
- Base *basen= NULL;
- Material ***matarar;
- Object *ob, *obn;
- ID *id;
- int a, didit;
-
- ob= base->object;
- if(ob->flag & OB_POSEMODE) {
- ; /* nothing? */
- }
- else {
- obn= copy_object(ob);
- obn->recalc |= OB_RECALC;
-
- basen= MEM_mallocN(sizeof(Base), "duplibase");
- *basen= *base;
- BLI_addhead(&scene->base, basen); /* addhead: prevent eternal loop */
- basen->object= obn;
-
- if(basen->flag & OB_FROMGROUP) {
- Group *group;
- for(group= G.main->group.first; group; group= group->id.next) {
- if(object_in_group(ob, group))
- add_to_group(group, obn);
- }
- obn->flag |= OB_FROMGROUP; /* this flag is unset with copy_object() */
- }
-
- /* duplicates using userflags */
-#if 0 // XXX old animation system
- if(dupflag & USER_DUP_IPO) {
- bConstraintChannel *chan;
- id= (ID *)obn->ipo;
-
- if(id) {
- ID_NEW_US( obn->ipo)
- else obn->ipo= copy_ipo(obn->ipo);
- id->us--;
- }
- /* Handle constraint ipos */
- for (chan=obn->constraintChannels.first; chan; chan=chan->next){
- id= (ID *)chan->ipo;
- if(id) {
- ID_NEW_US( chan->ipo)
- else chan->ipo= copy_ipo(chan->ipo);
- id->us--;
- }
- }
- }
- 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_MAT) {
- for(a=0; a<obn->totcol; a++) {
- id= (ID *)obn->mat[a];
- if(id) {
- ID_NEW_US(obn->mat[a])
- else obn->mat[a]= copy_material(obn->mat[a]);
- id->us--;
- }
- }
- }
-
- id= obn->data;
- didit= 0;
-
- switch(obn->type) {
- case OB_MESH:
- if(dupflag & USER_DUP_MESH) {
- ID_NEW_US2( obn->data )
- else {
- obn->data= copy_mesh(obn->data);
-
- if(obn->fluidsimSettings) {
- obn->fluidsimSettings->orgMesh = (Mesh *)obn->data;
- }
-
- didit= 1;
- }
- id->us--;
- }
- break;
- case OB_CURVE:
- if(dupflag & USER_DUP_CURVE) {
- ID_NEW_US2(obn->data )
- else {
- obn->data= copy_curve(obn->data);
- didit= 1;
- }
- id->us--;
- }
- break;
- case OB_SURF:
- if(dupflag & USER_DUP_SURF) {
- ID_NEW_US2( obn->data )
- else {
- obn->data= copy_curve(obn->data);
- didit= 1;
- }
- id->us--;
- }
- break;
- case OB_FONT:
- if(dupflag & USER_DUP_FONT) {
- ID_NEW_US2( obn->data )
- else {
- obn->data= copy_curve(obn->data);
- didit= 1;
- }
- id->us--;
- }
- break;
- case OB_MBALL:
- if(dupflag & USER_DUP_MBALL) {
- ID_NEW_US2(obn->data )
- else {
- obn->data= copy_mball(obn->data);
- didit= 1;
- }
- id->us--;
- }
- break;
- case OB_LAMP:
- if(dupflag & USER_DUP_LAMP) {
- ID_NEW_US2(obn->data )
- else obn->data= copy_lamp(obn->data);
- id->us--;
- }
- break;
-
- case OB_ARMATURE:
- obn->recalc |= OB_RECALC_DATA;
- if(obn->pose) obn->pose->flag |= POSE_RECALC;
-
- if(dupflag & USER_DUP_ARM) {
- ID_NEW_US2(obn->data )
- else {
- obn->data= copy_armature(obn->data);
- armature_rebuild_pose(obn, obn->data);
- didit= 1;
- }
- id->us--;
- }
-
- break;
-
- case OB_LATTICE:
- if(dupflag!=0) {
- ID_NEW_US2(obn->data )
- else obn->data= copy_lattice(obn->data);
- id->us--;
- }
- break;
- case OB_CAMERA:
- if(dupflag!=0) {
- ID_NEW_US2(obn->data )
- else obn->data= copy_camera(obn->data);
- id->us--;
- }
- break;
+ done= 1;
}
-
- 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--;
- }
- }
- }
- }
- }
- return basen;
-}
-
-/* single object duplicate, if dupflag==0, fully linked, else it uses U.dupflag */
-/* leaves selection of base/object unaltered */
-Base *ED_object_add_duplicate(Scene *scene, Base *base, int usedupflag)
-{
- Base *basen;
- int dupflag= usedupflag?U.dupflag:0;
-
- clear_id_newpoins();
- clear_sca_new_poins(); /* sensor/contr/act */
-
- basen= object_add_duplicate_internal(scene, base, dupflag);
-
- DAG_scene_sort(scene);
-
- return basen;
-}
-
-/* contextual operator dupli */
-static int duplicate_add_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
- int dupflag= U.dupflag;
-
- clear_id_newpoins();
- clear_sca_new_poins(); /* sensor/contr/act */
-
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
- Base *basen= object_add_duplicate_internal(scene, base, dupflag);
-
- /* XXX context conflict maybe, itterator could solve this? */
- ED_base_object_select(base, BA_DESELECT);
- /* new object becomes active */
- if(BASACT==base)
- ED_base_object_activate(C, basen);
-
}
CTX_DATA_END;
- /* XXX fix this for context */
- copy_object_set_idnew(scene, v3d, dupflag);
-
- DAG_scene_sort(scene);
- ED_anim_dag_flush_update(C);
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
-
- return OPERATOR_FINISHED;
+ return (done)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-static int duplicate_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
+void OBJECT_OT_shade_flat(wmOperatorType *ot)
{
- duplicate_add_exec(C, op);
+ /* identifiers */
+ ot->name= "Shade Flat";
+ ot->idname= "OBJECT_OT_shade_flat";
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+ /* api callbacks */
+ ot->exec= shade_smooth_exec;
- return OPERATOR_FINISHED;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void OBJECT_OT_duplicate_add(wmOperatorType *ot)
+void OBJECT_OT_shade_smooth(wmOperatorType *ot)
{
-
/* identifiers */
- ot->name= "Add Duplicate";
- ot->description = "Duplicate the object.";
- ot->idname= "OBJECT_OT_duplicate_add";
+ ot->name= "Shade Smooth";
+ ot->idname= "OBJECT_OT_shade_smooth";
/* api callbacks */
- ot->invoke= duplicate_add_invoke;
- ot->exec= duplicate_add_exec;
-
- ot->poll= ED_operator_scene_editable;
-
+ ot->exec= shade_smooth_exec;
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
}
+
+
/* ********************** */
void image_aspect(Scene *scene, View3D *v3d)
@@ -6200,7 +1709,7 @@ void image_aspect(Scene *scene, View3D *v3d)
else ob->size[1]= ob->size[0]*y/x;
done= 1;
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
}
if(done) break;
@@ -6391,120 +1900,229 @@ void rand_timeoffs(Scene *scene, View3D *v3d)
}
+static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem *input = object_mode_items;
+ EnumPropertyItem *item= NULL;
+ Object *ob;
+ int totitem= 0;
+
+ if(!C) /* needed for docs */
+ return object_mode_items;
+
+ ob = CTX_data_active_object(C);
+ while(ob && input->identifier) {
+ if((input->value == OB_MODE_EDIT && ((ob->type == OB_MESH) || (ob->type == OB_ARMATURE) ||
+ (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
+ (ob->type == OB_FONT) || (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) ||
+ (input->value == OB_MODE_POSE && (ob->type == OB_ARMATURE)) ||
+ (input->value == OB_MODE_PARTICLE_EDIT && ob->particlesystem.first) ||
+ ((input->value == OB_MODE_SCULPT || input->value == OB_MODE_VERTEX_PAINT ||
+ input->value == OB_MODE_WEIGHT_PAINT || input->value == OB_MODE_TEXTURE_PAINT) && (ob->type == OB_MESH)) ||
+ (input->value == OB_MODE_OBJECT))
+ RNA_enum_item_add(&item, &totitem, input);
+ ++input;
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
+static const char *object_mode_op_string(int mode)
+{
+ if(mode & OB_MODE_EDIT)
+ return "OBJECT_OT_editmode_toggle";
+ if(mode == OB_MODE_SCULPT)
+ return "SCULPT_OT_sculptmode_toggle";
+ if(mode == OB_MODE_VERTEX_PAINT)
+ return "PAINT_OT_vertex_paint_toggle";
+ if(mode == OB_MODE_WEIGHT_PAINT)
+ return "PAINT_OT_weight_paint_toggle";
+ if(mode == OB_MODE_TEXTURE_PAINT)
+ return "PAINT_OT_texture_paint_toggle";
+ if(mode == OB_MODE_PARTICLE_EDIT)
+ return "PARTICLE_OT_particle_edit_toggle";
+ if(mode == OB_MODE_POSE)
+ return "OBJECT_OT_posemode_toggle";
+ return NULL;
+}
-void texspace_edit(Scene *scene, View3D *v3d)
+/* 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)
{
- Base *base;
- int nr=0;
-
- /* first test if from visible and selected objects
- * texspacedraw is set:
- */
-
- if(scene->obedit) return; // XXX get from context
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- break;
+ ObjectMode mode = RNA_enum_get(op->ptr, "mode");
+
+ if(ob) {
+ if(mode == OB_MODE_OBJECT)
+ return 1;
+
+ switch(ob->type) {
+ case OB_MESH:
+ if(mode & (OB_MODE_EDIT|OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_PARTICLE_EDIT))
+ return 1;
+ return 0;
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ case OB_MBALL:
+ if(mode & (OB_MODE_EDIT))
+ return 1;
+ return 0;
+ case OB_LATTICE:
+ if(mode & (OB_MODE_EDIT|OB_MODE_WEIGHT_PAINT))
+ return 1;
+ case OB_ARMATURE:
+ if(mode & (OB_MODE_EDIT|OB_MODE_POSE))
+ return 1;
}
}
- if(base==0) {
- return;
+ return 0;
+}
+
+static int object_mode_set_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ ObjectMode mode = RNA_enum_get(op->ptr, "mode");
+ ObjectMode restore_mode = ob->mode;
+ int toggle = RNA_boolean_get(op->ptr, "toggle");
+
+ if(!ob || !object_mode_set_compat(C, op, ob))
+ return OPERATOR_PASS_THROUGH;
+
+ /* Exit current mode if it's not the mode we're setting */
+ if(ob->mode != OB_MODE_OBJECT && ob->mode != mode)
+ WM_operator_name_call(C, object_mode_op_string(ob->mode), WM_OP_EXEC_REGION_WIN, NULL);
+
+ if(mode != OB_MODE_OBJECT) {
+ /* Enter new mode */
+ if(ob->mode != mode || toggle)
+ WM_operator_name_call(C, object_mode_op_string(mode), WM_OP_EXEC_REGION_WIN, NULL);
+
+ if(toggle) {
+ if(ob->mode == mode)
+ /* For toggling, store old mode so we know what to go back to */
+ ob->restore_mode = restore_mode;
+ else if(ob->restore_mode != OB_MODE_OBJECT && ob->restore_mode != mode) {
+ WM_operator_name_call(C, object_mode_op_string(ob->restore_mode), WM_OP_EXEC_REGION_WIN, NULL);
+ }
+ }
}
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_mode_set(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Set Object Mode";
+ ot->description = "Sets the object interaction mode.";
+ ot->idname= "OBJECT_OT_mode_set";
- nr= pupmenu("Texture Space %t|Grab/Move%x1|Size%x2");
- if(nr<1) return;
+ /* api callbacks */
+ ot->exec= object_mode_set_exec;
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- base->object->dtx |= OB_TEXSPACE;
- }
- }
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ prop= RNA_def_enum(ot->srna, "mode", object_mode_items, OB_MODE_OBJECT, "Mode", "");
+ RNA_def_enum_funcs(prop, object_mode_set_itemsf);
- if(nr==1) {
-// XXX initTransform(TFM_TRANSLATION, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==2) {
-// XXX initTransform(TFM_RESIZE, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==3) {
-// XXX initTransform(TFM_ROTATION, CTX_TEXTURE);
-// XXX Transform();
- }
+ RNA_def_boolean(ot->srna, "toggle", 0, "Toggle", "");
}
-/* ******************************************************************** */
-/* Mirror function in Edit Mode */
-void mirrormenu(void)
+
+void ED_object_toggle_modes(bContext *C, int mode)
{
-// XXX initTransform(TFM_MIRROR, CTX_NO_PET);
-// XXX Transform();
+ if(mode & OB_MODE_SCULPT)
+ WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+ if(mode & OB_MODE_VERTEX_PAINT)
+ WM_operator_name_call(C, "PAINT_OT_vertex_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+ if(mode & OB_MODE_WEIGHT_PAINT)
+ WM_operator_name_call(C, "PAINT_OT_weight_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+ if(mode & OB_MODE_TEXTURE_PAINT)
+ WM_operator_name_call(C, "PAINT_OT_texture_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+ if(mode & OB_MODE_PARTICLE_EDIT)
+ WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
+ if(mode & OB_MODE_POSE)
+ WM_operator_name_call(C, "OBJECT_OT_posemode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
}
-void hookmenu(Scene *scene, View3D *v3d)
+/************************ Game Properties ***********************/
+
+static int game_property_new(bContext *C, wmOperator *op)
{
- /* only called in object mode */
- short event, changed=0;
- Object *ob;
- Base *base;
- ModifierData *md;
- HookModifierData *hmd;
-
- event= pupmenu("Modify Hooks for Selected...%t|Reset Offset%x1|Recenter at Cursor%x2");
- if (event==-1) return;
- if (event==2 && !(v3d)) {
- error("Cannot perform this operation without a 3d view");
- return;
- }
-
- for (base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- for (md = base->object->modifiers.first; md; md=md->next) {
- if (md->type==eModifierType_Hook) {
- ob = base->object;
- hmd = (HookModifierData*) md;
-
- /*
- * Copied from modifiers_cursorHookCenter and
- * modifiers_clearHookOffset, should consolidate
- * */
-
- if (event==1) {
- if(hmd->object) {
- Mat4Invert(hmd->object->imat, hmd->object->obmat);
- Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
-
- changed= 1;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- }
- } else {
- float *curs = give_cursor(scene, v3d);
- float bmat[3][3], imat[3][3];
-
- where_is_object(scene, ob);
-
- Mat3CpyMat4(bmat, ob->obmat);
- Mat3Inv(imat, bmat);
-
- curs= give_cursor(scene, v3d);
- hmd->cent[0]= curs[0]-ob->obmat[3][0];
- hmd->cent[1]= curs[1]-ob->obmat[3][1];
- hmd->cent[2]= curs[2]-ob->obmat[3][2];
- Mat3MulVecfl(imat, hmd->cent);
-
- changed= 1;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- }
- }
- }
- }
- }
-
- if (changed) {
- }
+ Object *ob= CTX_data_active_object(C);
+ bProperty *prop;
+
+ if(!ob)
+ return OPERATOR_CANCELLED;
+
+ prop= new_property(PROP_FLOAT);
+ BLI_addtail(&ob->prop, prop);
+ unique_property(NULL, prop, 0); // make_unique_prop_names(prop->name);
+
+ return OPERATOR_FINISHED;
}
+
+
+void OBJECT_OT_game_property_new(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New Game Property";
+ ot->idname= "OBJECT_OT_game_property_new";
+
+ /* api callbacks */
+ ot->exec= game_property_new;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int game_property_remove(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+ bProperty *prop;
+ int index;
+
+ if(!ob)
+ return OPERATOR_CANCELLED;
+
+ index = RNA_int_get(op->ptr, "index");
+
+ prop= BLI_findlink(&ob->prop, index);
+
+ if(prop) {
+ BLI_remlink(&ob->prop, prop);
+ free_property(prop);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+void OBJECT_OT_game_property_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Game Property";
+ ot->idname= "OBJECT_OT_game_property_remove";
+
+ /* api callbacks */
+ ot->exec= game_property_remove;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Property index to remove ", 0, INT_MAX);
+}
+
diff --git a/source/blender/editors/object/editgroup.c b/source/blender/editors/object/object_group.c
index b49e2040b03..c83f3022c7c 100644
--- a/source/blender/editors/object/editgroup.c
+++ b/source/blender/editors/object/object_group.c
@@ -32,28 +32,20 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
#include "DNA_group_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_view3d_types.h"
+#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_group.h"
#include "BKE_global.h"
-#include "BKE_context.h"
+#include "BKE_group.h"
#include "BKE_main.h"
#include "BKE_report.h"
+#include "BKE_scene.h"
-#include "ED_view3d.h"
-#include "ED_space_api.h"
#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -63,6 +55,8 @@
#include "object_intern.h"
+/********************* 3d view operators ***********************/
+
static int objects_add_active_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -70,13 +64,12 @@ static int objects_add_active_exec(bContext *C, wmOperator *op)
Group *group;
int ok = 0;
- if (!ob) return OPERATOR_CANCELLED;
+ if(!ob) return OPERATOR_CANCELLED;
/* linking to same group requires its own loop so we can avoid
looking up the active objects groups each time */
- group= G.main->group.first;
- while(group) {
+ for(group= G.main->group.first; group; group=group->id.next) {
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -89,22 +82,18 @@ static int objects_add_active_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
}
- group= group->id.next;
}
- if (!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
+ if(!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
- DAG_scene_sort(CTX_data_scene(C));
-
+ DAG_scene_sort(scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
-
}
void GROUP_OT_objects_add_active(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Add Selected To Active Group";
ot->description = "Add the object to an object group that contains the active object.";
@@ -125,13 +114,12 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op)
Group *group;
int ok = 0;
- if (!ob) return OPERATOR_CANCELLED;
+ if(!ob) return OPERATOR_CANCELLED;
/* linking to same group requires its own loop so we can avoid
looking up the active objects groups each time */
- group= G.main->group.first;
- while(group) {
+ for(group= G.main->group.first; group; group=group->id.next) {
if(object_in_group(ob, group)) {
/* Assign groups to selected objects */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -144,24 +132,20 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
}
- group= group->id.next;
}
- if (!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
+ if(!ok) BKE_report(op->reports, RPT_ERROR, "Active Object contains no groups");
- DAG_scene_sort(CTX_data_scene(C));
-
+ DAG_scene_sort(scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
-
}
void GROUP_OT_objects_remove_active(wmOperatorType *ot)
{
-
/* identifiers */
- ot->name= "Remove Selected From active group";
+ ot->name= "Remove Selected From Active Group";
ot->description = "Remove the object from an object group that contains the active object.";
ot->idname= "GROUP_OT_objects_remove_active";
@@ -173,39 +157,37 @@ void GROUP_OT_objects_remove_active(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int group_remove_exec(bContext *C, wmOperator *op)
+static int group_objects_remove_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
Group *group= NULL;
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
group = NULL;
- while( (group = find_group(base->object, group)) ) {
+ while((group = find_group(base->object, group)))
rem_from_group(group, base->object);
- }
+
base->object->flag &= ~OB_FROMGROUP;
base->flag &= ~OB_FROMGROUP;
base->object->recalc= OB_RECALC_OB;
}
CTX_DATA_END;
- DAG_scene_sort(CTX_data_scene(C));
-
+ DAG_scene_sort(scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
-
}
void GROUP_OT_objects_remove(wmOperatorType *ot)
{
-
/* identifiers */
- ot->name= "Remove from group";
+ ot->name= "Remove From Groups";
ot->description = "Remove selected objects from all groups.";
ot->idname= "GROUP_OT_objects_remove";
/* api callbacks */
- ot->exec= group_remove_exec;
+ ot->exec= group_objects_remove_exec;
ot->poll= ED_operator_scene_editable;
/* flags */
@@ -214,6 +196,7 @@ void GROUP_OT_objects_remove(wmOperatorType *ot)
static int group_create_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
Group *group= NULL;
char gid[32]; //group id
@@ -229,17 +212,14 @@ static int group_create_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- DAG_scene_sort(CTX_data_scene(C));
-
+ DAG_scene_sort(scene);
WM_event_add_notifier(C, NC_GROUP|NA_EDITED, NULL);
return OPERATOR_FINISHED;
-
}
void GROUP_OT_group_create(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Create New Group";
ot->description = "Create an object group.";
@@ -255,3 +235,130 @@ void GROUP_OT_group_create(wmOperatorType *ot)
RNA_def_string(ot->srna, "GID", "Group", 32, "Name", "Name of the new group");
}
+/****************** properties window operators *********************/
+
+static int group_add_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Base *base;
+ Group *group;
+ int value= RNA_enum_get(op->ptr, "group");
+
+ if(!ob)
+ return OPERATOR_CANCELLED;
+
+ base= object_in_scene(ob, scene);
+ if(!base)
+ return OPERATOR_CANCELLED;
+
+ if(value == -1)
+ group= add_group( "Group" );
+ else
+ group= BLI_findlink(&bmain->group, value);
+
+ if(group) {
+ add_to_group(group, ob);
+ ob->flag |= OB_FROMGROUP;
+ base->flag |= OB_FROMGROUP;
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static EnumPropertyItem group_items[]= {
+ {-1, "ADD_NEW", 0, "Add New Group", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static EnumPropertyItem *group_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ EnumPropertyItem *item= NULL;
+ Main *bmain;
+ Group *group;
+ int a, totitem= 0;
+
+ if(!C) /* needed for docs */
+ return group_items;
+
+ RNA_enum_items_add_value(&item, &totitem, group_items, -1);
+
+ bmain= CTX_data_main(C);
+ if(bmain->group.first)
+ RNA_enum_item_add_separator(&item, &totitem);
+
+ for(a=0, group=bmain->group.first; group; group=group->id.next, a++) {
+ tmp.value= a;
+ tmp.identifier= group->id.name+2;
+ tmp.name= group->id.name+2;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
+void OBJECT_OT_group_add(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Add Group";
+ ot->idname= "OBJECT_OT_group_add";
+
+ /* api callbacks */
+ ot->exec= group_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ prop= RNA_def_enum(ot->srna, "group", group_items, -1, "Group", "Group to add object to.");
+ RNA_def_enum_funcs(prop, group_itemf);
+}
+
+static int group_remove_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Group *group= CTX_data_pointer_get_type(C, "group", &RNA_Group).data;
+ Base *base;
+
+ if(!ob || !group)
+ return OPERATOR_CANCELLED;
+
+ base= object_in_scene(ob, scene);
+ if(!base)
+ return OPERATOR_CANCELLED;
+
+ rem_from_group(group, ob);
+
+ if(find_group(ob, NULL) == NULL) {
+ ob->flag &= ~OB_FROMGROUP;
+ base->flag &= ~OB_FROMGROUP;
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_group_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Group";
+ ot->idname= "OBJECT_OT_group_remove";
+
+ /* api callbacks */
+ ot->exec= group_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
new file mode 100644
index 00000000000..ab7bcbc989d
--- /dev/null
+++ b/source/blender/editors/object/object_hook.c
@@ -0,0 +1,608 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2002-2008 full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+
+#include "DNA_curve_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+
+#include "ED_curve.h"
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "ED_view3d.h"
+
+#include "object_intern.h"
+
+/* XXX operators for this are not implemented yet */
+
+static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float *cent)
+{
+ EditVert *eve;
+ int *index, nr, totvert=0;
+
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) totvert++;
+ }
+ if(totvert==0) return 0;
+
+ *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
+ *tot= totvert;
+ nr= 0;
+ cent[0]= cent[1]= cent[2]= 0.0;
+
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(eve->f & SELECT) {
+ *index= nr; index++;
+ VecAddf(cent, cent, eve->co);
+ }
+ nr++;
+ }
+
+ VecMulf(cent, 1.0f/(float)totvert);
+
+ return totvert;
+}
+
+static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, float *cent)
+{
+ MDeformVert *dvert;
+ EditVert *eve;
+ int i, totvert=0;
+
+ cent[0]= cent[1]= cent[2]= 0.0;
+
+ if(obedit->actdef) {
+
+ /* find the vertices */
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if(dvert) {
+ for(i=0; i<dvert->totweight; i++){
+ if(dvert->dw[i].def_nr == (obedit->actdef-1)) {
+ totvert++;
+ VecAddf(cent, cent, eve->co);
+ }
+ }
+ }
+ }
+ if(totvert) {
+ bDeformGroup *defGroup = BLI_findlink(&obedit->defbase, obedit->actdef-1);
+ strcpy(name, defGroup->name);
+ VecMulf(cent, 1.0f/(float)totvert);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void select_editmesh_hook(Object *ob, HookModifierData *hmd)
+{
+ Mesh *me= ob->data;
+ EditMesh *em= BKE_mesh_get_editmesh(me);
+ EditVert *eve;
+ int index=0, nr=0;
+
+ if (hmd->indexar == NULL)
+ return;
+
+ for(eve= em->verts.first; eve; eve= eve->next, nr++) {
+ if(nr==hmd->indexar[index]) {
+ eve->f |= SELECT;
+ if(index < hmd->totindex-1) index++;
+ }
+ }
+ EM_select_flush(em);
+
+ BKE_mesh_end_editmesh(me, em);
+}
+
+static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar, float *cent)
+{
+ BPoint *bp;
+ int *index, nr, totvert=0, a;
+
+ /* count */
+ a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ bp= editlatt->def;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ if(bp->hide==0) totvert++;
+ }
+ bp++;
+ }
+
+ if(totvert==0) return 0;
+
+ *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
+ *tot= totvert;
+ nr= 0;
+ cent[0]= cent[1]= cent[2]= 0.0;
+
+ a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ bp= editlatt->def;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ if(bp->hide==0) {
+ *index= nr; index++;
+ VecAddf(cent, cent, bp->vec);
+ }
+ }
+ bp++;
+ nr++;
+ }
+
+ VecMulf(cent, 1.0f/(float)totvert);
+
+ return totvert;
+}
+
+static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
+{
+ Lattice *lt= obedit->data;
+ BPoint *bp;
+ int index=0, nr=0, a;
+
+ /* count */
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->def;
+ while(a--) {
+ if(hmd->indexar[index]==nr) {
+ bp->f1 |= SELECT;
+ if(index < hmd->totindex-1) index++;
+ }
+ nr++;
+ bp++;
+ }
+}
+
+static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, float *cent)
+{
+ ListBase *editnurb= curve_get_editcurve(obedit);
+ Nurb *nu;
+ BPoint *bp;
+ BezTriple *bezt;
+ int *index, a, nr, totvert=0;
+
+ for(nu= editnurb->first; nu; nu= nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(bezt->f1 & SELECT) totvert++;
+ if(bezt->f2 & SELECT) totvert++;
+ if(bezt->f3 & SELECT) totvert++;
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if(bp->f1 & SELECT) totvert++;
+ bp++;
+ }
+ }
+ }
+ if(totvert==0) return 0;
+
+ *indexar= index= MEM_mallocN(4*totvert, "hook indexar");
+ *tot= totvert;
+ nr= 0;
+ cent[0]= cent[1]= cent[2]= 0.0;
+
+ for(nu= editnurb->first; nu; nu= nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(bezt->f1 & SELECT) {
+ *index= nr; index++;
+ VecAddf(cent, cent, bezt->vec[0]);
+ }
+ nr++;
+ if(bezt->f2 & SELECT) {
+ *index= nr; index++;
+ VecAddf(cent, cent, bezt->vec[1]);
+ }
+ nr++;
+ if(bezt->f3 & SELECT) {
+ *index= nr; index++;
+ VecAddf(cent, cent, bezt->vec[2]);
+ }
+ nr++;
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ *index= nr; index++;
+ VecAddf(cent, cent, bp->vec);
+ }
+ nr++;
+ bp++;
+ }
+ }
+ }
+
+ VecMulf(cent, 1.0f/(float)totvert);
+
+ return totvert;
+}
+
+int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+{
+ *indexar= NULL;
+ *tot= 0;
+ name[0]= 0;
+
+ switch(obedit->type) {
+ case OB_MESH:
+ {
+ Mesh *me= obedit->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ /* check selected vertices first */
+ if( return_editmesh_indexar(em, tot, indexar, cent_r)) {
+ BKE_mesh_end_editmesh(me, em);
+ return 1;
+ } else {
+ int ret = return_editmesh_vgroup(obedit, em, name, cent_r);
+ BKE_mesh_end_editmesh(me, em);
+ return ret;
+ }
+ }
+ case OB_CURVE:
+ case OB_SURF:
+ return return_editcurve_indexar(obedit, tot, indexar, cent_r);
+ case OB_LATTICE:
+ {
+ Lattice *lt= obedit->data;
+ return return_editlattice_indexar(lt->editlatt, tot, indexar, cent_r);
+ }
+ default:
+ return 0;
+ }
+}
+
+static void select_editcurve_hook(Object *obedit, HookModifierData *hmd)
+{
+ ListBase *editnurb= curve_get_editcurve(obedit);
+ Nurb *nu;
+ BPoint *bp;
+ BezTriple *bezt;
+ int index=0, a, nr=0;
+
+ for(nu= editnurb->first; nu; nu= nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(nr == hmd->indexar[index]) {
+ bezt->f1 |= SELECT;
+ if(index<hmd->totindex-1) index++;
+ }
+ nr++;
+ if(nr == hmd->indexar[index]) {
+ bezt->f2 |= SELECT;
+ if(index<hmd->totindex-1) index++;
+ }
+ nr++;
+ if(nr == hmd->indexar[index]) {
+ bezt->f3 |= SELECT;
+ if(index<hmd->totindex-1) index++;
+ }
+ nr++;
+
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if(nr == hmd->indexar[index]) {
+ bp->f1 |= SELECT;
+ if(index<hmd->totindex-1) index++;
+ }
+ nr++;
+ bp++;
+ }
+ }
+ }
+}
+
+void object_hook_select(Object *ob, HookModifierData *hmd)
+{
+ if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd);
+ else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd);
+ else if(ob->type==OB_CURVE) select_editcurve_hook(ob, hmd);
+ else if(ob->type==OB_SURF) select_editcurve_hook(ob, hmd);
+}
+
+
+void add_hook(Scene *scene, View3D *v3d, int mode)
+{
+ ModifierData *md = NULL;
+ HookModifierData *hmd = NULL;
+ Object *ob=NULL;
+ Object *obedit= scene->obedit; // XXX get from context
+
+ if(obedit==NULL) return;
+
+ /* preconditions */
+ if(mode==2) { /* selected object */
+ Base *base;
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(TESTBASELIB(v3d, base)) {
+ if(base!=BASACT) {
+ ob= base->object;
+ break;
+ }
+ }
+ }
+ if(ob==NULL) {
+ // XXX error("Requires selected Object");
+ return;
+ }
+ }
+ else if(mode!=1) {
+ int maxlen=0, a, nr;
+ char *cp;
+
+ /* make pupmenu with hooks */
+ for(md=obedit->modifiers.first; md; md= md->next) {
+ if (md->type==eModifierType_Hook)
+ maxlen+=32;
+ }
+
+ if(maxlen==0) {
+ // XXX error("Object has no hooks yet");
+ return;
+ }
+
+ cp= MEM_callocN(maxlen+32, "temp string");
+ if(mode==3) strcpy(cp, "Remove %t|");
+ else if(mode==4) strcpy(cp, "Reassign %t|");
+ else if(mode==5) strcpy(cp, "Select %t|");
+ else if(mode==6) strcpy(cp, "Clear Offset %t|");
+
+ for(md=obedit->modifiers.first; md; md= md->next) {
+ if (md->type==eModifierType_Hook) {
+ strcat(cp, md->name);
+ strcat(cp, " |");
+ }
+ }
+
+ nr= 0; // XXX pupmenu(cp);
+ MEM_freeN(cp);
+
+ if(nr<1) return;
+
+ a= 1;
+ for(md=obedit->modifiers.first; md; md=md->next) {
+ if (md->type==eModifierType_Hook) {
+ if(a==nr) break;
+ a++;
+ }
+ }
+
+ hmd = (HookModifierData*) md;
+ ob= hmd->object;
+ }
+
+ /* do it, new hooks or reassign */
+ if(mode==1 || mode==2 || mode==4) {
+ float cent[3];
+ int tot, ok, *indexar;
+ char name[32];
+
+ ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
+
+ if(ok==0) {
+ // XXX error("Requires selected vertices or active Vertex Group");
+ }
+ else {
+
+ if(mode==1) {
+ Base *base= BASACT, *newbase;
+
+ ob= add_object(scene, OB_EMPTY);
+ /* set layers OK */
+ newbase= BASACT;
+ newbase->lay= base->lay;
+ ob->lay= newbase->lay;
+
+ /* transform cent to global coords for loc */
+ VecMat4MulVecfl(ob->loc, obedit->obmat, cent);
+
+ /* restore, add_object sets active */
+ BASACT= base;
+ }
+ /* if mode is 2 or 4, ob has been set */
+
+ /* new hook */
+ if(mode==1 || mode==2) {
+ ModifierData *md = obedit->modifiers.first;
+
+ while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
+ md = md->next;
+ }
+
+ hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
+ BLI_insertlinkbefore(&obedit->modifiers, md, hmd);
+ sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);
+ }
+ else if (hmd->indexar) MEM_freeN(hmd->indexar); /* reassign, hook was set */
+
+ hmd->object= ob;
+ hmd->indexar= indexar;
+ VecCopyf(hmd->cent, cent);
+ hmd->totindex= tot;
+ BLI_strncpy(hmd->name, name, 32);
+
+ // TODO: need to take into account bone targets here too now...
+ if(mode==1 || mode==2) {
+ /* matrix calculus */
+ /* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
+ /* (parentinv ) */
+
+ where_is_object(scene, ob);
+
+ Mat4Invert(ob->imat, ob->obmat);
+ /* apparently this call goes from right to left... */
+ Mat4MulSerie(hmd->parentinv, ob->imat, obedit->obmat, NULL,
+ NULL, NULL, NULL, NULL, NULL);
+ }
+ }
+ }
+ else if(mode==3) { /* remove */
+ BLI_remlink(&obedit->modifiers, md);
+ modifier_free(md);
+ }
+ else if(mode==5) { /* select */
+ // FIXME: this is now OBJECT_OT_hook_select
+ object_hook_select(obedit, hmd);
+ }
+ else if(mode==6) { /* clear offset */
+ // FIXME: this is now OBJECT_OT_hook_reset operator
+ where_is_object(scene, ob); /* ob is hook->parent */
+
+ Mat4Invert(ob->imat, ob->obmat);
+ /* this call goes from right to left... */
+ Mat4MulSerie(hmd->parentinv, ob->imat, obedit->obmat, NULL,
+ NULL, NULL, NULL, NULL, NULL);
+ }
+
+ DAG_scene_sort(scene);
+}
+
+void add_hook_menu(Scene *scene, View3D *v3d)
+{
+ Object *obedit= scene->obedit; // XXX get from context
+ int mode;
+
+ if(obedit==NULL) return;
+
+ if(modifiers_findByType(obedit, eModifierType_Hook))
+ mode= 0; // XXX pupmenu("Hooks %t|Add, To New Empty %x1|Add, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
+ else
+ mode= 0; // XXX pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
+
+ if(mode<1) return;
+
+ /* do operations */
+ add_hook(scene, v3d, mode);
+}
+
+void hookmenu(Scene *scene, View3D *v3d)
+{
+ /* only called in object mode */
+ short event, changed=0;
+ Object *ob;
+ Base *base;
+ ModifierData *md;
+ HookModifierData *hmd;
+
+ event= 0; // XXX pupmenu("Modify Hooks for Selected...%t|Reset Offset%x1|Recenter at Cursor%x2");
+ if (event==-1) return;
+ if (event==2 && !(v3d)) {
+ // XXX error("Cannot perform this operation without a 3d view");
+ return;
+ }
+
+ for (base= FIRSTBASE; base; base= base->next) {
+ if(TESTBASELIB(v3d, base)) {
+ for (md = base->object->modifiers.first; md; md=md->next) {
+ if (md->type==eModifierType_Hook) {
+ ob = base->object;
+ hmd = (HookModifierData*) md;
+
+ /*
+ * Copied from modifiers_cursorHookCenter and
+ * modifiers_clearHookOffset, should consolidate
+ * */
+
+ if (event==1) {
+ if(hmd->object) {
+ Mat4Invert(hmd->object->imat, hmd->object->obmat);
+ Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+
+ changed= 1;
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ }
+ } else {
+ float *curs = give_cursor(scene, v3d);
+ float bmat[3][3], imat[3][3];
+
+ where_is_object(scene, ob);
+
+ Mat3CpyMat4(bmat, ob->obmat);
+ Mat3Inv(imat, bmat);
+
+ curs= give_cursor(scene, v3d);
+ hmd->cent[0]= curs[0]-ob->obmat[3][0];
+ hmd->cent[1]= curs[1]-ob->obmat[3][1];
+ hmd->cent[2]= curs[2]-ob->obmat[3][2];
+ Mat3MulVecfl(imat, hmd->cent);
+
+ changed= 1;
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ }
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ }
+}
+
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 1eb867e19a0..87c4560916d 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -34,51 +34,84 @@ struct Lattice;
struct Curve;
struct Object;
struct Mesh;
+struct HookModifierData;
/* internal exports only */
+/* object_transform.c */
+void OBJECT_OT_location_clear(struct wmOperatorType *ot);
+void OBJECT_OT_rotation_clear(struct wmOperatorType *ot);
+void OBJECT_OT_scale_clear(struct wmOperatorType *ot);
+void OBJECT_OT_origin_clear(struct wmOperatorType *ot);
+void OBJECT_OT_visual_transform_apply(struct wmOperatorType *ot);
+void OBJECT_OT_location_apply(struct wmOperatorType *ot);
+void OBJECT_OT_scale_apply(struct wmOperatorType *ot);
+void OBJECT_OT_rotation_apply(struct wmOperatorType *ot);
+void OBJECT_OT_center_set(struct wmOperatorType *ot);
-/* object_edit.c */
-void OBJECT_OT_editmode_toggle(struct wmOperatorType *ot);
+/* object_relations.c */
void OBJECT_OT_parent_set(struct wmOperatorType *ot);
void OBJECT_OT_parent_clear(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_parent_set(struct wmOperatorType *ot);
void OBJECT_OT_track_set(struct wmOperatorType *ot);
void OBJECT_OT_track_clear(struct wmOperatorType *ot);
+void OBJECT_OT_slow_parent_set(struct wmOperatorType *ot);
+void OBJECT_OT_slow_parent_clear(struct wmOperatorType *ot);
+void OBJECT_OT_make_local(struct wmOperatorType *ot);
+void OBJECT_OT_move_to_layer(struct wmOperatorType *ot);
+
+/* object_edit.c */
+void OBJECT_OT_mode_set(struct wmOperatorType *ot);
+void OBJECT_OT_editmode_toggle(struct wmOperatorType *ot);
+void OBJECT_OT_posemode_toggle(struct wmOperatorType *ot);
+void OBJECT_OT_restrictview_set(struct wmOperatorType *ot);
+void OBJECT_OT_restrictview_clear(struct wmOperatorType *ot);
+void OBJECT_OT_proxy_make(struct wmOperatorType *ot);
+void OBJECT_OT_shade_smooth(struct wmOperatorType *ot);
+void OBJECT_OT_shade_flat(struct wmOperatorType *ot);
+
+/* object_select.c */
void OBJECT_OT_select_all_toggle(struct wmOperatorType *ot);
-void OBJECT_OT_select_invert(struct wmOperatorType *ot);
+void OBJECT_OT_select_inverse(struct wmOperatorType *ot);
void OBJECT_OT_select_random(struct wmOperatorType *ot);
void OBJECT_OT_select_by_type(struct wmOperatorType *ot);
void OBJECT_OT_select_by_layer(struct wmOperatorType *ot);
void OBJECT_OT_select_linked(struct wmOperatorType *ot);
-void OBJECT_OT_location_clear(struct wmOperatorType *ot);
-void OBJECT_OT_rotation_clear(struct wmOperatorType *ot);
-void OBJECT_OT_scale_clear(struct wmOperatorType *ot);
-void OBJECT_OT_origin_clear(struct wmOperatorType *ot);
-void OBJECT_OT_restrictview_set(struct wmOperatorType *ot);
-void OBJECT_OT_restrictview_clear(struct wmOperatorType *ot);
-void OBJECT_OT_slowparent_set(struct wmOperatorType *ot);
-void OBJECT_OT_slowparent_clear(struct wmOperatorType *ot);
-void OBJECT_OT_center_set(struct wmOperatorType *ot);
-void OBJECT_OT_dupli_set_real(struct wmOperatorType *ot);
-void OBJECT_OT_object_add(struct wmOperatorType *ot);
-void OBJECT_OT_duplicate_add(struct wmOperatorType *ot);
-void OBJECT_OT_delete(struct wmOperatorType *ot);
+void OBJECT_OT_select_grouped(struct wmOperatorType *ot);
+void OBJECT_OT_select_mirror(struct wmOperatorType *ot);
+void OBJECT_OT_select_name(struct wmOperatorType *ot);
+/* object_add.c */
+void OBJECT_OT_add(struct wmOperatorType *ot);
void OBJECT_OT_mesh_add(struct wmOperatorType *ot);
void OBJECT_OT_curve_add(struct wmOperatorType *ot);
void OBJECT_OT_surface_add(struct wmOperatorType *ot);
+void OBJECT_OT_metaball_add(struct wmOperatorType *ot);
void OBJECT_OT_text_add(struct wmOperatorType *ot);
void OBJECT_OT_armature_add(struct wmOperatorType *ot);
- /* only used as menu */
-void OBJECT_OT_primitive_add(struct wmOperatorType *ot);
+void OBJECT_OT_lamp_add(struct wmOperatorType *ot);
+void OBJECT_OT_primitive_add(struct wmOperatorType *ot); /* only used as menu */
-/* editlattice.c */
+void OBJECT_OT_duplicates_make_real(struct wmOperatorType *ot);
+void OBJECT_OT_duplicate(struct wmOperatorType *ot);
+void OBJECT_OT_delete(struct wmOperatorType *ot);
+void OBJECT_OT_join(struct wmOperatorType *ot);
+void OBJECT_OT_convert(struct wmOperatorType *ot);
+
+/* object_hook.c */
+int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r);
+void object_hook_select(Object *obedit, struct HookModifierData *hmd);
+
+/* object_lattice.c */
void free_editLatt(Object *ob);
void make_editLatt(Object *obedit);
void load_editLatt(Object *obedit);
void remake_editLatt(Object *obedit);
-/* editgroup.c */
+void LATTICE_OT_select_all_toggle(struct wmOperatorType *ot);
+void LATTICE_OT_make_regular(struct wmOperatorType *ot);
+
+/* object_group.c */
void GROUP_OT_group_create(struct wmOperatorType *ot);
void GROUP_OT_objects_remove(struct wmOperatorType *ot);
void GROUP_OT_objects_add_active(struct wmOperatorType *ot);
@@ -86,11 +119,61 @@ void GROUP_OT_objects_remove_active(struct wmOperatorType *ot);
/* object_modifier.c */
void OBJECT_OT_modifier_add(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_remove(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_move_up(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_move_down(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_apply(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_convert(struct wmOperatorType *ot);
+void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
-void OBJECT_OT_modifier_mdef_bind(struct wmOperatorType *ot);
+void OBJECT_OT_multires_higher_levels_delete(struct wmOperatorType *ot);
+void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot);
+void OBJECT_OT_hook_reset(struct wmOperatorType *ot);
+void OBJECT_OT_hook_recenter(struct wmOperatorType *ot);
+void OBJECT_OT_hook_select(struct wmOperatorType *ot);
+void OBJECT_OT_hook_assign(struct wmOperatorType *ot);
+void OBJECT_OT_explode_refresh(struct wmOperatorType *ot);
-/* editconstraint.c */
+/* object_constraint.c */
void OBJECT_OT_constraint_add(struct wmOperatorType *ot);
+void OBJECT_OT_constraint_add_with_targets(struct wmOperatorType *ot);
+void POSE_OT_constraint_add(struct wmOperatorType *ot);
+void POSE_OT_constraint_add_with_targets(struct wmOperatorType *ot);
+
+void OBJECT_OT_constraints_clear(struct wmOperatorType *ot);
+void POSE_OT_constraints_clear(struct wmOperatorType *ot);
+
+void POSE_OT_ik_add(struct wmOperatorType *ot);
+void POSE_OT_ik_clear(struct wmOperatorType *ot);
+
+void CONSTRAINT_OT_delete(struct wmOperatorType *ot);
+
+void CONSTRAINT_OT_move_up(struct wmOperatorType *ot);
+void CONSTRAINT_OT_move_down(struct wmOperatorType *ot);
+
+void CONSTRAINT_OT_stretchto_reset(struct wmOperatorType *ot);
+void CONSTRAINT_OT_limitdistance_reset(struct wmOperatorType *ot);
+void CONSTRAINT_OT_childof_set_inverse(struct wmOperatorType *ot);
+void CONSTRAINT_OT_childof_clear_inverse(struct wmOperatorType *ot);
+
+/* object_vgroup.c */
+void OBJECT_OT_vertex_group_add(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_remove(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_assign(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_remove_from(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_select(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_deselect(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_copy_to_linked(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_copy(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_menu(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot);
+
+void OBJECT_OT_game_property_new(struct wmOperatorType *ot);
+void OBJECT_OT_game_property_remove(struct wmOperatorType *ot);
+
+/* object_shapekey.c */
+void OBJECT_OT_shape_key_add(struct wmOperatorType *ot);
+void OBJECT_OT_shape_key_remove(struct wmOperatorType *ot);
#endif /* ED_OBJECT_INTERN_H */
diff --git a/source/blender/editors/object/editlattice.c b/source/blender/editors/object/object_lattice.c
index 523f38dd432..bd8171e8593 100644
--- a/source/blender/editors/object/editlattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -31,27 +31,22 @@
#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_view3d_types.h"
-#include "BKE_armature.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
#include "ED_object.h"
+#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_util.h"
@@ -60,16 +55,15 @@
#include "object_intern.h"
-/* ***************************** */
-
-static int okee() {return 0;}
+/********************** Load/Make/Free ********************/
void free_editLatt(Object *ob)
{
Lattice *lt= ob->data;
if(lt->editlatt) {
- if(lt->editlatt->def) MEM_freeN(lt->editlatt->def);
+ if(lt->editlatt->def)
+ MEM_freeN(lt->editlatt->def);
if(lt->editlatt->dvert)
free_dverts(lt->editlatt->dvert, lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw);
@@ -78,27 +72,6 @@ void free_editLatt(Object *ob)
}
}
-
-static void setflagsLatt(Object *obedit, int flag)
-{
- Lattice *lt= obedit->data;
- BPoint *bp;
- int a;
-
- bp= lt->editlatt->def;
-
- a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
-
- while(a--) {
- if(bp->hide==0) {
- bp->f1= flag;
- }
- bp++;
- }
-}
-
-
-
void make_editLatt(Object *obedit)
{
Lattice *lt= obedit->data;
@@ -108,10 +81,9 @@ void make_editLatt(Object *obedit)
lt= obedit->data;
- actkey = ob_get_keyblock(obedit);
- if(actkey) {
+ actkey= ob_get_keyblock(obedit);
+ if(actkey)
key_to_latt(actkey, lt);
- }
lt->editlatt= MEM_dupallocN(lt);
lt->editlatt->def= MEM_dupallocN(lt->def);
@@ -121,11 +93,8 @@ void make_editLatt(Object *obedit)
lt->editlatt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->editlatt->dvert, lt->dvert, tot);
}
-
- //BIF_undo_push("Original");
}
-
void load_editLatt(Object *obedit)
{
Lattice *lt;
@@ -136,7 +105,8 @@ void load_editLatt(Object *obedit)
lt= obedit->data;
- actkey = ob_get_keyblock(obedit);
+ actkey= ob_get_keyblock(obedit);
+
if(actkey) {
/* active key: vertices */
tot= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
@@ -154,7 +124,6 @@ void load_editLatt(Object *obedit)
}
}
else {
-
MEM_freeN(lt->def);
lt->def= MEM_dupallocN(lt->editlatt->def);
@@ -181,55 +150,136 @@ void load_editLatt(Object *obedit)
lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->dvert, lt->editlatt->dvert, tot);
}
-
}
-void remake_editLatt(Object *obedit)
+/************************** Operators *************************/
+
+static void setflagsLatt(Object *obedit, int flag)
{
- if(okee("Reload original data")==0) return;
+ Lattice *lt= obedit->data;
+ BPoint *bp;
+ int a;
- make_editLatt(obedit);
-
- //BIF_undo_push("Reload original");
+ bp= lt->editlatt->def;
+
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+
+ while(a--) {
+ if(bp->hide==0) {
+ bp->f1= flag;
+ }
+ bp++;
+ }
}
-
-void deselectall_Latt(Object *obedit)
+int de_select_all_exec(bContext *C, wmOperator *op)
{
+ Object *obedit= CTX_data_edit_object(C);
Lattice *lt= obedit->data;
BPoint *bp;
- int a;
+ int a, deselect= 0;
bp= lt->editlatt->def;
-
a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
while(a--) {
if(bp->hide==0) {
if(bp->f1) {
- setflagsLatt(obedit, 0);
- //BIF_undo_push("(De)select all");
- return;
+ deselect= 1;
+ break;
}
}
bp++;
}
- setflagsLatt(obedit, 1);
- //BIF_undo_push("(De)select all");
+
+ if(deselect)
+ setflagsLatt(obedit, 0);
+ else
+ setflagsLatt(obedit, 1);
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void LATTICE_OT_select_all_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select or Deselect All";
+ ot->description= "Toggle (de)select all UVW control points.";
+ ot->idname= "LATTICE_OT_select_all_toggle";
+
+ /* api callbacks */
+ ot->exec= de_select_all_exec;
+ ot->poll= ED_operator_editlattice;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+int make_regular_poll(bContext *C)
+{
+ Object *ob;
+
+ if(ED_operator_editlattice(C)) return 1;
+
+ ob= CTX_data_active_object(C);
+ return (ob && ob->type==OB_LATTICE);
+}
+
+int make_regular_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+ Lattice *lt;
+
+ if(ob) {
+ lt= ob->data;
+ resizelattice(lt->editlatt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+ }
+ else {
+ ob= CTX_data_active_object(C);
+ lt= ob->data;
+ resizelattice(lt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
+ }
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void LATTICE_OT_make_regular(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Regular";
+ ot->description= "Set UVW control points a uniform distance apart.";
+ ot->idname= "LATTICE_OT_make_regular";
+
+ /* api callbacks */
+ ot->exec= make_regular_exec;
+ ot->poll= make_regular_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/****************************** Mouse Selection *************************/
+
static void findnearestLattvert__doClosest(void *userData, BPoint *bp, int x, int y)
{
struct { BPoint *bp; short dist, select, mval[2]; } *data = userData;
float temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
- if ((bp->f1 & SELECT)==data->select) temp += 5;
- if (temp<data->dist) {
+ if((bp->f1 & SELECT)==data->select)
+ temp += 5;
+
+ if(temp<data->dist) {
data->dist = temp;
data->bp = bp;
}
}
+
static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel)
{
/* sel==1: selected gets a disadvantage */
@@ -247,34 +297,27 @@ static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel)
return data.bp;
}
-
void mouse_lattice(bContext *C, short mval[2], int extend)
{
ViewContext vc;
- BPoint *bp=0;
+ BPoint *bp= NULL;
view3d_set_viewcontext(C, &vc);
-
bp= findnearestLattvert(&vc, mval, 1);
if(bp) {
if(extend==0) {
-
setflagsLatt(vc.obedit, 0);
bp->f1 |= SELECT;
-
}
- else {
+ else
bp->f1 ^= SELECT; /* swap */
- }
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
- //BIF_undo_push("Select");
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
}
}
-
-/* **************** undo for lattice object ************** */
+/******************************** Undo *************************/
typedef struct UndoLattice {
BPoint *def;
@@ -324,20 +367,18 @@ static int validate_undoLatt(void *data, void *edata)
static void *get_editlatt(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
+
if(obedit && obedit->type==OB_LATTICE) {
Lattice *lt= obedit->data;
return lt->editlatt;
}
+
return NULL;
}
-
/* and this is all the undo system needs to know */
void undo_push_lattice(bContext *C, 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 4bcfcc4d5ab..cc8cc420bf7 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -25,25 +25,31 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "MEM_guardedalloc.h"
+#include "DNA_action_types.h"
#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_force.h"
#include "DNA_scene_types.h"
+#include "BLI_arithb.h"
#include "BLI_listbase.h"
+#include "BKE_action.h"
#include "BKE_curve.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_lattice.h"
#include "BKE_mesh.h"
@@ -52,6 +58,7 @@
#include "BKE_report.h"
#include "BKE_object.h"
#include "BKE_particle.h"
+#include "BKE_softbody.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -67,31 +74,102 @@
/******************************** API ****************************/
-int ED_object_modifier_delete(ReportList *reports, Object *ob, ModifierData *md)
+int ED_object_modifier_add(ReportList *reports, Scene *scene, Object *ob, int type)
+{
+ ModifierData *md;
+ ModifierTypeInfo *mti = modifierType_getInfo(type);
+
+ if(mti->flags&eModifierTypeFlag_Single) {
+ if(modifiers_findByType(ob, type)) {
+ BKE_report(reports, RPT_WARNING, "Only one modifier of this type allowed.");
+ return 0;
+ }
+ }
+
+ if(type == eModifierType_ParticleSystem) {
+ object_add_particle_system(scene, ob);
+ }
+ else {
+ if(mti->flags&eModifierTypeFlag_RequiresOriginalData) {
+ md = ob->modifiers.first;
+
+ while(md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform)
+ md = md->next;
+
+ BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
+ }
+ else
+ BLI_addtail(&ob->modifiers, modifier_new(type));
+
+ /* special cases */
+ if(type == eModifierType_Softbody) {
+ if(!ob->soft) {
+ ob->soft= sbNew(scene);
+ ob->softflag |= OB_SB_GOAL|OB_SB_EDGES;
+ }
+ }
+ else if(type == eModifierType_Collision) {
+ if(!ob->pd)
+ ob->pd= object_add_collision_fields();
+
+ ob->pd->deflect= 1;
+ DAG_scene_sort(scene);
+ }
+ else if(type == eModifierType_Surface)
+ DAG_scene_sort(scene);
+ }
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ return 1;
+}
+
+int ED_object_modifier_remove(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)
{
ModifierData *obmd;
/* It seems on rapid delete it is possible to
* get called twice on same modifier, so make
* sure it is in list. */
- for (obmd=ob->modifiers.first; obmd; obmd=obmd->next)
- if (obmd==md)
+ for(obmd=ob->modifiers.first; obmd; obmd=obmd->next)
+ if(obmd==md)
break;
- if (!obmd)
+ if(!obmd)
return 0;
+ /* special cases */
if(md->type == eModifierType_ParticleSystem) {
ParticleSystemModifierData *psmd=(ParticleSystemModifierData*)md;
BLI_remlink(&ob->particlesystem, psmd->psys);
psys_free(ob, psmd->psys);
}
+ else if(md->type == eModifierType_Softbody) {
+ if(ob->soft) {
+ sbFree(ob->soft);
+ ob->soft= NULL;
+ ob->softflag= 0;
+ }
+ }
+ else if(md->type == eModifierType_Collision) {
+ if(ob->pd)
+ ob->pd->deflect= 0;
- BLI_remlink(&ob->modifiers, md);
+ DAG_scene_sort(scene);
+ }
+ else if(md->type == eModifierType_Surface) {
+ if(ob->pd)
+ ob->pd->flag &= ~PFIELD_SURFACE;
+
+ DAG_scene_sort(scene);
+ }
+ BLI_remlink(&ob->modifiers, md);
modifier_free(md);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
return 1;
}
@@ -103,9 +181,10 @@ int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md
if(mti->type!=eModifierTypeType_OnlyDeform) {
ModifierTypeInfo *nmti = modifierType_getInfo(md->prev->type);
- if(nmti->flags&eModifierTypeFlag_RequiresOriginalData)
+ if(nmti->flags&eModifierTypeFlag_RequiresOriginalData) {
BKE_report(reports, RPT_WARNING, "Cannot move above a modifier requiring original data.");
return 0;
+ }
}
BLI_remlink(&ob->modifiers, md);
@@ -150,16 +229,16 @@ int ED_object_modifier_convert(ReportList *reports, Scene *scene, Object *ob, Mo
int totpart=0, totchild=0;
if(md->type != eModifierType_ParticleSystem) return 0;
- if(G.f & G_PARTICLEEDIT) return 0;
+ if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) return 0;
psys=((ParticleSystemModifierData *)md)->psys;
part= psys->part;
- if(part->draw_as == PART_DRAW_GR || part->draw_as == PART_DRAW_OB) {
+ if(part->ren_as == PART_DRAW_GR || part->ren_as == PART_DRAW_OB) {
; // XXX make_object_duplilist_real(NULL);
}
else {
- if(part->draw_as != PART_DRAW_PATH || psys->pathcache == 0)
+ if(part->ren_as != PART_DRAW_PATH || psys->pathcache == 0)
return 0;
totpart= psys->totcached;
@@ -260,6 +339,10 @@ int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, Modi
}
mesh_pmv_off(ob, me);
+
+ /* Multires: ensure that recent sculpting is applied */
+ if(md->type == eModifierType_Multires)
+ multires_force_update(ob);
dm = mesh_create_derived_for_modifier(scene, ob, md);
if (!dm) {
@@ -293,7 +376,7 @@ int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, Modi
MEM_freeN(vertexCos);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
@@ -323,35 +406,66 @@ int ED_object_modifier_copy(ReportList *reports, Object *ob, ModifierData *md)
/***************************** OPERATORS ****************************/
+static int modifier_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ return (ptr.data != NULL && !((ID*)ptr.id.data)->lib);
+}
+
/************************ add modifier operator *********************/
static int modifier_add_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
- ModifierData *md;
int type= RNA_enum_get(op->ptr, "type");
- ModifierTypeInfo *mti = modifierType_getInfo(type);
-
- if(mti->flags&eModifierTypeFlag_RequiresOriginalData) {
- md = ob->modifiers.first;
- while(md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform)
- md = md->next;
-
- BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
- }
- else
- BLI_addtail(&ob->modifiers, modifier_new(type));
+ if(!ED_object_modifier_add(op->reports, scene, ob, type))
+ return OPERATOR_CANCELLED;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
+static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem *item= NULL, *md_item;
+ ModifierTypeInfo *mti;
+ Object *ob;
+ int totitem= 0, a;
+
+ if(!C || !(ob= CTX_data_active_object(C))) /* needed for docs */
+ return modifier_type_items;
+
+ for(a=0; modifier_type_items[a].identifier; a++) {
+ md_item= &modifier_type_items[a];
+
+ if(md_item->identifier[0]) {
+ mti= modifierType_getInfo(md_item->value);
+
+ if(mti->flags & eModifierTypeFlag_NoUserAdd)
+ continue;
+
+ if(!((mti->flags & eModifierTypeFlag_AcceptsCVs) ||
+ (ob->type==OB_MESH && (mti->flags & eModifierTypeFlag_AcceptsMesh))))
+ continue;
+ }
+
+ RNA_enum_item_add(&item, &totitem, md_item);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
void OBJECT_OT_modifier_add(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Add Modifier";
ot->description = "Add a modifier to the active object.";
@@ -360,40 +474,261 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= modifier_add_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* properties */
+ prop= RNA_def_enum(ot->srna, "type", modifier_type_items, eModifierType_Subsurf, "Type", "");
+ RNA_def_enum_funcs(prop, modifier_add_itemf);
+}
+
+/************************ remove modifier operator *********************/
+
+static int modifier_remove_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ED_object_modifier_remove(op->reports, scene, ob, md))
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_remove(wmOperatorType *ot)
+{
+ ot->name= "Remove Modifier";
+ ot->description= "Remove a modifier from the active object.";
+ ot->idname= "OBJECT_OT_modifier_remove";
ot->poll= ED_operator_object_active;
+
+ ot->exec= modifier_remove_exec;
+ ot->poll= modifier_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move up modifier operator *********************/
+
+static int modifier_move_up_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ED_object_modifier_move_up(op->reports, ob, md))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- /* XXX only some types should be here */
- RNA_def_enum(ot->srna, "type", modifier_type_items, 0, "Type", "");
+ return OPERATOR_FINISHED;
}
-/****************** multires subdivide operator *********************/
+void OBJECT_OT_modifier_move_up(wmOperatorType *ot)
+{
+ ot->name= "Move Up Modifier";
+ ot->description= "Move modifier up in the stack.";
+ ot->idname= "OBJECT_OT_modifier_move_up";
+ ot->poll= ED_operator_object_active;
-static int multires_subdivide_exec(bContext *C, wmOperator *op)
+ ot->exec= modifier_move_up_exec;
+ ot->poll= modifier_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move down modifier operator *********************/
+
+static int modifier_move_down_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ob || !md || !ED_object_modifier_move_down(op->reports, ob, md))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_move_down(wmOperatorType *ot)
{
- Object *ob = CTX_data_active_object(C);
- PointerRNA ptr = CTX_data_pointer_get(C, "modifier");
- MultiresModifierData *mmd = (RNA_struct_is_a(ptr.type, &RNA_Modifier))? ptr.data: NULL;
+ ot->name= "Move Down Modifier";
+ ot->description= "Move modifier down in the stack.";
+ ot->idname= "OBJECT_OT_modifier_move_down";
+ ot->poll= ED_operator_object_active;
+
+ ot->exec= modifier_move_down_exec;
+ ot->poll= modifier_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ apply modifier operator *********************/
+
+static int modifier_apply_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ob || !md || !ED_object_modifier_apply(op->reports, scene, ob, md))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_apply(wmOperatorType *ot)
+{
+ ot->name= "Apply Modifier";
+ ot->description= "Apply modifier and remove from the stack.";
+ ot->idname= "OBJECT_OT_modifier_apply";
+ ot->poll= ED_operator_object_active;
+
+ ot->exec= modifier_apply_exec;
+ ot->poll= modifier_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ convert modifier operator *********************/
+
+static int modifier_convert_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ob || !md || !ED_object_modifier_convert(op->reports, scene, ob, md))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_convert(wmOperatorType *ot)
+{
+ ot->name= "Convert Modifier";
+ ot->description= "Convert particles to a mesh object.";
+ ot->idname= "OBJECT_OT_modifier_convert";
+ ot->poll= ED_operator_object_active;
+
+ ot->exec= modifier_convert_exec;
+ ot->poll= modifier_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ copy modifier operator *********************/
+
+static int modifier_copy_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_Modifier);
+ Object *ob= ptr.id.data;
+ ModifierData *md= ptr.data;
+
+ if(!ob || !md || !ED_object_modifier_copy(op->reports, ob, md))
+ return OPERATOR_CANCELLED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_modifier_copy(wmOperatorType *ot)
+{
+ ot->name= "Copy Modifier";
+ ot->description= "Duplicate modifier at the same position in the stack.";
+ ot->idname= "OBJECT_OT_modifier_copy";
+ ot->poll= ED_operator_object_active;
+
+ ot->exec= modifier_copy_exec;
+ ot->poll= modifier_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************* multires delete higher levels operator ****************/
+
+static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier);
+ Object *ob= ptr.id.data;
+ MultiresModifierData *mmd= ptr.data;
if(mmd) {
- multiresModifier_subdivide(mmd, ob, 1, 0, mmd->simple);
+ multiresModifier_del_levels(mmd, ob, 1);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
}
return OPERATOR_FINISHED;
}
+void OBJECT_OT_multires_higher_levels_delete(wmOperatorType *ot)
+{
+ ot->name= "Delete Higher Levels";
+ ot->idname= "OBJECT_OT_multires_higher_levels_delete";
+ ot->poll= ED_operator_object_active;
+
+ ot->exec= multires_higher_levels_delete_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/****************** multires subdivide operator *********************/
+
+static int multires_subdivide_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier);
+ Object *ob= ptr.id.data;
+ MultiresModifierData *mmd= ptr.data;
+
+ multiresModifier_subdivide(mmd, ob, 1, 0, mmd->simple);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int multires_subdivide_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MultiresModifier);
+ ID *id= ptr.id.data;
+ return (ptr.data && id && !id->lib);
+}
+
void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
{
ot->name= "Multires Subdivide";
ot->description= "Add a new level of subdivision.";
ot->idname= "OBJECT_OT_multires_subdivide";
- ot->poll= ED_operator_object_active;
ot->exec= multires_subdivide_exec;
+ ot->poll= multires_subdivide_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -401,13 +736,14 @@ void OBJECT_OT_multires_subdivide(wmOperatorType *ot)
/************************ mdef bind operator *********************/
-static int modifier_mdef_bind_poll(bContext *C)
+static int meshdeform_poll(bContext *C)
{
- PointerRNA ptr= CTX_data_pointer_get(C, "modifier");
- return RNA_struct_is_a(ptr.type, &RNA_MeshDeformModifier);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_MeshDeformModifier);
+ ID *id= ptr.id.data;
+ return (ptr.data && id && !id->lib);
}
-static int modifier_mdef_bind_exec(bContext *C, wmOperator *op)
+static int meshdeform_bind_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
PointerRNA ptr= CTX_data_pointer_get(C, "modifier");
@@ -458,177 +794,205 @@ static int modifier_mdef_bind_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void OBJECT_OT_modifier_mdef_bind(wmOperatorType *ot)
+void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mesh Deform Bind";
ot->description = "Bind mesh to cage in mesh deform modifier.";
- ot->idname= "OBJECT_OT_modifier_mdef_bind";
+ ot->idname= "OBJECT_OT_meshdeform_bind";
/* api callbacks */
- ot->poll= modifier_mdef_bind_poll;
- ot->exec= modifier_mdef_bind_exec;
+ ot->poll= meshdeform_poll;
+ ot->exec= meshdeform_bind_exec;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-#if 0
-static void modifiers_add(void *ob_v, int type)
-{
- Object *ob = ob_v;
- ModifierTypeInfo *mti = modifierType_getInfo(type);
-
- if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
- ModifierData *md = ob->modifiers.first;
-
- while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
- md = md->next;
- }
-
- BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
- } else {
- BLI_addtail(&ob->modifiers, modifier_new(type));
- }
- ED_undo_push("Add modifier");
-}
-
-typedef struct MenuEntry {
- char *name;
- int ID;
-} MenuEntry;
+/******************** hook operators ************************/
-static int menuEntry_compare_names(const void *entry1, const void *entry2)
+static int hook_poll(bContext *C)
{
- return strcmp(((MenuEntry *)entry1)->name, ((MenuEntry *)entry2)->name);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
+ ID *id= ptr.id.data;
+ return (ptr.data && id && !id->lib);
}
-static uiBlock *modifiers_add_menu(void *ob_v)
+static int hook_reset_exec(bContext *C, wmOperator *op)
{
- Object *ob = ob_v;
- uiBlock *block;
- int i, yco=0;
- int numEntries = 0;
- MenuEntry entries[NUM_MODIFIER_TYPES];
-
- block= uiNewBlock(&curarea->uiblocks, "modifier_add_menu",
- UI_EMBOSSP, UI_HELV, curarea->win);
- uiBlockSetButmFunc(block, modifiers_add, ob);
-
- for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
- ModifierTypeInfo *mti = modifierType_getInfo(i);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
+ Object *ob= ptr.id.data;
+ HookModifierData *hmd= ptr.data;
- /* Only allow adding through appropriate other interfaces */
- if(ELEM3(i, eModifierType_Softbody, eModifierType_Hook, eModifierType_ParticleSystem)) continue;
+ if(hmd->object) {
+ bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
- if(ELEM4(i, eModifierType_Cloth, eModifierType_Collision, eModifierType_Surface, eModifierType_Fluidsim)) continue;
-
- if((mti->flags&eModifierTypeFlag_AcceptsCVs) ||
- (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
- entries[numEntries].name = mti->name;
- entries[numEntries].ID = i;
-
- ++numEntries;
+ if(hmd->subtarget[0] && pchan) {
+ float imat[4][4], mat[4][4];
+
+ /* calculate the world-space matrix for the pose-channel target first, then carry on as usual */
+ Mat4MulMat4(mat, pchan->pose_mat, hmd->object->obmat);
+
+ Mat4Invert(imat, mat);
+ Mat4MulSerie(hmd->parentinv, imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+ }
+ else {
+ Mat4Invert(hmd->object->imat, hmd->object->obmat);
+ Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
}
}
- qsort(entries, numEntries, sizeof(*entries), menuEntry_compare_names);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+void OBJECT_OT_hook_reset(wmOperatorType *ot)
+{
+ ot->name= "Hook Reset";
+ ot->description= "Recalculate and and clear offset transformation.";
+ ot->idname= "OBJECT_OT_hook_reset";
- for(i = 0; i < numEntries; ++i)
- uiDefBut(block, BUTM, B_MODIFIER_RECALC, entries[i].name,
- 0, yco -= 20, 160, 19, NULL, 0, 0, 1, entries[i].ID, "");
+ ot->exec= hook_reset_exec;
+ ot->poll= hook_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int hook_recenter_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
+ Object *ob= ptr.id.data;
+ HookModifierData *hmd= ptr.data;
+ float bmat[3][3], imat[3][3];
- uiTextBoundsBlock(block, 50);
- uiBlockSetDirection(block, UI_DOWN);
+ Mat3CpyMat4(bmat, ob->obmat);
+ Mat3Inv(imat, bmat);
- return block;
+ VECSUB(hmd->cent, scene->cursor, ob->obmat[3]);
+ Mat3MulVecfl(imat, hmd->cent);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
}
-#endif
-#if 0
-static void modifiers_clearHookOffset(bContext *C, void *ob_v, void *md_v)
+void OBJECT_OT_hook_recenter(wmOperatorType *ot)
{
- Object *ob = ob_v;
- ModifierData *md = md_v;
- HookModifierData *hmd = (HookModifierData*) md;
+ ot->name= "Hook Recenter";
+ ot->description= "Set hook center to cursor position.";
+ ot->idname= "OBJECT_OT_hook_recenter";
+
+ ot->exec= hook_recenter_exec;
+ ot->poll= hook_poll;
- if (hmd->object) {
- Mat4Invert(hmd->object->imat, hmd->object->obmat);
- Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
- ED_undo_push(C, "Clear hook offset");
- }
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static void modifiers_cursorHookCenter(bContext *C, void *ob_v, void *md_v)
+static int hook_select_exec(bContext *C, wmOperator *op)
{
- /* XXX
- Object *ob = ob_v;
- ModifierData *md = md_v;
- HookModifierData *hmd = (HookModifierData*) md;
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
+ Object *ob= ptr.id.data;
+ HookModifierData *hmd= ptr.data;
- if(G.vd) {
- float *curs = give_cursor();
- float bmat[3][3], imat[3][3];
+ object_hook_select(ob, hmd);
- where_is_object(ob);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
- Mat3CpyMat4(bmat, ob->obmat);
- Mat3Inv(imat, bmat);
-
- curs= give_cursor();
- hmd->cent[0]= curs[0]-ob->obmat[3][0];
- hmd->cent[1]= curs[1]-ob->obmat[3][1];
- hmd->cent[2]= curs[2]-ob->obmat[3][2];
- Mat3MulVecfl(imat, hmd->cent);
-
- ED_undo_push(C, "Hook cursor center");
- }*/
+ return OPERATOR_FINISHED;
}
-static void modifiers_selectHook(bContext *C, void *ob_v, void *md_v)
+void OBJECT_OT_hook_select(wmOperatorType *ot)
{
- /* XXX ModifierData *md = md_v;
- HookModifierData *hmd = (HookModifierData*) md;
+ ot->name= "Hook Select";
+ ot->description= "Selects effected vertices on mesh.";
+ ot->idname= "OBJECT_OT_hook_select";
- hook_select(hmd);*/
+ ot->exec= hook_select_exec;
+ ot->poll= hook_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static void modifiers_reassignHook(bContext *C, void *ob_v, void *md_v)
+static int hook_assign_exec(bContext *C, wmOperator *op)
{
- /* XXX ModifierData *md = md_v;
- HookModifierData *hmd = (HookModifierData*) md;
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier);
+ Object *ob= ptr.id.data;
+ HookModifierData *hmd= ptr.data;
float cent[3];
- int *indexar, tot, ok;
char name[32];
+ int *indexar, tot;
- ok= hook_getIndexArray(&tot, &indexar, name, cent);
+ if(!object_hook_index_array(ob, &tot, &indexar, name, cent)) {
+ BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group");
+ return OPERATOR_CANCELLED;
+ }
- if (!ok) {
- uiPupMenuError(C, "Requires selected vertices or active Vertex Group");
- } else {
- if (hmd->indexar) {
- MEM_freeN(hmd->indexar);
- }
+ if(hmd->indexar)
+ MEM_freeN(hmd->indexar);
+
+ VECCOPY(hmd->cent, cent);
+ hmd->indexar= indexar;
+ hmd->totindex= tot;
- VECCOPY(hmd->cent, cent);
- hmd->indexar = indexar;
- hmd->totindex = tot;
- }*/
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
}
-void modifiers_explodeFacepa(bContext *C, void *arg1, void *arg2)
+void OBJECT_OT_hook_assign(wmOperatorType *ot)
{
- ExplodeModifierData *emd=arg1;
+ ot->name= "Hook Assign";
+ ot->description= "Reassigns selected vertices to hook.";
+ ot->idname= "OBJECT_OT_hook_assign";
- emd->flag |= eExplodeFlag_CalcFaces;
+ ot->exec= hook_assign_exec;
+ ot->poll= hook_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void modifiers_explodeDelVg(bContext *C, void *arg1, void *arg2)
+/****************** explode refresh operator *********************/
+
+static int explode_refresh_poll(bContext *C)
{
- ExplodeModifierData *emd=arg1;
- emd->vgroup = 0;
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier);
+ ID *id= ptr.id.data;
+ return (ptr.data && id && !id->lib);
}
-#endif
+static int explode_refresh_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_ExplodeModifier);
+ Object *ob= ptr.id.data;
+ ExplodeModifierData *emd= ptr.data;
+
+ emd->flag |= eExplodeFlag_CalcFaces;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_explode_refresh(wmOperatorType *ot)
+{
+ ot->name= "Explode Refresh";
+ ot->description= "Refresh data in the Explode modifier.";
+ ot->idname= "OBJECT_OT_explode_refresh";
+
+ ot->exec= explode_refresh_exec;
+ ot->poll= explode_refresh_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index cfee6a55152..7397cead505 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -63,28 +63,47 @@
void ED_operatortypes_object(void)
{
+ wmOperatorType *ot;
+
+ WM_operatortype_append(OBJECT_OT_location_clear);
+ WM_operatortype_append(OBJECT_OT_rotation_clear);
+ WM_operatortype_append(OBJECT_OT_scale_clear);
+ WM_operatortype_append(OBJECT_OT_origin_clear);
+ WM_operatortype_append(OBJECT_OT_visual_transform_apply);
+ WM_operatortype_append(OBJECT_OT_location_apply);
+ WM_operatortype_append(OBJECT_OT_scale_apply);
+ WM_operatortype_append(OBJECT_OT_rotation_apply);
+ WM_operatortype_append(OBJECT_OT_center_set);
+
+ WM_operatortype_append(OBJECT_OT_mode_set);
WM_operatortype_append(OBJECT_OT_editmode_toggle);
+ WM_operatortype_append(OBJECT_OT_posemode_toggle);
+ WM_operatortype_append(OBJECT_OT_proxy_make);
+ WM_operatortype_append(OBJECT_OT_restrictview_clear);
+ WM_operatortype_append(OBJECT_OT_restrictview_set);
+ WM_operatortype_append(OBJECT_OT_shade_smooth);
+ WM_operatortype_append(OBJECT_OT_shade_flat);
+
WM_operatortype_append(OBJECT_OT_parent_set);
WM_operatortype_append(OBJECT_OT_parent_clear);
+ WM_operatortype_append(OBJECT_OT_vertex_parent_set);
WM_operatortype_append(OBJECT_OT_track_set);
WM_operatortype_append(OBJECT_OT_track_clear);
- WM_operatortype_append(OBJECT_OT_select_invert);
+ WM_operatortype_append(OBJECT_OT_slow_parent_set);
+ WM_operatortype_append(OBJECT_OT_slow_parent_clear);
+ WM_operatortype_append(OBJECT_OT_make_local);
+ WM_operatortype_append(OBJECT_OT_move_to_layer);
+
+ WM_operatortype_append(OBJECT_OT_select_inverse);
WM_operatortype_append(OBJECT_OT_select_random);
WM_operatortype_append(OBJECT_OT_select_all_toggle);
WM_operatortype_append(OBJECT_OT_select_by_type);
WM_operatortype_append(OBJECT_OT_select_by_layer);
WM_operatortype_append(OBJECT_OT_select_linked);
- WM_operatortype_append(OBJECT_OT_location_clear);
- WM_operatortype_append(OBJECT_OT_rotation_clear);
- WM_operatortype_append(OBJECT_OT_scale_clear);
- WM_operatortype_append(OBJECT_OT_origin_clear);
- WM_operatortype_append(OBJECT_OT_restrictview_clear);
- WM_operatortype_append(OBJECT_OT_restrictview_set);
- WM_operatortype_append(OBJECT_OT_slowparent_set);
- WM_operatortype_append(OBJECT_OT_slowparent_clear);
- WM_operatortype_append(OBJECT_OT_center_set);
- WM_operatortype_append(OBJECT_OT_dupli_set_real);
- WM_operatortype_append(OBJECT_OT_duplicate_add);
+ WM_operatortype_append(OBJECT_OT_select_grouped);
+ WM_operatortype_append(OBJECT_OT_select_mirror);
+ WM_operatortype_append(OBJECT_OT_select_name); /* XXX - weak, not compat with linked objects */
+
WM_operatortype_append(GROUP_OT_group_create);
WM_operatortype_append(GROUP_OT_objects_remove);
WM_operatortype_append(GROUP_OT_objects_add_active);
@@ -96,59 +115,151 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_text_add);
WM_operatortype_append(OBJECT_OT_surface_add);
WM_operatortype_append(OBJECT_OT_armature_add);
- WM_operatortype_append(OBJECT_OT_object_add);
+ WM_operatortype_append(OBJECT_OT_lamp_add);
+ WM_operatortype_append(OBJECT_OT_add);
WM_operatortype_append(OBJECT_OT_primitive_add);
+ WM_operatortype_append(OBJECT_OT_mesh_add);
+ WM_operatortype_append(OBJECT_OT_metaball_add);
+ WM_operatortype_append(OBJECT_OT_duplicates_make_real);
+ WM_operatortype_append(OBJECT_OT_duplicate);
+ WM_operatortype_append(OBJECT_OT_join);
+ WM_operatortype_append(OBJECT_OT_convert);
WM_operatortype_append(OBJECT_OT_modifier_add);
+ WM_operatortype_append(OBJECT_OT_modifier_remove);
+ WM_operatortype_append(OBJECT_OT_modifier_move_up);
+ WM_operatortype_append(OBJECT_OT_modifier_move_down);
+ WM_operatortype_append(OBJECT_OT_modifier_apply);
+ WM_operatortype_append(OBJECT_OT_modifier_convert);
+ WM_operatortype_append(OBJECT_OT_modifier_copy);
WM_operatortype_append(OBJECT_OT_multires_subdivide);
- WM_operatortype_append(OBJECT_OT_modifier_mdef_bind);
+ WM_operatortype_append(OBJECT_OT_multires_higher_levels_delete);
+ WM_operatortype_append(OBJECT_OT_meshdeform_bind);
+ WM_operatortype_append(OBJECT_OT_hook_reset);
+ WM_operatortype_append(OBJECT_OT_hook_recenter);
+ WM_operatortype_append(OBJECT_OT_hook_select);
+ WM_operatortype_append(OBJECT_OT_hook_assign);
+ WM_operatortype_append(OBJECT_OT_explode_refresh);
WM_operatortype_append(OBJECT_OT_constraint_add);
+ WM_operatortype_append(OBJECT_OT_constraint_add_with_targets);
+ WM_operatortype_append(POSE_OT_constraint_add);
+ WM_operatortype_append(POSE_OT_constraint_add_with_targets);
+ WM_operatortype_append(OBJECT_OT_constraints_clear);
+ WM_operatortype_append(POSE_OT_constraints_clear);
+ WM_operatortype_append(POSE_OT_ik_add);
+ WM_operatortype_append(POSE_OT_ik_clear);
+ WM_operatortype_append(CONSTRAINT_OT_delete);
+ WM_operatortype_append(CONSTRAINT_OT_move_up);
+ WM_operatortype_append(CONSTRAINT_OT_move_down);
+ WM_operatortype_append(CONSTRAINT_OT_stretchto_reset);
+ WM_operatortype_append(CONSTRAINT_OT_limitdistance_reset);
+ WM_operatortype_append(CONSTRAINT_OT_childof_set_inverse);
+ WM_operatortype_append(CONSTRAINT_OT_childof_clear_inverse);
+
+ WM_operatortype_append(OBJECT_OT_vertex_group_add);
+ WM_operatortype_append(OBJECT_OT_vertex_group_remove);
+ WM_operatortype_append(OBJECT_OT_vertex_group_assign);
+ WM_operatortype_append(OBJECT_OT_vertex_group_remove_from);
+ WM_operatortype_append(OBJECT_OT_vertex_group_select);
+ WM_operatortype_append(OBJECT_OT_vertex_group_deselect);
+ WM_operatortype_append(OBJECT_OT_vertex_group_copy_to_linked);
+ WM_operatortype_append(OBJECT_OT_vertex_group_copy);
+ WM_operatortype_append(OBJECT_OT_vertex_group_menu);
+ WM_operatortype_append(OBJECT_OT_vertex_group_set_active);
+
+ WM_operatortype_append(OBJECT_OT_game_property_new);
+ WM_operatortype_append(OBJECT_OT_game_property_remove);
+
+ WM_operatortype_append(OBJECT_OT_shape_key_add);
+ WM_operatortype_append(OBJECT_OT_shape_key_remove);
+
+ WM_operatortype_append(LATTICE_OT_select_all_toggle);
+ WM_operatortype_append(LATTICE_OT_make_regular);
+
+ /* macros */
+ ot= WM_operatortype_append_macro("OBJECT_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
+ if(ot) {
+ WM_operatortype_macro_define(ot, "OBJECT_OT_duplicate");
+ WM_operatortype_macro_define(ot, "TFM_OT_translate");
+ }
+}
+
+static int object_mode_poll(bContext *C)
+{
+ Object *ob= CTX_data_active_object(C);
+ return (!ob || ob->mode == OB_MODE_OBJECT);
}
void ED_keymap_object(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0);
+ wmKeyMap *keymap;
+ wmKeymapItem *kmi;
+
+ keymap= WM_keymap_find(wm, "Object Non-modal", 0, 0);
/* Note: this keymap works disregarding mode */
WM_keymap_add_item(keymap, "OBJECT_OT_editmode_toggle", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_center_set", CKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_posemode_toggle", TABKEY, KM_PRESS, KM_CTRL, 0);
+
+ kmi = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", VKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", OB_MODE_VERTEX_PAINT);
+ RNA_boolean_set(kmi->ptr, "toggle", 1);
+ kmi = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "mode", OB_MODE_WEIGHT_PAINT);
+ RNA_boolean_set(kmi->ptr, "toggle", 1);
+
+ WM_keymap_add_item(keymap, "OBJECT_OT_center_set", CKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_CTRL, 0);
/* Note: this keymap gets disabled in non-objectmode, */
- keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
+ keymap= WM_keymap_find(wm, "Object Mode", 0, 0);
+ keymap->poll= object_mode_poll;
WM_keymap_add_item(keymap, "OBJECT_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_random", PADASTERKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_by_type", PADASTERKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "OBJECT_OT_select_by_layer", PADASTERKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "OBJECT_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_select_mirror", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_track_set", TKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_track_set", TKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_verify_item(keymap, "OBJECT_OT_track_clear", TKEY, KM_PRESS, KM_ALT, 0);
+
+ WM_keymap_verify_item(keymap, "OBJECT_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ WM_keymap_verify_item(keymap, "OBJECT_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_location_clear", GKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_rotation_clear", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_origin_clear", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_restrictview_clear", HKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_restrictview_set", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_clear", HKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_set", HKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_restrictview_set", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
- WM_keymap_verify_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "OBJECT_OT_primitive_add", AKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_verify_item(keymap, "OBJECT_OT_duplicate_add", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_duplicate", DKEY, KM_PRESS, KM_ALT, 0)->ptr, "linked", 1);
+ WM_keymap_add_item(keymap, "OBJECT_OT_join", JKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_convert", CKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "OBJECT_OT_proxy_make", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
// XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith
WM_keymap_verify_item(keymap, "ANIM_OT_insert_keyframe_menu", IKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_old", IKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_v3d", IKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_verify_item(keymap, "GROUP_OT_group_create", GKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_verify_item(keymap, "GROUP_OT_objects_remove", GKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_verify_item(keymap, "GROUP_OT_objects_add_active", GKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_verify_item(keymap, "GROUP_OT_objects_remove_active", GKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
+ /* Lattice */
+ keymap= WM_keymap_find(wm, "Lattice", 0, 0);
+ keymap->poll= ED_operator_editlattice;
+
+ WM_keymap_add_item(keymap, "LATTICE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
}
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
new file mode 100644
index 00000000000..4a0c812f7b1
--- /dev/null
+++ b/source/blender/editors/object/object_relations.c
@@ -0,0 +1,1773 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2002-2008 full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_world_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+
+#include "BKE_action.h"
+#include "BKE_animsys.h"
+#include "BKE_armature.h"
+#include "BKE_context.h"
+#include "BKE_constraint.h"
+#include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_lattice.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_mball.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_sca.h"
+#include "BKE_texture.h"
+#include "BKE_utildefines.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_curve.h"
+#include "ED_object.h"
+#include "ED_screen.h"
+
+#include "object_intern.h"
+
+/* ************* XXX **************** */
+static int pupmenu(const char *msg) {return 0;}
+static int pupmenu_col(const char *msg, int val) {return 0;}
+
+/*********************** Make Vertex Parent Operator ************************/
+
+static int vertex_parent_set_poll(bContext *C)
+{
+ return ED_operator_editmesh(C) || ED_operator_editsurfcurve(C) || ED_operator_editlattice(C);
+}
+
+static int vertex_parent_set_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
+ EditVert *eve;
+ Curve *cu;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ Object *par;
+ int a, v1=0, v2=0, v3=0, v4=0, nr=1;
+
+ /* we need 1 to 3 selected vertices */
+
+ if(obedit->type==OB_MESH) {
+ Mesh *me= obedit->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ eve= em->verts.first;
+ while(eve) {
+ if(eve->f & 1) {
+ if(v1==0) v1= nr;
+ else if(v2==0) v2= nr;
+ else if(v3==0) v3= nr;
+ else if(v4==0) v4= nr;
+ else break;
+ }
+ nr++;
+ eve= eve->next;
+ }
+
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) {
+ ListBase *editnurb= curve_get_editcurve(obedit);
+
+ cu= obedit->data;
+
+ nu= editnurb->first;
+ while(nu) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(BEZSELECTED_HIDDENHANDLES(cu, bezt)) {
+ if(v1==0) v1= nr;
+ else if(v2==0) v2= nr;
+ else if(v3==0) v3= nr;
+ else if(v4==0) v4= nr;
+ else break;
+ }
+ nr++;
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ if(v1==0) v1= nr;
+ else if(v2==0) v2= nr;
+ else if(v3==0) v3= nr;
+ else if(v4==0) v4= nr;
+ else break;
+ }
+ nr++;
+ bp++;
+ }
+ }
+ nu= nu->next;
+ }
+ }
+ else if(obedit->type==OB_LATTICE) {
+ Lattice *lt= obedit->data;
+
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->def;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ if(v1==0) v1= nr;
+ else if(v2==0) v2= nr;
+ else if(v3==0) v3= nr;
+ else if(v4==0) v4= nr;
+ else break;
+ }
+ nr++;
+ bp++;
+ }
+ }
+
+ if(v4 || !((v1 && v2==0 && v3==0) || (v1 && v2 && v3)) ) {
+ BKE_report(op->reports, RPT_ERROR, "Select either 1 or 3 vertices to parent to");
+ return OPERATOR_CANCELLED;
+ }
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob != obedit) {
+ ob->recalc |= OB_RECALC;
+ par= obedit->parent;
+
+ while(par) {
+ if(par==ob) break;
+ par= par->parent;
+ }
+ if(par) {
+ BKE_report(op->reports, RPT_ERROR, "Loop in parents");
+ }
+ else {
+ Object workob;
+
+ ob->parent= BASACT->object;
+ if(v3) {
+ ob->partype= PARVERT3;
+ ob->par1= v1-1;
+ ob->par2= v2-1;
+ ob->par3= v3-1;
+
+ /* inverse parent matrix */
+ what_does_parent(scene, ob, &workob);
+ Mat4Invert(ob->parentinv, workob.obmat);
+ }
+ else {
+ ob->partype= PARVERT1;
+ ob->par1= v1-1;
+
+ /* inverse parent matrix */
+ what_does_parent(scene, ob, &workob);
+ Mat4Invert(ob->parentinv, workob.obmat);
+ }
+ }
+ }
+ }
+ CTX_DATA_END;
+
+ DAG_scene_sort(scene);
+
+ WM_event_add_notifier(C, NC_OBJECT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_parent_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Vertex Parent";
+ ot->description = "Parent selected objects to the selected vertices.";
+ ot->idname= "OBJECT_OT_vertex_parent_set";
+
+ /* api callbacks */
+ ot->poll= vertex_parent_set_poll;
+ ot->exec= vertex_parent_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** Make Proxy Operator *************************/
+
+/* present menu listing the possible objects within the group to proxify */
+static void proxy_group_objects_menu (bContext *C, wmOperator *op, Object *ob, Group *group)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ GroupObject *go;
+ int len=0;
+
+ /* check if there are any objects within the group to assign for */
+ for (go= group->gobject.first; go; go= go->next) {
+ if (go->ob) len++;
+ }
+ if (len==0) return;
+
+ /* now create the menu to draw */
+ pup= uiPupMenuBegin(C, "Make Proxy For:", 0);
+ layout= uiPupMenuLayout(pup);
+
+ for (go= group->gobject.first; go; go= go->next) {
+ if (go->ob) {
+ PointerRNA props_ptr;
+
+ /* create operator menu item with relevant properties filled in */
+ props_ptr= uiItemFullO(layout, go->ob->id.name+2, 0, op->idname, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ RNA_string_set(&props_ptr, "object", go->ob->id.name+2);
+ RNA_string_set(&props_ptr, "group_object", go->ob->id.name+2);
+ }
+ }
+
+ /* display the menu, and be done */
+ uiPupMenuEnd(C, pup);
+}
+
+/* set the object to proxify */
+static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+
+ /* sanity checks */
+ if (!scene || scene->id.lib || !ob)
+ return OPERATOR_CANCELLED;
+
+ /* Get object to work on - use a menu if we need to... */
+ if (ob->dup_group && ob->dup_group->id.lib) {
+ /* gives menu with list of objects in group */
+ proxy_group_objects_menu(C, op, ob, ob->dup_group);
+ }
+ 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->type->name, 0, op->idname, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ RNA_string_set(&props_ptr, "object", ob->id.name+2);
+
+ /* present the menu and be done... */
+ uiPupMenuEnd(C, pup);
+ }
+ else {
+ /* error.. cannot continue */
+ BKE_report(op->reports, RPT_ERROR, "Can only make proxy for a referenced object or group");
+ }
+
+ /* this invoke just calls another instance of this operator... */
+ return OPERATOR_CANCELLED;
+}
+
+static int make_proxy_exec (bContext *C, wmOperator *op)
+{
+ Object *ob=NULL, *gob=NULL;
+ Scene *scene= CTX_data_scene(C);
+ char ob_name[21], gob_name[21];
+
+ /* get object and group object
+ * - firstly names
+ * - then pointers from context
+ */
+ RNA_string_get(op->ptr, "object", ob_name);
+ RNA_string_get(op->ptr, "group_object", gob_name);
+
+ if (gob_name[0]) {
+ Group *group;
+ GroupObject *go;
+
+ /* active object is group object... */
+ // FIXME: we should get the nominated name instead
+ gob= CTX_data_active_object(C);
+ group= gob->dup_group;
+
+ /* find the object to affect */
+ for (go= group->gobject.first; go; go= go->next) {
+ if ((go->ob) && strcmp(go->ob->id.name+2, gob_name)==0) {
+ ob= go->ob;
+ break;
+ }
+ }
+ }
+ else {
+ /* just use the active object for now */
+ // FIXME: we should get the nominated name instead
+ ob= CTX_data_active_object(C);
+ }
+
+ if (ob) {
+ Object *newob;
+ Base *newbase, *oldbase= BASACT;
+ char name[32];
+
+ /* Add new object for the proxy */
+ newob= add_object(scene, OB_EMPTY);
+ if (gob)
+ strcpy(name, gob->id.name+2);
+ else
+ strcpy(name, ob->id.name+2);
+ strcat(name, "_proxy");
+ rename_id(&newob->id, name);
+
+ /* set layers OK */
+ newbase= BASACT; /* add_object sets active... */
+ newbase->lay= oldbase->lay;
+ newob->lay= newbase->lay;
+
+ /* remove base, leave user count of object, it gets linked in object_make_proxy */
+ if (gob==NULL) {
+ BLI_remlink(&scene->base, oldbase);
+ MEM_freeN(oldbase);
+ }
+
+ object_make_proxy(newob, ob, gob);
+
+ /* depsgraph flushes are needed for the new data */
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&newob->id, OB_RECALC);
+
+ WM_event_add_notifier(C, NC_OBJECT, NULL);
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No object to make proxy for");
+ return OPERATOR_CANCELLED;
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_proxy_make (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Proxy";
+ ot->idname= "OBJECT_OT_proxy_make";
+ ot->description= "Add empty object to become local replacement data of a library-linked object";
+
+ /* callbacks */
+ ot->invoke= make_proxy_invoke;
+ ot->exec= make_proxy_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_string(ot->srna, "object", "", 19, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for.");
+ RNA_def_string(ot->srna, "group_object", "", 19, "Group Object", "Name of group instancer (if applicable).");
+}
+
+/********************** Clear Parent Operator ******************* */
+
+static EnumPropertyItem prop_clear_parent_types[] = {
+ {0, "CLEAR", 0, "Clear Parent", ""},
+ {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation (Clear Track)", ""},
+ {2, "CLEAR_INVERSE", 0, "Clear Parent Inverse", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* note, poll should check for editable scene */
+static int parent_clear_exec(bContext *C, wmOperator *op)
+{
+ int type= RNA_enum_get(op->ptr, "type");
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+
+ if(type == 0) {
+ ob->parent= NULL;
+ }
+ else if(type == 1) {
+ ob->parent= NULL;
+ ob->track= NULL;
+ ED_object_apply_obmat(ob);
+ }
+ else if(type == 2)
+ Mat4One(ob->parentinv);
+
+ ob->recalc |= OB_RECALC;
+ }
+ CTX_DATA_END;
+
+ DAG_scene_sort(CTX_data_scene(C));
+ ED_anim_dag_flush_update(C);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_parent_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Parent";
+ ot->description = "Clear the object's parenting.";
+ ot->idname= "OBJECT_OT_parent_clear";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= parent_clear_exec;
+
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_clear_parent_types, 0, "Type", "");
+}
+
+/* ******************** Make Parent Operator *********************** */
+
+#define PAR_OBJECT 0
+#define PAR_ARMATURE 1
+#define PAR_ARMATURE_NAME 2
+#define PAR_ARMATURE_ENVELOPE 3
+#define PAR_ARMATURE_AUTO 4
+#define PAR_BONE 5
+#define PAR_CURVE 6
+#define PAR_FOLLOW 7
+#define PAR_PATH_CONST 8
+#define PAR_LATTICE 9
+#define PAR_VERTEX 10
+#define PAR_TRIA 11
+
+static EnumPropertyItem prop_make_parent_types[] = {
+ {PAR_OBJECT, "OBJECT", 0, "Object", ""},
+ {PAR_ARMATURE, "ARMATURE", 0, "Armature Deform", ""},
+ {PAR_ARMATURE_NAME, "ARMATURE_NAME", 0, " With Empty Groups", ""},
+ {PAR_ARMATURE_AUTO, "ARMATURE_AUTO", 0, " With Automatic Weights", ""},
+ {PAR_ARMATURE_ENVELOPE, "ARMATURE_ENVELOPE", 0, " With Envelope Weights", ""},
+ {PAR_BONE, "BONE", 0, "Bone", ""},
+ {PAR_CURVE, "CURVE", 0, "Curve Deform", ""},
+ {PAR_FOLLOW, "FOLLOW", 0, "Follow Path", ""},
+ {PAR_PATH_CONST, "PATH_CONST", 0, "Path Constraint", ""},
+ {PAR_LATTICE, "LATTICE", 0, "Lattice Deform", ""},
+ {PAR_VERTEX, "VERTEX", 0, "Vertex", ""},
+ {PAR_TRIA, "TRIA", 0, "Triangle", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+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);
+}
+
+void ED_object_parent(Object *ob, Object *par, int type, const char *substr)
+{
+ if(!par || test_parent_loop(par, ob)) {
+ ob->parent= NULL;
+ ob->partype= PAROBJECT;
+ ob->parsubstr[0]= 0;
+ return;
+ }
+
+ /* this could use some more checks */
+
+ ob->parent= par;
+ ob->partype &= ~PARTYPE;
+ ob->partype |= type;
+ BLI_strncpy(ob->parsubstr, substr, sizeof(ob->parsubstr));
+}
+
+static int parent_set_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *par= CTX_data_active_object(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);
+
+ par->recalc |= OB_RECALC_OB;
+
+ /* preconditions */
+ if(partype==PAR_FOLLOW || partype==PAR_PATH_CONST) {
+ if(par->type!=OB_CURVE)
+ return OPERATOR_CANCELLED;
+ else {
+ Curve *cu= par->data;
+
+ if((cu->flag & CU_PATH)==0) {
+ cu->flag |= CU_PATH|CU_FOLLOW;
+ makeDispListCurveTypes(scene, par, 0); /* force creation of path data */
+ }
+ else cu->flag |= CU_FOLLOW;
+
+ /* fall back on regular parenting now (for follow only) */
+ if(partype == PAR_FOLLOW)
+ partype= PAR_OBJECT;
+ }
+ }
+ else if(partype==PAR_BONE) {
+ pchan= get_active_posechannel(par);
+
+ if(pchan==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active Bone");
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ /* context itterator */
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+
+ if(ob!=par) {
+
+ if( test_parent_loop(par, ob) ) {
+ BKE_report(op->reports, RPT_ERROR, "Loop in parents");
+ }
+ else {
+ Object workob;
+
+ /* apply transformation of previous parenting */
+ ED_object_apply_obmat(ob);
+
+ /* set the parent (except for follow-path constraint option) */
+ if(partype != PAR_PATH_CONST)
+ ob->parent= par;
+
+ /* handle types */
+ if (pchan)
+ strcpy (ob->parsubstr, pchan->name);
+ else
+ ob->parsubstr[0]= 0;
+
+ /* constraint */
+ if(partype == PAR_PATH_CONST) {
+ bConstraint *con;
+ bFollowPathConstraint *data;
+ float cmat[4][4], vec[3];
+
+ con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
+ strcpy (con->name, "AutoPath");
+
+ data = con->data;
+ data->tar = par;
+
+ add_constraint_to_object(con, ob);
+
+ get_constraint_target_matrix(con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - give_timeoffset(ob));
+ VecSubf(vec, ob->obmat[3], cmat[3]);
+
+ ob->loc[0] = vec[0];
+ ob->loc[1] = vec[1];
+ ob->loc[2] = vec[2];
+ }
+ 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);
+ else if(partype == PAR_ARMATURE_ENVELOPE)
+ create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE);
+ else if(partype == PAR_ARMATURE_AUTO)
+ create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO);
+
+ /* get corrected inverse */
+ ob->partype= PAROBJECT;
+ what_does_parent(scene, ob, &workob);
+
+ ob->partype= PARSKEL;
+
+ Mat4Invert(ob->parentinv, workob.obmat);
+ }
+ else {
+ /* calculate inverse parent matrix */
+ what_does_parent(scene, ob, &workob);
+ Mat4Invert(ob->parentinv, workob.obmat);
+ }
+
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
+
+ if(partype == PAR_PATH_CONST)
+ ; /* don't do anything here, since this is not technically "parenting" */
+ if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm )
+ ob->partype= PARSKEL; /* note, dna define, not operator property */
+ else if (partype == PAR_BONE)
+ ob->partype= PARBONE; /* note, dna define, not operator property */
+ else
+ ob->partype= PAROBJECT; /* note, dna define, not operator property */
+ }
+ }
+ }
+ CTX_DATA_END;
+
+ DAG_scene_sort(CTX_data_scene(C));
+ ED_anim_dag_flush_update(C);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *ob= CTX_data_active_object(C);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
+
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_OBJECT);
+
+ /* ob becomes parent, make the associated menus */
+ if(ob->type==OB_ARMATURE) {
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_NAME);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_ENVELOPE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_AUTO);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_BONE);
+ }
+ else if(ob->type==OB_CURVE) {
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_CURVE);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_FOLLOW);
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_PATH_CONST);
+ }
+ else if(ob->type == OB_LATTICE) {
+ uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_LATTICE);
+ }
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+
+void OBJECT_OT_parent_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Parent";
+ ot->description = "Set the object's parenting.";
+ ot->idname= "OBJECT_OT_parent_set";
+
+ /* api callbacks */
+ ot->invoke= parent_set_invoke;
+ ot->exec= parent_set_exec;
+
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_make_parent_types, 0, "Type", "");
+}
+
+/************************ Clear Slow Parent Operator *********************/
+
+static int object_slow_parent_clear_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->parent) {
+ if(ob->partype & PARSLOW) {
+ ob->partype -= PARSLOW;
+ where_is_object(scene, ob);
+ ob->partype |= PARSLOW;
+ ob->recalc |= OB_RECALC_OB;
+ }
+ }
+ }
+ CTX_DATA_END;
+
+ ED_anim_dag_flush_update(C);
+ WM_event_add_notifier(C, NC_SCENE, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_slow_parent_clear(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Clear Slow Parent";
+ ot->description = "Clear the object's slow parent.";
+ ot->idname= "OBJECT_OT_slow_parent_clear";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= object_slow_parent_clear_exec;
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** Make Slow Parent Operator *********************/
+
+static int object_slow_parent_set_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->parent)
+ ob->partype |= PARSLOW;
+
+ ob->recalc |= OB_RECALC_OB;
+
+ }
+ CTX_DATA_END;
+
+ ED_anim_dag_flush_update(C);
+ WM_event_add_notifier(C, NC_SCENE, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_slow_parent_set(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Set Slow Parent";
+ ot->description = "Set the object's slow parent.";
+ ot->idname= "OBJECT_OT_slow_parent_set";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= object_slow_parent_set_exec;
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Clear Track Operator ******************* */
+
+static EnumPropertyItem prop_clear_track_types[] = {
+ {0, "CLEAR", 0, "Clear Track", ""},
+ {1, "CLEAR_KEEP_TRANSFORM", 0, "Clear and Keep Transformation (Clear Track)", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* note, poll should check for editable scene */
+static int object_track_clear_exec(bContext *C, wmOperator *op)
+{
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if(CTX_data_edit_object(C)) {
+ BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
+ return OPERATOR_CANCELLED;
+ }
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ ob->track= NULL;
+ ob->recalc |= OB_RECALC;
+
+ if(type == 1)
+ ED_object_apply_obmat(ob);
+ }
+ CTX_DATA_END;
+
+ DAG_scene_sort(CTX_data_scene(C));
+ ED_anim_dag_flush_update(C);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_track_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear track";
+ ot->description = "Clear tracking constraint or flag from object.";
+ ot->idname= "OBJECT_OT_track_clear";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_track_clear_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_clear_track_types, 0, "Type", "");
+}
+
+/************************** Make Track Operator *****************************/
+
+static EnumPropertyItem prop_make_track_types[] = {
+ {1, "TRACKTO", 0, "TrackTo Constraint", ""},
+ {2, "LOCKTRACK", 0, "LockTrack Constraint", ""},
+ {3, "OLDTRACK", 0, "Old Track", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int track_set_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if(type == 1) {
+ bConstraint *con;
+ bTrackToConstraint *data;
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if(base!=BASACT) {
+ con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
+ strcpy (con->name, "AutoTrack");
+
+ data = con->data;
+ data->tar = BASACT->object;
+ base->object->recalc |= OB_RECALC;
+
+ /* Lamp and Camera track differently by default */
+ if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
+ data->reserved1 = TRACK_nZ;
+ data->reserved2 = UP_Y;
+ }
+
+ add_constraint_to_object(con, base->object);
+ }
+ }
+ CTX_DATA_END;
+ }
+ else if(type == 2) {
+ bConstraint *con;
+ bLockTrackConstraint *data;
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if(base!=BASACT) {
+ con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
+ strcpy (con->name, "AutoTrack");
+
+ data = con->data;
+ data->tar = BASACT->object;
+ base->object->recalc |= OB_RECALC;
+
+ /* Lamp and Camera track differently by default */
+ if (base->object->type == OB_LAMP || base->object->type == OB_CAMERA) {
+ data->trackflag = TRACK_nZ;
+ data->lockflag = LOCK_Y;
+ }
+
+ add_constraint_to_object(con, base->object);
+ }
+ }
+ CTX_DATA_END;
+ }
+ else {
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if(base!=BASACT) {
+ base->object->track= BASACT->object;
+ base->object->recalc |= OB_RECALC;
+ }
+ }
+ CTX_DATA_END;
+ }
+ DAG_scene_sort(CTX_data_scene(C));
+ ED_anim_dag_flush_update(C);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_track_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Track";
+ ot->description = "Make the object track another object, either by constraint or old way or locked track.";
+ ot->idname= "OBJECT_OT_track_set";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= track_set_exec;
+
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_make_track_types, 0, "Type", "");
+}
+
+/************************** Move to Layer Operator *****************************/
+
+static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
+{
+ int values[20], a;
+ unsigned int lay= 0;
+
+ if(!RNA_property_is_set(op->ptr, "layer")) {
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ lay |= base->lay;
+ }
+ CTX_DATA_END;
+
+ for(a=0; a<20; a++)
+ values[a]= (lay & (1<<a));
+
+ RNA_boolean_set_array(op->ptr, "layer", values);
+ }
+ else {
+ RNA_boolean_get_array(op->ptr, "layer", values);
+
+ for(a=0; a<20; a++)
+ if(values[a])
+ lay |= (1 << a);
+ }
+
+ return lay;
+}
+
+static int move_to_layer_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ move_to_layer_init(C, op);
+ return WM_operator_props_popup(C, op, event);
+}
+
+static int move_to_layer_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
+ unsigned int lay, local;
+ int islamp= 0;
+
+ lay= move_to_layer_init(C, op);
+ lay &= 0xFFFFFF;
+
+ if(lay==0) return OPERATOR_CANCELLED;
+
+ 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) {
+ lay= base->lay & ~v3d->lay;
+ base->lay= lay;
+ base->object->lay= lay;
+ base->object->flag &= ~SELECT;
+ base->flag &= ~SELECT;
+ if(base->object->type==OB_LAMP) islamp= 1;
+ }
+ CTX_DATA_END;
+ }
+ else {
+ /* normal non localview operation */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* upper byte is used for local view */
+ local= base->lay & 0xFF000000;
+ base->lay= lay + local;
+ base->object->lay= lay;
+ if(base->object->type==OB_LAMP) islamp= 1;
+ }
+ CTX_DATA_END;
+ }
+
+ if(islamp) reshadeall_displist(scene); /* only frees */
+
+ /* warning, active object may be hidden now */
+
+ WM_event_add_notifier(C, NC_SCENE, scene);
+ DAG_scene_sort(scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_move_to_layer(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move to Layer";
+ ot->description = "Move the object to different layers.";
+ ot->idname= "OBJECT_OT_move_to_layer";
+
+ /* api callbacks */
+ ot->invoke= move_to_layer_invoke;
+ ot->exec= move_to_layer_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean_layer_member(ot->srna, "layer", 20, NULL, "Layer", "");
+}
+
+/************************** Link to Scene Operator *****************************/
+
+void link_to_scene(unsigned short nr)
+{
+#if 0
+ Scene *sce= (Scene*) BLI_findlink(&G.main->scene, G.curscreen->scenenr-1);
+ Base *base, *nbase;
+
+ if(sce==0) return;
+ if(sce->id.lib) return;
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(TESTBASE(v3d, base)) {
+
+ nbase= MEM_mallocN( sizeof(Base), "newbase");
+ *nbase= *base;
+ BLI_addhead( &(sce->base), nbase);
+ id_us_plus((ID *)base->object);
+ }
+ }
+#endif
+}
+
+
+void make_links(bContext *C, wmOperator *op, Scene *scene, View3D *v3d, short event)
+{
+ Object *ob, *obt;
+ Base *base, *nbase, *sbase;
+ Scene *sce = NULL;
+ ID *id;
+ int a;
+ short nr=0;
+ char *strp;
+
+ if(!(ob=OBACT)) return;
+
+ if(event==1) {
+ IDnames_to_pupstring(&strp, NULL, NULL, &(G.main->scene), 0, &nr);
+
+ if(nr == -2) {
+ MEM_freeN(strp);
+
+// XXX activate_databrowse((ID *)scene, ID_SCE, 0, B_INFOSCE, &(G.curscreen->scenenr), link_to_scene );
+
+ return;
+ }
+ else {
+ event= pupmenu_col(strp, 20);
+ MEM_freeN(strp);
+
+ if(event<= 0) return;
+
+ nr= 1;
+ sce= G.main->scene.first;
+ while(sce) {
+ if(nr==event) break;
+ nr++;
+ sce= sce->id.next;
+ }
+ if(sce==scene) {
+ BKE_report(op->reports, RPT_ERROR, "This is the current scene");
+ return;
+ }
+ if(sce==0 || sce->id.lib) return;
+
+ /* remember: is needed below */
+ event= 1;
+ }
+ }
+
+ /* All non group linking */
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(event==1 || base != BASACT) {
+
+ obt= base->object;
+
+ if(TESTBASE(v3d, base)) {
+
+ if(event==1) { /* to scene */
+
+ /* test if already linked */
+ sbase= sce->base.first;
+ while(sbase) {
+ if(sbase->object==base->object) break;
+ sbase= sbase->next;
+ }
+ if(sbase) { /* remove */
+ continue;
+ }
+
+ nbase= MEM_mallocN( sizeof(Base), "newbase");
+ *nbase= *base;
+ BLI_addhead( &(sce->base), nbase);
+ id_us_plus((ID *)base->object);
+ }
+ }
+ if(TESTBASELIB(v3d, base)) {
+ if(event==2 || event==5) { /* obdata */
+ if(ob->type==obt->type) {
+
+ id= obt->data;
+ id->us--;
+
+ id= ob->data;
+ id_us_plus(id);
+ obt->data= id;
+
+ /* if amount of material indices changed: */
+ test_object_materials(obt->data);
+
+ obt->recalc |= OB_RECALC_DATA;
+ }
+ }
+ else if(event==4) { /* ob ipo */
+#if 0 // XXX old animation system
+ if(obt->ipo) obt->ipo->id.us--;
+ obt->ipo= ob->ipo;
+ if(obt->ipo) {
+ id_us_plus((ID *)obt->ipo);
+ do_ob_ipo(scene, obt);
+ }
+#endif // XXX old animation system
+ }
+ else if(event==6) {
+ if(ob->dup_group) ob->dup_group->id.us--;
+ obt->dup_group= ob->dup_group;
+ if(obt->dup_group) {
+ id_us_plus((ID *)obt->dup_group);
+ obt->transflag |= OB_DUPLIGROUP;
+ }
+ }
+ else if(event==3) { /* materials */
+
+ /* new approach, using functions from kernel */
+ for(a=0; a<ob->totcol; a++) {
+ Material *ma= give_current_material(ob, a+1);
+ assign_material(obt, ma, a+1); /* also works with ma==NULL */
+ }
+ }
+ }
+ }
+ }
+
+ ED_anim_dag_flush_update(C);
+
+}
+
+void make_links_menu(bContext *C, Scene *scene, View3D *v3d)
+{
+ Object *ob;
+ short event=0;
+ char str[140];
+
+ if(!(ob=OBACT)) return;
+
+ strcpy(str, "Make Links %t|To Scene...%x1|%l|Object Ipo%x4");
+
+ if(ob->type==OB_MESH)
+ strcat(str, "|Mesh Data%x2|Materials%x3");
+ else if(ob->type==OB_CURVE)
+ strcat(str, "|Curve Data%x2|Materials%x3");
+ else if(ob->type==OB_FONT)
+ strcat(str, "|Text Data%x2|Materials%x3");
+ else if(ob->type==OB_SURF)
+ strcat(str, "|Surface Data%x2|Materials%x3");
+ else if(ob->type==OB_MBALL)
+ strcat(str, "|Materials%x3");
+ else if(ob->type==OB_CAMERA)
+ strcat(str, "|Camera Data%x2");
+ else if(ob->type==OB_LAMP)
+ strcat(str, "|Lamp Data%x2");
+ else if(ob->type==OB_LATTICE)
+ strcat(str, "|Lattice Data%x2");
+ else if(ob->type==OB_ARMATURE)
+ strcat(str, "|Armature Data%x2");
+
+ event= pupmenu(str);
+
+ if(event<= 0) return;
+
+ make_links(C, NULL, scene, v3d, event);
+}
+
+/**************************** Make Single User ********************************/
+
+static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
+{
+ ID_NEW(*obpoin);
+}
+
+void single_object_users(Scene *scene, View3D *v3d, int flag)
+{
+ Base *base;
+ Object *ob, *obn;
+
+ clear_sca_new_poins(); /* sensor/contr/act */
+
+ /* duplicate (must set newid) */
+ for(base= FIRSTBASE; base; base= base->next) {
+ ob= base->object;
+
+ if( (base->flag & flag)==flag ) {
+ if(ob->id.lib==NULL && ob->id.us>1) {
+ /* base gets copy of object */
+ obn= copy_object(ob);
+ base->object= obn;
+ ob->id.us--;
+ }
+ }
+ }
+
+ ID_NEW(scene->camera);
+ if(v3d) ID_NEW(v3d->camera);
+
+ /* object pointers */
+ for(base= FIRSTBASE; base; base= base->next) {
+ ob= base->object;
+ if(ob->id.lib==NULL) {
+ relink_constraints(&base->object->constraints);
+ if (base->object->pose){
+ bPoseChannel *chan;
+ for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
+ relink_constraints(&chan->constraints);
+ }
+ }
+ modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
+
+ ID_NEW(ob->parent);
+ ID_NEW(ob->track);
+ }
+ }
+
+ set_sca_new_poins();
+}
+
+void new_id_matar(Material **matar, int totcol)
+{
+ ID *id;
+ int a;
+
+ for(a=0; a<totcol; a++) {
+ id= (ID *)matar[a];
+ if(id && id->lib==0) {
+ if(id->newid) {
+ matar[a]= (Material *)id->newid;
+ id_us_plus(id->newid);
+ id->us--;
+ }
+ else if(id->us>1) {
+ matar[a]= copy_material(matar[a]);
+ id->us--;
+ id->newid= (ID *)matar[a];
+ }
+ }
+ }
+}
+
+void single_obdata_users(Scene *scene, int flag)
+{
+ Object *ob;
+ Lamp *la;
+ Curve *cu;
+ //Camera *cam;
+ Base *base;
+ Mesh *me;
+ ID *id;
+ int a;
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ ob= base->object;
+ if(ob->id.lib==NULL && (base->flag & flag)==flag ) {
+ id= ob->data;
+
+ if(id && id->us>1 && id->lib==0) {
+ ob->recalc= OB_RECALC_DATA;
+
+ 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);
+ }
+ }
+ }
+ break;
+ case OB_CAMERA:
+ ob->data= copy_camera(ob->data);
+ break;
+ case OB_MESH:
+ me= ob->data= copy_mesh(ob->data);
+ //if(me && me->key)
+ // ipo_idnew(me->key->ipo); /* drivers */
+ break;
+ case OB_MBALL:
+ ob->data= copy_mball(ob->data);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ ob->data= cu= copy_curve(ob->data);
+ ID_NEW(cu->bevobj);
+ ID_NEW(cu->taperobj);
+ break;
+ case OB_LATTICE:
+ ob->data= copy_lattice(ob->data);
+ break;
+ case OB_ARMATURE:
+ ob->recalc |= OB_RECALC_DATA;
+ ob->data= copy_armature(ob->data);
+ armature_rebuild_pose(ob, ob->data);
+ break;
+ default:
+ printf("ERROR single_obdata_users: can't copy %s\n", id->name);
+ return;
+ }
+
+ id->us--;
+ id->newid= ob->data;
+
+ }
+
+#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
+ }
+ }
+
+ me= G.main->mesh.first;
+ while(me) {
+ ID_NEW(me->texcomesh);
+ me= me->id.next;
+ }
+}
+
+void single_ipo_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 */
+ }
+ }
+ }
+#endif // XXX old animation system
+}
+
+void single_mat_users(Scene *scene, int flag)
+{
+ Object *ob;
+ Base *base;
+ Material *ma, *man;
+ Tex *tex;
+ int a, b;
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ ob= base->object;
+ if(ob->id.lib==NULL && (flag==0 || (base->flag & SELECT)) ) {
+
+ for(a=1; a<=ob->totcol; a++) {
+ ma= give_current_material(ob, a);
+ if(ma) {
+ /* do not test for LIB_NEW: this functions guaranteed delivers single_users! */
+
+ if(ma->id.us>1) {
+ man= copy_material(ma);
+
+ 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
+
+ for(b=0; b<MAX_MTEX; b++) {
+ if(ma->mtex[b] && ma->mtex[b]->tex) {
+ tex= ma->mtex[b]->tex;
+ if(tex->id.us>1) {
+ ma->mtex[b]->tex= copy_texture(tex);
+ tex->id.us--;
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+}
+
+void do_single_tex_user(Tex **from)
+{
+ Tex *tex, *texn;
+
+ tex= *from;
+ if(tex==0) return;
+
+ if(tex->id.newid) {
+ *from= (Tex *)tex->id.newid;
+ id_us_plus(tex->id.newid);
+ tex->id.us--;
+ }
+ else if(tex->id.us>1) {
+ texn= copy_texture(tex);
+ tex->id.newid= (ID *)texn;
+ tex->id.us--;
+ *from= texn;
+ }
+}
+
+void single_tex_users_expand()
+{
+ /* only when 'parent' blocks are LIB_NEW */
+ Main *bmain= G.main;
+ Material *ma;
+ Lamp *la;
+ World *wo;
+ int b;
+
+ for(ma= bmain->mat.first; ma; ma=ma->id.next) {
+ if(ma->id.flag & LIB_NEW) {
+ for(b=0; b<MAX_MTEX; b++) {
+ if(ma->mtex[b] && ma->mtex[b]->tex) {
+ do_single_tex_user( &(ma->mtex[b]->tex) );
+ }
+ }
+ }
+ }
+
+ for(la= bmain->lamp.first; la; la=la->id.next) {
+ if(la->id.flag & LIB_NEW) {
+ for(b=0; b<MAX_MTEX; b++) {
+ if(la->mtex[b] && la->mtex[b]->tex) {
+ do_single_tex_user( &(la->mtex[b]->tex) );
+ }
+ }
+ }
+ }
+
+ for(wo= bmain->world.first; wo; wo=wo->id.next) {
+ if(wo->id.flag & LIB_NEW) {
+ for(b=0; b<MAX_MTEX; b++) {
+ if(wo->mtex[b] && wo->mtex[b]->tex) {
+ do_single_tex_user( &(wo->mtex[b]->tex) );
+ }
+ }
+ }
+ }
+}
+
+static void single_mat_users_expand(void)
+{
+ /* only when 'parent' blocks are LIB_NEW */
+ Main *bmain= G.main;
+ Object *ob;
+ Mesh *me;
+ Curve *cu;
+ MetaBall *mb;
+ Material *ma;
+ int a;
+
+ for(ob=bmain->object.first; ob; ob=ob->id.next)
+ if(ob->id.flag & LIB_NEW)
+ new_id_matar(ob->mat, ob->totcol);
+
+ for(me=bmain->mesh.first; me; me=me->id.next)
+ if(me->id.flag & LIB_NEW)
+ new_id_matar(me->mat, me->totcol);
+
+ for(cu=bmain->curve.first; cu; cu=cu->id.next)
+ if(cu->id.flag & LIB_NEW)
+ new_id_matar(cu->mat, cu->totcol);
+
+ for(mb=bmain->mball.first; mb; mb=mb->id.next)
+ if(mb->id.flag & LIB_NEW)
+ new_id_matar(mb->mat, mb->totcol);
+
+ /* material imats */
+ for(ma=bmain->mat.first; ma; ma=ma->id.next)
+ if(ma->id.flag & LIB_NEW)
+ for(a=0; a<MAX_MTEX; a++)
+ if(ma->mtex[a])
+ ID_NEW(ma->mtex[a]->object);
+}
+
+void single_user(Scene *scene, View3D *v3d)
+{
+ int nr;
+
+ if(scene->id.lib) return;
+
+ clear_id_newpoins();
+
+ nr= pupmenu("Make Single User%t|Object|Object & ObData|Object & ObData & Materials+Tex|Materials+Tex|Ipos");
+ if(nr>0) {
+
+ if(nr==1) single_object_users(scene, v3d, 1);
+
+ else if(nr==2) {
+ single_object_users(scene, v3d, 1);
+ single_obdata_users(scene, 1);
+ }
+ else if(nr==3) {
+ single_object_users(scene, v3d, 1);
+ single_obdata_users(scene, 1);
+ single_mat_users(scene, 1); /* also tex */
+
+ }
+ else if(nr==4) {
+ single_mat_users(scene, 1);
+ }
+ else if(nr==5) {
+ single_ipo_users(scene, 1);
+ }
+
+
+ clear_id_newpoins();
+
+ }
+}
+
+/* used for copying scenes */
+void ED_object_single_users(Scene *scene, int full)
+{
+ single_object_users(scene, NULL, 0);
+
+ if(full) {
+ single_obdata_users(scene, 0);
+ single_mat_users_expand();
+ single_tex_users_expand();
+ }
+
+ clear_id_newpoins();
+}
+
+/******************************* Make Local ***********************************/
+
+/* helper for below, ma was checked to be not NULL */
+static void make_local_makelocalmaterial(Material *ma)
+{
+ AnimData *adt;
+ int b;
+
+ id_make_local(&ma->id, 0);
+
+ for(b=0; b<MAX_MTEX; b++)
+ if(ma->mtex[b] && ma->mtex[b]->tex)
+ id_make_local(&ma->mtex[b]->tex->id, 0);
+
+ adt= BKE_animdata_from_id(&ma->id);
+ if(adt) BKE_animdata_make_local(adt);
+
+ /* nodetree? XXX */
+}
+
+static int make_local_exec(bContext *C, wmOperator *op)
+{
+ AnimData *adt;
+ ParticleSystem *psys;
+ Material *ma, ***matarar;
+ Lamp *la;
+ ID *id;
+ int a, b, mode= RNA_boolean_get(op->ptr, "type");
+
+ if(mode==3) {
+ all_local(NULL, 0); /* NULL is all libs */
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+ return OPERATOR_FINISHED;
+ }
+
+ clear_id_newpoins();
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->id.lib)
+ id_make_local(&ob->id, 0);
+ }
+ CTX_DATA_END;
+
+ /* maybe object pointers */
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->id.lib==NULL) {
+ ID_NEW(ob->parent);
+ ID_NEW(ob->track);
+ }
+ }
+ CTX_DATA_END;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ id= ob->data;
+
+ if(id && mode>1) {
+ id_make_local(id, 0);
+ adt= BKE_animdata_from_id(id);
+ if(adt) BKE_animdata_make_local(adt);
+ }
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ id_make_local(&psys->part->id, 0);
+
+ adt= BKE_animdata_from_id(&ob->id);
+ if(adt) BKE_animdata_make_local(adt);
+ }
+ CTX_DATA_END;
+
+ if(mode>1) {
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->type==OB_LAMP) {
+ la= ob->data;
+
+ for(b=0; b<MAX_MTEX; b++)
+ if(la->mtex[b] && la->mtex[b]->tex)
+ id_make_local(&la->mtex[b]->tex->id, 0);
+ }
+ else {
+ for(a=0; a<ob->totcol; a++) {
+ ma= ob->mat[a];
+ if(ma)
+ make_local_makelocalmaterial(ma);
+ }
+
+ matarar= (Material ***)give_matarar(ob);
+ if(matarar) {
+ for(a=0; a<ob->totcol; a++) {
+ ma= (*matarar)[a];
+ if(ma)
+ make_local_makelocalmaterial(ma);
+ }
+ }
+ }
+ }
+ CTX_DATA_END;
+ }
+
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_make_local(wmOperatorType *ot)
+{
+ static EnumPropertyItem type_items[]= {
+ {1, "SELECTED_OBJECTS", 0, "Selected Objects", ""},
+ {2, "SELECTED_OBJECTS_DATA", 0, "Selected Objects and Data", ""},
+ {3, "ALL", 0, "All", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Make Local";
+ ot->description = "Make library linked datablocks local to this file.";
+ ot->idname= "OBJECT_OT_make_local";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= make_local_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
+}
+
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
new file mode 100644
index 00000000000..98603ee843a
--- /dev/null
+++ b/source/blender/editors/object/object_select.c
@@ -0,0 +1,1026 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2002-2008 full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_group_types.h"
+#include "DNA_material_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_property_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_listbase.h"
+#include "BLI_rand.h"
+#include "BLI_string.h"
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_group.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_particle.h"
+#include "BKE_property.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+#include "BKE_utildefines.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_object.h"
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "object_intern.h"
+
+/************************ Exported **************************/
+
+/* simple API for object selection, rather than just using the flag
+ * 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! */
+
+void ED_base_object_select(Base *base, short mode)
+{
+ if (base) {
+ if (mode==BA_SELECT) {
+ if (!(base->object->restrictflag & OB_RESTRICT_SELECT))
+ if (mode==BA_SELECT) base->flag |= SELECT;
+ }
+ else if (mode==BA_DESELECT) {
+ base->flag &= ~SELECT;
+ }
+ base->object->flag= base->flag;
+ }
+}
+
+/* also to set active NULL */
+void ED_base_object_activate(bContext *C, Base *base)
+{
+ Scene *scene= CTX_data_scene(C);
+ Base *tbase;
+
+ /* sets scene->basact */
+ BASACT= base;
+
+ if(base) {
+
+ /* XXX old signals, remember to handle notifiers now! */
+ // select_actionchannel_by_name(base->object->action, "Object", 1);
+
+ /* disable temporal locks */
+ for(tbase=FIRSTBASE; tbase; tbase= tbase->next) {
+ if(base!=tbase && (tbase->object->shapeflag & OB_SHAPE_TEMPLOCK)) {
+ tbase->object->shapeflag &= ~OB_SHAPE_TEMPLOCK;
+ DAG_id_flush_update(&tbase->object->id, OB_RECALC_DATA);
+ }
+ }
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
+ }
+ else
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, NULL);
+}
+
+/********************** Selection Operators **********************/
+
+/************************ Select by Type *************************/
+
+static int object_select_by_type_exec(bContext *C, wmOperator *op)
+{
+ short obtype, extend;
+
+ obtype = RNA_enum_get(op->ptr, "type");
+ extend= RNA_boolean_get(op->ptr, "extend");
+
+ if (extend == 0) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if(base->object->type==obtype) {
+ ED_base_object_select(base, BA_SELECT);
+ }
+ }
+ CTX_DATA_END;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_by_type(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select By Type";
+ ot->description = "Select all visible objects that are of a type.";
+ ot->idname= "OBJECT_OT_select_by_type";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_select_by_type_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_enum(ot->srna, "type", object_type_items, 1, "Type", "");
+}
+
+/*********************** Selection by Links *********************/
+
+static EnumPropertyItem prop_select_linked_types[] = {
+ {1, "IPO", 0, "Object IPO", ""}, // XXX depreceated animation system stuff...
+ {2, "OBDATA", 0, "Ob Data", ""},
+ {3, "MATERIAL", 0, "Material", ""},
+ {4, "TEXTURE", 0, "Texture", ""},
+ {5, "DUPGROUP", 0, "Dupligroup", ""},
+ {6, "PARTICLE", 0, "Particle System", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int object_select_linked_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob;
+ void *obdata = NULL;
+ Material *mat = NULL, *mat1;
+ Tex *tex=0;
+ int a, b;
+ int nr = RNA_enum_get(op->ptr, "type");
+ short changed = 0, extend;
+ /* events (nr):
+ * Object Ipo: 1
+ * ObData: 2
+ * Current Material: 3
+ * Current Texture: 4
+ * DupliGroup: 5
+ * PSys: 6
+ */
+
+ extend= RNA_boolean_get(op->ptr, "extend");
+
+ if (extend == 0) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+
+ ob= OBACT;
+ if(ob==0){
+ BKE_report(op->reports, RPT_ERROR, "No Active Object");
+ return OPERATOR_CANCELLED;
+ }
+
+ if(nr==1) {
+ // XXX old animation system
+ //ipo= ob->ipo;
+ //if(ipo==0) return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
+ }
+ else if(nr==2) {
+ if(ob->data==0) return OPERATOR_CANCELLED;
+ obdata= ob->data;
+ }
+ else if(nr==3 || nr==4) {
+ mat= give_current_material(ob, ob->actcol);
+ if(mat==0) return OPERATOR_CANCELLED;
+ if(nr==4) {
+ if(mat->mtex[ (int)mat->texact ]) tex= mat->mtex[ (int)mat->texact ]->tex;
+ if(tex==0) return OPERATOR_CANCELLED;
+ }
+ }
+ else if(nr==5) {
+ if(ob->dup_group==NULL) return OPERATOR_CANCELLED;
+ }
+ else if(nr==6) {
+ if(ob->particlesystem.first==NULL) return OPERATOR_CANCELLED;
+ }
+ else return OPERATOR_CANCELLED;
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if(nr==1) {
+ // XXX old animation system
+ //if(base->object->ipo==ipo) base->flag |= SELECT;
+ //changed = 1;
+ }
+ else if(nr==2) {
+ if(base->object->data==obdata) base->flag |= SELECT;
+ changed = 1;
+ }
+ else if(nr==3 || nr==4) {
+ ob= base->object;
+
+ for(a=1; a<=ob->totcol; a++) {
+ mat1= give_current_material(ob, a);
+ if(nr==3) {
+ if(mat1==mat) base->flag |= SELECT;
+ changed = 1;
+ }
+ else if(mat1 && nr==4) {
+ for(b=0; b<MAX_MTEX; b++) {
+ if(mat1->mtex[b]) {
+ if(tex==mat1->mtex[b]->tex) {
+ base->flag |= SELECT;
+ changed = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ else if(nr==5) {
+ if(base->object->dup_group==ob->dup_group) {
+ base->flag |= SELECT;
+ changed = 1;
+ }
+ }
+ else if(nr==6) {
+ /* loop through other, then actives particles*/
+ ParticleSystem *psys;
+ ParticleSystem *psys_act;
+
+ for(psys=base->object->particlesystem.first; psys; psys=psys->next) {
+ for(psys_act=ob->particlesystem.first; psys_act; psys_act=psys_act->next) {
+ if (psys->part == psys_act->part) {
+ base->flag |= SELECT;
+ changed = 1;
+ break;
+ }
+ }
+
+ if (base->flag & SELECT) {
+ break;
+ }
+ }
+ }
+ base->object->flag= base->flag;
+ }
+ CTX_DATA_END;
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_select_linked(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Linked";
+ ot->description = "Select all visible objects that are linked.";
+ ot->idname= "OBJECT_OT_select_linked";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_select_linked_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_enum(ot->srna, "type", prop_select_linked_types, 0, "Type", "");
+}
+
+/*********************** Selected Grouped ********************/
+
+static EnumPropertyItem prop_select_grouped_types[] = {
+ {1, "CHILDREN_RECURSIVE", 0, "Children", ""},
+ {2, "CHILDREN", 0, "Immediate Children", ""},
+ {3, "PARENT", 0, "Parent", ""},
+ {4, "SIBLINGS", 0, "Siblings", "Shared Parent"},
+ {5, "TYPE", 0, "Type", "Shared object type"},
+ {6, "LAYER", 0, "Layer", "Shared layers"},
+ {7, "GROUP", 0, "Group", "Shared group"},
+ {8, "HOOK", 0, "Hook", ""},
+ {9, "PASS", 0, "Pass", "Render pass Index"},
+ {10, "COLOR", 0, "Color", "Object Color"},
+ {11, "PROPERTIES", 0, "Properties", "Game Properties"},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static short select_grouped_children(bContext *C, Object *ob, int recursive)
+{
+ short changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if (ob == base->object->parent) {
+ if (!(base->flag & SELECT)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+
+ if (recursive)
+ changed |= select_grouped_children(C, base->object, 1);
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short select_grouped_parent(bContext *C) /* Makes parent active and de-selected OBACT */
+{
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
+
+ short changed = 0;
+ Base *baspar, *basact= CTX_data_active_base(C);
+
+ if (!basact || !(basact->object->parent)) return 0; /* we know OBACT is valid */
+
+ baspar= object_in_scene(basact->object->parent, scene);
+
+ /* can be NULL if parent in other scene */
+ if(baspar && BASE_SELECTABLE(v3d, baspar)) {
+ ED_base_object_select(basact, BA_DESELECT);
+ ED_base_object_select(baspar, BA_SELECT);
+ ED_base_object_activate(C, baspar);
+ changed = 1;
+ }
+ return changed;
+}
+
+
+#define GROUP_MENU_MAX 24
+static short select_grouped_group(bContext *C, Object *ob) /* Select objects in the same group as the active */
+{
+ short changed = 0;
+ Group *group, *ob_groups[GROUP_MENU_MAX];
+ //char str[10 + (24*GROUP_MENU_MAX)];
+ //char *p = str;
+ int group_count=0; //, menu, i;
+
+ for ( group=G.main->group.first;
+ group && group_count < GROUP_MENU_MAX;
+ group=group->id.next
+ ) {
+ if (object_in_group (ob, group)) {
+ ob_groups[group_count] = group;
+ group_count++;
+ }
+ }
+
+ if (!group_count)
+ return 0;
+
+ else if (group_count == 1) {
+ group = ob_groups[0];
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if (!(base->flag & SELECT) && object_in_group(base->object, group)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+ }
+#if 0 // XXX hows this work in 2.5?
+ /* build the menu. */
+ p += sprintf(str, "Groups%%t");
+ for (i=0; i<group_count; i++) {
+ group = ob_groups[i];
+ p += sprintf (p, "|%s%%x%i", group->id.name+2, i);
+ }
+
+ menu = pupmenu (str);
+ if (menu == -1)
+ return 0;
+
+ group = ob_groups[menu];
+ for (base= FIRSTBASE; base; base= base->next) {
+ if (!(base->flag & SELECT) && object_in_group(base->object, group)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+#endif
+ return changed;
+}
+
+static short select_grouped_object_hooks(bContext *C, Object *ob)
+{
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
+
+ short changed = 0;
+ Base *base;
+ ModifierData *md;
+ HookModifierData *hmd;
+
+ for (md = ob->modifiers.first; md; md=md->next) {
+ if (md->type==eModifierType_Hook) {
+ hmd= (HookModifierData*) md;
+ if (hmd->object && !(hmd->object->flag & SELECT)) {
+ base= object_in_scene(hmd->object, scene);
+ if (base && (BASE_SELECTABLE(v3d, base))) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ }
+ }
+ return changed;
+}
+
+/* Select objects woth the same parent as the active (siblings),
+ * parent can be NULL also */
+static short select_grouped_siblings(bContext *C, Object *ob)
+{
+ short changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if ((base->object->parent==ob->parent) && !(base->flag & SELECT)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short select_grouped_type(bContext *C, Object *ob)
+{
+ short changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if ((base->object->type == ob->type) && !(base->flag & SELECT)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short select_grouped_layer(bContext *C, Object *ob)
+{
+ char changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if ((base->lay & ob->lay) && !(base->flag & SELECT)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short select_grouped_index_object(bContext *C, Object *ob)
+{
+ char changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if ((base->object->index == ob->index) && !(base->flag & SELECT)) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short select_grouped_color(bContext *C, Object *ob)
+{
+ char changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if (!(base->flag & SELECT) && (FloatCompare(base->object->col, ob->col, 0.005f))) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static short objects_share_gameprop(Object *a, Object *b)
+{
+ bProperty *prop;
+ /*make a copy of all its properties*/
+
+ for( prop= a->prop.first; prop; prop = prop->next ) {
+ if ( get_ob_property(b, prop->name) )
+ return 1;
+ }
+ return 0;
+}
+
+static short select_grouped_gameprops(bContext *C, Object *ob)
+{
+ char changed = 0;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if (!(base->flag & SELECT) && (objects_share_gameprop(base->object, ob))) {
+ ED_base_object_select(base, BA_SELECT);
+ changed = 1;
+ }
+ }
+ CTX_DATA_END;
+ return changed;
+}
+
+static int object_select_grouped_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob;
+ int nr = RNA_enum_get(op->ptr, "type");
+ short changed = 0, extend;
+
+ extend= RNA_boolean_get(op->ptr, "extend");
+
+ if (extend == 0) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+
+ ob= OBACT;
+ if(ob==0){
+ BKE_report(op->reports, RPT_ERROR, "No Active Object");
+ return OPERATOR_CANCELLED;
+ }
+
+ if(nr==1) changed = select_grouped_children(C, ob, 1);
+ else if(nr==2) changed = select_grouped_children(C, ob, 0);
+ else if(nr==3) changed = select_grouped_parent(C);
+ else if(nr==4) changed = select_grouped_siblings(C, ob);
+ else if(nr==5) changed = select_grouped_type(C, ob);
+ else if(nr==6) changed = select_grouped_layer(C, ob);
+ else if(nr==7) changed = select_grouped_group(C, ob);
+ else if(nr==8) changed = select_grouped_object_hooks(C, ob);
+ else if(nr==9) changed = select_grouped_index_object(C, ob);
+ else if(nr==10) changed = select_grouped_color(C, ob);
+ else if(nr==11) changed = select_grouped_gameprops(C, ob);
+
+ if (changed) {
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_select_grouped(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Grouped";
+ ot->description = "Select all visible objects grouped by various properties.";
+ ot->idname= "OBJECT_OT_select_grouped";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_select_grouped_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
+}
+
+/************************* Select by Layer **********************/
+
+static int object_select_by_layer_exec(bContext *C, wmOperator *op)
+{
+ unsigned int layernum;
+ short extend;
+
+ extend= RNA_boolean_get(op->ptr, "extend");
+ layernum = RNA_int_get(op->ptr, "layer");
+
+ if (extend == 0) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if(base->lay == (1<< (layernum -1)))
+ ED_base_object_select(base, BA_SELECT);
+ }
+ CTX_DATA_END;
+
+ /* undo? */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_by_layer(wmOperatorType *ot)
+{
+ /* identifiers */
+ 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;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_int(ot->srna, "layer", 1, 1, 20, "Layer", "", 1, 20);
+}
+
+/************************** Select Inverse *************************/
+
+static int object_select_inverse_exec(bContext *C, wmOperator *op)
+{
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if (base->flag & SELECT)
+ ED_base_object_select(base, BA_DESELECT);
+ else
+ ED_base_object_select(base, BA_SELECT);
+ }
+ CTX_DATA_END;
+
+ /* undo? */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_inverse(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Select Inverse";
+ ot->description = "Invert selection of all visible objects.";
+ ot->idname= "OBJECT_OT_select_inverse";
+
+ /* api callbacks */
+ ot->exec= object_select_inverse_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+}
+
+/**************************** (De)select All ****************************/
+
+static int object_select_de_select_all_exec(bContext *C, wmOperator *op)
+{
+
+ int a=0, ok=0;
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if (base->flag & SELECT) {
+ ok= a= 1;
+ break;
+ }
+ else ok=1;
+ }
+ CTX_DATA_END;
+
+ if (!ok) return OPERATOR_PASS_THROUGH;
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if (a) ED_base_object_select(base, BA_DESELECT);
+ else ED_base_object_select(base, BA_SELECT);
+ }
+ CTX_DATA_END;
+
+ /* undo? */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_all_toggle(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "deselect all";
+ ot->description = "(de)select all visible objects in scene.";
+ ot->idname= "OBJECT_OT_select_all_toggle";
+
+ /* api callbacks */
+ ot->exec= object_select_de_select_all_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+}
+
+/**************************** Select Mirror ****************************/
+
+/* finds the best possible flipped name. For renaming; check for unique names afterwards */
+/* if strip_number: removes number extensions */
+void object_flip_name (char *name)
+{
+ int len;
+ char prefix[128]={""}; /* The part before the facing */
+ char suffix[128]={""}; /* The part after the facing */
+ char replace[128]={""}; /* The replacement string */
+ char number[128]={""}; /* The number extension string */
+ char *index=NULL;
+
+ len= strlen(name);
+ if(len<3) return; // we don't do names like .R or .L
+
+ /* We first check the case with a .### extension, let's find the last period */
+ if(isdigit(name[len-1])) {
+ index= strrchr(name, '.'); // last occurrance
+ if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
+ strcpy(number, index);
+ *index= 0;
+ len= strlen(name);
+ }
+ }
+
+ strcpy (prefix, name);
+
+#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
+
+ /* first case; separator . - _ with extensions r R l L */
+ if( IS_SEPARATOR(name[len-2]) ) {
+ switch(name[len-1]) {
+ case 'l':
+ prefix[len-1]= 0;
+ strcpy(replace, "r");
+ break;
+ case 'r':
+ prefix[len-1]= 0;
+ strcpy(replace, "l");
+ break;
+ case 'L':
+ prefix[len-1]= 0;
+ strcpy(replace, "R");
+ break;
+ case 'R':
+ prefix[len-1]= 0;
+ strcpy(replace, "L");
+ break;
+ }
+ }
+ /* case; beginning with r R l L , with separator after it */
+ else if( IS_SEPARATOR(name[1]) ) {
+ switch(name[0]) {
+ case 'l':
+ strcpy(replace, "r");
+ strcpy(suffix, name+1);
+ prefix[0]= 0;
+ break;
+ case 'r':
+ strcpy(replace, "l");
+ strcpy(suffix, name+1);
+ prefix[0]= 0;
+ break;
+ case 'L':
+ strcpy(replace, "R");
+ strcpy(suffix, name+1);
+ prefix[0]= 0;
+ break;
+ case 'R':
+ strcpy(replace, "L");
+ strcpy(suffix, name+1);
+ prefix[0]= 0;
+ break;
+ }
+ }
+ else if(len > 5) {
+ /* hrms, why test for a separator? lets do the rule 'ultimate left or right' */
+ index = BLI_strcasestr(prefix, "right");
+ if (index==prefix || index==prefix+len-5) {
+ if(index[0]=='r')
+ strcpy (replace, "left");
+ else {
+ if(index[1]=='I')
+ strcpy (replace, "LEFT");
+ else
+ strcpy (replace, "Left");
+ }
+ *index= 0;
+ strcpy (suffix, index+5);
+ }
+ else {
+ index = BLI_strcasestr(prefix, "left");
+ if (index==prefix || index==prefix+len-4) {
+ if(index[0]=='l')
+ strcpy (replace, "right");
+ else {
+ if(index[1]=='E')
+ strcpy (replace, "RIGHT");
+ else
+ strcpy (replace, "Right");
+ }
+ *index= 0;
+ strcpy (suffix, index+4);
+ }
+ }
+ }
+
+#undef IS_SEPARATOR
+
+ sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
+}
+
+static int object_select_mirror_exec(bContext *C, wmOperator *op)
+{
+ char tmpname[32];
+ short extend;
+
+ extend= RNA_boolean_get(op->ptr, "extend");
+
+ CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
+
+ strcpy(tmpname, primbase->object->id.name+2);
+ object_flip_name(tmpname);
+
+ CTX_DATA_BEGIN(C, Base*, secbase, visible_bases) {
+ if(!strcmp(secbase->object->id.name+2, tmpname)) {
+ ED_base_object_select(secbase, BA_SELECT);
+ }
+ }
+ CTX_DATA_END;
+
+ if (extend == 0) ED_base_object_select(primbase, BA_DESELECT);
+
+ }
+ CTX_DATA_END;
+
+ /* undo? */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_mirror(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Select Mirror";
+ ot->description = "Select the Mirror objects of the selected object eg. L.sword -> R.sword";
+ ot->idname= "OBJECT_OT_select_mirror";
+
+ /* api callbacks */
+ ot->exec= object_select_mirror_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
+}
+
+
+static int object_select_name_exec(bContext *C, wmOperator *op)
+{
+ char *name= RNA_string_get_alloc(op->ptr, "name", NULL, 0);
+ short extend= RNA_boolean_get(op->ptr, "extend");
+ short changed = 0;
+
+ if(!extend) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if(strcmp(name, base->object->id.name+2)==0) {
+ ED_base_object_select(base, BA_SELECT);
+ changed= 1;
+ }
+ }
+ CTX_DATA_END;
+
+ MEM_freeN(name);
+
+ /* undo? */
+ if(changed) {
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+void OBJECT_OT_select_name(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Select Name";
+ ot->description = "Select an object with this name";
+ ot->idname= "OBJECT_OT_select_name";
+
+ /* api callbacks */
+ ot->exec= object_select_name_exec;
+ ot->poll= ED_operator_scene_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_string(ot->srna, "name", "", 0, "Name", "Object name to select.");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
+}
+
+/**************************** Select Random ****************************/
+
+static int object_select_random_exec(bContext *C, wmOperator *op)
+{
+ float percent;
+ short extend;
+
+ extend= RNA_boolean_get(op->ptr, "extend");
+
+ if (extend == 0) {
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ ED_base_object_select(base, BA_DESELECT);
+ }
+ CTX_DATA_END;
+ }
+ percent = RNA_float_get(op->ptr, "percent");
+
+ CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
+ if (BLI_frand() < percent) {
+ ED_base_object_select(base, BA_SELECT);
+ }
+ }
+ CTX_DATA_END;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_select_random(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Random select";
+ ot->description = "Set select on random visible objects.";
+ ot->idname= "OBJECT_OT_select_random";
+
+ /* 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;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "extend", FALSE, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "percentage of objects to randomly select", 0.0001f, 1.0f);
+}
+
+
diff --git a/source/blender/editors/object/editkey.c b/source/blender/editors/object/object_shapekey.c
index 913046c5ab8..2ec3edd846a 100644
--- a/source/blender/editors/object/editkey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -55,6 +55,7 @@
#include "BKE_action.h"
#include "BKE_anim.h"
+#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -70,12 +71,12 @@
#include "ED_object.h"
-#include "object_intern.h"
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
-/* XXX */
-static void BIF_undo_push() {}
-static void error() {}
-/* XXX */
+#include "object_intern.h"
#if 0 // XXX old animation system
static void default_key_ipo(Scene *scene, Key *key)
@@ -112,7 +113,7 @@ static void default_key_ipo(Scene *scene, Key *key)
#endif // XXX old animation system
-/* **************************************** */
+/************************* Mesh ************************/
void mesh_to_key(Mesh *me, KeyBlock *kb)
{
@@ -163,14 +164,20 @@ static KeyBlock *add_keyblock(Scene *scene, Key *key)
kb= MEM_callocN(sizeof(KeyBlock), "Keyblock");
BLI_addtail(&key->block, kb);
kb->type= KEY_CARDINAL;
+
tot= BLI_countlist(&key->block);
if(tot==1) strcpy(kb->name, "Basis");
else sprintf(kb->name, "Key %d", tot-1);
+
+ // XXX this is old anim system stuff? (i.e. the 'index' of the shapekey)
kb->adrcode= tot-1;
key->totkey++;
if(key->totkey==1) key->refkey= kb;
+ kb->slidermin= 0.0f;
+ kb->slidermax= 1.0f;
+
// XXX kb->pos is the confusing old horizontal-line RVK crap in old IPO Editor...
if(key->type == KEY_RELATIVE)
kb->pos= curpos+0.1;
@@ -208,7 +215,7 @@ void insert_meshkey(Scene *scene, Mesh *me, short rel)
mesh_to_key(me, kb);
}
-/* ******************** */
+/************************* Lattice ************************/
void latt_to_key(Lattice *lt, KeyBlock *kb)
{
@@ -266,7 +273,7 @@ void insert_lattkey(Scene *scene, Lattice *lt, short rel)
latt_to_key(lt, kb);
}
-/* ******************************** */
+/************************* Curve ************************/
void curve_to_key(Curve *cu, KeyBlock *kb, ListBase *nurb)
{
@@ -378,7 +385,7 @@ void insert_curvekey(Scene *scene, Curve *cu, short rel)
if(cu->key==NULL) {
cu->key= add_key( (ID *)cu);
- if (rel)
+ if(rel)
cu->key->type = KEY_RELATIVE;
// else
// default_key_ipo(scene, cu->key); // XXX old animation system
@@ -391,36 +398,34 @@ void insert_curvekey(Scene *scene, Curve *cu, short rel)
else curve_to_key(cu, kb, &cu->nurb);
}
+/*********************** add shape key ***********************/
-/* ******************** */
-
-void insert_shapekey(Scene *scene, Object *ob)
+void ED_object_shape_key_add(bContext *C, Scene *scene, Object *ob)
{
- if(get_mesh(ob) && get_mesh(ob)->mr) {
- error("Cannot create shape keys on a multires mesh.");
- }
- else {
- Key *key;
-
- if(ob->type==OB_MESH) insert_meshkey(scene, ob->data, 1);
- else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(scene, ob->data, 1);
- else if(ob->type==OB_LATTICE) insert_lattkey(scene, ob->data, 1);
-
- key= ob_get_key(ob);
- ob->shapenr= BLI_countlist(&key->block);
-
- BIF_undo_push("Add Shapekey");
- }
+ Key *key;
+
+ if(ob->type==OB_MESH) insert_meshkey(scene, ob->data, 1);
+ else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(scene, ob->data, 1);
+ else if(ob->type==OB_LATTICE) insert_lattkey(scene, ob->data, 1);
+
+ key= ob_get_key(ob);
+ ob->shapenr= BLI_countlist(&key->block);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
-void delete_key(Scene *scene, Object *ob)
+/*********************** remove shape key ***********************/
+
+int ED_object_shape_key_remove(bContext *C, Scene *scene, Object *ob)
{
+ Main *bmain= CTX_data_main(C);
KeyBlock *kb, *rkb;
Key *key;
//IpoCurve *icu;
-
+
key= ob_get_key(ob);
- if(key==NULL) return;
+ if(key==NULL)
+ return 0;
kb= BLI_findlink(&key->block, ob->shapenr-1);
@@ -431,15 +436,15 @@ void delete_key(Scene *scene, Object *ob)
BLI_remlink(&key->block, kb);
key->totkey--;
- if(key->refkey== kb) key->refkey= key->block.first;
+ if(key->refkey== kb)
+ key->refkey= key->block.first;
if(kb->data) MEM_freeN(kb->data);
MEM_freeN(kb);
- for(kb= key->block.first; kb; kb= kb->next) {
+ for(kb= key->block.first; kb; kb= kb->next)
if(kb->adrcode>=ob->shapenr)
kb->adrcode--;
- }
#if 0 // XXX old animation system
if(key->ipo) {
@@ -465,98 +470,70 @@ void delete_key(Scene *scene, Object *ob)
else if(GS(key->from->name)==ID_CU) ((Curve *)key->from)->key= NULL;
else if(GS(key->from->name)==ID_LT) ((Lattice *)key->from)->key= NULL;
- free_libblock_us(&(G.main->key), key);
+ free_libblock_us(&(bmain->key), key);
}
- DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
-
- BIF_undo_push("Delete Shapekey");
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return 1;
}
-void move_keys(Object *ob)
+/********************** shape key operators *********************/
+
+static int shape_key_poll(bContext *C)
{
-#if 0
- /* XXX probably goes away entirely */
- Key *key;
- KeyBlock *kb;
- float div, dy, oldpos, vec[3], dvec[3];
- int afbreek=0, firsttime= 1;
- unsigned short event = 0;
- short mval[2], val, xo, yo;
- char str[32];
-
- if(G.sipo->blocktype!=ID_KE) return;
-
- if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
- if(G.sipo->editipo==NULL) return;
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ID *data= (ob)? ob->data: NULL;
+ return (ob && !ob->id.lib && data && !data->lib);
+}
- key= ob_get_key(ob);
- if(key==NULL) return;
-
- /* which kb is involved */
- kb= BLI_findlink(&key->block, ob->shapenr-1);
- if(kb==NULL) return;
-
- oldpos= kb->pos;
+static int shape_key_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+
+ ED_object_shape_key_add(C, scene, ob);
- getmouseco_areawin(mval);
- xo= mval[0];
- yo= mval[1];
- dvec[0]=dvec[1]=dvec[2]= 0.0;
+ return OPERATOR_FINISHED;
+}
- while(afbreek==0) {
- getmouseco_areawin(mval);
- if(mval[0]!=xo || mval[1]!=yo || firsttime) {
- firsttime= 0;
-
- dy= (float)(mval[1]- yo);
+void OBJECT_OT_shape_key_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Shape Key";
+ ot->idname= "OBJECT_OT_shape_key_add";
+
+ /* api callbacks */
+ ot->poll= shape_key_poll;
+ ot->exec= shape_key_add_exec;
- div= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
- dvec[1]+= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/div;
-
- VECCOPY(vec, dvec);
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
- apply_keyb_grid(vec, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
- apply_keyb_grid(vec+1, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
+static int shape_key_remove_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
- kb->pos= oldpos+vec[1];
-
- sprintf(str, "Y: %.3f ", vec[1]);
- headerprint(str);
-
- xo= mval[0];
- yo= mval[1];
-
- force_draw(0);
- }
- else BIF_wait_for_statechange();
-
- while(qtest()) {
- event= extern_qread(&val);
- if(val) {
- switch(event) {
- case ESCKEY:
- case LEFTMOUSE:
- case SPACEKEY:
- afbreek= 1;
- break;
- default:
- arrows_move_cursor(event);
- }
- }
- }
- }
-
- if(event==ESCKEY) {
- kb->pos= oldpos;
- }
+ if(!ED_object_shape_key_remove(C, scene, ob))
+ return OPERATOR_CANCELLED;
- sort_keys(key);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Shape Key";
+ ot->idname= "OBJECT_OT_shape_key_remove";
- /* for boundbox */
- editipo_changed(G.sipo, 0);
+ /* api callbacks */
+ ot->poll= shape_key_poll;
+ ot->exec= shape_key_remove_exec;
- BIF_undo_push("Move Shapekey(s)");
-#endif
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
new file mode 100644
index 00000000000..2b207f2f27c
--- /dev/null
+++ b/source/blender/editors/object/object_transform.c
@@ -0,0 +1,926 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, 2002-2008 full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_key_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_define.h"
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_anim_api.h"
+#include "ED_armature.h"
+#include "ED_curve.h"
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "object_intern.h"
+
+/*************************** Clear Transformation ****************************/
+
+static int object_location_clear_exec(bContext *C, wmOperator *op)
+{
+ int armature_clear= 0;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
+ 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;
+ }
+ ob->recalc |= OB_RECALC_OB;
+ }
+ CTX_DATA_END;
+
+ if(armature_clear==0) /* in this case flush was done */
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_location_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Location";
+ ot->description = "Clear the object's location.";
+ ot->idname= "OBJECT_OT_location_clear";
+
+ /* api callbacks */
+ ot->exec= object_location_clear_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int object_rotation_clear_exec(bContext *C, wmOperator *op)
+{
+ int armature_clear= 0;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
+ /* eulers can only get cleared if they are not protected */
+ 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;
+ }
+ ob->recalc |= OB_RECALC_OB;
+ }
+ CTX_DATA_END;
+
+ if(armature_clear==0) /* in this case flush was done */
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_rotation_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Rotation";
+ ot->description = "Clear the object's rotation.";
+ ot->idname= "OBJECT_OT_rotation_clear";
+
+ /* api callbacks */
+ ot->exec= object_rotation_clear_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int object_scale_clear_exec(bContext *C, wmOperator *op)
+{
+ int armature_clear= 0;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
+ 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;
+ }
+ }
+ ob->recalc |= OB_RECALC_OB;
+ }
+ CTX_DATA_END;
+
+ if(armature_clear==0) /* in this case flush was done */
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_scale_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Scale";
+ ot->description = "Clear the object's scale.";
+ ot->idname= "OBJECT_OT_scale_clear";
+
+ /* api callbacks */
+ ot->exec= object_scale_clear_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int object_origin_clear_exec(bContext *C, wmOperator *op)
+{
+ float *v1, *v3, mat[3][3];
+ int armature_clear= 0;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->parent) {
+ v1= ob->loc;
+ v3= ob->parentinv[3];
+
+ Mat3CpyMat4(mat, ob->parentinv);
+ VECCOPY(v3, v1);
+ v3[0]= -v3[0];
+ v3[1]= -v3[1];
+ v3[2]= -v3[2];
+ Mat3MulVecfl(mat, v3);
+ }
+ ob->recalc |= OB_RECALC_OB;
+ }
+ CTX_DATA_END;
+
+ if(armature_clear==0) /* in this case flush was done */
+ ED_anim_dag_flush_update(C);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_origin_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Origin";
+ ot->description = "Clear the object's origin.";
+ ot->idname= "OBJECT_OT_origin_clear";
+
+ /* api callbacks */
+ ot->exec= object_origin_clear_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/*************************** Apply Transformation ****************************/
+
+/* use this when the loc/size/rot of the parent has changed but the children
+ * should stay in the same place, e.g. for apply-size-rot or object center */
+static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob )
+{
+ Object workob;
+ Object *ob_child;
+
+ /* 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) {
+ ED_object_apply_obmat(ob_child);
+ what_does_parent(scene, ob_child, &workob);
+ Mat4Invert(ob_child->parentinv, workob.obmat);
+ }
+ }
+}
+
+static int apply_objects_internal(bContext *C, ReportList *reports, int apply_loc, int apply_scale, int apply_rot)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob;
+ bArmature *arm;
+ Mesh *me;
+ Curve *cu;
+ Nurb *nu;
+ BPoint *bp;
+ BezTriple *bezt;
+ MVert *mvert;
+ float rsmat[3][3], tmat[3][3], obmat[3][3], iobmat[3][3], mat[4][4], scale;
+ int a, change = 0;
+
+ /* first check if we can execute */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob= base->object;
+
+ if(ob->type==OB_MESH) {
+ me= ob->data;
+
+ if(me->id.us>1) {
+ BKE_report(reports, RPT_ERROR, "Can't apply to a multi user mesh, doing nothing.");
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else if(ob->type==OB_ARMATURE) {
+ arm= ob->data;
+
+ if(arm->id.us>1) {
+ BKE_report(reports, RPT_ERROR, "Can't apply to a multi user armature, doing nothing.");
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
+ cu= ob->data;
+
+ if(cu->id.us>1) {
+ BKE_report(reports, RPT_ERROR, "Can't apply to a multi user curve, doing nothing.");
+ return OPERATOR_CANCELLED;
+ }
+ if(cu->key) {
+ BKE_report(reports, RPT_ERROR, "Can't apply to a curve with vertex keys, doing nothing.");
+ return OPERATOR_CANCELLED;
+ }
+ }
+ }
+ CTX_DATA_END;
+
+ /* now execute */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob= base->object;
+
+ /* calculate rotation/scale matrix */
+ if(apply_scale && apply_rot)
+ object_to_mat3(ob, rsmat);
+ else if(apply_scale)
+ object_scale_to_mat3(ob, rsmat);
+ else if(apply_rot)
+ object_rot_to_mat3(ob, rsmat);
+ else
+ Mat3One(rsmat);
+
+ Mat4CpyMat3(mat, rsmat);
+
+ /* calculate translation */
+ if(apply_loc) {
+ VecCopyf(mat[3], ob->loc);
+
+ if(!(apply_scale && apply_rot)) {
+ /* correct for scale and rotation that is still applied */
+ object_to_mat3(ob, obmat);
+ Mat3Inv(iobmat, obmat);
+ Mat3MulMat3(tmat, rsmat, iobmat);
+ Mat3MulVecfl(tmat, mat[3]);
+ }
+ }
+
+ /* apply to object data */
+ if(ob->type==OB_MESH) {
+ me= ob->data;
+
+ /* adjust data */
+ mvert= me->mvert;
+ for(a=0; a<me->totvert; a++, mvert++)
+ Mat4MulVecfl(mat, mvert->co);
+
+ if(me->key) {
+ KeyBlock *kb;
+
+ for(kb=me->key->block.first; kb; kb=kb->next) {
+ float *fp= kb->data;
+
+ for(a=0; a<kb->totelem; a++, fp+=3)
+ Mat4MulVecfl(mat, fp);
+ }
+ }
+
+ /* update normals */
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ }
+ else if (ob->type==OB_ARMATURE) {
+ ED_armature_apply_transform(ob, mat);
+ }
+ else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
+ cu= ob->data;
+
+ scale = Mat3ToScalef(rsmat);
+
+ for(nu=cu->nurb.first; nu; nu=nu->next) {
+ if(nu->type == CU_BEZIER) {
+ a= nu->pntsu;
+ for(bezt= nu->bezt; a--; bezt++) {
+ Mat4MulVecfl(mat, bezt->vec[0]);
+ Mat4MulVecfl(mat, bezt->vec[1]);
+ Mat4MulVecfl(mat, bezt->vec[2]);
+ bezt->radius *= scale;
+ bezt++;
+ }
+ }
+ else {
+ a= nu->pntsu*nu->pntsv;
+ for(bp= nu->bp; a--; bp++)
+ Mat4MulVecfl(mat, bp->vec);
+ }
+ }
+ }
+ else
+ continue;
+
+ if(apply_loc)
+ ob->loc[0]= ob->loc[1]= ob->loc[2]= 0.0f;
+ 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;
+
+ where_is_object(scene, ob);
+ ignore_parent_tx(bmain, scene, ob);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
+
+ change = 1;
+ }
+ CTX_DATA_END;
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ return OPERATOR_FINISHED;
+}
+
+static int visual_transform_apply_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ int change = 0;
+
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ where_is_object(scene, ob);
+
+ VECCOPY(ob->loc, ob->obmat[3]);
+ Mat4ToSize(ob->obmat, ob->size);
+ Mat4ToEul(ob->obmat, ob->rot);
+
+ where_is_object(scene, ob);
+
+ change = 1;
+ }
+ CTX_DATA_END;
+
+ if(!change)
+ return OPERATOR_CANCELLED;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_visual_transform_apply(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Visual Transform";
+ ot->description = "Apply the object's visual transformation to its data.";
+ ot->idname= "OBJECT_OT_visual_transform_apply";
+
+ /* api callbacks */
+ ot->exec= visual_transform_apply_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int location_apply_exec(bContext *C, wmOperator *op)
+{
+ return apply_objects_internal(C, op->reports, 1, 0, 0);
+}
+
+void OBJECT_OT_location_apply(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Location";
+ ot->description = "Apply the object's location to its data.";
+ ot->idname= "OBJECT_OT_location_apply";
+
+ /* api callbacks */
+ ot->exec= location_apply_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int scale_apply_exec(bContext *C, wmOperator *op)
+{
+ return apply_objects_internal(C, op->reports, 0, 1, 0);
+}
+
+void OBJECT_OT_scale_apply(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Scale";
+ ot->description = "Apply the object's scale to its data.";
+ ot->idname= "OBJECT_OT_scale_apply";
+
+ /* api callbacks */
+ ot->exec= scale_apply_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int rotation_apply_exec(bContext *C, wmOperator *op)
+{
+ return apply_objects_internal(C, op->reports, 0, 0, 1);
+}
+
+void OBJECT_OT_rotation_apply(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Rotation";
+ ot->description = "Apply the object's rotation to its data.";
+ ot->idname= "OBJECT_OT_rotation_apply";
+
+ /* api callbacks */
+ ot->exec= rotation_apply_exec;
+ ot->poll= ED_operator_object_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ Texture Space Transform ****************************/
+
+void texspace_edit(Scene *scene, View3D *v3d)
+{
+ Base *base;
+ int nr=0;
+
+ /* first test if from visible and selected objects
+ * texspacedraw is set:
+ */
+
+ if(scene->obedit) return; // XXX get from context
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(TESTBASELIB(v3d, base)) {
+ break;
+ }
+ }
+
+ if(base==0) {
+ return;
+ }
+
+ nr= 0; // XXX pupmenu("Texture Space %t|Grab/Move%x1|Size%x2");
+ if(nr<1) return;
+
+ for(base= FIRSTBASE; base; base= base->next) {
+ if(TESTBASELIB(v3d, base)) {
+ base->object->dtx |= OB_TEXSPACE;
+ }
+ }
+
+
+ if(nr==1) {
+// XXX initTransform(TFM_TRANSLATION, CTX_TEXTURE);
+// XXX Transform();
+ }
+ else if(nr==2) {
+// XXX initTransform(TFM_RESIZE, CTX_TEXTURE);
+// XXX Transform();
+ }
+ else if(nr==3) {
+// XXX initTransform(TFM_ROTATION, CTX_TEXTURE);
+// XXX Transform();
+ }
+}
+
+/************************ Mirror Menu ****************************/
+
+void mirrormenu(void)
+{
+// XXX initTransform(TFM_MIRROR, CTX_NO_PET);
+// XXX Transform();
+}
+
+/********************* Set Object Center ************************/
+
+static EnumPropertyItem prop_set_center_types[] = {
+ {0, "CENTER", 0, "ObData to Center", "Move object data around Object center"},
+ {1, "CENTERNEW", 0, "Center New", "Move Object center to center of object data"},
+ {2, "CENTERCURSOR", 0, "Center Cursor", "Move Object Center to position of the 3d cursor"},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* 0 == do center, 1 == center new, 2 == center cursor */
+static int object_center_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ 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 *ob;
+ Mesh *me, *tme;
+ Curve *cu;
+/* BezTriple *bezt;
+ BPoint *bp; */
+ Nurb *nu, *nu1;
+ EditVert *eve;
+ float cent[3], centn[3], min[3], max[3], omat[3][3];
+ int a, total= 0;
+ int centermode = RNA_enum_get(op->ptr, "type");
+
+ /* keep track of what is changed */
+ int tot_change=0, tot_lib_error=0, tot_multiuser_arm_error=0;
+ MVert *mvert;
+
+ if(scene->id.lib || v3d==NULL){
+ BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed on Lib data");
+ return OPERATOR_CANCELLED;
+ }
+ if (obedit && centermode > 0) {
+ BKE_report(op->reports, RPT_ERROR, "Operation cannot be performed in EditMode");
+ return OPERATOR_CANCELLED;
+ }
+ cent[0]= cent[1]= cent[2]= 0.0;
+
+ if(obedit) {
+
+ INIT_MINMAX(min, max);
+
+ if(obedit->type==OB_MESH) {
+ Mesh *me= obedit->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ if(v3d->around==V3D_CENTROID) {
+ total++;
+ VECADD(cent, cent, eve->co);
+ }
+ else {
+ DO_MINMAX(eve->co, min, max);
+ }
+ }
+
+ if(v3d->around==V3D_CENTROID) {
+ VecMulf(cent, 1.0f/(float)total);
+ }
+ else {
+ cent[0]= (min[0]+max[0])/2.0f;
+ cent[1]= (min[1]+max[1])/2.0f;
+ cent[2]= (min[2]+max[2])/2.0f;
+ }
+
+ for(eve= em->verts.first; eve; eve= eve->next) {
+ VecSubf(eve->co, eve->co, cent);
+ }
+
+ recalc_editnormals(em);
+ tot_change++;
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ BKE_mesh_end_editmesh(me, em);
+ }
+ }
+
+ /* reset flags */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ base->object->flag &= ~OB_DONE;
+ }
+ CTX_DATA_END;
+
+ for (me= G.main->mesh.first; me; me= me->id.next) {
+ me->flag &= ~ME_ISDONE;
+ }
+
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ if((base->object->flag & OB_DONE)==0) {
+ base->object->flag |= OB_DONE;
+
+ if(obedit==NULL && (me=get_mesh(base->object)) ) {
+ if (me->id.lib) {
+ tot_lib_error++;
+ } else {
+ if(centermode==2) {
+ VECCOPY(cent, give_cursor(scene, v3d));
+ Mat4Invert(base->object->imat, base->object->obmat);
+ Mat4MulVecfl(base->object->imat, cent);
+ } else {
+ INIT_MINMAX(min, max);
+ mvert= me->mvert;
+ for(a=0; a<me->totvert; a++, mvert++) {
+ DO_MINMAX(mvert->co, min, max);
+ }
+
+ cent[0]= (min[0]+max[0])/2.0f;
+ cent[1]= (min[1]+max[1])/2.0f;
+ cent[2]= (min[2]+max[2])/2.0f;
+ }
+
+ mvert= me->mvert;
+ for(a=0; a<me->totvert; a++, mvert++) {
+ VecSubf(mvert->co, mvert->co, cent);
+ }
+
+ if (me->key) {
+ KeyBlock *kb;
+ for (kb=me->key->block.first; kb; kb=kb->next) {
+ float *fp= kb->data;
+
+ for (a=0; a<kb->totelem; a++, fp+=3) {
+ VecSubf(fp, fp, cent);
+ }
+ }
+ }
+
+ me->flag |= ME_ISDONE;
+
+ if(centermode) {
+ Mat3CpyMat4(omat, base->object->obmat);
+
+ VECCOPY(centn, cent);
+ Mat3MulVecfl(omat, centn);
+ base->object->loc[0]+= centn[0];
+ base->object->loc[1]+= centn[1];
+ base->object->loc[2]+= centn[2];
+
+ where_is_object(scene, base->object);
+ ignore_parent_tx(bmain, scene, base->object);
+
+ /* other users? */
+ CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ ob = base->object;
+ if((ob->flag & OB_DONE)==0) {
+ tme= get_mesh(ob);
+
+ if(tme==me) {
+
+ ob->flag |= OB_DONE;
+ ob->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+
+ Mat3CpyMat4(omat, ob->obmat);
+ VECCOPY(centn, cent);
+ Mat3MulVecfl(omat, centn);
+ ob->loc[0]+= centn[0];
+ ob->loc[1]+= centn[1];
+ ob->loc[2]+= centn[2];
+
+ where_is_object(scene, ob);
+ ignore_parent_tx(bmain, scene, ob);
+
+ if(tme && (tme->flag & ME_ISDONE)==0) {
+ mvert= tme->mvert;
+ for(a=0; a<tme->totvert; a++, mvert++) {
+ VecSubf(mvert->co, mvert->co, cent);
+ }
+
+ if (tme->key) {
+ KeyBlock *kb;
+ for (kb=tme->key->block.first; kb; kb=kb->next) {
+ float *fp= kb->data;
+
+ for (a=0; a<kb->totelem; a++, fp+=3) {
+ VecSubf(fp, fp, cent);
+ }
+ }
+ }
+
+ tme->flag |= ME_ISDONE;
+ }
+ }
+ }
+
+ ob= ob->id.next;
+ }
+ CTX_DATA_END;
+ }
+ tot_change++;
+ }
+ }
+ else if (ELEM(base->object->type, OB_CURVE, OB_SURF)) {
+
+ /* weak code here... (ton) */
+ if(obedit==base->object) {
+ ListBase *editnurb= curve_get_editcurve(obedit);
+
+ nu1= editnurb->first;
+ cu= obedit->data;
+ }
+ else {
+ cu= base->object->data;
+ nu1= cu->nurb.first;
+ }
+
+ if (cu->id.lib) {
+ tot_lib_error++;
+ } else {
+ if(centermode==2) {
+ VECCOPY(cent, give_cursor(scene, v3d));
+ Mat4Invert(base->object->imat, base->object->obmat);
+ Mat4MulVecfl(base->object->imat, cent);
+
+ /* don't allow Z change if curve is 2D */
+ if( !( cu->flag & CU_3D ) )
+ cent[2] = 0.0;
+ }
+ else {
+ INIT_MINMAX(min, max);
+
+ nu= nu1;
+ while(nu) {
+ minmaxNurb(nu, min, max);
+ nu= nu->next;
+ }
+
+ cent[0]= (min[0]+max[0])/2.0f;
+ cent[1]= (min[1]+max[1])/2.0f;
+ cent[2]= (min[2]+max[2])/2.0f;
+ }
+
+ nu= nu1;
+ while(nu) {
+ if(nu->type == CU_BEZIER) {
+ a= nu->pntsu;
+ while (a--) {
+ VecSubf(nu->bezt[a].vec[0], nu->bezt[a].vec[0], cent);
+ VecSubf(nu->bezt[a].vec[1], nu->bezt[a].vec[1], cent);
+ VecSubf(nu->bezt[a].vec[2], nu->bezt[a].vec[2], cent);
+ }
+ }
+ else {
+ a= nu->pntsu*nu->pntsv;
+ while (a--)
+ VecSubf(nu->bp[a].vec, nu->bp[a].vec, cent);
+ }
+ nu= nu->next;
+ }
+
+ if(centermode && obedit==0) {
+ Mat3CpyMat4(omat, base->object->obmat);
+
+ Mat3MulVecfl(omat, cent);
+ base->object->loc[0]+= cent[0];
+ base->object->loc[1]+= cent[1];
+ base->object->loc[2]+= cent[2];
+
+ where_is_object(scene, base->object);
+ ignore_parent_tx(bmain, scene, base->object);
+ }
+
+ tot_change++;
+ if(obedit) {
+ if (centermode==0) {
+ DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ }
+ break;
+ }
+ }
+ }
+ else if(base->object->type==OB_FONT) {
+ /* get from bb */
+
+ cu= base->object->data;
+
+ if(cu->bb==0) {
+ /* do nothing*/
+ } else if (cu->id.lib) {
+ tot_lib_error++;
+ } else {
+ cu->xof= -0.5f*( cu->bb->vec[4][0] - cu->bb->vec[0][0]);
+ cu->yof= -0.5f -0.5f*( cu->bb->vec[0][1] - cu->bb->vec[2][1]); /* extra 0.5 is the height o above line */
+
+ /* not really ok, do this better once! */
+ cu->xof /= cu->fsize;
+ cu->yof /= cu->fsize;
+
+ tot_change++;
+ }
+ }
+ else if(base->object->type==OB_ARMATURE) {
+ bArmature *arm = base->object->data;
+
+ if (arm->id.lib) {
+ tot_lib_error++;
+ } else if(arm->id.us>1) {
+ /*BKE_report(op->reports, RPT_ERROR, "Can't apply to a multi user armature");
+ return;*/
+ tot_multiuser_arm_error++;
+ } else {
+ /* Function to recenter armatures in editarmature.c
+ * Bone + object locations are handled there.
+ */
+ docenter_armature(scene, v3d, base->object, centermode);
+ tot_change++;
+
+ where_is_object(scene, base->object);
+ ignore_parent_tx(bmain, scene, base->object);
+
+ if(obedit)
+ break;
+ }
+ }
+ base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+ }
+ }
+ CTX_DATA_END;
+
+ if (tot_change) {
+ ED_anim_dag_flush_update(C);
+ }
+
+ /* Warn if any errors occured */
+ if (tot_lib_error+tot_multiuser_arm_error) {
+ BKE_reportf(op->reports, RPT_WARNING, "%i Object(s) Not Centered, %i Changed:",tot_lib_error+tot_multiuser_arm_error, tot_change);
+ if (tot_lib_error)
+ BKE_reportf(op->reports, RPT_WARNING, "|%i linked library objects",tot_lib_error);
+ if (tot_multiuser_arm_error)
+ BKE_reportf(op->reports, RPT_WARNING, "|%i multiuser armature object(s)",tot_multiuser_arm_error);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_center_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Center";
+ ot->description = "Set the object's center, by either moving the data, or set to center of data, or use 3d cursor";
+ ot->idname= "OBJECT_OT_center_set";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= object_center_set_exec;
+
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", prop_set_center_types, 0, "Type", "");
+}
+
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
new file mode 100644
index 00000000000..2b17a6cbe54
--- /dev/null
+++ b/source/blender/editors/object/object_vgroup.c
@@ -0,0 +1,1321 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "MEM_guardedalloc.h"
+
+#include "DNA_cloth_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_deform.h"
+#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_lattice.h"
+#include "BKE_mesh.h"
+#include "BKE_paint.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_mesh.h"
+#include "ED_view3d.h"
+
+#include "UI_interface.h"
+
+#include "object_intern.h"
+
+/************************ Exported Functions **********************/
+
+static Lattice *vgroup_edit_lattice(Object *ob)
+{
+ if(ob->type==OB_LATTICE) {
+ Lattice *lt= ob->data;
+ return (lt->editlatt)? lt->editlatt: lt;
+ }
+
+ return NULL;
+}
+
+/* check if deform vertex has defgroup index */
+MDeformWeight *ED_vgroup_weight_get(MDeformVert *dv, int defgroup)
+{
+ int i;
+
+ if(!dv || defgroup<0)
+ return NULL;
+
+ for(i=0; i<dv->totweight; i++)
+ if(dv->dw[i].def_nr == defgroup)
+ return dv->dw+i;
+
+ return NULL;
+}
+
+/* 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 *ED_vgroup_weight_verify(MDeformVert *dv, int defgroup)
+{
+ MDeformWeight *newdw;
+
+ /* do this check always, this function is used to check for it */
+ if(!dv || defgroup<0)
+ return NULL;
+
+ newdw = ED_vgroup_weight_get(dv, defgroup);
+ if(newdw)
+ return newdw;
+
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "deformWeight");
+ if(dv->dw) {
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+ MEM_freeN(dv->dw);
+ }
+ dv->dw=newdw;
+
+ dv->dw[dv->totweight].weight=0.0f;
+ dv->dw[dv->totweight].def_nr=defgroup;
+ /* Group index */
+
+ dv->totweight++;
+
+ return dv->dw+(dv->totweight-1);
+}
+
+bDeformGroup *ED_vgroup_add_name(Object *ob, char *name)
+{
+ bDeformGroup *defgroup;
+
+ if(!ob)
+ return NULL;
+
+ defgroup = MEM_callocN(sizeof(bDeformGroup), "add deformGroup");
+
+ BLI_strncpy(defgroup->name, name, 32);
+
+ BLI_addtail(&ob->defbase, defgroup);
+ unique_vertexgroup_name(defgroup, ob);
+
+ ob->actdef = BLI_countlist(&ob->defbase);
+
+ return defgroup;
+}
+
+bDeformGroup *ED_vgroup_add(Object *ob)
+{
+ return ED_vgroup_add_name(ob, "Group");
+}
+
+void ED_vgroup_data_create(ID *id)
+{
+ /* create deform verts */
+
+ if(GS(id->name)==ID_ME) {
+ Mesh *me= (Mesh *)id;
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, CD_CALLOC, NULL, me->totvert);
+ }
+ else if(GS(id->name)==ID_LT) {
+ Lattice *lt= (Lattice *)id;
+ lt->dvert= MEM_callocN(sizeof(MDeformVert)*lt->pntsu*lt->pntsv*lt->pntsw, "lattice deformVert");
+ }
+}
+
+/* for mesh in object mode
+ lattice can be in editmode */
+void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
+{
+ /* This routine removes the vertex from the deform
+ * group with number def_nr.
+ *
+ * This routine is meant to be fast, so it is the
+ * responsibility of the calling routine to:
+ * a) test whether ob is non-NULL
+ * b) test whether ob is a mesh
+ * c) calculate def_nr
+ */
+
+ MDeformWeight *newdw;
+ MDeformVert *dvert= NULL;
+ int i;
+
+ /* get the deform vertices corresponding to the
+ * vertnum
+ */
+ if(ob->type==OB_MESH) {
+ if(((Mesh*)ob->data)->dvert)
+ dvert = ((Mesh*)ob->data)->dvert + vertnum;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+
+ if(lt->dvert)
+ dvert = lt->dvert + vertnum;
+ }
+
+ if(dvert==NULL)
+ return;
+
+ /* for all of the deform weights in the
+ * deform vert
+ */
+ for(i=dvert->totweight - 1 ; i>=0 ; i--){
+
+ /* if the def_nr is the same as the one
+ * for our weight group then remove it
+ * from this deform vert.
+ */
+ if(dvert->dw[i].def_nr == def_nr) {
+ dvert->totweight--;
+
+ /* if there are still other deform weights
+ * attached to this vert then remove this
+ * deform weight, and reshuffle the others
+ */
+ if(dvert->totweight) {
+ newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight),
+ "deformWeight");
+ if(dvert->dw){
+ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
+ memcpy(newdw+i, dvert->dw+i+1,
+ sizeof(MDeformWeight)*(dvert->totweight-i));
+ MEM_freeN(dvert->dw);
+ }
+ dvert->dw=newdw;
+ }
+ /* if there are no other deform weights
+ * left then just remove the deform weight
+ */
+ else {
+ MEM_freeN(dvert->dw);
+ dvert->dw = NULL;
+ break;
+ }
+ }
+ }
+
+}
+
+/* for Mesh in Object mode */
+/* allows editmode for Lattice */
+void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode)
+{
+ /* add the vert to the deform group with the
+ * specified number
+ */
+ MDeformVert *dv= NULL;
+ MDeformWeight *newdw;
+ int i;
+
+ /* get the vert */
+ if(ob->type==OB_MESH) {
+ if(((Mesh*)ob->data)->dvert)
+ dv = ((Mesh*)ob->data)->dvert + vertnum;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+
+ if(lt->dvert)
+ dv = lt->dvert + vertnum;
+ }
+
+ if(dv==NULL)
+ return;
+
+ /* Lets first check to see if this vert is
+ * already in the weight group -- if so
+ * lets update it
+ */
+ for(i=0; i<dv->totweight; i++){
+
+ /* if this weight cooresponds to the
+ * deform group, then add it using
+ * the assign mode provided
+ */
+ if(dv->dw[i].def_nr == def_nr){
+
+ switch(assignmode) {
+ case WEIGHT_REPLACE:
+ dv->dw[i].weight=weight;
+ break;
+ case WEIGHT_ADD:
+ dv->dw[i].weight+=weight;
+ if(dv->dw[i].weight >= 1.0)
+ dv->dw[i].weight = 1.0;
+ break;
+ case WEIGHT_SUBTRACT:
+ dv->dw[i].weight-=weight;
+ /* if the weight is zero or less then
+ * remove the vert from the deform group
+ */
+ if(dv->dw[i].weight <= 0.0)
+ ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
+ break;
+ }
+ return;
+ }
+ }
+
+ /* if the vert wasn't in the deform group then
+ * we must take a different form of action ...
+ */
+
+ switch(assignmode) {
+ case WEIGHT_SUBTRACT:
+ /* if we are subtracting then we don't
+ * need to do anything
+ */
+ return;
+
+ case WEIGHT_REPLACE:
+ case WEIGHT_ADD:
+ /* if we are doing an additive assignment, then
+ * we need to create the deform weight
+ */
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1),
+ "deformWeight");
+ if(dv->dw){
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+ MEM_freeN(dv->dw);
+ }
+ dv->dw=newdw;
+
+ dv->dw[dv->totweight].weight=weight;
+ dv->dw[dv->totweight].def_nr=def_nr;
+
+ dv->totweight++;
+ break;
+ }
+}
+
+/* called while not in editmode */
+void ED_vgroup_vert_add(Object *ob, bDeformGroup *dg, int vertnum, float weight, int assignmode)
+{
+ /* add the vert to the deform group with the
+ * specified assign mode
+ */
+ int def_nr;
+
+ /* get the deform group number, exit if
+ * it can't be found
+ */
+ def_nr = get_defgroup_num(ob, dg);
+ if(def_nr < 0) return;
+
+ /* if there's no deform verts then
+ * create some
+ */
+ if(ob->type==OB_MESH) {
+ if(!((Mesh*)ob->data)->dvert)
+ ED_vgroup_data_create(ob->data);
+ }
+ else if(ob->type==OB_LATTICE) {
+ if(!((Lattice*)ob->data)->dvert)
+ ED_vgroup_data_create(ob->data);
+ }
+
+ /* call another function to do the work
+ */
+ ED_vgroup_nr_vert_add(ob, def_nr, vertnum, weight, assignmode);
+}
+
+/* mesh object mode, lattice can be in editmode */
+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)
+ return;
+
+ /* get the deform number that cooresponds
+ * to this deform group, and abort if it
+ * can not be found.
+ */
+ def_nr = get_defgroup_num(ob, dg);
+ if(def_nr < 0) return;
+
+ /* call another routine to do the work
+ */
+ ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
+}
+
+static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
+{
+ MDeformVert *dvert= NULL;
+ EditVert *eve;
+ Mesh *me;
+ int i;
+
+ /* get the deform vertices corresponding to the vertnum */
+ if(ob->type==OB_MESH) {
+ me= ob->data;
+
+ if(me->edit_mesh) {
+ eve= BLI_findlink(&me->edit_mesh->verts, vertnum);
+ if(!eve) return 0.0f;
+ dvert= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT);
+ }
+ else
+ dvert = me->dvert + vertnum;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+
+ if(lt->dvert)
+ dvert = lt->dvert + vertnum;
+ }
+
+ if(dvert==NULL)
+ return 0.0f;
+
+ for(i=dvert->totweight-1 ; i>=0 ; i--)
+ if(dvert->dw[i].def_nr == def_nr)
+ return dvert->dw[i].weight;
+
+ return 0.0f;
+}
+
+float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
+{
+ int def_nr;
+
+ if(!ob) return 0.0f;
+
+ def_nr = get_defgroup_num(ob, dg);
+ if(def_nr < 0) return 0.0f;
+
+ return get_vert_def_nr(ob, def_nr, vertnum);
+}
+
+void ED_vgroup_select_by_name(Object *ob, char *name)
+{
+ bDeformGroup *curdef;
+ int actdef= 1;
+
+ for(curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++){
+ if(!strcmp(curdef->name, name)) {
+ ob->actdef= actdef;
+ return;
+ }
+ }
+
+ ob->actdef=0; // this signals on painting to create a new one, if a bone in posemode is selected */
+}
+
+/********************** Operator Implementations *********************/
+
+/* only in editmode */
+static void vgroup_select_verts(Object *ob, int select)
+{
+ EditVert *eve;
+ MDeformVert *dvert;
+ int i;
+
+ if(ob->type == OB_MESH) {
+ Mesh *me= ob->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ for(eve=em->verts.first; eve; eve=eve->next){
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ 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;
+
+ break;
+ }
+ }
+ }
+ }
+ /* this has to be called, because this function operates on vertices only */
+ if(select) EM_select_flush(em); // vertices to edges/faces
+ else EM_deselect_flush(em);
+
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else if(ob->type == OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+
+ if(lt->dvert) {
+ BPoint *bp;
+ int a, tot;
+
+ dvert= lt->dvert;
+
+ 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(select) bp->f1 |= SELECT;
+ else bp->f1 &= ~SELECT;
+
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+static void vgroup_duplicate(Object *ob)
+{
+ bDeformGroup *dg, *cdg;
+ char name[32], s[32];
+ MDeformWeight *org, *cpy;
+ MDeformVert *dvert, *dvert_array=NULL;
+ int i, idg, icdg, dvert_tot=0;
+
+ dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
+ if(!dg)
+ return;
+
+ if(strstr(dg->name, "_copy")) {
+ BLI_strncpy(name, dg->name, 32); /* will be renamed _copy.001... etc */
+ }
+ else {
+ BLI_snprintf(name, 32, "%s_copy", dg->name);
+ while(get_named_vertexgroup(ob, name)) {
+ if((strlen(name) + 6) > 32) {
+ printf("Internal error: the name for the new vertex group is > 32 characters");
+ return;
+ }
+ strcpy(s, name);
+ BLI_snprintf(name, 32, "%s_copy", s);
+ }
+ }
+
+ cdg = copy_defgroup(dg);
+ strcpy(cdg->name, name);
+ unique_vertexgroup_name(cdg, ob);
+
+ BLI_addtail(&ob->defbase, cdg);
+
+ idg = (ob->actdef-1);
+ ob->actdef = BLI_countlist(&ob->defbase);
+ icdg = (ob->actdef-1);
+
+ if(ob->type == OB_MESH) {
+ Mesh *me = get_mesh(ob);
+ dvert_array= me->dvert;
+ dvert_tot= me->totvert;
+ }
+ else if(ob->type == OB_LATTICE) {
+ Lattice *lt= (Lattice *)ob->data;
+ dvert_array= lt->dvert;
+ dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ }
+
+ if(!dvert_array)
+ return;
+
+ for(i = 0; i < dvert_tot; i++) {
+ dvert = dvert_array+i;
+ org = ED_vgroup_weight_get(dvert, idg);
+ if(org) {
+ float weight = org->weight;
+ /* ED_vgroup_weight_verify re-allocs org so need to store the weight first */
+ cpy = ED_vgroup_weight_verify(dvert, icdg);
+ cpy->weight = weight;
+ }
+ }
+}
+
+static void vgroup_delete_update_users(Object *ob, int id)
+{
+ ExplodeModifierData *emd;
+ ModifierData *md;
+ ParticleSystem *psys;
+ ClothModifierData *clmd;
+ ClothSimSettings *clsim;
+ int a;
+
+ /* these cases don't use names to refer to vertex groups, so when
+ * they get deleted the numbers get out of sync, this corrects that */
+
+ if(ob->soft) {
+ if(ob->soft->vertgroup == id)
+ ob->soft->vertgroup= 0;
+ else if(ob->soft->vertgroup > id)
+ ob->soft->vertgroup--;
+ }
+
+ for(md=ob->modifiers.first; md; md=md->next) {
+ if(md->type == eModifierType_Explode) {
+ emd= (ExplodeModifierData*)md;
+
+ if(emd->vgroup == id)
+ emd->vgroup= 0;
+ else if(emd->vgroup > id)
+ emd->vgroup--;
+ }
+ else if(md->type == eModifierType_Cloth) {
+ clmd= (ClothModifierData*)md;
+ clsim= clmd->sim_parms;
+
+ if(clsim) {
+ if(clsim->vgroup_mass == id)
+ clsim->vgroup_mass= 0;
+ else if(clsim->vgroup_mass > id)
+ clsim->vgroup_mass--;
+
+ if(clsim->vgroup_bend == id)
+ clsim->vgroup_bend= 0;
+ else if(clsim->vgroup_bend > id)
+ clsim->vgroup_bend--;
+
+ if(clsim->vgroup_struct == id)
+ clsim->vgroup_struct= 0;
+ else if(clsim->vgroup_struct > id)
+ clsim->vgroup_struct--;
+ }
+ }
+ }
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ for(a=0; a<PSYS_TOT_VG; a++)
+ if(psys->vgroup[a] == id)
+ psys->vgroup[a]= 0;
+ else if(psys->vgroup[a] > id)
+ psys->vgroup[a]--;
+ }
+}
+
+static void vgroup_delete_object_mode(Object *ob)
+{
+ bDeformGroup *dg;
+ MDeformVert *dvert, *dvert_array=NULL;
+ int i, e, dvert_tot=0;
+
+ if(ob->type == OB_MESH) {
+ Mesh *me = get_mesh(ob);
+ dvert_array= me->dvert;
+ dvert_tot= me->totvert;
+ }
+ else if(ob->type == OB_LATTICE) {
+ Lattice *lt= (Lattice *)ob->data;
+ dvert_array= lt->dvert;
+ dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ }
+
+ dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
+ if(!dg)
+ return;
+
+ if(dvert_array) {
+ for(i = 0; i < dvert_tot; i++) {
+ dvert = dvert_array + i;
+ if(dvert) {
+ if(ED_vgroup_weight_get(dvert, (ob->actdef-1)))
+ ED_vgroup_vert_remove(ob, dg, i);
+ }
+ }
+
+ 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--;
+ }
+ }
+ }
+ }
+
+ vgroup_delete_update_users(ob, ob->actdef);
+
+ /* Update the active deform index if necessary */
+ if(ob->actdef == BLI_countlist(&ob->defbase))
+ ob->actdef--;
+
+ /* Remove the group */
+ BLI_freelinkN(&ob->defbase, dg);
+}
+
+/* only in editmode */
+/* removes from active defgroup, if allverts==0 only selected vertices */
+static void vgroup_active_remove_verts(Object *ob, int allverts)
+{
+ EditVert *eve;
+ MDeformVert *dvert;
+ MDeformWeight *newdw;
+ bDeformGroup *dg, *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);
+
+ for(eve=em->verts.first; eve; eve=eve->next){
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if(dvert && dvert->dw && ((eve->f & 1) || allverts)){
+ for(i=0; i<dvert->totweight; i++){
+ /* Find group */
+ eg = BLI_findlink(&ob->defbase, dvert->dw[i].def_nr);
+ if(eg == dg){
+ dvert->totweight--;
+ if(dvert->totweight){
+ newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), "deformWeight");
+
+ if(dvert->dw){
+ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
+ memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
+ MEM_freeN(dvert->dw);
+ }
+ dvert->dw=newdw;
+ }
+ else{
+ MEM_freeN(dvert->dw);
+ dvert->dw=NULL;
+ break;
+ }
+ }
+ }
+ }
+ }
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else if(ob->type == OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+
+ if(lt->dvert) {
+ BPoint *bp;
+ int a, tot= lt->pntsu*lt->pntsv*lt->pntsw;
+
+ for(a=0, bp= lt->def; a<tot; a++, bp++) {
+ if(allverts || (bp->f1 & SELECT))
+ ED_vgroup_vert_remove(ob, dg, a);
+ }
+ }
+ }
+}
+
+static void vgroup_delete_edit_mode(Object *ob)
+{
+ bDeformGroup *defgroup;
+ int i;
+
+ if(!ob->actdef)
+ return;
+
+ defgroup = BLI_findlink(&ob->defbase, ob->actdef-1);
+ if(!defgroup)
+ return;
+
+ /* Make sure that no verts are using this group */
+ vgroup_active_remove_verts(ob, 1);
+
+ /* Make sure that any verts with higher indices are adjusted accordingly */
+ if(ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+ EditVert *eve;
+ MDeformVert *dvert;
+
+ for(eve=em->verts.first; eve; eve=eve->next){
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if(dvert)
+ for(i=0; i<dvert->totweight; i++)
+ if(dvert->dw[i].def_nr > (ob->actdef-1))
+ dvert->dw[i].def_nr--;
+ }
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+ BPoint *bp;
+ MDeformVert *dvert= lt->dvert;
+ int a, tot;
+
+ if(dvert) {
+ 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))
+ dvert->dw[i].def_nr--;
+ }
+ }
+ }
+ }
+
+ vgroup_delete_update_users(ob, ob->actdef);
+
+ /* Update the active deform index if necessary */
+ if(ob->actdef==BLI_countlist(&ob->defbase))
+ ob->actdef--;
+
+ /* Remove the group */
+ BLI_freelinkN (&ob->defbase, defgroup);
+
+ /* remove all dverts */
+ if(ob->actdef==0) {
+ if(ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ me->dvert= NULL;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+ if(lt->dvert) {
+ MEM_freeN(lt->dvert);
+ lt->dvert= NULL;
+ }
+ }
+ }
+}
+
+static int vgroup_object_in_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;
+}
+
+static void vgroup_delete(Object *ob)
+{
+ if(vgroup_object_in_edit_mode(ob))
+ vgroup_delete_edit_mode(ob);
+ else
+ vgroup_delete_object_mode(ob);
+}
+
+static void vgroup_delete_all(Object *ob)
+{
+ /* Remove all DVerts */
+ if(ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ me->dvert= NULL;
+ }
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+ if(lt->dvert) {
+ MEM_freeN(lt->dvert);
+ lt->dvert= NULL;
+ }
+ }
+
+ /* Remove all DefGroups */
+ BLI_freelistN(&ob->defbase);
+
+ /* Fix counters/indices */
+ ob->actdef= 0;
+}
+
+/* only in editmode */
+static void vgroup_assign_verts(Object *ob, float weight)
+{
+ EditVert *eve;
+ bDeformGroup *dg, *eg;
+ MDeformWeight *newdw;
+ MDeformVert *dvert;
+ int i, done;
+
+ dg=BLI_findlink(&ob->defbase, ob->actdef-1);
+
+ if(ob->type == OB_MESH) {
+ Mesh *me= ob->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+
+ if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT))
+ EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT);
+
+ /* Go through the list of editverts and assign them */
+ for(eve=em->verts.first; eve; eve=eve->next){
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+
+ if(dvert && (eve->f & 1)){
+ done=0;
+ /* See if this vert already has a reference to this group */
+ /* If so: Change its weight */
+ done=0;
+ for(i=0; i<dvert->totweight; i++){
+ eg = BLI_findlink(&ob->defbase, dvert->dw[i].def_nr);
+ /* Find the actual group */
+ if(eg==dg){
+ dvert->dw[i].weight= weight;
+ done=1;
+ break;
+ }
+ }
+ /* If not: Add the group and set its weight */
+ if(!done){
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight");
+ if(dvert->dw){
+ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*dvert->totweight);
+ MEM_freeN(dvert->dw);
+ }
+ dvert->dw=newdw;
+
+ dvert->dw[dvert->totweight].weight= weight;
+ dvert->dw[dvert->totweight].def_nr= ob->actdef-1;
+
+ dvert->totweight++;
+
+ }
+ }
+ }
+ BKE_mesh_end_editmesh(me, em);
+ }
+ else if(ob->type == OB_LATTICE) {
+ Lattice *lt= vgroup_edit_lattice(ob);
+ BPoint *bp;
+ int a, tot;
+
+ if(lt->dvert==NULL)
+ ED_vgroup_data_create(&lt->id);
+
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ for(a=0, bp= lt->def; a<tot; a++, bp++) {
+ if(bp->f1 & SELECT)
+ ED_vgroup_nr_vert_add(ob, ob->actdef-1, a, weight, WEIGHT_REPLACE);
+ }
+ }
+}
+
+/* only in editmode */
+/* 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;
+}
+
+/********************** vertex group operators *********************/
+
+static int vertex_group_poll(bContext *C)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ID *data= (ob)? ob->data: NULL;
+ return (ob && !ob->id.lib && ELEM(ob->type, OB_MESH, OB_LATTICE) && data && !data->lib);
+}
+
+static int vertex_group_poll_edit(bContext *C)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ ID *data= (ob)? ob->data: NULL;
+
+ if(!(ob && !ob->id.lib && data && !data->lib))
+ return 0;
+
+ return vgroup_object_in_edit_mode(ob);
+}
+
+static int vertex_group_add_exec(bContext *C, wmOperator *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);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_add";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= vertex_group_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int vertex_group_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+
+ if(RNA_boolean_get(op->ptr, "all"))
+ vgroup_delete_all(ob);
+ else
+ vgroup_delete(ob);
+
+ DAG_id_flush_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);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_remove";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= vertex_group_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups.");
+}
+
+static int vertex_group_assign_exec(bContext *C, wmOperator *op)
+{
+ ToolSettings *ts= CTX_data_tool_settings(C);
+ Object *ob= CTX_data_edit_object(C);
+
+ if(RNA_boolean_get(op->ptr, "new"))
+ ED_vgroup_add(ob);
+
+ vgroup_assign_verts(ob, ts->vgroup_weight);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_assign(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Assign Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_assign";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll_edit;
+ ot->exec= vertex_group_assign_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "new", 0, "New", "Assign vertex to new vertex group.");
+}
+
+static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+
+ vgroup_remove_verts(ob, 0);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove from Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_remove_from";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll_edit;
+ ot->exec= vertex_group_remove_from_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups.");
+}
+
+static int vertex_group_select_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+
+ if(!ob || ob->id.lib)
+ return OPERATOR_CANCELLED;
+
+ vgroup_select_verts(ob, 1);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_select(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_select";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll_edit;
+ ot->exec= vertex_group_select_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int vertex_group_deselect_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_edit_object(C);
+
+ vgroup_select_verts(ob, 0);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Deselect Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_deselect";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll_edit;
+ ot->exec= vertex_group_deselect_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int vertex_group_copy_exec(bContext *C, wmOperator *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);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_copy(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_copy";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= vertex_group_copy_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Base *base;
+ int retval= OPERATOR_CANCELLED;
+
+ for(base=scene->base.first; base; base= base->next) {
+ if(base->object->type==ob->type) {
+ if(base->object!=ob && base->object->data==ob->data) {
+ BLI_freelistN(&base->object->defbase);
+ BLI_duplicatelist(&base->object->defbase, &ob->defbase);
+ base->object->actdef= ob->actdef;
+
+ DAG_id_flush_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);
+
+ retval = OPERATOR_FINISHED;
+ }
+ }
+ }
+
+ return retval;
+}
+
+void OBJECT_OT_vertex_group_copy_to_linked(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy Vertex Group to Linked";
+ ot->idname= "OBJECT_OT_vertex_group_copy_to_linked";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= vertex_group_copy_to_linked_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static EnumPropertyItem vgroup_items[]= {
+ {0, NULL, 0, NULL, NULL}};
+
+static int set_active_group_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ int nr= RNA_enum_get(op->ptr, "group");
+
+ ob->actdef= nr+1;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Object *ob;
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ EnumPropertyItem *item= NULL;
+ bDeformGroup *def;
+ int a, totitem= 0;
+
+ if(!C || !(ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data)) /* needed for docs */
+ return vgroup_items;
+
+ for(a=0, def=ob->defbase.first; def; def=def->next, a++) {
+ tmp.value= a;
+ tmp.identifier= def->name;
+ tmp.name= def->name;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
+void OBJECT_OT_vertex_group_set_active(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Set Active Vertex Group";
+ ot->idname= "OBJECT_OT_vertex_group_set_active";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= set_active_group_exec;
+ ot->invoke= WM_menu_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ prop= RNA_def_enum(ot->srna, "group", vgroup_items, 0, "Group", "Vertex group to set as active.");
+ RNA_def_enum_funcs(prop, vgroup_itemf);
+}
+
+static int vertex_group_menu_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Vertex Groups", 0);
+ layout= uiPupMenuLayout(pup);
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
+
+ if(vgroup_object_in_edit_mode(ob)) {
+ uiItemBooleanO(layout, "Assign to New Group", 0, "OBJECT_OT_vertex_group_assign", "new", 1);
+
+ if(BLI_countlist(&ob->defbase) && ob->actdef) {
+ uiItemO(layout, "Assign to Group", 0, "OBJECT_OT_vertex_group_assign");
+ uiItemO(layout, "Remove from Group", 0, "OBJECT_OT_vertex_group_remove_from");
+ uiItemBooleanO(layout, "Remove from All", 0, "OBJECT_OT_vertex_group_remove_from", "all", 1);
+ }
+ }
+
+ if(BLI_countlist(&ob->defbase) && ob->actdef) {
+ if(vgroup_object_in_edit_mode(ob))
+ uiItemS(layout);
+
+ uiItemO(layout, "Set Active Group", 0, "OBJECT_OT_vertex_group_set_active");
+ uiItemO(layout, "Remove Group", 0, "OBJECT_OT_vertex_group_remove");
+ uiItemBooleanO(layout, "Remove All Groups", 0, "OBJECT_OT_vertex_group_remove", "all", 1);
+ }
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_menu(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Vertex Group Menu";
+ ot->idname= "OBJECT_OT_vertex_group_menu";
+
+ /* api callbacks */
+ ot->poll= vertex_group_poll;
+ ot->exec= vertex_group_menu_exec;
+}
+
diff --git a/source/blender/editors/physics/ed_fluidsim.c b/source/blender/editors/physics/ed_fluidsim.c
index 215a72d6927..093fa3f0a49 100644
--- a/source/blender/editors/physics/ed_fluidsim.c
+++ b/source/blender/editors/physics/ed_fluidsim.c
@@ -67,18 +67,19 @@
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_fluidsim.h"
#include "BKE_global.h"
-#include "BKE_modifier.h"
-#include "BKE_main.h"
+#include "BKE_ipo.h"
#include "BKE_key.h"
-#include "BKE_scene.h"
+#include "BKE_main.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
#include "BKE_softbody.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_ipo.h"
#include "PIL_time.h"
@@ -89,11 +90,17 @@
#include "ED_fluidsim.h"
#include "ED_screen.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
+/* enable/disable overall compilation */
+#ifndef DISABLE_ELBEEM
+
/* XXX */
/* from header info.c */
static int start_progress_bar(void) {return 0;};
static void end_progress_bar(void) {};
-static void waitcursor() {};
+static void waitcursor(int val) {};
static int progress_bar(float done, char *busy_info) {return 0;}
static int pupmenu() {return 0;}
/* XXX */
@@ -117,14 +124,10 @@ char* fluidsimViscosityPresetString[6] = {
"INVALID" /* end */
};
-/* enable/disable overall compilation */
-#ifndef DISABLE_ELBEEM
-
-
/* ********************** fluid sim settings struct functions ********************** */
/* helper function */
-void fluidsimGetGeometryObjFilename(struct Object *ob, char *dst) { //, char *srcname) {
+void fluidsimGetGeometryObjFilename(Object *ob, char *dst) { //, char *srcname) {
//snprintf(dst,FILE_MAXFILE, "%s_cfgdata_%s.bobj.gz", srcname, ob->id.name);
snprintf(dst,FILE_MAXFILE, "fluidcfgdata_%s.bobj.gz", ob->id.name);
}
@@ -197,6 +200,28 @@ static void fluidsimPrintChannel(FILE *file, float *channel, int paramsize, char
static void fluidsimInitChannel(Scene *scene, float **setchannel, int size, float *time,
int *icuIds, float *defaults, Ipo* ipo, int entries)
{
+
+ int i, j;
+ char *cstr = NULL;
+ float *channel = NULL;
+
+ cstr = "fluidsiminit_channelfloat";
+ if(entries>1) cstr = "fluidsiminit_channelvec";
+ channel = MEM_callocN( size* (entries+1)* sizeof(float), cstr );
+
+ /* defaults for now */
+ for(j=0; j<entries; j++) {
+ for(i=1; i<=size; i++) {
+ channel[(i-1)*(entries+1) + j] = defaults[j];
+ }
+ }
+
+ for(i=1; i<=size; i++) {
+ channel[(i-1)*(entries+1) + entries] = time[i];
+ }
+
+ *setchannel = channel;
+
#if 0
/* goes away completely */
int i,j;
@@ -337,14 +362,14 @@ int runSimulationCallback(void *data, int status, int frame) {
/* ********************** write fluidsim config to file ************************* */
/* ******************************************************************************** */
-void fluidsimBake(bContext *C, struct Object *ob)
+int fluidsimBake(bContext *C, ReportList *reports, Object *ob)
{
Scene *scene= CTX_data_scene(C);
FILE *fileCfg;
int i;
- struct Object *fsDomain = NULL;
+ Object *fsDomain = NULL;
FluidsimSettings *domainSettings;
- struct Object *obit = NULL; /* object iterator */
+ Object *obit = NULL; /* object iterator */
Base *base;
int origFrame = scene->r.cfra;
char debugStrBuffer[256];
@@ -412,8 +437,8 @@ void fluidsimBake(bContext *C, struct Object *ob)
// old: noFrames = scene->r.efra - scene->r.sfra +1;
noFrames = scene->r.efra - 0;
if(noFrames<=0) {
- pupmenu("Fluidsim Bake Error%t|No frames to export - check your animation range settings. Aborted%x0");
- return;
+ BKE_report(reports, RPT_ERROR, "No frames to export - check your animation range settings.");
+ return 0;
}
/* no object pointer, find in selected ones.. */
@@ -434,7 +459,7 @@ void fluidsimBake(bContext *C, struct Object *ob)
}
}
// no domains found?
- if(!ob) return;
+ if(!ob) return 0;
}
channelObjCount = 0;
@@ -452,8 +477,8 @@ void fluidsimBake(bContext *C, struct Object *ob)
}
if (channelObjCount>=255) {
- pupmenu("Fluidsim Bake Error%t|Cannot bake with more then 256 objects");
- return;
+ BKE_report(reports, RPT_ERROR, "Cannot bake with more then 256 objects.");
+ return 0;
}
/* check if there's another domain... */
@@ -467,8 +492,8 @@ void fluidsimBake(bContext *C, struct Object *ob)
{
if(obit != ob)
{
- pupmenu("Fluidsim Bake Error%t|There should be only one domain object! Aborted%x0");
- return;
+ BKE_report(reports, RPT_ERROR, "There should be only one domain object.");
+ return 0;
}
}
}
@@ -490,8 +515,8 @@ void fluidsimBake(bContext *C, struct Object *ob)
}
}
if(!haveSomeFluid) {
- pupmenu("Fluidsim Bake Error%t|No fluid objects in scene... Aborted%x0");
- return;
+ BKE_report(reports, RPT_ERROR, "No fluid objects in scene.");
+ return 0;
}
/* these both have to be valid, otherwise we wouldnt be here */
@@ -585,7 +610,7 @@ void fluidsimBake(bContext *C, struct Object *ob)
// ask user if thats what he/she wants...
selection = pupmenu(dispmsg);
- if(selection<1) return; // 0 from menu, or -1 aborted
+ if(selection<1) return 0; // 0 from menu, or -1 aborted
strcpy(targetDir, newSurfdataPath);
strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR);
BLI_convertstringcode(targetDir, G.sce); // fixed #frame-no
@@ -710,6 +735,10 @@ void fluidsimBake(bContext *C, struct Object *ob)
// check & init loc,rot,size
for(j=0; j<3; j++) {
for(k=0; k<3; k++) {
+ // XXX prevent invalid memory access until this works
+ icuex[j][k]= NULL;
+ icudex[j][k]= NULL;
+
// XXX icuex[j][k] = find_ipocurve(obit->ipo, icuIds[j][k] );
// XXX icudex[j][k] = find_ipocurve(obit->ipo, icudIds[j][k] );
// XXX lines below were already disabled!
@@ -812,12 +841,12 @@ void fluidsimBake(bContext *C, struct Object *ob)
if(!Mat4Invert(invDomMat, domainMat)) {
snprintf(debugStrBuffer,256,"fluidsimBake::error - Invalid obj matrix?\n");
elbeemDebugOut(debugStrBuffer);
+ BKE_report(reports, RPT_ERROR, "Invalid object matrix.");
// FIXME add fatal msg
FS_FREE_CHANNELS;
- return;
+ return 0;
}
-
// --------------------------------------------------------------------------------------------
// start writing / exporting
strcpy(targetFile, targetDir);
@@ -1001,7 +1030,6 @@ void fluidsimBake(bContext *C, struct Object *ob)
} // valid mesh
} // objects
//domainSettings->type = OB_FLUIDSIM_DOMAIN; // enable for bake display again
- //fsDomain->fluidsimFlag = OB_FLUIDSIM_ENABLE; // disable during bake
// set to neutral, -1 means user abort, -2 means init error
globalBakeState = 0;
@@ -1080,7 +1108,7 @@ void fluidsimBake(bContext *C, struct Object *ob)
// --------------------------------------------------------------------------------------------
else
{ // write config file to be run with command line simulator
- pupmenu("Fluidsim Bake Message%t|Config file export not supported.%x0");
+ BKE_report(reports, RPT_WARNING, "Config file export not supported.");
} // config file export done!
// --------------------------------------------------------------------------------------------
@@ -1099,51 +1127,81 @@ void fluidsimBake(bContext *C, struct Object *ob)
ED_update_for_newframe(C, 1);
if(!simAborted) {
- char fsmessage[512];
char elbeemerr[256];
- strcpy(fsmessage,"Fluidsim Bake Error: ");
+
// check if some error occurred
if(globalBakeState==-2) {
- strcat(fsmessage,"Failed to initialize [Msg: ");
-
elbeemGetErrorString(elbeemerr);
- strcat(fsmessage,elbeemerr);
-
- strcat(fsmessage,"] |OK%x0");
- pupmenu(fsmessage);
+ BKE_reportf(reports, RPT_ERROR, "Failed to initialize [Msg: %s]", elbeemerr);
+ return 0;
} // init error
}
// elbeemFree();
+ return 1;
}
-void fluidsimFreeBake(struct Object *ob)
+void fluidsimFreeBake(Object *ob)
{
/* not implemented yet */
}
-
#else /* DISABLE_ELBEEM */
/* compile dummy functions for disabled fluid sim */
-FluidsimSettings *fluidsimSettingsNew(struct Object *srcob) {
+FluidsimSettings *fluidsimSettingsNew(Object *srcob)
+{
return NULL;
}
-void fluidsimSettingsFree(FluidsimSettings *fss) {
+void fluidsimSettingsFree(FluidsimSettings *fss)
+{
}
-FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss) {
+FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
+{
return NULL;
}
/* only compile dummy functions */
-void fluidsimBake(bContext *C, struct Object *ob) {
+int fluidsimBake(bContext *C, ReportList *reports, Object *ob)
+{
+ return 0;
}
-void fluidsimFreeBake(struct Object *ob) {
+void fluidsimFreeBake(Object *ob)
+{
}
#endif /* DISABLE_ELBEEM */
+/***************************** Operators ******************************/
+
+static int fluid_bake_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_active_object(C);
+
+ // XXX TODO redraw, escape, non-blocking, ..
+ if(!fluidsimBake(C, op->reports, ob))
+ return OPERATOR_CANCELLED;
+
+ return OPERATOR_FINISHED;
+}
+
+void FLUID_OT_bake(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Fluid Simulation Bake";
+ ot->idname= "FLUID_OT_bake";
+
+ /* api callbacks */
+ ot->exec= fluid_bake_exec;
+ ot->poll= ED_operator_object_active;
+}
+
+void ED_operatortypes_fluid(void)
+{
+ WM_operatortype_append(FLUID_OT_bake);
+}
+
diff --git a/source/blender/editors/physics/ed_pointcache.c b/source/blender/editors/physics/ed_pointcache.c
index 3374e05883c..ed3aaf0cfd1 100644
--- a/source/blender/editors/physics/ed_pointcache.c
+++ b/source/blender/editors/physics/ed_pointcache.c
@@ -31,6 +31,7 @@
#include "DNA_scene_types.h"
#include "DNA_object_force.h"
+#include "DNA_modifier_types.h"
#include "BKE_context.h"
#include "BKE_particle.h"
@@ -39,12 +40,13 @@
#include "BKE_utildefines.h"
#include "BKE_pointcache.h"
#include "BKE_global.h"
-#include "BKE_multires.h"
+#include "BKE_modifier.h"
#include "BLI_blenlib.h"
#include "ED_screen.h"
-#include "ED_pointcache.h"
+#include "ED_physics.h"
+#include "ED_particle.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -60,7 +62,6 @@
static int cache_break_test(void *cbd) {
return G.afbreek==1;
}
-/**************************** general **********************************/
static int ptcache_bake_all_poll(bContext *C)
{
Scene *scene= CTX_data_scene(C);
@@ -71,6 +72,12 @@ static int ptcache_bake_all_poll(bContext *C)
return 1;
}
+static int ptcache_poll(bContext *C)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ return (ptr.data && ptr.id.data);
+}
+
static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -81,6 +88,8 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
baker.pid = NULL;
baker.bake = RNA_boolean_get(op->ptr, "bake");
baker.render = 0;
+ baker.anim_init = 0;
+ baker.quick_step = 1;
baker.break_test = cache_break_test;
baker.break_data = NULL;
baker.progressbar = (void (*)(void *, int))WM_timecursor;
@@ -104,12 +113,11 @@ static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op)
for(pid=pidlist.first; pid; pid=pid->next) {
pid->cache->flag &= ~PTCACHE_BAKED;
- BKE_ptcache_id_reset(scene, pid, PTCACHE_RESET_OUTDATED);
}
+
+ BLI_freelistN(&pidlist);
}
- BLI_freelistN(&pidlist);
-
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
return OPERATOR_FINISHED;
@@ -127,6 +135,8 @@ void PTCACHE_OT_bake_all(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "bake", 1, "Bake", "");
}
void PTCACHE_OT_free_bake_all(wmOperatorType *ot)
{
@@ -141,33 +151,29 @@ void PTCACHE_OT_free_bake_all(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-
-/**************************** particles **********************************/
-static int ptcache_bake_particle_system_poll(bContext *C)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
-
- if(!scene || !ob || ob->id.lib)
- return 0;
-
- return (ob->particlesystem.first != NULL);
-}
-
-static int ptcache_bake_particle_system_exec(bContext *C, wmOperator *op)
+static int ptcache_bake_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys =psys_get_current(ob);
- PTCacheID pid;
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ Object *ob= ptr.id.data;
+ PointCache *cache= ptr.data;
PTCacheBaker baker;
+ PTCacheID *pid;
+ ListBase pidlist;
- BKE_ptcache_id_from_particles(&pid, ob, psys);
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache)
+ break;
+ }
baker.scene = scene;
- baker.pid = &pid;
+ baker.pid = pid;
baker.bake = RNA_boolean_get(op->ptr, "bake");
baker.render = 0;
+ baker.anim_init = 0;
+ baker.quick_step = 1;
baker.break_test = cache_break_test;
baker.break_data = NULL;
baker.progressbar = (void (*)(void *, int))WM_timecursor;
@@ -175,92 +181,173 @@ static int ptcache_bake_particle_system_exec(bContext *C, wmOperator *op)
BKE_ptcache_make_cache(&baker);
+ BLI_freelistN(&pidlist);
+
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
return OPERATOR_FINISHED;
}
-static int ptcache_free_bake_particle_system_exec(bContext *C, wmOperator *op)
+static int ptcache_free_bake_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= psys_get_current(ob);
- PTCacheID pid;
-
- BKE_ptcache_id_from_particles(&pid, ob, psys);
- psys->pointcache->flag &= ~PTCACHE_BAKED;
- BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ PointCache *cache= ptr.data;
+
+ if(cache->edit) {
+ if(!cache->edit->edited || 1) {// XXX okee("Lose changes done in particle mode?")) {
+ PE_free_ptcache_edit(cache->edit);
+ cache->edit = NULL;
+ cache->flag &= ~PTCACHE_BAKED;
+ }
+ }
+ else
+ cache->flag &= ~PTCACHE_BAKED;
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ return OPERATOR_FINISHED;
+}
+static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ PointCache *cache= ptr.data;
+
+ cache->flag |= PTCACHE_BAKED;
return OPERATOR_FINISHED;
}
-void PTCACHE_OT_cache_particle_system(wmOperatorType *ot)
+void PTCACHE_OT_bake(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Bake Particles";
- ot->idname= "PTCACHE_OT_cache_particle_system";
+ ot->name= "Bake Physics";
+ ot->idname= "PTCACHE_OT_bake";
/* api callbacks */
- ot->exec= ptcache_bake_particle_system_exec;
- ot->poll= ptcache_bake_particle_system_poll;
+ ot->exec= ptcache_bake_exec;
+ ot->poll= ptcache_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
RNA_def_boolean(ot->srna, "bake", 0, "Bake", "");
}
-void PTCACHE_OT_free_bake_particle_system(wmOperatorType *ot)
+void PTCACHE_OT_free_bake(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Free Particles Bake";
- ot->idname= "PTCACHE_OT_free_bake_particle_system";
+ ot->name= "Free Physics Bake";
+ ot->idname= "PTCACHE_OT_free_bake";
/* api callbacks */
- ot->exec= ptcache_free_bake_particle_system_exec;
- ot->poll= ptcache_bake_particle_system_poll;
+ ot->exec= ptcache_free_bake_exec;
+ ot->poll= ptcache_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int ptcache_bake_from_particles_cache_exec(bContext *C, wmOperator *op)
+void PTCACHE_OT_bake_from_cache(wmOperatorType *ot)
{
- Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= psys_get_current(ob);
- PTCacheID pid;
+ /* identifiers */
+ ot->name= "Bake From Cache";
+ ot->idname= "PTCACHE_OT_bake_from_cache";
+
+ /* api callbacks */
+ ot->exec= ptcache_bake_from_cache_exec;
+ ot->poll= ptcache_poll;
- BKE_ptcache_id_from_particles(&pid, ob, psys);
- psys->pointcache->flag |= PTCACHE_BAKED;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int ptcache_add_new_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ Object *ob= ptr.id.data;
+ PointCache *cache= ptr.data;
+ PTCacheID *pid;
+ ListBase pidlist;
+
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ *(pid->cache_ptr) = BKE_ptcache_add(pid->ptcaches);
+ break;
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
return OPERATOR_FINISHED;
}
-void PTCACHE_OT_bake_from_particles_cache(wmOperatorType *ot)
+static int ptcache_remove_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr= CTX_data_pointer_get_type(C, "PointCache", &RNA_PointCache);
+ Object *ob= ptr.id.data;
+ PointCache *cache= ptr.data;
+ PTCacheID *pid;
+ ListBase pidlist;
+
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ if(pid->ptcaches->first == pid->ptcaches->last)
+ continue; /* don't delete last cache */
+
+ BLI_remlink(pid->ptcaches, pid->cache);
+ BKE_ptcache_free(pid->cache);
+ *(pid->cache_ptr) = pid->ptcaches->first;
+
+ break;
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+
+ return OPERATOR_FINISHED;
+}
+void PTCACHE_OT_add_new(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Bake From Cache";
- ot->idname= "PTCACHE_OT_bake_from_particles_cache";
+ ot->name= "Add new cache";
+ ot->idname= "PTCACHE_OT_add_new";
/* api callbacks */
- ot->exec= ptcache_bake_from_particles_cache_exec;
- ot->poll= ptcache_bake_particle_system_poll;
+ ot->exec= ptcache_add_new_exec;
+ ot->poll= ptcache_poll; // ptcache_bake_all_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+void PTCACHE_OT_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete current cache";
+ ot->idname= "PTCACHE_OT_remove";
+
+ /* api callbacks */
+ ot->exec= ptcache_remove_exec;
+ ot->poll= ptcache_poll;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
/**************************** registration **********************************/
void ED_operatortypes_pointcache(void)
{
WM_operatortype_append(PTCACHE_OT_bake_all);
WM_operatortype_append(PTCACHE_OT_free_bake_all);
- WM_operatortype_append(PTCACHE_OT_cache_particle_system);
- WM_operatortype_append(PTCACHE_OT_free_bake_particle_system);
- WM_operatortype_append(PTCACHE_OT_bake_from_particles_cache);
+ WM_operatortype_append(PTCACHE_OT_bake);
+ WM_operatortype_append(PTCACHE_OT_free_bake);
+ WM_operatortype_append(PTCACHE_OT_bake_from_cache);
+ WM_operatortype_append(PTCACHE_OT_add_new);
+ WM_operatortype_append(PTCACHE_OT_remove);
}
//void ED_keymap_pointcache(wmWindowManager *wm)
//{
-// ListBase *keymap= WM_keymap_listbase(wm, "Pointcache", 0, 0);
+// wmKeyMap *keymap= WM_keymap_find(wm, "Pointcache", 0, 0);
//
// WM_keymap_add_item(keymap, "PHYSICS_OT_bake_all", AKEY, KM_PRESS, 0, 0);
// WM_keymap_add_item(keymap, "PHYSICS_OT_free_all", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/physics/editparticle.c b/source/blender/editors/physics/editparticle.c
index 1b6b5b43522..a5e169eba06 100644
--- a/source/blender/editors/physics/editparticle.c
+++ b/source/blender/editors/physics/editparticle.c
@@ -57,7 +57,8 @@
#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+#include "BKE_utildefines.h"
+#include "BKE_pointcache.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -85,11 +86,23 @@
#include "physics_intern.h"
-static void PE_create_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys);
-static void ParticleUndo_clear(ParticleSystem *psys);
+static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache, ParticleSystem *psys);
+static void PTCacheUndo_clear(PTCacheEdit *edit);
-#define LOOP_PARTICLES(i, pa) for(i=0, pa=psys->particles; i<totpart; i++, pa++)
-#define LOOP_KEYS(k, key) if(psys->edit)for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++)
+#define KEY_K PTCacheEditKey *key; int k
+#define POINT_P PTCacheEditPoint *point; int p
+#define LOOP_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++)
+#define LOOP_VISIBLE_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++) if(!(point->flag & PEP_HIDE))
+#define LOOP_SELECTED_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++) if(point_is_selected(point))
+#define LOOP_UNSELECTED_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++) if(!point_is_selected(point))
+#define LOOP_EDITED_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++) if(point->flag & PEP_EDIT_RECALC)
+#define LOOP_TAGGED_POINTS for(p=0, point=edit->points; p<edit->totpoint; p++, point++) if(point->flag & PEP_TAG)
+#define LOOP_KEYS for(k=0, key=point->keys; k<point->totkey; k++, key++)
+#define LOOP_VISIBLE_KEYS for(k=0, key=point->keys; k<point->totkey; k++, key++) if(!(key->flag & PEK_HIDE))
+#define LOOP_SELECTED_KEYS for(k=0, key=point->keys; k<point->totkey; k++, key++) if((key->flag & PEK_SELECT) && !(key->flag & PEK_HIDE))
+#define LOOP_TAGGED_KEYS for(k=0, key=point->keys; k<point->totkey; k++, key++) if(key->flag & PEK_TAG)
+
+#define KEY_WCO (key->flag & PEK_USE_WCO ? key->world_co : key->co)
/**************************** utilities *******************************/
@@ -97,46 +110,51 @@ static int PE_poll(bContext *C)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys;
+ PTCacheEdit *edit;
if(!scene || !ob)
return 0;
- psys= PE_get_current(scene, ob);
+ edit= PE_get_current(scene, ob);
- return (psys && psys->edit && (G.f & G_PARTICLEEDIT));
+ return (edit && (ob->mode & OB_MODE_PARTICLE_EDIT));
}
-static int PE_poll_3dview(bContext *C)
+static int PE_hair_poll(bContext *C)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys;
+ PTCacheEdit *edit;
- if(!scene || !ob || !CTX_wm_region_view3d(C))
+ if(!scene || !ob)
return 0;
- psys= PE_get_current(scene, ob);
+ edit= PE_get_current(scene, ob);
+
+ return (edit && edit->psys && (ob->mode & OB_MODE_PARTICLE_EDIT));
+}
- return (psys && psys->edit && (G.f & G_PARTICLEEDIT));
+static int PE_poll_3dview(bContext *C)
+{
+ return PE_poll(C) && CTX_wm_area(C)->spacetype == SPACE_VIEW3D &&
+ CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW;
}
-static void PE_free_particle_edit(ParticleSystem *psys)
+void PE_free_ptcache_edit(PTCacheEdit *edit)
{
- ParticleEdit *edit= psys->edit;
- int i, totpart= psys->totpart;
+ POINT_P;
if(edit==0) return;
- ParticleUndo_clear(psys);
+ PTCacheUndo_clear(edit);
- if(edit->keys) {
- for(i=0; i<totpart; i++) {
- if(edit->keys[i])
- MEM_freeN(edit->keys[i]);
+ if(edit->points) {
+ LOOP_POINTS {
+ if(point->keys)
+ MEM_freeN(point->keys);
}
- MEM_freeN(edit->keys);
+ MEM_freeN(edit->points);
}
if(edit->mirror_cache)
@@ -152,19 +170,25 @@ static void PE_free_particle_edit(ParticleSystem *psys)
edit->emitter_field= 0;
}
- MEM_freeN(edit);
+ psys_free_path_cache(NULL, edit);
- psys->edit= NULL;
- psys->free_edit= NULL;
+ MEM_freeN(edit);
}
/************************************************/
/* Edit Mode Helpers */
/************************************************/
-int PE_can_edit(ParticleSystem *psys)
+int PE_start_edit(PTCacheEdit *edit)
{
- return (psys && psys->edit && (G.f & G_PARTICLEEDIT));
+ if(edit) {
+ edit->edited = 1;
+ if(edit->psys)
+ edit->psys->flag |= PSYS_EDITED;
+ return 1;
+ }
+
+ return 0;
}
ParticleEditSettings *PE_settings(Scene *scene)
@@ -173,73 +197,106 @@ ParticleEditSettings *PE_settings(Scene *scene)
}
/* always gets atleast the first particlesystem even if PSYS_CURRENT flag is not set */
-ParticleSystem *PE_get_current(Scene *scene, Object *ob)
+PTCacheEdit *PE_get_current(Scene *scene, Object *ob)
{
- ParticleSystem *psys;
+ ParticleEditSettings *pset= PE_settings(scene);
+ PTCacheEdit *edit = NULL;
+ ListBase pidlist;
+ PTCacheID *pid;
+
+ pset->scene = scene;
+ pset->object = ob;
if(ob==NULL)
return NULL;
- psys= ob->particlesystem.first;
- while(psys) {
- if(psys->flag & PSYS_CURRENT)
- break;
- psys=psys->next;
- }
+ BKE_ptcache_ids_from_object(&pidlist, ob);
- if(psys==NULL && ob->particlesystem.first) {
- psys=ob->particlesystem.first;
- psys->flag |= PSYS_CURRENT;
+ /* in the case of only one editable thing, set pset->edittype accordingly */
+ if(pidlist.first && pidlist.first == pidlist.last) {
+ pid = pidlist.first;
+ switch(pid->type) {
+ case PTCACHE_TYPE_PARTICLES:
+ pset->edittype = PE_TYPE_PARTICLES;
+ break;
+ case PTCACHE_TYPE_SOFTBODY:
+ pset->edittype = PE_TYPE_SOFTBODY;
+ break;
+ case PTCACHE_TYPE_CLOTH:
+ pset->edittype = PE_TYPE_CLOTH;
+ break;
+ }
}
- /* this happens when Blender is started with particle
- * edit mode enabled XXX there's a draw error then? */
- if(psys && psys_check_enabled(ob, psys) && (ob == OBACT) && (G.f & G_PARTICLEEDIT))
- if(psys->part->type == PART_HAIR && psys->flag & PSYS_EDITED)
- if(psys->edit == NULL)
- PE_create_particle_edit(scene, ob, psys);
-
- return psys;
-}
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pset->edittype == PE_TYPE_PARTICLES && pid->type == PTCACHE_TYPE_PARTICLES) {
+ ParticleSystem *psys = pid->calldata;
-/* returns -1 if no system has PSYS_CURRENT flag */
-short PE_get_current_num(Object *ob)
-{
- short num=0;
- ParticleSystem *psys= ob->particlesystem.first;
+ if(psys->flag & PSYS_CURRENT) {
+ if(psys->part && psys->part->type == PART_HAIR) {
+ if(psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED) {
+ if(!psys->pointcache->edit)
+ PE_create_particle_edit(scene, ob, pid->cache, NULL);
+ edit = pid->cache->edit;
+ }
+ else {
+ if(!psys->edit && psys->flag & PSYS_HAIR_DONE)
+ PE_create_particle_edit(scene, ob, NULL, psys);
+ edit = psys->edit;
+ }
+ }
+ else {
+ if(pid->cache->flag & PTCACHE_BAKED && !pid->cache->edit)
+ PE_create_particle_edit(scene, ob, pid->cache, psys);
+ edit = pid->cache->edit;
+ }
- while(psys) {
- if(psys->flag & PSYS_CURRENT)
- return num;
- num++;
- psys=psys->next;
+ break;
+ }
+ }
+ else if(pset->edittype == PE_TYPE_SOFTBODY && pid->type == PTCACHE_TYPE_SOFTBODY) {
+ if(pid->cache->flag & PTCACHE_BAKED && !pid->cache->edit)
+ PE_create_particle_edit(scene, ob, pid->cache, NULL);
+ edit = pid->cache->edit;
+ break;
+ }
+ else if(pset->edittype == PE_TYPE_CLOTH && pid->type == PTCACHE_TYPE_CLOTH) {
+ if(pid->cache->flag & PTCACHE_BAKED && !pid->cache->edit)
+ PE_create_particle_edit(scene, ob, pid->cache, NULL);
+ edit = pid->cache->edit;
+ break;
+ }
}
- return -1;
+ if(edit)
+ edit->pid = *pid;
+
+ BLI_freelistN(&pidlist);
+
+ return edit;
}
-void PE_hide_keys_time(Scene *scene, ParticleSystem *psys, float cfra)
+void PE_hide_keys_time(Scene *scene, PTCacheEdit *edit, float cfra)
{
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset=PE_settings(scene);
- int i, k, totpart= psys->totpart;
+ POINT_P; KEY_K;
- if(pset->draw_timed && pset->selectmode==SCE_SELECT_POINT) {
- LOOP_PARTICLES(i, pa) {
- LOOP_KEYS(k, key) {
- if(fabs(cfra-*key->time) < pset->draw_timed)
+
+ if(pset->flag & PE_FADE_TIME && pset->selectmode==SCE_SELECT_POINT) {
+ LOOP_POINTS {
+ LOOP_KEYS {
+ if(fabs(cfra-*key->time) < pset->fade_frames)
key->flag &= ~PEK_HIDE;
else {
key->flag |= PEK_HIDE;
- key->flag &= ~PEK_SELECT;
+ //key->flag &= ~PEK_SELECT;
}
}
}
}
else {
- LOOP_PARTICLES(i, pa) {
- LOOP_KEYS(k, key) {
+ LOOP_POINTS {
+ LOOP_KEYS {
key->flag &= ~PEK_HIDE;
}
}
@@ -255,7 +312,7 @@ typedef struct PEData {
Scene *scene;
Object *ob;
DerivedMesh *dm;
- ParticleSystem *psys;
+ PTCacheEdit *edit;
short *mval;
rcti *rect;
@@ -271,6 +328,7 @@ typedef struct PEData {
float smoothfac;
float weightfac;
float growfac;
+ int totrekey;
int invert;
int tot;
@@ -283,7 +341,7 @@ static void PE_set_data(bContext *C, PEData *data)
data->scene= CTX_data_scene(C);
data->ob= CTX_data_active_object(C);
- data->psys= PE_get_current(data->scene, data->ob);
+ data->edit= PE_get_current(data->scene, data->ob);
}
static void PE_set_view3d_data(bContext *C, PEData *data)
@@ -395,121 +453,103 @@ static int key_inside_test(PEData *data, float co[3])
return key_inside_rect(data, co);
}
-static int particle_is_selected(ParticleSystem *psys, ParticleData *pa)
+static int point_is_selected(PTCacheEditPoint *point)
{
- ParticleEditKey *key;
- int sel, i, k;
+ KEY_K;
+ int sel;
- if(pa->flag & PARS_HIDE)
+ if(point->flag & PEP_HIDE)
return 0;
sel= 0;
- i= pa - psys->particles;
- LOOP_KEYS(k, key)
- if(key->flag & PEK_SELECT)
- return 1;
+ LOOP_SELECTED_KEYS {
+ return 1;
+ }
return 0;
}
/*************************** iterators *******************************/
-typedef void (*ForParticleFunc)(PEData *data, int pa_index);
-typedef void (*ForKeyFunc)(PEData *data, int pa_index, int key_index);
-typedef void (*ForKeyMatFunc)(PEData *data, float mat[][4], float imat[][4], int pa_index, int key_index);
+typedef void (*ForPointFunc)(PEData *data, int point_index);
+typedef void (*ForKeyFunc)(PEData *data, int point_index, int key_index);
+typedef void (*ForKeyMatFunc)(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key);
static void for_mouse_hit_keys(PEData *data, ForKeyFunc func, int nearest)
{
- ParticleSystem *psys= data->psys;
- ParticleEdit *edit= psys->edit;
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset= PE_settings(data->scene);
- int i, k, totpart, nearest_pa, nearest_key;
+ PTCacheEdit *edit= data->edit;
+ POINT_P; KEY_K;
+ int nearest_point, nearest_key;
float dist= data->rad;
/* in path select mode we have no keys */
if(pset->selectmode==SCE_SELECT_PATH)
return;
- totpart= psys->totpart;
- nearest_pa= -1;
+ nearest_point= -1;
nearest_key= -1;
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
-
+ LOOP_VISIBLE_POINTS {
if(pset->selectmode == SCE_SELECT_END) {
/* only do end keys */
- key= edit->keys[i] + pa->totkey-1;
+ key= point->keys + point->totkey-1;
if(nearest) {
- if(key_inside_circle(data, dist, key->world_co, &dist)) {
- nearest_pa= i;
- nearest_key= pa->totkey-1;
+ if(key_inside_circle(data, dist, KEY_WCO, &dist)) {
+ nearest_point= p;
+ nearest_key= point->totkey-1;
}
}
- else if(key_inside_test(data, key->world_co))
- func(data, i, pa->totkey-1);
+ else if(key_inside_test(data, KEY_WCO))
+ func(data, p, point->totkey-1);
}
else {
/* do all keys */
- key= edit->keys[i];
-
- LOOP_KEYS(k, key) {
- if(key->flag & PEK_HIDE) continue;
-
+ LOOP_VISIBLE_KEYS {
if(nearest) {
- if(key_inside_circle(data, dist, key->world_co, &dist)) {
- nearest_pa= i;
+ if(key_inside_circle(data, dist, KEY_WCO, &dist)) {
+ nearest_point= p;
nearest_key= k;
}
}
- else if(key_inside_test(data, key->world_co))
- func(data, i, k);
+ else if(key_inside_test(data, KEY_WCO))
+ func(data, p, k);
}
}
}
/* do nearest only */
- if(nearest && nearest_pa > -1)
- func(data, nearest_pa, nearest_key);
+ if(nearest && nearest_point > -1)
+ func(data, nearest_point, nearest_key);
}
-static void foreach_mouse_hit_particle(PEData *data, ForParticleFunc func, int selected)
+static void foreach_mouse_hit_point(PEData *data, ForPointFunc func, int selected)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset= PE_settings(data->scene);
- int i, k, totpart;
-
- totpart= psys->totpart;
+ PTCacheEdit *edit= data->edit;
+ POINT_P; KEY_K;
/* all is selected in path mode */
if(pset->selectmode==SCE_SELECT_PATH)
selected=0;
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
-
+ LOOP_VISIBLE_POINTS {
if(pset->selectmode==SCE_SELECT_END) {
/* only do end keys */
- key= psys->edit->keys[i] + pa->totkey-1;
+ key= point->keys + point->totkey - 1;
if(selected==0 || key->flag & PEK_SELECT)
- if(key_inside_circle(data, data->rad, key->world_co, &data->dist))
- func(data, i);
+ if(key_inside_circle(data, data->rad, KEY_WCO, &data->dist))
+ func(data, p);
}
else {
/* do all keys */
- LOOP_KEYS(k, key) {
- if(key->flag & PEK_HIDE) continue;
-
+ LOOP_VISIBLE_KEYS {
if(selected==0 || key->flag & PEK_SELECT) {
- if(key_inside_circle(data, data->rad, key->world_co, &data->dist)) {
- func(data, i);
+ if(key_inside_circle(data, data->rad, KEY_WCO, &data->dist)) {
+ func(data, p);
break;
}
}
@@ -520,16 +560,15 @@ static void foreach_mouse_hit_particle(PEData *data, ForParticleFunc func, int s
static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa;
- ParticleEditKey *key;
- ParticleSystemModifierData *psmd=0;
+ PTCacheEdit *edit = data->edit;
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd = NULL;
ParticleEditSettings *pset= PE_settings(data->scene);
- int i, k, totpart;
+ POINT_P; KEY_K;
float mat[4][4], imat[4][4];
- psmd= psys_get_modifier(data->ob,psys);
- totpart= psys->totpart;
+ if(edit->psys)
+ psmd= psys_get_modifier(data->ob, edit->psys);
/* all is selected in path mode */
if(pset->selectmode==SCE_SELECT_PATH)
@@ -538,99 +577,77 @@ static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected
Mat4One(imat);
Mat4One(mat);
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
-
- psys_mat_hair_to_global(data->ob, psmd->dm, psys->part->from, pa, mat);
- Mat4Invert(imat,mat);
+ LOOP_VISIBLE_POINTS {
+ if(edit->psys && !(edit->psys->flag & PSYS_GLOBAL_HAIR)) {
+ psys_mat_hair_to_global(data->ob, psmd->dm, psys->part->from, psys->particles + p, mat);
+ Mat4Invert(imat,mat);
+ }
if(pset->selectmode==SCE_SELECT_END) {
/* only do end keys */
- key= psys->edit->keys[i] + pa->totkey-1;
+ key= point->keys + point->totkey-1;
if(selected==0 || key->flag & PEK_SELECT)
- if(key_inside_circle(data, data->rad, key->world_co, &data->dist))
- func(data, mat, imat, i, pa->totkey-1);
+ if(key_inside_circle(data, data->rad, KEY_WCO, &data->dist))
+ func(data, mat, imat, p, point->totkey-1, key);
}
else {
/* do all keys */
- LOOP_KEYS(k, key) {
- if(key->flag&PEK_HIDE) continue;
-
+ LOOP_VISIBLE_KEYS {
if(selected==0 || key->flag & PEK_SELECT)
- if(key_inside_circle(data, data->rad, key->world_co, &data->dist))
- func(data, mat, imat, i, k);
+ if(key_inside_circle(data, data->rad, KEY_WCO, &data->dist))
+ func(data, mat, imat, p, k, key);
}
}
}
}
-static void foreach_selected_particle(PEData *data, ForParticleFunc func)
+static void foreach_selected_point(PEData *data, ForPointFunc func)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa;
- int i, totpart;
-
- totpart= psys->totpart;
+ PTCacheEdit *edit = data->edit;
+ POINT_P;
- LOOP_PARTICLES(i, pa)
- if(particle_is_selected(psys, pa))
- func(data, i);
+ LOOP_SELECTED_POINTS {
+ func(data, p);
+ }
}
static void foreach_selected_key(PEData *data, ForKeyFunc func)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa;
- ParticleEditKey *key;
- int i, k, totpart;
-
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
+ PTCacheEdit *edit = data->edit;
+ POINT_P; KEY_K;
- key= psys->edit->keys[i];
-
- LOOP_KEYS(k, key)
- if(key->flag & PEK_SELECT)
- func(data, i, k);
+ LOOP_VISIBLE_POINTS {
+ LOOP_SELECTED_KEYS {
+ func(data, p, k);
+ }
}
}
-void PE_foreach_particle(PEData *data, ForParticleFunc func)
+static void foreach_point(PEData *data, ForPointFunc func)
{
- ParticleSystem *psys= data->psys;
- int i, totpart;
+ PTCacheEdit *edit = data->edit;
+ POINT_P;
- totpart= psys->totpart;
-
- for(i=0; i<totpart; i++)
- func(data, i);
+ LOOP_POINTS {
+ func(data, p);
+ }
}
-static int count_selected_keys(Scene *scene, ParticleSystem *psys)
+static int count_selected_keys(Scene *scene, PTCacheEdit *edit)
{
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset= PE_settings(scene);
- int i, k, totpart, sel= 0;
-
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
-
- key= psys->edit->keys[i];
+ POINT_P; KEY_K;
+ int sel= 0;
+ LOOP_VISIBLE_POINTS {
if(pset->selectmode==SCE_SELECT_POINT) {
- for(k=0; k<pa->totkey; k++,key++)
- if(key->flag & PEK_SELECT)
- sel++;
+ LOOP_SELECTED_KEYS {
+ sel++;
+ }
}
else if(pset->selectmode==SCE_SELECT_END) {
- key += pa->totkey-1;
-
+ key = point->keys + point->totkey - 1;
if(key->flag & PEK_SELECT)
sel++;
}
@@ -645,13 +662,14 @@ static int count_selected_keys(Scene *scene, ParticleSystem *psys)
static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
{
- ParticleEdit *edit;
- ParticleData *pa;
+ PTCacheEdit *edit;
ParticleSystemModifierData *psmd;
KDTree *tree;
KDTreeNearest nearest;
+ HairKey *key;
+ PARTICLE_P;
float mat[4][4], co[3];
- int i, index, totpart;
+ int index, totpart;
edit= psys->edit;
psmd= psys_get_modifier(ob, psys);
@@ -660,11 +678,12 @@ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
tree= BLI_kdtree_new(totpart);
/* insert particles into kd tree */
- LOOP_PARTICLES(i, pa) {
+ LOOP_PARTICLES {
+ key = pa->hair;
psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
- VECCOPY(co, pa->hair[0].co);
+ VECCOPY(co, key->co);
Mat4MulVecfl(mat, co);
- BLI_kdtree_insert(tree, i, co, NULL);
+ BLI_kdtree_insert(tree, p, co, NULL);
}
BLI_kdtree_balance(tree);
@@ -673,27 +692,28 @@ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
if(!edit->mirror_cache)
edit->mirror_cache= MEM_callocN(sizeof(int)*totpart, "PE mirror cache");
- LOOP_PARTICLES(i, pa) {
+ LOOP_PARTICLES {
+ key = pa->hair;
psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
- VECCOPY(co, pa->hair[0].co);
+ VECCOPY(co, key->co);
Mat4MulVecfl(mat, co);
co[0]= -co[0];
index= BLI_kdtree_find_nearest(tree, co, NULL, &nearest);
/* this needs a custom threshold still, duplicated for editmode mirror */
- if(index != -1 && index != i && (nearest.dist <= 0.0002f))
- edit->mirror_cache[i]= index;
+ if(index != -1 && index != p && (nearest.dist <= 0.0002f))
+ edit->mirror_cache[p]= index;
else
- edit->mirror_cache[i]= -1;
+ edit->mirror_cache[p]= -1;
}
/* make sure mirrors are in two directions */
- LOOP_PARTICLES(i, pa) {
- if(edit->mirror_cache[i]) {
- index= edit->mirror_cache[i];
- if(edit->mirror_cache[index] != i)
- edit->mirror_cache[i]= -1;
+ LOOP_PARTICLES {
+ if(edit->mirror_cache[p]) {
+ index= edit->mirror_cache[p];
+ if(edit->mirror_cache[index] != p)
+ edit->mirror_cache[p]= -1;
}
}
@@ -703,8 +723,9 @@ static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys, ParticleData *pa, ParticleData *mpa)
{
HairKey *hkey, *mhkey;
- ParticleEditKey *key, *mkey;
- ParticleEdit *edit;
+ PTCacheEditPoint *point, *mpoint;
+ PTCacheEditKey *key, *mkey;
+ PTCacheEdit *edit;
float mat[4][4], mmat[4][4], immat[4][4];
int i, mi, k;
@@ -724,17 +745,20 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
else
mi= mpa - psys->particles;
+ point = edit->points + i;
+ mpoint = edit->points + mi;
+
/* make sure they have the same amount of keys */
if(pa->totkey != mpa->totkey) {
if(mpa->hair) MEM_freeN(mpa->hair);
- if(edit->keys[mi]) MEM_freeN(edit->keys[mi]);
+ if(mpoint->keys) MEM_freeN(mpoint->keys);
mpa->hair= MEM_dupallocN(pa->hair);
- edit->keys[mi]= MEM_dupallocN(edit->keys[i]);
- mpa->totkey= pa->totkey;
+ mpoint->keys= MEM_dupallocN(point->keys);
+ mpoint->totkey= point->totkey;
mhkey= mpa->hair;
- mkey= edit->keys[mi];
+ mkey= mpoint->keys;
for(k=0; k<mpa->totkey; k++, mkey++, mhkey++) {
mkey->co= mhkey->co;
mkey->time= &mhkey->time;
@@ -749,8 +773,8 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
hkey=pa->hair;
mhkey=mpa->hair;
- key= edit->keys[i];
- mkey= edit->keys[mi];
+ key= point->keys;
+ mkey= mpoint->keys;
for(k=0; k<pa->totkey; k++, hkey++, mhkey++, key++, mkey++) {
VECCOPY(mhkey->co, hkey->co);
Mat4MulVecfl(mat, mhkey->co);
@@ -761,199 +785,175 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
mkey->flag |= PEK_TAG;
}
- if(pa->flag & PARS_TAG)
- mpa->flag |= PARS_TAG;
- if(pa->flag & PARS_EDIT_RECALC)
- mpa->flag |= PARS_EDIT_RECALC;
+ if(point->flag & PEP_TAG)
+ mpoint->flag |= PEP_TAG;
+ if(point->flag & PEP_EDIT_RECALC)
+ mpoint->flag |= PEP_EDIT_RECALC;
}
static void PE_apply_mirror(Object *ob, ParticleSystem *psys)
{
- ParticleEdit *edit;
- ParticleData *pa;
+ PTCacheEdit *edit;
ParticleSystemModifierData *psmd;
- int i, totpart;
+ POINT_P;
+
+ if(!psys)
+ return;
edit= psys->edit;
psmd= psys_get_modifier(ob, psys);
- totpart= psys->totpart;
/* we delay settings the PARS_EDIT_RECALC for mirrored particles
* to avoid doing mirror twice */
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_EDIT_RECALC) {
- PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+ LOOP_POINTS {
+ if(point->flag & PEP_EDIT_RECALC) {
+ PE_mirror_particle(ob, psmd->dm, psys, psys->particles + p, NULL);
- if(edit->mirror_cache[i] != -1)
- psys->particles[edit->mirror_cache[i]].flag &= ~PARS_EDIT_RECALC;
+ if(edit->mirror_cache[p] != -1)
+ edit->points[edit->mirror_cache[p]].flag &= ~PEP_EDIT_RECALC;
}
}
- LOOP_PARTICLES(i, pa)
- if(pa->flag & PARS_EDIT_RECALC)
- if(edit->mirror_cache[i] != -1)
- psys->particles[edit->mirror_cache[i]].flag |= PARS_EDIT_RECALC;
-
- edit->totkeys= psys_count_keys(psys);
+ LOOP_POINTS {
+ if(point->flag & PEP_EDIT_RECALC)
+ if(edit->mirror_cache[p] != -1)
+ edit->points[edit->mirror_cache[p]].flag |= PEP_EDIT_RECALC;
+ }
}
/************************************************/
/* Edit Calculation */
/************************************************/
/* tries to stop edited particles from going through the emitter's surface */
-static void pe_deflect_emitter(Scene *scene, Object *ob, ParticleSystem *psys)
+static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit)
{
- ParticleEdit *edit;
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset= PE_settings(scene);
- ParticleSystemModifierData *psmd= psys_get_modifier(ob,psys);
- int i, k, totpart,index;
+ ParticleSystem *psys;
+ ParticleSystemModifierData *psmd;
+ POINT_P; KEY_K;
+ int index;
float *vec, *nor, dvec[3], dot, dist_1st;
float hairimat[4][4], hairmat[4][4];
- if(psys==0)
+ if(edit==NULL || edit->psys==NULL || (pset->flag & PE_DEFLECT_EMITTER)==0 || (edit->psys->flag & PSYS_GLOBAL_HAIR))
return;
- if((pset->flag & PE_DEFLECT_EMITTER)==0)
- return;
+ psys = edit->psys;
+ psmd = psys_get_modifier(ob,psys);
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(!(pa->flag & PARS_EDIT_RECALC))
- continue;
-
- psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, hairmat);
-
- LOOP_KEYS(k, key) {
+ LOOP_EDITED_POINTS {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, psys->particles + p, hairmat);
+
+ LOOP_KEYS {
Mat4MulVecfl(hairmat, key->co);
}
- //}
-
- //LOOP_PARTICLES(i, pa) {
- key=psys->edit->keys[i]+1;
-
- dist_1st=VecLenf((key-1)->co,key->co);
- dist_1st*=0.75f*pset->emitterdist;
- for(k=1; k<pa->totkey; k++, key++) {
- index= BLI_kdtree_find_nearest(edit->emitter_field,key->co,NULL,NULL);
-
- vec=edit->emitter_cosnos +index*6;
- nor=vec+3;
+ LOOP_KEYS {
+ if(k==0) {
+ dist_1st = VecLenf((key+1)->co, key->co);
+ dist_1st *= 0.75f * pset->emitterdist;
+ }
+ else {
+ index= BLI_kdtree_find_nearest(edit->emitter_field,key->co,NULL,NULL);
+
+ vec=edit->emitter_cosnos +index*6;
+ nor=vec+3;
- VecSubf(dvec, key->co, vec);
+ VecSubf(dvec, key->co, vec);
- dot=Inpf(dvec,nor);
- VECCOPY(dvec,nor);
+ dot=Inpf(dvec,nor);
+ VECCOPY(dvec,nor);
- if(dot>0.0f) {
- if(dot<dist_1st) {
+ if(dot>0.0f) {
+ if(dot<dist_1st) {
+ Normalize(dvec);
+ VecMulf(dvec,dist_1st-dot);
+ VecAddf(key->co,key->co,dvec);
+ }
+ }
+ else {
Normalize(dvec);
VecMulf(dvec,dist_1st-dot);
VecAddf(key->co,key->co,dvec);
}
+ if(k==1)
+ dist_1st*=1.3333f;
}
- else {
- Normalize(dvec);
- VecMulf(dvec,dist_1st-dot);
- VecAddf(key->co,key->co,dvec);
- }
- if(k==1)
- dist_1st*=1.3333f;
}
- //}
-
- //LOOP_PARTICLES(i, pa) {
Mat4Invert(hairimat,hairmat);
- LOOP_KEYS(k, key) {
+ LOOP_KEYS {
Mat4MulVecfl(hairimat, key->co);
}
}
}
/* force set distances between neighbouring keys */
-void PE_apply_lengths(Scene *scene, ParticleSystem *psys)
+void PE_apply_lengths(Scene *scene, PTCacheEdit *edit)
{
- ParticleEdit *edit;
- ParticleData *pa;
- ParticleEditKey *key;
+
ParticleEditSettings *pset=PE_settings(scene);
- int i, k, totpart;
+ POINT_P; KEY_K;
float dv1[3];
- if(psys==0)
+ if(edit==0 || (pset->flag & PE_KEEP_LENGTHS)==0)
return;
- if((pset->flag & PE_KEEP_LENGTHS)==0)
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
return;
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(!(pa->flag & PARS_EDIT_RECALC))
- continue;
-
- for(k=1, key=edit->keys[i] + 1; k<pa->totkey; k++, key++) {
- VecSubf(dv1, key->co, (key - 1)->co);
- Normalize(dv1);
- VecMulf(dv1, (key - 1)->length);
- VecAddf(key->co, (key - 1)->co, dv1);
+ LOOP_EDITED_POINTS {
+ LOOP_KEYS {
+ if(k) {
+ VecSubf(dv1, key->co, (key - 1)->co);
+ Normalize(dv1);
+ VecMulf(dv1, (key - 1)->length);
+ VecAddf(key->co, (key - 1)->co, dv1);
+ }
}
}
}
/* try to find a nice solution to keep distances between neighbouring keys */
-static void pe_iterate_lengths(Scene *scene, ParticleSystem *psys)
+static void pe_iterate_lengths(Scene *scene, PTCacheEdit *edit)
{
- ParticleEdit *edit;
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset=PE_settings(scene);
- int i, j, k, totpart;
+ POINT_P;
+ PTCacheEditKey *key;
+ int j, k;
float tlen;
float dv0[3]= {0.0f, 0.0f, 0.0f};
float dv1[3]= {0.0f, 0.0f, 0.0f};
float dv2[3]= {0.0f, 0.0f, 0.0f};
- if(psys==0)
+ if(edit==0 || (pset->flag & PE_KEEP_LENGTHS)==0)
return;
- if((pset->flag & PE_KEEP_LENGTHS)==0)
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
return;
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(!(pa->flag & PARS_EDIT_RECALC))
- continue;
-
- for(j=1; j<pa->totkey; j++) {
- float mul= 1.0f / (float)pa->totkey;
+ LOOP_EDITED_POINTS {
+ for(j=1; j<point->totkey; j++) {
+ float mul= 1.0f / (float)point->totkey;
if(pset->flag & PE_LOCK_FIRST) {
- key= edit->keys[i] + 1;
+ key= point->keys + 1;
k= 1;
dv1[0]= dv1[1]= dv1[2]= 0.0;
}
else {
- key= edit->keys[i];
+ key= point->keys;
k= 0;
dv0[0]= dv0[1]= dv0[2]= 0.0;
}
- for(; k<pa->totkey; k++, key++) {
+ for(; k<point->totkey; k++, key++) {
if(k) {
VecSubf(dv0, (key - 1)->co, key->co);
tlen= Normalize(dv0);
VecMulf(dv0, (mul * (tlen - (key - 1)->length)));
}
- if(k < pa->totkey - 1) {
+ if(k < point->totkey - 1) {
VecSubf(dv2, (key + 1)->co, key->co);
tlen= Normalize(dv2);
VecMulf(dv2, mul * (tlen - key->length));
@@ -969,20 +969,16 @@ static void pe_iterate_lengths(Scene *scene, ParticleSystem *psys)
}
}
/* set current distances to be kept between neighbouting keys */
-static void recalc_lengths(ParticleSystem *psys)
+static void recalc_lengths(PTCacheEdit *edit)
{
- ParticleData *pa;
- ParticleEditKey *key;
- int i, k, totpart;
+ POINT_P; KEY_K;
- if(psys==0)
+ if(edit==0)
return;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- key= psys->edit->keys[i];
- for(k=0; k<pa->totkey-1; k++, key++) {
+ LOOP_EDITED_POINTS {
+ key= point->keys;
+ for(k=0; k<point->totkey-1; k++, key++) {
key->length= VecLenf(key->co, (key + 1)->co);
}
}
@@ -992,7 +988,7 @@ static void recalc_lengths(ParticleSystem *psys)
static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
{
DerivedMesh *dm=psys_get_modifier(ob,psys)->dm;
- ParticleEdit *edit= psys->edit;
+ PTCacheEdit *edit= psys->edit;
MFace *mface;
MVert *mvert;
float *vec, *nor;
@@ -1049,74 +1045,149 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
static void PE_update_selection(Scene *scene, Object *ob, int useflag)
{
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit= psys->edit;
- ParticleEditSettings *pset= PE_settings(scene);
- ParticleSettings *part= psys->part;
- ParticleData *pa;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
HairKey *hkey;
- ParticleEditKey *key;
- float cfra= CFRA;
- int i, k, totpart;
-
- totpart= psys->totpart;
+ POINT_P; KEY_K;
/* flag all particles to be updated if not using flag */
if(!useflag)
- LOOP_PARTICLES(i, pa)
- pa->flag |= PARS_EDIT_RECALC;
+ LOOP_POINTS
+ point->flag |= PEP_EDIT_RECALC;
/* flush edit key flag to hair key flag to preserve selection
* on save */
- LOOP_PARTICLES(i, pa) {
- key= edit->keys[i];
-
- for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, key++)
+ if(edit->psys) LOOP_POINTS {
+ hkey = edit->psys->particles[p].hair;
+ LOOP_KEYS {
hkey->editflag= key->flag;
+ hkey++;
+ }
}
- psys_cache_paths(scene, ob, psys, CFRA, 1);
+ psys_cache_edit_paths(scene, ob, edit, CFRA);
- if(part->childtype && (pset->flag & PE_SHOW_CHILD))
- psys_cache_child_paths(scene, ob, psys, cfra, 1);
/* disable update flag */
- LOOP_PARTICLES(i, pa)
- pa->flag &= ~PARS_EDIT_RECALC;
+ LOOP_POINTS
+ point->flag &= ~PEP_EDIT_RECALC;
}
+static void update_world_cos(Object *ob, PTCacheEdit *edit)
+{
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+ POINT_P; KEY_K;
+ float hairmat[4][4];
+
+ if(psys==0 || psys->edit==0)
+ return;
+
+ LOOP_POINTS {
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles+p, hairmat);
+
+ LOOP_KEYS {
+ VECCOPY(key->world_co,key->co);
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ Mat4MulVecfl(hairmat, key->world_co);
+ }
+ }
+}
+static void update_velocities(Object *ob, PTCacheEdit *edit)
+{
+ /*TODO: get frs_sec properly */
+ float vec1[3], vec2[3], frs_sec, dfra;
+ POINT_P; KEY_K;
+
+ /* hair doesn't use velocities */
+ if(edit->psys || !edit->points || !edit->points->keys->vel)
+ return;
+
+ frs_sec = edit->pid.flag & PTCACHE_VEL_PER_SEC ? 25.0f : 1.0f;
+
+ LOOP_EDITED_POINTS {
+ LOOP_KEYS {
+ if(k==0) {
+ dfra = *(key+1)->time - *key->time;
+
+ if(dfra <= 0.0f)
+ continue;
+
+ VECSUB(key->vel, (key+1)->co, key->co);
+
+ if(point->totkey>2) {
+ VECSUB(vec1, (key+1)->co, (key+2)->co);
+ Projf(vec2, vec1, key->vel);
+ VECSUB(vec2, vec1, vec2);
+ VECADDFAC(key->vel, key->vel, vec2, 0.5f);
+ }
+ }
+ else if(k==point->totkey-1) {
+ dfra = *key->time - *(key-1)->time;
+
+ if(dfra <= 0.0f)
+ continue;
+
+ VECSUB(key->vel, key->co, (key-1)->co);
+
+ if(point->totkey>2) {
+ VECSUB(vec1, (key-2)->co, (key-1)->co);
+ Projf(vec2, vec1, key->vel);
+ VECSUB(vec2, vec1, vec2);
+ VECADDFAC(key->vel, key->vel, vec2, 0.5f);
+ }
+ }
+ else {
+ dfra = *(key+1)->time - *(key-1)->time;
+
+ if(dfra <= 0.0f)
+ continue;
+
+ VECSUB(key->vel, (key+1)->co, (key-1)->co);
+ }
+ VecMulf(key->vel, frs_sec/dfra);
+ }
+ }
+}
void PE_update_object(Scene *scene, Object *ob, int useflag)
{
- ParticleSystem *psys= PE_get_current(scene, ob);
ParticleEditSettings *pset= PE_settings(scene);
- ParticleSettings *part= psys->part;
- ParticleData *pa;
- float cfra= CFRA;
- int i, totpart= psys->totpart;
+ PTCacheEdit *edit = PE_get_current(scene, ob);
+ POINT_P;
+
+ if(!edit)
+ return;
/* flag all particles to be updated if not using flag */
if(!useflag)
- LOOP_PARTICLES(i, pa)
- pa->flag |= PARS_EDIT_RECALC;
+ LOOP_POINTS {
+ point->flag |= PEP_EDIT_RECALC;
+ }
/* do post process on particle edit keys */
- pe_iterate_lengths(scene, psys);
- pe_deflect_emitter(scene, ob, psys);
- PE_apply_lengths(scene, psys);
+ pe_iterate_lengths(scene, edit);
+ pe_deflect_emitter(scene, ob, edit);
+ PE_apply_lengths(scene, edit);
if(pset->flag & PE_X_MIRROR)
- PE_apply_mirror(ob,psys);
- psys_update_world_cos(ob,psys);
- PE_hide_keys_time(scene, psys, cfra);
+ PE_apply_mirror(ob,edit->psys);
+ if(edit->psys)
+ update_world_cos(ob, edit);
+ if(pset->flag & PE_AUTO_VELOCITY)
+ update_velocities(ob, edit);
+ PE_hide_keys_time(scene, edit, CFRA);
/* regenerate path caches */
- psys_cache_paths(scene, ob, psys, cfra, 1);
-
- if(part->childtype && (pset->flag & PE_SHOW_CHILD))
- psys_cache_child_paths(scene, ob, psys, cfra, 1);
+ psys_cache_edit_paths(scene, ob, edit, CFRA);
/* disable update flag */
- LOOP_PARTICLES(i, pa)
- pa->flag &= ~PARS_EDIT_RECALC;
+ LOOP_POINTS {
+ point->flag &= ~PEP_EDIT_RECALC;
+ }
+
+ if(edit->psys)
+ edit->psys->flag &= ~PSYS_HAIR_UPDATED;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
/************************************************/
@@ -1125,48 +1196,44 @@ void PE_update_object(Scene *scene, Object *ob, int useflag)
/*-----selection callbacks-----*/
-static void select_key(PEData *data, int pa_index, int key_index)
+static void select_key(PEData *data, int point_index, int key_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= psys->particles + pa_index;
- ParticleEditKey *key= psys->edit->keys[pa_index] + key_index;
+ PTCacheEdit *edit = data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ PTCacheEditKey *key = point->keys + key_index;
if(data->select)
key->flag |= PEK_SELECT;
else
key->flag &= ~PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
-static void select_keys(PEData *data, int pa_index, int key_index)
+static void select_keys(PEData *data, int point_index, int key_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= psys->particles + pa_index;
- ParticleEditKey *key= psys->edit->keys[pa_index];
- int k;
+ PTCacheEdit *edit = data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ KEY_K;
- for(k=0; k<pa->totkey; k++,key++) {
+ LOOP_KEYS {
if(data->select)
key->flag |= PEK_SELECT;
else
key->flag &= ~PEK_SELECT;
}
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
-static void toggle_key_select(PEData *data, int pa_index, int key_index)
+static void toggle_key_select(PEData *data, int point_index, int key_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= psys->particles + pa_index;
+ PTCacheEdit *edit = data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ PTCacheEditKey *key = point->keys + key_index;
- if(psys->edit->keys[pa_index][key_index].flag&PEK_SELECT)
- psys->edit->keys[pa_index][key_index].flag &= ~PEK_SELECT;
- else
- psys->edit->keys[pa_index][key_index].flag |= PEK_SELECT;
-
- pa->flag |= PARS_EDIT_RECALC;
+ key->flag ^= PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
}
/************************ de select all operator ************************/
@@ -1175,40 +1242,31 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit= 0;
- ParticleData *pa;
- ParticleEditKey *key;
- int i, k, totpart, sel= 0;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ POINT_P; KEY_K;
+ int sel= 0;
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
- LOOP_KEYS(k, key) {
- if(key->flag & PEK_SELECT) {
- sel= 1;
- key->flag &= ~PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
- }
+ LOOP_VISIBLE_POINTS {
+ LOOP_SELECTED_KEYS {
+ sel= 1;
+ key->flag &= ~PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
}
}
if(sel==0) {
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
- LOOP_KEYS(k, key) {
+ LOOP_VISIBLE_POINTS {
+ LOOP_KEYS {
if(!(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
}
}
}
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1234,26 +1292,17 @@ int PE_mouse_particles(bContext *C, short *mval, int extend)
PEData data;
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit= 0;
- ParticleData *pa;
- ParticleEditKey *key;
- int i, k, totpart;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ POINT_P; KEY_K;
- if(!PE_can_edit(psys))
+ if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- edit= psys->edit;
- totpart= psys->totpart;
-
if(!extend) {
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
- LOOP_KEYS(k, key) {
- if(key->flag & PEK_SELECT) {
- key->flag &= ~PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
- }
+ LOOP_VISIBLE_POINTS {
+ LOOP_SELECTED_KEYS {
+ key->flag &= ~PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
}
}
}
@@ -1265,18 +1314,16 @@ int PE_mouse_particles(bContext *C, short *mval, int extend)
for_mouse_hit_keys(&data, toggle_key_select, 1); /* nearest only */
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
/************************ select first operator ************************/
-static void select_root(PEData *data, int pa_index)
+static void select_root(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
-
- psys->edit->keys[pa_index]->flag |= PEK_SELECT;
+ data->edit->points[point_index].keys->flag |= PEK_SELECT;
}
static int select_first_exec(bContext *C, wmOperator *op)
@@ -1284,8 +1331,8 @@ static int select_first_exec(bContext *C, wmOperator *op)
PEData data;
PE_set_data(C, &data);
- PE_foreach_particle(&data, select_root);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ foreach_point(&data, select_root);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
@@ -1306,13 +1353,10 @@ void PARTICLE_OT_select_first(wmOperatorType *ot)
/************************ select last operator ************************/
-static void select_tip(PEData *data, int pa_index)
+static void select_tip(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= psys->particles + pa_index;
- ParticleEditKey *key= psys->edit->keys[pa_index] + pa->totkey-1;
-
- key->flag |= PEK_SELECT;
+ PTCacheEditPoint *point = data->edit->points + point_index;
+ point->keys[point->totkey - 1].flag |= PEK_SELECT;
}
static int select_last_exec(bContext *C, wmOperator *op)
@@ -1320,8 +1364,8 @@ static int select_last_exec(bContext *C, wmOperator *op)
PEData data;
PE_set_data(C, &data);
- PE_foreach_particle(&data, select_tip);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ foreach_point(&data, select_tip);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
@@ -1361,7 +1405,7 @@ static int select_linked_exec(bContext *C, wmOperator *op)
for_mouse_hit_keys(&data, select_keys, 1); /* nearest only */
PE_update_selection(data.scene, data.ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
@@ -1403,10 +1447,10 @@ int PE_border_select(bContext *C, rcti *rect, int select)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
+ PTCacheEdit *edit= PE_get_current(scene, ob);
PEData data;
- if(!PE_can_edit(psys))
+ if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
PE_set_view3d_data(C, &data);
@@ -1416,7 +1460,7 @@ int PE_border_select(bContext *C, rcti *rect, int select)
for_mouse_hit_keys(&data, select_key, 0);
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1427,10 +1471,10 @@ int PE_circle_select(bContext *C, int selecting, short *mval, float rad)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
+ PTCacheEdit *edit= PE_get_current(scene, ob);
PEData data;
- if(!PE_can_edit(psys))
+ if(!PE_start_edit(edit))
return OPERATOR_FINISHED;
PE_set_view3d_data(C, &data);
@@ -1441,7 +1485,7 @@ int PE_circle_select(bContext *C, int selecting, short *mval, float rad)
for_mouse_hit_keys(&data, select_key, 0);
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1453,47 +1497,42 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
ARegion *ar= CTX_wm_region(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleSystemModifierData *psmd;
- ParticleEdit *edit;
- ParticleData *pa;
- ParticleEditKey *key;
ParticleEditSettings *pset= PE_settings(scene);
+ PTCacheEdit *edit = PE_get_current(scene, ob);
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
+ POINT_P; KEY_K;
float co[3], mat[4][4];
short vertco[2];
- int i, k, totpart;
- if(!PE_can_edit(psys))
+ if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- psmd= psys_get_modifier(ob, psys);
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
+ Mat4One(mat);
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+ LOOP_VISIBLE_POINTS {
+ if(edit->psys && !(psys->flag & PSYS_GLOBAL_HAIR))
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles + p, mat);
if(pset->selectmode==SCE_SELECT_POINT) {
- LOOP_KEYS(k, key) {
+ LOOP_KEYS {
VECCOPY(co, key->co);
Mat4MulVecfl(mat, co);
project_short(ar, co, vertco);
if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
else if(key->flag & PEK_SELECT) {
key->flag &= ~PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
}
}
}
else if(pset->selectmode==SCE_SELECT_END) {
- key= edit->keys[i] + pa->totkey - 1;
+ key= point->keys + point->totkey - 1;
VECCOPY(co, key->co);
Mat4MulVecfl(mat, co);
@@ -1501,18 +1540,18 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
else if(key->flag & PEK_SELECT) {
key->flag &= ~PEK_SELECT;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
}
}
}
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1523,40 +1562,30 @@ static int hide_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit;
- ParticleEditKey *key;
- ParticleData *pa;
- int i, k, totpart;
-
- edit= psys->edit;
- totpart= psys->totpart;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ POINT_P; KEY_K;
if(RNA_enum_get(op->ptr, "unselected")) {
- LOOP_PARTICLES(i, pa) {
- if(!particle_is_selected(psys, pa)) {
- pa->flag |= PARS_HIDE;
- pa->flag |= PARS_EDIT_RECALC;
+ LOOP_UNSELECTED_POINTS {
+ point->flag |= PEP_HIDE;
+ point->flag |= PEP_EDIT_RECALC;
- LOOP_KEYS(k, key)
- key->flag &= ~PEK_SELECT;
- }
+ LOOP_KEYS
+ key->flag &= ~PEK_SELECT;
}
}
else {
- LOOP_PARTICLES(i, pa) {
- if(particle_is_selected(psys, pa)) {
- pa->flag |= PARS_HIDE;
- pa->flag |= PARS_EDIT_RECALC;
+ LOOP_SELECTED_POINTS {
+ point->flag |= PEP_HIDE;
+ point->flag |= PEP_EDIT_RECALC;
- LOOP_KEYS(k, key)
- key->flag &= ~PEK_SELECT;
- }
+ LOOP_KEYS
+ key->flag &= ~PEK_SELECT;
}
}
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1584,27 +1613,21 @@ static int reveal_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit;
- ParticleEditKey *key;
- ParticleData *pa;
- int i, k, totpart;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ POINT_P; KEY_K;
- edit= psys->edit;
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) {
- pa->flag &= ~PARS_HIDE;
- pa->flag |= PARS_EDIT_RECALC;
+ LOOP_POINTS {
+ if(point->flag & PEP_HIDE) {
+ point->flag &= ~PEP_HIDE;
+ point->flag |= PEP_EDIT_RECALC;
- LOOP_KEYS(k, key)
+ LOOP_KEYS
key->flag |= PEK_SELECT;
}
}
PE_update_selection(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -1625,34 +1648,30 @@ void PARTICLE_OT_reveal(wmOperatorType *ot)
/************************ select less operator ************************/
-static void select_less_keys(PEData *data, int pa_index)
+static void select_less_keys(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
- ParticleEdit *edit= psys->edit;
- ParticleData *pa= &psys->particles[pa_index];
- ParticleEditKey *key;
- int k;
-
- for(k=0,key=edit->keys[pa_index]; k<pa->totkey; k++,key++) {
- if((key->flag & PEK_SELECT)==0) continue;
+ PTCacheEdit *edit= data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ KEY_K;
+ LOOP_SELECTED_KEYS {
if(k==0) {
if(((key+1)->flag&PEK_SELECT)==0)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
- else if(k==pa->totkey-1) {
+ else if(k==point->totkey-1) {
if(((key-1)->flag&PEK_SELECT)==0)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
else {
if((((key-1)->flag & (key+1)->flag) & PEK_SELECT)==0)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
}
- for(k=0,key=edit->keys[pa_index]; k<pa->totkey; k++,key++) {
- if(key->flag&PEK_TO_SELECT)
- key->flag &= ~(PEK_TO_SELECT|PEK_SELECT);
+ LOOP_KEYS {
+ if(key->flag&PEK_TAG)
+ key->flag &= ~(PEK_TAG|PEK_SELECT);
}
}
@@ -1661,8 +1680,8 @@ static int select_less_exec(bContext *C, wmOperator *op)
PEData data;
PE_set_data(C, &data);
- PE_foreach_particle(&data, select_less_keys);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ foreach_point(&data, select_less_keys);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
@@ -1683,34 +1702,32 @@ void PARTICLE_OT_select_less(wmOperatorType *ot)
/************************ select more operator ************************/
-static void select_more_keys(PEData *data, int pa_index)
+static void select_more_keys(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
- ParticleEdit *edit= psys->edit;
- ParticleData *pa= &psys->particles[pa_index];
- ParticleEditKey *key;
- int k;
+ PTCacheEdit *edit= data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ KEY_K;
- for(k=0,key=edit->keys[pa_index]; k<pa->totkey; k++,key++) {
+ LOOP_KEYS {
if(key->flag & PEK_SELECT) continue;
if(k==0) {
if((key+1)->flag&PEK_SELECT)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
- else if(k==pa->totkey-1) {
+ else if(k==point->totkey-1) {
if((key-1)->flag&PEK_SELECT)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
else {
if(((key-1)->flag | (key+1)->flag) & PEK_SELECT)
- key->flag |= PEK_TO_SELECT;
+ key->flag |= PEK_TAG;
}
}
- for(k=0,key=edit->keys[pa_index]; k<pa->totkey; k++,key++) {
- if(key->flag&PEK_TO_SELECT) {
- key->flag &= ~PEK_TO_SELECT;
+ LOOP_KEYS {
+ if(key->flag&PEK_TAG) {
+ key->flag &= ~PEK_TAG;
key->flag |= PEK_SELECT;
}
}
@@ -1721,8 +1738,8 @@ static int select_more_exec(bContext *C, wmOperator *op)
PEData data;
PE_set_data(C, &data);
- PE_foreach_particle(&data, select_more_keys);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, data.ob);
+ foreach_point(&data, select_more_keys);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, data.ob);
return OPERATOR_FINISHED;
}
@@ -1745,32 +1762,34 @@ void PARTICLE_OT_select_more(wmOperatorType *ot)
static void rekey_particle(PEData *data, int pa_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
- ParticleEdit *edit= psys->edit;
- ParticleEditSettings *pset= PE_settings(data->scene);
+ PTCacheEdit *edit= data->edit;
+ ParticleSystem *psys= edit->psys;
+ ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleData *pa= psys->particles + pa_index;
+ PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
- HairKey *key, *new_keys;
- ParticleEditKey *ekey;
+ HairKey *key, *new_keys, *okey;
+ PTCacheEditKey *ekey;
float dval, sta, end;
int k;
pa->flag |= PARS_REKEY;
- key= new_keys= MEM_callocN(pset->totrekey * sizeof(HairKey),"Hair re-key keys");
+ key= new_keys= MEM_callocN(data->totrekey * sizeof(HairKey),"Hair re-key keys");
+ okey = pa->hair;
/* root and tip stay the same */
- VECCOPY(key->co, pa->hair->co);
- VECCOPY((key + pset->totrekey - 1)->co, (pa->hair + pa->totkey - 1)->co);
+ VECCOPY(key->co, okey->co);
+ VECCOPY((key + data->totrekey - 1)->co, (okey + pa->totkey - 1)->co);
- sta= key->time= pa->hair->time;
- end= (key + pset->totrekey - 1)->time= (pa->hair + pa->totkey - 1)->time;
- dval= (end - sta) / (float)(pset->totrekey - 1);
+ sta= key->time= okey->time;
+ end= (key + data->totrekey - 1)->time= (okey + pa->totkey - 1)->time;
+ dval= (end - sta) / (float)(data->totrekey - 1);
/* interpolate new keys from old ones */
- for(k=1,key++; k<pset->totrekey-1; k++,key++) {
- state.time= (float)k / (float)(pset->totrekey-1);
- psys_get_particle_on_path(data->scene, data->ob, psys, pa_index, &state, 0);
+ for(k=1,key++; k<data->totrekey-1; k++,key++) {
+ state.time= (float)k / (float)(data->totrekey-1);
+ psys_get_particle_on_path(&sim, pa_index, &state, 0);
VECCOPY(key->co, state.co);
key->time= sta + k * dval;
}
@@ -1780,40 +1799,38 @@ static void rekey_particle(PEData *data, int pa_index)
MEM_freeN(pa->hair);
pa->hair= new_keys;
- pa->totkey=pset->totrekey;
+ point->totkey=pa->totkey=data->totrekey;
- if(edit->keys[pa_index])
- MEM_freeN(edit->keys[pa_index]);
- ekey= edit->keys[pa_index]= MEM_callocN(pa->totkey * sizeof(ParticleEditKey),"Hair re-key edit keys");
+
+ if(point->keys)
+ MEM_freeN(point->keys);
+ ekey= point->keys= MEM_callocN(pa->totkey * sizeof(PTCacheEditKey),"Hair re-key edit keys");
for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
ekey->co= key->co;
ekey->time= &key->time;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ ekey->flag |= PEK_USE_WCO;
}
pa->flag &= ~PARS_REKEY;
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
static int rekey_exec(bContext *C, wmOperator *op)
{
PEData data;
- ParticleEditSettings *pset;
PE_set_data(C, &data);
- pset= PE_settings(data.scene);
- pset->totrekey= RNA_int_get(op->ptr, "keys");
-
- data.dval= 1.0f / (float)(pset->totrekey-1);
+ data.dval= 1.0f / (float)(data.totrekey-1);
+ data.totrekey= RNA_int_get(op->ptr, "keys");
- foreach_selected_particle(&data, rekey_particle);
-
- data.psys->edit->totkeys= psys_count_keys(data.psys);
- recalc_lengths(data.psys);
+ foreach_selected_point(&data, rekey_particle);
+ recalc_lengths(data.edit);
PE_update_object(data.scene, data.ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, data.ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob);
return OPERATOR_FINISHED;
}
@@ -1826,7 +1843,7 @@ void PARTICLE_OT_rekey(wmOperatorType *ot)
/* api callbacks */
ot->exec= rekey_exec;
- ot->invoke= WM_operator_redo;
+ ot->invoke= WM_operator_props_popup;
ot->poll= PE_poll;
/* flags */
@@ -1838,19 +1855,20 @@ void PARTICLE_OT_rekey(wmOperatorType *ot)
static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float path_time)
{
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit=0;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ ParticleSystem *psys;
+ ParticleSimulationData sim = {scene, ob, edit ? edit->psys : NULL, NULL};
ParticleData *pa;
ParticleKey state;
HairKey *new_keys, *key;
- ParticleEditKey *ekey;
+ PTCacheEditKey *ekey;
int k;
- if(psys==0) return;
+ if(!edit || !edit->psys) return;
- edit= psys->edit;
+ psys = edit->psys;
- pa= &psys->particles[pa_index];
+ pa= psys->particles + pa_index;
pa->flag |= PARS_REKEY;
@@ -1859,7 +1877,7 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
/* interpolate new keys from old ones (roots stay the same) */
for(k=1, key++; k < pa->totkey; k++, key++) {
state.time= path_time * (float)k / (float)(pa->totkey-1);
- psys_get_particle_on_path(scene, ob, psys, pa_index, &state, 0);
+ psys_get_particle_on_path(&sim, pa_index, &state, 0);
VECCOPY(key->co, state.co);
}
@@ -1869,7 +1887,7 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
pa->hair= new_keys;
/* update edit pointers */
- for(k=0, key=pa->hair, ekey=edit->keys[pa_index]; k<pa->totkey; k++, key++, ekey++) {
+ for(k=0, key=pa->hair, ekey=edit->points[pa_index].keys; k<pa->totkey; k++, key++, ekey++) {
ekey->co= key->co;
ekey->time= &key->time;
}
@@ -1881,10 +1899,11 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psys)
{
- ParticleEdit *edit= psys->edit;
+ PTCacheEdit *edit = psys->edit;
ParticleEditSettings *pset= PE_settings(scene);
ParticleData *pa, *npa=0, *new_pars=0;
- ParticleEditKey **key, **nkey=0, **new_keys=0;
+ POINT_P;
+ PTCacheEditPoint *npoint=0, *new_points=0;
ParticleSystemModifierData *psmd;
int i, totpart, new_totpart= psys->totpart, removed= 0;
@@ -1893,55 +1912,51 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
psmd= psys_get_modifier(ob, psys);
totpart= psys->totpart;
- LOOP_PARTICLES(i, pa)
- if(pa->flag & PARS_TAG)
- PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+ LOOP_TAGGED_POINTS {
+ PE_mirror_particle(ob, psmd->dm, psys, psys->particles + p, NULL);
+ }
}
- for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++) {
- if(pa->flag & PARS_TAG) {
- new_totpart--;
- removed++;
- }
+ LOOP_TAGGED_POINTS {
+ new_totpart--;
+ removed++;
}
if(new_totpart != psys->totpart) {
if(new_totpart) {
npa= new_pars= MEM_callocN(new_totpart * sizeof(ParticleData), "ParticleData array");
- nkey= new_keys= MEM_callocN(new_totpart * sizeof(ParticleEditKey *), "ParticleEditKey array");
+ npoint= new_points= MEM_callocN(new_totpart * sizeof(PTCacheEditPoint), "PTCacheEditKey array");
}
pa= psys->particles;
- key= edit->keys;
- for(i=0; i<psys->totpart; i++, pa++, key++) {
- if(pa->flag & PARS_TAG) {
- if(*key)
- MEM_freeN(*key);
+ point= edit->points;
+ for(i=0; i<psys->totpart; i++, pa++, point++) {
+ if(point->flag & PEP_TAG) {
+ if(point->keys)
+ MEM_freeN(point->keys);
if(pa->hair)
MEM_freeN(pa->hair);
}
else {
memcpy(npa, pa, sizeof(ParticleData));
- memcpy(nkey, key, sizeof(ParticleEditKey*));
+ memcpy(npoint, point, sizeof(PTCacheEditPoint));
npa++;
- nkey++;
+ npoint++;
}
}
if(psys->particles) MEM_freeN(psys->particles);
psys->particles= new_pars;
- if(edit->keys) MEM_freeN(edit->keys);
- edit->keys= new_keys;
+ if(edit->points) MEM_freeN(edit->points);
+ edit->points= new_points;
if(edit->mirror_cache) {
MEM_freeN(edit->mirror_cache);
edit->mirror_cache= NULL;
}
- psys->totpart= new_totpart;
-
- edit->totkeys= psys_count_keys(psys);
+ edit->totpoint= psys->totpart= new_totpart;
}
return removed;
@@ -1949,84 +1964,82 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
{
- ParticleEdit *edit= psys->edit;
+ PTCacheEdit *edit= psys->edit;
ParticleEditSettings *pset= PE_settings(scene);
ParticleData *pa;
- HairKey *key, *nkey, *new_keys=0;
- ParticleEditKey *ekey;
+ HairKey *hkey, *nhkey, *new_hkeys=0;
+ POINT_P; KEY_K;
ParticleSystemModifierData *psmd;
- int i, k, totpart= psys->totpart;
short new_totkey;
if(pset->flag & PE_X_MIRROR) {
/* mirror key tags */
psmd= psys_get_modifier(ob, psys);
- LOOP_PARTICLES(i, pa) {
- LOOP_KEYS(k,ekey) {
- if(ekey->flag & PEK_TAG) {
- PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
- break;
- }
+ LOOP_POINTS {
+ LOOP_TAGGED_KEYS {
+ PE_mirror_particle(ob, psmd->dm, psys, psys->particles + p, NULL);
+ break;
}
}
}
- LOOP_PARTICLES(i, pa) {
- new_totkey= pa->totkey;
- LOOP_KEYS(k,ekey) {
- if(ekey->flag & PEK_TAG)
- new_totkey--;
+ LOOP_POINTS {
+ new_totkey= point->totkey;
+ LOOP_TAGGED_KEYS {
+ new_totkey--;
}
/* we can't have elements with less than two keys*/
if(new_totkey < 2)
- pa->flag |= PARS_TAG;
+ point->flag |= PEP_TAG;
}
remove_tagged_particles(scene, ob, psys);
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
+ LOOP_POINTS {
+ pa = psys->particles + p;
new_totkey= pa->totkey;
- LOOP_KEYS(k,ekey) {
- if(ekey->flag & PEK_TAG)
- new_totkey--;
+
+ LOOP_TAGGED_KEYS {
+ new_totkey--;
}
+
if(new_totkey != pa->totkey) {
- key= pa->hair;
- nkey= new_keys= MEM_callocN(new_totkey*sizeof(HairKey), "HairKeys");
+ hkey= pa->hair;
+ nhkey= new_hkeys= MEM_callocN(new_totkey*sizeof(HairKey), "HairKeys");
- for(k=0, ekey=edit->keys[i]; k<new_totkey; k++, key++, nkey++, ekey++) {
- while(ekey->flag & PEK_TAG && key < pa->hair + pa->totkey) {
+ LOOP_KEYS {
+ while(key->flag & PEK_TAG && hkey < pa->hair + pa->totkey) {
key++;
- ekey++;
+ hkey++;
}
- if(key < pa->hair + pa->totkey) {
- VECCOPY(nkey->co, key->co);
- nkey->time= key->time;
- nkey->weight= key->weight;
+ if(hkey < pa->hair + pa->totkey) {
+ VECCOPY(nhkey->co, hkey->co);
+ nhkey->time= hkey->time;
+ nhkey->weight= hkey->weight;
}
+ hkey++;
+ nhkey++;
}
if(pa->hair)
MEM_freeN(pa->hair);
- pa->hair= new_keys;
+ pa->hair= new_hkeys;
- pa->totkey=new_totkey;
+ point->totkey= pa->totkey= new_totkey;
- if(edit->keys[i])
- MEM_freeN(edit->keys[i]);
- ekey= edit->keys[i]= MEM_callocN(new_totkey*sizeof(ParticleEditKey), "particle edit keys");
+ if(point->keys)
+ MEM_freeN(point->keys);
+ key= point->keys= MEM_callocN(new_totkey*sizeof(PTCacheEditKey), "particle edit keys");
- for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
- ekey->co= key->co;
- ekey->time= &key->time;
+ hkey = pa->hair;
+ LOOP_KEYS {
+ key->co= hkey->co;
+ key->time= &hkey->time;
+ hkey++;
}
}
}
-
- edit->totkeys= psys_count_keys(psys);
}
/************************ subdivide opertor *********************/
@@ -2034,19 +2047,20 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
/* works like normal edit mode subdivide, inserts keys between neighbouring selected keys */
static void subdivide_particle(PEData *data, int pa_index)
{
- ParticleSystem *psys= data->psys;
- ParticleEdit *edit= psys->edit;
- ParticleData *pa= &psys->particles[pa_index];
-
+ PTCacheEdit *edit= data->edit;
+ ParticleSystem *psys= edit->psys;
+ ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleData *pa= psys->particles + pa_index;
+ PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
HairKey *key, *nkey, *new_keys;
- ParticleEditKey *ekey, *nekey, *new_ekeys;
+ PTCacheEditKey *ekey, *nekey, *new_ekeys;
int k;
short totnewkey=0;
float endtime;
- for(k=0, ekey=edit->keys[pa_index]; k<pa->totkey-1; k++,ekey++) {
+ for(k=0, ekey=point->keys; k<pa->totkey-1; k++,ekey++) {
if(ekey->flag&PEK_SELECT && (ekey+1)->flag&PEK_SELECT)
totnewkey++;
}
@@ -2056,13 +2070,15 @@ static void subdivide_particle(PEData *data, int pa_index)
pa->flag |= PARS_REKEY;
nkey= new_keys= MEM_callocN((pa->totkey+totnewkey)*(sizeof(HairKey)),"Hair subdivide keys");
- nekey= new_ekeys= MEM_callocN((pa->totkey+totnewkey)*(sizeof(ParticleEditKey)),"Hair subdivide edit keys");
- endtime= pa->hair[pa->totkey-1].time;
+ nekey= new_ekeys= MEM_callocN((pa->totkey+totnewkey)*(sizeof(PTCacheEditKey)),"Hair subdivide edit keys");
+
+ key = pa->hair;
+ endtime= key[pa->totkey-1].time;
- for(k=0, key=pa->hair, ekey=edit->keys[pa_index]; k<pa->totkey-1; k++, key++, ekey++) {
+ for(k=0, ekey=point->keys; k<pa->totkey-1; k++, key++, ekey++) {
memcpy(nkey,key,sizeof(HairKey));
- memcpy(nekey,ekey,sizeof(ParticleEditKey));
+ memcpy(nekey,ekey,sizeof(PTCacheEditKey));
nekey->co= nkey->co;
nekey->time= &nkey->time;
@@ -2073,12 +2089,14 @@ static void subdivide_particle(PEData *data, int pa_index)
if(ekey->flag & PEK_SELECT && (ekey+1)->flag & PEK_SELECT) {
nkey->time= (key->time + (key+1)->time)*0.5f;
state.time= (endtime != 0.0f)? nkey->time/endtime: 0.0f;
- psys_get_particle_on_path(data->scene, data->ob, psys, pa_index, &state, 0);
+ psys_get_particle_on_path(&sim, pa_index, &state, 0);
VECCOPY(nkey->co, state.co);
nekey->co= nkey->co;
nekey->time= &nkey->time;
nekey->flag |= PEK_SELECT;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ nekey->flag |= PEK_USE_WCO;
nekey++;
nkey++;
@@ -2086,7 +2104,7 @@ static void subdivide_particle(PEData *data, int pa_index)
}
/*tip still not copied*/
memcpy(nkey,key,sizeof(HairKey));
- memcpy(nekey,ekey,sizeof(ParticleEditKey));
+ memcpy(nekey,ekey,sizeof(PTCacheEditKey));
nekey->co= nkey->co;
nekey->time= &nkey->time;
@@ -2095,13 +2113,12 @@ static void subdivide_particle(PEData *data, int pa_index)
MEM_freeN(pa->hair);
pa->hair= new_keys;
- if(edit->keys[pa_index])
- MEM_freeN(edit->keys[pa_index]);
-
- edit->keys[pa_index]= new_ekeys;
+ if(point->keys)
+ MEM_freeN(point->keys);
+ point->keys= new_ekeys;
- pa->totkey += totnewkey;
- pa->flag |= PARS_EDIT_RECALC;
+ point->totkey = pa->totkey = pa->totkey + totnewkey;
+ point->flag |= PEP_EDIT_RECALC;
pa->flag &= ~PARS_REKEY;
}
@@ -2110,15 +2127,11 @@ static int subdivide_exec(bContext *C, wmOperator *op)
PEData data;
PE_set_data(C, &data);
- PE_foreach_particle(&data, subdivide_particle);
+ foreach_point(&data, subdivide_particle);
- data.psys->edit->totkeys= psys_count_keys(data.psys);
-
- recalc_lengths(data.psys);
- psys_update_world_cos(data.ob, data.psys);
-
+ recalc_lengths(data.edit);
PE_update_object(data.scene, data.ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, data.ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob);
return OPERATOR_FINISHED;
}
@@ -2143,15 +2156,18 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
ParticleEditSettings *pset=PE_settings(scene);
- ParticleData *pa;
- ParticleEdit *edit;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ ParticleSystem *psys = edit->psys;
ParticleSystemModifierData *psmd;
KDTree *tree;
KDTreeNearest nearest[10];
+ POINT_P;
float mat[4][4], co[3], threshold= RNA_float_get(op->ptr, "threshold");
- int i, n, totn, removed, totpart, flag, totremoved;
+ int n, totn, removed, flag, totremoved;
+
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return OPERATOR_CANCELLED;
edit= psys->edit;
psmd= psys_get_modifier(ob, psys);
@@ -2160,37 +2176,32 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
do {
removed= 0;
- totpart= psys->totpart;
- tree=BLI_kdtree_new(totpart);
+ tree=BLI_kdtree_new(psys->totpart);
/* insert particles into kd tree */
- LOOP_PARTICLES(i, pa) {
- if(particle_is_selected(psys, pa)) {
- psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
- VECCOPY(co, pa->hair[0].co);
- Mat4MulVecfl(mat, co);
- BLI_kdtree_insert(tree, i, co, NULL);
- }
+ LOOP_SELECTED_POINTS {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, psys->particles+p, mat);
+ VECCOPY(co, point->keys->co);
+ Mat4MulVecfl(mat, co);
+ BLI_kdtree_insert(tree, p, co, NULL);
}
BLI_kdtree_balance(tree);
/* tag particles to be removed */
- LOOP_PARTICLES(i, pa) {
- if(particle_is_selected(psys, pa)) {
- psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
- VECCOPY(co, pa->hair[0].co);
- Mat4MulVecfl(mat, co);
+ LOOP_SELECTED_POINTS {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, psys->particles+p, mat);
+ VECCOPY(co, point->keys->co);
+ Mat4MulVecfl(mat, co);
- totn= BLI_kdtree_find_n_nearest(tree,10,co,NULL,nearest);
+ totn= BLI_kdtree_find_n_nearest(tree,10,co,NULL,nearest);
- for(n=0; n<totn; n++) {
- /* this needs a custom threshold still */
- if(nearest[n].index > i && nearest[n].dist < threshold) {
- if(!(pa->flag & PARS_TAG)) {
- pa->flag |= PARS_TAG;
- removed++;
- }
+ for(n=0; n<totn; n++) {
+ /* this needs a custom threshold still */
+ if(nearest[n].index > p && nearest[n].dist < threshold) {
+ if(!(point->flag & PEP_TAG)) {
+ point->flag |= PEP_TAG;
+ removed++;
}
}
}
@@ -2211,9 +2222,9 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
BKE_reportf(op->reports, RPT_INFO, "Remove %d double particles.", totremoved);
- psys_update_world_cos(ob, psys);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
+ PE_update_object(scene, ob, 0);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob);
return OPERATOR_FINISHED;
}
@@ -2272,7 +2283,7 @@ static void toggle_particle_cursor(bContext *C, int enable)
pset->paintcursor = NULL;
}
else if(enable)
- pset->paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), PE_poll, brush_drawcursor, NULL);
+ pset->paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), PE_poll_3dview, brush_drawcursor, NULL);
}
/********************* radial control operator *********************/
@@ -2282,7 +2293,7 @@ static int brush_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *eve
ParticleEditSettings *pset= PE_settings(CTX_data_scene(C));
ParticleBrushData *brush;
int mode = RNA_enum_get(op->ptr, "mode");
- float original_value;
+ float original_value=1.0f;
if(pset->brushtype < 0)
return OPERATOR_CANCELLED;
@@ -2344,7 +2355,7 @@ void PARTICLE_OT_brush_radial_control(wmOperatorType *ot)
ot->poll= PE_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
/*************************** delete operator **************************/
@@ -2358,16 +2369,16 @@ static EnumPropertyItem delete_type_items[]= {
static void set_delete_particle(PEData *data, int pa_index)
{
- ParticleSystem *psys= data->psys;
+ PTCacheEdit *edit= data->edit;
- psys->particles[pa_index].flag |= PARS_TAG;
+ edit->points[pa_index].flag |= PEP_TAG;
}
static void set_delete_particle_key(PEData *data, int pa_index, int key_index)
{
- ParticleSystem *psys= data->psys;
+ PTCacheEdit *edit= data->edit;
- psys->edit->keys[pa_index][key_index].flag |= PEK_TAG;
+ edit->points[pa_index].keys[key_index].flag |= PEK_TAG;
}
static int delete_exec(bContext *C, wmOperator *op)
@@ -2379,17 +2390,19 @@ 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.psys);
- recalc_lengths(data.psys);
+ remove_tagged_keys(data.scene, data.ob, data.edit->psys);
+ recalc_lengths(data.edit);
}
else if(type == DEL_PARTICLE) {
- foreach_selected_particle(&data, set_delete_particle);
- remove_tagged_particles(data.scene, data.ob, data.psys);
- recalc_lengths(data.psys);
+ foreach_selected_point(&data, set_delete_particle);
+ remove_tagged_particles(data.scene, data.ob, data.edit->psys);
+ recalc_lengths(data.edit);
}
- DAG_object_flush_update(data.scene, data.ob, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, data.ob);
+ PE_update_object(data.scene, data.ob, 0);
+
+ DAG_id_flush_update(&data.ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, data.ob);
return OPERATOR_FINISHED;
}
@@ -2403,7 +2416,7 @@ void PARTICLE_OT_delete(wmOperatorType *ot)
/* api callbacks */
ot->exec= delete_exec;
ot->invoke= WM_menu_invoke;
- ot->poll= PE_poll;
+ ot->poll= PE_hair_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2418,15 +2431,18 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
{
Mesh *me= (Mesh*)(ob->data);
ParticleSystemModifierData *psmd;
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ ParticleSystem *psys = edit->psys;
ParticleData *pa, *newpa, *new_pars;
- ParticleEditKey *ekey, **newkey, **key, **new_keys;
+ PTCacheEditPoint *newpoint, *new_points;
+ POINT_P; KEY_K;
HairKey *hkey;
int *mirrorfaces;
- int i, k, rotation, totpart, newtotpart;
+ int rotation, totpart, newtotpart;
+
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return;
- edit= psys->edit;
psmd= psys_get_modifier(ob, psys);
mirrorfaces= mesh_get_x_mirror_faces(ob, NULL);
@@ -2436,29 +2452,28 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
totpart= psys->totpart;
newtotpart= psys->totpart;
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
-
+ LOOP_VISIBLE_POINTS {
+ pa = psys->particles + p;
if(!tagged) {
- if(particle_is_selected(psys, pa)) {
- if(edit->mirror_cache[i] != -1) {
+ if(point_is_selected(point)) {
+ if(edit->mirror_cache[p] != -1) {
/* already has a mirror, don't need to duplicate */
PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
continue;
}
else
- pa->flag |= PARS_TAG;
+ point->flag |= PEP_TAG;
}
}
- if((pa->flag & PARS_TAG) && mirrorfaces[pa->num*2] != -1)
+ if((point->flag & PEP_TAG) && mirrorfaces[pa->num*2] != -1)
newtotpart++;
}
if(newtotpart != psys->totpart) {
/* allocate new arrays and copy existing */
new_pars= MEM_callocN(newtotpart*sizeof(ParticleData), "ParticleData new");
- new_keys= MEM_callocN(newtotpart*sizeof(ParticleEditKey*), "ParticleEditKey new");
+ new_points= MEM_callocN(newtotpart*sizeof(PTCacheEditPoint), "PTCacheEditPoint new");
if(psys->particles) {
memcpy(new_pars, psys->particles, totpart*sizeof(ParticleData));
@@ -2466,36 +2481,34 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
}
psys->particles= new_pars;
- if(edit->keys) {
- memcpy(new_keys, edit->keys, totpart*sizeof(ParticleEditKey*));
- MEM_freeN(edit->keys);
+ if(edit->points) {
+ memcpy(new_points, edit->points, totpart*sizeof(PTCacheEditPoint));
+ MEM_freeN(edit->points);
}
- edit->keys= new_keys;
+ edit->points= new_points;
if(edit->mirror_cache) {
MEM_freeN(edit->mirror_cache);
edit->mirror_cache= NULL;
}
- psys->totpart= newtotpart;
+ edit->totpoint= psys->totpart= newtotpart;
/* create new elements */
- pa= psys->particles;
newpa= psys->particles + totpart;
- key= edit->keys;
- newkey= edit->keys + totpart;
+ newpoint= edit->points + totpart;
- for(i=0; i<totpart; i++, pa++, key++) {
- if(pa->flag & PARS_HIDE) continue;
+ LOOP_VISIBLE_POINTS {
+ pa = psys->particles + p;
- if(!(pa->flag & PARS_TAG) || mirrorfaces[pa->num*2] == -1)
+ if(!(point->flag & PEP_TAG) || mirrorfaces[pa->num*2] == -1)
continue;
/* duplicate */
*newpa= *pa;
+ *newpoint= *point;
if(pa->hair) newpa->hair= MEM_dupallocN(pa->hair);
- if(pa->keys) newpa->keys= MEM_dupallocN(pa->keys);
- if(*key) *newkey= MEM_dupallocN(*key);
+ if(point->keys) newpoint->keys= MEM_dupallocN(point->keys);
/* rotate weights according to vertex index rotation */
rotation= mirrorfaces[pa->num*2+1];
@@ -2514,24 +2527,23 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
newpa->num_dmcache= psys_particle_dm_face_lookup(ob,psmd->dm,newpa->num,newpa->fuv, NULL);
/* update edit key pointers */
- ekey= *newkey;
- for(k=0, hkey=newpa->hair; k<newpa->totkey; k++, hkey++, ekey++) {
- ekey->co= hkey->co;
- ekey->time= &hkey->time;
+ key= newpoint->keys;
+ for(k=0, hkey=newpa->hair; k<newpa->totkey; k++, hkey++, key++) {
+ key->co= hkey->co;
+ key->time= &hkey->time;
}
/* map key positions as mirror over x axis */
PE_mirror_particle(ob, psmd->dm, psys, pa, newpa);
newpa++;
- newkey++;
+ newpoint++;
}
-
- edit->totkeys= psys_count_keys(psys);
}
- for(pa=psys->particles, i=0; i<psys->totpart; i++, pa++)
- pa->flag &= ~PARS_TAG;
+ LOOP_POINTS {
+ point->flag &= ~PEP_TAG;
+ }
MEM_freeN(mirrorfaces);
}
@@ -2540,13 +2552,13 @@ static int mirror_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
+ PTCacheEdit *edit= PE_get_current(scene, ob);
PE_mirror_x(scene, ob, 0);
- psys_update_world_cos(ob, psys);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ update_world_cos(ob, edit);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2571,7 +2583,6 @@ static EnumPropertyItem brush_type_items[]= {
{PE_BRUSH_NONE, "NONE", 0, "None", ""},
{PE_BRUSH_COMB, "COMB", 0, "Comb", ""},
{PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", ""},
- {PE_BRUSH_WEIGHT, "WEIGHT", 0, "Weight", ""},
{PE_BRUSH_ADD, "ADD", 0, "Add", ""},
{PE_BRUSH_LENGTH, "LENGTH", 0, "Length", ""},
{PE_BRUSH_PUFF, "PUFF", 0, "Puff", ""},
@@ -2604,14 +2615,46 @@ void PARTICLE_OT_brush_set(wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", brush_type_items, PE_BRUSH_NONE, "Type", "Brush type to select for editing.");
}
+
+/*********************** set mode operator **********************/
+
+static EnumPropertyItem edit_type_items[]= {
+ {PE_TYPE_PARTICLES, "PARTICLES", 0, "Particles", ""},
+ {PE_TYPE_SOFTBODY, "SOFTBODY", 0, "Soft body", ""},
+ {PE_TYPE_CLOTH, "CLOTH", 0, "Cloth", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int set_edit_mode_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ ParticleEditSettings *pset= PE_settings(scene);
+
+ pset->edittype= RNA_enum_get(op->ptr, "type");
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_edit_type_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Edit Type";
+ ot->idname= "PARTICLE_OT_edit_type_set";
+
+ /* api callbacks */
+ ot->exec= set_edit_mode_exec;
+ ot->invoke= WM_menu_invoke;
+ ot->poll= PE_poll;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", edit_type_items, PE_TYPE_PARTICLES, "Type", "Edit type to select for editing.");
+}
+
/************************* brush edit callbacks ********************/
-static void brush_comb(PEData *data, float mat[][4], float imat[][4], int pa_index, int key_index)
+static void brush_comb(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
ParticleEditSettings *pset= PE_settings(data->scene);
- HairKey *key= pa->hair + key_index;
float cvec[3], fac;
if(pset->flag & PE_LOCK_FIRST && key_index == 0) return;
@@ -2623,19 +2666,19 @@ static void brush_comb(PEData *data, float mat[][4], float imat[][4], int pa_ind
VecMulf(cvec, fac);
VECADD(key->co, key->co, cvec);
- pa->flag |= PARS_EDIT_RECALC;
+ (data->edit->points + point_index)->flag |= PEP_EDIT_RECALC;
}
static void brush_cut(PEData *data, int pa_index)
{
- ParticleSystem *psys= data->psys;
+ PTCacheEdit *edit = data->edit;
ARegion *ar= data->vc.ar;
Object *ob= data->ob;
- ParticleData *pa= &psys->particles[pa_index];
- ParticleCacheKey *key= psys->pathcache[pa_index];
+ ParticleEditSettings *pset= PE_settings(data->scene);
+ ParticleCacheKey *key= edit->pathcache[pa_index];
float rad2, cut_time= 1.0;
float x0, x1, v0, v1, o0, o1, xo0, xo1, d, dv;
- int k, cut, keys= (int)pow(2.0, (double)psys->part->draw_step);
+ int k, cut, keys= (int)pow(2.0, (double)pset->draw_step);
short vertco[2];
/* blunt scissors */
@@ -2710,93 +2753,97 @@ static void brush_cut(PEData *data, int pa_index)
if(cut) {
if(cut_time < 0.0f) {
- pa->flag |= PARS_TAG;
+ edit->points[pa_index].flag |= PEP_TAG;
}
else {
rekey_particle_to_time(data->scene, ob, pa_index, cut_time);
- pa->flag |= PARS_EDIT_RECALC;
+ edit->points[pa_index].flag |= PEP_EDIT_RECALC;
}
}
}
-static void brush_length(PEData *data, int pa_index)
+static void brush_length(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
- HairKey *key;
+ PTCacheEdit *edit= data->edit;
+ PTCacheEditPoint *point = edit->points + point_index;
+ KEY_K;
float dvec[3],pvec[3];
- int k;
- key= pa->hair;
- VECCOPY(pvec,key->co);
-
- for(k=1, key++; k<pa->totkey; k++,key++) {
- VECSUB(dvec,key->co,pvec);
- VECCOPY(pvec,key->co);
- VecMulf(dvec,data->growfac);
- VECADD(key->co,(key-1)->co,dvec);
+ LOOP_KEYS {
+ if(k==0) {
+ VECCOPY(pvec,key->co);
+ }
+ else {
+ VECSUB(dvec,key->co,pvec);
+ VECCOPY(pvec,key->co);
+ VecMulf(dvec,data->growfac);
+ VECADD(key->co,(key-1)->co,dvec);
+ }
}
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
-static void brush_puff(PEData *data, int pa_index)
+static void brush_puff(PEData *data, int point_index)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
- ParticleEdit *edit= psys->edit;
- HairKey *key;
+ PTCacheEdit *edit = data->edit;
+ ParticleSystem *psys = edit->psys;
+ PTCacheEditPoint *point = edit->points + point_index;
+ KEY_K;
float mat[4][4], imat[4][4];
float lastco[3], rootco[3], co[3], nor[3], kco[3], dco[3], fac, length;
- int k;
-
- psys_mat_hair_to_global(data->ob, data->dm, psys->part->from, pa, mat);
- Mat4Invert(imat,mat);
- /* find root coordinate and normal on emitter */
- key= pa->hair;
- VECCOPY(co, key->co);
- Mat4MulVecfl(mat, co);
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
+ psys_mat_hair_to_global(data->ob, data->dm, psys->part->from, psys->particles + point_index, mat);
+ Mat4Invert(imat,mat);
+ }
+ else {
+ Mat4One(mat);
+ Mat4One(imat);
+ }
- pa_index= BLI_kdtree_find_nearest(edit->emitter_field, co, NULL, NULL);
- if(pa_index == -1) return;
+ LOOP_KEYS {
+ if(k==0) {
+ /* find root coordinate and normal on emitter */
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
- VECCOPY(rootco, co);
- VecCopyf(nor, &psys->edit->emitter_cosnos[pa_index*6+3]);
- Normalize(nor);
- length= 0.0f;
+ point_index= BLI_kdtree_find_nearest(edit->emitter_field, co, NULL, NULL);
+ if(point_index == -1) return;
- fac= (float)pow((double)(1.0f - data->dist / data->rad), (double)data->pufffac);
- fac *= 0.025f;
- if(data->invert)
- fac= -fac;
+ VECCOPY(rootco, co);
+ VecCopyf(nor, &edit->emitter_cosnos[point_index*6+3]);
+ Normalize(nor);
+ length= 0.0f;
- for(k=1, key++; k<pa->totkey; k++, key++) {
- /* compute position as if hair was standing up straight */
- VECCOPY(lastco, co);
- VECCOPY(co, key->co);
- Mat4MulVecfl(mat, co);
- length += VecLenf(lastco, co);
+ fac= (float)pow((double)(1.0f - data->dist / data->rad), (double)data->pufffac);
+ fac *= 0.025f;
+ if(data->invert)
+ fac= -fac;
+ }
+ else {
+ /* compute position as if hair was standing up straight */
+ VECCOPY(lastco, co);
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ length += VecLenf(lastco, co);
- VECADDFAC(kco, rootco, nor, length);
+ VECADDFAC(kco, rootco, nor, length);
- /* blend between the current and straight position */
- VECSUB(dco, kco, co);
- VECADDFAC(co, co, dco, fac);
+ /* blend between the current and straight position */
+ VECSUB(dco, kco, co);
+ VECADDFAC(co, co, dco, fac);
- VECCOPY(key->co, co);
- Mat4MulVecfl(imat, key->co);
+ VECCOPY(key->co, co);
+ Mat4MulVecfl(imat, key->co);
+ }
}
- pa->flag |= PARS_EDIT_RECALC;
+ point->flag |= PEP_EDIT_RECALC;
}
-static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int pa_index, int key_index)
-{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
- HairKey *key= pa->hair + key_index;
-
+static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+{
if(key_index) {
float dvec[3];
@@ -2807,11 +2854,8 @@ 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 pa_index, int key_index)
+static void brush_smooth_do(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
- ParticleSystem *psys= data->psys;
- ParticleData *pa= &psys->particles[pa_index];
- HairKey *key= pa->hair + key_index;
float vec[3], dvec[3];
if(key_index) {
@@ -2826,28 +2870,32 @@ static void brush_smooth_do(PEData *data, float mat[][4], float imat[][4], int p
VECADD(key->co,key->co,dvec);
}
- pa->flag |= PARS_EDIT_RECALC;
+ (data->edit->points + point_index)->flag |= PEP_EDIT_RECALC;
}
static void brush_add(PEData *data, short number)
{
Scene *scene= data->scene;
Object *ob= data->ob;
- ParticleSystem *psys= data->psys;
+ PTCacheEdit *edit = data->edit;
+ 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};
ParticleEditSettings *pset= PE_settings(scene);
- ParticleEdit *edit= psys->edit;
int i, k, n= 0, totpart= psys->totpart;
short mco[2];
short dmx= 0, dmy= 0;
float co1[3], co2[3], min_d, imat[4][4];
- float framestep, timestep= psys_get_timestep(psys->part);
+ float framestep, timestep= psys_get_timestep(&sim);
short size= pset->brush[PE_BRUSH_ADD].size;
short size2= size*size;
DerivedMesh *dm=0;
Mat4Invert(imat,ob->obmat);
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
BLI_srandom(psys->seed+data->mval[0]+data->mval[1]);
/* painting onto the deformed mesh, could be an option? */
@@ -2884,19 +2932,20 @@ static void brush_add(PEData *data, short number)
float hairmat[4][4], cur_co[3];
KDTree *tree=0;
ParticleData *pa, *new_pars= MEM_callocN(newtotpart*sizeof(ParticleData),"ParticleData new");
- ParticleEditKey *ekey, **key, **new_keys= MEM_callocN(newtotpart*sizeof(ParticleEditKey *),"ParticleEditKey array new");
+ PTCacheEditPoint *point, *new_points= MEM_callocN(newtotpart*sizeof(PTCacheEditPoint),"PTCacheEditPoint array new");
+ PTCacheEditKey *key;
HairKey *hkey;
/* save existing elements */
memcpy(new_pars, psys->particles, totpart * sizeof(ParticleData));
- memcpy(new_keys, edit->keys, totpart * sizeof(ParticleEditKey*));
+ memcpy(new_points, edit->points, totpart * sizeof(PTCacheEditPoint));
/* change old arrays to new ones */
if(psys->particles) MEM_freeN(psys->particles);
psys->particles= new_pars;
- if(edit->keys) MEM_freeN(edit->keys);
- edit->keys= new_keys;
+ if(edit->points) MEM_freeN(edit->points);
+ edit->points= new_points;
if(edit->mirror_cache) {
MEM_freeN(edit->mirror_cache);
@@ -2915,29 +2964,29 @@ static void brush_add(PEData *data, short number)
BLI_kdtree_balance(tree);
}
- psys->totpart= newtotpart;
+ edit->totpoint= psys->totpart= newtotpart;
/* create new elements */
pa= psys->particles + totpart;
- key= edit->keys + totpart;
+ point= edit->points + totpart;
- for(i=totpart; i<newtotpart; i++, pa++, key++) {
+ for(i=totpart; i<newtotpart; i++, pa++, point++) {
memcpy(pa, add_pars + i - totpart, sizeof(ParticleData));
pa->hair= MEM_callocN(pset->totaddkey * sizeof(HairKey), "BakeKey key add");
- ekey= *key= MEM_callocN(pset->totaddkey * sizeof(ParticleEditKey), "ParticleEditKey add");
- pa->totkey= pset->totaddkey;
+ key= point->keys= MEM_callocN(pset->totaddkey * sizeof(PTCacheEditKey), "PTCacheEditKey add");
+ point->totkey= pa->totkey= pset->totaddkey;
- for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, ekey++) {
- ekey->co= hkey->co;
- ekey->time= &hkey->time;
+ for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, key++) {
+ key->co= hkey->co;
+ key->time= &hkey->time;
}
pa->size= 1.0f;
- initialize_particle(pa,i,ob,psys,psmd);
- reset_particle(scene, pa,psys,psmd,ob,0.0,1.0,0,0,0);
- pa->flag |= PARS_EDIT_RECALC;
+ initialize_particle(&sim, pa,i);
+ reset_particle(&sim, pa, 0.0, 1.0);
+ point->flag |= PEP_EDIT_RECALC;
if(pset->flag & PE_X_MIRROR)
- pa->flag |= PARS_TAG; /* signal for duplicate */
+ point->flag |= PEP_TAG; /* signal for duplicate */
framestep= pa->lifetime/(float)(pset->totaddkey-1);
@@ -2967,22 +3016,22 @@ static void brush_add(PEData *data, short number)
weight[w] /= totw;
for(k=0; k<pset->totaddkey; k++) {
- hkey= pa->hair + k;
+ hkey= (HairKey*)pa->hair + k;
hkey->time= pa->time + k * framestep;
key[0].time= hkey->time/ 100.0f;
- psys_get_particle_on_path(scene, ob, psys, ptn[0].index, key, 0);
+ psys_get_particle_on_path(&sim, ptn[0].index, key, 0);
VecMulf(key[0].co, weight[0]);
if(maxw>1) {
key[1].time= key[0].time;
- psys_get_particle_on_path(scene, ob, psys, ptn[1].index, key + 1, 0);
+ psys_get_particle_on_path(&sim, ptn[1].index, key + 1, 0);
VecMulf(key[1].co, weight[1]);
VECADD(key[0].co, key[0].co, key[1].co);
if(maxw>2) {
key[2].time= key[0].time;
- psys_get_particle_on_path(scene, ob, psys, ptn[2].index, key + 2, 0);
+ psys_get_particle_on_path(&sim, ptn[2].index, key + 2, 0);
VecMulf(key[2].co, weight[2]);
VECADD(key[0].co, key[0].co, key[2].co);
}
@@ -2991,15 +3040,15 @@ static void brush_add(PEData *data, short number)
if(k==0)
VECSUB(co1, pa->state.co, key[0].co);
- VECADD(pa->hair[k].co, key[0].co, co1);
+ VECADD(hkey->co, key[0].co, co1);
- pa->hair[k].time= key[0].time;
+ hkey->time= key[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);
- pa->hair[k].time += k * framestep;
+ hkey->time += k * framestep;
}
}
for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
@@ -3008,7 +3057,6 @@ static void brush_add(PEData *data, short number)
Mat4MulVecfl(imat, hkey->co);
}
}
- edit->totkeys= psys_count_keys(psys);
if(tree)
BLI_kdtree_free(tree);
@@ -3020,25 +3068,12 @@ static void brush_add(PEData *data, short number)
dm->release(dm);
}
-static void brush_weight(PEData *data, float mat[][4], float imat[][4], int pa_index, int key_index)
-{
- ParticleSystem *psys= data->psys;
- ParticleData *pa;
-
- /* roots have full weight allways */
- if(key_index) {
- pa= &psys->particles[pa_index];
- pa->hair[key_index].weight= data->weightfac;
- pa->flag |= PARS_EDIT_RECALC;
- }
-}
-
/************************* brush edit operator ********************/
typedef struct BrushEdit {
Scene *scene;
Object *ob;
- ParticleSystem *psys;
+ PTCacheEdit *edit;
int first;
int lastmouse[2];
@@ -3048,8 +3083,8 @@ static int brush_edit_init(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
ParticleEditSettings *pset= PE_settings(scene);
+ PTCacheEdit *edit= PE_get_current(scene, ob);
ARegion *ar= CTX_wm_region(C);
BrushEdit *bedit;
@@ -3064,7 +3099,7 @@ static int brush_edit_init(bContext *C, wmOperator *op)
bedit->scene= scene;
bedit->ob= ob;
- bedit->psys= psys;
+ bedit->edit= edit;
return 1;
}
@@ -3074,16 +3109,22 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
BrushEdit *bedit= op->customdata;
Scene *scene= bedit->scene;
Object *ob= bedit->ob;
- ParticleSystem *psys= bedit->psys;
+ PTCacheEdit *edit= bedit->edit;
ParticleEditSettings *pset= PE_settings(scene);
- ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys);
+ ParticleSystemModifierData *psmd= edit->psys ? psys_get_modifier(ob, edit->psys) : NULL;
ParticleBrushData *brush= &pset->brush[pset->brushtype];
ARegion *ar= CTX_wm_region(C);
- float vec1[3], vec2[3];
+ float vec[3], mousef[2];
short mval[2], mvalo[2];
int flip, mouse[2], dx, dy, removed= 0, selected= 0;
+ int lock_root = pset->flag & PE_LOCK_FIRST;
- RNA_int_get_array(itemptr, "mouse", mouse);
+ if(!PE_start_edit(edit))
+ return;
+
+ RNA_float_get_array(itemptr, "mouse", mousef);
+ mouse[0] = mousef[0];
+ mouse[1] = mousef[1];
flip= RNA_boolean_get(itemptr, "flip");
if(bedit->first) {
@@ -3100,12 +3141,16 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
mvalo[0]= bedit->lastmouse[0];
mvalo[1]= bedit->lastmouse[1];
+ /* disable locking temporatily for disconnected hair */
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
+ pset->flag &= ~PE_LOCK_FIRST;
+
if(((pset->brushtype == PE_BRUSH_ADD) ?
(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
|| bedit->first) {
view3d_operator_needs_opengl(C);
- selected= (short)count_selected_keys(scene, psys);
+ selected= (short)count_selected_keys(scene, edit);
switch(pset->brushtype) {
case PE_BRUSH_COMB:
@@ -3124,10 +3169,8 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
Mat4Invert(ob->imat, ob->obmat);
- window_to_3d(ar, vec1, mvalo[0], mvalo[1]);
- window_to_3d(ar, vec2, mval[0], mval[1]);
- VECSUB(vec1, vec2, vec1);
- data.dvec= vec1;
+ window_to_3d_delta(ar, vec, dx, dy);
+ data.dvec= vec;
foreach_mouse_hit_key(&data, brush_comb, selected);
break;
@@ -3135,20 +3178,22 @@ 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= (float)(brush->strength / 100.0f);
- PE_set_view3d_data(C, &data);
- data.mval= mval;
- data.rad= (float)brush->size;
- data.cutfac= (float)(brush->strength / 100.0f);
-
- if(selected)
- foreach_selected_particle(&data, brush_cut);
- else
- PE_foreach_particle(&data, brush_cut);
+ if(selected)
+ foreach_selected_point(&data, brush_cut);
+ else
+ foreach_point(&data, brush_cut);
- removed= remove_tagged_particles(scene, ob, psys);
- if(pset->flag & PE_KEEP_LENGTHS)
- recalc_lengths(psys);
+ removed= remove_tagged_particles(scene, ob, edit->psys);
+ if(pset->flag & PE_KEEP_LENGTHS)
+ recalc_lengths(edit);
+ }
break;
}
case PE_BRUSH_LENGTH:
@@ -3166,61 +3211,50 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
else
data.growfac= 1.0f + data.growfac;
- foreach_mouse_hit_particle(&data, brush_length, selected);
+ foreach_mouse_hit_point(&data, brush_length, selected);
if(pset->flag & PE_KEEP_LENGTHS)
- recalc_lengths(psys);
+ recalc_lengths(edit);
break;
}
case PE_BRUSH_PUFF:
{
PEData data;
- PE_set_view3d_data(C, &data);
- data.dm= psmd->dm;
- data.mval= mval;
- data.rad= (float)brush->size;
+ if(edit->psys) {
+ PE_set_view3d_data(C, &data);
+ data.dm= psmd->dm;
+ data.mval= mval;
+ data.rad= (float)brush->size;
- data.pufffac= (float)(brush->strength - 50) / 50.0f;
- if(data.pufffac < 0.0f)
- data.pufffac= 1.0f - 9.0f * data.pufffac;
- else
- data.pufffac= 1.0f - data.pufffac;
+ data.pufffac= (float)(brush->strength - 50) / 50.0f;
+ if(data.pufffac < 0.0f)
+ data.pufffac= 1.0f - 9.0f * data.pufffac;
+ else
+ data.pufffac= 1.0f - data.pufffac;
- data.invert= (brush->invert ^ flip);
- Mat4Invert(ob->imat, ob->obmat);
+ data.invert= (brush->invert ^ flip);
+ Mat4Invert(ob->imat, ob->obmat);
- foreach_mouse_hit_particle(&data, brush_puff, selected);
+ foreach_mouse_hit_point(&data, brush_puff, selected);
+ }
break;
}
case PE_BRUSH_ADD:
{
PEData data;
- if(psys->part->from==PART_FROM_FACE) {
+ if(edit->psys && edit->psys->part->from==PART_FROM_FACE) {
PE_set_view3d_data(C, &data);
data.mval= mval;
brush_add(&data, brush->strength);
if(pset->flag & PE_KEEP_LENGTHS)
- recalc_lengths(psys);
+ recalc_lengths(edit);
}
break;
}
- case PE_BRUSH_WEIGHT:
- {
- PEData data;
-
- PE_set_view3d_data(C, &data);
- data.mval= mval;
- data.rad= (float)brush->size;
-
- data.weightfac= (float)(brush->strength / 100.0f);
-
- foreach_mouse_hit_key(&data, brush_weight, selected);
- break;
- }
case PE_BRUSH_SMOOTH:
{
PEData data;
@@ -3247,25 +3281,27 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
}
if((pset->flag & PE_KEEP_LENGTHS)==0)
- recalc_lengths(psys);
+ recalc_lengths(edit);
if(pset->brushtype == PE_BRUSH_ADD || removed) {
if(pset->brushtype == PE_BRUSH_ADD && (pset->flag & PE_X_MIRROR))
PE_mirror_x(scene, ob, 1);
- psys_update_world_cos(ob,psys);
- psys_free_path_cache(psys);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ update_world_cos(ob,edit);
+ psys_free_path_cache(NULL, edit);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else
PE_update_object(scene, ob, 1);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_SELECT, ob);
bedit->lastmouse[0]= mouse[0];
bedit->lastmouse[1]= mouse[1];
bedit->first= 0;
}
+
+ pset->flag |= lock_root;
}
static void brush_edit_exit(bContext *C, wmOperator *op)
@@ -3294,7 +3330,7 @@ static void brush_edit_apply_event(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
PointerRNA itemptr;
- int mouse[2];
+ float mouse[2];
mouse[0]= event->x - ar->winrct.xmin;
mouse[1]= event->y - ar->winrct.ymin;
@@ -3302,7 +3338,7 @@ static void brush_edit_apply_event(bContext *C, wmOperator *op, wmEvent *event)
/* fill in stroke */
RNA_collection_add(op->ptr, "stroke", &itemptr);
- RNA_int_set_array(&itemptr, "mouse", mouse);
+ RNA_float_set_array(&itemptr, "mouse", mouse);
RNA_boolean_set(&itemptr, "flip", event->shift != 0); // XXX hardcoded
/* apply */
@@ -3316,7 +3352,7 @@ static int brush_edit_invoke(bContext *C, wmOperator *op, wmEvent *event)
brush_edit_apply_event(C, op, event);
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -3358,7 +3394,7 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot)
ot->poll= PE_poll_3dview;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* properties */
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
@@ -3366,104 +3402,161 @@ void PARTICLE_OT_brush_edit(wmOperatorType *ot)
/*********************** undo ***************************/
-static void free_ParticleUndo(ParticleUndo *undo)
+static void free_PTCacheUndo(PTCacheUndo *undo)
{
- ParticleData *pa;
+ PTCacheEditPoint *point;
int i;
- for(i=0, pa=undo->particles; i<undo->totpart; i++, pa++) {
- if(pa->hair)
- MEM_freeN(pa->hair);
- if(undo->keys[i])
- MEM_freeN(undo->keys[i]);
+ for(i=0, point=undo->points; i<undo->totpoint; i++, point++) {
+ if(undo->particles && (undo->particles + i)->hair)
+ MEM_freeN((undo->particles + i)->hair);
+ if(point->keys)
+ MEM_freeN(point->keys);
}
- if(undo->keys)
- MEM_freeN(undo->keys);
+ if(undo->points)
+ MEM_freeN(undo->points);
if(undo->particles)
MEM_freeN(undo->particles);
- //if(undo->emitter_cosnos)
- // MEM_freeN(undo->emitter_cosnos);
+ BKE_ptcache_free_mem(&undo->mem_cache);
}
-static void make_ParticleUndo(ParticleSystem *psys, ParticleUndo *undo)
+static void make_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
{
- ParticleData *pa,*upa;
+ PTCacheEditPoint *point;
int i;
- undo->totpart= psys->totpart;
- undo->totkeys= psys->edit->totkeys;
+ undo->totpoint= edit->totpoint;
- upa= undo->particles= MEM_dupallocN(psys->particles);
- undo->keys= MEM_dupallocN(psys->edit->keys);
-
- for(i=0, pa=psys->particles; i<undo->totpart; i++, pa++, upa++) {
- upa->hair= MEM_dupallocN(pa->hair);
- undo->keys[i]= MEM_dupallocN(psys->edit->keys[i]);
+ if(edit->psys) {
+ ParticleData *pa;
+
+ pa= undo->particles= MEM_dupallocN(edit->psys->particles);
+
+ for(i=0; i<edit->totpoint; i++, pa++)
+ pa->hair= MEM_dupallocN(pa->hair);
+
+ undo->psys_flag = edit->psys->flag;
+ }
+ else {
+ PTCacheMem *pm;
+
+ BLI_duplicatelist(&undo->mem_cache, &edit->pid.cache->mem_cache);
+ pm = undo->mem_cache.first;
+
+ for(; pm; pm=pm->next) {
+ for(i=0; i<BPHYS_TOT_DATA; i++)
+ pm->data[i] = MEM_dupallocN(pm->data[i]);
+ }
+ }
+
+ point= undo->points = MEM_dupallocN(edit->points);
+ undo->totpoint = edit->totpoint;
+
+ for(i=0; i<edit->totpoint; i++, point++) {
+ point->keys= MEM_dupallocN(point->keys);
/* no need to update edit key->co & key->time pointers here */
}
}
-static void get_ParticleUndo(ParticleSystem *psys, ParticleUndo *undo)
+static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
{
- ParticleData *pa, *upa;
- ParticleEditKey *key;
+ ParticleSystem *psys = edit->psys;
+ ParticleData *pa;
HairKey *hkey;
- int i, k, totpart= psys->totpart;
+ POINT_P; KEY_K;
- LOOP_PARTICLES(i, pa) {
- if(pa->hair)
- MEM_freeN(pa->hair);
+ LOOP_POINTS {
+ if(psys && psys->particles[p].hair)
+ MEM_freeN(psys->particles[p].hair);
- if(psys->edit->keys[i])
- MEM_freeN(psys->edit->keys[i]);
+ if(point->keys)
+ MEM_freeN(point->keys);
}
- if(psys->particles)
+ if(psys && psys->particles)
MEM_freeN(psys->particles);
- if(psys->edit->keys)
- MEM_freeN(psys->edit->keys);
- if(psys->edit->mirror_cache) {
- MEM_freeN(psys->edit->mirror_cache);
- psys->edit->mirror_cache= NULL;
+ if(edit->points)
+ MEM_freeN(edit->points);
+ if(edit->mirror_cache) {
+ MEM_freeN(edit->mirror_cache);
+ edit->mirror_cache= NULL;
}
- pa= psys->particles= MEM_dupallocN(undo->particles);
- psys->edit->keys= MEM_dupallocN(undo->keys);
+ edit->points= MEM_dupallocN(undo->points);
+ edit->totpoint = undo->totpoint;
+
+ LOOP_POINTS {
+ point->keys= MEM_dupallocN(point->keys);
+ }
+
+ if(psys) {
+ psys->particles= MEM_dupallocN(undo->particles);
+
+ psys->totpart= undo->totpoint;
- for(i=0,upa=undo->particles; i<undo->totpart; i++, upa++, pa++) {
- hkey= pa->hair= MEM_dupallocN(upa->hair);
- key= psys->edit->keys[i]= MEM_dupallocN(undo->keys[i]);
- for(k=0; k<pa->totkey; k++, hkey++, key++) {
- key->co= hkey->co;
- key->time= &hkey->time;
+ LOOP_POINTS {
+ pa = psys->particles + p;
+ hkey= pa->hair = MEM_dupallocN(pa->hair);
+
+ LOOP_KEYS {
+ key->co= hkey->co;
+ key->time= &hkey->time;
+ hkey++;
+ }
}
+
+ psys->flag = undo->psys_flag;
}
+ else {
+ PTCacheMem *pm;
+ int i;
+
+ BKE_ptcache_free_mem(&edit->pid.cache->mem_cache);
+
+ BLI_duplicatelist(&edit->pid.cache->mem_cache, &undo->mem_cache);
- psys->totpart= undo->totpart;
- psys->edit->totkeys= undo->totkeys;
+ pm = edit->pid.cache->mem_cache.first;
+
+ for(; pm; pm=pm->next) {
+ for(i=0; i<BPHYS_TOT_DATA; i++)
+ pm->data[i] = MEM_dupallocN(pm->data[i]);
+
+ BKE_ptcache_mem_init_pointers(pm);
+
+ LOOP_POINTS {
+ LOOP_KEYS {
+ if((int)key->ftime == pm->frame) {
+ key->co = pm->cur[BPHYS_DATA_LOCATION];
+ key->vel = pm->cur[BPHYS_DATA_VELOCITY];
+ key->rot = pm->cur[BPHYS_DATA_ROTATION];
+ key->time = &key->ftime;
+ }
+ }
+ BKE_ptcache_mem_incr_pointers(pm);
+ }
+ }
+ }
}
void PE_undo_push(Scene *scene, char *str)
{
- ParticleSystem *psys= PE_get_current(scene, OBACT);
- ParticleEdit *edit= 0;
- ParticleUndo *undo;
+ PTCacheEdit *edit= PE_get_current(scene, OBACT);
+ PTCacheUndo *undo;
int nr;
- if(!PE_can_edit(psys)) return;
- edit= psys->edit;
+ if(!edit) return;
/* remove all undos after (also when curundo==NULL) */
while(edit->undo.last != edit->curundo) {
undo= edit->undo.last;
BLI_remlink(&edit->undo, undo);
- free_ParticleUndo(undo);
+ free_PTCacheUndo(undo);
MEM_freeN(undo);
}
/* make new */
- edit->curundo= undo= MEM_callocN(sizeof(ParticleUndo), "particle undo file");
+ edit->curundo= undo= MEM_callocN(sizeof(PTCacheUndo), "particle undo file");
strncpy(undo->name, str, 64-1);
BLI_addtail(&edit->undo, undo);
@@ -3477,27 +3570,25 @@ void PE_undo_push(Scene *scene, char *str)
}
if(undo) {
while(edit->undo.first!=undo) {
- ParticleUndo *first= edit->undo.first;
+ PTCacheUndo *first= edit->undo.first;
BLI_remlink(&edit->undo, first);
- free_ParticleUndo(first);
+ free_PTCacheUndo(first);
MEM_freeN(first);
}
}
/* copy */
- make_ParticleUndo(psys,edit->curundo);
+ make_PTCacheUndo(edit,edit->curundo);
}
void PE_undo_step(Scene *scene, int step)
{
- ParticleSystem *psys= PE_get_current(scene, OBACT);
- ParticleEdit *edit= 0;
+ PTCacheEdit *edit= PE_get_current(scene, OBACT);
- if(!PE_can_edit(psys)) return;
- edit= psys->edit;
+ if(!edit) return;
if(step==0) {
- get_ParticleUndo(psys,edit->curundo);
+ get_PTCacheUndo(edit,edit->curundo);
}
else if(step==1) {
@@ -3505,7 +3596,7 @@ void PE_undo_step(Scene *scene, int step)
else {
if(G.f & G_DEBUG) printf("undo %s\n", edit->curundo->name);
edit->curundo= edit->curundo->prev;
- get_ParticleUndo(psys, edit->curundo);
+ get_PTCacheUndo(edit, edit->curundo);
}
}
else {
@@ -3513,18 +3604,19 @@ void PE_undo_step(Scene *scene, int step)
if(edit->curundo==NULL || edit->curundo->next==NULL);
else {
- get_ParticleUndo(psys, edit->curundo->next);
+ get_PTCacheUndo(edit, edit->curundo->next);
edit->curundo= edit->curundo->next;
if(G.f & G_DEBUG) printf("redo %s\n", edit->curundo->name);
}
}
- DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
+ PE_update_object(scene, OBACT, 0);
+ DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
}
-static void ParticleUndo_number(Scene *scene, ParticleEdit *edit, int nr)
+static void PTCacheUndo_number(Scene *scene, PTCacheEdit *edit, int nr)
{
- ParticleUndo *undo;
+ PTCacheUndo *undo;
int a=1;
for(undo= edit->undo.first; undo; undo= undo->next, a++) {
@@ -3534,20 +3626,15 @@ static void ParticleUndo_number(Scene *scene, ParticleEdit *edit, int nr)
PE_undo_step(scene, 0);
}
-static void ParticleUndo_clear(ParticleSystem *psys)
+static void PTCacheUndo_clear(PTCacheEdit *edit)
{
- ParticleUndo *undo;
- ParticleEdit *edit;
-
- if(psys==0) return;
-
- edit= psys->edit;
+ PTCacheUndo *undo;
if(edit==0) return;
undo= edit->undo.first;
while(undo) {
- free_ParticleUndo(undo);
+ free_PTCacheUndo(undo);
undo= undo->next;
}
BLI_freelistN(&edit->undo);
@@ -3566,15 +3653,13 @@ void PE_redo(Scene *scene)
void PE_undo_menu(Scene *scene, Object *ob)
{
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleEdit *edit= 0;
- ParticleUndo *undo;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ PTCacheUndo *undo;
DynStr *ds;
- short event;
+ short event=0;
char *menu;
- if(!PE_can_edit(psys)) return;
- edit= psys->edit;
+ if(!edit) return;
ds= BLI_dynstr_new();
@@ -3591,7 +3676,7 @@ void PE_undo_menu(Scene *scene, Object *ob)
// XXX event= pupmenu_col(menu, 20);
MEM_freeN(menu);
- if(event>0) ParticleUndo_number(scene, edit,event);
+ if(event>0) PTCacheUndo_number(scene, edit, event);
}
/************************ utilities ******************************/
@@ -3599,30 +3684,29 @@ void PE_undo_menu(Scene *scene, Object *ob)
int PE_minmax(Scene *scene, float *min, float *max)
{
Object *ob= OBACT;
- ParticleSystem *psys= PE_get_current(scene, ob);
- ParticleSystemModifierData *psmd;
- ParticleData *pa;
- ParticleEditKey *key;
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd = NULL;
+ POINT_P; KEY_K;
float co[3], mat[4][4];
- int i, k, totpart, ok= 0;
+ int ok= 0;
- if(!PE_can_edit(psys)) return ok;
+ if(!edit) return ok;
- psmd= psys_get_modifier(ob, psys);
- totpart= psys->totpart;
-
- LOOP_PARTICLES(i, pa) {
- if(pa->flag & PARS_HIDE) continue;
+ if(psys)
+ psmd= psys_get_modifier(ob, psys);
+ else
+ Mat4One(mat);
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+ LOOP_VISIBLE_POINTS {
+ if(psys)
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles+p, mat);
- LOOP_KEYS(k, key) {
- if(key->flag & PEK_SELECT) {
- VECCOPY(co, key->co);
- Mat4MulVecfl(mat, co);
- DO_MINMAX(co, min, max);
- ok= 1;
- }
+ LOOP_SELECTED_KEYS {
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ DO_MINMAX(co, min, max);
+ ok= 1;
}
}
@@ -3637,56 +3721,107 @@ int PE_minmax(Scene *scene, float *min, float *max)
/************************ particle edit toggle operator ************************/
/* initialize needed data for bake edit */
-static void PE_create_particle_edit(Scene *scene, Object *ob, ParticleSystem *psys)
+static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache, ParticleSystem *psys)
{
- ParticleEdit *edit= psys->edit;
- ParticleData *pa;
- ParticleEditKey *key;
+ PTCacheEdit *edit= psys ? psys->edit : cache->edit;
+ POINT_P; KEY_K;
+ ParticleData *pa = NULL;
HairKey *hkey;
- int i, k, totpart= psys->totpart, alloc=1;
+ int totpoint;
- if((psys->flag & PSYS_EDITED)==0)
+ if(!psys && !cache)
return;
- if(edit) {
- int newtotkeys= psys_count_keys(psys);
+ if(cache && cache->flag & PTCACHE_DISK_CACHE)
+ return;
- if(newtotkeys == edit->totkeys)
- alloc=0;
- }
+ if(!edit) {
+ totpoint = psys ? psys->totpart : ((PTCacheMem*)cache->mem_cache.first)->totpoint;
- if(alloc) {
- if(edit) {
- printf("ParticleEdit exists already! Poke jahka!");
- PE_free_particle_edit(psys);
- }
+ edit= MEM_callocN(sizeof(PTCacheEdit), "PE_create_particle_edit");
+ edit->points=MEM_callocN(totpoint*sizeof(PTCacheEditPoint),"PTCacheEditPoints");
+ edit->totpoint = totpoint;
- edit= psys->edit=MEM_callocN(sizeof(ParticleEdit), "PE_create_particle_edit");
- psys->free_edit= PE_free_particle_edit;
+ if(psys && !cache) {
+ psys->edit= edit;
+ edit->psys = psys;
- edit->keys=MEM_callocN(totpart*sizeof(ParticleEditKey*),"ParticleEditKey array");
+ psys->free_edit= PE_free_ptcache_edit;
- LOOP_PARTICLES(i, pa) {
- key= edit->keys[i]= MEM_callocN(pa->totkey*sizeof(ParticleEditKey),"ParticleEditKeys");
- for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, key++) {
- key->co= hkey->co;
- key->time= &hkey->time;
- key->flag= hkey->editflag;
+ edit->pathcache = NULL;
+ edit->pathcachebufs.first = edit->pathcachebufs.last = NULL;
+
+ pa = psys->particles;
+ LOOP_POINTS {
+ point->totkey = pa->totkey;
+ point->keys= MEM_callocN(point->totkey*sizeof(PTCacheEditKey),"ParticleEditKeys");
+ point->flag |= PEP_EDIT_RECALC;
+
+ hkey = pa->hair;
+ LOOP_KEYS {
+ key->co= hkey->co;
+ key->time= &hkey->time;
+ key->flag= hkey->editflag;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ key->flag |= PEK_USE_WCO;
+ hkey++;
+ }
+ pa++;
}
}
+ else {
+ PTCacheMem *pm;
+ int totframe=0;
+
+ cache->edit= edit;
+ cache->free_edit= PE_free_ptcache_edit;
+ edit->psys = NULL;
+
+ for(pm=cache->mem_cache.first; pm; pm=pm->next)
+ totframe++;
+
+ for(pm=cache->mem_cache.first; pm; pm=pm->next) {
+ BKE_ptcache_mem_init_pointers(pm);
+
+ LOOP_POINTS {
+ if(psys) {
+ 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(!point->totkey) {
+ key = point->keys = MEM_callocN(totframe*sizeof(PTCacheEditKey),"ParticleEditKeys");
+ point->flag |= PEP_EDIT_RECALC;
+ }
+ else
+ key = point->keys + point->totkey;
+
+ key->co = pm->cur[BPHYS_DATA_LOCATION];
+ key->vel = pm->cur[BPHYS_DATA_VELOCITY];
+ key->rot = pm->cur[BPHYS_DATA_ROTATION];
+ key->ftime = (float)pm->frame;
+ key->time = &key->ftime;
+ BKE_ptcache_mem_incr_pointers(pm);
- edit->totkeys= psys_count_keys(psys);
+ point->totkey++;
+ }
+ }
+ psys = NULL;
+ }
UI_GetThemeColor3ubv(TH_EDGE_SELECT, edit->sel_col);
UI_GetThemeColor3ubv(TH_WIRE, edit->nosel_col);
- }
- recalc_lengths(psys);
- recalc_emitter_field(ob, psys);
- psys_update_world_cos(ob, psys);
+ recalc_lengths(edit);
+ if(psys && !cache)
+ recalc_emitter_field(ob, psys);
+ PE_update_object(scene, ob, 1);
- if(alloc) {
- ParticleUndo_clear(psys);
+ PTCacheUndo_clear(edit);
PE_undo_push(scene, "Original");
}
}
@@ -3699,41 +3834,25 @@ static int particle_edit_toggle_poll(bContext *C)
if(!scene || !ob || ob->id.lib)
return 0;
- return (ob->particlesystem.first != NULL);
+ return (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody));
}
static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
-
- if(psys==NULL) {
- psys= ob->particlesystem.first;
- psys->flag |= PSYS_CURRENT;
- }
-
- if(!(G.f & G_PARTICLEEDIT)) {
- if(psys && psys->part->type == PART_HAIR && psys->flag & PSYS_EDITED) {
- if(psys_check_enabled(ob, psys)) {
- if(psys->edit==NULL)
- PE_create_particle_edit(scene, ob, psys);
-
- psys_update_world_cos(ob, psys);
- }
- }
- G.f |= G_PARTICLEEDIT;
+ if(!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
+ ob->mode |= OB_MODE_PARTICLE_EDIT;
toggle_particle_cursor(C, 1);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_PARTICLE, NULL);
}
else {
- G.f &= ~G_PARTICLEEDIT;
+ ob->mode &= ~OB_MODE_PARTICLE_EDIT;
toggle_particle_cursor(C, 0);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -3755,93 +3874,44 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot)
/************************ set editable operator ************************/
-static int set_editable_exec(bContext *C, wmOperator *op)
+static int clear_edited_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- ParticleSystem *psys= PE_get_current(scene, ob);
+ ParticleSystem *psys = psys_get_current(ob);
- if(psys->flag & PSYS_EDITED) {
- if(1) { // XXX okee("Lose changes done in particle mode?")) {
- if(psys->edit)
- PE_free_particle_edit(psys);
+ if(psys->edit) {
+ if(psys->edit->edited || 1) { // XXX okee("Lose changes done in particle mode?"))
+ PE_free_ptcache_edit(psys->edit);
+
+ psys->edit = NULL;
+ psys->free_edit = NULL;
- psys->flag &= ~PSYS_EDITED;
psys->recalc |= PSYS_RECALC_RESET;
+ psys->flag &= ~PSYS_GLOBAL_HAIR;
+ psys->flag &= ~PSYS_EDITED;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ psys_reset(psys, PSYS_RESET_DEPSGRAPH);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
- else {
- if(psys_check_enabled(ob, psys)) {
- psys->flag |= PSYS_EDITED;
-
- if(G.f & G_PARTICLEEDIT)
- PE_create_particle_edit(scene, ob, psys);
- }
- else
- BKE_report(op->reports, RPT_ERROR, "Particle system not enabled, skipping set editable");
- }
return OPERATOR_FINISHED;
}
-void PARTICLE_OT_editable_set(wmOperatorType *ot)
+void PARTICLE_OT_edited_clear(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Set Editable";
- ot->idname= "PARTICLE_OT_editable_set";
+ ot->name= "Clear Edited";
+ ot->idname= "PARTICLE_OT_edited_clear";
/* api callbacks */
- ot->exec= set_editable_exec;
+ ot->exec= clear_edited_exec;
ot->poll= particle_edit_toggle_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/*********************** change active **************************/
-
-void PE_change_act(void *ob_v, void *act_v)
-{
- Scene *scene= NULL; // XXX
- Object *ob= ob_v;
- ParticleSystem *psys;
- short act= *((short*)act_v) - 1;
-
- if((psys=psys_get_current(ob)))
- psys->flag &= ~PSYS_CURRENT;
-
- if(act>=0) {
- if((psys=BLI_findlink(&ob->particlesystem,act))) {
- psys->flag |= PSYS_CURRENT;
-
- if(psys_check_enabled(ob, psys)) {
- if(G.f & G_PARTICLEEDIT && !psys->edit)
- PE_create_particle_edit(scene, ob, psys);
- psys_update_world_cos(ob, psys);
- }
- }
- }
-}
-
-void PE_change_act_psys(Scene *scene, Object *ob, ParticleSystem *psys)
-{
- ParticleSystem *p;
-
- if((p=psys_get_current(ob)))
- p->flag &= ~PSYS_CURRENT;
-
- psys->flag |= PSYS_CURRENT;
-
- if(psys_check_enabled(ob, psys)) {
- if(G.f & G_PARTICLEEDIT && !psys->edit)
- PE_create_particle_edit(scene, ob, psys);
-
- psys_update_world_cos(ob, psys);
- }
-}
-
/*********************** specials menu **************************/
static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -3875,7 +3945,7 @@ void PARTICLE_OT_specials_menu(wmOperatorType *ot)
/* api callbacks */
ot->invoke= specials_menu_invoke;
- ot->poll= PE_poll;
+ ot->poll= PE_hair_poll;
}
/**************************** registration **********************************/
@@ -3905,12 +3975,15 @@ void ED_operatortypes_particle(void)
WM_operatortype_append(PARTICLE_OT_specials_menu);
WM_operatortype_append(PARTICLE_OT_particle_edit_toggle);
- WM_operatortype_append(PARTICLE_OT_editable_set);
+ WM_operatortype_append(PARTICLE_OT_edited_clear);
}
void ED_keymap_particle(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Particle", 0, 0);
+ wmKeyMap *keymap;
+
+ keymap= WM_keymap_find(wm, "Particle", 0, 0);
+ keymap->poll= PE_poll;
WM_keymap_add_item(keymap, "PARTICLE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PARTICLE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/physics/physics_boids.c b/source/blender/editors/physics/physics_boids.c
new file mode 100644
index 00000000000..148359068ad
--- /dev/null
+++ b/source/blender/editors/physics/physics_boids.c
@@ -0,0 +1,430 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Janne Karhu.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+//#include <stdlib.h>
+//#include <string.h>
+//
+#include "MEM_guardedalloc.h"
+
+#include "DNA_boid_types.h"
+#include "DNA_particle_types.h"
+//#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+//#include "DNA_material_types.h"
+//#include "DNA_texture_types.h"
+#include "DNA_scene_types.h"
+//#include "DNA_world_types.h"
+
+#include "BKE_boids.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+//#include "BKE_font.h"
+//#include "BKE_library.h"
+//#include "BKE_main.h"
+//#include "BKE_material.h"
+#include "BKE_particle.h"
+//#include "BKE_texture.h"
+//#include "BKE_utildefines.h"
+//#include "BKE_world.h"
+
+//#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+//
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+//#include "ED_curve.h"
+//#include "ED_mesh.h"
+//
+//#include "buttons_intern.h" // own include
+
+/************************ add/del boid rule operators *********************/
+static int boidrule_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob= ptr.id.data;
+ ParticleSettings *part;
+ int type= RNA_enum_get(op->ptr, "type");
+
+ BoidRule *rule;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ part = psys->part;
+
+ state = boid_get_current_state(part->boids);
+
+
+ for(rule=state->rules.first; rule; rule=rule->next)
+ rule->flag &= ~BOIDRULE_CURRENT;
+
+ rule = boid_new_rule(type);
+ rule->flag |= BOIDRULE_CURRENT;
+
+ BLI_addtail(&state->rules, rule);
+
+ psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidrule_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Boid Rule";
+ ot->description = "Add a boid rule to the current boid state.";
+ ot->idname= "BOID_OT_boidrule_add";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= boidrule_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", boidrule_type_items, 0, "Type", "");
+}
+static int boidrule_del_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ BoidRule *rule;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ state = boid_get_current_state(psys->part->boids);
+
+
+ for(rule=state->rules.first; rule; rule=rule->next) {
+ if(rule->flag & BOIDRULE_CURRENT) {
+ BLI_remlink(&state->rules, rule);
+ MEM_freeN(rule);
+ break;
+ }
+
+ }
+ rule = state->rules.first;
+
+ if(rule)
+ rule->flag |= BOIDRULE_CURRENT;
+
+ DAG_scene_sort(scene);
+ psys_flush_particle_settings(scene, psys->part, PSYS_RECALC_RESET);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidrule_del(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Boid Rule";
+ ot->idname= "BOID_OT_boidrule_del";
+
+ /* api callbacks */
+ ot->exec= boidrule_del_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move up/down boid rule operators *********************/
+static int boidrule_move_up_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ BoidRule *rule;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ state = boid_get_current_state(psys->part->boids);
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ if(rule->flag & BOIDRULE_CURRENT && rule->prev) {
+ BLI_remlink(&state->rules, rule);
+ BLI_insertlink(&state->rules, rule->prev->prev, rule);
+
+ psys_flush_particle_settings(scene, psys->part, PSYS_RECALC_RESET);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidrule_move_up(wmOperatorType *ot)
+{
+ ot->name= "Move Up Boid Rule";
+ ot->description= "Move boid rule up in the list.";
+ ot->idname= "BOID_OT_boidrule_move_up";
+
+ ot->exec= boidrule_move_up_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int boidrule_move_down_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ BoidRule *rule;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ state = boid_get_current_state(psys->part->boids);
+ for(rule = state->rules.first; rule; rule=rule->next) {
+ if(rule->flag & BOIDRULE_CURRENT && rule->next) {
+ BLI_remlink(&state->rules, rule);
+ BLI_insertlink(&state->rules, rule->next, rule);
+
+ psys_flush_particle_settings(scene, psys->part, PSYS_RECALC_RESET);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidrule_move_down(wmOperatorType *ot)
+{
+ ot->name= "Move Down Boid Rule";
+ ot->description= "Move boid rule down in the list.";
+ ot->idname= "BOID_OT_boidrule_move_down";
+
+ ot->exec= boidrule_move_down_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+/************************ add/del boid state operators *********************/
+static int boidstate_add_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob= ptr.id.data;
+ ParticleSettings *part;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ part = psys->part;
+
+ for(state=part->boids->states.first; state; state=state->next)
+ state->flag &= ~BOIDSTATE_CURRENT;
+
+ state = boid_new_state(part->boids);
+ state->flag |= BOIDSTATE_CURRENT;
+
+ BLI_addtail(&part->boids->states, state);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidstate_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Boid State";
+ ot->description = "Add a boid state to the particle system.";
+ ot->idname= "BOID_OT_boidstate_add";
+
+ /* api callbacks */
+ ot->exec= boidstate_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+static int boidstate_del_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ ParticleSettings *part;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ part = psys->part;
+
+ for(state=part->boids->states.first; state; state=state->next) {
+ if(state->flag & BOIDSTATE_CURRENT) {
+ BLI_remlink(&part->boids->states, state);
+ MEM_freeN(state);
+ break;
+ }
+
+ }
+
+ /* there must be at least one state */
+ if(!part->boids->states.first) {
+ state = boid_new_state(part->boids);
+ BLI_addtail(&part->boids->states, state);
+ }
+ else
+ state = part->boids->states.first;
+
+ state->flag |= BOIDSTATE_CURRENT;
+
+ DAG_scene_sort(scene);
+ psys_flush_particle_settings(scene, psys->part, PSYS_RECALC_RESET);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidstate_del(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Boid State";
+ ot->idname= "BOID_OT_boidstate_del";
+
+ /* api callbacks */
+ ot->exec= boidstate_del_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move up/down boid state operators *********************/
+static int boidstate_move_up_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ BoidSettings *boids;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ boids = psys->part->boids;
+
+ for(state = boids->states.first; state; state=state->next) {
+ if(state->flag & BOIDSTATE_CURRENT && state->prev) {
+ BLI_remlink(&boids->states, state);
+ BLI_insertlink(&boids->states, state->prev->prev, state);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidstate_move_up(wmOperatorType *ot)
+{
+ ot->name= "Move Up Boid State";
+ ot->description= "Move boid state up in the list.";
+ ot->idname= "BOID_OT_boidstate_move_up";
+
+ ot->exec= boidstate_move_up_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int boidstate_move_down_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ BoidSettings *boids;
+ BoidState *state;
+
+ if(!psys || !psys->part || psys->part->phystype != PART_PHYS_BOIDS)
+ return OPERATOR_CANCELLED;
+
+ boids = psys->part->boids;
+
+ for(state = boids->states.first; state; state=state->next) {
+ if(state->flag & BOIDSTATE_CURRENT && state->next) {
+ BLI_remlink(&boids->states, state);
+ BLI_insertlink(&boids->states, state->next, state);
+ psys_flush_particle_settings(scene, psys->part, PSYS_RECALC_RESET);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void BOID_OT_boidstate_move_down(wmOperatorType *ot)
+{
+ ot->name= "Move Down Boid State";
+ ot->description= "Move boid state down in the list.";
+ ot->idname= "BOID_OT_boidstate_move_down";
+
+ ot->exec= boidstate_move_down_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/*******************************************************************************/
+void ED_operatortypes_boids(void)
+{
+ WM_operatortype_append(BOID_OT_boidrule_add);
+ WM_operatortype_append(BOID_OT_boidrule_del);
+ WM_operatortype_append(BOID_OT_boidrule_move_up);
+ WM_operatortype_append(BOID_OT_boidrule_move_down);
+
+ WM_operatortype_append(BOID_OT_boidstate_add);
+ WM_operatortype_append(BOID_OT_boidstate_del);
+ WM_operatortype_append(BOID_OT_boidstate_move_up);
+ WM_operatortype_append(BOID_OT_boidstate_move_down);
+}
diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c
index 1efa5108b96..7a4cc1c7865 100644
--- a/source/blender/editors/preview/previewrender.c
+++ b/source/blender/editors/preview/previewrender.c
@@ -88,7 +88,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_anim_api.h"
#include "ED_previewrender.h"
#include "ED_view3d.h"
@@ -112,6 +111,8 @@ typedef struct ShaderPreview {
Scene *scene;
ID *id;
+ ID *parent;
+ MTex *slot;
int sizex, sizey;
int *pr_rect;
@@ -273,11 +274,10 @@ static Object *find_object(ListBase *lb, const char *name)
/* 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, int id_type, ShaderPreview *sp)
+static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
{
Scene *sce;
Base *base;
- ID *id= sp?sp->id:NULL;
if(pr_main==NULL) return NULL;
@@ -293,6 +293,7 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp
sce->world->range= scene->world->range;
}
+ sce->r.color_mgt_flag = scene->r.color_mgt_flag;
sce->r.cfra= scene->r.cfra;
if(id_type==ID_MA) {
@@ -303,7 +304,11 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp
end_render_material(mat);
/* turn on raytracing if needed */
- if(mat->mode_l & (MA_RAYTRANSP|MA_RAYMIRROR))
+ if(mat->mode_l & MA_RAYMIRROR)
+ sce->r.mode |= R_RAYTRACE;
+ if(mat->material_type == MA_TYPE_VOLUME)
+ 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)
sce->r.mode |= R_SSS;
@@ -343,8 +348,14 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp
for(base= sce->base.first; base; base= base->next) {
if(base->object->id.name[2]=='p') {
- if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL))
- assign_material(base->object, mat, base->object->actcol);
+ 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);
+ int actcol= MAX2(base->object->actcol > 0, 1) - 1;
+
+ if(matar && actcol < base->object->totcol)
+ (*matar)[actcol]= mat;
+ }
}
}
}
@@ -353,11 +364,18 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp
sce->lay= 1<<MA_TEXTURE;
+ /* exception: don't color manage texture previews */
+ sce->r.color_mgt_flag &= ~R_COLOR_MANAGEMENT;
+
for(base= sce->base.first; base; base= base->next) {
if(base->object->id.name[2]=='t') {
Material *mat= give_current_material(base->object, base->object->actcol);
if(mat && mat->mtex[0]) {
mat->mtex[0]->tex= tex;
+
+ if(sp && sp->slot)
+ mat->mtex[0]->which_output = sp->slot->which_output;
+
/* show alpha in this case */
if(tex==NULL || (tex->flag & TEX_PRV_ALPHA)) {
mat->mtex[0]->mapto |= MAP_ALPHA;
@@ -404,35 +422,80 @@ static Scene *preview_prepare_scene(Scene *scene, int id_type, ShaderPreview *sp
return NULL;
}
-
/* new UI convention: draw is in pixel space already. */
/* uses ROUNDBOX button in block to get the rect */
-void ED_preview_draw(const bContext *C, void *idp, rcti *rect)
+static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int first, rcti *rect, rcti *newrect)
+{
+ RenderResult rres;
+ char name[32];
+ int 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(!split || first) sprintf(name, "Preview %p", sa);
+ else sprintf(name, "SecondPreview %p", sa);
+
+ if(split) {
+ if(first) {
+ offx= 0;
+ newx= newx/2;
+ }
+ else {
+ offx= newx/2;
+ newx= newx - newx/2;
+ }
+ }
+
+ RE_GetResultImage(RE_GetRender(name), &rres);
+
+ if(rres.rectf) {
+
+ if(ABS(rres.rectx-newx)<2 && ABS(rres.recty-newy)<2) {
+ newrect->xmax= MAX2(newrect->xmax, rect->xmin + rres.rectx + offx);
+ newrect->ymax= MAX2(newrect->ymax, rect->ymin + rres.recty);
+
+ glPushMatrix();
+ glTranslatef(offx, 0, 0);
+ glaDrawPixelsSafe_to32(rect->xmin, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, gamma_correct);
+ glPopMatrix();
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, rcti *rect)
{
if(idp) {
ScrArea *sa= CTX_wm_area(C);
+ Scene *sce = CTX_data_scene(C);
+ ID *id = (ID *)idp;
+ ID *parent= (ID *)parentp;
+ MTex *slot= (MTex *)slotp;
SpaceButs *sbuts= sa->spacedata.first;
- RenderResult rres;
+ rcti newrect;
+ int ok;
int newx= rect->xmax-rect->xmin, newy= rect->ymax-rect->ymin;
- int ok= 0;
- char name[32];
-
- sprintf(name, "Preview %p", sa);
- BLI_lock_malloc_thread();
- RE_GetResultImage(RE_GetRender(name), &rres);
- if(rres.rectf) {
-
- if( ABS(rres.rectx-newx)<2 && ABS(rres.recty-newy)<2 ) {
- /* correct size, then black outline matches */
- rect->xmax= rect->xmin + rres.rectx;
- rect->ymax= rect->ymin + rres.recty;
-
- glaDrawPixelsSafe(rect->xmin, rect->ymin, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_FLOAT, rres.rectf);
- ok= 1;
- }
+ newrect.xmin= rect->xmin;
+ newrect.xmax= rect->xmin;
+ newrect.ymin= rect->ymin;
+ newrect.ymax= rect->ymin;
+
+ if(parent) {
+ ok = ed_preview_draw_rect(sa, sce, parent, 1, 1, rect, &newrect);
+ ok &= ed_preview_draw_rect(sa, sce, id, 1, 0, rect, &newrect);
}
- BLI_unlock_malloc_thread();
+ else
+ ok = ed_preview_draw_rect(sa, sce, id, 0, 0, rect, &newrect);
+
+ if(ok)
+ *rect= newrect;
/* check for spacetype... */
if(sbuts->spacetype==SPACE_BUTS && sbuts->preview) {
@@ -441,7 +504,7 @@ void ED_preview_draw(const bContext *C, void *idp, rcti *rect)
}
if(ok==0) {
- ED_preview_shader_job(C, sa, idp, newx, newy);
+ ED_preview_shader_job(C, sa, id, parent, slot, newx, newy);
}
}
}
@@ -453,7 +516,7 @@ void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect)
// ScrArea *sa= NULL; // XXX
// View3D *v3d= NULL; // XXX
RenderLayer *rl;
- int ofsx, ofsy;
+ int ofsx=0, ofsy=0;
if(renrect) return;
@@ -468,7 +531,7 @@ void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect)
glDrawBuffer(GL_FRONT);
// glaDefine2DArea(&sa->winrct);
- glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf);
+ glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf, 0);
bglFlush();
glDrawBuffer(GL_BACK);
@@ -572,11 +635,10 @@ void BIF_view3d_previewrender_clear(ScrArea *sa)
/* afterqueue call */
void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
{
- bContext *C= NULL;
View3D *v3d= sa->spacedata.first;
RegionView3D *rv3d= NULL; // XXX
Render *re;
- RenderInfo *ri; /* preview struct! */
+ RenderInfo *ri=NULL; /* preview struct! */
RenderStats *rstats;
RenderData rdata;
rctf viewplane;
@@ -672,7 +734,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
/* database can have created render-resol data... */
if(rstats->convertdone)
- ED_anim_dag_flush_update(C); // <--- only current scene XXX
+ DAG_scene_flush_update(scene, scene->lay, 0);
//printf("dbase update\n");
}
@@ -782,23 +844,20 @@ static void shader_preview_updatejob(void *spv)
}
-/* runs inside thread for material, in foreground for icons */
-static void shader_preview_startjob(void *customdata, short *stop, short *do_update)
+static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int first)
{
- ShaderPreview *sp= customdata;
Render *re;
Scene *sce;
float oldlens;
- char name [32];
+ char name[32];
+ int sizex;
- sp->stop= stop;
- sp->do_update= do_update;
-
/* get the stuff from the builtin preview dbase */
- sce= preview_prepare_scene(sp->scene, GS(sp->id->name), sp);
+ sce= preview_prepare_scene(sp->scene, id, GS(id->name), sp); // XXX sizex
if(sce==NULL) return;
- sprintf(name, "Preview %p", sp->owner);
+ if(!split || first) sprintf(name, "Preview %p", sp->owner);
+ else sprintf(name, "SecondPreview %p", sp->owner);
re= RE_GetRender(name);
/* full refreshed render from first tile */
@@ -816,8 +875,15 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
sce->r.scemode |= R_NO_IMAGE_LOAD;
}
+ /* in case of split preview, use border render */
+ if(split) {
+ if(first) sizex= sp->sizex/2;
+ else sizex= sp->sizex - sp->sizex/2;
+ }
+ else sizex= sp->sizex;
+
/* allocates or re-uses render result */
- RE_InitState(re, NULL, &sce->r, sp->sizex, sp->sizey, NULL);
+ RE_InitState(re, NULL, &sce->r, sizex, sp->sizey, NULL);
/* callbacs are cleared on GetRender() */
if(sp->pr_method==PR_DO_RENDER) {
@@ -826,8 +892,8 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
}
/* lens adjust */
oldlens= ((Camera *)sce->camera->data)->lens;
- if(sp->sizex > sp->sizey)
- ((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sp->sizex;
+ if(sizex > sp->sizey)
+ ((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sizex;
/* entire cycle for render engine */
RE_SetCamera(re, sce->camera);
@@ -836,12 +902,11 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
RE_Database_Free(re);
((Camera *)sce->camera->data)->lens= oldlens;
- *do_update= 1;
/* handle results */
if(sp->pr_method==PR_ICON_RENDER) {
if(sp->pr_rect)
- RE_ResultGet32(re, sp->pr_rect);
+ RE_ResultGet32(re, (unsigned int *)sp->pr_rect);
}
else {
/* validate owner */
@@ -851,8 +916,25 @@ static void shader_preview_startjob(void *customdata, short *stop, short *do_upd
}
/* unassign the pointers, reset vars */
- preview_prepare_scene(sp->scene, GS(sp->id->name), NULL);
+ preview_prepare_scene(sp->scene, NULL, GS(id->name), NULL);
+}
+
+/* runs inside thread for material, in foreground for icons */
+static void shader_preview_startjob(void *customdata, short *stop, short *do_update)
+{
+ ShaderPreview *sp= customdata;
+
+ sp->stop= stop;
+ sp->do_update= do_update;
+
+ if(sp->parent) {
+ shader_preview_render(sp, sp->parent, 1, 1);
+ shader_preview_render(sp, sp->id, 1, 0);
+ }
+ else
+ shader_preview_render(sp, sp->id, 0, 0);
+ *do_update= 1;
}
static void shader_preview_free(void *customdata)
@@ -862,7 +944,7 @@ static void shader_preview_free(void *customdata)
MEM_freeN(sp);
}
-void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, int sizey)
+void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, MTex *slot, int sizex, int sizey)
{
wmJob *steve;
ShaderPreview *sp;
@@ -870,7 +952,11 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, in
/* XXX ugly global still, but we can't do preview while rendering */
if(G.rendering)
return;
-
+
+ if(GS(id->name) == ID_TE) {
+ ntreeTexSetPreviewFlag(1);
+ }
+
steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner);
sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
@@ -881,6 +967,8 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, in
sp->sizey= sizey;
sp->pr_method= PR_DO_RENDER;
sp->id = id;
+ sp->parent= parent;
+ sp->slot= slot;
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
@@ -894,17 +982,19 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, int sizex, in
}
/* rect should be allocated, sizex/sizy pixels, 32 bits */
-void ED_preview_iconrender(Scene *scene, ID *id, int *rect, int sizex, int sizey)
+void ED_preview_iconrender(Scene *scene, ID *id, unsigned int *rect, int sizex, int sizey)
{
- ShaderPreview *sp= MEM_callocN(sizeof(ShaderPreview), "ShaderPreview");
+ ShaderPreview *sp;
short stop=0, do_update=0;
+
+ sp= MEM_callocN(sizeof(ShaderPreview), "ShaderPreview");
/* customdata for preview thread */
sp->scene= scene;
sp->sizex= sizex;
sp->sizey= sizey;
sp->pr_method= PR_ICON_RENDER;
- sp->pr_rect= rect;
+ sp->pr_rect= (int *)rect; /* shouldnt pr_rect be unsigned int also? - Campbell */
sp->id = id;
shader_preview_startjob(sp, &stop, &do_update);
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 4ed1e59a87f..ad7770e12fa 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -30,51 +30,49 @@
FILE(GLOB SRC */*.c)
SET(INC ../../windowmanager
- ../../editors/include
- ../../../../intern/guardedalloc ../../../../intern/memutil
- ../../blenlib ../../makesdna ../../makesrna ../../blenkernel
- ../../include ../../imbuf
- ../../render/extern/include ../../../../intern/bsp/extern
- ../../radiosity/extern/include
- ../../../intern/decimation/extern ../../blenloader
- ../../../kernel/gen_system ../../../../intern/SoundSystem ../../readstreamglue
- ../../quicktime ../../../../intern/elbeem/extern
- ../../../../intern/ghost ../../../../intern/opennl/extern
- ../../nodes
- ${SDL_INC}
+ ../../editors/include
+ ../../../../intern/guardedalloc ../../../../intern/memutil
+ ../../blenlib ../../makesdna ../../makesrna ../../blenkernel
+ ../../include ../../imbuf
+ ../../render/extern/include ../../../../intern/bsp/extern
+ ../../../intern/decimation/extern ../../blenloader
+ ../../../kernel/gen_system ../../readstreamglue
+ ../../../../intern/elbeem/extern
+ ../../../../intern/ghost ../../../../intern/opennl/extern
+ ../../nodes
)
IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
+ ADD_DEFINITIONS(-DINTERNATIONAL)
ENDIF(WITH_INTERNATIONAL)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
IF(WITH_PYTHON)
- SET(INC ${INC} ../../python ${PYTHON_INC})
+ SET(INC ${INC} ../../python ${PYTHON_INC})
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
+ SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
# TODO buildinfo
IF(BF_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
+ ADD_DEFINITIONS(-DNAN_BUILDINFO)
ENDIF(BF_BUILDINFO)
BLENDERLIB_NOLIST(bf_editors "${SRC}" "${INC}")
diff --git a/source/blender/editors/screen/Makefile b/source/blender/editors/screen/Makefile
index 923a020afcf..00698917be5 100644
--- a/source/blender/editors/screen/Makefile
+++ b/source/blender/editors/screen/Makefile
@@ -54,3 +54,8 @@ CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
# own include
CPPFLAGS += -I../include
+
+ifeq ($(WITH_OPENEXR), true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
+
diff --git a/source/blender/editors/screen/SConscript b/source/blender/editors/screen/SConscript
index 3972efd8eed..a4f73cfea7e 100644
--- a/source/blender/editors/screen/SConscript
+++ b/source/blender/editors/screen/SConscript
@@ -12,5 +12,7 @@ defs = ''
if not env['WITH_BF_PYTHON']:
defs += 'DISABLE_PYTHON'
+if env['WITH_BF_OPENEXR']:
+ defs += ' WITH_OPENEXR'
env.BlenderLib ( 'bf_editors_screen', sources, Split(incs), Split(defs), libtype=['core'], priority=[105] )
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 535e99ccfef..87901d75494 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -159,14 +159,8 @@ void ED_area_overdraw_flush(bContext *C, ScrArea *sa, ARegion *ar)
for(az= sa->actionzones.first; az; az= az->next) {
int xs, ys;
- if(az->type==AZONE_AREA) {
- xs= (az->x1+az->x2)/2;
- ys= (az->y1+az->y2)/2;
- }
- else {
- xs= az->x3;
- ys= az->y3;
- }
+ xs= (az->x1+az->x2)/2;
+ ys= (az->y1+az->y2)/2;
/* test if inside */
if(BLI_in_rcti(&ar->winrct, xs, ys)) {
@@ -196,25 +190,42 @@ static void area_draw_azone(short x1, short y1, short x2, short y2)
fdrawline(xmin, ymax-2*dy+1, xmax-2*dx+1, ymin);
}
+
static void region_draw_azone(ScrArea *sa, AZone *az)
{
- if(az->ar==NULL) return;
+ GLUquadricObj *qobj = gluNewQuadric();
+ short midx = az->x1 + (az->x2 - az->x1)/2;
+ short midy = az->y1 + (az->y2 - az->y1)/2;
- UI_SetTheme(sa->spacetype, az->ar->type->regionid);
+ if(az->ar==NULL) return;
- UI_ThemeColor(TH_BACK);
- glBegin(GL_TRIANGLES);
- glVertex2s(az->x1, az->y1);
- glVertex2s(az->x2, az->y2);
- glVertex2s(az->x3, az->y3);
- glEnd();
+ /* only display action zone icons when the region is hidden */
+ if (!(az->ar->flag & RGN_FLAG_HIDDEN)) return;
- UI_ThemeColorShade(TH_BACK, 50);
- sdrawline(az->x1, az->y1, az->x3, az->y3);
+ glPushMatrix();
+ glTranslatef(midx, midy, 0.);
- UI_ThemeColorShade(TH_BACK, -50);
- sdrawline(az->x2, az->y2, az->x3, az->y3);
+ /* outlined circle */
+ glEnable(GL_LINE_SMOOTH);
+
+ glColor4f(1.f, 1.f, 1.f, 0.8f);
+
+ gluQuadricDrawStyle(qobj, GLU_FILL);
+ gluDisk( qobj, 0.0, 4.25f, 16, 1);
+ glColor4f(0.2f, 0.2f, 0.2f, 0.9f);
+
+ gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
+ gluDisk( qobj, 0.0, 4.25f, 16, 1);
+
+ glDisable(GL_LINE_SMOOTH);
+
+ glPopMatrix();
+ gluDeleteQuadric(qobj);
+
+ /* + */
+ sdrawline(midx, midy-2, midx, midy+3);
+ sdrawline(midx-2, midy, midx+3, midy);
}
@@ -235,10 +246,11 @@ void ED_area_overdraw(bContext *C)
AZone *az;
for(az= sa->actionzones.first; az; az= az->next) {
if(az->do_draw) {
- if(az->type==AZONE_AREA)
+ if(az->type==AZONE_AREA) {
area_draw_azone(az->x1, az->y1, az->x2, az->y2);
- else if(az->type==AZONE_REGION)
+ } else if(az->type==AZONE_REGION) {
region_draw_azone(sa, az);
+ }
az->do_draw= 0;
}
@@ -249,7 +261,7 @@ void ED_area_overdraw(bContext *C)
}
/* get scissor rect, checking overlapping regions */
-static void region_scissor_winrct(ARegion *ar, rcti *winrct)
+void region_scissor_winrct(ARegion *ar, rcti *winrct)
{
*winrct= ar->winrct;
@@ -261,6 +273,7 @@ static void region_scissor_winrct(ARegion *ar, rcti *winrct)
if(BLI_isect_rcti(winrct, &ar->winrct, NULL)) {
if(ar->flag & RGN_FLAG_HIDDEN);
+ else if(ar->alignment & RGN_SPLIT_PREV);
else if(ar->alignment==RGN_OVERLAP_LEFT) {
winrct->xmin= ar->winrct.xmax + 1;
}
@@ -273,6 +286,28 @@ static void region_scissor_winrct(ARegion *ar, rcti *winrct)
}
/* only exported for WM */
+/* makes region ready for drawing, sets pixelspace */
+void ED_region_set(const bContext *C, ARegion *ar)
+{
+ wmWindow *win= CTX_wm_window(C);
+ ScrArea *sa= CTX_wm_area(C);
+ rcti winrct;
+
+ /* checks other overlapping regions */
+ region_scissor_winrct(ar, &winrct);
+
+ ar->drawrct= winrct;
+
+ /* note; this sets state, so we can use wmOrtho and friends */
+ wmSubWindowScissorSet(win, ar->swinid, &ar->drawrct);
+
+ UI_SetTheme(sa?sa->spacetype:0, ar->type?ar->type->regionid:0);
+
+ ED_region_pixelspace(ar);
+}
+
+
+/* only exported for WM */
void ED_region_do_draw(bContext *C, ARegion *ar)
{
wmWindow *win= CTX_wm_window(C);
@@ -307,7 +342,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
UI_ThemeColor(TH_TEXT);
- BLF_draw_default(20, 6, 0.0f, ar->headerstr);
+ BLF_draw_default(20, 8, 0.0f, ar->headerstr);
}
else if(at->draw) {
at->draw(C, ar);
@@ -426,72 +461,103 @@ static void area_azone_initialize(ScrArea *sa)
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
-static void region_azone_initialize(ScrArea *sa, ARegion *ar, char edge)
+#define AZONEPAD_EDGE 4
+#define AZONEPAD_ICON 8
+static void region_azone_edge(AZone *az, ARegion *ar)
{
- AZone *az, *azt;
-
- az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
- BLI_addtail(&(sa->actionzones), az);
- az->type= AZONE_REGION;
- az->ar= ar;
- az->edge= edge;
-
- if(edge=='t') {
- az->x1= ar->winrct.xmin+AZONESPOT;
- az->y1= ar->winrct.ymax;
- az->x2= ar->winrct.xmin+2*AZONESPOT;
+ if(az->edge=='t') {
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymax - AZONEPAD_EDGE;
+ az->x2= ar->winrct.xmax;
az->y2= ar->winrct.ymax;
- az->x3= (az->x1+az->x2)/2;
- az->y3= az->y2+AZONESPOT/2;
- BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y3);
}
- else if(edge=='b') {
- az->x1= ar->winrct.xmin+AZONESPOT;
- az->y1= ar->winrct.ymin;
- az->x2= ar->winrct.xmin+2*AZONESPOT;
+ else if(az->edge=='b') {
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymin + AZONEPAD_EDGE;
+ az->x2= ar->winrct.xmax;
az->y2= ar->winrct.ymin;
- az->x3= (az->x1+az->x2)/2;
- az->y3= az->y2-AZONESPOT/2;
- BLI_init_rcti(&az->rect, az->x1, az->x2, az->y3, az->y1);
}
- else if(edge=='l') {
+ else if(az->edge=='l') {
az->x1= ar->winrct.xmin;
- az->y1= ar->winrct.ymax-AZONESPOT;
- az->x2= ar->winrct.xmin;
- az->y2= ar->winrct.ymax-2*AZONESPOT;
- az->x3= az->x2-AZONESPOT/2;
- az->y3= (az->y1+az->y2)/2;
- BLI_init_rcti(&az->rect, az->x3, az->x1, az->y1, az->y2);
+ az->y1= ar->winrct.ymin;
+ az->x2= ar->winrct.xmin + AZONEPAD_EDGE;
+ az->y2= ar->winrct.ymax;
}
- else { // if(edge=='r') {
+ else { // if(az->edge=='r') {
az->x1= ar->winrct.xmax;
- az->y1= ar->winrct.ymax-AZONESPOT;
- az->x2= ar->winrct.xmax;
- az->y2= ar->winrct.ymax-2*AZONESPOT;
- az->x3= az->x2+AZONESPOT/2;
- az->y3= (az->y1+az->y2)/2;
- BLI_init_rcti(&az->rect, az->x1, az->x3, az->y1, az->y2);
+ az->y1= ar->winrct.ymin;
+ az->x2= ar->winrct.xmax - AZONEPAD_EDGE;
+ az->y2= ar->winrct.ymax;
}
+
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
+}
+
+static void region_azone_icon(ScrArea *sa, AZone *az, ARegion *ar)
+{
+ AZone *azt;
+
+ if(az->edge=='t') {
+ az->x1= ar->winrct.xmax - AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax + AZONEPAD_ICON;
+ az->x2= ar->winrct.xmax - 2*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax + 2*AZONEPAD_ICON;
+ }
+ else if(az->edge=='b') {
+ az->x1= ar->winrct.xmin + AZONEPAD_ICON;
+ az->y1= ar->winrct.ymin - AZONEPAD_ICON;
+ az->x2= ar->winrct.xmin + 2*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymin - 2*AZONEPAD_ICON;
+ }
+ else if(az->edge=='l') {
+ az->x1= ar->winrct.xmin - 2*AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax - 2*AZONEPAD_ICON;
+ az->x2= ar->winrct.xmin - AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax - AZONEPAD_ICON;
+ }
+ else { // if(az->edge=='r') {
+ az->x1= ar->winrct.xmax + AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax - 2*AZONEPAD_ICON;
+ az->x2= ar->winrct.xmax + 2*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax - AZONEPAD_ICON;
+ }
+
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
/* if more azones on 1 spot, set offset */
for(azt= sa->actionzones.first; azt; azt= azt->next) {
if(az!=azt) {
- if(az->x1==azt->x1 && az->y1==azt->y1) {
- if(edge=='t' || edge=='b') {
+ if( ABS(az->x1-azt->x1) < 2 && ABS(az->y1-azt->y1) < 2) {
+ if(az->edge=='t' || az->edge=='b') {
az->x1+= AZONESPOT;
az->x2+= AZONESPOT;
- az->x3+= AZONESPOT;
- BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y3);
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
else {
az->y1-= AZONESPOT;
az->y2-= AZONESPOT;
- az->y3-= AZONESPOT;
- BLI_init_rcti(&az->rect, az->x1, az->x3, az->y1, az->y2);
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
}
}
}
+}
+
+static void region_azone_initialize(ScrArea *sa, ARegion *ar, char edge)
+{
+ AZone *az;
+
+ az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
+ BLI_addtail(&(sa->actionzones), az);
+ az->type= AZONE_REGION;
+ az->ar= ar;
+ az->edge= edge;
+
+ if (ar->flag & RGN_FLAG_HIDDEN) {
+ region_azone_icon(sa, az, ar);
+ } else {
+ region_azone_edge(az, ar);
+ }
}
@@ -758,20 +824,24 @@ static void ed_default_handlers(wmWindowManager *wm, ListBase *handlers, int fla
UI_add_region_handlers(handlers);
}
if(flag & ED_KEYMAP_VIEW2D) {
- ListBase *keymap= WM_keymap_listbase(wm, "View2D", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "View2D", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
if(flag & ED_KEYMAP_MARKERS) {
- ListBase *keymap= WM_keymap_listbase(wm, "Markers", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Markers", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
// XXX need boundbox check urgently!!!
}
if(flag & ED_KEYMAP_ANIMATION) {
- ListBase *keymap= WM_keymap_listbase(wm, "Animation", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Animation", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
if(flag & ED_KEYMAP_FRAMES) {
- ListBase *keymap= WM_keymap_listbase(wm, "Frames", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Frames", 0, 0);
+ WM_event_add_keymap_handler(handlers, keymap);
+ }
+ if(flag & ED_KEYMAP_GPENCIL) {
+ wmKeyMap *keymap= WM_keymap_find(wm, "Grease Pencil", 0, 0);
WM_event_add_keymap_handler(handlers, keymap);
}
}
@@ -846,6 +916,19 @@ void ED_region_init(bContext *C, ARegion *ar)
}
+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);
+
+ ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
+ ED_area_tag_redraw(sa);
+}
/* sa2 to sa1, we swap spaces for fullscreen to keep all allocated data */
/* area vertices were set */
@@ -887,13 +970,6 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space)
ARegion *newar= BKE_area_region_copy(st, ar);
BLI_addtail(&sa1->regionbase, newar);
}
-
-#ifndef DISABLE_PYTHON
- /* scripts */
- BPY_free_scriptlink(&sa1->scriptlink);
- sa1->scriptlink= sa2->scriptlink;
- BPY_copy_scriptlink(&sa1->scriptlink); /* copies internal pointers */
-#endif
}
/* *********** Space switching code *********** */
@@ -1014,7 +1090,12 @@ void ED_area_prevspace(bContext *C)
}
#endif
- ED_area_newspace(C, sa, sl->next->spacetype);
+ /* workaround for case of double prevspace, render window
+ with a file browser on top of it */
+ if(sl->next->spacetype == SPACE_FILE && sl->next->next)
+ ED_area_newspace(C, sa, sl->next->next->spacetype);
+ else
+ ED_area_newspace(C, sa, sl->next->spacetype);
}
else {
ED_area_newspace(C, sa, SPACE_INFO);
@@ -1025,39 +1106,39 @@ void ED_area_prevspace(bContext *C)
static char *windowtype_pup(void)
{
return(
- "Window type:%t" //14
- "|3D View %x1" //30
-
- "|%l" // 33
-
- "|Graph Editor %x2" //54
- "|DopeSheet %x12" //73
- "|NLA Editor %x13" //94
-
- "|%l" //97
-
- "|UV/Image Editor %x6" //117
+ "Window type:%t"
+ "|3D View %x1"
+
+ "|%l"
- "|Video Sequence Editor %x8" //143
- "|Timeline %x15" //163
- "|Audio Window %x11" //163
- "|Text Editor %x9" //179
+ "|Timeline %x15"
+ "|Graph Editor %x2"
+ "|DopeSheet %x12"
+ "|NLA Editor %x13"
- "|%l" //192
+ "|%l"
+ "|UV/Image Editor %x6"
- "|User Preferences %x7" //213
- "|Outliner %x3" //232
- "|Buttons Window %x4" //251
+ "|Video Sequence Editor %x8"
+ "|Text Editor %x9"
"|Node Editor %x16"
"|Logic Editor %x17"
- "|%l" //254
- "|File Browser %x5" //290
+ "|%l"
+
+ "|Properties %x4"
+ "|Outliner %x3"
+ "|User Preferences %x19"
+ "|Info%x7"
+
+ "|%l"
+
+ "|File Browser %x5"
- "|%l" //293
+ "|%l"
- "|Scripts Window %x14"//313
+ "|Console %x18"
);
}
@@ -1068,7 +1149,7 @@ static void spacefunc(struct bContext *C, void *arg1, void *arg2)
}
/* returns offset for next button in header */
-int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
+int ED_area_header_switchbutton(const bContext *C, uiBlock *block, int yco)
{
ScrArea *sa= CTX_wm_area(C);
uiBut *but;
@@ -1081,9 +1162,18 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
"Click for menu of available types.");
uiButSetFunc(but, spacefunc, NULL, NULL);
- xco += XIC + 14;
+ return xco + XIC + 14;
+}
+
+int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ int xco= 8;
+ xco= ED_area_header_switchbutton(C, block, yco);
+
uiBlockSetEmboss(block, UI_EMBOSSN);
+
if (sa->flag & HEADER_NO_PULLDOWN) {
uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, 0,
ICON_DISCLOSURE_TRI_RIGHT,
@@ -1098,16 +1188,15 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
&(sa->flag), 0, 0, 0, 0,
"Hide pulldown menus");
}
- xco+=XIC;
-
+
uiBlockSetEmboss(block, UI_EMBOSS);
- return xco;
+ return xco + XIC;
}
/************************ standard UI regions ************************/
-void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context)
+void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context, int contextnr)
{
ScrArea *sa= CTX_wm_area(C);
uiStyle *style= U.uistyles.first;
@@ -1115,8 +1204,12 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
PanelType *pt;
Panel *panel;
View2D *v2d= &ar->v2d;
+ View2DScrollers *scrollers;
float col[3];
- int xco, yco, x, y, miny=0, w, em, header, triangle, open;
+ int xco, yco, x, y, miny=0, w, em, header, triangle, open, newcontext= 0;
+
+ if(contextnr >= 0)
+ newcontext= UI_view2d_tab_set(v2d, contextnr);
if(vertical) {
w= v2d->cur.xmax - v2d->cur.xmin;
@@ -1127,8 +1220,6 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
em= (ar->type->minsizex)? 10: 20;
}
- header= 20; // XXX
- triangle= 22;
x= 0;
y= -style->panelouter;
@@ -1149,17 +1240,21 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS);
panel= uiBeginPanel(sa, ar, block, pt, &open);
+ /* bad fixed values */
+ header= (pt->flag & PNL_NO_HEADER)? 0: 20;
+ triangle= 22;
+
if(vertical)
y -= header;
- if(pt->draw_header && (open || vertical)) {
+ if(pt->draw_header && header && (open || vertical)) {
/* for enabled buttons */
panel->layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER,
triangle, header+style->panelspace, header, 1, style);
pt->draw_header(C, panel);
- uiBlockLayoutResolve(C, block, &xco, &yco);
+ uiBlockLayoutResolve(block, &xco, &yco);
panel->labelofs= xco - triangle;
panel->layout= NULL;
}
@@ -1170,7 +1265,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
pt->draw(C, panel);
- uiBlockLayoutResolve(C, block, &xco, &yco);
+ uiBlockLayoutResolve(block, &xco, &yco);
panel->layout= NULL;
yco -= 2*style->panelspace;
@@ -1184,7 +1279,10 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
uiEndBlock(C, block);
if(vertical) {
- y += yco-style->panelouter;
+ if(pt->flag & PNL_NO_HEADER)
+ y += yco;
+ else
+ y += yco-style->panelouter;
}
else {
x += w;
@@ -1211,15 +1309,32 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
/* before setting the view */
if(vertical) {
- v2d->keepofs |= V2D_LOCKOFS_X;
- v2d->keepofs &= ~V2D_LOCKOFS_Y;
+ /* only allow scrolling in vertical direction */
+ v2d->keepofs |= V2D_LOCKOFS_X|V2D_KEEPOFS_Y;
+ v2d->keepofs &= ~(V2D_LOCKOFS_Y|V2D_KEEPOFS_X);
+
+ // don't jump back when panels close or hide
+ if(!newcontext)
+ y= MAX2(-y, -v2d->cur.ymin);
+ else
+ y= -y;
}
else {
- v2d->keepofs &= ~V2D_LOCKOFS_X;
- v2d->keepofs |= V2D_LOCKOFS_Y;
+ /* for now, allow scrolling in both directions (since layouts are optimised for vertical,
+ * they often don't fit in horizontal layout)
+ */
+ v2d->keepofs &= ~(V2D_LOCKOFS_X|V2D_LOCKOFS_Y|V2D_KEEPOFS_X|V2D_KEEPOFS_Y);
+ //v2d->keepofs |= V2D_LOCKOFS_Y|V2D_KEEPOFS_X;
+ //v2d->keepofs &= ~(V2D_LOCKOFS_X|V2D_KEEPOFS_Y);
+
+ // don't jump back when panels close or hide
+ if(!newcontext)
+ x= MAX2(x, v2d->cur.xmax);
+ y= -y;
}
- UI_view2d_totRect_set(v2d, x, -y);
+ // +V2D_SCROLL_HEIGHT is workaround to set the actual height
+ UI_view2d_totRect_set(v2d, x+V2D_SCROLL_WIDTH, y+V2D_SCROLL_HEIGHT);
/* set the view */
UI_view2d_view_ortho(C, v2d);
@@ -1229,15 +1344,29 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
/* restore 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_ARG_DUMMY);
+ UI_view2d_scrollers_draw(C, v2d, scrollers);
+ UI_view2d_scrollers_free(scrollers);
}
void ED_region_panels_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
+
+ // XXX quick hacks for files saved with 2.5 already (i.e. the builtin defaults file)
+ // scrollbars for button regions
+ ar->v2d.scroll |= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+ ar->v2d.keepzoom |= V2D_KEEPZOOM;
+ // correctly initialised User-Prefs?
+ if(!(ar->v2d.align & V2D_ALIGN_NO_POS_Y))
+ ar->v2d.flag &= ~V2D_IS_INITIALISED;
+
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_PANELS_UI, ar->winx, ar->winy);
- keymap= WM_keymap_listbase(wm, "View2D Buttons List", 0, 0);
+ keymap= WM_keymap_find(wm, "View2D Buttons List", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
@@ -1249,7 +1378,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
HeaderType *ht;
Header header = {0};
float col[3];
- int xco, yco;
+ int maxco, xco, yco;
/* clear */
if(ED_screen_area_active(C))
@@ -1263,7 +1392,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
/* set view2d view matrix for scrolling (without scrollers) */
UI_view2d_view_ortho(C, &ar->v2d);
- xco= 8;
+ xco= maxco= 8;
yco= HEADERY-3;
/* draw all headers types */
@@ -1275,15 +1404,25 @@ void ED_region_header(const bContext *C, ARegion *ar)
header.type= ht;
header.layout= layout;
ht->draw(C, &header);
+
+ /* for view2d */
+ xco= uiLayoutGetWidth(layout);
+ if(xco > maxco)
+ maxco= xco;
}
- uiBlockLayoutResolve(C, block, &xco, &yco);
+ uiBlockLayoutResolve(block, &xco, &yco);
+
+ /* for view2d */
+ if(xco > maxco)
+ maxco= xco;
+
uiEndBlock(C, block);
uiDrawBlock(C, block);
}
/* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
+ UI_view2d_totRect_set(&ar->v2d, maxco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
/* restore view matrix? */
UI_view2d_view_restore(C);
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index a23487effa1..5312ca26906 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -35,6 +35,7 @@
#include "DNA_listBase.h"
#include "BKE_utildefines.h"
+#include "BKE_colortools.h"
#include "BLI_arithb.h"
#include "BLI_threads.h"
@@ -482,27 +483,20 @@ 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)
+void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf, int gamma_correct)
{
- float *rf;
- int x, y;
- char *rect32, *rc;
+ unsigned char *rect32;
/* copy imgw-imgh to a temporal 32 bits rect */
if(img_w<1 || img_h<1) return;
- rc= rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits");
+ rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits");
- for(y=0; y<img_h; y++) {
- rf= rectf;
- for(x=0; x<img_w; x++, rf+=4, rc+=4) {
- rc[0]= FTOCHAR(rf[0]);
- rc[1]= FTOCHAR(rf[1]);
- rc[2]= FTOCHAR(rf[2]);
- rc[3]= FTOCHAR(rf[3]);
- }
- rectf+= 4*row_w;
- }
+ if (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);
+ }
glaDrawPixelsSafe(fx, fy, img_w, img_h, img_w, GL_RGBA, GL_UNSIGNED_BYTE, rect32);
@@ -855,4 +849,3 @@ void bglFlush(void)
#endif
}
-
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 1ea6f8baceb..17c51a7b7d3 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -33,19 +33,29 @@
#include "BKE_context.h"
#include "BKE_utildefines.h"
+#include "BKE_global.h"
#include "RNA_access.h"
+#include "ED_object.h"
+
int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
{
bScreen *sc= CTX_wm_screen(C);
Scene *scene= sc->scene;
Base *base;
+ Object *ob = NULL;
+
+ if(scene && scene->basact)
+ ob = scene->basact->object;
if(CTX_data_dir(member)) {
static const char *dir[] = {
- "scene", "selected_objects", "selected_bases", "active_base",
- "active_object", "edit_object", NULL};
+ "scene", "selected_objects", "selected_bases",
+ "selected_editable_objects", "selected_editable_bases"
+ "active_base", "active_object", "edit_object",
+ "sculpt_object", "vertex_paint_object", "weight_paint_object",
+ "texture_paint_object", "brush", "particle_edit_object", NULL};
CTX_data_dir_set(result, dir);
return 1;
@@ -68,9 +78,27 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
+ else if(CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) {
+ int selected_editable_objects= CTX_data_equals(member, "selected_editable_objects");
+
+ for(base=scene->base.first; base; base=base->next) {
+ if((base->flag & SELECT) && (base->lay & scene->lay)) {
+ if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
+ if(0==object_is_libdata(base->object)) {
+ if(selected_editable_objects)
+ CTX_data_id_list_add(result, &base->object->id);
+ else
+ CTX_data_list_add(result, &scene->id, &RNA_UnknownType, base);
+ }
+ }
+ }
+ }
+
+ return 1;
+ }
else if(CTX_data_equals(member, "active_base")) {
if(scene->basact)
- CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact);
+ CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact);
return 1;
}
@@ -80,6 +108,12 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
+ else if(CTX_data_equals(member, "object")) {
+ if(scene->basact)
+ CTX_data_id_pointer_set(result, &scene->basact->object->id);
+
+ return 1;
+ }
else if(CTX_data_equals(member, "edit_object")) {
/* convenience for now, 1 object per scene in editmode */
if(scene->obedit)
@@ -87,7 +121,37 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
-
+ else if(CTX_data_equals(member, "sculpt_object")) {
+ if(ob && (ob->mode & OB_MODE_SCULPT))
+ CTX_data_id_pointer_set(result, &ob->id);
+
+ return 1;
+ }
+ else if(CTX_data_equals(member, "vertex_paint_object")) {
+ if(ob && (ob->mode & OB_MODE_VERTEX_PAINT))
+ CTX_data_id_pointer_set(result, &ob->id);
+
+ return 1;
+ }
+ else if(CTX_data_equals(member, "weight_paint_object")) {
+ if(ob && (ob->mode & OB_MODE_WEIGHT_PAINT))
+ CTX_data_id_pointer_set(result, &ob->id);
+
+ return 1;
+ }
+ else if(CTX_data_equals(member, "texture_paint_object")) {
+ if(ob && (ob->mode & OB_MODE_TEXTURE_PAINT))
+ CTX_data_id_pointer_set(result, &ob->id);
+
+ return 1;
+ }
+ else if(CTX_data_equals(member, "particle_edit_object")) {
+ if(ob && (ob->mode & OB_MODE_PARTICLE_EDIT))
+ CTX_data_id_pointer_set(result, &ob->id);
+
+ return 1;
+ }
+
return 0;
}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 4e08310240c..2cc5500c3ef 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -54,6 +54,7 @@
#include "ED_screen.h"
#include "ED_screen_types.h"
+/* XXX actually should be not here... solve later */
#include "wm_subwindow.h"
#include "screen_intern.h" /* own module include */
@@ -404,7 +405,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 *screen_add(wmWindow *win, Scene *scene, char *name)
+bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name)
{
bScreen *sc;
ScrVert *sv1, *sv2, *sv3, *sv4;
@@ -465,7 +466,6 @@ static void screen_copy(bScreen *to, bScreen *from)
sa->spacedata.first= sa->spacedata.last= NULL;
sa->regionbase.first= sa->regionbase.last= NULL;
sa->actionzones.first= sa->actionzones.last= NULL;
- sa->scriptlink.totscript= 0;
area_copy_data(sa, saf, 0);
}
@@ -920,15 +920,9 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc)
if(sc->full != SCREENNORMAL) return NULL; /* XXX handle this case! */
/* make new empty screen: */
- newsc= screen_add(win, sc->scene, sc->id.name+2);
+ newsc= ED_screen_add(win, sc->scene, sc->id.name+2);
/* copy all data */
screen_copy(newsc, sc);
- /* set in window */
- win->screen= newsc;
-
- /* store identifier */
- win->screen->winid= win->winid;
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
return newsc;
}
@@ -1146,7 +1140,7 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event)
if(az->type==AZONE_AREA)
WM_cursor_set(win, CURSOR_EDIT);
else if(az->type==AZONE_REGION) {
- if(az->x1==az->x2)
+ if(az->edge == 'l' || az->edge == 'r')
WM_cursor_set(win, CURSOR_X_MOVE);
else
WM_cursor_set(win, CURSOR_Y_MOVE);
@@ -1289,6 +1283,49 @@ void ED_screen_set(bContext *C, bScreen *sc)
}
}
+static int ed_screen_used(wmWindowManager *wm, bScreen *sc)
+{
+ wmWindow *win;
+
+ for(win=wm->windows.first; win; win=win->next)
+ if(win->screen == sc)
+ return 1;
+
+ return 0;
+}
+
+/* only call outside of area/region loops */
+void ED_screen_delete(bContext *C, bScreen *sc)
+{
+ Main *bmain= CTX_data_main(C);
+ wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindow *win= CTX_wm_window(C);
+ bScreen *newsc;
+ int delete= 1;
+
+ /* screen can only be in use by one window at a time, so as
+ long as we are able to find a screen that is unused, we
+ can safely assume ours is not in use anywhere an delete it */
+
+ for(newsc= sc->id.prev; newsc; newsc=newsc->id.prev)
+ if(!ed_screen_used(wm, newsc))
+ break;
+
+ if(!newsc) {
+ for(newsc= sc->id.next; newsc; newsc=newsc->id.next)
+ if(!ed_screen_used(wm, newsc))
+ break;
+ }
+
+ if(!newsc)
+ return;
+
+ ED_screen_set(C, newsc);
+
+ if(delete && win->screen != sc)
+ free_libblock(&bmain->screen, sc);
+}
+
/* only call outside of area/region loops */
void ED_screen_set_scene(bContext *C, Scene *scene)
{
@@ -1341,13 +1378,29 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
ED_update_for_newframe(C, 1);
-// set_radglobal();
-
/* complete redraw */
WM_event_add_notifier(C, NC_WINDOW, NULL);
}
+/* only call outside of area/region loops */
+void ED_screen_delete_scene(bContext *C, Scene *scene)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *newscene;
+
+ if(scene->id.prev)
+ newscene= scene->id.prev;
+ else if(scene->id.next)
+ newscene= scene->id.next;
+ else
+ return;
+
+ ED_screen_set_scene(C, newscene);
+
+ unlink_scene(bmain, scene, newscene);
+}
+
/* this function toggles: if area is full then the parent will be restored */
void ed_screen_fullarea(bContext *C, ScrArea *sa)
{
@@ -1407,7 +1460,7 @@ void ed_screen_fullarea(bContext *C, ScrArea *sa)
oldscreen->full = SCREENFULL;
- sc= screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp");
+ sc= ED_screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp");
sc->full = SCREENFULL; // XXX
/* timer */
@@ -1460,8 +1513,10 @@ void ED_screen_full_prevspace(bContext *C)
ed_screen_fullarea(C, sa);
}
-/* redraws: uses defines from stime->redraws */
-void ED_screen_animation_timer(bContext *C, int redraws, int enable)
+/* redraws: uses defines from stime->redraws
+ * enable: 1 - forward on, -1 - backwards on, 0 - off
+ */
+void ED_screen_animation_timer(bContext *C, int redraws, int sync, int enable)
{
bScreen *screen= CTX_wm_screen(C);
wmWindow *win= CTX_wm_window(C);
@@ -1472,11 +1527,13 @@ void ED_screen_animation_timer(bContext *C, int redraws, int enable)
screen->animtimer= NULL;
if(enable) {
- struct ScreenAnimData *sad= MEM_mallocN(sizeof(ScreenAnimData), "ScreenAnimData");
+ struct ScreenAnimData *sad= MEM_callocN(sizeof(ScreenAnimData), "ScreenAnimData");
screen->animtimer= WM_event_add_window_timer(win, TIMER0, (1.0/FPS));
sad->ar= CTX_wm_region(C);
sad->redraws= redraws;
+ sad->flag |= (enable < 0)? ANIMPLAY_FLAG_REVERSE: 0;
+ sad->flag |= (sync == 0)? ANIMPLAY_FLAG_NO_SYNC: (sync == 1)? ANIMPLAY_FLAG_SYNC: 0;
screen->animtimer->customdata= sad;
}
@@ -1484,25 +1541,46 @@ void ED_screen_animation_timer(bContext *C, int redraws, int enable)
WM_event_add_notifier(C, NC_SCREEN|ND_ANIMPLAY, screen);
}
-unsigned int ED_screen_view3d_layers(bScreen *screen)
+/* helper for screen_animation_play() - only to be used for TimeLine */
+static ARegion *time_top_left_3dwindow(bScreen *screen)
{
- if(screen) {
- unsigned int layer= screen->scene->lay; /* as minimum this */
- ScrArea *sa;
-
- /* get all used view3d layers */
- for(sa= screen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_VIEW3D)
- layer |= ((View3D *)sa->spacedata.first)->lay;
+ ARegion *aret= NULL;
+ ScrArea *sa;
+ int min= 10000;
+
+ for(sa= screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype==SPACE_VIEW3D) {
+ ARegion *ar;
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
+ if(ar->regiontype==RGN_TYPE_WINDOW) {
+ if(ar->winrct.xmin - ar->winrct.ymin < min) {
+ aret= ar;
+ min= ar->winrct.xmin - ar->winrct.ymin;
+ }
+ }
+ }
}
- return layer;
}
- return 0;
+
+ return aret;
}
+void ED_screen_animation_timer_update(bContext *C, int redraws)
+{
+ bScreen *screen= CTX_wm_screen(C);
+
+ if(screen && screen->animtimer) {
+ wmTimer *wt= screen->animtimer;
+ ScreenAnimData *sad= wt->customdata;
+
+ sad->redraws= redraws;
+ sad->ar= NULL;
+ if(redraws & TIME_REGION)
+ sad->ar= time_top_left_3dwindow(screen);
+ }
+}
/* results in fully updated anim system */
-/* in future sound should be on WM level, only 1 sound can play! */
void ED_update_for_newframe(const bContext *C, int mute)
{
bScreen *screen= CTX_wm_screen(C);
@@ -1512,9 +1590,9 @@ void ED_update_for_newframe(const bContext *C, int mute)
/* this function applies the changes too */
/* XXX future: do all windows */
- scene_update_for_newframe(scene, ED_screen_view3d_layers(screen)); /* BKE_scene.h */
+ scene_update_for_newframe(scene, BKE_screen_visible_layers(screen)); /* BKE_scene.h */
- //if ( (CFRA>1) && (!mute) && (scene->audio.flag & AUDIO_SCRUB))
+ //if ( (CFRA>1) && (!mute) && (scene->r.audio.flag & AUDIO_SCRUB))
// audiostream_scrub( CFRA );
/* 3d window, preview */
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index a0804f3e633..2b3a816f8de 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -36,7 +36,6 @@ struct Scene;
void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space);
/* screen_edit.c */
-bScreen *screen_add(struct wmWindow *win, struct Scene *scene, char *name);
ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac);
int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 2aa6758850e..5f7be1fd2bc 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -31,15 +31,19 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_dlrbTree.h"
#include "DNA_armature_types.h"
#include "DNA_image_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
#include "DNA_curve_types.h"
#include "DNA_scene_types.h"
+#include "DNA_meta_types.h"
#include "BKE_blender.h"
+#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_global.h"
@@ -50,8 +54,10 @@
#include "BKE_mesh.h"
#include "BKE_multires.h"
#include "BKE_report.h"
+#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "BKE_sound.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -59,7 +65,9 @@
#include "ED_util.h"
#include "ED_screen.h"
#include "ED_mesh.h"
+#include "ED_object.h"
#include "ED_screen_types.h"
+#include "ED_keyframes_draw.h"
#include "RE_pipeline.h"
#include "IMB_imbuf.h"
@@ -71,8 +79,15 @@
#include "UI_interface.h"
#include "UI_resources.h"
+#include "wm_window.h"
+
#include "screen_intern.h" /* own module include */
+#define KM_MODAL_CANCEL 1
+#define KM_MODAL_APPLY 2
+#define KM_MODAL_STEP10 3
+#define KM_MODAL_STEP10_OFF 4
+
/* ************** Exported Poll tests ********************** */
int ED_operator_regionactive(bContext *C)
@@ -156,14 +171,15 @@ int ED_operator_buttons_active(bContext *C)
int ED_operator_node_active(bContext *C)
{
- if(ed_spacetype_test(C, SPACE_NODE)) {
- SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C);
- if(snode->edittree)
- return 1;
- }
+ SpaceNode *snode= CTX_wm_space_node(C);
+
+ if(snode && snode->edittree)
+ return 1;
+
return 0;
}
+// XXX rename
int ED_operator_ipo_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_IPO);
@@ -179,6 +195,11 @@ int ED_operator_image_active(bContext *C)
return ed_spacetype_test(C, SPACE_IMAGE);
}
+int ED_operator_nla_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_NLA);
+}
+
int ED_operator_logic_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_LOGIC);
@@ -211,7 +232,7 @@ int ED_operator_posemode(bContext *C)
Object *obedit= CTX_data_edit_object(C);
if ((obact != obedit) && (obact) && (obact->type==OB_ARMATURE))
- return (obact->flag & OB_POSEMODE)!=0;
+ return (obact->mode & OB_MODE_POSE)!=0;
return 0;
}
@@ -286,6 +307,22 @@ int ED_operator_editfont(bContext *C)
return 0;
}
+int ED_operator_editlattice(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_LATTICE)
+ return NULL != ((Lattice *)obedit->data)->editlatt;
+ return 0;
+}
+
+int ED_operator_editmball(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_MBALL)
+ return NULL != ((MetaBall *)obedit->data)->editelems;
+ return 0;
+}
+
/* *************************** action zone operator ************************** */
/* operator state vars used:
@@ -359,15 +396,7 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
break;
}
else if(az->type == AZONE_REGION) {
- float v1[2], v2[2], v3[2], pt[2];
-
- v1[0]= az->x1; v1[1]= az->y1;
- v2[0]= az->x2; v2[1]= az->y2;
- v3[0]= az->x3; v3[1]= az->y3;
- pt[0]= x; pt[1]=y;
-
- if(IsPointInTri2D(v1, v2, v3, pt))
- break;
+ break;
}
}
}
@@ -427,7 +456,7 @@ static int actionzone_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
else {
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -479,7 +508,7 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-void SCREEN_OT_actionzone(wmOperatorType *ot)
+static void SCREEN_OT_actionzone(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Handle area action zones";
@@ -487,8 +516,10 @@ void SCREEN_OT_actionzone(wmOperatorType *ot)
ot->invoke= actionzone_invoke;
ot->modal= actionzone_modal;
-
ot->poll= actionzone_area_poll;
+
+ ot->flag= OPTYPE_BLOCKING;
+
RNA_def_int(ot->srna, "modifier", 0, 0, 2, "modifier", "modifier state", 0, 2);
}
@@ -557,7 +588,7 @@ static int area_swap_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* add modal handler */
WM_cursor_modal(CTX_wm_window(C), BC_SWAPAREA_CURSOR);
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -573,8 +604,8 @@ static int area_swap_modal(bContext *C, wmOperator *op, wmEvent *event)
sad->sa2= screen_areahascursor(CTX_wm_screen(C), event->x, event->y);
break;
case LEFTMOUSE: /* release LMB */
- if(event->val==0) {
- if(sad->sa1 == sad->sa2) {
+ if(event->val==KM_RELEASE) {
+ if(!sad->sa2 || sad->sa1 == sad->sa2) {
return area_swap_cancel(C, op);
}
@@ -602,6 +633,8 @@ static void SCREEN_OT_area_swap(wmOperatorType *ot)
ot->invoke= area_swap_invoke;
ot->modal= area_swap_modal;
ot->poll= ED_operator_areaactive;
+
+ ot->flag= OPTYPE_BLOCKING;
}
/* *********** Duplicate area as new window operator ****************** */
@@ -641,7 +674,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
newwin= WM_window_open(C, &rect);
/* allocs new screen and adds to newly created window, using window size */
- newsc= screen_add(newwin, CTX_data_scene(C), sc->id.name+2);
+ newsc= ED_screen_add(newwin, CTX_data_scene(C), sc->id.name+2);
newwin->screen= newsc;
/* copy area to new screen */
@@ -698,7 +731,7 @@ static void SCREEN_OT_area_dupli(wmOperatorType *ot)
*/
typedef struct sAreaMoveData {
- int bigger, smaller, origval;
+ int bigger, smaller, origval, step;
char dir;
} sAreaMoveData;
@@ -837,7 +870,7 @@ static int area_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -855,38 +888,46 @@ static int area_move_cancel(bContext *C, wmOperator *op)
/* modal callback for while moving edges */
static int area_move_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- sAreaMoveData *md;
+ sAreaMoveData *md= op->customdata;
int delta, x, y;
- md= op->customdata;
-
- x= RNA_int_get(op->ptr, "x");
- y= RNA_int_get(op->ptr, "y");
-
/* execute the events */
switch(event->type) {
case MOUSEMOVE:
+
+ x= RNA_int_get(op->ptr, "x");
+ y= RNA_int_get(op->ptr, "y");
+
delta= (md->dir == 'v')? event->x - x: event->y - y;
+ if(md->step) delta= delta - (delta % md->step);
RNA_int_set(op->ptr, "delta", delta);
area_move_apply(C, op);
break;
- case LEFTMOUSE:
- if(event->val==0) {
- area_move_exit(C, op);
- return OPERATOR_FINISHED;
- }
- break;
+ case EVT_MODAL_MAP:
- case ESCKEY:
- return area_move_cancel(C, op);
+ switch (event->val) {
+ case KM_MODAL_APPLY:
+ area_move_exit(C, op);
+ return OPERATOR_FINISHED;
+
+ case KM_MODAL_CANCEL:
+ return area_move_cancel(C, op);
+
+ case KM_MODAL_STEP10:
+ md->step= 10;
+ break;
+ case KM_MODAL_STEP10_OFF:
+ md->step= 0;
+ break;
+ }
}
return OPERATOR_RUNNING_MODAL;
}
-void SCREEN_OT_area_move(wmOperatorType *ot)
+static void SCREEN_OT_area_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move area edges";
@@ -896,9 +937,10 @@ void SCREEN_OT_area_move(wmOperatorType *ot)
ot->invoke= area_move_invoke;
ot->cancel= area_move_cancel;
ot->modal= area_move_modal;
-
ot->poll= ED_operator_screen_mainwinactive; /* when mouse is over area-edge */
+ ot->flag= OPTYPE_BLOCKING;
+
/* rna */
RNA_def_int(ot->srna, "x", 0, INT_MIN, INT_MAX, "X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "y", 0, INT_MIN, INT_MAX, "Y", "", INT_MIN, INT_MAX);
@@ -1118,7 +1160,7 @@ static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
area_move_set_limits(CTX_wm_screen(C), dir, &sd->bigger, &sd->smaller);
/* add temp handler for edge move or cancel */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1183,7 +1225,7 @@ static int area_split_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
case LEFTMOUSE:
- if(event->val==0) { /* mouse up */
+ if(event->val==KM_RELEASE) { /* mouse up */
area_split_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -1201,7 +1243,7 @@ static EnumPropertyItem prop_direction_items[] = {
{'v', "VERTICAL", 0, "Vertical", ""},
{0, NULL, 0, NULL, NULL}};
-void SCREEN_OT_area_split(wmOperatorType *ot)
+static void SCREEN_OT_area_split(wmOperatorType *ot)
{
ot->name = "Split area";
ot->idname = "SCREEN_OT_area_split";
@@ -1211,7 +1253,7 @@ void SCREEN_OT_area_split(wmOperatorType *ot)
ot->modal= area_split_modal;
ot->poll= ED_operator_areaactive;
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_BLOCKING;
/* rna */
RNA_def_enum(ot->srna, "direction", prop_direction_items, 'h', "Direction", "");
@@ -1223,7 +1265,9 @@ void SCREEN_OT_area_split(wmOperatorType *ot)
/* ************** scale region edge operator *********************************** */
typedef struct RegionMoveData {
+ AZone *az;
ARegion *ar;
+ ScrArea *sa;
int bigger, smaller, origval;
int origx, origy;
char edge;
@@ -1240,7 +1284,9 @@ static int region_scale_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= rmd;
+ rmd->az = az;
rmd->ar= az->ar;
+ rmd->sa = sad->sa1;
rmd->edge= az->edge;
rmd->origx= event->x;
rmd->origy= event->y;
@@ -1250,7 +1296,7 @@ static int region_scale_invoke(bContext *C, wmOperator *op, wmEvent *event)
rmd->origval= rmd->ar->type->minsizey;
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1272,24 +1318,26 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
if(rmd->edge=='l') delta= -delta;
rmd->ar->type->minsizex= rmd->origval + delta;
CLAMP(rmd->ar->type->minsizex, 0, 1000);
- if(rmd->ar->type->minsizex < 10) {
- rmd->ar->type->minsizex= 10;
- rmd->ar->flag |= RGN_FLAG_HIDDEN;
+ if(rmd->ar->type->minsizex < 24) {
+ rmd->ar->type->minsizex= rmd->origval;
+ if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
+ ED_region_toggle_hidden(C, rmd->ar);
}
- else
- rmd->ar->flag &= ~RGN_FLAG_HIDDEN;
+ else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
+ ED_region_toggle_hidden(C, rmd->ar);
}
else {
delta= event->y - rmd->origy;
if(rmd->edge=='b') delta= -delta;
rmd->ar->type->minsizey= rmd->origval + delta;
CLAMP(rmd->ar->type->minsizey, 0, 1000);
- if(rmd->ar->type->minsizey < 10) {
- rmd->ar->type->minsizey= 10;
- rmd->ar->flag |= RGN_FLAG_HIDDEN;
+ if(rmd->ar->type->minsizey < 24) {
+ rmd->ar->type->minsizey= rmd->origval;
+ if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
+ ED_region_toggle_hidden(C, rmd->ar);
}
- else
- rmd->ar->flag &= ~RGN_FLAG_HIDDEN;
+ else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
+ ED_region_toggle_hidden(C, rmd->ar);
}
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -1297,12 +1345,14 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
case LEFTMOUSE:
- if(event->val==0) {
+ if(event->val==KM_RELEASE) {
if(ABS(event->x - rmd->origx) < 2 && ABS(event->y - rmd->origy) < 2) {
- rmd->ar->flag ^= RGN_FLAG_HIDDEN;
- WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
- }
+ if(rmd->ar->flag & RGN_FLAG_HIDDEN) {
+ ED_region_toggle_hidden(C, rmd->ar);
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+ }
+ }
MEM_freeN(op->customdata);
op->customdata = NULL;
@@ -1328,12 +1378,13 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot)
ot->modal= region_scale_modal;
ot->poll= ED_operator_areaactive;
+
+ ot->flag= OPTYPE_BLOCKING;
}
/* ************** frame change operator ***************************** */
-
/* function to be called outside UI context, or for redo */
static int frame_offset_exec(bContext *C, wmOperator *op)
{
@@ -1348,7 +1399,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_frame_offset(wmOperatorType *ot)
+static void SCREEN_OT_frame_offset(wmOperatorType *ot)
{
ot->name = "Frame Offset";
ot->idname = "SCREEN_OT_frame_offset";
@@ -1362,6 +1413,101 @@ void SCREEN_OT_frame_offset(wmOperatorType *ot)
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
}
+
+/* function to be called outside UI context, or for redo */
+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;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCREEN_OT_frame_jump(wmOperatorType *ot)
+{
+ ot->name = "Jump to Endpoint";
+ ot->idname = "SCREEN_OT_frame_jump";
+
+ ot->exec= frame_jump_exec;
+
+ ot->poll= ED_operator_screenactive;
+ ot->flag= 0;
+
+ /* rna */
+ RNA_def_boolean(ot->srna, "end", 0, "Last Frame", "Jump to the last frame of the frame range.");
+}
+
+
+/* ************** jump to keyframe operator ***************************** */
+
+/* function to be called outside UI context, or for redo */
+static int keyframe_jump_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+ DLRBT_Tree keys;
+ ActKeyColumn *ak;
+ short next= RNA_boolean_get(op->ptr, "next");
+
+ /* sanity checks */
+ if (scene == NULL)
+ return OPERATOR_CANCELLED;
+
+ /* init binarytree-list for getting keyframes */
+ 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);
+
+ /* build linked-list for searching */
+ BLI_dlrbTree_linkedlist_sync(&keys);
+
+ /* find nearest keyframe in the right direction */
+ ak= cfra_find_nearest_next_ak(keys.root, (float)scene->r.cfra, next);
+
+ /* set the new frame (if keyframe found) */
+ if (ak) {
+ if (next && ak->next)
+ scene->r.cfra= (int)ak->next->cfra;
+ else if (!next && ak->prev)
+ scene->r.cfra= (int)ak->prev->cfra;
+ else {
+ printf("ERROR: no suitable keyframe found. Using %f as new frame \n", ak->cfra);
+ scene->r.cfra= (int)ak->cfra; // XXX
+ }
+ }
+
+ /* free temp stuff */
+ BLI_dlrbTree_free(&keys);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C));
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCREEN_OT_keyframe_jump(wmOperatorType *ot)
+{
+ ot->name = "Jump to Keyframe";
+ ot->idname = "SCREEN_OT_keyframe_jump";
+
+ ot->exec= keyframe_jump_exec;
+
+ ot->poll= ED_operator_screenactive;
+ ot->flag= 0;
+
+ /* rna */
+ RNA_def_boolean(ot->srna, "next", 1, "Next Keyframe", "");
+}
+
/* ************** switch screen operator ***************************** */
@@ -1404,7 +1550,7 @@ static int screen_set_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void SCREEN_OT_screen_set(wmOperatorType *ot)
+static void SCREEN_OT_screen_set(wmOperatorType *ot)
{
ot->name = "Set Screen";
ot->idname = "SCREEN_OT_screen_set";
@@ -1413,7 +1559,6 @@ void SCREEN_OT_screen_set(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
/* rna */
- RNA_def_pointer_runtime(ot->srna, "screen", &RNA_Screen, "Screen", "");
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
}
@@ -1427,7 +1572,7 @@ static int screen_full_area_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_screen_full_area(wmOperatorType *ot)
+static void SCREEN_OT_screen_full_area(wmOperatorType *ot)
{
ot->name = "Toggle Make Area Fullscreen";
ot->idname = "SCREEN_OT_screen_full_area";
@@ -1583,7 +1728,7 @@ static int area_join_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1683,7 +1828,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
}
break;
case LEFTMOUSE:
- if(event->val==0) {
+ if(event->val==KM_RELEASE) {
area_join_apply(C, op);
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
area_join_exit(C, op);
@@ -1699,7 +1844,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
}
/* Operator for joining two areas (space types) */
-void SCREEN_OT_area_join(wmOperatorType *ot)
+static void SCREEN_OT_area_join(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Join area";
@@ -1709,9 +1854,10 @@ void SCREEN_OT_area_join(wmOperatorType *ot)
ot->exec= area_join_exec;
ot->invoke= area_join_invoke;
ot->modal= area_join_modal;
-
ot->poll= ED_operator_areaactive;
+ ot->flag= OPTYPE_BLOCKING;
+
/* rna */
RNA_def_int(ot->srna, "x1", -100, INT_MIN, INT_MAX, "X 1", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "y1", -100, INT_MIN, INT_MAX, "Y 1", "", INT_MIN, INT_MAX);
@@ -1731,7 +1877,7 @@ static int repeat_last_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void SCREEN_OT_repeat_last(wmOperatorType *ot)
+static void SCREEN_OT_repeat_last(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Repeat Last";
@@ -1783,7 +1929,7 @@ static int repeat_history_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_repeat_history(wmOperatorType *ot)
+static void SCREEN_OT_repeat_history(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Repeat History";
@@ -1816,7 +1962,7 @@ static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void SCREEN_OT_redo_last(wmOperatorType *ot)
+static void SCREEN_OT_redo_last(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Redo Last";
@@ -1859,7 +2005,7 @@ static int region_split_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_region_split(wmOperatorType *ot)
+static void SCREEN_OT_region_split(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Split Region";
@@ -1948,17 +2094,17 @@ static int region_foursplit_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_region_foursplit(wmOperatorType *ot)
+static void SCREEN_OT_region_foursplit(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Split Region in 4 Parts";
ot->idname= "SCREEN_OT_region_foursplit";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
+// ot->invoke= WM_operator_confirm;
ot->exec= region_foursplit_exec;
ot->poll= ED_operator_areaactive;
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= 0;
}
@@ -1986,7 +2132,7 @@ static int region_flip_exec(bContext *C, wmOperator *op)
}
-void SCREEN_OT_region_flip(wmOperatorType *ot)
+static void SCREEN_OT_region_flip(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Flip Region";
@@ -1996,7 +2142,7 @@ void SCREEN_OT_region_flip(wmOperatorType *ot)
ot->exec= region_flip_exec;
ot->poll= ED_operator_areaactive;
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= 0;
}
@@ -2030,6 +2176,10 @@ static int match_region_with_redraws(int spacetype, int regiontype, int redraws)
if(redraws & (TIME_SEQ|TIME_ALL_ANIM_WIN))
return 1;
break;
+ case SPACE_NODE:
+ if(redraws & (TIME_NODES))
+ return 1;
+ break;
case SPACE_IMAGE:
if(redraws & TIME_ALL_IMAGE_WIN)
return 1;
@@ -2057,27 +2207,69 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
wmTimer *wt= screen->animtimer;
ScreenAnimData *sad= wt->customdata;
ScrArea *sa;
+ int sync;
+
+ /* sync, don't sync, or follow scene setting */
+ if(sad->flag & ANIMPLAY_FLAG_SYNC) sync= 1;
+ else if(sad->flag & ANIMPLAY_FLAG_NO_SYNC) sync= 0;
+ else sync= (scene->audio.flag & AUDIO_SYNC);
- if(scene->audio.flag & AUDIO_SYNC) {
+ if(sync) {
+ /* skip frames */
int step = floor(wt->duration * FPS);
- scene->r.cfra += step;
+ if(sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio?
+ scene->r.cfra -= step;
+ else
+ scene->r.cfra += step;
wt->duration -= ((float)step)/FPS;
}
- else
- scene->r.cfra++;
+ else {
+ /* one frame +/- */
+ if(sad->flag & ANIMPLAY_FLAG_REVERSE)
+ scene->r.cfra--;
+ else
+ scene->r.cfra++;
+ }
+
+ /* reset 'jumped' flag before checking if we need to jump... */
+ sad->flag &= ~ANIMPLAY_FLAG_JUMPED;
- if (scene->r.psfra) {
- if(scene->r.cfra > scene->r.pefra)
- scene->r.cfra= scene->r.psfra;
+ if (sad->flag & ANIMPLAY_FLAG_REVERSE) {
+ /* jump back to end? */
+ if (scene->r.psfra) {
+ if (scene->r.cfra < scene->r.psfra) {
+ scene->r.cfra= scene->r.pefra;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
+ }
+ else {
+ if (scene->r.cfra < scene->r.sfra) {
+ scene->r.cfra= scene->r.efra;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
+ }
}
else {
- if(scene->r.cfra > scene->r.efra)
- scene->r.cfra= scene->r.sfra;
+ /* jump back to start? */
+ if (scene->r.psfra) {
+ if (scene->r.cfra > scene->r.pefra) {
+ scene->r.cfra= scene->r.psfra;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
+ }
+ else {
+ if (scene->r.cfra > scene->r.efra) {
+ scene->r.cfra= scene->r.sfra;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
+ }
}
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
ED_update_for_newframe(C, 1);
-
+
+ sound_update_playing(C);
+
for(sa= screen->areabase.first; sa; sa= sa->next) {
ARegion *ar;
for(ar= sa->regionbase.first; ar; ar= ar->next) {
@@ -2117,24 +2309,42 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
bScreen *screen= CTX_wm_screen(C);
if(screen->animtimer) {
- ED_screen_animation_timer(C, 0, 0);
+ ED_screen_animation_timer(C, 0, 0, 0);
+ sound_stop_all(C);
}
else {
- /* todo: RNA properties to define play types */
- ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, 1);
+ ScrArea *sa= CTX_wm_area(C);
+ int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1;
+ int sync= -1;
+
+ if(RNA_property_is_set(op->ptr, "sync"))
+ sync= (RNA_boolean_get(op->ptr, "sync"));
- if(screen->animtimer) {
- wmTimer *wt= screen->animtimer;
- ScreenAnimData *sad= wt->customdata;
+ /* 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, sync, mode);
- sad->ar= CTX_wm_region(C);
+ /* update region if TIME_REGION was set, to leftmost 3d window */
+ ED_screen_animation_timer_update(C, stime->redraws);
+ }
+ else {
+ ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, sync, mode);
+
+ if(screen->animtimer) {
+ wmTimer *wt= screen->animtimer;
+ ScreenAnimData *sad= wt->customdata;
+
+ sad->ar= CTX_wm_region(C);
+ }
}
}
return OPERATOR_FINISHED;
}
-void SCREEN_OT_animation_play(wmOperatorType *ot)
+static void SCREEN_OT_animation_play(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Animation player";
@@ -2145,7 +2355,8 @@ void SCREEN_OT_animation_play(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
-
+ RNA_def_boolean(ot->srna, "reverse", 0, "Play in Reverse", "Animation is played backwards");
+ RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate and stay in sync with audio.");
}
/* ************** border select operator (template) ***************************** */
@@ -2183,7 +2394,7 @@ static int border_select_do(bContext *C, wmOperator *op)
return 1;
}
-void SCREEN_OT_border_select(wmOperatorType *ot)
+static void SCREEN_OT_border_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border select";
@@ -2274,48 +2485,117 @@ static ScrArea *find_area_showing_r_result(bContext *C)
return sa;
}
-static void screen_set_image_output(bContext *C)
+static ScrArea *find_area_image_empty(bContext *C)
{
+ bScreen *sc= CTX_wm_screen(C);
ScrArea *sa;
SpaceImage *sima;
- sa= find_area_showing_r_result(C);
+ /* find an imagewindow showing render result */
+ for(sa=sc->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype==SPACE_IMAGE) {
+ sima= sa->spacedata.first;
+ if(!sima->image)
+ break;
+ }
+ }
+ return sa;
+}
+
+#if 0 // XXX not used
+static ScrArea *find_empty_image_area(bContext *C)
+{
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa;
+ SpaceImage *sima;
- if(sa==NULL) {
- /* find largest open non-image area */
- sa= biggest_non_image_area(C);
- if(sa) {
- ED_area_newspace(C, sa, SPACE_IMAGE);
+ /* find an imagewindow showing render result */
+ for(sa=sc->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype==SPACE_IMAGE) {
sima= sa->spacedata.first;
-
- /* makes ESC go back to prev space */
- sima->flag |= SI_PREVSPACE;
+ if(!sima->image)
+ break;
}
- else {
- /* use any area of decent size */
- sa= biggest_area(C);
- if(sa->spacetype!=SPACE_IMAGE) {
- // XXX newspace(sa, SPACE_IMAGE);
+ }
+ return sa;
+}
+#endif // XXX not used
+
+/* new window uses x,y to set position */
+static void screen_set_image_output(bContext *C, int mx, int my)
+{
+ Scene *scene= CTX_data_scene(C);
+ ScrArea *sa;
+ SpaceImage *sima;
+
+ if(scene->r.displaymode==R_OUTPUT_WINDOW) {
+ rcti rect;
+ int sizex, sizey;
+
+ sizex= 10 + (scene->r.xsch*scene->r.size)/100;
+ sizey= 40 + (scene->r.ysch*scene->r.size)/100;
+
+ /* arbitrary... miniature image window views don't make much sense */
+ if(sizex < 320) sizex= 320;
+ if(sizey < 256) sizey= 256;
+
+ /* XXX some magic to calculate postition */
+ rect.xmin= mx + CTX_wm_window(C)->posx - sizex/2;
+ rect.ymin= my + CTX_wm_window(C)->posy - sizey/2;
+ rect.xmax= rect.xmin + sizex;
+ rect.ymax= rect.ymin + sizey;
+
+ /* changes context! */
+ WM_window_open_temp(C, &rect, WM_WINDOW_RENDER);
+
+ sa= CTX_wm_area(C);
+ }
+ else if(scene->r.displaymode==R_OUTPUT_SCREEN) {
+ /* this function returns with changed context */
+ ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE);
+ sa= CTX_wm_area(C);
+ }
+ else {
+
+ sa= find_area_showing_r_result(C);
+ if(sa==NULL)
+ sa= find_area_image_empty(C);
+
+ if(sa==NULL) {
+ /* find largest open non-image area */
+ sa= biggest_non_image_area(C);
+ if(sa) {
+ ED_area_newspace(C, sa, SPACE_IMAGE);
sima= sa->spacedata.first;
/* makes ESC go back to prev space */
sima->flag |= SI_PREVSPACE;
}
+ else {
+ /* use any area of decent size */
+ sa= biggest_area(C);
+ if(sa->spacetype!=SPACE_IMAGE) {
+ // XXX newspace(sa, SPACE_IMAGE);
+ sima= sa->spacedata.first;
+
+ /* makes ESC go back to prev space */
+ sima->flag |= SI_PREVSPACE;
+ }
+ }
}
- }
-
+ }
sima= sa->spacedata.first;
/* get the correct image, and scale it */
sima->image= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result");
- if(G.displaymode==2) { // XXX
- if(sa->full==0) {
- sima->flag |= SI_FULLWINDOW;
+// if(G.displaymode==2) { // XXX
+ if(sa->full) {
+ sima->flag |= SI_FULLWINDOW|SI_PREVSPACE;
- ed_screen_fullarea(C, sa);
+// ed_screen_fullarea(C, sa);
}
- }
+// }
}
@@ -2330,7 +2610,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
}
RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break);
- if(RNA_boolean_get(op->ptr, "anim"))
+ if(RNA_boolean_get(op->ptr, "animation"))
RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step);
else
RE_BlenderFrame(re, scene, scene->r.cfra);
@@ -2361,6 +2641,67 @@ static void render_freejob(void *rjv)
MEM_freeN(rj);
}
+/* str is IMA_RW_MAXTEXT in size */
+static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str)
+{
+ char info_time_str[32]; // used to be extern to header_info.c
+ uintptr_t mem_in_use, mmap_in_use;
+ float megs_used_memory, mmap_used_memory;
+ char *spos= str;
+
+ mem_in_use= MEM_get_memory_in_use();
+ mmap_in_use= MEM_get_mapped_memory_in_use();
+
+ megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0);
+ mmap_used_memory= (mmap_in_use)/(1024.0*1024.0);
+
+ if(scene->lay & 0xFF000000)
+ spos+= sprintf(spos, "Localview | ");
+ else if(scene->r.scemode & R_SINGLE_LAYER)
+ spos+= sprintf(spos, "Single Layer | ");
+
+ if(rs->statstr) {
+ spos+= sprintf(spos, "%s ", rs->statstr);
+ }
+ else {
+ spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface);
+ if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo);
+ if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand);
+ spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory);
+
+ if(rs->curfield)
+ spos+= sprintf(spos, "Field %d ", rs->curfield);
+ if(rs->curblur)
+ spos+= sprintf(spos, "Blur %d ", rs->curblur);
+ }
+
+ BLI_timestr(rs->lastframetime, info_time_str);
+ spos+= sprintf(spos, "Time:%s ", info_time_str);
+
+ if(rs->infostr && rs->infostr[0])
+ spos+= sprintf(spos, "| %s ", rs->infostr);
+
+ /* very weak... but 512 characters is quite safe */
+ if(spos >= str+IMA_RW_MAXTEXT)
+ printf("WARNING! renderwin text beyond limit \n");
+
+}
+
+static void image_renderinfo_cb(void *rjv, RenderStats *rs)
+{
+ RenderJob *rj= rjv;
+
+ /* malloc OK here, stats_draw is not in tile threads */
+ if(rj->image->render_text==NULL)
+ rj->image->render_text= MEM_callocN(IMA_RW_MAXTEXT, "rendertext");
+
+ make_renderinfo_string(rs, rj->scene, rj->image->render_text);
+
+ /* make jobs timer to send notifier */
+ *(rj->do_update)= 1;
+
+}
+
/* called inside thread! */
static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect)
{
@@ -2427,21 +2768,46 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
rectf+= 4*(rr->rectx*ymin + xmin);
rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin);
- for(y1= 0; y1<ymax; y1++) {
- float *rf= rectf;
- char *rc= rectc;
-
- /* XXX temp. because crop offset */
- if( rectc >= (char *)(ibuf->rect)) {
- for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- rc[0]= FTOCHAR(rf[0]);
- rc[1]= FTOCHAR(rf[1]);
- rc[2]= FTOCHAR(rf[2]);
- rc[3]= FTOCHAR(rf[3]);
+ /* XXX make nice consistent functions for this */
+ if (rj->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ for(y1= 0; y1<ymax; y1++) {
+ float *rf= rectf;
+ float srgb[3];
+ char *rc= rectc;
+
+ /* XXX temp. because crop offset */
+ if( rectc >= (char *)(ibuf->rect)) {
+ for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
+ srgb[0]= linearrgb_to_srgb(rf[0]);
+ srgb[1]= linearrgb_to_srgb(rf[1]);
+ srgb[2]= linearrgb_to_srgb(rf[2]);
+
+ rc[0]= FTOCHAR(srgb[0]);
+ rc[1]= FTOCHAR(srgb[1]);
+ rc[2]= FTOCHAR(srgb[2]);
+ rc[3]= FTOCHAR(rf[3]);
+ }
+ }
+ rectf += 4*rr->rectx;
+ rectc += 4*ibuf->x;
+ }
+ } else {
+ for(y1= 0; y1<ymax; y1++) {
+ float *rf= rectf;
+ char *rc= rectc;
+
+ /* XXX temp. because crop offset */
+ if( rectc >= (char *)(ibuf->rect)) {
+ for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
+ rc[0]= FTOCHAR(rf[0]);
+ rc[1]= FTOCHAR(rf[1]);
+ rc[2]= FTOCHAR(rf[2]);
+ rc[3]= FTOCHAR(rf[3]);
+ }
}
+ rectf += 4*rr->rectx;
+ rectc += 4*ibuf->x;
}
- rectf += 4*rr->rectx;
- rectc += 4*ibuf->x;
}
/* make jobs timer to send notifier */
@@ -2499,29 +2865,34 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
RenderJob *rj;
Image *ima;
- /* only one job at a time */
+ /* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
return OPERATOR_CANCELLED;
+ /* stop all running jobs, currently previews frustrate Render */
+ WM_jobs_stop_all(CTX_wm_manager(C));
+
/* handle UI stuff */
WM_cursor_wait(1);
/* flush multires changes (for sculpt) */
multires_force_update(CTX_data_active_object(C));
- // get editmode results
+ /* get editmode results */
+ ED_object_exit_editmode(C, 0); /* 0 = does not exit editmode */
+
// store spare
// get view3d layer, local layer, make this nice api call to render
// store spare
/* ensure at least 1 area shows result */
- screen_set_image_output(C);
+ screen_set_image_output(C, event->x, event->y);
/* job custom data */
rj= MEM_callocN(sizeof(RenderJob), "render job");
rj->scene= scene;
rj->win= CTX_wm_window(C);
- rj->anim= RNA_boolean_get(op->ptr, "anim");
+ rj->anim= RNA_boolean_get(op->ptr, "animation");
rj->iuser.scene= scene;
rj->iuser.ok= 1;
@@ -2540,6 +2911,8 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
re= RE_NewRender(scene->id.name);
RE_test_break_cb(re, rj, render_breakjob);
RE_display_draw_cb(re, rj, image_rect_update);
+ RE_stats_draw_cb(re, rj, image_renderinfo_cb);
+
rj->re= re;
G.afbreek= 0;
@@ -2554,14 +2927,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene);
/* add modal handler for ESC */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
/* contextual render, using current scene, view3d? */
-void SCREEN_OT_render(wmOperatorType *ot)
+static void SCREEN_OT_render(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Render";
@@ -2575,7 +2948,7 @@ void SCREEN_OT_render(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
RNA_def_int(ot->srna, "layers", 0, 0, INT_MAX, "Layers", "", 0, INT_MAX);
- RNA_def_boolean(ot->srna, "anim", 0, "Animation", "");
+ RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
}
/* *********************** cancel render viewer *************** */
@@ -2585,7 +2958,12 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused)
ScrArea *sa= CTX_wm_area(C);
SpaceImage *sima= sa->spacedata.first;
- if(sima->flag & SI_PREVSPACE) {
+ /* test if we have a temp screen in front */
+ if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
+ wm_window_lower(CTX_wm_window(C));
+ }
+ /* determine if render already shows */
+ else if(sima->flag & SI_PREVSPACE) {
sima->flag &= ~SI_PREVSPACE;
if(sima->flag & SI_FULLWINDOW) {
@@ -2603,7 +2981,7 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot)
+static void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Cancel Render View";
@@ -2614,6 +2992,207 @@ void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot)
ot->poll= ED_operator_image_active;
}
+/* *********************** show render viewer *************** */
+
+static int render_view_show_invoke(bContext *C, wmOperator *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) {
+ 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);
+ }
+ else if(sima->next) {
+ ED_area_newspace(C, sa, sima->next->spacetype);
+ ED_area_tag_redraw(sa);
+ }
+ }
+ }
+ else {
+ screen_set_image_output(C, event->x, event->y);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCREEN_OT_render_view_show(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show/Hide Render View";
+ ot->idname= "SCREEN_OT_render_view_show";
+
+ /* api callbacks */
+ ot->invoke= render_view_show_invoke;
+ ot->poll= ED_operator_screenactive;
+}
+
+/* *********** show user pref window ****** */
+
+static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
+{
+ ScrArea *sa;
+ rcti rect;
+ int sizex, sizey;
+
+ sizex= 800;
+ sizey= 480;
+
+ /* some magic to calculate postition */
+ rect.xmin= event->x + CTX_wm_window(C)->posx - sizex/2;
+ rect.ymin= event->y + CTX_wm_window(C)->posy - sizey/2;
+ rect.xmax= rect.xmin + sizex;
+ rect.ymax= rect.ymin + sizey;
+
+ /* changes context! */
+ WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS);
+
+ sa= CTX_wm_area(C);
+
+
+ return OPERATOR_FINISHED;
+}
+
+
+static void SCREEN_OT_userpref_show(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show/Hide User Preferences";
+ ot->idname= "SCREEN_OT_userpref_show";
+
+ /* api callbacks */
+ ot->invoke= userpref_show_invoke;
+ ot->poll= ED_operator_screenactive;
+}
+
+/********************* new screen operator *********************/
+
+static int screen_new_exec(bContext *C, wmOperator *op)
+{
+ wmWindow *win= CTX_wm_window(C);
+ bScreen *sc= CTX_wm_screen(C);
+
+ sc= ED_screen_duplicate(win, sc);
+ WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, sc);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCREEN_OT_new(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New Screen";
+ ot->idname= "SCREEN_OT_new";
+
+ /* api callbacks */
+ ot->exec= screen_new_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* delete screen operator *********************/
+
+static int screen_delete_exec(bContext *C, wmOperator *op)
+{
+ bScreen *sc= CTX_wm_screen(C);
+
+ WM_event_add_notifier(C, NC_SCREEN|ND_SCREENDELETE, sc);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCREEN_OT_delete(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Scene";
+ ot->idname= "SCREEN_OT_delete";
+
+ /* api callbacks */
+ ot->exec= screen_delete_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* new scene operator *********************/
+
+static int scene_new_exec(bContext *C, wmOperator *op)
+{
+ Scene *newscene, *scene= CTX_data_scene(C);
+ Main *bmain= CTX_data_main(C);
+ int type= RNA_enum_get(op->ptr, "type");
+
+ newscene= copy_scene(bmain, scene, type);
+
+ /* these can't be handled in blenkernel curently, so do them here */
+ if(type == SCE_COPY_LINK_DATA)
+ ED_object_single_users(newscene, 0);
+ else if(type == SCE_COPY_FULL)
+ ED_object_single_users(newscene, 1);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCENE_OT_new(wmOperatorType *ot)
+{
+ static EnumPropertyItem type_items[]= {
+ {SCE_COPY_EMPTY, "EMPTY", 0, "Empty", "Add empty scene."},
+ {SCE_COPY_LINK_OB, "LINK_OBJECTS", 0, "Link Objects", "Link to the objects from the current scene."},
+ {SCE_COPY_LINK_DATA, "LINK_OBJECT_DATA", 0, "Link Object Data", "Copy objects linked to data from the current scene."},
+ {SCE_COPY_FULL, "FULL_COPY", 0, "Full Copy", "Make a full copy of the current scene."},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "New Scene";
+ ot->idname= "SCENE_OT_new";
+
+ /* api callbacks */
+ ot->exec= scene_new_exec;
+ ot->invoke= WM_menu_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
+}
+
+/********************* delete scene operator *********************/
+
+static int scene_delete_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_SCENEDELETE, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCENE_OT_delete(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Scene";
+ ot->idname= "SCENE_OT_delete";
+
+ /* api callbacks */
+ ot->exec= scene_delete_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
/* **************** Assigning operatortypes to global list, adding handlers **************** */
@@ -2640,34 +3219,70 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_screen_full_area);
WM_operatortype_append(SCREEN_OT_screenshot);
WM_operatortype_append(SCREEN_OT_screencast);
+ WM_operatortype_append(SCREEN_OT_userpref_show);
/*frame changes*/
WM_operatortype_append(SCREEN_OT_frame_offset);
+ WM_operatortype_append(SCREEN_OT_frame_jump);
+ WM_operatortype_append(SCREEN_OT_keyframe_jump);
+
WM_operatortype_append(SCREEN_OT_animation_step);
WM_operatortype_append(SCREEN_OT_animation_play);
/* render */
WM_operatortype_append(SCREEN_OT_render);
WM_operatortype_append(SCREEN_OT_render_view_cancel);
-
+ WM_operatortype_append(SCREEN_OT_render_view_show);
+
+ /* new/delete */
+ WM_operatortype_append(SCREEN_OT_new);
+ WM_operatortype_append(SCREEN_OT_delete);
+ WM_operatortype_append(SCENE_OT_new);
+ WM_operatortype_append(SCENE_OT_delete);
+
/* tools shared by more space types */
WM_operatortype_append(ED_OT_undo);
WM_operatortype_append(ED_OT_redo);
}
+static void keymap_modal_set(wmWindowManager *wm)
+{
+ static EnumPropertyItem modal_items[] = {
+ {KM_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+ {KM_MODAL_APPLY, "APPLY", 0, "Apply", ""},
+ {KM_MODAL_STEP10, "STEP10", 0, "Steps on", ""},
+ {KM_MODAL_STEP10_OFF, "STEP10_OFF", 0, "Steps off", ""},
+ {0, NULL, 0, NULL, NULL}};
+ wmKeyMap *keymap;
+
+ /* Standard Modal keymap ------------------------------------------------ */
+ keymap= WM_modalkeymap_add(wm, "Standard Modal Map", modal_items);
+
+ WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_CANCEL);
+ WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, KM_MODAL_APPLY);
+ WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY);
+ WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KM_MODAL_APPLY);
+
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, KM_MODAL_STEP10);
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, KM_MODAL_STEP10_OFF);
+
+ WM_modalkeymap_assign(keymap, "SCREEN_OT_area_move");
+
+}
+
/* called in spacetypes.c */
void ED_keymap_screen(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Screen", 0, 0);
+ wmKeyMap *keymap;
- /* standard timers */
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_step", TIMER0, KM_ANY, KM_ANY, 0);
+ /* Screen Editing ------------------------------------------------ */
+ keymap= WM_keymap_find(wm, "Screen Editing", 0, 0);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "modifier", 0);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "modifier", 1);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "modifier", 2);
-
+
/* screen tools */
WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE_AREA, 0, 0, 0);
WM_keymap_verify_item(keymap, "SCREEN_OT_area_join", EVT_ACTIONZONE_AREA, 0, 0, 0);
@@ -2676,12 +3291,19 @@ void ED_keymap_screen(wmWindowManager *wm)
WM_keymap_verify_item(keymap, "SCREEN_OT_region_scale", EVT_ACTIONZONE_REGION, 0, 0, 0);
/* area move after action zones */
WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
+
+
+ /* Screen General ------------------------------------------------ */
+ keymap= WM_keymap_find(wm, "Screen", 0, 0);
+
+ /* standard timers */
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_step", TIMER0, KM_ANY, KM_ANY, 0);
+
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0);
@@ -2690,34 +3312,62 @@ void ED_keymap_screen(wmWindowManager *wm)
WM_keymap_add_item(keymap, "SCREEN_OT_region_foursplit", SKEY, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
WM_keymap_verify_item(keymap, "SCREEN_OT_repeat_history", F3KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "SCREEN_OT_repeat_last", F4KEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "SCREEN_OT_repeat_last", RKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "SCREEN_OT_region_flip", F5KEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "SCREEN_OT_redo_last", F6KEY, KM_PRESS, 0, 0);
- RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", F7KEY, KM_PRESS, 0, 0)->ptr, "filename", "test.py");
+ RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", F7KEY, KM_PRESS, 0, 0)->ptr, "path", "test.py");
WM_keymap_verify_item(keymap, "SCRIPT_OT_python_run_ui_scripts", F8KEY, KM_PRESS, 0, 0);
/* files */
- WM_keymap_add_item(keymap, "FILE_OT_exec", RETKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_execute", RETKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_cancel", ESCKEY, KM_PRESS, 0, 0);
/* undo */
- WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_CTRL, 0);
+ #ifdef __APPLE__
WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0);
+ #endif
+ WM_keymap_add_item(keymap, "ED_OT_undo", ZKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ED_OT_redo", ZKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+
/* render */
WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1);
WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0);
+
+ /* user prefs */
+ #ifdef __APPLE__
+ WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", COMMAKEY, KM_PRESS, KM_OSKEY, 0);
+ #endif
+ WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", COMMAKEY, KM_PRESS, KM_CTRL, 0);
+
+
+ /* Anim Playback ------------------------------------------------ */
+ keymap= WM_keymap_find(wm, "Frames", 0, 0);
- /* frame offsets & play */
- keymap= WM_keymap_listbase(wm, "Frames", 0, 0);
+ /* frame offsets */
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 10);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -10);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1);
RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
- WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0);
+
+ WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEUPKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEDOWNKEY, KM_PRESS, KM_CTRL, 0)->ptr, "next", 0);
+
+ /* play (forward and backwards) */
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", KKEY, KM_PRESS, 0, LKEY);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1);
+
+ keymap_modal_set(wm);
}
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 81da74217ec..fb3da4a5353 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -73,24 +73,24 @@ static int screenshot_exec(bContext *C, wmOperator *op)
if(scd && scd->dumprect) {
Scene *scene= CTX_data_scene(C);
ImBuf *ibuf;
- char filename[FILE_MAX];
+ char path[FILE_MAX];
- RNA_string_get(op->ptr, "filename", filename);
+ RNA_string_get(op->ptr, "path", path);
- strcpy(G.ima, filename);
- BLI_convertstringcode(filename, G.sce);
+ strcpy(G.ima, path);
+ BLI_convertstringcode(path, G.sce);
/* BKE_add_image_extension() checks for if extension was already set */
if(scene->r.scemode & R_EXTENSION)
- if(strlen(filename)<FILE_MAXDIR+FILE_MAXFILE-5)
- BKE_add_image_extension(scene, filename, scene->r.imtype);
+ if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
+ BKE_add_image_extension(scene, path, scene->r.imtype);
ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0, 0);
ibuf->rect= scd->dumprect;
if(scene->r.planes == 8) IMB_cspace(ibuf, rgb_to_bw);
- BKE_write_ibuf(scene, ibuf, filename, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
IMB_freeImBuf(ibuf);
@@ -149,10 +149,10 @@ static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
scd->dumprect= dumprect;
op->customdata= scd;
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return screenshot_exec(C, op);
- RNA_string_set(op->ptr, "filename", G.ima);
+ RNA_string_set(op->ptr, "path", G.ima);
WM_event_add_fileselect(C, op);
@@ -173,7 +173,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
ot->flag= 0;
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL);
RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
}
@@ -228,7 +228,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update)
rd.frs_sec_base= 1.0f;
if(BKE_imtype_is_movie(rd.imtype))
- mh->start_movie(&rd, sj->dumpsx, sj->dumpsy);
+ mh->start_movie(sj->scene, &rd, sj->dumpsx, sj->dumpsy);
else
mh= NULL;
@@ -242,7 +242,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update)
if(sj->dumprect) {
if(mh) {
- mh->append_movie(&rd, cfra, sj->dumprect, sj->dumpsx, sj->dumpsy);
+ mh->append_movie(&rd, cfra, (int *)sj->dumprect, sj->dumpsx, sj->dumpsy);
printf("Append frame %d\n", cfra);
}
else {
@@ -327,7 +327,7 @@ void SCREEN_OT_screencast(wmOperatorType *ot)
ot->flag= 0;
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
+ RNA_def_property(ot->srna, "path", PROP_STRING, PROP_FILEPATH);
RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
}
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index a163ef5f8e2..d223c423690 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -71,6 +71,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
+#include "BKE_paint.h"
#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_report.h"
@@ -624,19 +625,6 @@ static void BarycentricWeightsPersp2f(float pt[2], float v1[4], float v2[4], flo
w[0] = w[1] = w[2] = 1.0f/3.0f;
}
-static void VecWeightf(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
-{
- p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
- p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
- p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2];
-}
-
-static void Vec2Weightf(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3])
-{
- p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
- p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
-}
-
static float VecZDepthOrtho(float pt[2], float v1[3], float v2[3], float v3[3], float w[3])
{
BarycentricWeights2f(pt, v1, v2, v3, w);
@@ -745,10 +733,10 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
tf = ps->dm_mtface + face_index;
if (side == 0) {
- Vec2Weightf(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
+ Vec2Lerp3f(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
}
else { /* QUAD */
- Vec2Weightf(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
+ Vec2Lerp3f(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
}
ibuf = tf->tpage->ibufs.first; /* we must have got the imbuf before getting here */
@@ -869,8 +857,8 @@ static int project_paint_occlude_ptv_clip(
}
/* Test if we're in the clipped area, */
- if (side) VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
- else VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
+ if (side) VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
+ else VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
Mat4MulVecfl(ps->ob->obmat, wco);
if(!view3d_test_clipping(ps->rv3d, wco)) {
@@ -1145,19 +1133,6 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
return 1;
}
-/* TODO - move to arithb.c */
-/* Converts an angle to a length that can be used for maintaining an even margin around UV's */
-static float angleToLength(float angle)
-{
- // already accounted for
- if (angle < 0.000001f) {
- return 1.0f;
- }
- else {
- return fabsf(1.0f / cosf(angle * (M_PI/180.0f)));
- }
-}
-
/* Calculate outset UV's, this is not the same as simply scaling the UVs,
* since the outset coords are a margin that keep an even distance from the original UV's,
* note that the image aspect is taken into account */
@@ -1203,15 +1178,15 @@ static void uv_image_outset(float (*orig_uv)[2], float (*outset_uv)[2], const fl
}
if (is_quad) {
- a1 = angleToLength(NormalizedVecAngle2_2D(dir4, dir1));
- a2 = angleToLength(NormalizedVecAngle2_2D(dir1, dir2));
- a3 = angleToLength(NormalizedVecAngle2_2D(dir2, dir3));
- a4 = angleToLength(NormalizedVecAngle2_2D(dir3, dir4));
+ a1 = AngleToLength(NormalizedVecAngle2_2D(dir4, dir1));
+ a2 = AngleToLength(NormalizedVecAngle2_2D(dir1, dir2));
+ a3 = AngleToLength(NormalizedVecAngle2_2D(dir2, dir3));
+ a4 = AngleToLength(NormalizedVecAngle2_2D(dir3, dir4));
}
else {
- a1 = angleToLength(NormalizedVecAngle2_2D(dir3, dir1));
- a2 = angleToLength(NormalizedVecAngle2_2D(dir1, dir2));
- a3 = angleToLength(NormalizedVecAngle2_2D(dir2, dir3));
+ a1 = AngleToLength(NormalizedVecAngle2_2D(dir3, dir1));
+ a2 = AngleToLength(NormalizedVecAngle2_2D(dir1, dir2));
+ a3 = AngleToLength(NormalizedVecAngle2_2D(dir2, dir3));
}
if (is_quad) {
@@ -1328,7 +1303,7 @@ static void screen_px_from_ortho(
float w[3])
{
BarycentricWeights2f(uv, uv1co, uv2co, uv3co, w);
- VecWeightf(pixelScreenCo, v1co, v2co, v3co, w);
+ VecLerp3f(pixelScreenCo, v1co, v2co, v3co, w);
}
/* same as screen_px_from_ortho except we need to take into account
@@ -1362,7 +1337,7 @@ static void screen_px_from_persp(
}
/* done re-weighting */
- VecWeightf(pixelScreenCo, v1co, v2co, v3co, w);
+ VecLerp3f(pixelScreenCo, v1co, v2co, v3co, w);
}
static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const float w[3], int side, unsigned char rgba_ub[4], float rgba_f[4])
@@ -1380,7 +1355,7 @@ static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const
uvCo3 = (float *)tf_other->uv[2];
}
- Vec2Weightf(uv_other, uvCo1, uvCo2, uvCo3, w);
+ Vec2Lerp3f(uv_other, uvCo1, uvCo2, uvCo3, w);
/* use */
uvco_to_wrapped_pxco(uv_other, ibuf_other->x, ibuf_other->y, &x, &y);
@@ -1915,22 +1890,22 @@ static void rect_to_uvspace_ortho(
uv[0] = bucket_bounds->xmax;
uv[1] = bucket_bounds->ymin;
BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
//uv[0] = bucket_bounds->xmax; // set above
uv[1] = bucket_bounds->ymax;
BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
uv[0] = bucket_bounds->xmin;
//uv[1] = bucket_bounds->ymax; // set above
BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
//uv[0] = bucket_bounds->xmin; // set above
uv[1] = bucket_bounds->ymin;
BarycentricWeights2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
}
/* same as above but use BarycentricWeightsPersp2f */
@@ -1949,22 +1924,22 @@ static void rect_to_uvspace_persp(
uv[0] = bucket_bounds->xmax;
uv[1] = bucket_bounds->ymin;
BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
//uv[0] = bucket_bounds->xmax; // set above
uv[1] = bucket_bounds->ymax;
BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
uv[0] = bucket_bounds->xmin;
//uv[1] = bucket_bounds->ymax; // set above
BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
//uv[0] = bucket_bounds->xmin; // set above
uv[1] = bucket_bounds->ymin;
BarycentricWeightsPersp2f(uv, v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
}
/* This works as we need it to but we can save a few steps and not use it */
@@ -2208,13 +2183,13 @@ static void project_bucket_clip_face(
if (is_ortho) {
for(i=0; i<(*tot); i++) {
BarycentricWeights2f(isectVCosSS[i], v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
}
}
else {
for(i=0; i<(*tot); i++) {
BarycentricWeightsPersp2f(isectVCosSS[i], v1coSS, v2coSS, v3coSS, w);
- Vec2Weightf(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
+ Vec2Lerp3f(bucket_bounds_uv[i], uv1co, uv2co, uv3co, w);
}
}
}
@@ -2469,7 +2444,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
/* a pitty we need to get the worldspace pixel location here */
if(ps->rv3d->rflag & RV3D_CLIPPING) {
- VecWeightf(wco, ps->dm_mvert[ (*(&mf->v1 + i1)) ].co, ps->dm_mvert[ (*(&mf->v1 + i2)) ].co, ps->dm_mvert[ (*(&mf->v1 + i3)) ].co, w);
+ VecLerp3f(wco, ps->dm_mvert[ (*(&mf->v1 + i1)) ].co, ps->dm_mvert[ (*(&mf->v1 + i2)) ].co, ps->dm_mvert[ (*(&mf->v1 + i3)) ].co, w);
Mat4MulVecfl(ps->ob->obmat, wco);
if(view3d_test_clipping(ps->rv3d, wco)) {
continue; /* Watch out that no code below this needs to run */
@@ -2685,8 +2660,8 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
/* a pitty we need to get the worldspace pixel location here */
if(ps->rv3d->rflag & RV3D_CLIPPING) {
- if (side) VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
- else VecWeightf(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
+ if (side) VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, w);
+ else VecLerp3f(wco, ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co, ps->dm_mvert[mf->v3].co, w);
Mat4MulVecfl(ps->ob->obmat, wco);
if(view3d_test_clipping(ps->rv3d, wco)) {
@@ -2763,7 +2738,7 @@ static void project_bucket_bounds(const ProjPaintState *ps, const int bucket_x,
static void project_bucket_init(const ProjPaintState *ps, const int thread_index, const int bucket_index, rctf *bucket_bounds)
{
LinkNode *node;
- int face_index, image_index;
+ int face_index, image_index=0;
ImBuf *ibuf = NULL;
MTFace *tf;
@@ -2820,7 +2795,7 @@ static int project_bucket_face_isect(ProjPaintState *ps, float min[2], float max
/* TODO - replace this with a tricker method that uses sideofline for all screenCoords's edges against the closest bucket corner */
rctf bucket_bounds;
float p1[2], p2[2], p3[2], p4[2];
- float *v, *v1,*v2,*v3,*v4;
+ float *v, *v1,*v2,*v3,*v4=NULL;
int fidx;
project_bucket_bounds(ps, bucket_x, bucket_y, &bucket_bounds);
@@ -3194,7 +3169,7 @@ static void project_paint_begin(ProjPaintState *ps)
if (tf->tpage && ((G.f & G_FACESELECT)==0 || mf->flag & ME_FACE_SEL)) {
- float *v1coSS, *v2coSS, *v3coSS, *v4coSS;
+ float *v1coSS, *v2coSS, *v3coSS, *v4coSS=NULL;
v1coSS = ps->screenCoords[mf->v1];
v2coSS = ps->screenCoords[mf->v2];
@@ -3339,7 +3314,7 @@ static void project_paint_end(ProjPaintState *ps)
/* context */
ProjPaintImage *last_projIma;
int last_image_index = -1;
- int last_tile_width;
+ int last_tile_width=0;
for(a=0, last_projIma=ps->projImages; a < ps->image_tot; a++, last_projIma++) {
int size = sizeof(UndoTile **) * IMAPAINT_TILE_NUMBER(last_projIma->ibuf->x) * IMAPAINT_TILE_NUMBER(last_projIma->ibuf->y);
@@ -3703,10 +3678,10 @@ static void *do_projectpaint_thread(void *ph_v)
ProjPixel *projPixel;
int last_index = -1;
- ProjPaintImage *last_projIma;
+ ProjPaintImage *last_projIma= NULL;
ImagePaintPartialRedraw *last_partial_redraw_cell;
- float rgba[4], alpha, dist_nosqrt;
+ float rgba[4], alpha, dist_nosqrt, dist;
float brush_size_sqared;
float falloff;
@@ -3720,6 +3695,7 @@ static void *do_projectpaint_thread(void *ph_v)
float co[2];
float mask = 1.0f; /* airbrush wont use mask */
unsigned short mask_short;
+ float size_half = ((float)ps->brush->size) * 0.5f;
LinkNode *smearPixels = NULL;
LinkNode *smearPixels_f = NULL;
@@ -3754,8 +3730,8 @@ static void *do_projectpaint_thread(void *ph_v)
dist_nosqrt = Vec2Lenf_nosqrt(projPixel->projCoSS, pos);
/*if (dist < s->brush->size) {*/ /* correct but uses a sqrtf */
- if (dist_nosqrt < brush_size_sqared) {
- falloff = brush_sample_falloff_noalpha(ps->brush, sqrtf(dist_nosqrt));
+ if (dist_nosqrt < brush_size_sqared && (dist=sqrtf(dist_nosqrt)) < size_half) {
+ falloff = brush_curve_strength_clamp(ps->brush, dist, size_half);
if (falloff > 0.0f) {
if (ps->is_texbrush) {
brush_sample_tex(ps->brush, projPixel->projCoSS, rgba);
@@ -4023,7 +3999,7 @@ static void imapaint_image_update(SpaceImage *sima, Image *image, ImBuf *ibuf, s
if(texpaint || (sima && sima->lock)) {
int w = imapaintpartial.x2 - imapaintpartial.x1;
int h = imapaintpartial.y2 - imapaintpartial.y1;
- GPU_paint_update_image(image, imapaintpartial.x1, imapaintpartial.y1, w, h);
+ GPU_paint_update_image(image, imapaintpartial.x1, imapaintpartial.y1, w, h, !texpaint);
}
}
@@ -4375,22 +4351,23 @@ static Brush *image_paint_brush(bContext *C)
Scene *scene= CTX_data_scene(C);
ToolSettings *settings= scene->toolsettings;
- return settings->imapaint.brush;
+ return paint_brush(&settings->imapaint.paint);
}
static int image_paint_poll(bContext *C)
{
+ Object *obact = CTX_data_active_object(C);
+
if(!image_paint_brush(C))
return 0;
- if((G.f & G_TEXTUREPAINT) && CTX_wm_region_view3d(C)) {
+ if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) && CTX_wm_region_view3d(C)) {
return 1;
}
else {
- ScrArea *sa= CTX_wm_area(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
- if(sa && sa->spacetype==SPACE_IMAGE) {
+ if(sima) {
ARegion *ar= CTX_wm_region(C);
if((sima->flag & SI_DRAWTOOL) && ar->regiontype==RGN_TYPE_WINDOW)
@@ -4440,6 +4417,7 @@ typedef struct PaintOperation {
int first;
int prevmouse[2];
+ float prev_pressure; /* need this since we dont get tablet events for pressure change */
int brush_size_orig;
double starttime;
@@ -4485,11 +4463,12 @@ static void paint_redraw(bContext *C, ImagePaintState *s, int final)
}
}
-static int paint_init(bContext *C, wmOperator *op)
+static int texture_paint_init(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
ToolSettings *settings= scene->toolsettings;
PaintOperation *pop;
+ Brush *brush;
pop= MEM_callocN(sizeof(PaintOperation), "PaintOperation");
pop->first= 1;
@@ -4507,7 +4486,7 @@ static int paint_init(bContext *C, wmOperator *op)
view3d_set_viewcontext(C, &pop->vc);
}
else {
- pop->s.sima= (SpaceImage*)CTX_wm_space_data(C);
+ pop->s.sima= CTX_wm_space_image(C);
pop->s.v2d= &CTX_wm_region(C)->v2d;
}
@@ -4517,10 +4496,11 @@ static int paint_init(bContext *C, wmOperator *op)
pop->ps.ar= CTX_wm_region(C);
/* intialize brush */
- if(!settings->imapaint.brush)
+ brush= paint_brush(&settings->imapaint.paint);
+ if(!brush)
return 0;
- pop->s.brush = settings->imapaint.brush;
+ pop->s.brush = brush;
pop->s.tool = settings->imapaint.tool;
if(pop->mode == PAINT_MODE_3D && (pop->s.tool == PAINT_TOOL_CLONE))
pop->s.tool = PAINT_TOOL_DRAW;
@@ -4608,11 +4588,13 @@ static int paint_init(bContext *C, wmOperator *op)
static void paint_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
{
PaintOperation *pop= op->customdata;
- float time;
+ float time, mousef[2];
float pressure;
int mouse[2], redraw;
- RNA_int_get_array(itemptr, "mouse", mouse);
+ RNA_float_get_array(itemptr, "mouse", mousef);
+ mouse[0] = mousef[0];
+ mouse[1] = mousef[1];
time= RNA_float_get(itemptr, "time");
pressure= RNA_float_get(itemptr, "pressure");
@@ -4671,7 +4653,7 @@ static void paint_exit(bContext *C, wmOperator *op)
static int paint_exec(bContext *C, wmOperator *op)
{
- if(!paint_init(C, op)) {
+ if(!texture_paint_init(C, op)) {
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
@@ -4692,7 +4674,7 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event)
PaintOperation *pop= op->customdata;
wmTabletData *wmtab;
PointerRNA itemptr;
- float pressure;
+ float pressure, mousef[2];
double time;
int tablet, mouse[2];
@@ -4713,10 +4695,10 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event)
tablet= (wmtab->Active != EVT_TABLET_NONE);
pressure= wmtab->Pressure;
if(wmtab->Active == EVT_TABLET_ERASER)
- pop->s.blend= BRUSH_BLEND_ERASE_ALPHA;
+ pop->s.blend= IMB_BLEND_ERASE_ALPHA;
}
- else
- pressure= 1.0f;
+ else /* otherwise airbrush becomes 1.0 pressure instantly */
+ pressure= pop->prev_pressure ? pop->prev_pressure : 1.0f;
if(pop->first) {
pop->prevmouse[0]= mouse[0];
@@ -4725,27 +4707,30 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event)
/* special exception here for too high pressure values on first touch in
windows for some tablets, then we just skip first touch .. */
- if ((pop->s.brush->flag & (BRUSH_ALPHA_PRESSURE|BRUSH_SIZE_PRESSURE|
- BRUSH_SPACING_PRESSURE|BRUSH_RAD_PRESSURE)) && tablet && (pressure >= 0.99f))
+ if ((pop->s.brush->flag & (BRUSH_ALPHA_PRESSURE|BRUSH_SIZE_PRESSURE|BRUSH_SPACING_PRESSURE)) && tablet && (pressure >= 0.99f))
return;
}
/* fill in stroke */
RNA_collection_add(op->ptr, "stroke", &itemptr);
- RNA_int_set_array(&itemptr, "mouse", mouse);
+ mousef[0] = mouse[0];
+ mousef[1] = mouse[1];
+ RNA_float_set_array(&itemptr, "mouse", mousef);
RNA_float_set(&itemptr, "time", (float)(time - pop->starttime));
RNA_float_set(&itemptr, "pressure", pressure);
/* apply */
paint_apply(C, op, &itemptr);
+
+ pop->prev_pressure= pressure;
}
static int paint_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
PaintOperation *pop;
- if(!paint_init(C, op)) {
+ if(!texture_paint_init(C, op)) {
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
@@ -4753,7 +4738,7 @@ static int paint_invoke(bContext *C, wmOperator *op, wmEvent *event)
paint_apply_event(C, op, event);
pop= op->customdata;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
if(pop->s.brush->flag & BRUSH_AIRBRUSH)
pop->timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER, 0.01f);
@@ -4804,7 +4789,7 @@ void PAINT_OT_image_paint(wmOperatorType *ot)
ot->poll= image_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* properties */
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
@@ -4815,7 +4800,7 @@ static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
RegionView3D *rv3d= CTX_wm_region_view3d(C);
if(!rv3d) {
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
ED_space_image_zoom(sima, ar, zoomx, zoomy);
@@ -4873,7 +4858,7 @@ static int paint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *eve
ToolSettings *ts = CTX_data_scene(C)->toolsettings;
get_imapaint_zoom(C, &zoom, &zoom);
toggle_paint_cursor(C, !ts->imapaint.paintcursor);
- brush_radial_control_invoke(op, ts->imapaint.brush, 0.5 * zoom);
+ brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 0.5 * zoom);
return WM_radial_control_invoke(C, op, event);
}
@@ -4888,12 +4873,15 @@ static int paint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *even
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];
get_imapaint_zoom(C, &zoom, &zoom);
- ret = brush_radial_control_exec(op, CTX_data_scene(C)->toolsettings->imapaint.brush, 2.0 / zoom);
+ ret = brush_radial_control_exec(op, brush, 2.0 / zoom);
WM_radial_control_string(op, str, 256);
+
+ WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
return ret;
}
@@ -4911,7 +4899,7 @@ void PAINT_OT_image_paint_radial_control(wmOperatorType *ot)
ot->poll= image_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
/************************ grab clone operator ************************/
@@ -4952,7 +4940,7 @@ static int grab_clone_invoke(bContext *C, wmOperator *op, wmEvent *event)
cmv->starty= event->y;
op->customdata= cmv;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -5010,7 +4998,7 @@ void PAINT_OT_grab_clone(wmOperatorType *ot)
ot->poll= image_paint_2d_clone_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* properties */
RNA_def_float_vector(ot->srna, "delta", 2, NULL, -FLT_MAX, FLT_MAX, "Delta", "Delta offset of clone image in 0.0..1.0 coordinates.", -1.0f, 1.0f);
@@ -5145,13 +5133,13 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
me= get_mesh(ob);
- if(!(G.f & G_TEXTUREPAINT) && !me) {
+ if(!(ob->mode & OB_MODE_TEXTURE_PAINT) && !me) {
BKE_report(op->reports, RPT_ERROR, "Can only enter texture paint mode for mesh objects.");
return OPERATOR_CANCELLED;
}
- if(G.f & G_TEXTUREPAINT) {
- G.f &= ~G_TEXTUREPAINT;
+ if(ob->mode & OB_MODE_TEXTURE_PAINT) {
+ ob->mode &= ~OB_MODE_TEXTURE_PAINT;
if(U.glreslimit != 0)
GPU_free_images();
@@ -5160,13 +5148,13 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
toggle_paint_cursor(C, 0);
}
else {
- G.f |= G_TEXTUREPAINT;
+ ob->mode |= OB_MODE_TEXTURE_PAINT;
if(me->mtface==NULL)
me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT,
NULL, me->totface);
- brush_check_exists(&scene->toolsettings->imapaint.brush);
+ paint_init(&scene->toolsettings->imapaint.paint, PAINT_CURSOR_TEXTURE_PAINT);
if(U.glreslimit != 0)
GPU_free_images();
@@ -5175,7 +5163,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
toggle_paint_cursor(C, 1);
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
return OPERATOR_FINISHED;
@@ -5201,28 +5189,36 @@ static int texture_paint_radial_control_invoke(bContext *C, wmOperator *op, wmEv
{
ToolSettings *ts = CTX_data_scene(C)->toolsettings;
toggle_paint_cursor(C, !ts->imapaint.paintcursor);
- brush_radial_control_invoke(op, ts->imapaint.brush, 0.5);
+ brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), 0.5);
return WM_radial_control_invoke(C, op, event);
}
static int texture_paint_radial_control_exec(bContext *C, wmOperator *op)
{
- int ret = brush_radial_control_exec(op, CTX_data_scene(C)->toolsettings->imapaint.brush, 2);
+ Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
+ int ret = brush_radial_control_exec(op, brush, 2);
char str[256];
WM_radial_control_string(op, str, 256);
+ WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
+
return ret;
}
static int texture_paint_poll(bContext *C)
{
if(texture_paint_toggle_poll(C))
- if(G.f & G_TEXTUREPAINT)
+ if(CTX_data_active_object(C)->mode & OB_MODE_TEXTURE_PAINT)
return 1;
return 0;
}
+int image_texture_paint_poll(bContext *C)
+{
+ return (texture_paint_poll(C) || image_paint_poll(C));
+}
+
void PAINT_OT_texture_paint_radial_control(wmOperatorType *ot)
{
WM_OT_radial_control_partial(ot);
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index b630975c934..8251d1a5a1a 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -29,14 +29,40 @@
#ifndef ED_PAINT_INTERN_H
#define ED_PAINT_INTERN_H
+struct bContext;
struct Scene;
struct Object;
struct Mesh;
+struct PaintStroke;
+struct PointerRNA;
struct ViewContext;
+struct wmEvent;
+struct wmOperator;
struct wmOperatorType;
struct ARegion;
+/* paint_stroke.c */
+typedef int (*StrokeTestStart)(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+typedef void (*StrokeUpdateStep)(struct bContext *C, struct PaintStroke *stroke, struct PointerRNA *itemptr);
+typedef void (*StrokeDone)(struct bContext *C, struct PaintStroke *stroke);
+
+struct PaintStroke *paint_stroke_new(bContext *C, StrokeTestStart test_start,
+ StrokeUpdateStep update_step, StrokeDone done);
+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);
+void *paint_stroke_mode_data(struct PaintStroke *stroke);
+void paint_stroke_set_mode_data(struct PaintStroke *stroke, void *mode_data);
+int paint_poll(bContext *C);
+void paint_cursor_start(struct bContext *C, int (*poll)(struct bContext *C));
+
/* paint_vertex.c */
+int weight_paint_poll(struct bContext *C);
+int vertex_paint_poll(struct bContext *C);
+int vertex_paint_mode_poll(struct bContext *C);
+
+void clear_vpaint(Scene *scene, int selected);
+
void PAINT_OT_weight_paint_toggle(struct wmOperatorType *ot);
void PAINT_OT_weight_paint_radial_control(struct wmOperatorType *ot);
void PAINT_OT_weight_paint(struct wmOperatorType *ot);
@@ -46,6 +72,8 @@ void PAINT_OT_vertex_paint_toggle(struct wmOperatorType *ot);
void PAINT_OT_vertex_paint(struct wmOperatorType *ot);
/* paint_image.c */
+int image_texture_paint_poll(struct bContext *C);
+
void PAINT_OT_image_paint(struct wmOperatorType *ot);
void PAINT_OT_image_paint_radial_control(struct wmOperatorType *ot);
void PAINT_OT_grab_clone(struct wmOperatorType *ot);
@@ -59,6 +87,7 @@ int imapaint_pick_face(struct ViewContext *vc, struct Mesh *me, int *mval, unsig
void imapaint_pick_uv(struct Scene *scene, struct Object *ob, struct Mesh *mesh, 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);
#endif /* ED_PAINT_INTERN_H */
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index e9263ddabf0..514c80d929d 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -1,15 +1,118 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "DNA_brush_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_brush.h"
+#include "BKE_context.h"
+#include "BKE_paint.h"
#include "ED_sculpt.h"
+#include "UI_resources.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
#include "paint_intern.h"
+#include "sculpt_intern.h"
+
+#include <string.h>
+
+/* Brush operators */
+static int brush_add_exec(bContext *C, wmOperator *op)
+{
+ /*int type = RNA_enum_get(op->ptr, "type");*/
+ Brush *br = NULL;
+
+ br = add_brush("Brush");
+
+ if(br)
+ paint_brush_set(paint_get_active(CTX_data_scene(C)), br);
+
+ return OPERATOR_FINISHED;
+}
+
+static EnumPropertyItem brush_type_items[] = {
+ {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt", ""},
+ {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
+ {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
+ {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+void BRUSH_OT_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Brush";
+ ot->description= "Add brush by mode type.";
+ ot->idname= "BRUSH_OT_add";
+
+ /* api callbacks */
+ ot->exec= brush_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", brush_type_items, OB_MODE_VERTEX_PAINT, "Type", "Which paint mode to create the brush for.");
+}
+
+static int vertex_color_set_exec(bContext *C, wmOperator *op)
+{
+ int selected = RNA_boolean_get(op->ptr, "selected");
+ Scene *scene = CTX_data_scene(C);
+
+ clear_vpaint(scene, selected);
+
+ return OPERATOR_FINISHED;
+}
+
+void PAINT_OT_vertex_color_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Vertex Colors";
+ ot->idname= "PAINT_OT_vertex_color_set";
+
+ /* api callbacks */
+ ot->exec= vertex_color_set_exec;
+ ot->poll= vertex_paint_mode_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "selected", 0, "Type", "Only color selected faces.");
+}
/**************************** registration **********************************/
void ED_operatortypes_paint(void)
{
+ /* brush */
+ WM_operatortype_append(BRUSH_OT_add);
+ WM_operatortype_append(BRUSH_OT_curve_preset);
+
/* image */
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
WM_operatortype_append(PAINT_OT_texture_paint_radial_control);
@@ -28,5 +131,51 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(PAINT_OT_vertex_paint_radial_control);
WM_operatortype_append(PAINT_OT_vertex_paint_toggle);
WM_operatortype_append(PAINT_OT_vertex_paint);
+ WM_operatortype_append(PAINT_OT_vertex_color_set);
+}
+
+void ED_keymap_paint(wmWindowManager *wm)
+{
+ wmKeyMap *keymap;
+
+ /* Sculpt mode */
+ keymap= WM_keymap_find(wm, "Sculpt", 0, 0);
+ keymap->poll= sculpt_poll;
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
+ 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);
+
+ WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
+
+ /* Vertex Paint mode */
+ keymap= WM_keymap_find(wm, "Vertex Paint", 0, 0);
+ keymap->poll= vertex_paint_poll;
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
+ WM_keymap_verify_item(keymap, "PAINT_OT_vertex_paint", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_sample_color", RIGHTMOUSE, KM_PRESS, 0, 0);
+
+ /* Weight Paint mode */
+ keymap= WM_keymap_find(wm, "Weight Paint", 0, 0);
+ keymap->poll= weight_paint_poll;
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
+
+ WM_keymap_verify_item(keymap, "PAINT_OT_weight_paint", LEFTMOUSE, KM_PRESS, 0, 0);
+
+ /* Image/Texture Paint mode */
+ keymap= WM_keymap_find(wm, "Image Paint", 0, 0);
+ keymap->poll= image_texture_paint_poll;
+
+ 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);
+
+ WM_keymap_add_item(keymap, "PAINT_OT_image_paint", LEFTMOUSE, KM_PRESS, 0, 0);
+ 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);
}
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
new file mode 100644
index 00000000000..b83352ae70c
--- /dev/null
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -0,0 +1,330 @@
+/*
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_brush_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+
+#include "RNA_access.h"
+
+#include "BKE_context.h"
+#include "BKE_paint.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "BLI_arithb.h"
+
+#include "PIL_time.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_screen.h"
+#include "ED_view3d.h"
+
+#include "paint_intern.h"
+
+#include <float.h>
+#include <math.h>
+
+typedef struct PaintStroke {
+ void *mode_data;
+ void *smooth_stroke_cursor;
+ wmTimer *timer;
+
+ /* Cached values */
+ ViewContext vc;
+ bglMats mats;
+ Brush *brush;
+
+ float last_mouse_position[2];
+
+ /* Set whether any stroke step has yet occured
+ e.g. in sculpt mode, stroke doesn't start until cursor
+ passes over the mesh */
+ int stroke_started;
+
+ StrokeTestStart test_start;
+ StrokeUpdateStep update_step;
+ StrokeDone done;
+} PaintStroke;
+
+/*** Cursor ***/
+static void paint_draw_smooth_stroke(bContext *C, int x, int y, void *customdata)
+{
+ Brush *brush = paint_brush(paint_get_active(CTX_data_scene(C)));
+ PaintStroke *stroke = customdata;
+
+ glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col);
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+
+ if(stroke && brush && (brush->flag & BRUSH_SMOOTH_STROKE)) {
+ ARegion *ar = CTX_wm_region(C);
+ sdrawline(x, y, (int)stroke->last_mouse_position[0] - ar->winrct.xmin,
+ (int)stroke->last_mouse_position[1] - ar->winrct.ymin);
+ }
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LINE_SMOOTH);
+}
+
+static void paint_draw_cursor(bContext *C, int x, int y, void *customdata)
+{
+ Brush *brush = paint_brush(paint_get_active(CTX_data_scene(C)));
+
+ glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col);
+ 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, 40);
+ glTranslatef((float)-x, (float)-y, 0.0f);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LINE_SMOOTH);
+}
+
+/* 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[2])
+{
+ PointerRNA itemptr;
+ float cur_depth, pressure = 1;
+ float center[3];
+ PaintStroke *stroke = op->customdata;
+
+ cur_depth = read_cached_depth(&stroke->vc, mouse[0], mouse[1]);
+ view3d_unproject(&stroke->mats, center, mouse[0], mouse[1], cur_depth);
+
+ /* Tablet */
+ if(event->custom == EVT_DATA_TABLET) {
+ wmTabletData *wmtab= event->customdata;
+ if(wmtab->Active != EVT_TABLET_NONE)
+ pressure= wmtab->Pressure;
+ }
+
+ /* Add to stroke */
+ RNA_collection_add(op->ptr, "stroke", &itemptr);
+ RNA_float_set_array(&itemptr, "location", center);
+ RNA_float_set_array(&itemptr, "mouse", mouse);
+ RNA_boolean_set(&itemptr, "flip", event->shift);
+ RNA_float_set(&itemptr, "pressure", pressure);
+
+ stroke->last_mouse_position[0] = mouse[0];
+ stroke->last_mouse_position[1] = mouse[1];
+
+ stroke->update_step(C, stroke, &itemptr);
+}
+
+/* Returns zero if no sculpt changes should be made, non-zero otherwise */
+static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *event)
+{
+ output[0] = event->x;
+ output[1] = event->y;
+
+ if(stroke->brush->flag & BRUSH_SMOOTH_STROKE && stroke->brush->sculpt_tool != SCULPT_TOOL_GRAB) {
+ float u = stroke->brush->smooth_stroke_factor, v = 1.0 - u;
+ float dx = stroke->last_mouse_position[0] - event->x, dy = stroke->last_mouse_position[1] - event->y;
+
+ /* If the mouse is moving within the radius of the last move,
+ don't update the mouse position. This allows sharp turns. */
+ if(dx*dx + dy*dy < stroke->brush->smooth_stroke_radius * stroke->brush->smooth_stroke_radius)
+ return 0;
+
+ output[0] = event->x * v + stroke->last_mouse_position[0] * u;
+ output[1] = event->y * v + stroke->last_mouse_position[1] * u;
+ }
+
+ 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) && (br->sculpt_tool != SCULPT_TOOL_GRAB);
+}
+
+/* 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])
+{
+ PaintStroke *stroke = op->customdata;
+ int cnt = 0;
+
+ if(paint_space_stroke_enabled(stroke->brush)) {
+ float mouse[2] = {stroke->last_mouse_position[0], stroke->last_mouse_position[1]};
+ float vec[2] = {final_mouse[0] - mouse[0], final_mouse[1] - mouse[1]};
+ float length, scale;
+ int steps = 0, i;
+
+ /* Normalize the vector between the last stroke dot and the goal */
+ length = sqrt(vec[0]*vec[0] + vec[1]*vec[1]);
+
+ if(length > FLT_EPSILON) {
+ scale = stroke->brush->spacing / length;
+ vec[0] *= scale;
+ vec[1] *= scale;
+
+ steps = (int)(length / stroke->brush->spacing);
+ for(i = 0; i < steps; ++i, ++cnt) {
+ mouse[0] += vec[0];
+ mouse[1] += vec[1];
+ paint_brush_stroke_add_step(C, op, event, mouse);
+ }
+ }
+ }
+
+ return cnt;
+}
+
+/**** Public API ****/
+
+PaintStroke *paint_stroke_new(bContext *C, StrokeTestStart test_start,
+ StrokeUpdateStep update_step, StrokeDone done)
+{
+ PaintStroke *stroke = MEM_callocN(sizeof(PaintStroke), "PaintStroke");
+
+ stroke->brush = paint_brush(paint_get_active(CTX_data_scene(C)));
+ view3d_set_viewcontext(C, &stroke->vc);
+ view3d_get_transformation(&stroke->vc, stroke->vc.obact, &stroke->mats);
+
+ stroke->test_start = test_start;
+ stroke->update_step = update_step;
+ stroke->done = done;
+
+ return stroke;
+}
+
+int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar = CTX_wm_region(C);
+ PaintStroke *stroke = op->customdata;
+ float mouse[2];
+
+ if(event->type == TIMER && (event->customdata != stroke->timer))
+ return OPERATOR_RUNNING_MODAL;
+
+ if(!stroke->stroke_started) {
+ stroke->last_mouse_position[0] = event->x;
+ stroke->last_mouse_position[1] = event->y;
+ stroke->stroke_started = stroke->test_start(C, op, event);
+
+ if(stroke->stroke_started) {
+ stroke->smooth_stroke_cursor =
+ WM_paint_cursor_activate(CTX_wm_manager(C), paint_poll, paint_draw_smooth_stroke, stroke);
+
+ if(stroke->brush->flag & BRUSH_AIRBRUSH)
+ stroke->timer = WM_event_add_window_timer(CTX_wm_window(C), TIMER, stroke->brush->rate);
+ }
+
+ ED_region_tag_redraw(ar);
+ }
+
+ if(stroke->stroke_started) {
+ if(paint_smooth_stroke(stroke, mouse, event)) {
+ if(paint_space_stroke_enabled(stroke->brush)) {
+ if(!paint_space_stroke(C, op, event, mouse))
+ ED_region_tag_redraw(ar);
+ }
+ else
+ paint_brush_stroke_add_step(C, op, event, mouse);
+ }
+ else
+ ED_region_tag_redraw(ar);
+ }
+
+ /* TODO: fix hardcoded event here */
+ if(event->type == LEFTMOUSE && event->val == KM_RELEASE) {
+ /* Exit stroke, free data */
+
+ if(stroke->smooth_stroke_cursor)
+ WM_paint_cursor_end(CTX_wm_manager(C), stroke->smooth_stroke_cursor);
+
+ if(stroke->timer)
+ WM_event_remove_window_timer(CTX_wm_window(C), stroke->timer);
+
+ stroke->done(C, stroke);
+ MEM_freeN(stroke);
+ return OPERATOR_FINISHED;
+ }
+ else
+ return OPERATOR_RUNNING_MODAL;
+}
+
+int paint_stroke_exec(bContext *C, wmOperator *op)
+{
+ PaintStroke *stroke = op->customdata;
+
+ RNA_BEGIN(op->ptr, itemptr, "stroke") {
+ stroke->update_step(C, stroke, &itemptr);
+ }
+ RNA_END;
+
+ MEM_freeN(stroke);
+ op->customdata = NULL;
+
+ return OPERATOR_FINISHED;
+}
+
+ViewContext *paint_stroke_view_context(PaintStroke *stroke)
+{
+ return &stroke->vc;
+}
+
+void *paint_stroke_mode_data(struct PaintStroke *stroke)
+{
+ return stroke->mode_data;
+}
+
+void paint_stroke_set_mode_data(PaintStroke *stroke, void *mode_data)
+{
+ stroke->mode_data = mode_data;
+}
+
+int paint_poll(bContext *C)
+{
+ Paint *p = paint_get_active(CTX_data_scene(C));
+ Object *ob = CTX_data_active_object(C);
+
+ return p && ob && paint_brush(p) &&
+ CTX_wm_area(C)->spacetype == SPACE_VIEW3D &&
+ CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW;
+}
+
+void paint_cursor_start(bContext *C, int (*poll)(bContext *C))
+{
+ Paint *p = paint_get_active(CTX_data_scene(C));
+
+ if(p && !p->paint_cursor)
+ p->paint_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), poll, paint_draw_cursor, NULL);
+}
+
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 85ea55331dc..13fbd2179b8 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -5,21 +5,31 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
+
#include "BLI_arithb.h"
#include "BKE_brush.h"
+#include "BKE_context.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
+#include "BKE_paint.h"
+
#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "ED_view3d.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
#include "paint_intern.h"
/* 3D Paint */
@@ -160,7 +170,7 @@ int imapaint_pick_face(ViewContext *vc, Mesh *me, int *mval, unsigned int *index
/* used for both 3d view and image window */
void paint_sample_color(Scene *scene, ARegion *ar, int x, int y) /* frontbuf */
{
- Brush **br = current_brush_source(scene);
+ Brush *br = paint_brush(paint_get_active(scene));
unsigned int col;
char *cp;
@@ -173,10 +183,44 @@ void paint_sample_color(Scene *scene, ARegion *ar, int x, int y) /* frontbuf */
cp = (char *)&col;
- if(br && *br) {
- (*br)->rgb[0]= cp[0]/255.0f;
- (*br)->rgb[1]= cp[1]/255.0f;
- (*br)->rgb[2]= cp[2]/255.0f;
+ if(br) {
+ br->rgb[0]= cp[0]/255.0f;
+ br->rgb[1]= cp[1]/255.0f;
+ br->rgb[2]= cp[2]/255.0f;
}
}
+static int brush_curve_preset_exec(bContext *C, wmOperator *op)
+{
+ Brush *br = paint_brush(paint_get_active(CTX_data_scene(C)));
+ brush_curve_preset(br, RNA_enum_get(op->ptr, "shape"));
+
+ return OPERATOR_FINISHED;
+}
+
+static int brush_curve_preset_poll(bContext *C)
+{
+ Brush *br = paint_brush(paint_get_active(CTX_data_scene(C)));
+
+ return br && br->curve;
+}
+
+void BRUSH_OT_curve_preset(wmOperatorType *ot)
+{
+ static EnumPropertyItem prop_shape_items[] = {
+ {BRUSH_PRESET_SHARP, "SHARP", 0, "Sharp", ""},
+ {BRUSH_PRESET_SMOOTH, "SMOOTH", 0, "Smooth", ""},
+ {BRUSH_PRESET_MAX, "MAX", 0, "Max", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ ot->name= "Preset";
+ ot->description= "Set brush shape.";
+ ot->idname= "BRUSH_OT_curve_preset";
+
+ ot->exec= brush_curve_preset_exec;
+ ot->poll= brush_curve_preset_poll;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "shape", prop_shape_items, BRUSH_PRESET_SHARP, "Mode", "");
+}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 0710079301b..5afc4954c9c 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -43,7 +43,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
-#include "MTC_matrixops.h"
+
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
@@ -62,6 +62,7 @@
#include "DNA_userdef_types.h"
#include "RNA_access.h"
+#include "RNA_define.h"
#include "BKE_armature.h"
#include "BKE_brush.h"
@@ -76,6 +77,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_utildefines.h"
#include "WM_api.h"
@@ -90,6 +92,8 @@
#include "ED_util.h"
#include "ED_view3d.h"
+#include "paint_intern.h"
+
/* vp->mode */
#define VP_MIX 0
#define VP_ADD 1
@@ -106,9 +110,19 @@ static void error() {}
/* polling - retrieve whether cursor should be set or operator should be done */
-static int vp_poll(bContext *C)
+
+/* Returns true if vertex paint mode is active */
+int vertex_paint_mode_poll(bContext *C)
+{
+ Object *ob = CTX_data_active_object(C);
+
+ return ob && ob->mode == OB_MODE_VERTEX_PAINT;
+}
+
+int vertex_paint_poll(bContext *C)
{
- if(G.f & G_VERTEXPAINT) {
+ if(vertex_paint_mode_poll(C) &&
+ paint_brush(&CTX_data_tool_settings(C)->vpaint->paint)) {
ScrArea *sa= CTX_wm_area(C);
if(sa->spacetype==SPACE_VIEW3D) {
ARegion *ar= CTX_wm_region(C);
@@ -119,9 +133,12 @@ static int vp_poll(bContext *C)
return 0;
}
-static int wp_poll(bContext *C)
+int weight_paint_poll(bContext *C)
{
- if(G.f & G_WEIGHTPAINT) {
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob && ob->mode & OB_MODE_WEIGHT_PAINT &&
+ paint_brush(&CTX_data_tool_settings(C)->wpaint->paint)) {
ScrArea *sa= CTX_wm_area(C);
if(sa->spacetype==SPACE_VIEW3D) {
ARegion *ar= CTX_wm_region(C);
@@ -132,56 +149,6 @@ static int wp_poll(bContext *C)
return 0;
}
-
-/* Cursors */
-static void vp_drawcursor(bContext *C, int x, int y, void *customdata)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
-
- glTranslatef((float)x, (float)y, 0.0f);
-
- glColor4ub(255, 255, 255, 128);
- glEnable( GL_LINE_SMOOTH );
- glEnable(GL_BLEND);
- glutil_draw_lined_arc(0.0, M_PI*2.0, ts->vpaint->brush->size, 40);
- glDisable(GL_BLEND);
- glDisable( GL_LINE_SMOOTH );
-
- glTranslatef((float)-x, (float)-y, 0.0f);
-}
-
-static void wp_drawcursor(bContext *C, int x, int y, void *customdata)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
-
- glTranslatef((float)x, (float)y, 0.0f);
-
- glColor4ub(200, 200, 255, 128);
- glEnable( GL_LINE_SMOOTH );
- glEnable(GL_BLEND);
- glutil_draw_lined_arc(0.0, M_PI*2.0, ts->wpaint->brush->size, 40);
- glDisable(GL_BLEND);
- glDisable( GL_LINE_SMOOTH );
-
- glTranslatef((float)-x, (float)-y, 0.0f);
-}
-
-static void toggle_paint_cursor(bContext *C, int wpaint)
-{
- ToolSettings *ts = CTX_data_scene(C)->toolsettings;
- VPaint *vp = wpaint ? ts->wpaint : ts->vpaint;
-
- if(vp->paintcursor) {
- WM_paint_cursor_end(CTX_wm_manager(C), vp->paintcursor);
- vp->paintcursor = NULL;
- }
- else {
- vp->paintcursor = wpaint ?
- WM_paint_cursor_activate(CTX_wm_manager(C), wp_poll, wp_drawcursor, NULL) :
- WM_paint_cursor_activate(CTX_wm_manager(C), vp_poll, vp_drawcursor, NULL);
- }
-}
-
static VPaint *new_vpaint(int wpaint)
{
VPaint *vp= MEM_callocN(sizeof(VPaint), "VPaint");
@@ -232,7 +199,8 @@ unsigned int rgba_to_mcol(float r, float g, float b, float a)
static unsigned int vpaint_get_current_col(VPaint *vp)
{
- return rgba_to_mcol(vp->brush->rgb[0], vp->brush->rgb[1], vp->brush->rgb[2], 1.0f);
+ Brush *brush = paint_brush(&vp->paint);
+ return rgba_to_mcol(brush->rgb[0], brush->rgb[1], brush->rgb[2], 1.0f);
}
void do_shared_vertexcol(Mesh *me)
@@ -327,7 +295,7 @@ void make_vertexcol(Scene *scene, int shade) /* single ob */
else
memset(me->mcol, 255, 4*sizeof(MCol)*me->totface);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
@@ -362,34 +330,7 @@ static void copy_wpaint_prev (VPaint *wp, MDeformVert *dverts, int dcount)
}
-void clear_vpaint(Scene *scene)
-{
- Mesh *me;
- Object *ob;
- unsigned int *to, paintcol;
- int a;
-
- if((G.f & G_VERTEXPAINT)==0) return;
-
- ob= OBACT;
- me= get_mesh(ob);
- if(!ob || ob->id.lib) return;
-
- if(me==0 || me->mcol==0 || me->totface==0) return;
-
- paintcol= vpaint_get_current_col(scene->toolsettings->vpaint);
-
- to= (unsigned int *)me->mcol;
- a= 4*me->totface;
- while(a--) {
- *to= paintcol;
- to++;
- }
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-
-}
-
-void clear_vpaint_selectedfaces(Scene *scene)
+void clear_vpaint(Scene *scene, int selected)
{
Mesh *me;
MFace *mf;
@@ -409,7 +350,7 @@ void clear_vpaint_selectedfaces(Scene *scene)
mf = me->mface;
mcol = (unsigned int*)me->mcol;
for (i = 0; i < me->totface; i++, mf++, mcol+=4) {
- if (mf->flag & ME_FACE_SEL) {
+ if (!selected || mf->flag & ME_FACE_SEL) {
mcol[0] = paintcol;
mcol[1] = paintcol;
mcol[2] = paintcol;
@@ -417,15 +358,16 @@ void clear_vpaint_selectedfaces(Scene *scene)
}
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
/* fills in the selected faces with the current weight and vertex group */
void clear_wpaint_selectedfaces(Scene *scene)
{
- VPaint *wp= scene->toolsettings->wpaint;
- float paintweight= wp->brush->alpha;
+ ToolSettings *ts= scene->toolsettings;
+ VPaint *wp= ts->wpaint;
+ float paintweight= ts->vgroup_weight;
Mesh *me;
MFace *mface;
Object *ob;
@@ -466,8 +408,8 @@ void clear_wpaint_selectedfaces(Scene *scene)
if (!strcmp(curdef->name, name))
break;
if(curdef==NULL) {
- int olddef= ob->actdef; /* tsk, add_defgroup sets the active defgroup */
- curdef= add_defgroup_name (ob, name);
+ int olddef= ob->actdef; /* tsk, ED_vgroup_add sets the active defgroup */
+ curdef= ED_vgroup_add_name (ob, name);
ob->actdef= olddef;
}
@@ -489,9 +431,9 @@ void clear_wpaint_selectedfaces(Scene *scene)
faceverts[3]= mface->v4;
for (i=0; i<3 || faceverts[i]; i++) {
if(!((me->dvert+faceverts[i])->flag)) {
- dw= verify_defweight(me->dvert+faceverts[i], vgroup);
+ dw= ED_vgroup_weight_verify(me->dvert+faceverts[i], vgroup);
if(dw) {
- uw= verify_defweight(wp->wpaint_prev+faceverts[i], vgroup);
+ uw= ED_vgroup_weight_verify(wp->wpaint_prev+faceverts[i], vgroup);
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
@@ -500,11 +442,11 @@ void clear_wpaint_selectedfaces(Scene *scene)
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1) {
- dw= verify_defweight(me->dvert+j, vgroup_mirror);
- uw= verify_defweight(wp->wpaint_prev+j, vgroup_mirror);
+ dw= ED_vgroup_weight_verify(me->dvert+j, vgroup_mirror);
+ uw= ED_vgroup_weight_verify(wp->wpaint_prev+j, vgroup_mirror);
} else {
- dw= verify_defweight(me->dvert+j, vgroup);
- uw= verify_defweight(wp->wpaint_prev+j, vgroup);
+ dw= ED_vgroup_weight_verify(me->dvert+j, vgroup);
+ uw= ED_vgroup_weight_verify(wp->wpaint_prev+j, vgroup);
}
uw->weight= dw->weight; /* set the undo weight */
dw->weight= paintweight;
@@ -526,7 +468,7 @@ void clear_wpaint_selectedfaces(Scene *scene)
MEM_freeN(indexar);
copy_wpaint_prev(wp, NULL, 0);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
@@ -539,10 +481,10 @@ void vpaint_dogamma(Scene *scene)
int a, temp;
unsigned char *cp, gamtab[256];
- if((G.f & G_VERTEXPAINT)==0) return;
-
ob= OBACT;
me= get_mesh(ob);
+
+ if(!(ob->mode & OB_MODE_VERTEX_PAINT)) return;
if(me==0 || me->mcol==0 || me->totface==0) return;
igam= 1.0/vp->gamma;
@@ -720,6 +662,7 @@ static unsigned int mcol_darken(unsigned int col1, unsigned int col2, int fac)
static void vpaint_blend(VPaint *vp, unsigned int *col, unsigned int *colorig, unsigned int paintcol, int alpha)
{
+ Brush *brush = paint_brush(&vp->paint);
if(vp->mode==VP_MIX || vp->mode==VP_BLUR) *col= mcol_blend( *col, paintcol, alpha);
else if(vp->mode==VP_ADD) *col= mcol_add( *col, paintcol, alpha);
@@ -733,7 +676,7 @@ static void vpaint_blend(VPaint *vp, unsigned int *col, unsigned int *colorig, u
unsigned int testcol=0, a;
char *cp, *ct, *co;
- alpha= (int)(255.0*vp->brush->alpha);
+ alpha= (int)(255.0*brush->alpha);
if(vp->mode==VP_MIX || vp->mode==VP_BLUR) testcol= mcol_blend( *colorig, paintcol, alpha);
else if(vp->mode==VP_ADD) testcol= mcol_add( *colorig, paintcol, alpha);
@@ -767,7 +710,9 @@ static int sample_backbuf_area(ViewContext *vc, int *indexar, int totface, int x
if(totface+4>=MAXINDEX) return 0;
- if(size>64.0) size= 64.0;
+ /* brecht: disabled this because it obviously failes for
+ brushes with size > 64, why is this here? */
+ /*if(size>64.0) size= 64.0;*/
ibuf= view3d_read_backbuf(vc, x-size, y-size, x+size, y+size);
if(ibuf) {
@@ -797,8 +742,9 @@ static int sample_backbuf_area(ViewContext *vc, int *indexar, int totface, int x
return tot;
}
-static int calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], float *vert_nor, short *mval)
+static int calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], float *vert_nor, float *mval)
{
+ Brush *brush = paint_brush(&vp->paint);
float fac, dx, dy;
int alpha;
short vertco[2];
@@ -809,14 +755,14 @@ static int calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], floa
dy= mval[1]-vertco[1];
fac= sqrt(dx*dx + dy*dy);
- if(fac > vp->brush->size) return 0;
+ if(fac > brush->size) return 0;
if(vp->flag & VP_HARD)
alpha= 255;
else
- alpha= 255.0*vp->brush->alpha*(1.0-fac/vp->brush->size);
+ alpha= 255.0*brush->alpha*(1.0-fac/brush->size);
}
else {
- alpha= 255.0*vp->brush->alpha;
+ alpha= 255.0*brush->alpha;
}
if(vp->flag & VP_NORMALS) {
@@ -838,6 +784,7 @@ static int calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], floa
static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float alpha, float paintval)
{
+ Brush *brush = paint_brush(&wp->paint);
if(dw==NULL || uw==NULL) return;
@@ -863,7 +810,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
if((wp->flag & VP_SPRAY)==0) {
float testw=0.0f;
- alpha= wp->brush->alpha;
+ alpha= brush->alpha;
if(wp->mode==VP_MIX || wp->mode==VP_BLUR)
testw = paintval*alpha + uw->weight*(1.0-alpha);
else if(wp->mode==VP_ADD)
@@ -909,7 +856,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
{
ViewContext vc;
- VPaint *wp= scene->toolsettings->wpaint;
+ ToolSettings *ts= scene->toolsettings;
Object *ob= OBACT;
Mesh *me= get_mesh(ob);
int index;
@@ -978,7 +925,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_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
MEM_freeN(str);
}
@@ -1018,21 +965,21 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
fac= MIN4(w1, w2, w3, w4);
if(w1==fac) {
- dw= get_defweight(me->dvert+mface->v1, ob->actdef-1);
- if(dw) wp->brush->alpha= dw->weight; else wp->brush->alpha= 0.0f;
+ dw= ED_vgroup_weight_get(me->dvert+mface->v1, ob->actdef-1);
+ if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f;
}
else if(w2==fac) {
- dw= get_defweight(me->dvert+mface->v2, ob->actdef-1);
- if(dw) wp->brush->alpha= dw->weight; else wp->brush->alpha= 0.0f;
+ dw= ED_vgroup_weight_get(me->dvert+mface->v2, ob->actdef-1);
+ if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f;
}
else if(w3==fac) {
- dw= get_defweight(me->dvert+mface->v3, ob->actdef-1);
- if(dw) wp->brush->alpha= dw->weight; else wp->brush->alpha= 0.0f;
+ dw= ED_vgroup_weight_get(me->dvert+mface->v3, ob->actdef-1);
+ if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f;
}
else if(w4==fac) {
if(mface->v4) {
- dw= get_defweight(me->dvert+mface->v4, ob->actdef-1);
- if(dw) wp->brush->alpha= dw->weight; else wp->brush->alpha= 0.0f;
+ dw= ED_vgroup_weight_get(me->dvert+mface->v4, ob->actdef-1);
+ if(dw) ts->vgroup_weight= dw->weight; else ts->vgroup_weight= 0.0f;
}
}
}
@@ -1050,12 +997,12 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index, int alpha,
int vgroup= ob->actdef-1;
if(wp->flag & VP_ONLYVGROUP) {
- dw= get_defweight(me->dvert+index, vgroup);
- uw= get_defweight(wp->wpaint_prev+index, vgroup);
+ dw= ED_vgroup_weight_get(me->dvert+index, vgroup);
+ uw= ED_vgroup_weight_get(wp->wpaint_prev+index, vgroup);
}
else {
- dw= verify_defweight(me->dvert+index, vgroup);
- uw= verify_defweight(wp->wpaint_prev+index, vgroup);
+ dw= ED_vgroup_weight_verify(me->dvert+index, vgroup);
+ uw= ED_vgroup_weight_verify(wp->wpaint_prev+index, vgroup);
}
if(dw==NULL || uw==NULL)
return;
@@ -1067,9 +1014,9 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index, int alpha,
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1)
- uw= verify_defweight(me->dvert+j, vgroup_mirror);
+ uw= ED_vgroup_weight_verify(me->dvert+j, vgroup_mirror);
else
- uw= verify_defweight(me->dvert+j, vgroup);
+ uw= ED_vgroup_weight_verify(me->dvert+j, vgroup);
uw->weight= dw->weight;
}
@@ -1087,16 +1034,16 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
Mesh *me;
me= get_mesh(ob);
- if(ob->id.lib || me==NULL) return OPERATOR_CANCELLED;
+ if(ob->id.lib || me==NULL) return OPERATOR_PASS_THROUGH;
if(me && me->totface>=MAXINDEX) {
error("Maximum number of faces: %d", MAXINDEX-1);
- G.f &= ~G_WEIGHTPAINT;
+ ob->mode &= ~OB_MODE_WEIGHT_PAINT;
return OPERATOR_CANCELLED;
}
- if(G.f & G_WEIGHTPAINT) G.f &= ~G_WEIGHTPAINT;
- else G.f |= G_WEIGHTPAINT;
+ if(ob->mode & OB_MODE_WEIGHT_PAINT) ob->mode &= ~OB_MODE_WEIGHT_PAINT;
+ else ob->mode |= OB_MODE_WEIGHT_PAINT;
/* Weightpaint works by overriding colors in mesh,
@@ -1104,35 +1051,31 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
* exit (exit needs doing regardless because we
* should redeform).
*/
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
- if(G.f & G_WEIGHTPAINT) {
+ if(ob->mode & OB_MODE_WEIGHT_PAINT) {
Object *par;
if(wp==NULL)
wp= scene->toolsettings->wpaint= new_vpaint(1);
- brush_check_exists(&wp->brush);
-
- toggle_paint_cursor(C, 1);
+ paint_init(&wp->paint, PAINT_CURSOR_WEIGHT_PAINT);
+ paint_cursor_start(C, weight_paint_poll);
mesh_octree_table(ob, NULL, NULL, 's');
/* verify if active weight group is also active bone */
par= modifiers_isDeformedByArmature(ob);
- if(par && (par->flag & OB_POSEMODE)) {
+ if(par && (par->mode & OB_MODE_POSE)) {
bPoseChannel *pchan;
for(pchan= par->pose->chanbase.first; pchan; pchan= pchan->next)
if(pchan->bone->flag & BONE_ACTIVE)
break;
if(pchan)
- vertexgroup_select_by_name(ob, pchan->name);
+ ED_vgroup_select_by_name(ob, pchan->name);
}
}
else {
- if(wp)
- toggle_paint_cursor(C, 1);
-
mesh_octree_table(ob, NULL, NULL, 'e');
}
@@ -1173,8 +1116,12 @@ void PAINT_OT_weight_paint_toggle(wmOperatorType *ot)
static int vpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- toggle_paint_cursor(C, 0);
- brush_radial_control_invoke(op, CTX_data_scene(C)->toolsettings->vpaint->brush, 1);
+ Paint *p = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(p);
+
+ WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
+ p->paint_cursor = NULL;
+ brush_radial_control_invoke(op, brush, 1);
return WM_radial_control_invoke(C, op, event);
}
@@ -1182,19 +1129,28 @@ static int vpaint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *eve
{
int ret = WM_radial_control_modal(C, op, event);
if(ret != OPERATOR_RUNNING_MODAL)
- toggle_paint_cursor(C, 0);
+ paint_cursor_start(C, vertex_paint_poll);
return ret;
}
static int vpaint_radial_control_exec(bContext *C, wmOperator *op)
{
- return brush_radial_control_exec(op, CTX_data_scene(C)->toolsettings->vpaint->brush, 1);
+ Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->vpaint->paint);
+ int ret = brush_radial_control_exec(op, brush, 1);
+
+ WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
+
+ return ret;
}
static int wpaint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- toggle_paint_cursor(C, 1);
- brush_radial_control_invoke(op, CTX_data_scene(C)->toolsettings->wpaint->brush, 1);
+ Paint *p = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(p);
+
+ WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
+ p->paint_cursor = NULL;
+ brush_radial_control_invoke(op, brush, 1);
return WM_radial_control_invoke(C, op, event);
}
@@ -1202,13 +1158,18 @@ static int wpaint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *eve
{
int ret = WM_radial_control_modal(C, op, event);
if(ret != OPERATOR_RUNNING_MODAL)
- toggle_paint_cursor(C, 1);
+ paint_cursor_start(C, weight_paint_poll);
return ret;
}
static int wpaint_radial_control_exec(bContext *C, wmOperator *op)
{
- return brush_radial_control_exec(op, CTX_data_scene(C)->toolsettings->wpaint->brush, 1);
+ Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->wpaint->paint);
+ int ret = brush_radial_control_exec(op, brush, 1);
+
+ WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
+
+ return ret;
}
void PAINT_OT_weight_paint_radial_control(wmOperatorType *ot)
@@ -1221,10 +1182,10 @@ void PAINT_OT_weight_paint_radial_control(wmOperatorType *ot)
ot->invoke= wpaint_radial_control_invoke;
ot->modal= wpaint_radial_control_modal;
ot->exec= wpaint_radial_control_exec;
- ot->poll= wp_poll;
+ ot->poll= weight_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
void PAINT_OT_vertex_paint_radial_control(wmOperatorType *ot)
@@ -1237,10 +1198,10 @@ void PAINT_OT_vertex_paint_radial_control(wmOperatorType *ot)
ot->invoke= vpaint_radial_control_invoke;
ot->modal= vpaint_radial_control_modal;
ot->exec= vpaint_radial_control_exec;
- ot->poll= vp_poll;
+ ot->poll= vertex_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
/* ************ weight paint operator ********** */
@@ -1253,206 +1214,10 @@ struct WPaintData {
float wpimat[3][3];
};
-static void wpaint_exit(bContext *C, wmOperator *op)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- Object *ob= CTX_data_active_object(C);
- struct WPaintData *wpd= op->customdata;
-
- if(wpd->vertexcosnos)
- MEM_freeN(wpd->vertexcosnos);
- MEM_freeN(wpd->indexar);
-
- /* frees prev buffer */
- copy_wpaint_prev(ts->wpaint, NULL, 0);
-
- /* and particles too */
- if(ob->particlesystem.first) {
- ParticleSystem *psys;
- int i;
-
- for(psys= ob->particlesystem.first; psys; psys= psys->next) {
- for(i=0; i<PSYS_TOT_VG; i++) {
- if(psys->vgroup[i]==ob->actdef) {
- psys->recalc |= PSYS_RECALC_RESET;
- break;
- }
- }
- }
- }
-
- DAG_object_flush_update(CTX_data_scene(C), ob, OB_RECALC_DATA);
-
- MEM_freeN(wpd);
- op->customdata= NULL;
-}
-
-
-static int wpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- VPaint *wp= ts->wpaint;
-
- switch(event->type) {
- case LEFTMOUSE:
- if(event->val==0) { /* release */
- wpaint_exit(C, op);
- return OPERATOR_FINISHED;
- }
- /* pass on, first press gets painted too */
-
- case MOUSEMOVE:
- {
- struct WPaintData *wpd= op->customdata;
- ViewContext *vc= &wpd->vc;
- Object *ob= vc->obact;
- Mesh *me= ob->data;
- float mat[4][4];
- float paintweight= wp->brush->alpha;
- int *indexar= wpd->indexar;
- int totindex, index, alpha, totw;
- short mval[2];
-
- view3d_operator_needs_opengl(C);
-
- /* load projection matrix */
- wmMultMatrix(ob->obmat);
- wmGetSingleMatrix(mat);
- wmLoadMatrix(wpd->vc.rv3d->viewmat);
-
- MTC_Mat4SwapMat4(wpd->vc.rv3d->persmat, mat);
-
- mval[0]= event->x - vc->ar->winrct.xmin;
- mval[1]= event->y - vc->ar->winrct.ymin;
-
- /* which faces are involved */
- if(wp->flag & VP_AREA) {
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], wp->brush->size);
- }
- else {
- indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
- if(indexar[0]) totindex= 1;
- else totindex= 0;
- }
-
- if(wp->flag & VP_COLINDEX) {
- for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
-
- if(mface->mat_nr!=ob->actcol-1) {
- indexar[index]= 0;
- }
- }
- }
- }
-
- if((G.f & G_FACESELECT) && me->mface) {
- for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
-
- if((mface->flag & ME_FACE_SEL)==0) {
- indexar[index]= 0;
- }
- }
- }
- }
-
- /* make sure each vertex gets treated only once */
- /* and calculate filter weight */
- totw= 0;
- if(wp->mode==VP_BLUR)
- paintweight= 0.0f;
- else
- paintweight= wp->brush->alpha;
-
- for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= me->mface + (indexar[index]-1);
-
- (me->dvert+mface->v1)->flag= 1;
- (me->dvert+mface->v2)->flag= 1;
- (me->dvert+mface->v3)->flag= 1;
- if(mface->v4) (me->dvert+mface->v4)->flag= 1;
-
- if(wp->mode==VP_BLUR) {
- MDeformWeight *dw, *(*dw_func)(MDeformVert *, int) = verify_defweight;
-
- if(wp->flag & VP_ONLYVGROUP)
- dw_func= get_defweight;
-
- dw= dw_func(me->dvert+mface->v1, ob->actdef-1);
- if(dw) {paintweight+= dw->weight; totw++;}
- dw= dw_func(me->dvert+mface->v2, ob->actdef-1);
- if(dw) {paintweight+= dw->weight; totw++;}
- dw= dw_func(me->dvert+mface->v3, ob->actdef-1);
- if(dw) {paintweight+= dw->weight; totw++;}
- if(mface->v4) {
- dw= dw_func(me->dvert+mface->v4, ob->actdef-1);
- if(dw) {paintweight+= dw->weight; totw++;}
- }
- }
- }
- }
-
- if(wp->mode==VP_BLUR)
- paintweight/= (float)totw;
-
- for(index=0; index<totindex; index++) {
-
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= me->mface + (indexar[index]-1);
-
- if((me->dvert+mface->v1)->flag) {
- alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v1, mval);
- if(alpha) {
- do_weight_paint_vertex(wp, ob, mface->v1, alpha, paintweight, wpd->vgroup_mirror);
- }
- (me->dvert+mface->v1)->flag= 0;
- }
-
- if((me->dvert+mface->v2)->flag) {
- alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v2, mval);
- if(alpha) {
- do_weight_paint_vertex(wp, ob, mface->v2, alpha, paintweight, wpd->vgroup_mirror);
- }
- (me->dvert+mface->v2)->flag= 0;
- }
-
- if((me->dvert+mface->v3)->flag) {
- alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v3, mval);
- if(alpha) {
- do_weight_paint_vertex(wp, ob, mface->v3, alpha, paintweight, wpd->vgroup_mirror);
- }
- (me->dvert+mface->v3)->flag= 0;
- }
-
- if((me->dvert+mface->v4)->flag) {
- if(mface->v4) {
- alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v4, mval);
- if(alpha) {
- do_weight_paint_vertex(wp, ob, mface->v4, alpha, paintweight, wpd->vgroup_mirror);
- }
- (me->dvert+mface->v4)->flag= 0;
- }
- }
- }
- }
-
- MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
-
- DAG_object_flush_update(vc->scene, ob, OB_RECALC_DATA);
- ED_region_tag_redraw(vc->ar);
- }
- }
-
- return OPERATOR_RUNNING_MODAL;
-}
-
-static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
+ struct PaintStroke *stroke = op->customdata;
ToolSettings *ts= CTX_data_tool_settings(C);
VPaint *wp= ts->wpaint;
Object *ob= CTX_data_active_object(C);
@@ -1461,17 +1226,17 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
float mat[4][4], imat[4][4];
if(scene->obedit) return OPERATOR_CANCELLED;
- // XXX if(multires_level1_test()) return;
me= get_mesh(ob);
- if(me==NULL || me->totface==0) return OPERATOR_CANCELLED;
+ 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)
- create_dverts(&me->id);
+ ED_vgroup_data_create(&me->id);
- /* make customdata storage */
- op->customdata= wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
+ /* make mode data storage */
+ wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
+ paint_stroke_set_mode_data(stroke, wpd);
view3d_set_viewcontext(C, &wpd->vc);
wpd->vgroup_mirror= -1;
@@ -1501,14 +1266,14 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(pchan) {
bDeformGroup *dg= get_named_vertexgroup(ob, pchan->name);
if(dg==NULL)
- dg= add_defgroup_name(ob, pchan->name); /* sets actdef */
+ dg= ED_vgroup_add_name(ob, pchan->name); /* sets actdef */
else
ob->actdef= get_defgroup_num(ob, dg);
}
}
}
if(ob->defbase.first==NULL) {
- add_defgroup(ob);
+ ED_vgroup_add(ob);
}
// if(ob->lay & v3d->lay); else error("Active object is not in this layer");
@@ -1533,8 +1298,8 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (!strcmp(curdef->name, name))
break;
if(curdef==NULL) {
- int olddef= ob->actdef; /* tsk, add_defgroup sets the active defgroup */
- curdef= add_defgroup_name (ob, name);
+ int olddef= ob->actdef; /* tsk, ED_vgroup_add sets the active defgroup */
+ curdef= ED_vgroup_add_name (ob, name);
ob->actdef= olddef;
}
@@ -1543,11 +1308,203 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
- /* do paint once for click only paint */
- wpaint_modal(C, op, event);
+ return 1;
+}
+
+static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
+{
+ ToolSettings *ts= CTX_data_tool_settings(C);
+ VPaint *wp= ts->wpaint;
+ Brush *brush = paint_brush(&wp->paint);
+ struct WPaintData *wpd= paint_stroke_mode_data(stroke);
+ ViewContext *vc= &wpd->vc;
+ Object *ob= vc->obact;
+ Mesh *me= ob->data;
+ float mat[4][4];
+ float paintweight= ts->vgroup_weight;
+ int *indexar= wpd->indexar;
+ int totindex, index, alpha, totw;
+ float mval[2];
+
+ view3d_operator_needs_opengl(C);
+
+ /* load projection matrix */
+ wmMultMatrix(ob->obmat);
+ wmGetSingleMatrix(mat);
+ wmLoadMatrix(wpd->vc.rv3d->viewmat);
+
+ RNA_float_get_array(itemptr, "mouse", mval);
+ mval[0]-= vc->ar->winrct.xmin;
+ mval[1]-= vc->ar->winrct.ymin;
+
+ Mat4SwapMat4(wpd->vc.rv3d->persmat, mat);
+
+ /* which faces are involved */
+ if(wp->flag & VP_AREA) {
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush->size);
+ }
+ else {
+ indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
+ if(indexar[0]) totindex= 1;
+ else totindex= 0;
+ }
+
+ if(wp->flag & VP_COLINDEX) {
+ for(index=0; index<totindex; index++) {
+ if(indexar[index] && indexar[index]<=me->totface) {
+ MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
+
+ if(mface->mat_nr!=ob->actcol-1) {
+ indexar[index]= 0;
+ }
+ }
+ }
+ }
+
+ if((G.f & G_FACESELECT) && me->mface) {
+ for(index=0; index<totindex; index++) {
+ if(indexar[index] && indexar[index]<=me->totface) {
+ MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
+
+ if((mface->flag & ME_FACE_SEL)==0) {
+ indexar[index]= 0;
+ }
+ }
+ }
+ }
+
+ /* make sure each vertex gets treated only once */
+ /* and calculate filter weight */
+ totw= 0;
+ if(wp->mode==VP_BLUR)
+ paintweight= 0.0f;
+ else
+ paintweight= ts->vgroup_weight;
+
+ for(index=0; index<totindex; index++) {
+ if(indexar[index] && indexar[index]<=me->totface) {
+ MFace *mface= me->mface + (indexar[index]-1);
+
+ (me->dvert+mface->v1)->flag= 1;
+ (me->dvert+mface->v2)->flag= 1;
+ (me->dvert+mface->v3)->flag= 1;
+ if(mface->v4) (me->dvert+mface->v4)->flag= 1;
+
+ if(wp->mode==VP_BLUR) {
+ MDeformWeight *dw, *(*dw_func)(MDeformVert *, int) = ED_vgroup_weight_verify;
+
+ if(wp->flag & VP_ONLYVGROUP)
+ dw_func= ED_vgroup_weight_get;
+
+ dw= dw_func(me->dvert+mface->v1, ob->actdef-1);
+ if(dw) {paintweight+= dw->weight; totw++;}
+ dw= dw_func(me->dvert+mface->v2, ob->actdef-1);
+ if(dw) {paintweight+= dw->weight; totw++;}
+ dw= dw_func(me->dvert+mface->v3, ob->actdef-1);
+ if(dw) {paintweight+= dw->weight; totw++;}
+ if(mface->v4) {
+ dw= dw_func(me->dvert+mface->v4, ob->actdef-1);
+ if(dw) {paintweight+= dw->weight; totw++;}
+ }
+ }
+ }
+ }
+
+ if(wp->mode==VP_BLUR)
+ paintweight/= (float)totw;
+
+ for(index=0; index<totindex; index++) {
+
+ if(indexar[index] && indexar[index]<=me->totface) {
+ MFace *mface= me->mface + (indexar[index]-1);
+
+ if((me->dvert+mface->v1)->flag) {
+ alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v1, mval);
+ if(alpha) {
+ do_weight_paint_vertex(wp, ob, mface->v1, alpha, paintweight, wpd->vgroup_mirror);
+ }
+ (me->dvert+mface->v1)->flag= 0;
+ }
+
+ if((me->dvert+mface->v2)->flag) {
+ alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v2, mval);
+ if(alpha) {
+ do_weight_paint_vertex(wp, ob, mface->v2, alpha, paintweight, wpd->vgroup_mirror);
+ }
+ (me->dvert+mface->v2)->flag= 0;
+ }
+
+ if((me->dvert+mface->v3)->flag) {
+ alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v3, mval);
+ if(alpha) {
+ do_weight_paint_vertex(wp, ob, mface->v3, alpha, paintweight, wpd->vgroup_mirror);
+ }
+ (me->dvert+mface->v3)->flag= 0;
+ }
+
+ if((me->dvert+mface->v4)->flag) {
+ if(mface->v4) {
+ alpha= calc_vp_alpha_dl(wp, vc, wpd->wpimat, wpd->vertexcosnos+6*mface->v4, mval);
+ if(alpha) {
+ do_weight_paint_vertex(wp, ob, mface->v4, alpha, paintweight, wpd->vgroup_mirror);
+ }
+ (me->dvert+mface->v4)->flag= 0;
+ }
+ }
+ }
+ }
+
+ Mat4SwapMat4(vc->rv3d->persmat, mat);
+
+ DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ ED_region_tag_redraw(vc->ar);
+}
+
+static void wpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
+{
+ ToolSettings *ts= CTX_data_tool_settings(C);
+ Object *ob= CTX_data_active_object(C);
+ struct WPaintData *wpd= paint_stroke_mode_data(stroke);
+
+ if(wpd->vertexcosnos)
+ MEM_freeN(wpd->vertexcosnos);
+ MEM_freeN(wpd->indexar);
+
+ /* frees prev buffer */
+ copy_wpaint_prev(ts->wpaint, NULL, 0);
+
+ /* and particles too */
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys;
+ int i;
+
+ for(psys= ob->particlesystem.first; psys; psys= psys->next) {
+ for(i=0; i<PSYS_TOT_VG; i++) {
+ if(psys->vgroup[i]==ob->actdef) {
+ psys->recalc |= PSYS_RECALC_RESET;
+ break;
+ }
+ }
+ }
+ }
+
+ DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+
+ MEM_freeN(wpd);
+}
+
+
+static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+
+ op->customdata = paint_stroke_new(C, wpaint_stroke_test_start,
+ wpaint_stroke_update_step,
+ wpaint_stroke_done);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
+
+ op->type->modal(C, op, event);
return OPERATOR_RUNNING_MODAL;
}
@@ -1561,13 +1518,14 @@ void PAINT_OT_weight_paint(wmOperatorType *ot)
/* api callbacks */
ot->invoke= wpaint_invoke;
- ot->modal= wpaint_modal;
+ ot->modal= paint_stroke_modal;
/* ot->exec= vpaint_exec; <-- needs stroke property */
- ot->poll= wp_poll;
+ ot->poll= weight_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
/* ************ set / clear vertex paint mode ********** */
@@ -1583,45 +1541,40 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */
me= get_mesh(ob);
if(me==NULL || object_data_is_libdata(ob)) {
- G.f &= ~G_VERTEXPAINT;
- return OPERATOR_FINISHED;
+ ob->mode &= ~OB_MODE_VERTEX_PAINT;
+ return OPERATOR_PASS_THROUGH;
}
if(me && me->totface>=MAXINDEX) {
error("Maximum number of faces: %d", MAXINDEX-1);
- G.f &= ~G_VERTEXPAINT;
+ ob->mode &= ~OB_MODE_VERTEX_PAINT;
return OPERATOR_FINISHED;
}
if(me && me->mcol==NULL) make_vertexcol(scene, 0);
/* toggle: end vpaint */
- if(G.f & G_VERTEXPAINT) {
-
- G.f &= ~G_VERTEXPAINT;
+ if(ob->mode & OB_MODE_VERTEX_PAINT) {
- if(vp) {
- toggle_paint_cursor(C, 0);
- vp->paintcursor= NULL;
- }
+ ob->mode &= ~OB_MODE_VERTEX_PAINT;
}
else {
-
- G.f |= G_VERTEXPAINT;
+ ob->mode |= OB_MODE_VERTEX_PAINT;
/* Turn off weight painting */
- if (G.f & G_WEIGHTPAINT)
+ if (ob->mode & OB_MODE_WEIGHT_PAINT)
set_wpaint(C, op);
if(vp==NULL)
vp= scene->toolsettings->vpaint= new_vpaint(0);
- toggle_paint_cursor(C, 0);
- brush_check_exists(&scene->toolsettings->vpaint->brush);
+ paint_cursor_start(C, vertex_paint_poll);
+
+ paint_init(&vp->paint, PAINT_CURSOR_VERTEX_PAINT);
}
if (me)
/* update modifier stack for mapping requirements */
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&me->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
@@ -1667,166 +1620,34 @@ For future:
*/
-struct VPaintData {
+typedef struct VPaintData {
ViewContext vc;
unsigned int paintcol;
int *indexar;
float *vertexcosnos;
float vpimat[3][3];
-};
-
-static void vpaint_exit(bContext *C, wmOperator *op)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- struct VPaintData *vpd= op->customdata;
-
- if(vpd->vertexcosnos)
- MEM_freeN(vpd->vertexcosnos);
- MEM_freeN(vpd->indexar);
-
- /* frees prev buffer */
- copy_vpaint_prev(ts->vpaint, NULL, 0);
-
- MEM_freeN(vpd);
- op->customdata= NULL;
-}
-
-static int vpaint_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- VPaint *vp= ts->vpaint;
-
- switch(event->type) {
- case LEFTMOUSE:
- if(event->val==0) { /* release */
- vpaint_exit(C, op);
- return OPERATOR_FINISHED;
- }
- /* pass on, first press gets painted too */
-
- case MOUSEMOVE:
- {
- struct VPaintData *vpd= op->customdata;
- ViewContext *vc= &vpd->vc;
- Object *ob= vc->obact;
- Mesh *me= ob->data;
- float mat[4][4];
- int *indexar= vpd->indexar;
- int totindex, index;
- short mval[2];
-
- view3d_operator_needs_opengl(C);
-
- /* load projection matrix */
- wmMultMatrix(ob->obmat);
- wmGetSingleMatrix(mat);
- wmLoadMatrix(vc->rv3d->viewmat);
-
- mval[0]= event->x - vc->ar->winrct.xmin;
- mval[1]= event->y - vc->ar->winrct.ymin;
-
- /* which faces are involved */
- if(vp->flag & VP_AREA) {
- totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], vp->brush->size);
- }
- else {
- indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
- if(indexar[0]) totindex= 1;
- else totindex= 0;
- }
-
- MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
-
- if(vp->flag & VP_COLINDEX) {
- for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
-
- if(mface->mat_nr!=ob->actcol-1) {
- indexar[index]= 0;
- }
- }
- }
- }
- if((G.f & G_FACESELECT) && me->mface) {
- for(index=0; index<totindex; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
-
- if((mface->flag & ME_FACE_SEL)==0)
- indexar[index]= 0;
- }
- }
- }
-
- for(index=0; index<totindex; index++) {
-
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mface= ((MFace *)me->mface) + (indexar[index]-1);
- unsigned int *mcol= ( (unsigned int *)me->mcol) + 4*(indexar[index]-1);
- unsigned int *mcolorig= ( (unsigned int *)vp->vpaint_prev) + 4*(indexar[index]-1);
- int alpha;
-
- if(vp->mode==VP_BLUR) {
- unsigned int fcol1= mcol_blend( mcol[0], mcol[1], 128);
- if(mface->v4) {
- unsigned int fcol2= mcol_blend( mcol[2], mcol[3], 128);
- vpd->paintcol= mcol_blend( fcol1, fcol2, 128);
- }
- else {
- vpd->paintcol= mcol_blend( mcol[2], fcol1, 170);
- }
-
- }
-
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*mface->v1, mval);
- if(alpha) vpaint_blend(vp, mcol, mcolorig, vpd->paintcol, alpha);
-
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*mface->v2, mval);
- if(alpha) vpaint_blend(vp, mcol+1, mcolorig+1, vpd->paintcol, alpha);
-
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*mface->v3, mval);
- if(alpha) vpaint_blend(vp, mcol+2, mcolorig+2, vpd->paintcol, alpha);
-
- if(mface->v4) {
- alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*mface->v4, mval);
- if(alpha) vpaint_blend(vp, mcol+3, mcolorig+3, vpd->paintcol, alpha);
- }
- }
- }
-
- MTC_Mat4SwapMat4(vc->rv3d->persmat, mat);
-
- do_shared_vertexcol(me);
-
- ED_region_tag_redraw(vc->ar);
-
- DAG_object_flush_update(vc->scene, ob, OB_RECALC_DATA);
- }
- break;
- }
-
- return OPERATOR_RUNNING_MODAL;
-}
+} VPaintData;
-static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *event)
{
ToolSettings *ts= CTX_data_tool_settings(C);
+ struct PaintStroke *stroke = op->customdata;
VPaint *vp= ts->vpaint;
struct VPaintData *vpd;
Object *ob= CTX_data_active_object(C);
Mesh *me;
float mat[4][4], imat[4][4];
-
+
/* context checks could be a poll() */
me= get_mesh(ob);
- if(me==NULL || me->totface==0) return OPERATOR_CANCELLED;
+ if(me==NULL || me->totface==0) return OPERATOR_PASS_THROUGH;
if(me->mcol==NULL) make_vertexcol(CTX_data_scene(C), 0);
if(me->mcol==NULL) return OPERATOR_CANCELLED;
- /* make customdata storage */
- op->customdata= vpd= MEM_callocN(sizeof(struct VPaintData), "VPaintData");
+ /* make mode data storage */
+ vpd= MEM_callocN(sizeof(struct VPaintData), "VPaintData");
+ paint_stroke_set_mode_data(stroke, vpd);
view3d_set_viewcontext(C, &vpd->vc);
vpd->vertexcosnos= mesh_get_mapped_verts_nors(vpd->vc.scene, ob);
@@ -1840,12 +1661,123 @@ static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
Mat4MulMat4(mat, ob->obmat, vpd->vc.rv3d->viewmat);
Mat4Invert(imat, mat);
Mat3CpyMat4(vpd->vpimat, imat);
+
+ return 1;
+}
+
+static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index, float mval[2])
+{
+ ViewContext *vc = &vpd->vc;
+ Mesh *me = get_mesh(ob);
+ MFace *mface= ((MFace*)me->mface) + index;
+ unsigned int *mcol= ((unsigned int*)me->mcol) + 4*index;
+ unsigned int *mcolorig= ((unsigned int*)vp->vpaint_prev) + 4*index;
+ int alpha, i;
+
+ if((vp->flag & VP_COLINDEX && mface->mat_nr!=ob->actcol-1) ||
+ (G.f & G_FACESELECT && !(mface->flag & ME_FACE_SEL)))
+ return;
+
+ if(vp->mode==VP_BLUR) {
+ unsigned int fcol1= mcol_blend( mcol[0], mcol[1], 128);
+ if(mface->v4) {
+ unsigned int fcol2= mcol_blend( mcol[2], mcol[3], 128);
+ vpd->paintcol= mcol_blend( fcol1, fcol2, 128);
+ }
+ else {
+ vpd->paintcol= mcol_blend( mcol[2], fcol1, 170);
+ }
+
+ }
+
+ for(i = 0; i < (mface->v4 ? 4 : 3); ++i) {
+ alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i], mval);
+ if(alpha)
+ vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, alpha);
+ }
+}
+
+static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
+{
+ ToolSettings *ts= CTX_data_tool_settings(C);
+ struct VPaintData *vpd = paint_stroke_mode_data(stroke);
+ VPaint *vp= ts->vpaint;
+ Brush *brush = paint_brush(&vp->paint);
+ ViewContext *vc= &vpd->vc;
+ Object *ob= vc->obact;
+ Mesh *me= ob->data;
+ float mat[4][4];
+ int *indexar= vpd->indexar;
+ int totindex, index;
+ float mval[2];
+
+ RNA_float_get_array(itemptr, "mouse", mval);
+
+ view3d_operator_needs_opengl(C);
+
+ /* load projection matrix */
+ wmMultMatrix(ob->obmat);
+ wmGetSingleMatrix(mat);
+ wmLoadMatrix(vc->rv3d->viewmat);
+
+ mval[0]-= vc->ar->winrct.xmin;
+ mval[1]-= vc->ar->winrct.ymin;
+
+
+ /* which faces are involved */
+ if(vp->flag & VP_AREA) {
+ totindex= sample_backbuf_area(vc, indexar, me->totface, mval[0], mval[1], brush->size);
+ }
+ else {
+ indexar[0]= view3d_sample_backbuf(vc, mval[0], mval[1]);
+ if(indexar[0]) totindex= 1;
+ else totindex= 0;
+ }
+
+ Mat4SwapMat4(vc->rv3d->persmat, mat);
+
+ for(index=0; index<totindex; index++) {
+ if(indexar[index] && indexar[index]<=me->totface)
+ vpaint_paint_face(vp, vpd, ob, indexar[index]-1, mval);
+ }
+
+ Mat4SwapMat4(vc->rv3d->persmat, mat);
+
+ /* was disabled because it is slow, but necessary for blur */
+ if(vp->mode == VP_BLUR)
+ do_shared_vertexcol(me);
+
+ ED_region_tag_redraw(vc->ar);
+
+ DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+}
+
+static void vpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
+{
+ ToolSettings *ts= CTX_data_tool_settings(C);
+ struct VPaintData *vpd= paint_stroke_mode_data(stroke);
+
+ if(vpd->vertexcosnos)
+ MEM_freeN(vpd->vertexcosnos);
+ MEM_freeN(vpd->indexar);
- /* do paint once for click only paint */
- vpaint_modal(C, op, event);
+ /* frees prev buffer */
+ copy_vpaint_prev(ts->vpaint, NULL, 0);
+
+ MEM_freeN(vpd);
+}
+
+static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+
+ op->customdata = paint_stroke_new(C, vpaint_stroke_test_start,
+ vpaint_stroke_update_step,
+ vpaint_stroke_done);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
+
+ op->type->modal(C, op, event);
return OPERATOR_RUNNING_MODAL;
}
@@ -1858,11 +1790,13 @@ void PAINT_OT_vertex_paint(wmOperatorType *ot)
/* api callbacks */
ot->invoke= vpaint_invoke;
- ot->modal= vpaint_modal;
+ ot->modal= paint_stroke_modal;
/* ot->exec= vpaint_exec; <-- needs stroke property */
- ot->poll= vp_poll;
+ ot->poll= vertex_paint_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index f40880b901f..64af39ea497 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -64,7 +64,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
-#include "BKE_sculpt.h"
+#include "BKE_paint.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BKE_colortools.h"
@@ -79,6 +79,7 @@
#include "ED_space_api.h"
#include "ED_util.h"
#include "ED_view3d.h"
+#include "paint_intern.h"
#include "sculpt_intern.h"
#include "RNA_access.h"
@@ -124,29 +125,27 @@ typedef enum StrokeFlags {
*/
typedef struct StrokeCache {
/* Invariants */
- float radius;
+ float initial_radius;
float scale[3];
int flag;
float clip_tolerance[3];
- int initial_mouse[2];
+ float initial_mouse[2];
float depth;
/* Variants */
+ float radius;
float true_location[3];
float location[3];
float flip;
float pressure;
- int mouse[2];
+ float mouse[2];
/* The rest is temporary storage that isn't saved as a property */
int first_time; /* Beginning of stroke may do some things special */
- ViewContext vc;
bglMats *mats;
- float *layer_disps; /* Displacements for each vertex */
- float (*mesh_store)[3]; /* Copy of the mesh vertices' locations */
short (*orig_norms)[3]; /* Copy of the mesh vertices' normals */
float (*face_norms)[3]; /* Copy of the mesh faces' normals */
float rotation; /* Texture rotation (radians) for anchored and rake modes */
@@ -156,7 +155,6 @@ typedef struct StrokeCache {
float old_grab_location[3];
int symmetry; /* Symmetry index between 0 and 7 */
float view_normal[3], view_normal_symmetry[3];
- int last_dot[2]; /* Last location of stroke application */
int last_rake[2]; /* Last location of updating rake rotation */
} StrokeCache;
@@ -179,19 +177,6 @@ typedef struct ProjVert {
* Simple functions to get data from the GL
*/
-/* Uses window coordinates (x,y) and depth component z to find a point in
- modelspace */
-static void unproject(bglMats *mats, float out[3], const short x, const short y, const float z)
-{
- double ux, uy, uz;
-
- gluUnProject(x,y,z, mats->modelview, mats->projection,
- (GLint *)mats->viewport, &ux, &uy, &uz );
- out[0] = ux;
- out[1] = uy;
- out[2] = uz;
-}
-
/* Convert a point in model coordinates to 2D screen coordinates. */
static void projectf(bglMats *mats, const float v[3], float p[2])
{
@@ -216,36 +201,23 @@ static void project(bglMats *mats, const float v[3], short p[2])
*
*/
-/* Return modified brush size. Uses current tablet pressure (if available) to
- shrink the brush. Skipped for grab brush because only the first mouse down
- size is used, which is small if the user has just touched the pen to the
- tablet */
-static char brush_size(Sculpt *sd)
-{
- float size= sd->brush->size;
-
- if((sd->brush->sculpt_tool != SCULPT_TOOL_GRAB) && (sd->brush->flag & BRUSH_SIZE_PRESSURE))
- size *= sd->session->cache->pressure;
-
- return size;
-}
-
/* Return modified brush strength. Includes the direction of the brush, positive
values pull vertices, negative values push. Uses tablet pressure and a
special multiplier found experimentally to scale the strength factor. */
static float brush_strength(Sculpt *sd, StrokeCache *cache)
{
+ Brush *brush = paint_brush(&sd->paint);
/* Primary strength input; square it to make lower values more sensitive */
- float alpha = sd->brush->alpha * sd->brush->alpha;
+ float alpha = brush->alpha * brush->alpha;
- float dir= sd->brush->flag & BRUSH_DIR_IN ? -1 : 1;
+ float dir= brush->flag & BRUSH_DIR_IN ? -1 : 1;
float pressure= 1;
float flip= cache->flip ? -1:1;
- if(sd->brush->flag & BRUSH_ALPHA_PRESSURE)
+ if(brush->flag & BRUSH_ALPHA_PRESSURE)
pressure *= cache->pressure;
- switch(sd->brush->sculpt_tool){
+ switch(brush->sculpt_tool){
case SCULPT_TOOL_DRAW:
case SCULPT_TOOL_INFLATE:
case SCULPT_TOOL_CLAY:
@@ -264,7 +236,7 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache)
}
/* Handles clipping against a mirror modifier and SCULPT_LOCK axis flags */
-static void sculpt_clip(Sculpt *sd, float *co, const float val[3])
+static void sculpt_clip(Sculpt *sd, SculptSession *ss, float *co, const float val[3])
{
int i;
@@ -272,7 +244,7 @@ static void sculpt_clip(Sculpt *sd, float *co, const float val[3])
if(sd->flags & (SCULPT_LOCK_X << i))
continue;
- if((sd->session->cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= sd->session->cache->clip_tolerance[i]))
+ if((ss->cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= ss->cache->clip_tolerance[i]))
co[i]= 0.0f;
else
co[i]= val[i];
@@ -294,23 +266,24 @@ static void add_norm_if(float view_vec[3], float out[3], float out_flip[3], cons
/* Currently only for the draw brush; finds average normal for all active
vertices */
-static void calc_area_normal(Sculpt *sd, float out[3], const ListBase* active_verts)
+static void calc_area_normal(Sculpt *sd, SculptSession *ss, float out[3], const ListBase* active_verts)
{
- StrokeCache *cache = sd->session->cache;
+ Brush *brush = paint_brush(&sd->paint);
+ StrokeCache *cache = ss->cache;
ActiveData *node = active_verts->first;
- const int view = 0; /* XXX: should probably be a flag, not number: sd->brush_type==SCULPT_TOOL_DRAW ? sculptmode_brush()->view : 0; */
+ const int view = 0; /* XXX: should probably be a flag, not number: brush_type==SCULPT_TOOL_DRAW ? sculptmode_brush()->view : 0; */
float out_flip[3];
float *out_dir = cache->view_normal_symmetry;
out[0]=out[1]=out[2] = out_flip[0]=out_flip[1]=out_flip[2] = 0;
- if(sd->brush->flag & BRUSH_ANCHORED) {
+ if(brush->flag & BRUSH_ANCHORED) {
for(; node; node = node->next)
add_norm_if(out_dir, out, out_flip, cache->orig_norms[node->Index]);
}
else {
for(; node; node = node->next)
- add_norm_if(out_dir, out, out_flip, sd->session->mvert[node->Index].no);
+ add_norm_if(out_dir, out, out_flip, ss->mvert[node->Index].no);
}
if (out[0]==0.0 && out[1]==0.0 && out[2]==0.0) {
@@ -333,7 +306,7 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_
float area_normal[3];
ActiveData *node= active_verts->first;
- calc_area_normal(sd, area_normal, active_verts);
+ calc_area_normal(sd, ss, area_normal, active_verts);
while(node){
float *co= ss->mvert[node->Index].co;
@@ -342,7 +315,7 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_
co[1]+area_normal[1]*ss->cache->radius*node->Fade*ss->cache->scale[1],
co[2]+area_normal[2]*ss->cache->radius*node->Fade*ss->cache->scale[2]};
- sculpt_clip(sd, co, val);
+ sculpt_clip(sd, ss, co, val);
node= node->next;
}
@@ -392,37 +365,37 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert)
VecCopyf(avg, ss->mvert[vert].co);
}
-static void do_smooth_brush(Sculpt *s, const ListBase* active_verts)
+static void do_smooth_brush(Sculpt *s, SculptSession *ss, const ListBase* active_verts)
{
ActiveData *node= active_verts->first;
int i;
for(i = 0; i < 2; ++i) {
while(node){
- float *co= s->session->mvert[node->Index].co;
+ float *co= ss->mvert[node->Index].co;
float avg[3], val[3];
- neighbor_average(s->session, avg, node->Index);
+ neighbor_average(ss, avg, node->Index);
val[0] = co[0]+(avg[0]-co[0])*node->Fade;
val[1] = co[1]+(avg[1]-co[1])*node->Fade;
val[2] = co[2]+(avg[2]-co[2])*node->Fade;
- sculpt_clip(s, co, val);
+ sculpt_clip(s, ss, co, val);
node= node->next;
}
}
}
-static void do_pinch_brush(Sculpt *s, const ListBase* active_verts)
+static void do_pinch_brush(Sculpt *s, SculptSession *ss, const ListBase* active_verts)
{
ActiveData *node= active_verts->first;
while(node) {
- float *co= s->session->mvert[node->Index].co;
- const float val[3]= {co[0]+(s->session->cache->location[0]-co[0])*node->Fade,
- co[1]+(s->session->cache->location[1]-co[1])*node->Fade,
- co[2]+(s->session->cache->location[2]-co[2])*node->Fade};
- sculpt_clip(s, co, val);
+ float *co= ss->mvert[node->Index].co;
+ const float val[3]= {co[0]+(ss->cache->location[0]-co[0])*node->Fade,
+ co[1]+(ss->cache->location[1]-co[1])*node->Fade,
+ co[2]+(ss->cache->location[2]-co[2])*node->Fade};
+ sculpt_clip(s, ss, co, val);
node= node->next;
}
}
@@ -441,7 +414,7 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss)
VecCopyf(add, grab_delta);
VecMulf(add, node->Fade);
VecAddf(add, add, co);
- sculpt_clip(sd, co, add);
+ sculpt_clip(sd, ss, co, add);
node= node->next;
}
@@ -457,10 +430,10 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, const ListBase *active
if(ss->cache->flip)
lim = -lim;
- calc_area_normal(sd, area_normal, active_verts);
+ calc_area_normal(sd, ss, area_normal, active_verts);
while(node){
- float *disp= &ss->cache->layer_disps[node->Index];
+ float *disp= &ss->layer_disps[node->Index];
float *co= ss->mvert[node->Index].co;
float val[3];
@@ -470,20 +443,19 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, const ListBase *active
if((lim < 0 && *disp < lim) || (lim > 0 && *disp > lim))
*disp = lim;
- val[0] = ss->cache->mesh_store[node->Index][0]+area_normal[0] * *disp*ss->cache->scale[0];
- val[1] = ss->cache->mesh_store[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1];
- val[2] = ss->cache->mesh_store[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2];
+ val[0] = ss->mesh_co_orig[node->Index][0]+area_normal[0] * *disp*ss->cache->scale[0];
+ val[1] = ss->mesh_co_orig[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1];
+ val[2] = ss->mesh_co_orig[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2];
- sculpt_clip(sd, co, val);
+ sculpt_clip(sd, ss, co, val);
node= node->next;
}
}
-static void do_inflate_brush(Sculpt *s, const ListBase *active_verts)
+static void do_inflate_brush(Sculpt *s, SculptSession *ss, const ListBase *active_verts)
{
ActiveData *node= active_verts->first;
- SculptSession *ss = s->session;
float add[3];
while(node) {
@@ -499,7 +471,7 @@ static void do_inflate_brush(Sculpt *s, const ListBase *active_verts)
add[2]*= ss->cache->scale[2];
VecAddf(add, add, co);
- sculpt_clip(s, co, add);
+ sculpt_clip(s, ss, co, add);
node= node->next;
}
@@ -528,46 +500,86 @@ static void calc_flatten_center(SculptSession *ss, ActiveData *node, float co[3]
VecMulf(co, 1.0f / FLATTEN_SAMPLE_SIZE);
}
+/* Projects a point onto a plane along the plane's normal */
+static void point_plane_project(float intr[3], float co[3], float plane_normal[3], float plane_center[3])
+{
+ float p1[3], sub1[3], sub2[3];
+
+ /* Find the intersection between squash-plane and vertex (along the area normal) */
+ VecSubf(p1, co, plane_normal);
+ VecSubf(sub1, plane_center, p1);
+ VecSubf(sub2, co, p1);
+ VecSubf(intr, co, p1);
+ VecMulf(intr, Inpf(plane_normal, sub1) / Inpf(plane_normal, sub2));
+ VecAddf(intr, intr, p1);
+}
+
+static int plane_point_side(float co[3], float plane_normal[3], float plane_center[3], int flip)
+{
+ float delta[3];
+ float d;
+
+ VecSubf(delta, co, plane_center);
+ d = Inpf(plane_normal, delta);
+
+ if(flip)
+ d = -d;
+
+ return d <= 0.0f;
+}
+
static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, const ListBase *active_verts, int clay)
{
ActiveData *node= active_verts->first;
/* area_normal and cntr define the plane towards which vertices are squashed */
float area_normal[3];
- float cntr[3];
+ float cntr[3], cntr2[3], bstr = 0;
+ int flip = 0;
- calc_area_normal(sd, area_normal, active_verts);
+ calc_area_normal(sd, ss, area_normal, active_verts);
calc_flatten_center(ss, node, cntr);
+ if(clay) {
+ bstr= brush_strength(sd, ss->cache);
+ /* Limit clay application to here */
+ cntr2[0]=cntr[0]+area_normal[0]*bstr*ss->cache->scale[0];
+ cntr2[1]=cntr[1]+area_normal[1]*bstr*ss->cache->scale[1];
+ cntr2[2]=cntr[2]+area_normal[2]*bstr*ss->cache->scale[2];
+ flip = bstr < 0;
+ }
+
while(node){
float *co= ss->mvert[node->Index].co;
- float p1[3], sub1[3], sub2[3], intr[3], val[3];
-
- /* Find the intersection between squash-plane and vertex (along the area normal) */
- VecSubf(p1, co, area_normal);
- VecSubf(sub1, cntr, p1);
- VecSubf(sub2, co, p1);
- VecSubf(intr, co, p1);
- VecMulf(intr, Inpf(area_normal, sub1) / Inpf(area_normal, sub2));
- VecAddf(intr, intr, p1);
+ float intr[3], val[3];
- VecSubf(val, intr, co);
- VecMulf(val, fabs(node->Fade));
- VecAddf(val, val, co);
-
- if(clay) {
- /* Clay brush displaces after flattening */
- float tmp[3];
- VecCopyf(tmp, area_normal);
- VecMulf(tmp, ss->cache->radius * node->Fade * 0.1);
- VecAddf(val, val, tmp);
- }
+ if(!clay || plane_point_side(co, area_normal, cntr2, flip)) {
+ /* Find the intersection between squash-plane and vertex (along the area normal) */
+ point_plane_project(intr, co, area_normal, cntr);
- sculpt_clip(sd, co, val);
+ VecSubf(val, intr, co);
+
+ if(clay) {
+ if(bstr > FLT_EPSILON)
+ VecMulf(val, node->Fade / bstr);
+ else
+ VecMulf(val, node->Fade);
+ /* Clay displacement */
+ val[0]+=area_normal[0] * ss->cache->scale[0]*node->Fade;
+ val[1]+=area_normal[1] * ss->cache->scale[1]*node->Fade;
+ val[2]+=area_normal[2] * ss->cache->scale[2]*node->Fade;
+ }
+ else
+ VecMulf(val, fabs(node->Fade));
+
+ VecAddf(val, val, co);
+
+ sculpt_clip(sd, ss, co, val);
+ }
node= node->next;
}
}
-
+
/* Uses symm to selectively flip any axis of a coordinate. */
static void flip_coord(float out[3], float in[3], const char symm)
{
@@ -623,35 +635,29 @@ static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float
}
/* Return a multiplier for brush strength on a particular vertex. */
-static float tex_strength(Sculpt *sd, float *point, const float len)
+static float tex_strength(Sculpt *sd, SculptSession *ss, float *point, const float len)
{
- SculptSession *ss= sd->session;
- Brush *br = sd->brush;
+ Brush *br = paint_brush(&sd->paint);
+ MTex *tex = NULL;
float avg= 1;
- if(br->texact==-1 || !br->mtex[br->texact])
+ if(br->texact >= 0)
+ tex = br->mtex[br->texact];
+
+ if(!tex) {
avg= 1;
- else if(br->tex_mode==BRUSH_TEX_3D) {
- /* Get strength by feeding the vertex location directly
- into a texture */
+ }
+ else if(tex->brush_map_mode == MTEX_MAP_MODE_3D) {
float jnk;
- const float factor= 0.01;
- MTex mtex;
- memset(&mtex,0,sizeof(MTex));
- mtex.tex= br->mtex[br->texact]->tex;
- mtex.projx= 1;
- mtex.projy= 2;
- mtex.projz= 3;
- VecCopyf(mtex.size, br->mtex[br->texact]->size);
- VecMulf(mtex.size, factor);
- if(!sd->texsep)
- mtex.size[1]= mtex.size[2]= mtex.size[0];
-
- externtex(&mtex,point,&avg,&jnk,&jnk,&jnk,&jnk);
+
+ /* Get strength by feeding the vertex
+ location directly into a texture */
+ externtex(tex, point, &avg,
+ &jnk, &jnk, &jnk, &jnk);
}
else if(ss->texcache) {
const float bsize= ss->cache->pixel_radius * 2;
- const float rot= sd->brush->rot + ss->cache->rotation;
+ const float rot= tex->rot + ss->cache->rotation;
int px, py;
float flip[3], point_2d[2];
@@ -664,9 +670,9 @@ static float tex_strength(Sculpt *sd, float *point, const float len)
/* For Tile and Drag modes, get the 2D screen coordinates of the
and scale them up or down to the texture size. */
- if(br->tex_mode==BRUSH_TEX_TILE) {
- const int sx= (const int)br->mtex[br->texact]->size[0];
- const int sy= (const int)sd->texsep ? br->mtex[br->texact]->size[1] : sx;
+ if(tex->brush_map_mode == MTEX_MAP_MODE_TILED) {
+ const int sx= (const int)tex->size[0];
+ const int sy= (const int)tex->size[1];
float fx= point_2d[0];
float fy= point_2d[1];
@@ -686,7 +692,8 @@ static float tex_strength(Sculpt *sd, float *point, const float len)
if(sy != 1)
py %= sy-1;
avg= get_texcache_pixel_bilinear(ss, ss->texcache_side*px/sx, ss->texcache_side*py/sy);
- } else {
+ }
+ else if(tex->brush_map_mode == MTEX_MAP_MODE_FIXED) {
float fx= (point_2d[0] - ss->cache->mouse[0]) / bsize;
float fy= (point_2d[1] - ss->cache->mouse[1]) / bsize;
@@ -700,7 +707,7 @@ static float tex_strength(Sculpt *sd, float *point, const float len)
}
}
- avg*= brush_curve_strength(sd->brush, len, ss->cache->radius); /* Falloff curve */
+ avg*= brush_curve_strength(br, len, ss->cache->radius); /* Falloff curve */
return avg;
}
@@ -738,40 +745,9 @@ static void sculpt_add_damaged_rect(SculptSession *ss)
}
}
-/* Clears the depth buffer in each modified area. */
-#if 0
-static void sculpt_clear_damaged_areas(SculptSession *ss)
+static void do_brush_action(Sculpt *sd, SculptSession *ss, StrokeCache *cache)
{
- RectNode *rn= NULL;
-
- for(rn = ss->damaged_rects.first; rn; rn = rn->next) {
- rcti clp = rn->r;
- rcti *win = NULL; /*XXX: &curarea->winrct; */
-
- clp.xmin += win->xmin;
- clp.xmax += win->xmin;
- clp.ymin += win->ymin;
- clp.ymax += win->ymin;
-
- if(clp.xmin < win->xmax && clp.xmax > win->xmin &&
- clp.ymin < win->ymax && clp.ymax > win->ymin) {
- if(clp.xmin < win->xmin) clp.xmin = win->xmin;
- if(clp.ymin < win->ymin) clp.ymin = win->ymin;
- if(clp.xmax > win->xmax) clp.xmax = win->xmax;
- if(clp.ymax > win->ymax) clp.ymax = win->ymax;
-
- glScissor(clp.xmin + 1, clp.ymin + 1,
- clp.xmax - clp.xmin - 2,
- clp.ymax - clp.ymin - 2);
- }
-
- glClear(GL_DEPTH_BUFFER_BIT);
- }
-}
-#endif
-static void do_brush_action(Sculpt *sd, StrokeCache *cache)
-{
- SculptSession *ss = sd->session;
+ Brush *brush = paint_brush(&sd->paint);
float av_dist;
ListBase active_verts={0,0};
ListBase *grab_active_verts = &ss->cache->grab_active_verts[ss->cache->symmetry];
@@ -780,7 +756,7 @@ static void do_brush_action(Sculpt *sd, StrokeCache *cache)
Mesh *me= NULL; /*XXX: get_mesh(OBACT); */
const float bstrength= brush_strength(sd, cache);
KeyBlock *keyblock= NULL; /*XXX: ob_get_keyblock(OBACT); */
- Brush *b = sd->brush;
+ Brush *b = brush;
int i;
sculpt_add_damaged_rect(ss);
@@ -800,7 +776,7 @@ static void do_brush_action(Sculpt *sd, StrokeCache *cache)
adata->Index = i;
/* Fade is used to store the final strength at which the brush
should modify a particular vertex. */
- adata->Fade= tex_strength(sd, vert, av_dist) * bstrength;
+ adata->Fade= tex_strength(sd, ss, vert, av_dist) * bstrength;
adata->dist = av_dist;
if(b->sculpt_tool == SCULPT_TOOL_GRAB && cache->first_time)
@@ -820,13 +796,13 @@ static void do_brush_action(Sculpt *sd, StrokeCache *cache)
do_draw_brush(sd, ss, &active_verts);
break;
case SCULPT_TOOL_SMOOTH:
- do_smooth_brush(sd, &active_verts);
+ do_smooth_brush(sd, ss, &active_verts);
break;
case SCULPT_TOOL_PINCH:
- do_pinch_brush(sd, &active_verts);
+ do_pinch_brush(sd, ss, &active_verts);
break;
case SCULPT_TOOL_INFLATE:
- do_inflate_brush(sd, &active_verts);
+ do_inflate_brush(sd, ss, &active_verts);
break;
case SCULPT_TOOL_GRAB:
do_grab_brush(sd, ss);
@@ -875,29 +851,21 @@ static void calc_brushdata_symm(StrokeCache *cache, const char symm)
cache->symmetry= symm;
}
-static void do_symmetrical_brush_actions(Sculpt *sd, StrokeCache *cache)
+static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
{
+ StrokeCache *cache = ss->cache;
const char symm = sd->flags & 7;
int i;
- /* Brush spacing: only apply dot if next dot is far enough away */
- if((sd->brush->flag & BRUSH_SPACE) && !(sd->brush->flag & BRUSH_ANCHORED) && !cache->first_time) {
- int dx = cache->last_dot[0] - cache->mouse[0];
- int dy = cache->last_dot[1] - cache->mouse[1];
- if(sqrt(dx*dx+dy*dy) < sd->brush->spacing)
- return;
- }
- memcpy(cache->last_dot, cache->mouse, sizeof(int) * 2);
-
VecCopyf(cache->location, cache->true_location);
VecCopyf(cache->grab_delta_symmetry, cache->grab_delta);
cache->symmetry = 0;
- do_brush_action(sd, cache);
+ do_brush_action(sd, ss, cache);
for(i = 1; i <= symm; ++i) {
if(symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5))) {
calc_brushdata_symm(cache, i);
- do_brush_action(sd, cache);
+ do_brush_action(sd, ss, cache);
}
}
@@ -970,9 +938,9 @@ static void projverts_clear_inside(SculptSession *ss)
}
#endif
-static void sculpt_update_tex(Sculpt *sd)
+static void sculpt_update_tex(Sculpt *sd, SculptSession *ss)
{
- SculptSession *ss= sd->session;
+ Brush *brush = paint_brush(&sd->paint);
if(ss->texcache) {
MEM_freeN(ss->texcache);
@@ -980,32 +948,13 @@ static void sculpt_update_tex(Sculpt *sd)
}
/* Need to allocate a bigger buffer for bigger brush size */
- ss->texcache_side = sd->brush->size * 2;
+ ss->texcache_side = brush->size * 2;
if(!ss->texcache || ss->texcache_side > ss->texcache_actual) {
- ss->texcache = brush_gen_texture_cache(sd->brush, sd->brush->size);
+ ss->texcache = brush_gen_texture_cache(brush, brush->size);
ss->texcache_actual = ss->texcache_side;
}
}
-void sculptmode_selectbrush_menu(void)
-{
- /* XXX: I guess menus belong elsewhere too?
-
- Sculpt *sd= sculpt_data();
- int val;
-
- pupmenu_set_active(sd->brush_type);
-
- val= pupmenu("Select Brush%t|Draw|Smooth|Pinch|Inflate|Grab|Layer|Flatten");
-
- if(val>0) {
- sd->brush_type= val;
-
- allqueue(REDRAWVIEW3D, 1);
- allqueue(REDRAWBUTSEDIT, 1);
- }*/
-}
-
static void sculptmode_update_all_projverts(SculptSession *ss)
{
unsigned i;
@@ -1052,8 +1001,8 @@ static struct MultiresModifierData *sculpt_multires_active(Object *ob)
static void sculpt_update_mesh_elements(bContext *C)
{
- SculptSession *ss = CTX_data_tool_settings(C)->sculpt->session;
Object *ob = CTX_data_active_object(C);
+ SculptSession *ss = ob->sculpt;
int oldtotvert = ss->totvert;
if((ss->multires = sculpt_multires_active(ob))) {
@@ -1084,134 +1033,22 @@ static void sculpt_update_mesh_elements(bContext *C)
}
}
-/* XXX: lots of drawing code (partial redraw), has to go elsewhere */
-#if 0
-void sculptmode_draw_wires(SculptSession *ss, int only_damaged)
-{
- Mesh *me = get_mesh(OBACT);
- int i;
-
- bglPolygonOffset(1.0);
- glDepthMask(0);
- BIF_ThemeColor((OBACT==OBACT)?TH_ACTIVE:TH_SELECT);
-
- for(i=0; i<me->totedge; i++) {
- MEdge *med= &me->medge[i];
-
- if((!only_damaged || (ss->projverts[med->v1].inside || ss->projverts[med->v2].inside)) &&
- (med->flag & ME_EDGEDRAW)) {
- glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, &med->v1);
- }
- }
-
- glDepthMask(1);
- bglPolygonOffset(0.0);
-}
-
-void sculptmode_draw_mesh(int only_damaged)
-{
- int i, j, dt, drawCurrentMat = 1, matnr= -1;
- SculptSession *ss = sculpt_session();
-
- sculpt_update_mesh_elements(ss, OBACT);
-
- persp(PERSP_VIEW);
- mymultmatrix(OBACT->obmat);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- /* XXX: GPU_set_object_materials(G.scene, OBACT, 0, NULL); */
- glEnable(GL_CULL_FACE);
-
- glShadeModel(GL_SMOOTH);
-
- glVertexPointer(3, GL_FLOAT, sizeof(MVert), &cache->mvert[0].co);
- glNormalPointer(GL_SHORT, sizeof(MVert), &cache->mvert[0].no);
-
- dt= MIN2(G.vd->drawtype, OBACT->dt);
- if(dt==OB_WIRE)
- glColorMask(0,0,0,0);
-
- for(i=0; i<ss->totface; ++i) {
- MFace *f= &ss->mface[i];
- char inside= 0;
- int new_matnr= f->mat_nr + 1;
-
- if(new_matnr != matnr)
- drawCurrentMat= GPU_enable_material(matnr = new_matnr, NULL);
-
- /* If only_damaged!=0, only draw faces that are partially
- inside the area(s) modified by the brush */
- if(only_damaged) {
- for(j=0; j<(f->v4?4:3); ++j) {
- if(ss->projverts[*((&f->v1)+j)].inside) {
- inside= 1;
- break;
- }
- }
- }
- else
- inside= 1;
-
- if(inside && drawCurrentMat)
- glDrawElements(f->v4?GL_QUADS:GL_TRIANGLES, f->v4?4:3, GL_UNSIGNED_INT, &f->v1);
- }
-
- glDisable(GL_CULL_FACE);
- glDisable(GL_LIGHTING);
- glColorMask(1,1,1,1);
-
- if(dt==OB_WIRE || (OBACT->dtx & OB_DRAWWIRE))
- sculptmode_draw_wires(ss, only_damaged);
-
- glDisable(GL_DEPTH_TEST);
-}
-#endif
-
static int sculpt_mode_poll(bContext *C)
{
- return G.f & G_SCULPTMODE;
-}
-
-static int sculpt_poll(bContext *C)
-{
- return G.f & G_SCULPTMODE && CTX_wm_area(C)->spacetype == SPACE_VIEW3D &&
- CTX_wm_region(C)->regiontype == RGN_TYPE_WINDOW;
+ Object *ob = CTX_data_active_object(C);
+ return ob && ob->mode & OB_MODE_SCULPT;
}
-/*** Sculpt Cursor ***/
-static void draw_paint_cursor(bContext *C, int x, int y, void *customdata)
+int sculpt_poll(bContext *C)
{
- Sculpt *sd= CTX_data_tool_settings(C)->sculpt;
-
- glTranslatef((float)x, (float)y, 0.0f);
-
- glColor4ub(255, 100, 100, 128);
- glEnable( GL_LINE_SMOOTH );
- glEnable(GL_BLEND);
- glutil_draw_lined_arc(0.0, M_PI*2.0, sd->brush->size, 40);
- glDisable(GL_BLEND);
- glDisable( GL_LINE_SMOOTH );
-
- glTranslatef((float)-x, (float)-y, 0.0f);
-}
-
-static void toggle_paint_cursor(bContext *C)
-{
- Sculpt *s = CTX_data_scene(C)->toolsettings->sculpt;
-
- if(s->session->cursor) {
- WM_paint_cursor_end(CTX_wm_manager(C), s->session->cursor);
- s->session->cursor = NULL;
- }
- else {
- s->session->cursor =
- WM_paint_cursor_activate(CTX_wm_manager(C), sculpt_poll, draw_paint_cursor, NULL);
- }
+ return sculpt_mode_poll(C) && paint_poll(C);
}
static void sculpt_undo_push(bContext *C, Sculpt *sd)
{
- switch(sd->brush->sculpt_tool) {
+ Brush *brush = paint_brush(&sd->paint);
+
+ switch(brush->sculpt_tool) {
case SCULPT_TOOL_DRAW:
ED_undo_push(C, "Draw Brush"); break;
case SCULPT_TOOL_SMOOTH:
@@ -1231,36 +1068,15 @@ static void sculpt_undo_push(bContext *C, Sculpt *sd)
}
}
-static int sculpt_brush_curve_preset_exec(bContext *C, wmOperator *op)
-{
- brush_curve_preset(CTX_data_scene(C)->toolsettings->sculpt->brush, RNA_enum_get(op->ptr, "mode"));
- return OPERATOR_FINISHED;
-}
-
-static void SCULPT_OT_brush_curve_preset(wmOperatorType *ot)
-{
- static EnumPropertyItem prop_mode_items[] = {
- {BRUSH_PRESET_SHARP, "SHARP", 0, "Sharp Curve", ""},
- {BRUSH_PRESET_SMOOTH, "SMOOTH", 0, "Smooth Curve", ""},
- {BRUSH_PRESET_MAX, "MAX", 0, "Max Curve", ""},
- {0, NULL, 0, NULL, NULL}};
-
- ot->name= "Preset";
- ot->idname= "SCULPT_OT_brush_curve_preset";
-
- ot->exec= sculpt_brush_curve_preset_exec;
- ot->poll= sculpt_mode_poll;
-
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- RNA_def_enum(ot->srna, "mode", prop_mode_items, BRUSH_PRESET_SHARP, "Mode", "");
-}
-
/**** Radial control ****/
static int sculpt_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- toggle_paint_cursor(C);
- brush_radial_control_invoke(op, CTX_data_scene(C)->toolsettings->sculpt->brush, 1);
+ Paint *p = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(p);
+
+ WM_paint_cursor_end(CTX_wm_manager(C), p->paint_cursor);
+ p->paint_cursor = NULL;
+ brush_radial_control_invoke(op, brush, 1);
return WM_radial_control_invoke(C, op, event);
}
@@ -1268,13 +1084,18 @@ static int sculpt_radial_control_modal(bContext *C, wmOperator *op, wmEvent *eve
{
int ret = WM_radial_control_modal(C, op, event);
if(ret != OPERATOR_RUNNING_MODAL)
- toggle_paint_cursor(C);
+ paint_cursor_start(C, sculpt_poll);
return ret;
}
static int sculpt_radial_control_exec(bContext *C, wmOperator *op)
{
- return brush_radial_control_exec(op, CTX_data_scene(C)->toolsettings->sculpt->brush, 1);
+ Brush *brush = paint_brush(&CTX_data_tool_settings(C)->sculpt->paint);
+ int ret = brush_radial_control_exec(op, brush, 1);
+
+ WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
+
+ return ret;
}
static void SCULPT_OT_radial_control(wmOperatorType *ot)
@@ -1289,7 +1110,7 @@ static void SCULPT_OT_radial_control(wmOperatorType *ot)
ot->exec= sculpt_radial_control_exec;
ot->poll= sculpt_poll;
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
/**** Operator for applying a stroke (various attributes including mouse path)
@@ -1300,7 +1121,7 @@ static float unproject_brush_radius(SculptSession *ss, float offset)
float brush_edge[3];
/* In anchored mode, brush size changes with mouse loc, otherwise it's fixed using the brush radius */
- unproject(ss->cache->mats, brush_edge, ss->cache->initial_mouse[0] + offset,
+ view3d_unproject(ss->cache->mats, brush_edge, ss->cache->initial_mouse[0] + offset,
ss->cache->initial_mouse[1], ss->cache->depth);
return VecLenf(ss->cache->true_location, brush_edge);
@@ -1308,99 +1129,121 @@ static float unproject_brush_radius(SculptSession *ss, float offset)
static void sculpt_cache_free(StrokeCache *cache)
{
- if(cache->layer_disps)
- MEM_freeN(cache->layer_disps);
- if(cache->mesh_store)
- MEM_freeN(cache->mesh_store);
+ int i;
if(cache->orig_norms)
MEM_freeN(cache->orig_norms);
if(cache->face_norms)
MEM_freeN(cache->face_norms);
if(cache->mats)
MEM_freeN(cache->mats);
+ for(i = 0; i < 8; ++i)
+ BLI_freelistN(&cache->grab_active_verts[i]);
MEM_freeN(cache);
}
/* Initialize the stroke cache invariants from operator properties */
-static void sculpt_update_cache_invariants(Sculpt *sd, bContext *C, wmOperator *op)
+static void sculpt_update_cache_invariants(Sculpt *sd, SculptSession *ss, bContext *C, wmOperator *op)
{
StrokeCache *cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
+ Brush *brush = paint_brush(&sd->paint);
+ ViewContext *vc = paint_stroke_view_context(op->customdata);
int i;
- sd->session->cache = cache;
+ ss->cache = cache;
RNA_float_get_array(op->ptr, "scale", cache->scale);
cache->flag = RNA_int_get(op->ptr, "flag");
RNA_float_get_array(op->ptr, "clip_tolerance", cache->clip_tolerance);
- RNA_int_get_array(op->ptr, "initial_mouse", cache->initial_mouse);
+ RNA_float_get_array(op->ptr, "initial_mouse", cache->initial_mouse);
cache->depth = RNA_float_get(op->ptr, "depth");
- /* Truly temporary data that isn't stored in properties */
+ cache->mouse[0] = cache->initial_mouse[0];
+ cache->mouse[1] = cache->initial_mouse[1];
- view3d_set_viewcontext(C, &cache->vc);
+ /* Truly temporary data that isn't stored in properties */
cache->mats = MEM_callocN(sizeof(bglMats), "sculpt bglMats");
- view3d_get_transformation(&cache->vc, cache->vc.obact, cache->mats);
+ view3d_get_transformation(vc, vc->obact, cache->mats);
sculpt_update_mesh_elements(C);
- if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER)
- cache->layer_disps = MEM_callocN(sizeof(float) * sd->session->totvert, "layer brush displacements");
+ /* Initialize layer brush displacements */
+ if(brush->sculpt_tool == SCULPT_TOOL_LAYER &&
+ (!ss->layer_disps || !(brush->flag & BRUSH_PERSISTENT))) {
+ if(ss->layer_disps)
+ MEM_freeN(ss->layer_disps);
+ ss->layer_disps = MEM_callocN(sizeof(float) * ss->totvert, "layer brush displacements");
+ }
/* Make copies of the mesh vertex locations and normals for some tools */
- if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER || (sd->brush->flag & BRUSH_ANCHORED)) {
- cache->mesh_store= MEM_mallocN(sizeof(float) * 3 * sd->session->totvert, "sculpt mesh vertices copy");
- for(i = 0; i < sd->session->totvert; ++i)
- VecCopyf(cache->mesh_store[i], sd->session->mvert[i].co);
-
- if(sd->brush->flag & BRUSH_ANCHORED) {
- cache->orig_norms= MEM_mallocN(sizeof(short) * 3 * sd->session->totvert, "Sculpt orig norm");
- for(i = 0; i < sd->session->totvert; ++i) {
- cache->orig_norms[i][0] = sd->session->mvert[i].no[0];
- cache->orig_norms[i][1] = sd->session->mvert[i].no[1];
- cache->orig_norms[i][2] = sd->session->mvert[i].no[2];
+ if(brush->sculpt_tool == SCULPT_TOOL_LAYER || (brush->flag & BRUSH_ANCHORED)) {
+ if(brush->sculpt_tool != SCULPT_TOOL_LAYER ||
+ !ss->mesh_co_orig || !(brush->flag & BRUSH_PERSISTENT)) {
+ if(!ss->mesh_co_orig)
+ ss->mesh_co_orig= MEM_mallocN(sizeof(float) * 3 * ss->totvert,
+ "sculpt mesh vertices copy");
+ for(i = 0; i < ss->totvert; ++i)
+ VecCopyf(ss->mesh_co_orig[i], ss->mvert[i].co);
+ }
+
+ if(brush->flag & BRUSH_ANCHORED) {
+ cache->orig_norms= MEM_mallocN(sizeof(short) * 3 * ss->totvert, "Sculpt orig norm");
+ for(i = 0; i < ss->totvert; ++i) {
+ cache->orig_norms[i][0] = ss->mvert[i].no[0];
+ cache->orig_norms[i][1] = ss->mvert[i].no[1];
+ cache->orig_norms[i][2] = ss->mvert[i].no[2];
}
- if(sd->session->face_normals) {
- float *fn = sd->session->face_normals;
- cache->face_norms= MEM_mallocN(sizeof(float) * 3 * sd->session->totface, "Sculpt face norms");
- for(i = 0; i < sd->session->totface; ++i, fn += 3)
+ if(ss->face_normals) {
+ float *fn = ss->face_normals;
+ cache->face_norms= MEM_mallocN(sizeof(float) * 3 * ss->totface, "Sculpt face norms");
+ for(i = 0; i < ss->totface; ++i, fn += 3)
VecCopyf(cache->face_norms[i], fn);
}
}
}
- unproject(cache->mats, cache->true_location, cache->initial_mouse[0], cache->initial_mouse[1], cache->depth);
- cache->radius = unproject_brush_radius(sd->session, brush_size(sd));
+ view3d_unproject(cache->mats, cache->true_location, cache->initial_mouse[0], cache->initial_mouse[1], cache->depth);
+ cache->initial_radius = unproject_brush_radius(ss, brush->size);
cache->rotation = 0;
cache->first_time = 1;
}
/* Initialize the stroke cache variants from operator properties */
-static void sculpt_update_cache_variants(Sculpt *sd, PointerRNA *ptr)
+static void sculpt_update_cache_variants(Sculpt *sd, SculptSession *ss, PointerRNA *ptr)
{
- StrokeCache *cache = sd->session->cache;
+ StrokeCache *cache = ss->cache;
+ Brush *brush = paint_brush(&sd->paint);
float grab_location[3];
+
int dx, dy;
- if(!(sd->brush->flag & BRUSH_ANCHORED))
+ if(!(brush->flag & BRUSH_ANCHORED))
RNA_float_get_array(ptr, "location", cache->true_location);
cache->flip = RNA_boolean_get(ptr, "flip");
- RNA_int_get_array(ptr, "mouse", cache->mouse);
+ RNA_float_get_array(ptr, "mouse", cache->mouse);
+ cache->pressure = RNA_float_get(ptr, "pressure");
/* Truly temporary data that isn't stored in properties */
cache->previous_pixel_radius = cache->pixel_radius;
- cache->pixel_radius = brush_size(sd);
+ cache->pixel_radius = brush->size;
- if(sd->brush->flag & BRUSH_ANCHORED) {
+ if(brush->flag & BRUSH_SIZE_PRESSURE) {
+ cache->pixel_radius *= cache->pressure;
+ cache->radius = cache->initial_radius * cache->pressure;
+ }
+ else
+ cache->radius = cache->initial_radius;
+
+ if(brush->flag & BRUSH_ANCHORED) {
dx = cache->mouse[0] - cache->initial_mouse[0];
dy = cache->mouse[1] - cache->initial_mouse[1];
cache->pixel_radius = sqrt(dx*dx + dy*dy);
- cache->radius = unproject_brush_radius(sd->session, cache->pixel_radius);
+ cache->radius = unproject_brush_radius(ss, cache->pixel_radius);
cache->rotation = atan2(dy, dx);
}
- else if(sd->brush->flag & BRUSH_RAKE) {
+ else if(brush->flag & BRUSH_RAKE) {
int update;
dx = cache->last_rake[0] - cache->mouse[0];
@@ -1419,8 +1262,8 @@ static void sculpt_update_cache_variants(Sculpt *sd, PointerRNA *ptr)
}
/* Find the grab delta */
- if(sd->brush->sculpt_tool == SCULPT_TOOL_GRAB) {
- unproject(cache->mats, grab_location, cache->mouse[0], cache->mouse[1], cache->depth);
+ if(brush->sculpt_tool == SCULPT_TOOL_GRAB) {
+ view3d_unproject(cache->mats, grab_location, cache->mouse[0], cache->mouse[1], cache->depth);
if(!cache->first_time)
VecSubf(cache->grab_delta, grab_location, cache->old_grab_location);
VecCopyf(cache->old_grab_location, grab_location);
@@ -1433,9 +1276,9 @@ static void sculpt_brush_stroke_init_properties(bContext *C, wmOperator *op, wmE
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
Object *ob= CTX_data_active_object(C);
ModifierData *md;
- ViewContext vc;
float scale[3], clip_tolerance[3] = {0,0,0};
- int mouse[2], flag = 0;
+ float mouse[2];
+ int flag = 0;
/* Set scaling adjustment */
scale[0] = 1.0f / ob->size[0];
@@ -1462,45 +1305,39 @@ static void sculpt_brush_stroke_init_properties(bContext *C, wmOperator *op, wmE
/* Initial mouse location */
mouse[0] = event->x;
mouse[1] = event->y;
- RNA_int_set_array(op->ptr, "initial_mouse", mouse);
+ RNA_float_set_array(op->ptr, "initial_mouse", mouse);
/* Initial screen depth under the mouse */
- view3d_set_viewcontext(C, &vc);
- RNA_float_set(op->ptr, "depth", read_cached_depth(&vc, event->x, event->y));
+ RNA_float_set(op->ptr, "depth", read_cached_depth(paint_stroke_view_context(op->customdata), event->x, event->y));
- sculpt_update_cache_invariants(sd, C, op);
+ sculpt_update_cache_invariants(sd, ss, C, op);
}
-static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static void sculpt_brush_stroke_init(bContext *C)
{
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
view3d_operator_needs_opengl(C);
- sculpt_brush_stroke_init_properties(C, op, event, sd->session);
-
- sculptmode_update_all_projverts(sd->session);
/* TODO: Shouldn't really have to do this at the start of every
stroke, but sculpt would need some sort of notification when
changes are made to the texture. */
- sculpt_update_tex(sd);
+ sculpt_update_tex(sd, ss);
- /* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
-
- return OPERATOR_RUNNING_MODAL;
+ sculpt_update_mesh_elements(C);
}
-static void sculpt_restore_mesh(Sculpt *sd)
+static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss)
{
- SculptSession *ss = sd->session;
StrokeCache *cache = ss->cache;
+ Brush *brush = paint_brush(&sd->paint);
int i;
/* Restore the mesh before continuing with anchored stroke */
- if((sd->brush->flag & BRUSH_ANCHORED) && cache->mesh_store) {
+ if((brush->flag & BRUSH_ANCHORED) && ss->mesh_co_orig) {
for(i = 0; i < ss->totvert; ++i) {
- VecCopyf(ss->mvert[i].co, cache->mesh_store[i]);
+ VecCopyf(ss->mvert[i].co, ss->mesh_co_orig[i]);
ss->mvert[i].no[0] = cache->orig_norms[i][0];
ss->mvert[i].no[1] = cache->orig_norms[i][1];
ss->mvert[i].no[2] = cache->orig_norms[i][2];
@@ -1512,8 +1349,8 @@ static void sculpt_restore_mesh(Sculpt *sd)
VecCopyf(fn, cache->face_norms[i]);
}
- if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER)
- memset(cache->layer_disps, 0, sizeof(float) * ss->totvert);
+ if(brush->sculpt_tool == SCULPT_TOOL_LAYER)
+ memset(ss->layer_disps, 0, sizeof(float) * ss->totvert);
}
}
@@ -1525,84 +1362,107 @@ static void sculpt_post_stroke_free(SculptSession *ss)
static void sculpt_flush_update(bContext *C)
{
- Sculpt *s = CTX_data_tool_settings(C)->sculpt;
+ Object *ob = CTX_data_active_object(C);
+ SculptSession *ss = ob->sculpt;
ARegion *ar = CTX_wm_region(C);
- MultiresModifierData *mmd = s->session->multires;
+ MultiresModifierData *mmd = ss->multires;
- calc_damaged_verts(s->session);
+ calc_damaged_verts(ss);
if(mmd) {
- if(mmd->undo_verts && mmd->undo_verts != s->session->mvert)
+ if(mmd->undo_verts && mmd->undo_verts != ss->mvert)
MEM_freeN(mmd->undo_verts);
- mmd->undo_verts = s->session->mvert;
- mmd->undo_verts_tot = s->session->totvert;
- multires_mark_as_modified(CTX_data_active_object(C));
+ mmd->undo_verts = ss->mvert;
+ mmd->undo_verts_tot = ss->totvert;
+ multires_mark_as_modified(ob);
}
ED_region_tag_redraw(ar);
}
-static int sculpt_brush_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *event)
{
- PointerRNA itemptr;
- Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
- float center[3];
- int mouse[2] = {event->x, event->y};
+ ViewContext vc;
+ float cur_depth;
- sculpt_update_mesh_elements(C);
+ view3d_set_viewcontext(C, &vc);
+ cur_depth = read_cached_depth(&vc, event->x, event->y);
+
+ /* Don't start the stroke until a valid depth is found */
+ if(cur_depth < 1.0 - FLT_EPSILON) {
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
+
+ sculpt_brush_stroke_init_properties(C, op, event, ss);
+ sculptmode_update_all_projverts(ss);
- unproject(sd->session->cache->mats, center, event->x, event->y,
- read_cached_depth(&sd->session->cache->vc, event->x, event->y));
+ return 1;
+ }
+ else
+ return 0;
+}
- /* Add to stroke */
- RNA_collection_add(op->ptr, "stroke", &itemptr);
- RNA_float_set_array(&itemptr, "location", center);
- RNA_int_set_array(&itemptr, "mouse", mouse);
- RNA_boolean_set(&itemptr, "flip", event->shift);
- sculpt_update_cache_variants(sd, &itemptr);
+static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
+{
+ Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
- sculpt_restore_mesh(sd);
- do_symmetrical_brush_actions(CTX_data_tool_settings(C)->sculpt, sd->session->cache);
+ sculpt_update_cache_variants(sd, ss, itemptr);
+ sculpt_restore_mesh(sd, ss);
+ do_symmetrical_brush_actions(sd, ss);
+ /* Cleanup */
sculpt_flush_update(C);
- sculpt_post_stroke_free(sd->session);
+ sculpt_post_stroke_free(ss);
+}
- /* Finished */
- if(event->type == LEFTMOUSE && event->val == 0) {
- request_depth_update(sd->session->cache->vc.rv3d);
+static void sculpt_stroke_done(bContext *C, struct PaintStroke *stroke)
+{
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
- sculpt_cache_free(sd->session->cache);
+ /* Finished */
+ if(ss->cache) {
+ Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ request_depth_update(paint_stroke_view_context(stroke)->rv3d);
+ sculpt_cache_free(ss->cache);
+ ss->cache = NULL;
sculpt_undo_push(C, sd);
-
- return OPERATOR_FINISHED;
}
+}
+
+static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ sculpt_brush_stroke_init(C);
+
+ op->customdata = paint_stroke_new(C, sculpt_stroke_test_start,
+ sculpt_stroke_update_step,
+ sculpt_stroke_done);
+ /* add modal handler */
+ WM_event_add_modal_handler(C, op);
+
+ op->type->modal(C, op, event);
+
return OPERATOR_RUNNING_MODAL;
}
static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
{
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
- view3d_operator_needs_opengl(C);
- sculpt_update_cache_invariants(sd, C, op);
- sculptmode_update_all_projverts(sd->session);
- sculpt_update_tex(sd);
+ op->customdata = paint_stroke_new(C, sculpt_stroke_test_start, sculpt_stroke_update_step, sculpt_stroke_done);
- RNA_BEGIN(op->ptr, itemptr, "stroke") {
- sculpt_update_cache_variants(sd, &itemptr);
+ sculpt_brush_stroke_init(C);
- sculpt_restore_mesh(sd);
- do_symmetrical_brush_actions(sd, sd->session->cache);
+ sculpt_update_cache_invariants(sd, ss, C, op);
+ sculptmode_update_all_projverts(ss);
- sculpt_post_stroke_free(sd->session);
- }
- RNA_END;
+ paint_stroke_exec(C, op);
sculpt_flush_update(C);
- sculpt_cache_free(sd->session->cache);
+ sculpt_cache_free(ss->cache);
sculpt_undo_push(C, sd);
@@ -1619,12 +1479,12 @@ static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
/* api callbacks */
ot->invoke= sculpt_brush_stroke_invoke;
- ot->modal= sculpt_brush_stroke_modal;
+ ot->modal= paint_stroke_modal;
ot->exec= sculpt_brush_stroke_exec;
ot->poll= sculpt_poll;
/* flags (sculpt does own undo? (ton) */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING;
/* properties */
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
@@ -1639,62 +1499,80 @@ static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
RNA_def_float_vector(ot->srna, "clip_tolerance", 3, NULL, 0.0f, FLT_MAX, "clip_tolerance", "", 0.0f, 1000.0f);
/* The initial 2D location of the mouse */
- RNA_def_int_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "initial_mouse", "", INT_MIN, INT_MAX);
+ RNA_def_float_vector(ot->srna, "initial_mouse", 2, NULL, INT_MIN, INT_MAX, "initial_mouse", "", INT_MIN, INT_MAX);
/* The initial screen depth of the mouse */
RNA_def_float(ot->srna, "depth", 0.0f, 0.0f, FLT_MAX, "depth", "", 0.0f, FLT_MAX);
}
+/**** Reset the copy of the mesh that is being sculpted on (currently just for the layer brush) ****/
+
+static int sculpt_set_persistent_base(bContext *C, wmOperator *op)
+{
+ SculptSession *ss = CTX_data_active_object(C)->sculpt;
+
+ if(ss) {
+ if(ss->layer_disps)
+ MEM_freeN(ss->layer_disps);
+ ss->layer_disps = NULL;
+
+ if(ss->mesh_co_orig)
+ MEM_freeN(ss->mesh_co_orig);
+ ss->mesh_co_orig = NULL;
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCULPT_OT_set_persistent_base(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Persistent Base";
+ ot->idname= "SCULPT_OT_set_persistent_base";
+
+ /* api callbacks */
+ ot->exec= sculpt_set_persistent_base;
+ ot->poll= sculpt_mode_poll;
+
+ ot->flag= OPTYPE_REGISTER;
+}
+
/**** Toggle operator for turning sculpt mode on or off ****/
static int sculpt_toggle_mode(bContext *C, wmOperator *op)
{
ToolSettings *ts = CTX_data_tool_settings(C);
+ Object *ob = CTX_data_active_object(C);
- if(G.f & G_SCULPTMODE) {
- multires_force_update(CTX_data_active_object(C));
+ if(ob->mode & OB_MODE_SCULPT) {
+ multires_force_update(ob);
/* Leave sculptmode */
- G.f &= ~G_SCULPTMODE;
-
- toggle_paint_cursor(C);
+ ob->mode &= ~OB_MODE_SCULPT;
- sculptsession_free(ts->sculpt);
+ free_sculptsession(&ob->sculpt);
}
else {
- MTex *mtex; // XXX: temporary
-
/* Enter sculptmode */
- G.f |= G_SCULPTMODE;
+ ob->mode |= OB_MODE_SCULPT;
/* Create persistent sculpt mode data */
if(!ts->sculpt)
ts->sculpt = MEM_callocN(sizeof(Sculpt), "sculpt mode data");
/* Create sculpt mode session data */
- if(ts->sculpt->session)
- MEM_freeN(ts->sculpt->session);
- ts->sculpt->session = MEM_callocN(sizeof(SculptSession), "sculpt session");
-
- toggle_paint_cursor(C);
-
- /* If there's no brush, create one */
- brush_check_exists(&ts->sculpt->brush);
-
- /* XXX: testing: set the brush texture to the first available one */
- if(G.main->tex.first) {
- Tex *tex = G.main->tex.first;
- if(tex->type) {
- mtex = MEM_callocN(sizeof(MTex), "test mtex");
- ts->sculpt->brush->texact = 0;
- ts->sculpt->brush->mtex[0] = mtex;
- mtex->tex = tex;
- mtex->size[0] = mtex->size[1] = mtex->size[2] = 50;
- }
- }
+ if(ob->sculpt)
+ free_sculptsession(&ob->sculpt);
+ ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt session");
+
+ paint_init(&ts->sculpt->paint, PAINT_CURSOR_SCULPT);
+
+ paint_cursor_start(C, sculpt_poll);
}
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE, CTX_data_scene(C));
+
return OPERATOR_FINISHED;
}
@@ -1716,456 +1594,5 @@ void ED_operatortypes_sculpt()
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_brush_curve_preset);
-}
-
-void sculpt(Sculpt *sd)
-{
-#if 0
- SculptSession *ss= sd->session;
- Object *ob= NULL; /*XXX */
- Mesh *me;
- MultiresModifierData *mmd = NULL;
- /* lastSigMouse is for the rake, to store the last place the mouse movement was significant */
- short mouse[2], mvalo[2], lastSigMouse[2],firsttime=1, mousebut;
- short modifier_calculations= 0;
- BrushAction *a = MEM_callocN(sizeof(BrushAction), "brush action");
- short spacing= 32000;
- int scissor_box[4];
- float offsetRot;
- int smooth_stroke = 0, i;
- int anchored, rake = 0 /* XXX: rake = ? */;
-
- /* XXX: checking that sculpting is allowed
- if(!(G.f & G_SCULPTMODE) || G.obedit || !ob || ob->id.lib || !get_mesh(ob) || (get_mesh(ob)->totface == 0))
- return;
- if(!(ob->lay & G.vd->lay))
- error("Active object is not in this layer");
- if(ob_get_keyblock(ob)) {
- if(!(ob->shapeflag & OB_SHAPE_LOCK)) {
- error("Cannot sculpt on unlocked shape key");
- return;
- }
- }*/
-
- anchored = sd->brush->flag & BRUSH_ANCHORED;
- smooth_stroke = (sd->flags & SCULPT_INPUT_SMOOTH) && (sd->brush->sculpt_tool != SCULPT_TOOL_GRAB) && !anchored;
-
- if(smooth_stroke)
- sculpt_stroke_new(256);
-
- ss->damaged_rects.first = ss->damaged_rects.last = NULL;
- ss->damaged_verts.first = ss->damaged_verts.last = NULL;
- ss->vertexcosnos = NULL;
-
- mmd = sculpt_multires_active(ob);
-
- /* Check that vertex users are up-to-date */
- if(ob != active_ob || !ss->vertex_users || ss->vertex_users_size != cache->totvert) {
- sculpt_vertexusers_free(ss);
- calc_vertex_users(ss);
- if(ss->projverts)
- MEM_freeN(ss->projverts);
- ss->projverts = NULL;
- active_ob= ob;
- }
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
-
- /*XXX:
- persp(PERSP_VIEW);
- getmouseco_areawin(mvalo);*/
-
- /* Init texture
- FIXME: Shouldn't be doing this every time! */
- if(sd->tex_mode!=SCULPTREPT_3D)
- sculptmode_update_tex(sd);
-
- /*XXX: getmouseco_areawin(mouse); */
- mvalo[0]= mouse[0];
- mvalo[1]= mouse[1];
- lastSigMouse[0]=mouse[0];
- lastSigMouse[1]=mouse[1];
- mousebut = 0; /* XXX: L_MOUSE; */
-
- /* If modifier_calculations is true, then extra time must be spent
- updating the mesh. This takes a *lot* longer, so it's worth
- skipping if the modifier stack is empty. */
- modifier_calculations= sculpt_modifiers_active(ob);
-
- if(modifier_calculations)
- ss->vertexcosnos= mesh_get_mapped_verts_nors(NULL, ob); /* XXX: scene = ? */
- sculptmode_update_all_projverts(ss);
-
- /* Capture original copy */
- if(sd->flags & SCULPT_DRAW_FAST)
- glAccum(GL_LOAD, 1);
-
- /* Get original scissor box */
- glGetIntegerv(GL_SCISSOR_BOX, scissor_box);
-
- /* For raking, get the original angle*/
- offsetRot=sculpt_tex_angle(sd);
-
- me = get_mesh(ob);
-
- while (/*XXX:get_mbut() & mousebut*/0) {
- /* XXX: getmouseco_areawin(mouse); */
- /* If rake, and the mouse has moved over 10 pixels (euclidean) (prevents jitter) then get the new angle */
- if (rake && (pow(lastSigMouse[0]-mouse[0],2)+pow(lastSigMouse[1]-mouse[1],2))>100){
- /*Nasty looking, but just orig + new angle really*/
- set_tex_angle(sd, offsetRot+180.+to_deg(atan2((float)(mouse[1]-lastSigMouse[1]),(float)(mouse[0]-lastSigMouse[0]))));
- lastSigMouse[0]=mouse[0];
- lastSigMouse[1]=mouse[1];
- }
-
- if(firsttime || mouse[0]!=mvalo[0] || mouse[1]!=mvalo[1] ||
- sd->brush->flag & BRUSH_AIRBRUSH) {
- a->firsttime = firsttime;
- firsttime= 0;
-
- if(smooth_stroke)
- sculpt_stroke_add_point(ss->stroke, mouse[0], mouse[1]);
-
- spacing+= sqrt(pow(mvalo[0]-mouse[0],2)+pow(mvalo[1]-mouse[1],2));
-
- if(modifier_calculations && !ss->vertexcosnos)
- ss->vertexcosnos= mesh_get_mapped_verts_nors(NULL, ob); /*XXX scene = ? */
-
- if(sd->brush->sculpt_tool != SCULPT_TOOL_GRAB) {
- if(anchored) {
- /* Restore the mesh before continuing with anchored stroke */
- /*if(a->mesh_store) {
- for(i = 0; i < cache->totvert; ++i) {
- VecCopyf(cache->mvert[i].co, &a->mesh_store[i].x);
- cache->mvert[i].no[0] = a->orig_norms[i][0];
- cache->mvert[i].no[1] = a->orig_norms[i][1];
- cache->mvert[i].no[2] = a->orig_norms[i][2];
- }
- }*/
-
- //do_symmetrical_brush_actions(sd, a, mouse, NULL);
- }
- else {
- if(smooth_stroke) {
- sculpt_stroke_apply(sd, ss->stroke);
- }
- else if(sd->spacing==0 || spacing>sd->spacing) {
- //do_symmetrical_brush_actions(sd, a, mouse, NULL);
- spacing= 0;
- }
- }
- }
- else {
- //do_symmetrical_brush_actions(sd, a, mouse, mvalo);
- //unproject(ss, sd->pivot, mouse[0], mouse[1], a->depth);
- }
-
- if((!ss->multires && modifier_calculations) || ob_get_keyblock(ob)) {
- /* XXX: DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); */ }
-
- if(modifier_calculations || sd->brush->sculpt_tool == SCULPT_TOOL_GRAB || !(sd->flags & SCULPT_DRAW_FAST)) {
- calc_damaged_verts(ss, a);
- /*XXX: scrarea_do_windraw(curarea);
- screen_swapbuffers(); */
- } else { /* Optimized drawing */
- calc_damaged_verts(ss, a);
-
- /* Draw the stored image to the screen */
- glAccum(GL_RETURN, 1);
-
- sculpt_clear_damaged_areas(ss);
-
- /* Draw all the polygons that are inside the modified area(s) */
- glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]);
- /* XXX: sculptmode_draw_mesh(1); */
- glAccum(GL_LOAD, 1);
-
- projverts_clear_inside(ss);
-
- /* XXX: persp(PERSP_WIN); */
- glDisable(GL_DEPTH_TEST);
-
- /* Draw cursor */
- if(sd->flags & SCULPT_TOOL_DRAW)
- fdrawXORcirc((float)mouse[0],(float)mouse[1],sd->brush->size);
- /* XXX: if(smooth_stroke)
- sculpt_stroke_draw();
-
- myswapbuffers(); */
- }
-
- BLI_freelistN(&ss->damaged_rects);
- ss->damaged_rects.first = ss->damaged_rects.last = NULL;
-
- mvalo[0]= mouse[0];
- mvalo[1]= mouse[1];
-
- if(ss->vertexcosnos) {
- MEM_freeN(ss->vertexcosnos);
- ss->vertexcosnos= NULL;
- }
-
- }
- else { /*XXX:BIF_wait_for_statechange();*/ }
- }
-
- /* Set the rotation of the brush back to what it was before any rake */
- set_tex_angle(sd, offsetRot);
-
- if(smooth_stroke) {
- sculpt_stroke_apply_all(sd, ss->stroke);
- calc_damaged_verts(ss, a);
- BLI_freelistN(&ss->damaged_rects);
- }
-
- //if(a->layer_disps) MEM_freeN(a->layer_disps);
- //if(a->mesh_store) MEM_freeN(a->mesh_store);
- //if(a->orig_norms) MEM_freeN(a->orig_norms);
- for(i=0; i<8; ++i)
- BLI_freelistN(&a->grab_active_verts[i]);
- MEM_freeN(a);
- sculpt_stroke_free(ss->stroke);
- ss->stroke = NULL;
-
- if(mmd) {
- if(mmd->undo_verts && mmd->undo_verts != cache->mvert)
- MEM_freeN(mmd->undo_verts);
-
- mmd->undo_verts = cache->mvert;
- mmd->undo_verts_tot = cache->totvert;
- }
-
- //sculpt_undo_push(sd);
-
- /* XXX: if(G.vd->depths) G.vd->depths->damaged= 1;
- allqueue(REDRAWVIEW3D, 0); */
-#endif
+ WM_operatortype_append(SCULPT_OT_set_persistent_base);
}
-
-/* Partial Mesh Visibility */
-
-/* XXX: Partial vis. always was a mess, have to figure something out */
-#if 0
-/* mode: 0=hide outside selection, 1=hide inside selection */
-static void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
-{
- Mesh *me= get_mesh(ob);
- float hidebox[6][3];
- vec3f plane_normals[4];
- float plane_ds[4];
- unsigned i, j;
- unsigned ndx_show, ndx_hide;
- MVert *nve;
- unsigned face_cnt_show= 0, face_ndx_show= 0;
- unsigned edge_cnt_show= 0, edge_ndx_show= 0;
- unsigned *old_map= NULL;
- const unsigned SHOW= 0, HIDE=1;
-
- /* Convert hide box from 2D to 3D */
- unproject(hidebox[0], hb_2d->xmin, hb_2d->ymax, 1);
- unproject(hidebox[1], hb_2d->xmax, hb_2d->ymax, 1);
- unproject(hidebox[2], hb_2d->xmax, hb_2d->ymin, 1);
- unproject(hidebox[3], hb_2d->xmin, hb_2d->ymin, 1);
- unproject(hidebox[4], hb_2d->xmin, hb_2d->ymax, 0);
- unproject(hidebox[5], hb_2d->xmax, hb_2d->ymin, 0);
-
- /* Calculate normals for each side of hide box */
- CalcNormFloat(hidebox[0], hidebox[1], hidebox[4], &plane_normals[0].x);
- CalcNormFloat(hidebox[1], hidebox[2], hidebox[5], &plane_normals[1].x);
- CalcNormFloat(hidebox[2], hidebox[3], hidebox[5], &plane_normals[2].x);
- CalcNormFloat(hidebox[3], hidebox[0], hidebox[4], &plane_normals[3].x);
-
- /* Calculate D for each side of hide box */
- for(i= 0; i<4; ++i)
- plane_ds[i]= hidebox[i][0]*plane_normals[i].x + hidebox[i][1]*plane_normals[i].y +
- hidebox[i][2]*plane_normals[i].z;
-
- /* Add partial visibility to mesh */
- if(!me->pv) {
- me->pv= MEM_callocN(sizeof(PartialVisibility),"PartialVisibility");
- } else {
- old_map= MEM_callocN(sizeof(unsigned)*me->pv->totvert,"PMV oldmap");
- for(i=0; i<me->pv->totvert; ++i) {
- old_map[i]= me->pv->vert_map[i]<me->totvert?0:1;
- }
- mesh_pmv_revert(ob, me);
- }
-
- /* Kill sculpt data */
- active_ob= NULL;
-
- /* Initalize map with which verts are to be hidden */
- me->pv->vert_map= MEM_mallocN(sizeof(unsigned)*me->totvert, "PMV vertmap");
- me->pv->totvert= me->totvert;
- me->totvert= 0;
- for(i=0; i<me->pv->totvert; ++i) {
- me->pv->vert_map[i]= mode ? HIDE:SHOW;
- for(j=0; j<4; ++j) {
- if(me->mvert[i].co[0] * plane_normals[j].x +
- me->mvert[i].co[1] * plane_normals[j].y +
- me->mvert[i].co[2] * plane_normals[j].z < plane_ds[j] ) {
- me->pv->vert_map[i]= mode ? SHOW:HIDE; /* Vert is outside the hide box */
- break;
- }
- }
- if(old_map && old_map[i]) me->pv->vert_map[i]= 1;
- if(!me->pv->vert_map[i]) ++me->totvert;
-
- }
- if(old_map) MEM_freeN(old_map);
-
- /* Find out how many faces to show */
- for(i=0; i<me->totface; ++i) {
- if(!me->pv->vert_map[me->mface[i].v1] &&
- !me->pv->vert_map[me->mface[i].v2] &&
- !me->pv->vert_map[me->mface[i].v3]) {
- if(me->mface[i].v4) {
- if(!me->pv->vert_map[me->mface[i].v4])
- ++face_cnt_show;
- }
- else ++face_cnt_show;
- }
- }
- /* Find out how many edges to show */
- for(i=0; i<me->totedge; ++i) {
- if(!me->pv->vert_map[me->medge[i].v1] &&
- !me->pv->vert_map[me->medge[i].v2])
- ++edge_cnt_show;
- }
-
- /* Create new vert array and reset each vert's map with map[old]=new index */
- nve= MEM_mallocN(sizeof(MVert)*me->pv->totvert, "PMV verts");
- ndx_show= 0; ndx_hide= me->totvert;
- for(i=0; i<me->pv->totvert; ++i) {
- if(me->pv->vert_map[i]) {
- me->pv->vert_map[i]= ndx_hide;
- nve[me->pv->vert_map[i]]= me->mvert[i];
- ++ndx_hide;
- } else {
- me->pv->vert_map[i]= ndx_show;
- nve[me->pv->vert_map[i]]= me->mvert[i];
- ++ndx_show;
- }
- }
- CustomData_free_layer_active(&me->vdata, CD_MVERT, me->pv->totvert);
- me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, nve, me->totvert);
-
- /* Create new face array */
- me->pv->old_faces= me->mface;
- me->pv->totface= me->totface;
- me->mface= MEM_mallocN(sizeof(MFace)*face_cnt_show, "PMV faces");
- for(i=0; i<me->totface; ++i) {
- MFace *pr_f= &me->pv->old_faces[i];
- char show= 0;
-
- if(me->pv->vert_map[pr_f->v1] < me->totvert &&
- me->pv->vert_map[pr_f->v2] < me->totvert &&
- me->pv->vert_map[pr_f->v3] < me->totvert) {
- if(pr_f->v4) {
- if(me->pv->vert_map[pr_f->v4] < me->totvert)
- show= 1;
- }
- else show= 1;
- }
-
- if(show) {
- MFace *cr_f= &me->mface[face_ndx_show];
- *cr_f= *pr_f;
- cr_f->v1= me->pv->vert_map[pr_f->v1];
- cr_f->v2= me->pv->vert_map[pr_f->v2];
- cr_f->v3= me->pv->vert_map[pr_f->v3];
- cr_f->v4= pr_f->v4 ? me->pv->vert_map[pr_f->v4] : 0;
- test_index_face(cr_f,NULL,0,pr_f->v4?4:3);
- ++face_ndx_show;
- }
- }
- me->totface= face_cnt_show;
- CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
-
- /* Create new edge array */
- me->pv->old_edges= me->medge;
- me->pv->totedge= me->totedge;
- me->medge= MEM_mallocN(sizeof(MEdge)*edge_cnt_show, "PMV edges");
- me->pv->edge_map= MEM_mallocN(sizeof(int)*me->pv->totedge,"PMV edgemap");
- for(i=0; i<me->totedge; ++i) {
- if(me->pv->vert_map[me->pv->old_edges[i].v1] < me->totvert &&
- me->pv->vert_map[me->pv->old_edges[i].v2] < me->totvert) {
- MEdge *cr_e= &me->medge[edge_ndx_show];
- me->pv->edge_map[i]= edge_ndx_show;
- *cr_e= me->pv->old_edges[i];
- cr_e->v1= me->pv->vert_map[me->pv->old_edges[i].v1];
- cr_e->v2= me->pv->vert_map[me->pv->old_edges[i].v2];
- ++edge_ndx_show;
- }
- else me->pv->edge_map[i]= -1;
- }
- me->totedge= edge_cnt_show;
- CustomData_set_layer(&me->edata, CD_MEDGE, me->medge);
-
- /* XXX: DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA); */
-}
-
-static rcti sculptmode_pmv_box()
-{
- /*XXX: short down[2], mouse[2];
- rcti ret;
-
- getmouseco_areawin(down);
-
- while((get_mbut()&L_MOUSE) || (get_mbut()&R_MOUSE)) {
- getmouseco_areawin(mouse);
-
- scrarea_do_windraw(curarea);
-
- persp(PERSP_WIN);
- glLineWidth(2);
- setlinestyle(2);
- sdrawXORline(down[0],down[1],mouse[0],down[1]);
- sdrawXORline(mouse[0],down[1],mouse[0],mouse[1]);
- sdrawXORline(mouse[0],mouse[1],down[0],mouse[1]);
- sdrawXORline(down[0],mouse[1],down[0],down[1]);
- setlinestyle(0);
- glLineWidth(1);
- persp(PERSP_VIEW);
-
- screen_swapbuffers();
- backdrawview3d(0);
- }
-
- ret.xmin= down[0]<mouse[0]?down[0]:mouse[0];
- ret.ymin= down[1]<mouse[1]?down[1]:mouse[1];
- ret.xmax= down[0]>mouse[0]?down[0]:mouse[0];
- ret.ymax= down[1]>mouse[1]?down[1]:mouse[1];
- return ret;*/
-}
-
-void sculptmode_pmv(int mode)
-{
- Object *ob= NULL; /*XXX: OBACT; */
- rcti hb_2d;
-
- if(ob_get_key(ob)) {
- error("Cannot hide mesh with shape keys enabled");
- return;
- }
-
- hb_2d= sculptmode_pmv_box(); /* Get 2D hide box */
-
- sculptmode_correct_state();
-
- waitcursor(1);
-
- if(hb_2d.xmax-hb_2d.xmin > 3 && hb_2d.ymax-hb_2d.ymin > 3) {
- init_sculptmatrices();
-
- sculptmode_do_pmv(ob,&hb_2d,mode);
- }
- else mesh_pmv_off(ob, get_mesh(ob));
-
- /*XXX: scrarea_do_windraw(curarea); */
-
- waitcursor(0);
-}
-#endif
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index febca301939..15ccacc294a 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -32,8 +32,8 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-#include "BKE_sculpt.h"
+struct bContext;
struct Brush;
struct Mesh;
struct Object;
@@ -54,6 +54,8 @@ struct Brush *sculptmode_brush(void);
char sculpt_modifiers_active(struct Object *ob);
void sculpt(Sculpt *sd);
+int sculpt_poll(struct bContext *C);
+
/* Stroke */
struct SculptStroke *sculpt_stroke_new(const int max);
void sculpt_stroke_free(struct SculptStroke *);
diff --git a/source/blender/editors/sculpt_paint/sculpt_stroke.c b/source/blender/editors/sculpt_paint/sculpt_stroke.c
deleted file mode 100644
index 554ff580358..00000000000
--- a/source/blender/editors/sculpt_paint/sculpt_stroke.c
+++ /dev/null
@@ -1,274 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2007 by Nicholas Bishop
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- * Storage and manipulation of sculptmode brush strokes.
- *
- */
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_listBase.h"
-#include "DNA_scene_types.h"
-
-#include "BKE_sculpt.h"
-#include "BLI_blenlib.h"
-#include "BIF_gl.h"
-
-#include "sculpt_intern.h"
-
-#include <math.h>
-
-/* Temporary storage of input stroke control points */
-typedef struct StrokePoint {
- struct StrokePoint *next, *prev;
- short x, y;
-} StrokePoint;
-typedef struct SculptStroke {
- short (*loc)[2];
- int max;
- int index;
- float length;
- ListBase final;
- StrokePoint *final_mem;
- float offset;
-} SculptStroke;
-
-SculptStroke *sculpt_stroke_new(const int max)
-{
- SculptStroke *stroke = MEM_callocN(sizeof(SculptStroke), "SculptStroke");
- stroke->loc = MEM_callocN(sizeof(short) * 4 * max, "SculptStroke.loc");
- stroke->max = max;
- stroke->index = -1;
- return stroke;
-}
-
-void sculpt_stroke_free(SculptStroke *stroke)
-{
- if(stroke) {
- if(stroke->loc) MEM_freeN(stroke->loc);
- if(stroke->final_mem) MEM_freeN(stroke->final_mem);
-
- MEM_freeN(stroke);
- }
-}
-
-void sculpt_stroke_add_point(SculptStroke *stroke, const short x, const short y)
-{
- const int next = stroke->index + 1;
-
- if(stroke->index == -1) {
- stroke->loc[0][0] = x;
- stroke->loc[0][1] = y;
- stroke->index = 0;
- }
- else if(next < stroke->max) {
- const int dx = x - stroke->loc[stroke->index][0];
- const int dy = y - stroke->loc[stroke->index][1];
- stroke->loc[next][0] = x;
- stroke->loc[next][1] = y;
- stroke->length += sqrt(dx*dx + dy*dy);
- stroke->index = next;
- }
-}
-
-static void sculpt_stroke_smooth(SculptStroke *stroke)
-{
- /* Apply smoothing (exclude the first and last points)*/
- StrokePoint *p = stroke->final.first;
- if(p && p->next && p->next->next) {
- for(p = p->next->next; p && p->next && p->next->next; p = p->next) {
- p->x = p->prev->prev->x*0.1 + p->prev->x*0.2 + p->x*0.4 + p->next->x*0.2 + p->next->next->x*0.1;
- p->y = p->prev->prev->y*0.1 + p->prev->y*0.2 + p->y*0.4 + p->next->y*0.2 + p->next->next->y*0.1;
- }
- }
-}
-
-static void sculpt_stroke_create_final(SculptStroke *stroke)
-{
- if(stroke) {
- StrokePoint *p, *pnext;
- int i;
-
- /* Copy loc into final */
- if(stroke->final_mem)
- MEM_freeN(stroke->final_mem);
- stroke->final_mem = MEM_callocN(sizeof(StrokePoint) * (stroke->index + 1) * 2, "SculptStroke.final");
- stroke->final.first = stroke->final.last = NULL;
- for(i = 0; i <= stroke->index; ++i) {
- p = &stroke->final_mem[i];
- p->x = stroke->loc[i][0];
- p->y = stroke->loc[i][1];
- BLI_addtail(&stroke->final, p);
- }
-
- /* Remove shortest edges */
- if(stroke->final.first) {
- for(p = ((StrokePoint*)stroke->final.first)->next; p && p->next; p = pnext) {
- const int dx = p->x - p->prev->x;
- const int dy = p->y - p->prev->y;
- const float len = sqrt(dx*dx + dy*dy);
- pnext = p->next;
- if(len < 10) {
- BLI_remlink(&stroke->final, p);
- }
- }
- }
-
- sculpt_stroke_smooth(stroke);
-
- /* Subdivide edges */
- for(p = stroke->final.first; p && p->next; p = pnext) {
- StrokePoint *np = &stroke->final_mem[i++];
-
- pnext = p->next;
- np->x = (p->x + p->next->x) / 2;
- np->y = (p->y + p->next->y) / 2;
- BLI_insertlink(&stroke->final, p, np);
- }
-
- sculpt_stroke_smooth(stroke);
- }
-}
-
-static float sculpt_stroke_seglen(StrokePoint *p1, StrokePoint *p2)
-{
- int dx = p2->x - p1->x;
- int dy = p2->y - p1->y;
- return sqrt(dx*dx + dy*dy);
-}
-
-static float sculpt_stroke_final_length(SculptStroke *stroke)
-{
- StrokePoint *p;
- float len = 0;
- for(p = stroke->final.first; p && p->next; ++p)
- len += sculpt_stroke_seglen(p, p->next);
- return len;
-}
-
-/* If partial is nonzero, cuts off apply after that length has been processed */
-static StrokePoint *sculpt_stroke_apply_generic(Sculpt *sd, SculptStroke *stroke, const int partial)
-{
- const int sdspace = 0; //XXX: sd->spacing;
- const short spacing = sdspace > 0 ? sdspace : 2;
- const int dots = sculpt_stroke_final_length(stroke) / spacing;
- int i;
- StrokePoint *p = stroke->final.first;
- float startloc = stroke->offset;
-
- for(i = 0; i < dots && p && p->next; ++i) {
- const float dotloc = spacing * i;
- short co[2];
- float len = sculpt_stroke_seglen(p, p->next);
- float u, v;
-
- /* Find edge containing dot */
- while(dotloc > startloc + len && p && p->next && p->next->next) {
- p = p->next;
- startloc += len;
- len = sculpt_stroke_seglen(p, p->next);
- }
-
- if(!p || !p->next || dotloc > startloc + len)
- break;
-
- if(partial && startloc > partial) {
- /* Calculate offset for next stroke segment */
- stroke->offset = startloc + len - dotloc;
- break;
- }
-
- u = (dotloc - startloc) / len;
- v = 1 - u;
-
- co[0] = p->x*v + p->next->x*u;
- co[1] = p->y*v + p->next->y*u;
-
- //do_symmetrical_brush_actions(sd, a, co, NULL);
- }
-
- return p ? p->next : NULL;
-}
-
-void sculpt_stroke_apply(Sculpt *sd, SculptStroke *stroke)
-{
- /* TODO: make these values user-modifiable? */
- const int partial_len = 100;
- const int min_len = 200;
-
- if(stroke) {
- sculpt_stroke_create_final(stroke);
-
- if(sculpt_stroke_final_length(stroke) > min_len) {
- StrokePoint *p = sculpt_stroke_apply_generic(sd, stroke, partial_len);
-
- /* Replace remaining values in stroke->loc with remaining stroke->final values */
- stroke->index = -1;
- stroke->length = 0;
- for(; p; p = p->next) {
- ++stroke->index;
- stroke->loc[stroke->index][0] = p->x;
- stroke->loc[stroke->index][1] = p->y;
- if(p->next) {
- stroke->length += sculpt_stroke_seglen(p, p->next);
- }
- }
- }
- }
-}
-
-void sculpt_stroke_apply_all(Sculpt *sd, SculptStroke *stroke)
-{
- sculpt_stroke_create_final(stroke);
-
- if(stroke) {
- sculpt_stroke_apply_generic(sd, stroke, 0);
- }
-}
-
-/* XXX: drawing goes elsewhere */
-void sculpt_stroke_draw(SculptStroke *stroke)
-{
- if(stroke) {
- StrokePoint *p;
-
- /* Draws the original stroke */
- /*glColor3f(1, 0, 0);
- glBegin(GL_LINE_STRIP);
- for(i = 0; i <= stroke->index; ++i)
- glVertex2s(stroke->loc[i][0], stroke->loc[i][1]);
- glEnd();*/
-
- /* Draws the smoothed stroke */
- glColor3f(0, 1, 0);
- glBegin(GL_LINE_STRIP);
- for(p = stroke->final.first; p; p = p->next)
- glVertex2s(p->x, p->y);
- glEnd();
- }
-}
diff --git a/source/blender/editors/sound/Makefile b/source/blender/editors/sound/Makefile
new file mode 100644
index 00000000000..10145035eb4
--- /dev/null
+++ b/source/blender/editors/sound/Makefile
@@ -0,0 +1,51 @@
+#
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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../../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/SConscript b/source/blender/editors/sound/SConscript
new file mode 100644
index 00000000000..7968f4c53a9
--- /dev/null
+++ b/source/blender/editors/sound/SConscript
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('*.c')
+
+incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs += ' ../../windowmanager #/intern/guardedalloc'
+incs += ' #/intern/guardedalloc'
+incs += ' ../../makesrna ../../python'
+incs += ' #/intern/audaspace/intern'
+
+defs = []
+
+env.BlenderLib ( 'bf_editors_sound', sources, Split(incs), defs, libtype=['core'], priority=[35] )
diff --git a/source/blender/editors/sound/sound_intern.h b/source/blender/editors/sound/sound_intern.h
new file mode 100644
index 00000000000..ec8b0688305
--- /dev/null
+++ b/source/blender/editors/sound/sound_intern.h
@@ -0,0 +1,37 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef ED_SOUND_INTERN_H
+#define ED_SOUND_INTERN_H
+
+struct wmOperatorType;
+
+void SOUND_OT_open(wmOperatorType *ot);
+
+#endif /* ED_SOUND_INTERN_H */
+
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
new file mode 100644
index 00000000000..1121a3bcbcd
--- /dev/null
+++ b/source/blender/editors/sound/sound_ops.c
@@ -0,0 +1,293 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "DNA_packedFile_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_sound_types.h"
+#include "DNA_sequence_types.h"
+#include "DNA_windowmanager_types.h"
+
+#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 "BKE_utildefines.h"
+
+#include "BLI_blenlib.h"
+
+#include "ED_sound.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "UI_interface.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "AUD_C-API.h"
+
+#include "sound_intern.h"
+
+/******************** open sound operator ********************/
+
+static int open_exec(bContext *C, wmOperator *op)
+{
+ char path[FILE_MAX];
+ bSound *sound;
+ AUD_SoundInfo info;
+
+ RNA_string_get(op->ptr, "path", path);
+
+ sound = sound_new_file(CTX_data_main(C), path);
+
+ if (sound==NULL || sound->handle == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
+ return OPERATOR_CANCELLED;
+ }
+
+ info = AUD_getInfo(sound->handle);
+
+ if (info.specs.format == AUD_FORMAT_INVALID) {
+ sound_delete(C, sound);
+ BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
+ return OPERATOR_CANCELLED;
+ }
+
+ if (RNA_boolean_get(op->ptr, "cache")) {
+ sound_cache(sound, 0);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ return WM_operator_filesel(C, op, event);
+}
+
+void SOUND_OT_open(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Open Sound";
+ ot->idname= "SOUND_OT_open";
+ ot->description= "Load a sound file into blender";
+
+ /* api callbacks */
+ ot->exec= open_exec;
+ ot->invoke= open_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL);
+ RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Cache the sound in memory.");
+}
+
+/* ******************************************************* */
+
+static int sound_poll(bContext *C)
+{
+ Editing* ed = CTX_data_scene(C)->ed;
+
+ if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
+ return 0;
+
+ return 1;
+}
+/********************* pack operator *********************/
+
+static int pack_exec(bContext *C, wmOperator *op)
+{
+ Editing* ed = CTX_data_scene(C)->ed;
+ bSound* sound;
+
+ if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
+ return OPERATOR_CANCELLED;
+
+ sound = ed->act_seq->sound;
+
+ if(!sound || sound->packedfile)
+ return OPERATOR_CANCELLED;
+
+ sound->packedfile= newPackedFile(op->reports, sound->name);
+ sound_load(CTX_data_main(C), sound);
+
+ return OPERATOR_FINISHED;
+}
+
+void SOUND_OT_pack(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Pack Sound";
+ ot->idname= "SOUND_OT_pack";
+
+ /* api callbacks */
+ ot->exec= pack_exec;
+ ot->poll= sound_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* 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, "Remove Pack", 0, opname, "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, line, 0, opname, "method", PF_WRITE_LOCAL);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+ sprintf(line, "Overwrite %s", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL);
+ break;
+ }
+ }
+
+ switch(checkPackedFile(abs_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", abs_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", abs_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+ sprintf(line, "Overwrite %s", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+ break;
+ }
+
+ uiPupMenuEnd(C, pup);
+}
+
+static int 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;
+
+ sound = ed->act_seq->sound;
+
+ if(!sound || !sound->packedfile)
+ return OPERATOR_CANCELLED;
+
+ 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);
+
+ return OPERATOR_FINISHED;
+}
+
+static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Editing* ed = CTX_data_scene(C)->ed;
+ bSound* sound;
+
+ if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
+ return OPERATOR_CANCELLED;
+
+ sound = ed->act_seq->sound;
+
+ if(!sound || !sound->packedfile)
+ return OPERATOR_CANCELLED;
+
+ 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);
+
+ return OPERATOR_FINISHED;
+}
+
+void SOUND_OT_unpack(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Unpack Sound";
+ ot->idname= "SOUND_OT_unpack";
+
+ /* api callbacks */
+ ot->exec= unpack_exec;
+ ot->invoke= unpack_invoke;
+ ot->poll= sound_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
+}
+
+/* ******************************************************* */
+
+void ED_operatortypes_sound(void)
+{
+ WM_operatortype_append(SOUND_OT_open);
+ WM_operatortype_append(SOUND_OT_pack);
+ WM_operatortype_append(SOUND_OT_unpack);
+}
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index 2c9f91e0941..4288cc10a26 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -52,6 +52,7 @@
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -59,6 +60,7 @@
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
#include "DNA_userdef_types.h"
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
@@ -90,319 +92,19 @@
#include "ED_screen.h"
#include "ED_space_api.h"
-#if 0 // XXX old includes for reference only
- #include "BIF_editaction.h"
- #include "BIF_editkey.h"
- #include "BIF_editnla.h"
- #include "BIF_drawgpencil.h"
- #include "BIF_keyframing.h"
- #include "BIF_language.h"
- #include "BIF_space.h"
-
- #include "BDR_editcurve.h"
- #include "BDR_gpencil.h"
-
- #include "BSE_drawnla.h"
- #include "BSE_drawipo.h"
- #include "BSE_drawview.h"
- #include "BSE_editaction_types.h"
- #include "BSE_editipo.h"
- #include "BSE_headerbuttons.h"
- #include "BSE_time.h"
- #include "BSE_view.h"
-#endif // XXX old defines for reference only
-
-/* XXX */
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-
-/********************************** Slider Stuff **************************** */
-
-#if 0 // XXX all of this slider stuff will need a rethink!
-/* sliders for shapekeys */
-static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
-{
- int i;
- char str[64];
- float x, y;
- uiBlock *block;
- uiBut *but;
-
- /* lets make the shapekey sliders */
-
- /* reset the damn myortho2 or the sliders won't draw/redraw
- * correctly *grumble*
- */
- mywinset(curarea->win);
- myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
-
- sprintf(str, "actionbuttonswin %d", curarea->win);
- block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS);
-
- x = ACHANNEL_NAMEWIDTH + 1;
- y = 0.0f;
-
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- if (!(G.saction->flag & SACTION_SLIDERS)) {
- ACTWIDTH = ACHANNEL_NAMEWIDTH;
- but=uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR,
- ICON_DISCLOSURE_TRI_RIGHT,
- ACHANNEL_NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
- XIC,YIC-2,
- &(G.saction->flag), 0, 0, 0, 0,
- "Show action window sliders");
- /* no hilite, the winmatrix is not correct later on... */
- uiButSetFlag(but, UI_NO_HILITE);
- }
- else {
- but= uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR,
- ICON_DISCLOSURE_TRI_DOWN,
- ACHANNEL_NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
- XIC,YIC-2,
- &(G.saction->flag), 0, 0, 0, 0,
- "Hide action window sliders");
- /* no hilite, the winmatrix is not correct later on... */
- uiButSetFlag(but, UI_NO_HILITE);
-
- ACTWIDTH = ACHANNEL_NAMEWIDTH + SLIDERWIDTH;
-
- /* sliders are open so draw them */
- BIF_ThemeColor(TH_FACE);
-
- glRects(ACHANNEL_NAMEWIDTH, 0, ACHANNEL_NAMEWIDTH+SLIDERWIDTH, curarea->winy);
- uiBlockSetEmboss(block, UI_EMBOSS);
- for (i=1; i < key->totkey; i++) {
- make_rvk_slider(block, ob, i,
- (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- /* see sliderval array in editkey.c */
- if (i >= 255) break;
- }
- }
- uiDrawBlock(C, block);
-}
-
-static void icu_slider_func(void *voidicu, void *voidignore)
-{
- /* the callback for the icu sliders ... copies the
- * value from the icu->curval into a bezier at the
- * right frame on the right ipo curve (creating both the
- * ipo curve and the bezier if needed).
- */
- IpoCurve *icu= voidicu;
- BezTriple *bezt=NULL;
- float cfra, icuval;
-
- cfra = frame_to_float(CFRA);
- if (G.saction->pin==0 && OBACT)
- cfra= get_action_frame(OBACT, cfra);
-
- /* if the ipocurve exists, try to get a bezier
- * for this frame
- */
- bezt = get_bezt_icu_time(icu, &cfra, &icuval);
-
- /* create the bezier triple if one doesn't exist,
- * otherwise modify it's value
- */
- if (bezt == NULL) {
- insert_vert_icu(icu, cfra, icu->curval, 0);
- }
- else {
- bezt->vec[1][1] = icu->curval;
- }
-
- /* make sure the Ipo's are properly processed and
- * redraw as necessary
- */
- sort_time_ipocurve(icu);
- testhandles_ipocurve(icu);
-
- /* nla-update (in case this affects anything) */
- synchronize_action_strips();
-
- /* do redraw pushes, and also the depsgraph flushes */
- if (OBACT->pose || ob_get_key(OBACT))
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC);
- else
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB);
-
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWBUTSALL, 0);
-}
-
-static void make_icu_slider(uiBlock *block, IpoCurve *icu,
- int x, int y, int w, int h, char *tip)
-{
- /* create a slider for the ipo-curve*/
- uiBut *but;
-
- if(icu == NULL) return;
-
- if (IS_EQ(icu->slide_max, icu->slide_min)) {
- if (IS_EQ(icu->ymax, icu->ymin)) {
- if (ELEM(icu->blocktype, ID_CO, ID_KE)) {
- /* hack for constraints and shapekeys (and maybe a few others) */
- icu->slide_min= 0.0;
- icu->slide_max= 1.0;
- }
- else {
- icu->slide_min= -100;
- icu->slide_max= 100;
- }
- }
- else {
- icu->slide_min= icu->ymin;
- icu->slide_max= icu->ymax;
- }
- }
- if (icu->slide_min >= icu->slide_max) {
- SWAP(float, icu->slide_min, icu->slide_max);
- }
-
- but=uiDefButF(block, NUMSLI, REDRAWVIEW3D, "",
- x, y , w, h,
- &(icu->curval), icu->slide_min, icu->slide_max,
- 10, 2, tip);
-
- uiButSetFunc(but, icu_slider_func, icu, NULL);
-
- // no hilite, the winmatrix is not correct later on...
- uiButSetFlag(but, UI_NO_HILITE);
-}
-
-/* sliders for ipo-curves of active action-channel */
-static void action_icu_buts(SpaceAction *saction)
-{
- ListBase act_data = {NULL, NULL};
- bActListElem *ale;
- int filter;
- void *data;
- short datatype;
-
- char str[64];
- float x, y;
- uiBlock *block;
-
- /* lets make the action sliders */
-
- /* reset the damn myortho2 or the sliders won't draw/redraw
- * correctly *grumble*
- */
- mywinset(curarea->win);
- myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
-
- sprintf(str, "actionbuttonswin %d", curarea->win);
- block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS);
-
- x = (float)ACHANNEL_NAMEWIDTH + 1;
- y = 0.0f;
-
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- if (G.saction->flag & SACTION_SLIDERS) {
- /* sliders are open so draw them */
-
- /* get editor data */
- data= get_action_context(&datatype);
- if (data == NULL) return;
-
- /* build list of channels to draw */
- filter= (ACTFILTER_FORDRAWING|ACTFILTER_VISIBLE|ACTFILTER_CHANNELS);
- actdata_filter(&act_data, filter, data, datatype);
-
- /* draw backdrop first */
- BIF_ThemeColor(TH_FACE); // change this color... it's ugly
- glRects(ACHANNEL_NAMEWIDTH, (short)G.v2d->cur.ymin, ACHANNEL_NAMEWIDTH+SLIDERWIDTH, (short)G.v2d->cur.ymax);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- for (ale= act_data.first; ale; ale= ale->next) {
- const float yminc= y-CHANNELHEIGHT/2;
- const float ymaxc= y+CHANNELHEIGHT/2;
-
- /* check if visible */
- if ( IN_RANGE(yminc, G.v2d->cur.ymin, G.v2d->cur.ymax) ||
- IN_RANGE(ymaxc, G.v2d->cur.ymin, G.v2d->cur.ymax) )
- {
- /* determine what needs to be drawn */
- switch (ale->type) {
- case ACTTYPE_CONCHAN: /* constraint channel */
- {
- bActionChannel *achan = (bActionChannel *)ale->owner;
- IpoCurve *icu = (IpoCurve *)ale->key_data;
-
- /* only show if owner is selected */
- if ((ale->ownertype == ACTTYPE_OBJECT) || SEL_ACHAN(achan)) {
- make_icu_slider(block, icu,
- (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
- "Slider to control current value of Constraint Influence");
- }
- }
- break;
- case ACTTYPE_ICU: /* ipo-curve channel */
- {
- bActionChannel *achan = (bActionChannel *)ale->owner;
- IpoCurve *icu = (IpoCurve *)ale->key_data;
-
- /* only show if owner is selected */
- if ((ale->ownertype == ACTTYPE_OBJECT) || SEL_ACHAN(achan)) {
- make_icu_slider(block, icu,
- (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
- "Slider to control current value of IPO-Curve");
- }
- }
- break;
- case ACTTYPE_SHAPEKEY: /* shapekey channel */
- {
- Object *ob= (Object *)ale->id;
- IpoCurve *icu= (IpoCurve *)ale->key_data;
-
- // TODO: only show if object is active
- if (icu) {
- make_icu_slider(block, icu,
- (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2,
- "Slider to control ShapeKey");
- }
- else if (ob && ale->index) {
- make_rvk_slider(block, ob, ale->index,
- (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
- }
- }
- break;
- }
- }
-
- /* adjust y-position for next one */
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
-
- /* free tempolary channels */
- BLI_freelistN(&act_data);
- }
- uiDrawBlock(C, block);
-}
-
-#endif // XXX all of this slider stuff will need a rethink
-
/* ************************************************************************* */
/* Channel List */
/* left hand part */
-void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
+void draw_channel_names(bContext *C, bAnimContext *ac, SpaceAction *saction, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
View2D *v2d= &ar->v2d;
- float x= 0.0f, y= 0.0f;
+ float y= 0.0f;
int items, height;
/* build list of channels to draw */
@@ -422,530 +124,52 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
*/
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);
/* loop through channels, and set up drawing depending on their type */
- y= (float)ACHANNEL_FIRST;
-
- for (ale= anim_data.first; ale; ale= ale->next) {
- const float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
- const float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
+ { /* first pass: just the standard GL-drawing for backdrop + text */
+ y= (float)ACHANNEL_FIRST;
- /* check if visible */
- if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
- IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
- {
- bActionGroup *grp = NULL;
- short indent= 0, offset= 0, sel= 0, group= 0;
- int expand= -1, protect = -1, special= -1, mute = -1;
- char name[128];
-
- /* determine what needs to be drawn */
- switch (ale->type) {
- case ANIMTYPE_SCENE: /* scene */
- {
- Scene *sce= (Scene *)ale->data;
-
- group= 4;
- indent= 0;
-
- special= ICON_SCENE_DATA;
-
- /* only show expand if there are any channels */
- if (EXPANDED_SCEC(sce))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_SCEC(sce);
- strcpy(name, sce->id.name+2);
- }
- break;
- case ANIMTYPE_OBJECT: /* object */
- {
- Base *base= (Base *)ale->data;
- Object *ob= base->object;
-
- group= 4;
- indent= 0;
-
- /* icon depends on object-type */
- if (ob->type == OB_ARMATURE)
- special= ICON_ARMATURE_DATA;
- else
- special= ICON_OBJECT_DATA;
-
- /* only show expand if there are any channels */
- if (EXPANDED_OBJC(ob))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_OBJC(base);
- strcpy(name, ob->id.name+2);
- }
- break;
- case ANIMTYPE_FILLACTD: /* action widget */
- {
- bAction *act= (bAction *)ale->data;
-
- group = 4;
- indent= 1;
- special= ICON_ACTION;
-
- if (EXPANDED_ACTC(act))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_ACTC(act);
- strcpy(name, act->id.name+2);
- }
- break;
- case ANIMTYPE_FILLMATD: /* object materials (dopesheet) expand widget */
- {
- Object *ob = (Object *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_MATERIAL_DATA;
-
- if (FILTER_MAT_OBJC(ob))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, "Materials");
- }
- break;
-
-
- case ANIMTYPE_DSMAT: /* single material (dopesheet) expand widget */
- {
- Material *ma = (Material *)ale->data;
-
- group = 0;
- indent = 0;
- special = ICON_MATERIAL_DATA;
- offset = 21;
-
- if (FILTER_MAT_OBJD(ma))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, ma->id.name+2);
- }
- break;
- case ANIMTYPE_DSLAM: /* lamp (dopesheet) expand widget */
- {
- Lamp *la = (Lamp *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_LAMP_DATA;
-
- if (FILTER_LAM_OBJD(la))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, la->id.name+2);
- }
- break;
- case ANIMTYPE_DSCAM: /* camera (dopesheet) expand widget */
- {
- Camera *ca = (Camera *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_CAMERA_DATA;
-
- if (FILTER_CAM_OBJD(ca))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, ca->id.name+2);
- }
- break;
- case ANIMTYPE_DSCUR: /* curve (dopesheet) expand widget */
- {
- Curve *cu = (Curve *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_CURVE_DATA;
-
- if (FILTER_CUR_OBJD(cu))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, cu->id.name+2);
- }
- break;
- case ANIMTYPE_DSSKEY: /* shapekeys (dopesheet) expand widget */
- {
- Key *key= (Key *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_SHAPEKEY_DATA; // XXX
-
- if (FILTER_SKE_OBJD(key))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- //sel = SEL_OBJC(base);
- strcpy(name, "Shape Keys");
- }
- break;
- case ANIMTYPE_DSWOR: /* world (dopesheet) expand widget */
- {
- World *wo= (World *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_WORLD_DATA;
-
- if (FILTER_WOR_SCED(wo))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, wo->id.name+2);
- }
- break;
-
-
- case ANIMTYPE_GROUP: /* action group */
- {
- bActionGroup *agrp= (bActionGroup *)ale->data;
-
- group= 2;
- indent= 0;
- special= -1;
-
- if (ale->id) {
- /* special exception for materials */
- if (GS(ale->id->name) == ID_MA)
- offset= 25;
- else
- offset= 14;
- }
- else
- offset= 0;
-
- /* only show expand if there are any channels */
- if (agrp->channels.first) {
- if (EXPANDED_AGRP(agrp))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
- }
-
- if (EDITABLE_AGRP(agrp))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
-
- sel = SEL_AGRP(agrp);
- strcpy(name, agrp->name);
- }
- break;
- case ANIMTYPE_FCURVE: /* F-Curve channel */
- {
- FCurve *fcu = (FCurve *)ale->data;
-
- indent = 0;
-
- group= (fcu->grp) ? 1 : 0;
- grp= fcu->grp;
-
- if (ale->id) {
- /* special exception for materials */
- if (GS(ale->id->name) == ID_MA) {
- offset= 21;
- indent= 1;
- }
- else
- offset= 14;
- }
- else
- offset= 0;
-
- if (fcu->flag & FCURVE_MUTED)
- mute = ICON_MUTE_IPO_ON;
- else
- mute = ICON_MUTE_IPO_OFF;
-
- if (fcu->bezt) {
- if (EDITABLE_FCU(fcu))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
- }
- else
- protect = ICON_ZOOMOUT; // XXX editability is irrelevant here, but this icon is temp...
-
- sel = SEL_FCU(fcu);
-
- getname_anim_fcurve(name, ale->id, fcu);
- }
- break;
-
- case ANIMTYPE_SHAPEKEY: /* shapekey channel */
- {
- KeyBlock *kb = (KeyBlock *)ale->data;
-
- indent = 0;
- special = -1;
-
- offset= (ale->id) ? 21 : 0;
-
- if (kb->name[0] == '\0')
- sprintf(name, "Key %d", ale->index);
- else
- strcpy(name, kb->name);
- }
- break;
-
- case ANIMTYPE_GPDATABLOCK: /* gpencil datablock */
- {
- bGPdata *gpd = (bGPdata *)ale->data;
- ScrArea *sa = (ScrArea *)ale->owner;
-
- indent = 0;
- group= 3;
-
- /* 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;
- }
-
- switch (sa->spacetype) {
- case SPACE_VIEW3D:
- {
- /* this shouldn't cause any overflow... */
- //sprintf(name, "3DView:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func..
- strcpy(name, "3dView");
- 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_NODE;
- }
- 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;
-
- indent = 0;
- special = -1;
- expand = -1;
- group = 1;
-
- 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;
-
- sel = SEL_GPL(gpl);
- BLI_snprintf(name, 32, gpl->info);
- }
- break;
- }
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
+ float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
- /* now, start drawing based on this information */
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
-
- /* draw backing strip behind channel name */
- if (group == 4) {
- /* only used in dopesheet... */
- if (ELEM(ale->type, ANIMTYPE_SCENE, ANIMTYPE_OBJECT)) {
- /* object channel - darker */
- UI_ThemeColor(TH_DOPESHEET_CHANNELOB);
- uiSetRoundBox((expand == ICON_TRIA_DOWN)? (1):(1|8));
- gl_round_box(GL_POLYGON, x+offset, yminc, (float)ACHANNEL_NAMEWIDTH, ymaxc, 8);
- }
- else {
- /* sub-object folders - lighter */
- UI_ThemeColor(TH_DOPESHEET_CHANNELSUBOB);
-
- offset += 7 * indent;
- glBegin(GL_QUADS);
- glVertex2f(x+offset, yminc);
- glVertex2f(x+offset, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, yminc);
- glEnd();
-
- /* clear group value, otherwise we cause errors... */
- group = 0;
- }
- }
- else 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);
- }
- else if (group == 2) {
- /* only for action group channels */
- if (ale->flag & AGRP_ACTIVE)
- UI_ThemeColorShade(TH_GROUP_ACTIVE, 10);
- else
- 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);
- }
- else {
- /* for normal channels
- * - use 3 shades of color group/standard color for 3 indention level
- * - only use group colors if allowed to, and if actually feasible
- */
- if ( !(saction->flag & SACTION_NODRAWGCOLORS) &&
- (grp) && (grp->customCol) )
- {
- char cp[3];
-
- if (indent == 2) {
- VECCOPY(cp, grp->cs.solid);
- }
- else if (indent == 1) {
- VECCOPY(cp, grp->cs.select);
- }
- else {
- VECCOPY(cp, grp->cs.active);
- }
-
- glColor3ub(cp[0], cp[1], cp[2]);
- }
- else
- UI_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40));
-
- indent += group;
- offset += 7 * indent;
- glBegin(GL_QUADS);
- glVertex2f(x+offset, yminc);
- glVertex2f(x+offset, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, yminc);
- glEnd();
- }
-
- /* draw expand/collapse triangle */
- if (expand > 0) {
- UI_icon_draw(x+offset, yminc, expand);
- offset += 17;
- }
-
- /* draw special icon indicating certain data-types */
- if (special > -1) {
- if (ELEM(group, 3, 4)) {
- /* for gpdatablock channels */
- UI_icon_draw(x+offset, yminc, special);
- offset += 17;
- }
- else {
- /* for normal channels */
- UI_icon_draw(x+offset, yminc, special);
- offset += 17;
- }
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* draw all channels using standard channel-drawing API */
+ ANIM_channel_draw(ac, ale, yminc, ymaxc);
}
- glDisable(GL_BLEND);
-
- /* draw name */
- if (sel)
- UI_ThemeColor(TH_TEXT_HI);
- else
- UI_ThemeColor(TH_TEXT);
- offset += 3;
- UI_DrawString(x+offset, y-4, name);
- /* reset offset - for RHS of panel */
- offset = 0;
-
- /* set blending again, as text drawing may clear it */
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
+ /* adjust y-position for next one */
+ y -= ACHANNEL_STEP;
+ }
+ }
+ { /* second pass: widgets */
+ uiBlock *block= uiBeginBlock(C, ar, "dopesheet channel buttons", UI_EMBOSS);
+
+ y= (float)ACHANNEL_FIRST;
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
+ float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
- /* draw protect 'lock' */
- if (protect > -1) {
- offset = 16;
- UI_icon_draw((float)ACHANNEL_NAMEWIDTH-offset, yminc, protect);
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* draw all channels using standard channel-drawing API */
+ ANIM_channel_draw_widgets(ac, ale, block, yminc, ymaxc);
}
- /* draw mute 'eye' */
- if (mute > -1) {
- offset += 16;
- UI_icon_draw((float)(ACHANNEL_NAMEWIDTH-offset), yminc, mute);
- }
- glDisable(GL_BLEND);
+ /* adjust y-position for next one */
+ y -= ACHANNEL_STEP;
}
- /* adjust y-position for next one */
- y -= ACHANNEL_STEP;
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
}
/* free tempolary channels */
@@ -955,27 +179,8 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
/* ************************************************************************* */
/* Keyframes */
-ActKeysInc *init_aki_data(bAnimContext *ac, bAnimListElem *ale)
-{
- static ActKeysInc aki;
-
- /* no need to set settings if wrong context */
- if ((ac->data == NULL) || ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)==0)
- return NULL;
-
- /* if strip is mapped, store settings */
- aki.ob= ANIM_nla_mapping_get(ac, ale);
-
- if (ac->datatype == ANIMCONT_DOPESHEET)
- aki.ads= (bDopeSheet *)ac->data;
- else
- aki.ads= NULL;
- aki.actmode= ac->datatype;
-
- /* always return pointer... */
- return &aki;
-}
-
+/* extra padding for lengths (to go under scrollers) */
+#define EXTRA_SCROLL_PAD 100.0f
/* draw keyframes in each channel */
void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
@@ -985,13 +190,11 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
int filter;
View2D *v2d= &ar->v2d;
- Object *nob= NULL;
- gla2DDrawInfo *di;
- rcti scr_rct;
+ bDopeSheet *ads= &saction->ads;
+ AnimData *adt= NULL;
- int act_start, act_end, dummy;
+ float act_start, act_end, y;
int height, items;
- float y, sta, end;
char col1[3], col2[3];
char col1a[3], col2a[3];
@@ -1001,6 +204,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
/* get theme colors */
UI_GetThemeColor3ubv(TH_BACK, col2);
UI_GetThemeColor3ubv(TH_HILITE, col1);
+
UI_GetThemeColor3ubv(TH_GROUP, col2a);
UI_GetThemeColor3ubv(TH_GROUP_ACTIVE, col1a);
@@ -1008,26 +212,13 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
UI_GetThemeColor3ubv(TH_DOPESHEET_CHANNELSUBOB, col2b);
/* set view-mapping rect (only used for x-axis), for NLA-scaling mapping with less calculation */
- scr_rct.xmin= ar->winrct.xmin + ar->v2d.mask.xmin;
- scr_rct.ymin= ar->winrct.ymin + ar->v2d.mask.ymin;
- scr_rct.xmax= ar->winrct.xmin + ar->v2d.hor.xmax;
- scr_rct.ymax= ar->winrct.ymin + ar->v2d.mask.ymax;
- di= glaBegin2DDraw(&scr_rct, &v2d->cur);
/* if in NLA there's a strip active, map the view */
if (ac->datatype == ANIMCONT_ACTION) {
- nob= ANIM_nla_mapping_get(ac, NULL);
-
- if (nob)
- ANIM_nla_mapping_draw(di, nob, 0);
+ adt= ANIM_nla_mapping_get(ac, NULL);
/* start and end of action itself */
- calc_action_range(ac->data, &sta, &end, 0);
- gla2DDrawTranslatePt(di, sta, 0.0f, &act_start, &dummy);
- gla2DDrawTranslatePt(di, end, 0.0f, &act_end, &dummy);
-
- if (nob)
- ANIM_nla_mapping_draw(di, nob, 1);
+ calc_action_range(ac->data, &act_start, &act_end, 0);
}
/* build list of channels to draw */
@@ -1058,47 +249,16 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
{
- int frame1_x, channel_y, sel=0;
+ bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
+ int sel=0;
/* determine if any need to draw channel */
if (ale->datatype != ALE_NONE) {
/* determine if channel is selected */
- switch (ale->type) {
- case ANIMTYPE_SCENE:
- {
- Scene *sce= (Scene *)ale->data;
- sel = SEL_SCEC(sce);
- }
- break;
- case ANIMTYPE_OBJECT:
- {
- Base *base= (Base *)ale->data;
- sel = SEL_OBJC(base);
- }
- break;
- case ANIMTYPE_GROUP:
- {
- bActionGroup *agrp = (bActionGroup *)ale->data;
- sel = SEL_AGRP(agrp);
- }
- break;
- case ANIMTYPE_FCURVE:
- {
- FCurve *fcu = (FCurve *)ale->data;
- sel = SEL_FCU(fcu);
- }
- break;
- case ANIMTYPE_GPLAYER:
- {
- bGPDlayer *gpl = (bGPDlayer *)ale->data;
- sel = SEL_GPL(gpl);
- }
- break;
- }
+ if (acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT))
+ sel= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT);
if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)) {
- gla2DDrawTranslatePt(di, v2d->cur.xmin, y, &frame1_x, &channel_y);
-
switch (ale->type) {
case ANIMTYPE_SCENE:
case ANIMTYPE_OBJECT:
@@ -1110,6 +270,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
case ANIMTYPE_FILLACTD:
case ANIMTYPE_FILLMATD:
+ case ANIMTYPE_FILLPARTD:
case ANIMTYPE_DSSKEY:
case ANIMTYPE_DSWOR:
{
@@ -1134,36 +295,32 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
}
/* draw region twice: firstly backdrop, then the current range */
- glRectf((float)frame1_x, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)v2d->hor.xmax, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(v2d->cur.xmin, (float)y-ACHANNEL_HEIGHT_HALF, v2d->cur.xmax+EXTRA_SCROLL_PAD, (float)y+ACHANNEL_HEIGHT_HALF);
if (ac->datatype == ANIMCONT_ACTION)
- glRectf((float)act_start, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)act_end, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(act_start, (float)y-ACHANNEL_HEIGHT_HALF, act_end, (float)y+ACHANNEL_HEIGHT_HALF);
}
else if (ac->datatype == ANIMCONT_SHAPEKEY) {
- gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
-
/* all frames that have a frame number less than one
* get a desaturated orange background
*/
glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(0.0f, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)frame1_x, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(0.0f, (float)y-ACHANNEL_HEIGHT_HALF, 1.0f, (float)y+ACHANNEL_HEIGHT_HALF);
/* frames one and higher get a saturated orange background */
glColor4ub(col2[0], col2[1], col2[2], 0x44);
- glRectf((float)frame1_x, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)v2d->hor.xmax, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(1.0f, (float)y-ACHANNEL_HEIGHT_HALF, v2d->cur.xmax+EXTRA_SCROLL_PAD, (float)y+ACHANNEL_HEIGHT_HALF);
}
else if (ac->datatype == ANIMCONT_GPENCIL) {
- gla2DDrawTranslatePt(di, v2d->cur.xmin, y, &frame1_x, &channel_y);
-
/* frames less than one get less saturated background */
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(0.0f, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)frame1_x, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(0.0f, (float)y-ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y+ACHANNEL_HEIGHT_HALF);
/* frames one and higher get a saturated background */
if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
else glColor4ub(col2[0], col2[1], col2[2], 0x44);
- glRectf((float)frame1_x, (float)channel_y-ACHANNEL_HEIGHT_HALF, (float)v2d->hor.xmax, (float)channel_y+ACHANNEL_HEIGHT_HALF);
+ glRectf(v2d->cur.xmin, (float)y-ACHANNEL_HEIGHT_HALF, v2d->cur.xmax+EXTRA_SCROLL_PAD, (float)y+ACHANNEL_HEIGHT_HALF);
}
}
}
@@ -1190,36 +347,29 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
{
/* check if anything to show for this channel */
if (ale->datatype != ALE_NONE) {
- ActKeysInc *aki= init_aki_data(ac, ale);
- nob= ANIM_nla_mapping_get(ac, ale);
-
- if (nob)
- ANIM_nla_mapping_draw(di, nob, 0);
+ adt= ANIM_nla_mapping_get(ac, ale);
/* draw 'keyframes' for each specific datatype */
switch (ale->datatype) {
case ALE_SCE:
- draw_scene_channel(di, aki, ale->key_data, y);
+ draw_scene_channel(v2d, ads, ale->key_data, y);
break;
case ALE_OB:
- draw_object_channel(di, aki, ale->key_data, y);
+ draw_object_channel(v2d, ads, ale->key_data, y);
break;
case ALE_ACT:
- draw_action_channel(di, aki, ale->key_data, y);
+ draw_action_channel(v2d, adt, ale->key_data, y);
break;
case ALE_GROUP:
- draw_agroup_channel(di, aki, ale->data, y);
+ draw_agroup_channel(v2d, adt, ale->data, y);
break;
case ALE_FCURVE:
- draw_fcurve_channel(di, aki, ale->key_data, y);
+ draw_fcurve_channel(v2d, adt, ale->key_data, y);
break;
case ALE_GPFRAME:
- draw_gpl_channel(di, aki, ale->data, y);
+ draw_gpl_channel(v2d, ads, ale->data, y);
break;
}
-
- if (nob)
- ANIM_nla_mapping_draw(di, nob, 1);
}
}
@@ -1231,16 +381,11 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
/* black line marking 'current frame' for Time-Slide transform mode */
if (saction->flag & SACTION_MOVING) {
- int frame1_x;
-
- gla2DDrawTranslatePt(di, saction->timeslide, 0, &frame1_x, &dummy);
- cpack(0x0);
+ glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
- glVertex2f((float)frame1_x, (float)v2d->mask.ymin - 100);
- glVertex2f((float)frame1_x, (float)v2d->mask.ymax);
+ glVertex2f(saction->timeslide, v2d->cur.ymin-EXTRA_SCROLL_PAD);
+ glVertex2f(saction->timeslide, v2d->cur.ymax);
glEnd();
}
-
- glaEnd2DDraw(di);
}
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 5d262cb03c5..9e05c482ecb 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -67,6 +67,7 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -74,14 +75,13 @@
#include "UI_view2d.h"
-#include "BIF_transform.h"
-
#include "ED_anim_api.h"
#include "ED_keyframing.h"
#include "ED_keyframes_draw.h"
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_space_api.h"
+#include "ED_transform.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -101,7 +101,7 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
int filter;
/* get data to filter, from Action or Dopesheet */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* set large values to try to override */
@@ -112,16 +112,16 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
if (anim_data.first) {
/* go through channels, finding max extents */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
float tmin, tmax;
/* get range and apply necessary scaling before */
calc_fcurve_range(fcu, &tmin, &tmax);
- if (nob) {
- tmin= get_action_frame_inv(nob, tmin);
- tmax= get_action_frame_inv(nob, tmax);
+ if (adt) {
+ tmin= BKE_nla_tweakedit_remap(adt, tmin, NLATIME_CONVERT_MAP);
+ tmax= BKE_nla_tweakedit_remap(adt, tmax, NLATIME_CONVERT_MAP);
}
/* try to set cur using these values, if they're more extreme than previously set values */
@@ -178,10 +178,11 @@ void ACT_OT_previewrange_set (wmOperatorType *ot)
/* identifiers */
ot->name= "Auto-Set Preview Range";
ot->idname= "ACT_OT_previewrange_set";
+ ot->description= "Set Preview Range based on extents of selected Keyframes.";
/* api callbacks */
ot->exec= actkeys_previewrange_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -214,7 +215,7 @@ static int actkeys_viewall_exec(bContext *C, wmOperator *op)
/* do View2D syncing */
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- /* set notifier that things have changed */
+ /* just redraw this view */
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -225,10 +226,11 @@ void ACT_OT_view_all (wmOperatorType *ot)
/* identifiers */
ot->name= "View All";
ot->idname= "ACT_OT_view_all";
+ ot->description= "Reset viewable area to show full keyframe range.";
/* api callbacks */
ot->exec= actkeys_viewall_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -301,21 +303,19 @@ static int actkeys_copy_exec(bContext *C, wmOperator *op)
}
}
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
-
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_copy (wmOperatorType *ot)
+void ACT_OT_copy (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Keyframes";
- ot->idname= "ACT_OT_keyframes_copy";
+ ot->idname= "ACT_OT_copy";
+ ot->description= "Copy selected keyframes to the copy/paste buffer.";
/* api callbacks */
ot->exec= actkeys_copy_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -345,21 +345,22 @@ static int actkeys_paste_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_paste (wmOperatorType *ot)
+void ACT_OT_paste (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Paste Keyframes";
- ot->idname= "ACT_OT_keyframes_paste";
+ ot->idname= "ACT_OT_paste";
+ ot->description= "Paste keyframes from copy/paste buffer for the selected channels, starting on the current frame.";
/* api callbacks */
ot->exec= actkeys_paste_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -396,18 +397,18 @@ static void insert_action_keys(bAnimContext *ac, short mode)
/* init keyframing flag */
if (IS_AUTOKEY_FLAG(AUTOMATKEY)) flag |= INSERTKEY_MATRIX;
if (IS_AUTOKEY_FLAG(INSERTNEEDED)) flag |= INSERTKEY_NEEDED;
- // if (IS_AUTOKEY_MODE(EDITKEYS)) flag |= INSERTKEY_REPLACE;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS)) flag |= INSERTKEY_REPLACE;
/* insert keyframes */
for (ale= anim_data.first; ale; ale= ale->next) {
- //Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
/* adjust current frame for NLA-scaling */
- //if (nob)
- // cfra= get_action_frame(nob, CFRA);
- //else
- // cfra= (float)CFRA;
+ if (adt)
+ cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
+ else
+ cfra= (float)CFRA;
/* if there's an id */
if (ale->id)
@@ -432,31 +433,32 @@ static int actkeys_insertkey_exec(bContext *C, wmOperator *op)
if (ac.datatype == ANIMCONT_GPENCIL)
return OPERATOR_CANCELLED;
- /* get snapping mode */
+ /* what channels to affect? */
mode= RNA_enum_get(op->ptr, "type");
- /* snap keyframes */
+ /* insert keyframes */
insert_action_keys(&ac, mode);
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_insert (wmOperatorType *ot)
+void ACT_OT_insert_keyframe (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Insert Keyframes";
- ot->idname= "ACT_OT_keyframes_insert";
+ ot->idname= "ACT_OT_insert_keyframe";
+ ot->description= "Insert keyframes for the specified channels.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_insertkey_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -508,8 +510,8 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED; // xxx - start transform
}
@@ -524,16 +526,17 @@ static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_duplicate (wmOperatorType *ot)
+void ACT_OT_duplicate (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Duplicate Keyframes";
- ot->idname= "ACT_OT_keyframes_duplicate";
+ ot->idname= "ACT_OT_duplicate";
+ ot->description= "Make a copy of all selected keyframes.";
/* api callbacks */
ot->invoke= actkeys_duplicate_invoke;
ot->exec= actkeys_duplicate_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -585,22 +588,23 @@ static int actkeys_delete_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_delete (wmOperatorType *ot)
+void ACT_OT_delete (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Keyframes";
- ot->idname= "ACT_OT_keyframes_delete";
+ ot->idname= "ACT_OT_delete";
+ ot->description= "Remove all selected keyframes.";
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= actkeys_delete_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -648,22 +652,23 @@ static int actkeys_clean_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_clean (wmOperatorType *ot)
+void ACT_OT_clean (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clean Keyframes";
- ot->idname= "ACT_OT_keyframes_clean";
+ ot->idname= "ACT_OT_clean";
+ ot->description= "Simplify F-Curves by removing closely spaced keyframes.";
/* api callbacks */
//ot->invoke= // XXX we need that number popup for this!
ot->exec= actkeys_clean_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -674,11 +679,6 @@ void ACT_OT_keyframes_clean (wmOperatorType *ot)
/* ******************** Sample Keyframes Operator *********************** */
-/* little cache for values... */
-typedef struct tempFrameValCache {
- float frame, val;
-} tempFrameValCache;
-
/* Evaluates the curves between each selected keyframe on each frame, and keys the value */
static void sample_action_keys (bAnimContext *ac)
{
@@ -691,64 +691,8 @@ static void sample_action_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through filtered data and add keys between selected keyframes on every frame */
- for (ale= anim_data.first; ale; ale= ale->next) {
- FCurve *fcu= (FCurve *)ale->key_data;
- BezTriple *bezt, *start=NULL, *end=NULL;
- tempFrameValCache *value_cache, *fp;
- int sfra, range;
- int i, n;
-
- /* find selected keyframes... once pair has been found, add keyframes */
- for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
- /* check if selected, and which end this is */
- if (BEZSELECTED(bezt)) {
- if (start) {
- /* set end */
- end= bezt;
-
- /* cache values then add keyframes using these values, as adding
- * keyframes while sampling will affect the outcome...
- */
- range= (int)( ceil(end->vec[1][0] - start->vec[1][0]) );
- sfra= (int)( floor(start->vec[1][0]) );
-
- if (range) {
- value_cache= MEM_callocN(sizeof(tempFrameValCache)*range, "IcuFrameValCache");
-
- /* sample values */
- for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
- fp->frame= (float)(sfra + n);
- fp->val= evaluate_fcurve(fcu, fp->frame);
- }
-
- /* add keyframes with these */
- for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
- insert_vert_fcurve(fcu, fp->frame, fp->val, 1);
- }
-
- /* free temp cache */
- MEM_freeN(value_cache);
-
- /* as we added keyframes, we need to compensate so that bezt is at the right place */
- bezt = fcu->bezt + i + range - 1;
- i += (range - 1);
- }
-
- /* bezt was selected, so it now marks the start of a whole new chain to search */
- start= bezt;
- end= NULL;
- }
- else {
- /* just set start keyframe */
- start= bezt;
- end= NULL;
- }
- }
- }
-
- /* recalculate channel's handles? */
- calchandles_fcurve(fcu);
- }
+ for (ale= anim_data.first; ale; ale= ale->next)
+ sample_fcurve((FCurve *)ale->key_data);
/* admin and redraws */
BLI_freelistN(&anim_data);
@@ -772,21 +716,22 @@ static int actkeys_sample_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_sample (wmOperatorType *ot)
+void ACT_OT_sample (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Sample Keyframes";
- ot->idname= "ACT_OT_keyframes_sample";
+ ot->idname= "ACT_OT_sample";
+ ot->description= "Add keyframes on every frame between the selected keyframes.";
/* api callbacks */
ot->exec= actkeys_sample_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -847,22 +792,23 @@ static int actkeys_expo_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_extrapolation_type_set (wmOperatorType *ot)
+void ACT_OT_extrapolation_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Extrapolation";
- ot->idname= "ACT_OT_keyframes_extrapolation_type_set";
+ ot->idname= "ACT_OT_extrapolation_type";
+ ot->description= "Set extrapolation mode for selected F-Curves.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_expo_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -917,22 +863,23 @@ static int actkeys_ipo_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_interpolation_type (wmOperatorType *ot)
+void ACT_OT_interpolation_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Interpolation";
- ot->idname= "ACT_OT_keyframes_interpolation_type";
+ ot->idname= "ACT_OT_interpolation_type";
+ ot->description= "Set interpolation mode for the F-Curve segments starting from the selected keyframes.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_ipo_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1005,22 +952,23 @@ static int actkeys_handletype_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_handle_type_set (wmOperatorType *ot)
+void ACT_OT_handle_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Handle Type";
- ot->idname= "ACT_OT_keyframes_handle_type_set";
+ ot->idname= "ACT_OT_handle_type";
+ ot->description= "Set type of handle for selected keyframes.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_handletype_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1029,13 +977,84 @@ void ACT_OT_keyframes_handle_type_set (wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", beztriple_handle_type_items, 0, "Type", "");
}
+/* ******************** Set Keyframe-Type Operator *********************** */
+
+/* this function is responsible for setting interpolation mode for keyframes */
+static void setkeytype_action_keys(bAnimContext *ac, short mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ BeztEditFunc set_cb= ANIM_editkeyframes_keytype(mode);
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* loop through setting BezTriple interpolation
+ * Note: we do not supply BeztEditData to the looper yet. Currently that's not necessary here...
+ */
+ for (ale= anim_data.first; ale; ale= ale->next)
+ ANIM_fcurve_keys_bezier_loop(NULL, ale->key_data, NULL, set_cb, NULL);
+
+ /* cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int actkeys_keytype_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short mode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+ if (ac.datatype == ANIMCONT_GPENCIL)
+ return OPERATOR_PASS_THROUGH;
+
+ /* get handle setting mode */
+ mode= RNA_enum_get(op->ptr, "type");
+
+ /* set handle type */
+ setkeytype_action_keys(&ac, mode);
+
+ /* validate keyframes after editing */
+ ANIM_editkeyframes_refresh(&ac);
+
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ACT_OT_keyframe_type (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Keyframe Type";
+ ot->idname= "ACT_OT_keyframe_type";
+ ot->description= "Set type of keyframe for the seleced keyframes.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= actkeys_keytype_exec;
+ ot->poll= ED_operator_action_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ RNA_def_enum(ot->srna, "type", beztriple_keyframe_type_items, 0, "Type", "");
+}
+
/* ************************************************************************** */
/* TRANSFORM STUFF */
-/* ***************** Snap Current Frame Operator *********************** */
+/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
+static int actkeys_framejump_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
@@ -1054,8 +1073,17 @@ static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- for (ale= anim_data.first; ale; ale= ale->next)
- ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
+
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+ ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ }
+ else
+ ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+ }
BLI_freelistN(&anim_data);
@@ -1071,15 +1099,16 @@ static int actkeys_cfrasnap_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_cfrasnap (wmOperatorType *ot)
+void ACT_OT_frame_jump (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Snap Current Frame to Keys";
- ot->idname= "ACT_OT_keyframes_cfrasnap";
+ ot->name= "Jump to Frame";
+ ot->idname= "ACT_OT_frame_jump";
+ ot->description= "Set the current frame to the average frame of the selected keyframes.";
/* api callbacks */
- ot->exec= actkeys_cfrasnap_exec;
- ot->poll= ED_operator_areaactive;
+ ot->exec= actkeys_framejump_exec;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1125,12 +1154,12 @@ static void snap_action_keys(bAnimContext *ac, short mode)
/* snap keyframes */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
//else if (ale->type == ACTTYPE_GPLAYER)
// snap_gplayer_frames(ale->data, mode);
@@ -1160,22 +1189,23 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_snap (wmOperatorType *ot)
+void ACT_OT_snap (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Snap Keys";
- ot->idname= "ACT_OT_keyframes_snap";
+ ot->idname= "ACT_OT_snap";
+ ot->description= "Snap selected keyframes to the times specified.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_snap_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1188,10 +1218,10 @@ void ACT_OT_keyframes_snap (wmOperatorType *ot)
/* defines for mirror keyframes tool */
EnumPropertyItem prop_actkeys_mirror_types[] = {
- {ACTKEYS_MIRROR_CFRA, "CFRA", 0, "Current frame", ""},
- {ACTKEYS_MIRROR_YAXIS, "YAXIS", 0, "Vertical Axis", ""},
- {ACTKEYS_MIRROR_XAXIS, "XAXIS", 0, "Horizontal Axis", ""},
- {ACTKEYS_MIRROR_MARKER, "MARKER", 0, "First Selected Marker", ""},
+ {ACTKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current frame", ""},
+ {ACTKEYS_MIRROR_YAXIS, "YAXIS", 0, "By Times over Time=0", ""},
+ {ACTKEYS_MIRROR_XAXIS, "XAXIS", 0, "By Values over Value=0", ""},
+ {ACTKEYS_MIRROR_MARKER, "MARKER", 0, "By Times over First Selected Marker", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1241,12 +1271,12 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
/* mirror keyframes */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
//else if (ale->type == ACTTYPE_GPLAYER)
// snap_gplayer_frames(ale->data, mode);
@@ -1276,22 +1306,23 @@ static int actkeys_mirror_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_mirror (wmOperatorType *ot)
+void ACT_OT_mirror (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mirror Keys";
- ot->idname= "ACT_OT_keyframes_mirror";
+ ot->idname= "ACT_OT_mirror";
+ ot->description= "Flip selected keyframes over the selected mirror line.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= actkeys_mirror_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1300,4 +1331,38 @@ void ACT_OT_keyframes_mirror (wmOperatorType *ot)
RNA_def_enum(ot->srna, "type", prop_actkeys_mirror_types, 0, "Type", "");
}
+/* ******************** New Action Operator *********************** */
+
+static int act_new_exec(bContext *C, wmOperator *op)
+{
+ bAction *action;
+
+ // XXX need to restore behaviour to copy old actions...
+ action= add_empty_action("Action");
+
+ /* combined with RNA property, this will assign & increase user,
+ so decrease here to compensate for that */
+ action->id.us--;
+
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ACT_OT_new (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New";
+ ot->idname= "ACT_OT_new";
+ ot->description= "Create new action.";
+
+ /* api callbacks */
+ ot->exec= act_new_exec;
+ ot->poll= ED_operator_action_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ************************************************************************** */
diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c
index fa96e1ea81f..f602345baea 100644
--- a/source/blender/editors/space_action/action_header.c
+++ b/source/blender/editors/space_action/action_header.c
@@ -43,14 +43,18 @@
#include "BLI_blenlib.h"
#include "BKE_animsys.h"
+#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "ED_anim_api.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -63,1540 +67,196 @@
#include "action_intern.h"
-/* ********************************************************* */
-/* Menu Defines... */
-
-/* button events */
-enum {
- B_REDR = 0,
- B_ACTCOPYKEYS,
- B_ACTPASTEKEYS,
-} eActHeader_ButEvents;
-
-/* ------------------------------- */
-/* enums declaring constants that are used as menu event codes */
-
-enum {
- ACTMENU_VIEW_CENTERVIEW= 0,
- ACTMENU_VIEW_AUTOUPDATE,
- ACTMENU_VIEW_PLAY3D,
- ACTMENU_VIEW_PLAYALL,
- ACTMENU_VIEW_ALL,
- ACTMENU_VIEW_MAXIMIZE,
- ACTMENU_VIEW_LOCK,
- ACTMENU_VIEW_SLIDERS,
- ACTMENU_VIEW_NEXTMARKER,
- ACTMENU_VIEW_PREVMARKER,
- ACTMENU_VIEW_NEXTKEYFRAME,
- ACTMENU_VIEW_PREVKEYFRAME,
- ACTMENU_VIEW_TIME,
- ACTMENU_VIEW_NOHIDE,
- ACTMENU_VIEW_FRANUM,
- ACTMENU_VIEW_TRANSDELDUPS,
- ACTMENU_VIEW_HORIZOPTIMISE,
- ACTMENU_VIEW_GCOLORS,
- ACTMENU_VIEW_PREVRANGESET,
- ACTMENU_VIEW_PREVRANGECLEAR,
- ACTMENU_VIEW_PREVRANGEAUTO
-};
-
-enum {
- ACTMENU_SEL_BORDER = 0,
- ACTMENU_SEL_BORDERC,
- ACTMENU_SEL_BORDERM,
- ACTMENU_SEL_ALL_KEYS,
- ACTMENU_SEL_ALL_CHAN,
- ACTMENU_SEL_ALL_MARKERS,
- ACTMENU_SEL_INVERSE_KEYS,
- ACTMENU_SEL_INVERSE_MARKERS,
- ACTMENU_SEL_INVERSE_CHANNELS,
- ACTMENU_SEL_LEFTKEYS,
- ACTMENU_SEL_RIGHTKEYS
-};
-
-enum {
- ACTMENU_SEL_COLUMN_KEYS = 1,
- ACTMENU_SEL_COLUMN_CFRA,
- ACTMENU_SEL_COLUMN_MARKERSCOLUMN,
- ACTMENU_SEL_COLUMN_MARKERSBETWEEN
-};
-
-enum {
- ACTMENU_CHANNELS_OPENLEVELS = 0,
- ACTMENU_CHANNELS_CLOSELEVELS,
- ACTMENU_CHANNELS_EXPANDALL,
- ACTMENU_CHANNELS_SHOWACHANS,
- ACTMENU_CHANNELS_DELETE
-};
-
-enum {
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP = 0,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM
-};
-
-enum {
- ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE = 0,
- ACTMENU_CHANNELS_GROUP_ADD_TONEW,
- ACTMENU_CHANNELS_GROUP_REMOVE,
- ACTMENU_CHANNELS_GROUP_SYNCPOSE
-};
-
-enum {
- ACTMENU_CHANNELS_SETTINGS_TOGGLE = 0,
- ACTMENU_CHANNELS_SETTINGS_ENABLE,
- ACTMENU_CHANNELS_SETTINGS_DISABLE,
-};
-
-enum {
- ACTMENU_KEY_DUPLICATE = 0,
- ACTMENU_KEY_DELETE,
- ACTMENU_KEY_CLEAN,
- ACTMENU_KEY_SAMPLEKEYS,
- ACTMENU_KEY_INSERTKEY
-};
-
-enum {
- ACTMENU_KEY_TRANSFORM_MOVE = 0,
- ACTMENU_KEY_TRANSFORM_SCALE,
- ACTMENU_KEY_TRANSFORM_SLIDE,
- ACTMENU_KEY_TRANSFORM_EXTEND
-};
-
-enum {
- ACTMENU_KEY_HANDLE_AUTO = 0,
- ACTMENU_KEY_HANDLE_ALIGN,
- ACTMENU_KEY_HANDLE_FREE,
- ACTMENU_KEY_HANDLE_VECTOR
-};
-
enum {
- ACTMENU_KEY_INTERP_CONST = 0,
- ACTMENU_KEY_INTERP_LINEAR,
- ACTMENU_KEY_INTERP_BEZIER
-};
-
-enum {
- ACTMENU_KEY_EXTEND_CONST = 0,
- ACTMENU_KEY_EXTEND_EXTRAPOLATION,
- ACTMENU_KEY_EXTEND_CYCLIC,
- ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION
-};
-
-enum {
- ACTMENU_KEY_SNAP_NEARFRAME = 1,
- ACTMENU_KEY_SNAP_CURFRAME,
- ACTMENU_KEY_SNAP_NEARMARK,
- ACTMENU_KEY_SNAP_NEARTIME,
- ACTMENU_KEY_SNAP_CFRA2KEY,
-};
-
-enum {
- ACTMENU_KEY_MIRROR_CURFRAME = 1,
- ACTMENU_KEY_MIRROR_YAXIS,
- ACTMENU_KEY_MIRROR_XAXIS,
- ACTMENU_KEY_MIRROR_MARKER
-};
-
-enum {
- ACTMENU_MARKERS_ADD = 0,
- ACTMENU_MARKERS_DUPLICATE,
- ACTMENU_MARKERS_DELETE,
- ACTMENU_MARKERS_NAME,
- ACTMENU_MARKERS_MOVE,
- ACTMENU_MARKERS_LOCALADD,
- ACTMENU_MARKERS_LOCALRENAME,
- ACTMENU_MARKERS_LOCALDELETE,
- ACTMENU_MARKERS_LOCALMOVE
-};
-
-/* ------------------------------- */
-/* macros for easier state testing (only for use here) */
-
-/* test if active action editor is showing any markers */
-#if 0
- #define SACTION_HASMARKERS \
- ((saction->action && saction->action->markers.first) \
- || (scene->markers.first))
-#endif
-
-/* need to find out how to get scene from context */
-#define SACTION_HASMARKERS (saction->action && saction->action->markers.first)
-
-/* ------------------------------- */
-
-/* *************************************************************** */
-/* menus */
-
-/* Key menu --------------------------- */
-
-static void do_keymenu_transformmenu(bContext *C, void *arg, int event)
-{
- switch (event)
- {
- case ACTMENU_KEY_TRANSFORM_MOVE:
- //transform_action_keys('g', 0);
- break;
- case ACTMENU_KEY_TRANSFORM_SCALE:
- //transform_action_keys('s', 0);
- break;
- case ACTMENU_KEY_TRANSFORM_SLIDE:
- //transform_action_keys('t', 0);
- break;
- case ACTMENU_KEY_TRANSFORM_EXTEND:
- //transform_action_keys('e', 0);
- break;
- }
-}
-
-static uiBlock *action_keymenu_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_keymenu_transformmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_transformmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_TRANSFORM_MOVE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Grab/Extend from Frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_TRANSFORM_EXTEND, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_TRANSFORM_SCALE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Time Slide|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_TRANSFORM_SLIDE, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_keymenu_snapmenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_KEY_SNAP_NEARFRAME:
- case ACTMENU_KEY_SNAP_CURFRAME:
- case ACTMENU_KEY_SNAP_NEARMARK:
- case ACTMENU_KEY_SNAP_NEARTIME:
- //snap_action_keys(event);
- break;
-
- case ACTMENU_KEY_SNAP_CFRA2KEY:
- //snap_cfra_action();
- break;
- }
-}
-
-static uiBlock *action_keymenu_snapmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
-
- block= uiBeginBlock(C, ar, "action_keymenu_snapmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_snapmenu, NULL);
-
- if (saction->flag & SACTION_DRAWTIME) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Key -> Nearest Second|Shift S, 1", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_NEARTIME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Key -> Current Time|Shift S, 2", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_CURFRAME, "");
-
- }
- else {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Key -> Nearest Frame|Shift S, 1", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_NEARFRAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Key -> Current Frame|Shift S, 2", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_CURFRAME, "");
- }
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Key -> Nearest Marker|Shift S, 3", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_NEARMARK, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Current Frame -> Key|Ctrl Shift S", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_NEARMARK, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_keymenu_mirrormenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_KEY_MIRROR_CURFRAME:
- case ACTMENU_KEY_MIRROR_YAXIS:
- //mirror_action_keys(event);
- break;
- }
-
-}
-
-static uiBlock *action_keymenu_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_keymenu_mirrormenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_mirrormenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Current Frame|Shift M, 1", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_MIRROR_CURFRAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Vertical Axis|Shift M, 2", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_MIRROR_YAXIS, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Horizontal Axis|Shift M, 3", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_MIRROR_XAXIS, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Selected Marker|Shift M, 4", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_MIRROR_MARKER, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_keymenu_handlemenu(bContext *C, void *arg, int event)
-{
- switch (event) {
- case ACTMENU_KEY_HANDLE_AUTO:
- //sethandles_action_keys(HD_AUTO);
- break;
-
- case ACTMENU_KEY_HANDLE_ALIGN:
- case ACTMENU_KEY_HANDLE_FREE:
- /* OK, this is kinda dumb, need to fix the
- * toggle crap in sethandles_ipo_keys()
- */
- //sethandles_action_keys(HD_ALIGN);
- break;
-
- case ACTMENU_KEY_HANDLE_VECTOR:
- //sethandles_action_keys(HD_VECT);
- break;
- }
-}
-
-static uiBlock *action_keymenu_handlemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_keymenu_handlemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_handlemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Auto|Shift H", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_HANDLE_AUTO, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Aligned|H", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_HANDLE_ALIGN, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Free|H", 0, yco-=20, menuwidth,
- 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_HANDLE_FREE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Vector|V", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_HANDLE_VECTOR, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_keymenu_extendmenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_KEY_EXTEND_CONST:
- //action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CONSTANT);
- break;
- case ACTMENU_KEY_EXTEND_EXTRAPOLATION:
- //action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_EXTRAPOLATION);
- break;
- case ACTMENU_KEY_EXTEND_CYCLIC:
- //action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLIC);
- break;
- case ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION:
- //action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLICEXTRAPOLATION);
- break;
- }
-}
-
-static uiBlock *action_keymenu_extendmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_keymenu_extendmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_extendmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Constant", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_EXTEND_CONST, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Extrapolation", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_EXTEND_EXTRAPOLATION, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Cyclic", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_EXTEND_CYCLIC, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Cyclic Extrapolation", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_keymenu_intpolmenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_KEY_INTERP_CONST:
- //action_set_ipo_flags(SET_IPO_MENU, SET_IPO_CONSTANT);
- break;
- case ACTMENU_KEY_INTERP_LINEAR:
- //action_set_ipo_flags(SET_IPO_MENU, SET_IPO_LINEAR);
- break;
- case ACTMENU_KEY_INTERP_BEZIER:
- //action_set_ipo_flags(SET_IPO_MENU, SET_IPO_BEZIER);
- break;
- }
-}
+ B_REDR= 0,
+} eActHeader_Events;
-static uiBlock *action_keymenu_intpolmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_keymenu_intpolmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_keymenu_intpolmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Constant|Shift T, 1", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_INTERP_CONST, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Linear|Shift T, 2", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_INTERP_LINEAR, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Bezier|Shift T, 3", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_INTERP_BEZIER, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
-
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
+/* ********************************************************* */
+/* Menu Defines... */
-static void do_action_keymenu(bContext *C, void *arg, int event)
+static void act_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- bAction *act;
- //Key *key;
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa= CTX_wm_area(C);
+ SpaceAction *sact= CTX_wm_space_action(C);
+ PointerRNA spaceptr;
- if (!saction) return;
-
- act = saction->action;
- //key = get_action_mesh_key();
-
- switch(event)
- {
- case ACTMENU_KEY_DUPLICATE:
- //duplicate_action_keys();
- break;
- case ACTMENU_KEY_DELETE:
- //delete_action_keys();
- break;
- case ACTMENU_KEY_CLEAN:
- //clean_action();
- break;
- case ACTMENU_KEY_SAMPLEKEYS:
- //sample_action_keys();
- break;
- case ACTMENU_KEY_INSERTKEY:
- //insertkey_action();
- break;
- }
-}
-
-static uiBlock *action_keymenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
+ /* retrieve state */
+ RNA_pointer_create(&sc->id, &RNA_SpaceDopeSheetEditor, sact, &spaceptr);
- block= uiBeginBlock(C, ar, "action_keymenu", UI_EMBOSSP);
-
-
- uiBlockSetButmFunc(block, do_action_keymenu, NULL);
+ /* create menu */
+ //uiItemO(layout, NULL, ICON_MENU_PANEL, "ACT_OT_properties");
- uiDefIconTextBlockBut(block, action_keymenu_transformmenu,
- NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
+ //uiItemS(layout);
- uiDefIconTextBlockBut(block, action_keymenu_snapmenu,
- NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
+ uiItemR(layout, NULL, 0, &spaceptr, "show_cframe_indicator", 0);
+ uiItemR(layout, NULL, 0, &spaceptr, "show_sliders", 0);
+ uiItemR(layout, NULL, 0, &spaceptr, "automerge_keyframes", 0);
- uiDefIconTextBlockBut(block, action_keymenu_mirrormenu,
- NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 20, "");
+ if (sact->flag & SACTION_DRAWTIME)
+ uiItemO(layout, "Show Frames", 0, "ANIM_OT_time_toggle");
+ else
+ uiItemO(layout, "Show Seconds", 0, "ANIM_OT_time_toggle");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiItemS(layout);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Insert Key|I", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_INSERTKEY, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Duplicate|Shift D", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_DUPLICATE, "");
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_set");
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_clear");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Delete|X", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_DELETE, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Clean Action|O", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_CLEAN, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Sample Keys|Alt O", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SAMPLEKEYS, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, action_keymenu_handlemenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Handle Type", 0, yco-=20, 120, 20, "");
+ uiItemO(layout, NULL, 0, "ACT_OT_previewrange_set");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, action_keymenu_extendmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Extend Mode", 0, yco-=20, 120, 20, "");
- uiDefIconTextBlockBut(block, action_keymenu_intpolmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Interpolation Mode", 0, yco-=20, 120, 20, "");
+ uiItemS(layout);
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
+ uiItemO(layout, NULL, 0, "ACT_OT_frame_jump");
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemO(layout, NULL, 0, "ACT_OT_view_all");
- return block;
+ if (sa->full)
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
+ else
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctrl DownArrow
}
-/* Frame menu --------------------------- */
-
-
-// framemenu uses functions from keymenu
-static uiBlock *action_framemenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_framemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_action_keymenu, NULL);
-
- uiDefIconTextBlockBut(block, action_keymenu_transformmenu,
- NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
-
- uiDefIconTextBlockBut(block, action_keymenu_snapmenu,
- NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
-
- uiDefIconTextBlockBut(block, action_keymenu_mirrormenu,
- NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 20, "");
+ uiItemO(layout, NULL, 0, "ACT_OT_select_all_toggle");
+ uiItemBooleanO(layout, "Invert All", 0, "ACT_OT_select_all_toggle", "invert", 1);
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Duplicate|Shift D", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_DUPLICATE, "");
+ uiItemS(layout);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Delete|X", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_DELETE, "");
+ uiItemO(layout, NULL, 0, "ACT_OT_select_border");
+ uiItemBooleanO(layout, "Border Axis Range", 0, "ACT_OT_select_border", "axis_range", 1);
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
+ uiItemS(layout);
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemEnumO(layout, "Columns on Selected Keys", 0, "ACT_OT_select_column", "mode", ACTKEYS_COLUMNSEL_KEYS);
+ uiItemEnumO(layout, "Column on Current Frame", 0, "ACT_OT_select_column", "mode", ACTKEYS_COLUMNSEL_CFRA);
- return block;
+ uiItemEnumO(layout, "Columns on Selected Markers", 0, "ACT_OT_select_column", "mode", ACTKEYS_COLUMNSEL_MARKERS_COLUMN);
+ uiItemEnumO(layout, "Between Selected Markers", 0, "ACT_OT_select_column", "mode", ACTKEYS_COLUMNSEL_MARKERS_BETWEEN);
}
-/* Marker menu --------------------------- */
-
-static void do_markermenu(bContext *C, void *arg, int event)
+static void act_channelmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- switch(event)
- {
- case ACTMENU_MARKERS_ADD:
- //add_marker(CFRA);
- break;
- case ACTMENU_MARKERS_DUPLICATE:
- //duplicate_marker();
- break;
- case ACTMENU_MARKERS_DELETE:
- //remove_marker();
- break;
- case ACTMENU_MARKERS_NAME:
- //rename_marker();
- break;
- case ACTMENU_MARKERS_MOVE:
- //transform_markers('g', 0);
- break;
- case ACTMENU_MARKERS_LOCALADD:
- //action_add_localmarker(G.saction->action, CFRA);
- break;
- case ACTMENU_MARKERS_LOCALDELETE:
- //action_remove_localmarkers(G.saction->action);
- break;
- case ACTMENU_MARKERS_LOCALRENAME:
- //action_rename_localmarker(G.saction->action);
- break;
- case ACTMENU_MARKERS_LOCALMOVE:
- /*G.saction->flag |= SACTION_POSEMARKERS_MOVE;
- transform_markers('g', 0);
- G.saction->flag &= ~SACTION_POSEMARKERS_MOVE;*/
- break;
- }
-}
-
-static uiBlock *action_markermenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_toggle");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_enable");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_disable");
- block= uiBeginBlock(C, ar, "action_markermenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_markermenu, NULL);
+ uiItemS(layout);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_ADD, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DUPLICATE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|Shift X", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DELETE, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_NAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_MOVE, "");
-
- if (saction->mode == SACTCONT_ACTION) {
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Pose Marker|Shift L", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALADD, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename Pose Marker|Ctrl Shift L", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALRENAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Pose Marker|Alt L", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALDELETE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Pose Marker|Ctrl L", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_LOCALMOVE, "");
- }
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_editable_toggle");
- return block;
-}
-
-
-/* Channel menu --------------------------- */
-
-static void do_channelmenu_posmenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN:
- //rearrange_action_channels(REARRANGE_ACTCHAN_DOWN);
- break;
- case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP:
- //rearrange_action_channels(REARRANGE_ACTCHAN_UP);
- break;
- case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP:
- //rearrange_action_channels(REARRANGE_ACTCHAN_TOP);
- break;
- case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM:
- //rearrange_action_channels(REARRANGE_ACTCHAN_BOTTOM);
- break;
- }
-}
-
-static uiBlock *action_channelmenu_posmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_channelmenu_posmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_channelmenu_posmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Up|Shift Page Up", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Down|Shift Page Down", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN, "");
+ uiItemS(layout);
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move to Top|Ctrl Shift Page Up", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move to Bottom|Ctrl Shift Page Down", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
-}
-
-static void do_channelmenu_groupmenu(bContext *C, void *arg, int event)
-{
- switch(event)
- {
- case ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE:
- //action_groups_group(0);
- break;
- case ACTMENU_CHANNELS_GROUP_ADD_TONEW:
- //action_groups_group(1);
- break;
- case ACTMENU_CHANNELS_GROUP_REMOVE:
- //action_groups_ungroup();
- break;
- case ACTMENU_CHANNELS_GROUP_SYNCPOSE: /* Syncronise Pose-data and Action-data */
- //sync_pchan2achan_grouping();
- break;
- }
-}
-
-static uiBlock *action_channelmenu_groupmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_channelmenu_groupmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_channelmenu_groupmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Add to Active Group|Shift G", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Add to New Group|Ctrl Shift G", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_GROUP_ADD_TONEW, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Remove From Group|Alt G", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_GROUP_REMOVE, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Synchronise with Armature", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_GROUP_SYNCPOSE, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_expand");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_collapse");
}
-static void do_channelmenu_settingsmenu(bContext *C, void *arg, int event)
+static void act_gplayermenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- //setflag_action_channels(event);
-}
-
-static uiBlock *action_channelmenu_settingsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_channelmenu_settingsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_channelmenu_settingsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Toggle a Setting|Shift W", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_SETTINGS_TOGGLE, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Enable a Setting|Ctrl Shift W", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_SETTINGS_ENABLE, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Disable a Setting|Alt W", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_CHANNELS_SETTINGS_DISABLE, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
-}
-
-static void do_channelmenu(bContext *C, void *arg, int event)
-{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
-
- if (saction == NULL) return;
-
- switch(event)
- {
- case ACTMENU_CHANNELS_OPENLEVELS: /* Unfold selected channels one step */
- //openclose_level_action(1);
- break;
- case ACTMENU_CHANNELS_CLOSELEVELS: /* Fold selected channels one step */
- //openclose_level_action(-1);
- break;
- case ACTMENU_CHANNELS_EXPANDALL: /* Expands all channels */
- //expand_all_action();
- break;
- case ACTMENU_CHANNELS_SHOWACHANS: /* Unfold groups that are hiding selected achans */
- //expand_obscuregroups_action();
- break;
- case ACTMENU_CHANNELS_DELETE: /* Deletes selected channels */
- //delete_action_channels();
- break;
- }
+ //uiItemMenuF(layout, "Transform", 0, nla_edit_transformmenu, NULL, NULL);
+ //uiItemS(layout);
+ //uiItemO(layout, NULL, 0, "NLAEDIT_OT_duplicate");
}
-static uiBlock *action_channelmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_channelmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_channelmenu, NULL);
-
- uiDefIconTextBlockBut(block, action_channelmenu_groupmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Grouping", 0, yco-=20, 120, 20, "");
-
- uiDefIconTextBlockBut(block, action_channelmenu_posmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Ordering", 0, yco-=20, 120, 20, "");
-
- uiDefIconTextBlockBut(block, action_channelmenu_settingsmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Settings", 0, yco-=20, 120, 20, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Delete|X", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_DELETE, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Toggle Show Hierachy|~", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_EXPANDALL, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Show Group-Hidden Channels|Shift ~", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_SHOWACHANS, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Expand One Level|Ctrl NumPad+", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_OPENLEVELS, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Collapse One Level|Ctrl NumPad-", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_CLOSELEVELS, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
+ uiItemEnumO(layout, "Grab/Move", 0, "TFM_OT_transform", "mode", TFM_TIME_TRANSLATE);
+ uiItemEnumO(layout, "Extend", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
+ uiItemEnumO(layout, "Scale", 0, "TFM_OT_transform", "mode", TFM_TIME_SCALE);
}
-/* Grease Pencil --------------------------- */
-
-/* Uses channelmenu functions */
-static uiBlock *action_gplayermenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_gplayermenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_channelmenu, NULL);
-
- uiDefIconTextBlockBut(block, action_channelmenu_settingsmenu,
- NULL, ICON_RIGHTARROW_THIN,
- "Settings", 0, yco-=20, 120, 20, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Delete|X", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_CHANNELS_DELETE, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_CFRA);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_NEAREST_FRAME);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_NEAREST_SECOND);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_NEAREST_MARKER);
}
-/* Select menu --------------------------- */
-
-static void do_selectmenu_columnmenu(bContext *C, void *arg, int event)
+static void act_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- switch (event) {
- case ACTMENU_SEL_COLUMN_MARKERSBETWEEN:
- //markers_selectkeys_between();
- break;
- case ACTMENU_SEL_COLUMN_KEYS:
- //column_select_action_keys(1);
- break;
- case ACTMENU_SEL_COLUMN_MARKERSCOLUMN:
- //column_select_action_keys(2);
- break;
- case ACTMENU_SEL_COLUMN_CFRA:
- //column_select_action_keys(3);
- break;
- }
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_CFRA);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_YAXIS);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_XAXIS);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_MARKER);
}
-static uiBlock *action_selectmenu_columnmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_edit_keytypesmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_selectmenu_columnmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_selectmenu_columnmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "On Selected Keys|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_COLUMN_KEYS, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "On Current Frame|Ctrl K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_COLUMN_CFRA, "");
-
- if (SACTION_HASMARKERS) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "On Selected Markers|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_COLUMN_MARKERSCOLUMN, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Between Selected Markers|Alt K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_COLUMN_MARKERSBETWEEN, "");
- }
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_keyframe_type", "type", BEZT_KEYTYPE_KEYFRAME);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_keyframe_type", "type", BEZT_KEYTYPE_BREAKDOWN);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_keyframe_type", "type", BEZT_KEYTYPE_EXTREME);
}
-static void do_selectmenu(bContext *C, void *arg, int event)
+static void act_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- //Key *key;
-
- if (saction == NULL) return;
-
- //key = get_action_mesh_key();
-
- switch(event)
- {
- case ACTMENU_SEL_BORDER: /* Border Select */
- //borderselect_action();
- break;
-
- case ACTMENU_SEL_BORDERC: /* Border Select */
- //borderselect_actionchannels();
- break;
-
- case ACTMENU_SEL_BORDERM: /* Border Select */
- //borderselect_markers();
- break;
-
- case ACTMENU_SEL_ALL_KEYS: /* Select/Deselect All Keys */
- /*deselect_action_keys(1, 1);
- BIF_undo_push("(De)Select Keys");
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);*/
- break;
-
- case ACTMENU_SEL_ALL_CHAN: /* Select/Deselect All Channels */
- /*deselect_action_channels(1);
- BIF_undo_push("(De)Select Action Channels");
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);*/
- break;
-
- case ACTMENU_SEL_ALL_MARKERS: /* select/deselect all markers */
- /*deselect_markers(1, 0);
- BIF_undo_push("(De)Select Markers");
- allqueue(REDRAWMARKER, 0);*/
- break;
-
- case ACTMENU_SEL_INVERSE_KEYS: /* invert selection status of keys */
- /*deselect_action_keys(0, 2);
- BIF_undo_push("Inverse Keys");
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);*/
- break;
-
- case ACTMENU_SEL_INVERSE_CHANNELS: /* invert selection status of channels */
- /*deselect_action_channels(2);
- BIF_undo_push("Inverse Action Channels");
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);*/
- break;
-
- case ACTMENU_SEL_INVERSE_MARKERS: /* invert selection of markers */
- /*deselect_markers(0, 2);
- BIF_undo_push("Inverse Action Channels");
- allqueue(REDRAWMARKER, 0);*/
- break;
-
- case ACTMENU_SEL_LEFTKEYS:
- //selectkeys_leftright(1, SELECT_REPLACE);
- break;
-
- case ACTMENU_SEL_RIGHTKEYS:
- //selectkeys_leftright(0, SELECT_REPLACE);
- break;
- }
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_FREE);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_AUTO);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_VECT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_ALIGN);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_AUTO_ANIM); // xxx?
}
-static uiBlock *action_selectmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "action_selectmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_selectmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Border Select Keys|B", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_BORDER, "");
- if (SACTION_HASMARKERS) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Border Select Markers|Ctrl B", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_BORDERM, "");
- }
- if (saction->mode != SACTCONT_SHAPEKEY) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Border Select Channels|B", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_BORDERC, "");
- }
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Select/Deselect All Keys|A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_ALL_KEYS, "");
- if (SACTION_HASMARKERS) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Select/Deselect All Markers|Ctrl A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_ALL_MARKERS, "");
- }
- if (saction->mode != SACTCONT_SHAPEKEY) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Select/Deselect All Channels|A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_ALL_CHAN, "");
- }
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Inverse Keys|Ctrl I", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_INVERSE_KEYS, "");
- if (SACTION_HASMARKERS) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Inverse Markers|Ctrl Shift I", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_INVERSE_MARKERS, "");
- }
- if (saction->mode != SACTCONT_SHAPEKEY) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Inverse All Channels|Ctrl I", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_INVERSE_CHANNELS, "");
- }
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Back In Time|Alt RMB", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_LEFTKEYS, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Ahead In Time|Alt RMB", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_SEL_RIGHTKEYS, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, action_selectmenu_columnmenu,
- NULL, ICON_RIGHTARROW_THIN, "Column Select Keys", 0, yco-=20, 120, 20, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_CONST);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_LIN);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_BEZ);
}
-/* View menu --------------------------- */
-
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void act_edit_expomenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- switch(event) {
- case ACTMENU_VIEW_CENTERVIEW: /* Center View to Current Frame */
- //center_currframe();
- break;
- case ACTMENU_VIEW_AUTOUPDATE: /* Update Automatically */
- /*if (BTST(G.saction->lock, 0))
- G.saction->lock = BCLR(G.saction->lock, 0);
- else
- G.saction->lock = BSET(G.saction->lock, 0);*/
- break;
- case ACTMENU_VIEW_PLAY3D: /* Play Back Animation */
- //play_anim(0);
- break;
- case ACTMENU_VIEW_PLAYALL: /* Play Back Animation in All */
- //play_anim(1);
- break;
- case ACTMENU_VIEW_ALL: /* View All */
- //do_action_buttons(B_ACTHOME);
- break;
- case ACTMENU_VIEW_LOCK:
- /*G.v2d->flag ^= V2D_VIEWLOCK;
- if (G.v2d->flag & V2D_VIEWLOCK)
- view2d_do_locks(curarea, 0);*/
- break;
- case ACTMENU_VIEW_SLIDERS: /* Show sliders (when applicable) */
- //G.saction->flag ^= SACTION_SLIDERS;
- break;
- case ACTMENU_VIEW_MAXIMIZE: /* Maximize Window */
- /* using event B_FULL */
- break;
- case ACTMENU_VIEW_NEXTMARKER: /* Jump to next marker */
- //nextprev_marker(1);
- break;
- case ACTMENU_VIEW_PREVMARKER: /* Jump to previous marker */
- //nextprev_marker(-1);
- break;
- case ACTMENU_VIEW_TIME: /* switch between frames and seconds display */
- //G.saction->flag ^= SACTION_DRAWTIME;
- break;
- case ACTMENU_VIEW_NOHIDE: /* Show hidden channels */
- //G.saction->flag ^= SACTION_NOHIDE;
- break;
- case ACTMENU_VIEW_NEXTKEYFRAME: /* Jump to next keyframe */
- //nextprev_action_keyframe(1);
- break;
- case ACTMENU_VIEW_PREVKEYFRAME: /* Jump to previous keyframe */
- //nextprev_action_keyframe(-1);
- break;
- case ACTMENU_VIEW_TRANSDELDUPS: /* Don't delete duplicate/overlapping keyframes after transform */
- //G.saction->flag ^= SACTION_NOTRANSKEYCULL;
- break;
- case ACTMENU_VIEW_HORIZOPTIMISE: /* Include keyframes not in view (horizontally) when preparing to draw */
- //G.saction->flag ^= SACTION_HORIZOPTIMISEON;
- break;
- case ACTMENU_VIEW_GCOLORS: /* Draw grouped-action channels using its group's color */
- //G.saction->flag ^= SACTION_NODRAWGCOLORS;
- break;
- case ACTMENU_VIEW_PREVRANGESET: /* Set preview range */
- //anim_previewrange_set();
- break;
- case ACTMENU_VIEW_PREVRANGECLEAR: /* Clear preview range */
- //anim_previewrange_clear();
- break;
- case ACTMENU_VIEW_PREVRANGEAUTO: /* Auto preview-range length */
- //action_previewrange_set(G.saction->action);
- break;
- }
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_CONSTANT);
+ uiItemEnumO(layout, NULL, 0, "ACT_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_LINEAR);
}
-static uiBlock *action_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void act_editmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- View2D *v2d= UI_view2d_fromcontext_rwin(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
+ uiItemMenuF(layout, "Transform", 0, act_edit_transformmenu, NULL);
+ uiItemMenuF(layout, "Snap", 0, act_edit_snapmenu, NULL);
+ uiItemMenuF(layout, "Mirror", 0, act_edit_mirrormenu, NULL);
- block= uiBeginBlock(C, ar, "viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
+ uiItemS(layout);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Center View to Current Frame|C", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_CENTERVIEW, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if (saction->flag & SACTION_DRAWTIME) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Show Frames|Ctrl T", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_TIME, "");
- }
- else {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Show Seconds|Ctrl T", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_TIME, "");
- }
+ uiItemO(layout, NULL, 0, "ACT_OT_insert_keyframe");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiItemS(layout);
- if (saction->mode == SACTCONT_GPENCIL) {
- // this option may get removed in future
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Cull Out-of-View Keys (Time)|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_HORIZOPTIMISE, "");
- }
- else {
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_SLIDERS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Show Sliders|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_SLIDERS, "");
-
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_NOHIDE)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Show Hidden Channels|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_NOHIDE, "");
-
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_NODRAWGCOLORS)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
- "Use Group Colors|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_GCOLORS, "");
-
- // this option may get removed in future
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_HORIZOPTIMISEON)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Cull Out-of-View Keys (Time)|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_HORIZOPTIMISE, "");
-
- uiDefIconTextBut(block, BUTM, 1, (saction->flag & SACTION_NOTRANSKEYCULL)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
- "AutoMerge Keyframes|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_TRANSDELDUPS, "");
- }
+ uiItemO(layout, NULL, 0, "ACT_OT_duplicate");
+ uiItemO(layout, NULL, 0, "ACT_OT_delete");
-
- uiDefIconTextBut(block, BUTM, 1, (v2d->flag & V2D_VIEWSYNC_SCREEN_TIME)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Lock Time to Other Windows|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_LOCK, "");
-
- /*uiDefIconTextBut(block, BUTM, 1, BTST(saction->lock, 0)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Update Automatically|", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_AUTOUPDATE, "");*/
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Jump To Next Marker|PageUp", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTMARKER, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Jump To Prev Marker|PageDown", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVMARKER, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Jump To Next Keyframe|Ctrl PageUp", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTKEYFRAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Jump To Prev Keyframe|Ctrl PageDown", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVKEYFRAME, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Play Back Animation|Alt A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_PLAY3D, "");
- //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- // "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
- // menuwidth, 19, NULL, 0.0, 0.0, 1,
- // ACTMENU_VIEW_PLAYALL, "");
+ uiItemS(layout);
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Set Preview Range|Ctrl P", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_PREVRANGESET, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Clear Preview Range|Alt P", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_PREVRANGECLEAR, "");
-
- if ((saction->mode == SACTCONT_ACTION) && (saction->action)) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Preview Range from Action Length|Ctrl Alt P", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_PREVRANGEAUTO, "");
- }
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiItemMenuF(layout, "Keyframe Type", 0, act_edit_keytypesmenu, NULL);
+ uiItemMenuF(layout, "Handle Type", 0, act_edit_handlesmenu, NULL);
+ uiItemMenuF(layout, "Interpolation Mode", 0, act_edit_ipomenu, NULL);
+ uiItemMenuF(layout, "Extrapolation Mode", 0, act_edit_expomenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "View All|Home", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1,
- ACTMENU_VIEW_ALL, "");
+ uiItemS(layout);
-/* if (!curarea->full)
- uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1,
- "Maximize Window|Ctrl UpArrow", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_VIEW_MAXIMIZE, "");
- else
- uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1,
- "Tile Window|Ctrl DownArrow", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_VIEW_MAXIMIZE, "");
-*/
+ uiItemO(layout, NULL, 0, "ACT_OT_clean");
+ uiItemO(layout, NULL, 0, "ACT_OT_sample");
- if (curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemS(layout);
- return block;
+ uiItemO(layout, NULL, 0, "ACT_OT_copy");
+ uiItemO(layout, NULL, 0, "ACT_OT_paste");
}
/* ************************ header area region *********************** */
static void do_action_buttons(bContext *C, void *arg, int event)
{
- switch(event) {
- case B_REDR:
- ED_area_tag_redraw(CTX_wm_area(C));
- break;
-
- case B_ACTCOPYKEYS:
- WM_operator_name_call(C, "ACT_OT_keyframes_copy", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case B_ACTPASTEKEYS:
- WM_operator_name_call(C, "ACT_OT_keyframes_paste", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- }
-}
-
-static void saction_idpoin_handle(bContext *C, ID *id, int event)
-{
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
- Object *obact= CTX_data_active_object(C);
-
- printf("actedit do id: \n");
-
switch (event) {
- case UI_ID_BROWSE:
- printf("browse \n");
- case UI_ID_DELETE:
- printf("browse or delete \n");
- saction->action= (bAction*)id;
-
- /* we must set this action to be the one used by active object (if not pinned) */
- if (saction->pin == 0) {
- AnimData *adt= BKE_id_add_animdata(&obact->id); /* this only adds if non-existant */
-
- /* set action */
- printf("\tset action \n");
- adt->action= saction->action;
- }
-
+ case B_REDR:
ED_area_tag_redraw(CTX_wm_area(C));
- ED_undo_push(C, "Assign Action");
- break;
- case UI_ID_RENAME:
- printf("actedit rename \n");
- break;
- case UI_ID_ADD_NEW:
- printf("actedit addnew \n");
- /* XXX not implemented */
- break;
- case UI_ID_OPEN:
- printf("actedit open \n");
- /* XXX not implemented */
- break;
- case UI_ID_ALONE:
- printf("actedit alone \n");
- /* XXX not implemented */
- break;
- case UI_ID_PIN:
- printf("actedit pin \n");
break;
}
}
@@ -1604,7 +264,7 @@ static void saction_idpoin_handle(bContext *C, ID *id, int event)
void action_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C);
+ SpaceAction *saction= CTX_wm_space_action(C);
bAnimContext ac;
uiBlock *block;
int xco, yco= 3, xmax;
@@ -1622,45 +282,38 @@ void action_header_buttons(const bContext *C, ARegion *ar)
if ((sa->flag & HEADER_NO_PULLDOWN)==0) {
xmax= GetButStringLength("View");
- uiDefPulldownBut(block, action_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, act_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
xco+= xmax;
xmax= GetButStringLength("Select");
- uiDefPulldownBut(block, action_selectmenu, CTX_wm_area(C),
- "Select", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, act_selectmenu, NULL, "Select", xco, yco, xmax-3, 20, "");
xco+= xmax;
if ( (saction->mode == SACTCONT_DOPESHEET) ||
((saction->action) && (saction->mode==SACTCONT_ACTION)) )
{
xmax= GetButStringLength("Channel");
- uiDefPulldownBut(block, action_channelmenu, CTX_wm_area(C),
- "Channel", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, act_channelmenu, NULL, "Channel", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
else if (saction->mode==SACTCONT_GPENCIL) {
xmax= GetButStringLength("Channel");
- uiDefPulldownBut(block, action_gplayermenu, CTX_wm_area(C),
- "Channel", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, act_gplayermenu, NULL, "Channel", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
- xmax= GetButStringLength("Marker");
- uiDefPulldownBut(block, action_markermenu, CTX_wm_area(C),
- "Marker", xco, yco-2, xmax-3, 24, "");
- xco+= xmax;
+ //xmax= GetButStringLength("Marker");
+ //uiDefMenuBut(block, act_markermenu, NULL, "Marker", xco, yco, xmax-3, 20, "");
+ //xco+= xmax;
if (saction->mode == SACTCONT_GPENCIL) {
- xmax= GetButStringLength("Frame");
- uiDefPulldownBut(block, action_framemenu, CTX_wm_area(C),
- "Frame", xco, yco-2, xmax-3, 24, "");
- xco+= xmax;
+ //xmax= GetButStringLength("Frame");
+ //uiDefMenuBut(block, act_selectmenu, NULL, "Frame", xco, yco, xmax-3, 20, "");
+ //xco+= xmax;
}
else {
xmax= GetButStringLength("Key");
- uiDefPulldownBut(block, action_keymenu, CTX_wm_area(C),
- "Key", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, act_editmenu, NULL, "Key", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
}
@@ -1696,51 +349,51 @@ void action_header_buttons(const bContext *C, ARegion *ar)
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Lamps");
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Cameras");
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Curves");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display MetaBalls");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOARM, B_REDR, ICON_ARMATURE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Armature/Bone");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Particles");
uiBlockEndAlign(block);
xco += 30;
}
- else if (saction->mode == SACTCONT_ACTION) { // not too appropriate for shapekeys atm...
- /* NAME ETC */
- //uiClearButLock();
+ else if (saction->mode == SACTCONT_ACTION) {
+ uiLayout *layout;
+ bScreen *sc= CTX_wm_screen(C);
+ PointerRNA ptr;
+
+ RNA_pointer_create(&sc->id, &RNA_SpaceDopeSheetEditor, saction, &ptr);
- /* NAME ETC */
- xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)saction->action, ID_AC, &saction->pin, xco, yco,
- saction_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE|UI_ID_FAKE_USER|UI_ID_ALONE|UI_ID_PIN);
+ layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, 20+3, 20, 1, U.uistyles.first);
+ uiTemplateID(layout, (bContext*)C, &ptr, "action", "ACT_OT_new", NULL, NULL);
+ uiBlockLayoutResolve(block, &xco, NULL);
xco += 8;
}
- /* COPY PASTE */
- uiBlockBeginAlign(block);
- uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYDOWN, xco,yco,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
- uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEDOWN, xco+=XIC,yco,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
- uiBlockEndAlign(block);
- xco += (XIC + 8);
-
/* draw AUTOSNAP */
if (saction->mode != SACTCONT_GPENCIL) {
if (saction->flag & SACTION_DRAWTIME) {
uiDefButC(block, MENU, B_REDR,
"Auto-Snap Keyframes %t|No Snap %x0|Second Step %x1|Nearest Second %x2|Nearest Marker %x3",
- xco,yco,70,YIC, &(saction->autosnap), 0, 1, 0, 0,
+ xco,yco,90,YIC, &(saction->autosnap), 0, 1, 0, 0,
"Auto-snapping mode for keyframes when transforming");
}
else {
uiDefButC(block, MENU, B_REDR,
"Auto-Snap Keyframes %t|No Snap %x0|Frame Step %x1|Nearest Frame %x2|Nearest Marker %x3",
- xco,yco,70,YIC, &(saction->autosnap), 0, 1, 0, 0,
+ xco,yco,90,YIC, &(saction->autosnap), 0, 1, 0, 0,
"Auto-snapping mode for keyframes when transforming");
}
- xco += (70 + 8);
+ xco += (90 + 8);
}
- /* draw LOCK */
- // XXX this feature is probably not relevant anymore!
- //uiDefIconButS(block, ICONTOG, B_LOCK, ICON_UNLOCKED, xco, yco, XIC, YIC,
- // &(saction->lock), 0, 0, 0, 0,
- // "Updates other affected window spaces automatically "
- // "to reflect changes in real time");
+ /* COPY PASTE */
+ uiBlockBeginAlign(block);
+ uiDefIconButO(block, BUT, "ACT_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco,yco,XIC,YIC, "Copies the selected keyframes to the buffer.");
+ xco += XIC;
+ uiDefIconButO(block, BUT, "ACT_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco,yco,XIC,YIC, "Pastes the keyframes from the buffer into the selected channels.");
+ uiBlockEndAlign(block);
+ xco += (XIC + 8);
}
/* always as last */
diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h
index b4d2528b3b4..4326bed62d3 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 bAnimContext *ac, struct SpaceAction *saction, struct ARegion *ar);
+void draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceAction *saction, 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);
@@ -53,10 +53,10 @@ void action_header_buttons(const struct bContext *C, struct ARegion *ar);
/* ***************************************** */
/* action_select.c */
-void ACT_OT_keyframes_select_all_toggle(struct wmOperatorType *ot);
-void ACT_OT_keyframes_select_border(struct wmOperatorType *ot);
-void ACT_OT_keyframes_select_column(struct wmOperatorType *ot);
-void ACT_OT_keyframes_clickselect(struct wmOperatorType *ot);
+void ACT_OT_select_all_toggle(struct wmOperatorType *ot);
+void ACT_OT_select_border(struct wmOperatorType *ot);
+void ACT_OT_select_column(struct wmOperatorType *ot);
+void ACT_OT_clickselect(struct wmOperatorType *ot);
/* defines for left-right select tool */
enum {
@@ -80,22 +80,26 @@ enum {
void ACT_OT_previewrange_set(struct wmOperatorType *ot);
void ACT_OT_view_all(struct wmOperatorType *ot);
-void ACT_OT_keyframes_copy(struct wmOperatorType *ot);
-void ACT_OT_keyframes_paste(struct wmOperatorType *ot);
+void ACT_OT_copy(struct wmOperatorType *ot);
+void ACT_OT_paste(struct wmOperatorType *ot);
-void ACT_OT_keyframes_insert(struct wmOperatorType *ot);
-void ACT_OT_keyframes_duplicate(struct wmOperatorType *ot);
-void ACT_OT_keyframes_delete(struct wmOperatorType *ot);
-void ACT_OT_keyframes_clean(struct wmOperatorType *ot);
-void ACT_OT_keyframes_sample(struct wmOperatorType *ot);
+void ACT_OT_insert_keyframe(struct wmOperatorType *ot);
+void ACT_OT_duplicate(struct wmOperatorType *ot);
+void ACT_OT_delete(struct wmOperatorType *ot);
+void ACT_OT_clean(struct wmOperatorType *ot);
+void ACT_OT_sample(struct wmOperatorType *ot);
-void ACT_OT_keyframes_handle_type_set(struct wmOperatorType *ot);
-void ACT_OT_keyframes_interpolation_type(struct wmOperatorType *ot);
-void ACT_OT_keyframes_extrapolation_type_set(struct wmOperatorType *ot);
+void ACT_OT_keyframe_type(struct wmOperatorType *ot);
+void ACT_OT_handle_type(struct wmOperatorType *ot);
+void ACT_OT_interpolation_type(struct wmOperatorType *ot);
+void ACT_OT_extrapolation_type(struct wmOperatorType *ot);
-void ACT_OT_keyframes_cfrasnap(struct wmOperatorType *ot);
-void ACT_OT_keyframes_snap(struct wmOperatorType *ot);
-void ACT_OT_keyframes_mirror(struct wmOperatorType *ot);
+void ACT_OT_frame_jump(struct wmOperatorType *ot);
+
+void ACT_OT_snap(struct wmOperatorType *ot);
+void ACT_OT_mirror(struct wmOperatorType *ot);
+
+void ACT_OT_new(struct wmOperatorType *ot);
/* defines for snap keyframes
* NOTE: keep in sync with eEditKeyframes_Snap (in ED_keyframes_edit.h)
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index 49a0befdbe2..00b22232608 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -46,7 +47,7 @@
#include "UI_interface.h"
#include "UI_view2d.h"
-#include "BIF_transform.h"
+#include "ED_transform.h"
#include "action_intern.h"
@@ -56,32 +57,33 @@
#include "WM_api.h"
#include "WM_types.h"
-
/* ************************** registration - operator types **********************************/
void action_operatortypes(void)
{
/* keyframes */
/* selection */
- WM_operatortype_append(ACT_OT_keyframes_clickselect);
- WM_operatortype_append(ACT_OT_keyframes_select_all_toggle);
- WM_operatortype_append(ACT_OT_keyframes_select_border);
- WM_operatortype_append(ACT_OT_keyframes_select_column);
+ WM_operatortype_append(ACT_OT_clickselect);
+ WM_operatortype_append(ACT_OT_select_all_toggle);
+ WM_operatortype_append(ACT_OT_select_border);
+ WM_operatortype_append(ACT_OT_select_column);
/* editing */
- WM_operatortype_append(ACT_OT_keyframes_snap);
- WM_operatortype_append(ACT_OT_keyframes_mirror);
- WM_operatortype_append(ACT_OT_keyframes_cfrasnap);
- WM_operatortype_append(ACT_OT_keyframes_handle_type_set);
- WM_operatortype_append(ACT_OT_keyframes_interpolation_type);
- WM_operatortype_append(ACT_OT_keyframes_extrapolation_type_set);
- WM_operatortype_append(ACT_OT_keyframes_sample);
- WM_operatortype_append(ACT_OT_keyframes_clean);
- WM_operatortype_append(ACT_OT_keyframes_delete);
- WM_operatortype_append(ACT_OT_keyframes_duplicate);
- WM_operatortype_append(ACT_OT_keyframes_insert);
- WM_operatortype_append(ACT_OT_keyframes_copy);
- WM_operatortype_append(ACT_OT_keyframes_paste);
+ WM_operatortype_append(ACT_OT_snap);
+ WM_operatortype_append(ACT_OT_mirror);
+ WM_operatortype_append(ACT_OT_frame_jump);
+ WM_operatortype_append(ACT_OT_handle_type);
+ WM_operatortype_append(ACT_OT_interpolation_type);
+ WM_operatortype_append(ACT_OT_extrapolation_type);
+ WM_operatortype_append(ACT_OT_keyframe_type);
+ WM_operatortype_append(ACT_OT_sample);
+ WM_operatortype_append(ACT_OT_clean);
+ WM_operatortype_append(ACT_OT_delete);
+ WM_operatortype_append(ACT_OT_duplicate);
+ WM_operatortype_append(ACT_OT_insert_keyframe);
+ WM_operatortype_append(ACT_OT_copy);
+ WM_operatortype_append(ACT_OT_paste);
+ WM_operatortype_append(ACT_OT_new);
WM_operatortype_append(ACT_OT_previewrange_set);
WM_operatortype_append(ACT_OT_view_all);
@@ -89,63 +91,65 @@ void action_operatortypes(void)
/* ************************** registration - keymaps **********************************/
-static void action_keymap_keyframes (wmWindowManager *wm, ListBase *keymap)
+static void action_keymap_keyframes (wmWindowManager *wm, wmKeyMap *keymap)
{
wmKeymapItem *kmi;
/* action_select.c - selection tools */
/* click-select */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
- kmi= WM_keymap_add_item(keymap, "ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "ACT_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
+ kmi= WM_keymap_add_item(keymap, "ACT_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
- kmi= WM_keymap_add_item(keymap, "ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
+ kmi= WM_keymap_add_item(keymap, "ACT_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "ACT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "ACT_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "left_right", ACTKEYS_LRSEL_TEST);
/* deselect all */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
+ WM_keymap_add_item(keymap, "ACT_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "ACT_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
/* borderselect */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1);
+ WM_keymap_add_item(keymap, "ACT_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "ACT_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1);
/* column select */
- RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_KEYS);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_CFRA);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_COLUMN);
- RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_keyframes_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_BETWEEN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_KEYS);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_CFRA);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_COLUMN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ACT_OT_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", ACTKEYS_COLUMNSEL_MARKERS_BETWEEN);
/* action_edit.c */
/* snap - current frame to selected keys */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_cfrasnap", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ // TODO: maybe since this is called jump, we're better to have it on <something>-J?
+ WM_keymap_add_item(keymap, "ACT_OT_frame_jump", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
/* menu + single-step transform */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
/* menu + set setting */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_handle_type_set", HKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_extrapolation_type_set", EKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_handle_type", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_keyframe_type", RKEY, KM_PRESS, 0, 0);
/* destructive */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_clean", OKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_sample", OKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_clean", OKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_sample", OKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_insert", IKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_insert_keyframe", IKEY, KM_PRESS, 0, 0);
/* copy/paste */
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "ACT_OT_keyframes_paste", VKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "ACT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
/* auto-set range */
WM_keymap_add_item(keymap, "ACT_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
@@ -153,13 +157,16 @@ static void action_keymap_keyframes (wmWindowManager *wm, ListBase *keymap)
/* transform system */
transform_keymap_for_space(wm, keymap, SPACE_ACTION);
+
+ /* test */
+ /* WM_keymap_add_item(keymap, "ACT_OT_test", QKEY, KM_PRESS, 0, 0); */
}
/* --------------- */
void action_keymap(wmWindowManager *wm)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
/* channels */
/* Channels are not directly handled by the Action Editor module, but are inherited from the Animation module.
@@ -168,7 +175,7 @@ void action_keymap(wmWindowManager *wm)
*/
/* keyframes */
- keymap= WM_keymap_listbase(wm, "Action_Keys", SPACE_ACTION, 0);
+ keymap= WM_keymap_find(wm, "Action_Keys", SPACE_ACTION, 0);
action_keymap_keyframes(wm, keymap);
}
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 06f35f5cf05..e358f559b14 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_dlrbTree.h"
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
@@ -64,6 +65,7 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_utildefines.h"
@@ -173,21 +175,22 @@ static int actkeys_deselectall_exec(bContext *C, wmOperator *op)
else
deselect_action_keys(&ac, 1, SELECT_ADD);
- /* set notifier that things have changed */
- ED_area_tag_redraw(CTX_wm_area(C)); // FIXME... should be updating 'keyframes' data context or so instead!
+ /* set notifier that keyframe selection have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_select_all_toggle (wmOperatorType *ot)
+void ACT_OT_select_all_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select All";
- ot->idname= "ACT_OT_keyframes_select_all_toggle";
+ ot->idname= "ACT_OT_select_all_toggle";
+ ot->description= "Toggle selection of all keyframes.";
/* api callbacks */
ot->exec= actkeys_deselectall_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -222,7 +225,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short
BeztEditFunc ok_cb, select_cb;
View2D *v2d= &ac->ar->v2d;
rctf rectf;
- float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT);
+ float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT_HALF);
/* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */
UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin+2, &rectf.xmin, &rectf.ymin);
@@ -245,7 +248,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short
/* loop over data, doing border select */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* get new vertical minimum extent of channel */
ymin= ymax - ACHANNEL_STEP;
@@ -253,9 +256,9 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short
/* set horizontal range (if applicable) */
if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS)) {
/* if channel is mapped in NLA, apply correction */
- if (nob) {
- bed.f1= get_action_frame(nob, rectf.xmin);
- bed.f2= get_action_frame(nob, rectf.xmax);
+ if (adt) {
+ bed.f1= BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP);
+ bed.f2= BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP);
}
else {
bed.f1= rectf.xmin;
@@ -335,21 +338,25 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op)
/* apply borderselect action */
borderselect_action(&ac, rect, mode, selectmode);
+ /* set notifier that keyframe selection have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
+
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_select_border(wmOperatorType *ot)
+void ACT_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
- ot->idname= "ACT_OT_keyframes_select_border";
+ ot->idname= "ACT_OT_select_border";
+ ot->description= "Select all keyframes within the specified region.";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= actkeys_borderselect_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -413,12 +420,12 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* select keys in-between */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else {
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
@@ -495,15 +502,15 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* loop over cfraelems (stored in the BeztEditData->list)
* - we need to do this here, as we can apply fewer NLA-mapping conversions
*/
for (ce= bed.list.first; ce; ce= ce->next) {
/* set frame for validation callback to refer to */
- if (nob)
- bed.f1= get_action_frame(nob, ce->cfra);
+ if (adt)
+ bed.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP);
else
bed.f1= ce->cfra;
@@ -549,21 +556,22 @@ static int actkeys_columnselect_exec(bContext *C, wmOperator *op)
else
columnselect_action_keys(&ac, mode);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_SELECT);
+ /* set notifier that keyframe selection have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
return OPERATOR_FINISHED;
}
-void ACT_OT_keyframes_select_column (wmOperatorType *ot)
+void ACT_OT_select_column (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select All";
- ot->idname= "ACT_OT_keyframes_select_column";
+ ot->idname= "ACT_OT_select_column";
+ ot->description= "Select all keyframes on the specified frame(s).";
/* api callbacks */
ot->exec= actkeys_columnselect_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -641,7 +649,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
memset(&bed, 0, sizeof(BeztEditFunc));
if (leftright == ACTKEYS_LRSEL_LEFT) {
- bed.f1 = -MAXFRAMEF;
+ bed.f1 = MINAFRAMEF;
bed.f2 = (float)(CFRA + FRAME_CLICK_THRESH);
}
else {
@@ -658,12 +666,12 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
/* select keys on the side where most data occurs */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ 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);
@@ -702,11 +710,11 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* set frame for validation callback to refer to */
- if (nob)
- bed.f1= get_action_frame(nob, selx);
+ if (adt)
+ bed.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP);
else
bed.f1= selx;
@@ -737,17 +745,21 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode, short column)
{
ListBase anim_data = {NULL, NULL};
- ListBase anim_keys = {NULL, NULL};
+ DLRBT_Tree anim_keys;
bAnimListElem *ale;
int filter;
View2D *v2d= &ac->ar->v2d;
+ bDopeSheet *ads = NULL;
int channel_index;
short found = 0;
float selx = 0.0f;
float x, y;
rctf rectf;
+ /* get dopesheet info */
+ if (ac->datatype == ANIMCONT_DOPESHEET)
+ ads= ac->data;
/* use View2D to determine the index of the channel (i.e a row in the list) where keyframe was */
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
@@ -766,51 +778,43 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
if (ale == NULL) {
/* channel not found */
printf("Error: animation channel (index = %d) not found in mouse_action_keys() \n", channel_index);
+ BLI_freelistN(&anim_data);
return;
}
else {
/* found match - must return here... */
- Object *nob= ANIM_nla_mapping_get(ac, ale);
- ActKeysInc *aki= init_aki_data(ac, ale);
- ActKeyColumn *ak;
- float xmin, xmax;
-
- /* apply NLA-scaling correction? */
- if (nob) {
- xmin= get_action_frame(nob, rectf.xmin);
- xmax= get_action_frame(nob, rectf.xmax);
- }
- else {
- xmin= rectf.xmin;
- xmax= rectf.xmax;
- }
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+ 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) {
switch (ale->datatype) {
case ALE_OB:
{
Object *ob= (Object *)ale->key_data;
- ob_to_keylist(ob, &anim_keys, NULL, aki);
+ ob_to_keylist(ads, ob, &anim_keys, NULL);
}
break;
case ALE_ACT:
{
bAction *act= (bAction *)ale->key_data;
- action_to_keylist(act, &anim_keys, NULL, aki);
+ action_to_keylist(adt, act, &anim_keys, NULL);
}
break;
case ALE_FCURVE:
{
FCurve *fcu= (FCurve *)ale->key_data;
- fcurve_to_keylist(fcu, &anim_keys, NULL, aki);
+ fcurve_to_keylist(adt, fcu, &anim_keys, NULL);
}
break;
}
}
else if (ale->type == ANIMTYPE_GROUP) {
bActionGroup *agrp= (bActionGroup *)ale->data;
- agroup_to_keylist(agrp, &anim_keys, NULL, aki);
+ agroup_to_keylist(adt, agrp, &anim_keys, NULL);
}
else if (ale->type == ANIMTYPE_GPDATABLOCK) {
/* cleanup */
@@ -820,24 +824,34 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
}
else if (ale->type == ANIMTYPE_GPLAYER) {
bGPDlayer *gpl= (bGPDlayer *)ale->data;
- gpl_to_keylist(gpl, &anim_keys, NULL, aki);
+ gpl_to_keylist(ads, gpl, &anim_keys, NULL);
}
- /* loop through keyframes, finding one that was clicked on */
- for (ak= anim_keys.first; ak; ak= ak->next) {
- if (IN_RANGE(ak->cfra, xmin, xmax)) {
- selx= ak->cfra;
+ // the call below is not strictly necessary, since we have adjacency info anyway
+ //BLI_dlrbTree_linkedlist_sync(&anim_keys);
+
+ /* loop through keyframes, finding one that was within the range 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
+ * requiring to map each frame once again...
+ */
+ selx= BKE_nla_tweakedit_remap(adt, ak->cfra, NLATIME_CONVERT_UNMAP);
found= 1;
break;
}
+ else if (ak->cfra < rectf.xmin)
+ akn= ak->right;
+ else
+ akn= ak->left;
}
/* remove active channel from list of channels for separate treatment (since it's needed later on) */
BLI_remlink(&anim_data, ale);
/* cleanup temporary lists */
- BLI_freelistN(&anim_keys);
- anim_keys.first = anim_keys.last = NULL;
+ BLI_dlrbTree_free(&anim_keys);
/* free list of channels, since it's not used anymore */
BLI_freelistN(&anim_data);
@@ -857,17 +871,19 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
/* Highlight Action-Group or F-Curve? */
- if (ale->type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= ale->data;
-
- agrp->flag |= AGRP_SELECTED;
- ANIM_set_active_channel(ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP);
- }
- else if (ale->type == ANIMTYPE_FCURVE) {
- FCurve *fcu= ale->data;
-
- fcu->flag |= FCURVE_SELECTED;
- ANIM_set_active_channel(ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+ if (ale && ale->data) {
+ if (ale->type == ANIMTYPE_GROUP) {
+ bActionGroup *agrp= ale->data;
+
+ agrp->flag |= AGRP_SELECTED;
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP);
+ }
+ else if (ale->type == ANIMTYPE_FCURVE) {
+ FCurve *fcu= ale->data;
+
+ fcu->flag |= FCURVE_SELECTED;
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+ }
}
}
else if (ac->datatype == ANIMCONT_GPENCIL) {
@@ -881,18 +897,20 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
/* only select keyframes if we clicked on a valid channel and hit something */
if (ale) {
- /* apply selection to keyframes */
- if (/*gpl*/0) {
- /* grease pencil */
- //select_gpencil_frame(gpl, (int)selx, selectmode);
- }
- else 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);
- }
- else {
- /* select the nominated keyframe on the given frame */
- actkeys_mselect_single(ac, ale, select_mode, selx);
+ if (found) {
+ /* apply selection to keyframes */
+ if (/*gpl*/0) {
+ /* grease pencil */
+ //select_gpencil_frame(gpl, (int)selx, selectmode);
+ }
+ else 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);
+ }
+ else {
+ /* select the nominated keyframe on the given frame */
+ actkeys_mselect_single(ac, ale, select_mode, selx);
+ }
}
/* free this channel */
@@ -950,22 +968,23 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even
mouse_action_keys(&ac, mval, selectmode, column);
}
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_BOTH);
+ /* set notifier that keyframe selection (and channels too) have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT|ND_ANIMCHAN_SELECT, NULL);
/* for tweak grab to work */
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
-void ACT_OT_keyframes_clickselect (wmOperatorType *ot)
+void ACT_OT_clickselect (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mouse Select Keys";
- ot->idname= "ACT_OT_keyframes_clickselect";
+ ot->idname= "ACT_OT_clickselect";
+ ot->description= "Select keyframes by clicking on them.";
/* api callbacks - absolutely no exec() this yet... */
ot->invoke= actkeys_clickselect_invoke;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_action_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index b4e43c29c3d..3b275cab814 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -153,19 +153,19 @@ static SpaceLink *action_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void action_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Action_Keys", SPACE_ACTION, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Action_Keys", SPACE_ACTION, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void action_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
+ SpaceAction *saction= CTX_wm_space_action(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DGrid *grid;
@@ -216,19 +216,19 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
static void action_channel_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Animation_Channels", 0, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Animation_Channels", 0, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void action_channel_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C);
+ SpaceAction *saction= CTX_wm_space_action(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -243,7 +243,7 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar)
/* data */
if (ANIM_animdata_get_context(C, &ac)) {
- draw_channel_names(&ac, saction, ar);
+ draw_channel_names((bContext *)C, &ac, saction, ar);
}
/* reset view matrix */
@@ -288,9 +288,13 @@ static void action_channel_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
case NC_SCENE:
switch(wmn->data) {
case ND_OB_ACTIVE:
+ case ND_FRAME:
ED_region_tag_redraw(ar);
break;
}
@@ -314,8 +318,12 @@ static void action_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
case NC_SCENE:
switch(wmn->data) {
+ case ND_RENDER_OPTIONS:
case ND_OB_ACTIVE:
case ND_FRAME:
case ND_MARKERS:
@@ -344,6 +352,9 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn)
{
/* context changes */
switch (wmn->category) {
+ case NC_ANIMATION:
+ ED_area_tag_refresh(sa);
+ break;
case NC_SCENE:
/*switch (wmn->data) {
case ND_OB_ACTIVE:
@@ -362,6 +373,10 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn)
}*/
ED_area_tag_refresh(sa);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_DOPESHEET)
+ ED_area_tag_redraw(sa);
+ break;
}
}
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 510103895f4..18bc7ec9555 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -42,15 +42,18 @@
#include "ED_anim_api.h"
#include "ED_armature.h"
#include "ED_curve.h"
-#include "ED_mesh.h"
+#include "ED_gpencil.h"
#include "ED_markers.h"
+#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_particle.h"
-#include "ED_sculpt.h"
+#include "ED_physics.h"
#include "ED_screen.h"
+#include "ED_sculpt.h"
#include "ED_space_api.h"
+#include "ED_sound.h"
#include "ED_uvedit.h"
-#include "ED_pointcache.h"
+#include "ED_mball.h"
/* only call once on startup, storage is global in BKE kernel listbase */
void ED_spacetypes_init(void)
@@ -75,12 +78,15 @@ void ED_spacetypes_init(void)
ED_spacetype_text();
ED_spacetype_sequencer();
ED_spacetype_logic();
+ ED_spacetype_console();
+ ED_spacetype_userpref();
// ...
/* register operator types for screen and all spaces */
ED_operatortypes_screen();
ED_operatortypes_anim();
- ED_operatortypes_animchannels(); // XXX have this as part of anim() ones instead?
+ ED_operatortypes_animchannels();
+ ED_operatortypes_gpencil();
ED_operatortypes_object();
ED_operatortypes_mesh();
ED_operatortypes_sculpt();
@@ -89,8 +95,12 @@ void ED_spacetypes_init(void)
ED_operatortypes_particle();
ED_operatortypes_curve();
ED_operatortypes_armature();
- ED_marker_operatortypes();
+ ED_operatortypes_marker();
ED_operatortypes_pointcache();
+ ED_operatortypes_fluid();
+ ED_operatortypes_metaball();
+ ED_operatortypes_boids();
+ ED_operatortypes_sound();
ui_view2d_operatortypes();
@@ -111,12 +121,15 @@ void ED_spacetypes_keymap(wmWindowManager *wm)
ED_keymap_screen(wm);
ED_keymap_anim(wm);
ED_keymap_animchannels(wm);
+ ED_keymap_gpencil(wm);
ED_keymap_object(wm);
ED_keymap_mesh(wm);
ED_keymap_uvedit(wm);
ED_keymap_curve(wm);
ED_keymap_armature(wm);
ED_keymap_particle(wm);
+ ED_keymap_metaball(wm);
+ ED_keymap_paint(wm);
ED_marker_keymap(wm);
UI_view2d_keymap(wm);
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 01794d1bba8..9333ba9209c 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -31,6 +31,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_armature_types.h"
+#include "DNA_brush_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_modifier_types.h"
@@ -45,8 +46,10 @@
#include "BLI_listbase.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_material.h"
#include "BKE_modifier.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -65,7 +68,7 @@
typedef struct ButsContextPath {
PointerRNA ptr[8];
int len;
- int worldtex;
+ int flag;
} ButsContextPath;
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
@@ -197,7 +200,7 @@ static int buttons_context_path_modifier(ButsContextPath *path)
if(buttons_context_path_object(path)) {
ob= path->ptr[path->len-1].data;
- if(ob && ELEM4(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF))
+ if(ob && ELEM5(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF, OB_LATTICE))
return 1;
}
@@ -302,10 +305,42 @@ static int buttons_context_path_particle(ButsContextPath *path)
return 0;
}
-static int buttons_context_path_texture(ButsContextPath *path)
+static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
+{
+ Scene *scene;
+ ToolSettings *ts;
+ Brush *br= NULL;
+ PointerRNA *ptr= &path->ptr[path->len-1];
+
+ /* if we already have a (pinned) brush, we're done */
+ if(RNA_struct_is_a(ptr->type, &RNA_Brush)) {
+ return 1;
+ }
+ /* if we have a scene, use the toolsettings brushes */
+ else if(buttons_context_path_scene(path)) {
+ scene= path->ptr[path->len-1].data;
+ ts= scene->toolsettings;
+
+ if(scene)
+ br= paint_brush(paint_get_active(scene));
+
+ if(br) {
+ RNA_id_pointer_create(&br->id, &path->ptr[path->len]);
+ path->len++;
+
+ return 1;
+ }
+ }
+
+ /* no path to a brush possible */
+ return 0;
+}
+
+static int buttons_context_path_texture(const bContext *C, ButsContextPath *path)
{
Material *ma;
Lamp *la;
+ Brush *br;
World *wo;
MTex *mtex;
Tex *tex;
@@ -315,8 +350,21 @@ static int buttons_context_path_texture(ButsContextPath *path)
if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
return 1;
}
+ /* try brush */
+ else if((path->flag & SB_BRUSH_TEX) && buttons_context_path_brush(C, path)) {
+ br= path->ptr[path->len-1].data;
+
+ if(br) {
+ mtex= br->mtex[(int)br->texact];
+ tex= (mtex)? mtex->tex: NULL;
+
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ }
/* try world */
- else if(path->worldtex && buttons_context_path_world(path)) {
+ else if((path->flag & SB_WORLD_TEX) && buttons_context_path_world(path)) {
wo= path->ptr[path->len-1].data;
if(wo) {
@@ -354,20 +402,21 @@ static int buttons_context_path_texture(ButsContextPath *path)
return 1;
}
}
- /* TODO: material nodes, brush */
+ /* TODO: material nodes */
- /* no path to a particle system possible */
+ /* no path to a texture possible */
return 0;
}
-static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int worldtex)
+
+static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int flag)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
ID *id;
int found;
memset(path, 0, sizeof(*path));
- path->worldtex= worldtex;
+ path->flag= flag;
/* if some ID datablock is pinned, set the root pointer */
if(sbuts->pinid) {
@@ -411,10 +460,13 @@ 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(path);
+ found= buttons_context_path_texture(C, path);
break;
case BCONTEXT_BONE:
+ case BCONTEXT_BONE_CONSTRAINT:
found= buttons_context_path_bone(path);
+ if(!found)
+ found= buttons_context_path_data(path, OB_ARMATURE);
break;
default:
found= 0;
@@ -428,18 +480,18 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
{
ButsContextPath *path;
PointerRNA *ptr;
- int a, worldtex, flag= 0;
+ int a, pflag, flag= 0;
if(!sbuts->path)
sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
path= sbuts->path;
- worldtex= (sbuts->flag & SB_WORLD_TEX);
+ 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 */
for(a=0; a<BCONTEXT_TOT; a++) {
- if(buttons_context_path(C, path, a, worldtex)) {
+ if(buttons_context_path(C, path, a, pflag)) {
flag |= (1<<a);
/* setting icon for data context */
@@ -454,6 +506,11 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
}
}
+ /* always try to use the tab that was explicitly
+ * set to the user, so that once that context comes
+ * back, the tab is activated again */
+ sbuts->mainb= sbuts->mainbuser;
+
/* in case something becomes invalid, change */
if((flag & (1 << sbuts->mainb)) == 0) {
if(flag & BCONTEXT_OBJECT) {
@@ -469,7 +526,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
}
}
- buttons_context_path(C, path, sbuts->mainb, worldtex);
+ buttons_context_path(C, path, sbuts->mainb, pflag);
if(!(flag & (1 << sbuts->mainb))) {
if(flag & (1 << BCONTEXT_OBJECT))
@@ -485,7 +542,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
ButsContextPath *path= sbuts?sbuts->path:NULL;
if(!path)
@@ -494,10 +551,10 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
/* here we handle context, getting data from precomputed path */
if(CTX_data_dir(member)) {
static const char *dir[] = {
- "world", "object", "meshe", "armature", "lattice", "curve",
+ "world", "object", "mesh", "armature", "lattice", "curve",
"meta_ball", "lamp", "camera", "material", "material_slot",
"texture", "texture_slot", "bone", "edit_bone", "particle_system",
- "cloth", "soft_body", "fluid", NULL};
+ "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
CTX_data_dir_set(result, dir);
return 1;
@@ -615,7 +672,8 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
if(ptr && ptr->data) {
Object *ob= ptr->data;
- CTX_data_pointer_set(result, &ob->id, &RNA_SoftBodySettings, ob->soft);
+ ModifierData *md= modifiers_findByType(ob, eModifierType_Softbody);
+ CTX_data_pointer_set(result, &ob->id, &RNA_SoftBodyModifier, md);
return 1;
}
}
@@ -629,6 +687,31 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
return 1;
}
}
+
+ else if(CTX_data_equals(member, "smoke")) {
+ PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
+
+ if(ptr && ptr->data) {
+ Object *ob= ptr->data;
+ ModifierData *md= modifiers_findByType(ob, eModifierType_Smoke);
+ CTX_data_pointer_set(result, &ob->id, &RNA_SmokeModifier, md);
+ return 1;
+ }
+ }
+ else if(CTX_data_equals(member, "collision")) {
+ PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
+
+ if(ptr && ptr->data) {
+ Object *ob= ptr->data;
+ ModifierData *md= modifiers_findByType(ob, eModifierType_Collision);
+ CTX_data_pointer_set(result, &ob->id, &RNA_CollisionModifier, md);
+ return 1;
+ }
+ }
+ else if(CTX_data_equals(member, "brush")) {
+ set_pointer_type(path, result, &RNA_Brush);
+ return 1;
+ }
return 0;
}
@@ -637,7 +720,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
static void pin_cb(bContext *C, void *arg1, void *arg2)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
ButsContextPath *path= sbuts->path;
PointerRNA *ptr;
int a;
@@ -662,7 +745,7 @@ static void pin_cb(bContext *C, void *arg1, void *arg2)
void buttons_context_draw(const bContext *C, uiLayout *layout)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
ButsContextPath *path= sbuts->path;
uiLayout *row;
uiBlock *block;
@@ -674,29 +757,29 @@ void buttons_context_draw(const bContext *C, uiLayout *layout)
if(!path)
return;
- row= uiLayoutRow(layout, 0);
+ row= uiLayoutRow(layout, 1);
uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
block= uiLayoutGetBlock(row);
uiBlockSetEmboss(block, UI_EMBOSSN);
- but= uiDefIconButBitC(block, ICONTOG, SB_PIN_CONTEXT, 0, (sbuts->flag & SB_PIN_CONTEXT)? ICON_PINNED: ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag, 0, 0, 0, 0, "Follow context or keep fixed datablock displayed.");
+ but= uiDefIconButBitC(block, ICONTOG, SB_PIN_CONTEXT, 0, ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag, 0, 0, 0, 0, "Follow context or keep fixed datablock displayed.");
uiButSetFunc(but, pin_cb, NULL, NULL);
for(a=0; a<path->len; a++) {
ptr= &path->ptr[a];
+ if(a != 0)
+ uiDefIconBut(block, LABEL, 0, VICON_SMALL_TRI_RIGHT, 0, 0, 10, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
+
if(ptr->data) {
icon= RNA_struct_ui_icon(ptr->type);
name= RNA_struct_name_get_alloc(ptr, namebuf, sizeof(namebuf));
-#if 0
- if(sbuts->mainb != BCONTEXT_SCENE && ptr->type == &RNA_Scene) {
- uiItemL(row, "", icon); /* save some space */
- }
- else
-#endif
if(name) {
- uiItemL(row, name, icon);
+ if(sbuts->mainb != BCONTEXT_SCENE && ptr->type == &RNA_Scene)
+ uiItemL(row, "", icon); /* save some space */
+ else
+ uiItemL(row, name, icon);
if(name != namebuf)
MEM_freeN(name);
@@ -720,6 +803,6 @@ void buttons_context_register(ARegionType *art)
strcpy(pt->idname, "BUTTONS_PT_context");
strcpy(pt->label, "Context");
pt->draw= buttons_panel_context;
+ pt->flag= PNL_NO_HEADER;
BLI_addtail(&art->paneltypes, pt);
}
-
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index 79284ada483..83dd679c543 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -60,66 +60,17 @@
#include "buttons_intern.h"
-/* ************************ header area region *********************** */
-
-static void do_viewmenu(bContext *C, void *arg, int event)
-{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
- ScrArea *sa= CTX_wm_area(C);
-
- switch(event) {
- case 1:
- case 2:
- sbuts->align= event;
- sbuts->re_align= 1;
- break;
- }
-
- ED_area_tag_redraw(sa);
-}
-
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
- ScrArea *sa= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
-
- if (sbuts->align == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- if (sbuts->align == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Vertical", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Vertical", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- if(sa->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
#define B_CONTEXT_SWITCH 101
#define B_BUTSPREVIEW 102
-#define B_NEWFRAME 103
static void do_buttons_buttons(bContext *C, void *arg, int event)
{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
+
+ if(!sbuts) /* window type switch */
+ return;
switch(event) {
- case B_NEWFRAME:
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, NULL);
- break;
case B_CONTEXT_SWITCH:
case B_BUTSPREVIEW:
ED_area_tag_redraw(CTX_wm_area(C));
@@ -133,12 +84,13 @@ static void do_buttons_buttons(bContext *C, void *arg, int event)
sbuts->preview= 1;
break;
}
+
+ sbuts->mainbuser= sbuts->mainb;
}
void buttons_header_buttons(const bContext *C, ARegion *ar)
{
- ScrArea *sa= CTX_wm_area(C);
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
uiBlock *block;
int xco, yco= 3;
@@ -147,17 +99,7 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
uiBlockSetHandleFunc(block, do_buttons_buttons, NULL);
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco, xmax-3, 20, "");
-
- xco+=xmax;
- }
+ xco= ED_area_header_switchbutton(C, block, yco);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -166,36 +108,33 @@ void buttons_header_buttons(const bContext *C, ARegion *ar)
// Default panels
uiBlockBeginAlign(block);
if(sbuts->pathflag & (1<<BCONTEXT_SCENE))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene");
if(sbuts->pathflag & (1<<BCONTEXT_WORLD))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World");
if(sbuts->pathflag & (1<<BCONTEXT_OBJECT))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object");
if(sbuts->pathflag & (1<<BCONTEXT_CONSTRAINT))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Constraint");
- if(sbuts->pathflag & (1<<BCONTEXT_MODIFIER))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Object Constraints");
if(sbuts->pathflag & (1<<BCONTEXT_DATA))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, sbuts->dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, sbuts->dataicon, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data");
+ if(sbuts->pathflag & (1<<BCONTEXT_MODIFIER))
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifiers");
if(sbuts->pathflag & (1<<BCONTEXT_BONE))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone");
+ if(sbuts->pathflag & (1<<BCONTEXT_BONE_CONSTRAINT))
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE_CONSTRAINT, 0, 0, "Bone Constraints");
if(sbuts->pathflag & (1<<BCONTEXT_MATERIAL))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MATERIAL, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material");
if(sbuts->pathflag & (1<<BCONTEXT_TEXTURE))
- uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture");
+ uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture");
if(sbuts->pathflag & (1<<BCONTEXT_PARTICLE))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles");
if(sbuts->pathflag & (1<<BCONTEXT_PHYSICS))
- uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics");
-
- xco+= XIC;
+ uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics");
+ xco+= BUTS_UI_UNIT;
uiBlockEndAlign(block);
- xco+=XIC;
- uiDefButI(block, NUM, B_NEWFRAME, "", (xco+20),yco,60,YIC, &(CTX_data_scene(C)->r.cfra), 1.0, MAXFRAMEF, 0, 0, "Displays Current Frame of animation. Click to change.");
- xco+= 80;
-
/* always as last */
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index b213e4288be..0a5a5714a06 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -49,6 +49,9 @@ struct wmOperatorType;
#define BUTS_SENS_STATE 512
#define BUTS_ACT_STATE 1024
+#define BUTS_HEADERY (HEADERY*1.2)
+#define BUTS_UI_UNIT (UI_UNIT_Y*1.2)
+
/* internal exports only */
/* buttons_header.c */
@@ -61,6 +64,9 @@ void buttons_context_draw(const struct bContext *C, struct uiLayout *layout);
void buttons_context_register(struct ARegionType *art);
/* buttons_ops.c */
+void OBJECT_OT_group_add(struct wmOperatorType *ot);
+void OBJECT_OT_group_remove(struct wmOperatorType *ot);
+
void OBJECT_OT_material_slot_add(struct wmOperatorType *ot);
void OBJECT_OT_material_slot_remove(struct wmOperatorType *ot);
void OBJECT_OT_material_slot_assign(struct wmOperatorType *ot);
@@ -71,5 +77,22 @@ void MATERIAL_OT_new(struct wmOperatorType *ot);
void TEXTURE_OT_new(struct wmOperatorType *ot);
void WORLD_OT_new(struct wmOperatorType *ot);
+void OBJECT_OT_particle_system_add(struct wmOperatorType *ot);
+void OBJECT_OT_particle_system_remove(struct wmOperatorType *ot);
+
+void PARTICLE_OT_new(struct wmOperatorType *ot);
+void PARTICLE_OT_new_target(struct wmOperatorType *ot);
+void PARTICLE_OT_remove_target(struct wmOperatorType *ot);
+void PARTICLE_OT_target_move_up(struct wmOperatorType *ot);
+void PARTICLE_OT_target_move_down(struct wmOperatorType *ot);
+void PARTICLE_OT_connect_hair(struct wmOperatorType *ot);
+void PARTICLE_OT_disconnect_hair(struct wmOperatorType *ot);
+
+void SCENE_OT_render_layer_add(struct wmOperatorType *ot);
+void SCENE_OT_render_layer_remove(struct wmOperatorType *ot);
+
+void BUTTONS_OT_file_browse(struct wmOperatorType *ot);
+void BUTTONS_OT_toolbox(struct wmOperatorType *ot);
+
#endif /* ED_BUTTONS_INTERN_H */
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index 6755a2be1b7..4387da19341 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -30,34 +30,62 @@
#include "MEM_guardedalloc.h"
+#include "DNA_boid_types.h"
#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_node_types.h"
#include "DNA_texture_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "DNA_world_types.h"
+#include "BKE_bvhutils.h"
+#include "BKE_cdderivedmesh.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_group.h"
#include "BKE_font.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_modifier.h"
+#include "BKE_node.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
+#include "BKE_scene.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BKE_world.h"
+#include "BLI_arithb.h"
#include "BLI_editVert.h"
+#include "BLI_listbase.h"
#include "RNA_access.h"
+#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_curve.h"
#include "ED_mesh.h"
+#include "ED_particle.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
#include "buttons_intern.h" // own include
+
/********************** material slot operators *********************/
static int material_slot_add_exec(bContext *C, wmOperator *op)
@@ -78,6 +106,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
/* identifiers */
ot->name= "Add Material Slot";
ot->idname= "OBJECT_OT_material_slot_add";
+ ot->description="Add a new material slot or duplicate the selected one.";
/* api callbacks */
ot->exec= material_slot_add_exec;
@@ -104,6 +133,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
/* identifiers */
ot->name= "Remove Material Slot";
ot->idname= "OBJECT_OT_material_slot_remove";
+ ot->description="Remove the selected material slot.";
/* api callbacks */
ot->exec= material_slot_remove_exec;
@@ -114,7 +144,6 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
static int material_slot_assign_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
if(!ob)
@@ -152,8 +181,8 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
}
@@ -163,6 +192,7 @@ void OBJECT_OT_material_slot_assign(wmOperatorType *ot)
/* identifiers */
ot->name= "Assign Material Slot";
ot->idname= "OBJECT_OT_material_slot_assign";
+ ot->description="Assign the material in the selected material slot to the selected vertices.";
/* api callbacks */
ot->exec= material_slot_assign_exec;
@@ -231,7 +261,7 @@ static int material_slot_de_select(bContext *C, int select)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, ob);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
return OPERATOR_FINISHED;
}
@@ -246,6 +276,7 @@ void OBJECT_OT_material_slot_select(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Material Slot";
ot->idname= "OBJECT_OT_material_slot_select";
+ ot->description="Select vertices assigned to the selected material slot.";
/* api callbacks */
ot->exec= material_slot_select_exec;
@@ -264,6 +295,7 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot)
/* identifiers */
ot->name= "Deselect Material Slot";
ot->idname= "OBJECT_OT_material_slot_deselect";
+ ot->description="Deselect vertices assigned to the selected material slot.";
/* api callbacks */
ot->exec= material_slot_deselect_exec;
@@ -311,6 +343,7 @@ void MATERIAL_OT_new(wmOperatorType *ot)
/* identifiers */
ot->name= "New Material";
ot->idname= "MATERIAL_OT_new";
+ ot->description="Add a new material.";
/* api callbacks */
ot->exec= new_material_exec;
@@ -363,6 +396,7 @@ void TEXTURE_OT_new(wmOperatorType *ot)
/* identifiers */
ot->name= "New Texture";
ot->idname= "TEXTURE_OT_new";
+ ot->description="Add a new texture.";
/* api callbacks */
ot->exec= new_texture_exec;
@@ -399,6 +433,7 @@ void WORLD_OT_new(wmOperatorType *ot)
/* identifiers */
ot->name= "New World";
ot->idname= "WORLD_OT_new";
+ ot->description= "Add a new world.";
/* api callbacks */
ot->exec= new_world_exec;
@@ -407,3 +442,698 @@ void WORLD_OT_new(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
+
+/********************** particle system slot operators *********************/
+
+static int particle_system_add_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Scene *scene = CTX_data_scene(C);
+
+ if(!scene || !ob)
+ return OPERATOR_CANCELLED;
+
+ object_add_particle_system(scene, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_particle_system_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Particle System Slot";
+ ot->idname= "OBJECT_OT_particle_system_add";
+ ot->description="Add a particle system.";
+
+ /* api callbacks */
+ ot->exec= particle_system_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int particle_system_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Scene *scene = CTX_data_scene(C);
+
+ if(!scene || !ob)
+ return OPERATOR_CANCELLED;
+
+ object_remove_particle_system(scene, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_particle_system_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Particle System Slot";
+ ot->idname= "OBJECT_OT_particle_system_remove";
+ ot->description="Remove the selected particle system.";
+
+ /* api callbacks */
+ ot->exec= particle_system_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** new particle settings operator *********************/
+
+static int psys_poll(bContext *C)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ return (ptr.data != NULL);
+}
+
+static int new_particle_settings_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ Main *bmain= CTX_data_main(C);
+ ParticleSystem *psys;
+ ParticleSettings *part = NULL;
+ Object *ob;
+ PointerRNA ptr;
+
+ ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+
+ psys = ptr.data;
+
+ /* add or copy particle setting */
+ if(psys->part)
+ part= psys_copy_settings(psys->part);
+ else
+ part= psys_new_settings("ParticleSettings", bmain);
+
+ ob= ptr.id.data;
+
+ if(psys->part)
+ psys->part->id.us--;
+
+ psys->part = part;
+
+ psys_check_boid_data(psys);
+
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_new(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New Particle Settings";
+ ot->idname= "PARTICLE_OT_new";
+ ot->description="Add new particle settings.";
+
+ /* api callbacks */
+ ot->exec= new_particle_settings_exec;
+ ot->poll= psys_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** keyed particle target operators *********************/
+
+static int new_particle_target_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+
+ ParticleTarget *pt;
+
+ if(!psys)
+ return OPERATOR_CANCELLED;
+
+ pt = psys->targets.first;
+ for(; pt; pt=pt->next)
+ pt->flag &= ~PTARGET_CURRENT;
+
+ pt = MEM_callocN(sizeof(ParticleTarget), "keyed particle target");
+
+ pt->flag |= PTARGET_CURRENT;
+ pt->psys = 1;
+
+ BLI_addtail(&psys->targets, pt);
+
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_new_target(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New Particle Target";
+ ot->idname= "PARTICLE_OT_new_target";
+ ot->description="Add a new particle target.";
+
+ /* api callbacks */
+ ot->exec= new_particle_target_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int remove_particle_target_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+
+ ParticleTarget *pt;
+
+ if(!psys)
+ return OPERATOR_CANCELLED;
+
+ pt = psys->targets.first;
+ for(; pt; pt=pt->next) {
+ if(pt->flag & PTARGET_CURRENT) {
+ BLI_remlink(&psys->targets, pt);
+ MEM_freeN(pt);
+ break;
+ }
+
+ }
+ pt = psys->targets.last;
+
+ if(pt)
+ pt->flag |= PTARGET_CURRENT;
+
+ DAG_scene_sort(scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_remove_target(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Particle Target";
+ ot->idname= "PARTICLE_OT_remove_target";
+ ot->description="Remove the selected particle target.";
+
+ /* api callbacks */
+ ot->exec= remove_particle_target_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move up particle target operator *********************/
+
+static int target_move_up_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ ParticleTarget *pt;
+
+ if(!psys)
+ return OPERATOR_CANCELLED;
+
+ pt = psys->targets.first;
+ for(; pt; pt=pt->next) {
+ if(pt->flag & PTARGET_CURRENT && pt->prev) {
+ BLI_remlink(&psys->targets, pt);
+ BLI_insertlink(&psys->targets, pt->prev->prev, pt);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_target_move_up(wmOperatorType *ot)
+{
+ ot->name= "Move Up Target";
+ ot->idname= "PARTICLE_OT_target_move_up";
+ ot->description= "Move particle target up in the list.";
+
+ ot->exec= target_move_up_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ move down particle target operator *********************/
+
+static int target_move_down_exec(bContext *C, wmOperator *op)
+{
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= ptr.data;
+ Object *ob = ptr.id.data;
+ ParticleTarget *pt;
+
+ if(!psys)
+ return OPERATOR_CANCELLED;
+ pt = psys->targets.first;
+ for(; pt; pt=pt->next) {
+ if(pt->flag & PTARGET_CURRENT && pt->next) {
+ BLI_remlink(&psys->targets, pt);
+ BLI_insertlink(&psys->targets, pt->next, pt);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ break;
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_target_move_down(wmOperatorType *ot)
+{
+ ot->name= "Move Down Target";
+ ot->idname= "PARTICLE_OT_target_move_down";
+ ot->description= "Move particle target down in the list.";
+
+ ot->exec= target_move_down_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/************************ connect/disconnect hair operators *********************/
+
+static void disconnect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
+{
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleData *pa;
+ PTCacheEdit *edit;
+ PTCacheEditPoint *point;
+ PTCacheEditKey *ekey = NULL;
+ HairKey *key;
+ int i, k;
+ float hairmat[4][4];
+
+ if(!ob || !psys || psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
+ if(!psys->part || psys->part->type != PART_HAIR)
+ return;
+
+ edit = psys->edit;
+ point= edit ? edit->points : NULL;
+
+ for(i=0, pa=psys->particles; i<psys->totpart; i++,pa++) {
+ if(point) {
+ ekey = point->keys;
+ point++;
+ }
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+
+ for(k=0,key=pa->hair; k<pa->totkey; k++,key++) {
+ Mat4MulVecfl(hairmat,key->co);
+
+ if(ekey) {
+ ekey->flag &= ~PEK_USE_WCO;
+ ekey++;
+ }
+ }
+ }
+
+ psys_free_path_cache(psys, psys->edit);
+
+ psys->flag |= PSYS_GLOBAL_HAIR;
+
+ PE_update_object(scene, ob, 0);
+}
+
+static int disconnect_hair_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= NULL;
+ int all = RNA_boolean_get(op->ptr, "all");
+
+ if(!ob)
+ return OPERATOR_CANCELLED;
+
+ if(all) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ disconnect_hair(scene, ob, psys);
+ }
+ }
+ else {
+ psys = ptr.data;
+ disconnect_hair(scene, ob, psys);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_disconnect_hair(wmOperatorType *ot)
+{
+ ot->name= "Disconnect Hair";
+ ot->description= "Disconnect hair from the emitter mesh.";
+ ot->idname= "PARTICLE_OT_disconnect_hair";
+
+ ot->exec= disconnect_hair_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "all", 0, "All hair", "Disconnect all hair systems from the emitter mesh");
+}
+
+static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
+{
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleData *pa;
+ PTCacheEdit *edit;
+ PTCacheEditPoint *point;
+ PTCacheEditKey *ekey;
+ HairKey *key;
+ BVHTreeFromMesh bvhtree;
+ BVHTreeNearest nearest;
+ MFace *mface;
+ DerivedMesh *dm = NULL;
+ int numverts;
+ int i, k;
+ float hairmat[4][4], imat[4][4];
+ float v[4][3], vec[3];
+
+ if(!psys || !psys->part || psys->part->type != PART_HAIR)
+ return;
+
+ edit= psys->edit;
+ point= edit ? edit->points : NULL;
+
+ if(psmd->dm->deformedOnly)
+ dm= psmd->dm;
+ else
+ dm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+
+ numverts = dm->getNumVerts (dm);
+
+ memset( &bvhtree, 0, sizeof(bvhtree) );
+
+ /* convert to global coordinates */
+ for (i=0; i<numverts; i++)
+ Mat4MulVecfl (ob->obmat, CDDM_get_vert(dm, i)->co);
+
+ bvhtree_from_mesh_faces(&bvhtree, dm, 0.0, 2, 6);
+
+ for(i=0, pa= psys->particles; i<psys->totpart; i++,pa++) {
+ key = pa->hair;
+
+ nearest.index = -1;
+ nearest.dist = FLT_MAX;
+
+ BLI_bvhtree_find_nearest(bvhtree.tree, key->co, &nearest, bvhtree.nearest_callback, &bvhtree);
+
+ if(nearest.index == -1) {
+ printf("No nearest point found for hair root!");
+ continue;
+ }
+
+ mface = CDDM_get_face(dm,nearest.index);
+
+ VecCopyf(v[0], CDDM_get_vert(dm,mface->v1)->co);
+ VecCopyf(v[1], CDDM_get_vert(dm,mface->v2)->co);
+ VecCopyf(v[2], CDDM_get_vert(dm,mface->v3)->co);
+ if(mface->v4) {
+ VecCopyf(v[3], CDDM_get_vert(dm,mface->v4)->co);
+ MeanValueWeights(v, 4, nearest.co, pa->fuv);
+ }
+ else
+ MeanValueWeights(v, 3, nearest.co, pa->fuv);
+
+ pa->num = nearest.index;
+ pa->num_dmcache = psys_particle_dm_face_lookup(ob,psmd->dm,pa->num,pa->fuv,NULL);
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+ Mat4Invert(imat,hairmat);
+
+ VECSUB(vec, nearest.co, key->co);
+
+ if(point) {
+ ekey = point->keys;
+ point++;
+ }
+
+ for(k=0,key=pa->hair; k<pa->totkey; k++,key++) {
+ VECADD(key->co, key->co, vec);
+ Mat4MulVecfl(imat,key->co);
+
+ if(ekey) {
+ ekey->flag |= PEK_USE_WCO;
+ ekey++;
+ }
+ }
+ }
+
+ free_bvhtree_from_mesh(&bvhtree);
+ if(!psmd->dm->deformedOnly)
+ dm->release(dm);
+
+ psys_free_path_cache(psys, psys->edit);
+
+ psys->flag &= ~PSYS_GLOBAL_HAIR;
+
+ PE_update_object(scene, ob, 0);
+}
+
+static int connect_hair_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
+ ParticleSystem *psys= NULL;
+ int all = RNA_boolean_get(op->ptr, "all");
+
+ if(!ob)
+ return OPERATOR_CANCELLED;
+
+ if(all) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ connect_hair(scene, ob, psys);
+ }
+ }
+ else {
+ psys = ptr.data;
+ connect_hair(scene, ob, psys);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+void PARTICLE_OT_connect_hair(wmOperatorType *ot)
+{
+ ot->name= "Connect Hair";
+ ot->description= "Connect hair to the emitter mesh.";
+ ot->idname= "PARTICLE_OT_connect_hair";
+
+ ot->exec= connect_hair_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "all", 0, "All hair", "Connect all hair systems to the emitter mesh");
+}
+
+/********************** render layer operators *********************/
+
+static int render_layer_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+
+ scene_add_render_layer(scene);
+ scene->r.actlay= BLI_countlist(&scene->r.layers) - 1;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCENE_OT_render_layer_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Render Layer";
+ ot->idname= "SCENE_OT_render_layer_add";
+ ot->description="Add a render layer.";
+
+ /* api callbacks */
+ ot->exec= render_layer_add_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int render_layer_remove_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ SceneRenderLayer *rl;
+ int act= scene->r.actlay;
+
+ if(BLI_countlist(&scene->r.layers) <= 1)
+ return OPERATOR_CANCELLED;
+
+ rl= BLI_findlink(&scene->r.layers, scene->r.actlay);
+ BLI_remlink(&scene->r.layers, rl);
+ MEM_freeN(rl);
+
+ scene->r.actlay= 0;
+
+ if(scene->nodetree) {
+ bNode *node;
+ for(node= scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+ if(node->custom1==act)
+ node->custom1= 0;
+ else if(node->custom1>act)
+ node->custom1--;
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCENE_OT_render_layer_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Render Layer";
+ ot->idname= "SCENE_OT_render_layer_remove";
+ ot->description="Remove the selected render layer.";
+
+ /* api callbacks */
+ ot->exec= render_layer_remove_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************** toolbox operator *********************/
+
+static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ bScreen *sc= CTX_wm_screen(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
+ PointerRNA ptr;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ RNA_pointer_create(&sc->id, &RNA_SpaceProperties, sbuts, &ptr);
+
+ pup= uiPupMenuBegin(C, "Align", 0);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumR(layout, &ptr, "align");
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+void BUTTONS_OT_toolbox(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toolbox";
+ ot->idname= "BUTTONS_OT_toolbox";
+ ot->description="Toolbar panel? DOC_BROKEN";
+
+ /* api callbacks */
+ ot->invoke= toolbox_invoke;
+}
+
+/********************** filebrowse operator *********************/
+
+typedef struct FileBrowseOp {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+} FileBrowseOp;
+
+static int file_browse_exec(bContext *C, wmOperator *op)
+{
+ FileBrowseOp *fbo= op->customdata;
+ char *str;
+
+ if (RNA_property_is_set(op->ptr, "path")==0 || fbo==NULL)
+ return OPERATOR_CANCELLED;
+
+ str= RNA_string_get_alloc(op->ptr, "path", 0, 0);
+ RNA_property_string_set(&fbo->ptr, fbo->prop, str);
+ RNA_property_update(C, &fbo->ptr, fbo->prop);
+ MEM_freeN(str);
+
+ MEM_freeN(op->customdata);
+ return OPERATOR_FINISHED;
+}
+
+static int file_browse_cancel(bContext *C, wmOperator *op)
+{
+ MEM_freeN(op->customdata);
+ op->customdata= NULL;
+
+ return OPERATOR_CANCELLED;
+}
+
+static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ PointerRNA ptr;
+ PropertyRNA *prop;
+ FileBrowseOp *fbo;
+ char *str;
+
+ uiFileBrowseContextProperty(C, &ptr, &prop);
+
+ if(!prop)
+ return OPERATOR_CANCELLED;
+
+ fbo= MEM_callocN(sizeof(FileBrowseOp), "FileBrowseOp");
+ fbo->ptr= ptr;
+ fbo->prop= prop;
+ op->customdata= fbo;
+
+ str= RNA_property_string_get_alloc(&ptr, prop, 0, 0);
+ RNA_string_set(op->ptr, "path", str);
+ MEM_freeN(str);
+
+ WM_event_add_fileselect(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+void BUTTONS_OT_file_browse(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "File Browse";
+ ot->idname= "BUTTONS_OT_file_browse";
+ ot->description="Open a file browser.";
+
+ /* api callbacks */
+ ot->invoke= file_browse_invoke;
+ ot->exec= file_browse_exec;
+ ot->cancel= file_browse_cancel;
+
+ /* properties */
+ WM_operator_properties_filesel(ot, 0, FILE_SPECIAL);
+}
+
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 483a1dc6100..48acaffd580 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -70,7 +70,6 @@ static SpaceLink *buttons_new(const bContext *C)
sbuts= MEM_callocN(sizeof(SpaceButs), "initbuts");
sbuts->spacetype= SPACE_BUTS;
- sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK;
sbuts->align= BUT_AUTO;
/* header */
@@ -94,31 +93,6 @@ static SpaceLink *buttons_new(const bContext *C)
BLI_addtail(&sbuts->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
-#if 0 // disabled, as this currently draws badly in new system
- /* buts space goes from (0,0) to (1280, 228) */
- ar->v2d.tot.xmin= 0.0f;
- ar->v2d.tot.ymin= 0.0f;
- ar->v2d.tot.xmax= 1279.0f;
- ar->v2d.tot.ymax= 228.0f;
-
- ar->v2d.cur= sbuts->v2d.tot;
-
- ar->v2d.min[0]= 256.0f;
- ar->v2d.min[1]= 42.0f;
-
- ar->v2d.max[0]= 2048.0f;
- ar->v2d.max[1]= 450.0f;
-
- ar->v2d.minzoom= 0.5f;
- ar->v2d.maxzoom= 1.21f;
-
- ar->v2d.scroll= 0; // TODO: will we need scrollbars?
- ar->v2d.align= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y;
- ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
- ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS;
-#endif
-
-
return (SpaceLink *)sbuts;
}
@@ -164,45 +138,46 @@ static SpaceLink *buttons_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void buttons_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
-
- /* own keymap */
- keymap= WM_keymap_listbase(wm, "Buttons", SPACE_BUTS, 0); /* XXX weak? */
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
+ keymap= WM_keymap_find(wm, "Buttons Generic", SPACE_BUTS, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void buttons_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
+ SpaceButs *sbuts= CTX_wm_space_buts(C);
int vertical= (sbuts->align == BUT_VERTICAL);
buttons_context_compute(C, sbuts);
if(sbuts->mainb == BCONTEXT_SCENE)
- ED_region_panels(C, ar, vertical, "scene");
+ ED_region_panels(C, ar, vertical, "scene", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_WORLD)
- ED_region_panels(C, ar, vertical, "world");
+ ED_region_panels(C, ar, vertical, "world", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_OBJECT)
- ED_region_panels(C, ar, vertical, "object");
+ ED_region_panels(C, ar, vertical, "object", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_DATA)
- ED_region_panels(C, ar, vertical, "data");
+ ED_region_panels(C, ar, vertical, "data", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_MATERIAL)
- ED_region_panels(C, ar, vertical, "material");
+ ED_region_panels(C, ar, vertical, "material", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_TEXTURE)
- ED_region_panels(C, ar, vertical, "texture");
+ ED_region_panels(C, ar, vertical, "texture", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_PARTICLE)
- ED_region_panels(C, ar, vertical, "particle");
+ ED_region_panels(C, ar, vertical, "particle", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_PHYSICS)
- ED_region_panels(C, ar, vertical, "physics");
+ ED_region_panels(C, ar, vertical, "physics", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_BONE)
- ED_region_panels(C, ar, vertical, "bone");
+ ED_region_panels(C, ar, vertical, "bone", sbuts->mainb);
else if(sbuts->mainb == BCONTEXT_MODIFIER)
- ED_region_panels(C, ar, vertical, "modifier");
+ ED_region_panels(C, ar, vertical, "modifier", sbuts->mainb);
else if (sbuts->mainb == BCONTEXT_CONSTRAINT)
- ED_region_panels(C, ar, vertical, "constraint");
+ ED_region_panels(C, ar, vertical, "constraint", sbuts->mainb);
+ else if(sbuts->mainb == BCONTEXT_BONE_CONSTRAINT)
+ ED_region_panels(C, ar, vertical, "bone_constraint", sbuts->mainb);
sbuts->re_align= 0;
sbuts->mainbo= sbuts->mainb;
@@ -210,6 +185,9 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar)
void buttons_operatortypes(void)
{
+ WM_operatortype_append(OBJECT_OT_group_add);
+ WM_operatortype_append(OBJECT_OT_group_remove);
+
WM_operatortype_append(OBJECT_OT_material_slot_add);
WM_operatortype_append(OBJECT_OT_material_slot_remove);
WM_operatortype_append(OBJECT_OT_material_slot_assign);
@@ -219,11 +197,30 @@ void buttons_operatortypes(void)
WM_operatortype_append(MATERIAL_OT_new);
WM_operatortype_append(TEXTURE_OT_new);
WM_operatortype_append(WORLD_OT_new);
+
+ WM_operatortype_append(OBJECT_OT_particle_system_add);
+ WM_operatortype_append(OBJECT_OT_particle_system_remove);
+
+ WM_operatortype_append(PARTICLE_OT_new);
+ WM_operatortype_append(PARTICLE_OT_new_target);
+ WM_operatortype_append(PARTICLE_OT_remove_target);
+ WM_operatortype_append(PARTICLE_OT_target_move_up);
+ WM_operatortype_append(PARTICLE_OT_target_move_down);
+ WM_operatortype_append(PARTICLE_OT_connect_hair);
+ WM_operatortype_append(PARTICLE_OT_disconnect_hair);
+
+ WM_operatortype_append(SCENE_OT_render_layer_add);
+ WM_operatortype_append(SCENE_OT_render_layer_remove);
+
+ WM_operatortype_append(BUTTONS_OT_toolbox);
+ WM_operatortype_append(BUTTONS_OT_file_browse);
}
void buttons_keymap(struct wmWindowManager *wm)
{
+ wmKeyMap *keymap= WM_keymap_find(wm, "Buttons Generic", SPACE_BUTS, 0);
+ WM_keymap_add_item(keymap, "BUTTONS_OT_toolbox", RIGHTMOUSE, KM_PRESS, 0, 0);
}
//#define PY_HEADER
@@ -264,58 +261,6 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
-#if 0
-/* add handlers, stuff you only do once or on area/region changes */
-static void buttons_context_area_init(wmWindowManager *wm, ARegion *ar)
-{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
-}
-
-#define CONTEXTY 30
-
-static void buttons_context_area_draw(const bContext *C, ARegion *ar)
-{
- SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C);
- uiStyle *style= U.uistyles.first;
- uiBlock *block;
- uiLayout *layout;
- View2D *v2d= &ar->v2d;
- float col[3];
- int x, y, w, h;
-
- buttons_context_compute(C, sbuts);
-
- w= v2d->cur.xmax - v2d->cur.xmin;
- h= v2d->cur.ymax - v2d->cur.ymin;
- UI_view2d_view_ortho(C, v2d);
-
- /* create UI */
- block= uiBeginBlock(C, ar, "buttons_context", UI_EMBOSS);
- layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_PANEL,
- style->panelspace, h - (h-UI_UNIT_Y)/2, w, 20, style);
-
- buttons_context_draw(C, layout);
-
- uiBlockLayoutResolve(C, block, &x, &y);
- uiEndBlock(C, block);
-
- /* draw */
- UI_SetTheme(SPACE_BUTS, RGN_TYPE_WINDOW); /* XXX */
-
- UI_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- UI_view2d_totRect_set(v2d, x, -y);
- UI_view2d_view_ortho(C, v2d);
-
- uiDrawBlock(C, block);
-
- /* restore view matrix */
- UI_view2d_view_restore(C);
-}
-#endif
-
/* reused! */
static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
{
@@ -324,8 +269,13 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
/* context changes */
switch(wmn->category) {
case NC_SCENE:
+ /* lazy general redraw tag here, in case more than 1 propertie window is opened
+ Not all RNA props have a ND_sub notifier(yet) */
+ ED_area_tag_redraw(sa);
switch(wmn->data) {
case ND_FRAME:
+ case ND_MODE:
+ case ND_RENDER_OPTIONS:
ED_area_tag_redraw(sa);
break;
@@ -336,11 +286,15 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
}
break;
case NC_OBJECT:
+ ED_area_tag_redraw(sa);
+ /* lazy general redraw tag here, in case more than 1 propertie window is opened
+ Not all RNA props have a ND_ notifier(yet) */
switch(wmn->data) {
case ND_TRANSFORM:
case ND_BONE_ACTIVE:
case ND_BONE_SELECT:
- case ND_GEOM_SELECT:
+ case ND_MODIFIER:
+ case ND_CONSTRAINT:
ED_area_tag_redraw(sa);
break;
case ND_SHADING:
@@ -350,9 +304,15 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
break;
}
break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_SELECT:
+ ED_area_tag_redraw(sa);
+ break;
+ }
+ break;
case NC_MATERIAL:
ED_area_tag_redraw(sa);
-
switch(wmn->data) {
case ND_SHADING:
case ND_SHADING_DRAW:
@@ -362,15 +322,19 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
}
break;
case NC_WORLD:
- ED_area_tag_redraw(sa);
- sbuts->preview= 1;
case NC_LAMP:
- ED_area_tag_redraw(sa);
- sbuts->preview= 1;
case NC_TEXTURE:
ED_area_tag_redraw(sa);
sbuts->preview= 1;
+ break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_PROPERTIES)
+ ED_area_tag_redraw(sa);
+ break;
}
+
+ if(wmn->data == ND_KEYS)
+ ED_area_tag_redraw(sa);
}
/* only called once, from space/spacetypes.c */
@@ -403,26 +367,13 @@ void ED_spacetype_buttons(void)
/* regions: header */
art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
art->regionid = RGN_TYPE_HEADER;
- art->minsizey= HEADERY;
+ art->minsizey= BUTS_HEADERY;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES;
art->init= buttons_header_area_init;
art->draw= buttons_header_area_draw;
BLI_addhead(&st->regiontypes, art);
-#if 0
- /* regions: context */
- art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region");
- art->regionid = RGN_TYPE_CHANNELS;
- art->minsizey= CONTEXTY;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
- art->init= buttons_context_area_init;
- art->draw= buttons_context_area_draw;;
- art->listener= buttons_area_listener;
-
- BLI_addhead(&st->regiontypes, art);
-#endif
-
BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_console/Makefile b/source/blender/editors/space_console/Makefile
new file mode 100644
index 00000000000..a7c9283985b
--- /dev/null
+++ b/source/blender/editors/space_console/Makefile
@@ -0,0 +1,52 @@
+# -*- 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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../../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
new file mode 100644
index 00000000000..ecc10a1d0c3
--- /dev/null
+++ b/source/blender/editors/space_console/SConscript
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('*.c')
+defs = []
+
+incs = [
+ '../include',
+ '#extern/glew/include',
+ '#/intern/guardedalloc',
+ '../../makesdna',
+ '../../makesrna',
+ '../../blenkernel',
+ '../../blenlib',
+ '../../windowmanager',
+ '../../blenfont',
+]
+
+if not env['WITH_BF_PYTHON']:
+ defs.append('DISABLE_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
new file mode 100644
index 00000000000..4f225bb8fcb
--- /dev/null
+++ b/source/blender/editors/space_console/console_draw.c
@@ -0,0 +1,348 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLF_api.h"
+
+#include "BLI_blenlib.h"
+
+#include "DNA_space_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+// #include "BKE_suggestions.h"
+#include "BKE_text.h"
+#include "BKE_report.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_datafiles.h"
+#include "ED_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "console_intern.h"
+
+static void console_font_begin(SpaceConsole *sc)
+{
+ static int mono= -1; // XXX needs proper storage
+
+ if(mono == -1)
+ mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_set(mono);
+ BLF_aspect(1.0);
+
+ BLF_size(sc->lheight-2, 72);
+}
+
+static void console_line_color(unsigned char *fg, int type)
+{
+ switch(type) {
+ case CONSOLE_LINE_OUTPUT:
+ fg[0]=96; fg[1]=128; fg[2]=255;
+ break;
+ case CONSOLE_LINE_INPUT:
+ fg[0]=255; fg[1]=255; fg[2]=255;
+ break;
+ case CONSOLE_LINE_INFO:
+ fg[0]=0; fg[1]=170; fg[2]=0;
+ break;
+ case CONSOLE_LINE_ERROR:
+ fg[0]=220; fg[1]=96; fg[2]=96;
+ 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;
+ }
+
+ }
+
+
+
+}
+
+
+/* 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( char *str, int str_len,
+ int console_width, int lheight,
+ unsigned char *fg, unsigned char *bg,
+ int winx,
+ int ymin, int ymax,
+ int *x, int *y, int draw)
+{
+ int rct_ofs= lheight/4;
+ int tot_lines = (str_len/console_width)+1; /* total number of lines for wrapping */
+ int y_next = (str_len > console_width) ? (*y)+lheight*tot_lines : (*y)+lheight;
+
+ /* just advance the height */
+ if(draw==0) {
+ *y= y_next;
+ return 1;
+ }
+ else if (y_next-lheight < ymin) {
+ /* have not reached the drawable area so don't break */
+ *y= y_next;
+ return 1;
+ }
+
+ if(str_len > console_width) { /* wrap? */
+ char *line_stride= str + ((tot_lines-1) * 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, *y-rct_ofs, winx, (*y+(lheight*tot_lines))+rct_ofs);
+ }
+
+ glColor3ub(fg[0], fg[1], fg[2]);
+
+ /* last part needs no clipping */
+ BLF_position(*x, *y, 0); (*y) += lheight;
+ BLF_draw(line_stride);
+ line_stride -= console_width;
+
+ for(; line_stride >= str; line_stride -= console_width) {
+ eol = line_stride[console_width];
+ line_stride[console_width]= '\0';
+
+ BLF_position(*x, *y, 0); (*y) += lheight;
+ BLF_draw(line_stride);
+
+ line_stride[console_width] = eol; /* restore */
+
+ /* check if were out of view bounds */
+ if(*y > ymax)
+ return 0;
+ }
+ }
+ else { /* simple, no wrap */
+
+ if(bg) {
+ glColor3ub(bg[0], bg[1], bg[2]);
+ glRecti(0, *y-rct_ofs, winx, *y+lheight-rct_ofs);
+ }
+
+ glColor3ub(fg[0], fg[1], fg[2]);
+
+ BLF_position(*x, *y, 0); (*y) += lheight;
+ BLF_draw(str);
+
+ if(*y > ymax)
+ return 0;
+ }
+
+ return 1;
+}
+
+#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 mouse_y, void **mouse_pick)
+{
+ View2D *v2d= &ar->v2d;
+
+ ConsoleLine *cl= sc->history.last;
+
+ int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN;
+ int x,y, y_prev;
+ int cwidth;
+ int console_width; /* number of characters that fit into the width of the console (fixed width) */
+ unsigned char fg[3];
+
+ console_font_begin(sc);
+ cwidth = BLF_fixed_width();
+
+ console_width= (ar->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) )/cwidth;
+ if (console_width < 8) console_width= 8;
+
+ x= x_orig; y= y_orig;
+
+ if(mouse_y != INT_MAX)
+ mouse_y += (v2d->cur.ymin+CONSOLE_DRAW_MARGIN);
+
+
+ if(sc->type==CONSOLE_TYPE_PYTHON) {
+ int prompt_len;
+
+ /* 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(x, y, 0); x += cwidth * prompt_len;
+ BLF_draw(sc->prompt);
+ }
+ BLF_position(x, y, 0);
+ BLF_draw(cl->line);
+
+ /* cursor */
+ console_line_color(fg, CONSOLE_LINE_ERROR); /* lazy */
+ glColor3ub(fg[0], fg[1], fg[2]);
+ glRecti(x+(cwidth*cl->cursor) -1, y-2, x+(cwidth*cl->cursor) +1, y+sc->lheight-2);
+
+ x= x_orig; /* remove prompt offset */
+ }
+
+ y += sc->lheight;
+
+ for(cl= sc->scrollback.last; cl; cl= cl->prev) {
+ y_prev= y;
+
+ if(draw)
+ console_line_color(fg, cl->type);
+
+ if(!console_draw_string( cl->line, cl->len,
+ console_width, sc->lheight,
+ fg, NULL,
+ ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL),
+ v2d->cur.ymin, v2d->cur.ymax,
+ &x, &y, draw))
+ {
+ /* when drawing, if we pass v2d->cur.ymax, then quit */
+ if(draw) {
+ break; /* past the y limits */
+ }
+ }
+
+ if((mouse_y != INT_MAX) && (mouse_y >= y_prev && mouse_y <= y)) {
+ *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);
+ }
+
+ /* 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= y;
+
+ if(draw)
+ console_report_color(fg, bg, report, bool);
+
+ if(!console_draw_string( report->message, report->len,
+ console_width, sc->lheight,
+ fg, bg,
+ ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL),
+ v2d->cur.ymin, v2d->cur.ymax,
+ &x, &y, draw))
+ {
+ /* when drawing, if we pass v2d->cur.ymax, then quit */
+ if(draw) {
+ break; /* past the y limits */
+ }
+ }
+ if((mouse_y != INT_MAX) && (mouse_y >= y_prev && mouse_y <= y)) {
+ *mouse_pick= (void *)report;
+ break;
+ }
+
+ bool = !(bool);
+ }
+ }
+ }
+ y += sc->lheight*2;
+
+
+ return y-y_orig;
+}
+
+void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
+{
+ console_text_main__internal(sc, ar, reports, 1, INT_MAX, NULL);
+}
+
+int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
+{
+ return console_text_main__internal(sc, ar, reports, 0, INT_MAX, NULL);
+}
+
+void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mouse_y)
+{
+ void *mouse_pick= NULL;
+ console_text_main__internal(sc, ar, reports, 0, mouse_y, &mouse_pick);
+ return (void *)mouse_pick;
+}
diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h
new file mode 100644
index 00000000000..6d002efcc8e
--- /dev/null
+++ b/source/blender/editors/space_console/console_intern.h
@@ -0,0 +1,82 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef ED_CONSOLE_INTERN_H
+#define ED_CONSOLE_INTERN_H
+
+/* internal exports only */
+
+struct ConsoleLine;
+struct wmOperatorType;
+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 */
+
+/* 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_verify(const struct bContext *C);
+
+int console_report_mask(SpaceConsole *sc);
+
+
+void CONSOLE_OT_move(wmOperatorType *ot);
+void CONSOLE_OT_delete(wmOperatorType *ot);
+void CONSOLE_OT_insert(wmOperatorType *ot);
+
+void CONSOLE_OT_history_append(wmOperatorType *ot);
+void CONSOLE_OT_scrollback_append(wmOperatorType *ot);
+
+void CONSOLE_OT_clear(wmOperatorType *ot);
+void CONSOLE_OT_history_cycle(wmOperatorType *ot);
+void CONSOLE_OT_copy(wmOperatorType *ot);
+void CONSOLE_OT_paste(wmOperatorType *ot);
+void CONSOLE_OT_zoom(wmOperatorType *ot);
+
+
+/* console_report.c */
+void CONSOLE_OT_select_pick(wmOperatorType *ot); /* report selection */
+void CONSOLE_OT_select_all_toggle(wmOperatorType *ot);
+void CONSOLE_OT_select_border(wmOperatorType *ot);
+
+void CONSOLE_OT_report_replay(wmOperatorType *ot);
+void CONSOLE_OT_report_delete(wmOperatorType *ot);
+void CONSOLE_OT_report_copy(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 };
+
+#endif /* ED_CONSOLE_INTERN_H */
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
new file mode 100644
index 00000000000..ccf7dbff946
--- /dev/null
+++ b/source/blender/editors/space_console/console_ops.c
@@ -0,0 +1,801 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h> /* ispunct */
+#include <sys/stat.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "PIL_time.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_report.h"
+#include "BKE_text.h" /* only for character utility funcs */
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "console_intern.h"
+
+void console_history_free(SpaceConsole *sc, ConsoleLine *cl)
+{
+ BLI_remlink(&sc->history, cl);
+ MEM_freeN(cl->line);
+ MEM_freeN(cl);
+}
+void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl)
+{
+ BLI_remlink(&sc->scrollback, cl);
+ MEM_freeN(cl->line);
+ MEM_freeN(cl);
+}
+
+void console_scrollback_limit(SpaceConsole *sc)
+{
+ int tot;
+
+ if (U.scrollback < 32) U.scrollback= 128; // XXX - save in user defaults
+
+ for(tot= BLI_countlist(&sc->scrollback); tot > U.scrollback; tot--)
+ console_scrollback_free(sc, sc->scrollback.first);
+}
+
+static ConsoleLine * console_history_find(SpaceConsole *sc, const char *str, ConsoleLine *cl_ignore)
+{
+ ConsoleLine *cl;
+
+ for(cl= sc->history.last; cl; cl= cl->prev) {
+ if (cl==cl_ignore)
+ continue;
+
+ if(strcmp(str, cl->line)==0)
+ return cl;
+ }
+
+ return NULL;
+}
+
+/* return 0 if no change made, clamps the range */
+static int console_line_cursor_set(ConsoleLine *cl, int cursor)
+{
+ int cursor_new;
+
+ if(cursor < 0) cursor_new= 0;
+ else if(cursor > cl->len) cursor_new= cl->len;
+ else cursor_new= cursor;
+
+ if(cursor_new == cl->cursor)
+ return 0;
+
+ cl->cursor= cursor_new;
+ return 1;
+}
+
+static char cursor_char(ConsoleLine *cl)
+{
+ /* assume cursor is clamped */
+ return cl->line[cl->cursor];
+}
+
+static char cursor_char_prev(ConsoleLine *cl)
+{
+ /* assume cursor is clamped */
+ if(cl->cursor <= 0)
+ return '\0';
+
+ return cl->line[cl->cursor-1];
+}
+
+static char cursor_char_next(ConsoleLine *cl)
+{
+ /* assume cursor is clamped */
+ if(cl->cursor + 1 >= cl->len)
+ return '\0';
+
+ return cl->line[cl->cursor+1];
+}
+
+static void console_lb_debug__internal(ListBase *lb)
+{
+ ConsoleLine *cl;
+
+ printf("%d: ", BLI_countlist(lb));
+ for(cl= lb->first; cl; cl= cl->next)
+ printf("<%s> ", cl->line);
+ printf("\n");
+
+}
+
+static void console_history_debug(const bContext *C)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ console_lb_debug__internal(&sc->history);
+}
+
+static ConsoleLine *console_lb_add__internal(ListBase *lb, ConsoleLine *from)
+{
+ ConsoleLine *ci= MEM_callocN(sizeof(ConsoleLine), "ConsoleLine Add");
+
+ if(from) {
+ ci->line= BLI_strdup(from->line);
+ ci->len= strlen(ci->line);
+ ci->len_alloc= ci->len;
+
+ ci->cursor= from->cursor;
+ ci->type= from->type;
+ } else {
+ ci->line= MEM_callocN(64, "console-in-line");
+ ci->len_alloc= 64;
+ ci->len= 0;
+ }
+
+ BLI_addtail(lb, ci);
+ return ci;
+}
+
+static ConsoleLine *console_history_add(const bContext *C, ConsoleLine *from)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ return console_lb_add__internal(&sc->history, from);
+}
+
+#if 0 /* may use later ? */
+static ConsoleLine *console_scrollback_add(const bContext *C, ConsoleLine *from)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ return console_lb_add__internal(&sc->scrollback, from);
+}
+#endif
+
+static ConsoleLine *console_lb_add_str__internal(ListBase *lb, const bContext *C, char *str, int own)
+{
+ ConsoleLine *ci= MEM_callocN(sizeof(ConsoleLine), "ConsoleLine Add");
+ if(own) ci->line= str;
+ else ci->line= BLI_strdup(str);
+
+ ci->len = ci->len_alloc = strlen(str);
+
+ BLI_addtail(lb, ci);
+ return ci;
+}
+ConsoleLine *console_history_add_str(const bContext *C, char *str, int own)
+{
+ return console_lb_add_str__internal(&CTX_wm_space_console(C)->history, C, str, own);
+}
+ConsoleLine *console_scrollback_add_str(const bContext *C, char *str, int own)
+{
+ return console_lb_add_str__internal(&CTX_wm_space_console(C)->scrollback, C, str, own);
+}
+
+ConsoleLine *console_history_verify(const bContext *C)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ConsoleLine *ci= sc->history.last;
+ if(ci==NULL)
+ ci= console_history_add(C, NULL);
+
+ return ci;
+}
+
+
+static void console_line_verify_length(ConsoleLine *ci, int len)
+{
+ /* resize the buffer if needed */
+ if(len >= ci->len_alloc) {
+ int new_len= len * 2; /* new length */
+ char *new_line= MEM_callocN(new_len, "console line");
+ memcpy(new_line, ci->line, ci->len);
+ MEM_freeN(ci->line);
+
+ ci->line= new_line;
+ ci->len_alloc= new_len;
+ }
+}
+
+static int console_line_insert(ConsoleLine *ci, char *str)
+{
+ int len = strlen(str);
+
+ if(len>0 && str[len-1]=='\n') {/* stop new lines being pasted at the end of lines */
+ str[len-1]= '\0';
+ len--;
+ }
+
+ if(len==0)
+ return 0;
+
+ console_line_verify_length(ci, len + ci->len);
+
+ memmove(ci->line+ci->cursor+len, ci->line+ci->cursor, (ci->len - ci->cursor)+1);
+ memcpy(ci->line+ci->cursor, str, len);
+
+ ci->len += len;
+ ci->cursor += len;
+
+ 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;
+}
+
+static int console_poll(bContext *C)
+{
+ return (CTX_wm_space_console(C) != NULL);
+}
+
+
+/* static funcs for text editing */
+
+/* similar to the text editor, with some not used. keep compatible */
+static EnumPropertyItem move_type_items[]= {
+ {LINE_BEGIN, "LINE_BEGIN", 0, "Line Begin", ""},
+ {LINE_END, "LINE_END", 0, "Line End", ""},
+ {PREV_CHAR, "PREVIOUS_CHARACTER", 0, "Previous Character", ""},
+ {NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""},
+ {PREV_WORD, "PREVIOUS_WORD", 0, "Previous Word", ""},
+ {NEXT_WORD, "NEXT_WORD", 0, "Next Word", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static int move_exec(bContext *C, wmOperator *op)
+{
+ ConsoleLine *ci= console_history_verify(C);
+
+ int type= RNA_enum_get(op->ptr, "type");
+ int done= 0;
+
+ switch(type) {
+ case LINE_BEGIN:
+ done= console_line_cursor_set(ci, 0);
+ break;
+ case LINE_END:
+ done= console_line_cursor_set(ci, INT_MAX);
+ break;
+ case PREV_CHAR:
+ done= console_line_cursor_set(ci, ci->cursor-1);
+ break;
+ case NEXT_CHAR:
+ done= console_line_cursor_set(ci, ci->cursor+1);
+ break;
+
+ /* - if the character is a delimiter then skip delimiters (including white space)
+ * - when jump over the word */
+ case PREV_WORD:
+ while(text_check_delim(cursor_char_prev(ci)))
+ if(console_line_cursor_set(ci, ci->cursor-1)==FALSE)
+ break;
+
+ while(text_check_delim(cursor_char_prev(ci))==FALSE)
+ if(console_line_cursor_set(ci, ci->cursor-1)==FALSE)
+ break;
+
+ /* This isnt used for NEXT_WORD because when going back
+ * its more useful to have the cursor directly after a word then whitespace */
+ while(text_check_whitespace(cursor_char_prev(ci))==TRUE)
+ if(console_line_cursor_set(ci, ci->cursor-1)==FALSE)
+ break;
+
+ done= 1; /* assume changed */
+ break;
+ case NEXT_WORD:
+ while(text_check_delim(cursor_char(ci))==TRUE)
+ if (console_line_cursor_set(ci, ci->cursor+1)==FALSE)
+ break;
+
+ while(text_check_delim(cursor_char(ci))==FALSE)
+ if (console_line_cursor_set(ci, ci->cursor+1)==FALSE)
+ break;
+
+ done= 1; /* assume changed */
+ break;
+ }
+
+ if(done) {
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_move(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move Cursor";
+ ot->description= "Move cursor position.";
+ ot->idname= "CONSOLE_OT_move";
+
+ /* api callbacks */
+ ot->exec= move_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", move_type_items, LINE_BEGIN, "Type", "Where to move cursor to.");
+}
+
+
+static int insert_exec(bContext *C, wmOperator *op)
+{
+ ConsoleLine *ci= console_history_verify(C);
+ char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
+
+ int len= console_line_insert(ci, str);
+
+ MEM_freeN(str);
+
+ if(len==0)
+ return OPERATOR_CANCELLED;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+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);
+ }
+ return insert_exec(C, op);
+}
+
+void CONSOLE_OT_insert(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Insert";
+ ot->description= "Insert text at cursor position.";
+ ot->idname= "CONSOLE_OT_insert";
+
+ /* api callbacks */
+ ot->exec= insert_exec;
+ ot->invoke= insert_invoke;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
+}
+
+
+static EnumPropertyItem delete_type_items[]= {
+ {DEL_NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""},
+ {DEL_PREV_CHAR, "PREVIOUS_CHARACTER", 0, "Previous Character", ""},
+// {DEL_NEXT_WORD, "NEXT_WORD", 0, "Next Word", ""},
+// {DEL_PREV_WORD, "PREVIOUS_WORD", 0, "Previous Word", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static int delete_exec(bContext *C, wmOperator *op)
+{
+
+ ConsoleLine *ci= console_history_verify(C);
+
+
+ int done = 0;
+
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if(ci->len==0) {
+ return OPERATOR_CANCELLED;
+ }
+
+ switch(type) {
+ case DEL_NEXT_CHAR:
+ if(ci->cursor < ci->len) {
+ memmove(ci->line + ci->cursor, ci->line + ci->cursor+1, (ci->len - ci->cursor)+1);
+ ci->len--;
+ done= 1;
+ }
+ break;
+ case DEL_PREV_CHAR:
+ if(ci->cursor > 0) {
+ ci->cursor--; /* same as above */
+ memmove(ci->line + ci->cursor, ci->line + ci->cursor+1, (ci->len - ci->cursor)+1);
+ ci->len--;
+ done= 1;
+ }
+ break;
+ }
+
+ if(!done)
+ return OPERATOR_CANCELLED;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+
+void CONSOLE_OT_delete(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete";
+ ot->description= "Delete text by cursor position.";
+ ot->idname= "CONSOLE_OT_delete";
+
+ /* api callbacks */
+ ot->exec= delete_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", delete_type_items, DEL_NEXT_CHAR, "Type", "Which part of the text to delete.");
+}
+
+
+/* the python exec operator uses this */
+static int clear_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ short scrollback= RNA_boolean_get(op->ptr, "scrollback");
+ short history= RNA_boolean_get(op->ptr, "history");
+
+ /*ConsoleLine *ci= */ console_history_verify(C);
+
+ if(scrollback) { /* last item in mistory */
+ while(sc->scrollback.first)
+ console_scrollback_free(sc, sc->scrollback.first);
+ }
+
+ if(history) {
+ while(sc->history.first)
+ console_history_free(sc, sc->history.first);
+ }
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear";
+ ot->description= "Clear text by type.";
+ ot->idname= "CONSOLE_OT_clear";
+
+ /* api callbacks */
+ ot->exec= clear_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "scrollback", 1, "Scrollback", "Clear the scrollback history");
+ RNA_def_boolean(ot->srna, "history", 0, "History", "Clear the command history");
+}
+
+
+
+/* the python exec operator uses this */
+static int history_cycle_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(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 */
+
+ /* 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 */
+ if(ci->prev) {
+ ConsoleLine *ci_prev= (ConsoleLine *)ci->prev;
+
+ if(strcmp(ci->line, ci_prev->line)==0)
+ console_history_free(sc, ci_prev);
+ }
+
+ if(reverse) { /* last item in mistory */
+ ci= sc->history.last;
+ BLI_remlink(&sc->history, ci);
+ BLI_addhead(&sc->history, ci);
+ }
+ else {
+ ci= sc->history.first;
+ BLI_remlink(&sc->history, ci);
+ BLI_addtail(&sc->history, ci);
+ }
+
+ { /* add a duplicate of the new arg and remove all other instances */
+ ConsoleLine *cl;
+ while((cl= console_history_find(sc, ci->line, ci)))
+ console_history_free(sc, cl);
+
+ console_history_add(C, (ConsoleLine *)sc->history.last);
+ }
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_history_cycle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "History Cycle";
+ ot->description= "Cycle through history.";
+ ot->idname= "CONSOLE_OT_history_cycle";
+
+ /* api callbacks */
+ ot->exec= history_cycle_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "reverse", 0, "Reverse", "reverse cycle history");
+}
+
+
+/* the python exec operator uses this */
+static int history_append_exec(bContext *C, wmOperator *op)
+{
+ 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");
+
+ if(rem_dupes) {
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ConsoleLine *cl;
+
+ while((cl= console_history_find(sc, ci->line, ci)))
+ console_history_free(sc, cl);
+
+ if(strcmp(str, ci->line)==0) {
+ MEM_freeN(str);
+ return OPERATOR_FINISHED;
+ }
+ }
+
+ ci= console_history_add_str(C, str, 1); /* own the string */
+ console_line_cursor_set(ci, cursor);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_history_append(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "History Append";
+ ot->description= "Append history at cursor position.";
+ ot->idname= "CONSOLE_OT_history_append";
+
+ /* api callbacks */
+ ot->exec= history_append_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
+ RNA_def_int(ot->srna, "current_character", 0, 0, INT_MAX, "Cursor", "The index of the cursor.", 0, 10000);
+ RNA_def_boolean(ot->srna, "remove_duplicates", 0, "Remove Duplicates", "Remove duplicate items in the history");
+}
+
+
+/* the python exec operator uses this */
+static int scrollback_append_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(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 type= RNA_enum_get(op->ptr, "type");
+
+ ci= console_scrollback_add_str(C, str, 1); /* own the string */
+ ci->type= type;
+
+ console_scrollback_limit(sc);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
+{
+ /* defined in DNA_space_types.h */
+ static EnumPropertyItem console_line_type_items[] = {
+ {CONSOLE_LINE_OUTPUT, "OUTPUT", 0, "Output", ""},
+ {CONSOLE_LINE_INPUT, "INPUT", 0, "Input", ""},
+ {CONSOLE_LINE_INFO, "INFO", 0, "Information", ""},
+ {CONSOLE_LINE_ERROR, "ERROR", 0, "Error", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Scrollback Append";
+ ot->description= "Append scrollback text by type.";
+ ot->idname= "CONSOLE_OT_scrollback_append";
+
+ /* api callbacks */
+ ot->exec= scrollback_append_exec;
+ ot->poll= console_edit_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+ RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
+ RNA_def_enum(ot->srna, "type", console_line_type_items, CONSOLE_LINE_OUTPUT, "Type", "Console output type.");
+}
+
+
+static int copy_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ DynStr *buf_dyn= BLI_dynstr_new();
+ char *buf_str;
+
+ ConsoleLine *cl;
+
+ for(cl= sc->scrollback.first; cl; cl= cl->next) {
+ BLI_dynstr_append(buf_dyn, cl->line);
+ BLI_dynstr_append(buf_dyn, "\n");
+ }
+
+ buf_str= BLI_dynstr_get_cstring(buf_dyn);
+ BLI_dynstr_free(buf_dyn);
+
+ WM_clipboard_text_set(buf_str, 0);
+
+ MEM_freeN(buf_str);
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_copy(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Copy to Clipboard";
+ ot->description= "Copy selected text to clipboard.";
+ ot->idname= "CONSOLE_OT_copy";
+
+ /* api callbacks */
+ ot->poll= console_edit_poll;
+ ot->exec= copy_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+}
+
+static int paste_exec(bContext *C, wmOperator *op)
+{
+ ConsoleLine *ci= console_history_verify(C);
+
+ char *buf_str= WM_clipboard_text_get(0);
+
+ if(buf_str==NULL)
+ return OPERATOR_CANCELLED;
+
+ console_line_insert(ci, buf_str); /* TODO - Multiline copy?? */
+
+ MEM_freeN(buf_str);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_paste(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Paste from Clipboard";
+ ot->description= "Paste text from clipboard.";
+ ot->idname= "CONSOLE_OT_paste";
+
+ /* api callbacks */
+ ot->poll= console_edit_poll;
+ ot->exec= paste_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER;
+
+ /* properties */
+}
+
+static int zoom_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+
+ int delta= RNA_int_get(op->ptr, "delta");
+
+ sc->lheight += delta;
+ CLAMP(sc->lheight, 8, 32);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+
+void CONSOLE_OT_zoom(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Console Zoom";
+ /*optionals -
+ "Zoom view font." */
+ ot->description= "Zoom screen area.";
+ ot->idname= "CONSOLE_OT_zoom";
+
+ /* api callbacks */
+ ot->exec= zoom_exec;
+ ot->poll= console_poll;
+
+ /* flags */
+ /* ot->flag= OPTYPE_REGISTER; */ /* super annoying */
+
+ /* properties */
+ RNA_def_int(ot->srna, "delta", 0, 0, INT_MAX, "Delta", "Scale the view font.", 0, 1000);
+}
diff --git a/source/blender/editors/space_console/console_report.c b/source/blender/editors/space_console/console_report.c
new file mode 100644
index 00000000000..b6920d148fd
--- /dev/null
+++ b/source/blender/editors/space_console/console_report.c
@@ -0,0 +1,420 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "PIL_time.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_report.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "console_intern.h"
+
+int console_report_mask(SpaceConsole *sc)
+{
+ 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;
+
+ 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;
+
+ return 1;
+}
+
+static int report_replay_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ReportList *reports= CTX_wm_reports(C);
+ int report_mask= console_report_mask(sc);
+ Report *report;
+
+ 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);
+ WM_operator_name_call(C, "CONSOLE_OT_execute", WM_OP_EXEC_DEFAULT, NULL);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
+ }
+
+ sc->type= CONSOLE_TYPE_REPORT;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_report_replay(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Replay Operators";
+ ot->description= "Replay selected reports.";
+ ot->idname= "CONSOLE_OT_report_replay";
+
+ /* api callbacks */
+ ot->poll= console_report_poll;
+ ot->exec= report_replay_exec;
+
+ /* flags */
+ /* ot->flag= OPTYPE_REGISTER; */
+
+ /* properties */
+}
+
+static int select_report_pick_exec(bContext *C, wmOperator *op)
+{
+ int report_index= RNA_int_get(op->ptr, "report_index");
+ Report *report= BLI_findlink(&CTX_wm_reports(C)->list, report_index);
+
+ if(!report)
+ return OPERATOR_CANCELLED;
+
+ report->flag ^= SELECT; /* toggle */
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceConsole *sc= CTX_wm_space_console(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]);
+
+ RNA_int_set(op->ptr, "report_index", BLI_findindex(&reports->list, report));
+
+ return select_report_pick_exec(C, op);
+}
+
+
+void CONSOLE_OT_select_pick(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select report";
+ ot->description= "Select reports by index.";
+ ot->idname= "CONSOLE_OT_select_pick";
+
+ /* api callbacks */
+ ot->poll= console_report_poll;
+ ot->invoke= select_report_pick_invoke;
+ ot->exec= select_report_pick_exec;
+
+ /* flags */
+ /* ot->flag= OPTYPE_REGISTER; */
+
+ /* properties */
+ RNA_def_int(ot->srna, "report_index", 0, 0, INT_MAX, "Report", "The index of the report.", 0, INT_MAX);
+}
+
+
+
+static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ReportList *reports= CTX_wm_reports(C);
+ int report_mask= console_report_mask(sc);
+ int deselect= 0;
+
+ Report *report;
+
+ for(report=reports->list.last; report; report=report->prev) {
+ if((report->type & report_mask) && (report->flag & SELECT)) {
+ deselect= 1;
+ break;
+ }
+ }
+
+
+ if(deselect) {
+ for(report=reports->list.last; report; report=report->prev)
+ if(report->type & report_mask)
+ report->flag &= ~SELECT;
+ }
+ else {
+ for(report=reports->list.last; report; report=report->prev)
+ if(report->type & report_mask)
+ report->flag |= SELECT;
+ }
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_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";
+
+ /* api callbacks */
+ ot->poll= console_report_poll;
+ ot->exec= report_select_all_toggle_exec;
+
+ /* flags */
+ /*ot->flag= OPTYPE_REGISTER;*/
+
+ /* properties */
+}
+
+/* borderselect operator */
+static int borderselect_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
+ ReportList *reports= CTX_wm_reports(C);
+ int report_mask= console_report_mask(sc);
+ Report *report_min, *report_max, *report;
+
+ //View2D *v2d= UI_view2d_fromcontext(C);
+
+
+ rcti rect;
+ //rctf rectf, rq;
+ int val;
+ //short mval[2];
+
+ val= RNA_int_get(op->ptr, "event_type");
+ 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");
+
+ /*
+ mval[0]= rect.xmin;
+ mval[1]= rect.ymin;
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmin, &rectf.ymin);
+ mval[0]= rect.xmax;
+ mval[1]= rect.ymax;
+ 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);
+
+ /* get the first report if none found */
+ if(report_min==NULL) {
+ printf("find_min\n");
+ for(report=reports->list.first; report; report=report->next) {
+ if(report->type & report_mask) {
+ report_min= report;
+ break;
+ }
+ }
+ }
+
+ if(report_max==NULL) {
+ printf("find_max\n");
+ for(report=reports->list.last; report; report=report->prev) {
+ if(report->type & report_mask) {
+ report_max= report;
+ break;
+ }
+ }
+ }
+
+ if(report_min==NULL || report_max==NULL)
+ return OPERATOR_CANCELLED;
+
+ for(report= report_min; (report != report_max->next); report= report->next) {
+
+ if((report->type & report_mask)==0)
+ continue;
+
+ if(val==LEFTMOUSE) report->flag |= SELECT;
+ else report->flag &= ~SELECT;
+ }
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+
+/* ****** Border Select ****** */
+void CONSOLE_OT_select_border(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Border Select";
+ ot->description= "Toggle border selection.";
+ ot->idname= "CONSOLE_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;
+
+ /* flags */
+ /* ot->flag= OPTYPE_REGISTER; */
+
+ /* rna */
+ RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
+}
+
+
+
+static int report_delete_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ReportList *reports= CTX_wm_reports(C);
+ int report_mask= console_report_mask(sc);
+
+
+ Report *report, *report_next;
+
+ for(report=reports->list.first; report; ) {
+
+ report_next=report->next;
+
+ if((report->type & report_mask) && (report->flag & SELECT)) {
+ BLI_remlink(&reports->list, report);
+ MEM_freeN(report->message);
+ MEM_freeN(report);
+ }
+
+ report= report_next;
+ }
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_OT_report_delete(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Reports";
+ ot->description= "Delete selected reports.";
+ ot->idname= "CONSOLE_OT_report_delete";
+
+ /* api callbacks */
+ ot->poll= console_report_poll;
+ ot->exec= report_delete_exec;
+
+ /* flags */
+ /*ot->flag= OPTYPE_REGISTER;*/
+
+ /* properties */
+}
+
+
+static int report_copy_exec(bContext *C, wmOperator *op)
+{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ReportList *reports= CTX_wm_reports(C);
+ int report_mask= console_report_mask(sc);
+
+ Report *report;
+
+ DynStr *buf_dyn= BLI_dynstr_new();
+ char *buf_str;
+
+ for(report=reports->list.first; report; report= report->next) {
+ if((report->type & report_mask) && (report->flag & SELECT)) {
+ BLI_dynstr_append(buf_dyn, report->message);
+ BLI_dynstr_append(buf_dyn, "\n");
+ }
+ }
+
+ buf_str= BLI_dynstr_get_cstring(buf_dyn);
+ BLI_dynstr_free(buf_dyn);
+
+ WM_clipboard_text_set(buf_str, 0);
+
+ MEM_freeN(buf_str);
+ return OPERATOR_FINISHED;
+}
+
+void CONSOLE_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";
+
+ /* api callbacks */
+ ot->poll= console_report_poll;
+ ot->exec= report_copy_exec;
+
+ /* flags */
+ /*ot->flag= OPTYPE_REGISTER;*/
+
+ /* properties */
+}
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
new file mode 100644
index 00000000000..19fb575ed16
--- /dev/null
+++ b/source/blender/editors/space_console/space_console.c
@@ -0,0 +1,380 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+ #include <string.h>
+#include <stdio.h>
+
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_colortools.h"
+#include "BKE_context.h"
+#include "BKE_screen.h"
+
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "BIF_gl.h"
+
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#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)
+{
+ ARegion *ar;
+ SpaceConsole *sconsole;
+
+ sconsole= MEM_callocN(sizeof(SpaceConsole), "initconsole");
+ 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");
+
+ BLI_addtail(&sconsole->regionbase, ar);
+ ar->regiontype= RGN_TYPE_HEADER;
+ ar->alignment= RGN_ALIGN_BOTTOM;
+
+
+ /* main area */
+ ar= MEM_callocN(sizeof(ARegion), "main area for text");
+
+ BLI_addtail(&sconsole->regionbase, ar);
+ 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;
+
+ /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
+ //ar->v2d.keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM);
+
+ return (SpaceLink *)sconsole;
+}
+
+/* not spacelink itself */
+static void console_free(SpaceLink *sl)
+{
+ SpaceConsole *sc= (SpaceConsole*) sl;
+
+ while(sc->scrollback.first)
+ console_scrollback_free(sc, sc->scrollback.first);
+
+ while(sc->history.first)
+ console_history_free(sc, sc->history.first);
+}
+
+
+/* spacetype; init callback */
+static void console_init(struct wmWindowManager *wm, ScrArea *sa)
+{
+
+}
+
+static SpaceLink *console_duplicate(SpaceLink *sl)
+{
+ SpaceConsole *sconsolen= MEM_dupallocN(sl);
+
+ /* clear or remove stuff from old */
+
+ /* TODO - duplicate?, then we also need to duplicate the py namespace */
+ sconsolen->scrollback.first= sconsolen->scrollback.last= NULL;
+ sconsolen->history.first= sconsolen->history.last= NULL;
+
+ return (SpaceLink *)sconsolen;
+}
+
+
+
+/* add handlers, stuff you only do once or on area/region changes */
+static void console_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, "Console", SPACE_CONSOLE, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+}
+
+static void console_main_area_draw(const bContext *C, ARegion *ar)
+{
+ /* draw entirely, view changes should be handled here */
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ View2D *v2d= &ar->v2d;
+ View2DScrollers *scrollers;
+ //float col[3];
+
+ /* add helper text, why not? */
+ if(sc->scrollback.first==NULL) {
+ console_scrollback_add_str(C, " * Python Interactive Console *", 0);
+ console_scrollback_add_str(C, "Command History: Up/Down Arrow", 0);
+ console_scrollback_add_str(C, "Cursor: Left/Right Home/End", 0);
+ console_scrollback_add_str(C, "Remove: Backspace/Delete", 0);
+ console_scrollback_add_str(C, "Execute: Enter", 0);
+ console_scrollback_add_str(C, "Autocomplete: Ctrl+Space", 0);
+ console_scrollback_add_str(C, "Ctrl +/- Wheel: Zoom", 0);
+ console_scrollback_add_str(C, "Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.ui", 0);
+
+ /* This is normally set by python but to start with its easier just to set it like this rather then running python with no args */
+ strcpy(sc->prompt, ">>> ");
+ }
+
+ /* clear and setup matrix */
+ //UI_GetThemeColor3fv(TH_BACK, col);
+ //glClearColor(col[0], col[1], col[2], 0.0);
+ glClearColor(0, 0, 0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ console_update_rect(C, ar);
+
+ /* worlks best with no view2d matrix set */
+ UI_view2d_view_ortho(C, v2d);
+
+ /* data... */
+
+ console_history_verify(C); /* make sure we have some command line */
+ console_text_main(sc, 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 console_operatortypes(void)
+{
+ /* console_ops.c */
+ WM_operatortype_append(CONSOLE_OT_move);
+ WM_operatortype_append(CONSOLE_OT_delete);
+ WM_operatortype_append(CONSOLE_OT_insert);
+
+ /* for use by python only */
+ WM_operatortype_append(CONSOLE_OT_history_append);
+ WM_operatortype_append(CONSOLE_OT_scrollback_append);
+
+ WM_operatortype_append(CONSOLE_OT_clear);
+ WM_operatortype_append(CONSOLE_OT_history_cycle);
+ WM_operatortype_append(CONSOLE_OT_copy);
+ WM_operatortype_append(CONSOLE_OT_paste);
+ WM_operatortype_append(CONSOLE_OT_zoom);
+
+
+ /* 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 wmWindowManager *wm)
+{
+ wmKeyMap *keymap= WM_keymap_find(wm, "Console", SPACE_CONSOLE, 0);
+
+#ifdef __APPLE__
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END);
+#endif
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_zoom", WHEELUPMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_zoom", WHEELDOWNMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_zoom", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", 1);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_zoom", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1);
+
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR);
+
+ RNA_boolean_set(WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "reverse", 1);
+ WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", DOWNARROWKEY, KM_PRESS, 0, 0);
+
+ /*
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_LINE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_LINE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_PAGE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_PAGE);
+
+
+ //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", DKEY, KM_PRESS, KM_CTRL, 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);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
+ */
+
+ 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
+ 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);
+
+ //WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", TABKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */
+ 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);
+
+ RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* 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)
+{
+ ED_region_header_init(ar);
+}
+
+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)
+{
+ SpaceConsole *sc= 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);
+ }
+ break;
+ }
+}
+
+/* only called once, from space/spacetypes.c */
+void ED_spacetype_console(void)
+{
+ SpaceType *sc= MEM_callocN(sizeof(SpaceType), "spacetype console");
+ ARegionType *art;
+
+ sc->spaceid= SPACE_CONSOLE;
+
+ sc->new= console_new;
+ sc->free= console_free;
+ sc->init= console_init;
+ sc->duplicate= console_duplicate;
+ sc->operatortypes= console_operatortypes;
+ sc->keymap= console_keymap;
+ sc->listener= console_main_area_listener;
+
+ /* regions: main window */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype console region");
+ art->regionid = RGN_TYPE_WINDOW;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+
+ art->init= console_main_area_init;
+ art->draw= console_main_area_draw;
+
+
+
+
+ BLI_addhead(&sc->regiontypes, art);
+
+ /* regions: header */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype console region");
+ art->regionid = RGN_TYPE_HEADER;
+ art->minsizey= HEADERY;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+
+ art->init= console_header_area_init;
+ art->draw= console_header_area_draw;
+
+ BLI_addhead(&sc->regiontypes, art);
+
+
+ BKE_spacetype_register(sc);
+}
diff --git a/source/blender/editors/space_file/Makefile b/source/blender/editors/space_file/Makefile
index 2f4180448e5..43b2f09ed2d 100644
--- a/source/blender/editors/space_file/Makefile
+++ b/source/blender/editors/space_file/Makefile
@@ -59,3 +59,7 @@ ifeq ($(WITH_OPENJPEG),true)
CPPFLAGS += -DWITH_OPENJPEG
endif
+ifeq ($(WITH_OPENEXR), true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
+
diff --git a/source/blender/editors/space_file/SConscript b/source/blender/editors/space_file/SConscript
index 36e042bdaa6..e6fba38fb8f 100644
--- a/source/blender/editors/space_file/SConscript
+++ b/source/blender/editors/space_file/SConscript
@@ -12,5 +12,7 @@ defs = []
if env['WITH_BF_OPENJPEG']:
defs.append('WITH_OPENJPEG')
+if env['WITH_BF_OPENEXR']:
+ defs.append('WITH_OPENEXR')
env.BlenderLib ( 'bf_editors_space_file', sources, Split(incs), defs, libtype=['core'], priority=[115] )
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index bb47d3458fe..46ed6987752 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -81,6 +81,7 @@
/* ui geometry */
#define IMASEL_BUTTONS_HEIGHT 40
+#define IMASEL_BUTTONS_MARGIN 6
#define TILE_BORDER_X 8
#define TILE_BORDER_Y 8
@@ -90,6 +91,8 @@ enum {
B_FS_EXEC,
B_FS_CANCEL,
B_FS_PARENT,
+ B_FS_DIRNAME,
+ B_FS_FILENAME
} eFile_ButEvents;
@@ -105,68 +108,130 @@ static void do_file_buttons(bContext *C, void *arg, int event)
case B_FS_PARENT:
file_parent_exec(C, NULL); /* file_ops.c */
break;
+ case B_FS_FILENAME:
+ file_filename_exec(C, NULL);
+ break;
+ case B_FS_DIRNAME:
+ file_directory_exec(C, NULL);
+ break;
}
}
-/* note; this function uses pixelspace (0, 0, winx, winy), not view2d */
+/* Note: This function uses pixelspace (0, 0, winx, winy), not view2d.
+ * The controls are laid out as follows:
+ *
+ * -------------------------------------------
+ * | Directory input | execute |
+ * -------------------------------------------
+ * | Filename input | + | - | cancel |
+ * -------------------------------------------
+ *
+ * The input widgets will stretch to fill any excess space.
+ * When there isn't enough space for all controls to be shown, they are
+ * hidden in this order: x/-, execute/cancel, input widgets.
+ */
void file_draw_buttons(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ /* Button layout. */
+ const short min_x = 10;
+ const short max_x = ar->winx - 10;
+ const short line1_y = IMASEL_BUTTONS_HEIGHT/2 + IMASEL_BUTTONS_MARGIN*2;
+ const short line2_y = IMASEL_BUTTONS_MARGIN;
+ const short input_minw = 20;
+ const short btn_h = UI_UNIT_Y;
+ const short btn_fn_w = UI_UNIT_X;
+ const short btn_minw = 80;
+ const short btn_margin = 20;
+ const short separator = 4;
+
+ /* Additional locals. */
+ char name[20];
+ short loadbutton;
+ short fnumbuttons;
+ short available_w = max_x - min_x;
+ short line1_w = available_w;
+ short line2_w = available_w;
+
+ uiBut* but;
+ uiBlock* block;
+ SpaceFile* sfile = CTX_wm_space_file(C);
FileSelectParams* params = ED_fileselect_get_params(sfile);
- uiBlock *block;
- int loadbutton;
- char name[20];
- float slen;
- int filebuty1, filebuty2;
-
- float xmin = 8;
- float xmax = ar->winx - 10;
-
- filebuty1= ar->winy - IMASEL_BUTTONS_HEIGHT - 12;
- filebuty2= filebuty1 + IMASEL_BUTTONS_HEIGHT/2 + 4;
-
- /* HEADER */
+
+ /* Initialize UI block. */
sprintf(name, "win %p", ar);
block = uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_file_buttons, NULL);
-
- /* XXXX
- uiSetButLock( filelist_gettype(simasel->files)==FILE_MAIN && simasel->returnfunc, NULL);
- */
-
- /* space available for load/save buttons? */
- slen = UI_GetStringWidth(sfile->params->title);
- loadbutton= slen > 60 ? slen + 20 : MAX2(80, 20+UI_GetStringWidth(params->title));
- if(ar->winx > loadbutton+20) {
- if(params->title[0]==0) {
- loadbutton= 0;
- }
+
+ /* Is there enough space for the execute / cancel buttons? */
+ loadbutton = UI_GetStringWidth(sfile->params->title) + btn_margin;
+ if (loadbutton < btn_minw) {
+ loadbutton = MAX2(btn_minw,
+ btn_margin + UI_GetStringWidth(params->title));
}
- else {
- loadbutton= 0;
+
+ if (available_w <= loadbutton + separator + input_minw
+ || params->title[0] == 0) {
+ loadbutton = 0;
+ } else {
+ line1_w -= (loadbutton + separator);
+ line2_w = line1_w;
}
- uiDefBut(block, TEX, 0 /* XXX B_FS_FILENAME */,"", xmin+2, filebuty1, xmax-xmin-loadbutton-4, 21, params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- uiDefBut(block, TEX, 0 /* XXX B_FS_DIRNAME */,"", xmin+2, filebuty2, xmax-xmin-loadbutton-4, 21, params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ /* Is there enough space for file number increment/decrement buttons? */
+ fnumbuttons = 2 * btn_fn_w;
+ if (!loadbutton || line2_w <= fnumbuttons + separator + input_minw) {
+ fnumbuttons = 0;
+ } else {
+ line2_w -= (fnumbuttons + separator);
+ }
+
+ /* Text input fields for directory and file. */
+ if (available_w > 0) {
+ but = uiDefBut(block, TEX, B_FS_DIRNAME, "",
+ min_x, line1_y, line1_w, btn_h,
+ params->dir, 0.0, (float)FILE_MAX-1, 0, 0,
+ "File path.");
+ uiButSetCompleteFunc(but, autocomplete_directory, NULL);
+ uiDefBut(block, TEX, B_FS_FILENAME, "",
+ min_x, line2_y, line2_w, btn_h,
+ params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0,
+ "File name.");
+ }
+
+ /* Filename number increment / decrement buttons. */
+ if (fnumbuttons) {
+ uiBlockBeginAlign(block);
+ but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT,
+ min_x + line2_w + separator, line2_y,
+ btn_fn_w, btn_h,
+ "Decrement the filename number.");
+ RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", -1);
+
+ but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN,
+ min_x + line2_w + separator + btn_fn_w, line2_y,
+ btn_fn_w, btn_h,
+ "Increment the filename number.");
+ RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", 1);
+ uiBlockEndAlign(block);
+ }
+ /* Execute / cancel buttons. */
if(loadbutton) {
- uiDefBut(block, BUT, B_FS_EXEC, params->title, xmax-loadbutton, filebuty2, loadbutton, 21, params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- uiDefBut(block, BUT, B_FS_CANCEL, "Cancel", xmax-loadbutton, filebuty1, loadbutton, 21, params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ uiDefBut(block, BUT, B_FS_EXEC, params->title,
+ max_x - loadbutton, line1_y, loadbutton, btn_h,
+ params->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, params->title);
+ uiDefBut(block, BUT, B_FS_CANCEL, "Cancel",
+ max_x - loadbutton, line2_y, loadbutton, btn_h,
+ params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "Cancel.");
}
-
+
uiEndBlock(C, block);
uiDrawBlock(C, block);
}
static void draw_tile(short sx, short sy, short width, short height, int colorid, int shade)
-{
- /* TODO: BIF_ThemeColor seems to need this to show the color, not sure why? - elubie */
- //glEnable(GL_BLEND);
- //glColor4ub(0, 0, 0, 100);
- //glDisable(GL_BLEND);
- /* I think it was a missing glDisable() - ton */
-
+{
UI_ThemeColorShade(colorid, shade);
uiSetRoundBox(15);
uiRoundBox(sx, sy - height, sx + width, sy, 6);
@@ -281,66 +346,16 @@ static void file_draw_string(short sx, short sy, const char* string, float width
void file_calc_previews(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
View2D *v2d= &ar->v2d;
ED_fileselect_init_layout(sfile, ar);
UI_view2d_totRect_set(v2d, sfile->layout->width, sfile->layout->height);
}
-void file_draw_previews(const bContext *C, ARegion *ar)
+static void file_draw_preview(short sx, short sy, ImBuf *imb, FileLayout *layout, short dropshadow)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
- FileSelectParams* params= ED_fileselect_get_params(sfile);
- FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
- View2D *v2d= &ar->v2d;
- struct FileList* files = sfile->files;
- int numfiles;
- struct direntry *file;
- short sx, sy;
- ImBuf* imb=0;
- int i;
- int colorid = 0;
- int offset;
- int is_icon;
-
- if (!files) return;
-
- filelist_imgsize(files,sfile->layout->prv_w,sfile->layout->prv_h);
- numfiles = filelist_numfiles(files);
-
- sx = v2d->cur.xmin + layout->tile_border_x;
- sy = v2d->cur.ymax - layout->tile_border_y;
-
- offset = ED_fileselect_layout_offset(layout, 0, 0);
- if (offset<0) offset=0;
- for (i=offset; (i < numfiles) && (i < (offset+(layout->rows+2)*layout->columns)); ++i)
- {
- ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
- sx += v2d->tot.xmin+2;
- sy = v2d->tot.ymax - sy;
- file = filelist_file(files, i);
-
- if (file->flags & ACTIVE) {
- colorid = TH_HILITE;
- draw_tile(sx - 1, sy, sfile->layout->tile_w + 1, sfile->layout->tile_h, colorid,0);
- } else if (params->active_file == i) {
- colorid = TH_ACTIVE;
- draw_tile(sx - 1, sy, sfile->layout->tile_w + 1, sfile->layout->tile_h, colorid,0);
- }
-
- if ( (file->flags & IMAGEFILE) /* || (file->flags & MOVIEFILE) */)
- {
- filelist_loadimage(files, i);
- }
- is_icon = 0;
- imb = filelist_getimage(files, i);
- if (!imb) {
- imb = filelist_geticon(files,i);
- is_icon = 1;
- }
-
- if (imb) {
+ if (imb) {
float fx, fy;
float dx, dy;
short xco, yco;
@@ -368,15 +383,15 @@ void file_draw_previews(const bContext *C, ARegion *ar)
ey = (short)scaledy;
fx = ((float)layout->prv_w - (float)ex)/2.0f;
fy = ((float)layout->prv_h - (float)ey)/2.0f;
- dx = (fx + 0.5f + sfile->layout->prv_border_x);
- dy = (fy + 0.5f - sfile->layout->prv_border_y);
+ dx = (fx + 0.5f + layout->prv_border_x);
+ dy = (fy + 0.5f - layout->prv_border_y);
xco = (float)sx + dx;
- yco = (float)sy - sfile->layout->prv_h + dy;
+ yco = (float)sy - layout->prv_h + dy;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* shadow */
- if (!is_icon && (file->flags & IMAGEFILE))
+ if (dropshadow)
uiDrawBoxShadow(220, xco, yco, xco + ex, yco + ey);
glEnable(GL_BLEND);
@@ -386,7 +401,7 @@ void file_draw_previews(const bContext *C, ARegion *ar)
glaDrawPixelsTexScaled(xco, yco, imb->x, imb->y, GL_UNSIGNED_BYTE, imb->rect, scale, scale);
/* border */
- if (!is_icon && (file->flags & IMAGEFILE)) {
+ if (dropshadow) {
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
fdrawbox(xco, yco, xco + ex, yco + ey);
}
@@ -394,58 +409,85 @@ void file_draw_previews(const bContext *C, ARegion *ar)
glDisable(GL_BLEND);
imb = 0;
}
+}
- /* shadow */
- UI_ThemeColorShade(TH_BACK, -20);
-
-
- if (S_ISDIR(file->type)) {
- glColor4f(1.0f, 1.0f, 0.9f, 1.0f);
- }
- else if (file->flags & IMAGEFILE) {
- UI_ThemeColor(TH_SEQ_IMAGE);
- }
- else if (file->flags & MOVIEFILE) {
- UI_ThemeColor(TH_SEQ_MOVIE);
- }
- else if (file->flags & BLENDERFILE) {
- UI_ThemeColor(TH_SEQ_SCENE);
- }
- else {
- if (params->active_file == i) {
- UI_ThemeColor(TH_GRID); /* grid used for active text */
- } else if (file->flags & ACTIVE) {
- UI_ThemeColor(TH_TEXT_HI);
- } else {
- UI_ThemeColor(TH_TEXT);
- }
- }
+static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
+{
+ char newname[FILE_MAX+12];
+ char orgname[FILE_MAX+12];
+ char filename[FILE_MAX+12];
+ SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ ARegion* ar = CTX_wm_region(C);
- file_draw_string(sx + layout->prv_border_x, sy+4, file->relname, layout->tile_w, layout->tile_h, FILE_SHORTEN_END);
+ struct direntry *file = (struct direntry *)arg1;
- if (!sfile->loadimage_timer)
- sfile->loadimage_timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER1, 1.0/30.0); /* max 30 frames/sec. */
+ BLI_make_file_string(G.sce, orgname, sfile->params->dir, oldname);
+ BLI_strncpy(filename, file->relname, sizeof(filename));
+ BLI_make_file_string(G.sce, newname, sfile->params->dir, filename);
+ if( strcmp(orgname, newname) != 0 ) {
+ if (!BLI_exists(newname)) {
+ BLI_rename(orgname, newname);
+ /* to make sure we show what is on disk */
+ filelist_free(sfile->files);
+ } else {
+ BLI_strncpy(file->relname, oldname, strlen(oldname)+1);
+ }
+
+ ED_region_tag_redraw(ar);
}
+}
+
+
+static void draw_background(FileLayout *layout, View2D *v2d)
+{
+ int i;
+ short sy;
- uiSetRoundBox(0);
+ /* alternating flat shade background */
+ for (i=0; (i <= layout->rows); i+=2)
+ {
+ sy = v2d->cur.ymax - i*(layout->tile_h+2*layout->tile_border_y) - layout->tile_border_y;
+
+ UI_ThemeColorShade(TH_BACK, -7);
+ glRectf(v2d->cur.xmin, sy, v2d->cur.xmax, sy+layout->tile_h+2*layout->tile_border_y);
+
+ }
}
+static void draw_dividers(FileLayout *layout, View2D *v2d)
+{
+ short sx;
+
+ /* vertical column dividers */
+ sx = v2d->tot.xmin;
+ while (sx < v2d->cur.xmax) {
+ sx += (layout->tile_w+2*layout->tile_border_x);
+
+ UI_ThemeColorShade(TH_BACK, 30);
+ sdrawline(sx+1, v2d->cur.ymax - layout->tile_border_y , sx+1, v2d->cur.ymin);
+ UI_ThemeColorShade(TH_BACK, -30);
+ sdrawline(sx, v2d->cur.ymax - layout->tile_border_y , sx, v2d->cur.ymin);
+ }
+}
void file_draw_list(const bContext *C, ARegion *ar)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams* params = ED_fileselect_get_params(sfile);
FileLayout* layout= ED_fileselect_get_layout(sfile, ar);
View2D *v2d= &ar->v2d;
struct FileList* files = sfile->files;
struct direntry *file;
+ ImBuf *imb;
int numfiles;
+ int numfiles_layout;
int colorid = 0;
short sx, sy;
int offset;
int i;
float sw, spos;
+ short is_icon;
numfiles = filelist_numfiles(files);
@@ -455,84 +497,108 @@ void file_draw_list(const bContext *C, ARegion *ar)
offset = ED_fileselect_layout_offset(layout, 0, 0);
if (offset<0) offset=0;
- /* alternating flat shade background */
- for (i=0; (i <= layout->rows); i+=2)
- {
- sx = v2d->cur.xmin;
- sy = v2d->cur.ymax - i*(layout->tile_h+2*layout->tile_border_y) - layout->tile_border_y;
+ if (params->display != FILE_IMGDISPLAY) {
- UI_ThemeColorShade(TH_BACK, -7);
- glRectf(v2d->cur.xmin, sy, v2d->cur.xmax, sy+layout->tile_h+2*layout->tile_border_y);
-
- }
+ draw_background(layout, v2d);
- /* vertical column dividers */
- sx = v2d->tot.xmin;
- while (sx < ar->v2d.cur.xmax) {
- sx += (sfile->layout->tile_w+2*sfile->layout->tile_border_x);
-
- UI_ThemeColorShade(TH_BACK, 30);
- sdrawline(sx+1, ar->v2d.cur.ymax - layout->tile_border_y , sx+1, ar->v2d.cur.ymin);
- UI_ThemeColorShade(TH_BACK, -30);
- sdrawline(sx, ar->v2d.cur.ymax - layout->tile_border_y , sx, ar->v2d.cur.ymin);
+ draw_dividers(layout, v2d);
}
sx = ar->v2d.cur.xmin + layout->tile_border_x;
sy = ar->v2d.cur.ymax - layout->tile_border_y;
+
+ numfiles_layout = ED_fileselect_layout_numfiles(layout, ar);
- for (i=offset; (i < numfiles); ++i)
+ for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i)
{
ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
sx += v2d->tot.xmin+2;
sy = v2d->tot.ymax - sy;
file = filelist_file(files, i);
-
- if (params->active_file == i) {
- if (file->flags & ACTIVE) colorid= TH_HILITE;
- else colorid = TH_BACK;
- draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,20);
- } else if (file->flags & ACTIVE) {
- colorid = TH_HILITE;
- draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,0);
- }
+
+ if (!(file->flags & EDITING)) {
+ if (params->active_file == i) {
+ if (file->flags & ACTIVE) colorid= TH_HILITE;
+ else colorid = TH_BACK;
+ draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,20);
+ } else if (file->flags & ACTIVE) {
+ colorid = TH_HILITE;
+ draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,0);
+ }
+ }
spos = sx;
- file_draw_icon(spos, sy-3, get_file_icon(file), ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH);
- spos += ICON_DEFAULT_WIDTH + 4;
-
+
+ if ( FILE_IMGDISPLAY == params->display ) {
+ if ( (file->flags & IMAGEFILE) /* || (file->flags & MOVIEFILE) */) {
+ filelist_loadimage(files, i);
+ }
+ is_icon = 0;
+ imb = filelist_getimage(files, i);
+ if (!imb) {
+ imb = filelist_geticon(files,i);
+ is_icon = 1;
+ }
+
+ file_draw_preview(sx, sy, imb, layout, !is_icon && (file->flags & IMAGEFILE));
+
+ } else {
+ file_draw_icon(spos, sy-3, get_file_icon(file), ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH);
+ spos += ICON_DEFAULT_WIDTH + 4;
+ }
+
UI_ThemeColor4(TH_TEXT);
-
+
sw = file_string_width(file->relname);
- file_draw_string(spos, sy, file->relname, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_NAME] + 12;
- if (params->display == FILE_SHOWSHORT) {
+ if (file->flags & EDITING) {
+ short but_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
+ uiBlock *block = uiBeginBlock(C, ar, "FileName", UI_EMBOSS);
+ uiBut *but = uiDefBut(block, TEX, 1, "", spos, sy-layout->tile_h-3,
+ but_width, layout->textheight*2, file->relname, 1.0f, (float)FILE_MAX,0,0,"");
+ uiButSetRenameFunc(but, renamebutton_cb, file);
+ if ( 0 == uiButActiveOnly(C, block, but)) {
+ file->flags &= ~EDITING;
+ }
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+ } else {
+ 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);
+ }
+
+ uiSetRoundBox(0);
+
+ if (params->display == FILE_SHORTDISPLAY) {
+ spos += layout->column_widths[COLUMN_NAME] + 12;
if (!(file->type & S_IFDIR)) {
sw = file_string_width(file->size);
spos += layout->column_widths[COLUMN_SIZE] + 12 - sw;
file_draw_string(spos, sy, file->size, sw+1, layout->tile_h, FILE_SHORTEN_END);
}
- } else {
-#if 0 // XXX TODO: add this for non-windows systems
+ } else if (params->display == FILE_LONGDISPLAY) {
+ spos += layout->column_widths[COLUMN_NAME] + 12;
+
+#ifndef WIN32
/* rwx rwx rwx */
spos += 20;
- sw = UI_GetStringWidth(file->mode1);
- file_draw_string(spos, sy, file->mode1, sw, layout->tile_h);
-
- spos += 30;
- sw = UI_GetStringWidth(file->mode2);
- file_draw_string(spos, sy, file->mode2, sw, layout->tile_h);
+ 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;
- spos += 30;
- sw = UI_GetStringWidth(file->mode3);
- file_draw_string(spos, sy, file->mode3, sw, layout->tile_h);
-
- spos += 30;
- sw = UI_GetStringWidth(file->owner);
- file_draw_string(spos, sy, file->owner, sw, layout->tile_h);
+ 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;
+
+ 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;
+
+ 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;
#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;
@@ -548,134 +614,9 @@ void file_draw_list(const bContext *C, ARegion *ar)
}
}
}
-}
-
-static void file_draw_fsmenu_category_name(ARegion *ar, const char *category_name, short *starty)
-{
- short sx, sy;
- int bmwidth = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*TILE_BORDER_X - ICON_DEFAULT_WIDTH - 4;
- int fontsize = file_font_pointsize();
-
- sx = ar->v2d.cur.xmin + TILE_BORDER_X;
- sy = *starty;
-
- UI_ThemeColor(TH_TEXT_HI);
- file_draw_string(sx, sy, category_name, bmwidth, fontsize, FILE_SHORTEN_END);
-
- sy -= fontsize*2.0f;
-
- *starty= sy;
-}
-
-static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCategory category, short *starty)
-{
- struct FSMenu* fsmenu = fsmenu_get();
- char bookmark[FILE_MAX];
- int nentries = fsmenu_get_nentries(fsmenu, category);
-
- short sx, sy, xpos, ypos;
- int bmwidth = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*TILE_BORDER_X - ICON_DEFAULT_WIDTH - 4;
- int fontsize = file_font_pointsize();
- int cat_icon;
- int i;
-
- sx = ar->v2d.cur.xmin + TILE_BORDER_X;
- sy = *starty;
-
- switch(category) {
- case FS_CATEGORY_SYSTEM:
- cat_icon = ICON_DISK_DRIVE; break;
- case FS_CATEGORY_BOOKMARKS:
- cat_icon = ICON_BOOKMARKS; break;
- case FS_CATEGORY_RECENT:
- cat_icon = ICON_FILE_FOLDER; break;
- }
-
- for (i=0; i< nentries && (sy > ar->v2d.cur.ymin) ;++i) {
- char *fname = fsmenu_get_entry(fsmenu, category, i);
-
- if (fname) {
- int sl;
- BLI_strncpy(bookmark, fname, FILE_MAX);
-
- sl = strlen(bookmark)-1;
- if (sl > 1) {
- while (bookmark[sl] == '\\' || bookmark[sl] == '/') {
- bookmark[sl] = '\0';
- sl--;
- }
- }
-
- if (fsmenu_is_selected(fsmenu, category, i) ) {
- UI_ThemeColor(TH_HILITE);
- uiRoundBox(sx, sy - fontsize*2.0f, ar->v2d.cur.xmax - TILE_BORDER_X, sy, 4.0f);
- UI_ThemeColor(TH_TEXT);
- } else {
- UI_ThemeColor(TH_TEXT_HI);
- }
-
- xpos = sx;
- ypos = sy - (TILE_BORDER_Y * 0.5);
-
- file_draw_icon(xpos, ypos, cat_icon, ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH);
- xpos += ICON_DEFAULT_WIDTH + 4;
- file_draw_string(xpos, ypos, bookmark, bmwidth, fontsize, FILE_SHORTEN_FRONT);
- sy -= fontsize*2.0;
- fsmenu_set_pos(fsmenu, category, i, xpos, ypos);
- }
- }
- *starty = sy;
+ if (!sfile->loadimage_timer)
+ sfile->loadimage_timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER1, 1.0/30.0); /* max 30 frames/sec. */
}
-void file_draw_fsmenu_operator(const bContext *C, ARegion *ar, wmOperator *op, short *starty)
-{
- uiStyle *style= U.uistyles.first;
- uiBlock *block;
- uiLayout *layout;
- int sy;
-
- sy= *starty;
-
- block= uiBeginBlock(C, ar, "file_options", UI_EMBOSS);
- layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, TILE_BORDER_X, sy, ar->winx-2*TILE_BORDER_X, 20, style);
-
- RNA_STRUCT_BEGIN(op->ptr, prop) {
- if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
- continue;
- if(strcmp(RNA_property_identifier(prop), "filename") == 0)
- continue;
-
- uiItemFullR(layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0);
- }
- RNA_STRUCT_END;
-
- uiBlockLayoutResolve(C, block, NULL, &sy);
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-
- *starty= sy;
-}
-
-void file_draw_fsmenu(const bContext *C, ARegion *ar)
-{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
- int linestep = file_font_pointsize()*2.0f;
- short sy= ar->v2d.cur.ymax-2*TILE_BORDER_Y;
-
- file_draw_fsmenu_category_name(ar, "SYSTEM", &sy);
- file_draw_fsmenu_category(C, ar, FS_CATEGORY_SYSTEM, &sy);
- sy -= linestep;
- file_draw_fsmenu_category_name(ar, "BOOKMARKS", &sy);
- file_draw_fsmenu_category(C, ar, FS_CATEGORY_BOOKMARKS, &sy);
- sy -= linestep;
- file_draw_fsmenu_category_name(ar, "RECENT", &sy);
- file_draw_fsmenu_category(C, ar, FS_CATEGORY_RECENT, &sy);
-
- if(sfile->op) {
- sy -= linestep;
- file_draw_fsmenu_category_name(ar, "OPTIONS", &sy);
- file_draw_fsmenu_operator(C, ar, sfile->op, &sy);
- }
-}
diff --git a/source/blender/editors/space_file/file_header.c b/source/blender/editors/space_file/file_header.c
deleted file mode 100644
index 4799003d6c7..00000000000
--- a/source/blender/editors/space_file/file_header.c
+++ /dev/null
@@ -1,187 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <stdio.h>
-
-#include "DNA_space_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_windowmanager_types.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-
-#include "BKE_context.h"
-#include "BKE_screen.h"
-#include "BKE_global.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-#include "ED_fileselect.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "file_intern.h"
-#include "filelist.h"
-
-#define B_SORTIMASELLIST 1
-#define B_RELOADIMASELDIR 2
-#define B_FILTERIMASELDIR 3
-#define B_HIDEDOTFILES 4
-
-/* ************************ header area region *********************** */
-
-static void do_file_header_buttons(bContext *C, void *arg, int event)
-{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
- switch(event) {
- case B_SORTIMASELLIST:
- filelist_sort(sfile->files, sfile->params->sort);
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- break;
- case B_RELOADIMASELDIR:
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- break;
- case B_FILTERIMASELDIR:
- if(sfile->params) {
- if (sfile->params->flag & FILE_FILTER) {
- filelist_setfilter(sfile->files,sfile->params->filter);
- filelist_filter(sfile->files);
- } else {
- filelist_setfilter(sfile->files,0);
- filelist_filter(sfile->files);
- }
- }
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- break;
- case B_HIDEDOTFILES:
- if(sfile->params) {
- filelist_free(sfile->files);
- filelist_hidedot(sfile->files, sfile->params->flag & FILE_HIDE_DOT);
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- }
- break;
- }
-}
-
-
-void file_header_buttons(const bContext *C, ARegion *ar)
-{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
- FileSelectParams* params = ED_fileselect_get_params(sfile);
-
- uiBlock *block;
- int xco, yco= 3;
- int xcotitle;
-
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_file_header_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- /*
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, 24, "");
- xco+=XIC+xmax;
- }
- */
-
- xco += 5;
-
- uiBlockBeginAlign(block);
- uiDefIconButO(block, BUT, "FILE_OT_parent", WM_OP_INVOKE_DEFAULT, ICON_FILE_PARENT, xco+=XIC, yco, 20, 20, "Navigate to Parent Folder");
- uiDefIconButO(block, BUT, "FILE_OT_refresh", WM_OP_INVOKE_DEFAULT, ICON_FILE_REFRESH, xco+=XIC, yco, 20, 20, "Refresh List of Files");
- uiBlockEndAlign(block);
-
- xco += 5;
-
- uiBlockBeginAlign(block);
- uiDefIconButS(block, ROW, B_RELOADIMASELDIR, ICON_SHORTDISPLAY, xco+=XIC, yco, XIC,YIC, &params->display, 1.0, FILE_SHORTDISPLAY, 0, 0, "Displays short file description");
- uiDefIconButS(block, ROW, B_RELOADIMASELDIR, ICON_LONGDISPLAY, xco+=XIC, yco, XIC,YIC, &params->display, 1.0, FILE_LONGDISPLAY, 0, 0, "Displays long file description");
- uiDefIconButS(block, ROW, B_RELOADIMASELDIR, ICON_IMGDISPLAY, xco+=XIC, yco, XIC,YIC, &params->display, 1.0, FILE_IMGDISPLAY, 0, 0, "Displays files as thumbnails");
- uiBlockEndAlign(block);
-
- xco+=XIC;
-
-
- uiBlockBeginAlign(block);
- uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTALPHA, xco+=XIC, yco, XIC,YIC, &params->sort, 1.0, 0.0, 0, 0, "Sorts files alphabetically");
- uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTBYEXT, xco+=XIC, yco, XIC,YIC, &params->sort, 1.0, 3.0, 0, 0, "Sorts files by extension");
- uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTTIME, xco+=XIC, yco, XIC,YIC, &params->sort, 1.0, 1.0, 0, 0, "Sorts files by time");
- uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTSIZE, xco+=XIC, yco, XIC,YIC, &params->sort, 1.0, 2.0, 0, 0, "Sorts files by size");
- uiBlockEndAlign(block);
-
- xco+=XIC;
- uiDefIconButBitS(block, TOG, FILE_HIDE_DOT, B_HIDEDOTFILES, ICON_GHOST,xco+=XIC,yco,XIC,YIC, &params->flag, 0, 0, 0, 0, "Hide dot files");
- xco+=XIC;
- uiDefIconButBitS(block, TOG, FILE_FILTER, B_FILTERIMASELDIR, ICON_FILTER,xco+=XIC,yco,XIC,YIC, &params->flag, 0, 0, 0, 0, "Filter files");
-
- if (params->flag & FILE_FILTER) {
- xco+=4;
- uiBlockBeginAlign(block);
- uiDefIconButBitS(block, TOG, IMAGEFILE, B_FILTERIMASELDIR, ICON_FILE_IMAGE,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show images");
- uiDefIconButBitS(block, TOG, BLENDERFILE, B_FILTERIMASELDIR, ICON_FILE_BLEND,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show .blend files");
- uiDefIconButBitS(block, TOG, MOVIEFILE, B_FILTERIMASELDIR, ICON_FILE_MOVIE,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show movies");
- uiDefIconButBitS(block, TOG, PYSCRIPTFILE, B_FILTERIMASELDIR, ICON_FILE_SCRIPT,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show python scripts");
- uiDefIconButBitS(block, TOG, FTFONTFILE, B_FILTERIMASELDIR, ICON_FILE_FONT,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show fonts");
- uiDefIconButBitS(block, TOG, SOUNDFILE, B_FILTERIMASELDIR, ICON_FILE_SOUND,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show sound files");
- uiDefIconButBitS(block, TOG, TEXTFILE, B_FILTERIMASELDIR, ICON_FILE_BLANK,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show text files");
- uiDefIconButBitS(block, TOG, FOLDERFILE, B_FILTERIMASELDIR, ICON_FILE_FOLDER,xco+=XIC,yco,XIC,YIC, &params->filter, 0, 0, 0, 0, "Show folders");
- uiBlockEndAlign(block);
- xco+=XIC;
- }
-
- xcotitle= xco;
- xco+= UI_GetStringWidth(params->title);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
-
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index 642189ad3fd..a99594e9575 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -30,9 +30,9 @@
/* internal exports only */
-
-/* file_header.c */
-void file_header_buttons(const bContext *C, ARegion *ar);
+struct ARegion;
+struct ARegionType;
+struct SpaceFile;
/* file_ops.c */
struct ARegion *file_buttons_region(struct ScrArea *sa);
@@ -45,7 +45,6 @@ void file_draw_buttons(const bContext *C, ARegion *ar);
void file_calc_previews(const bContext *C, ARegion *ar);
void file_draw_previews(const bContext *C, ARegion *ar);
void file_draw_list(const bContext *C, ARegion *ar);
-void file_draw_fsmenu(const bContext *C, ARegion *ar);
/* file_ops.h */
struct wmOperatorType;
@@ -56,21 +55,45 @@ void FILE_OT_select(struct wmOperatorType *ot);
void FILE_OT_select_all_toggle(struct wmOperatorType *ot);
void FILE_OT_select_border(struct wmOperatorType *ot);
void FILE_OT_select_bookmark(struct wmOperatorType *ot);
+void FILE_OT_add_bookmark(struct wmOperatorType *ot);
+void FILE_OT_delete_bookmark(struct wmOperatorType *ot);
+void FILE_OT_hidedot(struct wmOperatorType *ot);
void FILE_OT_loadimages(struct wmOperatorType *ot);
-void FILE_OT_exec(struct wmOperatorType *ot);
+void FILE_OT_execute(struct wmOperatorType *ot);
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_previous(struct wmOperatorType *ot);
+void FILE_OT_next(struct wmOperatorType *ot);
void FILE_OT_refresh(struct wmOperatorType *ot);
void FILE_OT_bookmark_toggle(struct wmOperatorType *ot);
+void FILE_OT_filenum(struct wmOperatorType *ot);
+void FILE_OT_delete(struct wmOperatorType *ot);
+void FILE_OT_rename(struct wmOperatorType *ot);
int file_exec(bContext *C, struct wmOperator *unused);
int file_cancel_exec(bContext *C, struct wmOperator *unused);
int file_parent_exec(bContext *C, struct wmOperator *unused);
-int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my);
+int file_previous_exec(bContext *C, struct wmOperator *unused);
+int file_next_exec(bContext *C, struct wmOperator *unused);
+int file_filename_exec(bContext *C, struct wmOperator *unused);
+int file_directory_exec(bContext *C, struct wmOperator *unused);
+int file_directory_new_exec(bContext *C,struct wmOperator *unused);
+int file_delete_exec(bContext *C, struct wmOperator *unused);
+
+int file_hilight_set(struct SpaceFile *sfile, struct ARegion *ar, int mx, int my);
+
/* filesel.c */
float file_string_width(const char* str);
float file_font_pointsize();
+void file_change_dir(struct SpaceFile *sfile);
+int file_select_match(struct SpaceFile *sfile, const char *pattern);
+void autocomplete_directory(struct bContext *C, char *str, void *arg_v);
+
+/* file_panels.c */
+void file_panels_register(struct ARegionType *art);
#endif /* ED_FILE_INTERN_H */
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index ab02147d020..c717623696a 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -42,6 +42,8 @@
#include "ED_screen.h"
#include "ED_fileselect.h"
+#include "MEM_guardedalloc.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
@@ -66,25 +68,15 @@
/* ---------- FILE SELECTION ------------ */
-static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, short x, short y, short clamp)
+static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, short x, short y)
{
float fx,fy;
int active_file = -1;
- int numfiles = filelist_numfiles(sfile->files);
View2D* v2d = &ar->v2d;
UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
-
- if(active_file < 0) {
- if(clamp) active_file= 0;
- else active_file= -1;
- }
- else if(active_file >= numfiles) {
- if(clamp) active_file= numfiles-1;
- else active_file= -1;
- }
return active_file;
}
@@ -103,21 +95,54 @@ static void file_deselect_all(SpaceFile* sfile)
}
}
-static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val)
+typedef enum FileSelect { FILE_SELECT_DIR = 1,
+ FILE_SELECT_FILE = 2 } FileSelect;
+
+
+static void clamp_to_filelist(int numfiles, int *first_file, int *last_file)
+{
+ /* border select before the first file */
+ if ( (*first_file < 0) && (*last_file >=0 ) ) {
+ *first_file = 0;
+ }
+ /* don't select if everything is outside filelist */
+ if ( (*first_file >= numfiles) && ((*last_file < 0) || (*last_file >= numfiles)) ) {
+ *first_file = -1;
+ *last_file = -1;
+ }
+
+ /* fix if last file invalid */
+ if ( (*first_file > 0) && (*last_file < 0) )
+ *last_file = numfiles-1;
+
+ /* clamp */
+ if ( (*first_file >= numfiles) ) {
+ *first_file = numfiles-1;
+ }
+ if ( (*last_file >= numfiles) ) {
+ *last_file = numfiles-1;
+ }
+}
+
+static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val)
{
int first_file = -1;
int last_file = -1;
int act_file;
short selecting = (val == LEFTMOUSE);
+ FileSelect retval = FILE_SELECT_FILE;
+
FileSelectParams *params = ED_fileselect_get_params(sfile);
// FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
int numfiles = filelist_numfiles(sfile->files);
params->selstate = NOTACTIVE;
- first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax, 1);
- last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin, 1);
+ first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax);
+ last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin);
+ clamp_to_filelist(numfiles, &first_file, &last_file);
+
/* select all valid files between first and last indicated */
if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) {
for (act_file = first_file; act_file <= last_file; act_file++) {
@@ -129,6 +154,9 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v
}
}
+ /* Don't act on multiple selected files */
+ if (first_file != last_file) selecting= 0;
+
/* make the last file active */
if (selecting && (last_file >= 0 && last_file < numfiles)) {
struct direntry* file = filelist_file(sfile->files, last_file);
@@ -136,43 +164,32 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v
if(file && S_ISDIR(file->type)) {
/* the path is too long and we are not going up! */
- if (strcmp(file->relname, ".") &&
- strcmp(file->relname, "..") &&
- strlen(params->dir) + strlen(file->relname) >= FILE_MAX )
+ if (strcmp(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX )
{
// XXX error("Path too long, cannot enter this directory");
} else {
- if (strcmp(file->relname, "..")==0) {
- /* avoids /../../ */
- BLI_parent_dir(params->dir);
+ if (strcmp(file->relname, "..")==0) {
+ /* avoids /../../ */
+ BLI_parent_dir(params->dir);
} else {
- strcat(params->dir, file->relname);
- strcat(params->dir,"/");
- params->file[0] = '\0';
BLI_cleanup_dir(G.sce, params->dir);
+ strcat(params->dir, file->relname);
+ BLI_add_slash(params->dir);
}
- filelist_setdir(sfile->files, params->dir);
- filelist_free(sfile->files);
- params->active_file = -1;
+
+ file_change_dir(sfile);
+ retval = FILE_SELECT_DIR;
}
}
else if (file)
{
if (file->relname) {
BLI_strncpy(params->file, file->relname, FILE_MAXFILE);
- /* XXX
- if(event==MIDDLEMOUSE && filelist_gettype(sfile->files))
- imasel_execute(sfile);
- */
}
}
- /* XXX
- if(BIF_filelist_gettype(sfile->files)==FILE_MAIN) {
- active_imasel_object(sfile);
- }
- */
- }
+ }
+ return retval;
}
@@ -180,7 +197,7 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v
static int file_border_select_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
short val;
rcti rect;
@@ -192,8 +209,11 @@ static int file_border_select_exec(bContext *C, wmOperator *op)
BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect);
- file_select(sfile, ar, &rect, val );
- WM_event_add_notifier(C, NC_WINDOW, NULL);
+ if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val )) {
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+ } else {
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+ }
return OPERATOR_FINISHED;
}
@@ -221,21 +241,31 @@ void FILE_OT_select_border(wmOperatorType *ot)
static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
short val;
rcti rect;
+ if(ar->regiontype != RGN_TYPE_WINDOW)
+ return OPERATOR_CANCELLED;
+
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)) {
+ if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin))
+ return OPERATOR_CANCELLED;
+
+ /* single select, deselect all selected first */
+ file_deselect_all(sfile);
+
+ if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val ))
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+ else
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ WM_event_add_mousemove(C); /* for directory changes */
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
- /* single select, deselect all selected first */
- file_deselect_all(sfile);
- file_select(sfile, ar, &rect, val );
- WM_event_add_notifier(C, NC_WINDOW, NULL);
- }
return OPERATOR_FINISHED;
}
@@ -256,7 +286,7 @@ void FILE_OT_select(wmOperatorType *ot)
static int file_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
int numfiles = filelist_numfiles(sfile->files);
int i;
int select = 1;
@@ -299,93 +329,107 @@ void FILE_OT_select_all_toggle(wmOperatorType *ot)
/* ---------- BOOKMARKS ----------- */
-static int file_select_bookmark_category(SpaceFile* sfile, ARegion* ar, short x, short y, FSMenuCategory category)
+static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- struct FSMenu* fsmenu = fsmenu_get();
- int nentries = fsmenu_get_nentries(fsmenu, category);
- int linestep = file_font_pointsize()*2.0f;
- short xs, ys;
- int i;
- int selected = -1;
+ SpaceFile *sfile= CTX_wm_space_file(C);
- for (i=0; i < nentries; ++i) {
- fsmenu_get_pos(fsmenu, category, i, &xs, &ys);
- if ( (y<=ys) && (y>ys-linestep) ) {
- fsmenu_select_entry(fsmenu, category, i);
- selected = i;
- break;
- }
+ if(RNA_struct_find_property(op->ptr, "dir")) {
+ char entry[256];
+ FileSelectParams* params = sfile->params;
+
+ RNA_string_get(op->ptr, "dir", entry);
+ BLI_strncpy(params->dir, entry, sizeof(params->dir));
+ BLI_cleanup_dir(G.sce, params->dir);
+ file_change_dir(sfile);
+
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
}
- return selected;
+
+ return OPERATOR_FINISHED;
}
-static void file_select_bookmark(SpaceFile* sfile, ARegion* ar, short x, short y)
+void FILE_OT_select_bookmark(wmOperatorType *ot)
{
- float fx, fy;
- int selected;
- FSMenuCategory category = FS_CATEGORY_SYSTEM;
-
- if (BLI_in_rcti(&ar->v2d.mask, x, y)) {
- char *entry;
+ /* identifiers */
+ ot->name= "Select Directory";
+ ot->idname= "FILE_OT_select_bookmark";
+
+ /* api callbacks */
+ ot->invoke= bookmark_select_invoke;
+ ot->poll= ED_operator_file_active;
- UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
- selected = file_select_bookmark_category(sfile, ar, fx, fy, FS_CATEGORY_SYSTEM);
- if (selected<0) {
- category = FS_CATEGORY_BOOKMARKS;
- selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
- }
- if (selected<0) {
- category = FS_CATEGORY_RECENT;
- selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
- }
-
- if (selected>=0) {
- entry= fsmenu_get_entry(fsmenu_get(), category, selected);
- /* which string */
- if (entry) {
- FileSelectParams* params = sfile->params;
- BLI_strncpy(params->dir, entry, sizeof(params->dir));
- BLI_cleanup_dir(G.sce, params->dir);
- filelist_free(sfile->files);
- filelist_setdir(sfile->files, params->dir);
- params->file[0] = '\0';
- params->active_file = -1;
- }
- }
- }
+ RNA_def_string(ot->srna, "dir", "", 256, "Dir", "");
}
-static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int bookmark_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
-
- short x, y;
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ struct FSMenu* fsmenu = fsmenu_get();
+ struct FileSelectParams* params= ED_fileselect_get_params(sfile);
- x = event->x - ar->winrct.xmin;
- y = event->y - ar->winrct.ymin;
+ if (params->dir[0] != '\0') {
+ char name[FILE_MAX];
+
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir, 0, 1);
+ BLI_make_file_string("/", name, BLI_gethome(), ".Bfs");
+ fsmenu_write_file(fsmenu, name);
+ }
- file_select_bookmark(sfile, ar, x, y);
ED_area_tag_redraw(sa);
return OPERATOR_FINISHED;
}
-void FILE_OT_select_bookmark(wmOperatorType *ot)
+void FILE_OT_add_bookmark(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select Directory";
- ot->idname= "FILE_OT_select_bookmark";
+ ot->name= "Add Bookmark";
+ ot->idname= "FILE_OT_add_bookmark";
/* api callbacks */
- ot->invoke= bookmark_select_invoke;
+ ot->invoke= bookmark_add_invoke;
ot->poll= ED_operator_file_active;
}
+static int bookmark_delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ struct FSMenu* fsmenu = fsmenu_get();
+ int nentries = fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
+
+ if(RNA_struct_find_property(op->ptr, "index")) {
+ int index = RNA_int_get(op->ptr, "index");
+ if ( (index >-1) && (index < nentries)) {
+ char name[FILE_MAX];
+
+ fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index);
+ BLI_make_file_string("/", name, BLI_gethome(), ".Bfs");
+ fsmenu_write_file(fsmenu, name);
+ ED_area_tag_redraw(sa);
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_delete_bookmark(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Bookmark";
+ ot->idname= "FILE_OT_delete_bookmark";
+
+ /* api callbacks */
+ ot->invoke= bookmark_delete_invoke;
+ ot->poll= ED_operator_file_active;
+
+ RNA_def_int(ot->srna, "index", -1, -1, 20000, "Index", "", -1, 20000);
+}
+
+
static int loadimages_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
if (sfile->files) {
filelist_loadimage_timer(sfile->files);
if (filelist_changed(sfile->files)) {
@@ -412,31 +456,41 @@ void FILE_OT_loadimages(wmOperatorType *ot)
int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
{
FileSelectParams* params;
- int numfiles, actfile;
+ int numfiles, actfile, origfile;
if(sfile==NULL || sfile->files==NULL) return 0;
-
+
numfiles = filelist_numfiles(sfile->files);
params = ED_fileselect_get_params(sfile);
- actfile = find_file_mouse(sfile, ar, mx , my, 0);
-
- if (params && (actfile >= 0) && (actfile < numfiles) ) {
- params->active_file=actfile;
- return 1;
- }
- params->active_file= -1;
- return 0;
+ origfile= params->active_file;
+
+ mx -= ar->winrct.xmin;
+ my -= ar->winrct.ymin;
+
+ if(BLI_in_rcti(&ar->v2d.mask, mx, my)) {
+ actfile = find_file_mouse(sfile, ar, mx , my);
+
+ if((actfile >= 0) && (actfile < numfiles))
+ params->active_file=actfile;
+ else
+ params->active_file= -1;
+ }
+ else
+ params->active_file= -1;
+
+ return (params->active_file != origfile);
}
static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
-
- if( file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin)) {
- ED_area_tag_redraw(CTX_wm_area(C));
- }
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(!file_hilight_set(sfile, ar, event->x, event->y))
+ return OPERATOR_CANCELLED;
+
+ ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
@@ -454,14 +508,34 @@ void FILE_OT_highlight(struct wmOperatorType *ot)
int file_cancel_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
-
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ folderlist_free(sfile->folders_prev);
+ folderlist_free(sfile->folders_next);
+
WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
sfile->op = NULL;
+ if (sfile->files) {
+ filelist_freelib(sfile->files);
+ filelist_free(sfile->files);
+ MEM_freeN(sfile->files);
+ sfile->files= NULL;
+ }
+
return OPERATOR_FINISHED;
}
+int file_operator_poll(bContext *C)
+{
+ int poll = ED_operator_file_active(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if (!sfile || !sfile->op) poll= 0;
+
+ return poll;
+}
+
void FILE_OT_cancel(struct wmOperatorType *ot)
{
/* identifiers */
@@ -470,22 +544,29 @@ void FILE_OT_cancel(struct wmOperatorType *ot)
/* api callbacks */
ot->exec= file_cancel_exec;
- ot->poll= ED_operator_file_active;
+ ot->poll= file_operator_poll;
}
/* sends events now, so things get handled on windowqueue level */
int file_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
char name[FILE_MAX];
if(sfile->op) {
wmOperator *op= sfile->op;
sfile->op = NULL;
+ RNA_string_set(op->ptr, "filename", sfile->params->file);
BLI_strncpy(name, sfile->params->dir, sizeof(name));
+ RNA_string_set(op->ptr, "directory", name);
strcat(name, sfile->params->file);
- RNA_string_set(op->ptr, "filename", name);
+
+ if(RNA_struct_find_property(op->ptr, "relative_paths"))
+ if(RNA_boolean_get(op->ptr, "relative_paths"))
+ BLI_makestringcode(G.sce, name);
+
+ RNA_string_set(op->ptr, "path", name);
/* some ops have multiple files to select */
{
@@ -517,39 +598,48 @@ int file_exec(bContext *C, wmOperator *unused)
}
}
+ folderlist_free(sfile->folders_prev);
+ folderlist_free(sfile->folders_next);
+
fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
fsmenu_write_file(fsmenu_get(), name);
WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
+
+ filelist_freelib(sfile->files);
+ filelist_free(sfile->files);
+ MEM_freeN(sfile->files);
+ sfile->files= NULL;
}
return OPERATOR_FINISHED;
}
-void FILE_OT_exec(struct wmOperatorType *ot)
+void FILE_OT_execute(struct wmOperatorType *ot)
{
/* identifiers */
ot->name= "Execute File Window";
- ot->idname= "FILE_OT_exec";
+ ot->idname= "FILE_OT_execute";
/* api callbacks */
ot->exec= file_exec;
- ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+ ot->poll= file_operator_poll;
}
int file_parent_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
- BLI_parent_dir(sfile->params->dir);
- filelist_setdir(sfile->files, sfile->params->dir);
- filelist_free(sfile->files);
- sfile->params->active_file = -1;
+ if (BLI_has_parent(sfile->params->dir)) {
+ BLI_parent_dir(sfile->params->dir);
+ BLI_cleanup_dir(G.sce, sfile->params->dir);
+ file_change_dir(sfile);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+ }
}
- ED_area_tag_redraw(CTX_wm_area(C));
-
+
return OPERATOR_FINISHED;
}
@@ -569,17 +659,172 @@ void FILE_OT_parent(struct wmOperatorType *ot)
int file_refresh_exec(bContext *C, wmOperator *unused)
{
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ file_change_dir(sfile);
+
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
+
+}
+
+void FILE_OT_previous(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Previous Folder";
+ ot->idname= "FILE_OT_previous";
+ /* api callbacks */
+ ot->exec= file_previous_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+int file_previous_exec(bContext *C, wmOperator *unused)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
if(sfile->params) {
- filelist_setdir(sfile->files, sfile->params->dir);
- filelist_free(sfile->files);
- sfile->params->active_file = -1;
+ if (!sfile->folders_next)
+ sfile->folders_next = folderlist_new();
+
+ folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+ folderlist_popdir(sfile->folders_prev, sfile->params->dir);
+ folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+
+ file_change_dir(sfile);
+ }
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_next(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Next Folder";
+ ot->idname= "FILE_OT_next";
+
+ /* api callbacks */
+ ot->exec= file_next_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+int file_next_exec(bContext *C, wmOperator *unused)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ if(sfile->params) {
+ if (!sfile->folders_next)
+ sfile->folders_next = folderlist_new();
+
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+ folderlist_popdir(sfile->folders_next, sfile->params->dir);
+
+ // update folder_prev so we can check for it in folderlist_clear_next()
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+
+ file_change_dir(sfile);
}
- ED_area_tag_redraw(CTX_wm_area(C));
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
return OPERATOR_FINISHED;
+}
+
+int file_directory_new_exec(bContext *C, wmOperator *unused)
+{
+ char tmpstr[FILE_MAX];
+ char tmpdir[FILE_MAXFILE];
+ int i = 1;
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+
+ BLI_strncpy(tmpstr, sfile->params->dir, FILE_MAX);
+ BLI_join_dirfile(tmpstr, tmpstr, "New Folder");
+ while (BLI_exists(tmpstr)) {
+ BLI_snprintf(tmpdir, FILE_MAXFILE, "New Folder(%d)", i++);
+ BLI_strncpy(tmpstr, sfile->params->dir, FILE_MAX);
+ BLI_join_dirfile(tmpstr, tmpstr, tmpdir);
+ }
+ BLI_recurdir_fileops(tmpstr);
+ if (BLI_exists(tmpstr)) {
+ BLI_strncpy(sfile->params->renamefile, tmpdir, FILE_MAXFILE);
+ } else {
+ filelist_free(sfile->files);
+ filelist_parent(sfile->files);
+ BLI_strncpy(sfile->params->dir, filelist_dir(sfile->files), FILE_MAX);
+ }
+ }
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void FILE_OT_directory_new(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Create New Directory";
+ ot->idname= "FILE_OT_directory_new";
+ ot->description= "Create a new directory";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= file_directory_new_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+int file_directory_exec(bContext *C, wmOperator *unused)
+{
+ char tmpstr[FILE_MAX];
+
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+
+ if ( sfile->params->dir[0] == '~' ) {
+ if (sfile->params->dir[1] == '\0') {
+ BLI_strncpy(sfile->params->dir, BLI_gethome(), sizeof(sfile->params->dir) );
+ } else {
+ /* replace ~ with home */
+ char homestr[FILE_MAX];
+ char *d = &sfile->params->dir[1];
+
+ while ( (*d == '\\') || (*d == '/') )
+ d++;
+ BLI_strncpy(homestr, BLI_gethome(), FILE_MAX);
+ BLI_join_dirfile(tmpstr, homestr, d);
+ BLI_strncpy(sfile->params->dir, tmpstr, sizeof(sfile->params->dir));
+ }
+ }
+#ifdef WIN32
+ if (sfile->params->dir[0] == '\0')
+ get_default_root(sfile->params->dir);
+#endif
+ BLI_cleanup_dir(G.sce, sfile->params->dir);
+ BLI_add_slash(sfile->params->dir);
+ file_change_dir(sfile);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+ }
+
+
+ return OPERATOR_FINISHED;
+}
+
+int file_filename_exec(bContext *C, wmOperator *unused)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ if (file_select_match(sfile, sfile->params->file))
+ {
+ sfile->params->file[0] = '\0';
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+ }
+ }
+
+ return OPERATOR_FINISHED;
}
@@ -594,14 +839,58 @@ 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)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ sfile->params->flag ^= FILE_HIDE_DOT;
+ filelist_free(sfile->files);
+ sfile->params->active_file = -1;
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+ }
+
+ return OPERATOR_FINISHED;
+
+}
+
+
+void FILE_OT_hidedot(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Hide Dot Files";
+ ot->idname= "FILE_OT_hidedot";
+
+ /* api callbacks */
+ ot->exec= file_hidedot_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
struct ARegion *file_buttons_region(struct ScrArea *sa)
{
- ARegion *ar;
+ ARegion *ar, *arnew;
for(ar= sa->regionbase.first; ar; ar= ar->next)
if(ar->regiontype==RGN_TYPE_CHANNELS)
return ar;
- return NULL;
+
+ /* add subdiv level; after header */
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_HEADER)
+ break;
+
+ /* is error! */
+ if(ar==NULL) return NULL;
+
+ arnew= MEM_callocN(sizeof(ARegion), "buttons for file panels");
+
+ BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+ arnew->regiontype= RGN_TYPE_CHANNELS;
+ arnew->alignment= RGN_ALIGN_LEFT;
+
+ arnew->flag = RGN_FLAG_HIDDEN;
+
+ return arnew;
}
int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
@@ -609,13 +898,9 @@ int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= file_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
@@ -629,3 +914,134 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
ot->exec= file_bookmark_toggle_exec;
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
+
+
+int file_filenum_exec(bContext *C, wmOperator *op)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ ScrArea *sa= CTX_wm_area(C);
+
+ int inc = RNA_int_get(op->ptr, "increment");
+ if(sfile->params && (inc != 0)) {
+ BLI_newname(sfile->params->file, inc);
+ ED_area_tag_redraw(sa);
+ // WM_event_add_notifier(C, NC_WINDOW, NULL);
+ }
+
+ return OPERATOR_FINISHED;
+
+}
+
+void FILE_OT_filenum(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Increment Number in Filename";
+ ot->idname= "FILE_OT_filenum";
+
+ /* api callbacks */
+ ot->exec= file_filenum_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+
+ /* props */
+ RNA_def_int(ot->srna, "increment", 1, 0, 100, "Increment", "", 0,100);
+}
+
+int file_rename_exec(bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+
+ if(sfile->params) {
+ int idx = sfile->params->active_file;
+ int numfiles = filelist_numfiles(sfile->files);
+ if ( (0<=idx) && (idx<numfiles) ) {
+ struct direntry *file= filelist_file(sfile->files, idx);
+ file->flags |= EDITING;
+ }
+ ED_area_tag_redraw(sa);
+ }
+
+ return OPERATOR_FINISHED;
+
+}
+
+int file_rename_poll(bContext *C)
+{
+ int poll = ED_operator_file_active(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if (sfile && sfile->params) {
+ if (sfile->params->active_file < 0) {
+ poll= 0;
+ } else {
+ char dir[FILE_MAX], group[FILE_MAX];
+ if (filelist_islibrary(sfile->files, dir, group)) poll= 0;
+ }
+ }
+ else
+ poll= 0;
+ return poll;
+}
+
+void FILE_OT_rename(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Rename File or Directory";
+ ot->idname= "FILE_OT_rename";
+
+ /* api callbacks */
+ ot->exec= file_rename_exec;
+ ot->poll= file_rename_poll;
+
+}
+
+int file_delete_poll(bContext *C)
+{
+ int poll = ED_operator_file_active(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ struct direntry* file;
+
+ if (sfile && sfile->params) {
+ if (sfile->params->active_file < 0) {
+ poll= 0;
+ } else {
+ char dir[FILE_MAX], group[FILE_MAX];
+ if (filelist_islibrary(sfile->files, dir, group)) poll= 0;
+ file = filelist_file(sfile->files, sfile->params->active_file);
+ if (file && S_ISDIR(file->type)) poll= 0;
+ }
+ }
+ else
+ poll= 0;
+
+ return poll;
+}
+
+int file_delete_exec(bContext *C, wmOperator *op)
+{
+ char str[FILE_MAX];
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ struct direntry* file;
+
+
+ file = filelist_file(sfile->files, sfile->params->active_file);
+ BLI_make_file_string(G.sce, str, sfile->params->dir, file->relname);
+ BLI_delete(str, 0, 0);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
+
+}
+
+void FILE_OT_delete(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete File";
+ ot->idname= "FILE_OT_delete";
+
+ /* api callbacks */
+ ot->invoke= WM_operator_confirm;
+ ot->exec= file_delete_exec;
+ ot->poll= file_delete_poll; /* <- important, handler is on window level */
+}
+
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c
new file mode 100644
index 00000000000..1b54277c383
--- /dev/null
+++ b/source/blender/editors/space_file/file_panels.c
@@ -0,0 +1,237 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation, Andrea Weikert
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BKE_context.h"
+#include "BKE_screen.h"
+
+#include "BLI_blenlib.h"
+
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "file_intern.h"
+#include "fsmenu.h"
+
+#include <string.h>
+
+static void file_panel_cb(bContext *C, void *arg_entry, void *arg_unused)
+{
+ PointerRNA ptr;
+ char *entry= (char*)arg_entry;
+
+ WM_operator_properties_create(&ptr, "FILE_OT_select_bookmark");
+ RNA_string_set(&ptr, "dir", entry);
+ WM_operator_name_call(C, "FILE_OT_select_bookmark", WM_OP_INVOKE_REGION_WIN, &ptr);
+ WM_operator_properties_free(&ptr);
+}
+
+static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory category, short *nr, int icon, int allow_delete, int reverse)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ uiBlock *block;
+ 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 */
+ *nr= -1;
+
+ /* hide if no entries */
+ if(nentries == 0)
+ return;
+
+ /* layout */
+ uiLayoutSetAlignment(pa->layout, UI_LAYOUT_ALIGN_LEFT);
+ block= uiLayoutGetBlock(pa->layout);
+ box= uiLayoutBox(pa->layout);
+ col= uiLayoutColumn(box, 1);
+
+ for (i_iter=0; i_iter< nentries;++i_iter) {
+ char dir[FILE_MAX];
+ char temp[FILE_MAX];
+ uiLayout* layout = uiLayoutRow(col, 0);
+ char *entry;
+
+ i= reverse ? nentries-(i_iter+1) : i_iter;
+
+ 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;
+
+ /* create nice bookmark name, shows last directory in the full path currently */
+ BLI_strncpy(temp, entry, FILE_MAX);
+ BLI_add_slash(temp);
+ BLI_getlastdir(temp, dir, FILE_MAX);
+ BLI_del_slash(dir);
+
+ if(dir[0] == 0)
+ BLI_strncpy(dir, entry, FILE_MAX);
+
+ /* create list item */
+ but= uiDefIconTextButS(block, LISTROW, 0, icon, dir, 0,0,UI_UNIT_X*10,UI_UNIT_Y, nr, 0, i, 0, 0, entry);
+ uiButSetFunc(but, file_panel_cb, entry, NULL);
+ uiButSetFlag(but, UI_ICON_LEFT|UI_TEXT_LEFT);
+
+ /* create delete button */
+ if(allow_delete && fsmenu_can_save(fsmenu, category, i)) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiItemIntO(layout, "", ICON_X, "FILE_OT_delete_bookmark", "index", i);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ }
+}
+
+static void file_panel_system(const bContext *C, Panel *pa)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile)
+ file_panel_category(C, pa, FS_CATEGORY_SYSTEM, &sfile->systemnr, ICON_DISK_DRIVE, 0, 0);
+}
+
+static void file_panel_bookmarks(const bContext *C, Panel *pa)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ uiLayout *row;
+
+ if(sfile) {
+ row= uiLayoutRow(pa->layout, 0);
+ uiItemO(row, "Add", ICON_ZOOMIN, "file.add_bookmark");
+ uiItemL(row, NULL, 0);
+
+ file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1, 0);
+ }
+}
+
+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);
+}
+
+
+static int file_panel_operator_poll(const bContext *C, PanelType *pt)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ return (sfile && sfile->op);
+}
+
+static void file_panel_operator_header(const bContext *C, Panel *pa)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ wmOperator *op= sfile->op;
+
+ BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
+}
+
+static void file_panel_operator(const bContext *C, Panel *pa)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ wmOperator *op= sfile->op;
+ int empty= 1;
+
+ if(op->type->ui) {
+ op->type->ui((bContext*)C, op->ptr, pa->layout);
+ }
+ else {
+ RNA_STRUCT_BEGIN(op->ptr, prop) {
+ if(strcmp(RNA_property_identifier(prop), "rna_type") == 0)
+ continue;
+ if(strcmp(RNA_property_identifier(prop), "filemode") == 0)
+ continue;
+ if(strcmp(RNA_property_identifier(prop), "path") == 0)
+ continue;
+ if(strcmp(RNA_property_identifier(prop), "directory") == 0)
+ continue;
+ if(strcmp(RNA_property_identifier(prop), "filename") == 0)
+ continue;
+ if(strcmp(RNA_property_identifier(prop), "display") == 0)
+ continue;
+ if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0)
+ continue;
+
+ uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0);
+ empty= 0;
+ }
+ RNA_STRUCT_END;
+
+ if(empty)
+ uiItemL(pa->layout, "No properties.", 0);
+ }
+}
+
+void file_panels_register(ARegionType *art)
+{
+ PanelType *pt;
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype file system directories");
+ strcpy(pt->idname, "FILE_PT_system");
+ strcpy(pt->label, "System");
+ pt->draw= file_panel_system;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype file bookmarks");
+ strcpy(pt->idname, "FILE_PT_bookmarks");
+ strcpy(pt->label, "Bookmarks");
+ pt->draw= file_panel_bookmarks;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype file recent directories");
+ strcpy(pt->idname, "FILE_PT_recent");
+ strcpy(pt->label, "Recent");
+ pt->draw= file_panel_recent;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype file operator properties");
+ strcpy(pt->idname, "FILE_PT_operator");
+ strcpy(pt->label, "Operator");
+ pt->poll= file_panel_operator_poll;
+ pt->draw_header= file_panel_operator_header;
+ pt->draw= file_panel_operator;
+ BLI_addtail(&art->paneltypes, pt);
+}
+
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 766dec7c064..8257aa5482f 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -60,6 +60,7 @@
#include "BKE_library.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_report.h"
#include "BLO_readfile.h"
#include "DNA_space_types.h"
@@ -109,20 +110,30 @@ typedef struct FileList
{
struct direntry *filelist;
int *fidx;
-
int numfiles;
int numfiltered;
char dir[FILE_MAX];
- int has_func;
short prv_w;
short prv_h;
short hide_dot;
unsigned int filter;
short changed;
+
+ struct BlendHandle *libfiledata;
+ short hide_parent;
+
+ void (*read)(struct FileList *);
+
ListBase loadimages;
ListBase threads;
} FileList;
+typedef struct FolderList
+{
+ struct FolderList *next, *prev;
+ char *foldername;
+} FolderList;
+
#define SPECIAL_IMG_SIZE 48
#define SPECIAL_IMG_ROWS 4
#define SPECIAL_IMG_COLS 4
@@ -272,12 +283,20 @@ static int compare_extension(const void *a1, const void *a2) {
void filelist_filter(FileList* filelist)
{
+ /* char dir[FILE_MAX], group[GROUP_MAX]; XXXXX */
int num_filtered = 0;
int i, j;
if (!filelist->filelist)
return;
+ /* XXXXX TODO: check if the filter can be handled outside the filelist
+ if ( ( (filelist->type == FILE_LOADLIB) && BIF_filelist_islibrary(filelist, dir, group))
+ || (filelist->type == FILE_MAIN) ) {
+ filelist->filter = 0;
+ }
+ */
+
if (!filelist->filter) {
if (filelist->fidx) {
MEM_freeN(filelist->fidx);
@@ -354,28 +373,114 @@ void filelist_free_icons()
}
}
-struct FileList* filelist_new()
+//-----------------FOLDERLIST (previous/next) --------------//
+struct ListBase* folderlist_new()
{
- FileList* p = MEM_callocN( sizeof(FileList), "filelist" );
+ ListBase* p = MEM_callocN( sizeof(ListBase), "folderlist" );
return p;
}
-struct FileList* filelist_copy(struct FileList* filelist)
+void folderlist_popdir(struct ListBase* folderlist, char *dir)
{
- FileList* p = filelist_new();
- BLI_strncpy(p->dir, filelist->dir, FILE_MAX);
- p->filelist = NULL;
- p->fidx = NULL;
+ const char *prev_dir;
+ struct FolderList *folder;
+ folder = folderlist->last;
+
+ if(folder){
+ // remove the current directory
+ MEM_freeN(folder->foldername);
+ BLI_freelinkN(folderlist, folder);
+
+ folder = folderlist->last;
+ if(folder){
+ prev_dir = folder->foldername;
+ BLI_strncpy(dir, prev_dir, FILE_MAXDIR);
+ }
+ }
+ // delete the folder next or use setdir directly before PREVIOUS OP
+}
+
+void folderlist_pushdir(ListBase* folderlist, const char *dir)
+{
+ struct FolderList *folder, *previous_folder;
+ previous_folder = folderlist->last;
+
+ // check if already exists
+ if(previous_folder){
+ if(! strcmp(previous_folder->foldername, dir)){
+ return;
+ }
+ }
+
+ // create next folder element
+ folder = (FolderList*)MEM_mallocN(sizeof(FolderList),"FolderList");
+ folder->foldername = (char*)MEM_mallocN(sizeof(char)*(strlen(dir)+1), "foldername");
+ folder->foldername[0] = '\0';
+
+ BLI_strncpy(folder->foldername, dir, FILE_MAXDIR);
+
+ // add it to the end of the list
+ BLI_addtail(folderlist, folder);
+}
+int folderlist_clear_next(struct SpaceFile *sfile)
+{
+ struct FolderList *folder;
+
+ // if there is no folder_next there is nothing we can clear
+ if (!sfile->folders_next)
+ return 0;
+
+ // if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next
+ folder = sfile->folders_prev->last;
+ if ((!folder) ||(!strcmp(folder->foldername, sfile->params->dir)))
+ return 0;
+
+ // eventually clear flist->folders_next
+ return 1;
+}
+
+void folderlist_free(ListBase* folderlist)
+{
+ FolderList *folder;
+ if (folderlist){
+ for(folder= folderlist->last; folder; folder= folderlist->last) {
+ MEM_freeN(folder->foldername);
+ BLI_freelinkN(folderlist, folder);
+ }
+ }
+ folderlist= NULL;
+}
+
+static void filelist_read_main(struct FileList* filelist);
+static void filelist_read_library(struct FileList* filelist);
+static void filelist_read_dir(struct FileList* filelist);
+
+//------------------FILELIST------------------------//
+struct FileList* filelist_new(short type)
+{
+ FileList* p = MEM_callocN( sizeof(FileList), "filelist" );
+ switch(type) {
+ case FILE_MAIN:
+ p->read = filelist_read_main;
+ break;
+ case FILE_LOADLIB:
+ p->read = filelist_read_library;
+ break;
+ default:
+ p->read = filelist_read_dir;
+
+ }
return p;
}
+
void filelist_free(struct FileList* filelist)
{
int i;
if (!filelist) {
- printf("Attemtping to delete empty filelist.\n");
+ printf("Attempting to delete empty filelist.\n");
return;
}
@@ -408,6 +513,18 @@ void filelist_free(struct FileList* filelist)
filelist->hide_dot =0;
}
+void filelist_freelib(struct FileList* filelist)
+{
+ if(filelist->libfiledata)
+ BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= 0;
+}
+
+struct BlendHandle *filelist_lib(struct FileList* filelist)
+{
+ return filelist->libfiledata;
+}
+
int filelist_numfiles(struct FileList* filelist)
{
return filelist->numfiltered;
@@ -475,10 +592,12 @@ void filelist_loadimage_timer(struct FileList* filelist)
}
if (limg->done) {
FileImage *oimg = limg;
- BLI_remlink(&filelist->loadimages, oimg);
BLI_remove_thread(&filelist->threads, oimg);
+ /* brecht: keep failed images in the list, otherwise
+ it keeps trying to load them over and over?
+ BLI_remlink(&filelist->loadimages, oimg);
+ MEM_freeN(oimg);*/
limg = oimg->next;
- MEM_freeN(oimg);
refresh = 1;
} else {
limg= limg->next;
@@ -612,7 +731,6 @@ struct direntry * filelist_file(struct FileList* filelist, int index)
return &filelist->filelist[fidx];
}
-
int filelist_find(struct FileList* filelist, char *file)
{
int index = -1;
@@ -649,16 +767,16 @@ void filelist_setfilter(struct FileList* filelist, unsigned int filter)
filelist->filter = filter;
}
-void filelist_readdir(struct FileList* filelist)
+static void filelist_read_dir(struct FileList* filelist)
{
char wdir[FILE_MAX];
-
if (!filelist) return;
+
filelist->fidx = 0;
filelist->filelist = 0;
BLI_getwdN(wdir);
-
+
BLI_cleanup_dir(G.sce, filelist->dir);
BLI_hide_dot_files(filelist->hide_dot);
filelist->numfiles = BLI_getdir(filelist->dir, &(filelist->filelist));
@@ -666,12 +784,52 @@ void filelist_readdir(struct FileList* filelist)
chdir(wdir);
filelist_setfiletypes(filelist, G.have_quicktime);
filelist_filter(filelist);
-
+
if (!filelist->threads.first) {
BLI_init_threads(&filelist->threads, exec_loadimages, 2);
}
}
+static void filelist_read_main(struct FileList* filelist)
+{
+ if (!filelist) return;
+ filelist_from_main(filelist);
+}
+
+static void filelist_read_library(struct FileList* filelist)
+{
+ if (!filelist) return;
+ BLI_cleanup_dir(G.sce, filelist->dir);
+ filelist_from_library(filelist);
+ if(!filelist->libfiledata) {
+ int num;
+ struct direntry *file;
+
+ BLI_make_exist(filelist->dir);
+ filelist_read_dir(filelist);
+ file = filelist->filelist;
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ if(BLO_has_bfile_extension(file->relname)) {
+ char name[FILE_MAXDIR+FILE_MAXFILE];
+
+ BLI_strncpy(name, filelist->dir, sizeof(name));
+ strcat(name, file->relname);
+
+ /* prevent current file being used as acceptable dir */
+ if (BLI_streq(G.main->name, name)==0) {
+ file->type &= ~S_IFMT;
+ file->type |= S_IFDIR;
+ }
+ }
+ }
+ }
+}
+
+void filelist_readdir(struct FileList* filelist)
+{
+ filelist->read(filelist);
+}
+
int filelist_empty(struct FileList* filelist)
{
return filelist->filelist == 0;
@@ -756,7 +914,16 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
|| BLI_testextensie(file->relname, ".mv")) {
file->flags |= MOVIEFILE;
}
- else if(BLI_testextensie(file->relname, ".wav")) {
+ else if(BLI_testextensie(file->relname, ".wav")
+ || BLI_testextensie(file->relname, ".ogg")
+ || BLI_testextensie(file->relname, ".oga")
+ || BLI_testextensie(file->relname, ".mp3")
+ || BLI_testextensie(file->relname, ".mp2")
+ || BLI_testextensie(file->relname, ".ac3")
+ || BLI_testextensie(file->relname, ".aac")
+ || BLI_testextensie(file->relname, ".flac")
+ || BLI_testextensie(file->relname, ".wma")
+ || BLI_testextensie(file->relname, ".eac3")) {
file->flags |= SOUNDFILE;
}
} else { // no quicktime
@@ -791,7 +958,16 @@ void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
|| BLI_testextensie(file->relname, ".mv")) {
file->flags |= MOVIEFILE;
}
- else if(BLI_testextensie(file->relname, ".wav")) {
+ else if(BLI_testextensie(file->relname, ".wav")
+ || BLI_testextensie(file->relname, ".ogg")
+ || BLI_testextensie(file->relname, ".oga")
+ || BLI_testextensie(file->relname, ".mp3")
+ || BLI_testextensie(file->relname, ".mp2")
+ || BLI_testextensie(file->relname, ".ac3")
+ || BLI_testextensie(file->relname, ".aac")
+ || BLI_testextensie(file->relname, ".flac")
+ || BLI_testextensie(file->relname, ".wma")
+ || BLI_testextensie(file->relname, ".eac3")) {
file->flags |= SOUNDFILE;
}
}
@@ -819,26 +995,275 @@ void filelist_swapselect(struct FileList* filelist)
void filelist_sort(struct FileList* filelist, short sort)
{
- struct direntry *file;
- int num;/* , act= 0; */
-
switch(sort) {
- case FILE_SORTALPHA:
+ case FILE_SORT_ALPHA:
qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_name);
break;
- case FILE_SORTDATE:
+ case FILE_SORT_TIME:
qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_date);
break;
- case FILE_SORTSIZE:
+ case FILE_SORT_SIZE:
qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_size);
break;
- case FILE_SORTEXTENS:
+ case FILE_SORT_EXTENSION:
qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension);
}
- file= filelist->filelist;
- for(num=0; num<filelist->numfiles; num++, file++) {
- file->flags &= ~HILITE;
+ filelist_filter(filelist);
+}
+
+
+int filelist_islibrary(struct FileList* filelist, char* dir, char* group)
+{
+ return BLO_is_a_library(filelist->dir, dir, group);
+}
+
+static int groupname_to_code(char *group)
+{
+ char buf[32];
+ char *lslash;
+
+ BLI_strncpy(buf, group, 31);
+ lslash= BLI_last_slash(buf);
+ if (lslash)
+ lslash[0]= '\0';
+
+ return BLO_idcode_from_name(buf);
+}
+
+void filelist_from_library(struct FileList* filelist)
+{
+ LinkNode *l, *names, *previews;
+ struct ImBuf* ima;
+ int ok, i, nnames, idcode;
+ char filename[FILE_MAXDIR+FILE_MAXFILE];
+ char dir[FILE_MAX], group[GROUP_MAX];
+
+ /* name test */
+ ok= filelist_islibrary(filelist, dir, group);
+ if (!ok) {
+ /* free */
+ if(filelist->libfiledata) BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= 0;
+ return;
+ }
+
+ BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
+
+ /* there we go */
+ /* for the time being only read filedata when libfiledata==0 */
+ if (filelist->libfiledata==0) {
+ filelist->libfiledata= BLO_blendhandle_from_file(dir);
+ if(filelist->libfiledata==0) return;
}
+
+ idcode= groupname_to_code(group);
+
+ // memory for strings is passed into filelist[i].relname
+ // and free'd in freefilelist
+ previews = NULL;
+ if (idcode) {
+ previews= BLO_blendhandle_get_previews(filelist->libfiledata, idcode);
+ names= BLO_blendhandle_get_datablock_names(filelist->libfiledata, idcode);
+ /* ugh, no rewind, need to reopen */
+ BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= BLO_blendhandle_from_file(dir);
+
+ } else {
+ names= BLO_blendhandle_get_linkable_groups(filelist->libfiledata);
+ }
+
+ nnames= BLI_linklist_length(names);
+
+ filelist->numfiles= nnames + 1;
+ filelist->filelist= malloc(filelist->numfiles * sizeof(*filelist->filelist));
+ memset(filelist->filelist, 0, filelist->numfiles * sizeof(*filelist->filelist));
+
+ filelist->filelist[0].relname= BLI_strdup("..");
+ filelist->filelist[0].type |= S_IFDIR;
+
+ for (i=0, l= names; i<nnames; i++, l= l->next) {
+ char *blockname= l->link;
+
+ filelist->filelist[i + 1].relname= BLI_strdup(blockname);
+ if (!idcode)
+ filelist->filelist[i + 1].type |= S_IFDIR;
+ }
+
+ if(previews) {
+ for (i=0, l= previews; i<nnames; i++, l= l->next) {
+ PreviewImage *img= l->link;
+
+ if (img) {
+ unsigned int w = img->w[PREVIEW_MIPMAP_LARGE];
+ unsigned int h = img->h[PREVIEW_MIPMAP_LARGE];
+ unsigned int *rect = img->rect[PREVIEW_MIPMAP_LARGE];
+
+ /* first allocate imbuf for copying preview into it */
+ if (w > 0 && h > 0 && rect) {
+ ima = IMB_allocImBuf(w, h, 32, IB_rect, 0);
+ memcpy(ima->rect, rect, w*h*sizeof(unsigned int));
+ filelist->filelist[i + 1].image = ima;
+ filelist->filelist[i + 1].flags = IMAGEFILE;
+ }
+ }
+ }
+ }
+
+ BLI_linklist_free(names, free);
+ if (previews) BLI_linklist_free(previews, (void(*)(void*)) MEM_freeN);
+
+ filelist_sort(filelist, FILE_SORT_ALPHA);
+
+ BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
+
+ filelist->filter = 0;
filelist_filter(filelist);
}
+
+void filelist_hideparent(struct FileList* filelist, short hide)
+{
+ filelist->hide_parent = hide;
+}
+
+void filelist_from_main(struct FileList *filelist)
+{
+ ID *id;
+ struct direntry *files, *firstlib = NULL;
+ ListBase *lb;
+ int a, fake, idcode, ok, totlib, totbl;
+
+ // filelist->type = FILE_MAIN; // XXXXX TODO: add modes to filebrowser
+
+ if(filelist->dir[0]=='/') filelist->dir[0]= 0;
+
+ if(filelist->dir[0]) {
+ idcode= groupname_to_code(filelist->dir);
+ if(idcode==0) filelist->dir[0]= 0;
+ }
+
+ if( filelist->dir[0]==0) {
+
+ /* make directories */
+ filelist->numfiles= 23;
+ filelist->filelist= (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
+
+ for(a=0; a<filelist->numfiles; a++) {
+ memset( &(filelist->filelist[a]), 0 , sizeof(struct direntry));
+ filelist->filelist[a].type |= S_IFDIR;
+ }
+
+ filelist->filelist[0].relname= BLI_strdup("..");
+ filelist->filelist[2].relname= BLI_strdup("Scene");
+ filelist->filelist[3].relname= BLI_strdup("Object");
+ filelist->filelist[4].relname= BLI_strdup("Mesh");
+ filelist->filelist[5].relname= BLI_strdup("Curve");
+ filelist->filelist[6].relname= BLI_strdup("Metaball");
+ filelist->filelist[7].relname= BLI_strdup("Material");
+ filelist->filelist[8].relname= BLI_strdup("Texture");
+ filelist->filelist[9].relname= BLI_strdup("Image");
+ filelist->filelist[10].relname= BLI_strdup("Ika");
+ filelist->filelist[11].relname= BLI_strdup("Wave");
+ filelist->filelist[12].relname= BLI_strdup("Lattice");
+ filelist->filelist[13].relname= BLI_strdup("Lamp");
+ filelist->filelist[14].relname= BLI_strdup("Camera");
+ filelist->filelist[15].relname= BLI_strdup("Ipo");
+ filelist->filelist[16].relname= BLI_strdup("World");
+ filelist->filelist[17].relname= BLI_strdup("Screen");
+ filelist->filelist[18].relname= BLI_strdup("VFont");
+ filelist->filelist[19].relname= BLI_strdup("Text");
+ filelist->filelist[20].relname= BLI_strdup("Armature");
+ filelist->filelist[21].relname= BLI_strdup("Action");
+ filelist->filelist[22].relname= BLI_strdup("NodeTree");
+ filelist_sort(filelist, FILE_SORT_ALPHA);
+ }
+ else {
+
+ /* make files */
+ idcode= groupname_to_code(filelist->dir);
+
+ lb= wich_libbase(G.main, idcode );
+ if(lb==0) return;
+
+ id= lb->first;
+ filelist->numfiles= 0;
+ while(id) {
+ if (!filelist->hide_dot || id->name[2] != '.') {
+ filelist->numfiles++;
+ }
+
+ id= id->next;
+ }
+
+ /* XXXXX TODO: if databrowse F4 or append/link filelist->hide_parent has to be set */
+ if (!filelist->hide_parent) filelist->numfiles+= 1;
+ filelist->filelist= (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
+
+ files = filelist->filelist;
+
+ if (!filelist->hide_parent) {
+ memset( &(filelist->filelist[0]), 0 , sizeof(struct direntry));
+ filelist->filelist[0].relname= BLI_strdup("..");
+ filelist->filelist[0].type |= S_IFDIR;
+
+ files++;
+ }
+
+ id= lb->first;
+ totlib= totbl= 0;
+
+ while(id) {
+ ok = 1;
+ if(ok) {
+ if (!filelist->hide_dot || id->name[2] != '.') {
+ memset( files, 0 , sizeof(struct direntry));
+ if(id->lib==NULL)
+ files->relname= BLI_strdup(id->name+2);
+ else {
+ files->relname= MEM_mallocN(FILE_MAXDIR+FILE_MAXFILE+32, "filename for lib");
+ sprintf(files->relname, "%s | %s", id->lib->name, id->name+2);
+ }
+ /* files->type |= S_IFDIR; */
+#if 0 // XXXXX TODO show the selection status of the objects
+ if(!filelist->has_func) { /* F4 DATA BROWSE */
+ if(idcode==ID_OB) {
+ if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVE;
+ }
+ else if(idcode==ID_SCE) {
+ if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVE;
+ }
+ }
+#endif
+ files->nr= totbl+1;
+ files->poin= id;
+ fake= id->flag & LIB_FAKEUSER;
+ if(idcode == ID_MA || idcode == ID_TE || idcode == ID_LA || idcode == ID_WO || idcode == ID_IM) {
+ files->flags |= IMAGEFILE;
+ }
+ if(id->lib && fake) sprintf(files->extra, "LF %d", id->us);
+ else if(id->lib) sprintf(files->extra, "L %d", id->us);
+ else if(fake) sprintf(files->extra, "F %d", id->us);
+ else sprintf(files->extra, " %d", id->us);
+
+ if(id->lib) {
+ if(totlib==0) firstlib= files;
+ totlib++;
+ }
+
+ files++;
+ }
+ totbl++;
+ }
+
+ id= id->next;
+ }
+
+ /* only qsort of library blocks */
+ if(totlib>1) {
+ qsort(firstlib, totlib, sizeof(struct direntry), compare_name);
+ }
+ }
+ filelist->filter = 0;
+ filelist_filter(filelist);
+}
+
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index f10c89926d6..a8d909f899e 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -38,18 +38,19 @@ extern "C" {
#endif
struct FileList;
+struct FolderList;
struct direntry;
struct BlendHandle;
struct Scene;
+struct Main;
struct rcti;
+struct ReportList;
-struct FileList * filelist_new();
+struct FileList * filelist_new(short type);
void filelist_init_icons();
void filelist_free_icons();
-struct FileList * filelist_copy(struct FileList* filelist);
int filelist_find(struct FileList* filelist, char *file);
void filelist_free(struct FileList* filelist);
-void filelist_freelib(struct FileList* filelist);
void filelist_sort(struct FileList* filelist, short sort);
int filelist_numfiles(struct FileList* filelist);
const char * filelist_dir(struct FileList* filelist);
@@ -72,6 +73,18 @@ 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);
+void filelist_from_main(struct FileList* filelist);
+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();
+void folderlist_free(struct ListBase* folderlist);
+void folderlist_popdir(struct ListBase* folderlist, char *dir);
+void folderlist_pushdir(struct ListBase* folderlist, const char *dir);
+int folderlist_clear_next(struct SpaceFile* sfile);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 479d9cabc55..dd16a426899 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -73,6 +73,8 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "RNA_access.h"
+
#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
@@ -80,62 +82,136 @@
#include "file_intern.h"
#include "filelist.h"
+#if defined __BeOS
+static int fnmatch(const char *pattern, const char *string, int flags)
+{
+ return 0;
+}
+#elif defined WIN32 && !defined _LIBC
+ /* use fnmatch included in blenlib */
+ #include "BLI_fnmatch.h"
+#else
+ #include <fnmatch.h>
+#endif
FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile)
{
if (!sfile->params) {
- ED_fileselect_set_params(sfile, "", "/", 0, FILE_SHORTDISPLAY, 0, FILE_SORTALPHA);
+ ED_fileselect_set_params(sfile);
}
return sfile->params;
}
-short ED_fileselect_set_params(SpaceFile *sfile, const char *title, const char *path,
- short flag, short display, short filter, short sort)
+short ED_fileselect_set_params(SpaceFile *sfile)
{
char name[FILE_MAX], dir[FILE_MAX], file[FILE_MAX];
FileSelectParams *params;
+ wmOperator *op = sfile->op;
+ /* create new parameters if necessary */
if (!sfile->params) {
sfile->params= MEM_callocN(sizeof(FileSelectParams), "fileselparams");
+ /* set path to most recently opened .blend */
+ BLI_strncpy(sfile->params->dir, G.sce, sizeof(sfile->params->dir));
+ BLI_split_dirfile(G.sce, dir, file);
+ BLI_strncpy(sfile->params->file, file, sizeof(sfile->params->file));
+ BLI_make_file_string(G.sce, sfile->params->dir, dir, ""); /* XXX needed ? - also solve G.sce */
}
params = sfile->params;
- params->flag = flag;
- params->display = display;
- params->filter = filter;
- params->sort = sort;
-
- BLI_strncpy(params->title, title, sizeof(params->title));
-
- BLI_strncpy(name, path, sizeof(name));
- BLI_convertstringcode(name, G.sce);
+ /* set the parameters from the operator, if it exists */
+ if (op) {
+ BLI_strncpy(params->title, op->type->name, sizeof(params->title));
+
+ params->type = RNA_int_get(op->ptr, "filemode");
+
+ if (RNA_property_is_set(op->ptr, "path")) {
+ RNA_string_get(op->ptr, "path", name);
+ if (params->type == FILE_LOADLIB) {
+ BLI_strncpy(params->dir, name, sizeof(params->dir));
+ BLI_cleanup_dir(G.sce, params->dir);
+ } else {
+ /* if operator has path set, use it, otherwise keep the last */
+ BLI_convertstringcode(name, G.sce);
+ BLI_split_dirfile(name, dir, file);
+ BLI_strncpy(params->file, file, sizeof(params->file));
+ BLI_make_file_string(G.sce, params->dir, dir, ""); /* XXX needed ? - also solve G.sce */
+ }
+ }
+ params->filter = 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_blender") ? BLENDERFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_image") ? IMAGEFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_movie") ? MOVIEFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_text") ? TEXTFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_python") ? PYSCRIPTFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_font") ? FTFONTFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_sound") ? SOUNDFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_text") ? TEXTFILE : 0;
+ params->filter |= RNA_boolean_get(op->ptr, "filter_folder") ? FOLDERFILE : 0;
+ if (params->filter != 0)
+ params->flag |= FILE_FILTER;
+
+ params->flag |= FILE_HIDE_DOT;
+
+ if (params->type == FILE_LOADLIB) {
+ params->flag |= RNA_boolean_get(op->ptr, "link") ? FILE_LINK : 0;
+ params->flag |= RNA_boolean_get(op->ptr, "autoselect") ? FILE_AUTOSELECT : 0;
+ params->flag |= RNA_boolean_get(op->ptr, "active_layer") ? FILE_ACTIVELAY : 0;
+ }
- BLI_split_dirfile(name, dir, file);
- BLI_strncpy(params->file, file, sizeof(params->file));
- BLI_strncpy(params->dir, dir, sizeof(params->dir));
- BLI_make_file_string(G.sce, params->dir, dir, ""); /* XXX needed ? - also solve G.sce */
+ if(params->filter & (IMAGEFILE|MOVIEFILE))
+ params->display= FILE_IMGDISPLAY;
+ else
+ params->display= FILE_SHORTDISPLAY;
+
+ } else {
+ /* default values, if no operator */
+ params->type = FILE_UNIX;
+ params->flag |= FILE_HIDE_DOT;
+ params->display = FILE_SHORTDISPLAY;
+ params->filter = 0;
+ params->sort = FILE_SORT_ALPHA;
+ }
return 1;
}
void ED_fileselect_reset_params(SpaceFile *sfile)
{
+ sfile->params->type = FILE_UNIX;
sfile->params->flag = 0;
sfile->params->title[0] = '\0';
}
+int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar)
+{
+ int numfiles;
+
+ if (layout->flag & FILE_LAYOUT_HOR) {
+ short width = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x;
+ numfiles = width/layout->tile_w + 1;
+ } else {
+ short height = ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y;
+ numfiles = height/layout->tile_h + 1;
+ }
+
+ return layout->columns*layout->rows;
+}
int ED_fileselect_layout_offset(FileLayout* layout, int x, int y)
{
int offsetx, offsety;
int active_file;
+ if (layout == NULL)
+ return 0;
+
offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x);
offsety = (y)/(layout->tile_h + 2*layout->tile_border_y);
- if (offsetx > layout->columns-1) offsetx = -1 ;
- if (offsety > layout->rows-1) offsety = -1 ;
+ if (offsetx > layout->columns-1) return -1 ;
+ if (offsety > layout->rows-1) return -1 ;
if (layout->flag & FILE_LAYOUT_HOR)
active_file = layout->rows*offsetx + offsety;
@@ -208,68 +284,79 @@ static void column_widths(struct FileList* files, struct FileLayout* layout)
void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
{
- FileSelectParams* params = ED_fileselect_get_params(sfile);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ FileLayout *layout=0;
View2D *v2d= &ar->v2d;
int maxlen = 0;
- int numfiles = filelist_numfiles(sfile->files);
- int textheight = file_font_pointsize();
+ int numfiles;
+ int textheight;
if (sfile->layout == 0) {
sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout");
- }
+ sfile->layout->dirty = 1;
+ }
+
+ if (!sfile->layout->dirty) return;
+
+ numfiles = filelist_numfiles(sfile->files);
+ textheight = file_font_pointsize();
+ layout = sfile->layout;
+ layout->textheight = textheight;
+
if (params->display == FILE_IMGDISPLAY) {
- sfile->layout->prv_w = 96;
- sfile->layout->prv_h = 96;
- sfile->layout->tile_border_x = 6;
- sfile->layout->tile_border_y = 6;
- sfile->layout->prv_border_x = 6;
- sfile->layout->prv_border_y = 6;
- sfile->layout->tile_w = sfile->layout->prv_w + 2*sfile->layout->prv_border_x;
- sfile->layout->tile_h = sfile->layout->prv_h + 2*sfile->layout->prv_border_y + textheight;
- sfile->layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*sfile->layout->tile_border_x);
- sfile->layout->columns= sfile->layout->width / (sfile->layout->tile_w + 2*sfile->layout->tile_border_x);
- if(sfile->layout->columns > 0)
- sfile->layout->rows= numfiles/sfile->layout->columns + 1; // XXX dirty, modulo is zero
+ layout->prv_w = 96;
+ layout->prv_h = 96;
+ layout->tile_border_x = 6;
+ layout->tile_border_y = 6;
+ layout->prv_border_x = 6;
+ layout->prv_border_y = 6;
+ layout->tile_w = layout->prv_w + 2*layout->prv_border_x;
+ layout->tile_h = layout->prv_h + 2*layout->prv_border_y + textheight;
+ layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*layout->tile_border_x);
+ layout->columns= layout->width / (layout->tile_w + 2*layout->tile_border_x);
+ if(layout->columns > 0)
+ layout->rows= numfiles/layout->columns + 1; // XXX dirty, modulo is zero
else {
- sfile->layout->columns = 1;
- sfile->layout->rows= numfiles + 1; // XXX dirty, modulo is zero
+ layout->columns = 1;
+ layout->rows= numfiles + 1; // XXX dirty, modulo is zero
}
- sfile->layout->height= sfile->layout->rows*(sfile->layout->tile_h+2*sfile->layout->tile_border_y) + sfile->layout->tile_border_y*2;
- sfile->layout->flag = FILE_LAYOUT_VER;
+ layout->height= sfile->layout->rows*(layout->tile_h+2*layout->tile_border_y) + layout->tile_border_y*2;
+ layout->flag = FILE_LAYOUT_VER;
} else {
- sfile->layout->prv_w = 0;
- sfile->layout->prv_h = 0;
- sfile->layout->tile_border_x = 8;
- sfile->layout->tile_border_y = 2;
- sfile->layout->prv_border_x = 0;
- sfile->layout->prv_border_y = 0;
- sfile->layout->tile_h = textheight*3/2;
- sfile->layout->height= v2d->cur.ymax - v2d->cur.ymin;
- sfile->layout->rows = sfile->layout->height / (sfile->layout->tile_h + 2*sfile->layout->tile_border_y);;
+ layout->prv_w = 0;
+ layout->prv_h = 0;
+ layout->tile_border_x = 8;
+ layout->tile_border_y = 2;
+ layout->prv_border_x = 0;
+ layout->prv_border_y = 0;
+ layout->tile_h = textheight*3/2;
+ layout->height= v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y;
+ layout->rows = layout->height / (layout->tile_h + 2*layout->tile_border_y);
- column_widths(sfile->files, sfile->layout);
+ column_widths(sfile->files, layout);
if (params->display == FILE_SHORTDISPLAY) {
- maxlen = sfile->layout->column_widths[COLUMN_NAME] +
- sfile->layout->column_widths[COLUMN_SIZE];
+ maxlen = layout->column_widths[COLUMN_NAME] +
+ layout->column_widths[COLUMN_SIZE];
maxlen += 20+2*10; // for icon and space between columns
} else {
- maxlen = sfile->layout->column_widths[COLUMN_NAME] +
- sfile->layout->column_widths[COLUMN_DATE] +
- sfile->layout->column_widths[COLUMN_TIME] +
- sfile->layout->column_widths[COLUMN_SIZE];
+ maxlen = layout->column_widths[COLUMN_NAME] +
+ layout->column_widths[COLUMN_DATE] +
+ layout->column_widths[COLUMN_TIME] +
+ layout->column_widths[COLUMN_SIZE];
/* XXX add mode1, mode2, mode3, owner columns for non-windows platforms */
maxlen += 20+4*10; // for icon and space between columns
}
- sfile->layout->tile_w = maxlen + 40;
- if(sfile->layout->rows > 0)
- sfile->layout->columns = numfiles/sfile->layout->rows + 1; // XXX dirty, modulo is zero
+ layout->tile_w = maxlen + 40;
+ if(layout->rows > 0)
+ layout->columns = numfiles/layout->rows + 1; // XXX dirty, modulo is zero
else {
- sfile->layout->rows = 1;
- sfile->layout->columns = numfiles + 1; // XXX dirty, modulo is zero
+ layout->rows = 1;
+ layout->columns = numfiles + 1; // XXX dirty, modulo is zero
}
- sfile->layout->width = sfile->layout->columns * (sfile->layout->tile_w + 2*sfile->layout->tile_border_x) + sfile->layout->tile_border_x*2;
- sfile->layout->flag = FILE_LAYOUT_HOR;
- }
+ layout->width = sfile->layout->columns * (layout->tile_w + 2*layout->tile_border_x) + layout->tile_border_x*2;
+ layout->flag = FILE_LAYOUT_HOR;
+ }
+ layout->dirty= 0;
}
FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar)
@@ -279,3 +366,67 @@ FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar
}
return sfile->layout;
}
+
+void file_change_dir(struct SpaceFile *sfile)
+{
+ if (sfile->params) {
+ filelist_setdir(sfile->files, sfile->params->dir);
+
+ if(folderlist_clear_next(sfile))
+ folderlist_free(sfile->folders_next);
+
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+
+ filelist_free(sfile->files);
+ sfile->params->active_file = -1;
+ }
+}
+
+int file_select_match(struct SpaceFile *sfile, const char *pattern)
+{
+ int match = 0;
+ if (strchr(pattern, '*') || strchr(pattern, '?') || strchr(pattern, '[')) {
+ int i;
+ struct direntry *file;
+ int n = filelist_numfiles(sfile->files);
+
+ for (i = 0; i < n; i++) {
+ file = filelist_file(sfile->files, i);
+ if (fnmatch(pattern, file->relname, 0) == 0) {
+ file->flags |= ACTIVE;
+ match = 1;
+ }
+ }
+ }
+ return match;
+}
+
+
+void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
+{
+ char tmp[FILE_MAX];
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ /* search if str matches the beginning of name */
+ if(str[0] && sfile->files) {
+ AutoComplete *autocpl= autocomplete_begin(str, FILE_MAX);
+ int nentries = filelist_numfiles(sfile->files);
+ int i;
+
+ for(i= 0; i<nentries; ++i) {
+ struct direntry* file = filelist_file(sfile->files, i);
+ const char* dir = filelist_dir(sfile->files);
+ if (file && S_ISDIR(file->type)) {
+ // BLI_make_file_string(G.sce, tmp, dir, file->relname);
+ BLI_join_dirfile(tmp, dir, file->relname);
+ autocomplete_do_name(autocpl,tmp);
+ }
+ }
+ autocomplete_end(autocpl, str);
+ if (BLI_exists(str)) {
+ BLI_add_slash(str);
+ } else {
+ BLI_make_exist(str);
+ }
+ }
+}
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index 59e8dcf82e6..b45b57c6be9 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -34,9 +34,12 @@
#include "MEM_guardedalloc.h"
+#include "DNA_space_types.h" /* FILE_MAX */
+
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_dynstr.h"
+#include "BLI_string.h"
#ifdef WIN32
#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
@@ -48,11 +51,17 @@
#endif
#ifdef __APPLE__
+/* XXX BIG WARNING: carbon.h can not be included in blender code, it conflicts with struct ID */
+#define ID ID_
#include <CoreServices/CoreServices.h>
#include "BKE_utildefines.h"
#endif
+#ifdef __linux__
+#include <mntent.h>
+#endif
+
#include "fsmenu.h" /* include ourselves */
@@ -65,7 +74,6 @@ struct _FSMenuEntry {
char *path;
short save;
- short xs, ys;
};
typedef struct FSMenu
@@ -74,9 +82,6 @@ typedef struct FSMenu
FSMenuEntry *fsmenu_bookmarks;
FSMenuEntry *fsmenu_recent;
- FSMenuCategory selected_category;
- int selected_entry;
-
} FSMenu;
static FSMenu *g_fsmenu = NULL;
@@ -89,17 +94,6 @@ struct FSMenu* fsmenu_get(void)
return g_fsmenu;
}
-void fsmenu_select_entry(struct FSMenu* fsmenu, FSMenuCategory category, int index)
-{
- fsmenu->selected_category = category;
- fsmenu->selected_entry = index;
-}
-
-int fsmenu_is_selected(struct FSMenu* fsmenu, FSMenuCategory category, int index)
-{
- return (category==fsmenu->selected_category) && (index==fsmenu->selected_entry);
-}
-
static FSMenuEntry *fsmenu_get_category(struct FSMenu* fsmenu, FSMenuCategory category)
{
FSMenuEntry *fsms = NULL;
@@ -154,36 +148,16 @@ char *fsmenu_get_entry(struct FSMenu* fsmenu, FSMenuCategory category, int idx)
return fsme?fsme->path:NULL;
}
-void fsmenu_set_pos(struct FSMenu* fsmenu, FSMenuCategory category, int idx, short xs, short ys)
+short fsmenu_can_save (struct FSMenu* fsmenu, FSMenuCategory category, int idx)
{
FSMenuEntry *fsme;
for (fsme= fsmenu_get_category(fsmenu, category); fsme && idx; fsme= fsme->next)
idx--;
- if (fsme) {
- fsme->xs = xs;
- fsme->ys = ys;
- }
-}
-
-int fsmenu_get_pos (struct FSMenu* fsmenu, FSMenuCategory category, int idx, short* xs, short* ys)
-{
- FSMenuEntry *fsme;
-
- for (fsme= fsmenu_get_category(fsmenu, category); fsme && idx; fsme= fsme->next)
- idx--;
-
- if (fsme) {
- *xs = fsme->xs;
- *ys = fsme->ys;
- return 1;
- }
-
- return 0;
+ return fsme?fsme->save:0;
}
-
void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save)
{
FSMenuEntry *prev;
@@ -280,7 +254,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
FSMenuCategory category = FS_CATEGORY_BOOKMARKS;
FILE *fp;
- #ifdef WIN32
+#ifdef WIN32
/* Add the drive names to the listing */
{
__int64 tmp;
@@ -307,8 +281,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, folder, 1, 0);
}
-#endif
-
+#else
#ifdef __APPLE__
{
OSErr err=noErr;
@@ -328,6 +301,61 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, (char *)path, 1, 0);
}
}
+#else
+ /* unix */
+ {
+ char dir[FILE_MAXDIR];
+ char *home= BLI_gethome();
+
+ if(home) {
+ BLI_snprintf(dir, FILE_MAXDIR, "%s/", home);
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0);
+ BLI_snprintf(dir, FILE_MAXDIR, "%s/Desktop/", home);
+ if (BLI_exists(dir)) {
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0);
+ }
+ }
+
+ {
+ int found= 0;
+#ifdef __linux__
+ /* loop over mount points */
+ struct mntent *mnt;
+ FILE *fp;
+ int len;
+
+ fp = setmntent (MOUNTED, "r");
+ if (fp == NULL) {
+ fprintf(stderr, "could not get a list of mounted filesystemts\n");
+ }
+ else {
+ while ((mnt = getmntent (fp))) {
+ /* not sure if this is right, but seems to give the relevant mnts */
+ if(strncmp(mnt->mnt_fsname, "/dev", 4))
+ continue;
+
+ len= strlen(mnt->mnt_dir);
+ if(len && mnt->mnt_dir[len-1] != '/') {
+ BLI_snprintf(dir, FILE_MAXDIR, "%s/", mnt->mnt_dir);
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, dir, 1, 0);
+ }
+ else
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, mnt->mnt_dir, 1, 0);
+
+ found= 1;
+ }
+ if (endmntent (fp) == 0) {
+ fprintf(stderr, "could not close the list of mounted filesystemts\n");
+ }
+ }
+#endif
+
+ /* fallback */
+ if(!found)
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, "/", 1, 0);
+ }
+ }
+#endif
#endif
fp = fopen(filename, "r");
@@ -345,7 +373,9 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename)
if (line[len-1] == '\n') {
line[len-1] = '\0';
}
- fsmenu_insert_entry(fsmenu, category, line, 0, 1);
+ if (BLI_exist(line)) {
+ fsmenu_insert_entry(fsmenu, category, line, 0, 1);
+ }
}
}
}
diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h
index c51c45b7dc4..2cab622d523 100644
--- a/source/blender/editors/space_file/fsmenu.h
+++ b/source/blender/editors/space_file/fsmenu.h
@@ -52,22 +52,15 @@ int fsmenu_get_nentries (struct FSMenu* fsmenu, FSMenuCategory category);
*/
char* fsmenu_get_entry (struct FSMenu* fsmenu, FSMenuCategory category, int index);
-void fsmenu_select_entry (struct FSMenu* fsmenu, FSMenuCategory category, int index);
-
-int fsmenu_is_selected (struct FSMenu* fsmenu, FSMenuCategory category, int index);
-
- /** Sets the position of the fsmenu entry at @a index */
-void fsmenu_set_pos (struct FSMenu* fsmenu, FSMenuCategory category, int index, short xs, short ys);
-
- /** Returns the position of the fsmenu entry at @a index. return value is 1 if successful, 0 otherwise */
-int fsmenu_get_pos (struct FSMenu* fsmenu, FSMenuCategory category, int index, short* xs, short* ys);
-
/** Inserts a new fsmenu entry with the given @a path.
* 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);
+ /** 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);
+
/** Removes the fsmenu entry at the given @a index. */
void fsmenu_remove_entry (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 37d8f2bffa4..ca2c145c52b 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -34,6 +34,8 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "RNA_access.h"
+
#include "MEM_guardedalloc.h"
#include "BIF_gl.h"
@@ -43,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_rand.h"
+#include "BLI_storage_types.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
@@ -104,7 +107,7 @@ static SpaceLink *file_new(const bContext *C)
ar->regiontype= RGN_TYPE_WINDOW;
ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM);
ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
- ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
ar->v2d.keeptot= V2D_KEEPTOT_STRICT;
ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
@@ -117,11 +120,24 @@ static void file_free(SpaceLink *sl)
SpaceFile *sfile= (SpaceFile *) sl;
if(sfile->files) {
+ filelist_freelib(sfile->files);
filelist_free(sfile->files);
MEM_freeN(sfile->files);
sfile->files= NULL;
}
+ if(sfile->folders_prev) {
+ folderlist_free(sfile->folders_prev);
+ MEM_freeN(sfile->folders_prev);
+ sfile->folders_prev= NULL;
+ }
+
+ if(sfile->folders_next) {
+ folderlist_free(sfile->folders_next);
+ MEM_freeN(sfile->folders_next);
+ sfile->folders_next= NULL;
+ }
+
if (sfile->params) {
if(sfile->params->pupmenu)
MEM_freeN(sfile->params->pupmenu);
@@ -139,6 +155,8 @@ static void file_free(SpaceLink *sl)
/* spacetype; init callback, area size changes, screen set, etc */
static void file_init(struct wmWindowManager *wm, ScrArea *sa)
{
+ //SpaceFile *sfile= (SpaceFile*)sa->spacedata.first;
+ printf("file_init\n");
}
@@ -150,12 +168,17 @@ static SpaceLink *file_duplicate(SpaceLink *sl)
/* clear or remove stuff from old */
sfilen->op = NULL; /* file window doesn't own operators */
- sfilen->files = filelist_new();
-
+ if (sfileo->params)
+ sfilen->files = filelist_new(sfileo->params->type);
+ if(sfileo->folders_prev)
+ sfilen->folders_prev = MEM_dupallocN(sfileo->folders_prev);
+
+ if(sfileo->folders_next)
+ sfilen->folders_next = MEM_dupallocN(sfileo->folders_next);
+
if(sfileo->params) {
sfilen->params= MEM_dupallocN(sfileo->params);
-
- filelist_setdir(sfilen->files, sfilen->params->dir);
+ file_change_dir(sfilen);
}
if (sfileo->layout) {
sfilen->layout= MEM_dupallocN(sfileo->layout);
@@ -163,55 +186,113 @@ static SpaceLink *file_duplicate(SpaceLink *sl)
return (SpaceLink *)sfilen;
}
+static void file_refresh(const bContext *C, ScrArea *sa)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+
+ if (!sfile->folders_prev)
+ sfile->folders_prev = folderlist_new();
+ if (!sfile->files) {
+ sfile->files = filelist_new(params->type);
+ file_change_dir(sfile);
+ params->active_file = -1; // added this so it opens nicer (ton)
+ }
+ filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT);
+ filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0);
+ if (filelist_empty(sfile->files))
+ {
+ filelist_readdir(sfile->files);
+ BLI_strncpy(params->dir, filelist_dir(sfile->files), FILE_MAX);
+ }
+ if(params->sort!=FILE_SORT_NONE) filelist_sort(sfile->files, params->sort);
+
+ if (params->renamefile[0] != '\0') {
+ int idx = filelist_find(sfile->files, params->renamefile);
+ if (idx >= 0) {
+ struct direntry *file= filelist_file(sfile->files, idx);
+ if (file) {
+ file->flags |= EDITING;
+ }
+ }
+ params->renamefile[0] = '\0';
+ }
+ if (sfile->layout) sfile->layout->dirty= 1;
+
+}
+
+static void file_listener(ScrArea *sa, wmNotifier *wmn)
+{
+ SpaceFile* sfile = (SpaceFile*)sa->spacedata.first;
+
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SPACE:
+ switch (wmn->data) {
+ case ND_SPACE_FILE_LIST:
+ if (sfile->files) filelist_free(sfile->files);
+ ED_area_tag_refresh(sa);
+ ED_area_tag_redraw(sa);
+ break;
+ case ND_SPACE_FILE_PARAMS:
+ ED_area_tag_refresh(sa);
+ ED_area_tag_redraw(sa);
+ break;
+ }
+ break;
+ }
+}
/* add handlers, stuff you only do once or on area/region changes */
static void file_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
- /* own keymap */
- keymap= WM_keymap_listbase(wm, "File", SPACE_FILE, 0); /* XXX weak? */
+ /* own keymaps */
+ keymap= WM_keymap_find(wm, "File", SPACE_FILE, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
+ keymap= WM_keymap_find(wm, "FileMain", SPACE_FILE, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
+static void file_main_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SPACE:
+ switch (wmn->data) {
+ case ND_SPACE_FILE_LIST:
+ ED_region_tag_redraw(ar);
+ break;
+ case ND_SPACE_FILE_PARAMS:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ }
+}
+
static void file_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams *params = ED_fileselect_get_params(sfile);
FileLayout *layout=NULL;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
float col[3];
-
- if (!sfile->files) {
- sfile->files = filelist_new();
- filelist_setdir(sfile->files, params->dir);
- params->active_file = -1; // added this so it opens nicer (ton)
- }
-
- layout = ED_fileselect_get_layout(sfile, ar);
- if (filelist_empty(sfile->files))
- {
- unsigned int filter = 0;
- filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT);
- if (params->flag & FILE_FILTER) {
- filter = params->filter ;
- } else {
- filter = 0;
- }
+ /* Needed, because filelist is not initialized on loading */
+ if (!sfile->files || filelist_empty(sfile->files))
+ file_refresh(C, NULL);
- filelist_setfilter(sfile->files, filter);
- filelist_readdir(sfile->files);
-
- if(params->sort!=FILE_SORTALPHA) filelist_sort(sfile->files, params->sort);
- }
+ layout = ED_fileselect_get_layout(sfile, ar);
/* clear and setup matrix */
UI_GetThemeColor3fv(TH_BACK, col);
@@ -241,15 +322,10 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
/* on first read, find active file */
if (params->active_file == -1) {
wmEvent *event= CTX_wm_window(C)->eventstate;
- file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin);
- }
-
- if (params->display == FILE_IMGDISPLAY) {
- file_draw_previews(C, ar);
- } else {
- file_draw_list(C, ar);
+ file_hilight_set(sfile, ar, event->x, event->y);
}
+ file_draw_list(C, ar);
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -269,88 +345,124 @@ void file_operatortypes(void)
WM_operatortype_append(FILE_OT_select_bookmark);
WM_operatortype_append(FILE_OT_loadimages);
WM_operatortype_append(FILE_OT_highlight);
- WM_operatortype_append(FILE_OT_exec);
+ WM_operatortype_append(FILE_OT_execute);
WM_operatortype_append(FILE_OT_cancel);
WM_operatortype_append(FILE_OT_parent);
+ WM_operatortype_append(FILE_OT_previous);
+ WM_operatortype_append(FILE_OT_next);
WM_operatortype_append(FILE_OT_refresh);
WM_operatortype_append(FILE_OT_bookmark_toggle);
+ WM_operatortype_append(FILE_OT_add_bookmark);
+ WM_operatortype_append(FILE_OT_delete_bookmark);
+ WM_operatortype_append(FILE_OT_hidedot);
+ WM_operatortype_append(FILE_OT_filenum);
+ WM_operatortype_append(FILE_OT_directory_new);
+ WM_operatortype_append(FILE_OT_delete);
+ WM_operatortype_append(FILE_OT_rename);
}
/* NOTE: do not add .blend file reading on this level */
void file_keymap(struct wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "File", SPACE_FILE, 0);
+ wmKeymapItem *kmi;
+ /* keys for all areas */
+ wmKeyMap *keymap= WM_keymap_find(wm, "File", SPACE_FILE, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_bookmark_toggle", NKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_parent", PKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_add_bookmark", BKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_hidedot", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_previous", BACKSPACEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_next", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0); /* XXX needs button */
+ WM_keymap_add_item(keymap, "FILE_OT_delete", XKEY, KM_PRESS, 0, 0);
+
+ /* keys for main area */
+ keymap= WM_keymap_find(wm, "FileMain", SPACE_FILE, 0);
WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "FILE_OT_highlight", MOUSEMOVE, KM_ANY, 0, 0);
- WM_keymap_add_item(keymap, "FILE_OT_parent", PKEY, KM_PRESS, 0, 0);
-
WM_keymap_add_item(keymap, "FILE_OT_loadimages", TIMER1, KM_ANY, KM_ANY, 0);
-
- keymap= WM_keymap_listbase(wm, "FileBookmark", SPACE_FILE, 0);
- WM_keymap_add_item(keymap, "FILE_OT_select_bookmark", LEFTMOUSE, KM_PRESS, 0, 0);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "increment", 1);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "increment", 10);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_int_set(kmi->ptr, "increment", 100);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0,0);
+ RNA_int_set(kmi->ptr, "increment", -1);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "increment", -10);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL, 0);
+ RNA_int_set(kmi->ptr, "increment",-100);
+
+ /* keys for button area (top) */
+ keymap= WM_keymap_find(wm, "FileButtons", SPACE_FILE, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "increment", 1);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "increment", 10);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_int_set(kmi->ptr, "increment", 100);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "increment", -1);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT,0);
+ RNA_int_set(kmi->ptr, "increment", -10);
+ kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL,0);
+ RNA_int_set(kmi->ptr, "increment",-100);
}
static void file_channel_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
+ ED_region_panels_init(wm, ar);
- /* own keymap */
- keymap= WM_keymap_listbase(wm, "FileBookmark", SPACE_FILE, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, NULL);
+ /* own keymaps */
+ keymap= WM_keymap_find(wm, "File", SPACE_FILE, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void file_channel_area_draw(const bContext *C, ARegion *ar)
{
- View2D *v2d= &ar->v2d;
- float col[3];
-
- UI_GetThemeColor3fv(TH_PANEL, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* data... */
- UI_view2d_view_ortho(C, v2d);
+ ED_region_panels(C, ar, 1, NULL, -1);
+}
- file_draw_fsmenu(C, ar);
+static void file_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+
+ }
}
/* add handlers, stuff you only do once or on area/region changes */
static void file_header_area_init(wmWindowManager *wm, ARegion *ar)
{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+ ED_region_header_init(ar);
}
static void file_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- file_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ ED_region_header(C, ar);
}
/* add handlers, stuff you only do once or on area/region changes */
static void file_ui_area_init(wmWindowManager *wm, ARegion *ar)
{
+ wmKeyMap *keymap;
+
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+
+ /* own keymap */
+ keymap= WM_keymap_find(wm, "File", SPACE_FILE, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
+ keymap= WM_keymap_find(wm, "FileButtons", SPACE_FILE, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void file_ui_area_draw(const bContext *C, ARegion *ar)
@@ -369,10 +481,19 @@ static void file_ui_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
-//static void file_main_area_listener(ARegion *ar, wmNotifier *wmn)
-//{
+static void file_ui_area_listener(ARegion *ar, wmNotifier *wmn)
+{
/* context changes */
-//}
+ switch(wmn->category) {
+ case NC_SPACE:
+ switch (wmn->data) {
+ case ND_SPACE_FILE_LIST:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ }
+}
/* only called once, from space/spacetypes.c */
void ED_spacetype_file(void)
@@ -386,6 +507,8 @@ void ED_spacetype_file(void)
st->free= file_free;
st->init= file_init;
st->duplicate= file_duplicate;
+ st->refresh= file_refresh;
+ st->listener= file_listener;
st->operatortypes= file_operatortypes;
st->keymap= file_keymap;
@@ -394,7 +517,7 @@ void ED_spacetype_file(void)
art->regionid = RGN_TYPE_WINDOW;
art->init= file_main_area_init;
art->draw= file_main_area_draw;
- // art->listener= file_main_area_listener;
+ art->listener= file_main_area_listener;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
BLI_addhead(&st->regiontypes, art);
@@ -405,6 +528,7 @@ void ED_spacetype_file(void)
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
art->init= file_header_area_init;
art->draw= file_header_area_draw;
+ // art->listener= file_header_area_listener;
BLI_addhead(&st->regiontypes, art);
/* regions: ui */
@@ -412,6 +536,7 @@ void ED_spacetype_file(void)
art->regionid = RGN_TYPE_UI;
art->minsizey= 60;
art->keymapflag= ED_KEYMAP_UI;
+ art->listener= file_ui_area_listener;
art->init= file_ui_area_init;
art->draw= file_ui_area_draw;
BLI_addhead(&st->regiontypes, art);
@@ -420,11 +545,13 @@ void ED_spacetype_file(void)
art= MEM_callocN(sizeof(ARegionType), "spacetype file region");
art->regionid = RGN_TYPE_CHANNELS;
art->minsizex= 240;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+ art->keymapflag= ED_KEYMAP_UI;
+ art->listener= file_channel_area_listener;
art->init= file_channel_area_init;
art->draw= file_channel_area_draw;
BLI_addhead(&st->regiontypes, art);
-
+ file_panels_register(art);
+
BKE_spacetype_register(st);
}
diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c
index 25890953320..994f38320f2 100644
--- a/source/blender/editors/space_file/writeimage.c
+++ b/source/blender/editors/space_file/writeimage.c
@@ -53,7 +53,7 @@
/* XXX */
static void error() {}
-static void waitcursor() {}
+static void waitcursor(int val) {}
static void activate_fileselect() {}
static int saveover() {return 0;}
/* XXX */
@@ -153,6 +153,9 @@ void save_image_filesel_str(Scene *scene, char *str)
strcpy(str, "Save Radiance HDR");
break;
case R_FFMPEG:
+ case R_H264:
+ case R_XVID:
+ case R_THEORA:
case R_PNG:
strcpy(str, "Save PNG");
break;
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index a4babaad74c..09008f8d2d1 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -46,15 +46,16 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
-#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_global.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -160,7 +161,7 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
}
getname_anim_fcurve(name, ale->id, fcu);
- uiDefBut(block, LABEL, 1, name, 30, 180, 300, 19, NULL, 0.0, 0.0, 0, 0, "Name of Active F-Curve");
+ uiDefBut(block, LABEL, 1, name, 40, 180, 300, 19, NULL, 0.0, 0.0, 0, 0, "Name of Active F-Curve");
/* TODO: the following settings could be added here
* - F-Curve coloring mode - mode selector + color selector
@@ -242,7 +243,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)
{
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
if(sipo->mode != SIPO_MODE_DRIVERS)
return 0;
@@ -250,6 +251,22 @@ static int graph_panel_drivers_poll(const bContext *C, PanelType *pt)
return graph_panel_context(C, NULL, NULL);
}
+static void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ id= CTX_data_main(C)->object.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_lib_extern(id); /* checks lib data, sets correct flag for saving then */
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
/* driver settings for active F-Curve (only for 'Drivers' mode) */
static void graph_panel_drivers(const bContext *C, Panel *pa)
{
@@ -347,6 +364,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
}
/* ******************* f-modifiers ******************************** */
+/* all the drawing code is in editors/animation/fmodifier_ui.c */
#define B_FMODIFIER_REDRAW 20
@@ -360,671 +378,41 @@ static void do_graph_region_modifier_buttons(bContext *C, void *arg, int event)
}
}
-/* macro for use here to draw background box and set height */
-// XXX for now, roundbox has it's callback func set to NULL to not intercept events
-#define DRAW_BACKDROP(height) \
- { \
- uiDefBut(block, ROUNDBOX, B_REDR, "", -3, *yco-height, width+3, height-1, NULL, 5.0, 0.0, 12.0, (float)rb_col, ""); \
- }
-
-/* callback to verify modifier data */
-static void validate_fmodifier_cb (bContext *C, void *fcu_v, void *fcm_v)
-{
- FModifier *fcm= (FModifier *)fcm_v;
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* call the verify callback on the modifier if applicable */
- if (fmi && fmi->verify_data)
- fmi->verify_data(fcm);
-}
-
-/* callback to set the active modifier */
-static void activate_fmodifier_cb (bContext *C, void *fcu_v, void *fcm_v)
-{
- FCurve *fcu= (FCurve *)fcu_v;
- FModifier *fcm= (FModifier *)fcm_v;
-
- /* call API function to set the active modifier for active F-Curve */
- fcurve_set_active_modifier(fcu, fcm);
-}
-
-/* callback to remove the given modifier */
-static void delete_fmodifier_cb (bContext *C, void *fcu_v, void *fcm_v)
-{
- FCurve *fcu= (FCurve *)fcu_v;
- FModifier *fcm= (FModifier *)fcm_v;
-
- /* remove the given F-Modifier from the F-Curve */
- fcurve_remove_modifier(fcu, fcm);
-}
-
-/* --------------- */
-
-/* draw settings for generator modifier */
-static void draw_modifier__generator(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco, short *height, short width, short active, int rb_col)
-{
- FMod_Generator *data= (FMod_Generator *)fcm->data;
- char gen_mode[]="Generator Type%t|Expanded Polynomial%x0|Factorised Polynomial%x1|Built-In Function%x2|Expression%x3";
- char fn_type[]="Built-In Function%t|Sin%x0|Cos%x1|Tan%x2|Square Root%x3|Natural Log%x4";
- int cy= *yco - 30;
- uiBut *but;
-
- /* set the height */
- (*height) = 90;
- switch (data->mode) {
- case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */
- (*height) += 20*(data->poly_order+1) + 20;
- break;
- case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* factorised polynomial */
- (*height) += 20 * data->poly_order + 15;
- break;
- case FCM_GENERATOR_FUNCTION: /* builtin function */
- (*height) += 55; // xxx
- break;
- case FCM_GENERATOR_EXPRESSION: /* py-expression */
- // xxx nothing to draw
- break;
- }
-
- /* basic settings (backdrop + mode selector + some padding) */
- DRAW_BACKDROP((*height));
- uiBlockBeginAlign(block);
- but= uiDefButS(block, MENU, B_FMODIFIER_REDRAW, gen_mode, 10,cy,width-30,19, &data->mode, 0, 0, 0, 0, "Selects type of generator algorithm.");
- uiButSetFunc(but, validate_fmodifier_cb, fcu, fcm);
- cy -= 20;
-
- uiDefButBitS(block, TOG, FCM_GENERATOR_ADDITIVE, B_FMODIFIER_REDRAW, "Additive", 10,cy,width-30,19, &data->flag, 0, 0, 0, 0, "Values generated by this modifier are applied on top of the existing values instead of overwriting them");
- cy -= 35;
- uiBlockEndAlign(block);
-
- /* now add settings for individual modes */
- switch (data->mode) {
- case FCM_GENERATOR_POLYNOMIAL: /* polynomial expression */
- {
- float *cp = NULL;
- char xval[32];
- unsigned int i;
-
- /* draw polynomial order selector */
- but= uiDefButS(block, NUM, B_FMODIFIER_REDRAW, "Poly Order: ", 10,cy,width-30,19, &data->poly_order, 1, 100, 0, 0, "'Order' of the Polynomial - for a polynomial with n terms, 'order' is n-1");
- uiButSetFunc(but, validate_fmodifier_cb, fcu, fcm);
- cy -= 35;
-
- /* draw controls for each coefficient and a + sign at end of row */
- uiDefBut(block, LABEL, 1, "y = ", 0, cy, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- cp= data->coefficients;
- for (i=0; (i < data->arraysize) && (cp); i++, cp++) {
- /* coefficient */
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 50, cy, 150, 20, cp, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient for polynomial");
-
- /* 'x' param (and '+' if necessary) */
- if (i == 0)
- strcpy(xval, "");
- else if (i == 1)
- strcpy(xval, "x");
- else
- sprintf(xval, "x^%d", i);
- uiDefBut(block, LABEL, 1, xval, 200, cy, 50, 20, NULL, 0.0, 0.0, 0, 0, "Power of x");
-
- if ( (i != (data->arraysize - 1)) || ((i==0) && data->arraysize==2) )
- uiDefBut(block, LABEL, 1, "+", 250, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- cy -= 20;
- }
- }
- break;
-
- case FCM_GENERATOR_POLYNOMIAL_FACTORISED: /* factorised polynomial expression */
- {
- float *cp = NULL;
- unsigned int i;
-
- /* draw polynomial order selector */
- but= uiDefButS(block, NUM, B_FMODIFIER_REDRAW, "Poly Order: ", 10,cy,width-30,19, &data->poly_order, 1, 100, 0, 0, "'Order' of the Polynomial - for a polynomial with n terms, 'order' is n-1");
- uiButSetFunc(but, validate_fmodifier_cb, fcu, fcm);
- cy -= 35;
-
- /* draw controls for each pair of coefficients */
- uiDefBut(block, LABEL, 1, "y = ", 0, cy, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- cp= data->coefficients;
- for (i=0; (i < data->poly_order) && (cp); i++, cp+=2) {
- /* opening bracket */
- uiDefBut(block, LABEL, 1, "(", 40, cy, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- /* coefficients */
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 50, cy, 100, 20, cp, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient of x");
-
- uiDefBut(block, LABEL, 1, "x + ", 150, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 180, cy, 100, 20, cp+1, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Second coefficient");
-
- /* closing bracket and '+' sign */
- if ( (i != (data->poly_order - 1)) || ((i==0) && data->poly_order==2) )
- uiDefBut(block, LABEL, 1, ") â—Š", 280, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
- else
- uiDefBut(block, LABEL, 1, ")", 280, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- cy -= 20;
- }
- }
- break;
-
- case FCM_GENERATOR_FUNCTION: /* built-in function */
- {
- float *cp= data->coefficients;
-
- /* draw function selector */
- but= uiDefButS(block, MENU, B_FMODIFIER_REDRAW, fn_type, 10,cy,width-30,19, &data->func_type, 0, 0, 0, 0, "Built-In Function to use");
- uiButSetFunc(but, validate_fmodifier_cb, fcu, fcm);
- cy -= 35;
-
- /* draw controls for equation of coefficients */
- /* row 1 */
- {
- uiDefBut(block, LABEL, 1, "y = ", 0, cy, 50, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 50, cy, 150, 20, cp+3, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient (D) for function");
- uiDefBut(block, LABEL, 1, "+", 200, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
- cy -= 20;
- }
-
- /* row 2 */
- {
- char func_name[32];
-
- /* coefficient outside bracket */
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 5, cy, 80, 20, cp, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient (A) for function");
-
- /* opening bracket */
- switch (data->func_type)
- {
- case FCM_GENERATOR_FN_SIN: /* sine wave */
- sprintf(func_name, "sin(");
- break;
- case FCM_GENERATOR_FN_COS: /* cosine wave */
- sprintf(func_name, "cos(");
- break;
- case FCM_GENERATOR_FN_TAN: /* tangent wave */
- sprintf(func_name, "tan(");
- break;
- case FCM_GENERATOR_FN_LN: /* natural log */
- sprintf(func_name, "ln(");
- break;
- case FCM_GENERATOR_FN_SQRT: /* square root */
- sprintf(func_name, "sqrt(");
- break;
- default: /* unknown */
- sprintf(func_name, "<fn?>(");
- break;
- }
- uiDefBut(block, LABEL, 1, func_name, 85, cy, 40, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- /* coefficients inside bracket */
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 120, cy, 75, 20, cp+1, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient (B) of x");
-
- uiDefBut(block, LABEL, 1, "x+", 195, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 225, cy, 80, 20, cp+2, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "Coefficient (C) of function");
-
- /* closing bracket */
- uiDefBut(block, LABEL, 1, ")", 300, cy, 30, 20, NULL, 0.0, 0.0, 0, 0, "");
- cy -= 20;
- }
- }
- break;
-
- case FCM_GENERATOR_EXPRESSION: /* py-expression */
- // TODO...
- break;
- }
-}
-
-/* --------------- */
-
-/* draw settings for cycles modifier */
-static void draw_modifier__cycles(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco, short *height, short width, short active, int rb_col)
-{
- FMod_Cycles *data= (FMod_Cycles *)fcm->data;
- char cyc_mode[]="Cycling Mode%t|No Cycles%x0|Repeat Motion%x1|Repeat with Offset%x2|Repeat Mirrored%x3";
- int cy= (*yco - 30), cy1= (*yco - 50), cy2= (*yco - 70);
-
- /* set the height */
- (*height) = 80;
-
- /* basic settings (backdrop + some padding) */
- DRAW_BACKDROP((*height));
-
- /* 'before' range */
- uiDefBut(block, LABEL, 1, "Before:", 4, cy, 80, 20, NULL, 0.0, 0.0, 0, 0, "Settings for cycling before first keyframe");
- uiBlockBeginAlign(block);
- uiDefButS(block, MENU, B_FMODIFIER_REDRAW, cyc_mode, 3,cy1,150,20, &data->before_mode, 0, 0, 0, 0, "Cycling mode to use before first keyframe");
- uiDefButS(block, NUM, B_FMODIFIER_REDRAW, "Max Cycles:", 3, cy2, 150, 20, &data->before_cycles, 0, 10000, 10, 3, "Maximum number of cycles to allow (0 = infinite)");
- uiBlockEndAlign(block);
-
- /* 'after' range */
- uiDefBut(block, LABEL, 1, "After:", 155, cy, 80, 20, NULL, 0.0, 0.0, 0, 0, "Settings for cycling after last keyframe");
- uiBlockBeginAlign(block);
- uiDefButS(block, MENU, B_FMODIFIER_REDRAW, cyc_mode, 157,cy1,150,20, &data->after_mode, 0, 0, 0, 0, "Cycling mode to use after first keyframe");
- uiDefButS(block, NUM, B_FMODIFIER_REDRAW, "Max Cycles:", 157, cy2, 150, 20, &data->after_cycles, 0, 10000, 10, 3, "Maximum number of cycles to allow (0 = infinite)");
- uiBlockEndAlign(block);
-}
-
-/* --------------- */
-
-/* draw settings for noise modifier */
-static void draw_modifier__noise(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco, short *height, short width, short active, int rb_col)
-{
- FMod_Noise *data= (FMod_Noise *)fcm->data;
- int cy= (*yco - 30), cy1= (*yco - 50), cy2= (*yco - 70);
- char cyc_mode[]="Modification %t|Replace %x0|Add %x1|Subtract %x2|Multiply %x3";
-
- /* set the height */
- (*height) = 80;
-
- /* basic settings (backdrop + some padding) */
- DRAW_BACKDROP((*height));
-
- uiDefButS(block, MENU, B_FMODIFIER_REDRAW, cyc_mode,
- 3, cy, 150, 20, &data->modification, 0, 0, 0, 0, "Method of modifying the existing F-Curve use before first keyframe");
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Size:",
- 3, cy1, 150, 20, &data->size, 0.000001, 10000.0, 0.01, 3, "");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Strength:",
- 3, cy2, 150, 20, &data->strength, 0.0, 10000.0, 0.01, 3, "");
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Phase:",
- 155, cy1, 150, 20, &data->phase, 0.0, 100000.0, 0.1, 3, "");
- uiDefButS(block, NUM, B_FMODIFIER_REDRAW, "Depth:",
- 155, cy2, 150, 20, &data->depth, 0, 128, 1, 3, "");
-
-}
-
-/* --------------- */
-
-#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001
-
-/* Binary search algorithm for finding where to insert Envelope Data Point.
- * Returns the index to insert at (data already at that index will be offset if replace is 0)
- */
-static int binarysearch_fcm_envelopedata_index (FCM_EnvelopeData array[], float frame, int arraylen, short *exists)
-{
- int start=0, end=arraylen;
- int loopbreaker= 0, maxloop= arraylen * 2;
-
- /* initialise exists-flag first */
- *exists= 0;
-
- /* sneaky optimisations (don't go through searching process if...):
- * - keyframe to be added is to be added out of current bounds
- * - keyframe to be added would replace one of the existing ones on bounds
- */
- if ((arraylen <= 0) || (array == NULL)) {
- printf("Warning: binarysearch_fcm_envelopedata_index() encountered invalid array \n");
- return 0;
- }
- else {
- /* check whether to add before/after/on */
- float framenum;
-
- /* 'First' Point (when only one point, this case is used) */
- framenum= array[0].time;
- if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) {
- *exists = 1;
- return 0;
- }
- else if (frame < framenum)
- return 0;
-
- /* 'Last' Point */
- framenum= array[(arraylen-1)].time;
- if (IS_EQT(frame, framenum, BINARYSEARCH_FRAMEEQ_THRESH)) {
- *exists= 1;
- return (arraylen - 1);
- }
- else if (frame > framenum)
- return arraylen;
- }
-
-
- /* most of the time, this loop is just to find where to put it
- * - 'loopbreaker' is just here to prevent infinite loops
- */
- for (loopbreaker=0; (start <= end) && (loopbreaker < maxloop); loopbreaker++) {
- /* compute and get midpoint */
- int mid = start + ((end - start) / 2); /* we calculate the midpoint this way to avoid int overflows... */
- float midfra= array[mid].time;
-
- /* check if exactly equal to midpoint */
- if (IS_EQT(frame, midfra, BINARYSEARCH_FRAMEEQ_THRESH)) {
- *exists = 1;
- return mid;
- }
-
- /* repeat in upper/lower half */
- if (frame > midfra)
- start= mid + 1;
- else if (frame < midfra)
- end= mid - 1;
- }
-
- /* print error if loop-limit exceeded */
- if (loopbreaker == (maxloop-1)) {
- printf("Error: binarysearch_fcm_envelopedata_index() was taking too long \n");
-
- // include debug info
- printf("\tround = %d: start = %d, end = %d, arraylen = %d \n", loopbreaker, start, end, arraylen);
- }
-
- /* not found, so return where to place it */
- return start;
-}
-
-/* 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)
-{
- Scene *scene= CTX_data_scene(C);
- FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
- FCM_EnvelopeData *fedn;
- FCM_EnvelopeData fed;
-
- /* init template data */
- fed.min= -1.0f;
- fed.max= 1.0f;
- fed.time= (float)scene->r.cfra; // XXX make this int for ease of use?
- fed.f1= fed.f2= 0;
-
- /* check that no data exists for the current frame... */
- if (env->data) {
- short exists = -1;
- int i= binarysearch_fcm_envelopedata_index(env->data, (float)(scene->r.cfra), env->totvert, &exists);
-
- /* binarysearch_...() will set exists by default to 0, so if it is non-zero, that means that the point exists already */
- if (exists)
- return;
-
- /* add new */
- fedn= MEM_callocN((env->totvert+1)*sizeof(FCM_EnvelopeData), "FCM_EnvelopeData");
-
- /* add the points that should occur before the point to be pasted */
- if (i > 0)
- memcpy(fedn, env->data, i*sizeof(FCM_EnvelopeData));
-
- /* add point to paste at index i */
- *(fedn + i)= fed;
-
- /* add the points that occur after the point to be pasted */
- if (i < env->totvert)
- memcpy(fedn+i+1, env->data+i, (env->totvert-i)*sizeof(FCM_EnvelopeData));
-
- /* replace (+ free) old with new */
- MEM_freeN(env->data);
- env->data= fedn;
-
- env->totvert++;
- }
- else {
- env->data= MEM_callocN(sizeof(FCM_EnvelopeData), "FCM_EnvelopeData");
- *(env->data)= fed;
-
- env->totvert= 1;
- }
-}
-
-/* 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)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
- FCM_EnvelopeData *fedn;
- int index= GET_INT_FROM_POINTER(ind_v);
-
- /* check that no data exists for the current frame... */
- if (env->totvert > 1) {
- /* allocate a new smaller array */
- fedn= MEM_callocN(sizeof(FCM_EnvelopeData)*(env->totvert-1), "FCM_EnvelopeData");
-
- memcpy(fedn, &env->data, sizeof(FCM_EnvelopeData)*(index));
- memcpy(&fedn[index], &env->data[index+1], sizeof(FCM_EnvelopeData)*(env->totvert-index-1));
-
- /* free old array, and set the new */
- MEM_freeN(env->data);
- env->data= fedn;
- env->totvert--;
- }
- else {
- /* just free array, since the only vert was deleted */
- if (env->data)
- MEM_freeN(env->data);
- env->totvert= 0;
- }
-}
-
-/* draw settings for envelope modifier */
-static void draw_modifier__envelope(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco, short *height, short width, short active, int rb_col)
-{
- FMod_Envelope *env= (FMod_Envelope *)fcm->data;
- FCM_EnvelopeData *fed;
- uiBut *but;
- int cy= (*yco - 28);
- int i;
-
- /* set the height:
- * - basic settings + variable height from envelope controls
- */
- (*height) = 115 + (35 * env->totvert);
-
- /* basic settings (backdrop + general settings + some padding) */
- DRAW_BACKDROP((*height));
-
- /* General Settings */
- uiDefBut(block, LABEL, 1, "Envelope:", 10, cy, 100, 20, NULL, 0.0, 0.0, 0, 0, "Settings for cycling before first keyframe");
- cy -= 20;
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Reference Val:", 10, cy, 300, 20, &env->midval, -UI_FLT_MAX, UI_FLT_MAX, 10, 3, "");
- cy -= 20;
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Min:", 10, cy, 150, 20, &env->min, -UI_FLT_MAX, env->max, 10, 3, "Minimum value (relative to Reference Value) that is used as the 'normal' minimum value");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Max:", 160, cy, 150, 20, &env->max, env->min, UI_FLT_MAX, 10, 3, "Maximum value (relative to Reference Value) that is used as the 'normal' maximum value");
- cy -= 35;
- uiBlockEndAlign(block);
-
-
- /* Points header */
- uiDefBut(block, LABEL, 1, "Control Points:", 10, cy, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
-
- but= uiDefBut(block, BUT, B_FMODIFIER_REDRAW, "Add Point", 160,cy,150,19, NULL, 0, 0, 0, 0, "Adds a new control-point to the envelope on the current frame");
- uiButSetFunc(but, fmod_envelope_addpoint_cb, env, NULL);
- cy -= 35;
-
- /* Points List */
- for (i=0, fed=env->data; i < env->totvert; i++, fed++) {
- uiBlockBeginAlign(block);
- but=uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Fra:", 2, cy, 90, 20, &fed->time, -UI_FLT_MAX, UI_FLT_MAX, 10, 1, "Frame that envelope point occurs");
- uiButSetFunc(but, validate_fmodifier_cb, fcu, fcm);
-
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Min:", 92, cy, 100, 20, &fed->min, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, "Minimum bound of envelope at this point");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "Max:", 192, cy, 100, 20, &fed->max, -UI_FLT_MAX, UI_FLT_MAX, 10, 2, "Maximum bound of envelope at this point");
-
- but= uiDefIconBut(block, BUT, B_FMODIFIER_REDRAW, ICON_X, 292, cy, 18, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete envelope control point");
- uiButSetFunc(but, fmod_envelope_deletepoint_cb, env, SET_INT_IN_POINTER(i));
- uiBlockBeginAlign(block);
- cy -= 25;
- }
-}
-
-/* --------------- */
-
-/* draw settings for limits modifier */
-static void draw_modifier__limits(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco, short *height, short width, short active, int rb_col)
-{
- FMod_Limits *data= (FMod_Limits *)fcm->data;
- const int togButWidth = 50;
- const int textButWidth = ((width/2)-togButWidth);
-
- /* set the height */
- (*height) = 60;
-
- /* basic settings (backdrop + some padding) */
- DRAW_BACKDROP((*height));
-
- /* Draw Pairs of LimitToggle+LimitValue */
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOGBUT, FCM_LIMIT_XMIN, B_FMODIFIER_REDRAW, "xMin", 5, *yco-30, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x value");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 5+togButWidth, *yco-30, (textButWidth-5), 18, &data->rect.xmin, -UI_FLT_MAX, UI_FLT_MAX, 0.1,0.5,"Lowest x value to allow");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOGBUT, FCM_LIMIT_XMAX, B_FMODIFIER_REDRAW, "XMax", 5+(width-(textButWidth-5)-togButWidth), *yco-30, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum x value");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 5+(width-textButWidth-5), *yco-30, (textButWidth-5), 18, &data->rect.xmax, -UI_FLT_MAX, UI_FLT_MAX, 0.1,0.5,"Highest x value to allow");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOGBUT, FCM_LIMIT_YMIN, B_FMODIFIER_REDRAW, "yMin", 5, *yco-52, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y value");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 5+togButWidth, *yco-52, (textButWidth-5), 18, &data->rect.ymin, -UI_FLT_MAX, UI_FLT_MAX, 0.1,0.5,"Lowest y value to allow");
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOGBUT, FCM_LIMIT_YMAX, B_FMODIFIER_REDRAW, "YMax", 5+(width-(textButWidth-5)-togButWidth), *yco-52, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum y value");
- uiDefButF(block, NUM, B_FMODIFIER_REDRAW, "", 5+(width-textButWidth-5), *yco-52, (textButWidth-5), 18, &data->rect.ymax, -UI_FLT_MAX, UI_FLT_MAX, 0.1,0.5,"Highest y value to allow");
- uiBlockEndAlign(block);
-}
-
-/* --------------- */
-
-static void graph_panel_modifier_draw(uiBlock *block, FCurve *fcu, FModifier *fcm, int *yco)
-{
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
- uiBut *but;
- short active= (fcm->flag & FMODIFIER_FLAG_ACTIVE);
- short width= 314;
- short height = 0;
- int rb_col;
-
- /* draw header */
- {
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- /* rounded header */
- rb_col= (active)?-20:20;
- but= uiDefBut(block, ROUNDBOX, B_REDR, "", 0, *yco-2, width, 24, NULL, 5.0, 0.0, 15.0, (float)(rb_col-20), "");
-
- /* expand */
- uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_EXPANDED, B_REDR, ICON_TRIA_RIGHT, 5, *yco-1, 20, 20, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is expanded.");
-
- /* checkbox for 'active' status (for now) */
- but= uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_ACTIVE, B_REDR, ICON_RADIOBUT_OFF, 25, *yco-1, 20, 20, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is active one.");
- uiButSetFunc(but, activate_fmodifier_cb, fcu, fcm);
-
- /* name */
- if (fmi)
- uiDefBut(block, LABEL, 1, fmi->name, 10+40, *yco, 150, 20, NULL, 0.0, 0.0, 0, 0, "F-Curve Modifier Type. Click to make modifier active one.");
- else
- uiDefBut(block, LABEL, 1, "<Unknown Modifier>", 10+40, *yco, 150, 20, NULL, 0.0, 0.0, 0, 0, "F-Curve Modifier Type. Click to make modifier active one.");
-
- /* 'mute' button */
- uiDefIconButBitS(block, ICONTOG, FMODIFIER_FLAG_MUTED, B_REDR, ICON_MUTE_IPO_OFF, 10+(width-60), *yco-1, 20, 20, &fcm->flag, 0.0, 0.0, 0, 0, "Modifier is temporarily muted (not evaluated).");
-
- /* delete button */
- but= uiDefIconBut(block, BUT, B_REDR, ICON_X, 10+(width-30), *yco, 19, 19, NULL, 0.0, 0.0, 0.0, 0.0, "Delete F-Curve Modifier.");
- uiButSetFunc(but, delete_fmodifier_cb, fcu, fcm);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
-
- /* when modifier is expanded, draw settings */
- if (fcm->flag & FMODIFIER_FLAG_EXPANDED) {
- /* draw settings for individual modifiers */
- switch (fcm->type) {
- case FMODIFIER_TYPE_GENERATOR: /* Generator */
- draw_modifier__generator(block, fcu, fcm, yco, &height, width, active, rb_col);
- break;
-
- case FMODIFIER_TYPE_CYCLES: /* Cycles */
- draw_modifier__cycles(block, fcu, fcm, yco, &height, width, active, rb_col);
- break;
-
- case FMODIFIER_TYPE_ENVELOPE: /* Envelope */
- draw_modifier__envelope(block, fcu, fcm, yco, &height, width, active, rb_col);
- break;
-
- case FMODIFIER_TYPE_LIMITS: /* Limits */
- draw_modifier__limits(block, fcu, fcm, yco, &height, width, active, rb_col);
- break;
-
- case FMODIFIER_TYPE_NOISE: /* Noise */
- draw_modifier__noise(block, fcu, fcm, yco, &height, width, active, rb_col);
- break;
-
- default: /* unknown type */
- height= 96;
- //DRAW_BACKDROP(height); // XXX buggy...
- break;
- }
- }
-
- /* adjust height for new to start */
- (*yco) -= (height + 27);
-}
-
static void graph_panel_modifiers(const bContext *C, Panel *pa)
{
bAnimListElem *ale;
FCurve *fcu;
FModifier *fcm;
+ uiLayout *col, *row;
uiBlock *block;
- int yco= 190;
- if(!graph_panel_context(C, &ale, &fcu))
+ if (!graph_panel_context(C, &ale, &fcu))
return;
- block= uiLayoutFreeBlock(pa->layout);
+ block= uiLayoutGetBlock(pa->layout);
uiBlockSetHandleFunc(block, do_graph_region_modifier_buttons, NULL);
/* 'add modifier' button at top of panel */
- // XXX for now, this will be a operator button which calls a temporary 'add modifier' operator
- uiDefButO(block, BUT, "GRAPHEDIT_OT_fmodifier_add", WM_OP_INVOKE_REGION_WIN, "Add Modifier", 10, 225, 150, 20, "Adds a new F-Curve Modifier for the active F-Curve");
+ {
+ row= uiLayoutRow(pa->layout, 0);
+ block= uiLayoutGetBlock(row);
+
+ // XXX for now, this will be a operator button which calls a temporary 'add modifier' operator
+ uiDefButO(block, BUT, "GRAPH_OT_fmodifier_add", WM_OP_INVOKE_REGION_WIN, "Add Modifier", 10, 0, 150, 20, "Adds a new F-Curve Modifier for the active F-Curve");
+ }
/* draw each modifier */
- for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next)
- graph_panel_modifier_draw(block, fcu, fcm, &yco);
+ for (fcm= fcu->modifiers.first; fcm; fcm= fcm->next) {
+ col= uiLayoutColumn(pa->layout, 1);
+
+ ANIM_uiTemplate_fmodifier_draw(col, ale->id, &fcu->modifiers, fcm);
+ }
MEM_freeN(ale);
}
/* ******************* general ******************************** */
-/* Find 'active' F-Curve. It must be editable, since that's the purpose of these buttons (subject to change).
- * We return the 'wrapper' since it contains valuable context info (about hierarchy), which will need to be freed
- * when the caller is done with it.
- */
-// TODO: move this to anim api with another name?
-bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
-{
- ListBase anim_data = {NULL, NULL};
- int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_ACTIVE | ANIMFILTER_CURVESONLY);
- int items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* We take the first F-Curve only, since some other ones may have had 'active' flag set
- * if they were from linked data.
- */
- if (items) {
- bAnimListElem *ale= (bAnimListElem *)anim_data.first;
-
- /* remove first item from list, then free the rest of the list and return the stored one */
- BLI_remlink(&anim_data, ale);
- BLI_freelistN(&anim_data);
-
- return ale;
- }
-
- /* no active F-Curve */
- return NULL;
-}
-
void graph_buttons_register(ARegionType *art)
{
PanelType *pt;
@@ -1056,20 +444,16 @@ static int graph_properties(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= graph_has_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_properties(wmOperatorType *ot)
+void GRAPH_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
- ot->idname= "GRAPHEDIT_OT_properties";
+ ot->idname= "GRAPH_OT_properties";
ot->exec= graph_properties;
ot->poll= ED_operator_ipo_active; // xxx
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index ddf4105fdf4..9ae7e8263ee 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -51,7 +51,9 @@
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -673,8 +675,8 @@ static void draw_fcurve_curve_bezts (FCurve *fcu, View2D *v2d, View2DGrid *grid)
correct_bezpart(v1, v2, v3, v4);
- forward_diff_bezier(v1[0], v2[0], v3[0], v4[0], data, resol, 3);
- forward_diff_bezier(v1[1], v2[1], v3[1], v4[1], data+1, resol, 3);
+ forward_diff_bezier(v1[0], v2[0], v3[0], v4[0], data, resol, sizeof(float)*3);
+ forward_diff_bezier(v1[1], v2[1], v3[1], v4[1], data+1, resol, sizeof(float)*3);
for (fp= data; resol; resol--, fp+= 3)
glVertex2fv(fp);
@@ -722,24 +724,6 @@ static void draw_fcurve_curve_bezts (FCurve *fcu, View2D *v2d, View2DGrid *grid)
glEnd();
}
-#if 0
-static void draw_ipokey(SpaceIpo *sipo, ARegion *ar)
-{
- View2D *v2d= &ar->v2d;
- IpoKey *ik;
-
- glBegin(GL_LINES);
- for (ik= sipo->ipokey.first; ik; ik= ik->next) {
- if (ik->flag & SELECT) glColor3ub(0xFF, 0xFF, 0x99);
- else glColor3ub(0xAA, 0xAA, 0x55);
-
- glVertex2f(ik->val, v2d->cur.ymin);
- glVertex2f(ik->val, v2d->cur.ymax);
- }
- glEnd();
-}
-#endif
-
/* Public Curve-Drawing API ---------------- */
/* Draw the 'ghost' F-Curves (i.e. snapshots of the curve) */
@@ -775,46 +759,6 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
glDisable(GL_BLEND);
}
-/* check if any FModifiers to draw controls for - fcm is 'active' modifier */
-static 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 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;
-
- /* borderline... */
- case FMODIFIER_TYPE_NOISE:
- return 0;
- }
- }
-
- /* if only one modifier - don't draw if it is muted or disabled */
- if (fcu->modifiers.first == fcu->modifiers.last) {
- fcm= fcu->modifiers.first;
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
- 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;
-}
-
/* This is called twice from space_graph.c -> graph_main_area_draw()
* Unselected then selected F-Curves are drawn so that they do not occlude each other.
*/
@@ -835,12 +779,12 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
*/
for (ale=anim_data.first; ale; ale=ale->next) {
FCurve *fcu= (FCurve *)ale->key_data;
- FModifier *fcm= fcurve_find_active_modifier(fcu);
- //Object *nob= ANIM_nla_mapping_get(ac, ale);
+ FModifier *fcm= find_active_fmodifier(&fcu->modifiers);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* map keyframes for drawing if scaled F-Curve */
- //if (nob)
- // ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 0);
+ if (adt)
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 0);
/* draw curve:
* - curve line may be result of one or more destructive modifiers or just the raw data,
@@ -894,32 +838,36 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
glDisable(GL_BLEND);
}
- /* 2) draw handles and vertices as appropriate based on active */
- if (fcurve_needs_draw_fmodifier_controls(fcu, fcm)) {
- /* 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);
- break;
+ /* 2) draw handles and vertices as appropriate based on active
+ * - 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)) {
+ /* 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);
+ break;
+ }
}
}
- }
- else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) {
- if (fcu->bezt) {
- /* only draw handles/vertices on keyframes */
- draw_fcurve_handles(sipo, ar, fcu);
- draw_fcurve_vertices(sipo, ar, fcu);
- }
- else {
- /* samples: should we only draw two indicators at either end as indicators? */
- draw_fcurve_samples(sipo, ar, fcu);
+ else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) {
+ if (fcu->bezt) {
+ /* only draw handles/vertices on keyframes */
+ draw_fcurve_handles(sipo, ar, fcu);
+ draw_fcurve_vertices(sipo, ar, fcu);
+ }
+ else {
+ /* samples: should we only draw two indicators at either end as indicators? */
+ draw_fcurve_samples(sipo, ar, fcu);
+ }
}
}
/* undo mapping of keyframes for drawing if scaled F-Curve */
- //if (nob)
- // ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 0);
+ if (adt)
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 0);
}
/* free list of curves */
@@ -929,19 +877,15 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* ************************************************************************* */
/* Channel List */
-// XXX quite a few of these need to be kept in sync with their counterparts in Action Editor
-// as they're the same. We have 2 separate copies of this for now to make it easier to develop
-// the diffences between the two editors, but one day these should be merged!
-
/* left hand part */
-void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
+void graph_draw_channel_names(bContext *C, bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
View2D *v2d= &ar->v2d;
- float x= 0.0f, y= 0.0f, height;
+ float y= 0.0f, height;
int items, i=0;
/* build list of channels to draw */
@@ -955,477 +899,57 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
* start of list offset, and the second is as a correction for the scrollers.
*/
height= (float)((items*ACHANNEL_STEP) + (ACHANNEL_HEIGHT*2));
-
-#if 0
- if (height > (v2d->mask.ymax - v2d->mask.ymin)) {
- /* don't use totrect set, as the width stays the same
- * (NOTE: this is ok here, the configuration is pretty straightforward)
- */
- v2d->tot.ymin= (float)(-height);
- }
-
- /* XXX I would call the below line! (ton) */
-#endif
UI_view2d_totRect_set(v2d, ar->winx, height);
/* loop through channels, and set up drawing depending on their type */
- y= (float)ACHANNEL_FIRST;
-
- for (ale= anim_data.first, i=0; ale; ale= ale->next, i++) {
- const float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
- const float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
+ { /* first pass: just the standard GL-drawing for backdrop + text */
+ y= (float)ACHANNEL_FIRST;
- /* check if visible */
- if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
- IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
- {
- bActionGroup *grp = NULL;
- short indent= 0, offset= 0, sel= 0, group= 0;
- int expand= -1, protect = -1, special= -1, mute = -1;
- char name[128];
-
- /* determine what needs to be drawn */
- switch (ale->type) {
- case ANIMTYPE_SCENE: /* scene */
- {
- Scene *sce= (Scene *)ale->data;
-
- group= 4;
- indent= 0;
-
- special= ICON_SCENE_DATA;
-
- /* only show expand if there are any channels */
- if (EXPANDED_SCEC(sce))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_SCEC(sce);
- strcpy(name, sce->id.name+2);
- }
- break;
- case ANIMTYPE_OBJECT: /* object */
- {
- Base *base= (Base *)ale->data;
- Object *ob= base->object;
-
- group= 4;
- indent= 0;
-
- /* icon depends on object-type */
- if (ob->type == OB_ARMATURE)
- special= ICON_ARMATURE_DATA;
- else
- special= ICON_OBJECT_DATA;
-
- /* only show expand if there are any channels */
- if (EXPANDED_OBJC(ob))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_OBJC(base);
- strcpy(name, ob->id.name+2);
- }
- break;
- case ANIMTYPE_FILLACTD: /* action widget */
- {
- bAction *act= (bAction *)ale->data;
-
- group = 4;
- indent= 1;
- special= ICON_ACTION;
-
- if (EXPANDED_ACTC(act))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- sel = SEL_ACTC(act);
- strcpy(name, act->id.name+2);
- }
- break;
- case ANIMTYPE_FILLDRIVERS: /* drivers widget */
- {
- AnimData *adt= (AnimData *)ale->data;
-
- group = 4;
- indent= 1;
- special= ICON_ANIM_DATA;
-
- if (EXPANDED_DRVD(adt))
- expand= ICON_TRIA_DOWN;
- else
- expand= ICON_TRIA_RIGHT;
-
- strcpy(name, "Drivers");
- }
- break;
- case ANIMTYPE_FILLMATD: /* object materials (dopesheet) expand widget */
- {
- Object *ob = (Object *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_MATERIAL_DATA;
-
- if (FILTER_MAT_OBJC(ob))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, "Materials");
- }
- break;
-
-
- case ANIMTYPE_DSMAT: /* single material (dopesheet) expand widget */
- {
- Material *ma = (Material *)ale->data;
-
- group = 0;
- indent = 0;
- special = ICON_MATERIAL_DATA;
- offset = 21;
-
- if (FILTER_MAT_OBJD(ma))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, ma->id.name+2);
- }
- break;
- case ANIMTYPE_DSLAM: /* lamp (dopesheet) expand widget */
- {
- Lamp *la = (Lamp *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_LAMP_DATA;
-
- if (FILTER_LAM_OBJD(la))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, la->id.name+2);
- }
- break;
- case ANIMTYPE_DSCAM: /* camera (dopesheet) expand widget */
- {
- Camera *ca = (Camera *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_CAMERA_DATA;
-
- if (FILTER_CAM_OBJD(ca))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, ca->id.name+2);
- }
- break;
- case ANIMTYPE_DSCUR: /* curve (dopesheet) expand widget */
- {
- Curve *cu = (Curve *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_CURVE_DATA;
-
- if (FILTER_CUR_OBJD(cu))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, cu->id.name+2);
- }
- break;
- case ANIMTYPE_DSSKEY: /* shapekeys (dopesheet) expand widget */
- {
- Key *key= (Key *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_SHAPEKEY_DATA;
-
- if (FILTER_SKE_OBJD(key))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- //sel = SEL_OBJC(base);
- strcpy(name, "Shape Keys");
- }
- break;
- case ANIMTYPE_DSWOR: /* world (dopesheet) expand widget */
- {
- World *wo= (World *)ale->data;
-
- group = 4;
- indent = 1;
- special = ICON_WORLD_DATA;
-
- if (FILTER_WOR_SCED(wo))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
-
- strcpy(name, wo->id.name+2);
- }
- break;
-
-
- case ANIMTYPE_GROUP: /* action group */
- {
- bActionGroup *agrp= (bActionGroup *)ale->data;
-
- group= 2;
- indent= 0;
- special= -1;
-
- if (ale->id) {
- /* special exception for materials */
- if (GS(ale->id->name) == ID_MA)
- offset= 25;
- else
- offset= 14;
- }
- else
- offset= 0;
-
- /* only show expand if there are any channels */
- if (agrp->channels.first) {
- if (EXPANDED_AGRP(agrp))
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
- }
-
- if (EDITABLE_AGRP(agrp))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
-
- sel = SEL_AGRP(agrp);
- strcpy(name, agrp->name);
- }
- break;
- case ANIMTYPE_FCURVE: /* F-Curve channel */
- {
- FCurve *fcu = (FCurve *)ale->data;
-
- indent = 0;
-
- group= (fcu->grp) ? 1 : 0;
- grp= fcu->grp;
-
- if (ale->id) {
- /* special exception for materials */
- if (GS(ale->id->name) == ID_MA) {
- offset= 21;
- indent= 1;
- }
- else
- offset= 14;
- }
- else
- offset= 0;
-
- /* for now, 'special' (i.e. in front of name) is used to show visibility status */
- if (fcu->flag & FCURVE_VISIBLE)
- special= ICON_CHECKBOX_HLT;
- else
- special= ICON_CHECKBOX_DEHLT;
-
- if (fcu->flag & FCURVE_MUTED)
- mute = ICON_MUTE_IPO_ON;
- else
- mute = ICON_MUTE_IPO_OFF;
-
- if (fcu->bezt) {
- if (EDITABLE_FCU(fcu))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
- }
- else
- protect = ICON_ZOOMOUT; // XXX editability is irrelevant here, but this icon is temp...
-
- sel = SEL_FCU(fcu);
-
- getname_anim_fcurve(name, ale->id, fcu);
- }
- break;
-
- case ANIMTYPE_SHAPEKEY: /* shapekey channel */
- {
- KeyBlock *kb = (KeyBlock *)ale->data;
-
- indent = 0;
- special = -1;
-
- offset= (ale->id) ? 21 : 0;
-
- if (kb->name[0] == '\0')
- sprintf(name, "Key %d", ale->index);
- else
- strcpy(name, kb->name);
- }
- break;
- }
-
- /* now, start drawing based on this information */
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
+ for (ale= anim_data.first, i=0; ale; ale= ale->next, i++) {
+ const float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
+ const float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
- /* draw backing strip behind channel name */
- if (group == 4) {
- /* only used in dopesheet... */
- if (ELEM(ale->type, ANIMTYPE_SCENE, ANIMTYPE_OBJECT)) {
- /* object channel - darker */
- UI_ThemeColor(TH_DOPESHEET_CHANNELOB);
- uiSetRoundBox((expand == ICON_TRIA_DOWN)? (1):(1|8));
- gl_round_box(GL_POLYGON, x+offset, yminc, (float)ACHANNEL_NAMEWIDTH, ymaxc, 8);
- }
- else {
- /* sub-object folders - lighter */
- UI_ThemeColor(TH_DOPESHEET_CHANNELSUBOB);
-
- offset += 7 * indent;
- glBegin(GL_QUADS);
- glVertex2f(x+offset, yminc);
- glVertex2f(x+offset, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, yminc);
- glEnd();
-
- /* clear group value, otherwise we cause errors... */
- group = 0;
- }
- }
- else 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);
- }
- else if (group == 2) {
- /* only for action group channels */
- if (ale->flag & AGRP_ACTIVE)
- UI_ThemeColorShade(TH_GROUP_ACTIVE, 10);
- else
- 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);
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* draw all channels using standard channel-drawing API */
+ ANIM_channel_draw(ac, ale, yminc, ymaxc);
}
- else {
- short shadefac= ((indent==0)?20: (indent==1)?-20: -40);
-
- indent += group;
- offset += 7 * indent;
-
- /* draw channel backdrop */
- UI_ThemeColorShade(TH_HEADER, shadefac);
-
- glBegin(GL_QUADS);
- glVertex2f(x+offset, yminc);
- glVertex2f(x+offset, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, ymaxc);
- glVertex2f((float)ACHANNEL_NAMEWIDTH, yminc);
- glEnd();
-
- /* most of the time, only F-Curves are going to be drawn here */
- if (ale->type == ANIMTYPE_FCURVE) {
- /* F-Curve channels need to have a special 'color code' box drawn, which is colored with whatever
- * color the curve has stored
- */
- FCurve *fcu= (FCurve *)ale->data;
- glColor3fv(fcu->color);
-
- // NOTE: only enable the following line for the fading-out gradient
- //glShadeModel(GL_SMOOTH);
-
- glBegin(GL_QUADS);
- /* solid color for the area around the checkbox */
- glVertex2f(x+offset, yminc);
- glVertex2f(x+offset, ymaxc);
- glVertex2f(x+offset+18, ymaxc);
- glVertex2f(x+offset+18, yminc);
-
-#if 0 // fading out gradient
- /* fading out gradient for the rest of the box */
- glVertex2f(x+offset+18, yminc);
- glVertex2f(x+offset+18, ymaxc);
-
- UI_ThemeColorShade(TH_HEADER, shadefac); // XXX does this cause any problems on some cards?
-
- glVertex2f(x+offset+20, ymaxc);
- glVertex2f(x+offset+20, yminc);
-#endif // fading out gradient
- glEnd();
-
- // NOTE: only enable the following line for the fading-out gradient
- //glShadeModel(GL_FLAT);
- }
- }
-
- /* draw expand/collapse triangle */
- if (expand > 0) {
- UI_icon_draw(x+offset, yminc, expand);
- offset += 17;
- }
-
- /* draw special icon indicating certain data-types */
- if (special > -1) {
- if (ELEM(group, 3, 4)) {
- /* for gpdatablock channels */
- UI_icon_draw(x+offset, yminc, special);
- offset += 17;
- }
- else {
- /* for normal channels */
- UI_icon_draw(x+offset, yminc, special);
- offset += 17;
- }
- }
- glDisable(GL_BLEND);
-
- /* draw name */
- if (sel)
- UI_ThemeColor(TH_TEXT_HI);
- else
- UI_ThemeColor(TH_TEXT);
- offset += 3;
- UI_DrawString(x+offset, y-4, name);
- /* reset offset - for RHS of panel */
- offset = 0;
-
- /* set blending again, as text drawing may clear it */
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
+ /* adjust y-position for next one */
+ y -= ACHANNEL_STEP;
+ }
+ }
+ { /* second pass: widgets */
+ uiBlock *block= uiBeginBlock(C, ar, "graph channel buttons", UI_EMBOSS);
+
+ y= (float)ACHANNEL_FIRST;
+
+ /* set blending again, as may not be set in previous step */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ for (ale= anim_data.first, i=0; ale; ale= ale->next, i++) {
+ const float yminc= (float)(y - ACHANNEL_HEIGHT_HALF);
+ const float ymaxc= (float)(y + ACHANNEL_HEIGHT_HALF);
- /* draw protect 'lock' */
- if (protect > -1) {
- offset = 16;
- UI_icon_draw((float)ACHANNEL_NAMEWIDTH-offset, yminc, protect);
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* draw all channels using standard channel-drawing API */
+ ANIM_channel_draw_widgets(ac, ale, block, yminc, ymaxc);
}
- /* draw mute 'eye' */
- if (mute > -1) {
- offset += 16;
- UI_icon_draw((float)(ACHANNEL_NAMEWIDTH-offset), yminc, mute);
- }
- glDisable(GL_BLEND);
+ /* adjust y-position for next one */
+ y -= ACHANNEL_STEP;
}
- /* adjust y-position for next one */
- y -= ACHANNEL_STEP;
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+
+ glDisable(GL_BLEND);
}
/* free tempolary channels */
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index b624d02a633..d718ef28e99 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -67,21 +67,22 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_report.h"
#include "BKE_utildefines.h"
+#include "UI_interface.h"
#include "UI_view2d.h"
-#include "BIF_transform.h"
-
#include "ED_anim_api.h"
#include "ED_keyframing.h"
#include "ED_keyframes_draw.h"
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_space_api.h"
+#include "ED_transform.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -94,14 +95,15 @@
/* *************************** Calculate Range ************************** */
/* Get the min/max keyframes*/
-static void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax)
+/* note: it should return total boundbox, filter for selection only can be argument... */
+void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
/* get data to filter, from Dopesheet */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* set large values to try to override */
@@ -114,16 +116,16 @@ static void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xm
if (anim_data.first) {
/* go through channels, finding max extents */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= NULL; //ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
float txmin, txmax, tymin, tymax;
/* get range and apply necessary scaling before */
calc_fcurve_bounds(fcu, &txmin, &txmax, &tymin, &tymax);
- if (nob) {
- txmin= get_action_frame_inv(nob, txmin);
- txmax= get_action_frame_inv(nob, txmax);
+ if (adt) {
+ txmin= BKE_nla_tweakedit_remap(adt, txmin, NLATIME_CONVERT_MAP);
+ txmax= BKE_nla_tweakedit_remap(adt, txmax, NLATIME_CONVERT_MAP);
}
/* try to set cur using these values, if they're more extreme than previously set values */
@@ -180,15 +182,15 @@ static int graphkeys_previewrange_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_previewrange_set (wmOperatorType *ot)
+void GRAPH_OT_previewrange_set (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Auto-Set Preview Range";
- ot->idname= "GRAPHEDIT_OT_previewrange_set";
+ ot->idname= "GRAPH_OT_previewrange_set";
/* api callbacks */
ot->exec= graphkeys_previewrange_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -227,15 +229,16 @@ static int graphkeys_viewall_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_view_all (wmOperatorType *ot)
+void GRAPH_OT_view_all (wmOperatorType *ot)
{
/* identifiers */
ot->name= "View All";
- ot->idname= "GRAPHEDIT_OT_view_all";
+ ot->idname= "GRAPH_OT_view_all";
+ ot->description= "Reset viewable area to show full keyframe range.";
/* api callbacks */
ot->exec= graphkeys_viewall_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -271,6 +274,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end)
for (ale= anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->key_data;
FCurve *gcu= MEM_callocN(sizeof(FCurve), "Ghost FCurve");
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
ChannelDriver *driver= fcu->driver;
FPoint *fpt;
int cfra;
@@ -286,8 +290,10 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end)
/* use the sampling callback at 1-frame intervals from start to end frames */
for (cfra= start; cfra <= end; cfra++, fpt++) {
- fpt->vec[0]= (float)cfra;
- fpt->vec[1]= fcurve_samplingcb_evalcurve(fcu, NULL, (float)cfra);
+ float cfrae= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
+
+ fpt->vec[0]= cfrae;
+ fpt->vec[1]= fcurve_samplingcb_evalcurve(fcu, NULL, cfrae);
}
/* set color of ghost curve
@@ -334,16 +340,16 @@ static int graphkeys_create_ghostcurves_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_ghost_curves_create (wmOperatorType *ot)
+void GRAPH_OT_ghost_curves_create (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Create Ghost Curves";
- ot->idname= "GRAPHEDIT_OT_ghost_curves_create";
+ ot->idname= "GRAPH_OT_ghost_curves_create";
ot->description= "Create snapshot (Ghosts) of selected F-Curves as background aid for active Graph Editor.";
/* api callbacks */
ot->exec= graphkeys_create_ghostcurves_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -377,16 +383,16 @@ static int graphkeys_clear_ghostcurves_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_ghost_curves_clear (wmOperatorType *ot)
+void GRAPH_OT_ghost_curves_clear (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Create Ghost Curves";
- ot->idname= "GRAPHEDIT_OT_ghost_curves_clear";
+ ot->idname= "GRAPH_OT_ghost_curves_clear";
ot->description= "Clear F-Curve snapshots (Ghosts) for active Graph Editor.";
/* api callbacks */
ot->exec= graphkeys_clear_ghostcurves_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_ipo_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -395,7 +401,104 @@ void GRAPHEDIT_OT_ghost_curves_clear (wmOperatorType *ot)
/* ************************************************************************** */
/* GENERAL STUFF */
-// TODO: insertkey
+/* ******************** Insert Keyframes Operator ************************* */
+
+/* defines for insert keyframes tool */
+EnumPropertyItem prop_graphkeys_insertkey_types[] = {
+ {1, "ALL", 0, "All Channels", ""},
+ {2, "SEL", 0, "Only Selected Channels", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* this function is responsible for snapping keyframes to frame-times */
+static void insert_graph_keys(bAnimContext *ac, short mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene= ac->scene;
+ float cfra= (float)CFRA;
+ short flag = 0;
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
+ if (mode == 2) filter |= ANIMFILTER_SEL;
+
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* init keyframing flag */
+ if (IS_AUTOKEY_FLAG(AUTOMATKEY)) flag |= INSERTKEY_MATRIX;
+ if (IS_AUTOKEY_FLAG(INSERTNEEDED)) flag |= INSERTKEY_NEEDED;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS)) flag |= INSERTKEY_REPLACE;
+
+ /* insert keyframes */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+ FCurve *fcu= (FCurve *)ale->key_data;
+
+ /* adjust current frame for NLA-mapping */
+ if (adt)
+ cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
+ else
+ cfra= (float)CFRA;
+
+ /* 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);
+ else
+ insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
+ }
+
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int graphkeys_insertkey_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short mode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+ if (ac.datatype == ANIMCONT_GPENCIL)
+ return OPERATOR_CANCELLED;
+
+ /* which channels to affect? */
+ mode= RNA_enum_get(op->ptr, "type");
+
+ /* insert keyframes */
+ insert_graph_keys(&ac, mode);
+
+ /* validate keyframes after editing */
+ ANIM_editkeyframes_refresh(&ac);
+
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void GRAPH_OT_insert_keyframe (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Insert Keyframes";
+ ot->idname= "GRAPH_OT_insert_keyframe";
+ ot->description= "Insert keyframes for the specified channels.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= graphkeys_insertkey_exec;
+ ot->poll= graphop_editable_keyframes_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ RNA_def_enum(ot->srna, "type", prop_graphkeys_insertkey_types, 0, "Type", "");
+}
/* ******************** Click-Insert Keyframes Operator ************************* */
@@ -403,6 +506,7 @@ static int graphkeys_click_insert_exec (bContext *C, wmOperator *op)
{
bAnimContext ac;
bAnimListElem *ale;
+ AnimData *adt;
float frame, val;
/* get animation context */
@@ -420,14 +524,18 @@ static int graphkeys_click_insert_exec (bContext *C, wmOperator *op)
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);
+
/* insert keyframe on the specified frame + value */
insert_vert_fcurve((FCurve *)ale->data, frame, val, 0);
/* free temp data */
MEM_freeN(ale);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
/* done */
return OPERATOR_FINISHED;
@@ -461,16 +569,17 @@ static int graphkeys_click_insert_invoke (bContext *C, wmOperator *op, wmEvent *
return graphkeys_click_insert_exec(C, op);
}
-void GRAPHEDIT_OT_keyframes_click_insert (wmOperatorType *ot)
+void GRAPH_OT_click_insert (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Click-Insert Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_click_insert";
+ ot->idname= "GRAPH_OT_click_insert";
+ ot->description= "Insert new keyframe at the cursor position for the active F-Curve.";
/* api callbacks */
ot->invoke= graphkeys_click_insert_invoke;
ot->exec= graphkeys_click_insert_exec;
- ot->poll= ED_operator_areaactive; // XXX active + editable poll
+ ot->poll= graphop_active_fcurve_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -538,21 +647,20 @@ static int graphkeys_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
-
+ /* just return - no operator needed here (no changes) */
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_copy (wmOperatorType *ot)
+void GRAPH_OT_copy (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_copy";
+ ot->idname= "GRAPH_OT_copy";
+ ot->description= "Copy selected keyframes to the copy/paste buffer.";
/* api callbacks */
ot->exec= graphkeys_copy_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -577,21 +685,22 @@ static int graphkeys_paste_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_paste (wmOperatorType *ot)
+void GRAPH_OT_paste (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Paste Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_paste";
+ ot->idname= "GRAPH_OT_paste";
+ ot->description= "Paste keyframes from copy/paste buffer for the selected channels, starting on the current frame.";
/* api callbacks */
ot->exec= graphkeys_paste_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -634,8 +743,8 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
@@ -650,16 +759,17 @@ static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *even
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_duplicate (wmOperatorType *ot)
+void GRAPH_OT_duplicate (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Duplicate Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_duplicate";
+ ot->idname= "GRAPH_OT_duplicate";
+ ot->description= "Make a copy of all selected keyframes.";
/* api callbacks */
ot->invoke= graphkeys_duplicate_invoke;
ot->exec= graphkeys_duplicate_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -705,22 +815,23 @@ static int graphkeys_delete_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_delete (wmOperatorType *ot)
+void GRAPH_OT_delete (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_delete";
+ ot->idname= "GRAPH_OT_delete";
+ ot->description= "Remove all selected keyframes.";
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= graphkeys_delete_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -766,22 +877,23 @@ static int graphkeys_clean_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_clean (wmOperatorType *ot)
+void GRAPH_OT_clean (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clean Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_clean";
+ ot->idname= "GRAPH_OT_clean";
+ ot->description= "Simplify F-Curves by removing closely spaced keyframes.";
/* api callbacks */
//ot->invoke= // XXX we need that number popup for this!
ot->exec= graphkeys_clean_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -847,22 +959,24 @@ static int graphkeys_bake_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ // NOTE: some distinction between order/number of keyframes and type should be made?
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_bake (wmOperatorType *ot)
+void GRAPH_OT_bake (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Bake Curve";
- ot->idname= "GRAPHEDIT_OT_keyframes_bake";
+ ot->idname= "GRAPH_OT_bake";
+ ot->description= "Bake selected F-Curves to a set of sampled points defining a similar curve.";
/* api callbacks */
ot->invoke= WM_operator_confirm; // FIXME...
ot->exec= graphkeys_bake_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -875,13 +989,6 @@ void GRAPHEDIT_OT_keyframes_bake (wmOperatorType *ot)
* of selected keyframes. It is useful for creating keyframes for tweaking overlap.
*/
-// XXX some of the common parts (with DopeSheet) should be unified in animation module...
-
-/* little cache for values... */
-typedef struct tempFrameValCache {
- float frame, val;
-} tempFrameValCache;
-
/* Evaluates the curves between each selected keyframe on each frame, and keys the value */
static void sample_graph_keys (bAnimContext *ac)
{
@@ -894,64 +1001,8 @@ static void sample_graph_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through filtered data and add keys between selected keyframes on every frame */
- for (ale= anim_data.first; ale; ale= ale->next) {
- FCurve *fcu= (FCurve *)ale->key_data;
- BezTriple *bezt, *start=NULL, *end=NULL;
- tempFrameValCache *value_cache, *fp;
- int sfra, range;
- int i, n;
-
- /* find selected keyframes... once pair has been found, add keyframes */
- for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
- /* check if selected, and which end this is */
- if (BEZSELECTED(bezt)) {
- if (start) {
- /* set end */
- end= bezt;
-
- /* cache values then add keyframes using these values, as adding
- * keyframes while sampling will affect the outcome...
- */
- range= (int)( ceil(end->vec[1][0] - start->vec[1][0]) );
- sfra= (int)( floor(start->vec[1][0]) );
-
- if (range) {
- value_cache= MEM_callocN(sizeof(tempFrameValCache)*range, "IcuFrameValCache");
-
- /* sample values */
- for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
- fp->frame= (float)(sfra + n);
- fp->val= evaluate_fcurve(fcu, fp->frame);
- }
-
- /* add keyframes with these */
- for (n=0, fp=value_cache; n<range && fp; n++, fp++) {
- insert_vert_fcurve(fcu, fp->frame, fp->val, 1);
- }
-
- /* free temp cache */
- MEM_freeN(value_cache);
-
- /* as we added keyframes, we need to compensate so that bezt is at the right place */
- bezt = fcu->bezt + i + range - 1;
- i += (range - 1);
- }
-
- /* bezt was selected, so it now marks the start of a whole new chain to search */
- start= bezt;
- end= NULL;
- }
- else {
- /* just set start keyframe */
- start= bezt;
- end= NULL;
- }
- }
- }
-
- /* recalculate channel's handles? */
- calchandles_fcurve(fcu);
- }
+ for (ale= anim_data.first; ale; ale= ale->next)
+ sample_fcurve((FCurve *)ale->key_data);
/* admin and redraws */
BLI_freelistN(&anim_data);
@@ -973,21 +1024,22 @@ static int graphkeys_sample_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_sample (wmOperatorType *ot)
+void GRAPH_OT_sample (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Sample Keyframes";
- ot->idname= "GRAPHEDIT_OT_keyframes_sample";
+ ot->idname= "GRAPH_OT_sample";
+ ot->description= "Add keyframes on every frame between the selected keyframes.";
/* api callbacks */
ot->exec= graphkeys_sample_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1047,22 +1099,23 @@ static int graphkeys_expo_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_extrapolation_type (wmOperatorType *ot)
+void GRAPH_OT_extrapolation_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Extrapolation";
- ot->idname= "GRAPHEDIT_OT_keyframes_extrapolation_type";
+ ot->idname= "GRAPH_OT_extrapolation_type";
+ ot->description= "Set extrapolation mode for selected F-Curves.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= graphkeys_expo_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1115,22 +1168,23 @@ static int graphkeys_ipo_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframe properties have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_interpolation_type (wmOperatorType *ot)
+void GRAPH_OT_interpolation_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Interpolation";
- ot->idname= "GRAPHEDIT_OT_keyframes_interpolation_type";
+ ot->idname= "GRAPH_OT_interpolation_type";
+ ot->description= "Set interpolation mode for the F-Curve segments starting from the selected keyframes.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= graphkeys_ipo_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1203,21 +1257,22 @@ static int graphkeys_handletype_exec(bContext *C, wmOperator *op)
ANIM_editkeyframes_refresh(&ac);
/* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_handletype (wmOperatorType *ot)
+void GRAPH_OT_handle_type (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Keyframe Handle Type";
- ot->idname= "GRAPHEDIT_OT_keyframes_handletype";
+ ot->idname= "GRAPH_OT_handle_type";
+ ot->description= "Set type of handle for selected keyframes.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= graphkeys_handletype_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1268,7 +1323,7 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
*/
/* step 1: extract only the rotation f-curves */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1298,15 +1353,15 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void GRAPHEDIT_OT_keyframes_euler_filter (wmOperatorType *ot)
+void GRAPH_OT_euler_filter (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Euler Filter";
- ot->idname= "GRAPHEDIT_OT_keyframes_euler_filter";
+ ot->idname= "GRAPH_OT_euler_filter";
/* api callbacks */
ot->exec= graphkeys_euler_filter_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1314,10 +1369,10 @@ void GRAPHEDIT_OT_keyframes_euler_filter (wmOperatorType *ot)
#endif // XXX this is not ready for the primetime yet
-/* ***************** Snap Current Frame Operator *********************** */
+/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int graphkeys_cfrasnap_exec(bContext *C, wmOperator *op)
+static int graphkeys_framejump_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
@@ -1333,11 +1388,21 @@ static int graphkeys_cfrasnap_exec(bContext *C, wmOperator *op)
memset(&bed, 0, sizeof(BeztEditData));
/* loop over action data, averaging values */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_CURVESONLY);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- for (ale= anim_data.first; ale; ale= ale->next)
- ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
+
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+ ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ }
+ else
+ ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, bezt_calc_average, NULL);
+
+ }
BLI_freelistN(&anim_data);
@@ -1353,15 +1418,16 @@ static int graphkeys_cfrasnap_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_cfrasnap (wmOperatorType *ot)
+void GRAPH_OT_frame_jump (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Snap Current Frame to Keys";
- ot->idname= "GRAPHEDIT_OT_keyframes_cfrasnap";
+ ot->name= "Jump to Frame";
+ ot->idname= "GRAPH_OT_frame_jump";
+ ot->description= "Set the current frame to the average frame of the selected keyframes.";
/* api callbacks */
- ot->exec= graphkeys_cfrasnap_exec;
- ot->poll= ED_operator_areaactive;
+ ot->exec= graphkeys_framejump_exec;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1405,12 +1471,12 @@ static void snap_graph_keys(bAnimContext *ac, short mode)
/* snap keyframes */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
@@ -1438,22 +1504,23 @@ static int graphkeys_snap_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_snap (wmOperatorType *ot)
+void GRAPH_OT_snap (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Snap Keys";
- ot->idname= "GRAPHEDIT_OT_keyframes_snap";
+ ot->idname= "GRAPH_OT_snap";
+ ot->description= "Snap selected keyframes to the times specified.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= graphkeys_snap_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1466,10 +1533,10 @@ void GRAPHEDIT_OT_keyframes_snap (wmOperatorType *ot)
/* defines for mirror keyframes tool */
EnumPropertyItem prop_graphkeys_mirror_types[] = {
- {GRAPHKEYS_MIRROR_CFRA, "CFRA", 0, "Current frame", ""},
- {GRAPHKEYS_MIRROR_YAXIS, "YAXIS", 0, "Vertical Axis", ""},
- {GRAPHKEYS_MIRROR_XAXIS, "XAXIS", 0, "Horizontal Axis", ""},
- {GRAPHKEYS_MIRROR_MARKER, "MARKER", 0, "First Selected Marker", ""},
+ {GRAPHKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current frame", ""},
+ {GRAPHKEYS_MIRROR_YAXIS, "YAXIS", 0, "By Times over Time=0", ""},
+ {GRAPHKEYS_MIRROR_XAXIS, "XAXIS", 0, "By Values over Value=0", ""},
+ {GRAPHKEYS_MIRROR_MARKER, "MARKER", 0, "By Times over First Selected Marker", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1516,12 +1583,12 @@ static void mirror_graph_keys(bAnimContext *ac, short mode)
/* mirror keyframes */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, NULL, edit_cb, calchandles_fcurve);
@@ -1549,22 +1616,23 @@ static int graphkeys_mirror_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_mirror (wmOperatorType *ot)
+void GRAPH_OT_mirror (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mirror Keys";
- ot->idname= "GRAPHEDIT_OT_keyframes_mirror";
+ ot->idname= "GRAPH_OT_mirror";
+ ot->description= "Flip selected keyframes over the selected mirror line.";
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= graphkeys_mirror_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1603,21 +1671,22 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *op)
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_smooth (wmOperatorType *ot)
+void GRAPH_OT_smooth (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth Keys";
- ot->idname= "GRAPHEDIT_OT_keyframes_smooth";
+ ot->idname= "GRAPH_OT_smooth";
+ ot->description= "Apply weighted moving means to make selected F-Curves less bumpy.";
/* api callbacks */
ot->exec= graphkeys_smooth_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1626,7 +1695,35 @@ void GRAPHEDIT_OT_keyframes_smooth (wmOperatorType *ot)
/* ************************************************************************** */
/* F-CURVE MODIFIERS */
-/* ******************** Add F-Curve Modifier Operator *********************** */
+/* ******************** 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)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ int i;
+
+ pup= uiPupMenuBegin(C, "Add F-Curve Modifier", 0);
+ layout= uiPupMenuLayout(pup);
+
+ /* start from 1 to skip the 'Invalid' modifier type */
+ for (i = 1; i < FMODIFIER_NUM_TYPES; i++) {
+ FModifierTypeInfo *fmi= get_fmodifier_typeinfo(i);
+
+ /* check if modifier is valid for this context */
+ if (fmi == NULL)
+ continue;
+
+ /* add entry to add this type of modifier */
+ uiItemEnumO(layout, fmi->name, 0, "GRAPH_OT_fmodifier_add", "type", i);
+ }
+ uiItemS(layout);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
{
@@ -1654,9 +1751,9 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
type= RNA_enum_get(op->ptr, "type");
/* add F-Modifier of specified type to active F-Curve, and make it the active one */
- fcm= fcurve_add_modifier(fcu, type);
+ fcm= add_fmodifier(&fcu->modifiers, type);
if (fcm)
- fcurve_set_active_modifier(fcu, fcm);
+ set_active_fmodifier(&fcu->modifiers, fcm);
else {
BKE_report(op->reports, RPT_ERROR, "Modifier couldn't be added. See console for details.");
return OPERATOR_CANCELLED;
@@ -1666,21 +1763,23 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
ANIM_editkeyframes_refresh(&ac);
/* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_BOTH);
+ // FIXME: this really isn't the best description for it...
+ WM_event_add_notifier(C, NC_ANIMATION, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_fmodifier_add (wmOperatorType *ot)
+void GRAPH_OT_fmodifier_add (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add F-Curve Modifier";
- ot->idname= "GRAPHEDIT_OT_fmodifier_add";
+ ot->idname= "GRAPH_OT_fmodifier_add";
+ ot->description= "Add F-Modifiers to the selected F-Curves.";
/* api callbacks */
- ot->invoke= WM_menu_invoke;
+ ot->invoke= graph_fmodifier_add_invoke;
ot->exec= graph_fmodifier_add_exec;
- ot->poll= ED_operator_areaactive; // XXX need active F-Curve
+ ot->poll= graphop_active_fcurve_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/space_graph/graph_header.c b/source/blender/editors/space_graph/graph_header.c
index 178b4b4562f..79d38d9c252 100644
--- a/source/blender/editors/space_graph/graph_header.c
+++ b/source/blender/editors/space_graph/graph_header.c
@@ -43,10 +43,13 @@
#include "BKE_screen.h"
#include "ED_anim_api.h"
+#include "ED_transform.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "ED_util.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -62,77 +65,183 @@
/* ********************************************************* */
/* Menu Defines... */
-/* button events */
-enum {
- B_REDR = 0,
- B_MODECHANGE,
-} eActHeader_ButEvents;
+static void graph_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa= CTX_wm_area(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
+ PointerRNA spaceptr;
+
+ /* retrieve state */
+ RNA_pointer_create(&sc->id, &RNA_SpaceGraphEditor, sipo, &spaceptr);
+
+ /* create menu */
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "GRAPH_OT_properties");
+
+ uiItemS(layout);
+
+ uiItemR(layout, NULL, 0, &spaceptr, "show_cframe_indicator", 0);
+ uiItemR(layout, NULL, 0, &spaceptr, "show_sliders", 0);
+ uiItemR(layout, NULL, 0, &spaceptr, "automerge_keyframes", 0);
+
+ if (sipo->flag & SIPO_NOHANDLES)
+ uiItemO(layout, "Show Handles", ICON_CHECKBOX_DEHLT, "GRAPH_OT_handles_view_toggle");
+ else
+ uiItemO(layout, "Show Handles", ICON_CHECKBOX_HLT, "GRAPH_OT_handles_view_toggle");
+
+ uiItemR(layout, NULL, 0, &spaceptr, "only_selected_curves_handles", 0);
+
+
+ if (sipo->flag & SIPO_DRAWTIME)
+ uiItemO(layout, "Show Frames", 0, "ANIM_OT_time_toggle");
+ else
+ uiItemO(layout, "Show Seconds", 0, "ANIM_OT_time_toggle");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_set");
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_clear");
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_previewrange_set");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_frame_jump");
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_view_all");
+
+ if (sa->full)
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
+ else
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctrl DownArrow
+}
-/* ************************ header area region *********************** */
+static void graph_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiItemO(layout, NULL, 0, "GRAPH_OT_select_all_toggle");
+ uiItemBooleanO(layout, "Invert All", 0, "GRAPH_OT_select_all_toggle", "invert", 1);
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_select_border");
+ uiItemBooleanO(layout, "Border Axis Range", 0, "GRAPH_OT_select_border", "axis_range", 1);
+
+ uiItemS(layout);
+
+ uiItemEnumO(layout, "Columns on Selected Keys", 0, "GRAPH_OT_select_column", "mode", GRAPHKEYS_COLUMNSEL_KEYS);
+ uiItemEnumO(layout, "Column on Current Frame", 0, "GRAPH_OT_select_column", "mode", GRAPHKEYS_COLUMNSEL_CFRA);
+
+ uiItemEnumO(layout, "Columns on Selected Markers", 0, "GRAPH_OT_select_column", "mode", GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN);
+ uiItemEnumO(layout, "Between Selected Markers", 0, "GRAPH_OT_select_column", "mode", GRAPHKEYS_COLUMNSEL_MARKERS_BETWEEN);
+}
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void graph_channelmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_toggle");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_enable");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_setting_disable");
- switch (event) {
- case 1: /* Show time/frames */
- sipo->flag ^= SIPO_DRAWTIME;
- break;
- case 2: /* AutoMerge Keyframes */
- sipo->flag ^= SIPO_NOTRANSKEYCULL;
- break;
- case 3: /* Show/Hide handles */
- sipo->flag ^= SIPO_NOHANDLES;
- break;
- case 4: /* Show current frame number beside indicator */
- sipo->flag ^= SIPO_NODRAWCFRANUM;
- break;
- }
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_editable_toggle");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_expand");
+ uiItemO(layout, NULL, 0, "ANIM_OT_channels_collapse");
}
-static uiBlock *graph_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void graph_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
+ uiItemEnumO(layout, "Grab/Move", 0, "TFM_OT_transform", "mode", TFM_TIME_TRANSLATE);
+ uiItemEnumO(layout, "Extend", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
+ uiItemEnumO(layout, "Scale", 0, "TFM_OT_transform", "mode", TFM_TIME_SCALE);
+}
+
+static void graph_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_CFRA);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_NEAREST_FRAME);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_NEAREST_SECOND);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_NEAREST_MARKER);
+}
+
+static void graph_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_CFRA);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_YAXIS);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_XAXIS);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_MARKER);
+}
+
+static void graph_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_FREE);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_AUTO);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_VECT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_ALIGN);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_AUTO_ANIM); // xxx?
+}
+
+static void graph_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_CONST);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_LIN);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_BEZ);
+}
+
+static void graph_edit_expomenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_CONSTANT);
+ uiItemEnumO(layout, NULL, 0, "GRAPH_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_LINEAR);
+}
+
+static void graph_editmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiItemMenuF(layout, "Transform", 0, graph_edit_transformmenu, NULL);
+ uiItemMenuF(layout, "Snap", 0, graph_edit_snapmenu, NULL);
+ uiItemMenuF(layout, "Mirror", 0, graph_edit_mirrormenu, NULL);
- block= uiBeginBlock(C, ar, "graph_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
+ uiItemS(layout);
- // XXX these options should use new menu-options
+ uiItemO(layout, NULL, 0, "GRAPH_OT_insert_keyframe");
+ uiItemO(layout, NULL, 0, "GRAPH_OT_fmodifier_add");
- if (sipo->flag & SIPO_DRAWTIME) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- }
- else {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- }
+ uiItemS(layout);
+ uiItemO(layout, NULL, 0, "GRAPH_OT_duplicate");
+ uiItemO(layout, NULL, 0, "GRAPH_OT_delete");
- uiDefIconTextBut(block, BUTM, 1, (sipo->flag & SIPO_NOTRANSKEYCULL)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
- "AutoMerge Keyframes|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, (sipo->flag & SIPO_NOHANDLES)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
- "Show Handles|Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, (sipo->flag & SIPO_NODRAWCFRANUM)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
- "Show Current Frame Number|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiItemS(layout);
- if (curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
+ uiItemMenuF(layout, "Handle Type", 0, graph_edit_handlesmenu, NULL);
+ uiItemMenuF(layout, "Interpolation Mode", 0, graph_edit_ipomenu, NULL);
+ uiItemMenuF(layout, "Extrapolation Mode", 0, graph_edit_expomenu, NULL);
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_clean");
+ uiItemO(layout, NULL, 0, "GRAPH_OT_sample");
+ uiItemO(layout, NULL, 0, "GRAPH_OT_bake");
- return block;
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "GRAPH_OT_copy");
+ uiItemO(layout, NULL, 0, "GRAPH_OT_paste");
}
+/* ********************************************************* */
+
+enum {
+ B_REDR = 0,
+ B_MODECHANGE,
+} eGraphEdit_Events;
+
static void do_graph_buttons(bContext *C, void *arg, int event)
{
switch (event) {
@@ -150,7 +259,7 @@ static void do_graph_buttons(bContext *C, void *arg, int event)
void graph_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= CTX_wm_area(C);
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
uiBlock *block;
int xco, yco= 3;
@@ -163,8 +272,19 @@ void graph_header_buttons(const bContext *C, ARegion *ar)
int xmax;
xmax= GetButStringLength("View");
- uiDefPulldownBut(block, graph_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, 24, "");
+ uiDefMenuBut(block, graph_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Select");
+ uiDefMenuBut(block, graph_selectmenu, NULL, "Select", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Channel");
+ uiDefMenuBut(block, graph_channelmenu, NULL, "Channel", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Key");
+ uiDefMenuBut(block, graph_editmenu, NULL, "Key", xco, yco, xmax-3, 20, "");
xco+= xmax;
}
@@ -192,21 +312,17 @@ void graph_header_buttons(const bContext *C, ARegion *ar)
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Lamps");
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Cameras");
uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Curves");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display MetaBalls");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOARM, B_REDR, ICON_ARMATURE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Armature/Bone data");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Particles");
uiBlockEndAlign(block);
- xco += 15;
+ xco += 30;
}
else {
// XXX this case shouldn't happen at all... for now, just pad out same amount of space
- xco += 6*XIC + 15;
+ xco += 10*XIC + 30;
}
- /* copy + paste */
- uiBlockBeginAlign(block);
- uiDefIconButO(block, BUT, "GRAPHEDIT_OT_keyframes_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco+=XIC,yco,XIC,YIC, "Copies the selected keyframes from the selected channel(s) to the buffer");
- uiDefIconButO(block, BUT, "GRAPHEDIT_OT_keyframes_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco+=XIC,yco,XIC,YIC, "Pastes the keyframes from the buffer");
- uiBlockEndAlign(block);
- xco += (XIC + 8);
-
/* auto-snap selector */
if (sipo->flag & SIPO_DRAWTIME) {
uiDefButS(block, MENU, B_REDR,
@@ -222,12 +338,19 @@ void graph_header_buttons(const bContext *C, ARegion *ar)
}
xco += 98;
+ /* copy + paste */
+ uiBlockBeginAlign(block);
+ uiDefIconButO(block, BUT, "GRAPH_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco+=XIC,yco,XIC,YIC, "Copies the selected keyframes from the selected channel(s) to the buffer");
+ uiDefIconButO(block, BUT, "GRAPH_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco+=XIC,yco,XIC,YIC, "Pastes the keyframes from the buffer");
+ uiBlockEndAlign(block);
+ xco += (XIC + 8);
+
/* ghost curves */
// XXX these icons need to be changed
if (sipo->ghostCurves.first)
- uiDefIconButO(block, BUT, "GRAPHEDIT_OT_ghost_curves_clear", WM_OP_INVOKE_REGION_WIN, ICON_OUTLINER_DATA_CURVE, xco,yco,XIC,YIC, "Clear F-Curve snapshots (Ghosts) for this Graph Editor instance");
+ uiDefIconButO(block, BUT, "GRAPH_OT_ghost_curves_clear", WM_OP_INVOKE_REGION_WIN, ICON_OUTLINER_DATA_CURVE, xco,yco,XIC,YIC, "Clear F-Curve snapshots (Ghosts) for this Graph Editor instance");
else
- uiDefIconButO(block, BUT, "GRAPHEDIT_OT_ghost_curves_create", WM_OP_INVOKE_REGION_WIN, ICON_OUTLINER_OB_CURVE, xco,yco,XIC,YIC, "Create snapshot (Ghosts) of selected F-Curves as background aid for this Graph Editor instance");
+ uiDefIconButO(block, BUT, "GRAPH_OT_ghost_curves_create", WM_OP_INVOKE_REGION_WIN, ICON_OUTLINER_OB_CURVE, xco,yco,XIC,YIC, "Create snapshot (Ghosts) of selected F-Curves as background aid for this Graph Editor instance");
xco+= XIC;
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index 7ba636302a5..2e8d0655d2d 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -32,6 +32,8 @@ struct bContext;
struct wmWindowManager;
struct bAnimContext;
struct bAnimListElem;
+struct FCurve;
+struct FModifier;
struct SpaceIpo;
struct ScrArea;
struct ARegion;
@@ -46,7 +48,7 @@ struct ARegion *graph_has_buttons_region(struct ScrArea *sa);
/* ***************************************** */
/* graph_draw.c */
-void graph_draw_channel_names(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
+void graph_draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceIpo *sipo, 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);
@@ -58,10 +60,10 @@ void graph_header_buttons(const bContext *C, struct ARegion *ar);
/* ***************************************** */
/* graph_select.c */
-void GRAPHEDIT_OT_keyframes_select_all_toggle(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_select_border(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_columnselect(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_clickselect(struct wmOperatorType *ot);
+void GRAPH_OT_select_all_toggle(struct wmOperatorType *ot);
+void GRAPH_OT_select_border(struct wmOperatorType *ot);
+void GRAPH_OT_select_column(struct wmOperatorType *ot);
+void GRAPH_OT_clickselect(struct wmOperatorType *ot);
/* defines for left-right select tool */
enum {
@@ -82,28 +84,31 @@ enum {
/* ***************************************** */
/* graph_edit.c */
-void GRAPHEDIT_OT_previewrange_set(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_view_all(struct wmOperatorType *ot);
+void get_graph_keyframe_extents (struct bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax);
-void GRAPHEDIT_OT_keyframes_click_insert(struct wmOperatorType *ot);
+void GRAPH_OT_previewrange_set(struct wmOperatorType *ot);
+void GRAPH_OT_view_all(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_copy(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_paste(struct wmOperatorType *ot);
+void GRAPH_OT_click_insert(struct wmOperatorType *ot);
+void GRAPH_OT_insert_keyframe(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_duplicate(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_delete(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_clean(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_sample(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_bake(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_smooth(struct wmOperatorType *ot);
+void GRAPH_OT_copy(struct wmOperatorType *ot);
+void GRAPH_OT_paste(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_handletype(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_interpolation_type(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_extrapolation_type(struct wmOperatorType *ot);
+void GRAPH_OT_duplicate(struct wmOperatorType *ot);
+void GRAPH_OT_delete(struct wmOperatorType *ot);
+void GRAPH_OT_clean(struct wmOperatorType *ot);
+void GRAPH_OT_sample(struct wmOperatorType *ot);
+void GRAPH_OT_bake(struct wmOperatorType *ot);
+void GRAPH_OT_smooth(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_cfrasnap(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_snap(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_keyframes_mirror(struct wmOperatorType *ot);
+void GRAPH_OT_handle_type(struct wmOperatorType *ot);
+void GRAPH_OT_interpolation_type(struct wmOperatorType *ot);
+void GRAPH_OT_extrapolation_type(struct wmOperatorType *ot);
+
+void GRAPH_OT_frame_jump(struct wmOperatorType *ot);
+void GRAPH_OT_snap(struct wmOperatorType *ot);
+void GRAPH_OT_mirror(struct wmOperatorType *ot);
/* defines for snap keyframes
* NOTE: keep in sync with eEditKeyframes_Snap (in ED_keyframes_edit.h)
@@ -128,20 +133,29 @@ enum {
/* ----------- */
-void GRAPHEDIT_OT_fmodifier_add(struct wmOperatorType *ot);
+void GRAPH_OT_fmodifier_add(struct wmOperatorType *ot);
/* ----------- */
-void GRAPHEDIT_OT_ghost_curves_create(struct wmOperatorType *ot);
-void GRAPHEDIT_OT_ghost_curves_clear(struct wmOperatorType *ot);
+void GRAPH_OT_ghost_curves_create(struct wmOperatorType *ot);
+void GRAPH_OT_ghost_curves_clear(struct wmOperatorType *ot);
/* ***************************************** */
/* graph_buttons.c */
-void GRAPHEDIT_OT_properties(struct wmOperatorType *ot);
+void GRAPH_OT_properties(struct wmOperatorType *ot);
void graph_buttons_register(struct ARegionType *art);
+/* ***************************************** */
+/* graph_utils.c */
+
struct bAnimListElem *get_active_fcurve_channel(struct bAnimContext *ac);
+short fcurve_needs_draw_fmodifier_controls(struct FCurve *fcu, struct FModifier *fcm);
+
+int graphop_visible_keyframes_poll(struct bContext *C);
+int graphop_editable_keyframes_poll(struct bContext *C);
+int graphop_active_fcurve_poll(struct bContext *C);
+
/* ***************************************** */
/* graph_ops.c */
void graphedit_keymap(struct wmWindowManager *wm);
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index a23f0081c04..b7d67c85ab9 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -47,8 +47,7 @@
#include "UI_view2d.h"
#include "ED_screen.h"
-
-#include "BIF_transform.h"
+#include "ED_transform.h"
#include "graph_intern.h"
@@ -58,6 +57,10 @@
#include "WM_api.h"
#include "WM_types.h"
+/* ************************** poll callbacks **********************************/
+
+
+
/* ************************** view-based operators **********************************/
// XXX this probably shouldn't be here..
@@ -65,7 +68,7 @@
static int view_toggle_handles_exec (bContext *C, wmOperator *op)
{
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
ARegion *ar= CTX_wm_region(C);
if (sipo == NULL)
@@ -80,15 +83,15 @@ static int view_toggle_handles_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_view_togglehandles (wmOperatorType *ot)
+void GRAPH_OT_view_togglehandles (wmOperatorType *ot)
{
/* identification */
ot->name= "Show/Hide All Handles";
- ot->idname= "GRAPHEDIT_OT_handles_view_toggle";
+ ot->idname= "GRAPH_OT_handles_view_toggle";
/* callbacks */
ot->exec= view_toggle_handles_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_ipo_active;
}
/* ************************** registration - operator types **********************************/
@@ -96,129 +99,129 @@ void GRAPHEDIT_OT_view_togglehandles (wmOperatorType *ot)
void graphedit_operatortypes(void)
{
/* view */
- WM_operatortype_append(GRAPHEDIT_OT_view_togglehandles);
- WM_operatortype_append(GRAPHEDIT_OT_previewrange_set);
- WM_operatortype_append(GRAPHEDIT_OT_view_all);
- WM_operatortype_append(GRAPHEDIT_OT_properties);
+ WM_operatortype_append(GRAPH_OT_view_togglehandles);
+ WM_operatortype_append(GRAPH_OT_previewrange_set);
+ WM_operatortype_append(GRAPH_OT_view_all);
+ WM_operatortype_append(GRAPH_OT_properties);
- WM_operatortype_append(GRAPHEDIT_OT_ghost_curves_create);
- WM_operatortype_append(GRAPHEDIT_OT_ghost_curves_clear);
+ WM_operatortype_append(GRAPH_OT_ghost_curves_create);
+ WM_operatortype_append(GRAPH_OT_ghost_curves_clear);
/* keyframes */
/* selection */
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_clickselect);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_select_all_toggle);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_select_border);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_columnselect);
+ WM_operatortype_append(GRAPH_OT_clickselect);
+ WM_operatortype_append(GRAPH_OT_select_all_toggle);
+ WM_operatortype_append(GRAPH_OT_select_border);
+ WM_operatortype_append(GRAPH_OT_select_column);
/* editing */
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_snap);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_mirror);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_cfrasnap);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_handletype);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_interpolation_type);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_extrapolation_type);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_sample);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_bake);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_smooth);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_clean);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_delete);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_duplicate);
-
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_copy);
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_paste);
-
- WM_operatortype_append(GRAPHEDIT_OT_keyframes_click_insert);
-
- //TODO: insertkey...
+ WM_operatortype_append(GRAPH_OT_snap);
+ WM_operatortype_append(GRAPH_OT_mirror);
+ WM_operatortype_append(GRAPH_OT_frame_jump);
+ WM_operatortype_append(GRAPH_OT_handle_type);
+ WM_operatortype_append(GRAPH_OT_interpolation_type);
+ WM_operatortype_append(GRAPH_OT_extrapolation_type);
+ WM_operatortype_append(GRAPH_OT_sample);
+ WM_operatortype_append(GRAPH_OT_bake);
+ WM_operatortype_append(GRAPH_OT_smooth);
+ WM_operatortype_append(GRAPH_OT_clean);
+ WM_operatortype_append(GRAPH_OT_delete);
+ WM_operatortype_append(GRAPH_OT_duplicate);
+
+ WM_operatortype_append(GRAPH_OT_copy);
+ WM_operatortype_append(GRAPH_OT_paste);
+
+ WM_operatortype_append(GRAPH_OT_insert_keyframe);
+ WM_operatortype_append(GRAPH_OT_click_insert);
/* F-Curve Modifiers */
// XXX temporary?
- WM_operatortype_append(GRAPHEDIT_OT_fmodifier_add);
+ WM_operatortype_append(GRAPH_OT_fmodifier_add);
}
/* ************************** registration - keymaps **********************************/
-static void graphedit_keymap_keyframes (wmWindowManager *wm, ListBase *keymap)
+static void graphedit_keymap_keyframes (wmWindowManager *wm, wmKeyMap *keymap)
{
wmKeymapItem *kmi;
/* view */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_handles_view_toggle", HKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_handles_view_toggle", HKEY, KM_PRESS, KM_CTRL, 0);
/* graph_select.c - selection tools */
/* click-select */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "left_right", GRAPHKEYS_LRSEL_TEST);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "curves", 1);
- kmi= WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "curves", 1);
RNA_boolean_set(kmi->ptr, "extend", 1);
/* deselect all */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
+ WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
/* borderselect */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_select_border", BKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1);
+ WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1);
/* column select */
// XXX KKEY would be nice to keep for 'keyframe' lines
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_columnselect", KKEY, KM_PRESS, 0, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_KEYS);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_columnselect", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_CFRA);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_columnselect", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN);
- RNA_enum_set(WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_columnselect", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_BETWEEN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, 0, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_KEYS);
+ RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_CFRA);
+ RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_column", KKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", GRAPHKEYS_COLUMNSEL_MARKERS_BETWEEN);
/* graph_edit.c */
/* snap - current frame to selected keys */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_cfrasnap", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ // TODO: maybe since this is called jump, we're better to have it on <something>-J?
+ WM_keymap_add_item(keymap, "GRAPH_OT_frame_jump", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
/* menu + single-step transform */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
+ 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, "GRAPHEDIT_OT_keyframes_handletype", HKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_extrapolation_type", EKEY, 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_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, "GRAPHEDIT_OT_keyframes_clean", OKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_smooth", OKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_sample", OKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_clean", OKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_smooth", OKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_sample", OKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_bake", CKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_bake", CKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
/* insertkey */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_click_insert", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_insert_keyframe", IKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
/* copy/paste */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_paste", VKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
/* auto-set range */
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
- /* F-Curve Modifiers */
- // XXX these are temporary? operators...
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ /* F-Modifiers */
+ WM_keymap_add_item(keymap, "GRAPH_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
/* transform system */
@@ -229,11 +232,11 @@ static void graphedit_keymap_keyframes (wmWindowManager *wm, ListBase *keymap)
void graphedit_keymap(wmWindowManager *wm)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
/* keymap for all regions */
- keymap= WM_keymap_listbase(wm, "GraphEdit Generic", SPACE_IPO, 0);
- WM_keymap_add_item(keymap, "GRAPHEDIT_OT_properties", NKEY, KM_PRESS, 0, 0);
+ keymap= WM_keymap_find(wm, "GraphEdit Generic", SPACE_IPO, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_properties", NKEY, KM_PRESS, 0, 0);
/* channels */
/* Channels are not directly handled by the Graph Editor module, but are inherited from the Animation module.
@@ -242,7 +245,7 @@ void graphedit_keymap(wmWindowManager *wm)
*/
/* keyframes */
- keymap= WM_keymap_listbase(wm, "GraphEdit Keys", SPACE_IPO, 0);
+ keymap= WM_keymap_find(wm, "GraphEdit Keys", SPACE_IPO, 0);
graphedit_keymap_keyframes(wm, keymap);
}
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index 7746f49d135..728c9310a47 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -63,6 +63,7 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_utildefines.h"
@@ -168,20 +169,21 @@ static int graphkeys_deselectall_exec(bContext *C, wmOperator *op)
deselect_graph_keys(&ac, 1, SELECT_ADD);
/* set notifier that things have changed */
- ED_area_tag_redraw(CTX_wm_area(C)); // FIXME... should be updating 'keyframes' data context or so instead!
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_select_all_toggle (wmOperatorType *ot)
+void GRAPH_OT_select_all_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select All";
- ot->idname= "GRAPHEDIT_OT_keyframes_select_all_toggle";
+ ot->idname= "GRAPH_OT_select_all_toggle";
+ ot->description= "Toggle selection of all keyframes.";
/* api callbacks */
ot->exec= graphkeys_deselectall_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
@@ -231,14 +233,15 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho
/* loop over data, doing border select */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+ FCurve *fcu= (FCurve *)ale->key_data;
/* set horizontal range (if applicable) */
if (mode != BEZT_OK_VALUERANGE) {
/* if channel is mapped in NLA, apply correction */
- if (nob) {
- bed.f1= get_action_frame(nob, rectf.xmin);
- bed.f2= get_action_frame(nob, rectf.xmax);
+ if (adt) {
+ bed.f1= BKE_nla_tweakedit_remap(adt, rectf.xmin, NLATIME_CONVERT_UNMAP);
+ bed.f2= BKE_nla_tweakedit_remap(adt, rectf.xmax, NLATIME_CONVERT_UNMAP);
}
else {
bed.f1= rectf.xmin;
@@ -251,7 +254,13 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho
}
/* select keyframes that are in the appropriate places */
- ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
+ ANIM_fcurve_keys_bezier_loop(&bed, fcu, ok_cb, select_cb, NULL);
+
+ /* select the curve too
+ * NOTE: this should really only happen if the curve got touched...
+ */
+ if (selectmode == SELECT_ADD)
+ fcu->flag |= FCURVE_SELECTED;
}
/* cleanup */
@@ -301,21 +310,25 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op)
/* apply borderselect action */
borderselect_graphkeys(&ac, rect, mode, selectmode);
+ /* send notifier that keyframe selection has changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
+
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_select_border(wmOperatorType *ot)
+void GRAPH_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
- ot->idname= "GRAPHEDIT_OT_keyframes_select_border";
+ ot->idname= "GRAPH_OT_select_border";
+ ot->description= "Select all keyframes within the specified region.";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= graphkeys_borderselect_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
@@ -379,12 +392,12 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* select keys in-between */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else {
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
@@ -450,15 +463,15 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* loop over cfraelems (stored in the BeztEditData->list)
* - we need to do this here, as we can apply fewer NLA-mapping conversions
*/
for (ce= bed.list.first; ce; ce= ce->next) {
/* set frame for validation callback to refer to */
- if (nob)
- bed.f1= get_action_frame(nob, ce->cfra);
+ if (ale)
+ bed.f1= BKE_nla_tweakedit_remap(adt, ce->cfra, NLATIME_CONVERT_UNMAP);
else
bed.f1= ce->cfra;
@@ -491,21 +504,22 @@ static int graphkeys_columnselect_exec(bContext *C, wmOperator *op)
else
columnselect_graph_keys(&ac, mode);
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_SELECT);
+ /* set notifier that keyframe selection has changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL);
return OPERATOR_FINISHED;
}
-void GRAPHEDIT_OT_keyframes_columnselect (wmOperatorType *ot)
+void GRAPH_OT_select_column (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select All";
- ot->idname= "GRAPHEDIT_OT_keyframes_columnselect";
+ ot->idname= "GRAPH_OT_select_column";
+ ot->description= "Select all keyframes on the specified frame(s).";
/* api callbacks */
ot->exec= graphkeys_columnselect_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
@@ -560,17 +574,27 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc
*fcurve= 0;
*bezt= 0;
- /* get curves to search through */
+ /* get curves to search through
+ * - if the option to only show keyframes that belong to selected F-Curves is enabled,
+ * include the 'only selected' flag...
+ */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
+ if (sipo->flag & SIPO_SELCUVERTSONLY)
+ filter |= ANIMFILTER_SEL;
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->key_data;
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* try to progressively get closer to the right point... */
if (fcu->bezt) {
BezTriple *bezt1=fcu->bezt, *prevbezt=NULL;
+ /* apply NLA mapping to all the keyframes */
+ if (adt)
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+
for (i=0; i < fcu->totvert; i++, prevbezt=bezt1, bezt1++) {
/* convert beztriple points to screen-space */
UI_view2d_to_region_no_clip(v2d, bezt1->vec[0][0], bezt1->vec[0][1], &sco[0][0], &sco[0][1]);
@@ -624,6 +648,10 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc
}
}
}
+
+ /* un-apply NLA mapping from all the keyframes */
+ if (adt)
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
}
@@ -702,7 +730,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
else {
BeztEditFunc select_cb;
BeztEditData bed;
-
+
/* initialise keyframe editing data */
memset(&bed, 0, sizeof(BeztEditData));
@@ -722,7 +750,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
/* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
if (fcu->flag & FCURVE_SELECTED) {
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY);
- ANIM_set_active_channel(ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, fcu, ANIMTYPE_FCURVE);
}
}
@@ -753,7 +781,7 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor
memset(&bed, 0, sizeof(BeztEditFunc));
if (leftright == GRAPHKEYS_LRSEL_LEFT) {
- bed.f1 = -MAXFRAMEF;
+ bed.f1 = MINAFRAMEF;
bed.f2 = (float)(CFRA + 0.1f);
}
else {
@@ -767,12 +795,12 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor
/* select keys on the side where most data occurs */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
else
ANIM_fcurve_keys_bezier_loop(&bed, ale->key_data, ok_cb, select_cb, NULL);
@@ -827,11 +855,11 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
/* set frame for validation callback to refer to */
- if (nob)
- bed.f1= get_action_frame(nob, selx);
+ if (adt)
+ bed.f1= BKE_nla_tweakedit_remap(adt, selx, NLATIME_CONVERT_UNMAP);
else
bed.f1= selx;
@@ -901,22 +929,23 @@ static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *ev
mouse_graph_keys(&ac, mval, selectmode, 0);
}
- /* set notifier that things have changed */
- ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_BOTH);
+ /* set notifier that keyframe selection (and also channel selection in some cases) has changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_SELECT|ND_ANIMCHAN_SELECT, NULL);
/* for tweak grab to work */
return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
-void GRAPHEDIT_OT_keyframes_clickselect (wmOperatorType *ot)
+void GRAPH_OT_clickselect (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mouse Select Keys";
- ot->idname= "GRAPHEDIT_OT_keyframes_clickselect";
+ ot->idname= "GRAPH_OT_clickselect";
+ ot->description= "Select keyframes by clicking on them.";
/* api callbacks */
ot->invoke= graphkeys_clickselect_invoke;
- ot->poll= ED_operator_areaactive;
+ ot->poll= graphop_visible_keyframes_poll;
/* id-props */
// XXX should we make this into separate operators?
diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c
new file mode 100644
index 00000000000..f00e7845549
--- /dev/null
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -0,0 +1,288 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation, Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+#include "BKE_global.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "graph_intern.h" // own include
+
+/* ************************************************************** */
+/* Active F-Curve */
+
+/* Find 'active' F-Curve. It must be editable, since that's the purpose of these buttons (subject to change).
+ * We return the 'wrapper' since it contains valuable context info (about hierarchy), which will need to be freed
+ * when the caller is done with it.
+ */
+bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
+{
+ ListBase anim_data = {NULL, NULL};
+ int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_ACTIVE | ANIMFILTER_CURVESONLY);
+ int items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* We take the first F-Curve only, since some other ones may have had 'active' flag set
+ * if they were from linked data.
+ */
+ if (items) {
+ bAnimListElem *ale= (bAnimListElem *)anim_data.first;
+
+ /* remove first item from list, then free the rest of the list and return the stored one */
+ BLI_remlink(&anim_data, ale);
+ BLI_freelistN(&anim_data);
+
+ return ale;
+ }
+
+ /* no active F-Curve */
+ return NULL;
+}
+
+/* ************************************************************** */
+/* Operator Polling Callbacks */
+
+/* check if any FModifiers to draw controls for - fcm is 'active' modifier
+ * used for the polling callbacks + also for drawing
+ */
+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 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;
+
+ /* borderline... */
+ case FMODIFIER_TYPE_NOISE:
+ return 0;
+ }
+ }
+
+ /* if only one modifier - don't draw if it is muted or disabled */
+ if (fcu->modifiers.first == fcu->modifiers.last) {
+ fcm= fcu->modifiers.first;
+ if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
+ 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)
+{
+ bAnimContext ac;
+ bAnimListElem *ale;
+ ListBase anim_data = {NULL, NULL};
+ ScrArea *sa= CTX_wm_area(C);
+ int filter, items;
+ short found = 0;
+
+ /* firstly, check if in Graph Editor */
+ // TODO: also check for region?
+ if ((sa == NULL) || (sa->spacetype != SPACE_IPO))
+ return 0;
+
+ /* try to init Anim-Context stuff ourselves and check */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return 0;
+
+ /* loop over the visible (selection doesn't matter) F-Curves, and see if they're suitable
+ * stopping on the first successful match
+ */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
+ items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ if (items == 0)
+ return 0;
+
+ 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
+ * - F-Curve modifiers do not interfere with the result too much
+ * (i.e. the modifier-control drawing check returns false)
+ */
+ if (fcu->bezt == NULL)
+ continue;
+ fcm= find_active_fmodifier(&fcu->modifiers);
+
+ found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
+ if (found) break;
+ }
+
+ /* cleanup and return findings */
+ BLI_freelistN(&anim_data);
+ return found;
+}
+
+/* Check if there are any visible + editable keyframes (for editing tools) */
+int graphop_editable_keyframes_poll (bContext *C)
+{
+ bAnimContext ac;
+ bAnimListElem *ale;
+ ListBase anim_data = {NULL, NULL};
+ ScrArea *sa= CTX_wm_area(C);
+ int filter, items;
+ short found = 0;
+
+ /* firstly, check if in Graph Editor */
+ // TODO: also check for region?
+ if ((sa == NULL) || (sa->spacetype != SPACE_IPO))
+ return 0;
+
+ /* try to init Anim-Context stuff ourselves and check */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return 0;
+
+ /* loop over the editable (selected + editable) F-Curves, and see if they're suitable
+ * stopping on the first successful match
+ */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
+ items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+ if (items == 0)
+ return 0;
+
+ 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
+ * - it must not be protected from editing (this is already checked for with the foredit flag
+ * - F-Curve modifiers do not interfere with the result too much
+ * (i.e. the modifier-control drawing check returns false)
+ */
+ if (fcu->bezt == NULL)
+ continue;
+ fcm= find_active_fmodifier(&fcu->modifiers);
+
+ found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
+ if (found) break;
+ }
+
+ /* cleanup and return findings */
+ BLI_freelistN(&anim_data);
+ return found;
+}
+
+/* has active F-Curve that's editable */
+int graphop_active_fcurve_poll (bContext *C)
+{
+ bAnimContext ac;
+ bAnimListElem *ale;
+ ScrArea *sa= CTX_wm_area(C);
+ short has_fcurve= 0;
+
+ /* firstly, check if in Graph Editor */
+ // TODO: also check for region?
+ if ((sa == NULL) || (sa->spacetype != SPACE_IPO))
+ return 0;
+
+ /* try to init Anim-Context stuff ourselves and check */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return 0;
+
+ /* try to get the Active F-Curve */
+ ale= get_active_fcurve_channel(&ac);
+ if (ale == NULL)
+ return 0;
+
+ /* free temp data... */
+ has_fcurve= ((ale->data) && (ale->type == ANIMTYPE_FCURVE));
+ MEM_freeN(ale);
+
+ /* return success */
+ return has_fcurve;
+}
+
+/* ************************************************************** */
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index 74002f64187..a7ea2294ed4 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -68,23 +68,25 @@ ARegion *graph_has_buttons_region(ScrArea *sa)
{
ARegion *ar, *arnew;
- for(ar= sa->regionbase.first; ar; ar= ar->next)
- if(ar->regiontype==RGN_TYPE_UI)
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype==RGN_TYPE_UI)
return ar;
+ }
- /* add subdiv level; after channel */
- for(ar= sa->regionbase.first; ar; ar= ar->next)
- if(ar->regiontype==RGN_TYPE_CHANNELS)
+ /* add subdiv level; after main */
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype==RGN_TYPE_WINDOW)
break;
+ }
/* is error! */
- if(ar==NULL) return NULL;
+ if (ar==NULL) return NULL;
- arnew= MEM_callocN(sizeof(ARegion), "buttons for view3d");
+ arnew= MEM_callocN(sizeof(ARegion), "buttons for graph");
BLI_insertlinkafter(&sa->regionbase, ar, arnew);
arnew->regiontype= RGN_TYPE_UI;
- arnew->alignment= RGN_ALIGN_BOTTOM|RGN_SPLIT_PREV;
+ arnew->alignment= RGN_ALIGN_RIGHT;
arnew->flag = RGN_FLAG_HIDDEN;
@@ -117,7 +119,7 @@ static SpaceLink *graph_new(const bContext *C)
ar->alignment= RGN_ALIGN_BOTTOM;
/* channels */
- ar= MEM_callocN(sizeof(ARegion), "main area for graphedit");
+ ar= MEM_callocN(sizeof(ARegion), "channels area for graphedit");
BLI_addtail(&sipo->regionbase, ar);
ar->regiontype= RGN_TYPE_CHANNELS;
@@ -126,11 +128,11 @@ static SpaceLink *graph_new(const bContext *C)
ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
/* ui buttons */
- ar= MEM_callocN(sizeof(ARegion), "main area for graphedit");
+ ar= MEM_callocN(sizeof(ARegion), "buttons area for graphedit");
BLI_addtail(&sipo->regionbase, ar);
ar->regiontype= RGN_TYPE_UI;
- ar->alignment= RGN_ALIGN_TOP|RGN_SPLIT_PREV;
+ ar->alignment= RGN_ALIGN_RIGHT;
ar->flag = RGN_FLAG_HIDDEN;
/* main area */
@@ -192,7 +194,7 @@ static SpaceLink *graph_duplicate(SpaceLink *sl)
SpaceIpo *sipon= MEM_dupallocN(sl);
/* clear or remove stuff from old */
- //sipon->ipokey.first= sipon->ipokey.last= NULL;
+ BLI_duplicatelist(&sipon->ghostCurves, &((SpaceIpo *)sl)->ghostCurves);
sipon->ads= MEM_dupallocN(sipon->ads);
return (SpaceLink *)sipon;
@@ -201,21 +203,21 @@ static SpaceLink *graph_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void graph_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "GraphEdit Keys", SPACE_IPO, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "GraphEdit Keys", SPACE_IPO, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
- keymap= WM_keymap_listbase(wm, "GraphEdit Generic", SPACE_IPO, 0);
+ keymap= WM_keymap_find(wm, "GraphEdit Generic", SPACE_IPO, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void graph_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceIpo *sipo= (SpaceIpo*)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DGrid *grid;
@@ -243,6 +245,12 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
/* draw curves twice - unselected, then selected, so that the are fewer occlusion problems */
graph_draw_curves(&ac, sipo, ar, grid, 0);
graph_draw_curves(&ac, sipo, ar, grid, 1);
+
+ /* XXX the slow way to set tot rect... but for nice sliders needed (ton) */
+ get_graph_keyframe_extents(&ac, &v2d->tot.xmin, &v2d->tot.xmax, &v2d->tot.ymin, &v2d->tot.ymax);
+ /* extra offset so that these items are visible */
+ v2d->tot.xmin -= 10.0f;
+ v2d->tot.xmax += 10.0f;
}
/* only free grid after drawing data, as we need to use it to determine sampling rate */
@@ -273,20 +281,20 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
static void graph_channel_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Animation_Channels", 0, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Animation_Channels", 0, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
- keymap= WM_keymap_listbase(wm, "GraphEdit Generic", SPACE_IPO, 0);
+ keymap= WM_keymap_find(wm, "GraphEdit Generic", SPACE_IPO, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void graph_channel_area_draw(const bContext *C, ARegion *ar)
{
- SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+ SpaceIpo *sipo= CTX_wm_space_graph(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -301,7 +309,7 @@ static void graph_channel_area_draw(const bContext *C, ARegion *ar)
/* draw channels */
if (ANIM_animdata_get_context(C, &ac)) {
- graph_draw_channel_names(&ac, sipo, ar);
+ graph_draw_channel_names((bContext*)C, &ac, sipo, ar);
}
/* reset view matrix */
@@ -344,25 +352,29 @@ static void graph_header_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
static void graph_buttons_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
- keymap= WM_keymap_listbase(wm, "GraphEdit Generic", SPACE_IPO, 0);
+ keymap= WM_keymap_find(wm, "GraphEdit Generic", SPACE_IPO, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void graph_buttons_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
static void graph_region_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
case NC_SCENE:
switch(wmn->data) {
+ case ND_RENDER_OPTIONS:
case ND_OB_ACTIVE:
case ND_FRAME:
case ND_MARKERS:
@@ -391,6 +403,9 @@ static void graph_listener(ScrArea *sa, wmNotifier *wmn)
{
/* context changes */
switch (wmn->category) {
+ case NC_ANIMATION:
+ ED_area_tag_refresh(sa);
+ break;
case NC_SCENE:
/*switch (wmn->data) {
case ND_OB_ACTIVE:
@@ -409,6 +424,10 @@ static void graph_listener(ScrArea *sa, wmNotifier *wmn)
}*/
ED_area_tag_refresh(sa);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_GRAPH)
+ ED_area_tag_redraw(sa);
+ break;
default:
if(wmn->data==ND_KEYS)
ED_area_tag_refresh(sa);
@@ -562,7 +581,7 @@ void ED_spacetype_ipo(void)
/* regions: UI buttons */
art= MEM_callocN(sizeof(ARegionType), "spacetype graphedit region");
art->regionid = RGN_TYPE_UI;
- art->minsizey= 200;
+ art->minsizex= 200;
art->keymapflag= ED_KEYMAP_UI;
art->listener= graph_region_listener;
art->init= graph_buttons_area_init;
diff --git a/source/blender/editors/space_image/Makefile b/source/blender/editors/space_image/Makefile
index e7e9a9b5665..af15b1d9724 100644
--- a/source/blender/editors/space_image/Makefile
+++ b/source/blender/editors/space_image/Makefile
@@ -53,3 +53,7 @@ CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I../include
+ifeq ($(WITH_OPENEXR), true)
+ CPPFLAGS += -DWITH_OPENEXR
+endif
+
diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript
index e7041ef0458..874549e6949 100644
--- a/source/blender/editors/space_image/SConscript
+++ b/source/blender/editors/space_image/SConscript
@@ -11,5 +11,7 @@ defs = []
if env['WITH_BF_LCMS']:
defs.append('WITH_LCMS')
+if env['WITH_BF_OPENEXR']:
+ defs.append('WITH_OPENEXR')
env.BlenderLib ( 'bf_editors_space_image', sources, Split(incs), defs, libtype=['core'], priority=[40] )
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index a08a23c1263..bdf3e9416b9 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -58,6 +58,7 @@
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_packedFile.h"
+#include "BKE_paint.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -66,6 +67,7 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "ED_gpencil.h"
#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_space_api.h"
@@ -98,8 +100,6 @@
#define B_FACESEL_PAINT_TEST 11
#define B_SIMA_RECORD 12
#define B_SIMA_PLAY 13
-#define B_SIMARANGE 14
-#define B_SIMACURVES 15
#define B_SIMANOTHING 16
#define B_SIMABRUSHCHANGE 17
@@ -114,10 +114,8 @@
#define B_SIMACLONEDELETE 26
/* XXX */
-static int okee() {return 0;}
static int simaFaceDraw_Check() {return 0;}
static int simaUVSel_Check() {return 0;}
-static int is_uv_tface_editing_allowed_silent() {return 0;}
/* XXX */
/* proto */
@@ -127,19 +125,12 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block
static void do_image_panel_events(bContext *C, void *arg, int event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
switch(event) {
case B_REDR:
break;
- case B_SIMACURVES:
- curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
- break;
- case B_SIMARANGE:
- curvemapping_set_black_white(sima->cumap, NULL, NULL);
- curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
- break;
case B_TRANS_IMAGE:
image_editvertex_buts(C, NULL);
break;
@@ -147,12 +138,11 @@ static void do_image_panel_events(bContext *C, void *arg, int event)
image_editcursor_buts(C, &ar->v2d, NULL);
break;
}
+
/* all events now */
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
-
-
static void image_info(Image *ima, ImBuf *ibuf, char *str)
{
int ofs= 0;
@@ -166,12 +156,12 @@ static void image_info(Image *ima, ImBuf *ibuf, char *str)
}
if(ima->source==IMA_SRC_MOVIE) {
- ofs= sprintf(str, "Movie ");
+ ofs= sprintf(str, "Movie");
if(ima->anim)
ofs+= sprintf(str+ofs, "%d frs", IMB_anim_get_duration(ima->anim));
}
else
- ofs= sprintf(str, "Image ");
+ ofs= sprintf(str, "Image");
ofs+= sprintf(str+ofs, ": size %d x %d,", ibuf->x, ibuf->y);
@@ -234,7 +224,7 @@ static void image_transform_but_attr(SpaceImage *sima, int *imx, int *imy, int *
/* is used for both read and write... */
static void image_editvertex_buts(const bContext *C, uiBlock *block)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
static float ocent[2];
float cent[2]= {0.0, 0.0};
@@ -244,10 +234,6 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
EditFace *efa;
MTFace *tf;
- if(obedit==NULL || obedit->type!=OB_MESH) return;
-
- if( is_uv_tface_editing_allowed_silent()==0 ) return;
-
image_transform_but_attr(sima, &imx, &imy, &step, &digits);
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -347,13 +333,11 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
/* is used for both read and write... */
static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
static float ocent[2];
int imx= 256, imy= 256;
int step, digits;
- if( is_uv_tface_editing_allowed_silent()==0 ) return;
-
image_transform_but_attr(sima, &imx, &imy, &step, &digits);
if(block) { // do the buttons
@@ -386,59 +370,6 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block
#if 0
static void image_panel_view_properties(const bContext *C, Panel *pa)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- ARegion *ar= CTX_wm_region(C);
- Object *obedit= CTX_data_edit_object(C);
- uiBlock *block;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
-
- uiDefButBitI(block, TOG, SI_DRAW_TILE, B_REDR, "Repeat Image", 10,160,140,19, &sima->flag, 0, 0, 0, 0, "Repeat/Tile the image display");
- uiDefButBitI(block, TOG, SI_COORDFLOATS, B_REDR, "Normalized Coords", 165,160,145,19, &sima->flag, 0, 0, 0, 0, "Display coords from 0.0 to 1.0 rather then in pixels");
-
- if (sima->image) {
- uiDefBut(block, LABEL, B_NOP, "Image Display:", 10,140,140,19, 0, 0, 0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_REDR, "AspX:", 10,120,140,19, &sima->image->aspx, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect renderingm 0 disables.");
- uiDefButF(block, NUM, B_REDR, "AspY:", 10,100,140,19, &sima->image->aspy, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect rendering 0 disables.");
- uiBlockEndAlign(block);
- }
-
- if (obedit && obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- EditMesh *em= BKE_mesh_get_editmesh(me);
-
- if(EM_texFaceCheck(em)) {
- uiDefBut(block, LABEL, B_NOP, "Draw Type:", 10, 80,120,19, 0, 0, 0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButC(block, ROW, B_REDR, "Outline", 10,60,58,19, &sima->dt_uv, 0.0, SI_UVDT_OUTLINE, 0, 0, "Outline Wire UV drawtype");
- uiDefButC(block, ROW, B_REDR, "Dash", 68, 60,58,19, &sima->dt_uv, 0.0, SI_UVDT_DASH, 0, 0, "Dashed Wire UV drawtype");
- uiDefButC(block, ROW, B_REDR, "Black", 126, 60,58,19, &sima->dt_uv, 0.0, SI_UVDT_BLACK, 0, 0, "Black Wire UV drawtype");
- uiDefButC(block, ROW, B_REDR, "White", 184,60,58,19, &sima->dt_uv, 0.0, SI_UVDT_WHITE, 0, 0, "White Wire UV drawtype");
-
- uiBlockEndAlign(block);
- uiDefButBitI(block, TOG, SI_SMOOTH_UV, B_REDR, "Smooth", 250,60,60,19, &sima->flag, 0, 0, 0, 0, "Display smooth lines in the UV view");
-
-
- uiDefButBitI(block, TOG, ME_DRAWFACES, B_REDR, "Faces", 10,30,60,19, &me->drawflag, 0, 0, 0, 0, "Displays all faces as shades in the 3d view and UV editor");
- uiDefButBitI(block, TOG, ME_DRAWEDGES, B_REDR, "Edges", 70, 30,60,19, &me->drawflag, 0, 0, 0, 0, "Displays selected edges using hilights in the 3d view and UV editor");
-
- uiDefButBitI(block, TOG, SI_DRAWSHADOW, B_REDR, "Final Shadow", 130, 30,110,19, &sima->flag, 0, 0, 0, 0, "Draw the final result from the objects modifiers");
- uiDefButBitI(block, TOG, SI_DRAW_OTHER, B_REDR, "Other Objs", 230, 30, 80, 19, &sima->flag, 0, 0, 0, 0, "Also draw all 3d view selected mesh objects that use this image");
-
- uiDefButBitI(block, TOG, SI_DRAW_STRETCH, B_REDR, "UV Stretch", 10,0,100,19, &sima->flag, 0, 0, 0, 0, "Difference between UV's and the 3D coords (blue for low distortion, red is high)");
- if (sima->flag & SI_DRAW_STRETCH) {
- uiBlockBeginAlign(block);
- uiDefButC(block, ROW, B_REDR, "Area", 120,0,60,19, &sima->dt_uvstretch, 0.0, SI_UVDT_STRETCH_AREA, 0, 0, "Area distortion between UV's and 3D coords");
- uiDefButC(block, ROW, B_REDR, "Angle", 180,0,60,19, &sima->dt_uvstretch, 0.0, SI_UVDT_STRETCH_ANGLE, 0, 0, "Angle distortion between UV's and 3D coords");
- uiBlockEndAlign(block);
- }
- }
-
- BKE_mesh_end_editmesh(me, em);
- }
- image_editcursor_buts(C, &ar->v2d, block);
}
#endif
@@ -448,9 +379,9 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
int evt_del, int evt_keepdata,
int evt_texbrowse, int evt_texdel)
{
-// SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+// SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *settings= CTX_data_tool_settings(C);
- Brush *brush= settings->imapaint.brush;
+ Brush *brush= paint_brush(&settings->imapaint.paint);
ID *id;
int yco, xco, butw, but_idx;
// short *menupoin = &(sima->menunr); // XXX : &(G.buts->menunr);
@@ -472,7 +403,7 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
uiBlockEndAlign(block);
yco -= 30;
- id= (ID*)settings->imapaint.brush;
+ id= (ID*)brush;
xco= 200; // std_libbuttons(block, 0, yco, 0, NULL, evt_browse, ID_BR, 0, id, NULL, menupoin, 0, evt_local, evt_del, 0, evt_keepdata);
if(brush && !brush->id.lib) {
@@ -519,13 +450,13 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
uiBlockBeginAlign(block);
uiDefButF(block, COL, B_VPCOLSLI, "", 0,yco,200,19, brush->rgb, 0, 0, 0, 0, "");
uiDefButF(block, NUMSLI, evt_nop, "Opacity ", 0,yco-20,180,19, &brush->alpha, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
- uiDefButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, evt_nop, "P", 180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+ uiDefIconButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE, 180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
uiDefButI(block, NUMSLI, evt_nop, "Size ", 0,yco-40,180,19, &brush->size, 1, 200, 0, 0, "The size of the brush");
- uiDefButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, evt_nop, "P", 180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
- uiDefButF(block, NUMSLI, evt_nop, "Falloff ", 0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
- uiDefButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, evt_nop, "P", 180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+ uiDefIconButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE, 180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+// uiDefButF(block, NUMSLI, evt_nop, "Falloff ", 0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
+// uiDefIconButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE, 180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
uiDefButF(block, NUMSLI, evt_nop, "Spacing ",0,yco-80,180,19, &brush->spacing, 1.0, 100.0, 0, 0, "Repeating paint on %% of brush diameter");
- uiDefButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, evt_nop, "P", 180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
+ uiDefIconButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE, 180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
uiBlockEndAlign(block);
yco -= 110;
@@ -563,104 +494,33 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
#endif
}
-static int image_panel_paint_poll(const bContext *C, PanelType *pt)
-{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
-
- return (sima->image && (sima->flag & SI_DRAWTOOL));
-}
-
-static void image_panel_paintcolor(const bContext *C, Panel *pa)
-{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- ToolSettings *settings= CTX_data_tool_settings(C);
- Brush *brush= settings->imapaint.brush;
- uiBlock *block;
- static float hsv[3], old[3]; // used as temp mem for picker
- static char hexcol[128];
-
- if(!sima->image || (sima->flag & SI_DRAWTOOL)==0)
- return;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
-
- if(brush)
- uiBlockPickerButtons(block, brush->rgb, hsv, old, hexcol, 'f', B_REDR);
-}
-
-static void image_panel_paint(const bContext *C, Panel *pa)
-{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- uiBlock *block;
-
- if(!sima->image || (sima->flag & SI_DRAWTOOL)==0)
- return;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
-
- brush_buttons(C, block, 1, B_SIMANOTHING, B_SIMABRUSHCHANGE, B_SIMABRUSHBROWSE, B_SIMABRUSHLOCAL, B_SIMABRUSHDELETE, B_KEEPDATA, B_SIMABTEXBROWSE, B_SIMABTEXDELETE);
-}
-
-static void image_panel_curves_reset(bContext *C, void *cumap_v, void *ibuf_v)
+static int image_panel_poll(const bContext *C, PanelType *pt)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- CurveMapping *cumap = cumap_v;
- int a;
-
- for(a=0; a<CM_TOT; a++)
- curvemap_reset(cumap->cm+a, &cumap->clipr);
-
- cumap->black[0]=cumap->black[1]=cumap->black[2]= 0.0f;
- cumap->white[0]=cumap->white[1]=cumap->white[2]= 1.0f;
- curvemapping_set_black_white(cumap, NULL, NULL);
-
- curvemapping_changed(cumap, 0);
- curvemapping_do_ibuf(cumap, ibuf_v);
+ SpaceImage *sima= CTX_wm_space_image(C);
+ ImBuf *ibuf= ED_space_image_buffer(sima);
- WM_event_add_notifier(C, NC_IMAGE, sima->image);
+ return (ibuf != NULL);
}
-
static void image_panel_curves(const bContext *C, Panel *pa)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ bScreen *sc= CTX_wm_screen(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
- uiBlock *block;
- uiBut *bt;
+ PointerRNA simaptr;
+ int levels;
- /* and we check for spare */
ibuf= ED_space_image_buffer(sima);
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
-
- if (ibuf) {
- rctf rect;
-
+ if(ibuf) {
if(sima->cumap==NULL)
sima->cumap= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
-
- rect.xmin= 110; rect.xmax= 310;
- rect.ymin= 10; rect.ymax= 200;
- curvemap_buttons(block, sima->cumap, 'c', B_SIMACURVES, B_REDR, &rect);
-
- /* curvemap min/max only works for RGBA */
- if(ibuf->channels==4) {
- bt=uiDefBut(block, BUT, B_SIMARANGE, "Reset", 10, 160, 90, 19, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
- uiButSetFunc(bt, image_panel_curves_reset, sima->cumap, ibuf);
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_SIMARANGE, "Min R:", 10, 120, 90, 19, sima->cumap->black, -1000.0f, 1000.0f, 10, 2, "Black level");
- uiDefButF(block, NUM, B_SIMARANGE, "Min G:", 10, 100, 90, 19, sima->cumap->black+1, -1000.0f, 1000.0f, 10, 2, "Black level");
- uiDefButF(block, NUM, B_SIMARANGE, "Min B:", 10, 80, 90, 19, sima->cumap->black+2, -1000.0f, 1000.0f, 10, 2, "Black level");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_SIMARANGE, "Max R:", 10, 50, 90, 19, sima->cumap->white, -1000.0f, 1000.0f, 10, 2, "White level");
- uiDefButF(block, NUM, B_SIMARANGE, "Max G:", 10, 30, 90, 19, sima->cumap->white+1, -1000.0f, 1000.0f, 10, 2, "White level");
- uiDefButF(block, NUM, B_SIMARANGE, "Max B:", 10, 10, 90, 19, sima->cumap->white+2, -1000.0f, 1000.0f, 10, 2, "White level");
- }
+
+ /* curvemap black/white levels only works for RGBA */
+ levels= (ibuf->channels==4);
+
+ RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &simaptr);
+ uiTemplateCurveMapping(pa->layout, &simaptr, "curves", 'c', levels);
}
}
@@ -797,81 +657,11 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PREVI
uiBlockSetDrawExtraFunc(block, preview_cb);
}
-
-static void image_panel_gpencil(short cntrl) // IMAGE_HANDLER_GREASEPENCIL
-{
- uiBlock *block;
- SpaceImage *sima;
-
- sima= curarea->spacedata.first;
-
- block= uiBeginBlock(C, ar, "image_panel_gpencil", UI_EMBOSS);
- uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
- uiSetPanelHandler(IMAGE_HANDLER_GREASEPENCIL); // for close and esc
- if (uiNewPanel(C, ar, block, "Grease Pencil", "SpaceImage", 100, 30, 318, 204)==0) return;
-
- /* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */
- if (sima->flag & SI_DISPGP) {
- if (sima->gpd == NULL)
- gpencil_data_setactive(curarea, gpencil_data_addnew());
- }
-
- if (sima->flag & SI_DISPGP) {
- bGPdata *gpd= sima->gpd;
- short newheight;
-
- /* this is a variable height panel, newpanel doesnt force new size on existing panels */
- /* so first we make it default height */
- uiNewPanelHeight(block, 204);
-
- /* draw button for showing gpencil settings and drawings */
- uiDefButBitI(block, TOG, SI_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &sima->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Image/UV Editor (draw using Shift-LMB)");
-
- /* extend the panel if the contents won't fit */
- newheight= draw_gpencil_panel(block, gpd, curarea);
- uiNewPanelHeight(block, newheight);
- }
- else {
- uiDefButBitI(block, TOG, SI_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &sima->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Image/UV Editor");
- uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
- }
-}
#endif
/* ********************* callbacks for standard image buttons *************** */
-/* called from fileselect or button */
-static void load_image_cb(bContext *C, char *str, void *ima_pp_v, void *iuser_v)
-{
- Image **ima_pp= (Image **)ima_pp_v;
- Image *ima= NULL;
-
- ima= BKE_add_image_file(str, 0);
- if(ima) {
- if(*ima_pp) {
- (*ima_pp)->id.us--;
- }
- *ima_pp= ima;
-
- BKE_image_signal(ima, iuser_v, IMA_SIGNAL_RELOAD);
- WM_event_add_notifier(C, NC_IMAGE, ima);
-
- /* button event gets lost when it goes via filewindow */
-// if(G.buts && G.buts->lockpoin) {
-// Tex *tex= G.buts->lockpoin;
-// if(GS(tex->id.name)==ID_TE) {
-// BIF_preview_changed(ID_TE);
-// allqueue(REDRAWBUTSSHADING, 0);
-// allqueue(REDRAWVIEW3D, 0);
-// allqueue(REDRAWOOPS, 0);
-// }
-// }
- }
-
- ED_undo_push(C, "Load image");
-}
-
static char *layer_menu(RenderResult *rr, short *curlay)
{
RenderLayer *rl;
@@ -935,92 +725,6 @@ static void set_frames_cb(bContext *C, void *ima_v, void *iuser_v)
}
}
-static void image_src_change_cb(bContext *C, void *ima_v, void *iuser_v)
-{
- BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_SRC_CHANGE);
-}
-
-/* buttons have 2 arg callbacks, filewindow has 3 args... so thats why the wrapper below */
-static void image_browse_cb1(bContext *C, void *ima_pp_v, void *iuser_v)
-{
- Image **ima_pp= (Image **)ima_pp_v;
- ImageUser *iuser= iuser_v;
-
- if(ima_pp) {
- Image *ima= *ima_pp;
-
- if(iuser->menunr== -2) {
- // XXX activate_databrowse_args(&ima->id, ID_IM, 0, &iuser->menunr, image_browse_cb1, ima_pp, iuser);
- }
- else if (iuser->menunr>0) {
- Image *newima= (Image*) BLI_findlink(&CTX_data_main(C)->image, iuser->menunr-1);
-
- if (newima && newima!=ima) {
- *ima_pp= newima;
- id_us_plus(&newima->id);
- if(ima) ima->id.us--;
-
- BKE_image_signal(newima, iuser, IMA_SIGNAL_USER_NEW_IMAGE);
-
- ED_undo_push(C, "Browse image");
- }
- }
- }
-}
-
-static void image_browse_cb(bContext *C, void *ima_pp_v, void *iuser_v)
-{
- image_browse_cb1(C, ima_pp_v, iuser_v);
-}
-
-static void image_reload_cb(bContext *C, void *ima_v, void *iuser_v)
-{
- if(ima_v) {
- BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_RELOAD);
- }
-}
-
-static void image_field_test(bContext *C, void *ima_v, void *iuser_v)
-{
- Image *ima= ima_v;
-
- if(ima) {
- ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser_v);
- if(ibuf) {
- short nr= 0;
- if( !(ima->flag & IMA_FIELDS) && (ibuf->flags & IB_fields) ) nr= 1;
- if( (ima->flag & IMA_FIELDS) && !(ibuf->flags & IB_fields) ) nr= 1;
- if(nr) {
- BKE_image_signal(ima, iuser_v, IMA_SIGNAL_FREE);
- }
- }
- }
-}
-
-static void image_unlink_cb(bContext *C, void *ima_pp_v, void *unused)
-{
- Image **ima_pp= (Image **)ima_pp_v;
-
- if(ima_pp && *ima_pp) {
- Image *ima= *ima_pp;
- /* (for time being, texturefaces are no users, conflict in design...) */
- if(ima->id.us>1)
- ima->id.us--;
- *ima_pp= NULL;
- }
-}
-
-static void image_load_fs_cb(bContext *C, void *ima_pp_v, void *iuser_v)
-{
- ScrArea *sa= CTX_wm_area(C);
-// Image **ima_pp= (Image **)ima_pp_v;
-
- if(sa->spacetype==SPACE_IMAGE)
- WM_operator_name_call(C, "IMAGE_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
- else
- printf("not supported yet\n");
-}
-
/* 5 layer button callbacks... */
static void image_multi_cb(bContext *C, void *rr_v, void *iuser_v)
{
@@ -1075,6 +779,7 @@ static void image_multi_decpass_cb(bContext *C, void *rr_v, void *iuser_v)
}
}
+#if 0
static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
{
if(ima_v) {
@@ -1088,7 +793,7 @@ static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
}
if ((G.fileflags & G_AUTOPACK) == 0) {
- unpackImage(ima, PF_ASK);
+ unpackImage(NULL, ima, PF_ASK); /* XXX report errors */
ED_undo_push(C, "Unpack image");
}
}
@@ -1097,278 +802,280 @@ static void image_pack_cb(bContext *C, void *ima_v, void *iuser_v)
if (ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) {
// XXX error("Can't pack painted image. Save image or use Repack as PNG.");
} else {
- ima->packedfile = newPackedFile(ima->name);
+ ima->packedfile = newPackedFile(NULL, ima->name); /* XXX report errors */
ED_undo_push(C, "Pack image");
}
}
}
}
}
+#endif
-static void image_load_cb(bContext *C, void *ima_pp_v, void *iuser_v)
-{
- if(ima_pp_v) {
- Image *ima= *((Image **)ima_pp_v);
- ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser_v);
- char str[FILE_MAX];
-
- /* name in ima has been changed by button! */
- BLI_strncpy(str, ima->name, FILE_MAX);
- if(ibuf) BLI_strncpy(ima->name, ibuf->name, FILE_MAX);
-
- load_image_cb(C, str, ima_pp_v, iuser_v);
- }
-}
-
+#if 0
static void image_freecache_cb(bContext *C, void *ima_v, void *unused)
{
Scene *scene= CTX_data_scene(C);
BKE_image_free_anim_ibufs(ima_v, scene->r.cfra);
WM_event_add_notifier(C, NC_IMAGE, ima_v);
}
+#endif
-static void image_generated_change_cb(bContext *C, void *ima_v, void *iuser_v)
-{
- BKE_image_signal(ima_v, iuser_v, IMA_SIGNAL_FREE);
-}
-
+#if 0
static void image_user_change(bContext *C, void *iuser_v, void *unused)
{
Scene *scene= CTX_data_scene(C);
BKE_image_user_calc_imanr(iuser_v, scene->r.cfra, 0);
}
+#endif
-static void uiblock_layer_pass_buttons(uiBlock *block, RenderResult *rr, ImageUser *iuser, int event, int x, int y, int w)
+static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser, int w)
{
+ uiBlock *block= uiLayoutGetBlock(layout);
uiBut *but;
RenderLayer *rl= NULL;
int wmenu1, wmenu2;
char *strp;
+ uiLayoutRow(layout, 1);
+
/* layer menu is 1/3 larger than pass */
wmenu1= (3*w)/5;
wmenu2= (2*w)/5;
/* menu buts */
strp= layer_menu(rr, &iuser->layer);
- but= uiDefButS(block, MENU, event, strp, x, y, wmenu1, 20, &iuser->layer, 0,0,0,0, "Select Layer");
+ but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu1, 20, &iuser->layer, 0,0,0,0, "Select Layer");
uiButSetFunc(but, image_multi_cb, rr, iuser);
MEM_freeN(strp);
rl= BLI_findlink(&rr->layers, iuser->layer - (rr->rectf?1:0)); /* fake compo layer, return NULL is meant to be */
strp= pass_menu(rl, &iuser->pass);
- but= uiDefButS(block, MENU, event, strp, x+wmenu1, y, wmenu2, 20, &iuser->pass, 0,0,0,0, "Select Pass");
+ but= uiDefButS(block, MENU, 0, strp, 0, 0, wmenu2, 20, &iuser->pass, 0,0,0,0, "Select Pass");
uiButSetFunc(but, image_multi_cb, rr, iuser);
MEM_freeN(strp);
}
-static void uiblock_layer_pass_arrow_buttons(uiBlock *block, RenderResult *rr, ImageUser *iuser, int imagechanged)
+static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr, ImageUser *iuser)
{
+ uiBlock *block= uiLayoutGetBlock(layout);
+ uiLayout *row;
uiBut *but;
+ row= uiLayoutRow(layout, 1);
+
if(rr==NULL || iuser==NULL)
return;
if(rr->layers.first==NULL) {
- uiDefBut(block, LABEL, 0, "No Layers in Render Result,", 10, 107, 300, 20, NULL, 1, 0, 0, 0, "");
+ uiItemL(row, "No Layers in Render Result.", 0);
return;
}
-
- uiBlockBeginAlign(block);
/* decrease, increase arrows */
- but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_LEFT, 10,107,17,20, NULL, 0, 0, 0, 0, "Previous Layer");
+ but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Layer");
uiButSetFunc(but, image_multi_declay_cb, rr, iuser);
- but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_RIGHT, 27,107,18,20, NULL, 0, 0, 0, 0, "Next Layer");
+ but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Layer");
uiButSetFunc(but, image_multi_inclay_cb, rr, iuser);
- uiblock_layer_pass_buttons(block, rr, iuser, imagechanged, 45, 107, 230);
+ uiblock_layer_pass_buttons(row, rr, iuser, 230);
/* decrease, increase arrows */
- but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_LEFT, 275,107,17,20, NULL, 0, 0, 0, 0, "Previous Pass");
+ but= uiDefIconBut(block, BUT, 0, ICON_TRIA_LEFT, 0,0,17,20, NULL, 0, 0, 0, 0, "Previous Pass");
uiButSetFunc(but, image_multi_decpass_cb, rr, iuser);
- but= uiDefIconBut(block, BUT, imagechanged, ICON_TRIA_RIGHT, 292,107,18,20, NULL, 0, 0, 0, 0, "Next Pass");
+ but= uiDefIconBut(block, BUT, 0, ICON_TRIA_RIGHT, 0,0,18,20, NULL, 0, 0, 0, 0, "Next Pass");
uiButSetFunc(but, image_multi_incpass_cb, rr, iuser);
uiBlockEndAlign(block);
-
}
// XXX HACK!
-static int packdummy=0;
+// static int packdummy=0;
-/* The general Image panel with the loadsa callbacks! */
-void ED_image_uiblock_panel(const bContext *C, uiBlock *block, Image **ima_pp, ImageUser *iuser,
- short redraw, short imagechanged)
+typedef struct RNAUpdateCb {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+ ImageUser *iuser;
+} RNAUpdateCb;
+
+static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+{
+ RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
+
+ /* ideally this would be done by RNA itself, but there we have
+ no image user available, so we just update this flag here */
+ cb->iuser->ok= 1;
+
+ /* we call update here on the pointer property, this way the
+ owner of the image pointer can still define it's own update
+ and notifier */
+ RNA_property_update(C, &cb->ptr, cb->prop);
+}
+
+void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *userptr, int compact)
{
+ PropertyRNA *prop;
+ PointerRNA imaptr;
+ RNAUpdateCb *cb;
+ Image *ima;
+ ImageUser *iuser;
+ ImBuf *ibuf;
Scene *scene= CTX_data_scene(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- Image *ima= *ima_pp;
+ uiLayout *row, *split, *col;
+ uiBlock *block;
uiBut *but;
- char str[128], *strp;
+ char str[128];
+
+ if(!ptr->data)
+ return;
- /* different stuff when we show viewer */
- if(ima && ima->source==IMA_SRC_VIEWER) {
- ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser);
-
- image_info(ima, ibuf, str);
- uiDefBut(block, LABEL, 0, ima->id.name+2, 10, 180, 300, 20, NULL, 1, 0, 0, 0, "");
- uiDefBut(block, LABEL, 0, str, 10, 160, 300, 20, NULL, 1, 0, 0, 0, "");
-
- if(ima->type==IMA_TYPE_COMPOSITE) {
- iuser= ntree_get_active_iuser(scene->nodetree);
- if(iuser) {
- uiBlockBeginAlign(block);
- uiDefIconTextBut(block, BUT, B_SIMA_RECORD, ICON_REC, "Record", 10,120,100,20, 0, 0, 0, 0, 0, "");
- uiDefIconTextBut(block, BUT, B_SIMA_PLAY, ICON_PLAY, "Play", 110,120,100,20, 0, 0, 0, 0, 0, "");
- but= uiDefBut(block, BUT, B_NOP, "Free Cache", 210,120,100,20, 0, 0, 0, 0, 0, "");
- uiButSetFunc(but, image_freecache_cb, ima, NULL);
-
- if(iuser->frames)
- sprintf(str, "(%d) Frames:", iuser->framenr);
- else strcpy(str, "Frames:");
- uiBlockBeginAlign(block);
- uiDefButI(block, NUM, imagechanged, str, 10, 90,150, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
- uiDefButI(block, NUM, imagechanged, "StartFr:", 160,90,150,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
- }
- }
- else if(ima->type==IMA_TYPE_R_RESULT) {
- /* browse layer/passes */
- uiblock_layer_pass_arrow_buttons(block, RE_GetResult(RE_GetRender(scene->id.name)), iuser, imagechanged);
- }
+ prop= RNA_struct_find_property(ptr, propname);
+ if(!prop) {
+ printf("uiTemplateImage: property not found: %s\n", propname);
return;
}
-
- /* the main ima source types */
+
+ block= uiLayoutGetBlock(layout);
+
+ imaptr= RNA_property_pointer_get(ptr, prop);
+ ima= imaptr.data;
+ iuser= userptr->data;
+
+ cb= MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
+ cb->ptr= *ptr;
+ cb->prop= prop;
+ cb->iuser= iuser;
+
+ if(!compact)
+ uiTemplateID(layout, C, ptr, propname, "IMAGE_OT_new", "IMAGE_OT_open", NULL);
+
+ // XXX missing: reload, pack
+
if(ima) {
-// XXX uiSetButLock(ima->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
- uiBlockBeginAlign(block);
- uiBlockSetFunc(block, image_src_change_cb, ima, iuser);
- uiDefButS(block, ROW, imagechanged, "Still", 10, 180, 60, 20, &ima->source, 0.0, IMA_SRC_FILE, 0, 0, "Single Image file");
- uiDefButS(block, ROW, imagechanged, "Movie", 70, 180, 60, 20, &ima->source, 0.0, IMA_SRC_MOVIE, 0, 0, "Movie file");
- uiDefButS(block, ROW, imagechanged, "Sequence", 130, 180, 90, 20, &ima->source, 0.0, IMA_SRC_SEQUENCE, 0, 0, "Multiple Image files, as a sequence");
- uiDefButS(block, ROW, imagechanged, "Generated", 220, 180, 90, 20, &ima->source, 0.0, IMA_SRC_GENERATED, 0, 0, "Generated Image");
- uiBlockSetFunc(block, NULL, NULL, NULL);
- }
- else
- uiDefBut(block, LABEL, 0, " ", 10, 180, 300, 20, 0, 0, 0, 0, 0, ""); /* for align in panel */
+ uiBlockSetNFunc(block, rna_update_cb, MEM_dupallocN(cb), NULL);
+
+ if(ima->source == IMA_SRC_VIEWER) {
+ ibuf= BKE_image_get_ibuf(ima, iuser);
+ image_info(ima, ibuf, str);
+
+ uiItemL(layout, ima->id.name+2, 0);
+ uiItemL(layout, str, 0);
+
+ if(ima->type==IMA_TYPE_COMPOSITE) {
+ // XXX not working yet
+#if 0
+ iuser= ntree_get_active_iuser(scene->nodetree);
+ if(iuser) {
+ uiBlockBeginAlign(block);
+ uiDefIconTextBut(block, BUT, B_SIMA_RECORD, ICON_REC, "Record", 10,120,100,20, 0, 0, 0, 0, 0, "");
+ uiDefIconTextBut(block, BUT, B_SIMA_PLAY, ICON_PLAY, "Play", 110,120,100,20, 0, 0, 0, 0, 0, "");
+ but= uiDefBut(block, BUT, B_NOP, "Free Cache", 210,120,100,20, 0, 0, 0, 0, 0, "");
+ uiButSetFunc(but, image_freecache_cb, ima, NULL);
+
+ if(iuser->frames)
+ sprintf(str, "(%d) Frames:", iuser->framenr);
+ else strcpy(str, "Frames:");
+ uiBlockBeginAlign(block);
+ uiDefButI(block, NUM, imagechanged, str, 10, 90,150, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
+ uiDefButI(block, NUM, imagechanged, "StartFr:", 160,90,150,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
+ }
+#endif
+ }
+ else if(ima->type==IMA_TYPE_R_RESULT) {
+ /* browse layer/passes */
+ uiblock_layer_pass_arrow_buttons(layout, RE_GetResult(RE_GetRender(scene->id.name)), iuser);
+ }
+ }
+ else {
+ row= uiLayoutRow(layout, 0);
+ uiItemR(row, NULL, 0, &imaptr, "source", (compact)? 0: UI_ITEM_R_EXPAND);
+
+ if(ima->source != IMA_SRC_GENERATED) {
+ row= uiLayoutRow(layout, 0);
+ uiItemR(row, "", 0, &imaptr, "filename", 0);
+ //uiItemO(row, "Reload", 0, "image.reload");
+ }
+
+ // XXX what was this for?
+#if 0
+ /* check for re-render, only buttons */
+ if(imagechanged==B_IMAGECHANGED) {
+ if(iuser->flag & IMA_ANIM_REFRESHED) {
+ iuser->flag &= ~IMA_ANIM_REFRESHED;
+ WM_event_add_notifier(C, NC_IMAGE, ima);
+ }
+ }
+#endif
+
+ /* multilayer? */
+ if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
+ uiblock_layer_pass_arrow_buttons(layout, ima->rr, iuser);
+ }
+ else if(ima->source != IMA_SRC_GENERATED) {
+ ibuf= BKE_image_get_ibuf(ima, iuser);
+ image_info(ima, ibuf, str);
+ uiItemL(layout, str, 0);
+ }
+
+ if(ima->source != IMA_SRC_GENERATED) {
+ uiItemS(layout);
+
+ split= uiLayoutSplit(layout, 0);
+
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, NULL, 0, &imaptr, "fields", 0);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, NULL, 0, &imaptr, "field_order", UI_ITEM_R_EXPAND);
+ uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "fields"));
+
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, NULL, 0, &imaptr, "antialias", 0);
+ uiItemR(col, NULL, 0, &imaptr, "premultiply", 0);
+ }
+
+ if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ uiItemS(layout);
+
+ split= uiLayoutSplit(layout, 0);
+
+ col= uiLayoutColumn(split, 0);
- /* Browse */
- IMAnames_to_pupstring(&strp, NULL, NULL, &(CTX_data_main(C)->image), NULL, &iuser->menunr);
-
- uiBlockBeginAlign(block);
- but= uiDefButS(block, MENU, imagechanged, strp, 10,155,23,20, &iuser->menunr, 0, 0, 0, 0, "Selects an existing Image or Movie");
- uiButSetFunc(but, image_browse_cb, ima_pp, iuser);
-
- MEM_freeN(strp);
-
- /* name + options, or only load */
- if(ima) {
- int drawpack= (ima->source!=IMA_SRC_SEQUENCE && ima->source!=IMA_SRC_MOVIE && ima->ok);
-
- but= uiDefBut(block, TEX, B_IDNAME, "IM:", 33, 155, 177, 20, ima->id.name+2, 0.0, 21.0, 0, 0, "Current Image Datablock name.");
- uiButSetFunc(but, test_idbutton_cb, ima->id.name, NULL);
- but= uiDefBut(block, BUT, imagechanged, "Reload", 210, 155, 60, 20, NULL, 0, 0, 0, 0, "Reloads Image or Movie");
- uiButSetFunc(but, image_reload_cb, ima, iuser);
-
- but= uiDefIconBut(block, BUT, imagechanged, ICON_X, 270,155,20,20, 0, 0, 0, 0, 0, "Unlink Image block");
- uiButSetFunc(but, image_unlink_cb, ima_pp, NULL);
- sprintf(str, "%d", ima->id.us);
- uiDefBut(block, BUT, B_NOP, str, 290,155,20,20, 0, 0, 0, 0, 0, "Only displays number of users of Image block");
-
- but= uiDefIconBut(block, BUT, imagechanged, ICON_FILESEL, 10, 135, 23, 20, 0, 0, 0, 0, 0, "Open Fileselect to load new Image");
- uiButSetFunc(but, image_load_fs_cb, ima_pp, iuser);
- but= uiDefBut(block, TEX, imagechanged, "", 33,135,257+(drawpack?0:20),20, ima->name, 0.0, 239.0, 0, 0, "Image/Movie file name, change to load new");
- uiButSetFunc(but, image_load_cb, ima_pp, iuser);
-
- if(drawpack) {
- if (ima->packedfile) packdummy = 1;
- else packdummy = 0;
- but= uiDefIconButBitI(block, TOG, 1, redraw, ICON_PACKAGE, 290,135,20,20, &packdummy, 0, 0, 0, 0, "Toggles Packed status of this Image");
- uiButSetFunc(but, image_pack_cb, ima, iuser);
- }
-
- }
- else {
- but= uiDefBut(block, BUT, imagechanged, "Load", 33, 155, 100,20, NULL, 0, 0, 0, 0, "Load new Image of Movie");
- uiButSetFunc(but, image_load_fs_cb, ima_pp, iuser);
- }
- uiBlockEndAlign(block);
-
- if(ima) {
- ImBuf *ibuf= BKE_image_get_ibuf(ima, iuser);
-
- /* check for re-render, only buttons */
- if(imagechanged==B_IMAGECHANGED) {
- if(iuser->flag & IMA_ANIM_REFRESHED) {
- iuser->flag &= ~IMA_ANIM_REFRESHED;
- WM_event_add_notifier(C, NC_IMAGE, ima);
- }
- }
-
- /* multilayer? */
- if(ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
- uiblock_layer_pass_arrow_buttons(block, ima->rr, iuser, imagechanged);
- }
- else {
- image_info(ima, ibuf, str);
- uiDefBut(block, LABEL, 0, str, 10, 112, 300, 20, NULL, 1, 0, 0, 0, "");
- }
-
- /* exception, let's do because we only use this panel 3 times in blender... but not real good code! */
- if( (FACESEL_PAINT_TEST) && sima && &sima->iuser==iuser)
- return;
- /* left side default per-image options, right half the additional options */
-
- /* fields */
- uiBlockBeginAlign(block);
- but= uiDefButBitS(block, TOGBUT, IMA_FIELDS, imagechanged, "Fields", 10, 70, 65, 20, &ima->flag, 0, 0, 0, 0, "Click to enable use of fields in Image");
- uiButSetFunc(but, image_field_test, ima, iuser);
- uiDefButBitS(block, TOGBUT, IMA_STD_FIELD, B_NOP, "Odd", 75, 70, 45, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
-
- uiBlockSetFunc(block, image_reload_cb, ima, iuser);
- uiDefButBitS(block, TOGBUT, IMA_ANTIALI, B_NOP, "Anti", 10, 50, 45, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors");
- uiDefButBitS(block, TOGBUT, IMA_DO_PREMUL, imagechanged, "Premul", 55, 50, 65, 20, &ima->flag, 0, 0, 0, 0, "Toggles premultiplying alpha");
- uiBlockEndAlign(block);
-
- if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
- sprintf(str, "(%d) Frames:", iuser->framenr);
-
- uiBlockBeginAlign(block);
- uiBlockSetFunc(block, image_user_change, iuser, NULL);
- uiDefButBitS(block, TOG, IMA_ANIM_ALWAYS, B_NOP, "Auto Refresh", 120, 70, 190, 20, &iuser->flag, 0, 0, 0, 0, "Always refresh Image on frame changes");
-
- if(ima->anim) {
- uiDefButI(block, NUM, imagechanged, str, 120, 50,170, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
- but= uiDefBut(block, BUT, redraw, "<", 290, 50, 20, 20, 0, 0, 0, 0, 0, "Copies number of frames in movie file to Frames: button");
- uiButSetFunc(but, set_frames_cb, ima, iuser);
- }
- else
- uiDefButI(block, NUM, imagechanged, str, 120, 50,190, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
-
- uiDefButI(block, NUM, imagechanged, "Offs:", 120,30,100,20, &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
- uiDefButS(block, NUM, imagechanged, "Fie/Ima:", 220,30,90,20, &iuser->fie_ima, 1.0, 200.0, 0, 0, "The number of fields per rendered frame (2 fields is 1 image)");
-
- uiDefButI(block, NUM, imagechanged, "StartFr:", 120,10,100,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
- uiDefButS(block, TOG, imagechanged, "Cyclic", 220,10,90,20, &iuser->cycl, 0.0, 1.0, 0, 0, "Cycle the images in the movie");
-
- uiBlockSetFunc(block, NULL, iuser, NULL);
- }
- else if(ima->source==IMA_SRC_GENERATED) {
-
- uiBlockBeginAlign(block);
- uiBlockSetFunc(block, image_generated_change_cb, ima, iuser);
- uiDefButS(block, NUM, imagechanged, "SizeX:", 120,70,100,20, &ima->gen_x, 1.0, 5000.0, 0, 0, "Image size x");
- uiDefButS(block, NUM, imagechanged, "SizeY:", 220,70,90,20, &ima->gen_y, 1.0, 5000.0, 0, 0, "Image size y");
- uiDefButS(block, TOGBUT, imagechanged, "UV Test grid",120,50,190,20, &ima->gen_type, 0.0, 1.0, 0, 0, "");
- uiBlockSetFunc(block, NULL, NULL, NULL);
- }
- }
- uiBlockEndAlign(block);
-}
+ sprintf(str, "(%d) Frames", iuser->framenr);
+ row= uiLayoutRow(col, 1);
+ uiItemR(col, str, 0, userptr, "frames", 0);
+ if(ima->anim) {
+ block= uiLayoutGetBlock(row);
+ but= uiDefBut(block, BUT, 0, "<", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames from the movie or sequence.");
+ uiButSetFunc(but, set_frames_cb, ima, iuser);
+ }
+
+ uiItemR(col, "Start", 0, userptr, "start_frame", 0);
+ uiItemR(col, NULL, 0, userptr, "offset", 0);
+
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, "Fields", 0, userptr, "fields_per_frame", 0);
+ uiItemR(col, NULL, 0, userptr, "auto_refresh", 0);
+ uiItemR(col, NULL, 0, userptr, "cyclic", 0);
+ }
+ else if(ima->source==IMA_SRC_GENERATED) {
+ split= uiLayoutSplit(layout, 0);
+
+ col= uiLayoutColumn(split, 1);
+ uiItemR(col, "X", 0, &imaptr, "generated_width", 0);
+ uiItemR(col, "Y", 0, &imaptr, "generated_height", 0);
+
+ col= uiLayoutColumn(split, 0);
+ uiItemR(col, NULL, 0, &imaptr, "generated_type", UI_ITEM_R_EXPAND);
+ }
+
+ }
+
+ uiBlockSetNFunc(block, NULL, NULL, NULL);
+ }
+
+ MEM_freeN(cb);
+}
void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser *iuser)
{
- uiBlock *block= uiLayoutFreeBlock(layout);
Scene *scene= CTX_data_scene(C);
RenderResult *rr;
@@ -1376,55 +1083,52 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
if(ima && iuser) {
rr= BKE_image_get_renderresult(scene, ima);
- if(rr) {
- uiBlockBeginAlign(block);
- uiblock_layer_pass_buttons(block, rr, iuser, 0, 0, 0, 160);
- uiBlockEndAlign(block);
- }
+ if(rr)
+ uiblock_layer_pass_buttons(layout, rr, iuser, 160);
}
}
-static void image_panel_properties(const bContext *C, Panel *pa)
+static int image_panel_uv_poll(const bContext *C, PanelType *pt)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ return ED_uvedit_test(obedit);
+}
+
+static void image_panel_uv(const bContext *C, Panel *pa)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ ARegion *ar= CTX_wm_region(C);
uiBlock *block;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
- /* note, it draws no bottom half in facemode, for vertex buttons */
- ED_image_uiblock_panel(C, block, &sima->image, &sima->iuser, B_REDR, B_REDR);
image_editvertex_buts(C, block);
+ image_editcursor_buts(C, &ar->v2d, block);
}
void image_buttons_register(ARegionType *art)
{
PanelType *pt;
- pt= MEM_callocN(sizeof(PanelType), "spacetype image panel properties");
- strcpy(pt->idname, "IMAGE_PT_properties");
- strcpy(pt->label, "Image Properties");
- pt->draw= image_panel_properties;
- BLI_addtail(&art->paneltypes, pt);
-
- pt= MEM_callocN(sizeof(PanelType), "spacetype image panel paint");
- strcpy(pt->idname, "IMAGE_PT_paint");
- strcpy(pt->label, "Paint");
- pt->draw= image_panel_paint;
- pt->poll= image_panel_paint_poll;
- BLI_addtail(&art->paneltypes, pt);
-
- pt= MEM_callocN(sizeof(PanelType), "spacetype image panel paint color");
- strcpy(pt->idname, "IMAGE_PT_paint_color");
- strcpy(pt->label, "Paint Color");
- pt->draw= image_panel_paintcolor;
- pt->poll= image_panel_paint_poll;
+ pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
+ strcpy(pt->idname, "IMAGE_PT_uv");
+ strcpy(pt->label, "UV");
+ pt->draw= image_panel_uv;
+ pt->poll= image_panel_uv_poll;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel curves");
strcpy(pt->idname, "IMAGE_PT_curves");
strcpy(pt->label, "Curves");
pt->draw= image_panel_curves;
+ pt->poll= image_panel_poll;
+ pt->flag |= PNL_DEFAULT_CLOSED;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype image panel gpencil");
+ strcpy(pt->idname, "IMAGE_PT_gpencil");
+ strcpy(pt->label, "Grease Pencil");
+ pt->draw= gpencil_panel_standard;
BLI_addtail(&art->paneltypes, pt);
}
@@ -1433,13 +1137,9 @@ static int image_properties(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= image_has_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index e61931f2fad..fa736a29ce8 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -44,14 +44,17 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "BKE_context.h"
#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_image.h"
+#include "BKE_paint.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "ED_gpencil.h"
#include "ED_image.h"
#include "ED_screen.h"
@@ -106,7 +109,7 @@ static int image_curves_active(SpaceImage *sima)
return 0;
}
-static void image_verify_buffer_float(SpaceImage *sima, ImBuf *ibuf)
+static void image_verify_buffer_float(SpaceImage *sima, 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
@@ -121,20 +124,25 @@ static void image_verify_buffer_float(SpaceImage *sima, ImBuf *ibuf)
curvemapping_do_ibuf(sima->cumap, ibuf);
}
else {
+ if (color_manage) {
+ if (ima && ima->source == IMA_SRC_VIEWER)
+ ibuf->profile = IB_PROFILE_SRGB;
+ } else {
+ ibuf->profile = IB_PROFILE_NONE;
+ }
IMB_rect_from_float(ibuf);
}
}
}
}
-static void draw_render_info(SpaceImage *sima, ARegion *ar)
+static void draw_render_info(Image *ima, ARegion *ar)
{
rcti rect;
float colf[3];
int showspare= 0; // XXX BIF_show_render_spare();
- char *str= "render text"; // XXX BIF_render_text();
- if(str==NULL)
+ if(ima->render_text==NULL)
return;
rect= ar->winrct;
@@ -145,17 +153,20 @@ static void draw_render_info(SpaceImage *sima, ARegion *ar)
/* clear header rect */
UI_GetThemeColor3fv(TH_BACK, colf);
- glColor3f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 0.5f);
glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax+1);
+ glDisable(GL_BLEND);
UI_ThemeColor(TH_TEXT_HI);
if(showspare) {
UI_DrawString(12, rect.ymin + 5, "(Previous)");
- UI_DrawString(72, rect.ymin + 5, str);
+ UI_DrawString(72, rect.ymin + 5, ima->render_text);
}
else
- UI_DrawString(12, rect.ymin + 5, str);
+ UI_DrawString(12, rect.ymin + 5, ima->render_text);
}
void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf)
@@ -372,9 +383,10 @@ static void sima_draw_zbuffloat_pixels(Scene *scene, float x1, float y1, int rec
MEM_freeN(rectf);
}
-static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, ImBuf *ibuf, float fx, float fy, float zoomx, float zoomy)
+static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image *ima, ImBuf *ibuf, float fx, float fy, float zoomx, float zoomy)
{
int x, y;
+ int color_manage = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
/* set zoom */
glPixelZoom(zoomx, zoomy);
@@ -399,7 +411,7 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, ImBuf
}
#ifdef WITH_LCMS
else if(sima->flag & SI_COLOR_CORRECTION) {
- image_verify_buffer_float(sima, ibuf);
+ image_verify_buffer_float(sima, ima, ibuf, color_manage);
sima_draw_colorcorrected_pixels(x, y, ibuf);
@@ -415,7 +427,7 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, ImBuf
/* we don't draw floats buffers directly but
* convert them, and optionally apply curves */
- image_verify_buffer_float(sima, ibuf);
+ image_verify_buffer_float(sima, ima, ibuf, color_manage);
if(ibuf->rect)
glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
@@ -452,10 +464,11 @@ static unsigned int *get_part_from_ibuf(ImBuf *ibuf, short startx, short starty,
return rectmain;
}
-static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Image *ima, ImBuf *ibuf, float fx, float fy, float zoomx, float zoomy)
+static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene, Image *ima, ImBuf *ibuf, float fx, float fy, float zoomx, float zoomy)
{
unsigned int *rect;
int dx, dy, sx, sy, x, y;
+ int color_manage = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
/* verify valid values, just leave this a while */
if(ima->xrep<1) return;
@@ -467,7 +480,7 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Image *ima, I
sima->curtile = ima->xrep*ima->yrep - 1;
/* create char buffer from float if needed */
- image_verify_buffer_float(sima, ibuf);
+ image_verify_buffer_float(sima, ima, ibuf, color_manage);
/* retrieve part of image buffer */
dx= ibuf->x/ima->xrep;
@@ -500,9 +513,9 @@ static void draw_image_buffer_repeated(SpaceImage *sima, ARegion *ar, Scene *sce
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) {
if(ima && (ima->tpageflag & IMA_TILES))
- draw_image_buffer_tiled(sima, ar, ima, ibuf, x, y, zoomx, zoomy);
+ draw_image_buffer_tiled(sima, ar, scene, ima, ibuf, x, y, zoomx, zoomy);
else
- draw_image_buffer(sima, ar, scene, ibuf, x, y, zoomx, zoomy);
+ draw_image_buffer(sima, ar, scene, ima, ibuf, x, y, zoomx, zoomy);
/* only draw until running out of time */
if((PIL_check_seconds_timer() - time_current) > 0.25)
@@ -514,22 +527,26 @@ static void draw_image_buffer_repeated(SpaceImage *sima, ARegion *ar, Scene *sce
/* draw uv edit */
/* draw grease pencil */
-
-static void draw_image_grease_pencil(SpaceImage *sima, ImBuf *ibuf)
+void draw_image_grease_pencil(bContext *C, short onlyv2d)
{
- /* XXX bring back */
- /* draw grease-pencil ('image' strokes) */
- if (sima->flag & SI_DISPGP)
- ; // XXX draw_gpencil_2dimage(sa, ibuf);
-
-#if 0
- mywinset(sa->win); /* restore scissor after gla call... */
- wmOrtho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
-#endif
-
- /* draw grease-pencil (screen strokes) */
- if (sima->flag & SI_DISPGP)
- ; // XXX draw_gpencil_2dview(sa, NULL);
+ /* draw in View2D space? */
+ if (onlyv2d) {
+ /* assume that UI_view2d_ortho(C) has been called... */
+ SpaceImage *sima= (SpaceImage *)CTX_wm_space_data(C);
+ ImBuf *ibuf= ED_space_image_buffer(sima);
+
+ /* draw grease-pencil ('image' strokes) */
+ //if (sima->flag & SI_DISPGP)
+ draw_gpencil_2dimage(C, ibuf);
+ }
+ else {
+ /* assume that UI_view2d_restore(C) has been called... */
+ //SpaceImage *sima= (SpaceImage *)CTX_wm_space_data(C);
+
+ /* draw grease-pencil ('screen' strokes) */
+ //if (sima->flag & SI_DISPGP)
+ draw_gpencil_2dview(C, 0);
+ }
}
/* XXX becomes WM paint cursor */
@@ -567,7 +584,7 @@ static void draw_image_view_tool(Scene *scene)
static unsigned char *get_alpha_clone_image(Scene *scene, int *width, int *height)
{
- Brush *brush = scene->toolsettings->imapaint.brush;
+ Brush *brush = paint_brush(&scene->toolsettings->imapaint.paint);
ImBuf *ibuf;
unsigned int size, alpha;
unsigned char *rect, *cp;
@@ -605,7 +622,7 @@ static void draw_image_paint_helpers(SpaceImage *sima, ARegion *ar, Scene *scene
int x, y, w, h;
unsigned char *clonerect;
- brush= scene->toolsettings->imapaint.brush;
+ brush= paint_brush(&scene->toolsettings->imapaint.paint);
if(brush && (scene->toolsettings->imapaint.tool == PAINT_TOOL_CLONE)) {
/* this is not very efficient, but glDrawPixels doesn't allow
@@ -674,19 +691,16 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene)
else if(sima->flag & SI_DRAW_TILE)
draw_image_buffer_repeated(sima, ar, scene, ima, ibuf, zoomx, zoomy);
else if(ima && (ima->tpageflag & IMA_TILES))
- draw_image_buffer_tiled(sima, ar, ima, ibuf, 0.0f, 0.0, zoomx, zoomy);
+ draw_image_buffer_tiled(sima, ar, scene, ima, ibuf, 0.0f, 0.0, zoomx, zoomy);
else
- draw_image_buffer(sima, ar, scene, ibuf, 0.0f, 0.0f, zoomx, zoomy);
-
- /* grease pencil */
- draw_image_grease_pencil(sima, ibuf);
+ 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);
/* render info */
- if(ibuf && show_render)
- draw_render_info(sima, ar);
+ if(ibuf && ima && show_render)
+ draw_render_info(ima, ar);
/* XXX integrate this code */
#if 0
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 9550c4c3a29..e0fd652bf92 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -55,6 +55,7 @@
#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
@@ -63,7 +64,6 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "BIF_transform.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -86,95 +86,6 @@
#define B_SIMA_RECORD 8
#define B_SIMA_PLAY 9
-static void image_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- int a;
-
- uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_in");
- uiItemO(layout, NULL, 0, "IMAGE_OT_view_zoom_out");
-
- uiItemS(layout);
-
- for(a=0; a<7; a++) {
- const int ratios[7][2] = {{1, 8}, {1, 4}, {1, 2}, {1, 1}, {2, 1}, {4, 1}, {8, 1}};
- char namestr[128];
-
- sprintf(namestr, "Zoom %d:%d", ratios[a][0], ratios[a][1]);
- uiItemFloatO(layout, namestr, 0, "IMAGE_OT_view_zoom_ratio", "ratio", (float)ratios[a][0]/(float)ratios[a][1]);
- }
-}
-
-#if 0
-static void do_viewmenu(bContext *C, void *arg, int event)
-{
- add_blockhandler(curarea, IMAGE_HANDLER_VIEW_PROPERTIES, UI_PNL_UNSTOW);
- add_blockhandler(curarea, IMAGE_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
- add_blockhandler(curarea, IMAGE_HANDLER_PAINT, UI_PNL_UNSTOW);
- add_blockhandler(curarea, IMAGE_HANDLER_CURVES, UI_PNL_UNSTOW);
-
- toggle_blockhandler(curarea, IMAGE_HANDLER_PREVIEW, 0);
- scrarea_queue_winredraw(curarea);
-
- add_blockhandler(curarea, IMAGE_HANDLER_GAME_PROPERTIES, UI_PNL_UNSTOW);
- add_blockhandler(curarea, IMAGE_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
-
- allqueue(REDRAWIMAGE, 0);
- allqueue(REDRAWVIEW3D, 0);
-}
-#endif
-
-static void image_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- bScreen *sc= CTX_wm_screen(C);
- ScrArea *sa= CTX_wm_area(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- PointerRNA spaceptr, uvptr;
- int show_paint, show_render, show_uvedit;
-
- /* retrieve state */
- RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
- RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
-
- show_render= ED_space_image_show_render(sima);
- show_paint= ED_space_image_show_paint(sima);
- show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
-
- /* create menu */
- uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_properties");
- //if(show_render) uiItemO(layout, NULL, ICON_MENU_PANEL, "IMAGE_OT_toggle_compositing_preview_panel"); // Compositing Preview...|Shift P
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &spaceptr, "update_automatically", 0, 0, 0);
- // XXX if(show_uvedit) uiItemR(layout, NULL, 0, &uvptr, "local_view", 0, 0, 0); // "UV Local View", Numpad /
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "View Navigation", 0, image_view_viewnavmenu);
- if(show_uvedit) uiItemO(layout, NULL, 0, "IMAGE_OT_view_selected");
- uiItemO(layout, NULL, 0, "IMAGE_OT_view_all");
-
- if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
- else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
-}
-
-static void image_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "UV_OT_select_border");
- uiItemBooleanO(layout, "Border Select Pinned", 0, "UV_OT_select_border", "pinned", 1); // Border Select Pinned|Shift B
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "UV_OT_select_all_toggle");
- uiItemO(layout, NULL, 0, "UV_OT_select_invert");
- uiItemO(layout, NULL, 0, "UV_OT_unlink_selection");
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "UV_OT_select_pinned");
- uiItemO(layout, NULL, 0, "UV_OT_select_linked");
-}
-
#if 0
static void do_image_imagemenu(void *arg, int event)
{
@@ -183,61 +94,7 @@ static void do_image_imagemenu(void *arg, int event)
if (event >= 20) BPY_menu_do_python(PYMENU_IMAGE, event - 20);
#endif
}
-#endif
-
-static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- bScreen *sc= CTX_wm_screen(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- PointerRNA spaceptr, imaptr;
- Image *ima;
- ImBuf *ibuf;
- int show_render;
-
- /* retrieve state */
- ima= ED_space_image(sima);
- ibuf= ED_space_image_buffer(sima);
-
- show_render= ED_space_image_show_render(sima);
-
- RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
-
- /* create menu */
- uiItemO(layout, NULL, 0, "IMAGE_OT_new"); // New...
- uiItemO(layout, NULL, 0, "IMAGE_OT_open"); // Open...
-
- if(ima) {
- if(!show_render) {
- uiItemO(layout, NULL, 0, "IMAGE_OT_replace"); // Replace...
- uiItemO(layout, NULL, 0, "IMAGE_OT_reload"); // Reload...
- }
- uiItemO(layout, NULL, 0, "IMAGE_OT_save"); // Save
- uiItemO(layout, NULL, 0, "IMAGE_OT_save_as"); // Save As...
- if(ima->source == IMA_SRC_SEQUENCE)
- uiItemO(layout, NULL, 0, "IMAGE_OT_save_sequence"); // Save Changed Sequence Images
-
- if(!show_render) {
- uiItemS(layout);
-
- if(ima->packedfile) uiItemO(layout, NULL, 0, "IMAGE_OT_unpack"); // Unpack Image...
- else uiItemO(layout, NULL, 0, "IMAGE_OT_pack"); // Pack Image
- /* only for dirty && specific image types : XXX poll? */
- if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
- if(ELEM(ima->source, IMA_SRC_FILE, IMA_SRC_GENERATED) && ima->type != IMA_TYPE_MULTILAYER)
- uiItemBooleanO(layout, "Pack As PNG", 0, "IMAGE_OT_pack", "as_png", 1); // Pack Image As PNG
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &spaceptr, "image_painting", 0, 0, 0);
-
- /* move to realtime properties panel */
- RNA_id_pointer_create(&ima->id, &imaptr);
- uiItemMenuEnumR(layout, NULL, 0, &imaptr, "mapping");
- }
- }
-
-#if 0
#ifndef DISABLE_PYTHON
{
BPyMenu *pym;
@@ -253,33 +110,6 @@ static void image_imagemenu(bContext *C, uiLayout *layout, void *arg_unused)
}
#endif
#endif
-}
-
-static void image_uvs_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "UV_OT_reveal");
- uiItemO(layout, NULL, 0, "UV_OT_hide");
- uiItemBooleanO(layout, "Hide Unselected", 0, "UV_OT_hide", "unselected", 1);
-}
-
-static void image_uvs_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
- uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_ROTATION);
- uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_RESIZE);
-}
-
-static void image_uvs_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'x'); // "X Axis", M, 1
- uiItemEnumO(layout, NULL, 0, "UV_OT_mirror", "axis", 'y'); // "Y Axis", M, 2
-}
-
-static void image_uvs_weldalignmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "UV_OT_weld"); // W, 1
- uiItemsEnumO(layout, "UV_OT_align", "axis"); // W, 2/3/4
-}
#if 0
#ifndef DISABLE_PYTHON
@@ -316,87 +146,7 @@ static void image_uvs_scriptsmenu (void *args_unused)
#endif /* DISABLE_PYTHON */
#endif
-static void image_uvsmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- bScreen *sc= CTX_wm_screen(C);
- Scene *scene= CTX_data_scene(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- PointerRNA uvptr, sceneptr;
- Image *ima;
- ImBuf *ibuf;
-
- /* retrieve state */
- ima= ED_space_image(sima);
- ibuf= ED_space_image_buffer(sima);
-
- RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
- RNA_id_pointer_create(&scene->id, &sceneptr);
-
- /* create menu */
- uiItemR(layout, NULL, 0, &uvptr, "snap_to_pixels", 0, 0, 0);
- uiItemR(layout, NULL, 0, &uvptr, "constrain_to_image_bounds", 0, 0, 0);
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &uvptr, "live_unwrap", 0, 0, 0);
- uiItemO(layout, NULL, 0, "UV_OT_unwrap");
- uiItemBooleanO(layout, "Unpin", 0, "UV_OT_pin", "clear", 1);
- uiItemO(layout, NULL, 0, "UV_OT_pin");
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "UV_OT_pack_islands");
- uiItemO(layout, NULL, 0, "UV_OT_average_islands_scale");
- uiItemO(layout, NULL, 0, "UV_OT_minimize_stretch");
- uiItemO(layout, NULL, 0, "UV_OT_stitch");
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "Transform", 0, image_uvs_transformmenu);
- uiItemMenuF(layout, "Mirror", 0, image_uvs_mirrormenu);
- uiItemMenuF(layout, "Weld/Align", 0, image_uvs_weldalignmenu);
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0, 0, 0);
- uiItemMenuEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "Show/Hide Faces", 0, image_uvs_showhidemenu);
-
#if 0
-#ifndef DISABLE_PYTHON
- uiItemS(layout);
-
- uiItemMenuF(layout, "Scripts", image_uvs_scriptsmenu);
-#endif
-#endif
-}
-
-static void image_menu_uvlayers(Object *obedit, char *menustr, int *active)
-{
- Mesh *me= (Mesh*)obedit->data;
- EditMesh *em= BKE_mesh_get_editmesh(me);
- CustomDataLayer *layer;
- int i, count = 0;
-
- menustr[0]= '\0';
-
- for(i=0; i<em->fdata.totlayer; i++) {
- layer = &em->fdata.layers[i];
-
- if(layer->type == CD_MTFACE) {
- menustr += sprintf(menustr, "%s%%x%d|", layer->name, count);
- count++;
- }
- }
-
- *active= CustomData_get_active_layer(&em->fdata, CD_MTFACE);
-
- BKE_mesh_end_editmesh(me, em);
-}
-
static void do_image_buttons(bContext *C, void *arg, int event)
{
switch(event) {
@@ -405,7 +155,6 @@ static void do_image_buttons(bContext *C, void *arg, int event)
break;
}
-#if 0
ToolSettings *settings= G.scene->toolsettings;
ID *id, *idtest;
int nr;
@@ -660,284 +409,14 @@ static void do_image_buttons(bContext *C, void *arg, int event)
imagespace_composite_flipbook(curarea);
break;
}
-#endif
-}
-
-#if 0
-static void do_image_buttons_set_uvlayer_callback(void *act, void *data)
-{
- CustomData_set_layer_active(&G.editMesh->fdata, CD_MTFACE, *((int *)act));
-
- BIF_undo_push("Set Active UV Texture");
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
- allqueue(REDRAWIMAGE, 0);
}
#endif
-static void sima_idpoin_handle(bContext *C, ID *id, int event)
-{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
- Object *obedit= CTX_data_edit_object(C);
-
- switch(event) {
- case UI_ID_BROWSE:
- case UI_ID_DELETE:
- ED_space_image_set(C, sima, scene, obedit, (Image*)id);
- ED_undo_push(C, "Assign Image UV");
- break;
- case UI_ID_RENAME:
- break;
- case UI_ID_ADD_NEW:
- WM_operator_name_call(C, "IMAGE_OT_new", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case UI_ID_OPEN:
- WM_operator_name_call(C, "IMAGE_OT_open", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case UI_ID_PIN:
- ED_area_tag_refresh(CTX_wm_area(C));
- break;
- }
-}
-
-void image_header_buttons(const bContext *C, ARegion *ar)
-{
- bScreen *sc= CTX_wm_screen(C);
- ScrArea *sa= CTX_wm_area(C);
- Scene *scene= CTX_data_scene(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- Image *ima;
- ImBuf *ibuf;
- uiBlock *block;
- uiBut *but;
- PointerRNA spaceptr, uvptr, sceneptr;
- int xco, yco= 3, show_uvedit, show_render, show_paint, pinflag;
-
- /* retrieve state */
- ima= ED_space_image(sima);
- ibuf= ED_space_image_buffer(sima);
-
- show_render= ED_space_image_show_render(sima);
- show_paint= ED_space_image_show_paint(sima);
- show_uvedit= ED_space_image_show_uvedit(sima, CTX_data_edit_object(C));
-
- RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &spaceptr);
- RNA_pointer_create(&sc->id, &RNA_SpaceUVEditor, sima, &uvptr);
- RNA_id_pointer_create(&scene->id, &sceneptr);
-
- /* create block */
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_image_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- /* create pulldown menus */
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- char *menuname;
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefMenuBut(block, image_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- if(show_uvedit) {
- xmax= GetButStringLength("Select");
- uiDefMenuBut(block, image_selectmenu, NULL, "Select", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
- menuname= (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))? "Image*": "Image";
- xmax= GetButStringLength(menuname);
- uiDefMenuBut(block, image_imagemenu, NULL, menuname, xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- if(show_uvedit) {
- xmax= GetButStringLength("UVs");
- uiDefMenuBut(block, image_uvsmenu, NULL, "UVs", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* image select */
-
- pinflag= (show_render)? 0: UI_ID_PIN;
- xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)sima->image, ID_IM, &sima->pin, xco, yco,
- sima_idpoin_handle, UI_ID_BROWSE|UI_ID_BROWSE_RENDER|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|pinflag);
- xco += 8;
-
- if(ima && !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) {
- /* XXX this should not be a static var */
- static int headerbuttons_packdummy;
-
- headerbuttons_packdummy = 0;
-
- if (ima->packedfile) {
- headerbuttons_packdummy = 1;
- }
- if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
- uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMA_REPACK */, ICON_UGLYPACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG");
- else
- uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMAPACKIMA */, ICON_PACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image");
-
- xco+= XIC+8;
- }
-
- /* uv editing */
- if(show_uvedit) {
- /* pivot */
- uiDefIconTextButS(block, ICONTEXTROW, B_NOP, ICON_ROTATE,
- "Pivot: %t|Bounding Box Center %x0|Median Point %x3|2D Cursor %x1",
- xco,yco,XIC+10,YIC, &ar->v2d.around, 0, 3.0, 0, 0,
- "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period)");
- xco+= XIC + 18;
-
- /* selection modes */
- uiDefIconButBitS(block, TOG, UV_SYNC_SELECTION, B_REDR, ICON_EDIT, xco,yco,XIC,YIC, &scene->toolsettings->uv_flag, 0, 0, 0, 0, "Sync UV and Mesh Selection");
- xco+= XIC+8;
-
- if(scene->toolsettings->uv_flag & UV_SYNC_SELECTION) {
- uiBlockBeginAlign(block);
-
- uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_REDR, ICON_VERTEXSEL,
- xco,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
- uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_REDR, ICON_EDGESEL,
- xco+=XIC,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
- uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_REDR, ICON_FACESEL,
- xco+=XIC,yco,XIC,YIC, &scene->toolsettings->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
-
- uiBlockEndAlign(block);
- }
- else {
- uiBlockBeginAlign(block);
-
- uiDefIconButS(block, ROW, B_REDR, ICON_VERTEXSEL,
- xco,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_VERTEX, 0, 0, "Vertex select mode");
- uiDefIconButS(block, ROW, B_REDR, ICON_EDGESEL,
- xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_EDGE, 0, 0, "Edge select mode");
- uiDefIconButS(block, ROW, B_REDR, ICON_FACESEL,
- xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_FACE, 0, 0, "Face select mode");
- uiDefIconButS(block, ROW, B_REDR, ICON_LINKEDSEL,
- xco+=XIC,yco,XIC,YIC, &scene->toolsettings->uv_selectmode, 1.0, UV_SELECT_ISLAND, 0, 0, "Island select mode");
-
- uiBlockEndAlign(block);
-
- /* would use these if const's could go in strings
- * SI_STICKY_LOC SI_STICKY_DISABLE SI_STICKY_VERTEX */
- but = uiDefIconTextButC(block, ICONTEXTROW, B_REDR, ICON_STICKY_UVS_LOC,
- "Sticky UV Selection: %t|Disable%x1|Shared Location%x0|Shared Vertex%x2",
- xco+=XIC+10,yco,XIC+10,YIC, &(sima->sticky), 0, 3.0, 0, 0,
- "Sticky UV Selection (Hotkeys: Shift C, Alt C, Ctrl C)");
- }
-
- xco+= XIC + 16;
-
- /* snap options, identical to options in 3d view header */
- uiBlockBeginAlign(block);
-
- if (scene->toolsettings->snap_flag & SCE_SNAP) {
- uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEO,xco,yco,XIC,YIC, &scene->toolsettings->snap_flag, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab).");
- xco+= XIC;
- uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2",xco,yco,70,YIC, &scene->toolsettings->snap_target, 0, 0, 0, 0, "Snap Target Mode.");
- xco+= 70;
- }
- else {
- uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEAR,xco,yco,XIC,YIC, &scene->toolsettings->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab).");
- xco+= XIC;
- }
-
- uiBlockEndAlign(block);
- xco+= 8;
-
- /* uv layers */
- {
- Object *obedit= CTX_data_edit_object(C);
- char menustr[34*MAX_MTFACE];
- static int act;
-
- image_menu_uvlayers(obedit, menustr, &act);
-
- but = uiDefButI(block, MENU, B_NOP, menustr ,xco,yco,85,YIC, &act, 0, 0, 0, 0, "Active UV Layer for editing.");
- // uiButSetFunc(but, do_image_buttons_set_uvlayer_callback, &act, NULL);
-
- xco+= 85;
- }
-
- xco+= 8;
- }
-
- if(ima) {
- RenderResult *rr;
-
- /* render layers and passes */
- rr= BKE_image_get_renderresult(scene, ima);
- if(rr) {
- uiBlockBeginAlign(block);
-#if 0
- uiblock_layer_pass_buttons(block, rr, &sima->iuser, B_REDR, xco, 0, 160);
-#endif
- uiBlockEndAlign(block);
- xco+= 166;
- }
-
- /* painting */
- uiDefIconButR(block, TOG, B_REDR, ICON_TPAINT_HLT, xco,yco,XIC,YIC, &spaceptr, "image_painting", 0, 0, 0, 0, 0, NULL);
- xco+= XIC+8;
-
- /* image draw options */
- uiBlockBeginAlign(block);
- uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_RGB, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, 0, 0, 0, NULL);
- xco+= XIC;
- if(ibuf==NULL || ibuf->channels==4) {
- uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_RGB_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_USE_ALPHA, 0, 0, NULL);
- xco+= XIC;
- uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_SHOW_ALPHA, 0, 0, NULL);
- xco+= XIC;
- }
- if(ibuf) {
- if(ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels==1)) {
- uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ZDEPTH, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_SHOW_ZBUF, 0, 0, NULL);
- xco+= XIC;
- }
- }
-#ifdef WITH_LCMS
- uiDefIconButR(block, ROW, B_REDR, ICON_IMAGE_ALPHA, xco,yco,XIC,YIC, &spaceptr, "draw_channels", 0, 0, SI_COLOR_CORRECTION, 0, 0, NULL);
- xco+= XIC;
-#endif
- xco+= 8;
-
- /* record & play */
- uiBlockBeginAlign(block);
- if(ima->type==IMA_TYPE_COMPOSITE) {
- uiDefIconButO(block, BUT, "IMAGE_OT_record_composite", WM_OP_INVOKE_REGION_WIN, ICON_REC, xco, yco, XIC, YIC, NULL); // Record Composite
- xco+= XIC;
- }
- if((ima->type==IMA_TYPE_COMPOSITE) || ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
-//XXX uiDefIconButO(block, BUT, "IMAGE_OT_play_composite", WM_OP_INVOKE_REGION_WIN, ICON_PLAY, xco, yco, XIC, YIC, NULL); // PLAY
- xco+= XIC;
- }
- uiBlockEndAlign(block);
- xco+= 8;
-
- }
-
- /* draw lock */
- uiDefIconButR(block, ICONTOG, 0, ICON_UNLOCKED, xco,yco,XIC,YIC, &spaceptr, "update_automatically", 0, 0, 0, 0, 0, NULL);
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
/********************** toolbox operator *********************/
static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
uiPopupMenu *pup;
uiLayout *layout;
@@ -948,10 +427,10 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
pup= uiPupMenuBegin(C, "Toolbox", 0);
layout= uiPupMenuLayout(pup);
- uiItemMenuF(layout, "View", 0, image_viewmenu);
- if(show_uvedit) uiItemMenuF(layout, "Select", 0, image_selectmenu);
- uiItemMenuF(layout, "Image", 0, image_imagemenu);
- if(show_uvedit) uiItemMenuF(layout, "UVs", 0, image_uvsmenu);
+ uiItemM(layout, C, NULL, 0, "IMAGE_MT_view");
+ if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_select");
+ uiItemM(layout, C, NULL, 0, "IMAGE_MT_image");
+ if(show_uvedit) uiItemM(layout, C, NULL, 0, "IMAGE_MT_uvs");
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index aa97e339c68..a33475c1213 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -53,6 +53,7 @@ void IMAGE_OT_toolbox(struct wmOperatorType *ot);
/* image_draw.c */
void draw_image_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene);
void draw_image_info(struct ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf);
+void draw_image_grease_pencil(struct bContext *C, short onlyv2d);
/* image_ops.c */
int space_image_main_area_poll(struct bContext *C);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 8f9bb0d05fe..317a058d20e 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -61,6 +61,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
+#include "RNA_enum_types.h"
#include "ED_image.h"
#include "ED_screen.h"
@@ -109,7 +110,7 @@ static void sima_zoom_set_factor(SpaceImage *sima, ARegion *ar, float zoomfac)
static int space_image_poll(bContext *C)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
if(sima && sima->spacetype==SPACE_IMAGE)
if(ED_space_image_buffer(sima))
return 1;
@@ -119,7 +120,7 @@ static int space_image_poll(bContext *C)
static int space_image_file_exists_poll(bContext *C)
{
if(space_image_poll(C)) {
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
if(ibuf && BLI_exists(ibuf->name) && BLI_is_writable(ibuf->name))
@@ -131,10 +132,10 @@ static int space_image_file_exists_poll(bContext *C)
int space_image_main_area_poll(bContext *C)
{
- SpaceLink *slink= CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
// XXX ARegion *ar= CTX_wm_region(C);
- if(slink && (slink->spacetype == SPACE_IMAGE))
+ if(sima)
return 1; // XXX (ar && ar->type->regionid == RGN_TYPE_WINDOW);
return 0;
@@ -149,7 +150,7 @@ typedef struct ViewPanData {
static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ViewPanData *vpd;
op->customdata= vpd= MEM_callocN(sizeof(ViewPanData), "ImageViewPanData");
@@ -160,12 +161,12 @@ static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event)
vpd->xof= sima->xof;
vpd->yof= sima->yof;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
}
static void view_pan_exit(bContext *C, wmOperator *op, int cancel)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ViewPanData *vpd= op->customdata;
if(cancel) {
@@ -180,7 +181,7 @@ static void view_pan_exit(bContext *C, wmOperator *op, int cancel)
static int view_pan_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
float offset[2];
RNA_float_get_array(op->ptr, "offset", offset);
@@ -209,7 +210,7 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ViewPanData *vpd= op->customdata;
float offset[2];
@@ -223,7 +224,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
view_pan_exec(C, op);
break;
case MIDDLEMOUSE:
- if(event->val==0) {
+ if(event->val==KM_RELEASE) {
view_pan_exit(C, op, 0);
return OPERATOR_FINISHED;
}
@@ -251,6 +252,9 @@ void IMAGE_OT_view_pan(wmOperatorType *ot)
ot->modal= view_pan_modal;
ot->cancel= view_pan_cancel;
ot->poll= space_image_main_area_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
/* properties */
RNA_def_float_vector(ot->srna, "offset", 2, NULL, -FLT_MAX, FLT_MAX,
@@ -266,7 +270,7 @@ typedef struct ViewZoomData {
static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ViewZoomData *vpd;
op->customdata= vpd= MEM_callocN(sizeof(ViewZoomData), "ImageViewZoomData");
@@ -276,12 +280,12 @@ static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event)
vpd->y= event->y;
vpd->zoom= sima->zoom;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
}
static void view_zoom_exit(bContext *C, wmOperator *op, int cancel)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ViewZoomData *vpd= op->customdata;
if(cancel) {
@@ -295,7 +299,7 @@ static void view_zoom_exit(bContext *C, wmOperator *op, int cancel)
static int view_zoom_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
sima_zoom_set_factor(sima, ar, RNA_float_get(op->ptr, "factor"));
@@ -322,7 +326,7 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
ViewZoomData *vpd= op->customdata;
float factor;
@@ -335,7 +339,7 @@ static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
ED_area_tag_redraw(CTX_wm_area(C));
break;
case MIDDLEMOUSE:
- if(event->val==0) {
+ if(event->val==KM_RELEASE) {
view_zoom_exit(C, op, 0);
return OPERATOR_FINISHED;
}
@@ -363,6 +367,9 @@ void IMAGE_OT_view_zoom(wmOperatorType *ot)
ot->modal= view_zoom_modal;
ot->cancel= view_zoom_cancel;
ot->poll= space_image_main_area_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
/* properties */
RNA_def_float(ot->srna, "factor", 0.0f, 0.0f, FLT_MAX,
@@ -381,18 +388,16 @@ static int view_all_exec(bContext *C, wmOperator *op)
ARegion *ar;
Scene *scene;
Object *obedit;
- Image *ima;
ImBuf *ibuf;
float aspx, aspy, zoomx, zoomy, w, h;
int width, height;
/* retrieve state */
- sima= (SpaceImage*)CTX_wm_space_data(C);
+ sima= CTX_wm_space_image(C);
ar= CTX_wm_region(C);
scene= (Scene*)CTX_data_scene(C);
obedit= CTX_data_edit_object(C);
- ima= ED_space_image(sima);
ibuf= ED_space_image_buffer(sima);
ED_space_image_size(sima, &width, &height);
ED_space_image_aspect(sima, &aspx, &aspy);
@@ -445,7 +450,7 @@ static int view_selected_exec(bContext *C, wmOperator *op)
int width, height;
/* retrieve state */
- sima= (SpaceImage*)CTX_wm_space_data(C);
+ sima= CTX_wm_space_image(C);
ar= CTX_wm_region(C);
scene= (Scene*)CTX_data_scene(C);
obedit= CTX_data_edit_object(C);
@@ -489,7 +494,7 @@ void IMAGE_OT_view_selected(wmOperatorType *ot)
static int view_zoom_in_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
sima_zoom_set_factor(sima, ar, 1.25f);
@@ -512,7 +517,7 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot)
static int view_zoom_out_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
sima_zoom_set_factor(sima, ar, 0.8f);
@@ -537,7 +542,7 @@ void IMAGE_OT_view_zoom_out(wmOperatorType *ot)
static int view_zoom_ratio_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
sima_zoom_set(sima, ar, RNA_float_get(op->ptr, "ratio"));
@@ -604,7 +609,7 @@ static const EnumPropertyItem image_file_type_items[] = {
static void image_filesel(bContext *C, wmOperator *op, const char *path)
{
- RNA_string_set(op->ptr, "filename", path);
+ RNA_string_set(op->ptr, "path", path);
WM_event_add_fileselect(C, op);
}
@@ -612,30 +617,35 @@ static void image_filesel(bContext *C, wmOperator *op, const char *path)
static int open_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima= NULL;
char str[FILE_MAX];
- RNA_string_get(op->ptr, "filename", str);
+ RNA_string_get(op->ptr, "path", str);
ima= BKE_add_image_file(str, scene->r.cfra);
if(!ima)
return OPERATOR_CANCELLED;
+
+ /* already set later */
+ ima->id.us--;
- BKE_image_signal(ima, &sima->iuser, IMA_SIGNAL_RELOAD);
- ED_space_image_set(C, sima, scene, obedit, ima);
+ // XXX other users?
+ BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD);
+ if(sima)
+ ED_space_image_set(C, sima, scene, obedit, ima);
return OPERATOR_FINISHED;
}
static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
- char *path= (sima->image)? sima->image->name: U.textudir;
+ SpaceImage *sima= CTX_wm_space_image(C);
+ char *path= (sima && sima->image)? sima->image->name: U.textudir;
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return open_exec(C, op);
image_filesel(C, op, path);
@@ -652,26 +662,25 @@ void IMAGE_OT_open(wmOperatorType *ot)
/* api callbacks */
ot->exec= open_exec;
ot->invoke= open_invoke;
- ot->poll= ED_operator_image_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL);
}
/******************** replace image operator ********************/
static int replace_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
char str[FILE_MAX];
if(!sima->image)
return OPERATOR_CANCELLED;
- RNA_string_get(op->ptr, "filename", str);
+ RNA_string_get(op->ptr, "path", str);
BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD);
@@ -682,13 +691,13 @@ static int replace_exec(bContext *C, wmOperator *op)
static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
char *path= (sima->image)? sima->image->name: U.textudir;
if(!sima->image)
return OPERATOR_CANCELLED;
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return replace_exec(C, op);
image_filesel(C, op, path);
@@ -711,7 +720,7 @@ void IMAGE_OT_replace(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to replace current image with.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL);
}
/******************** save image as operator ********************/
@@ -787,7 +796,7 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
static int save_as_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Image *ima = ED_space_image(sima);
char str[FILE_MAX];
@@ -796,7 +805,7 @@ static int save_as_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
sima->imtypenr= RNA_enum_get(op->ptr, "file_type");
- RNA_string_get(op->ptr, "filename", str);
+ RNA_string_get(op->ptr, "path", str);
save_image_doit(C, sima, scene, op, str);
@@ -805,12 +814,12 @@ static int save_as_exec(bContext *C, wmOperator *op)
static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
ImBuf *ibuf= ED_space_image_buffer(sima);
Scene *scene= CTX_data_scene(C);
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return save_as_exec(C, op);
if(!ima)
@@ -855,15 +864,15 @@ void IMAGE_OT_save_as(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to.");
RNA_def_enum(ot->srna, "file_type", image_file_type_items, R_PNG, "File Type", "File type to save image as.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL);
}
/******************** save image operator ********************/
static int save_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
ImBuf *ibuf= ED_space_image_buffer(sima);
Scene *scene= CTX_data_scene(C);
@@ -912,7 +921,7 @@ void IMAGE_OT_save(wmOperatorType *ot)
static int save_sequence_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
int tot= 0;
char di[FILE_MAX], fi[FILE_MAX];
@@ -991,7 +1000,7 @@ static int reload_exec(bContext *C, wmOperator *op)
SpaceImage *sima;
/* retrieve state */
- sima= (SpaceImage*)CTX_wm_space_data(C);
+ sima= CTX_wm_space_image(C);
if(!sima->image)
return OPERATOR_CANCELLED;
@@ -1033,7 +1042,7 @@ static int new_exec(bContext *C, wmOperator *op)
int width, height, floatbuf, uvtestgrid;
/* retrieve state */
- sima= (SpaceImage*)CTX_wm_space_data(C);
+ sima= CTX_wm_space_image(C);
scene= (Scene*)CTX_data_scene(C);
obedit= CTX_data_edit_object(C);
@@ -1046,8 +1055,12 @@ static int new_exec(bContext *C, wmOperator *op)
color[3]= RNA_float_get(op->ptr, "alpha");
ima = BKE_add_image_size(width, height, name, floatbuf, uvtestgrid, color);
- BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
- ED_space_image_set(C, sima, scene, obedit, ima);
+ ima->id.us--; /* already set later */
+
+ if(sima) { // XXX other users?
+ BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
+ ED_space_image_set(C, sima, scene, obedit, ima);
+ }
return OPERATOR_FINISHED;
}
@@ -1060,8 +1073,7 @@ void IMAGE_OT_new(wmOperatorType *ot)
/* api callbacks */
ot->exec= new_exec;
- ot->invoke= WM_operator_redo;
- ot->poll= ED_operator_image_active;
+ ot->invoke= WM_operator_props_popup;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1098,7 +1110,7 @@ static int pack_test(bContext *C, wmOperator *op)
static int pack_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Image *ima= ED_space_image(sima);
ImBuf *ibuf= ED_space_image_buffer(sima);
int as_png= RNA_boolean_get(op->ptr, "as_png");
@@ -1114,14 +1126,14 @@ static int pack_exec(bContext *C, wmOperator *op)
if(as_png)
BKE_image_memorypack(ima);
else
- ima->packedfile= newPackedFile(ima->name);
+ ima->packedfile= newPackedFile(op->reports, ima->name);
return OPERATOR_FINISHED;
}
static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
uiPopupMenu *pup;
uiLayout *layout;
@@ -1162,13 +1174,87 @@ void IMAGE_OT_pack(wmOperatorType *ot)
/********************* unpack operator *********************/
+void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, PackedFile *pf)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ char line[FILE_MAXDIR + FILE_MAXFILE + 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, "Remove Pack", 0, opname, "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, line, 0, opname, "method", PF_WRITE_LOCAL);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_LOCAL);
+ sprintf(line, "Overwrite %s", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_LOCAL);
+ break;
+ }
+ }
+
+ switch(checkPackedFile(abs_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", abs_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", abs_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_USE_ORIGINAL);
+ sprintf(line, "Overwrite %s", local_name);
+ uiItemEnumO(layout, line, 0, opname, "method", PF_WRITE_ORIGINAL);
+ break;
+ }
+
+ uiPupMenuEnd(C, pup);
+}
+
static int unpack_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
+ int method= RNA_enum_get(op->ptr, "method");
- if(!ima)
+ if(!ima || !ima->packedfile)
return OPERATOR_CANCELLED;
- if(!ima->packedfile)
+
+ if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) {
+ BKE_report(op->reports, RPT_ERROR, "Can't unpack movie or image sequence.");
+ return OPERATOR_CANCELLED;
+ }
+
+ if(G.fileflags & G_AUTOPACK)
+ BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
+
+ unpackImage(op->reports, ima, method);
+
+ return OPERATOR_FINISHED;
+}
+
+static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Image *ima= CTX_data_edit_image(C);
+
+ if(!ima || !ima->packedfile)
return OPERATOR_CANCELLED;
if(ima->source==IMA_SRC_SEQUENCE || ima->source==IMA_SRC_MOVIE) {
@@ -1179,7 +1265,7 @@ 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.");
- unpackImage(ima, PF_ASK);
+ unpack_menu(C, "IMAGE_OT_unpack", ima->name, "textures", ima->packedfile);
return OPERATOR_FINISHED;
}
@@ -1192,10 +1278,14 @@ void IMAGE_OT_unpack(wmOperatorType *ot)
/* api callbacks */
ot->exec= unpack_exec;
+ ot->invoke= unpack_invoke;
ot->poll= space_image_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
}
/******************** sample image operator ********************/
@@ -1220,7 +1310,7 @@ typedef struct ImageSampleInfo {
static void sample_draw(const bContext *C, ARegion *ar, void *arg_info)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
ImageSampleInfo *info= arg_info;
@@ -1233,7 +1323,7 @@ static void sample_draw(const bContext *C, ARegion *ar, void *arg_info)
static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
ImageSampleInfo *info= op->customdata;
@@ -1348,7 +1438,7 @@ static void sample_exit(bContext *C, wmOperator *op)
static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
ImBuf *ibuf= ED_space_image_buffer(sima);
ImageSampleInfo *info;
@@ -1363,7 +1453,7 @@ static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
sample_apply(C, op, event);
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1400,6 +1490,9 @@ void IMAGE_OT_sample(wmOperatorType *ot)
ot->modal= sample_modal;
ot->cancel= sample_cancel;
ot->poll= space_image_main_area_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
}
/******************** set curve point operator ********************/
@@ -1438,7 +1531,7 @@ typedef struct RecordCompositeData {
int record_composite_apply(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
RecordCompositeData *rcd= op->customdata;
Scene *scene= CTX_data_scene(C);
ImBuf *ibuf;
@@ -1466,7 +1559,7 @@ int record_composite_apply(bContext *C, wmOperator *op)
static int record_composite_init(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
RecordCompositeData *rcd;
@@ -1488,7 +1581,7 @@ static int record_composite_init(bContext *C, wmOperator *op)
static void record_composite_exit(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
RecordCompositeData *rcd= op->customdata;
scene->r.cfra= rcd->old_cfra;
@@ -1528,7 +1621,7 @@ static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *event)
rcd= op->customdata;
rcd->timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER, 0.0f);
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
if(!record_composite_apply(C, op))
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c
index 381e12267c6..617749937cb 100644
--- a/source/blender/editors/space_image/image_render.c
+++ b/source/blender/editors/space_image/image_render.c
@@ -119,7 +119,7 @@ void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *ren
if(rect32)
glaDrawPixelsSafe(x1, y1, xmax, ymax, rr->rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect32);
else
- glaDrawPixelsSafe_to32(x1, y1, xmax, ymax, rr->rectx, rectf);
+ glaDrawPixelsSafe_to32(x1, y1, xmax, ymax, rr->rectx, rectf, 0);
glPixelZoom(1.0, 1.0);
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 7d6faa00dfc..f041cb00ee4 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -54,6 +54,7 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "ED_gpencil.h"
#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_space_api.h"
@@ -203,7 +204,7 @@ void image_operatortypes(void)
void image_keymap(struct wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Image Generic", SPACE_IMAGE, 0);
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);
@@ -211,7 +212,7 @@ void image_keymap(struct wmWindowManager *wm)
WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_properties", NKEY, KM_PRESS, 0, 0);
- keymap= WM_keymap_listbase(wm, "Image", SPACE_IMAGE, 0);
+ keymap= WM_keymap_find(wm, "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);
@@ -231,9 +232,9 @@ void image_keymap(struct wmWindowManager *wm)
RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
- WM_keymap_add_item(keymap, "PAINT_OT_image_paint", ACTIONMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_grab_clone", SELECTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_sample_color", SELECTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_image_paint", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_grab_clone", RIGHTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_sample_color", RIGHTMOUSE, KM_PRESS, 0, 0);
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);
@@ -246,7 +247,7 @@ void image_keymap(struct wmWindowManager *wm)
static void image_refresh(const bContext *C, ScrArea *sa)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima;
@@ -294,12 +295,23 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
case NC_IMAGE:
ED_area_tag_redraw(sa);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_IMAGE)
+ ED_area_tag_redraw(sa);
+ break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_DATA:
+ case ND_SELECT:
+ ED_area_tag_redraw(sa);
+ break;
+ }
}
}
static int image_context(const bContext *C, const char *member, bContextDataResult *result)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
if(CTX_data_dir(member)) {
static const char *dir[] = {"edit_image", NULL};
@@ -362,7 +374,6 @@ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar, Scene *sce
ar->v2d.mask.ymax= winy;
/* which part of the image space do we see? */
- /* same calculation as in lrectwrite: area left and down*/
x1= ar->winrct.xmin+(winx-sima->zoom*w)/2;
y1= ar->winrct.ymin+(winy-sima->zoom*h)/2;
@@ -387,26 +398,29 @@ static void image_main_area_set_view2d(SpaceImage *sima, ARegion *ar, Scene *sce
/* add handlers, stuff you only do once or on area/region changes */
static void image_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
// image space manages own v2d
// UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
/* image paint polls for mode */
- keymap= WM_keymap_listbase(wm, "ImagePaint", SPACE_IMAGE, 0);
+ keymap= WM_keymap_find(wm, "Image Paint", SPACE_IMAGE, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
+ keymap= WM_keymap_find(wm, "UVEdit", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
/* own keymaps */
- keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
+ keymap= WM_keymap_find(wm, "Image Generic", SPACE_IMAGE, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
- keymap= WM_keymap_listbase(wm, "Image", SPACE_IMAGE, 0);
+ keymap= WM_keymap_find(wm, "Image", SPACE_IMAGE, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
static void image_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
Scene *scene= CTX_data_scene(C);
View2D *v2d= &ar->v2d;
@@ -420,52 +434,33 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
/* we set view2d from own zoom and offset each time */
image_main_area_set_view2d(sima, ar, scene);
-
+
/* we draw image in pixelspace */
draw_image_main(sima, ar, scene);
/* and uvs in 0.0-1.0 space */
UI_view2d_view_ortho(C, v2d);
- draw_uvedit_main(sima, ar, scene, obedit);
- ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST);
+ draw_uvedit_main(sima, ar, scene, obedit);
+ ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST);
+
+ /* Grease Pencil too (in addition to UV's) */
+ draw_image_grease_pencil((bContext *)C, 1);
UI_view2d_view_restore(C);
+ /* draw Grease Pencil - screen space only */
+ draw_image_grease_pencil((bContext *)C, 0);
+
/* scrollers? */
/*scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_UNIT_VALUES, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);*/
}
-static void image_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
-{
- ListBase *keymap;
-
- keymap= WM_keymap_listbase(wm, "UVEdit", 0, 0);
-
- if(stype==NS_EDITMODE_MESH)
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-}
-
static void image_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
- case NC_SCENE:
- switch(wmn->data) {
- case ND_MODE:
- image_modal_keymaps(wmn->wm, ar, wmn->subtype);
- break;
- }
- break;
- case NC_OBJECT:
- switch(wmn->data) {
- case ND_GEOM_SELECT:
- case ND_GEOM_DATA:
- ED_region_tag_redraw(ar);
- break;
- }
+ /* nothing yet */
}
}
@@ -474,24 +469,27 @@ static void image_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* add handlers, stuff you only do once or on area/region changes */
static void image_buttons_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
- keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0);
+ keymap= WM_keymap_find(wm, "Image Generic", SPACE_IMAGE, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void image_buttons_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
static void image_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
-
+ case NC_BRUSH:
+ if(wmn->action==NA_EDITED)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -555,11 +553,10 @@ void ED_spacetype_image(void)
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype image region");
art->regionid = RGN_TYPE_WINDOW;
- art->keymapflag= ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_FRAMES|ED_KEYMAP_GPENCIL;
art->init= image_main_area_init;
art->draw= image_main_area_draw;
art->listener= image_main_area_listener;
- art->keymapflag= 0;
BLI_addhead(&st->regiontypes, art);
@@ -585,7 +582,6 @@ void ED_spacetype_image(void)
BLI_addhead(&st->regiontypes, art);
-
BKE_spacetype_register(st);
}
@@ -617,7 +613,7 @@ void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obe
if(C) {
if(obedit)
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
ED_area_tag_redraw(CTX_wm_area(C));
}
@@ -627,7 +623,7 @@ ImBuf *ED_space_image_buffer(SpaceImage *sima)
{
ImBuf *ibuf;
- if(sima->image) {
+ if(sima && sima->image) {
#if 0
if(sima->image->type==IMA_TYPE_R_RESULT && BIF_show_render_spare())
return BIF_render_spare_imbuf();
diff --git a/source/blender/editors/space_info/info_header.c b/source/blender/editors/space_info/info_header.c
deleted file mode 100644
index 7b65a70117c..00000000000
--- a/source/blender/editors/space_info/info_header.c
+++ /dev/null
@@ -1,507 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <stdio.h>
-
-#include "DNA_packedFile_types.h"
-#include "DNA_space_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_windowmanager_types.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_bpath.h"
-
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_main.h"
-#include "BKE_packedFile.h"
-#include "BKE_screen.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "IMB_imbuf_types.h"
-
-#include "info_intern.h"
-
-static int pupmenu() {return 0;}
-static int okee() {return 0;}
-static int error() {return 0;}
-
-/* ************************ header area region *********************** */
-
-#define B_STOPRENDER 1
-#define B_STOPCAST 2
-#define B_STOPANIM 3
-
-static void do_viewmenu(bContext *C, void *arg, int event)
-{
-}
-
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static int buttons_do_unpack()
-{
- int how;
- char menu[2048];
- char *line = menu;
- int ret_value = 1, count = 0;
-
- count = countPackedFiles();
-
- if(!count) {
- pupmenu("No packed files. Autopack disabled");
- return ret_value;
- }
- if (count == 1)
- line += sprintf(line, "Unpack 1 file%%t");
- else
- line += sprintf(line, "Unpack %d files%%t", count);
-
- line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
- line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
- line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
- line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
- line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
- line += sprintf(line, "|Ask for each file %%x%d", PF_ASK);
-
- how = pupmenu(menu);
-
- if(how == -1)
- ret_value = 0;
- else {
- if (how != PF_KEEP) unpackAll(how);
- G.fileflags &= ~G_AUTOPACK;
- }
-
- return ret_value;
-}
-
-static void check_packAll()
-{
- // first check for dirty images
- Image *ima;
-
- for(ima = G.main->image.first; ima; ima= ima->id.next) {
- if (ima->ibufs.first) { /* XXX FIX */
- ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
-
- if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY))
- break;
- }
- }
-
- if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) {
- packAll();
- G.fileflags |= G_AUTOPACK;
- }
-}
-
-static void do_info_externalfiles(bContext *C, void *arg, int event)
-{
- switch (event) {
-
- case 1: /* pack data */
- check_packAll();
- break;
- case 3: /* unpack data */
- if (buttons_do_unpack() != 0) {
- /* Clear autopack bit only if user selected one of the unpack options */
- G.fileflags &= ~G_AUTOPACK;
- }
- break;
- case 10: /* make all paths relative */
- if (G.relbase_valid) {
- int tot,changed,failed,linked;
- char str[512];
- char txtname[24]; /* text block name */
- txtname[0] = '\0';
- makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
- if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
- else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
- pupmenu(str);
- } else {
- pupmenu("Can't set relative paths with an unsaved blend file");
- }
- break;
- case 11: /* make all paths absolute */
- {
- int tot,changed,failed,linked;
- char str[512];
- char txtname[24]; /* text block name */
- txtname[0] = '\0';
- makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
- sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
- if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
- else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
-
- pupmenu(str);
- }
- break;
- case 12: /* check images exist */
- {
- char txtname[24]; /* text block name */
- txtname[0] = '\0';
-
- /* run the missing file check */
- checkMissingFiles( txtname );
-
- if (txtname[0] == '\0') {
- okee("No external files missing");
- } else {
- char str[128];
- sprintf(str, "Missing files listed in Text \"%s\"", txtname );
- error(str);
- }
- }
- break;
- case 13: /* search for referenced files that are not available */
-// XXX if(curarea->spacetype==SPACE_INFO) {
-// ScrArea *sa;
-// sa= closest_bigger_area();
-// areawinset(sa->win);
-// }
-// activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
- break;
- }
-
-}
-
-
-uiBlock *info_externalfiles(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "info_externalfiles", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into .blend file", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-
-
-static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
-
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
- uiItemO(layout, NULL, 0, "WM_OT_read_homefile");
- uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
- uiItemO(layout, NULL, 0, "WM_OT_open_mainfile");
-// uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
-// uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
-
- uiItemS(layout);
-
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
- uiItemO(layout, NULL, 0, "WM_OT_save_mainfile");
- uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
- uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile");
-
-#if 0
- if(U.flag & USER_FILECOMPRESS) {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
- } else {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
- }
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
-#if GAMEBLENDER == 1
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
-#endif
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
-
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-// uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
-// uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
- uiBlockSetDirection(block, UI_DOWN);
- uiTextBoundsBlock(block, 80);
-
- uiEndBlock(C, block);
- return block;
-#endif
-}
-
-
-static void do_info_buttons(bContext *C, void *arg, int event)
-{
- switch(event) {
- case B_STOPRENDER:
- G.afbreek= 1;
- break;
- case B_STOPCAST:
- WM_jobs_stop(CTX_wm_manager(C), CTX_wm_screen(C));
- break;
- case B_STOPANIM:
- ED_screen_animation_timer(C, 0, 0);
- break;
- }
-}
-
-static void screen_idpoin_handle(bContext *C, ID *id, int event)
-{
- switch(event) {
- case UI_ID_BROWSE:
- /* exception: can't set screens inside of area/region handers */
- WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, id);
- break;
- case UI_ID_DELETE:
- ED_undo_push(C, "");
- break;
- case UI_ID_RENAME:
- break;
- case UI_ID_ADD_NEW:
- /* XXX not implemented */
- break;
- case UI_ID_OPEN:
- /* XXX not implemented */
- break;
- case UI_ID_ALONE:
- /* XXX not implemented */
- break;
- case UI_ID_PIN:
- break;
- }
-}
-
-static void scene_idpoin_handle(bContext *C, ID *id, int event)
-{
- switch(event) {
- case UI_ID_BROWSE:
- /* exception: can't set screens inside of area/region handers */
- WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, id);
- break;
- case UI_ID_DELETE:
- ED_undo_push(C, "");
- break;
- case UI_ID_RENAME:
- break;
- case UI_ID_ADD_NEW:
- /* XXX not implemented */
- break;
- case UI_ID_OPEN:
- /* XXX not implemented */
- break;
- case UI_ID_ALONE:
- /* XXX not implemented */
- break;
- case UI_ID_PIN:
- break;
- }
-}
-
-static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
-{
- wmOperatorType *ot= arg2;
-
- if(ot)
- 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)
-{
- wmOperatorType *ot = WM_operatortype_first();
-
- for(; ot; ot= ot->next) {
-
- if(BLI_strcasestr(ot->name, str)) {
- if(ot->poll==NULL || ot->poll((bContext *)C)) {
- char name[256];
- int len= strlen(ot->name);
-
- /* display name for menu, can hold hotkey */
- BLI_strncpy(name, ot->name, 256);
-
- /* check for hotkey */
- if(len < 256-6) {
- if(WM_key_event_operator_string(C, ot->idname, WM_OP_EXEC_DEFAULT, NULL, &name[len+1], 256-len-1))
- name[len]= '|';
- }
-
- if(0==uiSearchItemAdd(items, name, ot, 0))
- break;
- }
- }
- }
-}
-
-void info_header_buttons(const bContext *C, ARegion *ar)
-{
- wmWindow *win= CTX_wm_window(C);
- bScreen *screen= CTX_wm_screen(C);
- ScrArea *sa= CTX_wm_area(C);
- uiBlock *block;
- int xco, yco= 3;
-
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_info_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("File");
- uiDefMenuBut(block, info_filemenu, NULL, "File", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Add");
- uiDefPulldownBut(block, dummy_viewmenu, sa, "Add", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Timeline");
- uiDefPulldownBut(block, dummy_viewmenu, sa, "Timeline", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Game");
- uiDefPulldownBut(block, dummy_viewmenu, sa, "Game", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Render");
- uiDefPulldownBut(block, dummy_viewmenu, sa, "Render", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Help");
- uiDefPulldownBut(block, dummy_viewmenu, NULL, "Help", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- if(screen->full==0) {
- xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)win->screen, ID_SCR, NULL, xco, yco,
- screen_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
- xco += 8;
- xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)screen->scene, ID_SCE, NULL, xco, yco,
- scene_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE);
- xco += 8;
- }
-
- if(WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
- uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_REC, "Render", xco+5,yco,75,19, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering");
- xco+= 80;
- }
- if(WM_jobs_test(CTX_wm_manager(C), CTX_wm_screen(C))) {
- uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_REC, "Capture", xco+5,yco,85,19, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast");
- xco+= 90;
- }
- if(screen->animtimer) {
- uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_REC, "Anim Player", xco+5,yco,85,19, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback");
- xco+= 90;
- }
-
- {
- static char search[256]= "";
- uiBut *but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, xco+5, yco, 120, 19, "");
-
- uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb);
-
- xco+= 125;
- }
-
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
index 213c0688f20..070b627af07 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -30,10 +30,14 @@
/* internal exports only */
+struct wmOperatorType;
-/* info_header.c */
-void info_header_buttons(const bContext *C, ARegion *ar);
-
+void FILE_OT_pack_all(struct wmOperatorType *ot);
+void FILE_OT_unpack_all(struct wmOperatorType *ot);
+void FILE_OT_make_paths_relative(struct wmOperatorType *ot);
+void FILE_OT_make_paths_absolute(struct wmOperatorType *ot);
+void FILE_OT_report_missing_files(struct wmOperatorType *ot);
+void FILE_OT_find_missing_files(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
new file mode 100644
index 00000000000..f4d8682b8ea
--- /dev/null
+++ b/source/blender/editors/space_info/info_ops.c
@@ -0,0 +1,397 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_packedFile_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_main.h"
+#include "BKE_packedFile.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
+
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "IMB_imbuf_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_types.h"
+
+#include "info_intern.h"
+
+/********************* pack all operator *********************/
+
+static int pack_all_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+
+ packAll(bmain, op->reports);
+ G.fileflags |= G_AUTOPACK;
+
+ return OPERATOR_FINISHED;
+}
+
+static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Main *bmain= CTX_data_main(C);
+ Image *ima;
+ ImBuf *ibuf;
+
+ // first check for dirty images
+ for(ima=bmain->image.first; ima; ima=ima->id.next) {
+ if(ima->ibufs.first) { /* XXX FIX */
+ ibuf= BKE_image_get_ibuf(ima, NULL);
+
+ if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
+ break;
+ }
+ }
+
+ if(ima) {
+ uiPupMenuOkee(C, "FILE_OT_pack_all", "Some images are painted on. These changes will be lost. Continue?");
+ return OPERATOR_CANCELLED;
+ }
+
+ return pack_all_exec(C, op);
+}
+
+void FILE_OT_pack_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Pack All";
+ ot->idname= "FILE_OT_pack_all";
+
+ /* api callbacks */
+ ot->exec= pack_all_exec;
+ ot->invoke= pack_all_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* unpack all operator *********************/
+
+static const EnumPropertyItem unpack_all_method_items[] = {
+ {PF_USE_LOCAL, "USE_LOCAL", 0, "Use files in current directory (create when necessary)", ""},
+ {PF_WRITE_LOCAL, "WRITE_LOCAL", 0, "Write files to current directory (overwrite existing files)", ""},
+ {PF_USE_ORIGINAL, "USE_ORIGINAL", 0, "Use files in original location (create when necessary)", ""},
+ {PF_WRITE_ORIGINAL, "WRITE_ORIGINAL", 0, "Write files to original location (overwrite existing files)", ""},
+ {PF_KEEP, "KEEP", 0, "Disable AutoPack, keep all packed files", ""},
+ {PF_ASK, "ASK", 0, "Ask for each file", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static int unpack_all_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ int method= RNA_enum_get(op->ptr, "method");
+
+ if(method != PF_KEEP) unpackAll(bmain, op->reports, method); /* XXX PF_ASK can't work here */
+ G.fileflags &= ~G_AUTOPACK;
+
+ return OPERATOR_FINISHED;
+}
+
+static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Main *bmain= CTX_data_main(C);
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ char title[128];
+ int count = 0;
+
+ count = countPackedFiles(bmain);
+
+ if(!count) {
+ BKE_report(op->reports, RPT_WARNING, "No packed files. Autopack disabled.");
+ G.fileflags &= ~G_AUTOPACK;
+ return OPERATOR_CANCELLED;
+ }
+
+ if(count == 1)
+ sprintf(title, "Unpack 1 file");
+ else
+ sprintf(title, "Unpack %d files", count);
+
+ pup= uiPupMenuBegin(C, title, 0);
+ layout= uiPupMenuLayout(pup);
+
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
+ uiItemsEnumO(layout, "FILE_OT_unpack_all", "method");
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+void FILE_OT_unpack_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Unpack All";
+ ot->idname= "FILE_OT_unpack_all";
+
+ /* api callbacks */
+ ot->exec= unpack_all_exec;
+ ot->invoke= unpack_all_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "method", unpack_all_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
+}
+
+/********************* make paths relative operator *********************/
+
+static int make_paths_relative_exec(bContext *C, wmOperator *op)
+{
+ char txtname[24]; /* text block name */
+ int tot, changed, failed, linked;
+
+ if(!G.relbase_valid) {
+ BKE_report(op->reports, RPT_WARNING, "Can't set relative paths with an unsaved blend file.");
+ return OPERATOR_CANCELLED;
+ }
+
+ txtname[0] = '\0';
+ makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
+
+ if(failed)
+ BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
+ else
+ BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_make_paths_relative(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make All Paths Relative";
+ ot->idname= "FILE_OT_make_paths_relative";
+
+ /* api callbacks */
+ ot->exec= make_paths_relative_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* make paths absolute operator *********************/
+
+static int make_paths_absolute_exec(bContext *C, wmOperator *op)
+{
+ char txtname[24]; /* text block name */
+ int tot, changed, failed, linked;
+
+ if(!G.relbase_valid) {
+ BKE_report(op->reports, RPT_WARNING, "Can't set absolute paths with an unsaved blend file.");
+ return OPERATOR_CANCELLED;
+ }
+
+ txtname[0] = '\0';
+ makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
+
+ if(failed)
+ BKE_reportf(op->reports, RPT_ERROR, "Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
+ else
+ BKE_reportf(op->reports, RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
+
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_make_paths_absolute(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make All Paths Absolute";
+ ot->idname= "FILE_OT_make_paths_absolute";
+
+ /* api callbacks */
+ ot->exec= make_paths_absolute_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* report missing files operator *********************/
+
+static int report_missing_files_exec(bContext *C, wmOperator *op)
+{
+ char txtname[24]; /* text block name */
+
+ txtname[0] = '\0';
+
+ /* run the missing file check */
+ checkMissingFiles(txtname);
+
+ if(txtname[0] == '\0')
+ BKE_report(op->reports, RPT_INFO, "No external files missing.");
+ else
+ BKE_reportf(op->reports, RPT_ERROR, "Missing files listed in Text \"%s\"", txtname);
+
+ return OPERATOR_FINISHED;
+}
+
+void FILE_OT_report_missing_files(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Report Missing Files...";
+ ot->idname= "FILE_OT_report_missing_files";
+
+ /* api callbacks */
+ ot->exec= report_missing_files_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/********************* find missing files operator *********************/
+
+static int find_missing_files_exec(bContext *C, wmOperator *op)
+{
+ char *path;
+
+ path= RNA_string_get_alloc(op->ptr, "path", NULL, 0);
+ findMissingFiles(path);
+ MEM_freeN(path);
+
+ return OPERATOR_FINISHED;
+}
+
+static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ /* XXX file open button text "Find Missing Files" */
+ WM_event_add_fileselect(C, op);
+ return OPERATOR_RUNNING_MODAL;
+}
+
+void FILE_OT_find_missing_files(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Find Missing Files...";
+ ot->idname= "FILE_OT_find_missing_files";
+
+ /* api callbacks */
+ ot->exec= find_missing_files_exec;
+ ot->invoke= find_missing_files_invoke;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ WM_operator_properties_filesel(ot, 0, FILE_SPECIAL);
+}
+
+#if 0
+static void info_filemenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_read_homefile");
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_open_mainfile");
+// uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
+// uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
+
+ uiItemS(layout);
+
+ uiLayoutSetOperatorContext(layout, WM_OP_EXEC_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_save_mainfile");
+ uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_AREA);
+ uiItemO(layout, NULL, 0, "WM_OT_save_as_mainfile");
+
+#if 0
+ if(U.flag & USER_FILECOMPRESS) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
+ } else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
+ }
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
+#if GAMEBLENDER == 1
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
+#endif
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
+
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+// uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
+// uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ uiBlockSetDirection(block, UI_DOWN);
+ uiTextBoundsBlock(block, 80);
+
+ uiEndBlock(C, block);
+ return block;
+#endif
+}
+#endif
+
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
new file mode 100644
index 00000000000..60cac0a00fa
--- /dev/null
+++ b/source/blender/editors/space_info/info_stats.c
@@ -0,0 +1,434 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_anim.h"
+#include "BKE_context.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"
+
+#include "BLI_editVert.h"
+
+typedef struct SceneStats {
+ int totvert, totvertsel;
+ int totedge, totedgesel;
+ int totface, totfacesel;
+ int totbone, totbonesel;
+ int totobj, totobjsel;
+ int totmesh, totlamp, totcurve;
+
+ char infostr[512];
+} SceneStats;
+
+static void stats_object(Object *ob, int sel, int totob, SceneStats *stats)
+{
+ switch(ob->type) {
+ case OB_MESH: {
+ /* we assume derivedmesh is already built, this strictly does stats now. */
+ DerivedMesh *dm= ob->derivedFinal;
+ int totvert, totedge, totface;
+
+ stats->totmesh +=totob;
+
+ if(dm) {
+ totvert = dm->getNumVerts(dm);
+ totedge = dm->getNumEdges(dm);
+ totface = dm->getNumFaces(dm);
+
+ stats->totvert += totvert*totob;
+ stats->totedge += totedge*totob;
+ stats->totface += totface*totob;
+
+ if(sel) {
+ stats->totvertsel += totvert;
+ stats->totfacesel += totface;
+ }
+ }
+ break;
+ }
+ case OB_LAMP:
+ stats->totlamp += totob;
+ break;
+ 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);
+
+ tot *= totob;
+ totf *= totob;
+
+ stats->totvert+= tot;
+ stats->totface+= totf;
+
+ if(sel) {
+ stats->totvertsel += tot;
+ stats->totfacesel += totf;
+ }
+ break;
+ }
+ case OB_MBALL: {
+ int tot= 0, totf= 0;
+
+ count_displist(&ob->disp, &tot, &totf);
+
+ tot *= totob;
+ totf *= totob;
+
+ stats->totvert += tot;
+ stats->totface += totf;
+
+ if(sel) {
+ stats->totvertsel += tot;
+ stats->totfacesel += totf;
+ }
+ break;
+ }
+ }
+}
+
+static void stats_object_edit(Object *obedit, SceneStats *stats)
+{
+ if(obedit->type==OB_MESH) {
+ /* Mesh Edit */
+ EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+ EditVert *eve;
+ EditEdge *eed;
+ EditFace *efa;
+
+ for(eve= em->verts.first; eve; eve=eve->next) {
+ stats->totvert++;
+ if(eve->f & SELECT) stats->totvertsel++;
+ }
+ for(eed= em->edges.first; eed; eed=eed->next) {
+ stats->totedge++;
+ if(eed->f & SELECT) stats->totedgesel++;
+ }
+ for(efa= em->faces.first; efa; efa=efa->next) {
+ stats->totface++;
+ if(efa->f & SELECT) stats->totfacesel++;
+ }
+
+ EM_validate_selections(em);
+ }
+ else if(obedit->type==OB_ARMATURE){
+ /* Armature Edit */
+ bArmature *arm= obedit->data;
+ EditBone *ebo;
+
+ for(ebo=arm->edbo->first; ebo; ebo=ebo->next){
+ stats->totbone++;
+
+ if((ebo->flag & BONE_CONNECTED) && ebo->parent)
+ stats->totvert--;
+
+ if(ebo->flag & BONE_TIPSEL)
+ stats->totvertsel++;
+ if(ebo->flag & BONE_ROOTSEL)
+ stats->totvertsel++;
+
+ if(ebo->flag & BONE_SELECTED) stats->totbonesel++;
+
+ /* if this is a connected child and it's parent is being moved, remove our root */
+ if((ebo->flag & BONE_CONNECTED)&& (ebo->flag & BONE_ROOTSEL) && ebo->parent && (ebo->parent->flag & BONE_TIPSEL))
+ stats->totvertsel--;
+
+ stats->totvert+=2;
+ }
+ }
+ else if ELEM(obedit->type, OB_CURVE, OB_SURF) { /* OB_FONT has no cu->editnurb */
+ /* Curve Edit */
+ Curve *cu= obedit->data;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ for(nu=cu->editnurb->first; nu; nu=nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ stats->totvert+=3;
+ if(bezt->f1) stats->totvertsel++;
+ if(bezt->f2) stats->totvertsel++;
+ if(bezt->f3) stats->totvertsel++;
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ stats->totvert++;
+ if(bp->f1 & SELECT) stats->totvertsel++;
+ bp++;
+ }
+ }
+ }
+ }
+ else if(obedit->type==OB_MBALL) {
+ /* MetaBall Edit */
+ MetaBall *mball= obedit->data;
+ MetaElem *ml;
+
+ for(ml= mball->editelems->first; ml; ml=ml->next) {
+ stats->totvert++;
+ if(ml->flag & SELECT) stats->totvertsel++;
+ }
+ }
+ else if(obedit->type==OB_LATTICE) {
+ /* Lattice Edit */
+ Lattice *lt= obedit->data;
+ Lattice *editlatt= lt->editlatt;
+ BPoint *bp;
+ int a;
+
+ bp= editlatt->def;
+
+ a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ while(a--) {
+ stats->totvert++;
+ if(bp->f1 & SELECT) stats->totvertsel++;
+ bp++;
+ }
+ }
+}
+
+static void stats_object_pose(Object *ob, SceneStats *stats)
+{
+ if(ob->pose) {
+ bArmature *arm= ob->data;
+ bPoseChannel *pchan;
+
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ stats->totbone++;
+ if(pchan->bone && (pchan->bone->flag & BONE_SELECTED))
+ if(pchan->bone->layer & arm->layer)
+ stats->totbonesel++;
+ }
+ }
+}
+
+static void stats_object_paint(Object *ob, SceneStats *stats)
+{
+ if(ob->type == OB_MESH) {
+ Mesh *me= ob->data;
+
+ stats->totface= me->totface;
+ stats->totvert= me->totvert;
+ }
+}
+
+static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
+{
+ if(base->flag & SELECT) stats->totobjsel++;
+
+ if(ob->transflag & OB_DUPLIPARTS) {
+ /* Dupli Particles */
+ ParticleSystem *psys;
+ ParticleSettings *part;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ part=psys->part;
+
+ if(part->draw_as==PART_DRAW_OB && part->dup_ob){
+ int tot=count_particles(psys);
+ stats_object(part->dup_ob, 0, tot, stats);
+ }
+ else if(part->draw_as==PART_DRAW_GR && part->dup_group){
+ GroupObject *go;
+ int tot, totgroup=0, cur=0;
+
+ for(go= part->dup_group->gobject.first; go; go=go->next)
+ totgroup++;
+
+ for(go= part->dup_group->gobject.first; go; go=go->next) {
+ tot=count_particles_mod(psys,totgroup,cur);
+ stats_object(go->ob, 0, tot, stats);
+ cur++;
+ }
+ }
+ }
+
+ stats_object(ob, base->flag & SELECT, 1, stats);
+ stats->totobj++;
+ }
+ else if(ob->parent && (ob->parent->transflag & (OB_DUPLIVERTS|OB_DUPLIFACES))) {
+ /* Dupli Verts/Faces */
+ int tot= count_duplilist(ob->parent);
+ stats->totobj+=tot;
+ stats_object(ob, base->flag & SELECT, tot, stats);
+ }
+ else if(ob->transflag & OB_DUPLIFRAMES) {
+ /* Dupli Frames */
+ int tot= count_duplilist(ob);
+ stats->totobj+=tot;
+ stats_object(ob, base->flag & SELECT, tot, stats);
+ }
+ else if((ob->transflag & OB_DUPLIGROUP) && ob->dup_group) {
+ /* Dupli Group */
+ int tot= count_duplilist(ob);
+ stats->totobj+=tot;
+ stats_object(ob, base->flag & SELECT, tot, stats);
+ }
+ else {
+ /* No Dupli */
+ stats_object(ob, base->flag & SELECT, 1, stats);
+ stats->totobj++;
+ }
+}
+
+/* Statistics displayed in info header. Called regularly on scene changes. */
+static void stats_update(Scene *scene)
+{
+ SceneStats stats;
+ 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);
+ }
+ else if(ob && (ob->mode & OB_MODE_POSE)) {
+ /* 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))) {
+ /* Sculpt and Paint Mode */
+ stats_object_paint(ob, &stats);
+ }
+ else {
+ /* Objects */
+ for(base= scene->base.first; base; base=base->next)
+ if(scene->lay & base->lay)
+ stats_dupli_object(base, base->object, &stats);
+ }
+
+ if(!scene->stats)
+ scene->stats= MEM_mallocN(sizeof(SceneStats), "SceneStats");
+
+ *(scene->stats)= stats;
+}
+
+static void stats_string(Scene *scene)
+{
+ SceneStats *stats= scene->stats;
+ Object *ob= (scene->basact)? scene->basact->object: NULL;
+ uintptr_t mem_in_use, mmap_in_use;
+ char memstr[64];
+ char *s;
+
+ mem_in_use= MEM_get_memory_in_use();
+ mmap_in_use= MEM_get_mapped_memory_in_use();
+
+ /* get memory statistics */
+ s= memstr + sprintf(memstr, " | Mem:%.2fM", ((mem_in_use-mmap_in_use)>>10)/1024.0);
+ if(mmap_in_use)
+ sprintf(s, " (%.2fM)", ((mmap_in_use)>>10)/1024.0);
+
+ s= stats->infostr;
+
+ if(scene->obedit) {
+ if(ob_get_keyblock(scene->obedit))
+ s+= sprintf(s, "(Key) ");
+
+ if(scene->obedit->type==OB_MESH) {
+ if(scene->toolsettings->selectmode & SCE_SELECT_VERTEX)
+ s+= sprintf(s, "Ve:%d-%d | Ed:%d-%d | Fa:%d-%d",
+ stats->totvertsel, stats->totvert, stats->totedgesel, stats->totedge, stats->totfacesel, stats->totface);
+ else if(scene->toolsettings->selectmode & SCE_SELECT_EDGE)
+ s+= sprintf(s, "Ed:%d-%d | Fa:%d-%d",
+ stats->totedgesel, stats->totedge, stats->totfacesel, stats->totface);
+ else
+ s+= sprintf(s, "Fa:%d-%d", stats->totfacesel, stats->totface);
+ }
+ else if(scene->obedit->type==OB_ARMATURE) {
+ s+= sprintf(s, "Ve:%d-%d | Bo:%d-%d", stats->totvertsel, stats->totvert, stats->totbonesel, stats->totbone);
+ }
+ else {
+ s+= sprintf(s, "Ve:%d-%d", stats->totvertsel, stats->totvert);
+ }
+
+ strcat(s, memstr);
+ }
+ else if(ob && (ob->mode & OB_MODE_POSE)) {
+ s += sprintf(s, "Bo:%d-%d %s",
+ stats->totbonesel, stats->totbone, memstr);
+ }
+ else {
+ s += sprintf(s, "Ve:%d | Fa:%d | Ob:%d-%d | La:%d%s",
+ stats->totvert, stats->totface, stats->totobj, stats->totobjsel, stats->totlamp, memstr);
+ }
+
+ if(ob)
+ sprintf(s, " | %s", ob->id.name+2);
+}
+
+void ED_info_stats_clear(Scene *scene)
+{
+ if(scene->stats) {
+ MEM_freeN(scene->stats);
+ scene->stats= NULL;
+ }
+}
+
+char *ED_info_stats_string(Scene *scene)
+{
+ if(!scene->stats)
+ stats_update(scene);
+ stats_string(scene);
+
+ return scene->stats->infostr;
+}
+
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index d72ecd60da9..d3f9c97205c 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -1,5 +1,5 @@
/**
- * $Id:
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -58,6 +58,7 @@
#include "UI_view2d.h"
#include "ED_markers.h"
+#include "ED_object.h"
#include "info_intern.h" // own include
@@ -84,9 +85,6 @@ static SpaceLink *info_new(const bContext *C)
BLI_addtail(&sinfo->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
- /* channel list region XXX */
-
-
return (SpaceLink *)sinfo;
}
@@ -118,40 +116,22 @@ 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)
{
- ListBase *keymap;
-
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
-
- /* own keymap */
- keymap= WM_keymap_listbase(wm, "info", SPACE_INFO, 0); /* XXX weak? */
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ ED_region_panels_init(wm, ar);
}
static void info_main_area_draw(const bContext *C, ARegion *ar)
{
- /* draw entirely, view changes should be handled here */
- // SpaceInfo *sinfo= (SpaceInfo*)CTX_wm_space_data(C);
- View2D *v2d= &ar->v2d;
- float col[3];
-
- /* clear and setup matrix */
- UI_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- UI_view2d_view_ortho(C, v2d);
-
- /* data... */
-
- /* reset view matrix */
- UI_view2d_view_restore(C);
-
- /* scrollers? */
+ ED_region_panels(C, ar, 1, NULL, -1);
}
void info_operatortypes(void)
{
-
+ WM_operatortype_append(FILE_OT_pack_all);
+ WM_operatortype_append(FILE_OT_unpack_all);
+ WM_operatortype_append(FILE_OT_make_paths_relative);
+ WM_operatortype_append(FILE_OT_make_paths_absolute);
+ WM_operatortype_append(FILE_OT_report_missing_files);
+ WM_operatortype_append(FILE_OT_find_missing_files);
}
void info_keymap(struct wmWindowManager *wm)
@@ -162,29 +142,12 @@ void info_keymap(struct wmWindowManager *wm)
/* add handlers, stuff you only do once or on area/region changes */
static void info_header_area_init(wmWindowManager *wm, ARegion *ar)
{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+ ED_region_header_init(ar);
}
static void info_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- info_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ ED_region_header(C, ar);
}
static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
@@ -204,6 +167,10 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn)
if(wmn->data==ND_RENDER_RESULT)
ED_region_tag_redraw(ar);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_INFO)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -229,7 +196,7 @@ void ED_spacetype_info(void)
art->init= info_main_area_init;
art->draw= info_main_area_draw;
art->listener= info_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index b082d5d6ae2..304c3601cdd 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -66,6 +66,7 @@
#include "logic_intern.h"
+#if 0
static void do_logic_panel_events(bContext *C, void *arg, int event)
{
@@ -79,7 +80,7 @@ static void do_logic_panel_events(bContext *C, void *arg, int event)
static void logic_panel_properties(const bContext *C, Panel *pa)
{
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
uiBlock *block;
block= uiLayoutFreeBlock(pa->layout);
@@ -89,17 +90,18 @@ static void logic_panel_properties(const bContext *C, Panel *pa)
static void logic_panel_view_properties(const bContext *C, Panel *pa)
{
- // SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+ // SpaceLogic *slogic= CTX_wm_space_logic(C);
uiBlock *block;
block= uiLayoutFreeBlock(pa->layout);
uiBlockSetHandleFunc(block, do_logic_panel_events, NULL);
}
-
+#endif
void logic_buttons_register(ARegionType *art)
{
+#if 0
PanelType *pt;
pt= MEM_callocN(sizeof(PanelType), "spacetype logic panel properties");
@@ -113,6 +115,7 @@ void logic_buttons_register(ARegionType *art)
strcpy(pt->label, "View Properties");
pt->draw= logic_panel_view_properties;
BLI_addtail(&art->paneltypes, pt);
+#endif
}
@@ -121,13 +124,9 @@ static int logic_properties(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= logic_has_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_logic/logic_header.c b/source/blender/editors/space_logic/logic_header.c
index d0e905728be..9444e3893d1 100644
--- a/source/blender/editors/space_logic/logic_header.c
+++ b/source/blender/editors/space_logic/logic_header.c
@@ -63,12 +63,12 @@
static void do_logic_buttons(bContext *C, void *arg, int event)
{
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
}
static uiBlock *logic_addmenu(bContext *C, ARegion *ar, void *arg_unused)
{
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
uiBlock *block;
short yco= 0, menuwidth=120;
@@ -87,7 +87,7 @@ static uiBlock *logic_addmenu(bContext *C, ARegion *ar, void *arg_unused)
void logic_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= CTX_wm_area(C);
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
uiBlock *block;
short xco, yco= 3;
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index 55e21561c34..dc8b111821d 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -28,6 +28,7 @@
#include <string.h>
#include <stdio.h>
+#include <float.h>
#include "DNA_actuator_types.h"
#include "DNA_controller_types.h"
@@ -38,6 +39,9 @@
#include "DNA_screen_types.h"
#include "DNA_sensor_types.h"
#include "DNA_sound_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_action_types.h"
#include "DNA_windowmanager_types.h"
#include "MEM_guardedalloc.h"
@@ -73,18 +77,10 @@
#include "logic_intern.h"
-
-/* XXX */
-static int pupmenu() {return 1;}
-/* XXX */
-
#define MAX_RENDER_PASS 100
#define B_REDR 1
#define B_IDNAME 2
-#define B_ADD_PROP 2701
-#define B_CHANGE_PROP 2702
-
#define B_ADD_SENS 2703
#define B_CHANGE_SENS 2704
#define B_DEL_SENS 2705
@@ -204,7 +200,7 @@ static void make_unique_prop_names_cb(bContext *C, void *strv, void *redraw_view
}
-static void sca_move_sensor(bContext *C, void *datav, void *data2_unused)
+static void sca_move_sensor(bContext *C, void *datav, void *move_up)
{
Scene *scene= CTX_data_scene(C);
bSensor *sens_to_delete= datav;
@@ -212,7 +208,8 @@ static void sca_move_sensor(bContext *C, void *datav, void *data2_unused)
Base *base;
bSensor *sens, *tmp;
- val= pupmenu("Move up%x1|Move down %x2");
+ // val= pupmenu("Move up%x1|Move down %x2");
+ val = move_up ? 1:2;
if(val>0) {
/* now find out which object has this ... */
@@ -255,7 +252,7 @@ static void sca_move_sensor(bContext *C, void *datav, void *data2_unused)
}
}
-static void sca_move_controller(bContext *C, void *datav, void *data2_unused)
+static void sca_move_controller(bContext *C, void *datav, void *move_up)
{
Scene *scene= CTX_data_scene(C);
bController *controller_to_del= datav;
@@ -263,7 +260,8 @@ static void sca_move_controller(bContext *C, void *datav, void *data2_unused)
Base *base;
bController *cont, *tmp;
- val= pupmenu("Move up%x1|Move down %x2");
+ //val= pupmenu("Move up%x1|Move down %x2");
+ val = move_up ? 1:2;
if(val>0) {
/* now find out which object has this ... */
@@ -309,7 +307,7 @@ static void sca_move_controller(bContext *C, void *datav, void *data2_unused)
}
}
-static void sca_move_actuator(bContext *C, void *datav, void *data2_unused)
+static void sca_move_actuator(bContext *C, void *datav, void *move_up)
{
Scene *scene= CTX_data_scene(C);
bActuator *actuator_to_move= datav;
@@ -317,7 +315,8 @@ static void sca_move_actuator(bContext *C, void *datav, void *data2_unused)
Base *base;
bActuator *act, *tmp;
- val= pupmenu("Move up%x1|Move down %x2");
+ //val= pupmenu("Move up%x1|Move down %x2");
+ val = move_up ? 1:2;
if(val>0) {
/* now find out which object has this ... */
@@ -363,7 +362,6 @@ static void sca_move_actuator(bContext *C, void *datav, void *data2_unused)
void do_logic_buts(bContext *C, void *arg, int event)
{
- bProperty *prop;
bSensor *sens;
bController *cont;
bActuator *act;
@@ -385,24 +383,6 @@ void do_logic_buts(bContext *C, void *arg, int event)
case B_SETMAINACTOR:
ob->gameflag &= ~(OB_SECTOR|OB_PROP);
break;
-
-
- case B_ADD_PROP:
- prop= new_property(PROP_FLOAT);
- make_unique_prop_names(C, prop->name);
- BLI_addtail(&ob->prop, prop);
- ED_undo_push(C, "Add property");
- break;
-
- case B_CHANGE_PROP:
- prop= ob->prop.first;
- while(prop) {
- if(prop->type!=prop->otype) {
- init_property(prop);
- }
- prop= prop->next;
- }
- break;
case B_ADD_SENS:
for(ob=G.main->object.first; ob; ob=ob->id.next) {
@@ -631,6 +611,8 @@ static char *sensor_name(int type)
return "Keyboard";
case SENS_PROPERTY:
return "Property";
+ case SENS_ARMATURE:
+ return "Armature";
case SENS_ACTUATOR:
return "Actuator";
case SENS_DELAY:
@@ -658,7 +640,7 @@ static char *sensor_pup(void)
/* the number needs to match defines in game.h */
return "Sensors %t|Always %x0|Delay %x13|Keyboard %x3|Mouse %x5|"
"Touch %x1|Collision %x6|Near %x2|Radar %x7|"
- "Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12";
+ "Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12|Armature %x14";
}
static char *controller_name(int type)
@@ -708,8 +690,6 @@ static char *actuator_name(int type)
return "Material";
case ACT_SOUND:
return "Sound";
- case ACT_CD:
- return "CD";
case ACT_PROPERTY:
return "Property";
case ACT_EDIT_OBJECT:
@@ -734,6 +714,8 @@ static char *actuator_name(int type)
return "Parent";
case ACT_STATE:
return "State";
+ case ACT_ARMATURE:
+ return "Armature";
}
return "unknown";
}
@@ -746,23 +728,23 @@ static char *actuator_pup(Object *owner)
switch (owner->type)
{
case OB_ARMATURE:
- return "Actuators %t|Action %x15|Motion %x0|Constraint %x9|Ipo %x1"
+ return "Actuators %t|Action %x15|Armature %x23|Motion %x0|Constraint %x9|Ipo %x1"
"|Camera %x3|Sound %x5|Property %x6|Edit Object %x10"
- "|Scene %x11|Random %x13|Message %x14|CD %x16|Game %x17"
+ "|Scene %x11|Random %x13|Message %x14|Game %x17"
"|Visibility %x18|2D Filter %x19|Parent %x20|State %x22";
break;
case OB_MESH:
return "Actuators %t|Shape Action %x21|Motion %x0|Constraint %x9|Ipo %x1"
"|Camera %x3|Sound %x5|Property %x6|Edit Object %x10"
- "|Scene %x11|Random %x13|Message %x14|CD %x16|Game %x17"
+ "|Scene %x11|Random %x13|Message %x14|Game %x17"
"|Visibility %x18|2D Filter %x19|Parent %x20|State %x22";
break;
default:
return "Actuators %t|Motion %x0|Constraint %x9|Ipo %x1"
"|Camera %x3|Sound %x5|Property %x6|Edit Object %x10"
- "|Scene %x11|Random %x13|Message %x14|CD %x16|Game %x17"
+ "|Scene %x11|Random %x13|Message %x14|Game %x17"
"|Visibility %x18|2D Filter %x19|Parent %x20|State %x22";
}
}
@@ -961,6 +943,7 @@ static int get_col_sensor(int type)
case SENS_NEAR: return TH_PANEL;
case SENS_KEYBOARD: return TH_PANEL;
case SENS_PROPERTY: return TH_PANEL;
+ case SENS_ARMATURE: return TH_PANEL;
case SENS_ACTUATOR: return TH_PANEL;
case SENS_MOUSE: return TH_PANEL;
case SENS_RADAR: return TH_PANEL;
@@ -990,6 +973,120 @@ static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
}
}
+static void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ id= CTX_data_main(C)->text.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ id= CTX_data_main(C)->action.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ id_us_plus(id);
+ *idpp= id;
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+
+static void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ id= CTX_data_main(C)->object.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_lib_extern(id); /* checks lib data, sets correct flag for saving then */
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+static void test_meshpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ if( *idpp ) (*idpp)->us--;
+
+ id= CTX_data_main(C)->mesh.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_us_plus(id);
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+static void test_matpoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ if( *idpp ) (*idpp)->us--;
+
+ id= CTX_data_main(C)->mat.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_us_plus(id);
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+static void test_scenepoin_but(struct bContext *C, char *name, ID **idpp)
+{
+ ID *id;
+
+ if( *idpp ) (*idpp)->us--;
+
+ id= CTX_data_main(C)->scene.first;
+ while(id) {
+ if( strcmp(name, id->name+2)==0 ) {
+ *idpp= id;
+ id_us_plus(id);
+ return;
+ }
+ id= id->next;
+ }
+ *idpp= NULL;
+}
+
+
+static void test_keyboard_event(struct bContext *C, void *arg_ks, void *arg_unused)
+{
+ bKeyboardSensor *ks= (bKeyboardSensor*)arg_ks;
+
+ if(!ISKEYBOARD(ks->key))
+ ks->key= 0;
+ if(!ISKEYBOARD(ks->qual))
+ ks->qual= 0;
+ if(!ISKEYBOARD(ks->qual2))
+ ks->qual2= 0;
+}
/**
* Draws a toggle for pulse mode, a frequency field and a toggle to invert
@@ -1004,6 +1101,7 @@ static void draw_default_sensor_header(bSensor *sens,
uiBut *but;
/* Pulsing and frequency */
+ uiBlockBeginAlign(block);
uiDefIconButBitS(block, TOG, SENS_PULSE_REPEAT, 1, ICON_DOTSUP,
(short)(x + 10 + 0. * (w-20)), (short)(y - 21), (short)(0.1 * (w-20)), 19,
&sens->pulse, 0.0, 0.0, 0, 0,
@@ -1017,8 +1115,10 @@ static void draw_default_sensor_header(bSensor *sens,
(short)(x + 10 + 0.2 * (w-20)), (short)(y - 21), (short)(0.275 * (w-20)), 19,
&sens->freq, 0.0, 10000.0, 0, 0,
"Delay between repeated pulses (in logic tics, 0 = no delay)");
+ uiBlockEndAlign(block);
/* value or shift? */
+ uiBlockBeginAlign(block);
but= uiDefButS(block, TOG, 1, "Level",
(short)(x + 10 + 0.5 * (w-20)), (short)(y - 21), (short)(0.20 * (w-20)), 19,
&sens->level, 0.0, 0.0, 0, 0,
@@ -1029,6 +1129,7 @@ static void draw_default_sensor_header(bSensor *sens,
&sens->tap, 0.0, 0.0, 0, 0,
"Trigger controllers only for an instant, even while the sensor remains true");
uiButSetFunc(but, verify_logicbutton_func, sens, &(sens->tap));
+ uiBlockEndAlign(block);
uiDefButS(block, TOG, 1, "Inv",
(short)(x + 10 + 0.85 * (w-20)), (short)(y - 21), (short)(0.15 * (w-20)), 19,
@@ -1036,12 +1137,51 @@ static void draw_default_sensor_header(bSensor *sens,
"Invert the level (output) of this sensor");
}
-static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short yco, short width,char* objectname)
+static void check_armature_bone_constraint(Object *ob, char *posechannel, char *constraint)
+{
+ /* check that bone exist in the active object */
+ if (ob->type == OB_ARMATURE && ob->pose) {
+ bPoseChannel *pchan;
+ bPose *pose = ob->pose;
+ for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
+ if (!strcmp(pchan->name, posechannel)) {
+ /* found it, now look for constraint channel */
+ bConstraint *con;
+ for (con=pchan->constraints.first; con; con=con->next) {
+ if (!strcmp(con->name, constraint)) {
+ /* found it, all ok */
+ return;
+ }
+ }
+ /* didn't find constraint, make empty */
+ constraint[0] = 0;
+ return;
+ }
+ }
+ }
+ /* didn't find any */
+ posechannel[0] = 0;
+ constraint[0] = 0;
+}
+
+static void check_armature_sensor(bContext *C, void *arg1_but, void *arg2_sens)
+{
+ bArmatureSensor *sens = arg2_sens;
+ uiBut *but = arg1_but;
+ Object *ob= CTX_data_active_object(C);
+
+ /* check that bone exist in the active object */
+ but->retval = B_REDR;
+ 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)
{
bNearSensor *ns = NULL;
bTouchSensor *ts = NULL;
bKeyboardSensor *ks = NULL;
bPropertySensor *ps = NULL;
+ bArmatureSensor *arm = NULL;
bMouseSensor *ms = NULL;
bCollisionSensor *cs = NULL;
bRadarSensor *rs = NULL;
@@ -1051,6 +1191,7 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
bJoystickSensor *joy = NULL;
bActuatorSensor *as = NULL;
bDelaySensor *ds = NULL;
+ uiBut *but;
short ysize;
char *str;
@@ -1199,12 +1340,15 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
if ((ks->type&1)==0) { /* is All Keys option off? */
/* line 2: hotkey and allkeys toggle */
- uiDefKeyevtButS(block, 0, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code");
+ but= uiDefKeyevtButS(block, 0, "", xco+40, yco-44, (width)/2, 19, &ks->key, "Key code");
+ uiButSetFunc(but, test_keyboard_event, ks, NULL);
/* line 3: two key modifyers (qual1, qual2) */
uiDefBut(block, LABEL, 0, "Hold", xco, yco-68, 40, 19, NULL, 0, 0, 0, 0, "");
- uiDefKeyevtButS(block, 0, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code");
- uiDefKeyevtButS(block, 0, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code");
+ but= uiDefKeyevtButS(block, 0, "", xco+40, yco-68, (width-50)/2, 19, &ks->qual, "Modifier key code");
+ uiButSetFunc(but, test_keyboard_event, ks, NULL);
+ but= uiDefKeyevtButS(block, 0, "", xco+40+(width-50)/2, yco-68, (width-50)/2, 19, &ks->qual2, "Second Modifier key code");
+ uiButSetFunc(but, test_keyboard_event, ks, NULL);
}
/* line 4: toggle property for string logging mode */
@@ -1263,6 +1407,45 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
yco-= ysize;
break;
}
+ case SENS_ARMATURE:
+ {
+ ysize= 70;
+
+ glRects(xco, yco-ysize, xco+width, yco);
+ uiEmboss((float)xco, (float)yco-ysize,
+ (float)xco+width, (float)yco, 1);
+
+ draw_default_sensor_header(sens, block, xco, yco, width);
+ arm= sens->data;
+
+ if (ob->type == OB_ARMATURE) {
+ uiBlockBeginAlign(block);
+ but = uiDefBut(block, TEX, 1, "Bone: ",
+ (xco+10), (yco-44), (width-20)/2, 19,
+ arm->posechannel, 0, 31, 0, 0,
+ "Bone on which you want to check a constraint");
+ uiButSetFunc(but, check_armature_sensor, but, arm);
+ but = uiDefBut(block, TEX, 1, "Cons: ",
+ (xco+10)+(width-20)/2, (yco-44), (width-20)/2, 19,
+ arm->constraint, 0, 31, 0, 0,
+ "Name of the constraint you want to control");
+ uiButSetFunc(but, check_armature_sensor, but, arm);
+ uiBlockEndAlign(block);
+
+ str= "Type %t|State changed %x0|Lin error below %x1|Lin error above %x2|Rot error below %x3|Rot error above %x4";
+
+ uiDefButI(block, MENU, B_REDR, str, xco+10,yco-66,0.4*(width-20), 19,
+ &arm->type, 0, 31, 0, 0, "Type");
+
+ if (arm->type != SENS_ARM_STATE_CHANGED)
+ {
+ uiDefButF(block, NUM, 1, "Value: ", xco+10+0.4*(width-20),yco-66,0.6*(width-20), 19,
+ &arm->value, -10000.0, 10000.0, 100, 0, "Test the error against this value");
+ }
+ }
+ yco-= ysize;
+ break;
+ }
case SENS_ACTUATOR:
{
ysize= 48;
@@ -1316,10 +1499,16 @@ static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short
* proper compatibility with older .blend files. */
str= "Type %t|Left button %x1|Middle button %x2|"
"Right button %x4|Wheel Up %x5|Wheel Down %x6|Movement %x8|Mouse over %x16|Mouse over any%x32";
- uiDefButS(block, MENU, B_REDR, str, xco+10, yco-44, width-20, 19,
+ uiDefButS(block, MENU, B_REDR, str, xco+10, yco-44, (width*0.8f)-20, 19,
&ms->type, 0, 31, 0, 0,
"Specify the type of event this mouse sensor should trigger on");
+ if(ms->type==32) {
+ uiDefButBitS(block, TOG, SENS_MOUSE_FOCUS_PULSE, B_REDR, "Pulse",(short)(xco + 10) + (width*0.8f)-20,(short)(yco - 44),
+ (short)(0.20 * (width-20)), 19, &ms->flag, 0.0, 0.0, 0, 0,
+ "Moving the mouse over a different object generates a pulse");
+ }
+
yco-= ysize;
break;
}
@@ -1549,7 +1738,7 @@ static short draw_controllerbuttons(bController *cont, uiBlock *block, short xco
uiBlockBeginAlign(block);
uiDefButI(block, MENU, B_REDR, "Execution Method%t|Script%x0|Module%x1", xco+4,yco-23, 66, 19, &pc->mode, 0, 0, 0, 0, "Python script type (textblock or module - faster)");
if(pc->mode==0)
- uiDefIDPoinBut(block, test_scriptpoin_but, ID_SCRIPT, 1, "", xco+70,yco-23,width-74, 19, &pc->text, "Blender textblock to run as a script");
+ uiDefIDPoinBut(block, test_scriptpoin_but, ID_TXT, 1, "", xco+70,yco-23,width-74, 19, &pc->text, "Blender textblock to run as a script");
else {
uiDefBut(block, TEX, 1, "", xco+70,yco-23,(width-70)-25, 19, pc->module, 0, 63, 0, 0, "Module name and function to run e.g. \"someModule.main\". Internal texts and external python files can be used");
uiDefButBitI(block, TOG, CONT_PY_DEBUG, B_REDR, "D", (xco+width)-25, yco-23, 19, 19, &pc->flag, 0, 0, 0, 0, "Continuously reload the module from disk for editing external modules without restarting");
@@ -1581,7 +1770,6 @@ static int get_col_actuator(int type)
case ACT_IPO: return TH_PANEL;
case ACT_PROPERTY: return TH_PANEL;
case ACT_SOUND: return TH_PANEL;
- case ACT_CD: return TH_PANEL;
case ACT_CAMERA: return TH_PANEL;
case ACT_EDIT_OBJECT: return TH_PANEL;
case ACT_GROUP: return TH_PANEL;
@@ -1592,6 +1780,7 @@ static int get_col_actuator(int type)
case ACT_VISIBILITY: return TH_PANEL;
case ACT_CONSTRAINT: return TH_PANEL;
case ACT_STATE: return TH_PANEL;
+ case ACT_ARMATURE: return TH_PANEL;
default: return TH_PANEL;
}
}
@@ -1662,7 +1851,8 @@ char *get_state_name(Object *ob, short bit)
static void check_state_mask(bContext *C, void *arg1_but, void *arg2_mask)
{
- int shift= 0; // XXX
+ wmWindow *win= CTX_wm_window(C);
+ int shift= win->eventstate->shift;
unsigned int *cont_mask = arg2_mask;
uiBut *but = arg1_but;
@@ -1671,10 +1861,21 @@ static void check_state_mask(bContext *C, void *arg1_but, void *arg2_mask)
but->retval = B_REDR;
}
+static void check_armature_actuator(bContext *C, void *arg1_but, void *arg2_act)
+{
+ bArmatureActuator *act = arg2_act;
+ uiBut *but = arg1_but;
+ Object *ob= CTX_data_active_object(C);
+
+ /* check that bone exist in the active object */
+ but->retval = B_REDR;
+ check_armature_bone_constraint(ob, act->posechannel, act->constraint);
+}
+
+
static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, short xco, short yco, short width)
{
bSoundActuator *sa = NULL;
- bCDActuator *cda = NULL;
bObjectActuator *oa = NULL;
bIpoActuator *ia = NULL;
bPropertyActuator *pa = NULL;
@@ -1691,6 +1892,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
bTwoDFilterActuator *tdfa = NULL;
bParentActuator *parAct = NULL;
bStateActuator *staAct = NULL;
+ bArmatureActuator *armAct = NULL;
float *fp;
short ysize = 0, wval;
@@ -1984,11 +2186,14 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
}
case ACT_SOUND:
{
- ysize = 70;
-
sa = act->data;
sa->sndnr = 0;
+ if(sa->flag & ACT_SND_3D_SOUND)
+ ysize = 180;
+ else
+ ysize = 92;
+
wval = (width-20)/2;
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
@@ -1998,59 +2203,37 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
/* reset this value, it is for handling the event */
sa->sndnr = 0;
uiDefButS(block, MENU, B_SOUNDACT_BROWSE, str, xco+10,yco-22,20,19, &(sa->sndnr), 0, 0, 0, 0, "");
+ uiDefButO(block, BUT, "sound.open", 0, "Load Sound", xco+wval+10, yco-22, wval, 19, "Load a sound file. Remember to set caching on for small sounds that are played often.");
if(sa->sound) {
char dummy_str[] = "Sound mode %t|Play Stop %x0|Play End %x1|Loop Stop %x2|Loop End %x3|Loop Ping Pong Stop %x5|Loop Ping Pong %x4";
- uiDefBut(block, TEX, B_IDNAME, "SO:",xco+30,yco-22,width-40,19, sa->sound->id.name+2, 0.0, 21.0, 0, 0, "");
+ uiDefBut(block, TEX, B_IDNAME, "SO:",xco+30,yco-22,wval-20,19, sa->sound->id.name+2, 0.0, 21.0, 0, 0, "");
uiDefButS(block, MENU, 1, dummy_str,xco+10,yco-44,width-20, 19, &sa->type, 0.0, 0.0, 0, 0, "");
- uiDefButF(block, NUM, 0, "Volume:", xco+10,yco-66,wval, 19, &sa->sound->volume, 0.0, 1.0, 0, 0, "Sets the volume of this sound");
- uiDefButF(block, NUM, 0, "Pitch:",xco+wval+10,yco-66,wval, 19, &sa->sound->pitch,-12.0, 12.0, 0, 0, "Sets the pitch of this sound");
+ uiDefButF(block, NUM, 0, "Volume:", xco+10,yco-66,wval, 19, &sa->volume, 0.0, 1.0, 0, 0, "Sets the volume of this sound");
+ uiDefButF(block, NUM, 0, "Pitch:",xco+wval+10,yco-66,wval, 19, &sa->pitch,-12.0, 12.0, 0, 0, "Sets the pitch of this sound");
+ uiDefButS(block, TOG | BIT, 0, "3D Sound", xco+10, yco-88, width-20, 19, &sa->flag, 0.0, 1.0, 0.0, 0.0, "Plays the sound positioned in 3D space.");
+ if(sa->flag & ACT_SND_3D_SOUND)
+ {
+ uiDefButF(block, NUM, 0, "Minimum Gain: ", xco+10, yco-110, wval, 19, &sa->sound3D.min_gain, 0.0, 1.0, 0.0, 0.0, "The minimum gain of the sound, no matter how far it is away.");
+ uiDefButF(block, NUM, 0, "Maximum Gain: ", xco+10, yco-132, wval, 19, &sa->sound3D.max_gain, 0.0, 1.0, 0.0, 0.0, "The maximum gain of the sound, no matter how near it is..");
+ uiDefButF(block, NUM, 0, "Reference Distance: ", xco+10, yco-154, wval, 19, &sa->sound3D.reference_distance, 0.0, FLT_MAX, 0.0, 0.0, "The reference distance is the distance where the sound has a gain of 1.0.");
+ uiDefButF(block, NUM, 0, "Maximum Distance: ", xco+10, yco-176, wval, 19, &sa->sound3D.max_distance, 0.0, FLT_MAX, 0.0, 0.0, "The maximum distance at which you can hear the sound.");
+ uiDefButF(block, NUM, 0, "Rolloff: ", xco+wval+10, yco-110, wval, 19, &sa->sound3D.rolloff_factor, 0.0, 5.0, 0.0, 0.0, "The rolloff factor defines the influence factor on volume depending on distance.");
+ uiDefButF(block, NUM, 0, "Cone Outer Gain: ", xco+wval+10, yco-132, wval, 19, &sa->sound3D.cone_outer_gain, 0.0, 1.0, 0.0, 0.0, "The gain outside the outer cone. The gain in the outer cone will be interpolated between this value und the normal gain in the inner cone.");
+ uiDefButF(block, NUM, 0, "Cone Outer Angle: ", xco+wval+10, yco-154, wval, 19, &sa->sound3D.cone_outer_angle, 0.0, 360.0, 0.0, 0.0, "The angle of the outer cone.");
+ 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);
}
else {
- uiDefBut(block, LABEL, 0, "Use Sound window (F10) to load samples", xco, yco-24, width, 19, NULL, 0, 0, 0, 0, "");
+ uiDefButO(block, BUT, "sound.open", 0, "Load Sound", xco+10, yco-22, width-20, 19, "Load a sound file.");
}
yco-= ysize;
break;
}
- case ACT_CD:
- {
- char cd_type_str[] = "Sound mode %t|Play all tracks %x0|Play one track %x1|"
- "Volume %x3|Stop %x4|Pause %x5|Resume %x6";
- cda = act->data;
-
- if (cda) {
- if (cda->track == 0) {
- cda->track = 1;
- cda->volume = 1;
- cda->type = ACT_CD_PLAY_ALL;
- }
-
- if (cda->type == ACT_CD_PLAY_TRACK || cda->type == ACT_CD_LOOP_TRACK) {
- ysize = 48;
- glRects(xco, yco-ysize, xco+width, yco);
- uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
- uiDefButS(block, NUM, 0, "Track:", xco+10,yco-44,width-20, 19, &cda->track, 1, 99, 0, 0, "Select the track to be played");
- }
- else if (cda->type == ACT_CD_VOLUME) {
- ysize = 48;
- glRects(xco, yco-ysize, xco+width, yco);
- uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
- uiDefButF(block, NUM, 0, "Volume:", xco+10,yco-44,width-20, 19, &cda->volume, 0, 1, 0, 0, "Set the volume for CD playback");
- }
- else {
- ysize = 28;
- glRects(xco, yco-ysize, xco+width, yco);
- uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
- }
- uiDefButS(block, MENU, B_REDR, cd_type_str,xco+10,yco-22,width-20, 19, &cda->type, 0.0, 0.0, 0, 0, "");
- }
- yco-= ysize;
- break;
- }
case ACT_CAMERA:
ysize= 48;
@@ -2134,7 +2317,10 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
- uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:", xco+40, yco-44, (width-80), 19, &(eoa->me), "replace the existing mesh with this one");
+ uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:", xco+40, yco-44, (width-80)/2, 19, &(eoa->me), "replace the existing, when left blank 'Phys' will remake the existing physics mesh");
+
+ uiDefButBitS(block, TOGN, ACT_EDOB_REPLACE_MESH_NOGFX, 0, "Gfx", xco+40 + (width-80)/2, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the display mesh");
+ uiDefButBitS(block, TOG, ACT_EDOB_REPLACE_MESH_PHYS, 0, "Phys", xco+40 + (width-80)/2 +(width-80)/4, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the physics mesh (triangle bounds only. compound shapes not supported)");
}
else if(eoa->type==ACT_EDOB_TRACK_TO) {
ysize= 48;
@@ -2734,6 +2920,48 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
yco-= ysize;
break;
+ case ACT_ARMATURE:
+ armAct = act->data;
+
+ if (ob->type == OB_ARMATURE) {
+ str= "Constraint %t|Run armature %x0|Enable %x1|Disable %x2|Set target %x3|Set weight %x4";
+ uiDefButI(block, MENU, B_REDR, str, xco+5, yco-24, (width-10)*0.35, 19, &armAct->type, 0.0, 0.0, 0, 0, "");
+
+ switch (armAct->type) {
+ case ACT_ARM_RUN:
+ ysize = 28;
+ break;
+ default:
+ uiBlockBeginAlign(block);
+ but = uiDefBut(block, TEX, 1, "Bone: ",
+ (xco+5), (yco-44), (width-10)/2, 19,
+ armAct->posechannel, 0, 31, 0, 0,
+ "Bone on which the constraint is defined");
+ uiButSetFunc(but, check_armature_actuator, but, armAct);
+ but = uiDefBut(block, TEX, 1, "Cons: ",
+ (xco+5)+(width-10)/2, (yco-44), (width-10)/2, 19,
+ armAct->constraint, 0, 31, 0, 0,
+ "Name of the constraint you want to controle");
+ uiButSetFunc(but, check_armature_actuator, but, armAct);
+ uiBlockEndAlign(block);
+ ysize = 48;
+ switch (armAct->type) {
+ case ACT_ARM_SETTARGET:
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "Target: ", xco+5, yco-64, (width-10), 19, &(armAct->target), "Set this object as the target of the constraint");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 1, "Secondary Target: ", xco+5, yco-84, (width-10), 19, &(armAct->subtarget), "Set this object as the secondary target of the constraint (only IK polar target at the moment)");
+ ysize += 40;
+ break;
+ case ACT_ARM_SETWEIGHT:
+ uiDefButF(block, NUM, B_REDR, "Weight:", xco+5+(width-10)*0.35,yco-24,(width-10)*0.65,19,&armAct->weight,0.0,1.0,0.0,0.0,"Set weight of this constraint");
+ break;
+ }
+ }
+ }
+ glRects(xco, yco-ysize, xco+width, yco);
+ uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
+ yco-= ysize;
+ break;
+
default:
ysize= 4;
@@ -2751,7 +2979,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh
static void do_sensor_menu(bContext *C, void *arg, int event)
{
- SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C);
+ SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
Object *ob;
bSensor *sens;
@@ -2800,7 +3028,7 @@ static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused)
static void do_controller_menu(bContext *C, void *arg, int event)
{
- SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C);
+ SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
Object *ob;
bController *cont;
@@ -2849,7 +3077,7 @@ static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused)
static void do_actuator_menu(bContext *C, void *arg, int event)
{
- SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C);
+ SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
Object *ob;
bActuator *act;
@@ -3011,7 +3239,7 @@ static int is_sensor_linked(uiBlock *block, bSensor *sens)
void logic_buttons(bContext *C, ARegion *ar)
{
- SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C);
+ SpaceLogic *slogic= CTX_wm_space_logic(C);
Object *ob= CTX_data_active_object(C);
ID **idar;
bSensor *sens;
@@ -3054,7 +3282,7 @@ void logic_buttons(bContext *C, ARegion *ar)
/* start with the controller because we need to know which one is visible */
/* ******************************* */
- xco= 500; yco= 170; width= 300;
+ xco= 400; yco= 170; width= 300;
uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco+35, 100, UI_UNIT_Y, "");
@@ -3163,9 +3391,17 @@ void logic_buttons(bContext *C, ARegion *ar)
cpack(0x999999);
glRecti(xco+22, yco, xco+width-22,yco+19);
but= uiDefBut(block, LABEL, 0, controller_name(cont->type), (short)(xco+22), yco, 70, UI_UNIT_Y, cont, 0, 0, 0, 0, "Controller type");
- uiButSetFunc(but, sca_move_controller, cont, NULL);
+ //uiButSetFunc(but, sca_move_controller, cont, NULL);
but= uiDefBut(block, LABEL, 0, cont->name,(short)(xco+92), yco,(short)(width-158), UI_UNIT_Y, cont, 0, 0, 0, 0, "Controller name");
- uiButSetFunc(but, sca_move_controller, cont, NULL);
+ //uiButSetFunc(but, sca_move_controller, cont, NULL);
+
+ uiBlockBeginAlign(block);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_UP, (short)(xco+width-(110+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up");
+ uiButSetFunc(but, sca_move_controller, cont, (void *)TRUE);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_DOWN, (short)(xco+width-(88+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down");
+ uiButSetFunc(but, sca_move_controller, cont, (void *)FALSE);
+ uiBlockEndAlign(block);
+
ycoo= yco;
}
@@ -3186,7 +3422,7 @@ void logic_buttons(bContext *C, ARegion *ar)
}
/* ******************************* */
- xco= 10; yco= 170; width= 400;
+ xco= 10; yco= 170; width= 300;
uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco+35, 70, UI_UNIT_Y, "");
@@ -3240,16 +3476,23 @@ 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(sens, block, xco, yco, width,ob->id.name);
+ yco= draw_sensorbuttons(ob, sens, block, xco, yco, width,ob->id.name);
if(yco-6 < ycoo) ycoo= (yco+ycoo-20)/2;
}
else {
set_col_sensor(sens->type, 1);
glRecti(xco+22, yco, xco+width-22,yco+19);
but= uiDefBut(block, LABEL, 0, sensor_name(sens->type), (short)(xco+22), yco, 80, UI_UNIT_Y, sens, 0, 0, 0, 0, "");
- uiButSetFunc(but, sca_move_sensor, sens, NULL);
+ //uiButSetFunc(but, sca_move_sensor, sens, NULL);
but= uiDefBut(block, LABEL, 0, sens->name, (short)(xco+102), yco, (short)(width-(pin?146:124)), UI_UNIT_Y, sens, 0, 31, 0, 0, "");
- uiButSetFunc(but, sca_move_sensor, sens, NULL);
+ //uiButSetFunc(but, sca_move_sensor, sens, NULL);
+
+ uiBlockBeginAlign(block);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_UP, (short)(xco+width-(66+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up");
+ uiButSetFunc(but, sca_move_sensor, sens, (void *)TRUE);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_DOWN, (short)(xco+width-(44+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down");
+ uiButSetFunc(but, sca_move_sensor, sens, (void *)FALSE);
+ uiBlockEndAlign(block);
}
but= uiDefIconBut(block, LINK, 0, ICON_LINK, (short)(xco+width), ycoo, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
@@ -3264,7 +3507,7 @@ void logic_buttons(bContext *C, ARegion *ar)
}
/* ******************************* */
- xco= 900; yco= 170; width= 400;
+ xco= 800; yco= 170; width= 300;
uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco+35, 90, UI_UNIT_Y, "");
@@ -3320,9 +3563,17 @@ void logic_buttons(bContext *C, ARegion *ar)
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");
- uiButSetFunc(but, sca_move_actuator, act, NULL);
+ // uiButSetFunc(but, 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");
- uiButSetFunc(but, sca_move_actuator, act, NULL);
+ // uiButSetFunc(but, sca_move_actuator, act, NULL);
+
+ uiBlockBeginAlign(block);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_UP, (short)(xco+width-(66+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick up");
+ uiButSetFunc(but, sca_move_actuator, act, (void *)TRUE);
+ but= uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_DOWN, (short)(xco+width-(44+5)), yco, 22, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Move this logic brick down");
+ uiButSetFunc(but, sca_move_actuator, act, (void *)FALSE);
+ uiBlockEndAlign(block);
+
ycoo= yco;
}
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index a593cfd1e7f..7043d625ab0 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -102,6 +102,13 @@ static SpaceLink *logic_new(const bContext *C)
slogic= MEM_callocN(sizeof(SpaceLogic), "initlogic");
slogic->spacetype= SPACE_LOGIC;
+ /* default options */
+ slogic->scaflag = (BUTS_SENS_SEL|BUTS_SENS_ACT|BUTS_SENS_LINK) |
+ (BUTS_CONT_SEL|BUTS_CONT_ACT|BUTS_CONT_LINK) |
+ (BUTS_ACT_SEL|BUTS_ACT_ACT|BUTS_ACT_LINK) |
+ (BUTS_SENS_STATE|BUTS_ACT_STATE);
+
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for logic");
@@ -142,7 +149,7 @@ static SpaceLink *logic_new(const bContext *C)
ar->v2d.maxzoom= 1.21f;
ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
- ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
+ ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
ar->v2d.keeptot= 0;
@@ -181,14 +188,14 @@ void logic_operatortypes(void)
void logic_keymap(struct wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Logic Generic", SPACE_LOGIC, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Logic Generic", SPACE_LOGIC, 0);
WM_keymap_add_item(keymap, "LOGIC_OT_properties", NKEY, KM_PRESS, 0, 0);
}
static void logic_refresh(const bContext *C, ScrArea *sa)
{
-// SpaceLogic *slogic= (SpaceImage*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
// Object *obedit= CTX_data_edit_object(C);
}
@@ -215,7 +222,7 @@ static void logic_listener(ARegion *ar, wmNotifier *wmn)
static int logic_context(const bContext *C, const char *member, bContextDataResult *result)
{
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
return 0;
@@ -227,19 +234,19 @@ static int logic_context(const bContext *C, const char *member, bContextDataResu
/* add handlers, stuff you only do once or on area/region changes */
static void logic_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymaps */
- keymap= WM_keymap_listbase(wm, "Logic Generic", SPACE_LOGIC, 0);
+ keymap= WM_keymap_find(wm, "Logic Generic", SPACE_LOGIC, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void logic_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
-// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C);
+// SpaceLogic *slogic= CTX_wm_space_logic(C);
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
float col[3];
@@ -269,17 +276,17 @@ static void logic_main_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
static void logic_buttons_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
- keymap= WM_keymap_listbase(wm, "Logic Generic", SPACE_LOGIC, 0);
+ keymap= WM_keymap_find(wm, "Logic Generic", SPACE_LOGIC, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void logic_buttons_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
/************************* header region **************************/
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
new file mode 100644
index 00000000000..a5ba63fd15d
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -0,0 +1,477 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation, Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+#include "BKE_action.h"
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+#include "BKE_global.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframing.h"
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h" // own include
+
+
+/* ******************* nla editor space & buttons ************** */
+
+#define B_NOP 1
+#define B_REDR 2
+
+/* -------------- */
+
+static void do_nla_region_buttons(bContext *C, void *arg, int event)
+{
+ //Scene *scene= CTX_data_scene(C);
+
+ switch(event) {
+
+ }
+
+ /* default for now */
+ WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_TRANSFORM, NULL);
+}
+
+static int nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_ptr, PointerRNA *strip_ptr)
+{
+ bAnimContext ac;
+ bAnimListElem *ale= NULL;
+ ListBase anim_data = {NULL, NULL};
+ short found=0;
+ int filter;
+
+ /* for now, only draw if we could init the anim-context info (necessary for all animation-related tools)
+ * to work correctly is able to be correctly retrieved. There's no point showing empty panels?
+ */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return 0;
+
+ /* extract list of active channel(s), of which we should only take the first one (expecting it to be an NLA track) */
+ filter= (ANIMFILTER_VISIBLE|ANIMFILTER_ACTIVE);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ // TODO: need some way to select active animdata too...
+ if (ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+
+ /* found it, now set the pointers */
+ if (adt_ptr) {
+ /* AnimData pointer */
+ RNA_pointer_create(ale->id, &RNA_AnimData, adt, adt_ptr);
+ }
+ if (nlt_ptr) {
+ /* NLA-Track pointer */
+ RNA_pointer_create(ale->id, &RNA_NlaTrack, nlt, nlt_ptr);
+ }
+ if (strip_ptr) {
+ /* NLA-Strip pointer */
+ NlaStrip *strip= BKE_nlastrip_find_active(nlt);
+ RNA_pointer_create(ale->id, &RNA_NlaStrip, strip, strip_ptr);
+ }
+
+ found= 1;
+ break;
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ return found;
+}
+
+#if 0
+static int nla_panel_poll(const bContext *C, PanelType *pt)
+{
+ return nla_panel_context(C, NULL, NULL);
+}
+#endif
+
+static int nla_animdata_panel_poll(const bContext *C, PanelType *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)
+{
+ PointerRNA ptr;
+ return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL));
+}
+
+static int nla_strip_panel_poll(const bContext *C, PanelType *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)
+{
+ PointerRNA ptr;
+ NlaStrip *strip;
+
+ if (!nla_panel_context(C, NULL, NULL, &ptr))
+ return 0;
+ if (ptr.data == NULL)
+ return 0;
+
+ strip= ptr.data;
+ return (strip->type == NLASTRIP_TYPE_CLIP);
+}
+
+/* -------------- */
+
+/* active AnimData */
+static void nla_panel_animdata (const bContext *C, Panel *pa)
+{
+ PointerRNA adt_ptr;
+ AnimData *adt;
+ uiLayout *layout= pa->layout;
+ uiLayout *row;
+ uiBlock *block;
+
+ /* check context and also validity of pointer */
+ if (!nla_panel_context(C, &adt_ptr, NULL, NULL))
+ return;
+ adt= adt_ptr.data;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ /* Active Action Properties ------------------------------------- */
+ /* action */
+ row= uiLayoutRow(layout, 1);
+ uiTemplateID(row, (bContext *)C, &adt_ptr, "action", NULL /*"ACT_OT_new"*/, NULL, NULL /*"ACT_OT_unlink"*/); // XXX: need to make these operators
+
+ /* extrapolation */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, 0, &adt_ptr, "action_extrapolation", 0);
+
+ /* blending */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, 0, &adt_ptr, "action_blending", 0);
+
+ /* influence */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, 0, &adt_ptr, "action_influence", 0);
+}
+
+/* active NLA-Track */
+static void nla_panel_track (const bContext *C, Panel *pa)
+{
+ PointerRNA nlt_ptr;
+ uiLayout *layout= pa->layout;
+ uiLayout *row;
+ uiBlock *block;
+
+ /* check context and also validity of pointer */
+ if (!nla_panel_context(C, NULL, &nlt_ptr, NULL))
+ return;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ /* Info - Active NLA-Context:Track ---------------------- */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, ICON_NLA, &nlt_ptr, "name", 0);
+}
+
+/* generic settings for active NLA-Strip */
+static void nla_panel_properties(const bContext *C, Panel *pa)
+{
+ PointerRNA strip_ptr;
+ uiLayout *layout= pa->layout;
+ uiLayout *column, *row, *subcol;
+ uiBlock *block;
+
+ if (!nla_panel_context(C, NULL, NULL, &strip_ptr))
+ return;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ /* Strip Properties ------------------------------------- */
+ /* strip type */
+ row= uiLayoutColumn(layout, 1);
+ uiItemR(row, NULL, ICON_NLA, &strip_ptr, "name", 0); // XXX icon?
+ uiItemR(row, NULL, 0, &strip_ptr, "type", 0);
+
+ /* strip extents */
+ column= uiLayoutColumn(layout, 1);
+ uiItemL(column, "Strip Extents:", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "start_frame", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "end_frame", 0);
+
+ /* extrapolation */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, 0, &strip_ptr, "extrapolation", 0);
+
+ /* blending */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, 0, &strip_ptr, "blending", 0);
+
+ /* 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, "animated_influence")==0);
+ uiItemR(column, NULL, 0, &strip_ptr, "auto_blending", 0); // XXX as toggle?
+
+ subcol= uiLayoutColumn(column, 1);
+ uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "auto_blending")==0);
+ uiItemR(subcol, NULL, 0, &strip_ptr, "blend_in", 0);
+ uiItemR(subcol, NULL, 0, &strip_ptr, "blend_out", 0);
+
+ /* settings */
+ column= uiLayoutColumn(layout, 1);
+ uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "animated_influence") || RNA_boolean_get(&strip_ptr, "animated_time")));
+ uiItemL(column, "Playback Settings:", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "muted", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "reversed", 0);
+}
+
+
+/* action-clip only settings for active NLA-Strip */
+static void nla_panel_actclip(const bContext *C, Panel *pa)
+{
+ PointerRNA strip_ptr;
+ uiLayout *layout= pa->layout;
+ uiLayout *column, *row;
+ uiBlock *block;
+
+ /* check context and also validity of pointer */
+ if (!nla_panel_context(C, NULL, NULL, &strip_ptr))
+ return;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ /* Strip Properties ------------------------------------- */
+ /* action pointer */
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, NULL, ICON_ACTION, &strip_ptr, "action", 0);
+
+ /* 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, "Start Frame", 0, &strip_ptr, "action_start_frame", 0);
+ uiItemR(column, "End Frame", 0, &strip_ptr, "action_end_frame", 0);
+
+ /* action usage */
+ column= uiLayoutColumn(layout, 1);
+ uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "animated_time")==0);
+ uiItemL(column, "Playback Settings:", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "scale", 0);
+ uiItemR(column, NULL, 0, &strip_ptr, "repeat", 0);
+}
+
+/* evaluation settings for active NLA-Strip */
+static void nla_panel_evaluation(const bContext *C, Panel *pa)
+{
+ PointerRNA strip_ptr;
+ uiLayout *layout= pa->layout;
+ uiLayout *column, *subcolumn;
+ uiBlock *block;
+
+ /* check context and also validity of pointer */
+ if (!nla_panel_context(C, NULL, NULL, &strip_ptr))
+ return;
+
+ block= uiLayoutGetBlock(layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ column= uiLayoutColumn(layout, 1);
+ uiItemR(column, NULL, 0, &strip_ptr, "animated_influence", 0);
+
+ subcolumn= uiLayoutColumn(column, 1);
+ uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "animated_influence"));
+ uiItemR(subcolumn, NULL, 0, &strip_ptr, "influence", 0);
+
+
+ column= uiLayoutColumn(layout, 1);
+ uiItemR(column, NULL, 0, &strip_ptr, "animated_time", 0);
+
+ subcolumn= uiLayoutColumn(column, 1);
+ uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "animated_time"));
+ uiItemR(subcolumn, NULL, 0, &strip_ptr, "strip_time", 0);
+}
+
+/* F-Modifiers for active NLA-Strip */
+static void nla_panel_modifiers(const bContext *C, Panel *pa)
+{
+ PointerRNA strip_ptr;
+ NlaStrip *strip;
+ FModifier *fcm;
+ uiLayout *col, *row;
+ uiBlock *block;
+
+ /* check context and also validity of pointer */
+ if (!nla_panel_context(C, NULL, NULL, &strip_ptr))
+ return;
+ strip= strip_ptr.data;
+
+ block= uiLayoutGetBlock(pa->layout);
+ uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
+
+ /* 'add modifier' button at top of panel */
+ {
+ row= uiLayoutRow(pa->layout, 0);
+ block= uiLayoutGetBlock(row);
+
+ // XXX for now, this will be a operator button which calls a temporary 'add modifier' operator
+ // FIXME: we need to set the only-active property so that this will only add modifiers for the active strip (not all selected)
+ uiDefButO(block, BUT, "NLA_OT_fmodifier_add", WM_OP_INVOKE_REGION_WIN, "Add Modifier", 10, 0, 150, 20, "Adds a new F-Modifier for the active NLA Strip");
+ }
+
+ /* draw each modifier */
+ for (fcm= strip->modifiers.first; fcm; fcm= fcm->next) {
+ col= uiLayoutColumn(pa->layout, 1);
+
+ ANIM_uiTemplate_fmodifier_draw(col, strip_ptr.id.data, &strip->modifiers, fcm);
+ }
+}
+
+/* ******************* general ******************************** */
+
+
+void nla_buttons_register(ARegionType *art)
+{
+ PanelType *pt;
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel animdata");
+ strcpy(pt->idname, "NLA_PT_animdata");
+ strcpy(pt->label, "Animation Data");
+ pt->draw= nla_panel_animdata;
+ pt->poll= nla_animdata_panel_poll;
+ pt->flag= PNL_DEFAULT_CLOSED;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel track");
+ strcpy(pt->idname, "NLA_PT_track");
+ strcpy(pt->label, "Active Track");
+ pt->draw= nla_panel_track;
+ pt->poll= nla_track_panel_poll;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel properties");
+ strcpy(pt->idname, "NLA_PT_properties");
+ strcpy(pt->label, "Active Strip");
+ pt->draw= nla_panel_properties;
+ pt->poll= nla_strip_panel_poll;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel properties");
+ strcpy(pt->idname, "NLA_PT_actionclip");
+ strcpy(pt->label, "Action Clip");
+ pt->draw= nla_panel_actclip;
+ pt->poll= nla_strip_actclip_panel_poll;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel evaluation");
+ strcpy(pt->idname, "NLA_PT_evaluation");
+ strcpy(pt->label, "Evaluation");
+ pt->draw= nla_panel_evaluation;
+ pt->poll= nla_strip_panel_poll;
+ BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel modifiers");
+ strcpy(pt->idname, "NLA_PT_modifiers");
+ strcpy(pt->label, "Modifiers");
+ pt->draw= nla_panel_modifiers;
+ pt->poll= nla_strip_panel_poll;
+ BLI_addtail(&art->paneltypes, pt);
+}
+
+static int nla_properties(bContext *C, wmOperator *op)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar= nla_has_buttons_region(sa);
+
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_properties(wmOperatorType *ot)
+{
+ ot->name= "Properties";
+ ot->idname= "NLA_OT_properties";
+
+ ot->exec= nla_properties;
+ ot->poll= ED_operator_nla_active;
+
+ /* flags */
+ ot->flag= 0;
+}
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
new file mode 100644
index 00000000000..ccf23266427
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -0,0 +1,457 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframes_edit.h"
+#include "ED_markers.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h" // own include
+
+/* *********************************************** */
+/* Operators for NLA channels-list which need to be different from the standard Animation Editor ones */
+
+/* ******************** Mouse-Click Operator *********************** */
+/* Depending on the channel that was clicked on, the mouse click will activate whichever
+ * part of the channel is relevant.
+ *
+ * NOTE: eventually, this should probably be phased out when many of these things are replaced with buttons
+ * --> Most channels are now selection only...
+ */
+
+static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, short selectmode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ View2D *v2d= &ac->ar->v2d;
+ int notifierFlags = 0;
+
+ /* get the channel that was clicked on */
+ /* filter channels */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
+ filter= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* get channel from index */
+ ale= BLI_findlink(&anim_data, channel_index);
+ if (ale == NULL) {
+ /* channel not found */
+ printf("Error: animation channel (index = %d) not found in mouse_anim_channels() \n", channel_index);
+
+ BLI_freelistN(&anim_data);
+ return 0;
+ }
+
+ /* action to take depends on what channel we've got */
+ switch (ale->type) {
+ case ANIMTYPE_SCENE:
+ {
+ Scene *sce= (Scene *)ale->data;
+
+ /* set selection status */
+ if (selectmode == SELECT_INVERT) {
+ /* swap select */
+ sce->flag ^= SCE_DS_SELECTED;
+ }
+ else {
+ sce->flag |= SCE_DS_SELECTED;
+ }
+
+ notifierFlags |= ND_ANIMCHAN_SELECT;
+ }
+ break;
+ case ANIMTYPE_OBJECT:
+ {
+ bDopeSheet *ads= (bDopeSheet *)ac->data;
+ Scene *sce= (Scene *)ads->source;
+ Base *base= (Base *)ale->data;
+ Object *ob= base->object;
+
+ if (nlaedit_is_tweakmode_on(ac) == 0) {
+ /* set selection status */
+ if (selectmode == SELECT_INVERT) {
+ /* swap select */
+ base->flag ^= SELECT;
+ ob->flag= base->flag;
+ }
+ else {
+ Base *b;
+
+ /* deleselect all */
+ for (b= sce->base.first; b; b= b->next) {
+ b->flag &= ~SELECT;
+ b->object->flag= b->flag;
+ }
+
+ /* select object now */
+ base->flag |= SELECT;
+ ob->flag |= SELECT;
+ }
+
+ /* xxx should be ED_base_object_activate(), but we need context pointer for that... */
+ //set_active_base(base);
+
+ /* notifiers - channel was selected */
+ notifierFlags |= ND_ANIMCHAN_SELECT;
+ }
+ }
+ break;
+
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ short offset;
+
+ /* offset for start of channel (on LHS of channel-list) */
+ if (ale->id) {
+ /* special exception for materials and particles */
+ if (ELEM(GS(ale->id->name),ID_MA,ID_PA))
+ offset= 21 + NLACHANNEL_BUTTON_WIDTH;
+ else
+ offset= 14;
+ }
+ else
+ offset= 0;
+
+ if (x >= (v2d->cur.xmax-NLACHANNEL_BUTTON_WIDTH)) {
+ /* toggle protection (only if there's a toggle there) */
+ nlt->flag ^= NLATRACK_PROTECTED;
+
+ /* notifier flags - channel was edited */
+ notifierFlags |= ND_ANIMCHAN_EDIT;
+ }
+ else if (x >= (v2d->cur.xmax-2*NLACHANNEL_BUTTON_WIDTH)) {
+ /* toggle mute */
+ nlt->flag ^= NLATRACK_MUTED;
+
+ /* notifier flags - channel was edited */
+ notifierFlags |= ND_ANIMCHAN_EDIT;
+ }
+ else if (x <= ((NLACHANNEL_BUTTON_WIDTH*2)+offset)) {
+ /* toggle 'solo' */
+ BKE_nlatrack_solo_toggle(adt, nlt);
+
+ /* notifier flags - channel was edited */
+ notifierFlags |= ND_ANIMCHAN_EDIT;
+ }
+ else if (nlaedit_is_tweakmode_on(ac) == 0) {
+ /* set selection */
+ if (selectmode == SELECT_INVERT) {
+ /* inverse selection status of this F-Curve only */
+ nlt->flag ^= NLATRACK_SELECTED;
+ }
+ else {
+ /* select F-Curve by itself */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ nlt->flag |= NLATRACK_SELECTED;
+ }
+
+ /* if NLA-Track is selected now, make NLA-Track the 'active' one in the visible list */
+ if (nlt->flag & NLATRACK_SELECTED)
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nlt, ANIMTYPE_NLATRACK);
+
+ /* notifier flags - channel was selected */
+ notifierFlags |= ND_ANIMCHAN_SELECT;
+ }
+ }
+ break;
+ case ANIMTYPE_NLAACTION:
+ {
+ AnimData *adt= BKE_animdata_from_id(ale->owner); /* this won't crash, right? */
+
+ if (x >= (v2d->cur.xmax-NLACHANNEL_BUTTON_WIDTH)) {
+ if (nlaedit_is_tweakmode_on(ac) == 0) {
+ /* 'push-down' action - only usable when not in TweakMode */
+ // TODO: make this use the operator instead of calling the function directly
+ // however, calling the operator requires that we supply the args, and that works with proper buttons only
+ BKE_nla_action_pushdown(adt);
+ }
+ else {
+ /* when in tweakmode, this button becomes the toggle for mapped editing */
+ adt->flag ^= ADT_NLA_EDIT_NOMAP;
+ }
+
+ /* changes to NLA-Action occurred */
+ notifierFlags |= ND_NLA_ACTCHANGE;
+ }
+ }
+ break;
+
+ default:
+ printf("Error: Invalid channel type in mouse_nla_channels() \n");
+ }
+
+ /* free channels */
+ BLI_freelistN(&anim_data);
+
+ /* return the notifier-flags set */
+ return notifierFlags;
+}
+
+/* ------------------- */
+
+/* handle clicking */
+static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ bAnimContext ac;
+ Scene *scene;
+ ARegion *ar;
+ View2D *v2d;
+ int mval[2], channel_index;
+ int notifierFlags = 0;
+ short selectmode;
+ float x, y;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get useful pointers from animation context data */
+ scene= ac.scene;
+ ar= ac.ar;
+ v2d= &ar->v2d;
+
+ /* get mouse coordinates (in region coordinates) */
+ mval[0]= (event->x - ar->winrct.xmin);
+ mval[1]= (event->y - ar->winrct.ymin);
+
+ /* select mode is either replace (deselect all, then add) or add/extend */
+ if (RNA_boolean_get(op->ptr, "extend"))
+ selectmode= SELECT_INVERT;
+ else
+ selectmode= SELECT_REPLACE;
+
+ /* figure out which channel user clicked in
+ * Note: although channels technically start at y= NLACHANNEL_FIRST, we need to adjust by half a channel's height
+ * so that the tops of channels get caught ok. Since NLACHANNEL_FIRST is really NLACHANNEL_HEIGHT, we simply use
+ * NLACHANNEL_HEIGHT_HALF.
+ */
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
+ UI_view2d_listview_view_to_cell(v2d, NLACHANNEL_NAMEWIDTH, NLACHANNEL_STEP, 0, (float)NLACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+
+ /* handle mouse-click in the relevant channel then */
+ notifierFlags= mouse_nla_channels(&ac, x, channel_index, selectmode);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|notifierFlags, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_channels_click (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Mouse Click on Channels";
+ ot->idname= "NLA_OT_channels_click";
+
+ /* api callbacks */
+ ot->invoke= nlachannels_mouseclick_invoke;
+ ot->poll= ED_operator_nla_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
+}
+
+/* *********************************************** */
+/* Special Operators */
+
+/* ******************** Add Tracks Operator ***************************** */
+/* Add NLA Tracks to the same AnimData block as a selected track, or above the selected tracks */
+
+static int nlaedit_add_tracks_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ AnimData *lastAdt = NULL;
+ short above_sel= RNA_boolean_get(op->ptr, "above_selected");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the AnimData blocks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_SEL);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* add tracks... */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+
+ /* check if just adding a new track above this one,
+ * or whether we're adding a new one to the top of the stack that this one belongs to
+ */
+ if (above_sel) {
+ /* just add a new one above this one */
+ add_nlatrack(adt, nlt);
+ }
+ else if ((lastAdt == NULL) || (adt != lastAdt)) {
+ /* add one track to the top of the owning AnimData's stack, then don't add anymore to this stack */
+ add_nlatrack(adt, NULL);
+ lastAdt= adt;
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_add_tracks (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Track(s)";
+ ot->idname= "NLA_OT_add_tracks";
+ ot->description= "Add NLA-Tracks above/after the selected tracks.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_add_tracks_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "above_selected", 0, "Above Selected", "Add a new NLA Track above every existing selected one.");
+}
+
+/* ******************** Delete Tracks Operator ***************************** */
+/* Delete selected NLA Tracks */
+
+static int nlaedit_delete_tracks_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 AnimData blocks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_SEL);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* delete tracks */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+
+ /* call delete on this track - deletes all strips too */
+ free_nlatrack(&adt->nla_tracks, nlt);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_delete_tracks (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Tracks";
+ ot->idname= "NLA_OT_delete_tracks";
+ ot->description= "Delete selected NLA-Tracks and the strips they contain.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_delete_tracks_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
new file mode 100644
index 00000000000..b21f37ab678
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -0,0 +1,909 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <float.h>
+
+#include "DNA_listBase.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_windowmanager_types.h"
+#include "DNA_world_types.h"
+#include "DNA_vec_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+#include "BLI_dlrbTree.h"
+
+#include "BKE_animsys.h"
+#include "BKE_fcurve.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframes_draw.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_interface_icons.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "ED_markers.h"
+
+#include "nla_intern.h" // own include
+
+/* XXX */
+extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
+extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
+
+/* *********************************************** */
+/* Strips */
+
+/* Action-Line ---------------------- */
+
+/* get colors for drawing Action-Line
+ * NOTE: color returned includes fine-tuned alpha!
+ */
+static void nla_action_get_color (AnimData *adt, bAction *act, float color[4])
+{
+ // TODO: if tweaking some action, use the same color as for the tweaked track (quick hack done for now)
+ if (adt && (adt->flag & ADT_NLA_EDIT_ON)) {
+ // greenish color (same as tweaking strip) - hardcoded for now
+ color[0]= 0.30f;
+ color[1]= 0.95f;
+ color[2]= 0.10f;
+ color[3]= 0.30f;
+ }
+ else {
+ if (act) {
+ // reddish color - hardcoded for now
+ color[0]= 0.8f;
+ color[1]= 0.2f;
+ color[2]= 0.0f;
+ color[3]= 0.4f;
+ }
+ else {
+ // greyish-red color - hardcoded for now
+ color[0]= 0.6f;
+ color[1]= 0.5f;
+ color[2]= 0.5f;
+ color[3]= 0.3f;
+ }
+ }
+}
+
+/* draw the keyframes in the specified Action */
+static void nla_action_draw_keyframes (AnimData *adt, bAction *act, View2D *v2d, float y, float ymin, float ymax)
+{
+ DLRBT_Tree keys;
+ ActKeyColumn *ak;
+ float xscale, f1, f2;
+ float color[4];
+
+ /* get a list of the keyframes with NLA-scaling applied */
+ BLI_dlrbTree_init(&keys);
+ action_to_keylist(adt, act, &keys, NULL);
+ BLI_dlrbTree_linkedlist_sync(&keys);
+
+ if ELEM(NULL, act, keys.first)
+ return;
+
+ /* draw a darkened region behind the strips
+ * - get and reset the background color, this time without the alpha to stand out better
+ */
+ nla_action_get_color(adt, act, color);
+ glColor3fv(color);
+ /* - draw a rect from the first to the last frame (no extra overlaps for now)
+ * that is slightly stumpier than the track background (hardcoded 2-units here)
+ */
+ f1= ((ActKeyColumn *)keys.first)->cfra;
+ f2= ((ActKeyColumn *)keys.last)->cfra;
+
+ glRectf(f1, ymin+2, f2, ymax-2);
+
+
+ /* get View2D scaling factor */
+ UI_view2d_getscale(v2d, &xscale, NULL);
+
+ /* for now, color is hardcoded to be black */
+ glColor3f(0.0f, 0.0f, 0.0f);
+
+ /* just draw each keyframe as a simple dot (regardless of the selection status)
+ * - 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);
+
+ /* free icons */
+ BLI_dlrbTree_free(&keys);
+}
+
+/* Strips (Proper) ---------------------- */
+
+/* get colors for drawing NLA-Strips */
+static void nla_strip_get_color_inside (AnimData *adt, NlaStrip *strip, float color[3])
+{
+ if (strip->type == NLASTRIP_TYPE_TRANSITION) {
+ /* Transition Clip */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* selected - use a bright blue color */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.18f;
+ color[1]= 0.46f;
+ color[2]= 0.86f;
+ }
+ else {
+ /* normal, unselected strip - use (hardly noticable) blue tinge */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.11f;
+ color[1]= 0.15f;
+ color[2]= 0.19f;
+ }
+ }
+ else if (strip->type == NLASTRIP_TYPE_META) {
+ /* Meta Clip */
+ // TODO: should temporary metas get different colours too?
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* selected - use a bold purple color */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.41f;
+ color[1]= 0.13f;
+ color[2]= 0.59f;
+ }
+ else {
+ /* normal, unselected strip - use (hardly noticable) dark purple tinge */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.20f;
+ color[1]= 0.15f;
+ color[2]= 0.26f;
+ }
+ }
+ else {
+ /* Action Clip (default/normal type of strip) */
+ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) && (adt && (adt->flag & ADT_NLA_EDIT_ON))) {
+ /* active strip should be drawn green when it is acting as the tweaking strip.
+ * however, this case should be skipped for when not in EditMode...
+ */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.3f;
+ color[1]= 0.95f;
+ color[2]= 0.1f;
+ }
+ else if (strip->flag & NLASTRIP_FLAG_TWEAKUSER) {
+ /* alert user that this strip is also used by the tweaking track (this is set when going into
+ * 'editmode' for that strip), since the edits made here may not be what the user anticipated
+ */
+ // FIXME: hardcoded temp-hack colors
+ color[0]= 0.85f;
+ color[1]= 0.0f;
+ color[2]= 0.0f;
+ }
+ else if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* selected strip - use theme color for selected */
+ UI_GetThemeColor3fv(TH_STRIP_SELECT, color);
+ }
+ else {
+ /* normal, unselected strip - use standard strip theme color */
+ UI_GetThemeColor3fv(TH_STRIP, color);
+ }
+ }
+}
+
+/* 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)
+{
+ const float yheight = ymaxc - yminc;
+
+ /* drawing color is simply a light-grey */
+ // TODO: is this color suitable?
+ // XXX nasty hacked color for now... which looks quite bad too...
+ glColor3f(0.7f, 0.7f, 0.7f);
+
+ /* draw with AA'd line */
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+
+ /* influence -------------------------- */
+ if (strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) {
+ FCurve *fcu= list_find_fcurve(&strip->fcurves, "influence", 0);
+ float cfra;
+
+ /* plot the curve (over the strip's main region) */
+ glBegin(GL_LINE_STRIP);
+ /* sample at 1 frame intervals, and draw
+ * - min y-val is yminc, max is y-maxc, so clamp in those regions
+ */
+ for (cfra= strip->start; cfra <= strip->end; cfra += 1.0f) {
+ float y= evaluate_fcurve(fcu, cfra); // assume this to be in 0-1 range
+ glVertex2f(cfra, ((y*yheight)+yminc));
+ }
+ glEnd(); // GL_LINE_STRIP
+ }
+ else {
+ /* use blend in/out values only if both aren't zero */
+ if ((IS_EQ(strip->blendin, 0.0f) && IS_EQ(strip->blendout, 0.0f))==0) {
+ glBegin(GL_LINE_STRIP);
+ /* start of strip - if no blendin, start straight at 1, otherwise from 0 to 1 over blendin frames */
+ if (IS_EQ(strip->blendin, 0.0f) == 0) {
+ glVertex2f(strip->start, yminc);
+ glVertex2f(strip->start + strip->blendin, ymaxc);
+ }
+ else
+ glVertex2f(strip->start, ymaxc);
+
+ /* end of strip */
+ if (IS_EQ(strip->blendout, 0.0f) == 0) {
+ glVertex2f(strip->end - strip->blendout, ymaxc);
+ glVertex2f(strip->end, yminc);
+ }
+ else
+ glVertex2f(strip->end, ymaxc);
+ glEnd(); // GL_LINE_STRIP
+ }
+ }
+
+ /* time -------------------------- */
+ // XXX do we want to draw this curve? in a different colour too?
+
+ /* turn off AA'd lines */
+ glDisable(GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
+}
+
+/* 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)
+{
+ float color[3];
+
+ /* get color of strip */
+ nla_strip_get_color_inside(adt, strip, color);
+
+ /* draw extrapolation info first (as backdrop) */
+ if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) {
+ /* enable transparency... */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ switch (strip->extendmode) {
+ /* since this does both sides, only do the 'before' side, and leave the rest to the next case */
+ case NLASTRIP_EXTEND_HOLD:
+ /* only need to draw here if there's no strip before since
+ * it only applies in such a situation
+ */
+ if (strip->prev == NULL) {
+ /* set the drawing color to the color of the strip, but with very faint alpha */
+ glColor4f(color[0], color[1], color[2], 0.15f);
+
+ /* draw the rect to the edge of the screen */
+ glBegin(GL_QUADS);
+ glVertex2f(v2d->cur.xmin, yminc);
+ glVertex2f(v2d->cur.xmin, ymaxc);
+ glVertex2f(strip->start, ymaxc);
+ glVertex2f(strip->start, yminc);
+ glEnd();
+ }
+ /* no break needed... */
+
+ /* this only draws after the strip */
+ case NLASTRIP_EXTEND_HOLD_FORWARD:
+ /* only need to try and draw if the next strip doesn't occur immediately after */
+ if ((strip->next == NULL) || (IS_EQ(strip->next->start, strip->end)==0)) {
+ /* set the drawing color to the color of the strip, but this time less faint */
+ glColor4f(color[0], color[1], color[2], 0.3f);
+
+ /* draw the rect to the next strip or the edge of the screen */
+ glBegin(GL_QUADS);
+ glVertex2f(strip->end, yminc);
+ glVertex2f(strip->end, ymaxc);
+
+ if (strip->next) {
+ glVertex2f(strip->next->start, ymaxc);
+ glVertex2f(strip->next->start, yminc);
+ }
+ else {
+ glVertex2f(v2d->cur.xmax, ymaxc);
+ glVertex2f(v2d->cur.xmax, yminc);
+ }
+ glEnd();
+ }
+ break;
+ }
+
+ glDisable(GL_BLEND);
+ }
+
+ /* draw 'inside' of strip itself */
+ glColor3fv(color);
+ uiSetRoundBox(15); /* all corners rounded */
+ gl_round_box_shade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1);
+
+
+ /* draw strip's control 'curves'
+ * - only if user hasn't hidden them...
+ */
+ if ((snla->flag & SNLA_NOSTRIPCURVES) == 0)
+ nla_draw_strip_curves(strip, v2d, yminc, ymaxc);
+
+ /* draw strip outline
+ * - color used here is to indicate active vs non-active
+ */
+ if (strip->flag & NLASTRIP_FLAG_ACTIVE) {
+ /* strip should appear 'sunken', so draw a light border around it */
+ glColor3f(0.9f, 1.0f, 0.9f); // FIXME: hardcoded temp-hack colors
+ }
+ else {
+ /* strip should appear to stand out, so draw a dark border around it */
+ glColor3f(0.0f, 0.0f, 0.0f);
+ }
+
+ /* - line style: dotted for muted */
+ if (strip->flag & NLASTRIP_FLAG_MUTED)
+ setlinestyle(4);
+
+ /* draw outline */
+ gl_round_box_shade(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1);
+
+ /* if action-clip strip, draw lines delimiting repeats too (in the same color as outline) */
+ if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQ(strip->repeat, 1.0f)==0) {
+ float repeatLen = (strip->actend - strip->actstart) * strip->scale;
+ int i;
+
+ /* only draw lines for whole-numbered repeats, starting from the first full-repeat
+ * up to the last full repeat (but not if it lies on the end of the strip)
+ */
+ for (i = 1; i < strip->repeat; i++) {
+ float repeatPos = strip->start + (repeatLen * i);
+
+ /* don't draw if line would end up on or after the end of the strip */
+ if (repeatPos < strip->end)
+ fdrawline(repeatPos, yminc+4, repeatPos, ymaxc-4);
+ }
+ }
+ /* or if meta-strip, draw lines delimiting extents of sub-strips (in same color as outline, if more than 1 exists) */
+ else if ((strip->type == NLASTRIP_TYPE_META) && (strip->strips.first != strip->strips.last)) {
+ NlaStrip *cs;
+ float y= (ymaxc-yminc)/2.0f + yminc;
+
+ /* only draw first-level of child-strips, but don't draw any lines on the endpoints */
+ for (cs= strip->strips.first; cs; cs= cs->next) {
+ /* draw start-line if not same as end of previous (and only if not the first strip)
+ * - on upper half of strip
+ */
+ if ((cs->prev) && IS_EQ(cs->prev->end, cs->start)==0)
+ fdrawline(cs->start, y, cs->start, ymaxc);
+
+ /* draw end-line if not the last strip
+ * - on lower half of strip
+ */
+ if (cs->next)
+ fdrawline(cs->end, yminc, cs->end, y);
+ }
+ }
+
+ /* reset linestyle */
+ setlinestyle(0);
+}
+
+/* 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)
+{
+ char str[256], dir[3];
+ rctf rect;
+
+ /* 'dir' - direction that strip is played in */
+ if (strip->flag & NLASTRIP_FLAG_REVERSE)
+ sprintf(dir, "<-");
+ else
+ sprintf(dir, "->");
+
+ /* just print the name and the range */
+ if (strip->flag & NLASTRIP_FLAG_TEMP_META)
+ sprintf(str, "Temp-Meta | %.2f %s %.2f", strip->start, dir, strip->end);
+ 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 bounding-box for text
+ * - padding of 2 'units' on either side
+ */
+ // TODO: make this centered?
+ rect.xmin= strip->start + 0.5f;
+ rect.ymin= yminc;
+ rect.xmax= strip->end - 0.5f;
+ rect.ymax= ymaxc;
+
+ /* add this string to the cache of texts to draw*/
+ UI_view2d_text_cache_rectf(v2d, &rect, str);
+}
+
+/* ---------------------- */
+
+void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ View2D *v2d= &ar->v2d;
+ float y= 0.0f;
+ int items, height;
+
+ /* build list of channels to draw */
+ filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
+ items= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* Update max-extent of channels here (taking into account scrollers):
+ * - this is done to allow the channel list to be scrollable, but must be done here
+ * to avoid regenerating the list again and/or also because channels list is drawn first
+ * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for
+ * start of list offset, and the second is as a correction for the scrollers.
+ */
+ height= ((items*NLACHANNEL_STEP) + (NLACHANNEL_HEIGHT*2));
+ /* don't use totrect set, as the width stays the same
+ * (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);
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ const float yminc= (float)(y - NLACHANNEL_HEIGHT_HALF);
+ const float ymaxc= (float)(y + NLACHANNEL_HEIGHT_HALF);
+
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* data to draw depends on the type of channel */
+ switch (ale->type) {
+ case ANIMTYPE_NLATRACK:
+ {
+ AnimData *adt= ale->adt;
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+ int index;
+
+ /* draw each strip in the track (if visible) */
+ for (strip=nlt->strips.first, index=1; strip; strip=strip->next, index++) {
+ if (BKE_nlastrip_within_bounds(strip, v2d->cur.xmin, v2d->cur.xmax)) {
+ /* draw the visualisation of the strip */
+ nla_draw_strip(snla, adt, nlt, strip, v2d, yminc, ymaxc);
+
+ /* add the text for this strip to the cache */
+ nla_draw_strip_text(nlt, strip, index, v2d, yminc, ymaxc);
+ }
+ }
+ }
+ break;
+
+ case ANIMTYPE_NLAACTION:
+ {
+ AnimData *adt= ale->adt;
+ float color[4];
+
+ /* just draw a semi-shaded rect spanning the width of the viewable area if there's data,
+ * and a second darker rect within which we draw keyframe indicator dots if there's data
+ */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ /* get colors for drawing */
+ nla_action_get_color(adt, ale->data, color);
+ glColor4fv(color);
+
+ /* draw slightly shifted up for greater separation from standard channels,
+ * but also slightly shorter for some more contrast when viewing the strips
+ */
+ glRectf(v2d->cur.xmin, yminc+NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc-NLACHANNEL_SKIP);
+
+ /* draw keyframes in the action */
+ nla_action_draw_keyframes(adt, ale->data, v2d, y, yminc+NLACHANNEL_SKIP, ymaxc-NLACHANNEL_SKIP);
+
+ /* draw 'embossed' lines above and below the strip for effect */
+ /* white base-lines */
+ glLineWidth(2.0f);
+ glColor4f(1.0f, 1.0f, 1.0f, 0.3);
+ fdrawline(v2d->cur.xmin, yminc+NLACHANNEL_SKIP, v2d->cur.xmax, yminc+NLACHANNEL_SKIP);
+ fdrawline(v2d->cur.xmin, ymaxc-NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc-NLACHANNEL_SKIP);
+
+ /* black top-lines */
+ glLineWidth(1.0f);
+ glColor3f(0.0f, 0.0f, 0.0f);
+ fdrawline(v2d->cur.xmin, yminc+NLACHANNEL_SKIP, v2d->cur.xmax, yminc+NLACHANNEL_SKIP);
+ fdrawline(v2d->cur.xmin, ymaxc-NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc-NLACHANNEL_SKIP);
+
+ glDisable(GL_BLEND);
+ }
+ break;
+ }
+ }
+
+ /* adjust y-position for next one */
+ y -= NLACHANNEL_STEP;
+ }
+
+ /* free tempolary channels */
+ BLI_freelistN(&anim_data);
+}
+
+/* *********************************************** */
+/* Channel List */
+
+/* old code for drawing NLA channels using GL only */
+// TODO: depreceate this code...
+static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, View2D *v2d, float y)
+{
+ bAnimListElem *ale;
+ float x = 0.0f;
+
+ /* loop through channels, and set up drawing depending on their type */
+ for (ale= anim_data->first; ale; ale= ale->next) {
+ const float yminc= (float)(y - NLACHANNEL_HEIGHT_HALF);
+ const float ymaxc= (float)(y + NLACHANNEL_HEIGHT_HALF);
+ const float ydatac= (float)(y - 7);
+
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ short indent= 0, offset= 0, sel= 0, group= 0;
+ int expand= -1, protect = -1, special= -1, mute = -1;
+ char name[128];
+ short doDraw=0;
+
+ /* determine what needs to be drawn */
+ switch (ale->type) {
+ case ANIMTYPE_NLATRACK: /* NLA Track */
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ indent= 0;
+
+ if (ale->id) {
+ /* special exception for materials and particles */
+ if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) {
+ offset= 21;
+ indent= 1;
+ }
+ else
+ offset= 14;
+ }
+ else
+ offset= 0;
+
+ /* FIXME: 'solo' as the 'special' button?
+ * - need special icons for these
+ */
+ if (nlt->flag & NLATRACK_SOLO)
+ special= ICON_LAYER_ACTIVE;
+ else
+ special= ICON_LAYER_USED;
+
+ /* if this track is active and we're tweaking it, don't draw these toggles */
+ // TODO: need a special macro for this...
+ if ( ((nlt->flag & NLATRACK_ACTIVE) && (nlt->flag & NLATRACK_DISABLED)) == 0 )
+ {
+ if (nlt->flag & NLATRACK_MUTED)
+ mute = ICON_MUTE_IPO_ON;
+ else
+ mute = ICON_MUTE_IPO_OFF;
+
+ if (EDITABLE_NLT(nlt))
+ protect = ICON_UNLOCKED;
+ else
+ protect = ICON_LOCKED;
+ }
+
+ sel = SEL_NLT(nlt);
+ strcpy(name, nlt->name);
+
+ // draw manually still
+ doDraw= 1;
+ }
+ break;
+ case ANIMTYPE_NLAACTION: /* NLA Action-Line */
+ {
+ bAction *act= (bAction *)ale->data;
+
+ group = 5;
+
+ if (ale->id) {
+ /* special exception for materials and particles */
+ if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) {
+ offset= 21;
+ indent= 1;
+ }
+ else
+ offset= 14;
+ }
+ else
+ offset= 0;
+
+ special = ICON_ACTION;
+
+ if (act)
+ sprintf(name, "ActAction: <%s>", act->id.name+2);
+ else
+ sprintf(name, "<No Action>");
+
+ // draw manually still
+ doDraw= 1;
+ }
+ break;
+
+ default: /* handled by standard channel-drawing API */
+ // draw backdrops only...
+ ANIM_channel_draw(ac, ale, yminc, ymaxc);
+ break;
+ }
+
+ /* if special types, draw manually for now... */
+ if (doDraw) {
+ /* now, start drawing based on this information */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ /* draw backing strip behind channel name */
+ if (group == 5) {
+ /* Action Line */
+ AnimData *adt= ale->adt;
+
+ // TODO: if tweaking some action, use the same color as for the tweaked track (quick hack done for now)
+ if (adt && (adt->flag & ADT_NLA_EDIT_ON)) {
+ // greenish color (same as tweaking strip) - hardcoded for now
+ glColor3f(0.3f, 0.95f, 0.1f);
+ }
+ else {
+ if (ale->data)
+ glColor3f(0.8f, 0.2f, 0.0f); // reddish color - hardcoded for now
+ else
+ glColor3f(0.6f, 0.5f, 0.5f); // greyish-red color - hardcoded for now
+ }
+
+ offset += 7 * indent;
+
+ /* only on top two corners, to show that this channel sits on top of the preceeding ones */
+ uiSetRoundBox((1|2));
+
+ /* draw slightly shifted up vertically to look like it has more separtion from other channels,
+ * but we then need to slightly shorten it so that it doesn't look like it overlaps
+ */
+ gl_round_box(GL_POLYGON, x+offset, yminc+NLACHANNEL_SKIP, (float)v2d->cur.xmax, ymaxc+NLACHANNEL_SKIP-1, 8);
+
+ /* clear group value, otherwise we cause errors... */
+ group = 0;
+ }
+ else {
+ /* for normal channels
+ * - use 3 shades of color group/standard color for 3 indention level
+ */
+ UI_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40));
+
+ indent += group;
+ offset += 7 * indent;
+ glBegin(GL_QUADS);
+ glVertex2f(x+offset, yminc);
+ glVertex2f(x+offset, ymaxc);
+ glVertex2f((float)v2d->cur.xmax, ymaxc);
+ glVertex2f((float)v2d->cur.xmax, yminc);
+ glEnd();
+ }
+
+ /* draw expand/collapse triangle */
+ if (expand > 0) {
+ UI_icon_draw(x+offset, ydatac, expand);
+ offset += 17;
+ }
+
+ /* draw special icon indicating certain data-types */
+ if (special > -1) {
+ /* for normal channels */
+ UI_icon_draw(x+offset, ydatac, special);
+ offset += 17;
+ }
+ glDisable(GL_BLEND);
+
+ /* draw name */
+ if (sel)
+ UI_ThemeColor(TH_TEXT_HI);
+ else
+ UI_ThemeColor(TH_TEXT);
+ offset += 3;
+ UI_DrawString(x+offset, y-4, name);
+
+ /* reset offset - for RHS of panel */
+ offset = 0;
+
+ /* set blending again, as text drawing may clear it */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ /* draw protect 'lock' */
+ if (protect > -1) {
+ offset = 16;
+ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, protect);
+ }
+
+ /* draw mute 'eye' */
+ if (mute > -1) {
+ offset += 16;
+ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, mute);
+ }
+
+ /* draw NLA-action line 'status-icons' - only when there's an action */
+ if ((ale->type == ANIMTYPE_NLAACTION) && (ale->data)) {
+ AnimData *adt= ale->adt;
+
+ offset += 16;
+
+ /* now draw some indicator icons */
+ if ((adt) && (adt->flag & ADT_NLA_EDIT_ON)) {
+ /* toggle for tweaking with mapping/no-mapping (i.e. 'in place editing' toggle) */
+ // for now, use pin icon to symbolise this
+ if (adt->flag & ADT_NLA_EDIT_NOMAP)
+ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, ICON_PINNED);
+ else
+ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, ICON_UNPINNED);
+
+ fdrawline((float)(v2d->cur.xmax-offset), yminc,
+ (float)(v2d->cur.xmax-offset), ymaxc);
+ offset += 16;;
+
+ /* 'tweaking action' indicator - not a button */
+ UI_icon_draw((float)(v2d->cur.xmax-offset), ydatac, ICON_EDIT);
+ }
+ else {
+ /* XXX firstly draw a little rect to help identify that it's different from the toggles */
+ glBegin(GL_LINE_LOOP);
+ glVertex2f((float)v2d->cur.xmax-offset-1, y-7);
+ glVertex2f((float)v2d->cur.xmax-offset-1, y+9);
+ glVertex2f((float)v2d->cur.xmax-1, y+9);
+ glVertex2f((float)v2d->cur.xmax-1, y-7);
+ glEnd(); // GL_LINES
+
+ /* 'push down' icon for normal active-actions */
+ UI_icon_draw((float)NLACHANNEL_NAMEWIDTH-offset, ydatac, ICON_FREEZE);
+ }
+ }
+
+ glDisable(GL_BLEND);
+ }
+ }
+
+ /* adjust y-position for next one */
+ y -= NLACHANNEL_STEP;
+ }
+}
+
+void draw_nla_channel_list (bContext *C, bAnimContext *ac, SpaceNla *snla, ARegion *ar)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ View2D *v2d= &ar->v2d;
+ float y= 0.0f;
+ int items, height;
+
+ /* build list of channels to draw */
+ filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CHANNELS);
+ items= ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* Update max-extent of channels here (taking into account scrollers):
+ * - this is done to allow the channel list to be scrollable, but must be done here
+ * to avoid regenerating the list again and/or also because channels list is drawn first
+ * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for
+ * start of list offset, and the second is as a correction for the scrollers.
+ */
+ height= ((items*NLACHANNEL_STEP) + (NLACHANNEL_HEIGHT*2));
+ /* don't use totrect set, as the width stays the same
+ * (NOTE: this is ok here, the configuration is pretty straightforward)
+ */
+ v2d->tot.ymin= (float)(-height);
+
+ /* draw channels */
+ { /* first pass: backdrops + oldstyle drawing */
+ y= (float)(-NLACHANNEL_HEIGHT);
+
+ draw_nla_channel_list_gl(ac, &anim_data, v2d, y);
+ }
+ { /* second pass: UI widgets */
+ uiBlock *block= uiBeginBlock(C, ar, "NLA channel buttons", UI_EMBOSS);
+
+ y= (float)(-NLACHANNEL_HEIGHT);
+
+ /* set blending again, as may not be set in previous step */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ /* loop through channels, and set up drawing depending on their type */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ const float yminc= (float)(y - NLACHANNEL_HEIGHT_HALF);
+ const float ymaxc= (float)(y + NLACHANNEL_HEIGHT_HALF);
+
+ /* check if visible */
+ if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
+ IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) )
+ {
+ /* draw all channels using standard channel-drawing API */
+ ANIM_channel_draw_widgets(ac, ale, block, yminc, ymaxc);
+ }
+
+ /* adjust y-position for next one */
+ y -= NLACHANNEL_STEP;
+ }
+
+ uiEndBlock(C, block);
+ uiDrawBlock(C, block);
+
+ glDisable(GL_BLEND);
+ }
+
+ /* free tempolary channels */
+ BLI_freelistN(&anim_data);
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
new file mode 100644
index 00000000000..e53ccd004db
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -0,0 +1,1600 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_fcurve.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframes_edit.h"
+#include "ED_markers.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h" // own include
+#include "nla_private.h" // FIXME... maybe this shouldn't be included?
+
+/* *********************************************** */
+/* Utilities exported to other places... */
+
+/* Perform validation for blending/extend settings */
+void ED_nla_postop_refresh (bAnimContext *ac)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT);
+
+ /* get blocks to work on */
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* performing auto-blending, extend-mode validation, etc. */
+ BKE_nla_validate_state(ale->data);
+ }
+
+ /* free temp memory */
+ BLI_freelistN(&anim_data);
+}
+
+/* *********************************************** */
+/* 'Special' Editing */
+
+/* ******************** Tweak-Mode Operators ***************************** */
+/* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited
+ * as if it were the normal Active-Action of its AnimData block.
+ */
+
+static int nlaedit_enable_tweakmode_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ int ok=0;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the AnimData blocks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* if no blocks, popup error? */
+ if (anim_data.first == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No AnimData blocks to enter tweakmode for");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* for each AnimData block with NLA-data, try setting it in tweak-mode */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ale->data;
+
+ /* try entering tweakmode if valid */
+ ok += BKE_nla_tweakmode_enter(adt);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* if we managed to enter tweakmode on at least one AnimData block,
+ * set the flag for this in the active scene and send notifiers
+ */
+ if (ac.scene && ok) {
+ /* set editing flag */
+ ac.scene->flag |= SCE_NLA_EDIT_ON;
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_ACTCHANGE, NULL);
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "No active strip(s) to enter tweakmode on.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_tweakmode_enter (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Enter Tweak Mode";
+ ot->idname= "NLA_OT_tweakmode_enter";
+ ot->description= "Enter tweaking mode for the action referenced by the active strip.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_enable_tweakmode_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ------------- */
+
+static int nlaedit_disable_tweakmode_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 AnimData blocks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* if no blocks, popup error? */
+ if (anim_data.first == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No AnimData blocks to enter tweakmode for");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* for each AnimData block with NLA-data, try exitting tweak-mode */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ale->data;
+
+ /* try entering tweakmode if valid */
+ BKE_nla_tweakmode_exit(adt);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* if we managed to enter tweakmode on at least one AnimData block,
+ * set the flag for this in the active scene and send notifiers
+ */
+ if (ac.scene) {
+ /* clear editing flag */
+ ac.scene->flag &= ~SCE_NLA_EDIT_ON;
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_ACTCHANGE, NULL);
+ }
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_tweakmode_exit (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Exit Tweak Mode";
+ ot->idname= "NLA_OT_tweakmode_exit";
+ ot->description= "Exit tweaking mode for the action referenced by the active strip.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_disable_tweakmode_exec;
+ ot->poll= nlaop_poll_tweakmode_on;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* *********************************************** */
+/* NLA Editing Operations (Constructive/Destructive) */
+
+/* ******************** Add Action-Clip Operator ***************************** */
+/* Add a new Action-Clip strip to the active track (or the active block if no space in the track) */
+
+/* pop up menu allowing user to choose the action to use */
+static int nlaedit_add_actionclip_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+{
+ Main *m= CTX_data_main(C);
+ bAction *act;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+
+ pup= uiPupMenuBegin(C, "Add Action Clip", 0);
+ layout= uiPupMenuLayout(pup);
+
+ /* loop through Actions in Main database, adding as items in the menu */
+ for (act= m->action.first; act; act= act->id.next)
+ uiItemStringO(layout, act->id.name+2, 0, "NLA_OT_add_actionclip", "action", act->id.name);
+ uiItemS(layout);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+/* add the specified action as new strip */
+static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ Scene *scene;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter, items;
+
+ bAction *act = NULL;
+ char actname[22];
+ float cfra;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ scene= ac.scene;
+ cfra= (float)CFRA;
+
+ /* get action to use */
+ RNA_string_get(op->ptr, "action", actname);
+ act= (bAction *)find_id("AC", actname+2);
+
+ if (act == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No valid Action to add.");
+ //printf("Add strip - actname = '%s' \n", actname);
+ return OPERATOR_CANCELLED;
+ }
+
+ /* get a list of the editable tracks being shown in the NLA
+ * - this is limited to active ones for now, but could be expanded to
+ */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ACTIVE | ANIMFILTER_NLATRACKS | ANIMFILTER_FOREDIT);
+ items= ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ if (items == 0) {
+ BKE_report(op->reports, RPT_ERROR, "No active track(s) to add strip to.");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* for every active track, try to add strip to free space in track or to the top of the stack if no space */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ NlaStrip *strip= NULL;
+
+ /* create a new strip, and offset it to start on the current frame */
+ strip= add_nlastrip(act);
+
+ strip->end += (cfra - strip->start);
+ strip->start = cfra;
+
+ /* firstly try adding strip to our current track, but if that fails, add to a new track */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* trying to add to the current failed (no space),
+ * so add a new track to the stack, and add to that...
+ */
+ nlt= add_nlatrack(adt, NULL);
+ BKE_nlatrack_add_strip(nlt, strip);
+ }
+
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_add_actionclip (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Action Strip";
+ ot->idname= "NLA_OT_add_actionclip";
+ ot->description= "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track.";
+
+ /* api callbacks */
+ ot->invoke= nlaedit_add_actionclip_invoke;
+ ot->exec= nlaedit_add_actionclip_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ // TODO: this would be nicer as an ID-pointer...
+ RNA_def_string(ot->srna, "action", "", 21, "Action", "Name of Action to add as a new Action-Clip Strip.");
+}
+
+/* ******************** Add Transition Operator ***************************** */
+/* Add a new transition strip between selected strips */
+
+static int nlaedit_add_transition_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ int done = 0;
+
+ /* 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);
+
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ NlaStrip *s1, *s2;
+
+ /* get initial pair of strips */
+ if ELEM(nlt->strips.first, NULL, nlt->strips.last)
+ continue;
+ s1= nlt->strips.first;
+ s2= s1->next;
+
+ /* loop over strips */
+ for (; s1 && s2; s1=s2, s2=s2->next) {
+ NlaStrip *strip;
+
+ /* check if both are selected */
+ if ELEM(0, (s1->flag & NLASTRIP_FLAG_SELECT), (s2->flag & NLASTRIP_FLAG_SELECT))
+ continue;
+ /* check if there's space between the two */
+ if (IS_EQ(s1->end, s2->start))
+ continue;
+ /* make neither one is a transition
+ * - although this is impossible to create with the standard tools,
+ * the user may have altered the settings
+ */
+ if (ELEM(NLASTRIP_TYPE_TRANSITION, s1->type, s2->type))
+ continue;
+
+ /* allocate new strip */
+ strip= MEM_callocN(sizeof(NlaStrip), "NlaStrip");
+ BLI_insertlinkafter(&nlt->strips, s1, strip);
+
+ /* set the type */
+ strip->type= NLASTRIP_TYPE_TRANSITION;
+
+ /* generic settings
+ * - selected flag to highlight this to the user
+ * - auto-blends to ensure that blend in/out values are automatically
+ * determined by overlaps of strips
+ */
+ strip->flag = NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_AUTO_BLENDS;
+
+ /* range is simply defined as the endpoints of the adjacent strips */
+ strip->start = s1->end;
+ strip->end = s2->start;
+
+ /* scale and repeat aren't of any use, but shouldn't ever be 0 */
+ strip->scale= 1.0f;
+ strip->repeat = 1.0f;
+
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+
+ /* make note of this */
+ done++;
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* was anything added? */
+ if (done) {
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+ }
+ else {
+ BKE_report(op->reports, RPT_ERROR, "Needs at least a pair of adjacent selected strips with a gap between them.");
+ return OPERATOR_CANCELLED;
+ }
+}
+
+void NLA_OT_add_transition (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Transition";
+ ot->idname= "NLA_OT_add_transition";
+ ot->description= "Add a transition strip between two adjacent selected strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_add_transition_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Add Meta-Strip Operator ***************************** */
+/* 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)
+{
+ 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);
+
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ NlaStrip *strip;
+
+ /* create meta-strips from the continuous chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 0);
+
+ /* name the metas */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* auto-name this strip if selected (that means it is a meta) */
+ if (strip->flag & NLASTRIP_FLAG_SELECT)
+ BKE_nlastrip_validate_name(adt, strip);
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_add_meta (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Meta-Strips";
+ ot->idname= "NLA_OT_add_meta";
+ ot->description= "Add new meta-strips incorporating the selected strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_add_meta_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Remove Meta-Strip Operator ***************************** */
+/* Separate out the strips held by the selected meta-strips */
+
+static int nlaedit_remove_meta_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);
+
+ /* for each track, find pairs of strips to add transitions to */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* clear all selected meta-strips, regardless of whether they are temporary or not */
+ BKE_nlastrips_clear_metas(&nlt->strips, 1, 0);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_remove_meta (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Meta-Strips";
+ ot->idname= "NLA_OT_remove_meta";
+ ot->description= "Separate out the strips held by the selected meta-strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_remove_meta_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Duplicate Strips Operator ************************** */
+/* Duplicates the selected NLA-Strips, putting them on new tracks above the one
+ * the originals were housed in.
+ */
+
+static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ short done = 0;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of 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);
+
+ /* duplicate strips in tracks starting from the last one so that we're
+ * less likely to duplicate strips we just duplicated...
+ */
+ for (ale= anim_data.last; ale; ale= ale->prev) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ NlaStrip *strip, *nstrip, *next;
+ NlaTrack *track;
+
+ for (strip= nlt->strips.first; strip; strip= next) {
+ next= strip->next;
+
+ /* if selected, split the strip at its midpoint */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* make a copy (assume that this is possible) */
+ nstrip= copy_nlastrip(strip);
+
+ /* in case there's no space in the track above, or we haven't got a reference to it yet, try adding */
+ if (BKE_nlatrack_add_strip(nlt->next, nstrip) == 0) {
+ /* need to add a new track above the one above the current one
+ * - if the current one is the last one, nlt->next will be NULL, which defaults to adding
+ * at the top of the stack anyway...
+ */
+ track= add_nlatrack(adt, nlt->next);
+ BKE_nlatrack_add_strip(track, nstrip);
+ }
+
+ /* deselect the original and the active flag */
+ strip->flag &= ~(NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_ACTIVE);
+
+ /* auto-name it */
+ BKE_nlastrip_validate_name(adt, strip);
+
+ done++;
+ }
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ if (done) {
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+ }
+ else
+ return OPERATOR_CANCELLED;
+}
+
+static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ nlaedit_duplicate_exec(C, op);
+
+ RNA_int_set(op->ptr, "mode", TFM_TIME_TRANSLATE); // XXX
+ WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_duplicate (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Duplicate Strips";
+ ot->idname= "NLA_OT_duplicate";
+ ot->description= "Duplicate selected NLA-Strips, adding the new strips in new tracks above the originals.";
+
+ /* api callbacks */
+ ot->invoke= nlaedit_duplicate_invoke;
+ ot->exec= nlaedit_duplicate_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
+/* ******************** Delete Strips Operator ***************************** */
+/* Deletes the selected NLA-Strips */
+
+static int nlaedit_delete_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);
+
+ /* for each NLA-Track, delete all selected strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip, *nstrip;
+
+ for (strip= nlt->strips.first; strip; strip= nstrip) {
+ nstrip= strip->next;
+
+ /* if selected, delete */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* if a strip either side of this was a transition, delete those too */
+ if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION))
+ free_nlastrip(&nlt->strips, strip->prev);
+ if ((nstrip) && (nstrip->type == NLASTRIP_TYPE_TRANSITION)) {
+ nstrip= nstrip->next;
+ free_nlastrip(&nlt->strips, strip->next);
+ }
+
+ /* finally, delete this strip */
+ free_nlastrip(&nlt->strips, strip);
+ }
+ }
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_delete (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Delete Strips";
+ ot->idname= "NLA_OT_delete";
+ ot->description= "Delete selected strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_delete_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Split Strips Operator ***************************** */
+/* Splits the selected NLA-Strips into two strips at the midpoint of the strip */
+// TODO's?
+// - multiple splits
+// - variable-length splits?
+
+/* split a given Action-Clip strip */
+static void nlaedit_split_strip_actclip (AnimData *adt, NlaTrack *nlt, NlaStrip *strip, float cfra)
+{
+ NlaStrip *nstrip;
+ float splitframe, splitaframe;
+
+ /* calculate the frames to do the splitting at
+ * - use current frame if within extents of strip
+ */
+ if ((cfra > strip->start) && (cfra < strip->end)) {
+ /* use the current frame */
+ splitframe= cfra;
+ splitaframe= nlastrip_get_frame(strip, cfra, NLATIME_CONVERT_UNMAP);
+ }
+ else {
+ /* split in the middle */
+ float len;
+
+ /* strip extents */
+ len= strip->end - strip->start;
+ if (IS_EQ(len, 0.0f))
+ return;
+ else
+ splitframe= strip->start + (len / 2.0f);
+
+ /* action range */
+ len= strip->actend - strip->actstart;
+ if (IS_EQ(len, 0.0f))
+ splitaframe= strip->actend;
+ else
+ splitaframe= strip->actstart + (len / 2.0f);
+ }
+
+ /* make a copy (assume that this is possible) and append
+ * it immediately after the current strip
+ */
+ nstrip= copy_nlastrip(strip);
+ BLI_insertlinkafter(&nlt->strips, strip, nstrip);
+
+ /* set the endpoint of the first strip and the start of the new strip
+ * to the splitframe values calculated above
+ */
+ strip->end= splitframe;
+ nstrip->start= splitframe;
+
+ if ((splitaframe > strip->actstart) && (splitaframe < strip->actend)) {
+ /* only do this if we're splitting down the middle... */
+ strip->actend= splitaframe;
+ nstrip->actstart= splitaframe;
+ }
+
+ /* clear the active flag from the copy */
+ nstrip->flag &= ~NLASTRIP_FLAG_ACTIVE;
+
+ /* auto-name the new strip */
+ BKE_nlastrip_validate_name(adt, nstrip);
+}
+
+/* split a given Meta strip */
+static void nlaedit_split_strip_meta (AnimData *adt, NlaTrack *nlt, NlaStrip *strip)
+{
+ /* simply ungroup it for now... */
+ BKE_nlastrips_clear_metastrip(&nlt->strips, strip);
+}
+
+/* ----- */
+
+static int nlaedit_split_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 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);
+
+ /* for each NLA-Track, split all selected strips into two strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ AnimData *adt= ale->adt;
+ NlaStrip *strip, *next;
+
+ for (strip= nlt->strips.first; strip; strip= next) {
+ next= strip->next;
+
+ /* if selected, split the strip at its midpoint */
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* splitting method depends on the type of strip */
+ switch (strip->type) {
+ case NLASTRIP_TYPE_CLIP: /* action-clip */
+ nlaedit_split_strip_actclip(adt, nlt, strip, (float)ac.scene->r.cfra);
+ break;
+
+ case NLASTRIP_TYPE_META: /* meta-strips need special handling */
+ nlaedit_split_strip_meta(adt, nlt, strip);
+ break;
+
+ default: /* for things like Transitions, do not split! */
+ break;
+ }
+ }
+ }
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_split (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Split Strips";
+ ot->idname= "NLA_OT_split";
+ ot->description= "Split selected strips at their midpoints.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_split_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Bake Strips Operator ***************************** */
+/* Bakes the NLA Strips for the active AnimData blocks */
+
+static int nlaedit_bake_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_ANIMDATA | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* for each AnimData block, bake strips to animdata... */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ // FIXME
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_bake (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Bake Strips";
+ ot->idname= "NLA_OT_bake";
+ ot->description= "Bake all strips of selected AnimData blocks.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_bake_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* *********************************************** */
+/* NLA Editing Operations (Modifying) */
+
+/* ******************** Toggle Muting Operator ************************** */
+/* Toggles whether strips are muted or not */
+
+static int nlaedit_toggle_mute_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);
+
+ /* go over all selected strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* for every selected strip, toggle muting */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* just flip the mute flag for now */
+ // TODO: have a pre-pass to check if mute all or unmute all?
+ strip->flag ^= NLASTRIP_FLAG_MUTED;
+ }
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_mute_toggle (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Muting";
+ ot->idname= "NLA_OT_mute_toggle";
+ ot->description= "Mute or un-muted selected strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_toggle_mute_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)
+{
+ 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);
+
+ /* since we're potentially moving strips from lower tracks to higher tracks, we should
+ * loop over the tracks in reverse order to avoid moving earlier strips up multiple tracks
+ */
+ for (ale= anim_data.last; ale; ale= ale->prev) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaTrack *nltn= nlt->next;
+ NlaStrip *strip, *stripn;
+
+ /* if this track has no tracks after it, skip for now... */
+ if (nltn == NULL)
+ continue;
+
+ /* for every selected strip, try to move */
+ for (strip= nlt->strips.first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* check if the track above has room for this strip */
+ if (BKE_nlatrack_has_space(nltn, strip->start, strip->end)) {
+ /* remove from its current track, and add to the one above (it 'should' work, so no need to worry) */
+ BLI_remlink(&nlt->strips, strip);
+ BKE_nlatrack_add_strip(nltn, strip);
+ }
+ }
+ }
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_move_up (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move Strips Up";
+ ot->idname= "NLA_OT_move_up";
+ ot->description= "Move selected strips up a track if there's room.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_move_up_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** 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)
+{
+ 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);
+
+ /* loop through the tracks in normal order, since we're pushing strips down,
+ * strips won't get operated on twice
+ */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaTrack *nltp= nlt->prev;
+ NlaStrip *strip, *stripn;
+
+ /* if this track has no tracks before it, skip for now... */
+ if (nltp == NULL)
+ continue;
+
+ /* for every selected strip, try to move */
+ for (strip= nlt->strips.first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* check if the track below has room for this strip */
+ if (BKE_nlatrack_has_space(nltp, strip->start, strip->end)) {
+ /* remove from its current track, and add to the one above (it 'should' work, so no need to worry) */
+ BLI_remlink(&nlt->strips, strip);
+ BKE_nlatrack_add_strip(nltp, strip);
+ }
+ }
+ }
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_move_down (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Move Strips Down";
+ ot->idname= "NLA_OT_move_down";
+ ot->description= "Move selected strips down a track if there's room.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_move_down_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Apply Scale Operator ***************************** */
+/* Reset the scaling of the selected strips to 1.0f */
+
+/* apply scaling to keyframe */
+static short bezt_apply_nlamapping (BeztEditData *bed, BezTriple *bezt)
+{
+ /* NLA-strip which has this scaling is stored in bed->data */
+ NlaStrip *strip= (NlaStrip *)bed->data;
+
+ /* adjust all the times */
+ bezt->vec[0][0]= nlastrip_get_frame(strip, bezt->vec[0][0], NLATIME_CONVERT_MAP);
+ bezt->vec[1][0]= nlastrip_get_frame(strip, bezt->vec[1][0], NLATIME_CONVERT_MAP);
+ bezt->vec[2][0]= nlastrip_get_frame(strip, bezt->vec[2][0], NLATIME_CONVERT_MAP);
+
+ /* nothing to return or else we exit */
+ return 0;
+}
+
+static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ BeztEditData bed;
+
+ /* 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);
+
+ /* init the editing data */
+ memset(&bed, 0, sizeof(BeztEditData));
+
+ /* for each NLA-Track, apply scale of all selected strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* strip must be selected, and must be action-clip only (transitions don't have scale) */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
+ /* if the referenced action is used by other strips, make this strip use its own copy */
+ if (strip->act == NULL)
+ continue;
+ if (strip->act->id.us > 1) {
+ /* make a copy of the Action to work on */
+ bAction *act= copy_action(strip->act);
+
+ /* set this as the new referenced action, decrementing the users of the old one */
+ strip->act->id.us--;
+ strip->act= act;
+ }
+
+ /* setup iterator, and iterate over all the keyframes in the action, applying this scaling */
+ bed.data= strip;
+ ANIM_animchanneldata_keys_bezier_loop(&bed, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve, 0);
+
+ /* clear scale of strip now that it has been applied,
+ * and recalculate the extents of the action now that it has been scaled
+ * but leave everything else alone
+ */
+ strip->scale= 1.0f;
+ calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
+ }
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_apply_scale (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Apply Scale";
+ ot->idname= "NLA_OT_apply_scale";
+ ot->description= "Apply scaling of selected strips to their referenced Actions.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_apply_scale_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Clear Scale Operator ***************************** */
+/* Reset the scaling of the selected strips to 1.0f */
+
+static int nlaedit_clear_scale_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);
+
+ /* for each NLA-Track, reset scale of all selected strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* strip must be selected, and must be action-clip only (transitions don't have scale) */
+ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) {
+ PointerRNA strip_ptr;
+
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
+ RNA_float_set(&strip_ptr, "scale", 1.0f);
+ }
+ }
+ }
+
+ /* 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_clear_scale (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Scale";
+ ot->idname= "NLA_OT_clear_scale";
+ ot->description= "Reset scaling of selected strips.";
+
+ /* api callbacks */
+ ot->exec= nlaedit_clear_scale_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ******************** Snap Strips Operator ************************** */
+/* Moves the start-point of the selected strips to the specified places */
+
+/* defines for snap keyframes tool */
+EnumPropertyItem prop_nlaedit_snap_types[] = {
+ {NLAEDIT_SNAP_CFRA, "CFRA", 0, "Current frame", ""},
+ {NLAEDIT_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
+ {NLAEDIT_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry?
+ {NLAEDIT_SNAP_NEAREST_MARKER, "NEAREST_MARKER", 0, "Nearest Marker", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int nlaedit_snap_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene;
+ int mode = RNA_enum_get(op->ptr, "type");
+ float secf;
+
+ /* 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);
+
+ /* get some necessary vars */
+ scene= ac.scene;
+ secf= (float)FPS;
+
+ /* since we may add tracks, perform this in reverse order */
+ for (ale= anim_data.last; ale; ale= ale->prev) {
+ ListBase tmp_strips = {NULL, NULL};
+ AnimData *adt= ale->adt;
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip, *stripn;
+ NlaTrack *track;
+
+ /* create meta-strips from the continuous chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* apply the snapping to all the temp meta-strips, then put them in a separate list to be added
+ * back to the original only if they still fit
+ */
+ for (strip= nlt->strips.first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_TEMP_META) {
+ float start, end;
+
+ /* get the existing end-points */
+ start= strip->start;
+ end= strip->end;
+
+ /* calculate new start position based on snapping mode */
+ switch (mode) {
+ case NLAEDIT_SNAP_CFRA: /* to current frame */
+ strip->start= (float)CFRA;
+ break;
+ case NLAEDIT_SNAP_NEAREST_FRAME: /* to nearest frame */
+ strip->start= (float)(floor(start+0.5));
+ break;
+ case NLAEDIT_SNAP_NEAREST_SECOND: /* to nearest second */
+ strip->start= ((float)floor(start/secf + 0.5f) * secf);
+ break;
+ case NLAEDIT_SNAP_NEAREST_MARKER: /* to nearest marker */
+ strip->start= (float)ED_markers_find_nearest_marker_time(ac.markers, start);
+ break;
+ default: /* just in case... no snapping */
+ strip->start= start;
+ break;
+ }
+
+ /* get new endpoint based on start-point (and old length) */
+ strip->end= strip->start + (end - start);
+
+ /* apply transforms to meta-strip to its children */
+ BKE_nlameta_flush_transforms(strip);
+
+ /* remove strip from track, and add to the temp buffer */
+ BLI_remlink(&nlt->strips, strip);
+ BLI_addtail(&tmp_strips, strip);
+ }
+ }
+
+ /* try adding each meta-strip back to the track one at a time, to make sure they'll fit */
+ for (strip= tmp_strips.first; strip; strip= stripn) {
+ stripn= strip->next;
+
+ /* remove from temp-strips list */
+ BLI_remlink(&tmp_strips, strip);
+
+ /* in case there's no space in the current track, try adding */
+ if (BKE_nlatrack_add_strip(nlt, strip) == 0) {
+ /* need to add a new track above the current one */
+ track= add_nlatrack(adt, nlt);
+ BKE_nlatrack_add_strip(track, strip);
+
+ /* clear temp meta-strips on this new track, as we may not be able to get back to it */
+ BKE_nlastrips_clear_metas(&track->strips, 0, 1);
+ }
+ }
+
+ /* remove the meta-strips now that we're done */
+ 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_EDIT, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_snap (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Snap Strips";
+ ot->idname= "NLA_OT_snap";
+ ot->description= "Move start of strips to specified time.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= nlaedit_snap_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", "");
+}
+
+/* *********************************************** */
+/* NLA Modifiers */
+
+/* ******************** 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)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ int i;
+
+ pup= uiPupMenuBegin(C, "Add F-Modifier", 0);
+ layout= uiPupMenuLayout(pup);
+
+ /* start from 1 to skip the 'Invalid' modifier type */
+ for (i = 1; i < FMODIFIER_NUM_TYPES; i++) {
+ FModifierTypeInfo *fmi= get_fmodifier_typeinfo(i);
+
+ /* check if modifier is valid for this context */
+ if (fmi == NULL)
+ continue;
+ if (i == FMODIFIER_TYPE_CYCLES) /* we already have repeat... */
+ continue;
+
+ /* add entry to add this type of modifier */
+ uiItemEnumO(layout, fmi->name, 0, "NLA_OT_fmodifier_add", "type", i);
+ }
+ uiItemS(layout);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+static int nla_fmodifier_add_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ FModifier *fcm;
+ int type= RNA_enum_get(op->ptr, "type");
+ short onlyActive = RNA_boolean_get(op->ptr, "only_active");
+
+ /* 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);
+
+ /* for each NLA-Track, add the specified modifier to all selected strips */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+ int i = 1;
+
+ for (strip= nlt->strips.first; strip; strip=strip->next, i++) {
+ /* only add F-Modifier if on active strip? */
+ if ((onlyActive) && (strip->flag & NLASTRIP_FLAG_ACTIVE)==0)
+ continue;
+
+ /* add F-Modifier of specified type to selected, and make it the active one */
+ fcm= add_fmodifier(&strip->modifiers, type);
+
+ if (fcm)
+ set_active_fmodifier(&strip->modifiers, fcm);
+ else {
+ char errormsg[128];
+ sprintf(errormsg, "Modifier couldn't be added to (%s : %d). See console for details.", nlt->name, i);
+
+ BKE_report(op->reports, RPT_ERROR, errormsg);
+ }
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* set notifier that things have changed */
+ // FIXME: this doesn't really do it justice...
+ WM_event_add_notifier(C, NC_ANIMATION, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_fmodifier_add (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add F-Modifier";
+ ot->idname= "NLA_OT_fmodifier_add";
+
+ /* api callbacks */
+ ot->invoke= nla_fmodifier_add_invoke;
+ ot->exec= nla_fmodifier_add_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ RNA_def_enum(ot->srna, "type", fmodifier_type_items, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "only_active", 0, "Only Active", "Only add F-Modifier of the specified type to the active strip.");
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/space_nla/nla_header.c b/source/blender/editors/space_nla/nla_header.c
index 0f6b77da6f5..0d3bf2cb6b1 100644
--- a/source/blender/editors/space_nla/nla_header.c
+++ b/source/blender/editors/space_nla/nla_header.c
@@ -21,7 +21,7 @@
* All rights reserved.
*
*
- * Contributor(s): Blender Foundation
+ * Contributor(s): Blender Foundation, Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -29,6 +29,10 @@
#include <string.h>
#include <stdio.h>
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -37,19 +41,29 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
#include "BKE_context.h"
+#include "BKE_report.h"
#include "BKE_screen.h"
-
-#include "ED_screen.h"
#include "ED_types.h"
#include "ED_util.h"
-#include "WM_api.h"
-#include "WM_types.h"
+#include "ED_anim_api.h"
+#include "ED_markers.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
#include "BIF_gl.h"
-#include "BIF_glutil.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -57,49 +71,149 @@
#include "nla_intern.h"
+/* button events */
+enum {
+ B_REDR = 0,
+} eActHeader_ButEvents;
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+
+static void nla_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa= CTX_wm_area(C);
+ SpaceNla *snla= CTX_wm_space_nla(C);
+ PointerRNA spaceptr;
+
+ /* retrieve state */
+ RNA_pointer_create(&sc->id, &RNA_SpaceNLA, snla, &spaceptr);
+
+ /* create menu */
+ uiItemO(layout, NULL, ICON_MENU_PANEL, "NLA_OT_properties");
+
+ uiItemS(layout);
+
+ uiItemR(layout, NULL, 0, &spaceptr, "show_cframe_indicator", 0);
+
+ if (snla->flag & SNLA_DRAWTIME)
+ uiItemO(layout, "Show Frames", 0, "ANIM_OT_time_toggle");
+ else
+ uiItemO(layout, "Show Seconds", 0, "ANIM_OT_time_toggle");
+
+ uiItemR(layout, NULL, 0, &spaceptr, "show_strip_curves", 0);
+ uiItemS(layout);
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_set");
+ uiItemO(layout, NULL, 0, "ANIM_OT_previewrange_clear");
+
+ uiItemS(layout);
+
+ //uiItemO(layout, NULL, 0, "NLA_OT_view_all");
+
+ if (sa->full)
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
+ else
+ uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void nla_selectmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
+ uiItemO(layout, NULL, 0, "NLA_OT_select_all_toggle");
+ uiItemBooleanO(layout, "Invert All", 0, "NLA_OT_select_all_toggle", "invert", 1);
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
+ uiItemS(layout);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiItemO(layout, NULL, 0, "NLA_OT_select_border");
+ uiItemBooleanO(layout, "Border Axis Range", 0, "NLA_OT_select_border", "axis_range", 1);
+}
+
+static void nla_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ // XXX these operators may change for NLA...
+ uiItemEnumO(layout, "Grab/Move", 0, "TFM_OT_transform", "mode", TFM_TRANSLATION);
+ uiItemEnumO(layout, "Extend", 0, "TFM_OT_transform", "mode", TFM_TIME_EXTEND);
+ uiItemEnumO(layout, "Scale", 0, "TFM_OT_transform", "mode", TFM_TIME_SCALE);
+}
+
+static void nla_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiItemEnumO(layout, NULL, 0, "NLA_OT_snap", "type", NLAEDIT_SNAP_CFRA);
+ uiItemEnumO(layout, NULL, 0, "NLA_OT_snap", "type", NLAEDIT_SNAP_NEAREST_FRAME);
+ uiItemEnumO(layout, NULL, 0, "NLA_OT_snap", "type", NLAEDIT_SNAP_NEAREST_SECOND);
+ uiItemEnumO(layout, NULL, 0, "NLA_OT_snap", "type", NLAEDIT_SNAP_NEAREST_MARKER);
+}
+
+static void nla_editmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ Scene *scene= CTX_data_scene(C);
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
+ uiItemMenuF(layout, "Transform", 0, nla_edit_transformmenu, NULL);
+ uiItemMenuF(layout, "Snap", 0, nla_edit_snapmenu, NULL);
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NLA_OT_duplicate");
+ uiItemO(layout, NULL, 0, "NLA_OT_split");
+ uiItemO(layout, NULL, 0, "NLA_OT_delete");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NLA_OT_mute_toggle");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NLA_OT_apply_scale");
+ uiItemO(layout, NULL, 0, "NLA_OT_clear_scale");
+
+ uiItemS(layout);
- return block;
+ uiItemO(layout, NULL, 0, "NLA_OT_move_up");
+ uiItemO(layout, NULL, 0, "NLA_OT_move_down");
+
+ uiItemS(layout);
+
+ // TODO: names of these tools for 'tweakmode' need changing?
+ if (scene->flag & SCE_NLA_EDIT_ON)
+ uiItemO(layout, "Stop Tweaking Strip Actions", 0, "NLA_OT_tweakmode_exit");
+ else
+ uiItemO(layout, "Start Tweaking Strip Actions", 0, "NLA_OT_tweakmode_enter");
}
+static void nla_addmenu(bContext *C, uiLayout *layout, void *arg_unused)
+{
+ uiItemO(layout, NULL, 0, "NLA_OT_add_actionclip");
+ uiItemO(layout, NULL, 0, "NLA_OT_add_transition");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NLA_OT_add_meta");
+ uiItemO(layout, NULL, 0, "NLA_OT_remove_meta");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "NLA_OT_add_tracks");
+ uiItemBooleanO(layout, "Add Tracks Above Selected", 0, "NLA_OT_add_tracks", "above_selected", 1);
+}
+
+/* ------------------ */
+
static void do_nla_buttons(bContext *C, void *arg, int event)
{
- switch(event) {
+ switch (event) {
+ case B_REDR:
+ ED_area_tag_redraw(CTX_wm_area(C));
+ break;
}
}
void nla_header_buttons(const bContext *C, ARegion *ar)
{
+ SpaceNla *snla= CTX_wm_space_nla(C);
ScrArea *sa= CTX_wm_area(C);
uiBlock *block;
int xco, yco= 3;
@@ -109,17 +223,70 @@ void nla_header_buttons(const bContext *C, ARegion *ar)
xco= ED_area_header_standardbuttons(C, block, yco);
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
+ if ((sa->flag & HEADER_NO_PULLDOWN)==0) {
int xmax;
xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, 24, "");
- xco+=XIC+xmax;
+ uiDefMenuBut(block, nla_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Select");
+ uiDefMenuBut(block, nla_selectmenu, NULL, "Select", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Edit");
+ uiDefMenuBut(block, nla_editmenu, NULL, "Edit", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
+
+ xmax= GetButStringLength("Add");
+ uiDefMenuBut(block, nla_addmenu, NULL, "Add", xco, yco, xmax-3, 20, "");
+ xco+= xmax;
}
uiBlockSetEmboss(block, UI_EMBOSS);
-
+
+ /* filtering buttons */
+ if (snla->ads) {
+ uiBlockBeginAlign(block);
+ uiDefIconButBitI(block, TOG, ADS_FILTER_ONLYSEL, B_REDR, ICON_RESTRICT_SELECT_OFF, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Only display selected Objects");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NLA_NOACT, B_REDR, ICON_ACTION, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Include AnimData blocks with no NLA Data");
+ uiBlockEndAlign(block);
+ xco += 5;
+
+ uiBlockBeginAlign(block);
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOSCE, B_REDR, ICON_SCENE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Scene Animation");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOWOR, B_REDR, ICON_WORLD_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display World Animation");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOSHAPEKEYS, B_REDR, ICON_SHAPEKEY_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display ShapeKeys");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMAT, B_REDR, ICON_MATERIAL_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Materials");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Lamps");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Cameras");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Curves");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display MetaBalls");
+ uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Particles");
+ uiBlockEndAlign(block);
+ xco += 15;
+ }
+ else {
+ // XXX this case shouldn't happen at all... for now, just pad out same amount of space
+ xco += 10*XIC + 15;
+ }
+ xco += (XIC + 8);
+
+ /* auto-snap selector */
+ if (snla->flag & SNLA_DRAWTIME) {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Keyframes %t|No Time-Snap %x0|Nearest Second %x2|Nearest Marker %x3",
+ xco,yco,90,YIC, &snla->autosnap, 0, 1, 0, 0,
+ "Auto-snapping mode for times when transforming");
+ }
+ else {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Keyframes %t|No Time-Snap %x0|Nearest Frame %x2|Nearest Marker %x3",
+ xco,yco,90,YIC, &snla->autosnap, 0, 1, 0, 0,
+ "Auto-snapping mode for times when transforming");
+ }
+ xco += 98;
+
/* always as last */
UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index c544bd9a408..e4557ec878f 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -17,11 +17,11 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung.
* All rights reserved.
*
*
- * Contributor(s): Blender Foundation
+ * Contributor(s): Blender Foundation, Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -30,10 +30,107 @@
/* internal exports only */
+/* **************************************** */
+/* Macros, etc. only used by NLA */
+/* **************************************** */
+/* space_nla.c / nla_buttons.c */
+
+ARegion *nla_has_buttons_region(ScrArea *sa);
+
+void nla_buttons_register(ARegionType *art);
+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);
+
+/* **************************************** */
/* nla_header.c */
+
void nla_header_buttons(const bContext *C, ARegion *ar);
+/* **************************************** */
+/* nla_select.c */
+
+/* defines for left-right select tool */
+enum {
+ NLAEDIT_LRSEL_TEST = -1,
+ NLAEDIT_LRSEL_NONE,
+ NLAEDIT_LRSEL_LEFT,
+ NLAEDIT_LRSEL_RIGHT,
+} eNlaEdit_LeftRightSelect_Mode;
+
+/* --- */
+
+void NLA_OT_select_all_toggle(wmOperatorType *ot);
+void NLA_OT_select_border(wmOperatorType *ot);
+void NLA_OT_click_select(wmOperatorType *ot);
+
+/* **************************************** */
+/* nla_edit.c */
+
+/* defines for snap strips
+ */
+enum {
+ NLAEDIT_SNAP_CFRA = 1,
+ NLAEDIT_SNAP_NEAREST_FRAME,
+ NLAEDIT_SNAP_NEAREST_SECOND,
+ NLAEDIT_SNAP_NEAREST_MARKER,
+} eNlaEdit_Snap_Mode;
+
+/* --- */
+
+void NLA_OT_tweakmode_enter(wmOperatorType *ot);
+void NLA_OT_tweakmode_exit(wmOperatorType *ot);
+
+/* --- */
+
+void NLA_OT_add_actionclip(wmOperatorType *ot);
+void NLA_OT_add_transition(wmOperatorType *ot);
+
+void NLA_OT_add_meta(wmOperatorType *ot);
+void NLA_OT_remove_meta(wmOperatorType *ot);
+
+void NLA_OT_duplicate(wmOperatorType *ot);
+void NLA_OT_delete(wmOperatorType *ot);
+void NLA_OT_split(wmOperatorType *ot);
+
+void NLA_OT_mute_toggle(wmOperatorType *ot);
+
+void NLA_OT_move_up(wmOperatorType *ot);
+void NLA_OT_move_down(wmOperatorType *ot);
+
+void NLA_OT_apply_scale(wmOperatorType *ot);
+void NLA_OT_clear_scale(wmOperatorType *ot);
+
+void NLA_OT_snap(wmOperatorType *ot);
+
+void NLA_OT_fmodifier_add(wmOperatorType *ot);
+
+
+/* **************************************** */
+/* nla_channels.c */
+
+void NLA_OT_channels_click(wmOperatorType *ot);
+
+void NLA_OT_add_tracks(wmOperatorType *ot);
+void NLA_OT_delete_tracks(wmOperatorType *ot);
+
+/* **************************************** */
+/* nla_ops.c */
+
+int nlaop_poll_tweakmode_off(bContext *C);
+int nlaop_poll_tweakmode_on (bContext *C);
+
+short nlaedit_is_tweakmode_on(bAnimContext *ac);
+
+/* --- */
+
+void nla_operatortypes(void);
+void nla_keymap(wmWindowManager *wm);
#endif /* ED_NLA_INTERN_H */
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
new file mode 100644
index 00000000000..5ea2e99ad6a
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -0,0 +1,307 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
+
+#include "ED_anim_api.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "RNA_access.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h" // own include
+
+/* ************************** poll callbacks for operators **********************************/
+
+/* tweakmode is NOT enabled */
+int nlaop_poll_tweakmode_off (bContext *C)
+{
+ Scene *scene;
+
+ /* for now, we check 2 things:
+ * 1) active editor must be NLA
+ * 2) tweakmode is currently set as a 'per-scene' flag
+ * so that it will affect entire NLA data-sets,
+ * but not all AnimData blocks will be in tweakmode for
+ * various reasons
+ */
+ if (ED_operator_nla_active(C) == 0)
+ return 0;
+
+ scene= CTX_data_scene(C);
+ if ((scene == NULL) || (scene->flag & SCE_NLA_EDIT_ON))
+ return 0;
+
+ return 1;
+}
+
+/* tweakmode IS enabled */
+int nlaop_poll_tweakmode_on (bContext *C)
+{
+ Scene *scene;
+
+ /* for now, we check 2 things:
+ * 1) active editor must be NLA
+ * 2) tweakmode is currently set as a 'per-scene' flag
+ * so that it will affect entire NLA data-sets,
+ * but not all AnimData blocks will be in tweakmode for
+ * various reasons
+ */
+ if (ED_operator_nla_active(C) == 0)
+ return 0;
+
+ scene= CTX_data_scene(C);
+ if ((scene == NULL) || !(scene->flag & SCE_NLA_EDIT_ON))
+ return 0;
+
+ return 1;
+}
+
+/* is tweakmode enabled - for use in NLA operator code */
+short nlaedit_is_tweakmode_on (bAnimContext *ac)
+{
+ if (ac && ac->scene)
+ return (ac->scene->flag & SCE_NLA_EDIT_ON);
+ return 0;
+}
+
+/* ************************** registration - operator types **********************************/
+
+void nla_operatortypes(void)
+{
+ /* view */
+ WM_operatortype_append(NLA_OT_properties);
+
+ /* channels */
+ WM_operatortype_append(NLA_OT_channels_click);
+
+ WM_operatortype_append(NLA_OT_add_tracks);
+ WM_operatortype_append(NLA_OT_delete_tracks);
+
+ /* select */
+ WM_operatortype_append(NLA_OT_click_select);
+ WM_operatortype_append(NLA_OT_select_border);
+ WM_operatortype_append(NLA_OT_select_all_toggle);
+
+ /* edit */
+ WM_operatortype_append(NLA_OT_tweakmode_enter);
+ WM_operatortype_append(NLA_OT_tweakmode_exit);
+
+ WM_operatortype_append(NLA_OT_add_actionclip);
+ WM_operatortype_append(NLA_OT_add_transition);
+
+ WM_operatortype_append(NLA_OT_add_meta);
+ WM_operatortype_append(NLA_OT_remove_meta);
+
+ WM_operatortype_append(NLA_OT_duplicate);
+ WM_operatortype_append(NLA_OT_delete);
+ WM_operatortype_append(NLA_OT_split);
+
+ WM_operatortype_append(NLA_OT_mute_toggle);
+
+ WM_operatortype_append(NLA_OT_move_up);
+ WM_operatortype_append(NLA_OT_move_down);
+
+ WM_operatortype_append(NLA_OT_apply_scale);
+ WM_operatortype_append(NLA_OT_clear_scale);
+
+ WM_operatortype_append(NLA_OT_snap);
+
+ WM_operatortype_append(NLA_OT_fmodifier_add);
+}
+
+/* ************************** registration - keymaps **********************************/
+
+static void nla_keymap_channels (wmWindowManager *wm, wmKeyMap *keymap)
+{
+ /* NLA-specific (different to standard channels keymap) -------------------------- */
+ /* selection */
+ /* click-select */
+ // XXX for now, only leftmouse....
+ WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1);
+
+ /* channel operations */
+ /* add tracks */
+ WM_keymap_add_item(keymap, "NLA_OT_add_tracks", AKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_add_tracks", AKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "above_selected", 1);
+
+ /* 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 (wmWindowManager *wm, wmKeyMap *keymap)
+{
+ wmKeymapItem *kmi;
+
+ /* selection */
+ /* click select */
+ WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "extend", 1);
+ kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "left_right", NLAEDIT_LRSEL_TEST);
+
+ /* deselect all */
+ WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
+
+ /* borderselect */
+ WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0)->ptr, "axis_range", 1);
+
+
+ /* editing */
+ /* tweakmode
+ * - enter and exit are separate operators with the same hotkey...
+ * This works as they use different poll()'s
+ */
+ WM_keymap_add_item(keymap, "NLA_OT_tweakmode_enter", TABKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "NLA_OT_tweakmode_exit", TABKEY, KM_PRESS, 0, 0);
+
+ /* add strips */
+ WM_keymap_add_item(keymap, "NLA_OT_add_actionclip", AKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NLA_OT_add_transition", TKEY, KM_PRESS, KM_SHIFT, 0);
+
+ /* meta-strips */
+ WM_keymap_add_item(keymap, "NLA_OT_add_meta", GKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NLA_OT_remove_meta", GKEY, KM_PRESS, KM_ALT, 0);
+
+ /* duplicate */
+ WM_keymap_add_item(keymap, "NLA_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+
+ /* delete */
+ WM_keymap_add_item(keymap, "NLA_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "NLA_OT_delete", DELKEY, KM_PRESS, 0, 0);
+
+ /* split */
+ WM_keymap_add_item(keymap, "NLA_OT_split", YKEY, KM_PRESS, 0, 0);
+
+ /* toggles */
+ WM_keymap_add_item(keymap, "NLA_OT_mute_toggle", HKEY, KM_PRESS, 0, 0);
+
+ /* move up */
+ WM_keymap_add_item(keymap, "NLA_OT_move_up", PAGEUPKEY, KM_PRESS, 0, 0);
+ /* move down */
+ WM_keymap_add_item(keymap, "NLA_OT_move_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
+
+ /* apply scale */
+ WM_keymap_add_item(keymap, "NLA_OT_apply_scale", AKEY, KM_PRESS, KM_CTRL, 0);
+ /* clear scale */
+ WM_keymap_add_item(keymap, "NLA_OT_clear_scale", SKEY, KM_PRESS, KM_ALT, 0);
+
+ /* snap */
+ WM_keymap_add_item(keymap, "NLA_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+
+ /* add f-modifier */
+ WM_keymap_add_item(keymap, "NLA_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+
+ /* transform system */
+ transform_keymap_for_space(wm, keymap, SPACE_NLA);
+}
+
+/* --------------- */
+
+void nla_keymap(wmWindowManager *wm)
+{
+ wmKeyMap *keymap;
+
+ /* keymap for all regions */
+ keymap= WM_keymap_find(wm, "NLA Generic", SPACE_NLA, 0);
+ WM_keymap_add_item(keymap, "NLA_OT_properties", NKEY, KM_PRESS, 0, 0);
+
+ /* channels */
+ /* Channels are not directly handled by the NLA Editor module, but are inherited from the Animation module.
+ * Most of the relevant operations, keymaps, drawing, etc. can therefore all be found in that module instead, as there
+ * are many similarities with the other Animation Editors.
+ *
+ * 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(wm, "NLA Channels", SPACE_NLA, 0);
+ nla_keymap_channels(wm, keymap);
+
+ /* data */
+ keymap= WM_keymap_find(wm, "NLA Data", SPACE_NLA, 0);
+ nla_keymap_main(wm, keymap);
+}
+
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
new file mode 100644
index 00000000000..dd9ef2621c5
--- /dev/null
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -0,0 +1,614 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung (major recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_object_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_windowmanager_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_screen.h"
+
+#include "ED_anim_api.h"
+#include "ED_keyframes_edit.h"
+#include "ED_markers.h"
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_view2d.h"
+
+#include "nla_intern.h" // own include
+
+/* ******************** Utilities ***************************************** */
+
+/* Convert SELECT_* flags to ACHANNEL_SETFLAG_* flags */
+static short selmodes_to_flagmodes (short sel)
+{
+ /* convert selection modes to selection modes */
+ switch (sel) {
+ case SELECT_SUBTRACT:
+ return ACHANNEL_SETFLAG_CLEAR;
+ break;
+
+ case SELECT_INVERT:
+ return ACHANNEL_SETFLAG_TOGGLE;
+ break;
+
+ case SELECT_ADD:
+ default:
+ return ACHANNEL_SETFLAG_ADD;
+ break;
+ }
+}
+
+
+/* ******************** Deselect All Operator ***************************** */
+/* This operator works in one of three ways:
+ * 1) (de)select all (AKEY) - test if select all or deselect all
+ * 2) invert all (CTRL-IKEY) - invert selection of all keyframes
+ * 3) (de)select all - no testing is done; only for use internal tools as normal function...
+ */
+
+enum {
+ DESELECT_STRIPS_NOTEST = 0,
+ DESELECT_STRIPS_TEST,
+ DESELECT_STRIPS_CLEARACTIVE,
+} eDeselectNlaStrips;
+
+/* Deselects strips in the NLA Editor
+ * - This is called by the deselect all operator, as well as other ones!
+ *
+ * - test: check if select or deselect all (1) or clear all active (2)
+ * - sel: how to select keyframes
+ * 0 = deselect
+ * 1 = select
+ * 2 = invert
+ */
+static void deselect_nla_strips (bAnimContext *ac, short test, short sel)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+ short smode;
+
+ /* determine type-based settings */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
+
+ /* filter data */
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* See if we should be selecting or deselecting */
+ if (test == DESELECT_STRIPS_TEST) {
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* if any strip is selected, break out, since we should now be deselecting */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ sel= SELECT_SUBTRACT;
+ break;
+ }
+ }
+
+ if (sel == SELECT_SUBTRACT)
+ break;
+ }
+ }
+
+ /* convert selection modes to selection modes */
+ smode= selmodes_to_flagmodes(sel);
+
+ /* Now set the flags */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* apply same selection to all strips */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ /* set selection */
+ if (test != DESELECT_STRIPS_CLEARACTIVE)
+ ACHANNEL_SET_FLAG(strip, smode, NLASTRIP_FLAG_SELECT);
+
+ /* clear active flag */
+ // TODO: for clear active, do we want to limit this to only doing this on a certain set of tracks though?
+ strip->flag &= ~NLASTRIP_FLAG_ACTIVE;
+ }
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int nlaedit_deselectall_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* 'standard' behaviour - check if selected, then apply relevant selection */
+ if (RNA_boolean_get(op->ptr, "invert"))
+ deselect_nla_strips(&ac, DESELECT_STRIPS_NOTEST, SELECT_INVERT);
+ else
+ deselect_nla_strips(&ac, DESELECT_STRIPS_TEST, SELECT_ADD);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_select_all_toggle (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select All";
+ ot->idname= "NLA_OT_select_all_toggle";
+
+ /* api callbacks */
+ ot->exec= nlaedit_deselectall_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
+
+ /* props */
+ RNA_def_boolean(ot->srna, "invert", 0, "Invert", "");
+}
+
+/* ******************** Border Select Operator **************************** */
+/* This operator currently works in one of three ways:
+ * -> BKEY - 1) all strips within region are selected (ACTKEYS_BORDERSEL_ALLSTRIPS)
+ * -> ALT-BKEY - depending on which axis of the region was larger...
+ * -> 2) x-axis, so select all frames within frame range (ACTKEYS_BORDERSEL_FRAMERANGE)
+ * -> 3) y-axis, so select all frames within channels that region included (ACTKEYS_BORDERSEL_CHANNELS)
+ */
+
+/* defines for borderselect mode */
+enum {
+ NLA_BORDERSEL_ALLSTRIPS = 0,
+ NLA_BORDERSEL_FRAMERANGE,
+ NLA_BORDERSEL_CHANNELS,
+} eActKeys_BorderSelect_Mode;
+
+
+static void borderselect_nla_strips (bAnimContext *ac, rcti rect, short mode, short selectmode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ View2D *v2d= &ac->ar->v2d;
+ rctf rectf;
+ float ymin=(float)(-NLACHANNEL_HEIGHT), ymax=0;
+
+ /* convert border-region to view coordinates */
+ UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin+2, &rectf.xmin, &rectf.ymin);
+ UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax-2, &rectf.xmax, &rectf.ymax);
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* convert selection modes to selection modes */
+ selectmode= selmodes_to_flagmodes(selectmode);
+
+ /* loop over data, doing border select */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ ymin= ymax - NLACHANNEL_STEP;
+
+ /* perform vertical suitability check (if applicable) */
+ if ( (mode == NLA_BORDERSEL_FRAMERANGE) ||
+ !((ymax < rectf.ymin) || (ymin > rectf.ymax)) )
+ {
+ /* loop over data selecting (only if NLA-Track) */
+ if (ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* only select strips if they fall within the required ranges (if applicable) */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if ( (mode == NLA_BORDERSEL_CHANNELS) ||
+ BKE_nlastrip_within_bounds(strip, rectf.xmin, rectf.xmax) )
+ {
+ /* set selection */
+ ACHANNEL_SET_FLAG(strip, selectmode, NLASTRIP_FLAG_SELECT);
+
+ /* clear active flag */
+ strip->flag &= ~NLASTRIP_FLAG_ACTIVE;
+ }
+ }
+ }
+ }
+
+ /* set minimum extent to be the maximum of the next channel */
+ ymax= ymin;
+ }
+
+ /* cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+static int nlaedit_borderselect_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ rcti rect;
+ short mode=0, selectmode=0;
+ int event;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get settings from operator */
+ 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");
+
+ event= RNA_int_get(op->ptr, "event_type");
+ if (event == LEFTMOUSE) // FIXME... hardcoded
+ selectmode = SELECT_ADD;
+ else
+ selectmode = SELECT_SUBTRACT;
+
+ /* selection 'mode' depends on whether borderselect region only matters on one axis */
+ if (RNA_boolean_get(op->ptr, "axis_range")) {
+ /* mode depends on which axis of the range is larger to determine which axis to use
+ * - checking this in region-space is fine, as it's fundamentally still going to be a different rect size
+ * - the frame-range select option is favoured over the channel one (x over y), as frame-range one is often
+ * used for tweaking timing when "blocking", while channels is not that useful...
+ */
+ if ((rect.xmax - rect.xmin) >= (rect.ymax - rect.ymin))
+ mode= NLA_BORDERSEL_FRAMERANGE;
+ else
+ mode= NLA_BORDERSEL_CHANNELS;
+ }
+ else
+ mode= NLA_BORDERSEL_ALLSTRIPS;
+
+ /* apply borderselect action */
+ borderselect_nla_strips(&ac, rect, mode, selectmode);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_select_border(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Border Select";
+ ot->idname= "NLA_OT_select_border";
+
+ /* api callbacks */
+ ot->invoke= WM_border_select_invoke;
+ ot->exec= nlaedit_borderselect_exec;
+ ot->modal= WM_border_select_modal;
+
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* rna */
+ RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
+
+ RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
+}
+
+/* ******************** Mouse-Click Select Operator *********************** */
+/* This operator works in one of 2 ways:
+ * 1) Select the strip directly under the mouse
+ * 2) Select all the strips to one side of the mouse
+ */
+
+/* defines for left-right select tool */
+static EnumPropertyItem prop_nlaedit_leftright_select_types[] = {
+ {NLAEDIT_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""},
+ {NLAEDIT_LRSEL_NONE, "OFF", 0, "Don't select", ""},
+ {NLAEDIT_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""},
+ {NLAEDIT_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+/* sensitivity factor for frame-selections */
+#define FRAME_CLICK_THRESH 0.1f
+
+
+/* ------------------- */
+
+/* option 1) select strip directly under mouse */
+static void mouse_nla_strips (bContext *C, bAnimContext *ac, int mval[2], short select_mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale = NULL;
+ int filter;
+
+ View2D *v2d= &ac->ar->v2d;
+ Scene *scene= ac->scene;
+ NlaStrip *strip = NULL;
+ int channel_index;
+ float xmin, xmax, dummy;
+ float x, y;
+
+
+ /* use View2D to determine the index of the channel (i.e a row in the list) where keyframe was */
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
+ UI_view2d_listview_view_to_cell(v2d, 0, NLACHANNEL_STEP, 0, (float)NLACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+
+ /* x-range to check is +/- 7 (in screen/region-space) on either side of mouse click
+ * (that is the size of keyframe icons, so user should be expecting similar tolerances)
+ */
+ UI_view2d_region_to_view(v2d, mval[0]-7, mval[1], &xmin, &dummy);
+ UI_view2d_region_to_view(v2d, mval[0]+7, mval[1], &xmax, &dummy);
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* try to get channel */
+ ale= BLI_findlink(&anim_data, channel_index);
+ if (ale == NULL) {
+ /* channel not found */
+ printf("Error: animation channel (index = %d) not found in mouse_nla_strips() \n", channel_index);
+ BLI_freelistN(&anim_data);
+ return;
+ }
+ else {
+ /* found some channel - we only really should do somethign when its an Nla-Track */
+ if (ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* loop over NLA-strips in this track, trying to find one which occurs in the necessary bounds */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (BKE_nlastrip_within_bounds(strip, xmin, xmax))
+ break;
+ }
+ }
+
+ /* remove active channel from list of channels for separate treatment (since it's needed later on) */
+ BLI_remlink(&anim_data, ale);
+
+ /* free list of channels, since it's not used anymore */
+ BLI_freelistN(&anim_data);
+ }
+
+ /* if currently in tweakmode, exit tweakmode before changing selection states
+ * now that we've found our target...
+ */
+ if (scene->flag & SCE_NLA_EDIT_ON)
+ WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL);
+
+ /* for replacing selection, firstly need to clear existing selection */
+ if (select_mode == SELECT_REPLACE) {
+ /* reset selection mode for next steps */
+ select_mode = SELECT_ADD;
+
+ /* deselect all strips */
+ deselect_nla_strips(ac, 0, SELECT_SUBTRACT);
+
+ /* deselect all other channels first */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+
+ /* Highlight NLA-Track */
+ if (ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ nlt->flag |= NLATRACK_SELECTED;
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nlt, ANIMTYPE_NLATRACK);
+ }
+ }
+
+ /* only select strip if we clicked on a valid channel and hit something */
+ if (ale) {
+ /* select the strip accordingly (if a matching one was found) */
+ if (strip) {
+ select_mode= selmodes_to_flagmodes(select_mode);
+ ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT);
+
+ /* if we selected it, we can make it active too
+ * - we always need to clear the active strip flag though...
+ */
+ deselect_nla_strips(ac, DESELECT_STRIPS_CLEARACTIVE, 0);
+ if (strip->flag & NLASTRIP_FLAG_SELECT)
+ strip->flag |= NLASTRIP_FLAG_ACTIVE;
+ }
+
+ /* free this channel */
+ MEM_freeN(ale);
+ }
+}
+
+/* Option 2) Selects all the strips on either side of the current frame (depends on which side the mouse is on) */
+static void nlaedit_mselect_leftright (bContext *C, bAnimContext *ac, short leftright, short select_mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene= ac->scene;
+ float xmin, xmax;
+
+ /* if currently in tweakmode, exit tweakmode first */
+ if (scene->flag & SCE_NLA_EDIT_ON)
+ WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL);
+
+ /* if select mode is replace, deselect all keyframes (and channels) first */
+ if (select_mode==SELECT_REPLACE) {
+ select_mode= SELECT_ADD;
+
+ /* deselect all other channels and keyframes */
+ ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ deselect_nla_strips(ac, 0, SELECT_SUBTRACT);
+ }
+
+ /* get range, and get the right flag-setting mode */
+ if (leftright == NLAEDIT_LRSEL_LEFT) {
+ xmin = MINAFRAMEF;
+ xmax = (float)(CFRA + FRAME_CLICK_THRESH);
+ }
+ else {
+ xmin = (float)(CFRA - FRAME_CLICK_THRESH);
+ xmax = MAXFRAMEF;
+ }
+
+ select_mode= selmodes_to_flagmodes(select_mode);
+
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* select strips on the side where most data occurs */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* check each strip to see if it is appropriate */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) {
+ ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT);
+ }
+ }
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* ------------------- */
+
+/* handle clicking */
+static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ bAnimContext ac;
+ Scene *scene;
+ ARegion *ar;
+ View2D *v2d;
+ short selectmode;
+ int mval[2];
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get useful pointers from animation context data */
+ scene= ac.scene;
+ ar= ac.ar;
+ v2d= &ar->v2d;
+
+ /* get mouse coordinates (in region coordinates) */
+ mval[0]= (event->x - ar->winrct.xmin);
+ mval[1]= (event->y - ar->winrct.ymin);
+
+ /* select mode is either replace (deselect all, then add) or add/extend */
+ if (RNA_boolean_get(op->ptr, "extend"))
+ selectmode= SELECT_INVERT;
+ else
+ selectmode= SELECT_REPLACE;
+
+ /* figure out action to take */
+ if (RNA_enum_get(op->ptr, "left_right")) {
+ /* select all keys on same side of current frame as mouse */
+ float x;
+
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
+ if (x < CFRA)
+ RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_LEFT);
+ else
+ RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_RIGHT);
+
+ nlaedit_mselect_leftright(C, &ac, RNA_enum_get(op->ptr, "left_right"), selectmode);
+ }
+ else {
+ /* select strips based upon mouse position */
+ mouse_nla_strips(C, &ac, mval, selectmode);
+ }
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_SELECT, NULL);
+
+ /* for tweak grab to work */
+ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
+}
+
+void NLA_OT_click_select (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Mouse Select";
+ ot->idname= "NLA_OT_click_select";
+
+ /* api callbacks - absolutely no exec() this yet... */
+ ot->invoke= nlaedit_clickselect_invoke;
+ ot->poll= ED_operator_nla_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ // XXX should we make this into separate operators?
+ RNA_def_enum(ot->srna, "left_right", prop_nlaedit_leftright_select_types, 0, "Left Right", ""); // CTRLKEY
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
+}
+
+/* *********************************************** */
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index 6e1a97dea34..41435810889 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <stdio.h>
+#include "DNA_anim_types.h"
#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
@@ -41,10 +42,16 @@
#include "BLI_arithb.h"
#include "BLI_rand.h"
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "BKE_nla.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+#include "ED_anim_api.h"
+#include "ED_markers.h"
#include "ED_space_api.h"
#include "ED_screen.h"
@@ -57,20 +64,58 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#include "ED_markers.h"
-
#include "nla_intern.h" // own include
+/* ******************** manage regions ********************* */
+
+ARegion *nla_has_buttons_region(ScrArea *sa)
+{
+ ARegion *ar, *arnew;
+
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype==RGN_TYPE_UI)
+ return ar;
+ }
+
+ /* add subdiv level; after main */
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype==RGN_TYPE_WINDOW)
+ break;
+ }
+
+ /* is error! */
+ if (ar==NULL) return NULL;
+
+ arnew= MEM_callocN(sizeof(ARegion), "buttons for nla");
+
+ BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+ arnew->regiontype= RGN_TYPE_UI;
+ arnew->alignment= RGN_ALIGN_RIGHT;
+
+ arnew->flag = RGN_FLAG_HIDDEN;
+
+ return arnew;
+}
+
+
+
/* ******************** default callbacks for nla space ***************** */
static SpaceLink *nla_new(const bContext *C)
{
+ Scene *scene= CTX_data_scene(C);
ARegion *ar;
SpaceNla *snla;
snla= MEM_callocN(sizeof(SpaceNla), "initnla");
snla->spacetype= SPACE_NLA;
+ /* allocate DopeSheet data for NLA Editor */
+ snla->ads= MEM_callocN(sizeof(bDopeSheet), "NlaEdit DopeSheet");
+
+ /* set auto-snapping settings */
+ snla->autosnap = SACTSNAP_FRAME;
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for nla");
@@ -78,13 +123,23 @@ static SpaceLink *nla_new(const bContext *C)
ar->regiontype= RGN_TYPE_HEADER;
ar->alignment= RGN_ALIGN_BOTTOM;
- /* channel list region XXX */
- ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
+ /* channel list region */
+ ar= MEM_callocN(sizeof(ARegion), "channel list for nla");
BLI_addtail(&snla->regionbase, ar);
ar->regiontype= RGN_TYPE_CHANNELS;
ar->alignment= RGN_ALIGN_LEFT;
- ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+ /* only need to set these settings since this will use the 'stack' configuration */
+ ar->v2d.scroll = V2D_SCROLL_BOTTOM;
+ ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
+
+ /* ui buttons */
+ ar= MEM_callocN(sizeof(ARegion), "buttons area for nla");
+
+ BLI_addtail(&snla->regionbase, ar);
+ ar->regiontype= RGN_TYPE_UI;
+ ar->alignment= RGN_ALIGN_RIGHT;
+ ar->flag = RGN_FLAG_HIDDEN;
/* main area */
ar= MEM_callocN(sizeof(ARegion), "main area for nla");
@@ -92,29 +147,26 @@ static SpaceLink *nla_new(const bContext *C)
BLI_addtail(&snla->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
- ar->v2d.tot.xmin= 1.0f;
- ar->v2d.tot.ymin= 0.0f;
- ar->v2d.tot.xmax= 1000.0f;
- ar->v2d.tot.ymax= 1000.0f;
+ ar->v2d.tot.xmin= (float)(SFRA-10);
+ ar->v2d.tot.ymin= -500.0f;
+ ar->v2d.tot.xmax= (float)(EFRA+10);
+ ar->v2d.tot.ymax= 0.0f;
- ar->v2d.cur.xmin= -5.0f;
- ar->v2d.cur.ymin= 0.0f;
- ar->v2d.cur.xmax= 65.0f;
- ar->v2d.cur.ymax= 1000.0f;
+ 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]= 1000.0f;
-
- ar->v2d.minzoom= 0.1f;
- ar->v2d.maxzoom= 50.0f;
-
- ar->v2d.scroll |= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
+ 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.align= V2D_ALIGN_NO_POS_Y;
+ ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
return (SpaceLink *)snla;
}
@@ -122,15 +174,25 @@ static SpaceLink *nla_new(const bContext *C)
/* not spacelink itself */
static void nla_free(SpaceLink *sl)
{
-// SpaceNla *snla= (SpaceNla*) sl;
+ SpaceNla *snla= (SpaceNla*) sl;
+ if (snla->ads) {
+ BLI_freelistN(&snla->ads->chanbase);
+ MEM_freeN(snla->ads);
+ }
}
/* spacetype; init callback */
static void nla_init(struct wmWindowManager *wm, ScrArea *sa)
{
+ SpaceNla *snla= (SpaceNla *)sa->spacedata.first;
+
+ /* init dopesheet data if non-existant (i.e. for old files) */
+ if (snla->ads == NULL)
+ snla->ads= MEM_callocN(sizeof(bDopeSheet), "NlaEdit DopeSheet");
+ ED_area_tag_refresh(sa);
}
static SpaceLink *nla_duplicate(SpaceLink *sl)
@@ -138,15 +200,33 @@ static SpaceLink *nla_duplicate(SpaceLink *sl)
SpaceNla *snlan= MEM_dupallocN(sl);
/* clear or remove stuff from old */
+ snlan->ads= MEM_dupallocN(snlan->ads);
return (SpaceLink *)snlan;
}
+/* add handlers, stuff you only do once or on area/region changes */
+static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar)
+{
+ wmKeyMap *keymap;
+
+ UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
+
+ /* own keymap */
+ // TODO: cannot use generic copy, need special NLA version
+ keymap= WM_keymap_find(wm, "NLA Channels", SPACE_NLA, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ keymap= WM_keymap_find(wm, "NLA Generic", SPACE_NLA, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+}
+
+/* draw entirely, view changes should be handled here */
static void nla_channel_area_draw(const bContext *C, ARegion *ar)
{
- /* draw entirely, view changes should be handled here */
- // SpaceNla *snla= (SpaceNla*)CTX_wm_space_data(C);
- // View2D *v2d= &ar->v2d;
+ SpaceNla *snla= CTX_wm_space_nla(C);
+ bAnimContext ac;
+ View2D *v2d= &ar->v2d;
+ View2DScrollers *scrollers;
float col[3];
/* clear and setup matrix */
@@ -154,36 +234,47 @@ static void nla_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);
-
- /* data... */
+ UI_view2d_view_ortho(C, v2d);
+ /* data */
+ if (ANIM_animdata_get_context(C, &ac)) {
+ draw_nla_channel_list((bContext *)C, &ac, snla, ar);
+ }
/* reset view matrix */
- //UI_view2d_view_restore(C);
+ UI_view2d_view_restore(C);
- /* scrollers? */
+ /* scrollers */
+ scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ UI_view2d_scrollers_draw(C, v2d, scrollers);
+ UI_view2d_scrollers_free(scrollers);
}
/* add handlers, stuff you only do once or on area/region changes */
static void nla_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "NLA", SPACE_NLA, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "NLA Data", SPACE_NLA, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ keymap= WM_keymap_find(wm, "NLA Generic", SPACE_NLA, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void nla_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- // SpaceNla *snla= (SpaceNla*)CTX_wm_space_data(C);
+ SpaceNla *snla= CTX_wm_space_nla(C);
+ bAnimContext ac;
View2D *v2d= &ar->v2d;
+ View2DGrid *grid;
+ View2DScrollers *scrollers;
float col[3];
+ short unit=0, flag=0;
/* clear and setup matrix */
UI_GetThemeColor3fv(TH_BACK, col);
@@ -191,25 +282,46 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
UI_view2d_view_ortho(C, 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);
+ UI_view2d_grid_free(grid);
+
+ /* data */
+ if (ANIM_animdata_get_context(C, &ac)) {
+ /* strips and backdrops */
+ draw_nla_main_data(&ac, snla, ar);
- /* data... */
+ /* text draw cached, in pixelspace now */
+ UI_view2d_text_cache_draw(ar);
+ }
+ UI_view2d_view_ortho(C, v2d);
+
+ /* current frame */
+ if (snla->flag & SNLA_DRAWTIME) flag |= DRAWCFRA_UNIT_SECONDS;
+ if ((snla->flag & SNLA_NODRAWCFRANUM)==0) flag |= DRAWCFRA_SHOW_NUMBOX;
+ ANIM_draw_cfra(C, v2d, flag);
+
+ /* markers */
+ UI_view2d_view_orthoSpecial(C, v2d, 1);
+ draw_markers_time(C, 0);
+
+ /* preview range */
+ UI_view2d_view_ortho(C, v2d);
+ ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
UI_view2d_view_restore(C);
- /* scrollers? */
+ /* scrollers */
+ scrollers= UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+ UI_view2d_scrollers_draw(C, v2d, scrollers);
+ UI_view2d_scrollers_free(scrollers);
}
-void nla_operatortypes(void)
-{
-
-}
-
-void nla_keymap(struct wmWindowManager *wm)
-{
-
-}
/* add handlers, stuff you only do once or on area/region changes */
static void nla_header_area_init(wmWindowManager *wm, ARegion *ar)
@@ -239,9 +351,149 @@ static void nla_header_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
+/* add handlers, stuff you only do once or on area/region changes */
+static void nla_buttons_area_init(wmWindowManager *wm, ARegion *ar)
+{
+ wmKeyMap *keymap;
+
+ ED_region_panels_init(wm, ar);
+
+ keymap= WM_keymap_find(wm, "NLA Generic", SPACE_NLA, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+}
+
+static void nla_buttons_area_draw(const bContext *C, ARegion *ar)
+{
+ ED_region_panels(C, ar, 1, NULL, -1);
+}
+
+static void nla_region_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_OB_ACTIVE:
+ case ND_FRAME:
+ case ND_MARKERS:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_OBJECT:
+ switch(wmn->data) {
+ case ND_BONE_ACTIVE:
+ case ND_BONE_SELECT:
+ case ND_KEYS:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ default:
+ if(wmn->data==ND_KEYS)
+ ED_region_tag_redraw(ar);
+ break;
+ }
+}
+
+
static void nla_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
+ switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_RENDER_OPTIONS:
+ case ND_OB_ACTIVE:
+ case ND_FRAME:
+ case ND_MARKERS:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_OBJECT:
+ switch(wmn->data) {
+ case ND_BONE_ACTIVE:
+ case ND_BONE_SELECT:
+ case ND_KEYS:
+ case ND_TRANSFORM:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ default:
+ if(wmn->data==ND_KEYS)
+ ED_region_tag_redraw(ar);
+ }
+}
+
+static void nla_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_OB_ACTIVE:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_OBJECT:
+ switch(wmn->data) {
+ case ND_BONE_ACTIVE:
+ case ND_BONE_SELECT:
+ case ND_KEYS:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ default:
+ if(wmn->data==ND_KEYS)
+ ED_region_tag_redraw(ar);
+ }
+}
+
+/* editor level listener */
+static void nla_listener(ScrArea *sa, wmNotifier *wmn)
+{
+ /* context changes */
+ switch (wmn->category) {
+ case NC_ANIMATION:
+ // TODO: filter specific types of changes?
+ ED_area_tag_refresh(sa);
+ break;
+ case NC_SCENE:
+ /*switch (wmn->data) {
+ case ND_OB_ACTIVE:
+ case ND_OB_SELECT:
+ ED_area_tag_refresh(sa);
+ break;
+ }*/
+ ED_area_tag_refresh(sa);
+ break;
+ case NC_OBJECT:
+ /*switch (wmn->data) {
+ case ND_BONE_SELECT:
+ case ND_BONE_ACTIVE:
+ ED_area_tag_refresh(sa);
+ break;
+ }*/
+ ED_area_tag_refresh(sa);
+ break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_NLA)
+ ED_area_tag_redraw(sa);
+ break;
+ }
}
/* only called once, from space/spacetypes.c */
@@ -257,6 +509,7 @@ void ED_spacetype_nla(void)
st->init= nla_init;
st->duplicate= nla_duplicate;
st->operatortypes= nla_operatortypes;
+ st->listener= nla_listener;
st->keymap= nla_keymap;
/* regions: main window */
@@ -265,7 +518,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_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
@@ -286,10 +539,24 @@ void ED_spacetype_nla(void)
art->minsizex= 200;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
- //art->init= nla_channel_area_init;
+ art->init= nla_channel_area_init;
art->draw= nla_channel_area_draw;
+ art->listener= nla_channel_area_listener;
+
+ BLI_addhead(&st->regiontypes, art);
+
+ /* regions: UI buttons */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype nla region");
+ art->regionid = RGN_TYPE_UI;
+ art->minsizex= 200;
+ art->keymapflag= ED_KEYMAP_UI;
+ art->listener= nla_region_listener;
+ art->init= nla_buttons_area_init;
+ art->draw= nla_buttons_area_draw;
BLI_addhead(&st->regiontypes, art);
+
+ nla_buttons_register(art);
BKE_spacetype_register(st);
diff --git a/source/blender/editors/space_node/SConscript b/source/blender/editors/space_node/SConscript
index ad57970950d..5453aa7dd44 100644
--- a/source/blender/editors/space_node/SConscript
+++ b/source/blender/editors/space_node/SConscript
@@ -8,7 +8,7 @@ incs += ' ../../nodes ../../render/extern/include'
incs += ' ../../windowmanager #intern/guardedalloc #extern/glew/include'
defs = []
cf = []
-if env['OURPLATFORM'] == 'win32-vc':
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
#cf.append('/WX')
pass
if env['CC'] == 'gcc':
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 50cf193f37b..f42bf97bf1a 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): David Millan Escriva, Juho Vepsäläinen
+ * Contributor(s): David Millan Escriva, Juho Vepsäläinen, Bob Holcomb, Thomas Dinges
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -170,9 +170,13 @@ static void node_group_alone_cb(bContext *C, void *node_v, void *unused_v)
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
-static int node_buts_group(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_group(uiLayout *layout, PointerRNA *ptr)
{
- if(block && node->id) {
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+
+ if(node->id) {
uiBut *bt;
short width;
@@ -197,112 +201,95 @@ static int node_buts_group(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *
uiBlockEndAlign(block);
}
- return 19;
}
#endif
-static int node_buts_value(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_value(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- bNodeSocket *sock= node->outputs.first; /* first socket stores value */
-
- uiDefButF(block, NUM, B_NODE_EXEC, "",
- (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin, 20,
- sock->ns.vec, sock->ns.min, sock->ns.max, 10, 2, "");
-
- }
- return 20;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ bNodeSocket *sock= node->outputs.first; /* first socket stores value */
+
+ uiDefButF(block, NUM, B_NODE_EXEC, "",
+ (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin, 20,
+ sock->ns.vec, sock->ns.min, sock->ns.max, 10, 2, "");
}
-static int node_buts_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_rgb(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- bNodeSocket *sock= node->outputs.first; /* first socket stores value */
- if(sock) {
- /* enforce square box drawing */
- uiBlockSetEmboss(block, UI_EMBOSSP);
-
- uiDefButF(block, HSVCUBE, B_NODE_EXEC, "",
- (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin, 12,
- sock->ns.vec, 0.0f, 1.0f, 3, 0, "");
- uiDefButF(block, HSVCUBE, B_NODE_EXEC, "",
- (short)butr->xmin, (short)butr->ymin+15, butr->xmax-butr->xmin, butr->ymax-butr->ymin -15 -15,
- sock->ns.vec, 0.0f, 1.0f, 2, 0, "");
- uiDefButF(block, COL, B_NOP, "",
- (short)butr->xmin, (short)butr->ymax-12, butr->xmax-butr->xmin, 12,
- sock->ns.vec, 0.0, 0.0, -1, 0, "");
- /* the -1 above prevents col button to popup a color picker */
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
- }
- return 30 + (int)(node->width-NODE_DY);
-}
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ bNodeSocket *sock= node->outputs.first; /* first socket stores value */
-static int node_buts_mix_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- uiBut *bt;
- int a_but= (ntree->type==NTREE_COMPOSIT);
+ if(sock) {
+ /* enforce square box drawing */
+ uiBlockSetEmboss(block, UI_EMBOSSP);
- /* blend type */
- uiBlockBeginAlign(block);
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Overlay %x9|Divide %x5|Difference %x6|Darken %x7|Lighten %x8|Dodge %x10|Burn %x11|Color %x15|Value %x14|Saturation %x13|Hue %x12",
- (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin -(a_but?20:0), 20,
- &node->custom1, 0, 0, 0, 0, "");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
- /* Alpha option, composite */
- if(a_but)
- uiDefButS(block, TOG, B_NODE_EXEC, "A",
- (short)butr->xmax-20, (short)butr->ymin, 20, 20,
- &node->custom2, 0, 0, 0, 0, "Include Alpha of 2nd input in this operation");
+ uiDefButF(block, HSVCUBE, B_NODE_EXEC, "",
+ (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin, 12,
+ sock->ns.vec, 0.0f, 1.0f, 3, 0, "");
+ uiDefButF(block, HSVCUBE, B_NODE_EXEC, "",
+ (short)butr->xmin, (short)butr->ymin+15, butr->xmax-butr->xmin, butr->xmax-butr->xmin -15 -15,
+ sock->ns.vec, 0.0f, 1.0f, 2, 0, "");
+ uiDefButF(block, COL, B_NOP, "",
+ (short)butr->xmin, (short)butr->ymax-12, butr->xmax-butr->xmin, 12,
+ sock->ns.vec, 0.0, 0.0, -1, 0, "");
+ /* the -1 above prevents col button to popup a color picker */
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
}
- return 20;
}
-static int node_buts_time(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_mix_rgb(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- CurveMapping *cumap= node->storage;
- short dx= (short)((butr->xmax-butr->xmin)/2);
- butr->ymin += 26;
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+ uiLayout *row;
- curvemap_buttons(block, node->storage, 's', B_NODE_EXEC, B_REDR, butr);
-
- if(cumap) {
- //cumap->flag |= CUMA_DRAW_CFRA;
- //if(node->custom1<node->custom2)
- // cumap->sample[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
- }
+ row= uiLayoutRow(layout, 1);
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_NODE_EXEC, "Sta:",
- (short)butr->xmin, (short)butr->ymin-22, dx, 19,
- &node->custom1, 1.0, 20000.0, 0, 0, "Start frame");
- uiDefButS(block, NUM, B_NODE_EXEC, "End:",
- (short)butr->xmin+dx, (short)butr->ymin-22, dx, 19,
- &node->custom2, 1.0, 20000.0, 0, 0, "End frame");
- }
+ uiItemR(row, "", 0, ptr, "blend_type", 0);
+ if(ntree->type == NTREE_COMPOSIT)
+ uiItemR(row, "", ICON_IMAGE_RGB_ALPHA, ptr, "alpha", 0);
+}
+
+static void node_buts_time(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *row;
+#if 0
+ /* XXX no context access here .. */
+ bNode *node= ptr->data;
+ CurveMapping *cumap= node->storage;
- return node->width-NODE_DY;
+ if(cumap) {
+ cumap->flag |= CUMA_DRAW_CFRA;
+ if(node->custom1<node->custom2)
+ cumap->sample[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
+ }
+#endif
+
+ uiTemplateCurveMapping(layout, ptr, "curve", 's', 0);
+
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, "Sta", 0, ptr, "start", 0);
+ uiItemR(row, "End", 0, ptr, "end", 0);
}
-static int node_buts_valtorgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_valtorgb(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- if(node->storage) {
- uiBlockColorbandButtons(block, node->storage, butr, B_NODE_EXEC);
- }
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+
+ if(node->storage) {
+ uiBlockColorbandButtons(block, node->storage, butr, B_NODE_EXEC);
}
- return 40;
}
-static int node_buts_curvevec(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_curvevec(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- curvemap_buttons(block, node->storage, 'v', B_NODE_EXEC, B_REDR, butr);
- }
- return (int)(node->width-NODE_DY);
+ uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0);
}
static float *_sample_col= NULL; // bad bad, 2.5 will do better?
@@ -311,33 +298,31 @@ void node_curvemap_sample(float *col)
_sample_col= col;
}
-static int node_buts_curvecol(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_curvecol(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- CurveMapping *cumap= node->storage;
- if(_sample_col) {
- cumap->flag |= CUMA_DRAW_SAMPLE;
- VECCOPY(cumap->sample, _sample_col);
- }
- else
- cumap->flag &= ~CUMA_DRAW_SAMPLE;
+ bNode *node= ptr->data;
+ CurveMapping *cumap= node->storage;
- curvemap_buttons(block, node->storage, 'c', B_NODE_EXEC, B_REDR, butr);
- }
- return (int)(node->width-NODE_DY);
+ if(_sample_col) {
+ cumap->flag |= CUMA_DRAW_SAMPLE;
+ VECCOPY(cumap->sample, _sample_col);
+ }
+ else
+ cumap->flag &= ~CUMA_DRAW_SAMPLE;
+
+ uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0);
}
-static int node_buts_normal(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_normal(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
-
- uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
- (short)butr->xmin, (short)butr->ymin, butr->xmax-butr->xmin, butr->ymax-butr->ymin,
- sock->ns.vec, 0.0f, 1.0f, 0, 0, "");
-
- }
- return (int)(node->width-NODE_DY);
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
+
+ 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, "");
}
static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
@@ -401,8 +386,13 @@ static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
// XXX BIF_preview_changed(ID_MA);
}
-static int node_buts_texture(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_texture(uiLayout *layout, PointerRNA *ptr)
{
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
+
short multi = (
node->id &&
((Tex*)node->id)->use_nodes &&
@@ -410,49 +400,44 @@ static int node_buts_texture(uiBlock *block, bNodeTree *ntree, bNode *node, rctf
(node->type != TEX_NODE_TEXTURE)
);
- if(block) {
- uiBut *bt;
- char *strp;
- short width = (short)(butr->xmax - butr->xmin);
-
- /* browse button texture */
- uiBlockBeginAlign(block);
- IDnames_to_pupstring(&strp, NULL, "", &(G.main->tex), NULL, NULL);
- node->menunr= 0;
- bt= uiDefButS(block, MENU, B_NODE_EXEC, strp,
- butr->xmin, butr->ymin+(multi?30:0), 20, 19,
- &node->menunr, 0, 0, 0, 0, "Browse texture");
- uiButSetFunc(bt, node_browse_tex_cb, ntree, node);
- if(strp) MEM_freeN(strp);
-
- if(node->id) {
- bt= uiDefBut(block, TEX, B_NOP, "TE:",
- butr->xmin+19, butr->ymin+(multi?30:0), butr->xmax-butr->xmin-19, 19,
- node->id->name+2, 0.0, 19.0, 0, 0, "Texture name");
- uiButSetFunc(bt, node_ID_title_cb, node, NULL);
- }
- uiBlockEndAlign(block);
-
- if(multi) {
- char *menustr = ntreeTexOutputMenu(((Tex*)node->id)->nodetree);
- uiDefButS(block, MENU, B_MATPRV, menustr, butr->xmin, butr->ymin, width, 19, &node->custom1, 0, 0, 0, 0, "Which output to use, for multi-output textures");
- free(menustr);
- return 50;
- }
- return 20;
- }
- else return multi? 50: 20;
+ uiBut *bt;
+ char *strp;
+ short width = (short)(butr->xmax - butr->xmin);
+
+ /* browse button texture */
+ uiBlockBeginAlign(block);
+ IDnames_to_pupstring(&strp, NULL, "", &(G.main->tex), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NODE_EXEC, strp,
+ butr->xmin, butr->ymin+(multi?30:0), 20, 19,
+ &node->menunr, 0, 0, 0, 0, "Browse texture");
+ uiButSetFunc(bt, node_browse_tex_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ if(node->id) {
+ bt= uiDefBut(block, TEX, B_NOP, "TE:",
+ butr->xmin+19, butr->ymin+(multi?30:0), butr->xmax-butr->xmin-19, 19,
+ node->id->name+2, 0.0, 19.0, 0, 0, "Texture name");
+ uiButSetFunc(bt, node_ID_title_cb, node, NULL);
+ }
+ uiBlockEndAlign(block);
+
+ if(multi) {
+ char *menustr = ntreeTexOutputMenu(((Tex*)node->id)->nodetree);
+ uiDefButS(block, MENU, B_MATPRV, menustr, butr->xmin, butr->ymin, width, 19, &node->custom1, 0, 0, 0, 0, "Which output to use, for multi-output textures");
+ free(menustr);
+ }
}
-static int node_buts_math(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_buts_math(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ uiBut *bt;
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Add %x0|Subtract %x1|Multiply %x2|Divide %x3|Sine %x4|Cosine %x5|Tangent %x6|Arcsine %x7|Arccosine %x8|Arctangent %x9|Power %x10|Logarithm %x11|Minimum %x12|Maximum %x13|Round %x14|Less Than %x15|Greater Than %x16", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, "");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
- }
- return 20;
+ bt=uiDefButS(block, MENU, B_NODE_EXEC, "Add %x0|Subtract %x1|Multiply %x2|Divide %x3|Sine %x4|Cosine %x5|Tangent %x6|Arcsine %x7|Arccosine %x8|Arctangent %x9|Power %x10|Logarithm %x11|Minimum %x12|Maximum %x13|Round %x14|Less Than %x15|Greater Than %x16", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, "");
+ uiButSetFunc(bt, node_but_title_cb, node, bt);
}
@@ -556,192 +541,192 @@ static void node_texmap_cb(bContext *C, void *texmap_v, void *unused_v)
init_mapping(texmap_v);
}
-static int node_shader_buts_material(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_shader_buts_material(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
- short dx= (short)((butr->xmax-butr->xmin)/3.0f), has_us= (node->id && node->id->us>1);
- short dy= (short)butr->ymin;
- char *strp;
-
- /* WATCH IT: we use this callback in material buttons, but then only want first row */
- if(butr->ymax-butr->ymin > 21.0f) dy+= 19;
-
- uiBlockBeginAlign(block);
- /* XXX
- if(node->id==NULL) uiBlockSetCol(block, TH_REDALERT);
- else if(has_us) uiBlockSetCol(block, TH_BUT_SETTING1);
- else uiBlockSetCol(block, TH_BUT_SETTING2);
- */
-
- /* browse button */
- IDnames_to_pupstring(&strp, NULL, "ADD NEW %x32767", &(G.main->mat), NULL, NULL);
- node->menunr= 0;
- bt= uiDefButS(block, MENU, B_NOP, strp,
- butr->xmin, dy, 19, 19,
- &node->menunr, 0, 0, 0, 0, "Browses existing choices or adds NEW");
- uiButSetFunc(bt, node_browse_mat_cb, ntree, node);
- if(strp) MEM_freeN(strp);
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
+ uiBut *bt;
+ short dx= (short)((butr->xmax-butr->xmin)/3.0f), has_us= (node->id && node->id->us>1);
+ short dy= (short)butr->ymin;
+ char *strp;
+
+ /* WATCH IT: we use this callback in material buttons, but then only want first row */
+ if(butr->ymax-butr->ymin > 21.0f) dy+= 19;
+
+ uiBlockBeginAlign(block);
+ /* XXX
+ if(node->id==NULL) uiBlockSetCol(block, TH_REDALERT);
+ else if(has_us) uiBlockSetCol(block, TH_BUT_SETTING1);
+ else uiBlockSetCol(block, TH_BUT_SETTING2);
+ */
+
+ /* browse button */
+ IDnames_to_pupstring(&strp, NULL, "ADD NEW %x32767", &(G.main->mat), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NOP, strp,
+ butr->xmin, dy, 19, 19,
+ &node->menunr, 0, 0, 0, 0, "Browses existing choices or adds NEW");
+ uiButSetFunc(bt, node_browse_mat_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ /* Add New button */
+ if(node->id==NULL) {
+ bt= uiDefBut(block, BUT, B_NOP, "Add New",
+ butr->xmin+19, dy, (short)(butr->xmax-butr->xmin-19.0f), 19,
+ NULL, 0.0, 0.0, 0, 0, "Add new Material");
+ uiButSetFunc(bt, node_new_mat_cb, ntree, node);
+ }
+ else {
+ /* name button */
+ short width= (short)(butr->xmax-butr->xmin-19.0f - (has_us?19.0f:0.0f));
+ bt= uiDefBut(block, TEX, B_NOP, "MA:",
+ butr->xmin+19, dy, width, 19,
+ node->id->name+2, 0.0, 19.0, 0, 0, "Material name");
+ uiButSetFunc(bt, node_ID_title_cb, node, NULL);
- /* Add New button */
- if(node->id==NULL) {
- bt= uiDefBut(block, BUT, B_NOP, "Add New",
- butr->xmin+19, dy, (short)(butr->xmax-butr->xmin-19.0f), 19,
- NULL, 0.0, 0.0, 0, 0, "Add new Material");
- uiButSetFunc(bt, node_new_mat_cb, ntree, node);
+ /* user amount */
+ if(has_us) {
+ char str1[32];
+ sprintf(str1, "%d", node->id->us);
+ bt= uiDefBut(block, BUT, B_NOP, str1,
+ butr->xmax-19, dy, 19, 19,
+ NULL, 0, 0, 0, 0, "Displays number of users. Click to make a single-user copy.");
+ uiButSetFunc(bt, node_mat_alone_cb, node, NULL);
}
- else {
- /* name button */
- short width= (short)(butr->xmax-butr->xmin-19.0f - (has_us?19.0f:0.0f));
- bt= uiDefBut(block, TEX, B_NOP, "MA:",
- butr->xmin+19, dy, width, 19,
- node->id->name+2, 0.0, 19.0, 0, 0, "Material name");
- uiButSetFunc(bt, node_ID_title_cb, node, NULL);
-
- /* user amount */
- if(has_us) {
- char str1[32];
- sprintf(str1, "%d", node->id->us);
- bt= uiDefBut(block, BUT, B_NOP, str1,
- butr->xmax-19, dy, 19, 19,
- NULL, 0, 0, 0, 0, "Displays number of users. Click to make a single-user copy.");
- uiButSetFunc(bt, node_mat_alone_cb, node, NULL);
- }
-
- /* WATCH IT: we use this callback in material buttons, but then only want first row */
- if(butr->ymax-butr->ymin > 21.0f) {
- /* node options */
- uiDefButBitS(block, TOG, SH_NODE_MAT_DIFF, B_NODE_EXEC, "Diff",
- butr->xmin, butr->ymin, dx, 19,
- &node->custom1, 0, 0, 0, 0, "Material Node outputs Diffuse");
- uiDefButBitS(block, TOG, SH_NODE_MAT_SPEC, B_NODE_EXEC, "Spec",
- butr->xmin+dx, butr->ymin, dx, 19,
- &node->custom1, 0, 0, 0, 0, "Material Node outputs Specular");
- uiDefButBitS(block, TOG, SH_NODE_MAT_NEG, B_NODE_EXEC, "Neg Normal",
- butr->xmax-dx, butr->ymin, dx, 19,
- &node->custom1, 0, 0, 0, 0, "Material Node uses inverted Normal");
- }
+
+ /* WATCH IT: we use this callback in material buttons, but then only want first row */
+ if(butr->ymax-butr->ymin > 21.0f) {
+ /* node options */
+ uiDefButBitS(block, TOG, SH_NODE_MAT_DIFF, B_NODE_EXEC, "Diff",
+ butr->xmin, butr->ymin, dx, 19,
+ &node->custom1, 0, 0, 0, 0, "Material Node outputs Diffuse");
+ uiDefButBitS(block, TOG, SH_NODE_MAT_SPEC, B_NODE_EXEC, "Spec",
+ butr->xmin+dx, butr->ymin, dx, 19,
+ &node->custom1, 0, 0, 0, 0, "Material Node outputs Specular");
+ uiDefButBitS(block, TOG, SH_NODE_MAT_NEG, B_NODE_EXEC, "Neg Normal",
+ butr->xmax-dx, butr->ymin, dx, 19,
+ &node->custom1, 0, 0, 0, 0, "Material Node uses inverted Normal");
}
- uiBlockEndAlign(block);
- }
- return 38;
+ }
+ uiBlockEndAlign(block);
}
-static int node_shader_buts_mapping(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_shader_buts_mapping(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- TexMapping *texmap= node->storage;
- short dx= (short)((butr->xmax-butr->xmin)/7.0f);
- short dy= (short)(butr->ymax-19);
-
- uiBlockSetFunc(block, node_texmap_cb, texmap, NULL); /* all buttons get this */
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->loc+1, -1000.0f, 1000.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->loc+2, -1000.0f, 1000.0f, 10, 2, "");
- dy-= 19;
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->rot, -1000.0f, 1000.0f, 1000, 1, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->rot+1, -1000.0f, 1000.0f, 1000, 1, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->rot+2, -1000.0f, 1000.0f, 1000, 1, "");
- dy-= 19;
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->size+1, -1000.0f, 1000.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->size+2, -1000.0f, 1000.0f, 10, 2, "");
- dy-= 25;
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->min, -10.0f, 10.0f, 100, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->min+1, -10.0f, 10.0f, 100, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->min+2, -10.0f, 10.0f, 100, 2, "");
- dy-= 19;
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->max, -10.0f, 10.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->max+1, -10.0f, 10.0f, 10, 2, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->max+2, -10.0f, 10.0f, 10, 2, "");
- uiBlockEndAlign(block);
-
- /* labels/options */
-
- dy= (short)(butr->ymax-19);
- uiDefBut(block, LABEL, B_NOP, "Loc", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
- dy-= 19;
- uiDefBut(block, LABEL, B_NOP, "Rot", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
- dy-= 19;
- uiDefBut(block, LABEL, B_NOP, "Size", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
- dy-= 25;
- uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
- dy-= 19;
- uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC, "Max", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
-
- }
- return 5*19 + 6;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ TexMapping *texmap= node->storage;
+ short dx= (short)((butr->xmax-butr->xmin)/7.0f);
+ short dy= (short)(butr->ymax-19);
+
+ uiBlockSetFunc(block, node_texmap_cb, texmap, NULL); /* all buttons get this */
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->loc+1, -1000.0f, 1000.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->loc+2, -1000.0f, 1000.0f, 10, 2, "");
+ dy-= 19;
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->rot, -1000.0f, 1000.0f, 1000, 1, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->rot+1, -1000.0f, 1000.0f, 1000, 1, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->rot+2, -1000.0f, 1000.0f, 1000, 1, "");
+ dy-= 19;
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->size+1, -1000.0f, 1000.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->size+2, -1000.0f, 1000.0f, 10, 2, "");
+ dy-= 25;
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->min, -10.0f, 10.0f, 100, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->min+1, -10.0f, 10.0f, 100, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->min+2, -10.0f, 10.0f, 100, 2, "");
+ dy-= 19;
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->max, -10.0f, 10.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->max+1, -10.0f, 10.0f, 10, 2, "");
+ uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->max+2, -10.0f, 10.0f, 10, 2, "");
+ uiBlockEndAlign(block);
+
+ /* labels/options */
+
+ dy= (short)(butr->ymax-19);
+ uiDefBut(block, LABEL, B_NOP, "Loc", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
+ dy-= 19;
+ uiDefBut(block, LABEL, B_NOP, "Rot", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
+ dy-= 19;
+ uiDefBut(block, LABEL, B_NOP, "Size", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
+ dy-= 25;
+ uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
+ dy-= 19;
+ uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC, "Max", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
}
-static int node_shader_buts_vect_math(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_shader_buts_vect_math(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
-
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Add %x0|Subtract %x1|Average %x2|Dot Product %x3 |Cross Product %x4|Normalize %x5", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, "");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
- }
- return 20;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ uiBut *bt;
+
+ bt=uiDefButS(block, MENU, B_NODE_EXEC, "Add %x0|Subtract %x1|Average %x2|Dot Product %x3 |Cross Product %x4|Normalize %x5", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, "");
+ uiButSetFunc(bt, node_but_title_cb, node, bt);
}
-static int node_shader_buts_geometry(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_shader_buts_geometry(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *but;
- NodeGeometry *ngeo= (NodeGeometry*)node->storage;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ uiBut *but;
+ NodeGeometry *ngeo= (NodeGeometry*)node->storage;
- // XXX if(!verify_valid_uv_name(ngeo->uvname))
- // XXX uiBlockSetCol(block, TH_REDALERT);
- but= uiDefBut(block, TEX, B_NODE_EXEC, "UV:", butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20, ngeo->uvname, 0, 31, 0, 0, "Set name of UV layer to use, default is active UV layer");
- // XXX uiButSetCompleteFunc(but, autocomplete_uv, NULL);
+ // XXX if(!verify_valid_uv_name(ngeo->uvname))
+ // XXX uiBlockSetCol(block, TH_REDALERT);
+ but= uiDefBut(block, TEX, B_NODE_EXEC, "UV:", butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20, ngeo->uvname, 0, 31, 0, 0, "Set name of UV layer to use, default is active UV layer");
+ // XXX uiButSetCompleteFunc(but, autocomplete_uv, NULL);
- if(!verify_valid_vcol_name(ngeo->colname));
+ if(!verify_valid_vcol_name(ngeo->colname));
// uiBlockSetCol(block, TH_REDALERT);
- but= uiDefBut(block, TEX, B_NODE_EXEC, "Col:", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, ngeo->colname, 0, 31, 0, 0, "Set name of vertex color layer to use, default is active vertex color layer");
- uiButSetCompleteFunc(but, autocomplete_vcol, NULL);
- }
-
- return 40;
+ but= uiDefBut(block, TEX, B_NODE_EXEC, "Col:", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, ngeo->colname, 0, 31, 0, 0, "Set name of vertex color layer to use, default is active vertex color layer");
+ uiButSetCompleteFunc(but, autocomplete_vcol, NULL);
}
-static int node_shader_buts_dynamic(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_shader_buts_dynamic(uiLayout *layout, PointerRNA *ptr)
{
- if (block) {
- uiBut *bt;
- // XXX SpaceNode *snode= curarea->spacedata.first;
- short dy= (short)butr->ymin;
- int xoff=0;
-
- /* B_NODE_EXEC is handled in butspace.c do_node_buts */
- if(!node->id) {
- char *strp;
- IDnames_to_pupstring(&strp, NULL, "", &(G.main->text), NULL, NULL);
- node->menunr= 0;
- bt= uiDefButS(block, MENU, B_NODE_EXEC/*+node->nr*/, strp,
- butr->xmin, dy, 19, 19,
- &node->menunr, 0, 0, 0, 0, "Browses existing choices");
- uiButSetFunc(bt, node_browse_text_cb, ntree, node);
- xoff=19;
- if(strp) MEM_freeN(strp);
- }
- else {
- bt = uiDefBut(block, BUT, B_NOP, "Update",
- butr->xmin+xoff, butr->ymin+20, 50, 19,
- &node->menunr, 0.0, 19.0, 0, 0, "Refresh this node (and all others that use the same script)");
- uiButSetFunc(bt, node_dynamic_update_cb, ntree, node);
-
- if (BTST(node->custom1, NODE_DYNAMIC_ERROR)) {
- // UI_ThemeColor(TH_REDALERT);
- // XXX ui_rasterpos_safe(butr->xmin + xoff, butr->ymin + 5, snode->aspect);
- // XXX snode_drawstring(snode, "Error! Check console...", butr->xmax - butr->xmin);
- ;
- }
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
+ uiBut *bt;
+ // XXX SpaceNode *snode= curarea->spacedata.first;
+ short dy= (short)butr->ymin;
+ int xoff=0;
+
+ /* B_NODE_EXEC is handled in butspace.c do_node_buts */
+ if(!node->id) {
+ char *strp;
+ IDnames_to_pupstring(&strp, NULL, "", &(G.main->text), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NODE_EXEC/*+node->nr*/, strp,
+ butr->xmin, dy, 19, 19,
+ &node->menunr, 0, 0, 0, 0, "Browses existing choices");
+ uiButSetFunc(bt, node_browse_text_cb, ntree, node);
+ xoff=19;
+ if(strp) MEM_freeN(strp);
+ }
+ else {
+ bt = uiDefBut(block, BUT, B_NOP, "Update",
+ butr->xmin+xoff, butr->ymin+20, 50, 19,
+ &node->menunr, 0.0, 19.0, 0, 0, "Refresh this node (and all others that use the same script)");
+ uiButSetFunc(bt, node_dynamic_update_cb, ntree, node);
+
+ if (BTST(node->custom1, NODE_DYNAMIC_ERROR)) {
+ // UI_ThemeColor(TH_REDALERT);
+ // XXX ui_rasterpos_safe(butr->xmin + xoff, butr->ymin + 5, snode->aspect);
+ // XXX snode_drawstring(snode, "Error! Check console...", butr->xmax - butr->xmin);
+ ;
}
}
- return 20+19;
}
/* only once called */
@@ -752,49 +737,49 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_MATERIAL:
case SH_NODE_MATERIAL_EXT:
- ntype->butfunc= node_shader_buts_material;
+ ntype->uifunc= node_shader_buts_material;
break;
case SH_NODE_TEXTURE:
- ntype->butfunc= node_buts_texture;
+ ntype->uifunc= node_buts_texture;
break;
case SH_NODE_NORMAL:
- ntype->butfunc= node_buts_normal;
+ ntype->uifunc= node_buts_normal;
break;
case SH_NODE_CURVE_VEC:
- ntype->butfunc= node_buts_curvevec;
+ ntype->uifunc= node_buts_curvevec;
break;
case SH_NODE_CURVE_RGB:
- ntype->butfunc= node_buts_curvecol;
+ ntype->uifunc= node_buts_curvecol;
break;
case SH_NODE_MAPPING:
- ntype->butfunc= node_shader_buts_mapping;
+ ntype->uifunc= node_shader_buts_mapping;
break;
case SH_NODE_VALUE:
- ntype->butfunc= node_buts_value;
+ ntype->uifunc= node_buts_value;
break;
case SH_NODE_RGB:
- ntype->butfunc= node_buts_rgb;
+ ntype->uifunc= node_buts_rgb;
break;
case SH_NODE_MIX_RGB:
- ntype->butfunc= node_buts_mix_rgb;
+ ntype->uifunc= node_buts_mix_rgb;
break;
case SH_NODE_VALTORGB:
- ntype->butfunc= node_buts_valtorgb;
+ ntype->uifunc= node_buts_valtorgb;
break;
case SH_NODE_MATH:
- ntype->butfunc= node_buts_math;
+ ntype->uifunc= node_buts_math;
break;
case SH_NODE_VECT_MATH:
- ntype->butfunc= node_shader_buts_vect_math;
+ ntype->uifunc= node_shader_buts_vect_math;
break;
case SH_NODE_GEOMETRY:
- ntype->butfunc= node_shader_buts_geometry;
+ ntype->uifunc= node_shader_buts_geometry;
break;
case NODE_DYNAMIC:
- ntype->butfunc= node_shader_buts_dynamic;
+ ntype->uifunc= node_shader_buts_dynamic;
break;
default:
- ntype->butfunc= NULL;
+ ntype->uifunc= NULL;
}
}
@@ -879,112 +864,102 @@ static void image_layer_cb(bContext *C, void *ima_v, void *iuser_v)
// allqueue(REDRAWNODE, 0);
}
-static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_image(uiLayout *layout, PointerRNA *ptr)
{
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
ImageUser *iuser= node->storage;
+ uiBut *bt;
+ short dy= (short)butr->ymax-19;
+ char *strp;
- if(block) {
- uiBut *bt;
- short dy= (short)butr->ymax-19;
- char *strp;
+ uiBlockBeginAlign(block);
+
+ /* browse button */
+ IMAnames_to_pupstring(&strp, NULL, "LOAD NEW %x32767", &(G.main->image), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NOP, strp,
+ butr->xmin, dy, 19, 19,
+ &node->menunr, 0, 0, 0, 0, "Browses existing choices");
+ uiButSetFunc(bt, node_browse_image_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ /* Add New button */
+ if(node->id==NULL) {
+ bt= uiDefBut(block, BUT, B_NODE_LOADIMAGE, "Load New",
+ butr->xmin+19, dy, (short)(butr->xmax-butr->xmin-19.0f), 19,
+ NULL, 0.0, 0.0, 0, 0, "Add new Image");
+ uiButSetFunc(bt, node_active_cb, ntree, node);
+ }
+ else {
+ /* name button + type */
+ Image *ima= (Image *)node->id;
+ short xmin= (short)butr->xmin, xmax= (short)butr->xmax;
+ short width= xmax - xmin - 45;
+ short icon= ICON_IMAGE_DATA;
- uiBlockBeginAlign(block);
+ if(ima->source==IMA_SRC_MOVIE) icon= ICON_SEQUENCE;
+ else if(ima->source==IMA_SRC_SEQUENCE) icon= ICON_IMAGE_COL;
+ else if(ima->source==IMA_SRC_GENERATED) icon= ICON_BLANK1;
- /* browse button */
- IMAnames_to_pupstring(&strp, NULL, "LOAD NEW %x32767", &(G.main->image), NULL, NULL);
- node->menunr= 0;
- bt= uiDefButS(block, MENU, B_NOP, strp,
- butr->xmin, dy, 19, 19,
- &node->menunr, 0, 0, 0, 0, "Browses existing choices");
- uiButSetFunc(bt, node_browse_image_cb, ntree, node);
- if(strp) MEM_freeN(strp);
+ bt= uiDefBut(block, TEX, B_NOP, "IM:",
+ xmin+19, dy, width, 19,
+ node->id->name+2, 0.0, 19.0, 0, 0, "Image name");
+ uiButSetFunc(bt, node_ID_title_cb, node, NULL);
- /* Add New button */
- if(node->id==NULL) {
- bt= uiDefBut(block, BUT, B_NODE_LOADIMAGE, "Load New",
- butr->xmin+19, dy, (short)(butr->xmax-butr->xmin-19.0f), 19,
- NULL, 0.0, 0.0, 0, 0, "Add new Image");
- uiButSetFunc(bt, node_active_cb, ntree, node);
- }
- else {
- /* name button + type */
- Image *ima= (Image *)node->id;
- short xmin= (short)butr->xmin, xmax= (short)butr->xmax;
- short width= xmax - xmin - 45;
- short icon= ICON_IMAGE_DATA;
-
- if(ima->source==IMA_SRC_MOVIE) icon= ICON_SEQUENCE;
- else if(ima->source==IMA_SRC_SEQUENCE) icon= ICON_IMAGE_COL;
- else if(ima->source==IMA_SRC_GENERATED) icon= ICON_BLANK1;
-
- bt= uiDefBut(block, TEX, B_NOP, "IM:",
- xmin+19, dy, width, 19,
- node->id->name+2, 0.0, 19.0, 0, 0, "Image name");
- uiButSetFunc(bt, node_ID_title_cb, node, NULL);
-
- /* buffer type option */
- strp= node_image_type_pup();
- bt= uiDefIconTextButS(block, MENU, B_NOP, icon, strp,
- xmax-26, dy, 26, 19,
- &ima->source, 0.0, 19.0, 0, 0, "Image type");
- uiButSetFunc(bt, node_image_type_cb, node, ima);
- MEM_freeN(strp);
+ /* buffer type option */
+ strp= node_image_type_pup();
+ bt= uiDefIconTextButS(block, MENU, B_NOP, icon, strp,
+ xmax-26, dy, 26, 19,
+ &ima->source, 0.0, 19.0, 0, 0, "Image type");
+ uiButSetFunc(bt, node_image_type_cb, node, ima);
+ MEM_freeN(strp);
+
+ if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE) ) {
+ width= (xmax-xmin)/2;
- if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE) ) {
- width= (xmax-xmin)/2;
-
- dy-= 19;
- uiDefButI(block, NUM, B_NODE_EXEC, "Frs:",
- xmin, dy, width, 19,
- &iuser->frames, 1.0, MAXFRAMEF, 0, 0, "Amount of images used in animation");
- uiDefButI(block, NUM, B_NODE_EXEC, "SFra:",
- xmin+width, dy, width, 19,
- &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Start frame of animation");
+ dy-= 19;
+ uiDefButI(block, NUM, B_NODE_EXEC, "Frs:",
+ xmin, dy, width, 19,
+ &iuser->frames, 1.0, MAXFRAMEF, 0, 0, "Amount of images used in animation");
+ uiDefButI(block, NUM, B_NODE_EXEC, "SFra:",
+ xmin+width, dy, width, 19,
+ &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Start frame of animation");
+ dy-= 19;
+ uiDefButI(block, NUM, B_NODE_EXEC, "Offs:",
+ xmin, dy, width, 19,
+ &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
+ uiDefButS(block, TOG, B_NODE_EXEC, "Cycl",
+ xmin+width, dy, width-20, 19,
+ &iuser->cycl, 0.0, 0.0, 0, 0, "Make animation go cyclic");
+ uiDefIconButBitS(block, TOG, IMA_ANIM_ALWAYS, B_NODE_EXEC, ICON_AUTO,
+ xmax-20, dy, 20, 19,
+ &iuser->flag, 0.0, 0.0, 0, 0, "Always refresh Image on frame changes");
+ }
+ if( ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
+ RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
+ if(rl) {
+ width= (xmax-xmin);
dy-= 19;
- uiDefButI(block, NUM, B_NODE_EXEC, "Offs:",
+ strp= layer_menu(ima->rr);
+ bt= uiDefButS(block, MENU, B_NODE_EXEC, strp,
xmin, dy, width, 19,
- &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
- uiDefButS(block, TOG, B_NODE_EXEC, "Cycl",
- xmin+width, dy, width-20, 19,
- &iuser->cycl, 0.0, 0.0, 0, 0, "Make animation go cyclic");
- uiDefIconButBitS(block, TOG, IMA_ANIM_ALWAYS, B_NODE_EXEC, ICON_AUTO,
- xmax-20, dy, 20, 19,
- &iuser->flag, 0.0, 0.0, 0, 0, "Always refresh Image on frame changes");
- }
- if( ima->type==IMA_TYPE_MULTILAYER && ima->rr) {
- RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
- if(rl) {
- width= (xmax-xmin);
- dy-= 19;
- strp= layer_menu(ima->rr);
- bt= uiDefButS(block, MENU, B_NODE_EXEC, strp,
- xmin, dy, width, 19,
- &iuser->layer, 0.0, 10000.0, 0, 0, "Layer");
- uiButSetFunc(bt, image_layer_cb, ima->rr, node->storage);
- MEM_freeN(strp);
- }
+ &iuser->layer, 0.0, 10000.0, 0, 0, "Layer");
+ uiButSetFunc(bt, image_layer_cb, ima->rr, node->storage);
+ MEM_freeN(strp);
}
}
+ }
- }
if(node->id) {
- Image *ima= (Image *)node->id;
- int retval= 19;
-
/* for each draw we test for anim refresh event */
if(iuser->flag & IMA_ANIM_REFRESHED) {
iuser->flag &= ~IMA_ANIM_REFRESHED;
// addqueue(curarea->win, UI_BUT_EVENT, B_NODE_EXEC); XXX
}
-
- if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE) )
- retval+= 38;
- if( ima->type==IMA_TYPE_MULTILAYER)
- retval+= 19;
- return retval;
}
- else
- return 19;
}
/* if we use render layers from other scene, we make a nice title */
@@ -1057,9 +1032,14 @@ static void node_browse_scene_cb(bContext *C, void *ntree_v, void *node_v)
}
-static int node_composit_buts_renderlayers(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_renderlayers(uiLayout *layout, PointerRNA *ptr)
{
- if(block && node->id) {
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
+
+ if(node->id) {
Scene *scene= (Scene *)node->id;
uiBut *bt;
char *strp;
@@ -1077,7 +1057,7 @@ static int node_composit_buts_renderlayers(uiBlock *block, bNodeTree *ntree, bNo
/* browse button layer */
strp= scene_layer_menu(node->id?(Scene *)node->id:scene);
if(node->id)
- bt= uiDefIconTextButS(block, MENU, B_NODE_EXEC, ICON_SCENE_DATA, strp,
+ bt= uiDefIconTextButS(block, MENU, B_NODE_EXEC, ICON_RENDERLAYERS, strp,
butr->xmin+20, butr->ymin, (butr->xmax-butr->xmin)-40, 19,
&node->custom1, 0, 0, 0, 0, "Choose Render Layer");
else
@@ -1094,7 +1074,6 @@ static int node_composit_buts_renderlayers(uiBlock *block, bNodeTree *ntree, bNo
&node->custom2, 0, 0, 0, 0, "Re-render this Layer");
}
- return 19;
}
static void node_blur_relative_cb(bContext *C, void *node, void *poin2)
@@ -1126,718 +1105,427 @@ static void node_blur_update_sizey_cb(bContext *C, void *node, void *poin2)
nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
}
-static int node_composit_buts_blur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_blur(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeBlurData *nbd= node->storage;
- uiBut *bt;
- short dy= butr->ymin+58;
- short dx= (butr->xmax-butr->xmin)/2;
- char str[256];
-
- uiBlockBeginAlign(block);
- sprintf(str, "Filter Type%%t|Flat %%x%d|Tent %%x%d|Quad %%x%d|Cubic %%x%d|Gauss %%x%d|Fast Gauss%%x%d|CatRom %%x%d|Mitch %%x%d", R_FILTER_BOX, R_FILTER_TENT, R_FILTER_QUAD, R_FILTER_CUBIC, R_FILTER_GAUSS, R_FILTER_FAST_GAUSS, R_FILTER_CATROM, R_FILTER_MITCH);
- uiDefButS(block, MENU, B_NODE_EXEC,str,
- butr->xmin, dy, dx*2, 19,
- &nbd->filtertype, 0, 0, 0, 0, "Set sampling filter for blur");
- dy-=19;
- if (nbd->filtertype != R_FILTER_FAST_GAUSS) {
- uiDefButC(block, TOG, B_NODE_EXEC, "Bokeh",
- butr->xmin, dy, dx, 19,
- &nbd->bokeh, 0, 0, 0, 0, "Uses circular filter, warning it's slow!");
- uiDefButC(block, TOG, B_NODE_EXEC, "Gamma",
- butr->xmin+dx, dy, dx, 19,
- &nbd->gamma, 0, 0, 0, 0, "Applies filter on gamma corrected values");
- } else {
- uiBlockEndAlign(block);
- uiBlockBeginAlign(block);
- }
- dy-=19;
- bt= uiDefButS(block, TOG, B_NOP, "Relative",
- butr->xmin, dy, dx*2, 19,
- &nbd->relative, 0, 0, 0, 0, "Use relative (percent) values to define blur radius");
- uiButSetFunc(bt, node_blur_relative_cb, node, NULL);
-
- dy-=19;
- if(nbd->relative) {
- bt= uiDefButF(block, NUM, B_NODE_EXEC, "X:",
- butr->xmin, dy, dx, 19,
- &nbd->percentx, 0.0f, 1.0f, 0, 0, "");
- uiButSetFunc(bt, node_blur_update_sizex_cb, node, NULL);
- bt= uiDefButF(block, NUM, B_NODE_EXEC, "Y:",
- butr->xmin+dx, dy, dx, 19,
- &nbd->percenty, 0.0f, 1.0f, 0, 0, "");
- uiButSetFunc(bt, node_blur_update_sizey_cb, node, NULL);
- }
- else {
- uiDefButS(block, NUM, B_NODE_EXEC, "X:",
- butr->xmin, dy, dx, 19,
- &nbd->sizex, 0, 256, 0, 0, "");
- uiDefButS(block, NUM, B_NODE_EXEC, "Y:",
- butr->xmin+dx, dy, dx, 19,
- &nbd->sizey, 0, 256, 0, 0, "");
- }
- uiBlockEndAlign(block);
+ uiLayout *row, *col;
+
+ col= uiLayoutColumn(layout, 0);
+
+ uiItemR(col, "", 0, ptr, "filter_type", 0);
+ /* Only for "Fast Gaussian" */
+ if (RNA_enum_get(ptr, "filter_type")!= 7) {
+ uiItemR(col, NULL, 0, ptr, "bokeh", 0);
+ uiItemR(col, NULL, 0, ptr, "gamma", 0);
+ }
+
+ uiItemR(col, NULL, 0, ptr, "relative", 0);
+ row= uiLayoutRow(col, 1);
+ if (RNA_boolean_get(ptr, "relative")== 1) {
+ uiItemR(row, "X", 0, ptr, "factor_x", 0);
+ uiItemR(row, "Y", 0, ptr, "factor_y", 0);
+ }
+
+ else {
+ uiItemR(row, "X", 0, ptr, "sizex", 0);
+ uiItemR(row, "Y", 0, ptr, "sizey", 0);
}
- return 77;
}
-static int node_composit_buts_dblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_dblur(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeDBlurData *ndbd = node->storage;
- short dy = butr->ymin + 171;
- short dx = butr->xmax - butr->xmin;
- short halfdx= (short)dx/2;
-
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_NODE_EXEC, "Iterations:",
- butr->xmin, dy, dx, 19,
- &ndbd->iter, 1, 32, 10, 0, "Amount of iterations");
- uiDefButC(block, TOG, B_NODE_EXEC, "Wrap",
- butr->xmin, dy-= 19, dx, 19,
- &ndbd->wrap, 0, 0, 0, 0, "Wrap blur");
- uiBlockEndAlign(block);
-
- dy-= 9;
-
- uiDefBut(block, LABEL, B_NOP, "Center", butr->xmin, dy-= 19, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "X:",
- butr->xmin, dy-= 19, halfdx, 19,
- &ndbd->center_x, 0.0f, 1.0f, 10, 0, "X center in percents");
- uiDefButF(block, NUM, B_NODE_EXEC, "Y:",
- butr->xmin+halfdx, dy, halfdx, 19,
- &ndbd->center_y, 0.0f, 1.0f, 10, 0, "Y center in percents");
- uiBlockEndAlign(block);
+ uiLayout *row, *col;
+
+ uiItemR(layout, NULL, 0, ptr, "iterations", 0);
+ uiItemR(layout, NULL, 0, ptr, "wrap", 0);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, "Center:", 0);
+
+ row= uiLayoutRow(col, 1);
+ uiItemR(row, "X:", 0, ptr, "center_x", 0);
+ uiItemR(row, "Y", 0, ptr, "center_y", 0);
+
+ uiItemS(layout);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "distance", 0);
+ uiItemR(col, NULL, 0, ptr, "angle", 0);
+
+ uiItemS(layout);
+
+ uiItemR(layout, NULL, 0, ptr, "spin", 0);
+ uiItemR(layout, NULL, 0, ptr, "zoom", 0);
+}
- dy-= 9;
+static void node_composit_buts_bilateralblur(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *col;
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "iterations", 0);
+ uiItemR(col, NULL, 0, ptr, "sigma_color", 0);
+ uiItemR(col, NULL, 0, ptr, "sigma_space", 0);
+}
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "Distance:",
- butr->xmin, dy-= 19, dx, 19,
- &ndbd->distance, -1.0f, 1.0f, 10, 0, "Amount of which the image moves");
- uiDefButF(block, NUM, B_NODE_EXEC, "Angle:",
- butr->xmin, dy-= 19, dx, 19,
- &ndbd->angle, 0.0f, 360.0f, 1000, 0, "Angle in which the image will be moved");
- uiBlockEndAlign(block);
+/* qdn: defocus node */
+static void node_composit_buts_defocus(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *sub, *col;
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, "Bokeh Type:", 0);
+ uiItemR(col, "", 0, ptr, "bokeh", 0);
+ uiItemR(col, NULL, 0, ptr, "angle", 0);
- dy-= 9;
+ uiItemR(layout, NULL, 0, ptr, "gamma_correction", 0);
- uiDefButF(block, NUM, B_NODE_EXEC, "Spin:",
- butr->xmin, dy-= 19, dx, 19,
- &ndbd->spin, -360.0f, 360.0f, 1000, 0, "Angle that is used to spin the image");
+ col = uiLayoutColumn(layout, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==0);
+ uiItemR(col, NULL, 0, ptr, "f_stop", 0);
- dy-= 9;
+ uiItemR(layout, NULL, 0, ptr, "max_blur", 0);
+ uiItemR(layout, NULL, 0, ptr, "threshold", 0);
+
+ // Preview
+ col = uiLayoutColumn(layout, 0);
+ uiItemR(col, NULL, 0, ptr, "preview", 0);
+ sub = uiLayoutColumn(col, 0);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "preview"));
+ uiItemR(sub, NULL, 0, ptr, "samples", 0);
+
+ // Z-Buffer
+ col = uiLayoutColumn(layout, 0);
+ uiItemR(col, NULL, 0, ptr, "use_zbuffer", 0);
+ sub = uiLayoutColumn(col, 0);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer"));
+ uiItemR(sub, NULL, 0, ptr, "z_scale", 0);
+}
- uiDefButF(block, NUM, B_NODE_EXEC, "Zoom:",
- butr->xmin, dy-= 19, dx, 19,
- &ndbd->zoom, 0.0f, 100.0f, 100, 0, "Amount of which the image is zoomed");
+/* qdn: glare node */
+static void node_composit_buts_glare(uiLayout *layout, PointerRNA *ptr)
+{
+ uiItemR(layout, "", 0, ptr, "glare_type", 0);
+ uiItemR(layout, "", 0, ptr, "quality", 0);
+ if (RNA_enum_get(ptr, "glare_type")!= 1) {
+ uiItemR(layout, NULL, 0, ptr, "iterations", 0);
+
+ if (RNA_enum_get(ptr, "glare_type")!= 0)
+ uiItemR(layout, NULL, 0, ptr, "color_modulation", 0);
}
- return 190;
-}
+
+ uiItemR(layout, NULL, 0, ptr, "mix", 0);
+ uiItemR(layout, NULL, 0, ptr, "threshold", 0);
-static int node_composit_buts_bilateralblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- NodeBilateralBlurData *nbbd= node->storage;
- short dy= butr->ymin+38;
- short dx= (butr->xmax-butr->xmin);
-
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_NODE_EXEC, "Iterations:",
- butr->xmin, dy, dx, 19,
- &nbbd->iter, 1, 128, 0, 0, "Amount of iterations");
- dy-=19;
- uiDefButF(block, NUM, B_NODE_EXEC, "Color Sigma:",
- butr->xmin, dy, dx, 19,
- &nbbd->sigma_color,0.01, 3, 10, 0, "Sigma value used to modify color");
- dy-=19;
- uiDefButF(block, NUM, B_NODE_EXEC, "Space Sigma:",
- butr->xmin, dy, dx, 19,
- &nbbd->sigma_space ,0.01, 30, 10, 0, "Sigma value used to modify space");
+ if (RNA_enum_get(ptr, "glare_type")== 2) {
+ uiItemR(layout, NULL, 0, ptr, "streaks", 0);
+ uiItemR(layout, NULL, 0, ptr, "angle_offset", 0);
+ }
+ if (RNA_enum_get(ptr, "glare_type")== 0 || RNA_enum_get(ptr, "glare_type")== 2) {
+ uiItemR(layout, NULL, 0, ptr, "fade", 0);
+ if (RNA_enum_get(ptr, "glare_type")== 0)
+ uiItemR(layout, NULL, 0, ptr, "rotate_45", 0);
}
- return 57;
-}
-
-/* qdn: defocus node */
-static int node_composit_buts_defocus(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- NodeDefocus *nqd = node->storage;
- short dy = butr->ymin + 209;
- short dx = butr->xmax - butr->xmin;
- char* mstr1 = "Bokeh Type%t|Octagon %x8|Heptagon %x7|Hexagon %x6|Pentagon %x5|Square %x4|Triangle %x3|Disk %x0";
-
- uiDefBut(block, LABEL, B_NOP, "Bokeh Type", butr->xmin, dy, dx, 19, NULL, 0, 0, 0, 0, "");
- uiDefButC(block, MENU, B_NODE_EXEC, mstr1,
- butr->xmin, dy-19, dx, 19,
- &nqd->bktype, 0, 0, 0, 0, "Bokeh type");
- if (nqd->bktype) { /* for some reason rotating a disk doesn't seem to work... ;) */
- uiDefButC(block, NUM, B_NODE_EXEC, "Rotate:",
- butr->xmin, dy-38, dx, 19,
- &nqd->rotation, 0, 90, 0, 0, "Bokeh shape rotation offset in degrees");
- }
- uiDefButC(block, TOG, B_NODE_EXEC, "Gamma Correct",
- butr->xmin, dy-57, dx, 19,
- &nqd->gamco, 0, 0, 0, 0, "Enable gamma correction before and after main process");
- if (nqd->no_zbuf==0) {
- // only needed for zbuffer input
- uiDefButF(block, NUM, B_NODE_EXEC, "fStop:",
- butr->xmin, dy-76, dx, 19,
- &nqd->fstop, 0.5, 128, 10, 0, "Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius");
- }
- uiDefButF(block, NUM, B_NODE_EXEC, "Maxblur:",
- butr->xmin, dy-95, dx, 19,
- &nqd->maxblur, 0, 10000, 1000, 0, "blur limit, maximum CoC radius, 0=no limit");
- uiDefButF(block, NUM, B_NODE_EXEC, "BThreshold:",
- butr->xmin, dy-114, dx, 19,
- &nqd->bthresh, 0, 100, 100, 0, "CoC radius threshold, prevents background bleed on in-focus midground, 0=off");
- uiDefButC(block, TOG, B_NODE_EXEC, "Preview",
- butr->xmin, dy-142, dx, 19,
- &nqd->preview, 0, 0, 0, 0, "Enable sampling mode, useful for preview when using low samplecounts");
- if (nqd->preview) {
- /* only visible when sampling mode enabled */
- uiDefButS(block, NUM, B_NODE_EXEC, "Samples:",
- butr->xmin, dy-161, dx, 19,
- &nqd->samples, 16, 256, 0, 0, "Number of samples (16=grainy, higher=less noise)");
- }
- uiDefButS(block, TOG, B_NODE_EXEC, "No zbuffer",
- butr->xmin, dy-190, dx, 19,
- &nqd->no_zbuf, 0, 0, 0, 0, "Enable when using an image as input instead of actual zbuffer (auto enabled if node not image based, eg. time node)");
- if (nqd->no_zbuf) {
- uiDefButF(block, NUM, B_NODE_EXEC, "Zscale:",
- butr->xmin, dy-209, dx, 19,
- &nqd->scale, 0, 1000, 100, 0, "Scales the Z input when not using a zbuffer, controls maximum blur designated by the color white or input value 1");
- }
+ if (RNA_enum_get(ptr, "glare_type")== 1) {
+ uiItemR(layout, NULL, 0, ptr, "size", 0);
}
- return 228;
}
+/* qdn: tonemap node */
+static void node_composit_buts_tonemap(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *col;
-/* qdn: glare node */
-static int node_composit_buts_glare(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- NodeGlare *ndg = node->storage;
- short dy = butr->ymin + 152, dx = butr->xmax - butr->xmin;
- char* mn1 = "Type%t|Ghosts%x3|Streaks%x2|Fog Glow%x1|Simple Star%x0";
- char* mn2 = "Quality/Speed%t|High/Slow%x0|Medium/Medium%x1|Low/Fast%x2";
- uiDefButC(block, MENU, B_NODE_EXEC, mn1,
- butr->xmin, dy, dx, 19,
- &ndg->type, 0, 0, 0, 0, "Glow/Flare/Bloom type");
- uiDefButC(block, MENU, B_NODE_EXEC, mn2,
- butr->xmin, dy-19, dx, 19,
- &ndg->quality, 0, 0, 0, 0,
- "Quality speed trade off, if not set to high quality, effect will be applied to low-res copy of source image");
- if (ndg->type != 1) {
- uiDefButC(block, NUM, B_NODE_EXEC, "Iterations:",
- butr->xmin, dy-38, dx, 19,
- &ndg->iter, 2, 5, 1, 0,
- "higher values will generate longer/more streaks/ghosts");
- if (ndg->type != 0)
- uiDefButF(block, NUM, B_NODE_EXEC, "ColMod:",
- butr->xmin, dy-57, dx, 19,
- &ndg->colmod, 0, 1, 10, 0,
- "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect");
- }
- uiDefButF(block, NUM, B_NODE_EXEC, "Mix:",
- butr->xmin, dy-76, dx, 19,
- &ndg->mix, -1, 1, 10, 0,
- "Mix balance, -1 is original image only, 0 is exact 50/50 mix, 1 is processed image only");
- uiDefButF(block, NUM, B_NODE_EXEC, "Threshold:",
- butr->xmin, dy-95, dx, 19,
- &ndg->threshold, 0, 1000, 10, 0,
- "Brightness threshold, the glarefilter will be applied only to pixels brighter than this value");
- if ((ndg->type == 2) || (ndg->type == 0))
- {
- if (ndg->type == 2) {
- uiDefButC(block, NUM, B_NODE_EXEC, "streaks:",
- butr->xmin, dy-114, dx, 19,
- &ndg->angle, 2, 16, 1000, 0,
- "Total number of streaks");
- uiDefButC(block, NUM, B_NODE_EXEC, "AngOfs:",
- butr->xmin, dy-133, dx, 19,
- &ndg->angle_ofs, 0, 180, 1000, 0,
- "Streak angle rotation offset in degrees");
- }
- uiDefButF(block, NUM, B_NODE_EXEC, "Fade:",
- butr->xmin, dy-152, dx, 19,
- &ndg->fade, 0.75, 1, 5, 0,
- "Streak fade out factor");
- }
- if (ndg->type == 0)
- uiDefButC(block, TOG, B_NODE_EXEC, "Rot45",
- butr->xmin, dy-114, dx, 19,
- &ndg->angle, 0, 0, 0, 0,
- "simple star filter, add 45 degree rotation offset");
- if ((ndg->type == 1) || (ndg->type > 3)) // PBGH and fog glow
- uiDefButC(block, NUM, B_NODE_EXEC, "Size:",
- butr->xmin, dy-114, dx, 19,
- &ndg->size, 6, 9, 1000, 0,
- "glow/glare size (not actual size, relative to initial size of bright area of pixels)");
+ col = uiLayoutColumn(layout, 1);
+ uiItemR(col, "", 0, ptr, "tonemap_type", 0);
+ if (RNA_enum_get(ptr, "tonemap_type")== 0) {
+ uiItemR(col, NULL, 0, ptr, "key", 0);
+ uiItemR(col, NULL, 0, ptr, "offset", 0);
+ uiItemR(col, NULL, 0, ptr, "gamma", 0);
}
- return 171;
-}
-
-/* qdn: tonemap node */
-static int node_composit_buts_tonemap(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- NodeTonemap *ntm = node->storage;
- short dy = butr->ymin + 76, dx = butr->xmax - butr->xmin;
- char* mn = "Type%t|R/D Photoreceptor%x1|Rh Simple%x0";
-
- uiBlockBeginAlign(block);
- uiDefButI(block, MENU, B_NODE_EXEC, mn,
- butr->xmin, dy, dx, 19,
- &ntm->type, 0, 0, 0, 0,
- "Tone mapping type");
- if (ntm->type == 0) {
- uiDefButF(block, NUM, B_NODE_EXEC, "Key:",
- butr->xmin, dy-19, dx, 19,
- &ntm->key, 0, 1, 5, 0,
- "The value the average luminance is mapped to");
- uiDefButF(block, NUM, B_NODE_EXEC, "Offset:",
- butr->xmin, dy-38, dx, 19,
- &ntm->offset, 0.001, 10, 5, 0,
- "Tonemap offset, normally always 1, but can be used as an extra control to alter the brightness curve");
- uiDefButF(block, NUM, B_NODE_EXEC, "Gamma:",
- butr->xmin, dy-57, dx, 19,
- &ntm->gamma, 0.001, 3, 5, 0,
- "Gamma factor, if not used, set to 1");
- }
- else {
- uiDefButF(block, NUM, B_NODE_EXEC, "Intensity:",
- butr->xmin, dy-19, dx, 19,
- &ntm->f, -8, 8, 10, 0, "if less than zero, darkens image, otherwise makes it brighter");
- uiDefButF(block, NUM, B_NODE_EXEC, "Contrast:",
- butr->xmin, dy-38, dx, 19,
- &ntm->m, 0, 1, 5, 0, "Set to 0 to use estimate from input image");
- uiDefButF(block, NUM, B_NODE_EXEC, "Adaptation:",
- butr->xmin, dy-57, dx, 19,
- &ntm->a, 0, 1, 5, 0, "if 0, global, if 1, based on pixel intensity");
- uiDefButF(block, NUM, B_NODE_EXEC, "ColCorrect:",
- butr->xmin, dy-76, dx, 19,
- &ntm->c, 0, 1, 5, 0, "color correction, if 0, same for all channels, if 1, each independent");
- }
- uiBlockEndAlign(block);
+ else {
+ uiItemR(col, NULL, 0, ptr, "intensity", 0);
+ uiItemR(col, NULL, 0, ptr, "contrast", 0);
+ uiItemR(col, NULL, 0, ptr, "adaptation", 0);
+ uiItemR(col, NULL, 0, ptr, "correction", 0);
}
- return 95;
}
/* qdn: lens distortion node */
-static int node_composit_buts_lensdist(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_lensdist(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeLensDist *nld = node->storage;
- short dy = butr->ymin + 19, dx = butr->xmax - butr->xmin;
- uiBlockBeginAlign(block);
- uiDefButS(block, TOG, B_NODE_EXEC, "Projector",
- butr->xmin, dy, dx, 19,
- &nld->proj, 0, 0, 0, 0,
- "Enable/disable projector mode, effect is applied in horizontal direction only");
- if (!nld->proj) {
- uiDefButS(block, TOG, B_NODE_EXEC, "Jitter",
- butr->xmin, dy-19, dx/2, 19,
- &nld->jit, 0, 0, 0, 0,
- "Enable/disable jittering, faster, but also noisier");
- uiDefButS(block, TOG, B_NODE_EXEC, "Fit",
- butr->xmin+dx/2, dy-19, dx/2, 19,
- &nld->fit, 0, 0, 0, 0,
- "For positive distortion factor only, scale image such that black areas are not visible");
- }
- uiBlockEndAlign(block);
- }
- return 38;
-}
+ uiLayout *col;
+ col= uiLayoutColumn(layout, 0);
+ uiItemR(col, NULL, 0, ptr, "projector", 0);
+
+ col = uiLayoutColumn(col, 0);
+ uiLayoutSetActive(col, RNA_boolean_get(ptr, "projector")==0);
+ uiItemR(col, NULL, 0, ptr, "jitter", 0);
+ uiItemR(col, NULL, 0, ptr, "fit", 0);
+}
-static int node_composit_buts_vecblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_vecblur(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeBlurData *nbd= node->storage;
- short dy= butr->ymin;
- short dx= (butr->xmax-butr->xmin);
-
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_NODE_EXEC, "Samples:",
- butr->xmin, dy+76, dx, 19,
- &nbd->samples, 1, 256, 0, 0, "Amount of samples");
- uiDefButS(block, NUM, B_NODE_EXEC, "MinSpeed:",
- butr->xmin, dy+57, dx, 19,
- &nbd->minspeed, 0, 1024, 0, 0, "Minimum speed for a pixel to be blurred, used to separate background from foreground");
- uiDefButS(block, NUM, B_NODE_EXEC, "MaxSpeed:",
- butr->xmin, dy+38, dx, 19,
- &nbd->maxspeed, 0, 1024, 0, 0, "If not zero, maximum speed in pixels");
- uiDefButF(block, NUM, B_NODE_EXEC, "BlurFac:",
- butr->xmin, dy+19, dx, 19,
- &nbd->fac, 0.0f, 2.0f, 10, 2, "Scaling factor for motion vectors, actually 'shutter speed' in frames");
- uiDefButS(block, TOG, B_NODE_EXEC, "Curved",
- butr->xmin, dy, dx, 19,
- &nbd->curved, 0.0f, 2.0f, 10, 2, "Interpolate between frames in a bezier curve, rather than linearly");
- uiBlockEndAlign(block);
- }
- return 95;
+ uiLayout *col;
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "samples", 0);
+ uiItemR(col, "Blur", 0, ptr, "factor", 0);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, "Speed:", 0);
+ uiItemR(col, "Min", 0, ptr, "min_speed", 0);
+ uiItemR(col, "Max", 0, ptr, "max_speed", 0);
+
+ uiItemR(layout, NULL, 0, ptr, "curved", 0);
}
-static int node_composit_buts_filter(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_filter(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
-
- /* blend type */
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Soften %x0|Sharpen %x1|Laplace %x2|Sobel %x3|Prewitt %x4|Kirsch %x5|Shadow %x6",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 0, 0, 0, "");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
- }
- return 20;
+ uiItemR(layout, "", 0, ptr, "filter_type", 0);
}
-static int node_composit_buts_flip(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_flip(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
-
- /* flip x\y */
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Flip X %x0|Flip Y %x1|Flip X & Y %x2",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 0, 0, 0, "");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
- }
- return 20;
+ uiItemR(layout, "", 0, ptr, "axis", 0);
}
-static int node_composit_buts_crop(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_crop(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeTwoXYs *ntxy= node->storage;
- char elementheight = 19;
- short dx= (butr->xmax-butr->xmin)/2;
- short dy= butr->ymax - elementheight;
- short xymin= 0, xymax= 10000;
+ uiLayout *col;
+
+ uiItemR(layout, NULL, 0, ptr, "crop_size", 0);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, "Left", 0, ptr, "x1", 0);
+ uiItemR(col, "Right", 0, ptr, "x2", 0);
+ uiItemR(col, "Up", 0, ptr, "y1", 0);
+ uiItemR(col, "Down", 0, ptr, "y2", 0);
+}
- uiBlockBeginAlign(block);
+static void node_composit_buts_splitviewer(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *row, *col;
+
+ col= uiLayoutColumn(layout, 1);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, NULL, 0, ptr, "axis", UI_ITEM_R_EXPAND);
+ uiItemR(col, NULL, 0, ptr, "factor", 0);
+}
- /* crop image size toggle */
- uiDefButS(block, TOG, B_NODE_EXEC, "Crop Image Size",
- butr->xmin, dy, dx*2, elementheight,
- &node->custom1, 0, 0, 0, 0, "Crop the size of the input image.");
-
- dy-=elementheight;
-
- /* x1 */
- uiDefButS(block, NUM, B_NODE_EXEC, "X1:",
- butr->xmin, dy, dx, elementheight,
- &ntxy->x1, xymin, xymax, 0, 0, "");
- /* y1 */
- uiDefButS(block, NUM, B_NODE_EXEC, "Y1:",
- butr->xmin+dx, dy, dx, elementheight,
- &ntxy->y1, xymin, xymax, 0, 0, "");
-
- dy-=elementheight;
-
- /* x2 */
- uiDefButS(block, NUM, B_NODE_EXEC, "X2:",
- butr->xmin, dy, dx, elementheight,
- &ntxy->x2, xymin, xymax, 0, 0, "");
- /* y2 */
- uiDefButS(block, NUM, B_NODE_EXEC, "Y2:",
- butr->xmin+dx, dy, dx, elementheight,
- &ntxy->y2, xymin, xymax, 0, 0, "");
+static void node_composit_buts_map_value(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *sub, *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "offset", 0);
+ uiItemR(col, NULL, 0, ptr, "size", 0);
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "use_min", 0);
+ sub =uiLayoutColumn(col, 0);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min"));
+ uiItemR(sub, "", 0, ptr, "min", 0);
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "use_max", 0);
+ sub =uiLayoutColumn(col, 0);
+ uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max"));
+ uiItemR(sub, "", 0, ptr, "max", 0);
+}
- uiBlockEndAlign(block);
- }
- return 60;
+static void node_composit_buts_alphaover(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ /* alpha type */
+ uiItemR(col, NULL, 0, ptr, "convert_premul", 0);
+ /* mix factor */
+ uiItemR(col, NULL, 0, ptr, "premul", 0);
}
-static int node_composit_buts_splitviewer(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_hue_sat(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBlockBeginAlign(block);
-
- uiDefButS(block, ROW, B_NODE_EXEC, "X",
- butr->xmin, butr->ymin+19, (butr->xmax-butr->xmin)/2, 20,
- &node->custom2, 0.0, 0.0, 0, 0, "");
- uiDefButS(block, ROW, B_NODE_EXEC, "Y",
- butr->xmin+(butr->xmax-butr->xmin)/2, butr->ymin+19, (butr->xmax-butr->xmin)/2, 20,
- &node->custom2, 0.0, 1.0, 0, 0, "");
-
- uiDefButS(block, NUMSLI, B_NODE_EXEC, "Split %: ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 100, 10, 0, "");
- }
- return 40;
-}
-
-static int node_composit_buts_map_value(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- TexMapping *texmap= node->storage;
- short xstart= (short)butr->xmin;
- short dy= (short)(butr->ymax-19.0f);
- short dx= (short)(butr->xmax-butr->xmin)/2;
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "Offs:", xstart, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, "");
- dy-= 19;
- uiDefButF(block, NUM, B_NODE_EXEC, "Size:", xstart, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 3, "");
- dy-= 23;
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", xstart+dx, dy, dx, 19, texmap->min, -1000.0f, 1000.0f, 10, 2, "");
- dy-= 19;
- uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC, "Max", xstart, dy, dx, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
- uiDefButF(block, NUM, B_NODE_EXEC, "", xstart+dx, dy, dx, 19, texmap->max, -1000.0f, 1000.0f, 10, 2, "");
- }
- return 80;
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "hue", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "sat", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "val", UI_ITEM_R_SLIDER);
}
-static int node_composit_buts_alphaover(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_dilateerode(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeTwoFloats *ntf= node->storage;
-
- /* alpha type */
- uiDefButS(block, TOG, B_NODE_EXEC, "ConvertPremul",
- butr->xmin, butr->ymin+19, butr->xmax-butr->xmin, 19,
- &node->custom1, 0, 0, 0, 0, "");
- /* mix factor */
- uiDefButF(block, NUM, B_NODE_EXEC, "Premul: ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 19,
- &ntf->x, 0.0f, 1.0f, 100, 0, "");
- }
- return 38;
+ uiItemR(layout, NULL, 0, ptr, "distance", 0);
}
-static int node_composit_buts_hue_sat(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_diff_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeHueSat *nhs= node->storage;
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Hue: ",
- butr->xmin, butr->ymin+40.0f, butr->xmax-butr->xmin, 20,
- &nhs->hue, 0.0f, 1.0f, 100, 0, "");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Sat: ",
- butr->xmin, butr->ymin+20.0f, butr->xmax-butr->xmin, 20,
- &nhs->sat, 0.0f, 2.0f, 100, 0, "");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Val: ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &nhs->val, 0.0f, 2.0f, 100, 0, "");
- }
- return 60;
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "tolerance", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "falloff", UI_ITEM_R_SLIDER);
}
-static int node_composit_buts_dilateerode(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_distance_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiDefButS(block, NUM, B_NODE_EXEC, "Distance:",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom2, -100, 100, 0, 0, "Distance to grow/shrink (number of iterations)");
- }
- return 20;
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "tolerance", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "falloff", UI_ITEM_R_SLIDER);
}
-static int node_composit_buts_diff_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_color_spill(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- short sx= (butr->xmax-butr->xmin)/4;
- short dx= (butr->xmax-butr->xmin)/3;
- NodeChroma *c= node->storage;
-
- uiBlockBeginAlign(block);
- /*color space selectors*/
- uiDefButS(block, ROW,B_NODE_EXEC,"RGB",
- butr->xmin,butr->ymin+60,sx,20,
- &node->custom1,1,1, 0, 0, "RGB Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"HSV",
- butr->xmin+sx,butr->ymin+60,sx,20,
- &node->custom1,1,2, 0, 0, "HSV Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"YUV",
- butr->xmin+2*sx,butr->ymin+60,sx,20,
- &node->custom1,1,3, 0, 0, "YUV Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"YCC",
- butr->xmin+3*sx,butr->ymin+60,sx,20,
- &node->custom1,1,4, 0, 0, "YCbCr Color Space");
- /*channel tolorences*/
- uiDefButF(block, NUM, B_NODE_EXEC, " ",
- butr->xmin, butr->ymin+40, dx, 20,
- &c->t1, 0.0f, 1.0f, 100, 0, "Channel 1 Tolerance");
- uiDefButF(block, NUM, B_NODE_EXEC, " ",
- butr->xmin+dx, butr->ymin+40, dx, 20,
- &c->t2, 0.0f, 1.0f, 100, 0, "Channel 2 Tolorence");
- uiDefButF(block, NUM, B_NODE_EXEC, " ",
- butr->xmin+2*dx, butr->ymin+40, dx, 20,
- &c->t3, 0.0f, 1.0f, 100, 0, "Channel 3 Tolorence");
- /*falloff parameters*/
- /*
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Falloff Size ",
- butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20,
- &c->fsize, 0.0f, 1.0f, 100, 0, "");
- */
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Falloff: ",
- butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20,
- &c->fstrength, 0.0f, 1.0f, 100, 0, "");
- }
- return 80;
-}
-
-static int node_composit_buts_color_spill(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- short dx= (butr->xmax-butr->xmin)/3;
-
- NodeChroma *c=node->storage;
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NODE_EXEC, "Enhance: ",
- butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
- &c->t1, 0.0f, 0.5f, 100, 2, "Adjusts how much selected channel is affected by color spill algorithm");
- uiDefButS(block, ROW, B_NODE_EXEC, "R",
- butr->xmin,butr->ymin,dx,20,
- &node->custom1,1,1, 0, 0, "Red Spill Suppression");
- uiDefButS(block, ROW, B_NODE_EXEC, "G",
- butr->xmin+dx,butr->ymin,dx,20,
- &node->custom1,1,2, 0, 0, "Green Spill Suppression");
- uiDefButS(block, ROW, B_NODE_EXEC, "B",
- butr->xmin+2*dx,butr->ymin,dx,20,
- &node->custom1, 1, 3, 0, 0, "Blue Spill Suppression");
- uiBlockEndAlign(block);
- }
- return 60;
+ uiLayout *row, *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "factor", 0);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, NULL, 0, ptr, "channel", UI_ITEM_R_EXPAND);
}
-static int node_composit_buts_chroma_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_chroma_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- short dx=(butr->xmax-butr->xmin)/2;
- NodeChroma *c= node->storage;
- uiBlockBeginAlign(block);
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ short dx=(butr->xmax-butr->xmin)/2;
+ NodeChroma *c= node->storage;
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Acceptance ",
- butr->xmin, butr->ymin+60, butr->xmax-butr->xmin, 20,
- &c->t1, 1.0f, 80.0f, 100, 0, "Tolerance for colors to be considered a keying color");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Cutoff ",
- butr->xmin, butr->ymin+40, butr->xmax-butr->xmin, 20,
- &c->t2, 0.0f, 30.0f, 100, 0, "Colors below this will be considered as exact matches for keying color");
-
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Lift ",
- butr->xmin, butr->ymin+20, dx, 20,
- &c->fsize, 0.0f, 1.0f, 100, 0, "Alpha Lift");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Gain ",
- butr->xmin+dx, butr->ymin+20, dx, 20,
- &c->fstrength, 0.0f, 1.0f, 100, 0, "Alpha Gain");
+ uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Shadow Adjust ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &c->t3, 0.0f, 1.0f, 100, 0, "Adjusts the brightness of any shadows captured");
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Acceptance ",
+ butr->xmin, butr->ymin+60, butr->xmax-butr->xmin, 20,
+ &c->t1, 1.0f, 80.0f, 100, 0, "Tolerance for colors to be considered a keying color");
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Cutoff ",
+ butr->xmin, butr->ymin+40, butr->xmax-butr->xmin, 20,
+ &c->t2, 0.0f, 30.0f, 100, 0, "Colors below this will be considered as exact matches for keying color");
+
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Lift ",
+ butr->xmin, butr->ymin+20, dx, 20,
+ &c->fsize, 0.0f, 1.0f, 100, 0, "Alpha Lift");
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Gain ",
+ butr->xmin+dx, butr->ymin+20, dx, 20,
+ &c->fstrength, 0.0f, 1.0f, 100, 0, "Alpha Gain");
+
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Shadow Adjust ",
+ butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
+ &c->t3, 0.0f, 1.0f, 100, 0, "Adjusts the brightness of any shadows captured");
+ uiBlockEndAlign(block);
- if(c->t2 > c->t1)
- c->t2=c->t1;
- }
- return 80;
+ if(c->t2 > c->t1)
+ c->t2=c->t1;
}
-static int node_composit_buts_channel_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_color_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- short sx= (butr->xmax-butr->xmin)/4;
- short cx= (butr->xmax-butr->xmin)/3;
- NodeChroma *c=node->storage;
- char *c1, *c2, *c3;
+ uiLayout *col;
- /*color space selectors*/
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW,B_NODE_EXEC,"RGB",
- butr->xmin,butr->ymin+60,sx,20,&node->custom1,1,1, 0, 0, "RGB Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"HSV",
- butr->xmin+sx,butr->ymin+60,sx,20,&node->custom1,1,2, 0, 0, "HSV Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"YUV",
- butr->xmin+2*sx,butr->ymin+60,sx,20,&node->custom1,1,3, 0, 0, "YUV Color Space");
- uiDefButS(block, ROW,B_NODE_EXEC,"YCC",
- butr->xmin+3*sx,butr->ymin+60,sx,20,&node->custom1,1,4, 0, 0, "YCbCr Color Space");
-
- if (node->custom1==1) {
- c1="R"; c2="G"; c3="B";
- }
- else if(node->custom1==2){
- c1="H"; c2="S"; c3="V";
- }
- else if(node->custom1==3){
- c1="Y"; c2="U"; c3="V";
- }
- else { // if(node->custom1==4){
- c1="Y"; c2="Cb"; c3="Cr";
- }
-
- /*channel selector */
- uiDefButS(block, ROW, B_NODE_EXEC, c1,
- butr->xmin,butr->ymin+40,cx,20,&node->custom2,1, 1, 0, 0, "Channel 1");
- uiDefButS(block, ROW, B_NODE_EXEC, c2,
- butr->xmin+cx,butr->ymin+40,cx,20,&node->custom2,1, 2, 0, 0, "Channel 2");
- uiDefButS(block, ROW, B_NODE_EXEC, c3,
- butr->xmin+cx+cx,butr->ymin+40,cx,20,&node->custom2, 1, 3, 0, 0, "Channel 3");
-
- /*tolerance sliders */
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ",
- butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
- &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
- uiBlockEndAlign(block);
-
- /*keep t2 (low) less than t1 (high) */
- if(c->t2 > c->t1) {
- c->t2=c->t1;
- }
- }
- return 80;
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, NULL, 0, ptr, "h", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "s", UI_ITEM_R_SLIDER);
+ uiItemR(col, NULL, 0, ptr, "v", UI_ITEM_R_SLIDER);
}
-static int node_composit_buts_luma_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_channel_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeChroma *c=node->storage;
-
- /*tolerance sliders */
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ",
- butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
- &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
- uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
- uiBlockEndAlign(block);
-
- /*keep t2 (low) less than t1 (high) */
- if(c->t2 > c->t1) {
- c->t2=c->t1;
- }
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ short sx= (butr->xmax-butr->xmin)/4;
+ short cx= (butr->xmax-butr->xmin)/3;
+ NodeChroma *c=node->storage;
+ char *c1, *c2, *c3;
+
+ /*color space selectors*/
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW,B_NODE_EXEC,"RGB",
+ butr->xmin,butr->ymin+60,sx,20,&node->custom1,1,1, 0, 0, "RGB Color Space");
+ uiDefButS(block, ROW,B_NODE_EXEC,"HSV",
+ butr->xmin+sx,butr->ymin+60,sx,20,&node->custom1,1,2, 0, 0, "HSV Color Space");
+ uiDefButS(block, ROW,B_NODE_EXEC,"YUV",
+ butr->xmin+2*sx,butr->ymin+60,sx,20,&node->custom1,1,3, 0, 0, "YUV Color Space");
+ uiDefButS(block, ROW,B_NODE_EXEC,"YCC",
+ butr->xmin+3*sx,butr->ymin+60,sx,20,&node->custom1,1,4, 0, 0, "YCbCr Color Space");
+
+ if (node->custom1==1) {
+ c1="R"; c2="G"; c3="B";
+ }
+ else if(node->custom1==2){
+ c1="H"; c2="S"; c3="V";
+ }
+ else if(node->custom1==3){
+ c1="Y"; c2="U"; c3="V";
+ }
+ else { // if(node->custom1==4){
+ c1="Y"; c2="Cb"; c3="Cr";
+ }
+
+ /*channel selector */
+ uiDefButS(block, ROW, B_NODE_EXEC, c1,
+ butr->xmin,butr->ymin+40,cx,20,&node->custom2,1, 1, 0, 0, "Channel 1");
+ uiDefButS(block, ROW, B_NODE_EXEC, c2,
+ butr->xmin+cx,butr->ymin+40,cx,20,&node->custom2,1, 2, 0, 0, "Channel 2");
+ uiDefButS(block, ROW, B_NODE_EXEC, c3,
+ butr->xmin+cx+cx,butr->ymin+40,cx,20,&node->custom2, 1, 3, 0, 0, "Channel 3");
+
+ /*tolerance sliders */
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ",
+ butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
+ &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ",
+ butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
+ &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
+ uiBlockEndAlign(block);
+
+ /*keep t2 (low) less than t1 (high) */
+ if(c->t2 > c->t1) {
+ c->t2=c->t1;
}
- return 40;
}
-static int node_composit_buts_map_uv(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_luma_matte(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiDefButS(block, NUM, B_NODE_EXEC, "Alpha:",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 100, 0, 0, "Conversion percentage of UV differences to Alpha");
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ NodeChroma *c=node->storage;
+
+ /*tolerance sliders */
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ",
+ butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
+ &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
+ uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ",
+ butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
+ &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
+ uiBlockEndAlign(block);
+
+ /*keep t2 (low) less than t1 (high) */
+ if(c->t2 > c->t1) {
+ c->t2=c->t1;
}
- return 20;
}
-static int node_composit_buts_id_mask(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_map_uv(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiDefButS(block, NUM, B_NODE_EXEC, "ID:",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 10000, 0, 0, "Pass Index number to convert to Alpha");
- }
- return 20;
+ uiItemR(layout, NULL, 0, ptr, "alpha", 0);
+}
+
+static void node_composit_buts_id_mask(uiLayout *layout, PointerRNA *ptr)
+{
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+
+ uiDefButS(block, NUM, B_NODE_EXEC, "ID:",
+ butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
+ &node->custom1, 0, 10000, 0, 0, "Pass Index number to convert to Alpha");
}
/* allocate sufficient! */
@@ -1864,58 +1552,58 @@ static void node_set_image_cb(bContext *C, void *ntree_v, void *node_v)
nodeSetActive(ntree, node);
}
-static int node_composit_buts_file_output(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_file_output(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- NodeImageFile *nif= node->storage;
- uiBut *bt;
- short x= (short)butr->xmin;
- short y= (short)butr->ymin;
- short w= (short)butr->xmax-butr->xmin;
- char str[320];
-
- node_imagetype_string(str);
-
- uiBlockBeginAlign(block);
-
- bt = uiDefIconBut(block, BUT, B_NODE_SETIMAGE, ICON_FILESEL,
- x, y+60, 20, 20,
- 0, 0, 0, 0, 0, "Open Fileselect to get Backbuf image");
- uiButSetFunc(bt, node_set_image_cb, ntree, node);
-
- uiDefBut(block, TEX, B_NOP, "",
- 20+x, y+60, w-20, 20,
- nif->name, 0.0f, 240.0f, 0, 0, "");
-
- uiDefButS(block, MENU, B_NOP, str,
- x, y+40, w, 20,
- &nif->imtype, 0.0f, 1.0f, 0, 0, "");
-
- if(nif->imtype==R_OPENEXR) {
- uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_REDR, "Half",
- x, y+20, w/2, 20,
- &nif->subimtype, 0, 0, 0, 0, "");
-
- uiDefButS(block, MENU,B_NOP, "Codec %t|None %x0|Pxr24 (lossy) %x1|ZIP (lossless) %x2|PIZ (lossless) %x3|RLE (lossless) %x4",
- x+w/2, y+20, w/2, 20,
- &nif->codec, 0, 0, 0, 0, "");
- }
- else {
- uiDefButS(block, NUM, B_NOP, "Quality: ",
- x, y+20, w, 20,
- &nif->quality, 10.0f, 100.0f, 10, 0, "");
- }
-
- /* start frame, end frame */
- uiDefButI(block, NUM, B_NODE_EXEC, "SFra: ",
- x, y, w/2, 20,
- &nif->sfra, 1, MAXFRAMEF, 10, 0, "");
- uiDefButI(block, NUM, B_NODE_EXEC, "EFra: ",
- x+w/2, y, w/2, 20,
- &nif->efra, 1, MAXFRAMEF, 10, 0, "");
-
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
+ NodeImageFile *nif= node->storage;
+ uiBut *bt;
+ short x= (short)butr->xmin;
+ short y= (short)butr->ymin;
+ short w= (short)butr->xmax-butr->xmin;
+ char str[320];
+
+ node_imagetype_string(str);
+
+ uiBlockBeginAlign(block);
+
+ bt = uiDefIconBut(block, BUT, B_NODE_SETIMAGE, ICON_FILESEL,
+ x, y+60, 20, 20,
+ 0, 0, 0, 0, 0, "Open Fileselect to get Backbuf image");
+ uiButSetFunc(bt, node_set_image_cb, ntree, node);
+
+ uiDefBut(block, TEX, B_NOP, "",
+ 20+x, y+60, w-20, 20,
+ nif->name, 0.0f, 240.0f, 0, 0, "");
+
+ uiDefButS(block, MENU, B_NOP, str,
+ x, y+40, w, 20,
+ &nif->imtype, 0.0f, 1.0f, 0, 0, "");
+
+ if(nif->imtype==R_OPENEXR) {
+ uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_REDR, "Half",
+ x, y+20, w/2, 20,
+ &nif->subimtype, 0, 0, 0, 0, "");
+
+ uiDefButS(block, MENU,B_NOP, "Codec %t|None %x0|Pxr24 (lossy) %x1|ZIP (lossless) %x2|PIZ (lossless) %x3|RLE (lossless) %x4",
+ x+w/2, y+20, w/2, 20,
+ &nif->codec, 0, 0, 0, 0, "");
+ }
+ else {
+ uiDefButS(block, NUM, B_NOP, "Quality: ",
+ x, y+20, w, 20,
+ &nif->quality, 10.0f, 100.0f, 10, 0, "");
}
- return 80;
+
+ /* start frame, end frame */
+ uiDefButI(block, NUM, B_NODE_EXEC, "SFra: ",
+ x, y, w/2, 20,
+ &nif->sfra, 1, MAXFRAMEF, 10, 0, "");
+ uiDefButI(block, NUM, B_NODE_EXEC, "EFra: ",
+ x+w/2, y, w/2, 20,
+ &nif->efra, 1, MAXFRAMEF, 10, 0, "");
}
static void node_scale_cb(bContext *C, void *node_v, void *unused_v)
@@ -1936,43 +1624,34 @@ static void node_scale_cb(bContext *C, void *node_v, void *unused_v)
}
}
-static int node_composit_buts_scale(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_scale(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt= uiDefButS(block, MENU, B_NODE_EXEC, "Relative %x0|Absolute %x1|Scene Size % %x2|",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 0, 0, 0, "Scale new image to absolute pixel size, size relative to the incoming image, or using the 'percent' size of the scene");
- uiButSetFunc(bt, node_scale_cb, node, NULL);
- }
- return 20;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ uiBut *bt= uiDefButS(block, MENU, B_NODE_EXEC, "Relative %x0|Absolute %x1|Scene Size % %x2|",
+ butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
+ &node->custom1, 0, 0, 0, 0, "Scale new image to absolute pixel size, size relative to the incoming image, or using the 'percent' size of the scene");
+ uiButSetFunc(bt, node_scale_cb, node, NULL);
}
-static int node_composit_buts_invert(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_invert(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, CMP_CHAN_RGB, B_NODE_EXEC, "RGB",
- butr->xmin, butr->ymin, (butr->xmax-butr->xmin)/2, 20,
- &node->custom1, 0, 0, 0, 0, "");
- uiDefButBitS(block, TOG, CMP_CHAN_A, B_NODE_EXEC, "A",
- butr->xmin+(butr->xmax-butr->xmin)/2, butr->ymin, (butr->xmax-butr->xmin)/2, 20,
- &node->custom1, 0, 0, 0, 0, "");
- uiBlockEndAlign(block);
- }
- return 20;
+ uiLayout *col;
+
+ col= uiLayoutColumn(layout, 0);
+ uiItemR(col, NULL, 0, ptr, "rgb", 0);
+ uiItemR(col, NULL, 0, ptr, "alpha", 0);
}
-static int node_composit_buts_premulkey(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_composit_buts_premulkey(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- uiBut *bt;
-
- /* blend type */
- bt=uiDefButS(block, MENU, B_NODE_EXEC, "Key to Premul %x0|Premul to Key %x1",
- butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 0, 0, 0, "Conversion between premultiplied alpha and key alpha");
- }
- return 20;
+ uiItemR(layout, "", 0, ptr, "mapping", 0);
+}
+
+static void node_composit_buts_view_levels(uiLayout *layout, PointerRNA *ptr)
+{
+ uiItemR(layout, NULL, 0, ptr, "color_space", UI_ITEM_R_EXPAND);
}
/* only once called */
@@ -1982,173 +1661,181 @@ static void node_composit_set_butfunc(bNodeType *ntype)
/* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */
case CMP_NODE_IMAGE:
- ntype->butfunc= node_composit_buts_image;
+ ntype->uifunc= node_composit_buts_image;
break;
case CMP_NODE_R_LAYERS:
- ntype->butfunc= node_composit_buts_renderlayers;
+ ntype->uifunc= node_composit_buts_renderlayers;
break;
case CMP_NODE_NORMAL:
- ntype->butfunc= node_buts_normal;
+ ntype->uifunc= node_buts_normal;
break;
case CMP_NODE_CURVE_VEC:
- ntype->butfunc= node_buts_curvevec;
+ ntype->uifunc= node_buts_curvevec;
break;
case CMP_NODE_CURVE_RGB:
- ntype->butfunc= node_buts_curvecol;
+ ntype->uifunc= node_buts_curvecol;
break;
case CMP_NODE_VALUE:
- ntype->butfunc= node_buts_value;
+ ntype->uifunc= node_buts_value;
break;
case CMP_NODE_RGB:
- ntype->butfunc= node_buts_rgb;
+ ntype->uifunc= node_buts_rgb;
break;
case CMP_NODE_FLIP:
- ntype->butfunc= node_composit_buts_flip;
+ ntype->uifunc= node_composit_buts_flip;
break;
case CMP_NODE_SPLITVIEWER:
- ntype->butfunc= node_composit_buts_splitviewer;
+ ntype->uifunc= node_composit_buts_splitviewer;
break;
case CMP_NODE_MIX_RGB:
- ntype->butfunc= node_buts_mix_rgb;
+ ntype->uifunc= node_buts_mix_rgb;
break;
case CMP_NODE_VALTORGB:
- ntype->butfunc= node_buts_valtorgb;
+ ntype->uifunc= node_buts_valtorgb;
break;
case CMP_NODE_CROP:
- ntype->butfunc= node_composit_buts_crop;
+ ntype->uifunc= node_composit_buts_crop;
break;
case CMP_NODE_BLUR:
- ntype->butfunc= node_composit_buts_blur;
+ ntype->uifunc= node_composit_buts_blur;
break;
case CMP_NODE_DBLUR:
- ntype->butfunc= node_composit_buts_dblur;
+ ntype->uifunc= node_composit_buts_dblur;
break;
case CMP_NODE_BILATERALBLUR:
- ntype->butfunc= node_composit_buts_bilateralblur;
+ ntype->uifunc= node_composit_buts_bilateralblur;
break;
/* qdn: defocus node */
case CMP_NODE_DEFOCUS:
- ntype->butfunc = node_composit_buts_defocus;
+ ntype->uifunc = node_composit_buts_defocus;
break;
/* qdn: glare node */
case CMP_NODE_GLARE:
- ntype->butfunc = node_composit_buts_glare;
+ ntype->uifunc = node_composit_buts_glare;
break;
/* qdn: tonemap node */
case CMP_NODE_TONEMAP:
- ntype->butfunc = node_composit_buts_tonemap;
+ ntype->uifunc = node_composit_buts_tonemap;
break;
/* qdn: lens distortion node */
case CMP_NODE_LENSDIST:
- ntype->butfunc = node_composit_buts_lensdist;
+ ntype->uifunc = node_composit_buts_lensdist;
break;
case CMP_NODE_VECBLUR:
- ntype->butfunc= node_composit_buts_vecblur;
+ ntype->uifunc= node_composit_buts_vecblur;
break;
case CMP_NODE_FILTER:
- ntype->butfunc= node_composit_buts_filter;
+ ntype->uifunc= node_composit_buts_filter;
break;
case CMP_NODE_MAP_VALUE:
- ntype->butfunc= node_composit_buts_map_value;
+ ntype->uifunc= node_composit_buts_map_value;
break;
case CMP_NODE_TIME:
- ntype->butfunc= node_buts_time;
+ ntype->uifunc= node_buts_time;
break;
case CMP_NODE_ALPHAOVER:
- ntype->butfunc= node_composit_buts_alphaover;
+ ntype->uifunc= node_composit_buts_alphaover;
break;
case CMP_NODE_HUE_SAT:
- ntype->butfunc= node_composit_buts_hue_sat;
+ ntype->uifunc= node_composit_buts_hue_sat;
break;
case CMP_NODE_TEXTURE:
- ntype->butfunc= node_buts_texture;
+ ntype->uifunc= node_buts_texture;
break;
case CMP_NODE_DILATEERODE:
- ntype->butfunc= node_composit_buts_dilateerode;
+ ntype->uifunc= node_composit_buts_dilateerode;
break;
case CMP_NODE_OUTPUT_FILE:
- ntype->butfunc= node_composit_buts_file_output;
- break;
-
+ ntype->uifunc= node_composit_buts_file_output;
+ break;
case CMP_NODE_DIFF_MATTE:
- ntype->butfunc=node_composit_buts_diff_matte;
+ ntype->uifunc=node_composit_buts_diff_matte;
+ break;
+ case CMP_NODE_DIST_MATTE:
+ ntype->uifunc=node_composit_buts_distance_matte;
break;
case CMP_NODE_COLOR_SPILL:
- ntype->butfunc=node_composit_buts_color_spill;
+ ntype->uifunc=node_composit_buts_color_spill;
break;
- case CMP_NODE_CHROMA:
- ntype->butfunc=node_composit_buts_chroma_matte;
+ case CMP_NODE_CHROMA_MATTE:
+ ntype->uifunc=node_composit_buts_chroma_matte;
+ break;
+ case CMP_NODE_COLOR_MATTE:
+ ntype->uifunc=node_composit_buts_color_matte;
break;
case CMP_NODE_SCALE:
- ntype->butfunc= node_composit_buts_scale;
+ ntype->uifunc= node_composit_buts_scale;
break;
case CMP_NODE_CHANNEL_MATTE:
- ntype->butfunc= node_composit_buts_channel_matte;
+ ntype->uifunc= node_composit_buts_channel_matte;
break;
case CMP_NODE_LUMA_MATTE:
- ntype->butfunc= node_composit_buts_luma_matte;
+ ntype->uifunc= node_composit_buts_luma_matte;
break;
case CMP_NODE_MAP_UV:
- ntype->butfunc= node_composit_buts_map_uv;
+ ntype->uifunc= node_composit_buts_map_uv;
break;
case CMP_NODE_ID_MASK:
- ntype->butfunc= node_composit_buts_id_mask;
+ ntype->uifunc= node_composit_buts_id_mask;
break;
case CMP_NODE_MATH:
- ntype->butfunc= node_buts_math;
+ ntype->uifunc= node_buts_math;
break;
case CMP_NODE_INVERT:
- ntype->butfunc= node_composit_buts_invert;
+ ntype->uifunc= node_composit_buts_invert;
break;
case CMP_NODE_PREMULKEY:
- ntype->butfunc= node_composit_buts_premulkey;
+ ntype->uifunc= node_composit_buts_premulkey;
break;
+ case CMP_NODE_VIEW_LEVELS:
+ ntype->uifunc=node_composit_buts_view_levels;
+ break;
default:
- ntype->butfunc= NULL;
+ ntype->uifunc= NULL;
}
}
/* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */
-static int node_texture_buts_bricks(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_texture_buts_bricks(uiLayout *layout, PointerRNA *ptr)
{
- if(block) {
- short w = butr->xmax-butr->xmin;
- short ofw = 32;
-
- uiBlockBeginAlign(block);
-
- /* Offset */
- uiDefButF(
- block, NUM, B_NODE_EXEC, "Offset",
- butr->xmin, butr->ymin+20, w-ofw, 20,
- &node->custom3,
- 0, 1, 0.25, 2,
- "Offset amount" );
- uiDefButS(
- block, NUM, B_NODE_EXEC, "",
- butr->xmin+w-ofw, butr->ymin+20, ofw, 20,
- &node->custom1,
- 2, 99, 0, 0,
- "Offset every N rows" );
-
- /* Squash */
- uiDefButF(
- block, NUM, B_NODE_EXEC, "Squash",
- butr->xmin, butr->ymin+0, w-ofw, 20,
- &node->custom4,
- 0, 99, 0.25, 2,
- "Stretch amount" );
- uiDefButS(
- block, NUM, B_NODE_EXEC, "",
- butr->xmin+w-ofw, butr->ymin+0, ofw, 20,
- &node->custom2,
- 2, 99, 0, 0,
- "Stretch every N rows" );
-
- uiBlockEndAlign(block);
- }
- return 40;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ short w = butr->xmax-butr->xmin;
+ short ofw = 32;
+
+ uiBlockBeginAlign(block);
+
+ /* Offset */
+ uiDefButF(
+ block, NUM, B_NODE_EXEC, "Offset",
+ butr->xmin, butr->ymin+20, w-ofw, 20,
+ &node->custom3,
+ 0, 1, 0.25, 2,
+ "Offset amount" );
+ uiDefButS(
+ block, NUM, B_NODE_EXEC, "",
+ butr->xmin+w-ofw, butr->ymin+20, ofw, 20,
+ &node->custom1,
+ 2, 99, 0, 0,
+ "Offset every N rows" );
+
+ /* Squash */
+ uiDefButF(
+ block, NUM, B_NODE_EXEC, "Squash",
+ butr->xmin, butr->ymin+0, w-ofw, 20,
+ &node->custom4,
+ 0, 99, 0.25, 2,
+ "Stretch amount" );
+ uiDefButS(
+ block, NUM, B_NODE_EXEC, "",
+ butr->xmin+w-ofw, butr->ymin+0, ofw, 20,
+ &node->custom2,
+ 2, 99, 0, 0,
+ "Stretch every N rows" );
+
+ uiBlockEndAlign(block);
}
/* Copied from buttons_shading.c -- needs unifying */
@@ -2159,208 +1846,196 @@ static char* noisebasis_menu()
return nbmenu;
}
-static int node_texture_buts_proc(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_texture_buts_proc(uiLayout *layout, PointerRNA *ptr)
{
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
Tex *tex = (Tex *)node->storage;
short x,y,w,h;
- if( block ) {
- x = butr->xmin;
- y = butr->ymin;
- w = butr->xmax - x;
- h = butr->ymax - y;
- }
- else
- return 0;
+ x = butr->xmin;
+ y = butr->ymin;
+ w = butr->xmax - x;
+ h = butr->ymax - y;
switch( tex->type ) {
case TEX_BLEND:
- if( block ) {
- uiBlockBeginAlign( block );
- uiDefButS( block, MENU, B_NODE_EXEC,
- "Linear %x0|Quad %x1|Ease %x2|Diag %x3|Sphere %x4|Halo %x5|Radial %x6",
- x, y+20, w, 20, &tex->stype, 0, 1, 0, 0, "Blend Type" );
- uiDefButBitS(block, TOG, TEX_FLIPBLEND, B_NODE_EXEC, "Flip XY", x, y, w, 20,
- &tex->flag, 0, 0, 0, 0, "Flips the direction of the progression 90 degrees");
- uiBlockEndAlign( block );
- }
- return 40;
-
+ uiBlockBeginAlign( block );
+ uiDefButS( block, MENU, B_NODE_EXEC,
+ "Linear %x0|Quad %x1|Ease %x2|Diag %x3|Sphere %x4|Halo %x5|Radial %x6",
+ x, y+20, w, 20, &tex->stype, 0, 1, 0, 0, "Blend Type" );
+ uiDefButBitS(block, TOG, TEX_FLIPBLEND, B_NODE_EXEC, "Flip XY", x, y, w, 20,
+ &tex->flag, 0, 0, 0, 0, "Flips the direction of the progression 90 degrees");
+ uiBlockEndAlign( block );
+ break;
case TEX_MARBLE:
- if( block ) {
- uiBlockBeginAlign(block);
+ uiBlockBeginAlign(block);
+
+ uiDefButS(block, ROW, B_NODE_EXEC, "Soft", 0*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SOFT, 0, 0, "Uses soft marble");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Sharp", 1*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SHARP, 0, 0, "Uses more clearly defined marble");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Sharper", 2*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SHARPER, 0, 0, "Uses very clearly defined marble");
- uiDefButS(block, ROW, B_NODE_EXEC, "Soft", 0*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SOFT, 0, 0, "Uses soft marble");
- uiDefButS(block, ROW, B_NODE_EXEC, "Sharp", 1*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SHARP, 0, 0, "Uses more clearly defined marble");
- uiDefButS(block, ROW, B_NODE_EXEC, "Sharper", 2*w/3+x, 40+y, w/3, 18, &tex->stype, 2.0, (float)TEX_SHARPER, 0, 0, "Uses very clearly defined marble");
-
- uiDefButS(block, ROW, B_NODE_EXEC, "Soft noise", 0*w/2+x, 20+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_NODE_EXEC, "Hard noise", 1*w/2+x, 20+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
-
- uiDefButS(block, ROW, B_NODE_EXEC, "Sin", 0*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 0.0, 0, 0, "Uses a sine wave to produce bands.");
- uiDefButS(block, ROW, B_NODE_EXEC, "Saw", 1*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 1.0, 0, 0, "Uses a saw wave to produce bands");
- uiDefButS(block, ROW, B_NODE_EXEC, "Tri", 2*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 2.0, 0, 0, "Uses a triangle wave to produce bands");
-
- uiBlockEndAlign(block);
- }
- return 60;
+ uiDefButS(block, ROW, B_NODE_EXEC, "Soft noise", 0*w/2+x, 20+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Hard noise", 1*w/2+x, 20+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
+
+ uiDefButS(block, ROW, B_NODE_EXEC, "Sin", 0*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 0.0, 0, 0, "Uses a sine wave to produce bands.");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Saw", 1*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 1.0, 0, 0, "Uses a saw wave to produce bands");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Tri", 2*w/3+x, 0+y, w/3, 18, &tex->noisebasis2, 8.0, 2.0, 0, 0, "Uses a triangle wave to produce bands");
+
+ uiBlockEndAlign(block);
+ break;
case TEX_WOOD:
- if( block ) {
- uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+64, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis used for turbulence");
-
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Bands", x, 40+y, w/2, 18, &tex->stype, 2.0, (float)TEX_BANDNOISE, 0, 0, "Uses standard noise");
- uiDefButS(block, ROW, B_TEXPRV, "Rings", w/2+x, 40+y, w/2, 18, &tex->stype, 2.0, (float)TEX_RINGNOISE, 0, 0, "Lets Noise return RGB value");
-
- uiDefButS(block, ROW, B_NODE_EXEC, "Sin", 0*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_SIN, 0, 0, "Uses a sine wave to produce bands.");
- uiDefButS(block, ROW, B_NODE_EXEC, "Saw", 1*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_SAW, 0, 0, "Uses a saw wave to produce bands");
- uiDefButS(block, ROW, B_NODE_EXEC, "Tri", 2*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_TRI, 0, 0, "Uses a triangle wave to produce bands");
-
- uiDefButS(block, ROW, B_NODE_EXEC, "Soft noise", 0*w/2+x, 0+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_NODE_EXEC, "Hard noise", 1*w/2+x, 0+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
- uiBlockEndAlign(block);
- }
- return 80;
+ uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+64, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis used for turbulence");
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_TEXPRV, "Bands", x, 40+y, w/2, 18, &tex->stype, 2.0, (float)TEX_BANDNOISE, 0, 0, "Uses standard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Rings", w/2+x, 40+y, w/2, 18, &tex->stype, 2.0, (float)TEX_RINGNOISE, 0, 0, "Lets Noise return RGB value");
+
+ uiDefButS(block, ROW, B_NODE_EXEC, "Sin", 0*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_SIN, 0, 0, "Uses a sine wave to produce bands.");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Saw", 1*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_SAW, 0, 0, "Uses a saw wave to produce bands");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Tri", 2*w/3+x, 20+y, w/3, 18, &tex->noisebasis2, 8.0, (float)TEX_TRI, 0, 0, "Uses a triangle wave to produce bands");
+
+ uiDefButS(block, ROW, B_NODE_EXEC, "Soft noise", 0*w/2+x, 0+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_NODE_EXEC, "Hard noise", 1*w/2+x, 0+y, w/2, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
+ uiBlockEndAlign(block);
+ break;
case TEX_CLOUDS:
- if( block ) {
- uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+60, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis used for turbulence");
-
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "B/W", x, y+38, w/2, 18, &tex->stype, 2.0, (float)TEX_DEFAULT, 0, 0, "Uses standard noise");
- uiDefButS(block, ROW, B_TEXPRV, "Color", w/2+x, y+38, w/2, 18, &tex->stype, 2.0, (float)TEX_COLOR, 0, 0, "Lets Noise return RGB value");
- uiDefButS(block, ROW, B_TEXPRV, "Soft", x, y+20, w/2, 18, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_TEXPRV, "Hard", w/2+x, y+20, w/2, 18, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
- uiBlockEndAlign(block);
-
- uiDefButS(block, NUM, B_TEXPRV, "Depth:", x, y, w, 18, &tex->noisedepth, 0.0, 6.0, 0, 0, "Sets the depth of the cloud calculation");
- }
- return 80;
+ uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+60, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis used for turbulence");
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_TEXPRV, "B/W", x, y+38, w/2, 18, &tex->stype, 2.0, (float)TEX_DEFAULT, 0, 0, "Uses standard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Color", w/2+x, y+38, w/2, 18, &tex->stype, 2.0, (float)TEX_COLOR, 0, 0, "Lets Noise return RGB value");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft", x, y+20, w/2, 18, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Hard", w/2+x, y+20, w/2, 18, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
+ uiBlockEndAlign(block);
+
+ uiDefButS(block, NUM, B_TEXPRV, "Depth:", x, y, w, 18, &tex->noisedepth, 0.0, 6.0, 0, 0, "Sets the depth of the cloud calculation");
+ break;
case TEX_DISTNOISE:
- if( block ) {
- uiBlockBeginAlign(block);
- uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+18, w, 18, &tex->noisebasis2, 0,0,0,0, "Sets the noise basis to distort");
- uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis which does the distortion");
- uiBlockEndAlign(block);
- }
- return 36;
+ uiBlockBeginAlign(block);
+ uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y+18, w, 18, &tex->noisebasis2, 0,0,0,0, "Sets the noise basis to distort");
+ uiDefButS(block, MENU, B_TEXPRV, noisebasis_menu(), x, y, w, 18, &tex->noisebasis, 0,0,0,0, "Sets the noise basis which does the distortion");
+ uiBlockEndAlign(block);
+ break;
}
- return 0;
}
-static int node_texture_buts_image(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_texture_buts_image(uiLayout *layout, PointerRNA *ptr)
{
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ bNodeTree *ntree= ptr->id.data;
+ rctf *butr= &node->butr;
char *strp;
uiBut *bt;
+
+ uiBlockBeginAlign(block);
- if( block ) {
- uiBlockBeginAlign(block);
-
- /* browse button */
- IMAnames_to_pupstring(&strp, NULL, "LOAD NEW %x32767", &(G.main->image), NULL, NULL);
- node->menunr= 0;
- bt= uiDefButS(block, MENU, B_NOP, strp,
- butr->xmin, butr->ymin, 19, 19,
- &node->menunr, 0, 0, 0, 0, "Browses existing choices");
- uiButSetFunc(bt, node_browse_image_cb, ntree, node);
- if(strp) MEM_freeN(strp);
+ /* browse button */
+ IMAnames_to_pupstring(&strp, NULL, "LOAD NEW %x32767", &(G.main->image), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NOP, strp,
+ butr->xmin, butr->ymin, 19, 19,
+ &node->menunr, 0, 0, 0, 0, "Browses existing choices");
+ uiButSetFunc(bt, node_browse_image_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ /* Add New button */
+ if(node->id==NULL) {
+ bt= uiDefBut(block, BUT, B_NODE_LOADIMAGE, "Load New",
+ butr->xmin+19, butr->ymin, (short)(butr->xmax-butr->xmin-19.0f), 19,
+ NULL, 0.0, 0.0, 0, 0, "Add new Image");
+ uiButSetFunc(bt, node_active_cb, ntree, node);
+ }
+ else {
+ /* name button */
+ short xmin= (short)butr->xmin, xmax= (short)butr->xmax;
+ short width= xmax - xmin - 19;
- /* Add New button */
- if(node->id==NULL) {
- bt= uiDefBut(block, BUT, B_NODE_LOADIMAGE, "Load New",
- butr->xmin+19, butr->ymin, (short)(butr->xmax-butr->xmin-19.0f), 19,
- NULL, 0.0, 0.0, 0, 0, "Add new Image");
- uiButSetFunc(bt, node_active_cb, ntree, node);
- }
- else {
- /* name button */
- short xmin= (short)butr->xmin, xmax= (short)butr->xmax;
- short width= xmax - xmin - 19;
-
- bt= uiDefBut(block, TEX, B_NOP, "IM:",
- xmin+19, butr->ymin, width, 19,
- node->id->name+2, 0.0, 19.0, 0, 0, "Image name");
- uiButSetFunc(bt, node_ID_title_cb, node, NULL);
- }
+ bt= uiDefBut(block, TEX, B_NOP, "IM:",
+ xmin+19, butr->ymin, width, 19,
+ node->id->name+2, 0.0, 19.0, 0, 0, "Image name");
+ uiButSetFunc(bt, node_ID_title_cb, node, NULL);
}
- return 20;
}
-static int node_texture_buts_output(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+static void node_texture_buts_output(uiLayout *layout, PointerRNA *ptr)
{
- if( block ) {
- uiBut *bt;
- short width;
- char *name = ((TexNodeOutput*)node->storage)->name;
-
- uiBlockBeginAlign(block);
-
- width = (short)(butr->xmax - butr->xmin);
-
- bt = uiDefBut(
- block, TEX, B_NOP,
- "Name:",
- butr->xmin, butr->ymin,
- width, 19,
- name, 0, 31,
- 0, 0,
- "Name this output"
- );
-
- uiBlockEndAlign(block);
- }
- return 19;
+ uiBlock *block= uiLayoutFreeBlock(layout);
+ bNode *node= ptr->data;
+ rctf *butr= &node->butr;
+ uiBut *bt;
+ short width;
+ char *name = ((TexNodeOutput*)node->storage)->name;
+
+ uiBlockBeginAlign(block);
+
+ width = (short)(butr->xmax - butr->xmin);
+
+ bt = uiDefBut(
+ block, TEX, B_NOP,
+ "Name:",
+ butr->xmin, butr->ymin,
+ width, 19,
+ name, 0, 31,
+ 0, 0,
+ "Name this output"
+ );
+
+ uiBlockEndAlign(block);
}
/* only once called */
static void node_texture_set_butfunc(bNodeType *ntype)
{
if( ntype->type >= TEX_NODE_PROC && ntype->type < TEX_NODE_PROC_MAX ) {
- ntype->butfunc = node_texture_buts_proc;
+ ntype->uifunc = node_texture_buts_proc;
}
else switch(ntype->type) {
case TEX_NODE_MATH:
- ntype->butfunc = node_buts_math;
+ ntype->uifunc = node_buts_math;
break;
case TEX_NODE_MIX_RGB:
- ntype->butfunc = node_buts_mix_rgb;
+ ntype->uifunc = node_buts_mix_rgb;
break;
case TEX_NODE_VALTORGB:
- ntype->butfunc = node_buts_valtorgb;
+ ntype->uifunc = node_buts_valtorgb;
break;
case TEX_NODE_CURVE_RGB:
- ntype->butfunc= node_buts_curvecol;
+ ntype->uifunc= node_buts_curvecol;
break;
case TEX_NODE_CURVE_TIME:
- ntype->butfunc = node_buts_time;
+ ntype->uifunc = node_buts_time;
break;
case TEX_NODE_TEXTURE:
- ntype->butfunc = node_buts_texture;
+ ntype->uifunc = node_buts_texture;
break;
case TEX_NODE_BRICKS:
- ntype->butfunc = node_texture_buts_bricks;
+ ntype->uifunc = node_texture_buts_bricks;
break;
case TEX_NODE_IMAGE:
- ntype->butfunc = node_texture_buts_image;
+ ntype->uifunc = node_texture_buts_image;
break;
case TEX_NODE_OUTPUT:
- ntype->butfunc = node_texture_buts_output;
+ ntype->uifunc = node_texture_buts_output;
break;
default:
- ntype->butfunc= NULL;
+ ntype->uifunc= NULL;
}
}
@@ -2551,8 +2226,8 @@ int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, floa
else {
/* always do all three, to prevent data hanging around */
- forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, 2);
- forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0]+1, resol, 2);
+ forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, sizeof(float)*2);
+ forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0]+1, resol, sizeof(float)*2);
return 1;
}
@@ -2625,66 +2300,4 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
node_draw_link_bezier(v2d, snode, link, th_col1, th_col2, do_shaded);
}
-#if 0
-
-static void nodes_panel_gpencil(short cntrl) // NODES_HANDLER_GREASEPENCIL
-{
- uiBlock *block;
- SpaceNode *snode;
-
- snode= curarea->spacedata.first;
-
- block= uiNewBlock(&curarea->uiblocks, "nodes_panel_gpencil", UI_EMBOSS, UI_HELV, curarea->win);
- uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
- uiSetPanelHandler(NODES_HANDLER_GREASEPENCIL); // for close and esc
- if (uiNewPanel(curarea, block, "Grease Pencil", "SpaceNode", 100, 30, 318, 204)==0) return;
-
- /* we can only really draw stuff if there are nodes (otherwise no events are handled */
- if (snode->nodetree == NULL)
- return;
-
- /* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */
- if (snode->flag & SNODE_DISPGP) {
- if (snode->gpd == NULL)
- gpencil_data_setactive(curarea, gpencil_data_addnew());
- }
-
- if (snode->flag & SNODE_DISPGP) {
- bGPdata *gpd= snode->gpd;
- short newheight;
-
- /* this is a variable height panel, newpanel doesnt force new size on existing panels */
- /* so first we make it default height */
- uiNewPanelHeight(block, 204);
-
- /* draw button for showing gpencil settings and drawings */
- uiDefButBitS(block, TOG, SNODE_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &snode->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Node Editor (draw using Shift-LMB)");
-
- /* extend the panel if the contents won't fit */
- newheight= draw_gpencil_panel(block, gpd, curarea);
- uiNewPanelHeight(block, newheight);
- }
- else {
- uiDefButBitS(block, TOG, SNODE_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &snode->flag, 0, 0, 0, 0, "Display freehand annotations overlay over this Node Editor");
- uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
- }
-}
-static void nodes_blockhandlers(ScrArea *sa)
-{
- SpaceNode *snode= sa->spacedata.first;
- short a;
-
- for(a=0; a<SPACE_MAXHANDLER; a+=2) {
- switch(snode->blockhandler[a]) {
- case NODES_HANDLER_GREASEPENCIL:
- nodes_panel_gpencil(snode->blockhandler[a+1]);
- break;
- }
-
- /* clear action value for event */
- snode->blockhandler[a+1]= 0;
- }
- uiDrawBlocksPanels(sa, 0);
-}
-#endif
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index f2e2486075b..1d57f4e0d4c 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -81,6 +81,8 @@
#include "UI_resources.h"
#include "UI_view2d.h"
+#include "RNA_access.h"
+
#include "CMP_node.h"
#include "SHD_node.h"
@@ -91,6 +93,50 @@ extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
extern void ui_draw_tria_icon(float x, float y, float aspect, char dir);
+void ED_node_changed_update(bContext *C, bNode *node)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+
+ if(!snode)
+ return;
+
+ if(snode->treetype==NTREE_SHADER) {
+ WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING, snode->id);
+ }
+ else if(snode->treetype==NTREE_COMPOSIT) {
+ NodeTagChanged(snode->edittree, node);
+ /* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
+
+ /* not the best implementation of the world... but we need it to work now :) */
+ if(node->type==CMP_NODE_R_LAYERS && node->custom2) {
+ /* add event for this window (after render curarea can be changed) */
+ //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
+
+ //composite_node_render(snode, node);
+ //snode_handle_recalc(snode);
+
+ /* add another event, a render can go fullscreen and open new window */
+ //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
+ }
+ else {
+ node= node_tree_get_editgroup(snode->nodetree);
+ if(node)
+ NodeTagIDChanged(snode->nodetree, node->id);
+ }
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, CTX_data_scene(C));
+ }
+ else if(snode->treetype==NTREE_TEXTURE) {
+ WM_event_add_notifier(C, NC_TEXTURE|ND_NODES, snode->id);
+ }
+
+}
+
+static void do_node_internal_buttons(bContext *C, void *node_v, int event)
+{
+ if(event==B_NODE_EXEC)
+ ED_node_changed_update(C, node_v);
+}
+
static void node_scaling_widget(int color_id, float aspect, float xmin, float ymin, float xmax, float ymax)
{
@@ -110,10 +156,14 @@ static void node_scaling_widget(int color_id, float aspect, float xmin, float ym
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update(bNode *node)
+static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
{
+ uiLayout *layout;
+ PointerRNA ptr;
bNodeSocket *nsock;
float dy= node->locy;
+ int buty;
+ char str[32];
/* header */
dy-= NODE_DY;
@@ -121,7 +171,7 @@ static void node_update(bNode *node)
/* little bit space in top */
if(node->outputs.first)
dy-= NODE_DYS/2;
-
+
/* output sockets */
for(nsock= node->outputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
@@ -130,9 +180,9 @@ static void node_update(bNode *node)
dy-= NODE_DY;
}
}
-
- node->prvr.xmin= node->butr.xmin= node->locx + NODE_DYS;
- node->prvr.xmax= node->butr.xmax= node->locx + node->width- NODE_DYS;
+
+ node->prvr.xmin= node->locx + NODE_DYS;
+ node->prvr.xmax= node->locx + node->width- NODE_DYS;
/* preview rect? */
if(node->flag & NODE_PREVIEW) {
@@ -176,16 +226,35 @@ static void node_update(bNode *node)
/* XXX ugly hack, typeinfo for group is generated */
if(node->type == NODE_GROUP)
- ; // XXX node->typeinfo->butfunc= node_buts_group;
+ ; // XXX node->typeinfo->uifunc= node_buts_group;
+
+ /* ui block */
+ sprintf(str, "node buttons %p", node);
+ node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
+ uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
/* buttons rect? */
- if((node->flag & NODE_OPTIONS) && node->typeinfo->butfunc) {
+ if((node->flag & NODE_OPTIONS) && node->typeinfo->uifunc) {
dy-= NODE_DYS/2;
- node->butr.ymax= dy;
- node->butr.ymin= dy - (float)node->typeinfo->butfunc(NULL, NULL, node, NULL);
- dy= node->butr.ymin - NODE_DYS/2;
+
+ /* set this for uifunc() that don't use layout engine yet */
+ node->butr.xmin= 0;
+ node->butr.xmax= node->width - 2*NODE_DYS;
+ node->butr.ymin= 0;
+ node->butr.ymax= 0;
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+
+ layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
+ node->locx+NODE_DYS, dy, node->butr.xmax, 20, U.uistyles.first);
+
+ node->typeinfo->uifunc(layout, &ptr);
+ uiBlockEndAlign(node->block);
+ uiBlockLayoutResolve(node->block, NULL, &buty);
+
+ dy= buty - NODE_DYS/2;
}
-
+
/* input sockets */
for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
@@ -198,7 +267,7 @@ static void node_update(bNode *node)
/* little bit space in end */
if(node->inputs.first || (node->flag & (NODE_OPTIONS|NODE_PREVIEW))==0 )
dy-= NODE_DYS/2;
-
+
node->totr.xmin= node->locx;
node->totr.xmax= node->locx + node->width;
node->totr.ymax= node->locy;
@@ -206,11 +275,12 @@ static void node_update(bNode *node)
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update_hidden(bNode *node)
+static void node_update_hidden(const bContext *C, bNode *node)
{
bNodeSocket *nsock;
float rad, drad, hiddenrad= HIDDEN_RAD;
int totin=0, totout=0, tot;
+ char str[32];
/* calculate minimal radius */
for(nsock= node->inputs.first; nsock; nsock= nsock->next)
@@ -251,6 +321,11 @@ static void node_update_hidden(bNode *node)
rad+= drad;
}
}
+
+ /* ui block */
+ sprintf(str, "node buttons %p", node);
+ node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
+ uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
}
static int node_get_colorid(bNode *node)
@@ -275,7 +350,7 @@ static int node_get_colorid(bNode *node)
/* based on settings in node, sets drawing rect info. each redraw! */
/* note: this assumes only 1 group at a time is drawn (linked data) */
/* in node->totr the entire boundbox for the group is stored */
-static void node_update_group(bNode *gnode)
+static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNode *node;
@@ -288,9 +363,9 @@ static void node_update_group(bNode *gnode)
node->locx+= gnode->locx;
node->locy+= gnode->locy;
if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
+ node_update_hidden(C, node);
else
- node_update(node);
+ node_update(C, ntree, node);
node->locx-= gnode->locx;
node->locy-= gnode->locy;
}
@@ -473,7 +548,7 @@ static void socket_vector_menu_cb(bContext *C, void *node_v, void *ntree_v)
/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ScrArea *sa= CTX_wm_area(C);
bNode *node;
bNodeSocket *sock= socket_v;
@@ -492,6 +567,7 @@ static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v)
}
block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
/* use this for a fake extra empy space around the buttons */
uiDefBut(block, LABEL, 0, "", -4, -4, 188, 68, NULL, 0, 0, 0, 0, "");
@@ -575,61 +651,15 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
-static void do_node_internal_buttons(bContext *C, void *node_v, int event)
-{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
-
- if(event==B_NODE_EXEC) {
- if(snode->treetype==NTREE_SHADER) {
- WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING, snode->id);
- }
- else if(snode->treetype==NTREE_COMPOSIT) {
- bNode *node= node_v;
-
- NodeTagChanged(snode->edittree, node);
- /* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
-
- /* not the best implementation of the world... but we need it to work now :) */
- if(node->type==CMP_NODE_R_LAYERS && node->custom2) {
- /* add event for this window (after render curarea can be changed) */
- //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
-
- //composite_node_render(snode, node);
- //snode_handle_recalc(snode);
-
- /* add another event, a render can go fullscreen and open new window */
- //addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
- }
- else {
- node= snode_get_editgroup(snode);
- if(node)
- NodeTagIDChanged(snode->nodetree, node->id);
- }
- WM_event_add_notifier(C, NC_SCENE|ND_NODES, CTX_data_scene(C));
- }
-
- // else if(snode->treetype==NTREE_TEXTURE)
- // texture_node_event(snode, val);
- }
-
-}
-
static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *node)
{
bNodeSocket *sock;
- uiBlock *block;
uiBut *bt;
rctf *rct= &node->totr;
float /*slen,*/ iconofs;
int /*ofs,*/ color_id= node_get_colorid(node);
char showname[128]; /* 128 used below */
View2D *v2d = &ar->v2d;
- char str[32];
-
- /* make unique block name, also used for handling blocks in editnode.c */
- sprintf(str, "node buttons %p", node);
- block= uiBeginBlock(C, ar, str, UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_node_internal_buttons, node);
uiSetRoundBox(15-4);
ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
@@ -715,7 +745,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
else
BLI_strncpy(showname, node->name, 128);
- uiDefBut(block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(rct->ymax-NODE_DY),
+ uiDefBut(node->block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(rct->ymax-NODE_DY),
(int)(iconofs - rct->xmin-18.0f), NODE_DY, NULL, 0, 0, 0, 0, "");
/* body */
@@ -743,7 +773,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* hurmf... another candidate for callback, have to see how this works first */
- if(node->id && block && snode->treetype==NTREE_SHADER)
+ if(node->id && node->block && snode->treetype==NTREE_SHADER)
nodeShaderSynchronizeID(node, 0);
/* socket inputs, buttons */
@@ -751,38 +781,38 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
socket_circle_draw(sock, NODE_SOCKSIZE);
- if(block && sock->link==NULL) {
+ if(node->block && sock->link==NULL) {
float *butpoin= sock->ns.vec;
if(sock->type==SOCK_VALUE) {
- bt= uiDefButF(block, NUM, B_NODE_EXEC, sock->name,
+ bt= uiDefButF(node->block, NUM, B_NODE_EXEC, sock->name,
(short)sock->locx+NODE_DYS, (short)(sock->locy)-9, (short)node->width-NODE_DY, 17,
butpoin, sock->ns.min, sock->ns.max, 10, 2, "");
uiButSetFunc(bt, node_sync_cb, snode, node);
}
else if(sock->type==SOCK_VECTOR) {
- uiDefBlockBut(block, socket_vector_menu, sock, sock->name,
+ uiDefBlockBut(node->block, socket_vector_menu, sock, sock->name,
(short)sock->locx+NODE_DYS, (short)sock->locy-9, (short)node->width-NODE_DY, 17,
"");
}
- else if(block && sock->type==SOCK_RGBA) {
+ else if(node->block && sock->type==SOCK_RGBA) {
short labelw= (short)node->width-NODE_DY-40, width;
if(labelw>0) width= 40; else width= (short)node->width-NODE_DY;
- bt= uiDefButF(block, COL, B_NODE_EXEC, "",
+ bt= uiDefButF(node->block, COL, B_NODE_EXEC, "",
(short)(sock->locx+NODE_DYS), (short)sock->locy-8, width, 15,
butpoin, 0, 0, 0, 0, "");
uiButSetFunc(bt, node_sync_cb, snode, node);
- if(labelw>0) uiDefBut(block, LABEL, 0, sock->name,
+ if(labelw>0) uiDefBut(node->block, LABEL, 0, sock->name,
(short)(sock->locx+NODE_DYS) + 40, (short)sock->locy-8, labelw, 15,
NULL, 0, 0, 0, 0, "");
}
}
else {
- uiDefBut(block, LABEL, 0, sock->name, (short)(sock->locx+3.0f), (short)(sock->locy-9.0f),
+ uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+3.0f), (short)(sock->locy-9.0f),
(short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
}
}
@@ -803,7 +833,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
slen= snode->aspect*UI_GetStringWidth(sock->name+ofs);
}
- uiDefBut(block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
+ uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
(short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
}
}
@@ -813,33 +843,19 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
if(node->preview && node->preview->rect)
node_draw_preview(node->preview, &node->prvr);
- /* buttons */
- if(node->flag & NODE_OPTIONS) {
- if(block) {
- if(node->typeinfo->butfunc) {
- node->typeinfo->butfunc(block, snode->nodetree, node, &node->butr);
- }
- }
- }
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
+ uiEndBlock(C, node->block);
+ uiDrawBlock(C, node->block);
+ node->block= NULL;
}
static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *node)
{
- uiBlock *block;
bNodeSocket *sock;
rctf *rct= &node->totr;
float dx, centy= 0.5f*(rct->ymax+rct->ymin);
float hiddenrad= 0.5f*(rct->ymax-rct->ymin);
int color_id= node_get_colorid(node);
- char str[32], showname[128]; /* 128 is used below */
-
- /* make unique block name, also used for handling blocks in editnode.c */
- sprintf(str, "node buttons %p", node);
- block= uiBeginBlock(C, ar, str, UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_node_internal_buttons, node);
+ char showname[128]; /* 128 is used below */
/* shadow */
uiSetRoundBox(15);
@@ -884,7 +900,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
else
BLI_strncpy(showname, node->name, 128);
- uiDefBut(block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(centy-10),
+ uiDefBut(node->block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(centy-10),
(int)(rct->xmax - rct->xmin-18.0f -12.0f), NODE_DY, NULL, 0, 0, 0, 0, "");
}
@@ -910,9 +926,9 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
socket_circle_draw(sock, NODE_SOCKSIZE);
}
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-
+ uiEndBlock(C, node->block);
+ uiDrawBlock(C, node->block);
+ node->block= NULL;
}
static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
@@ -1050,7 +1066,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
{
float col[3];
View2DScrollers *scrollers;
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
UI_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0);
@@ -1081,11 +1097,11 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
/* for now, we set drawing coordinates on each redraw */
for(node= snode->nodetree->nodes.first; node; node= node->next) {
if(node->flag & NODE_GROUP_EDIT)
- node_update_group(node);
+ node_update_group(C, snode->nodetree, node);
else if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
+ node_update_hidden(C, node);
else
- node_update(node);
+ node_update(C, snode->nodetree, node);
}
node_draw_nodetree(C, ar, snode, snode->nodetree);
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index f7f637670b5..5fc09408229 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -56,7 +56,9 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_material.h"
+#include "BKE_paint.h"
#include "BKE_texture.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
@@ -74,6 +76,7 @@
#include "ED_space_api.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "RNA_access.h"
@@ -82,6 +85,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_interface.h"
#include "UI_view2d.h"
#include "node_intern.h"
@@ -211,10 +215,8 @@ void snode_handle_recalc(bContext *C, SpaceNode *snode)
WM_event_add_notifier(C, NC_MATERIAL|ND_NODES, snode->id);
else if(snode->treetype==NTREE_COMPOSIT)
WM_event_add_notifier(C, NC_SCENE|ND_NODES, snode->id);
- else if(snode->treetype==NTREE_TEXTURE) {
- // ntreeTexUpdatePreviews(snode->nodetree); /* XXX texture nodes should follow shader node methods (ton) */
- // XXX BIF_preview_changed(ID_TE);
- }
+ else if(snode->treetype==NTREE_TEXTURE)
+ WM_event_add_notifier(C, NC_TEXTURE|ND_NODES, snode->id);
}
#if 0
@@ -327,12 +329,12 @@ static void set_node_imagepath(char *str) /* called from fileselect */
#endif /* 0 */
-bNode *snode_get_editgroup(SpaceNode *snode)
+bNode *node_tree_get_editgroup(bNodeTree *nodetree)
{
bNode *gnode;
/* get the groupnode */
- for(gnode= snode->nodetree->nodes.first; gnode; gnode= gnode->next)
+ for(gnode= nodetree->nodes.first; gnode; gnode= gnode->next)
if(gnode->flag & NODE_GROUP_EDIT)
break;
return gnode;
@@ -441,7 +443,7 @@ static void composit_node_event(SpaceNode *snode, short event)
addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
}
else {
- node= snode_get_editgroup(snode);
+ node= node_tree_get_editgroup(snode->nodetree);
if(node)
NodeTagIDChanged(snode->nodetree, node->id);
@@ -485,7 +487,7 @@ static void texture_node_event(SpaceNode *snode, short event)
#endif /* 0 */
/* assumes nothing being done in ntree yet, sets the default in/out node */
/* called from shading buttons or header */
-void node_shader_default(Material *ma)
+void ED_node_shader_default(Material *ma)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
@@ -515,7 +517,7 @@ void node_shader_default(Material *ma)
/* assumes nothing being done in ntree yet, sets the default in/out node */
/* called from shading buttons or header */
-void node_composit_default(Scene *sce)
+void ED_node_composit_default(Scene *sce)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
@@ -549,7 +551,7 @@ void node_composit_default(Scene *sce)
/* assumes nothing being done in ntree yet, sets the default in/out node */
/* called from shading buttons or header */
-void node_texture_default(Tex *tx)
+void ED_node_texture_default(Tex *tx)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
@@ -574,7 +576,6 @@ void node_texture_default(Tex *tx)
nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
ntreeSolveOrder(tx->nodetree); /* needed for pointers */
- ntreeTexUpdatePreviews(tx->nodetree); /* XXX texture nodes should follow shader node methods (ton) */
}
/* Here we set the active tree(s), even called for each redraw now, so keep it fast :) */
@@ -591,7 +592,7 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
if(ob) {
Material *ma= give_current_material(ob, ob->actcol);
if(ma) {
- snode->from= material_from(ob, ob->actcol);
+ snode->from= &ob->id;
snode->id= &ma->id;
snode->nodetree= ma->nodetree;
}
@@ -613,7 +614,13 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
if(snode->texfrom==SNODE_TEX_OBJECT) {
if(ob) {
tx= give_current_texture(ob, ob->actcol);
- snode->from= (ID *)ob;
+
+ if(ob->type == OB_LAMP)
+ snode->from= (ID*)ob->data;
+ else
+ snode->from= (ID*)give_current_material(ob, ob->actcol);
+
+ /* from is not set fully for material nodes, should be ID + Node then */
}
}
else if(snode->texfrom==SNODE_TEX_WORLD) {
@@ -622,23 +629,20 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
}
else {
MTex *mtex= NULL;
+ Brush *brush= NULL;
- if(G.f & G_SCULPTMODE) {
- Sculpt *sd= scene->toolsettings->sculpt;
- if(sd && sd->brush)
- if(sd->brush->texact != -1)
- mtex= sd->brush->mtex[sd->brush->texact];
- }
- else {
- Brush *br= scene->toolsettings->imapaint.brush;
- if(br)
- mtex= br->mtex[br->texact];
- }
-
- if(mtex) {
- snode->from= (ID *)scene;
+ if(ob && (ob->mode & OB_MODE_SCULPT))
+ brush= paint_brush(&scene->toolsettings->sculpt->paint);
+ else
+ brush= paint_brush(&scene->toolsettings->imapaint.paint);
+
+ if(brush && brush->texact != -1)
+ mtex= brush->mtex[brush->texact];
+
+ snode->from= (ID *)brush;
+
+ if(mtex)
tx= mtex->tex;
- }
}
if(tx) {
@@ -720,7 +724,7 @@ void node_set_active(SpaceNode *snode, bNode *node)
NodeTagChanged(snode->edittree, node);
/* if inside group, tag entire group */
- gnode= snode_get_editgroup(snode);
+ gnode= node_tree_get_editgroup(snode->nodetree);
if(gnode)
NodeTagIDChanged(snode->nodetree, gnode->id);
@@ -751,6 +755,8 @@ void node_set_active(SpaceNode *snode, bNode *node)
#endif /* 0 */
}
+/* ***************** Edit Group operator ************* */
+
void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
{
bNode *node;
@@ -766,12 +772,9 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
}
if(gnode && gnode->type==NODE_GROUP && gnode->id) {
- if(gnode->id->lib) {
- // XXX if(okee("Make Group Local"))
- // ntreeMakeLocal((bNodeTree *)gnode->id);
- // else
- return;
- }
+ if(gnode->id->lib)
+ ntreeMakeLocal((bNodeTree *)gnode->id);
+
gnode->flag |= NODE_GROUP_EDIT;
snode->edittree= (bNodeTree *)gnode->id;
@@ -792,43 +795,102 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
// XXX BIF_preview_changed(-1); /* temp hack to force texture preview to update */
}
+}
+
+static int node_group_edit_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *gnode;
+
+ gnode= nodeGetActive(snode->edittree);
+ snode_make_group_editable(snode, gnode);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *gnode;
+
+ gnode= nodeGetActive(snode->edittree);
+ if(gnode && gnode->type==NODE_GROUP && gnode->id && gnode->id->lib) {
+ uiPupMenuOkee(C, op->type->idname, "Make group local?");
+ return OPERATOR_CANCELLED;
+ }
+
+ return node_group_edit_exec(C, op);
+}
+
+void NODE_OT_group_edit(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Edit Group";
+ ot->description = "Edit node group.";
+ ot->idname = "NODE_OT_group_edit";
- // allqueue(REDRAWNODE, 0);
+ /* api callbacks */
+ ot->invoke = node_group_edit_invoke;
+ ot->exec = node_group_edit_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-#if 0
+/* ******************** Ungroup operator ********************** */
-void node_ungroup(SpaceNode *snode)
+static int node_group_ungroup_exec(bContext *C, wmOperator *op)
{
+ SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
/* are we inside of a group? */
- gnode= snode_get_editgroup(snode);
+ gnode= node_tree_get_editgroup(snode->nodetree);
if(gnode)
snode_make_group_editable(snode, NULL);
gnode= nodeGetActive(snode->edittree);
- if(gnode==NULL) return;
+ if(gnode==NULL)
+ return OPERATOR_CANCELLED;
- if(gnode->type!=NODE_GROUP)
- error("Not a group");
- else {
- if(nodeGroupUnGroup(snode->edittree, gnode)) {
-
- // allqueue(REDRAWNODE, 0);
- }
- else
- error("Can't ungroup");
+ if(gnode->type!=NODE_GROUP) {
+ BKE_report(op->reports, RPT_ERROR, "Not a group");
+ return OPERATOR_CANCELLED;
+ }
+ else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't ungroup");
+ return OPERATOR_CANCELLED;
}
+
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_ungroup(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Ungroup";
+ ot->description = "Ungroup selected nodes.";
+ ot->idname = "NODE_OT_group_ungroup";
+
+ /* api callbacks */
+ ot->exec = node_group_ungroup_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-#endif /* 0 */
/* when links in groups change, inputs/outputs change, nodes added/deleted... */
-static void snode_verify_groups(SpaceNode *snode)
+static void node_tree_verify_groups(bNodeTree *nodetree)
{
bNode *gnode;
- gnode= snode_get_editgroup(snode);
+ gnode= node_tree_get_editgroup(nodetree);
/* does all materials */
if(gnode)
@@ -1088,7 +1150,7 @@ typedef struct NodeSizeWidget {
static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
bNode *node= editnode_get_active(snode->edittree);
NodeSizeWidget *nsw= op->customdata;
@@ -1108,9 +1170,6 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
node->width= nsw->oldwidth + mx - nsw->mxstart;
CLAMP(node->width, node->typeinfo->minwidth, node->typeinfo->maxwidth);
}
- // XXX
- if(snode->nodetree->type == NTREE_TEXTURE)
- ntreeTexUpdatePreviews(snode->nodetree); /* XXX texture nodes should follow shader node methods (ton) */
ED_region_tag_redraw(ar);
@@ -1131,7 +1190,7 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
bNode *node= editnode_get_active(snode->edittree);
@@ -1157,7 +1216,7 @@ static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event)
nsw->oldwidth= node->width;
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1177,7 +1236,7 @@ void NODE_OT_resize(wmOperatorType *ot)
ot->poll= ED_operator_node_active;
/* flags */
- ot->flag= 0;
+ ot->flag= OPTYPE_BLOCKING;
}
@@ -1230,27 +1289,14 @@ Material *editnode_get_active_material(Material *ma)
/* no undo here! */
-void node_deselectall(SpaceNode *snode, int swap)
+void node_deselectall(SpaceNode *snode)
{
bNode *node;
- if(swap) {
- for(node= snode->edittree->nodes.first; node; node= node->next)
- if(node->flag & SELECT)
- break;
- if(node==NULL) {
- for(node= snode->edittree->nodes.first; node; node= node->next)
- node->flag |= SELECT;
- return;
- }
- /* else pass on to deselect */
- }
-
for(node= snode->edittree->nodes.first; node; node= node->next)
node->flag &= ~SELECT;
}
-
int node_has_hidden_sockets(bNode *node)
{
bNodeSocket *sock;
@@ -1277,7 +1323,7 @@ static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node)
sock->flag &= ~SOCK_HIDDEN;
}
else {
- bNode *gnode= snode_get_editgroup(snode);
+ bNode *gnode= node_tree_get_editgroup(snode->nodetree);
/* hiding inside group should not break links in other group users */
if(gnode) {
@@ -1305,7 +1351,7 @@ static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node)
}
// allqueue(REDRAWNODE, 1);
- snode_verify_groups(snode);
+ node_tree_verify_groups(snode->nodetree);
}
@@ -1432,7 +1478,7 @@ void node_active_link_viewer(SpaceNode *snode)
float mx=0, my=0;
// XXX short mval[2];
- gnode= snode_get_editgroup(snode);
+ gnode= node_tree_get_editgroup(snode->nodetree);
if(gnode==NULL) return 0;
// XXX getmouseco_areawin(mval);
@@ -1607,7 +1653,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
{
bNode *node= NULL, *gnode;
- node_deselectall(snode, 0);
+ node_deselectall(snode);
if(type>=NODE_DYNAMIC_MENU) {
node= nodeAddNodeType(snode->edittree, type, NULL, NULL);
@@ -1632,13 +1678,13 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
node->locy= locy + 60.0f; // arbitrary.. so its visible
node->flag |= SELECT;
- gnode= snode_get_editgroup(snode);
+ gnode= node_tree_get_editgroup(snode->nodetree);
if(gnode) {
node->locx -= gnode->locx;
node->locy -= gnode->locy;
}
- snode_verify_groups(snode);
+ node_tree_verify_groups(snode->nodetree);
node_set_active(snode, node);
if(snode->nodetree->type==NTREE_COMPOSIT) {
@@ -1656,7 +1702,6 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
if(snode->nodetree->type==NTREE_TEXTURE) {
ntreeTexCheckCyclics(snode->edittree);
- ntreeTexUpdatePreviews(snode->edittree); /* XXX texture nodes should follow shader node methods (ton) */
}
return node;
@@ -1669,7 +1714,7 @@ void node_mute(SpaceNode *snode)
bNode *node;
/* no disabling inside of groups */
- if(snode_get_editgroup(snode))
+ if(node_tree_get_editgroup(snode->nodetree))
return;
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -1686,18 +1731,54 @@ void node_mute(SpaceNode *snode)
}
-void node_adduplicate(SpaceNode *snode)
+#endif
+
+int node_duplicate_exec(bContext *C, wmOperator *op)
{
+ SpaceNode *snode= CTX_wm_space_node(C);
ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */
ntreeSolveOrder(snode->edittree);
- snode_verify_groups(snode);
- // XXX snode_handle_recalc(snode);
+ node_tree_verify_groups(snode->nodetree);
+ snode_handle_recalc(C, snode);
-// XXX transform_nodes(snode->edittree, 'g', "Duplicate");
+ return OPERATOR_FINISHED;
+}
+
+static int node_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ node_duplicate_exec(C, op);
+
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
+
+ return OPERATOR_FINISHED;
}
+void NODE_OT_duplicate(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Duplicate Nodes";
+ ot->description = "Duplicate the nodes.";
+ ot->idname= "NODE_OT_duplicate";
+
+ /* api callbacks */
+ ot->invoke= node_duplicate_invoke;
+ ot->exec= node_duplicate_exec;
+
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* to give to transform */
+ RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+}
+
+#if 0
+
static void node_insert_convertor(SpaceNode *snode, bNodeLink *link)
{
bNode *newnode= NULL;
@@ -1796,7 +1877,7 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL
/* in_out = starting socket */
static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
NodeLinkDrag *nldrag= op->customdata;
bNode *tnode, *node;
@@ -1870,7 +1951,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
}
ntreeSolveOrder(snode->edittree);
- snode_verify_groups(snode);
+ node_tree_verify_groups(snode->nodetree);
snode_handle_recalc(C, snode);
MEM_freeN(op->customdata);
@@ -1933,7 +2014,7 @@ static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag)
static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
NodeLinkDrag *nldrag= MEM_callocN(sizeof(NodeLinkDrag), "drag link op customdata");
@@ -1952,7 +2033,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
nldrag->link= nodeAddLink(snode->edittree, NULL, NULL, nldrag->node, nldrag->sock);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1975,36 +2056,7 @@ void NODE_OT_link(wmOperatorType *ot)
ot->poll= ED_operator_node_active;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-
-void node_delete(SpaceNode *snode)
-{
- bNode *node, *next;
- bNodeSocket *sock;
-
- for(node= snode->edittree->nodes.first; node; node= next) {
- next= node->next;
- if(node->flag & SELECT) {
- /* set selin and selout NULL if the sockets belong to a node to be deleted */
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(snode->edittree->selin == sock) snode->edittree->selin= NULL;
-
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(snode->edittree->selout == sock) snode->edittree->selout= NULL;
-
- /* check id user here, nodeFreeNode is called for free dbase too */
- if(node->id)
- node->id->us--;
- nodeFreeNode(snode->edittree, node);
- }
- }
-
- snode_verify_groups(snode);
- // NODE_FIX_ME
- // snode_handle_recalc(snode);
- // allqueue(REDRAWNODE, 1);
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
}
@@ -2057,32 +2109,6 @@ void node_insert_key(SpaceNode *snode)
}
}
-void node_select_linked(SpaceNode *snode, int out)
-{
- bNodeLink *link;
- bNode *node;
-
- /* NODE_TEST is the free flag */
- for(node= snode->edittree->nodes.first; node; node= node->next)
- node->flag &= ~NODE_TEST;
-
- for(link= snode->edittree->links.first; link; link= link->next) {
- if(out) {
- if(link->fromnode->flag & NODE_SELECT)
- link->tonode->flag |= NODE_TEST;
- }
- else {
- if(link->tonode->flag & NODE_SELECT)
- link->fromnode->flag |= NODE_TEST;
- }
- }
-
- for(node= snode->edittree->nodes.first; node; node= node->next)
- if(node->flag & NODE_TEST)
- node->flag |= NODE_SELECT;
-
-}
-
/* makes a link between selected output and input sockets */
void node_make_link(SpaceNode *snode)
{
@@ -2103,7 +2129,7 @@ void node_make_link(SpaceNode *snode)
else return;
ntreeSolveOrder(snode->edittree);
- snode_verify_groups(snode);
+ node_tree_verify_groups(snode->nodetree);
// XXX snode_handle_recalc(snode);
}
@@ -2129,7 +2155,7 @@ static int cut_links_intersect(bNodeLink *link, float mcoords[][2], int tot)
static int cut_links_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
float mcoords[256][2];
int i= 0;
@@ -2158,7 +2184,7 @@ static int cut_links_exec(bContext *C, wmOperator *op)
}
ntreeSolveOrder(snode->edittree);
- snode_verify_groups(snode);
+ node_tree_verify_groups(snode->nodetree);
snode_handle_recalc(C, snode);
return OPERATOR_FINISHED;
@@ -2233,34 +2259,6 @@ void node_read_fullsamplelayers(SpaceNode *snode)
WM_cursor_wait(0);
}
-/* called from header_info, when deleting a scene
- * goes over all scenes other than the input, checks if they have
- * render layer nodes referencing the to-be-deleted scene, and
- * resets them to NULL. */
-
-/* XXX needs to get current scene then! */
-void clear_scene_in_nodes(Scene *sce)
-{
- Scene *sce1;
- bNode *node;
-
- sce1= G.main->scene.first;
- while(sce1) {
- if(sce1!=sce) {
- if (sce1->nodetree) {
- for(node= sce1->nodetree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_R_LAYERS) {
- Scene *nodesce= (Scene *)node->id;
-
- if (nodesce==sce) node->id = NULL;
- }
- }
- }
- }
- sce1= sce1->id.next;
- }
-}
-
void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser)
{
bNode *node;
@@ -2286,15 +2284,16 @@ void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser)
}
}
-/* ********************** */
+/* ****************** Make Group operator ******************* */
-void node_make_group(SpaceNode *snode)
+static int node_group_make_exec(bContext *C, wmOperator *op)
{
+ SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
if(snode->edittree!=snode->nodetree) {
-// XXX error("Can not add a new Group in a Group");
- return;
+ BKE_report(op->reports, RPT_ERROR, "Can not add a new Group in a Group");
+ return OPERATOR_CANCELLED;
}
/* for time being... is too complex to handle */
@@ -2304,20 +2303,39 @@ void node_make_group(SpaceNode *snode)
if(gnode->type==CMP_NODE_R_LAYERS)
break;
}
+
if(gnode) {
-// XXX error("Can not add RenderLayer in a Group");
- return;
+ BKE_report(op->reports, RPT_ERROR, "Can not add RenderLayer in a Group");
+ return OPERATOR_CANCELLED;
}
}
gnode= nodeMakeGroupFromSelected(snode->nodetree);
if(gnode==NULL) {
-// XXX error("Can not make Group");
+ BKE_report(op->reports, RPT_ERROR, "Can not make Group");
+ return OPERATOR_CANCELLED;
}
else {
nodeSetActive(snode->nodetree, gnode);
ntreeSolveOrder(snode->nodetree);
}
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_make(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Group";
+ ot->description = "Make group from selected nodes.";
+ ot->idname = "NODE_OT_group_make";
+
+ /* api callbacks */
+ ot->exec = node_group_make_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
#if 0
@@ -2445,9 +2463,6 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(fromlib) fromlib= -1;
else toolbox_n_add();
}
- else if(G.qual==0) {
- node_deselectall(snode, 1);
- }
break;
case BKEY:
if(G.qual==0)
@@ -2534,29 +2549,50 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
#endif
-static int node_delete_selection_exec(bContext *C, wmOperator *op)
+/* ****************** Delete operator ******************* */
+
+static int node_delete_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
- ARegion *ar= CTX_wm_region(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
+ bNode *node, *next;
+ bNodeSocket *sock;
- node_delete(snode);
- ED_region_tag_redraw(ar);
+ for(node= snode->edittree->nodes.first; node; node= next) {
+ next= node->next;
+ if(node->flag & SELECT) {
+ /* set selin and selout NULL if the sockets belong to a node to be deleted */
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(snode->edittree->selin == sock) snode->edittree->selin= NULL;
+
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ if(snode->edittree->selout == sock) snode->edittree->selout= NULL;
+
+ /* check id user here, nodeFreeNode is called for free dbase too */
+ if(node->id)
+ node->id->us--;
+ nodeFreeNode(snode->edittree, node);
+ }
+ }
+
+ node_tree_verify_groups(snode->nodetree);
+
+ // NODE_FIX_ME
+ // snode_handle_recalc(snode);
+
WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); /* Do we need to pass the scene? */
return OPERATOR_FINISHED;
}
-/* operators */
-
void NODE_OT_delete(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Delete";
+ ot->description = "Delete selected nodes.";
ot->idname= "NODE_OT_delete";
/* api callbacks */
- ot->exec= node_delete_selection_exec;
+ ot->exec= node_delete_exec;
ot->poll= ED_operator_node_active;
/* flags */
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 8c48d4b54e1..2abcd2f2135 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -45,6 +45,7 @@
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
+#include "BKE_utildefines.h"
#include "ED_screen.h"
#include "ED_types.h"
@@ -62,69 +63,11 @@
#include "node_intern.h"
-/* ************************ header area region *********************** */
+/* ************************ add menu *********************** */
-static void do_node_selectmenu(bContext *C, void *arg, int event)
+static void do_node_add(bContext *C, void *arg, int event)
{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
-
- /* functions in editnode.c assume there's a tree */
- if(snode->nodetree==NULL)
- return;
-
- switch(event) {
- case 1: /* border select */
- WM_operator_name_call(C, "NODE_OT_select_border", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 2: /* select/deselect all */
- // XXX node_deselectall(snode, 1);
- break;
- case 3: /* select linked in */
- // XXX node_select_linked(snode, 0);
- break;
- case 4: /* select linked out */
- // XXX node_select_linked(snode, 1);
- break;
- }
-
- ED_area_tag_redraw(curarea);
-}
-
-static uiBlock *node_selectmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "node_selectmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_selectmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Linked From|L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Linked To|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-void do_node_addmenu(bContext *C, void *arg, int event)
-{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
/* store selection in temp test flag */
@@ -141,315 +84,129 @@ void do_node_addmenu(bContext *C, void *arg, int event)
snode_handle_recalc(C, snode);
}
-static void node_make_addmenu(bContext *C, int nodeclass, uiBlock *block)
+static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
{
Main *bmain= CTX_data_main(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
bNodeTree *ntree;
+ int nodeclass= GET_INT_FROM_POINTER(arg_nodeclass);
int tot= 0, a;
- short yco= 0, menuwidth=120;
ntree = snode->nodetree;
- if(ntree) {
- /* mostly taken from toolbox.c, node_add_sublevel() */
- if(ntree) {
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
- for(; ngroup; ngroup= ngroup->id.next)
- if(ngroup->type==ntree->type)
- tot++;
- }
- else {
- bNodeType *type = ntree->alltypes.first;
- while(type) {
- if(type->nclass == nodeclass)
- tot++;
- type= type->next;
- }
- }
- }
-
- if(tot==0) {
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- return;
+
+ if(!ntree) {
+ uiItemS(layout);
+ return;
+ }
+
+ /* mostly taken from toolbox.c, node_add_sublevel() */
+ if(nodeclass==NODE_CLASS_GROUP) {
+ bNodeTree *ngroup= bmain->nodetree.first;
+ for(; ngroup; ngroup= ngroup->id.next)
+ if(ngroup->type==ntree->type)
+ tot++;
+ }
+ else {
+ bNodeType *type = ntree->alltypes.first;
+ while(type) {
+ if(type->nclass == nodeclass)
+ tot++;
+ type= type->next;
}
-
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
- for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
- if(ngroup->type==ntree->type) {
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, (ngroup->id.name+2), 0,
- yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1.0f, (float)(NODE_GROUP_MENU+tot), "");
- a++;
- }
+ }
+
+ if(tot==0) {
+ uiItemS(layout);
+ return;
+ }
+
+ uiLayoutSetFunc(layout, do_node_add, NULL);
+
+ if(nodeclass==NODE_CLASS_GROUP) {
+ bNodeTree *ngroup= bmain->nodetree.first;
+
+ 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);
+ a++;
}
}
- else {
- bNodeType *type;
- int script=0;
- for(a=0, type= ntree->alltypes.first; type; type=type->next) {
- if( type->nclass == nodeclass && type->name) {
- if(type->type == NODE_DYNAMIC) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, type->name, 0,
- yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1.0f, (float)(NODE_DYNAMIC_MENU+script), "");
- script++;
- } else {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, type->name, 0,
- yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1.0f, (float)(type->type), "");
- }
- a++;
+ }
+ else {
+ bNodeType *type;
+ int script=0;
+
+ 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);
+ script++;
}
+ else
+ uiItemV(layout, type->name, 0, type->type);
+
+ a++;
}
}
- } else {
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- return;
}
}
-static uiBlock *node_add_inputmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_inputmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_INPUT, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_outputmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_outputmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_OUTPUT, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_colormenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_colormenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_OP_COLOR, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_vectormenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_vectormenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_OP_VECTOR, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_filtermenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_filtermenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_OP_FILTER, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_convertermenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_convertermenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_CONVERTOR, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_mattemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_mattemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_MATTE, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_distortmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_distortmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_DISTORT, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_patternmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_patternmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_PATTERN, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_texturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_texturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_TEXTURE, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
-static uiBlock *node_add_groupmenu(bContext *C, ARegion *ar, void *arg_unused)
+static void node_menu_add(const bContext *C, Menu *menu)
{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_groupmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_GROUP, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
+ uiLayout *layout= menu->layout;
+ SpaceNode *snode= CTX_wm_space_node(C);
-static uiBlock *node_add_dynamicmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-
- block= uiBeginBlock(C, ar, "node_add_dynamicmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
- node_make_addmenu(C, NODE_CLASS_OP_DYNAMIC, block);
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- uiEndBlock(C, block);
-
- return block;
-}
+ if(!snode->nodetree)
+ uiLayoutSetActive(layout, 0);
-static uiBlock *node_addmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "node_addmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_addmenu, NULL);
-
if(snode->treetype==NTREE_SHADER) {
- uiDefIconTextBlockBut(block, node_add_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_outputmenu, NULL, ICON_RIGHTARROW_THIN, "Output", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_colormenu, NULL, ICON_RIGHTARROW_THIN, "Color", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_vectormenu, NULL, ICON_RIGHTARROW_THIN, "Vector", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_convertermenu, NULL, ICON_RIGHTARROW_THIN, "Convertor", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_dynamicmenu, NULL, ICON_RIGHTARROW_THIN, "Dynamic", 0, yco-=20, 120, 19, "");
+ uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, "Dynamic", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
}
else if(snode->treetype==NTREE_COMPOSIT) {
- uiDefIconTextBlockBut(block, node_add_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_outputmenu, NULL, ICON_RIGHTARROW_THIN, "Output", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_colormenu, NULL, ICON_RIGHTARROW_THIN, "Color", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_vectormenu, NULL, ICON_RIGHTARROW_THIN, "Vector", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_filtermenu, NULL, ICON_RIGHTARROW_THIN, "Filter", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_convertermenu, NULL, ICON_RIGHTARROW_THIN, "Convertor", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_mattemenu, NULL, ICON_RIGHTARROW_THIN, "Matte", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_distortmenu, NULL, ICON_RIGHTARROW_THIN, "Distort", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
-
- } else if(snode->treetype==NTREE_TEXTURE) {
- uiDefIconTextBlockBut(block, node_add_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_outputmenu, NULL, ICON_RIGHTARROW_THIN, "Output", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_colormenu, NULL, ICON_RIGHTARROW_THIN, "Color", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_patternmenu, NULL, ICON_RIGHTARROW_THIN, "Patterns", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_texturemenu, NULL, ICON_RIGHTARROW_THIN, "Textures", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_convertermenu, NULL, ICON_RIGHTARROW_THIN, "Convertor", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_distortmenu, NULL, ICON_RIGHTARROW_THIN, "Distort", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, node_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
- }
- else
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
+ uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, "Filter", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
+ uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Matte", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
+ uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
}
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
+ else if(snode->treetype==NTREE_TEXTURE) {
+ uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, "Patterns", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
+ uiItemMenuF(layout, "Textures", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
+ uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
}
-
- uiTextBoundsBlock(block, 50);
-
- return block;
}
+void node_menus_register(ARegionType *art)
+{
+ MenuType *mt;
+
+ mt= MEM_callocN(sizeof(MenuType), "spacetype node menu add");
+ strcpy(mt->idname, "NODE_MT_add");
+ strcpy(mt->label, "Add");
+ mt->draw= node_menu_add;
+ BLI_addtail(&art->menutypes, mt);
+}
+
+#if 0
static void do_node_nodemenu(bContext *C, void *arg, int event)
{
ScrArea *curarea= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
int fromlib=0;
/* functions in editnode.c assume there's a tree */
@@ -514,7 +271,7 @@ static void do_node_nodemenu(bContext *C, void *arg, int event)
static uiBlock *node_nodemenu(bContext *C, ARegion *ar, void *arg_unused)
{
ScrArea *curarea= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
uiBlock *block;
short yco= 0, menuwidth=120;
@@ -571,218 +328,5 @@ static uiBlock *node_nodemenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-
-static void do_node_viewmenu(bContext *C, void *arg, int event)
-{
-// SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
-// ARegion *ar= CTX_wm_region(C);
- ScrArea *sa= CTX_wm_area(C);
-
- switch(event) {
- case 1: /* Zoom in */
- WM_operator_name_call(C, "VIEW2D_OT_zoom_in", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case 2: /* View all */
- WM_operator_name_call(C, "VIEW2D_OT_zoom_out", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case 3: /* View all */
- WM_operator_name_call(C, "NODE_OT_view_all", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case 4: /* Grease Pencil */
- // XXX add_blockhandler(sa, NODES_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
- break;
- }
- ED_area_tag_redraw(sa);
-}
-
-static uiBlock *node_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "node_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_node_viewmenu, NULL);
-
- if (snode->nodetree) {
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- }
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- /* XXX if (!curarea->full)
- uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- else
- uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- */
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_node_buttons(bContext *C, void *arg, int event)
-{
- // NODE_FIX_ME : instead of using "current material/texture/scene", node editor can also pin context?
- // note: scene context better not gets overridden, that'll clash too much (ton)
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
- Material *ma;
- Tex *tx;
-
- switch(event) {
- case B_REDR:
- ED_area_tag_redraw(CTX_wm_area(C));
- break;
- case B_NODE_USEMAT:
- ma= (Material *)snode->id;
- if(ma) {
- if(ma->use_nodes && ma->nodetree==NULL) {
- node_shader_default(ma);
- snode_set_context(snode, scene);
- }
- }
- ED_area_tag_redraw(CTX_wm_area(C));
- break;
-
- case B_NODE_USESCENE:
- if(scene->use_nodes) {
- if(scene->nodetree==NULL)
- node_composit_default(scene);
- }
- snode_set_context(snode, scene);
- ED_area_tag_redraw(CTX_wm_area(C));
- break;
-
- case B_NODE_USETEX:
- tx = (Tex *)snode->id;
- if(tx) {
- tx->type = 0;
- if(tx->use_nodes && tx->nodetree==NULL) {
- node_texture_default(tx);
- snode_set_context(snode, scene);
- }
- }
- ED_area_tag_redraw(CTX_wm_area(C));
- break;
- }
-}
-
-void node_header_buttons(const bContext *C, ARegion *ar)
-{
- ScrArea *sa= CTX_wm_area(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
- uiBlock *block;
- short xco, yco= 3;
-
- block= uiBeginBlock(C, ar, "header node", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_node_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, node_viewmenu, NULL,
- "View", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Select");
- uiDefPulldownBut(block, node_selectmenu, NULL,
- "Select", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Add");
- uiDefPulldownBut(block, node_addmenu, NULL,
- "Add", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Node");
- uiDefPulldownBut(block, node_nodemenu, NULL,
- "Node", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* main type choosing */
- uiBlockBeginAlign(block);
- uiDefIconButI(block, ROW, B_REDR, ICON_MATERIAL_DATA, xco,yco,XIC,YIC-2,
- &(snode->treetype), 2.0f, 0.0f, 0.0f, 0.0f, "Material Nodes");
- xco+= XIC;
- uiDefIconButI(block, ROW, B_REDR, ICON_IMAGE_DATA, xco,yco,XIC,YIC-2,
- &(snode->treetype), 2.0f, 1.0f, 0.0f, 0.0f, "Composite Nodes");
- xco+= XIC;
- uiDefIconButI(block, ROW, B_REDR, ICON_TEXTURE_DATA, xco,yco,XIC,YIC-2,
- &(snode->treetype), 2.0f, 2.0f, 0.0f, 0.0f, "Texture Nodes");
- xco+= 2*XIC;
- uiBlockEndAlign(block);
-
- /* find and set the context */
- snode_set_context(snode, scene);
-
- if(snode->treetype==NTREE_SHADER) {
- if(snode->from) {
- /* 0, NULL -> pin */
- // XXX xco= std_libbuttons(block, xco, 0, 0, NULL, B_MATBROWSE, ID_MA, 1, snode->id, snode->from, &(snode->menunr),
- // B_MATALONE, B_MATLOCAL, B_MATDELETE, B_AUTOMATNAME, B_KEEPDATA);
-
- if(snode->id) {
- Material *ma= (Material *)snode->id;
- uiDefButC(block, TOG, B_NODE_USEMAT, "Use Nodes", xco+5,yco,90,19, &ma->use_nodes, 0.0f, 0.0f, 0, 0, "");
- xco+=80;
- }
- }
- }
- else if(snode->treetype==NTREE_COMPOSIT) {
- int icon;
-
- if(WM_jobs_test(CTX_wm_manager(C), sa)) icon= ICON_REC; else icon= ICON_BLANK1;
- uiDefIconTextButS(block, TOG, B_NODE_USESCENE, icon, "Use Nodes", xco+5,yco,100,19, &scene->use_nodes, 0.0f, 0.0f, 0, 0, "Indicate this Scene will use Nodes and execute them while editing");
- xco+= 100;
- uiDefButBitI(block, TOG, R_COMP_FREE, B_NOP, "Free Unused", xco+5,yco,100,19, &scene->r.scemode, 0.0f, 0.0f, 0, 0, "Free Nodes that are not used while composite");
- xco+= 100;
- uiDefButBitS(block, TOG, SNODE_BACKDRAW, B_REDR, "Backdrop", xco+5,yco,90,19, &snode->flag, 0.0f, 0.0f, 0, 0, "Use active Viewer Node output as backdrop");
- xco+= 90;
- }
- else if(snode->treetype==NTREE_TEXTURE) {
- if(snode->from) {
-
- // XXX xco= std_libbuttons(block, xco, 0, 0, NULL, B_TEXBROWSE, ID_TE, 1, snode->id, snode->from, &(snode->menunr),
- // B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME, B_KEEPDATA);
-
- if(snode->id) {
- Tex *tx= (Tex *)snode->id;
- uiDefButC(block, TOG, B_NODE_USETEX, "Use Nodes", xco+5,yco,90,19, &tx->use_nodes, 0.0f, 0.0f, 0, 0, "");
- xco+=80;
- }
- }
- }
-
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+100, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin));
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
+#endif
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index b73f57f935f..2a929472c68 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -31,6 +31,7 @@
/* internal exports only */
struct ARegion;
+struct ARegionType;
struct View2D;
struct bContext;
struct wmWindowManager;
@@ -45,6 +46,7 @@ struct wmWindowManager;
/* node_header.c */
void node_header_buttons(const bContext *C, ARegion *ar);
+void node_menus_register(struct ARegionType *art);
/* node_draw.c */
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d);
@@ -56,6 +58,9 @@ void node_keymap(wmWindowManager *wm);
/* node_select.c */
void NODE_OT_select(struct wmOperatorType *ot);
void NODE_OT_select_extend(struct wmOperatorType *ot);
+void NODE_OT_select_all(wmOperatorType *ot);
+void NODE_OT_select_linked_to(wmOperatorType *ot);
+void NODE_OT_select_linked_from(wmOperatorType *ot);
void NODE_OT_visibility_toggle(struct wmOperatorType *ot);
void NODE_OT_view_all(struct wmOperatorType *ot);
void NODE_OT_select_border(struct wmOperatorType *ot);
@@ -74,18 +79,19 @@ void snode_set_context(SpaceNode *snode, Scene *scene);
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
void snode_home(ScrArea *sa, ARegion *ar, SpaceNode *snode);
void node_set_active(SpaceNode *snode, bNode *node);
-void node_deselectall(SpaceNode *snode, int swap);
-void node_shader_default(Material *ma);
-void node_composit_default(Scene *sce);
-void node_texture_default(Tex *tx);
+void node_deselectall(SpaceNode *snode);
void snode_composite_job(const struct bContext *C, ScrArea *sa);
-bNode *snode_get_editgroup(SpaceNode *snode);
+bNode *node_tree_get_editgroup(bNodeTree *ntree);
void snode_autoconnect(SpaceNode *snode, bNode *node_to, int flag);
+void NODE_OT_duplicate(struct wmOperatorType *ot);
void NODE_OT_link(struct wmOperatorType *ot);
void NODE_OT_delete(struct wmOperatorType *ot);
void NODE_OT_resize(struct wmOperatorType *ot);
void NODE_OT_links_cut(struct wmOperatorType *ot);
+void NODE_OT_group_make(struct wmOperatorType *ot);
+void NODE_OT_group_ungroup(struct wmOperatorType *ot);
+void NODE_OT_group_edit(struct wmOperatorType *ot);
// XXXXXX
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 7a1cc24fa58..f47e9aa2a6f 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -37,8 +37,7 @@
#include "ED_space_api.h"
#include "ED_screen.h"
-
-#include "BIF_transform.h"
+#include "ED_transform.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -52,6 +51,9 @@ void node_operatortypes(void)
{
WM_operatortype_append(NODE_OT_select);
WM_operatortype_append(NODE_OT_select_extend);
+ WM_operatortype_append(NODE_OT_select_all);
+ WM_operatortype_append(NODE_OT_select_linked_to);
+ WM_operatortype_append(NODE_OT_select_linked_from);
WM_operatortype_append(NODE_OT_visibility_toggle);
WM_operatortype_append(NODE_OT_view_all);
WM_operatortype_append(NODE_OT_select_border);
@@ -59,11 +61,15 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_link);
WM_operatortype_append(NODE_OT_resize);
WM_operatortype_append(NODE_OT_links_cut);
+ WM_operatortype_append(NODE_OT_duplicate);
+ WM_operatortype_append(NODE_OT_group_make);
+ WM_operatortype_append(NODE_OT_group_ungroup);
+ WM_operatortype_append(NODE_OT_group_edit);
}
void node_keymap(struct wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Node", SPACE_NODE, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Node", SPACE_NODE, 0);
/* mouse select in nodes used to be both keys, it's UI elements... */
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, 0, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
@@ -71,6 +77,8 @@ void node_keymap(struct wmWindowManager *wm)
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select_extend", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select_extend", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
+ WM_keymap_add_item(keymap, "NODE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "NODE_OT_link", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_resize", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_visibility_toggle", LEFTMOUSE, KM_PRESS, 0, 0);
@@ -79,6 +87,15 @@ void node_keymap(struct wmWindowManager *wm)
WM_keymap_add_item(keymap, "NODE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_select_border", BKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NODE_OT_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_delete", DELKEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "NODE_OT_select_all", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_select_linked_to", LKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_select_linked_from", LKEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "NODE_OT_group_make", GKEY, KM_PRESS, KM_CTRL, 0);
+ 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);
transform_keymap_for_space(wm, keymap, SPACE_NODE);
}
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index 6746c21ebcf..5e482758c9d 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -83,7 +83,7 @@ static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short
}
if(node) {
if((extend & KM_SHIFT)==0)
- node_deselectall(snode, 0);
+ node_deselectall(snode);
if(extend & KM_SHIFT) {
if(node->flag & SELECT)
@@ -107,7 +107,7 @@ static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short
static int node_select_exec(bContext *C, wmOperator *op)
{
// XXX wmWindow *window= CTX_wm_window(C);
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
int select_type;
short mval[2];
@@ -140,7 +140,7 @@ static int node_select_modal(bContext *C, wmOperator *op, wmEvent *event)
printf("%d %d\n", event->x, event->y);
break;
case SELECTMOUSE:
- //if (event->val==0) {
+ //if (event->val==KM_RELEASE) {
/* calculate overall delta mouse-movement for redo */
printf("done translating\n");
//WM_cursor_restore(CTX_wm_window(C));
@@ -213,7 +213,7 @@ void NODE_OT_select(wmOperatorType *ot)
ot->modal= node_select_modal;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
RNA_def_enum(ot->srna, "select_type", prop_select_items, 0, "Select Type", "");
@@ -224,15 +224,9 @@ void NODE_OT_select(wmOperatorType *ot)
/* ****** Border Select ****** */
-static EnumPropertyItem prop_select_types[] = {
- {NODE_EXCLUSIVE, "EXCLUSIVE", 0, "Exclusive", ""}, /* right mouse */
- {NODE_EXTEND, "EXTEND", 0, "Extend", ""}, /* left mouse */
- {0, NULL, 0, NULL, NULL}
-};
-
static int node_borderselect_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
bNode *node;
rcti rect;
@@ -288,6 +282,122 @@ void NODE_OT_select_border(wmOperatorType *ot)
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
+}
+
+/* ****** Select/Deselect All ****** */
+
+static int node_select_all_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNode *first = snode->edittree->nodes.first;
+ bNode *node;
+ int count= 0;
+
+ for(node=first; node; node=node->next)
+ if(node->flag & NODE_SELECT)
+ count++;
- RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "");
+ if(count) {
+ for(node=first; node; node=node->next)
+ node->flag &= ~NODE_SELECT;
+ }
+ else {
+ for(node=first; node; node=node->next)
+ node->flag |= NODE_SELECT;
+ }
+
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+ return OPERATOR_FINISHED;
}
+
+void NODE_OT_select_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Select/Deselect All";
+ ot->description = "(De)select all nodes.";
+ ot->idname = "NODE_OT_select_all";
+
+ /* api callbacks */
+ ot->exec = node_select_all_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ****** Select Linked To ****** */
+
+static int node_select_linked_to_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNodeLink *link;
+ bNode *node;
+
+ for (node=snode->edittree->nodes.first; node; node=node->next)
+ node->flag &= ~NODE_TEST;
+
+ for (link=snode->edittree->links.first; link; link=link->next)
+ if (link->fromnode->flag & NODE_SELECT)
+ link->tonode->flag |= NODE_TEST;
+
+ for (node=snode->edittree->nodes.first; node; node=node->next)
+ if (node->flag & NODE_TEST)
+ node->flag |= NODE_SELECT;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_select_linked_to(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Select Linked To";
+ ot->description = "Select nodes linked to the selected ones.";
+ ot->idname = "NODE_OT_select_linked_to";
+
+ /* api callbacks */
+ ot->exec = node_select_linked_to_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ****** Select Linked From ****** */
+
+static int node_select_linked_from_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ bNodeLink *link;
+ bNode *node;
+
+ for(node=snode->edittree->nodes.first; node; node=node->next)
+ node->flag &= ~NODE_TEST;
+
+ for(link=snode->edittree->links.first; link; link=link->next)
+ if(link->tonode->flag & NODE_SELECT)
+ link->fromnode->flag |= NODE_TEST;
+
+ for(node=snode->edittree->nodes.first; node; node=node->next)
+ if(node->flag & NODE_TEST)
+ node->flag |= NODE_SELECT;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_select_linked_from(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Select Linked From";
+ ot->description = "Select nodes linked from the selected ones.";
+ ot->idname = "NODE_OT_select_linked_from";
+
+ /* api callbacks */
+ ot->exec = node_select_linked_from_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index f05a24ef05a..dcab3dc0895 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -140,7 +140,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval)
static int node_toggle_visibility_exec(bContext *C, wmOperator *op)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
short mval[2];
@@ -183,11 +183,11 @@ void NODE_OT_visibility_toggle(wmOperatorType *ot)
RNA_def_int(ot->srna, "mouse_y", 0, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
}
-static int node_fit_all_exec(bContext *C, wmOperator *op)
+static int node_view_all_exec(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
snode_home(sa, ar, snode);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
@@ -196,11 +196,11 @@ static int node_fit_all_exec(bContext *C, wmOperator *op)
void NODE_OT_view_all(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Fit All";
+ ot->name= "View All";
ot->idname= "NODE_OT_view_all";
/* api callbacks */
- ot->exec= node_fit_all_exec;
+ ot->exec= node_view_all_exec;
ot->poll= ED_operator_node_active;
/* flags */
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index ac3a884c5f8..12a5f33e119 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -46,6 +46,7 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "BKE_node.h"
#include "ED_previewrender.h"
#include "ED_space_api.h"
@@ -81,6 +82,7 @@ static SpaceLink *node_new(const bContext *C)
ar->regiontype= RGN_TYPE_HEADER;
ar->alignment= RGN_ALIGN_BOTTOM;
+#if 0
/* channels */
ar= MEM_callocN(sizeof(ARegion), "nodetree area for node");
@@ -89,6 +91,7 @@ static SpaceLink *node_new(const bContext *C)
ar->alignment= RGN_ALIGN_LEFT;
//ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+#endif
/* main area */
ar= MEM_callocN(sizeof(ARegion), "main area for node");
@@ -116,7 +119,7 @@ static SpaceLink *node_new(const bContext *C)
ar->v2d.maxzoom= 1.21f;
ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
- ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT;
+ ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
ar->v2d.keeptot= 0;
return (SpaceLink *)snode;
@@ -150,12 +153,25 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
if(wmn->data==ND_FILEREAD)
ED_area_tag_refresh(sa);
break;
-
+
+ /* future: add ID checks? */
case NC_MATERIAL:
- /* future: add ID check? */
if(wmn->data==ND_SHADING)
ED_area_tag_refresh(sa);
break;
+ case NC_TEXTURE:
+ if(wmn->data==ND_NODES)
+ ED_area_tag_refresh(sa);
+ break;
+ case NC_TEXT:
+ /* pynodes */
+ if(wmn->data==ND_SHADING)
+ ED_area_tag_refresh(sa);
+ break;
+ case NC_SPACE:
+ if(wmn->data==ND_SPACE_NODE)
+ ED_area_tag_refresh(sa);
+ break;
}
}
@@ -168,13 +184,19 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa)
if(snode->treetype==NTREE_SHADER) {
Material *ma= (Material *)snode->id;
if(ma->use_nodes)
- ED_preview_shader_job(C, sa, snode->id, 100, 100);
+ ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100);
}
else if(snode->treetype==NTREE_COMPOSIT) {
Scene *scene= (Scene *)snode->id;
if(scene->use_nodes)
snode_composite_job(C, sa);
}
+ else if(snode->treetype==NTREE_TEXTURE) {
+ Tex *tex= (Tex *)snode->id;
+ if(tex->use_nodes) {
+ ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100);
+ }
+ }
}
}
@@ -189,6 +211,7 @@ static SpaceLink *node_duplicate(SpaceLink *sl)
return (SpaceLink *)snoden;
}
+#if 0
static void node_channel_area_init(wmWindowManager *wm, ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
@@ -217,16 +240,17 @@ static void node_channel_area_draw(const bContext *C, ARegion *ar)
UI_view2d_scrollers_draw(C, v2d, scrollers);
UI_view2d_scrollers_free(scrollers);
}
+#endif
/* Initialise main area, setting handlers. */
static void node_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Node", SPACE_NODE, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Node", SPACE_NODE, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -240,29 +264,18 @@ static void node_main_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
static void node_header_area_init(wmWindowManager *wm, ARegion *ar)
{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+ ED_region_header_init(ar);
}
static void node_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- node_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
+ Scene *scene= CTX_data_scene(C);
+
+ /* find and set the context */
+ snode_set_context(snode, scene);
+
+ ED_region_header(C, ar);
}
/* used for header + main area */
@@ -271,9 +284,9 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn)
/* context changes */
switch(wmn->category) {
case NC_SCENE:
- ED_region_tag_redraw(ar);
- break;
case NC_MATERIAL:
+ case NC_TEXTURE:
+ case NC_NODE:
ED_region_tag_redraw(ar);
break;
}
@@ -281,7 +294,7 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn)
static int node_context(const bContext *C, const char *member, bContextDataResult *result)
{
- SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ SpaceNode *snode= CTX_wm_space_node(C);
if(CTX_data_dir(member)) {
static const char *dir[] = {"selected_nodes", NULL};
@@ -340,7 +353,10 @@ void ED_spacetype_node(void)
art->draw= node_header_area_draw;
BLI_addhead(&st->regiontypes, art);
+
+ node_menus_register(art);
+#if 0
/* regions: channels */
art= MEM_callocN(sizeof(ARegionType), "spacetype node region");
art->regionid = RGN_TYPE_CHANNELS;
@@ -351,6 +367,7 @@ void ED_spacetype_node(void)
art->draw= node_channel_area_draw;
BLI_addhead(&st->regiontypes, art);
+#endif
BKE_spacetype_register(st);
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 8017b8437ff..a1fdbab9ccc 100644
--- a/source/blender/editors/space_outliner/outliner.c
+++ b/source/blender/editors/space_outliner/outliner.c
@@ -82,6 +82,8 @@
#include "BKE_sequence.h"
#include "BKE_utildefines.h"
+#include "ED_armature.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_util.h"
#include "ED_types.h"
@@ -98,11 +100,14 @@
#include "UI_view2d.h"
#include "RNA_access.h"
+#include "RNA_define.h"
#include "ED_armature.h"
#include "ED_keyframing.h"
#include "ED_object.h"
+#include "ED_particle.h"
#include "ED_screen.h"
+#include "ED_view3d.h"
#include "outliner_intern.h"
@@ -128,18 +133,15 @@
/* ************* XXX **************** */
-static void BIF_undo_push() {}
-static void BIF_preview_changed() {}
static void error() {}
-static int pupmenu() {return 0;}
/* ********************************** */
/* ******************** PROTOTYPES ***************** */
-static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty);
-static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBase *lb,
- void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *));
+static void outliner_draw_tree_element(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty);
+static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb,
+ void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *));
/* ******************** PERSISTANT DATA ***************** */
@@ -551,16 +553,6 @@ static void outliner_add_scene_contents(SpaceOops *soops, ListBase *lb, Scene *s
}
outliner_add_element(soops, lb, sce->world, te, 0, 0);
-
- if(sce->scriptlink.scripts) {
- int a= 0;
- tenla= outliner_add_element(soops, lb, sce, te, TSE_SCRIPT_BASE, 0);
- tenla->name= "Scripts";
- for (a=0; a<sce->scriptlink.totscript; a++) {
- outliner_add_element(soops, &tenla->subtree, sce->scriptlink.scripts[a], tenla, 0, 0);
- }
- }
-
}
static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv,
@@ -569,7 +561,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
TreeElement *te;
TreeStoreElem *tselem;
ID *id= idv;
- int a;
+ int a = 0;
if(ELEM3(type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) {
id= ((PointerRNA*)idv)->id.data;
@@ -628,7 +620,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
tenla->name= "Pose";
- if(arm->edbo==NULL && (ob->flag & OB_POSEMODE)) { // channels undefined in editmode, but we want the 'tenla' pose icon itself
+ if(arm->edbo==NULL && (ob->mode & OB_MODE_POSE)) { // channels undefined in editmode, but we want the 'tenla' pose icon itself
int a= 0, const_index= 1000; /* ensure unique id for bone constraints */
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next, a++) {
@@ -767,15 +759,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
ten->directdata= defgroup;
}
}
- if(ob->scriptlink.scripts) {
- TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_SCRIPT_BASE, 0);
- int a= 0;
-
- tenla->name= "Scripts";
- for (a=0; a<ob->scriptlink.totscript; a++) { /* ** */
- outliner_add_element(soops, &tenla->subtree, ob->scriptlink.scripts[a], te, 0, 0);
- }
- }
if(ob->dup_group)
outliner_add_element(soops, &te->subtree, ob->dup_group, te, 0, 0);
@@ -904,7 +887,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else {
/* do not extend Armature when we have posemode */
tselem= TREESTORE(te->parent);
- if( GS(tselem->id->name)==ID_OB && ((Object *)tselem->id)->flag & OB_POSEMODE);
+ if( GS(tselem->id->name)==ID_OB && ((Object *)tselem->id)->mode & OB_MODE_POSE);
else {
Bone *curBone;
for (curBone=arm->bonebase.first; curBone; curBone=curBone->next){
@@ -949,7 +932,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
/* NLA Data */
if (adt->nla_tracks.first) {
-#if 0
TreeElement *tenla= outliner_add_element(soops, &te->subtree, adt, te, TSE_NLA, 0);
NlaTrack *nlt;
int a= 0;
@@ -957,17 +939,18 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
tenla->name= "NLA Tracks";
for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
- TreeElement *tenlt= outliner_add_element(soops, &te->subtree, nlt, te, TSE_NLA_TRACK, a);
- bActionStrip *strip;
+ TreeElement *tenlt= outliner_add_element(soops, &tenla->subtree, nlt, tenla, TSE_NLA_TRACK, a);
+ NlaStrip *strip;
TreeElement *ten;
int b= 0;
- for (strip=nlt->strips.first; strip; strip=strip->next, a++) {
- ten= outliner_add_element(soops, &tenla->subtree, strip->act, tenla, TSE_NLA_ACTION, a);
+ tenlt->name= nlt->name;
+
+ for (strip=nlt->strips.first; strip; strip=strip->next, b++) {
+ ten= outliner_add_element(soops, &tenlt->subtree, strip->act, tenlt, TSE_NLA_ACTION, b);
if(ten) ten->directdata= strip;
}
}
-#endif
}
}
else if(type==TSE_SEQUENCE) {
@@ -1033,7 +1016,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
PointerRNA pptr, propptr, *ptr= (PointerRNA*)idv;
PropertyRNA *prop, *iterprop;
PropertyType proptype;
- PropertySubType propsubtype;
int a, tot;
/* we do lazy build, for speed and to avoid infinite recusion */
@@ -1102,7 +1084,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
te->flag |= TE_LAZY_CLOSED;
}
else if(ELEM3(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
- tot= RNA_property_array_length(prop);
+ tot= RNA_property_array_length(ptr, prop);
if(!(tselem->flag & TSE_CLOSED)) {
for(a=0; a<tot; a++)
@@ -1113,32 +1095,61 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
}
}
else if(type == TSE_RNA_ARRAY_ELEM) {
- /* array property element */
- static char *vectoritem[4]= {" x", " y", " z", " w"};
- static char *quatitem[4]= {" w", " x", " y", " z"};
- static char *coloritem[4]= {" r", " g", " b", " a"};
+ char c;
prop= parent->directdata;
- proptype= RNA_property_type(prop);
- propsubtype= RNA_property_subtype(prop);
- tot= RNA_property_array_length(prop);
te->directdata= prop;
te->rnaptr= *ptr;
te->index= index;
- if(tot == 4 && propsubtype == PROP_ROTATION)
- te->name= quatitem[index];
- else if(tot <= 4 && (propsubtype == PROP_VECTOR || propsubtype == PROP_ROTATION))
- te->name= vectoritem[index];
- else if(tot <= 4 && propsubtype == PROP_COLOR)
- te->name= coloritem[index];
- else {
- te->name= MEM_callocN(sizeof(char)*20, "OutlinerRNAArrayName");
- sprintf(te->name, " %d", index+1);
- te->flag |= TE_FREE_NAME;
+ 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);
+ te->flag |= TE_FREE_NAME;
+ }
+ }
+ else if(type == TSE_KEYMAP) {
+ wmKeyMap *km= (wmKeyMap *)idv;
+ wmKeymapItem *kmi;
+ char opname[OP_MAX_TYPENAME];
+
+ te->directdata= idv;
+ te->name= km->nameid;
+
+ if(!(tselem->flag & TSE_CLOSED)) {
+ a= 0;
+
+ for (kmi= km->keymap.first; kmi; kmi= kmi->next, a++) {
+ const char *key= WM_key_event_string(kmi->type);
+
+ if(key[0]) {
+ wmOperatorType *ot= NULL;
+
+ if(kmi->propvalue);
+ else ot= WM_operatortype_find(kmi->idname, 0);
+
+ if(ot || kmi->propvalue) {
+ TreeElement *ten= outliner_add_element(soops, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a);
+
+ ten->directdata= kmi;
+
+ if(kmi->propvalue) {
+ ten->name= "Modal map, not yet";
+ }
+ else {
+ WM_operator_py_idname(opname, ot->idname);
+ ten->name= BLI_strdup(opname);
+ ten->flag |= TE_FREE_NAME;
+ }
+ }
+ }
}
}
+ else
+ te->flag |= TE_LAZY_CLOSED;
}
return te;
@@ -1393,6 +1404,14 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
tselem->flag &= ~TSE_CLOSED;
}
}
+ else if(soops->outlinevis==SO_KEYMAP) {
+ wmWindowManager *wm= mainvar->wm.first;
+ wmKeyMap *km;
+
+ for(km= wm->keymaps.first; km; km= km->next) {
+ ten= outliner_add_element(soops, &soops->tree, (void*)km, NULL, TSE_KEYMAP, 0);
+ }
+ }
else {
ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0);
if(ten) ten->directdata= BASACT;
@@ -1445,9 +1464,10 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short
}
}
-void object_toggle_visibility_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+/* --- */
+
+void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL; // XXX
Base *base= (Base *)te->directdata;
if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
@@ -1456,18 +1476,37 @@ void object_toggle_visibility_cb(TreeElement *te, TreeStoreElem *tsep, TreeStore
}
}
-void outliner_toggle_visibility(Scene *scene, SpaceOops *soops)
+static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op)
{
-
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_visibility_cb);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb);
- BIF_undo_push("Outliner toggle selectability");
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+void OUTLINER_OT_visibility_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Visability";
+ ot->idname= "OUTLINER_OT_visibility_toggle";
+ ot->description= "Toggle the visibility of selected items.";
+
+ /* callbacks */
+ ot->exec= outliner_toggle_visibility_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static void object_toggle_selectability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+/* --- */
+
+static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL; // XXX
Base *base= (Base *)te->directdata;
if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
@@ -1476,18 +1515,37 @@ static void object_toggle_selectability_cb(TreeElement *te, TreeStoreElem *tsep,
}
}
-void outliner_toggle_selectability(Scene *scene, SpaceOops *soops)
+static int outliner_toggle_selectability_exec(bContext *C, wmOperator *op)
{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_selectability_cb);
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb);
- BIF_undo_push("Outliner toggle selectability");
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+void OUTLINER_OT_selectability_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Selectability";
+ ot->idname= "OUTLINER_OT_selectability_toggle";
+ ot->description= "Toggle the selectability";
+
+ /* callbacks */
+ ot->exec= outliner_toggle_selectability_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void object_toggle_renderability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+/* --- */
+
+void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL; // XXX
Base *base= (Base *)te->directdata;
if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
@@ -1496,39 +1554,100 @@ void object_toggle_renderability_cb(TreeElement *te, TreeStoreElem *tsep, TreeSt
}
}
-void outliner_toggle_renderability(Scene *scene, SpaceOops *soops)
+static int outliner_toggle_renderability_exec(bContext *C, wmOperator *op)
{
-
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_renderability_cb);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
- BIF_undo_push("Outliner toggle renderability");
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_renderability_cb);
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+void OUTLINER_OT_renderability_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Renderability";
+ ot->idname= "OUTLINER_OT_renderability_toggle";
+ ot->description= "Toggle the renderbility of selected items.";
+
+ /* callbacks */
+ ot->exec= outliner_toggle_renderability_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void outliner_toggle_visible(SpaceOops *soops)
+/* --- */
+
+static int outliner_toggle_expanded_exec(bContext *C, wmOperator *op)
{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ ARegion *ar= CTX_wm_region(C);
- if( outliner_has_one_flag(soops, &soops->tree, TSE_CLOSED, 1))
+ if (outliner_has_one_flag(soops, &soops->tree, TSE_CLOSED, 1))
outliner_set_flag(soops, &soops->tree, TSE_CLOSED, 0);
else
outliner_set_flag(soops, &soops->tree, TSE_CLOSED, 1);
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
- BIF_undo_push("Outliner toggle visible");
+void OUTLINER_OT_expanded_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Expand/Collapse All";
+ ot->idname= "OUTLINER_OT_expanded_toggle";
+ ot->description= "Expand/Collapse all items.";
+
+ /* callbacks */
+ ot->exec= outliner_toggle_expanded_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void outliner_toggle_selected(ARegion *ar, SpaceOops *soops)
+/* --- */
+
+static int outliner_toggle_selected_exec(bContext *C, wmOperator *op)
{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ ARegion *ar= CTX_wm_region(C);
- if( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1))
+ if (outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1))
outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0);
else
outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 1);
- BIF_undo_push("Outliner toggle selected");
soops->storeflag |= SO_TREESTORE_REDRAW;
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
}
+void OUTLINER_OT_selected_toggle(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Toggle Selected";
+ ot->idname= "OUTLINER_OT_selected_toggle";
+ ot->description= "Toggle the Outliner selection of items.";
+
+ /* callbacks */
+ ot->exec= outliner_toggle_selected_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+/* --- */
+
+/* helper function for Show/Hide one level operator */
static void outliner_openclose_level(SpaceOops *soops, ListBase *lb, int curlevel, int level, int open)
{
TreeElement *te;
@@ -1548,6 +1667,43 @@ static void outliner_openclose_level(SpaceOops *soops, ListBase *lb, int curleve
}
}
+static int outliner_one_level_exec(bContext *C, wmOperator *op)
+{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ ARegion *ar= CTX_wm_region(C);
+ int add= RNA_boolean_get(op->ptr, "open");
+ int level;
+
+ level= outliner_has_one_flag(soops, &soops->tree, TSE_CLOSED, 1);
+ if(add==1) {
+ if(level) outliner_openclose_level(soops, &soops->tree, 1, level, 1);
+ }
+ else {
+ if(level==0) level= outliner_count_levels(soops, &soops->tree, 0);
+ if(level) outliner_openclose_level(soops, &soops->tree, 1, level-1, 0);
+ }
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void OUTLINER_OT_show_one_level(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show/Hide One Level";
+ ot->idname= "OUTLINER_OT_show_one_level";
+
+ /* callbacks */
+ ot->exec= outliner_one_level_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "open", 1, "Open", "Expand all entries one level deep.");
+}
+
/* return 1 when levels were opened */
static int outliner_open_back(SpaceOops *soops, TreeElement *te)
{
@@ -1590,22 +1746,7 @@ static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *te
}
#endif
-void outliner_one_level(SpaceOops *soops, int add)
-{
- int level;
-
- level= outliner_has_one_flag(soops, &soops->tree, TSE_CLOSED, 1);
- if(add==1) {
- if(level) outliner_openclose_level(soops, &soops->tree, 1, level, 1);
- }
- else {
- if(level==0) level= outliner_count_levels(soops, &soops->tree, 0);
- if(level) outliner_openclose_level(soops, &soops->tree, 1, level-1, 0);
- }
-
- BIF_undo_push("Outliner show/hide one level");
-}
-
+// XXX just use View2D ops for this?
void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up)
{
int dy= ar->v2d.mask.ymax-ar->v2d.mask.ymin;
@@ -1619,7 +1760,7 @@ void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up)
/* **** do clicks on items ******* */
-static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_renderlayer(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
{
Scene *sce;
@@ -1630,6 +1771,7 @@ static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tsele
if(set) {
sce->r.actlay= tselem->nr;
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, sce);
}
else {
return sce->r.actlay==tselem->nr;
@@ -1637,13 +1779,12 @@ static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tsele
return 0;
}
-static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te)
+static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeStoreElem *tselem= TREESTORE(te);
Scene *sce;
Base *base;
Object *ob= NULL;
- int shift= 0; // XXX
/* if id is not object, we search back */
if(te->idcode==ID_OB) ob= (Object *)tselem->id;
@@ -1662,7 +1803,7 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
for(base= FIRSTBASE; base; base= base->next)
if(base->object==ob) break;
if(base) {
- if(shift) {
+ if(set==2) {
/* swap select */
if(base->flag & SELECT)
ED_base_object_select(base, BA_DESELECT);
@@ -1682,11 +1823,14 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
ED_base_object_activate(C, base); /* adds notifier */
}
-// XXX if(ob!=obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
-// else countall(); /* exit_editmode calls f() */
+ if(ob!=scene->obedit)
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
+
}
-static int tree_element_active_material(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tes;
Object *ob;
@@ -1700,32 +1844,33 @@ static int tree_element_active_material(Scene *scene, SpaceOops *soops, TreeElem
if(tes->idcode==ID_OB) {
if(set) {
ob->actcol= te->index+1;
- ob->colbits |= (1<<te->index); // make ob material active too
+ ob->matbits[te->index]= 1; // make ob material active too
+ ob->colbits |= (1<<te->index);
}
else {
if(ob->actcol == te->index+1)
- if(ob->colbits & (1<<te->index)) return 1;
+ if(ob->matbits[te->index]) return 1;
}
}
/* or we search for obdata material */
else {
if(set) {
ob->actcol= te->index+1;
- ob->colbits &= ~(1<<te->index); // make obdata material active too
+ ob->matbits[te->index]= 0; // make obdata material active too
+ ob->colbits &= ~(1<<te->index);
}
else {
if(ob->actcol == te->index+1)
- if( (ob->colbits & (1<<te->index))==0 ) return 1;
+ if(ob->matbits[te->index]==0) return 1;
}
}
if(set) {
-// XXX extern_set_butspace(F5KEY, 0); // force shading buttons
- BIF_preview_changed(ID_MA);
+ WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING, NULL);
}
return 0;
}
-static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tep;
TreeStoreElem *tselem, *tselemp;
@@ -1749,7 +1894,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme
if(set) {
if(sbuts) {
// XXX sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c
- sbuts->texfrom= 1;
+ // XXX sbuts->texfrom= 1;
}
// XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture
wrld->texact= te->index;
@@ -1763,7 +1908,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme
if(set) {
if(sbuts) {
// XXX sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c
- sbuts->texfrom= 2;
+ // XXX sbuts->texfrom= 2;
}
// XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture
la->texact= te->index;
@@ -1779,7 +1924,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme
if(set) {
if(sbuts) {
//sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c
- sbuts->texfrom= 0;
+ // XXX sbuts->texfrom= 0;
}
// XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture
ma->texact= (char)te->index;
@@ -1796,7 +1941,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme
}
-static int tree_element_active_lamp(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_lamp(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
Object *ob;
@@ -1806,14 +1951,13 @@ static int tree_element_active_lamp(Scene *scene, SpaceOops *soops, TreeElement
if(set) {
// XXX extern_set_butspace(F5KEY, 0);
- BIF_preview_changed(ID_LA);
}
else return 1;
return 0;
}
-static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_world(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tep;
TreeStoreElem *tselem=NULL;
@@ -1827,7 +1971,7 @@ static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement
if(set) { // make new scene active
if(sce && scene != sce) {
- // XXX ED_screen_set_scene(C, sce);
+ ED_screen_set_scene(C, sce);
}
}
@@ -1842,7 +1986,7 @@ static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement
return 0;
}
-static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
Object *ob;
@@ -1850,7 +1994,8 @@ static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStore
ob= (Object *)tselem->id;
if(set) {
ob->actdef= te->index+1;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
else {
if(ob==OBACT)
@@ -1859,13 +2004,14 @@ static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStore
return 0;
}
-static int tree_element_active_posegroup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_posegroup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
if(set) {
if (ob->pose) {
ob->pose->active_group= te->index+1;
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
}
else {
@@ -1876,7 +2022,7 @@ static int tree_element_active_posegroup(Scene *scene, TreeElement *te, TreeStor
return 0;
}
-static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
bPoseChannel *pchan= te->directdata;
@@ -1884,10 +2030,16 @@ static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeSt
if(set) {
if(!(pchan->bone->flag & BONE_HIDDEN_P)) {
-// XXX if(G.qual & LR_SHIFTKEY) deselectall_posearmature(ob, 2, 0); // 2 = clear active tag
-// else deselectall_posearmature(ob, 0, 0); // 0 = deselect
- pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE;
+ if(set==2) ED_pose_deselectall(ob, 2, 0); // 2 = clear active tag
+ else ED_pose_deselectall(ob, 0, 0); // 0 = deselect
+
+ if(set==2 && (pchan->bone->flag & BONE_SELECTED))
+ pchan->bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE);
+ else
+ pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE;
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, ob);
+
}
}
else {
@@ -1898,17 +2050,22 @@ static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeSt
return 0;
}
-static int tree_element_active_bone(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
bArmature *arm= (bArmature *)tselem->id;
Bone *bone= te->directdata;
if(set) {
if(!(bone->flag & BONE_HIDDEN_P)) {
-// XXX if(G.qual & LR_SHIFTKEY) deselectall_posearmature(OBACT, 2, 0); // 2 is clear active tag
-// else deselectall_posearmature(OBACT, 0, 0);
- bone->flag |= BONE_SELECTED|BONE_ACTIVE;
+ if(set==2) ED_pose_deselectall(OBACT, 2, 0); // 2 is clear active tag
+ else ED_pose_deselectall(OBACT, 0, 0);
+ if(set==2 && (bone->flag & BONE_SELECTED))
+ bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE);
+ else
+ bone->flag |= BONE_SELECTED|BONE_ACTIVE;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, OBACT);
}
}
else {
@@ -1923,21 +2080,21 @@ static int tree_element_active_bone(Scene *scene, TreeElement *te, TreeStoreElem
/* ebones only draw in editmode armature */
-static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
EditBone *ebone= te->directdata;
-// int shift= 0; // XXX
if(set) {
if(!(ebone->flag & BONE_HIDDEN_A)) {
-// XXX if(shift) deselectall_armature(2, 0); // only clear active tag
-// else deselectall_armature(0, 0); // deselect
+ if(set==2) ED_armature_deselectall(scene->obedit, 2, 0); // only clear active tag
+ else ED_armature_deselectall(scene->obedit, 0, 0); // deselect
ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_ACTIVE;
// 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);
}
}
else {
@@ -1946,78 +2103,90 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int
return 0;
}
-static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
{
if(set) {
+ Object *ob= (Object *)tselem->id;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
// XXX extern_set_butspace(F9KEY, 0);
}
return 0;
}
-static int tree_element_active_psys(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
if(set) {
-// Object *ob= (Object *)tselem->id;
-// ParticleSystem *psys= te->directdata;
+ Object *ob= (Object *)tselem->id;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, ob);
-// XXX PE_change_act_psys(ob, psys);
// XXX extern_set_butspace(F7KEY, 0);
}
return 0;
}
-static int tree_element_active_constraint(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
{
if(set) {
+ Object *ob= (Object *)tselem->id;
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
// XXX extern_set_butspace(F7KEY, 0);
}
return 0;
}
-static int tree_element_active_text(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_text(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
// XXX removed
return 0;
}
/* generic call for ID data check or make/check active in UI */
-static int tree_element_active(Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
switch(te->idcode) {
case ID_MA:
- return tree_element_active_material(scene, soops, te, set);
+ return tree_element_active_material(C, scene, soops, te, set);
case ID_WO:
- return tree_element_active_world(scene, soops, te, set);
+ return tree_element_active_world(C, scene, soops, te, set);
case ID_LA:
- return tree_element_active_lamp(scene, soops, te, set);
+ return tree_element_active_lamp(C, scene, soops, te, set);
case ID_TE:
- return tree_element_active_texture(scene, soops, te, set);
+ return tree_element_active_texture(C, scene, soops, te, set);
case ID_TXT:
- return tree_element_active_text(scene, soops, te, set);
+ return tree_element_active_text(C, scene, soops, te, set);
}
return 0;
}
-static int tree_element_active_pose(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
+ Base *base= object_in_scene(ob, scene);
if(set) {
-// XXX if(obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
-// if(ob->flag & OB_POSEMODE) exit_posemode();
-// else enter_posemode();
+ if(scene->obedit)
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
+
+ if(ob->mode & OB_MODE_POSE)
+ ED_armature_exit_posemode(C, base);
+ else
+ ED_armature_enter_posemode(C, base);
}
else {
- if(ob->flag & OB_POSEMODE) return 1;
+ if(ob->mode & OB_MODE_POSE) return 1;
}
return 0;
}
-static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
{
Sequence *seq= (Sequence*) te->directdata;
@@ -2031,7 +2200,7 @@ static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *tselem,
return(0);
}
-static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
{
Sequence *seq, *p;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -2058,6 +2227,21 @@ static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeS
return(0);
}
+static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+{
+ wmKeymapItem *kmi= te->directdata;
+
+ if(set==0) {
+ if(kmi->inactive) return 0;
+ return 1;
+ }
+ else {
+ kmi->inactive= !kmi->inactive;
+ }
+ return 0;
+}
+
+
/* generic call for non-id data to make/check active in UI */
/* Context can be NULL when set==0 */
static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set)
@@ -2065,59 +2249,56 @@ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops,
switch(tselem->type) {
case TSE_DEFGROUP:
- return tree_element_active_defgroup(scene, te, tselem, set);
+ return tree_element_active_defgroup(C, scene, te, tselem, set);
case TSE_BONE:
- return tree_element_active_bone(scene, te, tselem, set);
+ return tree_element_active_bone(C, scene, te, tselem, set);
case TSE_EBONE:
- return tree_element_active_ebone(te, tselem, set);
+ return tree_element_active_ebone(C, scene, te, tselem, set);
case TSE_MODIFIER:
- return tree_element_active_modifier(te, tselem, set);
+ return tree_element_active_modifier(C, te, tselem, set);
case TSE_LINKED_OB:
- if(set) tree_element_set_active_object(C, scene, soops, te);
+ if(set) tree_element_set_active_object(C, scene, soops, te, set);
else if(tselem->id==(ID *)OBACT) return 1;
break;
case TSE_LINKED_PSYS:
- return tree_element_active_psys(te, tselem, set);
- break;
+ return tree_element_active_psys(C, scene, te, tselem, set);
case TSE_POSE_BASE:
- return tree_element_active_pose(te, tselem, set);
- break;
+ return tree_element_active_pose(C, scene, te, tselem, set);
case TSE_POSE_CHANNEL:
- return tree_element_active_posechannel(scene, te, tselem, set);
+ return tree_element_active_posechannel(C, scene, te, tselem, set);
case TSE_CONSTRAINT:
- return tree_element_active_constraint(te, tselem, set);
+ return tree_element_active_constraint(C, te, tselem, set);
case TSE_R_LAYER:
- return tree_element_active_renderlayer(te, tselem, set);
+ return tree_element_active_renderlayer(C, te, tselem, set);
case TSE_POSEGRP:
- return tree_element_active_posegroup(scene, te, tselem, set);
+ return tree_element_active_posegroup(C, scene, te, tselem, set);
case TSE_SEQUENCE:
- return tree_element_active_sequence(te, tselem, set);
- break;
+ return tree_element_active_sequence(C, te, tselem, set);
case TSE_SEQUENCE_DUP:
- return tree_element_active_sequence_dup(scene, te, tselem, set);
- break;
+ return tree_element_active_sequence_dup(C, scene, te, tselem, set);
+ case TSE_KEYMAP_ITEM:
+ return tree_element_active_keymap_item(C, te, tselem, set);
+
}
return 0;
}
-static int do_outliner_mouse_event(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, short event, float *mval)
+static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int extend, float *mval)
{
- int shift= 0, ctrl= 0; // XXX
if(mval[1]>te->ys && mval[1]<te->ys+OL_H) {
TreeStoreElem *tselem= TREESTORE(te);
int openclose= 0;
- /* open close icon, three things to check */
- if(event==RETKEY || event==PADENTER) openclose= 1; // enter opens/closes always
- else if((te->flag & TE_ICONROW)==0) { // hidden icon, no open/close
- if( mval[0]>te->xs && mval[0]<te->xs+OL_X) openclose= 1;
+ /* open close icon */
+ if((te->flag & TE_ICONROW)==0) { // hidden icon, no open/close
+ if( mval[0]>te->xs && mval[0]<te->xs+OL_X)
+ openclose= 1;
}
if(openclose) {
-
/* all below close/open? */
- if(shift) {
+ if(extend) {
tselem->flag &= ~TSE_CLOSED;
outliner_set_flag(soops, &te->subtree, TSE_CLOSED, !outliner_has_one_flag(soops, &te->subtree, TSE_CLOSED, 1));
}
@@ -2126,95 +2307,66 @@ static int do_outliner_mouse_event(bContext *C, Scene *scene, ARegion *ar, Space
else tselem->flag |= TSE_CLOSED;
}
-
+
return 1;
}
/* name and first icon */
else if(mval[0]>te->xs && mval[0]<te->xend) {
- /* activate a name button? */
- if(event==LEFTMOUSE) {
+ /* always makes active object */
+ if(tselem->type!=TSE_SEQUENCE && tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP)
+ tree_element_set_active_object(C, scene, soops, te, 1 + (extend!=0 && tselem->type==0));
- if (ctrl) {
- if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
- error("Cannot edit builtin name");
- else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP))
- error("Cannot edit sequence name");
- else if(tselem->id->lib) {
-// XXX error_libdata();
- } else if(te->idcode == ID_LI && te->parent) {
- error("Cannot edit the path of an indirectly linked library");
- } else {
- tselem->flag |= TSE_TEXTBUT;
- }
- } else {
- /* always makes active object */
- if(tselem->type!=TSE_SEQUENCE && tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP)
- tree_element_set_active_object(C, scene, soops, te);
-
- if(tselem->type==0) { // the lib blocks
- /* editmode? */
- if(te->idcode==ID_SCE) {
- if(scene!=(Scene *)tselem->id) {
- ED_screen_set_scene(C, (Scene *)tselem->id);
- }
- }
- else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) {
-// XXX if(obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
-// else {
-// enter_editmode(EM_WAITCURSOR);
-// extern_set_butspace(F9KEY, 0);
-// }
- } else { // rest of types
- tree_element_active(scene, soops, te, 1);
- }
-
+ if(tselem->type==0) { // the lib blocks
+ /* editmode? */
+ if(te->idcode==ID_SCE) {
+ if(scene!=(Scene *)tselem->id) {
+ ED_screen_set_scene(C, (Scene *)tselem->id);
}
- else tree_element_type_active(C, scene, soops, te, tselem, 1);
}
- }
- else if(event==RIGHTMOUSE) {
- /* select object that's clicked on and popup context menu */
- if (!(tselem->flag & TSE_SELECTED)) {
-
- if ( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1) )
- outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0);
-
- tselem->flag |= TSE_SELECTED;
- /* redraw, same as outliner_select function */
- soops->storeflag |= SO_TREESTORE_REDRAW;
-// XXX screen_swapbuffers();
+ 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);
+ else {
+ ED_object_enter_editmode(C, EM_WAITCURSOR);
+ // XXX extern_set_butspace(F9KEY, 0);
+ }
+ } else { // rest of types
+ tree_element_active(C, scene, soops, te, 1);
}
- outliner_operation_menu(scene, ar, soops);
}
+ else tree_element_type_active(C, scene, soops, te, tselem, 1+(extend!=0));
+
return 1;
}
}
for(te= te->subtree.first; te; te= te->next) {
- if(do_outliner_mouse_event(C, scene, ar, soops, te, event, mval)) return 1;
+ if(do_outliner_item_activate(C, scene, ar, soops, te, extend, mval)) return 1;
}
return 0;
}
/* event can enterkey, then it opens/closes */
-static int outliner_activate_click(bContext *C, wmOperator *op, wmEvent *event)
+static int outliner_item_activate(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
- SpaceOops *soops= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
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);
for(te= soops->tree.first; te; te= te->next) {
- if(do_outliner_mouse_event(C, scene, ar, soops, te, event->type, fmval)) break;
+ if(do_outliner_item_activate(C, scene, ar, soops, te, extend, fmval)) break;
}
if(te) {
- BIF_undo_push("Outliner click event");
+ ED_undo_push(C, "Outliner click event");
}
else {
short selecting= -1;
@@ -2227,10 +2379,9 @@ static int outliner_activate_click(bContext *C, wmOperator *op, wmEvent *event)
/* select relevant row */
outliner_select(soops, &soops->tree, &row, &selecting);
- // XXX old flag found in old code, do we still use this?
- //soops->storeflag |= SO_TREESTORE_REDRAW;
+ soops->storeflag |= SO_TREESTORE_REDRAW;
- BIF_undo_push("Outliner selection event");
+ ED_undo_push(C, "Outliner selection event");
}
ED_region_tag_redraw(ar);
@@ -2238,12 +2389,138 @@ static int outliner_activate_click(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
-void OUTLINER_OT_activate_click(wmOperatorType *ot)
+void OUTLINER_OT_item_activate(wmOperatorType *ot)
{
- ot->name= "Activate Click";
- ot->idname= "OUTLINER_OT_activate_click";
+ ot->name= "Activate Item";
+ ot->idname= "OUTLINER_OT_item_activate";
- ot->invoke= outliner_activate_click;
+ ot->invoke= outliner_item_activate;
+
+ ot->poll= ED_operator_outliner_active;
+
+ RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection for activation.");
+}
+
+/* *********** */
+
+static int do_outliner_item_openclose(bContext *C, SpaceOops *soops, TreeElement *te, int all, float *mval)
+{
+
+ if(mval[1]>te->ys && mval[1]<te->ys+OL_H) {
+ TreeStoreElem *tselem= TREESTORE(te);
+
+ /* all below close/open? */
+ if(all) {
+ tselem->flag &= ~TSE_CLOSED;
+ outliner_set_flag(soops, &te->subtree, TSE_CLOSED, !outliner_has_one_flag(soops, &te->subtree, TSE_CLOSED, 1));
+ }
+ else {
+ if(tselem->flag & TSE_CLOSED) tselem->flag &= ~TSE_CLOSED;
+ else tselem->flag |= TSE_CLOSED;
+ }
+
+ return 1;
+ }
+
+ for(te= te->subtree.first; te; te= te->next) {
+ if(do_outliner_item_openclose(C, soops, te, all, mval))
+ return 1;
+ }
+ return 0;
+
+}
+
+/* event can enterkey, then it opens/closes */
+static int outliner_item_openclose(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar= CTX_wm_region(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ TreeElement *te;
+ float fmval[2];
+ int all= RNA_boolean_get(op->ptr, "all");
+
+ UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1);
+
+ for(te= soops->tree.first; te; te= te->next) {
+ if(do_outliner_item_openclose(C, soops, te, all, fmval))
+ break;
+ }
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void OUTLINER_OT_item_openclose(wmOperatorType *ot)
+{
+ ot->name= "Open/Close Item";
+ ot->idname= "OUTLINER_OT_item_openclose";
+
+ ot->invoke= outliner_item_openclose;
+
+ ot->poll= ED_operator_outliner_active;
+
+ RNA_def_boolean(ot->srna, "all", 1, "All", "Close or open all items.");
+
+}
+
+
+/* ********************************************** */
+
+static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, TreeElement *te, float *mval)
+{
+
+ if(mval[1]>te->ys && mval[1]<te->ys+OL_H) {
+ TreeStoreElem *tselem= TREESTORE(te);
+
+ /* name and first icon */
+ if(mval[0]>te->xs && mval[0]<te->xend) {
+
+ if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
+ error("Cannot edit builtin name");
+ else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP))
+ error("Cannot edit sequence name");
+ else if(tselem->id->lib) {
+ // XXX error_libdata();
+ } else if(te->idcode == ID_LI && te->parent) {
+ error("Cannot edit the path of an indirectly linked library");
+ } else {
+ tselem->flag |= TSE_TEXTBUT;
+ ED_region_tag_redraw(ar);
+ }
+ }
+ return 1;
+ }
+
+ for(te= te->subtree.first; te; te= te->next) {
+ if(do_outliner_item_rename(C, ar, soops, te, mval)) return 1;
+ }
+ return 0;
+}
+
+static int outliner_item_rename(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar= CTX_wm_region(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ TreeElement *te;
+ float fmval[2];
+
+ UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1);
+
+ for(te= soops->tree.first; te; te= te->next) {
+ if(do_outliner_item_rename(C, ar, soops, te, fmval)) break;
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_item_rename(wmOperatorType *ot)
+{
+ ot->name= "Rename Item";
+ ot->idname= "OUTLINER_OT_item_rename";
+
+ ot->invoke= outliner_item_rename;
ot->poll= ED_operator_outliner_active;
}
@@ -2300,53 +2577,56 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
return NULL;
}
-void outliner_show_active(Scene *scene, ARegion *ar, SpaceOops *so)
+static int outliner_show_active_exec(bContext *C, wmOperator *op)
{
+ SpaceOops *so= CTX_wm_space_outliner(C);
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
+ View2D *v2d= &ar->v2d;
+
TreeElement *te;
int xdelta, ytop;
- if(OBACT == NULL) return;
+ // TODO: make this get this info from context instead...
+ if (OBACT == NULL)
+ return OPERATOR_CANCELLED;
te= outliner_find_id(so, &so->tree, (ID *)OBACT);
- if(te) {
+ if (te) {
/* make te->ys center of view */
- ytop= (int)(te->ys + (ar->v2d.mask.ymax-ar->v2d.mask.ymin)/2);
- if(ytop>0) ytop= 0;
- ar->v2d.cur.ymax= (float)ytop;
- ar->v2d.cur.ymin= (float)(ytop-(ar->v2d.mask.ymax-ar->v2d.mask.ymin));
+ ytop= (int)(te->ys + (v2d->mask.ymax - v2d->mask.ymin)/2);
+ if (ytop>0) ytop= 0;
+
+ v2d->cur.ymax= (float)ytop;
+ v2d->cur.ymin= (float)(ytop-(v2d->mask.ymax - v2d->mask.ymin));
/* make te->xs ==> te->xend center of view */
- xdelta = (int)(te->xs - ar->v2d.cur.xmin);
- ar->v2d.cur.xmin += xdelta;
- ar->v2d.cur.xmax += xdelta;
+ xdelta = (int)(te->xs - v2d->cur.xmin);
+ v2d->cur.xmin += xdelta;
+ v2d->cur.xmax += xdelta;
so->storeflag |= SO_TREESTORE_REDRAW;
}
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
}
-void outliner_show_selected(Scene *scene, ARegion *ar, SpaceOops *so)
+void OUTLINER_OT_show_active(wmOperatorType *ot)
{
- TreeElement *te;
- int xdelta, ytop;
+ /* identifiers */
+ ot->name= "Show Active";
+ ot->idname= "OUTLINER_OT_show_active";
+ ot->description= "Adjust the view so that the active Object is shown centered.";
- te= outliner_find_id(so, &so->tree, (ID *)OBACT);
- if(te) {
- /* make te->ys center of view */
- ytop= (int)(te->ys + (ar->v2d.mask.ymax-ar->v2d.mask.ymin)/2);
- if(ytop>0) ytop= 0;
- ar->v2d.cur.ymax= (float)ytop;
- ar->v2d.cur.ymin= (float)(ytop-(ar->v2d.mask.ymax-ar->v2d.mask.ymin));
-
- /* make te->xs ==> te->xend center of view */
- xdelta = (int)(te->xs - ar->v2d.cur.xmin);
- ar->v2d.cur.xmin += xdelta;
- ar->v2d.cur.xmax += xdelta;
-
- so->storeflag |= SO_TREESTORE_REDRAW;
- }
+ /* callbacks */
+ ot->exec= outliner_show_active_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-
/* find next element that has this name */
static TreeElement *outliner_find_named(SpaceOops *soops, ListBase *lb, char *name, int flags, TreeElement *prev, int *prevFound)
{
@@ -2486,6 +2766,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again,
}
}
+/* helper function for tree_element_shwo_hierarchy() - recursively checks whether subtrees have any objects*/
static int subtree_has_objects(SpaceOops *soops, ListBase *lb)
{
TreeElement *te;
@@ -2499,6 +2780,7 @@ static int subtree_has_objects(SpaceOops *soops, ListBase *lb)
return 0;
}
+/* recursive helper function for Show Hierarchy operator */
static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase *lb)
{
TreeElement *te;
@@ -2519,19 +2801,38 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
}
}
else tselem->flag |= TSE_CLOSED;
-
+
if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree);
}
-
}
/* show entire object level hierarchy */
-void outliner_show_hierarchy(Scene *scene, SpaceOops *soops)
+static int outliner_show_hierarchy_exec(bContext *C, wmOperator *op)
{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ ARegion *ar= CTX_wm_region(C);
+ Scene *scene= CTX_data_scene(C);
+ /* recursively open/close levels */
tree_element_show_hierarchy(scene, soops, &soops->tree);
- BIF_undo_push("Outliner show hierarchy");
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void OUTLINER_OT_show_hierarchy(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show Hierarchy";
+ ot->idname= "OUTLINER_OT_show_hierarchy";
+ ot->description= "Open all object entries and close all others.";
+
+ /* callbacks */
+ ot->exec= outliner_show_hierarchy_exec;
+ ot->poll= ED_operator_outliner_active; // TODO: shouldn't be allowed in RNA views...
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
void outliner_select(SpaceOops *soops, ListBase *lb, int *index, short *selecting)
@@ -2591,13 +2892,10 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
tselem= TREESTORE(te);
if(tselem->flag & TSE_SELECTED) {
if(tselem->type) {
- if(tselem->type==TSE_SEQUENCE)
- *datalevel= TSE_SEQUENCE;
- else if(tselem->type==TSE_SEQ_STRIP)
- *datalevel= TSE_SEQ_STRIP;
- else if(tselem->type==TSE_SEQUENCE_DUP)
- *datalevel= TSE_SEQUENCE_DUP;
- else if(*datalevel!=tselem->type) *datalevel= -1;
+ if(*datalevel==0)
+ *datalevel= tselem->type;
+ else if(*datalevel!=tselem->type)
+ *datalevel= -1;
}
else {
int idcode= GS(tselem->id->name);
@@ -2627,7 +2925,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
}
}
-static void unlink_material_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
Material **matar=NULL;
int a, totcol=0;
@@ -2661,7 +2959,7 @@ static void unlink_material_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEl
}
}
-static void unlink_texture_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
MTex **mtex= NULL;
int a;
@@ -2690,7 +2988,7 @@ static void unlink_texture_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEle
}
}
-static void unlink_group_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_group_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
Group *group= (Group *)tselem->id;
@@ -2706,8 +3004,8 @@ static void unlink_group_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem
}
}
-static void outliner_do_libdata_operation(SpaceOops *soops, ListBase *lb,
- void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *))
+static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb,
+ void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *))
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -2717,20 +3015,19 @@ static void outliner_do_libdata_operation(SpaceOops *soops, ListBase *lb,
if(tselem->flag & TSE_SELECTED) {
if(tselem->type==0) {
TreeStoreElem *tsep= TREESTORE(te->parent);
- operation_cb(te, tsep, tselem);
+ operation_cb(C, scene, te, tsep, tselem);
}
}
if((tselem->flag & TSE_CLOSED)==0) {
- outliner_do_libdata_operation(soops, &te->subtree, operation_cb);
+ outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb);
}
}
}
/* */
-static void object_select_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL; // XXX
Base *base= (Base *)te->directdata;
if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
@@ -2740,9 +3037,8 @@ static void object_select_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem
}
}
-static void object_deselect_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL;
Base *base= (Base *)te->directdata;
if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
@@ -2752,28 +3048,27 @@ static void object_deselect_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEl
}
}
-static void object_delete_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL;
Base *base= (Base *)te->directdata;
- if(base==NULL) base= object_in_scene((Object *)tselem->id, scene);
+ if(base==NULL)
+ base= object_in_scene((Object *)tselem->id, scene);
if(base) {
// check also library later
-// XXX if(obedit==base->object) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
+ if(scene->obedit==base->object)
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
- if(base==BASACT) {
- G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE);
-// XXX setcursor_space(SPACE_VIEW3D, CURSOR_STD);
- }
-
-// XXX free_and_unlink_base(base);
+ ED_base_object_free_and_unlink(scene, base);
te->directdata= NULL;
tselem->id= NULL;
}
+
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
+
}
-static void id_local_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
if(tselem->id->lib && (tselem->id->flag & LIB_EXTERN)) {
tselem->id->lib= NULL;
@@ -2782,9 +3077,8 @@ static void id_local_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tse
}
}
-static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void group_linkobs2scene_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
{
- Scene *scene= NULL;
Group *group= (Group *)tselem->id;
GroupObject *gob;
Base *base;
@@ -2807,8 +3101,8 @@ static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeSto
}
}
-static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBase *lb,
- void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *))
+static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb,
+ void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *))
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -2820,18 +3114,20 @@ static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBas
// when objects selected in other scenes... dunno if that should be allowed
Scene *sce= (Scene *)outliner_search_back(soops, te, ID_SCE);
if(sce && scene != sce) {
-// XXX ED_screen_set_scene(C, sce);
+ ED_screen_set_scene(C, sce);
}
- operation_cb(te, NULL, tselem);
+ operation_cb(C, scene, te, NULL, tselem);
}
}
if((tselem->flag & TSE_CLOSED)==0) {
- outliner_do_object_operation(scene, soops, &te->subtree, operation_cb);
+ outliner_do_object_operation(C, scene, soops, &te->subtree, operation_cb);
}
}
}
+/* ******************************************** */
+
static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem)
{
bPoseChannel *pchan= (bPoseChannel *)te->directdata;
@@ -2907,145 +3203,387 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
}
}
-void outliner_del(Scene *scene, ARegion *ar, SpaceOops *soops)
+void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
+{
+
+ if(soops->outlinevis==SO_SEQUENCE)
+ ;// del_seq();
+ else {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
+ DAG_scene_sort(scene);
+ ED_undo_push(C, "Delete Objects");
+ }
+}
+
+/* **************************************** */
+
+static EnumPropertyItem prop_object_op_types[] = {
+ {1, "SELECT", 0, "Select", ""},
+ {2, "DESELECT", 0, "Deselect", ""},
+ {4, "DELETE", 0, "Delete", ""},
+ {6, "TOGVIS", 0, "Toggle Visible", ""},
+ {7, "TOGSEL", 0, "Toggle Selectable", ""},
+ {8, "TOGREN", 0, "Toggle Renderable", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+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;
+
+ /* check for invalid states */
+ if (soops == NULL)
+ return OPERATOR_CANCELLED;
+
+ event= RNA_enum_get(op->ptr, "type");
+
+ if(event==1) {
+ Scene *sce= scene; // to be able to delete, scenes are set...
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_select_cb);
+ if(scene != sce) {
+ ED_screen_set_scene(C, sce);
+ }
+
+ str= "Select Objects";
+ }
+ else if(event==2) {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_deselect_cb);
+ str= "Deselect Objects";
+ }
+ else if(event==4) {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
+ DAG_scene_sort(scene);
+ str= "Delete Objects";
+ }
+ else if(event==5) { /* disabled, see above (ton) */
+ outliner_do_object_operation(C, scene, soops, &soops->tree, id_local_cb);
+ str= "Localized Objects";
+ }
+ else if(event==6) {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb);
+ str= "Toggle Visibility";
+ }
+ else if(event==7) {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb);
+ str= "Toggle Selectability";
+ }
+ 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_SELECT, scene);
+
+ ED_undo_push(C, str);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_object_operation(wmOperatorType *ot)
{
+ /* identifiers */
+ ot->name= "Outliner Object Operation";
+ ot->idname= "OUTLINER_OT_object_operation";
+ ot->description= "";
-// XXX if(soops->outlinevis==SO_SEQUENCE)
-// del_seq();
-// else {
-// outliner_do_object_operation(scene, soops, &soops->tree, object_delete_cb);
-// DAG_scene_sort(scene);
-// BIF_undo_push("Delete Objects");
-// }
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= outliner_object_operation_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= 0;
+
+ RNA_def_enum(ot->srna, "type", prop_object_op_types, 0, "Object Operation", "");
}
+/* **************************************** */
+
+static EnumPropertyItem prop_group_op_types[] = {
+ {1, "UNLINK", 0, "Unlink", ""},
+ {2, "LOCAL", 0, "Make Local", ""},
+ {3, "LINK", 0, "Link Group Objects to Scene", ""},
+ {0, NULL, 0, NULL, NULL}
+};
-void outliner_operation_menu(Scene *scene, ARegion *ar, SpaceOops *soops)
+static int outliner_group_operation_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ int event;
+
+ /* check for invalid states */
+ if (soops == NULL)
+ return OPERATOR_CANCELLED;
+
+ event= RNA_enum_get(op->ptr, "type");
+
+ if(event==1) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_group_cb);
+ ED_undo_push(C, "Unlink group");
+ }
+ else if(event==2) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, id_local_cb);
+ ED_undo_push(C, "Localized Data");
+ }
+ else if(event==3) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_linkobs2scene_cb);
+ ED_undo_push(C, "Link Group Objects to Scene");
+ }
+
+
+ WM_event_add_notifier(C, NC_GROUP, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_group_operation(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Outliner Group Operation";
+ ot->idname= "OUTLINER_OT_group_operation";
+ ot->description= "";
+
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= outliner_group_operation_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= 0;
+
+ RNA_def_enum(ot->srna, "type", prop_group_op_types, 0, "Group Operation", "");
+}
+
+/* **************************************** */
+
+static EnumPropertyItem prop_id_op_types[] = {
+ {1, "UNLINK", 0, "Unlink", ""},
+ {2, "LOCAL", 0, "Make Local", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int outliner_id_operation_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0;
+ int event;
+
+ /* check for invalid states */
+ if (soops == NULL)
+ return OPERATOR_CANCELLED;
set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel);
- if(scenelevel) {
- if(objectlevel || datalevel || idlevel) error("Mixed selection");
- else pupmenu("Scene Operations%t|Delete");
+ event= RNA_enum_get(op->ptr, "type");
+
+ if(event==1) {
+ switch(idlevel) {
+ case ID_MA:
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_material_cb);
+ ED_undo_push(C, "Unlink material");
+ break;
+ case ID_TE:
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_texture_cb);
+ ED_undo_push(C, "Unlink texture");
+ break;
+ default:
+ BKE_report(op->reports, RPT_WARNING, "Not Yet");
+ }
}
- else if(objectlevel) {
- short event= pupmenu("Select%x1|Deselect%x2|Delete%x4|Toggle Visible%x6|Toggle Selectable%x7|Toggle Renderable%x8"); /* make local: does not work... it doesn't set lib_extern flags... so data gets lost */
+ else if(event==2) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, id_local_cb);
+ ED_undo_push(C, "Localized Data");
+ }
+
+ /* wrong notifier still... */
+ WM_event_add_notifier(C, NC_OBJECT, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_id_operation(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Outliner ID data Operation";
+ ot->idname= "OUTLINER_OT_id_operation";
+ ot->description= "";
+
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= outliner_id_operation_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= 0;
+
+ RNA_def_enum(ot->srna, "type", prop_id_op_types, 0, "ID data Operation", "");
+}
+
+/* **************************************** */
+
+static EnumPropertyItem prop_data_op_types[] = {
+ {1, "SELECT", 0, "Select", ""},
+ {2, "DESELECT", 0, "Deselect", ""},
+ {3, "HIDE", 0, "Hide", ""},
+ {4, "UNHIDE", 0, "Unhide", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+static int outliner_data_operation_exec(bContext *C, wmOperator *op)
+{
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0;
+ int event;
+
+ /* check for invalid states */
+ if (soops == NULL)
+ return OPERATOR_CANCELLED;
+
+ event= RNA_enum_get(op->ptr, "type");
+ set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel);
+
+ if(datalevel==TSE_POSE_CHANNEL) {
if(event>0) {
- char *str="";
-
- if(event==1) {
- Scene *sce= scene; // to be able to delete, scenes are set...
- outliner_do_object_operation(scene, soops, &soops->tree, object_select_cb);
- if(scene != sce) {
-// XXX ED_screen_set_scene(C, sce);
- }
-
- str= "Select Objects";
- }
- else if(event==2) {
- outliner_do_object_operation(scene, soops, &soops->tree, object_deselect_cb);
- str= "Deselect Objects";
- }
- else if(event==4) {
- outliner_do_object_operation(scene, soops, &soops->tree, object_delete_cb);
- DAG_scene_sort(scene);
- str= "Delete Objects";
- }
- else if(event==5) { /* disabled, see above (ton) */
- outliner_do_object_operation(scene, soops, &soops->tree, id_local_cb);
- str= "Localized Objects";
- }
- else if(event==6) {
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_visibility_cb);
- str= "Toggle Visibility";
- }
- else if(event==7) {
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_selectability_cb);
- str= "Toggle Selectability";
- }
- else if(event==8) {
- outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_renderability_cb);
- str= "Toggle Renderability";
- }
-
- BIF_undo_push(str);
+ outliner_do_data_operation(soops, datalevel, event, &soops->tree, pchan_cb);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+ ED_undo_push(C, "PoseChannel operation");
}
}
- else if(idlevel) {
- if(idlevel==-1 || datalevel) error("Mixed selection");
- else {
- short event;
- if (idlevel==ID_GR)
- event = pupmenu("Unlink %x1|Make Local %x2|Link Group Objects to Scene%x3");
- else
- event = pupmenu("Unlink %x1|Make Local %x2");
+ else if(datalevel==TSE_BONE) {
+ if(event>0) {
+ outliner_do_data_operation(soops, datalevel, event, &soops->tree, bone_cb);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+ ED_undo_push(C, "Bone operation");
+ }
+ }
+ else if(datalevel==TSE_EBONE) {
+ if(event>0) {
+ outliner_do_data_operation(soops, datalevel, event, &soops->tree, ebone_cb);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+ ED_undo_push(C, "EditBone operation");
+ }
+ }
+ else if(datalevel==TSE_SEQUENCE) {
+ if(event>0) {
+ outliner_do_data_operation(soops, datalevel, event, &soops->tree, sequence_cb);
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_data_operation(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Outliner Data Operation";
+ ot->idname= "OUTLINER_OT_data_operation";
+ ot->description= "";
+
+ /* callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= outliner_data_operation_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ ot->flag= 0;
+
+ RNA_def_enum(ot->srna, "type", prop_data_op_types, 0, "Data Operation", "");
+}
+
+
+/* ******************** */
+
+
+static int do_outliner_operation_event(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, wmEvent *event, float *mval)
+{
+
+ if(mval[1]>te->ys && mval[1]<te->ys+OL_H) {
+ int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0;
+ TreeStoreElem *tselem= TREESTORE(te);
+
+ /* select object that's clicked on and popup context menu */
+ if (!(tselem->flag & TSE_SELECTED)) {
+ if ( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1) )
+ outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0);
- if(event==1) {
- switch(idlevel) {
- case ID_MA:
- outliner_do_libdata_operation(soops, &soops->tree, unlink_material_cb);
- BIF_undo_push("Unlink material");
- break;
- case ID_TE:
- outliner_do_libdata_operation(soops, &soops->tree, unlink_texture_cb);
- BIF_undo_push("Unlink texture");
- break;
- case ID_GR:
- outliner_do_libdata_operation(soops, &soops->tree, unlink_group_cb);
- BIF_undo_push("Unlink group");
- break;
- default:
- error("Not yet...");
- }
- }
- else if(event==2) {
- outliner_do_libdata_operation(soops, &soops->tree, id_local_cb);
- BIF_undo_push("Localized Data");
+ tselem->flag |= TSE_SELECTED;
+ /* redraw, same as outliner_select function */
+ soops->storeflag |= SO_TREESTORE_REDRAW;
+ ED_region_tag_redraw(ar);
+ }
+
+ set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel);
+
+ if(scenelevel) {
+ //if(objectlevel || datalevel || idlevel) error("Mixed selection");
+ //else pupmenu("Scene Operations%t|Delete");
+ }
+ else if(objectlevel) {
+ WM_operator_name_call(C, "OUTLINER_OT_object_operation", WM_OP_INVOKE_REGION_WIN, NULL);
+ }
+ else if(idlevel) {
+ if(idlevel==-1 || datalevel) error("Mixed selection");
+ else {
+ if (idlevel==ID_GR)
+ WM_operator_name_call(C, "OUTLINER_OT_group_operation", WM_OP_INVOKE_REGION_WIN, NULL);
+ else
+ WM_operator_name_call(C, "OUTLINER_OT_id_operation", WM_OP_INVOKE_REGION_WIN, NULL);
}
- else if(event==3 && idlevel==ID_GR) {
- outliner_do_libdata_operation(soops, &soops->tree, group_linkobs2scene_cb);
- BIF_undo_push("Link Group Objects to Scene");
+ }
+ else if(datalevel) {
+ if(datalevel==-1) error("Mixed selection");
+ else {
+ WM_operator_name_call(C, "OUTLINER_OT_data_operation", WM_OP_INVOKE_REGION_WIN, NULL);
}
}
+
+ return 1;
}
- else if(datalevel) {
- if(datalevel==-1) error("Mixed selection");
- else {
- if(datalevel==TSE_POSE_CHANNEL) {
- short event= pupmenu("PoseChannel Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4");
- if(event>0) {
- outliner_do_data_operation(soops, datalevel, event, &soops->tree, pchan_cb);
- BIF_undo_push("PoseChannel operation");
- }
- }
- else if(datalevel==TSE_BONE) {
- short event= pupmenu("Bone Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4");
- if(event>0) {
- outliner_do_data_operation(soops, datalevel, event, &soops->tree, bone_cb);
- BIF_undo_push("Bone operation");
- }
- }
- else if(datalevel==TSE_EBONE) {
- short event= pupmenu("EditBone Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4");
- if(event>0) {
- outliner_do_data_operation(soops, datalevel, event, &soops->tree, ebone_cb);
- BIF_undo_push("EditBone operation");
- }
- }
- else if(datalevel==TSE_SEQUENCE) {
- short event= pupmenu("Sequence Operations %t|Select %x1");
- if(event>0) {
- outliner_do_data_operation(soops, datalevel, event, &soops->tree, sequence_cb);
- }
- }
+
+ for(te= te->subtree.first; te; te= te->next) {
+ if(do_outliner_operation_event(C, scene, ar, soops, te, event, mval))
+ return 1;
+ }
+ return 0;
+}
- }
+
+static int outliner_operation(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ TreeElement *te;
+ float fmval[2];
+
+ UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1);
+
+ for(te= soops->tree.first; te; te= te->next) {
+ if(do_outliner_operation_event(C, scene, ar, soops, te, event, fmval)) break;
}
+
+ return OPERATOR_FINISHED;
}
+/* Menu only! Calls other operators */
+void OUTLINER_OT_operation(wmOperatorType *ot)
+{
+ ot->name= "Execute Operation";
+ ot->idname= "OUTLINER_OT_operation";
+
+ ot->invoke= outliner_operation;
+
+ ot->poll= ED_operator_outliner_active;
+}
+
+
+
/* ***************** ANIMATO OPERATIONS ********************************** */
/* KeyingSet and Driver Creation - Helper functions */
@@ -3054,7 +3592,7 @@ static int ed_operator_outliner_datablocks_active(bContext *C)
{
ScrArea *sa= CTX_wm_area(C);
if ((sa) && (sa->spacetype==SPACE_OUTLINER)) {
- SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C);
+ SpaceOops *so= CTX_wm_space_outliner(C);
return (so->outlinevis == SO_DATABLOCKS);
}
return 0;
@@ -3118,7 +3656,7 @@ static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreEle
}
else if(RNA_property_type(prop) == PROP_COLLECTION) {
char buf[128], *name;
-
+
temnext= (TreeElement*)(ld->next->data);
tsenext= TREESTORE(temnext);
@@ -3181,7 +3719,7 @@ static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreEle
/* item is part of an array, so must set the array_index */
*array_index= te->index;
}
- else if (RNA_property_array_length(prop)) {
+ else if (RNA_property_array_length(ptr, prop)) {
/* entire array was selected, so keyframe all */
*flag |= KSP_FLAG_WHOLE_ARRAY;
}
@@ -3239,7 +3777,7 @@ 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);
+ ANIM_add_driver(id, path, array_index, flag, DRIVER_TYPE_AVERAGE);
}
break;
case DRIVERS_EDITMODE_REMOVE:
@@ -3267,7 +3805,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
static int outliner_drivers_addsel_exec(bContext *C, wmOperator *op)
{
- SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soutliner= CTX_wm_space_outliner(C);
/* check for invalid states */
if (soutliner == NULL)
@@ -3302,7 +3840,7 @@ void OUTLINER_OT_drivers_add(wmOperatorType *ot)
static int outliner_drivers_deletesel_exec(bContext *C, wmOperator *op)
{
- SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soutliner= CTX_wm_space_outliner(C);
/* check for invalid states */
if (soutliner == NULL)
@@ -3361,7 +3899,7 @@ static KeyingSet *verify_active_keyingset(Scene *scene, short add)
/* add if none found */
// XXX the default settings have yet to evolve
if ((add) && (ks==NULL)) {
- ks= BKE_keyingset_add(&scene->keyingsets, "Keying Set", KEYINGSET_ABSOLUTE, 0);
+ ks= BKE_keyingset_add(&scene->keyingsets, NULL, KEYINGSET_ABSOLUTE, 0);
scene->active_keyingset= BLI_countlist(&scene->keyingsets);
}
@@ -3386,7 +3924,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
short groupmode= KSP_GROUP_KSNAME;
/* check if RNA-property described by this selected element is an animateable prop */
- if ((tselem->type == TSE_RNA_PROPERTY) && RNA_property_animateable(&te->rnaptr, te->directdata)) {
+ if (ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM) && RNA_property_animateable(&te->rnaptr, te->directdata)) {
/* get id + path + index info from the selected element */
tree_element_to_path(soops, te, tselem,
&id, &path, &array_index, &flag, &groupmode);
@@ -3423,8 +3961,6 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
/* free path, since it had to be generated */
MEM_freeN(path);
}
-
-
}
/* go over sub-tree */
@@ -3437,7 +3973,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
static int outliner_keyingset_additems_exec(bContext *C, wmOperator *op)
{
- SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soutliner= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= verify_active_keyingset(scene, 1);
@@ -3477,7 +4013,7 @@ void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot)
static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *op)
{
- SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soutliner= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= verify_active_keyingset(scene, 1);
@@ -3518,6 +4054,8 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
UI_icon_draw(x, y, ICON_ANIM_DATA); break; // xxx
case TSE_NLA:
UI_icon_draw(x, y, ICON_NLA); break;
+ case TSE_NLA_TRACK:
+ UI_icon_draw(x, y, ICON_NLA); break; // XXX
case TSE_NLA_ACTION:
UI_icon_draw(x, y, ICON_ACTION); break;
case TSE_DEFGROUP_BASE:
@@ -3620,13 +4158,13 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
case TSE_POSEGRP_BASE:
UI_icon_draw(x, y, ICON_VERTEXSEL); break;
case TSE_SEQUENCE:
- if((te->idcode==SEQ_MOVIE) || (te->idcode==SEQ_MOVIE_AND_HD_SOUND))
+ if(te->idcode==SEQ_MOVIE)
UI_icon_draw(x, y, ICON_SEQUENCE);
else if(te->idcode==SEQ_META)
UI_icon_draw(x, y, ICON_DOT);
else if(te->idcode==SEQ_SCENE)
UI_icon_draw(x, y, ICON_SCENE);
- else if((te->idcode==SEQ_RAM_SOUND) || (te->idcode==SEQ_HD_SOUND))
+ else if(te->idcode==SEQ_SOUND)
UI_icon_draw(x, y, ICON_SOUND);
else if(te->idcode==SEQ_IMAGE)
UI_icon_draw(x, y, ICON_IMAGE_COL);
@@ -3734,7 +4272,7 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen
}
}
-static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb, int level, int *offsx, int ys)
+static void outliner_draw_iconrow(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, int level, int *offsx, int ys)
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -3751,7 +4289,7 @@ static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb,
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?
- else active= tree_element_active(scene, soops, te, 0);
+ else active= tree_element_active(C, scene, soops, te, 0);
}
else active= tree_element_type_active(NULL, scene, soops, te, tselem, 0);
@@ -3773,12 +4311,12 @@ static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb,
/* this tree element always has same amount of branches, so dont draw */
if(tselem->type!=TSE_R_LAYER)
- outliner_draw_iconrow(scene, soops, &te->subtree, level+1, offsx, ys);
+ outliner_draw_iconrow(C, scene, soops, &te->subtree, level+1, offsx, ys);
}
}
-static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty)
+static void outliner_draw_tree_element(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty)
{
TreeElement *ten;
TreeStoreElem *tselem;
@@ -3816,12 +4354,12 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo
}
}
-// XXX context? else if(obedit && obedit->data==tselem->id) {
-// glColor4ub(255, 255, 255, 100);
-// active= 2;
-// }
+ else if(scene->obedit && scene->obedit->data==tselem->id) {
+ glColor4ub(255, 255, 255, 100);
+ active= 2;
+ }
else {
- if(tree_element_active(scene, soops, te, 0)) {
+ if(tree_element_active(C, scene, soops, te, 0)) {
glColor4ub(220, 220, 255, 100);
active= 2;
}
@@ -3900,7 +4438,7 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo
glEnable(GL_BLEND);
glPixelTransferf(GL_ALPHA_SCALE, 0.5);
- outliner_draw_iconrow(scene, soops, &te->subtree, 0, &tempx, *starty+2);
+ outliner_draw_iconrow(C, scene, soops, &te->subtree, 0, &tempx, *starty+2);
glPixelTransferf(GL_ALPHA_SCALE, 1.0);
glDisable(GL_BLEND);
@@ -3917,7 +4455,7 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo
if((tselem->flag & TSE_CLOSED)==0) {
for(ten= te->subtree.first; ten; ten= ten->next) {
- outliner_draw_tree_element(scene, ar, soops, ten, startx+OL_X, starty);
+ outliner_draw_tree_element(C, scene, ar, soops, ten, startx+OL_X, starty);
}
}
}
@@ -3996,20 +4534,12 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb,
}
-static void outliner_draw_tree(Scene *scene, ARegion *ar, SpaceOops *soops)
+static void outliner_draw_tree(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
{
TreeElement *te;
int starty, startx;
float col[4];
-
-#if 0 // XXX was #ifdef INTERNATIONAL
- /* Maybe the INTERNATIONAL was really for check about freetype2 ?
- * anyway I think that we can remove this now - Diego
- */
- FTF_SetFontSize('l');
- BIF_SetScale(1.0);
-#endif
-
+
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // only once
if (ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) {
@@ -4036,7 +4566,7 @@ static void outliner_draw_tree(Scene *scene, ARegion *ar, SpaceOops *soops)
starty= (int)ar->v2d.tot.ymax-OL_H;
startx= 0;
for(te= soops->tree.first; te; te= te->next) {
- outliner_draw_tree_element(scene, ar, soops, te, startx, &starty);
+ outliner_draw_tree_element(C, scene, ar, soops, te, startx, &starty);
}
}
@@ -4111,6 +4641,7 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2)
}
}
}
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
@@ -4132,16 +4663,18 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
}
}
}
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
static void restrictbutton_rend_cb(bContext *C, void *poin, void *poin2)
{
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, poin);
}
static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *poin2)
{
- /* XXX redraws */
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, poin);
}
static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2)
@@ -4149,29 +4682,43 @@ static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2)
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
object_handle_update(scene, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
{
- /* XXX redraws */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
}
-static void namebutton_cb(bContext *C, void *tep, void *oldnamep)
+static void namebutton_cb(bContext *C, void *tsep, char *oldname)
{
- SpaceOops *soops= NULL; // XXXcurarea->spacedata.first;
- Scene *scene= NULL; // XXX
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
TreeStore *ts= soops->treestore;
- TreeElement *te= tep;
+ TreeStoreElem *tselem= tsep;
- if(ts && te) {
- TreeStoreElem *tselem= TREESTORE(te);
+ if(ts && tselem) {
+ TreeElement *te= outliner_find_tse(soops, tselem);
if(tselem->type==0) {
test_idbutton(tselem->id->name+2); // library.c, unique name and alpha sort
+ switch(GS(tselem->id->name)) {
+ case ID_MA:
+ WM_event_add_notifier(C, NC_MATERIAL, NULL); break;
+ case ID_TE:
+ WM_event_add_notifier(C, NC_TEXTURE, NULL); break;
+ case ID_IM:
+ WM_event_add_notifier(C, NC_IMAGE, NULL); break;
+ case ID_SCE:
+ WM_event_add_notifier(C, NC_SCENE, NULL); break;
+ default:
+ WM_event_add_notifier(C, NC_MATERIAL, NULL); break;
+ }
/* Check the library target exists */
if (te->idcode == ID_LI) {
char expanded[FILE_MAXDIR + FILE_MAXFILE];
@@ -4199,8 +4746,9 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep)
/* restore bone name */
BLI_strncpy(newname, ebone->name, 32);
- BLI_strncpy(ebone->name, oldnamep, 32);
-// XXX armature_bone_rename(obedit->data, oldnamep, newname);
+ BLI_strncpy(ebone->name, oldname, 32);
+ ED_armature_bone_rename(obedit->data, oldname, newname);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, OBACT);
}
}
break;
@@ -4212,13 +4760,14 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep)
char newname[32];
// always make current object active
- tree_element_set_active_object(C, scene, soops, te);
+ 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, oldnamep, 32);
-// XXX armature_bone_rename(ob->data, oldnamep, newname);
+ BLI_strncpy(bone->name, oldname, 32);
+ ED_armature_bone_rename(ob->data, oldname, newname);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
break;
case TSE_POSE_CHANNEL:
@@ -4228,13 +4777,14 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep)
char newname[32];
// always make current object active
- tree_element_set_active_object(C, scene, soops, te);
+ 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, oldnamep, 32);
-// XXX armature_bone_rename(ob->data, oldnamep, newname);
+ BLI_strncpy(pchan->name, oldname, 32);
+ ED_armature_bone_rename(ob->data, oldname, newname);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
break;
case TSE_POSEGRP:
@@ -4243,6 +4793,7 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep)
bActionGroup *grp= te->directdata;
BLI_uniquename(&ob->pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), 32);
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
break;
case TSE_R_LAYER:
@@ -4258,7 +4809,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
TreeElement *te;
TreeStoreElem *tselem;
Object *ob = NULL;
-
+
for(te= lb->first; te; te= te->next) {
tselem= TREESTORE(te);
if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) {
@@ -4277,7 +4828,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, 0, ICON_RESTRICT_RENDER_OFF,
(int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
- uiButSetFunc(bt, restrictbutton_rend_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_rend_cb, scene, ob);
uiBlockSetEmboss(block, UI_EMBOSS);
}
@@ -4287,7 +4838,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
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");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
}
@@ -4298,13 +4849,13 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
/* NOTE: tselem->nr is short! */
bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, 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");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
layflag++; /* is lay_xor */
if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO))
bt= uiDefIconButBitI(block, TOG, tselem->nr, 0, (*layflag & tselem->nr)?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");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
}
@@ -4393,7 +4944,271 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
}
}
-static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb)
+static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
+{
+ wmOperatorType *ot= arg2;
+ wmKeymapItem *kmi= arg_kmi;
+
+ if(ot)
+ 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)
+{
+ wmOperatorType *ot = WM_operatortype_first();
+
+ for(; ot; ot= ot->next) {
+
+ if(BLI_strcasestr(ot->idname, str)) {
+ char name[OP_MAX_TYPENAME];
+
+ /* display name for menu */
+ WM_operator_py_idname(name, ot->idname);
+
+ if(0==uiSearchItemAdd(items, name, ot, 0))
+ break;
+ }
+ }
+}
+
+/* operator Search browse menu, open */
+static uiBlock *operator_search_menu(bContext *C, ARegion *ar, void *arg_kmi)
+{
+ static char search[OP_MAX_TYPENAME];
+ wmEvent event;
+ wmWindow *win= CTX_wm_window(C);
+ wmKeymapItem *kmi= arg_kmi;
+ wmOperatorType *ot= WM_operatortype_find(kmi->idname, 0);
+ uiBlock *block;
+ uiBut *but;
+
+ /* clear initial search string, then all items show */
+ search[0]= 0;
+
+ block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ /* fake button, it holds space for search items */
+ uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
+
+ but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, "");
+ uiButSetSearchFunc(but, operator_search_cb, arg_kmi, operator_call_cb, ot);
+
+ uiBoundsBlock(block, 6);
+ uiBlockSetDirection(block, UI_DOWN);
+ uiEndBlock(C, block);
+
+ event= *(win->eventstate); /* XXX huh huh? make api call */
+ event.type= EVT_BUT_OPEN;
+ event.val= KM_PRESS;
+ event.customdata= but;
+ event.customdatafree= FALSE;
+ wm_event_add(win, &event);
+
+ return block;
+}
+
+#define OL_KM_KEYBOARD 0
+#define OL_KM_MOUSE 1
+#define OL_KM_TWEAK 2
+#define OL_KM_SPECIALS 3
+
+static short keymap_menu_type(short type)
+{
+ if(ISKEYBOARD(type)) return OL_KM_KEYBOARD;
+ if(WM_key_event_is_tweak(type)) return OL_KM_TWEAK;
+ if(type >= LEFTMOUSE && type <= WHEELOUTMOUSE) return OL_KM_MOUSE;
+// return OL_KM_SPECIALS;
+ return 0;
+}
+
+static 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);
+
+ 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);
+
+ return string;
+}
+
+static 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, "Button4 Mouse ", BUTTON4MOUSE);
+ str += sprintf(str, formatstr, "Button5 Mouse ", BUTTON5MOUSE);
+ str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A);
+ str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S);
+
+ return string;
+}
+
+static 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);
+
+ return string;
+}
+
+
+static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v)
+{
+ wmKeymapItem *kmi= kmi_v;
+ short maptype= keymap_menu_type(kmi->type);
+
+ if(maptype!=kmi->maptype) {
+ switch(kmi->maptype) {
+ case OL_KM_KEYBOARD:
+ kmi->type= AKEY;
+ kmi->val= KM_PRESS;
+ break;
+ case OL_KM_MOUSE:
+ kmi->type= LEFTMOUSE;
+ kmi->val= KM_PRESS;
+ break;
+ case OL_KM_TWEAK:
+ kmi->type= EVT_TWEAK_L;
+ kmi->val= KM_ANY;
+ break;
+ case OL_KM_SPECIALS:
+ kmi->type= AKEY;
+ kmi->val= KM_PRESS;
+ }
+ ED_region_tag_redraw(CTX_wm_region(C));
+ }
+}
+
+static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb)
+{
+ TreeElement *te;
+ TreeStoreElem *tselem;
+
+ uiBlockSetEmboss(block, UI_EMBOSST);
+
+ for(te= lb->first; te; te= te->next) {
+ tselem= TREESTORE(te);
+ if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) {
+ uiBut *but;
+ char *str;
+ int xstart= 240;
+ int butw1= 20; /* operator */
+ int butw2= 90; /* event type, menus */
+ int butw3= 43; /* modifiers */
+
+ if(tselem->type == TSE_KEYMAP_ITEM) {
+ wmKeymapItem *kmi= te->directdata;
+
+ /* modal map? */
+ if(kmi->propvalue);
+ else {
+ uiDefBlockBut(block, operator_search_menu, kmi, "", xstart, (int)te->ys+1, butw1, OL_H-1, "Assign new Operator");
+ }
+ xstart+= butw1+10;
+
+ /* map type button */
+ kmi->maptype= keymap_menu_type(kmi->type);
+
+ str= keymap_type_menu();
+ but= uiDefButS(block, MENU, 0, str, xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->maptype, 0, 0, 0, 0, "Event type");
+ uiButSetFunc(but, keymap_type_cb, kmi, NULL);
+ xstart+= butw2+5;
+
+ /* edit actual event */
+ switch(kmi->maptype) {
+ case OL_KM_KEYBOARD:
+ uiDefKeyevtButS(block, 0, "", xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->type, "Key code");
+ xstart+= butw2+5;
+ break;
+ case OL_KM_MOUSE:
+ str= keymap_mouse_menu();
+ uiDefButS(block, MENU, 0, str, xstart,(int)te->ys+1, butw2, OL_H-1, &kmi->type, 0, 0, 0, 0, "Mouse button");
+ xstart+= butw2+5;
+ break;
+ case OL_KM_TWEAK:
+ str= keymap_tweak_menu();
+ uiDefButS(block, MENU, 0, str, xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->type, 0, 0, 0, 0, "Tweak gesture");
+ xstart+= butw2+5;
+ str= keymap_tweak_dir_menu();
+ uiDefButS(block, MENU, 0, str, xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->val, 0, 0, 0, 0, "Tweak gesture direction");
+ xstart+= butw2+5;
+ break;
+ }
+
+ /* modifiers */
+ 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;
+ xstart+= 5;
+ uiDefKeyevtButS(block, 0, "", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->keymodifier, "Key Modifier code");
+ xstart+= butw3+5;
+
+ /* rna property */
+ if(kmi->ptr && kmi->ptr->data)
+ uiDefBut(block, LABEL, 0, "(RNA property)", xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->oskey, 0, 0, 0, 0, ""); xstart+= butw2;
+
+
+ }
+ }
+
+ if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
+ }
+}
+
+
+static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb)
{
uiBut *bt;
TreeElement *te;
@@ -4405,6 +5220,7 @@ static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, List
if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) {
if(tselem->flag & TSE_TEXTBUT) {
+
/* If we add support to rename Sequence.
* need change this.
*/
@@ -4419,17 +5235,15 @@ static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, List
if(dx<50) dx= 50;
bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", (short)te->xs+2*OL_X-4, (short)te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
- uiButSetFunc(bt, namebutton_cb, te, NULL);
-
- // signal for button to open
-// XXX addqueue(curarea->win, BUT_ACTIVATE, OL_NAMEBUTTON);
+ uiButSetRenameFunc(bt, namebutton_cb, tselem);
- /* otherwise keeps open on ESC */
- tselem->flag &= ~TSE_TEXTBUT;
+ /* returns false if button got removed */
+ if( 0 == uiButActiveOnly(C, block, bt) )
+ tselem->flag &= ~TSE_TEXTBUT;
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(block, ar, soops, &te->subtree);
+ if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree);
}
}
@@ -4439,7 +5253,7 @@ void draw_outliner(const bContext *C)
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
View2D *v2d= &ar->v2d;
- SpaceOops *soops= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soops= CTX_wm_space_outliner(C);
uiBlock *block;
int sizey= 0, sizex= 0, sizex_rna= 0;
@@ -4448,7 +5262,7 @@ void draw_outliner(const bContext *C)
/* get extents of data */
outliner_height(soops, &soops->tree, &sizey);
- if (ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) {
+ if (ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP)) {
/* RNA has two columns:
* - column 1 is (max_width + OL_RNA_COL_SPACEX) or
* (OL_RNA_COL_X), whichever is wider...
@@ -4462,7 +5276,10 @@ void draw_outliner(const bContext *C)
sizex_rna= MAX2(OL_RNA_COLX, sizex_rna+OL_RNA_COL_SPACEX);
/* get width of data (for setting 'tot' rect, this is column 1 + column 2 + a bit extra) */
- sizex= sizex_rna + OL_RNA_COL_SIZEX + 50;
+ if (soops->outlinevis == SO_KEYMAP)
+ sizex= sizex_rna + OL_RNA_COL_SIZEX*3 + 50; // XXX this is only really a quick hack to make this wide enough...
+ else
+ sizex= sizex_rna + OL_RNA_COL_SIZEX + 50;
}
else {
/* width must take into account restriction columns (if visible) so that entries will still be visible */
@@ -4475,6 +5292,9 @@ void draw_outliner(const bContext *C)
sizex += OL_TOGW*3;
}
+ /* tweak to display last line (when list bigger than window) */
+ sizey += V2D_SCROLL_HEIGHT;
+
/* update size of tot-rect (extents of data/viewable area) */
UI_view2d_totRect_set(v2d, sizex, sizey);
@@ -4483,17 +5303,20 @@ void draw_outliner(const bContext *C)
/* draw outliner stuff (background and hierachy lines) */
outliner_back(ar, soops);
- outliner_draw_tree(scene, ar, soops);
+ outliner_draw_tree((bContext *)C, scene, ar, soops);
/* draw icons and names */
block= uiBeginBlock(C, ar, "outliner buttons", UI_EMBOSS);
- outliner_buttons(block, ar, soops, &soops->tree);
+ outliner_buttons(C, block, ar, soops, &soops->tree);
if(ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) {
/* draw rna buttons */
outliner_draw_rnacols(ar, soops, sizex_rna);
outliner_draw_rnabuts(block, scene, ar, soops, sizex_rna, &soops->tree);
}
+ else if(soops->outlinevis == SO_KEYMAP) {
+ outliner_draw_keymapbuts(block, ar, soops, &soops->tree);
+ }
else if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
/* draw restriction columns */
outliner_draw_restrictcols(ar, soops);
diff --git a/source/blender/editors/space_outliner/outliner_header.c b/source/blender/editors/space_outliner/outliner_header.c
index fe2f054899c..d4eeaabd1d3 100644
--- a/source/blender/editors/space_outliner/outliner_header.c
+++ b/source/blender/editors/space_outliner/outliner_header.c
@@ -177,7 +177,7 @@ static void do_outliner_buttons(bContext *C, void *arg, int event)
/* add a new KeyingSet if active is -1 */
if (scene->active_keyingset == -1) {
// XXX the default settings have yet to evolve... need to keep this in sync with the
- BKE_keyingset_add(&scene->keyingsets, "KeyingSet", KEYINGSET_ABSOLUTE, 0);
+ BKE_keyingset_add(&scene->keyingsets, NULL, KEYINGSET_ABSOLUTE, 0);
scene->active_keyingset= BLI_countlist(&scene->keyingsets);
}
@@ -196,6 +196,8 @@ static void do_outliner_buttons(bContext *C, void *arg, int event)
BLI_freelinkN(&scene->keyingsets, ks);
scene->active_keyingset= 0;
}
+ else
+ scene->active_keyingset= 0;
}
/* redraw regions with KeyingSet info */
@@ -209,7 +211,7 @@ void outliner_header_buttons(const bContext *C, ARegion *ar)
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
- SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C);
+ SpaceOops *soutliner= CTX_wm_space_outliner(C);
uiBlock *block;
int xco, yco= 3, xmax;
@@ -233,9 +235,9 @@ void outliner_header_buttons(const bContext *C, ARegion *ar)
/* data selector*/
if(G.main->library.first)
- uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, "");
+ uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12||Key Maps %x13", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, "");
else
- uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, "");
+ uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12||Key Maps %x13", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, "");
xco += 120;
/* KeyingSet editing buttons */
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 48c904121a5..4f9a0f686b9 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -94,6 +94,9 @@ typedef struct TreeElement {
#define TSE_RNA_STRUCT 30
#define TSE_RNA_PROPERTY 31
#define TSE_RNA_ARRAY_ELEM 32
+#define TSE_NLA_TRACK 33
+#define TSE_KEYMAP 34
+#define TSE_KEYMAP_ITEM 35
/* outliner search flags */
#define OL_FIND 0
@@ -114,11 +117,28 @@ void outliner_header_buttons(const struct bContext *C, struct ARegion *ar);
/* outliner.c */
void outliner_free_tree(struct ListBase *lb);
-void outliner_operation_menu(struct Scene *scene, struct ARegion *ar, struct SpaceOops *soops);
void outliner_select(struct SpaceOops *soops, struct ListBase *lb, int *index, short *selecting);
void draw_outliner(const struct bContext *C);
-void OUTLINER_OT_activate_click(struct wmOperatorType *ot);
+void OUTLINER_OT_item_activate(struct wmOperatorType *ot);
+void OUTLINER_OT_item_openclose(struct wmOperatorType *ot);
+void OUTLINER_OT_item_rename(struct wmOperatorType *ot);
+void OUTLINER_OT_operation(struct wmOperatorType *ot);
+void OUTLINER_OT_object_operation(struct wmOperatorType *ot);
+void OUTLINER_OT_group_operation(struct wmOperatorType *ot);
+void OUTLINER_OT_id_operation(struct wmOperatorType *ot);
+void OUTLINER_OT_data_operation(struct wmOperatorType *ot);
+
+void OUTLINER_OT_show_one_level(struct wmOperatorType *ot);
+void OUTLINER_OT_show_active(struct wmOperatorType *ot);
+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_renderability_toggle(struct wmOperatorType *ot);
+void OUTLINER_OT_selectability_toggle(struct wmOperatorType *ot);
+void OUTLINER_OT_visibility_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_keyingset_add_selected(struct wmOperatorType *ot);
void OUTLINER_OT_keyingset_remove_selected(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index 0efbdb06cd2..a35b91249db 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -33,6 +33,10 @@
#include "WM_api.h"
#include "WM_types.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
#include "ED_screen.h"
#include "outliner_intern.h"
@@ -43,7 +47,25 @@
void outliner_operatortypes(void)
{
- WM_operatortype_append(OUTLINER_OT_activate_click);
+ WM_operatortype_append(OUTLINER_OT_item_activate);
+ WM_operatortype_append(OUTLINER_OT_item_openclose);
+ WM_operatortype_append(OUTLINER_OT_item_rename);
+ WM_operatortype_append(OUTLINER_OT_operation);
+ WM_operatortype_append(OUTLINER_OT_object_operation);
+ WM_operatortype_append(OUTLINER_OT_group_operation);
+ WM_operatortype_append(OUTLINER_OT_id_operation);
+ WM_operatortype_append(OUTLINER_OT_data_operation);
+
+ 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_selected_toggle);
+ WM_operatortype_append(OUTLINER_OT_expanded_toggle);
+
+ WM_operatortype_append(OUTLINER_OT_renderability_toggle);
+ WM_operatortype_append(OUTLINER_OT_selectability_toggle);
+ WM_operatortype_append(OUTLINER_OT_visibility_toggle);
WM_operatortype_append(OUTLINER_OT_keyingset_add_selected);
WM_operatortype_append(OUTLINER_OT_keyingset_remove_selected);
@@ -54,9 +76,32 @@ void outliner_operatortypes(void)
void outliner_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Outliner", SPACE_OUTLINER, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Outliner", SPACE_OUTLINER, 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_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);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", 1);
+
+ WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "OUTLINER_OT_operation", RIGHTMOUSE, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "OUTLINER_OT_show_hierarchy", HOMEKEY, KM_PRESS, 0, 0);
+
+ 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_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 */
+
+ WM_keymap_verify_item(keymap, "OUTLINER_OT_selected_toggle", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "OUTLINER_OT_expanded_toggle", AKEY, KM_PRESS, KM_SHIFT, 0);
+
+ WM_keymap_verify_item(keymap, "OUTLINER_OT_renderability_toggle", RKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "OUTLINER_OT_selectability_toggle", SKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "OUTLINER_OT_visibility_toggle", VKEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "OUTLINER_OT_activate_click", LEFTMOUSE, KM_PRESS, 0, 0);
/* keying sets - only for databrowse */
WM_keymap_verify_item(keymap, "OUTLINER_OT_keyingset_add_selected", KKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 4ddb586beb4..e7e6c2d0128 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -72,12 +72,12 @@
static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Outliner", SPACE_OUTLINER, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Outliner", SPACE_OUTLINER, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -120,6 +120,7 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_MODE:
case ND_KEYINGSET:
case ND_FRAME:
+ case ND_RENDER_OPTIONS:
ED_region_tag_redraw(ar);
break;
}
@@ -136,6 +137,10 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* all actions now, todo: check outliner view mode? */
ED_region_tag_redraw(ar);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_OUTLINER)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -189,6 +194,10 @@ static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn)
if(wmn->data == ND_KEYINGSET)
ED_region_tag_redraw(ar);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_OUTLINER)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -217,7 +226,7 @@ static SpaceLink *outliner_new(const bContext *C)
ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O);
ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
- ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT);
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
ar->v2d.keeptot= V2D_KEEPTOT_STRICT;
ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 88b8dccc6c9..c17793b28f8 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -64,10 +64,10 @@ static int run_pyfile_exec(bContext *C, wmOperator *op)
ARegion *ar= CTX_wm_region(C);
- char filename[512];
- RNA_string_get(op->ptr, "filename", filename);
+ char path[512];
+ RNA_string_get(op->ptr, "path", path);
#ifndef DISABLE_PYTHON
- if(BPY_run_python_script(C, filename, NULL, op->reports)) {
+ if(BPY_run_python_script(C, path, NULL, op->reports)) {
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
}
@@ -85,7 +85,7 @@ void SCRIPT_OT_python_file_run(wmOperatorType *ot)
ot->exec= run_pyfile_exec;
ot->poll= ED_operator_areaactive;
- RNA_def_string_file_path(ot->srna, "filename", "", 512, "Filename", "");
+ RNA_def_string_file_path(ot->srna, "path", "", 512, "Path", "");
}
static int run_ui_scripts_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c
index aa35ba54b7f..0e6ea9cf4fd 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -65,10 +65,10 @@ void script_operatortypes(void)
void script_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Script", SPACE_SCRIPT, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Script", SPACE_SCRIPT, 0);
/* TODO - this is just while we have no way to load a text datablock */
- RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", PKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0)->ptr, "filename", "test.py");
+ RNA_string_set(WM_keymap_add_item(keymap, "SCRIPT_OT_python_file_run", PKEY, KM_PRESS, KM_CTRL|KM_SHIFT|KM_ALT, 0)->ptr, "path", "test.py");
WM_keymap_add_item(keymap, "SCRIPT_OT_python_run_ui_scripts", PKEY, KM_PRESS, KM_SHIFT, 0);
}
diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c
index 99233cc5020..a0e73082701 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -133,12 +133,12 @@ static SpaceLink *script_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void script_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Script", SPACE_SCRIPT, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Script", SPACE_SCRIPT, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
diff --git a/source/blender/editors/space_sequencer/Makefile b/source/blender/editors/space_sequencer/Makefile
index 7be0bc9cfef..2fb3de516b4 100644
--- a/source/blender/editors/space_sequencer/Makefile
+++ b/source/blender/editors/space_sequencer/Makefile
@@ -50,6 +50,7 @@ CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../python
CPPFLAGS += -I../../blenfont
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+CPPFLAGS += -I$(NAN_AUDASPACE)/include
# own include
diff --git a/source/blender/editors/space_sequencer/SConscript b/source/blender/editors/space_sequencer/SConscript
index ab51068a529..7a3fb6982ef 100644
--- a/source/blender/editors/space_sequencer/SConscript
+++ b/source/blender/editors/space_sequencer/SConscript
@@ -6,5 +6,6 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../blenfont ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna'
+incs += ' #/intern/audaspace/intern'
env.BlenderLib ( 'bf_editors_space_sequencer', sources, Split(incs), [], libtype=['core'], priority=[100] )
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index f6cf6de4b00..bd5259ddb52 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -89,6 +89,9 @@
#include "UI_resources.h"
#include "UI_view2d.h"
+#include "BKE_sound.h"
+#include "AUD_C-API.h"
+
/* own include */
#include "sequencer_intern.h"
@@ -97,7 +100,6 @@
/* avoid passing multiple args and be more verbose */
#define SEQPROP_STARTFRAME 1<<0
#define SEQPROP_ENDFRAME 1<<1
-#define SEQPROP_FILENAME 1<<2
static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
{
@@ -111,9 +113,6 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", "Channel to place this strip into", 1, MAXSEQ);
- if(flag & SEQPROP_FILENAME)
- RNA_def_string(ot->srna, "filename", "", FILE_MAX, "Scene Name", "full path to load the strip data from");
-
RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "replace the current selection");
}
@@ -228,30 +227,86 @@ void SEQUENCER_OT_scene_strip_add(struct wmOperatorType *ot)
RNA_def_string(ot->srna, "scene", "", MAX_ID_NAME-2, "Scene Name", "Scene name to add as a strip");
}
+static Sequence* sequencer_add_sound_strip(bContext *C, wmOperator *op, int start_frame, int channel, char* filename)
+{
+ Scene *scene= CTX_data_scene(C);
+ Editing *ed= seq_give_editing(scene, TRUE);
+
+ bSound *sound;
+
+ Sequence *seq; /* generic strip vars */
+ Strip *strip;
+ StripElem *se;
+
+ AUD_SoundInfo info;
+
+ sound = sound_new_file(CTX_data_main(C), filename);
+
+ if (sound==NULL || sound->handle == NULL) {
+ if(op)
+ BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
+ return NULL;
+ }
+
+ info = AUD_getInfo(sound->handle);
+
+ if (info.specs.format == AUD_FORMAT_INVALID) {
+ sound_delete(C, sound);
+ if(op)
+ BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
+ return NULL;
+ }
+
+ seq = alloc_sequence(ed->seqbasep, start_frame, channel);
+
+ seq->type= SEQ_SOUND;
+ seq->sound= sound;
+
+ /* basic defaults */
+ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
+ strip->len = seq->len = (int) (info.length * FPS);
+ strip->us= 1;
+
+ strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+
+ BLI_split_dirfile_basic(filename, strip->dir, se->name);
+
+ seq->sound_handle = sound_new_handle(scene, sound, start_frame, start_frame + strip->len, 0);
+
+ calc_sequence_disp(seq);
+ sort_seq(scene);
+
+ /* last active name */
+ strncpy(ed->act_sounddir, strip->dir, FILE_MAXDIR-1);
+
+ return seq;
+}
+
/* add movie operator */
static int sequencer_add_movie_strip_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, TRUE);
-
+
struct anim *an;
- char filename[FILE_MAX];
+ char path[FILE_MAX];
- Sequence *seq; /* generic strip vars */
+ Sequence *seq, *soundseq=NULL; /* generic strip vars */
Strip *strip;
StripElem *se;
-
- int start_frame, channel; /* operator props */
-
+
+ int start_frame, channel, sound; /* operator props */
+
start_frame= RNA_int_get(op->ptr, "start_frame");
channel= RNA_int_get(op->ptr, "channel");
+ sound = RNA_boolean_get(op->ptr, "sound");
+
+ RNA_string_get(op->ptr, "path", path);
- RNA_string_get(op->ptr, "filename", filename);
-
- an = openanim(filename, IB_rect);
+ an = openanim(path, IB_rect);
if (an==NULL) {
- BKE_reportf(op->reports, RPT_ERROR, "Filename \"%s\" could not be loaded as a movie", filename);
+ BKE_reportf(op->reports, RPT_ERROR, "File \"%s\" could not be loaded as a movie", path);
return OPERATOR_CANCELLED;
}
@@ -268,17 +323,26 @@ static int sequencer_add_movie_strip_exec(bContext *C, wmOperator *op)
strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- BLI_split_dirfile_basic(filename, strip->dir, se->name);
+ BLI_split_dirfile_basic(path, strip->dir, se->name);
RNA_string_get(op->ptr, "name", seq->name);
calc_sequence_disp(seq);
sort_seq(scene);
+ if(sound)
+ {
+ soundseq = sequencer_add_sound_strip(C, NULL, start_frame, channel+1, path);
+ if(soundseq != NULL)
+ RNA_string_get(op->ptr, "name", soundseq->name);
+ }
+
if (RNA_boolean_get(op->ptr, "replace_sel")) {
deselect_all_seq(scene);
set_last_seq(scene, seq);
seq->flag |= SELECT;
+ if(soundseq)
+ soundseq->flag |= SELECT;
}
ED_area_tag_redraw(CTX_wm_area(C));
@@ -312,73 +376,34 @@ void SEQUENCER_OT_movie_strip_add(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME);
- RNA_def_boolean(ot->srna, "sound", FALSE, "Sound", "Load hd sound with the movie"); // XXX need to impliment this
+ WM_operator_properties_filesel(ot, FOLDERFILE|MOVIEFILE, FILE_SPECIAL);
+ sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME);
+ RNA_def_boolean(ot->srna, "sound", TRUE, "Sound", "Load sound with the movie");
}
-
/* add sound operator */
static int sequencer_add_sound_strip_exec(bContext *C, wmOperator *op)
{
+ char path[FILE_MAX];
Scene *scene= CTX_data_scene(C);
- Editing *ed= seq_give_editing(scene, TRUE);
-
- bSound *sound;
-
- char filename[FILE_MAX];
-
Sequence *seq; /* generic strip vars */
- Strip *strip;
- StripElem *se;
-
int start_frame, channel; /* operator props */
start_frame= RNA_int_get(op->ptr, "start_frame");
channel= RNA_int_get(op->ptr, "channel");
- RNA_string_get(op->ptr, "filename", filename);
-
- /* XXX if(sfile->flag & FILE_STRINGCODE) {
- BLI_makestringcode(G.sce, str);
- }*/
+ RNA_string_get(op->ptr, "path", path);
-// XXX sound= sound_new_sound(filename);
- sound= NULL;
+ seq = sequencer_add_sound_strip(C, op, start_frame, channel, path);
- if (sound==NULL || sound->sample->type == SAMPLE_INVALID) {
- BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
+ if(seq == NULL)
return OPERATOR_CANCELLED;
- }
-
- if (sound==NULL || sound->sample->bits != 16) {
- BKE_report(op->reports, RPT_ERROR, "Only 16 bit audio is supported");
- return OPERATOR_CANCELLED;
- }
-
- sound->flags |= SOUND_FLAGS_SEQUENCE;
-// XXX audio_makestream(sound);
-
- seq = alloc_sequence(ed->seqbasep, start_frame, channel);
-
- seq->type= SEQ_RAM_SOUND;
- seq->sound= sound;
-
- /* basic defaults */
- seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
- strip->len = seq->len = (int) ( ((float)(sound->streamlen-1) / ( (float)scene->r.audio.mixrate*4.0 ))* FPS);
- strip->us= 1;
-
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
-
- BLI_split_dirfile_basic(filename, strip->dir, se->name);
RNA_string_get(op->ptr, "name", seq->name);
-
- calc_sequence_disp(seq);
- sort_seq(scene);
-
- /* last active name */
- strncpy(ed->act_sounddir, strip->dir, FILE_MAXDIR-1);
+
+ if (RNA_boolean_get(op->ptr, "cache")) {
+ sound_cache(seq->sound, 0);
+ }
if (RNA_boolean_get(op->ptr, "replace_sel")) {
deselect_all_seq(scene);
@@ -417,8 +442,9 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME);
- RNA_def_boolean(ot->srna, "hd", FALSE, "HD Sound", "Load the sound as streaming audio"); // XXX need to impliment this
+ WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE, FILE_SPECIAL);
+ sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME);
+ RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Cache the sound in memory.");
}
/* add image operator */
@@ -429,7 +455,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
int tot_images;
- char filename[FILE_MAX];
+ char path[FILE_MAX];
Sequence *seq; /* generic strip vars */
Strip *strip;
@@ -440,14 +466,14 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
start_frame= RNA_int_get(op->ptr, "start_frame");
channel= RNA_int_get(op->ptr, "channel");
- RNA_string_get(op->ptr, "filename", filename);
+ RNA_string_get(op->ptr, "path", path);
seq = alloc_sequence(ed->seqbasep, start_frame, channel);
seq->type= SEQ_IMAGE;
/* basic defaults */
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
- BLI_split_dirfile_basic(filename, strip->dir, NULL);
+ BLI_split_dirfile_basic(path, strip->dir, NULL);
tot_images= RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files"));
@@ -464,7 +490,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
RNA_END;
}
else {
- BLI_split_dirfile_basic(filename, NULL, se->name);
+ BLI_split_dirfile_basic(path, NULL, se->name);
}
RNA_string_get(op->ptr, "name", seq->name);
@@ -512,7 +538,8 @@ void SEQUENCER_OT_image_strip_add(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME);
+ WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE, FILE_SPECIAL);
+ sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME);
RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", "");
}
@@ -579,15 +606,15 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
if (seq->type==SEQ_PLUGIN) {
- char filename[FILE_MAX];
- RNA_string_get(op->ptr, "filename", filename);
+ char path[FILE_MAX];
+ RNA_string_get(op->ptr, "path", path);
- sh.init_plugin(seq, filename);
+ sh.init_plugin(seq, path);
if(seq->plugin==NULL) {
BLI_remlink(ed->seqbasep, seq);
- seq_free_sequence(ed, seq);
- BKE_reportf(op->reports, RPT_ERROR, "Sequencer plugin \"%s\" could not load.", filename);
+ seq_free_sequence(scene, seq);
+ BKE_reportf(op->reports, RPT_ERROR, "Sequencer plugin \"%s\" could not load.", path);
return OPERATOR_CANCELLED;
}
}
@@ -635,7 +662,7 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Add Effect Strip";
ot->idname= "SEQUENCER_OT_effect_strip_add";
- ot->description= "Add an effect to the sequencer, most are applied ontop of existing strips";
+ ot->description= "Add an effect to the sequencer, most are applied on top of existing strips";
/* api callbacks */
ot->invoke= sequencer_add_effect_strip_invoke;
@@ -646,7 +673,8 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME|SEQPROP_FILENAME);
+ WM_operator_properties_filesel(ot, 0, FILE_SPECIAL);
+ sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME);
RNA_def_enum(ot->srna, "type", sequencer_prop_effect_types, SEQ_CROSS, "Type", "Sequencer effect type");
RNA_def_float_vector(ot->srna, "color", 3, NULL, 0.0f, 1.0f, "Color", "Initialize the strip with this color (only used when type='COLOR')", 0.0f, 1.0f);
}
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index cc4f5cf5ce3..72cbacd9b6d 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -112,13 +112,9 @@ static int sequencer_properties(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= sequencer_has_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
@@ -126,6 +122,7 @@ void SEQUENCER_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "SEQUENCER_OT_properties";
+ ot->description= "Open sequencer properties panel.";
ot->exec= sequencer_properties;
ot->poll= ED_operator_sequencer_active;
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 3b90039335e..76bed3772b1 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -173,8 +173,7 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
case SEQ_PLUGIN:
UI_GetThemeColor3ubv(TH_SEQ_PLUGIN, col);
break;
- case SEQ_HD_SOUND:
- case SEQ_RAM_SOUND:
+ case SEQ_SOUND:
UI_GetThemeColor3ubv(TH_SEQ_AUDIO, col);
blendcol[0] = blendcol[1] = blendcol[2] = 128;
if(seq->flag & SEQ_MUTE) UI_GetColorPtrBlendShade3ubv(col, blendcol, col, 0.5, 20);
@@ -226,108 +225,6 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
}
}
-static void drawseqwave(Scene *scene, View2D *v2d, Sequence *seq, float x1, float y1, float x2, float y2, int winx)
-{
- /*
- x1 is the starting x value to draw the wave,
- x2 the end x value, same for y1 and y2
- winx is the zoom level.
- */
-
- float
- f, /* floating point value used to store the X draw location for the wave lines when openGL drawing*/
- midy, /* fast access to the middle location (y1+y2)/2 */
- clipxmin, /* the minimum X value, clip this with the window */
- clipxmax, /* the maximum X value, clip this with the window */
- sample_step, /* steps to move per sample, floating value must later translate into an int */
- fsofs, /* steps to move per sample, floating value must later translate into an int */
- feofs_sofs, /* */
- sound_width, /* convenience: x2-x1 */
- wavemulti; /* scale the samples by this value when GL_LINE drawing so it renders the right height */
-
- int
- offset, /* initial offset value for the wave drawing */
- offset_next, /* when in the wave drawing loop this value is the samples intil the next vert */
- sofs, /* Constrained offset value (~3) for the wave, start */
- eofs, /* ditto, end */
- wavesample, /* inner loop storage if the current wave sample value, used to make the 2 values below */
- wavesamplemin, /* used for finding the min and max wave peaks */
- wavesamplemax, /* ditto */
- subsample_step=4; /* when the sample step is 4 every sample of
- the wave is evaluated for min and max values used to draw the wave,
- however this is slow ehrn zoomed out so when the sample step is above
- 1 (the larger the further out the zoom is) so not evaluate all samples, only some. */
-
- signed short* s;
- bSound *sound;
- uint8_t *stream;
-
-// XXX audio_makestream(seq->sound);
- if(seq->sound==NULL || seq->sound->stream==NULL) return;
-
- if (seq->flag & SEQ_MUTE) glColor3ub(0x70, 0x80, 0x80); else glColor3ub(0x70, 0xc0, 0xc0);
-
- sofs = ((int)( FRA2TIME(seq->startdisp-seq->start+seq->anim_startofs)*(float)scene->r.audio.mixrate*4.0 )) & (~3);
- eofs = ((int)( FRA2TIME(seq->enddisp-seq->start+seq->anim_startofs)*(float)scene->r.audio.mixrate*4.0 )) & (~3);
-
- /* clip the drawing area to the screen bounds to save time */
- sample_step= (v2d->cur.xmax - v2d->cur.xmin)/winx;
- clipxmin= MAX2(x1, v2d->cur.xmin);
- clipxmax= MIN2(x2, v2d->cur.xmax);
-
- if (sample_step > 1)
- subsample_step= ((int)(subsample_step*sample_step*8)) & (~3);
-
- /* for speedy access */
- midy = (y1+y2)/2;
- fsofs= (float)sofs;
- feofs_sofs= (float)(eofs-sofs);
- sound_width= x2-x1;
- sound = seq->sound;
- stream = sound->stream;
- wavemulti = (y2-y1)/196605; /*y2-y1 is the height*/
- wavesample=0;
-
- /* we need to get the starting offset value, excuse the duplicate code */
- f=clipxmin;
- offset= (int) (fsofs + ((f-x1)/sound_width) * feofs_sofs) & (~3);
-
- /* start the loop, draw a line per sample_step -sample_step is about 1 line drawn per pixel */
- glBegin(GL_LINES);
- for (f=x1+sample_step; f<=clipxmax; f+=sample_step) {
-
- offset_next = (int) (fsofs + ((f-x1)/sound_width) * feofs_sofs) & (~3);
- if (f > v2d->cur.xmin) {
- /* if this is close to the last sample just exit */
- if (offset_next >= sound->streamlen) break;
-
- wavesamplemin = 131070;
- wavesamplemax = -131070;
-
- /*find with high and low of the waveform for this draw,
- evaluate small samples to find this range */
- while (offset < offset_next) {
- s = (signed short*)(stream+offset);
-
- wavesample = s[0]*2 + s[1];
- if (wavesamplemin>wavesample)
- wavesamplemin=wavesample;
- if (wavesamplemax<wavesample)
- wavesamplemax=wavesample;
- offset+=subsample_step;
- }
- /* draw the wave line, looks good up close and zoomed out */
- glVertex2f(f, midy-(wavemulti*wavesamplemin) );
- glVertex2f(f, midy-(wavemulti*wavesamplemax) );
- } else {
- while (offset < offset_next) offset+=subsample_step;
- }
-
- offset=offset_next;
- }
- glEnd();
-}
-
/* draw a handle, for each end of a sequence strip */
static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short direction)
{
@@ -546,11 +443,8 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float
else
sprintf(str, "%d | %s", seq->len, give_seqname(seq));
}
- else if (seq->type == SEQ_RAM_SOUND) {
- sprintf(str, "%d | %s", seq->len, seq->strip->stripdata->name);
- }
- else if (seq->type == SEQ_HD_SOUND) {
- sprintf(str, "%d | %s", seq->len, seq->strip->stripdata->name);
+ else if (seq->type == SEQ_SOUND) {
+ sprintf(str, "%d | %s", seq->len, seq->sound->name);
}
else if (seq->type == SEQ_MOVIE) {
sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name);
@@ -664,9 +558,6 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
draw_shadedstrip(seq, background_col, x1, y1, x2, y2);
/* draw additional info and controls */
- if (seq->type == SEQ_RAM_SOUND)
- drawseqwave(scene, v2d, seq, x1, y1, x2, y2, ar->winx);
-
if (!is_single_image)
draw_seq_extensions(scene, sseq, seq);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 7cd81faede1..4e71e4883d1 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -65,8 +65,7 @@
#include "BKE_scene.h"
#include "BKE_utildefines.h"
#include "BKE_report.h"
-
-#include "BIF_transform.h"
+#include "BKE_sound.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -82,6 +81,7 @@
#include "ED_space_api.h"
#include "ED_types.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_util.h"
#include "UI_interface.h"
@@ -96,7 +96,7 @@
//static int _last_seq_init=0;
/* XXX */
static void error() {}
-static void waitcursor() {}
+static void waitcursor(int val) {}
static void activate_fileselect() {}
static int pupmenu() {return 0;}
static int okee() {return 0;}
@@ -123,11 +123,6 @@ EnumPropertyItem sequencer_prop_effect_types[] = {
};
/* mute operator */
-EnumPropertyItem sequencer_prop_operate_types[] = { /* better name? */
- {SEQ_SELECTED, "SELECTED", 0, "Selected", ""},
- {SEQ_UNSELECTED, "UNSELECTED", 0, "Unselected ", ""},
- {0, NULL, 0, NULL, NULL}
-};
EnumPropertyItem prop_side_types[] = {
{SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""},
@@ -172,7 +167,7 @@ Sequence *get_foreground_frame_seq(Scene *scene, int frame)
if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame)
continue;
/* only use elements you can see - not */
- if (ELEM6(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_MOVIE_AND_HD_SOUND, SEQ_COLOR)) {
+ if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) {
if (seq->machine > best_machine) {
best_seq = seq;
best_machine = seq->machine;
@@ -569,7 +564,7 @@ static void reload_sound_strip(Scene *scene, char *name)
calc_sequence(seqact);
seq->strip= 0;
- seq_free_sequence(ed, seq);
+ seq_free_sequence(scene, seq);
BLI_remlink(ed->seqbasep, seq);
seq= ed->seqbasep->first;
@@ -609,7 +604,7 @@ static void reload_image_strip(Scene *scene, char *name)
calc_sequence(seqact);
seq->strip= 0;
- seq_free_sequence(ed, seq);
+ seq_free_sequence(scene, seq);
BLI_remlink(ed->seqbasep, seq);
update_changed_seq_and_deps(scene, seqact, 1, 1);
@@ -728,7 +723,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
if(seq->flag & SELECT) {
- if (seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) {
+ if (seq->type == SEQ_SOUND) {
*error_str= "Can't apply effects to audio sequence strips";
return 0;
}
@@ -855,7 +850,6 @@ static Sequence *del_seq_find_replace_recurs(Scene *scene, Sequence *seq)
static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short deleteall)
{
- Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq, *seqn;
Sequence *last_seq = get_last_seq(scene);
@@ -863,20 +857,20 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de
while(seq) {
seqn= seq->next;
if((seq->flag & flag) || deleteall) {
- if(seq->type==SEQ_RAM_SOUND && seq->sound)
+ if(seq->type==SEQ_SOUND && seq->sound)
seq->sound->id.us--;
BLI_remlink(lb, seq);
if(seq==last_seq) set_last_seq(scene, NULL);
if(seq->type==SEQ_META) recurs_del_seq_flag(scene, &seq->seqbase, flag, 1);
if(seq->ipo) seq->ipo->id.us--;
- seq_free_sequence(ed, seq);
+ seq_free_sequence(scene, seq);
}
seq= seqn;
}
}
-static Sequence *dupli_seq(Sequence *seq)
+static Sequence *dupli_seq(struct Scene *scene, Sequence *seq)
{
Sequence *seqn = MEM_dupallocN(seq);
// XXX animato: ID *id;
@@ -942,14 +936,13 @@ static Sequence *dupli_seq(Sequence *seq)
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
seqn->anim= 0;
- } else if(seq->type == SEQ_RAM_SOUND) {
- seqn->strip->stripdata =
+ } else if(seq->type == SEQ_SOUND) {
+ seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
+ if(seq->sound_handle)
+ seqn->sound_handle = sound_new_handle(scene, seqn->sound, seq->sound_handle->startframe, seq->sound_handle->endframe, seq->sound_handle->frameskip);
+
seqn->sound->id.us++;
- } else if(seq->type == SEQ_HD_SOUND) {
- seqn->strip->stripdata =
- MEM_dupallocN(seq->strip->stripdata);
- seqn->hdaudio = 0;
} else if(seq->type == SEQ_IMAGE) {
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
@@ -976,13 +969,13 @@ static Sequence *dupli_seq(Sequence *seq)
return seqn;
}
-static Sequence * deep_dupli_seq(Sequence * seq)
+static Sequence * deep_dupli_seq(struct Scene *scene, Sequence * seq)
{
- Sequence * seqn = dupli_seq(seq);
+ Sequence * seqn = dupli_seq(scene, seq);
if (seq->type == SEQ_META) {
Sequence * s;
for(s= seq->seqbase.first; s; s = s->next) {
- Sequence * n = deep_dupli_seq(s);
+ Sequence * n = deep_dupli_seq(scene, s);
if (n) {
BLI_addtail(&seqn->seqbase, n);
}
@@ -1001,7 +994,7 @@ static void recurs_dupli_seq(Scene *scene, ListBase *old, ListBase *new)
for(seq= old->first; seq; seq= seq->next) {
seq->tmp= NULL;
if(seq->flag & SELECT) {
- seqn = dupli_seq(seq);
+ seqn = dupli_seq(scene, seq);
if (seqn) { /*should never fail */
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL+SEQ_LOCK);
@@ -1067,10 +1060,10 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
reload_sequence_new_file(scene, seq);
calc_sequence(seq);
-
+
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = deep_dupli_seq(seq);
+ seqn = deep_dupli_seq(scene, seq);
}
if (seqn) {
@@ -1156,10 +1149,10 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
}
calc_sequence(seq);
-
+
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = deep_dupli_seq(seq);
+ seqn = deep_dupli_seq(scene, seq);
}
if (seqn) {
@@ -1468,7 +1461,8 @@ void SEQUENCER_OT_snap(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Snap strips";
ot->idname= "SEQUENCER_OT_snap";
-
+ ot->description="Frame where selected strips will be snapped.";
+
/* api callbacks */
ot->invoke= sequencer_snap_invoke;
ot->exec= sequencer_snap_exec;
@@ -1478,7 +1472,7 @@ void SEQUENCER_OT_snap(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will snaped", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will be snapped", INT_MIN, INT_MAX);
}
/* mute operator */
@@ -1492,19 +1486,20 @@ static int sequencer_mute_exec(bContext *C, wmOperator *op)
if(ed==NULL)
return OPERATOR_CANCELLED;
- selected= RNA_enum_is_equal(op->ptr, "type", "SELECTED");
-
+ selected= !RNA_boolean_get(op->ptr, "unselected");
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if ((seq->flag & SEQ_LOCK)==0) {
if(selected){ /* mute unselected */
if (seq->flag & SELECT) {
seq->flag |= SEQ_MUTE;
+ seq_update_sound(seq);
}
}
else {
if ((seq->flag & SELECT)==0) {
seq->flag |= SEQ_MUTE;
+ seq_update_sound(seq);
}
}
}
@@ -1520,7 +1515,8 @@ void SEQUENCER_OT_mute(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Mute Strips";
ot->idname= "SEQUENCER_OT_mute";
-
+ ot->description="Mute selected strips.";
+
/* api callbacks */
ot->exec= sequencer_mute_exec;
@@ -1529,7 +1525,7 @@ void SEQUENCER_OT_mute(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", sequencer_prop_operate_types, SEQ_SELECTED, "Type", "");
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Mute unselected rather than selected strips.");
}
@@ -1544,19 +1540,20 @@ static int sequencer_unmute_exec(bContext *C, wmOperator *op)
if(ed==NULL)
return OPERATOR_CANCELLED;
- selected= RNA_enum_is_equal(op->ptr, "type", "SELECTED");
-
+ selected= !RNA_boolean_get(op->ptr, "unselected");
for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if ((seq->flag & SEQ_LOCK)==0) {
if(selected){ /* unmute unselected */
if (seq->flag & SELECT) {
seq->flag &= ~SEQ_MUTE;
+ seq_update_sound(seq);
}
}
else {
if ((seq->flag & SELECT)==0) {
seq->flag &= ~SEQ_MUTE;
+ seq_update_sound(seq);
}
}
}
@@ -1572,7 +1569,8 @@ void SEQUENCER_OT_unmute(struct wmOperatorType *ot)
/* identifiers */
ot->name= "UnMute Strips";
ot->idname= "SEQUENCER_OT_unmute";
-
+ ot->description="UnMute unselected rather than selected strips.";
+
/* api callbacks */
ot->exec= sequencer_unmute_exec;
@@ -1581,7 +1579,7 @@ void SEQUENCER_OT_unmute(struct wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", sequencer_prop_operate_types, SEQ_SELECTED, "Type", "");
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "UnMute unselected rather than selected strips.");
}
@@ -1611,7 +1609,8 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Lock Strips";
ot->idname= "SEQUENCER_OT_lock";
-
+ ot->description="Lock the active strip so that it can't be transformed.";
+
/* api callbacks */
ot->exec= sequencer_lock_exec;
@@ -1647,7 +1646,8 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot)
/* identifiers */
ot->name= "UnLock Strips";
ot->idname= "SEQUENCER_OT_unlock";
-
+ ot->description="Unlock the active strip so that it can't be transformed.";
+
/* api callbacks */
ot->exec= sequencer_unlock_exec;
@@ -1683,7 +1683,8 @@ void SEQUENCER_OT_reload(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Reload Strips";
ot->idname= "SEQUENCER_OT_reload";
-
+ ot->description="Reload strips in the sequencer.";
+
/* api callbacks */
ot->exec= sequencer_reload_exec;
@@ -1702,7 +1703,7 @@ static int sequencer_refresh_all_exec(bContext *C, wmOperator *op)
if(ed==NULL)
return OPERATOR_CANCELLED;
- free_imbuf_seq(&ed->seqbase);
+ free_imbuf_seq(&ed->seqbase, FALSE);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1714,7 +1715,8 @@ void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Refresh Sequencer";
ot->idname= "SEQUENCER_OT_refresh_all";
-
+ ot->description="Refresh the sequencer editor.";
+
/* api callbacks */
ot->exec= sequencer_refresh_all_exec;
@@ -1811,7 +1813,8 @@ void SEQUENCER_OT_cut(struct wmOperatorType *ot)
/* identifiers */
ot->name= "Cut Strips";
ot->idname= "SEQUENCER_OT_cut";
-
+ ot->description="Cut the selected strips.";
+
/* api callbacks */
ot->invoke= sequencer_cut_invoke;
ot->exec= sequencer_cut_exec;
@@ -1822,7 +1825,7 @@ void SEQUENCER_OT_cut(struct wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
RNA_def_int(ot->srna, "frame", 0, INT_MIN, INT_MAX, "Frame", "Frame where selected strips will be cut", INT_MIN, INT_MAX);
- RNA_def_enum(ot->srna, "type", prop_cut_types, SEQ_CUT_SOFT, "Type", "the type of cut operation to perform on strips");
+ RNA_def_enum(ot->srna, "type", prop_cut_types, SEQ_CUT_SOFT, "Type", "The type of cut operation to perform on strips");
RNA_def_enum(ot->srna, "side", prop_side_types, SEQ_SIDE_BOTH, "Side", "The side that remains selected after cutting");
}
@@ -1855,13 +1858,14 @@ static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *
return OPERATOR_FINISHED;
}
-void SEQUENCER_OT_duplicate_add(wmOperatorType *ot)
+void SEQUENCER_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Add Duplicate";
- ot->idname= "SEQUENCER_OT_duplicate_add";
-
+ ot->name= "Duplicate";
+ ot->idname= "SEQUENCER_OT_duplicate";
+ ot->description="Duplicate the selected strips.";
+
/* api callbacks */
ot->invoke= sequencer_add_duplicate_invoke;
ot->exec= sequencer_add_duplicate_exec;
@@ -1943,7 +1947,8 @@ void SEQUENCER_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "Erase Strips";
ot->idname= "SEQUENCER_OT_delete";
-
+ ot->description="Erase selected strips from the sequencer.";
+
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= sequencer_delete_exec;
@@ -2015,7 +2020,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
start_ofs += step;
}
- seq_free_sequence(ed, seq);
+ seq_free_sequence(scene, seq);
seq = seq->next;
} else {
seq = seq->next;
@@ -2036,7 +2041,8 @@ void SEQUENCER_OT_images_separate(wmOperatorType *ot)
/* identifiers */
ot->name= "Separate Images";
ot->idname= "SEQUENCER_OT_images_separate";
-
+ ot->description="On image sequences strips, it return a strip for each image.";
+
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= sequencer_separate_images_exec;
@@ -2108,7 +2114,8 @@ void SEQUENCER_OT_meta_toggle(wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Meta Strip";
ot->idname= "SEQUENCER_OT_meta_toggle";
-
+ ot->description="Toggle a metastrip (to edit enclosed strips).";
+
/* api callbacks */
ot->exec= sequencer_meta_toggle_exec;
@@ -2138,7 +2145,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
while(seq) {
if(seq->flag & SELECT) {
tot++;
- if (seq->type == SEQ_RAM_SOUND) {
+ if (seq->type == SEQ_SOUND) {
BKE_report(op->reports, RPT_ERROR, "Can't make Meta Strip from audio");
return OPERATOR_CANCELLED;;
}
@@ -2212,7 +2219,8 @@ void SEQUENCER_OT_meta_make(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Meta Strip";
ot->idname= "SEQUENCER_OT_meta_make";
-
+ ot->description="Group selected strips into a metastrip.";
+
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= sequencer_meta_make_exec;
@@ -2250,7 +2258,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
last_seq->seqbase.last= 0;
BLI_remlink(ed->seqbasep, last_seq);
- seq_free_sequence(ed, last_seq);
+ seq_free_sequence(scene, last_seq);
/* emtpy meta strip, delete all effects depending on it */
for(seq=ed->seqbasep->first; seq; seq=seq->next)
@@ -2281,7 +2289,8 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
/* identifiers */
ot->name= "UnMeta Strip";
ot->idname= "SEQUENCER_OT_meta_separate";
-
+ ot->description="Put the contents of a metastrip back in the sequencer.";
+
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= sequencer_meta_separate_exec;
@@ -2347,7 +2356,8 @@ void SEQUENCER_OT_view_all(wmOperatorType *ot)
/* identifiers */
ot->name= "View All";
ot->idname= "SEQUENCER_OT_view_all";
-
+ ot->description="View all the strips in the sequencer.";
+
/* api callbacks */
ot->exec= sequencer_view_all_exec;
@@ -2427,7 +2437,8 @@ void SEQUENCER_OT_view_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "View Selected";
ot->idname= "SEQUENCER_OT_view_selected";
-
+ ot->description="Zoom the sequencer on the selected strips.";
+
/* api callbacks */
ot->exec= sequencer_view_selected_exec;
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index 6d61f743917..ac396440a00 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -83,7 +83,7 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot);
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_duplicate_add(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);
void SEQUENCER_OT_meta_toggle(struct wmOperatorType *ot);
@@ -104,7 +104,7 @@ void SEQUENCER_OT_select_linked_pick(struct wmOperatorType *ot);
void SEQUENCER_OT_select_handles(struct wmOperatorType *ot);
void SEQUENCER_OT_select_active_side(struct wmOperatorType *ot);
void SEQUENCER_OT_select_border(struct wmOperatorType *ot);
-void SEQUENCER_OT_select_invert(struct wmOperatorType *ot);
+void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot);
/* sequencer_select.c */
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index c6e5fbe39a4..ac125c10b2d 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -41,8 +41,6 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
-#include "BIF_transform.h" /* transform keymap */
-
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -54,6 +52,7 @@
#include "WM_types.h"
#include "ED_screen.h"
+#include "ED_transform.h" /* transform keymap */
#include "sequencer_intern.h"
@@ -71,7 +70,7 @@ void sequencer_operatortypes(void)
WM_operatortype_append(SEQUENCER_OT_unlock);
WM_operatortype_append(SEQUENCER_OT_reload);
WM_operatortype_append(SEQUENCER_OT_refresh_all);
- WM_operatortype_append(SEQUENCER_OT_duplicate_add);
+ WM_operatortype_append(SEQUENCER_OT_duplicate);
WM_operatortype_append(SEQUENCER_OT_delete);
WM_operatortype_append(SEQUENCER_OT_images_separate);
WM_operatortype_append(SEQUENCER_OT_meta_toggle);
@@ -84,7 +83,7 @@ void sequencer_operatortypes(void)
/* sequencer_select.c */
WM_operatortype_append(SEQUENCER_OT_select_all_toggle);
- WM_operatortype_append(SEQUENCER_OT_select_invert);
+ WM_operatortype_append(SEQUENCER_OT_select_inverse);
WM_operatortype_append(SEQUENCER_OT_select);
WM_operatortype_append(SEQUENCER_OT_select_more);
WM_operatortype_append(SEQUENCER_OT_select_less);
@@ -106,29 +105,29 @@ void sequencer_operatortypes(void)
void sequencer_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Sequencer", SPACE_SEQ, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Sequencer", SPACE_SEQ, 0);
wmKeymapItem *kmi;
WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0)->ptr, "type", SEQ_CUT_SOFT);
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", SEQ_CUT_HARD);
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, 0, 0)->ptr, "type", SEQ_SELECTED);
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", SEQ_UNSELECTED);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", SEQ_SELECTED);
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "type", SEQ_UNSELECTED);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "SEQUENCER_OT_lock", LKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", HKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", LKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_duplicate_add", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_delete", DELKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index bfd89ccdffb..747e1609213 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -153,7 +153,7 @@ void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING B
if(seq->strip)
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
}
- else if((seq->type==SEQ_HD_SOUND) || (seq->type==SEQ_RAM_SOUND)) {
+ else if(seq->type==SEQ_SOUND) {
if(seq->strip)
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
}
@@ -232,7 +232,8 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
/* identifiers */
ot->name= "(De)Select All";
ot->idname= "SEQUENCER_OT_select_all_toggle";
-
+ ot->description="Select or deselect all strips.";
+
/* api callbacks */
ot->exec= sequencer_deselect_exec;
@@ -244,7 +245,7 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
/* (de)select operator */
-static int sequencer_select_invert_exec(bContext *C, wmOperator *op)
+static int sequencer_select_inverse_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -267,14 +268,15 @@ static int sequencer_select_invert_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SEQUENCER_OT_select_invert(struct wmOperatorType *ot)
+void SEQUENCER_OT_select_inverse(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select Invert";
- ot->idname= "SEQUENCER_OT_select_invert";
-
+ ot->name= "Select Inverse";
+ ot->idname= "SEQUENCER_OT_select_inverse";
+ ot->description="Select unselected strips.";
+
/* api callbacks */
- ot->exec= sequencer_select_invert_exec;
+ ot->exec= sequencer_select_inverse_exec;
ot->poll= ED_operator_sequencer_active;
@@ -336,7 +338,7 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
}
} else
- if (seq->type == SEQ_HD_SOUND || seq->type == SEQ_RAM_SOUND) {
+ if (seq->type == SEQ_SOUND) {
if(seq->strip) {
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
}
@@ -448,6 +450,7 @@ void SEQUENCER_OT_select(wmOperatorType *ot)
/* identifiers */
ot->name= "Activate/Select";
ot->idname= "SEQUENCER_OT_select";
+ ot->description="Select a strip (last selected becomes the \"active strip\").";
/* api callbacks */
ot->invoke= sequencer_select_invoke;
@@ -533,6 +536,7 @@ void SEQUENCER_OT_select_more(wmOperatorType *ot)
/* identifiers */
ot->name= "Select More";
ot->idname= "SEQUENCER_OT_select_more";
+ ot->description="DOC_BROKEN";
/* api callbacks */
ot->exec= sequencer_select_more_exec;
@@ -562,6 +566,7 @@ void SEQUENCER_OT_select_less(wmOperatorType *ot)
/* identifiers */
ot->name= "Select less";
ot->idname= "SEQUENCER_OT_select_less";
+ ot->description="DOC_BROKEN";
/* api callbacks */
ot->exec= sequencer_select_less_exec;
@@ -616,6 +621,7 @@ void SEQUENCER_OT_select_linked_pick(wmOperatorType *ot)
/* identifiers */
ot->name= "Select pick linked";
ot->idname= "SEQUENCER_OT_select_linked_pick";
+ ot->description="DOC_BROKEN";
/* api callbacks */
ot->invoke= sequencer_select_linked_pick_invoke;
@@ -650,7 +656,8 @@ void SEQUENCER_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name= "Select linked";
ot->idname= "SEQUENCER_OT_select_linked";
-
+ ot->description="DOC_BROKEN";
+
/* api callbacks */
ot->exec= sequencer_select_linked_exec;
ot->poll= ED_operator_sequencer_active;
@@ -701,7 +708,8 @@ void SEQUENCER_OT_select_handles(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Handles";
ot->idname= "SEQUENCER_OT_select_handles";
-
+ ot->description="DOC_BROKEN";
+
/* api callbacks */
ot->exec= sequencer_select_handles_exec;
ot->poll= ED_operator_sequencer_active;
@@ -737,7 +745,8 @@ void SEQUENCER_OT_select_active_side(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Active Side";
ot->idname= "SEQUENCER_OT_select_active_side";
-
+ ot->description="DOC_BROKEN";
+
/* api callbacks */
ot->exec= sequencer_select_active_side_exec;
ot->poll= ED_operator_sequencer_active;
@@ -799,6 +808,7 @@ void SEQUENCER_OT_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "SEQUENCER_OT_select_border";
+ ot->description="Enable border select mode.";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index c7c92b71861..c2756b05946 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -185,12 +185,12 @@ static SpaceLink *sequencer_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void sequencer_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Sequencer", SPACE_SEQ, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Sequencer", SPACE_SEQ, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -219,6 +219,10 @@ static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn)
break;
}
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_SEQUENCER)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -234,13 +238,17 @@ static void sequencer_buttons_area_init(wmWindowManager *wm, ARegion *ar)
static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_SEQUENCER)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -293,6 +301,7 @@ void ED_spacetype_sequencer(void)
art->init= sequencer_header_area_init;
art->draw= sequencer_header_area_draw;
+ art->listener= sequencer_main_area_listener;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
index f8ef2b21ae7..6713e19b6de 100644
--- a/source/blender/editors/space_sound/space_sound.c
+++ b/source/blender/editors/space_sound/space_sound.c
@@ -142,12 +142,12 @@ static SpaceLink *sound_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void sound_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Sound", SPACE_SOUND, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Sound", SPACE_SOUND, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 8759fd00f74..e068c1a70bb 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -143,6 +143,10 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
ED_area_tag_redraw(sa);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_TEXT)
+ ED_area_tag_redraw(sa);
+ break;
}
}
@@ -204,44 +208,61 @@ static void text_operatortypes(void)
static void text_keymap(struct wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Text", SPACE_TEXT, 0);
+ wmKeyMap *keymap;
+
+ keymap= WM_keymap_find(wm, "Text", SPACE_TEXT, 0);
+
+ #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_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);
+ 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);
+ WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_find", FKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_OSKEY, 0);
+ #endif
WM_keymap_add_item(keymap, "TEXT_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_reload", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "TEXT_OT_run_script", PKEY, KM_PRESS, KM_ALT, 0);
-
- WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_ALT, 0);
+
WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
if(U.uiflag & USER_MMB_PASTE) // XXX not dynamic
RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0)->ptr, "selection", 1);
WM_keymap_add_item(keymap, "TEXT_OT_jump", JKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_find", FKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_find", FKEY, KM_PRESS, KM_CTRL, 0);
+
WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0);
+
WM_keymap_add_item(keymap, "TEXT_OT_indent", TABKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_uncomment", DKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
- 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", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", LINE_BEGIN);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
- 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_CTRL, 0)->ptr, "type", LINE_BEGIN);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", LINE_END);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", EKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "type", LINE_END);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", ENDKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_END);
@@ -256,8 +277,6 @@ static void text_keymap(struct wmWindowManager *wm)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", HOMEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_BEGIN);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", ENDKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", LINE_END);
- 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", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", PREV_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "type", PREV_WORD);
@@ -285,6 +304,7 @@ static void text_keymap(struct wmWindowManager *wm)
WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TEXT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "TEXT_OT_line_number", KM_TEXTINPUT, KM_ANY, KM_ANY, 0);
WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
}
@@ -311,12 +331,12 @@ static int text_context(const bContext *C, const char *member, bContextDataResul
/* add handlers, stuff you only do once or on area/region changes */
static void text_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "Text", SPACE_TEXT, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "Text", SPACE_TEXT, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -371,7 +391,7 @@ static void text_properties_area_init(wmWindowManager *wm, ARegion *ar)
static void text_properties_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
/********************* registration ********************/
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 0dfe7c9e660..5996770c206 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -41,6 +41,7 @@
#include "DNA_text_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -94,13 +95,7 @@ static int text_font_draw_character(SpaceText *st, int x, int y, char c)
BLF_position(x, y, 0);
BLF_draw(str);
- return text_font_width_character(st);
-}
-
-int text_font_width_character(SpaceText *st)
-{
- // XXX need quick BLF function, or cache it somewhere
- return (st->lheight == 12)? 7: 8;
+ return st->cwidth;
}
int text_font_width(SpaceText *st, char *str)
@@ -114,22 +109,18 @@ static void flatten_string_append(FlattenString *fs, char c, int accum)
{
if(fs->pos>=fs->len && fs->pos>=sizeof(fs->fixedbuf)-1) {
char *nbuf; int *naccum;
- int olen= fs->len;
-
- if(olen) fs->len*= 2;
- else fs->len= 256;
-
+ if(fs->len) fs->len*= 2;
+ else fs->len= sizeof(fs->fixedbuf) * 2;
+
nbuf= MEM_callocN(sizeof(*fs->buf)*fs->len, "fs->buf");
naccum= MEM_callocN(sizeof(*fs->accum)*fs->len, "fs->accum");
+
+ memcpy(nbuf, fs->buf, fs->pos);
+ memcpy(naccum, fs->accum, fs->pos);
- if(olen) {
- memcpy(nbuf, fs->buf, olen);
- memcpy(naccum, fs->accum, olen);
-
- if(fs->buf != fs->fixedbuf) {
- MEM_freeN(fs->buf);
- MEM_freeN(fs->accum);
- }
+ if(fs->buf != fs->fixedbuf) {
+ MEM_freeN(fs->buf);
+ MEM_freeN(fs->accum);
}
fs->buf= nbuf;
@@ -139,8 +130,7 @@ static void flatten_string_append(FlattenString *fs, char c, int accum)
fs->buf[fs->pos]= c;
fs->accum[fs->pos]= accum;
- if(c==0) fs->pos= 0;
- else fs->pos++;
+ fs->pos++;
}
int flatten_string(SpaceText *st, FlattenString *fs, char *in)
@@ -435,60 +425,6 @@ static void format_draw_color(char formatchar)
}
}
-/*********************** utilities ************************/
-
-int text_check_bracket(char ch)
-{
- int a;
- char opens[] = "([{";
- char close[] = ")]}";
-
- for(a=0; a<3; a++) {
- if(ch==opens[a])
- return a+1;
- else if(ch==close[a])
- return -(a+1);
- }
- return 0;
-}
-
-int text_check_delim(char ch)
-{
- int a;
- char delims[] = "():\"\' ~!%^&*-+=[]{};/<>|.#\t,";
-
- for(a=0; a<28; a++) {
- if(ch==delims[a])
- return 1;
- }
- return 0;
-}
-
-int text_check_digit(char ch)
-{
- if(ch < '0') return 0;
- if(ch <= '9') return 1;
- return 0;
-}
-
-int text_check_identifier(char ch)
-{
- if(ch < '0') return 0;
- if(ch <= '9') return 1;
- if(ch < 'A') return 0;
- if(ch <= 'Z' || ch == '_') return 1;
- if(ch < 'a') return 0;
- if(ch <= 'z') return 1;
- return 0;
-}
-
-int text_check_whitespace(char ch)
-{
- if(ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
- return 1;
- return 0;
-}
-
/************************** draw text *****************************/
/***********************/ /*
@@ -522,7 +458,7 @@ int wrap_width(SpaceText *st, ARegion *ar)
int x, max;
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- max= (ar->winx-x)/text_font_width_character(st);
+ max= (ar->winx-x)/st->cwidth;
return max>8 ? max : 8;
}
@@ -614,7 +550,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
len= flatten_string(st, &fs, str);
str= fs.buf;
- max= w/text_font_width_character(st);
+ max= w/st->cwidth;
if(max<8) max= 8;
basex= x;
@@ -686,7 +622,7 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
}
else {
while(w-- && *acc++ < maxwidth)
- r+= text_font_width_character(st);
+ r+= st->cwidth;
}
flatten_string_free(&fs);
@@ -701,7 +637,7 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
/************************ draw scrollbar *****************************/
-static void calc_text_rcts(SpaceText *st, ARegion *ar)
+static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
{
int lhlstart, lhlend, ltexth;
short barheight, barstart, hlstart, hlend, blank_lines;
@@ -713,6 +649,12 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar)
ltexth= txt_get_span(st->text->lines.first, st->text->lines.last);
blank_lines = st->viewlines / 2;
+ /* nicer code: use scroll rect for entire bar */
+ scroll->xmin= 5;
+ scroll->xmax= 17;
+ scroll->ymin= 4;
+ scroll->ymax= 4+pix_available;
+
/* when resizing a vieport with the bar at the bottom to a greater height more blank lines will be added */
if(ltexth + blank_lines < st->top + st->viewlines) {
blank_lines = st->top + st->viewlines - ltexth;
@@ -728,9 +670,8 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar)
}
barstart = (ltexth > 0)? ((pix_available - pix_bardiff) * st->top)/ltexth: 0;
- st->txtbar.xmin = 5;
- st->txtbar.xmax = 17;
- st->txtbar.ymax = ar->winy - pix_top_margin - barstart;
+ st->txtbar= *scroll;
+ st->txtbar.ymax -= barstart;
st->txtbar.ymin = st->txtbar.ymax - barheight;
CLAMP(st->txtbar.ymin, pix_bottom_margin, ar->winy - pix_top_margin);
@@ -796,8 +737,7 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar)
hlend = hlstart + 2;
}
- st->txtscroll.xmin= 5;
- st->txtscroll.xmax= 17;
+ st->txtscroll= *scroll;
st->txtscroll.ymax= ar->winy - pix_top_margin - hlstart;
st->txtscroll.ymin= ar->winy - pix_top_margin - hlend;
@@ -805,19 +745,31 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar)
CLAMP(st->txtscroll.ymax, pix_bottom_margin, ar->winy - pix_top_margin);
}
-static void draw_textscroll(SpaceText *st, ARegion *ar)
+static void draw_textscroll(SpaceText *st, ARegion *ar, rcti *scroll)
{
- UI_ThemeColorShade(TH_SHADE1, -20);
- glRecti(2, 2, 20, ar->winy-6);
- uiEmboss(2, 2, 20, ar->winy-6, 1);
-
- UI_ThemeColor(TH_SHADE1);
- glRecti(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax);
+ bTheme *btheme= U.themes.first;
+ uiWidgetColors wcol= btheme->tui.wcol_scroll;
+ char col[3];
+ float rad;
+
+// UI_ThemeColorShade(TH_SHADE1, -20);
+// glRecti(2, 2, 20, ar->winy-6);
+// uiEmboss(2, 2, 20, ar->winy-6, 1);
- UI_ThemeColor(TH_SHADE2);
- glRecti(st->txtscroll.xmin, st->txtscroll.ymin, st->txtscroll.xmax, st->txtscroll.ymax);
+// UI_ThemeColor(TH_SHADE1);
+// glRecti(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax);
- uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT);
+// uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT);
+
+ 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);
+ glEnable(GL_BLEND);
+ uiRoundBox(st->txtscroll.xmin+1, st->txtscroll.ymin, st->txtscroll.xmax-1, st->txtscroll.ymax, rad);
+ glDisable(GL_BLEND);
}
/************************** draw markers **************************/
@@ -860,18 +812,18 @@ static void draw_markers(SpaceText *st, ARegion *ar)
if(y1==y2) {
y -= y1*st->lheight;
glBegin(GL_LINE_LOOP);
- glVertex2i(x+x2*text_font_width_character(st)+1, y);
- glVertex2i(x+x1*text_font_width_character(st)-2, y);
- glVertex2i(x+x1*text_font_width_character(st)-2, y-st->lheight);
- glVertex2i(x+x2*text_font_width_character(st)+1, y-st->lheight);
+ 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*text_font_width_character(st)-2, y);
- glVertex2i(x+x1*text_font_width_character(st)-2, y-st->lheight);
+ 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;
@@ -888,8 +840,8 @@ static void draw_markers(SpaceText *st, ARegion *ar)
glBegin(GL_LINE_STRIP);
glVertex2i(x, y);
- glVertex2i(x+x2*text_font_width_character(st)+1, y);
- glVertex2i(x+x2*text_font_width_character(st)+1, y-st->lheight);
+ glVertex2i(x+x2*st->cwidth+1, y);
+ glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
glVertex2i(x, y-st->lheight);
glEnd();
}
@@ -923,18 +875,18 @@ static void draw_documentation(SpaceText *st, ARegion *ar)
if(l<0) return;
if(st->showlinenrs) {
- x= text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
+ x= st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
}
else {
- x= text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
+ x= st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4;
}
if(texttool_suggest_first()) {
- x += SUGG_LIST_WIDTH*text_font_width_character(st) + 50;
+ x += SUGG_LIST_WIDTH*st->cwidth + 50;
}
top= y= ar->winy - st->lheight*l - 2;
len= strlen(docs);
- boxw= DOC_WIDTH*text_font_width_character(st) + 20;
+ boxw= DOC_WIDTH*st->cwidth + 20;
boxh= (DOC_HEIGHT+1)*st->lheight;
/* Draw panel */
@@ -1017,14 +969,14 @@ static void draw_suggestion_list(SpaceText *st, ARegion *ar)
if(l<0) return;
if(st->showlinenrs) {
- x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
+ x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
}
else {
- x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
+ x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4;
}
y = ar->winy - st->lheight*l - 2;
- boxw = SUGG_LIST_WIDTH*text_font_width_character(st) + 20;
+ boxw = SUGG_LIST_WIDTH*st->cwidth + 20;
boxh = SUGG_LIST_SIZE*st->lheight + 8;
UI_ThemeColor(TH_SHADE1);
@@ -1094,9 +1046,9 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
if(vcurl==vsell) {
y -= vcurl*st->lheight;
if(vcurc < vselc)
- glRecti(x+vcurc*text_font_width_character(st)-1, y, x+vselc*text_font_width_character(st), y-st->lheight);
+ glRecti(x+vcurc*st->cwidth-1, y, x+vselc*st->cwidth, y-st->lheight);
else
- glRecti(x+vselc*text_font_width_character(st)-1, y, x+vcurc*text_font_width_character(st), y-st->lheight);
+ glRecti(x+vselc*st->cwidth-1, y, x+vcurc*st->cwidth, y-st->lheight);
}
else {
int froml, fromc, tol, toc;
@@ -1111,11 +1063,11 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
y -= froml*st->lheight;
- glRecti(x+fromc*text_font_width_character(st)-1, y, ar->winx, y-st->lheight); y-=st->lheight;
+ glRecti(x+fromc*st->cwidth-1, y, ar->winx, y-st->lheight); y-=st->lheight;
for(i=froml+1; i<tol; i++)
glRecti(x-4, y, ar->winx, y-st->lheight), y-=st->lheight;
- glRecti(x-4, y, x+toc*text_font_width_character(st), y-st->lheight); y-=st->lheight;
+ glRecti(x-4, y, x+toc*st->cwidth, y-st->lheight); y-=st->lheight;
}
}
else {
@@ -1132,13 +1084,13 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
if(!hidden) {
/* Draw the cursor itself (we draw the sel. cursor as this is the leading edge) */
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- x += vselc*text_font_width_character(st);
+ x += vselc*st->cwidth;
y= ar->winy-2 - vsell*st->lheight;
if(st->overwrite) {
char ch= text->sell->line[text->selc];
if(!ch) ch= ' ';
- w= text_font_width_character(st);
+ w= st->cwidth;
UI_ThemeColor(TH_HILITE);
glRecti(x, y-st->lheight-1, x+w, y-st->lheight+1);
}
@@ -1238,8 +1190,8 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
if(viewc >= 0){
viewl= txt_get_span(text->lines.first, startl) - st->top + offl;
- text_font_draw_character(st, x+viewc*text_font_width_character(st), y-viewl*st->lheight, ch);
- text_font_draw_character(st, x+viewc*text_font_width_character(st)+1, y-viewl*st->lheight, ch);
+ text_font_draw_character(st, x+viewc*st->cwidth, y-viewl*st->lheight, ch);
+ text_font_draw_character(st, x+viewc*st->cwidth+1, y-viewl*st->lheight, ch);
}
/* draw closing bracket */
@@ -1250,8 +1202,8 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
if(viewc >= 0) {
viewl= txt_get_span(text->lines.first, endl) - st->top + offl;
- text_font_draw_character(st, x+viewc*text_font_width_character(st), y-viewl*st->lheight, ch);
- text_font_draw_character(st, x+viewc*text_font_width_character(st)+1, y-viewl*st->lheight, ch);
+ text_font_draw_character(st, x+viewc*st->cwidth, y-viewl*st->lheight, ch);
+ text_font_draw_character(st, x+viewc*st->cwidth+1, y-viewl*st->lheight, ch);
}
}
@@ -1261,6 +1213,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
TextLine *tmp;
+ rcti scroll;
char linenr[12];
int i, x, y, linecount= 0;
@@ -1276,7 +1229,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
else st->viewlines= 0;
/* update rects for scroll */
- calc_text_rcts(st, ar);
+ calc_text_rcts(st, ar, &scroll); /* scroll will hold the entire bar size */
/* update syntax formatting if needed */
tmp= text->lines.first;
@@ -1288,13 +1241,23 @@ void draw_text_main(SpaceText *st, ARegion *ar)
linecount++;
}
+ text_font_begin(st);
+ st->cwidth= BLF_fixed_width();
+ st->cwidth= MAX2(st->cwidth, 1);
+
/* 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);
- glRecti(23, 0, (st->lheight==15)? 63: 59, ar->winy - 2);
+ glRecti((TXT_OFFSET-12), 0, (TXT_OFFSET-5) + TEXTXLOC, ar->winy - 2);
}
-
- text_font_begin(st);
+ else {
+ st->linenrs_tot= 0; /* not used */
+ x= TXT_OFFSET;
+ }
+ y= ar->winy-st->lheight;
/* draw cursor */
draw_cursor(st, ar);
@@ -1302,9 +1265,6 @@ void draw_text_main(SpaceText *st, ARegion *ar)
/* draw the text */
UI_ThemeColor(TH_TEXT);
- y= ar->winy-st->lheight;
- x= (st->showlinenrs)? TXT_OFFSET + TEXTXLOC: TXT_OFFSET;
-
for(i=0; y>0 && i<st->viewlines && tmp; i++, tmp= tmp->next) {
if(st->showsyntax && !tmp->format)
txt_format_line(st, tmp, 0);
@@ -1316,14 +1276,9 @@ void draw_text_main(SpaceText *st, ARegion *ar)
else
UI_ThemeColor(TH_TEXT);
- if(((float)(i + linecount + 1)/10000.0) < 1.0) {
- sprintf(linenr, "%4d", i + linecount + 1);
- text_font_draw(st, TXT_OFFSET - 7, y, linenr);
- }
- else {
- sprintf(linenr, "%5d", i + linecount + 1);
- text_font_draw(st, TXT_OFFSET - 11, y, linenr);
- }
+ sprintf(linenr, "%d", i + linecount + 1);
+ /* itoa(i + linecount + 1, linenr, 10); */ /* not ansi-c :/ */
+ text_font_draw(st, TXT_OFFSET - 7, y, linenr);
UI_ThemeColor(TH_TEXT);
}
@@ -1343,7 +1298,8 @@ void draw_text_main(SpaceText *st, ARegion *ar)
/* draw other stuff */
draw_brackets(st, ar);
draw_markers(st, ar);
- draw_textscroll(st, ar);
+ glTranslatef(0.375f, 0.375f, 0.0f); /* XXX scroll requires exact pixel space */
+ draw_textscroll(st, ar, &scroll);
draw_documentation(st, ar);
draw_suggestion_list(st, ar);
@@ -1352,6 +1308,14 @@ void draw_text_main(SpaceText *st, ARegion *ar)
/************************** update ***************************/
+void text_update_character_width(SpaceText *st)
+{
+ text_font_begin(st);
+ st->cwidth= BLF_fixed_width();
+ st->cwidth= MAX2(st->cwidth, 1);
+ text_font_end(st);
+}
+
/* Moves the view to the cursor location,
also used to make sure the view isnt outside the file */
void text_update_cursor_moved(SpaceText *st, ARegion *ar)
@@ -1361,6 +1325,8 @@ void text_update_cursor_moved(SpaceText *st, ARegion *ar)
if(!text || !text->curl) return;
+ text_update_character_width(st);
+
i= txt_get_span(text->lines.first, text->sell);
if(st->top+st->viewlines <= i || st->top > i)
st->top= i - st->viewlines/2;
@@ -1372,7 +1338,7 @@ void text_update_cursor_moved(SpaceText *st, ARegion *ar)
x= text_draw(st, text->sell->line, st->left, text->selc, 0, 0, 0, NULL);
if(x==0 || x>ar->winx)
- st->left= text->curc-0.5*(ar->winx)/text_font_width_character(st);
+ st->left= text->curc-0.5*(ar->winx)/st->cwidth;
}
if(st->top < 0) st->top= 0;
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index c761587198f..d0a02f558e1 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -188,10 +188,7 @@ ARegion *text_has_properties_region(ScrArea *sa)
static int properties_poll(bContext *C)
{
- SpaceText *st= CTX_wm_space_text(C);
- Text *text= CTX_data_edit_text(C);
-
- return (st && text);
+ return (CTX_wm_space_text(C) != NULL);
}
static int properties_exec(bContext *C, wmOperator *op)
@@ -199,13 +196,8 @@ static int properties_exec(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= text_has_properties_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
return OPERATOR_FINISHED;
}
@@ -214,6 +206,7 @@ void TEXT_OT_properties(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Properties";
+ ot->description= "Toggle text properties panel.";
ot->idname= "TEXT_OT_properties";
/* api callbacks */
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index 31d29ac7f17..4847f2f0741 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -55,9 +55,10 @@ int text_font_width(struct SpaceText *st, char *str);
void text_update_line_edited(struct Text *text, struct TextLine *line);
void text_update_edited(struct Text *text);
+void text_update_character_width(struct SpaceText *st);
void text_update_cursor_moved(struct SpaceText *st, struct ARegion *ar);
-#define TEXTXLOC 38
+#define TEXTXLOC (st->cwidth * st->linenrs_tot)
#define SUGG_LIST_SIZE 7
#define SUGG_LIST_WIDTH 20
@@ -82,8 +83,6 @@ typedef struct FlattenString {
int flatten_string(struct SpaceText *st, FlattenString *fs, char *in);
void flatten_string_free(FlattenString *fs);
-void unlink_text(struct Text *text);
-
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);
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 95970798e53..8e81336912b 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -177,7 +177,8 @@ void TEXT_OT_new(wmOperatorType *ot)
/* identifiers */
ot->name= "New";
ot->idname= "TEXT_OT_new";
-
+ ot->description= "Create a new text data block.";
+
/* api callbacks */
ot->exec= new_exec;
ot->poll= text_new_poll;
@@ -191,7 +192,7 @@ static int open_exec(bContext *C, wmOperator *op)
Text *text;
char str[FILE_MAX];
- RNA_string_get(op->ptr, "filename", str);
+ RNA_string_get(op->ptr, "path", str);
text= add_text(str, G.sce);
@@ -210,10 +211,10 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
Text *text= CTX_data_edit_text(C);
char *path= (text && text->name)? text->name: G.sce;
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return open_exec(C, op);
- RNA_string_set(op->ptr, "filename", path);
+ RNA_string_set(op->ptr, "path", path);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -224,6 +225,7 @@ void TEXT_OT_open(wmOperatorType *ot)
/* identifiers */
ot->name= "Open";
ot->idname= "TEXT_OT_open";
+ ot->description= "Open a new text data block.";
/* api callbacks */
ot->exec= open_exec;
@@ -231,7 +233,7 @@ void TEXT_OT_open(wmOperatorType *ot)
ot->poll= text_new_poll;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL);
}
/******************* reload operator *********************/
@@ -248,8 +250,6 @@ static int reload_exec(bContext *C, wmOperator *op)
#ifndef DISABLE_PYTHON
if(text->compiled)
BPY_free_compiled_text(text);
-
- text->compiled = NULL;
#endif
text_update_edited(text);
@@ -263,7 +263,8 @@ void TEXT_OT_reload(wmOperatorType *ot)
/* identifiers */
ot->name= "Reload";
ot->idname= "TEXT_OT_reload";
-
+ ot->description= "Reload active text data block from its file.";
+
/* api callbacks */
ot->exec= reload_exec;
ot->invoke= WM_operator_confirm;
@@ -272,55 +273,9 @@ void TEXT_OT_reload(wmOperatorType *ot)
/******************* delete operator *********************/
-static void text_unlink(Main *bmain, Text *text)
-{
- bScreen *scr;
- ScrArea *area;
- SpaceLink *sl;
-
- /* XXX this ifdef is in fact dangerous, if python is
- * disabled it will leave invalid pointers in files! */
-
-#ifndef DISABLE_PYTHON
- // XXX BPY_clear_bad_scriptlinks(text);
- // XXX BPY_free_pyconstraint_links(text);
- // XXX free_text_controllers(text);
- // XXX free_dome_warp_text(text);
-
- /* check if this text was used as script link:
- * this check function unsets the pointers and returns how many
- * script links used this Text */
- if(0) // XXX BPY_text_check_all_scriptlinks (text))
- ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0);
-
- /* equivalently for pynodes: */
- if(0) // XXX nodeDynamicUnlinkText ((ID*)text))
- ; // XXX notifier: allqueue(REDRAWNODE, 0);
-#endif
-
- for(scr= bmain->screen.first; scr; scr= scr->id.next) {
- for(area= scr->areabase.first; area; area= area->next) {
- for(sl= area->spacedata.first; sl; sl= sl->next) {
- if(sl->spacetype==SPACE_TEXT) {
- SpaceText *st= (SpaceText*) sl;
-
- if(st->text==text) {
- st->text= NULL;
- st->top= 0;
-
- if(st==area->spacedata.first)
- ED_area_tag_redraw(area);
- }
- }
- }
- }
- }
-
- free_libblock(&bmain->text, text);
-}
-
static int unlink_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
@@ -336,7 +291,8 @@ static int unlink_exec(bContext *C, wmOperator *op)
}
}
- text_unlink(CTX_data_main(C), text);
+ unlink_text(bmain, text);
+ free_libblock(&bmain->text, text);
WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text);
return OPERATOR_FINISHED;
@@ -347,7 +303,8 @@ void TEXT_OT_unlink(wmOperatorType *ot)
/* identifiers */
ot->name= "Unlink";
ot->idname= "TEXT_OT_unlink";
-
+ ot->description= "Unlink active text data block.";
+
/* api callbacks */
ot->exec= unlink_exec;
ot->invoke= WM_operator_confirm;
@@ -377,6 +334,7 @@ void TEXT_OT_make_internal(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Internal";
ot->idname= "TEXT_OT_make_internal";
+ ot->description= "Make active text file internal.";
/* api callbacks */
ot->exec= make_internal_exec;
@@ -445,6 +403,7 @@ void TEXT_OT_save(wmOperatorType *ot)
/* identifiers */
ot->name= "Save";
ot->idname= "TEXT_OT_save";
+ ot->description= "Save active text data block.";
/* api callbacks */
ot->exec= save_exec;
@@ -461,7 +420,7 @@ static int save_as_exec(bContext *C, wmOperator *op)
if(!text)
return OPERATOR_CANCELLED;
- RNA_string_get(op->ptr, "filename", str);
+ RNA_string_get(op->ptr, "path", str);
if(text->name) MEM_freeN(text->name);
text->name= BLI_strdup(str);
@@ -479,7 +438,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
Text *text= CTX_data_edit_text(C);
char *str;
- if(RNA_property_is_set(op->ptr, "filename"))
+ if(RNA_property_is_set(op->ptr, "path"))
return save_as_exec(C, op);
if(text->name)
@@ -489,7 +448,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
else
str= G.sce;
- RNA_string_set(op->ptr, "filename", str);
+ RNA_string_set(op->ptr, "path", str);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -500,14 +459,15 @@ void TEXT_OT_save_as(wmOperatorType *ot)
/* identifiers */
ot->name= "Save As";
ot->idname= "TEXT_OT_save_as";
-
+ ot->description= "Save active text file with options.";
+
/* api callbacks */
ot->exec= save_as_exec;
ot->invoke= save_as_invoke;
ot->poll= text_edit_poll;
/* properties */
- RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to.");
+ WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE, FILE_SPECIAL);
}
/******************* run script operator *********************/
@@ -537,7 +497,8 @@ void TEXT_OT_run_script(wmOperatorType *ot)
/* identifiers */
ot->name= "Run Script";
ot->idname= "TEXT_OT_run_script";
-
+ ot->description= "Run active script.";
+
/* api callbacks */
ot->exec= run_script_exec;
ot->poll= text_edit_poll;
@@ -550,7 +511,6 @@ static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
{
#ifndef DISABLE_PYTHON
Text *text= CTX_data_edit_text(C);
- Scene *scene= CTX_data_scene(C);
Object *ob;
bConstraint *con;
short update;
@@ -580,7 +540,7 @@ static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
}
if(update) {
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
#endif
@@ -593,7 +553,8 @@ void TEXT_OT_refresh_pyconstraints(wmOperatorType *ot)
/* identifiers */
ot->name= "Refresh PyConstraints";
ot->idname= "TEXT_OT_refresh_pyconstraints";
-
+ ot->description= "Refresh all pyconstraints.";
+
/* api callbacks */
ot->exec= refresh_pyconstraints_exec;
ot->poll= text_edit_poll;
@@ -714,7 +675,8 @@ void TEXT_OT_paste(wmOperatorType *ot)
/* identifiers */
ot->name= "Paste";
ot->idname= "TEXT_OT_paste";
-
+ ot->description= "Paste text from clipboard.";
+
/* api callbacks */
ot->exec= paste_exec;
ot->poll= text_edit_poll;
@@ -754,6 +716,7 @@ void TEXT_OT_copy(wmOperatorType *ot)
/* identifiers */
ot->name= "Copy";
ot->idname= "TEXT_OT_copy";
+ ot->description= "Copy selected text to clipboard.";
/* api callbacks */
ot->exec= copy_exec;
@@ -784,7 +747,8 @@ void TEXT_OT_cut(wmOperatorType *ot)
/* identifiers */
ot->name= "Cut";
ot->idname= "TEXT_OT_cut";
-
+ ot->description= "Cut selected text to clipboard.";
+
/* api callbacks */
ot->exec= cut_exec;
ot->poll= text_edit_poll;
@@ -819,7 +783,8 @@ void TEXT_OT_indent(wmOperatorType *ot)
/* identifiers */
ot->name= "Indent";
ot->idname= "TEXT_OT_indent";
-
+ ot->description= "Indent selected text.";
+
/* api callbacks */
ot->exec= indent_exec;
ot->poll= text_edit_poll;
@@ -854,7 +819,8 @@ void TEXT_OT_unindent(wmOperatorType *ot)
/* identifiers */
ot->name= "Unindent";
ot->idname= "TEXT_OT_unindent";
-
+ ot->description= "Unindent selected text.";
+
/* api callbacks */
ot->exec= unindent_exec;
ot->poll= text_edit_poll;
@@ -894,7 +860,8 @@ void TEXT_OT_line_break(wmOperatorType *ot)
/* identifiers */
ot->name= "Line Break";
ot->idname= "TEXT_OT_line_break";
-
+ ot->description= "Insert line break at cursor position.";
+
/* api callbacks */
ot->exec= line_break_exec;
ot->poll= text_edit_poll;
@@ -926,7 +893,8 @@ void TEXT_OT_comment(wmOperatorType *ot)
/* identifiers */
ot->name= "Comment";
ot->idname= "TEXT_OT_comment";
-
+ ot->description= "Convert selected text to comment.";
+
/* api callbacks */
ot->exec= comment_exec;
ot->poll= text_edit_poll;
@@ -959,7 +927,8 @@ void TEXT_OT_uncomment(wmOperatorType *ot)
/* identifiers */
ot->name= "Uncomment";
ot->idname= "TEXT_OT_uncomment";
-
+ ot->description= "Convert selected comment to text.";
+
/* api callbacks */
ot->exec= uncomment_exec;
ot->poll= text_edit_poll;
@@ -1100,7 +1069,8 @@ void TEXT_OT_convert_whitespace(wmOperatorType *ot)
/* identifiers */
ot->name= "Convert Whitespace";
ot->idname= "TEXT_OT_convert_whitespace";
-
+ ot->description= "Convert whitespaces by type.";
+
/* api callbacks */
ot->exec= convert_whitespace_exec;
ot->poll= text_edit_poll;
@@ -1130,7 +1100,8 @@ void TEXT_OT_select_all(wmOperatorType *ot)
/* identifiers */
ot->name= "Select All";
ot->idname= "TEXT_OT_select_all";
-
+ ot->description= "Select all text.";
+
/* api callbacks */
ot->exec= select_all_exec;
ot->poll= text_edit_poll;
@@ -1157,7 +1128,8 @@ void TEXT_OT_select_line(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Line";
ot->idname= "TEXT_OT_select_line";
-
+ ot->description= "Select text by line.";
+
/* api clinebacks */
ot->exec= select_line_exec;
ot->poll= text_edit_poll;
@@ -1194,7 +1166,8 @@ void TEXT_OT_previous_marker(wmOperatorType *ot)
/* identifiers */
ot->name= "Previous Marker";
ot->idname= "TEXT_OT_previous_marker";
-
+ ot->description= "Move to previous marker.";
+
/* api callbacks */
ot->exec= previous_marker_exec;
ot->poll= text_edit_poll;
@@ -1231,7 +1204,8 @@ void TEXT_OT_next_marker(wmOperatorType *ot)
/* identifiers */
ot->name= "Next Marker";
ot->idname= "TEXT_OT_next_marker";
-
+ ot->description= "Move to next marker";
+
/* api callbacks */
ot->exec= next_marker_exec;
ot->poll= text_edit_poll;
@@ -1258,7 +1232,8 @@ void TEXT_OT_markers_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear All Markers";
ot->idname= "TEXT_OT_markers_clear";
-
+ ot->description= "Clear all markers.";
+
/* api callbacks */
ot->exec= clear_all_markers_exec;
ot->poll= text_edit_poll;
@@ -1289,6 +1264,8 @@ static void wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
Text *text= st->text;
int offl, offc, lin;
+ text_update_character_width(st);
+
lin= txt_get_span(text->lines.first, text->sell);
wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
@@ -1307,6 +1284,8 @@ static void wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
Text *text= st->text;
int offl, offc, lin, startl, c;
+ 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;
@@ -1331,6 +1310,8 @@ static void wrap_move_up(SpaceText *st, ARegion *ar, short sel)
Text *text= st->text;
int offl, offl_1, offc, fromline, toline, c, target;
+ 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);
@@ -1376,6 +1357,8 @@ static void wrap_move_down(SpaceText *st, ARegion *ar, short sel)
Text *text= st->text;
int offl, startoff, offc, fromline, toline, c, target;
+ 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;
@@ -1456,7 +1439,7 @@ static int move_cursor(bContext *C, int type, int select)
ARegion *ar= CTX_wm_region(C);
/* ensure we have the right region, it's optional */
- if(ar->regiontype != RGN_TYPE_WINDOW)
+ if(ar && ar->regiontype != RGN_TYPE_WINDOW)
ar= NULL;
switch(type) {
@@ -1533,6 +1516,7 @@ void TEXT_OT_move(wmOperatorType *ot)
/* identifiers */
ot->name= "Move Cursor";
ot->idname= "TEXT_OT_move";
+ ot->description= "Move cursor to position type.";
/* api callbacks */
ot->exec= move_exec;
@@ -1559,6 +1543,7 @@ void TEXT_OT_move_select(wmOperatorType *ot)
/* identifiers */
ot->name= "Move Select";
ot->idname= "TEXT_OT_move_select";
+ ot->description= "Make selection from current cursor position to new cursor position type.";
/* api callbacks */
ot->exec= move_select_exec;
@@ -1598,7 +1583,8 @@ void TEXT_OT_jump(wmOperatorType *ot)
/* identifiers */
ot->name= "Jump";
ot->idname= "TEXT_OT_jump";
-
+ ot->description= "Jump cursor to line.";
+
/* api callbacks */
ot->exec= jump_exec;
ot->poll= text_edit_poll;
@@ -1650,6 +1636,7 @@ void TEXT_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "Delete";
ot->idname= "TEXT_OT_delete";
+ ot->description= "Delete text by cursor position.";
/* api callbacks */
ot->exec= delete_exec;
@@ -1678,6 +1665,7 @@ void TEXT_OT_overwrite_toggle(wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Overwrite";
ot->idname= "TEXT_OT_overwrite_toggle";
+ ot->description= "Toggle overwrite while typing.";
/* api callbacks */
ot->exec= toggle_overwrite_exec;
@@ -1743,7 +1731,7 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
st->flags|= ST_SCROLL_SELECT;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1754,6 +1742,8 @@ static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
TextScroll *tsc= op->customdata;
short *mval= event->mval;
+ text_update_character_width(st);
+
if(tsc->first) {
tsc->old[0]= mval[0];
tsc->old[1]= mval[1];
@@ -1763,7 +1753,7 @@ static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
}
if(!tsc->scrollbar) {
- tsc->delta[0]= (tsc->hold[0]-mval[0])/text_font_width_character(st);
+ tsc->delta[0]= (tsc->hold[0]-mval[0])/st->cwidth;
tsc->delta[1]= (mval[1]-tsc->hold[1])/st->lheight;
}
else
@@ -1827,7 +1817,11 @@ void TEXT_OT_scroll(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll";
+ /*don't really see the difference between this and
+ scroll_bar. Both do basically the same thing (aside
+ from keymaps).*/
ot->idname= "TEXT_OT_scroll";
+ ot->description= "Scroll text screen.";
/* api callbacks */
ot->exec= scroll_exec;
@@ -1836,6 +1830,9 @@ void TEXT_OT_scroll(wmOperatorType *ot)
ot->cancel= scroll_cancel;
ot->poll= text_space_edit_poll;
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+
/* properties */
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
}
@@ -1863,7 +1860,7 @@ static int scroll_bar_invoke(bContext *C, wmOperator *op, wmEvent *event)
st->flags|= ST_SCROLL_SELECT;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -1872,7 +1869,11 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scrollbar";
+ /*don't really see the difference between this and
+ scroll. Both do basically the same thing (aside
+ from keymaps).*/
ot->idname= "TEXT_OT_scroll_bar";
+ ot->description= "Scroll text screen.";
/* api callbacks */
ot->invoke= scroll_bar_invoke;
@@ -1880,6 +1881,9 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot)
ot->cancel= scroll_cancel;
ot->poll= text_region_edit_poll;
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+
/* properties */
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
}
@@ -1900,6 +1904,8 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
int *charp;
int w;
+ text_update_character_width(st);
+
if(sel) { linep= &text->sell; charp= &text->selc; }
else { linep= &text->curl; charp= &text->curc; }
@@ -1911,7 +1917,7 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
x-= TXT_OFFSET;
if(x<0) x= 0;
- x = (x/text_font_width_character(st)) + st->left;
+ x = (x/st->cwidth) + st->left;
if(st->wordwrap) {
int i, j, endj, curs, max, chop, start, end, chars, loop;
@@ -2109,7 +2115,7 @@ static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
scu->sell= txt_get_span(st->text->lines.first, st->text->sell);
scu->selc= st->text->selc;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
set_cursor_apply(C, op, event);
@@ -2143,6 +2149,7 @@ void TEXT_OT_cursor_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Set Cursor";
ot->idname= "TEXT_OT_cursor_set";
+ ot->description= "Set cursor selection.";
/* api callbacks */
ot->invoke= set_cursor_invoke;
@@ -2151,7 +2158,7 @@ void TEXT_OT_cursor_set(wmOperatorType *ot)
ot->poll= text_region_edit_poll;
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING;
/* properties */
RNA_def_boolean(ot->srna, "select", 0, "Select", "Set selection end rather than cursor.");
@@ -2198,6 +2205,7 @@ void TEXT_OT_line_number(wmOperatorType *ot)
/* identifiers */
ot->name= "Line Number";
ot->idname= "TEXT_OT_line_number";
+ ot->description= "The current line number.";
/* api callbacks */
ot->invoke= line_number_invoke;
@@ -2211,19 +2219,21 @@ static int insert_exec(bContext *C, wmOperator *op)
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
char *str;
- int done, ascii;
+ int done = 0, i;
str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
- ascii= str[0];
- MEM_freeN(str);
- if(!ascii)
- return OPERATOR_CANCELLED;
+ if(st && st->overwrite) {
+ for(i=0; str[i]; i++) {
+ done |= txt_replace_char(text, str[i]);
+ }
+ } else {
+ for(i=0; str[i]; i++) {
+ done |= txt_add_char(text, str[i]);
+ }
+ }
- if(st && st->overwrite)
- done= txt_replace_char(text, ascii);
- else
- done= txt_add_char(text, ascii);
+ MEM_freeN(str);
if(!done)
return OPERATOR_CANCELLED;
@@ -2255,7 +2265,7 @@ static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* run the script while editing, evil but useful */
if(ret==OPERATOR_FINISHED && CTX_wm_space_text(C)->live_edit)
run_script_exec(C, op);
-
+
return ret;
}
@@ -2264,6 +2274,7 @@ void TEXT_OT_insert(wmOperatorType *ot)
/* identifiers */
ot->name= "Insert";
ot->idname= "TEXT_OT_insert";
+ ot->description= "Insert text at cursor position.";
/* api callbacks */
ot->exec= insert_exec;
@@ -2368,7 +2379,8 @@ void TEXT_OT_find(wmOperatorType *ot)
/* identifiers */
ot->name= "Find";
ot->idname= "TEXT_OT_find";
-
+ ot->description= "Find specified text.";
+
/* api callbacks */
ot->exec= find_exec;
ot->poll= text_space_edit_poll;
@@ -2386,6 +2398,7 @@ void TEXT_OT_replace(wmOperatorType *ot)
/* identifiers */
ot->name= "Replace";
ot->idname= "TEXT_OT_replace";
+ ot->description= "Replace text with the specified text.";
/* api callbacks */
ot->exec= replace_exec;
@@ -2404,7 +2417,8 @@ void TEXT_OT_mark_all(wmOperatorType *ot)
/* identifiers */
ot->name= "Mark All";
ot->idname= "TEXT_OT_mark_all";
-
+ ot->description= "Mark all specified text.";
+
/* api callbacks */
ot->exec= mark_all_exec;
ot->poll= text_space_edit_poll;
@@ -2433,7 +2447,8 @@ void TEXT_OT_find_set_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Find Set Selected";
ot->idname= "TEXT_OT_find_set_selected";
-
+ ot->description= "Find specified text and set as selected.";
+
/* api callbacks */
ot->exec= find_set_selected_exec;
ot->poll= text_space_edit_poll;
@@ -2459,7 +2474,8 @@ void TEXT_OT_replace_set_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Replace Set Selected";
ot->idname= "TEXT_OT_replace_set_selected";
-
+ ot->description= "Replace text with specified text and set as selected.";
+
/* api callbacks */
ot->exec= replace_set_selected_exec;
ot->poll= text_space_edit_poll;
@@ -2621,6 +2637,7 @@ void TEXT_OT_to_3d_object(wmOperatorType *ot)
/* identifiers */
ot->name= "To 3D Object";
ot->idname= "TEXT_OT_to_3d_object";
+ ot->description= "Create 3d text object from active text data block.";
/* api callbacks */
ot->exec= to_3d_object_exec;
diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c
index 4fa54cdf27b..4400747a731 100644
--- a/source/blender/editors/space_text/text_python.c
+++ b/source/blender/editors/space_text/text_python.c
@@ -66,16 +66,18 @@ int text_do_suggest_select(SpaceText *st, ARegion *ar)
/* Count the visible lines to the cursor */
for(tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
if(l<0) return 0;
+
+ text_update_character_width(st);
if(st->showlinenrs) {
- x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
+ x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET + TEXTXLOC - 4;
}
else {
- x = text_font_width_character(st)*(st->text->curc-st->left) + TXT_OFFSET - 4;
+ x = st->cwidth*(st->text->curc-st->left) + TXT_OFFSET - 4;
}
y = ar->winy - st->lheight*l - 2;
- w = SUGG_LIST_WIDTH*text_font_width_character(st) + 20;
+ w = SUGG_LIST_WIDTH*st->cwidth + 20;
h = SUGG_LIST_SIZE*st->lheight + 8;
// XXX getmouseco_areawin(mval);
@@ -351,7 +353,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
}
if(draw)
- ; // XXX redraw_alltext();
+ {}; // XXX redraw_alltext();
return swallow;
}
@@ -534,7 +536,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
}
if(draw)
- ; // XXX redraw_alltext();
+ {}; // XXX redraw_alltext();
return swallow;
}
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index c4ca4d8522f..0f05eb0149d 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <stdio.h>
+#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -37,11 +38,14 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_dlrbTree.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_screen.h"
+#include "BKE_utildefines.h"
+#include "ED_keyframes_draw.h"
#include "ED_space_api.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -106,23 +110,111 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar
fdrawline((float)PEFRA, v2d->cur.ymin, (float)PEFRA, v2d->cur.ymax);
}
+/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */
+static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe)
+{
+ ActKeyColumn *akn= NULL;
+
+ /* sanity checks */
+ if (ak == NULL)
+ return NULL;
+
+ /* check if this is a match, or whether it is in some subtree */
+ if (cframe < ak->cfra)
+ akn= time_cfra_find_ak(ak->left, cframe);
+ else if (cframe > ak->cfra)
+ akn= time_cfra_find_ak(ak->right, cframe);
+
+ /* if no match found (or found match), just use the current one */
+ if (akn == NULL)
+ return ak;
+ else
+ return akn;
+}
+
+/* helper for time_draw_keyframes() */
+static void time_draw_idblock_keyframes(View2D *v2d, ID *id)
+{
+ DLRBT_Tree keys;
+ ActKeyColumn *ak;
+
+ /* init binarytree-list for getting keyframes */
+ BLI_dlrbTree_init(&keys);
+
+ /* populate tree with keyframe nodes */
+ switch (GS(id->name)) {
+ case ID_SCE:
+ scene_to_keylist(NULL, (Scene *)id, &keys, NULL);
+ break;
+ case ID_OB:
+ ob_to_keylist(NULL, (Object *)id, &keys, NULL);
+ break;
+ }
+
+ /* build linked-list for searching */
+ BLI_dlrbTree_linkedlist_sync(&keys);
+
+ /* start drawing keyframes
+ * - we use the binary-search capabilities of the tree to only start from
+ * the first visible keyframe (last one can then be easily checked)
+ * - draw within a single GL block to be faster
+ */
+ glBegin(GL_LINES);
+ for ( ak=time_cfra_find_ak(keys.root, v2d->cur.xmin);
+ (ak) && (ak->cfra <= v2d->cur.xmax);
+ ak=ak->next )
+ {
+ glVertex2f(ak->cfra, v2d->cur.ymin);
+ glVertex2f(ak->cfra, v2d->cur.ymax);
+ }
+ glEnd(); // GL_LINES
+
+ /* free temp stuff */
+ BLI_dlrbTree_free(&keys);
+}
+
+/* draw keyframe lines for timeline */
+static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+ View2D *v2d= &ar->v2d;
+
+ /* draw scene keyframes first
+ * - only if we're not only showing the
+ */
+ if ((scene) && (stime->flag & TIME_ONLYACTSEL)==0) {
+ /* set draw color */
+ glColor3ub(0xDD, 0xA7, 0x00);
+ time_draw_idblock_keyframes(v2d, (ID *)scene);
+ }
+
+ /* draw active object's keyframes */
+ if (ob) {
+ /* set draw color */
+ glColor3ub(0xDD, 0xD7, 0x00);
+ time_draw_idblock_keyframes(v2d, (ID *)ob);
+ }
+}
+
+/* ---------------- */
+
/* add handlers, stuff you only do once or on area/region changes */
static void time_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
/* own keymap */
- keymap= WM_keymap_listbase(wm, "TimeLine", SPACE_TIME, 0); /* XXX weak? */
+ keymap= WM_keymap_find(wm, "TimeLine", SPACE_TIME, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
-
static void time_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
+ SpaceTime *stime= CTX_wm_space_time(C);
View2D *v2d= &ar->v2d;
View2DGrid *grid;
View2DScrollers *scrollers;
@@ -144,7 +236,10 @@ static void time_main_area_draw(const bContext *C, ARegion *ar)
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));
UI_view2d_grid_free(grid);
-
+
+ /* keyframes */
+ time_draw_keyframes(C, stime, ar);
+
/* current frame */
time_draw_cfra_time(C, stime, ar);
@@ -165,11 +260,20 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_TIME)
+ ED_region_tag_redraw(ar);
+ break;
+
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
case NC_SCENE:
/* any scene change for now */
ED_region_tag_redraw(ar);
break;
+
}
}
@@ -178,29 +282,12 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* add handlers, stuff you only do once or on area/region changes */
static void time_header_area_init(wmWindowManager *wm, ARegion *ar)
{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+ ED_region_header_init(ar);
}
static void time_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- time_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ ED_region_header(C, ar);
}
static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
@@ -211,6 +298,7 @@ static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
if(wmn->data==ND_ANIMPLAY)
ED_region_tag_redraw(ar);
break;
+
case NC_SCENE:
switch (wmn->data) {
case ND_FRAME:
@@ -218,6 +306,11 @@ static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
}
+
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_TIME)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -277,8 +370,6 @@ static SpaceLink *time_new(const bContext *C)
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 */
@@ -327,7 +418,7 @@ void ED_spacetype_time(void)
art= MEM_callocN(sizeof(ARegionType), "spacetype time region");
art->regionid = RGN_TYPE_HEADER;
art->minsizey= HEADERY;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES;
art->init= time_header_area_init;
art->draw= time_header_area_draw;
diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c
deleted file mode 100644
index 29f31671670..00000000000
--- a/source/blender/editors/space_time/time_header.c
+++ /dev/null
@@ -1,612 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <stdio.h>
-
-#include "DNA_space_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_windowmanager_types.h"
-#include "DNA_userdef_types.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_screen.h"
-
-#include "ED_keyframing.h"
-#include "ED_screen.h"
-#include "ED_screen_types.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "ED_markers.h"
-
-#include "time_intern.h"
-
-
-/* ************************ header time area region *********************** */
-
-static ARegion *time_top_left_3dwindow(bScreen *screen)
-{
- ARegion *aret= NULL;
- ScrArea *sa;
- int min= 10000;
-
- for(sa= screen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_VIEW3D) {
- ARegion *ar;
- for(ar= sa->regionbase.first; ar; ar= ar->next) {
- if(ar->regiontype==RGN_TYPE_WINDOW) {
- if(ar->winrct.xmin - ar->winrct.ymin < min) {
- aret= ar;
- min= ar->winrct.xmin - ar->winrct.ymin;
- }
- }
- }
- }
- }
- return aret;
-}
-
-static void do_time_redrawmenu(bContext *C, void *arg, int event)
-{
-
- if(event < 1001) {
- bScreen *screen= CTX_wm_screen(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
-
- stime->redraws ^= event;
-
- if(screen->animtimer) {
- wmTimer *wt= screen->animtimer;
- ScreenAnimData *sad= wt->customdata;
-
- sad->redraws= stime->redraws;
- sad->ar= NULL;
- if(stime->redraws & TIME_REGION)
- sad->ar= time_top_left_3dwindow(screen);
- }
- }
- else {
- if(event==1001) {
-// button(&CTX_data_scene(C)->r.frs_sec,1,120,"FPS:");
- }
- }
-}
-
-
-static uiBlock *time_redrawmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
- uiBlock *block;
- short yco= 0, menuwidth=120, icon;
- char str[32];
-
- block= uiBeginBlock(C, ar, "header time_redrawmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_time_redrawmenu, NULL);
-
- if(stime->redraws & TIME_REGION) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Top-Left 3D Window", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_REGION, "");
-
- if(stime->redraws & TIME_ALL_3D_WIN) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "All 3D Windows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_ALL_3D_WIN, "");
-
- if(stime->redraws & TIME_ALL_ANIM_WIN) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Animation Windows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_ALL_ANIM_WIN, "");
-
- if(stime->redraws & TIME_ALL_BUTS_WIN) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Buttons Windows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_ALL_BUTS_WIN, "");
-
- if(stime->redraws & TIME_ALL_IMAGE_WIN) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Image Windows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_ALL_IMAGE_WIN, "");
-
- /* Add sequencer only redraw*/
- if(stime->redraws & TIME_SEQ) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Sequencer Windows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_SEQ, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- sprintf(str, "Set Frames/Sec (%d/%f)", scene->r.frs_sec, scene->r.frs_sec_base);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1001, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(stime->redraws & TIME_CONTINUE_PHYSICS) icon= ICON_CHECKBOX_HLT;
- else icon= ICON_CHECKBOX_DEHLT;
- uiDefIconTextBut(block, BUTM, 1, icon, "Continue Physics", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_CONTINUE_PHYSICS, "During playblack, continue physics simulations regardless of the frame number");
-
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_time_viewmenu(bContext *C, void *arg, int event)
-{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
- View2D *v2d= UI_view2d_fromcontext_rwin(C);
- Scene *scene= CTX_data_scene(C);
- int first;
-
- switch(event) {
- case 2: /* Play Back Animation */
- //if(!has_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM))
- // start_animated_screen(stime);
- break;
- case 3: /* View All */
- if(v2d) {
- first= scene->r.sfra;
- if(first >= scene->r.efra) first= scene->r.efra;
- v2d->cur.xmin=v2d->tot.xmin= (float)first-2;
- v2d->cur.xmax=v2d->tot.xmax= (float)scene->r.efra+2;
-
- ED_area_tag_redraw(curarea);
- }
- break;
- case 4: /* Maximize Window */
- /* using event B_FULL */
- break;
- case 5: /* show time or frames */
- stime->flag ^= TIME_DRAWFRAMES;
- ED_area_tag_redraw(curarea);
- break;
- case 6:
- //nextprev_marker(1);
- break;
- case 7:
- //nextprev_marker(-1);
- break;
- case 8:
- //nextprev_timeline_key(1);
- break;
- case 9:
- //nextprev_timeline_key(-1);
- break;
- case 10:
- //timeline_frame_to_center();
- break;
- case 11:
- if(v2d) {
- v2d->flag ^= V2D_VIEWSYNC_SCREEN_TIME;
- UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_SET);
- }
- break;
- case 12: /* only show keyframes from selected data */
- stime->flag ^= TIME_ONLYACTSEL;
- ED_area_tag_redraw(curarea);
- break;
- }
-}
-
-static uiBlock *time_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
- View2D *v2d= UI_view2d_fromcontext_rwin(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "time_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_time_viewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(stime->flag & TIME_DRAWFRAMES)
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- else
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefIconTextBut(block, BUTM, 1, (stime->flag & TIME_ONLYACTSEL)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Only Selected Data Keys|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Next Marker|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Prev Marker|PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Next Key|Ctrl PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Prev Key|Ctrl PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, (v2d->flag & V2D_VIEWSYNC_SCREEN_TIME)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
- "Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
-
-// if (!curarea->full)
-// uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-// else
-// uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_time_framemenu(bContext *C, void *arg, int event)
-{
- Scene *scene= CTX_data_scene(C);
-
- switch(event) {
- case 1: /*Set as Start */
- if (scene->r.psfra) {
- if (scene->r.pefra < scene->r.cfra)
- scene->r.pefra= scene->r.cfra;
- scene->r.psfra= scene->r.cfra;
- }
- else
- scene->r.sfra = scene->r.cfra;
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- break;
- case 2: /* Set as End */
- if (scene->r.psfra) {
- if (scene->r.cfra < scene->r.psfra)
- scene->r.psfra= scene->r.cfra;
- scene->r.pefra= scene->r.cfra;
- }
- else
- scene->r.efra = scene->r.cfra;
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- break;
- case 3: /* Rename Marker */
- //rename_marker();
- break;
- }
-}
-
-static uiBlock *time_framemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "time_framemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_time_framemenu, NULL);
-
- uiDefIconTextButO(block, BUTM, "MARKER_OT_add", WM_OP_EXEC_REGION_WIN, ICON_BLANK1, "Add Marker",
- 0, yco-=2, menuwidth, 19, "");
- uiDefIconTextButO(block, BUTM, "MARKER_OT_duplicate", WM_OP_EXEC_REGION_WIN, ICON_BLANK1, "Duplicate Marker",
- 0, yco-=20, menuwidth, 19, "");
- uiDefIconTextButO(block, BUTM, "MARKER_OT_delete", WM_OP_EXEC_REGION_WIN, ICON_BLANK1, "Delete Marker",
- 0, yco-=20, menuwidth, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Name Marker|Ctrl M",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextButO(block, BUTM, "MARKER_OT_move", WM_OP_INVOKE_REGION_WIN, ICON_BLANK1, "Grab/Move Marker",
- 0, yco-=20, menuwidth, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set as Start|S",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set as End|E",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-
-#define B_REDRAWALL 750
-#define B_TL_REW 751
-#define B_TL_PLAY 752
-#define B_TL_FF 753
-#define B_TL_PREVKEY 754
-#define B_TL_NEXTKEY 755
-#define B_TL_STOP 756
-#define B_TL_PREVIEWON 757
-#define B_TL_INSERTKEY 758
-#define B_TL_DELETEKEY 759
-
-#define B_FLIPINFOMENU 0
-#define B_NEWFRAME 0
-#define B_DIFF 0
-
-
-void do_time_buttons(bContext *C, void *arg, int event)
-{
- bScreen *screen= CTX_wm_screen(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
-
- switch(event) {
- case B_REDRAWALL:
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- break;
- case B_NEWFRAME:
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
- break;
- case B_TL_REW:
- scene->r.cfra= PSFRA;
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
- //update_for_newframe();
- break;
- case B_TL_PLAY:
- ED_screen_animation_timer(C, stime->redraws, 1);
-
- /* update region if TIME_REGION was set, to leftmost 3d window */
- if(screen->animtimer && (stime->redraws & TIME_REGION)) {
- wmTimer *wt= screen->animtimer;
- ScreenAnimData *sad= wt->customdata;
-
- sad->ar= time_top_left_3dwindow(screen);
- }
-
- break;
- case B_TL_STOP:
- ED_screen_animation_timer(C, 0, 0);
- break;
- case B_TL_FF:
- /* end frame */
- scene->r.cfra= PEFRA;
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
- //update_for_newframe();
- break;
- case B_TL_PREVKEY:
- /* previous keyframe */
- //nextprev_timeline_key(-1);
- break;
- case B_TL_NEXTKEY:
- /* next keyframe */
- //nextprev_timeline_key(1);
- break;
-
- case B_TL_PREVIEWON:
- if (scene->r.psfra) {
- /* turn on preview range */
- scene->r.psfra= scene->r.sfra;
- scene->r.pefra= scene->r.efra;
- }
- else {
- /* turn off preview range */
- scene->r.psfra= 0;
- scene->r.pefra= 0;
- }
- //BIF_undo_push("Set anim-preview range");
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- break;
-
- case B_TL_INSERTKEY:
- /* insert keyframe */
- //common_insertkey();
- //allqueue(REDRAWTIME, 1);
- break;
- case B_TL_DELETEKEY:
- /* delete keyframe */
- //common_deletekey();
- //allqueue(REDRAWTIME, 1);
- break;
- }
-}
-
-
-void time_header_buttons(const bContext *C, ARegion *ar)
-{
- ScrArea *sa= CTX_wm_area(C);
- SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
- Scene *scene= CTX_data_scene(C);
- uiBlock *block;
- int xco, yco= 3;
- char *menustr= NULL;
-
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_time_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, time_viewmenu, sa,
- "View", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- xmax= GetButStringLength("Frame");
- uiDefPulldownBut(block, time_framemenu, sa,
- "Frame", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
- xmax= GetButStringLength("Playback");
- uiDefPulldownBut(block, time_redrawmenu, sa,
- "Playback", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- uiBlockBeginAlign(block);
-
- uiDefButI(block, TOG, B_TL_PREVIEWON,"PR",
- xco,yco, XIC*2, YIC,
- &scene->r.psfra,0, 1, 0, 0,
- "Show settings for frame range of animation preview");
-
- xco += XIC*2;
-
- if (scene->r.psfra) {
- uiDefButI(block, NUM, B_REDRAWALL,"Start:",
- xco,yco, (int)4.5*XIC, YIC,
- &scene->r.psfra,MINFRAMEF, MAXFRAMEF, 0, 0,
- "The start frame of the animation preview (inclusive)");
-
- xco += (int)(4.5*XIC);
-
- uiDefButI(block, NUM, B_REDRAWALL,"End:",
- xco,yco, (int)4.5*XIC,YIC,
- &scene->r.pefra,(float)PSFRA, MAXFRAMEF, 0, 0,
- "The end frame of the animation preview (inclusive)");
- }
- else {
- uiDefButI(block, NUM, B_REDRAWALL,"Start:",
- xco,yco, (int)4.5*XIC, YIC,
- &scene->r.sfra,MINFRAMEF, MAXFRAMEF, 0, 0,
- "The start frame of the animation (inclusive)");
-
- xco += (short)(4.5*XIC);
-
- uiDefButI(block, NUM, B_REDRAWALL,"End:",
- xco,yco, (int)4.5*XIC,YIC,
- &scene->r.efra,(float)SFRA, MAXFRAMEF, 0, 0,
- "The end frame of the animation (inclusive)");
- }
- uiBlockEndAlign(block);
-
- xco += (short)(4.5 * XIC + 16);
-
- uiDefButI(block, NUM, B_NEWFRAME, "",
- xco,yco, (int)3.5*XIC,YIC,
- &(scene->r.cfra), MINFRAMEF, MAXFRAMEF, 0, 0,
- "Displays Current Frame of animation");
-
- xco += (short)(3.5 * XIC + 16);
-
- uiDefIconBut(block, BUT, B_TL_REW, ICON_REW,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to Start frame (Shift DownArrow)");
- xco+= XIC+4;
- uiDefIconBut(block, BUT, B_TL_PREVKEY, ICON_PREV_KEYFRAME,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to previous keyframe (Ctrl PageDown)");
- xco+= XIC+4;
-
- if(CTX_wm_screen(C)->animtimer)
- uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
- else
- uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline ");
-
- xco+= XIC+4;
- uiDefIconBut(block, BUT, B_TL_NEXTKEY, ICON_NEXT_KEYFRAME,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to next keyframe (Ctrl PageUp)");
- xco+= XIC+4;
- uiDefIconBut(block, BUT, B_TL_FF, ICON_FF,
- xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to End frame (Shift UpArrow)");
- xco+= XIC+8;
-
- uiBlockBeginAlign(block);
- uiDefIconButBitS(block, TOG, AUTOKEY_ON, B_REDRAWALL, ICON_REC,
- xco, yco, XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones");
- xco+= XIC;
- if (IS_AUTOKEY_ON(scene)) {
- uiDefButS(block, MENU, B_REDRAWALL,
- "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5",
- xco, yco, (int)5.5*XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 1, 0, 0,
- "Mode of automatic keyframe insertion for Objects and Bones");
- xco+= (6*XIC);
- }
- uiBlockEndAlign(block);
-
- xco+= 16;
-
-
- menustr= ANIM_build_keyingsets_menu(&scene->keyingsets, 0);
- uiDefButI(block, MENU, B_DIFF,
- menustr,
- xco, yco, (int)5.5*XIC, YIC, &(scene->active_keyingset), 0, 1, 0, 0,
- "Active Keying Set (i.e. set of channels to Insert Keyframes for)");
- MEM_freeN(menustr);
- xco+= (6*XIC);
-
- uiBlockBeginAlign(block);
- uiDefIconButO(block, BUT, "ANIM_OT_delete_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_DEHLT, xco,yco,XIC,YIC, "Delete Keyframes for the Active Keying Set (Alt-I)");
- xco += XIC;
- uiDefIconButO(block, BUT, "ANIM_OT_insert_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_HLT, xco,yco,XIC,YIC, "Insert Keyframes for the Active Keying Set (I)");
- xco += XIC;
- uiBlockEndAlign(block);
-
- xco+= 16;
-
- uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER,
- xco, yco, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor");
-
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, (int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin));
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index b47afaf0cde..2b073f269bf 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -84,6 +84,7 @@ void TIME_OT_start_frame_set (wmOperatorType *ot)
/* identifiers */
ot->name= "Set Start Frame";
ot->idname= "TIME_OT_start_frame_set";
+ ot->description="Set the start frame.";
/* api callbacks */
ot->exec= time_set_sfra_exec;
@@ -122,6 +123,7 @@ void TIME_OT_end_frame_set (wmOperatorType *ot)
/* identifiers */
ot->name= "Set End Frame";
ot->idname= "TIME_OT_end_frame_set";
+ ot->description="Set the end frame.";
/* api callbacks */
ot->exec= time_set_efra_exec;
@@ -140,7 +142,7 @@ void time_operatortypes(void)
void time_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "TimeLine", SPACE_TIME, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "TimeLine", SPACE_TIME, 0);
WM_keymap_add_item(keymap, "TIME_OT_start_frame_set", SKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TIME_OT_end_frame_set", EKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_userpref/Makefile b/source/blender/editors/space_userpref/Makefile
new file mode 100644
index 00000000000..be7206f51ce
--- /dev/null
+++ b/source/blender/editors/space_userpref/Makefile
@@ -0,0 +1,55 @@
+#
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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/SConscript b/source/blender/editors/space_userpref/SConscript
new file mode 100644
index 00000000000..1b808a5a7c0
--- /dev/null
+++ b/source/blender/editors/space_userpref/SConscript
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('*.c')
+
+incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf ../../blenfont'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+
+defs = []
+
+if env['WITH_BF_GAMEENGINE']:
+ defs.append('GAMEBLENDER=1')
+
+env.BlenderLib ( 'bf_editors_space_userpref', sources, Split(incs), defs, libtype=['core'], priority=[70] )
diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c
new file mode 100644
index 00000000000..8c9d723ce2c
--- /dev/null
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -0,0 +1,188 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "DNA_space_types.h"
+#include "DNA_screen_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+
+#include "BKE_context.h"
+#include "BKE_screen.h"
+
+#include "ED_space_api.h"
+#include "ED_screen.h"
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "userpref_intern.h" // own include
+
+/* ******************** default callbacks for userpref space ***************** */
+
+static SpaceLink *userpref_new(const bContext *C)
+{
+ ARegion *ar;
+ SpaceUserPref *spref;
+
+ spref= MEM_callocN(sizeof(SpaceUserPref), "inituserpref");
+ spref->spacetype= SPACE_USERPREF;
+
+ /* header */
+ ar= MEM_callocN(sizeof(ARegion), "header for userpref");
+
+ BLI_addtail(&spref->regionbase, ar);
+ ar->regiontype= RGN_TYPE_HEADER;
+ ar->alignment= RGN_ALIGN_BOTTOM;
+
+ /* main area */
+ ar= MEM_callocN(sizeof(ARegion), "main area for userpref");
+
+ BLI_addtail(&spref->regionbase, ar);
+ ar->regiontype= RGN_TYPE_WINDOW;
+
+ return (SpaceLink *)spref;
+}
+
+/* not spacelink itself */
+static void userpref_free(SpaceLink *sl)
+{
+// SpaceUserPref *spref= (SpaceUserPref*) sl;
+
+}
+
+
+/* spacetype; init callback */
+static void userpref_init(struct wmWindowManager *wm, ScrArea *sa)
+{
+
+}
+
+static SpaceLink *userpref_duplicate(SpaceLink *sl)
+{
+ SpaceUserPref *sprefn= MEM_dupallocN(sl);
+
+ /* clear or remove stuff from old */
+
+ return (SpaceLink *)sprefn;
+}
+
+
+
+/* add handlers, stuff you only do once or on area/region changes */
+static void userpref_main_area_init(wmWindowManager *wm, ARegion *ar)
+{
+ ED_region_panels_init(wm, ar);
+}
+
+static void userpref_main_area_draw(const bContext *C, ARegion *ar)
+{
+ ED_region_panels(C, ar, 1, NULL, -1);
+}
+
+void userpref_operatortypes(void)
+{
+}
+
+void userpref_keymap(struct wmWindowManager *wm)
+{
+
+}
+
+/* add handlers, stuff you only do once or on area/region changes */
+static void userpref_header_area_init(wmWindowManager *wm, ARegion *ar)
+{
+ ED_region_header_init(ar);
+}
+
+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)
+{
+ /* context changes */
+}
+
+static void userpref_header_listener(ARegion *ar, wmNotifier *wmn)
+{
+ /* context changes */
+ switch(wmn->category) {
+ default:
+ break;
+ }
+
+}
+
+/* only called once, from space/spacetypes.c */
+void ED_spacetype_userpref(void)
+{
+ SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype userpref");
+ ARegionType *art;
+
+ st->spaceid= SPACE_USERPREF;
+
+ st->new= userpref_new;
+ st->free= userpref_free;
+ st->init= userpref_init;
+ st->duplicate= userpref_duplicate;
+ st->operatortypes= userpref_operatortypes;
+ st->keymap= userpref_keymap;
+
+ /* regions: main window */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype userpref region");
+ art->regionid = RGN_TYPE_WINDOW;
+ art->init= userpref_main_area_init;
+ art->draw= userpref_main_area_draw;
+ art->listener= userpref_main_area_listener;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+
+ BLI_addhead(&st->regiontypes, art);
+
+ /* regions: header */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype userpref region");
+ art->regionid = RGN_TYPE_HEADER;
+ art->minsizey= HEADERY;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+ art->listener= userpref_header_listener;
+ art->init= userpref_header_area_init;
+ art->draw= userpref_header_area_draw;
+
+ BLI_addhead(&st->regiontypes, art);
+
+
+ BKE_spacetype_register(st);
+}
+
diff --git a/source/blender/editors/space_userpref/userpref_intern.h b/source/blender/editors/space_userpref/userpref_intern.h
new file mode 100644
index 00000000000..596c2675b01
--- /dev/null
+++ b/source/blender/editors/space_userpref/userpref_intern.h
@@ -0,0 +1,34 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef ED_USERPREF_INTERN_H
+#define ED_USERPREF_INTERN_H
+
+/* internal exports only */
+
+#endif /* ED_USERPREF_INTERN_H */
+
diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c
new file mode 100644
index 00000000000..91a6651bd92
--- /dev/null
+++ b/source/blender/editors/space_userpref/userpref_ops.c
@@ -0,0 +1,33 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2008 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "userpref_intern.h"
+
diff --git a/source/blender/editors/space_view3d/Makefile b/source/blender/editors/space_view3d/Makefile
index 5e6f8a6c426..9204f2482c6 100644
--- a/source/blender/editors/space_view3d/Makefile
+++ b/source/blender/editors/space_view3d/Makefile
@@ -52,7 +52,10 @@ 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 7d51d237ef0..057c98a1d49 100644
--- a/source/blender/editors/space_view3d/SConscript
+++ b/source/blender/editors/space_view3d/SConscript
@@ -8,6 +8,8 @@ incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../render/extern/include #/intern/guardedalloc'
incs += ' ../../gpu ../../makesrna ../../blenfont'
+incs += ' #/intern/smoke/extern'
+incs += ' #source/kernel/gen_system'
if env['WITH_BF_GAMEENGINE']:
defs.append('GAMEBLENDER=1')
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index 68a9bf3f555..028d666dc71 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -37,6 +37,7 @@
#include "MEM_guardedalloc.h"
+#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
@@ -51,7 +52,9 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_dlrbTree.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
@@ -61,6 +64,7 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
@@ -635,7 +639,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
/* figure out the sizes of spheres */
if (ebone) {
- /* this routine doesn't call set_matrix_editbone() that calculates it */
+ /* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = VecLenf(ebone->head, ebone->tail);
length= ebone->length;
@@ -745,7 +749,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
/* figure out the sizes of spheres */
if (ebone) {
- /* this routine doesn't call set_matrix_editbone() that calculates it */
+ /* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = VecLenf(ebone->head, ebone->tail);
length= ebone->length;
@@ -1512,15 +1516,25 @@ static void draw_pose_dofs(Object *ob)
}
}
+static void bone_matrix_translate_y(float mat[][4], float y)
+{
+ float trans[3];
+
+ VECCOPY(trans, mat[1]);
+ VecMulf(trans, y);
+ VecAddf(mat[3], mat[3], trans);
+}
+
/* assumes object is Armature with pose */
-static void draw_pose_channels(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
+static void draw_pose_channels(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt)
{
+ RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
bArmature *arm= ob->data;
bPoseChannel *pchan;
Bone *bone;
GLfloat tmp;
- float smat[4][4], imat[4][4];
+ float smat[4][4], imat[4][4], bmat[4][4];
int index= -1;
short do_dashed= 3, draw_wire= 0;
short flag, constflag;
@@ -1805,15 +1819,21 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ba
/* Draw names of bone */
if (arm->flag & ARM_DRAWNAMES) {
VecMidf(vec, pchan->pose_head, pchan->pose_tail);
- view3d_object_text_draw_add(vec[0], vec[1], vec[2], pchan->name, 10);
+ view3d_cached_text_draw_add(vec[0], vec[1], vec[2], pchan->name, 10);
}
/* Draw additional axes on the bone tail */
if ( (arm->flag & ARM_DRAWAXES) && (arm->flag & ARM_POSEMODE) ) {
glPushMatrix();
- glMultMatrixf(pchan->pose_mat);
- glTranslatef(0.0f, pchan->bone->length, 0.0f);
- drawaxes(0.25f*pchan->bone->length, 0, OB_ARROWS);
+ Mat4CpyMat4(bmat, pchan->pose_mat);
+ bone_matrix_translate_y(bmat, pchan->bone->length);
+ glMultMatrixf(bmat);
+
+ /* do cached text draw immediate to include transform */
+ view3d_cached_text_draw_begin();
+ drawaxes(pchan->bone->length*0.25f, 0, OB_ARROWS);
+ view3d_cached_text_draw_end(v3d, ar, 1, bmat);
+
glPopMatrix();
}
}
@@ -1826,32 +1846,28 @@ static void draw_pose_channels(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ba
}
/* in editmode, we don't store the bone matrix... */
-static void set_matrix_editbone(EditBone *eBone)
+static void get_matrix_editbone(EditBone *eBone, float bmat[][4])
{
- float delta[3],offset[3];
- float mat[3][3], bmat[4][4];
+ float delta[3];
+ float mat[3][3];
/* Compose the parent transforms (i.e. their translations) */
- VECCOPY(offset, eBone->head);
-
- glTranslatef(offset[0],offset[1],offset[2]);
-
VecSubf(delta, eBone->tail, eBone->head);
eBone->length = (float)sqrt(delta[0]*delta[0] + delta[1]*delta[1] +delta[2]*delta[2]);
vec_roll_to_mat3(delta, eBone->roll, mat);
Mat4CpyMat3(bmat, mat);
-
- glMultMatrixf(bmat);
-
+
+ VecAddf(bmat[3], bmat[3], eBone->head);
}
-static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
+static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
{
+ RegionView3D *rv3d= ar->regiondata;
EditBone *eBone;
bArmature *arm= ob->data;
- float smat[4][4], imat[4][4];
+ float smat[4][4], imat[4][4], bmat[4][4];
unsigned int index;
int flag;
@@ -1889,7 +1905,8 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
if (eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
glPushMatrix();
- set_matrix_editbone(eBone);
+ get_matrix_editbone(eBone, bmat);
+ glMultMatrixf(bmat);
/* catch exception for bone with hidden parent */
flag= eBone->flag;
@@ -1937,7 +1954,8 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
}
else {
glPushMatrix();
- set_matrix_editbone(eBone);
+ get_matrix_editbone(eBone, bmat);
+ glMultMatrixf(bmat);
if (arm->drawtype == ARM_LINE)
draw_line_bone(arm->flag, flag, 0, index, NULL, eBone);
@@ -1990,14 +2008,20 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
if (arm->flag & ARM_DRAWNAMES) {
VecMidf(vec, eBone->head, eBone->tail);
glRasterPos3fv(vec);
- view3d_object_text_draw_add(vec[0], vec[1], vec[2], eBone->name, 10);
+ view3d_cached_text_draw_add(vec[0], vec[1], vec[2], eBone->name, 10);
}
/* Draw additional axes */
if (arm->flag & ARM_DRAWAXES) {
glPushMatrix();
- set_matrix_editbone(eBone);
- glTranslatef(0.0f, eBone->length, 0.0f);
+ get_matrix_editbone(eBone, bmat);
+ bone_matrix_translate_y(bmat, eBone->length);
+ glMultMatrixf(bmat);
+
+ /* do cached text draw immediate to include transform */
+ view3d_cached_text_draw_begin();
drawaxes(eBone->length*0.25f, 0, OB_ARROWS);
+ view3d_cached_text_draw_end(v3d, ar, 1, bmat);
+
glPopMatrix();
}
@@ -2017,14 +2041,14 @@ static void draw_ebones(View3D *v3d, RegionView3D *rv3d, Object *ob, int dt)
/* draw bone paths
* - in view space
*/
-static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob)
+static void draw_pose_paths(Scene *scene, View3D *v3d, ARegion *ar, Object *ob)
{
+ RegionView3D *rv3d= ar->regiondata;
+ AnimData *adt= BKE_animdata_from_id(&ob->id);
bArmature *arm= ob->data;
bPoseChannel *pchan;
- // bAction *act; // XXX old animsys - watch it!
- // bActionChannel *achan;
ActKeyColumn *ak;
- ListBase keys;
+ DLRBT_Tree keys;
float *fp, *fp_start;
int a, stepsize;
int sfra, efra, len;
@@ -2151,13 +2175,13 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
/* only draw framenum if several consecutive highlighted points don't occur on same point */
if (a == 0) {
- sprintf(str, " %d\n", (a+sfra));
- view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0);
+ sprintf(str, "%d", (a+sfra));
+ view3d_cached_text_draw_add(fp[0], fp[1], fp[2], str, 0);
}
else if ((a > stepsize) && (a < len-stepsize)) {
if ((VecEqual(fp, fp-(stepsize*3))==0) || (VecEqual(fp, fp+(stepsize*3))==0)) {
- sprintf(str, " %d\n", (a+sfra));
- view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0);
+ sprintf(str, "%d", (a+sfra));
+ view3d_cached_text_draw_add(fp[0], fp[1], fp[2], str, 0);
}
}
}
@@ -2166,16 +2190,15 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
/* Keyframes - dots and numbers */
if (arm->pathflag & ARM_PATH_KFRAS) {
/* build list of all keyframes in active action for pchan */
- keys.first = keys.last = NULL;
+ BLI_dlrbTree_init(&keys);
- #if 0 // XXX old animation system
- act= ob->action;
- if (act) {
- achan= get_action_channel(act, pchan->name);
- if (achan)
- ipo_to_keylist(achan->ipo, &keys, NULL, NULL);
+ if (adt) {
+ bActionGroup *agrp= action_groups_find_named(adt->action, pchan->name);
+ if (agrp) {
+ agroup_to_keylist(adt, agrp, &keys, NULL);
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ }
}
- #endif // XXX old animation system
/* Draw slightly-larger yellow dots at each keyframe */
UI_ThemeColor(TH_VERTEX_SELECT);
@@ -2199,14 +2222,14 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
if (ak->cfra == (a+sfra)) {
char str[32];
- sprintf(str, " %d\n", (a+sfra));
- view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0);
+ sprintf(str, "%d", (a+sfra));
+ view3d_cached_text_draw_add(fp[0], fp[1], fp[2], str, 0);
}
}
}
}
- BLI_freelistN(&keys);
+ BLI_dlrbTree_free(&keys);
}
}
}
@@ -2251,9 +2274,10 @@ static void ghost_poses_tag_unselected(Object *ob, short unset)
/* draw ghosts that occur within a frame range
* note: object should be in posemode
*/
-static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
+static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
Object *ob= base->object;
+ AnimData *adt= BKE_animdata_from_id(&ob->id);
bArmature *arm= ob->data;
bPose *posen, *poseo;
float start, end, stepsize, range, colfac;
@@ -2268,7 +2292,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d
range= (float)(end - start);
/* store values */
- ob->flag &= ~OB_POSEMODE;
+ ob->mode &= ~OB_MODE_POSE;
cfrao= CFRA;
flago= arm->flag;
arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
@@ -2290,9 +2314,9 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d
colfac = (end - (float)CFRA) / range;
UI_ThemeColorShadeAlpha(TH_WIRE, 0, -128-(int)(120.0*sqrt(colfac)));
- //do_all_pose_actions(scene, ob); // XXX old animation system
+ BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
+ draw_pose_channels(scene, v3d, ar, base, OB_WIRE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2305,45 +2329,48 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, RegionView3D *rv3d
ob->pose= poseo;
arm->flag= flago;
armature_rebuild_pose(ob, ob->data);
- ob->flag |= OB_POSEMODE;
+ ob->mode |= OB_MODE_POSE;
ob->ipoflag= ipoflago;
}
/* draw ghosts on keyframes in action within range
* - object should be in posemode
*/
-static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
+static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
Object *ob= base->object;
- bAction *act= ob->action; // XXX old animsys stuff... watch it!
+ AnimData *adt= BKE_animdata_from_id(&ob->id);
+ bAction *act= (adt) ? adt->action : NULL;
bArmature *arm= ob->data;
bPose *posen, *poseo;
- ListBase keys= {NULL, NULL};
- ActKeysInc aki = {0, 0, 0};
+ DLRBT_Tree keys;
ActKeyColumn *ak, *akn;
float start, end, range, colfac, i;
int cfrao, flago;
- aki.start= start = (float)arm->ghostsf;
- aki.end= end = (float)arm->ghostef;
+ start = (float)arm->ghostsf;
+ end = (float)arm->ghostef;
if (end <= start)
return;
/* get keyframes - then clip to only within range */
- action_to_keylist(act, &keys, NULL, &aki);
+ BLI_dlrbTree_init(&keys);
+ action_to_keylist(adt, act, &keys, NULL);
+ BLI_dlrbTree_linkedlist_sync(&keys);
+
range= 0;
for (ak= keys.first; ak; ak= akn) {
akn= ak->next;
if ((ak->cfra < start) || (ak->cfra > end))
- BLI_freelinkN(&keys, ak);
+ BLI_freelinkN((ListBase *)&keys, ak);
else
range++;
}
if (range == 0) return;
/* store values */
- ob->flag &= ~OB_POSEMODE;
+ ob->mode &= ~OB_MODE_POSE;
cfrao= CFRA;
flago= arm->flag;
arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
@@ -2366,15 +2393,15 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, RegionView3D *rv3d,
CFRA= (int)ak->cfra;
- //do_all_pose_actions(scene, ob); // XXX old animation system
+ BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
+ draw_pose_channels(scene, v3d, ar, base, OB_WIRE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
ghost_poses_tag_unselected(ob, 1); /* unhide unselected bones if need be */
- BLI_freelistN(&keys);
+ BLI_dlrbTree_free(&keys);
free_pose(posen);
/* restore */
@@ -2382,47 +2409,36 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, RegionView3D *rv3d,
ob->pose= poseo;
arm->flag= flago;
armature_rebuild_pose(ob, ob->data);
- ob->flag |= OB_POSEMODE;
+ ob->mode |= OB_MODE_POSE;
}
/* draw ghosts around current frame
* - object is supposed to be armature in posemode
*/
-static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
+static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
Object *ob= base->object;
+ AnimData *adt= BKE_animdata_from_id(&ob->id);
bArmature *arm= ob->data;
bPose *posen, *poseo;
- //bActionStrip *strip;
float cur, start, end, stepsize, range, colfac, actframe, ctime;
- int cfrao, maptime, flago;
+ int cfrao, flago;
/* pre conditions, get an action with sufficient frames */
- //if (ob->action==NULL)
- // return;
+ if ELEM(NULL, adt, adt->action)
+ return;
- calc_action_range(ob->action, &start, &end, 0);
+ calc_action_range(adt->action, &start, &end, 0);
if (start == end)
return;
stepsize= (float)(arm->ghostsize);
range= (float)(arm->ghostep)*stepsize + 0.5f; /* plus half to make the for loop end correct */
-#if 0 // XXX old animation system
- /* we only map time for armature when an active strip exists */
- for (strip=ob->nlastrips.first; strip; strip=strip->next)
- if (strip->flag & ACTSTRIP_ACTIVE)
- break;
-#endif // XXX old animsys
-
- //maptime= (strip!=NULL);
- maptime= 0;
-
/* store values */
- ob->flag &= ~OB_POSEMODE;
+ ob->mode &= ~OB_MODE_POSE;
cfrao= CFRA;
- if (maptime) actframe= get_action_frame(ob, (float)CFRA);
- else actframe= (float)CFRA;
+ actframe= BKE_nla_tweakedit_remap(adt, (float)CFRA, 0);
flago= arm->flag;
arm->flag &= ~(ARM_DRAWNAMES|ARM_DRAWAXES);
@@ -2444,13 +2460,12 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
/* only within action range */
if (actframe+ctime >= start && actframe+ctime <= end) {
- if (maptime) CFRA= (int)get_action_frame_inv(ob, actframe+ctime);
- else CFRA= (int)floor(actframe+ctime);
+ CFRA= (int)BKE_nla_tweakedit_remap(adt, actframe+ctime, NLATIME_CONVERT_MAP);
if (CFRA != cfrao) {
- //do_all_pose_actions(scene, ob); // xxx old animation system crap
+ BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
+ draw_pose_channels(scene, v3d, ar, base, OB_WIRE);
}
}
@@ -2460,13 +2475,12 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
/* only within action range */
if ((actframe-ctime >= start) && (actframe-ctime <= end)) {
- if (maptime) CFRA= (int)get_action_frame_inv(ob, actframe-ctime);
- else CFRA= (int)floor(actframe-ctime);
+ CFRA= (int)BKE_nla_tweakedit_remap(adt, actframe-ctime, NLATIME_CONVERT_MAP);
if (CFRA != cfrao) {
- //do_all_pose_actions(scene, ob); // XXX old animation system crap...
+ BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_channels(scene, v3d, rv3d, base, OB_WIRE);
+ draw_pose_channels(scene, v3d, ar, base, OB_WIRE);
}
}
}
@@ -2481,13 +2495,13 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
ob->pose= poseo;
arm->flag= flago;
armature_rebuild_pose(ob, ob->data);
- ob->flag |= OB_POSEMODE;
+ ob->mode |= OB_MODE_POSE;
}
/* ********************************** Armature Drawing - Main ************************* */
/* called from drawobject.c, return 1 if nothing was drawn */
-int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
+int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag)
{
Object *ob= base->object;
bArmature *arm= ob->data;
@@ -2511,7 +2525,7 @@ int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int
/* editmode? */
if(arm->edbo) {
arm->flag |= ARM_EDITMODE;
- draw_ebones(v3d, rv3d, ob, dt);
+ draw_ebones(v3d, ar, ob, dt);
arm->flag &= ~ARM_EDITMODE;
}
else{
@@ -2520,35 +2534,39 @@ int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int
/* drawing posemode selection indices or colors only in these cases */
if(!(base->flag & OB_FROMDUPLI)) {
if(G.f & G_PICKSEL) {
- if(ob->flag & OB_POSEMODE)
+ if(OBACT && (OBACT->mode & OB_MODE_WEIGHT_PAINT)) {
+ if(ob==modifiers_isDeformedByArmature(OBACT))
+ arm->flag |= ARM_POSEMODE;
+ }
+ else if(ob->mode & OB_MODE_POSE)
arm->flag |= ARM_POSEMODE;
}
- else if(ob->flag & OB_POSEMODE) {
+ else if(ob->mode & OB_MODE_POSE) {
if (arm->ghosttype == ARM_GHOST_RANGE) {
- draw_ghost_poses_range(scene, v3d, rv3d, base);
+ draw_ghost_poses_range(scene, v3d, ar, base);
}
else if (arm->ghosttype == ARM_GHOST_KEYS) {
- draw_ghost_poses_keys(scene, v3d, rv3d, base);
+ draw_ghost_poses_keys(scene, v3d, ar, base);
}
else if (arm->ghosttype == ARM_GHOST_CUR) {
if (arm->ghostep)
- draw_ghost_poses(scene, v3d, rv3d, base);
+ draw_ghost_poses(scene, v3d, ar, base);
}
if ((flag & DRAW_SCENESET)==0) {
if(ob==OBACT)
arm->flag |= ARM_POSEMODE;
- else if(G.f & G_WEIGHTPAINT) {
- if(OBACT && ob==modifiers_isDeformedByArmature(OBACT))
+ else if(OBACT && (OBACT->mode & OB_MODE_WEIGHT_PAINT)) {
+ if(ob==modifiers_isDeformedByArmature(OBACT))
arm->flag |= ARM_POSEMODE;
}
- draw_pose_paths(scene, v3d, rv3d, ob);
+ draw_pose_paths(scene, v3d, ar, ob);
}
}
}
- draw_pose_channels(scene, v3d, rv3d, base, dt);
+ draw_pose_channels(scene, v3d, ar, base, dt);
arm->flag &= ~ARM_POSEMODE;
- if(ob->flag & OB_POSEMODE)
+ if(ob->mode & OB_MODE_POSE)
UI_ThemeColor(TH_WIRE); /* restore, for extra draw stuff */
}
else retval= 1;
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 1807de9efbb..da67bd8707e 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -60,6 +60,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_property.h"
#include "BKE_utildefines.h"
@@ -297,9 +298,9 @@ static int set_draw_settings_cached(int clearcache, int textured, MTFace *texfac
if (textured!=c_textured || texface!=c_texface) {
if (textured ) {
- c_badtex= !GPU_set_tpage(texface);
+ c_badtex= !GPU_set_tpage(texface, !(litob->mode & OB_MODE_TEXTURE_PAINT));
} else {
- GPU_set_tpage(0);
+ GPU_set_tpage(NULL, 0);
c_badtex= 0;
}
c_textured= textured;
@@ -377,7 +378,7 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
static void draw_textured_end()
{
/* switch off textures */
- GPU_set_tpage(0);
+ GPU_set_tpage(NULL, 0);
glShadeModel(GL_FLAT);
glDisable(GL_CULL_FACE);
@@ -482,7 +483,7 @@ void draw_mesh_text(Scene *scene, Object *ob, int glsl)
if(ob == scene->obedit)
return;
else if(ob==OBACT)
- if(FACESEL_PAINT_TEST)
+ if(paint_facesel_test(ob))
return;
ddm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
@@ -562,7 +563,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
if(ob == scene->obedit) {
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_mesh);
} else if(faceselect) {
- if(G.f & G_WEIGHTPAINT)
+ if(ob->mode & OB_MODE_WEIGHT_PAINT)
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1);
else
dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 05490e2fce1..60ae91e7a89 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -37,9 +37,10 @@
#include "IMB_imbuf.h"
-#include "MTC_matrixops.h"
+
#include "DNA_armature_types.h"
+#include "DNA_boid_types.h"
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_constraint_types.h" // for drawing constraint
@@ -58,6 +59,7 @@
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_smoke_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "DNA_world_types.h"
@@ -85,9 +87,14 @@
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_property.h"
+#include "BKE_smoke.h"
+#include "BKE_unit.h"
#include "BKE_utildefines.h"
+#include "smoke_API.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -122,11 +129,6 @@
(((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \
)
-
-/* pretty stupid */
-/* editmball.c */
-extern ListBase editelems;
-
static void draw_bounding_volume(Scene *scene, Object *ob);
static void drawcube_size(float size);
@@ -212,11 +214,10 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
return 0;
if(!CHECK_OB_DRAWTEXTURE(v3d, dt))
return 0;
- if(ob==OBACT && (G.f & G_WEIGHTPAINT))
+ if(ob==OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT))
return 0;
- return ((G.fileflags & G_FILE_GAME_MAT) &&
- (G.fileflags & G_FILE_GAME_MAT_GLSL) && (dt >= OB_SHADED));
+ return (scene->gm.matmode == GAME_MAT_GLSL) && (dt >= OB_SHADED);
}
static int check_material_alpha(Base *base, Mesh *me, int glsl)
@@ -433,11 +434,11 @@ void drawaxes(float size, int flag, char drawtype)
// patch for 3d cards crashing on glSelect for text drawing (IBM)
if((flag & DRAW_PICKING) == 0) {
if (axis==0)
- view3d_object_text_draw_add(v2[0], v2[1], v2[2], "x", 0);
+ view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "x", 0);
else if (axis==1)
- view3d_object_text_draw_add(v2[0], v2[1], v2[2], "y", 0);
+ view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "y", 0);
else
- view3d_object_text_draw_add(v2[0], v2[1], v2[2], "z", 0);
+ view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "z", 0);
}
}
break;
@@ -495,23 +496,32 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int se
if(v3d->zbuf) glDepthFunc(GL_LEQUAL);
}
-/* *********** text drawing for object ************* */
-static ListBase strings= {NULL, NULL};
+/* *********** text drawing for object/particles/armature ************* */
-typedef struct ViewObjectString {
- struct ViewObjectString *next, *prev;
+static ListBase CachedText[3];
+static int CachedTextLevel= 0;
+
+typedef struct ViewCachedString {
+ struct ViewCachedString *next, *prev;
float vec[3], col[4];
char str[128];
short mval[2];
short xoffs;
-} ViewObjectString;
+} ViewCachedString;
+void view3d_cached_text_draw_begin()
+{
+ ListBase *strings= &CachedText[CachedTextLevel];
+ strings->first= strings->last= NULL;
+ CachedTextLevel++;
+}
-void view3d_object_text_draw_add(float x, float y, float z, char *str, short xoffs)
+void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs)
{
- ViewObjectString *vos= MEM_callocN(sizeof(ViewObjectString), "ViewObjectString");
+ ListBase *strings= &CachedText[CachedTextLevel-1];
+ ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString), "ViewCachedString");
- BLI_addtail(&strings, vos);
+ BLI_addtail(strings, vos);
BLI_strncpy(vos->str, str, 128);
vos->vec[0]= x;
vos->vec[1]= y;
@@ -520,22 +530,23 @@ void view3d_object_text_draw_add(float x, float y, float z, char *str, short xof
vos->xoffs= xoffs;
}
-static void view3d_object_text_draw(View3D *v3d, ARegion *ar)
+void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4])
{
- ViewObjectString *vos;
- int tot= 0;
+ RegionView3D *rv3d= ar->regiondata;
+ ListBase *strings= &CachedText[CachedTextLevel-1];
+ ViewCachedString *vos;
+ int a, tot= 0;
/* project first and test */
- for(vos= strings.first; vos; vos= vos->next) {
+ for(vos= strings->first; vos; vos= vos->next) {
+ if(mat)
+ Mat4MulVecfl(mat, vos->vec);
view3d_project_short_clip(ar, vos->vec, vos->mval);
if(vos->mval[0]!=IS_CLIPPED)
tot++;
}
-
+
if(tot) {
- RegionView3D *rv3d= ar->regiondata;
- int a;
-
if(rv3d->rflag & RV3D_CLIPPING)
for(a=0; a<6; a++)
glDisable(GL_CLIP_PLANE0+a);
@@ -543,16 +554,22 @@ static void view3d_object_text_draw(View3D *v3d, ARegion *ar)
wmPushMatrix();
ED_region_pixelspace(ar);
- if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
+ if(depth_write) {
+ if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
+ }
+ else glDepthMask(0);
- for(vos= strings.first; vos; vos= vos->next) {
+ for(vos= strings->first; vos; vos= vos->next) {
if(vos->mval[0]!=IS_CLIPPED) {
glColor3fv(vos->col);
- BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], 0.0, vos->str);
+ BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
}
}
- if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+ if(depth_write) {
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+ }
+ else glDepthMask(1);
wmPopMatrix();
@@ -561,62 +578,14 @@ static void view3d_object_text_draw(View3D *v3d, ARegion *ar)
glEnable(GL_CLIP_PLANE0+a);
}
- if(strings.first)
- BLI_freelistN(&strings);
-}
-
-void drawsolidcube(float size)
-{
- float n[3];
-
- glPushMatrix();
- glScalef(size, size, size);
-
- n[0]=0; n[1]=0; n[2]=0;
- glBegin(GL_QUADS);
- n[0]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[0]); glVertex3fv(cube[1]); glVertex3fv(cube[2]); glVertex3fv(cube[3]);
- n[0]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[1]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[0]); glVertex3fv(cube[4]); glVertex3fv(cube[5]); glVertex3fv(cube[1]);
- n[1]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[0]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[4]); glVertex3fv(cube[7]); glVertex3fv(cube[6]); glVertex3fv(cube[5]);
- n[0]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[1]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[7]); glVertex3fv(cube[3]); glVertex3fv(cube[2]); glVertex3fv(cube[6]);
- n[1]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[2]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[1]); glVertex3fv(cube[5]); glVertex3fv(cube[6]); glVertex3fv(cube[2]);
- n[2]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[2]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[7]); glVertex3fv(cube[4]); glVertex3fv(cube[0]); glVertex3fv(cube[3]);
- glEnd();
+ if(strings->first)
+ BLI_freelistN(strings);
- glPopMatrix();
+ CachedTextLevel--;
}
+/* ******************** primitive drawing ******************* */
+
static void drawcube(void)
{
@@ -1175,7 +1144,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
Mat4Ortho(vec);
wmMultMatrix(vec);
- MTC_Mat4SwapMat4(rv3d->persmat, tmat);
+ Mat4SwapMat4(rv3d->persmat, tmat);
wmGetSingleMatrix(rv3d->persmat);
if(cam->flag & CAM_SHOWLIMITS) {
@@ -1188,7 +1157,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
if(cam->flag & CAM_SHOWMIST)
if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF);
- MTC_Mat4SwapMat4(rv3d->persmat, tmat);
+ Mat4SwapMat4(rv3d->persmat, tmat);
}
}
}
@@ -1249,7 +1218,7 @@ static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w, i
if(use_wcol) {
float col[3];
- MDeformWeight *mdw= get_defweight (lt->dvert+index, use_wcol-1);
+ MDeformWeight *mdw= ED_vgroup_weight_get (lt->dvert+index, use_wcol-1);
weight_to_rgb(mdw?mdw->weight:0.0f, col, col+1, col+2);
glColor3fv(col);
@@ -1443,12 +1412,13 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
int i;
for (nu= cu->editnurb->first; nu; nu=nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
for (i=0; i<nu->pntsu; i++) {
BezTriple *bezt = &nu->bezt[i];
if(bezt->hide==0) {
- if (G.f & G_HIDDENHANDLES) {
+
+ if(cu->drawflag & CU_HIDE_HANDLES) {
view3d_project_short_clip(vc->ar, bezt->vec[1], s);
if (s[0] != IS_CLIPPED)
func(userData, nu, NULL, bezt, 1, s[0], s[1]);
@@ -1902,7 +1872,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh
}
}
-static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em)
+static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em, UnitSettings *unit)
{
Mesh *me= ob->data;
EditEdge *eed;
@@ -1912,18 +1882,20 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
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 */
-
+ float grid= unit->system ? unit->scale_length : v3d->grid;
+ int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
if(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))
return;
/* make the precission of the pronted value proportionate to the gridsize */
- if ((v3d->grid) < 0.01)
+
+ if (grid < 0.01f)
strcpy(conv_float, "%.6f");
- else if ((v3d->grid) < 0.1)
+ else if (grid < 0.1f)
strcpy(conv_float, "%.5f");
- else if ((v3d->grid) < 1.0)
+ else if (grid < 1.0f)
strcpy(conv_float, "%.4f");
- else if ((v3d->grid) < 10.0)
+ else if (grid < 10.0f)
strcpy(conv_float, "%.3f");
else
strcpy(conv_float, "%.2f");
@@ -1932,13 +1904,13 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
- if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0);
+ 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.5) {col[1]*=0.7; col[2]*= 0.7;}
- else col[0]= col[0]*0.7 + 0.3;
+ if(col[0]> 0.5f) {col[1]*=0.7f; col[2]*= 0.7f;}
+ else col[0]= col[0]*0.7f + 0.3f;
glColor3fv(col);
for(eed= em->edges.first; eed; eed= eed->next) {
@@ -1947,17 +1919,20 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
VECCOPY(v1, eed->v1->co);
VECCOPY(v2, eed->v2->co);
- x= 0.5*(v1[0]+v2[0]);
- y= 0.5*(v1[1]+v2[1]);
- z= 0.5*(v1[2]+v2[2]);
+ x= 0.5f*(v1[0]+v2[0]);
+ y= 0.5f*(v1[1]+v2[1]);
+ z= 0.5f*(v1[2]+v2[2]);
if(v3d->flag & V3D_GLOBAL_STATS) {
Mat4MulVecfl(ob->obmat, v1);
Mat4MulVecfl(ob->obmat, v2);
}
+ if(unit->system)
+ bUnit_AsString(val, sizeof(val), VecLenf(v1, v2)*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE);
+ else
+ sprintf(val, conv_float, VecLenf(v1, v2));
- sprintf(val, conv_float, VecLenf(v1, v2));
- view3d_object_text_draw_add(x, y, z, val, 0);
+ view3d_cached_text_draw_add(x, y, z, val, 0);
}
}
}
@@ -1967,8 +1942,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
UI_GetThemeColor3fv(TH_TEXT, col);
/* make color a bit more green */
- if(col[1]> 0.5) {col[0]*=0.7; col[2]*= 0.7;}
- else col[1]= col[1]*0.7 + 0.3;
+ if(col[1]> 0.5f) {col[0]*=0.7f; col[2]*= 0.7f;}
+ else col[1]= col[1]*0.7f + 0.3f;
glColor3fv(col);
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -1991,8 +1966,12 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
else
area = AreaT3Dfl(v1, v2, v3);
- sprintf(val, conv_float, area);
- view3d_object_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
+ if(unit->system)
+ bUnit_AsString(val, sizeof(val), area*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE); // XXX should be B_UNIT_AREA
+ else
+ sprintf(val, conv_float, area);
+
+ view3d_cached_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
}
}
}
@@ -2002,8 +1981,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
UI_GetThemeColor3fv(TH_TEXT, col);
/* make color a bit more blue */
- if(col[2]> 0.5) {col[0]*=0.7; col[1]*= 0.7;}
- else col[2]= col[2]*0.7 + 0.3;
+ if(col[2]> 0.5f) {col[0]*=0.7f; col[1]*= 0.7f;}
+ else col[2]= col[2]*0.7f + 0.3f;
glColor3fv(col);
for(efa= em->faces.first; efa; efa= efa->next) {
@@ -2032,31 +2011,31 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
if( (e4->f & e1->f & SELECT) || (G.moving && (efa->v1->f & SELECT)) ) {
/* Vec 1 */
- sprintf(val,"%.3f", VecAngle3(v4, v1, v2));
- VecLerpf(fvec, efa->cent, efa->v1->co, 0.8);
- view3d_object_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
+ sprintf(val,"%.3f", RAD2DEG(VecAngle3(v4, v1, v2)));
+ VecLerpf(fvec, efa->cent, efa->v1->co, 0.8f);
+ view3d_cached_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0);
}
if( (e1->f & e2->f & SELECT) || (G.moving && (efa->v2->f & SELECT)) ) {
/* Vec 2 */
- sprintf(val,"%.3f", VecAngle3(v1, v2, v3));
- VecLerpf(fvec, efa->cent, efa->v2->co, 0.8);
- view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
+ sprintf(val,"%.3f", RAD2DEG(VecAngle3(v1, v2, v3)));
+ VecLerpf(fvec, efa->cent, efa->v2->co, 0.8f);
+ view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
}
if( (e2->f & e3->f & SELECT) || (G.moving && (efa->v3->f & SELECT)) ) {
/* Vec 3 */
if(efa->v4)
- sprintf(val,"%.3f", VecAngle3(v2, v3, v4));
+ sprintf(val,"%.3f", RAD2DEG(VecAngle3(v2, v3, v4)));
else
- sprintf(val,"%.3f", VecAngle3(v2, v3, v1));
- VecLerpf(fvec, efa->cent, efa->v3->co, 0.8);
- view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
+ sprintf(val,"%.3f", RAD2DEG(VecAngle3(v2, v3, v1)));
+ VecLerpf(fvec, efa->cent, efa->v3->co, 0.8f);
+ view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
}
/* Vec 4 */
if(efa->v4) {
if( (e3->f & e4->f & SELECT) || (G.moving && (efa->v4->f & SELECT)) ) {
- sprintf(val,"%.3f", VecAngle3(v3, v4, v1));
- VecLerpf(fvec, efa->cent, efa->v4->co, 0.8);
- view3d_object_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
+ sprintf(val,"%.3f", RAD2DEG(VecAngle3(v3, v4, v1)));
+ VecLerpf(fvec, efa->cent, efa->v4->co, 0.8f);
+ view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0);
}
}
}
@@ -2064,7 +2043,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
if(v3d->zbuf) {
glEnable(GL_DEPTH_TEST);
- bglPolygonOffset(rv3d->dist, 0.0);
+ bglPolygonOffset(rv3d->dist, 0.0f);
}
}
@@ -2149,7 +2128,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
}
}
- if((me->drawflag & (ME_DRAWFACES)) || FACESEL_PAINT_TEST) { /* transp faces */
+ if((me->drawflag & (ME_DRAWFACES)) || paint_facesel_test(ob)) { /* transp faces */
unsigned char col1[4], col2[4], col3[4];
UI_GetThemeColor4ubv(TH_FACE, (char *)col1);
@@ -2237,7 +2216,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
}
if(me->drawflag & (ME_DRAW_EDGELEN|ME_DRAW_FACEAREA|ME_DRAW_EDGEANG))
- draw_em_measure_stats(v3d, rv3d, ob, em);
+ draw_em_measure_stats(v3d, rv3d, ob, em, &scene->unit);
}
if(dt>OB_WIRE) {
@@ -2308,7 +2287,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
- if (ob==OBACT && FACESEL_PAINT_TEST) draw_wire = 0;
+ if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
draw_bounding_volume(scene, ob);
@@ -2321,12 +2300,12 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
else if(dt==OB_WIRE || totface==0) {
draw_wire = 1; /* draw wire only, no depth buffer stuff */
}
- else if( (ob==OBACT && (G.f & G_TEXTUREPAINT || FACESEL_PAINT_TEST)) ||
+ else if( (ob==OBACT && (ob->mode & OB_MODE_TEXTURE_PAINT || paint_facesel_test(ob))) ||
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
- int faceselect= (ob==OBACT && FACESEL_PAINT_TEST);
+ int faceselect= (ob==OBACT && paint_facesel_test(ob));
- if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || FACESEL_PAINT_TEST) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
@@ -2380,7 +2359,7 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
if(ob==OBACT) {
do_draw= 0;
- if( (G.f & G_WEIGHTPAINT)) {
+ if(ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
/* enforce default material settings */
GPU_enable_material(0, NULL);
@@ -2400,12 +2379,13 @@ static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
GPU_disable_material();
}
- else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mcol) {
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
- }
- else if(G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) {
- glColor3f(1.0f, 1.0f, 1.0f);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+ else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
+ if(me->mcol)
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
+ else {
+ glColor3f(1.0f, 1.0f, 1.0f);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+ }
}
else do_draw= 1;
}
@@ -2515,11 +2495,13 @@ static int draw_mesh_object(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
if(dt>OB_WIRE) {
// no transp in editmode, the fancy draw over goes bad then
glsl = draw_glsl_material(scene, ob, v3d, dt);
- GPU_set_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
}
draw_em_fancy(scene, v3d, rv3d, ob, em, cageDM, finalDM, dt);
+ GPU_end_object_materials();
+
if (obedit!=ob && finalDM)
finalDM->release(finalDM);
}
@@ -2534,17 +2516,19 @@ static int draw_mesh_object(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
check_alpha = check_material_alpha(base, me, glsl);
if(dt==OB_SOLID || glsl) {
- GPU_set_object_materials(v3d, rv3d, scene, ob, glsl,
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl,
(check_alpha)? &do_alpha_pass: NULL);
}
draw_mesh_fancy(scene, v3d, rv3d, base, dt, flag);
+
+ GPU_end_object_materials();
if(me->totvert==0) retval= 1;
}
}
- /* GPU_set_object_materials checked if this is needed */
+ /* GPU_begin_object_materials checked if this is needed */
if(do_alpha_pass) add_view3d_after(v3d, base, V3D_TRANSP, flag);
return retval;
@@ -2722,7 +2706,6 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
glVertexPointer(3, GL_FLOAT, 0, dl->verts);
glNormalPointer(GL_FLOAT, 0, dl->nors);
glDrawElements(GL_QUADS, 4*dl->totindex, GL_UNSIGNED_INT, dl->index);
- GPU_disable_material();
}
break;
@@ -2740,7 +2723,6 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
glNormalPointer(GL_FLOAT, 0, dl->nors);
glDrawElements(GL_TRIANGLES, 3*dl->parts, GL_UNSIGNED_INT, dl->index);
- GPU_disable_material();
if(index3_nors_incr==0)
glEnableClientState(GL_NORMAL_ARRAY);
@@ -2754,8 +2736,6 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
glNormalPointer(GL_FLOAT, 0, dl->nors);
glDrawElements(GL_QUADS, 4*dl->parts, GL_UNSIGNED_INT, dl->index);
- GPU_disable_material();
-
break;
}
dl= dl->next;
@@ -2838,7 +2818,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
if(solid) {
dl= lb->first;
if(dl==NULL) return 1;
-
+
if(dl->nors==0) addnormalsDispList(ob, lb);
index3_nors_incr= 0;
@@ -2849,17 +2829,19 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
}
else {
if(draw_glsl_material(scene, ob, v3d, dt)) {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
+ GPU_end_object_materials();
}
else if(dt == OB_SHADED) {
if(ob->disp.first==0) shadeDispList(scene, base);
drawDispListshaded(lb, ob);
}
else {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
drawDispListsolid(lb, ob, 0);
+ GPU_end_object_materials();
}
if(cu->editnurb && cu->bevobj==NULL && cu->taperobj==NULL && cu->ext1 == 0.0 && cu->ext2 == 0.0) {
cpack(0);
@@ -2877,7 +2859,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
}
break;
case OB_SURF:
-
+
lb= &((Curve *)ob->data)->disp;
if(solid) {
@@ -2887,18 +2869,19 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
if(dl->nors==NULL) addnormalsDispList(ob, lb);
if(draw_glsl_material(scene, ob, v3d, dt)) {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
+ GPU_end_object_materials();
}
else if(dt==OB_SHADED) {
if(ob->disp.first==NULL) shadeDispList(scene, base);
drawDispListshaded(lb, ob);
}
else {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
-
drawDispListsolid(lb, ob, 0);
+ GPU_end_object_materials();
}
}
else {
@@ -2915,8 +2898,9 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
if(solid) {
if(draw_glsl_material(scene, ob, v3d, dt)) {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 1, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL);
drawDispListsolid(lb, ob, 1);
+ GPU_end_object_materials();
}
else if(dt == OB_SHADED) {
dl= lb->first;
@@ -2924,10 +2908,10 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
drawDispListshaded(lb, ob);
}
else {
- GPU_set_object_materials(v3d, rv3d, scene, ob, 0, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
-
drawDispListsolid(lb, ob, 0);
+ GPU_end_object_materials();
}
}
else{
@@ -2941,6 +2925,153 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
return retval;
}
+/* *********** drawing for particles ************* */
+
+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 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;
+ }
+
+ switch(draw_as){
+ case PART_DRAW_DOT:
+ {
+ if(vd) {
+ VECCOPY(vd,state->co) pdd->vd+=3;
+ }
+ if(cd) {
+ cd[0]=ma_r;
+ cd[1]=ma_g;
+ cd[2]=ma_b;
+ pdd->cd+=3;
+ }
+ break;
+ }
+ case PART_DRAW_CROSS:
+ case PART_DRAW_AXIS:
+ {
+ vec[0]=2.0f*pixsize;
+ vec[1]=vec[2]=0.0;
+ QuatMulVecf(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;
+ cd+=18;
+
+ VECCOPY(vec2,state->co);
+ }
+ else {
+ if(cd) {
+ cd[0]=cd[3]=cd[6]=cd[9]=cd[12]=cd[15]=ma_r;
+ cd[1]=cd[4]=cd[7]=cd[10]=cd[13]=cd[16]=ma_g;
+ cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b;
+ pdd->cd+=18;
+ }
+ VECSUB(vec2,state->co,vec);
+ }
+
+ VECADD(vec,state->co,vec);
+ VECCOPY(pdd->vd,vec); pdd->vd+=3;
+ VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+
+ vec[1]=2.0f*pixsize;
+ vec[0]=vec[2]=0.0;
+ QuatMulVecf(state->rot,vec);
+ if(draw_as==PART_DRAW_AXIS){
+ VECCOPY(vec2,state->co);
+ }
+ else VECSUB(vec2,state->co,vec);
+
+ VECADD(vec,state->co,vec);
+ VECCOPY(pdd->vd,vec); pdd->vd+=3;
+ VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+
+ vec[2]=2.0f*pixsize;
+ vec[0]=vec[1]=0.0;
+ QuatMulVecf(state->rot,vec);
+ if(draw_as==PART_DRAW_AXIS){
+ VECCOPY(vec2,state->co);
+ }
+ else VECSUB(vec2,state->co,vec);
+
+ VECADD(vec,state->co,vec);
+
+ VECCOPY(pdd->vd,vec); pdd->vd+=3;
+ VECCOPY(pdd->vd,vec2); pdd->vd+=3;
+ break;
+ }
+ case PART_DRAW_LINE:
+ {
+ VECCOPY(vec,state->vel);
+ Normalize(vec);
+ if(draw & PART_DRAW_VEL_LENGTH)
+ VecMulf(vec,VecLength(state->vel));
+ VECADDFAC(pdd->vd,state->co,vec,-draw_line[0]); pdd->vd+=3;
+ VECADDFAC(pdd->vd,state->co,vec,draw_line[1]); pdd->vd+=3;
+ if(cd) {
+ cd[0]=cd[3]=ma_r;
+ cd[1]=cd[4]=ma_g;
+ cd[2]=cd[5]=ma_b;
+ pdd->cd+=6;
+ }
+ break;
+ }
+ case PART_DRAW_CIRC:
+ {
+ if(pdd->ma_r)
+ glColor3f(ma_r,ma_g,ma_b);
+ drawcircball(GL_LINE_LOOP, state->co, pixsize, imat);
+ break;
+ }
+ case PART_DRAW_BB:
+ {
+ float xvec[3], yvec[3], zvec[3], bb_center[3];
+ if(cd) {
+ cd[0]=cd[3]=cd[6]=cd[9]=ma_r;
+ cd[1]=cd[4]=cd[7]=cd[10]=ma_g;
+ cd[2]=cd[5]=cd[8]=cd[11]=ma_b;
+ pdd->cd+=12;
+ }
+
+
+ VECCOPY(bb->vec, state->co);
+ VECCOPY(bb->vel, state->vel);
+
+ psys_make_billboard(bb, xvec, yvec, zvec, bb_center);
+
+ VECADD(pdd->vd,bb_center,xvec);
+ VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+
+ VECSUB(pdd->vd,bb_center,xvec);
+ VECADD(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+
+ VECSUB(pdd->vd,bb_center,xvec);
+ VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+
+ VECADD(pdd->vd,bb_center,xvec);
+ VECSUB(pdd->vd,pdd->vd,yvec); pdd->vd+=3;
+
+ VECCOPY(pdd->nd, zvec); pdd->nd+=3;
+ VECCOPY(pdd->nd, zvec); pdd->nd+=3;
+ VECCOPY(pdd->nd, zvec); pdd->nd+=3;
+ VECCOPY(pdd->nd, zvec); pdd->nd+=3;
+ break;
+ }
+ }
+}
/* unified drawing of all new particle systems draw types except dupli ob & group */
/* mostly tries to use vertex arrays for speed */
@@ -2951,22 +3082,25 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
/* 5. start filling the arrays */
/* 6. draw the arrays */
/* 7. clean up */
-static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int dt)
+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};
+ ParticleDrawData *pdd = psys->pdd;
Material *ma;
- float vel[3], vec[3], vec2[3], imat[4][4], bb_center[3];
- float timestep, pixsize=1.0, pa_size, pa_time, r_tilt;
+ 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 *vdata=0, *vedata=0, *cdata=0, *ndata=0, *vd=0, *ved=0, *cd=0, *nd=0, xvec[3], yvec[3], zvec[3];
float ma_r=0.0f, ma_g=0.0f, ma_b=0.0f;
- int a, totpart, totpoint=0, draw_as, totchild=0;
- int select=ob->flag&SELECT, create_cdata=0;
+ 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];
@@ -2982,24 +3116,21 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(pars==0) return;
- // XXX what logic is this?
- if(!scene->obedit && psys_in_edit_mode(scene, psys)
- && psys->flag & PSYS_HAIR_DONE && part->draw_as==PART_DRAW_PATH)
+ /* don't draw normal paths in edit mode */
+ if(psys_in_edit_mode(scene, psys) && (pset->flag & PE_DRAW_PART)==0)
return;
if(part->draw_as==PART_DRAW_NOT) return;
/* 2. */
+ sim.psmd = psmd = psys_get_modifier(ob,psys);
+
if(part->phystype==PART_PHYS_KEYED){
- if(psys->flag & PSYS_FIRST_KEYED){
- if(psys->flag&PSYS_KEYED){
- select=psys_count_keyed_targets(ob,psys);
- if(psys->totkeyed==0)
- return;
- }
+ if(psys->flag&PSYS_KEYED){
+ psys_count_keyed_targets(&sim);
+ if(psys->totkeyed==0)
+ return;
}
- else
- return;
}
if(select){
@@ -3014,14 +3145,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
totchild=0;
else
totchild=psys->totchild*part->disp/100;
-
- ma= give_current_material(ob,part->omat);
- if(ma) {
- ma_r = ma->r;
- ma_g = ma->g;
- ma_b = ma->b;
- }
+ ma= give_current_material(ob,part->omat);
if(v3d->zbuf) glDepthMask(1);
@@ -3029,16 +3154,21 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
cpack(0xFFFFFF);
else if((ma) && (part->draw&PART_DRAW_MAT_COL)) {
glColor3f(ma->r,ma->g,ma->b);
+
+ ma_r = ma->r;
+ ma_g = ma->g;
+ ma_b = ma->b;
+
+ pdd->ma_r = &ma_r;
+ pdd->ma_g = &ma_g;
+ pdd->ma_b = &ma_b;
+
create_cdata = 1;
}
else
cpack(0);
- psmd= psys_get_modifier(ob,psys);
-
- timestep= psys_get_timestep(part);
-
- wmLoadMatrix(rv3d->viewmat);
+ timestep= psys_get_timestep(&sim);
if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
float mat[4][4];
@@ -3053,8 +3183,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
else
draw_as = part->draw_as;
- if(part->flag&PART_GLOB_TIME)
- cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f);
+ //if(part->flag&PART_GLOB_TIME)
+ cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f);
if(draw_as==PART_DRAW_PATH && psys->pathcache==NULL)
draw_as=PART_DRAW_DOT;
@@ -3119,6 +3249,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
break;
case PART_DRAW_PATH:
break;
+ case PART_DRAW_LINE:
+ need_v=1;
+ break;
}
if(part->draw & PART_DRAW_SIZE && part->draw_as!=PART_DRAW_CIRC){
Mat4CpyMat4(imat, rv3d->viewinv);
@@ -3130,56 +3263,80 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(draw_as && draw_as!=PART_DRAW_PATH) {
int tot_vec_size = (totpart + totchild) * 3 * sizeof(float);
+ if(!pdd)
+ pdd = psys->pdd = MEM_callocN(sizeof(ParticleDrawData), "ParticlDrawData");
+
+ if(part->draw_as == PART_DRAW_REND && part->trail_count > 1) {
+ tot_vec_size *= part->trail_count;
+ psys_make_temp_pointcache(ob, psys);
+ }
+
+ if(pdd->tot_vec_size != tot_vec_size)
+ psys_free_pdd(psys);
+
if(draw_as!=PART_DRAW_CIRC) {
switch(draw_as) {
case PART_DRAW_AXIS:
case PART_DRAW_CROSS:
if(draw_as != PART_DRAW_CROSS || create_cdata)
- cdata = MEM_callocN(tot_vec_size * 6, "particle_cdata");
- vdata = MEM_callocN(tot_vec_size * 6, "particle_vdata");
+ if(!pdd->cdata) pdd->cdata = MEM_callocN(tot_vec_size * 6, "particle_cdata");
+ if(!pdd->vdata) pdd->vdata = MEM_callocN(tot_vec_size * 6, "particle_vdata");
break;
case PART_DRAW_LINE:
if(create_cdata)
- cdata = MEM_callocN(tot_vec_size * 2, "particle_cdata");
- vdata = MEM_callocN(tot_vec_size * 2, "particle_vdata");
+ if(!pdd->cdata) pdd->cdata = MEM_callocN(tot_vec_size * 2, "particle_cdata");
+ if(!pdd->vdata) pdd->vdata = MEM_callocN(tot_vec_size * 2, "particle_vdata");
break;
case PART_DRAW_BB:
if(create_cdata)
- cdata = MEM_callocN(tot_vec_size * 4, "particle_cdata");
- vdata = MEM_callocN(tot_vec_size * 4, "particle_vdata");
- ndata = MEM_callocN(tot_vec_size * 4, "particle_vdata");
+ if(!pdd->cdata) pdd->cdata = MEM_callocN(tot_vec_size * 4, "particle_cdata");
+ if(!pdd->vdata) pdd->vdata = MEM_callocN(tot_vec_size * 4, "particle_vdata");
+ if(!pdd->ndata) pdd->ndata = MEM_callocN(tot_vec_size * 4, "particle_vdata");
break;
default:
if(create_cdata)
- cdata=MEM_callocN(tot_vec_size, "particle_cdata");
- vdata=MEM_callocN(tot_vec_size, "particle_vdata");
+ if(!pdd->cdata) pdd->cdata=MEM_callocN(tot_vec_size, "particle_cdata");
+ if(!pdd->vdata) pdd->vdata=MEM_callocN(tot_vec_size, "particle_vdata");
}
}
- if(part->draw & PART_DRAW_VEL && draw_as != PART_DRAW_LINE)
- vedata = MEM_callocN(tot_vec_size * 2, "particle_vedata");
+ if(part->draw & PART_DRAW_VEL && draw_as != PART_DRAW_LINE) {
+ if(!pdd->vedata) pdd->vedata = MEM_callocN(tot_vec_size * 2, "particle_vedata");
+ need_v = 1;
+ }
- vd=vdata;
- ved=vedata;
- cd=cdata;
- nd=ndata;
+ pdd->vd= pdd->vdata;
+ pdd->ved= pdd->vedata;
+ pdd->cd= pdd->cdata;
+ pdd->nd= pdd->ndata;
+ pdd->tot_vec_size= tot_vec_size;
- psys->lattice= psys_get_lattice(scene, ob, psys);
+ psys->lattice= psys_get_lattice(&sim);
}
if(draw_as){
/* 5. */
- for(a=0,pa=pars; a<totpart+totchild; a++, pa++){
+ if((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 */
+ }
+ else for(a=0,pa=pars; a<totpart+totchild; a++, pa++){
/* setup per particle individual stuff */
if(a<totpart){
if(totchild && (part->draw&PART_DRAW_PARENT)==0) continue;
if(pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST) continue;
pa_time=(cfra-pa->time)/pa->lifetime;
+ pa_birthtime=pa->time;
+ pa_dietime = pa->dietime;
pa_size=pa->size;
+ if(part->phystype==PART_PHYS_BOIDS)
+ pa_health = pa->boid->data.health;
+ else
+ pa_health = -1.0;
- if((part->flag&PART_ABS_TIME)==0){
-#if 0 // XXX old animation system
+#if 0 // XXX old animation system
+ if((part->flag&PART_ABS_TIME)==0){
if(ma && ma->ipo){
IpoCurve *icu;
@@ -3206,19 +3363,20 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
pa_size = icu->curval;
}
}
-#endif // XXX old animation system
}
+#endif // XXX old animation system
- r_tilt=1.0f+pa->r_ave[0];
+ r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
+ r_length = PSYS_FRAND(a + 22);
}
else{
ChildParticle *cpa= &psys->child[a-totpart];
- pa_time=psys_get_child_time(psys,cpa,cfra);
+ 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 && ma->ipo){
-#if 0 // XXX old animation system
IpoCurve *icu;
/* correction for lifetime */
@@ -3232,154 +3390,88 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
else if(icu->adrcode == MA_COL_B)
ma_b = icu->curval;
}
-#endif // XXX old animation system
}
}
+#endif // XXX old animation system
pa_size=psys_get_child_size(psys,cpa,cfra,0);
- r_tilt=2.0f*cpa->rand[2];
+ pa_health = -1.0;
+
+ r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
+ r_length = PSYS_FRAND(a + 22);
}
if(draw_as!=PART_DRAW_PATH){
- state.time=cfra;
- if(psys_get_particle_state(scene,ob,psys,a,&state,0)){
- if(psys->parent)
- Mat4MulVecfl(psys->parent->obmat, state.co);
-
- /* create actiual particle data */
- switch(draw_as){
- case PART_DRAW_DOT:
- if(vd){
- VECCOPY(vd,state.co) vd+=3;
- }
- if(cd) {
- cd[0]=ma_r;
- cd[1]=ma_g;
- cd[2]=ma_b;
- cd+=3;
- }
- break;
- case PART_DRAW_CROSS:
- case PART_DRAW_AXIS:
- vec[0]=2.0f*pixsize;
- vec[1]=vec[2]=0.0;
- QuatMulVecf(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;
- cd+=18;
-
- VECCOPY(vec2,state.co);
- }
- else {
- if(cd) {
- cd[0]=cd[3]=cd[6]=cd[9]=cd[12]=cd[15]=ma_r;
- cd[1]=cd[4]=cd[7]=cd[10]=cd[13]=cd[16]=ma_g;
- cd[2]=cd[5]=cd[8]=cd[11]=cd[14]=cd[17]=ma_b;
- cd+=18;
- }
- VECSUB(vec2,state.co,vec);
- }
+ drawn = 0;
+ if(part->draw_as == PART_DRAW_REND && part->trail_count > 1) {
+ float length = part->path_end * (1.0 - part->randlength * r_length);
+ int trail_count = part->trail_count * (1.0 - part->randlength * r_length);
+ float ct = ((part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time) - length;
+ float dt = length / (trail_count ? (float)trail_count : 1.0f);
+ int i=0;
+
+ ct+=dt;
+ for(i=0; i < trail_count; i++, ct += dt) {
+ if(part->draw & PART_ABS_PATH_TIME) {
+ if(ct < pa_birthtime || ct > pa_dietime)
+ continue;
+ }
+ else if(ct < 0.0f || ct > 1.0f)
+ continue;
- VECADD(vec,state.co,vec);
- VECCOPY(vd,vec); vd+=3;
- VECCOPY(vd,vec2); vd+=3;
-
- vec[1]=2.0f*pixsize;
- vec[0]=vec[2]=0.0;
- QuatMulVecf(state.rot,vec);
- if(draw_as==PART_DRAW_AXIS){
- VECCOPY(vec2,state.co);
- }
- else VECSUB(vec2,state.co,vec);
-
- VECADD(vec,state.co,vec);
- VECCOPY(vd,vec); vd+=3;
- VECCOPY(vd,vec2); vd+=3;
-
- vec[2]=2.0f*pixsize;
- vec[0]=vec[1]=0.0;
- QuatMulVecf(state.rot,vec);
- if(draw_as==PART_DRAW_AXIS){
- VECCOPY(vec2,state.co);
- }
- else VECSUB(vec2,state.co,vec);
-
- VECADD(vec,state.co,vec);
-
- VECCOPY(vd,vec); vd+=3;
- VECCOPY(vd,vec2); vd+=3;
- break;
- case PART_DRAW_LINE:
- VECCOPY(vec,state.vel);
- Normalize(vec);
- if(part->draw & PART_DRAW_VEL_LENGTH)
- VecMulf(vec,VecLength(state.vel));
- VECADDFAC(vd,state.co,vec,-part->draw_line[0]); vd+=3;
- VECADDFAC(vd,state.co,vec,part->draw_line[1]); vd+=3;
- if(cd) {
- cd[0]=cd[3]=ma_r;
- cd[1]=cd[4]=ma_g;
- cd[2]=cd[5]=ma_b;
- cd+=3;
- }
- break;
- case PART_DRAW_CIRC:
- if(create_cdata)
- glColor3f(ma_r,ma_g,ma_b);
- drawcircball(GL_LINE_LOOP, state.co, pixsize, imat);
- break;
- case PART_DRAW_BB:
- if(cd) {
- cd[0]=cd[3]=cd[6]=cd[9]=ma_r;
- cd[1]=cd[4]=cd[7]=cd[10]=ma_g;
- cd[2]=cd[5]=cd[8]=cd[11]=ma_b;
- cd+=12;
- }
+ state.time = (part->draw & PART_ABS_PATH_TIME) ? -ct : -(pa_birthtime + ct * (pa_dietime - pa_birthtime));
+ psys_get_particle_on_path(&sim,a,&state,need_v);
+
+ if(psys->parent)
+ Mat4MulVecfl(psys->parent->obmat, state.co);
+ /* create actiual particle data */
+ if(draw_as == PART_DRAW_BB) {
bb.size = pa_size;
bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
- bb.time = pa_time;
- VECCOPY(bb.vec, state.co);
- VECCOPY(bb.vel, state.vel);
-
- psys_make_billboard(&bb, xvec, yvec, zvec, bb_center);
-
- VECADD(vd,bb_center,xvec);
- VECADD(vd,vd,yvec); vd+=3;
+ bb.time = ct;
+ }
- VECSUB(vd,bb_center,xvec);
- VECADD(vd,vd,yvec); vd+=3;
+ draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, psys->pdd);
- VECSUB(vd,bb_center,xvec);
- VECSUB(vd,vd,yvec); vd+=3;
+ totpoint++;
+ drawn = 1;
+ }
+ }
+ else
+ {
+ state.time=cfra;
+ if(psys_get_particle_state(&sim,a,&state,0)){
+ if(psys->parent)
+ Mat4MulVecfl(psys->parent->obmat, state.co);
+
+ /* create actiual particle data */
+ if(draw_as == PART_DRAW_BB) {
+ bb.size = pa_size;
+ bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
+ bb.time = pa_time;
+ }
- VECADD(vd,bb_center,xvec);
- VECSUB(vd,vd,yvec); vd+=3;
+ draw_particle(&state, draw_as, part->draw, pixsize, imat, part->draw_line, &bb, pdd);
- VECCOPY(nd, zvec); nd+=3;
- VECCOPY(nd, zvec); nd+=3;
- VECCOPY(nd, zvec); nd+=3;
- VECCOPY(nd, zvec); nd+=3;
- break;
+ totpoint++;
+ drawn = 1;
}
+ }
- totpoint++;
-
+ if(drawn) {
/* additional things to draw for each particle */
/* (velocity, size and number) */
- if(vedata){
- VECCOPY(ved,state.co);
- ved+=3;
+ if(pdd->vedata){
+ VECCOPY(pdd->ved,state.co);
+ pdd->ved+=3;
VECCOPY(vel,state.vel);
VecMulf(vel,timestep);
- VECADD(ved,state.co,vel);
- ved+=3;
+ VECADD(pdd->ved,state.co,vel);
+ pdd->ved+=3;
+
+ totve++;
}
if(part->draw & PART_DRAW_SIZE){
@@ -3388,10 +3480,20 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
setlinestyle(0);
}
- if(part->draw&PART_DRAW_NUM && !(G.f & G_RENDER_SHADOW)){
+ if((part->draw&PART_DRAW_NUM || part->draw&PART_DRAW_HEALTH) && !(G.f & G_RENDER_SHADOW)){
+ val[0]= '\0';
+
+ if(part->draw&PART_DRAW_NUM)
+ sprintf(val, " %i", a);
+
+ if(part->draw&PART_DRAW_NUM && part->draw&PART_DRAW_HEALTH)
+ sprintf(val, "%s:", val);
+
+ if(part->draw&PART_DRAW_HEALTH && a < totpart && part->phystype==PART_PHYS_BOIDS)
+ sprintf(val, "%s %.2f", val, pa_health);
+
/* in path drawing state.co is the end point */
- sprintf(val," %i",a);
- view3d_object_text_draw_add(state.co[0], state.co[1], state.co[2], val, 0);
+ view3d_cached_text_draw_add(state.co[0], state.co[1], state.co[2], val, 0);
}
}
}
@@ -3408,7 +3510,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glEnableClientState(GL_VERTEX_ARRAY);
/* setup gl flags */
- if(dt > OB_WIRE) {
+ if(ob_dt > OB_WIRE) {
glEnableClientState(GL_NORMAL_ARRAY);
if(part->draw&PART_DRAW_MAT_COL)
@@ -3436,7 +3538,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(path->steps > 0) {
glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
- if(dt > OB_WIRE) {
+ if(ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
if(part->draw&PART_DRAW_MAT_COL)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
@@ -3452,7 +3554,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
path=cache[a];
glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
- if(dt > OB_WIRE) {
+ if(ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
if(part->draw&PART_DRAW_MAT_COL)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
@@ -3463,7 +3565,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
/* restore & clean up */
- if(dt > OB_WIRE) {
+ if(ob_dt > OB_WIRE) {
if(part->draw&PART_DRAW_MAT_COL)
glDisable(GL_COLOR_ARRAY);
glDisable(GL_COLOR_MATERIAL);
@@ -3479,16 +3581,17 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glDisableClientState(GL_COLOR_ARRAY);
/* setup created data arrays */
- if(vdata){
+ if(pdd->vdata){
glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, vdata);
+ glVertexPointer(3, GL_FLOAT, 0, pdd->vdata);
}
else
glDisableClientState(GL_VERTEX_ARRAY);
- if(ndata && dt>OB_WIRE){
+ /* billboards are drawn this way */
+ if(pdd->ndata && ob_dt>OB_WIRE){
glEnableClientState(GL_NORMAL_ARRAY);
- glNormalPointer(GL_FLOAT, 0, ndata);
+ glNormalPointer(GL_FLOAT, 0, pdd->ndata);
glEnable(GL_LIGHTING);
}
else{
@@ -3496,9 +3599,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glDisable(GL_LIGHTING);
}
- if(cdata){
+ if(pdd->cdata){
glEnableClientState(GL_COLOR_ARRAY);
- glColorPointer(3, GL_FLOAT, 0, cdata);
+ glColorPointer(3, GL_FLOAT, 0, pdd->cdata);
}
/* draw created data arrays */
@@ -3511,7 +3614,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glDrawArrays(GL_LINES, 0, 2*totpoint);
break;
case PART_DRAW_BB:
- if(dt<=OB_WIRE)
+ if(ob_dt<=OB_WIRE)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glDrawArrays(GL_QUADS, 0, 4*totpoint);
@@ -3520,16 +3623,19 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glDrawArrays(GL_POINTS, 0, totpoint);
break;
}
+
+ pdd->flag |= PARTICLE_DRAW_DATA_UPDATED;
+ pdd->totpoint = totpoint;
}
- if(vedata){
+ if(pdd->vedata){
glDisableClientState(GL_COLOR_ARRAY);
cpack(0xC0C0C0);
glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, vedata);
+ glVertexPointer(3, GL_FLOAT, 0, pdd->vedata);
- glDrawArrays(GL_LINES, 0, 2*totpoint);
+ glDrawArrays(GL_LINES, 0, 2*totve);
}
glPolygonMode(GL_FRONT, polygonmode[0]);
@@ -3544,14 +3650,6 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(states)
MEM_freeN(states);
- if(vdata)
- MEM_freeN(vdata);
- if(vedata)
- MEM_freeN(vedata);
- if(cdata)
- MEM_freeN(cdata);
- if(ndata)
- MEM_freeN(ndata);
psys->flag &= ~PSYS_DRAWING;
@@ -3560,44 +3658,40 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
psys->lattice= NULL;
}
- wmLoadMatrix(rv3d->viewmat);
- wmMultMatrix(ob->obmat); // bring back local matrix for dtx
+ if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) )
+ wmLoadMatrix(rv3d->viewmat);
}
-static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, ParticleSystem *psys, int dt)
+static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, PTCacheEdit *edit, int dt)
{
- ParticleEdit *edit = psys->edit;
- ParticleData *pa;
- ParticleCacheKey **path;
- ParticleEditKey *key;
+ ParticleCacheKey **cache, *path, *pkey;
+ PTCacheEditPoint *point;
+ PTCacheEditKey *key;
ParticleEditSettings *pset = PE_settings(scene);
- int i, k, totpart = psys->totpart, totchild=0, timed = pset->draw_timed;
+ int i, k, totpoint = edit->totpoint, timed = pset->flag & PE_FADE_TIME ? pset->fade_frames : 0;
+ int steps;
char nosel[4], sel[4];
float sel_col[3];
float nosel_col[3];
- char val[32];
+ float *pathcol = NULL, *pcol;
+
+
+ if(edit->psys && edit->psys->flag & PSYS_HAIR_UPDATED)
+ PE_update_object(scene, ob, 0);
/* create path and child path cache if it doesn't exist already */
- if(psys->pathcache==0){
- PE_hide_keys_time(scene, psys,CFRA);
- psys_cache_paths(scene, ob, psys, CFRA,0);
- }
- if(psys->pathcache==0)
+ if(edit->pathcache==0)
+ psys_cache_edit_paths(scene, ob, edit, CFRA);
+
+ if(edit->pathcache==0)
return;
- if(pset->flag & PE_SHOW_CHILD && psys->part->draw_as == PART_DRAW_PATH) {
- if(psys->childcache==0)
- psys_cache_child_paths(scene, ob, psys, CFRA, 0);
- }
- else if(!(pset->flag & PE_SHOW_CHILD) && psys->childcache)
- free_child_path_cache(psys);
+ PE_hide_keys_time(scene, edit, CFRA);
/* opengl setup */
if((v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
- wmLoadMatrix(rv3d->viewmat);
-
/* get selection theme colors */
UI_GetThemeColor3ubv(TH_VERTEX_SELECT, sel);
UI_GetThemeColor3ubv(TH_VERTEX, nosel);
@@ -3608,129 +3702,115 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob
nosel_col[1]=(float)nosel[1]/255.0f;
nosel_col[2]=(float)nosel[2]/255.0f;
- if(psys->childcache)
- totchild = psys->totchildcache;
-
/* draw paths */
- if(timed)
+ if(timed) {
glEnable(GL_BLEND);
+ steps = (*edit->pathcache)->steps + 1;
+ pathcol = MEM_callocN(steps*4*sizeof(float), "particle path color data");
+ }
glEnableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
- if(dt > OB_WIRE) {
- /* solid shaded with lighting */
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
+ glEnable(GL_COLOR_MATERIAL);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
- glEnable(GL_COLOR_MATERIAL);
- glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
- }
- else {
- /* flat wire color */
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisable(GL_LIGHTING);
- UI_ThemeColor(TH_WIRE);
- }
+ cache=edit->pathcache;
+ for(i=0; i<totpoint; i++){
+ path = cache[i];
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
- /* only draw child paths with lighting */
- if(dt > OB_WIRE)
- glEnable(GL_LIGHTING);
-
- if(psys->part->draw_as == PART_DRAW_PATH) {
- for(i=0, path=psys->childcache; i<totchild; i++,path++){
- glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co);
- if(dt > OB_WIRE) {
- glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel);
- glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col);
+ if(timed) {
+ for(k=0, pcol=pathcol, pkey=path; k<steps; k++, pkey++, pcol+=4){
+ VECCOPY(pcol, pkey->col);
+ pcol[3] = 1.0f - fabs((float)CFRA - pkey->time)/(float)pset->fade_frames;
}
- glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1);
+ glColorPointer(4, GL_FLOAT, 4*sizeof(float), pathcol);
}
- }
-
- if(dt > OB_WIRE)
- glDisable(GL_LIGHTING);
+ else
+ glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
- if(pset->brushtype == PE_BRUSH_WEIGHT) {
- glLineWidth(2.0f);
- glEnableClientState(GL_COLOR_ARRAY);
- glDisable(GL_LIGHTING);
+ glDrawArrays(GL_LINE_STRIP, 0, path->steps + 1);
}
- /* draw parents last without lighting */
- for(i=0, pa=psys->particles, path = psys->pathcache; i<totpart; i++, pa++, path++){
- glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co);
- if(dt > OB_WIRE)
- glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel);
- if(dt > OB_WIRE || pset->brushtype == PE_BRUSH_WEIGHT)
- glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col);
+ if(pathcol) { MEM_freeN(pathcol); pathcol = pcol = NULL; }
- glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1);
- }
/* draw edit vertices */
if(pset->selectmode!=SCE_SELECT_PATH){
- glDisableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glDisable(GL_LIGHTING);
glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
if(pset->selectmode==SCE_SELECT_POINT){
+ float *pd=0,*pdata=0;
float *cd=0,*cdata=0;
- cd=cdata=MEM_callocN(edit->totkeys*(timed?4:3)*sizeof(float), "particle edit color data");
+ int totkeys = 0;
+
+ for (i=0, point=edit->points; i<totpoint; i++, point++)
+ if(!(point->flag & PEP_HIDE))
+ totkeys += point->totkey;
+
+ if(!(edit->points->keys->flag & PEK_USE_WCO))
+ pd=pdata=MEM_callocN(totkeys*3*sizeof(float), "particle edit point data");
+ cd=cdata=MEM_callocN(totkeys*(timed?4:3)*sizeof(float), "particle edit color data");
+
+ for(i=0, point=edit->points; i<totpoint; i++, point++){
+ if(point->flag & PEP_HIDE)
+ continue;
+
+ for(k=0, key=point->keys; k<point->totkey; k++, key++){
+ if(pd) {
+ VECCOPY(pd, key->co);
+ pd += 3;
+ }
- for(i=0, pa=psys->particles; i<totpart; i++, pa++){
- for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++){
if(key->flag&PEK_SELECT){
VECCOPY(cd,sel_col);
}
else{
VECCOPY(cd,nosel_col);
}
+
if(timed)
- *(cd+3) = (key->flag&PEK_HIDE)?0.0f:1.0f;
+ *(cd+3) = 1.0f - fabs((float)CFRA - *key->time)/(float)pset->fade_frames;
+
cd += (timed?4:3);
}
}
cd=cdata;
- for(i=0, pa=psys->particles; i<totpart; i++, pa++){
- if((pa->flag & PARS_HIDE)==0){
- glVertexPointer(3, GL_FLOAT, sizeof(ParticleEditKey), edit->keys[i]->world_co);
- glColorPointer((timed?4:3), GL_FLOAT, (timed?4:3)*sizeof(float), cd);
- glDrawArrays(GL_POINTS, 0, pa->totkey);
- }
- cd += (timed?4:3) * pa->totkey;
+ pd=pdata;
+ for(i=0, point=edit->points; i<totpoint; i++, point++){
+ if(point->flag & PEP_HIDE)
+ continue;
- if((pset->flag&PE_SHOW_TIME) && (pa->flag&PARS_HIDE)==0 && !(G.f & G_RENDER_SHADOW)){
- for(k=0, key=edit->keys[i]+k; k<pa->totkey; k++, key++){
- if(key->flag & PEK_HIDE) continue;
+ if(point->keys->flag & PEK_USE_WCO)
+ glVertexPointer(3, GL_FLOAT, sizeof(PTCacheEditKey), point->keys->world_co);
+ else
+ glVertexPointer(3, GL_FLOAT, 3*sizeof(float), pd);
- sprintf(val," %.1f",*key->time);
- view3d_object_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0);
- }
- }
+ glColorPointer((timed?4:3), GL_FLOAT, (timed?4:3)*sizeof(float), cd);
+
+ glDrawArrays(GL_POINTS, 0, point->totkey);
+
+ pd += pd ? 3 * point->totkey : 0;
+ cd += (timed?4:3) * point->totkey;
}
- if(cdata)
- MEM_freeN(cdata);
- cd=cdata=0;
+ if(pdata) { MEM_freeN(pdata); pd=pdata=0; }
+ if(cdata) { MEM_freeN(cdata); cd=cdata=0; }
}
else if(pset->selectmode == SCE_SELECT_END){
- for(i=0, pa=psys->particles; i<totpart; i++, pa++){
- if((pa->flag & PARS_HIDE)==0){
- key = edit->keys[i] + pa->totkey - 1;
+ for(i=0, point=edit->points; i<totpoint; i++, point++){
+ if((point->flag & PEP_HIDE)==0){
+ key = point->keys + point->totkey - 1;
if(key->flag & PEK_SELECT)
glColor3fv(sel_col);
else
glColor3fv(nosel_col);
/* has to be like this.. otherwise selection won't work, have try glArrayElement later..*/
glBegin(GL_POINTS);
- glVertex3fv(key->world_co);
+ glVertex3fv(key->flag & PEK_USE_WCO ? key->world_co : key->co);
glEnd();
-
- if((pset->flag & PE_SHOW_TIME) && !(G.f & G_RENDER_SHADOW)){
- sprintf(val," %.1f",*key->time);
- view3d_object_text_draw_add(key->world_co[0], key->world_co[1], key->world_co[2], val, 0);
- }
}
}
}
@@ -3744,25 +3824,24 @@ static void draw_particle_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Ob
glEnable(GL_DEPTH_TEST);
glLineWidth(1.0f);
- wmMultMatrix(ob->obmat); // bring back local matrix for dtx
glPointSize(1.0);
}
unsigned int nurbcol[8]= {
0, 0x9090, 0x409030, 0x603080, 0, 0x40fff0, 0x40c033, 0xA090F0 };
-static void tekenhandlesN(Nurb *nu, short sel)
+static void tekenhandlesN(Nurb *nu, short sel, short hide_handles)
{
BezTriple *bezt;
float *fp;
unsigned int *col;
int a;
- if(nu->hide || (G.f & G_HIDDENHANDLES)) return;
+ if(nu->hide || hide_handles) return;
glBegin(GL_LINES);
- if( (nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
if(sel) col= nurbcol+4;
else col= nurbcol;
@@ -3802,7 +3881,7 @@ static void tekenhandlesN(Nurb *nu, short sel)
glEnd();
}
-static void tekenvertsN(Nurb *nu, short sel)
+static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
{
BezTriple *bezt;
BPoint *bp;
@@ -3819,13 +3898,13 @@ static void tekenvertsN(Nurb *nu, short sel)
bglBegin(GL_POINTS);
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
- if (G.f & G_HIDDENHANDLES) {
+ if (hide_handles) {
if((bezt->f2 & SELECT)==sel) bglVertex3fv(bezt->vec[1]);
} else {
if((bezt->f1 & SELECT)==sel) bglVertex3fv(bezt->vec[0]);
@@ -3860,7 +3939,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
nu= nurb;
while(nu) {
if(nu->hide==0) {
- switch(nu->type & 7) {
+ switch(nu->type) {
case CU_POLY:
cpack(nurbcol[3]);
bp= nu->bp;
@@ -3957,6 +4036,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
Curve *cu = ob->data;
Nurb *nu;
BevList *bl;
+ short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
// XXX retopo_matrix_update(v3d);
@@ -3968,23 +4048,25 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* first non-selected handles */
for(nu=nurb; nu; nu=nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
- tekenhandlesN(nu, 0);
+ if(nu->type == CU_BEZIER) {
+ tekenhandlesN(nu, 0, hide_handles);
}
}
draw_editnurb(ob, nurb, 0);
draw_editnurb(ob, nurb, 1);
/* selected handles */
for(nu=nurb; nu; nu=nu->next) {
- if((nu->type & 7)==1) tekenhandlesN(nu, 1);
- tekenvertsN(nu, 0);
+ if(nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES)==0)
+ tekenhandlesN(nu, 1, hide_handles);
+ tekenvertsN(nu, 0, hide_handles);
}
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
/* direction vectors for 3d curve paths
when at its lowest, dont render normals */
- if(cu->flag & CU_3D && ts->normalsize > 0.0015) {
+ if(cu->flag & CU_3D && ts->normalsize > 0.0015 && (cu->drawflag & CU_HIDE_NORMALS)==0) {
+
UI_ThemeColor(TH_WIRE);
for (bl=cu->bev.first,nu=nurb; nu && bl; bl=bl->next,nu=nu->next) {
BevPoint *bevp= (BevPoint *)(bl+1);
@@ -3993,21 +4075,21 @@ 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 ox,oy,oz; // Offset perpendicular to the curve
- float dx,dy,dz; // Delta along the curve
+ float vec_a[3] = { fac,0, 0}; // Offset perpendicular to the curve
+ float vec_b[3] = {-fac,0, 0}; // Delta along the curve
+
+ QuatMulVecf(bevp->quat, vec_a);
+ QuatMulVecf(bevp->quat, vec_b);
+ VecAddf(vec_a, vec_a, bevp->vec);
+ VecAddf(vec_b, vec_b, bevp->vec);
- ox = fac*bevp->mat[0][0];
- oy = fac*bevp->mat[0][1];
- oz = fac*bevp->mat[0][2];
-
- dx = fac*bevp->mat[2][0];
- dy = fac*bevp->mat[2][1];
- dz = fac*bevp->mat[2][2];
+ VECSUBFAC(vec_a, vec_a, bevp->dir, fac);
+ VECSUBFAC(vec_b, vec_b, bevp->dir, fac);
glBegin(GL_LINE_STRIP);
- glVertex3f(bevp->x - ox - dx, bevp->y - oy - dy, bevp->z - oz - dz);
- glVertex3f(bevp->x, bevp->y, bevp->z);
- glVertex3f(bevp->x + ox - dx, bevp->y + oy - dy, bevp->z + oz - dz);
+ glVertex3fv(vec_a);
+ glVertex3fv(bevp->vec);
+ glVertex3fv(vec_b);
glEnd();
bevp += skip+1;
@@ -4019,7 +4101,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
for(nu=nurb; nu; nu=nu->next) {
- tekenvertsN(nu, 1);
+ tekenvertsN(nu, 1, hide_handles);
}
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -4268,7 +4350,7 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(ml==NULL) return 1;
/* in case solid draw, reset wire colors */
- if(mb->editelems && (ob->flag & SELECT)) {
+ if(ob->flag & SELECT) {
if(ob==OBACT) UI_ThemeColor(TH_ACTIVE);
else UI_ThemeColor(TH_SELECT);
}
@@ -4410,13 +4492,13 @@ static void draw_forcefield(Scene *scene, Object *ob)
/*path end*/
setlinestyle(3);
- where_on_path(ob, 1.0f, guidevec1, guidevec2);
+ where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL);
UI_ThemeColorBlend(curcol, TH_BACK, 0.5);
drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat);
/*path beginning*/
setlinestyle(0);
- where_on_path(ob, 0.0f, guidevec1, guidevec2);
+ where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL);
UI_ThemeColorBlend(curcol, TH_BACK, 0.5);
drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat);
@@ -4626,8 +4708,9 @@ static void drawtexspace(Object *ob)
}
/* draws wire outline */
-static void drawSolidSelect(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base)
+static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
+ RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
glLineWidth(2.0);
@@ -4645,8 +4728,8 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base
drawDispListwire(&ob->disp);
}
else if(ob->type==OB_ARMATURE) {
- if(!(ob->flag & OB_POSEMODE))
- draw_armature(scene, v3d, rv3d, base, OB_WIRE, 0);
+ if(!(ob->mode & OB_MODE_POSE))
+ draw_armature(scene, v3d, ar, base, OB_WIRE, 0);
}
glLineWidth(1.0);
@@ -4756,11 +4839,11 @@ void drawRBpivot(bRigidBodyJointConstraint *data)
glVertex3fv(v);
glEnd();
if (axis==0)
- view3d_object_text_draw_add(v[0], v[1], v[2], "px", 0);
+ view3d_cached_text_draw_add(v[0], v[1], v[2], "px", 0);
else if (axis==1)
- view3d_object_text_draw_add(v[0], v[1], v[2], "py", 0);
+ view3d_cached_text_draw_add(v[0], v[1], v[2], "py", 0);
else
- view3d_object_text_draw_add(v[0], v[1], v[2], "pz", 0);
+ view3d_cached_text_draw_add(v[0], v[1], v[2], "pz", 0);
}
glLineWidth (1.0f);
setlinestyle(0);
@@ -4770,6 +4853,7 @@ void drawRBpivot(bRigidBodyJointConstraint *data)
void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{
static int warning_recursive= 0;
+ ModifierData *md = NULL;
Object *ob;
Curve *cu;
RegionView3D *rv3d= ar->regiondata;
@@ -4793,7 +4877,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* xray delay? */
if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
/* don't do xray in particle mode, need the z-buffer */
- if(!(G.f & G_PARTICLEEDIT)) {
+ if(!(ob->mode & OB_MODE_PARTICLE_EDIT)) {
/* xray and transp are set when it is drawing the 2nd/3rd pass */
if(!v3d->xray && !v3d->transp && (ob->dtx & OB_DRAWXRAY) && !(ob->dtx & OB_DRAWTRANSP)) {
add_view3d_after(v3d, base, V3D_XRAY, flag);
@@ -4802,6 +4886,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
+ /* no return after this point, otherwise leaks */
+ view3d_cached_text_draw_begin();
+
/* draw keys? */
#if 0 // XXX old animation system
if(base==(scene->basact) || (base->flag & (SELECT+BA_WAS_SEL))) {
@@ -4880,6 +4967,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* patch? children objects with a timeoffs change the parents. How to solve! */
/* if( ((int)ob->ctime) != F_(scene->r.cfra)) where_is_object(scene, ob); */
+
+ /* draw paths... */
+ // TODO...
/* multiply view with object matrix */
wmMultMatrix(ob->obmat);
@@ -4939,7 +5029,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
dtx= 0;
/* faceselect exception: also draw solid when dt==wire, except in editmode */
- if(ob==OBACT && (G.f & (G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT))) {
+ if(ob==OBACT && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
if(ob->type==OB_MESH) {
if(ob==scene->obedit);
@@ -4983,7 +5073,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(dt>OB_WIRE && dt<OB_TEXTURE && ob!=scene->obedit && (flag && DRAW_SCENESET)==0) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
- drawSolidSelect(scene, v3d, rv3d, base);
+ drawSolidSelect(scene, v3d, ar, base);
}
}
}
@@ -5129,7 +5219,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
break;
case OB_ARMATURE:
if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material
- empty_object= draw_armature(scene, v3d, rv3d, base, dt, flag);
+ empty_object= draw_armature(scene, v3d, ar, base, dt, flag);
if(dt>OB_WIRE) GPU_disable_material();
break;
default:
@@ -5145,19 +5235,142 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
) {
ParticleSystem *psys;
if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */
- glDepthMask(GL_FALSE);
+ //glDepthMask(GL_FALSE);
+
+ wmLoadMatrix(rv3d->viewmat);
+ view3d_cached_text_draw_begin();
+
for(psys=ob->particlesystem.first; psys; psys=psys->next)
draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
- if(G.f & G_PARTICLEEDIT && ob==OBACT) {
- psys= PE_get_current(scene, ob);
- if(psys && !scene->obedit && psys_in_edit_mode(scene, psys))
- draw_particle_edit(scene, v3d, rv3d, ob, psys, dt);
- }
- glDepthMask(GL_TRUE);
+ view3d_cached_text_draw_end(v3d, ar, 0, NULL);
+
+ wmMultMatrix(ob->obmat);
+
+ //glDepthMask(GL_TRUE);
if(col) cpack(col);
}
+
+ if( (warning_recursive==0) &&
+ (flag & DRAW_PICKING)==0 &&
+ (!scene->obedit)
+ ) {
+
+ if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) {
+ PTCacheEdit *edit = PE_get_current(scene, ob);
+ if(edit) {
+ wmLoadMatrix(rv3d->viewmat);
+ draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt);
+ wmMultMatrix(ob->obmat);
+ }
+ }
+ }
+
+ /* draw code for smoke */
+ if((md = modifiers_findByType(ob, eModifierType_Smoke)))
+ {
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+
+ // draw collision objects
+ if((smd->type & MOD_SMOKE_TYPE_COLL) && smd->coll)
+ {
+ /*SmokeCollSettings *scs = smd->coll;
+ if(scs->points)
+ {
+ size_t i;
+
+ wmLoadMatrix(rv3d->viewmat);
+
+ if(col || (ob->flag & SELECT)) cpack(0xFFFFFF);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+
+
+ // glPointSize(3.0);
+ bglBegin(GL_POINTS);
+
+ for(i = 0; i < scs->numpoints; i++)
+ {
+ bglVertex3fv(&scs->points[3*i]);
+ }
+
+ bglEnd();
+ glPointSize(1.0);
+
+ wmMultMatrix(ob->obmat);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ if(col) cpack(col);
+
+ }
+ */
+ }
+
+ // only draw domains
+ if(smd->domain && smd->domain->fluid)
+ {
+ 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);
+ GPU_free_smoke(smd);
+// #endif
+#if 0
+ int x, y, z;
+ float *density = smoke_get_density(smd->domain->fluid);
+
+ wmLoadMatrix(rv3d->viewmat);
+ // wmMultMatrix(ob->obmat);
+
+ if(col || (ob->flag & SELECT)) cpack(0xFFFFFF);
+ glDepthMask(GL_FALSE);
+ glEnable(GL_BLEND);
+
+
+ // glPointSize(3.0);
+ bglBegin(GL_POINTS);
+
+ for(x = 0; x < smd->domain->res[0]; x++)
+ for(y = 0; y < smd->domain->res[1]; y++)
+ for(z = 0; z < smd->domain->res[2]; z++)
+ {
+ float tmp[3];
+ int index = smoke_get_index(x, smd->domain->res[0], y, smd->domain->res[1], z);
+
+ if(density[index] > FLT_EPSILON)
+ {
+ float color[3];
+ VECCOPY(tmp, smd->domain->p0);
+ tmp[0] += smd->domain->dx * x + smd->domain->dx * 0.5;
+ tmp[1] += smd->domain->dx * y + smd->domain->dx * 0.5;
+ tmp[2] += smd->domain->dx * z + smd->domain->dx * 0.5;
+ color[0] = color[1] = color[2] = density[index];
+ glColor3fv(color);
+ bglVertex3fv(tmp);
+ }
+ }
+
+ bglEnd();
+ glPointSize(1.0);
+
+ wmMultMatrix(ob->obmat);
+ glDisable(GL_BLEND);
+ glDepthMask(GL_TRUE);
+ if(col) cpack(col);
+#endif
+ }
+ else if(smd->domain->wt && (smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
+ {
+ 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);
+ GPU_free_smoke(smd);
+ }
+ }
+ }
{
bConstraint *con;
@@ -5183,7 +5396,7 @@ 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_object_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10);
+ view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10);
}
}
/*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
@@ -5206,7 +5419,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* return warning, this is cached text draw */
- view3d_object_text_draw(v3d, ar);
+ view3d_cached_text_draw_end(v3d, ar, 1, NULL);
wmLoadMatrix(rv3d->viewmat);
@@ -5217,7 +5430,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(G.f & G_RENDER_SHADOW) return;
/* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
- if(ob!=OBACT || (G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
+ if(ob!=OBACT || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
int do_draw_center= -1; /* defines below are zero or positive... */
if((scene->basact)==base)
@@ -5497,7 +5710,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
if(dm) {
glsl = draw_glsl_material(scene, ob, v3d, dt);
- GPU_set_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
}
else {
glEnable(GL_COLOR_MATERIAL);
@@ -5511,7 +5724,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
if(dm) {
dm->drawFacesSolid(dm, GPU_enable_material);
- GPU_disable_material();
+ GPU_end_object_materials();
}
else if(edm)
edm->drawMappedFaces(edm, NULL, NULL, 0);
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
new file mode 100644
index 00000000000..ef3627e2b12
--- /dev/null
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -0,0 +1,426 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Daniel Genrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+#include <string.h>
+#include <math.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "IMB_imbuf.h"
+
+
+
+
+#include "DNA_armature_types.h"
+#include "DNA_boid_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_constraint_types.h" // for drawing constraint
+#include "DNA_effect_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_object_fluidsim.h"
+#include "DNA_particle_types.h"
+#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_smoke_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_world_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
+#include "BLI_rand.h"
+
+#include "BKE_anim.h" //for the where_on_path function
+#include "BKE_curve.h"
+#include "BKE_constraint.h" // for the get_constraint_target function
+#include "BKE_DerivedMesh.h"
+#include "BKE_deform.h"
+#include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_font.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_key.h"
+#include "BKE_lattice.h"
+#include "BKE_mesh.h"
+#include "BKE_material.h"
+#include "BKE_mball.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+#include "BKE_property.h"
+#include "BKE_smoke.h"
+#include "BKE_unit.h"
+#include "BKE_utildefines.h"
+#include "smoke_API.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "GPU_draw.h"
+#include "GPU_material.h"
+#include "GPU_extensions.h"
+
+#include "ED_mesh.h"
+#include "ED_particle.h"
+#include "ED_screen.h"
+#include "ED_types.h"
+#include "ED_util.h"
+
+#include "UI_resources.h"
+#include "UI_interface_icons.h"
+
+#include "WM_api.h"
+#include "BLF_api.h"
+
+#include "GPU_extensions.h"
+
+#include "view3d_intern.h" // own include
+
+struct GPUTexture;
+
+int intersect_edges(float *points, float a, float b, float c, float d, float edges[12][2][3])
+{
+ int i;
+ float t;
+ int numpoints = 0;
+
+ for (i=0; i<12; i++) {
+ t = -(a*edges[i][0][0] + b*edges[i][0][1] + c*edges[i][0][2] + d)
+ / (a*edges[i][1][0] + b*edges[i][1][1] + c*edges[i][1][2]);
+ if ((t>0)&&(t<1)) {
+ points[numpoints * 3 + 0] = edges[i][0][0] + edges[i][1][0]*t;
+ points[numpoints * 3 + 1] = edges[i][0][1] + edges[i][1][1]*t;
+ points[numpoints * 3 + 2] = edges[i][0][2] + edges[i][1][2]*t;
+ numpoints++;
+ }
+ }
+ return numpoints;
+}
+
+static int convex(float *p0, float *up, float *a, float *b)
+{
+ // Vec3 va = a-p0, vb = b-p0;
+ float va[3], vb[3], tmp[3];
+ VECSUB(va, a, p0);
+ VECSUB(vb, b, p0);
+ Crossf(tmp, va, vb);
+ return INPR(up, tmp) >= 0;
+}
+
+// copied from gpu_extension.c
+static int is_pow2(int n)
+{
+ return ((n)&(n-1))==0;
+}
+
+static int larger_pow2(int n)
+{
+ if (is_pow2(n))
+ return n;
+
+ while(!is_pow2(n))
+ n= n&(n-1);
+
+ 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)
+{
+ RegionView3D *rv3d= ar->regiondata;
+
+ float viewnormal[3];
+ int i, j, n;
+ float d, d0, dd;
+ float *points = NULL;
+ int numpoints = 0;
+ float cor[3] = {1.,1.,1.};
+ int gl_depth = 0, gl_blend = 0;
+
+ /* draw slices of smoke is adapted from c++ code authored by: Johannes Schmid and Ingemar Rask, 2006, johnny@grob.org */
+ float cv[][3] = {
+ {1.0f, 1.0f, 1.0f}, {-1.0f, 1.0f, 1.0f}, {-1.0f, -1.0f, 1.0f}, {1.0f, -1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f}, {-1.0f, 1.0f, -1.0f}, {-1.0f, -1.0f, -1.0f}, {1.0f, -1.0f, -1.0f}
+ };
+
+ // edges have the form edges[n][0][xyz] + t*edges[n][1][xyz]
+ float edges[12][2][3] = {
+ {{1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+ {{-1.0f, 1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+ {{-1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+ {{1.0f, -1.0f, -1.0f}, {0.0f, 0.0f, 2.0f}},
+
+ {{1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
+ {{-1.0f, -1.0f, 1.0f}, {0.0f, 2.0f, 0.0f}},
+ {{-1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
+ {{1.0f, -1.0f, -1.0f}, {0.0f, 2.0f, 0.0f}},
+
+ {{-1.0f, 1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
+ {{-1.0f, -1.0f, 1.0f}, {2.0f, 0.0f, 0.0f}},
+ {{-1.0f, -1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}},
+ {{-1.0f, 1.0f, -1.0f}, {2.0f, 0.0f, 0.0f}}
+ };
+
+ /* Fragment program to calculate the 3dview of smoke */
+ /* using 2 textures, density and shadow */
+ const char *text = "!!ARBfp1.0\n"
+ "PARAM dx = program.local[0];\n"
+ "PARAM darkness = program.local[1];\n"
+ "PARAM f = {1.442695041, 1.442695041, 1.442695041, 0.01};\n"
+ "TEMP temp, shadow, value;\n"
+ "TEX temp, fragment.texcoord[0], texture[0], 3D;\n"
+ "TEX shadow, fragment.texcoord[0], texture[1], 3D;\n"
+ "MUL value, temp, darkness;\n"
+ "MUL value, value, dx;\n"
+ "MUL value, value, f;\n"
+ "EX2 temp, -value.r;\n"
+ "SUB temp.a, 1.0, temp.r;\n"
+ "MUL temp.r, temp.r, shadow.r;\n"
+ "MUL temp.g, temp.g, shadow.r;\n"
+ "MUL temp.b, temp.b, shadow.r;\n"
+ "MOV result.color, temp;\n"
+ "END\n";
+ GLuint prog;
+
+
+ float size[3];
+
+ VECSUB(size, max, min);
+
+ // maxx, maxy, maxz
+ cv[0][0] = max[0];
+ cv[0][1] = max[1];
+ cv[0][2] = max[2];
+ // minx, maxy, maxz
+ cv[1][0] = min[0];
+ cv[1][1] = max[1];
+ cv[1][2] = max[2];
+ // minx, miny, maxz
+ cv[2][0] = min[0];
+ cv[2][1] = min[1];
+ cv[2][2] = max[2];
+ // maxx, miny, maxz
+ cv[3][0] = max[0];
+ cv[3][1] = min[1];
+ cv[3][2] = max[2];
+
+ // maxx, maxy, minz
+ cv[4][0] = max[0];
+ cv[4][1] = max[1];
+ cv[4][2] = min[2];
+ // minx, maxy, minz
+ cv[5][0] = min[0];
+ cv[5][1] = max[1];
+ cv[5][2] = min[2];
+ // minx, miny, minz
+ cv[6][0] = min[0];
+ cv[6][1] = min[1];
+ cv[6][2] = min[2];
+ // maxx, miny, minz
+ cv[7][0] = max[0];
+ cv[7][1] = min[1];
+ cv[7][2] = min[2];
+
+ VECCOPY(edges[0][0], cv[4]); // maxx, maxy, minz
+ VECCOPY(edges[1][0], cv[5]); // minx, maxy, minz
+ VECCOPY(edges[2][0], cv[6]); // minx, miny, minz
+ VECCOPY(edges[3][0], cv[7]); // maxx, miny, minz
+
+ VECCOPY(edges[4][0], cv[3]); // maxx, miny, maxz
+ VECCOPY(edges[5][0], cv[2]); // minx, miny, maxz
+ VECCOPY(edges[6][0], cv[6]); // minx, miny, minz
+ VECCOPY(edges[7][0], cv[7]); // maxx, miny, minz
+
+ VECCOPY(edges[8][0], cv[1]); // minx, maxy, maxz
+ VECCOPY(edges[9][0], cv[2]); // minx, miny, maxz
+ VECCOPY(edges[10][0], cv[6]); // minx, miny, minz
+ VECCOPY(edges[11][0], cv[5]); // minx, maxy, minz
+
+ // printf("size x: %f, y: %f, z: %f\n", size[0], size[1], size[2]);
+
+ edges[0][1][2] = size[2];
+ edges[1][1][2] = size[2];
+ edges[2][1][2] = size[2];
+ edges[3][1][2] = size[2];
+
+ edges[4][1][1] = size[1];
+ edges[5][1][1] = size[1];
+ edges[6][1][1] = size[1];
+ edges[7][1][1] = size[1];
+
+ edges[8][1][0] = size[0];
+ edges[9][1][0] = size[0];
+ edges[10][1][0] = size[0];
+ edges[11][1][0] = size[0];
+
+ glGetBooleanv(GL_BLEND, (GLboolean *)&gl_blend);
+ glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&gl_depth);
+
+ wmLoadMatrix(rv3d->viewmat);
+ // wmMultMatrix(ob->obmat);
+
+ glDepthMask(GL_FALSE);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ // get view vector
+ VECCOPY(viewnormal, rv3d->viewinv[2]);
+ Normalize(viewnormal);
+
+ // find cube vertex that is closest to the viewer
+ for (i=0; i<8; i++) {
+ float x,y,z;
+
+ x = cv[i][0] + viewnormal[0];
+ y = cv[i][1] + viewnormal[1];
+ z = cv[i][2] + viewnormal[2];
+
+ if ((x>=min[0])&&(x<=max[0])
+ &&(y>=min[1])&&(y<=max[1])
+ &&(z>=min[2])&&(z<=max[2])) {
+ break;
+ }
+ }
+
+ // printf("i: %d\n", i);
+
+ if (GL_TRUE == glewIsSupported("GL_ARB_fragment_program"))
+ {
+ glEnable(GL_FRAGMENT_PROGRAM_ARB);
+ glGenProgramsARB(1, &prog);
+
+ glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
+ glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(text), text);
+
+ // cell spacing
+ glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, dx, dx, dx, 1.0);
+ // custom parameter for smoke style (higher = thicker)
+ glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, 7.0, 7.0, 7.0, 1.0);
+ }
+ else
+ printf("Your gfx card does not support 3dview smoke drawing.\n");
+
+ GPU_texture_bind(tex, 0);
+ if(tex_shadow)
+ GPU_texture_bind(tex_shadow, 1);
+ else
+ printf("No volume shadow\n");
+
+ if (!GLEW_ARB_texture_non_power_of_two) {
+ cor[0] = (float)res[0]/(float)larger_pow2(res[0]);
+ cor[1] = (float)res[1]/(float)larger_pow2(res[1]);
+ cor[2] = (float)res[2]/(float)larger_pow2(res[2]);
+ }
+
+ // our slices are defined by the plane equation a*x + b*y +c*z + d = 0
+ // (a,b,c), the plane normal, are given by viewdir
+ // d is the parameter along the view direction. the first d is given by
+ // inserting previously found vertex into the plane equation
+ d0 = -(viewnormal[0]*cv[i][0] + viewnormal[1]*cv[i][1] + viewnormal[2]*cv[i][2]);
+ dd = 2.0*d0/64.0f;
+ n = 0;
+
+ // printf("d0: %f, dd: %f\n", d0, dd);
+
+ points = MEM_callocN(sizeof(float)*12*3, "smoke_points_preview");
+
+ for (d = d0; d > -d0; d -= dd) {
+ float p0[3];
+ // intersect_edges returns the intersection points of all cube edges with
+ // the given plane that lie within the cube
+ numpoints = intersect_edges(points, viewnormal[0], viewnormal[1], viewnormal[2], d, edges);
+
+ if (numpoints > 2) {
+ VECCOPY(p0, points);
+
+ // sort points to get a convex polygon
+ for(i = 1; i < numpoints - 1; i++)
+ {
+ for(j = i + 1; j < numpoints; j++)
+ {
+ if(convex(p0, viewnormal, &points[j * 3], &points[i * 3]))
+ {
+ float tmp2[3];
+ VECCOPY(tmp2, &points[i * 3]);
+ VECCOPY(&points[i * 3], &points[j * 3]);
+ VECCOPY(&points[j * 3], tmp2);
+ }
+ }
+ }
+
+ glBegin(GL_POLYGON);
+ for (i = 0; i < numpoints; i++) {
+ glColor3f(1.0, 1.0, 1.0);
+ glTexCoord3d((points[i * 3 + 0] - min[0] )*cor[0]/size[0], (points[i * 3 + 1] - min[1])*cor[1]/size[1], (points[i * 3 + 2] - min[2])*cor[2]/size[2]);
+ glVertex3f(points[i * 3 + 0], points[i * 3 + 1], points[i * 3 + 2]);
+ }
+ glEnd();
+ }
+ n++;
+ }
+
+ if(tex_shadow)
+ GPU_texture_unbind(tex_shadow);
+ GPU_texture_unbind(tex);
+
+ if(GLEW_ARB_fragment_program)
+ {
+ glDisable(GL_FRAGMENT_PROGRAM_ARB);
+ glDeleteProgramsARB(1, &prog);
+ }
+
+
+ MEM_freeN(points);
+
+ if(!gl_blend)
+ glDisable(GL_BLEND);
+ if(gl_depth)
+ {
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+ }
+}
+
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 625b1838951..6e415ec731d 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -52,6 +52,7 @@
#include "ED_armature.h"
#include "ED_space_api.h"
#include "ED_screen.h"
+#include "ED_object.h"
#include "BIF_gl.h"
@@ -97,29 +98,45 @@ ARegion *view3d_has_buttons_region(ScrArea *sa)
ARegion *view3d_has_tools_region(ScrArea *sa)
{
- ARegion *ar, *arnew;
+ ARegion *ar, *artool=NULL, *arprops=NULL, *arhead;
- for(ar= sa->regionbase.first; ar; ar= ar->next)
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
if(ar->regiontype==RGN_TYPE_TOOLS)
- return ar;
-
- /* add subdiv level; after header */
- for(ar= sa->regionbase.first; ar; ar= ar->next)
- if(ar->regiontype==RGN_TYPE_HEADER)
- break;
-
- /* is error! */
- if(ar==NULL) return NULL;
-
- arnew= MEM_callocN(sizeof(ARegion), "tools for view3d");
+ artool= ar;
+ if(ar->regiontype==RGN_TYPE_TOOL_PROPS)
+ arprops= ar;
+ }
- BLI_insertlinkafter(&sa->regionbase, ar, arnew);
- arnew->regiontype= RGN_TYPE_TOOLS;
- arnew->alignment= RGN_OVERLAP_LEFT;
+ /* tool region hide/unhide also hides props */
+ if(arprops && artool) return artool;
- arnew->flag = RGN_FLAG_HIDDEN;
+ if(artool==NULL) {
+ /* add subdiv level; after header */
+ for(arhead= sa->regionbase.first; arhead; arhead= arhead->next)
+ if(arhead->regiontype==RGN_TYPE_HEADER)
+ break;
+
+ /* is error! */
+ if(arhead==NULL) return NULL;
+
+ artool= MEM_callocN(sizeof(ARegion), "tools for view3d");
+
+ BLI_insertlinkafter(&sa->regionbase, arhead, artool);
+ artool->regiontype= RGN_TYPE_TOOLS;
+ artool->alignment= RGN_OVERLAP_LEFT;
+ artool->flag = RGN_FLAG_HIDDEN;
+ }
+
+ if(arprops==NULL) {
+ /* add extra subdivided region for tool properties */
+ arprops= MEM_callocN(sizeof(ARegion), "tool props for view3d");
+
+ BLI_insertlinkafter(&sa->regionbase, artool, arprops);
+ arprops->regiontype= RGN_TYPE_TOOL_PROPS;
+ arprops->alignment= RGN_ALIGN_BOTTOM|RGN_SPLIT_PREV;
+ }
- return arnew;
+ return artool;
}
/* ****************************************************** */
@@ -173,6 +190,8 @@ static SpaceLink *view3d_new(const bContext *C)
v3d->lens= 35.0f;
v3d->near= 0.01f;
v3d->far= 500.0f;
+
+ v3d->twtype= V3D_MANIP_TRANSLATE;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for view3d");
@@ -240,7 +259,6 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
if(v3do->localvd) {
v3do->localvd= NULL;
v3do->properties_storage= NULL;
- v3do->localview= 0;
v3do->lay= v3dn->localvd->lay;
v3do->lay &= 0xFFFFFF;
}
@@ -256,84 +274,68 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
return (SpaceLink *)v3dn;
}
-static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype)
-{
- RegionView3D *rv3d= ar->regiondata;
- ListBase *keymap;
-
- /* copy last mode, then we can re-init the region maps */
- rv3d->lastmode= stype;
-
- keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0);
- if(ELEM(stype, 0, NS_MODE_OBJECT))
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
- if(stype==NS_EDITMODE_MESH)
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_listbase(wm, "Curve", 0, 0);
- if(stype==NS_EDITMODE_CURVE)
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_listbase(wm, "Armature", 0, 0);
- if(stype==NS_EDITMODE_ARMATURE)
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- /* armature sketching needs to take over mouse */
- keymap= WM_keymap_listbase(wm, "Armature_Sketch", 0, 0);
- if(stype==NS_EDITMODE_TEXT)
- WM_event_add_keymap_handler_priority(&ar->handlers, keymap, 10);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_listbase(wm, "Particle", 0, 0);
- if(stype==NS_MODE_PARTICLE)
- WM_event_add_keymap_handler(&ar->handlers, keymap);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
- /* editfont keymap swallows all... */
- keymap= WM_keymap_listbase(wm, "Font", 0, 0);
- if(stype==NS_EDITMODE_TEXT)
- WM_event_add_keymap_handler_priority(&ar->handlers, keymap, 10);
- else
- WM_event_remove_keymap_handler(&ar->handlers, keymap);
-
-}
-
/* add handlers, stuff you only do once or on area/region changes */
static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
{
- RegionView3D *rv3d= ar->regiondata;
- ListBase *keymap;
+ wmKeyMap *keymap;
+
+ /* object ops. */
+ keymap= WM_keymap_find(wm, "Object Non-modal", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* pose is not modal, operator poll checks for this */
+ keymap= WM_keymap_find(wm, "Pose", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
- /* own keymap */
- keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ keymap= WM_keymap_find(wm, "Object Mode", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
- keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0);
+
+ keymap= WM_keymap_find(wm, "Image Paint", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Vertex Paint", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Weight Paint", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Sculpt", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
- /* object ops. */
- keymap= WM_keymap_listbase(wm, "Object Non-modal", 0, 0);
+ keymap= WM_keymap_find(wm, "EditMesh", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
- /* pose is not modal, operator poll checks for this */
- keymap= WM_keymap_listbase(wm, "Pose", 0, 0);
+ keymap= WM_keymap_find(wm, "Curve", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Armature", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Pose", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Metaball", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
- /* modal ops keymaps */
- view3d_modal_keymaps(wm, ar, rv3d->lastmode);
- /* operator poll checks for modes */
- keymap= WM_keymap_listbase(wm, "ImagePaint", 0, 0);
+ keymap= WM_keymap_find(wm, "Lattice", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* armature sketching needs to take over mouse */
+ keymap= WM_keymap_find(wm, "Armature_Sketch", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Particle", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* editfont keymap swallows all... */
+ keymap= WM_keymap_find(wm, "Font", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ /* own keymap, last so modes can override it */
+ keymap= WM_keymap_find(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "View3D", SPACE_VIEW3D, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
@@ -388,6 +390,17 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_ANIMATION:
+ switch(wmn->data) {
+ case ND_KEYFRAME_EDIT:
+ case ND_KEYFRAME_PROP:
+ case ND_NLA_EDIT:
+ case ND_NLA_ACTCHANGE:
+ case ND_ANIMCHAN_SELECT:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
case NC_SCENE:
switch(wmn->data) {
case ND_TRANSFORM:
@@ -397,7 +410,6 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
case ND_MODE:
- view3d_modal_keymaps(wmn->wm, ar, wmn->subtype);
ED_region_tag_redraw(ar);
break;
}
@@ -407,16 +419,25 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_BONE_ACTIVE:
case ND_BONE_SELECT:
case ND_TRANSFORM:
- case ND_GEOM_SELECT:
- case ND_GEOM_DATA:
+ case ND_POSE:
case ND_DRAW:
case ND_MODIFIER:
case ND_CONSTRAINT:
case ND_KEYS:
- case ND_PARTICLE:
+ case ND_PARTICLE_SELECT:
+ case ND_PARTICLE_DATA:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_DATA:
+ case ND_SELECT:
ED_region_tag_redraw(ar);
break;
}
+ break;
case NC_GROUP:
/* all group ops for now */
ED_region_tag_redraw(ar);
@@ -438,6 +459,10 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
* more context than just the region */
ED_region_tag_redraw(ar);
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_VIEW3D)
+ ED_region_tag_redraw(ar);
+ break;
}
}
@@ -457,33 +482,16 @@ static void view3d_main_area_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
static void view3d_header_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "View3D Generic", SPACE_VIEW3D, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
-
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
+
+ ED_region_header_init(ar);
}
static void view3d_header_area_draw(const bContext *C, ARegion *ar)
{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
-
- view3d_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
+ ED_region_header(C, ar);
}
static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
@@ -500,29 +508,43 @@ static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
break;
}
break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_VIEW3D)
+ ED_region_tag_redraw(ar);
+ break;
}
}
/* add handlers, stuff you only do once or on area/region changes */
static void view3d_buttons_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
- keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ keymap= WM_keymap_find(wm, "View3D Generic", SPACE_VIEW3D, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void view3d_buttons_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
+ ED_region_panels(C, ar, 1, NULL, -1);
}
static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
+ case NC_ANIMATION:
+ switch(wmn->data) {
+ case ND_KEYFRAME_EDIT:
+ case ND_KEYFRAME_PROP:
+ case ND_NLA_EDIT:
+ case ND_NLA_ACTCHANGE:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
case NC_SCENE:
switch(wmn->data) {
case ND_FRAME:
@@ -538,41 +560,46 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_BONE_ACTIVE:
case ND_BONE_SELECT:
case ND_TRANSFORM:
- case ND_GEOM_SELECT:
- case ND_GEOM_DATA:
+ case ND_POSE:
case ND_DRAW:
case ND_KEYS:
ED_region_tag_redraw(ar);
break;
}
+ break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_DATA:
+ case ND_SELECT:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_BRUSH:
+ if(wmn->action==NA_EDITED)
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_VIEW3D)
+ ED_region_tag_redraw(ar);
+ break;
}
}
/* add handlers, stuff you only do once or on area/region changes */
static void view3d_tools_area_init(wmWindowManager *wm, ARegion *ar)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
ED_region_panels_init(wm, ar);
- keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ keymap= WM_keymap_find(wm, "View3D Generic", SPACE_VIEW3D, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
}
static void view3d_tools_area_draw(const bContext *C, ARegion *ar)
{
- ED_region_panels(C, ar, 1, NULL);
-}
-
-/*
- * Returns true if the Object is a from an external blend file (libdata)
- */
-static int object_is_libdata(Object *ob)
-{
- if (!ob) return 0;
- if (ob->proxy) return 0;
- if (ob->id.lib) return 1;
- return 0;
+ ED_region_panels(C, ar, 1, CTX_data_mode_string(C), -1);
}
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
@@ -580,13 +607,12 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
-
- if(v3d==NULL) return 0;
+ 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[] = {
"selected_objects", "selected_bases" "selected_editable_objects",
- "selected_editable_bases" "visible_objects", "visible_bases",
+ "selected_editable_bases" "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
"active_base", "active_object", "visible_bones", "editable_bones",
"selected_bones", "selected_editable_bones" "visible_pchans",
"selected_pchans", "active_bone", "active_pchan", NULL};
@@ -597,7 +623,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int selected_objects= CTX_data_equals(member, "selected_objects");
for(base=scene->base.first; base; base=base->next) {
- if((base->flag & SELECT) && (base->lay & v3d->lay)) {
+ if((base->flag & SELECT) && (base->lay & lay)) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(selected_objects)
CTX_data_id_list_add(result, &base->object->id);
@@ -613,7 +639,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int selected_editable_objects= CTX_data_equals(member, "selected_editable_objects");
for(base=scene->base.first; base; base=base->next) {
- if((base->flag & SELECT) && (base->lay & v3d->lay)) {
+ if((base->flag & SELECT) && (base->lay & lay)) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(0==object_is_libdata(base->object)) {
if(selected_editable_objects)
@@ -631,7 +657,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
int visible_objects= CTX_data_equals(member, "visible_objects");
for(base=scene->base.first; base; base=base->next) {
- if(base->lay & v3d->lay) {
+ if(base->lay & lay) {
if((base->object->restrictflag & OB_RESTRICT_VIEW)==0) {
if(visible_objects)
CTX_data_id_list_add(result, &base->object->id);
@@ -643,15 +669,31 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
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_UnknownType, base);
+ }
+ }
+ }
+
+ return 1;
+ }
else if(CTX_data_equals(member, "active_base")) {
- if(scene->basact && (scene->basact->lay & v3d->lay))
+ if(scene->basact && (scene->basact->lay & lay))
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact);
return 1;
}
else if(CTX_data_equals(member, "active_object")) {
- if(scene->basact && (scene->basact->lay & v3d->lay))
+ if(scene->basact && (scene->basact->lay & lay))
if((scene->basact->object->restrictflag & OB_RESTRICT_VIEW)==0)
CTX_data_id_pointer_set(result, &scene->basact->object->id);
@@ -827,7 +869,7 @@ void ED_spacetype_view3d(void)
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
art->regionid = RGN_TYPE_WINDOW;
- art->keymapflag= ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_FRAMES|ED_KEYMAP_GPENCIL;
art->draw= view3d_main_area_draw;
art->init= view3d_main_area_init;
art->free= view3d_main_area_free;
@@ -839,7 +881,7 @@ void ED_spacetype_view3d(void)
/* regions: listview/buttons */
art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
art->regionid = RGN_TYPE_UI;
- art->minsizex= 220; // XXX
+ art->minsizex= 180; // XXX
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
art->listener= view3d_buttons_area_listener;
art->init= view3d_buttons_area_init;
@@ -851,7 +893,7 @@ void ED_spacetype_view3d(void)
/* regions: tool(bar) */
art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
art->regionid = RGN_TYPE_TOOLS;
- art->minsizex= 120; // XXX
+ art->minsizex= 160; // XXX
art->minsizey= 50; // XXX
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
art->listener= view3d_buttons_area_listener;
@@ -860,6 +902,20 @@ void ED_spacetype_view3d(void)
BLI_addhead(&st->regiontypes, art);
view3d_toolbar_register(art);
+
+ /* regions: tool properties */
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art->regionid = RGN_TYPE_TOOL_PROPS;
+ art->minsizex= 0;
+ art->minsizey= 120;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
+ art->listener= view3d_buttons_area_listener;
+ art->init= view3d_tools_area_init;
+ art->draw= view3d_tools_area_draw;
+ BLI_addhead(&st->regiontypes, art);
+
+ view3d_tool_props_register(art);
+
/* regions: header */
art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 91565235591..89d07fbbfea 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -36,6 +36,7 @@
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
#include "DNA_camera_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
@@ -71,7 +72,6 @@
#include "BKE_utildefines.h"
#include "BIF_gl.h"
-#include "BIF_transform.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -82,11 +82,13 @@
#include "ED_armature.h"
#include "ED_curve.h"
#include "ED_image.h"
+#include "ED_gpencil.h"
#include "ED_keyframing.h"
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_particle.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
@@ -224,7 +226,7 @@ static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d,
nu= cu->editnurb->first;
while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -300,58 +302,68 @@ static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d,
if((ob->parent) && (ob->partype == PARBONE)) but_y = 135;
else but_y = 150;
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 160, but_y, 70, 19, &v3d->flag, 0, 0, 0, 0, "Displays global values");
- uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 230, but_y, 70, 19, &v3d->flag, 0, 0, 0, 0, "Displays local values");
- uiBlockEndAlign(block);
+
memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
uiBlockBeginAlign(block);
if(tot==1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
- if(totw==1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Vertex W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
- uiBlockEndAlign(block);
-
- if(defstr[0]) {
- uiDefBut(block, LABEL, 1, "Vertex Deform Groups", 10, 40, 290, 20, NULL, 0.0, 0.0, 0, 0, "");
-
+ 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, "");
+
+ if(totw==1) {
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_NOP, "Weight:", 10, 20, 150, 19, tfp->defweightp, 0.0f, 1.0f, 10, 3, "Weight value");
- uiDefButI(block, MENU, B_REDR, defstr, 160, 20, 140, 19, &tfp->curdef, 0.0, 0.0, 0, 0, "Current Vertex Group");
+ 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, "");
+ }
+ else {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
+ 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, "");
}
- else if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
-
}
else {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median X:", 10, 110, 290, 19, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Y:", 10, 90, 290, 19, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Z:", 10, 70, 290, 19, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
- if(totw==tot)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median W:", 10, 50, 290, 19, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
- uiBlockEndAlign(block);
- if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
- }
-
- if(ob->type==OB_CURVE && (totw==0)) { /* bez curves have no w */
+ uiDefBut(block, LABEL, 0, "Median:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_SETPT_AUTO,"Auto", 10, 44, 72, 19, 0, 0, 0, 0, 0, "Auto handles (Shift H)");
- uiDefBut(block, BUT,B_SETPT_VECTOR,"Vector",82, 44, 73, 19, 0, 0, 0, 0, 0, "Vector handles (V)");
- uiDefBut(block, BUT,B_SETPT_ALIGN,"Align",155, 44, 73, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)");
- uiDefBut(block, BUT,B_SETPT_FREE,"Free", 227, 44, 72, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)");
- uiBlockEndAlign(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, "");
+ if(totw==tot) {
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 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");
+ 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, "Weight is used for SoftBody Goal");
+ uiBlockEndAlign(block);
+ }
+ else {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
+ 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");
+ uiBlockEndAlign(block);
+ }
}
-
+
if(totedge==1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease W:", 10, 30, 290, 19, &(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, 10, 3, "");
else if(totedge>1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease W:", 10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
}
else { // apply
@@ -405,7 +417,7 @@ static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d,
nu= cu->editnurb->first;
while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -464,6 +476,7 @@ static void v3d_editvertex_buts(const bContext *C, uiBlock *block, View3D *v3d,
}
}
+#if 0
/* assumes armature active */
static void validate_bonebutton_cb(bContext *C, void *bonev, void *namev)
{
@@ -479,13 +492,13 @@ static void validate_bonebutton_cb(bContext *C, void *bonev, void *namev)
/* restore */
BLI_strncpy(bone->name, oldname, 32);
- armature_bone_rename(ob, oldname, newname); // editarmature.c
+ ED_armature_bone_rename(ob->data, oldname, newname); // editarmature.c
}
}
+#endif
static void v3d_posearmature_buts(uiBlock *block, View3D *v3d, Object *ob, float lim)
{
- uiBut *but;
bArmature *arm;
bPoseChannel *pchan;
Bone *bone= NULL;
@@ -499,43 +512,62 @@ static void v3d_posearmature_buts(uiBlock *block, View3D *v3d, Object *ob, float
if(bone && (bone->flag & BONE_ACTIVE) && (bone->layer & arm->layer))
break;
}
- if (!pchan || !bone) return;
-
- if((ob->parent) && (ob->partype == PARBONE))
- but= uiDefBut (block, TEX, B_NOP, "Bone:", 160, 130, 140, 19, bone->name, 1, 31, 0, 0, "");
+ if (!pchan) {
+ uiDefBut(block, LABEL, 0, "No Bone Active", 0, 240, 100, 20, 0, 0, 0, 0, 0, "");
+ return;
+ }
+
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ float quat[4];
+ /* convert to euler, passing through quats... */
+ AxisAngleToQuat(quat, &pchan->quat[1], pchan->quat[0]);
+ QuatToEul(quat, tfp->ob_eul);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_QUAT)
+ QuatToEul(pchan->quat, tfp->ob_eul);
else
- but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 140, 140, 19, bone->name, 1, 31, 0, 0, "");
- uiButSetFunc(but, validate_bonebutton_cb, bone, NULL);
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)ob);
-
- QuatToEul(pchan->quat, tfp->ob_eul);
+ VecCopyf(tfp->ob_eul, pchan->eul);
tfp->ob_eul[0]*= 180.0/M_PI;
tfp->ob_eul[1]*= 180.0/M_PI;
tfp->ob_eul[2]*= 180.0/M_PI;
+ uiDefBut(block, LABEL, 0, "Location:", 0, 240, 100, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 10,140,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocX:", 30, 140, 120, 19, pchan->loc, -lim, lim, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 10,120,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocY:", 30, 120, 120, 19, pchan->loc+1, -lim, lim, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 10,100,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "LocZ:", 30, 100, 120, 19, pchan->loc+2, -lim, lim, 100, 3, "");
-
+ 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, "");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 10,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotX:", 30, 70, 120, 19, tfp->ob_eul, -1000.0, 1000.0, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 10,50,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotY:", 30, 50, 120, 19, tfp->ob_eul+1, -1000.0, 1000.0, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 10,30,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL3, "RotZ:", 30, 30, 120, 19, tfp->ob_eul+2, -1000.0, 1000.0, 100, 3, "");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 125, 220, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects X Location value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 125, 200, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects Y Location value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 125, 180, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects Z Location value from being Transformed");
+ uiBlockEndAlign(block);
+
+ uiDefBut(block, LABEL, 0, "Rotation:", 0, 160, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_ARMATUREPANEL3, "X:", 0, 140, 120, 19, tfp->ob_eul, -1000.0, 1000.0, 100, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL3, "Y:", 0, 120, 120, 19, tfp->ob_eul+1, -1000.0, 1000.0, 100, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL3, "Z:", 0, 100, 120, 19, tfp->ob_eul+2, -1000.0, 1000.0, 100, 3, "");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 125, 140, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects X Rotation value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 125, 120, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects Y Rotation value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 125, 100, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects Z Rotation value from being Transformed");
+ uiBlockEndAlign(block);
+
+ uiDefBut(block, LABEL, 0, "Scale:", 0, 80, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_ARMATUREPANEL2, "X:", 0, 60, 120, 19, pchan->size, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL2, "Y:", 0, 40, 120, 19, pchan->size+1, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL2, "Z:", 0, 20, 120, 19, pchan->size+2, -lim, lim, 10, 3, "");
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 160,70,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleX:", 180, 70, 120, 19, pchan->size, -lim, lim, 10, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 160,50,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleY:", 180, 50, 120, 19, pchan->size+1, -lim, lim, 10, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 160,30,20,19, &(pchan->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "ScaleZ:", 180, 30, 120, 19, pchan->size+2, -lim, lim, 10, 3, "");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 125, 60, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects X Scale value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 125, 40, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects Y Scale value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 125, 20, 25, 19, &(pchan->protectflag), 0, 0, 0, 0, "Protects z Scale value from being Transformed");
uiBlockEndAlign(block);
}
@@ -551,7 +583,7 @@ void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev)
/* restore */
BLI_strncpy(eBone->name, oldname, 32);
- armature_bone_rename(CTX_data_edit_object(C), oldname, newname); // editarmature.c
+ 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
}
@@ -559,7 +591,6 @@ static void v3d_editarmature_buts(uiBlock *block, View3D *v3d, Object *ob, float
{
bArmature *arm= ob->data;
EditBone *ebone;
- uiBut *but;
TransformProperties *tfp= v3d->properties_storage;
ebone= arm->edbo->first;
@@ -572,34 +603,31 @@ static void v3d_editarmature_buts(uiBlock *block, View3D *v3d, Object *ob, float
if (!ebone)
return;
- if((ob->parent) && (ob->partype == PARBONE))
- but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 130, 140, 19, ebone->name, 1, 31, 0, 0, "");
- else
- but= uiDefBut(block, TEX, B_NOP, "Bone:", 160, 150, 140, 19, ebone->name, 1, 31, 0, 0, "");
- uiButSetFunc(but, validate_editbonebutton_cb, ebone, NULL);
-
+ uiDefBut(block, LABEL, 0, "Head:", 0, 210, 100, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadX:", 10, 70, 140, 19, ebone->head, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadY:", 10, 50, 140, 19, ebone->head+1, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadZ:", 10, 30, 140, 19, ebone->head+2, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "X:", 0, 190, 100, 19, ebone->head, -lim, lim, 10, 3, "X Location of the head end of the bone");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Y:", 0, 170, 100, 19, ebone->head+1, -lim, lim, 10, 3, "Y Location of the head end of the bone");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Z:", 0, 150, 100, 19, ebone->head+2, -lim, lim, 10, 3, "Z Location of the head end of the bone");
+ if (ebone->parent && ebone->flag & BONE_CONNECTED )
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Radius:", 0, 130, 100, 19, &ebone->parent->rad_tail, 0, lim, 10, 3, "Head radius. Visualize with the Envelope display option");
+ else
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Radius:", 0, 130, 100, 19, &ebone->rad_head, 0, lim, 10, 3, "Head radius. Visualize with the Envelope display option");
+ uiBlockEndAlign(block);
+
+ uiBlockEndAlign(block);
+ uiDefBut(block, LABEL, 0, "Tail:", 0, 110, 100, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailX:", 160, 70, 140, 19, ebone->tail, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailY:", 160, 50, 140, 19, ebone->tail+1, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailZ:", 160, 30, 140, 19, ebone->tail+2, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "X:", 0, 90, 100, 19, ebone->tail, -lim, lim, 10, 3, "X Location of the tail end of the bone");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Y:", 0, 70, 100, 19, ebone->tail+1, -lim, lim, 10, 3, "Y Location of the tail end of the bone");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Z:", 0, 50, 100, 19, ebone->tail+2, -lim, lim, 10, 3, "Z Location of the tail end of the bone");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Radius:", 0, 30, 100, 19, &ebone->rad_tail, 0, lim, 10, 3, "Tail radius. Visualize with the Envelope display option");
uiBlockEndAlign(block);
tfp->ob_eul[0]= 180.0*ebone->roll/M_PI;
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:", 10, 100, 140, 19, tfp->ob_eul, -lim, lim, 1000, 3, "");
-
- uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, B_REDR, "Lock", 160, 100, 140, 19, &(ebone->flag), 0, 0, 0, 0, "Prevents bone from being transformed in edit mode");
-
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:", 0, 0, 100, 19, tfp->ob_eul, -lim, lim, 1000, 3, "Bone rotation around head-tail axis");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailRadius:", 10, 150, 140, 19, &ebone->rad_tail, 0, lim, 10, 3, "");
- if (ebone->parent && ebone->flag & BONE_CONNECTED )
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadRadius:", 10, 130, 140, 19, &ebone->parent->rad_tail, 0, lim, 10, 3, "");
- else
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadRadius:", 10, 130, 140, 19, &ebone->rad_head, 0, lim, 10, 3, "");
- uiBlockEndAlign(block);
+
+
}
static void v3d_editmetaball_buts(uiBlock *block, Object *ob, float lim)
@@ -656,7 +684,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
return; /* no notifier! */
case B_OBJECTPANEL:
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
break;
case B_OBJECTPANELROT:
@@ -664,7 +692,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
ob->rot[0]= M_PI*tfp->ob_eul[0]/180.0;
ob->rot[1]= M_PI*tfp->ob_eul[1]/180.0;
ob->rot[2]= M_PI*tfp->ob_eul[2]/180.0;
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
break;
@@ -702,7 +730,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
VECCOPY(ob->size, tfp->ob_scale);
}
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
break;
@@ -748,14 +776,14 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
/* prevent multiple B_OBJECTPANELDIMS events to keep scaling, cycling with TAB on buttons can cause that */
VECCOPY(tfp->ob_dims, old_dims);
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
break;
case B_OBJECTPANELMEDIAN:
if(ob) {
v3d_editvertex_buts(C, NULL, v3d, ob, 1.0);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
break;
@@ -766,7 +794,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
ob->parent= NULL;
else {
DAG_scene_sort(scene);
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
}
break;
@@ -837,13 +865,24 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
eul[0]= M_PI*tfp->ob_eul[0]/180.0;
eul[1]= M_PI*tfp->ob_eul[1]/180.0;
eul[2]= M_PI*tfp->ob_eul[2]/180.0;
- EulToQuat(eul, pchan->quat);
+
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ float quat[4];
+ /* convert to axis-angle, passing through quats */
+ EulToQuat(eul, quat);
+ QuatToAxisAngle(quat, &pchan->quat[1], &pchan->quat[0]);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_QUAT)
+ EulToQuat(eul, pchan->quat);
+ else
+ VecCopyf(pchan->eul, eul);
+
}
/* no break, pass on */
case B_ARMATUREPANEL2:
{
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
break;
case B_TRANSFORMSPACEADD:
@@ -895,8 +934,8 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
Mesh *me= ob->data;
int a;
for(a=0; a<me->totvert; a++)
- remove_vert_defgroup (ob, defGroup, a);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ ED_vgroup_vert_remove (ob, defGroup, a);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
break;
@@ -947,6 +986,7 @@ void selectTransformOrientation_func(bContext *C, void *target, void *unused)
BIF_selectTransformOrientation(C, (TransformOrientation *) target);
}
+#if 0 // XXX not used
static void view3d_panel_transform_spaces(const bContext *C, Panel *pa)
{
Scene *scene= CTX_data_scene(C);
@@ -997,75 +1037,9 @@ static void view3d_panel_transform_spaces(const bContext *C, Panel *pa)
}
uiBlockEndAlign(block);
}
+#endif // XXX not used
-static void weight_paint_buttons(Scene *scene, uiBlock *block)
-{
- VPaint *wpaint= scene->toolsettings->wpaint;
- Object *ob;
- ob= OBACT;
-
- if(ob==NULL || ob->type!=OB_MESH) return;
-
- /* XXX
- uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_REDR, "Weight:",10,170,225,19, &wpaint->weight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength");
-
- uiDefBut(block, BUT, B_WEIGHT0_0 , "0", 10,150,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_4 , "1/4", 55,150,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_2 , "1/2", 100,150,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT3_4 , "3/4", 145,150,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_0 , "1", 190,150,45,19, 0, 0, 0, 0, 0, "");
-
- uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 10,130,225,19, &wpaint->a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
-
- uiDefBut(block, BUT, B_OPA1_8 , "1/8", 10,110,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_4 , "1/4", 55,110,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_2 , "1/2", 100,110,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA3_4 , "3/4", 145,110,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_0 , "1", 190,110,45,19, 0, 0, 0, 0, 0, "");
-
- uiDefButF(block, NUMSLI, B_NOP, "Size ", 10,90,225,19, &wpaint->size, 2.0, 64.0, 0, 0, "The size of the brush");
-
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_NOP, "Mix", 250,170,60,17, &wpaint->mode, 1.0, 0.0, 0, 0, "Mix the vertex colors");
- uiDefButS(block, ROW, B_NOP, "Add", 250,152,60,17, &wpaint->mode, 1.0, 1.0, 0, 0, "Add the vertex colors");
- uiDefButS(block, ROW, B_NOP, "Sub", 250,134,60,17, &wpaint->mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color");
- uiDefButS(block, ROW, B_NOP, "Mul", 250,116,60,17, &wpaint->mode, 1.0, 3.0, 0, 0, "Multiply the vertex color");
- uiDefButS(block, ROW, B_NOP, "Blur", 250, 98,60,17, &wpaint->mode, 1.0, 4.0, 0, 0, "Blur the weight with surrounding values");
- uiDefButS(block, ROW, B_NOP, "Lighter", 250, 80,60,17, &wpaint->mode, 1.0, 5.0, 0, 0, "Paint over darker areas only");
- uiDefButS(block, ROW, B_NOP, "Darker", 250, 62,60,17, &wpaint->mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only");
- uiBlockEndAlign(block);
- */
-
- /* draw options same as below */
- uiBlockBeginAlign(block);
- if (FACESEL_PAINT_TEST) {
- Mesh *me= ob->data;
- uiDefButBitI(block, TOG, ME_DRAWFACES, B_REDR, "Faces", 10,45,60,19, &me->drawflag, 0, 0, 0, 0, "Displays all faces as shades");
- uiDefButBitI(block,TOG, ME_DRAWEDGES, B_REDR,"Edges",70,45,60,19, &me->drawflag, 2.0, 0, 0, 0, "Displays edges of visible faces");
- uiDefButBitI(block,TOG, ME_HIDDENEDGES, B_REDR,"Hidden Edges",130,45,100,19, &me->drawflag, 2.0, 1.0, 0, 0, "Displays edges of hidden faces");
- } else{
- uiDefButBitC(block, TOG, OB_DRAWWIRE, B_REDR, "Wire", 10,45,75,19, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes");
- }
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 10,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Paint on all faces inside brush (otherwise only on face under mouse cursor)");
- uiDefButBitS(block, TOG, VP_SOFT, 0, "Vert Dist", 70,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use distances to vertices (instead of all vertices of face)");
- uiDefButBitS(block, TOGN, VP_HARD, 0, "Soft", 130,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use a soft brush");
- uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 190,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Applies the vertex normal before painting");
- uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 250,20,55,19, &wpaint->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse");
- uiBlockEndAlign(block);
-
- if(ob) {
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, VP_ONLYVGROUP, B_REDR, "Vgroup", 10,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Only paint on vertices in the selected vertex group.");
- uiDefButBitS(block, TOG, VP_MIRROR_X, B_REDR, "X-Mirror", 110,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Mirrored Paint, applying on mirrored Weight Group name");
- uiDefBut(block, BUT, B_CLR_WPAINT, "Clear", 210,0,100,19, NULL, 0, 0, 0, 0, "Removes reference to this deform group from all vertices");
- uiBlockEndAlign(block);
- }
-}
-
+#if 0
static void brush_idpoin_handle(bContext *C, ID *id, int event)
{
Brush **br = current_brush_source(CTX_data_scene(C));
@@ -1096,111 +1070,7 @@ static void brush_idpoin_handle(bContext *C, ID *id, int event)
break;
}
}
-
-static int view3d_panel_brush_poll(const bContext *C, PanelType *pt)
-{
- Brush **brp = current_brush_source(CTX_data_scene(C));
-
- return ((G.f & (G_SCULPTMODE|G_TEXTUREPAINT|G_VERTEXPAINT|G_WEIGHTPAINT)) && brp);
-}
-
-static void view3d_panel_brush(const bContext *C, Panel *pa)
-{
- uiBlock *block;
- Brush **brp = current_brush_source(CTX_data_scene(C)), *br;
- short w = 268, h = 400, cx = 10, cy = h;
- rctf rect;
-
- br = *brp;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL);
-
- uiBlockBeginAlign(block);
- uiDefIDPoinButs(block, CTX_data_main(C), NULL, &br->id, ID_BR, NULL, cx, cy,
- brush_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|UI_ID_ALONE);
- cy-= 25;
- uiBlockEndAlign(block);
-
- if(!br)
- return;
-
- if(G.f & G_SCULPTMODE) {
- uiBlockBeginAlign(block);
- uiDefButC(block,ROW,B_REDR,"Draw",cx,cy,67,19,&br->sculpt_tool,14.0,SCULPT_TOOL_DRAW,0,0,"Draw lines on the model");
- uiDefButC(block,ROW,B_REDR,"Smooth",cx+67,cy,67,19,&br->sculpt_tool,14.0,SCULPT_TOOL_SMOOTH,0,0,"Interactively smooth areas of the model");
- uiDefButC(block,ROW,B_REDR,"Pinch",cx+134,cy,67,19,&br->sculpt_tool,14.0,SCULPT_TOOL_PINCH,0,0,"Interactively pinch areas of the model");
- uiDefButC(block,ROW,B_REDR,"Inflate",cx+201,cy,67,19,&br->sculpt_tool,14,SCULPT_TOOL_INFLATE,0,0,"Push vertices along the direction of their normals");
- cy-= 20;
- uiDefButC(block,ROW,B_REDR,"Grab", cx,cy,67,19,&br->sculpt_tool,14,SCULPT_TOOL_GRAB,0,0,"Grabs a group of vertices and moves them with the mouse");
- uiDefButC(block,ROW,B_REDR,"Layer", cx+67,cy,67,19,&br->sculpt_tool,14, SCULPT_TOOL_LAYER,0,0,"Adds a layer of depth");
- uiDefButC(block,ROW,B_REDR,"Flatten", cx+134,cy,67,19,&br->sculpt_tool,14, SCULPT_TOOL_FLATTEN,0,0,"Interactively flatten areas of the model");
- uiDefButC(block,ROW,B_REDR,"Clay", cx+201,cy,67,19,&br->sculpt_tool,14, SCULPT_TOOL_CLAY,0,0,"Build up depth quickly");
- cy-= 25;
- uiBlockEndAlign(block);
- }
-
- uiBlockBeginAlign(block);
- uiDefButI(block,NUMSLI,B_NOP,"Size: ",cx,cy,w,19,&br->size,1.0,200.0,0,0,"Set brush radius in pixels");
- cy-= 20;
- uiDefButF(block,NUMSLI,B_NOP,"Strength: ",cx,cy,w,19,&br->alpha,0,1.0,0,0,"Set brush strength");
- cy-= 25;
- uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
-
- uiDefButBitS(block, TOG, BRUSH_AIRBRUSH, B_NOP, "Airbrush", cx,cy,w/3,19, &br->flag,0,0,0,0, "Brush makes changes without waiting for the mouse to move");
- uiDefButBitS(block, TOG, BRUSH_RAKE, B_NOP, "Rake", cx+w/3,cy,w/3,19, &br->flag,0,0,0,0, "");
- uiDefButBitS(block, TOG, BRUSH_ANCHORED, B_NOP, "Anchored", cx+w*2.0/3,cy,w/3,19, &br->flag,0,0,0,0, "");
- cy-= 20;
- uiDefButBitS(block, TOG, BRUSH_SPACE, B_NOP, "Space", cx,cy,w/3,19, &br->flag,0,0,0,0, "");
- uiDefButF(block,NUMSLI,B_NOP,"Spacing: ",cx+w/3,cy,w*2.0/3,19,&br->spacing,1.0,500,0,0,"");
- cy-= 20;
- uiBlockEndAlign(block);
-
- if(br->curve) {
- rect.xmin= cx; rect.xmax= cx + w;
- rect.ymin= cy - 200; rect.ymax= cy;
- uiBlockBeginAlign(block);
- curvemap_buttons(block, br->curve, (char)0, B_NOP, 0, &rect);
- uiBlockEndAlign(block);
- }
-}
-
-static void sculptmode_draw_interface_tools(Scene *scene, uiBlock *block, unsigned short cx, unsigned short cy)
-{
- Sculpt *s = scene->toolsettings->sculpt;
-
- //XXX if(sd->brush_type != SMOOTH_BRUSH && sd->brush_type != GRAB_BRUSH && sd->brush_type != FLATTEN_BRUSH) {
- {
- /*uiDefButBitS(block,ROW,B_NOP,"Add",cx,cy,89,19,&br->dir,15.0,1.0,0, 0,"Add depth to model [Shift]");
- uiDefButBitS(block,ROW,B_NOP,"Sub",cx+89,cy,89,19,&br->dir,15.0,2.0,0, 0,"Subtract depth from model [Shift]");
- */}
- //XXX if(sd->brush_type!=GRAB_BRUSH)
-
- uiBlockBeginAlign(block);
- uiDefBut( block,LABEL,B_NOP,"Symmetry",cx,cy,90,19,NULL,0,0,0,0,"");
- cy-= 20;
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, SCULPT_SYMM_X, B_NOP, "X", cx,cy,40,19, &s->flags, 0,0,0,0, "Mirror brush across X axis");
- uiDefButBitI(block, TOG, SCULPT_SYMM_Y, B_NOP, "Y", cx+40,cy,40,19, &s->flags, 0,0,0,0, "Mirror brush across Y axis");
- uiDefButBitI(block, TOG, SCULPT_SYMM_Z, B_NOP, "Z", cx+80,cy,40,19, &s->flags, 0,0,0,0, "Mirror brush across Z axis");
- uiBlockEndAlign(block);
-
-
- cy+= 20;
- uiBlockBeginAlign(block);
- uiDefBut( block,LABEL,B_NOP,"LockAxis",cx+140,cy,90,19,NULL,0,0,0,0,"");
- cy-= 20;
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, SCULPT_LOCK_X, B_NOP, "X", cx+140,cy,40,19, &s->flags, 0,0,0,0, "Constrain X axis");
- uiDefButBitI(block, TOG, SCULPT_LOCK_Y, B_NOP, "Y", cx+180,cy,40,19, &s->flags, 0,0,0,0, "Constrain Y axis");
- uiDefButBitI(block, TOG, SCULPT_LOCK_Z, B_NOP, "Z", cx+220,cy,40,19, &s->flags, 0,0,0,0, "Constrain Z axis");
- uiBlockEndAlign(block);
-
- cx+= 210;
-}
-
+#endif
static void view3d_panel_object(const bContext *C, Panel *pa)
{
@@ -1208,11 +1078,10 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
View3D *v3d= CTX_wm_view3d(C);
- uiBut *bt;
+ //uiBut *bt;
Object *ob= OBACT;
TransformProperties *tfp;
float lim;
- static char hexcol[128];
if(ob==NULL) return;
@@ -1226,22 +1095,11 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
// XXX uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
+ if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)) {
}
else {
- bt= uiDefBut(block, TEX, B_IDNAME, "OB: ", 10,180,140,20, ob->id.name+2, 0.0, 21.0, 0, 0, "");
- uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL);
-
- if((G.f & G_PARTICLEEDIT)==0) {
- uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object");
- if((ob->parent) && (ob->partype == PARBONE)) {
- bt= uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 160, 160, 140, 20, ob->parsubstr, 0, 30, 0, 0, "");
- uiButSetCompleteFunc(bt, autocomplete_bone, (void *)ob->parent);
- }
- else {
- strcpy(ob->parsubstr, "");
- }
+ if((ob->mode & OB_MODE_PARTICLE_EDIT)==0) {
+ strcpy(ob->parsubstr, "");
uiBlockEndAlign(block);
}
}
@@ -1253,40 +1111,24 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
if(ob->type==OB_MBALL) v3d_editmetaball_buts(block, ob, lim);
else v3d_editvertex_buts(C, block, v3d, ob, lim);
}
- else if(ob->flag & OB_POSEMODE) {
+ else if(ob->mode & OB_MODE_POSE) {
v3d_posearmature_buts(block, v3d, ob, lim);
}
- else if(G.f & G_WEIGHTPAINT) {
- BLI_strncpy(pa->drawname, "Weight Paint Properties", sizeof(pa->drawname));
- weight_paint_buttons(scene, block);
- }
- else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT)) {
- static float hsv[3], old[3]; // used as temp mem for picker
- Brush **br = current_brush_source(scene);
-
- BLI_strncpy(pa->drawname, "Paint Properties", sizeof(pa->drawname));
- if(br && *br)
- /* 'f' is for floating panel */
- uiBlockPickerButtons(block, (*br)->rgb, hsv, old, hexcol, 'f', B_REDR);
- }
- else if(G.f & G_SCULPTMODE) {
- BLI_strncpy(pa->drawname, "Sculpt Properties", sizeof(pa->drawname));
- sculptmode_draw_interface_tools(scene, block, 10, 150);
- }
- else if(G.f & G_PARTICLEEDIT){
- BLI_strncpy(pa->drawname, "Particle Edit Properties", sizeof(pa->drawname));
-// XXX particle_edit_buttons(block);
- }
else {
BoundBox *bb = NULL;
-
+
+ uiDefBut(block, LABEL, 0, "Location:", 0, 300, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_OBJECTPANEL, "X:", 0, 280, 120, 19, &(ob->loc[0]), -lim, lim, 100, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANEL, "Y:", 0, 260, 120, 19, &(ob->loc[1]), -lim, lim, 100, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANEL, "Z:", 0, 240, 120, 19, &(ob->loc[2]), -lim, lim, 100, 3, "");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 10,150,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANEL, "LocX:", 30, 150, 120, 19, &(ob->loc[0]), -lim, lim, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 10,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANEL, "LocY:", 30, 130, 120, 19, &(ob->loc[1]), -lim, lim, 100, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 10,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANEL, "LocZ:", 30, 110, 120, 19, &(ob->loc[2]), -lim, lim, 100, 3, "");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCX, B_REDR, ICON_UNLOCKED, 125, 280, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects X Location value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCY, B_REDR, ICON_UNLOCKED, 125, 260, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Y Location value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_LOCZ, B_REDR, ICON_UNLOCKED, 125, 240, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Z Location value from being Transformed");
+ uiBlockEndAlign(block);
tfp->ob_eul[0]= 180.0*ob->rot[0]/M_PI;
tfp->ob_eul[1]= 180.0*ob->rot[1]/M_PI;
@@ -1294,37 +1136,53 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
uiBlockBeginAlign(block);
if ((ob->parent) && (ob->partype == PARBONE)) {
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 160,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 180, 130, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 160,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 180, 110, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 160,90,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 180, 90, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, "");
+ uiDefBut(block, LABEL, 0, "Rotation:", 0, 220, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "X:", 0, 200, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "Y:", 0, 180, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "Z:", 0, 160, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, "");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 125, 200, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects X Rotation from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 125, 180, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Y Rotation value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 125, 160, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Z Rotation value from being Transformed");
+ uiBlockEndAlign(block);
}
else {
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 160,150,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotX:", 180, 150, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 160,130,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotY:", 180, 130, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 160,110,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELROT, "RotZ:", 180, 110, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, "");
+ uiDefBut(block, LABEL, 0, "Rotation:", 0, 220, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "X:", 0, 200, 120, 19, &(tfp->ob_eul[0]), -lim, lim, 1000, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "Y:", 0, 180, 120, 19, &(tfp->ob_eul[1]), -lim, lim, 1000, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELROT, "Z:", 0, 160, 120, 19, &(tfp->ob_eul[2]), -lim, lim, 1000, 3, "");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTX, B_REDR, ICON_UNLOCKED, 125, 200, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects X Rotation value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTY, B_REDR, ICON_UNLOCKED, 125, 180, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Y Rotation value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_ROTZ, B_REDR, ICON_UNLOCKED, 125, 160, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Z Rotation value from being Transformed");
+ uiBlockEndAlign(block);
}
tfp->ob_scale[0]= ob->size[0];
tfp->ob_scale[1]= ob->size[1];
tfp->ob_scale[2]= ob->size[2];
+ uiDefBut(block, LABEL, 0, "Scale:", 0, 140, 100, 20, 0, 0, 0, 0, 0, "");
+ uiDefButS(block, OPTION, B_REDR, "Link", 60, 140, 50, 19, &(tfp->link_scale), 0, 1, 0, 0, "Scale values vary proportionally in all directions");
uiBlockBeginAlign(block);
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 10,80,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleX:", 30, 80, 120, 19, &(tfp->ob_scale[0]), -lim, lim, 10, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 10,60,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleY:", 30, 60, 120, 19, &(tfp->ob_scale[1]), -lim, lim, 10, 3, "");
- uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 10,40,20,19, &(ob->protectflag), 0, 0, 0, 0, "Protects this value from being Transformed");
- uiDefButF(block, NUM, B_OBJECTPANELSCALE, "ScaleZ:", 30, 40, 120, 19, &(tfp->ob_scale[2]), -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELSCALE, "X:", 0, 120, 120, 19, &(tfp->ob_scale[0]), -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELSCALE, "Y:", 0, 100, 120, 19, &(tfp->ob_scale[1]), -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELSCALE, "Z:", 0, 80, 120, 19, &(tfp->ob_scale[2]), -lim, lim, 10, 3, "");
uiBlockEndAlign(block);
- uiDefButS(block, TOG, B_REDR, "Link Scale", 10, 10, 140, 19, &(tfp->link_scale), 0, 1, 0, 0, "Scale values vary proportionally in all directions");
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEX, B_REDR, ICON_UNLOCKED, 125, 120, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects X Scale value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEY, B_REDR, ICON_UNLOCKED, 125, 100, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Y Scale value from being Transformed");
+ uiDefIconButBitS(block, ICONTOG, OB_LOCK_SCALEZ, B_REDR, ICON_UNLOCKED, 125, 80, 25, 19, &(ob->protectflag), 0, 0, 0, 0, "Protects Z Scale value from being Transformed");
+
+
bb= object_get_boundbox(ob);
if (bb) {
@@ -1336,17 +1194,21 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
tfp->ob_dims[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]);
tfp->ob_dims[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]);
- uiBlockBeginAlign(block);
+
if ((ob->parent) && (ob->partype == PARBONE)) {
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:", 160, 60, 140, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size");
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:", 160, 40, 140, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size");
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:", 160, 20, 140, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size");
+ uiDefBut(block, LABEL, 0, "Dimensions:", 0, 60, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "X:", 0, 40, 150, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate X bounding box size");
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "Y:", 0, 20, 150, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate Y bounding box size");
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "Z:", 0, 0, 150, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate Z bounding box size");
}
else {
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimX:", 160, 80, 140, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate bounding box size");
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimY:", 160, 60, 140, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate bounding box size");
- uiDefButF(block, NUM, B_OBJECTPANELDIMS, "DimZ:", 160, 40, 140, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate bounding box size");
+ uiDefBut(block, LABEL, 0, "Dimensions:", 0, 60, 100, 20, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "X:", 0, 40, 150, 19, &(tfp->ob_dims[0]), 0.0, lim, 10, 3, "Manipulate X bounding box size");
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "Y:", 0, 20, 150, 19, &(tfp->ob_dims[1]), 0.0, lim, 10, 3, "Manipulate Y bounding box size");
+ uiDefButF(block, NUM, B_OBJECTPANELDIMS, "Z:", 0, 0, 150, 19, &(tfp->ob_dims[2]), 0.0, lim, 10, 3, "Manipulate Z bounding box size");
}
uiBlockEndAlign(block);
@@ -1354,131 +1216,6 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
}
}
-static void view3d_panel_background(const bContext *C, Panel *pa)
-{
- View3D *v3d= CTX_wm_view3d(C);
- uiBlock *block;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL);
-
- if(v3d->flag & V3D_DISPBGPIC) {
- if(v3d->bgpic==NULL) {
- v3d->bgpic= MEM_callocN(sizeof(BGpic), "bgpic");
- v3d->bgpic->size= 5.0;
- v3d->bgpic->blend= 0.5;
- v3d->bgpic->iuser.fie_ima= 2;
- v3d->bgpic->iuser.ok= 1;
- }
- }
-
- if(!(v3d->flag & V3D_DISPBGPIC)) {
- uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use Background Image", 10, 180, 150, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View");
- uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
- }
- else {
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use", 10, 225, 50, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View");
- uiDefButF(block, NUMSLI, B_REDR, "Blend:", 60, 225, 150, 20, &v3d->bgpic->blend, 0.0,1.0, 0, 0, "Set the transparency of the background image");
- uiDefButF(block, NUM, B_REDR, "Size:", 210, 225, 100, 20, &v3d->bgpic->size, 0.1, 250.0*v3d->grid, 100, 0, "Set the size (width) of the background image");
-
- uiDefButF(block, NUM, B_REDR, "X Offset:", 10, 205, 150, 20, &v3d->bgpic->xof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the horizontal offset of the background image");
- uiDefButF(block, NUM, B_REDR, "Y Offset:", 160, 205, 150, 20, &v3d->bgpic->yof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the vertical offset of the background image");
-
- ED_image_uiblock_panel(C, block, &v3d->bgpic->ima, &v3d->bgpic->iuser, B_REDR, B_REDR);
- uiBlockEndAlign(block);
- }
-}
-
-
-static void view3d_panel_properties(const bContext *C, Panel *pa)
-{
- ScrArea *sa= CTX_wm_area(C);
- ARegion *arlast;
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
- RegionView3D *rv3d;
- uiBlock *block;
- float *curs;
-
- block= uiLayoutFreeBlock(pa->layout);
- uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL);
-
- uiDefBut(block, LABEL, 1, "Grid:", 10, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_REDR, "Spacing:", 10, 200, 140, 19, &v3d->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines");
- uiDefButS(block, NUM, B_REDR, "Lines:", 10, 180, 140, 19, &v3d->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines in perspective view");
- uiDefButS(block, NUM, B_REDR, "Divisions:", 10, 160, 140, 19, &v3d->gridsubdiv, 1.0, 100.0, 100, 0, "Set the number of grid lines");
- uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 1, "3D Display:", 160, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiDefButBitS(block, TOG, V3D_SHOW_FLOOR, B_REDR, "Grid Floor",160, 200, 150, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the grid floor in free camera mode");
- uiDefButBitS(block, TOG, V3D_SHOW_X, B_REDR, "X Axis", 160, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the X Axis line");
- uiDefButBitS(block, TOG, V3D_SHOW_Y, B_REDR, "Y Axis", 212, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Y Axis line");
- uiDefButBitS(block, TOG, V3D_SHOW_Z, B_REDR, "Z Axis", 262, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Z Axis line");
-
- uiDefBut(block, LABEL, 1, "View Camera:", 10, 140, 140, 19, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefButF(block, NUM, B_REDR, "Lens:", 10, 120, 140, 19, &v3d->lens, 10.0, 120.0, 100, 0, "The lens angle in perspective view");
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_REDR, "Clip Start:", 10, 96, 140, 19, &v3d->near, v3d->grid/100.0, 100.0, 10, 0, "Set the beginning of the range in which 3D objects are displayed (perspective view)");
- uiDefButF(block, NUM, B_REDR, "Clip End:", 10, 76, 140, 19, &v3d->far, 1.0, 10000.0*v3d->grid, 100, 0, "Set the end of the range in which 3D objects are displayed (perspective view)");
- uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 1, "3D Cursor:", 160, 150, 140, 19, NULL, 0.0, 0.0, 0, 0, "");
-
- uiBlockBeginAlign(block);
- curs= give_cursor(scene, v3d);
- uiDefButF(block, NUM, B_REDR, "X:", 160, 130, 150, 22, curs, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "X co-ordinate of the 3D cursor");
- uiDefButF(block, NUM, B_REDR, "Y:", 160, 108, 150, 22, curs+1, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Y co-ordinate of the 3D cursor");
- uiDefButF(block, NUM, B_REDR, "Z:", 160, 86, 150, 22, curs+2, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Z co-ordinate of the 3D cursor");
- uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 1, "Display:", 10, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, V3D_SELECT_OUTLINE, B_REDR, "Outline Selected", 10, 30, 140, 19, &v3d->flag, 0, 0, 0, 0, "Highlight selected objects with an outline, in Solid, Shaded or Textured viewport shading modes");
- uiDefButBitS(block, TOG, V3D_DRAW_CENTERS, B_REDR, "All Object Centers", 10, 10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw the center points on all objects");
- uiDefButBitS(block, TOGN, V3D_HIDE_HELPLINES, B_REDR, "Relationship Lines", 10, -10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw dashed lines indicating Parent, Constraint, or Hook relationships");
- uiDefButBitS(block, TOG, V3D_SOLID_TEX, B_REDR, "Solid Tex", 10, -30, 140, 19, &v3d->flag2, 0, 0, 0, 0, "Display textures in Solid draw type (Shift T)");
- uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 1, "View Locking:", 160, 60, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Object:", 160, 40, 150, 19, &v3d->ob_centre, "Lock view to center to this Object");
- uiDefBut(block, TEX, B_REDR, "Bone:", 160, 20, 150, 19, v3d->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to");
- uiBlockEndAlign(block);
-
- /* last region is always 3d... a bit weak */
- arlast= sa->regionbase.last;
- uiBlockBeginAlign(block);
- if(arlast->alignment==RGN_ALIGN_QSPLIT) {
- arlast= arlast->prev;
- rv3d= arlast->regiondata;
-
- uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "End 4-Split View", 160, -10, 150, 19, "Join the 3D View");
- uiDefButBitS(block, TOG, RV3D_LOCKED, B_RV3D_LOCKED, "Lock", 160, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, "");
- uiDefButBitS(block, TOG, RV3D_BOXVIEW, B_RV3D_BOXVIEW, "Box", 210, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, "");
- uiDefButBitS(block, TOG, RV3D_BOXCLIP, B_RV3D_BOXCLIP, "Clip", 260, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, "");
- }
- else
- uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "4-Split View", 160, -10, 150, 19, "Split 3D View in 4 parts");
-
- uiBlockEndAlign(block);
-
-
-// XXX
-// uiDefBut(block, LABEL, 1, "Keyframe Display:", 160, -2, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
-// uiBlockBeginAlign(block);
-// uiDefButBitS(block, TOG, ANIMFILTER_ACTIVE, B_REDR, "Active",160, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for active element only (i.e. active bone or active material)");
-// uiDefButBitS(block, TOG, ANIMFILTER_MUTED, B_REDR, "Muted",210, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes in muted channels");
-// uiDefButBitS(block, TOG, ANIMFILTER_LOCAL, B_REDR, "Local",260, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes directly connected to datablock");
-// if ((v3d->keyflags & ANIMFILTER_LOCAL)==0) {
-// uiDefButBitS(block, TOGN, ANIMFILTER_NOMAT, B_REDR, "Material",160, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Materials");
-// uiDefButBitS(block, TOGN, ANIMFILTER_NOSKEY, B_REDR, "ShapeKey",235, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Shape Keys");
-// }
- uiBlockEndAlign(block);
-}
-
#if 0
static void view3d_panel_preview(bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_PREVIEW
{
@@ -1505,33 +1242,6 @@ static void view3d_panel_preview(bContext *C, ARegion *ar, short cntrl) // VIEW3
}
#endif
-#if 0
-static void view3d_panel_gpencil(const bContext *C, Panel *pa)
-{
- View3D *v3d= CTX_wm_view3d(C);
- uiBlock *block;
-
- block= uiLayoutFreeBlock(pa->layout);
-
- /* allocate memory for gpd if drawing enabled (this must be done first or else we crash) */
- if (v3d->flag2 & V3D_DISPGP) {
-// if (v3d->gpd == NULL)
-// XXX gpencil_data_setactive(ar, gpencil_data_addnew());
- }
-
- if (v3d->flag2 & V3D_DISPGP) {
-// XXX bGPdata *gpd= v3d->gpd;
-
- /* draw button for showing gpencil settings and drawings */
- uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View (draw using Shift-LMB)");
- }
- else {
- uiDefButBitS(block, TOG, V3D_DISPGP, B_REDR, "Use Grease Pencil", 10, 225, 150, 20, &v3d->flag2, 0, 0, 0, 0, "Display freehand annotations overlay over this 3D View");
- uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
- }
-}
-#endif
-
static void delete_sketch_armature(bContext *C, void *arg1, void *arg2)
{
BIF_deleteSketch(C);
@@ -1662,10 +1372,9 @@ static void view3d_panel_bonesketch_spaces(const bContext *C, Panel *pa)
}
uiBlockEndAlign(block);
-
- uiDefButBitS(block, TOG, SCE_SNAP_PEEL_OBJECT, B_NOP, "Peel Objects", 10, yco, 200, 20, &scene->toolsettings->snap_flag, 0, 0, 0, 0, "Peel whole objects as one");
}
+#if 0 // XXX not used
/* op->invoke */
static void redo_cb(bContext *C, void *arg_op, void *arg2)
@@ -1712,6 +1421,7 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
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)
{
@@ -1719,54 +1429,35 @@ void view3d_buttons_register(ARegionType *art)
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel object");
strcpy(pt->idname, "VIEW3D_PT_object");
- strcpy(pt->label, "Transform Properties");
+ strcpy(pt->label, "Transform");
pt->draw= view3d_panel_object;
BLI_addtail(&art->paneltypes, pt);
-
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel gpencil");
+ strcpy(pt->idname, "VIEW3D_PT_gpencil");
+ strcpy(pt->label, "Grease Pencil");
+ pt->draw= gpencil_panel_standard;
+ BLI_addtail(&art->paneltypes, pt);
+/*
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel properties");
strcpy(pt->idname, "VIEW3D_PT_properties");
strcpy(pt->label, "View Properties");
pt->draw= view3d_panel_properties;
BLI_addtail(&art->paneltypes, pt);
- pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel background");
- strcpy(pt->idname, "VIEW3D_PT_background");
- strcpy(pt->label, "Background Image");
- pt->draw= view3d_panel_background;
- BLI_addtail(&art->paneltypes, pt);
-
- pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel brush");
- strcpy(pt->idname, "VIEW3D_PT_brush");
- strcpy(pt->label, "Brush");
- pt->draw= view3d_panel_brush;
- pt->poll= view3d_panel_brush_poll;
- BLI_addtail(&art->paneltypes, pt);
-
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel transform spaces");
strcpy(pt->idname, "VIEW3D_PT_transform spaces");
strcpy(pt->label, "Transform Orientations");
pt->draw= view3d_panel_transform_spaces;
BLI_addtail(&art->paneltypes, pt);
- /*pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel gpencil");
- strcpy(pt->idname, "VIEW3D_PT_gpencil");
- strcpy(pt->label, "Greas Pencil");
- pt->draw= view3d_panel_gpencil;
- BLI_addtail(&art->paneltypes, pt);*/
-
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel bonesketch spaces");
strcpy(pt->idname, "VIEW3D_PT_bonesketch_spaces");
strcpy(pt->label, "Bone Sketching");
pt->draw= view3d_panel_bonesketch_spaces;
pt->poll= view3d_panel_bonesketch_spaces_poll;
BLI_addtail(&art->paneltypes, pt);
-
- pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel redo");
- strcpy(pt->idname, "VIEW3D_PT_redo");
- strcpy(pt->label, "Last Operator");
- pt->draw= view3d_panel_operator_redo;
- BLI_addtail(&art->paneltypes, pt);
-
+*/
// XXX view3d_panel_preview(C, ar, 0);
}
@@ -1775,19 +1466,16 @@ static int view3d_properties(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_buttons_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
void VIEW3D_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
+ ot->description= "Toggles the properties panel display.";
ot->idname= "VIEW3D_OT_properties";
ot->exec= view3d_properties;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 54696fc4508..5612e60e899 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -59,9 +59,11 @@
#include "BKE_key.h"
#include "BKE_object.h"
#include "BKE_global.h"
+#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "BKE_unit.h"
#include "RE_pipeline.h" // make_stars
@@ -76,10 +78,12 @@
#include "ED_armature.h"
#include "ED_keyframing.h"
+#include "ED_gpencil.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_util.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "UI_interface.h"
@@ -233,15 +237,18 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
}
-static void drawgrid(ARegion *ar, View3D *v3d)
+#define GRID_MIN_PX 6.0f
+
+static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, 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];
- short sublines = v3d->gridsubdiv;
+ *grid_unit= NULL;
+
vec4[0]=vec4[1]=vec4[2]=0.0;
vec4[3]= 1.0;
Mat4MulVec4fl(rv3d->persmat, vec4);
@@ -255,7 +262,8 @@ static void drawgrid(ARegion *ar, View3D *v3d)
x= (wx)*fx/fw;
y= (wy)*fy/fw;
- vec4[0]=vec4[1]=v3d->grid;
+ vec4[0]=vec4[1]= (unit->system) ? 1.0 : v3d->grid;
+
vec4[2]= 0.0;
vec4[3]= 1.0;
Mat4MulVec4fl(rv3d->persmat, vec4);
@@ -271,72 +279,115 @@ static void drawgrid(ARegion *ar, View3D *v3d)
/* check zoom out */
UI_ThemeColor(TH_GRID);
- if(dx<6.0) {
- v3d->gridview*= sublines;
- dx*= sublines;
-
- if(dx<6.0) {
+ if(unit->system) {
+ /* Use GRID_MIN_PX*2 for units because very very small grid
+ * items are less useful when dealing with units */
+ void *usys;
+ int len, i;
+ double scalar;
+ float dx_scalar;
+ float blend_fac;
+
+ bUnit_GetSystem(&usys, &len, unit->system, B_UNIT_LENGTH);
+
+ if(usys) {
+ i= len;
+ while(i--) {
+ scalar= bUnit_GetScaler(usys, i);
+
+ dx_scalar = dx * scalar * unit->scale_length;
+ if (dx_scalar < (GRID_MIN_PX*2))
+ continue;
+
+ /* 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);
+ v3d->gridview= (scalar * unit->scale_length);
+ }
+ blend_fac= 1-((GRID_MIN_PX*2)/dx_scalar);
+
+ /* tweak to have the fade a bit nicer */
+ blend_fac= (blend_fac * blend_fac) * 2.0f;
+ CLAMP(blend_fac, 0.3f, 1.0f);
+
+
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, blend_fac);
+
+ drawgrid_draw(ar, wx, wy, x, y, dx_scalar);
+ }
+ }
+ }
+ else {
+ short sublines = v3d->gridsubdiv;
+
+ if(dx<GRID_MIN_PX) {
v3d->gridview*= sublines;
dx*= sublines;
- if(dx<6.0) {
+ if(dx<GRID_MIN_PX) {
v3d->gridview*= sublines;
- dx*=sublines;
- if(dx<6.0);
- else {
- UI_ThemeColor(TH_GRID);
+ dx*= sublines;
+
+ if(dx<GRID_MIN_PX) {
+ v3d->gridview*= sublines;
+ dx*=sublines;
+ if(dx<GRID_MIN_PX);
+ else {
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ }
+ }
+ else { // start blending out
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
+
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
}
}
- else { // start blending out
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ else { // start blending out (GRID_MIN_PX < dx < (GRID_MIN_PX*10))
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
-
+
UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
}
}
- else { // start blending out (6 < dx < 60)
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
- drawgrid_draw(ar, wx, wy, x, y, dx);
-
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, sublines*dx);
- }
- }
- else {
- if(dx>60.0) { // start blending in
- v3d->gridview/= sublines;
- dx/= sublines;
- if(dx>60.0) { // start blending in
+ else {
+ if(dx>(GRID_MIN_PX*10)) { // start blending in
v3d->gridview/= sublines;
dx/= sublines;
- if(dx>60.0) {
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, dx);
+ if(dx>(GRID_MIN_PX*10)) { // start blending in
+ v3d->gridview/= sublines;
+ dx/= sublines;
+ if(dx>(GRID_MIN_PX*10)) {
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ }
+ else {
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
+ drawgrid_draw(ar, wx, wy, x, y, dx);
+ UI_ThemeColor(TH_GRID);
+ drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
+ }
}
else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
}
}
else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
+ UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/(GRID_MIN_PX*10));
drawgrid_draw(ar, wx, wy, x, y, dx);
- UI_ThemeColor(TH_GRID);
+ UI_ThemeColor(TH_GRID);
drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
}
}
- else {
- UI_ThemeColorBlend(TH_BACK, TH_GRID, dx/60.0);
- drawgrid_draw(ar, wx, wy, x, y, dx);
- UI_ThemeColor(TH_GRID);
- drawgrid_draw(ar, wx, wy, x, y, dx*sublines);
- }
}
+
x+= (wx);
y+= (wy);
UI_GetThemeColor3ubv(TH_GRID, col);
@@ -360,7 +411,7 @@ static void drawgrid(ARegion *ar, View3D *v3d)
glDepthMask(1); // enable write in zbuffer
}
-
+#undef GRID_MIN_PX
static void drawfloor(Scene *scene, View3D *v3d)
{
@@ -681,7 +732,7 @@ static void draw_viewport_name(ARegion *ar, View3D *v3d)
char *name = view3d_get_name(v3d, rv3d);
char *printable = NULL;
- if (v3d->localview) {
+ if (v3d->localvd) {
printable = malloc(strlen(name) + strlen(" (Local)_")); /* '_' gives space for '\0' */
strcpy(printable, name);
strcat(printable, " (Local)");
@@ -691,10 +742,10 @@ static void draw_viewport_name(ARegion *ar, View3D *v3d)
if (printable) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(10, ar->winy-20, 0.0f, printable);
+ BLF_draw_default(22, ar->winy-17, 0.0f, printable);
}
- if (v3d->localview) {
+ if (v3d->localvd) {
free(printable);
}
}
@@ -748,7 +799,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
}
}
}
- else if(ob->pose && (ob->flag & OB_POSEMODE)) {
+ else if(ob->pose && (ob->mode & OB_MODE_POSE)) {
bPoseChannel *pchan;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if((pchan->bone->flag & BONE_ACTIVE) && (pchan->bone->layer & arm->layer)) {
@@ -1041,7 +1092,8 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
- struct Base *base;
+ struct Base *base = scene->basact;
+ rcti winrct;
/*for 2.43 release, don't use glext and just define the constant.
this to avoid possibly breaking platforms before release.*/
@@ -1053,9 +1105,11 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
int m;
#endif
- if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || (FACESEL_PAINT_TEST));
- else if((G.f & G_TEXTUREPAINT) && scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE));
- else if((G.f & G_PARTICLEEDIT) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
+ if(base && (base->object->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT) ||
+ paint_facesel_test(base->object)));
+ else if((base && (base->object->mode & OB_MODE_TEXTURE_PAINT)) &&
+ scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE));
+ else if((base && (base->object->mode & OB_MODE_PARTICLE_EDIT)) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
else if(scene->obedit && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
else {
v3d->flag &= ~V3D_NEEDBACKBUFDRAW;
@@ -1085,6 +1139,9 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
glDisable(GL_DITHER);
+ region_scissor_winrct(ar, &winrct);
+ glScissor(winrct.xmin, winrct.ymin, winrct.xmax - winrct.xmin, winrct.ymax - winrct.ymin);
+
glClearColor(0.0, 0.0, 0.0, 0.0);
if(v3d->zbuf) {
glEnable(GL_DEPTH_TEST);
@@ -1100,7 +1157,6 @@ void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
G.f |= G_BACKBUFSEL;
- base= (scene->basact);
if(base && (base->lay & v3d->lay)) {
draw_object_backbufsel(scene, v3d, rv3d, base->object);
}
@@ -1344,7 +1400,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
int mip= 0;
if(ibuf->mipmap[0]==NULL)
- IMB_makemipmap(ibuf, 0);
+ IMB_makemipmap(ibuf, 0, 0);
while(tzoom < 1.0f && mip<8 && ibuf->mipmap[mip]) {
tzoom*= 2.0f;
@@ -1360,12 +1416,10 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glaDefine2DArea(&ar->winrct);
+ /* need to use wm push/pop matrix because ED_region_pixelspace
+ uses the wm functions too, otherwise gets out of sync */
+ wmPushMatrix();
+ ED_region_pixelspace(ar);
glEnable(GL_BLEND);
@@ -1376,10 +1430,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
glPixelZoom(1.0, 1.0);
glPixelTransferf(GL_ALPHA_SCALE, 1.0f);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ wmPopMatrix();
glDisable(GL_BLEND);
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -1804,13 +1855,13 @@ 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)
+static CustomDataMask get_viewedit_datamask(bScreen *screen, Scene *scene, Object *ob)
{
CustomDataMask mask = CD_MASK_BAREMESH;
ScrArea *sa;
/* check if we need tfaces & mcols due to face select or texture paint */
- if(FACESEL_PAINT_TEST || G.f & G_TEXTUREPAINT)
+ if(paint_facesel_test(ob) || (ob && ob->mode & OB_MODE_TEXTURE_PAINT))
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
/* check if we need tfaces & mcols due to view mode */
@@ -1824,23 +1875,22 @@ static CustomDataMask get_viewedit_datamask(bScreen *screen)
if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
- if((G.fileflags & G_FILE_GAME_MAT) &&
- (G.fileflags & G_FILE_GAME_MAT_GLSL)) {
+ if(scene->gm.matmode == GAME_MAT_GLSL)
mask |= CD_MASK_ORCO;
- }
}
}
}
/* check if we need mcols due to vertex paint or weightpaint */
- if(G.f & G_VERTEXPAINT)
- mask |= CD_MASK_MCOL;
- if(G.f & G_WEIGHTPAINT)
- mask |= CD_MASK_WEIGHT_MCOL;
-
- if(G.f & G_SCULPTMODE)
- mask |= CD_MASK_MDISPS;
-
+ if(ob) {
+ if(ob->mode & OB_MODE_VERTEX_PAINT)
+ mask |= CD_MASK_MCOL;
+ if(ob->mode & OB_MODE_WEIGHT_PAINT)
+ mask |= CD_MASK_WEIGHT_MCOL;
+ if(ob->mode & OB_MODE_SCULPT)
+ mask |= CD_MASK_MDISPS;
+ }
+
return mask;
}
@@ -1854,9 +1904,10 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
Object *ob;
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));
+ v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C), scene, obact);
/* shadow buffers, before we setup matrices */
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
@@ -1928,7 +1979,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
else {
ED_region_pixelspace(ar);
- drawgrid(ar, v3d);
+ drawgrid(&scene->unit, ar, v3d, &grid_unit);
/* XXX make function? replaces persp(1) */
glMatrixMode(GL_PROJECTION);
wmLoadMatrix(rv3d->winmat);
@@ -1982,7 +2033,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
// retopo= retopo_mesh_check() || retopo_curve_check();
- sculptparticle= (G.f & (G_SCULPTMODE|G_PARTICLEEDIT)) && !scene->obedit;
+ sculptparticle= (obact && obact->mode & (OB_MODE_SCULPT|OB_MODE_PARTICLE_EDIT)) && !scene->obedit;
if(retopo)
view3d_update_depths(ar, v3d);
@@ -1995,7 +2046,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
if(!retopo && sculptparticle && !(obact && (obact->dtx & OB_DRAWXRAY))) {
- if(G.f & G_SCULPTMODE)
+ if(obact && obact->mode & OB_MODE_SCULPT)
draw_sculpt_depths(scene, ar, v3d);
view3d_update_depths(ar, v3d);
}
@@ -2011,7 +2062,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used!
if(!retopo && sculptparticle && (obact && (OBACT->dtx & OB_DRAWXRAY))) {
- if(G.f & G_SCULPTMODE)
+ if(obact && obact->mode & OB_MODE_SCULPT)
draw_sculpt_depths(scene, ar, v3d);
view3d_update_depths(ar, v3d);
}
@@ -2019,7 +2070,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
-// BIF_draw_manipulator(ar);
+ BIF_draw_manipulator(C);
if(v3d->zbuf) {
v3d->zbuf= FALSE;
@@ -2027,8 +2078,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
/* draw grease-pencil stuff */
-// if (v3d->flag2 & V3D_DISPGP)
-// draw_gpencil_3dview(ar, 1);
+ //if (v3d->flag2 & V3D_DISPGP)
+ draw_gpencil_3dview((bContext *)C, 1);
BDR_drawSketch(C);
@@ -2044,9 +2095,9 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(rv3d->persp>1) drawviewborder(scene, ar, v3d);
if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar);
- /* draw grease-pencil stuff */
+ /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
// if (v3d->flag2 & V3D_DISPGP)
-// draw_gpencil_3dview(ar, 0);
+ draw_gpencil_3dview((bContext *)C, 0);
drawcursor(scene, ar, v3d);
@@ -2059,19 +2110,23 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(U.uiflag & USER_SHOW_VIEWPORTNAME) {
draw_viewport_name(ar, v3d);
}
-
+ if (grid_unit) { /* draw below the viewport name */
+ UI_ThemeColor(TH_TEXT_HI);
+ BLF_draw_default(10, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit);
+ }
+
ob= OBACT;
if(U.uiflag & USER_DRAWVIEWINFO)
draw_selected_name(scene, ob, v3d);
/* XXX here was the blockhandlers for floating panels */
- if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || G.f & G_TEXTUREPAINT) {
+ if(ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)) {
v3d->flag |= V3D_NEEDBACKBUFDRAW;
// XXX addafterqueue(ar->win, BACKBUFDRAW, 1);
}
- if((G.f & G_PARTICLEEDIT) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)) {
+ if((ob && ob->mode & OB_MODE_PARTICLE_EDIT) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT)) {
v3d->flag |= V3D_NEEDBACKBUFDRAW;
// XXX addafterqueue(ar->win, BACKBUFDRAW, 1);
}
@@ -2084,10 +2139,6 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// addafterqueue(ar->win, BACKBUFDRAW, 1);
//}
}
-
-#ifndef DISABLE_PYTHON
- /* XXX here was scriptlink */
-#endif
}
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 79173d3fec7..5e3a6ae0e02 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -54,6 +54,7 @@
#include "BKE_depsgraph.h"
#include "BKE_object.h"
#include "BKE_global.h"
+#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
@@ -62,7 +63,6 @@
#include "RE_pipeline.h" // make_stars
#include "BIF_gl.h"
-#include "BIF_retopo.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -71,8 +71,10 @@
#include "RNA_define.h"
#include "ED_particle.h"
+#include "ED_retopo.h"
#include "ED_space_api.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "UI_interface.h"
@@ -94,50 +96,50 @@ static void view3d_boxview_clip(ScrArea *sa)
float clip[6][4];
float x1= 0.0f, y1= 0.0f, z1= 0.0f, ofs[3];
int val;
-
+
/* create bounding box */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
if(ar->regiontype==RGN_TYPE_WINDOW) {
RegionView3D *rv3d= ar->regiondata;
-
+
if(rv3d->viewlock & RV3D_BOXCLIP) {
if(ELEM(rv3d->view, V3D_VIEW_TOP, V3D_VIEW_BOTTOM)) {
if(ar->winx>ar->winy) x1= rv3d->dist;
else x1= ar->winx*rv3d->dist/ar->winy;
-
+
if(ar->winx>ar->winy) y1= ar->winy*rv3d->dist/ar->winx;
else y1= rv3d->dist;
-
+
ofs[0]= rv3d->ofs[0];
ofs[1]= rv3d->ofs[1];
}
else if(ELEM(rv3d->view, V3D_VIEW_FRONT, V3D_VIEW_BACK)) {
ofs[2]= rv3d->ofs[2];
-
+
if(ar->winx>ar->winy) z1= ar->winy*rv3d->dist/ar->winx;
else z1= rv3d->dist;
}
}
}
}
-
+
for(val=0; val<8; val++) {
if(ELEM4(val, 0, 3, 4, 7))
bb->vec[val][0]= -x1 - ofs[0];
else
bb->vec[val][0]= x1 - ofs[0];
-
+
if(ELEM4(val, 0, 1, 4, 5))
bb->vec[val][1]= -y1 - ofs[1];
else
bb->vec[val][1]= y1 - ofs[1];
-
+
if(val > 3)
bb->vec[val][2]= -z1 - ofs[2];
else
bb->vec[val][2]= z1 - ofs[2];
- }
-
+ }
+
/* normals for plane equations */
CalcNormFloat(bb->vec[0], bb->vec[1], bb->vec[4], clip[0]);
CalcNormFloat(bb->vec[1], bb->vec[2], bb->vec[5], clip[1]);
@@ -145,18 +147,18 @@ static void view3d_boxview_clip(ScrArea *sa)
CalcNormFloat(bb->vec[3], bb->vec[0], bb->vec[7], clip[3]);
CalcNormFloat(bb->vec[4], bb->vec[5], bb->vec[6], clip[4]);
CalcNormFloat(bb->vec[0], bb->vec[2], bb->vec[1], clip[5]);
-
+
/* then plane equations */
for(val=0; val<5; val++) {
clip[val][3]= - clip[val][0]*bb->vec[val][0] - clip[val][1]*bb->vec[val][1] - clip[val][2]*bb->vec[val][2];
}
clip[5][3]= - clip[5][0]*bb->vec[0][0] - clip[5][1]*bb->vec[0][1] - clip[5][2]*bb->vec[0][2];
-
+
/* create bounding box */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
if(ar->regiontype==RGN_TYPE_WINDOW) {
RegionView3D *rv3d= ar->regiondata;
-
+
if(rv3d->viewlock & RV3D_BOXCLIP) {
rv3d->rflag |= RV3D_CLIPPING;
memcpy(rv3d->clip, clip, sizeof(clip));
@@ -171,11 +173,11 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
-
+
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
RegionView3D *rv3dtest= artest->regiondata;
-
+
if(rv3dtest->viewlock) {
rv3dtest->dist= rv3d->dist;
@@ -197,7 +199,7 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
if( ELEM(rv3dtest->view, V3D_VIEW_FRONT, V3D_VIEW_BACK))
rv3dtest->ofs[2]= rv3d->ofs[2];
}
-
+
ED_region_tag_redraw(artest);
}
}
@@ -210,11 +212,11 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
-
+
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
RegionView3D *rv3dtest= artest->regiondata;
-
+
if(rv3dtest->viewlock) {
rv3dtest->dist= rv3d->dist;
VECCOPY(rv3dtest->ofs, rv3d->ofs);
@@ -237,7 +239,7 @@ typedef struct ViewOpsData {
float ofs[3], obofs[3];
float reverse, dist0;
float grid, far;
-
+
int origx, origy, oldx, oldy;
int origkey;
@@ -288,11 +290,11 @@ static void viewops_data(bContext *C, wmOperator *op, wmEvent *event)
vod->origx= vod->oldx= event->x;
vod->origy= vod->oldy= event->y;
vod->origkey= event->type;
-
+
/* lookup, we dont pass on v3d to prevent confusement */
vod->grid= v3d->grid;
vod->far= v3d->far;
-
+
calctrackballvec(&vod->ar->winrct, event->x, event->y, vod->trackvec);
initgrabz(rv3d, -rv3d->ofs[0], -rv3d->ofs[1], -rv3d->ofs[2]);
@@ -502,7 +504,8 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
default:
- if(event->type==vod->origkey && event->val==0) {
+ /* origkey may be zero when invoked from a button */
+ if(ELEM3(event->type, ESCKEY, LEFTMOUSE, RIGHTMOUSE) || (event->type==vod->origkey && event->val==KM_RELEASE)) {
request_depth_update(CTX_wm_region_view3d(C));
MEM_freeN(vod);
@@ -522,7 +525,7 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(rv3d->viewlock)
return OPERATOR_CANCELLED;
-
+
/* makes op->customdata */
viewops_data(C, op, event);
vod= op->customdata;
@@ -538,7 +541,7 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -556,9 +559,9 @@ void VIEW3D_OT_viewrotate(wmOperatorType *ot)
ot->invoke= viewrotate_invoke;
ot->modal= viewrotate_modal;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_BLOCKING;
}
/* ************************ viewmove ******************************** */
@@ -579,7 +582,7 @@ static void viewmove_apply(ViewOpsData *vod, int x, int y)
window_to_3d_delta(vod->ar, dvec, x-vod->oldx, y-vod->oldy);
VecAddf(vod->rv3d->ofs, vod->rv3d->ofs, dvec);
-
+
if(vod->rv3d->viewlock & RV3D_BOXVIEW)
view3d_boxview_sync(vod->sa, vod->ar);
}
@@ -602,7 +605,8 @@ static int viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
default:
- if(event->type==vod->origkey && event->val==0) {
+ /* origkey may be zero when invoked from a button */
+ if(ELEM3(event->type, ESCKEY, LEFTMOUSE, RIGHTMOUSE) || (event->type==vod->origkey && event->val==KM_RELEASE)) {
request_depth_update(CTX_wm_region_view3d(C));
MEM_freeN(vod);
@@ -621,7 +625,7 @@ static int viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
viewops_data(C, op, event);
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -639,9 +643,9 @@ void VIEW3D_OT_viewmove(wmOperatorType *ot)
ot->invoke= viewmove_invoke;
ot->modal= viewmove_modal;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_BLOCKING;
}
/* ************************ viewzoom ******************************** */
@@ -649,7 +653,7 @@ void VIEW3D_OT_viewmove(wmOperatorType *ot)
static void view_zoom_mouseloc(ARegion *ar, float dfac, int mx, int my)
{
RegionView3D *rv3d= ar->regiondata;
-
+
if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float dvec[3];
float tvec[3];
@@ -762,7 +766,8 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
break;
default:
- if(event->type==vod->origkey && event->val==0) {
+ /* origkey may be zero when invoked from a button */
+ if(ELEM3(event->type, ESCKEY, LEFTMOUSE, RIGHTMOUSE) || (event->type==vod->origkey && event->val==KM_RELEASE)) {
request_depth_update(CTX_wm_region_view3d(C));
MEM_freeN(vod);
@@ -799,7 +804,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
if(rv3d->viewlock & RV3D_BOXVIEW)
view3d_boxview_sync(CTX_wm_area(C), CTX_wm_region(C));
-
+
request_depth_update(CTX_wm_region_view3d(C));
ED_region_tag_redraw(CTX_wm_region(C));
@@ -818,7 +823,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
viewops_data(C, op, event);
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
}
@@ -838,10 +843,10 @@ void VIEW3D_OT_zoom(wmOperatorType *ot)
ot->exec= viewzoom_exec;
ot->modal= viewzoom_modal;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= OPTYPE_BLOCKING;
+
RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX);
}
@@ -852,6 +857,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
+ float *curs;
int center= RNA_boolean_get(op->ptr, "center");
@@ -861,6 +867,10 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
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;
}
else {
INIT_MINMAX(min, max);
@@ -898,31 +908,34 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
if (rv3d->persp==V3D_CAMOB) {
rv3d->persp= V3D_PERSP;
- smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL);
+ smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL);
}
+ else {
+ smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
+ }
}
// 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;
}
-void VIEW3D_OT_viewhome(wmOperatorType *ot)
+void VIEW3D_OT_view_all(wmOperatorType *ot)
{
/* identifiers */
ot->name= "View home";
ot->description = "View all objects in scene.";
- ot->idname= "VIEW3D_OT_viewhome";
+ ot->idname= "VIEW3D_OT_view_all";
/* api callbacks */
ot->exec= viewhome_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= 0;
+
RNA_def_boolean(ot->srna, "center", 0, "Center", "");
}
@@ -943,14 +956,14 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
INIT_MINMAX(min, max);
- if (G.f & G_WEIGHTPAINT) {
+ if (ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
/* hardcoded exception, we look for the one selected armature */
/* this is weak code this way, we should make a generic active/selection callback interface once... */
Base *base;
for(base=scene->base.first; base; base= base->next) {
if(TESTBASELIB(v3d, base)) {
if(base->object->type==OB_ARMATURE)
- if(base->object->flag & OB_POSEMODE)
+ if(base->object->mode & OB_MODE_POSE)
break;
}
}
@@ -962,7 +975,7 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
if(obedit) {
ok = minmax_verts(obedit, min, max); /* only selected */
}
- else if(ob && (ob->flag & OB_POSEMODE)) {
+ else if(ob && (ob->mode & OB_MODE_POSE)) {
if(ob->pose) {
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -983,10 +996,10 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
}
}
}
- else if (FACESEL_PAINT_TEST) {
+ else if (paint_facesel_test(ob)) {
// XXX ok= minmax_tface(min, max);
}
- else if (G.f & G_PARTICLEEDIT) {
+ else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
ok= PE_minmax(scene, min, max);
}
else {
@@ -1012,7 +1025,7 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
/* perspective should be a bit farther away to look nice */
if(rv3d->persp==V3D_ORTHO)
size*= 0.7;
-
+
if(size <= v3d->near*1.5f) size= v3d->near*1.5f;
new_ofs[0]= -(min[0]+max[0])/2.0f;
@@ -1035,7 +1048,7 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
if (rv3d->persp==V3D_CAMOB) {
rv3d->persp= V3D_PERSP;
smooth_view(C, v3d->camera, NULL, new_ofs, NULL, &new_dist, NULL);
- }
+ }
else {
smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
}
@@ -1047,20 +1060,20 @@ static int viewcenter_exec(bContext *C, wmOperator *op) /* like a localview with
return OPERATOR_FINISHED;
}
-void VIEW3D_OT_viewcenter(wmOperatorType *ot)
+void VIEW3D_OT_view_center(wmOperatorType *ot)
{
/* identifiers */
ot->name= "View center";
ot->description = "Move the view to the selection center.";
- ot->idname= "VIEW3D_OT_viewcenter";
+ ot->idname= "VIEW3D_OT_view_center";
/* api callbacks */
ot->exec= viewcenter_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= 0;
}
/* ********************* Set render border operator ****************** */
@@ -1070,16 +1083,16 @@ static int render_border_exec(bContext *C, wmOperator *op)
View3D *v3d = CTX_wm_view3d(C);
ARegion *ar= CTX_wm_region(C);
Scene *scene= CTX_data_scene(C);
-
+
rcti rect;
rctf vb;
-
+
/* get border select values using rna */
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");
-
+
/* calculate range */
calc_viewborder(scene, ar, v3d, &vb);
@@ -1087,13 +1100,13 @@ static int render_border_exec(bContext *C, wmOperator *op)
scene->r.border.ymin= ((float)rect.ymin-vb.ymin)/(vb.ymax-vb.ymin);
scene->r.border.xmax= ((float)rect.xmax-vb.xmin)/(vb.xmax-vb.xmin);
scene->r.border.ymax= ((float)rect.ymax-vb.ymin)/(vb.ymax-vb.ymin);
-
- /* actually set border */
+
+ /* actually set border */
CLAMP(scene->r.border.xmin, 0.0, 1.0);
CLAMP(scene->r.border.ymin, 0.0, 1.0);
CLAMP(scene->r.border.xmax, 0.0, 1.0);
CLAMP(scene->r.border.ymax, 0.0, 1.0);
-
+
/* drawing a border surrounding the entire camera view switches off border rendering
* or the border covers no pixels */
if ((scene->r.border.xmin <= 0.0 && scene->r.border.xmax >= 1.0 &&
@@ -1105,7 +1118,7 @@ static int render_border_exec(bContext *C, wmOperator *op)
} else {
scene->r.mode |= R_BORDER;
}
-
+
return OPERATOR_FINISHED;
}
@@ -1113,9 +1126,9 @@ static int render_border_exec(bContext *C, wmOperator *op)
static int view3d_render_border_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
RegionView3D *rv3d= CTX_wm_region_view3d(C);
-
+
/* if not in camera view do not exec the operator*/
- if (rv3d->persp == V3D_CAMOB) return WM_border_select_invoke(C, op, event);
+ if (rv3d->persp == V3D_CAMOB) return WM_border_select_invoke(C, op, event);
else return OPERATOR_PASS_THROUGH;
}
@@ -1130,12 +1143,12 @@ void VIEW3D_OT_render_border(wmOperatorType *ot)
ot->invoke= view3d_render_border_invoke;
ot->exec= render_border_exec;
ot->modal= WM_border_select_modal;
-
+
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* rna */
RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
@@ -1145,13 +1158,13 @@ void VIEW3D_OT_render_border(wmOperatorType *ot)
}
/* ********************* Border Zoom operator ****************** */
-static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
+static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
-
+
/* Zooms in on a border drawn by the user */
rcti rect;
float dvec[3], vb[2], xscale, yscale, scale;
@@ -1166,16 +1179,16 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
int had_depth = 0;
double cent[2], p[3];
int xs, ys;
-
+
/* note; otherwise opengl won't work */
view3d_operator_needs_opengl(C);
-
+
/* get border select values using rna */
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");
-
+
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
@@ -1274,42 +1287,42 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op)
}
smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
-
+
if(rv3d->viewlock & RV3D_BOXVIEW)
view3d_boxview_sync(CTX_wm_area(C), ar);
-
+
return OPERATOR_FINISHED;
}
-static int view3d_border_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view3d_zoom_border_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
RegionView3D *rv3d= CTX_wm_region_view3d(C);
-
+
/* if in camera view do not exec the operator so we do not conflict with set render border*/
- if (rv3d->persp != V3D_CAMOB)
- return WM_border_select_invoke(C, op, event);
- else
+ if (rv3d->persp != V3D_CAMOB)
+ return WM_border_select_invoke(C, op, event);
+ else
return OPERATOR_PASS_THROUGH;
}
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.";
ot->idname= "VIEW3D_OT_zoom_border";
/* api callbacks */
- ot->invoke= view3d_border_zoom_invoke;
- ot->exec= view3d_border_zoom_exec;
+ ot->invoke= view3d_zoom_border_invoke;
+ ot->exec= view3d_zoom_border_exec;
ot->modal= WM_border_select_modal;
-
+
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= 0;
+
/* rna */
RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
@@ -1334,7 +1347,7 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
float new_quat[4];
-
+
if(rv3d->viewlock) {
/* only pass on if */
if(rv3d->view==V3D_VIEW_FRONT && view==V3D_VIEW_BACK);
@@ -1345,10 +1358,10 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s
else if(rv3d->view==V3D_VIEW_TOP && view==V3D_VIEW_BOTTOM);
else return;
}
-
+
new_quat[0]= q1; new_quat[1]= q2;
new_quat[2]= q3; new_quat[3]= q4;
-
+
rv3d->view= view;
if(rv3d->viewlock) {
@@ -1361,8 +1374,8 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s
if (U.uiflag & USER_AUTOPERSP) rv3d->persp= V3D_ORTHO;
else if(rv3d->persp==V3D_CAMOB) rv3d->persp= perspo;
- smooth_view(C, v3d->camera, NULL, rv3d->ofs, new_quat, NULL, NULL);
- }
+ smooth_view(C, v3d->camera, NULL, rv3d->ofs, new_quat, NULL, NULL);
+ }
else {
if (U.uiflag & USER_AUTOPERSP) rv3d->persp= V3D_ORTHO;
@@ -1419,7 +1432,7 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
QUATCOPY(rv3d->lviewquat, rv3d->viewquat);
rv3d->lview= rv3d->view;
rv3d->lpersp= rv3d->persp;
-
+
#if 0
if(G.qual==LR_ALTKEY) {
if(oldcamera && is_an_active_object(oldcamera)) {
@@ -1428,7 +1441,7 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
handle_view3d_lock();
}
#endif
-
+
if(BASACT) {
/* check both G.vd as G.scene cameras */
if((v3d->camera==NULL || scene->camera==NULL) && OBACT->type==OB_CAMERA) {
@@ -1436,14 +1449,14 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
/*handle_view3d_lock();*/
}
}
-
+
if(v3d->camera==NULL) {
v3d->camera= scene_find_camera(scene);
/*handle_view3d_lock();*/
}
rv3d->persp= V3D_CAMOB;
smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
-
+
}
else{
/* return to settings of last view */
@@ -1471,10 +1484,10 @@ void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewnumpad_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= 0;
+
RNA_def_enum(ot->srna, "type", prop_view_items, 0, "View", "The Type of view");
}
@@ -1489,11 +1502,11 @@ static int vieworbit_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
- float phi, si, q1[4];
+ float phi, si, q1[4];
int orbitdir;
orbitdir = RNA_enum_get(op->ptr, "type");
-
+
if(rv3d->viewlock==0) {
if(rv3d->persp != V3D_CAMOB) {
@@ -1527,7 +1540,7 @@ static int vieworbit_exec(bContext *C, wmOperator *op)
}
}
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void VIEW3D_OT_view_orbit(wmOperatorType *ot)
@@ -1540,9 +1553,9 @@ void VIEW3D_OT_view_orbit(wmOperatorType *ot)
/* api callbacks */
ot->exec= vieworbit_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= 0;
RNA_def_enum(ot->srna, "type", prop_view_orbit_items, 0, "Orbit", "Direction of View Orbit");
}
@@ -1556,12 +1569,12 @@ static EnumPropertyItem prop_view_pan_items[] = {
static int viewpan_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- float vec[3];
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ float vec[3];
int pandir;
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);
@@ -1577,7 +1590,7 @@ static int viewpan_exec(bContext *C, wmOperator *op)
ED_region_tag_redraw(ar);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void VIEW3D_OT_view_pan(wmOperatorType *ot)
@@ -1590,41 +1603,41 @@ void VIEW3D_OT_view_pan(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewpan_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ 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)
{
ARegion *ar= CTX_wm_region(C);
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
-
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+
if(rv3d->viewlock==0) {
- if(rv3d->persp!=V3D_ORTHO)
+ if(rv3d->persp!=V3D_ORTHO)
rv3d->persp=V3D_ORTHO;
else rv3d->persp=V3D_PERSP;
ED_region_tag_redraw(ar);
}
return OPERATOR_FINISHED;
-
+
}
void VIEW3D_OT_view_persportho(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "View persp/ortho";
+ ot->name= "View Persp/Ortho";
ot->description = "Switch the current view from perspective/orthographic.";
ot->idname= "VIEW3D_OT_view_persportho";
/* api callbacks */
ot->exec= viewpersportho_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= 0;
}
@@ -1710,13 +1723,13 @@ static int view3d_clipping_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
/* toggles */
-void VIEW3D_OT_clipping(wmOperatorType *ot)
+void VIEW3D_OT_clip_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clipping Border";
ot->description = "Set the view clipping border.";
- ot->idname= "VIEW3D_OT_clipping";
+ ot->idname= "VIEW3D_OT_clip_border";
/* api callbacks */
ot->invoke= view3d_clipping_invoke;
@@ -1724,10 +1737,10 @@ void VIEW3D_OT_clipping(wmOperatorType *ot)
ot->modal= WM_border_select_modal;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= 0;
+
/* rna */
RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX);
@@ -1744,7 +1757,7 @@ static int view3d_drawtype_exec(bContext *C, wmOperator *op)
dt = RNA_int_get(op->ptr, "draw_type");
dt_alt = RNA_int_get(op->ptr, "draw_type_alternate");
-
+
if (dt_alt != -1) {
if (v3d->drawtype == dt)
v3d->drawtype = dt_alt;
@@ -1755,7 +1768,7 @@ static int view3d_drawtype_exec(bContext *C, wmOperator *op)
v3d->drawtype = dt;
ED_area_tag_redraw(CTX_wm_area(C));
-
+
return OPERATOR_FINISHED;
}
@@ -1777,10 +1790,10 @@ void VIEW3D_OT_drawtype(wmOperatorType *ot)
ot->exec= view3d_drawtype_exec;
ot->poll= ED_operator_view3d_active;
-
+
/* flags */
- ot->flag= OPTYPE_REGISTER;
-
+ ot->flag= 0;
+
/* rna XXX should become enum */
RNA_def_int(ot->srna, "draw_type", 0, INT_MIN, INT_MAX, "Draw Type", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "draw_type_alternate", -1, INT_MIN, INT_MAX, "Draw Type Alternate", "", INT_MIN, INT_MAX);
@@ -1798,36 +1811,36 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
float dx, dy, fz, *fp = NULL, dvec[3], oldcurs[3];
short mx, my, mval[2];
// short ctrl= 0; // XXX
-
+
fp= give_cursor(scene, v3d);
-
+
// if(obedit && ctrl) lr_click= 1;
VECCOPY(oldcurs, fp);
-
+
mx= event->x - ar->winrct.xmin;
my= event->y - ar->winrct.ymin;
project_short_noclip(ar, fp, mval);
-
+
initgrabz(rv3d, fp[0], fp[1], fp[2]);
-
+
if(mval[0]!=IS_CLIPPED) {
-
+
window_to_3d_delta(ar, dvec, mval[0]-mx, mval[1]-my);
VecSubf(fp, fp, dvec);
}
else {
-
+
dx= ((float)(mx-(ar->winx/2)))*rv3d->zfac/(ar->winx/2);
dy= ((float)(my-(ar->winy/2)))*rv3d->zfac/(ar->winy/2);
-
+
fz= rv3d->persmat[0][3]*fp[0]+ rv3d->persmat[1][3]*fp[1]+ rv3d->persmat[2][3]*fp[2]+ rv3d->persmat[3][3];
fz= fz/rv3d->zfac;
-
+
fp[0]= (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy+ rv3d->persinv[2][0]*fz)-rv3d->ofs[0];
fp[1]= (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy+ rv3d->persinv[2][1]*fz)-rv3d->ofs[1];
fp[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy+ rv3d->persinv[2][2]*fz)-rv3d->ofs[2];
}
-
+
// if(lr_click) {
// XXX if(obedit->type==OB_MESH) add_click_mesh();
// else if ELEM(obedit->type, OB_CURVE, OB_SURF) addvert_Nurb(0);
@@ -1836,28 +1849,64 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
// }
// XXX notifier for scene */
ED_area_tag_redraw(CTX_wm_area(C));
-
- /* prevent other mouse ops to fail */
- return OPERATOR_PASS_THROUGH;
+
+ return OPERATOR_FINISHED;
}
void VIEW3D_OT_cursor3d(wmOperatorType *ot)
{
-
+
/* identifiers */
ot->name= "Set 3D Cursor";
ot->description = "Set the location of the 3D cursor.";
ot->idname= "VIEW3D_OT_cursor3d";
-
+
/* api callbacks */
ot->invoke= set_3dcursor_invoke;
-
+
ot->poll= ED_operator_view3d_active;
-
+
/* rna later */
}
+/* ***************** manipulator op ******************* */
+
+
+static int manipulator_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+
+ if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
+ if(!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return OPERATOR_PASS_THROUGH;
+
+ /* note; otherwise opengl won't work */
+ view3d_operator_needs_opengl(C);
+
+ if(0==BIF_do_manipulator(C, event, op))
+ return OPERATOR_PASS_THROUGH;
+
+ return OPERATOR_FINISHED;
+}
+
+void VIEW3D_OT_manipulator(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "3D Manipulator";
+ ot->description = "Manipulate selected item by axis.";
+ ot->idname= "VIEW3D_OT_manipulator";
+
+ /* api callbacks */
+ ot->invoke= manipulator_invoke;
+
+ ot->poll= ED_operator_view3d_active;
+
+ /* rna later */
+ RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
+}
+
+
/* ************************* below the line! *********************** */
@@ -2155,7 +2204,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
rv3d->view = 0;
//printf("passing here \n");
//
- if (scene->obedit==NULL && ob && !(ob->flag & OB_POSEMODE)) {
+ if (scene->obedit==NULL && ob && !(ob->mode & OB_MODE_POSE)) {
use_sel = 1;
}
@@ -2289,7 +2338,7 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
if (use_sel) {
QuatConj(q1); /* conj == inv for unit quat */
- VecSubf(v3d->ofs, v3d->ofs, obofs);
+ VecSubf(rv3d->ofs, rv3d->ofs, obofs);
QuatMulVecf(q1, rv3d->ofs);
VecAddf(rv3d->ofs, rv3d->ofs, obofs);
}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 79ea90864f3..45828d654aa 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -61,6 +61,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_paint.h"
#include "BKE_particle.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h" /* for VECCOPY */
@@ -71,6 +72,7 @@
#include "ED_mesh.h"
#include "ED_util.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "WM_api.h"
@@ -78,10 +80,10 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
-#include "BIF_transform.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -104,21 +106,10 @@
* This can be cleaned when I make some new 'mode' icons.
*/
-#define V3D_OBJECTMODE_SEL ICON_OBJECT_DATA
-#define V3D_EDITMODE_SEL ICON_EDITMODE_HLT
-#define V3D_SCULPTMODE_SEL ICON_SCULPTMODE_HLT
-#define V3D_FACESELECT_SEL ICON_FACESEL_HLT /* this is not a mode anymore - just a switch */
-#define V3D_VERTEXPAINTMODE_SEL ICON_VPAINT_HLT
-#define V3D_TEXTUREPAINTMODE_SEL ICON_TPAINT_HLT
-#define V3D_WEIGHTPAINTMODE_SEL ICON_WPAINT_HLT
-#define V3D_POSEMODE_SEL ICON_POSE_HLT
-#define V3D_PARTICLEEDITMODE_SEL ICON_ANIM
-
#define TEST_EDITMESH if(obedit==0) return; \
if( (v3d->lay & obedit->lay)==0 ) return;
-/* XXX port over */
-static void handle_view3d_lock(void) {}
+/* XXX port over */
static void countall(void) {}
extern void borderselect();
static int retopo_mesh_paint_check() {return 0;}
@@ -135,29 +126,6 @@ static int retopo_mesh_paint_check() {return 0;}
/* end XXX ************* */
-
-/* well... in this file a lot of view mode manipulation happens, so let's have it defined here */
-void ED_view3d_exit_paint_modes(bContext *C)
-{
- if(G.f & G_TEXTUREPAINT)
- WM_operator_name_call(C, "PAINT_OT_texture_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- if(G.f & G_VERTEXPAINT)
- WM_operator_name_call(C, "PAINT_OT_vertex_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- else if(G.f & G_WEIGHTPAINT)
- WM_operator_name_call(C, "PAINT_OT_weight_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
-
- if(G.f & G_SCULPTMODE)
- WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- if(G.f & G_PARTICLEEDIT)
- WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
-
- G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
-}
-
-
-
-
-
static void do_view3d_header_buttons(bContext *C, void *arg, int event);
#define B_SCENELOCK 101
@@ -201,53 +169,23 @@ static RegionView3D *wm_region_view3d(const bContext *C)
return NULL;
}
-/* XXX; all this context stuff... should become operator */
-void do_layer_buttons(bContext *C, short event)
+// XXX quickly ported across
+static void handle_view3d_lock(bContext *C)
{
- wmWindow *win= CTX_wm_window(C);
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- static int oldlay= 1;
- short shift, alt, ctrl;
+ View3D *v3d= CTX_wm_view3d(C);
- shift= win->eventstate->shift;
- alt= win->eventstate->alt;
- ctrl= win->eventstate->ctrl;
-
- if(v3d==0) return;
- if(v3d->localview) return;
-
- if(event==-1 && ctrl) {
- v3d->scenelock= !v3d->scenelock;
- do_view3d_header_buttons(C, NULL, B_SCENELOCK);
- } else if (event<0) {
- if(v3d->lay== (1<<20)-1) {
- if(event==-2 || shift) v3d->lay= oldlay;
- }
- else {
- oldlay= v3d->lay;
- v3d->lay= (1<<20)-1;
- }
-
- if(v3d->scenelock) handle_view3d_lock();
-
- /* new layers might need unflushed events events */
- DAG_scene_update_flags(scene, v3d->lay); /* tags all that moves and flushes */
- }
- else {
- if(alt) {
- if(event<11) event+= 10;
- }
- if(shift) {
- if(v3d->lay & (1<<event)) v3d->lay -= (1<<event);
- else v3d->lay += (1<<event);
+ if (v3d != NULL && sa != NULL) {
+ if(v3d->localvd==NULL && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) {
+
+ /* copy to scene */
+ scene->lay= v3d->lay;
+ scene->camera= v3d->camera;
+
+ //copy_view3d_lock(REDRAW);
}
- do_view3d_header_buttons(C, NULL, event+B_LAY);
}
- ED_area_tag_redraw(sa);
-
- if(v3d->drawtype == OB_SHADED) reshadeall_displist(scene);
}
static int layers_exec(bContext *C, wmOperator *op)
@@ -257,16 +195,42 @@ static int layers_exec(bContext *C, wmOperator *op)
View3D *v3d= sa->spacedata.first;
int nr= RNA_int_get(op->ptr, "nr");
- if(nr<=0)
+ if(nr < 0)
return OPERATOR_CANCELLED;
- nr--;
- if(RNA_boolean_get(op->ptr, "extend"))
- v3d->lay |= (1<<nr);
- else
- v3d->lay = (1<<nr);
- if(v3d->scenelock) handle_view3d_lock();
+ if(nr == 0) {
+ /* all layers */
+ v3d->lay |= (1<<20)-1;
+
+ if(!v3d->layact)
+ v3d->layact= 1;
+ }
+ else {
+ nr--;
+
+ if(RNA_boolean_get(op->ptr, "extend"))
+ v3d->lay |= (1<<nr);
+ else
+ v3d->lay = (1<<nr);
+
+ /* set active layer, ensure to always have one */
+ if(v3d->lay & (1<<nr))
+ v3d->layact= 1<<nr;
+ else if((v3d->lay & v3d->layact)==0) {
+ int bit= 0;
+
+ while(bit<32) {
+ if(v3d->lay & (1<<bit)) {
+ v3d->layact= 1<<bit;
+ break;
+ }
+ bit++;
+ }
+ }
+ }
+
+ if(v3d->scenelock) handle_view3d_lock(C);
/* new layers might need unflushed events events */
DAG_scene_update_flags(scene, v3d->lay); /* tags all that moves and flushes */
@@ -299,6 +263,7 @@ void VIEW3D_OT_layers(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Layers";
+ ot->description= "Toggle layer(s) visibility.";
ot->idname= "VIEW3D_OT_layers";
/* api callbacks */
@@ -309,483 +274,9 @@ void VIEW3D_OT_layers(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "", 0, 20);
- RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
-}
-
-
-#if 0
-static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
-{
- Scene *scene= CTX_data_scene(C);
- Base *base;
- int i=1;
-
- if (event == 1) {
- /* Set Active Object as Active Camera */
- /* XXX ugly hack alert */
-// G.qual |= LR_CTRLKEY;
-// persptoetsen(PAD0);
-// G.qual &= ~LR_CTRLKEY;
- } else {
-
- for( base = FIRSTBASE; base; base = base->next ) {
- if (base->object->type == OB_CAMERA) {
- i++;
-
- if (event==i) {
- /* XXX use api call! */
-
- break;
- }
- }
- }
- }
-
-}
-
-
-static uiBlock *view3d_view_camerasmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- Scene *scene= CTX_data_scene(C);
- Base *base;
- uiBlock *block;
- short yco= 0, menuwidth=120;
- int i=1;
- char camname[48];
-
- block= uiBeginBlock(C, ar, "view3d_view_camerasmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_view_camerasmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Active Object as Active Camera|Ctrl NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- for( base = FIRSTBASE; base; base = base->next ) {
- if (base->object->type == OB_CAMERA) {
- i++;
-
- strcpy(camname, base->object->id.name+2);
- if (base->object == scene->camera) strcat(camname, " (Active)");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, camname, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, i, "");
- }
- }
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 50);
- return block;
-}
-#endif
-
-#if 0
-static void do_view3d_view_cameracontrolsmenu(bContext *C, void *arg, int event)
-{
- switch(event) {
- case 0: /* Orbit Left */
- persptoetsen(PAD4);
- break;
- case 1: /* Orbit Right */
- persptoetsen(PAD6);
- break;
- case 2: /* Orbit Up */
- persptoetsen(PAD8);
- break;
- case 3: /* Orbit Down */
- persptoetsen(PAD2);
- break;
- case 4: /* Pan left */
- /* XXX ugly hack alert */
-// G.qual |= LR_CTRLKEY;
- persptoetsen(PAD4);
-// G.qual &= ~LR_CTRLKEY;
- break;
- case 5: /* Pan right */
- /* XXX ugly hack alert */
-// G.qual |= LR_CTRLKEY;
- persptoetsen(PAD6);
-// G.qual &= ~LR_CTRLKEY;
- break;
- case 6: /* Pan up */
- /* ugly hack alert */
-// G.qual |= LR_CTRLKEY;
- persptoetsen(PAD8);
-// G.qual &= ~LR_CTRLKEY;
- break;
- case 7: /* Pan down */
- /* ugly hack alert */
-// G.qual |= LR_CTRLKEY;
- persptoetsen(PAD2);
-// G.qual &= ~LR_CTRLKEY;
- break;
- case 8: /* Zoom In */
- persptoetsen(PADPLUSKEY);
- break;
- case 9: /* Zoom Out */
- persptoetsen(PADMINUS);
- break;
- case 10: /* Reset Zoom */
- persptoetsen(PADENTER);
- break;
- case 11: /* Camera Fly mode */
- fly();
- break;
- }
-}
-
-
-static uiBlock *view3d_view_cameracontrolsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
-/* static short tog=0; */
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_view_cameracontrolsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Fly Mode|Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Left|NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Right|NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Up|NumPad 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Down|NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Left|Ctrl NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Right|Ctrl NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Up|Ctrl NumPad 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Down|Ctrl NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Zoom|NumPad Enter", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void do_view3d_view_alignviewmenu(bContext *C, void *arg, int event)
-{
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- Object *obedit = CTX_data_edit_object(C);
- float *curs;
-
- switch(event) {
-
- case 0: /* Align View to Selected (edit/faceselect mode) */
- case 1:
- case 2:
- if ((obedit) && (obedit->type == OB_MESH)) {
- editmesh_align_view_to_selected(v3d, event + 1);
- }
- else if (FACESEL_PAINT_TEST) {
- Object *obact= OBACT;
- if (obact && obact->type==OB_MESH) {
- Mesh *me= obact->data;
-
- if (me->mtface) {
-// XXX faceselect_align_view_to_selected(v3d, me, event + 1);
- ED_area_tag_redraw(sa);
- }
- }
- }
- break;
- case 3: /* Center View to Cursor */
- curs= give_cursor(scene, v3d);
- v3d->ofs[0]= -curs[0];
- v3d->ofs[1]= -curs[1];
- v3d->ofs[2]= -curs[2];
- ED_area_tag_redraw(sa);
- break;
- case 4: /* Align Active Camera to View */
- /* XXX This ugly hack is a symptom of the nasty persptoetsen function,
- * but at least it works for now.
- */
-// G.qual |= LR_CTRLKEY|LR_ALTKEY;
- persptoetsen(PAD0);
-// G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
- break;
- case 5: /* Align View to Selected (object mode) */
-// XXX mainqenter(PADASTERKEY, 1);
- break;
- case 6: /* Center View and Cursor to Origin */
- WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL);
- curs= give_cursor(scene, v3d);
- curs[0]=curs[1]=curs[2]= 0.0;
- break;
- }
-}
-
-static uiBlock *view3d_view_alignviewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
-/* static short tog=0; */
- uiBlock *block;
- Object *obedit = CTX_data_edit_object(C);
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_view_alignviewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-
- if (((obedit) && (obedit->type == OB_MESH)) || (FACESEL_PAINT_TEST)) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Front)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Side)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- } else {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- }
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 50);
- return block;
-}
-#endif
-
-#if 0
-static uiBlock *view3d_view_spacehandlers(bContext *C, ARegion *ar, void *arg_unused)
-{
- /* XXX */
- return NULL;
-}
-
-
-static void do_view3d_viewmenu(bContext *C, void *arg, int event)
-{
-
- switch(event) {
- case 0: /* User */
- break;
- case 1: /* Camera */
- break;
- case 2: /* Top */
- break;
- case 3: /* Front */
- break;
- case 4: /* Side */
- break;
- case 5: /* Perspective */
- break;
- case 6: /* Orthographic */
- break;
- case 7: /* Local View */
- break;
- case 8: /* Global View */
- break;
- case 9: /* View All (Home) */
- WM_operator_name_call(C, "VIEW3D_OT_viewhome", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case 11: /* View Selected */
- WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL);
- break;
- case 13: /* Play Back Animation */
- break;
- case 15: /* Background Image... */
-// add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
- break;
- case 16: /* View Panel */
-// add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
- break;
- case 17: /* Set Clipping Border */
- WM_operator_name_call(C, "VIEW3D_OT_clipping", WM_OP_INVOKE_REGION_WIN, NULL);
- break;
- case 18: /* render preview */
-// toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
- break;
- case 19: /* zoom within border */
-// view3d_border_zoom();
- break;
- case 20: /* Transform Space Panel */
-// add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
- break;
- case 21: /* Grease Pencil */
-// add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
- break;
- case 22: /* View all layers */
- do_layer_buttons(C, -2);
- break;
- }
-}
-#endif
-
-static void view3d_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
-// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_fly_mode");
-
-// uiItemS(layout);
-
- uiItemsEnumO(layout, "VIEW3D_OT_view_orbit", "type");
-
- uiItemS(layout);
-
- uiItemsEnumO(layout, "VIEW3D_OT_view_pan", "type");
-
- uiItemS(layout);
-
- uiItemFloatO(layout, "Zoom in", 0, "VIEW3D_OT_zoom", "delta", 1.0f);
- uiItemFloatO(layout, "Zoom out", 0, "VIEW3D_OT_zoom", "delta", -1.0f);
-
-}
-static void view3d_view_alignviewmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
-
-}
-
-static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- ScrArea *sa= CTX_wm_area(C);
-
-// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations...
-// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview...
-// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_view_properties_panel"); // View Properties....
-// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image....
-// uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil....
-
-// uiItemS(layout);
-
- uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA);
- uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP);
- uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT);
- uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT);
-
- //uiItemMenuF(layout, "Cameras", view3d_view_camerasmenu);
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "VIEW3D_OT_view_persportho");
-
- uiItemS(layout);
-
-// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_show_all_layers");
-
-// uiItemS(layout);
-
-// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_local_view");
-// uiItemO(layout, NULL, 0, "VIEW3D_OT_view_global_view");
-
-// uiItemS(layout);
-
- uiItemMenuF(layout, "View Navigation", 0, view3d_view_viewnavmenu);
- uiItemMenuF(layout, "Align View", 0, view3d_view_alignviewmenu);
-
- uiItemS(layout);
-
- uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);
-
- uiItemO(layout, NULL, 0, "VIEW3D_OT_clipping");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_zoom_border");
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "VIEW3D_OT_viewcenter");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_viewhome");
-
- uiItemS(layout);
-
- if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
- else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
-}
-#if 0
-static uiBlock *view3d_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- RegionView3D *rv3d= wm_region_view3d(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Orientations...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if ((rv3d->viewbut == 0) && !(rv3d->persp == V3D_CAMOB)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- if (rv3d->persp == V3D_CAMOB) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- if (rv3d->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- if (rv3d->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
- if (rv3d->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-
- uiDefIconTextBlockBut(block, view3d_view_camerasmenu, NULL, ICON_RIGHTARROW_THIN, "Cameras", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(rv3d->persp==V3D_PERSP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- if(rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(v3d->lay== (1<<20)-1) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Previous Layers|Shift ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show All Layers| ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
- if(!v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_view_cameracontrolsmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_view_alignviewmenu, NULL, ICON_RIGHTARROW_THIN, "Align View", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(rv3d->rflag & RV3D_CLIPPING)
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
- else
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
- if (rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
- if(!sa->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
- else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
-
-#ifndef DISABLE_PYTHON
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
-#endif
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
-
- return block;
+ RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "The layer number to set, zero for all layers", 0, 20);
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Add this layer to the current view layers");
}
-#endif
#if 0
void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
@@ -1007,483 +498,6 @@ static uiBlock *view3d_select_object_groupedmenu(bContext *C, ARegion *ar, void
#endif
-static uiBlock *view3d_select_objectmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-// short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_objectmenu", UI_EMBOSSP);
-
-#if 0
- uiBlockSetButmFunc(block, do_view3d_select_objectmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, "");
-#endif
- uiDefMenuButO(block, "VIEW3D_OT_select_border", "Border Select");
-
- uiDefMenuSep(block);
-
- uiDefMenuButO(block, "OBJECT_OT_select_all_toggle", "Select/Deselect All");
- uiDefMenuButO(block, "OBJECT_OT_select_invert", "Inverse");
- uiDefMenuButO(block, "OBJECT_OT_select_random", "Random");
- uiDefMenuButO(block, "OBJECT_OT_select_by_layer", "Select All by Layer");
- uiDefMenuButO(block, "OBJECT_OT_select_by_type", "Select All by Type");
-
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-void do_view3d_select_meshmenu(bContext *C, void *arg, int event)
-{
-#if 0
-/* extern void borderselect(void);*/
-
- switch(event) {
-
- case 0: /* border select */
- borderselect();
- break;
- case 2: /* Select/Deselect all */
- deselectall_mesh();
- break;
- case 3: /* Inverse */
- selectswap_mesh();
- break;
- case 4: /* select linked vertices */
- selectconnected_mesh_all();
- break;
- case 5: /* select random */
- selectrandom_mesh();
- break;
- case 7: /* select more */
- select_more();
- break;
- case 8: /* select less */
- select_less();
- break;
- case 9: /* select non-manifold */
- select_non_manifold();
- break;
- case 11: /* select triangles */
- select_faces_by_numverts(3);
- break;
- case 12: /* select quads */
- select_faces_by_numverts(4);
- break;
- case 13: /* select non-triangles/quads */
- select_faces_by_numverts(5);
- break;
- case 14: /* select sharp edges */
- select_sharp_edges();
- break;
- case 15: /* select linked flat faces */
- select_linked_flat_faces();
- break;
-
- case 16: /* path select */
- pathselect();
- ED_undo_push(C, "Path Select");
- break;
- case 17: /* edge loop select */
- loop_multiselect(0);
- break;
- case 18: /* edge ring select */
- loop_multiselect(1);
- break;
- case 19: /* loop to region */
- loop_to_region();
- break;
- case 20: /* region to loop */
- region_to_loop();
- break;
- case 21: /* Select grouped */
- select_mesh_group_menu();
- break;
- }
-#endif
-}
-
-
-static uiBlock *view3d_select_meshmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_meshmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_select_meshmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Non-Manifold|Ctrl Alt Shift M",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Sharp Edges|Ctrl Alt Shift S",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Linked Flat Faces|Ctrl Alt Shift F",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Triangles|Ctrl Alt Shift 3",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Quads|Ctrl Alt Shift 4",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Non-Triangles/Quads|Ctrl Alt Shift 5",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Similar to Selection...|Shift G",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Vertices|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vertex Path|W Alt 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Loop|Ctrl E 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Ring|Ctrl E 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6,
- menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop to Region|Ctrl E 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Region to Loop|Ctrl E 9", 0, yco-=20, menuwidth, 20, NULL, 0.0, 0.0, 1, 20, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- Object *obedit= CTX_data_edit_object(C);
-
- uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_select_circle");
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle");
- uiItemO(layout, NULL, 0, "CURVE_OT_select_invert");
- uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random...
- uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth..
-
- uiItemS(layout);
-
- if(obedit->type == OB_SURF) {
- uiItemO(layout, NULL, 0, "CURVE_OT_select_row");
- }
- else {
- uiItemO(layout, NULL, 0, "CURVE_OT_de_select_first");
- uiItemO(layout, NULL, 0, "CURVE_OT_de_select_last");
- uiItemO(layout, NULL, 0, "CURVE_OT_select_next");
- uiItemO(layout, NULL, 0, "CURVE_OT_select_previous");
- }
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "CURVE_OT_select_more");
- uiItemO(layout, NULL, 0, "CURVE_OT_select_less");
-
- /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
- /* uiItemO(layout, NULL, 0, "CURVE_OT_select_linked"); */
-
-#if 0
- G.qual |= LR_CTRLKEY;
- select_connected_nurb();
- G.qual &= ~LR_CTRLKEY;
- break;*/
-#endif
-}
-
-void do_view3d_select_metaballmenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
- case 0: /* border select */
- borderselect();
- break;
- case 2: /* Select/Deselect all */
- deselectall_mball();
- break;
- case 3: /* Inverse */
- selectinverse_mball();
- break;
- case 4: /* Select Random */
- selectrandom_mball();
- break;
- }
-#endif
-}
-
-
-static uiBlock *view3d_select_metaballmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_metaballmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void do_view3d_select_latticemenu(bContext *C, void *arg, int event)
-{
-#if 0
-/* extern void borderselect(void);*/
-
- switch(event) {
- case 0: /* border select */
- borderselect();
- break;
- case 2: /* Select/Deselect all */
- deselectall_Latt();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_select_latticemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_latticemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_select_latticemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void do_view3d_select_armaturemenu(bContext *C, void *arg, int event)
-{
-#if 0
-/* extern void borderselect(void);*/
-
- switch(event) {
- case 0: /* border select */
- borderselect();
- break;
- case 2: /* Select/Deselect all */
- deselectall_armature(1, 1);
- break;
- case 3: /* Swap Select All */
- deselectall_armature(3, 1);
- break;
- case 4: /* Select parent */
- armature_select_hierarchy(BONE_SELECT_PARENT, 0);
- break;
- case 5: /* Select child */
- armature_select_hierarchy(BONE_SELECT_CHILD, 0);
- break;
- case 6: /* Extend Select parent */
- armature_select_hierarchy(BONE_SELECT_PARENT, 1);
- break;
- case 7: /* Extend Select child */
- armature_select_hierarchy(BONE_SELECT_CHILD, 1);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_select_armaturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_armaturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_select_armaturemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void do_view3d_select_pose_armaturemenu(bContext *C, void *arg, int event)
-{
-#if 0
-/* extern void borderselect(void);*/
-
- switch(event) {
- case 0: /* border select */
- borderselect();
- break;
- case 2: /* Select/Deselect all */
- deselectall_posearmature(OBACT, 1, 1);
- break;
- case 3: /* Select Target(s) of Constraint(s) */
- pose_select_constraint_target();
- break;
- case 5: /* Swap Select All */
- deselectall_posearmature(OBACT, 3, 1);
- break;
- case 6: /* Select parent */
- pose_select_hierarchy(BONE_SELECT_PARENT, 0);
- break;
- case 7: /* Select child */
- pose_select_hierarchy(BONE_SELECT_CHILD, 0);
- break;
- case 8: /* Extend Select parent */
- pose_select_hierarchy(BONE_SELECT_PARENT, 1);
- break;
- case 9: /* Extend Select child */
- pose_select_hierarchy(BONE_SELECT_CHILD, 1);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_select_pose_armaturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_select_pose_armaturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_select_pose_armaturemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Swap Select All|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Constraint Target|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
void do_view3d_select_faceselmenu(bContext *C, void *arg, int event)
{
#if 0
@@ -1554,59 +568,15 @@ static uiBlock *view3d_select_faceselmenu(bContext *C, ARegion *ar, void *arg_un
return block;
}
-void do_view3d_edit_snapmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch (event) {
- case 1: /*Selection to grid*/
- snap_sel_to_grid();
- ED_undo_push(C, "Snap selection to grid");
- break;
- case 2: /*Selection to cursor*/
- snap_sel_to_curs();
- ED_undo_push(C, "Snap selection to cursor");
- break;
- case 3: /*Selection to center of selection*/
- snap_to_center();
- ED_undo_push(C, "Snap selection to center");
- break;
- case 4: /*Cursor to selection*/
- snap_curs_to_sel();
- break;
- case 5: /*Cursor to grid*/
- snap_curs_to_grid();
- break;
- case 6: /*Cursor to Active*/
- snap_curs_to_active();
- ED_undo_push(C, "Snap selection to center");
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_snapmenu(bContext *C, ARegion *ar, void *arg_unused)
+/* wrapper for python layouts */
+void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, bContext *C)
{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_snapmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Active|Shift S, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
-
-
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
+ void *arg_unused = NULL;
+ ARegion *ar= CTX_wm_region(C);
+ view3d_select_faceselmenu(C, ar, arg_unused);
}
+#if 0
void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
{
#if 0
@@ -1807,7 +777,9 @@ static uiBlock *view3d_transform_scaleaxismenu(bContext *C, ARegion *ar, void *a
uiTextBoundsBlock(block, 60);
return block;
}
+#endif
+#if 0
static void do_view3d_transformmenu(bContext *C, void *arg, int event)
{
#if 0
@@ -1996,6 +968,7 @@ static uiBlock *view3d_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
+#if 0
void do_view3d_object_mirrormenu(bContext *C, void *arg, int event)
{
#if 0
@@ -2041,64 +1014,32 @@ static uiBlock *view3d_object_mirrormenu(bContext *C, ARegion *ar, void *arg_unu
uiTextBoundsBlock(block, 60);
return block;
}
-
-static void do_view3d_edit_object_transformmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 0: /* clear origin */
- clear_object('o');
- break;
- case 1: /* clear scale */
- clear_object('s');
- break;
- case 2: /* clear rotation */
- clear_object('r');
- break;
- case 3: /* clear location */
- clear_object('g');
- break;
- case 4:
- if(OBACT) object_apply_deform(OBACT);
- break;
- case 5: /* make duplis real */
- make_duplilist_real();
- break;
- case 6: /* apply scale/rotation or deformation */
- apply_objects_locrot();
- break;
- case 7: /* apply visual matrix to objects loc/size/rot */
- apply_objects_visual_tx();
- break;
- }
#endif
-}
+#endif
-static uiBlock *view3d_edit_object_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
+#if 0
+static void view3d_edit_object_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_transformmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
-
+#if 0 // XXX not used anymore
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotation to ObData|Ctrl A, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ apply_objects_locrot();
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ apply_objects_visual_tx();
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
+ if(OBACT) object_apply_deform(OBACT);
+#endif
+ uiItemO(layout, NULL, 0, "OBJECT_OT_duplicates_make_real");
+
+ uiItemS(layout);
+
+ uiItemO(layout, NULL, 0, "OBJECT_OT_location_clear");
+ uiItemO(layout, NULL, 0, "OBJECT_OT_rotation_clear");
+ uiItemO(layout, NULL, 0, "OBJECT_OT_scale_clear");
+ uiItemO(layout, NULL, 0, "OBJECT_OT_origin_clear");
}
+#endif
+#if 0
static void do_view3d_edit_object_makelocalmenu(bContext *C, void *arg, int event)
{
#if 0
@@ -2335,164 +1276,9 @@ static uiBlock *view3d_edit_object_copyattrmenu(bContext *C, ARegion *ar, void *
uiTextBoundsBlock(block, 60);
return block;
}
-
-
-static void do_view3d_edit_object_parentmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 0: /* clear parent */
- clear_parent();
- break;
- case 1: /* make parent */
- make_parent();
- break;
- }
#endif
-}
-static uiBlock *view3d_edit_object_parentmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_parentmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_object_groupmenu(bContext *C, void *arg, int event)
-{
#if 0
- switch(event) {
- case 1:
- case 2:
- case 3:
- group_operation(event);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_object_groupmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_groupmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_groupmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to Existing Group|Ctrl G, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to New Group|Ctrl G, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove from All Groups|Ctrl G, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_object_trackmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 0: /* clear track */
- clear_track();
- break;
- case 1: /* make track */
- make_track();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_object_trackmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_trackmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_object_constraintsmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 1: /* add constraint */
- add_constraint(0);
- break;
- case 2: /* clear constraint */
- ob_clear_constraints();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_object_constraintsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_constraintsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_constraintsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint...|Ctrl Alt C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_object_showhidemenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 0: /* show objects */
- show_objects();
- break;
- case 1: /* hide selected objects */
- hide_objects(1);
- break;
- case 2: /* hide deselected objects */
- hide_objects(0);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_object_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_object_showhidemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_object_showhidemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
#ifndef DISABLE_PYTHON
static void do_view3d_edit_object_scriptsmenu(bContext *C, void *arg, int event)
{
@@ -2522,11 +1308,12 @@ static uiBlock *view3d_edit_object_scriptsmenu(bContext *C, ARegion *ar, void *a
return block;
}
#endif /* DISABLE_PYTHON */
+#endif
+#if 0
static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
{
-#if 0
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
@@ -2536,15 +1323,6 @@ static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
case 0: /* transform properties*/
// XXX mainqenter(NKEY, 1);
break;
- case 1: /* delete */
- delete_context_selected();
- break;
- case 2: /* duplicate */
- duplicate_context_selected();
- break;
- case 3: /* duplicate linked */
- adduplicate(0, 0);
- break;
case 5: /* make single user */
single_user();
break;
@@ -2563,9 +1341,6 @@ static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
case 11: /* insert keyframe */
common_insertkey();
break;
- case 15: /* Object Panel */
- add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
- break;
case 16: /* make proxy object*/
make_proxy();
break;
@@ -2573,1753 +1348,9 @@ static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
common_deletekey();
break;
}
-#endif
-}
-
-static uiBlock *view3d_edit_objectmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- Scene *scene= CTX_data_scene(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_objectmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Proxy|Ctrl Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if (OBACT && OBACT->type == OB_MESH) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- }
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Objects", 0, yco-=20, 120, 19, "");
-
-#ifndef DISABLE_PYTHON
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-#endif
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-
-static void do_view3d_edit_propfalloffmenu(bContext *C, void *arg, int event)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
-
- ts->prop_mode= event;
-
-}
-
-static uiBlock *view3d_edit_propfalloffmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_propfalloffmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
-
- if (ts->prop_mode==PROP_SMOOTH) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
- if (ts->prop_mode==PROP_SPHERE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
- if (ts->prop_mode==PROP_ROOT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
- if (ts->prop_mode==PROP_SHARP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
- if (ts->prop_mode==PROP_LIN) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
- if (ts->prop_mode==PROP_RANDOM) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
- if (ts->prop_mode==PROP_CONST) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-
-void do_view3d_edit_mesh_verticesmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
-
- switch(event) {
- int count;
-
- case 0: /* make vertex parent */
- make_parent();
- break;
- case 1: /* remove doubles */
- count= removedoublesflag(1, 0, ts->doublimit);
- notice("Removed: %d", count);
- if (count) { /* only undo and redraw if an action is taken */
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- ED_undo_push(C, "Rem Doubles");
- }
- break;
- case 2: /* smooth */
- vertexsmooth();
- break;
- case 3: /* separate */
- separate_mesh();
- break;
- case 4: /*split */
- split_mesh();
- break;
- case 5: /*merge */
- mergemenu();
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 6: /* add hook */
- add_hook_menu();
- break;
- case 7: /* rip */
- mesh_rip();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_verticesmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
-
-void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
- float fac;
- short randfac;
-
- switch(event) {
-
- case 0: /* subdivide smooth */
- esubdivideflag(1, 0.0, ts->editbutflag | B_SMOOTH,1,0);
- ED_undo_push(C, "Subdivide Smooth");
- break;
- case 1: /*subdivide fractal */
- randfac= 10;
- if(button(&randfac, 1, 100, "Rand fac:")==0) return;
- fac= -( (float)randfac )/100;
- esubdivideflag(1, fac, ts->editbutflag,1,0);
- ED_undo_push(C, "Subdivide Fractal");
- break;
- case 2: /* subdivide */
- esubdivideflag(1, 0.0, ts->editbutflag,1,0);
- ED_undo_push(C, "Subdivide");
- break;
- case 3: /* knife subdivide */
- KnifeSubdivide(KNIFE_PROMPT);
- break;
- case 4: /* Loop subdivide */
- CutEdgeloop(1);
- break;
- case 5: /* Make Edge/Face */
- addedgeface_mesh();
- break;
- case 6:
- bevel_menu();
- break;
- case 7: /* Mark Seam */
- editmesh_mark_seam(0);
- break;
- case 8: /* Clear Seam */
- editmesh_mark_seam(1);
- break;
- case 9: /* Crease SubSurf */
- if(!multires_level1_test()) {
- initTransform(TFM_CREASE, CTX_EDGE);
- Transform();
- }
- break;
- case 10: /* Rotate Edge */
- edge_rotate_selected(2);
- break;
- case 11: /* Rotate Edge */
- edge_rotate_selected(1);
- break;
- case 12: /* Edgeslide */
- EdgeSlide(0,0.0);
- break;
- case 13: /* Edge Loop Delete */
- if(EdgeLoopDelete()) {
- countall();
- ED_undo_push(C, "Erase Edge Loop");
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- }
- break;
- case 14: /*Collapse Edges*/
- collapseEdges();
- ED_undo_push(C, "Collapse");
- break;
- case 15:
- editmesh_mark_sharp(1);
- ED_undo_push(C, "Mark Sharp");
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 16:
- editmesh_mark_sharp(0);
- ED_undo_push(C, "Clear Sharp");
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 17: /* Adjust Bevel Weight */
- if(!multires_level1_test()) {
- initTransform(TFM_BWEIGHT, CTX_EDGE);
- Transform();
- }
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_edgesmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Sharp|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Sharp|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Adjust Bevel Weight|Ctrl Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-void do_view3d_edit_mesh_facesmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
-
- switch(event) {
- case 0: /* Fill Faces */
- fill_mesh();
- break;
- case 1: /* Beauty Fill Faces */
- beauty_fill();
- break;
- case 2: /* Quads to Tris */
- convert_to_triface(0);
- countall();
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- break;
- case 3: /* Tris to Quads */
- join_triangles();
- break;
- case 4: /* Flip triangle edges */
- edge_flip();
- break;
- case 5: /* Make Edge/Face */
- addedgeface_mesh();
- break;
- case 6: /* Set Smooth */
- mesh_set_smooth_faces(1);
- break;
- case 7: /* Set Solid */
- mesh_set_smooth_faces(0);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_facesmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mesh_facesmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Smooth|W, Alt 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Solid|W, Alt 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-void do_view3d_edit_mesh_normalsmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 0: /* flip */
- flip_editnormals();
- break;
- case 1: /* recalculate inside */
- righthandfaces(2);
- break;
- case 2: /* recalculate outside */
- righthandfaces(1);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_normalsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-void do_view3d_edit_mirrormenu(bContext *C, void *arg, int event)
-{
-#if 0
- float mat[3][3];
-
- Mat3One(mat);
-
- switch(event) {
- case 0:
- initTransform(TFM_MIRROR, CTX_NO_PET);
- Transform();
- break;
- case 1:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setSingleAxisConstraint(mat[0], " on global X axis");
- Transform();
- break;
- case 2:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
- Transform();
- break;
- case 3:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setSingleAxisConstraint(mat[2], "on global Z axis");
- Transform();
- break;
- case 4:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setLocalAxisConstraint('X', " on local X axis");
- Transform();
- break;
- case 5:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setLocalAxisConstraint('Y', " on local Y axis");
- Transform();
- break;
- case 6:
- initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setLocalAxisConstraint('Z', " on local Z axis");
- Transform();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mirrormenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_mesh_showhidemenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 0: /* show hidden vertices */
- reveal_mesh();
- break;
- case 1: /* hide selected vertices */
- hide_mesh(0);
- break;
- case 2: /* hide deselected vertices */
- hide_mesh(1);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-#ifndef DISABLE_PYTHON
-static void do_view3d_edit_mesh_scriptsmenu(bContext *C, void *arg, int event)
-{
-#if 0
- BPY_menu_do_python(PYMENU_MESH, event);
-
-#endif
-}
-
-static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-// short yco = 20, menuwidth = 120;
-// XXX BPyMenu *pym;
-// int i = 0;
-
- block= uiBeginBlock(C, ar, "v3d_emesh_pymenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
-
-// for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
-// uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
-// }
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
-}
-#endif /* DISABLE_PYTHON */
-
-static void do_view3d_edit_meshmenu(bContext *C, void *arg, int event)
-{
-#if 0
- ToolSettings *ts= CTX_data_tool_settings(C);
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
-
- switch(event) {
-
- case 0: /* Undo Editing */
- BIF_undo();
- break;
- case 1: /* Redo Editing */
- BIF_redo();
- break;
- case 2: /* transform properties */
- add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0);
- break;
- case 4: /* insert keyframe */
- common_insertkey();
- break;
- case 5: /* Extrude */
- extrude_mesh();
- break;
- case 6: /* duplicate */
- duplicate_context_selected();
- break;
- case 7: /* make edge face */
- addedgeface_mesh();
- break;
- case 8: /* delete */
- delete_context_selected();
- break;
- case 9: /* Shrink/Fatten Along Normals */
- initTransform(TFM_SHRINKFATTEN, CTX_NONE);
- Transform();
- break;
- case 10: /* Shear */
- initTransform(TFM_SHEAR, CTX_NONE);
- Transform();
- break;
- case 11: /* Warp */
- initTransform(TFM_WARP, CTX_NONE);
- Transform();
- break;
- case 12: /* proportional edit (toggle) */
- if(ts->proportional) ts->proportional= 0;
- else ts->proportional= 1;
- break;
- case 13: /* automerge edit (toggle) */
- if(ts->automerge) ts->automerge= 0;
- else ts->automerge= 1;
- break;
- case 15:
- uv_autocalc_tface();
- break;
- case 16: /* delete keyframe */
- common_deletekey();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_meshmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- Object *obedit = CTX_data_edit_object(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_meshmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Ctrl Shift Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-// XXX uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_mesh_verticesmenu, NULL, ICON_RIGHTARROW_THIN, "Vertices", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mesh_edgesmenu, NULL, ICON_RIGHTARROW_THIN, "Edges", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Faces", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
-
-
- if(ts->proportional) {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- } else {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- }
- uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- /* PITA but we should let users know that automerge cant work with multires :/ */
- uiDefIconTextBut(block, BUTM, 1,
- ts->automerge ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT,
- ((Mesh*)obedit->data)->mr ? "AutoMerge Editing (disabled by multires)" : "AutoMerge Editing",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
-
-#ifndef DISABLE_PYTHON
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-#endif
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void view3d_edit_curve_controlpointsmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- Object *obedit= CTX_data_edit_object(C);
-
- if(obedit->type == OB_CURVE) {
- uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TILT);
- uiItemO(layout, NULL, 0, "CURVE_OT_tilt_clear");
- uiItemO(layout, NULL, 0, "CURVE_OT_separate");
-
- uiItemS(layout);
-
- uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 1);
- uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 3);
- uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 2);
-
- uiItemS(layout);
- }
-
- // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_make_vertex_parent"); Make VertexParent|Ctrl P
- // make_parent()
- // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_add_hook"); Add Hook| Ctrl H
- // add_hook_menu()
-}
-
-static void view3d_edit_curve_segmentsmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "CURVE_OT_subdivide");
- uiItemO(layout, NULL, 0, "CURVE_OT_switch_direction");
-}
-
-static void view3d_edit_curve_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "CURVE_OT_reveal");
- uiItemO(layout, NULL, 0, "CURVE_OT_hide");
- uiItemBooleanO(layout, "Hide Unselected", 0, "CURVE_OT_hide", "unselected", 1);
-}
-
-static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- PointerRNA sceneptr;
- Scene *scene= CTX_data_scene(C);
-
- RNA_id_pointer_create(&scene->id, &sceneptr);
-
-#if 0
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
-
- uiItemS(layout);
-#endif
-
- // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- // common_insertkey();
- // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- // common_deletekey();
-
-
- uiItemO(layout, NULL, 0, "CURVE_OT_extrude");
- uiItemO(layout, NULL, 0, "CURVE_OT_duplicate");
- uiItemO(layout, NULL, 0, "CURVE_OT_separate");
- uiItemO(layout, NULL, 0, "CURVE_OT_make_segment");
- uiItemO(layout, NULL, 0, "CURVE_OT_cyclic_toggle");
- uiItemO(layout, NULL, 0, "CURVE_OT_delete"); // Delete...
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "Control Points", 0, view3d_edit_curve_controlpointsmenu);
- uiItemMenuF(layout, "Segments", 0, view3d_edit_curve_segmentsmenu);
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &sceneptr, "proportional_editing", 0, 0, 0); // |O
- uiItemMenuEnumR(layout, NULL, 0, &sceneptr, "proportional_editing_falloff");
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu);
-}
-
-static void do_view3d_edit_mball_showhidemenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 10: /* show hidden control points */
- reveal_mball();
- break;
- case 11: /* hide selected control points */
- hide_mball(0);
- break;
- case 12: /* hide selected control points */
- hide_mball(1);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_mball_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_mball_showhidemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_mball_showhidemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-static void do_view3d_edit_metaballmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
-
- switch(event) {
- case 1: /* undo */
- BIF_undo();
- break;
- case 2: /* redo */
- BIF_redo();
- break;
- case 3: /* duplicate */
- duplicate_context_selected();
- break;
- case 4: /* delete */
- delete_context_selected();
- break;
- case 5: /* Shear */
- initTransform(TFM_SHEAR, CTX_NONE);
- Transform();
- break;
- case 6: /* Warp */
- initTransform(TFM_WARP, CTX_NONE);
- Transform();
- break;
- case 7: /* Transform Properties */
- add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_metaballmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_metaballmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_metaballmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-// XXX uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_mball_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Hide MetaElems", 0, yco-=20, 120, 19, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void view3d_edit_text_charsmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- /* the character codes are specified in UTF-8 */
-
- uiItemStringO(layout, "Copyright|Alt C", 0, "FONT_OT_text_insert", "text", "\xC2\xA9");
- uiItemStringO(layout, "Registered Trademark|Alt R", 0, "FONT_OT_text_insert", "text", "\xC2\xAE");
-
- uiItemS(layout);
-
- uiItemStringO(layout, "Degree Sign|Alt G", 0, "FONT_OT_text_insert", "text", "\xC2\xB0");
- uiItemStringO(layout, "Multiplication Sign|Alt x", 0, "FONT_OT_text_insert", "text", "\xC3\x97");
- uiItemStringO(layout, "Circle|Alt .", 0, "FONT_OT_text_insert", "text", "\xC2\x8A");
- uiItemStringO(layout, "Superscript 1|Alt 1", 0, "FONT_OT_text_insert", "text", "\xC2\xB9");
- uiItemStringO(layout, "Superscript 2|Alt 2", 0, "FONT_OT_text_insert", "text", "\xC2\xB2");
- uiItemStringO(layout, "Superscript 3|Alt 3", 0, "FONT_OT_text_insert", "text", "\xC2\xB3");
- uiItemStringO(layout, "Double >>|Alt >", 0, "FONT_OT_text_insert", "text", "\xC2\xBB");
- uiItemStringO(layout, "Double <<|Alt <", 0, "FONT_OT_text_insert", "text", "\xC2\xAB");
- uiItemStringO(layout, "Promillage|Alt %", 0, "FONT_OT_text_insert", "text", "\xE2\x80\xB0");
-
- uiItemS(layout);
-
- uiItemStringO(layout, "Dutch Florin|Alt F", 0, "FONT_OT_text_insert", "text", "\xC2\xA4");
- uiItemStringO(layout, "British Pound|Alt L", 0, "FONT_OT_text_insert", "text", "\xC2\xA3");
- uiItemStringO(layout, "Japanese Yen|Alt Y", 0, "FONT_OT_text_insert", "text", "\xC2\xA5");
-
- uiItemS(layout);
-
- uiItemStringO(layout, "German S|Alt S", 0, "FONT_OT_text_insert", "text", "\xC3\x9F");
- uiItemStringO(layout, "Spanish Question Mark|Alt ?", 0, "FONT_OT_text_insert", "text", "\xC2\xBF");
- uiItemStringO(layout, "Spanish Exclamation Mark|Alt !", 0, "FONT_OT_text_insert", "text", "\xC2\xA1");
-}
-
-static void view3d_edit_textmenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "FONT_OT_file_paste");
- uiItemS(layout);
- uiItemMenuF(layout, "Special Characters", 0, view3d_edit_text_charsmenu);
-}
-
-static void do_view3d_edit_latticemenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
-
- switch(event) {
-
- case 0: /* Undo Editing */
- remake_editLatt();
- break;
- case 2: /* insert keyframe */
- common_insertkey();
- break;
- case 3: /* Shear */
- initTransform(TFM_SHEAR, CTX_NONE);
- Transform();
- break;
- case 4: /* Warp */
- initTransform(TFM_WARP, CTX_NONE);
- Transform();
- break;
- case 5: /* proportional edit (toggle) */
- if(ts->proportional) ts->proportional= 0;
- else ts->proportional= 1;
- break;
- case 7: /* delete keyframe */
- common_deletekey();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_latticemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_latticemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_latticemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(ts->proportional) {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- } else {
- uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- }
- uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-void do_view3d_edit_armature_parentmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch(event) {
- case 1:
- make_bone_parent();
- break;
- case 2:
- clear_bone_parent();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_edit_armature_parentmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_armature_parentmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_armature_parentmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-void do_view3d_edit_armature_rollmenu(bContext *C, void *arg, int event)
-{
-#if 0
- if (event == 1 || event == 2)
- /* set roll based on aligning z-axis */
- auto_align_armature(event);
- else if (event == 3) {
- /* interactively set bone roll */
- initTransform(TFM_BONE_ROLL, CTX_NONE);
- Transform();
- }
-#endif
-}
-
-static uiBlock *view3d_edit_armature_rollmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_armature_rollmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_armature_rollmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Roll (Z-Axis Up)|Ctrl N, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Roll to Cursor|Ctrl N, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Roll|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_edit_armaturemenu(bContext *C, void *arg, int event)
-{
-#if 0
- static short numcuts= 2;
-
- switch(event) {
- case 0: /* Undo Editing */
- remake_editArmature();
- break;
- case 1: /* transformation properties */
-// XXX mainqenter(NKEY, 1);
- break;
- case 3: /* extrude */
- extrude_armature(0);
- break;
- case 4: /* duplicate */
- duplicate_context_selected();
- break;
- case 5: /* delete */
- delete_context_selected();
- break;
- case 6: /* Shear */
- initTransform(TFM_SHEAR, CTX_NONE);
- Transform();
- break;
- case 7: /* Warp */
- initTransform(TFM_WARP, CTX_NONE);
- Transform();
- case 10: /* forked! */
- extrude_armature(1);
- break;
- case 12: /* subdivide */
- subdivide_armature(1);
- break;
- case 13: /* flip left and right names */
- armature_flip_names();
- break;
- case 15: /* subdivide multi */
- if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
- waitcursor(1);
- subdivide_armature(numcuts);
- break;
- case 16: /* Alt-S transform (BoneSize) */
- initTransform(TFM_BONESIZE, CTX_NONE);
- Transform();
- break;
- case 17: /* move to layer */
- pose_movetolayer();
- break;
- case 18: /* merge bones */
- merge_armature();
- break;
- case 19: /* auto-extensions */
- case 20:
- case 21:
- armature_autoside_names(event-19);
- break;
- case 22: /* separate */
- separate_armature();
- break;
- case 23: /* bone sketching panel */
- add_blockhandler(curarea, VIEW3D_HANDLER_BONESKETCH, UI_PNL_UNSTOW);
- break;
- }
-
-#endif
-}
-
-
-#ifndef DISABLE_PYTHON
-static void do_view3d_scripts_armaturemenu(bContext *C, void *arg, int event)
-{
-#if 0
- BPY_menu_do_python(PYMENU_ARMATURE, event);
-
-#endif
-}
-
-static uiBlock *view3d_scripts_armaturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
-// XXX BPyMenu *pym;
-// int i= 0;
-// short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_scripts_armaturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_scripts_armaturemenu, NULL);
-
- /* note that we acount for the N previous entries with i+20: */
-// for (pym = BPyMenuTable[PYMENU_ARMATURE]; pym; pym = pym->next, i++) {
-//
-// uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
-// NULL, 0.0, 0.0, 1, i,
-// pym->tooltip?pym->tooltip:pym->filename);
-// }
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
-}
-#endif /* DISABLE_PYTHON */
-
-static void do_view3d_armature_settingsmenu(bContext *C, void *arg, int event)
-{
-// XXX setflag_armature(event);
-}
-
-static uiBlock *view3d_armature_settingsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_armature_settingsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_armature_settingsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle a Setting|Shift W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Enable a Setting|Ctrl Shift W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disable a Setting|Alt W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
-
- return block;
-}
-
-static uiBlock *view3d_edit_armaturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm= obedit->data;
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_edit_armaturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_edit_armaturemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Bone Sketching|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_edit_armature_rollmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Roll", 0, yco-=20, 120, 19, "");
-
- if (arm->drawtype==ARM_ENVELOPE)
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Envelope Distance|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- else if (arm->drawtype==ARM_B_BONE)
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale B-Bone Width|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- if (arm->flag & ARM_MIRROR_EDIT)
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude Forked|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill Between Joints|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|Ctrl Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Multi|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Left & Right Names|W, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Left-Right|W, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_edit_armature_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_armature_settingsmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Settings", 0, yco-=20, 120, 19, "");
-
-#ifndef DISABLE_PYTHON
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_scripts_armaturemenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
-#endif
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
-
- return block;
-}
-
-static void do_view3d_pose_armature_transformmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
-
- switch(event) {
- case 0: /* clear origin */
- clear_object('o');
- break;
- case 1: /* clear scale */
- clear_object('s');
- break;
- case 2: /* clear rotation */
- clear_object('r');
- break;
- case 3: /* clear location */
- clear_object('g');
- break;
- case 4: /* clear user transform */
- clear_user_transform(scene, ob);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_transformmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_transformmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear User Transform|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_showhidemenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 0: /* show hidden bones */
- show_all_pose_bones();
- break;
- case 1: /* hide selected bones */
- hide_selected_pose_bones();
- break;
- case 2: /* hide deselected bones */
- hide_unselected_pose_bones();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_showhidemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_showhidemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_ikmenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 1:
- pose_add_IK();
- break;
- case 2:
- pose_clear_IK();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_ikmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_ikmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_ikmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add IK to Bone...|Shift I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear IK...|Ctrl Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_constraintsmenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 1:
- add_constraint(0);
- break;
- case 2:
- pose_clear_constraints();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_constraintsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_constraintsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_constraintsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint to Bone...|Ctrl Alt C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints...|Alt C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_groupmenu(bContext *C, void *arg, int event)
-{
-#if 0
- switch (event) {
- case 1:
- pose_assign_to_posegroup(1);
- break;
- case 2:
- pose_assign_to_posegroup(0);
- break;
- case 3:
- pose_add_posegroup();
- break;
- case 4:
- pose_remove_from_posegroups();
- break;
- case 5:
- pose_remove_posegroup();
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_groupmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_groupmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_groupmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Selected to Active Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Selected to Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add New Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove from All Groups|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Active Group|Ctrl G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_motionpathsmenu(bContext *C, void *arg, int event)
-{
-#if 0
-
- switch(event) {
-
- case 1:
- pose_calculate_path(OBACT);
- break;
- case 2:
- pose_clear_paths(OBACT);
- break;
- }
-#endif
-}
-
-static uiBlock *view3d_pose_armature_motionpathsmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_motionpathsmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_motionpathsmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Calculate Paths|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear All Paths|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armature_poselibmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Object *ob= OBACT;
-
- switch(event) {
- case 1:
- poselib_preview_poses(ob, 0);
- break;
- case 2:
- poselib_add_current_pose(ob, 0);
- break;
- case 3:
- poselib_rename_pose(ob);
- break;
- case 4:
- poselib_remove_pose(ob, NULL);
- break;
- }
-
-#endif
-}
-
-static uiBlock *view3d_pose_armature_poselibmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armature_poselibmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armature_poselibmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Browse Poses|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add/Replace Pose|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rename Pose|Ctrl Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Pose|Alt L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
-static void do_view3d_pose_armaturemenu(bContext *C, void *arg, int event)
-{
-#if 0
- Object *ob;
- ob=OBACT;
-
- switch(event) {
- case 0: /* transform properties */
-// XXX mainqenter(NKEY, 1);
- break;
- case 1: /* copy current pose */
- copy_posebuf();
- break;
- case 2: /* paste pose */
- paste_posebuf(0);
- break;
- case 3: /* paste flipped pose */
- paste_posebuf(1);
- break;
- case 4: /* insert keyframe */
- common_insertkey();
- break;
- case 5:
- pose_copy_menu();
- break;
- case 9:
- pose_flip_names();
- break;
- case 13:
- if(ob && (ob->flag & OB_POSEMODE)) {
- bArmature *arm= ob->data;
- if( (arm->drawtype == ARM_B_BONE) || (arm->drawtype == ARM_ENVELOPE)) {
- initTransform(TFM_BONESIZE, CTX_NONE);
- Transform();
- break;
- }
- }
- break;
- case 14: /* move bone to layer / change armature layer */
- pose_movetolayer();
- break;
- case 15:
- pose_relax();
- break;
- case 16: /* auto-extensions for bones */
- case 17:
- case 18:
- pose_autoside_names(event-16);
- break;
- case 19: /* assign pose as restpose */
- apply_armature_pose2bones();
- break;
- case 20: /* delete keyframe */
- common_deletekey();
- break;
- }
-
-#endif
-}
-
-static uiBlock *view3d_pose_armaturemenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "view3d_pose_armaturemenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_pose_armaturemenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_pose_armature_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear Transform", 0, yco-=20, 120, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Envelope Distance|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Relax Pose|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Pose as Restpose|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Current Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Flipped Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_pose_armature_poselibmenu, NULL, ICON_RIGHTARROW_THIN, "Pose Library", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_pose_armature_motionpathsmenu, NULL, ICON_RIGHTARROW_THIN, "Motion Paths", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_pose_armature_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Groups", 0, yco-=20, 120, 19, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_pose_armature_ikmenu, NULL, ICON_RIGHTARROW_THIN, "Inverse Kinematics", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_pose_armature_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Left-Right|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip L/R Names|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Attributes...|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBlockBut(block, view3d_pose_armature_showhidemenu,
- NULL, ICON_RIGHTARROW_THIN, "Show/Hide Bones", 0, yco-=20, 120, 19, "");
- uiDefIconTextBlockBut(block, view3d_armature_settingsmenu,
- NULL, ICON_RIGHTARROW_THIN, "Bone Settings", 0, yco-=20, 120, 19, "");
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
-
- return block;
-}
-
-/* vertex paint menu */
-static void do_view3d_vpaintmenu(bContext *C, void *arg, int event)
-{
-#if 0
- /* events >= 3 are registered bpython scripts */
-#ifndef DISABLE_PYTHON
- if (event >= 3) BPY_menu_do_python(PYMENU_VERTEXPAINT, event - 3);
-#endif
- switch(event) {
- case 0: /* undo vertex painting */
- BIF_undo();
- break;
- case 1: /* set vertex colors/weight */
- if(FACESEL_PAINT_TEST)
- clear_vpaint_selectedfaces();
- else /* we know were in vertex paint mode */
- clear_vpaint();
- break;
- case 2:
- make_vertexcol(1);
- break;
- }
-#endif
}
-
-static uiBlock *view3d_vpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth=120;
-#ifndef DISABLE_PYTHON
-// XXX BPyMenu *pym;
-// int i=0;
-#endif
-
- block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_vpaintmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Vertex Painting|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Shaded Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
-#ifndef DISABLE_PYTHON
- /* note that we account for the 3 previous entries with i+3:
- even if the last item isnt displayed, it dosent matter */
-// for (pym = BPyMenuTable[PYMENU_VERTEXPAINT]; pym; pym = pym->next, i++) {
-// uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
-// menuwidth, 19, NULL, 0.0, 0.0, 1, i+3,
-// pym->tooltip?pym->tooltip:pym->filename);
-// }
#endif
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
/* texture paint menu (placeholder, no items yet??) */
static void do_view3d_tpaintmenu(bContext *C, void *arg, int event)
@@ -4405,7 +1436,7 @@ static uiBlock *view3d_wpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- if (FACESEL_PAINT_TEST) {
+ if (paint_facesel_test(CTX_data_active_object(C))) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Weight|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
menunr++;
@@ -4433,184 +1464,6 @@ static uiBlock *view3d_wpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-void do_view3d_sculpt_inputmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
- SculptData *sd= &scene->sculptdata;
- short val;
-
- switch(event) {
- case 0:
- sd->flags ^= SCULPT_INPUT_SMOOTH;
- ED_undo_push(C, "Smooth stroke");
- break;
- case 1:
- val= sd->tablet_size;
- if(button(&val,0,10,"Tablet Size:")==0) return;
- sd->tablet_size= val;
- ED_undo_push(C, "Tablet size");
- break;
- case 2:
- val= sd->tablet_strength;
- if(button(&val,0,10,"Tablet Strength:")==0) return;
- sd->tablet_strength= val;
- ED_undo_push(C, "Tablet strength");
- break;
- }
-
-#endif
-}
-
-void do_view3d_sculptmenu(bContext *C, void *arg, int event)
-{
-#if 0
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- SculptData *sd= &scene->sculptdata;
- BrushData *br= sculptmode_brush();
-
- switch(event) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- sd->brush_type= event+1;
- ED_undo_push(C, "Brush type");
- break;
- case 11:
- if(v3d)
- v3d->pivot_last= !v3d->pivot_last;
- break;
- case 12:
- sd->flags ^= SCULPT_DRAW_FAST;
- ED_undo_push(C, "Partial Redraw");
- break;
- case 13:
- sd->flags ^= SCULPT_DRAW_BRUSH;
- ED_undo_push(C, "Draw Brush");
- break;
- case 14:
- add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
- break;
- case 15:
- sculpt_radialcontrol_start(RADIALCONTROL_ROTATION);
- break;
- case 16:
- sculpt_radialcontrol_start(RADIALCONTROL_STRENGTH);
- break;
- case 17:
- sculpt_radialcontrol_start(RADIALCONTROL_SIZE);
- break;
-#endif
-}
-
-uiBlock *view3d_sculpt_inputmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- uiBlock *block;
- short yco= 0, menuwidth= 120;
- Sculpt *sd= CTX_data_tool_settings(C)->sculpt;
-
- block= uiBeginBlock(C, ar, "view3d_sculpt_inputmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_sculpt_inputmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_INPUT_SMOOTH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Smooth Stroke|Shift S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Size Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Strength Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 50);
- return block;
-}
-
-static void view3d_sculpt_menu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- bScreen *sc= CTX_wm_screen(C);
- Sculpt *s = CTX_data_tool_settings(C)->sculpt;
- PointerRNA rna;
-
- RNA_pointer_create(&sc->id, &RNA_Sculpt, s, &rna);
-
- uiItemR(layout, NULL, 0, &rna, "symmetry_x", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "symmetry_y", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "symmetry_z", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "lock_x", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "lock_y", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "lock_z", 0, 0, 0);
-
- /* Brush settings */
- RNA_pointer_create(&sc->id, &RNA_Brush, s->brush, &rna);
-
- /* Curve */
- uiItemS(layout);
- uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SHARP);
- uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_SMOOTH);
- uiItemEnumO(layout, NULL, 0, "SCULPT_OT_brush_curve_preset", "mode", BRUSH_PRESET_MAX);
-
- uiItemS(layout);
-
- uiItemR(layout, NULL, 0, &rna, "airbrush", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "rake", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "anchored", 0, 0, 0);
- uiItemR(layout, NULL, 0, &rna, "space", 0, 0, 0);
-
- uiItemR(layout, NULL, 0, &rna, "flip_direction", 0, 0, 0);
-}
-
-uiBlock *view3d_sculptmenu(bContext *C, ARegion *ar, void *arg_unused)
-{
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- uiBlock *block;
- Sculpt *sd= CTX_data_tool_settings(C)->sculpt;
-// XXX const BrushData *br= sculptmode_brush();
- short yco= 0, menuwidth= 120;
-
- block= uiBeginBlock(C, ar, "view3d_sculptmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_view3d_sculptmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Sculpt Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_sculpt_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input Settings", 0, yco-=20, 120, 19, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_DRAW_BRUSH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Display Brush", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
- uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_DRAW_FAST) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Partial Redraw", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- if(v3d)
- uiDefIconTextBut(block, BUTM, 1, (v3d->pivot_last ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Pivot Last", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Brush|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strengthen Brush|Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Brush|Ctrl F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- /* XXX uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==FLATTEN_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Flatten|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==LAYER_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Layer|L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==GRAB_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Grab|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==INFLATE_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Inflate|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==PINCH_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Pinch|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==SMOOTH_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Smooth|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==DRAW_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Draw|D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");*/
-
-
- if(ar->alignment==RGN_ALIGN_TOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
-
- return block;
-}
-
static void do_view3d_facesel_showhidemenu(bContext *C, void *arg, int event)
{
#if 0
@@ -4695,61 +1548,6 @@ static uiBlock *view3d_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void view3d_select_particlemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
-
- uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_all_toggle");
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_linked");
-
- if(ts->particle.selectmode & SCE_SELECT_POINT) {
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_last"); // |W, 4
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_first"); // |W, 3
- }
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_more");
- uiItemO(layout, NULL, 0, "PARTICLE_OT_select_less");
-}
-
-static void view3d_particle_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- uiItemO(layout, NULL, 0, "PARTICLE_OT_reveal");
- uiItemO(layout, NULL, 0, "PARTICLE_OT_hide");
- uiItemBooleanO(layout, "Hide Unselected", 0, "PARTICLE_OT_hide", "unselected", 1);
-}
-
-static void view3d_particlemenu(bContext *C, uiLayout *layout, void *arg_unused)
-{
- ToolSettings *ts= CTX_data_tool_settings(C);
-
- // XXX uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Particle Edit Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- // add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
- // XXX uiItemS(layout);
- //
- // XXX uiDefIconTextBut(block, BUTM, 1, (pset->flag & PE_X_MIRROR)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT, "X-Axis Mirror Editing", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
- // pset->flag ^= PE_X_MIRROR;
-
- uiItemO(layout, NULL, 0, "PARTICLE_OT_mirror"); // |Ctrl M
-
- uiItemS(layout);
-
- uiItemO(layout, NULL, 0, "PARTICLE_OT_remove_doubles"); // |W, 5
- uiItemO(layout, NULL, 0, "PARTICLE_OT_delete");
- if(ts->particle.selectmode & SCE_SELECT_POINT)
- uiItemO(layout, NULL, 0, "PARTICLE_OT_subdivide"); // |W, 2
- uiItemO(layout, NULL, 0, "PARTICLE_OT_rekey"); // |W, 1
-
- uiItemS(layout);
-
- uiItemMenuF(layout, "Show/Hide Particles", 0, view3d_particle_showhidemenu);
-}
-
static char *view3d_modeselect_pup(Scene *scene)
{
Object *ob= OBACT;
@@ -4759,38 +1557,40 @@ static char *view3d_modeselect_pup(Scene *scene)
str += sprintf(str, "Mode: %%t");
- if(ob)
- str += sprintf(str, formatstr, "Object Mode", V3D_OBJECTMODE_SEL, ICON_OBJECT_DATA);
- else
- str += sprintf(str, formatstr, "Object Mode", V3D_OBJECTMODE_SEL, ICON_OBJECT_DATA);
+ str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA);
if(ob==NULL) return string;
/* if active object is editable */
- if ( ((ob->type == OB_MESH) || (ob->type == OB_ARMATURE)
+ if ( ((ob->type == OB_MESH)
|| (ob->type == OB_CURVE) || (ob->type == OB_SURF) || (ob->type == OB_FONT)
|| (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) {
- str += sprintf(str, formatstr, "Edit Mode", V3D_EDITMODE_SEL, ICON_EDITMODE_HLT);
+ str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT, ICON_EDITMODE_HLT);
+ }
+ else if (ob->type == OB_ARMATURE) {
+ if (ob->mode & OB_MODE_POSE)
+ str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT|OB_MODE_POSE, ICON_EDITMODE_HLT);
+ else
+ str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT, ICON_EDITMODE_HLT);
}
if (ob->type == OB_MESH) {
- str += sprintf(str, formatstr, "Sculpt Mode", V3D_SCULPTMODE_SEL, ICON_SCULPTMODE_HLT);
- /*str += sprintf(str, formatstr, "Face Select", V3D_FACESELECTMODE_SEL, ICON_FACESEL_HLT);*/
- str += sprintf(str, formatstr, "Vertex Paint", V3D_VERTEXPAINTMODE_SEL, ICON_VPAINT_HLT);
- str += sprintf(str, formatstr, "Texture Paint", V3D_TEXTUREPAINTMODE_SEL, ICON_TPAINT_HLT);
- str += sprintf(str, formatstr, "Weight Paint", V3D_WEIGHTPAINTMODE_SEL, ICON_WPAINT_HLT);
+ str += sprintf(str, formatstr, "Sculpt Mode", OB_MODE_SCULPT, ICON_SCULPTMODE_HLT);
+ str += sprintf(str, formatstr, "Vertex Paint", OB_MODE_VERTEX_PAINT, ICON_VPAINT_HLT);
+ str += sprintf(str, formatstr, "Texture Paint", OB_MODE_TEXTURE_PAINT, ICON_TPAINT_HLT);
+ str += sprintf(str, formatstr, "Weight Paint", OB_MODE_WEIGHT_PAINT, ICON_WPAINT_HLT);
}
/* if active object is an armature */
if (ob->type==OB_ARMATURE) {
- str += sprintf(str, formatstr, "Pose Mode", V3D_POSEMODE_SEL, ICON_POSE_HLT);
+ str += sprintf(str, formatstr, "Pose Mode", OB_MODE_POSE, ICON_POSE_HLT);
}
- if (ob->particlesystem.first) {
- str += sprintf(str, formatstr, "Particle Mode", V3D_PARTICLEEDITMODE_SEL, ICON_PARTICLEMODE);
+ if (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody)) {
+ str += sprintf(str, formatstr, "Particle Mode", OB_MODE_PARTICLE_EDIT, ICON_PARTICLEMODE);
}
return (string);
@@ -4878,11 +1678,11 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
ToolSettings *ts= CTX_data_tool_settings(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
- Base *basact= CTX_data_active_base(C);
- Object *ob= CTX_data_active_object(C);
Object *obedit = CTX_data_edit_object(C);
+ Object *ob = CTX_data_active_object(C);
EditMesh *em= NULL;
int bit, ctrl= win->eventstate->ctrl, shift= win->eventstate->shift;
+ PointerRNA props_ptr;
if(obedit && obedit->type==OB_MESH) {
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
@@ -4891,7 +1691,7 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
switch(event) {
case B_HOME:
- WM_operator_name_call(C, "VIEW3D_OT_viewhome", WM_OP_EXEC_REGION_WIN, NULL);
+ WM_operator_name_call(C, "VIEW3D_OT_view_all", WM_OP_EXEC_REGION_WIN, NULL);
break;
case B_REDR:
ED_area_tag_redraw(sa);
@@ -4929,79 +1729,11 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
// XXX start_game();
break;
case B_MODESELECT:
- if (v3d->modeselect == V3D_OBJECTMODE_SEL) {
-
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- ED_armature_exit_posemode(C, basact);
- if(obedit)
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
- }
- else if (v3d->modeselect == V3D_EDITMODE_SEL) {
- if(!obedit) {
- v3d->flag &= ~V3D_MODE;
- ED_object_enter_editmode(C, EM_WAITCURSOR);
- ED_undo_push(C, "Original"); /* here, because all over code enter_editmode is abused */
- }
- }
- else if (v3d->modeselect == V3D_SCULPTMODE_SEL) {
- if (!(G.f & G_SCULPTMODE)) {
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- if(obedit) ED_object_exit_editmode(C, EM_FREEUNDO|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- }
- }
- else if (v3d->modeselect == V3D_VERTEXPAINTMODE_SEL) {
- if (!(G.f & G_VERTEXPAINT)) {
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- if(obedit) ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- WM_operator_name_call(C, "PAINT_OT_vertex_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- }
- }
- else if (v3d->modeselect == V3D_TEXTUREPAINTMODE_SEL) {
- if (!(G.f & G_TEXTUREPAINT)) {
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- if(obedit) ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- WM_operator_name_call(C, "PAINT_OT_texture_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- }
- }
- else if (v3d->modeselect == V3D_WEIGHTPAINTMODE_SEL) {
- if (!(G.f & G_WEIGHTPAINT) && (ob && ob->type == OB_MESH) ) {
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- if(obedit)
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- WM_operator_name_call(C, "PAINT_OT_weight_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- }
- }
- else if (v3d->modeselect == V3D_POSEMODE_SEL) {
-
- if (ob) {
- v3d->flag &= ~V3D_MODE;
- if(obedit)
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- ED_armature_enter_posemode(C, basact);
- }
- }
- else if(v3d->modeselect == V3D_PARTICLEEDITMODE_SEL){
- if (!(G.f & G_PARTICLEEDIT)) {
- v3d->flag &= ~V3D_MODE;
- ED_view3d_exit_paint_modes(C);
- if(obedit) ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
- }
- }
- break;
-
+ WM_operator_properties_create(&props_ptr, "OBJECT_OT_mode_set");
+ RNA_enum_set(&props_ptr, "mode", v3d->modeselect);
+ WM_operator_name_call(C, "OBJECT_OT_mode_set", WM_OP_EXEC_REGION_WIN, &props_ptr);
+ WM_operator_properties_free(&props_ptr);
+ break;
case B_AROUND:
// XXX handle_view3d_around(); /* copies to other 3d windows */
break;
@@ -5012,7 +1744,7 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
em->selectmode= SCE_SELECT_VERTEX;
ts->selectmode= em->selectmode;
EM_selectmode_set(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
ED_undo_push(C, "Selectmode Set: Vertex");
}
break;
@@ -5026,7 +1758,7 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
}
ts->selectmode= em->selectmode;
EM_selectmode_set(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
ED_undo_push(C, "Selectmode Set: Edge");
}
break;
@@ -5040,39 +1772,50 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
}
ts->selectmode= em->selectmode;
EM_selectmode_set(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
ED_undo_push(C, "Selectmode Set: Face");
}
break;
case B_SEL_PATH:
ts->particle.selectmode= SCE_SELECT_PATH;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
ED_undo_push(C, "Selectmode Set: Path");
break;
case B_SEL_POINT:
ts->particle.selectmode = SCE_SELECT_POINT;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
ED_undo_push(C, "Selectmode Set: Point");
break;
case B_SEL_END:
ts->particle.selectmode = SCE_SELECT_END;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
ED_undo_push(C, "Selectmode Set: End point");
break;
case B_MAN_TRANS:
- if( shift==0 || v3d->twtype==0)
+ if( shift==0 || v3d->twtype==0) {
v3d->twtype= V3D_MANIP_TRANSLATE;
- break;
+ }
+ ED_area_tag_redraw(sa);
+ break;
case B_MAN_ROT:
- if( shift==0 || v3d->twtype==0)
- v3d->twtype= V3D_MANIP_ROTATE;
+ if( shift==0 || v3d->twtype==0) {
+ v3d->twtype= V3D_MANIP_ROTATE;
+ }
+ ED_area_tag_redraw(sa);
break;
case B_MAN_SCALE:
- if( shift==0 || v3d->twtype==0)
- v3d->twtype= V3D_MANIP_SCALE;
+ if( shift==0 || v3d->twtype==0) {
+ v3d->twtype= V3D_MANIP_SCALE;
+ }
+ ED_area_tag_redraw(sa);
break;
case B_NDOF:
+ ED_area_tag_redraw(sa);
break;
case B_MAN_MODE:
+ ED_area_tag_redraw(sa);
break;
case B_VIEW_BUTSEDIT:
break;
@@ -5105,7 +1848,7 @@ static void do_view3d_header_buttons(bContext *C, void *arg, int event)
v3d->layact= v3d->lay;
}
- if(v3d->scenelock) handle_view3d_lock();
+ if(v3d->scenelock) handle_view3d_lock(C);
ED_area_tag_redraw(sa);
countall();
@@ -5127,7 +1870,6 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o
RegionView3D *rv3d= wm_region_view3d(C);
short xmax, xco= *xcoord;
-
/* compensate for local mode when setting up the viewing menu/iconrow values */
if(rv3d->view==7) rv3d->viewbut= 1;
else if(rv3d->view==1) rv3d->viewbut= 2;
@@ -5138,117 +1880,35 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o
* menu is drawn wider than it should be. The ypos of -2 is to make it properly fill the
* height of the header */
- xmax= GetButStringLength("View");
- uiDefMenuBut(block, view3d_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
- //uiDefPulldownBut(block, view3d_viewmenu, NULL, "View", xco, yco, xmax-3, 20, "");
- xco+= xmax;
-
xmax= GetButStringLength("Select");
- if (obedit) {
- if (ob && ob->type == OB_MESH) {
- uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco,yco, xmax-3, 24, "");
- } else if (ob && (ob->type == OB_CURVE || ob->type == OB_SURF)) {
- uiDefMenuBut(block, view3d_select_curvemenu, NULL, "Select", xco, yco, xmax-3, 24, "");
- } else if (ob && ob->type == OB_FONT) {
- xmax= 0;
- } else if (ob && ob->type == OB_MBALL) {
- uiDefPulldownBut(block, view3d_select_metaballmenu, NULL, "Select", xco,yco, xmax-3, 24, "");
- } else if (ob && ob->type == OB_LATTICE) {
- uiDefPulldownBut(block, view3d_select_latticemenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- } else if (ob && ob->type == OB_ARMATURE) {
- uiDefPulldownBut(block, view3d_select_armaturemenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- }
- } else if (FACESEL_PAINT_TEST) {
- if (ob && ob->type == OB_MESH) {
- uiDefPulldownBut(block, view3d_select_faceselmenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- }
- } else if ((G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_WEIGHTPAINT)) {
- uiDefBut(block, LABEL,0,"", xco, 0, xmax, 20, 0, 0, 0, 0, 0, "");
- } else if (G.f & G_PARTICLEEDIT) {
- uiDefMenuBut(block, view3d_select_particlemenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- } else {
-
- if (ob && (ob->flag & OB_POSEMODE))
- uiDefPulldownBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- else
- uiDefPulldownBut(block, view3d_select_objectmenu, NULL, "Select", xco,yco, xmax-3, 20, "");
- }
+
xco+= xmax;
if (obedit) {
- if (ob && ob->type == OB_MESH) {
- xmax= GetButStringLength("Mesh");
- uiDefPulldownBut(block, view3d_edit_meshmenu, NULL, "Mesh", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_CURVE) {
- xmax= GetButStringLength("Curve");
- uiDefMenuBut(block, view3d_edit_curvemenu, NULL, "Curve", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_SURF) {
- xmax= GetButStringLength("Surface");
- uiDefMenuBut(block, view3d_edit_curvemenu, NULL, "Surface", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_FONT) {
- xmax= GetButStringLength("Text");
- uiDefMenuBut(block, view3d_edit_textmenu, NULL, "Text", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_MBALL) {
- xmax= GetButStringLength("Metaball");
- uiDefPulldownBut(block, view3d_edit_metaballmenu, NULL, "Metaball", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_LATTICE) {
- xmax= GetButStringLength("Lattice");
- uiDefPulldownBut(block, view3d_edit_latticemenu, NULL, "Lattice", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- } else if (ob && ob->type == OB_ARMATURE) {
- xmax= GetButStringLength("Armature");
- uiDefPulldownBut(block, view3d_edit_armaturemenu, NULL, "Armature", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- }
-
}
- else if (G.f & G_WEIGHTPAINT) {
+ else if (ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
xmax= GetButStringLength("Paint");
uiDefPulldownBut(block, view3d_wpaintmenu, NULL, "Paint", xco,yco, xmax-3, 20, "");
xco+= xmax;
}
- else if (G.f & G_VERTEXPAINT) {
- xmax= GetButStringLength("Paint");
- uiDefPulldownBut(block, view3d_vpaintmenu, NULL, "Paint", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- }
- else if (G.f & G_TEXTUREPAINT) {
+ else if (ob && ob->mode & OB_MODE_TEXTURE_PAINT) {
xmax= GetButStringLength("Paint");
uiDefPulldownBut(block, view3d_tpaintmenu, NULL, "Paint", xco,yco, xmax-3, 20, "");
xco+= xmax;
}
- else if( G.f & G_SCULPTMODE) {
- xmax= GetButStringLength("Sculpt");
- uiDefMenuBut(block, view3d_sculpt_menu, NULL, "Sculpt", xco, yco, xmax-3, 20, "");
- xco+= xmax;
- }
- else if (FACESEL_PAINT_TEST) {
+ else if (paint_facesel_test(ob)) {
if (ob && ob->type == OB_MESH) {
xmax= GetButStringLength("Face");
uiDefPulldownBut(block, view3d_faceselmenu, NULL, "Face", xco,yco, xmax-3, 20, "");
xco+= xmax;
}
}
- else if(G.f & G_PARTICLEEDIT) {
- xmax= GetButStringLength("Particle");
- uiDefMenuBut(block, view3d_particlemenu, NULL, "Particle", xco,yco, xmax-3, 20, "");
- xco+= xmax;
+ else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
+ /* ported to python */
}
else {
- if (ob && (ob->flag & OB_POSEMODE)) {
- xmax= GetButStringLength("Pose");
- uiDefPulldownBut(block, view3d_pose_armaturemenu, NULL, "Pose", xco,yco, xmax-3, 20, "");
- xco+= xmax;
- }
- else {
- xmax= GetButStringLength("Object");
- uiDefPulldownBut(block, view3d_edit_objectmenu, NULL, "Object", xco,yco, xmax-3, 20, "");
- xco+= xmax;
+ if (ob && (ob->mode & OB_MODE_POSE)) {
+ /* ported to python */
}
}
@@ -5278,8 +1938,23 @@ static void header_xco_step(ARegion *ar, int *xco, int *yco, int *maxco, int ste
}
}
-void view3d_header_buttons(const bContext *C, ARegion *ar)
+/* Returns the icon associated with an object mode */
+static int object_mode_icon(int mode)
{
+ EnumPropertyItem *item = object_mode_items;
+
+ while(item->name != NULL) {
+ if(item->value == mode)
+ return item->icon;
+ ++item;
+ }
+
+ return ICON_OBJECT_DATAMODE;
+}
+
+void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
+{
+ ARegion *ar= CTX_wm_region(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
Scene *scene= CTX_data_scene(C);
@@ -5287,13 +1962,11 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
Object *ob= OBACT;
Object *obedit = CTX_data_edit_object(C);
uiBlock *block;
- int a, xco, maxco=0, yco= 3;
+ int a, xco=0, maxco=0, yco= 0;
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
+ block= uiLayoutFreeBlock(layout);
uiBlockSetHandleFunc(block, do_view3d_header_buttons, NULL);
- xco= ED_area_header_standardbuttons(C, block, yco);
-
if((sa->flag & HEADER_NO_PULLDOWN)==0)
view3d_header_pulldowns(C, block, ob, &xco, yco);
@@ -5301,29 +1974,23 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
uiBlockSetEmboss(block, UI_EMBOSS);
/* mode */
- v3d->modeselect = V3D_OBJECTMODE_SEL;
-
- if (obedit) v3d->modeselect = V3D_EDITMODE_SEL;
- else if(ob && (ob->flag & OB_POSEMODE)) v3d->modeselect = V3D_POSEMODE_SEL;
- else if (G.f & G_SCULPTMODE) v3d->modeselect = V3D_SCULPTMODE_SEL;
- else if (G.f & G_WEIGHTPAINT) v3d->modeselect = V3D_WEIGHTPAINTMODE_SEL;
- else if (G.f & G_VERTEXPAINT) v3d->modeselect = V3D_VERTEXPAINTMODE_SEL;
- else if (G.f & G_TEXTUREPAINT) v3d->modeselect = V3D_TEXTUREPAINTMODE_SEL;
- /*else if(G.f & G_FACESELECT) v3d->modeselect = V3D_FACESELECTMODE_SEL;*/
- else if(G.f & G_PARTICLEEDIT) v3d->modeselect = V3D_PARTICLEEDITMODE_SEL;
+ if(ob)
+ 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->flag & OB_POSEMODE)) v3d->flag |= V3D_POSEMODE;
- if(G.f & G_VERTEXPAINT) v3d->flag |= V3D_VERTEXPAINT;
- if(G.f & G_WEIGHTPAINT) v3d->flag |= V3D_WEIGHTPAINT;
- if (G.f & G_TEXTUREPAINT) v3d->flag |= V3D_TEXTUREPAINT;
- if(FACESEL_PAINT_TEST) v3d->flag |= V3D_FACESELECT;
-
- uiDefIconTextButS(block, MENU, B_MODESELECT, (v3d->modeselect),view3d_modeselect_pup(scene) ,
- xco,yco,126,20, &(v3d->modeselect), 0, 0, 0, 0, "Mode (Hotkeys: Tab, V, Ctrl Tab)");
+ 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;
+
+ uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) ,
+ xco,yco,126,20, &(v3d->modeselect), 0, 0, 0, 0, "Mode (Hotkeys: Tab, V, Ctrl Tab)");
header_xco_step(ar, &xco, &yco, &maxco, 126+8);
/* DRAWTYPE */
@@ -5363,7 +2030,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
uiBlockEndAlign(block);
}
} else {
- if (obedit==NULL && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))) {
+ if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
uiDefIconButBitI(block, TOG, G_FACESELECT, B_VIEW_BUTSEDIT, ICON_FACESEL_HLT,xco,yco,XIC,YIC, &G.f, 0, 0, 0, 0, "Painting Mask (FKey)");
header_xco_step(ar, &xco, &yco, &maxco, XIC+10);
} else {
@@ -5422,7 +2089,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
}
/* LAYERS */
- if(obedit==NULL && v3d->localview==0) {
+ if(obedit==NULL && v3d->localvd==NULL) {
int ob_lay = ob ? ob->lay : 0;
uiBlockBeginAlign(block);
for(a=0; a<5; a++) {
@@ -5450,7 +2117,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
}
/* proportional falloff */
- if((obedit && (obedit->type == OB_MESH || obedit->type == OB_CURVE || obedit->type == OB_SURF || obedit->type == OB_LATTICE)) || G.f & G_PARTICLEEDIT) {
+ if((obedit && (obedit->type == OB_MESH || obedit->type == OB_CURVE || obedit->type == OB_SURF || obedit->type == OB_LATTICE)) || (ob && ob->mode & OB_MODE_PARTICLE_EDIT)) {
uiBlockBeginAlign(block);
uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_PROP_OFF, "Proportional %t|Off %x0|On %x1|Connected %x2", xco,yco,XIC+10,YIC, &(ts->proportional), 0, 1.0, 0, 0, "Proportional Edit Falloff (Hotkeys: O, Alt O) ");
@@ -5511,7 +2178,7 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
BKE_mesh_end_editmesh(obedit->data, em);
}
- else if(G.f & G_PARTICLEEDIT) {
+ else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
uiBlockBeginAlign(block);
uiDefIconButBitI(block, TOG, SCE_SELECT_PATH, B_SEL_PATH, ICON_EDGESEL, xco,yco,XIC,YIC, &ts->particle.selectmode, 1.0, 0.0, 0, 0, "Path edit mode");
xco+= XIC;
@@ -5531,67 +2198,22 @@ void view3d_header_buttons(const bContext *C, ARegion *ar)
uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE, xco,yco,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (Ctrl Click for anim)");
-
- if (ob && (ob->flag & OB_POSEMODE)) {
- xco+= XIC/2;
+ if (ob && (ob->mode & OB_MODE_POSE)) {
+ xco+= XIC*2;
uiBlockBeginAlign(block);
- uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYDOWN,
- xco,yco,XIC,YIC, 0, 0, 0, 0, 0,
- "Copies the current pose to the buffer");
+ uiDefIconButO(block, BUT, "POSE_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco,yco,XIC,YIC, NULL);
uiBlockSetButLock(block, object_data_is_libdata(ob), "Can't edit external libdata");
xco+= XIC;
-
- uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEDOWN,
- xco,yco,XIC,YIC, 0, 0, 0, 0, 0,
- "Pastes the pose from the buffer");
+
+ uiDefIconButO(block, BUT, "POSE_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco,yco,XIC,YIC, NULL);
xco+= XIC;
- uiDefIconBut(block, BUT, B_ACTPASTEFLIP, ICON_PASTEFLIPDOWN,
- xco,yco,XIC,YIC, 0, 0, 0, 0, 0,
- "Pastes the mirrored pose from the buffer");
+ // FIXME: this needs an extra arg...
+ uiDefIconButO(block, BUT, "POSE_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEFLIPDOWN, xco,yco,XIC,YIC, NULL);
uiBlockEndAlign(block);
header_xco_step(ar, &xco, &yco, &maxco, XIC);
}
}
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, maxco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
}
-
-
-/* edit face toolbox */
-static int editmesh_face_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
-
- pup= uiPupMenuBegin(C, "Edit Faces", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemO(layout, NULL, 0, "MESH_OT_fill");
- uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
- uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
- uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
- uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
- uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
- uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_solid");
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
-
-void VIEW3D_OT_editmesh_face_toolbox(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Edit Faces";
- ot->idname= "VIEW3D_OT_editmesh_face_toolbox";
-
- /* api callbacks */
- ot->invoke= editmesh_face_toolbox_invoke;
- ot->poll= ED_operator_editmesh;
-}
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 6dbd99c67be..d532d2b2cc8 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -68,18 +68,18 @@ void view3d_keymap(struct wmWindowManager *wm);
void VIEW3D_OT_zoom(struct wmOperatorType *ot);
void VIEW3D_OT_viewmove(struct wmOperatorType *ot);
void VIEW3D_OT_viewrotate(struct wmOperatorType *ot);
-void VIEW3D_OT_viewhome(struct wmOperatorType *ot);
+void VIEW3D_OT_view_all(struct wmOperatorType *ot);
void VIEW3D_OT_viewnumpad(struct wmOperatorType *ot);
-void VIEW3D_OT_viewcenter(struct wmOperatorType *ot);
+void VIEW3D_OT_view_center(struct wmOperatorType *ot);
void VIEW3D_OT_view_pan(struct wmOperatorType *ot);
void VIEW3D_OT_view_persportho(struct wmOperatorType *ot);
void VIEW3D_OT_view_orbit(struct wmOperatorType *ot);
-void VIEW3D_OT_clipping(struct wmOperatorType *ot);
+void VIEW3D_OT_clip_border(struct wmOperatorType *ot);
void VIEW3D_OT_cursor3d(struct wmOperatorType *ot);
+void VIEW3D_OT_manipulator(struct wmOperatorType *ot);
void VIEW3D_OT_render_border(struct wmOperatorType *ot);
void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
-void VIEW3D_OT_editmesh_face_toolbox(struct wmOperatorType *ot);
void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
@@ -89,10 +89,13 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt);
void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int dt, int outline);
void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob);
void drawaxes(float size, int flag, char drawtype);
-void view3d_object_text_draw_add(float x, float y, float z, char *str, short xoffs);
+
+void view3d_cached_text_draw_begin(void);
+void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs);
+void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4]);
/* drawarmature.c */
-int draw_armature(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag);
+int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag);
/* drawmesh.c */
void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, struct DerivedMesh *dm, int faceselect);
@@ -121,6 +124,7 @@ void VIEW3D_OT_smoothview(struct wmOperatorType *ot);
void VIEW3D_OT_setcameratoview(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);
@@ -132,13 +136,16 @@ void smooth_view(struct bContext *C, Object *, Object *, float *ofs, float *quat
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect); /* rect: for picking */
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d);
+void fly_modal_keymap(struct wmWindowManager *wm);
+
/* view3d_buttons.c */
void VIEW3D_OT_properties(struct wmOperatorType *ot);
void view3d_buttons_register(struct ARegionType *art);
-/* view3d_buttons.c */
+/* view3d_toolbar.c */
void VIEW3D_OT_toolbar(struct wmOperatorType *ot);
void view3d_toolbar_register(struct ARegionType *art);
+void view3d_tool_props_register(struct ARegionType *art);
/* view3d_snap.c */
int minmax_verts(Object *obedit, float *min, float *max);
@@ -155,6 +162,9 @@ void VIEW3D_OT_snap_menu(struct wmOperatorType *ot);
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);
+
#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 6cb1051ce4a..23dd092ce38 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -46,8 +46,6 @@
#include "BKE_global.h"
#include "BKE_utildefines.h"
-#include "BIF_transform.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -55,6 +53,7 @@
#include "WM_types.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "view3d_intern.h"
@@ -66,26 +65,27 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_viewrotate);
WM_operatortype_append(VIEW3D_OT_viewmove);
WM_operatortype_append(VIEW3D_OT_zoom);
- WM_operatortype_append(VIEW3D_OT_viewhome);
+ WM_operatortype_append(VIEW3D_OT_view_all);
WM_operatortype_append(VIEW3D_OT_viewnumpad);
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_viewcenter);
+ WM_operatortype_append(VIEW3D_OT_view_center);
WM_operatortype_append(VIEW3D_OT_select);
WM_operatortype_append(VIEW3D_OT_select_border);
- WM_operatortype_append(VIEW3D_OT_clipping);
+ WM_operatortype_append(VIEW3D_OT_clip_border);
WM_operatortype_append(VIEW3D_OT_select_circle);
WM_operatortype_append(VIEW3D_OT_smoothview);
WM_operatortype_append(VIEW3D_OT_render_border);
WM_operatortype_append(VIEW3D_OT_zoom_border);
+ WM_operatortype_append(VIEW3D_OT_manipulator);
WM_operatortype_append(VIEW3D_OT_cursor3d);
WM_operatortype_append(VIEW3D_OT_select_lasso);
WM_operatortype_append(VIEW3D_OT_setcameratoview);
WM_operatortype_append(VIEW3D_OT_drawtype);
- WM_operatortype_append(VIEW3D_OT_editmesh_face_toolbox);
WM_operatortype_append(VIEW3D_OT_localview);
WM_operatortype_append(VIEW3D_OT_game_start);
+ WM_operatortype_append(VIEW3D_OT_fly);
WM_operatortype_append(VIEW3D_OT_layers);
WM_operatortype_append(VIEW3D_OT_properties);
@@ -104,45 +104,28 @@ void view3d_operatortypes(void)
void view3d_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
+ wmKeyMap *keymap;
wmKeymapItem *km;
- WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_toggle", VKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "PAINT_OT_weight_paint_toggle", TABKEY, KM_PRESS, KM_CTRL, 0);
+ keymap= WM_keymap_find(wm, "View3D Generic", SPACE_VIEW3D, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_toolbar", TKEY, KM_PRESS, 0, 0);
/* only for region 3D window */
- keymap= WM_keymap_listbase(wm, "View3D", SPACE_VIEW3D, 0);
+ keymap= WM_keymap_find(wm, "View3D", SPACE_VIEW3D, 0);
+
+ WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, 0, 0); /* manipulator always on left mouse, not on action mouse*/
- /* paint poll checks mode */
- WM_keymap_verify_item(keymap, "PAINT_OT_vertex_paint", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "PAINT_OT_weight_paint", LEFTMOUSE, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "PAINT_OT_image_paint", LEFTMOUSE, KM_PRESS, 0, 0);
- 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);
-
- WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
-
- /* sketch poll checks mode */
- WM_keymap_add_item(keymap, "SKETCH_OT_gesture", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, "SKETCH_OT_draw_stroke", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_boolean_set(km->ptr, "snap", 1);
- WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, 0, 0);
- km = WM_keymap_add_item(keymap, "SKETCH_OT_draw_preview", MOUSEMOVE, KM_ANY, KM_CTRL, 0);
- RNA_boolean_set(km->ptr, "snap", 1);
-
WM_keymap_verify_item(keymap, "VIEW3D_OT_cursor3d", ACTIONMOUSE, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "VIEW3D_OT_viewrotate", MIDDLEMOUSE, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "VIEW3D_OT_viewmove", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
WM_keymap_verify_item(keymap, "VIEW3D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "VIEW3D_OT_viewcenter", PADPERIOD, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "VIEW3D_OT_view_center", PADPERIOD, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "VIEW3D_OT_fly", FKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_verify_item(keymap, "VIEW3D_OT_smoothview", TIMER1, KM_ANY, KM_ANY, 0);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", PADPLUSKEY, KM_PRESS, 0, 0)->ptr, "delta", 1);
@@ -150,8 +133,8 @@ void view3d_keymap(wmWindowManager *wm)
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, 0, 0)->ptr, "delta", -1);
- RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewhome", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewhome", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1);
/* numpad view hotkeys*/
RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD0, KM_PRESS, 0, 0)->ptr, "type", V3D_VIEW_CAMERA);
@@ -177,6 +160,7 @@ void view3d_keymap(wmWindowManager *wm)
WM_keymap_add_item(keymap, "VIEW3D_OT_game_start", PKEY, KM_PRESS, 0, 0);
/* layers, shift + alt are properties set in invoke() */
+ RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_layers", ACCENTGRAVEKEY, KM_PRESS, 0, 0)->ptr, "nr", 0);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_layers", ONEKEY, KM_PRESS, KM_ANY, 0)->ptr, "nr", 1);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_layers", TWOKEY, KM_PRESS, KM_ANY, 0)->ptr, "nr", 2);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_layers", THREEKEY, KM_PRESS, KM_ANY, 0)->ptr, "nr", 3);
@@ -203,33 +187,40 @@ void view3d_keymap(wmWindowManager *wm)
/* selection*/
WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "center", TRUE);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "enumerate", TRUE);
+
+ /* selection key-combinations */
+ km = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+ RNA_boolean_set(km->ptr, "center", TRUE);
+ RNA_boolean_set(km->ptr, "extend", TRUE);
+ km = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ RNA_boolean_set(km->ptr, "center", TRUE);
+ RNA_boolean_set(km->ptr, "enumerate", TRUE);
+ km = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0);
+ RNA_boolean_set(km->ptr, "extend", TRUE);
+ RNA_boolean_set(km->ptr, "enumerate", TRUE);
+ km = WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL|KM_ALT, 0);
+ RNA_boolean_set(km->ptr, "center", TRUE);
+ RNA_boolean_set(km->ptr, "extend", TRUE);
+ RNA_boolean_set(km->ptr, "enumerate", TRUE);
+
WM_keymap_add_item(keymap, "VIEW3D_OT_select_border", BKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT|KM_CTRL, 0)->ptr, "type", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT|KM_CTRL, 0)->ptr, "deselect", 1);
WM_keymap_add_item(keymap, "VIEW3D_OT_select_circle", CKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_clipping", BKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_clip_border", BKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_border", BKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_render_border", BKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_camera_to_view", PAD0, KM_PRESS, KM_ALT|KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_snap_menu", SKEY, KM_PRESS, KM_SHIFT, 0);
-
- /* radial control */
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
- 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, "PAINT_OT_vertex_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_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, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
- RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_weight_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, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
transform_keymap_for_space(wm, keymap, SPACE_VIEW3D);
+ fly_modal_keymap(wm);
}
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index a153f795292..a37e916064c 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -53,12 +53,14 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_linklist.h"
#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_object.h"
#include "BKE_global.h"
+#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -66,7 +68,6 @@
#include "RE_pipeline.h" // make_stars
#include "BIF_gl.h"
-#include "BIF_retopo.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -79,9 +80,11 @@
#include "ED_particle.h"
#include "ED_mesh.h"
#include "ED_object.h"
+#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_types.h"
#include "ED_util.h"
+#include "ED_mball.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -126,7 +129,7 @@ void view3d_get_transformation(ViewContext *vc, Object *ob, bglMats *mats)
float cpy[4][4];
int i, j;
- Mat4MulMat4(cpy, vc->rv3d->viewmat, ob->obmat);
+ Mat4MulMat4(cpy, ob->obmat, vc->rv3d->viewmat);
for(i = 0; i < 4; ++i) {
for(j = 0; j < 4; ++j) {
@@ -377,7 +380,7 @@ static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short mo
else ED_base_object_select(base, BA_DESELECT);
base->object->flag= base->flag;
}
- if(base->object->flag & OB_POSEMODE) {
+ if(base->object->mode & OB_MODE_POSE) {
do_lasso_select_pose(vc, mcords, moves, select);
}
}
@@ -547,13 +550,15 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { short (*mcords)[2]; short moves; short select; } *data = userData;
-
+ struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } *data = userData;
+
if (lasso_inside(data->mcords, data->moves, x, y)) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
} else {
- if (G.f & G_HIDDENHANDLES) {
+ Curve *cu= data->vc.obedit->data;
+
+ if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
} else {
@@ -571,9 +576,10 @@ 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)
{
- struct { short (*mcords)[2]; short moves; short select; } data;
+ struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } data;
/* set vc->editnurb */
+ data.vc = *vc;
data.mcords = mcords;
data.moves = moves;
data.select = select;
@@ -692,12 +698,14 @@ static void do_lasso_select_node(short mcords[][2], short moves, short select)
void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short moves, short select)
{
+ Object *ob = CTX_data_active_object(C);
+
if(vc->obedit==NULL) {
- if(FACESEL_PAINT_TEST)
+ if(paint_facesel_test(ob))
do_lasso_select_facemode(vc, mcords, moves, select);
- else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))
+ else if(ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))
;
- else if(G.f & G_PARTICLEEDIT)
+ else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT)
PE_lasso_select(C, mcords, moves, select);
else
do_lasso_select_objects(vc, mcords, moves, select);
@@ -715,12 +723,6 @@ void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short
}
-static EnumPropertyItem lasso_select_types[] = {
- {0, "SELECT", 0, "Select", ""},
- {1, "DESELECT", 0, "Deselect", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
/* lasso operator gives properties, but since old code works
with short array we convert */
@@ -747,7 +749,7 @@ static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
/* setup view context for argument to callbacks */
view3d_set_viewcontext(C, &vc);
- select= RNA_enum_is_equal(op->ptr, "type", "SELECT");
+ select= !RNA_boolean_get(op->ptr, "deselect");
view3d_lasso_select(C, &vc, mcords, i, select);
return OPERATOR_FINISHED;
@@ -758,6 +760,7 @@ static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
void VIEW3D_OT_select_lasso(wmOperatorType *ot)
{
ot->name= "Lasso Select";
+ ot->description= "Select items using lasso selection.";
ot->idname= "VIEW3D_OT_select_lasso";
ot->invoke= WM_gesture_lasso_invoke;
@@ -769,7 +772,7 @@ void VIEW3D_OT_select_lasso(wmOperatorType *ot)
ot->flag= OPTYPE_UNDO;
RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
- RNA_def_enum(ot->srna, "type", lasso_select_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items.");
}
@@ -843,56 +846,87 @@ static void deselectall_except(Scene *scene, Base *b) /* deselect all except b
}
}
-static Base *mouse_select_menu(ViewContext *vc, unsigned int *buffer, int hits, short *mval)
+static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffer, int hits, short *mval, short extend)
{
- Scene *scene= vc->scene;
- View3D *v3d= vc->v3d;
- Base *baseList[SEL_MENU_SIZE]={NULL}; /*baseList is used to store all possible bases to bring up a menu */
- Base *base;
short baseCount = 0;
- char menuText[20 + SEL_MENU_SIZE*32] = "Select Object%t"; /* max ob name = 22 */
- char str[32];
-
- for(base=FIRSTBASE; base; base= base->next) {
- if (BASE_SELECTABLE(v3d, base)) {
- baseList[baseCount] = NULL;
-
- /* two selection methods, the CTRL select uses max dist of 15 */
- if(buffer) {
- int a;
- for(a=0; a<hits; a++) {
- /* index was converted */
- if(base->selcol==buffer[ (4 * a) + 3 ]) baseList[baseCount] = base;
- }
- }
- else {
- int temp, dist=15;
-
- project_short(vc->ar, base->object->obmat[3], &base->sx);
-
- temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]);
- if(temp<dist ) baseList[baseCount] = base;
+ short ok;
+ LinkNode *linklist= NULL;
+
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ ok= FALSE;
+
+ /* two selection methods, the CTRL select uses max dist of 15 */
+ if(buffer) {
+ int a;
+ for(a=0; a<hits; a++) {
+ /* index was converted */
+ if(base->selcol==buffer[ (4 * a) + 3 ])
+ ok= TRUE;
}
+ }
+ else {
+ int temp, dist=15;
+
+ project_short(vc->ar, base->object->obmat[3], &base->sx);
- if(baseList[baseCount]) {
- if (baseCount < SEL_MENU_SIZE) {
- baseList[baseCount] = base;
- sprintf(str, "|%s %%x%d", base->object->id.name+2, baseCount+1); /* max ob name == 22 */
- strcat(menuText, str);
- baseCount++;
- }
- }
+ temp= abs(base->sx -mval[0]) + abs(base->sy -mval[1]);
+ if(temp < dist)
+ ok= TRUE;
+ }
+
+ if(ok) {
+ baseCount++;
+ BLI_linklist_prepend(&linklist, base);
+
+ if (baseCount==SEL_MENU_SIZE)
+ break;
}
}
+ CTX_DATA_END;
- if(baseCount<=1) return baseList[0];
+ if(baseCount)
+
+
+ if(baseCount==0) {
+ return NULL;
+ }
+ if(baseCount == 1) {
+ Base *base= (Base *)linklist->link;
+ BLI_linklist_free(linklist, NULL);
+ return base;
+ }
else {
- baseCount = -1; // XXX = pupmenu(menuText);
-
- if (baseCount != -1) { /* If nothing is selected then dont do anything */
- return baseList[baseCount-1];
+ /* UI */
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", 0);
+ uiLayout *layout= uiPupMenuLayout(pup);
+ uiLayout *split= uiLayoutSplit(layout, 0);
+ uiLayout *column= uiLayoutColumn(split, 0);
+ LinkNode *node;
+
+ node= linklist;
+ while(node) {
+ Base *base=node->link;
+ Object *ob= base->object;
+ char *name= ob->id.name+2;
+ /* annoying!, since we need to set 2 props cant use this. */
+ /* uiItemStringO(column, name, 0, "OBJECT_OT_select_name", "name", name); */
+
+ {
+ PointerRNA ptr;
+
+ WM_operator_properties_create(&ptr, "OBJECT_OT_select_name");
+ RNA_string_set(&ptr, "name", name);
+ RNA_boolean_set(&ptr, "extend", extend);
+ uiItemFullO(column, name, uiIconFromID((ID *)ob), "OBJECT_OT_select_name", ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ }
+
+ node= node->next;
}
- else return NULL;
+
+ uiPupMenuEnd(C, pup);
+
+ BLI_linklist_free(linklist, NULL);
+ return NULL;
}
}
@@ -956,14 +990,13 @@ static short mixed_bones_object_selectbuffer(ViewContext *vc, unsigned int *buff
/* mval is region coords */
-static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
+static void mouse_select(bContext *C, short *mval, short extend, short obcenter, short enumerate)
{
ViewContext vc;
ARegion *ar= CTX_wm_region(C);
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base, *startbase=NULL, *basact=NULL, *oldbasact=NULL;
- unsigned int buffer[4*MAXPICKBUF];
int temp, a, dist=100;
short hits;
@@ -979,10 +1012,9 @@ static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
if(vc.obedit==NULL && obcenter) {
/* note; shift+alt goes to group-flush-selecting */
- /* XXX solve */
- if(0)
- basact= mouse_select_menu(&vc, NULL, 0, mval);
- else {
+ if(enumerate) {
+ basact= mouse_select_menu(C, &vc, NULL, 0, mval, extend);
+ } else {
base= startbase;
while(base) {
if (BASE_SELECTABLE(v3d, base)) {
@@ -1004,6 +1036,8 @@ static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
}
}
else {
+ unsigned int buffer[4*MAXPICKBUF];
+
/* if objects have posemode set, the bones are in the same selection buffer */
hits= mixed_bones_object_selectbuffer(&vc, buffer, mval);
@@ -1014,9 +1048,9 @@ static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
for(a=0; a<hits; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones= 1;
/* note; shift+alt goes to group-flush-selecting */
- if(has_bones==0 && 0)
- basact= mouse_select_menu(&vc, buffer, hits, mval);
- else {
+ if(has_bones==0 && enumerate) {
+ basact= mouse_select_menu(C, &vc, buffer, hits, mval, extend);
+ } else {
static short lastmval[2]={-100, -100};
int donearest= 0;
@@ -1114,7 +1148,7 @@ static void mouse_select(bContext *C, short *mval, short extend, short obcenter)
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, basact->object);
/* in weightpaint, we use selected bone to select vertexgroup, so no switch to new active object */
- if(G.f & G_WEIGHTPAINT) {
+ if(BASACT && BASACT->object->mode & OB_MODE_WEIGHT_PAINT) {
/* prevent activating */
basact= NULL;
}
@@ -1197,7 +1231,9 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
} else {
- if (G.f & G_HIDDENHANDLES) {
+ Curve *cu= data->vc.obedit->data;
+
+ if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
} else {
@@ -1216,7 +1252,7 @@ static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select)
{
struct { ViewContext vc; rcti *rect; int select; } data;
- data.vc= *vc;
+ data.vc = *vc;
data.rect = rect;
data.select = select;
@@ -1328,6 +1364,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
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;
MetaElem *ml;
@@ -1346,11 +1383,11 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
- if(obedit==NULL && (FACESEL_PAINT_TEST)) {
+ if(obedit==NULL && (paint_facesel_test(OBACT))) {
// XXX face_borderselect();
return OPERATOR_FINISHED;
}
- else if(obedit==NULL && (G.f & G_PARTICLEEDIT)) {
+ else if(obedit==NULL && (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
return PE_border_select(C, &rect, (val==LEFTMOUSE));
}
@@ -1360,16 +1397,17 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
vc.em= me->edit_mesh;
do_mesh_box_select(&vc, &rect, (val==LEFTMOUSE));
// if (EM_texFaceCheck())
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ 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, val==LEFTMOUSE);
}
else if(obedit->type==OB_MBALL) {
+ MetaBall *mb = (MetaBall*)obedit->data;
hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
- ml= NULL; // XXX editelems.first;
+ ml= mb->editelems->first;
while(ml) {
for(a=0; a<hits; a++) {
@@ -1442,6 +1480,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
}
}
+ ED_armature_sync_selection(arm->edbo);
}
else if(obedit->type==OB_LATTICE) {
do_lattice_box_select(&vc, &rect, val==LEFTMOUSE);
@@ -1456,7 +1495,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
int bone_only;
int totobj= MAXPICKBUF; // XXX solve later
- if((ob) && (ob->flag & OB_POSEMODE))
+ if((ob) && (ob->mode & OB_MODE_POSE))
bone_only= 1;
else
bone_only= 0;
@@ -1527,17 +1566,13 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op)
/* *****************Selection Operators******************* */
-static EnumPropertyItem prop_select_types[] = {
- {0, "EXCLUSIVE", 0, "Exclusive", ""},
- {1, "EXTEND", 0, "Extend", ""},
- {0, NULL, 0, NULL, NULL}
-};
/* ****** Border Select ****** */
void VIEW3D_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
+ ot->description= "Select items using border selection.";
ot->idname= "VIEW3D_OT_select_border";
/* api callbacks */
@@ -1557,7 +1592,7 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
- RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
}
/* ****** Mouse Select ****** */
@@ -1566,7 +1601,10 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
- short extend= RNA_enum_is_equal(op->ptr, "type", "EXTEND");
+ Object *obact= CTX_data_active_object(C);
+ short extend= RNA_boolean_get(op->ptr, "extend");
+ short center= RNA_boolean_get(op->ptr, "center");
+ short enumerate= RNA_boolean_get(op->ptr, "enumerate");
view3d_operator_needs_opengl(C);
@@ -1579,12 +1617,14 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
mouse_lattice(C, event->mval, extend);
else if(ELEM(obedit->type, OB_CURVE, OB_SURF))
mouse_nurb(C, event->mval, extend);
+ else if(obedit->type==OB_MBALL)
+ mouse_mball(C, event->mval, extend);
}
- else if(G.f & G_PARTICLEEDIT)
+ else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT)
PE_mouse_particles(C, event->mval, extend);
else
- mouse_select(C, event->mval, extend, 0);
+ mouse_select(C, event->mval, extend, center, enumerate);
/* allowing tweaks */
return OPERATOR_PASS_THROUGH|OPERATOR_FINISHED;
@@ -1594,6 +1634,7 @@ void VIEW3D_OT_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Activate/Select";
+ ot->description= "Activate/select item(s).";
ot->idname= "VIEW3D_OT_select";
/* api callbacks */
@@ -1604,7 +1645,9 @@ void VIEW3D_OT_select(wmOperatorType *ot)
ot->flag= OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first.");
+ RNA_def_boolean(ot->srna, "center", 0, "Center", "Use the object center when selecting (object mode only).");
+ RNA_def_boolean(ot->srna, "enumerate", 0, "Enumerate", "List objects under the mouse (object mode only).");
}
@@ -1643,9 +1686,9 @@ static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, floa
{
ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
+ Object *ob= vc->obact;
- if(vc->obedit==NULL && (FACESEL_PAINT_TEST)) {
- Object *ob= vc->obact;
+ if(vc->obedit==NULL && paint_facesel_test(ob)) {
Mesh *me = ob?ob->data:NULL;
if (me) {
@@ -1784,12 +1827,13 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
Scene *scene= CTX_data_scene(C);
+ Object *obact= CTX_data_active_object(C);
View3D *v3d= sa->spacedata.first;
int x= RNA_int_get(op->ptr, "x");
int y= RNA_int_get(op->ptr, "y");
int radius= RNA_int_get(op->ptr, "radius");
- if(CTX_data_edit_object(C) || (G.f & G_PARTICLEEDIT)) {
+ if(CTX_data_edit_object(C) || (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
ViewContext vc;
short mval[2], selecting;
@@ -1800,8 +1844,10 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
mval[1]= y;
selecting= LEFTMOUSE==RNA_int_get(op->ptr, "event_type"); // XXX solve
- if(CTX_data_edit_object(C))
+ if(CTX_data_edit_object(C)) {
obedit_circle_select(&vc, selecting, mval, (float)radius);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obact->data);
+ }
else
return PE_circle_select(C, selecting, mval, (float)radius);
}
@@ -1829,6 +1875,7 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
void VIEW3D_OT_select_circle(wmOperatorType *ot)
{
ot->name= "Circle Select";
+ ot->description= "Select items using circle selection.";
ot->idname= "VIEW3D_OT_select_circle";
ot->invoke= WM_gesture_circle_invoke;
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index fba8d13c6a5..767f18649fa 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -106,7 +106,7 @@ static void special_transvert_update(Scene *scene, Object *obedit)
if(obedit) {
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
@@ -302,7 +302,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
int totmalloc= 0;
for(nu= cu->editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER)
+ if(nu->type == CU_BEZIER)
totmalloc += 3*nu->pntsu;
else
totmalloc += nu->pntsu*nu->pntsv;
@@ -311,7 +311,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
nu= cu->editnurb->first;
while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
@@ -482,7 +482,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_POSEMODE) {
+ if(ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
bArmature *arm= ob->data;
@@ -514,7 +514,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -555,6 +555,7 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection to Grid";
+ ot->description= "Snap selected item(s) to nearest grid node.";
ot->idname= "VIEW3D_OT_snap_selected_to_grid";
/* api callbacks */
@@ -609,7 +610,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
else {
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_POSEMODE) {
+ if(ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
bArmature *arm= ob->data;
float cursp[3];
@@ -640,7 +641,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -680,6 +681,7 @@ void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection to Cursor";
+ ot->description= "Snap selected item(s) to cursor.";
ot->idname= "VIEW3D_OT_snap_selected_to_cursor";
/* api callbacks */
@@ -715,6 +717,7 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Grid";
+ ot->description= "Snap cursor to nearest grid node.";
ot->idname= "VIEW3D_OT_snap_cursor_to_grid";
/* api callbacks */
@@ -775,7 +778,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
else {
Object *ob= OBACT;
- if(ob && (ob->flag & OB_POSEMODE)) {
+ if(ob && (ob->mode & OB_MODE_POSE)) {
bArmature *arm= ob->data;
bPoseChannel *pchan;
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
@@ -821,6 +824,7 @@ void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Selected";
+ ot->description= "Snap cursor to center of selected item(s).";
ot->idname= "VIEW3D_OT_snap_cursor_to_selected";
/* api callbacks */
@@ -870,6 +874,7 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Active";
+ ot->description= "Snap cursor to active item.";
ot->idname= "VIEW3D_OT_snap_cursor_to_active";
/* api callbacks */
@@ -935,7 +940,7 @@ static int snap_selected_to_center(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_POSEMODE) {
+ if(ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
bArmature *arm= ob->data;
@@ -1004,7 +1009,7 @@ static int snap_selected_to_center(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_POSEMODE) {
+ if(ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
bArmature *arm= ob->data;
@@ -1028,7 +1033,7 @@ static int snap_selected_to_center(bContext *C, wmOperator *op)
/* auto-keyframing */
ob->pose->flag |= POSE_DO_UNLOCK;
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -1069,6 +1074,7 @@ void VIEW3D_OT_snap_selected_to_center(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection to Center";
+ ot->description= "Snap selected items to selections geometric center.";
ot->idname= "VIEW3D_OT_snap_selected_to_center";
/* api callbacks */
@@ -1116,13 +1122,13 @@ static int snap_menu_invoke(bContext *C, wmOperator *unused, wmEvent *event)
uiPopupMenu *pup= uiPupMenuBegin(C, "Snap", 0);
uiLayout *layout= uiPupMenuLayout(pup);
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_cursor");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_center");
+ uiItemO(layout, "Selected to Grid", 0, "VIEW3D_OT_snap_selected_to_grid");
+ uiItemO(layout, "Selected to Cursor", 0, "VIEW3D_OT_snap_selected_to_cursor");
+ uiItemO(layout, "Selected to Center", 0, "VIEW3D_OT_snap_selected_to_center");
uiItemS(layout);
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_selected");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_grid");
- uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_active");
+ uiItemO(layout, "Cursor to Selected", 0, "VIEW3D_OT_snap_cursor_to_selected");
+ uiItemO(layout, "Cursor to Grid", 0, "VIEW3D_OT_snap_cursor_to_grid");
+ uiItemO(layout, "Cursor to Active", 0, "VIEW3D_OT_snap_cursor_to_active");
uiPupMenuEnd(C, pup);
@@ -1135,6 +1141,7 @@ void VIEW3D_OT_snap_menu(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Snap Menu";
+ ot->description= "Display snap menu.";
ot->idname= "VIEW3D_OT_snap_menu";
/* api callbacks */
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index 88af60ac0f4..e1c6f70bde0 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -71,7 +71,6 @@
#include "BKE_utildefines.h"
#include "BIF_gl.h"
-#include "BIF_transform.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -87,6 +86,7 @@
#include "ED_object.h"
#include "ED_particle.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "ED_types.h"
#include "ED_util.h"
@@ -109,7 +109,7 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2)
int retval;
printf("operator redo %s\n", lastop->type->name);
- ED_undo_pop(C);
+ ED_undo_pop_op(C, lastop);
retval= WM_operator_repeat(C, lastop);
if((retval & OPERATOR_FINISHED)==0) {
printf("operator redo failed %s\n", lastop->type->name);
@@ -118,26 +118,23 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2)
}
}
-static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
+static wmOperator *view3d_last_operator(const bContext *C)
{
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;
- if(op->type->poll && op->type->poll((bContext *)C)==0)
- return;
-
- uiBlockSetFunc(block, redo_cb, op, NULL);
+
+ return op;
+}
+
+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};
@@ -145,49 +142,140 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
}
RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
- uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
+ if(op->type->ui)
+ op->type->ui((bContext*)C, &ptr, pa->layout);
+ else
+ uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
}
-static void view3d_panel_tools(const bContext *C, Panel *pa)
+static void view3d_panel_operator_redo_header(const bContext *C, Panel *pa)
{
- Object *obedit= CTX_data_edit_object(C);
-// Object *obact = CTX_data_active_object(C);
- uiLayout *col;
+ wmOperator *op= view3d_last_operator(C);
+
+ if(op) BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
+ else BLI_strncpy(pa->drawname, "Operator", sizeof(pa->drawname));
+}
+
+static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
+{
+ wmOperator *op= view3d_last_operator(C);
+ uiBlock *block;
- if(obedit) {
- if(obedit->type==OB_MESH) {
-
- // void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context)
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "MESH_OT_delete", NULL, WM_OP_INVOKE_REGION_WIN);
-
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "MESH_OT_subdivide", NULL, WM_OP_INVOKE_REGION_WIN);
-
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "MESH_OT_primitive_monkey_add", NULL, WM_OP_INVOKE_REGION_WIN);
- uiItemFullO(col, NULL, 0, "MESH_OT_primitive_uv_sphere_add", NULL, WM_OP_INVOKE_REGION_WIN);
-
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "MESH_OT_select_all_toggle", NULL, WM_OP_INVOKE_REGION_WIN);
-
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "MESH_OT_spin", NULL, WM_OP_INVOKE_REGION_WIN);
- uiItemFullO(col, NULL, 0, "MESH_OT_screw", NULL, WM_OP_INVOKE_REGION_WIN);
-
- }
+ if(op==NULL)
+ return;
+ if(WM_operator_poll((bContext*)C, op->type) == 0)
+ return;
+
+ block= uiLayoutGetBlock(pa->layout);
+
+ uiBlockSetFunc(block, redo_cb, op, NULL);
+
+ if(op->macro.first) {
+ for(op= op->macro.first; op; op= op->next)
+ view3d_panel_operator_redo_buts(C, pa, op);
}
else {
+ view3d_panel_operator_redo_buts(C, pa, op);
+ }
+}
+
+/* ******************* */
+
+typedef struct CustomTool {
+ struct CustomTool *next, *prev;
+ char opname[OP_MAX_TYPENAME];
+ char context[OP_MAX_TYPENAME];
+} CustomTool;
+
+static void operator_call_cb(struct bContext *C, void *arg_listbase, void *arg2)
+{
+ wmOperatorType *ot= arg2;
+
+ if(ot) {
+ CustomTool *ct= MEM_callocN(sizeof(CustomTool), "CustomTool");
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "OBJECT_OT_delete", NULL, WM_OP_INVOKE_REGION_WIN);
- uiItemFullO(col, NULL, 0, "OBJECT_OT_primitive_add", NULL, WM_OP_INVOKE_REGION_WIN);
+ BLI_addtail(arg_listbase, ct);
+ BLI_strncpy(ct->opname, ot->idname, OP_MAX_TYPENAME);
+ BLI_strncpy(ct->context, CTX_data_mode_string(C), OP_MAX_TYPENAME);
+ }
+
+}
+
+static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+{
+ wmOperatorType *ot = WM_operatortype_first();
+
+ for(; ot; ot= ot->next) {
- col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, NULL, 0, "OBJECT_OT_parent_set", NULL, WM_OP_INVOKE_REGION_WIN);
- uiItemFullO(col, NULL, 0, "OBJECT_OT_parent_clear", NULL, WM_OP_INVOKE_REGION_WIN);
+ if(BLI_strcasestr(ot->name, str)) {
+ if(WM_operator_poll((bContext*)C, ot)) {
+
+ if(0==uiSearchItemAdd(items, ot->name, ot, 0))
+ break;
+ }
+ }
+ }
+}
+
+
+/* ID Search browse menu, open */
+static uiBlock *tool_search_menu(bContext *C, ARegion *ar, void *arg_listbase)
+{
+ static char search[OP_MAX_TYPENAME];
+ wmEvent event;
+ wmWindow *win= CTX_wm_window(C);
+ uiBlock *block;
+ uiBut *but;
+
+ /* clear initial search string, then all items show */
+ search[0]= 0;
+
+ block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1);
+
+ /* fake button, it holds space for search items */
+ uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
+
+ but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, OP_MAX_TYPENAME, 10, 0, 150, 19, "");
+ uiButSetSearchFunc(but, operator_search_cb, arg_listbase, operator_call_cb, NULL);
+
+ uiBoundsBlock(block, 6);
+ uiBlockSetDirection(block, UI_DOWN);
+ uiEndBlock(C, block);
+
+ event= *(win->eventstate); /* XXX huh huh? make api call */
+ event.type= EVT_BUT_OPEN;
+ event.val= KM_PRESS;
+ event.customdata= but;
+ event.customdatafree= FALSE;
+ wm_event_add(win, &event);
+
+ return block;
+}
+
+
+static void view3d_panel_tool_shelf(const bContext *C, Panel *pa)
+{
+ SpaceLink *sl= CTX_wm_space_data(C);
+ SpaceType *st= NULL;
+ uiLayout *col;
+ const char *context= CTX_data_mode_string(C);
+
+ if(sl)
+ st= BKE_spacetype_from_id(sl->spacetype);
+
+ if(st && st->toolshelf.first) {
+ CustomTool *ct;
+ 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, NULL, 0, ct->opname, NULL, WM_OP_INVOKE_REGION_WIN, 0);
+ }
+ }
}
+ col= uiLayoutColumn(pa->layout, 1);
+ uiDefBlockBut(uiLayoutGetBlock(pa->layout), tool_search_menu, &st->toolshelf, "Add Tool", 0, 0, UI_UNIT_X, UI_UNIT_Y, "Add Tool in shelf, gets saved in files");
}
@@ -196,36 +284,41 @@ void view3d_toolbar_register(ARegionType *art)
PanelType *pt;
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel tools");
- strcpy(pt->idname, "VIEW3D_PT_tools");
- strcpy(pt->label, "Tools");
- pt->draw= view3d_panel_tools;
+ strcpy(pt->idname, "VIEW3D_PT_tool_shelf");
+ strcpy(pt->label, "Tool Shelf");
+ pt->draw= view3d_panel_tool_shelf;
BLI_addtail(&art->paneltypes, pt);
+}
+
+void view3d_tool_props_register(ARegionType *art)
+{
+ PanelType *pt;
pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel last operator");
strcpy(pt->idname, "VIEW3D_PT_last_operator");
- strcpy(pt->label, "Last Operator");
+ strcpy(pt->label, "Operator");
+ pt->draw_header= view3d_panel_operator_redo_header;
pt->draw= view3d_panel_operator_redo;
BLI_addtail(&art->paneltypes, pt);
}
+/* ********** operator to open/close toolbar region */
+
static int view3d_toolbar(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_tools_region(sa);
- if(ar) {
- ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
- }
+ if(ar)
+ ED_region_toggle_hidden(C, ar);
+
return OPERATOR_FINISHED;
}
void VIEW3D_OT_toolbar(wmOperatorType *ot)
{
ot->name= "Toolbar";
+ ot->description= "Toggles toolbar display.";
ot->idname= "VIEW3D_OT_toolbar";
ot->exec= view3d_toolbar;
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 782d426641f..f722a97963d 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -56,13 +56,16 @@
#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
+#include "BKE_depsgraph.h" /* for fly mode updating */
#include "RE_pipeline.h" // make_stars
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -80,6 +83,10 @@
#include "PIL_time.h" /* smoothview */
+#if GAMEBLENDER == 1
+#include "SYS_System.h"
+#endif
+
#include "view3d_intern.h" // own include
/* use this call when executing an operator,
@@ -105,7 +112,7 @@ void view3d_operator_needs_opengl(const bContext *C)
float *give_cursor(Scene *scene, View3D *v3d)
{
- if(v3d && v3d->localview) return v3d->cursor;
+ if(v3d && v3d->localvd) return v3d->cursor;
else return scene->cursor;
}
@@ -371,6 +378,7 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
/* identifiers */
ot->name= "Smooth View";
ot->idname= "VIEW3D_OT_smoothview";
+ ot->description="The time to animate the change of view (in milliseconds)";
/* api callbacks */
ot->invoke= view3d_smoothview_invoke;
@@ -378,26 +386,31 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
}
-static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
+static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
{
- View3D *v3d = CTX_wm_view3d(C);
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- Object *ob;
float dvec[3];
- ob= v3d->camera;
dvec[0]= rv3d->dist*rv3d->viewinv[2][0];
dvec[1]= rv3d->dist*rv3d->viewinv[2][1];
dvec[2]= rv3d->dist*rv3d->viewinv[2][2];
VECCOPY(ob->loc, dvec);
- VecSubf(ob->loc, ob->loc, v3d->ofs);
+ VecSubf(ob->loc, ob->loc, rv3d->ofs);
rv3d->viewquat[0]= -rv3d->viewquat[0];
QuatToEul(rv3d->viewquat, ob->rot);
rv3d->viewquat[0]= -rv3d->viewquat[0];
ob->recalc= OB_RECALC_OB;
+}
+
+
+static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+
+ setcameratoview3d(v3d, rv3d, v3d->camera);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, CTX_data_scene(C));
@@ -410,6 +423,7 @@ void VIEW3D_OT_setcameratoview(wmOperatorType *ot)
/* identifiers */
ot->name= "Align Camera To View";
+ ot->description= "Set camera view to active view.";
ot->idname= "VIEW3D_OT_camera_to_view";
/* api callbacks */
@@ -481,7 +495,10 @@ void initgrabz(RegionView3D *rv3d, float x, float y, float z)
/* Negative zfac means x, y, z was behind the camera (in perspective).
* This gives flipped directions, so revert back to ok default case.
*/
- if (rv3d->zfac < 0.0f) rv3d->zfac = 1.0f;
+ // NOTE: I've changed this to flip zfac to be positive again for now so that GPencil draws ok
+ // -- Aligorith, 2009Aug31
+ //if (rv3d->zfac < 0.0f) rv3d->zfac = 1.0f;
+ if (rv3d->zfac < 0.0f) rv3d->zfac= -rv3d->zfac;
}
/* always call initgrabz */
@@ -543,6 +560,18 @@ void view3d_get_object_project_mat(RegionView3D *rv3d, Object *ob, float pmat[4]
Mat4MulMat4(pmat, vmat, rv3d->winmat);
}
+/* Uses window coordinates (x,y) and depth component z to find a point in
+ modelspace */
+void view3d_unproject(bglMats *mats, float out[3], const short x, const short y, const float z)
+{
+ double ux, uy, uz;
+
+ gluUnProject(x,y,z, mats->modelview, mats->projection,
+ (GLint *)mats->viewport, &ux, &uy, &uz );
+ out[0] = ux;
+ out[1] = uy;
+ out[2] = uz;
+}
/* use above call to get projecting mat */
void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4])
@@ -1281,7 +1310,6 @@ static void initlocalview(Scene *scene, ScrArea *sa)
base->object->lay= base->lay;
}
}
- v3d->localview= 0;
}
}
@@ -1303,7 +1331,6 @@ static void restore_localviewdata(ScrArea *sa, int free)
if(free) {
MEM_freeN(v3d->localvd);
v3d->localvd= NULL;
- v3d->localview= 0;
}
for(ar= sa->regionbase.first; ar; ar= ar->next) {
@@ -1375,6 +1402,7 @@ void VIEW3D_OT_localview(wmOperatorType *ot)
/* identifiers */
ot->name= "Local View";
+ ot->description= "Toggle display of selected object(s) seperately and centered in view.";
ot->idname= "VIEW3D_OT_localview";
/* api callbacks */
@@ -1383,16 +1411,17 @@ void VIEW3D_OT_localview(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
}
+#if GAMEBLENDER == 1
+
static ListBase queue_back;
static void SaveState(bContext *C)
{
wmWindow *win= CTX_wm_window(C);
+ Object *obact = CTX_data_active_object(C);
glPushAttrib(GL_ALL_ATTRIB_BITS);
- GPU_state_init();
-
- if(G.f & G_TEXTUREPAINT)
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
GPU_paint_set_mipmap(1);
queue_back= win->queue;
@@ -1405,8 +1434,9 @@ static void SaveState(bContext *C)
static void RestoreState(bContext *C)
{
wmWindow *win= CTX_wm_window(C);
+ Object *obact = CTX_data_active_object(C);
- if(G.f & G_TEXTUREPAINT)
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
GPU_paint_set_mipmap(0);
//XXX curarea->win_swap = 0;
@@ -1419,22 +1449,111 @@ static void RestoreState(bContext *C)
win->queue= queue_back;
+ GPU_state_init();
+
glPopAttrib();
}
+/* was space_set_commmandline_options in 2.4x */
+void game_set_commmandline_options(GameData *gm)
+{
+ SYS_SystemHandle syshandle;
+ int test;
+
+ if ( (syshandle = SYS_GetSystem()) ) {
+ /* User defined settings */
+ test= (U.gameflags & USER_DISABLE_SOUND);
+ /* if user already disabled audio at the command-line, don't re-enable it */
+ if (test)
+ SYS_WriteCommandLineInt(syshandle, "noaudio", test);
+
+ test= (U.gameflags & USER_DISABLE_MIPMAP);
+ GPU_set_mipmap(!test);
+ SYS_WriteCommandLineInt(syshandle, "nomipmap", test);
+
+ /* File specific settings: */
+ /* Only test the first one. These two are switched
+ * simultaneously. */
+ test= (gm->flag & GAME_SHOW_FRAMERATE);
+ SYS_WriteCommandLineInt(syshandle, "show_framerate", test);
+ SYS_WriteCommandLineInt(syshandle, "show_profile", test);
+
+ test = (gm->flag & GAME_SHOW_FRAMERATE);
+ SYS_WriteCommandLineInt(syshandle, "show_properties", test);
+
+ test= (gm->flag & GAME_SHOW_PHYSICS);
+ SYS_WriteCommandLineInt(syshandle, "show_physics", test);
+
+ test= (gm->flag & GAME_ENABLE_ALL_FRAMES);
+ SYS_WriteCommandLineInt(syshandle, "fixedtime", test);
+
+// a= (G.fileflags & G_FILE_GAME_TO_IPO);
+// SYS_WriteCommandLineInt(syshandle, "game2ipo", a);
+
+ test= (gm->flag & GAME_IGNORE_DEPRECATION_WARNINGS);
+ SYS_WriteCommandLineInt(syshandle, "ignore_deprecation_warnings", test);
+
+ test= (gm->matmode == GAME_MAT_MULTITEX);
+ SYS_WriteCommandLineInt(syshandle, "blender_material", test);
+ test= (gm->matmode == GAME_MAT_GLSL);
+ SYS_WriteCommandLineInt(syshandle, "blender_glsl_material", test);
+ test= (gm->flag & GAME_DISPLAY_LISTS);
+ SYS_WriteCommandLineInt(syshandle, "displaylists", test);
+
+
+ }
+}
+
/* maybe we need this defined somewhere else */
-extern void StartKetsjiShell(struct bContext *C,int always_use_expand_framing);
+extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing);
+#endif // GAMEBLENDER == 1
+
+int game_engine_poll(bContext *C)
+{
+ return CTX_data_mode_enum(C)==CTX_MODE_OBJECT ? 1:0;
+}
static int game_engine_exec(bContext *C, wmOperator *unused)
{
+#if GAMEBLENDER == 1
Scene *startscene = CTX_data_scene(C);
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa, *prevsa= CTX_wm_area(C);
+ ARegion *ar, *prevar= CTX_wm_region(C);
+
+ sa= prevsa;
+ if(sa->spacetype != SPACE_VIEW3D) {
+ for(sa=sc->areabase.first; sa; sa= sa->next)
+ if(sa->spacetype==SPACE_VIEW3D)
+ break;
+ }
+
+ if(!sa)
+ return OPERATOR_CANCELLED;
-#if GAMEBLENDER == 1
+ for(ar=sa->regionbase.first; ar; ar=ar->next)
+ if(ar->regiontype == RGN_TYPE_WINDOW)
+ break;
+
+ if(!ar)
+ return OPERATOR_CANCELLED;
+
+ // bad context switch ..
+ CTX_wm_area_set(C, sa);
+ CTX_wm_region_set(C, ar);
+
+ view3d_operator_needs_opengl(C);
+
+ game_set_commmandline_options(&startscene->gm);
+
SaveState(C);
- StartKetsjiShell(C, 1);
+ StartKetsjiShell(C, ar, 1);
RestoreState(C);
+ CTX_wm_region_set(C, prevar);
+ CTX_wm_area_set(C, prevsa);
+
//XXX restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(startscene);
//XXX scene_update_for_newframe(G.scene, G.scene->lay);
@@ -1451,12 +1570,809 @@ void VIEW3D_OT_game_start(wmOperatorType *ot)
/* identifiers */
ot->name= "Start Game Engine";
+ ot->description= "Start game engine.";
ot->idname= "VIEW3D_OT_game_start";
/* api callbacks */
ot->exec= game_engine_exec;
+ 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(wmWindowManager *wm)
+{
+ 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(wm, "View3D Fly Modal");
+
+ /* this function is called for each spacetype, only needs to add map once */
+ if(keymap) return;
+
+ keymap= WM_modalkeymap_add(wm, "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, 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 */
+
+ /* 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 */
+
+ /* 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
+
+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==V3D_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==V3D_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= TRUE;
+ 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_window_timer(CTX_wm_window(C), TIMER, 0.01f);
+
+
+ /* we have to rely on events to give proper mousecoords after a warp_pointer */
+//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]);
+ //fly->mval[0]= (fly->sa->winx)/2;
+ //fly->mval[1]= (fly->sa->winy)/2;
+
+ 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; /* 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;
+ Mat3CpyMat4(mat, fly->rv3d->viewinv);
+ Mat3MulVecfl(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==V3D_CAMOB) {
+ /* store the origoinal camera loc and rot */
+ VECCOPY(fly->ofs_backup, fly->v3d->camera->loc);
+ VECCOPY(fly->rot_backup, fly->v3d->camera->rot);
+
+ where_is_object(fly->scene, fly->v3d->camera);
+ VECCOPY(fly->rv3d->ofs, fly->v3d->camera->obmat[3]);
+ VecMulf(fly->rv3d->ofs, -1.0f); /*flip the vector*/
+
+ fly->rv3d->dist=0.0;
+ fly->rv3d->viewbut=0;
+
+ /* used for recording */
+//XXX2.5 if(v3d->camera->ipoflag & OB_ACTION_OB)
+//XXX2.5 actname= "Object";
+
+ } else {
+ /* perspective or ortho */
+ if (fly->rv3d->persp==V3D_ORTHO)
+ fly->rv3d->persp= V3D_PERSP; /*if ortho projection, make perspective */
+ QUATCOPY(fly->rot_backup, fly->rv3d->viewquat);
+ VECCOPY(fly->ofs_backup, fly->rv3d->ofs);
+ fly->rv3d->dist= 0.0;
+
+ upvec[2]= fly->dist_backup; /*x and y are 0*/
+ Mat3MulVecfl(mat, upvec);
+ VecSubf(fly->rv3d->ofs, fly->rv3d->ofs, upvec);
+ /*Done with correcting for the dist*/
+ }
+
+ 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_window_timer(CTX_wm_window(C), fly->timer);
+
+ rv3d->dist= fly->dist_backup;
+
+ if (fly->state == FLY_CANCEL) {
+ /* Revert to original view? */
+ if (fly->persp_backup==V3D_CAMOB) { /* a camera view */
+ rv3d->viewbut=1;
+ VECCOPY(v3d->camera->loc, fly->ofs_backup);
+ VECCOPY(v3d->camera->rot, fly->rot_backup);
+ DAG_id_flush_update(&v3d->camera->id, OB_RECALC_OB);
+ } else {
+ /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
+ QUATCOPY(rv3d->viewquat, fly->rot_backup);
+ VECCOPY(rv3d->ofs, fly->ofs_backup);
+ rv3d->persp= fly->persp_backup;
+ }
+ }
+ else if (fly->persp_backup==V3D_CAMOB) { /* camera */
+ float mat3[3][3];
+ Mat3CpyMat4(mat3, v3d->camera->obmat);
+ Mat3ToCompatibleEul(mat3, v3d->camera->rot, fly->rot_backup);
+
+ 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*/
+ Mat3CpyMat4(mat, rv3d->viewinv);
+ Mat3MulVecfl(mat, upvec);
+ VecAddf(rv3d->ofs, rv3d->ofs, upvec);
+ /*Done with correcting for the dist */
+ }
+
+ rv3d->rflag &= ~RV3D_FLYMODE;
+//XXX2.5 BIF_view3d_previewrender_signal(fly->sa, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */
+
+
+ if(fly->state == FLY_CONFIRM) {
+ MEM_freeN(fly);
+ return OPERATOR_FINISHED;
+ }
+
+ MEM_freeN(fly);
+ return OPERATOR_CANCELLED;
+}
+
+void flyEvent(FlyInfo *fly, wmEvent *event)
+{
+ if (event->type == 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 alredy 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;
+
+ }
+ }
+}
+
+//int fly_exec(bContext *C, wmOperator *op)
+int flyApply(FlyInfo *fly)
+{
+ /*
+ 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 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*/
+
+ /* for recording */
+#if 0 //XXX2.5 todo, get animation recording working again.
+ int playing_anim = 0; //XXX has_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM);
+ int cfra = -1; /*so the first frame always has a key added */
+ char *actname="";
+#endif
+ /* 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);
+
+ Mat3CpyMat4(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;
+ }
+
+ Mat3MulVecfl(mat, dvec_tmp);
+ VecMulf(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;
+ Mat3MulVecfl(mat, upvec);
+ VecRotToQuat( upvec, (float)moffset[1]*-time_redraw*20, tmp_quat); /* Rotate about the relative up vec */
+ QuatMul(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;
+ Mat3MulVecfl(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;
+ Mat3MulVecfl(mat, upvec);
+ }
+
+ VecRotToQuat( upvec, (float)moffset[0]*time_redraw*20, tmp_quat); /* Rotate about the relative up vec */
+ QuatMul(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;
+ Mat3MulVecfl(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;
+
+ Mat3MulVecfl(mat, upvec);
+ VecRotToQuat( upvec, roll*time_redraw_clamped*fly->zlock_momentum*0.1, tmp_quat); /* Rotate about the relative up vec */
+ QuatMul(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ fly->zlock_momentum += 0.05f;
+ } 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;
+ Mat3MulVecfl(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;
+
+ Mat3MulVecfl(mat, upvec);
+
+ VecRotToQuat( upvec, roll*time_redraw_clamped*fly->xlock_momentum*0.1f, tmp_quat); /* Rotate about the relative up vec */
+ QuatMul(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;
+
+ Mat3MulVecfl(mat, dvec_tmp);
+
+ VecMulf(dvec_tmp, fly->speed * time_redraw * 0.25f);
+ }
+ }
+
+ /* impose a directional lag */
+ VecLerpf(dvec, dvec_tmp, fly->dvec_prev, (1.0f/(1.0f+(time_redraw*5.0f))));
+
+ if (rv3d->persp==V3D_CAMOB) {
+ if (v3d->camera->protectflag & OB_LOCK_LOCX)
+ dvec[0] = 0.0;
+ if (v3d->camera->protectflag & OB_LOCK_LOCY)
+ dvec[1] = 0.0;
+ if (v3d->camera->protectflag & OB_LOCK_LOCZ)
+ dvec[2] = 0.0;
+ }
+
+ VecAddf(rv3d->ofs, rv3d->ofs, dvec);
+#if 0 //XXX2.5
+ if (fly->zlock && fly->xlock)
+ headerprint("FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->zlock)
+ headerprint("FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->xlock)
+ headerprint("FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else
+ headerprint("FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+#endif
+
+//XXX2.5 do_screenhandlers(G.curscreen); /* advance the next frame */
+
+ /* 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==V3D_CAMOB) {
+ rv3d->persp= V3D_PERSP; /*set this so setviewmatrixview3d uses the ofs and quat instead of the camera */
+ setviewmatrixview3d(scene, v3d, rv3d);
+
+ setcameratoview3d(v3d, rv3d, v3d->camera);
+
+ { //XXX - some reason setcameratoview3d doesnt copy, shouldnt not be needed!
+ VECCOPY(v3d->camera->loc, rv3d->ofs);
+ VecNegf(v3d->camera->loc);
+ }
+
+ rv3d->persp= V3D_CAMOB;
+#if 0 //XXX2.5
+ /* record the motion */
+ if (IS_AUTOKEY_MODE(NORMAL) && (!playing_anim || cfra != G.scene->r.cfra)) {
+ cfra = G.scene->r.cfra;
+
+ if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) {
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_ROT_X, 0);
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_ROT_Y, 0);
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_ROT_Z, 0);
+ }
+ if (fly->speed) {
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_LOC_X, 0);
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_LOC_Y, 0);
+ insertkey(&v3d->camera->id, ID_OB, actname, NULL, OB_LOC_Z, 0);
+ }
+ }
+#endif
+ }
+//XXX2.5 scrarea_do_windraw(curarea);
+//XXX2.5 screen_swapbuffers();
+ } 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 */
+ VECCOPY(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)
+ flyApply(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;
+
}
/* ************************************** */
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 3311fb7d0fe..ca9981bc590 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -45,6 +45,7 @@
#include "MEM_guardedalloc.h"
+#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_action_types.h" /* for some special action-editor settings */
#include "DNA_constraint_types.h"
@@ -76,9 +77,9 @@
//#include "BIF_editmesh.h"
//#include "BIF_editsima.h"
//#include "BIF_editparticle.h"
-//#include "BIF_editaction.h"
-#include "BKE_action.h" /* get_action_frame */
+#include "BKE_action.h"
+#include "BKE_nla.h"
//#include "BKE_bad_level_calls.h"/* popmenu and error */
#include "BKE_bmesh.h"
#include "BKE_context.h"
@@ -88,16 +89,18 @@
#include "BKE_pointcache.h"
#include "BKE_utildefines.h"
#include "BKE_context.h"
+#include "BKE_unit.h"
-//#include "BSE_editaction_types.h"
//#include "BSE_view.h"
#include "ED_image.h"
+#include "ED_keyframing.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_markers.h"
#include "ED_util.h"
#include "ED_view3d.h"
+#include "ED_mesh.h"
#include "UI_view2d.h"
#include "WM_types.h"
@@ -106,6 +109,8 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_ghash.h"
+#include "BLI_linklist.h"
#include "PIL_time.h" /* sleep */
@@ -123,7 +128,7 @@ void setTransformViewMatrices(TransInfo *t)
{
if(t->spacetype==SPACE_VIEW3D && t->ar->regiontype == RGN_TYPE_WINDOW) {
RegionView3D *rv3d = t->ar->regiondata;
-
+
Mat4CpyMat4(t->viewmat, rv3d->viewmat);
Mat4CpyMat4(t->viewinv, rv3d->viewinv);
Mat4CpyMat4(t->persmat, rv3d->persmat);
@@ -137,7 +142,7 @@ void setTransformViewMatrices(TransInfo *t)
Mat4One(t->persinv);
t->persp = V3D_ORTHO;
}
-
+
calculateCenter2D(t);
}
@@ -152,23 +157,23 @@ void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
else if(t->spacetype==SPACE_IMAGE) {
View2D *v2d = t->view;
float divx, divy, aspx, aspy;
-
+
ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
-
+
divx= v2d->mask.xmax-v2d->mask.xmin;
divy= v2d->mask.ymax-v2d->mask.ymin;
-
+
vec[0]= aspx*(v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
vec[1]= aspy*(v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
vec[2]= 0.0f;
}
- else if(t->spacetype==SPACE_IPO) {
+ else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
View2D *v2d = t->view;
float divx, divy;
-
+
divx= v2d->mask.xmax-v2d->mask.xmin;
divy= v2d->mask.ymax-v2d->mask.ymin;
-
+
vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx) / (divx);
vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy) / (divy);
vec[2]= 0.0f;
@@ -176,10 +181,10 @@ void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
else if(t->spacetype==SPACE_NODE) {
View2D *v2d = &t->ar->v2d;
float divx, divy;
-
+
divx= v2d->mask.xmax-v2d->mask.xmin;
divy= v2d->mask.ymax-v2d->mask.ymin;
-
+
vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
vec[2]= 0.0f;
@@ -205,23 +210,23 @@ void projectIntView(TransInfo *t, float *vec, int *adr)
}
else if(t->spacetype==SPACE_IMAGE) {
float aspx, aspy, v[2];
-
+
ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
v[0]= vec[0]/aspx;
v[1]= vec[1]/aspy;
-
+
UI_view2d_to_region_no_clip(t->view, v[0], v[1], adr, adr+1);
}
- else if(t->spacetype==SPACE_IPO) {
+ else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
int out[2] = {0, 0};
-
- UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1);
+
+ UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1);
adr[0]= out[0];
adr[1]= out[1];
}
else if(t->spacetype==SPACE_SEQ) { /* XXX not tested yet, but should work */
int out[2] = {0, 0};
-
+
UI_view2d_view_to_region((View2D *)t->view, vec[0], vec[1], out, out+1);
adr[0]= out[0];
adr[1]= out[1];
@@ -236,14 +241,14 @@ void projectFloatView(TransInfo *t, float *vec, float *adr)
}
else if(t->spacetype==SPACE_IMAGE) {
int a[2];
-
+
projectIntView(t, vec, a);
adr[0]= a[0];
adr[1]= a[1];
}
- else if(t->spacetype==SPACE_IPO) {
+ else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
int a[2];
-
+
projectIntView(t, vec, a);
adr[0]= a[0];
adr[1]= a[1];
@@ -296,28 +301,23 @@ static void viewRedrawForce(bContext *C, TransInfo *t)
{
if (t->spacetype == SPACE_VIEW3D)
{
- /* Do we need more refined tags? */
+ /* Do we need more refined tags? */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ /* for realtime animation record - send notifiers recognised by animation editors */
+ if ((t->animtimer) && IS_AUTOKEY_ON(t->scene))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, NULL);
}
else if (t->spacetype == SPACE_ACTION) {
- SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
-
- // TRANSFORM_FIX_ME
- if (saction->lock) {
- // whole window...
- }
- else
- ED_area_tag_redraw(t->sa);
+ //SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
}
else if (t->spacetype == SPACE_IPO) {
- SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
-
- // TRANSFORM_FIX_ME
- if (sipo->lock) {
- // whole window...
- }
- else
- ED_area_tag_redraw(t->sa);
+ //SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL);
}
else if(t->spacetype == SPACE_NODE)
{
@@ -336,14 +336,14 @@ static void viewRedrawForce(bContext *C, TransInfo *t)
else force_draw(0);
#endif
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, t->obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, t->obedit->data);
}
}
static void viewRedrawPost(TransInfo *t)
{
ED_area_headerprint(t->sa, NULL);
-
+
#if 0 // TRANSFORM_FIX_ME
if(t->spacetype==SPACE_VIEW3D) {
allqueue(REDRAWBUTSOBJECT, 0);
@@ -374,7 +374,7 @@ void BIF_selectOrientation() {
char *str_menu = BIF_menustringTransformOrientation("Orientation");
val= pupmenu(str_menu);
MEM_freeN(str_menu);
-
+
if(val >= 0) {
G.vd->twmode = val;
}
@@ -390,18 +390,18 @@ static void view_editmove(unsigned short event)
/* Ctrl: Scroll right */
/* Alt-Shift: Rotate up */
/* Alt-Ctrl: Rotate right */
-
+
/* only work in 3D window for now
* In the end, will have to send to event to a 2D window handler instead
*/
if (Trans.flag & T_2D_EDIT)
return;
-
+
switch(event) {
case WHEELUPMOUSE:
-
+
if( G.qual & LR_SHIFTKEY ) {
- if( G.qual & LR_ALTKEY ) {
+ if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD2);
G.qual |= LR_SHIFTKEY;
@@ -409,23 +409,23 @@ static void view_editmove(unsigned short event)
persptoetsen(PAD2);
}
} else if( G.qual & LR_CTRLKEY ) {
- if( G.qual & LR_ALTKEY ) {
+ if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD4);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD4);
}
- } else if(U.uiflag & USER_WHEELZOOMDIR)
+ } else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADMINUS);
else
persptoetsen(PADPLUSKEY);
-
+
refresh = 1;
break;
case WHEELDOWNMOUSE:
if( G.qual & LR_SHIFTKEY ) {
- if( G.qual & LR_ALTKEY ) {
+ if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_SHIFTKEY;
persptoetsen(PAD8);
G.qual |= LR_SHIFTKEY;
@@ -433,18 +433,18 @@ static void view_editmove(unsigned short event)
persptoetsen(PAD8);
}
} else if( G.qual & LR_CTRLKEY ) {
- if( G.qual & LR_ALTKEY ) {
+ if( G.qual & LR_ALTKEY ) {
G.qual &= ~LR_CTRLKEY;
persptoetsen(PAD6);
G.qual |= LR_CTRLKEY;
} else {
persptoetsen(PAD6);
}
- } else if(U.uiflag & USER_WHEELZOOMDIR)
+ } else if(U.uiflag & USER_WHEELZOOMDIR)
persptoetsen(PADPLUSKEY);
else
persptoetsen(PADMINUS);
-
+
refresh = 1;
break;
}
@@ -454,6 +454,7 @@ static void view_editmove(unsigned short event)
#endif
}
+#if 0
static char *transform_to_undostr(TransInfo *t)
{
switch (t->mode) {
@@ -500,35 +501,156 @@ static char *transform_to_undostr(TransInfo *t)
}
return "Transform";
}
+#endif
/* ************************************************* */
+/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
+#define TFM_MODAL_CANCEL 1
+#define TFM_MODAL_CONFIRM 2
+#define TFM_MODAL_TRANSLATE 3
+#define TFM_MODAL_ROTATE 4
+#define TFM_MODAL_RESIZE 5
+#define TFM_MODAL_SNAP_GEARS 6
+#define TFM_MODAL_SNAP_GEARS_OFF 7
+
+/* called in transform_ops.c, on each regeneration of keymaps */
+void transform_modal_keymap(wmWindowManager *wm)
+{
+ static EnumPropertyItem modal_items[] = {
+ {TFM_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+ {TFM_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+ {TFM_MODAL_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
+ {TFM_MODAL_ROTATE, "ROTATE", 0, "Rotate", ""},
+ {TFM_MODAL_RESIZE, "RESIZE", 0, "Resize", ""},
+ {TFM_MODAL_SNAP_GEARS, "SNAP_GEARS", 0, "Snap On", ""},
+ {TFM_MODAL_SNAP_GEARS_OFF, "SNAP_GEARS_OFF", 0, "Snap Off", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ wmKeyMap *keymap= WM_modalkeymap_get(wm, "Transform Modal Map");
+
+ /* this function is called for each spacetype, only needs to add map once */
+ if(keymap) return;
+
+ keymap= WM_modalkeymap_add(wm, "Transform Modal Map", modal_items);
+
+ /* items for modal map */
+ WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_CANCEL);
+ WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, TFM_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, TFM_MODAL_CONFIRM);
+
+ WM_modalkeymap_add_item(keymap, GKEY, KM_PRESS, 0, 0, TFM_MODAL_TRANSLATE);
+ WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, TFM_MODAL_ROTATE);
+ WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, TFM_MODAL_RESIZE);
+
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_GEARS);
+ WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_GEARS_OFF);
+
+ /* assign map to operators */
+ WM_modalkeymap_assign(keymap, "TFM_OT_transform");
+ WM_modalkeymap_assign(keymap, "TFM_OT_translate");
+ WM_modalkeymap_assign(keymap, "TFM_OT_rotate");
+ WM_modalkeymap_assign(keymap, "TFM_OT_tosphere");
+ WM_modalkeymap_assign(keymap, "TFM_OT_resize");
+ WM_modalkeymap_assign(keymap, "TFM_OT_shear");
+ WM_modalkeymap_assign(keymap, "TFM_OT_warp");
+ WM_modalkeymap_assign(keymap, "TFM_OT_shrink_fatten");
+ WM_modalkeymap_assign(keymap, "TFM_OT_tilt");
+ WM_modalkeymap_assign(keymap, "TFM_OT_trackball");
+
+}
+
+
void 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}};
char cmode = constraintModeToChar(t);
-
+
t->redraw |= handleMouseInput(t, &t->mouse, event);
if (event->type == MOUSEMOVE)
{
t->mval[0] = event->x - t->ar->winrct.xmin;
t->mval[1] = event->y - t->ar->winrct.ymin;
-
+
t->redraw = 1;
-
+
applyMouseInput(t, &t->mouse, t->mval, t->values);
}
-
- if (event->val) {
+
+ /* handle modal keymap first */
+ if (event->type == EVT_MODAL_MAP) {
+ switch (event->val) {
+ case TFM_MODAL_CANCEL:
+ t->state = TRANS_CANCEL;
+ break;
+ case TFM_MODAL_CONFIRM:
+ t->state = TRANS_CONFIRM;
+ break;
+
+ case TFM_MODAL_TRANSLATE:
+ /* only switch when... */
+ if( ELEM3(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) {
+ resetTransRestrictions(t);
+ restoreTransObjects(t);
+ initTranslation(t);
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw = 1;
+ }
+ 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);
+ }
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw = 1;
+ }
+ break;
+ case TFM_MODAL_RESIZE:
+ /* only switch when... */
+ if( ELEM3(t->mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) {
+ resetTransRestrictions(t);
+ restoreTransObjects(t);
+ initResize(t);
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw = 1;
+ }
+ break;
+
+ case TFM_MODAL_SNAP_GEARS:
+ t->modifiers |= MOD_SNAP_GEARS;
+ t->redraw = 1;
+ break;
+ case TFM_MODAL_SNAP_GEARS_OFF:
+ t->modifiers &= ~MOD_SNAP_GEARS;
+ t->redraw = 1;
+ break;
+ }
+ }
+ /* else do non-mapped events */
+ else if (event->val==KM_PRESS) {
switch (event->type){
+ case RIGHTMOUSE:
+ t->state = TRANS_CANCEL;
+ break;
/* enforce redraw of transform when modifiers are used */
case LEFTCTRLKEY:
case RIGHTCTRLKEY:
t->modifiers |= MOD_SNAP_GEARS;
t->redraw = 1;
break;
-
+
case LEFTSHIFTKEY:
case RIGHTSHIFTKEY:
t->modifiers |= MOD_CONSTRAINT_PLANE;
@@ -539,7 +661,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
if ((t->spacetype==SPACE_VIEW3D) && event->alt) {
#if 0 // TRANSFORM_FIX_ME
short mval[2];
-
+
getmouseco_sc(mval);
BIF_selectOrientation();
calc_manipulator_stats(curarea);
@@ -551,7 +673,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
t->state = TRANS_CONFIRM;
}
break;
-
+
case MIDDLEMOUSE:
if ((t->flag & T_NO_CONSTRAINT)==0) {
/* exception for switching to dolly, or trackball, in camera view */
@@ -584,19 +706,16 @@ void transformEvent(TransInfo *t, wmEvent *event)
}
break;
case ESCKEY:
- case RIGHTMOUSE:
- printf("cancelled\n");
t->state = TRANS_CANCEL;
break;
- case LEFTMOUSE:
case PADENTER:
case RETKEY:
t->state = TRANS_CONFIRM;
break;
case GKEY:
/* only switch when... */
- if( ELEM3(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) {
- resetTransRestrictions(t);
+ if( ELEM3(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) {
+ resetTransRestrictions(t);
restoreTransObjects(t);
initTranslation(t);
initSnapping(t, NULL); // need to reinit after mode change
@@ -605,8 +724,8 @@ void transformEvent(TransInfo *t, wmEvent *event)
break;
case SKEY:
/* only switch when... */
- if( ELEM3(t->mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) {
- resetTransRestrictions(t);
+ if( ELEM3(t->mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) {
+ resetTransRestrictions(t);
restoreTransObjects(t);
initResize(t);
initSnapping(t, NULL); // need to reinit after mode change
@@ -616,9 +735,9 @@ void transformEvent(TransInfo *t, wmEvent *event)
case RKEY:
/* only switch when... */
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);
@@ -778,10 +897,10 @@ void transformEvent(TransInfo *t, wmEvent *event)
// viewmoveNDOF(1);
// break;
}
-
+
// Numerical input events
t->redraw |= handleNumInput(&(t->num), event);
-
+
// NDof input events
switch(handleNDofInput(&(t->ndof), event))
{
@@ -796,7 +915,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
if (t->options & CTX_NDOF)
{
/* Cancel on pure NDOF transform */
- t->state = TRANS_CANCEL;
+ t->state = TRANS_CANCEL;
}
else
{
@@ -814,16 +933,19 @@ void transformEvent(TransInfo *t, wmEvent *event)
case NDOF_REFRESH:
t->redraw = 1;
break;
-
+
}
-
+
// Snapping events
t->redraw |= handleSnapping(t, event);
-
+
//arrows_move_cursor(event->type);
}
else {
switch (event->type){
+ case LEFTMOUSE:
+ t->state = TRANS_CONFIRM;
+ break;
case LEFTSHIFTKEY:
case RIGHTSHIFTKEY:
t->modifiers &= ~MOD_CONSTRAINT_PLANE;
@@ -833,7 +955,7 @@ void transformEvent(TransInfo *t, wmEvent *event)
case LEFTCTRLKEY:
case RIGHTCTRLKEY:
t->modifiers &= ~MOD_SNAP_GEARS;
- /* no redraw on release modifier keys! this makes sure you can assign the 'grid' still
+ /* no redraw on release modifier keys! this makes sure you can assign the 'grid' still
after releasing modifer key */
//t->redraw = 1;
break;
@@ -844,15 +966,15 @@ void transformEvent(TransInfo *t, wmEvent *event)
t->redraw = 1;
}
break;
- case LEFTMOUSE:
- case RIGHTMOUSE:
- if(WM_modal_tweak_exit(event, t->event_type))
-// if (t->options & CTX_TWEAK)
- t->state = TRANS_CONFIRM;
- break;
+// case LEFTMOUSE:
+// case RIGHTMOUSE:
+// if(WM_modal_tweak_exit(event, t->event_type))
+//// if (t->options & CTX_TWEAK)
+// t->state = TRANS_CONFIRM;
+// break;
}
}
-
+
// Per transform event, if present
if (t->handleEvent)
t->redraw |= t->handleEvent(t, event);
@@ -866,7 +988,7 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
t->state = TRANS_RUNNING;
t->options = CTX_NONE;
-
+
t->mode = TFM_DUMMY;
initTransInfo(C, t, NULL, event); // internal data, mouse, vectors
@@ -880,10 +1002,10 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
}
else {
success = 1;
-
+
calculateCenter(t);
-
- // Copy center from constraint center. Transform center can be local
+
+ // Copy center from constraint center. Transform center can be local
VECCOPY(vec, t->con.center);
}
@@ -891,9 +1013,9 @@ int calculateTransformCenter(bContext *C, wmEvent *event, int centerMode, float
/* aftertrans does insert ipos and action channels, and clears base flags, doesnt read transdata */
special_aftertrans_update(t);
-
+
MEM_freeN(t);
-
+
return success;
}
@@ -912,28 +1034,28 @@ static void drawArrow(ArrowDirection d, short offset, short length, short size)
length = -length;
size = -size;
case RIGHT:
- glBegin(GL_LINES);
- glVertex2s( offset, 0);
- glVertex2s( offset + length, 0);
- glVertex2s( offset + length, 0);
- glVertex2s( offset + length - size, -size);
- glVertex2s( offset + length, 0);
+ glBegin(GL_LINES);
+ glVertex2s( offset, 0);
+ glVertex2s( offset + length, 0);
+ glVertex2s( offset + length, 0);
+ glVertex2s( offset + length - size, -size);
+ glVertex2s( offset + length, 0);
glVertex2s( offset + length - size, size);
- glEnd();
+ glEnd();
break;
case DOWN:
offset = -offset;
length = -length;
size = -size;
case UP:
- glBegin(GL_LINES);
- glVertex2s( 0, offset);
- glVertex2s( 0, offset + length);
- glVertex2s( 0, offset + length);
- glVertex2s(-size, offset + length - size);
- glVertex2s( 0, offset + length);
+ glBegin(GL_LINES);
+ glVertex2s( 0, offset);
+ glVertex2s( 0, offset + length);
+ glVertex2s( 0, offset + length);
+ glVertex2s(-size, offset + length - size);
+ glVertex2s( 0, offset + length);
glVertex2s( size, offset + length - size);
- glEnd();
+ glEnd();
break;
}
}
@@ -945,22 +1067,22 @@ static void drawArrowHead(ArrowDirection d, short size)
case LEFT:
size = -size;
case RIGHT:
- glBegin(GL_LINES);
- glVertex2s( 0, 0);
- glVertex2s( -size, -size);
- glVertex2s( 0, 0);
+ glBegin(GL_LINES);
+ glVertex2s( 0, 0);
+ glVertex2s( -size, -size);
+ glVertex2s( 0, 0);
glVertex2s( -size, size);
- glEnd();
+ glEnd();
break;
case DOWN:
size = -size;
case UP:
- glBegin(GL_LINES);
- glVertex2s( 0, 0);
- glVertex2s(-size, -size);
- glVertex2s( 0, 0);
+ glBegin(GL_LINES);
+ glVertex2s( 0, 0);
+ glVertex2s(-size, -size);
+ glVertex2s( 0, 0);
glVertex2s( size, -size);
- glEnd();
+ glEnd();
break;
}
}
@@ -969,15 +1091,15 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
{
float delta = (angle_end - angle_start) / segments;
float angle;
-
+
glBegin(GL_LINE_STRIP);
-
+
for( angle = angle_start; angle < angle_end; angle += delta)
{
glVertex2f( cosf(angle) * size, sinf(angle) * size);
}
glVertex2f( cosf(angle_end) * size, sinf(angle_end) * size);
-
+
glEnd();
}
@@ -986,7 +1108,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
if (t->helpline != HLP_NONE && !(t->flag & T_USES_MANIPULATOR))
{
float vecrot[3], cent[2];
-
+
VECCOPY(vecrot, t->center);
if(t->flag & T_EDIT) {
Object *ob= t->obedit;
@@ -996,9 +1118,9 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
Object *ob=t->poseobj;
if(ob) Mat4MulVecfl(ob->obmat, vecrot);
}
-
+
projectFloatView(t, vecrot, cent); // no overflow in extreme cases
-
+
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
@@ -1007,16 +1129,16 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
glPushMatrix();
ED_region_pixelspace(t->ar);
-
+
switch(t->helpline)
{
case HLP_SPRING:
UI_ThemeColor(TH_WIRE);
-
+
setlinestyle(3);
- glBegin(GL_LINE_STRIP);
- glVertex2sv(t->mval);
- glVertex2fv(cent);
+ glBegin(GL_LINE_STRIP);
+ glVertex2sv(t->mval);
+ glVertex2fv(cent);
glEnd();
glTranslatef(t->mval[0], t->mval[1], 0);
@@ -1044,7 +1166,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
glTranslatef(t->mval[0], t->mval[1], 0);
glLineWidth(3.0);
- glBegin(GL_LINES);
+ glBegin(GL_LINES);
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
glLineWidth(1.0);
@@ -1057,27 +1179,27 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
float delta_angle = MIN2(15 / dist, M_PI/4);
float spacing_angle = MIN2(5 / dist, M_PI/12);
UI_ThemeColor(TH_WIRE);
-
+
setlinestyle(3);
- glBegin(GL_LINE_STRIP);
- glVertex2sv(t->mval);
- glVertex2fv(cent);
+ glBegin(GL_LINE_STRIP);
+ glVertex2sv(t->mval);
+ glVertex2fv(cent);
glEnd();
-
+
glTranslatef(cent[0], cent[1], 0);
-
+
setlinestyle(0);
glLineWidth(3.0);
drawArc(dist, angle - delta_angle, angle - spacing_angle, 10);
drawArc(dist, angle + spacing_angle, angle + delta_angle, 10);
-
+
glPushMatrix();
glTranslatef(cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
glRotatef(180 / M_PI * (angle - delta_angle), 0, 0, 1);
-
+
drawArrowHead(DOWN, 5);
-
+
glPopMatrix();
glTranslatef(cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
@@ -1092,32 +1214,32 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
{
char col[3], col2[3];
UI_GetThemeColor3ubv(TH_GRID, col);
-
+
glTranslatef(t->mval[0], t->mval[1], 0);
-
+
glLineWidth(3.0);
-
+
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');
glColor3ubv((GLubyte *)col2);
-
+
drawArrow(UP, 5, 10, 5);
drawArrow(DOWN, 5, 10, 5);
glLineWidth(1.0);
break;
}
}
-
+
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
-
+
glEnable(GL_DEPTH_TEST);
}
}
@@ -1125,7 +1247,7 @@ void drawHelpline(const struct bContext *C, TransInfo *t)
void drawTransform(const struct bContext *C, struct ARegion *ar, void *arg)
{
TransInfo *t = arg;
-
+
drawConstraint(C, t);
drawPropCircle(C, t);
drawSnapping(C, t);
@@ -1138,13 +1260,16 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
int constraint_axis[3] = {0, 0, 0};
int proportional = 0;
- if (t->flag & T_AUTOVALUES)
- {
- RNA_float_set_array(op->ptr, "value", t->auto_values);
- }
- else
+ if (RNA_struct_find_property(op->ptr, "value"))
{
- RNA_float_set_array(op->ptr, "value", t->values);
+ if (t->flag & T_AUTOVALUES)
+ {
+ RNA_float_set_array(op->ptr, "value", t->auto_values);
+ }
+ else
+ {
+ RNA_float_set_array(op->ptr, "value", t->values);
+ }
}
/* XXX convert stupid flag to enum */
@@ -1171,10 +1296,10 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
{
RNA_boolean_set(op->ptr, "mirror", t->flag & T_MIRROR);
}
-
+
if (RNA_struct_find_property(op->ptr, "constraint_axis"))
{
- RNA_int_set(op->ptr, "constraint_orientation", t->current_orientation);
+ RNA_enum_set(op->ptr, "constraint_orientation", t->current_orientation);
if (t->con.mode & CON_APPLY)
{
@@ -1196,12 +1321,17 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
if (t->flag & T_MODAL)
{
ts->prop_mode = t->prop_mode;
- ts->proportional = proportional;
+
+ /* only save back if it wasn't automatically disabled */
+ if ((t->options & CTX_NO_PET) == 0)
+ {
+ ts->proportional = proportional;
+ }
if(t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = t->view;
-
+
v3d->twmode = t->current_orientation;
}
}
@@ -1216,7 +1346,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
t->state = TRANS_RUNNING;
t->options = options;
-
+
t->mode = mode;
if (!initTransInfo(C, t, op, event)) // internal data, mouse, vectors
@@ -1228,7 +1358,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
{
//calc_manipulator_stats(curarea);
initTransformOrientation(C, t);
-
+
t->draw_handle = ED_region_draw_cb_activate(t->ar->type, drawTransform, t, REGION_DRAW_POST);
}
else if(t->spacetype == SPACE_IMAGE) {
@@ -1251,10 +1381,10 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
/* EVIL2: we gave as argument also texture space context bit... was cleared */
/* EVIL3: extend mode for animation editors also switches modes... but is best way to avoid duplicate code */
mode = t->mode;
-
+
calculatePropRatio(t);
calculateCenter(t);
-
+
initMouseInput(t, &t->mouse, t->center2d, t->imval);
switch (mode) {
@@ -1306,6 +1436,9 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
case TFM_BONE_ENVELOPE:
initBoneEnvelope(t);
break;
+ case TFM_EDGE_SLIDE:
+ initEdgeSlide(t);
+ break;
case TFM_BONE_ROLL:
initBoneRoll(t);
break;
@@ -1318,13 +1451,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
case TFM_TIME_SCALE:
initTimeScale(t);
break;
- case TFM_TIME_EXTEND:
+ case TFM_TIME_EXTEND:
/* now that transdata has been made, do like for TFM_TIME_TRANSLATE (for most Animation
* Editors because they have only 1D transforms for time values) or TFM_TRANSLATION
- * (for Graph Editor only since it uses 'standard' transforms to get 2D movement)
- * depending on which editor this was called from
+ * (for Graph/NLA Editors only since they uses 'standard' transforms to get 2D movement)
+ * depending on which editor this was called from
*/
- if (t->spacetype == SPACE_IPO)
+ if ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)
initTranslation(t);
else
initTimeTranslate(t);
@@ -1376,11 +1509,11 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
if (constraint_axis[2]) {
t->con.mode |= CON_AXIS2;
}
-
- setUserConstraint(t, t->con.mode, "%s");
+
+ setUserConstraint(t, t->con.mode, "%s");
}
}
-
+
return 1;
}
@@ -1399,7 +1532,7 @@ void transformApply(bContext *C, TransInfo *t)
t->redraw = 0;
}
- /* If auto confirm is on, break after one pass */
+ /* If auto confirm is on, break after one pass */
if (t->options & CTX_AUTOCONFIRM)
{
t->state = TRANS_CONFIRM;
@@ -1416,7 +1549,7 @@ void transformApply(bContext *C, TransInfo *t)
int transformEnd(bContext *C, TransInfo *t)
{
int exit_code = OPERATOR_RUNNING_MODAL;
-
+
if (t->state != TRANS_RUNNING)
{
/* handle restoring objects */
@@ -1429,16 +1562,16 @@ int transformEnd(bContext *C, TransInfo *t)
{
exit_code = OPERATOR_FINISHED;
}
-
+
/* free data */
postTrans(t);
-
+
/* aftertrans does insert keyframes, and clears base flags, doesnt read transdata */
special_aftertrans_update(t);
-
+
/* send events out for redraws */
viewRedrawPost(t);
-
+
/* Undo as last, certainly after special_trans_update! */
if(t->state == TRANS_CANCEL) {
@@ -1452,202 +1585,8 @@ int transformEnd(bContext *C, TransInfo *t)
viewRedrawForce(C, t);
}
-
- return exit_code;
-}
-
-/* ************************** Manipulator init and main **************************** */
-
-void initManipulator(int mode)
-{
-#if 0 // TRANSFORM_FIX_ME
- Trans.state = TRANS_RUNNING;
-
- Trans.options = CTX_NONE;
-
- Trans.mode = mode;
-
- /* automatic switch to scaling bone envelopes */
- if(mode==TFM_RESIZE && t->obedit && t->obedit->type==OB_ARMATURE) {
- bArmature *arm= t->obedit->data;
- if(arm->drawtype==ARM_ENVELOPE)
- mode= TFM_BONE_ENVELOPE;
- }
-
- initTrans(&Trans); // internal data, mouse, vectors
-
- G.moving |= G_TRANSFORM_MANIP; // signal to draw manipuls while transform
- createTransData(&Trans); // make TransData structs from selection
-
- if (Trans.total == 0)
- return;
-
- initSnapping(&Trans); // Initialize snapping data AFTER mode flags
-
- /* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */
- /* EVIL2: we gave as argument also texture space context bit... was cleared */
- mode = Trans.mode;
-
- calculatePropRatio(&Trans);
- calculateCenter(&Trans);
-
- switch (mode) {
- case TFM_TRANSLATION:
- initTranslation(&Trans);
- break;
- case TFM_ROTATION:
- initRotation(&Trans);
- break;
- case TFM_RESIZE:
- initResize(&Trans);
- break;
- case TFM_TRACKBALL:
- initTrackball(&Trans);
- break;
- }
-
- Trans.flag |= T_USES_MANIPULATOR;
-#endif
-}
-
-void ManipulatorTransform()
-{
-#if 0 // TRANSFORM_FIX_ME
- int mouse_moved = 0;
- short pmval[2] = {0, 0}, mval[2], val;
- unsigned short event;
-
- if (Trans.total == 0)
- return;
-
- Trans.redraw = 1; /* initial draw */
-
- while (Trans.state == TRANS_RUNNING) {
-
- getmouseco_areawin(mval);
-
- if (mval[0] != pmval[0] || mval[1] != pmval[1]) {
- Trans.redraw = 1;
- }
- if (Trans.redraw) {
- pmval[0] = mval[0];
- pmval[1] = mval[1];
-
- //selectConstraint(&Trans); needed?
- if (Trans.transform) {
- Trans.transform(&Trans, mval);
- }
- Trans.redraw = 0;
- }
-
- /* essential for idling subloop */
- if( qtest()==0) PIL_sleep_ms(2);
-
- while( qtest() ) {
- event= extern_qread(&val);
-
- switch (event){
- case MOUSEX:
- case MOUSEY:
- mouse_moved = 1;
- break;
- /* enforce redraw of transform when modifiers are used */
- case LEFTCTRLKEY:
- case RIGHTCTRLKEY:
- if(val) Trans.redraw = 1;
- break;
- case LEFTSHIFTKEY:
- case RIGHTSHIFTKEY:
- /* shift is modifier for higher resolution transform, works nice to store this mouse position */
- if(val) {
- getmouseco_areawin(Trans.shiftmval);
- Trans.flag |= T_SHIFT_MOD;
- Trans.redraw = 1;
- }
- else Trans.flag &= ~T_SHIFT_MOD;
- break;
-
- case ESCKEY:
- case RIGHTMOUSE:
- Trans.state = TRANS_CANCEL;
- break;
- case LEFTMOUSE:
- if(mouse_moved==0 && val==0) break;
- // else we pass on event to next, which cancels
- case SPACEKEY:
- case PADENTER:
- case RETKEY:
- Trans.state = TRANS_CONFIRM;
- break;
- // case NDOFMOTION:
- // viewmoveNDOF(1);
- // break;
- }
- if(val) {
- switch(event) {
- case PADPLUSKEY:
- if(G.qual & LR_ALTKEY && Trans.flag & T_PROP_EDIT) {
- Trans.propsize*= 1.1f;
- calculatePropRatio(&Trans);
- }
- Trans.redraw= 1;
- break;
- case PAGEUPKEY:
- case WHEELDOWNMOUSE:
- if (Trans.flag & T_AUTOIK) {
- transform_autoik_update(&Trans, 1);
- }
- else if(Trans.flag & T_PROP_EDIT) {
- Trans.propsize*= 1.1f;
- calculatePropRatio(&Trans);
- }
- else view_editmove(event);
- Trans.redraw= 1;
- break;
- case PADMINUS:
- if(G.qual & LR_ALTKEY && Trans.flag & T_PROP_EDIT) {
- Trans.propsize*= 0.90909090f;
- calculatePropRatio(&Trans);
- }
- Trans.redraw= 1;
- break;
- case PAGEDOWNKEY:
- case WHEELUPMOUSE:
- if (Trans.flag & T_AUTOIK) {
- transform_autoik_update(&Trans, -1);
- }
- else if (Trans.flag & T_PROP_EDIT) {
- Trans.propsize*= 0.90909090f;
- calculatePropRatio(&Trans);
- }
- else view_editmove(event);
- Trans.redraw= 1;
- break;
- }
-
- // Numerical input events
- Trans.redraw |= handleNumInput(&(Trans.num), event);
- }
- }
- }
-
- if(Trans.state == TRANS_CANCEL) {
- restoreTransObjects(&Trans);
- }
-
- /* free data, reset vars */
- postTrans(&Trans);
-
- /* aftertrans does insert ipos and action channels, and clears base flags */
- special_aftertrans_update(&Trans);
-
- /* send events out for redraws */
- viewRedrawPost(&Trans);
- if(Trans.state != TRANS_CANCEL) {
- BIF_undo_push(transform_to_undostr(&Trans));
- }
-#endif
+ return exit_code;
}
/* ************************** TRANSFORM LOCKS **************************** */
@@ -1682,28 +1621,88 @@ static void protectedRotateBits(short protectflag, float *eul, float *oldeul)
eul[2]= oldeul[2];
}
+
+/* this function only does the delta rotation */
+/* axis-angle is usually internally stored as quats... */
+static void protectedAxisAngleBits(short protectflag, float *quat, float *oldquat)
+{
+ /* check that protection flags are set */
+ if ((protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) == 0)
+ return;
+
+ if (protectflag & OB_LOCK_ROT4D) {
+ /* axis-angle getting limited as 4D entities that they are... */
+ if (protectflag & OB_LOCK_ROTW)
+ quat[0]= oldquat[0];
+ if (protectflag & OB_LOCK_ROTX)
+ quat[1]= oldquat[1];
+ if (protectflag & OB_LOCK_ROTY)
+ quat[2]= oldquat[2];
+ if (protectflag & OB_LOCK_ROTZ)
+ quat[3]= oldquat[3];
+ }
+ else {
+ /* axis-angle get limited with euler... */
+ float eul[3], oldeul[3], quat1[4];
+
+ QUATCOPY(quat1, quat);
+ AxisAngleToEulO(quat+1, quat[0], eul, EULER_ORDER_DEFAULT);
+ AxisAngleToEulO(oldquat+1, oldquat[0], oldeul, EULER_ORDER_DEFAULT);
+
+ 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];
+
+ EulOToAxisAngle(eul, EULER_ORDER_DEFAULT, quat+1, quat);
+
+ /* when converting to axis-angle, we need a special exception for the case when there is no axis */
+ if (IS_EQ(quat[1], quat[2]) && IS_EQ(quat[2], quat[3])) {
+ /* for now, rotate around y-axis then (so that it simply becomes the roll) */
+ quat[2]= 1.0f;
+ }
+ }
+}
+
+/* this function only does the delta rotation */
static void protectedQuaternionBits(short protectflag, float *quat, float *oldquat)
{
- /* quaternions get limited with euler... */
- /* this function only does the delta rotation */
+ /* check that protection flags are set */
+ if ((protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) == 0)
+ return;
- if(protectflag) {
+ if (protectflag & OB_LOCK_ROT4D) {
+ /* quaternions getting limited as 4D entities that they are... */
+ if (protectflag & OB_LOCK_ROTW)
+ quat[0]= oldquat[0];
+ if (protectflag & OB_LOCK_ROTX)
+ quat[1]= oldquat[1];
+ if (protectflag & OB_LOCK_ROTY)
+ quat[2]= oldquat[2];
+ if (protectflag & OB_LOCK_ROTZ)
+ quat[3]= oldquat[3];
+ }
+ else {
+ /* quaternions get limited with euler... (compatability mode) */
float eul[3], oldeul[3], quat1[4];
QUATCOPY(quat1, quat);
QuatToEul(quat, eul);
QuatToEul(oldquat, oldeul);
- if(protectflag & OB_LOCK_ROTX)
+ if (protectflag & OB_LOCK_ROTX)
eul[0]= oldeul[0];
- if(protectflag & OB_LOCK_ROTY)
+ if (protectflag & OB_LOCK_ROTY)
eul[1]= oldeul[1];
- if(protectflag & OB_LOCK_ROTZ)
+ if (protectflag & OB_LOCK_ROTZ)
eul[2]= oldeul[2];
EulToQuat(eul, quat);
+
/* 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 ( (quat1[0]<0.0f && quat[0]>0.0f) || (quat1[0]>0.0f && quat[0]<0.0f) ) {
QuatMulf(quat, -1.0f);
}
}
@@ -1717,8 +1716,8 @@ static void constraintTransLim(TransInfo *t, TransData *td)
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
bConstraintOb cob;
bConstraint *con;
-
- /* Make a temporary bConstraintOb for using these limit constraints
+
+ /* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
@@ -1733,22 +1732,22 @@ static void constraintTransLim(TransInfo *t, TransData *td)
else {
VECCOPY(cob.matrix[3], td->loc);
}
-
+
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
float tmat[4][4];
-
+
/* only consider constraint if enabled */
if (con->flag & CONSTRAINT_DISABLE) continue;
if (con->enforce == 0.0f) continue;
-
+
/* only use it if it's tagged for this purpose (and the right type) */
if (con->type == CONSTRAINT_TYPE_LOCLIMIT) {
bLocLimitConstraint *data= con->data;
-
- if ((data->flag2 & LIMIT_TRANSFORM)==0)
+
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
continue;
-
+
/* do space conversions */
if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
/* just multiply by td->mtx (this should be ok) */
@@ -1759,10 +1758,10 @@ static void constraintTransLim(TransInfo *t, TransData *td)
/* skip... incompatable spacetype */
continue;
}
-
+
/* do constraint */
cti->evaluate_constraint(con, &cob, NULL);
-
+
/* convert spaces again */
if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
/* just multiply by td->mtx (this should be ok) */
@@ -1771,7 +1770,7 @@ static void constraintTransLim(TransInfo *t, TransData *td)
}
}
}
-
+
/* copy results from cob->matrix */
if (td->tdi) {
TransDataIpokey *tdi= td->tdi;
@@ -1791,8 +1790,8 @@ static void constraintRotLim(TransInfo *t, TransData *td)
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT);
bConstraintOb cob;
bConstraint *con;
-
- /* Make a temporary bConstraintOb for using these limit constraints
+
+ /* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
@@ -1804,7 +1803,7 @@ static void constraintRotLim(TransInfo *t, TransData *td)
else
return;
}
- else if (td->tdi) {
+ else if (td->tdi) { // XXX depreceated
/* ipo-keys eulers */
TransDataIpokey *tdi= td->tdi;
float eul[3];
@@ -1813,16 +1812,23 @@ static void constraintRotLim(TransInfo *t, TransData *td)
eul[1]= tdi->roty[0];
eul[2]= tdi->rotz[0];
- EulToMat4(eul, cob.matrix);
+ EulOToMat4(eul, td->rotOrder, cob.matrix);
+ }
+ else if (td->rotOrder == PCHAN_ROT_AXISANGLE) {
+ /* axis angle */
+ if (td->ext)
+ AxisAngleToMat4(&td->ext->quat[1], td->ext->quat[0], cob.matrix);
+ else
+ return;
}
else {
/* eulers */
if (td->ext)
- EulToMat4(td->ext->rot, cob.matrix);
+ EulOToMat4(td->ext->rot, td->rotOrder, cob.matrix);
else
return;
}
-
+
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
/* only consider constraint if enabled */
@@ -1835,9 +1841,9 @@ static void constraintRotLim(TransInfo *t, TransData *td)
float tmat[4][4];
/* only use it if it's tagged for this purpose */
- if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
continue;
-
+
/* do space conversions */
if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
/* just multiply by td->mtx (this should be ok) */
@@ -1871,15 +1877,19 @@ static void constraintRotLim(TransInfo *t, TransData *td)
TransDataIpokey *tdi= td->tdi;
float eul[3];
- Mat4ToEul(cob.matrix, eul);
+ Mat4ToEulO(cob.matrix, eul, td->rotOrder);
tdi->rotx[0]= eul[0];
tdi->roty[0]= eul[1];
tdi->rotz[0]= eul[2];
}
+ else if (td->rotOrder == PCHAN_ROT_AXISANGLE) {
+ /* axis angle */
+ Mat4ToAxisAngle(cob.matrix, &td->ext->quat[1], &td->ext->quat[0]);
+ }
else {
/* eulers */
- Mat4ToEul(cob.matrix, td->ext->rot);
+ Mat4ToEulO(cob.matrix, td->ext->rot, td->rotOrder);
}
}
}
@@ -1890,8 +1900,8 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
bConstraintOb cob;
bConstraint *con;
-
- /* Make a temporary bConstraintOb for using these limit constraints
+
+ /* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
@@ -1899,12 +1909,12 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
if (td->tdi) {
TransDataIpokey *tdi= td->tdi;
float size[3];
-
+
size[0]= tdi->sizex[0];
size[1]= tdi->sizey[0];
size[2]= tdi->sizez[0];
SizeToMat4(size, cob.matrix);
- }
+ }
else if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
/* scale val and reset size */
return; // TODO: fix this case
@@ -1913,25 +1923,25 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* Reset val if SINGLESIZE but using a constraint */
if (td->flag & TD_SINGLESIZE)
return;
-
+
SizeToMat4(td->ext->size, cob.matrix);
}
-
+
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
/* only consider constraint if enabled */
if (con->flag & CONSTRAINT_DISABLE) continue;
if (con->enforce == 0.0f) continue;
-
+
/* we're only interested in Limit-Scale constraints */
if (con->type == CONSTRAINT_TYPE_SIZELIMIT) {
bSizeLimitConstraint *data= con->data;
float tmat[4][4];
-
+
/* only use it if it's tagged for this purpose */
- if ((data->flag2 & LIMIT_TRANSFORM)==0)
+ if ((data->flag2 & LIMIT_TRANSFORM)==0)
continue;
-
+
/* do space conversions */
if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
/* just multiply by td->mtx (this should be ok) */
@@ -1942,10 +1952,10 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* skip... incompatable spacetype */
continue;
}
-
+
/* do constraint */
cti->evaluate_constraint(con, &cob, NULL);
-
+
/* convert spaces again */
if (con->ownspace == CONSTRAINT_SPACE_WORLD) {
/* just multiply by td->mtx (this should be ok) */
@@ -1954,18 +1964,18 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
}
}
}
-
+
/* copy results from cob->matrix */
if (td->tdi) {
TransDataIpokey *tdi= td->tdi;
float size[3];
-
+
Mat4ToSize(cob.matrix, size);
-
+
tdi->sizex[0]= size[0];
tdi->sizey[0]= size[1];
tdi->sizez[0]= size[2];
- }
+ }
else if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
/* scale val and reset size */
return; // TODO: fix this case
@@ -1974,7 +1984,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* Reset val if SINGLESIZE but using a constraint */
if (td->flag & TD_SINGLESIZE)
return;
-
+
Mat4ToSize(cob.matrix, td->ext->size);
}
}
@@ -1982,15 +1992,15 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* ************************** WARP *************************** */
-void initWarp(TransInfo *t)
+void initWarp(TransInfo *t)
{
float max[3], min[3];
int i;
-
+
t->mode = TFM_WARP;
t->transform = Warp;
t->handleEvent = handleEventWarp;
-
+
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->idx_max = 0;
@@ -1998,9 +2008,9 @@ void initWarp(TransInfo *t)
t->snap[0] = 0.0f;
t->snap[1] = 5.0f;
t->snap[2] = 1.0f;
-
+
t->flag |= T_NO_CONSTRAINT;
-
+
/* we need min/max in view space */
for(i = 0; i < t->total; i++) {
float center[3];
@@ -2015,11 +2025,11 @@ void initWarp(TransInfo *t)
VECCOPY(min, center);
}
}
-
+
t->center[0]= (min[0]+max[0])/2.0f;
t->center[1]= (min[1]+max[1])/2.0f;
t->center[2]= (min[2]+max[2])/2.0f;
-
+
if (max[0] == min[0]) max[0] += 0.1; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
t->val= (max[0]-min[0])/2.0f; /* t->val is X dimension projected boundbox */
}
@@ -2027,18 +2037,18 @@ void initWarp(TransInfo *t)
int handleEventWarp(TransInfo *t, wmEvent *event)
{
int status = 0;
-
- if (event->type == MIDDLEMOUSE && event->val)
+
+ if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
{
// Use customData pointer to signal warp direction
if (t->customData == 0)
t->customData = (void*)1;
else
t->customData = 0;
-
+
status = 1;
}
-
+
return status;
}
@@ -2048,7 +2058,7 @@ int Warp(TransInfo *t, short mval[2])
float vec[3], circumfac, dist, phi0, co, si, *curs, cursor[3], gcursor[3];
int i;
char str[50];
-
+
curs= give_cursor(t->scene, t->view);
/*
* gcursor is the one used for helpline.
@@ -2061,7 +2071,7 @@ int Warp(TransInfo *t, short mval[2])
* into account if in Edit mode.
*/
VECCOPY(cursor, curs);
- VECCOPY(gcursor, cursor);
+ VECCOPY(gcursor, cursor);
if (t->flag & T_EDIT) {
VecSubf(cursor, cursor, t->obedit->obmat[3]);
VecSubf(gcursor, gcursor, t->obedit->obmat[3]);
@@ -2072,7 +2082,7 @@ int Warp(TransInfo *t, short mval[2])
/* amount of degrees for warp */
circumfac = 360.0f * t->values[0];
-
+
if (t->customData) /* non-null value indicates reversed input */
{
circumfac *= -1;
@@ -2080,22 +2090,22 @@ int Warp(TransInfo *t, short mval[2])
snapGrid(t, &circumfac);
applyNumInput(&t->num, &circumfac);
-
+
/* header print for NumInput */
if (hasNumInput(&t->num)) {
char c[20];
-
+
outputNumInput(&(t->num), c);
-
+
sprintf(str, "Warp: %s", c);
}
else {
/* default header print */
sprintf(str, "Warp: %.3f", circumfac);
}
-
+
circumfac*= (float)(-M_PI/360.0);
-
+
for(i = 0; i < t->total; i++, td++) {
float loc[3];
if (td->flag & TD_NOACTION)
@@ -2103,66 +2113,66 @@ int Warp(TransInfo *t, short mval[2])
if (td->flag & TD_SKIP)
continue;
-
+
/* translate point to center, rotate in such a way that outline==distance */
VECCOPY(vec, td->iloc);
Mat3MulVecfl(td->mtx, vec);
Mat4MulVecfl(t->viewmat, vec);
VecSubf(vec, vec, t->viewmat[3]);
-
+
dist= vec[0]-cursor[0];
-
+
/* t->val is X dimension projected boundbox */
- phi0= (circumfac*dist/t->val);
-
+ phi0= (circumfac*dist/t->val);
+
vec[1]= (vec[1]-cursor[1]);
-
+
co= (float)cos(phi0);
si= (float)sin(phi0);
loc[0]= -si*vec[1]+cursor[0];
loc[1]= co*vec[1]+cursor[1];
loc[2]= vec[2];
-
+
Mat4MulVecfl(t->viewinv, loc);
VecSubf(loc, loc, t->viewinv[3]);
Mat3MulVecfl(td->smtx, loc);
-
+
VecSubf(loc, loc, td->iloc);
VecMulf(loc, td->factor);
VecAddf(td->loc, td->iloc, loc);
}
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
-
+
return 1;
}
/* ************************** SHEAR *************************** */
-void initShear(TransInfo *t)
+void initShear(TransInfo *t)
{
t->mode = TFM_SHEAR;
t->transform = Shear;
t->handleEvent = handleEventShear;
-
+
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
int handleEventShear(TransInfo *t, wmEvent *event)
{
int status = 0;
-
- if (event->type == MIDDLEMOUSE && event->val)
+
+ if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
{
// Use customData pointer to signal Shear direction
if (t->customData == 0)
@@ -2175,15 +2185,15 @@ int handleEventShear(TransInfo *t, wmEvent *event)
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
t->customData = 0;
}
-
+
status = 1;
}
-
+
return status;
}
-int Shear(TransInfo *t, short mval[2])
+int Shear(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float vec[3];
@@ -2213,18 +2223,18 @@ int Shear(TransInfo *t, short mval[2])
/* default header print */
sprintf(str, "Shear: %.3f %s", value, t->proptext);
}
-
+
Mat3One(smat);
-
+
// Custom data signals shear direction
if (t->customData == 0)
smat[1][0] = value;
else
smat[0][1] = value;
-
+
Mat3MulMat3(tmat, smat, persmat);
Mat3MulMat3(totmat, persinv, tmat);
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -2261,13 +2271,13 @@ int Shear(TransInfo *t, short mval[2])
/* ************************** RESIZE *************************** */
-void initResize(TransInfo *t)
+void initResize(TransInfo *t)
{
t->mode = TFM_RESIZE;
t->transform = Resize;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
-
+
t->flag |= T_NULL_ONE;
t->num.flag |= NUM_NULL_ONE;
t->num.flag |= NUM_AFFECT_ALL;
@@ -2275,7 +2285,7 @@ void initResize(TransInfo *t)
t->flag |= T_NO_ZERO;
t->num.flag |= NUM_NO_ZERO;
}
-
+
t->idx_max = 2;
t->num.idx_max = 2;
t->snap[0] = 0.0f;
@@ -2321,18 +2331,18 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
static void TransMat3ToSize( float mat[][3], float smat[][3], float *size)
{
float vec[3];
-
+
VecCopyf(vec, mat[0]);
size[0]= Normalize(vec);
VecCopyf(vec, mat[1]);
size[1]= Normalize(vec);
VecCopyf(vec, mat[2]);
size[2]= Normalize(vec);
-
+
/* first tried with dotproduct... but the sign flip is crucial */
- if( VECSIGNFLIP(mat[0], smat[0]) ) size[0]= -size[0];
- if( VECSIGNFLIP(mat[1], smat[1]) ) size[1]= -size[1];
- if( VECSIGNFLIP(mat[2], smat[2]) ) size[2]= -size[2];
+ if( VECSIGNFLIP(mat[0], smat[0]) ) size[0]= -size[0];
+ if( VECSIGNFLIP(mat[1], smat[1]) ) size[1]= -size[1];
+ if( VECSIGNFLIP(mat[2], smat[2]) ) size[2]= -size[2];
}
@@ -2358,7 +2368,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
VECCOPY(center, td->center);
}
else if (t->flag & T_EDIT) {
-
+
if(t->around==V3D_LOCAL && (t->settings->selectmode & SCE_SELECT_FACE)) {
VECCOPY(center, td->center);
}
@@ -2376,7 +2386,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
if (td->ext) {
float fsize[3];
-
+
if (t->flag & (T_OBJECT|T_TEXTURE|T_POSE)) {
float obsizemat[3][3];
// Reorient the size mat to fit the oriented object.
@@ -2388,28 +2398,28 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
else {
Mat3ToSize(tmat, fsize);
}
-
+
protectedSizeBits(td->protectflag, fsize);
-
+
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't resize objects itself
/* handle ipokeys? */
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
/* calculate delta size (equal for size and dsize) */
-
+
vec[0]= (tdi->oldsize[0])*(fsize[0] -1.0f) * td->factor;
vec[1]= (tdi->oldsize[1])*(fsize[1] -1.0f) * td->factor;
vec[2]= (tdi->oldsize[2])*(fsize[2] -1.0f) * td->factor;
-
+
add_tdi_poin(tdi->sizex, tdi->oldsize, vec[0]);
add_tdi_poin(tdi->sizey, tdi->oldsize+1, vec[1]);
add_tdi_poin(tdi->sizez, tdi->oldsize+2, vec[2]);
-
- }
+
+ }
else if((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)){
/* scale val and reset size */
*td->val = td->ival * fsize[0] * td->factor;
-
+
td->ext->size[0] = td->ext->isize[0];
td->ext->size[1] = td->ext->isize[1];
td->ext->size[2] = td->ext->isize[2];
@@ -2418,16 +2428,16 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
/* Reset val if SINGLESIZE but using a constraint */
if (td->flag & TD_SINGLESIZE)
*td->val = td->ival;
-
+
td->ext->size[0] = td->ext->isize[0] * (fsize[0]) * td->factor;
td->ext->size[1] = td->ext->isize[1] * (fsize[1]) * td->factor;
td->ext->size[2] = td->ext->isize[2] * (fsize[2]) * td->factor;
}
}
-
+
constraintSizeLim(t, td);
}
-
+
/* For individual element center, Editmode need to use iloc */
if (t->flag & T_POINTS)
VecSubf(vec, td->iloc, center);
@@ -2457,11 +2467,11 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, vec[2]);
}
else VecAddf(td->loc, td->iloc, vec);
-
+
constraintTransLim(t, td);
}
-int Resize(TransInfo *t, short mval[2])
+int Resize(TransInfo *t, short mval[2])
{
TransData *td;
float size[3], mat[3][3];
@@ -2478,7 +2488,7 @@ int Resize(TransInfo *t, short mval[2])
{
ratio = t->values[0];
}
-
+
size[0] = size[1] = size[2] = ratio;
snapGrid(t, size);
@@ -2504,7 +2514,7 @@ int Resize(TransInfo *t, short mval[2])
}
Mat3CpyMat3(t->mat, mat); // used in manipulator
-
+
headerResize(t, size, str);
for(i = 0, td=t->data; i < t->total; i++, td++) {
@@ -2513,7 +2523,7 @@ int Resize(TransInfo *t, short mval[2])
if (td->flag & TD_SKIP)
continue;
-
+
ElementResize(t, td, mat);
}
@@ -2537,14 +2547,14 @@ int Resize(TransInfo *t, short mval[2])
/* ************************** TOSPHERE *************************** */
-void initToSphere(TransInfo *t)
+void initToSphere(TransInfo *t)
{
TransData *td = t->data;
int i;
t->mode = TFM_TOSPHERE;
t->transform = ToSphere;
-
+
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_RATIO);
t->idx_max = 0;
@@ -2552,10 +2562,10 @@ void initToSphere(TransInfo *t)
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->num.flag |= NUM_NULL_ONE | NUM_NO_NEGATIVE;
t->flag |= T_NO_CONSTRAINT;
-
+
// Calculate average radius
for(i = 0 ; i < t->total; i++, td++) {
t->val += VecLenf(t->center, td->iloc);
@@ -2564,7 +2574,7 @@ void initToSphere(TransInfo *t)
t->val /= (float)t->total;
}
-int ToSphere(TransInfo *t, short mval[2])
+int ToSphere(TransInfo *t, short mval[2])
{
float vec[3];
float ratio, radius;
@@ -2595,8 +2605,8 @@ int ToSphere(TransInfo *t, short mval[2])
/* default header print */
sprintf(str, "To Sphere: %.4f %s", ratio, t->proptext);
}
-
-
+
+
for(i = 0 ; i < t->total; i++, td++) {
float tratio;
if (td->flag & TD_NOACTION)
@@ -2615,7 +2625,7 @@ int ToSphere(TransInfo *t, short mval[2])
VecAddf(td->loc, t->center, vec);
}
-
+
recalcData(t);
@@ -2627,23 +2637,23 @@ int ToSphere(TransInfo *t, short mval[2])
/* ************************** ROTATION *************************** */
-void initRotation(TransInfo *t)
+void initRotation(TransInfo *t)
{
t->mode = TFM_ROTATION;
t->transform = Rotation;
-
+
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
-
+
t->ndof.axis = 16;
/* Scale down and flip input for rotation */
t->ndof.factor[0] = -0.2f;
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
-
+
if (t->flag & T_2D_EDIT)
t->flag |= T_NO_CONSTRAINT;
}
@@ -2652,7 +2662,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
float vec[3], totmat[3][3], smat[3][3];
float eul[3], fmat[3][3], quat[4];
float *center = t->center;
-
+
/* local constraint shouldn't alter center */
if (around == V3D_LOCAL) {
if (t->flag & (T_OBJECT|T_POSE)) {
@@ -2665,14 +2675,14 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
}
}
}
-
+
if (t->flag & T_POINTS) {
Mat3MulMat3(totmat, mat, td->mtx);
Mat3MulMat3(smat, td->smtx, totmat);
-
+
VecSubf(vec, td->iloc, center);
Mat3MulVecfl(smat, vec);
-
+
VecAddf(td->loc, vec, center);
VecSubf(vec,td->loc,td->iloc);
@@ -2682,10 +2692,10 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
if(td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
Mat3ToQuat(fmat, quat); // Actual transform
-
+
if(td->ext->quat){
QuatMul(td->ext->quat, quat, td->ext->iquat);
-
+
/* is there a reason not to have this here? -jahka */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
@@ -2693,11 +2703,11 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
}
/**
* HACK WARNING
- *
+ *
* This is some VERY ugly special case to deal with pose mode.
- *
+ *
* The problem is that mtx and smtx include each bone orientation.
- *
+ *
* That is needed to rotate each bone properly, HOWEVER, to calculate
* the translation component, we only need the actual armature object's
* matrix (and inverse). That is not all though. Once the proper translation
@@ -2706,46 +2716,66 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
else if (t->flag & T_POSE) {
float pmtx[3][3], imtx[3][3];
- // Extract and invert armature object matrix
+ // Extract and invert armature object matrix
Mat3CpyMat4(pmtx, t->poseobj->obmat);
Mat3Inv(imtx, pmtx);
-
+
if ((td->flag & TD_NO_LOC) == 0)
{
VecSubf(vec, td->center, center);
-
+
Mat3MulVecfl(pmtx, vec); // To Global space
Mat3MulVecfl(mat, vec); // Applying rotation
Mat3MulVecfl(imtx, vec); // To Local space
-
+
VecAddf(vec, vec, center);
/* vec now is the location where the object has to be */
-
+
VecSubf(vec, vec, td->center); // Translation needed from the initial location
-
+
Mat3MulVecfl(pmtx, vec); // To Global space
Mat3MulVecfl(td->smtx, vec);// To Pose space
-
+
protectedTransBits(td->protectflag, vec);
-
+
VecAddf(td->loc, td->iloc, vec);
-
+
constraintTransLim(t, td);
}
-
+
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
- /* euler or quaternion? */
+ /* euler or quaternion/axis-angle? */
if (td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
-
+
Mat3ToQuat(fmat, quat); // Actual transform
-
+
QuatMul(td->ext->quat, quat, td->ext->iquat);
/* this function works on end result */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
+
}
- else {
+ else if (td->rotOrder == PCHAN_ROT_AXISANGLE) {
+ /* calculate effect based on quats */
+ float iquat[4];
+
+ /* td->ext->(i)quat is in axis-angle form, not quats! */
+ AxisAngleToQuat(iquat, &td->ext->iquat[1], td->ext->iquat[0]);
+
+ Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ Mat3ToQuat(fmat, quat); // Actual transform
+
+ QuatMul(td->ext->quat, quat, iquat);
+
+ /* make temp copy (since stored in same place) */
+ QUATCOPY(quat, td->ext->quat); // this is just a 4d vector copying macro
+ QuatToAxisAngle(quat, &td->ext->quat[1], &td->ext->quat[0]);
+
+ /* this function works on end result */
+ protectedAxisAngleBits(td->protectflag, td->ext->quat, td->ext->iquat);
+ }
+ else {
float eulmat[3][3];
Mat3MulMat3(totmat, mat, td->mtx);
@@ -2753,12 +2783,12 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* calculate the total rotatation in eulers */
VECCOPY(eul, td->ext->irot);
- EulToMat3(eul, eulmat);
+ EulOToMat3(eul, td->rotOrder, eulmat);
/* mat = transform, obmat = bone rotation */
Mat3MulMat3(fmat, smat, eulmat);
- Mat3ToCompatibleEul(fmat, eul, td->ext->rot);
+ Mat3ToCompatibleEulO(fmat, eul, td->ext->rot, td->rotOrder);
/* and apply (to end result only) */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
@@ -2778,9 +2808,9 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* vec now is the location where the object has to be */
VecSubf(vec, vec, td->center);
Mat3MulVecfl(td->smtx, vec);
-
+
protectedTransBits(td->protectflag, vec);
-
+
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
add_tdi_poin(tdi->locx, tdi->oldloc, vec[0]);
@@ -2789,8 +2819,8 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
}
else VecAddf(td->loc, td->iloc, vec);
}
-
-
+
+
constraintTransLim(t, td);
/* rotation */
@@ -2799,34 +2829,34 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
if (td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
Mat3ToQuat(fmat, quat); // Actual transform
-
+
QuatMul(td->ext->quat, quat, td->ext->iquat);
/* this function works on end result */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
else {
float obmat[3][3];
-
+
/* are there ipo keys? */
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
float current_rot[3];
float rot[3];
-
+
/* current IPO value for compatible euler */
current_rot[0] = (tdi->rotx) ? tdi->rotx[0] : 0.0f;
current_rot[1] = (tdi->roty) ? tdi->roty[0] : 0.0f;
current_rot[2] = (tdi->rotz) ? tdi->rotz[0] : 0.0f;
VecMulf(current_rot, (float)(M_PI_2 / 9.0));
-
+
/* calculate the total rotatation in eulers */
VecAddf(eul, td->ext->irot, td->ext->drot);
EulToMat3(eul, obmat);
/* mat = transform, obmat = object rotation */
Mat3MulMat3(fmat, mat, obmat);
-
+
Mat3ToCompatibleEul(fmat, eul, current_rot);
-
+
/* correct back for delta rot */
if(tdi->flag & TOB_IPODROT) {
VecSubf(rot, eul, td->ext->irot);
@@ -2834,12 +2864,12 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
else {
VecSubf(rot, eul, td->ext->drot);
}
-
+
VecMulf(rot, (float)(9.0/M_PI_2));
VecSubf(rot, rot, tdi->oldrot);
-
+
protectedRotateBits(td->protectflag, rot, tdi->oldrot);
-
+
add_tdi_poin(tdi->rotx, tdi->oldrot, rot[0]);
add_tdi_poin(tdi->roty, tdi->oldrot+1, rot[1]);
add_tdi_poin(tdi->rotz, tdi->oldrot+2, rot[2]);
@@ -2847,37 +2877,37 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
else {
Mat3MulMat3(totmat, mat, td->mtx);
Mat3MulMat3(smat, td->smtx, totmat);
-
+
/* calculate the total rotatation in eulers */
VecAddf(eul, td->ext->irot, td->ext->drot); /* we have to correct for delta rot */
EulToMat3(eul, obmat);
/* mat = transform, obmat = object rotation */
Mat3MulMat3(fmat, smat, obmat);
-
+
Mat3ToCompatibleEul(fmat, eul, td->ext->rot);
-
+
/* correct back for delta rot */
VecSubf(eul, eul, td->ext->drot);
-
+
/* and apply */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
VECCOPY(td->ext->rot, eul);
}
}
-
+
constraintRotLim(t, td);
}
}
}
-static void applyRotation(TransInfo *t, float angle, float axis[3])
+static void applyRotation(TransInfo *t, float angle, float axis[3])
{
TransData *td = t->data;
float mat[3][3];
int i;
VecRotToMat3(axis, angle, mat);
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
@@ -2885,7 +2915,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
if (td->flag & TD_SKIP)
continue;
-
+
if (t->con.applyRot) {
t->con.applyRot(t, td, axis, NULL);
VecRotToMat3(axis, angle * td->factor, mat);
@@ -2898,7 +2928,7 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
}
}
-int Rotation(TransInfo *t, short mval[2])
+int Rotation(TransInfo *t, short mval[2])
{
char str[64];
@@ -2914,13 +2944,13 @@ int Rotation(TransInfo *t, short mval[2])
final = t->values[0];
applyNDofInput(&t->ndof, &final);
-
+
snapGrid(t, &final);
if (t->con.applyRot) {
t->con.applyRot(t, NULL, axis, &final);
}
-
+
applySnapping(t, &final);
if (hasNumInput(&t->num)) {
@@ -2935,7 +2965,7 @@ int Rotation(TransInfo *t, short mval[2])
/* Clamp between -180 and 180 */
while (final >= 180.0)
final -= 360.0;
-
+
while (final <= -180.0)
final += 360.0;
@@ -2950,9 +2980,9 @@ int Rotation(TransInfo *t, short mval[2])
// TRANSFORM_FIX_ME
// t->values[0] = final; // used in manipulator
// Mat3CpyMat3(t->mat, mat); // used in manipulator
-
+
applyRotation(t, final, axis);
-
+
recalcData(t);
ED_area_headerprint(t->sa, str);
@@ -2963,13 +2993,13 @@ int Rotation(TransInfo *t, short mval[2])
/* ************************** TRACKBALL *************************** */
-void initTrackball(TransInfo *t)
+void initTrackball(TransInfo *t)
{
t->mode = TFM_TRACKBALL;
t->transform = Trackball;
-
+
initMouseInputMode(t, &t->mouse, INPUT_TRACKBALL);
-
+
t->ndof.axis = 40;
/* Scale down input for rotation */
t->ndof.factor[0] = 0.2f;
@@ -2980,7 +3010,7 @@ void initTrackball(TransInfo *t)
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
@@ -2992,7 +3022,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
VecRotToMat3(axis1, angles[0], smat);
VecRotToMat3(axis2, angles[1], totmat);
-
+
Mat3MulMat3(mat, smat, totmat);
for(i = 0 ; i < t->total; i++, td++) {
@@ -3001,46 +3031,46 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
if (td->flag & TD_SKIP)
continue;
-
+
if (t->flag & T_PROP_EDIT) {
VecRotToMat3(axis1, td->factor * angles[0], smat);
VecRotToMat3(axis2, td->factor * angles[1], totmat);
-
+
Mat3MulMat3(mat, smat, totmat);
}
-
+
ElementRotation(t, td, mat, t->around);
}
}
-int Trackball(TransInfo *t, short mval[2])
+int Trackball(TransInfo *t, short mval[2])
{
char str[128];
float axis1[3], axis2[3];
float mat[3][3], totmat[3][3], smat[3][3];
float phi[2];
-
+
VECCOPY(axis1, t->persinv[0]);
VECCOPY(axis2, t->persinv[1]);
Normalize(axis1);
Normalize(axis2);
-
+
phi[0] = t->values[0];
phi[1] = t->values[1];
-
+
applyNDofInput(&t->ndof, phi);
-
+
snapGrid(t, phi);
-
+
if (hasNumInput(&t->num)) {
char c[40];
-
+
applyNumInput(&t->num, phi);
-
+
outputNumInput(&(t->num), c);
-
+
sprintf(str, "Trackball: %s %s %s", &c[0], &c[20], t->proptext);
-
+
phi[0] *= (float)(M_PI / 180.0);
phi[1] *= (float)(M_PI / 180.0);
}
@@ -3050,34 +3080,34 @@ int Trackball(TransInfo *t, short mval[2])
VecRotToMat3(axis1, phi[0], smat);
VecRotToMat3(axis2, phi[1], totmat);
-
+
Mat3MulMat3(mat, smat, totmat);
-
+
// TRANSFORM_FIX_ME
//Mat3CpyMat3(t->mat, mat); // used in manipulator
-
+
applyTrackball(t, axis1, axis2, phi);
-
+
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
-
+
return 1;
}
/* ************************** TRANSLATION *************************** */
-
-void initTranslation(TransInfo *t)
+
+void initTranslation(TransInfo *t)
{
t->mode = TFM_TRANSLATION;
t->transform = Translation;
-
+
initMouseInputMode(t, &t->mouse, INPUT_VECTOR);
t->idx_max = (t->flag & T_2D_EDIT)? 1: 2;
t->num.flag = 0;
t->num.idx_max = t->idx_max;
-
+
t->ndof.axis = (t->flag & T_2D_EDIT)? 1|2: 1|2|4;
if(t->spacetype == SPACE_VIEW3D) {
@@ -3103,7 +3133,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
char distvec[20];
char autoik[20];
float dist;
-
+
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
dist = VecLength(t->num.val);
@@ -3115,19 +3145,29 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
applyAspectRatio(t, dvec);
dist = VecLength(vec);
- sprintf(&tvec[0], "%.4f", dvec[0]);
- sprintf(&tvec[20], "%.4f", dvec[1]);
- sprintf(&tvec[40], "%.4f", dvec[2]);
+ if(t->scene->unit.system) {
+ int i, do_split= t->scene->unit.flag & USER_UNIT_OPT_SPLIT ? 1:0;
+
+ for(i=0; i<3; i++)
+ bUnit_AsString(&tvec[i*20], 20, dvec[i]*t->scene->unit.scale_length, 4, t->scene->unit.system, B_UNIT_LENGTH, do_split, 1);
+ }
+ else {
+ sprintf(&tvec[0], "%.4f", dvec[0]);
+ sprintf(&tvec[20], "%.4f", dvec[1]);
+ sprintf(&tvec[40], "%.4f", dvec[2]);
+ }
}
- if( dist > 1e10 || dist < -1e10 ) /* prevent string buffer overflow */
+ if(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);
else
sprintf(distvec, "%.4f", dist);
-
+
if(t->flag & T_AUTOIK) {
short chainlen= t->settings->autoik_chainlen;
-
+
if(chainlen)
sprintf(autoik, "AutoIK-Len: %d", chainlen);
else
@@ -3164,10 +3204,10 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
-
+
if (td->flag & TD_SKIP)
continue;
-
+
/* handle snapping rotation before doing the translation */
if (usingSnappingNormal(t))
{
@@ -3178,22 +3218,22 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
float quat[4];
float mat[3][3];
float angle;
-
+
Crossf(axis, original_normal, t->tsnap.snapNormal);
angle = saacos(Inpf(original_normal, t->tsnap.snapNormal));
-
+
AxisAngleToQuat(quat, axis, angle);
-
+
QuatToMat3(quat, mat);
-
+
ElementRotation(t, td, mat, V3D_LOCAL);
}
else
{
float mat[3][3];
-
+
Mat3One(mat);
-
+
ElementRotation(t, td, mat, V3D_LOCAL);
}
}
@@ -3205,12 +3245,12 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
else {
VECCOPY(tvec, vec);
}
-
+
Mat3MulVecfl(td->smtx, tvec);
VecMulf(tvec, td->factor);
-
+
protectedTransBits(td->protectflag, tvec);
-
+
/* transdata ipokey */
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
@@ -3219,17 +3259,17 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
add_tdi_poin(tdi->locz, tdi->oldloc+2, tvec[2]);
}
else VecAddf(td->loc, td->iloc, tvec);
-
+
constraintTransLim(t, td);
}
}
/* uses t->vec to store actual translation in */
-int Translation(TransInfo *t, short mval[2])
+int Translation(TransInfo *t, short mval[2])
{
float tvec[3];
char str[250];
-
+
if (t->con.mode & CON_APPLY) {
float pvec[3] = {0.0f, 0.0f, 0.0f};
applySnapping(t, t->values);
@@ -3245,11 +3285,11 @@ int Translation(TransInfo *t, short mval[2])
{
removeAspectRatio(t, t->values);
}
-
+
applySnapping(t, t->values);
headerTranslation(t, t->values, str);
}
-
+
applyTranslation(t, t->values);
/* evil hack - redo translation if clipping needed */
@@ -3265,7 +3305,7 @@ int Translation(TransInfo *t, short mval[2])
/* ************************** SHRINK/FATTEN *************************** */
-void initShrinkFatten(TransInfo *t)
+void initShrinkFatten(TransInfo *t)
{
// If not in mesh edit mode, fallback to Resize
if (t->obedit==NULL || t->obedit->type != OB_MESH) {
@@ -3274,22 +3314,22 @@ void initShrinkFatten(TransInfo *t)
else {
t->mode = TFM_SHRINKFATTEN;
t->transform = ShrinkFatten;
-
+
initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 1.0f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
}
-int ShrinkFatten(TransInfo *t, short mval[2])
+int ShrinkFatten(TransInfo *t, short mval[2])
{
float vec[3];
float distance;
@@ -3315,8 +3355,8 @@ int ShrinkFatten(TransInfo *t, short mval[2])
/* default header print */
sprintf(str, "Shrink/Fatten: %.4f %s", distance, t->proptext);
}
-
-
+
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -3340,11 +3380,11 @@ int ShrinkFatten(TransInfo *t, short mval[2])
/* ************************** TILT *************************** */
-void initTilt(TransInfo *t)
+void initTilt(TransInfo *t)
{
t->mode = TFM_TILT;
t->transform = Tilt;
-
+
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
t->ndof.axis = 16;
@@ -3356,13 +3396,13 @@ void initTilt(TransInfo *t)
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
-int Tilt(TransInfo *t, short mval[2])
+int Tilt(TransInfo *t, short mval[2])
{
TransData *td = t->data;
int i;
@@ -3371,7 +3411,7 @@ int Tilt(TransInfo *t, short mval[2])
float final;
final = t->values[0];
-
+
applyNDofInput(&t->ndof, &final);
snapGrid(t, &final);
@@ -3417,72 +3457,72 @@ void initCurveShrinkFatten(TransInfo *t)
{
t->mode = TFM_CURVE_SHRINKFATTEN;
t->transform = CurveShrinkFatten;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
-int CurveShrinkFatten(TransInfo *t, short mval[2])
+int CurveShrinkFatten(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float ratio;
int i;
char str[50];
-
+
ratio = t->values[0];
-
+
snapGrid(t, &ratio);
-
+
applyNumInput(&t->num, &ratio);
-
+
/* header print for NumInput */
if (hasNumInput(&t->num)) {
char c[20];
-
+
outputNumInput(&(t->num), c);
sprintf(str, "Shrink/Fatten: %s", c);
}
else {
sprintf(str, "Shrink/Fatten: %3f", ratio);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
-
+
if(td->val) {
//*td->val= ratio;
*td->val= td->ival*ratio;
if (*td->val <= 0.0f) *td->val = 0.0001f;
}
}
-
+
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
-
+
return 1;
}
/* ************************** PUSH/PULL *************************** */
-void initPushPull(TransInfo *t)
+void initPushPull(TransInfo *t)
{
t->mode = TFM_PUSHPULL;
t->transform = PushPull;
-
+
initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
-
+
t->ndof.axis = 4;
/* Flip direction */
t->ndof.factor[0] = -1.0f;
@@ -3495,7 +3535,7 @@ void initPushPull(TransInfo *t)
}
-int PushPull(TransInfo *t, short mval[2])
+int PushPull(TransInfo *t, short mval[2])
{
float vec[3], axis[3];
float distance;
@@ -3504,7 +3544,7 @@ int PushPull(TransInfo *t, short mval[2])
TransData *td = t->data;
distance = t->values[0];
-
+
applyNDofInput(&t->ndof, &distance);
snapGrid(t, &distance);
@@ -3523,11 +3563,11 @@ int PushPull(TransInfo *t, short mval[2])
/* default header print */
sprintf(str, "Push/Pull: %.4f%s %s", distance, t->con.text, t->proptext);
}
-
+
if (t->con.applyRot && t->con.mode & CON_APPLY) {
t->con.applyRot(t, NULL, axis, NULL);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -3563,11 +3603,11 @@ int PushPull(TransInfo *t, short mval[2])
/* ************************** BEVEL **************************** */
-void initBevel(TransInfo *t)
+void initBevel(TransInfo *t)
{
t->transform = Bevel;
t->handleEvent = handleEventBevel;
-
+
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
t->mode = TFM_BEVEL;
@@ -3595,7 +3635,7 @@ void initBevel(TransInfo *t)
int handleEventBevel(TransInfo *t, wmEvent *event)
{
- if (event->val) {
+ if (event->val==KM_PRESS) {
if(!G.editBMesh) return 0;
switch (event->type) {
@@ -3636,7 +3676,7 @@ int Bevel(TransInfo *t, short mval[2])
mode = (G.editBMesh->options & BME_BEVEL_VERT) ? "verts only" : "normal";
distance = t->values[0] / 4; /* 4 just seemed a nice value to me, nothing special */
-
+
distance = fabs(distance);
snapGrid(t, &distance);
@@ -3655,7 +3695,7 @@ int Bevel(TransInfo *t, short mval[2])
/* default header print */
sprintf(str, "Bevel - Dist: %.4f, Mode: %s (MMB to toggle))", distance, mode);
}
-
+
if (distance < 0) distance = -distance;
for(i = 0 ; i < t->total; i++, td++) {
if (td->axismtx[1][0] > 0 && distance > td->axismtx[1][0]) {
@@ -3676,23 +3716,23 @@ int Bevel(TransInfo *t, short mval[2])
/* ************************** BEVEL WEIGHT *************************** */
-void initBevelWeight(TransInfo *t)
+void initBevelWeight(TransInfo *t)
{
t->mode = TFM_BWEIGHT;
t->transform = BevelWeight;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
-int BevelWeight(TransInfo *t, short mval[2])
+int BevelWeight(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float weight;
@@ -3726,7 +3766,7 @@ int BevelWeight(TransInfo *t, short mval[2])
else
sprintf(str, "Bevel Weight: %.3f %s", weight, t->proptext);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -3747,23 +3787,23 @@ int BevelWeight(TransInfo *t, short mval[2])
/* ************************** CREASE *************************** */
-void initCrease(TransInfo *t)
+void initCrease(TransInfo *t)
{
t->mode = TFM_CREASE;
t->transform = Crease;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
-int Crease(TransInfo *t, short mval[2])
+int Crease(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float crease;
@@ -3797,7 +3837,7 @@ int Crease(TransInfo *t, short mval[2])
else
sprintf(str, "Crease: %.3f %s", crease, t->proptext);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -3825,9 +3865,9 @@ void initBoneSize(TransInfo *t)
{
t->mode = TFM_BONESIZE;
t->transform = BoneSize;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING_FLIP);
-
+
t->idx_max = 2;
t->num.idx_max = 2;
t->num.flag |= NUM_NULL_ONE;
@@ -3851,7 +3891,7 @@ static void headerBoneSize(TransInfo *t, float vec[3], char *str) {
if (t->con.mode & CON_APPLY) {
if (t->num.idx_max == 0)
sprintf(str, "ScaleB: %s%s %s", &tvec[0], t->con.text, t->proptext);
- else
+ else
sprintf(str, "ScaleB: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
else {
@@ -3859,18 +3899,18 @@ static void headerBoneSize(TransInfo *t, float vec[3], char *str) {
}
}
-static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3])
+static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3])
{
float tmat[3][3], smat[3][3], oldy;
float sizemat[3][3];
-
+
Mat3MulMat3(smat, mat, td->mtx);
Mat3MulMat3(tmat, td->smtx, smat);
-
+
if (t->con.applySize) {
t->con.applySize(t, td, tmat);
}
-
+
/* we've tucked the scale in loc */
oldy= td->iloc[1];
SizeToMat3(td->iloc, sizemat);
@@ -3879,14 +3919,14 @@ static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3])
td->loc[1]= oldy;
}
-int BoneSize(TransInfo *t, short mval[2])
+int BoneSize(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float size[3], mat[3][3];
float ratio;
int i;
char str[60];
-
+
// TRANSFORM_FIX_ME MOVE TO MOUSE INPUT
/* for manipulator, center handle, the scaling can't be done relative to center */
if( (t->flag & T_USES_MANIPULATOR) && t->con.mode==0)
@@ -3897,40 +3937,40 @@ int BoneSize(TransInfo *t, short mval[2])
{
ratio = t->values[0];
}
-
+
size[0] = size[1] = size[2] = ratio;
-
+
snapGrid(t, size);
-
+
if (hasNumInput(&t->num)) {
applyNumInput(&t->num, size);
constraintNumInput(t, size);
}
-
+
SizeToMat3(size, mat);
-
+
if (t->con.applySize) {
t->con.applySize(t, NULL, mat);
}
-
+
Mat3CpyMat3(t->mat, mat); // used in manipulator
-
+
headerBoneSize(t, size, str);
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
-
+
ElementBoneSize(t, td, mat);
}
-
+
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
-
+
return 1;
}
@@ -3941,9 +3981,9 @@ void initBoneEnvelope(TransInfo *t)
{
t->mode = TFM_BONE_ENVELOPE;
t->transform = BoneEnvelope;
-
+
initMouseInputMode(t, &t->mouse, INPUT_SPRING);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
@@ -3953,37 +3993,37 @@ void initBoneEnvelope(TransInfo *t)
t->flag |= T_NO_CONSTRAINT;
}
-int BoneEnvelope(TransInfo *t, short mval[2])
+int BoneEnvelope(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float ratio;
int i;
char str[50];
-
+
ratio = t->values[0];
-
+
snapGrid(t, &ratio);
-
+
applyNumInput(&t->num, &ratio);
-
+
/* header print for NumInput */
if (hasNumInput(&t->num)) {
char c[20];
-
+
outputNumInput(&(t->num), c);
sprintf(str, "Envelope: %s", c);
}
else {
sprintf(str, "Envelope: %3f", ratio);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
-
+
if (td->val) {
/* if the old/original value was 0.0f, then just use ratio */
if (td->ival)
@@ -3992,14 +4032,685 @@ int BoneEnvelope(TransInfo *t, short mval[2])
*td->val= ratio;
}
}
-
+
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
+
+ return 1;
+}
+
+/* ******************** Edge Slide *************** */
+
+static int createSlideVerts(TransInfo *t)
+{
+ Mesh *me = t->obedit->data;
+ EditMesh *em = me->edit_mesh;
+ EditFace *efa;
+ EditEdge *eed,*first=NULL,*last=NULL, *temp = NULL;
+ EditVert *ev, *nearest = NULL;
+ LinkNode *edgelist = NULL, *vertlist=NULL, *look;
+ GHash *vertgh;
+ TransDataSlideVert *tempsv;
+ float perc = 0, percp = 0,vertdist; // XXX, projectMat[4][4];
+ float shiftlabda= 0.0f,len = 0.0f;
+ int i, j, numsel, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0,flip=0;
+ int wasshift = 0;
+ /* UV correction vars */
+ GHash **uvarray= NULL;
+ SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
+ int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
+ int uvlay_idx;
+ TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
+ RegionView3D *v3d = t->ar->regiondata;
+ float projectMat[4][4];
+ float start[3] = {0.0f, 0.0f, 0.0f}, end[3] = {0.0f, 0.0f, 0.0f};
+ float vec[3];
+ //short mval[2], mvalo[2];
+ float labda = 0.0f, totvec=0.0;
+
+ view3d_get_object_project_mat(v3d, t->obedit, projectMat);
+
+ //mvalo[0] = -1; mvalo[1] = -1;
+ numsel =0;
+
+ // Get number of selected edges and clear some flags
+ for(eed=em->edges.first;eed;eed=eed->next) {
+ eed->f1 = 0;
+ eed->f2 = 0;
+ if(eed->f & SELECT) numsel++;
+ }
+
+ for(ev=em->verts.first;ev;ev=ev->next) {
+ ev->f1 = 0;
+ }
+
+ //Make sure each edge only has 2 faces
+ // make sure loop doesn't cross face
+ for(efa=em->faces.first;efa;efa=efa->next) {
+ int ct = 0;
+ if(efa->e1->f & SELECT) {
+ ct++;
+ efa->e1->f1++;
+ if(efa->e1->f1 > 2) {
+ //BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ return 0;
+ }
+ }
+ if(efa->e2->f & SELECT) {
+ ct++;
+ efa->e2->f1++;
+ if(efa->e2->f1 > 2) {
+ //BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ return 0;
+ }
+ }
+ if(efa->e3->f & SELECT) {
+ ct++;
+ efa->e3->f1++;
+ if(efa->e3->f1 > 2) {
+ //BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ return 0;
+ }
+ }
+ if(efa->e4 && efa->e4->f & SELECT) {
+ ct++;
+ efa->e4->f1++;
+ if(efa->e4->f1 > 2) {
+ //BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ 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;
+ }
+ }
+
+ // Get # of selected verts
+ for(ev=em->verts.first;ev;ev=ev->next) {
+ if(ev->f & SELECT) vertsel++;
+ }
+
+ // Test for multiple segments
+ if(vertsel > numsel+1) {
+ //BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop");
+ return 0;
+ }
+
+ // Get the edgeloop in order - mark f1 with SELECT once added
+ for(eed=em->edges.first;eed;eed=eed->next) {
+ if((eed->f & SELECT) && !(eed->f1 & SELECT)) {
+ // If this is the first edge added, just put it in
+ if(!edgelist) {
+ BLI_linklist_prepend(&edgelist,eed);
+ numadded++;
+ first = eed;
+ last = eed;
+ eed->f1 = SELECT;
+ } else {
+ if(editedge_getSharedVert(eed, last)) {
+ BLI_linklist_append(&edgelist,eed);
+ eed->f1 = SELECT;
+ numadded++;
+ last = eed;
+ } else if(editedge_getSharedVert(eed, first)) {
+ BLI_linklist_prepend(&edgelist,eed);
+ eed->f1 = SELECT;
+ numadded++;
+ first = eed;
+ }
+ }
+ }
+ if(eed->next == NULL && numadded != numsel) {
+ eed=em->edges.first;
+ timesthrough++;
+ }
+
+ // It looks like there was an unexpected case - Hopefully should not happen
+ if(timesthrough >= numsel*2) {
+ BLI_linklist_free(edgelist,NULL);
+ //BKE_report(op->reports, RPT_ERROR, "Could not order loop");
+ return 0;
+ }
+ }
+
+ // Put the verts in order in a linklist
+ look = edgelist;
+ while(look) {
+ eed = look->link;
+ if(!vertlist) {
+ if(look->next) {
+ temp = look->next->link;
+
+ //This is the first entry takes care of extra vert
+ if(eed->v1 != temp->v1 && eed->v1 != temp->v2) {
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
+ } else {
+ BLI_linklist_append(&vertlist,eed->v2);
+ eed->v2->f1 = 1;
+ }
+ } else {
+ //This is the case that we only have 1 edge
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
+ }
+ }
+ // for all the entries
+ if(eed->v1->f1 != 1) {
+ BLI_linklist_append(&vertlist,eed->v1);
+ eed->v1->f1 = 1;
+ } else if(eed->v2->f1 != 1) {
+ BLI_linklist_append(&vertlist,eed->v2);
+ eed->v2->f1 = 1;
+ }
+ look = look->next;
+ }
+
+ // populate the SlideVerts
+
+ vertgh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ look = vertlist;
+ while(look) {
+ i=0;
+ j=0;
+ ev = look->link;
+ tempsv = (struct TransDataSlideVert*)MEM_mallocN(sizeof(struct TransDataSlideVert),"SlideVert");
+ tempsv->up = NULL;
+ tempsv->down = NULL;
+ tempsv->origvert.co[0] = ev->co[0];
+ tempsv->origvert.co[1] = ev->co[1];
+ tempsv->origvert.co[2] = ev->co[2];
+ tempsv->origvert.no[0] = ev->no[0];
+ tempsv->origvert.no[1] = ev->no[1];
+ tempsv->origvert.no[2] = ev->no[2];
+ // i is total edges that vert is on
+ // j is total selected edges that vert is on
+
+ for(eed=em->edges.first;eed;eed=eed->next) {
+ if(eed->v1 == ev || eed->v2 == ev) {
+ i++;
+ if(eed->f & SELECT) {
+ j++;
+ }
+ }
+ }
+ // If the vert is in the middle of an edge loop, it touches 2 selected edges and 2 unselected edges
+ if(i == 4 && j == 2) {
+ for(eed=em->edges.first;eed;eed=eed->next) {
+ if(editedge_containsVert(eed, ev)) {
+ if(!(eed->f & SELECT)) {
+ if(!tempsv->up) {
+ tempsv->up = eed;
+ } else if (!(tempsv->down)) {
+ tempsv->down = eed;
+ }
+ }
+ }
+ }
+ }
+ // If it is on the end of the loop, it touches 1 selected and as least 2 more unselected
+ if(i >= 3 && j == 1) {
+ for(eed=em->edges.first;eed;eed=eed->next) {
+ if(editedge_containsVert(eed, ev) && eed->f & SELECT) {
+ for(efa = em->faces.first;efa;efa=efa->next) {
+ if(editface_containsEdge(efa, eed)) {
+ if(editedge_containsVert(efa->e1, ev) && efa->e1 != eed) {
+ if(!tempsv->up) {
+ tempsv->up = efa->e1;
+ } else if (!(tempsv->down)) {
+ tempsv->down = efa->e1;
+ }
+ }
+ if(editedge_containsVert(efa->e2, ev) && efa->e2 != eed) {
+ if(!tempsv->up) {
+ tempsv->up = efa->e2;
+ } else if (!(tempsv->down)) {
+ tempsv->down = efa->e2;
+ }
+ }
+ if(editedge_containsVert(efa->e3, ev) && efa->e3 != eed) {
+ if(!tempsv->up) {
+ tempsv->up = efa->e3;
+ } else if (!(tempsv->down)) {
+ tempsv->down = efa->e3;
+ }
+ }
+ if(efa->e4) {
+ if(editedge_containsVert(efa->e4, ev) && efa->e4 != eed) {
+ if(!tempsv->up) {
+ tempsv->up = efa->e4;
+ } else if (!(tempsv->down)) {
+ tempsv->down = efa->e4;
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ if(i > 4 && j == 2) {
+ BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_linklist_free(vertlist,NULL);
+ BLI_linklist_free(edgelist,NULL);
+ return 0;
+ }
+ BLI_ghash_insert(vertgh,ev,tempsv);
+
+ look = look->next;
+ }
+
+ // make sure the UPs nad DOWNs are 'faceloops'
+ // Also find the nearest slidevert to the cursor
+
+ look = vertlist;
+ nearest = NULL;
+ vertdist = -1;
+ while(look) {
+ tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
+
+ if(!tempsv->up || !tempsv->down) {
+ //BKE_report(op->reports, RPT_ERROR, "Missing rails");
+ BLI_ghash_free(vertgh, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_linklist_free(vertlist,NULL);
+ BLI_linklist_free(edgelist,NULL);
+ return 0;
+ }
+
+ if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(!(tempsv->up->f & SELECT)) {
+ tempsv->up->f |= SELECT;
+ tempsv->up->f2 |= 16;
+ } else {
+ tempsv->up->f2 |= ~16;
+ }
+ if(!(tempsv->down->f & SELECT)) {
+ tempsv->down->f |= SELECT;
+ tempsv->down->f2 |= 16;
+ } else {
+ tempsv->down->f2 |= ~16;
+ }
+ }
+
+ if(look->next != NULL) {
+ TransDataSlideVert *sv;
+
+ ev = (EditVert*)look->next->link;
+ sv = BLI_ghash_lookup(vertgh, ev);
+
+ if(sv) {
+ float co[3], co2[3], vec[3];
+
+ ev = (EditVert*)look->link;
+
+ if(!sharesFace(em, tempsv->up,sv->up)) {
+ EditEdge *swap;
+ swap = sv->up;
+ sv->up = sv->down;
+ sv->down = swap;
+ }
+
+ view3d_project_float(t->ar, tempsv->up->v1->co, co, projectMat);
+ view3d_project_float(t->ar, tempsv->up->v2->co, co2, projectMat);
+
+ if (ev == tempsv->up->v1) {
+ VecSubf(vec, co, co2);
+ } else {
+ VecSubf(vec, co2, co);
+ }
+
+ VecAddf(start, start, vec);
+
+ view3d_project_float(t->ar, tempsv->down->v1->co, co, projectMat);
+ view3d_project_float(t->ar, tempsv->down->v2->co, co2, projectMat);
+
+ if (ev == tempsv->down->v1) {
+ VecSubf(vec, co2, co);
+ } else {
+ VecSubf(vec, co, co2);
+ }
+
+ VecAddf(end, end, vec);
+
+ totvec += 1.0f;
+ nearest = (EditVert*)look->link;
+ }
+ }
+
+
+
+ look = look->next;
+ }
+
+ VecAddf(start, start, end);
+ VecMulf(start, 0.5*(1.0/totvec));
+ VECCOPY(vec, start);
+ start[0] = t->mval[0];
+ start[1] = t->mval[1];
+ VecAddf(end, start, vec);
+
+ sld->start[0] = (short) start[0];
+ sld->start[1] = (short) start[1];
+ sld->end[0] = (short) end[0];
+ sld->end[1] = (short) end[1];
+ if (uvlay_tot) { // XXX && (scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT)) {
+ int maxnum = 0;
+
+ uvarray = MEM_callocN( uvlay_tot * sizeof(GHash *), "SlideUVs Array");
+ sld->totuv = uvlay_tot;
+ suv_last = slideuvs = MEM_callocN( uvlay_tot * (numadded+1) * sizeof(TransDataSlideUv), "SlideUVs"); /* uvLayers * verts */
+ suv = NULL;
+
+ for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
+
+ uvarray[uvlay_idx] = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
+ for(ev=em->verts.first;ev;ev=ev->next) {
+ ev->tmp.l = 0;
+ }
+ look = vertlist;
+ while(look) {
+ float *uv_new;
+ tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
+
+ ev = look->link;
+ suv = NULL;
+ for(efa = em->faces.first;efa;efa=efa->next) {
+ if (ev->tmp.l != -1) { /* test for self, in this case its invalid */
+ int k=-1; /* face corner */
+
+ /* Is this vert in the faces corner? */
+ if (efa->v1==ev) k=0;
+ else if (efa->v2==ev) k=1;
+ else if (efa->v3==ev) k=2;
+ else if (efa->v4 && efa->v4==ev) k=3;
+
+ if (k != -1) {
+ MTFace *tf = CustomData_em_get_n(&em->fdata, efa->data, CD_MTFACE, uvlay_idx);
+ EditVert *ev_up, *ev_down;
+
+ 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])) {
+ ev->tmp.l = -1; /* Tag as invalid */
+ BLI_linklist_free(suv->fuv_list,NULL);
+ suv->fuv_list = NULL;
+ BLI_ghash_remove(uvarray[uvlay_idx],ev, NULL, NULL);
+ suv = NULL;
+ break;
+ }
+ } else {
+ ev->tmp.l = 1;
+ suv = suv_last;
+
+ suv->fuv_list = NULL;
+ suv->uv_up = suv->uv_down = NULL;
+ suv->origuv[0] = uv_new[0];
+ suv->origuv[1] = uv_new[1];
+
+ BLI_linklist_prepend(&suv->fuv_list, uv_new);
+ BLI_ghash_insert(uvarray[uvlay_idx],ev,suv);
+
+ suv_last++; /* advance to next slide UV */
+ maxnum++;
+ }
+
+ /* Now get the uvs along the up or down edge if we can */
+ if (suv) {
+ if (!suv->uv_up) {
+ ev_up = editedge_getOtherVert(tempsv->up,ev);
+ if (efa->v1==ev_up) suv->uv_up = tf->uv[0];
+ else if (efa->v2==ev_up) suv->uv_up = tf->uv[1];
+ else if (efa->v3==ev_up) suv->uv_up = tf->uv[2];
+ else if (efa->v4 && efa->v4==ev_up) suv->uv_up = tf->uv[3];
+ }
+ if (!suv->uv_down) { /* if the first face was apart of the up edge, it cant be apart of the down edge */
+ ev_down = editedge_getOtherVert(tempsv->down,ev);
+ if (efa->v1==ev_down) suv->uv_down = tf->uv[0];
+ else if (efa->v2==ev_down) suv->uv_down = tf->uv[1];
+ else if (efa->v3==ev_down) suv->uv_down = tf->uv[2];
+ else if (efa->v4 && efa->v4==ev_down) suv->uv_down = tf->uv[3];
+ }
+
+ /* Copy the pointers to the face UV's */
+ BLI_linklist_prepend(&suv->fuv_list, uv_new);
+ }
+ }
+ }
+ }
+ look = look->next;
+ }
+ } /* end uv layer loop */
+ } /* end uvlay_tot */
+
+ sld->uvhash = uvarray;
+ sld->slideuv = slideuvs;
+ sld->vhash = vertgh;
+ sld->nearest = nearest;
+ sld->vertlist = vertlist;
+ sld->edgelist = edgelist;
+ sld->suv_last = suv_last;
+ sld->uvlay_tot = uvlay_tot;
+
+ // we should have enough info now to slide
+
+ t->customData = sld;
+
+ return 1;
+}
+
+void freeSlideVerts(TransInfo *t)
+{
+ TransDataSlideUv *suv;
+ SlideData *sld = t->customData;
+ int uvlay_idx;
+
+ //BLI_ghash_free(edgesgh, freeGHash, NULL);
+ BLI_ghash_free(sld->vhash, NULL, (GHashValFreeFP)MEM_freeN);
+ BLI_linklist_free(sld->vertlist, NULL);
+ BLI_linklist_free(sld->edgelist, NULL);
+
+ if (sld->uvlay_tot) {
+ for (uvlay_idx=0; uvlay_idx<sld->uvlay_tot; uvlay_idx++) {
+ BLI_ghash_free(sld->uvhash[uvlay_idx], NULL, NULL);
+ }
+ MEM_freeN(sld->slideuv);
+ MEM_freeN(sld->uvhash);
+
+ suv = sld->suv_last-1;
+ while (suv >= sld->slideuv) {
+ if (suv->fuv_list) {
+ BLI_linklist_free(suv->fuv_list,NULL);
+ }
+ suv--;
+ }
+ }
+
+ MEM_freeN(sld);
+ t->customData = NULL;
+}
+
+void initEdgeSlide(TransInfo *t)
+{
+ SlideData *sld;
+
+ t->mode = TFM_EDGE_SLIDE;
+ t->transform = EdgeSlide;
+
+ createSlideVerts(t);
+ sld = t->customData;
+
+ if (!sld)
+ return;
+
+ t->customFree = freeSlideVerts;
+
+ initMouseInputMode(t, &t->mouse, INPUT_CUSTOM_RATIO);
+ setCustomPoints(t, &t->mouse, sld->end, sld->start);
+
+ t->idx_max = 0;
+ t->num.idx_max = 0;
+ t->snap[0] = 0.0f;
+ t->snap[1] = (float)((5.0/180)*M_PI);
+ t->snap[2] = t->snap[1] * 0.2f;
+
+ t->flag |= T_NO_CONSTRAINT;
+}
+
+int doEdgeSlide(TransInfo *t, float perc)
+{
+ Mesh *me= t->obedit->data;
+ EditMesh *em = me->edit_mesh;
+ SlideData *sld = t->customData;
+ EditEdge *first=NULL,*last=NULL, *temp = NULL;
+ EditVert *ev, *nearest = sld->nearest;
+ EditVert *centerVert, *upVert, *downVert;
+ LinkNode *edgelist = sld->edgelist, *vertlist=sld->vertlist, *look;
+ GHash *vertgh = sld->vhash;
+ TransDataSlideVert *tempsv;
+ float shiftlabda= 0.0f,len = 0.0f;
+ int i = 0, numadded=0, timesthrough = 0, vertsel=0, prop=1, cancel = 0,flip=0;
+ int wasshift = 0;
+ /* UV correction vars */
+ GHash **uvarray= sld->uvhash;
+ int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
+ int uvlay_idx;
+ TransDataSlideUv *slideuvs=sld->slideuv, *suv=sld->slideuv, *suv_last=NULL;
+ float uv_tmp[2];
+ LinkNode *fuv_link;
+ float labda = 0.0f;
+
+ len = 0.0f;
+
+ tempsv = BLI_ghash_lookup(vertgh,nearest);
+
+ centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
+ upVert = editedge_getOtherVert(tempsv->up, centerVert);
+ downVert = editedge_getOtherVert(tempsv->down, centerVert);
+
+ len = MIN2(perc, VecLenf(upVert->co,downVert->co));
+ len = MAX2(len, 0);
+
+ //Adjust Edgeloop
+ if(prop) {
+ look = vertlist;
+ while(look) {
+ EditVert *tempev;
+ ev = look->link;
+ tempsv = BLI_ghash_lookup(vertgh,ev);
+
+ tempev = editedge_getOtherVert((perc>=0)?tempsv->up:tempsv->down, ev);
+ VecLerpf(ev->co, tempsv->origvert.co, tempev->co, fabs(perc));
+
+ if (uvlay_tot) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
+ for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
+ suv = BLI_ghash_lookup( uvarray[uvlay_idx], ev );
+ if (suv && suv->fuv_list && suv->uv_up && suv->uv_down) {
+ Vec2Lerpf(uv_tmp, suv->origuv, (perc>=0)?suv->uv_up:suv->uv_down, fabs(perc));
+ fuv_link = suv->fuv_list;
+ while (fuv_link) {
+ VECCOPY2D(((float *)fuv_link->link), uv_tmp);
+ fuv_link = fuv_link->next;
+ }
+ }
+ }
+ }
+
+ look = look->next;
+ }
+ }
+ else {
+ //Non prop code
+ look = vertlist;
+ while(look) {
+ float newlen;
+ ev = look->link;
+ tempsv = BLI_ghash_lookup(vertgh,ev);
+ newlen = (len / VecLenf(editedge_getOtherVert(tempsv->up,ev)->co,editedge_getOtherVert(tempsv->down,ev)->co));
+ if(newlen > 1.0) {newlen = 1.0;}
+ if(newlen < 0.0) {newlen = 0.0;}
+ if(flip == 0) {
+ VecLerpf(ev->co, editedge_getOtherVert(tempsv->down,ev)->co, editedge_getOtherVert(tempsv->up,ev)->co, fabs(newlen));
+ if (uvlay_tot) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
+ /* dont do anything if no UVs */
+ for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
+ suv = BLI_ghash_lookup( uvarray[uvlay_idx], ev );
+ if (suv && suv->fuv_list && suv->uv_up && suv->uv_down) {
+ Vec2Lerpf(uv_tmp, suv->uv_down, suv->uv_up, fabs(newlen));
+ fuv_link = suv->fuv_list;
+ while (fuv_link) {
+ VECCOPY2D(((float *)fuv_link->link), uv_tmp);
+ fuv_link = fuv_link->next;
+ }
+ }
+ }
+ }
+ } else{
+ VecLerpf(ev->co, editedge_getOtherVert(tempsv->up,ev)->co, editedge_getOtherVert(tempsv->down,ev)->co, fabs(newlen));
+
+ if (uvlay_tot) { // XXX scene->toolsettings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT) {
+ /* dont do anything if no UVs */
+ for (uvlay_idx=0; uvlay_idx<uvlay_tot; uvlay_idx++) {
+ suv = BLI_ghash_lookup( uvarray[uvlay_idx], ev );
+ if (suv && suv->fuv_list && suv->uv_up && suv->uv_down) {
+ Vec2Lerpf(uv_tmp, suv->uv_up, suv->uv_down, fabs(newlen));
+ fuv_link = suv->fuv_list;
+ while (fuv_link) {
+ VECCOPY2D(((float *)fuv_link->link), uv_tmp);
+ fuv_link = fuv_link->next;
+ }
+ }
+ }
+ }
+ }
+ look = look->next;
+ }
+
+ }
+
return 1;
}
+int EdgeSlide(TransInfo *t, short mval[2])
+{
+ TransData *td = t->data;
+ char str[50];
+ float final;
+
+ final = t->values[0];
+
+ snapGrid(t, &final);
+
+ if (hasNumInput(&t->num)) {
+ char c[20];
+
+ applyNumInput(&t->num, &final);
+
+ outputNumInput(&(t->num), c);
+
+ sprintf(str, "Edge Slide Percent: %s", &c[0]);
+ }
+ else {
+ sprintf(str, "Edge Slide Percent: %.2f", final);
+ }
+
+ CLAMP(final, -1.0f, 1.0f);
+
+ /*do stuff here*/
+ doEdgeSlide(t, final);
+
+ recalcData(t);
+
+ ED_area_headerprint(t->sa, str);
+
+ return 1;
+}
/* ******************** EditBone roll *************** */
@@ -4007,7 +4718,7 @@ void initBoneRoll(TransInfo *t)
{
t->mode = TFM_BONE_ROLL;
t->transform = BoneRoll;
-
+
initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
t->idx_max = 0;
@@ -4015,11 +4726,11 @@ void initBoneRoll(TransInfo *t)
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
-
+
t->flag |= T_NO_CONSTRAINT;
}
-int BoneRoll(TransInfo *t, short mval[2])
+int BoneRoll(TransInfo *t, short mval[2])
{
TransData *td = t->data;
int i;
@@ -4045,18 +4756,18 @@ int BoneRoll(TransInfo *t, short mval[2])
else {
sprintf(str, "Roll: %.2f", 180.0*final/M_PI);
}
-
+
/* set roll values */
- for (i = 0; i < t->total; i++, td++) {
+ for (i = 0; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
-
+
*(td->val) = td->ival - final;
}
-
+
recalcData(t);
ED_area_headerprint(t->sa, str);
@@ -4066,11 +4777,11 @@ int BoneRoll(TransInfo *t, short mval[2])
/* ************************** BAKE TIME ******************* */
-void initBakeTime(TransInfo *t)
+void initBakeTime(TransInfo *t)
{
t->transform = BakeTime;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
-
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
@@ -4078,15 +4789,15 @@ void initBakeTime(TransInfo *t)
t->snap[2] = t->snap[1] * 0.1f;
}
-int BakeTime(TransInfo *t, short mval[2])
+int BakeTime(TransInfo *t, short mval[2])
{
TransData *td = t->data;
float time;
int i;
char str[50];
-
+
float fac = 0.1f;
-
+
if(t->mouse.precision) {
/* calculate ratio for shiftkey pos, and for total, and blend these for precision */
time= (float)(t->center2d[0] - t->mouse.precision_mval[0]) * fac;
@@ -4118,7 +4829,7 @@ int BakeTime(TransInfo *t, short mval[2])
else
sprintf(str, "Time: %.3f %s", time, t->proptext);
}
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -4142,7 +4853,7 @@ int BakeTime(TransInfo *t, short mval[2])
/* ************************** MIRROR *************************** */
-void initMirror(TransInfo *t)
+void initMirror(TransInfo *t)
{
t->transform = Mirror;
initMouseInputMode(t, &t->mouse, INPUT_NONE);
@@ -4153,7 +4864,7 @@ void initMirror(TransInfo *t)
}
}
-int Mirror(TransInfo *t, short mval[2])
+int Mirror(TransInfo *t, short mval[2])
{
TransData *td;
float size[3], mat[3][3];
@@ -4169,48 +4880,51 @@ int Mirror(TransInfo *t, short mval[2])
/* if an axis has been selected */
if (t->con.mode & CON_APPLY) {
size[0] = size[1] = size[2] = -1;
-
+
SizeToMat3(size, mat);
-
+
if (t->con.applySize) {
t->con.applySize(t, NULL, mat);
}
-
+
sprintf(str, "Mirror%s", t->con.text);
-
+
for(i = 0, td=t->data; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
-
+
if (td->flag & TD_SKIP)
continue;
-
+
ElementResize(t, td, mat);
}
-
+
recalcData(t);
-
+
ED_area_headerprint(t->sa, str);
}
else
{
size[0] = size[1] = size[2] = 1;
-
+
SizeToMat3(size, mat);
-
+
for(i = 0, td=t->data; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
-
+
if (td->flag & TD_SKIP)
continue;
-
+
ElementResize(t, td, mat);
}
-
+
recalcData(t);
-
- ED_area_headerprint(t->sa, "Select a mirror axis (X, Y, Z)");
+
+ if(t->flag & T_2D_EDIT)
+ ED_area_headerprint(t->sa, "Select a mirror axis (X, Y)");
+ else
+ ED_area_headerprint(t->sa, "Select a mirror axis (X, Y, Z)");
}
return 1;
@@ -4218,12 +4932,12 @@ int Mirror(TransInfo *t, short mval[2])
/* ************************** ALIGN *************************** */
-void initAlign(TransInfo *t)
+void initAlign(TransInfo *t)
{
t->flag |= T_NO_CONSTRAINT;
-
+
t->transform = Align;
-
+
initMouseInputMode(t, &t->mouse, INPUT_NONE);
}
@@ -4239,13 +4953,13 @@ int Align(TransInfo *t, short mval[2])
for(i = 0 ; i < t->total; i++, td++)
{
float mat[3][3], invmat[3][3];
-
+
if (td->flag & TD_NOACTION)
break;
if (td->flag & TD_SKIP)
continue;
-
+
/* around local centers */
if (t->flag & (T_OBJECT|T_POSE)) {
VECCOPY(t->center, td->center);
@@ -4257,19 +4971,19 @@ int Align(TransInfo *t, short mval[2])
}
Mat3Inv(invmat, td->axismtx);
-
- Mat3MulMat3(mat, t->spacemtx, invmat);
+
+ Mat3MulMat3(mat, t->spacemtx, invmat);
ElementRotation(t, td, mat, t->around);
}
/* restoring original center */
VECCOPY(t->center, center);
-
+
recalcData(t);
ED_area_headerprint(t->sa, "Align");
-
+
return 1;
}
@@ -4278,37 +4992,37 @@ int Align(TransInfo *t, short mval[2])
/* ---------------- Special Helpers for Various Settings ------------- */
-/* This function returns the snapping 'mode' for Animation Editors only
+/* This function returns the snapping 'mode' for Animation Editors only
* We cannot use the standard snapping due to NLA-strip scaling complexities.
*/
// XXX these modifier checks should be keymappable
static short getAnimEdit_SnapMode(TransInfo *t)
{
short autosnap= SACTSNAP_OFF;
-
+
/* currently, some of these are only for the action editor */
if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
-
+
if (saction)
autosnap= saction->autosnap;
}
else if (t->spacetype == SPACE_IPO) {
SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
-
+
if (sipo)
autosnap= sipo->autosnap;
}
else if (t->spacetype == SPACE_NLA) {
SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
-
+
if (snla)
autosnap= snla->autosnap;
}
else {
// TRANSFORM_FIX_ME This needs to use proper defines for t->modifiers
// // FIXME: this still toggles the modes...
-// if (ctrl)
+// if (ctrl)
// autosnap= SACTSNAP_STEP;
// else if (shift)
// autosnap= SACTSNAP_FRAME;
@@ -4317,41 +5031,41 @@ static short getAnimEdit_SnapMode(TransInfo *t)
// else
autosnap= SACTSNAP_OFF;
}
-
+
return autosnap;
}
/* This function is used for testing if an Animation Editor is displaying
* its data in frames or seconds (and the data needing to be edited as such).
- * Returns 1 if in seconds, 0 if in frames
+ * Returns 1 if in seconds, 0 if in frames
*/
static short getAnimEdit_DrawTime(TransInfo *t)
{
short drawtime;
-
+
/* currently, some of these are only for the action editor */
if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
-
+
drawtime = (saction->flag & SACTION_DRAWTIME)? 1 : 0;
}
else if (t->spacetype == SPACE_NLA) {
SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
-
+
drawtime = (snla->flag & SNLA_DRAWTIME)? 1 : 0;
}
else {
drawtime = 0;
}
-
+
return drawtime;
-}
+}
-/* This function is used by Animation Editor specific transform functions to do
+/* This function is used by Animation Editor specific transform functions to do
* the Snap Keyframe to Nearest Frame/Marker
*/
-static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short autosnap)
+static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, AnimData *adt, short autosnap)
{
/* snap key to nearest frame? */
if (autosnap == SACTSNAP_FRAME) {
@@ -4359,42 +5073,42 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short
const short doTime= getAnimEdit_DrawTime(t);
const double secf= FPS;
double val;
-
+
/* convert frame to nla-action time (if needed) */
- if (ob)
- val= get_action_frame_inv(ob, *(td->val));
+ if (adt)
+ val= BKE_nla_tweakedit_remap(adt, *(td->val), NLATIME_CONVERT_MAP);
else
val= *(td->val);
-
+
/* do the snapping to nearest frame/second */
if (doTime)
val= (float)( floor((val/secf) + 0.5f) * secf );
else
val= (float)( floor(val+0.5f) );
-
+
/* convert frame out of nla-action time */
- if (ob)
- *(td->val)= get_action_frame(ob, val);
+ if (adt)
+ *(td->val)= BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_UNMAP);
else
*(td->val)= val;
}
/* snap key to nearest marker? */
else if (autosnap == SACTSNAP_MARKER) {
float val;
-
+
/* convert frame to nla-action time (if needed) */
- if (ob)
- val= get_action_frame_inv(ob, *(td->val));
+ if (adt)
+ val= BKE_nla_tweakedit_remap(adt, *(td->val), NLATIME_CONVERT_MAP);
else
val= *(td->val);
-
+
/* snap to nearest marker */
// TODO: need some more careful checks for where data comes from
val= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, val);
-
+
/* convert frame out of nla-action time */
- if (ob)
- *(td->val)= get_action_frame(ob, val);
+ if (adt)
+ *(td->val)= BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_UNMAP);
else
*(td->val)= val;
}
@@ -4402,27 +5116,27 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short
/* ----------------- Translation ----------------------- */
-void initTimeTranslate(TransInfo *t)
+void initTimeTranslate(TransInfo *t)
{
t->mode = TFM_TIME_TRANSLATE;
t->transform = TimeTranslate;
-
+
initMouseInputMode(t, &t->mouse, INPUT_NONE);
/* num-input has max of (n-1) */
t->idx_max = 0;
t->num.flag = 0;
t->num.idx_max = t->idx_max;
-
+
/* initialise snap like for everything else */
- t->snap[0] = 0.0f;
+ t->snap[0] = 0.0f;
t->snap[1] = t->snap[2] = 1.0f;
}
-static void headerTimeTranslate(TransInfo *t, char *str)
+static void headerTimeTranslate(TransInfo *t, char *str)
{
char tvec[60];
-
+
/* if numeric input is active, use results from that, otherwise apply snapping to result */
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
@@ -4433,7 +5147,7 @@ static void headerTimeTranslate(TransInfo *t, char *str)
const short doTime = getAnimEdit_DrawTime(t);
const double secf= FPS;
float val = t->values[0];
-
+
/* apply snapping + frame->seconds conversions */
if (autosnap == SACTSNAP_STEP) {
if (doTime)
@@ -4445,85 +5159,86 @@ static void headerTimeTranslate(TransInfo *t, char *str)
if (doTime)
val= val / secf;
}
-
+
sprintf(&tvec[0], "%.4f", val);
}
-
+
sprintf(str, "DeltaX: %s", &tvec[0]);
}
-static void applyTimeTranslate(TransInfo *t, float sval)
+static void applyTimeTranslate(TransInfo *t, float sval)
{
TransData *td = t->data;
Scene *scene = t->scene;
int i;
-
+
const short doTime= getAnimEdit_DrawTime(t);
const double secf= FPS;
-
+
const short autosnap= getAnimEdit_SnapMode(t);
-
+
float deltax, val;
-
+
/* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */
for (i = 0 ; i < t->total; i++, td++) {
- /* it is assumed that td->ob is a pointer to the object,
- * whose active action is where this keyframe comes from
+ /* it is assumed that td->extra is a pointer to the AnimData,
+ * whose active action is where this keyframe comes from
+ * (this is only valid when not in NLA)
*/
- Object *ob= td->ob;
-
- /* check if any need to apply nla-scaling */
- if (ob) {
+ AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
+
+ /* check if any need to apply nla-mapping */
+ if (adt) {
deltax = t->values[0];
-
+
if (autosnap == SACTSNAP_STEP) {
- if (doTime)
+ if (doTime)
deltax= (float)( floor((deltax/secf) + 0.5f) * secf );
else
deltax= (float)( floor(deltax + 0.5f) );
}
-
- val = get_action_frame_inv(ob, td->ival);
+
+ val = BKE_nla_tweakedit_remap(adt, td->ival, NLATIME_CONVERT_MAP);
val += deltax;
- *(td->val) = get_action_frame(ob, val);
+ *(td->val) = BKE_nla_tweakedit_remap(adt, val, NLATIME_CONVERT_UNMAP);
}
else {
deltax = val = t->values[0];
-
+
if (autosnap == SACTSNAP_STEP) {
if (doTime)
val= (float)( floor((deltax/secf) + 0.5f) * secf );
else
val= (float)( floor(val + 0.5f) );
}
-
+
*(td->val) = td->ival + val;
}
-
+
/* apply nearest snapping */
- doAnimEdit_SnapFrame(t, td, ob, autosnap);
+ doAnimEdit_SnapFrame(t, td, adt, autosnap);
}
}
-int TimeTranslate(TransInfo *t, short mval[2])
+int TimeTranslate(TransInfo *t, short mval[2])
{
View2D *v2d = (View2D *)t->view;
float cval[2], sval[2];
char str[200];
-
+
/* calculate translation amount from mouse movement - in 'time-grid space' */
UI_view2d_region_to_view(v2d, mval[0], mval[0], &cval[0], &cval[1]);
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]);
-
+
/* we only need to calculate effect for time (applyTimeTranslate only needs that) */
t->values[0] = cval[0] - sval[0];
-
+
/* handle numeric-input stuff */
t->vec[0] = t->values[0];
applyNumInput(&t->num, &t->vec[0]);
t->values[0] = t->vec[0];
headerTimeTranslate(t, str);
-
+
applyTimeTranslate(t, sval[0]);
recalcData(t);
@@ -4535,36 +5250,36 @@ int TimeTranslate(TransInfo *t, short mval[2])
/* ----------------- Time Slide ----------------------- */
-void initTimeSlide(TransInfo *t)
+void initTimeSlide(TransInfo *t)
{
/* this tool is only really available in the Action Editor... */
if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
-
+
/* set flag for drawing stuff */
saction->flag |= SACTION_MOVING;
}
-
+
t->mode = TFM_TIME_SLIDE;
t->transform = TimeSlide;
t->flag |= T_FREE_CUSTOMDATA;
-
+
initMouseInputMode(t, &t->mouse, INPUT_NONE);
/* num-input has max of (n-1) */
t->idx_max = 0;
t->num.flag = 0;
t->num.idx_max = t->idx_max;
-
+
/* initialise snap like for everything else */
- t->snap[0] = 0.0f;
+ t->snap[0] = 0.0f;
t->snap[1] = t->snap[2] = 1.0f;
}
-static void headerTimeSlide(TransInfo *t, float sval, char *str)
+static void headerTimeSlide(TransInfo *t, float sval, char *str)
{
char tvec[60];
-
+
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
}
@@ -4573,49 +5288,50 @@ static void headerTimeSlide(TransInfo *t, float sval, char *str)
float maxx= *((float *)(t->customData) + 1);
float cval= t->values[0];
float val;
-
+
val= 2.0f*(cval-sval) / (maxx-minx);
CLAMP(val, -1.0f, 1.0f);
-
+
sprintf(&tvec[0], "%.4f", val);
}
-
+
sprintf(str, "TimeSlide: %s", &tvec[0]);
}
-static void applyTimeSlide(TransInfo *t, float sval)
+static void applyTimeSlide(TransInfo *t, float sval)
{
TransData *td = t->data;
int i;
-
+
float minx= *((float *)(t->customData));
float maxx= *((float *)(t->customData) + 1);
-
+
/* set value for drawing black line */
if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
float cvalf = t->values[0];
-
+
saction->timeslide= cvalf;
}
-
+
/* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */
for (i = 0 ; i < t->total; i++, td++) {
- /* it is assumed that td->ob is a pointer to the object,
- * whose active action is where this keyframe comes from
+ /* it is assumed that td->extra is a pointer to the AnimData,
+ * whose active action is where this keyframe comes from
+ * (this is only valid when not in NLA)
*/
- Object *ob= td->ob;
+ AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
float cval = t->values[0];
-
- /* apply scaling to necessary values */
- if (ob)
- cval= get_action_frame(ob, cval);
-
+
+ /* apply NLA-mapping to necessary values */
+ if (adt)
+ cval= BKE_nla_tweakedit_remap(adt, cval, NLATIME_CONVERT_UNMAP);
+
/* only apply to data if in range */
if ((sval > minx) && (sval < maxx)) {
float cvalc= CLAMPIS(cval, minx, maxx);
float timefac;
-
+
/* left half? */
if (td->ival < sval) {
timefac= (sval - td->ival) / (sval - minx);
@@ -4629,26 +5345,26 @@ static void applyTimeSlide(TransInfo *t, float sval)
}
}
-int TimeSlide(TransInfo *t, short mval[2])
+int TimeSlide(TransInfo *t, short mval[2])
{
View2D *v2d = (View2D *)t->view;
float cval[2], sval[2];
float minx= *((float *)(t->customData));
float maxx= *((float *)(t->customData) + 1);
char str[200];
-
+
/* calculate mouse co-ordinates */
UI_view2d_region_to_view(v2d, mval[0], mval[0], &cval[0], &cval[1]);
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]);
-
+
/* t->values[0] stores cval[0], which is the current mouse-pointer location (in frames) */
t->values[0] = cval[0];
-
+
/* handle numeric-input stuff */
t->vec[0] = 2.0f*(cval[0]-sval[0]) / (maxx-minx);
applyNumInput(&t->num, &t->vec[0]);
t->values[0] = (maxx-minx) * t->vec[0] / 2.0 + sval[0];
-
+
headerTimeSlide(t, sval[0], str);
applyTimeSlide(t, sval[0]);
@@ -4661,35 +5377,35 @@ int TimeSlide(TransInfo *t, short mval[2])
/* ----------------- Scaling ----------------------- */
-void initTimeScale(TransInfo *t)
+void initTimeScale(TransInfo *t)
{
t->mode = TFM_TIME_SCALE;
t->transform = TimeScale;
-
+
initMouseInputMode(t, &t->mouse, INPUT_NONE);
t->helpline = HLP_SPRING; /* set manually because we don't use a predefined input */
t->flag |= T_NULL_ONE;
t->num.flag |= NUM_NULL_ONE;
-
+
/* num-input has max of (n-1) */
t->idx_max = 0;
t->num.flag = 0;
t->num.idx_max = t->idx_max;
-
+
/* initialise snap like for everything else */
- t->snap[0] = 0.0f;
+ t->snap[0] = 0.0f;
t->snap[1] = t->snap[2] = 1.0f;
}
static void headerTimeScale(TransInfo *t, char *str) {
char tvec[60];
-
+
if (hasNumInput(&t->num))
outputNumInput(&(t->num), tvec);
else
sprintf(&tvec[0], "%.4f", t->values[0]);
-
+
sprintf(str, "ScaleX: %s", &tvec[0]);
}
@@ -4697,74 +5413,63 @@ static void applyTimeScale(TransInfo *t) {
Scene *scene = t->scene;
TransData *td = t->data;
int i;
-
+
const short autosnap= getAnimEdit_SnapMode(t);
const short doTime= getAnimEdit_DrawTime(t);
const double secf= FPS;
-
-
+
+
for (i = 0 ; i < t->total; i++, td++) {
- /* it is assumed that td->ob is a pointer to the object,
- * whose active action is where this keyframe comes from
+ /* it is assumed that td->extra is a pointer to the AnimData,
+ * whose active action is where this keyframe comes from
+ * (this is only valid when not in NLA)
*/
- Object *ob= td->ob;
+ AnimData *adt= (t->spacetype != SPACE_NLA) ? td->extra : NULL;
float startx= CFRA;
float fac= t->values[0];
-
+
if (autosnap == SACTSNAP_STEP) {
if (doTime)
fac= (float)( floor(fac/secf + 0.5f) * secf );
else
fac= (float)( floor(fac + 0.5f) );
}
-
- /* check if any need to apply nla-scaling */
- if (ob)
- startx= get_action_frame(ob, startx);
-
+
+ /* check if any need to apply nla-mapping */
+ if (adt)
+ startx= BKE_nla_tweakedit_remap(adt, startx, NLATIME_CONVERT_UNMAP);
+
/* now, calculate the new value */
*(td->val) = td->ival - startx;
*(td->val) *= fac;
*(td->val) += startx;
-
+
/* apply nearest snapping */
- doAnimEdit_SnapFrame(t, td, ob, autosnap);
+ doAnimEdit_SnapFrame(t, td, adt, autosnap);
}
}
-int TimeScale(TransInfo *t, short mval[2])
+int TimeScale(TransInfo *t, short mval[2])
{
float cval, sval;
float deltax, startx;
float width= 0.0f;
char str[200];
-
+
sval= t->imval[0];
cval= mval[0];
-
- // XXX ewww... we need a better factor!
-#if 0 // TRANSFORM_FIX_ME
- switch (t->spacetype) {
- case SPACE_ACTION:
- width= ACTWIDTH;
- break;
- case SPACE_NLA:
- width= NLAWIDTH;
- break;
- }
-#endif
-
+
/* calculate scaling factor */
startx= sval-(width/2+(t->ar->winx)/2);
deltax= cval-(width/2+(t->ar->winx)/2);
t->values[0] = deltax / startx;
-
+
/* handle numeric-input stuff */
t->vec[0] = t->values[0];
applyNumInput(&t->num, &t->vec[0]);
t->values[0] = t->vec[0];
headerTimeScale(t, str);
-
+
applyTimeScale(t);
recalcData(t);
@@ -4803,7 +5508,7 @@ void NDofTransform()
maxval = val;
}
}
-
+
switch(axis)
{
case -1:
@@ -4824,7 +5529,7 @@ void NDofTransform()
default:
printf("ndof: what we are doing here ?");
}
-
+
if (mode != 0)
{
initTransform(mode, CTX_NDOF);
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 534f142734a..66d5ecd4d66 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -30,7 +30,9 @@
#ifndef TRANSFORM_H
#define TRANSFORM_H
-#include "BIF_transform.h"
+#include "ED_transform.h"
+
+#include "BLI_editVert.h"
/* ************************** Types ***************************** */
@@ -47,6 +49,7 @@ struct bConstraint;
struct BezTriple;
struct wmOperatorType;
struct wmOperator;
+struct wmWindowManager;
struct bContext;
struct wmEvent;
struct wmTimer;
@@ -71,7 +74,7 @@ typedef struct NumInput {
/*
The ctrl value has different meaning:
0 : No value has been typed
-
+
otherwise, |value| - 1 is where the cursor is located after the period
Positive : number is positive
Negative : number is negative
@@ -100,7 +103,7 @@ typedef struct TransCon {
float mtx[3][3]; /* Matrix of the Constraint space */
float imtx[3][3]; /* Inverse Matrix of the Constraint space */
float pmtx[3][3]; /* Projection Constraint Matrix (same as imtx with some axis == 0) */
- float center[3]; /* transformation center to define where to draw the view widget
+ float center[3]; /* transformation center to define where to draw the view widget
ALWAYS in global space. Unlike the transformation center */
short imval[2]; /* initial mouse value for visual calculation */
/* the one in TransInfo is not garanty to stay the same (Rotates change it) */
@@ -138,7 +141,7 @@ typedef struct TransDataExtension {
float iquat[4]; /* Initial rotation quaternion */
float *size; /* Size of the data to transform (Faculative) */
float isize[3]; /* Initial size */
- float obmat[4][4]; /* Object matrix */
+ float obmat[4][4]; /* Object matrix */
} TransDataExtension;
typedef struct TransData2D {
@@ -158,9 +161,51 @@ typedef struct TransDataSeq {
int flag; /* a copy of seq->flag that may be modified for nested strips */
short start_offset; /* use this so we can have transform data at the strips start, but apply correctly to the start frame */
short sel_flag; /* one of SELECT, SEQ_LEFTSEL and SEQ_RIGHTSEL */
-
+
} TransDataSeq;
+/* for NLA transform (stored in td->extra pointer) */
+typedef struct TransDataNla {
+ ID *id; /* ID-block NLA-data is attached to */
+
+ struct NlaTrack *oldTrack; /* Original NLA-Track that the strip belongs to */
+ struct NlaTrack *nlt; /* Current NLA-Track that the strip belongs to */
+
+ struct NlaStrip *strip; /* NLA-strip this data represents */
+
+ /* dummy values for transform to write in - must have 3 elements... */
+ float h1[3]; /* start handle */
+ float h2[3]; /* end handle */
+
+ int trackIndex; /* index of track that strip is currently in */
+ int handle; /* handle-index: 0 for dummy entry, -1 for start, 1 for end, 2 for both ends */
+} TransDataNla;
+
+struct LinkNode;
+struct EditEdge;
+struct EditVert;
+struct GHash;
+typedef struct TransDataSlideUv {
+ float origuv[2];
+ float *uv_up, *uv_down;
+ //float *fuv[4];
+ struct LinkNode *fuv_list;
+} TransDataSlideUv;
+
+typedef struct TransDataSlideVert {
+ struct EditEdge *up, *down;
+ struct EditVert origvert;
+} TransDataSlideVert;
+
+typedef struct SlideData {
+ TransDataSlideUv *slideuv, *suv_last;
+ int totuv, uvlay_tot;
+ struct GHash *vhash, **uvhash;
+ struct EditVert *nearest;
+ struct LinkNode *edgelist, *vertlist;
+ short start[2], end[2];
+} SlideData;
+
typedef struct TransData {
float dist; /* Distance needed to affect element (for Proportionnal Editing) */
float rdist; /* Distance to the nearest element (for Proportionnal Editing) */
@@ -181,16 +226,18 @@ typedef struct TransData {
void *extra; /* extra data (mirrored element pointer, in editmode mesh to EditVert) (editbone for roll fixing) (...) */
short flag; /* Various flags */
short protectflag; /* If set, copy of Object or PoseChannel protection */
+ int rotOrder; /* rotation order (for eulers), as defined in BLI_arithb.h */
} TransData;
typedef struct MouseInput {
void (*apply)(struct TransInfo *, struct MouseInput *, short [2], float [3]);
-
+
short imval[2]; /* initial mouse position */
- char precision;
+ char precision;
short precision_mval[2]; /* mouse position when precision key was pressed */
int center[2];
float factor;
+ void *data; /* additional data, if needed by the particular function */
} MouseInput;
typedef struct TransInfo {
@@ -224,7 +271,7 @@ typedef struct TransInfo {
short idx_max; /* maximum index on the input vector */
float snap[3]; /* Snapping Gears */
char frame_side; /* Mouse side of the cfra, 'L', 'R' or 'B' */
-
+
float viewmat[4][4]; /* copy from G.vd, prevents feedback, */
float viewinv[4][4]; /* and to make sure we don't have to */
float persmat[4][4]; /* access G.vd from other space types */
@@ -233,17 +280,18 @@ typedef struct TransInfo {
short around;
char spacetype; /* spacetype where transforming is */
char helpline; /* helpline modes (not to be confused with hotline) */
-
+
float vec[3]; /* translation, to show for widget */
float mat[3][3]; /* rot/rescale, to show for widget */
-
+
char *undostr; /* if set, uses this string for undo */
float spacemtx[3][3]; /* orientation matrix of the current space */
char spacename[32]; /* name of the current space */
-
+
struct Object *poseobj; /* if t->flag & T_POSE, this denotes pose object */
-
+
void *customData; /* Per Transform custom data */
+ void (*customFree)(struct TransInfo *); /* if a special free function is needed */
/*************** NEW STUFF *********************/
@@ -288,7 +336,7 @@ typedef struct TransInfo {
#define T_POSE (1 << 2)
#define T_TEXTURE (1 << 3)
#define T_CAMERA (1 << 4)
- // trans on points, having no rotation/scale
+ // trans on points, having no rotation/scale
#define T_POINTS (1 << 6)
// for manipulator exceptions, like scaling using center point, drawing help lines
#define T_USES_MANIPULATOR (1 << 7)
@@ -304,7 +352,7 @@ typedef struct TransInfo {
#define T_V3D_ALIGN (1 << 14)
/* for 2d views like uv or ipo */
-#define T_2D_EDIT (1 << 15)
+#define T_2D_EDIT (1 << 15)
#define T_CLIP_UV (1 << 16)
#define T_FREE_CUSTOMDATA (1 << 17)
@@ -447,6 +495,9 @@ int BoneEnvelope(TransInfo *t, short mval[2]);
void initBoneRoll(TransInfo *t);
int BoneRoll(TransInfo *t, short mval[2]);
+void initEdgeSlide(TransInfo *t);
+int EdgeSlide(TransInfo *t, short mval[2]);
+
void initTimeTranslate(TransInfo *t);
int TimeTranslate(TransInfo *t, short mval[2]);
@@ -465,9 +516,11 @@ int Mirror(TransInfo *t, short mval[2]);
void initAlign(TransInfo *t);
int Align(TransInfo *t, short mval[2]);
-
void drawPropCircle(const struct bContext *C, TransInfo *t);
+void transform_modal_keymap(struct wmWindowManager *wm);
+
+
/*********************** transform_conversions.c ********** */
struct ListBase;
@@ -481,8 +534,7 @@ void flushTransNodes(TransInfo *t);
void flushTransSeq(TransInfo *t);
/*********************** exported from transform_manipulator.c ********** */
-void draw_manipulator_ext(struct ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3]);
-int calc_manipulator_stats(struct ScrArea *sa);
+int calc_manipulator_stats(const struct bContext *C);
float get_drawsize(struct ARegion *ar, float *co);
/*********************** TransData Creation and General Handling *********** */
@@ -493,8 +545,9 @@ void special_aftertrans_update(TransInfo *t);
void transform_autoik_update(TransInfo *t, short mode);
+int count_set_pose_transflags(int *out_mode, short around, struct Object *ob);
+
/* auto-keying stuff used by special_aftertrans_update */
-short autokeyframe_cfra_can_key(struct Scene *scene, struct Object *ob);
void autokeyframe_ob_cb_func(struct Scene *scene, struct View3D *v3d, struct Object *ob, int tmode);
void autokeyframe_pose_cb_func(struct Scene *scene, struct View3D *v3d, struct Object *ob, int tmode, short targetless_ik);
@@ -554,7 +607,8 @@ typedef enum {
INPUT_HORIZONTAL_RATIO,
INPUT_HORIZONTAL_ABSOLUTE,
INPUT_VERTICAL_RATIO,
- INPUT_VERTICAL_ABSOLUTE
+ INPUT_VERTICAL_ABSOLUTE,
+ INPUT_CUSTOM_RATIO
} MouseInputMode;
void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2]);
@@ -562,6 +616,8 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, struct wmEvent *event);
void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, short mval[2], float output[3]);
+void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2]);
+
/*********************** Generics ********************************/
int initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, struct wmEvent *event);
@@ -593,8 +649,6 @@ void calculatePropRatio(TransInfo *t);
void getViewVector(TransInfo *t, float coord[3], float vec[3]);
-TransInfo * BIF_GetTransInfo(void);
-
/*********************** NumInput ********************************/
void initNumInput(NumInput *n);
@@ -631,7 +685,7 @@ int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3])
int addMatrixSpace(struct bContext *C, float mat[3][3], char name[]);
int addObjectSpace(struct bContext *C, struct Object *ob);
-void applyTransformOrientation(struct bContext *C, TransInfo *t);
+void applyTransformOrientation(const struct bContext *C, TransInfo *t);
#define ORIENTATION_NONE 0
@@ -640,10 +694,12 @@ void applyTransformOrientation(struct bContext *C, TransInfo *t);
#define ORIENTATION_EDGE 3
#define ORIENTATION_FACE 4
-int getTransformOrientation(struct bContext *C, float normal[3], float plane[3], int activeOnly);
+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 7f47bfd25af..158ea98c090 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -183,7 +183,7 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
VECCOPY(vec, t->auto_values);
constraintAutoValues(t, vec);
}
-
+
if (t->con.mode & CON_AXIS0) {
pvec[i++] = vec[0];
}
@@ -199,10 +199,10 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3]) {
float norm[3], vec[3], factor;
-
+
if(in[0]==0.0f && in[1]==0.0f && in[2]==0.0f)
return;
-
+
/* For when view is parallel to constraint... will cause NaNs otherwise
So we take vertical motion in 3D space and apply it to the
constraint axis. Nice for camera grab + MMB */
@@ -212,30 +212,30 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
/* since camera distance is quite relative, use quadratic relationship. holding shift can compensate */
if(factor<0.0f) factor*= -factor;
else factor*= factor;
-
+
VECCOPY(out, axis);
Normalize(out);
VecMulf(out, -factor); /* -factor makes move down going backwards */
}
else {
float cb[3], ab[3];
-
+
VECCOPY(out, axis);
-
+
/* Get view vector on axis to define a plane */
VecAddf(vec, t->con.center, in);
getViewVector(t, vec, norm);
-
+
Crossf(vec, norm, axis);
-
+
/* Project input vector on the plane passing on axis */
Projf(vec, in, vec);
VecSubf(vec, in, vec);
-
+
/* intersect the two lines: axis and norm */
Crossf(cb, vec, norm);
Crossf(ab, axis, norm);
-
+
VecMulf(out, Inpf(cb, ab) / Inpf(ab, ab));
}
}
@@ -262,7 +262,7 @@ static void planeProjection(TransInfo *t, float in[3], float out[3]) {
/*
* Generic callback for constant spacial constraints applied to linear motion
- *
+ *
* The IN vector in projected into the constrained space and then further
* projected along the view vector.
* (in perspective mode, the view vector is relative to the position on screen)
@@ -274,7 +274,7 @@ static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], flo
VECCOPY(out, in);
if (!td && t->con.mode & CON_APPLY) {
Mat3MulVecfl(t->con.pmtx, out);
-
+
// With snap, a projection is alright, no need to correct for view alignment
if ((t->tsnap.status & SNAP_ON) == 0) {
if (getConstraintSpaceDimension(t) == 2) {
@@ -284,7 +284,7 @@ static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], flo
}
else if (getConstraintSpaceDimension(t) == 1) {
float c[3];
-
+
if (t->con.mode & CON_AXIS0) {
VECCOPY(c, t->con.mtx[0]);
}
@@ -303,7 +303,7 @@ static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], flo
/*
* Generic callback for object based spacial constraints applied to linear motion
- *
+ *
* At first, the following is applied to the first data in the array
* The IN vector in projected into the constrained space and then further
* projected along the view vector.
@@ -360,7 +360,7 @@ static void applyObjectConstraintVec(TransInfo *t, TransData *td, float in[3], f
/*
* Generic callback for constant spacial constraints applied to resize motion
- *
+ *
*
*/
@@ -386,7 +386,7 @@ static void applyAxisConstraintSize(TransInfo *t, TransData *td, float smat[3][3
/*
* Callback for object based spacial constraints applied to resize motion
- *
+ *
*
*/
@@ -415,7 +415,7 @@ static void applyObjectConstraintSize(TransInfo *t, TransData *td, float smat[3]
/*
* Generic callback for constant spacial constraints applied to rotations
- *
+ *
* The rotation axis is copied into VEC.
*
* In the case of single axis constraints, the rotation axis is directly the one constrained to.
@@ -457,7 +457,7 @@ static void applyAxisConstraintRot(TransInfo *t, TransData *td, float vec[3], fl
/*
* Callback for object based spacial constraints applied to rotations
- *
+ *
* The rotation axis is copied into VEC.
*
* In the case of single axis constraints, the rotation axis is directly the one constrained to.
@@ -473,7 +473,7 @@ static void applyObjectConstraintRot(TransInfo *t, TransData *td, float vec[3],
{
if (t->con.mode & CON_APPLY) {
int mode = t->con.mode & (CON_AXIS0|CON_AXIS1|CON_AXIS2);
-
+
/* on setup call, use first object */
if (td == NULL) {
td= t->data;
@@ -585,128 +585,6 @@ void setUserConstraint(TransInfo *t, int mode, const char ftext[]) {
t->con.mode |= CON_USER;
}
-/*--------------------- EXTERNAL SETUP CALLS ------------------*/
-
-void BIF_setLocalLockConstraint(char axis, char *text) {
- TransInfo *t = BIF_GetTransInfo();
-
- if (t->total == 0) {
- return;
- }
-
- switch (axis) {
- case 'x':
- setLocalConstraint(t, (CON_AXIS1|CON_AXIS2), text);
- break;
- case 'y':
- setLocalConstraint(t, (CON_AXIS0|CON_AXIS2), text);
- break;
- case 'z':
- setLocalConstraint(t, (CON_AXIS0|CON_AXIS1), text);
- break;
- }
-}
-
-void BIF_setLocalAxisConstraint(char axis, char *text) {
- TransInfo *t = BIF_GetTransInfo();
-
- if (t->total == 0) {
- return;
- }
-
- switch (axis) {
- case 'X':
- setLocalConstraint(t, CON_AXIS0, text);
- break;
- case 'Y':
- setLocalConstraint(t, CON_AXIS1, text);
- break;
- case 'Z':
- setLocalConstraint(t, CON_AXIS2, text);
- break;
- }
-}
-
-/* text is optional, for header print */
-void BIF_setSingleAxisConstraint(float vec[3], char *text) {
- TransInfo *t = BIF_GetTransInfo();
- float space[3][3], v[3];
-
- if (t->total == 0) {
- return;
- }
-
- VECCOPY(space[0], vec);
-
- v[0] = vec[2];
- v[1] = vec[0];
- v[2] = vec[1];
-
- Crossf(space[1], vec, v);
- Crossf(space[2], vec, space[1]);
- Mat3Ortho(space);
-
- Mat3CpyMat3(t->con.mtx, space);
- t->con.mode = CON_AXIS0;
-
- getConstraintMatrix(t);
-
- startConstraint(t);
-
- /* start copying with an offset of 1, to reserve a spot for the SPACE char */
- if(text)
- {
- strncpy(t->con.text+1, text, 48); /* 50 in struct */
- }
- else
- {
- t->con.text[1] = '\0'; /* No text */
- }
-
- t->con.drawExtra = NULL;
- t->con.applyVec = applyAxisConstraintVec;
- t->con.applySize = applyAxisConstraintSize;
- t->con.applyRot = applyAxisConstraintRot;
- t->redraw = 1;
-}
-
-void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text) {
- TransInfo *t = BIF_GetTransInfo();
- float space[3][3];
-
- if (t->total == 0) {
- return;
- }
-
- VECCOPY(space[0], vec1);
- VECCOPY(space[1], vec2);
- Crossf(space[2], space[0], space[1]);
- Mat3Ortho(space);
-
- Mat3CpyMat3(t->con.mtx, space);
- t->con.mode = CON_AXIS0|CON_AXIS1;
-
- getConstraintMatrix(t);
-
- startConstraint(t);
-
- /* start copying with an offset of 1, to reserve a spot for the SPACE char */
- if(text)
- {
- strncpy(t->con.text+1, text, 48); /* 50 in struct */
- }
- else
- {
- t->con.text[1] = '\0'; /* No text */
- }
-
- t->con.drawExtra = NULL;
- t->con.applyVec = applyAxisConstraintVec;
- t->con.applySize = applyAxisConstraintSize;
- t->con.applyRot = applyAxisConstraintRot;
- t->redraw = 1;
-}
-
/*----------------- DRAWING CONSTRAINTS -------------------*/
void drawConstraint(const struct bContext *C, TransInfo *t)
@@ -721,10 +599,10 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
return;
if (t->flag & T_NO_CONSTRAINT)
return;
-
+
/* nasty exception for Z constraint in camera view */
// TRANSFORM_FIX_ME
-// if((t->flag & T_OBJECT) && G.vd->camera==OBACT && G.vd->persp==V3D_CAMOB)
+// if((t->flag & T_OBJECT) && G.vd->camera==OBACT && G.vd->persp==V3D_CAMOB)
// return;
if (tc->drawExtra) {
@@ -742,17 +620,17 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
drawLine(t, tc->center, tc->mtx[2], 'z', 0);
glColor3ubv((GLubyte *)col2);
-
+
glDisable(GL_DEPTH_TEST);
setlinestyle(1);
- glBegin(GL_LINE_STRIP);
- glVertex3fv(tc->center);
- glVertex3fv(vec);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(tc->center);
+ glVertex3fv(vec);
glEnd();
setlinestyle(0);
// TRANSFORM_FIX_ME
//if(G.vd->zbuf)
- glEnable(GL_DEPTH_TEST);
+ glEnable(GL_DEPTH_TEST);
}
if (tc->mode & CON_AXIS0) {
@@ -775,7 +653,7 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
float tmat[4][4], imat[4][4];
UI_ThemeColor(TH_GRID);
-
+
if(t->spacetype == SPACE_VIEW3D && rv3d != NULL)
{
Mat4CpyMat4(tmat, rv3d->viewmat);
@@ -804,20 +682,9 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
set_inverted_drawing(1);
drawcircball(GL_LINE_LOOP, t->center, t->prop_size, imat);
set_inverted_drawing(0);
-
- glPopMatrix();
- }
-}
-void BIF_getPropCenter(float *center)
-{
- TransInfo *t = BIF_GetTransInfo();
-
- if (t && t->flag & T_PROP_EDIT) {
- VECCOPY(center, t->center);
+ glPopMatrix();
}
- else
- center[0] = center[1] = center[2] = 0.0f;
}
static void drawObjectConstraint(TransInfo *t) {
@@ -839,7 +706,7 @@ static void drawObjectConstraint(TransInfo *t) {
if (t->con.mode & CON_AXIS2) {
drawLine(t, td->ob->obmat[3], td->axismtx[2], 'z', DRAWLIGHT);
}
-
+
td++;
for(i=1;i<t->total;i++,td++) {
@@ -954,12 +821,12 @@ static void setNearestAxis3d(TransInfo *t)
float mvec[3], axis[3], proj[3];
float len[3];
int i, icoord[2];
-
+
/* calculate mouse movement */
mvec[0] = (float)(t->mval[0] - t->con.imval[0]);
mvec[1] = (float)(t->mval[1] - t->con.imval[1]);
mvec[2] = 0.0f;
-
+
/* we need to correct axis length for the current zoomlevel of view,
this to prevent projected values to be clipped behind the camera
and to overflow the short integers.
@@ -972,12 +839,12 @@ static void setNearestAxis3d(TransInfo *t)
for (i = 0; i<3; i++) {
VECCOPY(axis, t->con.mtx[i]);
-
+
VecMulf(axis, zfac);
/* now we can project to get window coordinate */
VecAddf(axis, axis, t->con.center);
projectIntView(t, axis, icoord);
-
+
axis[0] = (float)(icoord[0] - t->center2d[0]);
axis[1] = (float)(icoord[1] - t->center2d[1]);
axis[2] = 0.0f;
@@ -1034,13 +901,13 @@ void setNearestAxis(TransInfo *t)
/* constraint setting - depends on spacetype */
if (t->spacetype == SPACE_VIEW3D) {
/* 3d-view */
- setNearestAxis3d(t);
+ setNearestAxis3d(t);
}
else {
/* assume that this means a 2D-Editor */
setNearestAxis2d(t);
}
-
+
getConstraintMatrix(t);
}
@@ -1083,7 +950,7 @@ int isLockConstraint(TransInfo *t) {
/*
* Returns the dimension of the constraint space.
- *
+ *
* For that reason, the flags always needs to be set to properly evaluate here,
* even if they aren't actually used in the callback function. (Which could happen
* for weird constraints not yet designed. Along a path for example.)
@@ -1107,7 +974,7 @@ int getConstraintSpaceDimension(TransInfo *t)
Someone willing to do it criptically could do the following instead:
return t->con & (CON_AXIS0|CON_AXIS1|CON_AXIS2);
-
+
Based on the assumptions that the axis flags are one after the other and start at 1
*/
}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index bb1f09ec44e..543bbf13fcc 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -90,6 +90,7 @@
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_sequence.h"
@@ -100,21 +101,17 @@
#include "BKE_context.h"
#include "BKE_report.h"
-//#include "BIF_editaction.h"
//#include "BIF_editview.h"
//#include "BIF_editlattice.h"
//#include "BIF_editconstraint.h"
//#include "BIF_editmesh.h"
-//#include "BIF_editnla.h"
//#include "BIF_editsima.h"
//#include "BIF_editparticle.h"
#include "BIF_gl.h"
-//#include "BIF_keyframing.h"
//#include "BIF_poseobject.h"
//#include "BIF_meshtools.h"
//#include "BIF_mywindow.h"
//#include "BIF_resources.h"
-#include "BIF_retopo.h"
//#include "BIF_screen.h"
//#include "BIF_space.h"
//#include "BIF_toolbox.h"
@@ -126,20 +123,16 @@
#include "ED_keyframing.h"
#include "ED_keyframes_edit.h"
#include "ED_object.h"
+#include "ED_markers.h"
#include "ED_mesh.h"
+#include "ED_retopo.h"
#include "ED_types.h"
#include "ED_uvedit.h"
#include "ED_view3d.h"
#include "UI_view2d.h"
-//#include "BSE_drawipo.h"
//#include "BSE_edit.h"
-//#include "BSE_editipo.h"
-//#include "BSE_editipo_types.h"
-//#include "BSE_editaction_types.h"
-
-//#include "BDR_drawaction.h" // list of keyframes in action
//#include "BDR_editobject.h" // reset_slowparents()
//#include "BDR_gpencil.h"
@@ -223,7 +216,7 @@ void sort_trans_data_dist(TransInfo *t) {
qsort_trans_data(t, start, t->data + t->total - 1);
}
-static void sort_trans_data(TransInfo *t)
+static void sort_trans_data(TransInfo *t)
{
TransData *sel, *unsel;
TransData temp;
@@ -259,16 +252,16 @@ static void set_prop_dist(TransInfo *t, short with_dist)
int a;
for(a=0, tob= t->data; a<t->total; a++, tob++) {
-
+
tob->rdist= 0.0f; // init, it was mallocced
-
+
if((tob->flag & TD_SELECTED)==0) {
TransData *td;
int i;
float dist, vec[3];
tob->rdist = -1.0f; // signal for next loop
-
+
for (i = 0, td= t->data; i < t->total; i++, td++) {
if(td->flag & TD_SELECTED) {
VecSubf(vec, tob->center, td->center);
@@ -286,7 +279,7 @@ static void set_prop_dist(TransInfo *t, short with_dist)
if (with_dist) {
tob->dist = tob->rdist;
}
- }
+ }
}
}
@@ -301,9 +294,9 @@ static void createTransTexspace(bContext *C, TransInfo *t)
Object *ob;
ID *id;
int *texflag;
-
+
ob = OBACT;
-
+
if (ob == NULL) { // Shouldn't logically happen, but still...
t->total = 0;
return;
@@ -318,20 +311,20 @@ static void createTransTexspace(bContext *C, TransInfo *t)
t->total = 1;
td= t->data= MEM_callocN(sizeof(TransData), "TransTexspace");
td->ext= t->ext= MEM_callocN(sizeof(TransDataExtension), "TransTexspace");
-
+
td->flag= TD_SELECTED;
VECCOPY(td->center, ob->obmat[3]);
td->ob = ob;
-
+
Mat3CpyMat4(td->mtx, ob->obmat);
Mat3CpyMat4(td->axismtx, ob->obmat);
Mat3Ortho(td->axismtx);
Mat3Inv(td->smtx, td->mtx);
-
+
if (give_obdata_texspace(ob, &texflag, &td->loc, &td->ext->size, &td->ext->rot)) {
*texflag &= ~AUTOSPACE;
}
-
+
VECCOPY(td->iloc, td->loc);
VECCOPY(td->ext->irot, td->ext->rot);
VECCOPY(td->ext->isize, td->ext->size);
@@ -378,7 +371,7 @@ static void createTransEdge(bContext *C, TransInfo *t) {
td->loc= NULL;
if (eed->f & SELECT)
td->flag= TD_SELECTED;
- else
+ else
td->flag= 0;
@@ -407,14 +400,14 @@ static void createTransEdge(bContext *C, TransInfo *t) {
static bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan)
{
bConstraint *con= pchan->constraints.first;
-
+
for(;con; con= con->next) {
if(con->type==CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data= con->data;
-
- if(data->tar==NULL)
+
+ if(data->tar==NULL)
return data;
- if(data->tar->type==OB_ARMATURE && data->subtarget[0]==0)
+ if(data->tar->type==OB_ARMATURE && data->subtarget[0]==0)
return data;
}
}
@@ -426,67 +419,67 @@ static short apply_targetless_ik(Object *ob)
bPoseChannel *pchan, *parchan, *chanlist[256];
bKinematicConstraint *data;
int segcount, apply= 0;
-
+
/* now we got a difficult situation... we have to find the
- target-less IK pchans, and apply transformation to the all
+ target-less IK pchans, and apply transformation to the all
pchans that were in the chain */
-
+
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
data= has_targetless_ik(pchan);
if(data && (data->flag & CONSTRAINT_IK_AUTO)) {
-
+
/* fill the array with the bones of the chain (armature.c does same, keep it synced) */
segcount= 0;
-
+
/* exclude tip from chain? */
if(!(data->flag & CONSTRAINT_IK_TIP))
parchan= pchan->parent;
else
parchan= pchan;
-
+
/* Find the chain's root & count the segments needed */
for (; parchan; parchan=parchan->parent){
chanlist[segcount]= parchan;
segcount++;
-
+
if(segcount==data->rootbone || segcount>255) break; // 255 is weak
}
for(;segcount;segcount--) {
Bone *bone;
float rmat[4][4], tmat[4][4], imat[4][4];
-
+
/* pose_mat(b) = pose_mat(b-1) * offs_bone * channel * constraint * IK */
/* we put in channel the entire result of rmat= (channel * constraint * IK) */
/* pose_mat(b) = pose_mat(b-1) * offs_bone * rmat */
/* rmat = pose_mat(b) * inv( pose_mat(b-1) * offs_bone ) */
-
+
parchan= chanlist[segcount-1];
bone= parchan->bone;
bone->flag |= BONE_TRANSFORM; /* ensures it gets an auto key inserted */
-
+
if(parchan->parent) {
Bone *parbone= parchan->parent->bone;
float offs_bone[4][4];
-
+
/* offs_bone = yoffs(b-1) + root(b) + bonemat(b) */
Mat4CpyMat3(offs_bone, bone->bone_mat);
-
+
/* The bone's root offset (is in the parent's coordinate system) */
VECCOPY(offs_bone[3], bone->head);
-
+
/* Get the length translation of parent (length along y axis) */
offs_bone[3][1]+= parbone->length;
-
+
/* pose_mat(b-1) * offs_bone */
if(parchan->bone->flag & BONE_HINGE) {
/* the rotation of the parent restposition */
Mat4CpyMat4(rmat, parbone->arm_mat); /* rmat used as temp */
-
+
/* the location of actual parent transform */
VECCOPY(rmat[3], offs_bone[3]);
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
Mat4MulVecfl(parchan->parent->pose_mat, rmat[3]);
-
+
Mat4MulMat4(tmat, offs_bone, rmat);
}
else if(parchan->bone->flag & BONE_NO_SCALE) {
@@ -495,7 +488,7 @@ static short apply_targetless_ik(Object *ob)
}
else
Mat4MulMat4(tmat, offs_bone, parchan->parent->pose_mat);
-
+
Mat4Invert(imat, tmat);
}
else {
@@ -506,21 +499,32 @@ static short apply_targetless_ik(Object *ob)
}
/* result matrix */
Mat4MulMat4(rmat, parchan->pose_mat, imat);
-
+
/* apply and decompose, doesn't work for constraints or non-uniform scale well */
{
- float rmat3[3][3], qmat[3][3], imat[3][3], smat[3][3];
-
+ float rmat3[3][3], qrmat[3][3], imat[3][3], smat[3][3];
+
Mat3CpyMat4(rmat3, rmat);
- /* quaternion */
- Mat3ToQuat(rmat3, parchan->quat);
+ /* rotation */
+ if (parchan->rotmode > 0)
+ Mat3ToEulO(rmat3, parchan->eul, parchan->rotmode);
+ else if (parchan->rotmode == PCHAN_ROT_AXISANGLE)
+ Mat3ToAxisAngle(rmat3, &parchan->quat[1], &parchan->quat[0]);
+ else
+ Mat3ToQuat(rmat3, parchan->quat);
/* for size, remove rotation */
/* causes problems with some constraints (so apply only if needed) */
if (data->flag & CONSTRAINT_IK_STRETCH) {
- QuatToMat3(parchan->quat, qmat);
- Mat3Inv(imat, qmat);
+ if (parchan->rotmode > 0)
+ EulOToMat3(parchan->eul, parchan->rotmode, qrmat);
+ else if (parchan->rotmode == PCHAN_ROT_AXISANGLE)
+ AxisAngleToMat3(&parchan->quat[1], parchan->quat[0], qrmat);
+ else
+ QuatToMat3(parchan->quat, qrmat);
+
+ Mat3Inv(imat, qrmat);
Mat3MulMat3(smat, rmat3, imat);
Mat3ToSize(smat, parchan->size);
}
@@ -529,14 +533,14 @@ static short apply_targetless_ik(Object *ob)
/* as it is IK shouldn't affect location directly */
/* VECCOPY(parchan->loc, rmat[3]); */
}
-
+
}
-
+
apply= 1;
data->flag &= ~CONSTRAINT_IK_AUTO;
}
- }
-
+ }
+
return apply;
}
@@ -549,10 +553,10 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
VECCOPY(vec, pchan->pose_mat[3]);
VECCOPY(td->center, vec);
-
+
td->ob = ob;
td->flag = TD_SELECTED;
- if (pchan->rotmode == PCHAN_ROT_QUAT)
+ if (pchan->rotmode == PCHAN_ROT_QUAT)
{
td->flag |= TD_USEQUAT;
}
@@ -560,43 +564,46 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
{
td->flag |= TD_NOCENTER;
}
-
+
if (bone->flag & BONE_TRANSFORM_CHILD)
{
td->flag |= TD_NOCENTER;
td->flag |= TD_NO_LOC;
}
-
+
td->protectflag= pchan->protectflag;
-
+
td->loc = pchan->loc;
VECCOPY(td->iloc, pchan->loc);
-
+
td->ext->size= pchan->size;
VECCOPY(td->ext->isize, pchan->size);
-
- if (pchan->rotmode) {
+
+ if (pchan->rotmode > 0) {
td->ext->rot= pchan->eul;
td->ext->quat= NULL;
VECCOPY(td->ext->irot, pchan->eul);
+ td->rotOrder= pchan->rotmode;
}
else {
td->ext->rot= NULL;
td->ext->quat= pchan->quat;
QUATCOPY(td->ext->iquat, pchan->quat);
+ td->rotOrder= pchan->rotmode;
}
+
/* proper way to get parent transform + own transform + constraints transform */
Mat3CpyMat4(omat, ob->obmat);
-
- if (pchan->parent) {
- if(pchan->bone->flag & BONE_HINGE)
- Mat3CpyMat4(pmat, pchan->parent->bone->arm_mat);
- else
+
+ if (pchan->parent) {
+ if(pchan->bone->flag & BONE_HINGE)
+ Mat3CpyMat4(pmat, pchan->parent->bone->arm_mat);
+ else
Mat3CpyMat4(pmat, pchan->parent->pose_mat);
-
+
if (constraints_list_needinv(t, &pchan->constraints)) {
Mat3CpyMat4(tmat, pchan->constinv);
Mat3Inv(cmat, tmat);
@@ -611,20 +618,20 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
Mat3Inv(cmat, tmat);
Mat3MulSerie(td->mtx, pchan->bone->bone_mat, omat, cmat, 0,0,0,0,0); // dang mulserie swaps args
}
- else
- Mat3MulMat3(td->mtx, omat, pchan->bone->bone_mat); // Mat3MulMat3 has swapped args!
+ else
+ Mat3MulMat3(td->mtx, omat, pchan->bone->bone_mat); // Mat3MulMat3 has swapped args!
}
-
+
Mat3Inv(td->smtx, td->mtx);
-
+
/* for axismat we use bone's own transform */
Mat3CpyMat4(pmat, pchan->pose_mat);
Mat3MulMat3(td->axismtx, omat, pmat);
Mat3Ortho(td->axismtx);
-
+
if (t->mode==TFM_BONESIZE) {
bArmature *arm= t->poseobj->data;
-
+
if(arm->drawtype==ARM_ENVELOPE) {
td->loc= NULL;
td->val= &bone->dist;
@@ -637,7 +644,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->val= NULL;
}
}
-
+
/* in this case we can do target-less IK grabbing */
if (t->mode==TFM_TRANSLATION) {
bKinematicConstraint *data= has_targetless_ik(pchan);
@@ -651,27 +658,27 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->loc = data->grabtarget;
VECCOPY(td->iloc, td->loc);
data->flag |= CONSTRAINT_IK_AUTO;
-
+
/* only object matrix correction */
Mat3CpyMat3 (td->mtx, omat);
Mat3Inv (td->smtx, td->mtx);
}
}
-
+
/* store reference to first constraint */
td->con= pchan->constraints.first;
}
-static void bone_children_clear_transflag(TransInfo *t, ListBase *lb)
+static void bone_children_clear_transflag(int mode, short around, ListBase *lb)
{
Bone *bone= lb->first;
-
+
for(;bone;bone= bone->next) {
if((bone->flag & BONE_HINGE) && (bone->flag & BONE_CONNECTED))
{
bone->flag |= BONE_HINGE_CHILD_TRANSFORM;
}
- else if (bone->flag & BONE_TRANSFORM && (t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL)
+ else if (bone->flag & BONE_TRANSFORM && (mode == TFM_ROTATION || mode == TFM_TRACKBALL) && around == V3D_LOCAL)
{
bone->flag |= BONE_TRANSFORM_CHILD;
}
@@ -680,69 +687,75 @@ static void bone_children_clear_transflag(TransInfo *t, ListBase *lb)
bone->flag &= ~BONE_TRANSFORM;
}
- bone_children_clear_transflag(t, &bone->childbase);
+ bone_children_clear_transflag(mode, around, &bone->childbase);
}
}
/* sets transform flags in the bones, returns total */
-static void set_pose_transflags(TransInfo *t, Object *ob)
+int count_set_pose_transflags(int *out_mode, short around, Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
Bone *bone;
- int hastranslation;
-
- t->total= 0;
-
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- bone= pchan->bone;
+ int mode = *out_mode;
+ int hastranslation = 0;
+ int total = 0;
+
+ for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ bone = pchan->bone;
if(bone->layer & arm->layer) {
if(bone->flag & BONE_SELECTED)
bone->flag |= BONE_TRANSFORM;
else
bone->flag &= ~BONE_TRANSFORM;
-
+
bone->flag &= ~BONE_HINGE_CHILD_TRANSFORM;
bone->flag &= ~BONE_TRANSFORM_CHILD;
}
+ else
+ bone->flag &= ~BONE_TRANSFORM;
}
-
+
/* make sure no bone can be transformed when a parent is transformed */
/* since pchans are depsgraph sorted, the parents are in beginning of list */
- if(t->mode!=TFM_BONESIZE) {
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- bone= pchan->bone;
+ if(mode != TFM_BONESIZE) {
+ for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ bone = pchan->bone;
if(bone->flag & BONE_TRANSFORM)
- bone_children_clear_transflag(t, &bone->childbase);
+ bone_children_clear_transflag(mode, around, &bone->childbase);
}
- }
+ }
/* now count, and check if we have autoIK or have to switch from translate to rotate */
- hastranslation= 0;
+ hastranslation = 0;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- bone= pchan->bone;
+ for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ bone = pchan->bone;
if(bone->flag & BONE_TRANSFORM) {
- t->total++;
-
- if(t->mode==TFM_TRANSLATION) {
+ total++;
+
+ if(mode == TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
if(pchan->bone->flag & BONE_HINGE_CHILD_TRANSFORM)
- hastranslation= 1;
+ hastranslation = 1;
}
else if((pchan->protectflag & OB_LOCK_LOC)!=OB_LOCK_LOC)
- hastranslation= 1;
+ hastranslation = 1;
}
else
- hastranslation= 1;
+ hastranslation = 1;
}
}
}
/* if there are no translatable bones, do rotation */
- if(t->mode==TFM_TRANSLATION && !hastranslation)
- t->mode= TFM_ROTATION;
+ if(mode == TFM_TRANSLATION && !hastranslation)
+ {
+ *out_mode = TFM_ROTATION;
+ }
+
+ return total;
}
@@ -752,16 +765,16 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
{
bConstraint *con;
-
+
/* don't bother to search if no valid constraints */
if ((pchan->constflag & (PCHAN_HAS_IK|PCHAN_HAS_TARGET))==0)
return;
-
+
/* check if pchan has ik-constraint */
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 */
@@ -779,7 +792,7 @@ void transform_autoik_update (TransInfo *t, short mode)
{
short *chainlen= &t->settings->autoik_chainlen;
bPoseChannel *pchan;
-
+
/* mode determines what change to apply to chainlen */
if (mode == 1) {
/* mode=1 is from WHEELMOUSEDOWN... increases len */
@@ -789,15 +802,15 @@ void transform_autoik_update (TransInfo *t, short mode)
/* mode==-1 is from WHEELMOUSEUP... decreases len */
if (*chainlen > 0) (*chainlen)--;
}
-
+
/* sanity checks (don't assume t->poseobj is set, or that it is an armature) */
if (ELEM(NULL, t->poseobj, t->poseobj->pose))
return;
-
+
/* apply to all pose-channels */
for (pchan=t->poseobj->pose->chanbase.first; pchan; pchan=pchan->next) {
pchan_autoik_adjust(pchan, *chainlen);
- }
+ }
}
/* frees temporal IKs */
@@ -806,11 +819,11 @@ static void pose_grab_with_ik_clear(Object *ob)
bKinematicConstraint *data;
bPoseChannel *pchan;
bConstraint *con, *next;
-
+
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) {
@@ -837,11 +850,11 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
bKinematicConstraint *data;
bConstraint *con;
bConstraint *targetless = 0;
-
+
/* Sanity check */
- if (pchan == NULL)
+ if (pchan == NULL)
return 0;
-
+
/* 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) {
@@ -858,7 +871,7 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
return 0;
}
}
-
+
con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
BLI_addtail(&pchan->constraints, con);
pchan->constflag |= (PCHAN_HAS_IK|PCHAN_HAS_TARGET); /* for draw, but also for detecting while pose solving */
@@ -871,22 +884,22 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
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)) {
/* here, we set ik-settings for bone from pchan->protectflag */
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;
}
-
+
/* make a copy of maximum chain-length */
data->max_rootbone= data->rootbone;
-
+
return 1;
}
@@ -908,7 +921,7 @@ static short pose_grab_with_ik_children(bPose *pose, Bone *bone)
if (pchan)
added+= pose_grab_with_ik_add(pchan);
}
-
+
return added;
}
@@ -919,12 +932,12 @@ static short pose_grab_with_ik(Object *ob)
bPoseChannel *pchan, *parent;
Bone *bonec;
short tot_ik= 0;
-
- if ((ob==NULL) || (ob->pose==NULL) || (ob->flag & OB_POSEMODE)==0)
+
+ if ((ob==NULL) || (ob->pose==NULL) || (ob->mode & OB_MODE_POSE)==0)
return 0;
-
+
arm = ob->data;
-
+
/* Rule: allow multiple Bones (but they must be selected, and only one ik-solver per chain should get added) */
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if (pchan->bone->layer & arm->layer) {
@@ -937,7 +950,7 @@ static short pose_grab_with_ik(Object *ob)
}
if ((pchan->bone->flag & BONE_CONNECTED)==0 && (bonec == NULL))
continue;
-
+
/* rule: if selected Bone is not a root bone, it gets a temporal IK */
if (pchan->parent) {
/* only adds if there's no IK yet (and no parent bone was selected) */
@@ -955,9 +968,9 @@ static short pose_grab_with_ik(Object *ob)
}
}
}
-
+
return (tot_ik) ? 1 : 0;
-}
+}
/* only called with pose mode active object now */
@@ -969,13 +982,13 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
TransDataExtension *tdx;
short ik_on= 0;
int i;
-
+
t->total= 0;
-
+
/* check validity of state */
arm= get_armature(ob);
if ((arm==NULL) || (ob->pose==NULL)) return;
-
+
if (arm->flag & ARM_RESTPOS) {
if (ELEM(t->mode, TFM_DUMMY, TFM_BONESIZE)==0) {
// XXX use transform operator reports
@@ -989,15 +1002,15 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
ik_on= pose_grab_with_ik(ob);
if (ik_on) t->flag |= T_AUTOIK;
}
-
+
/* set flags and count total (warning, can change transform to rotate) */
- set_pose_transflags(t, ob);
-
- if(t->total==0) return;
+ t->total = count_set_pose_transflags(&t->mode, t->around, ob);
+
+ if(t->total == 0) return;
t->flag |= T_POSE;
t->poseobj= ob; /* we also allow non-active objects to be transformed, in weightpaint */
-
+
/* init trans data */
td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransPoseBone");
tdx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransPoseBoneExt");
@@ -1005,8 +1018,8 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
td->ext= tdx;
td->tdi = NULL;
td->val = NULL;
- }
-
+ }
+
/* use pose channels to fill trans data */
td= t->data;
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
@@ -1015,12 +1028,12 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
td++;
}
}
-
+
if(td != (t->data+t->total)) {
// XXX use transform operator reports
// BKE_report(op->reports, RPT_DEBUG, "Bone selection count error.");
}
-
+
/* initialise initial auto=ik chainlen's? */
if (ik_on) transform_autoik_update(t, 0);
}
@@ -1061,16 +1074,16 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
}
if (!t->total) return;
-
+
Mat3CpyMat4(mtx, t->obedit->obmat);
Mat3Inv(smtx, mtx);
td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransEditBone");
-
+
for (ebo = edbo->first; ebo; ebo = ebo->next)
{
ebo->oldlength = ebo->length; // length==0.0 on extrude, used for scaling radius of bone points
-
+
if(ebo->layer & arm->layer) {
if (t->mode==TFM_BONE_ENVELOPE)
{
@@ -1078,17 +1091,17 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
{
td->val= &ebo->rad_head;
td->ival= *td->val;
-
+
VECCOPY (td->center, ebo->head);
td->flag= TD_SELECTED;
-
+
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
-
+
td->loc = NULL;
td->ext = NULL;
td->tdi = NULL;
-
+
td++;
}
if (ebo->flag & BONE_TIPSEL)
@@ -1097,17 +1110,17 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
td->ival= *td->val;
VECCOPY (td->center, ebo->tail);
td->flag= TD_SELECTED;
-
+
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
-
+
td->loc = NULL;
td->ext = NULL;
td->tdi = NULL;
-
+
td++;
}
-
+
}
else if (t->mode==TFM_BONESIZE)
{
@@ -1127,19 +1140,19 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
}
VECCOPY (td->center, ebo->head);
td->flag= TD_SELECTED;
-
+
/* use local bone matrix */
- VecSubf(delta, ebo->tail, ebo->head);
+ VecSubf(delta, ebo->tail, ebo->head);
vec_roll_to_mat3(delta, ebo->roll, bonemat);
Mat3MulMat3(td->mtx, mtx, bonemat);
Mat3Inv(td->smtx, td->mtx);
-
+
Mat3CpyMat3(td->axismtx, td->mtx);
Mat3Ortho(td->axismtx);
td->ext = NULL;
td->tdi = NULL;
-
+
td++;
}
}
@@ -1150,13 +1163,13 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
td->loc= NULL;
td->val= &(ebo->roll);
td->ival= ebo->roll;
-
+
VECCOPY (td->center, ebo->head);
td->flag= TD_SELECTED;
td->ext = NULL;
td->tdi = NULL;
-
+
td++;
}
}
@@ -1174,7 +1187,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
- VecSubf(delta, ebo->tail, ebo->head);
+ VecSubf(delta, ebo->tail, ebo->head);
vec_roll_to_mat3(delta, ebo->roll, td->axismtx);
if ((ebo->flag & BONE_ROOTSEL) == 0)
@@ -1200,7 +1213,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
- VecSubf(delta, ebo->tail, ebo->head);
+ VecSubf(delta, ebo->tail, ebo->head);
vec_roll_to_mat3(delta, ebo->roll, td->axismtx);
td->extra = ebo; /* to fix roll */
@@ -1220,8 +1233,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
static void createTransMBallVerts(bContext *C, TransInfo *t)
{
- // TRANSFORM_FIX_ME
-#if 0
+ MetaBall *mb = (MetaBall*)t->obedit->data;
MetaElem *ml;
TransData *td;
TransDataExtension *tx;
@@ -1230,24 +1242,24 @@ static void createTransMBallVerts(bContext *C, TransInfo *t)
int propmode = t->flag & T_PROP_EDIT;
/* count totals */
- for(ml= editelems.first; ml; ml= ml->next) {
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
if(ml->flag & SELECT) countsel++;
if(propmode) count++;
}
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
-
- if(propmode) t->total = count;
+
+ if(propmode) t->total = count;
else t->total = countsel;
-
+
td = t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(MBall EditMode)");
tx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "MetaElement_TransExtension");
Mat3CpyMat4(mtx, t->obedit->obmat);
Mat3Inv(smtx, mtx);
-
- for(ml= editelems.first; ml; ml= ml->next) {
+
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
if(propmode || (ml->flag & SELECT)) {
td->loc= &ml->x;
VECCOPY(td->iloc, td->loc);
@@ -1288,7 +1300,6 @@ static void createTransMBallVerts(bContext *C, TransInfo *t)
tx++;
}
}
-#endif
}
/* ********************* curve/surface ********* */
@@ -1361,16 +1372,17 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
int a;
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
-
+ short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
+
/* to be sure */
if(cu->editnurb==NULL) return;
-
+
/* count total of vertices, check identical as in 2nd loop for making transdata! */
for(nu= cu->editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
- if (G.f & G_HIDDENHANDLES) {
+ if (hide_handles) {
if(bezt->f2 & SELECT) countsel+=3;
if(propmode) count+= 3;
} else {
@@ -1393,31 +1405,31 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
}
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
-
- if(propmode) t->total = count;
+
+ if(propmode) t->total = count;
else t->total = countsel;
t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Curve EditMode)");
Mat3CpyMat4(mtx, t->obedit->obmat);
Mat3Inv(smtx, mtx);
-
+
td = t->data;
for(nu= cu->editnurb->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
TransData *head, *tail;
head = tail = td;
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
TransDataCurveHandleFlags *hdata = NULL;
-
+
if( propmode ||
- ((bezt->f2 & SELECT) && (G.f & G_HIDDENHANDLES)) ||
- ((bezt->f1 & SELECT) && (G.f & G_HIDDENHANDLES)==0)
+ ((bezt->f2 & SELECT) && hide_handles) ||
+ ((bezt->f1 & SELECT) && hide_handles == 0)
) {
VECCOPY(td->iloc, bezt->vec[0]);
td->loc= bezt->vec[0];
VECCOPY(td->center, bezt->vec[1]);
- if (G.f & G_HIDDENHANDLES) {
+ if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
} else {
@@ -1427,7 +1439,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
td->ext = NULL;
td->tdi = NULL;
td->val = NULL;
-
+
hdata = initTransDataCurveHandes(td, bezt);
Mat3CpyMat3(td->smtx, smtx);
@@ -1437,7 +1449,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
count++;
tail++;
}
-
+
/* This is the Curve Point, the other two are handles */
if(propmode || (bezt->f2 & SELECT)) {
VECCOPY(td->iloc, bezt->vec[1]);
@@ -1447,7 +1459,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
else td->flag= 0;
td->ext = NULL;
td->tdi = NULL;
-
+
if (t->mode==TFM_CURVE_SHRINKFATTEN) { /* || t->mode==TFM_RESIZE) {*/ /* TODO - make points scale */
td->val = &(bezt->radius);
td->ival = bezt->radius;
@@ -1460,25 +1472,25 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
-
+
if ((bezt->f1&SELECT)==0 && (bezt->f3&SELECT)==0)
/* If the middle is selected but the sides arnt, this is needed */
if (hdata==NULL) { /* if the handle was not saved by the previous handle */
hdata = initTransDataCurveHandes(td, bezt);
}
-
+
td++;
count++;
tail++;
}
if( propmode ||
- ((bezt->f2 & SELECT) && (G.f & G_HIDDENHANDLES)) ||
- ((bezt->f3 & SELECT) && (G.f & G_HIDDENHANDLES)==0)
+ ((bezt->f2 & SELECT) && hide_handles) ||
+ ((bezt->f3 & SELECT) && hide_handles == 0)
) {
VECCOPY(td->iloc, bezt->vec[2]);
td->loc= bezt->vec[2];
VECCOPY(td->center, bezt->vec[1]);
- if (G.f & G_HIDDENHANDLES) {
+ if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
} else {
@@ -1492,7 +1504,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
if (hdata==NULL) { /* if the handle was not saved by the previous handle */
hdata = initTransDataCurveHandes(td, bezt);
}
-
+
Mat3CpyMat3(td->smtx, smtx);
Mat3CpyMat3(td->mtx, mtx);
@@ -1508,7 +1520,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
}
if (propmode && head != tail)
calc_distanceCurveVerts(head, tail-1);
-
+
/* TODO - in the case of tilt and radius we can also avoid allocating the initTransDataCurveHandes
* but for now just dont change handle types */
if (ELEM(t->mode, TFM_CURVE_SHRINKFATTEN, TFM_TILT) == 0)
@@ -1527,7 +1539,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
else td->flag= 0;
td->ext = NULL;
td->tdi = NULL;
-
+
if (t->mode==TFM_CURVE_SHRINKFATTEN || t->mode==TFM_RESIZE) {
td->val = &(bp->radius);
td->ival = bp->radius;
@@ -1576,14 +1588,14 @@ static void createTransLatticeVerts(bContext *C, TransInfo *t)
}
bp++;
}
-
+
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
-
- if(propmode) t->total = count;
+
+ if(propmode) t->total = count;
else t->total = countsel;
t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Lattice EditMode)");
-
+
Mat3CpyMat4(mtx, t->obedit->obmat);
Mat3Inv(smtx, mtx);
@@ -1620,31 +1632,32 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
TransDataExtension *tx;
Base *base = CTX_data_active_base(C);
Object *ob = CTX_data_active_object(C);
- ParticleSystem *psys = PE_get_current(t->scene, ob);
- ParticleSystemModifierData *psmd = NULL;
ParticleEditSettings *pset = PE_settings(t->scene);
- ParticleData *pa = NULL;
- ParticleEdit *edit;
- ParticleEditKey *key;
+ PTCacheEdit *edit = PE_get_current(t->scene, ob);
+ ParticleSystem *psys = NULL;
+ ParticleSystemModifierData *psmd = NULL;
+ PTCacheEditPoint *point;
+ PTCacheEditKey *key;
float mat[4][4];
- int i,k, totpart, transformparticle;
+ int i,k, transformparticle;
int count = 0, hasselected = 0;
int propmode = t->flag & T_PROP_EDIT;
- if(psys==NULL || t->settings->particle.selectmode==SCE_SELECT_PATH) return;
+ if(edit==NULL || t->settings->particle.selectmode==SCE_SELECT_PATH) return;
+
+ psys = edit->psys;
- psmd = psys_get_modifier(ob,psys);
+ if(psys)
+ psmd = psys_get_modifier(ob,psys);
- edit = psys->edit;
- totpart = psys->totpart;
base->flag |= BA_HAS_RECALC_DATA;
- for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
- pa->flag &= ~PARS_TRANSFORM;
+ for(i=0, point=edit->points; i<edit->totpoint; i++, point++) {
+ point->flag &= ~PEP_TRANSFORM;
transformparticle= 0;
- if((pa->flag & PARS_HIDE)==0) {
- for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++) {
+ if((point->flag & PEP_HIDE)==0) {
+ for(k=0, key=point->keys; k<point->totkey; k++, key++) {
if((key->flag&PEK_HIDE)==0) {
if(key->flag&PEK_SELECT) {
hasselected= 1;
@@ -1657,14 +1670,14 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
}
if(transformparticle) {
- count += pa->totkey;
- pa->flag |= PARS_TRANSFORM;
+ count += point->totkey;
+ point->flag |= PEP_TRANSFORM;
}
}
-
+
/* note: in prop mode we need at least 1 selected */
if (hasselected==0) return;
-
+
t->total = count;
td = t->data = MEM_callocN(t->total * sizeof(TransData), "TransObData(Particle Mode)");
@@ -1677,18 +1690,23 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
Mat4Invert(ob->imat,ob->obmat);
- for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ for(i=0, point=edit->points; i<edit->totpoint; i++, point++) {
TransData *head, *tail;
head = tail = td;
- if(!(pa->flag & PARS_TRANSFORM)) continue;
+ if(!(point->flag & PEP_TRANSFORM)) continue;
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR))
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles + i, mat);
- for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++) {
- VECCOPY(key->world_co, key->co);
- Mat4MulVecfl(mat, key->world_co);
- td->loc = key->world_co;
+ for(k=0, key=point->keys; k<point->totkey; k++, key++) {
+ if(key->flag & PEK_USE_WCO) {
+ VECCOPY(key->world_co, key->co);
+ Mat4MulVecfl(mat, key->world_co);
+ td->loc = key->world_co;
+ }
+ else
+ td->loc = key->co;
VECCOPY(td->iloc, td->loc);
VECCOPY(td->center, td->loc);
@@ -1702,7 +1720,7 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
Mat3One(td->smtx);
/* don't allow moving roots */
- if(k==0 && pset->flag & PE_LOCK_FIRST)
+ if(k==0 && pset->flag & PE_LOCK_FIRST && (!psys || !(psys->flag & PSYS_GLOBAL_HAIR)))
td->protectflag |= OB_LOCK_LOC;
td->ob = ob;
@@ -1716,7 +1734,7 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
if(k==0) tx->size = 0;
else tx->size = (key - 1)->time;
- if(k == pa->totkey - 1) tx->quat = 0;
+ if(k == point->totkey - 1) tx->quat = 0;
else tx->quat = (key + 1)->time;
}
@@ -1734,35 +1752,42 @@ void flushTransParticles(TransInfo *t)
{
Scene *scene = t->scene;
Object *ob = OBACT;
- ParticleSystem *psys = PE_get_current(scene, ob);
- ParticleSystemModifierData *psmd;
- ParticleData *pa;
- ParticleEditKey *key;
+ PTCacheEdit *edit = PE_get_current(scene, ob);
+ ParticleSystem *psys = edit->psys;
+ ParticleSystemModifierData *psmd = NULL;
+ PTCacheEditPoint *point;
+ PTCacheEditKey *key;
TransData *td;
float mat[4][4], imat[4][4], co[3];
int i, k, propmode = t->flag & T_PROP_EDIT;
- psmd = psys_get_modifier(ob, psys);
+ if(psys)
+ psmd = psys_get_modifier(ob, psys);
/* we do transform in world space, so flush world space position
- * back to particle local space */
+ * back to particle local space (only for hair particles) */
td= t->data;
- for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++, td++) {
- if(!(pa->flag & PARS_TRANSFORM)) continue;
+ for(i=0, point=edit->points; i<edit->totpoint; i++, point++, td++) {
+ if(!(point->flag & PEP_TRANSFORM)) continue;
+
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles + i, mat);
+ Mat4Invert(imat,mat);
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
- Mat4Invert(imat,mat);
+ for(k=0, key=point->keys; k<point->totkey; k++, key++) {
+ VECCOPY(co, key->world_co);
+ Mat4MulVecfl(imat, co);
- for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++) {
- VECCOPY(co, key->world_co);
- Mat4MulVecfl(imat, co);
- /* optimization for proportional edit */
- if(!propmode || !FloatCompare(key->co, co, 0.0001f)) {
- VECCOPY(key->co, co);
- pa->flag |= PARS_EDIT_RECALC;
+ /* optimization for proportional edit */
+ if(!propmode || !FloatCompare(key->co, co, 0.0001f)) {
+ VECCOPY(key->co, co);
+ point->flag |= PEP_EDIT_RECALC;
+ }
}
}
+ else
+ point->flag |= PEP_EDIT_RECALC;
}
PE_update_object(scene, OBACT, 1);
@@ -1802,13 +1827,13 @@ static void editmesh_set_connectivity_distance(EditMesh *em, int total, float *v
/* Floodfill routine */
/*
- At worst this is n*n of complexity where n is number of edges
+ At worst this is n*n of complexity where n is number of edges
Best case would be n if the list is ordered perfectly.
Estimate is n log n in average (so not too bad)
*/
while(done) {
done= 0;
-
+
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->h==0) {
EditVert *v1= eed->v1, *v2= eed->v2;
@@ -1889,7 +1914,7 @@ static void editmesh_set_connectivity_distance(EditMesh *em, int total, float *v
static void get_face_center(float *cent, EditMesh *em, EditVert *eve)
{
EditFace *efa;
-
+
for(efa= em->faces.first; efa; efa= efa->next)
if(efa->f & SELECT)
if(efa->v1==eve || efa->v2==eve || efa->v3==eve || efa->v4==eve)
@@ -1908,7 +1933,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
// td->loc = key->co;
//else
td->loc = eve->co;
-
+
VECCOPY(td->center, td->loc);
if(t->around==V3D_LOCAL && (em->selectmode & SCE_SELECT_FACE))
get_face_center(td->center, em, eve);
@@ -1938,7 +1963,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
{
float *vec = userData;
-
+
vec+= 3*index;
VECCOPY(vec, co);
}
@@ -1947,14 +1972,14 @@ static int modifiers_disable_subsurf_temporary(Object *ob)
{
ModifierData *md;
int disabled = 0;
-
+
for(md=ob->modifiers.first; md; md=md->next)
if(md->type==eModifierType_Subsurf)
if(md->mode & eModifierMode_OnCage) {
md->mode ^= eModifierMode_DisableTemporary;
disabled= 1;
}
-
+
return disabled;
}
@@ -1976,12 +2001,12 @@ static float *get_crazy_mapped_editverts(TransInfo *t)
vertexcos= MEM_mallocN(3*sizeof(float)*me->edit_mesh->totvert, "vertexcos map");
dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
-
+
dm->release(dm);
-
+
/* set back the flag, no new cage needs to be built, transform does it */
modifiers_disable_subsurf_temporary(t->obedit);
-
+
return vertexcos;
}
@@ -1990,15 +2015,15 @@ static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3,
{
float vecu[3], vecv[3];
float q1[4], q2[4];
-
+
TAN_MAKE_VEC(vecu, v1, v2);
TAN_MAKE_VEC(vecv, v1, v3);
triatoquat(v1, vecu, vecv, q1);
-
+
TAN_MAKE_VEC(vecu, def1, def2);
TAN_MAKE_VEC(vecv, def1, def3);
triatoquat(def1, vecu, vecv, q2);
-
+
QuatSub(quat, q2, q1);
}
#undef TAN_MAKE_VEC
@@ -2009,16 +2034,16 @@ static void set_crazyspace_quats(EditMesh *em, float *origcos, float *mappedcos,
EditFace *efa;
float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
intptr_t index= 0;
-
+
/* two abused locations in vertices */
for(eve= em->verts.first; eve; eve= eve->next, index++) {
eve->tmp.p = NULL;
eve->prev= (EditVert *)index;
}
-
+
/* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */
for(efa= em->faces.first; efa; efa= efa->next) {
-
+
/* retrieve mapped coordinates */
v1= mappedcos + 3*(intptr_t)(efa->v1->prev);
v2= mappedcos + 3*(intptr_t)(efa->v2->prev);
@@ -2033,7 +2058,7 @@ static void set_crazyspace_quats(EditMesh *em, float *origcos, float *mappedcos,
efa->v2->tmp.p= (void*)quats;
quats+= 4;
}
-
+
if(efa->v4) {
v4= mappedcos + 3*(intptr_t)(efa->v4->prev);
co4= (origcos)? origcos + 3*(intptr_t)(efa->v4->prev): efa->v4->co;
@@ -2121,7 +2146,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
// transform now requires awareness for select mode, so we tag the f1 flags in verts
if(ts->selectmode & SCE_SELECT_VERTEX) {
for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0 && (eve->f & SELECT))
+ if(eve->h==0 && (eve->f & SELECT))
eve->f1= SELECT;
else
eve->f1= 0;
@@ -2145,7 +2170,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
}
-
+
/* now we can count */
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->h==0) {
@@ -2153,10 +2178,10 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
if(propmode) count++;
}
}
-
+
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
-
+
/* check active */
if (em->selected.last) {
EditSelection *ese = em->selected.last;
@@ -2165,22 +2190,22 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
-
+
if(propmode) {
- t->total = count;
-
+ t->total = count;
+
/* allocating scratch arrays */
vectors = (float *)MEM_mallocN(t->total * 3 * sizeof(float), "scratch vectors");
nears = (EditVert**)MEM_mallocN(t->total * sizeof(EditVert*), "scratch nears");
}
else t->total = countsel;
tob= t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Mesh EditMode)");
-
+
Mat3CpyMat4(mtx, t->obedit->obmat);
Mat3Inv(smtx, mtx);
if(propmode) editmesh_set_connectivity_distance(em, t->total, vectors, nears);
-
+
/* detect CrazySpace [tm] */
if(propmode==0) {
if(modifiers_getCageIndex(t->obedit, NULL)>=0) {
@@ -2205,7 +2230,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
}
-
+
/* find out which half we do */
if(mirror) {
for (eve=em->verts.first; eve; eve=eve->next) {
@@ -2216,18 +2241,18 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
}
}
-
+
for (a=0, eve=em->verts.first; eve; eve=eve->next, a++) {
if(eve->h==0) {
if(propmode || eve->f1) {
VertsToTransData(t, tob, em, eve);
-
+
/* selected */
if(eve->f1) tob->flag |= TD_SELECTED;
-
+
/* active */
if(eve == eve_act) tob->flag |= TD_ACTIVE;
-
+
if(propmode) {
if (eve->f2) {
float vec[3];
@@ -2240,11 +2265,11 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
tob->dist = MAXFLOAT;
}
}
-
+
/* CrazySpace */
if(defmats || (quats && eve->tmp.p)) {
float mat[3][3], imat[3][3], qmat[3][3];
-
+
/* use both or either quat and defmat correction */
if(quats && eve->tmp.f) {
QuatToMat3(eve->tmp.p, qmat);
@@ -2259,7 +2284,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
Mat3MulMat3(mat, mtx, defmats[a]);
Mat3Inv(imat, mat);
-
+
Mat3CpyMat3(tob->smtx, imat);
Mat3CpyMat3(tob->mtx, mat);
}
@@ -2267,7 +2292,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
Mat3CpyMat3(tob->smtx, smtx);
Mat3CpyMat3(tob->mtx, mtx);
}
-
+
/* Mirror? */
if( (mirror>0 && tob->iloc[0]>0.0f) || (mirror<0 && tob->iloc[0]<0.0f)) {
EditVert *vmir= editmesh_get_x_mirror_vert(t->obedit, em, tob->iloc); /* initializes octree on first call */
@@ -2275,7 +2300,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
}
tob++;
}
- }
+ }
}
if (propmode) {
MEM_freeN(vectors);
@@ -2293,7 +2318,7 @@ void flushTransNodes(TransInfo *t)
{
int a;
TransData2D *td;
-
+
/* flush to 2d vector from internally used 3d vector */
for(a=0, td= t->data2d; a<t->total; a++, td++) {
td->loc2d[0]= td->loc[0];
@@ -2311,7 +2336,7 @@ void flushTransSeq(TransInfo *t)
TransDataSeq *tdsq= NULL;
Sequence *seq;
-
+
/* prevent updating the same seq twice
* if the transdata order is changed this will mess up
@@ -2329,7 +2354,7 @@ void flushTransSeq(TransInfo *t)
case SELECT:
if (seq->type != SEQ_META && seq_tx_test(seq)) /* for meta's, their children move */
seq->start= new_frame - tdsq->start_offset;
-
+
if (seq->depth==0) {
seq->machine= (int)(td2d->loc[1] + 0.5f);
CLAMP(seq->machine, 1, MAXSEQ);
@@ -2353,7 +2378,7 @@ void flushTransSeq(TransInfo *t)
* children are ALWAYS transformed first
* so we dont need to do this in another loop. */
calc_sequence(seq);
-
+
/* test overlap, displayes red outline */
seq->flag &= ~SEQ_OVERLAP;
if( seq_test_overlap(seqbasep, seq) ) {
@@ -2419,7 +2444,7 @@ static void UVsToTransData(SpaceImage *sima, TransData *td, TransData2D *td2d, f
static void createTransUVs(bContext *C, TransInfo *t)
{
- SpaceImage *sima = (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima = CTX_wm_space_image(C);
Image *ima = CTX_data_edit_image(C);
Scene *scene = CTX_data_scene(C);
TransData *td = NULL;
@@ -2430,7 +2455,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;
/* count */
@@ -2439,10 +2464,10 @@ static void createTransUVs(bContext *C, TransInfo *t)
if(uvedit_face_visible(scene, ima, efa, tf)) {
efa->tmp.p = tf;
-
- if (uvedit_uv_selected(scene, efa, tf, 0)) countsel++;
- if (uvedit_uv_selected(scene, efa, tf, 1)) countsel++;
- if (uvedit_uv_selected(scene, efa, tf, 2)) countsel++;
+
+ if (uvedit_uv_selected(scene, efa, tf, 0)) countsel++;
+ if (uvedit_uv_selected(scene, efa, tf, 1)) countsel++;
+ if (uvedit_uv_selected(scene, efa, tf, 2)) countsel++;
if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) countsel++;
if(propmode)
count += (efa->v4)? 4: 3;
@@ -2450,10 +2475,10 @@ static void createTransUVs(bContext *C, TransInfo *t)
efa->tmp.p = NULL;
}
}
-
+
/* note: in prop mode we need at least 1 selected */
if (countsel==0) return;
-
+
t->total= (propmode)? count: countsel;
t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(UV Editing)");
/* for each 2d uv coord a 3d vector is allocated, so that they can be
@@ -2465,7 +2490,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
td= t->data;
td2d= t->data2d;
-
+
for (efa= em->faces.first; efa; efa= efa->next) {
if ((tf=(MTFace *)efa->tmp.p)) {
if (propmode) {
@@ -2482,7 +2507,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
}
}
}
-
+
if (sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_begin(t->scene, t->obedit);
}
@@ -2503,7 +2528,7 @@ void flushTransUVs(TransInfo *t)
for(a=0, td= t->data2d; a<t->total; a++, td++) {
td->loc2d[0]= td->loc[0]*invx;
td->loc2d[1]= td->loc[1]*invy;
-
+
if((sima->flag & SI_PIXELSNAP) && (t->state != TRANS_CANCEL)) {
td->loc2d[0]= (float)floor(width*td->loc2d[0] + 0.5f)/width;
td->loc2d[1]= (float)floor(height*td->loc2d[1] + 0.5f)/height;
@@ -2554,40 +2579,251 @@ int clipUVTransform(TransInfo *t, float *vec, int resize)
vec[1] -= max[1]-aspy;
else
clipy= 0;
- }
+ }
return (clipx || clipy);
}
-/* ********************* ACTION/NLA EDITOR ****************** */
+/* ********************* ANIMATION EDITORS (GENERAL) ************************* */
+
+/* This function tests if a point is on the "mouse" side of the cursor/frame-marking */
+static short FrameOnMouseSide(char side, float frame, float cframe)
+{
+ /* both sides, so it doesn't matter */
+ if (side == 'B') return 1;
+
+ /* only on the named side */
+ if (side == 'R')
+ return (frame >= cframe) ? 1 : 0;
+ else
+ return (frame <= cframe) ? 1 : 0;
+}
+
+/* ********************* NLA EDITOR ************************* */
+
+static void createTransNlaData(bContext *C, TransInfo *t)
+{
+ Scene *scene= CTX_data_scene(C);
+ TransData *td = NULL;
+ TransDataNla *tdn = NULL;
+
+ bAnimContext ac;
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ int count=0;
+ char side;
+
+ /* determine what type of data we are operating on */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return;
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* which side of the current frame should be allowed */
+ if (t->mode == TFM_TIME_EXTEND) {
+ /* only side on which mouse is gets transformed */
+ float xmouse, ymouse;
+
+ UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
+ side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
+ }
+ else {
+ /* normal transform - both sides of current frame are considered */
+ side = 'B';
+ }
+
+ /* loop 1: count how many strips are selected (consider each strip as 2 points) */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* make some meta-strips for chains of selected strips */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* only consider selected strips */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ // TODO: we can make strips have handles later on...
+ /* transition strips can't get directly transformed */
+ if (strip->type != NLASTRIP_TYPE_TRANSITION) {
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ if (FrameOnMouseSide(side, strip->start, (float)CFRA)) count++;
+ if (FrameOnMouseSide(side, strip->end, (float)CFRA)) count++;
+ }
+ }
+ }
+ }
+
+ /* stop if trying to build list if nothing selected */
+ if (count == 0) {
+ /* cleanup temp list */
+ BLI_freelistN(&anim_data);
+ return;
+ }
+
+ /* allocate memory for data */
+ t->total= count;
+
+ t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(NLA Editor)");
+ td= t->data;
+ t->customData= MEM_callocN(t->total*sizeof(TransDataNla), "TransDataNla (NLA Editor)");
+ tdn= t->customData;
+
+ /* loop 2: build transdata array */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* only if a real NLA-track */
+ if (ale->type == ANIMTYPE_NLATRACK) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* only consider selected strips */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ // TODO: we can make strips have handles later on...
+ /* transition strips can't get directly transformed */
+ if (strip->type != NLASTRIP_TYPE_TRANSITION) {
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* our transform data is constructed as follows:
+ * - only the handles on the right side of the current-frame get included
+ * - td structs are transform-elements operated on by the transform system
+ * and represent a single handle. The storage/pointer used (val or loc) depends on
+ * whether we're scaling or transforming. Ultimately though, the handles
+ * the td writes to will simply be a dummy in tdn
+ * - for each strip being transformed, a single tdn struct is used, so in some
+ * cases, there will need to be 1 of these tdn elements in the array skipped...
+ */
+ float center[3], yval;
+
+ /* firstly, init tdn settings */
+ tdn->id= ale->id;
+ tdn->oldTrack= tdn->nlt= nlt;
+ tdn->strip= strip;
+ tdn->trackIndex= BLI_findindex(&nlt->strips, strip);
+
+ yval= (float)(tdn->trackIndex * NLACHANNEL_STEP);
+
+ tdn->h1[0]= strip->start;
+ tdn->h1[1]= yval;
+ tdn->h2[0]= strip->end;
+ tdn->h2[1]= yval;
+
+ center[0]= (float)CFRA;
+ center[1]= yval;
+ center[2]= 0.0f;
+
+ /* set td's based on which handles are applicable */
+ if (FrameOnMouseSide(side, strip->start, (float)CFRA))
+ {
+ /* just set tdn to assume that it only has one handle for now */
+ tdn->handle= -1;
+
+ /* now, link the transform data up to this data */
+ if (t->mode == TFM_TRANSLATION) {
+ td->loc= tdn->h1;
+ VECCOPY(td->iloc, tdn->h1);
+
+ /* store all the other gunk that is required by transform */
+ VECCOPY(td->center, center);
+ memset(td->axismtx, 0, sizeof(td->axismtx));
+ td->axismtx[2][2] = 1.0f;
+
+ td->ext= NULL; td->tdi= NULL; td->val= NULL;
+
+ td->flag |= TD_SELECTED;
+ td->dist= 0.0f;
+
+ Mat3One(td->mtx);
+ Mat3One(td->smtx);
+ }
+ else {
+ td->val= &tdn->h1[0];
+ td->ival= tdn->h1[0];
+ }
+
+ td->extra= tdn;
+ td++;
+ }
+ if (FrameOnMouseSide(side, strip->end, (float)CFRA))
+ {
+ /* if tdn is already holding the start handle, then we're doing both, otherwise, only end */
+ tdn->handle= (tdn->handle) ? 2 : 1;
+
+ /* now, link the transform data up to this data */
+ if (t->mode == TFM_TRANSLATION) {
+ td->loc= tdn->h2;
+ VECCOPY(td->iloc, tdn->h2);
+
+ /* store all the other gunk that is required by transform */
+ VECCOPY(td->center, center);
+ memset(td->axismtx, 0, sizeof(td->axismtx));
+ td->axismtx[2][2] = 1.0f;
+
+ td->ext= NULL; td->tdi= NULL; td->val= NULL;
+
+ td->flag |= TD_SELECTED;
+ td->dist= 0.0f;
+
+ Mat3One(td->mtx);
+ Mat3One(td->smtx);
+ }
+ else {
+ td->val= &tdn->h2[0];
+ td->ival= tdn->h2[0];
+ }
+
+ td->extra= tdn;
+ td++;
+ }
+
+ /* if both handles were used, skip the next tdn (i.e. leave it blank) since the counting code is dumb...
+ * otherwise, just advance to the next one...
+ */
+ if (tdn->handle == 2)
+ tdn += 2;
+ else
+ tdn++;
+ }
+ }
+ }
+ }
+ }
+
+ /* cleanup temp list */
+ BLI_freelistN(&anim_data);
+}
+
+/* ********************* ACTION EDITOR ****************** */
/* Called by special_aftertrans_update to make sure selected gp-frames replace
* any other gp-frames which may reside on that frame (that are not selected).
* 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;
-
+
for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
ListBase sel_buffer = {NULL, NULL};
bGPDframe *gpf, *gpfn;
bGPDframe *gfs, *gfsn;
-
- /* loop 1: loop through and isolate selected gp-frames to buffer
+
+ /* 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
+ * so doing it this way will be faster
*/
for (gfs= sel_buffer.last; gfs; gfs= gfs->prev) {
/* if current (gpf) occurs after this one in buffer, add! */
@@ -2601,27 +2837,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) */
@@ -2633,23 +2869,24 @@ 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);
}
}
}
-
+
/* 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).
@@ -2658,36 +2895,36 @@ static void posttrans_fcurve_clean (FCurve *fcu)
{
float *selcache; /* cache for frame numbers of selected frames (icu->totvert*sizeof(float)) */
int len, index, i; /* number of frames in cache, item index */
-
+
/* allocate memory for the cache */
// TODO: investigate using GHash for this instead?
- if (fcu->totvert == 0)
+ if (fcu->totvert == 0)
return;
selcache= MEM_callocN(sizeof(float)*fcu->totvert, "FCurveSelFrameNums");
len= 0;
index= 0;
-
- /* We do 2 loops, 1 for marking keyframes for deletion, one for deleting
- * as there is no guarantee what order the keyframes are exactly, even though
+
+ /* We do 2 loops, 1 for marking keyframes for deletion, one for deleting
+ * as there is no guarantee what order the keyframes are exactly, even though
* they have been sorted by time.
*/
-
+
/* Loop 1: find selected keyframes */
for (i = 0; i < fcu->totvert; i++) {
BezTriple *bezt= &fcu->bezt[i];
-
+
if (BEZSELECTED(bezt)) {
selcache[index]= bezt->vec[1][0];
index++;
len++;
}
}
-
+
/* Loop 2: delete unselected keyframes on the same frames (if any keyframes were found) */
if (len) {
for (i = 0; i < fcu->totvert; i++) {
BezTriple *bezt= &fcu->bezt[i];
-
+
if (BEZSELECTED(bezt) == 0) {
/* check beztriple should be removed according to cache */
for (index= 0; index < len; index++) {
@@ -2700,97 +2937,86 @@ static void posttrans_fcurve_clean (FCurve *fcu)
}
}
}
-
+
testhandles_fcurve(fcu);
}
-
+
/* free cache */
MEM_freeN(selcache);
}
+
/* Called by special_aftertrans_update to make sure selected keyframes replace
* any other keyframes which may reside on that frame (that is not selected).
- * remake_action_ipos should have already been called
+ * remake_action_ipos should have already been called
*/
static void posttrans_action_clean (bAnimContext *ac, bAction *act)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
-
+
/* filter data */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(ac, &anim_data, filter, act, ANIMCONT_ACTION);
-
- /* loop through relevant data, removing keyframes from the ipo-blocks that were attached
- * - all keyframes are converted in/out of global time
+
+ /* loop through relevant data, removing keyframes from the ipo-blocks that were attached
+ * - all keyframes are converted in/out of global time
*/
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(ac, ale);
-
- if (nob) {
- //ANIM_nla_mapping_apply_ipocurve(nob, ale->key_data, 0, 1);
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
posttrans_fcurve_clean(ale->key_data);
- //ANIM_nla_mapping_apply_ipocurve(nob, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
- else
+ else
posttrans_fcurve_clean(ale->key_data);
}
-
+
/* free temp data */
BLI_freelistN(&anim_data);
}
/* ----------------------------- */
-/* This function tests if a point is on the "mouse" side of the cursor/frame-marking */
-static short FrameOnMouseSide(char side, float frame, float cframe)
-{
- /* both sides, so it doesn't matter */
- if (side == 'B') return 1;
-
- /* only on the named side */
- if (side == 'R')
- return (frame >= cframe) ? 1 : 0;
- else
- return (frame <= cframe) ? 1 : 0;
-}
-
/* fully select selected beztriples, but only include if it's on the right side of cfra */
static int count_fcurve_keys(FCurve *fcu, char side, float cfra)
{
BezTriple *bezt;
int i, count = 0;
-
+
if (ELEM(NULL, fcu, fcu->bezt))
return count;
-
+
/* only include points that occur on the right side of cfra */
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (bezt->f2 & SELECT) {
/* fully select the other two keys */
bezt->f1 |= SELECT;
bezt->f3 |= SELECT;
-
+
/* increment by 3, as there are 3 points (3 * x-coordinates) that need transform */
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
count += 3;
}
}
-
+
return count;
}
/* 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) {
@@ -2798,22 +3024,22 @@ 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, Object *ob)
+static void TimeToTransData(TransData *td, float *time, AnimData *adt)
{
/* memory is calloc'ed, so that should zero everything nicely for us */
td->val = time;
td->ival = *(time);
-
- /* store the Object where this keyframe exists as a keyframe of the
- * active action as td->ob. Usually, this member is only used for constraints
- * drawing
+
+ /* store the AnimData where this keyframe exists as a keyframe of the
+ * active action as td->extra.
*/
- td->ob= ob;
+ td->extra= adt;
}
/* This function advances the address to which td points to, so it must return
@@ -2821,34 +3047,34 @@ static void TimeToTransData(TransData *td, float *time, Object *ob)
* overwrite the existing ones... i.e. td = IcuToTransData(td, icu, ob, side, cfra);
*
* The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
- * on the named side are used.
+ * on the named side are used.
*/
-static TransData *FCurveToTransData(TransData *td, FCurve *fcu, Object *ob, char side, float cfra)
+static TransData *FCurveToTransData(TransData *td, FCurve *fcu, AnimData *adt, char side, float cfra)
{
BezTriple *bezt;
int i;
-
+
if (fcu == NULL)
return td;
-
+
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
/* only add selected keyframes (for now, proportional edit is not enabled) */
if (BEZSELECTED(bezt)) {
/* only add if on the right 'side' of the current frame */
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
/* each control point needs to be added separetely */
- TimeToTransData(td, bezt->vec[0], ob);
+ TimeToTransData(td, bezt->vec[0], adt);
td++;
-
- TimeToTransData(td, bezt->vec[1], ob);
+
+ TimeToTransData(td, bezt->vec[1], adt);
td++;
-
- TimeToTransData(td, bezt->vec[2], ob);
+
+ TimeToTransData(td, bezt->vec[2], adt);
td++;
}
- }
+ }
}
-
+
return td;
}
@@ -2863,17 +3089,17 @@ void flushTransGPactionData (TransInfo *t)
{
tGPFtransdata *tfd;
int i;
-
+
/* find the first one to start from */
if (t->mode == TFM_TIME_SLIDE)
tfd= (tGPFtransdata *)( (float *)(t->customData) + 2 );
else
tfd= (tGPFtransdata *)(t->customData);
-
+
/* flush data! */
for (i = 0; i < t->total; i++, tfd++) {
*(tfd->sdata)= (int)floor(tfd->val + 0.5);
- }
+ }
}
/* This function advances the address to which td points to, so it must return
@@ -2881,13 +3107,14 @@ void flushTransGPactionData (TransInfo *t)
* overwrite the existing ones... i.e. td = GPLayerToTransData(td, ipo, ob, side, cfra);
*
* The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
- * on the named side are used.
+ * 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) {
@@ -2895,10 +3122,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++;
@@ -2906,9 +3133,10 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
}
}
}
-
+
return count;
}
+#endif
static void createTransActionData(bContext *C, TransInfo *t)
{
@@ -2935,7 +3163,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
else
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
+
/* which side of the current frame should be allowed */
if (t->mode == TFM_TIME_EXTEND) {
/* only side on which mouse is gets transformed */
@@ -2951,13 +3179,13 @@ static void createTransActionData(bContext *C, TransInfo *t)
/* loop 1: fully select ipo-keys and count how many BezTriples are selected */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(&ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
/* convert current-frame to action-time (slightly less accurate, espcially under
- * higher scaling ratios, but is faster than converting all points)
+ * higher scaling ratios, but is faster than converting all points)
*/
- if (nob)
- cfra = get_action_frame(nob, (float)CFRA);
+ if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
else
cfra = (float)CFRA;
@@ -2998,24 +3226,24 @@ static void createTransActionData(bContext *C, TransInfo *t)
//if (ale->type == ANIMTYPE_GPLAYER) {
// bGPDlayer *gpl= (bGPDlayer *)ale->data;
// int i;
- //
+ //
// i = GPLayerToTransData(td, tfd, gpl, side, cfra);
// td += i;
// tfd += i;
//}
//else {
- Object *nob= ANIM_nla_mapping_get(&ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
/* convert current-frame to action-time (slightly less accurate, espcially under
- * higher scaling ratios, but is faster than converting all points)
+ * higher scaling ratios, but is faster than converting all points)
*/
- if (nob)
- cfra = get_action_frame(nob, (float)CFRA);
+ if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
else
cfra = (float)CFRA;
- td= FCurveToTransData(td, fcu, nob, side, cfra);
+ td= FCurveToTransData(td, fcu, adt, side, cfra);
//}
}
@@ -3030,42 +3258,40 @@ static void createTransActionData(bContext *C, TransInfo *t)
if (max < *(td->val)) max= *(td->val);
}
- /* minx/maxx values used by TimeSlide are stored as a
+ /* minx/maxx values used by TimeSlide are stored as a
* calloced 2-float array in t->customData. This gets freed
- * in postTrans (T_FREE_CUSTOMDATA).
+ * in postTrans (T_FREE_CUSTOMDATA).
*/
*((float *)(t->customData)) = min;
*((float *)(t->customData) + 1) = max;
}
-
+
/* cleanup temp list */
BLI_freelistN(&anim_data);
}
/* ********************* GRAPH EDITOR ************************* */
-
-
/* Helper function for createTransGraphEditData, which is reponsible for associating
* source data with transform data
*/
-static void bezt_to_transdata (TransData *td, TransData2D *td2d, Object *nob, float *loc, float *cent, short selected, short ishandle, short intvals)
+static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt, float *loc, float *cent, short selected, short ishandle, short intvals)
{
/* New location from td gets dumped onto the old-location of td2d, which then
* gets copied to the actual data at td2d->loc2d (bezt->vec[n])
*
- * Due to NLA scaling, we apply NLA scaling to some of the verts here,
- * and then that scaling will be undone after transform is done.
+ * Due to NLA mapping, we apply NLA mapping to some of the verts here,
+ * and then that mapping will be undone after transform is done.
*/
- if (nob) {
- td2d->loc[0] = get_action_frame_inv(nob, loc[0]);
+ if (adt) {
+ td2d->loc[0] = BKE_nla_tweakedit_remap(adt, loc[0], NLATIME_CONVERT_UNMAP);
td2d->loc[1] = loc[1];
td2d->loc[2] = 0.0f;
td2d->loc2d = loc;
td->loc = td2d->loc;
- td->center[0] = get_action_frame_inv(nob, cent[0]);
+ td->center[0] = BKE_nla_tweakedit_remap(adt, cent[0], NLATIME_CONVERT_UNMAP);
td->center[1] = cent[1];
td->center[2] = 0.0f;
@@ -3081,12 +3307,15 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, Object *nob, fl
VECCOPY(td->center, cent);
VECCOPY(td->iloc, td->loc);
}
-
+
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
-
+
td->ext= NULL; td->tdi= NULL; td->val= NULL;
-
+
+ /* store AnimData info in td->extra, for applying mapping when flushing */
+ td->extra= adt;
+
if (selected) {
td->flag |= TD_SELECTED;
td->dist= 0.0f;
@@ -3094,14 +3323,14 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, Object *nob, fl
else
td->dist= MAXFLOAT;
- if (ishandle)
+ if (ishandle)
td->flag |= TD_NOTIMESNAP;
if (intvals)
td->flag |= TD_INTVALUES;
Mat3One(td->mtx);
Mat3One(td->smtx);
-}
+}
static void createTransGraphEditData(bContext *C, TransInfo *t)
{
@@ -3129,7 +3358,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* filter data */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
+
/* which side of the current frame should be allowed */
// XXX we still want this mode, but how to get this using standard transform too?
if (t->mode == TFM_TIME_EXTEND) {
@@ -3146,14 +3375,14 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* loop 1: count how many BezTriples (specifically their verts) are selected (or should be edited) */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= NULL; //ANIM_nla_mapping_get(&ac, ale); // XXX we don't handle NLA mapping for now here...
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
/* convert current-frame to action-time (slightly less accurate, espcially under
- * higher scaling ratios, but is faster than converting all points)
+ * higher scaling ratios, but is faster than converting all points)
*/
- if (nob)
- cfra = get_action_frame(nob, (float)CFRA);
+ if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
else
cfra = (float)CFRA;
@@ -3203,13 +3432,19 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
td2d= t->data2d;
/* loop 2: build transdata arrays */
- cfra = (float)CFRA;
-
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= NULL; //ANIM_nla_mapping_get(&ac, ale); // XXX we don't handle NLA mapping here yet
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
short intvals= (fcu->flag & FCURVE_INT_VALUES);
+ /* convert current-frame to action-time (slightly less accurate, espcially under
+ * higher scaling ratios, but is faster than converting all points)
+ */
+ if (adt)
+ cfra = BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
+ else
+ cfra = (float)CFRA;
+
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */
bezt= fcu->bezt;
prevbezt= NULL;
@@ -3223,7 +3458,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) {
if (bezt->f1 & SELECT) {
hdata = initTransDataCurveHandes(td, bezt);
- bezt_to_transdata(td++, td2d++, nob, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
+ bezt_to_transdata(td++, td2d++, adt, bezt->vec[0], bezt->vec[1], 1, 1, intvals);
}
else
h1= 0;
@@ -3232,7 +3467,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
if (bezt->f3 & SELECT) {
if (hdata==NULL)
hdata = initTransDataCurveHandes(td, bezt);
- bezt_to_transdata(td++, td2d++, nob, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
+ bezt_to_transdata(td++, td2d++, adt, bezt->vec[2], bezt->vec[1], 1, 1, intvals);
}
else
h2= 0;
@@ -3248,12 +3483,12 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
hdata = initTransDataCurveHandes(td, bezt);
}
- bezt_to_transdata(td++, td2d++, nob, bezt->vec[1], bezt->vec[1], 1, 0, intvals);
+ bezt_to_transdata(td++, td2d++, adt, bezt->vec[1], bezt->vec[1], 1, 0, intvals);
}
- /* special hack (must be done after initTransDataCurveHandes(), as that stores handle settings to restore...):
- * - Check if we've got entire BezTriple selected and we're scaling/rotating that point,
- * then check if we're using auto-handles.
+ /* special hack (must be done after initTransDataCurveHandes(), as that stores handle settings to restore...):
+ * - Check if we've got entire BezTriple selected and we're scaling/rotating that point,
+ * then check if we're using auto-handles.
* - 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)) {
@@ -3267,7 +3502,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
}
/* Sets handles based on the selection */
- testhandles_fcurve(fcu);
+ testhandles_fcurve(fcu);
}
/* cleanup temp list */
@@ -3312,7 +3547,7 @@ static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
bezm->pipo= (prevbezt) ? prevbezt->ipo : bezt->ipo;
bezm->cipo= bezt->ipo;
}
-
+
return bezms;
}
@@ -3345,7 +3580,7 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert)
* optimisation: this only needs to be performed in the first loop
*/
if (bezm->swapHs == 0) {
- if ( (bezm->bezt->vec[0][0] > bezm->bezt->vec[1][0]) &&
+ if ( (bezm->bezt->vec[0][0] > bezm->bezt->vec[1][0]) &&
(bezm->bezt->vec[2][0] < bezm->bezt->vec[1][0]) )
{
/* handles need to be swapped */
@@ -3358,7 +3593,7 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert)
}
bezm++;
- }
+ }
}
}
@@ -3371,7 +3606,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
int i, j;
char *adjusted;
- /* dynamically allocate an array of chars to mark whether an TransData's
+ /* dynamically allocate an array of chars to mark whether an TransData's
* pointers have been fixed already, so that we don't override ones that are
* already done
*/
@@ -3380,7 +3615,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
/* for each beztmap item, find if it is used anywhere */
bezm= bezms;
for (i= 0; i < totvert; i++, bezm++) {
- /* loop through transdata, testing if we have a hit
+ /* loop through transdata, testing if we have a hit
* for the handles (vec[0]/vec[2]), we must also check if they need to be swapped...
*/
td= t->data2d;
@@ -3425,11 +3660,11 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
MEM_freeN(adjusted);
}
-/* This function is called by recalcData during the Transform loop to recalculate
+/* This function is called by recalcData during the Transform loop to recalculate
* the handles of curves and sort the keyframes so that the curves draw correctly.
* It is only called if some keyframes have moved out of order.
*
- * anim_data is the list of channels (F-Curves) retrieved already containing the
+ * anim_data is the list of channels (F-Curves) retrieved already containing the
* channels to work on. It should not be freed here as it may still need to be used.
*/
void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
@@ -3461,37 +3696,44 @@ void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
}
/* this function is called on recalcData to apply the transforms applied
- * to the transdata on to the actual keyframe data
+ * to the transdata on to the actual keyframe data
*/
void flushTransGraphData(TransInfo *t)
{
SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
TransData *td;
TransData2D *td2d;
+ Scene *scene= t->scene;
+ double secf= FPS;
int a;
/* flush to 2d vector from internally used 3d vector */
for (a=0, td= t->data, td2d=t->data2d; a<t->total; a++, td++, td2d++) {
- /* handle snapping for time values
- * - we should still be in NLA-mapping timespace
+ AnimData *adt= (AnimData *)td->extra; /* pointers to relevant AnimData blocks are stored in the td->extra pointers */
+
+ /* handle snapping for time values
+ * - we should still be in NLA-mapping timespace
* - only apply to keyframes (but never to handles)
*/
if ((td->flag & TD_NOTIMESNAP)==0) {
switch (sipo->autosnap) {
- case SACTSNAP_FRAME: /* snap to nearest frame */
- td2d->loc[0]= (float)( floor(td2d->loc[0]+0.5f) );
+ case SACTSNAP_FRAME: /* snap to nearest frame (or second if drawing seconds) */
+ if (sipo->flag & SIPO_DRAWTIME)
+ td2d->loc[0]= (float)( floor((td2d->loc[0]/secf) + 0.5f) * secf );
+ else
+ td2d->loc[0]= (float)( floor(td2d->loc[0]+0.5f) );
break;
-
+
case SACTSNAP_MARKER: /* snap to nearest marker */
- //td2d->loc[0]= (float)find_nearest_marker_time(td2d->loc[0]);
+ td2d->loc[0]= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, td2d->loc[0]);
break;
}
}
- /* we need to unapply the nla-scaling from the time in some situations */
- //if (NLA_IPO_SCALED)
- // td2d->loc2d[0]= get_action_frame(OBACT, td2d->loc[0]);
- //else
+ /* 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);
+ else
td2d->loc2d[0]= td2d->loc[0];
/* if int-values only, truncate to integers */
@@ -3502,7 +3744,6 @@ void flushTransGraphData(TransInfo *t)
}
}
-
/* **************** IpoKey stuff, for Object TransData ********** */
/* while transforming */
@@ -3531,13 +3772,13 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
TransDataIpokey *tdi= td->tdi;
BezTriple *bezt;
int a, delta= 0;
-
+
td->val= NULL; // is read on ESC
-
+
for(a=0; a<OB_TOTIPO; a++) {
if(ik->data[a]) {
bezt= ik->data[a];
-
+
switch( ob_ar[a] ) {
case OB_LOC_X:
case OB_DLOC_X:
@@ -3548,7 +3789,7 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
case OB_LOC_Z:
case OB_DLOC_Z:
tdi->locz= &(bezt->vec[1][1]); break;
-
+
case OB_DROT_X:
delta= 1;
case OB_ROT_X:
@@ -3561,7 +3802,7 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
delta= 1;
case OB_ROT_Z:
tdi->rotz= &(bezt->vec[1][1]); break;
-
+
case OB_SIZE_X:
case OB_DSIZE_X:
tdi->sizex= &(bezt->vec[1][1]); break;
@@ -3570,26 +3811,26 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
tdi->sizey= &(bezt->vec[1][1]); break;
case OB_SIZE_Z:
case OB_DSIZE_Z:
- tdi->sizez= &(bezt->vec[1][1]); break;
- }
+ tdi->sizez= &(bezt->vec[1][1]); break;
+ }
}
}
-
+
/* oldvals for e.g. undo */
if(tdi->locx) set_tdi_old(tdi->oldloc, tdi->locx);
if(tdi->locy) set_tdi_old(tdi->oldloc+1, tdi->locy);
if(tdi->locz) set_tdi_old(tdi->oldloc+2, tdi->locz);
-
+
/* remember, for mapping curves ('1'=10 degrees) */
if(tdi->rotx) set_tdi_old(tdi->oldrot, tdi->rotx);
if(tdi->roty) set_tdi_old(tdi->oldrot+1, tdi->roty);
if(tdi->rotz) set_tdi_old(tdi->oldrot+2, tdi->rotz);
-
+
/* this is not allowed to be dsize! */
if(tdi->sizex) set_tdi_old(tdi->oldsize, tdi->sizex);
if(tdi->sizey) set_tdi_old(tdi->oldsize+1, tdi->sizey);
if(tdi->sizez) set_tdi_old(tdi->oldsize+2, tdi->sizez);
-
+
tdi->flag= TOB_IPO;
if(delta) tdi->flag |= TOB_IPODROT;
}
@@ -3606,8 +3847,8 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
static short constraints_list_needinv(TransInfo *t, ListBase *list)
{
bConstraint *con;
-
- /* loop through constraints, checking if there's one of the mentioned
+
+ /* loop through constraints, checking if there's one of the mentioned
* constraints needing special crazyspace corrections
*/
if (list) {
@@ -3619,19 +3860,19 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
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;
}
@@ -3663,13 +3904,13 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count
*flag= 0;
}
else if (seq->type ==SEQ_META) {
-
+
/* for meta's we only ever need to extend their children, no matter what depth
* just check the meta's are in the bounds */
if (t->frame_side=='R' && right <= cfra) *recursive= 0;
else if (t->frame_side=='L' && left >= cfra) *recursive= 0;
else *recursive= 1;
-
+
*count= 0;
*flag= 0;
}
@@ -3793,15 +4034,15 @@ static TransData *SeqToTransData(TransInfo *t, TransData *td, TransData2D *td2d,
td2d->loc[2] = 0.0f;
td2d->loc2d = NULL;
-
+
tdsq->seq= seq;
/* Use instead of seq->flag for nested strips and other
* cases where the selection may need to be modified */
tdsq->flag= flag;
tdsq->sel_flag= sel_flag;
-
-
+
+
td->extra= (void *)tdsq; /* allow us to update the strip from here */
td->flag = 0;
@@ -3823,7 +4064,7 @@ static TransData *SeqToTransData(TransInfo *t, TransData *td, TransData2D *td2d,
/* Time Transform (extend) */
td->val= td2d->loc;
td->ival= td2d->loc[0];
-
+
return td;
}
@@ -3832,15 +4073,15 @@ static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData *
Sequence *seq;
int recursive, count, flag;
int tot= 0;
-
+
for (seq= seqbase->first; seq; seq= seq->next) {
SeqTransInfo(t, seq, &recursive, &count, &flag);
-
+
/* add children first so recalculating metastrips does nested strips first */
if (recursive) {
int tot_children= SeqToTransData_Recursive(t, &seq->seqbase, td, td2d, tdsq);
-
+
td= td + tot_children;
td2d= td2d + tot_children;
tdsq= tdsq + tot_children;
@@ -3873,7 +4114,7 @@ static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData *
static void createTransSeqData(bContext *C, TransInfo *t)
{
-
+
View2D *v2d= UI_view2d_fromcontext(C);
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(t->scene, FALSE);
@@ -3911,12 +4152,12 @@ static void createTransSeqData(bContext *C, TransInfo *t)
if (count == 0) {
return;
}
-
+
td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransSeq TransData");
td2d = t->data2d = MEM_callocN(t->total*sizeof(TransData2D), "TransSeq TransData2D");
tdsq = t->customData= MEM_callocN(t->total*sizeof(TransDataSeq), "TransSeq TransDataSeq");
-
+
/* loop 2: build transdata array */
SeqToTransData_Recursive(t, ed->seqbasep, td, td2d, tdsq);
@@ -3924,7 +4165,7 @@ static void createTransSeqData(bContext *C, TransInfo *t)
/* transcribe given object into TransData for Transforming */
-static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob)
+static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob)
{
Scene *scene = CTX_data_scene(C);
Object *track;
@@ -3938,35 +4179,35 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
Mat3Ortho(td->axismtx);
td->con= ob->constraints.first;
-
- /* hack: tempolarily disable tracking and/or constraints when getting
+
+ /* hack: tempolarily disable tracking and/or constraints when getting
* object matrix, if tracking is on, or if constraints don't need
* inverse correction to stop it from screwing up space conversion
* matrix later
*/
constinv = constraints_list_needinv(t, &ob->constraints);
-
+
/* disable constraints inversion for dummy pass */
if (t->mode == TFM_DUMMY)
skip_invert = 1;
-
+
if (skip_invert == 0 && (ob->track || constinv==0)) {
track= ob->track;
ob->track= NULL;
-
+
if (constinv == 0) {
fakecons.first = ob->constraints.first;
fakecons.last = ob->constraints.last;
ob->constraints.first = ob->constraints.last = NULL;
}
-
+
where_is_object(t->scene, ob);
-
+
if (constinv == 0) {
ob->constraints.first = fakecons.first;
ob->constraints.last = fakecons.last;
}
-
+
ob->track= track;
}
else
@@ -3976,23 +4217,23 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
td->loc = ob->loc;
VECCOPY(td->iloc, td->loc);
-
+
td->ext->rot = ob->rot;
VECCOPY(td->ext->irot, ob->rot);
VECCOPY(td->ext->drot, ob->drot);
-
+
td->ext->size = ob->size;
VECCOPY(td->ext->isize, ob->size);
VECCOPY(td->ext->dsize, ob->dsize);
VECCOPY(td->center, ob->obmat[3]);
-
+
Mat4CpyMat4(td->ext->obmat, ob->obmat);
/* is there a need to set the global<->data space conversion matrices? */
if (ob->parent || constinv) {
float totmat[3][3], obinv[3][3];
-
+
/* Get the effect of parenting, and/or certain constraints.
* NOTE: some Constraints, and also Tracking should never get this
* done, as it doesn't work well.
@@ -4008,7 +4249,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
Mat3One(td->smtx);
Mat3One(td->mtx);
}
-
+
/* set active flag */
if (ob == OBACT)
{
@@ -4021,41 +4262,41 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
/* it deselects Bases, so we have to call the clear function always after */
static void set_trans_object_base_flags(bContext *C, TransInfo *t)
{
- Scene *sce = CTX_data_scene(C);
+ Scene *scene = CTX_data_scene(C);
View3D *v3d = t->view;
-
+
/*
if Base selected and has parent selected:
base->flag= BA_WAS_SEL
*/
Base *base;
-
+
/* don't do it if we're not actually going to recalculate anything */
if(t->mode == TFM_DUMMY)
return;
/* makes sure base flags and object flags are identical */
copy_baseflags(t->scene);
-
+
/* handle pending update events, otherwise they got copied below */
- for (base= sce->base.first; base; base= base->next) {
- if(base->object->recalc)
+ for (base= scene->base.first; base; base= base->next) {
+ if(base->object->recalc)
object_handle_update(t->scene, base->object);
}
-
- for (base= sce->base.first; base; base= base->next) {
+
+ for (base= scene->base.first; base; base= base->next) {
base->flag &= ~BA_WAS_SEL;
-
- if(TESTBASELIB(v3d, base)) {
+
+ if(TESTBASELIB_BGMODE(v3d, base)) {
Object *ob= base->object;
Object *parsel= ob->parent;
-
+
/* if parent selected, deselect */
while(parsel) {
if(parsel->flag & SELECT) break;
parsel= parsel->parent;
}
-
+
if(parsel)
{
if ((t->mode == TFM_ROTATION || t->mode == TFM_TRACKBALL) && t->around == V3D_LOCAL)
@@ -4075,10 +4316,10 @@ static void set_trans_object_base_flags(bContext *C, TransInfo *t)
/* all recalc flags get flushed to all layers, so a layer flip later on works fine */
DAG_scene_flush_update(t->scene, -1, 0);
-
+
/* and we store them temporal in base (only used for transform code) */
/* this because after doing updates, the object->recalc is cleared */
- for (base= sce->base.first; base; base= base->next) {
+ for (base= scene->base.first; base; base= base->next) {
if(base->object->recalc & OB_RECALC_OB)
base->flag |= BA_HAS_RECALC_OB;
if(base->object->recalc & OB_RECALC_DATA)
@@ -4090,7 +4331,7 @@ static void clear_trans_object_base_flags(TransInfo *t)
{
Scene *sce = t->scene;
Base *base;
-
+
for (base= sce->base.first; base; base = base->next)
{
if(base->flag & BA_WAS_SEL)
@@ -4100,30 +4341,16 @@ static void clear_trans_object_base_flags(TransInfo *t)
}
}
-/* auto-keyframing feature - checks for whether anything should be done for the current frame */
-// TODO: this should probably be done per channel instead...
-short autokeyframe_cfra_can_key(Scene *scene, Object *ob)
-{
- float cfra= (float)CFRA; // XXX for now, this will do
-
- /* only filter if auto-key mode requires this */
- if (IS_AUTOKEY_ON(scene) == 0)
- return 0;
- else if (IS_AUTOKEY_MODE(scene, NORMAL))
- return 1;
- else
- return id_frame_has_keyframe(&ob->id, cfra, ANIMFILTER_KEYS_LOCAL);
-}
-
-/* auto-keyframing feature - for objects
- * tmode: should be a transform mode
+/* auto-keyframing feature - for objects
+ * tmode: should be a transform mode
*/
void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode)
{
ID *id= &ob->id;
FCurve *fcu;
-
- if (autokeyframe_cfra_can_key(scene, ob)) {
+
+ // TODO: this should probably be done per channel instead...
+ if (autokeyframe_cfra_can_key(scene, id)) {
AnimData *adt= ob->adt;
float cfra= (float)CFRA; // xxx this will do for now
short flag = 0;
@@ -4132,7 +4359,9 @@ void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode)
flag |= INSERTKEY_NEEDED;
if (IS_AUTOKEY_FLAG(AUTOMATKEY))
flag |= INSERTKEY_MATRIX;
-
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+ flag |= INSERTKEY_REPLACE;
+
if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
/* only key on available channels */
if (adt && adt->action) {
@@ -4155,9 +4384,9 @@ void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode)
doLoc = 1;
}
else if (v3d->around == V3D_CURSOR)
- doLoc = 1;
+ doLoc = 1;
- if ((v3d->flag & V3D_ALIGN)==0)
+ if ((v3d->flag & V3D_ALIGN)==0)
doRot = 1;
}
else if (tmode == TFM_RESIZE) {
@@ -4166,7 +4395,7 @@ void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode)
doLoc = 1;
}
else if (v3d->around == V3D_CURSOR)
- doLoc = 1;
+ doLoc = 1;
if ((v3d->flag & V3D_ALIGN)==0)
doScale = 1;
@@ -4205,13 +4434,13 @@ void autokeyframe_ob_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode)
insert_keyframe(id, NULL, "Object Transform", "scale", 1, cfra, flag);
insert_keyframe(id, NULL, "Object Transform", "scale", 2, cfra, flag);
}
-
+
// XXX todo... find a way to send notifiers from here...
}
}
-/* auto-keyframing feature - for poses/pose-channels
- * tmode: should be a transform mode
+/* auto-keyframing feature - for poses/pose-channels
+ * tmode: should be a transform mode
* targetless_ik: has targetless ik been done on any channels?
*/
void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode, short targetless_ik)
@@ -4223,13 +4452,14 @@ void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode,
bPose *pose= ob->pose;
bPoseChannel *pchan;
FCurve *fcu;
-
- if (autokeyframe_cfra_can_key(scene, ob)) {
+
+ // TODO: this should probably be done per channel instead...
+ if (autokeyframe_cfra_can_key(scene, id)) {
float cfra= (float)CFRA;
short flag= 0;
char buf[512];
- /* flag is initialised from UserPref keyframing settings
+ /* flag is initialised from UserPref keyframing settings
* - special exception for targetless IK - INSERTKEY_MATRIX keyframes should get
* visual keyframes even if flag not set, as it's not that useful otherwise
* (for quick animation recording)
@@ -4238,6 +4468,8 @@ void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode,
flag |= INSERTKEY_MATRIX;
if (IS_AUTOKEY_FLAG(INSERTNEEDED))
flag |= INSERTKEY_NEEDED;
+ if (IS_AUTOKEY_MODE(scene, EDITKEYS))
+ flag |= INSERTKEY_REPLACE;
for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
if (pchan->bone->flag & BONE_TRANSFORM) {
@@ -4257,22 +4489,22 @@ void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode,
/* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
if (tmode == TFM_TRANSLATION) {
- if (targetless_ik)
+ if (targetless_ik)
doRot= 1;
- else
+ else
doLoc = 1;
}
else if (tmode == TFM_ROTATION) {
if (ELEM(v3d->around, V3D_CURSOR, V3D_ACTIVE))
doLoc = 1;
- if ((v3d->flag & V3D_ALIGN)==0)
+ if ((v3d->flag & V3D_ALIGN)==0)
doRot = 1;
}
else if (tmode == TFM_RESIZE) {
if (ELEM(v3d->around, V3D_CURSOR, V3D_ACTIVE))
doLoc = 1;
-
+
if ((v3d->flag & V3D_ALIGN)==0)
doScale = 1;
}
@@ -4337,11 +4569,11 @@ void autokeyframe_pose_cb_func(Scene *scene, View3D *v3d, Object *ob, int tmode,
// XXX todo... figure out way to get appropriate notifiers sent
/* do the bone paths */
-#if 0 // TRANSFORM_FIX_ME
+#if 0 // XXX TRANSFORM FIX ME
if (arm->pathflag & ARM_PATH_ACFRA) {
- pose_clear_paths(ob);
- pose_recalculate_paths(ob);
- }
+ //pose_clear_paths(ob); // XXX for now, don't need to clear
+ ED_pose_recalculate_paths(C, scene, ob);
+ }
#endif
}
else {
@@ -4365,7 +4597,7 @@ void special_aftertrans_update(TransInfo *t)
// short redrawipo=0, resetslowpar=1;
int cancelled= (t->state == TRANS_CANCEL);
short duplicate= (t->undostr && strstr(t->undostr, "Duplicate")) ? 1 : 0;
-
+
if (t->spacetype==SPACE_VIEW3D) {
if (t->obedit) {
if (cancelled==0) {
@@ -4388,7 +4620,7 @@ void special_aftertrans_update(TransInfo *t)
#if 0 // TRANSFORM_FIX_ME, Would prefer to use this since the array takes into
// account what where transforming (with extend, locked strips etc)
// But at the moment t->data is freed in postTrans so for now re-shuffeling selected strips works ok. - Campbell
-
+
int a;
TransData *td= t->data;
@@ -4413,7 +4645,7 @@ void special_aftertrans_update(TransInfo *t)
for(seq= seqbasep->first; seq; seq= seq->next) {
max_machine = MAX2(max_machine, seq->machine);
}
-
+
for (machine = 0; machine <= max_machine; machine++)
{
for(seq= seqbasep->first; seq; seq= seq->next) {
@@ -4423,7 +4655,7 @@ void special_aftertrans_update(TransInfo *t)
}
}
#endif
-
+
for(seq= seqbasep->first; seq; seq= seq->next) {
/* We might want to build a list of effects that need to be updated during transform */
if(seq->type & SEQ_EFFECT) {
@@ -4435,7 +4667,7 @@ void special_aftertrans_update(TransInfo *t)
sort_seq(t->scene);
}
-
+
if (t->customData)
MEM_freeN(t->customData);
if (t->data)
@@ -4470,16 +4702,16 @@ void special_aftertrans_update(TransInfo *t)
/* these should all be ipo-blocks */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(&ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
- if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, fcu, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1);
posttrans_fcurve_clean(fcu);
- ANIM_nla_mapping_apply_fcurve(nob, fcu, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 1);
}
else
posttrans_fcurve_clean(fcu);
@@ -4496,13 +4728,13 @@ void special_aftertrans_update(TransInfo *t)
ob->ctime= -1234567.0f;
if (ob->pose || ob_get_key(ob))
- DAG_object_flush_update(scene, ob, OB_RECALC);
+ DAG_id_flush_update(&ob->id, OB_RECALC);
else
- DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
}
/* Do curve cleanups? */
- if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
posttrans_action_clean(&ac, (bAction *)ac.data);
@@ -4514,7 +4746,7 @@ void special_aftertrans_update(TransInfo *t)
Key *key= (Key *)ac.data;
if (key->ipo) {
- if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
posttrans_ipo_clean(key->ipo);
@@ -4522,7 +4754,7 @@ void special_aftertrans_update(TransInfo *t)
}
#endif // XXX old animation system
- DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
+ DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
}
#if 0 // XXX future of this is still not clear
else if (ac.datatype == ANIMCONT_GPENCIL) {
@@ -4533,12 +4765,12 @@ void special_aftertrans_update(TransInfo *t)
ScrArea *sa;
/* BAD... we need to loop over all screen areas for current screen...
- * - sync this with actdata_filter_gpencil() in editaction.c
+ * - sync this with actdata_filter_gpencil() in editaction.c
*/
for (sa= sc->areabase.first; sa; sa= sa->next) {
- bGPdata *gpd= gpencil_data_getactive(sa);
+ bGPdata *gpd= gpencil_data_get_active(sa);
- if (gpd)
+ if (gpd)
posttrans_gpd_clean(gpd);
}
}
@@ -4570,7 +4802,7 @@ void special_aftertrans_update(TransInfo *t)
if (ANIM_animdata_context_getdata(&ac) == 0)
return;
- if (ac.datatype)
+ if (ac.datatype)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -4579,18 +4811,17 @@ void special_aftertrans_update(TransInfo *t)
/* get channels to work on */
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
- /* these should all be ipo-blocks */
for (ale= anim_data.first; ale; ale= ale->next) {
- Object *nob= ANIM_nla_mapping_get(&ac, ale);
+ AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
- if ( (sipo->flag & SIPO_NOTRANSKEYCULL)==0 &&
+ if ( (sipo->flag & SIPO_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
- if (nob) {
- ANIM_nla_mapping_apply_fcurve(nob, fcu, 0, 1);
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1);
posttrans_fcurve_clean(fcu);
- ANIM_nla_mapping_apply_fcurve(nob, fcu, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 1);
}
else
posttrans_fcurve_clean(fcu);
@@ -4604,11 +4835,55 @@ void special_aftertrans_update(TransInfo *t)
/* make sure all F-Curves are set correctly */
ANIM_editkeyframes_refresh(&ac);
}
+ else if (t->spacetype == SPACE_NLA) {
+ Scene *scene;
+ bAnimContext ac;
+
+ /* 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));
+
+ scene= ac.scene= t->scene;
+ ob= ac.obact= OBACT;
+ ac.sa= t->sa;
+ ac.ar= t->ar;
+ ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+ ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+
+ if (ANIM_animdata_context_getdata(&ac) == 0)
+ return;
+
+ if (ac.datatype)
+ {
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NLATRACKS);
+
+ /* get channels to work on */
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* make sure strips are in order again */
+ BKE_nlatrack_sort_strips(nlt);
+
+ /* remove the temp metas */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+
+ /* free temp memory */
+ BLI_freelistN(&anim_data);
+
+ /* perform after-transfrom validation */
+ ED_nla_postop_refresh(&ac);
+ }
+ }
else if (t->obedit) {
// TRANSFORM_FIX_ME
// if (t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
// allqueue(REDRAWBUTSEDIT, 0);
-
+
if (t->obedit->type == OB_MESH)
{
EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
@@ -4621,11 +4896,11 @@ void special_aftertrans_update(TransInfo *t)
bPose *pose;
bPoseChannel *pchan;
short targetless_ik= 0;
-
+
ob= t->poseobj;
arm= ob->data;
pose= ob->pose;
-
+
/* if target-less IK grabbing, we calculate the pchan transforms and clear flag */
if (!cancelled && t->mode==TFM_TRANSLATION)
targetless_ik= apply_targetless_ik(ob);
@@ -4636,70 +4911,68 @@ void special_aftertrans_update(TransInfo *t)
if(data) data->flag &= ~CONSTRAINT_IK_AUTO;
}
}
-
+
if (t->mode==TFM_TRANSLATION)
pose_grab_with_ik_clear(ob);
-
+
/* 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(t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
- DAG_object_flush_update(t->scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else if (arm->flag & ARM_DELAYDEFORM) {
/* old optimize trick... this enforces to bypass the depgraph */
- DAG_object_flush_update(t->scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
ob->recalc= 0; // is set on OK position already by recalcData()
}
- else
- DAG_object_flush_update(t->scene, ob, OB_RECALC_DATA);
-
+ else
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
//if (t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
// allqueue(REDRAWBUTSEDIT, 0);
-
+
}
- else if(G.f & G_PARTICLEEDIT) {
+ else if(t->scene->basact && (ob = t->scene->basact->object) && ob->mode & OB_MODE_PARTICLE_EDIT) {
;
}
- else {
+ else {
/* Objects */
// XXX ideally, this would go through context iterators, but we don't have context iterator access here,
// so we make do with old data + access styles...
Scene *scene= t->scene;
Base *base;
-
+
for (base= FIRSTBASE; base; base= base->next) {
ob= base->object;
-
+
if (base->flag & SELECT && (t->mode != TFM_DUMMY)) {
+ ListBase pidlist;
+ PTCacheID *pid;
+
+ /* flag object caches as outdated */
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->type != PTCACHE_TYPE_PARTICLES) /* particles don't need reset on geometry change */
+ pid->cache->flag |= PTCACHE_OUTDATED;
+ }
+
/* pointcache refresh */
- if (BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH))
+ if (BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
ob->recalc |= OB_RECALC_DATA;
-
+
+ /* Needed for proper updating of "quick cached" dynamics. */
+ /* 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);
+
/* Set autokey if necessary */
if (!cancelled)
autokeyframe_ob_cb_func(t->scene, (View3D *)t->view, ob, t->mode);
}
}
}
-
-#if 0 // TRANSFORM_FIX_ME
- else if (t->spacetype == SPACE_NLA) {
- recalc_all_ipos(); // bad
- synchronize_action_strips();
-
- /* cleanup */
- for (base=t->scene->base.first; base; base=base->next)
- base->flag &= ~(BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA);
-
- /* after transform, remove duplicate keyframes on a frame that resulted from transform */
- if ( (G.snla->flag & SNLA_NOTRANSKEYCULL)==0 &&
- ((cancelled == 0) || (duplicate)) )
- {
- posttrans_nla_clean(t);
- }
- }
-#endif
-
+
clear_trans_object_base_flags(t);
#if 0 // TRANSFORM_FIX_ME
@@ -4708,10 +4981,10 @@ void special_aftertrans_update(TransInfo *t)
allqueue(REDRAWACTION, 0);
allqueue(REDRAWIPO, 0);
}
-
+
if(resetslowpar)
reset_slowparents();
-
+
/* note; should actually only be done for all objects when a lamp is moved... (ton) */
if(t->spacetype==SPACE_VIEW3D && G.vd->drawtype == OB_SHADED)
reshadeall_displist();
@@ -4724,56 +4997,58 @@ static void createTransObject(bContext *C, TransInfo *t)
TransDataExtension *tx;
// IpoKey *ik;
// ListBase elems;
-
+
set_trans_object_base_flags(C, t);
- /* count */
+ /* count */
+#if 0 // TRANSFORM_FIX_ME
CTX_DATA_BEGIN(C, Object*, ob, selected_objects)
{
-#if 0 // TRANSFORM_FIX_ME
/* store ipo keys? */
if ((ob->id.lib == 0) && (ob->ipo) && (ob->ipo->showkey) && (ob->ipoflag & OB_DRAWKEY)) {
elems.first= elems.last= NULL;
make_ipokey_transform(ob, &elems, 1); /* '1' only selected keys */
-
+
pushdata(&elems, sizeof(ListBase));
-
+
for(ik= elems.first; ik; ik= ik->next)
t->total++;
-
+
if(elems.first==NULL)
t->total++;
}
-#endif
// else {
t->total++;
// }
}
CTX_DATA_END;
+#else
+ t->total= CTX_DATA_COUNT(C, selected_objects);
+#endif
if(!t->total) {
/* clear here, main transform function escapes too */
clear_trans_object_base_flags(t);
return;
}
-
+
td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransOb");
tx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "TransObExtension");
CTX_DATA_BEGIN(C, Base*, base, selected_bases)
{
Object *ob= base->object;
-
+
td->flag = TD_SELECTED;
td->protectflag= ob->protectflag;
td->ext = tx;
-
+
if (base->flag & BA_TRANSFORM_CHILD)
{
td->flag |= TD_NOCENTER;
td->flag |= TD_NO_LOC;
}
-
+
/* select linked objects, but skip them later */
if (ob->id.lib != 0) {
td->flag |= TD_SKIP;
@@ -4783,55 +5058,55 @@ static void createTransObject(bContext *C, TransInfo *t)
// TRANSFORM_FIX_ME
#if 0
if((ob->id.lib == 0) && (ob->ipo) && (ob->ipo->showkey) && (ob->ipoflag & OB_DRAWKEY)) {
-
+
popfirst(&elems); // bring back pushed listbase
-
+
if(elems.first) {
int cfraont;
int ipoflag;
-
+
base->flag |= BA_DO_IPO+BA_WAS_SEL;
base->flag &= ~SELECT;
-
+
cfraont= CFRA;
set_no_parent_ipo(1);
ipoflag= ob->ipoflag;
ob->ipoflag &= ~OB_OFFS_OB;
-
+
/*
* This is really EVIL code that pushes down Object values
* (loc, dloc, orig, size, dsize, rot, drot)
* */
-
+
pushdata((void*)ob->loc, 7 * 3 * sizeof(float)); // tsk! tsk!
-
+
for(ik= elems.first; ik; ik= ik->next) {
-
+
/* weak... this doesn't correct for floating values, giving small errors */
CFRA= (int)(ik->val/t->scene->r.framelen);
-
+
do_ob_ipo(ob);
ObjectToTransData(C, t, td, ob); // does where_is_object()
-
+
td->flag= TD_SELECTED;
-
+
td->tdi= MEM_callocN(sizeof(TransDataIpokey), "TransDataIpokey");
/* also does tdi->flag and oldvals, needs to be after ob_to_transob()! */
ipokey_to_transdata(ik, td);
-
+
td++;
tx++;
if(ik->next) td->ext= tx; // prevent corrupting mem!
}
free_ipokey(&elems);
-
+
poplast(ob->loc);
set_no_parent_ipo(0);
-
+
CFRA= cfraont;
ob->ipoflag= ipoflag;
-
- where_is_object(t->scene, ob); // restore
+
+ where_is_object(t->scene, ob); // restore
}
else {
ObjectToTransData(C, t, td, ob);
@@ -4855,7 +5130,7 @@ static void createTransObject(bContext *C, TransInfo *t)
/* transcribe given node into TransData2D for Transforming */
static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node)
-// static void NodeToTransData(bContext *C, TransInfo *t, TransData2D *td, bNode *node)
+// static void NodeToTransData(bContext *C, TransInfo *t, TransData2D *td, bNode *node)
{
td2d->loc[0] = node->locx; /* hold original location */
td2d->loc[1] = node->locy;
@@ -4883,22 +5158,22 @@ void createTransNodeData(bContext *C, TransInfo *t)
{
TransData *td;
TransData2D *td2d;
-
+
t->total= CTX_DATA_COUNT(C, selected_nodes);
-
+
td = t->data = MEM_callocN(t->total*sizeof(TransData), "TransNode TransData");
td2d = t->data2d = MEM_callocN(t->total*sizeof(TransData2D), "TransNode TransData2D");
-
+
CTX_DATA_BEGIN(C, bNode *, selnode, selected_nodes)
NodeToTransData(td++, td2d++, selnode);
CTX_DATA_END
}
-void createTransData(bContext *C, TransInfo *t)
+void createTransData(bContext *C, TransInfo *t)
{
Scene *scene = CTX_data_scene(C);
Object *ob = OBACT;
-
+
if (t->options == CTX_TEXTURE) {
t->flag |= T_TEXTURE;
createTransTexspace(C, t);
@@ -4932,8 +5207,7 @@ void createTransData(bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_NLA) {
t->flag |= T_POINTS|T_2D_EDIT;
- // TRANSFORM_FIX_ME
- //createTransNlaData(C, t);
+ createTransNlaData(C, t);
}
else if (t->spacetype == SPACE_SEQ) {
t->flag |= T_POINTS|T_2D_EDIT;
@@ -4943,7 +5217,7 @@ void createTransData(bContext *C, TransInfo *t)
else if (t->spacetype == SPACE_IPO) {
t->flag |= T_POINTS|T_2D_EDIT;
createTransGraphEditData(C, t);
-#if 0
+#if 0
if (t->data && (t->flag & T_PROP_EDIT)) {
sort_trans_data(t); // makes selected become first in array
set_prop_dist(t, 1);
@@ -4963,7 +5237,7 @@ void createTransData(bContext *C, TransInfo *t)
else if (t->obedit) {
t->ext = NULL;
if (t->obedit->type == OB_MESH) {
- createTransEditVerts(C, t);
+ createTransEditVerts(C, t);
}
else if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
createTransCurveVerts(C, t);
@@ -4977,7 +5251,7 @@ void createTransData(bContext *C, TransInfo *t)
else if (t->obedit->type==OB_ARMATURE) {
t->flag &= ~T_PROP_EDIT;
createTransArmatureVerts(C, t);
- }
+ }
else {
printf("edit type not implemented!\n");
}
@@ -4996,7 +5270,7 @@ void createTransData(bContext *C, TransInfo *t)
}
t->flag |= T_EDIT|T_POINTS;
-
+
/* exception... hackish, we want bonesize to use bone orientation matrix (ton) */
if(t->mode==TFM_BONESIZE) {
t->flag &= ~(T_EDIT|T_POINTS);
@@ -5004,18 +5278,18 @@ void createTransData(bContext *C, TransInfo *t)
t->poseobj = ob; /* <- tsk tsk, this is going to give issues one day */
}
}
- else if (ob && (ob->flag & OB_POSEMODE)) {
- // XXX this is currently limited to active armature only...
+ 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);
}
- else if (G.f & G_WEIGHTPAINT) {
+ 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->flag & OB_POSEMODE)
+ if((ob_armature->mode & OB_MODE_POSE) && ob_armature == modifiers_isDeformedByArmature(ob))
{
createTransPose(C, t, ob_armature);
break;
@@ -5024,7 +5298,8 @@ void createTransData(bContext *C, TransInfo *t)
}
CTX_DATA_END;
}
- else if (G.f & G_PARTICLEEDIT && PE_can_edit(PE_get_current(scene, ob))) {
+ else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)
+ && PE_start_edit(PE_get_current(scene, ob))) {
createTransParticleVerts(C, t);
if(t->data && t->flag & T_PROP_EDIT) {
@@ -5037,14 +5312,16 @@ void createTransData(bContext *C, TransInfo *t)
}
else {
t->flag &= ~T_PROP_EDIT; /* no proportional edit in object mode */
+ t->options |= CTX_NO_PET;
+
createTransObject(C, t);
t->flag |= T_OBJECT;
-
+
if (t->ar->regiontype == RGN_TYPE_WINDOW)
{
View3D *v3d = t->view;
- RegionView3D *rv3d = t->ar->regiondata;
- if((t->flag & T_OBJECT) && v3d->camera == OBACT && rv3d->persp==V3D_CAMOB)
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ if(rv3d && (t->flag & T_OBJECT) && v3d->camera == OBACT && rv3d->persp==V3D_CAMOB)
{
t->flag |= T_CAMERA;
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index e157d7f68f9..ea5653dc130 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -59,14 +59,12 @@
//#include "BIF_screen.h"
//#include "BIF_mywindow.h"
#include "BIF_gl.h"
-//#include "BIF_editaction.h"
//#include "BIF_editmesh.h"
-//#include "BIF_editnla.h"
//#include "BIF_editsima.h"
//#include "BIF_editparticle.h"
//#include "BIF_meshtools.h"
-#include "BIF_retopo.h"
+#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_anim.h"
#include "BKE_armature.h"
@@ -82,6 +80,7 @@
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_nla.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "BKE_context.h"
@@ -90,7 +89,10 @@
#include "ED_armature.h"
#include "ED_image.h"
#include "ED_keyframing.h"
+#include "ED_markers.h"
#include "ED_mesh.h"
+#include "ED_retopo.h"
+#include "ED_screen_types.h"
#include "ED_space_api.h"
#include "ED_uvedit.h"
#include "ED_view3d.h"
@@ -102,6 +104,8 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "RNA_access.h"
+
#include "WM_types.h"
#include "UI_resources.h"
@@ -114,8 +118,6 @@
extern ListBase editelems;
-extern TransInfo Trans; /* From transform.c */
-
/* ************************** Functions *************************** */
void getViewVector(TransInfo *t, float coord[3], float vec[3])
@@ -154,8 +156,8 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
for (; md; md=md->next) {
if (md->type==eModifierType_Mirror) {
- MirrorModifierData *mmd = (MirrorModifierData*) md;
-
+ MirrorModifierData *mmd = (MirrorModifierData*) md;
+
if(mmd->flag & MOD_MIR_CLIPPING) {
axis = 0;
if(mmd->flag & MOD_MIR_AXIS_X) {
@@ -174,7 +176,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
float mtx[4][4], imtx[4][4];
int i;
TransData *td = t->data;
-
+
if (mmd->mirror_ob) {
float obinv[4][4];
@@ -191,10 +193,10 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
break;
if (td->loc==NULL)
break;
-
+
if (td->flag & TD_SKIP)
continue;
-
+
VecCopyf(loc, td->loc);
VecCopyf(iloc, td->iloc);
@@ -205,22 +207,22 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
clip = 0;
if(axis & 1) {
- if(fabs(iloc[0])<=tolerance[0] ||
+ if(fabs(iloc[0])<=tolerance[0] ||
loc[0]*iloc[0]<0.0f) {
loc[0]= 0.0f;
clip = 1;
}
}
-
+
if(axis & 2) {
- if(fabs(iloc[1])<=tolerance[1] ||
+ if(fabs(iloc[1])<=tolerance[1] ||
loc[1]*iloc[1]<0.0f) {
loc[1]= 0.0f;
clip = 1;
}
}
if(axis & 4) {
- if(fabs(iloc[2])<=tolerance[2] ||
+ if(fabs(iloc[2])<=tolerance[2] ||
loc[2]*iloc[2]<0.0f) {
loc[2]= 0.0f;
clip = 1;
@@ -246,7 +248,7 @@ static void editmesh_apply_to_mirror(TransInfo *t)
TransData *td = t->data;
EditVert *eve;
int i;
-
+
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
@@ -254,111 +256,97 @@ static void editmesh_apply_to_mirror(TransInfo *t)
break;
if (td->flag & TD_SKIP)
continue;
-
+
eve = td->extra;
if(eve) {
eve->co[0]= -td->loc[0];
eve->co[1]= td->loc[1];
eve->co[2]= td->loc[2];
- }
- }
+ }
+ }
}
-/* called for updating while transform acts, once per redraw */
-void recalcData(TransInfo *t)
+/* tags the given ID block for refreshes (if applicable) due to
+ * Animation Editor editing
+ */
+static void animedit_refresh_id_tags (Scene *scene, ID *id)
{
- Scene *scene = t->scene;
- Base *base;
-
-#if 0 // TRANSFORM_FIX_ME
- if (t->spacetype == SPACE_ACTION) {
- Object *ob= OBACT;
- void *data;
- short context;
-
- /* determine what type of data we are operating on */
- data = get_action_context(&context);
- if (data == NULL) return;
-
- /* always flush data if gpencil context */
- if (context == ACTCONT_GPENCIL) {
- flushTransGPactionData(t);
- }
+ if (id) {
+ AnimData *adt= BKE_animdata_from_id(id);
- if (G.saction->lock) {
- if (context == ACTCONT_ACTION) {
- if(ob) {
- ob->ctime= -1234567.0f;
- if(ob->pose || ob_get_key(ob))
- DAG_object_flush_update(G.scene, ob, OB_RECALC);
- else
- DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
- }
- }
- else if (context == ACTCONT_SHAPEKEY) {
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB|OB_RECALC_DATA);
+ /* tag AnimData for refresh so that other views will update in realtime with these changes */
+ if (adt)
+ adt->recalc |= ADT_RECALC_ANIM;
+
+ /* if ID-block is Object, set recalc flags */
+ switch (GS(id->name)) {
+ case ID_OB:
+ {
+ Object *ob= (Object *)id;
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
}
+ break;
}
- }
- else if (t->spacetype == SPACE_NLA) {
- if (G.snla->lock) {
- for (base=G.scene->base.first; base; base=base->next) {
- if (base->flag & BA_HAS_RECALC_OB)
- base->object->recalc |= OB_RECALC_OB;
- if (base->flag & BA_HAS_RECALC_DATA)
- base->object->recalc |= OB_RECALC_DATA;
-
- if (base->object->recalc)
- base->object->ctime= -1234567.0f; // eveil!
+ }
+}
+
+/* for the realtime animation recording feature, handle overlapping data */
+static void animrecord_check_state (Scene *scene, ID *id, wmTimer *animtimer)
+{
+ ScreenAnimData *sad= (animtimer) ? animtimer->customdata : NULL;
+
+ /* sanity checks */
+ if ELEM3(NULL, scene, id, sad)
+ return;
+
+ /* check if we need a new strip if:
+ * - if animtimer is running
+ * - 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 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);
+
+ /* perform push-down manually with some differences
+ * NOTE: BKE_nla_action_pushdown() sync warning...
+ */
+ if ((adt->action) && !(adt->flag & ADT_NLA_EDIT_ON)) {
+ float astart, aend;
- /* recalculate scale of selected nla-strips */
- if (base->object->nlastrips.first) {
- Object *bob= base->object;
- bActionStrip *strip;
+ /* only push down if action is more than 1-2 frames long */
+ calc_action_range(adt->action, &astart, &aend, 1);
+ if (aend > astart+2.0f) {
+ NlaStrip *strip= add_nlastrip_to_stack(adt, adt->action);
- for (strip= bob->nlastrips.first; strip; strip= strip->next) {
- if (strip->flag & ACTSTRIP_SELECT) {
- float actlen= strip->actend - strip->actstart;
- float len= strip->end - strip->start;
-
- strip->scale= len / (actlen * strip->repeat);
- }
- }
- }
- }
-
- DAG_scene_flush_update(G.scene, screen_view3d_layers(), 0);
- }
- else {
- for (base=G.scene->base.first; base; base=base->next) {
- /* recalculate scale of selected nla-strips */
- if (base->object && base->object->nlastrips.first) {
- Object *bob= base->object;
- bActionStrip *strip;
+ /* clear reference to action now that we've pushed it onto the stack */
+ adt->action->id.us--;
+ adt->action= NULL;
- for (strip= bob->nlastrips.first; strip; strip= strip->next) {
- if (strip->flag & ACTSTRIP_SELECT) {
- float actlen= strip->actend - strip->actstart;
- float len= strip->end - strip->start;
-
- /* prevent 'negative' scaling */
- if (len < 0) {
- SWAP(float, strip->start, strip->end);
- len= fabs(len);
- }
-
- /* calculate new scale */
- strip->scale= len / (actlen * strip->repeat);
- }
- }
+ /* adjust blending + extend so that they will behave correctly */
+ strip->extendmode= NLASTRIP_EXTEND_NOTHING;
+ strip->flag &= ~(NLASTRIP_FLAG_AUTO_BLENDS|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_ACTIVE);
+
+ /* also, adjust the AnimData's action extend mode to be on
+ * 'nothing' so that previous result still play
+ */
+ adt->act_extendmode= NLASTRIP_EXTEND_NOTHING;
}
}
}
}
-#endif
+}
+
+/* called for updating while transform acts, once per redraw */
+void recalcData(TransInfo *t)
+{
+ Scene *scene = t->scene;
+ Base *base = scene->basact;
+
if (t->obedit) {
}
- else if(G.f & G_PARTICLEEDIT) {
+ else if(base && base->object->mode & OB_MODE_PARTICLE_EDIT) {
flushTransParticles(t);
}
if (t->spacetype==SPACE_NODE) {
@@ -367,8 +355,41 @@ void recalcData(TransInfo *t)
else if (t->spacetype==SPACE_SEQ) {
flushTransSeq(t);
}
+ else if (t->spacetype == SPACE_ACTION) {
+ Scene *scene= t->scene;
+
+ bAnimContext ac;
+ 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;
+ ac.ar= t->ar;
+ ac.spacetype= (t->sa)? t->sa->spacetype : 0;
+ ac.regiontype= (t->ar)? t->ar->regiontype : 0;
+
+ 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 */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* set refresh tags for objects using this animation */
+ animedit_refresh_id_tags(t->scene, ale->id);
+ }
+
+ /* now free temp channels */
+ BLI_freelistN(&anim_data);
+ }
else if (t->spacetype == SPACE_IPO) {
- SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
Scene *scene;
ListBase anim_data = {NULL, NULL};
@@ -408,27 +429,200 @@ void recalcData(TransInfo *t)
dosort++;
else
calchandles_fcurve(fcu);
+
+ /* set refresh tags for objects using this animation */
+ animedit_refresh_id_tags(t->scene, ale->id);
}
/* do resort and other updates? */
if (dosort) remake_graph_transdata(t, &anim_data);
- //if (sipo->showkey) update_ipokey_val();
/* now free temp channels */
BLI_freelistN(&anim_data);
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ TransDataNla *tdn= (TransDataNla *)t->customData;
+ SpaceNla *snla= (SpaceNla *)t->sa->spacedata.first;
+ Scene *scene= t->scene;
+ double secf= FPS;
+ int i;
- /* update realtime - not working? */
- if (sipo->lock) {
-
+ /* for each strip we've got, perform some additional validation of the values that got set before
+ * using RNA to set the value (which does some special operations when setting these values to make
+ * sure that everything works ok)
+ */
+ for (i = 0; i < t->total; i++, tdn++) {
+ NlaStrip *strip= tdn->strip;
+ PointerRNA strip_ptr;
+ short pExceeded, nExceeded, iter;
+ int delta_y1, delta_y2;
+
+ /* if this tdn has no handles, that means it is just a dummy that should be skipped */
+ if (tdn->handle == 0)
+ continue;
+
+ /* set refresh tags for objects using this animation */
+ animedit_refresh_id_tags(t->scene, tdn->id);
+
+ /* if cancelling transform, just write the values without validating, then move on */
+ if (t->state == TRANS_CANCEL) {
+ /* clear the values by directly overwriting the originals, but also need to restore
+ * endpoints of neighboring transition-strips
+ */
+
+ /* start */
+ strip->start= tdn->h1[0];
+
+ if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION))
+ strip->prev->end= tdn->h1[0];
+
+ /* end */
+ strip->end= tdn->h2[0];
+
+ if ((strip->next) && (strip->next->type == NLASTRIP_TYPE_TRANSITION))
+ strip->next->start= tdn->h2[0];
+
+ /* flush transforms to child strips (since this should be a meta) */
+ BKE_nlameta_flush_transforms(strip);
+
+ /* restore to original track (if needed) */
+ if (tdn->oldTrack != tdn->nlt) {
+ /* just append to end of list for now, since strips get sorted in special_aftertrans_update() */
+ BLI_remlink(&tdn->nlt->strips, strip);
+ BLI_addtail(&tdn->oldTrack->strips, strip);
+ }
+
+ continue;
+ }
+
+ /* firstly, check if the proposed transform locations would overlap with any neighbouring strips
+ * (barring transitions) which are absolute barriers since they are not being moved
+ *
+ * this is done as a iterative procedure (done 5 times max for now)
+ */
+ for (iter=0; iter < 5; iter++) {
+ pExceeded= ((strip->prev) && (strip->prev->type != NLASTRIP_TYPE_TRANSITION) && (tdn->h1[0] < strip->prev->end));
+ nExceeded= ((strip->next) && (strip->next->type != NLASTRIP_TYPE_TRANSITION) && (tdn->h2[0] > strip->next->start));
+
+ if ((pExceeded && nExceeded) || (iter == 4) ) {
+ /* both endpoints exceeded (or iteration ping-pong'd meaning that we need a compromise)
+ * - simply crop strip to fit within the bounds of the strips bounding it
+ * - if there were no neighbours, clear the transforms (make it default to the strip's current values)
+ */
+ if (strip->prev && strip->next) {
+ tdn->h1[0]= strip->prev->end;
+ tdn->h2[0]= strip->next->start;
+ }
+ else {
+ tdn->h1[0]= strip->start;
+ tdn->h2[0]= strip->end;
+ }
+ }
+ else if (nExceeded) {
+ /* move backwards */
+ float offset= tdn->h2[0] - strip->next->start;
+
+ tdn->h1[0] -= offset;
+ tdn->h2[0] -= offset;
+ }
+ else if (pExceeded) {
+ /* more forwards */
+ float offset= strip->prev->end - tdn->h1[0];
+
+ tdn->h1[0] += offset;
+ tdn->h2[0] += offset;
+ }
+ else /* all is fine and well */
+ break;
+ }
+
+ /* handle auto-snapping */
+ switch (snla->autosnap) {
+ case SACTSNAP_FRAME: /* snap to nearest frame/time */
+ if (snla->flag & SNLA_DRAWTIME) {
+ tdn->h1[0]= (float)( floor((tdn->h1[0]/secf) + 0.5f) * secf );
+ tdn->h2[0]= (float)( floor((tdn->h2[0]/secf) + 0.5f) * secf );
+ }
+ else {
+ tdn->h1[0]= (float)( floor(tdn->h1[0]+0.5f) );
+ tdn->h2[0]= (float)( floor(tdn->h2[0]+0.5f) );
+ }
+ break;
+
+ case SACTSNAP_MARKER: /* snap to nearest marker */
+ tdn->h1[0]= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h1[0]);
+ tdn->h2[0]= (float)ED_markers_find_nearest_marker_time(&t->scene->markers, tdn->h2[0]);
+ break;
+ }
+
+ /* use RNA to write the values... */
+ // TODO: do we need to write in 2 passes to make sure that no truncation goes on?
+ RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
+
+ RNA_float_set(&strip_ptr, "start_frame", tdn->h1[0]);
+ RNA_float_set(&strip_ptr, "end_frame", tdn->h2[0]);
+
+ /* flush transforms to child strips (since this should be a meta) */
+ BKE_nlameta_flush_transforms(strip);
+
+
+ /* now, check if we need to try and move track
+ * - we need to calculate both, as only one may have been altered by transform if only 1 handle moved
+ */
+ delta_y1= ((int)tdn->h1[1] / NLACHANNEL_STEP - tdn->trackIndex);
+ delta_y2= ((int)tdn->h2[1] / NLACHANNEL_STEP - tdn->trackIndex);
+
+ if (delta_y1 || delta_y2) {
+ NlaTrack *track;
+ int delta = (delta_y2) ? delta_y2 : delta_y1;
+ int n;
+
+ /* move in the requested direction, checking at each layer if there's space for strip to pass through,
+ * stopping on the last track available or that we're able to fit in
+ */
+ if (delta > 0) {
+ for (track=tdn->nlt->next, n=0; (track) && (n < delta); track=track->next, n++) {
+ /* check if space in this track for the strip */
+ if (BKE_nlatrack_has_space(track, strip->start, strip->end)) {
+ /* move strip to this track */
+ BLI_remlink(&tdn->nlt->strips, strip);
+ 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 */
+ }
+ else /* can't move any further */
+ break;
+ }
+ }
+ else {
+ /* make delta 'positive' before using it, since we now know to go backwards */
+ delta= -delta;
+
+ for (track=tdn->nlt->prev, n=0; (track) && (n < delta); track=track->prev, n++) {
+ /* check if space in this track for the strip */
+ if (BKE_nlatrack_has_space(track, strip->start, strip->end)) {
+ /* move strip to this track */
+ BLI_remlink(&tdn->nlt->strips, strip);
+ 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 */
+ }
+ else /* can't move any further */
+ break;
+ }
+ }
+ }
}
}
else if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= t->obedit->data;
Nurb *nu= cu->editnurb->first;
-
- DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */
-
+
+ DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+
if (t->state == TRANS_CANCEL) {
while(nu) {
calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
@@ -447,8 +641,8 @@ void recalcData(TransInfo *t)
}
else if(t->obedit->type==OB_LATTICE) {
Lattice *la= t->obedit->data;
- DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */
-
+ DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+
if(la->editlatt->flag & LT_OUTSIDE) outside_lattice(la->editlatt);
}
else if (t->obedit->type == OB_MESH) {
@@ -458,8 +652,8 @@ void recalcData(TransInfo *t)
flushTransUVs(t);
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_re_solve();
-
- DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA);
+
+ DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);
} else {
EditMesh *em = ((Mesh*)t->obedit->data)->edit_mesh;
/* mirror modifier clipping? */
@@ -473,9 +667,9 @@ void recalcData(TransInfo *t)
}
if((t->options & CTX_NO_MIRROR) == 0 && (t->flag & T_MIRROR))
editmesh_apply_to_mirror(t);
-
- DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */
-
+
+ DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+
recalc_editnormals(em);
}
}
@@ -485,10 +679,10 @@ void recalcData(TransInfo *t)
EditBone *ebo;
TransData *td = t->data;
int i;
-
+
/* Ensure all bones are correctly adjusted */
for (ebo = edbo->first; ebo; ebo = ebo->next){
-
+
if ((ebo->flag & BONE_CONNECTED) && ebo->parent){
/* If this bone has a parent tip that has been moved */
if (ebo->parent->flag & BONE_TIPSEL){
@@ -501,7 +695,7 @@ void recalcData(TransInfo *t)
if(t->mode==TFM_BONE_ENVELOPE) ebo->parent->rad_tail= ebo->rad_head;
}
}
-
+
/* on extrude bones, oldlength==0.0f, so we scale radius of points */
ebo->length= VecLenf(ebo->head, ebo->tail);
if(ebo->oldlength==0.0f) {
@@ -521,8 +715,8 @@ void recalcData(TransInfo *t)
ebo->oldlength= ebo->length;
}
}
-
-
+
+
if (t->mode != TFM_BONE_ROLL)
{
/* fix roll */
@@ -532,10 +726,10 @@ void recalcData(TransInfo *t)
{
float vec[3], up_axis[3];
float qrot[4];
-
+
ebo = td->extra;
VECCOPY(up_axis, td->axismtx[2]);
-
+
if (t->mode != TFM_ROTATION)
{
VecSubf(vec, ebo->tail, ebo->head);
@@ -547,37 +741,38 @@ void recalcData(TransInfo *t)
{
Mat3MulVecfl(t->mat, up_axis);
}
-
+
ebo->roll = ED_rollBoneToVector(ebo, up_axis);
}
}
}
-
- if(arm->flag & ARM_MIRROR_EDIT)
+
+ if(arm->flag & ARM_MIRROR_EDIT)
transform_armature_mirror_update(t->obedit);
-
+
}
else
- DAG_object_flush_update(scene, t->obedit, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
}
else if( (t->flag & T_POSE) && t->poseobj) {
Object *ob= t->poseobj;
bArmature *arm= ob->data;
-
+
/* 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)
*/
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
- // TODO: maybe the ob->adt check isn't really needed? makes it too difficult to use...
- if (/*(ob->adt) && */(t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
- short targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
+ if ((t->animtimer) && 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(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_object_flush_update(scene, ob, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
}
else
where_is_pose(scene, ob);
@@ -585,13 +780,13 @@ void recalcData(TransInfo *t)
else {
for(base= FIRSTBASE; base; base= base->next) {
Object *ob= base->object;
-
+
/* this flag is from depgraph, was stored in initialize phase, handled in drawview.c */
if(base->flag & BA_HAS_RECALC_OB)
ob->recalc |= OB_RECALC_OB;
if(base->flag & BA_HAS_RECALC_DATA)
ob->recalc |= OB_RECALC_DATA;
-
+
/* if object/base is selected */
if ((base->flag & SELECT) || (ob->flag & SELECT)) {
/* if animtimer is running, and the object already has animation data,
@@ -599,18 +794,18 @@ void recalcData(TransInfo *t)
* (i.e. uneditable animation values)
*/
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
- // TODO: maybe the ob->adt check isn't really needed? makes it too difficult to use...
- if (/*(ob->adt) && */(t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
+ if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
+ animrecord_check_state(t->scene, &ob->id, t->animtimer);
autokeyframe_ob_cb_func(t->scene, (View3D *)t->view, ob, t->mode);
}
}
-
+
/* proxy exception */
if(ob->proxy)
ob->proxy->recalc |= ob->recalc;
if(ob->proxy_group)
group_tag_recalc(ob->proxy_group->dup_group);
- }
+ }
}
/* update shaded drawmode while transform */
@@ -622,22 +817,22 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
{
float v1[3], v2[3], v3[3];
char col[3], col2[3];
-
+
if (t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = t->view;
-
+
glPushMatrix();
-
+
//if(t->obedit) glLoadMatrixf(t->obedit->obmat); // sets opengl viewing
-
-
+
+
VecCopyf(v3, dir);
VecMulf(v3, v3d->far);
-
+
VecSubf(v2, center, v3);
VecAddf(v1, center, v3);
-
+
if (options & DRAWLIGHT) {
col[0] = col[1] = col[2] = 220;
}
@@ -646,13 +841,13 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
}
UI_make_axis_color(col, col2, axis);
glColor3ubv((GLubyte *)col2);
-
+
setlinestyle(0);
- glBegin(GL_LINE_STRIP);
- glVertex3fv(v1);
- glVertex3fv(v2);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(v1);
+ glVertex3fv(v2);
glEnd();
-
+
glPopMatrix();
}
}
@@ -669,13 +864,13 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
ARegion *ar = CTX_wm_region(C);
ScrArea *sa = CTX_wm_area(C);
Object *obedit = CTX_data_edit_object(C);
-
+
/* moving: is shown in drawobject() (transform color) */
-// TRANSFORM_FIX_ME
+// TRANSFORM_FIX_ME
// if(obedit || (t->flag & T_POSE) ) G.moving= G_TRANSFORM_EDIT;
// else if(G.f & G_PARTICLEEDIT) G.moving= G_TRANSFORM_PARTICLE;
// else G.moving= G_TRANSFORM_OBJ;
-
+
t->scene = sce;
t->sa = sa;
t->ar = ar;
@@ -688,14 +883,14 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
t->helpline = HLP_NONE;
t->flag = 0;
-
+
t->redraw = 1; /* redraw first time */
-
+
if (event)
{
t->imval[0] = event->x - t->ar->winrct.xmin;
t->imval[1] = event->y - t->ar->winrct.ymin;
-
+
t->event_type = event->type;
}
else
@@ -703,7 +898,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
t->imval[0] = 0;
t->imval[1] = 0;
}
-
+
t->con.imval[0] = t->imval[0];
t->con.imval[1] = t->imval[1];
@@ -720,27 +915,27 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
t->vec[0] =
t->vec[1] =
t->vec[2] = 0.0f;
-
+
t->center[0] =
t->center[1] =
t->center[2] = 0.0f;
-
+
Mat3One(t->mat);
-
+
t->spacetype = sa->spacetype;
if(t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = sa->spacedata.first;
-
+
t->view = v3d;
t->animtimer= CTX_wm_screen(C)->animtimer;
-
+
if(v3d->flag & V3D_ALIGN) t->flag |= T_V3D_ALIGN;
t->around = v3d->around;
if (op && RNA_struct_find_property(op->ptr, "constraint_axis") && RNA_property_is_set(op->ptr, "constraint_orientation"))
{
- t->current_orientation = RNA_int_get(op->ptr, "constraint_orientation");
+ t->current_orientation = RNA_enum_get(op->ptr, "constraint_orientation");
if (t->current_orientation >= V3D_MANIP_CUSTOM + BIF_countTransformOrientation(C) - 1)
{
@@ -763,7 +958,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
{
// XXX for now, get View2D from the active region
t->view = &ar->v2d;
-
+
t->around = V3D_CENTER;
}
@@ -783,61 +978,70 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
}
}
- /* setting PET flag */
- if (op && RNA_struct_find_property(op->ptr, "proportional") && RNA_property_is_set(op->ptr, "proportional"))
+ /* setting PET flag only if property exist in operator. Otherwise, assume it's not supported */
+ if (op && RNA_struct_find_property(op->ptr, "proportional"))
{
- switch(RNA_enum_get(op->ptr, "proportional"))
+ if (RNA_property_is_set(op->ptr, "proportional"))
{
- case 2: /* XXX connected constant */
- t->flag |= T_PROP_CONNECTED;
- case 1: /* XXX prop on constant */
- t->flag |= T_PROP_EDIT;
- break;
+ switch(RNA_enum_get(op->ptr, "proportional"))
+ {
+ case 2: /* XXX connected constant */
+ t->flag |= T_PROP_CONNECTED;
+ case 1: /* XXX prop on constant */
+ t->flag |= T_PROP_EDIT;
+ break;
+ }
}
- }
- else
- {
- if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) {
- t->flag |= T_PROP_EDIT;
-
- if(ts->proportional == 2)
- t->flag |= T_PROP_CONNECTED; // yes i know, has to become define
+ else
+ {
+ if ((t->options & CTX_NO_PET) == 0 && (ts->proportional)) {
+ t->flag |= T_PROP_EDIT;
+
+ if(ts->proportional == 2)
+ t->flag |= T_PROP_CONNECTED; // yes i know, has to become define
+ }
}
- }
- if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
- {
- t->prop_size = RNA_float_get(op->ptr, "proportional_size");
- }
- else
- {
- t->prop_size = ts->proportional_size;
- }
-
- if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
- {
- t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
+ if (op && RNA_struct_find_property(op->ptr, "proportional_size") && RNA_property_is_set(op->ptr, "proportional_size"))
+ {
+ t->prop_size = RNA_float_get(op->ptr, "proportional_size");
+ }
+ else
+ {
+ t->prop_size = ts->proportional_size;
+ }
+
+
+ /* TRANSFORM_FIX_ME rna restrictions */
+ if (t->prop_size <= 0)
+ {
+ t->prop_size = 1.0f;
+ }
+
+ if (op && RNA_struct_find_property(op->ptr, "proportional_editing_falloff") && RNA_property_is_set(op->ptr, "proportional_editing_falloff"))
+ {
+ t->prop_mode = RNA_enum_get(op->ptr, "proportional_editing_falloff");
+ }
+ else
+ {
+ t->prop_mode = ts->prop_mode;
+ }
}
- else
+ else /* add not pet option to context when not available */
{
- t->prop_mode = ts->prop_mode;
+ t->options |= CTX_NO_PET;
}
- /* TRANSFORM_FIX_ME rna restrictions */
- if (t->prop_size <= 0)
- {
- t->prop_size = 1.0f;
- }
setTransformViewMatrices(t);
initNumInput(&t->num);
initNDofInput(&t->ndof);
-
+
return 1;
}
/* Here I would suggest only TransInfo related issues, like free data & reset vars. Not redraws */
-void postTrans (TransInfo *t)
+void postTrans (TransInfo *t)
{
TransData *td;
@@ -845,7 +1049,7 @@ void postTrans (TransInfo *t)
{
ED_region_draw_cb_exit(t->ar->type, t->draw_handle);
}
-
+
/* postTrans can be called when nothing is selected, so data is NULL already */
if (t->data) {
int a;
@@ -853,11 +1057,11 @@ void postTrans (TransInfo *t)
/* since ipokeys are optional on objects, we mallocced them per trans-data */
for(a=0, td= t->data; a<t->total; a++, td++) {
if(td->tdi) MEM_freeN(td->tdi);
- if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->hdata);
+ if (td->flag & TD_BEZTRIPLE) MEM_freeN(td->hdata);
}
MEM_freeN(t->data);
}
-
+
if (t->ext) MEM_freeN(t->ext);
if (t->data2d) {
MEM_freeN(t->data2d);
@@ -869,16 +1073,26 @@ void postTrans (TransInfo *t)
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_end(t->state == TRANS_CANCEL);
}
- else if(t->spacetype==SPACE_ACTION) {
- if (t->customData)
- MEM_freeN(t->customData);
+ else if(ELEM(t->spacetype, SPACE_ACTION, SPACE_NLA)) {
+ }
+
+ if (t->mouse.data)
+ {
+ MEM_freeN(t->mouse.data);
+ }
+
+ if (t->customFree) {
+ t->customFree(t);
+ }
+ else if (t->customData) {
+ MEM_freeN(t->customData);
}
}
void applyTransObjects(TransInfo *t)
{
TransData *td;
-
+
for (td = t->data; td < t->data + t->total; td++) {
VECCOPY(td->iloc, td->loc);
if (td->ext->rot) {
@@ -887,9 +1101,9 @@ void applyTransObjects(TransInfo *t)
if (td->ext->size) {
VECCOPY(td->ext->isize, td->ext->size);
}
- }
+ }
recalcData(t);
-}
+}
/* helper for below */
static void restore_ipokey(float *poin, float *old)
@@ -922,15 +1136,15 @@ static void restoreElement(TransData *td) {
}
}
}
-
+
if (td->flag & TD_BEZTRIPLE) {
*(td->hdata->h1) = td->hdata->ih1;
*(td->hdata->h2) = td->hdata->ih2;
}
-
+
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
-
+
restore_ipokey(tdi->locx, tdi->oldloc);
restore_ipokey(tdi->locy, tdi->oldloc+1);
restore_ipokey(tdi->locz, tdi->oldloc+2);
@@ -938,7 +1152,7 @@ static void restoreElement(TransData *td) {
restore_ipokey(tdi->rotx, tdi->oldrot);
restore_ipokey(tdi->roty, tdi->oldrot+1);
restore_ipokey(tdi->rotz, tdi->oldrot+2);
-
+
restore_ipokey(tdi->sizex, tdi->oldsize);
restore_ipokey(tdi->sizey, tdi->oldsize+1);
restore_ipokey(tdi->sizez, tdi->oldsize+2);
@@ -948,13 +1162,13 @@ static void restoreElement(TransData *td) {
void restoreTransObjects(TransInfo *t)
{
TransData *td;
-
+
for (td = t->data; td < t->data + t->total; td++) {
restoreElement(td);
}
-
+
Mat3One(t->mat);
-
+
recalcData(t);
}
@@ -963,7 +1177,7 @@ void calculateCenter2D(TransInfo *t)
if (t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
float vec[3];
-
+
VECCOPY(vec, t->center);
Mat4MulVecfl(ob->obmat, vec);
projectIntView(t, vec, t->center2d);
@@ -984,13 +1198,13 @@ void calculateCenterCursor(TransInfo *t)
if (t->flag & (T_EDIT|T_POSE)) {
Object *ob = t->obedit?t->obedit:t->poseobj;
float mat[3][3], imat[3][3];
-
+
VecSubf(t->center, t->center, ob->obmat[3]);
Mat3CpyMat4(mat, ob->obmat);
Mat3Inv(imat, mat);
Mat3MulVecfl(imat, t->center);
}
-
+
calculateCenter2D(t);
}
@@ -998,13 +1212,13 @@ void calculateCenterCursor2D(TransInfo *t)
{
View2D *v2d= t->view;
float aspx=1.0, aspy=1.0;
-
+
if(t->spacetype==SPACE_IMAGE) /* only space supported right now but may change */
ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
if (v2d) {
- t->center[0] = v2d->cursor[0] * aspx;
- t->center[1] = v2d->cursor[1] * aspy;
+ t->center[0] = v2d->cursor[0] * aspx;
+ t->center[1] = v2d->cursor[1] * aspy;
}
calculateCenter2D(t);
@@ -1015,7 +1229,7 @@ void calculateCenterMedian(TransInfo *t)
float partial[3] = {0.0f, 0.0f, 0.0f};
int total = 0;
int i;
-
+
for(i = 0; i < t->total; i++) {
if (t->data[i].flag & TD_SELECTED) {
if (!(t->data[i].flag & TD_NOCENTER))
@@ -1025,8 +1239,8 @@ void calculateCenterMedian(TransInfo *t)
}
}
else {
- /*
- All the selected elements are at the head of the array
+ /*
+ All the selected elements are at the head of the array
which means we can stop when it finds unselected data
*/
break;
@@ -1051,8 +1265,8 @@ void calculateCenterBound(TransInfo *t)
MinMax3(min, max, t->data[i].center);
}
else {
- /*
- All the selected elements are at the head of the array
+ /*
+ All the selected elements are at the head of the array
which means we can stop when it finds unselected data
*/
break;
@@ -1069,7 +1283,7 @@ void calculateCenterBound(TransInfo *t)
calculateCenter2D(t);
}
-void calculateCenter(TransInfo *t)
+void calculateCenter(TransInfo *t)
{
switch(t->around) {
case V3D_CENTER:
@@ -1101,7 +1315,7 @@ void calculateCenter(TransInfo *t)
break;
} /* END EDIT MODE ACTIVE ELEMENT */
#endif
-
+
calculateCenterMedian(t);
if((t->flag & (T_EDIT|T_POSE))==0)
{
@@ -1113,7 +1327,7 @@ void calculateCenter(TransInfo *t)
projectIntView(t, t->center, t->center2d);
}
}
-
+
}
}
@@ -1128,26 +1342,26 @@ void calculateCenter(TransInfo *t)
/* voor panning from cameraview */
if(t->flag & T_OBJECT)
{
- if(t->spacetype==SPACE_VIEW3D)
+ if(t->spacetype==SPACE_VIEW3D && t->ar->regiontype == RGN_TYPE_WINDOW)
{
View3D *v3d = t->view;
Scene *scene = t->scene;
RegionView3D *rv3d = t->ar->regiondata;
-
+
if(v3d->camera == OBACT && rv3d->persp==V3D_CAMOB)
{
float axis[3];
/* persinv is nasty, use viewinv instead, always right */
VECCOPY(axis, t->viewinv[2]);
Normalize(axis);
-
+
/* 6.0 = 6 grid units */
axis[0]= t->center[0]- 6.0f*axis[0];
axis[1]= t->center[1]- 6.0f*axis[1];
axis[2]= t->center[2]- 6.0f*axis[2];
-
+
projectIntView(t, axis, t->center2d);
-
+
/* rotate only needs correct 2d center, grab needs initgrabz() value */
if(t->mode==TFM_TRANSLATION)
{
@@ -1156,7 +1370,7 @@ void calculateCenter(TransInfo *t)
}
}
}
- }
+ }
if(t->spacetype==SPACE_VIEW3D)
{
@@ -1164,14 +1378,14 @@ void calculateCenter(TransInfo *t)
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
float vec[3];
-
+
VECCOPY(vec, t->center);
Mat4MulVecfl(ob->obmat, vec);
initgrabz(t->ar->regiondata, vec[0], vec[1], vec[2]);
}
else {
initgrabz(t->ar->regiondata, t->center[0], t->center[1], t->center[2]);
- }
+ }
}
}
@@ -1181,18 +1395,18 @@ void calculatePropRatio(TransInfo *t)
int i;
float dist;
short connected = t->flag & T_PROP_CONNECTED;
-
+
if (t->flag & T_PROP_EDIT) {
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_SELECTED) {
td->factor = 1.0f;
}
- else if ((connected &&
+ else if ((connected &&
(td->flag & TD_NOTCONNECTED || td->dist > t->prop_size))
||
(connected == 0 &&
td->rdist > t->prop_size)) {
- /*
+ /*
The elements are sorted according to their dist member in the array,
that means we can stop when it finds one element outside of the propsize.
*/
@@ -1204,7 +1418,7 @@ void calculatePropRatio(TransInfo *t)
/* Use rdist for falloff calculations, it is the real distance */
td->flag &= ~TD_NOACTION;
dist= (t->prop_size-td->rdist)/t->prop_size;
-
+
/*
* Clamp to positive numbers.
* Certain corner cases with connectivity and individual centers
@@ -1212,7 +1426,7 @@ void calculatePropRatio(TransInfo *t)
*/
if (dist < 0.0f)
dist = 0.0f;
-
+
switch(t->prop_mode) {
case PROP_SHARP:
td->factor= dist*dist;
@@ -1275,24 +1489,19 @@ void calculatePropRatio(TransInfo *t)
}
}
-TransInfo *BIF_GetTransInfo()
-{
- return NULL;
-}
-
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(vec);
VECCOPY(vec, rv3d->persinv[1]);
len2= Normalize(vec);
-
+
size*= 0.01f*(len1>len2?len1:len2);
/* correct for window size to make widgets appear fixed size */
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 631eb1eb134..83d4a314057 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -34,8 +34,8 @@
#include "transform.h"
+#include "MEM_guardedalloc.h"
-
/* ************************** INPUT FROM MOUSE *************************** */
void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
@@ -53,7 +53,7 @@ void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
convertViewVec(t, output, (short)(mval[0] - t->imval[0]), (short)(mval[1] - t->imval[1]));
}
-
+
}
void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
@@ -65,11 +65,11 @@ void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
dx = (float)(mi->center[0] - mi->precision_mval[0]);
dy = (float)(mi->center[1] - mi->precision_mval[1]);
ratio = (float)sqrt( dx*dx + dy*dy);
-
+
dx= (float)(mi->center[0] - mval[0]);
dy= (float)(mi->center[1] - mval[1]);
precise_ratio = (float)sqrt( dx*dx + dy*dy);
-
+
ratio = (ratio + (precise_ratio - ratio) / 10.0f) / mi->factor;
}
else
@@ -78,16 +78,16 @@ void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
dy = (float)(mi->center[1] - mval[1]);
ratio = (float)sqrt( dx*dx + dy*dy) / mi->factor;
}
-
+
output[0] = ratio;
}
void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
InputSpring(t, mi, mval, output);
-
+
/* flip scale */
- if ((mi->center[0] - mval[0]) * (mi->center[0] - mi->imval[0]) +
+ if ((mi->center[0] - mval[0]) * (mi->center[0] - mi->imval[0]) +
(mi->center[1] - mval[1]) * (mi->center[1] - mi->imval[1]) < 0)
{
output[0] *= -1.0f;
@@ -96,7 +96,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])
{
-
+
if(mi->precision)
{
output[0] = ( mi->imval[1] - mi->precision_mval[1] ) + ( mi->precision_mval[1] - mval[1] ) * 0.1f;
@@ -107,7 +107,7 @@ void InputTrackBall(TransInfo *t, MouseInput *mi, short mval[2], float output[3]
output[0] = (float)( mi->imval[1] - mval[1] );
output[1] = (float)( mval[0] - mi->imval[0] );
}
-
+
output[0] *= mi->factor;
output[1] *= mi->factor;
}
@@ -125,7 +125,7 @@ void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float out
else {
x = mval[0];
}
-
+
output[0] = (x - pad) / (t->ar->winx - 2 * pad);
}
@@ -134,7 +134,7 @@ void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float
InputVector(t, mi, mval, vec);
Projf(vec, vec, t->viewinv[0]);
-
+
output[0] = Inpf(t->viewinv[0], vec) * 2.0f;
}
@@ -150,7 +150,7 @@ void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float outpu
else {
y = mval[0];
}
-
+
output[0] = (y - pad) / (t->ar->winy - 2 * pad);
}
@@ -159,10 +159,51 @@ void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float ou
InputVector(t, mi, mval, vec);
Projf(vec, vec, t->viewinv[1]);
-
+
output[0] = Inpf(t->viewinv[1], vec) * 2.0f;
}
+void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
+{
+ short *data = mi->data;
+
+ data[0] = start[0];
+ data[1] = start[1];
+ data[2] = end[0];
+ data[3] = end[1];
+}
+
+void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+{
+ float length;
+ float distance;
+ short *data = mi->data;
+ short dx, dy;
+
+ dx = data[2] - data[0];
+ dy = data[3] - data[1];
+
+ length = (float)sqrtf(dx*dx + dy*dy);
+
+ if (mi->precision) {
+ /* deal with Shift key by adding motion / 10 to motion before shift press */
+ short mdx, mdy;
+ mdx = (mi->precision_mval[0] + (float)(mval[0] - mi->precision_mval[0]) / 10.0f) - data[2];
+ mdy = (mi->precision_mval[1] + (float)(mval[1] - mi->precision_mval[1]) / 10.0f) - data[3];
+
+ distance = (mdx*dx + mdy*dy) / length;
+ }
+ else {
+ short mdx, mdy;
+ mdx = mval[0] - data[2];
+ mdy = mval[1] - data[3];
+
+ distance = (mdx*dx + mdy*dy) / length;
+ }
+
+ output[0] = distance / length;
+}
+
void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
double dx2 = mval[0] - mi->center[0];
@@ -182,7 +223,7 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
/* (A*B?A*B:1.0f) this takes care of potential divide by zero errors */
float dphi;
-
+
dphi = saacos((float)deler);
if( (dx1*dy2-dx2*dy1)>0.0 ) dphi= -dphi;
@@ -190,33 +231,33 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
* approximate the angle with the oposite side of the normalized triangle
* This is a good approximation here since the smallest acos value seems to be around
* 0.02 degree and lower values don't even have a 0.01% error compared to the approximation
- * */
+ * */
if (dphi == 0)
{
double dx, dy;
-
+
dx2 /= A;
dy2 /= A;
-
+
dx1 /= B;
dy1 /= B;
-
+
dx = dx1 - dx2;
dy = dy1 - dy2;
-
+
dphi = sqrt(dx*dx + dy*dy);
if( (dx1*dy2-dx2*dy1)>0.0 ) dphi= -dphi;
}
-
+
if(mi->precision) dphi = dphi/30.0f;
-
+
/* if no delta angle, don't update initial position */
if (dphi != 0)
{
mi->imval[0] = mval[0];
mi->imval[1] = mval[1];
}
-
+
output[0] += dphi;
}
@@ -227,7 +268,7 @@ void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2])
mi->center[0] = center[0];
mi->center[1] = center[1];
-
+
mi->imval[0] = mval[0];
mi->imval[1] = mval[1];
}
@@ -247,7 +288,7 @@ static void calcSpringFactor(MouseInput *mi)
void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
{
-
+
switch(mode)
{
case INPUT_VECTOR:
@@ -270,7 +311,7 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
break;
case INPUT_TRACKBALL:
/* factor has to become setting or so */
- mi->factor = 0.1f;
+ mi->factor = 0.01f;
mi->apply = InputTrackBall;
t->helpline = HLP_TRACKBALL;
break;
@@ -291,13 +332,18 @@ void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode)
mi->apply = InputVerticalAbsolute;
t->helpline = HLP_VARROW;
break;
+ case INPUT_CUSTOM_RATIO:
+ mi->apply = InputCustomRatio;
+ t->helpline = HLP_NONE;
+ mi->data = MEM_callocN(sizeof(short) * 4, "custom points");
+ break;
case INPUT_NONE:
default:
mi->apply = NULL;
break;
}
-
- /* bootstrap mouse input with initial values */
+
+ /* bootstrap mouse input with initial values */
applyMouseInput(t, mi, mi->imval, t->values);
}
@@ -312,12 +358,12 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, short mval[2], float output[3
int handleMouseInput(TransInfo *t, MouseInput *mi, wmEvent *event)
{
int redraw = 0;
-
+
switch (event->type)
{
case LEFTSHIFTKEY:
case RIGHTSHIFTKEY:
- if (event->val)
+ if (event->val==KM_PRESS)
{
t->modifiers |= MOD_PRECISION;
/* shift is modifier for higher precision transform
@@ -334,6 +380,6 @@ int handleMouseInput(TransInfo *t, MouseInput *mi, wmEvent *event)
redraw = 1;
break;
}
-
+
return redraw;
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 99d7805b938..93bc02d7180 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -27,18 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
-// TRANSFORM_FIX_ME
-// Disable everything here, don't need it for now
-#if 0
-
#include <stdlib.h>
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifndef WIN32
#include <unistd.h>
#else
@@ -61,31 +53,36 @@
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
+#include "RNA_access.h"
+
#include "BKE_armature.h"
+#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_lattice.h"
+#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BKE_utildefines.h"
#include "BLI_arithb.h"
#include "BLI_editVert.h"
-#include "BIF_editarmature.h"
#include "BIF_gl.h"
-#include "BIF_mywindow.h"
-#include "BIF_resources.h"
-#include "BIF_screen.h"
-#include "BIF_space.h"
-#include "BIF_transform.h"
-#include "BIF_editmesh.h"
-#include "BIF_editparticle.h"
-
-#include "BSE_edit.h"
-#include "BSE_view.h"
-#include "BDR_drawobject.h"
-
-#include "blendef.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_armature.h"
+#include "ED_mesh.h"
+#include "ED_particle.h"
+#include "ED_space_api.h"
+#include "ED_transform.h"
+#include "ED_view3d.h"
+
+#include "UI_resources.h"
+
+/* local module include */
#include "transform.h"
/* return codes for select, and drawing flags */
@@ -113,26 +110,23 @@
#define MAN_GHOST 1
#define MAN_MOVECOL 2
-/* GLOBAL VARIABLE THAT SHOULD MOVED TO SCREEN MEMBER OR SOMETHING */
-extern TransInfo Trans;
-
static int is_mat4_flipped(float mat[][4])
{
float vec[3];
-
+
Crossf(vec, mat[0], mat[1]);
if( Inpf(vec, mat[2]) < 0.0 ) return 1;
return 0;
-}
+}
/* transform widget center calc helper for below */
-static void calc_tw_center(float *co)
+static void calc_tw_center(Scene *scene, float *co)
{
- float *twcent= G.scene->twcent;
- float *min= G.scene->twmin;
- float *max= G.scene->twmax;
-
+ float *twcent= scene->twcent;
+ float *min= scene->twmin;
+ float *max= scene->twmax;
+
DO_MINMAX(co, min, max);
VecAddf(twcent, twcent, co);
}
@@ -145,7 +139,7 @@ static void protectflag_to_drawflags(short protectflag, short *drawflags)
*drawflags &= ~MAN_TRANS_Y;
if(protectflag & OB_LOCK_LOCZ)
*drawflags &= ~MAN_TRANS_Z;
-
+
if(protectflag & OB_LOCK_ROTX)
*drawflags &= ~MAN_ROT_X;
if(protectflag & OB_LOCK_ROTY)
@@ -162,13 +156,13 @@ static void protectflag_to_drawflags(short protectflag, short *drawflags)
}
/* for pose mode */
-static void stats_pose(View3D *v3d, bPoseChannel *pchan)
+static void stats_pose(Scene *scene, View3D *v3d, bPoseChannel *pchan)
{
Bone *bone= pchan->bone;
-
+
if(bone) {
if (bone->flag & BONE_TRANSFORM) {
- calc_tw_center(pchan->pose_head);
+ calc_tw_center(scene, pchan->pose_head);
protectflag_to_drawflags(pchan->protectflag, &v3d->twdrawflag);
}
}
@@ -181,91 +175,67 @@ static void stats_editbone(View3D *v3d, EditBone *ebo)
protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &v3d->twdrawflag);
}
-/* only counts the parent selection, and tags transform flag */
-/* bad call... should re-use method from transform_conversion once */
-static void count_bone_select(TransInfo *t, bArmature *arm, ListBase *lb, int do_it)
-{
- Bone *bone;
- int do_next;
-
- for(bone= lb->first; bone; bone= bone->next) {
- bone->flag &= ~BONE_TRANSFORM;
- do_next= do_it;
- if(do_it) {
- if(bone->layer & arm->layer) {
- if (bone->flag & BONE_SELECTED) {
- /* We don't let connected children get "grabbed" */
- if ( (t->mode!=TFM_TRANSLATION) || (bone->flag & BONE_CONNECTED)==0 ) {
- bone->flag |= BONE_TRANSFORM;
- t->total++;
- do_next= 0; // no transform on children if one parent bone is selected
- }
- }
- }
- }
- count_bone_select(t, arm, &bone->childbase, do_next);
- }
-}
-
/* centroid, boundbox, of selection */
/* returns total items selected */
-int calc_manipulator_stats(ScrArea *sa)
+int calc_manipulator_stats(const bContext *C)
{
- TransInfo *t;
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar= CTX_wm_region(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *obedit= CTX_data_edit_object(C);
View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= ar->regiondata;
Base *base;
Object *ob= OBACT;
float normal[3]={0.0, 0.0, 0.0};
float plane[3]={0.0, 0.0, 0.0};
- int a, totsel=0;
+ int a, totsel= 0;
-//XXX t = BIF_GetTransInfo();
-
/* transform widget matrix */
- Mat4One(v3d->twmat);
-
+ Mat4One(rv3d->twmat);
+
v3d->twdrawflag= 0xFFFF;
-
+
/* transform widget centroid/center */
- G.scene->twcent[0]= G.scene->twcent[1]= G.scene->twcent[2]= 0.0f;
- INIT_MINMAX(G.scene->twmin, G.scene->twmax);
-
- if(t->obedit) {
- ob= t->obedit;
- if((ob->lay & G.vd->lay)==0) return 0;
-
- if(t->obedit->type==OB_MESH) {
- EditMesh *em = NULL; // TRANSFORM_FIX_ME
+ scene->twcent[0]= scene->twcent[1]= scene->twcent[2]= 0.0f;
+ INIT_MINMAX(scene->twmin, scene->twmax);
+
+ if(obedit) {
+ ob= obedit;
+ if((ob->lay & v3d->lay)==0) return 0;
+
+ if(obedit->type==OB_MESH) {
+ EditMesh *em = BKE_mesh_get_editmesh(obedit->data);
EditVert *eve;
EditSelection ese;
float vec[3]= {0,0,0};
-
+
/* USE LAST SELECTE WITH ACTIVE */
- if (G.vd->around==V3D_ACTIVE && EM_get_actSelection(&ese)) {
+ if (v3d->around==V3D_ACTIVE && EM_get_actSelection(em, &ese)) {
EM_editselection_center(vec, &ese);
- calc_tw_center(vec);
+ calc_tw_center(scene, vec);
totsel= 1;
} else {
/* do vertices for center, and if still no normal found, use vertex normals */
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->f & SELECT) {
totsel++;
- calc_tw_center(eve->co);
+ calc_tw_center(scene, eve->co);
}
}
}
} /* end editmesh */
- else if (t->obedit->type==OB_ARMATURE){
- bArmature *arm= t->obedit->data;
+ else if (obedit->type==OB_ARMATURE){
+ bArmature *arm= obedit->data;
EditBone *ebo;
- for (ebo=G.edbo.first;ebo;ebo=ebo->next){
+ for (ebo= arm->edbo->first; ebo; ebo=ebo->next){
if(ebo->layer & arm->layer) {
if (ebo->flag & BONE_TIPSEL) {
- calc_tw_center(ebo->tail);
+ calc_tw_center(scene, ebo->tail);
totsel++;
}
if (ebo->flag & BONE_ROOTSEL) {
- calc_tw_center(ebo->head);
+ calc_tw_center(scene, ebo->head);
totsel++;
}
if (ebo->flag & BONE_SELECTED) {
@@ -274,15 +244,15 @@ int calc_manipulator_stats(ScrArea *sa)
}
}
}
- else if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
- Curve *cu= t->obedit->data;
+ else if ELEM(obedit->type, OB_CURVE, OB_SURF) {
+ Curve *cu= obedit->data;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
-
+
nu= cu->editnurb->first;
while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
a= nu->pntsu;
while(a--) {
@@ -290,27 +260,27 @@ int calc_manipulator_stats(ScrArea *sa)
* if handles are hidden then only check the center points.
* If 2 or more are selected then only use the center point too.
*/
- if (G.f & G_HIDDENHANDLES) {
+ if (cu->drawflag & CU_HIDE_HANDLES) {
if (bezt->f2 & SELECT) {
- calc_tw_center(bezt->vec[1]);
+ calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
}
else if ( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
- calc_tw_center(bezt->vec[1]);
+ calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
else {
if(bezt->f1) {
- calc_tw_center(bezt->vec[0]);
+ calc_tw_center(scene, bezt->vec[0]);
totsel++;
}
if(bezt->f2) {
- calc_tw_center(bezt->vec[1]);
+ calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
if(bezt->f3) {
- calc_tw_center(bezt->vec[2]);
+ calc_tw_center(scene, bezt->vec[2]);
totsel++;
}
}
@@ -322,7 +292,7 @@ int calc_manipulator_stats(ScrArea *sa)
a= nu->pntsu*nu->pntsv;
while(a--) {
if(bp->f1 & SELECT) {
- calc_tw_center(bp->vec);
+ calc_tw_center(scene, bp->vec);
totsel++;
}
bp++;
@@ -331,87 +301,81 @@ int calc_manipulator_stats(ScrArea *sa)
nu= nu->next;
}
}
- else if(t->obedit->type==OB_MBALL) {
- /* editmball.c */
- extern ListBase editelems; /* go away ! */
+ else if(obedit->type==OB_MBALL) {
+ MetaBall *mb = (MetaBall*)obedit->data;
MetaElem *ml, *ml_sel=NULL;
-
- ml= editelems.first;
+
+ ml= mb->editelems->first;
while(ml) {
if(ml->flag & SELECT) {
- calc_tw_center(&ml->x);
+ calc_tw_center(scene, &ml->x);
ml_sel = ml;
totsel++;
}
ml= ml->next;
}
}
- else if(t->obedit->type==OB_LATTICE) {
+ else if(obedit->type==OB_LATTICE) {
BPoint *bp;
- bp= editLatt->def;
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+ Lattice *lt= obedit->data;
+
+ bp= lt->editlatt->def;
+
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
while(a--) {
if(bp->f1 & SELECT) {
- calc_tw_center(bp->vec);
+ calc_tw_center(scene, bp->vec);
totsel++;
}
bp++;
}
}
-
+
/* selection center */
if(totsel) {
- VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
- Mat4MulVecfl(t->obedit->obmat, G.scene->twcent);
- Mat4MulVecfl(t->obedit->obmat, G.scene->twmin);
- Mat4MulVecfl(t->obedit->obmat, G.scene->twmax);
+ VecMulf(scene->twcent, 1.0f/(float)totsel); // centroid!
+ Mat4MulVecfl(obedit->obmat, scene->twcent);
+ Mat4MulVecfl(obedit->obmat, scene->twmin);
+ Mat4MulVecfl(obedit->obmat, scene->twmax);
}
}
- else if(ob && (ob->flag & OB_POSEMODE)) {
- bArmature *arm = ob->data;
+ else if(ob && (ob->mode & OB_MODE_POSE)) {
bPoseChannel *pchan;
- int mode;
-
- if((ob->lay & G.vd->lay)==0) return 0;
-
- mode = Trans.mode;
- Trans.mode = TFM_ROTATION; // mislead counting bones... bah
-
- /* count total, we use same method as transform will do */
- Trans.total= 0;
- count_bone_select(&Trans, arm, &arm->bonebase, 1);
- totsel = Trans.total;
+ int mode = TFM_ROTATION; // mislead counting bones... bah. We don't know the manipulator mode, could be mixed
+
+ if((ob->lay & v3d->lay)==0) return 0;
+
+ totsel = count_set_pose_transflags(&mode, 0, ob);
+
if(totsel) {
/* use channels to get stats */
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- stats_pose(v3d, pchan);
+ stats_pose(scene, v3d, pchan);
}
-
- VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
- Mat4MulVecfl(ob->obmat, G.scene->twcent);
- Mat4MulVecfl(ob->obmat, G.scene->twmin);
- Mat4MulVecfl(ob->obmat, G.scene->twmax);
+
+ VecMulf(scene->twcent, 1.0f/(float)totsel); // centroid!
+ Mat4MulVecfl(ob->obmat, scene->twcent);
+ Mat4MulVecfl(ob->obmat, scene->twmin);
+ Mat4MulVecfl(ob->obmat, scene->twmax);
}
- /* restore, mode can be TFM_INIT */
- Trans.mode = mode;
}
- else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE)) {
+ else if(ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
;
}
- else if(G.f & G_PARTICLEEDIT) {
- ParticleSystem *psys=PE_get_current(OBACT);
- ParticleData *pa = psys->particles;
- ParticleEditKey *ek;
+ else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
+ PTCacheEdit *edit= PE_get_current(scene, ob);
+ PTCacheEditPoint *point;
+ PTCacheEditKey *ek;
int k;
- if(psys->edit) {
- for(a=0; a<psys->totpart; a++,pa++) {
- if(pa->flag & PARS_HIDE) continue;
+ if(edit) {
+ point = edit->points;
+ for(a=0; a<edit->totpoint; a++,point++) {
+ if(point->flag & PEP_HIDE) continue;
- for(k=0, ek=psys->edit->keys[a]; k<pa->totkey; k++, ek++) {
+ for(k=0, ek=point->keys; k<point->totkey; k++, ek++) {
if(ek->flag & PEK_SELECT) {
- calc_tw_center(ek->world_co);
+ calc_tw_center(scene, ek->flag & PEK_USE_WCO ? ek->world_co : ek->co);
totsel++;
}
}
@@ -419,48 +383,43 @@ int calc_manipulator_stats(ScrArea *sa)
/* selection center */
if(totsel)
- VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
+ VecMulf(scene->twcent, 1.0f/(float)totsel); // centroid!
}
}
else {
-
+
/* we need the one selected object, if its not active */
ob= OBACT;
if(ob && !(ob->flag & SELECT)) ob= NULL;
-
- for(base= G.scene->base.first; base; base= base->next) {
- if TESTBASELIB(base) {
- if(ob==NULL)
+
+ for(base= scene->base.first; base; base= base->next) {
+ if TESTBASELIB(scene, base) {
+ if(ob==NULL)
ob= base->object;
- calc_tw_center(base->object->obmat[3]);
+ calc_tw_center(scene, base->object->obmat[3]);
protectflag_to_drawflags(base->object->protectflag, &v3d->twdrawflag);
totsel++;
}
}
-
+
/* selection center */
if(totsel) {
- VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
+ VecMulf(scene->twcent, 1.0f/(float)totsel); // centroid!
}
}
-
+
/* global, local or normal orientation? */
if(ob && totsel) {
-
+
switch(v3d->twmode) {
- case V3D_MANIP_GLOBAL:
- strcpy(t->spacename, "global");
- break;
-
+
case V3D_MANIP_NORMAL:
- if(t->obedit || ob->flag & OB_POSEMODE) {
+ if(obedit || ob->mode & OB_MODE_POSE) {
float mat[3][3];
int type;
-
- strcpy(t->spacename, "normal");
-
- type = getTransformOrientation(normal, plane, (G.vd->around == V3D_ACTIVE));
-
+
+ type = getTransformOrientation(C, normal, plane, (v3d->around == V3D_ACTIVE));
+
switch (type)
{
case ORIENTATION_NORMAL:
@@ -488,57 +447,55 @@ int calc_manipulator_stats(ScrArea *sa)
}
break;
}
-
+
if (type == ORIENTATION_NONE)
{
- Mat4One(v3d->twmat);
+ Mat4One(rv3d->twmat);
}
else
{
- Mat4CpyMat3(v3d->twmat, mat);
+ Mat4CpyMat3(rv3d->twmat, mat);
}
break;
}
/* no break we define 'normal' as 'local' in Object mode */
case V3D_MANIP_LOCAL:
- strcpy(t->spacename, "local");
- Mat4CpyMat4(v3d->twmat, ob->obmat);
- Mat4Ortho(v3d->twmat);
+ Mat4CpyMat4(rv3d->twmat, ob->obmat);
+ Mat4Ortho(rv3d->twmat);
break;
-
+
case V3D_MANIP_VIEW:
{
float mat[3][3];
- strcpy(t->spacename, "view");
- Mat3CpyMat4(mat, v3d->viewinv);
+ Mat3CpyMat4(mat, rv3d->viewinv);
Mat3Ortho(mat);
- Mat4CpyMat3(v3d->twmat, mat);
+ Mat4CpyMat3(rv3d->twmat, mat);
}
break;
default: /* V3D_MANIP_CUSTOM */
- applyTransformOrientation();
+ // XXX applyTransformOrientation(C, t);
break;
}
-
+
}
-
+
return totsel;
}
/* ******************** DRAWING STUFFIES *********** */
-static float screen_aligned(float mat[][4])
+static float screen_aligned(RegionView3D *rv3d, float mat[][4])
{
float vec[3], size;
-
+
VECCOPY(vec, mat[0]);
size= Normalize(vec);
-
+
glTranslatef(mat[3][0], mat[3][1], mat[3][2]);
-
+
/* sets view screen aligned */
- glRotatef( -360.0f*saacos(G.vd->viewquat[0])/(float)M_PI, G.vd->viewquat[1], G.vd->viewquat[2], G.vd->viewquat[3]);
-
+ glRotatef( -360.0f*saacos(rv3d->viewquat[0])/(float)M_PI, rv3d->viewquat[1], rv3d->viewquat[2], rv3d->viewquat[3]);
+
return size;
}
@@ -557,32 +514,32 @@ static void partial_donut(float radring, float radhole, int start, int end, int
float cos_theta1, sin_theta1;
float ring_delta, side_delta;
int i, j, docaps= 1;
-
+
if(start==0 && end==nrings) docaps= 0;
-
+
ring_delta= 2.0f*(float)M_PI/(float)nrings;
side_delta= 2.0f*(float)M_PI/(float)nsides;
-
+
theta= (float)M_PI+0.5f*ring_delta;
cos_theta= (float)cos(theta);
sin_theta= (float)sin(theta);
-
+
for(i= nrings - 1; i >= 0; i--) {
theta1= theta + ring_delta;
cos_theta1= (float)cos(theta1);
sin_theta1= (float)sin(theta1);
-
+
if(docaps && i==start) { // cap
glBegin(GL_POLYGON);
phi= 0.0;
for(j= nsides; j >= 0; j--) {
float cos_phi, sin_phi, dist;
-
+
phi += side_delta;
cos_phi= (float)cos(phi);
sin_phi= (float)sin(phi);
dist= radhole + radring * cos_phi;
-
+
glVertex3f(cos_theta1 * dist, -sin_theta1 * dist, radring * sin_phi);
}
glEnd();
@@ -592,35 +549,35 @@ static void partial_donut(float radring, float radhole, int start, int end, int
phi= 0.0;
for(j= nsides; j >= 0; j--) {
float cos_phi, sin_phi, dist;
-
+
phi += side_delta;
cos_phi= (float)cos(phi);
sin_phi= (float)sin(phi);
dist= radhole + radring * cos_phi;
-
+
glVertex3f(cos_theta1 * dist, -sin_theta1 * dist, radring * sin_phi);
glVertex3f(cos_theta * dist, -sin_theta * dist, radring * sin_phi);
}
glEnd();
}
-
+
if(docaps && i==end) { // cap
glBegin(GL_POLYGON);
phi= 0.0;
for(j= nsides; j >= 0; j--) {
float cos_phi, sin_phi, dist;
-
+
phi -= side_delta;
cos_phi= (float)cos(phi);
sin_phi= (float)sin(phi);
dist= radhole + radring * cos_phi;
-
+
glVertex3f(cos_theta * dist, -sin_theta * dist, radring * sin_phi);
}
glEnd();
}
-
-
+
+
theta= theta1;
cos_theta= cos_theta1;
sin_theta= sin_theta1;
@@ -632,30 +589,30 @@ static void partial_donut(float radring, float radhole, int start, int end, int
moving: in transform theme color
else the red/green/blue
*/
-static void manipulator_setcolor(char axis, int colcode)
+static void manipulator_setcolor(View3D *v3d, char axis, int colcode)
{
float vec[4];
char col[4];
-
+
vec[3]= 0.7f; // alpha set on 0.5, can be glEnabled or not
-
+
if(colcode==MAN_GHOST) {
glColor4ub(0, 0, 0, 70);
}
else if(colcode==MAN_MOVECOL) {
- BIF_GetThemeColor3ubv(TH_TRANSFORM, col);
+ UI_GetThemeColor3ubv(TH_TRANSFORM, col);
glColor4ub(col[0], col[1], col[2], 128);
}
else {
switch(axis) {
case 'c':
- BIF_GetThemeColor3ubv(TH_TRANSFORM, col);
- if(G.vd->twmode == V3D_MANIP_LOCAL) {
+ UI_GetThemeColor3ubv(TH_TRANSFORM, col);
+ if(v3d->twmode == V3D_MANIP_LOCAL) {
col[0]= col[0]>200?255:col[0]+55;
col[1]= col[1]>200?255:col[1]+55;
col[2]= col[2]>200?255:col[2]+55;
}
- else if(G.vd->twmode == V3D_MANIP_NORMAL) {
+ else if(v3d->twmode == V3D_MANIP_NORMAL) {
col[0]= col[0]<55?0:col[0]-55;
col[1]= col[1]<55?0:col[1]-55;
col[2]= col[2]<55?0:col[2]-55;
@@ -676,32 +633,32 @@ static void manipulator_setcolor(char axis, int colcode)
}
/* viewmatrix should have been set OK, also no shademode! */
-static void draw_manipulator_axes(int colcode, int flagx, int flagy, int flagz)
+static void draw_manipulator_axes(View3D *v3d, int colcode, int flagx, int flagy, int flagz)
{
-
+
/* axes */
if(flagx) {
- manipulator_setcolor('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
if(flagx & MAN_SCALE_X) glLoadName(MAN_SCALE_X);
else if(flagx & MAN_TRANS_X) glLoadName(MAN_TRANS_X);
glBegin(GL_LINES);
glVertex3f(0.2f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glEnd();
- }
+ }
if(flagy) {
if(flagy & MAN_SCALE_Y) glLoadName(MAN_SCALE_Y);
else if(flagy & MAN_TRANS_Y) glLoadName(MAN_TRANS_Y);
- manipulator_setcolor('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
- }
+ }
if(flagz) {
if(flagz & MAN_SCALE_Z) glLoadName(MAN_SCALE_Z);
else if(flagz & MAN_TRANS_Z) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
@@ -710,68 +667,68 @@ static void draw_manipulator_axes(int colcode, int flagx, int flagy, int flagz)
}
/* only called while G.moving */
-static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags)
+static void draw_manipulator_rotate_ghost(View3D *v3d, RegionView3D *rv3d, int drawflags)
{
GLUquadricObj *qobj;
float size, phi, startphi, vec[3], svec[3], matt[4][4], cross[3], tmat[3][3];
int arcs= (G.rt!=2);
-
+
glDisable(GL_DEPTH_TEST);
- qobj= gluNewQuadric();
- gluQuadricDrawStyle(qobj, GLU_FILL);
-
+ qobj= gluNewQuadric();
+ gluQuadricDrawStyle(qobj, GLU_FILL);
+
glColor4ub(0,0,0,64);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
-
- /* we need both [4][4] transforms, Trans.mat seems to be premul, not post for mat[][4] */
- Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
- Mat4MulMat34(matt, Trans.mat, mat);
+
+ /* we need both [4][4] transforms, t->mat seems to be premul, not post for mat[][4] */
+ Mat4CpyMat4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
+// XXX Mat4MulMat34(matt, t->mat, rv3d->twmat);
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
-
+
/* prepare for screen aligned draw */
glPushMatrix();
- size= screen_aligned(mat);
-
- vec[0]= (float)(Trans.con.imval[0] - Trans.center2d[0]);
- vec[1]= (float)(Trans.con.imval[1] - Trans.center2d[1]);
+ size= screen_aligned(rv3d, rv3d->twmat);
+
+ vec[0]= 0; // XXX (float)(t->con.imval[0] - t->center2d[0]);
+ vec[1]= 0; // XXX (float)(t->con.imval[1] - t->center2d[1]);
vec[2]= 0.0f;
Normalize(vec);
-
+
startphi= saacos( vec[1] );
if(vec[0]<0.0) startphi= -startphi;
-
- phi= (float)fmod(180.0*Trans.val/M_PI, 360.0);
+
+ phi= 0; // XXX (float)fmod(180.0*t->val/M_PI, 360.0);
if(phi > 180.0) phi-= 360.0;
else if(phi<-180.0) phi+= 360.0;
-
+
gluPartialDisk(qobj, 0.0, size, 32, 1, 180.0*startphi/M_PI, phi);
-
+
glPopMatrix();
}
else if(arcs) {
float imat[3][3], ivmat[3][3];
/* try to get the start rotation */
-
- svec[0]= (float)(Trans.con.imval[0] - Trans.center2d[0]);
- svec[1]= (float)(Trans.con.imval[1] - Trans.center2d[1]);
+
+ svec[0]= 0; // XXX (float)(t->con.imval[0] - t->center2d[0]);
+ svec[1]= 0; // XXX (float)(t->con.imval[1] - t->center2d[1]);
svec[2]= 0.0f;
-
+
/* screen aligned vec transform back to manipulator space */
- Mat3CpyMat4(ivmat, G.vd->viewinv);
- Mat3CpyMat4(tmat, mat);
+ Mat3CpyMat4(ivmat, rv3d->viewinv);
+ Mat3CpyMat4(tmat, rv3d->twmat);
Mat3Inv(imat, tmat);
Mat3MulMat3(tmat, imat, ivmat);
-
+
Mat3MulVecfl(tmat, svec); // tmat is used further on
Normalize(svec);
- }
-
- mymultmatrix(mat); // aligns with original widget
-
+ }
+
+ wmMultMatrix(rv3d->twmat); // aligns with original widget
+
/* Z disk */
if(drawflags & MAN_ROT_Z) {
if(arcs) {
@@ -779,18 +736,18 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags)
svec[0]+= tmat[2][0];
svec[1]+= tmat[2][1];
Normalize(svec);
-
+
startphi= (float)atan2(svec[0], svec[1]);
}
else startphi= 0.5f*(float)M_PI;
-
- VECCOPY(vec, mat[0]); // use x axis to detect rotation
+
+ VECCOPY(vec, rv3d->twmat[0]); // use x axis to detect rotation
Normalize(vec);
Normalize(matt[0]);
phi= saacos( Inpf(vec, matt[0]) );
if(phi!=0.0) {
Crossf(cross, vec, matt[0]); // results in z vector
- if(Inpf(cross, mat[2]) > 0.0) phi= -phi;
+ if(Inpf(cross, rv3d->twmat[2]) > 0.0) phi= -phi;
gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*(phi)/M_PI);
}
}
@@ -801,23 +758,23 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags)
svec[1]+= tmat[2][1];
svec[2]+= tmat[2][2];
Normalize(svec);
-
+
startphi= (float)(M_PI + atan2(svec[2], -svec[1]));
}
else startphi= 0.0f;
-
- VECCOPY(vec, mat[1]); // use y axis to detect rotation
+
+ VECCOPY(vec, rv3d->twmat[1]); // use y axis to detect rotation
Normalize(vec);
Normalize(matt[1]);
phi= saacos( Inpf(vec, matt[1]) );
if(phi!=0.0) {
Crossf(cross, vec, matt[1]); // results in x vector
- if(Inpf(cross, mat[0]) > 0.0) phi= -phi;
+ if(Inpf(cross, rv3d->twmat[0]) > 0.0) phi= -phi;
glRotatef(90.0, 0.0, 1.0, 0.0);
gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
- }
+ }
/* Y circle */
if(drawflags & MAN_ROT_Y) {
if(arcs) {
@@ -825,83 +782,83 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags)
svec[0]+= tmat[2][0];
svec[2]+= tmat[2][2];
Normalize(svec);
-
+
startphi= (float)(M_PI + atan2(-svec[0], svec[2]));
}
else startphi= (float)M_PI;
-
- VECCOPY(vec, mat[2]); // use z axis to detect rotation
+
+ VECCOPY(vec, rv3d->twmat[2]); // use z axis to detect rotation
Normalize(vec);
Normalize(matt[2]);
phi= saacos( Inpf(vec, matt[2]) );
if(phi!=0.0) {
Crossf(cross, vec, matt[2]); // results in y vector
- if(Inpf(cross, mat[1]) > 0.0) phi= -phi;
+ if(Inpf(cross, rv3d->twmat[1]) > 0.0) phi= -phi;
glRotatef(-90.0, 1.0, 0.0, 0.0);
gluPartialDisk(qobj, 0.0, 1.0, 32, 1, 180.0*startphi/M_PI, 180.0*phi/M_PI);
glRotatef(90.0, 1.0, 0.0, 0.0);
}
}
-
+
glDisable(GL_BLEND);
- myloadmatrix(G.vd->viewmat);
+ wmLoadMatrix(rv3d->viewmat);
}
-static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, int combo)
+static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo)
{
- GLUquadricObj *qobj;
+ GLUquadricObj *qobj;
double plane[4];
float size, vec[3], unitmat[4][4];
- float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
+ float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.65f;
int arcs= (G.rt!=2);
int colcode;
-
+
if(moving) colcode= MAN_MOVECOL;
else colcode= MAN_RGB;
-
+
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_ROT_C)==0) return;
-
+
/* Init stuff */
glDisable(GL_DEPTH_TEST);
Mat4One(unitmat);
qobj= gluNewQuadric();
- gluQuadricDrawStyle(qobj, GLU_FILL);
-
+ gluQuadricDrawStyle(qobj, GLU_FILL);
+
/* prepare for screen aligned draw */
- VECCOPY(vec, mat[0]);
+ VECCOPY(vec, rv3d->twmat[0]);
size= Normalize(vec);
glPushMatrix();
- glTranslatef(mat[3][0], mat[3][1], mat[3][2]);
-
+ glTranslatef(rv3d->twmat[3][0], rv3d->twmat[3][1], rv3d->twmat[3][2]);
+
if(arcs) {
/* clipplane makes nice handles, calc here because of multmatrix but with translate! */
- VECCOPY(plane, G.vd->viewinv[2]);
+ VECCOPY(plane, rv3d->viewinv[2]);
plane[3]= -0.02*size; // clip just a bit more
glClipPlane(GL_CLIP_PLANE0, plane);
}
/* sets view screen aligned */
- glRotatef( -360.0f*saacos(G.vd->viewquat[0])/(float)M_PI, G.vd->viewquat[1], G.vd->viewquat[2], G.vd->viewquat[3]);
-
+ glRotatef( -360.0f*saacos(rv3d->viewquat[0])/(float)M_PI, rv3d->viewquat[1], rv3d->viewquat[2], rv3d->viewquat[3]);
+
/* Screen aligned help circle */
if(arcs) {
if((G.f & G_PICKSEL)==0) {
- BIF_ThemeColorShade(TH_BACK, -30);
+ UI_ThemeColorShade(TH_BACK, -30);
drawcircball(GL_LINE_LOOP, unitmat[3], size, unitmat);
}
}
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
- BIF_ThemeColor(TH_TRANSFORM);
+ UI_ThemeColor(TH_TRANSFORM);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.2f*size, unitmat);
-
- if(moving) {
+
+ if(moving) {
float vec[3];
- vec[0]= (float)(Trans.imval[0] - Trans.center2d[0]);
- vec[1]= (float)(Trans.imval[1] - Trans.center2d[1]);
+ vec[0]= 0; // XXX (float)(t->imval[0] - t->center2d[0]);
+ vec[1]= 0; // XXX (float)(t->imval[1] - t->center2d[1]);
vec[2]= 0.0f;
Normalize(vec);
VecMulf(vec, 1.2f*size);
@@ -912,20 +869,20 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, i
}
}
glPopMatrix();
-
+
/* apply the transform delta */
if(moving) {
float matt[4][4];
- Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
- Mat4MulMat34(matt, Trans.mat, mat);
- mymultmatrix(matt);
+ Mat4CpyMat4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
+ // XXX Mat4MulMat34(matt, t->mat, rv3d->twmat);
+ wmMultMatrix(matt);
glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
}
else {
- glFrontFace( is_mat4_flipped(mat)?GL_CW:GL_CCW);
- mymultmatrix(mat);
+ glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ wmMultMatrix(rv3d->twmat);
}
-
+
/* axes */
if(arcs==0) {
if(!(G.f & G_PICKSEL)) {
@@ -933,17 +890,17 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, i
/* axis */
glBegin(GL_LINES);
if( (drawflags & MAN_ROT_X) || (moving && (drawflags & MAN_ROT_Z)) ) {
- manipulator_setcolor('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
glVertex3f(0.2f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
- }
+ }
if( (drawflags & MAN_ROT_Y) || (moving && (drawflags & MAN_ROT_X)) ) {
- manipulator_setcolor('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
- }
+ }
if( (drawflags & MAN_ROT_Z) || (moving && (drawflags & MAN_ROT_Y)) ) {
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
}
@@ -951,183 +908,248 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, i
}
}
}
-
+
if(arcs==0 && moving) {
-
+
/* Z circle */
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
}
/* X circle */
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('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(-90.0, 0.0, 1.0, 0.0);
- }
+ }
/* Y circle */
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('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(90.0, 1.0, 0.0, 0.0);
}
-
+
if(arcs) glDisable(GL_CLIP_PLANE0);
}
// donut arcs
if(arcs) {
glEnable(GL_CLIP_PLANE0);
-
+
/* Z circle */
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
}
/* X circle */
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('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(-90.0, 0.0, 1.0, 0.0);
- }
+ }
/* Y circle */
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('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(90.0, 1.0, 0.0, 0.0);
}
-
+
glDisable(GL_CLIP_PLANE0);
}
-
+
if(arcs==0) {
-
+
/* Z handle on X axis */
if(drawflags & MAN_ROT_Z) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
partial_donut(0.7f*cusize, 1.0f, 31, 33, 8, 64);
glPopMatrix();
- }
+ }
/* Y handle on X axis */
if(drawflags & MAN_ROT_Y) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
- manipulator_setcolor('y', colcode);
-
+ manipulator_setcolor(v3d, 'y', colcode);
+
glRotatef(90.0, 1.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
partial_donut(0.7f*cusize, 1.0f, 31, 33, 8, 64);
-
+
glPopMatrix();
}
-
+
/* X handle on Z axis */
if(drawflags & MAN_ROT_X) {
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
- manipulator_setcolor('x', colcode);
-
+ manipulator_setcolor(v3d, 'x', colcode);
+
glRotatef(-90.0, 0.0, 1.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
partial_donut(0.7f*cusize, 1.0f, 31, 33, 8, 64);
glPopMatrix();
}
-
+
}
-
+
/* restore */
- myloadmatrix(G.vd->viewmat);
+ wmLoadMatrix(rv3d->viewmat);
gluDeleteQuadric(qobj);
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
-
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+
+}
+
+static void drawsolidcube(float size)
+{
+ static float cube[8][3] = {
+ {-1.0, -1.0, -1.0},
+ {-1.0, -1.0, 1.0},
+ {-1.0, 1.0, 1.0},
+ {-1.0, 1.0, -1.0},
+ { 1.0, -1.0, -1.0},
+ { 1.0, -1.0, 1.0},
+ { 1.0, 1.0, 1.0},
+ { 1.0, 1.0, -1.0}, };
+ float n[3];
+
+ glPushMatrix();
+ glScalef(size, size, size);
+
+ n[0]=0; n[1]=0; n[2]=0;
+ glBegin(GL_QUADS);
+ n[0]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[0]); glVertex3fv(cube[1]); glVertex3fv(cube[2]); glVertex3fv(cube[3]);
+ n[0]=0;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ n[1]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[0]); glVertex3fv(cube[4]); glVertex3fv(cube[5]); glVertex3fv(cube[1]);
+ n[1]=0;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ n[0]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[4]); glVertex3fv(cube[7]); glVertex3fv(cube[6]); glVertex3fv(cube[5]);
+ n[0]=0;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ n[1]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[7]); glVertex3fv(cube[3]); glVertex3fv(cube[2]); glVertex3fv(cube[6]);
+ n[1]=0;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ n[2]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[1]); glVertex3fv(cube[5]); glVertex3fv(cube[6]); glVertex3fv(cube[2]);
+ n[2]=0;
+ glEnd();
+
+ glBegin(GL_QUADS);
+ n[2]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[7]); glVertex3fv(cube[4]); glVertex3fv(cube[0]); glVertex3fv(cube[3]);
+ glEnd();
+
+ glPopMatrix();
}
-static void draw_manipulator_scale(float mat[][4], int moving, int drawflags, int combo, int colcode)
+
+static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo, int colcode)
{
- float cywid= 0.25f*0.01f*(float)U.tw_handlesize;
+ float cywid= 0.25f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.75f, dz;
-
+
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_SCALE_C)==0) return;
-
+
glDisable(GL_DEPTH_TEST);
-
+
/* not in combo mode */
if( (combo & (V3D_MANIP_TRANSLATE|V3D_MANIP_ROTATE))==0) {
float size, unitmat[4][4];
-
+ int shift= 0; // XXX
+
/* center circle, do not add to selection when shift is pressed (planar constraint) */
- if( (G.f & G_PICKSEL) && (G.qual & LR_SHIFTKEY)==0) glLoadName(MAN_SCALE_C);
-
- manipulator_setcolor('c', colcode);
+ if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_SCALE_C);
+
+ manipulator_setcolor(v3d, 'c', colcode);
glPushMatrix();
- size= screen_aligned(mat);
+ size= screen_aligned(rv3d, rv3d->twmat);
Mat4One(unitmat);
drawcircball(GL_LINE_LOOP, unitmat[3], 0.2f*size, unitmat);
glPopMatrix();
-
+
dz= 1.0;
}
else dz= 1.0f-4.0f*cusize;
-
+
if(moving) {
float matt[4][4];
-
- Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
- Mat4MulMat34(matt, Trans.mat, mat);
- mymultmatrix(matt);
+
+ Mat4CpyMat4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
+ // XXX Mat4MulMat34(matt, t->mat, rv3d->twmat);
+ wmMultMatrix(matt);
glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
}
else {
- mymultmatrix(mat);
- glFrontFace( is_mat4_flipped(mat)?GL_CW:GL_CCW);
+ wmMultMatrix(rv3d->twmat);
+ glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
}
-
+
/* axis */
-
+
/* in combo mode, this is always drawn as first type */
- draw_manipulator_axes(colcode, drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z);
-
+ draw_manipulator_axes(v3d, colcode, drawflags & MAN_SCALE_X, drawflags & MAN_SCALE_Y, drawflags & MAN_SCALE_Z);
+
/* Z cube */
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_SCALE_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
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('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
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('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
drawsolidcube(cusize);
}
-
+
/* if shiftkey, center point as last, for selectbuffer order */
if(G.f & G_PICKSEL) {
- if(G.qual & LR_SHIFTKEY) {
+ int shift= 0; // XXX
+
+ if(shift) {
glTranslatef(0.0, -dz, 0.0);
glLoadName(MAN_SCALE_C);
glBegin(GL_POINTS);
@@ -1135,11 +1157,11 @@ static void draw_manipulator_scale(float mat[][4], int moving, int drawflags, in
glEnd();
}
}
-
+
/* restore */
- myloadmatrix(G.vd->viewmat);
-
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ wmLoadMatrix(rv3d->viewmat);
+
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
}
@@ -1149,132 +1171,133 @@ static void draw_cone(GLUquadricObj *qobj, float len, float width)
glTranslatef(0.0, 0.0, -0.5f*len);
gluCylinder(qobj, width, 0.0, len, 8, 1);
gluQuadricOrientation(qobj, GLU_INSIDE);
- gluDisk(qobj, 0.0, width, 8, 1);
+ gluDisk(qobj, 0.0, width, 8, 1);
gluQuadricOrientation(qobj, GLU_OUTSIDE);
glTranslatef(0.0, 0.0, 0.5f*len);
}
static void draw_cylinder(GLUquadricObj *qobj, float len, float width)
{
-
+
width*= 0.8f; // just for beauty
-
+
glTranslatef(0.0, 0.0, -0.5f*len);
gluCylinder(qobj, width, width, len, 8, 1);
gluQuadricOrientation(qobj, GLU_INSIDE);
- gluDisk(qobj, 0.0, width, 8, 1);
+ gluDisk(qobj, 0.0, width, 8, 1);
gluQuadricOrientation(qobj, GLU_OUTSIDE);
glTranslatef(0.0, 0.0, len);
- gluDisk(qobj, 0.0, width, 8, 1);
+ gluDisk(qobj, 0.0, width, 8, 1);
glTranslatef(0.0, 0.0, -0.5f*len);
}
-static void draw_manipulator_translate(float mat[][4], int moving, int drawflags, int combo, int colcode)
+static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo, int colcode)
{
- GLUquadricObj *qobj;
+ GLUquadricObj *qobj;
float cylen= 0.01f*(float)U.tw_handlesize;
float cywid= 0.25f*cylen, dz, size;
float unitmat[4][4];
-
+ int shift= 0; // XXX
+
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_TRANS_C)==0) return;
-
- if(moving) glTranslatef(Trans.vec[0], Trans.vec[1], Trans.vec[2]);
+
+ // XXX if(moving) glTranslatef(t->vec[0], t->vec[1], t->vec[2]);
glDisable(GL_DEPTH_TEST);
qobj= gluNewQuadric();
- gluQuadricDrawStyle(qobj, GLU_FILL);
-
+ gluQuadricDrawStyle(qobj, GLU_FILL);
+
/* center circle, do not add to selection when shift is pressed (planar constraint) */
- if( (G.f & G_PICKSEL) && (G.qual & LR_SHIFTKEY)==0) glLoadName(MAN_TRANS_C);
-
- manipulator_setcolor('c', colcode);
+ if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_TRANS_C);
+
+ manipulator_setcolor(v3d, 'c', colcode);
glPushMatrix();
- size= screen_aligned(mat);
+ size= screen_aligned(rv3d, rv3d->twmat);
Mat4One(unitmat);
drawcircball(GL_LINE_LOOP, unitmat[3], 0.2f*size, unitmat);
glPopMatrix();
-
+
/* and now apply matrix, we move to local matrix drawing */
- mymultmatrix(mat);
-
+ wmMultMatrix(rv3d->twmat);
+
/* axis */
glLoadName(-1);
-
+
// translate drawn as last, only axis when no combo with scale, or for ghosting
if((combo & V3D_MANIP_SCALE)==0 || colcode==MAN_GHOST)
- draw_manipulator_axes(colcode, drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z);
+ draw_manipulator_axes(v3d, colcode, drawflags & MAN_TRANS_X, drawflags & MAN_TRANS_Y, drawflags & MAN_TRANS_Z);
+
-
/* offset in combo mode, for rotate a bit more */
if(combo & (V3D_MANIP_ROTATE)) dz= 1.0f+2.0f*cylen;
else if(combo & (V3D_MANIP_SCALE)) dz= 1.0f+0.5f*cylen;
else dz= 1.0f;
-
+
/* Z Cone */
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_TRANS_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
draw_cone(qobj, cylen, cywid);
- }
+ }
/* X Cone */
glTranslatef(dz, 0.0, -dz);
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('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
draw_cone(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
- }
+ }
/* Y Cone */
glTranslatef(-dz, dz, 0.0);
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('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
draw_cone(qobj, cylen, cywid);
}
gluDeleteQuadric(qobj);
- myloadmatrix(G.vd->viewmat);
-
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
-
+ wmLoadMatrix(rv3d->viewmat);
+
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+
}
-static void draw_manipulator_rotate_cyl(float mat[][4], int moving, int drawflags, int combo, int colcode)
+static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo, int colcode)
{
GLUquadricObj *qobj;
float size;
float cylen= 0.01f*(float)U.tw_handlesize;
float cywid= 0.25f*cylen;
-
+
/* when called while moving in mixed mode, do not draw when... */
if((drawflags & MAN_ROT_C)==0) return;
/* prepare for screen aligned draw */
glPushMatrix();
- size= screen_aligned(mat);
-
+ size= screen_aligned(rv3d, rv3d->twmat);
+
glDisable(GL_DEPTH_TEST);
- qobj= gluNewQuadric();
-
+ qobj= gluNewQuadric();
+
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
float unitmat[4][4];
Mat4One(unitmat);
-
+
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
- BIF_ThemeColor(TH_TRANSFORM);
+ UI_ThemeColor(TH_TRANSFORM);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.2f*size, unitmat);
-
+
if(moving) {
float vec[3];
- vec[0]= (float)(Trans.imval[0] - Trans.center2d[0]);
- vec[1]= (float)(Trans.imval[1] - Trans.center2d[1]);
+ vec[0]= 0; // XXX (float)(t->imval[0] - t->center2d[0]);
+ vec[1]= 0; // XXX (float)(t->imval[1] - t->center2d[1]);
vec[2]= 0.0f;
Normalize(vec);
VecMulf(vec, 1.2f*size);
@@ -1285,65 +1308,65 @@ static void draw_manipulator_rotate_cyl(float mat[][4], int moving, int drawflag
}
}
glPopMatrix();
-
+
/* apply the transform delta */
if(moving) {
float matt[4][4];
- Mat4CpyMat4(matt, mat); // to copy the parts outside of [3][3]
- if (Trans.flag & T_USES_MANIPULATOR) {
- Mat4MulMat34(matt, Trans.mat, mat);
- }
- mymultmatrix(matt);
+ Mat4CpyMat4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
+ // XXX if (t->flag & T_USES_MANIPULATOR) {
+ // XXX Mat4MulMat34(matt, t->mat, rv3d->twmat);
+ // XXX }
+ wmMultMatrix(matt);
}
else {
- mymultmatrix(mat);
+ wmMultMatrix(rv3d->twmat);
}
-
- glFrontFace( is_mat4_flipped(mat)?GL_CW:GL_CCW);
-
+
+ glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+
/* axis */
if( (G.f & G_PICKSEL)==0 ) {
-
+
// only draw axis when combo didn't draw scale axes
if((combo & V3D_MANIP_SCALE)==0)
- draw_manipulator_axes(colcode, drawflags & MAN_ROT_X, drawflags & MAN_ROT_Y, drawflags & MAN_ROT_Z);
-
+ draw_manipulator_axes(v3d, colcode, drawflags & MAN_ROT_X, drawflags & MAN_ROT_Y, drawflags & MAN_ROT_Z);
+
/* only has to be set when not in picking */
- gluQuadricDrawStyle(qobj, GLU_FILL);
+ gluQuadricDrawStyle(qobj, GLU_FILL);
}
-
+
/* Z cyl */
glTranslatef(0.0, 0.0, 1.0);
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor('z', colcode);
+ manipulator_setcolor(v3d, 'z', colcode);
draw_cylinder(qobj, cylen, cywid);
- }
+ }
/* X cyl */
glTranslatef(1.0, 0.0, -1.0);
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('x', colcode);
+ manipulator_setcolor(v3d, 'x', colcode);
draw_cylinder(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
- }
+ }
/* Y cylinder */
glTranslatef(-1.0, 1.0, 0.0);
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('y', colcode);
+ manipulator_setcolor(v3d, 'y', colcode);
draw_cylinder(qobj, cylen, cywid);
}
-
+
/* restore */
-
+
gluDeleteQuadric(qobj);
- myloadmatrix(G.vd->viewmat);
-
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
-
+ wmLoadMatrix(rv3d->viewmat);
+
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+
}
@@ -1353,78 +1376,33 @@ 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;
}
-/* exported to transform_constraints.c */
-/* mat, vec = default orientation and location */
-/* type = transform type */
-/* axis = x, y, z, c */
-/* col: 0 = colored, 1 = moving, 2 = ghost */
-void draw_manipulator_ext(ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3])
-{
- int drawflags= 0;
- float mat4[4][4];
- int colcode;
-
- Mat4CpyMat3(mat4, mat);
- VECCOPY(mat4[3], vec);
-
- Mat4MulFloat3((float *)mat4, get_manipulator_drawsize(sa));
-
- glEnable(GL_BLEND); // let's do it transparent by default
- if(col==0) colcode= MAN_RGB;
- else if(col==1) colcode= MAN_MOVECOL;
- else colcode= MAN_GHOST;
-
-
- if(type==TFM_ROTATION) {
- if(axis=='x') drawflags= MAN_ROT_X;
- else if(axis=='y') drawflags= MAN_ROT_Y;
- else if(axis=='z') drawflags= MAN_ROT_Z;
- else drawflags= MAN_ROT_C;
-
- draw_manipulator_rotate_cyl(mat4, col, drawflags, V3D_MANIP_ROTATE, colcode);
- }
- else if(type==TFM_RESIZE) {
- if(axis=='x') drawflags= MAN_SCALE_X;
- else if(axis=='y') drawflags= MAN_SCALE_Y;
- else if(axis=='z') drawflags= MAN_SCALE_Z;
- else drawflags= MAN_SCALE_C;
-
- draw_manipulator_scale(mat4, col, drawflags, V3D_MANIP_SCALE, colcode);
- }
- else {
- if(axis=='x') drawflags= MAN_TRANS_X;
- else if(axis=='y') drawflags= MAN_TRANS_Y;
- else if(axis=='z') drawflags= MAN_TRANS_Z;
- else drawflags= MAN_TRANS_C;
-
- draw_manipulator_translate(mat4, 0, drawflags, V3D_MANIP_TRANSLATE, colcode);
- }
-
-
- glDisable(GL_BLEND);
-}
/* main call, does calc centers & orientation too */
/* uses global G.moving */
static int drawflags= 0xFFFF; // only for the calls below, belongs in scene...?
-void BIF_draw_manipulator(ScrArea *sa)
+
+void BIF_draw_manipulator(const bContext *C)
{
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar= CTX_wm_region(C);
+ Scene *scene= CTX_data_scene(C);
View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= ar->regiondata;
int totsel;
-
+
if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return;
if(G.moving && (G.moving & G_TRANSFORM_MANIP)==0) return;
-
+
if(G.moving==0) {
v3d->twflag &= ~V3D_DRAW_MANIPULATOR;
-
- totsel= calc_manipulator_stats(sa);
+
+ totsel= calc_manipulator_stats(C);
if(totsel==0) return;
drawflags= v3d->twdrawflag; /* set in calc_manipulator_stats */
@@ -1434,123 +1412,119 @@ void BIF_draw_manipulator(ScrArea *sa)
switch(v3d->around) {
case V3D_CENTER:
case V3D_ACTIVE:
- v3d->twmat[3][0]= (G.scene->twmin[0] + G.scene->twmax[0])/2.0f;
- v3d->twmat[3][1]= (G.scene->twmin[1] + G.scene->twmax[1])/2.0f;
- v3d->twmat[3][2]= (G.scene->twmin[2] + G.scene->twmax[2])/2.0f;
- if(v3d->around==V3D_ACTIVE && t->obedit==NULL) {
+ rv3d->twmat[3][0]= (scene->twmin[0] + scene->twmax[0])/2.0f;
+ rv3d->twmat[3][1]= (scene->twmin[1] + scene->twmax[1])/2.0f;
+ rv3d->twmat[3][2]= (scene->twmin[2] + scene->twmax[2])/2.0f;
+ if(v3d->around==V3D_ACTIVE && scene->obedit==NULL) {
Object *ob= OBACT;
- if(ob && !(ob->flag & OB_POSEMODE))
- VECCOPY(v3d->twmat[3], ob->obmat[3]);
+ if(ob && !(ob->mode & OB_MODE_POSE))
+ VECCOPY(rv3d->twmat[3], ob->obmat[3]);
}
break;
case V3D_LOCAL:
case V3D_CENTROID:
- VECCOPY(v3d->twmat[3], G.scene->twcent);
+ VECCOPY(rv3d->twmat[3], scene->twcent);
break;
case V3D_CURSOR:
- VECCOPY(v3d->twmat[3], give_cursor());
+ VECCOPY(rv3d->twmat[3], give_cursor(scene, v3d));
break;
}
-
- Mat4MulFloat3((float *)v3d->twmat, get_manipulator_drawsize(sa));
+
+ Mat4MulFloat3((float *)rv3d->twmat, get_manipulator_drawsize(ar));
}
-
+
if(v3d->twflag & V3D_DRAW_MANIPULATOR) {
-
+
if(v3d->twtype & V3D_MANIP_ROTATE) {
-
+
/* rotate has special ghosting draw, for pie chart */
- if(G.moving) draw_manipulator_rotate_ghost(v3d->twmat, drawflags);
-
+ if(G.moving) draw_manipulator_rotate_ghost(v3d, rv3d, drawflags);
+
if(G.moving) glEnable(GL_BLEND);
-
+
if(G.rt==3) {
- if(G.moving) draw_manipulator_rotate_cyl(v3d->twmat, 1, drawflags, v3d->twtype, MAN_MOVECOL);
- else draw_manipulator_rotate_cyl(v3d->twmat, 0, drawflags, v3d->twtype, MAN_RGB);
+ if(G.moving) draw_manipulator_rotate_cyl(v3d, rv3d, 1, drawflags, v3d->twtype, MAN_MOVECOL);
+ else draw_manipulator_rotate_cyl(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_RGB);
}
else
- draw_manipulator_rotate(v3d->twmat, G.moving, drawflags, v3d->twtype);
-
+ draw_manipulator_rotate(v3d, rv3d, G.moving, drawflags, v3d->twtype);
+
glDisable(GL_BLEND);
}
if(v3d->twtype & V3D_MANIP_SCALE) {
if(G.moving) {
glEnable(GL_BLEND);
- draw_manipulator_scale(v3d->twmat, 0, drawflags, v3d->twtype, MAN_GHOST);
- draw_manipulator_scale(v3d->twmat, 1, drawflags, v3d->twtype, MAN_MOVECOL);
+ draw_manipulator_scale(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_GHOST);
+ draw_manipulator_scale(v3d, rv3d, 1, drawflags, v3d->twtype, MAN_MOVECOL);
glDisable(GL_BLEND);
}
- else draw_manipulator_scale(v3d->twmat, 0, drawflags, v3d->twtype, MAN_RGB);
+ else draw_manipulator_scale(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_RGB);
}
if(v3d->twtype & V3D_MANIP_TRANSLATE) {
if(G.moving) {
glEnable(GL_BLEND);
- draw_manipulator_translate(v3d->twmat, 0, drawflags, v3d->twtype, MAN_GHOST);
- draw_manipulator_translate(v3d->twmat, 1, drawflags, v3d->twtype, MAN_MOVECOL);
+ draw_manipulator_translate(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_GHOST);
+ draw_manipulator_translate(v3d, rv3d, 1, drawflags, v3d->twtype, MAN_MOVECOL);
glDisable(GL_BLEND);
}
- else draw_manipulator_translate(v3d->twmat, 0, drawflags, v3d->twtype, MAN_RGB);
+ else draw_manipulator_translate(v3d, rv3d, 0, drawflags, v3d->twtype, MAN_RGB);
}
}
}
-static int manipulator_selectbuf(ScrArea *sa, float hotspot)
+static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, short *mval, float hotspot)
{
View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= ar->regiondata;
rctf rect;
GLuint buffer[64]; // max 4 items per select, so large enuf
- short hits, mval[2];
-
+ short hits;
+ extern void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect); // XXX check a bit later on this... (ton)
+
G.f |= G_PICKSEL;
-
- getmouseco_areawin(mval);
+
rect.xmin= mval[0]-hotspot;
rect.xmax= mval[0]+hotspot;
rect.ymin= mval[1]-hotspot;
rect.ymax= mval[1]+hotspot;
-
- /* get rid of overlay button matrix */
- persp(PERSP_VIEW);
-
- setwinmatrixview3d(sa->winx, sa->winy, &rect);
- Mat4MulMat4(v3d->persmat, v3d->viewmat, sa->winmat);
-
+
+ setwinmatrixview3d(ar, v3d, &rect);
+ Mat4MulMat4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+
glSelectBuffer( 64, buffer);
glRenderMode(GL_SELECT);
glInitNames(); /* these two calls whatfor? It doesnt work otherwise */
glPushName(-2);
-
+
/* do the drawing */
if(v3d->twtype & V3D_MANIP_ROTATE) {
- if(G.rt==3) draw_manipulator_rotate_cyl(v3d->twmat, 0, MAN_ROT_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
- else draw_manipulator_rotate(v3d->twmat, 0, MAN_ROT_C & v3d->twdrawflag, v3d->twtype);
+ if(G.rt==3) draw_manipulator_rotate_cyl(v3d, rv3d, 0, MAN_ROT_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
+ else draw_manipulator_rotate(v3d, rv3d, 0, MAN_ROT_C & v3d->twdrawflag, v3d->twtype);
}
if(v3d->twtype & V3D_MANIP_SCALE)
- draw_manipulator_scale(v3d->twmat, 0, MAN_SCALE_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
+ draw_manipulator_scale(v3d, rv3d, 0, MAN_SCALE_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
if(v3d->twtype & V3D_MANIP_TRANSLATE)
- draw_manipulator_translate(v3d->twmat, 0, MAN_TRANS_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
-
+ draw_manipulator_translate(v3d, rv3d, 0, MAN_TRANS_C & v3d->twdrawflag, v3d->twtype, MAN_RGB);
+
glPopName();
hits= glRenderMode(GL_RENDER);
-
+
G.f &= ~G_PICKSEL;
- setwinmatrixview3d(sa->winx, sa->winy, NULL);
- Mat4MulMat4(v3d->persmat, v3d->viewmat, sa->winmat);
-
- persp(PERSP_WIN);
-
+ setwinmatrixview3d(ar, v3d, NULL);
+ Mat4MulMat4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
+
if(hits==1) return buffer[3];
else if(hits>1) {
GLuint val, dep, mindep=0, mindeprot=0, minval=0, minvalrot=0;
int a;
-
+
/* we compare the hits in buffer, but value centers highest */
/* we also store the rotation hits separate (because of arcs) and return hits on other widgets if there are */
for(a=0; a<hits; a++) {
dep= buffer[4*a + 1];
val= buffer[4*a + 3];
-
+
if(val==MAN_TRANS_C) return MAN_TRANS_C;
else if(val==MAN_SCALE_C) return MAN_SCALE_C;
else {
@@ -1568,7 +1542,7 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
}
}
}
-
+
if(minval)
return minval;
else
@@ -1578,108 +1552,110 @@ static int manipulator_selectbuf(ScrArea *sa, float hotspot)
}
/* return 0; nothing happened */
-int BIF_do_manipulator(ScrArea *sa)
+int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op)
{
+ ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
+ ARegion *ar= CTX_wm_region(C);
+ int constraint_axis[3] = {0, 0, 0};
int val;
-
+ int shift = event->shift;
+
if(!(v3d->twflag & V3D_USE_MANIPULATOR)) return 0;
if(!(v3d->twflag & V3D_DRAW_MANIPULATOR)) return 0;
-
+
// find the hotspots first test narrow hotspot
- val= manipulator_selectbuf(sa, 0.5f*(float)U.tw_hotspot);
+ val= manipulator_selectbuf(sa, ar, event->mval, 0.5f*(float)U.tw_hotspot);
if(val) {
- checkFirstTime(); // TEMPORARY, check this before doing any transform call.
+
// drawflags still global, for drawing call above
- drawflags= manipulator_selectbuf(sa, 0.2f*(float)U.tw_hotspot);
+ drawflags= manipulator_selectbuf(sa, ar, event->mval, 0.2f*(float)U.tw_hotspot);
if(drawflags==0) drawflags= val;
if (drawflags & MAN_TRANS_C) {
- initManipulator(TFM_TRANSLATION);
switch(drawflags) {
case MAN_TRANS_C:
break;
case MAN_TRANS_X:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_TRANS_Y|MAN_TRANS_Z;
- BIF_setDualAxisConstraint(v3d->twmat[1], v3d->twmat[2], " Y+Z");
+ if(shift) {
+ constraint_axis[1] = 1;
+ constraint_axis[2] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[0], " X");
+ constraint_axis[0] = 1;
break;
case MAN_TRANS_Y:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_TRANS_X|MAN_TRANS_Z;
- BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[2], " X+Z");
+ if(shift) {
+ constraint_axis[0] = 1;
+ constraint_axis[2] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[1], " Y");
+ constraint_axis[1] = 1;
break;
case MAN_TRANS_Z:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_TRANS_X|MAN_TRANS_Y;
- BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[1], " X+Y");
+ if(shift) {
+ constraint_axis[0] = 1;
+ constraint_axis[1] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[2], " Z");
+ constraint_axis[2] = 1;
break;
}
- ManipulatorTransform();
+ RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
+ WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr);
}
else if (drawflags & MAN_SCALE_C) {
- initManipulator(TFM_RESIZE);
switch(drawflags) {
case MAN_SCALE_X:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_SCALE_Y|MAN_SCALE_Z;
- BIF_setDualAxisConstraint(v3d->twmat[1], v3d->twmat[2], " Y+Z");
+ if(shift) {
+ constraint_axis[1] = 1;
+ constraint_axis[2] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[0], " X");
+ constraint_axis[0] = 1;
break;
case MAN_SCALE_Y:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_SCALE_X|MAN_SCALE_Z;
- BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[2], " X+Z");
+ if(shift) {
+ constraint_axis[0] = 1;
+ constraint_axis[2] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[1], " Y");
+ constraint_axis[1] = 1;
break;
case MAN_SCALE_Z:
- if(G.qual & LR_SHIFTKEY) {
- drawflags= MAN_SCALE_X|MAN_SCALE_Y;
- BIF_setDualAxisConstraint(v3d->twmat[0], v3d->twmat[1], " X+Y");
+ if(shift) {
+ constraint_axis[0] = 1;
+ constraint_axis[1] = 1;
}
else
- BIF_setSingleAxisConstraint(v3d->twmat[2], " Z");
+ constraint_axis[2] = 1;
break;
}
- ManipulatorTransform();
+ RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
+ WM_operator_name_call(C, "TFM_OT_resize", WM_OP_INVOKE_REGION_WIN, op->ptr);
}
- else if (drawflags == MAN_ROT_T) { /* trackbal need special case, init is different */
- initManipulator(TFM_TRACKBALL);
- ManipulatorTransform();
+ else if (drawflags == MAN_ROT_T) { /* trackball need special case, init is different */
+ WM_operator_name_call(C, "TFM_OT_trackball", WM_OP_INVOKE_REGION_WIN, op->ptr);
}
else if (drawflags & MAN_ROT_C) {
- initManipulator(TFM_ROTATION);
switch(drawflags) {
case MAN_ROT_X:
- BIF_setSingleAxisConstraint(v3d->twmat[0], " X");
+ constraint_axis[0] = 1;
break;
case MAN_ROT_Y:
- BIF_setSingleAxisConstraint(v3d->twmat[1], " Y");
+ constraint_axis[1] = 1;
break;
case MAN_ROT_Z:
- BIF_setSingleAxisConstraint(v3d->twmat[2], " Z");
+ constraint_axis[2] = 1;
break;
}
- ManipulatorTransform();
+ RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
+ WM_operator_name_call(C, "TFM_OT_rotate", WM_OP_INVOKE_REGION_WIN, op->ptr);
}
}
/* after transform, restore drawflags */
drawflags= 0xFFFF;
-
+
return val;
}
-#endif
diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c
index 9c2a1a7db6d..f8567023e5f 100644
--- a/source/blender/editors/transform/transform_ndofinput.c
+++ b/source/blender/editors/transform/transform_ndofinput.c
@@ -37,7 +37,9 @@
#include "transform.h"
+#if 0
static int updateNDofMotion(NDofInput *n); // return 0 when motion is null
+#endif
static void resetNDofInput(NDofInput *n);
void initNDofInput(NDofInput *n)
@@ -121,6 +123,8 @@ void applyNDofInput(NDofInput *n, float *vec)
}
}
+// TRANSFORM_FIX_ME
+#if 0
static int updateNDofMotion(NDofInput *n)
{
@@ -128,14 +132,11 @@ static int updateNDofMotion(NDofInput *n)
int i;
int retval = 0;
-// TRANSFORM_FIX_ME
-#if 0
getndof(fval);
if (G.vd->ndoffilter)
filterNDOFvalues(fval);
-#endif
-
+
for(i = 0; i < 6; i++)
{
if (!retval && fval[i] != 0.0f)
@@ -150,6 +151,7 @@ static int updateNDofMotion(NDofInput *n)
return retval;
}
+#endif
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 9e4115f38f0..b6f8d2c8c22 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -36,6 +36,7 @@
#include "BKE_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -81,14 +82,24 @@ EnumPropertyItem proportional_falloff_types[] = {
{0, NULL, 0, NULL, NULL}
};
-char OP_TRANSLATION[] = "TFM_OT_translation";
-char OP_ROTATION[] = "TFM_OT_rotation";
+EnumPropertyItem orientation_items[]= {
+ {V3D_MANIP_GLOBAL, "GLOBAL", 0, "Global", ""},
+ {V3D_MANIP_NORMAL, "NORMAL", 0, "Normal", ""},
+ {V3D_MANIP_LOCAL, "LOCAL", 0, "Local", ""},
+ {V3D_MANIP_VIEW, "VIEW", 0, "View", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+char OP_TRANSLATION[] = "TFM_OT_translate";
+char OP_ROTATION[] = "TFM_OT_rotate";
char OP_TOSPHERE[] = "TFM_OT_tosphere";
char OP_RESIZE[] = "TFM_OT_resize";
char OP_SHEAR[] = "TFM_OT_shear";
char OP_WARP[] = "TFM_OT_warp";
char OP_SHRINK_FATTEN[] = "TFM_OT_shrink_fatten";
char OP_TILT[] = "TFM_OT_tilt";
+char OP_TRACKBALL[] = "TFM_OT_trackball";
+char OP_MIRROR[] = "TFM_OT_mirror";
+char OP_EDGE_SLIDE[] = "TFM_OT_edge_slide";
TransformModeItem transform_modes[] =
@@ -101,17 +112,16 @@ TransformModeItem transform_modes[] =
{OP_WARP, TFM_WARP},
{OP_SHRINK_FATTEN, TFM_SHRINKFATTEN},
{OP_TILT, TFM_TILT},
+ {OP_TRACKBALL, TFM_TRACKBALL},
+ {OP_MIRROR, TFM_MIRROR},
+ {OP_EDGE_SLIDE, TFM_EDGE_SLIDE},
{NULL, 0}
};
static int select_orientation_exec(bContext *C, wmOperator *op)
{
int orientation = RNA_enum_get(op->ptr, "orientation");
- int custom_index= RNA_int_get(op->ptr, "custom_index");;
- if(orientation == V3D_MANIP_CUSTOM)
- orientation += custom_index;
-
BIF_selectTransformOrientationValue(C, orientation);
return OPERATOR_FINISHED;
@@ -121,27 +131,28 @@ static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event
{
uiPopupMenu *pup;
uiLayout *layout;
-
+
pup= uiPupMenuBegin(C, "Orientation", 0);
layout= uiPupMenuLayout(pup);
- BIF_menuTransformOrientation(C, layout, NULL);
+ uiItemsEnumO(layout, "TFM_OT_select_orientation", "orientation");
uiPupMenuEnd(C, pup);
-
+
return OPERATOR_CANCELLED;
}
-
+
+static EnumPropertyItem *select_orientation_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ *free= 1;
+ return BIF_enumTransformOrientation(C);
+}
+
void TFM_OT_select_orientation(struct wmOperatorType *ot)
{
- static EnumPropertyItem orientation_items[]= {
- {V3D_MANIP_GLOBAL, "GLOBAL", 0, "Global", ""},
- {V3D_MANIP_NORMAL, "NORMAL", 0, "Normal", ""},
- {V3D_MANIP_LOCAL, "LOCAL", 0, "Local", ""},
- {V3D_MANIP_VIEW, "VIEW", 0, "View", ""},
- {V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", ""},
- {0, NULL, 0, NULL, NULL}};
+ PropertyRNA *prop;
/* identifiers */
ot->name = "Select Orientation";
+ ot->description= "Select orientation type.";
ot->idname = "TFM_OT_select_orientation";
/* api callbacks */
@@ -149,8 +160,8 @@ void TFM_OT_select_orientation(struct wmOperatorType *ot)
ot->exec = select_orientation_exec;
ot->poll = ED_operator_areaactive;
- RNA_def_enum(ot->srna, "orientation", orientation_items, V3D_MANIP_CUSTOM, "Orientation", "DOC_BROKEN");
- RNA_def_int(ot->srna, "custom_index", 0, 0, INT_MAX, "Custom Index", "", 0, INT_MAX);
+ prop= RNA_def_enum(ot->srna, "orientation", orientation_items, V3D_MANIP_GLOBAL, "Orientation", "DOC_BROKEN");
+ RNA_def_enum_funcs(prop, select_orientation_itemf);
}
static void transformops_exit(bContext *C, wmOperator *op)
@@ -158,6 +169,7 @@ static void transformops_exit(bContext *C, wmOperator *op)
saveTransform(C, op->customdata, op);
MEM_freeN(op->customdata);
op->customdata = NULL;
+ G.moving = 0;
}
static int transformops_data(bContext *C, wmOperator *op, wmEvent *event)
@@ -183,27 +195,28 @@ static int transformops_data(bContext *C, wmOperator *op, wmEvent *event)
}
retval = initTransform(C, t, op, event, mode);
-
+ G.moving = 1;
+
/* store data */
op->customdata = t;
}
-
+
return retval; /* return 0 on error */
}
static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
{
int exit_code;
-
+
TransInfo *t = op->customdata;
-
+
transformEvent(t, event);
-
+
transformApply(C, t);
-
-
+
+
exit_code = transformEnd(C, t);
-
+
if (exit_code != OPERATOR_RUNNING_MODAL)
{
transformops_exit(C, op);
@@ -215,11 +228,11 @@ static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
static int transform_cancel(bContext *C, wmOperator *op)
{
TransInfo *t = op->customdata;
-
+
t->state = TRANS_CANCEL;
transformEnd(C, t);
transformops_exit(C, op);
-
+
return OPERATOR_CANCELLED;
}
@@ -237,11 +250,11 @@ static int transform_exec(bContext *C, wmOperator *op)
t->options |= CTX_AUTOCONFIRM;
transformApply(C, t);
-
+
transformEnd(C, t);
transformops_exit(C, op);
-
+
return OPERATOR_FINISHED;
}
@@ -259,7 +272,7 @@ static int transform_invoke(bContext *C, wmOperator *op, wmEvent *event)
TransInfo *t = op->customdata;
/* add temp handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
t->flag |= T_MODAL; // XXX meh maybe somewhere else
@@ -279,7 +292,7 @@ void Properties_Snapping(struct wmOperatorType *ot, short align)
RNA_def_boolean(ot->srna, "snap", 0, "Snap to Point", "");
RNA_def_enum(ot->srna, "snap_mode", snap_mode_types, 0, "Mode", "");
RNA_def_float_vector(ot->srna, "snap_point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "", -FLT_MAX, FLT_MAX);
-
+
if (align)
{
RNA_def_boolean(ot->srna, "snap_align", 0, "Align with Point Normal", "");
@@ -289,16 +302,20 @@ void Properties_Snapping(struct wmOperatorType *ot, short align)
void Properties_Constraints(struct wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
- RNA_def_int(ot->srna, "constraint_orientation", 0, 0, INT_MAX, "Constraint Orientation", "", 0, INT_MAX);
+ prop= RNA_def_enum(ot->srna, "constraint_orientation", orientation_items, V3D_MANIP_GLOBAL, "Orientation", "DOC_BROKEN");
+ RNA_def_enum_funcs(prop, select_orientation_itemf);
}
-void TFM_OT_translation(struct wmOperatorType *ot)
+void TFM_OT_translate(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Translation";
+ ot->name = "Translate";
+ ot->description= "Translate selected items.";
ot->idname = OP_TRANSLATION;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -314,7 +331,7 @@ void TFM_OT_translation(struct wmOperatorType *ot)
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
Properties_Constraints(ot);
-
+
Properties_Snapping(ot, 1);
}
@@ -322,8 +339,9 @@ void TFM_OT_resize(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Resize";
+ ot->description= "Resize selected items.";
ot->idname = OP_RESIZE;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -339,16 +357,40 @@ void TFM_OT_resize(struct wmOperatorType *ot)
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
Properties_Constraints(ot);
-
+
Properties_Snapping(ot, 0);
}
-void TFM_OT_rotation(struct wmOperatorType *ot)
+
+void TFM_OT_trackball(struct wmOperatorType *ot)
{
/* identifiers */
- ot->name = "Rotation";
+ ot->name = "Trackball";
+ ot->description= "Trackball style rotation of selected items.";
+ ot->idname = OP_TRACKBALL;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* api callbacks */
+ ot->invoke = transform_invoke;
+ ot->exec = transform_exec;
+ ot->modal = transform_modal;
+ ot->cancel = transform_cancel;
+ ot->poll = ED_operator_areaactive;
+
+ RNA_def_float_vector(ot->srna, "value", 2, VecOne, -FLT_MAX, FLT_MAX, "angle", "", -FLT_MAX, FLT_MAX);
+
+ Properties_Proportional(ot);
+
+ RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
+}
+
+void TFM_OT_rotate(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Rotate";
+ ot->description= "Rotate selected items.";
ot->idname = OP_ROTATION;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -364,7 +406,7 @@ void TFM_OT_rotation(struct wmOperatorType *ot)
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
Properties_Constraints(ot);
-
+
Properties_Snapping(ot, 0);
}
@@ -372,8 +414,12 @@ void TFM_OT_tilt(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Tilt";
+ /*optionals -
+ "Tilt selected vertices."
+ "Specify an extra axis rotation for selected vertices of 3d curve." */
+ ot->description= "Tilt selected control vertices of 3d curve.";
ot->idname = OP_TILT;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -395,8 +441,9 @@ void TFM_OT_warp(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Warp";
+ ot->description= "Warp selected items around the cursor.";
ot->idname = OP_WARP;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -419,8 +466,9 @@ void TFM_OT_shear(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Shear";
+ ot->description= "Shear selected items along the horizontal screen axis.";
ot->idname = OP_SHEAR;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -443,8 +491,9 @@ void TFM_OT_shrink_fatten(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Shrink/Fatten";
+ ot->description= "Shrink/fatten selected vertices along normals.";
ot->idname = OP_SHRINK_FATTEN;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -464,8 +513,10 @@ void TFM_OT_tosphere(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "To Sphere";
+ //added "around mesh center" to differentiate between "MESH_OT_vertices_to_sphere()"
+ ot->description= "Move selected vertices outward in a spherical shape around mesh center.";
ot->idname = OP_TOSPHERE;
- ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -474,13 +525,52 @@ void TFM_OT_tosphere(struct wmOperatorType *ot)
ot->cancel = transform_cancel;
ot->poll = ED_operator_areaactive;
- RNA_def_float_percentage(ot->srna, "value", 0, 0, 1, "Percentage", "", 0, 1);
+ RNA_def_float_factor(ot->srna, "value", 0, 0, 1, "Factor", "", 0, 1);
Properties_Proportional(ot);
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
}
+void TFM_OT_mirror(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Mirror";
+ ot->description= "Mirror selected vertices around one or more axes.";
+ ot->idname = OP_MIRROR;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* api callbacks */
+ ot->invoke = transform_invoke;
+ ot->exec = transform_exec;
+ ot->modal = transform_modal;
+ ot->cancel = transform_cancel;
+ ot->poll = ED_operator_areaactive;
+
+ Properties_Proportional(ot);
+ Properties_Constraints(ot);
+}
+
+void TFM_OT_edge_slide(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Tilt";
+ ot->description= "Tilt selected control vertices of 3d curve.";
+ ot->idname = OP_EDGE_SLIDE;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
+
+ /* api callbacks */
+ ot->invoke = transform_invoke;
+ ot->exec = transform_exec;
+ ot->modal = transform_modal;
+ ot->cancel = transform_cancel;
+ ot->poll = ED_operator_editmesh;
+
+ RNA_def_float_factor(ot->srna, "value", 0, 0, 1, "Factor", "", 0, 1);
+
+ RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
+}
+
void TFM_OT_transform(struct wmOperatorType *ot)
{
static EnumPropertyItem transform_mode_types[] = {
@@ -510,13 +600,15 @@ void TFM_OT_transform(struct wmOperatorType *ot)
{TFM_BEVEL, "BEVEL", 0, "Bevel", ""},
{TFM_BWEIGHT, "BWEIGHT", 0, "Bweight", ""},
{TFM_ALIGN, "ALIGN", 0, "Align", ""},
+ {TFM_EDGE_SLIDE, "EDGESLIDE", 0, "Edge Slide", ""},
{0, NULL, 0, NULL, NULL}
};
/* identifiers */
ot->name = "Transform";
+ ot->description= "Transform selected items by mode type.";
ot->idname = "TFM_OT_transform";
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* api callbacks */
ot->invoke = transform_invoke;
@@ -532,45 +624,51 @@ void TFM_OT_transform(struct wmOperatorType *ot)
Properties_Proportional(ot);
RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
- RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
- RNA_def_int(ot->srna, "constraint_orientation", 0, 0, INT_MAX, "Constraint Orientation", "", 0, INT_MAX);
+ Properties_Constraints(ot);
}
void transform_operatortypes(void)
{
WM_operatortype_append(TFM_OT_transform);
- WM_operatortype_append(TFM_OT_translation);
- WM_operatortype_append(TFM_OT_rotation);
+ WM_operatortype_append(TFM_OT_translate);
+ WM_operatortype_append(TFM_OT_rotate);
WM_operatortype_append(TFM_OT_tosphere);
WM_operatortype_append(TFM_OT_resize);
WM_operatortype_append(TFM_OT_shear);
WM_operatortype_append(TFM_OT_warp);
WM_operatortype_append(TFM_OT_shrink_fatten);
WM_operatortype_append(TFM_OT_tilt);
+ WM_operatortype_append(TFM_OT_trackball);
+ WM_operatortype_append(TFM_OT_mirror);
+ WM_operatortype_append(TFM_OT_edge_slide);
WM_operatortype_append(TFM_OT_select_orientation);
}
-
-void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *keymap, int spaceid)
+
+void transform_keymap_for_space(struct wmWindowManager *wm, struct wmKeyMap *keymap, int spaceid)
{
wmKeymapItem *km;
+
+ /* transform.c, only adds modal map once, checks if it's there */
+ transform_modal_keymap(wm);
+
switch(spaceid)
{
case SPACE_VIEW3D:
- km = WM_keymap_add_item(keymap, "TFM_OT_translation", GKEY, KM_PRESS, 0, 0);
-
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_S, KM_ANY, 0, 0);
-
- km = WM_keymap_add_item(keymap, "TFM_OT_rotation", RKEY, KM_PRESS, 0, 0);
+ km = WM_keymap_add_item(keymap, "TFM_OT_translate", GKEY, KM_PRESS, 0, 0);
+
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
+
+ km = WM_keymap_add_item(keymap, "TFM_OT_rotate", RKEY, KM_PRESS, 0, 0);
km = WM_keymap_add_item(keymap, "TFM_OT_resize", SKEY, KM_PRESS, 0, 0);
km = WM_keymap_add_item(keymap, "TFM_OT_warp", WKEY, KM_PRESS, KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, "TFM_OT_tosphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
-
+ km = WM_keymap_add_item(keymap, "TFM_OT_tosphere", SKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0);
+
km = WM_keymap_add_item(keymap, "TFM_OT_shear", SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
-
+
km = WM_keymap_add_item(keymap, "TFM_OT_shrink_fatten", SKEY, KM_PRESS, KM_ALT, 0);
km = WM_keymap_add_item(keymap, "TFM_OT_tilt", TKEY, KM_PRESS, 0, 0);
@@ -581,61 +679,73 @@ void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *key
case SPACE_ACTION:
km= WM_keymap_add_item(keymap, "TFM_OT_transform", GKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
-
+
km= WM_keymap_add_item(keymap, "TFM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
-
+
km= WM_keymap_add_item(keymap, "TFM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
-
+
km= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
-
+
km= WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
break;
case SPACE_IPO:
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", GKEY, KM_PRESS, 0, 0);
-
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_S, KM_ANY, 0, 0);
-
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", GKEY, KM_PRESS, 0, 0);
+
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
+
// XXX the 'mode' identifier here is not quite right
km= WM_keymap_add_item(keymap, "TFM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
-
- km = WM_keymap_add_item(keymap, "TFM_OT_rotation", RKEY, KM_PRESS, 0, 0);
-
+
+ km = WM_keymap_add_item(keymap, "TFM_OT_rotate", RKEY, KM_PRESS, 0, 0);
+
km = WM_keymap_add_item(keymap, "TFM_OT_resize", SKEY, KM_PRESS, 0, 0);
break;
- case SPACE_NODE:
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", GKEY, KM_PRESS, 0, 0);
+ case SPACE_NLA:
+ km= WM_keymap_add_item(keymap, "TFM_OT_transform", GKEY, KM_PRESS, 0, 0);
+ RNA_int_set(km->ptr, "mode", TFM_TRANSLATION);
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_A, KM_ANY, 0, 0);
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_S, KM_ANY, 0, 0);
+ km= WM_keymap_add_item(keymap, "TFM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
+ RNA_int_set(km->ptr, "mode", TFM_TRANSLATION);
- km = WM_keymap_add_item(keymap, "TFM_OT_rotation", RKEY, KM_PRESS, 0, 0);
+ km= WM_keymap_add_item(keymap, "TFM_OT_transform", EKEY, KM_PRESS, 0, 0);
+ RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+ km= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, 0, 0);
+ RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
+ break;
+ case SPACE_NODE:
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", GKEY, KM_PRESS, 0, 0);
+
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_A, KM_ANY, 0, 0);
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
+
+ km = WM_keymap_add_item(keymap, "TFM_OT_rotate", RKEY, KM_PRESS, 0, 0);
+
km = WM_keymap_add_item(keymap, "TFM_OT_resize", SKEY, KM_PRESS, 0, 0);
break;
case SPACE_SEQ:
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", GKEY, KM_PRESS, 0, 0);
-
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_S, KM_ANY, 0, 0);
-
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", GKEY, KM_PRESS, 0, 0);
+
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
+
km= WM_keymap_add_item(keymap, "TFM_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, "TFM_OT_translation", GKEY, KM_PRESS, 0, 0);
-
- km= WM_keymap_add_item(keymap, "TFM_OT_translation", EVT_TWEAK_S, KM_ANY, 0, 0);
-
- km = WM_keymap_add_item(keymap, "TFM_OT_rotation", RKEY, KM_PRESS, 0, 0);
+ km = WM_keymap_add_item(keymap, "TFM_OT_translate", GKEY, KM_PRESS, 0, 0);
+
+ km= WM_keymap_add_item(keymap, "TFM_OT_translate", EVT_TWEAK_S, KM_ANY, 0, 0);
+
+ km = WM_keymap_add_item(keymap, "TFM_OT_rotate", RKEY, KM_PRESS, 0, 0);
km = WM_keymap_add_item(keymap, "TFM_OT_resize", SKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, "TFM_OT_transform", MKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_MIRROR);
+ km = WM_keymap_add_item(keymap, "TFM_OT_mirror", MKEY, KM_PRESS, 0, 0);
break;
default:
break;
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index d3e4e2b1421..d82be842596 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -59,6 +59,8 @@
#include "UI_interface.h"
+#include "RNA_define.h"
+
#include "transform.h"
/* *********************** TransSpace ************************** */
@@ -85,7 +87,7 @@ void BIF_manageTransformOrientation(bContext *C, int confirm, int set) {
else if (obedit->type == OB_ARMATURE)
index = manageBoneSpace(C, confirm, set);
}
- else if (ob && (ob->flag & OB_POSEMODE)) {
+ else if (ob && (ob->mode & OB_MODE_POSE)) {
index = manageBoneSpace(C, confirm, set);
}
else {
@@ -351,22 +353,51 @@ void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
void BIF_selectTransformOrientationValue(bContext *C, int orientation) {
View3D *v3d = CTX_wm_view3d(C);
- v3d->twmode = orientation;
+ if(v3d) /* currently using generic poll */
+ v3d->twmode = orientation;
}
-void BIF_menuTransformOrientation(bContext *C, uiLayout *layout, void *arg)
+EnumPropertyItem *BIF_enumTransformOrientation(bContext *C)
{
- ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
- TransformOrientation *ts;
- int i= V3D_MANIP_CUSTOM;
+ Scene *scene;
+ ListBase *transform_spaces;
+ TransformOrientation *ts= NULL;
+
+ EnumPropertyItem global = {V3D_MANIP_GLOBAL, "GLOBAL", 0, "Global", ""};
+ EnumPropertyItem normal = {V3D_MANIP_NORMAL, "NORMAL", 0, "Normal", ""};
+ EnumPropertyItem local = {V3D_MANIP_LOCAL, "LOCAL", 0, "Local", ""};
+ EnumPropertyItem view = {V3D_MANIP_VIEW, "VIEW", 0, "View", ""};
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ EnumPropertyItem *item= NULL;
+ int i = V3D_MANIP_CUSTOM, totitem= 0;
+
+ RNA_enum_item_add(&item, &totitem, &global);
+ RNA_enum_item_add(&item, &totitem, &normal);
+ RNA_enum_item_add(&item, &totitem, &local);
+ RNA_enum_item_add(&item, &totitem, &view);
+
+ if(C) {
+ scene= CTX_data_scene(C);
+
+ if(scene) {
+ transform_spaces = &scene->transform_spaces;
+ ts = transform_spaces->first;
+ }
+ }
+
+ if(ts)
+ RNA_enum_item_add_separator(&item, &totitem);
+
+ for(; ts; ts = ts->next) {
+ tmp.identifier = "CUSTOM";
+ tmp.name= ts->name;
+ tmp.value = i++;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
- uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_GLOBAL);
- uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_LOCAL);
- uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_NORMAL);
- uiItemEnumO(layout, NULL, 0, "TFM_OT_select_orientation", "orientation", V3D_MANIP_VIEW);
+ RNA_enum_item_end(&item, &totitem);
- for(ts = transform_spaces->first; ts; ts = ts->next)
- uiItemIntO(layout, ts->name, 0, "TFM_OT_select_orientation", "custom_index", i++);
+ return item;
}
char * BIF_menustringTransformOrientation(const bContext *C, char *title) {
@@ -402,7 +433,7 @@ int BIF_countTransformOrientation(const bContext *C) {
return count;
}
-void applyTransformOrientation(bContext *C, TransInfo *t) {
+void applyTransformOrientation(const bContext *C, TransInfo *t) {
TransformOrientation *ts;
View3D *v3d = CTX_wm_view3d(C);
int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
@@ -457,7 +488,7 @@ void initTransformOrientation(bContext *C, TransInfo *t)
break;
case V3D_MANIP_NORMAL:
- if(obedit || ob->flag & OB_POSEMODE) {
+ if(obedit || ob->mode & OB_MODE_POSE) {
float mat[3][3];
int type;
@@ -532,7 +563,7 @@ void initTransformOrientation(bContext *C, TransInfo *t)
}
}
-int getTransformOrientation(bContext *C, float normal[3], float plane[3], int activeOnly)
+int getTransformOrientation(const bContext *C, float normal[3], float plane[3], int activeOnly)
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -714,7 +745,7 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
for (nu = cu->editnurb->first; nu; nu = nu->next)
{
/* only bezier has a normal */
- if((nu->type & 7) == CU_BEZIER)
+ if(nu->type == CU_BEZIER)
{
bezt= nu->bezt;
a= nu->pntsu;
@@ -834,7 +865,7 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
Mat3MulVecfl(mat, plane);
}
}
- else if(ob && (ob->flag & OB_POSEMODE))
+ else if(ob && (ob->mode & OB_MODE_POSE))
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -864,10 +895,7 @@ int getTransformOrientation(bContext *C, float normal[3], float plane[3], int ac
result = ORIENTATION_EDGE;
}
}
- else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE))
- {
- }
- else if(G.f & G_PARTICLEEDIT)
+ 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 {
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 0b9a176dbdf..9438581409b 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -63,8 +63,6 @@
//#include "BIF_drawimage.h"
//#include "BIF_editmesh.h"
-#include "BIF_transform.h"
-
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
@@ -75,6 +73,7 @@
#include "ED_armature.h"
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_transform.h"
#include "ED_uvedit.h"
#include "ED_view3d.h"
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 8484ad78bc4..2d73a9f1d25 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -267,7 +267,7 @@ void undo_editmode_step(bContext *C, int step)
}
}
-// DAG_object_flush_update(G.scene, obedit, OB_RECALC_DATA);
+// DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
/* XXX notifiers */
}
@@ -297,6 +297,21 @@ static void undo_number(bContext *C, int nr)
undo_editmode_step(C, 0);
}
+void undo_editmode_name(bContext *C, const char *undoname)
+{
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev) {
+ if(strcmp(undoname, uel->name)==0)
+ break;
+ }
+ if(uel && uel->prev) {
+ curundo= uel->prev;
+ undo_editmode_step(C, 0);
+ }
+}
+
+
/* ************** for interaction with menu/pullown */
void undo_editmode_menu(bContext *C)
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 1d79c542fa9..d26f7a7a484 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -58,6 +58,7 @@
#include "ED_armature.h"
#include "ED_particle.h"
#include "ED_curve.h"
+#include "ED_mball.h"
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
@@ -71,18 +72,16 @@
#include "UI_interface.h"
#include "UI_resources.h"
-/* ***************** generic undo system ********************* */
+#include "util_intern.h"
-/* ********* XXX **************** */
-static void undo_push_mball() {}
-static void sound_initialize_sounds() {}
-/* ********* XXX **************** */
+/* ***************** generic undo system ********************* */
void ED_undo_push(bContext *C, char *str)
{
wmWindowManager *wm= CTX_wm_manager(C);
Object *obedit= CTX_data_edit_object(C);
-
+ Object *obact= CTX_data_active_object(C);
+
if(obedit) {
if (U.undosteps == 0) return;
@@ -93,13 +92,13 @@ void ED_undo_push(bContext *C, char *str)
else if (obedit->type==OB_FONT)
undo_push_font(C, str);
else if (obedit->type==OB_MBALL)
- undo_push_mball(str);
+ undo_push_mball(C, str);
else if (obedit->type==OB_LATTICE)
undo_push_lattice(C, str);
else if (obedit->type==OB_ARMATURE)
undo_push_armature(C, str);
}
- else if(G.f & G_PARTICLEEDIT) {
+ else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
if (U.undosteps == 0) return;
PE_undo_push(CTX_data_scene(C), str);
@@ -115,37 +114,40 @@ void ED_undo_push(bContext *C, char *str)
}
}
-void ED_undo_push_op(bContext *C, wmOperator *op)
-{
- /* in future, get undo string info? */
- ED_undo_push(C, op->type->name);
-}
-
-static int ed_undo_step(bContext *C, int step)
+static int ed_undo_step(bContext *C, int step, 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) {
+ undo_imagepaint_step(step);
+
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+ return OPERATOR_FINISHED;
+ }
+ }
+
if(sa && sa->spacetype==SPACE_TEXT) {
ED_text_undo_step(C, step);
}
else if(obedit) {
- if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
- undo_editmode_step(C, step);
+ if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
+ if(undoname)
+ undo_editmode_name(C, undoname);
+ else
+ undo_editmode_step(C, step);
+ }
}
else {
int do_glob_undo= 0;
- if(G.f & G_TEXTUREPAINT)
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
undo_imagepaint_step(step);
- else if(sa && sa->spacetype==SPACE_IMAGE) {
- SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
- if(sima->flag & SI_DRAWTOOL)
- undo_imagepaint_step(step);
- else
- do_glob_undo= 1;
- }
- else if(G.f & G_PARTICLEEDIT) {
+ else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
if(step==1)
PE_undo(CTX_data_scene(C));
else
@@ -160,8 +162,10 @@ static int ed_undo_step(bContext *C, int step)
#ifndef DISABLE_PYTHON
// XXX BPY_scripts_clear_pyobjects();
#endif
- BKE_undo_step(C, step);
- sound_initialize_sounds();
+ if(undoname)
+ BKE_undo_name(C, undoname);
+ else
+ BKE_undo_step(C, step);
}
}
@@ -174,34 +178,48 @@ static int ed_undo_step(bContext *C, int step)
void ED_undo_pop(bContext *C)
{
- ed_undo_step(C, 1);
+ ed_undo_step(C, 1, NULL);
}
void ED_undo_redo(bContext *C)
{
- ed_undo_step(C, -1);
+ ed_undo_step(C, -1, NULL);
+}
+
+void ED_undo_push_op(bContext *C, wmOperator *op)
+{
+ /* in future, get undo string info? */
+ ED_undo_push(C, op->type->name);
+}
+
+void ED_undo_pop_op(bContext *C, wmOperator *op)
+{
+ /* search back a couple of undo's, in case something else added pushes */
+ ed_undo_step(C, 0, op->type->name);
}
static int ed_undo_exec(bContext *C, wmOperator *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);
+ return ed_undo_step(C, 1, NULL);
}
+
static int ed_redo_exec(bContext *C, wmOperator *op)
{
- return ed_undo_step(C, -1);
+ return ed_undo_step(C, -1, NULL);
}
void ED_undo_menu(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
+ Object *obact= CTX_data_active_object(C);
if(obedit) {
//if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE)
// undo_editmode_menu();
}
else {
- if(G.f & G_PARTICLEEDIT)
+ if(obact && obact->mode & OB_MODE_PARTICLE_EDIT)
PE_undo_menu(CTX_data_scene(C), CTX_data_active_object(C));
else if(U.uiflag & USER_GLOBALUNDO) {
char *menu= BKE_undo_menu_string();
@@ -210,7 +228,6 @@ void ED_undo_menu(bContext *C)
MEM_freeN(menu);
if(event>0) {
BKE_undo_number(C, event);
- sound_initialize_sounds();
}
}
}
@@ -223,6 +240,7 @@ void ED_OT_undo(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Undo";
+ ot->description= "Undo previous action.";
ot->idname= "ED_OT_undo";
/* api callbacks */
@@ -234,6 +252,7 @@ void ED_OT_redo(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Redo";
+ ot->description= "Redo previous action.";
ot->idname= "ED_OT_redo";
/* api callbacks */
diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h
index 37e6c5c25e1..8a0787dde3f 100644
--- a/source/blender/editors/util/util_intern.h
+++ b/source/blender/editors/util/util_intern.h
@@ -33,6 +33,7 @@
/* editmode_undo.c */
void undo_editmode_clear(void);
+void undo_editmode_name(bContext *C, const char *undoname);
#endif /* ED_UTIL_INTERN_H */
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index b811906f5e5..fbd12007c16 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -121,7 +121,7 @@ static void draw_uvs_shadow(SpaceImage *sima, Object *obedit)
{
EditMesh *em;
EditFace *efa;
- TFace *tf;
+ MTFace *tf;
em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
@@ -251,17 +251,17 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, EditMesh *em, MTFac
if(efa->v4) {
#if 0 /* Simple but slow, better reuse normalized vectors */
- uvang1 = VecAngle3_2D(tf_uv[3], tf_uv[0], tf_uv[1]);
- ang1 = VecAngle3(efa->v4->co, efa->v1->co, efa->v2->co);
+ uvang1 = RAD2DEG(Vec2Angle3(tf_uv[3], tf_uv[0], tf_uv[1]));
+ ang1 = RAD2DEG(VecAngle3(efa->v4->co, efa->v1->co, efa->v2->co));
- uvang2 = VecAngle3_2D(tf_uv[0], tf_uv[1], tf_uv[2]);
- ang2 = VecAngle3(efa->v1->co, efa->v2->co, efa->v3->co);
+ uvang2 = RAD2DEG(Vec2Angle3(tf_uv[0], tf_uv[1], tf_uv[2]));
+ ang2 = RAD2DEG(VecAngle3(efa->v1->co, efa->v2->co, efa->v3->co));
- uvang3 = VecAngle3_2D(tf_uv[1], tf_uv[2], tf_uv[3]);
- ang3 = VecAngle3(efa->v2->co, efa->v3->co, efa->v4->co);
+ uvang3 = RAD2DEG(Vec2Angle3(tf_uv[1], tf_uv[2], tf_uv[3]));
+ ang3 = RAD2DEG(VecAngle3(efa->v2->co, efa->v3->co, efa->v4->co));
- uvang4 = VecAngle3_2D(tf_uv[2], tf_uv[3], tf_uv[0]);
- ang4 = VecAngle3(efa->v3->co, efa->v4->co, efa->v1->co);
+ uvang4 = RAD2DEG(Vec2Angle3(tf_uv[2], tf_uv[3], tf_uv[0]));
+ ang4 = RAD2DEG(VecAngle3(efa->v3->co, efa->v4->co, efa->v1->co));
#endif
/* uv angles */
@@ -315,14 +315,14 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, EditMesh *em, MTFac
}
else {
#if 0 /* Simple but slow, better reuse normalized vectors */
- uvang1 = VecAngle3_2D(tf_uv[2], tf_uv[0], tf_uv[1]);
- ang1 = VecAngle3(efa->v3->co, efa->v1->co, efa->v2->co);
+ uvang1 = RAD2DEG(Vec2Angle3(tf_uv[2], tf_uv[0], tf_uv[1]));
+ ang1 = RAD2DEG(VecAngle3(efa->v3->co, efa->v1->co, efa->v2->co));
- uvang2 = VecAngle3_2D(tf_uv[0], tf_uv[1], tf_uv[2]);
- ang2 = VecAngle3(efa->v1->co, efa->v2->co, efa->v3->co);
+ uvang2 = RAD2DEG(Vec2Angle3(tf_uv[0], tf_uv[1], tf_uv[2]));
+ ang2 = RAD2DEG(VecAngle3(efa->v1->co, efa->v2->co, efa->v3->co));
- uvang3 = 180-(uvang1+uvang2);
- ang3 = 180-(ang1+ang2);
+ uvang3 = M_PI-(uvang1+uvang2);
+ ang3 = M_PI-(ang1+ang2);
#endif
/* uv angles */
@@ -591,7 +591,8 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
break;
case SI_UVDT_BLACK: /* black/white */
case SI_UVDT_WHITE:
- cpack((sima->dt_uv==SI_UVDT_WHITE) ? 0xFFFFFF : 0x0);
+ if(sima->dt_uv==SI_UVDT_WHITE) glColor3f(1.0f, 1.0f, 1.0f);
+ else glColor3f(0.0f, 0.0f, 0.0f);
for(efa= em->faces.first; efa; efa= efa->next) {
tf= (MTFace *)efa->tmp.p; /* visible faces cached */
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 7582145c63b..9216cfb5cdc 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -54,11 +54,10 @@
#include "BKE_report.h"
#include "BKE_utildefines.h"
-#include "BIF_transform.h"
-
#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_transform.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -78,7 +77,7 @@ int ED_uvedit_test(Object *obedit)
EditMesh *em;
int ret;
- if(obedit->type != OB_MESH)
+ if(!obedit || obedit->type != OB_MESH)
return 0;
em = BKE_mesh_get_editmesh(obedit->data);
@@ -140,7 +139,7 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre
/* and update depdency graph */
if(update)
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
BKE_mesh_end_editmesh(obedit->data, em);
}
@@ -170,8 +169,8 @@ void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, i
tf->tile= curtile; /* set tile index */
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
}
@@ -181,7 +180,13 @@ static void uvedit_pixel_to_float(SpaceImage *sima, float *dist, float pixeldist
{
int width, height;
- ED_space_image_size(sima, &width, &height);
+ if(sima) {
+ ED_space_image_size(sima, &width, &height);
+ }
+ else {
+ width= 256;
+ height= 256;
+ }
dist[0]= pixeldist/width;
dist[1]= pixeldist/height;
@@ -943,50 +948,6 @@ static void select_linked(Scene *scene, Image *ima, EditMesh *em, float limit[2]
EM_free_uv_vert_map(vmap);
}
-/* ******************** mirror operator **************** */
-
-static int mirror_exec(bContext *C, wmOperator *op)
-{
- float mat[3][3];
- int axis;
-
- Mat3One(mat);
- axis= RNA_enum_get(op->ptr, "axis");
-
- if(axis == 'x') {
- /* XXX initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setSingleAxisConstraint(mat[0], " on X axis");
- Transform(); */
- }
- else {
- /* XXX initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
- BIF_setSingleAxisConstraint(mat[1], " on Y axis");
- Transform(); */
- }
-
- return OPERATOR_FINISHED;
-}
-
-void UV_OT_mirror(wmOperatorType *ot)
-{
- static EnumPropertyItem axis_items[] = {
- {'x', "MIRROR_X", 0, "Mirror X", "Mirror UVs over X axis."},
- {'y', "MIRROR_Y", 0, "Mirror Y", "Mirror UVs over Y axis."},
- {0, NULL, 0, NULL, NULL}};
-
- /* identifiers */
- ot->name= "Mirror";
- ot->idname= "UV_OT_mirror";
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* api callbacks */
- ot->exec= mirror_exec;
- ot->poll= ED_operator_uvedit;
-
- /* properties */
- RNA_def_enum(ot->srna, "axis", axis_items, 'x', "Axis", "Axis to mirror UV locations over.");
-}
-
/* ******************** align operator **************** */
static void weld_align_uv(bContext *C, int tool)
@@ -1059,8 +1020,8 @@ static void weld_align_uv(bContext *C, int tool)
}
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
}
@@ -1133,7 +1094,7 @@ static int stitch_exec(bContext *C, wmOperator *op)
Image *ima;
MTFace *tf;
- sima= (SpaceImage*)CTX_wm_space_data(C);
+ 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);
@@ -1142,11 +1103,11 @@ static int stitch_exec(bContext *C, wmOperator *op)
if(RNA_boolean_get(op->ptr, "use_limit")) {
UvVertMap *vmap;
UvMapVert *vlist, *iterv;
- float newuv[2], limit[2], pixels;
+ float newuv[2], limit[2];
int a, vtot;
- pixels= RNA_float_get(op->ptr, "limit");
- uvedit_pixel_to_float(sima, limit, pixels);
+ limit[0]= RNA_float_get(op->ptr, "limit");
+ limit[1]= limit[0];
EM_init_index_arrays(em, 0, 0, 1);
vmap= EM_make_uv_vert_map(em, 1, 0, limit);
@@ -1280,8 +1241,8 @@ static int stitch_exec(bContext *C, wmOperator *op)
MEM_freeN(uv_average);
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1300,7 +1261,7 @@ void UV_OT_stitch(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "use_limit", 1, "Use Limit", "Stitch UVs within a specified limit distance.");
- RNA_def_float(ot->srna, "limit", 20.0, 0.0f, FLT_MAX, "Limit", "Limit distance in image pixels.", -FLT_MAX, FLT_MAX);
+ RNA_def_float(ot->srna, "limit", 0.01f, 0.0f, FLT_MAX, "Limit", "Limit distance in normalized coordinates.", -FLT_MAX, FLT_MAX);
}
/* ******************** (de)select all operator **************** */
@@ -1337,17 +1298,17 @@ static int select_inverse_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
-void UV_OT_select_invert(wmOperatorType *ot)
+void UV_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select Invert";
- ot->idname= "UV_OT_select_invert";
+ ot->name= "Select Inverse";
+ ot->idname= "UV_OT_select_inverse";
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* api callbacks */
@@ -1407,7 +1368,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1452,7 +1413,7 @@ static int sticky_select(float *limit, int hitv[4], int v, float *hituv[4], floa
static int mouse_select(bContext *C, float co[2], int extend, int loop)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
@@ -1484,7 +1445,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
else {
sync= 0;
selectmode= ts->uv_selectmode;
- sticky= sima->sticky;
+ sticky= (sima)? sima->sticky: 1;
}
/* find nearest element */
@@ -1711,8 +1672,8 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
}
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_PASS_THROUGH|OPERATOR_FINISHED;
@@ -1816,7 +1777,7 @@ void UV_OT_select_loop(wmOperatorType *ot)
static int select_linked_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
@@ -1835,8 +1796,8 @@ static int select_linked_exec(bContext *C, wmOperator *op)
uvedit_pixel_to_float(sima, limit, 0.05f);
select_linked(scene, ima, em, limit, NULL, extend);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1891,8 +1852,8 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2051,7 +2012,7 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
static int border_select_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
@@ -2168,7 +2129,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2224,7 +2185,7 @@ static void select_uv_inside_ellipse(SpaceImage *sima, Scene *scene, int select,
int circle_select_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
@@ -2263,7 +2224,7 @@ int circle_select_exec(bContext *C, wmOperator *op)
if(select) EM_select_flush(em);
else EM_deselect_flush(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2314,7 +2275,7 @@ static int snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, Vi
static int snap_cursor_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima= CTX_data_edit_image(C);
@@ -2516,13 +2477,18 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe
static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit)
{
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
- Image *ima= sima->image;
+ Image *ima;
EditFace *efa;
MTFace *tface;
int width= 0, height= 0;
float w, h;
short change = 0;
+ if(!sima)
+ return 0;
+
+ ima= sima->image;
+
ED_space_image_size(sima, &width, &height);
w = (float)width;
h = (float)height;
@@ -2546,7 +2512,7 @@ static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit)
static int snap_selection_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima= CTX_data_edit_image(C);
@@ -2568,8 +2534,8 @@ static int snap_selection_exec(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
@@ -2628,7 +2594,7 @@ static int pin_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2673,7 +2639,7 @@ static int select_pinned_exec(bContext *C, wmOperator *op)
}
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2695,17 +2661,18 @@ void UV_OT_select_pinned(wmOperatorType *ot)
static int hide_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
EditFace *efa;
MTFace *tf;
int swap= RNA_boolean_get(op->ptr, "unselected");
+ int facemode= sima ? sima->flag & SI_SELACTFACE : 0;
if(ts->uv_flag & UV_SYNC_SELECTION) {
EM_hide_mesh(em, swap);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2715,7 +2682,7 @@ static int hide_exec(bContext *C, wmOperator *op)
for(efa= em->faces.first; efa; efa= efa->next) {
if(efa->f & SELECT) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if(sima->flag & SI_SELACTFACE) {
+ if(facemode) {
/* Pretend face mode */
if(( (efa->v4==NULL &&
( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) ||
@@ -2760,7 +2727,7 @@ static int hide_exec(bContext *C, wmOperator *op)
if(efa->f & SELECT) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if(sima->flag & SI_SELACTFACE) {
+ if(facemode) {
if( (efa->v4==NULL &&
( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) == (TF_SEL1|TF_SEL2|TF_SEL3) ) ||
( tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) == (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4) ) {
@@ -2813,7 +2780,7 @@ static int hide_exec(bContext *C, wmOperator *op)
}
EM_validate_selections(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -2838,23 +2805,25 @@ void UV_OT_hide(wmOperatorType *ot)
static int reveal_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *ts= CTX_data_tool_settings(C);
Object *obedit= CTX_data_edit_object(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
EditFace *efa;
MTFace *tf;
+ int facemode= sima ? sima->flag & SI_SELACTFACE : 0;
+ int stickymode= sima ? (sima->sticky != SI_STICKY_DISABLE) : 1;
/* call the mesh function if we are in mesh sync sel */
if(ts->uv_flag & UV_SYNC_SELECTION) {
EM_reveal_mesh(em);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
}
- if(sima->flag & SI_SELACTFACE) {
+ if(facemode) {
if(em->selectmode == SCE_SELECT_FACE) {
for(efa= em->faces.first; efa; efa= efa->next) {
if(!(efa->h) && !(efa->f & SELECT)) {
@@ -2866,7 +2835,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
}
else {
/* enable adjacent faces to have disconnected UV selections if sticky is disabled */
- if(sima->sticky == SI_STICKY_DISABLE) {
+ if(!stickymode) {
for(efa= em->faces.first; efa; efa= efa->next) {
if(!(efa->h) && !(efa->f & SELECT)) {
/* All verts must be unselected for the face to be selected in the UV view */
@@ -2944,7 +2913,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
EM_select_face(efa, 1);
}
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -3030,7 +2999,7 @@ static int set_tile_exec(bContext *C, wmOperator *op)
static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+ SpaceImage *sima= CTX_wm_space_image(C);
Image *ima= CTX_data_edit_image(C);
ARegion *ar= CTX_wm_region(C);
float fx, fy;
@@ -3080,7 +3049,7 @@ void UV_OT_tile_set(wmOperatorType *ot)
void ED_operatortypes_uvedit(void)
{
WM_operatortype_append(UV_OT_select_all_toggle);
- WM_operatortype_append(UV_OT_select_invert);
+ WM_operatortype_append(UV_OT_select_inverse);
WM_operatortype_append(UV_OT_select);
WM_operatortype_append(UV_OT_select_loop);
WM_operatortype_append(UV_OT_select_linked);
@@ -3093,7 +3062,6 @@ void ED_operatortypes_uvedit(void)
WM_operatortype_append(UV_OT_snap_selection);
WM_operatortype_append(UV_OT_align);
- WM_operatortype_append(UV_OT_mirror);
WM_operatortype_append(UV_OT_stitch);
WM_operatortype_append(UV_OT_weld);
WM_operatortype_append(UV_OT_pin);
@@ -3118,7 +3086,10 @@ void ED_operatortypes_uvedit(void)
void ED_keymap_uvedit(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "UVEdit", 0, 0);
+ wmKeyMap *keymap;
+
+ keymap= WM_keymap_find(wm, "UVEdit", 0, 0);
+ keymap->poll= ED_operator_uvedit;
/* pick selection */
WM_keymap_add_item(keymap, "UV_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
@@ -3135,7 +3106,7 @@ void ED_keymap_uvedit(wmWindowManager *wm)
WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "UV_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "UV_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0);
/* uv operations */
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 95467d13e8d..c7258e616fa 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -44,6 +44,7 @@
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
@@ -75,6 +76,11 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
EditFace *efa;
MTFace *tf;
+ Image *ima;
+ bScreen *sc;
+ ScrArea *sa;
+ SpaceLink *slink;
+ SpaceImage *sima;
if(ED_uvedit_test(obedit)) {
BKE_mesh_end_editmesh(obedit->data, em);
@@ -88,10 +94,31 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
BKE_mesh_end_editmesh(obedit->data, em);
return 0;
}
+
+ ima= CTX_data_edit_image(C);
+
+ if(!ima) {
+ /* no image in context in the 3d view, we find first image window .. */
+ sc= CTX_wm_screen(C);
+
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ slink= sa->spacedata.first;
+ if(slink->spacetype == SPACE_IMAGE) {
+ sima= (SpaceImage*)slink;
+
+ ima= sima->image;
+ if(ima) {
+ if(ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE)
+ ima= NULL;
+ else
+ break;
+ }
+ }
+ }
+ }
- // XXX this image is not in context in 3d view .. only
- // way to get would be to find the first image window?
- ED_uvedit_assign_image(scene, obedit, CTX_data_edit_image(C), NULL);
+ if(ima)
+ ED_uvedit_assign_image(scene, obedit, ima, NULL);
/* select new UV's */
for(efa=em->faces.first; efa; efa=efa->next) {
@@ -263,8 +290,8 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, int interact
ms->lasttime = PIL_check_seconds_timer();
- DAG_object_flush_update(ms->scene, ms->obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ms->obedit);
+ DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
}
}
@@ -286,8 +313,8 @@ static void minimize_stretch_exit(bContext *C, wmOperator *op, int cancel)
param_stretch_end(ms->handle);
param_delete(ms->handle);
- DAG_object_flush_update(ms->scene, ms->obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ms->obedit);
+ DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
MEM_freeN(ms);
op->customdata= NULL;
@@ -315,7 +342,7 @@ static int minimize_stretch_invoke(bContext *C, wmOperator *op, wmEvent *event)
minimize_stretch_iteration(C, op, 1);
ms= op->customdata;
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
ms->timer= WM_event_add_window_timer(CTX_wm_window(C), TIMER, 0.01f);
return OPERATOR_RUNNING_MODAL;
@@ -385,6 +412,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
ot->name= "Minimize Stretch";
ot->idname= "UV_OT_minimize_stretch";
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->description="DOC_BROKEN";
/* api callbacks */
ot->exec= minimize_stretch_exec;
@@ -395,7 +423,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "fill_holes", 1, "Fill Holes", "Virtual fill holes in mesh before unwrapping, to better avoid overlaps and preserve symmetry.");
- RNA_def_float_percentage(ot->srna, "blend", 0.0f, 0.0f, 1.0f, "Blend", "Blend factor between stretch minimized and original.", 0.0f, 1.0f);
+ RNA_def_float_factor(ot->srna, "blend", 0.0f, 0.0f, 1.0f, "Blend", "Blend factor between stretch minimized and original.", 0.0f, 1.0f);
RNA_def_int(ot->srna, "iterations", 0, 0, INT_MAX, "Iterations", "Number of iterations to run, 0 is unlimited when run interactively.", 0, 100);
}
@@ -413,8 +441,8 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -446,8 +474,8 @@ static int average_islands_scale_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -810,8 +838,8 @@ static int unwrap_exec(bContext *C, wmOperator *op)
param_delete(handle);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -943,8 +971,8 @@ static int from_view_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1010,8 +1038,8 @@ static int reset_exec(bContext *C, wmOperator *op)
}
}
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1098,8 +1126,8 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1170,8 +1198,8 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1257,8 +1285,8 @@ static int cube_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit);
+ DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
return OPERATOR_FINISHED;
@@ -1337,7 +1365,7 @@ static int mapping_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
void UV_OT_mapping_menu(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mapping Menu";
+ ot->name= "UV Mapping";
ot->idname= "UV_OT_mapping_menu";
/* api callbacks */
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 4d376f47d91..279596e5ad7 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -27,8 +27,8 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../blenlib ../blenkernel ../makesdna ../include
- ../../../extern/glew/include ../../../intern/guardedalloc ../imbuf)
+ . ../blenlib ../blenkernel ../makesdna ../include
+ ../../../extern/glew/include ../../../intern/guardedalloc ../../../intern/smoke/extern ../imbuf)
BLENDERLIB(bf_gpu "${SRC}" "${INC}")
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index ce130951840..fabe1420e83 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -43,6 +43,7 @@ struct Object;
struct Scene;
struct View3D;
struct RegionView3D;
+struct SmokeModifierData;
/* OpenGL drawing functions related to shading. These are also
* shared with the game engine, where there were previously
@@ -63,8 +64,10 @@ void GPU_state_init(void);
* GPU_enable_material returns 0 if drawing should be skipped
* - after drawing, the material must be disabled again */
-void GPU_set_object_materials(struct View3D *v3d, struct RegionView3D *rv3d,
+void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d,
struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_pass);
+void GPU_end_object_materials(void);
+
int GPU_enable_material(int nr, void *attribs);
void GPU_disable_material(void);
@@ -76,7 +79,7 @@ int GPU_get_material_blend_mode(void);
* be drawn using one or the other
* - passing NULL clears the state again */
-int GPU_set_tpage(struct MTFace *tface);
+int GPU_set_tpage(struct MTFace *tface, int mipmap);
/* Lights
* - returns how many lights were enabled
@@ -103,13 +106,17 @@ void GPU_paint_set_mipmap(int mipmap);
/* Image updates and free
* - these deal with images bound as opengl textures */
-void GPU_paint_update_image(struct Image *ima, int x, int y, int w, int h);
+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, int tftile, int tfmode, int compare);
+int GPU_verify_image(struct Image *ima, int tftile, int tfmode, int compare, int mipmap);
void GPU_free_image(struct Image *ima);
void GPU_free_images(void);
+/* smoke drawing functions */
+void GPU_free_smoke(struct SmokeModifierData *smd);
+void GPU_create_smoke(struct SmokeModifierData *smd, int highres);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index 7218b6b1328..e00cab79ce0 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -73,9 +73,10 @@ int GPU_print_error(char *str);
GPUTexture *GPU_texture_create_1D(int w, float *pixels);
GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels);
+GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);
GPUTexture *GPU_texture_create_depth(int w, int h);
GPUTexture *GPU_texture_from_blender(struct Image *ima,
- struct ImageUser *iuser, double time);
+ struct ImageUser *iuser, double time, int mipmap);
void GPU_texture_free(GPUTexture *tex);
void GPU_texture_ref(GPUTexture *tex);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 49c0dc166c1..f7318869fb3 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -124,7 +124,7 @@ void GPU_material_free(struct Material *ma);
void GPU_materials_free();
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time);
+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]);
void GPU_material_unbind(GPUMaterial *material);
int GPU_material_bound(GPUMaterial *material);
diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript
index 63f5fe53238..7e700c177e4 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -4,8 +4,8 @@ Import ('env')
sources = env.Glob('intern/*.c')
incs = '../blenlib ../blenkernel ../makesdna ../include'
-incs += ' #/extern/glew/include #intern/guardedalloc ../imbuf .'
+incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .'
incs += ' ' + env['BF_OPENGL_INC']
-env.BlenderLib ( 'bf_gpu', sources, Split(incs), [], libtype=['core', 'player'], priority=[160, 20] )
+env.BlenderLib ( 'bf_gpu', sources, Split(incs), [], libtype=['core','player'], priority=[160,110] )
diff --git a/source/blender/gpu/intern/Makefile b/source/blender/gpu/intern/Makefile
index 3a3ac20ff6c..2637bff44ac 100644
--- a/source/blender/gpu/intern/Makefile
+++ b/source/blender/gpu/intern/Makefile
@@ -47,6 +47,7 @@ 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_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 94c1910e3bc..c8a2d553685 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -824,7 +824,7 @@ void GPU_nodes_extract_dynamic_inputs(GPUPass *pass, ListBase *nodes)
GPU_shader_unbind(shader);
}
-void GPU_pass_bind(GPUPass *pass, double time)
+void GPU_pass_bind(GPUPass *pass, double time, int mipmap)
{
GPUInput *input;
GPUShader *shader = pass->shader;
@@ -838,7 +838,7 @@ void GPU_pass_bind(GPUPass *pass, double time)
/* now bind the textures */
for (input=inputs->first; input; input=input->next) {
if (input->ima)
- input->tex = GPU_texture_from_blender(input->ima, input->iuser, time);
+ input->tex = GPU_texture_from_blender(input->ima, input->iuser, time, mipmap);
if(input->tex && input->bindtex) {
GPU_texture_bind(input->tex, input->texid);
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 53b52f24f16..f5dd956d176 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -71,7 +71,7 @@ GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink,
struct GPUShader *GPU_pass_shader(GPUPass *pass);
-void GPU_pass_bind(GPUPass *pass, double time);
+void GPU_pass_bind(GPUPass *pass, double time, int mipmap);
void GPU_pass_update_uniforms(GPUPass *pass);
void GPU_pass_unbind(GPUPass *pass);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 5edb619f7e5..75e8073aafd 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -38,9 +38,11 @@
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
@@ -62,6 +64,8 @@
#include "GPU_material.h"
#include "GPU_draw.h"
+#include "smoke_API.h"
+
/* These are some obscure rendering functions shared between the
* game engine and the blender, in this module to avoid duplicaten
* and abstract them away from the rest a bit */
@@ -194,8 +198,11 @@ static int smaller_pow2(int num)
static int is_pow2_limit(int num)
{
/* take texture clamping into account */
- if (G.f & G_TEXTUREPAINT)
- return 1;
+
+ /* XXX: texturepaint not global!
+ if (G.f & G_TEXTUREPAINT)
+ return 1;*/
+
if (U.glreslimit != 0 && num > U.glreslimit)
return 0;
@@ -204,8 +211,9 @@ static int is_pow2_limit(int num)
static int smaller_pow2_limit(int num)
{
- if (G.f & G_TEXTUREPAINT)
- return 1;
+ /* XXX: texturepaint not global!
+ if (G.f & G_TEXTUREPAINT)
+ return 1;*/
/* take texture clamping into account */
if (U.glreslimit != 0 && num > U.glreslimit)
@@ -249,7 +257,7 @@ void GPU_set_linear_mipmap(int linear)
static int gpu_get_mipmap(void)
{
- return GTS.domipmap && (!(G.f & G_TEXTUREPAINT));
+ return GTS.domipmap;
}
static GLenum gpu_get_mipmap_filter(int mag)
@@ -382,7 +390,7 @@ static void gpu_verify_reflection(Image *ima)
}
}
-int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare)
+int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare, int mipmap)
{
ImBuf *ibuf = NULL;
unsigned int *bind = NULL;
@@ -507,7 +515,7 @@ int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare)
}
/* scale if not a power of two */
- if (!is_pow2_limit(rectw) || !is_pow2_limit(recth)) {
+ if (!mipmap && (!is_pow2_limit(rectw) || !is_pow2_limit(recth))) {
rectw= smaller_pow2_limit(rectw);
recth= smaller_pow2_limit(recth);
@@ -520,7 +528,7 @@ int GPU_verify_image(Image *ima, int tftile, int tfmode, int compare)
glGenTextures(1, (GLuint *)bind);
glBindTexture( GL_TEXTURE_2D, *bind);
- if (!gpu_get_mipmap()) {
+ if (!(gpu_get_mipmap() && mipmap)) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rectw, recth, 0, GL_RGBA, GL_UNSIGNED_BYTE, rect);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
@@ -559,7 +567,7 @@ static void gpu_verify_repeat(Image *ima)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
-int GPU_set_tpage(MTFace *tface)
+int GPU_set_tpage(MTFace *tface, int mipmap)
{
Image *ima;
@@ -575,7 +583,7 @@ int GPU_set_tpage(MTFace *tface)
gpu_verify_alpha_mode(tface);
gpu_verify_reflection(ima);
- if(GPU_verify_image(ima, tface->tile, tface->mode, 1)) {
+ if(GPU_verify_image(ima, tface->tile, tface->mode, 1, mipmap)) {
GTS.curtile= GTS.tile;
GTS.curima= GTS.ima;
GTS.curtilemode= GTS.tilemode;
@@ -640,13 +648,13 @@ void GPU_paint_set_mipmap(int mipmap)
}
}
-void GPU_paint_update_image(Image *ima, int x, int y, int w, int h)
+void GPU_paint_update_image(Image *ima, int x, int y, int w, int h, int mipmap)
{
ImBuf *ibuf;
ibuf = BKE_image_get_ibuf(ima, NULL);
- if (ima->repbind || gpu_get_mipmap() || !ima->bindcode || !ibuf ||
+ if (ima->repbind || (gpu_get_mipmap() && mipmap) || !ima->bindcode || !ibuf ||
(!is_pow2(ibuf->x) || !is_pow2(ibuf->y)) ||
(w == 0) || (h == 0)) {
/* these cases require full reload still */
@@ -740,6 +748,31 @@ int GPU_update_image_time(Image *ima, double time)
return inc;
}
+
+void GPU_free_smoke(SmokeModifierData *smd)
+{
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain)
+ {
+ if(smd->domain->tex)
+ GPU_texture_free(smd->domain->tex);
+ smd->domain->tex = NULL;
+
+ if(smd->domain->tex_shadow)
+ GPU_texture_free(smd->domain->tex_shadow);
+ smd->domain->tex_shadow = NULL;
+ }
+}
+
+void GPU_create_smoke(SmokeModifierData *smd, int highres)
+{
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->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)
+ 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);
+}
+
void GPU_free_image(Image *ima)
{
/* free regular image binding */
@@ -776,16 +809,17 @@ void GPU_free_images(void)
/* OpenGL Materials */
-/* materials start counting at # one.... */
-#define MAXMATBUF (MAXMAT+1)
+#define FIXEDMAT 8
/* OpenGL state caching for materials */
static struct GPUMaterialState {
- float matbuf[MAXMATBUF][2][4];
+ float (*matbuf)[2][4];
+ float matbuf_fixed[FIXEDMAT][2][4];
int totmat;
- Material *gmatbuf[MAXMATBUF];
+ Material **gmatbuf;
+ Material *gmatbuf_fixed[FIXEDMAT];
Material *gboundmat;
Object *gob;
Scene *gscene;
@@ -793,12 +827,13 @@ static struct GPUMaterialState {
float (*gviewmat)[4];
float (*gviewinv)[4];
- GPUBlendMode blendmode[MAXMATBUF];
+ GPUBlendMode *blendmode;
+ GPUBlendMode blendmode_fixed[FIXEDMAT];
int alphapass;
int lastmatnr, lastretval;
GPUBlendMode lastblendmode;
-} GMS;
+} GMS = {NULL};
Material *gpu_active_node_material(Material *ma)
{
@@ -814,7 +849,7 @@ Material *gpu_active_node_material(Material *ma)
return ma;
}
-void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
+void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
{
extern Material defmaterial; /* from material.c */
Material *ma;
@@ -830,7 +865,7 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj
GMS.gob = ob;
GMS.gscene = scene;
- GMS.totmat= ob->totcol;
+ GMS.totmat= ob->totcol+1; /* materials start from 1, default material is 0 */
GMS.glay= v3d->lay;
GMS.gviewmat= rv3d->viewmat;
GMS.gviewinv= rv3d->viewinv;
@@ -838,17 +873,28 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj
GMS.alphapass = (v3d && v3d->transp);
if(do_alpha_pass)
*do_alpha_pass = 0;
+
+ if(GMS.totmat > FIXEDMAT) {
+ GMS.matbuf= MEM_callocN(sizeof(*GMS.matbuf)*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");
+ }
+ else {
+ GMS.matbuf= GMS.matbuf_fixed;
+ GMS.gmatbuf= GMS.gmatbuf_fixed;
+ GMS.blendmode= GMS.blendmode_fixed;
+ }
/* no materials assigned? */
if(ob->totcol==0) {
- GMS.matbuf[0][0][0]= defmaterial.r;
- GMS.matbuf[0][0][1]= defmaterial.g;
- GMS.matbuf[0][0][2]= defmaterial.b;
+ 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.specr;
- GMS.matbuf[0][1][1]= defmaterial.specg;
- GMS.matbuf[0][1][2]= defmaterial.specb;
+ 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;
/* do material 1 too, for displists! */
@@ -870,10 +916,6 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj
if(!glsl) ma= gpu_active_node_material(ma);
if(ma==NULL) ma= &defmaterial;
- /* this shouldn't happen .. */
- if(a>=MAXMATBUF)
- continue;
-
/* create glsl material if requested */
gpumat = (glsl)? GPU_material_from_blender(GMS.gscene, ma): NULL;
@@ -921,19 +963,42 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj
int GPU_enable_material(int nr, void *attribs)
{
+ extern Material defmaterial; /* from material.c */
GPUVertexAttribs *gattribs = attribs;
GPUMaterial *gpumat;
GPUBlendMode blendmode;
+ /* no GPU_begin_object_materials, use default material */
+ if(!GMS.matbuf) {
+ float diff[4], spec[4];
+
+ 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;
+ diff[3]= 1.0;
+
+ spec[0]= defmaterial.spec*defmaterial.specr;
+ spec[1]= defmaterial.spec*defmaterial.specg;
+ spec[2]= defmaterial.spec*defmaterial.specb;
+ spec[3]= 1.0;
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+
+ return 0;
+ }
+
/* prevent index to use un-initialized array items */
- if(nr>GMS.totmat)
- nr= GMS.totmat;
+ if(nr>=GMS.totmat)
+ nr= 0;
if(gattribs)
memset(gattribs, 0, sizeof(*gattribs));
/* keep current material */
- if(nr>=MAXMATBUF || nr==GMS.lastmatnr)
+ if(nr==GMS.lastmatnr)
return GMS.lastretval;
/* unbind glsl material */
@@ -956,7 +1021,7 @@ int GPU_enable_material(int nr, void *attribs)
gpumat = GPU_material_from_blender(GMS.gscene, mat);
GPU_material_vertex_attributes(gpumat, gattribs);
- GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0);
+ GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
GMS.gboundmat= mat;
@@ -1004,6 +1069,21 @@ void GPU_disable_material(void)
GPU_set_material_blend_mode(GPU_BLEND_SOLID);
}
+void GPU_end_object_materials(void)
+{
+ GPU_disable_material();
+
+ if(GMS.matbuf && GMS.matbuf != GMS.matbuf_fixed) {
+ MEM_freeN(GMS.matbuf);
+ MEM_freeN(GMS.gmatbuf);
+ MEM_freeN(GMS.blendmode);
+ }
+
+ GMS.matbuf= NULL;
+ GMS.gmatbuf= NULL;
+ GMS.blendmode= NULL;
+}
+
/* Lights */
int GPU_default_lights(void)
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 4984e043031..55e4b337a77 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -312,7 +312,79 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
return tex;
}
-GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, double time)
+
+GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels)
+{
+ GPUTexture *tex;
+ GLenum type, format, internalformat;
+ void *pixels = NULL;
+ float vfBorderColor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+
+ tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
+ tex->w = w;
+ tex->h = h;
+ tex->depth = depth;
+ tex->number = -1;
+ tex->refcount = 1;
+ tex->target = GL_TEXTURE_3D;
+
+ glGenTextures(1, &tex->bindcode);
+
+ if (!tex->bindcode) {
+ fprintf(stderr, "GPUTexture: texture create failed: %d\n",
+ (int)glGetError());
+ GPU_texture_free(tex);
+ return NULL;
+ }
+
+ if (!GLEW_ARB_texture_non_power_of_two) {
+ tex->w = larger_pow2(tex->w);
+ tex->h = larger_pow2(tex->h);
+ tex->depth = larger_pow2(tex->depth);
+ }
+
+ tex->number = 0;
+ glBindTexture(tex->target, tex->bindcode);
+
+ GPU_print_error("3D glBindTexture");
+
+ type = GL_FLOAT; // GL_UNSIGNED_BYTE
+ format = GL_RED;
+ internalformat = GL_INTENSITY;
+
+ //if (fpixels)
+ // pixels = GPU_texture_convert_pixels(w*h*depth, fpixels);
+
+ glTexImage3D(tex->target, 0, internalformat, tex->w, tex->h, tex->depth, 0, format, type, 0);
+
+ GPU_print_error("3D glTexImage3D");
+
+ if (fpixels) {
+ glTexSubImage3D(tex->target, 0, 0, 0, 0, w, h, depth, format, type, fpixels);
+ GPU_print_error("3D glTexSubImage3D");
+ }
+
+
+ glTexParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, vfBorderColor);
+ GPU_print_error("3D GL_TEXTURE_BORDER_COLOR");
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ GPU_print_error("3D GL_LINEAR");
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
+ GPU_print_error("3D GL_CLAMP_TO_BORDER");
+
+ if (pixels)
+ MEM_freeN(pixels);
+
+ if (tex)
+ GPU_texture_unbind(tex);
+
+ return tex;
+}
+
+GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, double time, int mipmap)
{
GPUTexture *tex;
GLint w, h, border, lastbindcode, bindcode;
@@ -320,7 +392,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, 0, 0, 0);
+ bindcode = GPU_verify_image(ima, 0, 0, 0, mipmap);
if(ima->gputexture) {
ima->gputexture->bindcode = bindcode;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 7e8b5c18d71..c0fb069fc41 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -246,7 +246,7 @@ void GPU_material_free(Material *ma)
BLI_freelistN(&ma->gpumaterial);
}
-void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time)
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap)
{
if(material->pass) {
LinkData *nlink;
@@ -266,7 +266,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
}
}
- GPU_pass_bind(material->pass, time);
+ GPU_pass_bind(material->pass, time, mipmap);
material->bound = 1;
}
}
@@ -500,7 +500,7 @@ static void ramp_diffuse_result(GPUShadeInput *shi, GPUNodeLink **diff)
GPUMaterial *mat= shi->gpumat;
GPUNodeLink *fac;
- if(!(G.fileflags & G_FILE_GLSL_NO_RAMPS)) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_RAMPS)) {
if(ma->ramp_col) {
if(ma->rampin_col==MA_RAMP_IN_RESULT) {
GPU_link(mat, "ramp_rgbtobw", *diff, &fac);
@@ -516,7 +516,7 @@ static void add_to_diffuse(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, G
{
GPUNodeLink *fac, *tmp, *addcol;
- if(!(G.fileflags & G_FILE_GLSL_NO_RAMPS) &&
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_RAMPS) &&
ma->ramp_col && (ma->mode & MA_RAMP_COL)) {
/* MA_RAMP_IN_RESULT is exceptional */
if(ma->rampin_col==MA_RAMP_IN_RESULT) {
@@ -556,7 +556,7 @@ static void ramp_spec_result(GPUShadeInput *shi, GPUNodeLink **spec)
GPUMaterial *mat= shi->gpumat;
GPUNodeLink *fac;
- if(!(G.fileflags & G_FILE_GLSL_NO_RAMPS) &&
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_RAMPS) &&
ma->ramp_spec && ma->rampin_spec==MA_RAMP_IN_RESULT) {
GPU_link(mat, "ramp_rgbtobw", *spec, &fac);
@@ -644,7 +644,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
is= inp; /* Lambert */
- if(!(G.fileflags & G_FILE_GLSL_NO_SHADERS)) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_SHADERS)) {
if(ma->diff_shader==MA_DIFF_ORENNAYAR)
GPU_link(mat, "shade_diffuse_oren_nayer", inp, vn, lv, view, GPU_uniform(&ma->roughness), &is);
else if(ma->diff_shader==MA_DIFF_TOON)
@@ -656,7 +656,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
}
- if(!(G.fileflags & G_FILE_GLSL_NO_SHADERS))
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_SHADERS))
if(ma->shade_flag & MA_CUBIC)
GPU_link(mat, "shade_cubic", is, &is);
@@ -671,7 +671,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
// done in shade_visifac now, GPU_link(mat, "mtex_value_clamp_positive", i, &i);
if((ma->mode & MA_SHADOW) && GPU_lamp_has_shadow_buffer(lamp)) {
- if(!(G.fileflags & G_FILE_GLSL_NO_SHADOWS)) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_SHADOWS)) {
mat->dynproperty |= DYN_LAMP_PERSMAT;
GPU_link(mat, "test_shadowbuf",
@@ -700,7 +700,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
GPU_link(mat, "math_multiply", i, shadfac, &i);
}
}
- else if((G.fileflags & G_FILE_GLSL_NO_SHADOWS) && (lamp->mode & LA_ONLYSHADOW)) {
+ else if((mat->scene->gm.flag & GAME_GLSL_NO_SHADOWS) && (lamp->mode & LA_ONLYSHADOW)) {
add_user_list(&mat->lamps, lamp);
add_user_list(&lamp->materials, shi->gpumat->ma);
return;
@@ -716,7 +716,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
}
- if(G.fileflags & G_FILE_GLSL_NO_SHADERS);
+ if(mat->scene->gm.flag & GAME_GLSL_NO_SHADERS);
else if(!(lamp->mode & LA_NO_SPEC) && !(lamp->mode & LA_ONLYSHADOW) &&
(GPU_link_changed(shi->spec) || ma->spec != 0.0f)) {
if(lamp->type == LA_HEMI) {
@@ -1015,11 +1015,11 @@ static void do_material_tex(GPUShadeInput *shi)
if(mtex->mapto & MAP_COL)
texture_rgb_blend(mat, tcol, shi->rgb, tin, colfac, mtex->blendtype, &shi->rgb);
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_COLSPEC))
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_COLSPEC))
texture_rgb_blend(mat, tcol, shi->specrgb, tin, colfac, mtex->blendtype, &shi->specrgb);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_NORM)) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_NORM)) {
if(mtex->maptoneg & MAP_NORM) tex->norfac= -mtex->norfac;
else tex->norfac= mtex->norfac;
@@ -1065,22 +1065,22 @@ static void do_material_tex(GPUShadeInput *shi)
GPU_link(mat, "mtex_rgbtoint", trgb, &tin);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_REF) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_REF) {
int flip= mtex->maptoneg & MAP_REF;
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->refl, tin, varfac, mtex->blendtype, flip, &shi->refl);
GPU_link(mat, "mtex_value_clamp_positive", shi->refl, &shi->refl);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_SPEC) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_SPEC) {
int flip= mtex->maptoneg & MAP_SPEC;
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->spec, tin, varfac, mtex->blendtype, flip, &shi->spec);
GPU_link(mat, "mtex_value_clamp_positive", shi->spec, &shi->spec);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_EMIT) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_EMIT) {
int flip= mtex->maptoneg & MAP_EMIT;
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->emit, tin, varfac, mtex->blendtype, flip, &shi->emit);
GPU_link(mat, "mtex_value_clamp_positive", shi->emit, &shi->emit);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_HAR) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_HAR) {
int flip= mtex->maptoneg & MAP_HAR;
GPU_link(mat, "mtex_har_divide", shi->har, &shi->har);
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->har, tin, varfac, mtex->blendtype, flip, &shi->har);
@@ -1091,7 +1091,7 @@ static void do_material_tex(GPUShadeInput *shi)
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->alpha, tin, varfac, mtex->blendtype, flip, &shi->alpha);
GPU_link(mat, "mtex_value_clamp", shi->alpha, &shi->alpha);
}
- if(!(G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_AMB) {
+ if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && mtex->mapto & MAP_AMB) {
int flip= mtex->maptoneg & MAP_AMB;
texture_value_blend(mat, GPU_uniform(&mtex->def_var), shi->amb, tin, varfac, mtex->blendtype, flip, &shi->amb);
GPU_link(mat, "mtex_value_clamp", shi->amb, &shi->amb);
@@ -1139,10 +1139,10 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
do_material_tex(shi);
- if(ma->mode & MA_ZTRA)
+ if((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
GPU_material_enable_alpha(mat);
- if((G.fileflags & G_FILE_GLSL_NO_LIGHTS) || (ma->mode & MA_SHLESS)) {
+ if((mat->scene->gm.flag & GAME_GLSL_NO_LIGHTS) || (ma->mode & MA_SHLESS)) {
shr->combined = shi->rgb;
shr->alpha = shi->alpha;
GPU_link(mat, "set_rgb", shi->rgb, &shr->diff);
@@ -1213,7 +1213,7 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
GPU_uniform(&world->horr), &shr->combined);
}
- if(!(ma->mode & MA_ZTRA)) {
+ if(!((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))) {
if(world && (GPU_link_changed(shr->alpha) || ma->alpha != 1.0f))
GPU_link(mat, "shade_world_mix", GPU_uniform(&world->horr),
shr->combined, &shr->combined);
@@ -1251,7 +1251,7 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
mat = GPU_material_construct_begin(ma);
mat->scene = scene;
- if(!(G.fileflags & G_FILE_GLSL_NO_NODES) && ma->nodetree && ma->use_nodes) {
+ if(!(scene->gm.flag & GAME_GLSL_NO_NODES) && ma->nodetree && ma->use_nodes) {
ntreeGPUMaterialNodes(ma->nodetree, mat);
}
else {
@@ -1458,8 +1458,8 @@ void GPU_lamp_free(Object *ob)
int GPU_lamp_has_shadow_buffer(GPULamp *lamp)
{
- return (!(G.fileflags & G_FILE_GLSL_NO_SHADOWS) &&
- !(G.fileflags & G_FILE_GLSL_NO_LIGHTS) &&
+ return (!(lamp->scene->gm.flag & GAME_GLSL_NO_SHADOWS) &&
+ !(lamp->scene->gm.flag & GAME_GLSL_NO_LIGHTS) &&
lamp->tex && lamp->fb);
}
diff --git a/source/blender/ikplugin/BIK_api.h b/source/blender/ikplugin/BIK_api.h
new file mode 100644
index 00000000000..a259d0aa62a
--- /dev/null
+++ b/source/blender/ikplugin/BIK_api.h
@@ -0,0 +1,93 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BIK_API_H
+#define BIK_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Object;
+struct bPoseChannel;
+struct bPose;
+struct bArmature;
+struct Scene;
+struct bConstraint;
+
+enum BIK_ParamType {
+ BIK_PARAM_TYPE_FLOAT = 0,
+ BIK_PARAM_TYPE_INT,
+ BIK_PARAM_TYPE_STRING,
+};
+
+struct BIK_ParamValue {
+ short type; /* BIK_PARAM_TYPE_.. */
+ short length; /* for string, does not include terminating 0 */
+ union {
+ float f[8];
+ int i[8];
+ char s[32];
+ } value;
+};
+typedef struct BIK_ParamValue BIK_ParamValue;
+
+void BIK_initialize_tree(struct Scene *scene, struct Object *ob, float ctime);
+void BIK_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
+void BIK_release_tree(struct Scene *scene, struct Object *ob, float ctime);
+void BIK_clear_data(struct bPose *pose);
+void BIK_clear_cache(struct bPose *pose);
+void BIK_update_param(struct bPose *pose);
+void BIK_test_constraint(struct Object *ob, struct bConstraint *cons);
+// not yet implemented
+int BIK_get_constraint_param(struct bPose *pose, struct bConstraint *cons, int id, BIK_ParamValue *value);
+int BIK_get_channel_param(struct bPose *pose, struct bPoseChannel *pchan, int id, BIK_ParamValue *value);
+int BIK_get_solver_param(struct bPose *pose, struct bPoseChannel *pchan, int id, BIK_ParamValue *value);
+
+// number of solver available
+// 0 = iksolver
+// 1 = iTaSC
+#define BIK_SOLVER_COUNT 2
+
+/* for use in BIK_get_constraint_param */
+#define BIK_PARAM_CONSTRAINT_ERROR 0
+
+/* for use in BIK_get_channel_param */
+#define BIK_PARAM_CHANNEL_JOINT 0
+
+/* for use in BIK_get_solver_param */
+#define BIK_PARAM_SOLVER_RANK 0
+#define BIK_PARAM_SOLVER_ITERATION 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // BIK_API_H
+
diff --git a/source/blender/ikplugin/CMakeLists.txt b/source/blender/ikplugin/CMakeLists.txt
new file mode 100644
index 00000000000..5790d4ef12f
--- /dev/null
+++ b/source/blender/ikplugin/CMakeLists.txt
@@ -0,0 +1,35 @@
+# $Id: CMakeLists.txt 20156 2009-05-11 16:31:30Z ben2610 $
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Jacques Beaurain.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+FILE(GLOB SRC intern/*.c intern/*.cpp)
+
+SET(INC
+ ../../../intern/guardedalloc ../../../intern/iksolver/extern
+ ../../../intern/itasc ../../../extern/Eigen2
+ ../blenlib ../makesdna ../blenkernel ../include ../ikplugin
+)
+
+BLENDERLIB(bf_ikplugin "${SRC}" "${INC}")
diff --git a/source/blender/ikplugin/Makefile b/source/blender/ikplugin/Makefile
new file mode 100644
index 00000000000..370ed418464
--- /dev/null
+++ b/source/blender/ikplugin/Makefile
@@ -0,0 +1,31 @@
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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/SConscript b/source/blender/ikplugin/SConscript
new file mode 100644
index 00000000000..a745a93077a
--- /dev/null
+++ b/source/blender/ikplugin/SConscript
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp')
+
+incs = '#/intern/guardedalloc #/intern/iksolver/extern ../makesdna ../blenlib'
+incs += ' ../blenkernel ../include ../ikplugin #/intern/itasc #/extern/Eigen2'
+
+env.BlenderLib ( 'bf_ikplugin', sources, Split(incs), [], libtype=['core','player'], priority=[180, 190] )
diff --git a/source/blender/ikplugin/intern/Makefile b/source/blender/ikplugin/intern/Makefile
new file mode 100644
index 00000000000..9254b65b7b7
--- /dev/null
+++ b/source/blender/ikplugin/intern/Makefile
@@ -0,0 +1,49 @@
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 += $(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..
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
new file mode 100644
index 00000000000..714843fc5e5
--- /dev/null
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -0,0 +1,140 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BIK_api.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_armature.h"
+#include "BKE_utildefines.h"
+#include "DNA_object_types.h"
+#include "DNA_action_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_armature_types.h"
+
+#include "ikplugin_api.h"
+#include "iksolver_plugin.h"
+#include "itasc_plugin.h"
+
+
+static IKPlugin ikplugin_tab[BIK_SOLVER_COUNT] = {
+ /* Legacy IK solver */
+ {
+ iksolver_initialize_tree,
+ iksolver_execute_tree,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ },
+ /* iTaSC IK solver */
+ {
+ itasc_initialize_tree,
+ itasc_execute_tree,
+ itasc_release_tree,
+ itasc_clear_data,
+ itasc_clear_cache,
+ itasc_update_param,
+ itasc_test_constraint,
+ }
+};
+
+
+static IKPlugin *get_plugin(bPose *pose)
+{
+ IKPlugin *plugin;
+
+ if (!pose || pose->iksolver < 0 || pose->iksolver >= BIK_SOLVER_COUNT)
+ return NULL;
+
+ return &ikplugin_tab[pose->iksolver];
+}
+
+/*----------------------------------------*/
+/* Plugin API */
+
+void BIK_initialize_tree(Scene *scene, Object *ob, float ctime)
+{
+ IKPlugin *plugin = get_plugin(ob->pose);
+
+ if (plugin && plugin->initialize_tree_func)
+ plugin->initialize_tree_func(scene, ob, ctime);
+}
+
+void BIK_execute_tree(struct Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
+{
+ IKPlugin *plugin = get_plugin(ob->pose);
+
+ if (plugin && plugin->execute_tree_func)
+ plugin->execute_tree_func(scene, ob, pchan, ctime);
+}
+
+void BIK_release_tree(struct Scene *scene, Object *ob, float ctime)
+{
+ IKPlugin *plugin = get_plugin(ob->pose);
+
+ if (plugin && plugin->release_tree_func)
+ plugin->release_tree_func(scene, ob, ctime);
+}
+
+void BIK_clear_data(struct bPose *pose)
+{
+ IKPlugin *plugin = get_plugin(pose);
+
+ if (plugin && plugin->remove_armature_func)
+ plugin->remove_armature_func(pose);
+}
+
+void BIK_clear_cache(struct bPose *pose)
+{
+ IKPlugin *plugin = get_plugin(pose);
+
+ if (plugin && plugin->clear_cache)
+ plugin->clear_cache(pose);
+}
+
+void BIK_update_param(struct bPose *pose)
+{
+ IKPlugin *plugin = get_plugin(pose);
+
+ if (plugin && plugin->update_param)
+ plugin->update_param(pose);
+}
+
+void BIK_test_constraint(struct Object *ob, struct bConstraint *cons)
+{
+ IKPlugin *plugin = get_plugin(ob->pose);
+
+ if (plugin && plugin->test_constraint)
+ plugin->test_constraint(ob, cons);
+}
diff --git a/source/blender/ikplugin/intern/ikplugin_api.h b/source/blender/ikplugin/intern/ikplugin_api.h
new file mode 100644
index 00000000000..cc4dff4ec75
--- /dev/null
+++ b/source/blender/ikplugin/intern/ikplugin_api.h
@@ -0,0 +1,60 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef IKPLUGIN_API_H
+#define IKPLUGIN_API_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Object;
+struct bPoseChannel;
+struct bArmature;
+struct Scene;
+
+
+struct IKPlugin {
+ void (*initialize_tree_func)(struct Scene *scene, struct Object *ob, float ctime);
+ void (*execute_tree_func)(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
+ void (*release_tree_func)(struct Scene *scene, struct Object *ob, float ctime);
+ void (*remove_armature_func)(struct bPose *pose);
+ void (*clear_cache)(struct bPose *pose);
+ void (*update_param)(struct bPose *pose);
+ void (*test_constraint)(struct Object *ob, struct bConstraint *cons);
+};
+
+typedef struct IKPlugin IKPlugin;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // IKPLUGIN_API_H
+
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
new file mode 100644
index 00000000000..262185fef1b
--- /dev/null
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -0,0 +1,527 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "BIK_api.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_armature.h"
+#include "BKE_utildefines.h"
+#include "DNA_object_types.h"
+#include "DNA_action_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_armature_types.h"
+
+#include "IK_solver.h"
+#include "iksolver_plugin.h"
+
+/* ********************** THE IK SOLVER ******************* */
+
+/* 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)
+{
+ bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
+ PoseTree *tree;
+ PoseTarget *target;
+ bConstraint *con;
+ bKinematicConstraint *data;
+ int a, segcount= 0, size, newsize, *oldparent, parent;
+
+ /* find IK constraint, and validate it */
+ for(con= pchan_tip->constraints.first; con; con= con->next) {
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ data=(bKinematicConstraint*)con->data;
+ if (data->flag & CONSTRAINT_IK_AUTO) break;
+ if (data->tar==NULL) continue;
+ if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
+ if ((con->flag & (CONSTRAINT_DISABLE|CONSTRAINT_OFF))==0 && (con->enforce!=0.0)) break;
+ }
+ }
+ if(con==NULL) return;
+
+ /* exclude tip from chain? */
+ if(!(data->flag & CONSTRAINT_IK_TIP))
+ pchan_tip= pchan_tip->parent;
+
+ /* Find the chain's root & count the segments needed */
+ for (curchan = pchan_tip; curchan; curchan=curchan->parent){
+ pchan_root = curchan;
+
+ curchan->flag |= POSE_CHAIN; // don't forget to clear this
+ chanlist[segcount]=curchan;
+ segcount++;
+
+ if(segcount==data->rootbone || segcount>255) break; // 255 is weak
+ }
+ if (!segcount) return;
+
+ /* setup the chain data */
+
+ /* we make tree-IK, unless all existing targets are in this chain */
+ for(tree= pchan_root->iktree.first; tree; tree= tree->next) {
+ for(target= tree->targets.first; target; target= target->next) {
+ curchan= tree->pchan[target->tip];
+ if(curchan->flag & POSE_CHAIN)
+ curchan->flag &= ~POSE_CHAIN;
+ else
+ break;
+ }
+ if(target) break;
+ }
+
+ /* create a target */
+ target= MEM_callocN(sizeof(PoseTarget), "posetarget");
+ target->con= con;
+ pchan_tip->flag &= ~POSE_CHAIN;
+
+ if(tree==NULL) {
+ /* make new tree */
+ tree= MEM_callocN(sizeof(PoseTree), "posetree");
+
+ tree->iterations= data->iterations;
+ tree->totchannel= segcount;
+ tree->stretch = (data->flag & CONSTRAINT_IK_STRETCH);
+
+ tree->pchan= MEM_callocN(segcount*sizeof(void*), "ik tree pchan");
+ tree->parent= MEM_callocN(segcount*sizeof(int), "ik tree parent");
+ for(a=0; a<segcount; a++) {
+ tree->pchan[a]= chanlist[segcount-a-1];
+ tree->parent[a]= a-1;
+ }
+ target->tip= segcount-1;
+
+ /* AND! link the tree to the root */
+ BLI_addtail(&pchan_root->iktree, tree);
+ }
+ else {
+ tree->iterations= MAX2(data->iterations, tree->iterations);
+ tree->stretch= tree->stretch && !(data->flag & CONSTRAINT_IK_STRETCH);
+
+ /* skip common pose channels and add remaining*/
+ size= MIN2(segcount, tree->totchannel);
+ for(a=0; a<size && tree->pchan[a]==chanlist[segcount-a-1]; a++);
+ parent= a-1;
+
+ segcount= segcount-a;
+ target->tip= tree->totchannel + segcount - 1;
+
+ if (segcount > 0) {
+ /* resize array */
+ newsize= tree->totchannel + segcount;
+ oldchan= tree->pchan;
+ oldparent= tree->parent;
+
+ tree->pchan= MEM_callocN(newsize*sizeof(void*), "ik tree pchan");
+ tree->parent= MEM_callocN(newsize*sizeof(int), "ik tree parent");
+ memcpy(tree->pchan, oldchan, sizeof(void*)*tree->totchannel);
+ memcpy(tree->parent, oldparent, sizeof(int)*tree->totchannel);
+ MEM_freeN(oldchan);
+ MEM_freeN(oldparent);
+
+ /* add new pose channels at the end, in reverse order */
+ for(a=0; a<segcount; a++) {
+ tree->pchan[tree->totchannel+a]= chanlist[segcount-a-1];
+ tree->parent[tree->totchannel+a]= tree->totchannel+a-1;
+ }
+ tree->parent[tree->totchannel]= parent;
+
+ tree->totchannel= newsize;
+ }
+
+ /* move tree to end of list, for correct evaluation order */
+ BLI_remlink(&pchan_root->iktree, tree);
+ BLI_addtail(&pchan_root->iktree, tree);
+ }
+
+ /* add target to the tree */
+ BLI_addtail(&tree->targets, target);
+ /* mark root channel having an IK tree */
+ pchan_root->flag |= POSE_IKTREE;
+}
+
+
+/* transform from bone(b) to bone(b+1), store in chan_mat */
+static void make_dmats(bPoseChannel *pchan)
+{
+ if (pchan->parent) {
+ float iR_parmat[4][4];
+ Mat4Invert(iR_parmat, pchan->parent->pose_mat);
+ Mat4MulMat4(pchan->chan_mat, pchan->pose_mat, iR_parmat); // delta mat
+ }
+ else Mat4CpyMat4(pchan->chan_mat, pchan->pose_mat);
+}
+
+/* applies IK matrix to pchan, IK is done separated */
+/* formula: pose_mat(b) = pose_mat(b-1) * diffmat(b-1, b) * ik_mat(b) */
+/* to make this work, the diffmats have to be precalculated! Stored in chan_mat */
+static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[][3]) // nr = to detect if this is first bone
+{
+ float vec[3], ikmat[4][4];
+
+ Mat4CpyMat3(ikmat, ik_mat);
+
+ if (pchan->parent)
+ Mat4MulSerie(pchan->pose_mat, pchan->parent->pose_mat, pchan->chan_mat, ikmat, NULL, NULL, NULL, NULL, NULL);
+ else
+ Mat4MulMat4(pchan->pose_mat, ikmat, pchan->chan_mat);
+
+ /* calculate head */
+ VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
+ /* calculate tail */
+ VECCOPY(vec, pchan->pose_mat[1]);
+ VecMulf(vec, pchan->bone->length);
+ VecAddf(pchan->pose_tail, pchan->pose_head, vec);
+
+ pchan->flag |= POSE_DONE;
+}
+
+
+/* called from within the core where_is_pose loop, all animsystems and constraints
+were executed & assigned. Now as last we do an IK pass */
+static void execute_posetree(Object *ob, PoseTree *tree)
+{
+ float R_parmat[3][3], identity[3][3];
+ float iR_parmat[3][3];
+ float R_bonemat[3][3];
+ float goalrot[3][3], goalpos[3];
+ float rootmat[4][4], imat[4][4];
+ float goal[4][4], goalinv[4][4];
+ float irest_basis[3][3], full_basis[3][3];
+ float end_pose[4][4], world_pose[4][4];
+ float length, basis[3][3], rest_basis[3][3], start[3], *ikstretch=NULL;
+ float resultinf=0.0f;
+ int a, flag, hasstretch=0, resultblend=0;
+ bPoseChannel *pchan;
+ IK_Segment *seg, *parent, **iktree, *iktarget;
+ IK_Solver *solver;
+ PoseTarget *target;
+ bKinematicConstraint *data, *poleangledata=NULL;
+ Bone *bone;
+
+ if (tree->totchannel == 0)
+ return;
+
+ iktree= MEM_mallocN(sizeof(void*)*tree->totchannel, "ik tree");
+
+ for(a=0; a<tree->totchannel; a++) {
+ pchan= tree->pchan[a];
+ bone= pchan->bone;
+
+ /* set DoF flag */
+ flag= 0;
+ if(!(pchan->ikflag & BONE_IK_NO_XDOF) && !(pchan->ikflag & BONE_IK_NO_XDOF_TEMP))
+ flag |= IK_XDOF;
+ if(!(pchan->ikflag & BONE_IK_NO_YDOF) && !(pchan->ikflag & BONE_IK_NO_YDOF_TEMP))
+ flag |= IK_YDOF;
+ if(!(pchan->ikflag & BONE_IK_NO_ZDOF) && !(pchan->ikflag & BONE_IK_NO_ZDOF_TEMP))
+ flag |= IK_ZDOF;
+
+ if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ flag |= IK_TRANS_YDOF;
+ hasstretch = 1;
+ }
+
+ seg= iktree[a]= IK_CreateSegment(flag);
+
+ /* find parent */
+ if(a == 0)
+ parent= NULL;
+ else
+ parent= iktree[tree->parent[a]];
+
+ IK_SetParent(seg, parent);
+
+ /* get the matrix that transforms from prevbone into this bone */
+ Mat3CpyMat4(R_bonemat, pchan->pose_mat);
+
+ /* gather transformations for this IK segment */
+
+ if (pchan->parent)
+ Mat3CpyMat4(R_parmat, pchan->parent->pose_mat);
+ else
+ Mat3One(R_parmat);
+
+ /* bone offset */
+ if (pchan->parent && (a > 0))
+ VecSubf(start, pchan->pose_head, pchan->parent->pose_tail);
+ else
+ /* only root bone (a = 0) has no parent */
+ start[0]= start[1]= start[2]= 0.0f;
+
+ /* change length based on bone size */
+ length= bone->length*VecLength(R_bonemat[1]);
+
+ /* compute rest basis and its inverse */
+ Mat3CpyMat3(rest_basis, bone->bone_mat);
+ Mat3CpyMat3(irest_basis, bone->bone_mat);
+ Mat3Transp(irest_basis);
+
+ /* compute basis with rest_basis removed */
+ Mat3Inv(iR_parmat, R_parmat);
+ Mat3MulMat3(full_basis, iR_parmat, R_bonemat);
+ Mat3MulMat3(basis, irest_basis, full_basis);
+
+ /* basis must be pure rotation */
+ Mat3Ortho(basis);
+
+ /* transform offset into local bone space */
+ Mat3Ortho(iR_parmat);
+ Mat3MulVecfl(iR_parmat, start);
+
+ IK_SetTransform(seg, start, rest_basis, basis, length);
+
+ if (pchan->ikflag & BONE_IK_XLIMIT)
+ IK_SetLimit(seg, IK_X, pchan->limitmin[0], pchan->limitmax[0]);
+ if (pchan->ikflag & BONE_IK_YLIMIT)
+ IK_SetLimit(seg, IK_Y, pchan->limitmin[1], pchan->limitmax[1]);
+ if (pchan->ikflag & BONE_IK_ZLIMIT)
+ IK_SetLimit(seg, IK_Z, pchan->limitmin[2], pchan->limitmax[2]);
+
+ IK_SetStiffness(seg, IK_X, pchan->stiffness[0]);
+ IK_SetStiffness(seg, IK_Y, pchan->stiffness[1]);
+ IK_SetStiffness(seg, IK_Z, pchan->stiffness[2]);
+
+ if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ float ikstretch = pchan->ikstretch*pchan->ikstretch;
+ IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0-ikstretch, 0.99));
+ IK_SetLimit(seg, IK_TRANS_Y, 0.001, 1e10);
+ }
+ }
+
+ solver= IK_CreateSolver(iktree[0]);
+
+ /* set solver goals */
+
+ /* first set the goal inverse transform, assuming the root of tree was done ok! */
+ pchan= tree->pchan[0];
+ if (pchan->parent)
+ /* transform goal by parent mat, so this rotation is not part of the
+ segment's basis. otherwise rotation limits do not work on the
+ local transform of the segment itself. */
+ Mat4CpyMat4(rootmat, pchan->parent->pose_mat);
+ else
+ Mat4One(rootmat);
+ VECCOPY(rootmat[3], pchan->pose_head);
+
+ Mat4MulMat4 (imat, rootmat, ob->obmat);
+ Mat4Invert (goalinv, imat);
+
+ for (target=tree->targets.first; target; target=target->next) {
+ float polepos[3];
+ int poleconstrain= 0;
+
+ data= (bKinematicConstraint*)target->con->data;
+
+ /* 1.0=ctime, we pass on object for auto-ik (owner-type here is object, even though
+ * strictly speaking, it is a posechannel)
+ */
+ get_constraint_target_matrix(target->con, 0, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
+
+ /* and set and transform goal */
+ Mat4MulMat4(goal, rootmat, goalinv);
+
+ VECCOPY(goalpos, goal[3]);
+ Mat3CpyMat4(goalrot, goal);
+
+ /* same for pole vector target */
+ if(data->poletar) {
+ get_constraint_target_matrix(target->con, 1, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
+
+ if(data->flag & CONSTRAINT_IK_SETANGLE) {
+ /* don't solve IK when we are setting the pole angle */
+ break;
+ }
+ else {
+ Mat4MulMat4(goal, rootmat, goalinv);
+ VECCOPY(polepos, goal[3]);
+ poleconstrain= 1;
+
+ /* for pole targets, we blend the result of the ik solver
+ * instead of the target position, otherwise we can't get
+ * a smooth transition */
+ resultblend= 1;
+ resultinf= target->con->enforce;
+
+ if(data->flag & CONSTRAINT_IK_GETANGLE) {
+ poleangledata= data;
+ data->flag &= ~CONSTRAINT_IK_GETANGLE;
+ }
+ }
+ }
+
+ /* do we need blending? */
+ if (!resultblend && target->con->enforce!=1.0) {
+ float q1[4], q2[4], q[4];
+ float fac= target->con->enforce;
+ float mfac= 1.0-fac;
+
+ pchan= tree->pchan[target->tip];
+
+ /* end effector in world space */
+ Mat4CpyMat4(end_pose, pchan->pose_mat);
+ VECCOPY(end_pose[3], pchan->pose_tail);
+ Mat4MulSerie(world_pose, goalinv, ob->obmat, end_pose, 0, 0, 0, 0, 0);
+
+ /* blend position */
+ goalpos[0]= fac*goalpos[0] + mfac*world_pose[3][0];
+ goalpos[1]= fac*goalpos[1] + mfac*world_pose[3][1];
+ goalpos[2]= fac*goalpos[2] + mfac*world_pose[3][2];
+
+ /* blend rotation */
+ Mat3ToQuat(goalrot, q1);
+ Mat4ToQuat(world_pose, q2);
+ QuatInterpol(q, q1, q2, mfac);
+ QuatToMat3(q, goalrot);
+ }
+
+ iktarget= iktree[target->tip];
+
+ if(data->weight != 0.0) {
+ if(poleconstrain)
+ IK_SolverSetPoleVectorConstraint(solver, iktarget, goalpos,
+ polepos, data->poleangle*M_PI/180, (poleangledata == data));
+ IK_SolverAddGoal(solver, iktarget, goalpos, data->weight);
+ }
+ if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0))
+ if((data->flag & CONSTRAINT_IK_AUTO)==0)
+ IK_SolverAddGoalOrientation(solver, iktarget, goalrot,
+ data->orientweight);
+ }
+
+ /* solve */
+ IK_Solve(solver, 0.0f, tree->iterations);
+
+ if(poleangledata)
+ poleangledata->poleangle= IK_SolverGetPoleAngle(solver)*180/M_PI;
+
+ IK_FreeSolver(solver);
+
+ /* gather basis changes */
+ tree->basis_change= MEM_mallocN(sizeof(float[3][3])*tree->totchannel, "ik basis change");
+ if(hasstretch)
+ ikstretch= MEM_mallocN(sizeof(float)*tree->totchannel, "ik stretch");
+
+ for(a=0; a<tree->totchannel; a++) {
+ IK_GetBasisChange(iktree[a], tree->basis_change[a]);
+
+ if(hasstretch) {
+ /* have to compensate for scaling received from parent */
+ float parentstretch, stretch;
+
+ pchan= tree->pchan[a];
+ parentstretch= (tree->parent[a] >= 0)? ikstretch[tree->parent[a]]: 1.0;
+
+ if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ float trans[3], length;
+
+ IK_GetTranslationChange(iktree[a], trans);
+ length= pchan->bone->length*VecLength(pchan->pose_mat[1]);
+
+ ikstretch[a]= (length == 0.0)? 1.0: (trans[1]+length)/length;
+ }
+ else
+ ikstretch[a] = 1.0;
+
+ stretch= (parentstretch == 0.0)? 1.0: ikstretch[a]/parentstretch;
+
+ VecMulf(tree->basis_change[a][0], stretch);
+ VecMulf(tree->basis_change[a][1], stretch);
+ VecMulf(tree->basis_change[a][2], stretch);
+ }
+
+ if(resultblend && resultinf!=1.0f) {
+ Mat3One(identity);
+ Mat3BlendMat3(tree->basis_change[a], identity,
+ tree->basis_change[a], resultinf);
+ }
+
+ IK_FreeSegment(iktree[a]);
+ }
+
+ MEM_freeN(iktree);
+ if(ikstretch) MEM_freeN(ikstretch);
+}
+
+static void free_posetree(PoseTree *tree)
+{
+ BLI_freelistN(&tree->targets);
+ if(tree->pchan) MEM_freeN(tree->pchan);
+ if(tree->parent) MEM_freeN(tree->parent);
+ if(tree->basis_change) MEM_freeN(tree->basis_change);
+ MEM_freeN(tree);
+}
+
+///----------------------------------------
+/// Plugin API for legacy iksolver
+
+void iksolver_initialize_tree(struct Scene *scene, struct Object *ob, float ctime)
+{
+ bPoseChannel *pchan;
+
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if(pchan->constflag & PCHAN_HAS_IK) // flag is set on editing constraints
+ initialize_posetree(ob, pchan); // will attach it to root!
+ }
+ ob->pose->flag &= ~POSE_WAS_REBUILT;
+}
+
+void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime)
+{
+ while(pchan->iktree.first) {
+ PoseTree *tree= pchan->iktree.first;
+ int a;
+
+ /* 4. walk over the tree for regular solving */
+ for(a=0; a<tree->totchannel; a++) {
+ if(!(tree->pchan[a]->flag & POSE_DONE)) // successive trees can set the flag
+ where_is_pose_bone(scene, ob, tree->pchan[a], ctime);
+ // tell blender that this channel was controlled by IK, it's cleared on each where_is_pose()
+ tree->pchan[a]->flag |= POSE_CHAIN;
+ }
+ /* 5. execute the IK solver */
+ execute_posetree(ob, tree);
+
+ /* 6. apply the differences to the channels,
+ we need to calculate the original differences first */
+ for(a=0; a<tree->totchannel; a++)
+ make_dmats(tree->pchan[a]);
+
+ for(a=0; a<tree->totchannel; a++)
+ /* sets POSE_DONE */
+ where_is_ik_bone(tree->pchan[a], tree->basis_change[a]);
+
+ /* 7. and free */
+ BLI_remlink(&pchan->iktree, tree);
+ free_posetree(tree);
+ }
+}
+
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.h b/source/blender/ikplugin/intern/iksolver_plugin.h
new file mode 100644
index 00000000000..d5d1d9a77da
--- /dev/null
+++ b/source/blender/ikplugin/intern/iksolver_plugin.h
@@ -0,0 +1,47 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef IKSOLVER_PLUGIN_H
+#define IKSOLVER_PLUGIN_H
+
+#include "ikplugin_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void iksolver_initialize_tree(struct Scene *scene, struct Object *ob, float ctime);
+void iksolver_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // IKSOLVER_PLUGIN_H
+
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
new file mode 100644
index 00000000000..b6278e40ea5
--- /dev/null
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -0,0 +1,1786 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <vector>
+
+// iTaSC headers
+#include "Armature.hpp"
+#include "MovingFrame.hpp"
+#include "CopyPose.hpp"
+#include "WSDLSSolver.hpp"
+#include "WDLSSolver.hpp"
+#include "Scene.hpp"
+#include "Cache.hpp"
+#include "Distance.hpp"
+
+#include "MEM_guardedalloc.h"
+
+extern "C" {
+#include "BIK_api.h"
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "BKE_global.h"
+#include "BKE_armature.h"
+#include "BKE_action.h"
+#include "BKE_utildefines.h"
+#include "BKE_constraint.h"
+#include "DNA_object_types.h"
+#include "DNA_action_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_scene_types.h"
+};
+
+#include "itasc_plugin.h"
+
+// default parameters
+bItasc DefIKParam;
+
+// in case of animation mode, feedback and timestep is fixed
+#define ANIM_TIMESTEP 1.0
+#define ANIM_FEEDBACK 0.8
+#define ANIM_QMAX 0.52
+
+
+// Structure pointed by bPose.ikdata
+// It contains everything needed to simulate the armatures
+// There can be several simulation islands independent to each other
+struct IK_Data
+{
+ struct IK_Scene* first;
+};
+
+typedef float Vector3[3];
+typedef float Vector4[4];
+struct IK_Target;
+typedef void (*ErrorCallback)(const iTaSC::ConstraintValues* values, unsigned int nvalues, IK_Target* iktarget);
+// For some reason, gcc doesn't find the declaration of this function in linux
+void KDL::SetToZero(JntArray& array);
+
+// one structure for each target in the scene
+struct IK_Target
+{
+ iTaSC::MovingFrame* target;
+ iTaSC::ConstraintSet* constraint;
+ struct bConstraint* blenderConstraint;
+ struct bPoseChannel* rootChannel;
+ Object* owner; //for auto IK
+ ErrorCallback errorCallback;
+ std::string targetName;
+ std::string constraintName;
+ unsigned short controlType;
+ short channel; //index in IK channel array of channel on which this target is defined
+ short ee; //end effector number
+ bool simulation; //true when simulation mode is used (update feedback)
+ bool eeBlend; //end effector affected by enforce blending
+ float eeRest[4][4]; //end effector initial pose relative to armature
+
+ IK_Target() {
+ target = NULL;
+ constraint = NULL;
+ blenderConstraint = NULL;
+ rootChannel = NULL;
+ owner = NULL;
+ controlType = 0;
+ channel = 0;
+ ee = 0;
+ eeBlend = true;
+ simulation = true;
+ targetName.reserve(32);
+ constraintName.reserve(32);
+ }
+ ~IK_Target() {
+ if (constraint)
+ delete constraint;
+ if (target)
+ delete target;
+ }
+};
+
+struct IK_Channel {
+ bPoseChannel* pchan; // channel where we must copy matrix back
+ KDL::Frame frame; // frame of the bone relative to object base, not armature base
+ std::string tail; // segment name of the joint from which we get the bone tail
+ std::string head; // segment name of the joint from which we get the bone head
+ int parent; // index in this array of the parent channel
+ short jointType; // type of joint, combination of IK_SegmentFlag
+ char ndof; // number of joint angles for this channel
+ char jointValid; // set to 1 when jointValue has been computed
+ // for joint constraint
+ Object* owner; // for pose and IK param
+ double jointValue[4]; // computed joint value
+
+ IK_Channel() {
+ pchan = NULL;
+ parent = -1;
+ jointType = 0;
+ ndof = 0;
+ jointValid = 0;
+ owner = NULL;
+ jointValue[0] = 0.0;
+ jointValue[1] = 0.0;
+ jointValue[2] = 0.0;
+ jointValue[3] = 0.0;
+ }
+};
+
+struct IK_Scene
+{
+ IK_Scene* next;
+ int numchan; // number of channel in pchan
+ int numjoint; // number of joint in jointArray
+ // array of bone information, one per channel in the tree
+ IK_Channel* channels;
+ iTaSC::Armature* armature;
+ iTaSC::Cache* cache;
+ iTaSC::Scene* scene;
+ iTaSC::MovingFrame* base; // armature base object
+ KDL::Frame baseFrame; // frame of armature base relative to blArmature
+ KDL::JntArray jointArray; // buffer for storing temporary joint array
+ iTaSC::Solver* solver;
+ Object* blArmature;
+ struct bConstraint* polarConstraint;
+ std::vector<IK_Target*> targets;
+
+ IK_Scene() {
+ next = NULL;
+ channels = NULL;
+ armature = NULL;
+ cache = NULL;
+ scene = NULL;
+ base = NULL;
+ solver = NULL;
+ blArmature = NULL;
+ numchan = 0;
+ numjoint = 0;
+ polarConstraint = NULL;
+ }
+
+ ~IK_Scene() {
+ // delete scene first
+ if (scene)
+ delete scene;
+ for(std::vector<IK_Target*>::iterator it = targets.begin(); it != targets.end(); ++it)
+ delete (*it);
+ targets.clear();
+ if (channels)
+ delete [] channels;
+ if (solver)
+ delete solver;
+ if (armature)
+ delete armature;
+ if (base)
+ delete base;
+ // delete cache last
+ if (cache)
+ delete cache;
+ }
+};
+
+// type of IK joint, can be combined to list the joints corresponding to a bone
+enum IK_SegmentFlag {
+ IK_XDOF = 1,
+ IK_YDOF = 2,
+ IK_ZDOF = 4,
+ IK_SWING = 8,
+ IK_REVOLUTE = 16,
+ IK_TRANSY = 32,
+};
+
+enum IK_SegmentAxis {
+ IK_X = 0,
+ IK_Y = 1,
+ IK_Z = 2,
+ IK_TRANS_X = 3,
+ IK_TRANS_Y = 4,
+ IK_TRANS_Z = 5
+};
+
+static int initialize_chain(Object *ob, bPoseChannel *pchan_tip, bConstraint *con)
+{
+ bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
+ PoseTree *tree;
+ PoseTarget *target;
+ bKinematicConstraint *data;
+ int a, t, segcount= 0, size, newsize, *oldparent, parent, rootbone, treecount;
+
+ data=(bKinematicConstraint*)con->data;
+
+ /* exclude tip from chain? */
+ if(!(data->flag & CONSTRAINT_IK_TIP))
+ pchan_tip= pchan_tip->parent;
+
+ rootbone = data->rootbone;
+ /* Find the chain's root & count the segments needed */
+ for (curchan = pchan_tip; curchan; curchan=curchan->parent){
+ pchan_root = curchan;
+
+ if (++segcount > 255) // 255 is weak
+ break;
+
+ if(segcount==rootbone){
+ // reached this end of the chain but if the chain is overlapping with a
+ // previous one, we must go back up to the root of the other chain
+ if ((curchan->flag & POSE_CHAIN) && curchan->iktree.first == NULL){
+ rootbone++;
+ continue;
+ }
+ break;
+ }
+
+ if (curchan->iktree.first != NULL)
+ // Oh oh, there is already a chain starting from this channel and our chain is longer...
+ // Should handle this by moving the previous chain up to the begining of our chain
+ // For now we just stop here
+ break;
+ }
+ if (!segcount) return 0;
+ // we reached a limit and still not the end of a previous chain, quit
+ if ((pchan_root->flag & POSE_CHAIN) && pchan_root->iktree.first == NULL) return 0;
+
+ // now that we know how many segment we have, set the flag
+ for (rootbone = segcount, segcount = 0, curchan = pchan_tip; segcount < rootbone; segcount++, curchan=curchan->parent) {
+ chanlist[segcount]=curchan;
+ curchan->flag |= POSE_CHAIN;
+ }
+
+ /* setup the chain data */
+ /* create a target */
+ target= (PoseTarget*)MEM_callocN(sizeof(PoseTarget), "posetarget");
+ target->con= con;
+ // by contruction there can be only one tree per channel and each channel can be part of at most one tree.
+ tree = (PoseTree*)pchan_root->iktree.first;
+
+ if(tree==NULL) {
+ /* make new tree */
+ tree= (PoseTree*)MEM_callocN(sizeof(PoseTree), "posetree");
+
+ tree->iterations= data->iterations;
+ tree->totchannel= segcount;
+ tree->stretch = (data->flag & CONSTRAINT_IK_STRETCH);
+
+ tree->pchan= (bPoseChannel**)MEM_callocN(segcount*sizeof(void*), "ik tree pchan");
+ tree->parent= (int*)MEM_callocN(segcount*sizeof(int), "ik tree parent");
+ for(a=0; a<segcount; a++) {
+ tree->pchan[a]= chanlist[segcount-a-1];
+ tree->parent[a]= a-1;
+ }
+ target->tip= segcount-1;
+
+ /* AND! link the tree to the root */
+ BLI_addtail(&pchan_root->iktree, tree);
+ // new tree
+ treecount = 1;
+ }
+ else {
+ tree->iterations= MAX2(data->iterations, tree->iterations);
+ tree->stretch= tree->stretch && !(data->flag & CONSTRAINT_IK_STRETCH);
+
+ /* skip common pose channels and add remaining*/
+ size= MIN2(segcount, tree->totchannel);
+ a = t = 0;
+ while (a<size && t<tree->totchannel) {
+ // locate first matching channel
+ for (;t<tree->totchannel && tree->pchan[t]!=chanlist[segcount-a-1];t++);
+ if (t>=tree->totchannel)
+ break;
+ for(; a<size && t<tree->totchannel && tree->pchan[t]==chanlist[segcount-a-1]; a++, t++);
+ }
+ parent= a-1;
+ segcount= segcount-a;
+ target->tip= tree->totchannel + segcount - 1;
+
+ if (segcount > 0) {
+ /* resize array */
+ newsize= tree->totchannel + segcount;
+ oldchan= tree->pchan;
+ oldparent= tree->parent;
+
+ tree->pchan= (bPoseChannel**)MEM_callocN(newsize*sizeof(void*), "ik tree pchan");
+ tree->parent= (int*)MEM_callocN(newsize*sizeof(int), "ik tree parent");
+ memcpy(tree->pchan, oldchan, sizeof(void*)*tree->totchannel);
+ memcpy(tree->parent, oldparent, sizeof(int)*tree->totchannel);
+ MEM_freeN(oldchan);
+ MEM_freeN(oldparent);
+
+ /* add new pose channels at the end, in reverse order */
+ for(a=0; a<segcount; a++) {
+ tree->pchan[tree->totchannel+a]= chanlist[segcount-a-1];
+ tree->parent[tree->totchannel+a]= tree->totchannel+a-1;
+ }
+ tree->parent[tree->totchannel]= parent;
+
+ tree->totchannel= newsize;
+ }
+ // reusing tree
+ treecount = 0;
+ }
+
+ /* add target to the tree */
+ BLI_addtail(&tree->targets, target);
+ /* mark root channel having an IK tree */
+ pchan_root->flag |= POSE_IKTREE;
+ return treecount;
+}
+
+static bool is_cartesian_constraint(bConstraint *con)
+{
+ bKinematicConstraint* data=(bKinematicConstraint*)con->data;
+
+ return true;
+}
+
+static bool constraint_valid(bConstraint *con)
+{
+ bKinematicConstraint* data=(bKinematicConstraint*)con->data;
+
+ if (data->flag & CONSTRAINT_IK_AUTO)
+ return true;
+ if (con->flag & CONSTRAINT_DISABLE)
+ return false;
+ if (is_cartesian_constraint(con)) {
+ /* cartesian space constraint */
+ if (data->tar==NULL)
+ return false;
+ if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0)
+ return false;
+ }
+ return true;
+}
+
+int initialize_scene(Object *ob, bPoseChannel *pchan_tip)
+{
+ bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
+ PoseTree *tree;
+ PoseTarget *target;
+ bConstraint *con;
+ bKinematicConstraint *data;
+ int a, segcount= 0, size, newsize, *oldparent, parent, rootbone, treecount;
+
+ /* find all IK constraints and validate them */
+ treecount = 0;
+ for(con= (bConstraint *)pchan_tip->constraints.first; con; con= (bConstraint *)con->next) {
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ if (constraint_valid(con))
+ treecount += initialize_chain(ob, pchan_tip, con);
+ }
+ }
+ return treecount;
+}
+
+static IK_Data* get_ikdata(bPose *pose)
+{
+ if (pose->ikdata)
+ return (IK_Data*)pose->ikdata;
+ pose->ikdata = MEM_callocN(sizeof(IK_Data), "iTaSC ikdata");
+ // here init ikdata if needed
+ // now that we have scene, make sure the default param are initialized
+ if (!DefIKParam.iksolver)
+ init_pose_itasc(&DefIKParam);
+
+ return (IK_Data*)pose->ikdata;
+}
+static double EulerAngleFromMatrix(const KDL::Rotation& R, int axis)
+{
+ double t = KDL::sqrt(R(0,0)*R(0,0) + R(0,1)*R(0,1));
+
+ if (t > 16.0*KDL::epsilon) {
+ if (axis == 0) return -KDL::atan2(R(1,2), R(2,2));
+ else if(axis == 1) return KDL::atan2(-R(0,2), t);
+ else return -KDL::atan2(R(0,1), R(0,0));
+ } else {
+ if (axis == 0) return -KDL::atan2(-R(2,1), R(1,1));
+ else if(axis == 1) return KDL::atan2(-R(0,2), t);
+ else return 0.0f;
+ }
+}
+
+static double ComputeTwist(const KDL::Rotation& R)
+{
+ // qy and qw are the y and w components of the quaternion from R
+ double qy = R(0,2) - R(2,0);
+ double qw = R(0,0) + R(1,1) + R(2,2) + 1;
+
+ double tau = 2*KDL::atan2(qy, qw);
+
+ return tau;
+}
+
+static void RemoveEulerAngleFromMatrix(KDL::Rotation& R, double angle, int axis)
+{
+ // compute twist parameter
+ KDL::Rotation T;
+ switch (axis) {
+ case 0:
+ T = KDL::Rotation::RotX(-angle);
+ break;
+ case 1:
+ T = KDL::Rotation::RotY(-angle);
+ break;
+ case 2:
+ T = KDL::Rotation::RotZ(-angle);
+ break;
+ default:
+ return;
+ }
+ // remove angle
+ R = R*T;
+}
+
+static void GetEulerXZY(const KDL::Rotation& R, double& X,double& Z,double& Y)
+{
+ if (fabs(R(0,1)) > 1.0 - KDL::epsilon ) {
+ X = -KDL::sign(R(0,1)) * KDL::atan2(R(1,2), R(1,0));
+ Z = -KDL::sign(R(0,1)) * KDL::PI / 2;
+ Y = 0.0 ;
+ } else {
+ X = KDL::atan2(R(2,1), R(1,1));
+ Z = KDL::atan2(-R(0,1), KDL::sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,2))));
+ Y = KDL::atan2(R(0,2), R(0,0));
+ }
+}
+
+static void GetEulerXYZ(const KDL::Rotation& R, double& X,double& Y,double& Z)
+{
+ if (fabs(R(0,2)) > 1.0 - KDL::epsilon ) {
+ X = KDL::sign(R(0,2)) * KDL::atan2(-R(1,0), R(1,1));
+ Y = KDL::sign(R(0,2)) * KDL::PI / 2;
+ Z = 0.0 ;
+ } else {
+ X = KDL::atan2(-R(1,2), R(2,2));
+ Y = KDL::atan2(R(0,2), KDL::sqrt( KDL::sqr(R(0,0)) + KDL::sqr(R(0,1))));
+ Z = KDL::atan2(-R(0,1), R(0,0));
+ }
+}
+
+static void GetJointRotation(KDL::Rotation& boneRot, int type, double* rot)
+{
+ switch (type & ~IK_TRANSY)
+ {
+ default:
+ // fixed bone, no joint
+ break;
+ case IK_XDOF:
+ // RX only, get the X rotation
+ rot[0] = EulerAngleFromMatrix(boneRot, 0);
+ break;
+ case IK_YDOF:
+ // RY only, get the Y rotation
+ rot[0] = ComputeTwist(boneRot);
+ break;
+ case IK_ZDOF:
+ // RZ only, get the Z rotation
+ rot[0] = EulerAngleFromMatrix(boneRot, 2);
+ break;
+ case IK_XDOF|IK_YDOF:
+ rot[1] = ComputeTwist(boneRot);
+ RemoveEulerAngleFromMatrix(boneRot, rot[1], 1);
+ rot[0] = EulerAngleFromMatrix(boneRot, 0);
+ break;
+ case IK_SWING:
+ // RX+RZ
+ boneRot.GetXZRot().GetValue(rot);
+ break;
+ case IK_YDOF|IK_ZDOF:
+ // RZ+RY
+ rot[1] = ComputeTwist(boneRot);
+ RemoveEulerAngleFromMatrix(boneRot, rot[1], 1);
+ rot[0] = EulerAngleFromMatrix(boneRot, 2);
+ break;
+ case IK_SWING|IK_YDOF:
+ rot[2] = ComputeTwist(boneRot);
+ RemoveEulerAngleFromMatrix(boneRot, rot[2], 1);
+ boneRot.GetXZRot().GetValue(rot);
+ break;
+ case IK_REVOLUTE:
+ boneRot.GetRot().GetValue(rot);
+ break;
+ }
+}
+
+static bool target_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Frame& current, iTaSC::Frame& next, void *param)
+{
+ IK_Target* target = (IK_Target*)param;
+ // compute next target position
+ // get target matrix from constraint.
+ bConstraint* constraint = (bConstraint*)target->blenderConstraint;
+ float tarmat[4][4];
+
+ get_constraint_target_matrix(constraint, 0, CONSTRAINT_OBTYPE_OBJECT, target->owner, tarmat, 1.0);
+
+ // rootmat contains the target pose in world coordinate
+ // if enforce is != 1.0, blend the target position with the end effector position
+ // if the armature was in rest position. This information is available in eeRest
+ if (constraint->enforce != 1.0f && target->eeBlend) {
+ // eeRest is relative to the reference frame of the IK root
+ // get this frame in world reference
+ float restmat[4][4];
+ bPoseChannel* pchan = target->rootChannel;
+ if (pchan->parent) {
+ pchan = pchan->parent;
+ float chanmat[4][4];
+ Mat4CpyMat4(chanmat, pchan->pose_mat);
+ VECCOPY(chanmat[3], pchan->pose_tail);
+ Mat4MulSerie(restmat, target->owner->obmat, chanmat, target->eeRest, NULL, NULL, NULL, NULL, NULL);
+ }
+ else {
+ Mat4MulMat4(restmat, target->eeRest, target->owner->obmat);
+ }
+ // blend the target
+ Mat4BlendMat4(tarmat, restmat, tarmat, constraint->enforce);
+ }
+ next.setValue(&tarmat[0][0]);
+ return true;
+}
+
+static bool base_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Frame& current, iTaSC::Frame& next, void *param)
+{
+ IK_Scene* ikscene = (IK_Scene*)param;
+ // compute next armature base pose
+ // algorithm:
+ // ikscene->pchan[0] is the root channel of the tree
+ // if it has a parent, get the pose matrix from it and replace [3] by parent pchan->tail
+ // then multiply by the armature matrix to get ikscene->armature base position
+ bPoseChannel* pchan = ikscene->channels[0].pchan;
+ float rootmat[4][4];
+ if (pchan->parent) {
+ pchan = pchan->parent;
+ float chanmat[4][4];
+ Mat4CpyMat4(chanmat, pchan->pose_mat);
+ VECCOPY(chanmat[3], pchan->pose_tail);
+ // save the base as a frame too so that we can compute deformation
+ // after simulation
+ ikscene->baseFrame.setValue(&chanmat[0][0]);
+ Mat4MulMat4(rootmat, chanmat, ikscene->blArmature->obmat);
+ }
+ else {
+ Mat4CpyMat4(rootmat, ikscene->blArmature->obmat);
+ ikscene->baseFrame = iTaSC::F_identity;
+ }
+ next.setValue(&rootmat[0][0]);
+ // if there is a polar target (only during solving otherwise we don't have end efffector)
+ if (ikscene->polarConstraint && timestamp.update) {
+ // compute additional rotation of base frame so that armature follows the polar target
+ float imat[4][4]; // IK tree base inverse matrix
+ float polemat[4][4]; // polar target in IK tree base frame
+ float goalmat[4][4]; // target in IK tree base frame
+ float mat[4][4]; // temp matrix
+ bKinematicConstraint* poledata = (bKinematicConstraint*)ikscene->polarConstraint->data;
+
+ Mat4Invert(imat, rootmat);
+ // polar constraint imply only one target
+ IK_Target *iktarget = ikscene->targets[0];
+ // root channel from which we take the bone initial orientation
+ IK_Channel &rootchan = ikscene->channels[0];
+
+ // get polar target matrix in world space
+ get_constraint_target_matrix(ikscene->polarConstraint, 1, CONSTRAINT_OBTYPE_OBJECT, ikscene->blArmature, mat, 1.0);
+ // convert to armature space
+ Mat4MulMat4(polemat, mat, imat);
+ // get the target in world space (was computed before as target object are defined before base object)
+ iktarget->target->getPose().getValue(mat[0]);
+ // convert to armature space
+ Mat4MulMat4(goalmat, mat, imat);
+ // take position of target, polar target, end effector, in armature space
+ KDL::Vector goalpos(goalmat[3]);
+ KDL::Vector polepos(polemat[3]);
+ KDL::Vector endpos = ikscene->armature->getPose(iktarget->ee).p;
+ // get root bone orientation
+ KDL::Frame rootframe;
+ ikscene->armature->getRelativeFrame(rootframe, rootchan.tail);
+ KDL::Vector rootx = rootframe.M.UnitX();
+ KDL::Vector rootz = rootframe.M.UnitZ();
+ // and compute root bone head
+ double q_rest[3], q[3], length;
+ const KDL::Joint* joint;
+ const KDL::Frame* tip;
+ ikscene->armature->getSegment(rootchan.tail, 3, joint, q_rest[0], q[0], tip);
+ length = (joint->getType() == KDL::Joint::TransY) ? q[0] : tip->p(1);
+ KDL::Vector rootpos = rootframe.p - length*rootframe.M.UnitY();
+
+ // compute main directions
+ KDL::Vector dir = KDL::Normalize(endpos - rootpos);
+ KDL::Vector poledir = KDL::Normalize(goalpos-rootpos);
+ // compute up directions
+ KDL::Vector poleup = KDL::Normalize(polepos-rootpos);
+ KDL::Vector up = rootx*KDL::cos(poledata->poleangle) + rootz*KDL::sin(poledata->poleangle);
+ // from which we build rotation matrix
+ KDL::Rotation endrot, polerot;
+ // for the armature, using the root bone orientation
+ KDL::Vector x = KDL::Normalize(dir*up);
+ endrot.UnitX(x);
+ endrot.UnitY(KDL::Normalize(x*dir));
+ endrot.UnitZ(-dir);
+ // for the polar target
+ x = KDL::Normalize(poledir*poleup);
+ polerot.UnitX(x);
+ polerot.UnitY(KDL::Normalize(x*poledir));
+ polerot.UnitZ(-poledir);
+ // the difference between the two is the rotation we want to apply
+ KDL::Rotation result(polerot*endrot.Inverse());
+ // apply on base frame as this is an artificial additional rotation
+ next.M = next.M*result;
+ ikscene->baseFrame.M = ikscene->baseFrame.M*result;
+ }
+ return true;
+}
+
+static bool copypose_callback(const iTaSC::Timestamp& timestamp, iTaSC::ConstraintValues* const _values, unsigned int _nvalues, void* _param)
+{
+ IK_Target* iktarget =(IK_Target*)_param;
+ bKinematicConstraint *condata = (bKinematicConstraint *)iktarget->blenderConstraint->data;
+ iTaSC::ConstraintValues* values = _values;
+ bItasc* ikparam = (bItasc*) iktarget->owner->pose->ikparam;
+ iTaSC::ConstraintSingleValue* value;
+ double error;
+ int i;
+
+ // we need default parameters
+ if (!ikparam)
+ ikparam = &DefIKParam;
+
+ if (iktarget->blenderConstraint->flag & CONSTRAINT_OFF) {
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_POSITION) {
+ values->alpha = 0.0;
+ values->action = iTaSC::ACT_ALPHA;
+ values++;
+ }
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_ROTATION) {
+ values->alpha = 0.0;
+ values->action = iTaSC::ACT_ALPHA;
+ values++;
+ }
+ } else {
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_POSITION) {
+ // update error
+ values->alpha = condata->weight;
+ values->action = iTaSC::ACT_ALPHA|iTaSC::ACT_FEEDBACK;
+ values->feedback = (iktarget->simulation) ? ikparam->feedback : ANIM_FEEDBACK;
+ values++;
+ }
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_ROTATION) {
+ // update error
+ values->alpha = condata->orientweight;
+ values->action = iTaSC::ACT_ALPHA|iTaSC::ACT_FEEDBACK;
+ values->feedback = (iktarget->simulation) ? ikparam->feedback : ANIM_FEEDBACK;
+ values++;
+ }
+ }
+ return true;
+}
+
+static void copypose_error(const iTaSC::ConstraintValues* values, unsigned int nvalues, IK_Target* iktarget)
+{
+ iTaSC::ConstraintSingleValue* value;
+ double error;
+ int i;
+
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_POSITION) {
+ // update error
+ for (i=0, error=0.0, value=values->values; i<values->number; ++i, ++value)
+ error += KDL::sqr(value->y - value->yd);
+ iktarget->blenderConstraint->lin_error = (float)KDL::sqrt(error);
+ values++;
+ }
+ if (iktarget->controlType & iTaSC::CopyPose::CTL_ROTATION) {
+ // update error
+ for (i=0, error=0.0, value=values->values; i<values->number; ++i, ++value)
+ error += KDL::sqr(value->y - value->yd);
+ iktarget->blenderConstraint->rot_error = (float)KDL::sqrt(error);
+ values++;
+ }
+}
+
+static bool distance_callback(const iTaSC::Timestamp& timestamp, iTaSC::ConstraintValues* const _values, unsigned int _nvalues, void* _param)
+{
+ IK_Target* iktarget =(IK_Target*)_param;
+ bKinematicConstraint *condata = (bKinematicConstraint *)iktarget->blenderConstraint->data;
+ iTaSC::ConstraintValues* values = _values;
+ bItasc* ikparam = (bItasc*) iktarget->owner->pose->ikparam;
+ // we need default parameters
+ if (!ikparam)
+ ikparam = &DefIKParam;
+
+ // update weight according to mode
+ if (iktarget->blenderConstraint->flag & CONSTRAINT_OFF) {
+ values->alpha = 0.0;
+ } else {
+ switch (condata->mode) {
+ case LIMITDIST_INSIDE:
+ values->alpha = (values->values[0].y > condata->dist) ? condata->weight : 0.0;
+ break;
+ case LIMITDIST_OUTSIDE:
+ values->alpha = (values->values[0].y < condata->dist) ? condata->weight : 0.0;
+ break;
+ default:
+ values->alpha = condata->weight;
+ break;
+ }
+ if (!timestamp.substep) {
+ // only update value on first timestep
+ switch (condata->mode) {
+ case LIMITDIST_INSIDE:
+ values->values[0].yd = condata->dist*0.95;
+ break;
+ case LIMITDIST_OUTSIDE:
+ values->values[0].yd = condata->dist*1.05;
+ break;
+ default:
+ values->values[0].yd = condata->dist;
+ break;
+ }
+ values->values[0].action = iTaSC::ACT_VALUE|iTaSC::ACT_FEEDBACK;
+ values->feedback = (iktarget->simulation) ? ikparam->feedback : ANIM_FEEDBACK;
+ }
+ }
+ values->action |= iTaSC::ACT_ALPHA;
+ return true;
+}
+
+static void distance_error(const iTaSC::ConstraintValues* values, unsigned int _nvalues, IK_Target* iktarget)
+{
+ iktarget->blenderConstraint->lin_error = (float)(values->values[0].y - values->values[0].yd);
+}
+
+static bool joint_callback(const iTaSC::Timestamp& timestamp, iTaSC::ConstraintValues* const _values, unsigned int _nvalues, void* _param)
+{
+ IK_Channel* ikchan = (IK_Channel*)_param;
+ bItasc* ikparam = (bItasc*)ikchan->owner->pose->ikparam;
+ bPoseChannel* chan = ikchan->pchan;
+ int dof;
+
+ // a channel can be splitted into multiple joints, so we get called multiple
+ // times for one channel (this callback is only for 1 joint in the armature)
+ // the IK_JointTarget structure is shared between multiple joint constraint
+ // and the target joint values is computed only once, remember this in jointValid
+ // Don't forget to reset it before each frame
+ if (!ikchan->jointValid) {
+ float rmat[3][3];
+
+ if (chan->rotmode > 0) {
+ /* euler rotations (will cause gimble lock, but this can be alleviated a bit with rotation orders) */
+ EulOToMat3(chan->eul, chan->rotmode, rmat);
+ }
+ else if (chan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis-angle - stored in quaternion data, but not really that great for 3D-changing orientations */
+ AxisAngleToMat3(&chan->quat[1], chan->quat[0], rmat);
+ }
+ else {
+ /* quats are normalised before use to eliminate scaling issues */
+ NormalQuat(chan->quat);
+ QuatToMat3(chan->quat, rmat);
+ }
+ KDL::Rotation jointRot(
+ rmat[0][0], rmat[1][0], rmat[2][0],
+ rmat[0][1], rmat[1][1], rmat[2][1],
+ rmat[0][2], rmat[1][2], rmat[2][2]);
+ GetJointRotation(jointRot, ikchan->jointType, ikchan->jointValue);
+ ikchan->jointValid = 1;
+ }
+ // determine which part of jointValue is used for this joint
+ // closely related to the way the joints are defined
+ switch (ikchan->jointType & ~IK_TRANSY)
+ {
+ case IK_XDOF:
+ case IK_YDOF:
+ case IK_ZDOF:
+ dof = 0;
+ break;
+ case IK_XDOF|IK_YDOF:
+ // X + Y
+ dof = (_values[0].id == iTaSC::Armature::ID_JOINT_RX) ? 0 : 1;
+ break;
+ case IK_SWING:
+ // XZ
+ dof = 0;
+ break;
+ case IK_YDOF|IK_ZDOF:
+ // Z + Y
+ dof = (_values[0].id == iTaSC::Armature::ID_JOINT_RZ) ? 0 : 1;
+ break;
+ case IK_SWING|IK_YDOF:
+ // XZ + Y
+ dof = (_values[0].id == iTaSC::Armature::ID_JOINT_RY) ? 2 : 0;
+ break;
+ case IK_REVOLUTE:
+ dof = 0;
+ break;
+ default:
+ dof = -1;
+ break;
+ }
+ if (dof >= 0) {
+ for (int i=0; i<_nvalues; i++, dof++) {
+ _values[i].values[0].yd = ikchan->jointValue[dof];
+ _values[i].alpha = chan->ikrotweight;
+ _values[i].feedback = ikparam->feedback;
+ }
+ }
+ return true;
+}
+
+// build array of joint corresponding to IK chain
+static int convert_channels(IK_Scene *ikscene, PoseTree *tree)
+{
+ IK_Channel *ikchan;
+ bPoseChannel *pchan;
+ PoseTarget* target;
+ Bone *bone;
+ int a, flag, njoint;
+
+ njoint = 0;
+ for(a=0, ikchan = ikscene->channels; a<ikscene->numchan; ++a, ++ikchan) {
+ pchan= tree->pchan[a];
+ bone= pchan->bone;
+ ikchan->pchan = pchan;
+ ikchan->parent = (a>0) ? tree->parent[a] : -1;
+ ikchan->owner = ikscene->blArmature;
+
+ /* set DoF flag */
+ flag = 0;
+ if(!(pchan->ikflag & BONE_IK_NO_XDOF) && !(pchan->ikflag & BONE_IK_NO_XDOF_TEMP) &&
+ (!(pchan->ikflag & BONE_IK_XLIMIT) || pchan->limitmin[0]<0.f || pchan->limitmax[0]>0.f))
+ flag |= IK_XDOF;
+ if(!(pchan->ikflag & BONE_IK_NO_YDOF) && !(pchan->ikflag & BONE_IK_NO_YDOF_TEMP) &&
+ (!(pchan->ikflag & BONE_IK_YLIMIT) || pchan->limitmin[1]<0.f || pchan->limitmax[1]>0.f))
+ flag |= IK_YDOF;
+ if(!(pchan->ikflag & BONE_IK_NO_ZDOF) && !(pchan->ikflag & BONE_IK_NO_ZDOF_TEMP) &&
+ (!(pchan->ikflag & BONE_IK_ZLIMIT) || pchan->limitmin[2]<0.f || pchan->limitmax[2]>0.f))
+ flag |= IK_ZDOF;
+
+ if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ flag |= IK_TRANSY;
+ }
+ /*
+ Logic to create the segments:
+ RX,RY,RZ = rotational joints with no length
+ RY(tip) = rotational joints with a fixed length arm = (0,length,0)
+ TY = translational joint on Y axis
+ F(pos) = fixed joint with an arm at position pos
+ Conversion rule of the above flags:
+ - ==> F(tip)
+ X ==> RX(tip)
+ Y ==> RY(tip)
+ Z ==> RZ(tip)
+ XY ==> RX+RY(tip)
+ XZ ==> RX+RZ(tip)
+ YZ ==> RZ+RY(tip)
+ XYZ ==> full spherical unless there are limits, in which case RX+RZ+RY(tip)
+ In case of stretch, tip=(0,0,0) and there is an additional TY joint
+ The frame at last of these joints represents the tail of the bone.
+ The head is computed by a reverse translation on Y axis of the bone length
+ or in case of TY joint, by the frame at previous joint.
+ In case of separation of bones, there is an additional F(head) joint
+
+ Computing rest pose and length is complicated: the solver works in world space
+ Here is the logic:
+ rest position is computed only from bone->bone_mat.
+ bone length is computed from bone->length multiplied by the scaling factor of
+ the armature. Non-uniform scaling will give bad result!
+
+ */
+ switch (flag & (IK_XDOF|IK_YDOF|IK_ZDOF))
+ {
+ default:
+ ikchan->jointType = 0;
+ ikchan->ndof = 0;
+ break;
+ case IK_XDOF:
+ // RX only, get the X rotation
+ ikchan->jointType = IK_XDOF;
+ ikchan->ndof = 1;
+ break;
+ case IK_YDOF:
+ // RY only, get the Y rotation
+ ikchan->jointType = IK_YDOF;
+ ikchan->ndof = 1;
+ break;
+ case IK_ZDOF:
+ // RZ only, get the Zz rotation
+ ikchan->jointType = IK_ZDOF;
+ ikchan->ndof = 1;
+ break;
+ case IK_XDOF|IK_YDOF:
+ ikchan->jointType = IK_XDOF|IK_YDOF;
+ ikchan->ndof = 2;
+ break;
+ case IK_XDOF|IK_ZDOF:
+ // RX+RZ
+ ikchan->jointType = IK_SWING;
+ ikchan->ndof = 2;
+ break;
+ case IK_YDOF|IK_ZDOF:
+ // RZ+RY
+ ikchan->jointType = IK_ZDOF|IK_YDOF;
+ ikchan->ndof = 2;
+ break;
+ case IK_XDOF|IK_YDOF|IK_ZDOF:
+ // spherical joint
+ if (pchan->ikflag & (BONE_IK_XLIMIT|BONE_IK_YLIMIT|BONE_IK_ZLIMIT))
+ // decompose in a Swing+RotY joint
+ ikchan->jointType = IK_SWING|IK_YDOF;
+ else
+ ikchan->jointType = IK_REVOLUTE;
+ ikchan->ndof = 3;
+ break;
+ }
+ if (flag & IK_TRANSY) {
+ ikchan->jointType |= IK_TRANSY;
+ ikchan->ndof++;
+ }
+ njoint += ikchan->ndof;
+ }
+ // njoint is the joint coordinate, create the Joint Array
+ ikscene->jointArray.resize(njoint);
+ ikscene->numjoint = njoint;
+ return njoint;
+}
+
+// compute array of joint value corresponding to current pose
+static void convert_pose(IK_Scene *ikscene)
+{
+ KDL::Rotation boneRot;
+ bPoseChannel *pchan;
+ IK_Channel *ikchan;
+ Bone *bone;
+ float rmat[4][4]; // rest pose of bone with parent taken into account
+ float bmat[4][4]; // difference
+ float scale;
+ double *rot;
+ int a, joint;
+
+ // assume uniform scaling and take Y scale as general scale for the armature
+ scale = VecLength(ikscene->blArmature->obmat[1]);
+ rot = &ikscene->jointArray(0);
+ for(joint=a=0, ikchan = ikscene->channels; a<ikscene->numchan && joint<ikscene->numjoint; ++a, ++ikchan) {
+ pchan= ikchan->pchan;
+ bone= pchan->bone;
+
+ if (pchan->parent) {
+ Mat4One(bmat);
+ Mat4MulMat43(bmat, pchan->parent->pose_mat, bone->bone_mat);
+ } else {
+ Mat4CpyMat4(bmat, bone->arm_mat);
+ }
+ Mat4Invert(rmat, bmat);
+ Mat4MulMat4(bmat, pchan->pose_mat, rmat);
+ Mat4Ortho(bmat);
+ boneRot.setValue(bmat[0]);
+ GetJointRotation(boneRot, ikchan->jointType, rot);
+ if (ikchan->jointType & IK_TRANSY) {
+ // compute actual length
+ rot[ikchan->ndof-1] = VecLenf(pchan->pose_tail, pchan->pose_head) * scale;
+ }
+ rot += ikchan->ndof;
+ joint += ikchan->ndof;
+ }
+}
+
+// compute array of joint value corresponding to current pose
+static void rest_pose(IK_Scene *ikscene)
+{
+ bPoseChannel *pchan;
+ IK_Channel *ikchan;
+ Bone *bone;
+ float scale;
+ double *rot;
+ int a, joint;
+
+ // assume uniform scaling and take Y scale as general scale for the armature
+ scale = VecLength(ikscene->blArmature->obmat[1]);
+ // rest pose is 0
+ KDL::SetToZero(ikscene->jointArray);
+ // except for transY joints
+ rot = &ikscene->jointArray(0);
+ for(joint=a=0, ikchan = ikscene->channels; a<ikscene->numchan && joint<ikscene->numjoint; ++a, ++ikchan) {
+ pchan= ikchan->pchan;
+ bone= pchan->bone;
+
+ if (ikchan->jointType & IK_TRANSY)
+ rot[ikchan->ndof-1] = bone->length*scale;
+ rot += ikchan->ndof;
+ joint += ikchan->ndof;
+ }
+}
+
+static IK_Scene* convert_tree(Scene *blscene, Object *ob, bPoseChannel *pchan)
+{
+ PoseTree *tree = (PoseTree*)pchan->iktree.first;
+ PoseTarget *target;
+ bKinematicConstraint *condata;
+ bConstraint *polarcon;
+ bItasc *ikparam;
+ iTaSC::Armature* arm;
+ iTaSC::Scene* scene;
+ IK_Scene* ikscene;
+ IK_Channel* ikchan;
+ KDL::Frame initPose;
+ KDL::Rotation boneRot;
+ Bone *bone;
+ int a, t, numtarget;
+ float length;
+ bool ret = true, ingame;
+ double *rot;
+ double lmin[3], lmax[3];
+
+ if (tree->totchannel == 0)
+ return NULL;
+
+ ikscene = new IK_Scene;
+ arm = new iTaSC::Armature();
+ scene = new iTaSC::Scene();
+ ikscene->channels = new IK_Channel[tree->totchannel];
+ ikscene->numchan = tree->totchannel;
+ ikscene->armature = arm;
+ ikscene->scene = scene;
+ ikparam = (bItasc*)ob->pose->ikparam;
+ ingame = (ob->pose->flag & POSE_GAME_ENGINE);
+ if (!ikparam) {
+ // you must have our own copy
+ ikparam = &DefIKParam;
+ } else if (ingame) {
+ // tweak the param when in game to have efficient stepping
+ // using fixed substep is not effecient since frames in the GE are often
+ // shorter than in animation => move to auto step automatically and set
+ // the target substep duration via min/max
+ if (!(ikparam->flag & ITASC_AUTO_STEP)) {
+ float timestep = blscene->r.frs_sec_base/blscene->r.frs_sec;
+ if (ikparam->numstep > 0)
+ timestep /= ikparam->numstep;
+ // with equal min and max, the algorythm will take this step and the indicative substep most of the time
+ ikparam->minstep = ikparam->maxstep = timestep;
+ ikparam->flag |= ITASC_AUTO_STEP;
+ }
+ }
+ if ((ikparam->flag & ITASC_SIMULATION) && !ingame)
+ // no cache in animation mode
+ ikscene->cache = new iTaSC::Cache();
+
+ switch (ikparam->solver) {
+ case ITASC_SOLVER_SDLS:
+ ikscene->solver = new iTaSC::WSDLSSolver();
+ break;
+ case ITASC_SOLVER_DLS:
+ ikscene->solver = new iTaSC::WDLSSolver();
+ break;
+ default:
+ delete ikscene;
+ return NULL;
+ }
+ ikscene->blArmature = ob;
+
+ std::string joint;
+ std::string root("root");
+ std::string parent;
+ std::vector<double> weights;
+ double weight[3];
+ // assume uniform scaling and take Y scale as general scale for the armature
+ float scale = VecLength(ob->obmat[1]);
+ double X, Y, Z;
+ // build the array of joints corresponding to the IK chain
+ convert_channels(ikscene, tree);
+ if (ingame) {
+ // in the GE, set the initial joint angle to match the current pose
+ // this will update the jointArray in ikscene
+ convert_pose(ikscene);
+ } else {
+ // in Blender, the rest pose is always 0 for joints
+ rest_pose(ikscene);
+ }
+ rot = &ikscene->jointArray(0);
+ for(a=0, ikchan = ikscene->channels; a<tree->totchannel; ++a, ++ikchan) {
+ pchan= ikchan->pchan;
+ bone= pchan->bone;
+
+ KDL::Frame tip(iTaSC::F_identity);
+ Vector3 *fl = bone->bone_mat;
+ KDL::Frame head(KDL::Rotation(
+ fl[0][0], fl[1][0], fl[2][0],
+ fl[0][1], fl[1][1], fl[2][1],
+ fl[0][2], fl[1][2], fl[2][2]),
+ KDL::Vector(bone->head[0], bone->head[1], bone->head[2])*scale);
+
+ // rest pose length of the bone taking scaling into account
+ length= bone->length*scale;
+ parent = (a > 0) ? ikscene->channels[tree->parent[a]].tail : root;
+ // first the fixed segment to the bone head
+ if (head.p.Norm() > KDL::epsilon || head.M.GetRot().Norm() > KDL::epsilon) {
+ joint = bone->name;
+ joint += ":H";
+ ret = arm->addSegment(joint, parent, KDL::Joint::None, 0.0, head);
+ parent = joint;
+ }
+ if (!(ikchan->jointType & IK_TRANSY)) {
+ // fixed length, put it in tip
+ tip.p[1] = length;
+ }
+ joint = bone->name;
+ weight[0] = (1.0-pchan->stiffness[0]);
+ weight[1] = (1.0-pchan->stiffness[1]);
+ weight[2] = (1.0-pchan->stiffness[2]);
+ switch (ikchan->jointType & ~IK_TRANSY)
+ {
+ case 0:
+ // fixed bone
+ if (!(ikchan->jointType & IK_TRANSY)) {
+ joint += ":F";
+ ret = arm->addSegment(joint, parent, KDL::Joint::None, 0.0, tip);
+ }
+ break;
+ case IK_XDOF:
+ // RX only, get the X rotation
+ joint += ":RX";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotX, rot[0], tip);
+ weights.push_back(weight[0]);
+ break;
+ case IK_YDOF:
+ // RY only, get the Y rotation
+ joint += ":RY";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotY, rot[0], tip);
+ weights.push_back(weight[1]);
+ break;
+ case IK_ZDOF:
+ // RZ only, get the Zz rotation
+ joint += ":RZ";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotZ, rot[0], tip);
+ weights.push_back(weight[2]);
+ break;
+ case IK_XDOF|IK_YDOF:
+ joint += ":RX";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotX, rot[0]);
+ weights.push_back(weight[0]);
+ if (ret) {
+ parent = joint;
+ joint = bone->name;
+ joint += ":RY";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotY, rot[1], tip);
+ weights.push_back(weight[1]);
+ }
+ break;
+ case IK_SWING:
+ joint += ":SW";
+ ret = arm->addSegment(joint, parent, KDL::Joint::Swing, rot[0], tip);
+ weights.push_back(weight[0]);
+ weights.push_back(weight[2]);
+ break;
+ case IK_YDOF|IK_ZDOF:
+ // RZ+RY
+ joint += ":RZ";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotZ, rot[0]);
+ weights.push_back(weight[2]);
+ if (ret) {
+ parent = joint;
+ joint = bone->name;
+ joint += ":RY";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotY, rot[1], tip);
+ weights.push_back(weight[1]);
+ }
+ break;
+ case IK_SWING|IK_YDOF:
+ // decompose in a Swing+RotY joint
+ joint += ":SW";
+ ret = arm->addSegment(joint, parent, KDL::Joint::Swing, rot[0]);
+ weights.push_back(weight[0]);
+ weights.push_back(weight[2]);
+ if (ret) {
+ parent = joint;
+ joint = bone->name;
+ joint += ":RY";
+ ret = arm->addSegment(joint, parent, KDL::Joint::RotY, rot[2], tip);
+ weights.push_back(weight[1]);
+ }
+ break;
+ case IK_REVOLUTE:
+ joint += ":SJ";
+ ret = arm->addSegment(joint, parent, KDL::Joint::Sphere, rot[0], tip);
+ weights.push_back(weight[0]);
+ weights.push_back(weight[1]);
+ weights.push_back(weight[2]);
+ break;
+ }
+ if (ret && (ikchan->jointType & IK_TRANSY)) {
+ parent = joint;
+ joint = bone->name;
+ joint += ":TY";
+ ret = arm->addSegment(joint, parent, KDL::Joint::TransY, rot[ikchan->ndof-1]);
+ float ikstretch = pchan->ikstretch*pchan->ikstretch;
+ weight[1] = (1.0-MIN2(1.0-ikstretch, 0.99));
+ weights.push_back(weight[1]);
+ }
+ if (!ret)
+ // error making the armature??
+ break;
+ // joint points to the segment that correspond to the bone per say
+ ikchan->tail = joint;
+ ikchan->head = parent;
+ // in case of error
+ ret = false;
+ if ((ikchan->jointType & IK_XDOF) && (pchan->ikflag & (BONE_IK_XLIMIT|BONE_IK_ROTCTL))) {
+ joint = bone->name;
+ joint += ":RX";
+ if (pchan->ikflag & BONE_IK_XLIMIT) {
+ if (arm->addLimitConstraint(joint, 0, pchan->limitmin[0], pchan->limitmax[0]) < 0)
+ break;
+ }
+ if (pchan->ikflag & BONE_IK_ROTCTL) {
+ if (arm->addConstraint(joint, joint_callback, ikchan, false, false) < 0)
+ break;
+ }
+ }
+ if ((ikchan->jointType & IK_YDOF) && (pchan->ikflag & (BONE_IK_YLIMIT|BONE_IK_ROTCTL))) {
+ joint = bone->name;
+ joint += ":RY";
+ if (pchan->ikflag & BONE_IK_YLIMIT) {
+ if (arm->addLimitConstraint(joint, 0, pchan->limitmin[1], pchan->limitmax[1]) < 0)
+ break;
+ }
+ if (pchan->ikflag & BONE_IK_ROTCTL) {
+ if (arm->addConstraint(joint, joint_callback, ikchan, false, false) < 0)
+ break;
+ }
+ }
+ if ((ikchan->jointType & IK_ZDOF) && (pchan->ikflag & (BONE_IK_ZLIMIT|BONE_IK_ROTCTL))) {
+ joint = bone->name;
+ joint += ":RZ";
+ if (pchan->ikflag & BONE_IK_ZLIMIT) {
+ if (arm->addLimitConstraint(joint, 0, pchan->limitmin[2], pchan->limitmax[2]) < 0)
+ break;
+ }
+ if (pchan->ikflag & BONE_IK_ROTCTL) {
+ if (arm->addConstraint(joint, joint_callback, ikchan, false, false) < 0)
+ break;
+ }
+ }
+ if ((ikchan->jointType & IK_SWING) && (pchan->ikflag & (BONE_IK_XLIMIT|BONE_IK_ZLIMIT|BONE_IK_ROTCTL))) {
+ joint = bone->name;
+ joint += ":SW";
+ if (pchan->ikflag & BONE_IK_XLIMIT) {
+ if (arm->addLimitConstraint(joint, 0, pchan->limitmin[0], pchan->limitmax[0]) < 0)
+ break;
+ }
+ if (pchan->ikflag & BONE_IK_ZLIMIT) {
+ if (arm->addLimitConstraint(joint, 1, pchan->limitmin[2], pchan->limitmax[2]) < 0)
+ break;
+ }
+ if (pchan->ikflag & BONE_IK_ROTCTL) {
+ if (arm->addConstraint(joint, joint_callback, ikchan, false, false) < 0)
+ break;
+ }
+ }
+ if ((ikchan->jointType & IK_REVOLUTE) && (pchan->ikflag & BONE_IK_ROTCTL)) {
+ joint = bone->name;
+ joint += ":SJ";
+ if (arm->addConstraint(joint, joint_callback, ikchan, false, false) < 0)
+ break;
+ }
+ // no error, so restore
+ ret = true;
+ rot += ikchan->ndof;
+ }
+ if (!ret) {
+ delete ikscene;
+ return NULL;
+ }
+ // for each target, we need to add an end effector in the armature
+ for (numtarget=0, polarcon=NULL, ret = true, target=(PoseTarget*)tree->targets.first; target; target=(PoseTarget*)target->next) {
+ condata= (bKinematicConstraint*)target->con->data;
+ pchan = tree->pchan[target->tip];
+
+ if (is_cartesian_constraint(target->con)) {
+ // add the end effector
+ IK_Target* iktarget = new IK_Target();
+ ikscene->targets.push_back(iktarget);
+ iktarget->ee = arm->addEndEffector(ikscene->channels[target->tip].tail);
+ if (iktarget->ee == -1) {
+ ret = false;
+ break;
+ }
+ // initialize all the fields that we can set at this time
+ iktarget->blenderConstraint = target->con;
+ iktarget->channel = target->tip;
+ iktarget->simulation = (ikparam->flag & ITASC_SIMULATION);
+ iktarget->rootChannel = ikscene->channels[0].pchan;
+ iktarget->owner = ob;
+ iktarget->targetName = pchan->bone->name;
+ iktarget->targetName += ":T:";
+ iktarget->targetName += target->con->name;
+ iktarget->constraintName = pchan->bone->name;
+ iktarget->constraintName += ":C:";
+ iktarget->constraintName += target->con->name;
+ numtarget++;
+ if (condata->poletar)
+ // this constraint has a polar target
+ polarcon = target->con;
+ }
+ }
+ // deal with polar target if any
+ if (numtarget == 1 && polarcon) {
+ ikscene->polarConstraint = polarcon;
+ }
+ // we can now add the armature
+ // the armature is based on a moving frame.
+ // initialize with the correct position in case there is no cache
+ base_callback(iTaSC::Timestamp(), iTaSC::F_identity, initPose, ikscene);
+ ikscene->base = new iTaSC::MovingFrame(initPose);
+ ikscene->base->setCallback(base_callback, ikscene);
+ std::string armname;
+ armname = ob->id.name;
+ armname += ":B";
+ ret = scene->addObject(armname, ikscene->base);
+ armname = ob->id.name;
+ armname += ":AR";
+ if (ret)
+ ret = scene->addObject(armname, ikscene->armature, ikscene->base);
+ if (!ret) {
+ delete ikscene;
+ return NULL;
+ }
+ // set the weight
+ e_matrix& Wq = arm->getWq();
+ assert(Wq.cols() == weights.size());
+ for (unsigned int q=0; q<Wq.cols(); q++)
+ Wq(q,q)=weights[q];
+ // get the inverse rest pose frame of the base to compute relative rest pose of end effectors
+ // this is needed to handle the enforce parameter
+ // ikscene->pchan[0] is the root channel of the tree
+ // if it has no parent, then it's just the identify Frame
+ float invBaseFrame[4][4];
+ pchan = ikscene->channels[0].pchan;
+ if (pchan->parent) {
+ // it has a parent, get the pose matrix from it
+ float baseFrame[4][4];
+ pchan = pchan->parent;
+ Mat4CpyMat4(baseFrame, pchan->bone->arm_mat);
+ // move to the tail and scale to get rest pose of armature base
+ VecCopyf(baseFrame[3], pchan->bone->arm_tail);
+ Mat4Invert(invBaseFrame, baseFrame);
+ } else {
+ Mat4One(invBaseFrame);
+ }
+ // finally add the constraint
+ for (t=0; t<ikscene->targets.size(); t++) {
+ IK_Target* iktarget = ikscene->targets[t];
+ condata= (bKinematicConstraint*)iktarget->blenderConstraint->data;
+ pchan = tree->pchan[iktarget->channel];
+ unsigned int controltype, bonecnt;
+ double bonelen;
+ float mat[4][4];
+
+ // add the end effector
+ // estimate the average bone length, used to clamp feedback error
+ for (bonecnt=0, bonelen=0.f, a=iktarget->channel; a>=0; a=tree->parent[a], bonecnt++)
+ bonelen += scale*tree->pchan[a]->bone->length;
+ bonelen /= bonecnt;
+
+ // store the rest pose of the end effector to compute enforce target
+ Mat4CpyMat4(mat, pchan->bone->arm_mat);
+ VecCopyf(mat[3], pchan->bone->arm_tail);
+ // get the rest pose relative to the armature base
+ Mat4MulMat4(iktarget->eeRest, mat, invBaseFrame);
+ iktarget->eeBlend = (!ikscene->polarConstraint && condata->type==CONSTRAINT_IK_COPYPOSE) ? true : false;
+ // use target_callback to make sure the initPose includes enforce coefficient
+ target_callback(iTaSC::Timestamp(), iTaSC::F_identity, initPose, iktarget);
+ iktarget->target = new iTaSC::MovingFrame(initPose);
+ iktarget->target->setCallback(target_callback, iktarget);
+ ret = scene->addObject(iktarget->targetName, iktarget->target);
+ if (!ret)
+ break;
+
+ switch (condata->type) {
+ case CONSTRAINT_IK_COPYPOSE:
+ controltype = 0;
+ if ((condata->flag & CONSTRAINT_IK_ROT) && (condata->orientweight != 0.0))
+ controltype |= iTaSC::CopyPose::CTL_ROTATION;
+ if ((condata->weight != 0.0))
+ controltype |= iTaSC::CopyPose::CTL_POSITION;
+ if (controltype) {
+ iktarget->constraint = new iTaSC::CopyPose(controltype, controltype, bonelen);
+ // set the gain
+ if (controltype & iTaSC::CopyPose::CTL_POSITION)
+ iktarget->constraint->setControlParameter(iTaSC::CopyPose::ID_POSITION, iTaSC::ACT_ALPHA, condata->weight);
+ if (controltype & iTaSC::CopyPose::CTL_ROTATION)
+ iktarget->constraint->setControlParameter(iTaSC::CopyPose::ID_ROTATION, iTaSC::ACT_ALPHA, condata->orientweight);
+ iktarget->constraint->registerCallback(copypose_callback, iktarget);
+ iktarget->errorCallback = copypose_error;
+ iktarget->controlType = controltype;
+ // add the constraint
+ ret = scene->addConstraintSet(iktarget->constraintName, iktarget->constraint, armname, iktarget->targetName, ikscene->channels[iktarget->channel].tail);
+ }
+ break;
+ case CONSTRAINT_IK_DISTANCE:
+ iktarget->constraint = new iTaSC::Distance(bonelen);
+ iktarget->constraint->setControlParameter(iTaSC::Distance::ID_DISTANCE, iTaSC::ACT_VALUE, condata->dist);
+ iktarget->constraint->registerCallback(distance_callback, iktarget);
+ iktarget->errorCallback = distance_error;
+ // we can update the weight on each substep
+ iktarget->constraint->substep(true);
+ // add the constraint
+ ret = scene->addConstraintSet(iktarget->constraintName, iktarget->constraint, armname, iktarget->targetName, ikscene->channels[iktarget->channel].tail);
+ break;
+ }
+ if (!ret)
+ break;
+ }
+ if (!ret ||
+ !scene->addCache(ikscene->cache) ||
+ !scene->addSolver(ikscene->solver) ||
+ !scene->initialize()) {
+ delete ikscene;
+ ikscene = NULL;
+ }
+ return ikscene;
+}
+
+static void create_scene(Scene *scene, Object *ob)
+{
+ bPoseChannel *pchan;
+
+ // create the IK scene
+ for(pchan= (bPoseChannel *)ob->pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) {
+ // by construction there is only one tree
+ PoseTree *tree = (PoseTree*)pchan->iktree.first;
+ if (tree) {
+ IK_Data* ikdata = get_ikdata(ob->pose);
+ // convert tree in iTaSC::Scene
+ IK_Scene* ikscene = convert_tree(scene, ob, pchan);
+ if (ikscene) {
+ ikscene->next = ikdata->first;
+ ikdata->first = ikscene;
+ }
+ // delete the trees once we are done
+ while(tree) {
+ BLI_remlink(&pchan->iktree, tree);
+ BLI_freelistN(&tree->targets);
+ if(tree->pchan) MEM_freeN(tree->pchan);
+ if(tree->parent) MEM_freeN(tree->parent);
+ if(tree->basis_change) MEM_freeN(tree->basis_change);
+ MEM_freeN(tree);
+ tree = (PoseTree*)pchan->iktree.first;
+ }
+ }
+ }
+}
+
+static void init_scene(Object *ob)
+{
+ bPoseChannel *pchan;
+
+ if (ob->pose->ikdata) {
+ for(IK_Scene* scene = ((IK_Data*)ob->pose->ikdata)->first;
+ scene != NULL;
+ scene = scene->next) {
+ scene->channels[0].pchan->flag |= POSE_IKTREE;
+ }
+ }
+}
+
+static void execute_scene(Scene* blscene, IK_Scene* ikscene, bItasc* ikparam, float ctime, float frtime)
+{
+ int i;
+ IK_Channel* ikchan;
+ if (ikparam->flag & ITASC_SIMULATION) {
+ for (i=0, ikchan=ikscene->channels; i<ikscene->numchan; i++, ++ikchan) {
+ // In simulation mode we don't allow external contraint to change our bones, mark the channel done
+ // also tell Blender that this channel is part of IK tree (cleared on each where_is_pose()
+ ikchan->pchan->flag |= (POSE_DONE|POSE_CHAIN);
+ ikchan->jointValid = 0;
+ }
+ } else {
+ // in animation mode, we must get the bone position from action and constraints
+ for(i=0, ikchan=ikscene->channels; i<ikscene->numchan; i++, ++ikchan) {
+ if (!(ikchan->pchan->flag & POSE_DONE))
+ where_is_pose_bone(blscene, ikscene->blArmature, ikchan->pchan, ctime);
+ // tell blender that this channel was controlled by IK, it's cleared on each where_is_pose()
+ ikchan->pchan->flag |= (POSE_DONE|POSE_CHAIN);
+ ikchan->jointValid = 0;
+ }
+ }
+ // only run execute the scene if at least one of our target is enabled
+ for (i=ikscene->targets.size(); i > 0; --i) {
+ IK_Target* iktarget = ikscene->targets[i-1];
+ if (!(iktarget->blenderConstraint->flag & CONSTRAINT_OFF))
+ break;
+ }
+ if (i == 0 && ikscene->armature->getNrOfConstraints() == 0)
+ // all constraint disabled
+ return;
+
+ // compute timestep
+ double timestamp = ctime * frtime + 2147483.648;
+ double timestep = frtime;
+ bool reiterate = (ikparam->flag & ITASC_REITERATION) ? true : false;
+ int numstep = (ikparam->flag & ITASC_AUTO_STEP) ? 0 : ikparam->numstep;
+ bool simulation = true;
+
+ if (ikparam->flag & ITASC_SIMULATION) {
+ ikscene->solver->setParam(iTaSC::Solver::DLS_QMAX, ikparam->maxvel);
+ }
+ else {
+ // in animation mode we start from the pose after action and constraint
+ convert_pose(ikscene);
+ ikscene->armature->setJointArray(ikscene->jointArray);
+ // and we don't handle velocity
+ reiterate = true;
+ simulation = false;
+ // time is virtual, so take fixed value for velocity parameters (see itasc_update_param)
+ // and choose 1s timestep to allow having velocity parameters in radiant
+ timestep = 1.0;
+ // use auto setup to let the solver test the variation of the joints
+ numstep = 0;
+ }
+
+ if (ikscene->cache && !reiterate && simulation) {
+ iTaSC::CacheTS sts, cts, dts;
+ sts = cts = (iTaSC::CacheTS)(timestamp*1000.0+0.5);
+ if (ikscene->cache->getPreviousCacheItem(ikscene->armature, 0, &cts) == NULL || cts == 0) {
+ // the cache is empty before this time, reiterate
+ if (ikparam->flag & ITASC_INITIAL_REITERATION)
+ reiterate = true;
+ } else {
+ // can take the cache as a start point.
+ sts -= cts;
+ timestep = sts/1000.0;
+ }
+ }
+ // don't cache if we are reiterating because we don't want to distroy the cache unnecessarily
+ ikscene->scene->update(timestamp, timestep, numstep, false, !reiterate, simulation);
+ if (reiterate) {
+ // how many times do we reiterate?
+ for (i=0; i<ikparam->numiter; i++) {
+ if (ikscene->armature->getMaxJointChange() < ikparam->precision ||
+ ikscene->armature->getMaxEndEffectorChange() < ikparam->precision)
+ break;
+ ikscene->scene->update(timestamp, timestep, numstep, true, false, simulation);
+ }
+ if (simulation) {
+ // one more fake iteration to cache
+ ikscene->scene->update(timestamp, 0.0, 1, true, true, true);
+ }
+ }
+ // compute constraint error
+ for (i=ikscene->targets.size(); i > 0; --i) {
+ IK_Target* iktarget = ikscene->targets[i-1];
+ if (!(iktarget->blenderConstraint->flag & CONSTRAINT_OFF)) {
+ unsigned int nvalues;
+ const iTaSC::ConstraintValues* values;
+ values = iktarget->constraint->getControlParameters(&nvalues);
+ iktarget->errorCallback(values, nvalues, iktarget);
+ }
+ }
+ // Apply result to bone:
+ // walk the ikscene->channels
+ // for each, get the Frame of the joint corresponding to the bone relative to its parent
+ // combine the parent and the joint frame to get the frame relative to armature
+ // a backward translation of the bone length gives the head
+ // if TY, compute the scale as the ratio of the joint length with rest pose length
+ iTaSC::Armature* arm = ikscene->armature;
+ KDL::Frame frame;
+ double q_rest[3], q[3];
+ const KDL::Joint* joint;
+ const KDL::Frame* tip;
+ bPoseChannel* pchan;
+ float scale;
+ float length;
+ float yaxis[3];
+ for (i=0, ikchan=ikscene->channels; i<ikscene->numchan; ++i, ++ikchan) {
+ if (i == 0) {
+ if (!arm->getRelativeFrame(frame, ikchan->tail))
+ break;
+ // this frame is relative to base, make it relative to object
+ ikchan->frame = ikscene->baseFrame * frame;
+ }
+ else {
+ if (!arm->getRelativeFrame(frame, ikchan->tail, ikscene->channels[ikchan->parent].tail))
+ break;
+ // combine with parent frame to get frame relative to object
+ ikchan->frame = ikscene->channels[ikchan->parent].frame * frame;
+ }
+ // ikchan->frame is the tail frame relative to object
+ // get bone length
+ if (!arm->getSegment(ikchan->tail, 3, joint, q_rest[0], q[0], tip))
+ break;
+ if (joint->getType() == KDL::Joint::TransY) {
+ // stretch bones have a TY joint, compute the scale
+ scale = (float)(q[0]/q_rest[0]);
+ // the length is the joint itself
+ length = (float)q[0];
+ }
+ else {
+ scale = 1.0f;
+ // for fixed bone, the length is in the tip (always along Y axis)
+ length = tip->p(1);
+ }
+ // ready to compute the pose mat
+ pchan = ikchan->pchan;
+ // tail mat
+ ikchan->frame.getValue(&pchan->pose_mat[0][0]);
+ VECCOPY(pchan->pose_tail, pchan->pose_mat[3]);
+ // shift to head
+ VECCOPY(yaxis, pchan->pose_mat[1]);
+ VecMulf(yaxis, length);
+ VecSubf(pchan->pose_mat[3], pchan->pose_mat[3], yaxis);
+ VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
+ // add scale
+ VecMulf(pchan->pose_mat[0], scale);
+ VecMulf(pchan->pose_mat[1], scale);
+ VecMulf(pchan->pose_mat[2], scale);
+ }
+ if (i<ikscene->numchan) {
+ // big problem
+ ;
+ }
+}
+
+//---------------------------------------------------
+// plugin interface
+//
+void itasc_initialize_tree(struct Scene *scene, Object *ob, float ctime)
+{
+ bPoseChannel *pchan;
+ int count = 0;
+
+ if (ob->pose->ikdata != NULL && !(ob->pose->flag & POSE_WAS_REBUILT)) {
+ init_scene(ob);
+ return;
+ }
+ // first remove old scene
+ itasc_clear_data(ob->pose);
+ // we should handle all the constraint and mark them all disabled
+ // for blender but we'll start with the IK constraint alone
+ for(pchan= (bPoseChannel *)ob->pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) {
+ if(pchan->constflag & PCHAN_HAS_IK)
+ count += initialize_scene(ob, pchan);
+ }
+ // if at least one tree, create the scenes from the PoseTree stored in the channels
+ if (count)
+ create_scene(scene, ob);
+ itasc_update_param(ob->pose);
+ // make sure we don't rebuilt until the user changes something important
+ ob->pose->flag &= ~POSE_WAS_REBUILT;
+}
+
+void itasc_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime)
+{
+ if (ob->pose->ikdata) {
+ IK_Data* ikdata = (IK_Data*)ob->pose->ikdata;
+ bItasc* ikparam = (bItasc*) ob->pose->ikparam;
+ // we need default parameters
+ if (!ikparam) ikparam = &DefIKParam;
+
+ for (IK_Scene* ikscene = ikdata->first; ikscene; ikscene = ikscene->next) {
+ if (ikscene->channels[0].pchan == pchan) {
+ float timestep = scene->r.frs_sec_base/scene->r.frs_sec;
+ if (ob->pose->flag & POSE_GAME_ENGINE) {
+ timestep = ob->pose->ctime;
+ // limit the timestep to avoid excessive number of iteration
+ if (timestep > 0.2f)
+ timestep = 0.2f;
+ }
+ execute_scene(scene, ikscene, ikparam, ctime, timestep);
+ break;
+ }
+ }
+ }
+}
+
+void itasc_release_tree(struct Scene *scene, struct Object *ob, float ctime)
+{
+ // not used for iTaSC
+}
+
+void itasc_clear_data(struct bPose *pose)
+{
+ if (pose->ikdata) {
+ IK_Data* ikdata = (IK_Data*)pose->ikdata;
+ for (IK_Scene* scene = ikdata->first; scene; scene = ikdata->first) {
+ ikdata->first = scene->next;
+ delete scene;
+ }
+ MEM_freeN(ikdata);
+ pose->ikdata = NULL;
+ }
+}
+
+void itasc_clear_cache(struct bPose *pose)
+{
+ if (pose->ikdata) {
+ IK_Data* ikdata = (IK_Data*)pose->ikdata;
+ for (IK_Scene* scene = ikdata->first; scene; scene = scene->next) {
+ if (scene->cache)
+ // clear all cache but leaving the timestamp 0 (=rest pose)
+ scene->cache->clearCacheFrom(NULL, 1);
+ }
+ }
+}
+
+void itasc_update_param(struct bPose *pose)
+{
+ if (pose->ikdata && pose->ikparam) {
+ IK_Data* ikdata = (IK_Data*)pose->ikdata;
+ bItasc* ikparam = (bItasc*)pose->ikparam;
+ for (IK_Scene* ikscene = ikdata->first; ikscene; ikscene = ikscene->next) {
+ double armlength = ikscene->armature->getArmLength();
+ ikscene->solver->setParam(iTaSC::Solver::DLS_LAMBDA_MAX, ikparam->dampmax*armlength);
+ ikscene->solver->setParam(iTaSC::Solver::DLS_EPSILON, ikparam->dampeps*armlength);
+ if (ikparam->flag & ITASC_SIMULATION) {
+ ikscene->scene->setParam(iTaSC::Scene::MIN_TIMESTEP, ikparam->minstep);
+ ikscene->scene->setParam(iTaSC::Scene::MAX_TIMESTEP, ikparam->maxstep);
+ ikscene->solver->setParam(iTaSC::Solver::DLS_QMAX, ikparam->maxvel);
+ ikscene->armature->setControlParameter(CONSTRAINT_ID_ALL, iTaSC::Armature::ID_JOINT, iTaSC::ACT_FEEDBACK, ikparam->feedback);
+ } else {
+ // in animation mode timestep is 1s by convention =>
+ // qmax becomes radiant and feedback becomes fraction of error gap corrected in one iteration
+ ikscene->scene->setParam(iTaSC::Scene::MIN_TIMESTEP, 1.0);
+ ikscene->scene->setParam(iTaSC::Scene::MAX_TIMESTEP, 1.0);
+ ikscene->solver->setParam(iTaSC::Solver::DLS_QMAX, 0.52);
+ ikscene->armature->setControlParameter(CONSTRAINT_ID_ALL, iTaSC::Armature::ID_JOINT, iTaSC::ACT_FEEDBACK, 0.8);
+ }
+ }
+ }
+}
+
+void itasc_test_constraint(struct Object *ob, struct bConstraint *cons)
+{
+ struct bKinematicConstraint *data = (struct bKinematicConstraint *)cons->data;
+
+ /* only for IK constraint */
+ if (cons->type != CONSTRAINT_TYPE_KINEMATIC || data == NULL)
+ return;
+
+ switch (data->type) {
+ case CONSTRAINT_IK_COPYPOSE:
+ case CONSTRAINT_IK_DISTANCE:
+ /* cartesian space constraint */
+ break;
+ }
+}
+
diff --git a/source/blender/ikplugin/intern/itasc_plugin.h b/source/blender/ikplugin/intern/itasc_plugin.h
new file mode 100644
index 00000000000..25e48965a52
--- /dev/null
+++ b/source/blender/ikplugin/intern/itasc_plugin.h
@@ -0,0 +1,52 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Original author: Benoit Bolsee
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef ITASC_PLUGIN_H
+#define ITASC_PLUGIN_H
+
+#include "ikplugin_api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void itasc_initialize_tree(struct Scene *scene, struct Object *ob, float ctime);
+void itasc_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
+void itasc_release_tree(struct Scene *scene, struct Object *ob, float ctime);
+void itasc_clear_data(struct bPose *pose);
+void itasc_clear_cache(struct bPose *pose);
+void itasc_update_param(struct bPose *pose);
+void itasc_test_constraint(struct Object *ob, struct bConstraint *cons);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ITASC_PLUGIN_H
+
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index 391f6e9e1a2..5eb98151c14 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -27,35 +27,35 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../makesdna ../../../intern/guardedalloc ../../../intern/memutil ../blenlib
- ../avi ../quicktime ../blenkernel
- ${JPEG_INC}
- ${PNG_INC}
- ${TIFF_INC}
- ${ZLIB_INC}
- ${OPENJPEG_INC}
+ . ../makesdna ../../../intern/guardedalloc ../../../intern/memutil ../blenlib
+ ../avi ../blenkernel
+ ${JPEG_INC}
+ ${PNG_INC}
+ ${TIFF_INC}
+ ${ZLIB_INC}
+ ${OPENJPEG_INC}
)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
+ ADD_DEFINITIONS(-DWITH_OPENJPEG)
ENDIF(WITH_OPENJPEG)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
if(WITH_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
ENDIF(WITH_DDS)
BLENDERLIB(bf_imbuf "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 1d8035a2358..d2f561438b9 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -319,7 +319,7 @@ void IMB_antialias(struct ImBuf * ibuf);
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_makemipmap(struct ImBuf *ibuf, int use_filter, int SAT);
/**
*
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 79da0cb1c41..91a7b136fa5 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -98,9 +98,13 @@ typedef struct ImBuf {
unsigned int encodedsize; /**< Size of data written to encodedbuffer */
unsigned int encodedbuffersize; /**< Size of encodedbuffer */
- float *rect_float; /**< floating point Rect equivalent */
+ float *rect_float; /**< floating point Rect equivalent
+ Linear RGB color space - may need gamma correction to
+ sRGB when generating 8bit representations */
int channels; /**< amount of channels in rect_float (0 = 4 channel default) */
float dither; /**< random dither value, for conversion from float -> byte rect */
+ short profile; /** color space/profile preset that the byte rect buffer represents */
+ char profile_filename[256]; /** to be implemented properly, specific filename for custom profiles */
struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */
struct ImgInfo * img_info;
@@ -213,6 +217,18 @@ typedef enum {
#define AN_tanx (Anim | TANX)
/**@}*/
+/**
+ * \name Imbuf preset profile tags
+ * \brief Some predefined color space profiles that 8 bit imbufs can represent
+ */
+/**@{*/
+#define IB_PROFILE_NONE 0
+#define IB_PROFILE_LINEAR_RGB 1
+#define IB_PROFILE_SRGB 2
+#define IB_PROFILE_CUSTOM 3
+/**@}*/
+
+
/** \name Imbuf File Type Tests
* \brief These macros test if an ImBuf struct is the corresponding file type.
*/
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 9da0cf21596..6052b344da7 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -35,4 +35,4 @@ if env['WITH_BF_QUICKTIME']:
incs += ' ../quicktime ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
-env.BlenderLib ( libname = 'bf_imbuf', sources = sources, includes = Split(incs), defines = defs, libtype=['core'], priority = [190] )
+env.BlenderLib ( libname = 'bf_imbuf', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [185,115] )
diff --git a/source/blender/imbuf/intern/IMB_targa.h b/source/blender/imbuf/intern/IMB_targa.h
index 956bc512b97..7759e4bc772 100644
--- a/source/blender/imbuf/intern/IMB_targa.h
+++ b/source/blender/imbuf/intern/IMB_targa.h
@@ -41,7 +41,7 @@ struct ImBuf;
int imb_is_a_targa(void *buf);
-struct ImBuf *imb_loadtarga(unsigned char *mem, int flags);
+struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags);
short imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
#endif
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c
index a2dbdfbe483..1aaba620f3a 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim.c
@@ -608,7 +608,7 @@ static int startffmpeg(struct anim * anim) {
anim->pFrameDeinterlaced = avcodec_alloc_frame();
anim->pFrameRGB = avcodec_alloc_frame();
- if (avpicture_get_size(PIX_FMT_BGR32, anim->x, anim->y)
+ if (avpicture_get_size(PIX_FMT_RGBA, anim->x, anim->y)
!= anim->x * anim->y * 4) {
fprintf (stderr,
"ffmpeg has changed alloc scheme ... ARGHHH!\n");
@@ -642,7 +642,7 @@ static int startffmpeg(struct anim * anim) {
anim->pCodecCtx->pix_fmt,
anim->pCodecCtx->width,
anim->pCodecCtx->height,
- PIX_FMT_BGR32,
+ PIX_FMT_RGBA,
SWS_FAST_BILINEAR | SWS_PRINT_INFO,
NULL, NULL, NULL);
@@ -671,11 +671,11 @@ static ImBuf * ffmpeg_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, 32, IB_rect, 0);
avpicture_fill((AVPicture*) anim->pFrameRGB,
(unsigned char*) ibuf->rect,
- PIX_FMT_BGR32, anim->x, anim->y);
+ PIX_FMT_RGBA, anim->x, anim->y);
if (position != anim->curposition + 1) {
if (position > anim->curposition + 1
@@ -748,6 +748,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
if (frameFinished && !pos_found) {
if (packet.dts >= pts_to_search) {
pos_found = 1;
+ anim->curposition = position;
}
}
@@ -811,21 +812,21 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
for (y = 0; y < h; y++) {
unsigned char tmp[4];
- unsigned long * tmp_l =
- (unsigned long*) tmp;
+ unsigned int * tmp_l =
+ (unsigned int*) tmp;
tmp[3] = 0xff;
for (x = 0; x < w; x++) {
- tmp[0] = bottom[3];
- tmp[1] = bottom[2];
- tmp[2] = bottom[1];
+ tmp[0] = bottom[0];
+ tmp[1] = bottom[1];
+ tmp[2] = bottom[2];
- bottom[0] = top[3];
- bottom[1] = top[2];
- bottom[2] = top[1];
+ bottom[0] = top[0];
+ bottom[1] = top[1];
+ bottom[2] = top[2];
bottom[3] = 0xff;
- *(unsigned long*) top
+ *(unsigned int*) top
= *tmp_l;
bottom +=4;
@@ -848,8 +849,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
0, 0, 0 };
int i;
unsigned char* r;
-
-
+
sws_scale(anim->img_convert_ctx,
input->data,
input->linesize,
@@ -857,8 +857,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
anim->pCodecCtx->height,
dst2,
dstStride2);
-
- /* workaround: sws_scale
+
+ /* workaround: sws_scale
sets alpha = 0... */
r = (unsigned char*) ibuf->rect;
@@ -867,7 +867,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
r[3] = 0xff;
r+=4;
}
-
+
av_free_packet(&packet);
break;
}
diff --git a/source/blender/imbuf/intern/anim5.c b/source/blender/imbuf/intern/anim5.c
index b6f29b6a145..43a6b0d2c5d 100644
--- a/source/blender/imbuf/intern/anim5.c
+++ b/source/blender/imbuf/intern/anim5.c
@@ -31,6 +31,7 @@
#include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail
BLI_countlist BLI_stringdec */
+
#include "imbuf.h"
#include "imbuf_patch.h"
@@ -46,6 +47,11 @@
#include "IMB_anim5.h"
+#ifdef _WIN32
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
+
typedef struct Anhd{
unsigned char type, mask;
unsigned short w, h;
@@ -204,12 +210,12 @@ static void anim5decode(struct ImBuf * ibuf, uchar * dlta) {
int *ofspoint;
uchar **planes;
- /* samenstelling delta:
- lijst met ofsets voor delta's per bitplane (ofspoint)
- per kolom in delta (point)
- aantal handelingen (noops)
+ /* composition delta:
+ list with ofsets for delta' s by bitplane (ofspoint)
+ by column in delta (point)
+ number of operations (noops)
code
- bijbehorende data
+ associated data
...
...
*/
diff --git a/source/blender/imbuf/intern/cineon/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt
index 53cd161634b..8b28086016b 100644
--- a/source/blender/imbuf/intern/cineon/CMakeLists.txt
+++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt
@@ -27,14 +27,14 @@
FILE(GLOB SRC *.c)
SET(INC
- .
- ../../../blenkernel
- ../../
- ..
- ../../../blenlib
- intern/include
- ../../../../../intern/guardedalloc
- ../../../makesdna
+ .
+ ../../../blenkernel
+ ../../
+ ..
+ ../../../blenlib
+ intern/include
+ ../../../../../intern/guardedalloc
+ ../../../makesdna
)
BLENDERLIB(bf_cineon "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/cineon/SConscript b/source/blender/imbuf/intern/cineon/SConscript
index ef9c44b85c8..d9c8ab14d35 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, 75])
+env.BlenderLib ('bf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [220,175])
diff --git a/source/blender/imbuf/intern/dds/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
index 842f53bd88b..dc45afb9f5b 100644
--- a/source/blender/imbuf/intern/dds/CMakeLists.txt
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -27,18 +27,18 @@
FILE (GLOB SRC *.cpp)
SET(INC
- .
- ../../../blenkernel
- ../../../makesdna
- ../../
- ..
- ../../../blenlib
- intern/include
- ../../../../../intern/guardedalloc
+ .
+ ../../../blenkernel
+ ../../../makesdna
+ ../../
+ ..
+ ../../../blenlib
+ intern/include
+ ../../../../../intern/guardedalloc
)
if(WITH_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
ENDIF(WITH_DDS)
BLENDERLIB(bf_dds "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/dds/SConscript b/source/blender/imbuf/intern/dds/SConscript
index cec6023648b..0b7fd50e317 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, 105])
+env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [230,190])
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 8043e594454..6e1a176a5d2 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -39,6 +39,7 @@
#include "IMB_allocimbuf.h"
#include "IMB_divers.h"
#include "BKE_utildefines.h"
+#include "BKE_colortools.h"
void imb_checkncols(struct ImBuf *ibuf)
{
@@ -176,9 +177,11 @@ void IMB_gamwarp(struct ImBuf *ibuf, double gamma)
void IMB_rect_from_float(struct ImBuf *ibuf)
{
/* quick method to convert floatbuf to byte */
- float *tof = ibuf->rect_float;
+ float *tof = (float *)ibuf->rect_float;
float dither= ibuf->dither;
+ float srgb[3];
int i, channels= ibuf->channels;
+ short profile= ibuf->profile;
unsigned char *to = (unsigned char *) ibuf->rect;
if(tof==NULL) return;
@@ -187,7 +190,24 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
to = (unsigned char *) ibuf->rect;
}
- if(dither==0.0f || channels!=4) {
+ if (profile == IB_PROFILE_SRGB && (channels == 3 || channels == 4)) {
+ if(channels == 3) {
+ for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=3) {
+ srgb[0]= linearrgb_to_srgb(tof[0]);
+ srgb[1]= linearrgb_to_srgb(tof[1]);
+ srgb[2]= linearrgb_to_srgb(tof[2]);
+
+ to[0] = FTOCHAR(srgb[0]);
+ to[1] = FTOCHAR(srgb[1]);
+ to[2] = FTOCHAR(srgb[2]);
+ to[3] = 255;
+ }
+ }
+ else if (channels == 4) {
+ floatbuf_to_srgb_byte(tof, to, 0, ibuf->x, 0, ibuf->y, ibuf->x);
+ }
+ }
+ else if(ELEM(profile, IB_PROFILE_NONE, IB_PROFILE_LINEAR_RGB) && (dither==0.0f || channels!=4)) {
if(channels==1) {
for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof++)
to[1]= to[2]= to[3]= to[0] = FTOCHAR(tof[0]);
@@ -242,14 +262,28 @@ void IMB_float_from_rect(struct ImBuf *ibuf)
tof = ibuf->rect_float;
}
- 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;
+ if (ibuf->profile == IB_PROFILE_SRGB) {
+ /* convert from srgb to linear rgb */
+
+ 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;
+ }
+ } 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;
+ }
}
}
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index 9802405fd8d..cc3315c7696 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -371,6 +371,7 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
}
}
+#if 0
void IMB_makemipmap(ImBuf *ibuf, int use_filter)
{
ImBuf *hbuf= ibuf;
@@ -394,5 +395,90 @@ void IMB_makemipmap(ImBuf *ibuf, int use_filter)
minsize= hbuf->x<hbuf->y?hbuf->x:hbuf->y;
}
}
+#endif
-
+void IMB_makemipmap(ImBuf *ibuf, int use_filter, int SAT)
+{
+ if (SAT) {
+ // to maximize precision subtract image average, use intermediate double SAT,
+ // only convert to float at the end
+ const double dv = 1.0/255.0;
+ double avg[4] = {0, 0, 0, 0};
+ const int x4 = ibuf->x << 2;
+ int x, y, i;
+ ImBuf* sbuf = IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rectfloat, 0);
+ double *satp, *satbuf = MEM_callocN(sizeof(double)*ibuf->x*ibuf->y*4, "tmp SAT buf");
+ const double mf = ibuf->x*ibuf->y;
+ float* fp;
+ ibuf->mipmap[0] = sbuf;
+ if (ibuf->rect_float) {
+ fp = ibuf->rect_float;
+ for (y=0; y<ibuf->y; ++y)
+ for (x=0; x<ibuf->x; ++x) {
+ avg[0] += *fp++;
+ avg[1] += *fp++;
+ avg[2] += *fp++;
+ avg[3] += *fp++;
+ }
+ }
+ else {
+ char* cp = (char*)ibuf->rect;
+ for (y=0; y<ibuf->y; ++y)
+ for (x=0; x<ibuf->x; ++x) {
+ avg[0] += *cp++ * dv;
+ avg[1] += *cp++ * dv;
+ avg[2] += *cp++ * dv;
+ avg[3] += *cp++ * dv;
+ }
+ }
+ avg[0] /= mf;
+ avg[1] /= mf;
+ avg[2] /= mf;
+ avg[3] /= mf;
+ for (y=0; y<ibuf->y; ++y)
+ for (x=0; x<ibuf->x; ++x) {
+ const unsigned int p = (x + y*ibuf->x) << 2;
+ char* cp = (char*)ibuf->rect + p;
+ fp = ibuf->rect_float + p;
+ satp = satbuf + p;
+ for (i=0; i<4; ++i, ++cp, ++fp, ++satp) {
+ double sv = (ibuf->rect_float ? (double)*fp : (double)(*cp)*dv) - avg[i];
+ if (x > 0) sv += satp[-4];
+ if (y > 0) sv += satp[-x4];
+ if (x > 0 && y > 0) sv -= satp[-x4 - 4];
+ *satp = sv;
+ }
+ }
+ fp = sbuf->rect_float;
+ satp = satbuf;
+ for (y=0; y<ibuf->y; ++y)
+ for (x=0; x<ibuf->x; ++x) {
+ *fp++ = (float)*satp++;
+ *fp++ = (float)*satp++;
+ *fp++ = (float)*satp++;
+ *fp++ = (float)*satp++;
+ }
+ MEM_freeN(satbuf);
+ fp = &sbuf->rect_float[(sbuf->x - 1 + (sbuf->y - 1)*sbuf->x) << 2];
+ fp[0] = avg[0];
+ fp[1] = avg[1];
+ fp[2] = avg[2];
+ fp[3] = avg[3];
+ }
+ else {
+ ImBuf *hbuf = ibuf;
+ int curmap = 0;
+ while (curmap < IB_MIPMAP_LEVELS) {
+ if (use_filter) {
+ ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect, 0);
+ IMB_filterN(nbuf, hbuf);
+ ibuf->mipmap[curmap] = IMB_onehalf(nbuf);
+ IMB_freeImBuf(nbuf);
+ }
+ else ibuf->mipmap[curmap] = IMB_onehalf(hbuf);
+ hbuf = ibuf->mipmap[curmap];
+ if (hbuf->x == 1 && hbuf->y == 1) break;
+ curmap++;
+ }
+ }
+}
diff --git a/source/blender/imbuf/intern/hamx.c b/source/blender/imbuf/intern/hamx.c
index 2f32d155407..258c196fcdf 100644
--- a/source/blender/imbuf/intern/hamx.c
+++ b/source/blender/imbuf/intern/hamx.c
@@ -31,11 +31,6 @@
#include "BLI_blenlib.h"
-#ifdef WIN32
-#include <io.h>
-#endif
-
-
#include "imbuf.h"
#include "imbuf_patch.h"
#include "IMB_imbuf_types.h"
@@ -46,6 +41,11 @@
#include "IMB_ham.h"
#include "IMB_hamx.h"
+#ifdef WIN32
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
+
/* actually hard coded endianness */
#define GET_BIG_LONG(x) (((uchar *) (x))[0] << 24 | ((uchar *) (x))[1] << 16 | ((uchar *) (x))[2] << 8 | ((uchar *) (x))[3])
#define GET_LITTLE_LONG(x) (((uchar *) (x))[3] << 24 | ((uchar *) (x))[2] << 16 | ((uchar *) (x))[1] << 8 | ((uchar *) (x))[0])
diff --git a/source/blender/imbuf/intern/iff.c b/source/blender/imbuf/intern/iff.c
index c3695173068..5fd823e78c1 100644
--- a/source/blender/imbuf/intern/iff.c
+++ b/source/blender/imbuf/intern/iff.c
@@ -29,14 +29,15 @@
* $Id$
*/
-#ifdef WIN32
-#include <io.h>
-#endif
#include "BLI_blenlib.h"
#include "imbuf.h"
#include "imbuf_patch.h"
#include "IMB_imbuf_types.h"
#include "IMB_iff.h"
+#ifdef WIN32
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
unsigned short imb_start_iff(struct ImBuf *ibuf, int file)
{
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index aa3015812fc..7b8c383ddb9 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -104,7 +104,9 @@ static int writetab(FILE *outf, unsigned int *tab, int len);
static void readtab(FILE *inf, unsigned int *tab, int len);
static void expandrow(unsigned char *optr, unsigned char *iptr, int z);
+static void expandrow2(float *optr, unsigned char *iptr, int z);
static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n);
+static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n);
static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cnt);
static void lumrow(unsigned char *rgbptr, unsigned char *lumptr, int n);
@@ -233,6 +235,7 @@ static void test_endian_zbuf(struct ImBuf *ibuf)
struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
{
unsigned int *base, *lptr = NULL;
+ float *fbase, *fptr = NULL;
unsigned int *zbase, *zptr;
unsigned char *rledat;
unsigned int *starttab, *lengthtab;
@@ -242,7 +245,6 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
int xsize, ysize, zsize;
int bpp, rle, cur, badorder;
ImBuf * ibuf;
- uchar * rect;
/*printf("new iris\n");*/
@@ -257,8 +259,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
rle = ISRLE(image.type);
bpp = BPP(image.type);
- if(bpp != 1 ) {
- fprintf(stderr,"longimagedata: image must have 1 byte per pix chan\n");
+ if(bpp != 1 && bpp != 2) {
+ fprintf(stderr,"longimagedata: image must have 1 or 2 byte per pix chan\n");
return(0);
}
@@ -273,6 +275,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
}
if (rle) {
+
tablen = ysize*zsize*sizeof(int);
starttab = (unsigned int *)malloc(tablen);
lengthtab = (unsigned int *)malloc(tablen);
@@ -280,7 +283,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
readtab(inf,starttab,tablen);
readtab(inf,lengthtab,tablen);
-
+
/* check data order */
cur = 0;
badorder = 0;
@@ -295,99 +298,201 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags)
if(badorder)
break;
}
-
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
- if (ibuf->depth > 32) ibuf->depth = 32;
- base = ibuf->rect;
- zbase = (unsigned int *)ibuf->zbuf;
-
- if (badorder) {
- for(z=0; z<zsize; z++) {
+
+ if (bpp == 1) {
+
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ if (ibuf->depth > 32) ibuf->depth = 32;
+ base = ibuf->rect;
+ zbase = (unsigned int *)ibuf->zbuf;
+
+ if (badorder) {
+ for(z=0; z<zsize; z++) {
+ lptr = base;
+ for(y=0; y<ysize; y++) {
+ file_offset = starttab[y+z*ysize];
+
+ rledat = file_data + file_offset;
+ file_offset += lengthtab[y+z*ysize];
+
+ expandrow((uchar *)lptr, rledat, 3-z);
+ lptr += xsize;
+ }
+ }
+ } else {
lptr = base;
+ zptr = zbase;
for(y=0; y<ysize; y++) {
- file_offset = starttab[y+z*ysize];
-
- rledat = file_data + file_offset;
- file_offset += lengthtab[y+z*ysize];
-
- expandrow((uchar *)lptr, rledat, 3-z);
+
+ for(z=0; z<zsize; z++) {
+
+ file_offset = starttab[y+z*ysize];
+
+ rledat = file_data + file_offset;
+ file_offset += lengthtab[y+z*ysize];
+
+ if(z<4) expandrow((uchar *)lptr, rledat, 3-z);
+ else if(z<8) expandrow((uchar *)zptr, rledat, 7-z);
+ }
lptr += xsize;
+ zptr += xsize;
}
}
- }
- else {
- lptr = base;
- zptr = zbase;
- for(y=0; y<ysize; y++) {
+
+ } else { /* bpp == 2 */
+
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+
+ fbase = ibuf->rect_float;
+
+ if (badorder) {
for(z=0; z<zsize; z++) {
-
- file_offset = starttab[y+z*ysize];
+ fptr = fbase;
+ for(y=0; y<ysize; y++) {
+ file_offset = starttab[y+z*ysize];
+
+ rledat = file_data + file_offset;
+ file_offset += lengthtab[y+z*ysize];
+
+ expandrow2(fptr, rledat, 3-z);
+ fptr += xsize * 4;
+ }
+ }
+ } else {
+ fptr = fbase;
- rledat = file_data + file_offset;
- file_offset += lengthtab[y+z*ysize];
-
- if(z<4) expandrow((uchar *)lptr, rledat, 3-z);
- else if(z<8) expandrow((uchar *)zptr, rledat, 7-z);
+ for(y=0; y<ysize; y++) {
+
+ for(z=0; z<zsize; z++) {
+
+ file_offset = starttab[y+z*ysize];
+
+ rledat = file_data + file_offset;
+ file_offset += lengthtab[y+z*ysize];
+
+ expandrow2(fptr, rledat, 3-z);
+
+ }
+ fptr += xsize * 4;
}
- lptr += xsize;
- zptr += xsize;
}
}
free(starttab);
- free(lengthtab);
- }
- else {
-
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
- if (ibuf->depth > 32) ibuf->depth = 32;
+ free(lengthtab);
- base = ibuf->rect;
- zbase = (unsigned int *)ibuf->zbuf;
-
- file_offset = 512;
- rledat = file_data + file_offset;
-
- for(z = 0; z < zsize; z++) {
+ } else {
+ if (bpp == 1) {
+
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ if (ibuf->depth > 32) ibuf->depth = 32;
+
+ base = ibuf->rect;
+ zbase = (unsigned int *)ibuf->zbuf;
- if(z<4) lptr = base;
- else if(z<8) lptr= zbase;
+ file_offset = 512;
+ rledat = file_data + file_offset;
- for(y = 0; y < ysize; y++) {
+ for(z = 0; z < zsize; z++) {
+
+ if(z<4) lptr = base;
+ else if(z<8) lptr= zbase;
+
+ for(y = 0; y < ysize; y++) {
- interleaverow((uchar *)lptr, rledat, 3-z, xsize);
- rledat += xsize;
+ interleaverow((uchar *)lptr, rledat, 3-z, xsize);
+ rledat += xsize;
+
+ lptr += xsize;
+ }
+ }
+
+ } else { /* bpp == 2 */
+
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+
+ fbase = ibuf->rect_float;
+
+ file_offset = 512;
+ rledat = file_data + file_offset;
+
+ for(z = 0; z < zsize; z++) {
+
+ fptr = fbase;
- lptr += xsize;
+ for(y = 0; y < ysize; y++) {
+
+ interleaverow2(fptr, rledat, 3-z, xsize);
+ rledat += xsize * 2;
+
+ fptr += xsize * 4;
+ }
}
+
}
}
- if (image.zsize == 1){
- rect = (uchar *) ibuf->rect;
- for (x = ibuf->x * ibuf->y; x > 0; x--) {
- rect[0] = 255;
- rect[1] = rect[2] = rect[3];
- rect += 4;
+
+ if (bpp == 1) {
+ uchar * rect;
+
+ if (image.zsize == 1){
+ rect = (uchar *) ibuf->rect;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ rect[0] = 255;
+ rect[1] = rect[2] = rect[3];
+ rect += 4;
+ }
+ } else if (image.zsize == 2){
+ /* grayscale with alpha */
+ rect = (uchar *) ibuf->rect;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ rect[0] = rect[2];
+ rect[1] = rect[2] = rect[3];
+ rect += 4;
+ }
+ } else if (image.zsize == 3){
+ /* add alpha */
+ rect = (uchar *) ibuf->rect;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ rect[0] = 255;
+ rect += 4;
+ }
}
- } else if (image.zsize == 2){
- /* grayscale with alpha */
- rect = (uchar *) ibuf->rect;
- for (x = ibuf->x * ibuf->y; x > 0; x--) {
- rect[0] = rect[2];
- rect[1] = rect[2] = rect[3];
- rect += 4;
+
+ } else { /* bpp == 2 */
+
+ if (image.zsize == 1){
+ fbase = ibuf->rect_float;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ fbase[0] = 1;
+ fbase[1] = fbase[2] = fbase[3];
+ fbase += 4;
+ }
+ } else if (image.zsize == 2){
+ /* grayscale with alpha */
+ fbase = ibuf->rect_float;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ fbase[0] = fbase[2];
+ fbase[1] = fbase[2] = fbase[3];
+ fbase += 4;
+ }
+ } else if (image.zsize == 3){
+ /* add alpha */
+ fbase = ibuf->rect_float;
+ for (x = ibuf->x * ibuf->y; x > 0; x--) {
+ fbase[0] = 1;
+ fbase += 4;
+ }
}
- } else if (image.zsize == 3){
- /* add alpha */
- rect = (uchar *) ibuf->rect;
- for (x = ibuf->x * ibuf->y; x > 0; x--) {
- rect[0] = 255;
- rect += 4;
+
+ if (flags & IB_rect) {
+ IMB_rect_from_float(ibuf);
}
+
}
-
+
ibuf->ftype = IMAGIC;
if (flags & IB_ttob) IMB_flipy(ibuf);
@@ -412,6 +517,71 @@ static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n
}
}
+static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n)
+{
+ lptr += z;
+ while(n--) {
+ *lptr = ((cptr[0]<<8) | (cptr[1]<<0)) / (float)0xFFFF;
+ cptr += 2;
+ lptr += 4;
+ }
+}
+
+static void expandrow2(float *optr, unsigned char *iptr, int z)
+{
+ unsigned short pixel, count;
+ float pixel_f;
+
+ optr += z;
+ while(1) {
+ pixel = (iptr[0]<<8) | (iptr[1]<<0);
+ iptr += 2;
+
+ if ( !(count = (pixel & 0x7f)) )
+ return;
+ if(pixel & 0x80) {
+ while(count>=8) {
+ optr[0*4] = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
+ optr[1*4] = ((iptr[2]<<8) | (iptr[3]<<0))/(float)0xFFFF;
+ optr[2*4] = ((iptr[4]<<8) | (iptr[5]<<0))/(float)0xFFFF;
+ optr[3*4] = ((iptr[6]<<8) | (iptr[7]<<0))/(float)0xFFFF;
+ optr[4*4] = ((iptr[8]<<8) | (iptr[9]<<0))/(float)0xFFFF;
+ optr[5*4] = ((iptr[10]<<8) | (iptr[11]<<0))/(float)0xFFFF;
+ optr[6*4] = ((iptr[12]<<8) | (iptr[13]<<0))/(float)0xFFFF;
+ optr[7*4] = ((iptr[14]<<8) | (iptr[15]<<0))/(float)0xFFFF;
+ optr += 8*4;
+ iptr += 8*2;
+ count -= 8;
+ }
+ while(count--) {
+ *optr = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
+ iptr+=2;
+ optr+=4;
+ }
+ } else {
+ pixel_f = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF;
+ iptr += 2;
+
+ while(count>=8) {
+ optr[0*4] = pixel_f;
+ optr[1*4] = pixel_f;
+ optr[2*4] = pixel_f;
+ optr[3*4] = pixel_f;
+ optr[4*4] = pixel_f;
+ optr[5*4] = pixel_f;
+ optr[6*4] = pixel_f;
+ optr[7*4] = pixel_f;
+ optr += 8*4;
+ count -= 8;
+ }
+ while(count--) {
+ *optr = pixel_f;
+ optr+=4;
+ }
+ }
+ }
+}
+
static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
{
unsigned char pixel, count;
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index 6217cd6bea2..2583a155d6a 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -230,7 +230,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
rect_float[2]= (float)(image->comps[2].data[index] + signed_offsets[2]) / float_divs[2];
if (image->numcomps >= 4)
- rect_float[3]= (float)(image->comps[2].data[index] + signed_offsets[3]) / float_divs[3];
+ rect_float[3]= (float)(image->comps[3].data[index] + signed_offsets[3]) / float_divs[3];
else
rect_float[3]= 1.0f;
}
@@ -260,7 +260,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
rect[2]= image->comps[2].data[index] + signed_offsets[2];
if (image->numcomps >= 4)
- rect[3]= image->comps[2].data[index] + signed_offsets[3];
+ rect[3]= image->comps[3].data[index] + signed_offsets[3];
else
rect[3]= 255;
}
diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt
index 21792086774..33681da55af 100644
--- a/source/blender/imbuf/intern/openexr/CMakeLists.txt
+++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt
@@ -27,19 +27,19 @@
SET(SRC openexr_api.cpp)
SET(INC
- .
- ../../../blenkernel
- ../../
- ..
- ../../../blenlib
- intern/include
- ../../../../../intern/guardedalloc
- ../../../makesdna
- ${OPENEXR_INC}
+ .
+ ../../../blenkernel
+ ../../
+ ..
+ ../../../blenlib
+ intern/include
+ ../../../../../intern/guardedalloc
+ ../../../makesdna
+ ${OPENEXR_INC}
)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
BLENDERLIB(bf_openexr "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile
index f77e3723e8a..083089b11d5 100644
--- a/source/blender/imbuf/intern/openexr/Makefile
+++ b/source/blender/imbuf/intern/openexr/Makefile
@@ -35,6 +35,9 @@ 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
diff --git a/source/blender/imbuf/intern/openexr/SConscript b/source/blender/imbuf/intern/openexr/SConscript
index aa166a1983c..f504c503109 100644
--- a/source/blender/imbuf/intern/openexr/SConscript
+++ b/source/blender/imbuf/intern/openexr/SConscript
@@ -13,6 +13,6 @@ incs = ['.',
'../../../makesdna']
incs += Split(env['BF_OPENEXR_INC'])
-defs = []
+defs = ['WITH_OPENEXR']
-env.BlenderLib ('bf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225, 85])
+env.BlenderLib ('bf_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 32d97d79bd7..a780727b1a2 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -51,7 +51,6 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void)
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#define WITH_OPENEXR
#include "openexr_multi.h"
}
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index 1a6ab104bcf..4104a8db65c 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -143,7 +143,7 @@ ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) {
ibuf = imb_bmp_decode((uchar *)mem, size, flags);
if (ibuf) return(ibuf);
- ibuf = imb_loadtarga((uchar *)mem, flags);
+ ibuf = imb_loadtarga((uchar *)mem, size, flags);
if (ibuf) return(ibuf);
ibuf = imb_loaddpx((uchar *)mem, size, flags);
@@ -229,7 +229,7 @@ struct ImBuf *IMB_loadiffmem(int *mem, int flags) {
}
}
- ibuf = imb_loadtarga((uchar *) mem,flags);
+ ibuf = imb_loadtarga((uchar *) mem,maxlen,flags);
if (ibuf) return(ibuf);
if (IB_verbose) fprintf(stderr,"Unknown fileformat\n");
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index 303e5685503..c89bc6a632f 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -289,7 +289,10 @@ short imb_savetarga(struct ImBuf * ibuf, char *name, int flags)
fildes = fopen(name,"wb");
if (!fildes) return 0;
- if (fwrite(buf, 1, 18,fildes) != 18) return (0);
+ if (fwrite(buf, 1, 18,fildes) != 18) {
+ fclose(fildes);
+ return (0);
+ }
if (ibuf->cmap){
for (i = 0 ; i<ibuf->maxcol ; i++){
@@ -365,8 +368,24 @@ int imb_is_a_targa(void *buf) {
return checktarga(&tga, buf);
}
-static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize)
+static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect)
{
+ int size = (ibuf->x * ibuf->y) - (rect - ibuf->rect);
+ if(size) {
+ printf("decodetarga: incomplete file, %.1f%% missing\n", 100*((float)size / (ibuf->x * ibuf->y)));
+
+ /* not essential but makes displaying partially rendered TGA's less ugly */
+ memset(rect, 0, size);
+ }
+ else {
+ /* shouldnt happen */
+ printf("decodetarga: incomplete file, all pixels written\n");
+ }
+}
+
+static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int mem_size, int psize)
+{
+ unsigned char *mem_end = mem+mem_size;
int count, col, size;
unsigned int *rect;
uchar * cp = (uchar *) &col;
@@ -380,9 +399,13 @@ static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize)
/* set alpha */
cp[0] = 0xff;
cp[1] = cp[2] = 0;
-
+
while(size > 0){
count = *mem++;
+
+ if(mem>mem_end)
+ goto partial_load;
+
if (count >= 128) {
/*if (count == 128) printf("TARGA: 128 in file !\n");*/
count -= 127;
@@ -452,15 +475,28 @@ static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize)
}
*rect++ = col;
count --;
+
+ if(mem>mem_end)
+ goto partial_load;
}
+
+ if(mem>mem_end)
+ goto partial_load;
}
}
}
- if (size) printf("decodetarga: count would overwrite %d pixels\n", -size);
+ if (size) {
+ printf("decodetarga: count would overwrite %d pixels\n", -size);
+ }
+ return;
+
+partial_load:
+ complete_partial_load(ibuf, rect);
}
-static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize)
+static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int mem_size, int psize)
{
+ unsigned char *mem_end = mem+mem_size;
int col,size;
unsigned int *rect;
uchar * cp = (uchar *) &col;
@@ -476,6 +512,9 @@ static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize)
cp[1] = cp[2] = 0;
while(size > 0){
+ if(mem>mem_end)
+ goto partial_load;
+
if (psize & 2){
if (psize & 1){
/* order = bgra */
@@ -505,10 +544,14 @@ static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize)
*rect++ = col;
size--;
}
+ return;
+
+partial_load:
+ complete_partial_load(ibuf, rect);
}
-struct ImBuf *imb_loadtarga(unsigned char *mem, int flags)
+struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags)
{
TARGA tga;
struct ImBuf * ibuf;
@@ -579,18 +622,18 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int flags)
case 1:
case 2:
case 3:
- if (tga.pixsize <= 8) ldtarga(ibuf,mem,0);
- else if (tga.pixsize <= 16) ldtarga(ibuf,mem,1);
- else if (tga.pixsize <= 24) ldtarga(ibuf,mem,2);
- else if (tga.pixsize <= 32) ldtarga(ibuf,mem,3);
+ if (tga.pixsize <= 8) ldtarga(ibuf,mem,mem_size,0);
+ else if (tga.pixsize <= 16) ldtarga(ibuf,mem,mem_size,1);
+ else if (tga.pixsize <= 24) ldtarga(ibuf,mem,mem_size,2);
+ else if (tga.pixsize <= 32) ldtarga(ibuf,mem,mem_size,3);
break;
case 9:
case 10:
case 11:
- if (tga.pixsize <= 8) decodetarga(ibuf,mem,0);
- else if (tga.pixsize <= 16) decodetarga(ibuf,mem,1);
- else if (tga.pixsize <= 24) decodetarga(ibuf,mem,2);
- else if (tga.pixsize <= 32) decodetarga(ibuf,mem,3);
+ if (tga.pixsize <= 8) decodetarga(ibuf,mem,mem_size,0);
+ else if (tga.pixsize <= 16) decodetarga(ibuf,mem,mem_size,1);
+ else if (tga.pixsize <= 24) decodetarga(ibuf,mem,mem_size,2);
+ else if (tga.pixsize <= 32) decodetarga(ibuf,mem,mem_size,3);
break;
}
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 86ca43824f3..6053c5556f1 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -39,31 +39,29 @@
#include "IMB_thumbs.h"
#include "IMB_imginfo.h"
-
#include "md5.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+
#ifdef WIN32
#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
#ifndef _WIN32_IE
#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
#endif
#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
-#include "BLI_winstuff.h"
#include <process.h> /* getpid */
#include <direct.h> /* chdir */
+#include "BLI_winstuff.h"
#else
#include <unistd.h>
#endif
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-
#define URI_MAX FILE_MAX*3 + 8
static int get_thumb_dir( char* dir , ThumbSize size)
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index ffd5d3431af..26434583118 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -401,8 +401,6 @@ int imb_get_anim_type(char * name) {
if (ib_stat(name,&st) == -1) return(0);
if (((st.st_mode) & S_IFMT) != S_IFREG) return(0);
- if (isavi(name)) return (ANIM_AVI);
-
if (ismovie(name)) return (ANIM_MOVIE);
# ifdef WITH_QUICKTIME
if (isqtime(name)) return (ANIM_QTIME);
@@ -410,6 +408,7 @@ int imb_get_anim_type(char * name) {
# ifdef WITH_FFMPEG
if (isffmpeg(name)) return (ANIM_FFMPEG);
# endif
+ if (isavi(name)) return (ANIM_AVI);
#endif
#ifdef WITH_REDCODE
if (isredcode(name)) return (ANIM_REDCODE);
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index 7e1120bf3e4..b3af727190a 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -29,10 +29,6 @@
* $Id$
*/
-#ifdef WIN32
-#include <io.h>
-#endif
-
#include <stdio.h>
#include "BKE_global.h"
@@ -71,6 +67,10 @@
#include "IMB_bitplanes.h"
#include "IMB_divers.h"
+#ifdef WIN32
+#include <io.h>
+#include "BLI_winstuff.h"
+#endif
/* added facility to copy with saving non-float rects */
short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 9e5212e159f..0c38421a3f5 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -155,40 +155,37 @@ typedef struct PreviewImage {
#endif
/* ID from database */
-#define ID_SCE MAKE_ID2('S', 'C')
-#define ID_LI MAKE_ID2('L', 'I')
-#define ID_OB MAKE_ID2('O', 'B')
-#define ID_ME MAKE_ID2('M', 'E')
-#define ID_CU MAKE_ID2('C', 'U')
-#define ID_MB MAKE_ID2('M', 'B')
-#define ID_MA MAKE_ID2('M', 'A')
-#define ID_TE MAKE_ID2('T', 'E')
-#define ID_IM MAKE_ID2('I', 'M')
-#define ID_IK MAKE_ID2('I', 'K')
-#define ID_WV MAKE_ID2('W', 'V')
-#define ID_LT MAKE_ID2('L', 'T')
-#define ID_SE MAKE_ID2('S', 'E')
-#define ID_LF MAKE_ID2('L', 'F')
-#define ID_LA MAKE_ID2('L', 'A')
-#define ID_CA MAKE_ID2('C', 'A')
-#define ID_IP MAKE_ID2('I', 'P')
-#define ID_KE MAKE_ID2('K', 'E')
-#define ID_WO MAKE_ID2('W', 'O')
-#define ID_SCR MAKE_ID2('S', 'R')
-#define ID_SCRN MAKE_ID2('S', 'N')
-#define ID_VF MAKE_ID2('V', 'F')
-#define ID_TXT MAKE_ID2('T', 'X')
-#define ID_SO MAKE_ID2('S', 'O')
-#define ID_GR MAKE_ID2('G', 'R')
-#define ID_ID MAKE_ID2('I', 'D')
-#define ID_AR MAKE_ID2('A', 'R')
-#define ID_AC MAKE_ID2('A', 'C')
-#define ID_SCRIPT MAKE_ID2('P', 'Y')
-#define ID_NT MAKE_ID2('N', 'T')
-#define ID_BR MAKE_ID2('B', 'R')
-#define ID_PA MAKE_ID2('P', 'A')
-#define ID_GD MAKE_ID2('G', 'D')
-#define ID_WM MAKE_ID2('W', 'M')
+#define ID_SCE MAKE_ID2('S', 'C') /* Scene */
+#define ID_LI MAKE_ID2('L', 'I') /* Library */
+#define ID_OB MAKE_ID2('O', 'B') /* Object */
+#define ID_ME MAKE_ID2('M', 'E') /* Mesh */
+#define ID_CU MAKE_ID2('C', 'U') /* Curve */
+#define ID_MB MAKE_ID2('M', 'B') /* MetaBall */
+#define ID_MA MAKE_ID2('M', 'A') /* Material */
+#define ID_TE MAKE_ID2('T', 'E') /* Texture */
+#define ID_IM MAKE_ID2('I', 'M') /* Image */
+#define ID_WV MAKE_ID2('W', 'V') /* Wave (unused) */
+#define ID_LT MAKE_ID2('L', 'T') /* Lattice */
+#define ID_LA MAKE_ID2('L', 'A') /* Lamp */
+#define ID_CA MAKE_ID2('C', 'A') /* Camera */
+#define ID_IP MAKE_ID2('I', 'P') /* Ipo (depreciated, replaced by FCurves) */
+#define ID_KE MAKE_ID2('K', 'E') /* Key (shape key) */
+#define ID_WO MAKE_ID2('W', 'O') /* World */
+#define ID_SCR MAKE_ID2('S', 'R') /* Screen */
+#define ID_SCRN MAKE_ID2('S', 'N') /* (depreciated?) */
+#define ID_VF MAKE_ID2('V', 'F') /* VectorFont */
+#define ID_TXT MAKE_ID2('T', 'X') /* Text */
+#define ID_SO MAKE_ID2('S', 'O') /* Sound */
+#define ID_GR MAKE_ID2('G', 'R') /* Group */
+#define ID_ID MAKE_ID2('I', 'D') /* (internal use only) */
+#define ID_AR MAKE_ID2('A', 'R') /* Armature */
+#define ID_AC MAKE_ID2('A', 'C') /* Action */
+#define ID_SCRIPT MAKE_ID2('P', 'Y') /* Script (depreciated) */
+#define ID_NT MAKE_ID2('N', 'T') /* NodeTree */
+#define ID_BR MAKE_ID2('B', 'R') /* Brush */
+#define ID_PA MAKE_ID2('P', 'A') /* ParticleSettings */
+#define ID_GD MAKE_ID2('G', 'D') /* GreasePencil */
+#define ID_WM MAKE_ID2('W', 'M') /* WindowManager */
/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
#define ID_SEQ MAKE_ID2('S', 'Q')
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index 7e54045b5e4..43ef9f28828 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -41,6 +41,54 @@ struct SpaceLink;
struct Object;
/* ************************************************ */
+/* Visualisation */
+
+/* Motion Paths ------------------------------------ */
+/* (used for Pose Channels and Objects) */
+
+/* Data point for motion path */
+typedef struct bMotionPathVert {
+ float co[3]; /* coordinates of point in 3D-space */
+ int flag; /* quick settings */
+} bMotionPathVert;
+
+/* Motion Path data cache - for elements providing transforms (i.e. Objects or PoseChannels) */
+typedef struct bMotionPath {
+ bMotionPathVert *points; /* path samples */
+ int length; /* the number of cached verts */
+
+ int start_frame; /* for drawing paths, the start frame number */
+ int end_frame; /* for drawing paths, the end frame number */
+
+ int flag; /* extra settings */
+} bMotionPath;
+
+
+
+/* Animation Visualisation Settings - for Objects or Armatures (not PoseChannels) */
+typedef struct bAnimVizSettings {
+ int pad;
+ int pathflag; /* eMotionPath_Settings */
+
+ int pathsf, pathef; /* start and end frames of path-calculation range */
+ int pathbc, pathac; /* number of frames before/after current frame of path-calculation */
+} bAnimVizSettings;
+
+/* bMotionPathSettings->flag */
+typedef enum eMotionPath_Settings {
+ /* show frames on path */
+ MOTIONPATH_FLAG_FNUMS = (1<<0),
+ /* show keyframes on path */
+ MOTIONPATH_FLAG_KFRAS = (1<<1),
+ /* for bones - calculate head-points for curves instead of tips */
+ MOTIONPATH_FLAG_HEADS = (1<<2),
+ /* show path around current frame */
+ MOTIONPATH_FLAG_ACFRA = (1<<3),
+ /* show keyframe/frame numbers */
+ MOTIONPATH_FLAG_KFNOS = (1<<4)
+} eMotionPath_Settings;
+
+/* ************************************************ */
/* Poses */
/* PoseChannel ------------------------------------ */
@@ -98,7 +146,9 @@ typedef struct bPoseChannel {
float limitmin[3], limitmax[3]; /* DOF constraint */
float stiffness[3]; /* DOF stiffness */
float ikstretch;
-
+ float ikrotweight; /* weight of joint rotation constraint */
+ float iklinweight; /* weight of joint stretch constraint */
+
float *path; /* totpath x 3 x float */
struct Object *custom; /* draws custom object instead of this channel */
} bPoseChannel;
@@ -118,7 +168,8 @@ typedef enum ePchan_Flag {
POSE_CHAIN = 0x0200,
POSE_DONE = 0x0400,
POSE_KEY = 0x1000,
- POSE_STRIDE = 0x2000
+ POSE_STRIDE = 0x2000,
+ POSE_IKTREE = 0x4000,
} ePchan_Flag;
/* PoseChannel constflag (constraint detection) */
@@ -142,17 +193,32 @@ typedef enum ePchan_IkFlag {
BONE_IK_YLIMIT = (1<<4),
BONE_IK_ZLIMIT = (1<<5),
+ BONE_IK_ROTCTL = (1<<6),
+ BONE_IK_LINCTL = (1<<7),
+
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 */
typedef enum ePchan_RotMode {
/* quaternion rotations (default, and for older Blender versions) */
PCHAN_ROT_QUAT = 0,
- /* euler rotations (xyz only) */
- PCHAN_ROT_EUL,
+ /* euler rotations - keep in sync with enum in BLI_arithb.h */
+ PCHAN_ROT_XYZ = 1, /* Blender 'default' (classic) - must be as 1 to sync with PoseChannel rotmode */
+ PCHAN_ROT_XZY,
+ PCHAN_ROT_YXZ,
+ PCHAN_ROT_YZX,
+ PCHAN_ROT_ZXY,
+ PCHAN_ROT_ZYX,
+ /* NOTE: space is reserved here for 18 other possible
+ * euler rotation orders not implemented
+ */
+ PCHAN_ROT_MAX, /* sentinel for Py API*/
+ /* axis angle rotations */
+ PCHAN_ROT_AXISANGLE = -1
} ePchan_RotMode;
/* Pose ------------------------------------ */
@@ -175,7 +241,9 @@ typedef struct bPose {
ListBase agroups; /* list of bActionGroups */
int active_group; /* index of active group (starts from 1) */
- int pad;
+ int iksolver; /* ik solver to use, see ePose_IKSolverType */
+ void *ikdata; /* temporary IK data, depends on the IK solver. Not saved in file */
+ void *ikparam; /* IK solver parameters, structure depends on iksolver */
} bPose;
@@ -191,8 +259,53 @@ typedef enum ePose_Flags {
POSE_CONSTRAINTS_TIMEDEPEND = (1<<3),
/* recalculate bone paths */
POSE_RECALCPATHS = (1<<4),
+ /* 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),
} ePose_Flags;
+/* bPose->iksolver and bPose->ikparam->iksolver */
+typedef enum {
+ IKSOLVER_LEGACY = 0,
+ IKSOLVER_ITASC,
+} ePose_IKSolverType;
+
+/* header for all bPose->ikparam structures */
+typedef struct bIKParam {
+ int iksolver;
+} bIKParam;
+
+/* bPose->ikparam when bPose->iksolver=1 */
+typedef struct bItasc {
+ int iksolver;
+ float precision;
+ short numiter;
+ short numstep;
+ float minstep;
+ float maxstep;
+ short solver;
+ short flag;
+ float feedback;
+ float maxvel; /* max velocity to SDLS solver */
+ float dampmax; /* maximum damping for DLS solver */
+ float dampeps; /* threshold of singular value from which the damping start progressively */
+} bItasc;
+
+/* bItasc->flag */
+typedef enum {
+ ITASC_AUTO_STEP = (1<<0),
+ ITASC_INITIAL_REITERATION = (1<<1),
+ ITASC_REITERATION = (1<<2),
+ ITASC_SIMULATION = (1<<3),
+} eItasc_Flags;
+
+/* bItasc->solver */
+typedef enum {
+ ITASC_SOLVER_SDLS = 0, /* selective damped least square, suitable for CopyPose constraint */
+ ITASC_SOLVER_DLS /* damped least square with numerical filtering of damping */
+} eItasc_Solver;
+
/* ************************************************ */
/* Action */
@@ -225,10 +338,18 @@ typedef struct bActionGroup {
/* Action Group flags */
typedef enum eActionGroup_Flag {
+ /* group is selected */
AGRP_SELECTED = (1<<0),
+ /* group is 'active' / last selected one */
AGRP_ACTIVE = (1<<1),
+ /* keyframes/channels belonging to it cannot be edited */
AGRP_PROTECTED = (1<<2),
+ /* for UI, sub-channels are shown */
AGRP_EXPANDED = (1<<3),
+ /* sub-channels are not evaluated */
+ AGRP_MUTED = (1<<4),
+ /* sub-channels are not visible in Graph Editor */
+ AGRP_NOTVISIBLE = (1<<5),
AGRP_TEMP = (1<<30),
AGRP_MOVED = (1<<31)
@@ -269,6 +390,7 @@ typedef enum eAction_Flags {
/* flags for evaluation/editing */
ACT_MUTED = (1<<9),
ACT_PROTECTED = (1<<10),
+ ACT_DISABLED = (1<<11),
} eAction_Flags;
@@ -288,8 +410,12 @@ typedef struct bDopeSheet {
/* DopeSheet filter-flag */
typedef enum DOPESHEET_FILTERFLAG {
/* general filtering */
- ADS_FILTER_ONLYSEL = (1<<0),
- ADS_FILTER_ONLYDRIVERS = (1<<1),
+ ADS_FILTER_ONLYSEL = (1<<0), /* only include channels relating to selected data */
+
+ /* temporary (runtime flags) */
+ ADS_FILTER_ONLYDRIVERS = (1<<1), /* for 'Drivers' editor - only include Driver data from AnimData */
+ ADS_FILTER_ONLYNLA = (1<<2), /* for 'NLA' editor - only include NLA data from AnimData */
+ ADS_FILTER_SELEDIT = (1<<3), /* for Graph Editor - used to indicate whether to include a filtering flag or not */
/* datatype-based filtering */
ADS_FILTER_NOSHAPEKEYS = (1<<6),
@@ -299,10 +425,15 @@ typedef enum DOPESHEET_FILTERFLAG {
ADS_FILTER_NOCUR = (1<<13),
ADS_FILTER_NOWOR = (1<<14),
ADS_FILTER_NOSCE = (1<<15),
+ ADS_FILTER_NOPART = (1<<16),
+ ADS_FILTER_NOMBA = (1<<17),
+ ADS_FILTER_NOARM = (1<<18),
+
+ /* NLA-specific filters */
+ ADS_FILTER_NLA_NOACT = (1<<20), /* if the AnimData block has no NLA data, don't include to just show Action-line */
/* combination filters (some only used at runtime) */
- ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR),
- ADS_FILTER_NLADUMMY = (ADS_FILTER_NOSHAPEKEYS|ADS_FILTER_NOOBDATA),
+ ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART),
} DOPESHEET_FILTERFLAG;
/* DopeSheet general flags */
@@ -421,5 +552,3 @@ typedef enum ACHAN_FLAG {
#endif
-
-
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index f713b4a8acc..58fa38ae159 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -37,6 +37,9 @@ struct Scene;
struct Group;
struct Text;
+// for Sound3D
+#include "DNA_sound_types.h"
+
/* ****************** ACTUATORS ********************* */
/* unused now, moved to editobjectactuator in 2.02. Still needed for dna */
@@ -62,18 +65,13 @@ typedef struct bSoundActuator {
short flag, sndnr;
int sta, end;
short pad1[2];
+ float volume, pitch;
struct bSound *sound;
+ struct Sound3D sound3D;
short type, makecopy;
short copymade, pad2[1];
} bSoundActuator;
-typedef struct bCDActuator {
- short flag, sndnr;
- int sta, end;
- short type, track;
- float volume;
-} bCDActuator;
-
typedef struct bEditObjectActuator {
int time;
short type, flag;
@@ -144,7 +142,7 @@ typedef struct bGroupActuator {
char name[32]; /* property or groupkey */
short pad[3], cur, butsta, butend;/* not referenced, can remove? */
- struct Group *group; /* only during game */
+ /* struct Group *group; not used, remove */
} bGroupActuator;
@@ -226,6 +224,15 @@ typedef struct bStateActuator {
unsigned int mask; /* the bits to change */
} bStateActuator;
+typedef struct bArmatureActuator {
+ char posechannel[32];
+ char constraint[32];
+ int type; /* 0=run, 1=enable, 2=disable, 3=set target, 4=set weight */
+ float weight;
+ struct Object *target;
+ struct Object *subtarget;
+} bArmatureActuator;
+
typedef struct bActuator {
struct bActuator *next, *prev, *mynew;
short type;
@@ -291,13 +298,13 @@ typedef struct FreeCamera {
#define ACT_RANDOM 13
#define ACT_MESSAGE 14
#define ACT_ACTION 15 /* __ NLA */
-#define ACT_CD 16
#define ACT_GAME 17
#define ACT_VISIBILITY 18
#define ACT_2DFILTER 19
#define ACT_PARENT 20
#define ACT_SHAPEACTION 21
#define ACT_STATE 22
+#define ACT_ARMATURE 23
/* actuator flag */
#define ACT_SHOW 1
@@ -405,6 +412,10 @@ typedef struct FreeCamera {
/* editObjectActuator->flag */
#define ACT_TRACK_3D 1
+/* editObjectActuator->flag for replace mesh actuator */
+#define ACT_EDOB_REPLACE_MESH_NOGFX 2 /* use for replace mesh actuator */
+#define ACT_EDOB_REPLACE_MESH_PHYS 4
+
/* SceneActuator->type */
#define ACT_SCENE_RESTART 0
#define ACT_SCENE_SET 1
@@ -428,6 +439,9 @@ typedef struct FreeCamera {
#define ACT_RANDOM_FLOAT_NORMAL 8
#define ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL 9
+/* SoundActuator->flag */
+#define ACT_SND_3D_SOUND 1
+
/* SoundActuator->type */
#define ACT_SND_PLAY_STOP_SOUND 0
#define ACT_SND_PLAY_END_SOUND 1
@@ -440,15 +454,6 @@ typedef struct FreeCamera {
#define ACT_MESG_MESG 0
#define ACT_MESG_PROP 1
-/* cdactuator->type */
-#define ACT_CD_PLAY_ALL 0
-#define ACT_CD_PLAY_TRACK 1
-#define ACT_CD_LOOP_TRACK 2
-#define ACT_CD_VOLUME 3
-#define ACT_CD_STOP 4
-#define ACT_CD_PAUSE 5
-#define ACT_CD_RESUME 6
-
/* gameactuator->type */
#define ACT_GAME_LOAD 0
#define ACT_GAME_START 1
@@ -489,6 +494,15 @@ typedef struct FreeCamera {
#define ACT_PARENT_COMPOUND 1
#define ACT_PARENT_GHOST 2
+/* armatureactuator->type */
+#define ACT_ARM_RUN 0
+#define ACT_ARM_ENABLE 1
+#define ACT_ARM_DISABLE 2
+#define ACT_ARM_SETTARGET 3
+#define ACT_ARM_SETWEIGHT 4
+/* update this define if more type are addedd */
+#define ACT_ARM_MAXTYPE 4
+
#endif
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index bf6b9bed5a1..f75ed273164 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -1,5 +1,28 @@
-/* Testing code for new animation system in 2.5
- * Copyright 2009, Joshua Leung
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation, Joshua Leung
+ * All rights reserved.
+ *
+ * Contributor(s): Joshua Leung (full recode)
+ *
+ * ***** END GPL LICENSE BLOCK *****
*/
#ifndef DNA_ANIM_TYPES_H
@@ -40,12 +63,13 @@ typedef struct FModifier {
/* Types of F-Curve modifier
* WARNING: order here is important!
*/
-enum {
+typedef enum eFModifier_Types {
FMODIFIER_TYPE_NULL = 0,
FMODIFIER_TYPE_GENERATOR,
+ FMODIFIER_TYPE_FN_GENERATOR,
FMODIFIER_TYPE_ENVELOPE,
FMODIFIER_TYPE_CYCLES,
- FMODIFIER_TYPE_NOISE, /* unimplemented - generate variations using some basic noise generator... */
+ FMODIFIER_TYPE_NOISE,
FMODIFIER_TYPE_FILTER, /* unimplemented - for applying: fft, high/low pass filters, etc. */
FMODIFIER_TYPE_PYTHON,
FMODIFIER_TYPE_LIMITS,
@@ -55,7 +79,7 @@ enum {
} eFModifier_Types;
/* F-Curve Modifier Settings */
-enum {
+typedef enum eFModifier_Flags {
/* modifier is not able to be evaluated for some reason, and should be skipped (internal) */
FMODIFIER_FLAG_DISABLED = (1<<0),
/* modifier's data is expanded (in UI) */
@@ -68,46 +92,63 @@ enum {
/* --- */
-/* generator modifier data */
+/* Generator modifier data */
typedef struct FMod_Generator {
- /* generator based on PyExpression */
- char expression[256]; /* python expression to use as generator */
-
/* general generator information */
float *coefficients; /* coefficients array */
unsigned int arraysize; /* size of the coefficients array */
- short poly_order; /* order of polynomial generated (i.e. 1 for linear, 2 for quadratic) */
- short func_type; /* builtin math function eFMod_Generator_Functions */
-
- int pad;
+ int poly_order; /* order of polynomial generated (i.e. 1 for linear, 2 for quadratic) */
+ int mode; /* which 'generator' to use eFMod_Generator_Modes */
/* settings */
- short flag; /* settings */
- short mode; /* which 'generator' to use eFMod_Generator_Modes */
+ int flag; /* settings */
} FMod_Generator;
/* generator modes */
-enum {
+typedef enum eFMod_Generator_Modes {
FCM_GENERATOR_POLYNOMIAL = 0,
FCM_GENERATOR_POLYNOMIAL_FACTORISED,
- FCM_GENERATOR_FUNCTION,
- FCM_GENERATOR_EXPRESSION,
} eFMod_Generator_Modes;
-/* generator flags */
-enum {
+
+/* generator flags
+ * - shared by Generator and Function Generator
+ */
+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),
} eFMod_Generator_Flags;
+
+/* 'Built-In Function' Generator modifier data
+ *
+ * This uses the general equation for equations:
+ * y = amplitude * fn(phase_multiplier*x + phase_offset) + y_offset
+ *
+ * where amplitude, phase_multiplier/offset, y_offset are user-defined coefficients,
+ * x is the evaluation 'time', and 'y' is the resultant value
+ */
+typedef struct FMod_FunctionGenerator {
+ /* coefficients for general equation (as above) */
+ float amplitude;
+ float phase_multiplier;
+ float phase_offset;
+ float value_offset;
+
+ /* flags */
+ int type; /* eFMod_Generator_Functions */
+ int flag; /* eFMod_Generator_flags */
+} FMod_FunctionGenerator;
+
/* 'function' generator types */
-enum {
+typedef enum eFMod_Generator_Functions {
FCM_GENERATOR_FN_SIN = 0,
FCM_GENERATOR_FN_COS,
FCM_GENERATOR_FN_TAN,
FCM_GENERATOR_FN_SQRT,
FCM_GENERATOR_FN_LN,
+ FCM_GENERATOR_FN_SINC,
} eFMod_Generator_Functions;
@@ -140,7 +181,7 @@ typedef struct FMod_Cycles {
} FMod_Cycles;
/* cycling modes */
-enum {
+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 */
@@ -163,7 +204,7 @@ typedef struct FMod_Limits {
} FMod_Limits;
/* limiting flags */
-enum {
+typedef enum eFMod_Limit_Flags {
FCM_LIMIT_XMIN = (1<<0),
FCM_LIMIT_XMAX = (1<<1),
FCM_LIMIT_YMIN = (1<<2),
@@ -176,14 +217,13 @@ typedef struct FMod_Noise {
float strength;
float phase;
float pad;
-
+
short depth;
short modification;
-
} FMod_Noise;
/* modification modes */
-enum {
+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 */
@@ -239,7 +279,7 @@ typedef struct ChannelDriver {
} ChannelDriver;
/* driver type */
-enum {
+typedef enum eDriver_Types {
/* target values are averaged together */
DRIVER_TYPE_AVERAGE = 0,
/* python expression/function relates targets */
@@ -249,7 +289,7 @@ enum {
} eDriver_Types;
/* driver flags */
-enum {
+typedef enum eDriver_Flags {
/* driver has invalid settings (internal flag) */
DRIVER_FLAG_INVALID = (1<<0),
/* driver needs recalculation (set by depsgraph) */
@@ -305,7 +345,7 @@ typedef struct FCurve {
/* user-editable flags/settings */
-enum {
+typedef enum eFCurve_Flags {
/* curve/keyframes are visible in editor */
FCURVE_VISIBLE = (1<<0),
/* curve is selected for editing */
@@ -328,13 +368,13 @@ enum {
} eFCurve_Flags;
/* extrapolation modes (only simple value 'extending') */
-enum {
+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 */
} eFCurve_Extend;
/* curve coloring modes */
-enum {
+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 */
@@ -386,85 +426,110 @@ typedef struct AnimMapper {
/* ************************************************ */
/* NLA - Non-Linear Animation */
-// TODO: the concepts here still need to be refined to solve any unresolved items
-
-/* NLA Modifiers ---------------------------------- */
-
-/* These differ from F-Curve modifiers, as although F-Curve modifiers also operate on a
- * per-channel basis too (in general), they are part of the animation data itself, which
- * means that their effects are inherited by all of their users. In order to counteract this,
- * the modifiers here should be used to provide variation to pre-created motions only.
- */
/* NLA Strips ------------------------------------- */
/* NLA Strip (strip)
*
* A NLA Strip is a container for the reuse of Action data, defining parameters
- * to control the remapping of the Action data to some destination. Actions being
- * referenced by NLA-Strips SHOULD-NOT be editable, unless they were created in such
- * a way that results in very little mapping distortion (i.e. for layered animation only,
- * opposed to prebuilt 'blocks' which are quickly dumped into the NLA for crappymatic machima-type
- * stuff)
+ * to control the remapping of the Action data to some destination.
*/
typedef struct NlaStrip {
struct NlaStrip *next, *prev;
- bAction *act; /* Action that is referenced by this strip */
+ ListBase strips; /* 'Child' strips (used for 'meta' strips) */
+ bAction *act; /* Action that is referenced by this strip (strip is 'user' of the action) */
AnimMapper *remap; /* Remapping info this strip (for tweaking correspondance of action with context) */
- ListBase modifiers; /* NLA Modifiers */
+ ListBase fcurves; /* F-Curves for controlling this strip's influence and timing */ // TODO: move out?
+ ListBase modifiers; /* F-Curve modifiers to be applied to the entire strip's referenced F-Curves */
+
+ char name[64]; /* User-Visible Identifier for Strip */
- ListBase fcurves; /* F-Curves for controlling this strip's influence and timing */
float influence; /* Influence of strip */
- float act_time; /* Current 'time' within action being used */
+ float strip_time; /* Current 'time' within action being used (automatically evaluated, but can be overridden) */
float start, end; /* extents of the strip */
float actstart, actend; /* range of the action to use */
- float repeat; /* The number of times to repeat the action range (only when no F-Curves) */
- float scale; /* The amount the action range is scaled by (only when no F-Curves) */
+ float repeat; /* The number of times to repeat the action range (only when no F-Curves) */
+ float scale; /* The amount the action range is scaled by (only when no F-Curves) */
float blendin, blendout; /* strip blending length (only used when there are no F-Curves) */
- int blendmode; /* strip blending mode */
+ short blendmode; /* strip blending mode (layer-based mixing) */
- int flag; /* settings */
+ short extendmode; /* strip extrapolation mode (time-based mixing) */
+ short pad1;
- // umm... old unused cruft?
- int stride_axis; /* axis for stridebone stuff - 0=x, 1=y, 2=z */
- int pad;
+ short type; /* type of NLA strip */
- float actoffs; /* Offset within action, for cycles and striding (only set for ACT_USESTRIDE) */
- float stridelen; /* The stridelength (considered when flag & ACT_USESTRIDE) */
-
- char stridechannel[32]; /* Instead of stridelen, it uses an action channel */
- char offs_bone[32]; /* if repeat, use this bone/channel for defining offset */
+ int flag; /* settings */
+ int pad2;
} NlaStrip;
/* NLA Strip Blending Mode */
-enum {
- NLASTRIPMODE_BLEND = 0,
- NLASTRIPMODE_ADD,
- NLASTRIPMODE_SUBTRACT,
-} eActStrip_Mode;
+typedef enum eNlaStrip_Blend_Mode {
+ NLASTRIP_MODE_REPLACE = 0,
+ NLASTRIP_MODE_ADD,
+ NLASTRIP_MODE_SUBTRACT,
+ NLASTRIP_MODE_MULTIPLY,
+} eNlaStrip_Blend_Mode;
+
+/* NLA Strip Extrpolation Mode */
+typedef enum eNlaStrip_Extrapolate_Mode {
+ /* extend before first frame if no previous strips in track, and always hold+extend last frame */
+ NLASTRIP_EXTEND_HOLD = 0,
+ /* only hold+extend last frame */
+ NLASTRIP_EXTEND_HOLD_FORWARD,
+ /* don't contribute at all */
+ NLASTRIP_EXTEND_NOTHING,
+} eNlaStrip_Extrapolate_Mode;
/* NLA Strip Settings */
-// TODO: check on which of these are still useful...
-enum {
- NLASTRIP_SELECT = (1<<0),
- NLASTRIP_USESTRIDE = (1<<1),
- NLASTRIP_BLENDTONEXT = (1<<2), /* Not implemented. Is not used anywhere */
- NLASTRIP_HOLDLASTFRAME = (1<<3),
- NLASTRIP_ACTIVE = (1<<4),
- NLASTRIP_LOCK_ACTION = (1<<5),
- NLASTRIP_MUTE = (1<<6),
- NLASTRIP_REVERSE = (1<<7), /* This has yet to be implemented. To indicate that a strip should be played backwards */
- NLASTRIP_CYCLIC_USEX = (1<<8),
- NLASTRIP_CYCLIC_USEY = (1<<9),
- NLASTRIP_CYCLIC_USEZ = (1<<10),
- NLASTRIP_AUTO_BLENDS = (1<<11),
- NLASTRIP_TWEAK = (1<<12), /* This strip is a tweaking strip (only set if owner track is a tweak track) */
-} eActionStrip_Flag;
+typedef enum eNlaStrip_Flag {
+ /* UI selection flags */
+ /* NLA strip is the active one in the track (also indicates if strip is being tweaked) */
+ NLASTRIP_FLAG_ACTIVE = (1<<0),
+ /* NLA strip is selected for editing */
+ NLASTRIP_FLAG_SELECT = (1<<1),
+// NLASTRIP_FLAG_SELECT_L = (1<<2), // left handle selected
+// NLASTRIP_FLAG_SELECT_R = (1<<3), // right handle selected
+ /* NLA strip uses the same action that the action being tweaked uses (not set for the twaking one though) */
+ NLASTRIP_FLAG_TWEAKUSER = (1<<4),
+
+ /* controls driven by local F-Curves */
+ /* strip influence is controlled by local F-Curve */
+ NLASTRIP_FLAG_USR_INFLUENCE = (1<<5),
+ NLASTRIP_FLAG_USR_TIME = (1<<6),
+
+ /* NLA strip length is synced to the length of the referenced action */
+ NLASTRIP_FLAG_SYNC_LENGTH = (1<<9),
+
+ /* playback flags (may be overriden by F-Curves) */
+ /* NLA strip blendin/out values are set automatically based on overlaps */
+ NLASTRIP_FLAG_AUTO_BLENDS = (1<<10),
+ /* NLA strip is played back in reverse order */
+ NLASTRIP_FLAG_REVERSE = (1<<11),
+ /* NLA strip is muted (i.e. doesn't contribute in any way) */
+ NLASTRIP_FLAG_MUTED = (1<<12),
+ /* NLA Strip is played back in 'ping-pong' style */
+ NLASTRIP_FLAG_MIRROR = (1<<13),
+
+ /* 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),
+} eNlaStrip_Flag;
+
+/* NLA Strip Type */
+typedef enum eNlaStrip_Type {
+ /* 'clip' - references an Action */
+ NLASTRIP_TYPE_CLIP = 0,
+ /* 'transition' - blends between the adjacent strips */
+ NLASTRIP_TYPE_TRANSITION,
+ /* 'meta' - a strip which acts as a container for a few others */
+ NLASTRIP_TYPE_META,
+} eNlaStrip_Type;
/* NLA Tracks ------------------------------------- */
@@ -483,14 +548,12 @@ typedef struct NlaTrack {
int flag; /* settings for this track */
int index; /* index of the track in the stack (NOTE: not really useful, but we need a pad var anyways!) */
- char info[64]; /* short user-description of this track */
+ char name[64]; /* short user-description of this track */
} NlaTrack;
/* settings for track */
-enum {
- /* track is the one that settings can be modified on (doesn't indicate
- * that it's for 'tweaking' though)
- */
+typedef enum eNlaTrack_Flag {
+ /* track is the one that settings can be modified on, also indicates if track is being 'tweaked' */
NLATRACK_ACTIVE = (1<<0),
/* track is selected in UI for relevant editing operations */
NLATRACK_SELECTED = (1<<1),
@@ -500,10 +563,9 @@ enum {
NLATRACK_SOLO = (1<<3),
/* track's settings (and strips) cannot be edited (to guard against unwanted changes) */
NLATRACK_PROTECTED = (1<<4),
- /* strip is the 'last' one that should be evaluated, as the active action
- * is being used to tweak the animation of the strips up to here
- */
- NLATRACK_TWEAK = (1<<5),
+
+ /* track is not allowed to execute, usually as result of tweaking being enabled (internal flag) */
+ NLATRACK_DISABLED = (1<<10),
} eNlaTrack_Flag;
@@ -538,13 +600,13 @@ typedef struct KS_Path {
} KS_Path;
/* KS_Path->flag */
-enum {
+typedef enum eKSP_Settings {
/* entire array (not just the specified index) gets keyframed */
KSP_FLAG_WHOLE_ARRAY = (1<<0),
} eKSP_Settings;
/* KS_Path->groupmode */
-enum {
+typedef enum eKSP_Grouping {
/* path should be grouped using group name stored in path */
KSP_GROUP_NAMED = 0,
/* path should not be grouped at all */
@@ -564,11 +626,13 @@ enum {
* enum here defines the flags which define which templates are
* required by a path before it can be used
*/
-enum {
+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_PCHAN_ROT = (1<<16), /* modify rotation paths based on rotation mode of Pose Channel */
} eKSP_TemplateTypes;
/* ---------------- */
@@ -595,7 +659,7 @@ typedef struct KeyingSet {
} KeyingSet;
/* KeyingSet settings */
-enum {
+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) */
@@ -603,7 +667,7 @@ enum {
} eKS_Settings;
/* Flags for use by keyframe creation/deletion calls */
-enum {
+typedef enum eInsertKeyFlags {
INSERTKEY_NEEDED = (1<<0), /* only insert keyframes where they're needed */
INSERTKEY_MATRIX = (1<<1), /* insert 'visual' keyframes where possible/needed */
INSERTKEY_FAST = (1<<2), /* don't recalculate handles,etc. after adding key */
@@ -646,11 +710,15 @@ typedef struct AnimOverride {
* blocks may override local settings.
*
* This datablock should be placed immediately after the ID block where it is used, so that
- * the code which retrieves this data can do so in an easier manner. See blenkernel/internal/anim_sys.c for details.
+ * the code which retrieves this data can do so in an easier manner. See blenkernel/intern/anim_sys.c for details.
*/
typedef struct AnimData {
/* active action - acts as the 'tweaking track' for the NLA */
- bAction *action;
+ bAction *action;
+ /* temp-storage for the 'real' active action (i.e. the one used before the tweaking-action
+ * took over to be edited in the Animation Editors)
+ */
+ bAction *tmpact;
/* remapping-info for active action - should only be used if needed
* (for 'foreign' actions that aren't working correctly)
*/
@@ -658,6 +726,8 @@ typedef struct AnimData {
/* nla-tracks */
ListBase nla_tracks;
+ /* active NLA-strip (only set/used during tweaking, so no need to worry about dangling pointers) */
+ NlaStrip *actstrip;
/* 'drivers' for this ID-block's settings - FCurves, but are completely
* separate from those for animation data
@@ -666,25 +736,39 @@ typedef struct AnimData {
ListBase overrides; /* temp storage (AnimOverride) of values for settings that are animated (but the value hasn't been keyframed) */
/* settings for animation evaluation */
- int flag; /* user-defined settings */
- int recalc; /* depsgraph recalculation flags */
+ int flag; /* user-defined settings */
+ int recalc; /* depsgraph recalculation flags */
+
+ /* settings for active action evaluation (based on NLA strip settings) */
+ short act_blendmode; /* accumulation mode for active action */
+ short act_extendmode; /* extrapolation mode for active action */
+ float act_influence; /* influence for active action */
} AnimData;
/* Animation Data settings (mostly for NLA) */
-enum {
+typedef enum eAnimData_Flag {
/* only evaluate a single track in the NLA */
ADT_NLA_SOLO_TRACK = (1<<0),
/* don't use NLA */
ADT_NLA_EVAL_OFF = (1<<1),
- /* don't execute drivers */
- ADT_DRIVERS_DISABLED = (1<<2),
+ /* NLA is being 'tweaked' (i.e. in EditMode) */
+ ADT_NLA_EDIT_ON = (1<<2),
+ /* active Action for 'tweaking' does not have mapping applied for editing */
+ ADT_NLA_EDIT_NOMAP = (1<<3),
+ /* NLA-Strip F-Curves are expanded in UI */
+ ADT_NLA_SKEYS_COLLAPSED = (1<<4),
/* drivers expanded in UI */
ADT_DRIVERS_COLLAPSED = (1<<10),
+ /* don't execute drivers */
+ ADT_DRIVERS_DISABLED = (1<<11),
+
+ /* F-Curves from this AnimData block are not visible in the Graph Editor */
+ ADT_CURVES_NOT_VISIBLE = (1<<16),
} eAnimData_Flag;
/* Animation Data recalculation settings (to be set by depsgraph) */
-enum {
+typedef enum eAnimData_Recalc {
ADT_RECALC_DRIVERS = (1<<0),
ADT_RECALC_ANIM = (1<<1),
ADT_RECALC_ALL = (ADT_RECALC_DRIVERS|ADT_RECALC_ANIM),
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index 69b5e9b0f92..590e7dadcdc 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -31,6 +31,8 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
+struct AnimData;
+
/* this system works on different transformation space levels;
1) Bone Space; with each Bone having own (0,0,0) origin
@@ -69,10 +71,13 @@ typedef struct Bone {
typedef struct bArmature {
ID id;
+ struct AnimData *adt;
ListBase bonebase;
ListBase chainbase;
ListBase *edbo; /* editbone listbase, we use pointer so we can check state */
+ void *sketch; /* sketch struct for etch-a-ton */
+
int flag;
int drawtype;
short deformflag;
@@ -100,7 +105,8 @@ typedef enum eArmature_Flag {
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_GHOST_ONLYSEL = (1<<12) /* when ghosting, only show selected bones (this should belong to ghostflag instead) */
+ ARM_GHOST_ONLYSEL = (1<<12), /* when ghosting, only show selected bones (this should belong to ghostflag instead) */
+ ARM_DS_EXPAND = (1<<13)
} eArmature_Flag;
/* armature->drawtype */
diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h
new file mode 100644
index 00000000000..3e5b0829c70
--- /dev/null
+++ b/source/blender/makesdna/DNA_boid_types.h
@@ -0,0 +1,223 @@
+/* DNA_particle_types.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef DNA_BOID_TYPES_H
+#define DNA_BOID_TYPES_H
+
+#include "DNA_listBase.h"
+
+typedef enum BoidRuleType {
+ eBoidRuleType_None = 0,
+ eBoidRuleType_Goal, /* go to goal assigned object or loudest assigned signal source */
+ eBoidRuleType_Avoid, /* get away from assigned object or loudest assigned signal source */
+ eBoidRuleType_AvoidCollision, /* manoeuver to avoid collisions with other boids and deflector object in near future */
+ eBoidRuleType_Separate, /* keep from going through other boids */
+ eBoidRuleType_Flock, /* move to center of neighbors and match their velocity */
+ eBoidRuleType_FollowLeader, /* follow a boid or assigned object */
+ eBoidRuleType_AverageSpeed, /* maintain speed, flight level or wander*/
+ eBoidRuleType_Fight, /* go to closest enemy and attack when in range */
+ //eBoidRuleType_Protect, /* go to enemy closest to target and attack when in range */
+ //eBoidRuleType_Hide, /* find a deflector move to it's other side from closest enemy */
+ //eBoidRuleType_FollowPath, /* move along a assigned curve or closest curve in a group */
+ //eBoidRuleType_FollowWall, /* move next to a deflector object's in direction of it's tangent */
+ NUM_BOID_RULE_TYPES
+} BoidRuleType;
+
+/* boidrule->flag */
+#define BOIDRULE_CURRENT 1
+#define BOIDRULE_IN_AIR 4
+#define BOIDRULE_ON_LAND 8
+typedef struct BoidRule {
+ struct BoidRule *next, *prev;
+ int type, flag;
+ char name[32];
+} BoidRule;
+#define BRULE_GOAL_AVOID_PREDICT 1
+#define BRULE_GOAL_AVOID_ARRIVE 2
+#define BRULE_GOAL_AVOID_SIGNAL 4
+typedef struct BoidRuleGoalAvoid {
+ BoidRule rule;
+ struct Object *ob;
+ int options;
+ float fear_factor;
+
+ /* signals */
+ int signal_id, channels;
+} BoidRuleGoalAvoid;
+#define BRULE_ACOLL_WITH_BOIDS 1
+#define BRULE_ACOLL_WITH_DEFLECTORS 2
+typedef struct BoidRuleAvoidCollision {
+ BoidRule rule;
+ int options;
+ float look_ahead;
+} BoidRuleAvoidCollision;
+#define BRULE_LEADER_IN_LINE 1
+typedef struct BoidRuleFollowLeader {
+ BoidRule rule;
+ struct Object *ob;
+ float loc[3], oloc[3];
+ float cfra, distance;
+ int options, queue_size;
+} BoidRuleFollowLeader;
+typedef struct BoidRuleAverageSpeed {
+ BoidRule rule;
+ float wander, level, speed, rt;
+} BoidRuleAverageSpeed;
+typedef struct BoidRuleFight {
+ BoidRule rule;
+ float distance, flee_distance;
+} BoidRuleFight;
+
+typedef enum BoidMode {
+ eBoidMode_InAir = 0,
+ eBoidMode_OnLand,
+ eBoidMode_Climbing,
+ eBoidMode_Falling,
+ eBoidMode_Liftoff,
+ NUM_BOID_MODES
+} BoidMode;
+typedef struct BoidData {
+ float health, acc[3];
+ short state_id, mode;
+} BoidData;
+
+// planned for near future
+//typedef enum BoidConditionMode {
+// eBoidConditionType_Then = 0,
+// eBoidConditionType_And,
+// eBoidConditionType_Or,
+// NUM_BOID_CONDITION_MODES
+//} BoidConditionMode;
+//typedef enum BoidConditionType {
+// eBoidConditionType_None = 0,
+// eBoidConditionType_Signal,
+// eBoidConditionType_NoSignal,
+// eBoidConditionType_HealthBelow,
+// eBoidConditionType_HealthAbove,
+// eBoidConditionType_See,
+// eBoidConditionType_NotSee,
+// eBoidConditionType_StateTime,
+// eBoidConditionType_Touching,
+// NUM_BOID_CONDITION_TYPES
+//} BoidConditionType;
+//typedef struct BoidCondition {
+// struct BoidCondition *next, *prev;
+// int state_id;
+// short type, mode;
+// float threshold, probability;
+//
+// /* signals */
+// int signal_id, channels;
+//} BoidCondition;
+
+typedef enum BoidRulesetType {
+ eBoidRulesetType_Fuzzy = 0,
+ eBoidRulesetType_Random,
+ eBoidRulesetType_Average,
+ NUM_BOID_RULESET_TYPES
+} BoidRulesetType;
+#define BOIDSTATE_CURRENT 1
+typedef struct BoidState {
+ struct BoidState *next, *prev;
+ ListBase rules;
+ ListBase conditions;
+ ListBase actions;
+ char name[32];
+ int id, flag;
+
+ /* rules */
+ int ruleset_type;
+ float rule_fuzziness;
+
+ /* signal */
+ int signal_id, channels;
+ float volume, falloff;
+} BoidState;
+
+// planned for near future
+//typedef struct BoidSignal {
+// struct BoidSignal *next, *prev;
+// float loc[3];
+// float volume, falloff;
+// int id;
+//} BoidSignal;
+//typedef struct BoidSignalDefine {
+// struct BoidSignalDefine *next, *prev;
+// int id, rt;
+// char name[32];
+//} BoidSignalDefine;
+
+//typedef struct BoidSimulationData {
+// ListBase signal_defines;/* list of defined signals */
+// ListBase signals[20]; /* gathers signals from all channels */
+// struct KDTree *signaltrees[20];
+// char channel_names[20][32];
+// int last_signal_id; /* used for incrementing signal ids */
+// int flag; /* switches for drawing stuff */
+//} BoidSimulationData;
+
+typedef struct BoidSettings {
+ int options, last_state_id;
+
+ float landing_smoothness, rt;
+ float banking, height;
+
+ float health, aggression;
+ float strength, accuracy, range;
+
+ /* flying related */
+ float air_min_speed, air_max_speed;
+ float air_max_acc, air_max_ave;
+ float air_personal_space;
+
+ /* walk/run related */
+ float land_jump_speed, land_max_speed;
+ float land_max_acc, land_max_ave;
+ float land_personal_space;
+ float land_stick_force;
+
+ struct ListBase states;
+} BoidSettings;
+
+/* boidsettings->options */
+#define BOID_ALLOW_FLIGHT 1
+#define BOID_ALLOW_LAND 2
+#define BOID_ALLOW_CLIMB 4
+
+/* boidrule->options */
+//#define BOID_RULE_FOLLOW_LINE 1 /* follow leader */
+//#define BOID_RULE_PREDICT 2 /* goal/avoid */
+//#define BOID_RULE_ARRIVAL 4 /* goal */
+//#define BOID_RULE_LAND 8 /* goal */
+//#define BOID_RULE_WITH_BOIDS 16 /* avoid collision */
+//#define BOID_RULE_WITH_DEFLECTORS 32 /* avoid collision */
+
+#endif
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 8ce0b439b29..1bbccd20486 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -56,20 +56,19 @@ typedef struct Brush {
short flag, blend; /* general purpose flag, blend mode */
int size; /* brush diameter */
- float innerradius; /* inner radius after which the falloff starts */
+ float jitter; /* jitter the position of the brush */
float spacing; /* spacing of paint operations */
+ int smooth_stroke_radius; /* turning radius (in pixels) for smooth stroke */
+ float smooth_stroke_factor; /* higher values limit fast changes in the stroke direction */
float rate; /* paint operations / second (airbrush) */
float rgb[3]; /* color */
float alpha; /* opacity */
- float rot; /* rotation in radians */
-
short texact; /* active texture */
char sculpt_tool; /* active tool */
- char tex_mode;
- char pad[4];
+ char pad[1];
} Brush;
/* Brush.flag */
@@ -77,28 +76,15 @@ typedef struct Brush {
#define BRUSH_TORUS 2
#define BRUSH_ALPHA_PRESSURE 4
#define BRUSH_SIZE_PRESSURE 8
-#define BRUSH_RAD_PRESSURE 16
+#define BRUSH_JITTER_PRESSURE 16 /* was BRUSH_RAD_PRESSURE */
#define BRUSH_SPACING_PRESSURE 32
#define BRUSH_FIXED_TEX 64
#define BRUSH_RAKE 128
#define BRUSH_ANCHORED 256
#define BRUSH_DIR_IN 512
#define BRUSH_SPACE 1024
-
-/* Brush.blend */
-#define BRUSH_BLEND_MIX 0
-#define BRUSH_BLEND_ADD 1
-#define BRUSH_BLEND_SUB 2
-#define BRUSH_BLEND_MUL 3
-#define BRUSH_BLEND_LIGHTEN 4
-#define BRUSH_BLEND_DARKEN 5
-#define BRUSH_BLEND_ERASE_ALPHA 6
-#define BRUSH_BLEND_ADD_ALPHA 7
-
-/* Brush.tex_mode */
-#define BRUSH_TEX_DRAG 0
-#define BRUSH_TEX_TILE 1
-#define BRUSH_TEX_3D 2
+#define BRUSH_SMOOTH_STROKE 2048
+#define BRUSH_PERSISTENT 4096
/* Brush.sculpt_tool */
#define SCULPT_TOOL_DRAW 1
@@ -110,6 +96,7 @@ typedef struct Brush {
#define SCULPT_TOOL_FLATTEN 7
#define SCULPT_TOOL_CLAY 8
+/* ImagePaintSettings.tool */
#define PAINT_TOOL_DRAW 0
#define PAINT_TOOL_SOFTEN 1
#define PAINT_TOOL_SMEAR 2
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 7a504efdd2a..3d839570e17 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -32,7 +32,6 @@
#define DNA_CAMERA_TYPES_H
#include "DNA_ID.h"
-#include "DNA_scriptlink_types.h"
#ifdef __cplusplus
extern "C" {
@@ -61,7 +60,6 @@ typedef struct Camera {
struct Ipo *ipo; // XXX depreceated... old animation system
- ScriptLink scriptlink;
struct Object *dof_ob;
} Camera;
@@ -79,6 +77,7 @@ typedef struct Camera {
#define CAM_SHOWNAME 16
#define CAM_ANGLETOGGLE 32
#define CAM_DS_EXPAND 64
+#define CAM_PANORAMA 128
/* yafray: dof sampling switch */
#define CAM_YF_NO_QMC 512
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
index 33984582d7f..5cfecf7cc01 100644
--- a/source/blender/makesdna/DNA_cloth_types.h
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -68,6 +68,7 @@ typedef struct ClothSimSettings
float defgoal;
float goalspring;
float goalfrict;
+ float velocity_smooth; /* smoothing of velocities for hair */
int stepsPerFrame; /* Number of time steps per frame. */
int flags; /* flags, see CSIMSETT_FLAGS enum above. */
int preroll; /* How many frames of simulation to do before we start. */
@@ -78,7 +79,6 @@ typedef struct ClothSimSettings
short vgroup_struct; /* vertex group for scaling structural stiffness */
short presets; /* used for presets on GUI */
short pad;
- int pad2;
} ClothSimSettings;
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index 79f032d0d21..fccec7a556f 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -64,7 +64,11 @@ typedef struct bConstraint {
float enforce; /* Amount of influence exherted by constraint (0.0-1.0) */
float headtail; /* Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail*/
int pad;
- struct Ipo *ipo; /* local influence ipo or driver */
+
+ struct Ipo *ipo; /* local influence ipo or driver */ // XXX depreceated for 2.5... old animation system hack
+ /* below are readonly fields that are set at runtime by the solver for use in the GE (only IK atm) */
+ float lin_error; /* residual error on constraint expressed in blender unit*/
+ float rot_error; /* residual error on constraint expressed in radiant */
} bConstraint;
@@ -85,7 +89,7 @@ typedef struct bConstraintTarget {
short space; /* space that target should be evaluated in (overrides bConstraint->tarspace) */
short flag; /* runtime settings (for editor, etc.) */
short type; /* type of target (B_CONSTRAINT_OB_TYPE) */
- short pad;
+ short rotOrder; /* rotation order for target (as defined in BLI_arithb.h) */
} bConstraintTarget;
/* bConstraintTarget -> flag */
@@ -118,24 +122,34 @@ typedef struct bPythonConstraint {
} bPythonConstraint;
-/* Inverse-Kinematics (IK) constraint */
+/* inverse-Kinematics (IK) constraint
+ This constraint supports a variety of mode determine by the type field
+ according to B_CONSTRAINT_IK_TYPE.
+ Some fields are used by all types, some are specific to some types
+ This is indicated in the comments for each field
+ */
typedef struct bKinematicConstraint {
- Object *tar;
- short iterations; /* Maximum number of iterations to try */
- short flag; /* Like CONSTRAINT_IK_TIP */
- short rootbone; /* index to rootbone, if zero go all the way to mother bone */
- short max_rootbone; /* for auto-ik, maximum length of chain */
- char subtarget[32]; /* String to specify sub-object target */
-
- Object *poletar; /* Pole vector target */
- char polesubtarget[32]; /* Pole vector sub-object target */
- float poleangle; /* Pole vector rest angle */
-
- float weight; /* Weight of goal in IK tree */
- float orientweight; /* Amount of rotation a target applies on chain */
- float grabtarget[3]; /* for target-less IK */
+ Object *tar; /* All: target object in case constraint needs a target */
+ short iterations; /* All: Maximum number of iterations to try */
+ short flag; /* All & CopyPose: some options Like CONSTRAINT_IK_TIP */
+ short rootbone; /* All: index to rootbone, if zero go all the way to mother bone */
+ short max_rootbone; /* CopyPose: for auto-ik, maximum length of chain */
+ char subtarget[32]; /* All: String to specify sub-object target */
+ Object *poletar; /* All: Pole vector target */
+ char polesubtarget[32]; /* All: Pole vector sub-object target */
+ float poleangle; /* All: Pole vector rest angle */
+ float weight; /* All: Weight of constraint in IK tree */
+ float orientweight; /* CopyPose: Amount of rotation a target applies on chain */
+ float grabtarget[3]; /* CopyPose: for target-less IK */
+ short type; /* subtype of IK constraint: B_CONSTRAINT_IK_TYPE */
+ short mode; /* Distance: how to limit in relation to clamping sphere: LIMITDIST_.. */
+ float dist; /* Distance: distance (radius of clamping sphere) from target */
} bKinematicConstraint;
+typedef enum B_CONSTRAINT_IK_TYPE {
+ CONSTRAINT_IK_COPYPOSE = 0, /* 'standard' IK constraint: match position and/or orientation of target */
+ CONSTRAINT_IK_DISTANCE /* maintain distance with target */
+} B_CONSTRAINT_IK_TYPE;
/* Single-target subobject constraints --------------------- */
/* Track To Constraint */
@@ -375,7 +389,9 @@ typedef enum B_CONSTRAINT_FLAG {
/* influence ipo is on constraint itself, not in action channel */
CONSTRAINT_OWN_IPO = (1<<7),
/* indicates that constraint was added locally (i.e. didn't come from the proxy-lib) */
- CONSTRAINT_PROXY_LOCAL = (1<<8)
+ CONSTRAINT_PROXY_LOCAL = (1<<8),
+ /* indicates that constraint is temporarily disabled (only used in GE) */
+ CONSTRAINT_OFF = (1<<9)
} B_CONSTRAINT_FLAG;
/* bConstraint->ownspace/tarspace */
@@ -449,6 +465,11 @@ typedef enum B_CONSTRAINTCHANNEL_FLAG {
#define TRACK_nY 0x04
#define TRACK_nZ 0x05
+/* FollowPath flags */
+#define FOLLOWPATH_FOLLOW 0x01
+#define FOLLOWPATH_STATIC 0x02
+#define FOLLOWPATH_RADIUS 0x04
+
/* bTrackToConstraint->flags */
#define TARGET_Z_UP 0x01
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index f8ea5f95d65..6cfeb646cf2 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -52,9 +52,18 @@ struct EditFont;
/* These two Lines with # tell makesdna this struct can be excluded. */
#
#
+typedef struct PathPoint {
+ float vec[4]; /* grr, cant get rid of tilt yet */
+ float quat[4];
+ float radius;
+} PathPoint;
+
+/* These two Lines with # tell makesdna this struct can be excluded. */
+#
+#
typedef struct Path {
int len;
- float *data;
+ struct PathPoint *data;
float totdist;
} Path;
@@ -63,37 +72,42 @@ typedef struct Path {
#
typedef struct BevList {
struct BevList *next, *prev;
- int nr, flag;
- short poly, gat;
+ int nr, dupe_nr;
+ short poly, hole;
} BevList;
/* These two Lines with # tell makesdna this struct can be excluded. */
#
#
typedef struct BevPoint {
- float x, y, z, alfa, radius, sina, cosa, mat[3][3];
- short f1, f2;
+ float vec[3], alfa, radius;
+ float sina, cosa; /* 2D Only */
+ float dir[3], tan[3], quat[4]; /* 3D Only */
+ short split_tag, dupe_tag;
} BevPoint;
-/* Keyframes on IPO curves and Points on Bezier Curves/Paths are generally BezTriples */
+/* Keyframes on F-Curves (allows code reuse of Bezier eval code) and
+ * Points on Bezier Curves/Paths are generally BezTriples
+ */
/* note: alfa location in struct is abused by Key system */
/* vec in BezTriple looks like this:
vec[0][0]=x location of handle 1
vec[0][1]=y location of handle 1
- vec[0][2]=z location of handle 1 (not used for IpoCurve Points(2d))
+ vec[0][2]=z location of handle 1 (not used for FCurve Points(2d))
vec[1][0]=x location of control point
vec[1][1]=y location of control point
vec[1][2]=z location of control point
vec[2][0]=x location of handle 2
vec[2][1]=y location of handle 2
- vec[2][2]=z location of handle 2 (not used for IpoCurve Points(2d))
+ vec[2][2]=z location of handle 2 (not used for FCurve Points(2d))
*/
typedef struct BezTriple {
float vec[3][3];
float alfa, weight, radius; /* alfa: tilt in 3D View, weight: used for softbody goal weight, radius: for bevel tapering */
short ipo; /* ipo: interpolation mode for segment from this BezTriple to the next */
char h1, h2; /* h1, h2: the handle type of the two handles */
- char f1, f2, f3, hide; /* f1, f2, f3: used for selection status, hide: used to indicate whether BezTriple is hidden */
+ char f1, f2, f3; /* f1, f2, f3: used for selection status */
+ char hide; /* hide: used to indicate whether BezTriple is hidden (3D), type of keyframe (eBezTriple_KeyframeTypes) */
} BezTriple;
/* note; alfa location in struct is abused by Key system */
@@ -142,13 +156,13 @@ typedef struct Curve {
struct BoundBox *bb;
- ListBase nurb; /* actual data */
+ ListBase nurb; /* actual data, called splines in rna */
ListBase disp;
ListBase *editnurb; /* edited data, not in file, use pointer so we can check for it */
struct Object *bevobj, *taperobj, *textoncurve;
- struct Ipo *ipo;
+ struct Ipo *ipo; // XXX depreceated... old animation system
Path *path;
struct Key *key;
struct Material **mat;
@@ -160,7 +174,10 @@ typedef struct Curve {
float size[3];
float rot[3];
- int texflag;
+ int texflag; /* keep an int because of give_obdata_texspace() */
+
+ short drawflag, twist_mode, pad[2];
+ float twist_smooth, pad2;
short pathlen, totcol;
short flag, bevresol;
@@ -169,7 +186,7 @@ typedef struct Curve {
/* default */
short resolu, resolv;
short resolu_ren, resolv_ren;
-
+
/* edit, index in nurb list */
int actnu;
/* edit, last selected bpoint */
@@ -193,7 +210,8 @@ typedef struct Curve {
int sepchar;
- int totbox, actbox, pad;
+ float ctime; /* current evaltime - for use by Objects parented to curves */
+ int totbox, actbox;
struct TextBox *tb;
int selstart, selend;
@@ -207,6 +225,10 @@ typedef struct Curve {
/* texflag */
#define CU_AUTOSPACE 1
+/* drawflag */
+#define CU_HIDE_HANDLES (1 << 0)
+#define CU_HIDE_NORMALS (1 << 1)
+
/* flag */
#define CU_3D 1
#define CU_FRONT 2
@@ -220,6 +242,14 @@ typedef struct Curve {
#define CU_FAST 512 /* Font: no filling inside editmode */
#define CU_RETOPO 1024
#define CU_DS_EXPAND 2048
+#define CU_PATH_RADIUS 4096 /* make use of the path radius if this is enabled (default for new curves) */
+
+/* twist mode */
+#define CU_TWIST_Z_UP 0
+// #define CU_TWIST_Y_UP 1 // not used yet
+// #define CU_TWIST_X_UP 2
+#define CU_TWIST_MINIMUM 3
+#define CU_TWIST_TANGENT 4
/* spacemode */
#define CU_LEFT 0
@@ -230,6 +260,7 @@ typedef struct Curve {
/* flag (nurb) */
#define CU_SMOOTH 1
+#define CU_2D 8 /* moved from type since 2.4x */
/* type (nurb) */
#define CU_POLY 0
@@ -237,9 +268,7 @@ typedef struct Curve {
#define CU_BSPLINE 2
#define CU_CARDINAL 3
#define CU_NURBS 4
-#define CU_TYPE 7
-
-#define CU_2D 8
+#define CU_TYPE (CU_POLY|CU_BEZIER|CU_BSPLINE|CU_CARDINAL|CU_NURBS)
/* only for adding */
#define CU_PRIMITIVE 0xF00
@@ -278,6 +307,17 @@ typedef enum eBezTriple_Interpolation {
BEZT_IPO_BEZ, /* bezier interpolation */
} eBezTriple_Interpolation;
+/* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
+typedef enum eBezTriple_KeyframeType {
+ BEZT_KEYTYPE_KEYFRAME = 0, /* default - 'proper' Keyframe */
+ BEZT_KEYTYPE_EXTREME, /* 'extreme' keyframe */
+ BEZT_KEYTYPE_BREAKDOWN, /* 'breakdown' keyframe */
+} eBezTriple_KeyframeType;
+
+/* checks if the given BezTriple is selected */
+#define BEZSELECTED(bezt) (((bezt)->f2 & SELECT) || ((bezt)->f1 & SELECT) || ((bezt)->f3 & SELECT))
+#define BEZSELECTED_HIDDENHANDLES(cu, bezt) (((cu)->drawflag & CU_HIDE_HANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt))
+
/* *************** CHARINFO **************** */
/* flag */
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index ed209a127c7..4bae9935ea7 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -33,7 +33,7 @@
/* Grease-Pencil Annotations - 'Stroke Point'
* -> Coordinates may either be 2d or 3d depending on settings at the time
* -> Coordinates of point on stroke, in proportions of window size
- * (i.e. n/1000). This assumes that the bottom-left corner is (0,0)
+ * This assumes that the bottom-left corner is (0,0)
*/
typedef struct bGPDspoint {
float x, y, z; /* co-ordinates of point (usually 2d, but can be 3d as well) */
@@ -135,12 +135,14 @@ typedef struct bGPdata {
/* bGPdata->flag */
// XXX many of these flags should be depreceated for more general ideas in 2.5
/* don't allow painting to occur at all */
+ // XXX is depreceated - not well understood
#define GP_DATA_LMBPLOCK (1<<0)
/* show debugging info in viewport (i.e. status print) */
#define GP_DATA_DISPINFO (1<<1)
/* in Action Editor, show as expanded channel */
#define GP_DATA_EXPAND (1<<2)
/* is the block overriding all clicks? */
+ // XXX is depreceated - nasty old concept
#define GP_DATA_EDITPAINT (1<<3)
/* new strokes are added in viewport space */
#define GP_DATA_VIEWALIGN (1<<4)
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index 371b0d75951..65e4be1173d 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -87,6 +87,9 @@ typedef struct Image {
struct PackedFile * packedfile;
struct PreviewImage * preview;
+ /* not saved in file, statistics for render result */
+ char *render_text;
+
float lastupdate;
int lastused;
short animspeed;
@@ -120,5 +123,9 @@ typedef struct Image {
/* ima->type and ima->source moved to BKE_image.h, for API */
+/* render_text maxlen */
+#define IMA_RW_MAXTEXT 512
+
+
#endif
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index c6a1a2b45e2..78c8d1a5607 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -32,7 +32,6 @@
#define DNA_LAMP_TYPES_H
#include "DNA_ID.h"
-#include "DNA_scriptlink_types.h"
#ifndef MAX_MTEX
#define MAX_MTEX 18
@@ -104,13 +103,12 @@ typedef struct Lamp {
float YF_glowint, YF_glowofs;
short YF_glowtype, YF_pad2;
- struct MTex *mtex[18]; /* MAX_MTEX */
struct Ipo *ipo; // XXX depreceated... old animation system
+ struct MTex *mtex[18]; /* MAX_MTEX */
+ short pr_texture, pad[3];
/* preview */
struct PreviewImage *preview;
-
- ScriptLink scriptlink;
} Lamp;
/* **************** LAMP ********************* */
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index cd0b73c8f70..55e3c9107e4 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -32,7 +32,6 @@
#define DNA_MATERIAL_TYPES_H
#include "DNA_ID.h"
-#include "DNA_scriptlink_types.h"
#include "DNA_listBase.h"
#ifndef MAX_MTEX
@@ -48,6 +47,34 @@ struct Ipo;
/* WATCH IT: change type? also make changes in ipo.h */
+typedef struct VolumeSettings {
+ float density;
+ float emission;
+ float absorption;
+ float scattering;
+
+ float emission_col[3];
+ float absorption_col[3];
+ float density_scale;
+ float depth_cutoff;
+
+ short phasefunc_type;
+ short vpad[3];
+ float phasefunc_g;
+
+ float stepsize;
+ float shade_stepsize;
+
+ short stepsize_type;
+ short shadeflag;
+ short shade_type;
+ short precache_resolution;
+
+ float ms_diff;
+ float ms_intensity;
+ int ms_steps;
+} VolumeSettings;
+
typedef struct Material {
ID id;
struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */
@@ -63,6 +90,8 @@ typedef struct Material {
float translucency;
/* end synced with render_types.h */
+ struct VolumeSettings vol;
+
float fresnel_mir, fresnel_mir_i;
float fresnel_tra, fresnel_tra_i;
float filter; /* filter added, for raytrace transparency and transmissivity */
@@ -93,7 +122,7 @@ typedef struct Material {
/* for buttons and render*/
char rgbsel, texact, pr_type, use_nodes;
- short pr_back, pr_lamp, pad4, ml_flag; /* ml_flag is for disable base material */
+ short pr_back, pr_lamp, pr_texture, ml_flag; /* ml_flag is for disable base material */
/* shaders */
short diff_shader, spec_shader;
@@ -134,23 +163,22 @@ typedef struct Material {
/* yafray: absorption color, dispersion parameters and material preset menu */
float YF_ar, YF_ag, YF_ab, YF_dscale, YF_dpwr;
int YF_dsmp, YF_preset, YF_djit;
-
- ScriptLink scriptlink;
ListBase gpumaterial; /* runtime */
} Material;
/* **************** MATERIAL ********************* */
- /* maximum number of materials per material array
- * (on object, mesh, lamp, etc.)
- */
-#define MAXMAT 16
+/* maximum number of materials per material array.
+ * (on object, mesh, lamp, etc.). limited by
+ * short mat_nr in verts, faces. */
+#define MAXMAT 32767
/* material_type */
#define MA_TYPE_SURFACE 0
#define MA_TYPE_HALO 1
#define MA_TYPE_VOLUME 2
+#define MA_TYPE_WIRE 3
/* flag */
/* for render */
@@ -162,11 +190,11 @@ typedef struct Material {
#define MA_TRACEBLE 1
#define MA_SHADOW 2
#define MA_SHLESS 4
-#define MA_WIRE 8
+#define MA_WIRE 8 /* deprecated */
#define MA_VERTEXCOL 16
#define MA_HALO_SOFT 16
#define MA_HALO 32 /* deprecated */
-#define MA_ZTRA 64
+#define MA_ZTRANSP 64
#define MA_VERTEXCOLP 128
#define MA_ZINV 256
#define MA_HALO_RINGS 256
@@ -182,7 +210,7 @@ typedef struct Material {
#define MA_NOMIST 0x4000
#define MA_HALO_SHADE 0x4000
#define MA_HALO_FLARE 0x8000
-#define MA_RADIO 0x10000
+#define MA_TRANSP 0x10000
#define MA_RAYTRANSP 0x20000
#define MA_RAYMIRROR 0x40000
#define MA_SHADOW_TRA 0x80000
@@ -226,7 +254,7 @@ typedef struct Material {
#define MA_SPEC_WARDISO 4
/* dynamode */
-#define MA_DRAW_DYNABUTS 1
+#define MA_DRAW_DYNABUTS 1 /* deprecated */
#define MA_FH_NOR 2
/* ramps */
@@ -251,6 +279,8 @@ typedef struct Material {
#define MA_RAMP_SAT 13
#define MA_RAMP_VAL 14
#define MA_RAMP_COLOR 15
+#define MA_RAMP_SOFT 16
+#define MA_RAMP_LINEAR 17
/* texco */
#define TEXCO_ORCO 1
@@ -289,6 +319,14 @@ typedef struct Material {
#define MAP_WARP 8192
#define MAP_LAYER 16384
+/* volume mapto - reuse definitions for now - a bit naughty! */
+#define MAP_DENSITY 128
+#define MAP_EMISSION 64
+#define MAP_EMISSION_COL 1
+#define MAP_ABSORPTION 512
+#define MAP_ABSORPTION_COL 8
+#define MAP_SCATTERING 16
+
/* mapto for halo */
//#define MAP_HA_COL 1
//#define MAP_HA_ALPHA 128
@@ -332,5 +370,29 @@ typedef struct Material {
/* sss_flag */
#define MA_DIFF_SSS 1
+/* vol_stepsize_type */
+#define MA_VOL_STEP_RANDOMIZED 0
+#define MA_VOL_STEP_CONSTANT 1
+#define MA_VOL_STEP_ADAPTIVE 2
+
+/* vol_shadeflag */
+#define MA_VOL_SHADED 1
+#define MA_VOL_RECVSHADOW 4
+#define MA_VOL_PRECACHESHADING 8
+
+/* vol_shading_type */
+#define MA_VOL_SHADE_NONE 0
+#define MA_VOL_SHADE_SINGLE 1
+#define MA_VOL_SHADE_MULTIPLE 2
+#define MA_VOL_SHADE_SINGLEPLUSMULTIPLE 3
+
+/* vol_phasefunc_type */
+#define MA_VOL_PH_ISOTROPIC 0
+#define MA_VOL_PH_MIEHAZY 1
+#define MA_VOL_PH_MIEMURKY 2
+#define MA_VOL_PH_RAYLEIGH 3
+#define MA_VOL_PH_HG 4
+#define MA_VOL_PH_SCHLICK 5
+
#endif
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 3ecfe416c79..f7f1d3b53bd 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -139,7 +139,7 @@ typedef struct TFace {
#define ME_DRAWCREASES (1 << 6)
#define ME_DRAWSEAMS (1 << 7)
#define ME_DRAWSHARP (1 << 8)
-#define ME_DRAWBWEIGHTS (1 << 8)
+#define ME_DRAWBWEIGHTS (1 << 9)
#define ME_DRAW_EDGELEN (1 << 10)
#define ME_DRAW_FACEAREA (1 << 11)
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index cec27b85b23..d53a7833d0e 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -37,7 +37,7 @@ struct Image;
typedef struct MFace {
unsigned int v1, v2, v3, v4;
- char pad, mat_nr;
+ short mat_nr;
char edcode, flag; /* we keep edcode, for conversion to edges draw flags in old files */
} MFace;
@@ -61,7 +61,8 @@ typedef struct MDeformVert {
typedef struct MVert {
float co[3];
short no[3];
- char flag, mat_nr, bweight, pad[3];
+ short mat_nr;
+ char flag, bweight, pad[2];
} MVert;
/* at the moment alpha is abused for vertex painting
@@ -134,7 +135,7 @@ typedef struct MultiresColFace {
} MultiresColFace;
typedef struct MultiresFace {
unsigned int v[4];
- unsigned int mid;
+ unsigned int mid;
char flag, mat_nr, pad[2];
} MultiresFace;
typedef struct MultiresEdge {
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index 862f3ca184b..8b61405b851 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -35,6 +35,7 @@
#include "DNA_ID.h"
struct BoundBox;
+struct AnimData;
struct Ipo;
struct Material;
@@ -48,7 +49,9 @@ typedef struct MetaElem {
short type, flag, selcol1, selcol2;
float x, y, z; /* Position of center of MetaElem */
float quat[4]; /* Rotation of MetaElem */
- float expx, expy, expz; /* dimension parameters, used for some types like cubes */
+ float expx; /* dimension parameters, used for some types like cubes */
+ float expy;
+ float expz;
float rad; /* radius of the meta element */
float rad2; /* temp field, used only while processing */
float s; /* stiffness, how much of the element to fill */
@@ -60,18 +63,20 @@ typedef struct MetaElem {
typedef struct MetaBall {
ID id;
+ struct AnimData *adt;
struct BoundBox *bb;
ListBase elems;
ListBase disp;
ListBase *editelems; /* not saved in files, note we use pointer for editmode check */
- struct Ipo *ipo;
+ struct Ipo *ipo; // XXX... depreceated (old animation system)
/* material of the mother ball will define the material used of all others */
struct Material **mat;
- short flag, totcol;
+ char flag, flag2; /* flag is enum for updates, flag2 is bitflags for settings */
+ short totcol;
int texflag; /* used to store MB_AUTOSPACE */
/* texture space, copied as one block in editobject.c */
@@ -85,8 +90,10 @@ typedef struct MetaBall {
mother ball changes will effect other objects thresholds,
but these may also have their own thresh as an offset */
float thresh;
-
-
+
+ /* used in editmode */
+ /*ListBase edit_elems;*/
+ MetaElem *lastelem;
} MetaBall;
/* **************** METABALL ********************* */
@@ -100,6 +107,10 @@ typedef struct MetaBall {
#define MB_UPDATE_FAST 2
#define MB_UPDATE_NEVER 3
+/* mb->flag2 */
+#define MB_DS_EXPAND (1<<0)
+
+
/* ml->type */
#define MB_BALL 0
#define MB_TUBEX 1 /* depercated */
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 76f6b980aa2..bcb85b5f87e 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -41,6 +41,7 @@ typedef enum ModifierType {
eModifierType_SimpleDeform,
eModifierType_Multires,
eModifierType_Surface,
+ eModifierType_Smoke,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -237,6 +238,22 @@ typedef struct BMeshModifierData {
int type;
} BMeshModifierData;
+
+/* Smoke modifier flags */
+#define MOD_SMOKE_TYPE_DOMAIN (1 << 0)
+#define MOD_SMOKE_TYPE_FLOW (1 << 1)
+#define MOD_SMOKE_TYPE_COLL (1 << 2)
+
+typedef struct SmokeModifierData {
+ ModifierData modifier;
+
+ struct SmokeDomainSettings *domain;
+ struct SmokeFlowSettings *flow; /* inflow, outflow, smoke objects */
+ struct SmokeCollSettings *coll; /* collision objects */
+ float time;
+ int type; /* domain, inflow, outflow, ... */
+} SmokeModifierData;
+
typedef struct DisplaceModifierData {
ModifierData modifier;
@@ -272,7 +289,7 @@ typedef struct UVProjectModifierData {
ModifierData modifier;
/* the objects which do the projecting */
- struct Object *projectors[10];
+ struct Object *projectors[10]; /* MOD_UVPROJECT_MAX */
struct Image *image; /* the image to project */
int flags;
int num_projectors;
@@ -380,6 +397,8 @@ typedef struct HookModifierData {
ModifierData modifier;
struct Object *object;
+ char subtarget[32]; /* optional name of bone target */
+
float parentinv[4][4]; /* matrix making current transform unmodified */
float cent[3]; /* visualization of hook */
float falloff; /* if not zero, falloff is distance where influence zero */
@@ -402,6 +421,7 @@ typedef struct ClothModifierData {
struct ClothSimSettings *sim_parms; /* definition is in DNA_cloth_types.h */
struct ClothCollSettings *coll_parms; /* definition is in DNA_cloth_types.h */
struct PointCache *point_cache; /* definition is in DNA_object_force.h */
+ struct ListBase ptcaches;
} ClothModifierData;
typedef struct CollisionModifierData {
@@ -418,18 +438,21 @@ typedef struct CollisionModifierData {
unsigned int numverts;
unsigned int numfaces;
- short absorption; /* used for forces, in % */
- short pad;
- float time; /* cfra time of modifier */
+ float time, pad; /* cfra time of modifier */
struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
} CollisionModifierData;
typedef struct SurfaceModifierData {
ModifierData modifier;
+ struct MVert *x; /* old position */
+ struct MVert *v; /* velocity */
+
struct DerivedMesh *dm;
struct BVHTreeFromMesh *bvhtree; /* bounding volume hierarchy of the mesh faces */
+
+ int cfra, numverts;
} SurfaceModifierData;
typedef enum {
@@ -444,8 +467,8 @@ typedef struct BooleanModifierData {
int operation, pad;
} BooleanModifierData;
-#define MOD_MDEF_INVERT_VGROUP (1<<0)
-#define MOD_MDEF_DYNAMIC_BIND (1<<1)
+#define MOD_MDEF_INVERT_VGROUP (1<<0)
+#define MOD_MDEF_DYNAMIC_BIND (1<<1)
typedef struct MDefInfluence {
int vertex;
@@ -503,12 +526,15 @@ typedef enum {
eParticleInstanceFlag_Unborn = (1<<3),
eParticleInstanceFlag_Alive = (1<<4),
eParticleInstanceFlag_Dead = (1<<5),
+ eParticleInstanceFlag_KeepShape = (1<<6),
+ eParticleInstanceFlag_UseSize = (1<<7),
} ParticleInstanceModifierFlag;
typedef struct ParticleInstanceModifierData {
ModifierData modifier;
struct Object *ob;
- short psys, flag, rt[2];
+ short psys, flag, axis, rt;
+ float position, random_position;
} ParticleInstanceModifierData;
typedef enum {
@@ -614,4 +640,6 @@ typedef struct SimpleDeformModifierData {
coordinates or global coordinates of origin */
#define MOD_SIMPLEDEFORM_ORIGIN_LOCAL (1<<0)
+#define MOD_UVPROJECT_MAX 10
+
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index b10de02dbb4..e70221df9ab 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -40,6 +40,7 @@ struct bNodeLink;
struct bNodeType;
struct bNodeGroup;
struct AnimData;
+struct uiBlock;
#define NODE_MAXSTR 32
@@ -131,6 +132,7 @@ typedef struct bNode {
rctf butr; /* optional buttons area */
rctf prvr; /* optional preview area */
bNodePreview *preview; /* optional preview image */
+ struct uiBlock *block; /* runtime during drawing */
struct bNodeType *typeinfo; /* lookup of callbacks and defaults */
diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h
index 66c5baab84b..da55fb1d47c 100644
--- a/source/blender/makesdna/DNA_object_fluidsim.h
+++ b/source/blender/makesdna/DNA_object_fluidsim.h
@@ -41,6 +41,7 @@ struct Ipo;
struct MVert;
typedef struct FluidsimSettings {
+ struct FluidsimModifierData *fmd; /* for fast RNA access */
/* domain,fluid or obstacle */
short type;
/* display advanced options in fluid sim tab (on=1,off=0)*/
@@ -135,12 +136,12 @@ typedef struct FluidsimSettings {
/* ob->fluidsimSettings defines */
#define OB_FLUIDSIM_ENABLE 1
#define OB_FLUIDSIM_DOMAIN 2
-#define OB_FLUIDSIM_FLUID 4
+#define OB_FLUIDSIM_FLUID 4
#define OB_FLUIDSIM_OBSTACLE 8
-#define OB_FLUIDSIM_INFLOW 16
-#define OB_FLUIDSIM_OUTFLOW 32
-#define OB_FLUIDSIM_PARTICLE 64
-#define OB_FLUIDSIM_CONTROL 128
+#define OB_FLUIDSIM_INFLOW 16
+#define OB_FLUIDSIM_OUTFLOW 32
+#define OB_FLUIDSIM_PARTICLE 64
+#define OB_FLUIDSIM_CONTROL 128
#define OB_TYPEFLAG_START 7
#define OB_FSGEO_THIN (1<<(OB_TYPEFLAG_START+1))
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index a8d402fc503..468ad35de85 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -62,6 +62,8 @@ typedef struct PartDeflect {
float pdef_sbift; /* inner face thickness for softbody deflection */
float pdef_sboft; /* outer face thickness for softbody deflection */
+ float absorption, pad; /* used for forces */
+
/* variables for guide curve */
float clump_fac, clump_pow;
float kink_freq, kink_shape, kink_amp, free_end;
@@ -74,25 +76,56 @@ typedef struct PartDeflect {
int seed; /* wind noise random seed */
} PartDeflect;
+/* Point cache file data types:
+ * - used as (1<<flag) so poke jahka if you reach the limit of 15
+ * - to add new data types update:
+ * * BKE_ptcache_data_size()
+ * * ptcache_file_init_pointers()
+*/
+#define BPHYS_DATA_INDEX 0
+#define BPHYS_DATA_LOCATION 1
+#define BPHYS_DATA_VELOCITY 2
+#define BPHYS_DATA_ROTATION 3
+#define BPHYS_DATA_AVELOCITY 4 /* used for particles */
+#define BPHYS_DATA_XCONST 4 /* used for cloth */
+#define BPHYS_DATA_SIZE 5
+#define BPHYS_DATA_TIMES 6
+#define BPHYS_DATA_BOIDS 7
+
+#define BPHYS_TOT_DATA 8
+
typedef struct PTCacheMem {
struct PTCacheMem *next, *prev;
int frame, totpoint;
- float *data; /* data points */
- void *xdata; /* extra data */
+ 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 */
} PTCacheMem;
typedef struct PointCache {
- int flag, rt; /* generic flag */
+ struct PointCache *next, *prev;
+ int flag; /* generic flag */
+ int step; /* frames between cached frames */
int simframe; /* current frame of simulation (only if SIMULATION_VALID) */
int startframe; /* simulation start frame */
int endframe; /* simulation end frame */
int editframe; /* frame being edited (runtime only) */
int last_exact; /* last exact frame that's cached */
- int xdata_type; /* type of extra data */
+
+ /* for external cache files */
+ int totpoint; /* number of cached points */
+ int index, rt; /* modifier stack index */
+
char name[64];
char prev_name[64];
char info[64];
+ char path[240]; /* file path */
struct ListBase mem_cache;
+
+ struct PTCacheEdit *edit;
+ void (*free_edit)(struct PTCacheEdit *edit); /* free callback */
} PointCache;
typedef struct SBVertex {
@@ -153,18 +186,21 @@ typedef struct BulletSoftBody {
typedef struct SoftBody {
- struct ParticleSystem *particles; /* particlesystem softbody */
-
/* dynamic data */
int totpoint, totspring;
struct BodyPoint *bpoint; /* not saved in file */
struct BodySpring *bspring; /* not saved in file */
- float pad;
+ char pad;
+ char msg_lock;
+ short msg_value;
/* part of UI: */
/* general options */
float nodemass; /* softbody mass of *vertex* */
+ char namedVG_Mass[32]; /* along with it introduce mass painting
+ starting to fix old bug .. nastyness that VG are indexes
+ rather find them by name tag to find it -> jow20090613 */
float grav; /* softbody amount of gravitaion to apply */
float mediafrict; /* friction to env */
float rklimit; /* error limit for ODE solver */
@@ -177,13 +213,18 @@ typedef struct SoftBody {
float maxgoal;
float defgoal; /* default goal for vertices without vgroup */
short vertgroup; /* index starting at 1 */
+ char namedVG_Softgoal[32]; /* starting to fix old bug .. nastyness that VG are indexes
+ rather find them by name tag to find it -> jow20090613 */
short fuzzyness; /* */
/* springs */
float inspring; /* softbody inner springs */
float infrict; /* softbody inner springs friction */
-
+ char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting
+ starting to fix old bug .. nastyness that VG are indexes
+ rather find them by name tag to find it -> jow20090613 */
+
/* baking */
int sfra, efra;
int interval;
@@ -213,6 +254,7 @@ typedef struct SoftBody {
float inpush;
struct PointCache *pointcache;
+ struct ListBase ptcaches;
} SoftBody;
@@ -226,6 +268,7 @@ typedef struct SoftBody {
#define PFIELD_HARMONIC 7
#define PFIELD_CHARGE 8
#define PFIELD_LENNARDJ 9
+#define PFIELD_BOID 10
/* pd->flag: various settings */
@@ -260,13 +303,19 @@ typedef struct SoftBody {
#define PTCACHE_OUTDATED 2
#define PTCACHE_SIMULATION_VALID 4
#define PTCACHE_BAKING 8
-#define PTCACHE_BAKE_EDIT 16
-#define PTCACHE_BAKE_EDIT_ACTIVE 32
+//#define PTCACHE_BAKE_EDIT 16
+//#define PTCACHE_BAKE_EDIT_ACTIVE 32
#define PTCACHE_DISK_CACHE 64
-#define PTCACHE_AUTOCACHE 128
+#define PTCACHE_QUICK_CACHE 128
+#define PTCACHE_FRAMES_SKIPPED 256
+#define PTCACHE_EXTERNAL 512
+#define PTCACHE_READ_INFO 1024
+
+/* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
+#define PTCACHE_REDO_NEEDED 258
/* ob->softflag */
-#define OB_SB_ENABLE 1
+#define OB_SB_ENABLE 1 /* deprecated, use modifier */
#define OB_SB_GOAL 2
#define OB_SB_EDGES 4
#define OB_SB_QUADS 8
@@ -279,7 +328,7 @@ typedef struct SoftBody {
#define OB_SB_FACECOLL 1024
#define OB_SB_EDGECOLL 2048
#define OB_SB_COLLFINAL 4096
-//#define OB_SB_PROTECT_CACHE 8192
+#define OB_SB_BIG_UI 8192
#define OB_SB_AERO_ANGLE 16384
/* sb->solverflags */
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index febf2fe59cd..f0fd3e60cf2 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -35,7 +35,6 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
-#include "DNA_scriptlink_types.h"
#ifdef __cplusplus
extern "C" {
@@ -54,7 +53,11 @@ struct SoftBody;
struct FluidsimSettings;
struct ParticleSystem;
struct DerivedMesh;
+struct SculptSession;
+struct bGPdata;
+
+/* Vertex Groups - Name Info */
typedef struct bDeformGroup {
struct bDeformGroup *next, *prev;
char name[32];
@@ -92,6 +95,8 @@ typedef struct BoundBox {
typedef struct Object {
ID id;
struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */
+
+ struct SculptSession *sculpt;
short type, partype;
int par1, par2, par3; /* can be vertexnrs */
@@ -108,13 +113,22 @@ typedef struct Object {
struct bPose *pose;
void *data;
+ struct bGPdata *gpd; /* Grease Pencil data */
+
ListBase constraintChannels; // XXX depreceated... old animation system
ListBase effect;
ListBase disp;
ListBase defbase;
ListBase modifiers; /* list of ModifierData structures */
-
- struct Material **mat;
+
+ int mode; /* Local object mode */
+ int restore_mode; /* Keep track of what mode to return to after toggling a mode */
+
+ /* materials */
+ struct Material **mat; /* material slots */
+ char *matbits; /* 1 if material linked to object */
+ int totcol; /* copy of mesh or curve or meta */
+ int actcol; /* currently selected material in the UI */
/* rot en drot have to be together! (transform('r' en 's')) */
float loc[3], dloc[3], orig[3];
@@ -129,7 +143,7 @@ typedef struct Object {
unsigned int lay; /* copy of Base */
short flag; /* copy of Base */
- short colbits; /* when zero, from obdata */
+ short colbits; /* deprecated */
short transflag, protectflag; /* transformation settings and transform locks */
short trackflag, upflag;
@@ -164,13 +178,10 @@ typedef struct Object {
float m_contactProcessingThreshold;
char dt, dtx;
- char totcol; /* copy of mesh or curve or meta */
- char actcol; /* currently selected material in the user interface */
- char empty_drawtype, pad1[3];
+ char empty_drawtype, pad1[5];
float empty_drawsize;
float dupfacesca; /* dupliface scale */
- ScriptLink scriptlink;
ListBase prop;
ListBase sensors;
ListBase controllers;
@@ -203,7 +214,7 @@ typedef struct Object {
short recalc; /* dependency flag */
float anisotropicFriction[3];
- ListBase constraints;
+ ListBase constraints; /* object constraints */
ListBase nlastrips; // XXX depreceated... old animation system
ListBase hooks;
ListBase particlesystem; /* particle systems */
@@ -227,9 +238,12 @@ typedef struct Object {
int lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
unsigned int state; /* bit masks of game controllers that are active */
unsigned int init_state; /* bit masks of initial state as recorded by the users */
+
int pad2;
ListBase gpulamp; /* runtime, for lamps only */
+ ListBase pc_ids;
+ ListBase *duplilist; /* for temporary dupli list storage, only for use by RNA API */
} Object;
/* Warning, this is not used anymore because hooks are now modifiers */
@@ -250,6 +264,14 @@ typedef struct ObHook {
float force;
} ObHook;
+typedef struct DupliObject {
+ struct DupliObject *next, *prev;
+ struct Object *ob;
+ unsigned int origlay;
+ int index, no_draw, type, animated;
+ float mat[4][4], omat[4][4];
+ float orco[3], uv[2];
+} DupliObject;
/* this work object is defined in object.c */
extern Object workob;
@@ -395,7 +417,6 @@ extern Object workob;
#define OB_DONE 1024
#define OB_RADIO 2048
#define OB_FROMGROUP 4096
-#define OB_POSEMODE 8192
/* ob->recalc (flag bits!) */
#define OB_RECALC_OB 1
@@ -487,6 +508,8 @@ extern Object workob;
#define OB_ADS_SHOWCONS (1<<12)
/* object's material channels */
#define OB_ADS_SHOWMATS (1<<13)
+ /* object's marticle channels */
+#define OB_ADS_SHOWPARTS (1<<14)
/* ob->protectflag */
#define OB_LOCK_LOCX 1
@@ -501,8 +524,20 @@ extern Object workob;
#define OB_LOCK_SCALEY 128
#define OB_LOCK_SCALEZ 256
#define OB_LOCK_SCALE 448
-
-/* ob->softflag in DNA_object_force.h */
+#define OB_LOCK_ROTW 512
+#define OB_LOCK_ROT4D 1024
+
+/* ob->mode */
+typedef enum ObjectMode {
+ OB_MODE_OBJECT = 0,
+ OB_MODE_EDIT = 1,
+ OB_MODE_SCULPT = 2,
+ OB_MODE_VERTEX_PAINT = 4,
+ OB_MODE_WEIGHT_PAINT = 8,
+ OB_MODE_TEXTURE_PAINT = 16,
+ OB_MODE_PARTICLE_EDIT = 32,
+ OB_MODE_POSE = 64
+} ObjectMode;
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 05f1cc1f351..089c1c76bcf 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -33,6 +33,7 @@
#define DNA_PARTICLE_TYPES_H
#include "DNA_ID.h"
+#include "DNA_boid_types.h"
struct AnimData;
@@ -52,64 +53,73 @@ typedef struct ParticleKey { /* when changed update size of struct to copy_parti
float time; /* when this key happens */
} ParticleKey;
+typedef struct BoidParticle {
+ struct Object *ground;
+ struct BoidData data;
+ float gravity[3];
+ float wander[3];
+ float rt;
+} BoidParticle;
+
/* Child particles are created around or between parent particles */
typedef struct ChildParticle {
int num, parent; /* num is face index on the final derived mesh */
int pa[4]; /* nearest particles to the child, used for the interpolation */
float w[4]; /* interpolation weights for the above particles */
float fuv[4], foffset; /* face vertex weights and offset */
- float rand[3];
+ float rt;
} ChildParticle;
-/* Everything that's non dynamic for a particle: */
-typedef struct ParticleData {
- struct Object *stick_ob;/* object that particle sticks to when dead */
+typedef struct ParticleTarget {
+ struct ParticleTarget *next, *prev;
+ struct Object *ob;
+ int psys;
+ short flag, mode;
+ float time, duration;
+} ParticleTarget;
- ParticleKey state; /* normally current global coordinates or */
- /* in sticky object space if dead & sticky */
+typedef struct ParticleData {
+ ParticleKey state; /* current global coordinates */
ParticleKey prev_state; /* previous state */
-
+
HairKey *hair; /* hair vertices */
- ParticleKey *keys; /* keyed states */
+ ParticleKey *keys; /* keyed keys */
- float i_rot[4],r_rot[4];/* initial & random values (i_rot should be removed as it's not used anymore)*/
- float r_ave[3],r_ve[3];
+ BoidParticle *boid; /* boids data */
- float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
- /* face normal for volume emission */
+ int totkey; /* amount of hair or keyed keys*/
float time, lifetime; /* dietime is not nescessarily time+lifetime as */
float dietime; /* particles can die unnaturally (collision) */
- float bank; /* banking angle for boids */
-
- float size, sizemul; /* size and multiplier so that we can update size when ever */
-
int num; /* index to vert/edge/face */
int num_dmcache; /* index to derived mesh data (face) to avoid slow lookups */
- int pad;
- int totkey;
- int bpi; /* softbody body point start index */
+ float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
+ /* face normal for volume emission */
+
+ float size; /* size and multiplier so that we can update size when ever */
short flag;
- short alive; /* the life state of a particle */
+ short alive; /* the life state of a particle */
short loop; /* how many times particle life has looped */
- short rt2;
+ short hair_index;
} ParticleData;
typedef struct ParticleSettings {
ID id;
struct AnimData *adt;
+ struct BoidSettings *boids;
+
int flag;
short type, from, distr;
/* physics modes */
short phystype, rotmode, avemode, reactevent;
short draw, draw_as, draw_size, childtype;
- short ren_as, rt2[3];
+ short ren_as, rt2;
/* number of path segments, power of 2 except */
short draw_step, ren_step;
short hair_step, keys_step;
@@ -118,7 +128,7 @@ typedef struct ParticleSettings {
short adapt_angle, adapt_pix;
short disp, omat, interpolation, rotfrom, integrator;
- short kink, kink_axis, nbetween, boidneighbours;
+ short kink, kink_axis;
/* billboards */
short bb_align, bb_uv_split, bb_anim, bb_split_offset;
@@ -131,7 +141,7 @@ typedef struct ParticleSettings {
/* general values */
float sta, end, lifetime, randlife;
- float timetweak, jitfac, keyed_time, eff_hair, rt;
+ float timetweak, jitfac, eff_hair;
int totpart, userjit, grid_res;
/* initial velocity factors */
@@ -142,11 +152,11 @@ typedef struct ParticleSettings {
/* global physical properties */
float acc[3], dragfac, brownfac, dampfac;
/* length */
- float length, abslength, randlength;
+ float randlength;
/* children */
int child_nbr, ren_child_nbr;
float parents, childsize, childrandsize;
- float childrad, childflat, childspread;
+ float childrad, childflat;
/* clumping */
float clumpfac, clumppow;
/* kink */
@@ -155,16 +165,18 @@ typedef struct ParticleSettings {
float rough1, rough1_size;
float rough2, rough2_size, rough2_thres;
float rough_end, rough_end_shape;
+ /* length */
+ float clength, clength_thres;
/* branching */
float branch_thres;
/* drawing stuff */
float draw_line[2];
+ float path_start, path_end;
+ int trail_count;
+ /* keyed particles */
+ int keyed_loops;
- /* boids */
- float max_vel, max_lat_acc, max_tan_acc;
- float average_vel, banking, max_bank, groundz;
- float boidfac[8];
- char boidrule[8];
+ float effector_weight[10];
struct Group *dup_group;
struct Group *eff_group;
@@ -183,27 +195,31 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
ParticleData *particles; /* (parent) particles */
ChildParticle *child; /* child particles */
- struct ParticleEdit *edit; /* particle editmode (runtime) */
- void (*free_edit)(struct ParticleSystem *sys); /* free callback */
+ struct PTCacheEdit *edit; /* particle editmode (runtime) */
+ void (*free_edit)(struct PTCacheEdit *edit); /* free callback */
struct ParticleCacheKey **pathcache; /* path cache (runtime) */
struct ParticleCacheKey **childcache; /* child cache (runtime) */
ListBase pathcachebufs, childcachebufs; /* buffers for the above */
- struct SoftBody *soft; /* hair softbody */
+ struct ClothModifierData *clmd; /* cloth simulation for hair */
+ struct DerivedMesh *hair_in_dm, *hair_out_dm; /* input/output for cloth simulation */
struct Object *target_ob;
- struct Object *keyed_ob;
struct Object *lattice;
struct Object *parent; /* particles from global space -> parent space */
struct ListBase effectors, reactevents; /* runtime */
+
+ struct ListBase targets; /* used for keyed and boid physics */
+
+ char name[32]; /* particle system name */
float imat[4][4]; /* used for duplicators */
- float cfra;
- int seed;
- int flag, totpart, totchild, totcached, totchildcache, rt;
- short recalc, target_psys, keyed_psys, totkeyed, softflag, bakespace;
+ float cfra, tree_frame;
+ int seed, rt;
+ int flag, totpart, totchild, totcached, totchildcache;
+ short recalc, target_psys, totkeyed, bakespace;
char bb_uvname[3][32]; /* billboard uv name */
@@ -215,20 +231,20 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
/* point cache */
struct PointCache *pointcache;
-}ParticleSystem;
+ struct ListBase ptcaches;
-/* general particle maximums */
-/* no special why's, just seem reasonable */
-/* changing these (atleast upwards) should not cause any major problems */
-#define MAX_PARTS 100000 /* real particles/system */
-#define MAX_PART_CHILDREN 10000 /* child particles/real particles */
-#define MAX_BOIDNEIGHBOURS 10 /* neigbours considered/boid */
+ struct KDTree *tree; /* used for interactions with self and other systems */
+
+ struct ParticleDrawData *pdd;
+
+ float *frand; /* array of 1024 random floats for fast lookups */
+}ParticleSystem;
/* part->type */
/* hair is allways baked static in object/geometry space */
/* other types (normal particles) are in global space and not static baked */
#define PART_EMITTER 0
-#define PART_REACTOR 1
+//#define PART_REACTOR 1
#define PART_HAIR 2
#define PART_FLUID 3
@@ -237,7 +253,8 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_REACT_MULTIPLE 2
#define PART_LOOP 4
-//#define PART_LOOP_INSTANT 8
+ /* for dopesheet */
+#define PART_DS_EXPAND 8
#define PART_HAIR_GEOMETRY 16
@@ -247,16 +264,16 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_TRAND 128
#define PART_EDISTR 256 /* particle/face from face areas */
-#define PART_STICKY 512 /*collided particles can stick to collider*/
+//#define PART_STICKY 512 /*collided particles can stick to collider*/
#define PART_DIE_ON_COL (1<<12)
#define PART_SIZE_DEFL (1<<13) /* swept sphere deflections */
#define PART_ROT_DYN (1<<14) /* dynamic rotation */
#define PART_SIZEMASS (1<<16)
-#define PART_ABS_LENGTH (1<<15)
+//#define PART_KEYED_TIMING (1<<15)
-#define PART_ABS_TIME (1<<17)
-#define PART_GLOB_TIME (1<<18)
+//#define PART_ABS_TIME (1<<17)
+//#define PART_GLOB_TIME (1<<18)
#define PART_BOIDS_2D (1<<19)
@@ -310,9 +327,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
//#define PART_DRAW_PATH_LEN 2
#define PART_DRAW_SIZE 4
#define PART_DRAW_EMITTER 8 /* render emitter also */
-//#define PART_DRAW_HEALTH 16
-//#define PART_DRAW_TIMED_PATH 32
-//#define PART_DRAW_CACHED_PATH 64
+#define PART_DRAW_HEALTH 16
+#define PART_ABS_PATH_TIME 32
+//#define PART_DRAW_TRAIL 64 /* deprecated */
#define PART_DRAW_BB_LOCK 128
#define PART_DRAW_PARENT 256
#define PART_DRAW_NUM 512
@@ -394,32 +411,29 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PSYS_RECALC_RESET 2 /* reset everything including pointcache */
#define PSYS_RECALC_TYPE 4 /* handle system type change */
#define PSYS_RECALC_CHILD 16 /* only child settings changed */
+#define PSYS_RECALC_PHYS 32 /* physics type changed */
/* psys->flag */
#define PSYS_CURRENT 1
-//#define PSYS_BAKING 2
-//#define PSYS_BAKE_UI 4
-#define PSYS_KEYED_TIME 8
+#define PSYS_GLOBAL_HAIR 2
+#define PSYS_HAIR_DYNAMICS 4
+#define PSYS_KEYED_TIMING 8
#define PSYS_ENABLED 16 /* deprecated */
-#define PSYS_FIRST_KEYED 32
+#define PSYS_HAIR_UPDATED 32 /* signal for updating hair particle mode */
#define PSYS_DRAWING 64
//#define PSYS_SOFT_BAKE 128
#define PSYS_DELETE 256 /* remove particlesystem as soon as possible */
#define PSYS_HAIR_DONE 512
#define PSYS_KEYED 1024
#define PSYS_EDITED 2048
-//#define PSYS_PROTECT_CACHE 4096
+//#define PSYS_PROTECT_CACHE 4096 /* deprecated */
#define PSYS_DISABLED 8192
/* pars->flag */
#define PARS_UNEXIST 1
#define PARS_NO_DISP 2
-#define PARS_STICKY 4
-#define PARS_TRANSFORM 8
-#define PARS_HIDE 16
-#define PARS_TAG 32
-#define PARS_REKEY 64
-#define PARS_EDIT_RECALC 128
+//#define PARS_STICKY 4 /* deprecated */
+#define PARS_REKEY 8
/* pars->alive */
#define PARS_KILLED 0
@@ -444,22 +458,13 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PSYS_VG_ROT 10
#define PSYS_VG_EFFECTOR 11
-/* part->boidrules */
-#define BOID_TOT_RULES 8
-
-#define BOID_COLLIDE 0
-#define BOID_AVOID 1
-#define BOID_CROWD 2
-#define BOID_CENTER 3
-#define BOID_AV_VEL 4
-#define BOID_VEL_MATCH 5
-#define BOID_GOAL 6
-#define BOID_LEVEL 7
-
+/* ParticleTarget->flag */
+#define PTARGET_CURRENT 1
+#define PTARGET_VALID 2
-//#define PSYS_INTER_CUBIC 0
-//#define PSYS_INTER_LINEAR 1
-//#define PSYS_INTER_CARDINAL 2
-//#define PSYS_INTER_BSPLINE 3
+/* ParticleTarget->mode */
+#define PTARGET_MODE_NEUTRAL 0
+#define PTARGET_MODE_FRIEND 1
+#define PTARGET_MODE_ENEMY 2
#endif
diff --git a/source/blender/makesdna/DNA_property_types.h b/source/blender/makesdna/DNA_property_types.h
index 7cc365a9ebc..af79b2e0a22 100644
--- a/source/blender/makesdna/DNA_property_types.h
+++ b/source/blender/makesdna/DNA_property_types.h
@@ -39,12 +39,9 @@
typedef struct bProperty {
struct bProperty *next, *prev;
char name[32];
- short type, otype; /* otype is for buttons, when a property type changes */
+ short type, flag;
int data; /* data should be 4 bytes to store int,float stuff */
- int old; /* old is for simul */
- short flag, pad;
- void *poin;
- void *oldpoin; /* oldpoin is for simul */
+ void *poin; /* references data unless its a string which is malloc'd */
} bProperty;
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 828721f0abb..5521f0e9315 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -36,7 +36,6 @@ extern "C" {
#include "DNA_brush_types.h"
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
-#include "DNA_scriptlink_types.h"
#include "DNA_ID.h"
struct Object;
@@ -48,6 +47,8 @@ struct Text;
struct bNodeTree;
struct AnimData;
struct Editing;
+struct SceneStats;
+struct bGPdata;
typedef struct Base {
struct Base *next, *prev;
@@ -92,6 +93,8 @@ typedef struct FFMpegCodecData {
int audio_codec;
int video_bitrate;
int audio_bitrate;
+ int audio_mixrate;
+ float audio_volume;
int gop_size;
int flags;
@@ -105,10 +108,13 @@ typedef struct FFMpegCodecData {
typedef struct AudioData {
- int mixrate;
- float main; /* Main mix in dB */
+ int mixrate; // 2.5: now in FFMpegCodecData: audio_mixrate
+ float main; // 2.5: now in FFMpegCodecData: audio_volume
+ float speed_of_sound;
+ float doppler_factor;
+ int distance_model;
short flag;
- short pad[3];
+ short pad;
} AudioData;
typedef struct SceneRenderLayer {
@@ -169,7 +175,6 @@ typedef struct RenderData {
struct AviCodecData *avicodecdata;
struct QuicktimeCodecData *qtcodecdata;
struct FFMpegCodecData ffcodecdata;
- struct AudioData audio; /* new in 2.5 */
int cfra, sfra, efra; /* frames as in 'images' */
int psfra, pefra; /* start+end frames of preview range */
@@ -183,10 +188,10 @@ typedef struct RenderData {
/** For UR edge rendering: give the edges this color */
float edgeR, edgeG, edgeB;
- short fullscreen, xplay, yplay, freqplay; /* standalone player */
- short depth, attrib, rt1, rt2; /* standalone player */
+ short fullscreen, xplay, yplay, freqplay; /* standalone player */ // XXX deprecated since 2.5
+ short depth, attrib, rt1, rt2; /* standalone player */ // XXX deprecated since 2.5
- short stereomode; /* standalone player stereo settings */
+ short stereomode; /* standalone player stereo settings */ // XXX deprecated since 2.5
short dimensionspreset; /* for the dimensions presets menu */
@@ -218,7 +223,12 @@ typedef struct RenderData {
short bufflag;
short quality;
- short rpad, rpad1, rpad2;
+ /**
+ * Render to image editor, fullscreen or to new window.
+ */
+ short displaymode;
+
+ short rpad1, rpad2;
/**
* Flags for render settings. Use bit-masking to access the settings.
@@ -230,7 +240,7 @@ typedef struct RenderData {
*/
int mode;
- /* render engine, octree resolution */
+ /* render engine (deprecated), octree resolution */
short renderer, ocres;
/**
@@ -269,8 +279,12 @@ typedef struct RenderData {
* Value used to define filter size for all filter options */
float gauss;
+
+ /* color management settings - color profiles, gamma correction, etc */
+ int color_mgt_flag;
+
/** post-production settings. Depricated, but here for upwards compat (initialized to 1) */
- float postmul, postgamma, posthue, postsat;
+ float postgamma, posthue, postsat;
/* Dither noise intensity */
float dither_intensity;
@@ -318,13 +332,15 @@ typedef struct RenderData {
short jp2_preset, jp2_depth;
int rpad3;
- /* Dome variables */
- short domeres, domemode;
- short domeangle, dometilt;
- float domeresbuf;
- float pad2;
- struct Text *dometext;
+ /* Dome variables */ // XXX deprecated since 2.5
+ short domeres, domemode; // XXX deprecated since 2.5
+ short domeangle, dometilt; // XXX deprecated since 2.5
+ float domeresbuf; // XXX deprecated since 2.5
+ float pad2; // XXX deprecated since 2.5
+ struct Text *dometext; // XXX deprecated since 2.5
+ /* render engine */
+ char engine[32];
} RenderData;
/* control render convert and shading engine */
@@ -341,6 +357,20 @@ typedef struct RenderProfile {
} RenderProfile;
+typedef struct GameDome {
+ short res, mode;
+ short angle, tilt;
+ float resbuf, pad2;
+ struct Text *warptext;
+} GameDome;
+
+#define DOME_FISHEYE 1
+#define DOME_TRUNCATED_FRONT 2
+#define DOME_TRUNCATED_REAR 3
+#define DOME_ENVMAP 4
+#define DOME_PANORAM_SPH 5
+#define DOME_NUM_MODES 6
+
typedef struct GameFraming {
float col[3];
char type, pad1, pad2, pad3;
@@ -350,6 +380,74 @@ typedef struct GameFraming {
#define SCE_GAMEFRAMING_EXTEND 1
#define SCE_GAMEFRAMING_SCALE 2
+typedef struct GameData {
+
+ /* physics (it was in world)*/
+ float gravity; /*Gravitation constant for the game world*/
+
+ /*
+ * Radius of the activity bubble, in Manhattan length. Objects
+ * outside the box are activity-culled. */
+ float activityBoxRadius; //it's not being used ANYWHERE !!!!!!!!!!!!!!
+ /*
+ * bit 3: (gameengine): Activity culling is enabled.
+ * bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
+ */
+ short mode, flag, matmode, pad[3];
+ short occlusionRes; /* resolution of occlusion Z buffer in pixel */
+ short physicsEngine;
+ short ticrate, maxlogicstep, physubstep, maxphystep;
+
+ /* standalone player */
+ struct GameFraming framing;
+ short fullscreen, xplay, yplay, freqplay;
+ short depth, attrib, rt1, rt2;
+
+ /* stereo/dome mode */
+ struct GameDome dome;
+ short stereoflag, stereomode, xsch, ysch; //xsch and ysch can be deleted !!!
+} GameData;
+
+#define STEREO_NOSTEREO 1
+#define STEREO_ENABLED 2
+#define STEREO_DOME 3
+
+//#define STEREO_NOSTEREO 1
+#define STEREO_QUADBUFFERED 2
+#define STEREO_ABOVEBELOW 3
+#define STEREO_INTERLACED 4
+#define STEREO_ANAGLYPH 5
+#define STEREO_SIDEBYSIDE 6
+#define STEREO_VINTERLACE 7
+//#define STEREO_DOME 8
+
+/* physicsEngine */
+#define WOPHY_NONE 0
+#define WOPHY_ENJI 1
+#define WOPHY_SUMO 2
+#define WOPHY_DYNAMO 3
+#define WOPHY_ODE 4
+#define WOPHY_BULLET 5
+
+/* GameData.flag */
+#define GAME_ENABLE_ALL_FRAMES (1 << 1)
+#define GAME_SHOW_DEBUG_PROPS (1 << 2)
+#define GAME_SHOW_FRAMERATE (1 << 3)
+#define GAME_SHOW_PHYSICS (1 << 4)
+#define GAME_DISPLAY_LISTS (1 << 5)
+#define GAME_GLSL_NO_LIGHTS (1 << 6)
+#define GAME_GLSL_NO_SHADERS (1 << 7)
+#define GAME_GLSL_NO_SHADOWS (1 << 8)
+#define GAME_GLSL_NO_RAMPS (1 << 9)
+#define GAME_GLSL_NO_NODES (1 << 10)
+#define GAME_GLSL_NO_EXTRA_TEX (1 << 11)
+#define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12)
+
+/* GameData.matmode */
+#define GAME_MAT_TEXFACE 0
+#define GAME_MAT_MULTITEX 1
+#define GAME_MAT_GLSL 2
+
typedef struct TimeMarker {
struct TimeMarker *next, *prev;
int frame;
@@ -357,12 +455,25 @@ typedef struct TimeMarker {
unsigned int flag;
} TimeMarker;
+typedef struct Paint {
+ /* Array of brushes selected for use in this paint mode */
+ Brush **brushes;
+ int active_brush_index, brush_count;
+
+ /* WM Paint cursor */
+ void *paint_cursor;
+ unsigned char paint_cursor_col[4];
+
+ int pad;
+} Paint;
+
typedef struct ImagePaintSettings {
- struct Brush *brush;
+ Paint paint;
+
short flag, tool;
/* for projection painting only */
- short seam_bleed,normal_angle;
+ short seam_bleed, normal_angle;
void *paintcursor; /* wm handle */
} ImagePaintSettings;
@@ -381,10 +492,15 @@ typedef struct ParticleEditSettings {
ParticleBrushData brush[7]; /* 7 = PE_TOT_BRUSH */
void *paintcursor; /* runtime */
- float emitterdist;
- int draw_timed;
+ float emitterdist, rt;
+
+ int selectmode;
+ int edittype;
- int selectmode, pad;
+ int draw_step, fade_frames;
+
+ struct Scene *scene;
+ struct Object *object;
} ParticleEditSettings;
typedef struct TransformOrientation {
@@ -393,26 +509,20 @@ typedef struct TransformOrientation {
float mat[3][3];
} TransformOrientation;
-struct SculptSession;
-typedef struct Sculpt
-{
- /* Note! a deep copy of this struct must be done header_info.c's copy_scene function */
- /* Data stored only from entering sculptmode until exiting sculptmode */
- struct SculptSession *session;
- struct Brush *brush;
+typedef struct Sculpt {
+ Paint paint;
/* For rotating around a pivot point */
float pivot[3];
int flags;
- /* For the Brush Shape */
- char texsep;
+
/* Control tablet input */
char tablet_size, tablet_strength;
- char pad[5];
+ char pad[6];
} Sculpt;
typedef struct VPaint {
- struct Brush *brush;
+ Paint paint;
float gamma, mul; /* should become part of struct Brush? */
short mode, flag;
@@ -439,6 +549,9 @@ typedef struct ToolSettings {
VPaint *wpaint; /* weight paint */
Sculpt *sculpt;
+ /* Vertex groups */
+ float vgroup_weight;
+
/* Subdivide Settings */
short cornertype;
short editbutflag;
@@ -470,7 +583,6 @@ typedef struct ToolSettings {
float uvcalc_radius;
float uvcalc_cubesize;
float uvcalc_margin;
- float pad;
short uvcalc_mapdir;
short uvcalc_mapalign;
short uvcalc_flag;
@@ -496,7 +608,7 @@ typedef struct ToolSettings {
float clean_thresh;
/* Auto-Keying Mode */
- short autokey_mode, pad2; /* defines in DNA_userdef_types.h */
+ short autokey_mode, autokey_flag; /* defines in DNA_userdef_types.h */
/* Retopo */
char retopo_mode;
@@ -537,7 +649,7 @@ typedef struct ToolSettings {
/* Alt+RMB option */
char edge_mode;
- /* transform */
+ /* Transform */
short snap_mode, snap_flag, snap_target;
short proportional, prop_mode;
} ToolSettings;
@@ -548,6 +660,12 @@ typedef struct bStats {
int totvert, totface;
} 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 */
+} UnitSettings;
typedef struct Scene {
ID id;
@@ -568,7 +686,7 @@ typedef struct Scene {
float twmin[3], twmax[3]; /* boundbox of selection for transform widget */
unsigned int lay;
-
+
short flag; /* various settings */
short use_nodes;
@@ -577,21 +695,18 @@ typedef struct Scene {
struct Editing *ed; /* sequence editor data is allocated here */
- struct GameFraming framing;
-
struct ToolSettings *toolsettings; /* default allocated now */
struct SceneStats *stats; /* default allocated now */
/* migrate or replace? depends on some internal things... */
/* no, is on the right place (ton) */
struct RenderData r;
- struct AudioData audio; /* DEPRECATED 2.5 */
-
- ScriptLink scriptlink;
+ struct AudioData audio;
ListBase markers;
ListBase transform_spaces;
+ ListBase sound_handles;
/* none of the dependancy graph vars is mean to be saved */
struct DagForest *theDag;
@@ -606,6 +721,16 @@ typedef struct Scene {
/* User-Defined KeyingSets */
int active_keyingset; /* index of the active KeyingSet. first KeyingSet has index 1, 'none' active is 0, 'add new' is -1 */
ListBase keyingsets; /* KeyingSets for the given frame */
+
+ /* Game Settings */
+ struct GameFraming framing; // XXX deprecated since 2.5
+ struct GameData gm;
+
+ /* Units */
+ struct UnitSettings unit;
+
+ /* Grease Pencil */
+ struct bGPdata *gpd;
} Scene;
@@ -628,7 +753,7 @@ typedef struct Scene {
#define R_FIELDSTILL 0x0080
#define R_RADIO 0x0100
#define R_BORDER 0x0200
-#define R_PANORAMA 0x0400
+#define R_PANORAMA 0x0400 /* deprecated as scene option, still used in renderer */
#define R_CROP 0x0800
#define R_COSMO 0x1000
#define R_ODDFIELD 0x2000
@@ -650,6 +775,12 @@ typedef struct Scene {
#define R_TOUCH 0x800000 /* touch files before rendering */
#define R_SIMPLIFY 0x1000000
+/* displaymode */
+
+#define R_OUTPUT_SCREEN 0
+#define R_OUTPUT_AREA 1
+#define R_OUTPUT_WINDOW 2
+#define R_OUTPUT_FORKED 3
/* filtertype */
#define R_FILTER_BOX 0
@@ -681,7 +812,7 @@ typedef struct Scene {
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
#define R_NO_TEX 0x2000
-#define R_STAMP_INFO 0x4000
+#define R_STAMP_INFO 0x4000 /* deprecated */
#define R_FULL_SAMPLE 0x8000
#define R_COMP_RERENDER 0x10000
#define R_RECURS_PROTECTION 0x20000
@@ -697,6 +828,7 @@ typedef struct Scene {
#define R_STAMP_MARKER 0x0080
#define R_STAMP_FILENAME 0x0100
#define R_STAMP_SEQSTRIP 0x0200
+#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)
/* alphamode */
#define R_ADDSKY 0
@@ -708,6 +840,9 @@ typedef struct Scene {
#define R_PLANES32 32
#define R_PLANESBW 8
+/* color_mgt_flag */
+#define R_COLOR_MANAGEMENT 1
+
/* imtype */
#define R_TARGA 0
#define R_IRIS 1
@@ -733,6 +868,9 @@ typedef struct Scene {
#define R_MULTILAYER 28
#define R_DDS 29
#define R_JP2 30
+#define R_H264 31
+#define R_XVID 32
+#define R_THEORA 33
/* subimtype, flag options for imtype */
#define R_OPENEXR_HALF 1
@@ -770,10 +908,14 @@ typedef struct Scene {
#define MINFRAME 1
#define MINFRAMEF 1.0f
+/* (minimum frame number for current-frame) */
+#define MINAFRAME -300000
+#define MINAFRAMEF -300000.0f
+
/* depricate this! */
#define TESTBASE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define TESTBASELIB_BGMODE(base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
+#define TESTBASELIB_BGMODE(v3d, 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_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last
@@ -838,6 +980,7 @@ typedef struct Scene {
/* sce->flag */
#define SCE_DS_SELECTED (1<<0)
#define SCE_DS_COLLAPSED (1<<1)
+#define SCE_NLA_EDIT_ON (1<<2)
/* return flag next_object function */
@@ -868,11 +1011,10 @@ typedef enum SculptFlags {
SCULPT_LOCK_Z = 256
} SculptFlags;
-/* toolsettings->imagepaint_flag */
+/* ImagePaintSettings.flag */
#define IMAGEPAINT_DRAWING 1
#define IMAGEPAINT_DRAW_TOOL 2
#define IMAGEPAINT_DRAW_TOOL_DRAWING 4
-
/* projection painting only */
#define IMAGEPAINT_PROJECT_DISABLE 8 /* Non projection 3D painting */
#define IMAGEPAINT_PROJECT_XRAY 16
@@ -909,9 +1051,10 @@ typedef enum SculptFlags {
#define PE_LOCK_FIRST 2
#define PE_DEFLECT_EMITTER 4
#define PE_INTERPOLATE_ADDED 8
-#define PE_SHOW_CHILD 16
-#define PE_SHOW_TIME 32
+#define PE_DRAW_PART 16
#define PE_X_MIRROR 64
+#define PE_FADE_TIME 128
+#define PE_AUTO_VELOCITY 256
/* toolsetting->particle brushtype */
#define PE_BRUSH_NONE -1
@@ -920,11 +1063,15 @@ typedef enum SculptFlags {
#define PE_BRUSH_LENGTH 2
#define PE_BRUSH_PUFF 3
#define PE_BRUSH_ADD 4
-#define PE_BRUSH_WEIGHT 5
-#define PE_BRUSH_SMOOTH 6
+#define PE_BRUSH_SMOOTH 5
/* this must equal ParticleEditSettings.brush array size */
-#define PE_TOT_BRUSH 7
+#define PE_TOT_BRUSH 6
+
+/* tooksettings->particle edittype */
+#define PE_TYPE_PARTICLES 0
+#define PE_TYPE_SOFTBODY 1
+#define PE_TYPE_CLOTH 2
/* toolsettings->retopo_mode */
#define RETOPO 1
@@ -980,6 +1127,15 @@ typedef enum SculptFlags {
#define SK_RETARGET_ROLL_VIEW 1
#define SK_RETARGET_ROLL_JOINT 2
+/* UnitSettings */
+
+/* UnitSettings->system */
+#define USER_UNIT_NONE 0
+#define USER_UNIT_METRIC 1
+#define USER_UNIT_IMPERIAL 2
+/* UnitSettings->flag */
+#define USER_UNIT_OPT_SPLIT 1
+
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 4891f44e1cd..e51da0c0818 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -31,7 +31,6 @@
#include "DNA_view2d_types.h"
#include "DNA_vec_types.h"
-#include "DNA_scriptlink_types.h"
#include "DNA_ID.h"
struct SpaceType;
@@ -53,6 +52,7 @@ typedef struct bScreen {
ListBase regionbase; /* screen level regions (menus), runtime only */
struct Scene *scene;
+ struct Scene *newscene; /* temporary when switching */
short full; /* fade out? */
short winid; /* winid from WM, starts with 1 */
@@ -104,17 +104,10 @@ typedef struct Panel { /* the part from uiBlock that needs saved in file */
int sortorder; /* panels are aligned according to increasing sortorder */
struct Panel *paneltab; /* this panel is tabbed in *paneltab */
void *activedata; /* runtime for panel manipulation */
-} Panel;
-
-typedef struct Header {
- struct HeaderType *type; /* runtime */
- struct uiLayout *layout; /* runtime for drawing */
-} Header;
-typedef struct Menu {
- struct MenuType *type; /* runtime */
- struct uiLayout *layout; /* runtime for drawing */
-} Menu;
+ int list_scroll, list_size;
+ char list_search[64];
+} Panel;
typedef struct ScrArea {
struct ScrArea *next, *prev;
@@ -131,8 +124,6 @@ typedef struct ScrArea {
short pad;
short do_refresh; /* private, for spacetype refresh callback */
short cursor, flag;
-
- ScriptLink scriptlink;
struct SpaceType *type; /* callbacks for this space type */
@@ -195,6 +186,8 @@ typedef struct ARegion {
#define SCREENNORMAL 0
#define SCREENFULL 1
#define SCREENAUTOPLAY 2
+#define SCREENTEMP 3
+
/* Panel->snap - for snapping to screen edges */
#define PNL_SNAP_NONE 0
@@ -207,6 +200,7 @@ typedef struct ARegion {
/* paneltype flag */
#define PNL_DEFAULT_CLOSED 1
+#define PNL_NO_HEADER 2
/* screen handlers */
#define SCREEN_MAXHANDLER 8
@@ -222,6 +216,7 @@ typedef struct ARegion {
#define RGN_TYPE_TEMPORARY 3
#define RGN_TYPE_UI 4
#define RGN_TYPE_TOOLS 5
+#define RGN_TYPE_TOOL_PROPS 6
/* region alignment */
#define RGN_ALIGN_NONE 0
diff --git a/source/blender/makesdna/DNA_scriptlink_types.h b/source/blender/makesdna/DNA_scriptlink_types.h
deleted file mode 100644
index 9b50eb91a20..00000000000
--- a/source/blender/makesdna/DNA_scriptlink_types.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * blenlib/DNA_object_types.h (mar-2001 nzc)
- *
- * Scriptlink is hard-coded in object for some reason.
- *
- * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 DNA_SCRIPTLINK_TYPES_H
-#define DNA_SCRIPTLINK_TYPES_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct ID;
-
-typedef struct ScriptLink {
- struct ID **scripts;
- short *flag;
-
- short actscript, totscript;
- int pad;
-} ScriptLink;
-
-/* **************** SCRIPTLINKS ********************* */
-
-#define SCRIPT_FRAMECHANGED 1
-#define SCRIPT_ONLOAD 2
-#define SCRIPT_REDRAW 4
-#define SCRIPT_ONSAVE 8
-#define SCRIPT_RENDER 16
-/* POSTRENDER is not meant for the UI, it simply calls the
- * RENDER script links for clean-up actions */
-#define SCRIPT_POSTRENDER 32
-
-#define SCRIPT_OBJECTUPDATE 64
-#define SCRIPT_OBDATAUPDATE 128
-
-/* **************** SPACE HANDLERS ********************* */
-/* these are special scriptlinks that can be assigned to
- * a given space in a given ScrArea to:
- * - (EVENT type) handle events sent to that space;
- * - (EVENT_ALL type): handle release events, too;
- * - (DRAW type) draw on the space after its own drawing function finishes.
- */
-#define SPACEHANDLER_VIEW3D_DRAW 1
-#define SPACEHANDLER_VIEW3D_EVENT 2
-#define SPACEHANDLER_VIEW3D_EVENT_ALL 3
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index 8b29ce1338d..a5ba5886ed5 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -126,6 +126,13 @@ typedef struct bRaySensor {
int axisflag;
} bRaySensor;
+typedef struct bArmatureSensor {
+ char posechannel[32];
+ char constraint[32];
+ int type;
+ float value;
+} bArmatureSensor;
+
typedef struct bMessageSensor {
/**
* (Possible future use) pointer to a single sender object
@@ -178,6 +185,9 @@ typedef struct bJoystickSensor {
/* bMouseSensor->type: uses blender event defines */
+/* bMouseSensor->flag: only pulse for now */
+#define SENS_MOUSE_FOCUS_PULSE 1
+
/* propertysensor->type */
#define SENS_PROP_EQUAL 0
#define SENS_PROP_NEQUAL 1
@@ -199,6 +209,15 @@ typedef struct bJoystickSensor {
#define SENS_MESG_MESG 0
#define SENS_MESG_PROP 1
+/* bArmatureSensor->type */
+#define SENS_ARM_STATE_CHANGED 0
+#define SENS_ARM_LIN_ERROR_BELOW 1
+#define SENS_ARM_LIN_ERROR_ABOVE 2
+#define SENS_ARM_ROT_ERROR_BELOW 3
+#define SENS_ARM_ROT_ERROR_ABOVE 4
+/* update this when adding new type */
+#define SENS_ARM_MAXTYPE 4
+
/* sensor->type */
#define SENS_ALWAYS 0
#define SENS_TOUCH 1
@@ -214,6 +233,7 @@ typedef struct bJoystickSensor {
#define SENS_JOYSTICK 11
#define SENS_ACTUATOR 12
#define SENS_DELAY 13
+#define SENS_ARMATURE 14
/* sensor->flag */
#define SENS_SHOW 1
#define SENS_DEL 2
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 39e72c34adf..6d455d20f59 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -147,7 +147,7 @@ typedef struct Sequence {
Strip *strip;
- struct Ipo *ipo;
+ struct Ipo *ipo; // xxx depreceated... old animation system
struct Scene *scene;
struct anim *anim;
float facf0, facf1;
@@ -160,7 +160,7 @@ typedef struct Sequence {
ListBase seqbase; /* list of strips for metastrips */
struct bSound *sound; /* the linked "bSound" object */
- struct hdaudio *hdaudio; /* external hdaudio object */
+ struct SoundHandle *sound_handle;
float level, pan; /* level in dB (0=full), pan -1..1 */
int scenenr; /* for scene selection */
float strobe;
@@ -281,7 +281,7 @@ typedef struct SpeedControlVars {
#define SEQ_MOVIE 3
#define SEQ_RAM_SOUND 4
#define SEQ_HD_SOUND 5
-#define SEQ_MOVIE_AND_HD_SOUND 6 /* helper for add_sequence */
+#define SEQ_SOUND 4
#define SEQ_EFFECT 8
#define SEQ_CROSS 8
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
new file mode 100644
index 00000000000..4e4714cdaa1
--- /dev/null
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -0,0 +1,123 @@
+/**
+* $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*
+* The Original Code is Copyright (C) 2006 by NaN Holding BV.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Daniel Genrich (Genscher)
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+#ifndef DNA_SMOKE_TYPES_H
+#define DNA_SMOKE_TYPES_H
+
+/* flags */
+#define MOD_SMOKE_HIGHRES (1<<1) /* enable high resolution */
+#define MOD_SMOKE_DISSOLVE (1<<2) /* let smoke dissolve */
+#define MOD_SMOKE_DISSOLVE_LOG (1<<3) /* using 1/x for dissolve */
+
+/* noise */
+#define MOD_SMOKE_NOISEWAVE (1<<0)
+#define MOD_SMOKE_NOISEFFT (1<<1)
+#define MOD_SMOKE_NOISECURL (1<<2)
+/* viewsettings */
+#define MOD_SMOKE_VIEW_SHOWBIG (1<<0)
+
+typedef struct SmokeDomainSettings {
+ struct SmokeModifierData *smd; /* for fast RNA access */
+ struct FLUID_3D *fluid;
+ struct Group *fluid_group;
+ struct Group *eff_group; // effector group for e.g. wind force
+ struct Group *coll_group; // collision objects group
+ struct WTURBULENCE *wt; // WTURBULENCE object, if active
+ struct GPUTexture *tex;
+ struct GPUTexture *tex_wt;
+ struct GPUTexture *tex_shadow;
+ float *shadow;
+ float p0[3]; /* start point of BB */
+ float p1[3]; /* end point of BB */
+ float dx; /* edge length of one cell */
+ float omega; /* smoke color - from 0 to 1 */
+ float temp; /* fluid temperature */
+ float tempAmb; /* ambient temperature */
+ float alpha;
+ float beta;
+ int res[3]; /* domain resolution */
+ int amplify; /* wavelet amplification */
+ int maxres; /* longest axis on the BB gets this resolution assigned */
+ int flags; /* show up-res or low res, etc */
+ int pad;
+ int viewsettings;
+ short noise; /* noise type: wave, curl, anisotropic */
+ short diss_percent;
+ int diss_speed;/* in frames */
+ float strength;
+ int res_wt[3];
+ float dx_wt;
+ int v3dnum;
+ struct PointCache *point_cache[2]; /* definition is in DNA_object_force.h */
+ struct ListBase ptcaches[2];
+} SmokeDomainSettings;
+
+
+/* inflow / outflow */
+
+/* type */
+#define MOD_SMOKE_FLOW_TYPE_OUTFLOW (1<<1)
+
+typedef struct SmokeFlowSettings {
+ struct SmokeModifierData *smd; /* for fast RNA access */
+ struct ParticleSystem *psys;
+ float density;
+ float temp; /* delta temperature (temp - ambient temp) */
+ float velocity[3]; /* UNUSED, velocity taken from particles */
+ float vgrp_heat_scale[2]; /* min and max scaling for vgroup_heat */
+ short vgroup_flow; /* where inflow/outflow happens - red=1=action */
+ short vgroup_density;
+ short vgroup_heat;
+ short type; /* inflow =0 or outflow = 1 */
+ int pad;
+} SmokeFlowSettings;
+
+/*
+ struct BVHTreeFromMesh *bvh;
+ float mat[4][4];
+ float mat_old[4][4];
+ */
+
+/* collision objects (filled with smoke) */
+typedef struct SmokeCollSettings {
+ struct SmokeModifierData *smd; /* for fast RNA access */
+ struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
+ struct DerivedMesh *dm;
+ float *points;
+ float *points_old;
+ float *vel;
+ float mat[4][4];
+ float mat_old[4][4];
+ int numpoints;
+ int numverts; // check if mesh changed
+ short type; // static = 0, rigid = 1, dynamic = 2
+ short pad;
+ int pad2;
+} SmokeCollSettings;
+
+#endif
diff --git a/source/blender/makesdna/DNA_sound_types.h b/source/blender/makesdna/DNA_sound_types.h
index 5dedd20e1e4..55b48e4aacd 100644
--- a/source/blender/makesdna/DNA_sound_types.h
+++ b/source/blender/makesdna/DNA_sound_types.h
@@ -37,94 +37,92 @@
/* stupid... could easily be solved */
#include "DNA_view2d_types.h"
-/* extern int noaudio; * defined in sound.c . also not very nice */
-/* extern ListBase *samples; don't do this in DNA, but in BKE_... instead */
-
-struct bSample;
struct Ipo;
struct PackedFile;
struct SpaceLink;
-/* should not be here! */
-#
-#
-typedef struct bSample {
- ID id;
- void *data;
- void *snd_sample;
- short type, bits;
- short channels;
- int len, rate;
-// int buffer;
- int alindex;
- char fakedata[16];
- int flags;
- char name[160];
- struct PackedFile * packedfile;
- short us;
-} bSample;
-
-
+// runtime only - no saving
+typedef struct SoundHandle {
+ struct SoundHandle *next, *prev;
+ struct bSound *source;
+ void *handle;
+ int state;
+ int startframe;
+ int endframe;
+ int frameskip;
+ int mute;
+ int changed;
+ float volume;
+ float pad;
+} SoundHandle;
+
+typedef struct Sound3D
+{
+ float min_gain;
+ float max_gain;
+ float reference_distance;
+ float max_distance;
+ float rolloff_factor;
+ float cone_inner_angle;
+ float cone_outer_angle;
+ float cone_outer_gain;
+} Sound3D;
typedef struct bSound {
ID id;
- char name[160];
- struct bSample *sample;
- void *stream;
- struct PackedFile *packedfile;
- struct PackedFile *newpackedfile;
- void *snd_sound;
- struct Ipo *ipo;
- float volume, panning;
+
/**
- * Sets the rollofffactor. The rollofffactor is a per-Source parameter
- * the application can use to increase or decrease the range of a source
- * by decreasing or increasing the attenuation, respectively. The default
- * value is 1. The implementation is free to optimize for a rollofffactor
- * value of 0, which indicates that the application does not wish any
- * distance attenuation on the respective Source.
+ * The path to the sound file.
*/
- float attenuation;
- float pitch;
+ char name[160];
+
/**
- * min_gain indicates the minimal gain which is always guaranteed for this sound
+ * The packed file.
*/
- float min_gain;
+ struct PackedFile *packedfile;
+
/**
- * max_gain indicates the maximal gain which is always guaranteed for this sound
+ * The handle for audaspace.
*/
- float max_gain;
+ void *handle;
+
/**
- * Sets the referencedistance at which the listener will experience gain.
+ * Deprecated; used for loading pre 2.5 files.
*/
+ struct PackedFile *newpackedfile;
+ struct Ipo *ipo;
+ float volume;
+ float attenuation;
+ float pitch;
+ float min_gain;
+ float max_gain;
float distance;
int flags;
- int streamlen;
- char channels;
- char highprio;
- char pad[10];
-} bSound;
-typedef struct bSoundListener {
- ID id;
- /**
- * Overall gain
- */
- float gain;
+/** currently int type;
+ struct bSound *child_sound;*/
+
/**
- * Sets a scaling to exaggerate or deemphasize the Doppler (pitch) shift
- * resulting from the calculation.
+ * Whether the sound has been changed and must be restarted if playing.
*/
- float dopplerfactor;
+ int changed;
+
/**
- * Sets the value of the propagation speed relative to which the source
- * velocities are interpreted.
+ * The audaspace handle for cache.
*/
- float dopplervelocity;
- short numsoundsblender;
- short numsoundsgameengine;
-
-} bSoundListener;
+ void *cache;
+
+/** XXX unused currently // SOUND_TYPE_LIMITER
+ float start, end;*/
+} bSound;
+
+/* XXX unused currently
+typedef enum eSound_Type {
+ SOUND_TYPE_INVALID = -1,
+ SOUND_TYPE_FILE = 0,
+ SOUND_TYPE_BUFFER,
+ SOUND_TYPE_LIMITER
+} eSound_Type;*/
/* spacesound->flag */
#define SND_DRAWFRAMES 1
@@ -146,34 +144,7 @@ typedef struct SpaceSound {
int pad2;
} SpaceSound;
-
-enum SAMPLE_FileTypes {
- SAMPLE_INVALID = -1, // must be negative
- SAMPLE_UNKNOWN = 0,
- SAMPLE_RAW,
- SAMPLE_WAV,
- SAMPLE_MP2,
- SAMPLE_MP3,
- SAMPLE_OGG_VORBIS,
- SAMPLE_WMA,
- SAMPLE_ASF,
- SAMPLE_AIFF
-};
-
-
-#define SOUND_CHANNELS_STEREO 0
-#define SOUND_CHANNELS_LEFT 1
-#define SOUND_CHANNELS_RIGHT 2
-
-#define SOUND_FLAGS_LOOP (1 << 0)
-#define SOUND_FLAGS_FIXED_VOLUME (1 << 1)
-#define SOUND_FLAGS_FIXED_PANNING (1 << 2)
#define SOUND_FLAGS_3D (1 << 3)
-#define SOUND_FLAGS_BIDIRECTIONAL_LOOP (1 << 4)
-#define SOUND_FLAGS_PRIORITY (1 << 5)
-#define SOUND_FLAGS_SEQUENCE (1 << 6)
-
-#define SAMPLE_NEEDS_SAVE (1 << 0)
/* to DNA_sound_types.h*/
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 9dc7e07a95c..2cd47e340bd 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -86,7 +86,7 @@ typedef struct SpaceInfo {
} SpaceInfo;
/* 'Graph' Editor (formerly known as the IPO Editor) */
-// XXX for now, we keep all old data...
+/* XXX for now, we keep all old data... */
typedef struct SpaceIpo {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
@@ -94,11 +94,7 @@ typedef struct SpaceIpo {
float blockscale;
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
-
- // 'IPO keys' - vertical lines for editing multiple keyframes at once - use Dopesheet instead for this?
- //ListBase ipokey; // XXX it's not clear how these will come back yet
- //short showkey; // XXX this doesn't need to be restored until ipokeys come back
+ View2D v2d; /* deprecated, copied to region */
struct bDopeSheet *ads; /* settings for filtering animation data (NOTE: we use a pointer due to code-linking issues) */
@@ -107,7 +103,7 @@ typedef struct SpaceIpo {
short mode; /* mode for the Graph editor (eGraphEdit_Mode) */
short flag; /* settings for Graph editor */
short autosnap; /* time-transform autosnapping settings for Graph editor (eAnimEdit_AutoSnap in DNA_action_types.h) */
- char pin, lock;
+ char pin, lock; // XXX old, unused vars that are probably going to be depreceated soon...
} SpaceIpo;
typedef struct SpaceButs {
@@ -120,24 +116,12 @@ typedef struct SpaceButs {
struct RenderInfo *ri;
- short cursens, curact;
- short align, preview; /* align for panels, preview is signal to refresh */
- View2D v2d; /* depricated, copied to region */
-
- short mainb, menunr; /* texnr and menunr have to remain shorts */
- short pin, mainbo;
- void *lockpoin;
-
- short texnr;
- char texfrom, showgroup;
+ View2D v2d; /* deprecated, copied to region */
- short modeltype;
- short scriptblock;
- short scaflag;
- short re_align;
-
- short oldkeypress; /* for keeping track of the sub tab key cycling */
- char flag, texact;
+ short mainb, mainbo, mainbuser; /* context tabs */
+ short re_align, align; /* align for panels */
+ short preview; /* preview is signal to refresh */
+ char flag, pad[3];
void *path; /* runtime */
int pathflag, dataicon; /* runtime */
@@ -152,7 +136,7 @@ typedef struct SpaceSeq {
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
+ View2D v2d; /* deprecated, copied to region */
float xof, yof; /* offset for drawing the image preview */
short mainb;
@@ -165,6 +149,33 @@ typedef struct SpaceSeq {
struct bGPdata *gpd; /* grease-pencil data */
} SpaceSeq;
+typedef struct FileSelectParams {
+ char title[24]; /* title, also used for the text of the execute button */
+ char dir[240]; /* directory */
+ char file[80]; /* file */
+ char renamefile[80];
+
+ short type; /* XXXXX for now store type here, should be moved to the operator */
+ short flag; /* settings for filter, hiding dots files,... */
+ short sort; /* sort order */
+ short display; /* display mode flag */
+ short filter; /* filter when (flags & FILE_FILTER) is true */
+
+ /* XXX - temporary, better move to filelist */
+ short active_bookmark;
+ int active_file;
+ int selstate;
+
+ /* short */
+ /* XXX --- still unused -- */
+ short f_fp; /* show font preview */
+ short menu; /* currently selected option in pupmenu */
+ char fp_str[8]; /* string to use for font preview */
+ char *pupmenu; /* allows menu for save options - result stored in menup */
+ /* XXX --- end unused -- */
+} FileSelectParams;
+
+
typedef struct SpaceFile {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
@@ -175,6 +186,9 @@ typedef struct SpaceFile {
struct FileList *files; /* holds the list of files to show */
+ ListBase *folders_prev; /* holds the list of previous directories to show */
+ ListBase *folders_next; /* holds the list of next directories (pushed from previous) to show */
+
/* operator that is invoking fileselect
op->exec() will be called on the 'Load' button.
if operator provides op->cancel(), then this will be invoked
@@ -186,6 +200,8 @@ typedef struct SpaceFile {
struct FileLayout *layout;
+ short recentnr, bookmarknr;
+ short systemnr, pad2;
} SpaceFile;
typedef struct SpaceOops {
@@ -196,7 +212,7 @@ typedef struct SpaceOops {
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
+ View2D v2d; /* deprecated, copied to region */
ListBase tree;
struct TreeStore *treestore;
@@ -246,11 +262,12 @@ typedef struct SpaceNla {
short blockhandler[8];
- short menunr, lock;
short autosnap; /* this uses the same settings as autosnap for Action Editor */
short flag;
+ int pad;
- View2D v2d; /* depricated, copied to region */
+ struct bDopeSheet *ads;
+ View2D v2d; /* deprecated, copied to region */
} SpaceNla;
typedef struct SpaceText {
@@ -266,7 +283,8 @@ typedef struct SpaceText {
int top, viewlines;
short flags, menunr;
- int lheight;
+ short lheight; /* user preference */
+ char cwidth, linenrs_tot; /* runtime computed, character width and the number of chars to use when showing line numbers */
int left;
int showlinenrs;
int tabnumber;
@@ -321,7 +339,7 @@ typedef struct SpaceTime {
int spacetype;
float blockscale;
- View2D v2d; /* depricated, copied to region */
+ View2D v2d; /* deprecated, copied to region */
int flag, redraws;
@@ -335,7 +353,7 @@ typedef struct SpaceNode {
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
+ View2D v2d; /* deprecated, copied to region */
struct ID *id, *from; /* context, no need to save in file? well... pinning... */
short flag, menunr; /* menunr: browse id block in header */
@@ -384,7 +402,7 @@ typedef struct SpaceImaSel {
short blockhandler[8];
- View2D v2d; /* depricated, copied to region */
+ View2D v2d; /* deprecated, copied to region */
struct FileList *files;
@@ -436,6 +454,68 @@ typedef struct SpaceImaSel {
} SpaceImaSel;
+typedef struct ConsoleLine {
+ struct ConsoleLine *next, *prev;
+
+ /* keep these 3 vars so as to share free, realloc funcs */
+ int len_alloc; /* allocated length */
+ int len; /* real len - strlen() */
+ char *line;
+
+ int cursor;
+ int type; /* only for use when in the 'scrollback' listbase */
+} ConsoleLine;
+
+/* ConsoleLine.type */
+enum {
+ CONSOLE_LINE_OUTPUT=0,
+ CONSOLE_LINE_INPUT,
+ CONSOLE_LINE_INFO, /* autocomp feedback */
+ 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 */
+ int spacetype;
+ float blockscale; // XXX are these needed?
+
+ short blockhandler[8]; // XXX are these needed?
+
+ /* space vars */
+ int type; /* console/report/..? */
+ int rpt_mask; /* which reports to display */
+ int flag, lheight;
+
+ ListBase scrollback; /* ConsoleLine; output */
+ ListBase history; /* ConsoleLine; command history, current edited line is the first */
+ char prompt[8];
+
+} SpaceConsole;
+
+typedef struct SpaceUserPref {
+ SpaceLink *next, *prev;
+ ListBase regionbase; /* storage of regions for inactive spaces */
+ int spacetype;
+
+ int pad;
+} SpaceUserPref;
+
/* view3d Now in DNA_view3d_types.h */
@@ -489,24 +569,25 @@ typedef struct SpaceImaSel {
/* buts->mainb new */
-#define BCONTEXT_SCENE 0
-#define BCONTEXT_WORLD 1
-#define BCONTEXT_OBJECT 2
-#define BCONTEXT_DATA 3
-#define BCONTEXT_MATERIAL 4
-#define BCONTEXT_TEXTURE 5
-#define BCONTEXT_PARTICLE 6
-#define BCONTEXT_PHYSICS 7
-#define BCONTEXT_GAME 8
-#define BCONTEXT_BONE 9
-#define BCONTEXT_MODIFIER 10
-#define BCONTEXT_CONSTRAINT 12
-#define BCONTEXT_TOT 13
+#define BCONTEXT_SCENE 0
+#define BCONTEXT_WORLD 1
+#define BCONTEXT_OBJECT 2
+#define BCONTEXT_DATA 3
+#define BCONTEXT_MATERIAL 4
+#define BCONTEXT_TEXTURE 5
+#define BCONTEXT_PARTICLE 6
+#define BCONTEXT_PHYSICS 7
+#define BCONTEXT_BONE 9
+#define BCONTEXT_MODIFIER 10
+#define BCONTEXT_CONSTRAINT 12
+#define BCONTEXT_BONE_CONSTRAINT 13
+#define BCONTEXT_TOT 14
/* sbuts->flag */
#define SB_PRV_OSA 1
#define SB_PIN_CONTEXT 2
#define SB_WORLD_TEX 4
+#define SB_BRUSH_TEX 8
/* sbuts->align */
#define BUT_FREE 0
@@ -527,6 +608,22 @@ typedef struct SpaceImaSel {
#define BUTS_SENS_STATE 512
#define BUTS_ACT_STATE 1024
+/* FileSelectParams.display */
+enum FileDisplayTypeE {
+ FILE_SHORTDISPLAY = 1,
+ FILE_LONGDISPLAY,
+ FILE_IMGDISPLAY
+};
+
+/* FileSelectParams.sort */
+enum FileSortTypeE {
+ FILE_SORT_NONE = 0,
+ FILE_SORT_ALPHA = 1,
+ FILE_SORT_EXTENSION,
+ FILE_SORT_TIME,
+ FILE_SORT_SIZE
+};
+
/* these values need to be hardcoded in structs, dna does not recognize defines */
/* also defined in BKE */
#define FILE_MAXDIR 160
@@ -554,14 +651,9 @@ typedef struct SpaceImaSel {
#define FILE_FILTER 256
#define FILE_BOOKMARKS 512
-/* sfile->sort */
-#define FILE_SORTALPHA 0
-#define FILE_SORTDATE 1
-#define FILE_SORTSIZE 2
-#define FILE_SORTEXTENS 3
-
/* files in filesel list: 2=ACTIVE */
-#define HILITE 1
+#define EDITING 1
+#define ACTIVE 2
#define BLENDERFILE 4
#define PSXFILE 8
#define IMAGEFILE 16
@@ -627,6 +719,9 @@ typedef struct SpaceImaSel {
#define SIPO_NOHANDLES (1<<2)
#define SIPO_NODRAWCFRANUM (1<<3)
#define SIPO_DRAWTIME (1<<4)
+#define SIPO_SELCUVERTSONLY (1<<5)
+#define SIPO_DRAWNAMES (1<<6)
+#define SIPO_SLIDERS (1<<7)
/* SpaceIpo->mode (Graph Editor Mode) */
enum {
@@ -668,6 +763,7 @@ enum {
#define SO_SEQUENCE 10
#define SO_DATABLOCKS 11
#define SO_USERDEF 12
+#define SO_KEYMAP 13
/* SpaceOops->storeflag */
#define SO_TREESTORE_CLEANUP 1
@@ -711,11 +807,15 @@ enum {
#define IMS_INFILESLI 4
/* nla->flag */
+ // depreceated
#define SNLA_ALLKEYED (1<<0)
+ // depreceated
#define SNLA_ACTIVELAYERS (1<<1)
+
#define SNLA_DRAWTIME (1<<2)
#define SNLA_NOTRANSKEYCULL (1<<3)
#define SNLA_NODRAWCFRANUM (1<<4)
+#define SNLA_NOSTRIPCURVES (1<<5)
/* time->flag */
/* show timing in frames instead of in seconds */
@@ -730,10 +830,11 @@ enum {
#define TIME_ALL_3D_WIN 2
#define TIME_ALL_ANIM_WIN 4
#define TIME_ALL_BUTS_WIN 8
-#define TIME_WITH_SEQ_AUDIO 16
+#define TIME_WITH_SEQ_AUDIO 16 // deprecated
#define TIME_SEQ 32
#define TIME_ALL_IMAGE_WIN 64
#define TIME_CONTINUE_PHYSICS 128
+#define TIME_NODES 256
/* sseq->mainb */
#define SEQ_DRAW_SEQUENCE 0
@@ -769,7 +870,9 @@ enum {
SPACE_TIME,
SPACE_NODE,
SPACE_LOGIC,
- SPACEICONMAX = SPACE_LOGIC
+ SPACE_CONSOLE,
+ SPACE_USERPREF,
+ SPACEICONMAX = SPACE_USERPREF
};
#endif
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index f37d9eca282..c13c0522004 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -53,17 +53,17 @@ typedef struct MTex {
char uvname[32];
char projx, projy, projz, mapping;
- float ofs[3], size[3];
+ float ofs[3], size[3], rot;
short texflag, colormodel, pmapto, pmaptoneg;
- short normapspace, which_output, pad[2];
+ short normapspace, which_output;
+ char brush_map_mode, pad[7];
float r, g, b, k;
float def_var, rt;
float colfac, norfac, varfac;
float dispfac;
float warpfac;
-
} MTex;
#ifndef DNA_USHORT_FIX
@@ -128,6 +128,55 @@ typedef struct EnvMap {
short recalc, lastsize;
} EnvMap;
+typedef struct PointDensity {
+ short flag;
+
+ short falloff_type;
+ float falloff_softness;
+ float radius;
+ short source;
+ short color_source;
+ int totpoints;
+
+ int pdpad;
+
+ struct Object *object; /* for 'Object' or 'Particle system' type - source object */
+ struct ParticleSystem *psys;
+ short psys_cache_space; /* cache points in worldspace, object space, ... ? */
+ short ob_cache_space; /* cache points in worldspace, object space, ... ? */
+
+ short pdpad2[2];
+
+ void *point_tree; /* the acceleration tree containing points */
+ float *point_data; /* dynamically allocated extra for extra information, like particle age */
+
+ float noise_size;
+ short noise_depth;
+ short noise_influence;
+ short noise_basis;
+ short pdpad3[3];
+ float noise_fac;
+
+ float speed_scale;
+ struct ColorBand *coba; /* for time -> color */
+
+} PointDensity;
+
+typedef struct VoxelData {
+ int resol[3];
+ int interp_type;
+ short file_format;
+ short flag;
+ int pad;
+
+ struct Object *object; /* for rendering smoke sims */
+ float int_multiplier;
+ int still_frame;
+ char source_path[240];
+ float *dataset;
+
+} VoxelData;
+
typedef struct Tex {
ID id;
struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */
@@ -143,18 +192,24 @@ typedef struct Tex {
float dist_amount, ns_outscale;
/* newnoise: voronoi nearest neighbour weights, minkovsky exponent, distance metric & color type */
- float vn_w1, vn_w2, vn_w3, vn_w4, vn_mexp;
+ float vn_w1;
+ float vn_w2;
+ float vn_w3;
+ float vn_w4;
+ float vn_mexp;
short vn_distm, vn_coltype;
short noisedepth, noisetype;
/* newnoise: noisebasis type for clouds/marble/etc, noisebasis2 only used for distorted noise */
short noisebasis, noisebasis2;
-
+
short imaflag, flag;
short type, stype;
float cropxmin, cropymin, cropxmax, cropymax;
+ int texfilter;
+ int afmax; // anisotropic filter maximum value, ewa -> max eccentricity, feline -> max probes
short xrepeat, yrepeat;
short extend;
@@ -175,6 +230,8 @@ typedef struct Tex {
struct ColorBand *coba;
struct EnvMap *env;
struct PreviewImage * preview;
+ struct PointDensity *pd;
+ struct VoxelData *vd;
char use_nodes;
char pad[7];
@@ -214,6 +271,8 @@ typedef struct TexMapping {
#define TEX_MUSGRAVE 11
#define TEX_VORONOI 12
#define TEX_DISTNOISE 13
+#define TEX_POINTDENSITY 14
+#define TEX_VOXELDATA 15
/* musgrave stype */
#define TEX_MFRACTAL 0
@@ -253,6 +312,15 @@ typedef struct TexMapping {
#define TEX_GAUSS_MIP 4096
#define TEX_FILTER_MIN 8192
+/* texfilter */
+// TXF_BOX -> blender's old texture filtering method
+#define TXF_BOX 0
+#define TXF_EWA 1
+#define TXF_FELINE 2
+#define TXF_AREA 3
+// TXF_SAT only available when mipmaps disabled
+#define TXF_SAT 4
+
/* imaflag unused, only for version check */
#define TEX_FIELDS_ 8
#define TEX_ANIMCYCLIC_ 64
@@ -341,6 +409,11 @@ typedef struct TexMapping {
#define TEX_RGB 1
#define TEX_NOR 2
+/* pr_texture in material, world, lamp, */
+#define TEX_PR_TEXTURE 0
+#define TEX_PR_OTHER 1
+#define TEX_PR_BOTH 2
+
/* **************** MTEX ********************* */
/* proj */
@@ -357,6 +430,7 @@ typedef struct TexMapping {
#define MTEX_VIEWSPACE 16
#define MTEX_DUPLI_MAPTO 32
#define MTEX_OB_DUPLI_ORIG 64
+#define MTEX_NEW_BUMP 128
/* blendtype */
#define MTEX_BLEND 0
@@ -374,6 +448,13 @@ typedef struct TexMapping {
#define MTEX_BLEND_VAL 12
#define MTEX_BLEND_COLOR 13
#define MTEX_NUM_BLENDTYPES 14
+#define MTEX_SOFT_LIGHT 15
+#define MTEX_LIN_LIGHT 16
+
+/* brush_map_mode */
+#define MTEX_MAP_MODE_FIXED 0
+#define MTEX_MAP_MODE_TILED 1
+#define MTEX_MAP_MODE_3D 2
/* **************** EnvMap ********************* */
@@ -391,5 +472,62 @@ typedef struct TexMapping {
#define ENV_NORMAL 1
#define ENV_OSA 2
+/* **************** PointDensity ********************* */
+
+/* source */
+#define TEX_PD_PSYS 0
+#define TEX_PD_OBJECT 1
+#define TEX_PD_FILE 2
+
+/* falloff_type */
+#define TEX_PD_FALLOFF_STD 0
+#define TEX_PD_FALLOFF_SMOOTH 1
+#define TEX_PD_FALLOFF_SOFT 2
+#define TEX_PD_FALLOFF_CONSTANT 3
+#define TEX_PD_FALLOFF_ROOT 4
+
+/* psys_cache_space */
+#define TEX_PD_OBJECTLOC 0
+#define TEX_PD_OBJECTSPACE 1
+#define TEX_PD_WORLDSPACE 2
+
+/* flag */
+#define TEX_PD_TURBULENCE 1
+
+
+/* noise_influence */
+#define TEX_PD_NOISE_STATIC 0
+#define TEX_PD_NOISE_VEL 1
+#define TEX_PD_NOISE_AGE 2
+#define TEX_PD_NOISE_TIME 3
+
+/* color_source */
+#define TEX_PD_COLOR_CONSTANT 0
+#define TEX_PD_COLOR_PARTAGE 1
+#define TEX_PD_COLOR_PARTSPEED 2
+#define TEX_PD_COLOR_PARTVEL 3
+
+#define POINT_DATA_VEL 1
+#define POINT_DATA_LIFE 2
+
+/******************** Voxel Data *****************************/
+/* flag */
+#define TEX_VD_STILL 1
+
+/* interpolation */
+#define TEX_VD_NEARESTNEIGHBOR 0
+#define TEX_VD_LINEAR 1
+#define TEX_VD_QUADRATIC 2
+#define TEX_VD_TRICUBIC_CATROM 3
+#define TEX_VD_TRICUBIC_BSPLINE 4
+#define TEX_VD_TRICUBIC_SLOW 5
+
+/* file format */
+#define TEX_VD_BLENDERVOXEL 0
+#define TEX_VD_RAW_8BIT 1
+#define TEX_VD_RAW_16BIT 2
+#define TEX_VD_IMAGE_SEQUENCE 3
+#define TEX_VD_SMOKE 4
+
#endif
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 771a7e43793..826eea43a4d 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -66,9 +66,8 @@ typedef struct uiFont {
typedef struct uiFontStyle {
short uifont_id; /* saved in file, 0 is default */
short points; /* actual size depends on 'global' dpi */
- float kerning; /* kerning space between characters. */
- short overlap; /* check overlaped characters. */
- short pad;
+ short kerning; /* unfitted or default kerning value. */
+ char pad[6];
short italic, bold; /* style hint */
short shadow; /* value is amount of pixels blur */
short shadx, shady; /* shadow offset in pixels */
@@ -95,6 +94,8 @@ typedef struct uiStyle {
uiFontStyle widgetlabel;
uiFontStyle widget;
+ float panelzoom;
+
short minlabelchars; /* in characters */
short minwidgetchars; /* in characters */
@@ -106,7 +107,7 @@ typedef struct uiStyle {
short panelspace;
short panelouter;
- short pad[3];
+ short pad[1];
} uiStyle;
typedef struct uiWidgetColors {
@@ -121,6 +122,16 @@ typedef struct uiWidgetColors {
short pad;
} uiWidgetColors;
+typedef struct uiWidgetStateColors {
+ char inner_anim[4];
+ char inner_anim_sel[4];
+ char inner_key[4];
+ char inner_key_sel[4];
+ char inner_driven[4];
+ char inner_driven_sel[4];
+ float blend, pad;
+} uiWidgetStateColors;
+
typedef struct ThemeUI {
/* Interface Elements (buttons, menus, icons) */
@@ -128,7 +139,9 @@ typedef struct ThemeUI {
uiWidgetColors wcol_radio, wcol_option, wcol_toggle;
uiWidgetColors wcol_num, wcol_numslider;
uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item;
- uiWidgetColors wcol_box, wcol_scroll;
+ uiWidgetColors wcol_box, wcol_scroll, wcol_list_item;
+
+ uiWidgetStateColors wcol_state;
char iconfile[80]; // FILE_MAXFILE length
@@ -247,6 +260,7 @@ typedef struct bTheme {
ThemeSpace ttime;
ThemeSpace tnode;
ThemeSpace tlogic;
+ ThemeSpace tuserpref;
/* 20 sets of bone colors for this theme */
ThemeWireColor tarm[20];
@@ -280,7 +294,12 @@ typedef struct UserDef {
short userpref, viewzoom;
int mixbufsize;
- int pad1;
+ int audiodevice;
+ int audiorate;
+ int audioformat;
+ int audiochannels;
+
+ int scrollback; /* console scrollback limit */
int dpi; /* range 48-128? */
short encoding;
short transopts;
@@ -350,6 +369,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_RELPATHS (1 << 20)
#define USER_DRAGIMMEDIATE (1 << 21)
#define USER_DONT_DOSCRIPTLINKS (1 << 22)
+#define USER_FILENOUI (1 << 23)
/* viewzom */
#define USER_ZOOM_CONT 0
@@ -391,10 +411,12 @@ extern UserDef U; /* from blenkernel blender.c */
#define AUTOKEY_MODE_EDITKEYS 5
/* Auto-Keying flag */
+ /* U.autokey_flag */
#define AUTOKEY_FLAG_INSERTAVAIL (1<<0)
#define AUTOKEY_FLAG_INSERTNEEDED (1<<1)
#define AUTOKEY_FLAG_AUTOMATKEY (1<<2)
-
+ /* toolsettings->autokey_flag */
+#define ANIMRECORD_FLAG_WITHNLA (1<<10)
/* transopts */
#define USER_TR_TOOLTIPS (1 << 0)
@@ -418,6 +440,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DUP_TEX (1 << 8)
#define USER_DUP_ARM (1 << 9)
#define USER_DUP_ACT (1 << 10)
+#define USER_DUP_PSYS (1 << 11)
/* gameflags */
#define USER_DEPRECATED_FLAG 1
diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h
index ac628ca2266..bc019ef8121 100644
--- a/source/blender/makesdna/DNA_view2d_types.h
+++ b/source/blender/makesdna/DNA_view2d_types.h
@@ -59,15 +59,21 @@ typedef struct View2D {
short around; /* pivot point for transforms (rotate and scale) */
float cursor[2]; /* only used in the UV view for now (for 2D-cursor) */
+
+ float *tab_offset; /* different offset per tab, for buttons */
+ int tab_num; /* number of tabs stored */
+ int tab_cur; /* current tab */
} View2D;
/* ---------------------------------- */
/* view zooming restrictions, per axis (v2d->keepzoom) */
/* zoom is clamped to lie within limits set by minzoom and maxzoom */
-#define V2D_KEEPZOOM 0x0001
+#define V2D_LIMITZOOM 0x0001
/* aspect ratio is maintained on view resize */
#define V2D_KEEPASPECT 0x0002
+ /* zoom is kept when the window resizes */
+#define V2D_KEEPZOOM 0x0004
/* zooming on x-axis is not allowed */
#define V2D_LOCKZOOM_X 0x0100
/* zooming on y-axis is not allowed */
@@ -78,6 +84,10 @@ typedef struct View2D {
#define V2D_LOCKOFS_X (1<<1)
/* panning on y-axis is not allowed */
#define V2D_LOCKOFS_Y (1<<2)
+ /* on resize, keep the x offset */
+#define V2D_KEEPOFS_X (1<<3)
+ /* on resize, keep the y offset */
+#define V2D_KEEPOFS_Y (1<<4)
/* view extent restrictions (v2d->keeptot) */
/* 'cur' view can be out of extents of 'tot' */
@@ -118,6 +128,10 @@ typedef struct View2D {
#define V2D_SCROLL_VERTICAL_HIDE (1<<7)
#define V2D_SCROLL_HORIZONTAL_HIDE (1<<8)
+/* scroll_ui, activate flag for drawing */
+#define V2D_SCROLL_H_ACTIVE (1<<0)
+#define V2D_SCROLL_V_ACTIVE (1<<1)
+
/* alignment flags for totrect, flags use 'shading-out' convention (v2d->align) */
/* all quadrants free */
#define V2D_ALIGN_FREE 0
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 5cd78670e71..f67a242b469 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -82,13 +82,14 @@ typedef struct RegionView3D {
float viewmatob[4][4];
float persmatob[4][4];
+ /* 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;
-
- int lastmode; /* for modal keymap switching, int because it stores notifier code */
+ short camzoom, viewbut, pad[2];
short rflag, viewlock;
short persp;
@@ -143,7 +144,7 @@ typedef struct View3D {
* The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
* OB_SHADED or OB_TEXTURE */
short drawtype;
- short localview;
+ short pad2;
short scenelock, around, pad3;
short flag, flag2;
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index e02d2984771..ea9d0e86c38 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -1,5 +1,5 @@
/**
- * $Id:
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -41,6 +41,7 @@ struct wmEvent;
struct wmGesture;
struct wmOperatorType;
struct wmOperator;
+struct wmKeyMap;
/* forwards */
struct bContext;
@@ -52,6 +53,51 @@ struct wmTimer;
struct StructRNA;
struct PointerRNA;
struct ReportList;
+struct Report;
+struct uiLayout;
+
+#define OP_MAX_TYPENAME 64
+#define KMAP_MAX_NAME 64
+
+
+typedef enum ReportType {
+ RPT_DEBUG = 1<<0,
+ RPT_INFO = 1<<1,
+ RPT_OPERATOR = 1<<2,
+ RPT_WARNING = 1<<3,
+ RPT_ERROR = 1<<4,
+ RPT_ERROR_INVALID_INPUT = 1<<5,
+ RPT_ERROR_INVALID_CONTEXT = 1<<6,
+ RPT_ERROR_OUT_OF_MEMORY = 1<<7
+} ReportType;
+
+#define RPT_DEBUG_ALL (RPT_DEBUG)
+#define RPT_INFO_ALL (RPT_INFO)
+#define RPT_OPERATOR_ALL (RPT_OPERATOR)
+#define RPT_WARNING_ALL (RPT_WARNING)
+#define RPT_ERROR_ALL (RPT_ERROR|RPT_ERROR_INVALID_INPUT|RPT_ERROR_INVALID_CONTEXT|RPT_ERROR_OUT_OF_MEMORY)
+
+enum ReportListFlags {
+ RPT_PRINT = 1,
+ RPT_STORE = 2,
+ 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;
+} Report;
+typedef struct ReportList {
+ ListBase list;
+ int printlevel; /* ReportType */
+ int storelevel; /* ReportType */
+ int flag, pad;
+} ReportList;
+/* reports need to be before wmWindowManager */
+
/* windowmanager is saved, tag WMAN */
typedef struct wmWindowManager {
@@ -68,7 +114,7 @@ typedef struct wmWindowManager {
ListBase queue; /* refresh/redraw wmNotifier structs */
- ListBase reports; /* information and error reports */
+ struct ReportList reports; /* information and error reports */
ListBase jobs; /* threaded jobs manager */
@@ -79,6 +125,9 @@ typedef struct wmWindowManager {
} wmWindowManager;
+/* wmWindowManager.initialized */
+#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 {
@@ -88,7 +137,8 @@ typedef struct wmWindow {
int winid, pad; /* winid also in screens, is for retrieving this window after read */
- struct bScreen *screen; /* active screen */
+ struct bScreen *screen; /* active screen */
+ struct bScreen *newscreen; /* temporary when switching */
char screenname[32]; /* MAX_ID_NAME for matching window with active screen after file read */
short posx, posy, sizex, sizey; /* window coords */
@@ -112,7 +162,8 @@ typedef struct wmWindow {
ListBase timers;
ListBase queue; /* all events (ghost level events were handled) */
- ListBase handlers; /* window+screen handlers, overriding all queues */
+ ListBase handlers; /* window+screen handlers, handled last */
+ ListBase modalhandlers; /* priority handlers, handled first */
ListBase subwindows; /* opengl stuff for sub windows, see notes in wm_subwindow.c */
ListBase gesture; /* gesture stuff */
@@ -123,6 +174,18 @@ typedef struct wmWindow {
#
#
+typedef struct wmOperatorTypeMacro {
+ struct wmOperatorTypeMacro *next, *prev;
+
+ /* operator id */
+ char idname[MAX_ID_NAME];
+ /* rna pointer to access properties, like keymap */
+ struct PointerRNA *ptr;
+
+} wmOperatorTypeMacro;
+
+#
+#
typedef struct wmOperatorType {
struct wmOperatorType *next, *prev;
@@ -148,21 +211,27 @@ typedef struct wmOperatorType {
* that the operator might still fail to execute even if this return true */
int (*poll)(struct bContext *);
- /* panel for redo and repeat */
- void *(*uiBlock)(struct wmOperator *);
+ /* optional panel for redo and repeat, autogenerated if not set */
+ void (*ui)(struct bContext *, struct PointerRNA *, struct uiLayout *);
/* rna for properties */
struct StructRNA *srna;
+ /* struct wmOperatorTypeMacro */
+ ListBase macro;
+
short flag;
-
+
+ /* pointer to modal keymap, do not free! */
+ struct wmKeyMap *modalkeymap;
+
/* only used for operators defined with python
* use to store pointers to python functions */
void *pyop_data;
+ int (*pyop_poll)(struct bContext *, struct wmOperatorType *ot);
} wmOperatorType;
-#define OP_MAX_TYPENAME 64
/* partial copy of the event, for matching by eventhandler */
typedef struct wmKeymapItem {
@@ -176,10 +245,13 @@ typedef struct wmKeymapItem {
short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */
short keymodifier; /* rawkey modifier */
- short pad;
+ short propvalue; /* if used, the item is from modal map */
+
+ short inactive; /* if set, deactivated item */
+ short maptype; /* keymap editor */
+ short pad2, pad3;
} wmKeymapItem;
-#define KMAP_MAX_NAME 64
/* stored in WM, the actively used keymaps */
typedef struct wmKeyMap {
@@ -188,8 +260,16 @@ typedef struct wmKeyMap {
ListBase keymap;
char nameid[64]; /* global editor keymaps, or for more per space/region */
- int spaceid; /* same IDs as in DNA_space_types.h */
- int regionid; /* see above */
+ short spaceid; /* same IDs as in DNA_space_types.h */
+ short regionid; /* see above */
+
+ short is_modal; /* modal map, not using operatornames */
+ short pad;
+
+ void *items; /* struct EnumPropertyItem for now */
+
+ /* verify if the keymap is enabled in the current context */
+ int (*poll)(struct bContext *);
} wmKeyMap;
@@ -205,8 +285,14 @@ typedef struct wmOperator {
/* runtime */
wmOperatorType *type; /* operator type definition from idname */
void *customdata; /* custom storage, only while operator runs */
+
struct PointerRNA *ptr; /* rna pointer to access properties */
struct ReportList *reports; /* errors and warnings storage */
+
+ ListBase macro; /* list of operators, can be a tree */
+ struct wmOperator *opm; /* current running macro, not saved */
+ short flag, pad[3];
+
} wmOperator;
/* operator type exec(), invoke() modal(), return values */
@@ -216,11 +302,8 @@ typedef struct wmOperator {
/* add this flag if the event should pass through */
#define OPERATOR_PASS_THROUGH 8
-typedef enum wmRadialControlMode {
- WM_RADIALCONTROL_SIZE,
- WM_RADIALCONTROL_STRENGTH,
- WM_RADIALCONTROL_ANGLE
-} wmRadialControlMode;
+/* wmOperator flag */
+
/* ************** wmEvent ************************ */
/* for read-only rna access, dont save this */
@@ -243,15 +326,24 @@ typedef struct wmEvent {
short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */
short keymodifier; /* rawkey modifier */
+ short pad1;
+
/* keymap item, set by handler (weak?) */
const char *keymap_idname;
/* custom data */
- short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */
- void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
+ short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */
short customdatafree;
+ int pad2;
+ void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */
} wmEvent;
+typedef enum wmRadialControlMode {
+ WM_RADIALCONTROL_SIZE,
+ WM_RADIALCONTROL_STRENGTH,
+ 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 608a4ca982e..64ff23dd1a8 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -32,7 +32,6 @@
#define DNA_WORLD_TYPES_H
#include "DNA_ID.h"
-#include "DNA_scriptlink_types.h"
struct AnimData;
struct Ipo;
@@ -72,12 +71,12 @@ typedef struct World {
/**
* Gravitation constant for the game world
*/
- float gravity;
+ float gravity; // XXX moved to scene->gamedata in 2.5
/**
* Radius of the activity bubble, in Manhattan length. Objects
* outside the box are activity-culled. */
- float activityBoxRadius;
+ float activityBoxRadius; // XXX moved to scene->gamedata in 2.5
short skytype;
/**
@@ -89,10 +88,10 @@ typedef struct World {
* bit 4: ambient occlusion
* bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
*/
- short mode;
- short occlusionRes; /* resolution of occlusion Z buffer in pixel */
- short physicsEngine; /* here it's aligned */
- short ticrate, maxlogicstep, physubstep, maxphystep;
+ short mode; // partially moved to scene->gamedata in 2.5
+ short occlusionRes; /* resolution of occlusion Z buffer in pixel */ // XXX moved to scene->gamedata in 2.5
+ short physicsEngine; /* here it's aligned */ // XXX moved to scene->gamedata in 2.5
+ short ticrate, maxlogicstep, physubstep, maxphystep; // XXX moved to scene->gamedata in 2.5
float misi, miststa, mistdist, misthi;
@@ -119,12 +118,11 @@ typedef struct World {
struct Ipo *ipo; // XXX depreceated... old animation system
struct MTex *mtex[18]; /* MAX_MTEX */
+ short pr_texture, pad[3];
/* previews */
struct PreviewImage *preview;
- ScriptLink scriptlink;
-
} World;
/* **************** WORLD ********************* */
@@ -181,14 +179,6 @@ typedef struct World {
#define WOMAP_ZENDOWN 8
#define WOMAP_MIST 16
-/* physicsEngine */
-#define WOPHY_NONE 0
-#define WOPHY_ENJI 1
-#define WOPHY_SUMO 2
-#define WOPHY_DYNAMO 3
-#define WOPHY_ODE 4
-#define WOPHY_BULLET 5
-
/* flag */
#define WO_DS_EXPAND (1<<0)
diff --git a/source/blender/makesdna/SConscript b/source/blender/makesdna/SConscript
index f91cf166f62..c3d39783b00 100644
--- a/source/blender/makesdna/SConscript
+++ b/source/blender/makesdna/SConscript
@@ -8,4 +8,4 @@ objs += o
incs = '#/intern/guardedalloc .'
-env.BlenderLib ( 'bf_dna', objs, Split(incs), [], libtype=['core','player'], priority = [215, 215] )
+env.BlenderLib ( 'bf_dna', objs, Split(incs), [], libtype=['core','player'], priority = [215,200] )
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index 6024799f852..1fb63156f26 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -33,9 +33,9 @@ ADD_EXECUTABLE(makesdna ${SRC} ${INC_FILES})
# Output dna.c
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
+ 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
diff --git a/source/blender/makesdna/intern/SConscript b/source/blender/makesdna/intern/SConscript
index 1c716019e80..120398791a8 100644
--- a/source/blender/makesdna/intern/SConscript
+++ b/source/blender/makesdna/intern/SConscript
@@ -34,6 +34,9 @@ if not USE_WINE:
if sys.platform != 'cygwin':
makesdna_tool.Append (CCFLAGS = cflags)
makesdna_tool.Append (CPPDEFINES = defines)
+makesdna_tool.Append( CFLAGS = env['CFLAGS'])
+makesdna_tool.Append( CCFLAGS = env['CCFLAGS'])
+makesdna_tool.Append( LINKFLAGS = env['PLATFORM_LINKFLAGS'])
targetdir = normpath(root_build_dir+'/lib')
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index b4b029a19e5..628983ae879 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -616,8 +616,8 @@ static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char
arrlen= DNA_elem_array_size(name, strlen(name));
/* define otypenr */
- if(strcmp(otype, "char")==0) otypenr= 0;
- else if((strcmp(otype, "uchar")==0)||(strcmp(otype, "unsigned char")==0)) otypenr= 1;
+ if(strcmp(otype, "char")==0 || (strcmp(otype, "const char")==0)) otypenr= 0;
+ else if((strcmp(otype, "uchar")==0) || (strcmp(otype, "unsigned char")==0)) otypenr= 1;
else if(strcmp(otype, "short")==0) otypenr= 2;
else if((strcmp(otype, "ushort")==0)||(strcmp(otype, "unsigned short")==0)) otypenr= 3;
else if(strcmp(otype, "int")==0) otypenr= 4;
@@ -629,6 +629,7 @@ static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char
/* define ctypenr */
if(strcmp(ctype, "char")==0) ctypenr= 0;
+ else if(strcmp(ctype, "const char")==0) ctypenr= 0;
else if((strcmp(ctype, "uchar")==0)||(strcmp(ctype, "unsigned char")==0)) ctypenr= 1;
else if(strcmp(ctype, "short")==0) ctypenr= 2;
else if((strcmp(ctype, "ushort")==0)||(strcmp(ctype, "unsigned short")==0)) ctypenr= 3;
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 91e9e617ea9..cae28f163ed 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -76,7 +76,6 @@ char *includefiles[] = {
"DNA_ID.h",
"DNA_ipo_types.h",
"DNA_key_types.h",
- "DNA_scriptlink_types.h",
"DNA_text_types.h",
"DNA_packedFile_types.h",
"DNA_camera_types.h",
@@ -132,6 +131,8 @@ char *includefiles[] = {
// of makesdna.c (this file) as well
"DNA_windowmanager_types.h",
"DNA_anim_types.h",
+ "DNA_boid_types.h",
+ "DNA_smoke_types.h",
// empty string to indicate end of includefiles
""
@@ -484,15 +485,18 @@ static void *read_file_data(char *filename, int *len_r)
data= MEM_mallocN(*len_r, "read_file_data");
if (!data) {
*len_r= -1;
+ fclose(fp);
return NULL;
}
if (fread(data, *len_r, 1, fp)!=1) {
*len_r= -1;
MEM_freeN(data);
+ fclose(fp);
return NULL;
}
-
+
+ fclose(fp);
return data;
}
@@ -559,10 +563,11 @@ int convert_include(char *filename)
while( *md1 != '}' ) {
if(md1>mainend) break;
- /* skip when it says 'struct' or 'unsigned' */
+ /* skip when it says 'struct' or 'unsigned' or 'const' */
if(*md1) {
if( strncmp(md1, "struct", 6)==0 ) md1+= 7;
- if( strncmp(md1, "unsigned", 6)==0 ) md1+= 9;
+ if( strncmp(md1, "unsigned", 8)==0 ) md1+= 9;
+ if( strncmp(md1, "const", 5)==0 ) md1+= 6;
/* we've got a type! */
type= add_type(md1, 0);
@@ -1103,7 +1108,6 @@ int main(int argc, char ** argv)
#include "DNA_ID.h"
#include "DNA_ipo_types.h"
#include "DNA_key_types.h"
-#include "DNA_scriptlink_types.h"
#include "DNA_text_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_camera_types.h"
@@ -1153,4 +1157,6 @@ int main(int argc, char ** argv)
#include "DNA_gpencil_types.h"
#include "DNA_windowmanager_types.h"
#include "DNA_anim_types.h"
+#include "DNA_boid_types.h"
+#include "DNA_smoke_types.h"
/* end of list */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 9f7559312ed..9ea7725b855 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -62,7 +62,17 @@ extern StructRNA RNA_BevelModifier;
extern StructRNA RNA_BezierCurvePoint;
extern StructRNA RNA_BlendTexture;
extern StructRNA RNA_BlenderRNA;
+extern StructRNA RNA_BoidRule;
+extern StructRNA RNA_BoidRuleAverageSpeed;
+extern StructRNA RNA_BoidRuleAvoid;
+extern StructRNA RNA_BoidRuleAvoidCollision;
+extern StructRNA RNA_BoidRuleFight;
+extern StructRNA RNA_BoidRuleFollowLeader;
+extern StructRNA RNA_BoidRuleGoal;
+extern StructRNA RNA_BoidSettings;
+extern StructRNA RNA_BoidState;
extern StructRNA RNA_Bone;
+extern StructRNA RNA_BoneGroup;
extern StructRNA RNA_BooleanModifier;
extern StructRNA RNA_BooleanProperty;
extern StructRNA RNA_Brush;
@@ -142,6 +152,7 @@ extern StructRNA RNA_CompositorNodeValue;
extern StructRNA RNA_CompositorNodeVecBlur;
extern StructRNA RNA_CompositorNodeViewer;
extern StructRNA RNA_CompositorNodeZcombine;
+extern StructRNA RNA_ConsoleLine;
extern StructRNA RNA_Constraint;
extern StructRNA RNA_ConstraintTarget;
extern StructRNA RNA_Context;
@@ -170,20 +181,22 @@ extern StructRNA RNA_EnumProperty;
extern StructRNA RNA_EnumPropertyItem;
extern StructRNA RNA_EnvironmentMap;
extern StructRNA RNA_EnvironmentMapTexture;
+extern StructRNA RNA_Event;
extern StructRNA RNA_ExplodeModifier;
extern StructRNA RNA_ExpressionController;
-extern StructRNA RNA_Event;
extern StructRNA RNA_FCurve;
+extern StructRNA RNA_FCurveSample;
extern StructRNA RNA_FModifier;
extern StructRNA RNA_FModifierCycles;
extern StructRNA RNA_FModifierEnvelope;
+extern StructRNA RNA_FModifierEnvelopeControlPoint;
+extern StructRNA RNA_FModifierFunctionGenerator;
extern StructRNA RNA_FModifierGenerator;
-extern StructRNA RNA_FModifierGenerator_Function;
-extern StructRNA RNA_FModifierGenerator_PolyExpanded;
extern StructRNA RNA_FModifierLimits;
extern StructRNA RNA_FModifierNoise;
extern StructRNA RNA_FModifierPython;
extern StructRNA RNA_FieldSettings;
+extern StructRNA RNA_FileSelectParams;
extern StructRNA RNA_FloatProperty;
extern StructRNA RNA_FloorConstraint;
extern StructRNA RNA_FluidFluidSettings;
@@ -200,6 +213,11 @@ extern StructRNA RNA_GameSoftBodySettings;
extern StructRNA RNA_GameStringProperty;
extern StructRNA RNA_GameTimerProperty;
extern StructRNA RNA_GlowSequence;
+extern StructRNA RNA_GreasePencil;
+extern StructRNA RNA_GPencilLayer;
+extern StructRNA RNA_GPencilFrame;
+extern StructRNA RNA_GPencilStroke;
+extern StructRNA RNA_GPencilStrokePoint;
extern StructRNA RNA_Group;
extern StructRNA RNA_Header;
extern StructRNA RNA_HemiLamp;
@@ -208,6 +226,7 @@ extern StructRNA RNA_ID;
extern StructRNA RNA_IDProperty;
extern StructRNA RNA_IDPropertyGroup;
extern StructRNA RNA_Image;
+extern StructRNA RNA_ImagePaint;
extern StructRNA RNA_ImageSequence;
extern StructRNA RNA_ImageTexture;
extern StructRNA RNA_ImageUser;
@@ -230,7 +249,6 @@ extern StructRNA RNA_LimitDistanceConstraint;
extern StructRNA RNA_LimitLocationConstraint;
extern StructRNA RNA_LimitRotationConstraint;
extern StructRNA RNA_LimitScaleConstraint;
-extern StructRNA RNA_LocalLamp;
extern StructRNA RNA_LockedTrackConstraint;
extern StructRNA RNA_MagicTexture;
extern StructRNA RNA_Main;
@@ -238,6 +256,7 @@ extern StructRNA RNA_MarbleTexture;
extern StructRNA RNA_MaskModifier;
extern StructRNA RNA_Material;
extern StructRNA RNA_MaterialHalo;
+extern StructRNA RNA_MaterialPhysics;
extern StructRNA RNA_MaterialRaytraceMirror;
extern StructRNA RNA_MaterialRaytraceTransparency;
extern StructRNA RNA_MaterialSlot;
@@ -273,6 +292,8 @@ extern StructRNA RNA_MultiresModifier;
extern StructRNA RNA_MusgraveTexture;
extern StructRNA RNA_NandController;
extern StructRNA RNA_NearSensor;
+extern StructRNA RNA_NlaStrip;
+extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
extern StructRNA RNA_NodeTree;
extern StructRNA RNA_NoiseTexture;
@@ -288,8 +309,11 @@ extern StructRNA RNA_OperatorStrokeElement;
extern StructRNA RNA_OrController;
extern StructRNA RNA_OutflowFluidSettings;
extern StructRNA RNA_PackedFile;
+extern StructRNA RNA_Paint;
extern StructRNA RNA_Panel;
extern StructRNA RNA_Particle;
+extern StructRNA RNA_ParticleBrush;
+extern StructRNA RNA_ParticleEdit;
extern StructRNA RNA_ParticleFluidSettings;
extern StructRNA RNA_ParticleHairKey;
extern StructRNA RNA_ParticleInstanceModifier;
@@ -297,27 +321,37 @@ extern StructRNA RNA_ParticleKey;
extern StructRNA RNA_ParticleSettings;
extern StructRNA RNA_ParticleSystem;
extern StructRNA RNA_ParticleSystemModifier;
+extern StructRNA RNA_ParticleTarget;
extern StructRNA RNA_PluginSequence;
extern StructRNA RNA_PluginTexture;
extern StructRNA RNA_PointCache;
+extern StructRNA RNA_PointDensity;
+extern StructRNA RNA_PointDensityTexture;
extern StructRNA RNA_PointerProperty;
+extern StructRNA RNA_PointLamp;
extern StructRNA RNA_Pose;
extern StructRNA RNA_PoseChannel;
extern StructRNA RNA_Property;
extern StructRNA RNA_PropertySensor;
+extern StructRNA RNA_ArmatureSensor;
extern StructRNA RNA_PythonConstraint;
extern StructRNA RNA_PythonController;
extern StructRNA RNA_RadarSensor;
-extern StructRNA RNA_Radiosity;
extern StructRNA RNA_RandomSensor;
extern StructRNA RNA_RaySensor;
extern StructRNA RNA_Region;
+extern StructRNA RNA_RenderEngine;
+extern StructRNA RNA_RenderLayer;
+extern StructRNA RNA_RenderPass;
+extern StructRNA RNA_RenderResult;
+extern StructRNA RNA_RenderValue;
extern StructRNA RNA_RigidBodyJointConstraint;
extern StructRNA RNA_Scene;
+extern StructRNA RNA_SceneGameData;
extern StructRNA RNA_SceneRenderData;
+extern StructRNA RNA_SceneRenderLayer;
extern StructRNA RNA_SceneSequence;
extern StructRNA RNA_Screen;
-extern StructRNA RNA_ScriptLink;
extern StructRNA RNA_Sculpt;
extern StructRNA RNA_Sensor;
extern StructRNA RNA_Sequence;
@@ -357,19 +391,33 @@ extern StructRNA RNA_ShapeKeyPoint;
extern StructRNA RNA_ShrinkwrapConstraint;
extern StructRNA RNA_ShrinkwrapModifier;
extern StructRNA RNA_SimpleDeformModifier;
+extern StructRNA RNA_SmokeCollSettings;
+extern StructRNA RNA_SmokeDomainSettings;
+extern StructRNA RNA_SmokeFlowSettings;
+extern StructRNA RNA_SmokeModifier;
extern StructRNA RNA_SmoothModifier;
+extern StructRNA RNA_SoftBodyModifier;
extern StructRNA RNA_SoftBodySettings;
-extern StructRNA RNA_SoftbodyModifier;
extern StructRNA RNA_Sound;
extern StructRNA RNA_SoundSequence;
extern StructRNA RNA_Space;
extern StructRNA RNA_Space3DView;
-extern StructRNA RNA_SpaceButtonsWindow;
+extern StructRNA RNA_SpaceConsole;
+extern StructRNA RNA_SpaceDopeSheetEditor;
+extern StructRNA RNA_SpaceFileBrowser;
+extern StructRNA RNA_SpaceGraphEditor;
extern StructRNA RNA_SpaceImageEditor;
+extern StructRNA RNA_SpaceInfo;
+extern StructRNA RNA_SpaceLogicEditor;
+extern StructRNA RNA_SpaceNLA;
+extern StructRNA RNA_SpaceNodeEditor;
extern StructRNA RNA_SpaceOutliner;
+extern StructRNA RNA_SpaceProperties;
extern StructRNA RNA_SpaceSequenceEditor;
extern StructRNA RNA_SpaceTextEditor;
+extern StructRNA RNA_SpaceTimeline;
extern StructRNA RNA_SpaceUVEditor;
+extern StructRNA RNA_SpaceUserPreferences;
extern StructRNA RNA_SpeedControlSequence;
extern StructRNA RNA_SpotLamp;
extern StructRNA RNA_StretchToConstraint;
@@ -379,6 +427,7 @@ extern StructRNA RNA_StucciTexture;
extern StructRNA RNA_SubsurfModifier;
extern StructRNA RNA_SunLamp;
extern StructRNA RNA_SurfaceCurve;
+extern StructRNA RNA_SurfaceModifier;
extern StructRNA RNA_TexMapping;
extern StructRNA RNA_Text;
extern StructRNA RNA_TextBox;
@@ -414,15 +463,17 @@ extern StructRNA RNA_TextureSlot;
extern StructRNA RNA_Theme;
extern StructRNA RNA_ThemeAudioWindow;
extern StructRNA RNA_ThemeBoneColorSet;
-extern StructRNA RNA_ThemeButtonsWindow;
extern StructRNA RNA_ThemeDopeSheet;
extern StructRNA RNA_ThemeFileBrowser;
extern StructRNA RNA_ThemeFontStyle;
extern StructRNA RNA_ThemeGraphEditor;
extern StructRNA RNA_ThemeImageEditor;
+extern StructRNA RNA_ThemeInfo;
+extern StructRNA RNA_ThemeLogicEditor;
extern StructRNA RNA_ThemeNLAEditor;
extern StructRNA RNA_ThemeNodeEditor;
extern StructRNA RNA_ThemeOutliner;
+extern StructRNA RNA_ThemeProperties;
extern StructRNA RNA_ThemeSequenceEditor;
extern StructRNA RNA_ThemeStyle;
extern StructRNA RNA_ThemeTextEditor;
@@ -431,6 +482,7 @@ extern StructRNA RNA_ThemeUserInterface;
extern StructRNA RNA_ThemeUserPreferences;
extern StructRNA RNA_ThemeView3D;
extern StructRNA RNA_ThemeWidgetColors;
+extern StructRNA RNA_ThemeWidgetStateColors;
extern StructRNA RNA_TimelineMarker;
extern StructRNA RNA_ToolSettings;
extern StructRNA RNA_TouchSensor;
@@ -438,22 +490,26 @@ extern StructRNA RNA_TrackToConstraint;
extern StructRNA RNA_TransformConstraint;
extern StructRNA RNA_TransformSequence;
extern StructRNA RNA_UILayout;
+extern StructRNA RNA_UIListItem;
extern StructRNA RNA_UVProjectModifier;
+extern StructRNA RNA_UnitSettings;
extern StructRNA RNA_UnknownType;
extern StructRNA RNA_UserPreferences;
-extern StructRNA RNA_UserPreferencesAutosave;
extern StructRNA RNA_UserPreferencesEdit;
extern StructRNA RNA_UserPreferencesFilePaths;
extern StructRNA RNA_UserPreferencesLanguage;
extern StructRNA RNA_UserPreferencesSystem;
extern StructRNA RNA_UserPreferencesView;
extern StructRNA RNA_UserSolidLight;
-extern StructRNA RNA_VPaint;
extern StructRNA RNA_VectorFont;
extern StructRNA RNA_VertexGroup;
extern StructRNA RNA_VertexGroupElement;
+extern StructRNA RNA_VertexPaint;
extern StructRNA RNA_VoronoiTexture;
+extern StructRNA RNA_VoxelData;
+extern StructRNA RNA_VoxelDataTexture;
extern StructRNA RNA_WaveModifier;
+extern StructRNA RNA_Window;
extern StructRNA RNA_WindowManager;
extern StructRNA RNA_WipeSequence;
extern StructRNA RNA_WoodTexture;
@@ -493,6 +549,7 @@ int RNA_struct_ui_icon(StructRNA *type);
PropertyRNA *RNA_struct_name_property(StructRNA *type);
PropertyRNA *RNA_struct_iterator_property(StructRNA *type);
+StructRNA *RNA_struct_base(StructRNA *type);
int RNA_struct_is_ID(StructRNA *type);
int RNA_struct_is_a(StructRNA *type, StructRNA *srna);
@@ -526,9 +583,14 @@ char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen);
const char *RNA_property_identifier(PropertyRNA *prop);
PropertyType RNA_property_type(PropertyRNA *prop);
PropertySubType RNA_property_subtype(PropertyRNA *prop);
+PropertyUnit RNA_property_unit(PropertyRNA *prop);
int RNA_property_flag(PropertyRNA *prop);
-int RNA_property_array_length(PropertyRNA *prop);
+int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_array_check(PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dimension);
+int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[]);
+char RNA_property_array_item_char(PropertyRNA *prop, int index);
int RNA_property_string_maxlength(PropertyRNA *prop);
@@ -544,12 +606,12 @@ void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin,
void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax);
void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision);
-int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **identifier);
-int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **name);
+int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier);
+int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name);
-void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **item, int *totitem);
-int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value);
-int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier);
+void RNA_property_enum_items(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free);
+int RNA_property_enum_value(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value);
+int RNA_property_enum_identifier(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier);
StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop);
@@ -600,11 +662,19 @@ int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop);
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr);
int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr);
+/* 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_raw_type_sizeof(RawPropertyType type);
+RawPropertyType RNA_property_raw_type(PropertyRNA *prop);
+
+
/* to create ID property groups */
void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr);
-void RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key);
+int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key);
void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop);
/* Path
@@ -623,6 +693,7 @@ char *RNA_path_back(const char *path);
int RNA_path_resolve(PointerRNA *ptr, const char *path,
PointerRNA *r_ptr, PropertyRNA **r_prop);
+char *RNA_path_from_ID_to_struct(PointerRNA *ptr);
char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop);
#if 0
@@ -665,11 +736,11 @@ void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name);
void RNA_enum_set(PointerRNA *ptr, const char *name, int value);
-int RNA_enum_is_equal(PointerRNA *ptr, const char *name, const char *enumname);
+int RNA_enum_is_equal(struct bContext *C, PointerRNA *ptr, const char *name, const char *enumname);
/* lower level functions that donr use a PointerRNA */
-int RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *value);
-int RNA_enum_id_from_value(const EnumPropertyItem *item, int value, const char **identifier);
+int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value);
+int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier);
void RNA_string_get(PointerRNA *ptr, const char *name, char *value);
char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen);
@@ -677,6 +748,7 @@ int RNA_string_length(PointerRNA *ptr, const char *name);
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value);
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name);
+void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value);
void RNA_pointer_add(PointerRNA *ptr, const char *name);
void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter);
@@ -721,7 +793,7 @@ void RNA_collection_clear(PointerRNA *ptr, const char *name);
int RNA_property_is_set(PointerRNA *ptr, const char *name);
/* python compatible string representation of this property, (must be freed!) */
-char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop);
+char *RNA_property_as_string(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop);
char *RNA_pointer_as_string(PointerRNA *ptr);
/* Function */
@@ -737,8 +809,9 @@ const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func);
/* Utility */
-ParameterList *RNA_parameter_list_create(PointerRNA *ptr, FunctionRNA *func);
+ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func);
void RNA_parameter_list_free(ParameterList *parms);
+int RNA_parameter_list_size(ParameterList *parms);
void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter);
void RNA_parameter_list_next(ParameterIterator *iter);
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 85a148be2e2..37b175fbf12 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -42,6 +42,7 @@ extern "C" {
BlenderRNA *RNA_create(void);
void RNA_define_free(BlenderRNA *brna);
void RNA_free(BlenderRNA *brna);
+void RNA_define_verify_sdna(int verify);
void RNA_init(void);
void RNA_exit(void);
@@ -62,6 +63,7 @@ void RNA_def_struct_path_func(StructRNA *srna, const char *path);
void RNA_def_struct_identifier(StructRNA *srna, const char *identifier);
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description);
void RNA_def_struct_ui_icon(StructRNA *srna, int icon);
+void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *ext);
void RNA_struct_free(BlenderRNA *brna, StructRNA *srna);
/* Compact Property Definitions */
@@ -70,6 +72,8 @@ typedef void StructOrFunctionRNA;
PropertyRNA *RNA_def_boolean(StructOrFunctionRNA *cont, const char *identifier, int default_value, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_boolean_array(StructOrFunctionRNA *cont, const char *identifier, int len, int *default_value, const char *ui_name, const char *ui_description);
+PropertyRNA *RNA_def_boolean_layer(StructOrFunctionRNA *cont, const char *identifier, int len, int *default_value, const char *ui_name, const char *ui_description);
+PropertyRNA *RNA_def_boolean_layer_member(StructOrFunctionRNA *cont, const char *identifier, int len, int *default_value, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_boolean_vector(StructOrFunctionRNA *cont, const char *identifier, int len, int *default_value, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_int(StructOrFunctionRNA *cont, const char *identifier, int default_value, int hardmin, int hardmax, const char *ui_name, const char *ui_description, int softmin, int softmax);
@@ -79,19 +83,27 @@ PropertyRNA *RNA_def_int_array(StructOrFunctionRNA *cont, const char *identifier
PropertyRNA *RNA_def_string(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_string_file_path(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
+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);
+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);
PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_color(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
-PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
+PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont, const char *identifier, int rows, int columns, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value,
float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_float_array(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value,
float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
+ /*
+PropertyRNA *RNA_def_float_dynamic_array(StructOrFunctionRNA *cont, const char *identifier, float hardmin, float hardmax,
+ const char *ui_name, const char *ui_description, float softmin, float softmax, unsigned int dimension, unsigned short dim_size[]);
+ */
PropertyRNA *RNA_def_float_percentage(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax,
const char *ui_name, const char *ui_description, float softmin, float softmax);
+PropertyRNA *RNA_def_float_factor(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax,
+ const char *ui_name, const char *ui_description, float softmin, float softmax);
PropertyRNA *RNA_def_pointer(StructOrFunctionRNA *cont, const char *identifier, const char *type,
const char *ui_name, const char *ui_description);
@@ -119,7 +131,8 @@ 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_array(PropertyRNA *prop, int arraylength);
+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_range(PropertyRNA *prop, double min, double max);
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);
@@ -143,6 +156,7 @@ void RNA_def_property_ui_icon(PropertyRNA *prop, int icon, int consecutive);
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *updatefunc);
void RNA_def_property_editable_func(PropertyRNA *prop, const char *editable);
+void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength);
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set);
void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range);
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range);
@@ -159,6 +173,24 @@ void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret);
void RNA_def_function_flag(FunctionRNA *func, int flag);
void RNA_def_function_ui_description(FunctionRNA *func, const char *description);
+/* Dynamic Enums
+ * strings are not freed, assumed pointing to static location. */
+
+void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item);
+void RNA_enum_item_add_separator(EnumPropertyItem **items, int *totitem);
+void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item);
+void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item, int value);
+void RNA_enum_item_end(EnumPropertyItem **items, int *totitem);
+
+/* Memory management */
+
+void RNA_def_struct_duplicate_pointers(StructRNA *srna);
+void RNA_def_struct_free_pointers(StructRNA *srna);
+void RNA_def_func_duplicate_pointers(FunctionRNA *func);
+void RNA_def_func_free_pointers(FunctionRNA *func);
+void RNA_def_property_duplicate_pointers(PropertyRNA *prop);
+void RNA_def_property_free_pointers(PropertyRNA *prop);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 276f421c586..ccf4b7a2db3 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -29,20 +29,35 @@
/* Types */
+extern EnumPropertyItem object_mode_items[];
+
extern EnumPropertyItem prop_mode_items[];
extern EnumPropertyItem space_type_items[];
extern EnumPropertyItem region_type_items[];
extern EnumPropertyItem modifier_type_items[];
extern EnumPropertyItem constraint_type_items[];
+extern EnumPropertyItem boidrule_type_items[];
+extern EnumPropertyItem beztriple_keyframe_type_items[];
extern EnumPropertyItem beztriple_handle_type_items[];
extern EnumPropertyItem beztriple_interpolation_mode_items[];
+extern EnumPropertyItem keyingset_path_grouping_items[];
+
extern EnumPropertyItem fmodifier_type_items[];
+extern EnumPropertyItem nla_mode_extend_items[];
+extern EnumPropertyItem nla_mode_blend_items[];
+
extern EnumPropertyItem event_value_items[];
extern EnumPropertyItem event_type_items[];
+extern EnumPropertyItem brush_sculpt_tool_items[];
+
+extern EnumPropertyItem unpack_method_items[];
+
+extern EnumPropertyItem object_type_items[];
+
#endif /* RNA_ENUM_TYPES */
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 75f52ededd0..5fff2af29ff 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -66,17 +66,54 @@ typedef enum PropertyType {
PROP_COLLECTION = 6
} PropertyType;
+/* also update rna_property_subtype_unit when you change this */
+typedef enum PropertyUnit {
+ PROP_UNIT_NONE = (0<<16),
+ PROP_UNIT_LENGTH = (1<<16), /* m */
+ PROP_UNIT_AREA = (2<<16), /* m^2 */
+ PROP_UNIT_VOLUME = (3<<16), /* m^3 */
+ PROP_UNIT_MASS = (4<<16), /* kg */
+ PROP_UNIT_ROTATION = (5<<16), /* rad */
+ PROP_UNIT_TIME = (6<<16), /* frame */
+ PROP_UNIT_VELOCITY = (7<<16), /* m/s */
+ PROP_UNIT_ACCELERATION = (8<<16) /* m/(s^2) */
+} PropertyUnit;
+
+#define RNA_SUBTYPE_UNIT(subtype) (subtype & 0x00FF0000)
+#define RNA_SUBTYPE_UNIT_VALUE(subtype) (subtype>>16)
+
+/* also update rna_property_subtypename when you change this */
typedef enum PropertySubType {
PROP_NONE = 0,
- PROP_UNSIGNED = 1,
- PROP_FILEPATH = 2,
- PROP_DIRPATH = 3,
- PROP_COLOR = 4,
- PROP_VECTOR = 5,
- PROP_MATRIX = 6,
- PROP_ROTATION = 7,
- PROP_NEVER_NULL = 8,
- PROP_PERCENTAGE = 9
+
+ /* strings */
+ PROP_FILEPATH = 1,
+ PROP_DIRPATH = 2,
+ PROP_FILENAME = 3,
+
+ /* numbers */
+ PROP_UNSIGNED = 13,
+ PROP_PERCENTAGE = 14,
+ PROP_FACTOR = 15,
+ PROP_ANGLE = 16|PROP_UNIT_ROTATION,
+ PROP_TIME = 17|PROP_UNIT_TIME,
+ PROP_DISTANCE = 18|PROP_UNIT_LENGTH,
+
+ /* number arrays */
+ PROP_COLOR = 20,
+ PROP_TRANSLATION = 21|PROP_UNIT_LENGTH,
+ PROP_DIRECTION = 22,
+ PROP_VELOCITY = 23|PROP_UNIT_VELOCITY,
+ PROP_ACCELERATION = 24|PROP_UNIT_ACCELERATION,
+ PROP_MATRIX = 25,
+ PROP_EULER = 26|PROP_UNIT_ROTATION,
+ PROP_QUATERNION = 27,
+ PROP_XYZ = 28,
+ PROP_RGB = 29,
+
+ /* booleans */
+ PROP_LAYER = 40,
+ PROP_LAYER_MEMBER = 41
} PropertySubType;
typedef enum PropertyFlag {
@@ -85,6 +122,11 @@ typedef enum PropertyFlag {
* for pointers and collections. */
PROP_EDITABLE = 1,
+ /* this property is editable even if it is lib linked,
+ * meaning it will get lost on reload, but it's useful
+ * for editing. */
+ PROP_LIB_EXCEPTION = 65536,
+
/* animateable means the property can be driven by some
* other input, be it animation curves, expressions, ..
* properties are animateable by default except for pointers
@@ -105,12 +147,17 @@ typedef enum PropertyFlag {
/* pointers */
PROP_ID_REFCOUNT = 64,
+ PROP_NEVER_NULL = 262144,
/* internal flags */
PROP_BUILTIN = 128,
PROP_EXPORT = 256,
PROP_RUNTIME = 512,
- PROP_IDPROPERTY = 1024
+ PROP_IDPROPERTY = 1024,
+ PROP_RAW_ACCESS = 8192,
+ PROP_RAW_ARRAY = 16384,
+ PROP_FREE_POINTERS = 32768,
+ PROP_DYNAMIC = 131072 /* for dynamic arrays, and retvals of type string */
} PropertyFlag;
typedef struct CollectionPropertyIterator {
@@ -132,7 +179,20 @@ typedef struct CollectionPointerLink {
PointerRNA ptr;
} CollectionPointerLink;
-/* Iterator Utility */
+typedef enum RawPropertyType {
+ PROP_RAW_INT, // XXX - abused for types that are not set, eg. MFace.verts, needs fixing.
+ PROP_RAW_SHORT,
+ PROP_RAW_CHAR,
+ PROP_RAW_DOUBLE,
+ PROP_RAW_FLOAT
+} RawPropertyType;
+
+typedef struct RawArray {
+ void *array;
+ RawPropertyType type;
+ int len;
+ int stride;
+} RawArray;
typedef struct EnumPropertyItem {
int value;
@@ -142,14 +202,25 @@ typedef struct EnumPropertyItem {
const char *description;
} EnumPropertyItem;
+typedef EnumPropertyItem *(*EnumPropertyItemFunc)(struct bContext *C, PointerRNA *ptr, int *free);
+
typedef struct PropertyRNA PropertyRNA;
/* Parameter List */
-typedef struct ParameterList ParameterList;
+typedef struct ParameterList {
+ /* storage for parameters */
+ void *data;
+
+ /* store the parameter count */
+ int tot;
+
+ /* function passed at creation time */
+ struct FunctionRNA *func;
+} ParameterList;
typedef struct ParameterIterator {
- ParameterList *parms;
+ struct ParameterList *parms;
PointerRNA funcptr;
void *data;
int size, offset;
@@ -172,7 +243,8 @@ typedef enum FunctionFlag {
/* internal flags */
FUNC_BUILTIN = 128,
FUNC_EXPORT = 256,
- FUNC_RUNTIME = 512
+ FUNC_RUNTIME = 512,
+ FUNC_FREE_POINTERS = 1024
} FunctionFlag;
typedef void (*CallFunc)(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, ParameterList *parms);
@@ -188,14 +260,15 @@ typedef enum StructFlag {
/* internal flags */
STRUCT_RUNTIME = 4,
- STRUCT_GENERATED = 8
+ STRUCT_GENERATED = 8,
+ STRUCT_FREE_POINTERS = 16
} StructFlag;
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
-typedef int (*StructCallbackFunc)(struct PointerRNA *ptr, struct FunctionRNA *func, struct ParameterList *list);
+typedef int (*StructCallbackFunc)(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,
- StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
+ const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
typedef void (*StructUnregisterFunc)(const struct bContext *C, struct StructRNA *type);
typedef struct StructRNA StructRNA;
@@ -206,6 +279,19 @@ typedef struct StructRNA StructRNA;
typedef struct BlenderRNA BlenderRNA;
+/* Extending
+ *
+ * This struct must be embedded in *Type structs in
+ * order to make then definable through RNA. */
+
+typedef struct ExtensionRNA {
+ void *data;
+ StructRNA *srna;
+
+ int (*call)(PointerRNA *, FunctionRNA *, ParameterList *);
+ void (*free)(void *data);
+} ExtensionRNA;
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 967636fe36b..8fc9df0fbf6 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -7,6 +7,37 @@ o = SConscript('intern/SConscript')
objs += o
incs = '#/intern/guardedalloc ../blenkernel ../blenlib ../makesdna intern .'
-incs += ' ../windowmanager ../editors/include ../imbuf'
+incs += ' ../windowmanager ../editors/include ../imbuf ../ikplugin'
+incs += ' ../render/extern/include'
-env.BlenderLib ( 'bf_rna', objs, Split(incs), [], libtype=['core'], priority = [195] )
+defs = []
+
+if env['WITH_BF_OPENEXR']:
+ defs.append('WITH_OPENEXR')
+
+if env['WITH_BF_OPENJPEG']:
+ defs.append('WITH_OPENJPEG')
+
+if env['WITH_BF_DDS']:
+ defs.append('WITH_DDS')
+
+if env['WITH_BF_FFMPEG']:
+ defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
+
+if env['WITH_BF_OGG']:
+ defs.append('WITH_OGG')
+
+if env['WITH_BF_QUICKTIME']:
+ defs.append('WITH_QUICKTIME')
+
+if env['WITH_BF_LCMS']:
+ defs.append('WITH_LCMS')
+
+if env['WITH_BF_GAMEENGINE']:
+ defs.append('GAMEBLENDER=1')
+
+if env['BF_UNIT_TEST']:
+ defs.append('UNIT_TEST')
+
+env.BlenderLib ( 'bf_rna', objs, Split(incs), defines=defs, libtype=['core','player'], priority = [165,20] )
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 963e4f9aeff..50cf0b00b84 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -32,45 +32,70 @@ LIST(REMOVE_ITEM DEFSRC ${APISRC})
STRING(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
SET(SRC
- makesrna.c
- rna_define.c
- ${DEFSRC}
- ${APISRC}
- ../../../../intern/guardedalloc/intern/mallocn.c
- ../../../../intern/guardedalloc/intern/mmap_win.c)
-
-INCLUDE_DIRECTORIES(../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../windowmanager ../../editors/include ../../imbuf .)
+ makesrna.c
+ rna_define.c
+ ${DEFSRC}
+ ${APISRC}
+ ../../../../intern/guardedalloc/intern/mallocn.c
+ ../../../../intern/guardedalloc/intern/mmap_win.c)
+
+INCLUDE_DIRECTORIES(../../../../intern/guardedalloc .. ../../makesdna ../../blenkernel ../../blenlib ../../ikplugin ../../windowmanager ../../editors/include ../../imbuf ../../render/extern/include .)
FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h)
+IF(WITH_GAMEENGINE)
+ ADD_DEFINITIONS(-DGAMEBLENDER)
+ENDIF(WITH_GAMEENGINE)
+
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
+ ADD_DEFINITIONS(-DWITH_OPENJPEG)
ENDIF(WITH_OPENJPEG)
IF(WITH_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
+ ADD_DEFINITIONS(-DWITH_DDS)
ENDIF(WITH_DDS)
IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
+IF(NOT WITH_ELBEEM)
+ ADD_DEFINITIONS(-DDISABLE_ELBEEM)
+ENDIF(NOT WITH_ELBEEM)
+
+IF(WITH_FFTW3)
+ ADD_DEFINITIONS(-DFFTW3=1)
+ENDIF(WITH_FFTW3)
+
+IF(WITH_SDL)
+ ADD_DEFINITIONS(-DWITH_SDL)
+ENDIF(WITH_SDL)
+
+IF(WITH_OPENAL)
+ ADD_DEFINITIONS(-DWITH_OPENAL)
+ENDIF(WITH_OPENAL)
+
+IF(WITH_JACK)
+ ADD_DEFINITIONS(-DWITH_JACK)
+ENDIF(WITH_JACK)
+
# Build makesrna executable
ADD_EXECUTABLE(makesrna ${SRC} ${INC_FILES})
TARGET_LINK_LIBRARIES(makesrna bf_dna)
# Output rna_*_gen.c
ADD_CUSTOM_COMMAND(
- OUTPUT ${GENSRC}
- COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesrna ${CMAKE_CURRENT_BINARY_DIR}/
- DEPENDS makesrna
+ OUTPUT ${GENSRC}
+ COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesrna ${CMAKE_CURRENT_BINARY_DIR}/
+ DEPENDS makesrna
)
# Build bf_rna
diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile
index 1694e55ed4c..7923ea1e7de 100644
--- a/source/blender/makesrna/intern/Makefile
+++ b/source/blender/makesrna/intern/Makefile
@@ -49,14 +49,17 @@ CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../imbuf
+CPPFLAGS += -I../../ikplugin
CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../windowmanager
CPPFLAGS += -I../../editors/include
+CPPFLAGS += -I../../render/extern/include
CPPFLAGS += -I..
CPPFLAGS += -I.
ifeq ($(WITH_FFMPEG),true)
CPPFLAGS += -DWITH_FFMPEG
+ CPPFLAGS += $(NAN_FFMPEGCFLAGS)
endif
ifeq ($(WITH_OPENEXR), true)
@@ -75,6 +78,18 @@ ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -DWITH_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 ($(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
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 03f0afdb2cc..0f8bc752f09 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'])
@@ -29,6 +29,11 @@ makesrna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesrna/\\"" '
defs = []
+incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel'
+incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin'
+incs += ' ../../windowmanager ../../editors/include'
+incs += ' ../../render/extern/include'
+
if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
@@ -40,6 +45,10 @@ if env['WITH_BF_DDS']:
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
+
+if env['WITH_BF_OGG']:
+ defs.append('WITH_OGG')
if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
@@ -47,16 +56,27 @@ if env['WITH_BF_QUICKTIME']:
if env['WITH_BF_LCMS']:
defs.append('WITH_LCMS')
+if env['WITH_BF_GAMEENGINE']:
+ defs.append('GAMEBLENDER=1')
+
+if env['WITH_BF_FFTW3']:
+ defs.append('FFTW3=1')
+
+if env['WITH_BF_SDL']:
+ defs.append('WITH_SDL')
+
+if env['WITH_BF_OPENAL']:
+ defs.append('WITH_OPENAL')
+
+if env['WITH_BF_JACK']:
+ defs.append('WITH_JACK')
+
+if env['BF_UNIT_TEST']:
+ defs.append('UNIT_TEST')
+
makesrna_tool.Append(CPPDEFINES=defs)
-makesrna_tool.Append (CPPPATH = ['#/intern/guardedalloc',
- '../../blenlib',
- '../../blenkernel',
- '../../imbuf',
- '../../makesdna',
- '../../makesrna',
- '../../windowmanager',
- '../../editors/include'])
+makesrna_tool.Append (CPPPATH = Split(incs))
if env['OURPLATFORM'] == 'linuxcross':
USE_WINE = True # when cross compiling on linux 64bit this is useful
@@ -79,13 +99,17 @@ if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
makesrna_tool.Append (LIBPATH = libdir)
+makesrna_tool.Append( CFLAGS = env['CFLAGS'])
+makesrna_tool.Append( CCFLAGS = env['CCFLAGS'])
+makesrna_tool.Append( LINKFLAGS = env['PLATFORM_LINKFLAGS'])
+
if env['BF_PROFILE']:
makesrna_tool.Append (LINKFLAGS = env['BF_PROFILE_FLAGS'])
if env['BF_DEBUG']:
makesrna_tool.Append(CFLAGS = env['BF_DEBUG_CFLAGS'])
makesrna_tool.Append(CCFLAGS = env['BF_DEBUG_CCFLAGS'])
- if env['OURPLATFORM'] == 'win32-vc':
+ if env['OURPLATFORM'] in ('win32-vc','win64-vc'):
makesrna_tool.Append(LINKFLAGS = ['/DEBUG','/PDB:makesrna.pdb'])
targetpath = root_build_dir+'/makesrna'
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 475db3955b6..961fb9a3d0b 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -119,6 +119,11 @@ static void rna_print_c_string(FILE *f, const char *str)
static char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
int i, j;
+ if(!str) {
+ fprintf(f, "NULL");
+ return;
+ }
+
fprintf(f, "\"");
for(i=0; str[i]; i++) {
for(j=0; escape[j]; j++)
@@ -262,7 +267,8 @@ static int rna_enum_bitmask(PropertyRNA *prop)
if(eprop->item) {
for(a=0; a<eprop->totitem; a++)
- mask |= eprop->item[a].value;
+ if(eprop->item[a].identifier[0])
+ mask |= eprop->item[a].value;
}
return mask;
@@ -300,11 +306,10 @@ static void rna_int_print(FILE *f, int num)
static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, const char *manualfunc)
{
char *func;
- int i;
if(prop->flag & PROP_IDPROPERTY)
return NULL;
-
+
if(!manualfunc) {
if(!dp->dnastructname || !dp->dnaname) {
fprintf(stderr, "rna_def_property_get_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
@@ -367,8 +372,11 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
break;
}
default:
- if(prop->arraylength) {
- fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+ if(prop->arraydimension) {
+ if(prop->flag & PROP_DYNAMIC)
+ fprintf(f, "void %s(PointerRNA *ptr, %s values[])\n", func, rna_type_type(prop));
+ else
+ fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
fprintf(f, "{\n");
if(manualfunc) {
@@ -377,25 +385,38 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
else {
rna_print_data_get(f, dp);
- for(i=0; i<prop->arraylength; i++) {
- if(dp->dnaarraylength == 1) {
- if(prop->type == PROP_BOOLEAN && dp->booleanbit)
- fprintf(f, " values[%d]= (%s(data->%s & (%d<<%d)) != 0);\n", i, (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit, i);
- else
- fprintf(f, " values[%d]= (%s)%s((&data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
- }
- else {
- if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
- fprintf(f, " values[%d]= (%s(data->%s[%d] & ", i, (dp->booleannegative)? "!": "", dp->dnaname, i);
- rna_int_print(f, dp->booleanbit);
- fprintf(f, ") != 0);\n");
- }
- else if(rna_color_quantize(prop, dp))
- fprintf(f, " values[%d]= (%s)(data->%s[%d]*(1.0f/255.0f));\n", i, rna_type_type(prop), dp->dnaname, i);
- else
- fprintf(f, " values[%d]= (%s)%s(((%s*)data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname, i);
+ if(prop->flag & PROP_DYNAMIC) {
+ char *lenfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "get_length");
+ fprintf(f, " int i, arraylen[RNA_MAX_ARRAY_DIMENSION];\n");
+ fprintf(f, " int len= %s(ptr, arraylen);\n\n", lenfunc);
+ fprintf(f, " for(i=0; i<len; i++) {\n");
+ MEM_freeN(lenfunc);
+ }
+ else {
+ fprintf(f, " int i;\n\n");
+ fprintf(f, " for(i=0; i<%d; i++) {\n", prop->totarraylength);
+ }
+
+ if(dp->dnaarraylength == 1) {
+ if(prop->type == PROP_BOOLEAN && dp->booleanbit)
+ fprintf(f, " values[i]= (%s(data->%s & (%d<<i)) != 0);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+ else
+ fprintf(f, " values[i]= (%s)%s((&data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
+ }
+ else {
+ if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+ fprintf(f, " values[i]= (%s(data->%s[i] & ", (dp->booleannegative)? "!": "", dp->dnaname);
+ rna_int_print(f, dp->booleanbit);
+ fprintf(f, ") != 0);\n");
}
+ else if(rna_color_quantize(prop, dp))
+ fprintf(f, " values[i]= (%s)(data->%s[i]*(1.0f/255.0f));\n", rna_type_type(prop), dp->dnaname);
+ else if(dp->dnatype)
+ fprintf(f, " values[i]= (%s)%s(((%s*)data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname);
+ else
+ fprintf(f, " values[i]= (%s)%s((data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
}
+ fprintf(f, " }\n");
}
fprintf(f, "}\n\n");
}
@@ -430,13 +451,13 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
return func;
}
-static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
+static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array)
{
if(prop->type == PROP_INT) {
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
if(iprop->hardmin != INT_MIN || iprop->hardmax != INT_MAX) {
- if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+ if(array) fprintf(f, "CLAMPIS(values[i], ");
else fprintf(f, "CLAMPIS(value, ");
rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
rna_int_print(f, iprop->hardmax); fprintf(f, ");\n");
@@ -447,7 +468,7 @@ static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
if(fprop->hardmin != -FLT_MAX || fprop->hardmax != FLT_MAX) {
- if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+ if(array) fprintf(f, "CLAMPIS(values[i], ");
else fprintf(f, "CLAMPIS(value, ");
rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
rna_float_print(f, fprop->hardmax); fprintf(f, ");\n");
@@ -456,7 +477,7 @@ static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
}
if(array)
- fprintf(f, "values[%d];\n", i);
+ fprintf(f, "values[i];\n");
else
fprintf(f, "value;\n");
}
@@ -464,7 +485,6 @@ static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
{
char *func;
- int i;
if(!(prop->flag & PROP_EDITABLE))
return NULL;
@@ -524,8 +544,11 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
break;
}
default:
- if(prop->arraylength) {
- fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+ if(prop->arraydimension) {
+ if(prop->flag & PROP_DYNAMIC)
+ fprintf(f, "void %s(PointerRNA *ptr, const %s values[])\n", func, rna_type_type(prop));
+ else
+ fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
fprintf(f, "{\n");
if(manualfunc) {
@@ -534,35 +557,49 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
else {
rna_print_data_get(f, dp);
- for(i=0; i<prop->arraylength; i++) {
- if(dp->dnaarraylength == 1) {
- if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
- fprintf(f, " if(%svalues[%d]) data->%s |= (%d<<%d);\n", (dp->booleannegative)? "!": "", i, dp->dnaname, dp->booleanbit, i);
- fprintf(f, " else data->%s &= ~(%d<<%d);\n", dp->dnaname, dp->booleanbit, i);
- }
- else {
- fprintf(f, " (&data->%s)[%d]= %s", dp->dnaname, i, (dp->booleannegative)? "!": "");
- rna_clamp_value(f, prop, 1, i);
- }
+ if(prop->flag & PROP_DYNAMIC) {
+ char *lenfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "set_length");
+ fprintf(f, " int i, arraylen[RNA_MAX_ARRAY_DIMENSION];\n");
+ fprintf(f, " int len= %s(ptr, arraylen);\n\n", lenfunc);
+ fprintf(f, " for(i=0; i<len; i++) {\n");
+ MEM_freeN(lenfunc);
+ }
+ else {
+ fprintf(f, " int i;\n\n");
+ fprintf(f, " for(i=0; i<%d; i++) {\n", prop->totarraylength);
+ }
+
+ if(dp->dnaarraylength == 1) {
+ if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+ fprintf(f, " if(%svalues[i]) data->%s |= (%d<<i);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+ fprintf(f, " else data->%s &= ~(%d<<i);\n", dp->dnaname, dp->booleanbit);
+ }
+ else {
+ fprintf(f, " (&data->%s)[i]= %s", dp->dnaname, (dp->booleannegative)? "!": "");
+ rna_clamp_value(f, prop, 1);
+ }
+ }
+ else {
+ if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+ fprintf(f, " if(%svalues[i]) data->%s[i] |= ", (dp->booleannegative)? "!": "", dp->dnaname);
+ rna_int_print(f, dp->booleanbit);
+ fprintf(f, ";\n");
+ fprintf(f, " else data->%s[i] &= ~", dp->dnaname);
+ rna_int_print(f, dp->booleanbit);
+ fprintf(f, ";\n");
+ }
+ else if(rna_color_quantize(prop, dp)) {
+ fprintf(f, " data->%s[i]= FTOCHAR(values[i]);\n", dp->dnaname);
}
else {
- if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
- fprintf(f, " if(%svalues[%d]) data->%s[%d] |= ", (dp->booleannegative)? "!": "", i, dp->dnaname, i);
- rna_int_print(f, dp->booleanbit);
- fprintf(f, ";\n");
- fprintf(f, " else data->%s[%d] &= ~", dp->dnaname, i);
- rna_int_print(f, dp->booleanbit);
- fprintf(f, ";\n");
- }
- else if(rna_color_quantize(prop, dp)) {
- fprintf(f, " data->%s[%d]= FTOCHAR(values[%d]);\n", dp->dnaname, i, i);
- }
- else {
- fprintf(f, " ((%s*)data->%s)[%d]= %s", dp->dnatype, dp->dnaname, i, (dp->booleannegative)? "!": "");
- rna_clamp_value(f, prop, 1, i);
- }
+ if(dp->dnatype)
+ fprintf(f, " ((%s*)data->%s)[i]= %s", dp->dnatype, dp->dnaname, (dp->booleannegative)? "!": "");
+ else
+ fprintf(f, " (data->%s)[i]= %s", dp->dnaname, (dp->booleannegative)? "!": "");
+ rna_clamp_value(f, prop, 1);
}
}
+ fprintf(f, " }\n");
}
fprintf(f, "}\n\n");
}
@@ -591,7 +628,7 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
}
else {
fprintf(f, " data->%s= %s", dp->dnaname, (dp->booleannegative)? "!": "");
- rna_clamp_value(f, prop, 0, 0);
+ rna_clamp_value(f, prop, 0);
}
}
fprintf(f, "}\n\n");
@@ -693,9 +730,9 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *
}
else {
if(dp->dnalengthname)
- fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), data->%s, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthname);
+ fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), data->%s, 0, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthname);
else
- fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), %d, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthfixed);
+ fprintf(f, "\n rna_iterator_array_begin(iter, data->%s, sizeof(data->%s[0]), %d, 0, NULL);\n", dp->dnaname, dp->dnaname, dp->dnalengthfixed);
}
}
else {
@@ -762,6 +799,42 @@ static char *rna_def_property_end_func(FILE *f, StructRNA *srna, PropertyRNA *pr
return func;
}
+static void rna_set_raw_property(PropertyDefRNA *dp, PropertyRNA *prop)
+{
+ if(dp->dnapointerlevel != 0)
+ return;
+ if(!dp->dnatype || !dp->dnaname || !dp->dnastructname)
+ return;
+
+ if(strcmp(dp->dnatype, "char") == 0) {
+ prop->rawtype= PROP_RAW_CHAR;
+ prop->flag |= PROP_RAW_ACCESS;
+ }
+ else if(strcmp(dp->dnatype, "short") == 0) {
+ prop->rawtype= PROP_RAW_SHORT;
+ prop->flag |= PROP_RAW_ACCESS;
+ }
+ else if(strcmp(dp->dnatype, "int") == 0) {
+ prop->rawtype= PROP_RAW_INT;
+ prop->flag |= PROP_RAW_ACCESS;
+ }
+ else if(strcmp(dp->dnatype, "float") == 0) {
+ prop->rawtype= PROP_RAW_FLOAT;
+ prop->flag |= PROP_RAW_ACCESS;
+ }
+ else if(strcmp(dp->dnatype, "double") == 0) {
+ prop->rawtype= PROP_RAW_DOUBLE;
+ prop->flag |= PROP_RAW_ACCESS;
+ }
+}
+
+static void rna_set_raw_offset(FILE *f, StructRNA *srna, PropertyRNA *prop)
+{
+ PropertyDefRNA *dp= rna_find_struct_property_def(srna, prop);
+
+ fprintf(f, "\toffsetof(%s, %s), %d", dp->dnastructname, dp->dnaname, prop->rawtype);
+}
+
static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
{
PropertyRNA *prop;
@@ -772,7 +845,10 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
case PROP_BOOLEAN: {
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
- if(!prop->arraylength) {
+ if(!prop->arraydimension) {
+ if(!bprop->get && !bprop->set && !dp->booleanbit)
+ rna_set_raw_property(dp, prop);
+
bprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)bprop->get);
bprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)bprop->set);
}
@@ -785,11 +861,17 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
case PROP_INT: {
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
- if(!prop->arraylength) {
+ if(!prop->arraydimension) {
+ if(!iprop->get && !iprop->set)
+ rna_set_raw_property(dp, prop);
+
iprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)iprop->get);
iprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)iprop->set);
}
else {
+ if(!iprop->getarray && !iprop->setarray)
+ rna_set_raw_property(dp, prop);
+
iprop->getarray= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)iprop->getarray);
iprop->setarray= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)iprop->setarray);
}
@@ -798,11 +880,17 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
case PROP_FLOAT: {
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
- if(!prop->arraylength) {
+ if(!prop->arraydimension) {
+ if(!fprop->get && !fprop->set)
+ rna_set_raw_property(dp, prop);
+
fprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)fprop->get);
fprop->set= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)fprop->set);
}
else {
+ if(!fprop->getarray && !fprop->setarray)
+ rna_set_raw_property(dp, prop);
+
fprop->getarray= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)fprop->getarray);
fprop->setarray= (void*)rna_def_property_set_func(f, srna, prop, dp, (char*)fprop->setarray);
}
@@ -841,6 +929,13 @@ static void rna_def_property_funcs(FILE *f, StructRNA *srna, PropertyDefRNA *dp)
else if(dp->dnalengthname || dp->dnalengthfixed)
cprop->length= (void*)rna_def_property_length_func(f, srna, prop, dp, (char*)cprop->length);
+ /* test if we can allow raw array access, if it is using our standard
+ * array get/next function, we can be sure it is an actual array */
+ if(cprop->next && cprop->get)
+ if(strcmp((char*)cprop->next, "rna_iterator_array_next") == 0 &&
+ strcmp((char*)cprop->get, "rna_iterator_array_get") == 0)
+ prop->flag |= PROP_RAW_ARRAY;
+
cprop->get= (void*)rna_def_property_get_func(f, srna, prop, dp, (char*)cprop->get);
cprop->begin= (void*)rna_def_property_begin_func(f, srna, prop, dp, (char*)cprop->begin);
cprop->next= (void*)rna_def_property_next_func(f, srna, prop, dp, (char*)cprop->next);
@@ -884,23 +979,23 @@ static void rna_def_property_funcs_header(FILE *f, StructRNA *srna, PropertyDefR
switch(prop->type) {
case PROP_BOOLEAN:
case PROP_INT: {
- if(!prop->arraylength) {
+ if(!prop->arraydimension) {
fprintf(f, "int %sget(PointerRNA *ptr);\n", func);
//fprintf(f, "void %sset(PointerRNA *ptr, int value);\n", func);
}
else {
- fprintf(f, "void %sget(PointerRNA *ptr, int values[%d]);\n", func, prop->arraylength);
+ fprintf(f, "void %sget(PointerRNA *ptr, int values[%d]);\n", func, prop->totarraylength);
//fprintf(f, "void %sset(PointerRNA *ptr, const int values[%d]);\n", func, prop->arraylength);
}
break;
}
case PROP_FLOAT: {
- if(!prop->arraylength) {
+ if(!prop->arraydimension) {
fprintf(f, "float %sget(PointerRNA *ptr);\n", func);
//fprintf(f, "void %sset(PointerRNA *ptr, float value);\n", func);
}
else {
- fprintf(f, "void %sget(PointerRNA *ptr, float values[%d]);\n", func, prop->arraylength);
+ fprintf(f, "void %sget(PointerRNA *ptr, float values[%d]);\n", func, prop->totarraylength);
//fprintf(f, "void %sset(PointerRNA *ptr, const float values[%d]);\n", func, prop->arraylength);
}
break;
@@ -913,7 +1008,8 @@ static void rna_def_property_funcs_header(FILE *f, StructRNA *srna, PropertyDefR
fprintf(f, "enum {\n");
for(i=0; i<eprop->totitem; i++)
- fprintf(f, "\t%s_%s_%s = %d,\n", srna->identifier, prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
+ if(eprop->item[i].identifier[0])
+ fprintf(f, "\t%s_%s_%s = %d,\n", srna->identifier, prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
fprintf(f, "};\n\n");
}
@@ -973,24 +1069,24 @@ static void rna_def_property_funcs_header_cpp(FILE *f, StructRNA *srna, Property
switch(prop->type) {
case PROP_BOOLEAN: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tbool %s(void);", prop->identifier);
else
- fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
+ fprintf(f, "\tArray<int, %d> %s(void);", prop->totarraylength, prop->identifier);
break;
}
case PROP_INT: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tint %s(void);", prop->identifier);
else
- fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
+ fprintf(f, "\tArray<int, %d> %s(void);", prop->totarraylength, prop->identifier);
break;
}
case PROP_FLOAT: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tfloat %s(void);", prop->identifier);
else
- fprintf(f, "\tArray<float, %d> %s(void);", prop->arraylength, prop->identifier);
+ fprintf(f, "\tArray<float, %d> %s(void);", prop->totarraylength, prop->identifier);
break;
}
case PROP_ENUM: {
@@ -1001,7 +1097,8 @@ static void rna_def_property_funcs_header_cpp(FILE *f, StructRNA *srna, Property
fprintf(f, "\tenum %s_enum {\n", prop->identifier);
for(i=0; i<eprop->totitem; i++)
- fprintf(f, "\t\t%s_%s = %d,\n", prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
+ if(eprop->item[i].identifier[0])
+ fprintf(f, "\t\t%s_%s = %d,\n", prop->identifier, eprop->item[i].identifier, eprop->item[i].value);
fprintf(f, "\t};\n");
}
@@ -1047,24 +1144,24 @@ static void rna_def_property_funcs_impl_cpp(FILE *f, StructRNA *srna, PropertyDe
switch(prop->type) {
case PROP_BOOLEAN: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tBOOLEAN_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
else
- fprintf(f, "\tBOOLEAN_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+ fprintf(f, "\tBOOLEAN_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
break;
}
case PROP_INT: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tINT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
else
- fprintf(f, "\tINT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+ fprintf(f, "\tINT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
break;
}
case PROP_FLOAT: {
- if(!prop->arraylength)
+ if(!prop->arraydimension)
fprintf(f, "\tFLOAT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
else
- fprintf(f, "\tFLOAT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+ fprintf(f, "\tFLOAT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
break;
}
case PROP_ENUM: {
@@ -1127,7 +1224,13 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
dparm= dfunc->cont.properties.first;
for(; dparm; dparm= dparm->next) {
- ptrstr= (dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0)? "*" : "";
+ if(dparm->prop->arraydimension)
+ ptrstr= "*";
+ else if(dparm->prop==func->ret)
+ ptrstr= ((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR))? "*": "";
+ else
+ ptrstr= (dparm->prop->type == PROP_POINTER)? "*": "";
+
fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
}
@@ -1148,7 +1251,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
for(; dparm; dparm= dparm->next) {
if(dparm->prop==func->ret)
fprintf(f, "\t_retdata= _data;\n");
- else if(dparm->prop->arraylength)
+ else if(dparm->prop->arraydimension)
fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
else if(dparm->prop->type == PROP_POINTER) {
if(dparm->prop->flag & PROP_RNAPTR)
@@ -1203,7 +1306,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
if(func->ret) {
dparm= rna_find_parameter_def(func->ret);
- ptrstr= dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0 ? "*" : "";
+ ptrstr= (((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR)) || (dparm->prop->arraydimension))? "*": "";
fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->ret->identifier);
}
}
@@ -1299,15 +1402,50 @@ static const char *rna_property_subtypename(PropertyType type)
{
switch(type) {
case PROP_NONE: return "PROP_NONE";
- case PROP_UNSIGNED: return "PROP_UNSIGNED";
case PROP_FILEPATH: return "PROP_FILEPATH";
case PROP_DIRPATH: return "PROP_DIRPATH";
+ case PROP_UNSIGNED: return "PROP_UNSIGNED";
+ case PROP_PERCENTAGE: return "PROP_PERCENTAGE";
+ case PROP_FACTOR: return "PROP_FACTOR";
+ case PROP_ANGLE: return "PROP_ANGLE";
+ case PROP_TIME: return "PROP_TIME";
+ case PROP_DISTANCE: return "PROP_DISTANCE";
case PROP_COLOR: return "PROP_COLOR";
- case PROP_VECTOR: return "PROP_VECTOR";
+ case PROP_TRANSLATION: return "PROP_TRANSLATION";
+ case PROP_DIRECTION: return "PROP_DIRECTION";
case PROP_MATRIX: return "PROP_MATRIX";
- case PROP_ROTATION: return "PROP_ROTATION";
- case PROP_NEVER_NULL: return "PROP_NEVER_NULL";
- case PROP_PERCENTAGE: return "PROP_PERCENTAGE";
+ case PROP_EULER: return "PROP_EULER";
+ case PROP_QUATERNION: return "PROP_QUATERNION";
+ case PROP_VELOCITY: return "PROP_VELOCITY";
+ case PROP_ACCELERATION: return "PROP_ACCELERATION";
+ case PROP_XYZ: return "PROP_XYZ";
+ case PROP_RGB: return "PROP_RGB";
+ case PROP_LAYER: return "PROP_LAYER";
+ case PROP_LAYER_MEMBER: return "PROP_LAYER_MEMBER";
+ default: {
+ /* incase we dont have a type preset that includes the subtype */
+ if(RNA_SUBTYPE_UNIT(type)) {
+ return rna_property_subtypename(type & ~RNA_SUBTYPE_UNIT(type));
+ }
+ else {
+ return "PROP_SUBTYPE_UNKNOWN";
+ }
+ }
+ }
+}
+
+static const char *rna_property_subtype_unit(PropertyType type)
+{
+ switch(RNA_SUBTYPE_UNIT(type)) {
+ case PROP_UNIT_NONE: return "PROP_UNIT_NONE";
+ case PROP_UNIT_LENGTH: return "PROP_UNIT_LENGTH";
+ case PROP_UNIT_AREA: return "PROP_UNIT_AREA";
+ case PROP_UNIT_VOLUME: return "PROP_UNIT_VOLUME";
+ case PROP_UNIT_MASS: return "PROP_UNIT_MASS";
+ case PROP_UNIT_ROTATION: return "PROP_UNIT_ROTATION";
+ case PROP_UNIT_TIME: return "PROP_UNIT_TIME";
+ case PROP_UNIT_VELOCITY: return "PROP_UNIT_VELOCITY";
+ case PROP_UNIT_ACCELERATION:return "PROP_UNIT_ACCELERATION";
default: return "PROP_UNKNOWN";
}
}
@@ -1410,9 +1548,9 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
/* return type */
for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
if(dparm->prop==func->ret) {
- if(dparm->prop->arraylength)
+ if(dparm->prop->arraydimension)
fprintf(f, "XXX no array return types yet"); /* XXX not supported */
- else if(dparm->prop->type == PROP_POINTER)
+ else if(dparm->prop->type == PROP_POINTER && !(dparm->prop->flag & PROP_RNAPTR))
fprintf(f, "%s%s *", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
else
fprintf(f, "%s%s ", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
@@ -1457,8 +1595,8 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
if(!first) fprintf(f, ", ");
first= 0;
- if(dparm->prop->arraylength)
- fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->arraylength);
+ if(dparm->prop->arraydimension)
+ fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->totarraylength);
else if(dparm->prop->type == PROP_POINTER)
fprintf(f, "%s%s *%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
else
@@ -1510,95 +1648,93 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
int i, defaultfound= 0;
if(eprop->item) {
- fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {", srna->identifier, strnest, prop->identifier, eprop->totitem);
+ fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {", srna->identifier, strnest, prop->identifier, eprop->totitem+1);
for(i=0; i<eprop->totitem; i++) {
fprintf(f, "{%d, ", eprop->item[i].value);
rna_print_c_string(f, eprop->item[i].identifier); fprintf(f, ", ");
fprintf(f, "%d, ", eprop->item[i].icon);
rna_print_c_string(f, eprop->item[i].name); fprintf(f, ", ");
- rna_print_c_string(f, eprop->item[i].description); fprintf(f, "}");
- if(i != eprop->totitem-1)
- fprintf(f, ", ");
+ rna_print_c_string(f, eprop->item[i].description); fprintf(f, "}, ");
- if(eprop->defaultvalue == eprop->item[i].value)
- defaultfound= 1;
+ if(eprop->item[i].identifier[0])
+ if(eprop->defaultvalue == eprop->item[i].value)
+ defaultfound= 1;
}
- fprintf(f, "};\n\n");
+ fprintf(f, "{0, NULL, 0, NULL, NULL}};\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;
}
}
- else if(eprop->itemf);
else {
fprintf(stderr, "rna_generate_structs: %s%s.%s, enum must have items defined.\n", srna->identifier, errnest, prop->identifier);
DefRNA.error= 1;
}
break;
- }
+ }
case PROP_BOOLEAN: {
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
unsigned int i;
- if(prop->arraylength) {
- fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+ if(prop->arraydimension && prop->totarraylength) {
+ fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
- for(i=0; i<prop->arraylength; i++) {
+ for(i=0; i<prop->totarraylength; i++) {
if(bprop->defaultarray)
fprintf(f, "%d", bprop->defaultarray[i]);
else
fprintf(f, "%d", bprop->defaultvalue);
- if(i != prop->arraylength-1)
+ if(i != prop->totarraylength-1)
fprintf(f, ", ");
}
fprintf(f, "};\n\n");
}
break;
- }
+ }
case PROP_INT: {
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
unsigned int i;
- if(prop->arraylength) {
- fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+ if(prop->arraydimension && prop->totarraylength) {
+ fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
- for(i=0; i<prop->arraylength; i++) {
+ for(i=0; i<prop->totarraylength; i++) {
if(iprop->defaultarray)
fprintf(f, "%d", iprop->defaultarray[i]);
else
fprintf(f, "%d", iprop->defaultvalue);
- if(i != prop->arraylength-1)
+ if(i != prop->totarraylength-1)
fprintf(f, ", ");
}
fprintf(f, "};\n\n");
}
break;
- }
+ }
case PROP_FLOAT: {
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
unsigned int i;
- if(prop->arraylength) {
- fprintf(f, "static float rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+ if(prop->arraydimension && prop->totarraylength) {
+ fprintf(f, "static float rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
- for(i=0; i<prop->arraylength; i++) {
+ for(i=0; i<prop->totarraylength; i++) {
if(fprop->defaultarray)
rna_float_print(f, fprop->defaultarray[i]);
else
rna_float_print(f, fprop->defaultvalue);
- if(i != prop->arraylength-1)
+ if(i != prop->totarraylength-1)
fprintf(f, ", ");
}
fprintf(f, "};\n\n");
}
break;
- }
+ }
default:
break;
}
@@ -1613,19 +1749,23 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, prop->identifier);
fprintf(f, ", %d, ", prop->flag);
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
- rna_print_c_string(f, prop->description); fprintf(f, ",\n");
- fprintf(f, "%d, ", prop->icon);
- fprintf(f, "\t%s, %s, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), prop->arraylength);
- fprintf(f, "\t%s, %d, %s},\n", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable));
+ 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, %d, %s,\n", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable));
+
+ if(prop->flag & PROP_RAW_ACCESS) rna_set_raw_offset(f, srna, prop);
+ else fprintf(f, "\t0, 0");
+ fprintf(f, "},\n");
switch(prop->type) {
case PROP_BOOLEAN: {
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %d, ", rna_function_string(bprop->get), rna_function_string(bprop->set), rna_function_string(bprop->getarray), rna_function_string(bprop->setarray), bprop->defaultvalue);
- if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+ if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_INT: {
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %s,\n\t", rna_function_string(iprop->get), rna_function_string(iprop->set), rna_function_string(iprop->getarray), rna_function_string(iprop->setarray), rna_function_string(iprop->range));
@@ -1635,10 +1775,10 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_int_print(f, iprop->hardmax); fprintf(f, ", ");
rna_int_print(f, iprop->step); fprintf(f, ", ");
rna_int_print(f, iprop->defaultvalue); fprintf(f, ", ");
- if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+ if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_FLOAT: {
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %s, ", rna_function_string(fprop->get), rna_function_string(fprop->set), rna_function_string(fprop->getarray), rna_function_string(fprop->setarray), rna_function_string(fprop->range));
@@ -1649,16 +1789,16 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_float_print(f, fprop->step); fprintf(f, ", ");
rna_int_print(f, (int)fprop->precision); fprintf(f, ", ");
rna_float_print(f, fprop->defaultvalue); fprintf(f, ", ");
- if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+ if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_STRING: {
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %d, ", rna_function_string(sprop->get), rna_function_string(sprop->length), rna_function_string(sprop->set), sprop->maxlength);
rna_print_c_string(f, sprop->defaultvalue); fprintf(f, "\n");
break;
- }
+ }
case PROP_ENUM: {
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, ", rna_function_string(eprop->get), rna_function_string(eprop->set), rna_function_string(eprop->itemf));
@@ -1668,14 +1808,14 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
fprintf(f, "NULL, ");
fprintf(f, "%d, %d\n", eprop->totitem, eprop->defaultvalue);
break;
- }
+ }
case PROP_POINTER: {
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, ", rna_function_string(pprop->get), rna_function_string(pprop->set), rna_function_string(pprop->typef));
if(pprop->type) fprintf(f, "&RNA_%s\n", (char*)pprop->type);
else fprintf(f, "NULL\n");
break;
- }
+ }
case PROP_COLLECTION: {
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
fprintf(f, "\t%s, %s, %s, %s, %s, %s, %s, ", rna_function_string(cprop->begin), rna_function_string(cprop->next), rna_function_string(cprop->end), rna_function_string(cprop->get), rna_function_string(cprop->length), rna_function_string(cprop->lookupint), rna_function_string(cprop->lookupstring));
@@ -1829,10 +1969,11 @@ RNAProcessItem PROCESS_ITEMS[]= {
{"rna_rna.c", NULL, RNA_def_rna},
{"rna_ID.c", NULL, RNA_def_ID},
{"rna_texture.c", NULL, RNA_def_texture},
- {"rna_action.c", NULL, RNA_def_action},
- {"rna_animation.c", NULL, RNA_def_animation},
+ {"rna_action.c", "rna_action_api.c", RNA_def_action},
+ {"rna_animation.c", "rna_animation_api.c", RNA_def_animation},
{"rna_actuator.c", NULL, RNA_def_actuator},
{"rna_armature.c", NULL, RNA_def_armature},
+ {"rna_boid.c", NULL, RNA_def_boid},
{"rna_brush.c", NULL, RNA_def_brush},
{"rna_camera.c", NULL, RNA_def_camera},
{"rna_cloth.c", NULL, RNA_def_cloth},
@@ -1843,36 +1984,40 @@ RNAProcessItem PROCESS_ITEMS[]= {
{"rna_curve.c", NULL, RNA_def_curve},
{"rna_fcurve.c", NULL, RNA_def_fcurve},
{"rna_fluidsim.c", NULL, RNA_def_fluidsim},
+ {"rna_gpencil.c", NULL, RNA_def_gpencil},
{"rna_group.c", NULL, RNA_def_group},
- {"rna_image.c", NULL, RNA_def_image},
+ {"rna_image.c", "rna_image_api.c", RNA_def_image},
{"rna_key.c", NULL, RNA_def_key},
{"rna_lamp.c", NULL, RNA_def_lamp},
{"rna_lattice.c", NULL, RNA_def_lattice},
{"rna_main.c", "rna_main_api.c", RNA_def_main},
- {"rna_material.c", NULL, RNA_def_material},
+ {"rna_material.c", "rna_material_api.c", RNA_def_material},
{"rna_mesh.c", "rna_mesh_api.c", RNA_def_mesh},
{"rna_meta.c", NULL, RNA_def_meta},
{"rna_modifier.c", NULL, RNA_def_modifier},
+ {"rna_nla.c", NULL, RNA_def_nla},
{"rna_nodetree.c", NULL, RNA_def_nodetree},
{"rna_object.c", "rna_object_api.c", RNA_def_object},
{"rna_object_force.c", NULL, RNA_def_object_force},
{"rna_packedfile.c", NULL, RNA_def_packedfile},
{"rna_particle.c", NULL, RNA_def_particle},
- {"rna_pose.c", NULL, RNA_def_pose},
+ {"rna_pose.c", "rna_pose_api.c", RNA_def_pose},
{"rna_property.c", NULL, RNA_def_gameproperty},
- {"rna_scene.c", NULL, RNA_def_scene},
+ {"rna_render.c", NULL, RNA_def_render},
+ {"rna_scene.c", "rna_scene_api.c", RNA_def_scene},
{"rna_screen.c", NULL, RNA_def_screen},
- {"rna_scriptlink.c", NULL, RNA_def_scriptlink},
+ {"rna_sculpt_paint.c", NULL, RNA_def_sculpt_paint},
{"rna_sensor.c", NULL, RNA_def_sensor},
{"rna_sequence.c", NULL, RNA_def_sequence},
+ {"rna_smoke.c", NULL, RNA_def_smoke},
{"rna_space.c", NULL, RNA_def_space},
+ {"rna_test.c", NULL, RNA_def_test},
{"rna_text.c", NULL, RNA_def_text},
{"rna_timeline.c", NULL, RNA_def_timeline_marker},
{"rna_sound.c", NULL, RNA_def_sound},
{"rna_ui.c", "rna_ui_api.c", RNA_def_ui},
{"rna_userdef.c", NULL, RNA_def_userdef},
{"rna_vfont.c", NULL, RNA_def_vfont},
- {"rna_vpaint.c", NULL, RNA_def_vpaint},
{"rna_wm.c", "rna_wm_api.c", RNA_def_wm},
{"rna_world.c", NULL, RNA_def_world},
{NULL, NULL}};
@@ -1890,6 +2035,7 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi
fprintf(f, "#include <float.h>\n");
fprintf(f, "#include <limits.h>\n");
fprintf(f, "#include <string.h>\n\n");
+ fprintf(f, "#include <stddef.h>\n\n");
fprintf(f, "#include \"DNA_ID.h\"\n");
@@ -2117,7 +2263,7 @@ static void rna_generate_header_cpp(BlenderRNA *brna, FILE *f)
fprintf(f, "#include \"RNA_blender.h\"\n");
fprintf(f, "#include \"RNA_types.h\"\n");
- fprintf(f, cpp_classes);
+ fprintf(f, "%s", cpp_classes);
fprintf(f, "/**************** Declarations ****************/\n\n");
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 7d8bab8bee8..f5c6063e892 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -65,9 +65,9 @@ short RNA_type_to_ID_code(StructRNA *type)
if(RNA_struct_is_a(type, &RNA_Brush)) return ID_BR;
if(RNA_struct_is_a(type, &RNA_Camera)) return ID_CA;
if(RNA_struct_is_a(type, &RNA_Curve)) return ID_CU;
+ if(RNA_struct_is_a(type, &RNA_GreasePencil)) return ID_GD;
if(RNA_struct_is_a(type, &RNA_Group)) return ID_GR;
if(RNA_struct_is_a(type, &RNA_Image)) return ID_IM;
- //if(RNA_struct_is_a(type, &RNA_Ipo)) return case ID_IP;
if(RNA_struct_is_a(type, &RNA_Key)) return ID_KE;
if(RNA_struct_is_a(type, &RNA_Lamp)) return ID_LA;
if(RNA_struct_is_a(type, &RNA_Library)) return ID_LI;
@@ -98,9 +98,9 @@ StructRNA *ID_code_to_RNA_type(short idcode)
case ID_BR: return &RNA_Brush;
case ID_CA: return &RNA_Camera;
case ID_CU: return &RNA_Curve;
+ case ID_GD: return &RNA_GreasePencil;
case ID_GR: return &RNA_Group;
case ID_IM: return &RNA_Image;
- //case ID_IP: return &RNA_Ipo;
case ID_KE: return &RNA_Key;
case ID_LA: return &RNA_Lamp;
case ID_LI: return &RNA_Library;
@@ -154,6 +154,30 @@ IDProperty *rna_IDPropertyGroup_idproperties(PointerRNA *ptr, int create)
return ptr->data;
}
+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)
+{
+ PointerRNA dummyptr;
+
+ /* create dummy pointer */
+ RNA_pointer_create(NULL, &RNA_IDPropertyGroup, NULL, &dummyptr);
+
+ /* validate the python class */
+ if(validate(&dummyptr, data, NULL) != 0)
+ return NULL;
+
+ return RNA_def_struct(&BLENDER_RNA, identifier, "IDPropertyGroup"); // XXX
+}
+
+StructRNA* rna_IDPropertyGroup_refine(PointerRNA *ptr)
+{
+ return ptr->type;
+}
+
#else
static void rna_def_ID_properties(BlenderRNA *brna)
@@ -212,6 +236,8 @@ static void rna_def_ID_properties(BlenderRNA *brna)
srna= RNA_def_struct(brna, "IDPropertyGroup", NULL);
RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties.");
RNA_def_struct_idproperties_func(srna, "rna_IDPropertyGroup_idproperties");
+ RNA_def_struct_register_funcs(srna, "rna_IDPropertyGroup_register", "rna_IDPropertyGroup_unregister");
+ RNA_def_struct_refine_func(srna, "rna_IDPropertyGroup_refine");
}
static void rna_def_ID(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 7defb0676c6..55893b42a92 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -209,7 +209,53 @@ static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name)
return NULL;
}
-static int rna_idproperty_verify_valid(PropertyRNA *prop, IDProperty *idprop)
+static int rna_ensure_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
+{
+ if(prop->magic == RNA_MAGIC) {
+ int arraylen[RNA_MAX_ARRAY_DIMENSION];
+ return (prop->getlength)? prop->getlength(ptr, arraylen): prop->totarraylength;
+ }
+ else {
+ IDProperty *idprop= (IDProperty*)prop;
+
+ if(idprop->type == IDP_ARRAY)
+ return idprop->len;
+ else
+ return 0;
+ }
+}
+
+static int rna_ensure_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
+{
+ if(prop->magic == RNA_MAGIC) {
+ return (prop->getlength || prop->totarraylength) ? 1:0;
+ }
+ else {
+ IDProperty *idprop= (IDProperty*)prop;
+
+ return idprop->type == IDP_ARRAY ? 1:0;
+ }
+}
+
+static void rna_ensure_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int length[])
+{
+ if(prop->magic == RNA_MAGIC) {
+ if(prop->getlength)
+ prop->getlength(ptr, length);
+ else
+ memcpy(length, prop->arraylength, prop->arraydimension*sizeof(int));
+ }
+ else {
+ IDProperty *idprop= (IDProperty*)prop;
+
+ if(idprop->type == IDP_ARRAY)
+ length[0]= idprop->len;
+ else
+ length[0]= 0;
+ }
+}
+
+static int rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDProperty *idprop)
{
/* this verifies if the idproperty actually matches the property
* description and otherwise removes it. this is to ensure that
@@ -222,7 +268,7 @@ static int rna_idproperty_verify_valid(PropertyRNA *prop, IDProperty *idprop)
return 0;
break;
case IDP_ARRAY:
- if(prop->arraylength != idprop->len)
+ if(rna_ensure_property_array_length(ptr, prop) != idprop->len)
return 0;
if(idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT)
@@ -283,7 +329,7 @@ IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
if((*prop)->flag & PROP_IDPROPERTY) {
IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
- if(idprop && !rna_idproperty_verify_valid(*prop, idprop)) {
+ if(idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) {
IDProperty *group= RNA_struct_idproperties(ptr, 0);
IDP_RemFromGroup(group, idprop);
@@ -310,7 +356,7 @@ IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
}
}
-PropertyRNA *rna_ensure_property(PropertyRNA *prop)
+static PropertyRNA *rna_ensure_property(PropertyRNA *prop)
{
/* the quick version if we don't need the idproperty */
@@ -327,7 +373,7 @@ PropertyRNA *rna_ensure_property(PropertyRNA *prop)
}
}
-const char *rna_ensure_property_identifier(PropertyRNA *prop)
+static const char *rna_ensure_property_identifier(PropertyRNA *prop)
{
if(prop->magic == RNA_MAGIC)
return prop->identifier;
@@ -335,7 +381,7 @@ const char *rna_ensure_property_identifier(PropertyRNA *prop)
return ((IDProperty*)prop)->name;
}
-const char *rna_ensure_property_name(PropertyRNA *prop)
+static const char *rna_ensure_property_name(PropertyRNA *prop)
{
if(prop->magic == RNA_MAGIC)
return prop->name;
@@ -343,20 +389,6 @@ const char *rna_ensure_property_name(PropertyRNA *prop)
return ((IDProperty*)prop)->name;
}
-int rna_ensure_property_array_length(PropertyRNA *prop)
-{
- if(prop->magic == RNA_MAGIC)
- return prop->arraylength;
- else {
- IDProperty *idprop= (IDProperty*)prop;
-
- if(idprop->type == IDP_ARRAY)
- return idprop->len;
- else
- return 0;
- }
-}
-
/* Structs */
const char *RNA_struct_identifier(StructRNA *type)
@@ -392,6 +424,11 @@ PropertyRNA *RNA_struct_iterator_property(StructRNA *type)
return type->iteratorproperty;
}
+StructRNA *RNA_struct_base(StructRNA *type)
+{
+ return type->base;
+}
+
int RNA_struct_is_ID(StructRNA *type)
{
return (type->flag & STRUCT_ID) != 0;
@@ -534,14 +571,63 @@ PropertySubType RNA_property_subtype(PropertyRNA *prop)
return rna_ensure_property(prop)->subtype;
}
+PropertyUnit RNA_property_unit(PropertyRNA *prop)
+{
+ return RNA_SUBTYPE_UNIT(rna_ensure_property(prop)->subtype);
+}
+
int RNA_property_flag(PropertyRNA *prop)
{
return rna_ensure_property(prop)->flag;
}
-int RNA_property_array_length(PropertyRNA *prop)
+int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
{
- return rna_ensure_property_array_length(prop);
+ return rna_ensure_property_array_length(ptr, prop);
+}
+
+int RNA_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
+{
+ return rna_ensure_property_array_check(ptr, prop);
+}
+
+/* used by BPY to make an array from the python object */
+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);
+
+ return rprop->arraydimension;
+}
+
+/* Return the size of Nth dimension. */
+int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dim)
+{
+ int len[RNA_MAX_ARRAY_DIMENSION];
+
+ rna_ensure_property_multi_array_length(ptr, prop, len);
+
+ return len[dim];
+}
+
+char RNA_property_array_item_char(PropertyRNA *prop, int index)
+{
+ const char *vectoritem= "XYZW";
+ const char *quatitem= "WXYZ";
+ const char *coloritem= "RGBA";
+ PropertySubType subtype= rna_ensure_property(prop)->subtype;
+
+ /* get string to use for array index */
+ if ((index < 4) && (subtype == PROP_QUATERNION))
+ return quatitem[index];
+ else if((index < 4) && ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
+ return vectoritem[index];
+ else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_RGB))
+ return coloritem[index];
+ else
+ return '\0';
}
void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
@@ -635,15 +721,21 @@ StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
return &RNA_UnknownType;
}
-void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **item, int *totitem)
+void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free)
{
EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
- int tot;
+
+ *free= 0;
if(eprop->itemf) {
- *item= eprop->itemf(ptr);
+ int tot= 0;
+ *item= eprop->itemf(C, ptr, free);
+
if(totitem) {
- for(tot=0; (*item)[tot].identifier; tot++);
+ if(*item) {
+ for( ; (*item)[tot].identifier; tot++);
+ }
+
*totitem= tot;
}
}
@@ -654,26 +746,30 @@ void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPrope
}
}
-int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
+int RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
{
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
+ int free;
- RNA_property_enum_items(ptr, prop, &item, NULL);
+ RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
for(; item->identifier; item++) {
- if(strcmp(item->identifier, identifier)==0) {
+ if(item->identifier[0] && strcmp(item->identifier, identifier)==0) {
*value = item->value;
return 1;
}
}
+ if(free)
+ MEM_freeN(item);
+
return 0;
}
-int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **identifier)
+int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier)
{
for (; item->identifier; item++) {
- if(item->value==value) {
+ if(item->identifier[0] && item->value==value) {
*identifier = item->identifier;
return 1;
}
@@ -681,10 +777,10 @@ int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const cha
return 0;
}
-int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **name)
+int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name)
{
for (; item->identifier; item++) {
- if(item->value==value) {
+ if(item->identifier[0] && item->value==value) {
*name = item->name;
return 1;
}
@@ -692,12 +788,20 @@ int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **na
return 0;
}
-int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
+int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
{
- const EnumPropertyItem *item= NULL;
+ EnumPropertyItem *item= NULL;
+ int result, free;
- RNA_property_enum_items(ptr, prop, &item, NULL);
- return RNA_enum_identifier(item, value, identifier);
+ RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+ if(item) {
+ result= RNA_enum_identifier(item, value, identifier);
+ if(free)
+ MEM_freeN(item);
+
+ return result;
+ }
+ return 0;
}
const char *RNA_property_ui_name(PropertyRNA *prop)
@@ -729,7 +833,7 @@ int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
id= ptr->id.data;
- return (flag & PROP_EDITABLE) && (!id || !id->lib);
+ return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION));
}
int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
@@ -808,27 +912,40 @@ void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *val
IDProperty *idprop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
values[0]= RNA_property_boolean_get(ptr, prop);
else
memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
values[0]= RNA_property_boolean_get(ptr, prop);
else if(bprop->getarray)
bprop->getarray(ptr, values);
else if(bprop->defaultarray)
- memcpy(values, bprop->defaultarray, sizeof(int)*prop->arraylength);
+ memcpy(values, bprop->defaultarray, sizeof(int)*prop->totarraylength);
else
- memset(values, 0, sizeof(int)*prop->arraylength);
+ memset(values, 0, sizeof(int)*prop->totarraylength);
}
int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
{
- int tmp[RNA_MAX_ARRAY];
+ int tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
+
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_boolean_get_array(ptr, prop, tmp);
+ return tmp[index];
+ }
+ else {
+ int *tmparray, value;
- RNA_property_boolean_get_array(ptr, prop, tmp);
- return tmp[index];
+ tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
+ RNA_property_boolean_get_array(ptr, prop, tmparray);
+ value= tmparray[index];
+ MEM_freeN(tmparray);
+
+ return value;
+ }
}
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
@@ -837,12 +954,12 @@ void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const in
IDProperty *idprop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
IDP_Int(idprop)= values[0];
else
memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
RNA_property_boolean_set(ptr, prop, values[0]);
else if(bprop->setarray)
bprop->setarray(ptr, values);
@@ -850,7 +967,7 @@ void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const in
IDPropertyTemplate val = {0};
IDProperty *group;
- val.array.len= prop->arraylength;
+ val.array.len= prop->totarraylength;
val.array.type= IDP_INT;
group= RNA_struct_idproperties(ptr, 1);
@@ -864,11 +981,23 @@ void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const in
void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
{
- int tmp[RNA_MAX_ARRAY];
+ int tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
- RNA_property_boolean_get_array(ptr, prop, tmp);
- tmp[index]= value;
- RNA_property_boolean_set_array(ptr, prop, tmp);
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_boolean_get_array(ptr, prop, tmp);
+ tmp[index]= value;
+ RNA_property_boolean_set_array(ptr, prop, tmp);
+ }
+ else {
+ int *tmparray;
+
+ tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
+ RNA_property_boolean_get_array(ptr, prop, tmparray);
+ tmparray[index]= value;
+ RNA_property_boolean_set_array(ptr, prop, tmparray);
+ MEM_freeN(tmparray);
+ }
}
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
@@ -911,27 +1040,40 @@ void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
IDProperty *idprop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
values[0]= RNA_property_int_get(ptr, prop);
else
memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
values[0]= RNA_property_int_get(ptr, prop);
else if(iprop->getarray)
iprop->getarray(ptr, values);
else if(iprop->defaultarray)
- memcpy(values, iprop->defaultarray, sizeof(int)*prop->arraylength);
+ memcpy(values, iprop->defaultarray, sizeof(int)*prop->totarraylength);
else
- memset(values, 0, sizeof(int)*prop->arraylength);
+ memset(values, 0, sizeof(int)*prop->totarraylength);
}
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
{
- int tmp[RNA_MAX_ARRAY];
+ int tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
+
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_int_get_array(ptr, prop, tmp);
+ return tmp[index];
+ }
+ else {
+ int *tmparray, value;
- RNA_property_int_get_array(ptr, prop, tmp);
- return tmp[index];
+ tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
+ RNA_property_int_get_array(ptr, prop, tmparray);
+ value= tmparray[index];
+ MEM_freeN(tmparray);
+
+ return value;
+ }
}
void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
@@ -940,12 +1082,12 @@ void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *v
IDProperty *idprop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
IDP_Int(idprop)= values[0];
else
memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
RNA_property_int_set(ptr, prop, values[0]);
else if(iprop->setarray)
iprop->setarray(ptr, values);
@@ -953,7 +1095,7 @@ void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *v
IDPropertyTemplate val = {0};
IDProperty *group;
- val.array.len= prop->arraylength;
+ val.array.len= prop->totarraylength;
val.array.type= IDP_INT;
group= RNA_struct_idproperties(ptr, 1);
@@ -967,11 +1109,23 @@ void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *v
void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
{
- int tmp[RNA_MAX_ARRAY];
+ int tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
- RNA_property_int_get_array(ptr, prop, tmp);
- tmp[index]= value;
- RNA_property_int_set_array(ptr, prop, tmp);
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_int_get_array(ptr, prop, tmp);
+ tmp[index]= value;
+ RNA_property_int_set_array(ptr, prop, tmp);
+ }
+ else {
+ int *tmparray;
+
+ tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
+ RNA_property_int_get_array(ptr, prop, tmparray);
+ tmparray[index]= value;
+ RNA_property_int_set_array(ptr, prop, tmparray);
+ MEM_freeN(tmparray);
+ }
}
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
@@ -1024,7 +1178,7 @@ void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *val
int i;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
values[0]= RNA_property_float_get(ptr, prop);
else if(idprop->subtype == IDP_FLOAT) {
memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
@@ -1034,22 +1188,36 @@ void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *val
values[i]= (float)(((double*)IDP_Array(idprop))[i]);
}
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
values[0]= RNA_property_float_get(ptr, prop);
else if(fprop->getarray)
fprop->getarray(ptr, values);
else if(fprop->defaultarray)
- memcpy(values, fprop->defaultarray, sizeof(float)*prop->arraylength);
+ memcpy(values, fprop->defaultarray, sizeof(float)*prop->totarraylength);
else
- memset(values, 0, sizeof(float)*prop->arraylength);
+ memset(values, 0, sizeof(float)*prop->totarraylength);
}
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
{
- float tmp[RNA_MAX_ARRAY];
+ float tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
+
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_float_get_array(ptr, prop, tmp);
+ return tmp[index];
+ }
+ else {
+ float *tmparray, value;
+
+ tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
+ RNA_property_float_get_array(ptr, prop, tmparray);
+ value= tmparray[index];
+ MEM_freeN(tmparray);
+
+ return value;
+ }
- RNA_property_float_get_array(ptr, prop, tmp);
- return tmp[index];
}
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
@@ -1059,7 +1227,7 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
int i;
if((idprop=rna_idproperty_check(&prop, ptr))) {
- if(prop->arraylength == 0)
+ if(prop->arraydimension == 0)
IDP_Double(idprop)= values[0];
else if(idprop->subtype == IDP_FLOAT) {
memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
@@ -1069,7 +1237,7 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
((double*)IDP_Array(idprop))[i]= values[i];
}
}
- else if(prop->arraylength == 0)
+ else if(prop->arraydimension == 0)
RNA_property_float_set(ptr, prop, values[0]);
else if(fprop->setarray) {
fprop->setarray(ptr, values);
@@ -1078,7 +1246,7 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
IDPropertyTemplate val = {0};
IDProperty *group;
- val.array.len= prop->arraylength;
+ val.array.len= prop->totarraylength;
val.array.type= IDP_FLOAT;
group= RNA_struct_idproperties(ptr, 1);
@@ -1092,11 +1260,23 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
{
- float tmp[RNA_MAX_ARRAY];
+ float tmp[RNA_MAX_ARRAY_LENGTH];
+ int len= rna_ensure_property_array_length(ptr, prop);
- RNA_property_float_get_array(ptr, prop, tmp);
- tmp[index]= value;
- RNA_property_float_set_array(ptr, prop, tmp);
+ if(len <= RNA_MAX_ARRAY_LENGTH) {
+ RNA_property_float_get_array(ptr, prop, tmp);
+ tmp[index]= value;
+ RNA_property_float_set_array(ptr, prop, tmp);
+ }
+ else {
+ float *tmparray;
+
+ tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
+ RNA_property_float_get_array(ptr, prop, tmparray);
+ tmparray[index]= value;
+ RNA_property_float_set_array(ptr, prop, tmparray);
+ MEM_freeN(tmparray);
+ }
}
void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
@@ -1213,8 +1393,15 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
else if(pprop->get) {
return pprop->get(ptr);
}
+ else if(prop->flag & PROP_IDPROPERTY) {
+ /* XXX temporary hack to add it automatically, reading should
+ never do any write ops, to ensure thread safety etc .. */
+ RNA_property_pointer_add(ptr, prop);
+ return RNA_property_pointer_get(ptr, prop);
+ }
else {
PointerRNA result;
+
memset(&result, 0, sizeof(result));
return result;
}
@@ -1222,10 +1409,17 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
{
- PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ IDProperty *idprop;
- if(pprop->set)
- pprop->set(ptr, ptr_value);
+ if((idprop=rna_idproperty_check(&prop, ptr))) {
+ /* not supported */
+ }
+ else {
+ PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+
+ if(pprop->set && !((prop->flag & PROP_NEVER_NULL) && ptr_value.data == NULL))
+ pprop->set(ptr, ptr_value);
+ }
}
void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
@@ -1286,9 +1480,9 @@ void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, Collectio
iter->prop= prop;
if(idprop)
- rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, NULL);
+ rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL);
else
- rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, NULL);
+ rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL);
if(iter->valid)
rna_property_collection_get_idp(iter);
@@ -1352,7 +1546,7 @@ int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
{
IDProperty *idprop;
- //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDPropertyTemplate val = {0};
@@ -1378,17 +1572,16 @@ void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA
MEM_freeN(item);
}
}
-#if 0
else if(cprop->add){
if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
- ParameterList *params= RNA_parameter_list_create(ptr, cprop->add);
- RNA_function_call(NULL, NULL, ptr, cprop->add, params);
- RNA_parameter_list_free(params);
+ ParameterList params;
+ RNA_parameter_list_create(&params, ptr, cprop->add);
+ RNA_function_call(NULL, NULL, ptr, cprop->add, &params);
+ RNA_parameter_list_free(&params);
}
}
-#endif
- else
- printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);
+ /*else
+ printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);*/
if(r_ptr) {
if(idprop) {
@@ -1403,10 +1596,10 @@ void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA
}
}
-void RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
+int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
{
IDProperty *idprop;
- //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDProperty tmp, *array;
@@ -1425,19 +1618,25 @@ void RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
IDP_ResizeIDPArray(idprop, len-1);
}
+
+ return 1;
}
- else if(prop->flag & PROP_IDPROPERTY);
-#if 0
+ else if(prop->flag & PROP_IDPROPERTY)
+ return 1;
else if(cprop->remove){
if(!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
- ParameterList *params= RNA_parameter_list_create(ptr, cprop->remove);
- RNA_function_call(NULL, NULL, ptr, cprop->remove, params);
- RNA_parameter_list_free(params);
+ ParameterList params;
+ RNA_parameter_list_create(&params, ptr, cprop->remove);
+ RNA_function_call(NULL, NULL, ptr, cprop->remove, &params);
+ RNA_parameter_list_free(&params);
}
+
+ return 0;
}
-#endif
- else
- printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
+ /*else
+ printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);*/
+
+ return 0;
}
void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
@@ -1522,6 +1721,323 @@ int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, co
}
}
+int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array)
+{
+ CollectionPropertyIterator iter;
+ ArrayIterator *internal;
+ char *arrayp;
+
+ if(!(prop->flag & PROP_RAW_ARRAY) || !(itemprop->flag & PROP_RAW_ACCESS))
+ return 0;
+
+ RNA_property_collection_begin(ptr, prop, &iter);
+
+ if(iter.valid) {
+ /* get data from array iterator and item property */
+ internal= iter.internal;
+ arrayp= (iter.valid)? iter.ptr.data: NULL;
+
+ if(internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) {
+ /* we might skip some items, so it's not a proper array */
+ RNA_property_collection_end(&iter);
+ return 0;
+ }
+
+ array->array= arrayp + itemprop->rawoffset;
+ array->stride= internal->itemsize;
+ array->len= ((char*)internal->endptr - arrayp)/internal->itemsize;
+ array->type= itemprop->rawtype;
+ }
+ else
+ memset(array, 0, sizeof(RawArray));
+
+ RNA_property_collection_end(&iter);
+
+ return 1;
+}
+
+#define RAW_GET(dtype, var, raw, a) \
+{ \
+ switch(raw.type) { \
+ case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
+ case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
+ case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
+ case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
+ case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
+ default: var = (dtype)0; \
+ } \
+}
+
+#define RAW_SET(dtype, raw, a, var) \
+{ \
+ switch(raw.type) { \
+ case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
+ case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
+ case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
+ case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
+ case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
+ } \
+}
+
+int RNA_raw_type_sizeof(RawPropertyType type)
+{
+ switch(type) {
+ case PROP_RAW_CHAR: return sizeof(char);
+ case PROP_RAW_SHORT: return sizeof(short);
+ case PROP_RAW_INT: return sizeof(int);
+ case PROP_RAW_FLOAT: return sizeof(float);
+ case PROP_RAW_DOUBLE: return sizeof(double);
+ default: return 0;
+ }
+}
+
+static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
+{
+ StructRNA *ptype;
+ PointerRNA itemptr;
+ PropertyRNA *itemprop, *iprop;
+ PropertyType itemtype=0;
+ RawArray in;
+ int itemlen= 0;
+
+ /* initialize in array, stride assumed 0 in following code */
+ in.array= inarray;
+ in.type= intype;
+ in.len= inlen;
+ in.stride= 0;
+
+ ptype= RNA_property_pointer_type(ptr, prop);
+
+ /* try to get item property pointer */
+ RNA_pointer_create(NULL, ptype, NULL, &itemptr);
+ itemprop= RNA_struct_find_property(&itemptr, propname);
+
+ if(itemprop) {
+ /* we have item property pointer */
+ RawArray out;
+
+ /* check type */
+ itemtype= RNA_property_type(itemprop);
+
+ if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
+ BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
+ return 0;
+ }
+
+ /* check item array */
+ itemlen= RNA_property_array_length(&itemptr, itemprop);
+
+ /* try to access as raw array */
+ if(RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) {
+ if(in.len != itemlen*out.len) {
+ BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d).", out.len*itemlen, in.len);
+ return 0;
+ }
+
+ /* matching raw types */
+ if(out.type == in.type) {
+ void *inp= in.array;
+ void *outp= out.array;
+ int a, size;
+
+ itemlen= (itemlen == 0)? 1: itemlen;
+ size= RNA_raw_type_sizeof(out.type) * itemlen;
+
+ for(a=0; a<out.len; a++) {
+ if(set) memcpy(outp, inp, size);
+ else memcpy(inp, outp, size);
+
+ inp= (char*)inp + size;
+ outp= (char*)outp + out.stride;
+ }
+
+ return 1;
+ }
+
+ /* could also be faster with non-matching types,
+ * for now we just do slower loop .. */
+ }
+ }
+
+ {
+ void *tmparray= NULL;
+ int tmplen= 0;
+ int err= 0, j, a= 0;
+
+ /* no item property pointer, can still be id property, or
+ * property of a type derived from the collection pointer type */
+ RNA_PROP_BEGIN(ptr, itemptr, prop) {
+ if(itemptr.data) {
+ if(itemprop) {
+ /* we got the property already */
+ iprop= itemprop;
+ }
+ else {
+ /* not yet, look it up and verify if it is valid */
+ iprop= RNA_struct_find_property(&itemptr, propname);
+
+ if(iprop) {
+ itemlen= RNA_property_array_length(&itemptr, iprop);
+ itemtype= RNA_property_type(iprop);
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "Property named %s not found.", propname);
+ err= 1;
+ break;
+ }
+
+ if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
+ BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
+ err= 1;
+ break;
+ }
+ }
+
+ /* editable check */
+ if(RNA_property_editable(&itemptr, iprop)) {
+ if(a+itemlen > in.len) {
+ BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more).", in.len);
+ err= 1;
+ break;
+ }
+
+ if(itemlen == 0) {
+ /* handle conversions */
+ if(set) {
+ switch(itemtype) {
+ case PROP_BOOLEAN: {
+ int b;
+ RAW_GET(int, b, in, a);
+ RNA_property_boolean_set(&itemptr, iprop, b);
+ break;
+ }
+ case PROP_INT: {
+ int i;
+ RAW_GET(int, i, in, a);
+ RNA_property_int_set(&itemptr, iprop, i);
+ break;
+ }
+ case PROP_FLOAT: {
+ float f;
+ RAW_GET(float, f, in, a);
+ RNA_property_float_set(&itemptr, iprop, f);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else {
+ switch(itemtype) {
+ case PROP_BOOLEAN: {
+ int b= RNA_property_boolean_get(&itemptr, iprop);
+ RAW_SET(int, in, a, b);
+ break;
+ }
+ case PROP_INT: {
+ int i= RNA_property_int_get(&itemptr, iprop);
+ RAW_SET(int, in, a, i);
+ break;
+ }
+ case PROP_FLOAT: {
+ float f= RNA_property_float_get(&itemptr, iprop);
+ RAW_SET(float, in, a, f);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ a++;
+ }
+ else {
+ /* allocate temporary array if needed */
+ if(tmparray && tmplen != itemlen) {
+ MEM_freeN(tmparray);
+ tmparray= NULL;
+ }
+ if(!tmparray) {
+ tmparray= MEM_callocN(sizeof(float)*itemlen, "RNA tmparray\n");
+ tmplen= itemlen;
+ }
+
+ /* handle conversions */
+ if(set) {
+ switch(itemtype) {
+ case PROP_BOOLEAN: {
+ for(j=0; j<itemlen; j++, a++)
+ RAW_GET(int, ((int*)tmparray)[j], in, a);
+ RNA_property_boolean_set_array(&itemptr, iprop, tmparray);
+ break;
+ }
+ case PROP_INT: {
+ for(j=0; j<itemlen; j++, a++)
+ RAW_GET(int, ((int*)tmparray)[j], in, a);
+ RNA_property_int_set_array(&itemptr, iprop, tmparray);
+ break;
+ }
+ case PROP_FLOAT: {
+ for(j=0; j<itemlen; j++, a++)
+ RAW_GET(float, ((float*)tmparray)[j], in, a);
+ RNA_property_float_set_array(&itemptr, iprop, tmparray);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else {
+ switch(itemtype) {
+ case PROP_BOOLEAN: {
+ RNA_property_boolean_get_array(&itemptr, iprop, tmparray);
+ for(j=0; j<itemlen; j++, a++)
+ RAW_SET(int, in, a, ((int*)tmparray)[j]);
+ break;
+ }
+ case PROP_INT: {
+ RNA_property_int_get_array(&itemptr, iprop, tmparray);
+ for(j=0; j<itemlen; j++, a++)
+ RAW_SET(int, in, a, ((int*)tmparray)[j]);
+ break;
+ }
+ case PROP_FLOAT: {
+ RNA_property_float_get_array(&itemptr, iprop, tmparray);
+ for(j=0; j<itemlen; j++, a++)
+ RAW_SET(float, in, a, ((float*)tmparray)[j]);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ RNA_PROP_END;
+
+ if(tmparray)
+ MEM_freeN(tmparray);
+
+ return !err;
+ }
+}
+
+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)
+{
+ 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)
+{
+ return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
+}
+
/* Standard iterator functions */
void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
@@ -1568,7 +2084,7 @@ void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
iter->internal= NULL;
}
-void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, IteratorSkipFunc skip)
+void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip)
{
ArrayIterator *internal;
@@ -1577,6 +2093,7 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
internal->ptr= ptr;
+ internal->free_ptr= free_ptr ? ptr:NULL;
internal->endptr= ((char*)ptr)+length*itemsize;
internal->itemsize= itemsize;
internal->skip= skip;
@@ -1621,6 +2138,12 @@ void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
void rna_iterator_array_end(CollectionPropertyIterator *iter)
{
+ ArrayIterator *internal= iter->internal;
+
+ if(internal->free_ptr) {
+ MEM_freeN(internal->free_ptr);
+ internal->free_ptr= NULL;
+ }
MEM_freeN(iter->internal);
iter->internal= NULL;
}
@@ -1864,12 +2387,11 @@ char *RNA_path_back(const char *path)
return result;
}
-char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
+char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
{
- char *ptrpath=NULL, *path;
- const char *propname;
+ char *ptrpath=NULL;
- if(!ptr->id.data || !ptr->data || !prop)
+ if(!ptr->id.data || !ptr->data)
return NULL;
if(!RNA_struct_is_ID(ptr->type)) {
@@ -1895,6 +2417,20 @@ char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
else
return NULL;
}
+
+ return ptrpath;
+}
+
+char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
+{
+ const char *propname;
+ char *ptrpath, *path;
+
+ if(!ptr->id.data || !ptr->data || !prop)
+ return NULL;
+
+ /* path from ID to the struct holding this property */
+ ptrpath= RNA_path_from_ID_to_struct(ptr);
propname= RNA_property_identifier(prop);
@@ -2062,18 +2598,22 @@ void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
}
-int RNA_enum_is_equal(PointerRNA *ptr, const char *name, const char *enumname)
+int RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const char *enumname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, name);
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
+ int free;
if(prop) {
- RNA_property_enum_items(ptr, prop, &item, NULL);
+ RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
for(; item->identifier; item++)
if(strcmp(item->identifier, enumname) == 0)
return (item->value == RNA_property_enum_get(ptr, prop));
+ if(free)
+ MEM_freeN(item);
+
printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
return 0;
}
@@ -2083,7 +2623,7 @@ int RNA_enum_is_equal(PointerRNA *ptr, const char *name, const char *enumname)
}
}
-int RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *value)
+int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value)
{
for( ; item->identifier; item++) {
if(strcmp(item->identifier, identifier)==0) {
@@ -2095,7 +2635,7 @@ int RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier,
return 0;
}
-int RNA_enum_id_from_value(const EnumPropertyItem *item, int value, const char **identifier)
+int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier)
{
for( ; item->identifier; item++) {
if(item->value==value) {
@@ -2172,6 +2712,18 @@ PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
}
}
+void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value)
+{
+ PropertyRNA *prop= RNA_struct_find_property(ptr, name);
+
+ if(prop) {
+ RNA_property_pointer_set(ptr, prop, ptr_value);
+ }
+ else {
+ printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
+ }
+}
+
void RNA_pointer_add(PointerRNA *ptr, const char *name)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, name);
@@ -2233,7 +2785,7 @@ int RNA_property_is_set(PointerRNA *ptr, const char *name)
return (rna_idproperty_find(ptr, name) != NULL);
}
else {
- printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
+ // printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
return 0;
}
}
@@ -2260,7 +2812,7 @@ char *RNA_pointer_as_string(PointerRNA *ptr)
BLI_dynstr_append(dynstr, ", ");
first_time= 0;
- cstring = RNA_property_as_string(ptr, prop);
+ cstring = RNA_property_as_string(NULL, ptr, prop);
BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
MEM_freeN(cstring);
}
@@ -2274,10 +2826,10 @@ char *RNA_pointer_as_string(PointerRNA *ptr)
return cstring;
}
-char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
+char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
{
int type = RNA_property_type(prop);
- int len = RNA_property_array_length(prop);
+ int len = RNA_property_array_length(ptr, prop);
int i;
DynStr *dynstr= BLI_dynstr_new();
@@ -2295,6 +2847,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
}
+ if(len==1)
+ BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;
@@ -2307,6 +2861,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
}
+ if(len==1)
+ BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;
@@ -2319,6 +2875,8 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
for(i=0; i<len; i++) {
BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
}
+ if(len==1)
+ BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
BLI_dynstr_append(dynstr, ")");
}
break;
@@ -2337,7 +2895,7 @@ char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
const char *identifier;
int val = RNA_property_enum_get(ptr, prop);
- if(RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
+ if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
BLI_dynstr_appendf(dynstr, "'%s'", identifier);
}
else {
@@ -2437,20 +2995,57 @@ const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
/* Utility */
-ParameterList *RNA_parameter_list_create(PointerRNA *ptr, FunctionRNA *func)
+ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func)
{
- ParameterList *parms;
PropertyRNA *parm;
- int tot;
-
- parms= MEM_callocN(sizeof(ParameterList), "ParameterList");
+ void *data;
+ int tot= 0, size;
- parm= func->cont.properties.first;
- for(tot= 0; parm; parm= parm->next)
+ /* allocate data */
+ for(parm= func->cont.properties.first; parm; parm= parm->next)
tot+= rna_parameter_size(parm);
parms->data= MEM_callocN(tot, "RNA_parameter_list_create");
parms->func= func;
+ parms->tot= tot;
+
+ /* set default values */
+ data= parms->data;
+
+ for(parm= func->cont.properties.first; parm; parm= parm->next) {
+ size= rna_parameter_size(parm);
+
+ if(!(parm->flag & PROP_REQUIRED)) {
+ switch(parm->type) {
+ case PROP_BOOLEAN:
+ if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
+ else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
+ break;
+ case PROP_INT:
+ if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
+ else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
+ break;
+ case PROP_FLOAT:
+ if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
+ else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
+ break;
+ case PROP_ENUM:
+ memcpy(data, &((EnumPropertyRNA*)parm)->defaultvalue, size);
+ break;
+ case PROP_STRING: {
+ const char *defvalue= ((StringPropertyRNA*)parm)->defaultvalue;
+ if(defvalue && defvalue[0])
+ memcpy(data, &defvalue, size);
+ break;
+ }
+ case PROP_POINTER:
+ case PROP_COLLECTION:
+ break;
+ }
+ }
+
+ data= ((char*)data) + size;
+ }
return parms;
}
@@ -2464,6 +3059,12 @@ void RNA_parameter_list_free(ParameterList *parms)
for(tot= 0; parm; parm= parm->next) {
if(parm->type == PROP_COLLECTION)
BLI_freelistN((ListBase*)((char*)parms->data+tot));
+ else if (parm->flag & PROP_DYNAMIC) {
+ /* for dynamic arrays and strings, data is a pointer to an array */
+ char *array= *(char**)((char*)parms->data+tot);
+ if(array)
+ MEM_freeN(array);
+ }
tot+= rna_parameter_size(parm);
}
@@ -2472,8 +3073,11 @@ void RNA_parameter_list_free(ParameterList *parms)
parms->data= NULL;
parms->func= NULL;
+}
- MEM_freeN(parms);
+int RNA_parameter_list_size(ParameterList *parms)
+{
+ return parms->tot;
}
void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
@@ -2733,23 +3337,46 @@ static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, Prop
if(prop->flag & PROP_RNAPTR) {
*((PointerRNA*)dest)= *((PointerRNA*)src);
+ break;
+ }
+
+ if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
+ fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
+ return -1;
}
- else if (ptype!=srna) {
- if (!RNA_struct_is_a(srna, ptype)) {
- fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(ptype));
- return -1;
- }
-
- *((void**)dest)= *((void**)src);
- }
+
+ *((void**)dest)= *((void**)src);
break;
}
case PROP_COLLECTION:
{
- /* XXX collections are not supported yet */
- fprintf(stderr, "%s.%s: for parameter %s, collections are not supported yet\n", tid, fid, pid);
- return -1;
+ StructRNA *ptype;
+ ListBase *lb, *clb;
+ Link *link;
+ CollectionPointerLink *clink;
+
+ if (ftype!='C') {
+ fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection was expected\n", tid, fid, pid);
+ return -1;
+ }
+
+ lb= (ListBase *)src;
+ clb= (ListBase *)dest;
+ ptype= RNA_property_pointer_type(ptr, prop);
+
+ if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
+ fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection of objects of type %s was expected, passed a collection of objects of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
+ return -1;
+ }
+
+ for (link= lb->first; link; link= link->next) {
+ clink= MEM_callocN(sizeof(CollectionPointerLink), "CCollectionPointerLink");
+ RNA_pointer_create(NULL, srna, link, &clink->ptr);
+ BLI_addtail(clb, clink);
+ }
+
+ break;
}
default:
{
@@ -2768,7 +3395,7 @@ static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, Prop
int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args)
{
PointerRNA funcptr;
- ParameterList *parms;
+ ParameterList parms;
ParameterIterator iter;
PropertyRNA *pret, *parm;
PropertyType type;
@@ -2784,8 +3411,8 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
pret= RNA_function_return(func);
flen= strlen(format);
- parms= RNA_parameter_list_create(ptr, func);
- RNA_parameter_list_begin(parms, &iter);
+ RNA_parameter_list_create(&parms, ptr, func);
+ RNA_parameter_list_begin(&parms, &iter);
for(i= 0, ofs= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
parm= iter.parm;
@@ -2810,7 +3437,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
type= RNA_property_type(parm);
ftype= format[ofs++];
- len= RNA_property_array_length(parm);
+ len= RNA_property_array_length(&funcptr, parm);
alen= rna_function_format_array_length(format, ofs, flen);
if (len!=alen) {
@@ -2847,6 +3474,13 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, srna, tid, fid, pid);
break;
}
+ case PROP_COLLECTION:
+ {
+ StructRNA *srna= va_arg(args, StructRNA*);
+ ListBase *arg= va_arg(args, ListBase*);
+ err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, srna, tid, fid, pid);
+ break;
+ }
default:
{
/* handle errors */
@@ -2860,7 +3494,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
}
if (err==0)
- err= RNA_function_call(C, reports, ptr, func, parms);
+ err= RNA_function_call(C, reports, ptr, func, &parms);
/* XXX throw error when more parameters than those needed are passed or leave silent? */
if (err==0 && pret && ofs<flen && format[ofs++]=='R') {
@@ -2868,7 +3502,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
type= RNA_property_type(parm);
ftype= format[ofs++];
- len= RNA_property_array_length(parm);
+ len= RNA_property_array_length(&funcptr, parm);
alen= rna_function_format_array_length(format, ofs, flen);
if (len!=alen) {
@@ -2904,6 +3538,13 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid);
break;
}
+ case PROP_COLLECTION:
+ {
+ StructRNA *srna= va_arg(args, StructRNA*);
+ ListBase **arg= va_arg(args, ListBase**);
+ err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid);
+ break;
+ }
default:
{
/* handle errors */
@@ -2915,7 +3556,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
}
RNA_parameter_list_end(&iter);
- RNA_parameter_list_free(parms);
+ RNA_parameter_list_free(&parms);
return err;
}
@@ -2932,3 +3573,4 @@ int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, Pointer
return 0;
}
+
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 3639d6d3fff..eaa11b4ad38 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -38,19 +38,19 @@
#else
-void rna_def_action_group(BlenderRNA *brna)
+static void rna_def_action_group(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
+
srna= RNA_def_struct(brna, "ActionGroup", NULL);
RNA_def_struct_sdna(srna, "bActionGroup");
RNA_def_struct_ui_text(srna, "Action Group", "Groups of F-Curves.");
-
+
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
-
+
/* dna warns not to treat the Action Channel listbase in the Action Group struct like a
normal listbase. I'll leave this here but comment out, for Joshua to review. He can
probably shed some more light on why this is */
@@ -58,25 +58,25 @@ void rna_def_action_group(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "channels", NULL);
RNA_def_property_struct_type(prop, "FCurve");
RNA_def_property_ui_text(prop, "Channels", "F-Curves in this group.");*/
-
+
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_SELECTED);
RNA_def_property_ui_text(prop, "Selected", "Action Group is selected.");
-
+
prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_PROTECTED);
RNA_def_property_ui_text(prop, "Locked", "Action Group is locked.");
-
+
prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_EXPANDED);
RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded.");
-
+
prop= RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "customCol");
RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set.");
}
-void rna_def_action(BlenderRNA *brna)
+static void rna_def_action(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -85,21 +85,23 @@ void rna_def_action(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bAction");
RNA_def_struct_ui_text(srna, "Action", "A collection of F-Curves for animation.");
RNA_def_struct_ui_icon(srna, ICON_ACTION);
-
+
prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "curves", NULL);
RNA_def_property_struct_type(prop, "FCurve");
RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action.");
-
+
prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "groups", NULL);
RNA_def_property_struct_type(prop, "ActionGroup");
RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves.");
-
+
prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "markers", NULL);
RNA_def_property_struct_type(prop, "TimelineMarker");
RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses.");
+
+ RNA_api_action(srna);
}
/* --------- */
diff --git a/source/blender/makesrna/intern/rna_action_api.c b/source/blender/makesrna/intern/rna_action_api.c
new file mode 100644
index 00000000000..991a8251cc5
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_action_api.c
@@ -0,0 +1,80 @@
+/**
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "DNA_action_types.h"
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_action.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_curve_types.h"
+
+/* XXX disabled until RNA allows returning arrays */
+#if 0
+/* return frame range of all curves (min, max) or (0, 1) if there are no keys */
+int *rna_Action_get_frame_range(bAction *act, int *ret_length)
+{
+ int *ret;
+ float start, end;
+
+ calc_action_range(act, &start, &end, 1);
+
+ *ret_length= 2;
+ ret= MEM_callocN(*ret_length * sizeof(int), "rna_Action_get_frame_range");
+
+ ret[0]= (int)start;
+ ret[1]= (int)end;
+
+ return ret;
+}
+#endif
+
+#else
+
+void RNA_api_action(StructRNA *srna)
+{
+#if 0
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "get_frame_range", "rna_Action_get_frame_range");
+ RNA_def_function_ui_description(func, "Get action frame range as a (min, max) tuple.");
+ parm= RNA_def_int_array(func, "frame_range", 1, NULL, 0, 0, "", "Action frame range.", 0, 0);
+ RNA_def_property_flag(parm, PROP_DYNAMIC_ARRAY);
+ RNA_def_function_return(func, parm);
+#endif
+}
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 3eb88e706e9..ce83d1c469b 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -51,14 +51,14 @@ void RNA_def_actuator(BlenderRNA *brna)
{ACT_SCENE, "SCENE", 0, "Scene", ""},
{ACT_RANDOM, "RANDOM", 0, "Random", ""},
{ACT_MESSAGE, "MESSAGE", 0, "Message", ""},
- {ACT_ACTION, "ACTION", 0, "Action", ""},
- {ACT_CD, "CD", 0, "CD", ""},
+ {ACT_ACTION, "ACTION", 0, "Action", ""},
{ACT_GAME, "GAME", 0, "Game", ""},
{ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""},
{ACT_2DFILTER, "FILTER_2D", 0, "2D Filter", ""},
{ACT_PARENT, "PARENT", 0, "Parent", ""},
{ACT_SHAPEACTION, "SHAPE_ACTION", 0, "Shape Action", ""},
{ACT_STATE, "STATE", 0, "State", ""},
+ {ACT_ARMATURE, "ARMATURE", 0, "Armature", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Actuator", NULL);
diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c
index 2ed47effec1..a8d3a6edaae 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Contributor(s): Blender Foundation (2008), Roland Hess
+ * Contributor(s): Blender Foundation (2009), Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -26,6 +26,7 @@
#include "RNA_define.h"
#include "RNA_types.h"
+#include "RNA_enum_types.h"
#include "rna_internal.h"
@@ -35,8 +36,27 @@
#include "MEM_guardedalloc.h"
+/* exported for use in API */
+EnumPropertyItem keyingset_path_grouping_items[] = {
+ {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""},
+ {KSP_GROUP_NONE, "NONE", 0, "None", ""},
+ {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""},
+ {KSP_GROUP_TEMPLATE_ITEM, "TEMPLATE", 0, "Innermost Context-Item Name", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+static int rna_AnimData_action_editable(PointerRNA *ptr)
+{
+ AnimData *adt= (AnimData *)ptr->data;
+
+ /* active action is only editable when it is not a tweaking strip */
+ if ((adt->flag & ADT_NLA_EDIT_ON) || (adt->actstrip) || (adt->tmpact))
+ return 0;
+ else
+ return 1;
+}
+
static void rna_ksPath_RnaPath_get(PointerRNA *ptr, char *value)
{
KS_Path *ksp= (KS_Path *)ptr->data;
@@ -73,18 +93,11 @@ static void rna_ksPath_RnaPath_set(PointerRNA *ptr, const char *value)
#else
-void rna_def_keyingset_path(BlenderRNA *brna)
+static void rna_def_keyingset_path(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem prop_mode_grouping_items[] = {
- {KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""},
- {KSP_GROUP_NONE, "NONE", 0, "None", ""},
- {KSP_GROUP_KSNAME, "KEYINGSET", 0, "Keying Set Name", ""},
- {KSP_GROUP_TEMPLATE_ITEM, "TEMPLATE", 0, "Innermost Context-Item Name", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "KeyingSetPath", NULL);
RNA_def_struct_sdna(srna, "KS_Path");
RNA_def_struct_ui_text(srna, "Keying Set Path", "Path to a setting for use in a Keying Set.");
@@ -100,7 +113,7 @@ void rna_def_keyingset_path(BlenderRNA *brna)
/* Grouping */
prop= RNA_def_property(srna, "grouping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "groupmode");
- RNA_def_property_enum_items(prop, prop_mode_grouping_items);
+ 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.");
/* Path + Array Index */
@@ -119,7 +132,7 @@ void rna_def_keyingset_path(BlenderRNA *brna)
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.");
}
-void rna_def_keyingset(BlenderRNA *brna)
+static void rna_def_keyingset(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -144,7 +157,6 @@ void rna_def_keyingset(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYINGSET_BUILTIN);
RNA_def_property_ui_text(prop, "Built-In", "Keying Set is a built-in to Blender.");
- /* TODO: for now, this is editable, but do we really want this to happen? */
prop= RNA_def_property(srna, "absolute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYINGSET_ABSOLUTE);
RNA_def_property_ui_text(prop, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
@@ -158,7 +170,8 @@ void rna_def_keyingset(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_MATRIX);
RNA_def_property_ui_text(prop, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
-
+ /* Keying Set API */
+ RNA_api_keyingset(srna);
}
/* --- */
@@ -184,12 +197,30 @@ void rna_def_animdata(BlenderRNA *brna)
/* NLA */
prop= RNA_def_property(srna, "nla_tracks", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "nla_tracks", NULL);
- RNA_def_property_struct_type(prop, "UnknownType"); // XXX!
+ RNA_def_property_struct_type(prop, "NlaTrack");
RNA_def_property_ui_text(prop, "NLA Tracks", "NLA Tracks (i.e. Animation Layers).");
- /* Action */
+ /* Active Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
- RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock.");
+ RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock.");
+ RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
+
+ /* 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).");
+
+ prop= RNA_def_property(srna, "action_blending", 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.");
+
+ 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.");
/* Drivers */
prop= RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE);
@@ -197,7 +228,10 @@ void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "FCurve");
RNA_def_property_ui_text(prop, "Drivers", "The Drivers/Expressions for this datablock.");
- /* Settings */
+ /* General Settings */
+ prop= RNA_def_property(srna, "nla_enabled", 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.");
}
/* --- */
diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c
new file mode 100644
index 00000000000..6af87335e02
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_animation_api.c
@@ -0,0 +1,89 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+#include "RNA_types.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_animsys.h"
+
+static void rna_KeyingSet_add_destination(KeyingSet *keyingset, ReportList *reports,
+ ID *id, char rna_path[], int array_index, int entire_array,
+ int grouping_method, char group_name[])
+{
+ short flag = 0;
+
+ /* validate flags */
+ if (entire_array)
+ flag |= KSP_FLAG_WHOLE_ARRAY;
+
+ /* if data is valid, call the API function for this */
+ if (keyingset) {
+ BKE_keyingset_add_destination(keyingset, id, group_name, rna_path, array_index, flag, grouping_method);
+ }
+ else {
+ BKE_report(reports, RPT_ERROR, "Keying Set Destination could not be added.");
+ }
+}
+
+#else
+
+void RNA_api_keyingset(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ /* Add Destination */
+ func= RNA_def_function(srna, "add_destination", "rna_KeyingSet_add_destination");
+ RNA_def_function_ui_description(func, "Add a new destination for the Keying Set.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ /* ID-block for target */
+ parm= RNA_def_pointer(func, "target_id", "ID", "Target ID", "ID-Datablock for the destination.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* rna-path */
+ parm= RNA_def_string(func, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm=RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX);
+ /* flags */
+ parm=RNA_def_boolean(func, "entire_array", 1, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used.");
+ /* grouping */
+ parm=RNA_def_enum(func, "grouping_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).");
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index caa970eff57..c89ed48d44a 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -30,14 +30,43 @@
#include "rna_internal.h"
#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "WM_api.h"
#include "WM_types.h"
#ifdef RNA_RUNTIME
+#include "BLI_arithb.h"
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_main.h"
+
#include "ED_armature.h"
+static void rna_Armature_update_data(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ DAG_id_flush_update(id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+ //WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+}
+
+static void rna_Armature_redraw_data(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+}
+
+static char *rna_Bone_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("bones[\"%s\"]", ((Bone*)ptr->data)->name);
+}
+
static void rna_bone_layer_set(short *layer, const int *values)
{
int i, tot= 0;
@@ -109,73 +138,33 @@ static void rna_Armature_path_end_frame_set(PointerRNA *ptr, int value)
data->pathef= value;
}
-PointerRNA rna_EditBone_rna_type_get(PointerRNA *ptr)
-{
- return rna_builtin_type_get(ptr);
-}
-
-void rna_EditBone_name_get(PointerRNA *ptr, char *value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- BLI_strncpy(value, data->name, sizeof(data->name));
-}
-
-int rna_EditBone_name_length(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return strlen(data->name);
-}
-
-int rna_EditBone_active_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_ACTIVE) != 0);
-}
-
-void rna_EditBone_active_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_ACTIVE;
- else data->flag &= ~BONE_ACTIVE;
-}
-
-float rna_EditBone_bbone_in_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->ease1);
-}
-
-void rna_EditBone_bbone_in_set(PointerRNA *ptr, float value)
+static void rna_EditBone_name_set(PointerRNA *ptr, const char *value)
{
- EditBone *data= (EditBone*)(ptr->data);
- data->ease1= CLAMPIS(value, 0.0f, 2.0f);
-}
-
-float rna_EditBone_bbone_out_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->ease2);
-}
-
-void rna_EditBone_bbone_out_set(PointerRNA *ptr, float value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- data->ease2= CLAMPIS(value, 0.0f, 2.0f);
-}
-
-int rna_EditBone_bbone_segments_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (int)(data->segments);
+ bArmature *arm= (bArmature*)ptr->id.data;
+ EditBone *ebone= (EditBone*)ptr->data;
+ char oldname[32], newname[32];
+
+ /* need to be on the stack */
+ BLI_strncpy(newname, value, 32);
+ BLI_strncpy(oldname, ebone->name, 32);
+
+ ED_armature_bone_rename(arm, oldname, newname);
}
-void rna_EditBone_bbone_segments_set(PointerRNA *ptr, int value)
+static void rna_Bone_name_set(PointerRNA *ptr, const char *value)
{
- EditBone *data= (EditBone*)(ptr->data);
- data->segments= CLAMPIS(value, 1, 32);
+ bArmature *arm= (bArmature*)ptr->id.data;
+ Bone *bone= (Bone*)ptr->data;
+ char oldname[32], newname[32];
+
+ /* need to be on the stack */
+ BLI_strncpy(newname, value, 32);
+ BLI_strncpy(oldname, bone->name, 32);
+
+ ED_armature_bone_rename(arm, oldname, newname);
}
-void rna_EditBone_layer_get(PointerRNA *ptr, int values[16])
+static void rna_EditBone_layer_get(PointerRNA *ptr, int values[16])
{
EditBone *data= (EditBone*)(ptr->data);
values[0]= ((data->layer & (1<<0)) != 0);
@@ -196,251 +185,110 @@ void rna_EditBone_layer_get(PointerRNA *ptr, int values[16])
values[15]= ((data->layer & (1<<15)) != 0);
}
-void rna_EditBone_layer_set(PointerRNA *ptr, const int values[16])
+static void rna_EditBone_layer_set(PointerRNA *ptr, const int values[16])
{
EditBone *data= (EditBone*)(ptr->data);
rna_bone_layer_set(&data->layer, values);
}
-int rna_EditBone_connected_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_CONNECTED) != 0);
-}
-
-void rna_EditBone_connected_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_CONNECTED;
- else data->flag &= ~BONE_CONNECTED;
-}
-
-int rna_EditBone_cyclic_offset_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (!((data->flag) & BONE_NO_CYCLICOFFSET) != 0);
-}
-
-void rna_EditBone_cyclic_offset_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(!value) data->flag |= BONE_NO_CYCLICOFFSET;
- else data->flag &= ~BONE_NO_CYCLICOFFSET;
-}
-
-int rna_EditBone_deform_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (!((data->flag) & BONE_NO_DEFORM) != 0);
-}
-
-void rna_EditBone_deform_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(!value) data->flag |= BONE_NO_DEFORM;
- else data->flag &= ~BONE_NO_DEFORM;
-}
-
-int rna_EditBone_draw_wire_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_DRAWWIRE) != 0);
-}
-
-void rna_EditBone_draw_wire_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_DRAWWIRE;
- else data->flag &= ~BONE_DRAWWIRE;
-}
-
-float rna_EditBone_envelope_distance_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->dist);
-}
-
-void rna_EditBone_envelope_distance_set(PointerRNA *ptr, float value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- data->dist= CLAMPIS(value, 0.0f, 1000.0f);
-}
-
-float rna_EditBone_envelope_weight_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->weight);
-}
-
-void rna_EditBone_envelope_weight_set(PointerRNA *ptr, float value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- data->weight= CLAMPIS(value, 0.0f, 1000.0f);
-}
-
-float rna_EditBone_radius_head_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->rad_head);
-}
-
-void rna_EditBone_radius_head_set(PointerRNA *ptr, float value)
+static void rna_EditBone_connected_check(EditBone *ebone)
{
- EditBone *data= (EditBone*)(ptr->data);
- data->rad_head= value;
-}
-
-float rna_EditBone_radius_tail_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->rad_tail);
-}
-
-void rna_EditBone_radius_tail_set(PointerRNA *ptr, float value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- data->rad_tail= value;
-}
-
-void rna_EditBone_head_get(PointerRNA *ptr, float values[3])
-{
- EditBone *data= (EditBone*)(ptr->data);
- values[0]= (float)(((float*)data->head)[0]);
- values[1]= (float)(((float*)data->head)[1]);
- values[2]= (float)(((float*)data->head)[2]);
-}
-
-void rna_EditBone_head_set(PointerRNA *ptr, const float values[3])
-{
- EditBone *data= (EditBone*)(ptr->data);
- ((float*)data->head)[0]= values[0];
- ((float*)data->head)[1]= values[1];
- ((float*)data->head)[2]= values[2];
-}
-
-int rna_EditBone_head_selected_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_ROOTSEL) != 0);
-}
-
-void rna_EditBone_head_selected_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_ROOTSEL;
- else data->flag &= ~BONE_ROOTSEL;
-}
-
-int rna_EditBone_hidden_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_HIDDEN_A) != 0);
-}
+ if(ebone->parent) {
+ if(ebone->flag & BONE_CONNECTED) {
+ /* Attach this bone to its parent */
+ VECCOPY(ebone->head, ebone->parent->tail);
-void rna_EditBone_hidden_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_HIDDEN_A;
- else data->flag &= ~BONE_HIDDEN_A;
+ if(ebone->flag & BONE_ROOTSEL)
+ ebone->parent->flag |= BONE_TIPSEL;
+ }
+ else if(!(ebone->parent->flag & BONE_ROOTSEL)) {
+ ebone->parent->flag &= ~BONE_TIPSEL;
+ }
+ }
}
-int rna_EditBone_hinge_get(PointerRNA *ptr)
+static void rna_EditBone_connected_set(PointerRNA *ptr, int value)
{
- EditBone *data= (EditBone*)(ptr->data);
- return (!((data->flag) & BONE_HINGE) != 0);
-}
+ EditBone *ebone= (EditBone*)(ptr->data);
-void rna_EditBone_hinge_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(!value) data->flag |= BONE_HINGE;
- else data->flag &= ~BONE_HINGE;
-}
+ if(value) ebone->flag |= BONE_CONNECTED;
+ else ebone->flag &= ~BONE_CONNECTED;
-int rna_EditBone_inherit_scale_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (!((data->flag) & BONE_NO_SCALE) != 0);
+ rna_EditBone_connected_check(ebone);
}
-void rna_EditBone_inherit_scale_set(PointerRNA *ptr, int value)
+static PointerRNA rna_EditBone_parent_get(PointerRNA *ptr)
{
EditBone *data= (EditBone*)(ptr->data);
- if(!value) data->flag |= BONE_NO_SCALE;
- else data->flag &= ~BONE_NO_SCALE;
-}
-
-int rna_EditBone_locked_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_EDITMODE_LOCKED) != 0);
+ return rna_pointer_inherit_refine(ptr, &RNA_EditBone, data->parent);
}
-void rna_EditBone_locked_set(PointerRNA *ptr, int value)
+static void rna_EditBone_parent_set(PointerRNA *ptr, PointerRNA value)
{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_EDITMODE_LOCKED;
- else data->flag &= ~BONE_EDITMODE_LOCKED;
-}
+ EditBone *ebone= (EditBone*)(ptr->data);
+ EditBone *pbone, *parbone= (EditBone*)value.data;
-int rna_EditBone_multiply_vertexgroup_with_envelope_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_MULT_VG_ENV) != 0);
-}
+ /* within same armature */
+ if(value.id.data != ptr->id.data)
+ return;
-void rna_EditBone_multiply_vertexgroup_with_envelope_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_MULT_VG_ENV;
- else data->flag &= ~BONE_MULT_VG_ENV;
-}
+ if(parbone == NULL) {
+ if(ebone->parent && !(ebone->parent->flag & BONE_ROOTSEL))
+ ebone->parent->flag &= ~BONE_TIPSEL;
-PointerRNA rna_EditBone_parent_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return rna_pointer_inherit_refine(ptr, &RNA_EditBone, data->parent);
+ ebone->parent = NULL;
+ ebone->flag &= ~BONE_CONNECTED;
+ }
+ else {
+ /* make sure this is a valid child */
+ if(parbone == ebone)
+ return;
+
+ for(pbone= parbone->parent; pbone; pbone=pbone->parent)
+ if(pbone == ebone)
+ return;
+
+ ebone->parent = parbone;
+ rna_EditBone_connected_check(ebone);
+ }
}
-float rna_EditBone_roll_get(PointerRNA *ptr)
+static void rna_Armature_editbone_transform_update(bContext *C, PointerRNA *ptr)
{
- EditBone *data= (EditBone*)(ptr->data);
- return (float)(data->roll);
-}
+ bArmature *arm= (bArmature*)ptr->id.data;
+ EditBone *ebone= (EditBone*)ptr->data;
+ EditBone *child, *eboflip;
+
+ /* update our parent */
+ if(ebone->parent && ebone->flag & BONE_CONNECTED)
+ VECCOPY(ebone->parent->tail, ebone->head)
-void rna_EditBone_roll_set(PointerRNA *ptr, float value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- data->roll= value;
-}
+ /* update our children if necessary */
+ for(child = arm->edbo->first; child; child=child->next)
+ if(child->parent == ebone && (child->flag & BONE_CONNECTED))
+ VECCOPY(child->head, ebone->tail);
-void rna_EditBone_tail_get(PointerRNA *ptr, float values[3])
-{
- EditBone *data= (EditBone*)(ptr->data);
- values[0]= (float)(((float*)data->tail)[0]);
- values[1]= (float)(((float*)data->tail)[1]);
- values[2]= (float)(((float*)data->tail)[2]);
-}
+ if(arm->flag & ARM_MIRROR_EDIT) {
+ eboflip= ED_armature_bone_get_mirrored(arm->edbo, ebone);
-void rna_EditBone_tail_set(PointerRNA *ptr, const float values[3])
-{
- EditBone *data= (EditBone*)(ptr->data);
- ((float*)data->tail)[0]= values[0];
- ((float*)data->tail)[1]= values[1];
- ((float*)data->tail)[2]= values[2];
-}
+ if(eboflip) {
+ eboflip->roll= -ebone->roll;
-int rna_EditBone_tail_selected_get(PointerRNA *ptr)
-{
- EditBone *data= (EditBone*)(ptr->data);
- return (((data->flag) & BONE_TIPSEL) != 0);
-}
+ eboflip->head[0]= -ebone->head[0];
+ eboflip->tail[0]= -ebone->tail[0];
+
+ /* update our parent */
+ if(eboflip->parent && eboflip->flag & BONE_CONNECTED)
+ VECCOPY(eboflip->parent->tail, eboflip->head);
+
+ /* update our children if necessary */
+ for(child = arm->edbo->first; child; child=child->next)
+ if(child->parent == eboflip && (child->flag & BONE_CONNECTED))
+ VECCOPY (child->head, eboflip->tail);
+ }
+ }
-void rna_EditBone_tail_selected_set(PointerRNA *ptr, int value)
-{
- EditBone *data= (EditBone*)(ptr->data);
- if(value) data->flag |= BONE_TIPSEL;
- else data->flag &= ~BONE_TIPSEL;
+ rna_Armature_update_data(C, ptr);
}
static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
@@ -475,105 +323,108 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
/* strings */
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* must be unique */
+ RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
- if(editbone) RNA_def_property_string_funcs(prop, "rna_EditBone_name_get", "rna_EditBone_name_length", "rna_EditBone_name_set");
+ if(editbone) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_EditBone_name_set");
+ else RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Bone_name_set");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* flags */
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 16);
- RNA_def_property_ui_text(prop, "Bone Layers", "Layers bone exists in");
if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_layer_get", "rna_EditBone_layer_set");
- else {
- RNA_def_property_boolean_funcs(prop, NULL, "rna_Bone_layer_set");
- RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
- }
+ else RNA_def_property_boolean_funcs(prop, NULL, "rna_Bone_layer_set");
+ RNA_def_property_ui_text(prop, "Layers", "Layers bone exists in");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "connected", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_connected_get", "rna_EditBone_connected_set");
- else RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_CONNECTED);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_CONNECTED);
+ if(editbone) RNA_def_property_boolean_funcs(prop, NULL, "rna_EditBone_connected_set");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
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, "active", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_active_get", "rna_EditBone_active_set");
- else RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ACTIVE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "Bone was the last bone clicked on (most operations are applied to only this bone)");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "hinge", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_hinge_get", "rna_EditBone_hinge_set");
- else RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone doesn't inherit rotation or scale from parent bone.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "multiply_vertexgroup_with_envelope", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_multiply_vertexgroup_with_envelope_get", "rna_EditBone_multiply_vertexgroup_with_envelope_set");
- else RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_MULT_VG_ENV);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_MULT_VG_ENV);
RNA_def_property_ui_text(prop, "Multiply Vertex Group with Envelope", "When deforming bone, multiply effects of Vertex Group weights with Envelope influence.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "deform", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_deform_get", "rna_EditBone_deform_set");
- else RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_DEFORM);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_DEFORM);
RNA_def_property_ui_text(prop, "Deform", "Bone does not deform any geometry.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "inherit_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Inherit Scale", "Bone inherits scaling from parent bone.");
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_inherit_scale_get", "rna_EditBone_inherit_scale_set");
- else RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_SCALE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_SCALE);
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "draw_wire", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_draw_wire_get", "rna_EditBone_draw_wire_set");
- else RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_DRAWWIRE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_DRAWWIRE);
RNA_def_property_ui_text(prop, "Draw Wire", "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "cyclic_offset", PROP_BOOLEAN, PROP_NONE);
- if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_cyclic_offset_get", "rna_EditBone_cyclic_offset_set");
- else RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_CYCLICOFFSET);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_CYCLICOFFSET);
RNA_def_property_ui_text(prop, "Cyclic Offset", "When bone doesn't have a parent, it receives cyclic offset effects.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
/* Number values */
/* envelope deform settings */
prop= RNA_def_property(srna, "envelope_distance", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_envelope_distance_get", "rna_EditBone_envelope_distance_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "dist");
+ RNA_def_property_float_sdna(prop, NULL, "dist");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Envelope Deform Distance", "Bone deformation distance (for Envelope deform only).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "envelope_weight", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_envelope_weight_get", "rna_EditBone_envelope_weight_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "weight");
+ RNA_def_property_float_sdna(prop, NULL, "weight");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Envelope Deform Weight", "Bone deformation weight (for Envelope deform only).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "radius_head", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_radius_head_get", "rna_EditBone_radius_head_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "rad_head");
+ prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_NONE);
+ if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
+ RNA_def_property_float_sdna(prop, NULL, "rad_head");
//RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
- RNA_def_property_ui_text(prop, "Envelope Radius Head", "Radius of head of bone (for Envelope deform only).");
+ RNA_def_property_ui_text(prop, "Envelope Head Radius", "Radius of head of bone (for Envelope deform only).");
- prop= RNA_def_property(srna, "radius_tail", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_radius_tail_get", "rna_EditBone_radius_tail_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "rad_tail");
+ prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_NONE);
+ if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
+ RNA_def_property_float_sdna(prop, NULL, "rad_tail");
//RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
- RNA_def_property_ui_text(prop, "Envelope Radius Tail", "Radius of tail of bone (for Envelope deform only).");
+ RNA_def_property_ui_text(prop, "Envelope Tail Radius", "Radius of tail of bone (for Envelope deform only).");
/* b-bones deform settings */
prop= RNA_def_property(srna, "bbone_segments", PROP_INT, PROP_NONE);
- if(editbone) RNA_def_property_int_funcs(prop, "rna_EditBone_bbone_segments_get", "rna_EditBone_bbone_segments_set", NULL);
- else RNA_def_property_int_sdna(prop, NULL, "segments");
+ RNA_def_property_int_sdna(prop, NULL, "segments");
RNA_def_property_range(prop, 1, 32);
RNA_def_property_ui_text(prop, "B-Bone Segments", "Number of subdivisions of bone (for B-Bones only).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "bbone_in", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_bbone_in_get", "rna_EditBone_bbone_in_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "ease1");
+ RNA_def_property_float_sdna(prop, NULL, "ease1");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "B-Bone Ease In", "Length of first Bezier Handle (for B-Bones only).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "bbone_out", PROP_FLOAT, PROP_NONE);
- if(editbone) RNA_def_property_float_funcs(prop, "rna_EditBone_bbone_out_get", "rna_EditBone_bbone_out_set", NULL);
- else RNA_def_property_float_sdna(prop, NULL, "ease2");
+ RNA_def_property_float_sdna(prop, NULL, "ease2");
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");
}
// err... bones should not be directly edited (only editbones should be...)
@@ -585,6 +436,7 @@ static void rna_def_bone(BlenderRNA *brna)
srna= RNA_def_struct(brna, "Bone", NULL);
RNA_def_struct_ui_text(srna, "Bone", "Bone in an Armature datablock.");
RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
+ RNA_def_struct_path_func(srna, "rna_Bone_path");
/* pointers/collections */
/* parent (pointer) */
@@ -592,6 +444,7 @@ static void rna_def_bone(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Bone");
RNA_def_property_pointer_sdna(prop, NULL, "parent");
RNA_def_property_ui_text(prop, "Parent", "Parent bone (in same Armature).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* children (collection) */
prop= RNA_def_property(srna, "children", PROP_COLLECTION, PROP_NONE);
@@ -605,10 +458,43 @@ static void rna_def_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_P);
RNA_def_property_ui_text(prop, "Hidden", "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Selected", "");
+ 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_ui_text(prop, "Bone Matrix", "3x3 bone matrix.");
+
+ prop= RNA_def_property(srna, "armature_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "arm_mat");
+ RNA_def_property_array(prop, 16);
+ 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_ui_text(prop, "Tail", "Location of tail end of the bone.");
+
+ prop= RNA_def_property(srna, "armature_tail", PROP_FLOAT, PROP_TRANSLATION);
+ RNA_def_property_float_sdna(prop, NULL, "arm_tail");
+ RNA_def_property_array(prop, 3);
+ 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_ui_text(prop, "Head", "Location of head end of the bone.");
+
+ prop= RNA_def_property(srna, "armature_head", PROP_FLOAT, PROP_TRANSLATION);
+ RNA_def_property_float_sdna(prop, NULL, "arm_head");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature.");
}
static void rna_def_edit_bone(BlenderRNA *brna)
@@ -617,70 +503,97 @@ static void rna_def_edit_bone(BlenderRNA *brna)
PropertyRNA *prop;
srna= RNA_def_struct(brna, "EditBone", NULL);
+ RNA_def_struct_sdna(srna, "EditBone");
RNA_def_struct_ui_text(srna, "Edit Bone", "Editmode bone in an Armature datablock.");
RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
+ RNA_define_verify_sdna(0); // not in sdna
+
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "EditBone");
- RNA_def_property_pointer_funcs(prop, "rna_EditBone_parent_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_EditBone_parent_get", "rna_EditBone_parent_set", NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent", "Parent edit bone (in same Armature).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "roll", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_funcs(prop, "rna_EditBone_roll_get", "rna_EditBone_roll_set", NULL);
+ RNA_def_property_float_sdna(prop, NULL, "roll");
RNA_def_property_ui_text(prop, "Roll", "Bone rotation around head-tail axis.");
+ RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
- prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_VECTOR);
+ 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_float_funcs(prop, "rna_EditBone_head_get", "rna_EditBone_head_set", NULL);
RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone.");
+ RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
- prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_VECTOR);
+ 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_float_funcs(prop, "rna_EditBone_tail_get", "rna_EditBone_tail_set", NULL);
RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone.");
+ RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
rna_def_bone_common(srna, 1);
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_EditBone_hidden_get", "rna_EditBone_hidden_set");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
RNA_def_property_ui_text(prop, "Hidden", "Bone is not visible when in Edit Mode");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_EditBone_locked_get", "rna_EditBone_locked_set");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
RNA_def_property_ui_text(prop, "Locked", "Bone is not able to be transformed when in Edit Mode.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "head_selected", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_EditBone_head_selected_get", "rna_EditBone_head_selected_set");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
RNA_def_property_ui_text(prop, "Head Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "tail_selected", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_EditBone_tail_selected_get", "rna_EditBone_tail_selected_set");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
RNA_def_property_ui_text(prop, "Tail Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+ RNA_define_verify_sdna(1);
}
-void rna_def_armature(BlenderRNA *brna)
+static void rna_def_armature(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem prop_drawtype_items[] = {
- {ARM_OCTA, "OCTAHEDRAL", 0, "Octahedral", "Draw bones as octahedral shape (default)."},
- {ARM_LINE, "STICK", 0, "Stick", "Draw bones as simple 2D lines with dots."},
- {ARM_B_BONE, "BBONE", 0, "B-Bone", "Draw bones as boxes, showing subdivision and B-Splines"},
- {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Draw bones as extruded spheres, showing defomation influence volume."},
+ {ARM_OCTA, "OCTAHEDRAL", 0, "Octahedral", "Display bones as octahedral shape (default)."},
+ {ARM_LINE, "STICK", 0, "Stick", "Display bones as simple 2D lines with dots."},
+ {ARM_B_BONE, "BBONE", 0, "B-Bone", "Display bones as boxes, showing subdivision and B-Splines"},
+ {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing defomation influence volume."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_ghost_type_items[] = {
- {ARM_GHOST_CUR, "CURRENT_FRAME", 0, "Around Current Frame", "Draw Ghosts of poses within a fixed number of frames around the current frame."},
- {ARM_GHOST_RANGE, "RANGE", 0, "In Range", "Draw Ghosts of poses within specified range."},
- {ARM_GHOST_KEYS, "KEYS", 0, "On Keyframes", "Draw Ghosts of poses on Keyframes."},
+ {ARM_GHOST_CUR, "CURRENT_FRAME", 0, "Around Frame", "Display Ghosts of poses within a fixed number of frames around the current frame."},
+ {ARM_GHOST_RANGE, "RANGE", 0, "In Range", "Display Ghosts of poses within specified range."},
+ {ARM_GHOST_KEYS, "KEYS", 0, "On Keyframes", "Display Ghosts of poses on Keyframes."},
+ {0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_paths_type_items[]= {
+ {ARM_PATH_ACFRA, "CURRENT_FRAME", 0, "Around Frame", "Display Paths of poses within a fixed number of frames around the current frame."},
+ {0, "RANGE", 0, "In Range", "Display Paths of poses within specified range."},
+ {0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_paths_location_items[]= {
+ {ARM_PATH_HEADS, "HEADS", 0, "Heads", "Calculate bone paths from heads"},
+ {0, "TAILS", 0, "Tails", "Calculate bone paths from tails"},
+ {0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_pose_position_items[]= {
+ {0, "POSE_POSITION", 0, "Pose Position", "Show armature in posed state."},
+ {ARM_RESTPOS, "REST_POSITION", 0, "Rest Position", "Show Armature in binding pose state. No posing possible."},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Armature", "ID");
RNA_def_struct_ui_text(srna, "Armature", "Armature datablock containing a hierarchy of bones, usually used for rigging characters.");
RNA_def_struct_ui_icon(srna, ICON_ARMATURE_DATA);
-
RNA_def_struct_sdna(srna, "bArmature");
+ rna_def_animdata_common(srna);
+
/* Collections */
prop= RNA_def_property(srna, "bones", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "bonebase", NULL);
@@ -694,108 +607,142 @@ void rna_def_armature(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edit Bones", "");
/* Enum values */
+// prop= RNA_def_property(srna, "rest_position", PROP_BOOLEAN, PROP_NONE);
+// RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_RESTPOS);
+// RNA_def_property_ui_text(prop, "Rest Position", "Show Armature in Rest Position. No posing possible.");
+// RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop= RNA_def_property(srna, "pose_position", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ 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");
+
prop= RNA_def_property(srna, "drawtype", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_drawtype_items);
RNA_def_property_ui_text(prop, "Draw Type", "");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "ghost_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ghosttype");
RNA_def_property_enum_items(prop, prop_ghost_type_items);
- RNA_def_property_ui_text(prop, "Ghost Drawing", "Method of Onion-skinning for active Action");
+ RNA_def_property_ui_text(prop, "Ghost Type", "Method of Onion-skinning for active Action");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+ prop= RNA_def_property(srna, "paths_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "pathflag");
+ RNA_def_property_enum_items(prop, prop_paths_type_items);
+ RNA_def_property_ui_text(prop, "Paths Type", "Type of range to show for Bone Paths");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+ prop= RNA_def_property(srna, "paths_location", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "pathflag");
+ RNA_def_property_enum_items(prop, prop_paths_location_items);
+ RNA_def_property_ui_text(prop, "Paths Location", "When calculating Bone Paths, use Head or Tips");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* Boolean values */
/* layer */
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 16);
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, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_redraw_data");
+ RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
/* layer protection */
- prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_LAYER);
RNA_def_property_boolean_sdna(prop, NULL, "layer_protected", 1);
RNA_def_property_array(prop, 16);
RNA_def_property_ui_text(prop, "Layer Proxy Protection", "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* flag */
- prop= RNA_def_property(srna, "rest_position", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_RESTPOS);
- RNA_def_property_ui_text(prop, "Rest Position", "Show Armature in Rest Position. No posing possible.");
+
prop= RNA_def_property(srna, "draw_axes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWAXES);
RNA_def_property_ui_text(prop, "Draw Axes", "Draw bone axes.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "draw_names", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWNAMES);
RNA_def_property_ui_text(prop, "Draw Names", "Draw bone names.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "delay_deform", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DELAYDEFORM);
RNA_def_property_ui_text(prop, "Delay Deform", "Don't deform children when manipulating bones in Pose Mode");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "x_axis_mirror", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_MIRROR_EDIT);
RNA_def_property_ui_text(prop, "X-Axis Mirror", "Apply changes to matching bone on opposite side of X-Axis.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "auto_ik", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_AUTO_IK);
RNA_def_property_ui_text(prop, "Auto IK", "Add temporaral IK constraints while grabbing bones in Pose Mode.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "draw_custom_bone_shapes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_NO_CUSTOM);
RNA_def_property_ui_text(prop, "Draw Custom Bone Shapes", "Draw bones with their custom shapes.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "draw_group_colors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_COL_CUSTOM);
RNA_def_property_ui_text(prop, "Draw Bone Group Colors", "Draw bone group colors.");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "ghost_only_selected", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
- RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Keyframes Only", "");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
+ RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Bones Only", "");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* deformflag */
prop= RNA_def_property(srna, "deform_vertexgroups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_VGROUP);
RNA_def_property_ui_text(prop, "Deform Vertex Groups", "Enable Vertex Groups when defining deform");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "deform_envelope", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
RNA_def_property_ui_text(prop, "Deform Envelopes", "Enable Bone Envelopes when defining deform");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "deform_quaternion", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
RNA_def_property_ui_text(prop, "Use Dual Quaternion Deformation", "Enable deform rotation with Quaternions");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "deform_bbone_rest", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_B_BONE_REST);
RNA_def_property_ui_text(prop, "B-Bones Deform in Rest Position", "Make B-Bones deform already in Rest Position");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
//prop= RNA_def_property(srna, "deform_invert_vertexgroups", PROP_BOOLEAN, PROP_NONE);
//RNA_def_property_boolean_negative_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
//RNA_def_property_ui_text(prop, "Invert Vertex Group Influence", "Invert Vertex Group influence (only for Modifiers)");
+ //RNA_def_property_update(prop, 0, "rna_Armature_update_data");
/* pathflag */
prop= RNA_def_property(srna, "paths_show_frame_numbers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pathflag", ARM_PATH_FNUMS);
- RNA_def_property_ui_text(prop, "Bone Paths Show Frame Numbers", "When drawing Armature in Pose Mode, show frame numbers on Bone Paths");
+ RNA_def_property_ui_text(prop, "Paths Show Frame Numbers", "When drawing Armature in Pose Mode, show frame numbers on Bone Paths");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "paths_highlight_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pathflag", ARM_PATH_KFRAS);
- RNA_def_property_ui_text(prop, "Bone Paths Highlight Keyframes", "When drawing Armature in Pose Mode, emphasize position of keyframes on Bone Paths");
+ RNA_def_property_ui_text(prop, "Paths Highlight Keyframes", "When drawing Armature in Pose Mode, emphasize position of keyframes on Bone Paths");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "paths_show_keyframe_numbers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pathflag", ARM_PATH_KFNOS);
- RNA_def_property_ui_text(prop, "Bone Paths Show Keyframe Numbers", "When drawing Armature in Pose Mode, show frame numbers of Keyframes on Bone Paths");
-
- prop= RNA_def_property(srna, "paths_show_around_current_frame", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "pathflag", ARM_PATH_ACFRA);
- RNA_def_property_ui_text(prop, "Bone Paths Around Current Frame", "When drawing Armature in Pose Mode, only show section of Bone Paths that falls around current frame");
+ RNA_def_property_ui_text(prop, "Paths Show Keyframe Numbers", "When drawing Armature in Pose Mode, show frame numbers of Keyframes on Bone Paths");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "paths_calculate_head_positions", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "pathflag", ARM_PATH_HEADS);
- RNA_def_property_ui_text(prop, "Bone Paths Use Heads", "When calculating Bone Paths, use Head locations instead of Tips");
/* Number fields */
/* ghost/onionskining settings */
@@ -803,47 +750,56 @@ void rna_def_armature(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "ghostep");
RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "Ghosting Step", "Number of frame steps on either side of current frame to show as ghosts (only for 'Around Current Frame' Onion-skining method).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "ghost_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ghostsize");
RNA_def_property_range(prop, 1, 20);
RNA_def_property_ui_text(prop, "Ghosting Frame Step", "Frame step for Ghosts (not for 'On Keyframes' Onion-skining method).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "ghost_start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "ghost_start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "ghostsf");
RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_start_frame_set", NULL);
RNA_def_property_ui_text(prop, "Ghosting Start Frame", "Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "ghost_end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "ghost_end_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "ghostef");
RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_end_frame_set", NULL);
RNA_def_property_ui_text(prop, "Ghosting End Frame", "End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* bone path settings */
prop= RNA_def_property(srna, "path_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pathsize");
RNA_def_property_range(prop, 1, 100);
- RNA_def_property_ui_text(prop, "Bone Paths Frame Step", "Number of frames between 'dots' on Bone Paths (when drawing).");
+ RNA_def_property_ui_text(prop, "Paths Frame Step", "Number of frames between 'dots' on Bone Paths (when drawing).");
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "pathsf");
RNA_def_property_int_funcs(prop, NULL, "rna_Armature_path_start_frame_set", NULL);
- RNA_def_property_ui_text(prop, "Bone Paths Calculation Start Frame", "Starting frame of range of frames to use for Bone Path calculations.");
+ RNA_def_property_ui_text(prop, "Paths Calculation Start Frame", "Starting frame of range of frames to use for Bone Path calculations.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "path_end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "path_end_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "pathef");
RNA_def_property_int_funcs(prop, NULL, "rna_Armature_path_end_frame_set", NULL);
- RNA_def_property_ui_text(prop, "Bone Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
+ RNA_def_property_ui_text(prop, "Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "path_before_current", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pathbc");
RNA_def_property_range(prop, 1, MAXFRAMEF/2);
- RNA_def_property_ui_text(prop, "Bone Paths Frames Before Current", "Number of frames before current frame to show on Bone Paths (only for 'Around Current' option).");
+ RNA_def_property_ui_text(prop, "Paths Frames Before Current", "Number of frames before current frame to show on Bone Paths (only for 'Around Current' option).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
prop= RNA_def_property(srna, "path_after_current", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pathac");
RNA_def_property_range(prop, 1, MAXFRAMEF/2);
- RNA_def_property_ui_text(prop, "Bone Paths Frames After Current", "Number of frames after current frame to show on Bone Paths (only for 'Around Current' option).");
+ RNA_def_property_ui_text(prop, "Paths Frames After Current", "Number of frames after current frame to show on Bone Paths (only for 'Around Current' option).");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
}
void RNA_def_armature(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
new file mode 100644
index 00000000000..8002aa89313
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -0,0 +1,618 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <float.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_boid_types.h"
+#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+EnumPropertyItem boidrule_type_items[] ={
+ {eBoidRuleType_Goal, "GOAL", 0, "Goal", "Go to assigned object or loudest assigned signal source."},
+ {eBoidRuleType_Avoid, "AVOID", 0, "Avoid", "Get away from assigned object or loudest assigned signal source."},
+ {eBoidRuleType_AvoidCollision, "AVOID_COLLISION", 0, "Avoid Collision", "Monoeuver to avoid collisions with other boids and deflector objects in near future."},
+ {eBoidRuleType_Separate, "SEPARATE", 0, "Separate", "Keep from going through other boids."},
+ {eBoidRuleType_Flock, "FLOCK", 0, "Flock", "Move to center of neighbors and match their velocity."},
+ {eBoidRuleType_FollowLeader, "FOLLOW_LEADER", 0, "Follow Leader", "Follow a boid or assigned object."},
+ {eBoidRuleType_AverageSpeed, "AVERAGE_SPEED", 0, "Average Speed", "Maintain speed, flight level or wander."},
+ {eBoidRuleType_Fight, "FIGHT", 0, "Fight", "Go to closest enemy and attack when in range."},
+ //{eBoidRuleType_Protect, "PROTECT", 0, "Protect", "Go to enemy closest to target and attack when in range."},
+ //{eBoidRuleType_Hide, "HIDE", 0, "Hide", "Find a deflector move to it's other side from closest enemy."},
+ //{eBoidRuleType_FollowPath, "FOLLOW_PATH", 0, "Follow Path", "Move along a assigned curve or closest curve in a group."},
+ //{eBoidRuleType_FollowWall, "FOLLOW_WALL", 0, "Follow Wall", "Move next to a deflector object's in direction of it's tangent."},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem boidruleset_type_items[] ={
+ {eBoidRulesetType_Fuzzy, "FUZZY", 0, "Fuzzy", "Rules are gone through top to bottom. Only the first rule that effect above fuzziness threshold is evaluated."},
+ {eBoidRulesetType_Random, "RANDOM", 0, "Random", "A random rule is selected for each boid."},
+ {eBoidRulesetType_Average, "AVERAGE", 0, "Average", "All rules are averaged."},
+ {0, NULL, 0, NULL, NULL}};
+
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_particle.h"
+
+static void rna_Boids_reset(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+ ParticleSettings *part;
+
+ if(ptr->type==&RNA_ParticleSystem) {
+ ParticleSystem *psys = (ParticleSystem*)ptr->data;
+ Object *ob = psys_find_object(scene, psys);
+
+ psys->recalc = PSYS_RECALC_RESET;
+
+ if(ob)
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ }
+ else {
+ part = ptr->id.data;
+ psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+static void rna_Boids_reset_deps(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+ ParticleSettings *part;
+
+ if(ptr->type==&RNA_ParticleSystem) {
+ ParticleSystem *psys = (ParticleSystem*)ptr->data;
+ Object *ob = psys_find_object(scene, psys);
+
+ psys->recalc = PSYS_RECALC_RESET;
+
+ if(ob)
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ }
+ else {
+ part = ptr->id.data;
+ psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET);
+ DAG_scene_sort(scene);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+
+static StructRNA* rna_BoidRule_refine(struct PointerRNA *ptr)
+{
+ BoidRule *rule= (BoidRule*)ptr->data;
+
+ switch(rule->type) {
+ case eBoidRuleType_Goal:
+ return &RNA_BoidRuleGoal;
+ case eBoidRuleType_Avoid:
+ return &RNA_BoidRuleAvoid;
+ case eBoidRuleType_AvoidCollision:
+ return &RNA_BoidRuleAvoidCollision;
+ case eBoidRuleType_FollowLeader:
+ return &RNA_BoidRuleFollowLeader;
+ case eBoidRuleType_AverageSpeed:
+ return &RNA_BoidRuleAverageSpeed;
+ case eBoidRuleType_Fight:
+ return &RNA_BoidRuleFight;
+ default:
+ return &RNA_BoidRule;
+ }
+}
+
+static char *rna_BoidRule_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("rules[%s]", ((BoidRule*)ptr->data)->name); // XXX not unique
+}
+
+static PointerRNA rna_BoidState_active_boid_rule_get(PointerRNA *ptr)
+{
+ BoidState *state= (BoidState*)ptr->data;
+ BoidRule *rule = (BoidRule*)state->rules.first;
+
+ for(; rule; rule=rule->next) {
+ if(rule->flag & BOIDRULE_CURRENT)
+ return rna_pointer_inherit_refine(ptr, &RNA_BoidRule, rule);
+ }
+ return rna_pointer_inherit_refine(ptr, &RNA_BoidRule, NULL);
+}
+static void rna_BoidState_active_boid_rule_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ BoidState *state= (BoidState*)ptr->data;
+ *min= 0;
+ *max= BLI_countlist(&state->rules)-1;
+ *max= MAX2(0, *max);
+}
+
+static int rna_BoidState_active_boid_rule_index_get(PointerRNA *ptr)
+{
+ BoidState *state= (BoidState*)ptr->data;
+ BoidRule *rule = (BoidRule*)state->rules.first;
+ int i=0;
+
+ for(; rule; rule=rule->next, i++) {
+ if(rule->flag & BOIDRULE_CURRENT)
+ return i;
+ }
+ return 0;
+}
+
+static void rna_BoidState_active_boid_rule_index_set(struct PointerRNA *ptr, int value)
+{
+ BoidState *state= (BoidState*)ptr->data;
+ BoidRule *rule = (BoidRule*)state->rules.first;
+ int i=0;
+
+ for(; rule; rule=rule->next, i++) {
+ if(i==value)
+ rule->flag |= BOIDRULE_CURRENT;
+ else
+ rule->flag &= ~BOIDRULE_CURRENT;
+ }
+}
+
+static PointerRNA rna_BoidSettings_active_boid_state_get(PointerRNA *ptr)
+{
+ BoidSettings *boids= (BoidSettings*)ptr->data;
+ BoidState *state = (BoidState*)boids->states.first;
+
+ for(; state; state=state->next) {
+ if(state->flag & BOIDSTATE_CURRENT)
+ return rna_pointer_inherit_refine(ptr, &RNA_BoidState, state);
+ }
+ return rna_pointer_inherit_refine(ptr, &RNA_BoidState, NULL);
+}
+static void rna_BoidSettings_active_boid_state_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ BoidSettings *boids= (BoidSettings*)ptr->data;
+ *min= 0;
+ *max= BLI_countlist(&boids->states)-1;
+ *max= MAX2(0, *max);
+}
+
+static int rna_BoidSettings_active_boid_state_index_get(PointerRNA *ptr)
+{
+ BoidSettings *boids= (BoidSettings*)ptr->data;
+ BoidState *state = (BoidState*)boids->states.first;
+ int i=0;
+
+ for(; state; state=state->next, i++) {
+ if(state->flag & BOIDSTATE_CURRENT)
+ return i;
+ }
+ return 0;
+}
+
+static void rna_BoidSettings_active_boid_state_index_set(struct PointerRNA *ptr, int value)
+{
+ BoidSettings *boids= (BoidSettings*)ptr->data;
+ BoidState *state = (BoidState*)boids->states.first;
+ int i=0;
+
+ for(; state; state=state->next, i++) {
+ if(i==value)
+ state->flag |= BOIDSTATE_CURRENT;
+ else
+ state->flag &= ~BOIDSTATE_CURRENT;
+ }
+}
+
+#else
+
+static void rna_def_boidrule_goal(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleGoal", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Goal", "");
+ RNA_def_struct_sdna(srna, "BoidRuleGoalAvoid");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "ob");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Goal object.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
+
+ prop= RNA_def_property(srna, "predict", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_GOAL_AVOID_PREDICT);
+ RNA_def_property_ui_text(prop, "Predict", "Predict target movement.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule_avoid(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleAvoid", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Avoid", "");
+ RNA_def_struct_sdna(srna, "BoidRuleGoalAvoid");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "ob");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Object to avoid.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
+
+ prop= RNA_def_property(srna, "predict", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_GOAL_AVOID_PREDICT);
+ RNA_def_property_ui_text(prop, "Predict", "Predict target movement.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "fear_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Fear factor", "Avoid object if danger from it is above this threshol.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule_avoid_collision(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleAvoidCollision", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Avoid Collision", "");
+
+ prop= RNA_def_property(srna, "boids", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_ACOLL_WITH_BOIDS);
+ RNA_def_property_ui_text(prop, "Boids", "Avoid collision with other boids.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "deflectors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_ACOLL_WITH_DEFLECTORS);
+ RNA_def_property_ui_text(prop, "Deflectors", "Avoid collision with deflector objects.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "look_ahead", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Look ahead", "Time to look ahead in seconds.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule_follow_leader(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleFollowLeader", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Follow Leader", "");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "ob");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Follow this object instead of a boid.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset_deps");
+
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Distance", "Distance behind leader to follow.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "queue_size", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Queue Size", "How many boids in a line.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "line", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BRULE_LEADER_IN_LINE);
+ RNA_def_property_ui_text(prop, "Line", "Follow leader in a line.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule_average_speed(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleAverageSpeed", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Average Speed", "");
+
+ prop= RNA_def_property(srna, "wander", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Wander", "How fast velocity's direction is randomized.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "level", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Level", "How much velocity's z-component is kept constant.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Speed", "Percentage of maximum speed.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule_fight(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "BoidRuleFight", "BoidRule");
+ RNA_def_struct_ui_text(srna, "Fight", "");
+
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Fight Distance", "Attack boids at max this distance.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "flee_distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Flee Distance", "Flee to this distance.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+static void rna_def_boidrule(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* data */
+ srna= RNA_def_struct(brna, "BoidRule", NULL);
+ RNA_def_struct_ui_text(srna , "Boid Rule", "");
+ RNA_def_struct_refine_func(srna, "rna_BoidRule_refine");
+ RNA_def_struct_path_func(srna, "rna_BoidRule_path");
+
+ /* strings */
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "Boid rule name.");
+ RNA_def_struct_name_property(srna, prop);
+
+ /* enums */
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, boidrule_type_items);
+ RNA_def_property_ui_text(prop, "Type", "");
+
+ /* flags */
+ prop= RNA_def_property(srna, "in_air", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BOIDRULE_IN_AIR);
+ RNA_def_property_ui_text(prop, "In Air", "Use rule when boid is flying.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "on_land", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BOIDRULE_ON_LAND);
+ RNA_def_property_ui_text(prop, "On Land", "Use rule when boid is on land.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ //prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
+ //RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
+ //RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface.");
+
+ /* types */
+ rna_def_boidrule_goal(brna);
+ rna_def_boidrule_avoid(brna);
+ rna_def_boidrule_avoid_collision(brna);
+ rna_def_boidrule_follow_leader(brna);
+ rna_def_boidrule_average_speed(brna);
+ rna_def_boidrule_fight(brna);
+}
+
+static void rna_def_boidstate(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "BoidState", NULL);
+ RNA_def_struct_ui_text(srna, "Boid State", "Boid state for boid physics.");
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "Boid state name.");
+ RNA_def_struct_name_property(srna, prop);
+
+ prop= RNA_def_property(srna, "ruleset_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, boidruleset_type_items);
+ RNA_def_property_ui_text(prop, "Rule Evaluation", "How the rules in the list are evaluated.");
+
+ prop= RNA_def_property(srna, "rules", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidRule");
+ RNA_def_property_ui_text(prop, "Boid Rules", "");
+
+ prop= RNA_def_property(srna, "active_boid_rule", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidRule");
+ RNA_def_property_pointer_funcs(prop, "rna_BoidState_active_boid_rule_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Boid Rule", "");
+
+ prop= RNA_def_property(srna, "active_boid_rule_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_BoidState_active_boid_rule_index_get", "rna_BoidState_active_boid_rule_index_set", "rna_BoidState_active_boid_rule_index_range");
+ RNA_def_property_ui_text(prop, "Active Boid Rule Index", "");
+
+ prop= RNA_def_property(srna, "rule_fuzziness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Rule Fuzzines", "");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Volume", "");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_text(prop, "Falloff", "");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+static void rna_def_boid_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "BoidSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Boid Settings", "Settings for boid physics.");
+
+ prop= RNA_def_property(srna, "landing_smoothness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_text(prop, "Landing Smoothness", "How smoothly the boids land.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "banking", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 2.0);
+ RNA_def_property_ui_text(prop, "Banking", "Amount of rotation around velocity vector on turns.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 2.0);
+ RNA_def_property_ui_text(prop, "Height", "Boid height relative to particle size.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ /* states */
+ prop= RNA_def_property(srna, "states", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidState");
+ RNA_def_property_ui_text(prop, "Boid States", "");
+
+ prop= RNA_def_property(srna, "active_boid_state", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidRule");
+ RNA_def_property_pointer_funcs(prop, "rna_BoidSettings_active_boid_state_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Boid Rule", "");
+
+ prop= RNA_def_property(srna, "active_boid_state_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_BoidSettings_active_boid_state_index_get", "rna_BoidSettings_active_boid_state_index_set", "rna_BoidSettings_active_boid_state_index_range");
+ RNA_def_property_ui_text(prop, "Active Boid State Index", "");
+
+ /* character properties */
+ prop= RNA_def_property(srna, "health", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Health", "Initial boid health when born.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Strength", "Maximum caused damage on attack per second.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "aggression", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Aggression", "Boid will fight this times stronger enemy.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "accuracy", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Accuracy", "Accuracy of attack.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Range", "The maximum distance from which a boid can attack.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ /* physical properties */
+ prop= RNA_def_property(srna, "air_min_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Min Air Speed", "Minimum speed in air (relative to maximum speed).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "air_max_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Max Air Speed", "Maximum speed in air.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "air_max_acc", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Max Air Acceleration", "Maximum acceleration in air (relative to maximum speed).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "air_max_ave", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Max Air Angular Velocity", "Maximum angular velocity in air (relative to 180 degrees).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "air_personal_space", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_text(prop, "Air Personal Space", "Radius of boids personal space in air (% of particle size).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_jump_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Jump Speed", "Maximum speed for jumping.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_max_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 100.0);
+ RNA_def_property_ui_text(prop, "Max Land Speed", "Maximum speed on land.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_max_acc", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Max Land Acceleration", "Maximum acceleration on land (relative to maximum speed).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_max_ave", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Max Land Angular Velocity", "Maximum angular velocity on land (relative to 180 degrees).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_personal_space", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_text(prop, "Land Personal Space", "Radius of boids personal space on land (% of particle size).");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "land_stick_force", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Land Stick Force", "How strong a force must be to start effecting a boid on land.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ /* options */
+ prop= RNA_def_property(srna, "allow_flight", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_FLIGHT);
+ RNA_def_property_ui_text(prop, "Allow Flight", "Allow boids to move in air.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "allow_land", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_LAND);
+ RNA_def_property_ui_text(prop, "Allow Land", "Allow boids to move on land.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
+ prop= RNA_def_property(srna, "allow_climb", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "options", BOID_ALLOW_CLIMB);
+ RNA_def_property_ui_text(prop, "Allow Climbing", "Allow boids to climb goal objects.");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+}
+
+void RNA_def_boid(BlenderRNA *brna)
+{
+ rna_def_boidrule(brna);
+ rna_def_boidstate(brna);
+ rna_def_boid_settings(brna);
+}
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 90617d01833..15125795e01 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Contributor(s): Blender Foundation (2008), Juho Vepsäläinen
+ * Contributor(s): Blender Foundation (2008), Juho Veps�l�inen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -32,65 +32,84 @@
#include "DNA_brush_types.h"
#include "DNA_texture_types.h"
+#include "IMB_imbuf.h"
+
+EnumPropertyItem brush_sculpt_tool_items[] = {
+ {SCULPT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
+ {SCULPT_TOOL_SMOOTH, "SMOOTH", 0, "Smooth", ""},
+ {SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", ""},
+ {SCULPT_TOOL_INFLATE, "INFLATE", 0, "Inflate", ""},
+ {SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", ""},
+ {SCULPT_TOOL_LAYER, "LAYER", 0, "Layer", ""},
+ {SCULPT_TOOL_FLATTEN, "FLATTEN", 0, "Flatten", ""},
+ {SCULPT_TOOL_CLAY, "CLAY", 0, "Clay", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "BKE_texture.h"
+
static void rna_Brush_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Brush *brush= (Brush*)ptr->data;
- rna_iterator_array_begin(iter, (void*)brush->mtex, sizeof(MTex*), MAX_MTEX, NULL);
+ rna_iterator_array_begin(iter, (void*)brush->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
}
static PointerRNA rna_Brush_active_texture_get(PointerRNA *ptr)
{
- Brush *brush= (Brush*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, brush->mtex[(int)brush->texact]);
-}
+ Brush *br= (Brush*)ptr->data;
+ Tex *tex;
-static float rna_Brush_rotation_get(PointerRNA *ptr)
-{
- Brush *brush= (Brush*)ptr->data;
- const float conv = 57.295779506;
- return brush->rot * conv;
+ tex= (br->mtex[(int)br->texact])? br->mtex[(int)br->texact]->tex: NULL;
+ return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
}
-static void rna_Brush_rotation_set(PointerRNA *ptr, float v)
+static void rna_Brush_active_texture_set(PointerRNA *ptr, PointerRNA value)
{
- Brush *brush= (Brush*)ptr->data;
- const float conv = 0.017453293;
- brush->rot = v * conv;
+ Brush *br= (Brush*)ptr->data;
+ int act= br->texact;
+
+ if(br->mtex[act] && br->mtex[act]->tex)
+ id_us_min(&br->mtex[act]->tex->id);
+
+ if(value.data) {
+ if(!br->mtex[act])
+ br->mtex[act]= add_mtex();
+
+ br->mtex[act]->tex= value.data;
+ id_us_plus(&br->mtex[act]->tex->id);
+ }
+ else if(br->mtex[act]) {
+ MEM_freeN(br->mtex[act]);
+ br->mtex[act]= NULL;
+ }
}
#else
-void rna_def_brush(BlenderRNA *brna)
+static void rna_def_brush(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+
static EnumPropertyItem prop_blend_items[] = {
- {BRUSH_BLEND_MIX, "MIX", 0, "Mix", "Use mix blending mode while painting."},
- {BRUSH_BLEND_ADD, "ADD", 0, "Add", "Use add blending mode while painting."},
- {BRUSH_BLEND_SUB, "SUB", 0, "Subtract", "Use subtract blending mode while painting."},
- {BRUSH_BLEND_MUL, "MUL", 0, "Multiply", "Use multiply blending mode while painting."},
- {BRUSH_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."},
- {BRUSH_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use darken blending mode while painting."},
- {BRUSH_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting."},
- {BRUSH_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting."},
- {0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem prop_texture_mode_items[] = {
- {BRUSH_TEX_DRAG, "TEX_DRAG", 0, "Drag", ""},
- {BRUSH_TEX_TILE, "TEX_TILE", 0, "Tile", ""},
- {BRUSH_TEX_3D, "TEX_3D", 0, "3D", ""},
+ {IMB_BLEND_MIX, "MIX", 0, "Mix", "Use mix blending mode while painting."},
+ {IMB_BLEND_ADD, "ADD", 0, "Add", "Use add blending mode while painting."},
+ {IMB_BLEND_SUB, "SUB", 0, "Subtract", "Use subtract blending mode while painting."},
+ {IMB_BLEND_MUL, "MUL", 0, "Multiply", "Use multiply blending mode while painting."},
+ {IMB_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."},
+ {IMB_BLEND_DARKEN, "DARKEN", 0, "Darken", "Use darken blending mode while painting."},
+ {IMB_BLEND_ERASE_ALPHA, "ERASE_ALPHA", 0, "Erase Alpha", "Erase alpha while painting."},
+ {IMB_BLEND_ADD_ALPHA, "ADD_ALPHA", 0, "Add Alpha", "Add alpha while painting."},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem prop_sculpt_tool_items[] = {
- {SCULPT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
- {SCULPT_TOOL_SMOOTH, "SMOOTH", 0, "Smooth", ""},
- {SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", ""},
- {SCULPT_TOOL_INFLATE, "INFLATE", 0, "Inflate", ""},
- {SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", ""},
- {SCULPT_TOOL_LAYER, "LAYER", 0, "Layer", ""},
- {SCULPT_TOOL_FLATTEN, "FLATTEN", 0, "Flatten", ""},
- {0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_flip_direction_items[]= {
+ {0, "ADD", 0, "Add", "Add effect of brush"},
+ {BRUSH_DIR_IN, "SUBTRACT", 0, "Subtract", "Subtract effect of brush"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "Brush", "ID");
RNA_def_struct_ui_text(srna, "Brush", "Brush datablock for storing brush settings for painting and sculpting.");
RNA_def_struct_ui_icon(srna, ICON_BRUSH_DATA);
@@ -100,29 +119,37 @@ void rna_def_brush(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_blend_items);
RNA_def_property_ui_text(prop, "Blending mode", "Brush blending mode.");
- prop= RNA_def_property(srna, "texture_mode", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "tex_mode");
- RNA_def_property_enum_items(prop, prop_texture_mode_items);
- RNA_def_property_ui_text(prop, "Texture Mode", "");
-
prop= RNA_def_property(srna, "sculpt_tool", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_sculpt_tool_items);
+ RNA_def_property_enum_items(prop, brush_sculpt_tool_items);
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
+
+ prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, prop_flip_direction_items);
+ RNA_def_property_ui_text(prop, "Direction", "Mapping type to use for this image in the game engine.");
/* number values */
prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, 200);
RNA_def_property_ui_text(prop, "Size", "Diameter of the brush.");
- prop= RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "innerradius");
+ prop= RNA_def_property(srna, "jitter", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "jitter");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Falloff", "Falloff radius of the brush.");
-
+ RNA_def_property_ui_text(prop, "Jitter", "Jitter the position of the brush while painting.");
+
prop= RNA_def_property(srna, "spacing", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spacing");
RNA_def_property_range(prop, 1.0f, 100.0f);
RNA_def_property_ui_text(prop, "Spacing", "Spacing between brush stamps.");
+
+ prop= RNA_def_property(srna, "smooth_stroke_radius", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 10, 200);
+ RNA_def_property_ui_text(prop, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues.");
+
+ prop= RNA_def_property(srna, "smooth_stroke_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.5, 0.99);
+ RNA_def_property_ui_text(prop, "Smooth Stroke Factor", "Higher values give a smoother stroke.");
prop= RNA_def_property(srna, "rate", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rate");
@@ -138,63 +165,67 @@ void rna_def_brush(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Strength", "The amount of pressure on the brush.");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "rot");
- RNA_def_property_range(prop, 0, 360);
- RNA_def_property_float_funcs(prop, "rna_Brush_rotation_get", "rna_Brush_rotation_set", NULL);
- RNA_def_property_ui_text(prop, "Rotation", "Angle of the brush texture.");
-
/* flag */
- prop= RNA_def_property(srna, "airbrush", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_airbrush", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_AIRBRUSH);
RNA_def_property_ui_text(prop, "Airbrush", "Keep applying paint effect while holding mouse (spray).");
- prop= RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TORUS);
RNA_def_property_ui_text(prop, "Wrap", "Enable torus wrapping while painting.");
- prop= RNA_def_property(srna, "alpha_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_strength_pressure", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ALPHA_PRESSURE);
- RNA_def_property_ui_text(prop, "Opacity Pressure", "Enable tablet pressure sensitivity for opacity.");
+ RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
+ RNA_def_property_ui_text(prop, "Strength Pressure", "Enable tablet pressure sensitivity for strength.");
- prop= RNA_def_property(srna, "size_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_size_pressure", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SIZE_PRESSURE);
+ RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
RNA_def_property_ui_text(prop, "Size Pressure", "Enable tablet pressure sensitivity for size.");
- prop= RNA_def_property(srna, "falloff_pressure", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RAD_PRESSURE);
- RNA_def_property_ui_text(prop, "Falloff Pressure", "Enable tablet pressure sensitivity for falloff.");
-
- prop= RNA_def_property(srna, "spacing_pressure", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_jitter_pressure", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_JITTER_PRESSURE);
+ RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
+ RNA_def_property_ui_text(prop, "Jitter Pressure", "Enable tablet pressure sensitivity for jitter.");
+
+ prop= RNA_def_property(srna, "use_spacing_pressure", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACING_PRESSURE);
+ RNA_def_property_ui_icon(prop, ICON_STYLUS_PRESSURE, 0);
RNA_def_property_ui_text(prop, "Spacing Pressure", "Enable tablet pressure sensitivity for spacing.");
- prop= RNA_def_property(srna, "rake", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_rake", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_RAKE);
RNA_def_property_ui_text(prop, "Rake", "Rotate the brush texture to match the stroke direction.");
- prop= RNA_def_property(srna, "anchored", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_anchor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ANCHORED);
RNA_def_property_ui_text(prop, "Anchored", "Keep the brush anchored to the initial location.");
- prop= RNA_def_property(srna, "flip_direction", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_DIR_IN);
- RNA_def_property_ui_text(prop, "Flip Direction", "Move vertices in the opposite direction.");
-
- prop= RNA_def_property(srna, "space", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_space", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SPACE);
RNA_def_property_ui_text(prop, "Space", "Limit brush application to the distance specified by spacing.");
+
+ prop= RNA_def_property(srna, "use_smooth_stroke", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_SMOOTH_STROKE);
+ RNA_def_property_ui_text(prop, "Smooth Stroke", "Brush lags behind mouse and follows a smoother path.");
+
+ prop= RNA_def_property(srna, "use_persistent", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_PERSISTENT);
+ RNA_def_property_ui_text(prop, "Persistent", "Sculpts on a persistent layer of the mesh.");
/* not exposed in the interface yet
prop= RNA_def_property(srna, "fixed_tex", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FIXED_TEX);
RNA_def_property_ui_text(prop, "Fixed Texture", "Keep texture origin in fixed position.");*/
- prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve.");
/* texture */
- rna_def_mtex_common(srna, "rna_Brush_mtex_begin", "rna_Brush_active_texture_get", "TextureSlot");
+ rna_def_mtex_common(srna, "rna_Brush_mtex_begin", "rna_Brush_active_texture_get",
+ "rna_Brush_active_texture_set", "TextureSlot");
/* clone tool */
prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE);
@@ -207,7 +238,7 @@ void rna_def_brush(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Clone Opacity", "Opacity of clone image display.");
- prop= RNA_def_property(srna, "clone_offset", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "clone_offset", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "clone.offset");
RNA_def_property_ui_text(prop, "Clone Offset", "");
RNA_def_property_ui_range(prop, -1.0f , 1.0f, 10.0f, 3);
@@ -232,12 +263,12 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna)
srna= RNA_def_struct(brna, "OperatorStrokeElement", "IDPropertyGroup");
RNA_def_struct_ui_text(srna, "Operator Stroke Element", "");
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Location", "");
- prop= RNA_def_property(srna, "mouse", PROP_INT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "mouse", PROP_FLOAT, PROP_XYZ);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Mouse", "");
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index 4814f9583a9..eaf647e02a2 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -62,7 +62,7 @@ void RNA_def_camera(BlenderRNA *brna)
/* Number values */
- prop= RNA_def_property(srna, "passepartout_alpha", PROP_FLOAT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "passepartout_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "passepartalpha");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Passepartout Alpha", "Opacity (alpha) of the darkened overlay in Camera view.");
@@ -153,6 +153,11 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_lens_unit_items);
RNA_def_property_ui_text(prop, "Lens Unit", "Unit to edit lens in for the user interface.");
+ prop= RNA_def_property(srna, "panorama", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_PANORAMA);
+ RNA_def_property_ui_text(prop, "Panorama", "Render the scene with a cylindrical camera for pseudo-fisheye lens effects.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
/* pointers */
rna_def_animdata_common(srna);
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 361c1b61303..22cc2e2c9c3 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -34,9 +34,25 @@
#include "BKE_modifier.h"
#include "DNA_cloth_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
#ifdef RNA_RUNTIME
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+
+static void rna_cloth_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+}
+
static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
{
ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
@@ -136,7 +152,7 @@ static char *rna_ClothSettings_path(PointerRNA *ptr)
Object *ob= (Object*)ptr->id.data;
ModifierData *md= modifiers_findByType(ob, eModifierType_Cloth);
- return BLI_sprintfN("modifiers[%s].settings", md->name);
+ return md ? BLI_sprintfN("modifiers[%s].settings", md->name) : NULL;
}
static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
@@ -144,7 +160,7 @@ static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
Object *ob= (Object*)ptr->id.data;
ModifierData *md= modifiers_findByType(ob, eModifierType_Cloth);
- return BLI_sprintfN("modifiers[%s].collision_settings", md->name);
+ return md ? BLI_sprintfN("modifiers[%s].collision_settings", md->name) : NULL;
}
#else
@@ -165,42 +181,56 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "mingoal");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxgoal");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "defgoal");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalspring");
RNA_def_property_range(prop, 0.0f, 0.999f);
RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalfrict");
RNA_def_property_range(prop, 0.0f, 50.0f);
RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+ prop= RNA_def_property(srna, "internal_friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "velocity_smooth");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Internal Friction", "");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
/* mass */
prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "mass_vertex_group", 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 fine control over mass distribution.");
+ RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
- prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -100.0, 100.0);
RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
/* various */
@@ -208,61 +238,73 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "Cvi");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "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", "Define forces for vertices to stick to animated position.");
+ 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");
prop= RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalspring");
RNA_def_property_range(prop, 0.0f, 50.0);
RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
RNA_def_property_range(prop, 4, 80);
- RNA_def_property_ui_text(prop, "Quality", "Quality of the simulation in steps per frame (higher is better quality but slower).");
+ RNA_def_property_ui_text(prop, "Quality", "Quality of the simulation in steps per frame. (higher is better quality but slower)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
/* springs */
prop= RNA_def_property(srna, "stiffness_scaling", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
RNA_def_property_ui_text(prop, "Stiffness Scaling", "If enabled, stiffness can be scaled along a weight painted vertex group.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "Cdis");
RNA_def_property_range(prop, 0.0f, 50.0f);
- RNA_def_property_ui_text(prop, "Spring Damping", "Damping of cloth velocity (higher = more smooth, less jiggling)");
+ RNA_def_property_ui_text(prop, "Spring Damping", "Damping of cloth velocity. (higher = more smooth, less jiggling)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "structural");
RNA_def_property_range(prop, 1.0f, 10000.0f);
RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max_struct");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "structural_stiffness_vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get", "rna_ClothSettings_struct_vgroup_length", "rna_ClothSettings_struct_vgroup_set");
RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group", "Vertex group for fine control over structural stiffness.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bending");
RNA_def_property_range(prop, 0.0f, 10000.0f);
- RNA_def_property_ui_text(prop, "Bending Stiffness", "Wrinkle coefficient (higher = less smaller but more big wrinkles).");
+ RNA_def_property_ui_text(prop, "Bending Stiffness", "Wrinkle coefficient. (higher = less smaller but more big wrinkles)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max_bend");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "bending_vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length", "rna_ClothSettings_bend_vgroup_set");
RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group", "Vertex group for fine control over bending stiffness.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
/* unused */
@@ -323,40 +365,48 @@ static void rna_def_cloth_collision_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "enable_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "epsilon");
RNA_def_property_range(prop, 0.001f, 1.0f);
- RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance between collision objects before collision response takes in, can be changed for each frame.");
+ RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance between collision objects before collision response takes in.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 80.0f);
- RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened (0=movement not changed, 100=no movement left)");
+ RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened. (higher = less movement)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "loop_count");
RNA_def_property_range(prop, 1, 20);
RNA_def_property_ui_text(prop, "Collision Quality", "How many collision iterations should be done. (higher is better quality but slower)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
/* self collision */
prop= RNA_def_property(srna, "enable_self_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "self_min_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
RNA_def_property_range(prop, 0.5f, 1.0f);
- RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
+ RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 80.0f);
RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact.");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
prop= RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
RNA_def_property_range(prop, 1, 10);
- RNA_def_property_ui_text(prop, "Self Collision Quality", "How many self collision iterations should be done. (higher is better quality but slower), can be changed for each frame.");
+ RNA_def_property_ui_text(prop, "Self Collision Quality", "How many self collision iterations should be done. (higher is better quality but slower)");
+ RNA_def_property_update(prop, 0, "rna_cloth_update");
}
void RNA_def_cloth(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 179808ab66d..4cef6fa481f 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -50,7 +50,7 @@ static void rna_CurveMapping_curves_begin(CollectionPropertyIterator *iter, Poin
{
CurveMapping *cumap= (CurveMapping*)ptr->data;
- rna_iterator_array_begin(iter, cumap->cm, sizeof(CurveMap), rna_CurveMapping_curves_length(ptr), NULL);
+ rna_iterator_array_begin(iter, cumap->cm, sizeof(CurveMap), rna_CurveMapping_curves_length(ptr), 0, NULL);
}
static void rna_CurveMapping_clip_set(PointerRNA *ptr, int value)
@@ -130,7 +130,7 @@ static void rna_def_curvemappoint(BlenderRNA *brna)
/* not editable for now, need to have CurveMapping to do curvemapping_changed */
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "x");
RNA_def_property_array(prop, 2);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -216,13 +216,15 @@ static void rna_def_curvemapping(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "CurveMap");
RNA_def_property_ui_text(prop, "Curves", "");
- prop= RNA_def_property(srna, "black_level", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "black_level", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "black");
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Black Level", "For RGB curves, the color that black is mapped to");
RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_black_level_set", NULL);
- prop= RNA_def_property(srna, "white_level", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "white_level", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "white");
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "White Level", "For RGB curves, the color that white is mapped to");
RNA_def_property_float_funcs(prop, NULL, "rna_CurveMapping_white_level_set", NULL);
}
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 8200a21f4ac..b630e61a680 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -33,41 +33,66 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ED_object.h"
#include "WM_types.h"
EnumPropertyItem constraint_type_items[] ={
{CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", 0, "Child Of", ""},
{CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", 0, "Transformation", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", 0, "Copy Location", ""},
{CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", 0, "Copy Rotation", ""},
{CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", 0, "Copy Scale", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", 0, "Limit Location", ""},
{CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", 0, "Limit Rotation", ""},
{CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", 0, "Limit Scale", ""},
{CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", 0, "Limit Distance", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", 0, "Track To", ""},
{CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", 0, "Locked Track", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_MINMAX, "FLOOR", 0, "Floor", ""},
{CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", 0, "Shrinkwrap", ""},
{CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", 0, "Follow Path", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", 0, "Clamp To", ""},
{CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", 0, "Stretch To", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_KINEMATIC, "IK", 0, "IK", ""},
{CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", 0, "Rigid Body Joint", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_ACTION, "ACTION", 0, "Action", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_PYTHON, "SCRIPT", 0, "Script", ""},
-
+ {0, "", 0, NULL, NULL},
{CONSTRAINT_TYPE_NULL, "NULL", 0, "Null", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem space_pchan_items[] = {
+ {0, "WORLD", 0, "World Space", ""},
+ {2, "POSE", 0, "Pose Space", ""},
+ {3, "LOCAL_WITH_PARENT", 0, "Local With Parent", ""},
+ {1, "LOCAL", 0, "Local Space", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem space_object_items[] = {
+ {0, "WORLD", 0, "World Space", ""},
+ {1, "LOCAL", 0, "Local (Without Parent) Space", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem constraint_ik_type_items[] ={
+ {CONSTRAINT_IK_COPYPOSE, "COPY_POSE", 0, "Copy Pose", ""},
+ {CONSTRAINT_IK_DISTANCE, "DISTANCE", 0, "Distance", ""},
+ {0, NULL, 0, NULL, NULL},
+};
+
+static EnumPropertyItem constraint_distance_items[] = {
+ {LIMITDIST_INSIDE, "LIMITDIST_INSIDE", 0, "Inside", ""},
+ {LIMITDIST_OUTSIDE, "LIMITDIST_OUTSIDE", 0, "Outside", ""},
+ {LIMITDIST_ONSURFACE, "LIMITDIST_ONSURFACE", 0, "On Surface", ""},
+ {0, NULL, 0, NULL, NULL}
+};
#ifdef RNA_RUNTIME
@@ -78,7 +103,7 @@ EnumPropertyItem constraint_type_items[] ={
#include "ED_object.h"
-StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
+static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
{
bConstraint *con= (bConstraint*)ptr->data;
@@ -130,30 +155,31 @@ StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr)
static char *rna_Constraint_path(PointerRNA *ptr)
{
- return BLI_sprintfN("constraints[%s]", ((bConstraint*)ptr->data)->name);
+ Object *ob= ptr->id.data;
+ bConstraint *con= ptr->data;
+ bPoseChannel *pchan= get_active_posechannel(ob);
+ ListBase *actlist= get_active_constraints(ob);
+ short inList = 0;
+
+ /* check if constraint is in the given list */
+ if (actlist)
+ inList= (BLI_findindex(actlist, con) != -1);
+
+ /* if constraint is in the list, the list is for the active bone... */
+ if ((inList) && (actlist != &ob->constraints) && (pchan))
+ return BLI_sprintfN("pose.pose_channels[\"%s\"].constraints[\"%s\"]", pchan->name, con->name);
+ else
+ return BLI_sprintfN("constraints[\"%s\"]", con->name);
}
static void rna_Constraint_update(bContext *C, PointerRNA *ptr)
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= ptr->id.data;
-
- if(ob->pose) update_pose_constraint_flags(ob->pose);
-
- object_test_constraints(ob);
-
- if(ob->type==OB_ARMATURE) DAG_object_flush_update(scene, ob, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+ ED_object_constraint_update(ptr->id.data);
}
static void rna_Constraint_dependency_update(bContext *C, PointerRNA *ptr)
{
- Object *ob= ptr->id.data;
-
- rna_Constraint_update(C, ptr);
-
- if(ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
- DAG_scene_sort(CTX_data_scene(C));
+ ED_object_constraint_dependency_update(CTX_data_scene(C), ptr->id.data);
}
static void rna_Constraint_influence_update(bContext *C, PointerRNA *ptr)
@@ -166,22 +192,42 @@ static void rna_Constraint_influence_update(bContext *C, PointerRNA *ptr)
rna_Constraint_update(C, ptr);
}
-static EnumPropertyItem space_pchan_items[] = {
- {0, "WORLD", 0, "World Space", ""},
- {2, "POSE", 0, "Pose Space", ""},
- {3, "LOCAL_WITH_PARENT", 0, "Local With Parent", ""},
- {1, "LOCAL", 0, "Local Space", ""},
- {0, NULL, 0, NULL, NULL}};
-
-static EnumPropertyItem space_object_items[] = {
- {0, "WORLD", 0, "World Space", ""},
- {1, "LOCAL", 0, "Local (Without Parent) Space", ""},
- {0, NULL, 0, NULL, NULL}};
+static void rna_Constraint_ik_type_set(struct PointerRNA *ptr, int value)
+{
+ bConstraint *con = ptr->data;
+ bKinematicConstraint *ikdata = con->data;
+
+ if (ikdata->type != value) {
+ // the type of IK constraint has changed, set suitable default values
+ // in case constraints reuse same fields incompatible
+ switch (value) {
+ case CONSTRAINT_IK_COPYPOSE:
+ break;
+ case CONSTRAINT_IK_DISTANCE:
+ break;
+ }
+ ikdata->type = value;
+ }
+}
-static EnumPropertyItem *rna_Constraint_owner_space_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *C, PointerRNA *ptr, int *free)
{
Object *ob= (Object*)ptr->id.data;
bConstraint *con= (bConstraint*)ptr->data;
+
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, space_object_items);
+ RNA_enum_items_add(&item, &totitem, space_pchan_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
if(BLI_findindex(&ob->constraints, con) == -1)
return space_pchan_items;
@@ -189,13 +235,27 @@ static EnumPropertyItem *rna_Constraint_owner_space_itemf(PointerRNA *ptr)
return space_object_items;
}
-static EnumPropertyItem *rna_Constraint_target_space_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_Constraint_target_space_itemf(bContext *C, PointerRNA *ptr, int *free)
{
bConstraint *con= (bConstraint*)ptr->data;
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
bConstraintTarget *ct;
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, space_object_items);
+ RNA_enum_items_add(&item, &totitem, space_pchan_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
if(cti && cti->get_constraint_targets) {
cti->get_constraint_targets(con, &targets);
@@ -213,6 +273,22 @@ static EnumPropertyItem *rna_Constraint_target_space_itemf(PointerRNA *ptr)
return space_object_items;
}
+static void rna_ActionConstraint_minmax_range(PointerRNA *ptr, float *min, float *max)
+{
+ bConstraint *con= (bConstraint*)ptr->data;
+ bActionConstraint *acon = (bActionConstraint *)con->data;
+
+ /* 0, 1, 2 = magic numbers for rotX, rotY, rotZ */
+ if (ELEM3(acon->type, 0, 1, 2)) {
+ *min= -90.f;
+ *max= 90.f;
+ } else {
+ *min= -1000.f;
+ *max= 1000.f;
+ }
+}
+
+
#else
static void rna_def_constrainttarget(BlenderRNA *brna)
@@ -375,7 +451,7 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pole Sub-Target", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "pole_angle", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "pole_angle", PROP_FLOAT, PROP_ANGLE); // XXX - todo, convert to rad
RNA_def_property_float_sdna(prop, NULL, "poleangle");
RNA_def_property_range(prop, 0.0, 180.f);
RNA_def_property_ui_text(prop, "Pole Angle", "Pole rotation offset.");
@@ -400,21 +476,40 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
prop= RNA_def_property(srna, "tail", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_IK_TIP);
RNA_def_property_ui_text(prop, "Use Tail", "Include bone's tail as last element in chain.");
- RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
prop= RNA_def_property(srna, "rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_IK_ROT);
RNA_def_property_ui_text(prop, "Rotation", "Chain follows rotation of target.");
- RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
prop= RNA_def_property(srna, "targetless", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_IK_AUTO);
RNA_def_property_ui_text(prop, "Targetless", "Use targetless IK.");
- RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
prop= RNA_def_property(srna, "stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_IK_STRETCH);
RNA_def_property_ui_text(prop, "Stretch", "Enable IK Stretching.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ prop= RNA_def_property(srna, "ik_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Constraint_ik_type_set", NULL);
+ RNA_def_property_enum_items(prop, constraint_ik_type_items);
+ RNA_def_property_ui_text(prop, "IK Type", "");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ prop= RNA_def_property(srna, "limit_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, constraint_distance_items);
+ RNA_def_property_ui_text(prop, "Limit Mode", "Distances in relation to sphere of influence to allow.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
+
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dist");
+ RNA_def_property_range(prop, 0.0, 100.f);
+ RNA_def_property_ui_text(prop, "Distance", "Radius of limiting sphere.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}
@@ -535,10 +630,8 @@ static void rna_def_constraint_locate_like(BlenderRNA *brna)
srna= RNA_def_struct(brna, "CopyLocationConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Copy Location Constraint", "Copies the location of the target.");
- RNA_def_struct_sdna(srna, "bConstraint");
-
- prop= RNA_def_property(srna, "head_tail", PROP_FLOAT, PROP_PERCENTAGE);
- RNA_def_property_float_sdna(prop, NULL, "headtail");
+ 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");
@@ -637,7 +730,7 @@ static void rna_def_constraint_minmax(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Rotation", "Use the target's rotation to determine floor.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0.0, 100.f);
RNA_def_property_ui_text(prop, "Offset", "Offset of floor from object center.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -691,15 +784,15 @@ static void rna_def_constraint_action(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem transform_channel_items[] = {
- {00, "ROTATION_X", 0, "Rotation X", ""},
- {01, "ROTATION_Y", 0, "Rotation Y", ""},
- {02, "ROTATION_Z", 0, "Rotation Z", ""},
- {10, "SIZE_X", 0, "Scale X", ""},
- {11, "SIZE_Y", 0, "Scale Y", ""},
- {12, "SIZE_Z", 0, "Scale Z", ""},
{20, "LOCATION_X", 0, "Location X", ""},
{21, "LOCATION_Y", 0, "Location Y", ""},
{22, "LOCATION_Z", 0, "Location Z", ""},
+ {00, "ROTATION_X", 0, "Rotation X", ""},
+ {01, "ROTATION_Y", 0, "Rotation Y", ""},
+ {02, "ROTATION_Z", 0, "Rotation Z", ""},
+ {10, "SCALE_X", 0, "Scale X", ""},
+ {11, "SCALE_Y", 0, "Scale Y", ""},
+ {12, "SCALE_Z", 0, "Scale Z", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ActionConstraint", "Constraint");
@@ -729,29 +822,31 @@ static void rna_def_constraint_action(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "start");
- RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+ RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_ui_text(prop, "Start Frame", "First frame of the Action to use.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+ RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_ui_text(prop, "End Frame", "Last frame of the Action to use.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max");
- RNA_def_property_range(prop, 0.0, 1000.f);
+ RNA_def_property_range(prop, -1000.f, 1000.f);
RNA_def_property_ui_text(prop, "Maximum", "Maximum value for target channel range.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_ActionConstraint_minmax_range");
prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min");
- RNA_def_property_range(prop, 0.0, 1000.f);
+ RNA_def_property_range(prop, -1000.f, 1000.f);
RNA_def_property_ui_text(prop, "Minimum", "Minimum value for target channel range.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_ActionConstraint_minmax_range");
}
static void rna_def_constraint_locked_track(BlenderRNA *brna)
@@ -832,10 +927,16 @@ 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_NONE);
- RNA_def_property_range(prop, -300000.0, 300000.f);
+ prop= RNA_def_property(srna, "offset", PROP_INT, 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");
+
+ prop= RNA_def_property(srna, "offset_factor", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "offset"); // XXX we might be better with another var or some hackery?
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Offset Factor", "Percentage value defining target position along length of bone.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "forward", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
@@ -849,10 +950,21 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Up Axis", "Axis that points upward.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "curve_follow", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "followflag", 1);
+ prop= RNA_def_property(srna, "use_curve_follow", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "followflag", FOLLOWPATH_FOLLOW);
RNA_def_property_ui_text(prop, "Follow Curve", "Object will follow the heading and banking of the curve.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ // TODO: do we need to do some special trickery to get offset sane for this?
+ prop= RNA_def_property(srna, "use_fixed_position", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "followflag", FOLLOWPATH_STATIC);
+ RNA_def_property_ui_text(prop, "Fixed Position", "Object will stay locked to a single point somewhere along the length of the curve regardless of time.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_curve_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "followflag", FOLLOWPATH_RADIUS);
+ RNA_def_property_ui_text(prop, "Curve Radius", "Objects scale by the curve radius.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}
static void rna_def_constraint_stretch_to(BlenderRNA *brna)
@@ -881,6 +993,11 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Target", "Target Object");
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, "subtarget", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "subtarget");
+ RNA_def_property_ui_text(prop, "Sub-Target", "");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
prop= RNA_def_property(srna, "volume", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "volmode");
@@ -894,7 +1011,7 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Keep Axis", "Axis to maintain during stretch.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "original_length", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "original_length", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "orglength");
RNA_def_property_range(prop, 0.0, 100.f);
RNA_def_property_ui_text(prop, "Original Length", "Length at rest position.");
@@ -939,37 +1056,37 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pivot Type", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "pivot_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "pivot_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "pivX");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Pivot X", "Offset pivot on X.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "pivot_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "pivot_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "pivY");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Pivot Y", "Offset pivot on Y.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "pivot_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "pivot_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "pivZ");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Pivot Z", "Offset pivot on Z.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "axis_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "axis_x", PROP_FLOAT, PROP_ANGLE); // XXX - convert to radians
RNA_def_property_float_sdna(prop, NULL, "axX");
RNA_def_property_range(prop, -360.0, 360.f);
RNA_def_property_ui_text(prop, "Axis X", "Rotate pivot on X axis in degrees.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "axis_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "axis_y", PROP_FLOAT, PROP_ANGLE); // XXX - convert to radians
RNA_def_property_float_sdna(prop, NULL, "axY");
RNA_def_property_range(prop, -360.0, 360.f);
RNA_def_property_ui_text(prop, "Axis Y", "Rotate pivot on Y axis in degrees.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "axis_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "axis_z", PROP_FLOAT, PROP_ANGLE); // XXX - convert to radians
RNA_def_property_float_sdna(prop, NULL, "axZ");
RNA_def_property_range(prop, -360.0, 360.f);
RNA_def_property_ui_text(prop, "Axis Z", "Rotate pivot on Z axis in degrees.");
@@ -1091,73 +1208,73 @@ static void rna_def_constraint_transform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Extrapolate Motion", "Extrapolate ranges.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_min_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_min_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_min[0]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Minimum X", "Bottom range of X axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_min_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_min_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_min[1]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Minimum Y", "Bottom range of Y axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_min_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_min_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_min[2]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Minimum Z", "Bottom range of Z axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_max_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_max_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_max[0]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Maximum X", "Top range of X axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_max_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_max_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_max[1]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Maximum Y", "Top range of Y axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "from_max_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "from_max_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "from_max[2]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "From Maximum Z", "Top range of Z axis source motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_min_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_min_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_min[0]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Minimum X", "Bottom range of X axis destination motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_min_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_min_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_min[1]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Minimum Y", "Bottom range of Y axis destination motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_min_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_min_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_min[2]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Minimum Z", "Bottom range of Z axis destination motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_max_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_max_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_max[0]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Maximum X", "Top range of X axis destination motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_max_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_max_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_max[1]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Maximum Y", "Top range of Y axis destination motion.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "to_max_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "to_max_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "to_max[2]");
RNA_def_property_range(prop, 0.0, 1000.f);
RNA_def_property_ui_text(prop, "To Maximum Z", "Top range of Z axis destination motion.");
@@ -1203,37 +1320,37 @@ static void rna_def_constraint_location_limit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Maximum Z", "Use the maximum Z value.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "xmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "ymin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "zmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Z", "Lowest Z value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "xmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "ymax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "zmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow.");
@@ -1269,37 +1386,37 @@ static void rna_def_constraint_rotation_limit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Limit Z", "Use the minimum Z value.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "xmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "ymin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "minimum_z", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "zmin");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Minimum Z", "Lowest Z value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "xmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "ymax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "maximum_z", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "zmax");
RNA_def_property_range(prop, -1000.0, 1000.f);
RNA_def_property_ui_text(prop, "Maximum Z", "Highest Z value to allow.");
@@ -1397,12 +1514,6 @@ static void rna_def_constraint_distance_limit(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem distance_items[] = {
- {LIMITDIST_INSIDE, "LIMITDIST_INSIDE", 0, "Inside", ""},
- {LIMITDIST_OUTSIDE, "LIMITDIST_OUTSIDE", 0, "Outside", ""},
- {LIMITDIST_ONSURFACE, "LIMITDIST_ONSURFACE", 0, "On Surface", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "LimitDistanceConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Limit Distance Constraint", "Limits the distance from target object.");
RNA_def_struct_sdna_from(srna, "bDistLimitConstraint", "data");
@@ -1418,7 +1529,7 @@ static void rna_def_constraint_distance_limit(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub-Target", "");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "dist");
RNA_def_property_range(prop, 0.0, 100.f);
RNA_def_property_ui_text(prop, "Distance", "Radius of limiting sphere.");
@@ -1426,7 +1537,7 @@ static void rna_def_constraint_distance_limit(BlenderRNA *brna)
prop= RNA_def_property(srna, "limit_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "mode");
- RNA_def_property_enum_items(prop, distance_items);
+ RNA_def_property_enum_items(prop, constraint_distance_items);
RNA_def_property_ui_text(prop, "Limit Mode", "Distances in relation to sphere of influence to allow.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}
@@ -1458,7 +1569,7 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shrinkwrap Type", "Selects type of shrinkwrap algorithm for target position");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "dist");
RNA_def_property_range(prop, 0.0, 100.f);
RNA_def_property_ui_text(prop, "Distance", "Distance to Target.");
@@ -1507,11 +1618,13 @@ void RNA_def_constraint(BlenderRNA *brna)
prop= RNA_def_property(srna, "owner_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ownspace");
+ RNA_def_property_enum_items(prop, space_pchan_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Constraint_owner_space_itemf");
RNA_def_property_ui_text(prop, "Owner Space", "Space that owner is evaluated in.");
prop= RNA_def_property(srna, "target_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "tarspace");
+ RNA_def_property_enum_items(prop, space_pchan_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Constraint_target_space_itemf");
RNA_def_property_ui_text(prop, "Target Space", "Space that target is evaluated in.");
@@ -1537,12 +1650,23 @@ void RNA_def_constraint(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Proxy Local", "Constraint was added in this proxy instance (i.e. did not belong to source Armature).");
/* values */
- prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "enforce");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Influence", "Amount of influence constraint will have on the final solution.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_influence_update");
-
+
+ /* readonly values */
+ prop= RNA_def_property(srna, "lin_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "lin_error");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Lin error", "Amount of residual error in Blender space unit for constraints that work on position.");
+
+ prop= RNA_def_property(srna, "rot_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rot_error");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Rot error", "Amount of residual error in radiant for constraints that work on orientation.");
+
/* pointers */
rna_def_constrainttarget(brna);
diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c
index 07a50235733..7239fc1ff3d 100644
--- a/source/blender/makesrna/intern/rna_context.c
+++ b/source/blender/makesrna/intern/rna_context.c
@@ -25,26 +25,27 @@
#include <stdlib.h>
#include "DNA_ID.h"
+#include "DNA_userdef_types.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
-#ifdef RNA_RUNTIME
-
#include "BKE_context.h"
+#ifdef RNA_RUNTIME
+
static PointerRNA rna_Context_manager_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
return rna_pointer_inherit_refine(ptr, &RNA_WindowManager, CTX_wm_manager(C));
}
-/*static PointerRNA rna_Context_window_get(PointerRNA *ptr)
+static PointerRNA rna_Context_window_get(PointerRNA *ptr)
{
bContext *C= (bContext*)ptr->data;
return rna_pointer_inherit_refine(ptr, &RNA_Window, CTX_wm_window(C));
-}*/
+}
static PointerRNA rna_Context_screen_get(PointerRNA *ptr)
{
@@ -96,6 +97,25 @@ static PointerRNA rna_Context_scene_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_Scene, CTX_data_scene(C));
}
+static PointerRNA rna_Context_tool_settings_get(PointerRNA *ptr)
+{
+ bContext *C= (bContext*)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_ToolSettings, CTX_data_tool_settings(C));
+}
+
+static PointerRNA rna_Context_user_preferences_get(PointerRNA *ptr)
+{
+ PointerRNA newptr;
+ RNA_pointer_create(NULL, &RNA_UserPreferences, &U, &newptr);
+ return newptr;
+}
+
+static int rna_Context_mode_get(PointerRNA *ptr)
+{
+ bContext *C= (bContext*)ptr->data;
+ return CTX_data_mode_enum(C);
+}
+
#else
void RNA_def_context(BlenderRNA *brna)
@@ -103,6 +123,23 @@ void RNA_def_context(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem mode_items[] = {
+ {CTX_MODE_EDIT_MESH, "EDIT_MESH", 0, "Mesh Edit", ""},
+ {CTX_MODE_EDIT_CURVE, "EDIT_CURVE", 0, "Curve Edit", ""},
+ {CTX_MODE_EDIT_SURFACE, "EDIT_SURFACE", 0, "Surface Edit", ""},
+ {CTX_MODE_EDIT_TEXT, "EDIT_TEXT", 0, "Edit Edit", ""},
+ {CTX_MODE_EDIT_ARMATURE, "EDIT_ARMATURE", 0, "Armature Edit", ""}, // PARSKEL reuse will give issues
+ {CTX_MODE_EDIT_METABALL, "EDIT_METABALL", 0, "Metaball Edit", ""},
+ {CTX_MODE_EDIT_LATTICE, "EDIT_LATTICE", 0, "Lattice Edit", ""},
+ {CTX_MODE_POSE, "POSE", 0, "Pose ", ""},
+ {CTX_MODE_SCULPT, "SCULPT", 0, "Sculpt", ""},
+ {CTX_MODE_PAINT_WEIGHT, "PAINT_WEIGHT", 0, "Weight Paint", ""},
+ {CTX_MODE_PAINT_VERTEX, "PAINT_VERTEX", 0, "Vertex Paint", ""},
+ {CTX_MODE_PAINT_TEXTURE, "PAINT_TEXTURE", 0, "Texture Paint", ""},
+ {CTX_MODE_PARTICLE, "PARTICLE", 0, "Particle", ""},
+ {CTX_MODE_OBJECT, "OBJECT", 0, "Object", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "Context", NULL);
RNA_def_struct_ui_text(srna, "Context", "Current windowmanager and data context.");
RNA_def_struct_sdna(srna, "bContext");
@@ -113,10 +150,10 @@ void RNA_def_context(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "WindowManager");
RNA_def_property_pointer_funcs(prop, "rna_Context_manager_get", NULL, NULL);
- /* prop= RNA_def_property(srna, "window", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "window", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Window");
- RNA_def_property_pointer_funcs(prop, "rna_Context_window_get", NULL, NULL); */
+ RNA_def_property_pointer_funcs(prop, "rna_Context_window_get", NULL, NULL);
prop= RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -153,6 +190,21 @@ void RNA_def_context(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Scene");
RNA_def_property_pointer_funcs(prop, "rna_Context_scene_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_struct_type(prop, "ToolSettings");
+ RNA_def_property_pointer_funcs(prop, "rna_Context_tool_settings_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "user_preferences", PROP_POINTER, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_struct_type(prop, "UserPreferences");
+ RNA_def_property_pointer_funcs(prop, "rna_Context_user_preferences_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, mode_items);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_funcs(prop, "rna_Context_mode_get", NULL, NULL);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index 41a47e279e9..3b6bd2255f2 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -31,6 +31,11 @@
#include "DNA_curve_types.h"
#include "DNA_material_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_font.h"
+
+#include "WM_types.h"
EnumPropertyItem beztriple_handle_type_items[] = {
{HD_FREE, "FREE", 0, "Free", ""},
@@ -45,14 +50,24 @@ EnumPropertyItem beztriple_interpolation_mode_items[] = {
{BEZT_IPO_LIN, "LINEAR", 0, "Linear", ""},
{BEZT_IPO_BEZ, "BEZIER", 0, "Bezier", ""},
{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem beztriple_keyframe_type_items[] = {
+ {BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", 0, "Keyframe", ""},
+ {BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", 0, "Breakdown", ""},
+ {BEZT_KEYTYPE_EXTREME, "EXTREME", 0, "Extreme", ""},
+ {0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
#include "DNA_object_types.h"
#include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_main.h"
+
+#include "WM_api.h"
-StructRNA *rna_Curve_refine(PointerRNA *ptr)
+static StructRNA *rna_Curve_refine(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
short obtype= curve_type(cu);
@@ -62,6 +77,22 @@ StructRNA *rna_Curve_refine(PointerRNA *ptr)
else return &RNA_Curve;
}
+
+static PointerRNA rna_Curve_active_nurb_get(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->data;
+ Nurb *nu= NULL;
+
+ if(cu->editnurb)
+ nu = BLI_findlink(cu->editnurb, cu->actnu);
+
+ if(nu)
+ return rna_pointer_inherit_refine(ptr, &RNA_Nurb, nu);
+
+ return rna_pointer_inherit_refine(ptr, NULL, NULL);
+}
+
+
static void rna_BezTriple_handle1_get(PointerRNA *ptr, float *values)
{
BezTriple *bt= (BezTriple*)ptr->data;
@@ -129,18 +160,99 @@ static void rna_Curve_material_index_range(PointerRNA *ptr, int *min, int *max)
*max= cu->totcol-1;
}
+static void rna_Curve_active_textbox_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ *min= 0;
+ *max= cu->totbox-1;
+}
+
+
+static void rna_Curve_dimension_set(PointerRNA *ptr, int value)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Nurb *nu= cu->editnurb ? cu->editnurb->first : cu->nurb.first;
+
+ if(value==CU_3D) {
+ cu->flag |= CU_3D;
+ for( ; nu; nu= nu->next) {
+ nu->flag &= ~CU_2D;
+ }
+ }
+ else {
+ cu->flag &= ~CU_3D;
+ for( ; nu; nu= nu->next) {
+ nu->flag |= CU_2D;
+ test2DNurb(nu);
+
+ /* since the handles are moved they need to be auto-located again */
+ if(nu->type == CU_BEZIER)
+ calchandlesNurb(nu);
+ }
+ }
+}
+
+
+
static int rna_Nurb_length(PointerRNA *ptr)
{
Nurb *nu= (Nurb*)ptr->data;
return nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu;
}
+static void rna_Nurb_type_set(PointerRNA *ptr, int value)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+ nu->type = value;
+ // XXX - TODO change datatypes
+}
+
static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Nurb *nu= (Nurb*)ptr->data;
- rna_iterator_array_begin(iter, (void*)nu->bp, sizeof(BPoint*), nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu, NULL);
+ rna_iterator_array_begin(iter, (void*)nu->bp, sizeof(BPoint*), nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu, 0, NULL);
+}
+
+static void rna_Curve_update_data(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ DAG_id_flush_update(id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+}
+
+static void rna_Nurb_update_handle_data(bContext *C, PointerRNA *ptr)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+
+ if(nu->type == CU_BEZIER)
+ calchandlesNurb(nu);
+
+ rna_Curve_update_data(C, ptr);
+}
+
+static void rna_Nurb_update_knot_u(bContext *C, PointerRNA *ptr)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+
+ clamp_nurb_order_u(nu);
+ makeknots(nu, 1);
+
+ rna_Curve_update_data(C, ptr);
+}
+
+static void rna_Nurb_update_knot_v(bContext *C, PointerRNA *ptr)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+
+ clamp_nurb_order_v(nu);
+ makeknots(nu, 2);
+
+ rna_Curve_update_data(C, ptr);
}
+
+
#else
static void rna_def_bpoint(BlenderRNA *brna)
@@ -156,32 +268,38 @@ static void rna_def_bpoint(BlenderRNA *brna)
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f1", 0);
RNA_def_property_ui_text(prop, "Selected", "Selection status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
RNA_def_property_ui_text(prop, "Hidden", "Visibility status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Vector value */
- prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 4);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_ui_text(prop, "Point", "Point coordinates");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Number values */
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "alfa");
/*RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/
RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3d View");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.01f, 100.0f);
RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "bevel_radius", PROP_FLOAT, PROP_NONE);
+ 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_ui_text(prop, "Bevel Radius", "Radius for bevelling");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_beztriple(BlenderRNA *brna)
@@ -197,67 +315,85 @@ static void rna_def_beztriple(BlenderRNA *brna)
prop= RNA_def_property(srna, "selected_handle1", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f1", 0);
RNA_def_property_ui_text(prop, "Handle 1 selected", "Handle 1 selection status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "selected_handle2", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f3", 0);
RNA_def_property_ui_text(prop, "Handle 2 selected", "Handle 2 selection status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "selected_control_point", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "f2", 0);
RNA_def_property_ui_text(prop, "Control Point selected", "Control point selection status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "hide", 0);
RNA_def_property_ui_text(prop, "Hidden", "Visibility status");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Enums */
prop= RNA_def_property(srna, "handle1_type", PROP_ENUM, PROP_NONE);
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");
prop= RNA_def_property(srna, "handle2_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");
prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ipo");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_enum_items(prop, beztriple_interpolation_mode_items);
RNA_def_property_ui_text(prop, "Interpolation", "(For F-Curves Only) Interpolation to use for segment of curve starting from current BezTriple.");
+ //RNA_def_property_update(prop, 0, "rna_Curve_update_data"); // this should be an F-Curve update call instead...
+
+ prop= RNA_def_property(srna, "keyframe_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "hide");
+ RNA_def_property_enum_items(prop, beztriple_keyframe_type_items);
+ RNA_def_property_ui_text(prop, "Keyframe Type", "(For F-Curves only) The type of keyframe this control point defines.");
+ //RNA_def_property_update(prop, 0, "rna_Curve_update_data"); // this should be an F-Curve update call instead...
/* Vector values */
- prop= RNA_def_property(srna, "handle1", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "handle1", 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");
- prop= RNA_def_property(srna, "control_point", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "control_point", 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");
- prop= RNA_def_property(srna, "handle2", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "handle2", 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");
/* Number values */
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "alfa");
/*RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/
RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3d View");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.01f, 100.0f);
RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "bevel_radius", PROP_FLOAT, PROP_NONE);
+ 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_ui_text(prop, "Bevel Radius", "Radius for bevelling");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
@@ -269,23 +405,33 @@ static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_int_sdna(prop, NULL, "pathlen");
RNA_def_property_range(prop, 1, 32767);
RNA_def_property_ui_text(prop, "Path Length", "If no speed IPO was set, the length of path in frames.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* flags */
- prop= RNA_def_property(srna, "path", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_path", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_PATH);
RNA_def_property_ui_text(prop, "Path", "Enable the curve to become a translation path.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "follow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_path_follow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FOLLOW);
RNA_def_property_ui_text(prop, "Follow", "Make curve path children to rotate along the path.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "stretch", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STRETCH);
RNA_def_property_ui_text(prop, "Stretch", "Option for curve-deform: makes deformed child to stretch along entire path.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "offset_path_distance", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_time_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_OFFS_PATHDIST);
RNA_def_property_ui_text(prop, "Offset Path Distance", "Children will use TimeOffs value as path distance offset.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "use_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_PATH_RADIUS);
+ RNA_def_property_ui_text(prop, "Radius", "Option for paths: apply the curve radius with path following it and deforming.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna)
@@ -296,10 +442,12 @@ static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna)
prop= RNA_def_property(srna, "uv_orco", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
RNA_def_property_ui_text(prop, "UV Orco", "Forces to use UV coordinates for texture mapping 'orco'.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "vertex_normal_flip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_NOPUNOFLIP);
RNA_def_property_ui_text(prop, "Vertex Normal Flip", "Flip vertex normals towards the camera during render");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
@@ -318,62 +466,78 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
prop= RNA_def_property(srna, "spacemode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_align_items);
RNA_def_property_ui_text(prop, "Text Align", "Text align from the object center.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* number values */
prop= RNA_def_property(srna, "text_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fsize");
RNA_def_property_range(prop, 0.1f, 10.0f);
RNA_def_property_ui_text(prop, "Font size", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "line_dist", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "linedist");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Distance between lines of text", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "word_spacing", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "wordspace");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Spacing between words", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "spacing", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spacing");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Global spacing between characters", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "shear");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Shear", "Italic angle of the characters");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xof");
RNA_def_property_range(prop, -50.0f, 50.0f);
RNA_def_property_ui_text(prop, "X Offset", "Horizontal offset from the object center");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
- prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yof");
RNA_def_property_range(prop, -50.0f, 50.0f);
RNA_def_property_ui_text(prop, "Y Offset", "Vertical offset from the object center");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "ul_position", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ulpos");
RNA_def_property_range(prop, -0.2f, 0.8f);
- RNA_def_property_ui_text(prop, "Underline position", "Vertical position of underline");
+ RNA_def_property_ui_text(prop, "Underline Position", "Vertical position of underline");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "ul_height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ulheight");
RNA_def_property_range(prop, -0.2f, 0.8f);
- RNA_def_property_ui_text(prop, "Underline thickness", "");
+ RNA_def_property_ui_text(prop, "Underline Thickness", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ prop= RNA_def_property(srna, "textboxes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "tb", "totbox");
+ RNA_def_property_struct_type(prop, "TextBox");
+ RNA_def_property_ui_text(prop, "Textboxes", "");
+
prop= RNA_def_property(srna, "active_textbox", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "actbox");
- RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "The active text box", "");
+ RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Curve_active_textbox_index_range");
/* strings */
prop= RNA_def_property(srna, "family", PROP_STRING, PROP_NONE);
RNA_def_property_string_maxlength(prop, 21);
- RNA_def_property_ui_text(prop, "Family", "Blender uses font from selfmade objects.");
+ 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");
prop= RNA_def_property(srna, "str", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "str");
@@ -387,23 +551,23 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "textoncurve");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text on Curve", "Curve deforming text object.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "font", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "vfont");
RNA_def_property_ui_text(prop, "Font", "");
-
- prop= RNA_def_property(srna, "textbox", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "tb");
- RNA_def_property_ui_text(prop, "Textbox", "");
-
+ 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, "fast", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST);
RNA_def_property_ui_text(prop, "Fast", "Don't fill polygons while editing.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_textbox(BlenderRNA *brna)
@@ -419,21 +583,25 @@ static void rna_def_textbox(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "x");
RNA_def_property_range(prop, -50.0f, 50.0f);
RNA_def_property_ui_text(prop, "Textbox X Offset", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "y");
RNA_def_property_range(prop, -50.0f, 50.0f);
RNA_def_property_ui_text(prop, "Textbox Y Offset", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "w");
RNA_def_property_range(prop, 0.0f, 50.0f);
RNA_def_property_ui_text(prop, "Textbox Width", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "h");
RNA_def_property_range(prop, 0.0f, 50.0f);
RNA_def_property_ui_text(prop, "Textbox Height", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_charinfo(BlenderRNA *brna)
@@ -449,22 +617,27 @@ static void rna_def_charinfo(BlenderRNA *brna)
prop= RNA_def_property(srna, "style", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STYLE);
RNA_def_property_ui_text(prop, "Style", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "bold", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BOLD);
RNA_def_property_ui_text(prop, "Bold", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "italic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_ITALIC);
RNA_def_property_ui_text(prop, "Italic", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "underline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UNDERLINE);
RNA_def_property_ui_text(prop, "Underline", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_WRAP);
RNA_def_property_ui_text(prop, "Wrap", "");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_surface(BlenderRNA *brna)
@@ -497,6 +670,17 @@ static void rna_def_curve(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem curve_twist_mode_items[] = {
+ {CU_TWIST_Z_UP, "Z_UP", 0, "Z-Up", "Use Z-Up axis to calculate the curve twist at each point"},
+ {CU_TWIST_MINIMUM, "MINIMUM", 0, "Minimum", "Use the least twist over the entire curve"},
+ {CU_TWIST_TANGENT, "TANGENT", 0, "Tangent", "Use the tangent to calculate twist"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static const EnumPropertyItem curve_axis_items[]= {
+ {0, "2D", 0, "2D", "Clamp the Z axis of of the curve"},
+ {CU_3D, "3D", 0, "3D", "Allow editing on the Z axis of this curve, also alows tilt and curve radius to be used."},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "Curve", "ID");
RNA_def_struct_ui_text(srna, "Curve", "Curve datablock storing curves, splines and NURBS.");
RNA_def_struct_ui_icon(srna, ICON_CURVE_DATA);
@@ -509,10 +693,26 @@ 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, "curves", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "splines", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "nurb", NULL);
RNA_def_property_struct_type(prop, "Nurb");
- RNA_def_property_ui_text(prop, "Curves", "Collection of curves in this curve data object.");
+ RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object.");
+
+ prop= RNA_def_property(srna, "active_spline", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Nurb");
+ RNA_def_property_pointer_funcs(prop, "rna_Curve_active_nurb_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Spline", "The active editmode spline");
+
+
+ prop= RNA_def_property(srna, "draw_handles", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_HANDLES);
+ RNA_def_property_ui_text(prop, "Draw Handles", "Display bezier handles in editmode.");
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
+
+ prop= RNA_def_property(srna, "draw_normals", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_NORMALS);
+ RNA_def_property_ui_text(prop, "Draw Normals", "Display 3D curve normals in editmode.");
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
rna_def_path(brna, srna);
@@ -522,31 +722,37 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 32);
RNA_def_property_ui_range(prop, 0, 32, 1.0, 0);
RNA_def_property_ui_text(prop, "Bevel Resolution", "Bevel resolution when depth is non-zero and no specific bevel object has been defined.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "width");
RNA_def_property_ui_range(prop, 0, 2.0, 0.1, 0);
RNA_def_property_ui_text(prop, "Width", "Scale the original width (1.0) based on given factor.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ext1");
RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0);
RNA_def_property_ui_text(prop, "Extrude", "Amount of curve extrusion when not using a bevel object.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ext2");
RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0);
RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu");
RNA_def_property_ui_range(prop, 1, 1024, 1, 0);
RNA_def_property_ui_text(prop, "Resolution U", "Surface resolution in U direction.");
+ 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_ui_range(prop, 1, 1024, 1, 0);
RNA_def_property_ui_text(prop, "Resolution V", "Surface resolution in V direction.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu_ren");
@@ -558,37 +764,75 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 1, 1024, 1, 0);
RNA_def_property_ui_text(prop, "Render Resolution V", "Surface resolution in V direction used while rendering. Zero skips this property.");
+
+ prop= RNA_def_property(srna, "eval_time", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ctime");
+ RNA_def_property_ui_text(prop, "Evaluation Time", "Parametric position along the length of the curve that Objects 'following' it should be at.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
/* pointers */
prop= RNA_def_property(srna, "bevel_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bevobj");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Bevel Object", "Curve object name that defines the bevel shape.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "taperobj");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Taper Object", "Curve object name that defines the taper (width).");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* Flags */
- prop= RNA_def_property(srna, "curve_2d", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_3D);
- RNA_def_property_ui_text(prop, "2D Curve", "Define curve in two dimensions only. Note that fill only works when this is enabled.");
+
+ prop= RNA_def_property(srna, "dimensions", PROP_ENUM, PROP_NONE); /* as an enum */
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, curve_axis_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Curve_dimension_set", NULL);
+ RNA_def_property_ui_text(prop, "Dimensions", "Select 2D or 3D curve type.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "front", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FRONT);
RNA_def_property_ui_text(prop, "Front", "Draw filled front for extruded/beveled curves.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "back", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BACK);
RNA_def_property_ui_text(prop, "Back", "Draw filled back for extruded/beveled curves.");
-
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "twist_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "twist_mode");
+ RNA_def_property_enum_items(prop, curve_twist_mode_items);
+ RNA_def_property_ui_text(prop, "Twist Method", "The type of tilt calculation for 3D Curves.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ // XXX - would be nice to have a better way to do this, only add for testing.
+ prop= RNA_def_property(srna, "twist_smooth", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "twist_smooth");
+ RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0);
+ RNA_def_property_ui_text(prop, "Twist Smooth", "Smoothing iteration for tangents");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+
+
prop= RNA_def_property(srna, "retopo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_RETOPO);
RNA_def_property_ui_text(prop, "Retopo", "Turn on the re-topology tool.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
static void rna_def_curve_nurb(BlenderRNA *brna)
{
+ static EnumPropertyItem curve_type_items[] = {
+ {CU_POLY, "POLY", 0, "Poly", ""},
+ {CU_BEZIER, "BEZIER", 0, "Bezier", ""},
+ {CU_BSPLINE, "BSPLINE", 0, "BSpline", ""},
+ {CU_CARDINAL, "CARDINAL", 0, "Cardinal", ""},
+ {CU_NURBS, "NURBS", 0, "Ease", ""},
+ {0, NULL, 0, NULL, NULL}};
+
static EnumPropertyItem spline_interpolation_items[] = {
{BEZT_IPO_CONST, "LINEAR", 0, "Linear", ""},
{BEZT_IPO_LIN, "CARDINAL", 0, "Cardinal", ""},
@@ -600,108 +844,131 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
PropertyRNA *prop;
srna= RNA_def_struct(brna, "Nurb", NULL);
- RNA_def_struct_ui_text(srna, "Nurb", "Element of a curve, either Nurb, Bezier or Polyline or a character with text objects.");
+ RNA_def_struct_ui_text(srna, "Spline", "Element of a curve, either Nurbs, Bezier or Polyline or a character with text objects.");
prop= RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "bp", NULL);
RNA_def_property_struct_type(prop, "CurvePoint");
RNA_def_property_collection_funcs(prop, "rna_BPoint_array_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_Nurb_length", 0, 0, 0, 0);
- RNA_def_property_ui_text(prop, "Points", "Collection of points for Poly and Nurbs curves.");
+ RNA_def_property_ui_text(prop, "Points", "Collection of points that make up this poly or nurbs spline.");
prop= RNA_def_property(srna, "bezier_points", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "BezierCurvePoint");
RNA_def_property_collection_sdna(prop, NULL, "bezt", "pntsu");
- RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points bezier curves only.");
+ RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for bezier curves only.");
prop= RNA_def_property(srna, "tilt_interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "tilt_interp");
RNA_def_property_enum_items(prop, spline_interpolation_items);
RNA_def_property_ui_text(prop, "Tilt Interpolation", "The type of tilt interpolation for 3D, Bezier curves.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "radius_interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "radius_interp");
RNA_def_property_enum_items(prop, spline_interpolation_items);
RNA_def_property_ui_text(prop, "Radius Interpolation", "The type of radius interpolation for Bezier curves.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ // XXX - switching type probably needs comprehensive recalc of data like in 2.4x
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, curve_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Nurb_type_set", NULL);
+ RNA_def_property_ui_text(prop, "Type", "The interpolation type for this curve element.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "point_count_u", PROP_INT, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
RNA_def_property_int_sdna(prop, NULL, "pntsu");
RNA_def_property_ui_text(prop, "Points U", "Total number points for the curve or surface in the U direction");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "point_count_v", PROP_INT, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
RNA_def_property_int_sdna(prop, NULL, "pntsv");
RNA_def_property_ui_text(prop, "Points V", "Total number points for the surface on the V direction");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "order_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "orderu");
RNA_def_property_range(prop, 2, 6);
- RNA_def_property_ui_text(prop, "Order U", "Nurbs order in the U direction (For curves and surfaces), Higher values let points influence a greater area");
+ RNA_def_property_ui_text(prop, "Order U", "Nurbs order in the U direction (For splines and surfaces), Higher values let points influence a greater area");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
prop= RNA_def_property(srna, "order_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "orderv");
RNA_def_property_range(prop, 2, 6);
RNA_def_property_ui_text(prop, "Order V", "Nurbs order in the V direction (For surfaces only), Higher values let points influence a greater area");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
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, 1024);
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, 1024);
RNA_def_property_ui_text(prop, "Resolution V", "Surface subdivisions per segment");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "cyclic_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_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 */
prop= RNA_def_property(srna, "cyclic_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_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");
/* Note, endpoint and bezier flags should never be on at the same time! */
prop= RNA_def_property(srna, "endpoint_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", 2);
RNA_def_property_ui_text(prop, "Endpoint U", "Make this nurbs curve or surface meet the endpoints in the U direction (Cyclic U must be disabled).");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
prop= RNA_def_property(srna, "endpoint_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", 2);
RNA_def_property_ui_text(prop, "Endpoint V", "Make this nurbs surface meet the endpoints in the V direction (Cyclic V must be disabled).");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
prop= RNA_def_property(srna, "bezier_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", 4);
RNA_def_property_ui_text(prop, "Bezier U", "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).");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
prop= RNA_def_property(srna, "bezier_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", 4);
RNA_def_property_ui_text(prop, "Bezier V", "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).");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth", "Smooth the normals of the surface or beveled curve.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "hide", 1);
RNA_def_property_ui_text(prop, "Hide", "Hide this curve in editmode.");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "mat_nr");
RNA_def_property_ui_text(prop, "Material Index", "");
- RNA_def_property_range(prop, 0, MAXMAT-1);
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Curve_material_index_range");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "character_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "charidx");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
- RNA_def_property_ui_text(prop, "Character Index", "the location of this character in the text data (only for text curves)");
+ 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");
}
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 bd449acc050..cc86da18a0b 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -39,12 +39,13 @@
#include "RNA_types.h"
#include "BLI_ghash.h"
+#include "BLI_string.h"
#include "rna_internal.h"
/* Global used during defining */
-BlenderDefRNA DefRNA = {0, {0, 0}, {0, 0}, 0, 0, 0};
+BlenderDefRNA DefRNA = {0, {0, 0}, {0, 0}, 0, 0, 0, 0, 1};
/* Duplicated code since we can't link in blenkernel or blenlib */
@@ -65,7 +66,7 @@ void rna_addtail(ListBase *listbase, void *vlink)
listbase->last = link;
}
-void rna_remlink(ListBase *listbase, void *vlink)
+static void rna_remlink(ListBase *listbase, void *vlink)
{
Link *link= vlink;
@@ -76,6 +77,20 @@ void rna_remlink(ListBase *listbase, void *vlink)
if (listbase->first == link) listbase->first = link->next;
}
+PropertyDefRNA *rna_findlink(ListBase *listbase, const char *identifier)
+{
+ Link *link;
+
+ for(link=listbase->first; link; link=link->next) {
+ PropertyRNA *prop= ((PropertyDefRNA *)link)->prop;
+ if(prop && (strcmp(prop->identifier, identifier)==0)) {
+ return (PropertyDefRNA *)link;
+ }
+ }
+
+ return NULL;
+}
+
void rna_freelinkN(ListBase *listbase, void *vlink)
{
rna_remlink(listbase, vlink);
@@ -112,18 +127,18 @@ StructDefRNA *rna_find_struct_def(StructRNA *srna)
return NULL;
}
-PropertyDefRNA *rna_find_struct_property_def(PropertyRNA *prop)
+PropertyDefRNA *rna_find_struct_property_def(StructRNA *srna, PropertyRNA *prop)
{
StructDefRNA *dsrna;
PropertyDefRNA *dprop;
if(!DefRNA.preprocess) {
/* we should never get here */
- fprintf(stderr, "rna_find_property_def: only at preprocess time.\n");
+ fprintf(stderr, "rna_find_struct_property_def: only at preprocess time.\n");
return NULL;
}
- dsrna= rna_find_struct_def(DefRNA.laststruct);
+ dsrna= rna_find_struct_def(srna);
dprop= dsrna->cont.properties.last;
for (; dprop; dprop= dprop->prev)
if (dprop->prop==prop)
@@ -140,7 +155,8 @@ PropertyDefRNA *rna_find_struct_property_def(PropertyRNA *prop)
return NULL;
}
-PropertyDefRNA *rna_find_property_def(PropertyRNA *prop)
+#if 0
+static PropertyDefRNA *rna_find_property_def(PropertyRNA *prop)
{
PropertyDefRNA *dprop;
@@ -150,7 +166,7 @@ PropertyDefRNA *rna_find_property_def(PropertyRNA *prop)
return NULL;
}
- dprop= rna_find_struct_property_def(prop);
+ dprop= rna_find_struct_property_def(DefRNA.laststruct, prop);
if (dprop)
return dprop;
@@ -160,6 +176,7 @@ PropertyDefRNA *rna_find_property_def(PropertyRNA *prop)
return NULL;
}
+#endif
FunctionDefRNA *rna_find_function_def(FunctionRNA *func)
{
@@ -224,7 +241,7 @@ PropertyDefRNA *rna_find_parameter_def(PropertyRNA *parm)
return NULL;
}
-ContainerDefRNA *rna_find_container_def(ContainerRNA *cont)
+static ContainerDefRNA *rna_find_container_def(ContainerRNA *cont)
{
StructDefRNA *ds;
FunctionDefRNA *dfunc;
@@ -438,15 +455,38 @@ void RNA_define_free(BlenderRNA *brna)
DefRNA.error= 0;
}
+void RNA_define_verify_sdna(int verify)
+{
+ DefRNA.verify= verify;
+}
+
+void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *ext)
+{
+#ifdef RNA_RUNTIME
+ ext->free(ext->data); /* decref's the PyObject that the srna owns */
+ RNA_struct_blender_type_set(srna, NULL); /* this gets accessed again - XXX fixme */
+ RNA_struct_py_type_set(srna, NULL); /* NULL the srna's value so RNA_struct_free wont complain of a leak */
+#endif
+}
+
void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
{
+#ifdef RNA_RUNTIME
FunctionRNA *func, *nextfunc;
PropertyRNA *prop, *nextprop;
PropertyRNA *parm, *nextparm;
+ if(srna->flag & STRUCT_RUNTIME) {
+ if(RNA_struct_py_type_get(srna)) {
+ fprintf(stderr, "StructRNA \"%s\" freed while holdng a python reference\n", srna->name);
+ }
+ }
+
for(prop=srna->cont.properties.first; prop; prop=nextprop) {
nextprop= prop->next;
+ RNA_def_property_free_pointers(prop);
+
if(prop->flag & PROP_RUNTIME)
rna_freelinkN(&srna->cont.properties, prop);
}
@@ -457,17 +497,24 @@ void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
for(parm=func->cont.properties.first; parm; parm=nextparm) {
nextparm= parm->next;
+ RNA_def_property_free_pointers(parm);
+
if(parm->flag & PROP_RUNTIME)
rna_freelinkN(&func->cont.properties, parm);
}
- if(func->flag & FUNC_RUNTIME) {
+ RNA_def_func_free_pointers(func);
+
+ if(func->flag & FUNC_RUNTIME)
rna_freelinkN(&srna->functions, func);
- }
}
+ RNA_def_struct_free_pointers(srna);
+
if(srna->flag & STRUCT_RUNTIME)
rna_freelinkN(&brna->structs, srna);
+
+#endif
}
void RNA_free(BlenderRNA *brna)
@@ -708,7 +755,7 @@ void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *struct
break;
if(!srnafrom) {
- fprintf(stderr, "RNA_def_struct_nested: struct %s not found.\n", structname);
+ fprintf(stderr, "RNA_def_struct_nested: struct %s not found for %s.\n", structname, srna->identifier);
DefRNA.error= 1;
}
@@ -806,6 +853,13 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
}
dcont= rna_find_container_def(cont);
+
+ /* XXX - toto, detect supertype collisions */
+ if(rna_findlink(&dcont->properties, identifier)) {
+ fprintf(stderr, "RNA_def_property: duplicate identifier \"%s\"\n", identifier);
+ DefRNA.error= 1;
+ }
+
dprop= MEM_callocN(sizeof(PropertyDefRNA), "PropertyDefRNA");
rna_addtail(&dcont->properties, dprop);
}
@@ -836,7 +890,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
fprop->softmin= 0.0f;
fprop->softmax= 1.0f;
}
- else if(subtype == PROP_PERCENTAGE) {
+ else if(subtype == PROP_FACTOR) {
fprop->softmin= fprop->hardmin= 0.0f;
fprop->softmax= fprop->hardmax= 1.0f;
}
@@ -949,18 +1003,18 @@ void RNA_def_property_clear_flag(PropertyRNA *prop, int flag)
prop->flag &= ~flag;
}
-void RNA_def_property_array(PropertyRNA *prop, int arraylength)
+void RNA_def_property_array(PropertyRNA *prop, int length)
{
StructRNA *srna= DefRNA.laststruct;
- if(arraylength<0) {
+ if(length<0) {
fprintf(stderr, "RNA_def_property_array: %s.%s, array length must be zero of greater.\n", srna->identifier, prop->identifier);
DefRNA.error= 1;
return;
}
- if(arraylength>RNA_MAX_ARRAY) {
- fprintf(stderr, "RNA_def_property_array: %s.%s, array length must be smaller than %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY);
+ if(length>RNA_MAX_ARRAY_LENGTH) {
+ fprintf(stderr, "RNA_def_property_array: %s.%s, array length must be smaller than %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_LENGTH);
DefRNA.error= 1;
return;
}
@@ -969,7 +1023,9 @@ void RNA_def_property_array(PropertyRNA *prop, int arraylength)
case PROP_BOOLEAN:
case PROP_INT:
case PROP_FLOAT:
- prop->arraylength= arraylength;
+ prop->arraylength[0]= length;
+ prop->totarraylength= length;
+ prop->arraydimension= 1;
break;
default:
fprintf(stderr, "RNA_def_property_array: %s.%s, only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
@@ -978,6 +1034,44 @@ void RNA_def_property_array(PropertyRNA *prop, int arraylength)
}
}
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[])
+{
+ StructRNA *srna= DefRNA.laststruct;
+ int i;
+
+ if (dimension < 1 || dimension > RNA_MAX_ARRAY_DIMENSION) {
+ fprintf(stderr, "RNA_def_property_multi_array: %s.%s, array dimension must be between 1 and %d.\n", srna->identifier, prop->identifier, RNA_MAX_ARRAY_DIMENSION);
+ DefRNA.error= 1;
+ return;
+ }
+
+ switch(prop->type) {
+ case PROP_BOOLEAN:
+ case PROP_INT:
+ case PROP_FLOAT:
+ break;
+ default:
+ fprintf(stderr, "RNA_def_property_multi_array: %s.%s, only boolean/int/float can be array.\n", srna->identifier, prop->identifier);
+ DefRNA.error= 1;
+ break;
+ }
+
+ prop->arraydimension= dimension;
+ prop->totarraylength= 0;
+
+ if(length) {
+ memcpy(prop->arraylength, length, sizeof(int)*dimension);
+
+ prop->totarraylength= length[0];
+ for(i=1; i<dimension; i++)
+ prop->totarraylength *= length[i];
+ }
+ else
+ memset(prop->arraylength, 0, sizeof(prop->arraylength));
+
+ /* TODO make sure arraylength values are sane */
+}
+
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
{
prop->name= name;
@@ -1051,7 +1145,7 @@ void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
- fprintf(stderr, "RNA_def_property_struct_type: only during preprocessing.\n");
+ fprintf(stderr, "RNA_def_property_struct_type %s.%s: only during preprocessing.\n", srna->identifier, prop->identifier);
return;
}
@@ -1112,17 +1206,23 @@ void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item
switch(prop->type) {
case PROP_ENUM: {
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
- eprop->item= item;
+ eprop->item= (EnumPropertyItem*)item;
eprop->totitem= 0;
for(i=0; item[i].identifier; i++) {
eprop->totitem++;
- if(item[i].value == eprop->defaultvalue)
+ if(item[i].identifier[0] && item[i].value == eprop->defaultvalue)
defaultfound= 1;
}
- if(!defaultfound)
- eprop->defaultvalue= item[0].value;
+ if(!defaultfound) {
+ for(i=0; item[i].identifier; i++) {
+ if(item[i].identifier[0]) {
+ eprop->defaultvalue= item[i].value;
+ break;
+ }
+ }
+ }
break;
}
@@ -1280,7 +1380,7 @@ void RNA_def_property_enum_default(PropertyRNA *prop, int value)
eprop->defaultvalue= value;
for(i=0; i<eprop->totitem; i++) {
- if(eprop->item[i].value == eprop->defaultvalue)
+ if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
defaultfound= 1;
}
@@ -1311,7 +1411,7 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop, const char *stru
StructDefRNA *ds;
PropertyDefRNA *dp;
- dp= rna_find_struct_property_def(prop);
+ dp= rna_find_struct_property_def(DefRNA.laststruct, prop);
if (dp==NULL) return NULL;
ds= rna_find_struct_def((StructRNA*)dp->cont);
@@ -1322,17 +1422,35 @@ static PropertyDefRNA *rna_def_property_sdna(PropertyRNA *prop, const char *stru
propname= prop->identifier;
if(!rna_find_sdna_member(DefRNA.sdna, structname, propname, &smember)) {
- if(!DefRNA.silent) {
+ if(DefRNA.silent) {
+ return NULL;
+ }
+ else if(!DefRNA.verify) {
+ /* some basic values to survive even with sdna info */
+ dp->dnastructname= structname;
+ dp->dnaname= propname;
+ if(prop->type == PROP_BOOLEAN)
+ dp->dnaarraylength= 1;
+ if(prop->type == PROP_POINTER)
+ dp->dnapointerlevel= 1;
+ return dp;
+ }
+ else {
fprintf(stderr, "rna_def_property_sdna: %s.%s not found.\n", structname, propname);
DefRNA.error= 1;
+ return NULL;
}
- return NULL;
}
- if(smember.arraylength > 1)
- prop->arraylength= smember.arraylength;
- else
- prop->arraylength= 0;
+ if(smember.arraylength > 1) {
+ prop->arraylength[0]= smember.arraylength;
+ prop->totarraylength= smember.arraylength;
+ prop->arraydimension= 1;
+ }
+ else {
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
+ }
dp->dnastructname= structname;
dp->dnastructfromname= ds->dnafromname;
@@ -1371,7 +1489,7 @@ void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *struc
RNA_def_property_boolean_sdna(prop, structname, propname, booleanbit);
- dp= rna_find_struct_property_def(prop);
+ dp= rna_find_struct_property_def(DefRNA.laststruct, prop);
if(dp)
dp->booleannegative= 1;
@@ -1396,15 +1514,15 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
if((dp= rna_def_property_sdna(prop, structname, propname))) {
/* SDNA doesn't pass us unsigned unfortunately .. */
- if(strcmp(dp->dnatype, "char") == 0) {
+ if(dp->dnatype && strcmp(dp->dnatype, "char") == 0) {
iprop->hardmin= iprop->softmin= CHAR_MIN;
iprop->hardmax= iprop->softmax= CHAR_MAX;
}
- else if(strcmp(dp->dnatype, "short") == 0) {
+ else if(dp->dnatype && strcmp(dp->dnatype, "short") == 0) {
iprop->hardmin= iprop->softmin= SHRT_MIN;
iprop->hardmax= iprop->softmax= SHRT_MAX;
}
- else if(strcmp(dp->dnatype, "int") == 0) {
+ else if(dp->dnatype && strcmp(dp->dnatype, "int") == 0) {
iprop->hardmin= INT_MIN;
iprop->hardmax= INT_MAX;
@@ -1412,7 +1530,7 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
iprop->softmax= 10000;
}
- if(prop->subtype == PROP_UNSIGNED || prop->subtype == PROP_PERCENTAGE)
+ if(prop->subtype == PROP_UNSIGNED || prop->subtype == PROP_PERCENTAGE || prop->subtype == PROP_FACTOR)
iprop->hardmin= iprop->softmin= 0;
}
}
@@ -1452,8 +1570,10 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
}
if((dp=rna_def_property_sdna(prop, structname, propname))) {
- if(prop->arraylength) {
- prop->arraylength= 0;
+ if(prop->arraydimension) {
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
+
if(!DefRNA.silent) {
fprintf(stderr, "RNA_def_property_enum_sdna: %s.%s, array not supported for enum type.\n", structname, propname);
DefRNA.error= 1;
@@ -1468,7 +1588,7 @@ void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structnam
RNA_def_property_enum_sdna(prop, structname, propname);
- dp= rna_find_struct_property_def(prop);
+ dp= rna_find_struct_property_def(DefRNA.laststruct, prop);
if(dp)
dp->enumbitflags= 1;
@@ -1492,9 +1612,10 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
}
if((dp=rna_def_property_sdna(prop, structname, propname))) {
- if(prop->arraylength) {
- sprop->maxlength= prop->arraylength;
- prop->arraylength= 0;
+ if(prop->arraydimension) {
+ sprop->maxlength= prop->totarraylength;
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
}
}
}
@@ -1516,8 +1637,10 @@ void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, co
}
if((dp=rna_def_property_sdna(prop, structname, propname))) {
- if(prop->arraylength) {
- prop->arraylength= 0;
+ if(prop->arraydimension) {
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
+
if(!DefRNA.silent) {
fprintf(stderr, "RNA_def_property_pointer_sdna: %s.%s, array not supported for pointer type.\n", structname, propname);
DefRNA.error= 1;
@@ -1544,8 +1667,9 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
}
if((dp=rna_def_property_sdna(prop, structname, propname))) {
- if(prop->arraylength && !lengthpropname) {
- prop->arraylength= 0;
+ if(prop->arraydimension && !lengthpropname) {
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
if(!DefRNA.silent) {
fprintf(stderr, "RNA_def_property_collection_sdna: %s.%s, array of collections not supported.\n", structname, propname);
@@ -1553,7 +1677,7 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
}
}
- if(strcmp(dp->dnatype, "ListBase") == 0) {
+ if(dp->dnatype && strcmp(dp->dnatype, "ListBase") == 0) {
cprop->next= (PropCollectionNextFunc)"rna_iterator_listbase_next";
cprop->get= (PropCollectionGetFunc)"rna_iterator_listbase_get";
cprop->end= (PropCollectionEndFunc)"rna_iterator_listbase_end";
@@ -1569,8 +1693,9 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
if(lengthpropname[0] == 0 || rna_find_sdna_member(DefRNA.sdna, structname, lengthpropname, &smember)) {
if(lengthpropname[0] == 0) {
- dp->dnalengthfixed= prop->arraylength;
- prop->arraylength= 0;
+ dp->dnalengthfixed= prop->totarraylength;
+ prop->arraydimension= 0;
+ prop->totarraylength= 0;
}
else {
dp->dnalengthstructname= structname;
@@ -1617,6 +1742,22 @@ void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
prop->update= (UpdateFunc)func;
}
+void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength)
+{
+ if(!DefRNA.preprocess) {
+ fprintf(stderr, "RNA_def_property_*_funcs: only during preprocessing.\n");
+ return;
+ }
+
+ if (!(prop->flag & PROP_DYNAMIC)) {
+ fprintf(stderr, "RNA_def_property_dynamic_array_funcs: property is a not dynamic array.\n");
+ DefRNA.error= 1;
+ return;
+ }
+
+ if(getlength) prop->getlength= (PropArrayLengthGetFunc)getlength;
+}
+
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
{
StructRNA *srna= DefRNA.laststruct;
@@ -1630,7 +1771,7 @@ void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const ch
case PROP_BOOLEAN: {
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
- if(prop->arraylength) {
+ if(prop->arraydimension) {
if(get) bprop->getarray= (PropBooleanArrayGetFunc)get;
if(set) bprop->setarray= (PropBooleanArraySetFunc)set;
}
@@ -1660,7 +1801,7 @@ void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *
case PROP_INT: {
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
- if(prop->arraylength) {
+ if(prop->arraydimension) {
if(get) iprop->getarray= (PropIntArrayGetFunc)get;
if(set) iprop->setarray= (PropIntArraySetFunc)set;
}
@@ -1691,7 +1832,7 @@ void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char
case PROP_FLOAT: {
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
- if(prop->arraylength) {
+ if(prop->arraydimension) {
if(get) fprop->getarray= (PropFloatArrayGetFunc)get;
if(set) fprop->setarray= (PropFloatArraySetFunc)set;
}
@@ -1843,13 +1984,41 @@ PropertyRNA *RNA_def_boolean_array(StructOrFunctionRNA *cont_, const char *ident
return prop;
}
+PropertyRNA *RNA_def_boolean_layer(StructOrFunctionRNA *cont_, const char *identifier, int len, int *default_value,
+ const char *ui_name, const char *ui_description)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(cont, identifier, PROP_BOOLEAN, PROP_LAYER);
+ if(len != 0) RNA_def_property_array(prop, len);
+ if(default_value) RNA_def_property_boolean_array_default(prop, default_value);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+ return prop;
+}
+
+PropertyRNA *RNA_def_boolean_layer_member(StructOrFunctionRNA *cont_, const char *identifier, int len, int *default_value,
+ const char *ui_name, const char *ui_description)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(cont, identifier, PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ if(len != 0) RNA_def_property_array(prop, len);
+ if(default_value) RNA_def_property_boolean_array_default(prop, default_value);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+ return prop;
+}
+
PropertyRNA *RNA_def_boolean_vector(StructOrFunctionRNA *cont_, const char *identifier, int len, int *default_value,
const char *ui_name, const char *ui_description)
{
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- prop= RNA_def_property(cont, identifier, PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(cont, identifier, PROP_BOOLEAN, PROP_XYZ); // XXX
if(len != 0) RNA_def_property_array(prop, len);
if(default_value) RNA_def_property_boolean_array_default(prop, default_value);
RNA_def_property_ui_text(prop, ui_name, ui_description);
@@ -1878,7 +2047,7 @@ PropertyRNA *RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifi
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- prop= RNA_def_property(cont, identifier, PROP_INT, PROP_VECTOR);
+ prop= RNA_def_property(cont, identifier, PROP_INT, PROP_XYZ); // XXX
if(len != 0) RNA_def_property_array(prop, len);
if(default_value) RNA_def_property_int_array_default(prop, default_value);
if(hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
@@ -1946,6 +2115,20 @@ PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont_, const char *ide
return prop;
}
+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)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(cont, identifier, PROP_STRING, PROP_FILENAME);
+ if(maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen);
+ if(default_value) RNA_def_property_string_default(prop, default_value);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+ return prop;
+}
+
PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value,
const char *ui_name, const char *ui_description)
{
@@ -1960,6 +2143,12 @@ PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, co
return prop;
}
+void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
+{
+ EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+ eprop->itemf= 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)
{
@@ -1981,7 +2170,7 @@ PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identi
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_XYZ);
if(len != 0) RNA_def_property_array(prop, len);
if(default_value) RNA_def_property_float_array_default(prop, default_value);
if(hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
@@ -2008,14 +2197,15 @@ PropertyRNA *RNA_def_float_color(StructOrFunctionRNA *cont_, const char *identif
}
-PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identifier, int len, const float *default_value,
+PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identifier, int rows, int columns, const float *default_value,
float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
{
ContainerRNA *cont= cont_;
PropertyRNA *prop;
+ int length[2]= {rows, columns};
prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_MATRIX);
- if(len != 0) RNA_def_property_array(prop, len);
+ RNA_def_property_multi_array(prop, 2, length);
if(default_value) RNA_def_property_float_array_default(prop, default_value);
if(hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
RNA_def_property_ui_text(prop, ui_name, ui_description);
@@ -2030,7 +2220,7 @@ PropertyRNA *RNA_def_float_rotation(StructOrFunctionRNA *cont_, const char *iden
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_EULER); // XXX
if(len != 0) RNA_def_property_array(prop, len);
if(default_value) RNA_def_property_float_array_default(prop, default_value);
if(hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
@@ -2071,6 +2261,21 @@ PropertyRNA *RNA_def_float_percentage(StructOrFunctionRNA *cont_, const char *id
return prop;
}
+PropertyRNA *RNA_def_float_factor(StructOrFunctionRNA *cont_, const char *identifier, float default_value,
+ float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_default(prop, default_value);
+ if(hardmin != hardmax) RNA_def_property_range(prop, hardmin, hardmax);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+ RNA_def_property_ui_range(prop, softmin, softmax, 1, 3);
+
+ return prop;
+}
+
PropertyRNA *RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type,
const char *ui_name, const char *ui_description)
{
@@ -2212,9 +2417,12 @@ void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
int rna_parameter_size(PropertyRNA *parm)
{
PropertyType ptype= parm->type;
- int len= parm->arraylength;
+ int len= parm->totarraylength; /* only supports fixed length at the moment */
if(len > 0) {
+ if (parm->flag & PROP_DYNAMIC)
+ return sizeof(void *);
+
switch (ptype) {
case PROP_BOOLEAN:
case PROP_INT:
@@ -2249,7 +2457,6 @@ int rna_parameter_size(PropertyRNA *parm)
#endif
}
case PROP_COLLECTION:
- /* XXX does not work yet */
return sizeof(ListBase);
}
}
@@ -2257,3 +2464,209 @@ int rna_parameter_size(PropertyRNA *parm)
return sizeof(void *);
}
+/* Dynamic Enums */
+
+void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item)
+{
+ EnumPropertyItem *newitems;
+ int tot= *totitem;
+
+ if(tot == 0) {
+ *items= MEM_callocN(sizeof(EnumPropertyItem)*8, "RNA_enum_items_add");
+ }
+ else if(tot >= 8 && (tot&(tot-1)) == 0){
+ /* power of two > 8 */
+ newitems= MEM_callocN(sizeof(EnumPropertyItem)*tot*2, "RNA_enum_items_add");
+ memcpy(newitems, *items, sizeof(EnumPropertyItem)*tot);
+ MEM_freeN(*items);
+ *items= newitems;
+ }
+
+ (*items)[tot]= *item;
+ *totitem= tot+1;
+}
+
+void RNA_enum_item_add_separator(EnumPropertyItem **items, int *totitem)
+{
+ static EnumPropertyItem sepr = {0, "", 0, NULL, NULL};
+ RNA_enum_item_add(items, totitem, &sepr);
+}
+
+void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item)
+{
+ for(; item->identifier; item++)
+ RNA_enum_item_add(items, totitem, item);
+}
+
+void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item, int value)
+{
+ for(; item->identifier; item++) {
+ if(item->value == value) {
+ RNA_enum_item_add(items, totitem, item);
+ break; // break on first match - does this break anything? (is quick hack to get object->parent_type working ok for armature/lattice)
+ }
+ }
+}
+
+void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
+{
+ static EnumPropertyItem empty = {0, NULL, 0, NULL, NULL};
+ RNA_enum_item_add(items, totitem, &empty);
+}
+
+/* Memory management */
+
+#ifdef RNA_RUNTIME
+void RNA_def_struct_duplicate_pointers(StructRNA *srna)
+{
+ if(srna->identifier) srna->identifier= BLI_strdup(srna->identifier);
+ if(srna->name) srna->name= BLI_strdup(srna->name);
+ if(srna->description) srna->description= BLI_strdup(srna->description);
+
+ srna->flag |= STRUCT_FREE_POINTERS;
+}
+
+void RNA_def_struct_free_pointers(StructRNA *srna)
+{
+ if(srna->flag & STRUCT_FREE_POINTERS) {
+ if(srna->identifier) MEM_freeN((void*)srna->identifier);
+ if(srna->name) MEM_freeN((void*)srna->name);
+ if(srna->description) MEM_freeN((void*)srna->description);
+ }
+}
+
+void RNA_def_func_duplicate_pointers(FunctionRNA *func)
+{
+ if(func->identifier) func->identifier= BLI_strdup(func->identifier);
+ if(func->description) func->description= BLI_strdup(func->description);
+
+ func->flag |= FUNC_FREE_POINTERS;
+}
+
+void RNA_def_func_free_pointers(FunctionRNA *func)
+{
+ if(func->flag & FUNC_FREE_POINTERS) {
+ if(func->identifier) MEM_freeN((void*)func->identifier);
+ if(func->description) MEM_freeN((void*)func->description);
+ }
+}
+
+void RNA_def_property_duplicate_pointers(PropertyRNA *prop)
+{
+ EnumPropertyItem *earray;
+ float *farray;
+ int *iarray;
+ int a;
+
+ if(prop->identifier) prop->identifier= BLI_strdup(prop->identifier);
+ if(prop->name) prop->name= BLI_strdup(prop->name);
+ if(prop->description) prop->description= BLI_strdup(prop->description);
+
+ switch(prop->type) {
+ case PROP_BOOLEAN: {
+ BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+
+ if(bprop->defaultarray) {
+ iarray= MEM_callocN(sizeof(int)*prop->totarraylength, "RNA_def_property_store");
+ memcpy(iarray, bprop->defaultarray, sizeof(int)*prop->totarraylength);
+ bprop->defaultarray= iarray;
+ }
+ break;
+ }
+ case PROP_INT: {
+ IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+
+ if(iprop->defaultarray) {
+ iarray= MEM_callocN(sizeof(int)*prop->totarraylength, "RNA_def_property_store");
+ memcpy(iarray, iprop->defaultarray, sizeof(int)*prop->totarraylength);
+ iprop->defaultarray= iarray;
+ }
+ break;
+ }
+ case PROP_ENUM: {
+ EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+
+ if(eprop->item) {
+ earray= MEM_callocN(sizeof(EnumPropertyItem)*(eprop->totitem+1), "RNA_def_property_store"),
+ memcpy(earray, eprop->item, sizeof(EnumPropertyItem)*(eprop->totitem+1));
+ eprop->item= earray;
+
+ for(a=0; a<eprop->totitem; a++) {
+ if(eprop->item[a].identifier) eprop->item[a].identifier= BLI_strdup(eprop->item[a].identifier);
+ if(eprop->item[a].name) eprop->item[a].name= BLI_strdup(eprop->item[a].name);
+ if(eprop->item[a].description) eprop->item[a].description= BLI_strdup(eprop->item[a].description);
+ }
+ }
+ break;
+ }
+ case PROP_FLOAT: {
+ FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+
+ if(fprop->defaultarray) {
+ farray= MEM_callocN(sizeof(float)*prop->totarraylength, "RNA_def_property_store");
+ memcpy(farray, fprop->defaultarray, sizeof(float)*prop->totarraylength);
+ fprop->defaultarray= farray;
+ }
+ break;
+ }
+ case PROP_STRING: {
+ StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ if(sprop->defaultvalue) sprop->defaultvalue= BLI_strdup(sprop->defaultvalue);
+ break;
+ }
+ default:
+ break;
+ }
+
+ prop->flag |= PROP_FREE_POINTERS;
+}
+
+void RNA_def_property_free_pointers(PropertyRNA *prop)
+{
+ if(prop->flag & PROP_FREE_POINTERS) {
+ int a;
+
+ if(prop->identifier) MEM_freeN((void*)prop->identifier);
+ if(prop->name) MEM_freeN((void*)prop->name);
+ if(prop->description) MEM_freeN((void*)prop->description);
+
+ switch(prop->type) {
+ case PROP_BOOLEAN: {
+ BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ if(bprop->defaultarray) MEM_freeN((void*)bprop->defaultarray);
+ break;
+ }
+ case PROP_INT: {
+ IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ if(iprop->defaultarray) MEM_freeN((void*)iprop->defaultarray);
+ break;
+ }
+ case PROP_FLOAT: {
+ FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ if(fprop->defaultarray) MEM_freeN((void*)fprop->defaultarray);
+ break;
+ }
+ case PROP_ENUM: {
+ EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+
+ for(a=0; a<eprop->totitem; a++) {
+ if(eprop->item[a].identifier) MEM_freeN((void*)eprop->item[a].identifier);
+ if(eprop->item[a].name) MEM_freeN((void*)eprop->item[a].name);
+ if(eprop->item[a].description) MEM_freeN((void*)eprop->item[a].description);
+ }
+
+ if(eprop->item) MEM_freeN((void*)eprop->item);
+ break;
+ }
+ case PROP_STRING: {
+ StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ if(sprop->defaultvalue) MEM_freeN((void*)sprop->defaultvalue);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 806219ec6bf..2802665c639 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -34,9 +34,12 @@
#include "MEM_guardedalloc.h"
+#include "WM_types.h"
+
EnumPropertyItem fmodifier_type_items[] = {
{FMODIFIER_TYPE_NULL, "NULL", 0, "Invalid", ""},
{FMODIFIER_TYPE_GENERATOR, "GENERATOR", 0, "Generator", ""},
+ {FMODIFIER_TYPE_FN_GENERATOR, "FNGENERATOR", 0, "Built-In Function", ""},
{FMODIFIER_TYPE_ENVELOPE, "ENVELOPE", 0, "Envelope", ""},
{FMODIFIER_TYPE_CYCLES, "CYCLES", 0, "Cycles", ""},
{FMODIFIER_TYPE_NOISE, "NOISE", 0, "Noise", ""},
@@ -47,84 +50,17 @@ EnumPropertyItem fmodifier_type_items[] = {
#ifdef RNA_RUNTIME
-float FModGenFunc_amplitude_get(PointerRNA *ptr)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- return (data->coefficients) ? (float)data->coefficients[0] : 1.0f;
-}
-
-void FModGenFunc_amplitude_set(PointerRNA *ptr, float value)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- if (data->coefficients) data->coefficients[0]= value;
-}
-
-float FModGenFunc_pre_multiplier_get(PointerRNA *ptr)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- return (data->coefficients) ? (float)data->coefficients[1] : 1.0f;
-}
-
-void FModGenFunc_pre_multiplier_set(PointerRNA *ptr, float value)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- if (data->coefficients) data->coefficients[1]= value;
-}
-
-float FModGenFunc_x_offset_get(PointerRNA *ptr)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- return (data->coefficients) ? (float)data->coefficients[2] : 0.0f;
-}
-
-void FModGenFunc_x_offset_set(PointerRNA *ptr, float value)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- if (data->coefficients) data->coefficients[2]= value;
-}
-
-float FModGenFunc_y_offset_get(PointerRNA *ptr)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- return (data->coefficients) ? (float)data->coefficients[3] : 0.0f;
-}
-
-void FModGenFunc_y_offset_set(PointerRNA *ptr, float value)
-{
- FModifier *fcm = (FModifier *)(ptr->data);
- FMod_Generator *data= (FMod_Generator*)(fcm->data);
- if (data->coefficients) data->coefficients[3]= value;
-}
-
/* --------- */
-StructRNA *rna_FModifierType_refine(struct PointerRNA *ptr)
+static StructRNA *rna_FModifierType_refine(struct PointerRNA *ptr)
{
FModifier *fcm= (FModifier *)ptr->data;
switch (fcm->type) {
case FMODIFIER_TYPE_GENERATOR:
- {
- FMod_Generator *gen= (FMod_Generator *)fcm->data;
-
- switch (gen->mode) {
- case FCM_GENERATOR_POLYNOMIAL:
- return &RNA_FModifierGenerator_PolyExpanded;
- //case FCM_GENERATOR_POLYNOMIAL_FACTORISED:
- case FCM_GENERATOR_FUNCTION:
- return &RNA_FModifierGenerator_Function;
- //case FCM_GENERATOR_EXPRESSION:
- default:
- return &RNA_FModifierGenerator;
- }
- }
+ return &RNA_FModifierGenerator;
+ case FMODIFIER_TYPE_FN_GENERATOR:
+ return &RNA_FModifierFunctionGenerator;
case FMODIFIER_TYPE_ENVELOPE:
return &RNA_FModifierEnvelope;
case FMODIFIER_TYPE_CYCLES:
@@ -215,65 +151,50 @@ static void rna_FCurve_RnaPath_set(PointerRNA *ptr, const char *value)
#else
-static void rna_def_fmodifier_generator_common(StructRNA *srna)
+
+static void rna_def_fmodifier_generator(BlenderRNA *brna)
{
+ StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem prop_mode_items[] = {
{FCM_GENERATOR_POLYNOMIAL, "POLYNOMIAL", 0, "Expanded Polynomial", ""},
{FCM_GENERATOR_POLYNOMIAL_FACTORISED, "POLYNOMIAL_FACTORISED", 0, "Factorised Polynomial", ""},
- {FCM_GENERATOR_FUNCTION, "FUNCTION", 0, "Built-In Function", ""},
- {FCM_GENERATOR_EXPRESSION, "EXPRESSION", 0, "Expression", ""},
{0, NULL, 0, NULL, NULL}};
-
- /* struct wrapping settings */
- RNA_def_struct_sdna_from(srna, "FMod_Generator", "data");
- /* settings */
+ srna= RNA_def_struct(brna, "FModifierGenerator", "FModifier");
+ RNA_def_struct_ui_text(srna, "Generator F-Curve Modifier", "Deterministically generates values for the modified F-Curve.");
+ RNA_def_struct_sdna_from(srna, "FMod_Generator", "data");
+
+ /* define common props */
prop= RNA_def_property(srna, "additive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_GENERATOR_ADDITIVE);
RNA_def_property_ui_text(prop, "Additive", "Values generated by this modifier are applied on top of the existing values instead of overwriting them.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
// XXX this has a special validation func
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Mode", "Type of generator to use.");
-}
-
-/* this is a temporary dummy generator-modifier wrapping (to be discarded) */
-static void rna_def_fmodifier_generator(BlenderRNA *brna)
-{
- StructRNA *srna;
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
- srna= RNA_def_struct(brna, "FModifierGenerator", "FModifier");
- RNA_def_struct_ui_text(srna, "Generator F-Curve Modifier", "Deterministically generates values for the modified F-Curve.");
-
- /* define common props */
- rna_def_fmodifier_generator_common(srna);
-}
-
-static void rna_def_fmodifier_generator_polyexpanded(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna= RNA_def_struct(brna, "FModifierGenerator_PolyExpanded", "FModifier");
- RNA_def_struct_ui_text(srna, "Expanded Polynomial Generator", "Generates values for the modified F-Curve using expanded polynomial expresion.");
-
- /* define common props */
- rna_def_fmodifier_generator_common(srna);
/* order of the polynomial */
// XXX this has a special validation func
prop= RNA_def_property(srna, "poly_order", PROP_INT, PROP_NONE);
- RNA_def_property_ui_text(prop, "Polynomial Order", "The highest power of 'x' for this polynomial. (i.e. the number of coefficients - 1)");
+ RNA_def_property_ui_text(prop, "Polynomial Order", "The highest power of 'x' for this polynomial. (number of coefficients - 1)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
/* coefficients array */
- //prop= RNA_def_property(srna, "coefficients", PROP_FLOAT, PROP_NONE);
- //RNA_def_property_ui_text(prop, "Coefficients", "Coefficients for 'x' (starting from lowest power).");
+ // FIXME: this is quite difficult to try to wrap
+ //prop= RNA_def_property(srna, "coefficients", PROP_COLLECTION, PROP_NONE);
+ //RNA_def_property_collection_funcs(prop, "rna_FModifierGenerator_coefficients_begin", "rna_FModifierGenerator_coefficients_next", "rna_FModifierGenerator_coefficients_end", "rna_iterator_array_get", "rna_FModifierGenerator_coefficients_length", 0, 0, 0, 0);
+ //RNA_def_property_ui_text(prop, "Coefficients", "Coefficients for 'x' (starting from lowest power of x^0).");
}
-static void rna_def_fmodifier_generator_function(BlenderRNA *brna)
+/* --------- */
+
+static void rna_def_fmodifier_function_generator(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -284,48 +205,108 @@ static void rna_def_fmodifier_generator_function(BlenderRNA *brna)
{2, "TAN", 0, "Tangent", ""},
{3, "SQRT", 0, "Square Root", ""},
{4, "LN", 0, "Natural Logarithm", ""},
+ {5, "SINC", 0, "Normalised Sine", "sin(x) / x"},
{0, NULL, 0, NULL, NULL}};
-
-
- srna= RNA_def_struct(brna, "FModifierGenerator_Function", "FModifier");
- RNA_def_struct_ui_text(srna, "Built-In Function Generator", "Generates values for modified F-Curve using Built-In Function.");
-
- /* common settings */
- rna_def_fmodifier_generator_common(srna);
- /* type */
- prop= RNA_def_property(srna, "func_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Type", "Type of Built-In function to use as generator.");
+ srna= RNA_def_struct(brna, "FModifierFunctionGenerator", "FModifier");
+ RNA_def_struct_ui_text(srna, "Built-In Function F-Modifier", "Generates values using a Built-In Function.");
+ RNA_def_struct_sdna_from(srna, "FMod_FunctionGenerator", "data");
/* coefficients */
prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_funcs(prop, "FModGenFunc_amplitude_get", "FModGenFunc_amplitude_set", NULL);
- RNA_def_property_ui_text(prop, "Amplitude", "Scale factor for y-values generated by the function.");
+ RNA_def_property_ui_text(prop, "Amplitude", "Scale factor determining the maximum/minimum values.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
- prop= RNA_def_property(srna, "pre_multiplier", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_funcs(prop, "FModGenFunc_pre_multiplier_get", "FModGenFunc_pre_multiplier_set", NULL);
- RNA_def_property_ui_text(prop, "PreMultiplier", "Scale factor for x-value inputs to function.");
+ prop= RNA_def_property(srna, "phase_multiplier", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Phase Multiplier", "Scale factor determining the 'speed' of the function.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
- prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_funcs(prop, "FModGenFunc_x_offset_get", "FModGenFunc_x_offset_set", NULL);
- RNA_def_property_ui_text(prop, "X Offset", "Offset for x-value inputs to function.");
+ prop= RNA_def_property(srna, "phase_offset", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Phase Offset", "Constant factor to offset time by for function.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ prop= RNA_def_property(srna, "value_offset", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Value Offset", "Constant factor to offset values by.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ /* flags */
+ prop= RNA_def_property(srna, "additive", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_GENERATOR_ADDITIVE);
+ RNA_def_property_ui_text(prop, "Additive", "Values generated by this modifier are applied on top of the existing values instead of overwriting them.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
- prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_funcs(prop, "FModGenFunc_y_offset_get", "FModGenFunc_y_offset_set", NULL);
- RNA_def_property_ui_text(prop, "Y Offset", "Offset for y-values generated by the function.");
+ prop= RNA_def_property(srna, "function_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, "Type", "Type of built-in function to use.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
}
/* --------- */
+static void rna_def_fmodifier_envelope_ctrl(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "FModifierEnvelopeControlPoint", NULL);
+ RNA_def_struct_ui_text(srna, "Envelope Control Point", "Control point for envelope F-Modifier.");
+ RNA_def_struct_sdna(srna, "FCM_EnvelopeData");
+
+ /* min/max extents
+ * - for now, these are allowed to go past each other, so that we can have inverted action
+ * - technically, the range is limited by the settings in the envelope-modifier data, not here...
+ */
+ prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "min");
+ RNA_def_property_ui_text(prop, "Minimum Value", "Lower bound of envelope at this control-point.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "max");
+ RNA_def_property_ui_text(prop, "Maximum Value", "Upper bound of envelope at this control-point.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ /* Frame */
+ prop= RNA_def_property(srna, "frame", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "time");
+ RNA_def_property_ui_text(prop, "Frame", "Frame this control-point occurs on.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ // TODO:
+ // - selection flags (not implemented in UI yet though)
+}
+
static void rna_def_fmodifier_envelope(BlenderRNA *brna)
{
StructRNA *srna;
- //PropertyRNA *prop;
+ PropertyRNA *prop;
srna= RNA_def_struct(brna, "FModifierEnvelope", "FModifier");
- RNA_def_struct_ui_text(srna, "Envelope F-Curve Modifier", "Scales the values of the modified F-Curve.");
+ RNA_def_struct_ui_text(srna, "Envelope F-Modifier", "Scales the values of the modified F-Curve.");
RNA_def_struct_sdna_from(srna, "FMod_Envelope", "data");
+
+ /* Collections */
+ prop= RNA_def_property(srna, "control_points", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "data", "totvert");
+ RNA_def_property_struct_type(prop, "FModifierEnvelopeControlPoint");
+ RNA_def_property_ui_text(prop, "Control Points", "Control points defining the shape of the envelope.");
+
+ /* Range Settings */
+ prop= RNA_def_property(srna, "reference_value", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "midval");
+ RNA_def_property_ui_text(prop, "Reference Value", "Value that envelope's influence is centered around / based on.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ prop= RNA_def_property(srna, "default_minimum", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "min");
+ RNA_def_property_ui_text(prop, "Default Minimum", "Lower distance from Reference Value for 1:1 default influence.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
+
+ prop= RNA_def_property(srna, "default_maximum", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "max");
+ RNA_def_property_ui_text(prop, "Default Maximum", "Upper distance from Reference Value for 1:1 default influence.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
}
/* --------- */
@@ -343,25 +324,28 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "FModifierCycles", "FModifier");
- RNA_def_struct_ui_text(srna, "Cycles F-Curve Modifier", "Repeats the values of the modified F-Curve.");
+ RNA_def_struct_ui_text(srna, "Cycles F-Modifier", "Repeats the values of the modified F-Curve.");
RNA_def_struct_sdna_from(srna, "FMod_Cycles", "data");
/* before */
prop= RNA_def_property(srna, "before_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "Before Mode", "Cycling mode to use before first keyframe.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "before_cycles", PROP_FLOAT, PROP_NONE);
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_EDIT, NULL);
/* after */
prop= RNA_def_property(srna, "after_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "After Mode", "Cycling mode to use after last keyframe.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "after_cycles", PROP_FLOAT, PROP_NONE);
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_EDIT, NULL);
}
/* --------- */
@@ -372,7 +356,7 @@ static void rna_def_fmodifier_python(BlenderRNA *brna)
//PropertyRNA *prop;
srna= RNA_def_struct(brna, "FModifierPython", "FModifier");
- RNA_def_struct_ui_text(srna, "Python F-Curve Modifier", "Performs user-defined operation on the modified F-Curve.");
+ RNA_def_struct_ui_text(srna, "Python F-Modifier", "Performs user-defined operation on the modified F-Curve.");
RNA_def_struct_sdna_from(srna, "FMod_Python", "data");
}
@@ -384,40 +368,48 @@ static void rna_def_fmodifier_limits(BlenderRNA *brna)
PropertyRNA *prop;
srna= RNA_def_struct(brna, "FModifierLimits", "FModifier");
- RNA_def_struct_ui_text(srna, "Limits F-Curve Modifier", "Limits the time/value ranges of the modified F-Curve.");
+ RNA_def_struct_ui_text(srna, "Limits F-Modifier", "Limits the time/value ranges of the modified F-Curve.");
RNA_def_struct_sdna_from(srna, "FMod_Limits", "data");
prop= RNA_def_property(srna, "use_minimum_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_XMIN);
RNA_def_property_ui_text(prop, "Minimum X", "Use the minimum X value.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "use_minimum_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_YMIN);
RNA_def_property_ui_text(prop, "Minimum Y", "Use the minimum Y value.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "use_maximum_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_XMAX);
RNA_def_property_ui_text(prop, "Maximum X", "Use the maximum X value.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "use_maximum_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCM_LIMIT_YMAX);
RNA_def_property_ui_text(prop, "Maximum Y", "Use the maximum Y value.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "minimum_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rect.xmin");
RNA_def_property_ui_text(prop, "Minimum X", "Lowest X value to allow.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "minimum_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rect.ymin");
RNA_def_property_ui_text(prop, "Minimum Y", "Lowest Y value to allow.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "maximum_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rect.xmax");
RNA_def_property_ui_text(prop, "Maximum X", "Highest X value to allow.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "maximum_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rect.ymax");
RNA_def_property_ui_text(prop, "Maximum Y", "Highest Y value to allow.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
}
/* --------- */
@@ -435,35 +427,40 @@ static void rna_def_fmodifier_noise(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "FModifierNoise", "FModifier");
- RNA_def_struct_ui_text(srna, "Noise F-Curve Modifier", "Gives randomness to the modified F-Curve.");
+ RNA_def_struct_ui_text(srna, "Noise F-Modifier", "Gives randomness to the modified F-Curve.");
RNA_def_struct_sdna_from(srna, "FMod_Noise", "data");
prop= RNA_def_property(srna, "modification", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_modification_items);
RNA_def_property_ui_text(prop, "Modification", "Method of modifying the existing F-Curve.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Size", "Scaling (in time) of the noise");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "strength");
RNA_def_property_ui_text(prop, "Strength", "Amplitude of the noise - the amount that it modifies the underlying curve");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "phase");
RNA_def_property_ui_text(prop, "Phase", "A random seed for the noise effect");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "depth");
RNA_def_property_ui_text(prop, "Depth", "Amount of fine level detail present in the noise");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL);
}
/* --------- */
-void rna_def_fmodifier(BlenderRNA *brna)
+static void rna_def_fmodifier(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -471,7 +468,7 @@ void rna_def_fmodifier(BlenderRNA *brna)
/* base struct definition */
srna= RNA_def_struct(brna, "FModifier", NULL);
RNA_def_struct_refine_func(srna, "rna_FModifierType_refine");
- RNA_def_struct_ui_text(srna, "FCurve Modifier", "Modifier for values of F-Curve.");
+ RNA_def_struct_ui_text(srna, "F-Modifier", "Modifier for values of F-Curve.");
#if 0 // XXX not used yet
/* name */
@@ -495,22 +492,25 @@ void rna_def_fmodifier(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "F-Curve Modifier will not be evaluated.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
// XXX this is really an internal flag, but it may be useful for some tools to be able to access this...
prop= RNA_def_property(srna, "disabled", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_DISABLED);
RNA_def_property_ui_text(prop, "Disabled", "F-Curve Modifier has invalid settings and will not be evaluated.");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
// TODO: setting this to true must ensure that all others in stack are turned off too...
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", FMODIFIER_FLAG_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "F-Curve Modifier is the one being edited ");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
}
/* *********************** */
-void rna_def_drivertarget(BlenderRNA *brna)
+static void rna_def_drivertarget(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -536,7 +536,7 @@ void rna_def_drivertarget(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific property used (if applicable)");
}
-void rna_def_channeldriver(BlenderRNA *brna)
+static void rna_def_channeldriver(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -569,7 +569,28 @@ void rna_def_channeldriver(BlenderRNA *brna)
/* *********************** */
-void rna_def_fcurve(BlenderRNA *brna)
+static void rna_def_fpoint(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "FCurveSample", NULL);
+ RNA_def_struct_sdna(srna, "FPoint");
+ RNA_def_struct_ui_text(srna, "F-Curve Sample", "Sample point for F-Curve.");
+
+ /* Boolean values */
+ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
+ RNA_def_property_ui_text(prop, "Selected", "Selection status");
+
+ /* Vector value */
+ prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_array(prop, 2);
+ RNA_def_property_float_sdna(prop, NULL, "vec");
+ RNA_def_property_ui_text(prop, "Point", "Point coordinates");
+}
+
+static void rna_def_fcurve(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -619,7 +640,7 @@ void rna_def_fcurve(BlenderRNA *brna)
/* Collections */
prop= RNA_def_property(srna, "sampled_points", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fpt", "totvert");
- RNA_def_property_struct_type(prop, "CurvePoint"); // XXX FPoints not BPoints here! FPoints are much smaller!
+ RNA_def_property_struct_type(prop, "FCurveSample");
RNA_def_property_ui_text(prop, "Sampled Points", "Sampled animation data");
prop= RNA_def_property(srna, "keyframe_points", PROP_COLLECTION, PROP_NONE);
@@ -637,6 +658,7 @@ void rna_def_fcurve(BlenderRNA *brna)
void RNA_def_fcurve(BlenderRNA *brna)
{
rna_def_fcurve(brna);
+ rna_def_fpoint(brna);
rna_def_drivertarget(brna);
rna_def_channeldriver(brna);
@@ -644,9 +666,9 @@ void RNA_def_fcurve(BlenderRNA *brna)
rna_def_fmodifier(brna);
rna_def_fmodifier_generator(brna);
- rna_def_fmodifier_generator_polyexpanded(brna);
- rna_def_fmodifier_generator_function(brna);
+ rna_def_fmodifier_function_generator(brna);
rna_def_fmodifier_envelope(brna);
+ rna_def_fmodifier_envelope_ctrl(brna);
rna_def_fmodifier_cycles(brna);
rna_def_fmodifier_python(brna);
rna_def_fmodifier_limits(brna);
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 4e047ff7772..c415b3d716a 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -31,8 +31,23 @@
#include "DNA_object_fluidsim.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_particle_types.h"
+
+#include "BKE_depsgraph.h"
+#include "BKE_fluidsim.h"
+#include "BKE_main.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
+
static StructRNA* rna_FluidSettings_refine(struct PointerRNA *ptr)
{
FluidsimSettings *fss= (FluidsimSettings*)ptr->data;
@@ -57,6 +72,93 @@ static StructRNA* rna_FluidSettings_refine(struct PointerRNA *ptr)
}
}
+static void rna_fluid_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= ptr->id.data;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+}
+
+static void rna_FluidSettings_update_type(bContext *C, PointerRNA *ptr)
+{
+ Main *bmain= CTX_data_main(C);
+ Object *ob= (Object*)ptr->id.data;
+ FluidsimModifierData *fluidmd;
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *psys;
+ ParticleSettings *part;
+
+ fluidmd= (FluidsimModifierData*)modifiers_findByType(ob, eModifierType_Fluidsim);
+ fluidmd->fss->flag &= ~OB_FLUIDSIM_REVERSE; // clear flag
+
+ /* remove fluidsim particle system */
+ if(fluidmd->fss->type & OB_FLUIDSIM_PARTICLE) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ if(psys->part->type == PART_FLUID)
+ break;
+
+ if(ob->type == OB_MESH && !psys) {
+ /* add particle system */
+ part= psys_new_settings("ParticleSettings", bmain);
+ psys= MEM_callocN(sizeof(ParticleSystem), "particle_system");
+
+ part->type= PART_FLUID;
+ psys->part= part;
+ psys->pointcache= BKE_ptcache_add(&psys->ptcaches);
+ psys->flag |= PSYS_ENABLED;
+ BLI_addtail(&ob->particlesystem,psys);
+
+ /* add modifier */
+ psmd= (ParticleSystemModifierData*)modifier_new(eModifierType_ParticleSystem);
+ sprintf(psmd->modifier.name, "FluidParticleSystem" );
+ psmd->psys= psys;
+ BLI_addtail(&ob->modifiers, psmd);
+ }
+ }
+ else {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(psys->part->type == PART_FLUID) {
+ /* clear modifier */
+ psmd= psys_get_modifier(ob, psys);
+ BLI_remlink(&ob->modifiers, psmd);
+ modifier_free((ModifierData *)psmd);
+
+ /* clear particle system */
+ BLI_remlink(&ob->particlesystem, psys);
+ psys_free(ob, psys);
+ }
+ }
+ }
+
+ rna_fluid_update(C, ptr);
+}
+
+static void rna_DomainFluidSettings_memory_estimate_get(PointerRNA *ptr, char *value)
+{
+#ifdef DISABLE_ELBEEM
+ value[0]= '\0';
+#else
+ Object *ob= (Object*)ptr->id.data;
+ FluidsimSettings *fss= (FluidsimSettings*)ptr->data;
+
+ fluid_estimate_memory(ob, fss, value);
+#endif
+}
+
+static int rna_DomainFluidSettings_memory_estimate_length(PointerRNA *ptr)
+{
+ return 32;
+}
+
+static char *rna_FluidSettings_path(PointerRNA *ptr)
+{
+ FluidsimSettings *fss = (FluidsimSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)fss->fmd;
+
+ return BLI_sprintfN("modifiers[%s].settings", md->name);
+}
+
#else
static void rna_def_fluidsim_slip(StructRNA *srna)
@@ -74,7 +176,7 @@ static void rna_def_fluidsim_slip(StructRNA *srna)
RNA_def_property_enum_items(prop, slip_items);
RNA_def_property_ui_text(prop, "Slip Type", "");
- prop= RNA_def_property(srna, "partial_slip_amount", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "partial_slip_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "partSlipValue");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Partial Slip Amount", "Amount of mixing between no- and free-slip, 0 is no slip and 1 is free slip.");
@@ -114,12 +216,12 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
RNA_def_property_range(prop, 1, 100);
RNA_def_property_ui_text(prop, "Preview Resolution", "Preview resolution in X,Y and Z direction.");
- prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "animStart");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Start Time", "Simulation time of the first blender frame.");
- prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "animEnd");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "End Time", "Simulation time of the last blender frame.");
@@ -128,6 +230,7 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "guiDisplayMode");
RNA_def_property_enum_items(prop, quality_items);
RNA_def_property_ui_text(prop, "Viewport Display Mode", "How to display the mesh in the viewport.");
+ RNA_def_property_update(prop, 0, "rna_fluid_update");
prop= RNA_def_property(srna, "render_display_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "renderDisplayMode");
@@ -142,10 +245,16 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
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.");
+ RNA_def_property_update(prop, 0, "rna_fluid_update");
+
+ prop= RNA_def_property(srna, "memory_estimate", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_string_funcs(prop, "rna_DomainFluidSettings_memory_estimate_get", "rna_DomainFluidSettings_memory_estimate_length", NULL);
+ RNA_def_property_ui_text(prop, "Memory Estimate", "Estimated amount of memory needed for baking the domain.");
/* advanced settings */
- prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
RNA_def_property_float_sdna(prop, NULL, "gravx");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -1000.1, 1000.1);
@@ -179,7 +288,7 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
prop= RNA_def_property(srna, "compressibility", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "gstar");
RNA_def_property_range(prop, 0.001, 0.1);
- RNA_def_property_ui_text(prop, "Compressibility", "Allowed compressibility due to gravitational force for standing fluid (directly affects simulation step size).");
+ RNA_def_property_ui_text(prop, "Compressibility", "Allowed compressibility due to gravitational force for standing fluid. (directly affects simulation step size)");
/* domain boundary settings */
@@ -243,7 +352,7 @@ static void rna_def_fluidsim_fluid(BlenderRNA *brna)
rna_def_fluidsim_volume(srna);
- prop= RNA_def_property(srna, "initial_velocity", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "initial_velocity", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "iniVelx");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -1000.1, 1000.1);
@@ -279,7 +388,7 @@ static void rna_def_fluidsim_inflow(BlenderRNA *brna)
rna_def_fluidsim_volume(srna);
- prop= RNA_def_property(srna, "inflow_velocity", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "inflow_velocity", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "iniVelx");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -1000.1, 1000.1);
@@ -287,7 +396,7 @@ static void rna_def_fluidsim_inflow(BlenderRNA *brna)
prop= RNA_def_property(srna, "local_coordinates", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSINFLOW_LOCALCOORD);
- RNA_def_property_ui_text(prop, "Local Coordinates", "Use local coordinates for inflow (e.g. for rotating objects).");
+ RNA_def_property_ui_text(prop, "Local Coordinates", "Use local coordinates for inflow. (e.g. for rotating objects)");
}
static void rna_def_fluidsim_outflow(BlenderRNA *brna)
@@ -330,12 +439,13 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
prop= RNA_def_property(srna, "alpha_influence", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "particleInfAlpha");
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).");
+ 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, "path", PROP_STRING, PROP_DIRPATH);
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.");
+ RNA_def_property_update(prop, 0, "rna_fluid_update");
}
static void rna_def_fluidsim_control(BlenderRNA *brna)
@@ -347,12 +457,12 @@ static void rna_def_fluidsim_control(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "FluidsimSettings");
RNA_def_struct_ui_text(srna, "Control Fluid Simulation Settings", "Fluid simulation settings for objects controlling the motion of fluid in the simulation.");
- prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "cpsTimeStart");
RNA_def_property_range(prop, 0.0, 100.0);
RNA_def_property_ui_text(prop, "Start Time", "Specifies time when the control particles are activated.");
- prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "end_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "cpsTimeEnd");
RNA_def_property_range(prop, 0.0, 100.0);
RNA_def_property_ui_text(prop, "End Time", "Specifies time when the control particles are deactivated.");
@@ -380,7 +490,7 @@ static void rna_def_fluidsim_control(BlenderRNA *brna)
prop= RNA_def_property(srna, "quality", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "cpsQuality");
RNA_def_property_range(prop, 5.0, 100.0);
- RNA_def_property_ui_text(prop, "Quality", "Specifies the quality which is used for object sampling (higher = better but slower).");
+ RNA_def_property_ui_text(prop, "Quality", "Specifies the quality which is used for object sampling. (higher = better but slower)");
prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
@@ -393,7 +503,7 @@ void RNA_def_fluidsim(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_fluid_type_items[] = {
- {0, "NONE", 0, "None", ""},
+ {OB_FLUIDSIM_ENABLE, "NONE", 0, "None", ""},
{OB_FLUIDSIM_DOMAIN, "DOMAIN", 0, "Domain", "Bounding box of this object represents the computational domain of the fluid simulation."},
{OB_FLUIDSIM_FLUID, "FLUID", 0, "Fluid", "Object represents a volume of fluid in the simulation."},
{OB_FLUIDSIM_OBSTACLE, "OBSTACLE", 0, "Obstacle", "Object is a fixed obstacle."},
@@ -407,20 +517,14 @@ void RNA_def_fluidsim(BlenderRNA *brna)
srna= RNA_def_struct(brna, "FluidSettings", NULL);
RNA_def_struct_sdna(srna, "FluidsimSettings");
RNA_def_struct_refine_func(srna, "rna_FluidSettings_refine");
+ RNA_def_struct_path_func(srna, "rna_FluidSettings_path");
RNA_def_struct_ui_text(srna, "Fluid Simulation Settings", "Fluid simulation settings for an object taking part in the simulation.");
- /* enable and type */
-
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "type", OB_FLUIDSIM_ENABLE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); // needs to create modifier
- RNA_def_property_ui_text(prop, "Enabled", "Sets object to participate in fluid simulation.");
-
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_fluid_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); // needs to update variables
RNA_def_property_ui_text(prop, "Type", "Type of participation in the fluid simulation.");
+ RNA_def_property_update(prop, 0, "rna_FluidSettings_update_type");
//prop= RNA_def_property(srna, "ipo", PROP_POINTER, PROP_NONE);
//RNA_def_property_ui_text(prop, "Ipo Curves", "Ipo curves used by fluid simulation settings.");
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
new file mode 100644
index 00000000000..2a4ff112c3c
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -0,0 +1,252 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation (2009), Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+#include "RNA_enum_types.h"
+
+#include "rna_internal.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_scene_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#ifdef RNA_RUNTIME
+
+static int rna_GPencilLayer_active_frame_editable(PointerRNA *ptr)
+{
+ bGPDlayer *gpl= (bGPDlayer *)ptr->data;
+
+ /* surely there must be other criteria too... */
+ if (gpl->flag & GP_LAYER_LOCKED)
+ return 0;
+ else
+ return 1;
+}
+
+static void rna_GPencilLayer_active_set(PointerRNA *ptr, int value)
+{
+ bGPdata *gpd= ptr->id.data;
+ bGPDlayer *gpl= ptr->data;
+
+ /* disabled all other layers anyway */
+ if (GS(gpd->id.name) == ID_GD) {
+ bGPDlayer *gl;
+
+ for (gl= gpd->layers.first; gl; gl= gl->next)
+ gl->flag &= ~GP_LAYER_ACTIVE;
+ }
+
+ /* if enabling value, make it active */
+ if (value)
+ gpl->flag |= GP_LAYER_ACTIVE;
+}
+
+#else
+
+static void rna_def_gpencil_stroke_point(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "GPencilStrokePoint", NULL);
+ RNA_def_struct_sdna(srna, "bGPDspoint");
+ RNA_def_struct_ui_text(srna, "Grease Pencil Stroke Point", "Data point for freehand stroke curve.");
+
+ prop= RNA_def_property(srna, "coordinates", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "x");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Coordinates", "");
+
+ prop= RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "pressure");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Pressure", "Pressure of tablet at point when drawing it.");
+}
+
+static void rna_def_gpencil_stroke(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "GPencilStroke", NULL);
+ RNA_def_struct_sdna(srna, "bGPDstroke");
+ RNA_def_struct_ui_text(srna, "Grease Pencil Stroke", "Freehand curve defining part of a sketch.");
+
+ /* Points */
+ prop= RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "points", "totpoints");
+ RNA_def_property_struct_type(prop, "GPencilStrokePoint");
+ RNA_def_property_ui_text(prop, "Stroke Points", "Stroke data points");
+
+ /* Flags - Readonly type-info really... */
+ // TODO...
+}
+
+static void rna_def_gpencil_frame(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "GPencilFrame", NULL);
+ RNA_def_struct_sdna(srna, "bGPDframe");
+ RNA_def_struct_ui_text(srna, "Grease Pencil Frame", "Collection of related sketches on a particular frame");
+
+ /* Strokes */
+ prop= RNA_def_property(srna, "strokes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "strokes", NULL);
+ RNA_def_property_struct_type(prop, "GPencilStroke");
+ RNA_def_property_ui_text(prop, "Strokes", "Freehand curves defining the sketch on this frame.");
+
+ /* Frame Number */
+ prop= RNA_def_property(srna, "frame_number", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "framenum");
+ RNA_def_property_range(prop, MINFRAME, MAXFRAME); // XXX note: this cannot occur on the same frame as another sketch
+ RNA_def_property_ui_text(prop, "Frame Number", "The frame on which this sketch appears.");
+
+ /* Flags */
+ prop= RNA_def_property(srna, "paint_lock", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_PAINT); // XXX should it be editable?
+ RNA_def_property_ui_text(prop, "Paint Lock", "Frame is being edited (painted on).");
+
+ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_SELECT);
+ RNA_def_property_ui_text(prop, "Selected", "Frame is selected for editing in the DopeSheet.");
+}
+
+static void rna_def_gpencil_layer(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "GPencilLayer", NULL);
+ RNA_def_struct_sdna(srna, "bGPDlayer");
+ RNA_def_struct_ui_text(srna, "Grease Pencil Layer", "Collection of related sketches");
+
+ /* Name */
+ prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Info", "Description of layer");
+ RNA_def_struct_name_property(srna, prop);
+
+ /* Frames */
+ prop= RNA_def_property(srna, "frames", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "frames", NULL);
+ RNA_def_property_struct_type(prop, "GPencilFrame");
+ RNA_def_property_ui_text(prop, "Frames", "Sketches for this layer on different frames.");
+
+ /* Active Frame */
+ prop= RNA_def_property(srna, "active_frame", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "actframe");
+ RNA_def_property_ui_text(prop, "Active Frame", "Frame currently being displayed for this layer.");
+ RNA_def_property_editable_func(prop, "rna_GPencilLayer_active_frame_editable");
+
+ /* Drawing Color */
+ prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Color", "Color that all sketches in this layer are drawn with.");
+
+ prop= RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "color[3]");
+ RNA_def_property_range(prop, 0.3, 1.0f);
+ RNA_def_property_ui_text(prop, "Opacity", "Visibility of strokes.");
+
+ /* Line Thickness */
+ prop= RNA_def_property(srna, "line_thickness", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "thickness");
+ RNA_def_property_range(prop, 1, 10);
+ RNA_def_property_ui_text(prop, "Thickness", "Thickness of strokes (in pixels).");
+
+ /* Onion-Skinning */
+ prop= RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ONIONSKIN);
+ RNA_def_property_ui_text(prop, "Use Onion Skinning", "Ghost frames on either side of frame.");
+
+ prop= RNA_def_property(srna, "max_ghost_range", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "gstep");
+ RNA_def_property_range(prop, 0, 120);
+ RNA_def_property_ui_text(prop, "Max Ghost Range", "Maximum number of frames on either side of the active frame to show. (0 = just show the 'first' available sketch on either side)");
+
+ /* Flags */
+ prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE);
+ RNA_def_property_ui_text(prop, "Hide", "Layer doesn't get drawn.");
+
+ prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_LOCKED);
+ RNA_def_property_ui_text(prop, "Locked", "Layer is protected from further editing and/or frame changes.");
+
+ prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ACTIVE);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencilLayer_active_set");
+ RNA_def_property_ui_text(prop, "Active", "Layer is 'active' layer being edited.");
+
+ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SELECT);
+ RNA_def_property_ui_text(prop, "Selected", "Layer is selected for editing in the DopeSheet.");
+
+ // XXX keep this option?
+ prop= RNA_def_property(srna, "show_points", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_DRAWDEBUG);
+ RNA_def_property_ui_text(prop, "Show Points", "Draw the points which make up the strokes (for debugging purposes).");
+
+}
+
+static void rna_def_gpencil_data(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "GreasePencil", "ID");
+ RNA_def_struct_sdna(srna, "bGPdata");
+ RNA_def_struct_ui_text(srna, "Grease Pencil", "Freehand annotation sketchbook.");
+ RNA_def_struct_ui_icon(srna, ICON_GREASEPENCIL);
+
+ /* Layers */
+ prop= RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "layers", NULL);
+ RNA_def_property_struct_type(prop, "GPencilLayer");
+ RNA_def_property_ui_text(prop, "Layers", "Similar to layers in Photoshop.");
+
+ /* Flags */
+ prop= RNA_def_property(srna, "view_space_draw", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_DATA_VIEWALIGN);
+ RNA_def_property_ui_text(prop, "Stick to View", "Newly drawn strokes get added in view space (i.e. sketches stick to data when view is manipulated).");
+}
+
+/* --- */
+
+void RNA_def_gpencil(BlenderRNA *brna)
+{
+ rna_def_gpencil_data(brna);
+
+ rna_def_gpencil_layer(brna);
+ rna_def_gpencil_frame(brna);
+ rna_def_gpencil_stroke(brna);
+ rna_def_gpencil_stroke_point(brna);
+}
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c
index 1406ad1ae60..dddc2062f07 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -33,7 +33,7 @@
#ifdef RNA_RUNTIME
-PointerRNA rna_Group_objects_get(CollectionPropertyIterator *iter)
+static PointerRNA rna_Group_objects_get(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -52,7 +52,7 @@ void RNA_def_group(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Group", "Group of Object datablocks.");
RNA_def_struct_ui_icon(srna, ICON_GROUP);
- prop= RNA_def_property(srna, "dupli_offset", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "dupli_offset", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "dupli_ofs");
RNA_def_property_ui_text(prop, "Dupli Offset", "Offset from the center to use when instancing as DupliGroup.");
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4);
@@ -63,7 +63,7 @@ void RNA_def_group(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Objects", "A collection of this groups objects.");
RNA_def_property_collection_funcs(prop, 0, 0, 0, "rna_Group_objects_get", 0, 0, 0, 0, 0);
- prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER);
RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_ui_text(prop, "Dupli Layers", "Layers visible when this groups is instanced as a dupli.");
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 4a6fdf5a734..db7a8afb4a4 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -37,8 +37,18 @@
#include "WM_types.h"
+static EnumPropertyItem image_source_items[]= {
+ {IMA_SRC_FILE, "FILE", 0, "File", "Single image file"},
+ {IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Sequence", "Multiple image files, as a sequence"},
+ {IMA_SRC_MOVIE, "MOVIE", 0, "Movie", "Movie file"},
+ {IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
+ {IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+#include "IMB_imbuf_types.h"
+
static void rna_Image_animated_update(bContext *C, PointerRNA *ptr)
{
Image *ima= (Image*)ptr->data;
@@ -52,6 +62,111 @@ static void rna_Image_animated_update(bContext *C, PointerRNA *ptr)
}
}
+static int rna_Image_dirty_get(PointerRNA *ptr)
+{
+ Image *ima= (Image*)ptr->data;
+ ImBuf *ibuf;
+
+ for(ibuf=ima->ibufs.first; ibuf; ibuf=ibuf->next)
+ if(ibuf->userflags & IB_BITMAPDIRTY)
+ return 1;
+
+ return 0;
+}
+
+static void rna_Image_source_update(bContext *C, PointerRNA *ptr)
+{
+ Image *ima= ptr->id.data;
+ BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE);
+}
+
+static void rna_Image_fields_update(bContext *C, PointerRNA *ptr)
+{
+ Image *ima= ptr->id.data;
+ ImBuf *ibuf;
+
+ ibuf= BKE_image_get_ibuf(ima, NULL);
+
+ if(ibuf) {
+ short nr= 0;
+
+ if(!(ima->flag & IMA_FIELDS) && (ibuf->flags & IB_fields)) nr= 1;
+ if((ima->flag & IMA_FIELDS) && !(ibuf->flags & IB_fields)) nr= 1;
+
+ if(nr)
+ BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
+ }
+}
+
+static void rna_Image_reload_update(bContext *C, PointerRNA *ptr)
+{
+ Image *ima= ptr->id.data;
+ BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
+ printf("reload %p\n", ima);
+}
+
+static void rna_Image_generated_update(bContext *C, PointerRNA *ptr)
+{
+ Image *ima= ptr->id.data;
+ BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
+}
+
+static void rna_ImageUser_update(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene= CTX_data_scene(C);
+ ImageUser *iuser= ptr->data;
+
+ BKE_image_user_calc_imanr(iuser, scene->r.cfra, 0);
+}
+
+static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Image *ima= (Image*)ptr->data;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(C==NULL) /* needed for doc generation */
+ return image_source_items;
+
+ if(ima->source == IMA_SRC_VIEWER) {
+ RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_VIEWER);
+ }
+ else {
+ RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_FILE);
+ RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_SEQUENCE);
+ RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_MOVIE);
+ RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_GENERATED);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
+static int rna_Image_has_data_get(PointerRNA *ptr)
+{
+ Image *im= (Image*)ptr->data;
+
+ if (im->ibufs.first)
+ return 1;
+
+ return 0;
+}
+
+static int rna_Image_depth_get(PointerRNA *ptr)
+{
+ Image *im= (Image*)ptr->data;
+ ImBuf *ibuf= BKE_image_get_ibuf(im, NULL);
+
+ if (!ibuf) return 0;
+
+ if (ibuf->rect_float)
+ return 128;
+
+ return ibuf->depth;
+}
+
#else
static void rna_def_imageuser(BlenderRNA *brna)
@@ -65,29 +180,35 @@ static void rna_def_imageuser(BlenderRNA *brna)
prop= RNA_def_property(srna, "auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
RNA_def_property_ui_text(prop, "Auto Refresh", "Always refresh image on frame changes.");
+ RNA_def_property_update(prop, 0, "rna_ImageUser_update");
/* animation */
prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cycl", 0);
RNA_def_property_ui_text(prop, "Cyclic", "Cycle the images in the movie.");
+ RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "frames", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Frames", "Sets the number of images of a movie to use.");
+ RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation.");
+ RNA_def_property_update(prop, 0, "rna_ImageUser_update");
- prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "sfra");
RNA_def_property_range(prop, 1.0f, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie.");
+ 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, -MAXFRAMEF, MAXFRAMEF);
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");
prop= RNA_def_property(srna, "multilayer_layer", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "layer");
@@ -107,25 +228,22 @@ static void rna_def_image(BlenderRNA *brna)
static const EnumPropertyItem prop_type_items[]= {
{IMA_TYPE_IMAGE, "IMAGE", 0, "Image", ""},
{IMA_TYPE_MULTILAYER, "MULTILAYER", 0, "Multilayer", ""},
- {IMA_TYPE_UV_TEST, "UVTEST", 0, "UV Test", ""},
- {IMA_TYPE_R_RESULT, "RENDERRESULT", 0, "Render Result", ""},
+ {IMA_TYPE_UV_TEST, "UV_TEST", 0, "UV Test", ""},
+ {IMA_TYPE_R_RESULT, "RENDER_RESULT", 0, "Render Result", ""},
{IMA_TYPE_COMPOSITE, "COMPOSITING", 0, "Compositing", ""},
{0, NULL, 0, NULL, NULL}};
- static const EnumPropertyItem prop_source_items[]= {
- {IMA_SRC_FILE, "FILE", 0, "File", "Single image file"},
- {IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Sequence", "Multiple image files, as a sequence"},
- {IMA_SRC_MOVIE, "MOVIE", 0, "Movie", "Movie file"},
- {IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
- {IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
- {0, NULL, 0, NULL, NULL}};
static const EnumPropertyItem prop_generated_type_items[]= {
{0, "BLANK", 0, "Blank", "Generate a blank image"},
- {1, "UVTESTGRID", 0, "UV Test Grid", "Generated grid to test UV mappings"},
+ {1, "UVGRID", 0, "UV Grid", "Generated grid to test UV mappings"},
{0, NULL, 0, NULL, NULL}};
static const EnumPropertyItem prop_mapping_items[]= {
{0, "UV", 0, "UV Coordinates", "Use UV coordinates for mapping the image"},
{IMA_REFLECT, "REFLECTION", 0, "Reflection", "Use reflection mapping for mapping the image"},
{0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_field_order_items[]= {
+ {0, "EVEN", 0, "Even", "Even Fields first"},
+ {IMA_STD_FIELD, "Odd", 0, "Odd", "Odd Fields first"},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Image", "ID");
RNA_def_struct_ui_text(srna, "Image", "Image datablock referencing an external or packed image.");
@@ -133,36 +251,36 @@ static void rna_def_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
RNA_def_property_ui_text(prop, "Filename", "Image/Movie file name.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_source_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
+ RNA_def_property_enum_items(prop, image_source_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Image_source_itemf");
RNA_def_property_ui_text(prop, "Source", "Where the image comes from.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_source_update");
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* imagechanged */
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Type", "How to generate the image.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
prop= RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "packedfile");
RNA_def_property_ui_text(prop, "Packed File", "");
-
+
+ prop= RNA_def_property(srna, "field_order", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, prop_field_order_items);
+ RNA_def_property_ui_text(prop, "Field Order", "Order of video fields. Select which lines are displayed first.");
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+
/* booleans */
prop= RNA_def_property(srna, "fields", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_FIELDS);
RNA_def_property_ui_text(prop, "Fields", "Use fields of the image.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
-
- prop= RNA_def_property(srna, "odd_fields", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_STD_FIELD);
- RNA_def_property_ui_text(prop, "Odd Fields", "Standard field toggle.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_fields_update");
prop= RNA_def_property(srna, "antialias", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANTIALI);
@@ -174,24 +292,29 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ prop= RNA_def_property(srna, "dirty", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_Image_dirty_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Dirty", "Image has changed and is not saved.");
+
/* generated image (image_generated_change_cb) */
prop= RNA_def_property(srna, "generated_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "gen_type");
RNA_def_property_enum_items(prop, prop_generated_type_items);
RNA_def_property_ui_text(prop, "Generated Type", "Generated image type.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
prop= RNA_def_property(srna, "generated_width", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gen_x");
RNA_def_property_range(prop, 1, 16384);
RNA_def_property_ui_text(prop, "Generated Width", "Generated image width.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
prop= RNA_def_property(srna, "generated_height", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gen_y");
RNA_def_property_range(prop, 1, 16384);
RNA_def_property_ui_text(prop, "Generated Height", "Generated image height.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
/* realtime properties */
prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
@@ -200,7 +323,7 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mapping", "Mapping type to use for this image in the game engine.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
- prop= RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "aspx");
RNA_def_property_array(prop, 2);
RNA_def_property_range(prop, 0.1f, 5000.0f);
@@ -256,6 +379,22 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_CLAMP_V);
RNA_def_property_ui_text(prop, "Clamp Y", "Disable texture repeating vertically.");
RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+
+ /*
+ Image.has_data and Image.depth are temporary,
+ Update import_obj.py when they are replaced (Arystan)
+ */
+ prop= RNA_def_property(srna, "has_data", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_Image_has_data_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Has data", "True if this image has data.");
+
+ prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE);
+ RNA_def_property_int_funcs(prop, "rna_Image_depth_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Depth", "Image bit depth.");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ RNA_api_image(srna);
}
void RNA_def_image(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
new file mode 100644
index 00000000000..25c764b8823
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -0,0 +1,82 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "DNA_object_types.h"
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_utildefines.h"
+#include "BKE_image.h"
+
+#include "MEM_guardedalloc.h"
+
+/*
+ User should check if returned path exists before copying a file there.
+
+ TODO: it would be better to return a (abs, rel) tuple.
+*/
+static char *rna_Image_get_export_path(Image *image, char *dest_dir, int rel)
+{
+ int length = FILE_MAX;
+ char *path= MEM_callocN(length, "image file path");
+
+ if (!BKE_get_image_export_path(image, dest_dir, rel ? NULL : path, length, rel ? path : NULL, length )) {
+ MEM_freeN(path);
+ return NULL;
+ }
+
+ return path;
+}
+
+#else
+
+void RNA_api_image(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "get_export_path", "rna_Image_get_export_path");
+ RNA_def_function_ui_description(func, "Produce image export path.");
+ parm= RNA_def_string(func, "dest_dir", "", 0, "", "Destination directory.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_boolean(func, "get_rel_path", 1, "", "Return relative path if True.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_string(func, "path", "", 0, "", "Absolute export path.");
+ RNA_def_function_return(func, parm);
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 7538f103245..3723c05ada0 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -103,7 +103,7 @@ typedef struct BlenderDefRNA {
ListBase structs;
ListBase allocs;
struct StructRNA *laststruct;
- int error, silent, preprocess;
+ int error, silent, preprocess, verify;
} BlenderDefRNA;
extern BlenderDefRNA DefRNA;
@@ -117,6 +117,7 @@ void RNA_def_action(struct BlenderRNA *brna);
void RNA_def_animation(struct BlenderRNA *brna);
void RNA_def_armature(struct BlenderRNA *brna);
void RNA_def_actuator(struct BlenderRNA *brna);
+void RNA_def_boid(struct BlenderRNA *brna);
void RNA_def_brush(struct BlenderRNA *brna);
void RNA_def_brushclone(struct BlenderRNA *brna);
void RNA_def_camera(struct BlenderRNA *brna);
@@ -129,6 +130,7 @@ void RNA_def_curve(struct BlenderRNA *brna);
void RNA_def_fluidsim(struct BlenderRNA *brna);
void RNA_def_fcurve(struct BlenderRNA *brna);
void RNA_def_gameproperty(struct BlenderRNA *brna);
+void RNA_def_gpencil(struct BlenderRNA *brna);
void RNA_def_group(struct BlenderRNA *brna);
void RNA_def_image(struct BlenderRNA *brna);
void RNA_def_key(struct BlenderRNA *brna);
@@ -139,19 +141,23 @@ void RNA_def_material(struct BlenderRNA *brna);
void RNA_def_mesh(struct BlenderRNA *brna);
void RNA_def_meta(struct BlenderRNA *brna);
void RNA_def_modifier(struct BlenderRNA *brna);
+void RNA_def_nla(struct BlenderRNA *brna);
void RNA_def_nodetree(struct BlenderRNA *brna);
void RNA_def_object(struct BlenderRNA *brna);
void RNA_def_object_force(struct BlenderRNA *brna);
void RNA_def_packedfile(struct BlenderRNA *brna);
void RNA_def_particle(struct BlenderRNA *brna);
void RNA_def_pose(struct BlenderRNA *brna);
+void RNA_def_render(struct BlenderRNA *brna);
void RNA_def_rna(struct BlenderRNA *brna);
void RNA_def_scene(struct BlenderRNA *brna);
void RNA_def_screen(struct BlenderRNA *brna);
-void RNA_def_scriptlink(struct BlenderRNA *brna);
+void RNA_def_sculpt_paint(struct BlenderRNA *brna);
void RNA_def_sensor(struct BlenderRNA *brna);
void RNA_def_sequence(struct BlenderRNA *brna);
+void RNA_def_smoke(struct BlenderRNA *brna);
void RNA_def_space(struct BlenderRNA *brna);
+void RNA_def_test(struct BlenderRNA *brna);
void RNA_def_text(struct BlenderRNA *brna);
void RNA_def_texture(struct BlenderRNA *brna);
void RNA_def_timeline_marker(struct BlenderRNA *brna);
@@ -159,7 +165,6 @@ void RNA_def_sound(struct BlenderRNA *brna);
void RNA_def_ui(struct BlenderRNA *brna);
void RNA_def_userdef(struct BlenderRNA *brna);
void RNA_def_vfont(struct BlenderRNA *brna);
-void RNA_def_vpaint(struct BlenderRNA *brna);
void RNA_def_wm(struct BlenderRNA *brna);
void RNA_def_world(struct BlenderRNA *brna);
@@ -168,7 +173,8 @@ void RNA_def_world(struct BlenderRNA *brna);
void rna_def_animdata_common(struct StructRNA *srna);
void rna_def_texmat_common(struct StructRNA *srna, const char *texspace_editable);
-void rna_def_mtex_common(struct StructRNA *srna, const char *begin, const char *activeget, const char *structname);
+void rna_def_mtex_common(struct StructRNA *srna, const char *begin, const char *activeget, const char *activeset, const char *structname);
+void rna_def_render_layer_common(struct StructRNA *srna, int scene);
void rna_ID_name_get(struct PointerRNA *ptr, char *value);
int rna_ID_name_length(struct PointerRNA *ptr);
@@ -177,6 +183,9 @@ struct StructRNA *rna_ID_refine(struct PointerRNA *ptr);
struct IDProperty *rna_ID_idproperties(struct PointerRNA *ptr, int create);
void rna_ID_fake_user_set(struct PointerRNA *ptr, int value);
struct IDProperty *rna_IDPropertyGroup_idproperties(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_refine(struct PointerRNA *ptr);
void rna_object_vgroup_name_index_get(struct PointerRNA *ptr, char *value, int index);
int rna_object_vgroup_name_index_length(struct PointerRNA *ptr, int index);
@@ -185,14 +194,25 @@ void rna_object_vgroup_name_set(struct PointerRNA *ptr, const char *value, char
void rna_object_uvlayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen);
void rna_object_vcollayer_name_set(struct PointerRNA *ptr, const char *value, char *result, int maxlen);
+void rna_Object_update(struct bContext *C, struct PointerRNA *ptr);
+void rna_Object_update_data(struct bContext *C, struct PointerRNA *ptr);
+void rna_Mesh_update_draw(struct bContext *C, struct PointerRNA *ptr);
+
/* API functions */
+void RNA_api_action(StructRNA *srna);
+void RNA_api_image(struct StructRNA *srna);
+void RNA_api_keyingset(struct StructRNA *srna);
void RNA_api_main(struct StructRNA *srna);
+void RNA_api_material(StructRNA *srna);
void RNA_api_mesh(struct StructRNA *srna);
void RNA_api_object(struct StructRNA *srna);
+void RNA_api_scene(struct StructRNA *srna);
+void RNA_api_text(struct StructRNA *srna);
void RNA_api_ui_layout(struct StructRNA *srna);
void RNA_api_wm(struct StructRNA *srna);
+
/* ID Properties */
extern StringPropertyRNA rna_IDProperty_string;
@@ -236,11 +256,12 @@ void rna_iterator_listbase_end(struct CollectionPropertyIterator *iter);
typedef struct ArrayIterator {
char *ptr;
char *endptr;
+ void *free_ptr; /* will be free'd if set */
int itemsize;
IteratorSkipFunc skip;
} ArrayIterator;
-void rna_iterator_array_begin(struct CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, IteratorSkipFunc skip);
+void rna_iterator_array_begin(struct CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip);
void rna_iterator_array_next(struct CollectionPropertyIterator *iter);
void *rna_iterator_array_get(struct CollectionPropertyIterator *iter);
void *rna_iterator_array_dereference_get(struct CollectionPropertyIterator *iter);
@@ -251,10 +272,12 @@ void rna_iterator_array_end(struct CollectionPropertyIterator *iter);
void rna_addtail(struct ListBase *listbase, void *vlink);
void rna_freelinkN(struct ListBase *listbase, void *vlink);
void rna_freelistN(struct ListBase *listbase);
+PropertyDefRNA *rna_findlink(ListBase *listbase, const char *identifier);
StructDefRNA *rna_find_struct_def(StructRNA *srna);
FunctionDefRNA *rna_find_function_def(FunctionRNA *func);
PropertyDefRNA *rna_find_parameter_def(PropertyRNA *parm);
+PropertyDefRNA *rna_find_struct_property_def(StructRNA *srna, PropertyRNA *prop);
/* Pointer Handling */
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index 8bae21cca2b..645bc50ed89 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -39,7 +39,13 @@ struct bContext;
struct IDProperty;
struct GHash;
-#define RNA_MAX_ARRAY 32
+#ifdef UNIT_TEST
+#define RNA_MAX_ARRAY_LENGTH 64
+#else
+#define RNA_MAX_ARRAY_LENGTH 32
+#endif
+
+#define RNA_MAX_ARRAY_DIMENSION 3
/* Function Callbacks */
@@ -49,6 +55,7 @@ typedef struct IDProperty* (*IDPropertiesFunc)(struct PointerRNA *ptr, int creat
typedef struct StructRNA *(*StructRefineFunc)(struct PointerRNA *ptr);
typedef char *(*StructPathFunc)(struct PointerRNA *ptr);
+typedef int (*PropArrayLengthGetFunc)(struct PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION]);
typedef int (*PropBooleanGetFunc)(struct PointerRNA *ptr);
typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, int value);
typedef void (*PropBooleanArrayGetFunc)(struct PointerRNA *ptr, int *values);
@@ -68,7 +75,7 @@ typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr);
typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value);
typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr);
typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value);
-typedef EnumPropertyItem *(*PropEnumItemFunc)(struct PointerRNA *ptr);
+typedef EnumPropertyItem *(*PropEnumItemFunc)(struct bContext *C, struct PointerRNA *ptr, int *free);
typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr);
typedef StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr);
typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value);
@@ -88,14 +95,6 @@ typedef struct ContainerRNA {
ListBase properties;
} ContainerRNA;
-struct ParameterList {
- /* storage for parameters */
- void *data;
-
- /* function passed at creation time */
- FunctionRNA *func;
-};
-
struct FunctionRNA {
/* structs are containers of properties */
ContainerRNA cont;
@@ -137,8 +136,13 @@ struct PropertyRNA {
PropertyType type;
/* subtype, 'interpretation' of the property */
PropertySubType subtype;
- /* if an array this is > 0, specifying the length */
- unsigned int arraylength;
+ /* if non-NULL, overrides arraylength. Must not return 0? */
+ PropArrayLengthGetFunc getlength;
+ /* dimension of array */
+ unsigned int arraydimension;
+ /* array lengths lengths for all dimensions (when arraydimension > 0) */
+ unsigned int arraylength[RNA_MAX_ARRAY_DIMENSION];
+ unsigned int totarraylength;
/* callback for updates on change */
UpdateFunc update;
@@ -146,6 +150,10 @@ struct PropertyRNA {
/* callback for testing if editable/evaluated */
EditableFunc editable;
+
+ /* raw access */
+ int rawoffset;
+ RawPropertyType rawtype;
};
/* Property Types */
@@ -221,7 +229,7 @@ typedef struct EnumPropertyRNA {
PropEnumSetFunc set;
PropEnumItemFunc itemf;
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
int totitem;
int defaultvalue;
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 71e424bbd69..e66ee683e61 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -37,6 +37,31 @@
#ifdef RNA_RUNTIME
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_depsgraph.h"
+#include "BKE_key.h"
+#include "BKE_main.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+static void rna_ShapeKey_value_set(PointerRNA *ptr, float value)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+ CLAMP(value, data->slidermin, data->slidermax);
+ data->curval= value;
+}
+
+static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+
+ *min= data->slidermin;
+ *max= data->slidermax;
+}
+
static Key *rna_ShapeKey_find_key(ID *id)
{
switch(GS(id->name)) {
@@ -62,6 +87,18 @@ static PointerRNA rna_ShapeKey_relative_key_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, NULL, NULL);
}
+static void rna_ShapeKey_relative_key_set(PointerRNA *ptr, PointerRNA value)
+{
+ Key *key= rna_ShapeKey_find_key(ptr->id.data);
+ KeyBlock *kb= (KeyBlock*)ptr->data, *kbrel;
+ int a;
+
+ if(key)
+ for(a=0, kbrel=key->block.first; kbrel; kbrel=kbrel->next, a++)
+ if(kbrel == value.data)
+ kb->relative= a;
+}
+
static void rna_ShapeKeyPoint_co_get(PointerRNA *ptr, float *values)
{
float *vec= (float*)ptr->data;
@@ -176,7 +213,7 @@ static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA
}
}
- rna_iterator_array_begin(iter, (void*)kb->data, size, tot, NULL);
+ rna_iterator_array_begin(iter, (void*)kb->data, size, tot, 0, NULL);
}
static int rna_ShapeKey_data_length(PointerRNA *ptr)
@@ -220,6 +257,20 @@ static PointerRNA rna_ShapeKey_data_get(CollectionPropertyIterator *iter)
return rna_pointer_inherit_refine(&iter->parent, type, rna_iterator_array_get(iter));
}
+static void rna_Key_update_data(bContext *C, PointerRNA *ptr)
+{
+ Main *bmain= CTX_data_main(C);
+ Key *key= ptr->id.data;
+ Object *ob;
+
+ 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);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+ }
+ }
+}
+
#else
static void rna_def_keydata(BlenderRNA *brna)
@@ -230,45 +281,52 @@ 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.");
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyPoint_co_get", "rna_ShapeKeyPoint_co_set", NULL);
RNA_def_property_ui_text(prop, "Location", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
srna= RNA_def_struct(brna, "ShapeKeyCurvePoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Curve Point", "Point in a shape key for curves.");
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyPoint_co_get", "rna_ShapeKeyPoint_co_set", NULL);
RNA_def_property_ui_text(prop, "Location", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyCurvePoint_tilt_get", "rna_ShapeKeyCurvePoint_tilt_set", NULL);
RNA_def_property_ui_text(prop, "Tilt", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
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.");
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_co_get", "rna_ShapeKeyBezierPoint_co_set", NULL);
RNA_def_property_ui_text(prop, "Location", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
- prop= RNA_def_property(srna, "handle_1_co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "handle_1_co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_1_co_get", "rna_ShapeKeyBezierPoint_handle_1_co_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1 Location", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
- prop= RNA_def_property(srna, "handle_2_co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "handle_2_co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_2_co_get", "rna_ShapeKeyBezierPoint_handle_2_co_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2 Location", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
/* appears to be unused currently
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_tilt_get", "rna_ShapeKeyBezierPoint_tilt_set", NULL);
- RNA_def_property_ui_text(prop, "Tilt", "");*/
+ RNA_def_property_ui_text(prop, "Tilt", "");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data"); */
}
static void rna_def_keyblock(BlenderRNA *brna)
@@ -292,34 +350,42 @@ static void rna_def_keyblock(BlenderRNA *brna)
RNA_def_struct_name_property(srna, prop);
/* keys need to be sorted to edit this */
- prop= RNA_def_property(srna, "frame", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame", PROP_FLOAT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_float_sdna(prop, NULL, "pos");
RNA_def_property_ui_text(prop, "Frame", "Frame for absolute keys.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
/* for now, this is editable directly, as users can set this even if they're not animating them (to test results) */
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "curval");
+ RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_value_set", "rna_ShapeKey_value_range");
RNA_def_property_ui_text(prop, "Value", "Value of shape key at the current frame.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_keyblock_type_items);
RNA_def_property_ui_text(prop, "Interpolation", "Interpolation type.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "vgroup");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex weight group, to blend with basis shape.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "relative_key", PROP_POINTER, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "ShapeKey");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", "rna_ShapeKey_relative_key_set", NULL);
RNA_def_property_ui_text(prop, "Relative Key", "Shape used as a relative key.");
- RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", NULL, NULL);
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE);
RNA_def_property_ui_text(prop, "Mute", "Mute this shape key.");
+ RNA_def_property_ui_icon(prop, ICON_MUTE_IPO_OFF, 1);
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "slidermin");
@@ -329,6 +395,7 @@ static void rna_def_keyblock(BlenderRNA *brna)
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_ui_text(prop, "Slider Max", "Maximum for slider.");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
@@ -347,7 +414,8 @@ static void rna_def_key(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Key", "Shape keys datablock containing different shapes of geometric datablocks.");
RNA_def_struct_ui_icon(srna, ICON_SHAPEKEY_DATA);
- prop= RNA_def_property(srna, "reference_key", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "reference_key", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "refkey");
RNA_def_property_ui_text(prop, "Reference Key", "");
@@ -359,18 +427,21 @@ static void rna_def_key(BlenderRNA *brna)
rna_def_animdata_common(srna);
- prop= RNA_def_property(srna, "user", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "user", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "from");
RNA_def_property_ui_text(prop, "User", "Datablock using these shape keys.");
prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "type", KEY_RELATIVE);
RNA_def_property_ui_text(prop, "Relative", "Makes shape keys relative.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop= RNA_def_property(srna, "slurph", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "slurph");
RNA_def_property_range(prop, -500, 500);
RNA_def_property_ui_text(prop, "Slurph", "Creates a delay in amount of frames in applying keypositions, first vertex goes first.");
+ RNA_def_property_update(prop, 0, "rna_Key_update_data");
}
void RNA_def_key(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index a49b4377d9d..d00a0d61bf6 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -37,6 +37,10 @@
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "BKE_texture.h"
+
static void rna_Lamp_buffer_size_set(PointerRNA *ptr, int value)
{
Lamp *la= (Lamp*)ptr->data;
@@ -54,13 +58,39 @@ static PointerRNA rna_Lamp_sky_settings_get(PointerRNA *ptr)
static void rna_Lamp_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Lamp *la= (Lamp*)ptr->data;
- rna_iterator_array_begin(iter, (void*)la->mtex, sizeof(MTex*), MAX_MTEX, NULL);
+ rna_iterator_array_begin(iter, (void*)la->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
}
static PointerRNA rna_Lamp_active_texture_get(PointerRNA *ptr)
{
Lamp *la= (Lamp*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, la->mtex[(int)la->texact]);
+ Tex *tex;
+
+ tex= (la->mtex[(int)la->texact])? la->mtex[(int)la->texact]->tex: NULL;
+ return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
+}
+
+static void rna_Lamp_active_texture_set(PointerRNA *ptr, PointerRNA value)
+{
+ Lamp *la= (Lamp*)ptr->data;
+ int act= la->texact;
+
+ if(la->mtex[act] && la->mtex[act]->tex)
+ id_us_min(&la->mtex[act]->tex->id);
+
+ if(value.data) {
+ if(!la->mtex[act]) {
+ la->mtex[act]= add_mtex();
+ la->mtex[act]->texco= TEXCO_GLOB;
+ }
+
+ la->mtex[act]->tex= value.data;
+ id_us_plus(&la->mtex[act]->tex->id);
+ }
+ else if(la->mtex[act]) {
+ MEM_freeN(la->mtex[act]);
+ la->mtex[act]= NULL;
+ }
}
static StructRNA* rna_Lamp_refine(struct PointerRNA *ptr)
@@ -69,7 +99,7 @@ static StructRNA* rna_Lamp_refine(struct PointerRNA *ptr)
switch(la->type) {
case LA_LOCAL:
- return &RNA_LocalLamp;
+ return &RNA_PointLamp;
case LA_SUN:
return &RNA_SunLamp;
case LA_SPOT:
@@ -111,13 +141,27 @@ static void rna_def_lamp_mtex(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates.");
- prop= RNA_def_property(srna, "map_to_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_COL);
- RNA_def_property_ui_text(prop, "Map To Color", "Lets the texture affect the basic color of the lamp.");
+ RNA_def_property_ui_text(prop, "Color", "Lets the texture affect the basic color of the lamp.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_to_shadow", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_SHAD);
- RNA_def_property_ui_text(prop, "Map To Shadow", "Lets the texture affect the shadow color of the lamp.");
+ RNA_def_property_ui_text(prop, "Shadow", "Lets the texture affect the shadow color of the lamp.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Color Factor", "Amount texture affects color values.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "shadow_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Shadow Factor", "Amount texture affects shadow.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
}
static void rna_def_lamp_sky_settings(BlenderRNA *brna)
@@ -253,11 +297,11 @@ static void rna_def_lamp(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_type_items[] = {
- {LA_LOCAL, "POINT", ICON_LAMP_POINT, "Point", "Omnidirectional point light source."},
- {LA_SUN, "SUN", ICON_LAMP_SUN, "Sun", "Constant direction parallel ray light source."},
- {LA_SPOT, "SPOT", ICON_LAMP_SPOT, "Spot", "Directional cone light source."},
- {LA_HEMI, "HEMI", ICON_LAMP_HEMI, "Hemi", "180 degree constant light source."},
- {LA_AREA, "AREA", ICON_LAMP_AREA, "Area", "Directional area light source."},
+ {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");
@@ -270,7 +314,7 @@ static void rna_def_lamp(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "Type of Lamp.");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING_DRAW, NULL);
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "dist");
RNA_def_property_ui_range(prop, 0, 1000, 1.0, 2);
RNA_def_property_ui_text(prop, "Distance", "Falloff distance - the light is at half the original intensity at this point.");
@@ -308,13 +352,8 @@ static void rna_def_lamp(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING, NULL);
/* textures */
- rna_def_mtex_common(srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get", "LampTextureSlot");
-
- /* script link */
- prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "scriptlink");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this lamp.");
+ rna_def_mtex_common(srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get",
+ "rna_Lamp_active_texture_set", "LampTextureSlot");
}
static void rna_def_lamp_falloff(StructRNA *srna)
@@ -383,7 +422,6 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
{LA_SAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", ""},
{0, NULL, 0, NULL, NULL}};
-
prop= RNA_def_property(srna, "shadow_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, (spot)? prop_spot_shadow_items: prop_shadow_items);
@@ -393,7 +431,7 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
prop= RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "shdwr");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Shadow Color", "Color of shadows casted by the lamp.");
+ RNA_def_property_ui_text(prop, "Shadow Color", "Color of shadows cast by the lamp.");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING, NULL);
prop= RNA_def_property(srna, "only_shadow", PROP_BOOLEAN, PROP_NONE);
@@ -427,7 +465,7 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
RNA_def_property_ui_text(prop, "Shadow Adaptive Threshold", "Threshold for Adaptive Sampling (Raytraced shadows).");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING, NULL);
- prop= RNA_def_property(srna, "shadow_soft_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_soft_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "soft");
RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
RNA_def_property_ui_text(prop, "Shadow Soft Size", "Light size for ray shadow sampling (Raytraced shadows).");
@@ -439,13 +477,14 @@ static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING, NULL);
}
-static void rna_def_local_lamp(BlenderRNA *brna)
+static void rna_def_point_lamp(BlenderRNA *brna)
{
StructRNA *srna;
- srna= RNA_def_struct(brna, "LocalLamp", "Lamp");
+ srna= RNA_def_struct(brna, "PointLamp", "Lamp");
RNA_def_struct_sdna(srna, "Lamp");
- RNA_def_struct_ui_text(srna, "Local Lamp", "Omnidirectional point lamp.");
+ RNA_def_struct_ui_text(srna, "Point Lamp", "Omnidirectional point lamp.");
+ RNA_def_struct_ui_icon(srna, ICON_LAMP_POINT);
rna_def_lamp_falloff(srna);
rna_def_lamp_shadow(srna, 0, 0);
@@ -464,6 +503,7 @@ static void rna_def_area_lamp(BlenderRNA *brna)
srna= RNA_def_struct(brna, "AreaLamp", "Lamp");
RNA_def_struct_sdna(srna, "Lamp");
RNA_def_struct_ui_text(srna, "Area Lamp", "Directional area lamp.");
+ RNA_def_struct_ui_icon(srna, ICON_LAMP_AREA);
rna_def_lamp_shadow(srna, 0, 1);
@@ -488,13 +528,13 @@ static void rna_def_area_lamp(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shape", "Shape of the area lamp.");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING_DRAW, NULL);
- prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "area_size");
RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
RNA_def_property_ui_text(prop, "Size", "Size of the area of the area Lamp, X direction size for Rectangle shapes.");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING_DRAW, NULL);
- prop= RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "area_sizey");
RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
RNA_def_property_ui_text(prop, "Size Y", "Size of the area of the area Lamp in the Y direction for Rectangle shapes.");
@@ -533,6 +573,7 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
srna= RNA_def_struct(brna, "SpotLamp", "Lamp");
RNA_def_struct_sdna(srna, "Lamp");
RNA_def_struct_ui_text(srna, "Spot Lamp", "Directional cone lamp.");
+ RNA_def_struct_ui_icon(srna, ICON_LAMP_SPOT);
rna_def_lamp_falloff(srna);
rna_def_lamp_shadow(srna, 1, 0);
@@ -590,13 +631,13 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Spot Size", "Angle of the spotlight beam in degrees.");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING_DRAW, NULL);
- prop= RNA_def_property(srna, "shadow_buffer_clip_start", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_buffer_clip_start", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "clipsta");
RNA_def_property_range(prop, 0.0f, 9999.0f);
RNA_def_property_ui_text(prop, "Shadow Buffer Clip Start", "Shadow map clip start: objects closer will not generate shadows");
RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING_DRAW, NULL);
- prop= RNA_def_property(srna, "shadow_buffer_clip_end", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_buffer_clip_end", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "clipend");
RNA_def_property_range(prop, 0.0f, 9999.0f);
RNA_def_property_ui_text(prop, "Shadow Buffer Clip End", "Shadow map clip end beyond which objects will not generate shadows.");
@@ -645,11 +686,13 @@ static void rna_def_sun_lamp(BlenderRNA *brna)
srna= RNA_def_struct(brna, "SunLamp", "Lamp");
RNA_def_struct_sdna(srna, "Lamp");
RNA_def_struct_ui_text(srna, "Sun Lamp", "Constant direction parallel ray lamp.");
+ RNA_def_struct_ui_icon(srna, ICON_LAMP_SUN);
rna_def_lamp_shadow(srna, 0, 0);
/* sky */
- prop= RNA_def_property(srna, "sky", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "sky", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "LampSkySettings");
RNA_def_property_pointer_funcs(prop, "rna_Lamp_sky_settings_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Sky Settings", "Sky related settings for sun lamps.");
@@ -664,12 +707,13 @@ static void rna_def_hemi_lamp(BlenderRNA *brna)
srna= RNA_def_struct(brna, "HemiLamp", "Lamp");
RNA_def_struct_sdna(srna, "Lamp");
RNA_def_struct_ui_text(srna, "Hemi Lamp", "180 degree constant lamp.");
+ RNA_def_struct_ui_icon(srna, ICON_LAMP_HEMI);
}
void RNA_def_lamp(BlenderRNA *brna)
{
rna_def_lamp(brna);
- rna_def_local_lamp(brna);
+ rna_def_point_lamp(brna);
rna_def_area_lamp(brna);
rna_def_spot_lamp(brna);
rna_def_sun_lamp(brna);
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index f67267ce0d0..1f7eee4d2d8 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -36,6 +36,16 @@
#ifdef RNA_RUNTIME
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_depsgraph.h"
+#include "BKE_lattice.h"
+#include "BKE_main.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
static void rna_LatticePoint_co_get(PointerRNA *ptr, float *values)
{
Lattice *lt= (Lattice*)ptr->id.data;
@@ -58,22 +68,95 @@ static void rna_LatticePoint_groups_begin(CollectionPropertyIterator *iter, Poin
BPoint *bp= (BPoint*)ptr->data;
MDeformVert *dvert= lt->dvert + (bp-lt->def);
- rna_iterator_array_begin(iter, (void*)dvert->dw, sizeof(MDeformWeight), dvert->totweight, NULL);
+ rna_iterator_array_begin(iter, (void*)dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, NULL);
}
else
- rna_iterator_array_begin(iter, NULL, 0, 0, NULL);
+ rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
}
static void rna_Lattice_points_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Lattice *lt= (Lattice*)ptr->data;
+ int tot= lt->pntsu*lt->pntsv*lt->pntsw;
- if(lt->def) {
- int tot= lt->pntsu*lt->pntsv*lt->pntsw;
- rna_iterator_array_begin(iter, (void*)lt->def, sizeof(BPoint), tot, NULL);
- }
+ if(lt->editlatt && lt->editlatt->def)
+ rna_iterator_array_begin(iter, (void*)lt->editlatt->def, sizeof(BPoint), tot, 0, NULL);
+ else if(lt->def)
+ rna_iterator_array_begin(iter, (void*)lt->def, sizeof(BPoint), tot, 0, NULL);
else
- rna_iterator_array_begin(iter, NULL, 0, 0, NULL);
+ rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
+}
+
+static void rna_Lattice_update_data(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ DAG_id_flush_update(id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+}
+
+static void rna_Lattice_update_size(bContext *C, PointerRNA *ptr)
+{
+ Main *bmain= CTX_data_main(C);
+ Lattice *lt= ptr->id.data;
+ Object *ob;
+ int newu, newv, neww;
+
+ /* we don't modify the actual pnts, but go through opnts instead */
+ newu= (lt->opntsu > 0)? lt->opntsu: lt->pntsu;
+ newv= (lt->opntsv > 0)? lt->opntsv: lt->pntsv;
+ neww= (lt->opntsw > 0)? lt->opntsw: lt->pntsw;
+
+ /* resizelattice needs an object, any object will have the same result */
+ for(ob=bmain->object.first; ob; ob= ob->id.next) {
+ if(ob->data == lt) {
+ resizelattice(lt, newu, newv, neww, ob);
+ if(lt->editlatt)
+ resizelattice(lt->editlatt, newu, newv, neww, ob);
+ break;
+ }
+ }
+
+ /* otherwise without, means old points are not repositioned */
+ if(!ob) {
+ resizelattice(lt, newu, newv, neww, NULL);
+ if(lt->editlatt)
+ resizelattice(lt->editlatt, newu, newv, neww, NULL);
+ }
+
+ rna_Lattice_update_data(C, ptr);
+}
+
+static void rna_Lattice_outside_set(PointerRNA *ptr, int value)
+{
+ Lattice *lt= ptr->data;
+
+ if(value) lt->flag |= LT_OUTSIDE;
+ else lt->flag &= ~LT_OUTSIDE;
+
+ outside_lattice(lt);
+
+ if(lt->editlatt) {
+ if(value) lt->editlatt->flag |= LT_OUTSIDE;
+ else lt->editlatt->flag &= ~LT_OUTSIDE;
+
+ outside_lattice(lt->editlatt);
+ }
+}
+
+static void rna_Lattice_points_u_set(PointerRNA *ptr, int value)
+{
+ ((Lattice*)ptr->data)->opntsu= CLAMPIS(value, 1, 64);
+}
+
+static void rna_Lattice_points_v_set(PointerRNA *ptr, int value)
+{
+ ((Lattice*)ptr->data)->opntsv= CLAMPIS(value, 1, 64);
+}
+
+static void rna_Lattice_points_w_set(PointerRNA *ptr, int value)
+{
+ ((Lattice*)ptr->data)->opntsw= CLAMPIS(value, 1, 64);
}
#else
@@ -87,16 +170,17 @@ static void rna_def_latticepoint(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "BPoint");
RNA_def_struct_ui_text(srna, "LatticePoint", "Point in the lattice grid.");
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_float_funcs(prop, "rna_LatticePoint_co_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Location", "");
- prop= RNA_def_property(srna, "deformed_co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "deformed_co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Deformed Location", "");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_funcs(prop, "rna_LatticePoint_groups_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0, 0, 0);
@@ -121,37 +205,48 @@ static void rna_def_lattice(BlenderRNA *brna)
prop= RNA_def_property(srna, "points_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsu");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_u_set", NULL);
+ RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "U", "Points in U direction.");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
prop= RNA_def_property(srna, "points_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsv");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_v_set", NULL);
+ RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "V", "Points in V direction.");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
prop= RNA_def_property(srna, "points_w", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "pntsw");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, NULL, "rna_Lattice_points_w_set", NULL);
+ RNA_def_property_range(prop, 1, 64);
RNA_def_property_ui_text(prop, "W", "Points in W direction.");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_size");
prop= RNA_def_property(srna, "interpolation_type_u", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typeu");
RNA_def_property_enum_items(prop, prop_keyblock_type_items);
RNA_def_property_ui_text(prop, "Interpolation Type U", "");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
prop= RNA_def_property(srna, "interpolation_type_v", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typev");
RNA_def_property_enum_items(prop, prop_keyblock_type_items);
RNA_def_property_ui_text(prop, "Interpolation Type V", "");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
prop= RNA_def_property(srna, "interpolation_type_w", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "typew");
RNA_def_property_enum_items(prop, prop_keyblock_type_items);
RNA_def_property_ui_text(prop, "Interpolation Type W", "");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
prop= RNA_def_property(srna, "outside", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LT_OUTSIDE);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Lattice_outside_set");
RNA_def_property_ui_text(prop, "Outside", "Only draw, and take into account, the outer vertices.");
+ RNA_def_property_update(prop, 0, "rna_Lattice_update_data");
prop= RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "key");
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 26fc3c2941e..910a15890cb 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -207,12 +207,30 @@ static void rna_Main_particle_begin(CollectionPropertyIterator *iter, PointerRNA
rna_iterator_listbase_begin(iter, &bmain->particle, NULL);
}
+static void rna_Main_gpencil_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ Main *bmain= (Main*)ptr->data;
+ rna_iterator_listbase_begin(iter, &bmain->gpencil, NULL);
+}
+
static void rna_Main_wm_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Main *bmain= (Main*)ptr->data;
rna_iterator_listbase_begin(iter, &bmain->wm, NULL);
}
+#ifdef UNIT_TEST
+
+static PointerRNA rna_Test_test_get(PointerRNA *ptr)
+{
+ PointerRNA ret= *ptr;
+ ret.type= &RNA_Test;
+
+ return ret;
+}
+
+#endif
+
#else
void RNA_def_main(BlenderRNA *brna)
@@ -220,34 +238,35 @@ void RNA_def_main(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- const char *lists[][5]= {
- {"cameras", "Camera", "rna_Main_camera_begin", "Cameras", "Camera datablocks."},
- {"scenes", "Scene", "rna_Main_scene_begin", "Scenes", "Scene datablocks."},
- {"objects", "Object", "rna_Main_object_begin", "Objects", "Object datablocks."},
- {"materials", "Material", "rna_Main_mat_begin", "Materials", "Material datablocks."},
- {"nodetrees", "NodeTree", "rna_Main_nodetree_begin", "Node Trees", "Nodetree datablocks."},
- {"meshes", "Mesh", "rna_Main_mesh_begin", "Meshes", "Mesh datablocks."},
- {"lamps", "Lamp", "rna_Main_lamp_begin", "Lamps", "Lamp datablocks."},
- {"libraries", "Library", "rna_Main_library_begin", "Libraries", "Library datablocks."},
- {"screens", "Screen", "rna_Main_screen_begin", "Screens", "Screen datablocks."},
- {"windowmanagers", "WindowManager", "rna_Main_wm_begin", "Window Managers", "Window manager datablocks."},
- {"images", "Image", "rna_Main_image_begin", "Images", "Image datablocks."},
- {"lattices", "Lattice", "rna_Main_latt_begin", "Lattices", "Lattice datablocks."},
- {"curves", "Curve", "rna_Main_curve_begin", "Curves", "Curve datablocks."},
- {"metaballs", "MetaBall", "rna_Main_mball_begin", "Metaballs", "Metaball datablocks."},
- {"vfonts", "VectorFont", "rna_Main_vfont_begin", "Vector Fonts", "Vector font datablocks."},
- {"textures", "Texture", "rna_Main_tex_begin", "Textures", "Texture datablocks."},
- {"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush datablocks."},
- {"worlds", "World", "rna_Main_world_begin", "Worlds", "World datablocks."},
- {"groups", "Group", "rna_Main_group_begin", "Groups", "Group datablocks."},
- {"keys", "ID", "rna_Main_key_begin", "Keys", "Key datablocks."},
- {"scripts", "ID", "rna_Main_script_begin", "Scripts", "Script datablocks."},
- {"texts", "Text", "rna_Main_text_begin", "Texts", "Text datablocks."},
- {"sounds", "ID", "rna_Main_sound_begin", "Sounds", "Sound datablocks."},
- {"armatures", "Armature", "rna_Main_armature_begin", "Armatures", "Armature datablocks."},
- {"actions", "Action", "rna_Main_action_begin", "Actions", "Action datablocks."},
- {"particles", "ParticleSettings", "rna_Main_particle_begin", "Particles", "Particle datablocks."},
- {NULL, NULL, NULL, NULL, NULL}};
+ const char *lists[][7]= {
+ {"cameras", "Camera", "rna_Main_camera_begin", "Cameras", "Camera datablocks.", NULL, NULL},
+ {"scenes", "Scene", "rna_Main_scene_begin", "Scenes", "Scene datablocks.", NULL, NULL},
+ {"objects", "Object", "rna_Main_object_begin", "Objects", "Object datablocks.", NULL, NULL},
+ {"materials", "Material", "rna_Main_mat_begin", "Materials", "Material datablocks.", NULL, NULL},
+ {"nodegroups", "NodeTree", "rna_Main_nodetree_begin", "Node Groups", "Node group datablocks.", NULL, NULL},
+ {"meshes", "Mesh", "rna_Main_mesh_begin", "Meshes", "Mesh datablocks.", "add_mesh", "remove_mesh"},
+ {"lamps", "Lamp", "rna_Main_lamp_begin", "Lamps", "Lamp datablocks.", NULL, NULL},
+ {"libraries", "Library", "rna_Main_library_begin", "Libraries", "Library datablocks.", NULL, NULL},
+ {"screens", "Screen", "rna_Main_screen_begin", "Screens", "Screen datablocks.", NULL, NULL},
+ {"windowmanagers", "WindowManager", "rna_Main_wm_begin", "Window Managers", "Window manager datablocks.", NULL, NULL},
+ {"images", "Image", "rna_Main_image_begin", "Images", "Image datablocks.", NULL, NULL},
+ {"lattices", "Lattice", "rna_Main_latt_begin", "Lattices", "Lattice datablocks.", NULL, NULL},
+ {"curves", "Curve", "rna_Main_curve_begin", "Curves", "Curve datablocks.", NULL, NULL} ,
+ {"metaballs", "MetaBall", "rna_Main_mball_begin", "Metaballs", "Metaball datablocks.", NULL, NULL},
+ {"vfonts", "VectorFont", "rna_Main_vfont_begin", "Vector Fonts", "Vector font datablocks.", NULL, NULL},
+ {"textures", "Texture", "rna_Main_tex_begin", "Textures", "Texture datablocks.", NULL, NULL},
+ {"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush datablocks.", NULL, NULL},
+ {"worlds", "World", "rna_Main_world_begin", "Worlds", "World datablocks.", NULL, NULL},
+ {"groups", "Group", "rna_Main_group_begin", "Groups", "Group datablocks.", NULL, NULL},
+ {"keys", "Key", "rna_Main_key_begin", "Keys", "Key datablocks.", NULL, NULL},
+ {"scripts", "ID", "rna_Main_script_begin", "Scripts", "Script datablocks (DEPRECATED).", NULL, NULL},
+ {"texts", "Text", "rna_Main_text_begin", "Texts", "Text datablocks.", NULL, NULL},
+ {"sounds", "Sound", "rna_Main_sound_begin", "Sounds", "Sound datablocks.", NULL, NULL},
+ {"armatures", "Armature", "rna_Main_armature_begin", "Armatures", "Armature datablocks.", NULL, NULL},
+ {"actions", "Action", "rna_Main_action_begin", "Actions", "Action datablocks.", NULL, NULL},
+ {"particles", "ParticleSettings", "rna_Main_particle_begin", "Particles", "Particle datablocks.", NULL, NULL},
+ {"gpencil", "GreasePencil", "rna_Main_gpencil_begin", "Grease Pencil", "Grease Pencil datablocks.", NULL, NULL},
+ {NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
int i;
srna= RNA_def_struct(brna, "Main", NULL);
@@ -264,11 +283,23 @@ void RNA_def_main(BlenderRNA *brna)
{
prop= RNA_def_property(srna, lists[i][0], PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, lists[i][1]);
- RNA_def_property_collection_funcs(prop, lists[i][2], "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0, 0);
+ RNA_def_property_collection_funcs(prop, lists[i][2], "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, lists[i][5], lists[i][6]);
RNA_def_property_ui_text(prop, lists[i][3], lists[i][4]);
}
RNA_api_main(srna);
+
+#ifdef UNIT_TEST
+
+ RNA_define_verify_sdna(0);
+
+ prop= RNA_def_property(srna, "test", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Test");
+ RNA_def_property_pointer_funcs(prop, "rna_Test_test_get", NULL, NULL);
+
+ RNA_define_verify_sdna(1);
+
+#endif
}
#endif
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 6d56b2b00f9..379cf75d450 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -31,23 +31,32 @@
#include "RNA_define.h"
#include "RNA_types.h"
+#include "RNA_enum_types.h"
+
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
#ifdef RNA_RUNTIME
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_library.h"
+#include "BKE_object.h"
+#include "BKE_material.h"
+#include "BKE_image.h"
+#include "BKE_texture.h"
-#include "DNA_mesh_types.h"
+#include "DNA_lamp_types.h"
-Mesh *rna_Main_add_mesh(Main *main, char *name)
+static Mesh *rna_Main_add_mesh(Main *main, char *name)
{
Mesh *me= add_mesh(name);
me->id.us--;
return me;
}
-void rna_Main_remove_mesh(Main *main, ReportList *reports, Mesh *me)
+static void rna_Main_remove_mesh(Main *main, ReportList *reports, Mesh *me)
{
if(me->id.us == 0)
free_libblock(&main->mesh, me);
@@ -57,24 +66,130 @@ void rna_Main_remove_mesh(Main *main, ReportList *reports, Mesh *me)
/* XXX python now has invalid pointer? */
}
+static Lamp *rna_Main_add_lamp(Main *main, char *name)
+{
+ Lamp *la= add_lamp(name);
+ la->id.us--;
+ return la;
+}
+
+/*
+static void rna_Main_remove_lamp(Main *main, ReportList *reports, Lamp *la)
+{
+ if(la->id.us == 0)
+ free_libblock(&main->lamp, la);
+ else
+ BKE_report(reports, RPT_ERROR, "Lamp must have zero users to be removed.");
+}
+*/
+
+static Object* rna_Main_add_object(Main *main, int type, char *name)
+{
+ Object *ob= add_only_object(type, name);
+ ob->id.us--;
+ return ob;
+}
+
+/*
+ NOTE: the following example shows when this function should _not_ be called
+
+ ob = bpy.data.add_object()
+ scene.add_object(ob)
+
+ # ob is freed here
+ scene.remove_object(ob)
+
+ # don't do this since ob is already freed!
+ bpy.data.remove_object(ob)
+*/
+static void rna_Main_remove_object(Main *main, ReportList *reports, Object *ob)
+{
+ if(ob->id.us == 0)
+ free_libblock(&main->object, ob);
+ else
+ BKE_report(reports, RPT_ERROR, "Object must have zero users to be removed.");
+}
+
+static Material *rna_Main_add_material(Main *main, char *name)
+{
+ return add_material(name);
+}
+
+/* TODO: remove material? */
+
+struct Tex *rna_Main_add_texture(Main *main, char *name)
+{
+ return add_texture(name);
+}
+
+/* TODO: remove texture? */
+
+struct Image *rna_Main_add_image(Main *main, char *filename)
+{
+ return BKE_add_image_file(filename, 0);
+}
+
#else
void RNA_api_main(StructRNA *srna)
{
FunctionRNA *func;
- PropertyRNA *prop;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "add_object", "rna_Main_add_object");
+ RNA_def_function_ui_description(func, "Add a new object.");
+ parm= RNA_def_enum(func, "type", object_type_items, 0, "", "Type of Object.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_string(func, "name", "Object", 0, "", "New name for the datablock.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "object", "Object", "", "New object.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove_object", "rna_Main_remove_object");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Remove an object if it has zero users.");
+ parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "add_mesh", "rna_Main_add_mesh");
RNA_def_function_ui_description(func, "Add a new mesh.");
- prop= RNA_def_string(func, "name", "Mesh", 0, "", "New name for the datablock.");
- prop= RNA_def_pointer(func, "mesh", "Mesh", "", "New mesh.");
- RNA_def_function_return(func, prop);
+ parm= RNA_def_string(func, "name", "Mesh", 0, "", "New name for the datablock.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "mesh", "Mesh", "", "New mesh.");
+ RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "remove_mesh", "rna_Main_remove_mesh");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a mesh if it has zero users.");
- prop= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
- RNA_def_property_flag(prop, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "add_lamp", "rna_Main_add_lamp");
+ RNA_def_function_ui_description(func, "Add a new lamp.");
+ parm= RNA_def_string(func, "name", "Lamp", 0, "", "New name for the datablock.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "mesh", "Lamp", "", "New lamp.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "add_material", "rna_Main_add_material");
+ RNA_def_function_ui_description(func, "Add a new material.");
+ parm= RNA_def_string(func, "name", "Material", 0, "", "New name for the datablock."); /* optional */
+ parm= RNA_def_pointer(func, "material", "Material", "", "New material.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "add_texture", "rna_Main_add_texture");
+ RNA_def_function_ui_description(func, "Add a new texture.");
+ parm= RNA_def_string(func, "name", "Tex", 0, "", "New name for the datablock."); /* optional */
+ parm= RNA_def_pointer(func, "texture", "Texture", "", "New texture.");
+ RNA_def_function_return(func, parm);
+
+ 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, "filename", "", 0, "", "Filename 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);
+
}
#endif
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 41f31594f6e..a6f22017aaa 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -35,8 +35,28 @@
#include "WM_types.h"
+static EnumPropertyItem prop_texture_coordinates_items[] = {
+{TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
+{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_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."},
+{TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
+{TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
+{TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
+{0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "BKE_texture.h"
+
+#include "ED_node.h"
+
static PointerRNA rna_Material_mirror_get(PointerRNA *ptr)
{
return rna_pointer_inherit_refine(ptr, &RNA_MaterialRaytraceMirror, ptr->id.data);
@@ -62,6 +82,11 @@ static PointerRNA rna_Material_strand_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_MaterialStrand, ptr->id.data);
}
+static PointerRNA rna_Material_physics_get(PointerRNA *ptr)
+{
+ return rna_pointer_inherit_refine(ptr, &RNA_MaterialPhysics, ptr->id.data);
+}
+
static void rna_Material_type_set(PointerRNA *ptr, int value)
{
Material *ma= (Material*)ptr->data;
@@ -75,13 +100,37 @@ static void rna_Material_type_set(PointerRNA *ptr, int value)
static void rna_Material_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Material *ma= (Material*)ptr->data;
- rna_iterator_array_begin(iter, (void*)ma->mtex, sizeof(MTex*), MAX_MTEX, NULL);
+ rna_iterator_array_begin(iter, (void*)ma->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
}
static PointerRNA rna_Material_active_texture_get(PointerRNA *ptr)
{
Material *ma= (Material*)ptr->data;
- return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, ma->mtex[(int)ma->texact]);
+ Tex *tex;
+
+ tex= (ma->mtex[(int)ma->texact])? ma->mtex[(int)ma->texact]->tex: NULL;
+ return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
+}
+
+static void rna_Material_active_texture_set(PointerRNA *ptr, PointerRNA value)
+{
+ Material *ma= (Material*)ptr->data;
+ int act= ma->texact;
+
+ if(ma->mtex[act] && ma->mtex[act]->tex)
+ id_us_min(&ma->mtex[act]->tex->id);
+
+ if(value.data) {
+ if(!ma->mtex[act])
+ ma->mtex[act]= add_mtex();
+
+ ma->mtex[act]->tex= value.data;
+ id_us_plus(&ma->mtex[act]->tex->id);
+ }
+ else if(ma->mtex[act]) {
+ MEM_freeN(ma->mtex[act]);
+ ma->mtex[act]= NULL;
+ }
}
static void rna_MaterialStrand_start_size_range(PointerRNA *ptr, float *min, float *max)
@@ -141,6 +190,73 @@ static void rna_MaterialTextureSlot_enabled_set(PointerRNA *ptr, int value)
}
}
+static void rna_Material_use_diffuse_ramp_set(PointerRNA *ptr, int value)
+{
+ Material *ma= (Material*)ptr->data;
+
+ if(value) ma->mode |= MA_RAMP_COL;
+ else ma->mode &= ~MA_RAMP_COL;
+
+ if((ma->mode & MA_RAMP_COL) && ma->ramp_col == NULL)
+ ma->ramp_col= add_colorband(0);
+}
+
+static void rna_Material_use_specular_ramp_set(PointerRNA *ptr, int value)
+{
+ Material *ma= (Material*)ptr->data;
+
+ if(value) ma->mode |= MA_RAMP_SPEC;
+ else ma->mode &= ~MA_RAMP_SPEC;
+
+ if((ma->mode & MA_RAMP_SPEC) && ma->ramp_spec == NULL)
+ ma->ramp_spec= add_colorband(0);
+}
+
+static void rna_Material_use_nodes_set(PointerRNA *ptr, int value)
+{
+ Material *ma= (Material*)ptr->data;
+
+ ma->use_nodes= value;
+ if(ma->use_nodes && ma->nodetree==NULL)
+ ED_node_shader_default(ma);
+}
+
+static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Material *ma= (Material*)ptr->id.data;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(C==NULL) {
+ return prop_texture_coordinates_items;
+ }
+
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_GLOB);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_OBJECT);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_ORCO);
+
+ if(ma->material_type == MA_TYPE_VOLUME) {
+
+ }
+ else if (ELEM3(ma->material_type, MA_TYPE_SURFACE, MA_TYPE_HALO, MA_TYPE_WIRE)) {
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_UV);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STRAND);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STICKY);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_WINDOW);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_NORM);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_REFL);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STRESS);
+ RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_TANGENT);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
+
#else
static void rna_def_material_mtex(BlenderRNA *brna)
@@ -148,21 +264,6 @@ static void rna_def_material_mtex(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem prop_texture_coordinates_items[] = {
- {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
- {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_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."},
- {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
- {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
- {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
-
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem prop_mapping_items[] = {
{MTEX_FLAT, "FLAT", 0, "Flat", "Maps X and Y coordinates directly."},
{MTEX_CUBE, "CUBE", 0, "Cube", "Maps using the normal vector."},
@@ -205,96 +306,124 @@ static void rna_def_material_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Material_texture_coordinates_itemf");
RNA_def_property_ui_text(prop, "Texture Coordinates", "");
-
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "object");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvname");
RNA_def_property_ui_text(prop, "UV Layer", "UV layer to use for mapping with UV texture coordinates.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "from_dupli", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_DUPLI_MAPTO);
- RNA_def_property_ui_text(prop, "From Dupli", "Dupli's instanced from verts, faces or particles, inherit texture coordinate from their parent (only for UV and Orco texture coordinates).");
+ RNA_def_property_ui_text(prop, "From Dupli", "Dupli's instanced from verts, faces or particles, inherit texture coordinate from their parent.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "from_original", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_OB_DUPLI_ORIG);
+ RNA_def_property_ui_text(prop, "From Original", "Dupli's derive their object coordinates from the original objects transformation.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_color", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_colordiff", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COL);
- RNA_def_property_ui_text(prop, "Color", "Causes the texture to affect basic color of the material");
+ RNA_def_property_ui_text(prop, "Diffuse Color", "Causes the texture to affect basic color of the material");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_NORM);
RNA_def_property_ui_text(prop, "Normal", "Causes the texture to affect the rendered normal");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_colorspec", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLSPEC);
- RNA_def_property_ui_text(prop, "Specularity Color", "Causes the texture to affect the specularity color");
+ RNA_def_property_ui_text(prop, "Specular Color", "Causes the texture to affect the specularity color");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_mirror", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COLMIR);
RNA_def_property_ui_text(prop, "Mirror", "Causes the texture to affect the mirror color");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_reflection", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_REF);
- RNA_def_property_ui_text(prop, "Reflection", "Causes the texture to affect the value of the materials reflectivity");
+ RNA_def_property_ui_text(prop, "Diffuse", "Causes the texture to affect the value of the materials diffuse reflectivity");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_specularity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SPEC);
- RNA_def_property_ui_text(prop, "Specularity", "Causes the texture to affect the value of specularity");
+ RNA_def_property_ui_text(prop, "Specular", "Causes the texture to affect the value of specular reflectivity");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_ambient", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_AMB);
RNA_def_property_ui_text(prop, "Ambient", "Causes the texture to affect the value of ambient");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_hardness", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_HAR);
RNA_def_property_ui_text(prop, "Hardness", "Causes the texture to affect the hardness value");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_raymir", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_RAYMIRR);
RNA_def_property_ui_text(prop, "Ray-Mirror", "Causes the texture to affect the ray-mirror value");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ALPHA);
RNA_def_property_ui_text(prop, "Alpha", "Causes the texture to affect the alpha value");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_emit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMIT);
RNA_def_property_ui_text(prop, "Emit", "Causes the texture to affect the emit value");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_translucency", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_TRANSLU);
RNA_def_property_ui_text(prop, "Translucency", "Causes the texture to affect the translucency value");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_displacement", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DISPLACE);
RNA_def_property_ui_text(prop, "Displacement", "Let the texture displace the surface");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "map_warp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_WARP);
RNA_def_property_ui_text(prop, "Warp", "Let the texture warp texture coordinates of next channels");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "x_mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projx");
RNA_def_property_enum_items(prop, prop_x_mapping_items);
RNA_def_property_ui_text(prop, "X Mapping", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "y_mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projy");
RNA_def_property_enum_items(prop, prop_y_mapping_items);
RNA_def_property_ui_text(prop, "Y Mapping", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "z_mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "projz");
RNA_def_property_enum_items(prop, prop_z_mapping_items);
RNA_def_property_ui_text(prop, "Z Mapping", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_mapping_items);
RNA_def_property_ui_text(prop, "Mapping", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* XXX: pmapto, pmaptoneg */
@@ -302,31 +431,201 @@ static void rna_def_material_mtex(BlenderRNA *brna)
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_update(prop, NC_TEXTURE, NULL);
/* XXX: MTex.which_output */
/* XXX: MTex.k */
- prop= RNA_def_property(srna, "displacement_factor", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "displacement_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dispfac");
- RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Displacement Factor", "Amount texture displaces the surface.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "warp_factor", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "warp_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "warpfac");
- RNA_def_property_range(prop, 0, 1);
- RNA_def_property_ui_text(prop, "Warp Factor", "Amount texture affects color values.");
-
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Warp Factor", "Amount texture affects texture coordinates of next channels.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "colorspec_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Specular Color Factor", "Amount texture affects specular color.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "colordiff_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Diffuse Color Factor", "Amount texture affects diffuse color.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "mirror_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Mirror Factor", "Amount texture affects mirror color.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "alpha_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Alpha Factor", "Amount texture affects alpha.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "diffuse_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Diffuse Factor", "Amount texture affects diffuse reflectivity.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "specular_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Specular Factor", "Amount texture affects specular reflectivity.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "emit_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Emit Factor", "Amount texture affects emission.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "hardness_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Hardness Factor", "Amount texture affects hardness.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "raymir_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Ray Mirror Factor", "Amount texture affects ray mirror.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "translucency_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Translucency Factor", "Amount texture affects translucency.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "ambient_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Ambient Factor", "Amount texture affects ambient.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ /* volume material */
+ prop= RNA_def_property(srna, "map_coloremission", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION_COL);
+ RNA_def_property_ui_text(prop, "Emission Color", "Causes the texture to affect the colour of emission");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "map_colorabsorption", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ABSORPTION_COL);
+ RNA_def_property_ui_text(prop, "Absorption Color", "Causes the texture to affect the result colour after absorption");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "map_density", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DENSITY);
+ RNA_def_property_ui_text(prop, "Density", "Causes the texture to affect the volume's density");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "map_emission", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION);
+ RNA_def_property_ui_text(prop, "Emission", "Causes the texture to affect the volume's emission");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "map_absorption", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ABSORPTION);
+ RNA_def_property_ui_text(prop, "Absorption", "Causes the texture to affect the volume's absorption");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "map_scattering", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SCATTERING);
+ RNA_def_property_ui_text(prop, "Scattering", "Causes the texture to affect the volume's scattering");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "coloremission_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Emission Color Factor", "Amount texture affects emission color.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "colorabsorption_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Absorpion Color Factor", "Amount texture affects diffuse color.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "density_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Density Factor", "Amount texture affects density.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "emission_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Emission Factor", "Amount texture affects emission.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "absorption_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Absorption Factor", "Amount texture affects absorption.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "scattering_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Scattering Factor", "Amount texture affects scattering.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ /* end volume material */
+
prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_MaterialTextureSlot_enabled_get", "rna_MaterialTextureSlot_enabled_set");
RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+ prop= RNA_def_property(srna, "new_bump", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_NEW_BUMP);
+ RNA_def_property_ui_text(prop, "New Bump", "Use new, corrected bump mapping code (backwards compatibility option).");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
}
static void rna_def_material_colors(StructRNA *srna)
{
PropertyRNA *prop;
+
+ static EnumPropertyItem prop_ramp_blend_diffuse_items[] = {
+ {MA_RAMP_BLEND, "MIX", 0, "Mix", ""},
+ {MA_RAMP_ADD, "ADD", 0, "Add", ""},
+ {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
+ {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
+ {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
+ {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
+ {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
+ {MA_RAMP_DARK, "DARKEN", 0, "Darken", ""},
+ {MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""},
+ {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
+ {MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""},
+ {MA_RAMP_BURN, "BURN", 0, "Burn", ""},
+ {MA_RAMP_HUE, "HUE", 0, "Hue", ""},
+ {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", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_ramp_input_items[] = {
+ {MA_RAMP_IN_SHADER, "SHADER", 0, "Shader", ""},
+ {MA_RAMP_IN_ENERGY, "ENERGY", 0, "Energy", ""},
+ {MA_RAMP_IN_NOR, "NORMAL", 0, "Normal", ""},
+ {MA_RAMP_IN_RESULT, "RESULT", 0, "Result", ""},
+ {0, NULL, 0, NULL, NULL}};
prop= RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "r");
@@ -346,21 +645,66 @@ static void rna_def_material_colors(StructRNA *srna)
RNA_def_property_ui_text(prop, "Mirror Color", "Mirror color of the material.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Alpha", "Alpha transparency of the material.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "specular_alpha", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "spectra");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Specular Alpha", "Alpha transparency for specular areas.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
/* Color bands */
+ prop= RNA_def_property(srna, "use_diffuse_ramp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_COL);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_diffuse_ramp_set");
+ RNA_def_property_ui_text(prop, "Use Diffuse Ramp", "Toggle diffuse ramp operations.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
prop= RNA_def_property(srna, "diffuse_ramp", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ramp_col");
RNA_def_property_struct_type(prop, "ColorRamp");
RNA_def_property_ui_text(prop, "Diffuse Ramp", "Color ramp used to affect diffuse shading.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "use_specular_ramp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_SPEC);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_specular_ramp_set");
+ RNA_def_property_ui_text(prop, "Use Specular Ramp", "Toggle specular ramp operations.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
prop= RNA_def_property(srna, "specular_ramp", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ramp_spec");
RNA_def_property_struct_type(prop, "ColorRamp");
RNA_def_property_ui_text(prop, "Specular Ramp", "Color ramp used to affect specular shading.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "diffuse_ramp_blend", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "rampblend_col");
+ RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items);
+ RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "specular_ramp_blend", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "rampblend_spec");
+ RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items);
+ RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "diffuse_ramp_input", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "rampin_col");
+ RNA_def_property_enum_items(prop, prop_ramp_input_items);
+ RNA_def_property_ui_text(prop, "Diffuse Ramp Input", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "specular_ramp_input", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "rampin_spec");
+ RNA_def_property_enum_items(prop, prop_ramp_input_items);
+ RNA_def_property_ui_text(prop, "Specular Ramp Input", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
}
static void rna_def_material_diffuse(StructRNA *srna)
@@ -381,10 +725,10 @@ static void rna_def_material_diffuse(StructRNA *srna)
RNA_def_property_ui_text(prop, "Diffuse Shader Model", "");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "diffuse_reflection", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "diffuse_intensity", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "ref");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Diffuse Reflection", "Amount of diffuse reflection.");
+ RNA_def_property_ui_text(prop, "Diffuse Intensity", "Amount of diffuse reflection.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
prop= RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_NONE);
@@ -398,7 +742,7 @@ static void rna_def_material_diffuse(StructRNA *srna)
RNA_def_property_ui_text(prop, "Diffuse Toon Size", "Size of diffuse toon area.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "diffuse_toon_smooth", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "diffuse_toon_smooth", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "param[1]");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Diffuse Toon Smooth", "Smoothness of diffuse toon area.");
@@ -428,8 +772,8 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_fadeto_mir_items[] = {
- {MA_RAYMIR_FADETOSKY, "FADE_TO_SKY", 0, "Fade to Sky Color", ""},
- {MA_RAYMIR_FADETOMAT, "FADE_TO_MATERIAL", 0, "Fade to Material Color", ""},
+ {MA_RAYMIR_FADETOSKY, "FADE_TO_SKY", 0, "Sky", ""},
+ {MA_RAYMIR_FADETOMAT, "FADE_TO_MATERIAL", 0, "Material", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "MaterialRaytraceMirror", NULL);
@@ -442,10 +786,10 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enabled", "Enable raytraced reflections.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "reflect", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "reflect_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "ray_mirror");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Reflect", "Sets the amount mirror reflection for raytrace.");
+ RNA_def_property_ui_text(prop, "Reflectivity", "Sets the amount mirror reflection for raytrace.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
@@ -454,19 +798,19 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Fresnel", "Power of Fresnel for mirror reflection.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "fresnel_fac", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "fresnel_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "fresnel_mir_i");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 5.0f);
RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "gloss_mir");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Gloss", "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections.");
+ RNA_def_property_ui_text(prop, "Gloss Amount", "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "gloss_anisotropic", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gloss_anisotropic", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "aniso_gloss_mir");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Gloss Anisotropy", "The shape of the reflection, from 0.0 (circular) to 1.0 (fully stretched along the tangent.");
@@ -478,7 +822,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Gloss Samples", "Number of cone samples averaged for blurry reflections.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_mir");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped.");
@@ -490,7 +834,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-reflections.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "dist_mir");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance of reflected rays. Reflections further than this range fade to sky color or material color.");
@@ -513,11 +857,6 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Raytrace Transparency", "Raytraced refraction settings for a Material datablock.");
- prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYTRANSP); /* use bitflags */
- RNA_def_property_ui_text(prop, "Enabled", "Enables raytracing for transparent refraction rendering.");
- RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
-
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);
@@ -530,16 +869,16 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Fresnel", "Power of Fresnel for transparency (Ray or ZTransp).");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "fresnel_fac", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "fresnel_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "fresnel_tra_i");
RNA_def_property_range(prop, 1.0f, 5.0f);
RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "gloss_tra");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Gloss", "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions.");
+ RNA_def_property_ui_text(prop, "Gloss Amount", "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
@@ -548,7 +887,7 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Gloss Samples", "Number of cone samples averaged for blurry refractions.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "gloss_threshold", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_tra");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped.");
@@ -560,13 +899,13 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-refractions.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "filter", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "filter", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "filter");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Filter", "Amount to blend in the material's diffuse color in raytraced transparency (simulating absorption).");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "limit", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "limit", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "tx_limit");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Limit", "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled).");
@@ -577,14 +916,161 @@ static void rna_def_material_raytra(BlenderRNA *brna)
RNA_def_property_range(prop, 0.1f, 10.0f);
RNA_def_property_ui_text(prop, "Falloff", "Falloff power for transmissivity filter effect (1.0 is linear).");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+}
+
+static void rna_def_material_volume(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem prop_scattering_items[] = {
+ {MA_VOL_SHADE_NONE, "NONE", 0, "None", ""},
+ {MA_VOL_SHADE_SINGLE, "SINGLE_SCATTERING", 0, "Single Scattering", ""},
+ {MA_VOL_SHADE_MULTIPLE, "MULTIPLE_SCATTERING", 0, "Multiple Scattering", ""},
+ {MA_VOL_SHADE_SINGLEPLUSMULTIPLE, "SINGLE_PLUS_MULTIPLE_SCATTERING", 0, "Single + Multiple Scattering", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_stepsize_items[] = {
+ {MA_VOL_STEP_RANDOMIZED, "RANDOMIZED", 0, "Randomized", ""},
+ {MA_VOL_STEP_CONSTANT, "CONSTANT", 0, "Constant", ""},
+ //{MA_VOL_STEP_ADAPTIVE, "ADAPTIVE", 0, "Adaptive", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_phasefunction_items[] = {
+ {MA_VOL_PH_ISOTROPIC, "ISOTROPIC", 0, "Isotropic", ""},
+ {MA_VOL_PH_MIEHAZY, "MIE_HAZY", 0, "Mie Hazy", ""},
+ {MA_VOL_PH_MIEMURKY, "MIE_MURKY", 0, "Mie Murky", ""},
+ {MA_VOL_PH_RAYLEIGH, "RAYLEIGH", 0, "Rayleigh", ""},
+ {MA_VOL_PH_HG, "HENYEY-GREENSTEIN", 0, "Henyey-Greenstein", ""},
+ {MA_VOL_PH_SCHLICK, "SCHLICK", 0, "Schlick", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "MaterialVolume", NULL);
+ RNA_def_struct_sdna(srna, "VolumeSettings");
+ RNA_def_struct_nested(brna, srna, "Material");
+ RNA_def_struct_ui_text(srna, "Material Volume", "Volume rendering settings for a Material datablock.");
+
+ prop= RNA_def_property(srna, "step_calculation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "stepsize_type");
+ RNA_def_property_enum_items(prop, prop_stepsize_items);
+ RNA_def_property_ui_text(prop, "Step Calculation", "Method of calculating the steps through the volume");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "specular_opacity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "spectra");
+ prop= RNA_def_property(srna, "step_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "stepsize");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Step Size", "Distance between subsequent volume depth samples.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "shading_step_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "shade_stepsize");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Shading Step Size", "Distance between subsequent volume shading samples.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "scattering_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "shade_type");
+ RNA_def_property_enum_items(prop, prop_scattering_items);
+ RNA_def_property_ui_text(prop, "Scattering Mode", "Method of shading, attenuating, and scattering light through the volume");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "light_cache", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_PRECACHESHADING); /* use bitflags */
+ RNA_def_property_ui_text(prop, "Light Cache", "Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ 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_ui_text(prop, "Resolution", "Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "ms_diffusion", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ms_diff");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Diffusion", "Diffusion factor, the strength of the blurring effect");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "ms_spread", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "ms_steps");
+ RNA_def_property_range(prop, 0, 1024);
+ RNA_def_property_ui_text(prop, "Spread", "Simulation steps, the effective distance over which the light is diffused");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "ms_intensity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ms_intensity");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Intensity", "Multiplier for multiple scattered light energy");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "depth_cutoff", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "depth_cutoff");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Depth Cutoff", "Stop ray marching early if transmission drops below this luminance - higher values give speedups in dense volumes at the expense of accuracy.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "density");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Specular Opacity", "Makes specular areas opaque on transparent materials.");
+ RNA_def_property_ui_text(prop, "Density", "The base density of the volume");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "density_scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "density_scale");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Density Scale", "Multiplier for the material's density");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "absorption", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "absorption");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Absorption", "Amount of light that gets absorbed by the volume - higher values mean light travels less distance");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "absorption_color", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_float_sdna(prop, NULL, "absorption_col");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Absorption Color", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "scattering", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "scattering");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1 ,3);
+ RNA_def_property_ui_text(prop, "Scattering", "Amount of light that gets scattered by the volume - values > 1.0 are non-physical");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "emission", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "emission");
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Emission", "Amount of light that gets emitted by the volume");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "emission_color", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_float_sdna(prop, NULL, "emission_col");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Emission Color", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "phase_function", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "phasefunc_type");
+ RNA_def_property_enum_items(prop, prop_phasefunction_items);
+ RNA_def_property_ui_text(prop, "Phase Function", "Isotropic/Anisotropic scattering");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "asymmetry", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "phasefunc_g");
+ RNA_def_property_range(prop, -1.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Asymmetry", "Continuum between forward scattering and back scattering");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
}
+
static void rna_def_material_halo(BlenderRNA *brna)
{
StructRNA *srna;
@@ -607,7 +1093,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Hardness", "Sets the hardness of the halo.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "add", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "add", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "add");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Add", "Sets the strength of the add effect.");
@@ -687,14 +1173,14 @@ static void rna_def_material_halo(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Star", "Renders halo as a star.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOTEX);
- RNA_def_property_ui_text(prop, "Use Texture", "Gives halo a texture.");
+ RNA_def_property_ui_text(prop, "Texture", "Gives halo a texture.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "use_vertex_normal", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "vertex_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOPUNO);
- RNA_def_property_ui_text(prop, "Use Vertex Normal", "Uses the vertex normal to specify the dimension of the halo.");
+ RNA_def_property_ui_text(prop, "Vertex Normal", "Uses the vertex normal to specify the dimension of the halo.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "xalpha", PROP_BOOLEAN, PROP_NONE);
@@ -723,7 +1209,7 @@ static void rna_def_material_sss(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Subsurface Scattering", "Diffuse subsurface scattering settings for a Material datablock.");
- prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_RGB|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "sss_radius");
RNA_def_property_range(prop, 0.001, FLT_MAX);
RNA_def_property_ui_range(prop, 0.001, 10000, 1, 3);
@@ -753,15 +1239,15 @@ static void rna_def_material_sss(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "IOR", "Index of refraction (higher values are denser).");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "sss_colfac");
- RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Color Factor", "Blend factor for SSS colors.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "texture_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "texture_factor", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "sss_texfac");
- RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Texture Factor", "Texture scatting blend factor.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
@@ -783,11 +1269,11 @@ static void rna_def_material_sss(BlenderRNA *brna)
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
}
-void rna_def_material_specularity(StructRNA *srna)
+static void rna_def_material_specularity(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem prop_spec_shader_items[] = {
+ static EnumPropertyItem prop_specular_shader_items[] = {
{MA_SPEC_COOKTORR, "COOKTORR", 0, "CookTorr", ""},
{MA_SPEC_PHONG, "PHONG", 0, "Phong", ""},
{MA_SPEC_BLINN, "BLINN", 0, "Blinn", ""},
@@ -795,16 +1281,16 @@ void rna_def_material_specularity(StructRNA *srna)
{MA_SPEC_WARDISO, "WARDISO", 0, "WardIso", ""},
{0, NULL, 0, NULL, NULL}};
- prop= RNA_def_property(srna, "spec_shader", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_shader", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "spec_shader");
- RNA_def_property_enum_items(prop, prop_spec_shader_items);
+ RNA_def_property_enum_items(prop, prop_specular_shader_items);
RNA_def_property_ui_text(prop, "Specular Shader Model", "");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "specular_reflection", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_intensity", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "spec");
RNA_def_property_range(prop, 0, 1);
- RNA_def_property_ui_text(prop, "Specularity Intensity", "");
+ RNA_def_property_ui_text(prop, "Specular Intensity", "");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
/* NOTE: "har", "param", etc are used for multiple purposes depending on
@@ -830,7 +1316,7 @@ void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_ui_text(prop, "Specular Toon Size", "Size of specular toon area.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "specular_toon_smooth", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_toon_smooth", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "param[3]");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Ssmoothness of specular toon area.");
@@ -843,7 +1329,7 @@ void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
}
-void rna_def_material_strand(BlenderRNA *brna)
+static void rna_def_material_strand(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -863,10 +1349,10 @@ void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Surface Diffuse", "Make diffuse shading more similar to shading the surface.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "blend_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "blend_distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "strand_surfnor");
RNA_def_property_range(prop, 0, 10);
- RNA_def_property_ui_text(prop, "Blend Distance", "Distance in Blender units over which to blend in the surface normal.");
+ RNA_def_property_ui_text(prop, "Blend Distance", "Worldspace distance over which to blend in the surface normal.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "blender_units", PROP_BOOLEAN, PROP_NONE);
@@ -874,16 +1360,16 @@ void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blender Units", "Use Blender units for widths instead of pixels.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "start_size", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "root_size", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "strand_sta");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_start_size_range");
- RNA_def_property_ui_text(prop, "Start Size", "Start size of strands in pixels Blender units.");
+ RNA_def_property_ui_text(prop, "Root Size", "Start size of strands in pixels Blender units.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "end_size", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "tip_size", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "strand_end");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_end_size_range");
- RNA_def_property_ui_text(prop, "End Size", "Start size of strands in pixels or Blender units.");
+ RNA_def_property_ui_text(prop, "Tip Size", "Start size of strands in pixels or Blender units.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "min_size", PROP_FLOAT, PROP_UNSIGNED);
@@ -910,6 +1396,46 @@ void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
}
+static void rna_def_material_physics(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "MaterialPhysics", NULL);
+ RNA_def_struct_sdna(srna, "Material");
+ RNA_def_struct_nested(brna, srna, "Material");
+ RNA_def_struct_ui_text(srna, "Material Physics", "Physics settings for a Material datablock.");
+
+ prop= RNA_def_property(srna, "align_to_normal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FH_NOR);
+ RNA_def_property_ui_text(prop, "Align to Normal", "Align dynamic game objects along the surface normal, when inside the physics distance area");
+
+ prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "friction");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Friction", "Coulomb friction coeffecient, when inside the physics distance area");
+
+ prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fh");
+ RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_text(prop, "Force", "Upward spring force, when inside the physics distance area");
+
+ prop= RNA_def_property(srna, "elasticity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "reflect");
+ RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_text(prop, "Elasticity", "Elasticity of collisions");
+
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fhdist");
+ RNA_def_property_range(prop, 0, 20);
+ RNA_def_property_ui_text(prop, "Distance", "Distance of the physics area");
+
+ prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "xyfrict");
+ RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_text(prop, "Damping", "Damping of the spring force, when inside the physics distance area");
+}
+
void RNA_def_material(BlenderRNA *brna)
{
StructRNA *srna;
@@ -917,9 +1443,14 @@ void RNA_def_material(BlenderRNA *brna)
static EnumPropertyItem prop_type_items[] = {
{MA_TYPE_SURFACE, "SURFACE", 0, "Surface", "Render object as a surface."},
+ {MA_TYPE_WIRE, "WIRE", 0, "Wire", "Render the edges of faces as wires (not supported in ray tracing)."},
{MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume."},
{MA_TYPE_HALO, "HALO", 0, "Halo", "Render object as halo particles."},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem transparency_items[] = {
+ {MA_ZTRANSP, "Z_TRANSPARENCY", 0, "Z Transparency", "Use alpha buffer for transparent faces."},
+ {MA_RAYTRANSP, "RAYTRACE", 0, "Raytrace", "Use raytracing for transparent refraction rendering."},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Material", "ID");
RNA_def_struct_ui_text(srna, "Material", "Material datablock to defined the appearance of geometric objects for rendering.");
@@ -931,19 +1462,31 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Type", "Material type defining how the object is rendered.");
RNA_def_property_enum_funcs(prop, NULL, "rna_Material_type_set", NULL);
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "transparency", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TRANSP);
+ RNA_def_property_ui_text(prop, "Transparency", "Render material as transparent.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+
+ prop= RNA_def_property(srna, "transparency_method", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, transparency_items);
+ RNA_def_property_ui_text(prop, "Transparency Method", "Method to use for rendering transparency.");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "amb");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Ambient", "Amount of global ambient color the material receives.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "emit", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0, 2);
+ RNA_def_property_range(prop, 0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0, 2.0f, 10, 2);
RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Translucency", "Amount of diffuse shading on the back side.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
@@ -968,7 +1511,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Factor to multiply shadow buffer bias with (0 is ignore.)");
- prop= RNA_def_property(srna, "shadow_casting_alpha", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "shadow_casting_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "shad_alpha");
RNA_def_property_range(prop, 0.001, 1);
RNA_def_property_ui_text(prop, "Shadow Casting Alpha", "Shadow casting alpha, only in use for Irregular Shadowbuffer.");
@@ -1003,11 +1546,6 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shadeless", "Makes this material insensitive to light or shadow.");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "wireframe", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_WIRE);
- RNA_def_property_ui_text(prop, "Wireframe", "Render the edges of faces as wires (not supported in ray tracing).");
- RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
-
prop= RNA_def_property(srna, "vertex_color_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
RNA_def_property_ui_text(prop, "Vertex Color Light", "Add vertex colors as additional lighting.");
@@ -1053,14 +1591,9 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Exclude Mist", "Excludes this material from mist effects (in world settings)");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
- prop= RNA_def_property(srna, "radiosity", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RADIO);
- RNA_def_property_ui_text(prop, "Radiosity", "Include this material in radiosity calculations");
- RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
-
- prop= RNA_def_property(srna, "transparent_shadows", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "receive_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW_TRA);
- RNA_def_property_ui_text(prop, "Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
+ RNA_def_property_ui_text(prop, "Receive Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
prop= RNA_def_property(srna, "ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
@@ -1084,44 +1617,63 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
/* nested structs */
- prop= RNA_def_property(srna, "raytrace_mirror", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "raytrace_mirror", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialRaytraceMirror");
RNA_def_property_pointer_funcs(prop, "rna_Material_mirror_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Raytrace Mirror", "Raytraced reflection settings for the material.");
- prop= RNA_def_property(srna, "raytrace_transparency", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "raytrace_transparency", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialRaytraceTransparency");
RNA_def_property_pointer_funcs(prop, "rna_Material_transp_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Raytrace Transparency", "Raytraced reflection settings for the material.");
- prop= RNA_def_property(srna, "halo", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "volume", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "vol");
+ RNA_def_property_struct_type(prop, "MaterialVolume");
+ RNA_def_property_ui_text(prop, "Volume", "Volume settings for the material.");
+
+ prop= RNA_def_property(srna, "halo", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialHalo");
RNA_def_property_pointer_funcs(prop, "rna_Material_halo_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Halo", "Halo settings for the material.");
- prop= RNA_def_property(srna, "subsurface_scattering", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "subsurface_scattering", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialSubsurfaceScattering");
RNA_def_property_pointer_funcs(prop, "rna_Material_sss_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Subsurface Scattering", "Subsurface scattering settings for the material.");
- prop= RNA_def_property(srna, "strand", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "strand", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "MaterialStrand");
RNA_def_property_pointer_funcs(prop, "rna_Material_strand_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Strand", "Strand settings for the material.");
+
+ prop= RNA_def_property(srna, "physics", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "MaterialPhysics");
+ RNA_def_property_pointer_funcs(prop, "rna_Material_physics_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Physics", "Game physics settings.");
/* nodetree */
prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based materials.");
+ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_nodes_set");
+ RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the material.");
+ RNA_def_property_update(prop, NC_MATERIAL, NULL);
+
/* common */
rna_def_animdata_common(srna);
- rna_def_mtex_common(srna, "rna_Material_mtex_begin", "rna_Material_active_texture_get", "MaterialTextureSlot");
-
- prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "scriptlink");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this material.");
+ rna_def_mtex_common(srna, "rna_Material_mtex_begin", "rna_Material_active_texture_get",
+ "rna_Material_active_texture_set", "MaterialTextureSlot");
rna_def_material_colors(srna);
rna_def_material_diffuse(srna);
@@ -1130,13 +1682,17 @@ void RNA_def_material(BlenderRNA *brna)
/* nested structs */
rna_def_material_raymirror(brna);
rna_def_material_raytra(brna);
+ rna_def_material_volume(brna);
rna_def_material_halo(brna);
rna_def_material_sss(brna);
rna_def_material_mtex(brna);
rna_def_material_strand(brna);
+ rna_def_material_physics(brna);
+
+ RNA_api_material(srna);
}
-void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeget, const char *structname)
+void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeget, const char *activeset, const char *structname)
{
PropertyRNA *prop;
@@ -1147,15 +1703,17 @@ void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeg
RNA_def_property_ui_text(prop, "Textures", "Texture slots defining the mapping and influence of textures.");
prop= RNA_def_property(srna, "active_texture", PROP_POINTER, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_struct_type(prop, structname);
- RNA_def_property_pointer_funcs(prop, activeget, NULL, NULL);
+ RNA_def_property_struct_type(prop, "Texture");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL);
RNA_def_property_ui_text(prop, "Active Texture", "Active texture slot being displayed.");
+ RNA_def_property_update(prop, NC_TEXTURE|ND_SHADING_DRAW, NULL);
prop= RNA_def_property(srna, "active_texture_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "texact");
RNA_def_property_range(prop, 0, MAX_MTEX-1);
RNA_def_property_ui_text(prop, "Active Texture Index", "Index of active texture slot.");
+ RNA_def_property_update(prop, NC_TEXTURE|ND_SHADING_DRAW, NULL);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_material_api.c b/source/blender/makesrna/intern/rna_material_api.c
new file mode 100644
index 00000000000..aa28b6b923c
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_material_api.c
@@ -0,0 +1,126 @@
+/**
+ *
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "DNA_material_types.h"
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_material.h"
+#include "BKE_texture.h"
+
+/*
+ Adds material to the first free texture slot.
+ If all slots are busy, replaces the first.
+*/
+static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texco)
+{
+ int i;
+ MTex *mtex;
+ int slot= -1;
+
+ for (i= 0; i < MAX_MTEX; i++) {
+ if (!ma->mtex[i]) {
+ slot= i;
+ break;
+ }
+ }
+
+ if (slot == -1)
+ slot= 0;
+
+ if (ma->mtex[slot]) {
+ ma->mtex[slot]->tex->id.us--;
+ }
+ else {
+ ma->mtex[slot]= add_mtex();
+ }
+
+ mtex= ma->mtex[slot];
+
+ mtex->tex= tex;
+ id_us_plus(&tex->id);
+
+ mtex->texco= mapto;
+ mtex->mapto= texco;
+}
+
+#else
+
+void RNA_api_material(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ /* copied from rna_def_material_mtex (rna_material.c) */
+ static EnumPropertyItem prop_texture_coordinates_items[] = {
+ {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
+ {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_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."},
+ {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
+ {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
+ {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
+
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_texture_mapto_items[] = {
+ {MAP_COL, "COLOR", 0, "Color", "Causes the texture to affect basic color of the material"},
+ {MAP_NORM, "NORMAL", 0, "Normal", "Causes the texture to affect the rendered normal"},
+ {MAP_COLSPEC, "SPECULAR_COLOR", 0, "Specularity Color", "Causes the texture to affect the specularity color"},
+ {MAP_COLMIR, "MIRROR", 0, "Mirror", "Causes the texture to affect the mirror color"},
+ {MAP_REF, "REFLECTION", 0, "Reflection", "Causes the texture to affect the value of the materials reflectivity"},
+ {MAP_SPEC, "SPECULARITY", 0, "Specularity", "Causes the texture to affect the value of specularity"},
+ {MAP_EMIT, "EMIT", 0, "Emit", "Causes the texture to affect the emit value"},
+ {MAP_ALPHA, "ALPHA", 0, "Alpha", "Causes the texture to affect the alpha value"},
+ {MAP_HAR, "HARDNESS", 0, "Hardness", "Causes the texture to affect the hardness value"},
+ {MAP_RAYMIRR, "RAY_MIRROR", 0, "Ray-Mirror", "Causes the texture to affect the ray-mirror value"},
+ {MAP_TRANSLU, "TRANSLUCENCY", 0, "Translucency", "Causes the texture to affect the translucency value"},
+ {MAP_AMB, "AMBIENT", 0, "Ambient", "Causes the texture to affect the value of ambient"},
+ {MAP_DISPLACE, "DISPLACEMENT", 0, "Displacement", "Let the texture displace the surface"},
+ {MAP_WARP, "WARP", 0, "Warp", "Let the texture warp texture coordinates of next channels"},
+ {0, NULL, 0, NULL, NULL}};
+
+ func= RNA_def_function(srna, "add_texture", "rna_Material_add_texture");
+ RNA_def_function_ui_description(func, "Add a texture to material's free texture slot.");
+ parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to add.");
+ parm= RNA_def_enum(func, "texture_coordinates", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
+ parm= RNA_def_enum(func, "map_to", prop_texture_mapto_items, MAP_COL, "", "Controls which material property the texture affects."); /* optional */
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index e56760f5ca3..ecfe59a0142 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -34,9 +34,43 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#ifdef RNA_RUNTIME
+
+#include "DNA_scene_types.h"
+
+#include "BLI_editVert.h"
+#include "BLI_arithb.h"
+
#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_utildefines.h"
-#ifdef RNA_RUNTIME
+#include "WM_api.h"
+#include "WM_types.h"
+
+static void rna_Mesh_update_data(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ DAG_id_flush_update(id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+}
+
+static void rna_Mesh_update_select(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, id);
+}
+
+void rna_Mesh_update_draw(bContext *C, PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+}
static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
{
@@ -83,6 +117,17 @@ static void rna_MEdge_crease_set(PointerRNA *ptr, float value)
medge->crease= (char)(CLAMPIS(value*255.0f, 0, 255));
}
+static void rna_MeshFace_normal_get(PointerRNA *ptr, float *values)
+{
+ Mesh *me= (Mesh*)ptr->id.data;
+ MFace *mface= (MFace*)ptr->data;
+
+ if(mface->v4)
+ CalcNormFloat4(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co, me->mvert[mface->v4].co, values);
+ else
+ CalcNormFloat(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co, values);
+}
+
/* notice red and blue are swapped */
static void rna_MeshColor_color1_get(PointerRNA *ptr, float *values)
{
@@ -170,10 +215,10 @@ static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, Pointe
MVert *mvert= (MVert*)ptr->data;
MDeformVert *dvert= me->dvert + (mvert-me->mvert);
- rna_iterator_array_begin(iter, (void*)dvert->dw, sizeof(MDeformWeight), dvert->totweight, NULL);
+ rna_iterator_array_begin(iter, (void*)dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, NULL);
}
else
- rna_iterator_array_begin(iter, NULL, 0, 0, NULL);
+ rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL);
}
static void rna_MeshFace_material_index_range(PointerRNA *ptr, int *min, int *max)
@@ -183,13 +228,19 @@ static void rna_MeshFace_material_index_range(PointerRNA *ptr, int *min, int *ma
*max= me->totcol-1;
}
+static CustomData *rna_mesh_fdata(Mesh *me)
+{
+ return (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
+}
+
static int rna_CustomDataLayer_length(PointerRNA *ptr, int type)
{
Mesh *me= (Mesh*)ptr->id.data;
+ CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *layer;
int i, length= 0;
- for(layer=me->fdata.layers, i=0; i<me->fdata.totlayer; layer++, i++)
+ for(layer=fdata->layers, i=0; i<fdata->totlayer; layer++, i++)
if(layer->type == type)
length++;
@@ -199,64 +250,96 @@ static int rna_CustomDataLayer_length(PointerRNA *ptr, int type)
static int rna_CustomDataLayer_active_get(PointerRNA *ptr, int type, int render)
{
Mesh *me= (Mesh*)ptr->id.data;
- int n= ((CustomDataLayer*)ptr->data) - me->fdata.layers;
+ CustomData *fdata= rna_mesh_fdata(me);
+ int n= ((CustomDataLayer*)ptr->data) - fdata->layers;
- if(render) return (n == CustomData_get_render_layer_index(&me->fdata, type));
- else return (n == CustomData_get_active_layer_index(&me->fdata, type));
+ if(render) return (n == CustomData_get_render_layer_index(fdata, type));
+ else return (n == CustomData_get_active_layer_index(fdata, type));
}
static void rna_CustomDataLayer_active_set(PointerRNA *ptr, int value, int type, int render)
{
Mesh *me= (Mesh*)ptr->id.data;
- int n= ((CustomDataLayer*)ptr->data) - me->fdata.layers;
+ CustomData *fdata= rna_mesh_fdata(me);
+ int n= ((CustomDataLayer*)ptr->data) - fdata->layers;
if(value == 0)
return;
- if(render) CustomData_set_layer_render_index(&me->fdata, type, n);
- else CustomData_set_layer_active_index(&me->fdata, type, n);
+ if(render) CustomData_set_layer_render_index(fdata, type, n);
+ else CustomData_set_layer_active_index(fdata, type, n);
}
-static int rna_uv_layer_check(CollectionPropertyIterator *iter, void *data)
+static int rna_uv_texture_check(CollectionPropertyIterator *iter, void *data)
{
CustomDataLayer *layer= (CustomDataLayer*)data;
return (layer->type != CD_MTFACE);
}
-static void rna_Mesh_uv_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+static void rna_Mesh_uv_textures_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- rna_iterator_array_begin(iter, (void*)me->fdata.layers, sizeof(CustomDataLayer), me->fdata.totlayer, rna_uv_layer_check);
+ CustomData *fdata= rna_mesh_fdata(me);
+ rna_iterator_array_begin(iter, (void*)fdata->layers, sizeof(CustomDataLayer), fdata->totlayer, 0, rna_uv_texture_check);
}
-static int rna_Mesh_uv_layers_length(PointerRNA *ptr)
+static int rna_Mesh_uv_textures_length(PointerRNA *ptr)
{
return rna_CustomDataLayer_length(ptr, CD_MTFACE);
}
-static PointerRNA rna_Mesh_active_uv_layer_get(PointerRNA *ptr)
+static PointerRNA rna_Mesh_active_uv_texture_get(PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- int index= CustomData_get_active_layer_index(&me->fdata, CD_MTFACE);
- CustomDataLayer *cdl= (index == -1)? NULL: &me->fdata.layers[index];
+ CustomData *fdata= rna_mesh_fdata(me);
+ int index= CustomData_get_active_layer_index(fdata, CD_MTFACE);
+ CustomDataLayer *cdl= (index == -1)? NULL: &fdata->layers[index];
return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFaceLayer, cdl);
}
-static void rna_Mesh_active_uv_layer_set(PointerRNA *ptr, PointerRNA value)
+static void rna_Mesh_active_uv_texture_set(PointerRNA *ptr, PointerRNA value)
{
Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *cdl;
int a;
- for(cdl=me->fdata.layers, a=0; a<me->fdata.totlayer; cdl++, a++) {
+ for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
if(value.data == cdl) {
- CustomData_set_layer_active_index(&me->fdata, CD_MTFACE, a);
+ CustomData_set_layer_active_index(fdata, CD_MTFACE, a);
+ mesh_update_customdata_pointers(me);
return;
}
}
}
+static int rna_Mesh_active_uv_texture_index_get(PointerRNA *ptr)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+ return CustomData_get_active_layer(fdata, CD_MTFACE);
+}
+
+static void rna_Mesh_active_uv_texture_index_set(PointerRNA *ptr, int value)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+
+ CustomData_set_layer_active(fdata, CD_MTFACE, value);
+ mesh_update_customdata_pointers(me);
+}
+
+static void rna_Mesh_active_uv_texture_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+
+ *min= 0;
+ *max= CustomData_number_of_layers(fdata, CD_MTFACE)-1;
+ *max= MAX2(0, *max);
+}
+
static void rna_MeshTextureFace_uv1_get(PointerRNA *ptr, float *values)
{
MTFace *mtface= (MTFace*)ptr->data;
@@ -321,11 +404,53 @@ static void rna_MeshTextureFace_uv4_set(PointerRNA *ptr, const float *values)
mtface->uv[3][1]= values[1];
}
+static int rna_CustomDataData_numverts(PointerRNA *ptr, int type)
+{
+ Mesh *me= (Mesh*)ptr->id.data;
+ CustomData *fdata= rna_mesh_fdata(me);
+ CustomDataLayer *cdl;
+ int a;
+ size_t b;
+
+ for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
+ if(cdl->type == type) {
+ b= ((char*)ptr->data - ((char*)cdl->data))/CustomData_sizeof(type);
+ if(b >= 0 && b < me->totface)
+ return (me->mface[b].v4? 4: 3);
+ }
+ }
+
+ return 0;
+}
+
+static int rna_MeshTextureFace_uv_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ length[0]= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+ length[1]= 2;
+ return length[0]*length[1];
+}
+
+static void rna_MeshTextureFace_uv_get(PointerRNA *ptr, float *values)
+{
+ MTFace *mtface= (MTFace*)ptr->data;
+ int totvert= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+
+ memcpy(values, mtface->uv, totvert * 2 * sizeof(float));
+}
+
+static void rna_MeshTextureFace_uv_set(PointerRNA *ptr, const float *values)
+{
+ MTFace *mtface= (MTFace*)ptr->data;
+ int totvert= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+
+ memcpy(mtface->uv, values, totvert * 2 * sizeof(float));
+}
+
static void rna_MeshTextureFaceLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->id.data;
CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MTFace), me->totface, NULL);
+ rna_iterator_array_begin(iter, layer->data, sizeof(MTFace), me->totface, 0, NULL);
}
static int rna_MeshTextureFaceLayer_data_length(PointerRNA *ptr)
@@ -354,51 +479,89 @@ static void rna_MeshTextureFaceLayer_active_set(PointerRNA *ptr, int value)
rna_CustomDataLayer_active_set(ptr, value, CD_MTFACE, 0);
}
-static int rna_vcol_layer_check(CollectionPropertyIterator *iter, void *data)
+static void rna_MeshTextureFaceLayer_name_set(PointerRNA *ptr, const char *value)
+{
+ Mesh *me= (Mesh*)ptr->id.data;
+ CustomDataLayer *cdl= (CustomDataLayer*)ptr->data;
+ BLI_strncpy(cdl->name, value, sizeof(cdl->name));
+ CustomData_set_layer_unique_name(&me->fdata, cdl - me->fdata.layers);
+}
+
+static int rna_vertex_color_check(CollectionPropertyIterator *iter, void *data)
{
CustomDataLayer *layer= (CustomDataLayer*)data;
return (layer->type != CD_MCOL);
}
-static void rna_Mesh_vcol_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+static void rna_Mesh_vertex_colors_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- rna_iterator_array_begin(iter, (void*)me->fdata.layers, sizeof(CustomDataLayer), me->fdata.totlayer, rna_vcol_layer_check);
+ CustomData *fdata= rna_mesh_fdata(me);
+ rna_iterator_array_begin(iter, (void*)fdata->layers, sizeof(CustomDataLayer), fdata->totlayer, 0, rna_vertex_color_check);
}
-static int rna_Mesh_vcol_layers_length(PointerRNA *ptr)
+static int rna_Mesh_vertex_colors_length(PointerRNA *ptr)
{
return rna_CustomDataLayer_length(ptr, CD_MCOL);
}
-static PointerRNA rna_Mesh_active_vcol_layer_get(PointerRNA *ptr)
+static PointerRNA rna_Mesh_active_vertex_color_get(PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- int index= CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
- CustomDataLayer *cdl= (index == -1)? NULL: &me->fdata.layers[index];
+ CustomData *fdata= rna_mesh_fdata(me);
+ int index= CustomData_get_active_layer_index(fdata, CD_MCOL);
+ CustomDataLayer *cdl= (index == -1)? NULL: &fdata->layers[index];
return rna_pointer_inherit_refine(ptr, &RNA_MeshColorLayer, cdl);
}
-static void rna_Mesh_active_vcol_layer_set(PointerRNA *ptr, PointerRNA value)
+static void rna_Mesh_active_vertex_color_set(PointerRNA *ptr, PointerRNA value)
{
Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *cdl;
int a;
- for(cdl=me->fdata.layers, a=0; a<me->fdata.totlayer; cdl++, a++) {
+ for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
if(value.data == cdl) {
- CustomData_set_layer_active_index(&me->fdata, CD_MCOL, a);
+ CustomData_set_layer_active_index(fdata, CD_MCOL, a);
+ mesh_update_customdata_pointers(me);
return;
}
}
}
+static int rna_Mesh_active_vertex_color_index_get(PointerRNA *ptr)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+ return CustomData_get_active_layer(fdata, CD_MCOL);
+}
+
+static void rna_Mesh_active_vertex_color_index_set(PointerRNA *ptr, int value)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+
+ CustomData_set_layer_active(fdata, CD_MCOL, value);
+ mesh_update_customdata_pointers(me);
+}
+
+static void rna_Mesh_active_vertex_color_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Mesh *me= (Mesh*)ptr->data;
+ CustomData *fdata= rna_mesh_fdata(me);
+
+ *min= 0;
+ *max= CustomData_number_of_layers(fdata, CD_MCOL)-1;
+ *max= MAX2(0, *max);
+}
+
static void rna_MeshColorLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->id.data;
CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MCol)*4, me->totface, NULL);
+ rna_iterator_array_begin(iter, layer->data, sizeof(MCol)*4, me->totface, 0, NULL);
}
static int rna_MeshColorLayer_data_length(PointerRNA *ptr)
@@ -427,11 +590,19 @@ static void rna_MeshColorLayer_active_set(PointerRNA *ptr, int value)
rna_CustomDataLayer_active_set(ptr, value, CD_MCOL, 0);
}
+static void rna_MeshColorLayer_name_set(PointerRNA *ptr, const char *value)
+{
+ Mesh *me= (Mesh*)ptr->id.data;
+ CustomDataLayer *cdl= (CustomDataLayer*)ptr->data;
+ BLI_strncpy(cdl->name, value, sizeof(cdl->name));
+ CustomData_set_layer_unique_name(&me->fdata, cdl - me->fdata.layers);
+}
+
static void rna_MeshFloatPropertyLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->id.data;
CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MFloatProperty), me->totface, NULL);
+ rna_iterator_array_begin(iter, layer->data, sizeof(MFloatProperty), me->totface, 0, NULL);
}
static int rna_MeshFloatPropertyLayer_data_length(PointerRNA *ptr)
@@ -449,7 +620,8 @@ static int rna_float_layer_check(CollectionPropertyIterator *iter, void *data)
static void rna_Mesh_float_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- rna_iterator_array_begin(iter, (void*)me->fdata.layers, sizeof(CustomDataLayer), me->fdata.totlayer, rna_float_layer_check);
+ CustomData *fdata= rna_mesh_fdata(me);
+ rna_iterator_array_begin(iter, (void*)fdata->layers, sizeof(CustomDataLayer), fdata->totlayer, 0, rna_float_layer_check);
}
static int rna_Mesh_float_layers_length(PointerRNA *ptr)
@@ -467,7 +639,7 @@ static void rna_MeshIntPropertyLayer_data_begin(CollectionPropertyIterator *iter
{
Mesh *me= (Mesh*)ptr->id.data;
CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MIntProperty), me->totface, NULL);
+ rna_iterator_array_begin(iter, layer->data, sizeof(MIntProperty), me->totface, 0, NULL);
}
static int rna_MeshIntPropertyLayer_data_length(PointerRNA *ptr)
@@ -479,7 +651,8 @@ static int rna_MeshIntPropertyLayer_data_length(PointerRNA *ptr)
static void rna_Mesh_int_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- rna_iterator_array_begin(iter, (void*)me->fdata.layers, sizeof(CustomDataLayer), me->fdata.totlayer, rna_int_layer_check);
+ CustomData *fdata= rna_mesh_fdata(me);
+ rna_iterator_array_begin(iter, (void*)fdata->layers, sizeof(CustomDataLayer), fdata->totlayer, 0, rna_int_layer_check);
}
static int rna_Mesh_int_layers_length(PointerRNA *ptr)
@@ -497,7 +670,7 @@ static void rna_MeshStringPropertyLayer_data_begin(CollectionPropertyIterator *i
{
Mesh *me= (Mesh*)ptr->id.data;
CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MStringProperty), me->totface, NULL);
+ rna_iterator_array_begin(iter, layer->data, sizeof(MStringProperty), me->totface, 0, NULL);
}
static int rna_MeshStringPropertyLayer_data_length(PointerRNA *ptr)
@@ -509,7 +682,8 @@ static int rna_MeshStringPropertyLayer_data_length(PointerRNA *ptr)
static void rna_Mesh_string_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me= (Mesh*)ptr->data;
- rna_iterator_array_begin(iter, (void*)me->fdata.layers, sizeof(CustomDataLayer), me->fdata.totlayer, rna_string_layer_check);
+ CustomData *fdata= rna_mesh_fdata(me);
+ rna_iterator_array_begin(iter, (void*)fdata->layers, sizeof(CustomDataLayer), fdata->totlayer, 0, rna_string_layer_check);
}
static int rna_Mesh_string_layers_length(PointerRNA *ptr)
@@ -534,6 +708,30 @@ static void rna_TextureFace_image_set(PointerRNA *ptr, PointerRNA value)
tf->tpage= (struct Image*)id;
}
+static int rna_MeshFace_verts_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ MFace *face= (MFace*)ptr->data;
+
+ if(face)
+ length[0]= (face->v4)? 4: 3;
+ else
+ length[0]= 4; // XXX rna_raw_access wants the length of a dummy face. this needs fixing. - Campbell
+
+ return length[0];
+}
+
+static void rna_MeshFace_verts_get(PointerRNA *ptr, int *values)
+{
+ MFace *face= (MFace*)ptr->data;
+ memcpy(values, &face->v1, (face->v4 ? 4 : 3) * sizeof(int));
+}
+
+static void rna_MeshFace_verts_set(PointerRNA *ptr, const int *values)
+{
+ MFace *face= (MFace*)ptr->data;
+ memcpy(&face->v1, values, (face->v4 ? 4 : 3) * sizeof(int));
+}
+
/* path construction */
static char *rna_VertexGroupElement_path(PointerRNA *ptr)
@@ -568,17 +766,18 @@ static char *rna_MeshVertex_path(PointerRNA *ptr)
static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
{
- return BLI_sprintfN("uv_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+ return BLI_sprintfN("uv_textures[%s]", ((CustomDataLayer*)ptr->data)->name);
}
static char *rna_CustomDataData_path(PointerRNA *ptr, char *collection, int type)
{
Mesh *me= (Mesh*)ptr->id.data;
+ CustomData *fdata= rna_mesh_fdata(me);
CustomDataLayer *cdl;
int a;
size_t b;
- for(cdl=me->fdata.layers, a=0; a<me->fdata.totlayer; cdl++, a++) {
+ for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
if(cdl->type == type) {
b= ((char*)ptr->data - ((char*)cdl->data))/CustomData_sizeof(type);
if(b >= 0 && b < me->totface)
@@ -591,17 +790,17 @@ static char *rna_CustomDataData_path(PointerRNA *ptr, char *collection, int type
static char *rna_MeshTextureFace_path(PointerRNA *ptr)
{
- return rna_CustomDataData_path(ptr, "uv_layers", CD_MTFACE);
+ return rna_CustomDataData_path(ptr, "uv_textures", CD_MTFACE);
}
static char *rna_MeshColorLayer_path(PointerRNA *ptr)
{
- return BLI_sprintfN("vcol_layers[%s]", ((CustomDataLayer*)ptr->data)->name);
+ return BLI_sprintfN("vertex_colors[%s]", ((CustomDataLayer*)ptr->data)->name);
}
static char *rna_MeshColor_path(PointerRNA *ptr)
{
- return rna_CustomDataData_path(ptr, "vcol_layers", CD_MCOL);
+ return rna_CustomDataData_path(ptr, "vertex_colors", CD_MCOL);
}
static char *rna_MeshSticky_path(PointerRNA *ptr)
@@ -658,10 +857,12 @@ static void rna_def_mvert_group(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "def_nr");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Group Index", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Weight", "Vertex Weight");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
static void rna_def_mvert(BlenderRNA *brna)
@@ -675,10 +876,11 @@ static void rna_def_mvert(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_MeshVertex_path");
RNA_def_struct_ui_icon(srna, ICON_VERTEXSEL);
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_ui_text(prop, "Location", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_float_sdna(prop, NULL, "no");
RNA_def_property_float_funcs(prop, "rna_MeshVertex_normal_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Normal", "Vertex Normal");
@@ -687,14 +889,17 @@ static void rna_def_mvert(BlenderRNA *brna)
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "bevel_weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_MeshVertex_bevel_weight_get", "rna_MeshVertex_bevel_weight_set", NULL);
RNA_def_property_ui_text(prop, "Bevel Weight", "Weight used by the Bevel modifier 'Only Vertices' option");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_funcs(prop, "rna_MeshVertex_groups_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0, 0, 0);
@@ -716,32 +921,48 @@ static void rna_def_medge(BlenderRNA *brna)
prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "v1");
RNA_def_property_array(prop, 2);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
+ // XXX allows creating invalid meshes
prop= RNA_def_property(srna, "crease", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_MEdge_crease_get", "rna_MEdge_crease_set", NULL);
RNA_def_property_ui_text(prop, "Crease", "Weight used by the Subsurf modifier for creasing");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "bevel_weight", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_MEdge_bevel_weight_get", "rna_MEdge_bevel_weight_set", NULL);
RNA_def_property_ui_text(prop, "Bevel Weight", "Weight used by the Bevel modifier");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "seam", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SEAM);
RNA_def_property_ui_text(prop, "Seam", "Seam edge for UV unwrapping");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "sharp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SHARP);
RNA_def_property_ui_text(prop, "Sharp", "Sharp edge for the EdgeSplit modifier");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "loose", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_LOOSEEDGE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Loose", "Loose edge");
+
+ prop= RNA_def_property(srna, "fgon", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FGON);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Fgon", "Fgon edge");
}
static void rna_def_mface(BlenderRNA *brna)
@@ -755,29 +976,42 @@ static void rna_def_mface(BlenderRNA *brna)
RNA_def_struct_path_func(srna, "rna_MeshFace_path");
RNA_def_struct_ui_icon(srna, ICON_FACESEL);
+ // XXX allows creating invalid meshes
prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "v1");
RNA_def_property_array(prop, 4);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_MeshFace_verts_get_length");
+ RNA_def_property_int_funcs(prop, "rna_MeshFace_verts_get", "rna_MeshFace_verts_set", NULL);
+
RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
prop= RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "mat_nr");
RNA_def_property_ui_text(prop, "Material Index", "");
- RNA_def_property_range(prop, 0, MAXMAT-1);
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshFace_material_index_range");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL);
RNA_def_property_ui_text(prop, "Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
RNA_def_property_ui_text(prop, "Hidden", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, -1.0f, 1.0f);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_float_funcs(prop, "rna_MeshFace_normal_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "face normal", "local space unit length normal vector for this face");
}
static void rna_def_mtface(BlenderRNA *brna)
@@ -790,24 +1024,30 @@ 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};
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.");
RNA_def_struct_sdna(srna, "CustomDataLayer");
RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path");
+ RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS);
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshTextureFaceLayer_name_set");
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_get", "rna_MeshTextureFaceLayer_active_set");
RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_render_get", "rna_MeshTextureFaceLayer_active_render_set");
RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "MeshTextureFace");
@@ -825,88 +1065,117 @@ static void rna_def_mtface(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, NULL, "rna_TextureFace_image_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "tex", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TEX);
RNA_def_property_ui_text(prop, "Tex", "Render face with texture");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_LIGHT);
RNA_def_property_ui_text(prop, "Light", "Use light for face");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "invisible", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_INVISIBLE);
RNA_def_property_ui_text(prop, "Invisible", "Make face invisible");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_DYNAMIC);
RNA_def_property_ui_text(prop, "Collision", "Use face for collision and ray-sensor detection");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "shared", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHAREDCOL);
RNA_def_property_ui_text(prop, "Shared", "Blend vertex colors across face when vertices are shared");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "twoside", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TWOSIDE);
RNA_def_property_ui_text(prop, "Twoside", "Render face twosided");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "object_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_OBCOL);
RNA_def_property_ui_text(prop, "Object Color", "Use ObColor instead of vertex colors");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD);
RNA_def_property_ui_text(prop, "Halo", "Screen aligned billboard");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "billboard", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD2);
RNA_def_property_ui_text(prop, "Billboard", "Billboard with Z-axis constraint");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "shadow", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHADOW);
RNA_def_property_ui_text(prop, "Shadow", "Face is used for shadow");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "text", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BMFONT);
RNA_def_property_ui_text(prop, "Text", "Enable bitmap text on face");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "alpha_sort", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_ALPHASORT);
RNA_def_property_ui_text(prop, "Alpha Sort", "Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible)");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "transp", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, transp_items);
RNA_def_property_ui_text(prop, "Transparency", "Transparency blending mode");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "uv_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "UV Selected", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
prop= RNA_def_property(srna, "uv_pinned", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "UV Pinned", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
- prop= RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv1_get", "rna_MeshTextureFace_uv1_set", NULL);
RNA_def_property_ui_text(prop, "UV 1", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv2_get", "rna_MeshTextureFace_uv2_set", NULL);
RNA_def_property_ui_text(prop, "UV 2", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv3_get", "rna_MeshTextureFace_uv3_set", NULL);
RNA_def_property_ui_text(prop, "UV 3", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv4_get", "rna_MeshTextureFace_uv4_set", NULL);
RNA_def_property_ui_text(prop, "UV 4", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_multi_array(prop, 2, uv_dim);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTextureFace_uv_get_length");
+ RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv_get", "rna_MeshTextureFace_uv_set", NULL);
+ RNA_def_property_ui_text(prop, "UV", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
static void rna_def_msticky(BlenderRNA *brna)
@@ -919,8 +1188,9 @@ static void rna_def_msticky(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Mesh Vertex Sticky Texture Coordinate", "Stricky texture coordinate.");
RNA_def_struct_path_func(srna, "rna_MeshSticky_path");
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ);
RNA_def_property_ui_text(prop, "Location", "Sticky texture coordinate location.");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
static void rna_def_mcol(BlenderRNA *brna)
@@ -932,19 +1202,24 @@ static void rna_def_mcol(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh datablock.");
RNA_def_struct_sdna(srna, "CustomDataLayer");
RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path");
+ RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshColorLayer_name_set");
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_get", "rna_MeshColorLayer_active_set");
RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_render_get", "rna_MeshColorLayer_active_render_set");
RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "MeshColor");
@@ -961,24 +1236,28 @@ static void rna_def_mcol(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshColor_color1_get", "rna_MeshColor_color1_set", NULL);
RNA_def_property_ui_text(prop, "Color 1", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "color2", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshColor_color2_get", "rna_MeshColor_color2_set", NULL);
RNA_def_property_ui_text(prop, "Color 2", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "color3", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshColor_color3_get", "rna_MeshColor_color3_set", NULL);
RNA_def_property_ui_text(prop, "Color 3", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "color4", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshColor_color4_get", "rna_MeshColor_color4_set", NULL);
RNA_def_property_ui_text(prop, "Color 4", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
static void rna_def_mproperties(BlenderRNA *brna)
@@ -995,6 +1274,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_struct_name_property(srna, prop);
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "MeshFloatProperty");
@@ -1009,6 +1289,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f");
RNA_def_property_ui_text(prop, "Value", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
/* Int */
srna= RNA_def_struct(brna, "MeshIntPropertyLayer", NULL);
@@ -1019,6 +1300,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_struct_name_property(srna, prop);
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "MeshIntProperty");
@@ -1033,6 +1315,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "value", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "i");
RNA_def_property_ui_text(prop, "Value", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
/* String */
srna= RNA_def_struct(brna, "MeshStringPropertyLayer", NULL);
@@ -1043,6 +1326,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_struct_name_property(srna, prop);
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "MeshStringProperty");
@@ -1057,6 +1341,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "s");
RNA_def_property_ui_text(prop, "Value", "");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
}
void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
@@ -1068,21 +1353,24 @@ void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
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.");
- prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "texspace_loc", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Texure Space Location", "Texture space location.");
RNA_def_property_editable_func(prop, texspace_editable);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
- prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size.");
RNA_def_property_editable_func(prop, texspace_editable);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
/* not supported yet
- prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
RNA_def_property_float(prop, NULL, "rot");
RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
- RNA_def_property_editable_func(prop, texspace_editable);*/
+ RNA_def_property_editable_func(prop, texspace_editable);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");*/
/* materials */
prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
@@ -1104,7 +1392,6 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "mvert", "totvert");
RNA_def_property_struct_type(prop, "MeshVertex");
RNA_def_property_ui_text(prop, "Vertices", "Vertices of the mesh.");
- // XXX RNA_def_property_collection_funcs(prop, "rna_Mesh_verts_begin", 0, 0, 0, 0, 0, 0, "add_verts", "remove_verts");
prop= RNA_def_property(srna, "edges", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "medge", "totedge");
@@ -1121,33 +1408,45 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "MeshSticky");
RNA_def_property_ui_text(prop, "Sticky", "Sticky texture coordinates.");
- /* UV layers */
+ /* UV textures */
- prop= RNA_def_property(srna, "uv_layers", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "uv_textures", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_uv_layers_begin", 0, 0, 0, "rna_Mesh_uv_layers_length", 0, 0, 0, 0);
+ RNA_def_property_collection_funcs(prop, "rna_Mesh_uv_textures_begin", 0, 0, 0, "rna_Mesh_uv_textures_length", 0, 0, 0, 0);
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_ui_text(prop, "UV Layers", "");
+ RNA_def_property_ui_text(prop, "UV Textures", "");
- prop= RNA_def_property(srna, "active_uv_layer", PROP_POINTER, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "active_uv_texture", PROP_POINTER, PROP_UNSIGNED);
RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_uv_layer_get", "rna_Mesh_active_uv_layer_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_uv_texture_get", "rna_Mesh_active_uv_texture_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Active UV Layer", "Active UV layer.");
+ RNA_def_property_ui_text(prop, "Active UV Texture", "Active UV texture.");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- /* VCol layers */
+ prop= RNA_def_property(srna, "active_uv_texture_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Mesh_active_uv_texture_index_get", "rna_Mesh_active_uv_texture_index_set", "rna_Mesh_active_uv_texture_index_range");
+ RNA_def_property_ui_text(prop, "Active UV Texture Index", "Active UV texture index.");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
- prop= RNA_def_property(srna, "vcol_layers", PROP_COLLECTION, PROP_NONE);
+ /* Vertex colors */
+
+ prop= RNA_def_property(srna, "vertex_colors", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_vcol_layers_begin", 0, 0, 0, "rna_Mesh_vcol_layers_length", 0, 0, 0, 0);
+ RNA_def_property_collection_funcs(prop, "rna_Mesh_vertex_colors_begin", 0, 0, 0, "rna_Mesh_vertex_colors_length", 0, 0, 0, 0);
RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_ui_text(prop, "Vertex Color Layers", "");
+ RNA_def_property_ui_text(prop, "Vertex Colors", "");
- prop= RNA_def_property(srna, "active_vcol_layer", PROP_POINTER, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "active_vertex_color", PROP_POINTER, PROP_UNSIGNED);
RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_vcol_layer_get", "rna_Mesh_active_vcol_layer_set", NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Mesh_active_vertex_color_get", "rna_Mesh_active_vertex_color_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer.");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+ prop= RNA_def_property(srna, "active_vertex_color_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Mesh_active_vertex_color_index_get", "rna_Mesh_active_vertex_color_index_set", "rna_Mesh_active_vertex_color_index_range");
+ RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index.");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "float_layers", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
@@ -1183,6 +1482,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "double_sided", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_TWOSIDED);
RNA_def_property_ui_text(prop, "Double Sided", "Render/display the mesh with double or single sided lighting");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "texco_mesh", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "texcomesh");
@@ -1192,6 +1492,64 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "shape_keys", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "key");
RNA_def_property_ui_text(prop, "Shape Keys", "");
+
+ /* Mesh Draw Options for Edit Mode*/
+
+ prop= RNA_def_property(srna, "draw_edges", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEDGES);
+ RNA_def_property_ui_text(prop, "Draw Edges", "Displays selected edges using hilights in the 3d view and UV editor");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_faces", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWFACES);
+ RNA_def_property_ui_text(prop, "Draw Faces", "Displays all faces as shades in the 3d view and UV editor");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_normals", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWNORMALS);
+ RNA_def_property_ui_text(prop, "Draw Normals", "Displays face normals as lines");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_vertex_normals", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_VNORMALS);
+ RNA_def_property_ui_text(prop, "Draw Vertex Normals", "Displays vertex normals as lines");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_creases", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWCREASES);
+ RNA_def_property_ui_text(prop, "Draw Creases", "Displays creases created for subsurf weighting");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_bevel_weights", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWBWEIGHTS);
+ RNA_def_property_ui_text(prop, "Draw Bevel Weights", "Displays weights created for the Bevel modifier");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_seams", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSEAMS);
+ RNA_def_property_ui_text(prop, "Draw Seams", "Displays UV unwrapping seams");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_sharp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSHARP);
+ RNA_def_property_ui_text(prop, "Draw Sharp", "Displays sharp edges, used with the EdgeSplit modifier");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+
+ prop= RNA_def_property(srna, "draw_edge_lenght", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGELEN);
+ RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_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");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+
+ prop= RNA_def_property(srna, "draw_face_area", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACEAREA);
+ RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces");
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 26fb77777d7..d8466337781 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -34,74 +34,290 @@
#ifdef RNA_RUNTIME
+#include "DNA_mesh_types.h"
+#include "DNA_scene_types.h"
+
#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_material.h"
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
-/*
-void rna_Mesh_copy(Mesh *me, Mesh *from)
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "MEM_guardedalloc.h"
+
+static void rna_Mesh_calc_edges(Mesh *mesh)
{
- copy_mesh_data(me, from);
+ CustomData edata;
+ EdgeHashIterator *ehi;
+ MFace *mf = mesh->mface;
+ MEdge *med;
+ EdgeHash *eh = BLI_edgehash_new();
+ int i, *index, totedge, totface = mesh->totface;
+
+ 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, ++index) {
+ 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 rna_Mesh_copy_applied(Mesh *me, Scene *sce, Object *ob)
+static void rna_Mesh_update(Mesh *mesh, bContext *C)
{
- DerivedMesh *dm= mesh_create_derived_view(sce, ob, CD_MASK_MESH);
- DM_to_mesh(dm, me);
- dm->release(dm);
+ Main *bmain= CTX_data_main(C);
+ Object *ob;
+
+ if(mesh->totface && mesh->totedge == 0)
+ rna_Mesh_calc_edges(mesh);
+
+ mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
+
+ DAG_id_flush_update(&mesh->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
}
-*/
-void rna_Mesh_transform(Mesh *me, float **mat)
+static void rna_Mesh_transform(Mesh *me, float *mat)
{
+
+ /* TODO: old API transform had recalc_normals option */
+ int i;
+ MVert *mvert= me->mvert;
+
+ for(i= 0; i < me->totvert; i++, mvert++) {
+ Mat4MulVecfl((float (*)[4])mat, mvert->co);
+ }
}
-#if 0
-/* extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example); */
+static void rna_Mesh_add_verts(Mesh *mesh, int len)
+{
+ CustomData vdata;
+ MVert *mvert;
+ int i, totvert;
+
+ if(len == 0)
+ return;
+
+ totvert= mesh->totvert + len;
+ CustomData_copy(&mesh->vdata, &vdata, CD_MASK_MESH, CD_DEFAULT, totvert);
+ CustomData_copy_data(&mesh->vdata, &vdata, 0, 0, mesh->totvert);
-static void rna_Mesh_verts_add(PointerRNA *ptr, PointerRNA *ptr_item)
+ if(!CustomData_has_layer(&vdata, CD_MVERT))
+ CustomData_add_layer(&vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
+
+ CustomData_free(&mesh->vdata, mesh->totvert);
+ mesh->vdata= vdata;
+ mesh_update_customdata_pointers(mesh);
+
+ /* scan the input list and insert the new vertices */
+
+ mvert= &mesh->mvert[mesh->totvert];
+ for(i=0; i<len; i++, mvert++)
+ mvert->flag |= SELECT;
+
+ /* set final vertex list size */
+ mesh->totvert= totvert;
+}
+
+Mesh *rna_Mesh_create_copy(Mesh *me)
{
- //Mesh *me= (Mesh*)ptr->data;
+ Mesh *ret= copy_mesh(me);
+ ret->id.us--;
+
+ return ret;
+}
- /*
- // XXX if item is not MVert we fail silently
- if (item->type == RNA_MeshVertex)
+static void rna_Mesh_add_edges(Mesh *mesh, int len)
+{
+ CustomData edata;
+ MEdge *medge;
+ int i, totedge;
+
+ if(len == 0)
return;
- // XXX this must be slow...
- EditMesh *em= BKE_mesh_get_editmesh(me);
+ totedge= mesh->totedge+len;
+
+ /* update customdata */
+ CustomData_copy(&mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+ CustomData_copy_data(&mesh->edata, &edata, 0, 0, mesh->totedge);
- MVert *v = (MVert*)ptr_item->ptr->data;
- addvertlist(em, v->co, NULL);
+ if(!CustomData_has_layer(&edata, CD_MEDGE))
+ CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
- BKE_mesh_end_editmesh(me, em);
- */
+ CustomData_free(&mesh->edata, mesh->totedge);
+ mesh->edata= edata;
+ mesh_update_customdata_pointers(mesh);
+
+ /* set default flags */
+ medge= &mesh->medge[mesh->totedge];
+ for(i=0; i<len; i++, medge++)
+ medge->flag= ME_EDGEDRAW|ME_EDGERENDER|SELECT;
+
+ mesh->totedge= totedge;
+}
+
+static void rna_Mesh_add_faces(Mesh *mesh, int len)
+{
+ CustomData fdata;
+ MFace *mface;
+ int i, totface;
+
+ if(len == 0)
+ return;
+
+ totface= mesh->totface + len; /* new face count */
+
+ /* update customdata */
+ CustomData_copy(&mesh->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&mesh->fdata, &fdata, 0, 0, mesh->totface);
+
+ if(!CustomData_has_layer(&fdata, CD_MFACE))
+ CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface);
+
+ CustomData_free(&mesh->fdata, mesh->totface);
+ mesh->fdata= fdata;
+ mesh_update_customdata_pointers(mesh);
+
+ /* set default flags */
+ mface= &mesh->mface[mesh->totface];
+ for(i=0; i<len; i++, mface++)
+ mface->flag= SELECT;
+
+ mesh->totface= totface;
+}
+
+/*
+static void rna_Mesh_add_faces(Mesh *mesh)
+{
+}
+*/
+
+static void rna_Mesh_add_geometry(Mesh *mesh, int verts, int edges, int faces)
+{
+ if(verts)
+ rna_Mesh_add_verts(mesh, verts);
+ if(edges)
+ rna_Mesh_add_edges(mesh, edges);
+ if(faces)
+ rna_Mesh_add_faces(mesh, faces);
+}
+
+static void rna_Mesh_add_uv_texture(Mesh *me)
+{
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
+}
+
+static void rna_Mesh_calc_normals(Mesh *me)
+{
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+}
+
+static void rna_Mesh_add_material(Mesh *me, Material *ma)
+{
+ int i;
+ int totcol = me->totcol + 1;
+ Material **mat;
+
+ /* don't add if mesh already has it */
+ for (i = 0; i < me->totcol; i++)
+ if (me->mat[i] == ma)
+ return;
+
+ mat= MEM_callocN(sizeof(void*) * totcol, "newmatar");
+
+ if (me->totcol) memcpy(mat, me->mat, sizeof(void*) * me->totcol);
+ if (me->mat) MEM_freeN(me->mat);
+
+ me->mat = mat;
+ me->mat[me->totcol++] = ma;
+ ma->id.us++;
+
+ test_object_materials((ID*)me);
}
-#endif
#else
void RNA_api_mesh(StructRNA *srna)
{
- /*FunctionRNA *func;
- PropertyRNA *prop;*/
-
- /*
- func= RNA_def_function(srna, "copy", "rna_Mesh_copy");
- RNA_def_function_ui_description(func, "Copy mesh data.");
- prop= RNA_def_pointer(func, "src", "Mesh", "", "A mesh to copy data from.");
- RNA_def_property_flag(prop, PROP_REQUIRED);*/
-
- /*
- func= RNA_def_function(srna, "add_geom", "rna_Mesh_add_geom");
- RNA_def_function_ui_description(func, "Add geometry data to mesh.");
- prop= RNA_def_collection(func, "verts", "?", "", "Vertices.");
- RNA_def_property_flag(prop, PROP_REQUIRED);
- prop= RNA_def_collection(func, "faces", "?", "", "Faces.");
- RNA_def_property_flag(prop, PROP_REQUIRED);
- */
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "transform", "rna_Mesh_transform");
+ RNA_def_function_ui_description(func, "Transform mesh vertices by a matrix.");
+ parm= RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "add_geometry", "rna_Mesh_add_geometry");
+ parm= RNA_def_int(func, "verts", 0, 0, INT_MAX, "Number", "Number of vertices to add.", 0, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_int(func, "edges", 0, 0, INT_MAX, "Number", "Number of edges to add.", 0, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_int(func, "faces", 0, 0, INT_MAX, "Number", "Number of faces to add.", 0, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "create_copy", "rna_Mesh_create_copy");
+ RNA_def_function_ui_description(func, "Create a copy of this Mesh datablock.");
+ parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh, remove it if it is only used for export.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "add_uv_texture", "rna_Mesh_add_uv_texture");
+ RNA_def_function_ui_description(func, "Add a UV texture layer to Mesh.");
+
+ func= RNA_def_function(srna, "calc_normals", "rna_Mesh_calc_normals");
+ RNA_def_function_ui_description(func, "Calculate vertex normals.");
+
+ func= RNA_def_function(srna, "update", "rna_Mesh_update");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+ func= RNA_def_function(srna, "add_material", "rna_Mesh_add_material");
+ RNA_def_function_ui_description(func, "Add a new material to Mesh.");
+ parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index 5f95336af2d..1a4e4da886b 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Contributor(s): Blender Foundation (2008), Juho Vepsäläinen
+ * Contributor(s): Blender Foundation (2008), Juho Vepsalainen, Jiri Hnidek
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -34,24 +34,49 @@
#ifdef RNA_RUNTIME
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_mball.h"
+#include "BKE_depsgraph.h"
+#include "BKE_main.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+
static int rna_Meta_texspace_editable(PointerRNA *ptr)
{
MetaBall *mb= (MetaBall*)ptr->data;
return (mb->texflag & AUTOSPACE)? 0: PROP_EDITABLE;
}
+static void rna_MetaBall_update_data(bContext *C, PointerRNA *ptr)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ MetaBall *mb= ptr->id.data;
+ Object *ob;
+
+ for(ob=bmain->object.first; ob; ob= ob->id.next)
+ if(ob->data == mb)
+ copy_mball_properties(scene, ob);
+
+ DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
+}
+
#else
-void rna_def_metaelement(BlenderRNA *brna)
+static void rna_def_metaelement(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem prop_type_items[] = {
- {MB_BALL, "BALL", 0, "Ball", ""},
- {MB_TUBE, "TUBE", 0, "Tube", ""},
- {MB_PLANE, "PLANE", 0, "Plane", ""},
- {MB_ELIPSOID, "ELLIPSOID", 0, "Ellipsoid", ""}, // NOTE: typo at original definition!
- {MB_CUBE, "CUBE", 0, "Cube", ""},
+ {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
+ {MB_TUBE, "TUBE", ICON_META_TUBE, "Tube", ""},
+ {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}};
srna= RNA_def_struct(brna, "MetaElement", NULL);
@@ -61,52 +86,70 @@ void rna_def_metaelement(BlenderRNA *brna)
/* enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "Type", "Metaball types.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* number values */
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "x");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Location", "");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
+ 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");
- prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "rad");
RNA_def_property_ui_text(prop, "Radius", "");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
- prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "size_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "expx");
RNA_def_property_range(prop, 0.0f, 20.0f);
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Size", "Size of element, use of components depends on element type.");
+ RNA_def_property_ui_text(prop, "Size X", "Size of element, use of components depends on element type.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
+
+ prop= RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "expy");
+ RNA_def_property_range(prop, 0.0f, 20.0f);
+ RNA_def_property_ui_text(prop, "Size Y", "Size of element, use of components depends on element type.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
+
+ prop= RNA_def_property(srna, "size_z", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "expz");
+ RNA_def_property_range(prop, 0.0f, 20.0f);
+ RNA_def_property_ui_text(prop, "Size Z", "Size of element, use of components depends on element type.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "s");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Stiffness", "Stiffness defines how much of the element to fill.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* flags */
prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_NEGATIVE);
RNA_def_property_ui_text(prop, "Negative", "Set metaball as negative one.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_HIDE);
RNA_def_property_ui_text(prop, "Hide", "Hide element.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
}
-void rna_def_metaball(BlenderRNA *brna)
+static void rna_def_metaball(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem prop_update_items[] = {
{MB_UPDATE_ALWAYS, "UPDATE_ALWAYS", 0, "Always", "While editing, update metaball always."},
- {MB_UPDATE_HALFRES, "HALFRES", 0, "Half Resolution", "While editing, update metaball in half resolution."},
+ {MB_UPDATE_HALFRES, "HALFRES", 0, "Half", "While editing, update metaball in half resolution."},
{MB_UPDATE_FAST, "FAST", 0, "Fast", "While editing, update metaball without polygonization."},
{MB_UPDATE_NEVER, "NEVER", 0, "Never", "While editing, don't update metaball at all."},
{0, NULL, 0, NULL, NULL}};
@@ -120,29 +163,40 @@ void rna_def_metaball(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "MetaElement");
RNA_def_property_ui_text(prop, "Elements", "Meta elements.");
+ prop= RNA_def_property(srna, "active_element", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "lastelem");
+ RNA_def_property_ui_text(prop, "Last selected element.", "Last selected element.");
+
/* enums */
prop= RNA_def_property(srna, "flag", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_update_items);
RNA_def_property_ui_text(prop, "Update", "Metaball edit update behavior.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* number values */
- prop= RNA_def_property(srna, "wire_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "wire_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "wiresize");
RNA_def_property_range(prop, 0.050f, 1.0f);
RNA_def_property_ui_text(prop, "Wire Size", "Polygonization resolution in the 3D viewport.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
- prop= RNA_def_property(srna, "render_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "render_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "rendersize");
RNA_def_property_range(prop, 0.050f, 1.0f);
RNA_def_property_ui_text(prop, "Render Size", "Polygonization resolution in rendering.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "thresh");
RNA_def_property_range(prop, 0.0f, 5.0f);
RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements.");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* materials, textures */
rna_def_texmat_common(srna, "rna_Meta_texspace_editable");
+
+ /* anim */
+ rna_def_animdata_common(srna);
}
void RNA_def_meta(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 9b3ff6e74a0..480abff19cb 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -34,45 +34,52 @@
#include "DNA_armature_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_force.h"
#include "DNA_scene_types.h"
#include "BKE_bmesh.h" /* For BevelModifierData */
+#include "BKE_smoke.h" /* For smokeModifier_free & smokeModifier_createType */
+#include "WM_api.h"
#include "WM_types.h"
EnumPropertyItem modifier_type_items[] ={
- {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
+ {0, "", 0, "Generate", ""},
{eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, "Array", ""},
{eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, "Bevel", ""},
{eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, "Boolean", ""},
{eModifierType_Build, "BUILD", ICON_MOD_BUILD, "Build", ""},
+ {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""},
+ {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
+ {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
+ {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
+ {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
+ {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+ {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
+ {0, "", 0, "Deform", ""},
+ {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
{eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
- {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
- {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
{eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
- {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""},
{eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
- {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
- {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
- {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
{eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
{eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
- {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
{eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
- {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
- {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multires", ""},
- {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
- {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
{eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
{eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
{eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
- {eModifierType_Softbody, "SOFTBODY", ICON_MOD_SOFT, "Softbody", ""},
- {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subsurf", ""},
- {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
{eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
+ {0, "", 0, "Physics", ""},
+ {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
+ {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
+ {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
+ {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
+ {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
+ {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
+ {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
+ {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
+ {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
{0, NULL, 0, NULL, NULL}};
-
#ifdef RNA_RUNTIME
#include "BKE_context.h"
@@ -82,7 +89,7 @@ EnumPropertyItem modifier_type_items[] ={
static void rna_UVProject_projectors_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
UVProjectModifierData *uvp= (UVProjectModifierData*)ptr->data;
- rna_iterator_array_begin(iter, (void*)uvp->projectors, sizeof(Object*), 10, NULL);
+ rna_iterator_array_begin(iter, (void*)uvp->projectors, sizeof(Object*), uvp->num_projectors, 0, NULL);
}
static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
@@ -109,7 +116,7 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
case eModifierType_Hook:
return &RNA_HookModifier;
case eModifierType_Softbody:
- return &RNA_SoftbodyModifier;
+ return &RNA_SoftBodyModifier;
case eModifierType_Boolean:
return &RNA_BooleanModifier;
case eModifierType_Array:
@@ -148,6 +155,10 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_SimpleDeformModifier;
case eModifierType_Multires:
return &RNA_MultiresModifier;
+ case eModifierType_Surface:
+ return &RNA_SurfaceModifier;
+ case eModifierType_Smoke:
+ return &RNA_SmokeModifier;
default:
return &RNA_Modifier;
}
@@ -160,7 +171,8 @@ static char *rna_Modifier_path(PointerRNA *ptr)
static void rna_Modifier_update(bContext *C, PointerRNA *ptr)
{
- DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ptr->id.data);
}
static void rna_Modifier_dependency_update(bContext *C, PointerRNA *ptr)
@@ -169,6 +181,25 @@ static void rna_Modifier_dependency_update(bContext *C, PointerRNA *ptr)
DAG_scene_sort(CTX_data_scene(C));
}
+static void rna_Smoke_set_type(bContext *C, PointerRNA *ptr)
+{
+ SmokeModifierData *smd= (SmokeModifierData *)ptr->data;
+ Object *ob= (Object*)ptr->id.data;
+
+ // nothing changed
+ if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
+ return;
+
+ smokeModifier_free(smd); // XXX TODO: completely free all 3 pointers
+ smokeModifier_createType(smd); // create regarding of selected type
+
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
+ ob->dt = OB_WIRE;
+
+ // update dependancy since a domain - other type switch could have happened
+ rna_Modifier_dependency_update(C, ptr);
+}
+
static void rna_ExplodeModifier_vgroup_get(PointerRNA *ptr, char *value)
{
ExplodeModifierData *emd= (ExplodeModifierData*)ptr->data;
@@ -308,6 +339,11 @@ static void rna_CurveModifier_object_set(PointerRNA *ptr, PointerRNA value)
modifier_object_set(&((CurveModifierData*)ptr->data)->object, OB_CURVE, value);
}
+static void rna_CastModifier_object_set(PointerRNA *ptr, PointerRNA value)
+{
+ modifier_object_set(&((CastModifierData*)ptr->data)->object, OB_MESH, value);
+}
+
static void rna_ArmatureModifier_object_set(PointerRNA *ptr, PointerRNA value)
{
modifier_object_set(&((ArmatureModifierData*)ptr->data)->object, OB_ARMATURE, value);
@@ -348,6 +384,57 @@ static void rna_ArrayModifier_curve_set(PointerRNA *ptr, PointerRNA value)
modifier_object_set(&((ArrayModifierData*)ptr->data)->curve_ob, OB_CURVE, value);
}
+static int rna_MeshDeformModifier_is_bound_get(PointerRNA *ptr)
+{
+ return (((MeshDeformModifierData*)ptr->data)->bindcos != NULL);
+}
+
+static PointerRNA rna_SoftBodyModifier_settings_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return rna_pointer_inherit_refine(ptr, &RNA_SoftBodySettings, ob->soft);
+}
+
+static PointerRNA rna_SoftBodyModifier_point_cache_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return rna_pointer_inherit_refine(ptr, &RNA_PointCache, ob->soft->pointcache);
+}
+
+static PointerRNA rna_CollisionModifier_settings_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return rna_pointer_inherit_refine(ptr, &RNA_CollisionSettings, ob->pd);
+}
+
+static PointerRNA rna_UVProjector_object_get(PointerRNA *ptr)
+{
+ Object **ob= (Object**)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_Object, *ob);
+}
+
+static void rna_UVProjector_object_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object **ob= (Object**)ptr->data;
+
+ if(*ob)
+ id_us_min((ID*)*ob);
+ if(value.data)
+ id_us_plus((ID*)value.data);
+
+ *ob= value.data;
+}
+
+static void rna_UVProjectModifier_num_projectors_set(PointerRNA *ptr, int value)
+{
+ UVProjectModifierData *md= (UVProjectModifierData*)ptr->data;
+ int a;
+
+ md->num_projectors= CLAMPIS(value, 1, MOD_UVPROJECT_MAX);
+ for(a=md->num_projectors; a<MOD_UVPROJECT_MAX; a++)
+ md->projectors[a]= NULL;
+}
+
#else
static void rna_def_property_subdivision_common(StructRNA *srna, const char type[])
@@ -361,7 +448,7 @@ static void rna_def_property_subdivision_common(StructRNA *srna, const char type
RNA_def_property_enum_sdna(prop, NULL, type);
RNA_def_property_enum_items(prop, prop_subdivision_type_items);
RNA_def_property_ui_text(prop, "Subdivision Type", "Selects type of subdivision algorithm.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_subsurf(BlenderRNA *brna)
@@ -381,7 +468,7 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
RNA_def_property_range(prop, 1, 6);
RNA_def_property_ui_range(prop, 1, 6, 1, 0);
RNA_def_property_ui_text(prop, "Levels", "Number of subdivisions to perform.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "render_levels", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "renderLevels");
@@ -392,12 +479,12 @@ static void rna_def_modifier_subsurf(BlenderRNA *brna)
prop= RNA_def_property(srna, "optimal_draw", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_ControlEdges);
RNA_def_property_ui_text(prop, "Optimal Draw", "Skip drawing/rendering of interior subdivided edges");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "subsurf_uv", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", eSubsurfModifierFlag_SubsurfUv);
RNA_def_property_ui_text(prop, "Subsurf UV", "Use subsurf to subdivide UVs.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_multires(BlenderRNA *brna)
@@ -416,7 +503,7 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "lvl");
RNA_def_property_ui_text(prop, "Level", "");
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MultiresModifier_level_range");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_lattice(BlenderRNA *brna)
@@ -433,13 +520,13 @@ static void rna_def_modifier_lattice(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Lattice object to deform with.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_LatticeModifier_object_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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, "name");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_LatticeModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_curve(BlenderRNA *brna)
@@ -465,19 +552,19 @@ static void rna_def_modifier_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Curve object to deform with.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_CurveModifier_object_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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, "name");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CurveModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "deform_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "defaxis");
RNA_def_property_enum_items(prop, prop_deform_axis_items);
RNA_def_property_ui_text(prop, "Deform Axis", "The axis that the curve deforms along.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_build(BlenderRNA *brna)
@@ -490,24 +577,24 @@ static void rna_def_modifier_build(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "BuildModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_BUILD);
- prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 1, MAXFRAMEF);
+ prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start", "Specify the start frame of the effect.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_TIME);
RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Length", "Specify the total time the build effect requires");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "randomize", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Randomize", "Randomize the faces or edges during build.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Seed", "Specify the seed for random if used.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_mirror(BlenderRNA *brna)
@@ -523,50 +610,50 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_X);
RNA_def_property_ui_text(prop, "X", "Enable X axis mirror.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_Y);
RNA_def_property_ui_text(prop, "Y", "Enable Y axis mirror.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_AXIS_Z);
RNA_def_property_ui_text(prop, "Z", "Enable Z axis mirror.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "clip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_CLIPPING);
RNA_def_property_ui_text(prop, "Clip", "Prevents vertices from going through the mirror during transform.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "mirror_vertex_groups", PROP_BOOLEAN, PROP_NONE);
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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "mirror_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_U);
RNA_def_property_ui_text(prop, "Mirror U", "Mirror the U texture coordinate around the 0.5 point.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "mirror_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_V);
RNA_def_property_ui_text(prop, "Mirror V", "Mirror the V texture coordinate around the 0.5 point.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "merge_limit", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "tolerance");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Merge Limit", "Distance from axis within which mirrored vertices are merged.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "mirror_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "mirror_ob");
RNA_def_property_ui_text(prop, "Mirror Object", "Object to use as mirror.");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
}
static void rna_def_modifier_decimate(BlenderRNA *brna)
@@ -583,7 +670,7 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "percent");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Ratio", "Defines the ratio of triangles to reduce to.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "face_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "faceCount");
@@ -611,135 +698,135 @@ static void rna_def_modifier_wave(BlenderRNA *brna)
prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_X);
RNA_def_property_ui_text(prop, "X", "X axis motion.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_Y);
RNA_def_property_ui_text(prop, "Y", "Y axis motion.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_CYCL);
RNA_def_property_ui_text(prop, "Cyclic", "Cyclic wave effect.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM);
RNA_def_property_ui_text(prop, "Normals", "Dispace along normals.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "x_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_X);
RNA_def_property_ui_text(prop, "X Normal", "Enable displacement along the X normal");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_Y);
RNA_def_property_ui_text(prop, "Y Normal", "Enable displacement along the Y normal");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "z_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_WAVE_NORM_Z);
RNA_def_property_ui_text(prop, "Z Normal", "Enable displacement along the Z normal");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "timeoffs");
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Time Offset", "Either the starting frame (for positive speed) or ending frame (for negative speed.)");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Lifetime", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "damping_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "damping_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "damp");
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Damping Time", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "falloff_radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "falloff_radius", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "falloff");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 100, 100, 2);
RNA_def_property_ui_text(prop, "Falloff Radius", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "start_position_x", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_position_x", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "startx");
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -100, 100, 100, 2);
RNA_def_property_ui_text(prop, "Start Position X", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "start_position_y", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_position_y", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "starty");
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -100, 100, 100, 2);
RNA_def_property_ui_text(prop, "Start Position Y", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "start_position_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "objectcenter");
RNA_def_property_ui_text(prop, "Start Position Object", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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 for modulating the wave.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WaveModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Texture", "Texture for modulating the wave.");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texmapping");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used for modulating input.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
RNA_def_property_ui_text(prop, "UV Layer", "UV layer name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WaveModifier_uvlayer_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture_coordinates_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "map_object");
RNA_def_property_ui_text(prop, "Texture Coordinates Object", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
- RNA_def_property_ui_range(prop, -2, 2, 10, 2);
+ RNA_def_property_ui_range(prop, -1, 1, 10, 2);
RNA_def_property_ui_text(prop, "Speed", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -2, 2, 10, 2);
RNA_def_property_ui_text(prop, "Height", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 5, 10, 2);
RNA_def_property_ui_text(prop, "Width", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "narrowness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "narrow");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 10, 10, 2);
RNA_def_property_ui_text(prop, "Narrowness", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_armature(BlenderRNA *brna)
@@ -756,43 +843,43 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Armature object to deform with.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ArmatureModifier_object_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "invert", 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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "quaternion", 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_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "b_bone_rest", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_B_BONE_REST);
RNA_def_property_ui_text(prop, "B-Bone Rest", "Make B-Bones deform already in rest position");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_hook(BlenderRNA *brna)
@@ -805,37 +892,55 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "HookModifierData");
RNA_def_struct_ui_icon(srna, ICON_HOOK);
- prop= RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 100, 100, 2);
RNA_def_property_ui_text(prop, "Falloff", "If not zero, the distance from the hook where influence ends.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Force", "Relative force of the hook.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Parent Object for hook, also recalculates and clears offset");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "subtarget");
+ RNA_def_property_ui_text(prop, "Sub-Target", "Name of Parent Bone for hook (if applicable), also recalculates and clears offset");
+ 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, "name");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_HookModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_softbody(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
- srna= RNA_def_struct(brna, "SoftbodyModifier", "Modifier");
- RNA_def_struct_ui_text(srna, "Softbody Modifier", "Softbody simulation modifier.");
+ srna= RNA_def_struct(brna, "SoftBodyModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Soft Body Modifier", "Soft body simulation modifier.");
RNA_def_struct_sdna(srna, "SoftbodyModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_SOFT);
+
+ prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "SoftBodySettings");
+ RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_settings_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Soft Body Settings", "");
+
+ prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "PointCache");
+ RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_point_cache_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Soft Body Point Cache", "");
}
static void rna_def_modifier_boolean(BlenderRNA *brna)
@@ -858,12 +963,12 @@ static void rna_def_modifier_boolean(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Mesh object to use for boolean operation.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_operation_items);
RNA_def_property_ui_text(prop, "Operation", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_array(BlenderRNA *brna)
@@ -886,90 +991,90 @@ static void rna_def_modifier_array(BlenderRNA *brna)
prop= RNA_def_property(srna, "fit_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_fit_type_items);
RNA_def_property_ui_text(prop, "Fit Type", "Array length calculation method.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "count", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, INT_MAX);
RNA_def_property_ui_range(prop, 1, 1000, 1, 0);
RNA_def_property_ui_text(prop, "Count", "Number of duplicates to make.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0, INT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Length", "Length to fit array within.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "curve_ob");
RNA_def_property_ui_text(prop, "Curve", "Curve object to fit array length to.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_curve_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
/* Offset parameters */
- prop= RNA_def_property(srna, "constant_offset", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "constant_offset", PROP_BOOLEAN, PROP_TRANSLATION);
RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_CONST);
RNA_def_property_ui_text(prop, "Constant Offset", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "constant_offset_displacement", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "constant_offset_displacement", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "offset");
RNA_def_property_ui_text(prop, "Constant Offset Displacement", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "relative_offset", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "relative_offset", PROP_BOOLEAN, PROP_TRANSLATION);
RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_RELATIVE);
RNA_def_property_ui_text(prop, "Relative Offset", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "relative_offset_displacement", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "relative_offset_displacement", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_ui_text(prop, "Relative Offset Displacement", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* Vertex merging parameters */
prop= RNA_def_property(srna, "merge_adjacent_vertices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_ARR_MERGE);
RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices in adjacent duplicates.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "merge_end_vertices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_ARR_MERGEFINAL);
RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices in first and last duplicates.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "merge_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "merge_distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "merge_dist");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 1, 1, 4);
RNA_def_property_ui_text(prop, "Merge Distance", "Limit below which to merge vertices.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* Offset object */
prop= RNA_def_property(srna, "add_offset_object", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_OBJ);
RNA_def_property_ui_text(prop, "Add Offset Object", "Add an object transformation to the total offset.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "offset_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "offset_ob");
RNA_def_property_ui_text(prop, "Offset Object", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
/* Caps */
prop= RNA_def_property(srna, "start_cap", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Start Cap", "Mesh object to use as a start cap.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_start_cap_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "end_cap", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "End Cap", "Mesh object to use as an end cap.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ArrayModifier_end_cap_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
}
static void rna_def_modifier_edgesplit(BlenderRNA *brna)
@@ -986,17 +1091,17 @@ static void rna_def_modifier_edgesplit(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 180);
RNA_def_property_ui_range(prop, 0, 180, 100, 2);
RNA_def_property_ui_text(prop, "Split Angle", "Angle above which to split edges.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_edge_angle", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_EDGESPLIT_FROMANGLE);
RNA_def_property_ui_text(prop, "Use Edge Angle", "Split edges with high angle between faces.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_sharp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_EDGESPLIT_FROMFLAG);
RNA_def_property_ui_text(prop, "Use Sharp Edges", "Split edges that are marked as sharp.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_displace(BlenderRNA *brna)
@@ -1028,47 +1133,47 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
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_DisplaceModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Texture", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "midlevel", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Midlevel", "Material value that gives no displacement.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -100, 100, 10, 2);
RNA_def_property_ui_text(prop, "Strength", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_direction_items);
RNA_def_property_ui_text(prop, "Direction", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texmapping");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
RNA_def_property_ui_text(prop, "UV Layer", "UV layer name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DisplaceModifier_uvlayer_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "texture_coordinate_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "map_object");
RNA_def_property_ui_text(prop, "Texture Coordinate Object", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
}
static void rna_def_modifier_uvproject(BlenderRNA *brna)
@@ -1077,7 +1182,7 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
PropertyRNA *prop;
srna= RNA_def_struct(brna, "UVProjectModifier", "Modifier");
- RNA_def_struct_ui_text(srna, "UVProject Modifier", "UV projection modifier to sets UVs from a projector.");
+ RNA_def_struct_ui_text(srna, "UV Project Modifier", "UV projection modifier to sets UVs from a projector.");
RNA_def_struct_sdna(srna, "UVProjectModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_UVPROJECT);
@@ -1085,36 +1190,51 @@ static void rna_def_modifier_uvproject(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
RNA_def_property_ui_text(prop, "UV Layer", "UV layer name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_UVProjectModifier_uvlayer_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "num_projectors", PROP_INT, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Number of Projectors", "Number of projectors to use.");
+ RNA_def_property_int_funcs(prop, NULL, "rna_UVProjectModifier_num_projectors_set", NULL);
+ RNA_def_property_range(prop, 1, MOD_UVPROJECT_MAX);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "projectors", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_collection_funcs(prop, "rna_UVProject_projectors_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_dereference_get", 0, 0, 0, 0, 0);
+ RNA_def_property_struct_type(prop, "UVProjector");
+ RNA_def_property_collection_funcs(prop, "rna_UVProject_projectors_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0, 0, 0);
RNA_def_property_ui_text(prop, "Projectors", "");
prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Image", "");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "horizontal_aspect_ratio", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "aspectx");
RNA_def_property_range(prop, 1, FLT_MAX);
RNA_def_property_ui_range(prop, 1, 1000, 100, 2);
RNA_def_property_ui_text(prop, "Horizontal Aspect Ratio", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "vertical_aspect_ratio", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "aspecty");
RNA_def_property_range(prop, 1, FLT_MAX);
RNA_def_property_ui_range(prop, 1, 1000, 100, 2);
RNA_def_property_ui_text(prop, "Vertical Aspect Ratio", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "override_image", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_UVPROJECT_OVERRIDEIMAGE);
RNA_def_property_ui_text(prop, "Override Image", "Override faces' current images with the given image.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ srna= RNA_def_struct(brna, "UVProjector", NULL);
+ RNA_def_struct_ui_text(srna, "UVProjector", "UV projector used by the UV project modifier.");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_pointer_funcs(prop, "rna_UVProjector_object_get", "rna_UVProjector_object_set", NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Object to use as projector transform.");
}
static void rna_def_modifier_smooth(BlenderRNA *brna)
@@ -1130,35 +1250,35 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_X);
RNA_def_property_ui_text(prop, "X", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_Y);
RNA_def_property_ui_text(prop, "Y", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SMOOTH_Z);
RNA_def_property_ui_text(prop, "Z", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -10, 10, 0.5, 2);
RNA_def_property_ui_text(prop, "Factor", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "repeat", PROP_INT, PROP_NONE);
RNA_def_property_ui_range(prop, 0, 30, 1, 0);
RNA_def_property_ui_text(prop, "Repeat", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SmoothModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_cast(BlenderRNA *brna)
@@ -1181,47 +1301,63 @@ static void rna_def_modifier_cast(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_cast_type_items);
RNA_def_property_ui_text(prop, "Cast Type", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Object", "Control object: if available, its location determines the center of the effect");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_CastModifier_object_set", NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_X);
RNA_def_property_ui_text(prop, "X", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_Y);
RNA_def_property_ui_text(prop, "Y", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_Z);
RNA_def_property_ui_text(prop, "Z", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "from_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_SIZE_FROM_RADIUS);
+ RNA_def_property_ui_text(prop, "From Radius", "Use radius as size of projection shape (0 = auto)");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_transform", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_USE_OB_TRANSFORM);
+ RNA_def_property_ui_text(prop, "Use transform", "Use object transform to control projection shape");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -10, 10, 5, 2);
RNA_def_property_ui_text(prop, "Factor", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 100, 10, 2);
RNA_def_property_ui_text(prop, "Radius", "Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.)");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 100, 10, 2);
RNA_def_property_ui_text(prop, "Size", "Size of projection shape (leave as 0 for auto.)");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CastModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_meshdeform(BlenderRNA *brna)
@@ -1238,29 +1374,34 @@ static void rna_def_modifier_meshdeform(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Object", "Mesh object to deform with.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_MeshDeformModifier_object_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
-
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop= RNA_def_property(srna, "is_bound", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_MeshDeformModifier_is_bound_get", NULL);
+ RNA_def_property_ui_text(prop, "Bound", "Whether geometry has been bound to control cage.");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_INVERT_VGROUP);
RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshDeformModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "precision", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gridsize");
RNA_def_property_range(prop, 2, 10);
RNA_def_property_ui_text(prop, "Precision", "The grid size for binding.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "dynamic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MDEF_DYNAMIC_BIND);
RNA_def_property_ui_text(prop, "Dynamic", "Recompute binding dynamically on top of other deformers (slower and more memory consuming.)");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -1279,6 +1420,13 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem particleinstance_axis[] = {
+ {0, "X", 0, "X", ""},
+ {1, "Y", 0, "Y", ""},
+ {2, "Z", 0, "Z", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
srna= RNA_def_struct(brna, "ParticleInstanceModifier", "Modifier");
RNA_def_struct_ui_text(srna, "ParticleInstance Modifier", "Particle system instancing modifier.");
RNA_def_struct_sdna(srna, "ParticleInstanceModifierData");
@@ -1288,43 +1436,71 @@ static void rna_def_modifier_particleinstance(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "ob");
RNA_def_property_ui_text(prop, "Object", "Object that has the particle system.");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "particle_system_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "psys");
RNA_def_property_range(prop, 1, 10);
RNA_def_property_ui_text(prop, "Particle System Number", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "axis");
+ RNA_def_property_enum_items(prop, particleinstance_axis);
+ RNA_def_property_ui_text(prop, "Axis", "Pole axis for rotation");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Parents);
RNA_def_property_ui_text(prop, "Normal", "Create instances from normal particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Children);
RNA_def_property_ui_text(prop, "Children", "Create instances from child particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "path", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Path);
RNA_def_property_ui_text(prop, "Path", "Create instances along particle paths.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Unborn);
RNA_def_property_ui_text(prop, "Unborn", "Show instances when particles are unborn.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "alive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Alive);
RNA_def_property_ui_text(prop, "Alive", "Show instances when particles are alive.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "dead", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_Dead);
RNA_def_property_ui_text(prop, "Dead", "Show instances when particles are dead.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "keep_shape", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_KeepShape);
+ RNA_def_property_ui_text(prop, "Keep Shape", "Don't stretch the object.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "size", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", eParticleInstanceFlag_UseSize);
+ RNA_def_property_ui_text(prop, "Size", "Use particle size to scale the instances.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "position");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Position", "Position along path.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "random_position", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "random_position");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_text(prop, "Random Position", "Randomize position along path.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_explode(BlenderRNA *brna)
@@ -1344,27 +1520,27 @@ static void rna_def_modifier_explode(BlenderRNA *brna)
prop= RNA_def_property(srna, "protect", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Protect", "Clean vertex group edges");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "split_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_EdgeSplit);
RNA_def_property_ui_text(prop, "Split Edges", "Split face edges for nicer shrapnel.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Unborn);
RNA_def_property_ui_text(prop, "Unborn", "Show mesh when particles are unborn.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "alive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Alive);
RNA_def_property_ui_text(prop, "Alive", "Show mesh when particles are alive.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "dead", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_Dead);
RNA_def_property_ui_text(prop, "Dead", "Show mesh when particles are dead.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_cloth(BlenderRNA *brna)
@@ -1377,18 +1553,57 @@ static void rna_def_modifier_cloth(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ClothModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_CLOTH);
- prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "sim_parms");
RNA_def_property_ui_text(prop, "Cloth Settings", "");
- prop= RNA_def_property(srna, "collision_settings", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "collision_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "coll_parms");
RNA_def_property_ui_text(prop, "Cloth Collision Settings", "");
- prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_ui_text(prop, "Point Cache", "");
}
+static void rna_def_modifier_smoke(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem prop_smoke_type_items[] = {
+ {0, "NONE", 0, "None", ""},
+ {MOD_SMOKE_TYPE_DOMAIN, "TYPE_DOMAIN", 0, "Domain", ""},
+ {MOD_SMOKE_TYPE_FLOW, "TYPE_FLOW", 0, "Flow", "Inflow/Outflow"},
+ {MOD_SMOKE_TYPE_COLL, "TYPE_COLL", 0, "Collision", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "SmokeModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Smoke Modifier", "Smoke simulation modifier.");
+ RNA_def_struct_sdna(srna, "SmokeModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_SMOKE);
+
+ prop= RNA_def_property(srna, "domain_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "domain");
+ RNA_def_property_ui_text(prop, "Domain Settings", "");
+
+ prop= RNA_def_property(srna, "flow_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "flow");
+ RNA_def_property_ui_text(prop, "Flow Settings", "");
+
+ prop= RNA_def_property(srna, "coll_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "coll");
+ RNA_def_property_ui_text(prop, "Collision Settings", "");
+
+ prop= RNA_def_property(srna, "smoke_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, prop_smoke_type_items);
+ RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_update(prop, 0, "rna_Smoke_set_type");
+}
+
static void rna_def_modifier_collision(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1398,12 +1613,12 @@ static void rna_def_modifier_collision(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Collision Modifier", "Collision modifier defining modifier stack position used for collision.");
RNA_def_struct_sdna(srna, "CollisionModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_PHYSICS);
-
- prop= RNA_def_property(srna, "absorption", PROP_INT, PROP_PERCENTAGE);
- RNA_def_property_int_sdna(prop, NULL, "absorption");
- RNA_def_property_ui_range(prop, 0, 100, 1, 2);
- RNA_def_property_ui_text(prop, "Absorption %", "How much of effector force gets lost during collision with this object (in percent).");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "CollisionSettings");
+ RNA_def_property_pointer_funcs(prop, "rna_CollisionModifier_settings_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Settings", "");
}
static void rna_def_modifier_bevel(BlenderRNA *brna)
@@ -1432,31 +1647,31 @@ static void rna_def_modifier_bevel(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_range(prop, 0, 0.5);
RNA_def_property_ui_text(prop, "Width", "Bevel value/amount.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "only_vertices", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", BME_BEVEL_VERT);
RNA_def_property_ui_text(prop, "Only Vertices", "Bevel verts/corners, not edges.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "limit_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "lim_flags");
RNA_def_property_enum_items(prop, prop_limit_method_items);
RNA_def_property_ui_text(prop, "Limit Method", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "edge_weight_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "e_flags");
RNA_def_property_enum_items(prop, prop_edge_weight_method_items);
RNA_def_property_ui_text(prop, "Edge Weight Method", "What edge weight to use for weighting a vertex.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bevel_angle");
RNA_def_property_range(prop, 0, 180);
RNA_def_property_ui_range(prop, 0, 180, 100, 2);
RNA_def_property_ui_text(prop, "Angle", "Angle above which to bevel edges.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
@@ -1479,80 +1694,80 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "shrinkType");
RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Mode", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "auxiliary_target", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "auxTarget");
RNA_def_property_ui_text(prop, "Auxiliary Target", "Additional mesh target to shrink to.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_auxiliary_target_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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, "vgroup_name");
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, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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_ui_text(prop, "Offset", "Distance to keep from the target.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS);
RNA_def_property_ui_text(prop, "X", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS);
RNA_def_property_ui_text(prop, "Y", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "projAxis", MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS);
RNA_def_property_ui_text(prop, "Z", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "subsurf_levels", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "subsurfLevels");
RNA_def_property_range(prop, 0, 6);
RNA_def_property_ui_range(prop, 0, 6, 1, 0);
RNA_def_property_ui_text(prop, "Subsurf Levels", "Number of subdivisions that must be performed before extracting vertices' positions and normals.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR);
RNA_def_property_ui_text(prop, "Negative", "Allow vertices to move in the negative direction of axis.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "positive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR);
RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "cull_front_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE);
RNA_def_property_ui_text(prop, "Cull Front Faces", "Stop vertices from projecting to a front face on the target.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "cull_back_faces", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
RNA_def_property_ui_text(prop, "Cull Back Faces", "Stop vertices from projecting to a back face on the target.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "keep_above_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE);
RNA_def_property_ui_text(prop, "Keep Above Surface", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_fluidsim(BlenderRNA *brna)
@@ -1565,7 +1780,8 @@ static void rna_def_modifier_fluidsim(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "FluidsimModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_FLUIDSIM);
- prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "fss");
RNA_def_property_ui_text(prop, "Settings", "Settings for how this object is used in the fluid simulation.");
}
@@ -1588,25 +1804,25 @@ static void rna_def_modifier_mask(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Mode", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "armature", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ob_arm");
RNA_def_property_ui_text(prop, "Armature", "Armature to use as source of bones to mask.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskModifier_armature_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ 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, "vgroup");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MaskModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "inverse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MASK_INV);
RNA_def_property_ui_text(prop, "Inverse", "Use vertices that are not part of region defined.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_simpledeform(BlenderRNA *brna)
@@ -1629,29 +1845,29 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Mode", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ 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, "vgroup_name");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SimpleDeformModifier_vgroup_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "origin", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Origin", "Origin of modifier space coordinates.");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "originOpts", MOD_SIMPLEDEFORM_ORIGIN_LOCAL);
RNA_def_property_ui_text(prop, "Relative", "Sets the origin of deform space to be relative to the object.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
RNA_def_property_ui_range(prop, -10, 10, 0.5, 2);
RNA_def_property_ui_text(prop, "Factor", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "limits", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "limit");
@@ -1659,19 +1875,28 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 5, 2);
RNA_def_property_ui_text(prop, "Limits", "Lower/Upper limits for deform.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "lock_x_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_X);
RNA_def_property_ui_text(prop, "Lock X Axis", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "lock_y_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_Y);
RNA_def_property_ui_text(prop, "Lock Y Axis", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
+static void rna_def_modifier_surface(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna= RNA_def_struct(brna, "SurfaceModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Surface Modifier", "Surface modifier defining modifier stack position used for surface fields.");
+ RNA_def_struct_sdna(srna, "SurfaceModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_PHYSICS);
+}
void RNA_def_modifier(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1700,21 +1925,24 @@ void RNA_def_modifier(BlenderRNA *brna)
prop= RNA_def_property(srna, "realtime", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Realtime);
RNA_def_property_ui_text(prop, "Realtime", "Realtime display of a modifier.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
prop= RNA_def_property(srna, "render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Render);
RNA_def_property_ui_text(prop, "Render", "Use modifier during rendering.");
+ RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
prop= RNA_def_property(srna, "editmode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Editmode);
RNA_def_property_ui_text(prop, "Editmode", "Use modifier while in the edit mode.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0);
prop= RNA_def_property(srna, "on_cage", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_OnCage);
RNA_def_property_ui_text(prop, "On Cage", "Enable direct editing of modifier control cage.");
- RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded);
@@ -1751,6 +1979,8 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_mask(brna);
rna_def_modifier_simpledeform(brna);
rna_def_modifier_multires(brna);
+ rna_def_modifier_surface(brna);
+ rna_def_modifier_smoke(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
new file mode 100644
index 00000000000..20d1a898303
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -0,0 +1,488 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation (2009), Joshua Leung
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_scene_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#ifdef RNA_RUNTIME
+
+#include <stdio.h>
+#include <math.h>
+
+/* needed for some of the validation stuff... */
+#include "BKE_animsys.h"
+#include "BKE_nla.h"
+
+/* temp constant defined for these funcs only... */
+#define NLASTRIP_MIN_LEN_THRESH 0.1f
+
+static void rna_NlaStrip_name_set(PointerRNA *ptr, const char *value)
+{
+ NlaStrip *data= (NlaStrip *)ptr->data;
+
+ /* copy the name first */
+ BLI_strncpy(data->name, value, sizeof(data->name));
+
+ /* validate if there's enough info to do so */
+ if (ptr->id.data) {
+ AnimData *adt= BKE_animdata_from_id(ptr->id.data);
+ BKE_nlastrip_validate_name(adt, data);
+ }
+}
+
+static char *rna_NlaStrip_path(PointerRNA *ptr)
+{
+ NlaStrip *strip= (NlaStrip *)ptr->data;
+ AnimData *adt= BKE_animdata_from_id(ptr->id.data);
+
+ /* if we're attached to AnimData, try to resolve path back to AnimData */
+ if (adt) {
+ NlaTrack *nlt;
+ NlaStrip *nls;
+
+ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+ for (nls = nlt->strips.first; nls; nls = nls->next) {
+ if (nls == strip) {
+ // XXX but if we animate like this, the control will never work...
+ return BLI_sprintfN("animation_data.nla_tracks[\"%s\"].strips[\"%s\"]", nlt->name, strip->name);
+ }
+ }
+ }
+ }
+
+ /* no path */
+ return "";
+}
+
+
+static void rna_NlaStrip_start_frame_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+
+ /* clamp value to lie within valid limits
+ * - cannot start past the end of the strip + some flexibility threshold
+ * - cannot start before the previous strip (if present) ends
+ * -> but if it was a transition, we could go up to the start of the strip + some flexibility threshold
+ * as long as we re-adjust the transition afterwards
+ * - minimum frame is -MAXFRAME so that we don't get clipping on frame 0
+ */
+ if (data->prev) {
+ if (data->prev->type == NLASTRIP_TYPE_TRANSITION) {
+ CLAMP(value, data->prev->start+NLASTRIP_MIN_LEN_THRESH, data->end-NLASTRIP_MIN_LEN_THRESH);
+
+ /* readjust the transition to stick to the endpoints of the action-clips */
+ data->prev->end= value;
+ }
+ else {
+ CLAMP(value, data->prev->end, data->end-NLASTRIP_MIN_LEN_THRESH);
+ }
+ }
+ else {
+ CLAMP(value, MINAFRAME, data->end);
+ }
+ data->start= value;
+}
+
+static void rna_NlaStrip_end_frame_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+
+ /* clamp value to lie within valid limits
+ * - must not have zero or negative length strip, so cannot start before the first frame
+ * + some minimum-strip-length threshold
+ * - cannot end later than the start of the next strip (if present)
+ * -> but if it was a transition, we could go up to the start of the end - some flexibility threshold
+ * as long as we re-adjust the transition afterwards
+ */
+ if (data->next) {
+ if (data->next->type == NLASTRIP_TYPE_TRANSITION) {
+ CLAMP(value, data->start+NLASTRIP_MIN_LEN_THRESH, data->next->end-NLASTRIP_MIN_LEN_THRESH);
+
+ /* readjust the transition to stick to the endpoints of the action-clips */
+ data->next->start= value;
+ }
+ else {
+ CLAMP(value, data->start+NLASTRIP_MIN_LEN_THRESH, data->next->start);
+ }
+ }
+ else {
+ CLAMP(value, data->start+NLASTRIP_MIN_LEN_THRESH, MAXFRAME);
+ }
+ data->end= value;
+
+
+ /* calculate the lengths the strip and its action (if applicable) */
+ if (data->type == NLASTRIP_TYPE_CLIP) {
+ float len, actlen;
+
+ len= data->end - data->start;
+ actlen= data->actend - data->actstart;
+ if (IS_EQ(actlen, 0.0f)) actlen= 1.0f;
+
+ /* now, adjust the 'scale' setting to reflect this (so that this change can be valid) */
+ data->scale= len / ((actlen) * data->repeat);
+ }
+}
+
+static void rna_NlaStrip_scale_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ float actlen, mapping;
+
+ /* set scale value */
+ CLAMP(value, 0.0001f, 1000.0f); /* NOTE: these need to be synced with the values in the property definition in rna_def_nlastrip() */
+ data->scale= value;
+
+ /* calculate existing factors */
+ actlen= data->actend - data->actstart;
+ if (IS_EQ(actlen, 0.0f)) actlen= 1.0f;
+ mapping= data->scale * data->repeat;
+
+ /* adjust endpoint of strip in response to this */
+ if (IS_EQ(mapping, 0.0f) == 0)
+ data->end = (actlen * mapping) + data->start;
+ else
+ printf("NlaStrip Set Scale Error (in RNA): Scale = %0.4f, Repeat = %0.4f \n", data->scale, data->repeat);
+}
+
+static void rna_NlaStrip_repeat_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ float actlen, mapping;
+
+ /* set scale value */
+ CLAMP(value, 0.01f, 1000.0f); /* NOTE: these need to be synced with the values in the property definition in rna_def_nlastrip() */
+ data->repeat= value;
+
+ /* calculate existing factors */
+ actlen= data->actend - data->actstart;
+ if (IS_EQ(actlen, 0.0f)) actlen= 1.0f;
+ mapping= data->scale * data->repeat;
+
+ /* adjust endpoint of strip in response to this */
+ if (IS_EQ(mapping, 0.0f) == 0)
+ data->end = (actlen * mapping) + data->start;
+ else
+ printf("NlaStrip Set Repeat Error (in RNA): Scale = %0.4f, Repeat = %0.4f \n", data->scale, data->repeat);
+}
+
+static void rna_NlaStrip_blend_in_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ float len;
+
+ /* blend-in is limited to the length of the strip, and also cannot overlap with blendout */
+ len= (data->end - data->start) - data->blendout;
+ CLAMP(value, 0, len);
+
+ data->blendin= value;
+}
+
+static void rna_NlaStrip_blend_out_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ float len;
+
+ /* blend-out is limited to the length of the strip */
+ len= (data->end - data->start);
+ CLAMP(value, 0, len);
+
+ /* it also cannot overlap with blendin */
+ if ((len - value) < data->blendin)
+ value= len - data->blendin;
+
+ data->blendout= value;
+}
+
+static void rna_NlaStrip_action_start_frame_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ CLAMP(value, MINAFRAME, data->actend);
+ data->actstart= value;
+}
+
+static void rna_NlaStrip_action_end_frame_set(PointerRNA *ptr, float value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+ CLAMP(value, data->actstart, MAXFRAME);
+ data->actend= value;
+}
+
+static void rna_NlaStrip_animated_influence_set(PointerRNA *ptr, int value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+
+ if (value) {
+ /* set the flag, then make sure a curve for this exists */
+ data->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
+ BKE_nlastrip_validate_fcurves(data);
+ }
+ else
+ data->flag &= ~NLASTRIP_FLAG_USR_INFLUENCE;
+}
+
+static void rna_NlaStrip_animated_time_set(PointerRNA *ptr, int value)
+{
+ NlaStrip *data= (NlaStrip*)ptr->data;
+
+ if (value) {
+ /* set the flag, then make sure a curve for this exists */
+ data->flag |= NLASTRIP_FLAG_USR_TIME;
+ BKE_nlastrip_validate_fcurves(data);
+ }
+ else
+ data->flag &= ~NLASTRIP_FLAG_USR_TIME;
+}
+
+#else
+
+/* enum defines exported for rna_animation.c */
+EnumPropertyItem nla_mode_blend_items[] = {
+ {NLASTRIP_MODE_REPLACE, "REPLACE", 0, "Replace", "Result strip replaces the accumulated results by amount specified by influence."},
+ {NLASTRIP_MODE_ADD, "ADD", 0, "Add", "Weighted result of strip is added to the accumlated results."},
+ {NLASTRIP_MODE_SUBTRACT, "SUBTRACT", 0, "Subtract", "Weighted result of strip is removed from the accumlated results."},
+ {NLASTRIP_MODE_MULTIPLY, "MULITPLY", 0, "Multiply", "Weighted result of strip is multiplied with the accumlated results."},
+ {0, NULL, 0, NULL, NULL}};
+EnumPropertyItem nla_mode_extend_items[] = {
+ {NLASTRIP_EXTEND_NOTHING, "NOTHING", 0, "Nothing", "Strip has no influence past its extents."},
+ {NLASTRIP_EXTEND_HOLD, "HOLD", 0, "Hold", "Hold the first frame if no previous strips in track, and always hold last frame."},
+ {NLASTRIP_EXTEND_HOLD_FORWARD, "HOLD_FORWARD", 0, "Hold Forward", "Only hold last frame."},
+ {0, NULL, 0, NULL, NULL}};
+
+static void rna_def_nlastrip(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* enum defs */
+ static EnumPropertyItem prop_type_items[] = {
+ {NLASTRIP_TYPE_CLIP, "CLIP", 0, "Action Clip", "NLA Strip references some Action."},
+ {NLASTRIP_TYPE_TRANSITION, "TRANSITION", 0, "Transition", "NLA Strip 'transitions' between adjacent strips."},
+ {NLASTRIP_TYPE_META, "META", 0, "Meta", "NLA Strip acts as a container for adjacent strips."},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* struct definition */
+ srna= RNA_def_struct(brna, "NlaStrip", NULL);
+ RNA_def_struct_ui_text(srna, "NLA Strip", "A container referencing an existing Action.");
+ RNA_def_struct_path_func(srna, "rna_NlaStrip_path");
+ RNA_def_struct_ui_icon(srna, ICON_NLA); // XXX
+
+ /* name property */
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ 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);
+
+ /* Enums */
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ 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.");
+
+ 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.");
+
+ prop= RNA_def_property(srna, "blending", 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.");
+
+ /* Strip extents */
+ prop= RNA_def_property(srna, "start_frame", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "start");
+ RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_start_frame_set", NULL);
+ RNA_def_property_ui_text(prop, "Start Frame", "");
+
+ prop= RNA_def_property(srna, "end_frame", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_end_frame_set", NULL);
+ RNA_def_property_ui_text(prop, "End Frame", "");
+
+ /* Blending */
+ prop= RNA_def_property(srna, "blend_in", PROP_FLOAT, PROP_NONE);
+ 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.");
+
+ 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", "");
+
+ prop= RNA_def_property(srna, "auto_blending", 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.");
+
+ /* 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.");
+
+ /* Action extents */
+ prop= RNA_def_property(srna, "action_start_frame", 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", "");
+
+ prop= RNA_def_property(srna, "action_end_frame", 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", "");
+
+ /* Action Reuse */
+ prop= RNA_def_property(srna, "repeat", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "repeat");
+ 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.");
+
+ 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.");
+
+ /* Strip's F-Curves */
+ prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "FCurve");
+ RNA_def_property_ui_text(prop, "F-Curves", "F-Curves for controlling the strip's influence and timing.");
+
+ /* Strip's F-Modifiers */
+ prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "FModifier");
+ RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting all the F-Curves in the referenced Action.");
+
+ /* Strip's Sub-Strips (for Meta-Strips) */
+ 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 that this strip acts as a container for (if it is of type Meta).");
+
+ /* Settings - Values necessary for evaluation */
+ 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.");
+
+ 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.");
+
+ // TODO: should the animated_influence/time settings be animatable themselves?
+ prop= RNA_def_property(srna, "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.");
+
+ prop= RNA_def_property(srna, "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.");
+
+ /* 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", NLASTRIP_FLAG_ACTIVE);
+ RNA_def_property_ui_text(prop, "Active", "NLA Strip is active.");
+
+ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_SELECT);
+ RNA_def_property_ui_text(prop, "Selected", "NLA Strip is selected.");
+
+ prop= RNA_def_property(srna, "muted", 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.");
+
+ prop= RNA_def_property(srna, "reversed", 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).");
+
+ // TODO:
+ // - sync length
+}
+
+static void rna_def_nlatrack(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "NlaTrack", NULL);
+ RNA_def_struct_ui_text(srna, "NLA Track", "A animation layer containing Actions referenced as NLA strips.");
+ RNA_def_struct_ui_icon(srna, ICON_NLA);
+
+ /* strips collection */
+ 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.");
+
+ /* 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);
+
+ /* 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.");
+
+ prop= RNA_def_property(srna, "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).");
+
+ prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SELECTED);
+ RNA_def_property_ui_text(prop, "Selected", "NLA Track is selected.");
+
+ prop= RNA_def_property(srna, "muted", 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.");
+
+ prop= RNA_def_property(srna, "locked", 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.");
+}
+
+/* --------- */
+
+void RNA_def_nla(BlenderRNA *brna)
+{
+ rna_def_nlatrack(brna);
+ rna_def_nlastrip(brna);
+}
+
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index b35b02b2063..ebd032bb0b1 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include <string.h>
+#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
@@ -37,9 +38,82 @@
#include "BKE_node.h"
#include "BKE_image.h"
+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", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
#ifdef RNA_RUNTIME
-StructRNA *rna_Node_refine(struct PointerRNA *ptr)
+#include "ED_node.h"
+
+static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
{
bNode *node = (bNode*)ptr->data;
@@ -57,6 +131,62 @@ StructRNA *rna_Node_refine(struct PointerRNA *ptr)
}
}
+static char *rna_Node_path(PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+ bNode *node= (bNode*)ptr->data;
+ int index = BLI_findindex(&ntree->nodes, node);
+
+ return BLI_sprintfN("nodes[%d]", index);
+}
+
+static void rna_Node_update(bContext *C, PointerRNA *ptr)
+{
+ bNode *node= (bNode*)ptr->data;
+
+ ED_node_changed_update(C, node);
+}
+
+static void rna_Node_update_name(bContext *C, PointerRNA *ptr)
+{
+ bNode *node= (bNode*)ptr->data;
+ const char *name;
+
+ if(node->id) {
+ BLI_strncpy(node->name, node->id->name+2, NODE_MAXSTR);
+ }
+ else {
+ switch(node->typeinfo->type) {
+ case SH_NODE_MIX_RGB:
+ case CMP_NODE_MIX_RGB:
+ case TEX_NODE_MIX_RGB:
+ if(RNA_enum_name(node_blend_type_items, node->custom1, &name))
+ BLI_strncpy(node->name, name, NODE_MAXSTR);
+ break;
+ case CMP_NODE_FILTER:
+ if(RNA_enum_name(node_filter_items, node->custom1, &name))
+ BLI_strncpy(node->name, name, NODE_MAXSTR);
+ break;
+ case CMP_NODE_FLIP:
+ if(RNA_enum_name(node_flip_items, node->custom1, &name))
+ BLI_strncpy(node->name, name, NODE_MAXSTR);
+ break;
+ case SH_NODE_MATH:
+ case CMP_NODE_MATH:
+ case TEX_NODE_MATH:
+ if(RNA_enum_name(node_math_items, node->custom1, &name))
+ BLI_strncpy(node->name, name, NODE_MAXSTR);
+ break;
+ case SH_NODE_VECT_MATH:
+ if(RNA_enum_name(node_vec_math_items, node->custom1, &name))
+ BLI_strncpy(node->name, name, NODE_MAXSTR);
+ break;
+ }
+ }
+
+ rna_Node_update(C, ptr);
+}
+
#else
#define MaxNodes 1000
@@ -174,53 +304,22 @@ static void def_math(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem 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}
- };
-
prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, items);
+ RNA_def_property_enum_items(prop, node_math_items);
RNA_def_property_ui_text(prop, "Operation", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
}
static void def_vector_math(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem 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}
- };
-
prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, items);
+ RNA_def_property_enum_items(prop, node_vec_math_items);
RNA_def_property_ui_text(prop, "Operation", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
}
static void def_rgb_curve(StructRNA *srna)
@@ -231,6 +330,7 @@ static void def_rgb_curve(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "storage");
RNA_def_property_struct_type(prop, "CurveMapping");
RNA_def_property_ui_text(prop, "Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_vector_curve(StructRNA *srna)
@@ -241,6 +341,7 @@ static void def_vector_curve(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "storage");
RNA_def_property_struct_type(prop, "CurveMapping");
RNA_def_property_ui_text(prop, "Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_time(StructRNA *srna)
@@ -251,59 +352,44 @@ static void def_time(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "storage");
RNA_def_property_struct_type(prop, "CurveMapping");
RNA_def_property_ui_text(prop, "Curve", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
RNA_def_property_ui_text(prop, "Start Frame", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom2");
RNA_def_property_ui_text(prop, "End Frame", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_val_to_rgb(StructRNA *srna)
{
- /*PropertyRNA *prop;*/
+ PropertyRNA *prop;
- /* TODO: uncomment when ColorBand is wrapped *//*
- prop = RNA_def_property(srna, "color_band", PROP_POINTER, PROP_NONE);
+ prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "storage");
- RNA_def_property_struct_type(prop, "ColorBand");
- RNA_def_property_ui_text(prop, "Color Band", "");*/
+ RNA_def_property_struct_type(prop, "ColorRamp");
+ RNA_def_property_ui_text(prop, "Color Ramp", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_mix_rgb(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem 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", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
prop = RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, blend_type_items);
+ RNA_def_property_enum_items(prop, node_blend_type_items);
RNA_def_property_ui_text(prop, "Blend Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
prop = RNA_def_property(srna, "alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
- RNA_def_property_ui_text(prop, "Diffuse", "Include alpha of second input in this operation");
+ RNA_def_property_ui_text(prop, "Alpha", "Include alpha of second input in this operation");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_texture(StructRNA *srna)
@@ -315,10 +401,12 @@ static void def_texture(StructRNA *srna)
RNA_def_property_struct_type(prop, "Texture");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Texture", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
prop = RNA_def_property(srna, "node_output", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
RNA_def_property_ui_text(prop, "Node Output", "For node-based textures, which output node to use");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
@@ -333,18 +421,22 @@ static void def_sh_material(StructRNA *srna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Material", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
prop = RNA_def_property(srna, "diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_DIFF);
RNA_def_property_ui_text(prop, "Diffuse", "Material Node outputs Diffuse");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "specular", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_SPEC);
RNA_def_property_ui_text(prop, "Specular", "Material Node outputs Specular");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "invert_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", SH_NODE_MAT_NEG);
RNA_def_property_ui_text(prop, "Invert Normal", "Material Node uses inverted normal");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_sh_mapping(StructRNA *srna)
@@ -355,6 +447,7 @@ static void def_sh_mapping(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "storage");
RNA_def_property_struct_type(prop, "TexMapping");
RNA_def_property_ui_text(prop, "Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_sh_geometry(StructRNA *srna)
@@ -366,10 +459,12 @@ static void def_sh_geometry(StructRNA *srna)
prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvname");
RNA_def_property_ui_text(prop, "UV Layer", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "color_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "colname");
RNA_def_property_ui_text(prop, "Vertex Color Layer", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
@@ -378,16 +473,45 @@ static void def_sh_geometry(StructRNA *srna)
static void def_cmp_alpha_over(StructRNA *srna)
{
PropertyRNA *prop;
-
+
+ // XXX: Tooltip
prop = RNA_def_property(srna, "convert_premul", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
- RNA_def_property_ui_text(prop, "convert_premul", "TODO: don't know what this is");
+ RNA_def_property_ui_text(prop, "Convert Premul", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
RNA_def_struct_sdna_from(srna, "NodeTwoFloats", "storage");
prop = RNA_def_property(srna, "premul", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "x");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Premul", "Mix Factor");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_cmp_hue_saturation(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeHueSat", "storage");
+
+ prop = RNA_def_property(srna, "hue", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "hue");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Hue", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "sat", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sat");
+ RNA_def_property_range(prop, 0.0f, 2.0f);
+ RNA_def_property_ui_text(prop, "Saturation", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "val", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "val");
+ RNA_def_property_range(prop, 0.0f, 2.0f);
+ RNA_def_property_ui_text(prop, "Value", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_blur(StructRNA *srna)
@@ -410,52 +534,72 @@ static void def_cmp_blur(StructRNA *srna)
prop = RNA_def_property(srna, "sizex", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizex");
+ RNA_def_property_range(prop, 0, 256);
RNA_def_property_ui_text(prop, "Size X", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "sizey", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizey");
+ RNA_def_property_range(prop, 0, 256);
RNA_def_property_ui_text(prop, "Size Y", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 1, 256);
RNA_def_property_ui_text(prop, "Samples", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "max_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "maxspeed");
+ RNA_def_property_range(prop, 1, 1024);
RNA_def_property_ui_text(prop, "Max Speed", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "min_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "minspeed");
+ RNA_def_property_range(prop, 1, 1024);
RNA_def_property_ui_text(prop, "Min Speed", "");
-
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+
prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "relative", 1);
RNA_def_property_ui_text(prop, "Relative", "");
+ RNA_def_property_update(prop, 0, "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, 0, "rna_Node_update");
prop = RNA_def_property(srna, "factor_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "percentx");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Relative Size X", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "factor_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "percenty");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Relative Size Y", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "filter_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "filtertype");
RNA_def_property_enum_items(prop, filter_type_items);
RNA_def_property_ui_text(prop, "Filter Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "bokeh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bokeh", 1);
RNA_def_property_ui_text(prop, "Bokeh", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "gamma", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gamma", 1);
RNA_def_property_ui_text(prop, "Gamma", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/*
TODO:
@@ -472,21 +616,11 @@ static void def_cmp_filter(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem type_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}
- };
-
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "filter_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, type_items);
- RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_enum_items(prop, node_filter_items);
+ RNA_def_property_ui_text(prop, "Filter Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
}
static void def_cmp_map_value(StructRNA *srna)
@@ -497,27 +631,41 @@ static void def_cmp_map_value(StructRNA *srna)
prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "loc");
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Offset", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "size");
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Size", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "use_min", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MIN);
RNA_def_property_ui_text(prop, "Use Minimum", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "use_max", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TEXMAP_CLIP_MAX);
RNA_def_property_ui_text(prop, "Use Maximum", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min");
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Minimum", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max");
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Maximum", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_vector_blur(StructRNA *srna)
@@ -529,22 +677,47 @@ static void def_cmp_vector_blur(StructRNA *srna)
prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "samples");
RNA_def_property_ui_text(prop, "Samples", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "min_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "minspeed");
RNA_def_property_ui_text(prop, "Min Speed", "Minimum speed for a pixel to be blurred; used to separate background from foreground");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "max_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "maxspeed");
- RNA_def_property_ui_text(prop, "Min Speed", "Maximum speed, or zero for none");
+ RNA_def_property_ui_text(prop, "Max Speed", "Maximum speed, or zero for none");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_ui_text(prop, "Blur Factor", "Scaling factor for motion vectors; actually 'shutter speed' in frames");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "curved", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "curved", 1);
RNA_def_property_ui_text(prop, "Curved", "Interpolate between frames in a bezier curve, rather than linearly");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_cmp_levels(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ static EnumPropertyItem space_items[] = {
+ {1, "COMNINED_RGB", 0, "C", "Combined RGB"},
+ {2, "RED", 0, "R", "Red Channel"},
+ {3, "GREEN", 0, "G", "Green Channel"},
+ {4, "BLUE", 0, "B", "Blue Channel"},
+ {5, "LUMINANCE", 0, "L", "Luminance Channel"},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ prop = RNA_def_property(srna, "color_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_items(prop, space_items);
+ RNA_def_property_ui_text(prop, "Color Space", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_image(StructRNA *srna)
@@ -564,6 +737,7 @@ static void def_cmp_image(StructRNA *srna)
RNA_def_property_struct_type(prop, "Image");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
RNA_def_struct_sdna_from(srna, "ImageUser", "storage");
@@ -571,23 +745,31 @@ static void def_cmp_image(StructRNA *srna)
prop = RNA_def_property(srna, "frames", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "frames");
+ RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Frames", "Number of images used in animation");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sfra");
+ RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start Frame", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "offset", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cycl", 1);
RNA_def_property_ui_text(prop, "Cyclic", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
RNA_def_property_ui_text(prop, "Auto-Refresh", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* } */
@@ -595,7 +777,9 @@ static void def_cmp_image(StructRNA *srna)
prop = RNA_def_property(srna, "layer", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "layer");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Layer", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* } */
@@ -612,16 +796,19 @@ static void def_cmp_render_layers(StructRNA *srna)
RNA_def_property_struct_type(prop, "Scene");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Scene", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
/* TODO: layers in menu */
prop = RNA_def_property(srna, "layer", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
RNA_def_property_ui_text(prop, "Layer", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO: comments indicate this might be a hack */
prop = RNA_def_property(srna, "re_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Re-render", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_output_file(StructRNA *srna)
@@ -653,14 +840,14 @@ static void def_cmp_output_file(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeImageFile", "storage");
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ prop = RNA_def_property(srna, "filename", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_ui_text(prop, "Filename", "");
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "image_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "imtype");
RNA_def_property_enum_items(prop, type_items);
- RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_ui_text(prop, "Image Type", "");
/* TODO: openexr only { */
@@ -683,11 +870,15 @@ static void def_cmp_output_file(StructRNA *srna)
prop = RNA_def_property(srna, "start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sfra");
+ RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start Frame", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "efra");
+ RNA_def_property_range(prop, 1, MAXFRAMEF);
RNA_def_property_ui_text(prop, "End Frame", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_dilate_erode(StructRNA *srna)
@@ -696,7 +887,9 @@ static void def_cmp_dilate_erode(StructRNA *srna)
prop = RNA_def_property(srna, "distance", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom2");
+ RNA_def_property_range(prop, -100, 100);
RNA_def_property_ui_text(prop, "Distance", "Distance to grow/shrink (number of iterations)");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_scale(StructRNA *srna)
@@ -714,44 +907,76 @@ static void def_cmp_scale(StructRNA *srna)
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, space_items);
RNA_def_property_ui_text(prop, "Space", "Coordinate space to scale relative to");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_diff_matte(StructRNA *srna)
{
PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
+
+ /* TODO: nicer wrapping for tolerances */
- static EnumPropertyItem color_space_items[] = {
- {1, "RGB", 0, "RGB", ""},
- {2, "HSV", 0, "HSV", ""},
- {3, "YUV", 0, "YUV", ""},
- {4, "YCC", 0, "YCbCr", ""},
- {0, NULL, 0, NULL, NULL}
- };
+ prop = RNA_def_property(srna, "tolerance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Tolerance", "Color distances below this threshold are keyed.");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
- prop = RNA_def_property(srna, "color_space", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, color_space_items);
- RNA_def_property_ui_text(prop, "Color Space", "");
+ prop = RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "t2");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Falloff", "Color distances below this additional threshold are partially keyed.");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_cmp_color_matte(StructRNA *srna)
+{
+ PropertyRNA *prop;
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
/* TODO: nicer wrapping for tolerances */
- prop = RNA_def_property(srna, "tolerance1", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "h", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
- RNA_def_property_ui_text(prop, "Channel 1 Tolerance", "");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "H", "Hue tolerance for colors to be considered a keying color");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
- prop = RNA_def_property(srna, "tolerance2", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "s", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
- RNA_def_property_ui_text(prop, "Channel 2 Tolerance", "");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "S", "Saturation Tolerance for the color");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
- prop = RNA_def_property(srna, "tolerance3", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "v", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t3");
- RNA_def_property_ui_text(prop, "Channel 3 Tolerance", "");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "V", "Value Tolerance for the color");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_cmp_distance_matte(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
+
+ /* TODO: nicer wrapping for tolerances */
+
+ prop = RNA_def_property(srna, "tolerance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Tolerance", "Color distances below this threshold are keyed.");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "fstrength");
- RNA_def_property_ui_text(prop, "Falloff", "");
+ RNA_def_property_float_sdna(prop, NULL, "t2");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Falloff", "Color distances below this additional threshold are partially keyed.");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_color_spill(StructRNA *srna)
@@ -759,9 +984,9 @@ static void def_cmp_color_spill(StructRNA *srna)
PropertyRNA *prop;
static EnumPropertyItem channel_items[] = {
- {1, "R", 0, "Red", ""},
- {2, "G", 0, "Green", ""},
- {3, "B", 0, "Blue", ""},
+ {1, "R", 0, "R", "Red Spill Suppression"},
+ {2, "G", 0, "G", "Green Spill Suppression"},
+ {3, "B", 0, "B", "Blue Spill Suppression"},
{0, NULL, 0, NULL, NULL}
};
@@ -769,15 +994,18 @@ static void def_cmp_color_spill(StructRNA *srna)
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, channel_items);
RNA_def_property_ui_text(prop, "Channel", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 0.0f, 0.5f);
RNA_def_property_ui_text(prop, "Amount", "How much the selected channel is affected by");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
-static void def_cmp_chroma(StructRNA *srna)
+static void def_cmp_chroma_matte(StructRNA *srna)
{
PropertyRNA *prop;
@@ -785,23 +1013,33 @@ static void def_cmp_chroma(StructRNA *srna)
prop = RNA_def_property(srna, "acceptance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 1.0f, 80.0f);
RNA_def_property_ui_text(prop, "Acceptance", "Tolerance for a color to be considered a keying color");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "cutoff", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
+ RNA_def_property_range(prop, 0.0f, 30.0f);
RNA_def_property_ui_text(prop, "Cutoff", "Tolerance below which colors will be considered as exact matches");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "lift", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fsize");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Lift", "Alpha lift");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "gain", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fstrength");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Gain", "Alpha gain");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "shadow_adjust", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t3");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Shadow Adjust", "Adjusts the brightness of any shadows captured");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO:
if(c->t2 > c->t1)
@@ -825,21 +1063,27 @@ static void def_cmp_channel_matte(StructRNA *srna)
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, color_space_items);
RNA_def_property_ui_text(prop, "Color Space", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO: channel must be 1, 2 or 3 */
prop = RNA_def_property(srna, "channel", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom2");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
RNA_def_property_ui_text(prop, "Channel", "");
RNA_def_struct_sdna_from(srna, "NodeChroma", "storage");
prop = RNA_def_property(srna, "high", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "High", "Values higher than this setting are 100% opaque");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "low", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Low", "Values lower than this setting are 100% keyed");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO:
if(c->t2 > c->t1)
@@ -851,17 +1095,11 @@ static void def_cmp_flip(StructRNA *srna)
{
PropertyRNA *prop;
- static EnumPropertyItem axis_items[] = {
- {0, "X", 0, "X", ""},
- {1, "Y", 0, "Y", ""},
- {2, "XY", 0, "X & Y", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, axis_items);
+ RNA_def_property_enum_items(prop, node_flip_items);
RNA_def_property_ui_text(prop, "Axis", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update_name");
}
static void def_cmp_splitviewer(StructRNA *srna)
@@ -878,11 +1116,13 @@ static void def_cmp_splitviewer(StructRNA *srna)
RNA_def_property_enum_sdna(prop, NULL, "custom2");
RNA_def_property_enum_items(prop, axis_items);
RNA_def_property_ui_text(prop, "Axis", "");
-
- /* TODO: percentage */
- prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "custom1");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "factor", PROP_INT, PROP_FACTOR);
+ RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Factor", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_id_mask(StructRNA *srna)
@@ -891,17 +1131,20 @@ static void def_cmp_id_mask(StructRNA *srna)
prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Index", "Pass index number to convert to alpha");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_map_uv(StructRNA *srna)
{
PropertyRNA *prop;
-
- /* TODO: percentage */
- prop = RNA_def_property(srna, "alpha", PROP_INT, PROP_NONE);
+
+ prop = RNA_def_property(srna, "alpha", PROP_INT, PROP_FACTOR);
RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Alpha", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_defocus(StructRNA *srna)
@@ -925,44 +1168,60 @@ static void def_cmp_defocus(StructRNA *srna)
RNA_def_property_enum_sdna(prop, NULL, "bktype");
RNA_def_property_enum_items(prop, bokeh_items);
RNA_def_property_ui_text(prop, "Bokeh Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO: angle in degrees */
prop = RNA_def_property(srna, "angle", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rotation");
+ RNA_def_property_range(prop, 0, 90);
RNA_def_property_ui_text(prop, "Angle", "Bokeh shape rotation offset in degrees");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "gamma_correction", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gamco", 1);
RNA_def_property_ui_text(prop, "Gamma Correction", "Enable gamma correction before and after main process");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO */
prop = RNA_def_property(srna, "f_stop", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fstop");
+ RNA_def_property_range(prop, 0.0f, 128.0f);
RNA_def_property_ui_text(prop, "fStop", "Amount of focal blur, 128=infinity=perfect focus, half the value doubles the blur radius");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "max_blur", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxblur");
+ RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_ui_text(prop, "Max Blur", "blur limit, maximum CoC radius, 0=no limit");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bthresh");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Threshold", "CoC radius threshold, prevents background bleed on in-focus midground, 0=off");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "preview", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "preview", 1);
RNA_def_property_ui_text(prop, "Preview", "Enable sampling mode, useful for preview when using low samplecounts");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 16, 256);
RNA_def_property_ui_text(prop, "Samples", "Number of samples (16=grainy, higher=less noise)");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "use_zbuffer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "no_zbuf", 1);
RNA_def_property_ui_text(prop, "Use Z-Buffer", "Disable when using an image as input instead of actual zbuffer (auto enabled if node not image based, eg. time node)");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "z_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Z-Scale", "Scales the Z input when not using a zbuffer, controls maximum blur designated by the color white or input value 1");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_luma_matte(StructRNA *srna)
@@ -973,11 +1232,15 @@ static void def_cmp_luma_matte(StructRNA *srna)
prop = RNA_def_property(srna, "high", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t1");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "High", "Values higher than this setting are 100% opaque");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "low", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "t2");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Low", "Values lower than this setting are 100% keyed");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO: keep low less than high */
@@ -990,10 +1253,12 @@ static void def_cmp_invert(StructRNA *srna)
prop = RNA_def_property(srna, "rgb", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", CMP_CHAN_RGB);
RNA_def_property_ui_text(prop, "RGB", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "alpha", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", CMP_CHAN_A);
RNA_def_property_ui_text(prop, "Alpha", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_crop(StructRNA *srna)
@@ -1003,24 +1268,33 @@ static void def_cmp_crop(StructRNA *srna)
prop = RNA_def_property(srna, "crop_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
RNA_def_property_ui_text(prop, "Crop Image Size", "Whether to crop the size of the input image");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
RNA_def_struct_sdna_from(srna, "NodeTwoXYs", "storage");
prop = RNA_def_property(srna, "x1", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "x1");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "X1", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "x2", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "x2");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "X2", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "y1", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "y1");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Y1", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "y2", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "y2");
+ RNA_def_property_range(prop, 0, 10000);
RNA_def_property_ui_text(prop, "Y2", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_dblur(StructRNA *srna)
@@ -1031,35 +1305,50 @@ static void def_cmp_dblur(StructRNA *srna)
prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "iter");
+ RNA_def_property_range(prop, 1, 32);
RNA_def_property_ui_text(prop, "Iterations", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "wrap", 1);
RNA_def_property_ui_text(prop, "Wrap", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "center_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "center_x");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Center X", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "center_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "center_y");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Center Y", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "distance");
+ RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Distance", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "angle");
+ RNA_def_property_range(prop, 0.0f, 360.0f);
RNA_def_property_ui_text(prop, "Angle", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "spin", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spin");
+ RNA_def_property_range(prop, -360.0f, 360.0f);
RNA_def_property_ui_text(prop, "Spin", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "zoom", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "zoom");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Zoom", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_bilateral_blur(StructRNA *srna)
@@ -1070,16 +1359,21 @@ static void def_cmp_bilateral_blur(StructRNA *srna)
prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "iter");
+ RNA_def_property_range(prop, 1, 128);
RNA_def_property_ui_text(prop, "Iterations", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "sigma_color", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sigma_color");
+ RNA_def_property_range(prop, 0.01f, 3.0f);
RNA_def_property_ui_text(prop, "Color Sigma", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "sigma_space", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sigma_space");
- RNA_def_property_ui_text(prop, "Space Sigma", "");
-
+ RNA_def_property_range(prop, 0.01f, 30.0f);
+ RNA_def_property_ui_text(prop, "Space Sigma", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_premul_key(StructRNA *srna)
@@ -1092,10 +1386,11 @@ static void def_cmp_premul_key(StructRNA *srna)
{0, NULL, 0, NULL, NULL}
};
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
RNA_def_property_enum_items(prop, type_items);
- RNA_def_property_ui_text(prop, "Blend Type", "Conversion between premultiplied alpha and key alpha");
+ RNA_def_property_ui_text(prop, "Mapping", "Conversion between premultiplied alpha and key alpha");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
@@ -1111,60 +1406,79 @@ static void def_cmp_glare(StructRNA *srna)
{0, NULL, 0, NULL, NULL}
};
- /*static EnumPropertyItem quality_items[] = {
+ static EnumPropertyItem quality_items[] = {
{0, "HIGH", 0, "High", ""},
{1, "MEDIUM", 0, "Medium", ""},
{2, "LOW", 0, "Low", ""},
{0, NULL, 0, NULL, NULL}
- };*/
+ };
RNA_def_struct_sdna_from(srna, "NodeGlare", "storage");
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "glare_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, type_items);
- RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_ui_text(prop, "Glare Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "quality", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "quality");
- RNA_def_property_enum_items(prop, type_items);
+ RNA_def_property_enum_items(prop, quality_items);
RNA_def_property_ui_text(prop, "Quality", "If not set to high quality, the effect will be applied to a low-res copy of the source image");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "iter");
+ RNA_def_property_range(prop, 2, 5);
RNA_def_property_ui_text(prop, "Iterations", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "color_modulation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "colmod");
- RNA_def_property_ui_text(prop, "Color Modulation", "");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Color Modulation", "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "mix", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "mix");
+ RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Mix", "-1 is original image only, 0 is exact 50/50 mix, 1 is processed image only");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "threshold");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Threshold", "The glare filter will only be applied to pixels brighter than this value");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "streaks", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "angle");
+ RNA_def_property_range(prop, 2, 16);
RNA_def_property_ui_text(prop, "Streaks", "Total number of streaks");
+ RNA_def_property_update(prop, 0, "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);
RNA_def_property_ui_text(prop, "Angle Offset", "Streak angle offset in degrees");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "fade", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fade");
+ RNA_def_property_range(prop, 0.75f, 1.0f);
RNA_def_property_ui_text(prop, "Fade", "Streak fade-out factor");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "rotate_45", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "angle", 1);
RNA_def_property_ui_text(prop, "Rotate 45", "Simple star filter: add 45 degree rotation offset");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "size");
+ RNA_def_property_range(prop, 6, 9);
RNA_def_property_ui_text(prop, "Size", "Glow/glare size (not actual size; relative to initial size of bright area of pixels)");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
/* TODO */
}
@@ -1181,42 +1495,53 @@ static void def_cmp_tonemap(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "NodeTonemap", "storage");
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "tonemap_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, type_items);
- RNA_def_property_ui_text(prop, "Type", "");
-
- /* TODO: if type==0 { */
+ RNA_def_property_ui_text(prop, "Tonemap Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "key", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "key");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Key", "The value the average luminance is mapped to");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, 0.001f, 10.0f);
RNA_def_property_ui_text(prop, "Offset", "Normally always 1, but can be used as an extra control to alter the brightness curve");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "gamma");
+ RNA_def_property_range(prop, 0.001f, 3.0f);
RNA_def_property_ui_text(prop, "Gamma", "If not used, set to 1");
-
- /* TODO: } else { */
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f");
+ RNA_def_property_range(prop, -8.0f, 8.0f);
RNA_def_property_ui_text(prop, "Intensity", "If less than zero, darkens image; otherwise, makes it brighter");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "contrast", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "m");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Contrast", "Set to 0 to use estimate from input image");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "adaptation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "a");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Adaptation", "If 0, global; if 1, based on pixel intensity");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "c");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color Correction", "If 0, same for all channels; if 1, each independent");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_cmp_lensdist(StructRNA *srna)
@@ -1228,16 +1553,17 @@ static void def_cmp_lensdist(StructRNA *srna)
prop = RNA_def_property(srna, "projector", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "proj", 1);
RNA_def_property_ui_text(prop, "Projector", "Enable/disable projector mode. Effect is applied in horizontal direction only.");
-
- /* TODO: if proj mode is off { */
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "jitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "jit", 1);
RNA_def_property_ui_text(prop, "Jitter", "Enable/disable jittering; faster, but also noisier");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "fit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "fit", 1);
RNA_def_property_ui_text(prop, "Fit", "For positive distortion factor only: scale image such that black areas are not visible");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
@@ -1250,9 +1576,10 @@ static void def_tex_output(StructRNA *srna)
RNA_def_struct_sdna_from(srna, "TexNodeOutput", "storage");
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ prop = RNA_def_property(srna, "output_name", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_ui_text(prop, "Output Name", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_tex_image(StructRNA *srna)
@@ -1263,6 +1590,7 @@ static void def_tex_image(StructRNA *srna)
RNA_def_property_pointer_sdna(prop, NULL, "storage");
RNA_def_property_struct_type(prop, "ImageUser");
RNA_def_property_ui_text(prop, "Settings", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void def_tex_bricks(StructRNA *srna)
@@ -1271,19 +1599,27 @@ static void def_tex_bricks(StructRNA *srna)
prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "custom3");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Offset Amount", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "offset_frequency", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 2, 99);
RNA_def_property_ui_text(prop, "Offset Frequency", "Offset every N rows");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "squash", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "custom4");
+ RNA_def_property_range(prop, 0.0f, 99.0f);
RNA_def_property_ui_text(prop, "Squash Amount", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
prop = RNA_def_property(srna, "squash_frequency", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "custom2");
+ RNA_def_property_range(prop, 2, 99);
RNA_def_property_ui_text(prop, "Squash Frequency", "Squash every N rows");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
/* -------------------------------------------------------------------------- */
@@ -1353,8 +1689,9 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Node", "Node in a node tree.");
RNA_def_struct_sdna(srna, "bNode");
RNA_def_struct_refine_func(srna, "rna_Node_refine");
+ RNA_def_struct_path_func(srna, "rna_Node_path");
- prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop = RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "locx");
RNA_def_property_array(prop, 2);
RNA_def_property_range(prop, -10000.0f, 10000.0f);
@@ -1374,6 +1711,8 @@ static void rna_def_nodetree(BlenderRNA *brna)
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_NODE);
+
+ rna_def_animdata_common(srna);
prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index 47a7be163b1..69424649b3b 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -64,7 +64,7 @@ DefNode( CompositorNode, CMP_NODE_VECBLUR, def_cmp_vector_blur, "VECBL
DefNode( CompositorNode, CMP_NODE_SEPRGBA, 0, "SEPRGBA", SepRGBA, "Separate RGBA", "" )
DefNode( CompositorNode, CMP_NODE_SEPHSVA, 0, "SEPHSVA", SepHSVA, "Separate HSVA", "" )
DefNode( CompositorNode, CMP_NODE_SETALPHA, 0, "SETALPHA", SetAlpha, "Set Alpha", "" )
-DefNode( CompositorNode, CMP_NODE_HUE_SAT, 0, "HUE_SAT", HueSat, "Hue/Saturation", "" )
+DefNode( CompositorNode, CMP_NODE_HUE_SAT, def_cmp_hue_saturation, "HUE_SAT", HueSat, "Hue/Saturation", "" )
DefNode( CompositorNode, CMP_NODE_IMAGE, def_cmp_image, "IMAGE", Image, "Image", "" )
DefNode( CompositorNode, CMP_NODE_R_LAYERS, def_cmp_render_layers, "R_LAYERS", RLayers, "Render Layers", "" )
DefNode( CompositorNode, CMP_NODE_COMPOSITE, 0, "COMPOSITE", Composite, "Composite", "" )
@@ -82,7 +82,7 @@ DefNode( CompositorNode, CMP_NODE_SEPYUVA, 0, "SEPYU
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", "" )
DefNode( CompositorNode, CMP_NODE_COLOR_SPILL, def_cmp_color_spill, "COLOR_SPILL", ColorSpill, "Color Spill", "" )
-DefNode( CompositorNode, CMP_NODE_CHROMA, def_cmp_chroma, "CHROMA", Chroma, "Chroma Key", "" )
+DefNode( CompositorNode, CMP_NODE_CHROMA_MATTE, def_cmp_chroma_matte, "CHROMA_MATTE", ChromaMatte, "Chroma Key", "" )
DefNode( CompositorNode, CMP_NODE_CHANNEL_MATTE, def_cmp_channel_matte, "CHANNEL_MATTE", ChannelMatte, "Channel Key", "" )
DefNode( CompositorNode, CMP_NODE_FLIP, def_cmp_flip, "FLIP", Flip, "Flip", "" )
DefNode( CompositorNode, CMP_NODE_SPLITVIEWER, def_cmp_splitviewer, "SPLITVIEWER", SplitViewer, "Split Viewer", "" )
@@ -104,6 +104,9 @@ DefNode( CompositorNode, CMP_NODE_PREMULKEY, def_cmp_premul_key, "PREMU
DefNode( CompositorNode, CMP_NODE_GLARE, def_cmp_glare, "GLARE", Glare, "Glare", "" )
DefNode( CompositorNode, CMP_NODE_TONEMAP, def_cmp_tonemap, "TONEMAP", Tonemap, "Tonemap", "" )
DefNode( CompositorNode, CMP_NODE_LENSDIST, def_cmp_lensdist, "LENSDIST", Lensdist, "Lensdist", "" )
+DefNode( CompositorNode, CMP_NODE_VIEW_LEVELS, def_cmp_levels, "LEVELS", Levels, "Levels", "" )
+DefNode( CompositorNode, CMP_NODE_COLOR_MATTE, def_cmp_color_matte, "COLOR_MATTE", ColorMatte, "Color Matte", "" )
+DefNode( CompositorNode, CMP_NODE_DIST_MATTE, def_cmp_distance_matte, "DISTANCE_MATTE", DistanceMatte, "Distance Matte", "" )
DefNode( TextureNode, TEX_NODE_OUTPUT, def_tex_output, "OUTPUT", Output, "Output", "" )
DefNode( TextureNode, TEX_NODE_CHECKER, 0, "CHECKER", Checker, "Checker", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 3721c7d4ccb..76d9e077a18 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
@@ -33,38 +34,114 @@
#include "DNA_customdata_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 "WM_api.h"
#include "WM_types.h"
+EnumPropertyItem object_mode_items[] = {
+ {OB_MODE_OBJECT, "OBJECT", ICON_OBJECT_DATAMODE, "Object", ""},
+ {OB_MODE_EDIT, "EDIT", ICON_EDITMODE_HLT, "Edit", ""},
+ {OB_MODE_SCULPT, "SCULPT", ICON_SCULPTMODE_HLT, "Sculpt", ""},
+ {OB_MODE_VERTEX_PAINT, "VERTEX_PAINT", ICON_VPAINT_HLT, "Vertex Paint", ""},
+ {OB_MODE_WEIGHT_PAINT, "WEIGHT_PAINT", ICON_WPAINT_HLT, "Weight Paint", ""},
+ {OB_MODE_TEXTURE_PAINT, "TEXTURE_PAINT", ICON_TPAINT_HLT, "Texture Paint", ""},
+ {OB_MODE_PARTICLE_EDIT, "PARTICLE_EDIT", ICON_PARTICLEMODE, "Particle Edit", ""},
+ {OB_MODE_POSE, "POSE", ICON_POSE_HLT, "Pose", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static EnumPropertyItem parent_type_items[] = {
+ {PAROBJECT, "OBJECT", 0, "Object", ""},
+ {PARCURVE, "CURVE", 0, "Curve", ""},
+ {PARKEY, "KEY", 0, "Key", ""},
+ {PARSKEL, "ARMATURE", 0, "Armature", ""},
+ {PARSKEL, "LATTICE", 0, "Lattice", ""}, // PARSKEL reuse will give issues
+ {PARVERT1, "VERTEX", 0, "Vertex", ""},
+ {PARVERT3, "VERTEX_3", 0, "3 Vertices", ""},
+ {PARBONE, "BONE", 0, "Bone", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem object_type_items[] = {
+ {OB_MESH, "MESH", 0, "Mesh", ""},
+ {OB_CURVE, "CURVE", 0, "Curve", ""},
+ {OB_SURF, "SURFACE", 0, "Surface", ""},
+ {OB_MBALL, "META", 0, "Meta", ""},
+ {OB_FONT, "TEXT", 0, "Text", ""},
+ {0, "", 0, NULL, NULL},
+ {OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
+ {OB_LATTICE, "LATTICE", 0, "Lattice", ""},
+ {OB_EMPTY, "EMPTY", 0, "Empty", ""},
+ {0, "", 0, NULL, NULL},
+ {OB_CAMERA, "CAMERA", 0, "Camera", ""},
+ {OB_LAMP, "LAMP", 0, "Lamp", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
#ifdef RNA_RUNTIME
+#include "DNA_key_types.h"
+
#include "BKE_armature.h"
+#include "BKE_bullet.h"
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
+#include "BKE_effect.h"
+#include "BKE_key.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
+#include "BKE_scene.h"
-static void rna_Object_update(bContext *C, PointerRNA *ptr)
+#include "ED_object.h"
+
+void rna_Object_update(bContext *C, PointerRNA *ptr)
{
- DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_OB);
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
}
-static void rna_Object_update_data(bContext *C, PointerRNA *ptr)
+void rna_Object_matrix_update(bContext *C, PointerRNA *ptr)
{
- DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+ ED_object_apply_obmat(ptr->id.data);
+ rna_Object_update(C, ptr);
+}
+
+void rna_Object_update_data(bContext *C, PointerRNA *ptr)
+{
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ptr->id.data);
}
static void rna_Object_dependency_update(bContext *C, PointerRNA *ptr)
{
- DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_OB);
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
DAG_scene_sort(CTX_data_scene(C));
}
+static void rna_Object_layer_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ Scene *scene= CTX_data_scene(C);
+ Base *base;
+
+ base= object_in_scene(ob, scene);
+ if(!base)
+ return;
+
+ /* try to avoid scene sort */
+ if((ob->lay & scene->lay) && (base->lay & scene->lay))
+ base->lay= ob->lay;
+ else if((ob->lay & scene->lay)==0 && (base->lay & scene->lay)==0)
+ base->lay= ob->lay;
+ else {
+ base->lay= ob->lay;
+ DAG_scene_sort(scene);
+ }
+}
+
static int rna_Object_data_editable(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->data;
@@ -117,6 +194,72 @@ static StructRNA *rna_Object_data_typef(PointerRNA *ptr)
}
}
+static void rna_Object_parent_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object*)ptr->data;
+ Object *par= (Object*)value.data;
+
+ ED_object_parent(ob, par, ob->partype, ob->parsubstr);
+}
+
+static void rna_Object_parent_type_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->data;
+
+ ED_object_parent(ob, ob->parent, value, ob->parsubstr);
+}
+
+static void rna_Object_track_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object*)ptr->data;
+
+ if(ob != value.data)
+ ob->track= value.data;
+}
+
+static EnumPropertyItem *rna_Object_parent_type_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Object *ob= (Object*)ptr->data;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(C==NULL) {
+ return parent_type_items;
+ }
+
+ RNA_enum_items_add_value(&item, &totitem, parent_type_items, PAROBJECT);
+
+ if(ob->parent) {
+ Object *par= ob->parent;
+
+ if(par->type == OB_CURVE)
+ RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARCURVE);
+ else if(par->type == OB_LATTICE)
+ RNA_enum_items_add_value(&item, &totitem, &parent_type_items[4], PARSKEL); // special hack: prevents this overriding others
+ else if(par->type == OB_ARMATURE) {
+ RNA_enum_items_add_value(&item, &totitem, &parent_type_items[3], PARSKEL); // special hack: prevents this being overrided
+ RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE);
+ }
+ else if(par->type == OB_MESH) {
+ RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARVERT1);
+ RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARVERT3);
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+}
+
+static void rna_Object_parent_bone_set(PointerRNA *ptr, const char *value)
+{
+ Object *ob= (Object*)ptr->data;
+
+ ED_object_parent(ob, ob->parent, ob->partype, value);
+}
+
static int rna_VertexGroup_index_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -127,7 +270,28 @@ static int rna_VertexGroup_index_get(PointerRNA *ptr)
static PointerRNA rna_Object_active_vertex_group_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- return rna_pointer_inherit_refine(ptr, &RNA_VertexGroup, BLI_findlink(&ob->defbase, ob->actdef));
+ return rna_pointer_inherit_refine(ptr, &RNA_VertexGroup, BLI_findlink(&ob->defbase, ob->actdef-1));
+}
+
+static int rna_Object_active_vertex_group_index_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return MAX2(ob->actdef-1, 0);
+}
+
+static void rna_Object_active_vertex_group_index_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ ob->actdef= value+1;
+}
+
+static void rna_Object_active_vertex_group_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ *min= 0;
+ *max= BLI_countlist(&ob->defbase)-1;
+ *max= MAX2(0, *max);
}
void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index)
@@ -227,27 +391,60 @@ void rna_object_vcollayer_name_set(PointerRNA *ptr, const char *value, char *res
BLI_strncpy(result, "", maxlen);
}
+static int rna_Object_active_material_index_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return MAX2(ob->actcol-1, 0);
+}
+
+static void rna_Object_active_material_index_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ ob->actcol= value+1;
+}
+
static void rna_Object_active_material_index_range(PointerRNA *ptr, int *min, int *max)
{
Object *ob= (Object*)ptr->id.data;
- *min= 1;
- *max= ob->totcol;
+ *min= 0;
+ *max= MAX2(ob->totcol-1, 0);
}
static PointerRNA rna_Object_active_material_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- return rna_pointer_inherit_refine(ptr, &RNA_MaterialSlot, ob->mat+ob->actcol);
+ Material *ma;
+
+ ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL;
+ return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
}
-#if 0
static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
{
Object *ob= (Object*)ptr->id.data;
assign_material(ob, value.data, ob->actcol);
}
-#endif
+
+static void rna_Object_active_particle_system_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob= (Object*)ptr->id.data;
+ *min= 0;
+ *max= BLI_countlist(&ob->particlesystem)-1;
+ *max= MAX2(0, *max);
+}
+
+static int rna_Object_active_particle_system_index_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ return psys_get_current_num(ob);
+}
+
+static void rna_Object_active_particle_system_index_set(struct PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ psys_set_current_num(ob, value);
+}
static PointerRNA rna_MaterialSlot_material_get(PointerRNA *ptr)
{
@@ -272,7 +469,7 @@ static int rna_MaterialSlot_link_get(PointerRNA *ptr)
Object *ob= (Object*)ptr->id.data;
int index= (Material**)ptr->data - ob->mat;
- return (ob->colbits & (1<<index)) != 0;
+ return ob->matbits[index] != 0;
}
static void rna_MaterialSlot_link_set(PointerRNA *ptr, int value)
@@ -280,10 +477,14 @@ static void rna_MaterialSlot_link_set(PointerRNA *ptr, int value)
Object *ob= (Object*)ptr->id.data;
int index= (Material**)ptr->data - ob->mat;
- if(value)
+ if(value) {
+ ob->matbits[index]= 1;
ob->colbits |= (1<<index);
- else
+ }
+ else {
+ ob->matbits[index]= 0;
ob->colbits &= ~(1<<index);
+ }
}
static int rna_MaterialSlot_name_length(PointerRNA *ptr)
@@ -314,6 +515,86 @@ static void rna_MaterialSlot_name_get(PointerRNA *ptr, char *str)
strcpy(str, "");
}
+/* why does this have to be so complicated?, can't all this crap be
+ * moved to in BGE conversion function? - Campbell *
+ *
+ * logic from check_body_type()
+ * */
+static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ /* determine the body_type setting based on flags */
+ if (!(ob->gameflag & OB_COLLISION)) {
+ if (ob->gameflag & OB_OCCLUDER) {
+ ob->body_type = OB_BODY_TYPE_OCCLUDER;
+ } else {
+ ob->body_type = OB_BODY_TYPE_NO_COLLISION;
+ }
+ } else if (ob->gameflag & OB_SENSOR) {
+ ob->body_type = OB_BODY_TYPE_SENSOR;
+ } else if (!(ob->gameflag & OB_DYNAMIC)) {
+ ob->body_type = OB_BODY_TYPE_STATIC;
+ } else if (!(ob->gameflag & (OB_RIGID_BODY|OB_SOFT_BODY))) {
+ ob->body_type = OB_BODY_TYPE_DYNAMIC;
+ } else if (ob->gameflag & OB_RIGID_BODY) {
+ ob->body_type = OB_BODY_TYPE_RIGID;
+ } else {
+ ob->body_type = OB_BODY_TYPE_SOFT;
+ /* create the structure here because we display soft body buttons in the main panel */
+ if (!ob->bsoft)
+ ob->bsoft = bsbNew();
+ }
+
+ return ob->body_type;
+}
+
+static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ ob->body_type= value;
+
+ switch (ob->body_type) {
+ case OB_BODY_TYPE_SENSOR:
+ ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
+ 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);
+ break;
+ case OB_BODY_TYPE_OCCLUDER:
+ ob->gameflag |= OB_OCCLUDER;
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC);
+ break;
+ case OB_BODY_TYPE_NO_COLLISION:
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC);
+ break;
+ case OB_BODY_TYPE_STATIC:
+ ob->gameflag |= OB_COLLISION;
+ ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ break;
+ case OB_BODY_TYPE_DYNAMIC:
+ ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ break;
+ case OB_BODY_TYPE_RIGID:
+ ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
+ ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ break;
+ default:
+ case OB_BODY_TYPE_SOFT:
+ ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR);
+
+ /* assume triangle mesh, if no bounds chosen for soft body */
+ if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
+ {
+ ob->boundtype=OB_BOUND_POLYH;
+ }
+ /* create a BulletSoftBody structure if not already existing */
+ if (!ob->bsoft)
+ ob->bsoft = bsbNew();
+ break;
+ }
+}
+
static PointerRNA rna_Object_active_particle_system_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -364,6 +645,78 @@ static void rna_GameObjectSettings_state_set(PointerRNA *ptr, const int *values)
}
}
+static void rna_Object_active_shape_key_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob= (Object*)ptr->id.data;
+ Key *key= ob_get_key(ob);
+
+ *min= 0;
+ *max= (key)? BLI_countlist(&key->block)-1: 0;
+ *max= MAX2(0, *max);
+}
+
+static int rna_Object_active_shape_key_index_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ return MAX2(ob->shapenr-1, 0);
+}
+
+static void rna_Object_active_shape_key_index_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ ob->shapenr= value+1;
+ ob->shapeflag |= OB_SHAPE_TEMPLOCK;
+}
+
+static PointerRNA rna_Object_active_shape_key_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ Key *key= ob_get_key(ob);
+ KeyBlock *kb;
+ PointerRNA keyptr;
+
+ if(key==NULL)
+ return PointerRNA_NULL;
+
+ kb= BLI_findlink(&key->block, ob->shapenr-1);
+ RNA_pointer_create(&key->id, &RNA_ShapeKey, kb, &keyptr);
+ return keyptr;
+}
+
+static void rna_Object_shape_key_lock_set(PointerRNA *ptr, int value)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ if(value) ob->shapeflag |= OB_SHAPE_LOCK;
+ else ob->shapeflag &= ~OB_SHAPE_LOCK;
+
+ ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
+}
+
+static PointerRNA rna_Object_field_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ /* weak */
+ if(!ob->pd)
+ ob->pd= object_add_collision_fields();
+
+ return rna_pointer_inherit_refine(ptr, &RNA_FieldSettings, ob->pd);
+}
+
+static PointerRNA rna_Object_collision_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ /* weak */
+ if(!ob->pd)
+ ob->pd= object_add_collision_fields();
+
+ return rna_pointer_inherit_refine(ptr, &RNA_CollisionSettings, ob->pd);
+}
+
#else
static void rna_def_vertex_group(BlenderRNA *brna)
@@ -392,8 +745,8 @@ static void rna_def_material_slot(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem link_items[] = {
- {0, "DATA", 0, "Data", ""},
{1, "OBJECT", 0, "Object", ""},
+ {0, "DATA", 0, "Data", ""},
{0, NULL, 0, NULL, NULL}};
/* NOTE: there is no MaterialSlot equivalent in DNA, so the internal
@@ -430,11 +783,13 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem body_type_items[] = {
- {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", ""},
- {OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", ""},
- {OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", ""},
- {OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", ""},
- {OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", ""},
+ {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable colision for this object"},
+ {OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"},
+ {OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", "Linear physics"},
+ {OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", "Linear and angular physics"},
+ {OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", "Soft body"},
+ {OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, "Occlude", "Occluder for optimizing scene rendering"},
+ {OB_BODY_TYPE_SENSOR, "SENSOR", 0, "Sensor", "Collision Sensor, detects static and dynamic objects but not the other collision sensor objects"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem collision_bounds_items[] = {
@@ -442,8 +797,8 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
{OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", ""},
{OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", ""},
{OB_BOUND_CONE, "CONE", 0, "Cone", ""},
- {OB_BOUND_POLYH, "CONVEX_HULL", 0, "Convex Hull", ""},
- {OB_BOUND_POLYT, "TRIANGLE_MESH", 0, "Triangle Mesh", ""},
+ {OB_BOUND_POLYT, "CONVEX_HULL", 0, "Convex Hull", ""},
+ {OB_BOUND_POLYH, "TRIANGLE_MESH", 0, "Triangle Mesh", ""},
//{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""},
{0, NULL, 0, NULL, NULL}};
@@ -469,7 +824,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "prop", NULL);
- RNA_def_property_struct_type(prop, "GameProperty");
+ RNA_def_property_struct_type(prop, "GameProperty"); /* rna_property.c */
RNA_def_property_ui_text(prop, "Properties", "Game engine properties.");
prop= RNA_def_property(srna, "show_sensors", PROP_BOOLEAN, PROP_NONE);
@@ -489,7 +844,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "physics_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "body_type");
RNA_def_property_enum_items(prop, body_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); // this controls various gameflags
+ RNA_def_property_enum_funcs(prop, "rna_GameObjectSettings_physics_type_get", "rna_GameObjectSettings_physics_type_set", NULL);
RNA_def_property_ui_text(prop, "Physics Type", "Selects the type of physical representation.");
prop= RNA_def_property(srna, "actor", PROP_BOOLEAN, PROP_NONE);
@@ -504,10 +859,10 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0.01, 10000.0);
RNA_def_property_ui_text(prop, "Mass", "Mass of the object.");
- prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "inertia");
RNA_def_property_range(prop, 0.01, 10.0);
- RNA_def_property_ui_text(prop, "Radius", "Radius for Bounding sphere and Fh/Fh Rot.");
+ RNA_def_property_ui_text(prop, "Radius", "Radius of bounding sphere and material physics");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "no_sleeping", PROP_BOOLEAN, PROP_NONE);
@@ -567,13 +922,13 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lock Z Rotation Axis", "Disable simulation of angular motion along the Z axis.");
- prop= RNA_def_property(srna, "do_fh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "material_physics", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_DO_FH);
- RNA_def_property_ui_text(prop, "Do Fh", "Use Fh settings in materials.");
+ RNA_def_property_ui_text(prop, "Use Material Physics", "Use physics settings in materials.");
- prop= RNA_def_property(srna, "rotation_fh", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "rotate_from_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ROT_FH);
- RNA_def_property_ui_text(prop, "Rotation Fh", "Use face normal to rotate Object");
+ RNA_def_property_ui_text(prop, "Rotate From Normal", "Use face normal to rotate object, so that it points away from the surface");
prop= RNA_def_property(srna, "form_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "formfactor");
@@ -584,7 +939,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ANISOTROPIC_FRICTION);
RNA_def_property_ui_text(prop, "Anisotropic Friction", "Enable anisotropic friction.");
- prop= RNA_def_property(srna, "friction_coefficients", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "friction_coefficients", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "anisotropicFriction");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Friction Coefficients", "Relative friction coefficient in the in the X, Y and Z directions, when anisotropic friction is enabled.");
@@ -602,7 +957,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_CHILD);
RNA_def_property_ui_text(prop, "Collison Compound", "Add children to form a compound collision object.");
- prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "margin");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_ui_text(prop, "Collision Margin", "Extra margin around object for collision detection, small amount required for stability.");
@@ -634,17 +989,6 @@ static void rna_def_object(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem parent_type_items[] = {
- {PAROBJECT, "OBJECT", 0, "Object", ""},
- {PARCURVE, "CURVE", 0, "Curve", ""},
- //{PARKEY, "KEY", 0, "Key", ""},
- {PARSKEL, "ARMATURE", 0, "Armature", ""},
- {PARSKEL, "LATTICE", 0, "Lattice", ""}, // PARSKEL reuse will give issues
- {PARVERT1, "VERTEX", 0, "Vertex", ""},
- {PARVERT3, "VERTEX_3", 0, "3 Vertices", ""},
- {PARBONE, "BONE", 0, "Bone", ""},
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem object_type_items[] = {
{OB_EMPTY, "EMPTY", 0, "Empty", ""},
{OB_MESH, "MESH", 0, "Mesh", ""},
@@ -708,6 +1052,8 @@ static void rna_def_object(BlenderRNA *brna)
{OB_DUPLIGROUP, "GROUP", 0, "Group", "Enable group instancing."},
{0, NULL, 0, NULL, NULL}};
+ int matrix_dimsize[]= {4, 4};
+
srna= RNA_def_struct(brna, "Object", "ID");
RNA_def_struct_ui_text(srna, "Object", "Object datablock defining an object in a scene..");
RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
@@ -719,58 +1065,78 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_Object_data_editable");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Data", "Object data.");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update_data");
+ RNA_def_property_update(prop, 0, "rna_Object_update_data");
- prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, object_type_items);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Type", "Type of Object.");
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, object_mode_items);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Mode", "Object interaction mode.");
+
+ prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_ui_text(prop, "Layers", "Layers the object is on.");
RNA_def_property_boolean_funcs(prop, NULL, "rna_Object_layer_set");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_layer_update");
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Selected", "Object selection state.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* parent and track */
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_parent_set", NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent", "Parent Object");
-
- prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "type");
- RNA_def_property_enum_items(prop, object_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Type", "Type of Object.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
prop= RNA_def_property(srna, "parent_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "partype");
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "partype");
RNA_def_property_enum_items(prop, parent_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Object_parent_type_set", "rna_Object_parent_type_itemf");
RNA_def_property_ui_text(prop, "Parent Type", "Type of parent relation.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
prop= RNA_def_property(srna, "parent_vertices", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "par1");
RNA_def_property_array(prop, 3);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent Vertices", "Indices of vertices in cases of a vertex parenting relation.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
prop= RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "parsubstr");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Object_parent_bone_set");
RNA_def_property_ui_text(prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
prop= RNA_def_property(srna, "track", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_track_set", NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Track", "Object being tracked to define the rotation (Old Track).");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
prop= RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "trackflag");
RNA_def_property_enum_items(prop, track_items);
RNA_def_property_ui_text(prop, "Track Axis", "Tracking axis pointing to the another object.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
prop= RNA_def_property(srna, "up_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "upflag");
RNA_def_property_enum_items(prop, up_items);
RNA_def_property_ui_text(prop, "Up Axis", "Specify the axis that points up.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
/* proxy */
@@ -788,58 +1154,61 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Materials", "Material slots in the object.");
prop= RNA_def_property(srna, "active_material", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "MaterialSlot");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", NULL, NULL);
+ RNA_def_property_struct_type(prop, "Material");
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", 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_SHADING, "rna_Object_update");
prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "actcol");
- RNA_def_property_int_funcs(prop, NULL, NULL, "rna_Object_active_material_index_range");
+ 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_SHADING, NULL);
+
/* transform */
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Location", "Location of the object.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "delta_location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "delta_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "dloc");
RNA_def_property_ui_text(prop, "Delta Location", "Extra added translation to object location.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_ui_text(prop, "Rotation", "Rotation of the object.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "delta_rotation", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "delta_rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "drot");
RNA_def_property_ui_text(prop, "Delta Rotation", "Extra added rotation to the rotation of the object.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Scale", "Scaling of the object.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "dsize");
RNA_def_property_ui_text(prop, "Delta Scale", "Extra added scaling to the scale of the object.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface.");
- prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface.");
- prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface.");
@@ -847,8 +1216,9 @@ static void rna_def_object(BlenderRNA *brna)
/* matrix */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "obmat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_ui_text(prop, "Matrix", "Transformation matrix.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_update");
/* collections */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
@@ -861,7 +1231,8 @@ static void rna_def_object(BlenderRNA *brna)
/* game engine */
- prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "GameObjectSettings");
RNA_def_property_pointer_funcs(prop, "rna_Object_game_settings_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Game Settings", "Game engine related settings for the object.");
@@ -875,8 +1246,15 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "active_vertex_group", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "VertexGroup");
- RNA_def_property_pointer_funcs(prop, "rna_Object_active_vertex_group_get", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_vertex_group_get", "rna_Object_active_vertex_group_set", NULL);
RNA_def_property_ui_text(prop, "Active Vertex Group", "Vertex groups of the object.");
+ RNA_def_property_update(prop, 0, "rna_Object_update_data");
+
+ prop= RNA_def_property(srna, "active_vertex_group_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "actdef");
+ RNA_def_property_int_funcs(prop, "rna_Object_active_vertex_group_index_get", "rna_Object_active_vertex_group_index_set", "rna_Object_active_vertex_group_index_range");
+ RNA_def_property_ui_text(prop, "Active Vertex Group Index", "Active index in vertex group array.");
+ RNA_def_property_update(prop, 0, "rna_Object_update_data");
/* empty */
@@ -886,7 +1264,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Empty Draw Type", "Viewport display style for empties.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "empty_draw_size", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "empty_draw_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "empty_drawsize");
RNA_def_property_range(prop, 0.01, 10.0);
RNA_def_property_ui_text(prop, "Empty Draw Size", "Size of of display for empties in the viewport.");
@@ -901,17 +1279,20 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "col");
RNA_def_property_ui_text(prop, "Color", "Object color and alpha, used when faces have the ObColor mode enabled.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* physics */
prop= RNA_def_property(srna, "field", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "FieldSettings");
+ RNA_def_property_pointer_funcs(prop, "rna_Object_field_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Field Settings", "Settings for using the objects as a field in physics simulation.");
prop= RNA_def_property(srna, "collision", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pd");
RNA_def_property_struct_type(prop, "CollisionSettings");
+ RNA_def_property_pointer_funcs(prop, "rna_Object_collision_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Collision Settings", "Settings for using the objects as a collider in physics simulation.");
prop= RNA_def_property(srna, "soft_body", PROP_POINTER, PROP_NONE);
@@ -927,6 +1308,12 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ParticleSystem");
RNA_def_property_pointer_funcs(prop, "rna_Object_active_particle_system_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Active Particle System", "Active particle system being displayed");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "active_particle_system_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Object_active_particle_system_index_get", "rna_Object_active_particle_system_index_set", "rna_Object_active_particle_system_index_range");
+ RNA_def_property_ui_text(prop, "Active Particle System Index", "Index of active particle system slot.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* restrict */
@@ -938,10 +1325,12 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "restrict_select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_SELECT);
RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "restrict_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", OB_RESTRICT_RENDER);
RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* anim */
@@ -951,19 +1340,22 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_DRAWKEY);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // update ipo flag indirect
RNA_def_property_ui_text(prop, "Draw Keys", "Draw object as key positions.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
prop= RNA_def_property(srna, "draw_keys_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ipoflag", OB_DRAWKEYSEL);
RNA_def_property_ui_text(prop, "Draw Keys Selected", "Limit the drawing of object keys to selected.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "track_rotation", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "track_override_parent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transflag", OB_POWERTRACK);
- RNA_def_property_ui_text(prop, "Track Rotation", "Switch object rotation of in tracking.");
+ RNA_def_property_ui_text(prop, "Track Override Parent", "Override rotation from parenting.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
prop= RNA_def_property(srna, "slow_parent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "partype", PARSLOW);
RNA_def_property_ui_text(prop, "Slow Parent", "Create a delay in the parent relationship.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
prop= RNA_def_property(srna, "dupli_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "transflag");
@@ -998,25 +1390,25 @@ static void rna_def_object(BlenderRNA *brna)
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");
- prop= RNA_def_property(srna, "dupli_frames_start", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "dupli_frames_start", PROP_INT, PROP_NONE|PROP_UNIT_TIME);
RNA_def_property_int_sdna(prop, NULL, "dupsta");
RNA_def_property_range(prop, 1, 32767);
RNA_def_property_ui_text(prop, "Dupli Frames Start", "Start frame for DupliFrames.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
- prop= RNA_def_property(srna, "dupli_frames_end", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "dupli_frames_end", PROP_INT, PROP_NONE|PROP_UNIT_TIME);
RNA_def_property_int_sdna(prop, NULL, "dupend");
RNA_def_property_range(prop, 1, 32767);
RNA_def_property_ui_text(prop, "Dupli Frames End", "End frame for DupliFrames.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
- prop= RNA_def_property(srna, "dupli_frames_on", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "dupli_frames_on", PROP_INT, PROP_NONE|PROP_UNIT_TIME);
RNA_def_property_int_sdna(prop, NULL, "dupon");
RNA_def_property_range(prop, 1, 1500);
RNA_def_property_ui_text(prop, "Dupli Frames On", "Number of frames to use between DupOff frames.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
- prop= RNA_def_property(srna, "dupli_frames_off", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "dupli_frames_off", PROP_INT, PROP_NONE|PROP_UNIT_TIME);
RNA_def_property_int_sdna(prop, NULL, "dupoff");
RNA_def_property_range(prop, 0, 1500);
RNA_def_property_ui_text(prop, "Dupli Frames Off", "Recurring frames to exclude from the Dupliframes.");
@@ -1024,9 +1416,9 @@ static void rna_def_object(BlenderRNA *brna)
/* time offset */
- prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_TIME);
RNA_def_property_float_sdna(prop, NULL, "sf");
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Time Offset", "Animation offset in frames for IPO's and dupligroup instances.");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
@@ -1049,12 +1441,6 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Time Offset Add Parent", "Add the parents time offset value");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
- /* script link */
-
- prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "scriptlink");
- RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this object.");
-
/* drawing */
prop= RNA_def_property(srna, "max_draw_type", PROP_ENUM, PROP_NONE);
@@ -1104,6 +1490,13 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "X-Ray", "Makes the object draw in front of others.");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ /* 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");
+
/* pose */
prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "poselib");
@@ -1115,55 +1508,66 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Pose");
RNA_def_property_ui_text(prop, "Pose", "Current pose for armatures.");
- prop= RNA_def_property(srna, "pose_mode", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_POSEMODE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Pose Mode", "Object with armature data is in pose mode.");
-
- // XXX this stuff should be moved to AnimData...
-/*
- prop= RNA_def_property(srna, "nla_disable_path", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "nlaflag", OB_DISABLE_PATH);
- RNA_def_property_ui_text(prop, "NLA Disable Path", "Disable path temporally, for editing cycles.");
-
- prop= RNA_def_property(srna, "nla_collapsed", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "nlaflag", OB_NLA_COLLAPSED);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "NLA Collapsed", "");
-
- prop= RNA_def_property(srna, "nla_override", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "nlaflag", OB_NLA_OVERRIDE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "NLA Override", "");
-
- prop= RNA_def_property(srna, "nla_strips", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "nlastrips", NULL);
- RNA_def_property_struct_type(prop, "UnknownType");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "NLA Strips", "NLA strips of the object.");
-*/
-
/* shape keys */
prop= RNA_def_property(srna, "shape_key_lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shapeflag", OB_SHAPE_LOCK);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Object_shape_key_lock_set");
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);
+ RNA_def_property_update(prop, 0, "rna_Object_update_data");
- prop= RNA_def_property(srna, "active_shape_key", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "active_shape_key", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ShapeKey");
+ RNA_def_property_pointer_funcs(prop, "rna_Object_active_shape_key_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Shape Key", "Current shape key.");
+
+ prop= RNA_def_property(srna, "active_shape_key_index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "shapenr");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Active Shape Key", "Current shape key index.");
+ RNA_def_property_int_funcs(prop, "rna_Object_active_shape_key_index_get", "rna_Object_active_shape_key_index_set", "rna_Object_active_shape_key_index_range");
+ RNA_def_property_ui_text(prop, "Active Shape Key Index", "Current shape key index.");
+ RNA_def_property_update(prop, 0, "rna_Object_update_data");
RNA_api_object(srna);
}
+static void rna_def_dupli_object(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "DupliObject", NULL);
+ RNA_def_struct_sdna(srna, "DupliObject");
+ RNA_def_struct_ui_text(srna, "Dupli Object", "Dupli Object data.");
+ /* RNA_def_struct_ui_icon(srna, ICON_OBJECT_DATA); */
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ /* RNA_def_property_struct_type(prop, "Object"); */
+ RNA_def_property_pointer_sdna(prop, NULL, "ob");
+ /* RNA_def_property_pointer_funcs(prop, "rna_DupliObject_object_get", NULL, NULL); */
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Object this DupliObject represents.");
+
+ prop= RNA_def_property(srna, "ob_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "omat");
+ RNA_def_property_array(prop, 16);
+ RNA_def_property_ui_text(prop, "Object Matrix", "Object transformation matrix.");
+
+ 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_ui_text(prop, "DupliObject Matrix", "DupliObject transformation matrix.");
+
+ /* TODO: DupliObject has more properties that can be wrapped */
+}
+
void RNA_def_object(BlenderRNA *brna)
{
rna_def_object(brna);
rna_def_object_game_settings(brna);
rna_def_vertex_group(brna);
rna_def_material_slot(brna);
+ rna_def_dupli_object(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 053ab115b3b..098604c1eab 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -28,55 +28,402 @@
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
+#include <time.h>
#include "RNA_define.h"
#include "RNA_types.h"
+#include "DNA_object_types.h"
+
+#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
+
+#include "ED_mesh.h"
+
#ifdef RNA_RUNTIME
-#include "BKE_customdata.h"
+#include "BKE_main.h"
+#include "BKE_global.h"
+#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_object.h"
+#include "BKE_mesh.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_customdata.h"
+#include "BKE_anim.h"
+#include "BKE_depsgraph.h"
+#include "BKE_displist.h"
+#include "BKE_font.h"
+#include "BKE_mball.h"
+
+#include "BLI_arithb.h"
+
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_modifier_types.h"
-/* copied from init_render_mesh (render code) */
-Mesh *rna_Object_create_render_mesh(Object *ob, Scene *scene)
+#include "MEM_guardedalloc.h"
+
+/* copied from Mesh_getFromObject and adapted to RNA interface */
+/* settings: 0 - preview, 1 - render */
+static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports, int apply_modifiers, int settings)
{
- CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
- DerivedMesh *dm;
- Mesh *me;
+ Mesh *tmpmesh;
+ Curve *tmpcu = NULL;
+ Object *tmpobj = NULL;
+ int render = settings, i;
+ int cage = !apply_modifiers;
+ Scene *sce = CTX_data_scene(C);
+
+ /* perform the mesh extraction based on type */
+ switch (ob->type) {
+ case OB_FONT:
+ case OB_CURVE:
+ case OB_SURF:
+
+ /* copies object and modifiers (but not the data) */
+ tmpobj= copy_object(ob);
+ tmpcu = (Curve *)tmpobj->data;
+ tmpcu->id.us--;
+
+ /* if getting the original caged mesh, delete object modifiers */
+ if( cage )
+ object_free_modifiers(tmpobj);
+
+ /* copies the data */
+ tmpobj->data = copy_curve( (Curve *) ob->data );
+
+#if 0
+ /* copy_curve() sets disp.first null, so currently not need */
+ {
+ Curve *cu;
+ cu = (Curve *)tmpobj->data;
+ if( cu->disp.first )
+ MEM_freeN( cu->disp.first );
+ cu->disp.first = NULL;
+ }
- /* TODO: other types */
- if(ob->type != OB_MESH)
- return NULL;
+#endif
+
+ /* get updated display list, and convert to a mesh */
+ makeDispListCurveTypes( sce, tmpobj, 0 );
+ nurbs_to_mesh( tmpobj );
+
+ /* nurbs_to_mesh changes the type to a mesh, check it worked */
+ if (tmpobj->type != OB_MESH) {
+ free_libblock_us( &(CTX_data_main(C)->object), tmpobj );
+ BKE_report(reports, RPT_ERROR, "cant convert curve to mesh. Does the curve have any segments?");
+ return NULL;
+ }
+ tmpmesh = tmpobj->data;
+ free_libblock_us( &G.main->object, tmpobj );
+ break;
+
+ case OB_MBALL:
+ /* metaballs don't have modifiers, so just convert to mesh */
+ ob = find_basis_mball( sce, ob );
+ /* todo, re-generatre for render-res */
+ /* metaball_polygonize(scene, ob) */
+
+ tmpmesh = add_mesh("Mesh");
+ mball_to_mesh( &ob->disp, tmpmesh );
+ break;
+
+ case OB_MESH:
+ /* copies object and modifiers (but not the data) */
+ if (cage) {
+ /* copies the data */
+ tmpmesh = copy_mesh( ob->data );
+ /* if not getting the original caged mesh, get final derived mesh */
+ } else {
+ /* Make a dummy mesh, saves copying */
+ DerivedMesh *dm;
+ /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
+ CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
+ for example, needs CD_MASK_MDEFORMVERT */
+
+ /* Write the display mesh into the dummy mesh */
+ if (render)
+ dm = mesh_create_derived_render( sce, ob, mask );
+ else
+ dm = mesh_create_derived_view( sce, ob, mask );
+
+ tmpmesh = add_mesh( "Mesh" );
+ DM_to_mesh( dm, tmpmesh );
+ dm->release( dm );
+ }
+
+ break;
+ default:
+ BKE_report(reports, RPT_ERROR, "Object does not have geometry data");
+ return NULL;
+ }
+
+ /* Copy materials to new mesh */
+ switch (ob->type) {
+ case OB_SURF:
+ tmpmesh->totcol = tmpcu->totcol;
+
+ /* free old material list (if it exists) and adjust user counts */
+ if( tmpcu->mat ) {
+ for( i = tmpcu->totcol; i-- > 0; ) {
+ /* are we an object material or data based? */
+ if (ob->colbits & 1<<i)
+ tmpmesh->mat[i] = ob->mat[i];
+ else
+ tmpmesh->mat[i] = tmpcu->mat[i];
+
+ if (tmpmesh->mat[i])
+ tmpmesh->mat[i]->id.us++;
+ }
+ }
+ break;
+
+#if 0
+ /* Crashes when assigning the new material, not sure why */
+ case OB_MBALL:
+ tmpmb = (MetaBall *)ob->data;
+ tmpmesh->totcol = tmpmb->totcol;
+
+ /* free old material list (if it exists) and adjust user counts */
+ if( tmpmb->mat ) {
+ for( i = tmpmb->totcol; i-- > 0; ) {
+ tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */
+ if (tmpmesh->mat[i]) {
+ tmpmb->mat[i]->id.us++;
+ }
+ }
+ }
+ break;
+#endif
+
+ case OB_MESH:
+ if (!cage) {
+ Mesh *origmesh= ob->data;
+ tmpmesh->flag= origmesh->flag;
+ tmpmesh->mat = MEM_dupallocN(origmesh->mat);
+ tmpmesh->totcol = origmesh->totcol;
+ tmpmesh->smoothresh= origmesh->smoothresh;
+ if( origmesh->mat ) {
+ for( i = origmesh->totcol; i-- > 0; ) {
+ /* are we an object material or data based? */
+ if (ob->colbits & 1<<i)
+ tmpmesh->mat[i] = ob->mat[i];
+ else
+ tmpmesh->mat[i] = origmesh->mat[i];
+ if (tmpmesh->mat[i])
+ tmpmesh->mat[i]->id.us++;
+ }
+ }
+ }
+ break;
+ } /* end copy materials */
+
+ /* we don't assign it to anything */
+ tmpmesh->id.us--;
- dm= mesh_create_derived_render(scene, ob, mask);
+ /* make sure materials get updated in objects */
+ test_object_materials( ( ID * ) tmpmesh );
+
+ return tmpmesh;
+}
+
+/* When no longer needed, duplilist should be freed with Object.free_duplilist */
+static void rna_Object_create_duplilist(Object *ob, bContext *C, ReportList *reports)
+{
+ if (!(ob->transflag & OB_DUPLI)) {
+ BKE_report(reports, RPT_ERROR, "Object does not have duplis.");
+ return;
+ }
+
+ /* free duplilist if a user forgets to */
+ if (ob->duplilist) {
+ BKE_reportf(reports, RPT_WARNING, "Object.dupli_list has not been freed.");
- if(!dm)
- return NULL;
+ free_object_duplilist(ob->duplilist);
+ ob->duplilist= NULL;
+ }
- me= add_mesh("tmp_render_mesh");
- me->id.us--; /* we don't assign it to anything */
- DM_to_mesh(dm, me);
- dm->release(dm);
+ ob->duplilist= object_duplilist(CTX_data_scene(C), ob);
- return me;
+ /* ob->duplilist should now be freed with Object.free_duplilist */
+}
+
+static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
+{
+ if (ob->duplilist) {
+ free_object_duplilist(ob->duplilist);
+ ob->duplilist= NULL;
+ }
}
+static bDeformGroup *rna_Object_add_vertex_group(Object *ob, char *group_name)
+{
+ return ED_vgroup_add_name(ob, group_name);
+}
+
+static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)
+{
+ /* creates dverts if needed */
+ ED_vgroup_vert_add(ob, def, vertex_index, weight, assignmode);
+}
+
+/* copied from old API Object.makeDisplayList (Object.c) */
+static void rna_Object_make_display_list(Object *ob, bContext *C)
+{
+ Scene *sce= CTX_data_scene(C);
+
+ if (ob->type == OB_FONT) {
+ Curve *cu = ob->data;
+ freedisplist(&cu->disp);
+ BKE_text_to_curve(sce, ob, CU_LEFT);
+ }
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+}
+
+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;
+}
+
+int rna_Object_is_visible(Object *ob, bContext *C)
+{
+ return ob->lay & CTX_data_scene(C)->lay;
+}
+
+/*
+static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int *indices, int totindex, float weight, int assignmode)
+{
+ if (ob->type != OB_MESH) {
+ BKE_report(reports, RPT_ERROR, "Object should be of MESH type.");
+ return;
+ }
+
+ Mesh *me = (Mesh*)ob->data;
+ int group_index = get_defgroup_num(ob, group);
+ if (group_index == -1) {
+ BKE_report(reports, RPT_ERROR, "No deform groups assigned to mesh.");
+ return;
+ }
+
+ if (assignmode != WEIGHT_REPLACE && assignmode != WEIGHT_ADD && assignmode != WEIGHT_SUBTRACT) {
+ BKE_report(reports, RPT_ERROR, "Bad assignment mode." );
+ return;
+ }
+
+ // makes a set of dVerts corresponding to the mVerts
+ if (!me->dvert)
+ create_dverts(&me->id);
+
+ // loop list adding verts to group
+ for (i= 0; i < totindex; i++) {
+ if(i < 0 || i >= me->totvert) {
+ BKE_report(reports, RPT_ERROR, "Bad vertex index in list.");
+ return;
+ }
+
+ add_vert_defnr(ob, group_index, i, weight, assignmode);
+ }
+}
+*/
+
#else
void RNA_api_object(StructRNA *srna)
{
FunctionRNA *func;
- PropertyRNA *prop;
-
- func= RNA_def_function(srna, "create_render_mesh", "rna_Object_create_render_mesh");
- RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
- prop= RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_property_flag(prop, PROP_REQUIRED);
- prop= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
- RNA_def_function_return(func, prop);
+ PropertyRNA *parm;
+
+ static EnumPropertyItem mesh_type_items[] = {
+ {0, "PREVIEW", 0, "Preview", "Apply modifier preview settings."},
+ {1, "RENDER", 0, "Render", "Apply modifier render settings."},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ static EnumPropertyItem assign_mode_items[] = {
+ {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace."}, /* TODO: more meaningful descriptions */
+ {WEIGHT_ADD, "ADD", 0, "Add", "Add."},
+ {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract."},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+ /* mesh */
+ func= RNA_def_function(srna, "create_mesh", "rna_Object_create_mesh");
+ RNA_def_function_ui_description(func, "Create a Mesh datablock with modifiers applied.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
+ RNA_def_function_return(func, parm);
+
+ /* duplis */
+ func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist");
+ RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+
+ func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist");
+ RNA_def_function_ui_description(func, "Free the list of dupli objects.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+
+ /* vertex groups */
+ func= RNA_def_function(srna, "add_vertex_group", "rna_Object_add_vertex_group");
+ RNA_def_function_ui_description(func, "Add vertex group to object.");
+ parm= 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, "add_vertex_to_group", "rna_Object_add_vertex_to_group");
+ RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
+ parm= RNA_def_int(func, "vertex_index", 0, 0, 0, "", "Vertex index.", 0, 0);
+ 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);
+
+ /* Armature */
+ func= RNA_def_function(srna, "find_armature", "rna_Object_find_armature");
+ 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);
+
+ /* DAG */
+ func= RNA_def_function(srna, "make_display_list", "rna_Object_make_display_list");
+ RNA_def_function_ui_description(func, "Update object's display data."); /* XXX describe better */
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+ /* View */
+ func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
+ RNA_def_function_ui_description(func, "Determine if object is visible in active scene.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ parm= RNA_def_boolean(func, "is_visible", 0, "", "Object visibility.");
+ RNA_def_function_return(func, parm);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index bc3f0733a0d..1f0d01ce784 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -31,18 +31,54 @@
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_scene_types.h"
+#include "WM_api.h"
#include "WM_types.h"
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
+#include "DNA_modifier_types.h"
+#include "DNA_texture_types.h"
+
#include "BKE_context.h"
+#include "BKE_modifier.h"
#include "BKE_pointcache.h"
+#include "BKE_depsgraph.h"
#include "BLI_blenlib.h"
+#include "ED_object.h"
+
+static void rna_Cache_change(bContext *C, PointerRNA *ptr)
+{
+ Object *ob = CTX_data_active_object(C);
+ PointCache *cache = (PointCache*)ptr->data;
+ PTCacheID *pid = NULL;
+ ListBase pidlist;
+
+ if(!ob)
+ return;
+
+ cache->flag |= PTCACHE_OUTDATED;
+
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache==cache)
+ break;
+ }
+
+ if(pid)
+ BKE_ptcache_update_info(pid);
+
+ BLI_freelistN(&pidlist);
+}
+
static void rna_Cache_toggle_disk_cache(bContext *C, PointerRNA *ptr)
{
Object *ob = CTX_data_active_object(C);
@@ -70,7 +106,7 @@ static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr)
{
Object *ob = CTX_data_active_object(C);
PointCache *cache = (PointCache*)ptr->data;
- PTCacheID *pid = NULL, *pid2;
+ PTCacheID *pid = NULL, *pid2= NULL;
ListBase pidlist;
int new_name = 1;
char name[80];
@@ -82,37 +118,336 @@ static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr)
BKE_ptcache_ids_from_object(&pidlist, ob);
+ if(cache->flag & PTCACHE_EXTERNAL) {
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache==cache)
+ break;
+ }
+
+ 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);
+ }
+ else {
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache==cache)
+ pid2 = pid;
+ else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) {
+ /*TODO: report "name exists" to user */
+ strcpy(cache->name, cache->prev_name);
+ new_name = 0;
+ }
+ }
+
+ 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;
+
+ BKE_ptcache_toggle_disk_cache(pid2);
+
+ strcpy(cache->name, name);
+
+ cache->flag |= PTCACHE_DISK_CACHE;
+
+ BKE_ptcache_toggle_disk_cache(pid2);
+ }
+
+ strcpy(cache->prev_name, cache->name);
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+}
+
+static void rna_Cache_list_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ PointCache *cache= ptr->data;
+ PTCacheID *pid;
+ ListBase pidlist;
+
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
for(pid=pidlist.first; pid; pid=pid->next) {
- if(pid->cache==cache)
- pid2 = pid;
- else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) {
- /*TODO: report "name exists" to user */
- strcpy(cache->name, cache->prev_name);
- new_name = 0;
+ if(pid->cache == cache) {
+ rna_iterator_listbase_begin(iter, pid->ptcaches, NULL);
+ break;
}
}
- if(new_name) {
- if(pid2 && cache->flag & PTCACHE_DISK_CACHE) {
- strcpy(name, cache->name);
- strcpy(cache->name, cache->prev_name);
+ BLI_freelistN(&pidlist);
+}
+static void rna_Cache_active_point_cache_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob = ptr->id.data;
+ PointCache *cache= ptr->data;
+ PTCacheID *pid;
+ ListBase pidlist;
- cache->flag &= ~PTCACHE_DISK_CACHE;
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ *min= 0;
+ *max= 0;
- BKE_ptcache_toggle_disk_cache(pid2);
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ *max= BLI_countlist(pid->ptcaches)-1;
+ *max= MAX2(0, *max);
+ break;
+ }
+ }
- strcpy(cache->name, name);
+ BLI_freelistN(&pidlist);
+}
- cache->flag |= PTCACHE_DISK_CACHE;
+static int rna_Cache_active_point_cache_index_get(PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ PointCache *cache= ptr->data;
+ PTCacheID *pid;
+ ListBase pidlist;
+ int num = 0;
- BKE_ptcache_toggle_disk_cache(pid2);
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ num = BLI_findindex(pid->ptcaches, cache);
+ break;
}
+ }
+
+ BLI_freelistN(&pidlist);
+
+ return num;
+}
+
+static void rna_Cache_active_point_cache_index_set(struct PointerRNA *ptr, int value)
+{
+ Object *ob = ptr->id.data;
+ PointCache *cache= ptr->data;
+ PTCacheID *pid;
+ ListBase pidlist;
- strcpy(cache->prev_name, cache->name);
+ BKE_ptcache_ids_from_object(&pidlist, ob);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache == cache) {
+ *(pid->cache_ptr) = BLI_findlink(pid->ptcaches, value);
+ break;
+ }
}
BLI_freelistN(&pidlist);
}
+static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_EDGES) != 0);
+}
+
+static void rna_SoftBodySettings_use_edges_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_EDGES;
+ else data->softflag &= ~OB_SB_EDGES;
+}
+
+static int rna_SoftBodySettings_use_goal_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_GOAL) != 0);
+}
+
+static void rna_SoftBodySettings_use_goal_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_GOAL;
+ else data->softflag &= ~OB_SB_GOAL;
+}
+
+static int rna_SoftBodySettings_stiff_quads_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_QUADS) != 0);
+}
+
+static void rna_SoftBodySettings_stiff_quads_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_QUADS;
+ else data->softflag &= ~OB_SB_QUADS;
+}
+
+static int rna_SoftBodySettings_self_collision_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_SELF) != 0);
+}
+
+static void rna_SoftBodySettings_self_collision_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_SELF;
+ else data->softflag &= ~OB_SB_SELF;
+}
+
+static int rna_SoftBodySettings_new_aero_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_AERO_ANGLE) != 0);
+}
+
+static void rna_SoftBodySettings_new_aero_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_AERO_ANGLE;
+ else data->softflag &= ~OB_SB_AERO_ANGLE;
+}
+
+static int rna_SoftBodySettings_face_collision_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_FACECOLL) != 0);
+}
+
+static void rna_SoftBodySettings_face_collision_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_FACECOLL;
+ else data->softflag &= ~OB_SB_FACECOLL;
+}
+
+static int rna_SoftBodySettings_edge_collision_get(PointerRNA *ptr)
+{
+ Object *data= (Object*)(ptr->id.data);
+ return (((data->softflag) & OB_SB_EDGECOLL) != 0);
+}
+
+static void rna_SoftBodySettings_edge_collision_set(PointerRNA *ptr, int value)
+{
+ Object *data= (Object*)(ptr->id.data);
+ if(value) data->softflag |= OB_SB_EDGECOLL;
+ else data->softflag &= ~OB_SB_EDGECOLL;
+}
+
+static void rna_SoftBodySettings_goal_vgroup_get(PointerRNA *ptr, char *value)
+{
+ SoftBody *sb= (SoftBody*)ptr->data;
+ rna_object_vgroup_name_index_get(ptr, value, sb->vertgroup);
+}
+
+static int rna_SoftBodySettings_goal_vgroup_length(PointerRNA *ptr)
+{
+ SoftBody *sb= (SoftBody*)ptr->data;
+ return rna_object_vgroup_name_index_length(ptr, sb->vertgroup);
+}
+
+static void rna_SoftBodySettings_goal_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ SoftBody *sb= (SoftBody*)ptr->data;
+ rna_object_vgroup_name_index_set(ptr, value, &sb->vertgroup);
+}
+
+static void rna_FieldSettings_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ if(ob->pd->forcefield != PFIELD_TEXTURE && ob->pd->tex) {
+ ob->pd->tex->id.us--;
+ ob->pd->tex= 0;
+ }
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_FieldSettings_surface_update(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= (Object*)ptr->id.data;
+ PartDeflect *pd= ob->pd;
+ ModifierData *md= modifiers_findByType(ob, eModifierType_Surface);
+
+ /* add/remove modifier as needed */
+ if(!md) {
+ if(pd && (pd->flag & PFIELD_SURFACE))
+ if(ELEM6(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ,PFIELD_BOID))
+ if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE))
+ ED_object_modifier_add(NULL, scene, ob, eModifierType_Surface);
+ }
+ else {
+ if(!pd || !(pd->flag & PFIELD_SURFACE))
+ ED_object_modifier_remove(NULL, scene, ob, md);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_FieldSettings_dependency_update(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= (Object*)ptr->id.data;
+
+ /* do this before scene sort, that one checks for CU_PATH */
+ /* XXX if(ob->type==OB_CURVE && ob->pd->forcefield==PFIELD_GUIDE) {
+ Curve *cu= ob->data;
+ cu->flag |= (CU_PATH|CU_3D);
+ do_curvebuts(B_CU3D); // all curves too
+ }*/
+
+ rna_FieldSettings_surface_update(C, ptr);
+
+ DAG_scene_sort(scene);
+
+ if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE)
+ DAG_id_flush_update(&ob->id, OB_RECALC);
+ else
+ DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_CollisionSettings_dependency_update(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= (Object*)ptr->id.data;
+ ModifierData *md= modifiers_findByType(ob, eModifierType_Collision);
+
+ /* add/remove modifier as needed */
+ if(ob->pd->deflect && !md)
+ ED_object_modifier_add(NULL, scene, ob, eModifierType_Collision);
+ else if(!ob->pd->deflect && md)
+ ED_object_modifier_remove(NULL, scene, ob, md);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_CollisionSettings_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_softbody_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+}
+
#else
static void rna_def_pointcache(BlenderRNA *brna)
@@ -122,23 +457,37 @@ static void rna_def_pointcache(BlenderRNA *brna)
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);
- prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "startframe");
RNA_def_property_range(prop, 1, 300000);
RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts.");
- prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "endframe");
RNA_def_property_range(prop, 1, 300000);
RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops.");
+ prop= RNA_def_property(srna, "step", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 1, 20);
+ RNA_def_property_ui_text(prop, "Cache Step", "Number of frames between cached frames.");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
+
+ prop= RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "index");
+ RNA_def_property_range(prop, -1, 100);
+ RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files.");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+
/* flags */
prop= RNA_def_property(srna, "baked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop= RNA_def_property(srna, "baking", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKING);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_DISK_CACHE);
@@ -150,21 +499,45 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Cache is outdated", "");
+ prop= RNA_def_property(srna, "frames_skipped", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_FRAMES_SKIPPED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Name", "Cache name");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+ RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "autocache", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_AUTOCACHE);
- RNA_def_property_ui_text(prop, "Auto Cache", "Cache changes automatically");
- //RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_autocache");
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ RNA_def_property_string_sdna(prop, NULL, "path");
+ RNA_def_property_ui_text(prop, "File Path", "Cache file path.");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+
+ prop= RNA_def_property(srna, "quick_cache", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_QUICK_CACHE);
+ RNA_def_property_ui_text(prop, "Quick Cache", "Update simulation with cache steps");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "info");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status.");
+ prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL);
+ RNA_def_property_ui_text(prop, "External", "Read cache from an external location");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+
+ prop= RNA_def_property(srna, "point_cache_list", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0, 0);
+ RNA_def_property_struct_type(prop, "PointCache");
+ RNA_def_property_ui_text(prop, "Point Cache List", "Point cache list");
+
+ prop= RNA_def_property(srna, "active_point_cache_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get", "rna_Cache_active_point_cache_index_set", "rna_Cache_active_point_cache_index_range");
+ RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
}
static void rna_def_collision(BlenderRNA *brna)
@@ -179,6 +552,7 @@ static void rna_def_collision(BlenderRNA *brna)
prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deflect", 1);
RNA_def_property_ui_text(prop, "Enabled", "Enable this objects as a collider for physics systems");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_dependency_update");
/* Particle Interaction */
@@ -186,30 +560,36 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "pdef_damp");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Damping Factor", "Amount of damping during particle collision");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "random_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_rdamp");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Damping", "Random variation of damping");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "friction_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_frict");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Friction Factor", "Amount of friction during particle collision");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "random_friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_rfrict");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Friction", "Random variation of friction");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "permeability", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_perm");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Permeability", "Chance that the particle will pass through the mesh");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "kill_particles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PDEFLE_KILL_PART);
RNA_def_property_ui_text(prop, "Kill Particles", "Kill collided particles");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
/* Soft Body and Cloth Interaction */
@@ -217,22 +597,32 @@ static void rna_def_collision(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "pdef_sbift");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Inner Thickness", "Inner face thickness");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "outer_thickness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_sboft");
RNA_def_property_range(prop, 0.001f, 1.0f);
RNA_def_property_ui_text(prop, "Outer Thickness", "Outer face thickness");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pdef_sbdamp");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Damping", "Amount of damping during collision");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
/* Does this belong here?
prop= RNA_def_property(srna, "collision_stack", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "softflag", OB_SB_COLLFINAL);
RNA_def_property_ui_text(prop, "Collision from Stack", "Pick collision object from modifier stack (softbody only)");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
*/
+
+ prop= RNA_def_property(srna, "absorption", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 2);
+ RNA_def_property_ui_text(prop, "Absorption", "How much of effector force gets lost during collision with this object (in percent).");
+ RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
}
static void rna_def_field(BlenderRNA *brna)
@@ -251,6 +641,7 @@ static void rna_def_field(BlenderRNA *brna)
{PFIELD_HARMONIC, "HARMONIC", 0, "Harmonic", ""},
{PFIELD_CHARGE, "CHARGE", 0, "Charge", ""},
{PFIELD_LENNARDJ, "LENNARDJ", 0, "Lennard-Jones", ""},
+ {PFIELD_BOID, "BOID", 0, "Boid", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem falloff_items[] = {
@@ -268,23 +659,27 @@ static void rna_def_field(BlenderRNA *brna)
srna= RNA_def_struct(brna, "FieldSettings", NULL);
RNA_def_struct_sdna(srna, "PartDeflect");
RNA_def_struct_ui_text(srna, "Field Settings", "Field settings for an object in physics simulation.");
+ RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
/* Enums */
- prop= RNA_def_property(srna, "field_type", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "forcefield");
RNA_def_property_enum_items(prop, field_type_items);
- RNA_def_property_ui_text(prop, "Field Type", "Choose Field Type");
+ RNA_def_property_ui_text(prop, "Type", "Type of field.");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_dependency_update");
prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "falloff");
RNA_def_property_enum_items(prop, falloff_items);
- RNA_def_property_ui_text(prop, "Fall-Off", "Fall-Off Shape");
+ RNA_def_property_ui_text(prop, "Fall-Off", "Fall-off shape.");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "texture_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "tex_mode");
RNA_def_property_enum_items(prop, texture_items);
RNA_def_property_ui_text(prop, "Texture Mode", "How the texture effect is calculated (RGB & Curl need a RGB texture else Gradient will be used instead)");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
/* Float */
@@ -292,103 +687,125 @@ static void rna_def_field(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "f_strength");
RNA_def_property_range(prop, -1000.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Strength", "Strength of force field");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "falloff_power", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_power");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Falloff Power", "Falloff power (real gravitational falloff = 2)");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "harmonic_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_damp");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Harmonic Damping", "Damping of the harmonic force");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "mindist");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance for the field's fall-off");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "maximum_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxdist");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance for the field to work");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "radial_minimum", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "minrad");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Minimum Radial Distance", "Minimum radial distance for the field's fall-off");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "radial_maximum", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxrad");
RNA_def_property_range(prop, 0.0f, 1000.0f);
RNA_def_property_ui_text(prop, "Maximum Radial Distance", "Maximum radial distance for the field to work");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "radial_falloff", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_power_r");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Radial Falloff Power", "Radial falloff power (real gravitational falloff = 2)");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "texture_nabla", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "tex_nabla");
RNA_def_property_range(prop, 0.0001f, 1.0f);
RNA_def_property_ui_text(prop, "Nabla", "Defines size of derivative offset used for calculating gradient and curl");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_noise");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Noise", "Noise of the wind force");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
RNA_def_property_range(prop, 1, 128);
RNA_def_property_ui_text(prop, "Seed", "Seed of the wind noise");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
/* Boolean */
prop= RNA_def_property(srna, "use_min_distance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMIN);
RNA_def_property_ui_text(prop, "Use Min", "Use a minimum distance for the field's fall-off");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "use_max_distance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAX);
RNA_def_property_ui_text(prop, "Use Max", "Use a maximum distance for the field to work");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "use_radial_min", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMINR);
RNA_def_property_ui_text(prop, "Use Min", "Use a minimum radial distance for the field's fall-off");
// "Use a minimum angle for the field's fall-off"
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "use_radial_max", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAXR);
RNA_def_property_ui_text(prop, "Use Max", "Use a maximum radial distance for the field to work");
// "Use a maximum angle for the field to work"
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "guide_path_add", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_ADD);
RNA_def_property_ui_text(prop, "Additive", "Based on distance/falloff it adds a portion of the entire path");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "planar", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_PLANAR);
RNA_def_property_ui_text(prop, "Planar", "Create planar field");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_SURFACE);
RNA_def_property_ui_text(prop, "Surface", "Use closest point on surface");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_surface_update");
prop= RNA_def_property(srna, "positive_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_POSZ);
RNA_def_property_ui_text(prop, "Positive", "Effect only in direction of positive Z axis");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "use_coordinates", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_OBJECT);
RNA_def_property_ui_text(prop, "Use Coordinates", "Use object/global coordinates for texture");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "force_2d", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_2D);
RNA_def_property_ui_text(prop, "2D", "Apply force only in 2d");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "root_coordinates", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_ROOTCO);
RNA_def_property_ui_text(prop, "Root Texture Coordinates", "Texture coordinates from root particle locations");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
/* Pointer */
@@ -396,24 +813,308 @@ static void rna_def_field(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "tex");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Texture", "Texture to use as force");
+ RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
}
static void rna_def_game_softbody(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna= RNA_def_struct(brna, "GameSoftBodySettings", NULL);
RNA_def_struct_sdna(srna, "BulletSoftBody");
RNA_def_struct_ui_text(srna, "Game Soft Body Settings", "Soft body simulation settings for an object in the game engine.");
+
+ /* Floats */
+
+ prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "linStiff");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links");
+
+ prop= RNA_def_property(srna, "dynamic_friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "kDF");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction");
+
+ prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "kMT");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold");
+
+ prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "margin");
+ RNA_def_property_range(prop, 0.01f, 1.0f);
+ RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable");
+
+ prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "welding");
+ RNA_def_property_range(prop, 0.0f, 0.01f);
+ RNA_def_property_ui_text(prop, "Welding", "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)");
+
+ /* Integers */
+
+ prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "piterations");
+ RNA_def_property_range(prop, 0, 10);
+ RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations");
+
+ prop= RNA_def_property(srna, "cluster_iterations", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "numclusteriterations");
+ RNA_def_property_range(prop, 1, 128);
+ RNA_def_property_ui_text(prop, "Cluster Iterations", "Specify the number of cluster iterations");
+
+ /* Booleans */
+
+ prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING);
+ RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal");
+
+ prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS);
+ RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints");
+
+ prop= RNA_def_property(srna, "cluster_rigid_to_softbody", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS);
+ RNA_def_property_ui_text(prop, "Rigid to Soft Body", "Enable cluster collision between soft and rigid body");
+
+ prop= RNA_def_property(srna, "cluster_soft_to_softbody", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS);
+ RNA_def_property_ui_text(prop, "Soft to Soft Body", "Enable cluster collision between soft and soft body");
}
static void rna_def_softbody(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem collision_type_items[] = {
+ {SBC_MODE_MANUAL, "MANUAL", 0, "Manual", "Manual adjust"},
+ {SBC_MODE_AVG, "AVERAGE", 0, "Average", "Average Spring length * Ball Size"},
+ {SBC_MODE_MIN, "MINIMAL", 0, "Minimal", "Minimal Spring length * Ball Size"},
+ {SBC_MODE_MAX, "MAXIMAL", 0, "Maximal", "Maximal Spring length * Ball Size"},
+ {SBC_MODE_AVGMINMAX, "MINMAX", 0, "AvMinMax", "(Min+Max)/2 * Ball Size"},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "SoftBodySettings", NULL);
RNA_def_struct_sdna(srna, "SoftBody");
RNA_def_struct_ui_text(srna, "Soft Body Settings", "Soft body simulation settings for an object.");
+
+ /* General Settings */
+
+ prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "mediafrict");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ RNA_def_property_ui_text(prop, "Friction", "General media friction for point movements");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "nodemass");
+ RNA_def_property_range(prop, 0.0f, 50000.0f);
+ RNA_def_property_ui_text(prop, "Mass", "");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
+ RNA_def_property_float_sdna(prop, NULL, "grav");
+ RNA_def_property_range(prop, -10.0f, 10.0f);
+ RNA_def_property_ui_text(prop, "Gravitation", "Apply gravitation to point movement");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "physics_speed");
+ RNA_def_property_range(prop, 0.01f, 100.0f);
+ RNA_def_property_ui_text(prop, "Speed", "Tweak timing for physics to control frequency and speed");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ /* Goal */
+
+ prop= RNA_def_property(srna, "goal_vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "vertgroup");
+ RNA_def_property_string_funcs(prop, "rna_SoftBodySettings_goal_vgroup_get", "rna_SoftBodySettings_goal_vgroup_length", "rna_SoftBodySettings_goal_vgroup_set");
+ RNA_def_property_ui_text(prop, "Goal Vertex Group", "Control point weight values.");
+
+ prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "mingoal");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxgoal");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "defgoal");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "goalspring");
+ RNA_def_property_range(prop, 0.0f, 0.999f);
+ RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "goalfrict");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ /* Edge Spring Settings */
+
+ prop= RNA_def_property(srna, "pull", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "inspring");
+ RNA_def_property_range(prop, 0.0f, 0.999f);
+ RNA_def_property_ui_text(prop, "Pull", "Edge spring stiffness when longer than rest length");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "push", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "inpush");
+ RNA_def_property_range(prop, 0.0f, 0.999f);
+ RNA_def_property_ui_text(prop, "Push", "Edge spring stiffness when shorter than rest length");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "infrict");
+ RNA_def_property_range(prop, 0.0f, 50.0f);
+ 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");
+ 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");
+ 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");
+ 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");
+
+ prop= RNA_def_property(srna, "bending", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "secondspring");
+ RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_ui_text(prop, "Bending", "Bending Stiffness");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "shearstiff");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Shear", "Shear Stiffness");
+
+ /* Collision */
+
+ prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "sbc_mode");
+ RNA_def_property_enum_items(prop, collision_type_items);
+ RNA_def_property_ui_text(prop, "Collision Type", "Choose Collision Type");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "ball_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colball");
+ RNA_def_property_range(prop, -10.0f, 10.0f);
+ RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ballstiff");
+ RNA_def_property_range(prop, 0.001f, 100.0f);
+ RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating presure");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "ball_damp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "balldamp");
+ RNA_def_property_range(prop, 0.001f, 1.0f);
+ RNA_def_property_ui_text(prop, "Ball Size", "Blending to inelastic collision");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ /* Solver */
+
+ prop= RNA_def_property(srna, "error_limit", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rklimit");
+ RNA_def_property_range(prop, 0.001f, 10.0f);
+ RNA_def_property_ui_text(prop, "Error Limit", "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "minstep", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "minloops");
+ RNA_def_property_range(prop, 0, 30000);
+ RNA_def_property_ui_text(prop, "Min Step", "Minimal # solver steps/frame");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "maxstep", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "maxloops");
+ RNA_def_property_range(prop, 0, 30000);
+ RNA_def_property_ui_text(prop, "Max Step", "Maximal # solver steps/frame");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "choke", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "choke");
+ RNA_def_property_range(prop, 0, 100);
+ RNA_def_property_ui_text(prop, "Choke", "'Viscosity' inside collision target");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "fuzzyness");
+ RNA_def_property_range(prop, 1, 100);
+ RNA_def_property_ui_text(prop, "Fuzzy", "Fuzzyness while on collision, high values make collsion handling faster but less stable");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_OLDERR);
+ RNA_def_property_ui_text(prop, "V", "Use velocities for automagic step sizes");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "diagnose", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_MONITOR);
+ RNA_def_property_ui_text(prop, "Print Performance to Console", "Turn on SB diagnose console prints");
+
+ /* Flags */
+
+ prop= RNA_def_property(srna, "use_goal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_goal_get", "rna_SoftBodySettings_use_goal_set");
+ RNA_def_property_ui_text(prop, "Use Goal", "Define forces for vertices to stick to animated position.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "use_edges", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_edges_get", "rna_SoftBodySettings_use_edges_set");
+ RNA_def_property_ui_text(prop, "Use Edges", "Use Edges as springs");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "stiff_quads", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_stiff_quads_get", "rna_SoftBodySettings_stiff_quads_set");
+ RNA_def_property_ui_text(prop, "Stiff Quads", "Adds diagonal springs on 4-gons.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "edge_collision", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_edge_collision_get", "rna_SoftBodySettings_edge_collision_set");
+ RNA_def_property_ui_text(prop, "Edge Collision", "Edges collide too.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_face_collision_get", "rna_SoftBodySettings_face_collision_set");
+ RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, SLOOOOOW warning.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "new_aero", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set");
+ RNA_def_property_ui_text(prop, "N", "New aero(uses angle and length).");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
+
+ prop= RNA_def_property(srna, "self_collision", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_self_collision_get", "rna_SoftBodySettings_self_collision_set");
+ RNA_def_property_ui_text(prop, "Self Collision", "Enable naive vertex ball self collision.");
+ RNA_def_property_update(prop, 0, "rna_softbody_update");
}
void RNA_def_object_force(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_packedfile.c b/source/blender/makesrna/intern/rna_packedfile.c
index 6b9a708f555..85918bce05b 100644
--- a/source/blender/makesrna/intern/rna_packedfile.c
+++ b/source/blender/makesrna/intern/rna_packedfile.c
@@ -31,6 +31,13 @@
#include "DNA_packedFile_types.h"
+EnumPropertyItem unpack_method_items[] = {
+ {PF_USE_LOCAL, "USE_LOCAL", 0, "Use Local File", ""},
+ {PF_WRITE_LOCAL, "WRITE_LOCAL", 0, "Write Local File (overwrite existing)", ""},
+ {PF_USE_ORIGINAL, "USE_ORIGINAL", 0, "Use Original File", ""},
+ {PF_WRITE_ORIGINAL, "WRITE_ORIGINAL", 0, "Write Original File (overwrite existing)", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
#else
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index ae53c815ed9..04b4b1142be 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -29,22 +29,79 @@
#include "RNA_define.h"
#include "RNA_types.h"
+#include "RNA_access.h"
#include "rna_internal.h"
+#include "DNA_modifier_types.h"
#include "DNA_particle_types.h"
#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_boid_types.h"
#include "WM_types.h"
#include "WM_api.h"
+EnumPropertyItem part_from_items[] = {
+ {PART_FROM_VERT, "VERT", 0, "Verts", ""},
+ {PART_FROM_FACE, "FACE", 0, "Faces", ""},
+ {PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_reactor_from_items[] = {
+ {PART_FROM_VERT, "VERT", 0, "Verts", ""},
+ {PART_FROM_FACE, "FACE", 0, "Faces", ""},
+ {PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
+ {PART_FROM_PARTICLE, "PARTICLE", 0, "Particle", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_draw_as_items[] = {
+ {PART_DRAW_NOT, "NONE", 0, "None", ""},
+ {PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
+ {PART_DRAW_DOT, "DOT", 0, "Point", ""},
+ {PART_DRAW_CIRC, "CIRC", 0, "Circle", ""},
+ {PART_DRAW_CROSS, "CROSS", 0, "Cross", ""},
+ {PART_DRAW_AXIS, "AXIS", 0, "Axis", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_hair_draw_as_items[] = {
+ {PART_DRAW_NOT, "NONE", 0, "None", ""},
+ {PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
+ {PART_DRAW_PATH, "PATH", 0, "Path", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_ren_as_items[] = {
+ {PART_DRAW_NOT, "NONE", 0, "None", ""},
+ {PART_DRAW_HALO, "HALO", 0, "Halo", ""},
+ {PART_DRAW_LINE, "LINE", 0, "Line", ""},
+ {PART_DRAW_PATH, "PATH", 0, "Path", ""},
+ {PART_DRAW_OB, "OBJECT", 0, "Object", ""},
+ {PART_DRAW_GR, "GROUP", 0, "Group", ""},
+ {PART_DRAW_BB, "BILLBOARD", 0, "Billboard", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_hair_ren_as_items[] = {
+ {PART_DRAW_NOT, "NONE", 0, "None", ""},
+ {PART_DRAW_PATH, "PATH", 0, "Path", ""},
+ {PART_DRAW_OB, "OBJECT", 0, "Object", ""},
+ {PART_DRAW_GR, "GROUP", 0, "Group", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
#ifdef RNA_RUNTIME
#include "BKE_context.h"
+#include "BKE_cloth.h"
#include "BKE_depsgraph.h"
+#include "BKE_modifier.h"
#include "BKE_particle.h"
+#include "BKE_pointcache.h"
#include "BLI_arithb.h"
@@ -60,12 +117,14 @@ static void rna_Particle_redo(bContext *C, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_REDO;
if(ob)
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
part = ptr->id.data;
psys_flush_particle_settings(scene, part, PSYS_RECALC_REDO);
}
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
}
static void rna_Particle_reset(bContext *C, PointerRNA *ptr)
@@ -80,14 +139,63 @@ static void rna_Particle_reset(bContext *C, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET;
if(ob) {
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
else {
part = ptr->id.data;
psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET);
- //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+
+static void rna_Particle_target_reset(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+
+ if(ptr->type==&RNA_ParticleTarget) {
+ ParticleTarget *pt = (ParticleTarget*)ptr->data;
+ Object *ob = (Object*)ptr->id.data;
+ ParticleSystem *kpsys=NULL, *psys=psys_get_current(ob);
+
+ if(pt->ob==ob || pt->ob==NULL) {
+ kpsys = BLI_findlink(&ob->particlesystem, pt->psys-1);
+
+ if(kpsys)
+ pt->flag |= PTARGET_VALID;
+ else
+ pt->flag &= ~PTARGET_VALID;
+ }
+ else {
+ if(pt->ob)
+ kpsys = BLI_findlink(&pt->ob->particlesystem, pt->psys-1);
+
+ if(kpsys)
+ pt->flag |= PTARGET_VALID;
+ else
+ pt->flag &= ~PTARGET_VALID;
+ }
+
+ psys->recalc = PSYS_RECALC_RESET;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_scene_sort(scene);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+
+static void rna_Particle_target_redo(bContext *C, PointerRNA *ptr)
+{
+ if(ptr->type==&RNA_ParticleTarget) {
+ Object *ob = (Object*)ptr->id.data;
+ ParticleSystem *psys = psys_get_current(ob);
+
+ psys->recalc = PSYS_RECALC_REDO;
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
}
}
@@ -103,15 +211,23 @@ static void rna_Particle_change_type(bContext *C, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET|PSYS_RECALC_TYPE;
if(ob) {
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
- //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
}
else {
part = ptr->id.data;
psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET|PSYS_RECALC_TYPE);
- //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene);
}
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+
+static void rna_Particle_change_physics(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+ ParticleSettings *part = ptr->id.data;
+ psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET|PSYS_RECALC_PHYS);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
}
static void rna_Particle_redo_child(bContext *C, PointerRNA *ptr)
@@ -126,13 +242,67 @@ static void rna_Particle_redo_child(bContext *C, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_CHILD;
if(ob)
- DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
}
else {
part = ptr->id.data;
psys_flush_particle_settings(scene, part, PSYS_RECALC_CHILD);
}
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+static void rna_Particle_hair_dynamics(bContext *C, PointerRNA *ptr)
+{
+ /* Scene *scene = CTX_data_scene(C); */
+ ParticleSystem *psys = (ParticleSystem*)ptr->data;
+
+ if(psys && !psys->clmd) {
+ psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
+ psys->clmd->sim_parms->goalspring = 0.0f;
+ psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL|CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
+ psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
+ rna_Particle_redo(C, ptr);
+ }
+ else
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE_DATA, NULL);
+}
+static PointerRNA rna_particle_settings_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ ParticleSettings *part = psys_get_current(ob)->part;
+
+ return rna_pointer_inherit_refine(ptr, &RNA_ParticleSettings, part);
+}
+
+static void rna_particle_settings_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ ParticleSystem *psys = psys_get_current(ob);
+
+ if(psys->part)
+ psys->part->id.us--;
+
+ psys->part = (ParticleSettings *)value.data;
+
+ if(psys->part) {
+ psys->part->id.us++;
+ psys_check_boid_data(psys);
+ }
+}
+static void rna_Particle_abspathtime_update(bContext *C, PointerRNA *ptr)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ float delta = settings->end + settings->lifetime - settings->sta;
+ if(settings->draw & PART_ABS_PATH_TIME) {
+ settings->path_start = settings->sta + settings->path_start * delta;
+ settings->path_end = settings->sta + settings->path_end * delta;
+ }
+ else {
+ settings->path_start = (settings->path_start - settings->sta)/delta;
+ settings->path_end = (settings->path_end - settings->sta)/delta;
+ }
+ rna_Particle_redo(C, ptr);
}
static void rna_PartSettings_start_set(struct PointerRNA *ptr, float value)
{
@@ -142,10 +312,11 @@ static void rna_PartSettings_start_set(struct PointerRNA *ptr, float value)
if(value > settings->end)
value = settings->end;
- if(settings->type==PART_REACTOR && value < 1.0)
- value = 1.0;
- else if (value < -30000.0f) //TODO: replace 30000 with MAXFRAMEF when available in 2.5
- value = -30000.0f;
+ //if(settings->type==PART_REACTOR && value < 1.0)
+ // value = 1.0;
+ //else
+ if (value < MINAFRAMEF)
+ value = MINAFRAMEF;
settings->sta = value;
}
@@ -172,7 +343,19 @@ static float rna_PartSetting_linelentail_get(struct PointerRNA *ptr)
ParticleSettings *settings = (ParticleSettings*)ptr->data;
return settings->draw_line[0];
}
+static void rna_PartSetting_pathstartend_range(PointerRNA *ptr, float *min, float *max)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ if(settings->type==PART_HAIR) {
+ *min = 0.0f;
+ *max = (settings->draw & PART_ABS_PATH_TIME) ? 100.0f : 1.0;
+ }
+ else {
+ *min = (settings->draw & PART_ABS_PATH_TIME) ? settings->sta : 0.0f;
+ *max= (settings->draw & PART_ABS_PATH_TIME) ? MAXFRAMEF : 1.0f;
+ }
+}
static void rna_PartSetting_linelenhead_set(struct PointerRNA *ptr, float value)
{
ParticleSettings *settings = (ParticleSettings*)ptr->data;
@@ -185,34 +368,136 @@ static float rna_PartSetting_linelenhead_get(struct PointerRNA *ptr)
return settings->draw_line[1];
}
-static int rna_ParticleSystem_name_length(PointerRNA *ptr)
+static PointerRNA rna_ParticleSystem_active_particle_target_get(PointerRNA *ptr)
{
- ParticleSystem *psys= ptr->data;
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ ParticleTarget *pt = psys->targets.first;
+
+ for(; pt; pt=pt->next) {
+ if(pt->flag & PTARGET_CURRENT)
+ return rna_pointer_inherit_refine(ptr, &RNA_ParticleTarget, pt);
+ }
+ return rna_pointer_inherit_refine(ptr, &RNA_ParticleTarget, NULL);
+}
+static void rna_ParticleSystem_active_particle_target_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ *min= 0;
+ *max= BLI_countlist(&psys->targets)-1;
+ *max= MAX2(0, *max);
+}
+
+static int rna_ParticleSystem_active_particle_target_index_get(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ ParticleTarget *pt = psys->targets.first;
+ int i=0;
+
+ for(; pt; pt=pt->next, i++)
+ if(pt->flag & PTARGET_CURRENT)
+ return i;
- if(psys->part)
- return strlen(psys->part->id.name+2);
-
return 0;
}
-static void rna_ParticleSystem_name_get(PointerRNA *ptr, char *str)
+static void rna_ParticleSystem_active_particle_target_index_set(struct PointerRNA *ptr, int value)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ ParticleTarget *pt = psys->targets.first;
+ int i=0;
+
+ for(; pt; pt=pt->next, i++) {
+ if(i==value)
+ pt->flag |= PTARGET_CURRENT;
+ else
+ pt->flag &= ~PTARGET_CURRENT;
+ }
+}
+static int rna_ParticleTarget_name_length(PointerRNA *ptr)
{
- ParticleSystem *psys= ptr->data;
+ ParticleTarget *pt= ptr->data;
- if(psys->part)
- strcpy(str, psys->part->id.name+2);
+ if(pt->flag & PTARGET_VALID) {
+ ParticleSystem *psys = NULL;
+
+ if(pt->ob)
+ psys = BLI_findlink(&pt->ob->particlesystem, pt->psys-1);
+ else {
+ Object *ob = (Object*) ptr->id.data;
+ psys = BLI_findlink(&ob->particlesystem, pt->psys-1);
+ }
+
+ if(psys) {
+ if(pt->ob)
+ return strlen(pt->ob->id.name+2) + 2 + strlen(psys->name);
+ else
+ return strlen(psys->name);
+ }
+ else
+ return 15;
+ }
+ else
+ return 15;
+}
+
+static void rna_ParticleTarget_name_get(PointerRNA *ptr, char *str)
+{
+ ParticleTarget *pt= ptr->data;
+
+ if(pt->flag & PTARGET_VALID) {
+ ParticleSystem *psys = NULL;
+
+ if(pt->ob)
+ psys = BLI_findlink(&pt->ob->particlesystem, pt->psys-1);
+ else {
+ Object *ob = (Object*) ptr->id.data;
+ psys = BLI_findlink(&ob->particlesystem, pt->psys-1);
+ }
+
+ if(psys) {
+ if(pt->ob)
+ sprintf(str, "%s: %s", pt->ob->id.name+2, psys->name);
+ else
+ strcpy(str, psys->name);
+ }
+ else
+ strcpy(str, "Invalid target!");
+ }
else
- strcpy(str, "");
+ strcpy(str, "Invalid target!");
}
+static int rna_ParticleSystem_multiple_caches_get(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+
+ return (psys->ptcaches.first != psys->ptcaches.last);
+}
+static int rna_ParticleSystem_editable_get(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
-static EnumPropertyItem from_items[] = {
+ if(psys->part && psys->part->type==PART_HAIR)
+ return (psys->flag & PSYS_HAIR_DONE);
+ else
+ return (psys->pointcache->flag & PTCACHE_BAKED);
+}
+static int rna_ParticleSystem_edited_get(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+
+ if(psys->part && psys->part->type==PART_HAIR)
+ return (psys->flag & PSYS_EDITED || (psys->edit && psys->edit->edited));
+ else
+ return (psys->pointcache->edit && psys->pointcache->edit->edited);
+}
+EnumPropertyItem from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Vertexes", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem reactor_from_items[] = {
+EnumPropertyItem reactor_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Vertexes", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
@@ -220,70 +505,76 @@ static EnumPropertyItem reactor_from_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem *rna_Particle_from_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, int *free)
{
- ParticleSettings *part = ptr->id.data;
+ /* ParticleSettings *part = ptr->id.data; */
- if(part->type==PART_REACTOR)
- return reactor_from_items;
- else
- return from_items;
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, part_reactor_from_items);
+ RNA_enum_items_add(&item, &totitem, part_from_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
+ //if(part->type==PART_REACTOR)
+ // return part_reactor_from_items;
+ //else
+ return part_from_items;
}
-static EnumPropertyItem draw_as_items[] = {
- {PART_DRAW_NOT, "NONE", 0, "None", ""},
- {PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
- {PART_DRAW_DOT, "DOT", 0, "Point", ""},
- {PART_DRAW_CIRC, "CIRC", 0, "Circle", ""},
- {PART_DRAW_CROSS, "CROSS", 0, "Cross", ""},
- {PART_DRAW_AXIS, "AXIS", 0, "Axis", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static EnumPropertyItem hair_draw_as_items[] = {
- {PART_DRAW_NOT, "NONE", 0, "None", ""},
- {PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
- {PART_DRAW_PATH, "PATH", 0, "Path", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static EnumPropertyItem ren_as_items[] = {
- {PART_DRAW_NOT, "NONE", 0, "None", ""},
- {PART_DRAW_HALO, "HALO", 0, "Halo", ""},
- {PART_DRAW_LINE, "LINE", 0, "Line", ""},
- {PART_DRAW_PATH, "PATH", 0, "Path", ""},
- {PART_DRAW_OB, "OBJECT", 0, "Object", ""},
- {PART_DRAW_GR, "GROUP", 0, "Group", ""},
- {PART_DRAW_BB, "BILLBOARD", 0, "Billboard", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static EnumPropertyItem hair_ren_as_items[] = {
- {PART_DRAW_NOT, "NONE", 0, "None", ""},
- {PART_DRAW_PATH, "PATH", 0, "Path", ""},
- {PART_DRAW_OB, "OBJECT", 0, "Object", ""},
- {PART_DRAW_GR, "GROUP", 0, "Group", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
-static EnumPropertyItem *rna_Particle_draw_as_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_Particle_draw_as_itemf(bContext *C, PointerRNA *ptr, int *free)
{
ParticleSettings *part = ptr->id.data;
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, part_hair_draw_as_items);
+ RNA_enum_items_add(&item, &totitem, part_draw_as_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
if(part->type==PART_HAIR)
- return hair_draw_as_items;
+ return part_hair_draw_as_items;
else
- return draw_as_items;
+ return part_draw_as_items;
}
-static EnumPropertyItem *rna_Particle_ren_as_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_Particle_ren_as_itemf(bContext *C, PointerRNA *ptr, int *free)
{
ParticleSettings *part = ptr->id.data;
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, part_hair_ren_as_items);
+ RNA_enum_items_add(&item, &totitem, part_ren_as_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+
if(part->type==PART_HAIR)
- return hair_ren_as_items;
+ return part_hair_ren_as_items;
else
- return ren_as_items;
+ return part_ren_as_items;
}
@@ -298,7 +589,7 @@ static void rna_def_particle_hair_key(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "HairKey");
RNA_def_struct_ui_text(srna, "Particle Hair Key", "Particle key for hair particle system.");
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "co");
RNA_def_property_ui_text(prop, "Location", "Key location.");
@@ -317,19 +608,19 @@ static void rna_def_particle_key(BlenderRNA *brna)
srna = RNA_def_struct(brna, "ParticleKey", NULL);
RNA_def_struct_ui_text(srna, "Particle Key", "Key location for a particle over time.");
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "co");
RNA_def_property_ui_text(prop, "Location", "Key location.");
- prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "vel");
RNA_def_property_ui_text(prop, "Velocity", "Key velocity");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_ui_text(prop, "Rotation", "Key rotation quaterion.");
- prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "ave");
RNA_def_property_ui_text(prop, "Angular Velocity", "Key angular velocity.");
@@ -371,80 +662,78 @@ static void rna_def_particle(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ParticleData");
RNA_def_struct_ui_text(srna, "Particle", "Particle in a particle system.");
- prop= RNA_def_property(srna, "stick_object", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "stick_ob");
- RNA_def_property_struct_type(prop, "Object");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Stick Object", "Object that particle sticks to when dead");
+ /* Particle State & Previous State */
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
+ RNA_def_property_float_sdna(prop, NULL, "state.co");
+ RNA_def_property_ui_text(prop, "Particle Location", "");
-// ParticleKey state; /* normally current global coordinates or */
-// /* in sticky object space if dead & sticky */
-//
-// ParticleKey prev_state; /* previous state */
+ prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_VELOCITY);
+ RNA_def_property_float_sdna(prop, NULL, "state.vel");
+ RNA_def_property_ui_text(prop, "Particle Velocity", "");
-// prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE);
-// RNA_def_property_collection_sdna(prop, NULL, "hair", "???totalHair???"); //don't know what the hair array size is
-// RNA_def_property_struct_type(prop, "HairKey");
-// RNA_def_property_ui_text(prop, "Hair", "");
+ prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_VELOCITY);
+ RNA_def_property_float_sdna(prop, NULL, "state.ave");
+ RNA_def_property_ui_text(prop, "Angular Velocity", "");
- prop= RNA_def_property(srna, "keys", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "keys", "totkey");
- RNA_def_property_struct_type(prop, "ParticleKey");
- RNA_def_property_ui_text(prop, "Keyed States", "");
+ prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
+ RNA_def_property_float_sdna(prop, NULL, "state.rot");
+ RNA_def_property_ui_text(prop, "Rotation", "");
- prop= RNA_def_property(srna, "random_rotation", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "r_rot");
-// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Random Rotation", "");
+ prop= RNA_def_property(srna, "prev_location", PROP_FLOAT, PROP_TRANSLATION);
+ RNA_def_property_float_sdna(prop, NULL, "prev_state.co");
+ RNA_def_property_ui_text(prop, "Previous Particle Location", "");
- prop= RNA_def_property(srna, "random_a_velocity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "r_ave");
-// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Random erm.. Velocity", "");//TODO: fix name
+ prop= RNA_def_property(srna, "prev_velocity", PROP_FLOAT, PROP_VELOCITY);
+ RNA_def_property_float_sdna(prop, NULL, "prev_state.vel");
+ RNA_def_property_ui_text(prop, "Previous Particle Velocity", "");
- prop= RNA_def_property(srna, "random_velocity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "r_ve");//optional if prop names are the same
-// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Random Velocity", "");
+ prop= RNA_def_property(srna, "prev_angular_velocity", PROP_FLOAT, PROP_VELOCITY);
+ RNA_def_property_float_sdna(prop, NULL, "prev_state.ave");
+ RNA_def_property_ui_text(prop, "Previous Angular Velocity", "");
+
+ prop= RNA_def_property(srna, "prev_rotation", PROP_FLOAT, PROP_QUATERNION);
+ RNA_def_property_float_sdna(prop, NULL, "prev_state.rot");
+ RNA_def_property_ui_text(prop, "Previous Rotation", "");
+
+ /* Hair & Keyed Keys */
+ 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", "");
+
+ prop= RNA_def_property(srna, "keys", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "keys", "totkey");
+ RNA_def_property_struct_type(prop, "ParticleKey");
+ RNA_def_property_ui_text(prop, "Keyed States", "");
//
// float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
// /* face normal for volume emission */
- prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "birthtime", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "time");
// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Time", "");
+ RNA_def_property_ui_text(prop, "Birth Time", "");
- prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_TIME);
// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
RNA_def_property_ui_text(prop, "Lifetime", "");
- prop= RNA_def_property(srna, "die_time", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "die_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "dietime");
// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
RNA_def_property_ui_text(prop, "Die Time", "");
- prop= RNA_def_property(srna, "banking_angle", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "bank");
-// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Banking Angle", "");
-
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
RNA_def_property_ui_text(prop, "Size", "");
- prop= RNA_def_property(srna, "size_multiplier", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "sizemul");
-// RNA_def_property_range(prop, lowerLimitf, upperLimitf);
- RNA_def_property_ui_text(prop, "Size Multiplier", "");
-
//
// int num; /* index to vert/edge/face */
// int num_dmcache; /* index to derived mesh data (face) to avoid slow lookups */
// int pad;
//
// int totkey;
-// int bpi; /* softbody body point start index */
/* flag */
prop= RNA_def_property(srna, "unexist", PROP_BOOLEAN, PROP_NONE);
@@ -455,31 +744,10 @@ static void rna_def_particle(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_NO_DISP);
RNA_def_property_ui_text(prop, "no_disp", "");
- prop= RNA_def_property(srna, "sticky", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_STICKY);
- RNA_def_property_ui_text(prop, "sticky", "");
-
- prop= RNA_def_property(srna, "transform", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_TRANSFORM);
- RNA_def_property_ui_text(prop, "transform", "");
-
- prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_HIDE);
- RNA_def_property_ui_text(prop, "hide", "");
-
- prop= RNA_def_property(srna, "tag", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_TAG);
- RNA_def_property_ui_text(prop, "tag", "");
-
prop= RNA_def_property(srna, "rekey", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_REKEY);
RNA_def_property_ui_text(prop, "rekey", "");
- prop= RNA_def_property(srna, "edit_recalc", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PARS_EDIT_RECALC);
- RNA_def_property_ui_text(prop, "edit_recalc", "");
-
-
prop= RNA_def_property(srna, "alive_state", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "alive");
RNA_def_property_enum_items(prop, alive_items);
@@ -500,7 +768,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
static EnumPropertyItem type_items[] = {
{PART_EMITTER, "EMITTER", 0, "Emitter", ""},
- {PART_REACTOR, "REACTOR", 0, "Reactor", ""},
+ //{PART_REACTOR, "REACTOR", 0, "Reactor", ""},
{PART_HAIR, "HAIR", 0, "Hair", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -617,18 +885,21 @@ static void rna_def_particle_settings(BlenderRNA *brna)
/* flag */
prop= RNA_def_property(srna, "react_start_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_STA_END);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Start/End", "Give birth to unreacted particles eventually.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "react_multiple", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_MULTIPLE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Multi React", "React multiple times.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "loop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_LOOP);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Loop", "Loop particle lives.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* TODO: used somewhere? */
prop= RNA_def_property(srna, "hair_geometry", PROP_BOOLEAN, PROP_NONE);
@@ -638,102 +909,88 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "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.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "died", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_DIED);
RNA_def_property_ui_text(prop, "Died", "Show particles after they have died");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "trand", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_TRAND);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Random", "Emit in random order of elements");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "even_distribution", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_EDISTR);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Even Distribution", "Use even distribution from faces based on face areas or edge lengths.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "sticky", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_STICKY);
- RNA_def_property_ui_text(prop, "Sticky", "Particles stick to collided objects if they die in the collision.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
prop= RNA_def_property(srna, "die_on_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_DIE_ON_COL);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Die on hit", "Particles die when they collide with a deflector object.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "size_deflect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SIZE_DEFL);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Size Deflect", "Use particle's size in deflection.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "rotation_dynamic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ROT_DYN);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Dynamic", "Sets rotation to dynamic/constant");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "sizemass", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SIZEMASS);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Mass from Size", "Multiply mass with particle size.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "abs_length", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ABS_LENGTH);
- RNA_def_property_ui_text(prop, "Abs Length", "Use maximum length for children");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
- prop= RNA_def_property(srna, "absolute_time", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ABS_TIME);
- RNA_def_property_ui_text(prop, "Absolute Time", "Set all ipos that work on particles to be calculated in absolute/relative time.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "global_time", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_GLOB_TIME);
- RNA_def_property_ui_text(prop, "Global Time", "Set all ipos that work on particles to be calculated in global/object time.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "boids_2d", 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, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "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, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "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, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "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, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "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.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "grid_invert", 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_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "child_effector", 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_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ 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, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ //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");
/* TODO: used somewhere? */
prop= RNA_def_property(srna, "child_render", PROP_BOOLEAN, PROP_NONE);
@@ -743,174 +1000,176 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "child_guide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_GUIDE);
RNA_def_property_ui_text(prop, "child_guide", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "self_effect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SELF_EFFECT);
RNA_def_property_ui_text(prop, "Self Effect", "Particle effectors effect themselves.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, type_items);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_ui_text(prop, "Type", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_change_type");
+ RNA_def_property_update(prop, 0, "rna_Particle_change_type");
prop= RNA_def_property(srna, "emit_from", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "from");
+ RNA_def_property_enum_items(prop, part_reactor_from_items);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_from_itemf");
RNA_def_property_ui_text(prop, "Emit From", "Where to emit particles from");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "distr");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_items(prop, dist_items);
RNA_def_property_ui_text(prop, "Distribution", "How to distribute particles on selected element");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* physics modes */
prop= RNA_def_property(srna, "physics_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "phystype");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_items(prop, phys_type_items);
RNA_def_property_ui_text(prop, "Physics Type", "Particle physics type");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_change_physics");
prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rotmode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_items(prop, rot_mode_items);
RNA_def_property_ui_text(prop, "Rotation", "Particles initial rotation");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "angular_velocity_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "avemode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_items(prop, ave_mode_items);
RNA_def_property_ui_text(prop, "Angular Velocity Mode", "Particle angular velocity mode.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "react_event", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "reactevent");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_enum_items(prop, react_event_items);
RNA_def_property_ui_text(prop, "React On", "The event of target particles to react on.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/*draw flag*/
prop= RNA_def_property(srna, "velocity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_VEL);
RNA_def_property_ui_text(prop, "Velocity", "Show particle velocity");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
- //prop= RNA_def_property(srna, "draw_path_length", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_PATH_LEN);
- //RNA_def_property_ui_text(prop, "Path length", "Draw path length");
- //RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "show_size", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_SIZE);
RNA_def_property_ui_text(prop, "Size", "Show particle size");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "emitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_EMITTER);
RNA_def_property_ui_text(prop, "Emitter", "Render emitter Object also.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //prop= RNA_def_property(srna, "draw_health", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_HEALTH);
- //RNA_def_property_ui_text(prop, "Health", "Draw boid health");
- //RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ prop= RNA_def_property(srna, "draw_health", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_HEALTH);
+ RNA_def_property_ui_text(prop, "Health", "Draw boid health");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //prop= RNA_def_property(srna, "timed_path", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_TIMED_PATH);
- //RNA_def_property_ui_text(prop, "Clip with time", "Clip path based on time");
- //RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
- //prop= RNA_def_property(srna, "draw_cached_path", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_CACHED_PATH);
- //RNA_def_property_ui_text(prop, "Path", "Draw particle path if the path is baked");
- //RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ prop= RNA_def_property(srna, "abs_path_time", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_ABS_PATH_TIME);
+ RNA_def_property_ui_text(prop, "Absolute Path Time", "Path timing is in absolute frames");
+ RNA_def_property_update(prop, 0, "rna_Particle_abspathtime_update");
prop= RNA_def_property(srna, "billboard_lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_BB_LOCK);
RNA_def_property_ui_text(prop, "Lock Billboard", "Lock the billboards align axis");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "parent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_PARENT);
RNA_def_property_ui_text(prop, "Parents", "Render parent particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "num", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_NUM);
RNA_def_property_ui_text(prop, "Number", "Show particle number");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "rand_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_RAND_GR);
RNA_def_property_ui_text(prop, "Pick Random", "Pick objects from group randomly");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "render_adaptive", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_REN_ADAPT);
RNA_def_property_ui_text(prop, "Adaptive render", "Draw steps of the particle path");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "velocity_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_VEL_LENGTH);
RNA_def_property_ui_text(prop, "Speed", "Multiply line length by particle speed");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "material_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_MAT_COL);
RNA_def_property_ui_text(prop, "Material Color", "Draw particles using material's diffuse color.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "whole_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_WHOLE_GR);
RNA_def_property_ui_text(prop, "Whole Group", "Use whole group at once.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "render_strand", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_REN_STRAND);
RNA_def_property_ui_text(prop, "Strand render", "Use the strand primitive for rendering");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "draw_as", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "draw_as");
+ RNA_def_property_enum_items(prop, part_draw_as_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_draw_as_itemf");
RNA_def_property_ui_text(prop, "Particle Drawing", "How particles are drawn in viewport");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "ren_as", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "ren_as");
+ RNA_def_property_enum_items(prop, part_ren_as_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_ren_as_itemf");
RNA_def_property_ui_text(prop, "Particle Rendering", "How particles are rendered");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "draw_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in pixels (0=default)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "child_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "childtype");
RNA_def_property_enum_items(prop, child_type_items);
RNA_def_property_ui_text(prop, "Children From", "Create child particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 7);
+ RNA_def_property_ui_range(prop, 0, 10, 1, 0);
RNA_def_property_ui_text(prop, "Steps", "How many steps paths are drawn with (power of 2)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "render_step", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ren_step");
RNA_def_property_range(prop, 0, 9);
+ RNA_def_property_ui_range(prop, 0, 20, 1, 0);
RNA_def_property_ui_text(prop, "Render", "How many steps paths are rendered with (power of 2)");
prop= RNA_def_property(srna, "hair_step", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 2, 50);
RNA_def_property_ui_text(prop, "Segments", "Number of hair segments");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
//TODO: not found in UI, readonly?
@@ -933,17 +1192,14 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "disp");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Display", "Percentage of particles to display in 3d view");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "material", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "omat");
RNA_def_property_range(prop, 1, 16);
RNA_def_property_ui_text(prop, "Material", "Specify material used for the particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //interpolation
- //TODO: can't find where interpolation is used
//TODO: is this read only/internal?
prop= RNA_def_property(srna, "rotate_from", PROP_ENUM, PROP_NONE);
@@ -954,41 +1210,29 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "integrator", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, integrator_type_items);
RNA_def_property_ui_text(prop, "Integration", "Select physics integrator type");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "kink", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, kink_type_items);
RNA_def_property_ui_text(prop, "Kink", "Type of periodic offset on the path");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "kink_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, kink_axis_items);
RNA_def_property_ui_text(prop, "Axis", "Which axis to use for offset");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
-
- /* used?
- prop= RNA_def_property(srna, "inbetween", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "nbetween");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_text(prop, "Inbetween", "");
- */
-
- prop= RNA_def_property(srna, "boid_neighbours", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "boidneighbours");
- RNA_def_property_range(prop, 1, 10);
- RNA_def_property_ui_text(prop, "Neighbours", "How many neighbours to consider for each boid");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* billboards */
prop= RNA_def_property(srna, "billboard_align", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bb_align");
RNA_def_property_enum_items(prop, bb_align_items);
RNA_def_property_ui_text(prop, "Align to", "In respect to what the billboards are aligned");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "billboard_uv_split", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "bb_uv_split");
- RNA_def_property_range(prop, 1, 10);
+ RNA_def_property_range(prop, 1, 100);
+ RNA_def_property_ui_range(prop, 1, 10, 1, 0);
RNA_def_property_ui_text(prop, "UV Split", "Amount of rows/columns to split uv coordinates for billboards");
prop= RNA_def_property(srna, "billboard_animation", PROP_ENUM, PROP_NONE);
@@ -1005,20 +1249,21 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "bb_tilt");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Tilt", "Tilt of the billboards");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "billboard_random_tilt", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bb_rand_tilt");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Tilt", "Random tilt of the billboards");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "billboard_offset", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "billboard_offset", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "bb_offset");
RNA_def_property_array(prop, 2);
- RNA_def_property_range(prop, -1.0f, 1.0f);
+ RNA_def_property_range(prop, -100.0f, 100.0f);
+ RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3);
RNA_def_property_ui_text(prop, "Billboard Offset", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* simplification */
prop= RNA_def_property(srna, "enable_simplify", PROP_BOOLEAN, PROP_NONE);
@@ -1049,427 +1294,503 @@ static void rna_def_particle_settings(BlenderRNA *brna)
/* general values */
prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sta");//optional if prop names are the same
- RNA_def_property_range(prop, -30000.0f, 30000.0f); //TODO: replace 30000 with MAXFRAMEF when available in 2.5
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_float_funcs(prop, NULL, "rna_PartSettings_start_set", NULL);
RNA_def_property_ui_text(prop, "Start", "Frame # to start emitting particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "end", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, -30000.0f, 30000.0f); //TODO: replace 30000 with MAXFRAMEF when available in 2.5
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
+
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_float_funcs(prop, NULL, "rna_PartSettings_end_set", NULL);
RNA_def_property_ui_text(prop, "End", "Frame # to stop emitting particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 1.0f, 30000.0f);
+ prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_range(prop, 1.0f, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Lifetime", "Specify the life span of the particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "random_lifetime", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randlife");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random", "Give the particle life a random variation.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "time_tweak", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "timetweak");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Tweak", "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "jitter_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_float_sdna(prop, NULL, "jitfac");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Amount", "Amount of jitter applied to the sampling.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "keyed_time", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Time", "Keyed key time relative to remaining particle life.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "effect_hair", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "eff_hair");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Stiffnes", "Hair stiffness for effectors");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
- //float rt; TODO:find where rt is used - can't find it in UI
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "amount", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "totpart");
- RNA_def_property_range(prop, 0, 100000);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ /* This limit is for those freaks who have the machine power to handle it. */
+ /* 10M particles take around 2.2 Gb of memory / disk space in saved file and */
+ /* each cached frame takes around 0.5 Gb of memory / disk space depending on cache mode. */
+ RNA_def_property_range(prop, 0, 10000000);
+ RNA_def_property_ui_range(prop, 0, 100000, 1, 0);
RNA_def_property_ui_text(prop, "Amount", "Total number of particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "userjit", PROP_INT, PROP_UNSIGNED);//TODO: can we get a better name for userjit?
RNA_def_property_int_sdna(prop, NULL, "userjit");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_text(prop, "P/F", "Emission locations / face (0 = automatic).");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "grid_resolution", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "grid_res");
- RNA_def_property_range(prop, 1, 100);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ 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_ui_text(prop, "Resolution", "The resolution of the particle grid.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ 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
RNA_def_property_range(prop, -200.0f, 200.0f);
RNA_def_property_ui_text(prop, "Normal", "Let the surface normal give the particle a starting speed.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "object_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "obfac");
- RNA_def_property_range(prop, -1.0f, 1.0f);
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Object", "Let the object give the particle a starting speed");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "random_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randfac");//optional if prop names are the same
RNA_def_property_range(prop, 0.0f, 200.0f);
RNA_def_property_ui_text(prop, "Random", "Give the starting speed a random variation.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "particle_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "partfac");
- RNA_def_property_range(prop, -10.0f, 10.0f);
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Particle", "Let the target particle give the particle a starting speed.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "tangent_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "tanfac");
RNA_def_property_range(prop, -200.0f, 200.0f);
RNA_def_property_ui_text(prop, "Tangent", "Let the surface tangent give the particle a starting speed.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "tangent_phase", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "tanphase");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Rot", "Rotate the surface tangent.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "reactor_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "reactfac");
RNA_def_property_range(prop, -10.0f, 10.0f);
RNA_def_property_ui_text(prop, "Reactor", "Let the vector away from the target particles location give the particle a starting speed.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "angular_velocity_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "avefac");
RNA_def_property_range(prop, -200.0f, 200.0f);
RNA_def_property_ui_text(prop, "Angular Velocity", "Angular velocity amount");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "phase_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "phasefac");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Phase", "Initial rotation phase");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "random_rotation_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randrotfac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Rotation", "Randomize rotation");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "random_phase_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randphasefac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Phase", "Randomize rotation phase");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ 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.01f, 100.0f);
+ RNA_def_property_range(prop, 0.001f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Mass", "Specify the mass of the particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "particle_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "size");
- RNA_def_property_range(prop, 0.01f, 100.0f);
+ RNA_def_property_range(prop, 0.001f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Size", "The size of the particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "random_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randsize");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Size", "Give the particle size a random variation");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "reaction_shape", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "reactshape");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Shape", "Power of reaction strength dependence on distance to target.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* global physical properties */
- prop= RNA_def_property(srna, "acceleration", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "acceleration", PROP_FLOAT, PROP_ACCELERATION);
RNA_def_property_float_sdna(prop, NULL, "acc");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -200.0f, 200.0f);
- RNA_def_property_ui_text(prop, "Accelaration", "Constant acceleration");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_ui_text(prop, "Acceleration", "Constant acceleration");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
+ RNA_def_property_float_sdna(prop, NULL, "acc[2]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_text(prop, "Gravity", "Constant acceleration in global Z axis direction");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "drag_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dragfac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Drag", "Specify the amount of air-drag.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "brownian_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "brownfac");
RNA_def_property_range(prop, 0.0f, 200.0f);
RNA_def_property_ui_text(prop, "Brownian", "Specify the amount of brownian motion");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "damp_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dampfac");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Damp", "Specify the amount of damping");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- /* length */
- //TODO: is this readonly?
- prop= RNA_def_property(srna, "length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "length");
-// RNA_def_property_range(prop, 0.0f, upperLimitf);//TODO: limits
- RNA_def_property_ui_text(prop, "Length", "");
-
- prop= RNA_def_property(srna, "absolute_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "abslength");
- RNA_def_property_range(prop, 0.0f, 10000.0f);
- RNA_def_property_ui_text(prop, "Max Length", "Absolute maximum path length for children, in blender units.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ /* random length */
prop= RNA_def_property(srna, "random_length", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "randlength");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Length", "Give path length a random variation.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
/* children */
prop= RNA_def_property(srna, "child_nbr", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "child_nbr");//optional if prop names are the same
- RNA_def_property_range(prop, 0, MAX_PART_CHILDREN);
+ RNA_def_property_range(prop, 0, 100000);
+ RNA_def_property_ui_range(prop, 0, 1000, 1, 0);
RNA_def_property_ui_text(prop, "Children Per Parent", "Amount of children/parent");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rendered_child_nbr", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr");
- RNA_def_property_range(prop, 0, MAX_PART_CHILDREN);
+ RNA_def_property_range(prop, 0, 100000);
+ RNA_def_property_ui_range(prop, 0, 10000, 1, 0);
RNA_def_property_ui_text(prop, "Rendered Children", "Amount of children/parent for rendering.");
prop= RNA_def_property(srna, "virtual_parents", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "parents");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Virtual Parents", "Relative amount of virtual parents.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "child_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "childsize");
- RNA_def_property_range(prop, 0.01f, 100.0f);
+ RNA_def_property_range(prop, 0.001f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Child Size", "A multiplier for the child particle size.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "child_random_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "childrandsize");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Random Child Size", "Random variation to the size of the child particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "child_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "childrad");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Child Radius", "Radius of children around parent.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "child_roundness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "childflat");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Child Roundness", "Roundness of children around parent.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
-
- //TODO: is this readonly?
- prop= RNA_def_property(srna, "child_spread", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "childspread");
-// RNA_def_property_range(prop, 0.0f, upperLimitf); TODO: limits
- RNA_def_property_ui_text(prop, "Child Spread", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* clumping */
prop= RNA_def_property(srna, "clump_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "clumpfac");
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Clump", "Amount of clumping");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "clumppow", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "clumppow");
RNA_def_property_range(prop, -0.999f, 0.999f);
RNA_def_property_ui_text(prop, "Shape", "Shape of clumping");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* kink */
prop= RNA_def_property(srna, "kink_amplitude", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "kink_amp");
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, -100000.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ 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, 0.0f, 10.0f);
+ RNA_def_property_range(prop, -100000.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Frequency", "The frequency of the offset (1/total length)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "kink_shape", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -0.999f, 0.999f);
RNA_def_property_ui_text(prop, "Shape", "Adjust the offset to the beginning/end");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* rough */
prop= RNA_def_property(srna, "rough1", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough1", "Amount of location dependent rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough1_size", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.01f, 10.0f);
+ RNA_def_property_range(prop, 0.01f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Size1", "Size of location dependent rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough2", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2");
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough2", "Amount of random rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough2_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2_size");
- RNA_def_property_range(prop, 0.01f, 10.0f);
+ RNA_def_property_range(prop, 0.01f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Size2", "Size of random rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough2_thres", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough2_thres");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Amount of particles left untouched by random rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough_endpoint", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rough_end");
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Rough Endpoint", "Amount of end point rough.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "rough_end_shape", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Shape", "Shape of end point rough");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_length", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "clength");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Length", "Length of child paths");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_length_thres", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "clength_thres");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ 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");
/* branching */
prop= RNA_def_property(srna, "branch_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "branch_thres");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Threshold of branching.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* drawing stuff */
prop= RNA_def_property(srna, "line_length_tail", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_PartSetting_linelentail_get", "rna_PartSetting_linelentail_set", NULL);
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Back", "Length of the line's tail");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "line_length_head", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_PartSetting_linelenhead_get", "rna_PartSetting_linelenhead_set", NULL);
- RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_range(prop, 0.0f, 100000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Head", "Length of the line's head");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ prop= RNA_def_property(srna, "path_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "path_start");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_PartSetting_pathstartend_range");
+ RNA_def_property_ui_text(prop, "Path Start", "Starting time of drawn path.");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ prop= RNA_def_property(srna, "path_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "path_end");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_PartSetting_pathstartend_range");
+ RNA_def_property_ui_text(prop, "Path End", "End time of drawn path.");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ prop= RNA_def_property(srna, "trail_count", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "trail_count");
+ RNA_def_property_range(prop, 1, 100000);
+ RNA_def_property_ui_range(prop, 1, 100, 1, 0);
+ RNA_def_property_ui_text(prop, "Trail Count", "Number of trail particles.");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ /* keyed particles */
+ prop= RNA_def_property(srna, "keyed_loops", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "keyed_loops");
+ RNA_def_property_range(prop, 1.0f, 10000.0f);
+ 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, "max_velocity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_vel");
- RNA_def_property_range(prop, 0.0f, 200.0f);
- RNA_def_property_ui_text(prop, "Maximum Velocity", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "lateral_acceleration_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_lat_acc");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Lateral Acceleration", "Lateral acceleration % of max velocity");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "tangential_acceleration_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_tan_acc");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Tangential acceleration", "Tangential acceleration % of max velocity");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "average_velocity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "average_vel");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Average Velocity", "The usual speed % of max velocity");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "banking", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, -10.0f, 10.0f);
- RNA_def_property_ui_text(prop, "Banking", "Banking of boids on turns (1.0==natural banking)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "banking_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_bank");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Maximum Banking", "How much a boid can bank at a single step");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- prop= RNA_def_property(srna, "ground_z", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "groundz");
- RNA_def_property_range(prop, -100.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Ground Z", "Default Z value");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- /*TODO: not sure how to deal with this
- prop= RNA_def_property(srna, "boid_factor", PROP_FLOAT, PROP_VECTOR);
- RNA_def_property_float_sdna(prop, NULL, "boidfac");
- RNA_def_property_ui_text(prop, "Boid Factor", "");
+ 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", "");
- //char boidrule[8];
- */
+ /* draw objects & groups */
prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "dup_group");
RNA_def_property_struct_type(prop, "Group");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dupli Group", "Show Objects in this Group in place of particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
-
- prop= RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
- RNA_def_property_struct_type(prop, "Group");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "dupli_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "dup_ob");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Dupli Object", "Show this Object in place of particles.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "billboard_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bb_ob");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Billboard Object", "Billboards face this object (default is active camera)");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ /* effectors */
+ prop= RNA_def_property(srna, "effector_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_all", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[0]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "All", "All effector's weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_spherical", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[1]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Spherical", "Spherical effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_vortex", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[2]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Vortex", "Vortex effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_magnetic", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[3]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Magnetic", "Magnetic effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_wind", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[4]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Wind", "Wind effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_curveguide", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[5]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Curve Guide", "Curve guide effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_texture", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[6]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Texture", "Texture effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_harmonic", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[7]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Harmonic", "Harmonic effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_charge", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[8]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Charge", "Charge effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "eweight_lennardjones", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "effector_weight[9]");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Lennard-Jones", "Lennard-Jones effector weight.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* animation here? */
rna_def_animdata_common(srna);
@@ -1478,6 +1799,64 @@ static void rna_def_particle_settings(BlenderRNA *brna)
// struct PartDeflect *pd2;
}
+static void rna_def_particle_target(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem mode_items[] = {
+ {PTARGET_MODE_FRIEND, "FRIEND", 0, "Friend", ""},
+ {PTARGET_MODE_NEUTRAL, "NEUTRAL", 0, "Neutral", ""},
+ {PTARGET_MODE_ENEMY, "ENEMY", 0, "Enemy", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+
+ srna = RNA_def_struct(brna, "ParticleTarget", NULL);
+ RNA_def_struct_ui_text(srna, "Particle Target", "Target particle system.");
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_ParticleTarget_name_get", "rna_ParticleTarget_name_length", NULL);
+ RNA_def_property_ui_text(prop, "Name", "Particle target name.");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_struct_name_property(srna, prop);
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "ob");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Target Object", "The object that has the target particle system (empty if same object).");
+ RNA_def_property_update(prop, 0, "rna_Particle_target_reset");
+
+ prop= RNA_def_property(srna, "system", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "psys");
+ RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_ui_text(prop, "Target Particle System", "The index of particle system on the target object.");
+ RNA_def_property_update(prop, 0, "rna_Particle_target_reset");
+
+ prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_TIME);
+ RNA_def_property_float_sdna(prop, NULL, "time");
+ RNA_def_property_range(prop, 0.0, 30000.0f); //TODO: replace 30000 with MAXFRAMEF when available in 2.5
+ RNA_def_property_ui_text(prop, "Time", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_target_redo");
+
+ prop= RNA_def_property(srna, "duration", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "duration");
+ RNA_def_property_range(prop, 0.0, 30000.0f); //TODO: replace 30000 with MAXFRAMEF when available in 2.5
+ RNA_def_property_ui_text(prop, "Duration", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_target_redo");
+
+ prop= RNA_def_property(srna, "valid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PTARGET_VALID);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_ui_text(prop, "Valid", "Keyed particles target is valid.");
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, mode_items);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_target_reset");
+
+}
static void rna_def_particle_system(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1488,14 +1867,18 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA);
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_string_funcs(prop, "rna_ParticleSystem_name_get", "rna_ParticleSystem_name_length", NULL);
RNA_def_property_ui_text(prop, "Name", "Particle system name.");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "part");
+ /* access to particle settings is redirected through functions */
+ /* to allow proper id-buttons functionality */
+ prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+ //RNA_def_property_pointer_sdna(prop, NULL, "part");
+ RNA_def_property_struct_type(prop, "ParticleSettings");
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
+ RNA_def_property_pointer_funcs(prop, "rna_particle_settings_get", "rna_particle_settings_set", NULL);
RNA_def_property_ui_text(prop, "Settings", "Particle system settings.");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "particles", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "particles", "totpart");
@@ -1509,64 +1892,59 @@ static void rna_def_particle_system(BlenderRNA *brna)
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
RNA_def_property_ui_text(prop, "Seed", "Offset in the random number table, to get a different randomized result.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* hair */
- prop= RNA_def_property(srna, "softbody", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "soft");
- RNA_def_property_ui_text(prop, "Soft Body", "Soft body settings for hair physics simulation.");
+ prop= RNA_def_property(srna, "global_hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_GLOBAL_HAIR);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Global Hair", "Hair keys are in global coordinate space");
- prop= RNA_def_property(srna, "use_softbody", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "softflag", OB_SB_ENABLE);
- RNA_def_property_ui_text(prop, "Use Soft Body", "Enable use of soft body for hair physics simulation.");
+ prop= RNA_def_property(srna, "hair_dynamics", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_HAIR_DYNAMICS);
+ RNA_def_property_ui_text(prop, "Hair Dynamics", "Enable hair dynamics using cloth simulation.");
+ RNA_def_property_update(prop, 0, "rna_Particle_hair_dynamics");
- prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_EDITED);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* various checks needed */
- RNA_def_property_ui_text(prop, "Editable", "For hair particle systems, finalize the hair to enable editing.");
+ prop= RNA_def_property(srna, "cloth", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "clmd");
+ RNA_def_property_struct_type(prop, "ClothModifier");
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Cloth", "Cloth dynamics for hair");
/* reactor */
prop= RNA_def_property(srna, "reactor_target_object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "target_ob");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Reactor Target Object", "For reactor systems, the object that has the target particle system (empty if same object).");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
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_ui_text(prop, "Reactor Target Particle System", "For reactor systems, index of particle system on the target object.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
-
- /* boids */
- prop= RNA_def_property(srna, "boids_surface_object", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "keyed_ob");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Boids Surface Object", "For boids physics systems, constrain boids to this object's surface.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* keyed */
- prop= RNA_def_property(srna, "keyed_object", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_sdna(prop, NULL, "keyed_ob");
- RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Keyed Object", "For keyed physics systems, the object that has the target particle system.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "keyed_timing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_KEYED_TIMING);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_ui_text(prop, "Keyed timing", "Use key times");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "keyed_particle_system", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "keyed_psys");
- RNA_def_property_range(prop, 1, INT_MAX);
- RNA_def_property_ui_text(prop, "Keyed Particle System", "For keyed physics systems, index of particle system on the keyed object.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "targets", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ParticleTarget");
+ RNA_def_property_ui_text(prop, "Targets", "Target particle systems.");
+
+ prop= RNA_def_property(srna, "active_particle_target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ParticleTarget");
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleSystem_active_particle_target_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Particle Target", "");
- prop= RNA_def_property(srna, "keyed_first", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_FIRST_KEYED);
- RNA_def_property_ui_text(prop, "Keyed First", "Set the system to be the starting point of keyed particles");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "active_particle_target_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_funcs(prop, "rna_ParticleSystem_active_particle_target_index_get", "rna_ParticleSystem_active_particle_target_index_set", "rna_ParticleSystem_active_particle_target_index_range");
+ RNA_def_property_ui_text(prop, "Active Particle Target Index", "");
- prop= RNA_def_property(srna, "keyed_timed", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_KEYED_TIME);
- RNA_def_property_ui_text(prop, "Keyed Timed", "Use intermediate key times for keyed particles (setting for starting point only).");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
/* billboard */
prop= RNA_def_property(srna, "billboard_normal_uv", PROP_STRING, PROP_NONE);
@@ -1588,142 +1966,161 @@ static void rna_def_particle_system(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group_density", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[0]");
RNA_def_property_ui_text(prop, "Vertex Group Density", "Vertex group to control density.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_density_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_DENSITY));
RNA_def_property_ui_text(prop, "Vertex Group Density Negate", "Negate the effect of the density vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_velocity", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[1]");
RNA_def_property_ui_text(prop, "Vertex Group Velocity", "Vertex group to control velocity.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_velocity_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_VEL));
RNA_def_property_ui_text(prop, "Vertex Group Velocity Negate", "Negate the effect of the velocity vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_length", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[2]");
RNA_def_property_ui_text(prop, "Vertex Group Length", "Vertex group to control length.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "vertex_group_length_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_LENGTH));
RNA_def_property_ui_text(prop, "Vertex Group Length Negate", "Negate the effect of the length vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
prop= RNA_def_property(srna, "vertex_group_clump", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[3]");
RNA_def_property_ui_text(prop, "Vertex Group Clump", "Vertex group to control clump.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_clump_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_CLUMP));
RNA_def_property_ui_text(prop, "Vertex Group Clump Negate", "Negate the effect of the clump vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_kink", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[4]");
RNA_def_property_ui_text(prop, "Vertex Group Kink", "Vertex group to control kink.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_kink_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_KINK));
RNA_def_property_ui_text(prop, "Vertex Group Kink Negate", "Negate the effect of the kink vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness1", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[5]");
RNA_def_property_ui_text(prop, "Vertex Group Roughness 1", "Vertex group to control roughness 1.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness1_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGH1));
RNA_def_property_ui_text(prop, "Vertex Group Roughness 1 Negate", "Negate the effect of the roughness 1 vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness2", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[6]");
RNA_def_property_ui_text(prop, "Vertex Group Roughness 2", "Vertex group to control roughness 2.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness2_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGH2));
RNA_def_property_ui_text(prop, "Vertex Group Roughness 2 Negate", "Negate the effect of the roughness 2 vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness_end", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[7]");
RNA_def_property_ui_text(prop, "Vertex Group Roughness End", "Vertex group to control roughness end.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_roughness_end_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROUGHE));
RNA_def_property_ui_text(prop, "Vertex Group Roughness End Negate", "Negate the effect of the roughness end vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "vertex_group_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[8]");
RNA_def_property_ui_text(prop, "Vertex Group Size", "Vertex group to control size.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_size_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_SIZE));
RNA_def_property_ui_text(prop, "Vertex Group Size Negate", "Negate the effect of the size vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_tangent", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[9]");
RNA_def_property_ui_text(prop, "Vertex Group Tangent", "Vertex group to control tangent.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_tangent_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_TAN));
RNA_def_property_ui_text(prop, "Vertex Group Tangent Negate", "Negate the effect of the tangent vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_rotation", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[10]");
RNA_def_property_ui_text(prop, "Vertex Group Rotation", "Vertex group to control rotation.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_rotation_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_ROT));
RNA_def_property_ui_text(prop, "Vertex Group Rotation Negate", "Negate the effect of the rotation vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_field", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "vgroup[11]");
RNA_def_property_ui_text(prop, "Vertex Group Field", "Vertex group to control field.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "vertex_group_field_negate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "vg_neg", (1 << PSYS_VG_EFFECTOR));
RNA_def_property_ui_text(prop, "Vertex Group Field Negate", "Negate the effect of the field vertex group.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* pointcache */
- prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NEVER_NULL);
+ 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, "pointcache");
RNA_def_property_struct_type(prop, "PointCache");
RNA_def_property_ui_text(prop, "Point Cache", "");
+ prop= RNA_def_property(srna, "multiple_caches", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_multiple_caches_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Multiple Caches", "Particle system has multiple point caches");
+
/* offset ob */
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "parent");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent", "Use this object's coordinate system instead of global coordinate system.");
- RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
+ /* hair or cache editing */
+ prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_editable_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Editable", "Particle system can be edited in particle mode");
+ prop= RNA_def_property(srna, "edited", PROP_BOOLEAN, PROP_NONE);
+ 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");
}
void RNA_def_particle(BlenderRNA *brna)
{
+ rna_def_particle_target(brna);
+
rna_def_particle_hair_key(brna);
rna_def_particle_key(brna);
+
rna_def_child_particle(brna);
rna_def_particle(brna);
rna_def_particle_system(brna);
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index b8863540bdf..e76cd56af4e 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -17,12 +17,13 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Contributor(s): Blender Foundation (2008), Roland Hess
+ * Contributor(s): Blender Foundation (2008), Roland Hess, Joshua Leung
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
+#include <string.h>
#include "RNA_define.h"
#include "RNA_types.h"
@@ -39,16 +40,78 @@
#ifdef RNA_RUNTIME
+#include "BIK_api.h"
+#include "BKE_action.h"
+#include "BLI_arithb.h"
+
+#include "DNA_userdef_types.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_idprop.h"
+#include "ED_object.h"
+#include "ED_armature.h"
+
+#include "MEM_guardedalloc.h"
+
static void rna_Pose_update(bContext *C, PointerRNA *ptr)
{
- DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+ // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
+
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+}
+
+static void rna_Pose_IK_update(bContext *C, 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);
+ BIK_clear_data(ob->pose);
}
-IDProperty *rna_PoseChannel_idproperties(PointerRNA *ptr, int create)
+static char *rna_PoseChannel_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("pose.pose_channels[\"%s\"]", ((bPoseChannel*)ptr->data)->name);
+}
+
+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 ((value >= -1) && (value < 21))
+ grp->customCol= value;
+ else
+ return;
+
+ /* only do color copying if using a custom color (i.e. not default colour) */
+ if (grp->customCol) {
+ if (grp->customCol > 0) {
+ /* copy theme colors on-to group's custom color in case user tries to edit color */
+ bTheme *btheme= U.themes.first;
+ ThemeWireColor *col_set= &btheme->tarm[(grp->customCol - 1)];
+
+ memcpy(&grp->cs, col_set, sizeof(ThemeWireColor));
+ }
+ else {
+ /* init custom colors with a generic multi-color rgb set, if not initialised already (for custom color set) */
+ if (grp->cs.solid[0] == 0) {
+ /* define for setting colors in theme below */
+ #define SETCOL(col, r, g, b, a) col[0]=r; col[1]=g; col[2]= b; col[3]= a;
+
+ SETCOL(grp->cs.solid, 0xff, 0x00, 0x00, 255);
+ SETCOL(grp->cs.select, 0x81, 0xe6, 0x14, 255);
+ SETCOL(grp->cs.active, 0x18, 0xb6, 0xe0, 255);
+
+ #undef SETCOL
+ }
+ }
+ }
+}
+
+static IDProperty *rna_PoseChannel_idproperties(PointerRNA *ptr, int create)
{
bPoseChannel *pchan= ptr->data;
@@ -60,17 +123,451 @@ IDProperty *rna_PoseChannel_idproperties(PointerRNA *ptr, int create)
return pchan->prop;
}
+static void rna_Pose_ik_solver_set(struct PointerRNA *ptr, int value)
+{
+ bPose *pose= (bPose*)ptr->data;
+
+ if (pose->iksolver != value) {
+ // the solver has changed, must clean any temporary structures
+ BIK_clear_data(pose);
+ if (pose->ikparam) {
+ MEM_freeN(pose->ikparam);
+ pose->ikparam = NULL;
+ }
+ pose->iksolver = value;
+ init_pose_ikparam(pose);
+ }
+}
+
+static void rna_Pose_ik_solver_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= ptr->id.data;
+ bPose *pose = ptr->data;
+ Scene *scene = CTX_data_scene(C);
+
+ pose->flag |= POSE_RECALC; // checks & sorts pose channels
+ DAG_scene_sort(scene);
+
+ update_pose_constraint_flags(pose);
+
+ object_test_constraints(ob);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+}
+
+/* rotation - euler angles */
+static void rna_PoseChannel_euler_rotation_get(PointerRNA *ptr, float *value)
+{
+ bPoseChannel *pchan= ptr->data;
+
+ if(pchan->rotmode == PCHAN_ROT_AXISANGLE) /* default XYZ eulers */
+ AxisAngleToEulO(&pchan->quat[1], pchan->quat[0], value, EULER_ORDER_DEFAULT);
+ else if(pchan->rotmode == PCHAN_ROT_QUAT) /* default XYZ eulers */
+ QuatToEul(pchan->quat, value);
+ else
+ VECCOPY(value, pchan->eul);
+}
+
+/* rotation - euler angles */
+static void rna_PoseChannel_euler_rotation_set(PointerRNA *ptr, const float *value)
+{
+ bPoseChannel *pchan= ptr->data;
+
+ if(pchan->rotmode == PCHAN_ROT_AXISANGLE) /* default XYZ eulers */
+ EulOToAxisAngle((float *)value, EULER_ORDER_DEFAULT, &pchan->quat[1], &pchan->quat[0]);
+ else if(pchan->rotmode == PCHAN_ROT_QUAT) /* default XYZ eulers */
+ EulToQuat((float*)value, pchan->quat);
+ else
+ VECCOPY(pchan->eul, value);
+}
+
+/* rotation - axis angle only */
+static void rna_PoseChannel_rotation_axis_get(PointerRNA *ptr, float *value)
+{
+ bPoseChannel *pchan= ptr->data;
+
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis is stord in quat for now */
+ VecCopyf(value, &pchan->quat[1]);
+ }
+}
+
+/* rotation - axis angle only */
+static void rna_PoseChannel_rotation_axis_set(PointerRNA *ptr, const float *value)
+{
+ bPoseChannel *pchan= ptr->data;
+
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis is stored in quat for now */
+ VecCopyf(&pchan->quat[1], (float *)value);
+ }
+}
+
+static void rna_PoseChannel_rotation_mode_set(PointerRNA *ptr, int value)
+{
+ bPoseChannel *pchan= ptr->data;
+
+ /* check if any change - if so, need to convert data */
+ // TODO: this needs to be generalised at some point to work for objects too...
+ if (value > 0) { /* to euler */
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis-angle to euler */
+ AxisAngleToEulO(&pchan->quat[1], pchan->quat[0], pchan->eul, value);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+ /* quat to euler */
+ QuatToEulO(pchan->quat, pchan->eul, value);
+ }
+ /* else { no conversion needed } */
+ }
+ else if (value == PCHAN_ROT_QUAT) { /* to quat */
+ if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+ /* axis angle to quat */
+ float q[4];
+
+ /* copy to temp var first, since quats and axis-angle are stored in same place */
+ QuatCopy(q, pchan->quat);
+ AxisAngleToQuat(q, &pchan->quat[1], pchan->quat[0]);
+ }
+ else if (pchan->rotmode > 0) {
+ /* euler to quat */
+ EulOToQuat(pchan->eul, pchan->rotmode, pchan->quat);
+ }
+ /* else { no conversion needed } */
+ }
+ else { /* to axis-angle */
+ if (pchan->rotmode > 0) {
+ /* euler to axis angle */
+ EulOToAxisAngle(pchan->eul, pchan->rotmode, &pchan->quat[1], &pchan->quat[0]);
+ }
+ else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+ /* quat to axis angle */
+ float q[4];
+
+ /* copy to temp var first, since quats and axis-angle are stored in same place */
+ QuatCopy(q, pchan->quat);
+ QuatToAxisAngle(q, &pchan->quat[1], &pchan->quat[0]);
+ }
+
+ /* when converting to axis-angle, we need a special exception for the case when there is no axis */
+ if (IS_EQ(pchan->quat[1], pchan->quat[2]) && IS_EQ(pchan->quat[2], pchan->quat[3])) {
+ /* for now, rotate around y-axis then (so that it simply becomes the roll) */
+ pchan->quat[2]= 1.0f;
+ }
+ }
+
+ /* finally, set the new rotation type */
+ pchan->rotmode= value;
+}
+
+static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+ char oldname[32], newname[32];
+
+ /* need to be on the stack */
+ BLI_strncpy(newname, value, 32);
+ BLI_strncpy(oldname, pchan->name, 32);
+
+ ED_armature_bone_rename(ob->data, oldname, newname);
+}
+
+static int rna_PoseChannel_has_ik_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+
+ return ED_pose_channel_in_IK_chain(ob, pchan);
+}
+
+StructRNA *rna_IKParam_refine(PointerRNA *ptr)
+{
+ bIKParam *param = (bIKParam *)ptr->data;
+
+ switch (param->iksolver) {
+ case IKSOLVER_ITASC:
+ return &RNA_Itasc;
+ default:
+ return &RNA_IKParam;
+ }
+}
+
+PointerRNA rna_Pose_ikparam_get(struct PointerRNA *ptr)
+{
+ bPose *pose= (bPose*)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_IKParam, pose->ikparam);
+}
+
+static StructRNA *rna_Pose_ikparam_typef(PointerRNA *ptr)
+{
+ bPose *pose= (bPose*)ptr->data;
+
+ switch (pose->iksolver) {
+ case IKSOLVER_ITASC:
+ return &RNA_Itasc;
+ default:
+ return &RNA_IKParam;
+ }
+}
+
+static void rna_Itasc_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob = ptr->id.data;
+ bItasc *itasc = ptr->data;
+
+ /* verify values */
+ if (itasc->precision < 0.0001f)
+ itasc->precision = 0.0001f;
+ if (itasc->minstep < 0.001f)
+ itasc->minstep = 0.001f;
+ if (itasc->maxstep < itasc->minstep)
+ itasc->maxstep = itasc->minstep;
+ if (itasc->feedback < 0.01f)
+ itasc->feedback = 0.01f;
+ if (itasc->feedback > 100.f)
+ itasc->feedback = 100.f;
+ if (itasc->maxvel < 0.01f)
+ itasc->maxvel = 0.01f;
+ if (itasc->maxvel > 100.f)
+ itasc->maxvel = 100.f;
+ BIK_update_param(ob->pose);
+
+ DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+}
+
+static void rna_Itasc_update_rebuild(bContext *C, PointerRNA *ptr)
+{
+ Object *ob= ptr->id.data;
+ bPose *pose = ob->pose;
+
+ pose->flag |= POSE_RECALC; // checks & sorts pose channels
+ rna_Itasc_update(C, ptr);
+}
+
+static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+ bActionGroup *grp;
+
+ if (pose)
+ grp= BLI_findlink(&pose->agroups, pchan->agrp_index-1);
+ else
+ grp= NULL;
+
+ return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, grp);
+}
+
+static void rna_PoseChannel_bone_group_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object*)ptr->id.data;
+ bPose *pose= (ob) ? ob->pose : NULL;
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+
+ if (pose)
+ pchan->agrp_index= BLI_findindex(&pose->agroups, value.data) + 1;
+ else
+ pchan->agrp_index= 0;
+}
+
+static int rna_PoseChannel_bone_group_index_get(PointerRNA *ptr)
+{
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+ return MAX2(pchan->agrp_index-1, 0);
+}
+
+static void rna_PoseChannel_bone_group_index_set(PointerRNA *ptr, int value)
+{
+ bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+ pchan->agrp_index= value+1;
+}
+
+static void rna_PoseChannel_bone_group_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Object *ob= (Object*)ptr->id.data;
+ bPose *pose= (ob) ? ob->pose : NULL;
+
+ *min= 0;
+
+ if (pose) {
+ *max= BLI_countlist(&pose->agroups)-1;
+ *max= MAX2(0, *max);
+ }
+ else
+ *max= 0;
+}
+
+static PointerRNA rna_Pose_active_bone_group_get(PointerRNA *ptr)
+{
+ bPose *pose= (bPose*)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, BLI_findlink(&pose->agroups, pose->active_group-1));
+}
+
+static void rna_Pose_active_bone_group_set(PointerRNA *ptr, PointerRNA value)
+{
+ bPose *pose= (bPose*)ptr->data;
+ pose->active_group= BLI_findindex(&pose->agroups, value.data) + 1;
+}
+
+static int rna_Pose_active_bone_group_index_get(PointerRNA *ptr)
+{
+ bPose *pose= (bPose*)ptr->data;
+ return MAX2(pose->active_group-1, 0);
+}
+
+static void rna_Pose_active_bone_group_index_set(PointerRNA *ptr, int value)
+{
+ bPose *pose= (bPose*)ptr->data;
+ pose->active_group= value+1;
+}
+
+static void rna_Pose_active_bone_group_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ bPose *pose= (bPose*)ptr->data;
+
+ *min= 0;
+ *max= BLI_countlist(&pose->agroups)-1;
+ *max= MAX2(0, *max);
+}
+
+#if 0
+static void rna_pose_bgroup_name_index_get(PointerRNA *ptr, char *value, int index)
+{
+ bPose *pose= (bPose*)ptr->data;
+ bActionGroup *grp;
+
+ grp= BLI_findlink(&pose->agroups, index-1);
+
+ if(grp) BLI_strncpy(value, grp->name, sizeof(grp->name));
+ else BLI_strncpy(value, "", sizeof(grp->name)); // XXX if invalid pointer, won't this crash?
+}
+
+static int rna_pose_bgroup_name_index_length(PointerRNA *ptr, int index)
+{
+ bPose *pose= (bPose*)ptr->data;
+ bActionGroup *grp;
+
+ grp= BLI_findlink(&pose->agroups, index-1);
+ return (grp)? strlen(grp->name): 0;
+}
+
+static void rna_pose_bgroup_name_index_set(PointerRNA *ptr, const char *value, short *index)
+{
+ bPose *pose= (bPose*)ptr->data;
+ bActionGroup *grp;
+ int a;
+
+ for (a=1, grp=pose->agroups.first; grp; grp=grp->next, a++) {
+ if (strcmp(grp->name, value) == 0) {
+ *index= a;
+ return;
+ }
+ }
+
+ *index= 0;
+}
+
+static void rna_pose_pgroup_name_set(PointerRNA *ptr, const char *value, char *result, int maxlen)
+{
+ bPose *pose= (bPose*)ptr->data;
+ bActionGroup *grp;
+
+ for (grp= pose->agroups.first; grp; grp= grp->next) {
+ if (strcmp(grp->name, value) == 0) {
+ BLI_strncpy(result, value, maxlen);
+ return;
+ }
+ }
+
+ BLI_strncpy(result, "", maxlen);
+}
+#endif
+
#else
-/* users shouldn't be editing pose channel data directly -- better to set ipos and let blender calc pose_channel stuff */
-/* it's going to be weird for users to find IK flags and other such here, instead of in bone where they would expect them
- -- is there any way to put a doc in bone, pointing them here? */
+static void rna_def_bone_group(BlenderRNA *brna)
+{
+ static EnumPropertyItem prop_colorSets_items[] = {
+ {0, "DEFAULT", 0, "Default Colors", ""},
+ {1, "THEME01", 0, "01 - Theme Color Set", ""},
+ {2, "THEME02", 0, "02 - Theme Color Set", ""},
+ {3, "THEME03", 0, "03 - Theme Color Set", ""},
+ {4, "THEME04", 0, "04 - Theme Color Set", ""},
+ {5, "THEME05", 0, "05 - Theme Color Set", ""},
+ {6, "THEME06", 0, "06 - Theme Color Set", ""},
+ {7, "THEME07", 0, "07 - Theme Color Set", ""},
+ {8, "THEME08", 0, "08 - Theme Color Set", ""},
+ {9, "THEME09", 0, "09 - Theme Color Set", ""},
+ {10, "THEME10", 0, "10 - Theme Color Set", ""},
+ {11, "THEME11", 0, "11 - Theme Color Set", ""},
+ {12, "THEME12", 0, "12 - Theme Color Set", ""},
+ {13, "THEME13", 0, "13 - Theme Color Set", ""},
+ {14, "THEME14", 0, "14 - Theme Color Set", ""},
+ {15, "THEME15", 0, "15 - Theme Color Set", ""},
+ {16, "THEME16", 0, "16 - Theme Color Set", ""},
+ {17, "THEME17", 0, "17 - Theme Color Set", ""},
+ {18, "THEME18", 0, "18 - Theme Color Set", ""},
+ {19, "THEME19", 0, "19 - Theme Color Set", ""},
+ {20, "THEME20", 0, "20 - Theme Color Set", ""},
+ {-1, "CUSTOM", 0, "Custom Color Set", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* struct */
+ srna= RNA_def_struct(brna, "BoneGroup", NULL);
+ RNA_def_struct_sdna(srna, "bActionGroup");
+ RNA_def_struct_ui_text(srna, "Bone Group", "Groups of Pose Channels (Bones).");
+ RNA_def_struct_ui_icon(srna, ICON_GROUP_BONE);
+
+ /* name */
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_struct_name_property(srna, prop);
+
+ // TODO: add some runtime-collections stuff to access grouped bones
+
+ /* color set + colors */
+ prop= RNA_def_property(srna, "color_set", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "customCol");
+ RNA_def_property_enum_items(prop, prop_colorSets_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_BoneGroup_color_set_set", NULL);
+ RNA_def_property_ui_text(prop, "Color Set", "Custom color set to use.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ // TODO: editing the colors for this should result in changes to the color type...
+ prop= RNA_def_property(srna, "colors", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "ThemeBoneColorSet");
+ RNA_def_property_pointer_sdna(prop, NULL, "cs"); /* NOTE: the DNA data is not really a pointer, but this code works :) */
+ RNA_def_property_ui_text(prop, "Colors", "Copy of the colors associated with the group's color set.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+}
+
+static EnumPropertyItem prop_iksolver_items[] = {
+ {IKSOLVER_LEGACY, "LEGACY", 0, "Legacy", "Original IK solver."},
+ {IKSOLVER_ITASC, "ITASC", 0, "iTaSC", "Multi constraint, stateful IK solver."},
+ {0, NULL, 0, NULL, NULL}};
+
+static EnumPropertyItem prop_solver_items[] = {
+ {ITASC_SOLVER_SDLS, "SDLS", 0, "SDLS", "Selective Damped Least Square"},
+ {ITASC_SOLVER_DLS, "DLS", 0, "DLS", "Damped Least Square with Numerical Filtering"},
+ {0, NULL, 0, NULL, NULL}};
static void rna_def_pose_channel(BlenderRNA *brna)
{
static EnumPropertyItem prop_rotmode_items[] = {
{PCHAN_ROT_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock (default)"},
- {PCHAN_ROT_EUL, "EULER", 0, "Euler (XYZ)", "Prone to Gimbal Lock"},
+ {PCHAN_ROT_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order. Prone to Gimbal Lock"},
+ {PCHAN_ROT_AXISANGLE, "AXIS_ANGLE", 0, "Axis Angle", "Axis Angle (W+XYZ). Defines a rotation around some axis defined by 3D-Vector."},
{0, NULL, 0, NULL, NULL}};
StructRNA *srna;
@@ -79,61 +576,40 @@ static void rna_def_pose_channel(BlenderRNA *brna)
srna= RNA_def_struct(brna, "PoseChannel", NULL);
RNA_def_struct_sdna(srna, "bPoseChannel");
RNA_def_struct_ui_text(srna, "Pose Channel", "Channel defining pose data for a bone in a Pose.");
+ RNA_def_struct_path_func(srna, "rna_PoseChannel_path");
RNA_def_struct_idproperties_func(srna, "rna_PoseChannel_idproperties");
-
+
+ /* Bone Constraints */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
RNA_def_property_ui_text(prop, "Constraints", "Constraints that act on this PoseChannel.");
+ /* Name + Selection Status */
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_PoseChannel_name_set");
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
- RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis.");
-
- prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
- RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis.");
-
- prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
- RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis.");
-
- prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
- RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis.");
-
- prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
- RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis.");
-
- prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
- RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis.");
-
prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Selected", "");
-
- /* XXX note: bone groups are stored internally as bActionGroups :) - Aligorith */
- prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "agrp_index");
- RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group).");
- prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_NONE);
+ /* Baked Bone Path cache data s*/
+ prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "pathsf");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Bone Paths Calculation Start Frame", "Starting frame of range of frames to use for Bone Path calculations.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
- prop= RNA_def_property(srna, "path_end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "path_end_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "pathef");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Bone Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
-
- prop= RNA_def_property(srna, "bone", PROP_POINTER, PROP_NEVER_NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ /* Relationships to other bones */
+ prop= RNA_def_property(srna, "bone", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "Bone");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Bone", "Bone associated with this Pose Channel.");
@@ -147,118 +623,416 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "PoseChannel");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Child", "Child of this pose channel.");
-
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+
+ /* Transformation settings */
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Location", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
- prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Scale", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
+ 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", "Rotation in Quaternions.");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "rotation_angle", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "quat[0]");
+ RNA_def_property_ui_text(prop, "Rotation Angle", "Angle of Rotation for Axis-Angle rotation representation.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
- prop= RNA_def_property(srna, "euler_rotation", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "rotation_axis", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "quat");
+ RNA_def_property_float_funcs(prop, "rna_PoseChannel_rotation_axis_get", "rna_PoseChannel_rotation_axis_set", NULL);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Rotation Axis", "Axis for Axis-Angle rotation representation.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "euler_rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "eul");
+ RNA_def_property_float_funcs(prop, "rna_PoseChannel_euler_rotation_get", "rna_PoseChannel_euler_rotation_set", NULL);
RNA_def_property_ui_text(prop, "Rotation (Euler)", "Rotation in Eulers.");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rotmode");
RNA_def_property_enum_items(prop, prop_rotmode_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
RNA_def_property_ui_text(prop, "Rotation Mode", "");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
/* These three matrix properties await an implementation of the PROP_MATRIX subtype, which currently doesn't exist. */
-/* prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_struct_type(prop, "chan_mat");
+ prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "chan_mat");
+ RNA_def_property_array(prop, 16);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints.");*/
+ RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints.");
/* kaito says this should be not user-editable; I disagree; power users should be able to force this in python; he's the boss. */
-/* prop= RNA_def_property(srna, "pose_matrix", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_struct_type(prop, "pose_mat");
+ prop= RNA_def_property(srna, "pose_matrix", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_float_sdna(prop, NULL, "pose_mat");
+ RNA_def_property_array(prop, 16);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel.");
+ /*
prop= RNA_def_property(srna, "constraint_inverse_matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_struct_type(prop, "constinv");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Constraint Inverse Matrix", "4x4 matrix, defines transform from final position to unconstrained position."); */
+ RNA_def_property_ui_text(prop, "Constraint Inverse Matrix", "4x4 matrix, defines transform from final position to unconstrained position.");
+ */
- prop= RNA_def_property(srna, "pose_head", PROP_FLOAT, PROP_VECTOR);
+ /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
+ prop= RNA_def_property(srna, "pose_head", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Pose Head Position", "Location of head of the channel's bone.");
- prop= RNA_def_property(srna, "pose_tail", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "pose_tail", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Pose Tail Position", "Location of tail of the channel's bone.");
+
+ /* IK Settings */
+ prop= RNA_def_property(srna, "has_ik", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_PoseChannel_has_ik_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
+ RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
+ RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
+ RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
+ RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
+ RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_min_limits", PROP_FLOAT, PROP_VECTOR);
- RNA_def_property_float_sdna(prop, NULL, "limitmin");
+ prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
+ RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_rot_control", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ROTCTL);
+ RNA_def_property_ui_text(prop, "IK rot control", "Apply channel rotation as IK constraint");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_lin_control", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_LINCTL);
+ RNA_def_property_ui_text(prop, "IK rot control", "Apply channel size as IK constraint if stretching is enabled");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_min_x", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmin[0]");
RNA_def_property_range(prop, -180.0f, 0.0f);
- RNA_def_property_ui_text(prop, "IK Minimum Limits", "Minimum angles for IK Limit");
+ RNA_def_property_ui_text(prop, "IK X Minimum", "Minimum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_max_limits", PROP_FLOAT, PROP_VECTOR);
- RNA_def_property_float_sdna(prop, NULL, "limitmax");
+ prop= RNA_def_property(srna, "ik_max_x", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmax[0]");
RNA_def_property_range(prop, 0.0f, 180.0f);
- RNA_def_property_ui_text(prop, "IK Maximum Limits", "Maximum angles for IK Limit");
+ RNA_def_property_ui_text(prop, "IK X Maximum", "Maximum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
- prop= RNA_def_property(srna, "ik_stiffness", PROP_FLOAT, PROP_VECTOR);
- RNA_def_property_float_sdna(prop, NULL, "stiffness");
- RNA_def_property_range(prop, 0.0f,0.99f);
- RNA_def_property_ui_text(prop, "IK Stiffness", "Stiffness around the different axes.");
+ prop= RNA_def_property(srna, "ik_min_y", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmin[1]");
+ RNA_def_property_range(prop, -180.0f, 0.0f);
+ RNA_def_property_ui_text(prop, "IK Y Minimum", "Minimum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_max_y", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmax[1]");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "IK Y Maximum", "Maximum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_min_z", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmin[2]");
+ RNA_def_property_range(prop, -180.0f, 0.0f);
+ RNA_def_property_ui_text(prop, "IK Z Minimum", "Minimum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_max_z", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "limitmax[2]");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "IK Z Maximum", "Maximum angles for IK Limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_stiffness_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "stiffness[0]");
+ RNA_def_property_range(prop, 0.0f, 0.99f);
+ RNA_def_property_ui_text(prop, "IK X Stiffness", "IK stiffness around the X axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_stiffness_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "stiffness[1]");
+ RNA_def_property_range(prop, 0.0f, 0.99f);
+ RNA_def_property_ui_text(prop, "IK Y Stiffness", "IK stiffness around the Y axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_stiffness_z", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "stiffness[2]");
+ RNA_def_property_range(prop, 0.0f, 0.99f);
+ RNA_def_property_ui_text(prop, "IK Z Stiffness", "IK stiffness around the Z axis.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
prop= RNA_def_property(srna, "ik_stretch", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ikstretch");
RNA_def_property_range(prop, 0.0f,1.0f);
RNA_def_property_ui_text(prop, "IK Stretch", "Allow scaling of the bone for IK.");
-
- prop= RNA_def_property(srna, "custom", PROP_POINTER, PROP_NONE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
+
+ prop= RNA_def_property(srna, "ik_rot_weight", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ikrotweight");
+ RNA_def_property_range(prop, 0.0f,1.0f);
+ RNA_def_property_ui_text(prop, "IK Rot Weight", "Weight of rotation constraint for IK.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "ik_lin_weight", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "iklinweight");
+ RNA_def_property_range(prop, 0.0f,1.0f);
+ RNA_def_property_ui_text(prop, "IK Lin Weight", "Weight of scale constraint for IK.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ /* custom bone shapes */
+ prop= RNA_def_property(srna, "custom_shape", PROP_POINTER, PROP_NONE);
+ 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_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone.");
-
- prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_VECTOR);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ /* bone groups */
+ 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_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_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoneGroup");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL);
+ RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ /* transform locks */
+ prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
- prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ // XXX this is sub-optimal - it really should be included above, but due to technical reasons we can't do this!
+ prop= RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTW);
+ RNA_def_property_ui_text(prop, "Lock Rotation (4D Angle)", "Lock editing of 'angle' component of four-component rotations in the interface.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+ // XXX this needs a better name
+ prop= RNA_def_property(srna, "lock_rotations_4d", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROT4D);
+ RNA_def_property_ui_text(prop, "Lock Rotations (4D)", "Lock editing of four component rotations by components (instead of as Eulers).");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
- prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_VECTOR);
+ prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_XYZ);
RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
}
-void RNA_def_pose(BlenderRNA *brna)
+static void rna_def_pose_itasc(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- rna_def_pose_channel(brna);
+ srna= RNA_def_struct(brna, "Itasc", "IKParam");
+ RNA_def_struct_sdna(srna, "bItasc");
+ RNA_def_struct_ui_text(srna, "bItasc", "Parameters for the iTaSC IK solver.");
+
+ prop= RNA_def_property(srna, "precision", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "precision");
+ RNA_def_property_range(prop, 0.0f,0.1f);
+ RNA_def_property_ui_text(prop, "Precision", "Precision of convergence in case of reiteration.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "num_iter", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "numiter");
+ RNA_def_property_range(prop, 1.f,1000.f);
+ RNA_def_property_ui_text(prop, "Iterations", "Maximum number of iterations for convergence in case of reiteration.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "num_step", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "numstep");
+ RNA_def_property_range(prop, 1.f, 50.f);
+ RNA_def_property_ui_text(prop, "Num steps", "Divides the frame interval into this many steps.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "simulation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_SIMULATION);
+ RNA_def_property_ui_text(prop, "Simulation", "Simulation mode: solver is statefull, runs in real-time context and ignores actions and non-IK constraints (i.e. solver is in full charge of the IK chain).");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
+
+ prop= RNA_def_property(srna, "initial_reiteration", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_INITIAL_REITERATION);
+ RNA_def_property_ui_text(prop, "Initial Reiteration", "Allow reiteration for initial frame.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+ prop= RNA_def_property(srna, "reiteration", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_REITERATION);
+ RNA_def_property_ui_text(prop, "Reiteration", "Allow reiteration for all frames.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_AUTO_STEP);
+ RNA_def_property_ui_text(prop, "Auto step", "Automatically determine the optimal number of steps for best performance/accurary trade off.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "min_step", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minstep");
+ RNA_def_property_range(prop, 0.0f,0.1f);
+ RNA_def_property_ui_text(prop, "Min step", "Lower bound for timestep in second in case of automatic substeps.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "max_step", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxstep");
+ RNA_def_property_range(prop, 0.0f,1.0f);
+ RNA_def_property_ui_text(prop, "Max step", "Higher bound for timestep in second in case of automatic substeps.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "feedback", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "feedback");
+ RNA_def_property_range(prop, 0.0f,100.0f);
+ RNA_def_property_ui_text(prop, "Feedback", "Feedback coefficient for error correction. Average response time=1/feedback. Default=20.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "max_velocity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxvel");
+ RNA_def_property_range(prop, 0.0f,100.0f);
+ RNA_def_property_ui_text(prop, "Max Velocity", "Maximum joint velocity in rad/s. Default=50.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "solver", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "solver");
+ RNA_def_property_enum_items(prop, prop_solver_items);
+ RNA_def_property_ui_text(prop, "Solver", "Solving method selection: Automatic damping or manual damping");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
+
+ prop= RNA_def_property(srna, "dampmax", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dampmax");
+ RNA_def_property_range(prop, 0.0f,1.0f);
+ RNA_def_property_ui_text(prop, "Damp", "Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+
+ prop= RNA_def_property(srna, "dampeps", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dampeps");
+ RNA_def_property_range(prop, 0.0f,1.0f);
+ RNA_def_property_ui_text(prop, "Epsilon", "Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
+}
+
+static void rna_def_pose_ikparam(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "IKParam", NULL);
+ RNA_def_struct_sdna(srna, "bIKParam");
+ RNA_def_struct_ui_text(srna, "IKParam", "Base type for IK solver parameters.");
+ RNA_def_struct_refine_func(srna, "rna_IKParam_refine");
+
+ prop= RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "iksolver");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, prop_iksolver_items);
+ RNA_def_property_ui_text(prop, "IK Solver", "IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC.");
+}
+
+static void rna_def_pose(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* struct definition */
srna= RNA_def_struct(brna, "Pose", NULL);
RNA_def_struct_sdna(srna, "bPose");
RNA_def_struct_ui_text(srna, "Pose", "A collection of pose channels, including settings for animating bones.");
+ /* pose channels */
prop= RNA_def_property(srna, "pose_channels", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "chanbase", NULL);
RNA_def_property_struct_type(prop, "PoseChannel");
RNA_def_property_ui_text(prop, "Pose Channels", "Individual pose channels for the armature.");
- /* commented for now... missing info... */
- /*prop= RNA_def_property(srna, "action_groups", PROP_COLLECTION, PROP_NONE);
+ /* bone groups */
+ prop= RNA_def_property(srna, "bone_groups", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
- RNA_def_property_struct_type(prop, "ActionGroup");
- RNA_def_property_ui_text(prop, "Action Groups", "Groups of bones.");*/
+ RNA_def_property_struct_type(prop, "BoneGroup");
+ RNA_def_property_ui_text(prop, "Bone Groups", "Groups of the bones.");
+
+ prop= RNA_def_property(srna, "active_bone_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoneGroup");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL);
+ RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "active_bone_group_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "active_group");
+ RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set", "rna_Pose_active_bone_group_index_range");
+ RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+ prop= RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "iksolver");
+ RNA_def_property_enum_funcs(prop, NULL, "rna_Pose_ik_solver_set", NULL);
+ RNA_def_property_enum_items(prop, prop_iksolver_items);
+ RNA_def_property_ui_text(prop, "IK Solver", "Selection of IK solver for IK chain, current choice is 0 for Legacy, 1 for iTaSC.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_ik_solver_update");
+
+ prop= RNA_def_property(srna, "ik_param", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "IKParam");
+ RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "IK Param", "Parameters for IK solver.");
+
+ /* RNA_api_pose(srna); */
+}
+
+void RNA_def_pose(BlenderRNA *brna)
+{
+ rna_def_pose(brna);
+ rna_def_pose_channel(brna);
+ rna_def_pose_ikparam(brna);
+ rna_def_pose_itasc(brna);
+ rna_def_bone_group(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_scriptlink.c b/source/blender/makesrna/intern/rna_pose_api.c
index b486cd4a874..40bb131b3f9 100644
--- a/source/blender/makesrna/intern/rna_scriptlink.c
+++ b/source/blender/makesrna/intern/rna_pose_api.c
@@ -1,12 +1,12 @@
/**
* $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.
+ * 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
@@ -17,31 +17,39 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * Contributor(s): Blender Foundation (2008).
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
#include "RNA_define.h"
#include "RNA_types.h"
-#include "rna_internal.h"
+#include "DNA_object_types.h"
-#include "DNA_scriptlink_types.h"
+/* #include "BLO_sys_types.h" */
#ifdef RNA_RUNTIME
+/* #include "DNA_anim_types.h" */
+#include "DNA_action_types.h" /* bPose */
+
#else
-void RNA_def_scriptlink(BlenderRNA *brna)
+void RNA_api_pose(StructRNA *srna)
{
- StructRNA *srna;
+ /* FunctionRNA *func; */
+ /* PropertyRNA *parm; */
- srna= RNA_def_struct(brna, "ScriptLink", NULL);
- RNA_def_struct_ui_text(srna, "Script Link", "Scripts linked to a datablock, to be executed on changes to the datablock.");
- RNA_def_struct_ui_icon(srna, ICON_PYTHON);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c
index a840552b86f..a1fcbac274e 100644
--- a/source/blender/makesrna/intern/rna_property.c
+++ b/source/blender/makesrna/intern/rna_property.c
@@ -33,6 +33,8 @@
#ifdef RNA_RUNTIME
+#include "BKE_property.h"
+
static StructRNA* rna_GameProperty_refine(struct PointerRNA *ptr)
{
bProperty *property= (bProperty*)ptr->data;
@@ -67,6 +69,24 @@ static void rna_GameFloatProperty_value_set(PointerRNA *ptr, float value)
*(float*)(&prop->data)= value;
}
+static void rna_GameProperty_type_set(PointerRNA *ptr, int value)
+{
+ bProperty *prop= (bProperty*)(ptr->data);
+
+ if(prop->type != value) {
+ prop->type= value;
+ init_property(prop);
+ }
+}
+
+static void rna_GameProperty_name_set(PointerRNA *ptr, const char *value)
+{
+ bProperty *prop= (bProperty*)(ptr->data);
+ BLI_strncpy(prop->name, value, sizeof(prop->name));
+ unique_property(NULL, prop, 1);
+}
+
+
#else
void RNA_def_gameproperty(BlenderRNA *brna)
@@ -89,14 +109,14 @@ void RNA_def_gameproperty(BlenderRNA *brna)
RNA_def_struct_refine_func(srna, "rna_GameProperty_refine");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* must be unique */
RNA_def_property_ui_text(prop, "Name", "Available as as GameObject attributes in the game engines python api");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GameProperty_name_set");
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_enum_items(prop, gameproperty_type_items);
RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_enum_funcs(prop, NULL, "rna_GameProperty_type_set", NULL);
prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PROP_DEBUG);
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
new file mode 100644
index 00000000000..a67831715a2
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -0,0 +1,410 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation (2009)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "DNA_scene_types.h"
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#include "WM_types.h"
+
+#include "RE_pipeline.h"
+
+#ifdef RNA_RUNTIME
+
+#include "MEM_guardedalloc.h"
+
+#include "RNA_access.h"
+
+#include "BKE_context.h"
+#include "BKE_report.h"
+
+#include "WM_api.h"
+
+/* RenderEngine */
+
+static RenderEngineType internal_render_type = {
+ NULL, NULL, "BLENDER_RENDER", "Blender Render", RE_INTERNAL, NULL, {NULL, NULL, NULL, NULL}};
+#if GAMEBLENDER == 1
+static RenderEngineType internal_game_type = {
+ NULL, NULL, "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, NULL, {NULL, NULL, NULL, NULL}};
+#endif
+
+ListBase R_engines = {NULL, NULL};
+
+void RE_engines_init()
+{
+ BLI_addtail(&R_engines, &internal_render_type);
+#if GAMEBLENDER == 1
+ BLI_addtail(&R_engines, &internal_game_type);
+#endif
+}
+
+void RE_engines_exit()
+{
+ RenderEngineType *type, *next;
+
+ for(type=R_engines.first; type; type=next) {
+ next= type->next;
+
+ BLI_remlink(&R_engines, type);
+
+ if(!(type->flag & RE_INTERNAL)) {
+ if(type->ext.free)
+ type->ext.free(type->ext.data);
+
+ MEM_freeN(type);
+ }
+ }
+}
+
+static void engine_render(RenderEngine *engine, struct Scene *scene)
+{
+ PointerRNA ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ func= RNA_struct_find_function(&ptr, "render");
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "scene", &scene);
+ engine->type->ext.call(&ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
+
+static void rna_RenderEngine_unregister(const bContext *C, StructRNA *type)
+{
+ RenderEngineType *et= RNA_struct_blender_type_get(type);
+
+ if(!et)
+ return;
+
+ RNA_struct_free_extension(type, &et->ext);
+ BLI_freelinkN(&R_engines, et);
+ 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)
+{
+ RenderEngineType *et, dummyet = {0};
+ RenderEngine dummyengine= {0};
+ PointerRNA dummyptr;
+ int have_function[1];
+
+ /* setup dummy engine & engine type to store static properties in */
+ dummyengine.type= &dummyet;
+ RNA_pointer_create(NULL, &RNA_RenderEngine, &dummyengine, &dummyptr);
+
+ /* validate the python class */
+ if(validate(&dummyptr, data, have_function) != 0)
+ return NULL;
+
+ /* check if we have registered this engine type before, and remove it */
+ for(et=R_engines.first; et; et=et->next) {
+ if(strcmp(et->idname, dummyet.idname) == 0) {
+ if(et->ext.srna)
+ rna_RenderEngine_unregister(C, et->ext.srna);
+ break;
+ }
+ }
+
+ /* create a new engine type */
+ et= MEM_callocN(sizeof(RenderEngineType), "python buttons engine");
+ memcpy(et, &dummyet, sizeof(dummyet));
+
+ et->ext.srna= RNA_def_struct(&BLENDER_RNA, et->idname, "RenderEngine");
+ et->ext.data= data;
+ et->ext.call= call;
+ et->ext.free= free;
+ RNA_struct_blender_type_set(et->ext.srna, et);
+
+ et->render= (have_function[0])? engine_render: NULL;
+
+ BLI_addtail(&R_engines, et);
+
+ return et->ext.srna;
+}
+
+static StructRNA* rna_RenderEngine_refine(PointerRNA *ptr)
+{
+ RenderEngine *engine= (RenderEngine*)ptr->data;
+ return (engine->type && engine->type->ext.srna)? engine->type->ext.srna: &RNA_RenderEngine;
+}
+
+static void rna_RenderResult_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ RenderResult *rr= (RenderResult*)ptr->data;
+ rna_iterator_listbase_begin(iter, &rr->layers, NULL);
+}
+
+static void rna_RenderLayer_passes_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ RenderLayer *rl= (RenderLayer*)ptr->data;
+ rna_iterator_listbase_begin(iter, &rl->passes, NULL);
+}
+
+static int rna_RenderLayer_rect_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ RenderLayer *rl= (RenderLayer*)ptr->data;
+
+ length[0]= rl->rectx*rl->recty;
+ length[1]= 4;
+
+ return length[0]*length[1];
+}
+
+static void rna_RenderLayer_rect_get(PointerRNA *ptr, float *values)
+{
+ RenderLayer *rl= (RenderLayer*)ptr->data;
+ memcpy(values, rl->rectf, sizeof(float)*rl->rectx*rl->recty*4);
+}
+
+static void rna_RenderLayer_rect_set(PointerRNA *ptr, const float *values)
+{
+ RenderLayer *rl= (RenderLayer*)ptr->data;
+ memcpy(rl->rectf, values, sizeof(float)*rl->rectx*rl->recty*4);
+}
+
+static int rna_RenderPass_rect_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ RenderPass *rpass= (RenderPass*)ptr->data;
+
+ length[0]= rpass->rectx*rpass->recty;
+ length[1]= rpass->channels;
+
+ return length[0]*length[1];
+}
+
+static void rna_RenderPass_rect_get(PointerRNA *ptr, float *values)
+{
+ RenderPass *rpass= (RenderPass*)ptr->data;
+ printf("rect get\n");
+ memcpy(values, rpass->rect, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels);
+}
+
+static void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values)
+{
+ RenderPass *rpass= (RenderPass*)ptr->data;
+ printf("rect set\n");
+ memcpy(rpass->rect, values, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels);
+}
+
+#else // RNA_RUNTIME
+
+static void rna_def_render_engine(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ FunctionRNA *func;
+
+ srna= RNA_def_struct(brna, "RenderEngine", NULL);
+ RNA_def_struct_sdna(srna, "RenderEngine");
+ RNA_def_struct_ui_text(srna, "Render Engine", "Render engine.");
+ RNA_def_struct_refine_func(srna, "rna_RenderEngine_refine");
+ RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister");
+
+ /* render */
+ func= RNA_def_function(srna, "render", NULL);
+ RNA_def_function_ui_description(func, "Render scene into an image.");
+ RNA_def_function_flag(func, FUNC_REGISTER);
+ RNA_def_pointer(func, "scene", "Scene", "", "");
+
+ func= RNA_def_function(srna, "begin_result", "RE_engine_begin_result");
+ prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "X", "", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Y", "", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_int(func, "w", 0, 0, INT_MAX, "Width", "", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_int(func, "h", 0, 0, INT_MAX, "Height", "", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+ RNA_def_function_return(func, prop);
+
+ func= RNA_def_function(srna, "update_result", "RE_engine_update_result");
+ prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "end_result", "RE_engine_end_result");
+ prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "test_break", "RE_engine_test_break");
+ prop= RNA_def_boolean(func, "do_break", 0, "Break", "");
+ RNA_def_function_return(func, prop);
+
+ func= RNA_def_function(srna, "update_stats", "RE_engine_update_stats");
+ prop= RNA_def_string(func, "stats", "", 0, "Stats", "");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_string(func, "info", "", 0, "Info", "");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ /* registration */
+ RNA_define_verify_sdna(0);
+
+ prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "type->idname");
+ RNA_def_property_flag(prop, PROP_REGISTER);
+
+ prop= RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "type->name");
+ RNA_def_property_flag(prop, PROP_REGISTER);
+
+ RNA_define_verify_sdna(1);
+}
+
+static void rna_def_render_result(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ FunctionRNA *func;
+
+ srna= RNA_def_struct(brna, "RenderResult", NULL);
+ RNA_def_struct_ui_text(srna, "Render Result", "Result of rendering, including all layers and passes.");
+
+ func= RNA_def_function(srna, "load_from_file", "RE_result_load_from_file");
+ RNA_def_function_ui_description(func, "Copies the pixels of this render result from an image file.");
+ 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 render result");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ RNA_define_verify_sdna(0);
+
+ prop= RNA_def_property(srna, "resolution_x", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "rectx");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "resolution_y", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "recty");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "RenderLayer");
+ RNA_def_property_collection_funcs(prop, "rna_RenderResult_layers_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0, 0);
+
+ RNA_define_verify_sdna(1);
+}
+
+static void rna_def_render_layer(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ FunctionRNA *func;
+
+ srna= RNA_def_struct(brna, "RenderLayer", NULL);
+ RNA_def_struct_ui_text(srna, "Render Layer", "");
+
+ func= RNA_def_function(srna, "load_from_file", "RE_layer_load_from_file");
+ RNA_def_function_ui_description(func, "Copies the pixels of this renderlayer from an image file.");
+ 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);
+
+ RNA_define_verify_sdna(0);
+
+ rna_def_render_layer_common(srna, 0);
+
+ prop= RNA_def_property(srna, "passes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "RenderPass");
+ RNA_def_property_collection_funcs(prop, "rna_RenderLayer_passes_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0, 0);
+
+ prop= RNA_def_property(srna, "rect", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_multi_array(prop, 2, NULL);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_RenderLayer_rect_get_length");
+ RNA_def_property_float_funcs(prop, "rna_RenderLayer_rect_get", "rna_RenderLayer_rect_set", NULL);
+
+ RNA_define_verify_sdna(1);
+}
+
+static void rna_def_render_pass(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem pass_type_items[]= {
+ {SCE_PASS_COMBINED, "COMBINED", 0, "Combined", ""},
+ {SCE_PASS_Z, "Z", 0, "Z", ""},
+ {SCE_PASS_RGBA, "COLOR", 0, "Color", ""},
+ {SCE_PASS_DIFFUSE, "DIFFUSE", 0, "Diffuse", ""},
+ {SCE_PASS_SPEC, "SPECULAR", 0, "Specular", ""},
+ {SCE_PASS_SHADOW, "SHADOW", 0, "Shadow", ""},
+ {SCE_PASS_AO, "AO", 0, "AO", ""},
+ {SCE_PASS_REFLECT, "REFLECTION", 0, "Reflection", ""},
+ {SCE_PASS_NORMAL, "NORMAL", 0, "Normal", ""},
+ {SCE_PASS_VECTOR, "VECTOR", 0, "Vecotr", ""},
+ {SCE_PASS_REFRACT, "REFRACTION", 0, "Refraction", ""},
+ {SCE_PASS_INDEXOB, "OBJECT_INDEX", 0, "Object Index", ""},
+ {SCE_PASS_UV, "UV", 0, "UV", ""},
+ {SCE_PASS_MIST, "MIST", 0, "Mist", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "RenderPass", NULL);
+ RNA_def_struct_ui_text(srna, "Render Pass", "");
+
+ RNA_define_verify_sdna(0);
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "name");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_struct_name_property(srna, prop);
+
+ prop= RNA_def_property(srna, "channel_id", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "chan_id");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "channels", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "channels");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "passtype");
+ RNA_def_property_enum_items(prop, pass_type_items);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "rect", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_multi_array(prop, 2, NULL);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_RenderPass_rect_get_length");
+ RNA_def_property_float_funcs(prop, "rna_RenderPass_rect_get", "rna_RenderPass_rect_set", NULL);
+
+ RNA_define_verify_sdna(1);
+}
+
+void RNA_def_render(BlenderRNA *brna)
+{
+ rna_def_render_engine(brna);
+ rna_def_render_result(brna);
+ rna_def_render_layer(brna);
+ rna_def_render_pass(brna);
+}
+
+#endif // RNA_RUNTIME
+
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 6fa275cec91..8dd751cd26a 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -309,14 +309,16 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
}
} while((srna=srna->base));
- group= RNA_struct_idproperties(ptr, 0);
-
- if(group) {
- for(idp=group->data.group.first; idp; idp=idp->next) {
- if(strcmp(idp->name, key) == 0) {
- propptr.type= &RNA_Property;
- propptr.data= idp;
- return propptr;
+ if(ptr->data) {
+ group= RNA_struct_idproperties(ptr, 0);
+
+ if(group) {
+ for(idp=group->data.group.first; idp; idp=idp->next) {
+ if(strcmp(idp->name, key) == 0) {
+ propptr.type= &RNA_Property;
+ propptr.data= idp;
+ return propptr;
+ }
}
}
}
@@ -405,17 +407,30 @@ static int rna_Property_subtype_get(PointerRNA *ptr)
return prop->subtype;
}
+static int rna_Property_unit_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return RNA_SUBTYPE_UNIT(prop->subtype);
+}
+
static int rna_Property_editable_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
return RNA_property_editable(ptr, prop);
}
+static int rna_Property_use_return_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ return prop->flag & PROP_RETURN ? 1:0;
+}
+
static int rna_Property_array_length_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
rna_idproperty_check(&prop, ptr);
- return prop->arraylength;
+ return prop->totarraylength;
}
static int rna_Property_registered_get(PointerRNA *ptr)
@@ -430,6 +445,75 @@ static int rna_Property_registered_optional_get(PointerRNA *ptr)
return prop->flag & PROP_REGISTER_OPTIONAL;
}
+static int rna_BoolProperty_default_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return ((BooleanPropertyRNA*)prop)->defaultvalue;
+}
+
+static int rna_IntProperty_default_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return ((IntPropertyRNA*)prop)->defaultvalue;
+}
+/* int/float/bool */
+static int rna_NumberProperty_default_array_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+
+ length[0]= prop->totarraylength;
+
+ return length[0];
+}
+static void rna_IntProperty_default_array_get(PointerRNA *ptr, int *values)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ IntPropertyRNA *nprop= (IntPropertyRNA*)prop;
+ rna_idproperty_check(&prop, ptr);
+
+ if(nprop->defaultarray) {
+ memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(int));
+ }
+ else {
+ int i;
+ for(i=0; i < prop->totarraylength; i++)
+ values[i]= nprop->defaultvalue;
+ }
+}
+static void rna_BoolProperty_default_array_get(PointerRNA *ptr, int *values)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ BooleanPropertyRNA *nprop= (BooleanPropertyRNA*)prop;
+ rna_idproperty_check(&prop, ptr);
+
+ if(nprop->defaultarray) {
+ memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(int));
+ }
+ else {
+ int i;
+ for(i=0; i < prop->totarraylength; i++)
+ values[i]= nprop->defaultvalue;
+ }
+}
+static void rna_FloatProperty_default_array_get(PointerRNA *ptr, float *values)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ FloatPropertyRNA *nprop= (FloatPropertyRNA*)prop;
+ rna_idproperty_check(&prop, ptr);
+
+ if(nprop->defaultarray) {
+ memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(float));
+ }
+ else {
+ int i;
+ for(i=0; i < prop->totarraylength; i++)
+ values[i]= nprop->defaultvalue;
+ }
+}
+
static int rna_IntProperty_hard_min_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -465,6 +549,12 @@ static int rna_IntProperty_step_get(PointerRNA *ptr)
return ((IntPropertyRNA*)prop)->step;
}
+static float rna_FloatProperty_default_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return ((FloatPropertyRNA*)prop)->defaultvalue;
+}
static float rna_FloatProperty_hard_min_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -507,6 +597,19 @@ static int rna_FloatProperty_precision_get(PointerRNA *ptr)
return ((FloatPropertyRNA*)prop)->precision;
}
+static void rna_StringProperty_default_get(PointerRNA *ptr, char *value)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ strcpy(value, ((StringPropertyRNA*)prop)->defaultvalue);
+}
+static int rna_StringProperty_default_length(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return strlen(((StringPropertyRNA*)prop)->defaultvalue);
+}
+
static int rna_StringProperty_max_length_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -514,7 +617,7 @@ static int rna_StringProperty_max_length_get(PointerRNA *ptr)
return ((StringPropertyRNA*)prop)->maxlength;
}
-static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA *ptr, int *free)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
EnumPropertyRNA *eprop;
@@ -522,7 +625,39 @@ static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, Point
rna_idproperty_check(&prop, ptr);
eprop= (EnumPropertyRNA*)prop;
- rna_iterator_array_begin(iter, (void*)eprop->item, sizeof(eprop->item[0]), eprop->totitem, NULL);
+ if(eprop->itemf==NULL || eprop->itemf==rna_EnumProperty_default_itemf)
+ return eprop->item;
+
+ return eprop->itemf(C, ptr, free);
+}
+
+/* XXX - not sore this is needed? */
+static int rna_EnumProperty_default_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, ptr);
+ return ((EnumPropertyRNA*)prop)->defaultvalue;
+}
+
+static int rna_enum_check_separator(CollectionPropertyIterator *iter, void *data)
+{
+ EnumPropertyItem *item= (EnumPropertyItem*)data;
+
+ return (item->identifier[0] == 0);
+}
+
+static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ EnumPropertyRNA *eprop;
+ EnumPropertyItem *item= NULL;
+ int totitem, free= 0;
+
+ rna_idproperty_check(&prop, ptr);
+ eprop= (EnumPropertyRNA*)prop;
+
+ RNA_property_enum_items(NULL, ptr, prop, &item, &totitem, &free);
+ rna_iterator_array_begin(iter, (void*)item, sizeof(EnumPropertyItem), totitem, free, rna_enum_check_separator);
}
static void rna_EnumPropertyItem_identifier_get(PointerRNA *ptr, char *value)
@@ -545,6 +680,26 @@ static int rna_EnumPropertyItem_name_length(PointerRNA *ptr)
return strlen(((EnumPropertyItem*)ptr->data)->name);
}
+static void rna_EnumPropertyItem_description_get(PointerRNA *ptr, char *value)
+{
+ EnumPropertyItem *eprop= (EnumPropertyItem*)ptr->data;
+
+ if(eprop->description)
+ strcpy(value, eprop->description);
+ else
+ value[0]= '\0';
+}
+
+static int rna_EnumPropertyItem_description_length(PointerRNA *ptr)
+{
+ EnumPropertyItem *eprop= (EnumPropertyItem*)ptr->data;
+
+ if(eprop->description)
+ return strlen(eprop->description);
+ else
+ return 0;
+}
+
static int rna_EnumPropertyItem_value_get(PointerRNA *ptr)
{
return ((EnumPropertyItem*)ptr->data)->value;
@@ -683,15 +838,34 @@ static void rna_def_property(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem subtype_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
- {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned Number", ""},
{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
{PROP_DIRPATH, "DIRECTORY_PATH", 0, "Directory Path", ""},
+ {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned Number", ""},
+ {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
+ {PROP_FACTOR, "FACTOR", 0, "Factor", ""},
+ {PROP_ANGLE, "ANGLE", 0, "Angle", ""},
+ {PROP_TIME, "TIME", 0, "Time", ""},
+ {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
{PROP_COLOR, "COLOR", 0, "Color", ""},
- {PROP_VECTOR, "VECTOR", 0, "Vector", ""},
+ {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
+ {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
{PROP_MATRIX, "MATRIX", 0, "Matrix", ""},
- {PROP_ROTATION, "ROTATION", 0, "Rotation", ""},
- {PROP_NEVER_NULL, "NEVER_NULL", 0, "Never Null", ""},
- {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
+ {PROP_EULER, "EULER", 0, "Euler", ""},
+ {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
+ {PROP_XYZ, "XYZ", 0, "XYZ", ""},
+ {PROP_RGB, "RGB", 0, "RGB", ""},
+ {PROP_LAYER, "LAYER", 0, "Layer", ""},
+ {PROP_LAYER_MEMBER, "LAYER_MEMBERSHIP", 0, "Layer Membership", ""},
+ {0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem unit_items[] = {
+ {PROP_UNIT_NONE, "NONE", 0, "None", ""},
+ {PROP_UNIT_LENGTH, "LENGTH", 0, "Length", ""},
+ {PROP_UNIT_AREA, "AREA", 0, "Area", ""},
+ {PROP_UNIT_VOLUME, "VOLUME", 0, "Volume", ""},
+ {PROP_UNIT_ROTATION, "ROTATION", 0, "Rotation", ""},
+ {PROP_UNIT_TIME, "TIME", 0, "Time", ""},
+ {PROP_UNIT_VELOCITY, "VELOCITY", 0, "Velocity", ""},
+ {PROP_UNIT_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Property", NULL);
@@ -727,11 +901,22 @@ static void rna_def_property(BlenderRNA *brna)
RNA_def_property_enum_funcs(prop, "rna_Property_subtype_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Subtype", "Semantic interpretation of the property.");
+ prop= RNA_def_property(srna, "unit", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, unit_items);
+ RNA_def_property_enum_funcs(prop, "rna_Property_unit_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Unit", "Type of units for this property.");
+
prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Property_editable_get", NULL);
RNA_def_property_ui_text(prop, "Editable", "Property is editable through RNA.");
+ prop= RNA_def_property(srna, "use_return", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Property_use_return_get", NULL);
+ RNA_def_property_ui_text(prop, "Return", "True when this property is a return value from an rna function..");
+
prop= RNA_def_property(srna, "registered", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Property_registered_get", NULL);
@@ -784,6 +969,47 @@ static void rna_def_number_property(StructRNA *srna, PropertyType type)
{
PropertyRNA *prop;
+ prop= RNA_def_property(srna, "default", type, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Default", "Default value for this number");
+
+ switch(type) {
+ case PROP_BOOLEAN:
+ RNA_def_property_boolean_funcs(prop, "rna_BoolProperty_default_get", NULL);
+ break;
+ case PROP_INT:
+ RNA_def_property_int_funcs(prop, "rna_IntProperty_default_get", NULL, NULL);
+ break;
+ case PROP_FLOAT:
+ RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_get", NULL, NULL);
+ break;
+ default:
+ break;
+ }
+
+
+ prop= RNA_def_property(srna, "default_array", type, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_array(prop, RNA_MAX_ARRAY_DIMENSION); /* no fixed default length, important its not 0 though */
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_NumberProperty_default_array_get_length"); /* same for all types */
+
+ switch(type) {
+ case PROP_BOOLEAN:
+ RNA_def_property_boolean_funcs(prop, "rna_BoolProperty_default_array_get", NULL);
+ break;
+ case PROP_INT:
+ RNA_def_property_int_funcs(prop, "rna_IntProperty_default_array_get", NULL, NULL);
+ break;
+ case PROP_FLOAT:
+ RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_array_get", NULL, NULL);
+ break;
+ default:
+ break;
+ }
+ RNA_def_property_ui_text(prop, "Default Array", "Default value for this array");
+
+
prop= RNA_def_property(srna, "array_length", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_Property_array_length_get", NULL, NULL);
@@ -834,6 +1060,11 @@ static void rna_def_string_property(StructRNA *srna)
{
PropertyRNA *prop;
+ prop= RNA_def_property(srna, "default", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_string_funcs(prop, "rna_StringProperty_default_get", "rna_StringProperty_default_length", NULL);
+ RNA_def_property_ui_text(prop, "Default", "string default value.");
+
prop= RNA_def_property(srna, "max_length", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_StringProperty_max_length_get", NULL, NULL);
@@ -844,6 +1075,17 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna)
{
PropertyRNA *prop;
+ /* the itemf func is used instead, keep blender happy */
+ static EnumPropertyItem default_dummy_items[] = {
+ {PROP_NONE, "DUMMY", 0, "Dummy", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ prop= RNA_def_property(srna, "default", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, default_dummy_items);
+ RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
+ RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
+
prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "EnumPropertyItem");
@@ -859,6 +1101,11 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_name_get", "rna_EnumPropertyItem_name_length", NULL);
RNA_def_property_ui_text(prop, "Name", "Human readable name.");
+ prop= RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_description_get", "rna_EnumPropertyItem_description_length", NULL);
+ RNA_def_property_ui_text(prop, "Description", "Description of the item's purpose.");
+
prop= RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_identifier_get", "rna_EnumPropertyItem_identifier_length", NULL);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 47c9025149a..cac639a64ed 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -30,12 +30,16 @@
#include "rna_internal.h"
#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
-/*
+/* Include for Bake Options */
+#include "RE_pipeline.h"
+
+#ifdef WITH_FFMPEG
#include "BKE_writeffmpeg.h"
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
-*/
+#endif
#include "WM_types.h"
@@ -52,10 +56,21 @@ EnumPropertyItem prop_mode_items[] ={
#ifdef RNA_RUNTIME
+#include "DNA_anim_types.h"
+#include "DNA_node_types.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_node.h"
+
+#include "BLI_threads.h"
+
+#include "ED_info.h"
+#include "ED_node.h"
-PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
+#include "RE_pipeline.h"
+
+static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -63,9 +78,8 @@ PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, ((Base*)internal->link)->object);
}
-static void rna_Scene_layer_set(PointerRNA *ptr, const int *values)
+static int layer_set(int lay, const int *values)
{
- Scene *scene= (Scene*)ptr->data;
int i, tot= 0;
/* ensure we always have some layer selected */
@@ -74,12 +88,21 @@ static void rna_Scene_layer_set(PointerRNA *ptr, const int *values)
tot++;
if(tot==0)
- return;
+ return lay;
for(i=0; i<20; i++) {
- if(values[i]) scene->lay |= (1<<i);
- else scene->lay &= ~(1<<i);
+ if(values[i]) lay |= (1<<i);
+ else lay &= ~(1<<i);
}
+
+ return lay;
+}
+
+static void rna_Scene_layer_set(PointerRNA *ptr, const int *values)
+{
+ Scene *scene= (Scene*)ptr->data;
+
+ scene->lay= layer_set(scene->lay, values);
}
static void rna_Scene_start_frame_set(PointerRNA *ptr, int value)
@@ -96,66 +119,279 @@ static void rna_Scene_end_frame_set(PointerRNA *ptr, int value)
data->r.efra= value;
}
+static int rna_Scene_use_preview_range_get(PointerRNA *ptr)
+{
+ Scene *data= (Scene*)ptr->data;
+
+ /* this is simply overloaded to assume that preview-range
+ * start frame cannot be less than 1 when on,
+ * so psfra=0 means 'off'
+ */
+ return (data->r.psfra != 0);
+}
+
+static void rna_Scene_use_preview_range_set(PointerRNA *ptr, int value)
+{
+ Scene *data= (Scene*)ptr->data;
+
+ /* if enable, copy range from render-range, otherwise just clear */
+ if (value) {
+ data->r.psfra= data->r.sfra;
+ data->r.pefra= data->r.efra;
+ }
+ else
+ data->r.psfra= 0;
+}
+
+
+static void rna_Scene_preview_range_start_frame_set(PointerRNA *ptr, int value)
+{
+ Scene *data= (Scene*)ptr->data;
+
+ /* check if enabled already */
+ if (data->r.psfra == 0) {
+ /* set end of preview range to end frame, then clamp as per normal */
+ // TODO: or just refuse to set instead?
+ data->r.pefra= data->r.efra;
+ }
+
+ /* now set normally */
+ CLAMP(value, 1, data->r.pefra);
+ data->r.psfra= value;
+}
+
+static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value)
+{
+ Scene *data= (Scene*)ptr->data;
+
+ /* check if enabled already */
+ if (data->r.psfra == 0) {
+ /* set start of preview range to start frame, then clamp as per normal */
+ // TODO: or just refuse to set instead?
+ data->r.psfra= data->r.sfra;
+ }
+
+ /* now set normally */
+ CLAMP(value, data->r.psfra, MAXFRAME);
+ data->r.pefra= value;
+}
+
static void rna_Scene_frame_update(bContext *C, PointerRNA *ptr)
{
//Scene *scene= ptr->id.data;
- //update_for_newframe();
+ //ED_update_for_newframe(C);
}
-#else
+static int rna_Scene_active_keying_set_editable(PointerRNA *ptr)
+{
+ Scene *scene= (Scene *)ptr->data;
+
+ /* only editable if there are some Keying Sets to change to */
+ return (scene->keyingsets.first != NULL);
+}
-void rna_def_sculpt(BlenderRNA *brna)
+static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr)
{
- StructRNA *srna;
- PropertyRNA *prop;
+ Scene *scene= (Scene *)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_KeyingSet, BLI_findlink(&scene->keyingsets, scene->active_keyingset-1));
+}
- srna= RNA_def_struct(brna, "Sculpt", NULL);
- RNA_def_struct_nested(brna, srna, "Scene");
- RNA_def_struct_ui_text(srna, "Sculpt", "");
+static void rna_Scene_active_keying_set_set(PointerRNA *ptr, PointerRNA value)
+{
+ Scene *scene= (Scene *)ptr->data;
+ KeyingSet *ks= (KeyingSet*)value.data;
+ scene->active_keyingset= BLI_findindex(&scene->keyingsets, ks) + 1;
+}
+
+static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr)
+{
+ Scene *scene= (Scene *)ptr->data;
+ return MAX2(scene->active_keyingset-1, 0);
+}
+
+static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value)
+{
+ Scene *scene= (Scene *)ptr->data;
+ scene->active_keyingset= value+1;
+}
+
+static void rna_Scene_active_keying_set_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ Scene *scene= (Scene *)ptr->data;
+
+ *min= 0;
+ *max= BLI_countlist(&scene->keyingsets)-1;
+ *max= MAX2(0, *max);
+}
+
+
+static char *rna_SceneRenderData_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("render_data");
+}
- prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X);
- RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis.");
+static int rna_SceneRenderData_threads_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
- prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y);
- RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis.");
+ if(rd->mode & R_FIXED_THREADS)
+ return rd->threads;
+ else
+ return BLI_system_thread_count();
+}
- prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z);
- RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis.");
+static int rna_SceneRenderData_save_buffers_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
- prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_X);
- RNA_def_property_ui_text(prop, "Lock X", "Disallow changes to the X axis of vertices.");
+ return (rd->scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) != 0;
+}
- prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Y);
- RNA_def_property_ui_text(prop, "Lock Y", "Disallow changes to the Y axis of vertices.");
+static void rna_SceneRenderData_file_format_set(PointerRNA *ptr, int value)
+{
+ RenderData *rd= (RenderData*)ptr->data;
- prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z);
- RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices.");
+ rd->imtype= value;
+#ifdef WITH_FFMPEG
+ ffmpeg_verify_image_type(rd);
+#endif
+}
- prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_BRUSH);
- RNA_def_property_ui_text(prop, "Show Brush", "");
+static int rna_SceneRenderData_active_layer_index_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ return rd->actlay;
+}
+
+static void rna_SceneRenderData_active_layer_index_set(PointerRNA *ptr, int value)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ rd->actlay= value;
+}
+
+static void rna_SceneRenderData_active_layer_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+
+ *min= 0;
+ *max= BLI_countlist(&rd->layers)-1;
+ *max= MAX2(0, *max);
+}
+
+static void rna_SceneRenderData_engine_set(PointerRNA *ptr, int value)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ RenderEngineType *type= BLI_findlink(&R_engines, value);
- prop= RNA_def_property(srna, "partial_redraw", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_FAST);
- RNA_def_property_ui_text(prop, "Partial Redraw", "Optimize sculpting by only refreshing modified faces.");
+ if(type)
+ BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine));
}
-void rna_def_tool_settings(BlenderRNA *brna)
+static EnumPropertyItem *rna_SceneRenderData_engine_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ RenderEngineType *type;
+ EnumPropertyItem *item= NULL;
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ int a=0, totitem= 0;
+
+ for(type=R_engines.first; type; type=type->next, a++) {
+ tmp.value= a;
+ tmp.identifier= type->idname;
+ tmp.name= type->name;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
+static int rna_SceneRenderData_engine_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ RenderEngineType *type;
+ int a= 0;
+
+ for(type=R_engines.first; type; type=type->next, a++)
+ if(strcmp(type->idname, rd->engine) == 0)
+ return a;
+
+ return 0;
+}
+
+static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value)
+{
+ Scene *scene= (Scene*)ptr->id.data;
+ SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data;
+
+ BLI_strncpy(rl->name, value, sizeof(rl->name));
+
+ if(scene->nodetree) {
+ bNode *node;
+ int index= BLI_findindex(&scene->r.layers, rl);
+
+ for(node= scene->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+ if(node->custom1==index)
+ BLI_strncpy(node->name, rl->name, NODE_MAXSTR);
+ }
+ }
+ }
+}
+
+static int rna_SceneRenderData_multiple_engines_get(PointerRNA *ptr)
+{
+ return (BLI_countlist(&R_engines) > 1);
+}
+
+static int rna_SceneRenderData_use_game_engine_get(PointerRNA *ptr)
+{
+ RenderData *rd= (RenderData*)ptr->data;
+ RenderEngineType *type;
+
+ for(type=R_engines.first; type; type=type->next)
+ if(strcmp(type->idname, rd->engine) == 0)
+ return (type->flag & RE_GAME);
+
+ return 0;
+}
+
+static void rna_SceneRenderLayer_layer_set(PointerRNA *ptr, const int *values)
+{
+ SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data;
+ rl->lay= layer_set(rl->lay, values);
+}
+
+static void rna_SceneRenderLayer_pass_update(bContext *C, PointerRNA *ptr)
+{
+ Scene *scene= (Scene*)ptr->id.data;
+
+ if(scene->nodetree)
+ ntreeCompositForceHidden(scene->nodetree, scene);
+}
+
+static void rna_Scene_use_nodes_set(PointerRNA *ptr, int value)
+{
+ Scene *scene= (Scene*)ptr->data;
+
+ scene->use_nodes= value;
+ if(scene->use_nodes && scene->nodetree==NULL)
+ ED_node_composit_default(scene);
+}
+
+#else
+
+static void rna_def_tool_settings(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem uv_select_mode_items[] = {
- {UV_SELECT_VERTEX, "VERTEX", ICON_VERTEXSEL, "Vertex", "Vertex selection mode."},
- {UV_SELECT_EDGE, "EDGE", ICON_EDGESEL, "Edge", "Edge selection mode."},
- {UV_SELECT_FACE, "FACE", ICON_FACESEL, "Face", "Face selection mode."},
- {UV_SELECT_ISLAND, "ISLAND", ICON_LINKEDSEL, "Island", "Island selection mode."},
+ {UV_SELECT_VERTEX, "VERTEX", ICON_UV_VERTEXSEL, "Vertex", "Vertex selection mode."},
+ {UV_SELECT_EDGE, "EDGE", ICON_UV_EDGESEL, "Edge", "Edge selection mode."},
+ {UV_SELECT_FACE, "FACE", ICON_UV_FACESEL, "Face", "Face selection mode."},
+ {UV_SELECT_ISLAND, "ISLAND", ICON_UV_ISLANDSEL, "Island", "Island selection mode."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem mesh_select_mode_items[] = {
@@ -177,6 +413,11 @@ void rna_def_tool_settings(BlenderRNA *brna)
{SCE_SNAP_TARGET_MEDIAN, "MEDIAN", 0, "Median", "Snap median onto target."},
{SCE_SNAP_TARGET_ACTIVE, "ACTIVE", 0, "Active", "Snap active onto target."},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem auto_key_items[] = {
+ {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add & Replace", ""},
+ {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ToolSettings", NULL);
RNA_def_struct_ui_text(srna, "Tool Settings", "");
@@ -185,10 +426,22 @@ void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Sculpt");
RNA_def_property_ui_text(prop, "Sculpt", "");
- prop= RNA_def_property(srna, "vpaint", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "VPaint");
+ prop= RNA_def_property(srna, "vertex_paint", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vpaint");
RNA_def_property_ui_text(prop, "Vertex Paint", "");
+ prop= RNA_def_property(srna, "weight_paint", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "wpaint");
+ RNA_def_property_ui_text(prop, "Weight Paint", "");
+
+ prop= RNA_def_property(srna, "image_paint", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "imapaint");
+ RNA_def_property_ui_text(prop, "Image Paint", "");
+
+ prop= RNA_def_property(srna, "particle_edit", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "particle");
+ RNA_def_property_ui_text(prop, "Particle Edit", "");
+
/* Transform */
prop= RNA_def_property(srna, "proportional_editing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "proportional", 0);
@@ -199,6 +452,17 @@ void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_mode_items);
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode.");
+ 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.");
+ RNA_def_property_range(prop, 0.00001, 1000.0);
+ RNA_def_property_ui_range(prop, 0.01, 10.0, 0.1, 2);
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
+
+ prop= RNA_def_property(srna, "automerge_editing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "automerge", 0);
+ RNA_def_property_ui_text(prop, "AutoMerge Editing", "Automatically merge vertices moved to the same location.");
+
prop= RNA_def_property(srna, "snap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP);
RNA_def_property_ui_text(prop, "Snap", "Snap while Ctrl is held during transform.");
@@ -223,6 +487,20 @@ void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PEEL_OBJECT);
RNA_def_property_ui_text(prop, "Snap Peel Object", "Consider objects as whole when finding volume center.");
RNA_def_property_ui_icon(prop, ICON_SNAP_PEEL_OBJECT, 0);
+
+ /* Auto Keying */
+ prop= RNA_def_property(srna, "enable_auto_key", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON);
+ RNA_def_property_ui_text(prop, "Auto Keying", "Automatic keyframe insertion for Objects and Bones");
+
+ prop= RNA_def_property(srna, "autokey_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "autokey_mode");
+ RNA_def_property_enum_items(prop, auto_key_items);
+ RNA_def_property_ui_text(prop, "Auto-Keying Mode", "Mode of automatic keyframe insertion for Objects and Bones");
+
+ prop= RNA_def_property(srna, "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.");
/* UV */
prop= RNA_def_property(srna, "uv_selection_mode", PROP_ENUM, PROP_NONE);
@@ -245,10 +523,563 @@ void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, mesh_select_mode_items);
RNA_def_property_ui_text(prop, "Mesh Selection Mode", "Mesh selection and display mode.");
- rna_def_sculpt(brna);
+ prop= RNA_def_property(srna, "vertex_group_weight", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "vgroup_weight");
+ RNA_def_property_ui_text(prop, "Vertex Group Weight", "Weight to assign in vertex groups.");
+}
+
+
+static void rna_def_unit_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem unit_systems[] = {
+ {USER_UNIT_NONE, "NONE", 0, "None", ""},
+ {USER_UNIT_METRIC, "METRIC", 0, "Metric", ""},
+ {USER_UNIT_IMPERIAL, "IMPERIAL", 0, "Imperial", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "UnitSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Unit Settings", "");
+
+ /* Units */
+ prop= RNA_def_property(srna, "system", PROP_ENUM, PROP_NONE);
+ 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, "scale_length", PROP_FLOAT, PROP_UNSIGNED);
+ RNA_def_property_ui_text(prop, "Unit Scale", "Scale to use when converting between blender units and dimensions.");
+ RNA_def_property_range(prop, 0.00001, 100000.0);
+ RNA_def_property_ui_range(prop, 0.001, 100.0, 0.1, 3);
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop= RNA_def_property(srna, "use_separate", PROP_BOOLEAN, PROP_NONE);
+ 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);
+}
+
+
+void rna_def_render_layer_common(StructRNA *srna, int scene)
+{
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ if(scene) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SceneRenderLayer_name_set");
+ else RNA_def_property_string_sdna(prop, NULL, "name");
+ RNA_def_property_ui_text(prop, "Name", "Render layer name.");
+ RNA_def_struct_name_property(srna, prop);
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "material_override", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "mat_override");
+ RNA_def_property_struct_type(prop, "Material");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Material Override", "Material to override all other materials in this render layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "light_override", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "light_override");
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Light Override", "Group to override all other lights in this render layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ /* layers */
+ prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
+ RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
+ RNA_def_property_array(prop, 20);
+ RNA_def_property_ui_text(prop, "Visible Layers", "Scene layers included in this render layer.");
+ if(scene) RNA_def_property_boolean_funcs(prop, NULL, "rna_SceneRenderLayer_layer_set");
+ else RNA_def_property_boolean_funcs(prop, NULL, "rna_RenderLayer_layer_set");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "zmask_layers", PROP_BOOLEAN, PROP_LAYER);
+ RNA_def_property_boolean_sdna(prop, NULL, "lay_zmask", 1);
+ RNA_def_property_array(prop, 20);
+ RNA_def_property_ui_text(prop, "Zmask Layers", "Zmask scene layers.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ /* layer options */
+ prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "layflag", SCE_LAY_DISABLE);
+ RNA_def_property_ui_text(prop, "Enabled", "Disable or enable the render layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "zmask", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ZMASK);
+ RNA_def_property_ui_text(prop, "Zmask", "Only render what's in front of the solid z values.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "zmask_negate", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_NEG_ZMASK);
+ RNA_def_property_ui_text(prop, "Zmask Negate", "For Zmask, only render what is behind solid z values instead of in front.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "all_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ALL_Z);
+ RNA_def_property_ui_text(prop, "All Z", "Fill in Z values for solid faces in invisible layers, for masking.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "solid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_SOLID);
+ RNA_def_property_ui_text(prop, "Solid", "Render Solid faces in this Layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_HALO);
+ RNA_def_property_ui_text(prop, "Halo", "Render Halos in this Layer (on top of Solid).");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "ztransp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_ZTRA);
+ RNA_def_property_ui_text(prop, "ZTransp", "Render Z-Transparent faces in this Layer (On top of Solid and Halos).");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "sky", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_SKY);
+ RNA_def_property_ui_text(prop, "Sky", "Render Sky in this Layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "edge", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_EDGE);
+ RNA_def_property_ui_text(prop, "Edge", "Render Edge-enhance in this Layer (only works for Solid faces).");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "strand", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "layflag", SCE_LAY_STRAND);
+ RNA_def_property_ui_text(prop, "Strand", "Render Strands in this Layer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ /* passes */
+ prop= RNA_def_property(srna, "pass_combined", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_COMBINED);
+ RNA_def_property_ui_text(prop, "Combined", "Deliver full combined RGBA buffer.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_Z);
+ RNA_def_property_ui_text(prop, "Z", "Deliver Z values pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_vector", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_VECTOR);
+ RNA_def_property_ui_text(prop, "Vector", "Deliver speed vector pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_normal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_NORMAL);
+ RNA_def_property_ui_text(prop, "Normal", "Deliver normal pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_uv", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_UV);
+ RNA_def_property_ui_text(prop, "UV", "Deliver texture UV pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_mist", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_MIST);
+ RNA_def_property_ui_text(prop, "Mist", "Deliver mist factor pass (0.0-1.0).");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_object_index", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_INDEXOB);
+ RNA_def_property_ui_text(prop, "Object Index", "Deliver object index pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_color", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_RGBA);
+ RNA_def_property_ui_text(prop, "Color", "Deliver shade-less color pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_diffuse", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_DIFFUSE);
+ RNA_def_property_ui_text(prop, "Diffuse", "Deliver diffuse pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_specular", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_SPEC);
+ RNA_def_property_ui_text(prop, "Specular", "Deliver specular pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_shadow", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_SHADOW);
+ RNA_def_property_ui_text(prop, "Shadow", "Deliver shadow pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_ao", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_AO);
+ RNA_def_property_ui_text(prop, "AO", "Deliver AO pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_reflection", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFLECT);
+ RNA_def_property_ui_text(prop, "Reflection", "Deliver ratraced reflection pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_refraction", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "passflag", SCE_PASS_REFRACT);
+ RNA_def_property_ui_text(prop, "Refraction", "Deliver ratraced refraction pass.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_specular_exclude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_SPEC);
+ RNA_def_property_ui_text(prop, "Specular Exclude", "Exclude specular pass from combined.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_shadow_exclude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_SHADOW);
+ RNA_def_property_ui_text(prop, "Shadow Exclude", "Exclude shadow pass from combined.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_ao_exclude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_AO);
+ RNA_def_property_ui_text(prop, "AO Exclude", "Exclude AO pass from combined.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_reflection_exclude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_REFLECT);
+ RNA_def_property_ui_text(prop, "Reflection Exclude", "Exclude ratraced reflection pass from combined.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "pass_refraction_exclude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "pass_xor", SCE_PASS_REFRACT);
+ RNA_def_property_ui_text(prop, "Refraction Exclude", "Exclude ratraced refraction pass from combined.");
+ if(scene) RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_SceneRenderLayer_pass_update");
+ else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
}
-void rna_def_scene_render_data(BlenderRNA *brna)
+static void rna_def_scene_game_data(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem framing_types_items[] ={
+ {SCE_GAMEFRAMING_BARS, "LETTERBOX", 0, "Letterbox", "Show the entire viewport in the display window, using bar horizontally or vertically"},
+ {SCE_GAMEFRAMING_EXTEND, "EXTEND", 0, "Extend", "Show the entire viewport in the display window, viewing more horizontally or vertically"},
+ {SCE_GAMEFRAMING_SCALE, "SCALE", 0, "Scale", "Stretch or squeeze the viewport to fill the display window"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem dome_modes_items[] ={
+ {DOME_FISHEYE, "FISHEYE", 0, "Fisheye", ""},
+ {DOME_TRUNCATED_FRONT, "TRUNCATED_FRONT", 0, "Front-Truncated", ""},
+ {DOME_TRUNCATED_REAR, "TRUNCATED_REAR", 0, "Rear-Truncated", ""},
+ {DOME_ENVMAP, "ENVMAP", 0, "Cube Map", ""},
+ {DOME_PANORAM_SPH, "PANORAM_SPH", 0, "Spherical Panoramic", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem stereo_modes_items[] ={
+// {STEREO_NOSTEREO, "NO_STEREO", 0, "No Stereo", ""},
+ {STEREO_QUADBUFFERED, "QUADBUFFERED", 0, "Quad-Buffer", ""},
+ {STEREO_ABOVEBELOW, "ABOVEBELOW", 0, "Above-Below", ""},
+ {STEREO_INTERLACED, "INTERLACED", 0, "Interlaced", ""},
+ {STEREO_ANAGLYPH, "ANAGLYPH", 0, "Anaglyph", ""},
+ {STEREO_SIDEBYSIDE, "SIDEBYSIDE", 0, "Side-by-side", ""},
+ {STEREO_VINTERLACE, "VINTERLACE", 0, "Vinterlace", ""},
+// {STEREO_DOME, "DOME", 0, "Dome", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem stereo_items[] ={
+ {STEREO_NOSTEREO, "NONE", 0, "None", ""},
+ {STEREO_ENABLED, "STEREO", 0, "Stereo", ""},
+ {STEREO_DOME, "DOME", 0, "Dome", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem physics_engine_items[] = {
+ {WOPHY_NONE, "NONE", 0, "None", ""},
+ //{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
+ //{WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""},
+ //{WOPHY_DYNAMO, "DYNAMO", 0, "Dynamo", ""},
+ //{WOPHY_ODE, "ODE", 0, "ODE", ""},
+ {WOPHY_BULLET, "BULLET", 0, "Bullet", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem material_items[] ={
+ {GAME_MAT_TEXFACE, "TEXTURE_FACE", 0, "Texture Face", "Single texture face materials."},
+ {GAME_MAT_MULTITEX, "MULTITEXTURE", 0, "Multitexture", "Multitexture materials."},
+ {GAME_MAT_GLSL, "GLSL", 0, "GLSL", "OpenGL shading language shaders."},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "SceneGameData", NULL);
+ RNA_def_struct_sdna(srna, "GameData");
+ RNA_def_struct_nested(brna, srna, "Scene");
+ RNA_def_struct_ui_text(srna, "Game Data", "Game data for a Scene datablock.");
+
+ prop= RNA_def_property(srna, "resolution_x", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "xplay");
+ RNA_def_property_range(prop, 4, 10000);
+ RNA_def_property_ui_text(prop, "Resolution X", "Number of horizontal pixels in the screen.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "resolution_y", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "yplay");
+ RNA_def_property_range(prop, 4, 10000);
+ RNA_def_property_ui_text(prop, "Resolution Y", "Number of vertical pixels in the screen.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "depth");
+ RNA_def_property_range(prop, 8, 32);
+ RNA_def_property_ui_text(prop, "Bits", "Displays bit depth of full screen display.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ // Do we need it here ? (since we already have it in World
+ prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "freqplay");
+ RNA_def_property_range(prop, 4, 2000);
+ RNA_def_property_ui_text(prop, "Freq", "Displays clock frequency of fullscreen display.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "fullscreen", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "fullscreen", 1.0);
+ RNA_def_property_ui_text(prop, "Fullscreen", "Starts player in a new fullscreen display");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* Framing */
+ prop= RNA_def_property(srna, "framing_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "framing.type");
+ RNA_def_property_enum_items(prop, framing_types_items);
+ RNA_def_property_ui_text(prop, "Framing Types", "Select the type of Framing you want.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "framing_color", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_float_sdna(prop, NULL, "framing.col");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "", "");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* Stereo */
+ prop= RNA_def_property(srna, "stereo", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "stereoflag");
+ RNA_def_property_enum_items(prop, stereo_items);
+ RNA_def_property_ui_text(prop, "Stereo Options", "");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "stereo_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "stereomode");
+ RNA_def_property_enum_items(prop, stereo_modes_items);
+ RNA_def_property_ui_text(prop, "Stereo Mode", "");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* Dome */
+ prop= RNA_def_property(srna, "dome_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "dome.mode");
+ RNA_def_property_enum_items(prop, dome_modes_items);
+ RNA_def_property_ui_text(prop, "Dome Mode", "");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "dome_tesselation", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dome.res");
+ RNA_def_property_ui_range(prop, 1, 8, 1, 1);
+ RNA_def_property_ui_text(prop, "Tesselation", "Tesselation level - check the generated mesh in wireframe mode");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "dome_buffer_resolution", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dome.resbuf");
+ RNA_def_property_ui_range(prop, 0.1, 1.0, 0.1, 0.1);
+ RNA_def_property_ui_text(prop, "Buffer Resolution", "Buffer Resolution - decrease it to increase speed");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "dome_angle", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dome.angle");
+ RNA_def_property_ui_range(prop, 90, 250, 1, 1);
+ RNA_def_property_ui_text(prop, "Angle", "Field of View of the Dome - it only works in mode Fisheye and Truncated");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "dome_tilt", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dome.tilt");
+ RNA_def_property_ui_range(prop, -180, 180, 1, 1);
+ RNA_def_property_ui_text(prop, "Tilt", "Camera rotation in horizontal axis");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "dome_text", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "dome.warptext");
+ RNA_def_property_struct_type(prop, "Text");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Warp Data", "Custom Warp Mesh data file");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* physics */
+ prop= RNA_def_property(srna, "physics_engine", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "physicsEngine");
+ RNA_def_property_enum_items(prop, physics_engine_items);
+ RNA_def_property_ui_text(prop, "Physics Engine", "Physics engine used for physics simulation in the game engine.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "physics_gravity", PROP_FLOAT, PROP_ACCELERATION);
+ RNA_def_property_float_sdna(prop, NULL, "gravity");
+ RNA_def_property_range(prop, 0.0, 25.0);
+ 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");
+ 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 precsion (slower)");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "ticrate");
+ RNA_def_property_ui_range(prop, 1, 60, 1, 1);
+ RNA_def_property_range(prop, 1, 250);
+ RNA_def_property_ui_text(prop, "Frames Per Second", "The nominal number of game frames per second. Physics fixed timestep = 1/fps, independently of actual frame rate.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "logic_step_max", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "maxlogicstep");
+ RNA_def_property_ui_range(prop, 1, 5, 1, 1);
+ RNA_def_property_range(prop, 1, 5);
+ RNA_def_property_ui_text(prop, "Max Logic Steps", "Sets the maximum number of logic frame per game frame if graphics slows down the game, higher value allows better synchronization with physics");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "physics_step_max", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "maxphystep");
+ RNA_def_property_ui_range(prop, 1, 5, 1, 1);
+ RNA_def_property_range(prop, 1, 5);
+ RNA_def_property_ui_text(prop, "Max Physics Steps", "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");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "physics_step_sub", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "physubstep");
+ RNA_def_property_ui_range(prop, 1, 5, 1, 1);
+ RNA_def_property_range(prop, 1, 5);
+ RNA_def_property_ui_text(prop, "Physics Sub Steps", "Sets the number of simulation substep per physic timestep, higher value give better physics precision");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* mode */
+ prop= RNA_def_property(srna, "use_occlusion_culling", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", (1 << 5)); //XXX mode hardcoded // WO_DBVT_CULLING
+ RNA_def_property_ui_text(prop, "DBVT culling", "Use optimized Bullet DBVT tree for view frustrum and occlusion culling");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ // not used // deprecated !!!!!!!!!!!!!
+ prop= RNA_def_property(srna, "activity_culling", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", (1 << 3)); //XXX mode hardcoded
+ RNA_def_property_ui_text(prop, "Activity Culling", "Activity culling is enabled");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ // not used // deprecated !!!!!!!!!!!!!
+ prop= RNA_def_property(srna, "activity_culling_box_radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "activityBoxRadius");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "box radius", "Radius of the activity bubble, in Manhattan length. Objects outside the box are activity-culled");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* booleans */
+ prop= RNA_def_property(srna, "all_frames", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_ENABLE_ALL_FRAMES);
+ RNA_def_property_ui_text(prop, "All Frames", "Render as many frames as possible, rather than respecting framerate.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "show_debug_properties", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_DEBUG_PROPS);
+ RNA_def_property_ui_text(prop, "Show Debug Properties", "Show properties marked for debugging while the game runs.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "show_framerate_profile", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_FRAMERATE);
+ RNA_def_property_ui_text(prop, "Show Framerate and Profile", "Show framerate and profiling information while the game runs.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "show_physics_visualization", PROP_BOOLEAN, PROP_NONE);
+ 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.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "display_lists", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_DISPLAY_LISTS);
+ RNA_def_property_ui_text(prop, "Display Lists", "Use display lists to speed up rendering by keeping geometry on the GPU.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "deprecation_warnings", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_IGNORE_DEPRECATION_WARNINGS);
+ RNA_def_property_ui_text(prop, "Deprecation Warnings", "Print warnings when using deprecated features in the python API.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* materials */
+ prop= RNA_def_property(srna, "material_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "matmode");
+ RNA_def_property_enum_items(prop, material_items);
+ RNA_def_property_ui_text(prop, "Material Mode", "Material mode to use for rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_lights", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_LIGHTS);
+ RNA_def_property_ui_text(prop, "GLSL Lights", "Use lights for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_shaders", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_SHADERS);
+ RNA_def_property_ui_text(prop, "GLSL Shaders", "Use shaders for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_shadows", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_SHADOWS);
+ RNA_def_property_ui_text(prop, "GLSL Shadows", "Use shadows for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_ramps", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_RAMPS);
+ RNA_def_property_ui_text(prop, "GLSL Ramps", "Use ramps for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_NODES);
+ RNA_def_property_ui_text(prop, "GLSL Nodes", "Use nodes for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "glsl_extra_textures", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_EXTRA_TEX);
+ RNA_def_property_ui_text(prop, "GLSL Extra Textures", "Use extra textures like normal or specular maps for GLSL rendering.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+}
+
+static void rna_def_scene_render_layer(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna= RNA_def_struct(brna, "SceneRenderLayer", NULL);
+ RNA_def_struct_ui_text(srna, "Scene Render Layer", "Render layer.");
+
+ rna_def_render_layer_common(srna, 1);
+}
+
+static void rna_def_scene_render_data(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -274,7 +1105,37 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{R_PLANES24, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
{R_PLANES32, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem display_mode_items[] ={
+ {R_OUTPUT_SCREEN, "SCREEN", 0, "Full Screen", "Images are rendered in full Screen"},
+ {R_OUTPUT_AREA, "AREA", 0, "Image Editor", "Images are rendered in Image Editor"},
+ {R_OUTPUT_WINDOW, "WINDOW", 0, "New Window", "Images are rendered in new Window"},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Bake */
+ static EnumPropertyItem bake_mode_items[] ={
+ {RE_BAKE_ALL, "FULL", 0, "Full Render", ""},
+ {RE_BAKE_AO, "AO", 0, "Ambient Occlusion", ""},
+ {RE_BAKE_SHADOW, "SHADOW", 0, "Shadow", ""},
+ {RE_BAKE_NORMALS, "NORMALS", 0, "Normals", ""},
+ {RE_BAKE_TEXTURE, "TEXTURE", 0, "Textures", ""},
+ {RE_BAKE_DISPLACEMENT, "DISPLACEMENT", 0, "Displacement", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem bake_normal_space_items[] ={
+ {R_BAKE_SPACE_CAMERA, "CAMERA", 0, "Camera", ""},
+ {R_BAKE_SPACE_WORLD, "WORLD", 0, "World", ""},
+ {R_BAKE_SPACE_OBJECT, "OBJECT", 0, "Object", ""},
+ {R_BAKE_SPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
+ {0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem bake_aa_items[] ={
+ {5, "AA_5", 0, "5", ""},
+ {8, "AA_8", 0, "8", ""},
+ {11, "AA_11", 0, "11", ""},
+ {16, "AA_16", 0, "16", ""},
+ {0, NULL, 0, NULL, NULL}};
+
static EnumPropertyItem octree_resolution_items[] = {
{64, "OCTREE_RES_64", 0, "64", ""},
{128, "OCTREE_RES_128", 0, "128", ""},
@@ -306,13 +1167,30 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{0, "STAMP_FONT_LARGE", 0, "Large", ""},
{4, "STAMP_FONT_EXTRALARGE", 0, "Extra Large", ""},
{0, NULL, 0, NULL, NULL}};
-
-
+
static EnumPropertyItem image_type_items[] = {
- {R_FRAMESERVER, "FRAMESERVER", 0, "Frame Server", ""},
-#ifdef WITH_FFMPEG
- {R_FFMPEG, "FFMPEG", 0, "FFMpeg", ""},
+ {0, "", 0, "Image", NULL},
+ {R_PNG, "PNG", 0, "PNG", ""},
+ {R_JPEG90, "JPEG", 0, "JPEG", ""},
+#ifdef WITH_OPENJPEG
+ {R_JP2, "JPEG2000", 0, "JPEG 2000", ""},
+#endif
+ {R_BMP, "BMP", 0, "BMP", ""},
+ {R_TARGA, "TARGA", 0, "Targa", ""},
+ {R_RAWTGA, "RAWTARGA", 0, "Targa Raw", ""},
+ //{R_DDS, "DDS", 0, "DDS", ""}, // XXX not yet implemented
+ {R_HAMX, "HAMX", 0, "HamX", ""},
+ {R_IRIS, "IRIS", 0, "Iris", ""},
+ {0, "", 0, " ", NULL},
+#ifdef WITH_OPENEXR
+ {R_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
+ {R_MULTILAYER, "MULTILAYER", 0, "MultiLayer", ""},
#endif
+ {R_TIFF, "TIFF", 0, "TIFF", ""}, // XXX only with G.have_libtiff
+ {R_RADHDR, "RADHDR", 0, "Radiance HDR", ""},
+ {R_CINEON, "CINEON", 0, "Cineon", ""},
+ {R_DPX, "DPX", 0, "DPX", ""},
+ {0, "", 0, "Movie", NULL},
{R_AVIRAW, "AVIRAW", 0, "AVI Raw", ""},
{R_AVIJPEG, "AVIJPEG", 0, "AVI JPEG", ""},
#ifdef _WIN32
@@ -321,31 +1199,24 @@ void rna_def_scene_render_data(BlenderRNA *brna)
#ifdef WITH_QUICKTIME
{R_QUICKTIME, "QUICKTIME", 0, "QuickTime", ""},
#endif
- {R_TARGA, "TARGA", 0, "Targa", ""},
- {R_RAWTGA, "RAWTARGA", 0, "Targa Raw", ""},
- {R_PNG, "PNG", 0, "PNG", ""},
- //{R_DDS, "DDS", 0, "DDS", ""}, // XXX not yet implemented
-//#ifdef WITH_OPENJPEG
- {R_JP2, "JPEG2000", 0, "JPEG 2000", ""},
-//#endif
- {R_BMP, "BMP", 0, "BMP", ""},
- {R_JPEG90, "JPEG", 0, "JPEG", ""},
- {R_HAMX, "HAMX", 0, "HamX", ""},
- {R_IRIS, "IRIS", 0, "Iris", ""},
- {R_RADHDR, "RADHDR", 0, "Radiance HDR", ""},
- {R_CINEON, "CINEON", 0, "Cineon", ""},
- {R_DPX, "DPX", 0, "DPX", ""},
#ifdef __sgi
{R_MOVIE, "MOVIE", 0, "Movie", ""},
#endif
-//#ifdef WITH_OPENEXR
- {R_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
- {R_MULTILAYER, "MULTILAYER", 0, "MultiLayer", ""},
-//#endif
- {R_TIFF, "TIFF", 0, "TIFF", ""}, // XXX only with G.have_libtiff
+#ifdef WITH_FFMPEG
+ {R_H264, "H264", 0, "H.264", ""},
+ {R_XVID, "XVID", 0, "Xvid", ""},
+ // XXX broken
+#if 0
+#ifdef WITH_OGG
+ {R_THEORA, "THEORA", 0, "Ogg Theora", ""},
+#endif
+#endif
+ {R_FFMPEG, "FFMPEG", 0, "FFMpeg", ""},
+#endif
+ {R_FRAMESERVER, "FRAMESERVER", 0, "Frame Server", ""},
{0, NULL, 0, NULL, NULL}};
-//#ifdef WITH_OPENEXR
+#ifdef WITH_OPENEXR
static EnumPropertyItem exr_codec_items[] = {
{0, "NONE", 0, "None", ""},
{1, "PXR24", 0, "Pxr24 (lossy)", ""},
@@ -353,9 +1224,9 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{3, "PIZ", 0, "PIZ (lossless)", ""},
{4, "RLE", 0, "RLE (lossless)", ""},
{0, NULL, 0, NULL, NULL}};
-//#endif
+#endif
-//#ifdef WITH_OPENJPEG
+#ifdef WITH_OPENJPEG
static EnumPropertyItem jp2_preset_items[] = {
{0, "NO_PRESET", 0, "No Preset", ""},
{1, "R_JPEG2K_CINE_PRESET", 0, "Cinema 24fps 2048x1080", ""},
@@ -372,20 +1243,24 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{R_JPEG2K_12BIT, "16", 0, "16", ""},
{R_JPEG2K_16BIT, "32", 0, "32", ""},
{0, NULL, 0, NULL, NULL}};
-//#endif
+#endif
-/*
#ifdef WITH_FFMPEG
static EnumPropertyItem ffmpeg_format_items[] = {
{FFMPEG_MPEG1, "MPEG1", 0, "MPEG-1", ""},
{FFMPEG_MPEG2, "MPEG2", 0, "MPEG-2", ""},
{FFMPEG_MPEG4, "MPEG4", 0, "MPEG-4", ""},
- {FFMPEG_AVI, "AVI", 0, "Avi", ""},
+ {FFMPEG_AVI, "AVI", 0, "AVI", ""},
{FFMPEG_MOV, "QUICKTIME", 0, "Quicktime", ""},
{FFMPEG_DV, "DV", 0, "DV", ""},
- {FFMPEG_H264, "H264", 0, "H264", ""},
- {FFMPEG_XVID, "XVID", 0, "XVid", ""},
- {FFMPEG_OGG, "OGG", 0, "OGG", ""},
+ {FFMPEG_H264, "H264", 0, "H.264", ""},
+ {FFMPEG_XVID, "XVID", 0, "Xvid", ""},
+ // XXX broken
+#if 0
+#ifdef WITH_OGG
+ {FFMPEG_OGG, "OGG", 0, "Ogg", ""},
+#endif
+#endif
{FFMPEG_FLV, "FLASH", 0, "Flash", ""},
{0, NULL, 0, NULL, NULL}};
@@ -395,10 +1270,12 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{CODEC_ID_MPEG4, "MPEG4", 0, "MPEG-4(divx)", ""},
{CODEC_ID_HUFFYUV, "HUFFYUV", 0, "HuffYUV", ""},
{CODEC_ID_DVVIDEO, "DV", 0, "DV", ""},
- {CODEC_ID_H264, "H264", 0, "H264", ""},
- {CODEC_ID_XVID, "XVID", 0, "XVid", ""},
- {CODEC_ID_THEORA, "THEORA", 0, "OGG Theora", ""},
- {CODEC_ID_FLV1, "FLASH", 0, "FlashVideo1", ""},
+ {CODEC_ID_H264, "H264", 0, "H.264", ""},
+ {CODEC_ID_XVID, "XVID", 0, "Xvid", ""},
+#ifdef WITH_OGG
+ {CODEC_ID_THEORA, "THEORA", 0, "Theora", ""},
+#endif
+ {CODEC_ID_FLV1, "FLASH", 0, "Flash Video", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem ffmpeg_audio_codec_items[] = {
@@ -410,34 +1287,40 @@ void rna_def_scene_render_data(BlenderRNA *brna)
{CODEC_ID_PCM_S16LE, "PCM", 0, "PCM", ""},
{0, NULL, 0, NULL, NULL}};
#endif
-*/
+
+ static EnumPropertyItem engine_items[] = {
+ {0, "BLENDER_RENDER", 0, "Blender Render", ""},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "SceneRenderData", NULL);
RNA_def_struct_sdna(srna, "RenderData");
RNA_def_struct_nested(brna, srna, "Scene");
+ RNA_def_struct_path_func(srna, "rna_SceneRenderData_path");
RNA_def_struct_ui_text(srna, "Render Data", "Rendering settings for a Scene datablock.");
prop= RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "planes");
RNA_def_property_enum_items(prop, color_mode_items);
RNA_def_property_ui_text(prop, "Color Mode", "Choose BW for saving greyscale images, RGB for saving red, green and blue channels, AND RGBA for saving red, green, blue + alpha channels");
-
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
prop= RNA_def_property(srna, "resolution_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "xsch");
RNA_def_property_range(prop, 4, 10000);
RNA_def_property_ui_text(prop, "Resolution X", "Number of horizontal pixels in the rendered image.");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "resolution_y", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ysch");
RNA_def_property_range(prop, 4, 10000);
RNA_def_property_ui_text(prop, "Resolution Y", "Number of vertical pixels in the rendered image.");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "resolution_percentage", PROP_INT, PROP_PERCENTAGE);
RNA_def_property_int_sdna(prop, NULL, "size");
RNA_def_property_ui_range(prop, 1, 100, 10, 1);
RNA_def_property_ui_text(prop, "Resolution %", "Percentage scale for render resolution");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "parts_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "xparts");
@@ -455,13 +1338,13 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "xasp");
RNA_def_property_range(prop, 1.0f, 200.0f);
RNA_def_property_ui_text(prop, "Pixel Aspect X", "Horizontal aspect ratio - for anamorphic or non-square pixel output");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "pixel_aspect_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yasp");
RNA_def_property_range(prop, 1.0f, 200.0f);
RNA_def_property_ui_text(prop, "Pixel Aspect Y", "Vertical aspect ratio - for anamorphic or non-square pixel output");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, NULL);
/* JPEG and AVI JPEG */
@@ -503,7 +1386,7 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "G", "Log conversion gamma");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-//#ifdef WITH_OPENEXR
+#ifdef WITH_OPENEXR
/* OpenEXR */
prop= RNA_def_property(srna, "exr_codec", PROP_ENUM, PROP_NONE);
@@ -526,9 +1409,9 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_PREVIEW_JPG);
RNA_def_property_ui_text(prop, "Preview", "When rendering animations, save JPG preview images in same directory");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-//#endif
+#endif
-//#ifdef WITH_OPENJPEG
+#ifdef WITH_OPENJPEG
/* Jpeg 2000 */
prop= RNA_def_property(srna, "jpeg_preset", PROP_ENUM, PROP_NONE);
@@ -547,12 +1430,11 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_JPEG2K_YCC);
RNA_def_property_ui_text(prop, "YCC", "Save luminance-chrominance-chrominance channels instead of RGB colors");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-//#endif
+#endif
#ifdef WITH_FFMPEG
/* FFMPEG Video*/
- /*
prop= RNA_def_property(srna, "ffmpeg_format", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "ffcodecdata.type");
RNA_def_property_enum_items(prop, ffmpeg_format_items);
@@ -564,7 +1446,6 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_enum_items(prop, ffmpeg_codec_items);
RNA_def_property_ui_text(prop, "Codec", "FFMpeg codec to use");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- */
prop= RNA_def_property(srna, "ffmpeg_video_bitrate", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ffcodecdata.video_bitrate");
@@ -615,13 +1496,11 @@ void rna_def_scene_render_data(BlenderRNA *brna)
/* FFMPEG Audio*/
- /*
prop= RNA_def_property(srna, "ffmpeg_audio_codec", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "ffcodecdata.audio_codec");
RNA_def_property_enum_items(prop, ffmpeg_audio_codec_items);
- RNA_def_property_ui_text(prop, Codec", "FFMpeg codec to use");
+ RNA_def_property_ui_text(prop, "Audio Codec", "FFMpeg audio codec to use");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- */
prop= RNA_def_property(srna, "ffmpeg_audio_bitrate", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ffcodecdata.audio_bitrate");
@@ -633,6 +1512,19 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "ffcodecdata.flags", FFMPEG_MULTIPLEX_AUDIO);
RNA_def_property_ui_text(prop, "Multiplex Audio", "Interleave audio with the output video");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "ffmpeg_audio_mixrate", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "ffcodecdata.audio_mixrate");
+ RNA_def_property_range(prop, 8000, 192000);
+ RNA_def_property_ui_text(prop, "Samplerate", "Audio samplerate(samples/s)");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "ffmpeg_audio_volume", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ffcodecdata.audio_volume");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Volume", "Audio volume");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
#endif
prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE);
@@ -697,6 +1589,7 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, field_order_items);
RNA_def_property_ui_text(prop, "Field Order", "Order of video fields. Select which lines get rendered first, to create smooth motion for TV output");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "fields_still", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_FIELDSTILL);
@@ -738,10 +1631,10 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edge", "Create a toon outline around the edges of geometry");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "edge_intensity", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "edge_threshold", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "edgeint");
RNA_def_property_range(prop, 0, 255);
- RNA_def_property_ui_text(prop, "Edge Intensity", "Threshold for drawing outlines on geometry edges");
+ RNA_def_property_ui_text(prop, "Edge Threshold", "Threshold for drawing outlines on geometry edges");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "edge_color", PROP_FLOAT, PROP_COLOR);
@@ -750,14 +1643,10 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edge Color", "");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "panorama", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", R_PANORAMA);
- RNA_def_property_ui_text(prop, "Panorama", "Render the scene with a cylindrical camera for pseudo-fisheye lens effects");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
prop= RNA_def_property(srna, "threads", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "threads");
RNA_def_property_range(prop, 1, 8);
+ RNA_def_property_int_funcs(prop, "rna_SceneRenderData_threads_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Threads", "Number of CPU threads to use simultaneously while rendering (for multi-core/CPU systems)");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -765,42 +1654,72 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, threads_mode_items);
RNA_def_property_ui_text(prop, "Threads Mode", "Determine the amount of render threads used");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "motion_blur", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_MBLUR);
RNA_def_property_ui_text(prop, "Motion Blur", "Use multi-sampled 3D scene motion blur (uses number of anti-aliasing samples).");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "border", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_border", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_BORDER);
RNA_def_property_ui_text(prop, "Border", "Render a user-defined border region, within the frame size.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "border_min_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "border.xmin");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Border Minimum X", "Sets minimum X value to for the render border.");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "border_min_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "border.ymin");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Border Minimum Y", "Sets minimum Y value for the render border");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "border_max_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "border.xmax");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Border Maximum X", "Sets maximum X value for the render border");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "border_max_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "border.ymax");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Border Maximum Y", "Sets maximum Y value for the render border");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "crop_to_border", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_CROP);
RNA_def_property_ui_text(prop, "Crop to Border", "Crop the rendered frame to the defined border size.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "placeholders", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_placeholder", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", R_TOUCH);
RNA_def_property_ui_text(prop, "Placeholders", "Create empty placeholder files while rendering frames (similar to Unix 'touch').");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "no_overwrite", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mode", R_NO_OVERWRITE);
- RNA_def_property_ui_text(prop, "No Overwrite", "Skip and don't overwrite existing files while rendering");
+ prop= RNA_def_property(srna, "use_overwrite", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", R_NO_OVERWRITE);
+ RNA_def_property_ui_text(prop, "Overwrite", "Overwrite existing files while rendering.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "do_composite", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_compositing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_DOCOMP);
- RNA_def_property_ui_text(prop, "Do Composite", "Process the render result through the compositing pipeline");
+ RNA_def_property_ui_text(prop, "Compositing", "Process the render result through the compositing pipeline, if compositing nodes are enabled.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "do_sequence", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_sequencer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_DOSEQ);
- RNA_def_property_ui_text(prop, "Do Sequence", "Process the render (and composited) result through the video sequence editor pipeline");
+ RNA_def_property_ui_text(prop, "Sequencer", "Process the render (and composited) result through the video sequence editor pipeline, if sequencer strips exist.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ prop= RNA_def_property(srna, "color_management", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "color_mgt_flag", R_COLOR_MANAGEMENT);
+ RNA_def_property_ui_text(prop, "Color Management", "Use color profiles and gamma corrected imaging pipeline");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_MATERIAL|ND_SHADING, NULL);
+
prop= RNA_def_property(srna, "file_extensions", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXTENSION);
RNA_def_property_ui_text(prop, "File Extensions", "Add the file format extensions to the rendered file name (eg: filename + .jpg)");
@@ -809,6 +1728,7 @@ void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "file_format", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "imtype");
RNA_def_property_enum_items(prop, image_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_SceneRenderData_file_format_set", NULL);
RNA_def_property_ui_text(prop, "File Format", "File format to save the rendered images as.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -816,15 +1736,21 @@ void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FREE_IMAGE);
RNA_def_property_ui_text(prop, "Free Image Textures", "Free all image texture from memory after render, to save memory before compositing.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
+
+ prop= RNA_def_property(srna, "free_unused_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FREE_IMAGE);
+ RNA_def_property_ui_text(prop, "Free Unused Nodes", "Free Nodes that are not used while compositing, to save memory.");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
prop= RNA_def_property(srna, "save_buffers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXR_TILE_FILE);
- RNA_def_property_ui_text(prop, "Save Buffers","Save tiles for all RenderLayers and SceneNodes to files in the temp directory (saves memory, allows Full Sampling).");
+ RNA_def_property_boolean_funcs(prop, "rna_SceneRenderData_save_buffers_get", NULL);
+ RNA_def_property_ui_text(prop, "Save Buffers","Save tiles for all RenderLayers and SceneNodes to files in the temp directory (saves memory, required for Full Sample).");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "full_sample", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FULL_SAMPLE);
- 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_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, "backbuf", PROP_BOOLEAN, PROP_NONE);
@@ -832,15 +1758,69 @@ void rna_def_scene_render_data(BlenderRNA *brna)
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");
+ RNA_def_property_enum_items(prop, display_mode_items);
+ 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, "output_path", PROP_STRING, PROP_DIRPATH);
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);
+
+ /* Bake */
- prop= RNA_def_property(srna, "stamp", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_STAMP_INFO);
- RNA_def_property_ui_text(prop, "Stamp", "Embed metadata into the rendered image");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ prop= RNA_def_property(srna, "bake_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_mode");
+ RNA_def_property_enum_items(prop, bake_mode_items);
+ RNA_def_property_ui_text(prop, "Bake Mode", "");
+
+ prop= RNA_def_property(srna, "bake_normal_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_normal_space");
+ RNA_def_property_enum_items(prop, bake_normal_space_items);
+ RNA_def_property_ui_text(prop, "Normal Space", "Choose normal space for baking");
+
+ prop= RNA_def_property(srna, "bake_aa_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "bake_osa");
+ RNA_def_property_enum_items(prop, bake_aa_items);
+ RNA_def_property_ui_text(prop, "Anti-Aliasing Level", "");
+
+ prop= RNA_def_property(srna, "bake_active", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_TO_ACTIVE);
+ RNA_def_property_ui_text(prop, "Selected to Active", "Bake shading on the surface of selected objects to the active object");
+
+ prop= RNA_def_property(srna, "bake_normalized", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_NORMALIZE);
+ RNA_def_property_ui_text(prop, "Normalized", "");
+ //"Bake ambient occlusion normalized, without taking into acount material settings"
+ //"Normalized displacement value to fit the 'Dist' range"
+ // XXX: Need 1 tooltip here...
+
+ prop= RNA_def_property(srna, "bake_clear", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_CLEAR);
+ RNA_def_property_ui_text(prop, "Clear", "Clear Images before baking");
+
+ prop= RNA_def_property(srna, "bake_enable_aa", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "bake_flag", R_BAKE_OSA);
+ RNA_def_property_ui_text(prop, "Anti-Aliasing", "Enables Anti-aliasing");
+
+ prop= RNA_def_property(srna, "bake_margin", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "bake_filter");
+ RNA_def_property_range(prop, 0, 32);
+ RNA_def_property_ui_text(prop, "Margin", "Amount of pixels to extend the baked result with, as post process filter");
+
+ prop= RNA_def_property(srna, "bake_distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "bake_maxdist");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Distance", "Maximum distance from active object to other object (in blender units");
+
+ prop= RNA_def_property(srna, "bake_bias", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "bake_biasdist");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Bias", "Bias towards faces further away from the object (in blender units)");
+
+ /* stamp */
prop= RNA_def_property(srna, "stamp_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_TIME);
@@ -906,27 +1886,76 @@ void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "stamp_foreground", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "fg_stamp");
RNA_def_property_array(prop, 4);
+ RNA_def_property_range(prop,0.0,1.0);
RNA_def_property_ui_text(prop, "Stamp Foreground", "Stamp text color");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "stamp_background", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "bg_stamp");
RNA_def_property_array(prop, 4);
+ RNA_def_property_range(prop,0.0,1.0);
RNA_def_property_ui_text(prop, "Stamp Background", "Color to use behind stamp text");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ /* layers */
+ prop= RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "layers", NULL);
+ RNA_def_property_struct_type(prop, "SceneRenderLayer");
+ RNA_def_property_ui_text(prop, "Render Layers", "");
+
+ prop= RNA_def_property(srna, "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_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "active_layer_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "actlay");
+ RNA_def_property_int_funcs(prop, "rna_SceneRenderData_active_layer_index_get", "rna_SceneRenderData_active_layer_index_set", "rna_SceneRenderData_active_layer_index_range");
+ RNA_def_property_ui_text(prop, "Active Layer Index", "Active index in render layer array.");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ /* engine */
+ prop= RNA_def_property(srna, "engine", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, engine_items);
+ RNA_def_property_enum_funcs(prop, "rna_SceneRenderData_engine_get", "rna_SceneRenderData_engine_set", "rna_SceneRenderData_engine_itemf");
+ RNA_def_property_ui_text(prop, "Engine", "Engine to use for rendering.");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop= RNA_def_property(srna, "multiple_engines", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SceneRenderData_multiple_engines_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Multiple Engines", "More than one rendering engine is available.");
+
+ prop= RNA_def_property(srna, "use_game_engine", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_SceneRenderData_use_game_engine_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Use Game Engine", "Current rendering engine is a game engine.");
}
void RNA_def_scene(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
+
+ static EnumPropertyItem audio_distance_model_items[] = {
+ {0, "NONE", 0, "None", "No distance attenuation."},
+ {1, "INVERSE", 0, "Inverse", "Inverse distance model."},
+ {2, "INVERSE_CLAMPED", 0, "Inverse Clamped", "Inverse distance model with clamping."},
+ {3, "LINEAR", 0, "Linear", "Linear distance model."},
+ {4, "LINEAR_CLAMPED", 0, "Linear Clamped", "Linear distance model with clamping."},
+ {5, "EXPONENT", 0, "Exponent", "Exponent distance model."},
+ {6, "EXPONENT_CLAMPED", 0, "Exponent Clamped", "Exponent distance model with clamping."},
+ {0, NULL, 0, NULL, NULL}};
+ /* Struct definition */
srna= RNA_def_struct(brna, "Scene", "ID");
RNA_def_struct_ui_text(srna, "Scene", "Scene consisting objects and defining time and render related settings.");
RNA_def_struct_ui_icon(srna, ICON_SCENE_DATA);
RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
-
+
+ /* Global Settings */
prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Camera", "Active camera used for rendering the scene.");
@@ -934,90 +1963,210 @@ 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_WORLD, NULL);
- prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "cursor");
RNA_def_property_ui_text(prop, "Cursor Location", "3D cursor location.");
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4);
-
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ /* Bases/Objects */
prop= RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "base", NULL);
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_ui_text(prop, "Objects", "");
RNA_def_property_collection_funcs(prop, 0, 0, 0, "rna_Scene_objects_get", 0, 0, 0, 0, 0);
- prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_NONE);
+ /* Layers */
+ prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
RNA_def_property_array(prop, 20);
RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible when rendering the scene.");
RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set");
-
- prop= RNA_def_property(srna, "current_frame", PROP_INT, PROP_NONE);
+
+
+ /* Frame Range Stuff */
+ prop= RNA_def_property(srna, "current_frame", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_int_sdna(prop, NULL, "r.cfra");
- RNA_def_property_range(prop, MINFRAME, MAXFRAME);
+ RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update");
- prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_int_sdna(prop, NULL, "r.sfra");
RNA_def_property_int_funcs(prop, NULL, "rna_Scene_start_frame_set", NULL);
RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_int_sdna(prop, NULL, "r.efra");
RNA_def_property_int_funcs(prop, NULL, "rna_Scene_end_frame_set", NULL);
RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_TIME);
RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
RNA_def_property_int_sdna(prop, NULL, "frame_step");
RNA_def_property_ui_text(prop, "Frame Step", "Number of frames to skip forward while rendering/playing back each frame");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
+
+ /* Preview Range (frame-range for UI playback) */
+ prop=RNA_def_property(srna, "use_preview_range", PROP_BOOLEAN, PROP_NONE); /* use_preview_range is not really a separate setting in SDNA */
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Scene_use_preview_range_get", "rna_Scene_use_preview_range_set");
+ RNA_def_property_ui_text(prop, "Use Preview Range", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "preview_range_start_frame", PROP_INT, PROP_TIME);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_int_sdna(prop, NULL, "r.psfra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_start_frame_set", NULL);
+ RNA_def_property_ui_text(prop, "Preview Range Start Frame", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "preview_range_end_frame", PROP_INT, PROP_TIME);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
+ RNA_def_property_int_sdna(prop, NULL, "r.pefra");
+ RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_end_frame_set", NULL);
+ RNA_def_property_ui_text(prop, "Preview Range End Frame", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ /* Stamp */
prop= RNA_def_property(srna, "stamp_note", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "r.stamp_udata");
RNA_def_property_ui_text(prop, "Stamp Note", "User define note for the render stamping.");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
+
+ /* Nodes (Compositing) */
prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Node Tree", "Compositing node tree.");
+
+ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_use_nodes_set");
+ RNA_def_property_ui_text(prop, "Use Nodes", "Enable the compositing node tree.");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ /* Sequencer */
prop= RNA_def_property(srna, "sequence_editor", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ed");
RNA_def_property_struct_type(prop, "SequenceEditor");
RNA_def_property_ui_text(prop, "Sequence Editor", "");
- prop= RNA_def_property(srna, "keyingsets", PROP_COLLECTION, PROP_NONE);
+ /* Keying Sets */
+ prop= RNA_def_property(srna, "keying_sets", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL);
RNA_def_property_struct_type(prop, "KeyingSet");
RNA_def_property_ui_text(prop, "Keying Sets", "Keying Sets for this Scene.");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
- prop= RNA_def_property(srna, "active_keyingset", PROP_INT, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Active Keying Set", "Current Keying Set index.");
-
+ prop= RNA_def_property(srna, "active_keying_set", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "KeyingSet");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_editable_func(prop, "rna_Scene_active_keying_set_editable");
+ RNA_def_property_pointer_funcs(prop, "rna_Scene_active_keying_set_get", "rna_Scene_active_keying_set_set", NULL);
+ RNA_def_property_ui_text(prop, "Active Keying Set", "Active Keying Set used to insert/delete keyframes.");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
+
+ prop= RNA_def_property(srna, "active_keying_set_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "active_keyingset");
+ RNA_def_property_int_funcs(prop, "rna_Scene_active_keying_set_index_get", "rna_Scene_active_keying_set_index_set", "rna_Scene_active_keying_set_index_range");
+ RNA_def_property_ui_text(prop, "Active Keying Set Index", "Current Keying Set index.");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET, NULL);
+
+ /* Tool Settings */
prop= RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "toolsettings");
RNA_def_property_struct_type(prop, "ToolSettings");
RNA_def_property_ui_text(prop, "Tool Settings", "");
+ /* Unit Settings */
+ prop= RNA_def_property(srna, "unit_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "unit");
+ RNA_def_property_struct_type(prop, "UnitSettings");
+ RNA_def_property_ui_text(prop, "Unit Settings", "Unit editing settings");
+
+ /* Render Data */
prop= RNA_def_property(srna, "render_data", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "r");
RNA_def_property_struct_type(prop, "SceneRenderData");
RNA_def_property_ui_text(prop, "Render Data", "");
-
+
+ /* Markers */
prop= RNA_def_property(srna, "timeline_markers", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "markers", NULL);
RNA_def_property_struct_type(prop, "TimelineMarker");
RNA_def_property_ui_text(prop, "Timeline Markers", "Markers used in all timelines for the current scene.");
+ /* Audio Settings */
+ prop= RNA_def_property(srna, "mute_audio", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_MUTE);
+ RNA_def_property_ui_text(prop, "Audio Muted", "Play back of audio from Sequence Editor will be muted.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "sync_audio", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_SYNC);
+ RNA_def_property_ui_text(prop, "Audio Sync", "Play back and sync with audio from Sequence Editor.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "scrub_audio", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "audio.flag", AUDIO_SCRUB);
+ RNA_def_property_ui_text(prop, "Audio Scrubbing", "Play audio from Sequence Editor while scrubbing.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "speed_of_sound", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "audio.speed_of_sound");
+ RNA_def_property_range(prop, 1.0f, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Speed of Sound", "Speed of sound for doppler effect calculation.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "doppler_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "audio.doppler_factor");
+ RNA_def_property_range(prop, FLT_MIN, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Doppler Factor", "Pitch factor for doppler effect calculation.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "distance_model", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "audio.distance_model");
+ RNA_def_property_enum_items(prop, audio_distance_model_items);
+ RNA_def_property_ui_text(prop, "Distance Model", "Distance model for distance attenuation calculation.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ /* Game Settings */
+ prop= RNA_def_property(srna, "game_data", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "gm");
+ RNA_def_property_struct_type(prop, "SceneGameData");
+ RNA_def_property_ui_text(prop, "Game Data", "");
+
+ /* Statistics */
+ func= RNA_def_function(srna, "statistics", "ED_info_stats_string");
+ prop= RNA_def_string(func, "statistics", "", 0, "Statistics", "");
+ RNA_def_function_return(func, 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");
+
+ /* Nestled Data */
rna_def_tool_settings(brna);
+ rna_def_unit_settings(brna);
rna_def_scene_render_data(brna);
+ rna_def_scene_game_data(brna);
+ rna_def_scene_render_layer(brna);
+
+ /* Scene API */
+ RNA_api_scene(srna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
new file mode 100644
index 00000000000..40f2db6d4a4
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -0,0 +1,156 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Joshua Leung, Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+#include "RNA_types.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_animsys.h"
+#include "BKE_scene.h"
+#include "BKE_depsgraph.h"
+
+#include "ED_object.h"
+
+#include "WM_api.h"
+
+static void rna_Scene_add_object(Scene *sce, ReportList *reports, Object *ob)
+{
+ Base *base= object_in_scene(ob, sce);
+ if (base) {
+ BKE_report(reports, RPT_ERROR, "Object is already in this scene.");
+ return;
+ }
+ base= scene_add_base(sce, ob);
+ ob->id.us++;
+
+ /* this is similar to what object_add_type and add_object do */
+ ob->lay= base->lay= sce->lay;
+ ob->recalc |= OB_RECALC;
+
+ DAG_scene_sort(sce);
+}
+
+static void rna_Scene_remove_object(Scene *sce, ReportList *reports, Object *ob)
+{
+ Base *base= object_in_scene(ob, sce);
+ if (!base) {
+ BKE_report(reports, RPT_ERROR, "Object is not in this scene.");
+ return;
+ }
+ /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */
+ ED_base_object_free_and_unlink(sce, base);
+}
+
+static void rna_Scene_set_frame(Scene *sce, bContext *C, int frame)
+{
+ sce->r.cfra= frame;
+ CLAMP(sce->r.cfra, MINAFRAME, MAXFRAME);
+ scene_update_for_newframe(sce, (1<<20) - 1);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, sce);
+}
+
+static KeyingSet *rna_Scene_add_keying_set(Scene *sce, ReportList *reports,
+ char name[], int absolute, int insertkey_needed, int insertkey_visual)
+{
+ KeyingSet *ks= NULL;
+ short flag=0, keyingflag=0;
+
+ /* validate flags */
+ if (absolute)
+ flag |= KEYINGSET_ABSOLUTE;
+ if (insertkey_needed)
+ keyingflag |= INSERTKEY_NEEDED;
+ if (insertkey_visual)
+ keyingflag |= INSERTKEY_MATRIX;
+
+ /* call the API func, and set the active keyingset index */
+ ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag);
+
+ if (ks) {
+ sce->active_keyingset= BLI_countlist(&sce->keyingsets);
+ return ks;
+ }
+ else {
+ BKE_report(reports, RPT_ERROR, "Keying Set could not be added.");
+ return NULL;
+ }
+}
+
+#else
+
+void RNA_api_scene(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "add_object", "rna_Scene_add_object");
+ RNA_def_function_ui_description(func, "Add object to scene.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "remove_object", "rna_Scene_remove_object");
+ RNA_def_function_ui_description(func, "Remove 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);
+
+ func= RNA_def_function(srna, "set_frame", "rna_Scene_set_frame");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ 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);
+
+ /* Add Keying Set */
+ func= RNA_def_function(srna, "add_keying_set", "rna_Scene_add_keying_set");
+ RNA_def_function_ui_description(func, "Add a new Keying Set to Scene.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ /* returns the new KeyingSet */
+ parm= RNA_def_pointer(func, "keyingset", "KeyingSet", "", "Newly created Keying Set.");
+ RNA_def_function_return(func, parm);
+ /* name */
+ RNA_def_string(func, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
+ /* flags */
+ RNA_def_boolean(func, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
+ /* keying flags */
+ RNA_def_boolean(func, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
+ RNA_def_boolean(func, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index b7279757455..2a72845dd42 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -36,15 +36,50 @@ EnumPropertyItem region_type_items[] = {
{RGN_TYPE_WINDOW, "WINDOW", 0, "Window", ""},
{RGN_TYPE_HEADER, "HEADER", 0, "Header", ""},
{RGN_TYPE_CHANNELS, "CHANNELS", 0, "Channels", ""},
+ {RGN_TYPE_TOOLS, "TOOLS", 0, "Tools", ""},
{RGN_TYPE_TEMPORARY, "TEMPORARY", 0, "Temporary", ""},
{RGN_TYPE_UI, "UI", 0, "UI", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
+#include "ED_screen.h"
+
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value)
+{
+ bScreen *sc= (bScreen*)ptr->data;
+
+ if(value.data == NULL)
+ return;
+
+ /* exception: can't set screens inside of area/region handers */
+ sc->newscene= value.data;
+}
+
+static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
+{
+ bScreen *sc= (bScreen*)ptr->data;
+
+ /* exception: can't set screens inside of area/region handers */
+ if(sc->newscene) {
+ WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene);
+ sc->newscene= NULL;
+ }
+}
+
+static int rna_Screen_animation_playing_get(PointerRNA *ptr)
+{
+ bScreen *sc= (bScreen*)ptr->data;
+ return (sc->animtimer != NULL);
+}
+
#else
-static void rna_def_scrarea(BlenderRNA *brna)
+static void rna_def_area(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -71,18 +106,26 @@ static void rna_def_scrarea(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_menus", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", HEADER_NO_PULLDOWN);
RNA_def_property_ui_text(prop, "Show Menus", "Show menus in the header.");
+
+ RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
}
static void rna_def_region(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna= RNA_def_struct(brna, "Region", NULL);
RNA_def_struct_ui_text(srna, "Region", "Region in a subdivided screen area.");
RNA_def_struct_sdna(srna, "ARegion");
+
+ prop= RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "swinid");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Region ID", "Uniqute ID for this region.");
}
-static void rna_def_bscreen(BlenderRNA *brna)
+static void rna_def_screen(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -92,19 +135,27 @@ static void rna_def_bscreen(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);
- prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NEVER_NULL);
+ 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);
RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen.");
+ RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
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.");
+
+ prop= RNA_def_property(srna, "animation_playing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Screen_animation_playing_get", NULL);
+ RNA_def_property_ui_text(prop, "Animation Playing", "Animation playback is active.");
}
void RNA_def_screen(BlenderRNA *brna)
{
- rna_def_bscreen(brna);
- rna_def_scrarea(brna);
+ rna_def_screen(brna);
+ rna_def_area(brna);
rna_def_region(brna);
}
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
new file mode 100644
index 00000000000..ab4b27cea7b
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -0,0 +1,523 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#include "DNA_scene_types.h"
+
+#include "BKE_paint.h"
+
+#include "WM_types.h"
+
+static EnumPropertyItem particle_edit_hair_brush_items[] = {
+ {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush."},
+ {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb hairs."},
+ {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth hairs."},
+ {PE_BRUSH_ADD, "ADD", 0, "Add", "Add hairs."},
+ {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make hairs longer or shorter."},
+ {PE_BRUSH_PUFF, "PUFF", 0, "Puff", "Make hairs stand up."},
+ {PE_BRUSH_CUT, "CUT", 0, "Cut", "Cut hairs."},
+ {0, NULL, 0, NULL, NULL}};
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_context.h"
+#include "BKE_pointcache.h"
+#include "BKE_particle.h"
+#include "BKE_depsgraph.h"
+
+#include "ED_particle.h"
+
+static EnumPropertyItem particle_edit_cache_brush_items[] = {
+ {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush."},
+ {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb paths."},
+ {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth paths."},
+ {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make paths longer or shorter."},
+ {0, NULL, 0, NULL, NULL}};
+
+static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr)
+{
+ ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
+ ParticleBrushData *brush= NULL;;
+
+ if(pset->brushtype != PE_BRUSH_NONE)
+ brush= &pset->brush[pset->brushtype];
+
+ return rna_pointer_inherit_refine(ptr, &RNA_ParticleBrush, brush);
+}
+
+static PointerRNA rna_ParticleBrush_curve_get(PointerRNA *ptr)
+{
+ return rna_pointer_inherit_refine(ptr, &RNA_CurveMapping, NULL);
+}
+
+static void rna_Paint_brushes_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ Paint *p= (Paint*)ptr->data;
+ rna_iterator_array_begin(iter, (void*)p->brushes, sizeof(Brush*), p->brush_count, 0, NULL);
+}
+
+static int rna_Paint_brushes_length(PointerRNA *ptr)
+{
+ Paint *p= (Paint*)ptr->data;
+
+ return p->brush_count;
+}
+
+static PointerRNA rna_Paint_active_brush_get(PointerRNA *ptr)
+{
+ return rna_pointer_inherit_refine(ptr, &RNA_Brush, paint_brush(ptr->data));
+}
+
+static void rna_Paint_active_brush_set(PointerRNA *ptr, PointerRNA value)
+{
+ paint_brush_set(ptr->data, value.data);
+}
+
+static void rna_ParticleEdit_redo(bContext *C, PointerRNA *ptr)
+{
+ PTCacheEdit *edit = PE_get_current(CTX_data_scene(C), CTX_data_active_object(C));
+
+ if(!edit)
+ return;
+
+ psys_free_path_cache(edit->psys, edit);
+}
+
+static void rna_ParticleEdit_update(bContext *C, PointerRNA *ptr)
+{
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob) DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+}
+
+static EnumPropertyItem *rna_ParticleEdit_tool_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ if(C==NULL) {
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ /* needed for doc generation */
+ RNA_enum_items_add(&item, &totitem, particle_edit_hair_brush_items);
+ RNA_enum_item_end(&item, &totitem);
+
+ *free= 1;
+
+ return item;
+ }
+ else {
+ Scene *scene= CTX_data_scene(C);
+ PTCacheEdit *edit = PE_get_current(scene, CTX_data_active_object(C));
+
+ if(edit && edit->psys)
+ return particle_edit_hair_brush_items;
+
+ return particle_edit_cache_brush_items;
+ }
+}
+
+static int rna_ParticleEdit_editable_get(PointerRNA *ptr)
+{
+ ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
+
+ return (pset->object && PE_get_current(pset->scene, pset->object));
+}
+static int rna_ParticleEdit_hair_get(PointerRNA *ptr)
+{
+ ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
+
+ PTCacheEdit *edit = PE_get_current(pset->scene, pset->object);
+
+ return (edit && edit->psys);
+}
+#else
+
+static void rna_def_paint(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "Paint", NULL);
+ RNA_def_struct_ui_text(srna, "Paint", "");
+
+ prop= RNA_def_property(srna, "brushes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Brush");
+ RNA_def_property_collection_funcs(prop, "rna_Paint_brushes_begin",
+ "rna_iterator_array_next",
+ "rna_iterator_array_end",
+ "rna_iterator_array_dereference_get",
+ "rna_Paint_brushes_length", 0, 0, 0, 0);
+ RNA_def_property_ui_text(prop, "Brushes", "Brushes selected for this paint mode.");
+
+ prop= RNA_def_property(srna, "active_brush_index", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0, INT_MAX);
+
+ /* Fake property to get active brush directly, rather than integer index */
+ prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Brush");
+ RNA_def_property_pointer_funcs(prop, "rna_Paint_active_brush_get", "rna_Paint_active_brush_set", NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Brush", "Active paint brush.");
+}
+
+static void rna_def_sculpt(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "Sculpt", "Paint");
+ RNA_def_struct_ui_text(srna, "Sculpt", "");
+
+ prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X);
+ RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis.");
+
+ prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y);
+ RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis.");
+
+ prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z);
+ RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis.");
+
+ prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_X);
+ RNA_def_property_ui_text(prop, "Lock X", "Disallow changes to the X axis of vertices.");
+
+ prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Y);
+ RNA_def_property_ui_text(prop, "Lock Y", "Disallow changes to the Y axis of vertices.");
+
+ prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z);
+ RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices.");
+
+ prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_BRUSH);
+ RNA_def_property_ui_text(prop, "Show Brush", "");
+
+ prop= RNA_def_property(srna, "partial_redraw", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_FAST);
+ RNA_def_property_ui_text(prop, "Partial Redraw", "Optimize sculpting by only refreshing modified faces.");
+}
+
+static void rna_def_vertex_paint(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ static EnumPropertyItem prop_mode_items[] = {
+ {0, "MIX", 0, "Mix", "Use mix blending mode while painting."},
+ {1, "ADD", 0, "Add", "Use add blending mode while painting."},
+ {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting."},
+ {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting."},
+ {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"},
+ {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."},
+ {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting."},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "VertexPaint", "Paint");
+ RNA_def_struct_sdna(srna, "VPaint");
+ RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of vertex and weight paint mode.");
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_mode_items);
+ RNA_def_property_ui_text(prop, "Brush Mode", "Mode in which color is painted.");
+
+ prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA);
+ RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush.");
+
+ prop= RNA_def_property(srna, "vertex_dist", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SOFT);
+ RNA_def_property_ui_text(prop, "Vertex Dist", "Use distances to vertices (instead of paint entire faces).");
+
+ prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS);
+ RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting.");
+
+ prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY);
+ RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse.");
+
+ prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.1f, 5.0f);
+ RNA_def_property_ui_text(prop, "Gamma", "Vertex paint Gamma.");
+
+ prop= RNA_def_property(srna, "mul", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.1f, 50.0f);
+ RNA_def_property_ui_text(prop, "Mul", "Vertex paint Mul.");
+}
+
+static void rna_def_image_paint(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem tool_items[] = {
+ {PAINT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
+ {PAINT_TOOL_SOFTEN, "SOFTEN", 0, "Soften", ""},
+ {PAINT_TOOL_SMEAR, "SMEAR", 0, "Smear", ""},
+ {PAINT_TOOL_CLONE, "CLONE", 0, "Clone", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "ImagePaint", "Paint");
+ RNA_def_struct_sdna(srna, "ImagePaintSettings");
+ RNA_def_struct_ui_text(srna, "Image Paint", "Properties of image and texture painting mode.");
+
+ prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, tool_items);
+ RNA_def_property_ui_text(prop, "Tool", "");
+
+ /* 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.");
+
+ prop= RNA_def_property(srna, "use_occlude", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_XRAY);
+ RNA_def_property_ui_text(prop, "Occlude", "Only paint onto the faces directly under the brush (slower)");
+
+ prop= RNA_def_property(srna, "use_backface_cull", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_BACKFACE);
+ RNA_def_property_ui_text(prop, "Cull", "Ignore faces pointing away from the view (faster)");
+
+ prop= RNA_def_property(srna, "use_normal_falloff", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_FLAT);
+ RNA_def_property_ui_text(prop, "Normal", "Paint most on faces pointing towards the view");
+
+ prop= RNA_def_property(srna, "use_stencil_layer", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK);
+ RNA_def_property_ui_text(prop, "Stencil Layer", "Set the mask layer from the UV layer buttons");
+
+ prop= RNA_def_property(srna, "invert_stencil", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK_INV);
+ RNA_def_property_ui_text(prop, "Invert", "Invert the stencil layer");
+
+ prop= RNA_def_property(srna, "use_clone_layer", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_CLONE);
+ RNA_def_property_ui_text(prop, "Clone Layer", "Use another UV layer as clone source, otherwise use 3D the cursor as the source");
+
+ /* integers */
+
+ prop= RNA_def_property(srna, "seam_bleed", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_ui_range(prop, 0, 8, 0, 0);
+ RNA_def_property_ui_text(prop, "Bleed", "Extend paint beyond the faces UVs to reduce seams (in pixels, slower).");
+
+ prop= RNA_def_property(srna, "normal_angle", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_range(prop, 0, 90);
+ RNA_def_property_ui_text(prop, "Angle", "Paint most on faces pointing towards the view acording to this angle.");
+}
+
+static void rna_def_particle_edit(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem select_mode_items[] = {
+ {SCE_SELECT_PATH, "PATH", ICON_EDGESEL, "Path", ""}, // XXX icon
+ {SCE_SELECT_POINT, "POINT", ICON_VERTEXSEL, "Point", ""}, // XXX icon
+ {SCE_SELECT_END, "END", ICON_FACESEL, "End", "E"}, // XXX icon
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem puff_mode[] = {
+ {0, "ADD", 0, "Add", "Make hairs more puffy."},
+ {1, "SUB", 0, "Sub", "Make hairs less puffy."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem length_mode[] = {
+ {0, "GROW", 0, "Grow", "Make hairs longer."},
+ {1, "SHRINK", 0, "Shrink", "Make hairs shorter."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem edit_type_items[]= {
+ {PE_TYPE_PARTICLES, "PARTICLES", 0, "Particles", ""},
+ {PE_TYPE_SOFTBODY, "SOFT_BODY", 0, "Soft body", ""},
+ {PE_TYPE_CLOTH, "CLOTH", 0, "Cloth", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
+
+ /* edit */
+
+ srna= RNA_def_struct(brna, "ParticleEdit", NULL);
+ RNA_def_struct_sdna(srna, "ParticleEditSettings");
+ RNA_def_struct_ui_text(srna, "Particle Edit", "Properties of particle editing mode.");
+
+ prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "brushtype");
+ RNA_def_property_enum_items(prop, particle_edit_hair_brush_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_ParticleEdit_tool_itemf");
+ RNA_def_property_ui_text(prop, "Tool", "");
+
+ prop= RNA_def_property(srna, "selection_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "selectmode");
+ RNA_def_property_enum_items(prop, select_mode_items);
+ RNA_def_property_ui_text(prop, "Selection Mode", "Particle select and display mode.");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_ParticleEdit_update");
+
+ prop= RNA_def_property(srna, "keep_lengths", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_KEEP_LENGTHS);
+ RNA_def_property_ui_text(prop, "Keep Lengths", "Keep path lengths constant.");
+
+ prop= RNA_def_property(srna, "keep_root", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_LOCK_FIRST);
+ RNA_def_property_ui_text(prop, "Keep Root", "Keep root keys unmodified.");
+
+ prop= RNA_def_property(srna, "emitter_deflect", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DEFLECT_EMITTER);
+ RNA_def_property_ui_text(prop, "Deflect Emitter", "Keep paths from intersecting the emitter.");
+
+ prop= RNA_def_property(srna, "emitter_distance", PROP_FLOAT, PROP_UNSIGNED);
+ RNA_def_property_float_sdna(prop, NULL, "emitterdist");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 3);
+ RNA_def_property_ui_text(prop, "Emitter Distance", "Distance to keep particles away from the emitter.");
+
+ prop= RNA_def_property(srna, "fade_time", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_FADE_TIME);
+ RNA_def_property_ui_text(prop, "Fade Time", "Fade paths and keys further away from current frame.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_update");
+
+ prop= RNA_def_property(srna, "auto_velocity", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_AUTO_VELOCITY);
+ RNA_def_property_ui_text(prop, "Auto Velocity", "Calculate point velocities automatically.");
+
+ prop= RNA_def_property(srna, "draw_particles", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DRAW_PART);
+ RNA_def_property_ui_text(prop, "Draw Particles", "Draw actual particles.");
+ RNA_def_property_update(prop, NC_OBJECT, NULL);
+
+ prop= RNA_def_property(srna, "mirror_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_X_MIRROR);
+ RNA_def_property_ui_text(prop, "X-Axis Mirror", "Mirror operations over the X axis while editing.");
+
+ prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED);
+ RNA_def_property_ui_text(prop, "Interpolate", "Interpolate new particles from the existing ones.");
+
+ prop= RNA_def_property(srna, "add_keys", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "totaddkey");
+ RNA_def_property_range(prop, 2, INT_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.");
+
+ prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "ParticleBrush");
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Brush", "");
+
+ prop= RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 2, 10);
+ RNA_def_property_ui_text(prop, "Steps", "How many steps to draw the path with.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_redo");
+
+ prop= RNA_def_property(srna, "fade_frames", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 2, 100);
+ RNA_def_property_ui_text(prop, "Frames", "How many frames to fade.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_update");
+
+ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "edittype");
+ RNA_def_property_enum_items(prop, edit_type_items);
+ RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_ParticleEdit_redo");
+
+ prop= RNA_def_property(srna, "editable", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_ParticleEdit_editable_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Editable", "A valid edit mode exists");
+
+ prop= RNA_def_property(srna, "hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_ParticleEdit_hair_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Hair", "Editing hair");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "The edited object");
+
+
+ /* brush */
+
+ srna= RNA_def_struct(brna, "ParticleBrush", NULL);
+ RNA_def_struct_sdna(srna, "ParticleBrushData");
+ 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_ui_range(prop, 1, 100, 10, 3);
+ RNA_def_property_ui_text(prop, "Size", "Brush size.");
+
+ prop= RNA_def_property(srna, "strength", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_ui_range(prop, 1, 100, 10, 3);
+ RNA_def_property_ui_text(prop, "Strength", "Brush strength.");
+
+ 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_ui_range(prop, 1, 50, 10, 3);
+ RNA_def_property_ui_text(prop, "Steps", "Brush steps.");
+
+ prop= RNA_def_property(srna, "puff_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "invert");
+ RNA_def_property_enum_items(prop, puff_mode);
+ RNA_def_property_ui_text(prop, "Puff Mode", "");
+
+ prop= RNA_def_property(srna, "length_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "invert");
+ RNA_def_property_enum_items(prop, length_mode);
+ RNA_def_property_ui_text(prop, "Length Mode", "");
+
+ /* dummy */
+ prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "CurveMapping");
+ RNA_def_property_pointer_funcs(prop, "rna_ParticleBrush_curve_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Curve", "");
+}
+
+void RNA_def_sculpt_paint(BlenderRNA *brna)
+{
+ rna_def_paint(brna);
+ rna_def_sculpt(brna);
+ rna_def_vertex_paint(brna);
+ rna_def_image_paint(brna);
+ rna_def_particle_edit(brna);
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index 53bd230870f..1003af6d4d1 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -48,6 +48,8 @@ static StructRNA* rna_Sensor_refine(struct PointerRNA *ptr)
return &RNA_KeyboardSensor;
case SENS_PROPERTY:
return &RNA_PropertySensor;
+ case SENS_ARMATURE:
+ return &RNA_ArmatureSensor;
case SENS_MOUSE:
return &RNA_MouseSensor;
case SENS_COLLISION:
@@ -73,7 +75,7 @@ static StructRNA* rna_Sensor_refine(struct PointerRNA *ptr)
#else
-void rna_def_sensor(BlenderRNA *brna)
+static void rna_def_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -92,6 +94,7 @@ void rna_def_sensor(BlenderRNA *brna)
{SENS_JOYSTICK, "JOYSTICK", 0, "joystick", ""},
{SENS_ACTUATOR, "ACTUATOR", 0, "Actuator", ""},
{SENS_DELAY, "DELAY", 0, "Delay", ""},
+ {SENS_ARMATURE, "ARMATURE", 0, "Armature", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Sensor", NULL);
@@ -129,14 +132,14 @@ void rna_def_sensor(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 10000);
}
-void rna_def_always_sensor(BlenderRNA *brna)
+static void rna_def_always_sensor(BlenderRNA *brna)
{
StructRNA *srna;
srna= RNA_def_struct(brna, "AlwaysSensor", "Sensor");
RNA_def_struct_ui_text(srna, "Always Sensor", "Sensor to generate continuous pulses.");
}
-void rna_def_near_sensor(BlenderRNA *brna)
+static void rna_def_near_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -160,7 +163,7 @@ void rna_def_near_sensor(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 10000.0f);
}
-void rna_def_mouse_sensor(BlenderRNA *brna)
+static void rna_def_mouse_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -186,7 +189,7 @@ void rna_def_mouse_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mouse Event", "Specify the type of event this mouse sensor should trigger on.");
}
-void rna_def_touch_sensor(BlenderRNA *brna)
+static void rna_def_touch_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -201,7 +204,7 @@ void rna_def_touch_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Material", "Only look for floors with this material.");
}
-void rna_def_keyboard_sensor(BlenderRNA *brna)
+static void rna_def_keyboard_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -240,7 +243,7 @@ void rna_def_keyboard_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "All Keys", "Trigger this sensor on any keystroke.");
}
-void rna_def_property_sensor(BlenderRNA *brna)
+static void rna_def_property_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -278,7 +281,41 @@ void rna_def_property_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Maximum Value", "Specify maximum value in Interval type.");
}
-void rna_def_actuator_sensor(BlenderRNA *brna)
+static void rna_def_armature_sensor(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ static EnumPropertyItem prop_type_items[] ={
+ {SENS_ARM_STATE_CHANGED, "STATECHG", 0, "State Changed", ""},
+ {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", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "ArmatureSensor", "Sensor");
+ RNA_def_struct_ui_text(srna, "Armature Sensor", "Sensor to detect values and changes in values of IK solver.");
+ RNA_def_struct_sdna_from(srna, "bArmatureSensor", "data");
+
+ prop= RNA_def_property(srna, "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.");
+
+ prop= RNA_def_property(srna, "channel_name", 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");
+
+ prop= RNA_def_property(srna, "constraint_name", 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.");
+
+ prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_ui_text(prop, "Compare Value", "Specify value to be used in comparison.");
+}
+
+static void rna_def_actuator_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -292,7 +329,7 @@ void rna_def_actuator_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Actuator", "Actuator name, actuator active state modifications will be detected.");
}
-void rna_def_delay_sensor(BlenderRNA *brna)
+static void rna_def_delay_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -314,7 +351,7 @@ void rna_def_delay_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Repeat", "Toggle repeat option. If selected, the sensor restarts after Delay+Dur logic tics.");
}
-void rna_def_collision_sensor(BlenderRNA *brna)
+static void rna_def_collision_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -341,7 +378,7 @@ void rna_def_collision_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Collision Type", "Toggle collision on material or property.");
}
-void rna_def_radar_sensor(BlenderRNA *brna)
+static void rna_def_radar_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -376,7 +413,7 @@ void rna_def_radar_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distance", "Depth of the radar cone.");
}
-void rna_def_random_sensor(BlenderRNA *brna)
+static void rna_def_random_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -390,7 +427,7 @@ void rna_def_random_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Seed", "Initial seed of the generator. (Choose 0 for not random).");
}
-void rna_def_ray_sensor(BlenderRNA *brna)
+static void rna_def_ray_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -438,7 +475,7 @@ void rna_def_ray_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the ray is cast.");
}
-void rna_def_message_sensor(BlenderRNA *brna)
+static void rna_def_message_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -451,7 +488,7 @@ void rna_def_message_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Subject", "Optional subject filter: only accept messages with this subject, or empty for all.");
}
-void rna_def_joystick_sensor(BlenderRNA *brna)
+static void rna_def_joystick_sensor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -531,6 +568,7 @@ void RNA_def_sensor(BlenderRNA *brna)
rna_def_touch_sensor(brna);
rna_def_keyboard_sensor(brna);
rna_def_property_sensor(brna);
+ rna_def_armature_sensor(brna);
rna_def_actuator_sensor(brna);
rna_def_delay_sensor(brna);
rna_def_collision_sensor(brna);
diff --git a/source/blender/makesrna/intern/rna_sequence.c b/source/blender/makesrna/intern/rna_sequence.c
index 055e67fb135..51e81d6dd3a 100644
--- a/source/blender/makesrna/intern/rna_sequence.c
+++ b/source/blender/makesrna/intern/rna_sequence.c
@@ -38,9 +38,9 @@
#include "MEM_guardedalloc.h"
-#ifdef RNA_RUNTIME
+#include "WM_types.h"
-#include "MEM_guardedalloc.h"
+#ifdef RNA_RUNTIME
static int rna_SequenceEditor_name_length(PointerRNA *ptr)
{
@@ -192,10 +192,8 @@ static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr)
case SEQ_SCENE:
return &RNA_SceneSequence;
case SEQ_MOVIE:
- case SEQ_MOVIE_AND_HD_SOUND:
return &RNA_MovieSequence;
- case SEQ_RAM_SOUND:
- case SEQ_HD_SOUND:
+ case SEQ_SOUND:
return &RNA_SoundSequence;
case SEQ_CROSS:
case SEQ_ADD:
@@ -223,6 +221,16 @@ static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr)
}
}
+static char *rna_Sequence_path(PointerRNA *ptr)
+{
+ Sequence *seq= (Sequence*)ptr->data;
+
+ /* sequencer data comes from scene...
+ * TODO: would be nice to make SequenceEditor data a datablock of its own (for shorter paths)
+ */
+ return BLI_sprintfN("sequence_editor.sequences[\"%s\"]", seq->name+2);
+}
+
static PointerRNA rna_SequenceEdtior_meta_stack_get(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -231,6 +239,35 @@ static PointerRNA rna_SequenceEdtior_meta_stack_get(CollectionPropertyIterator *
return rna_pointer_inherit_refine(&iter->parent, &RNA_Sequence, ms->parseq);
}
+static void rna_MovieSequence_filename_set(PointerRNA *ptr, const char *value)
+{
+ Sequence *seq= (Sequence*)(ptr->data);
+ char dir[FILE_MAX], name[FILE_MAX];
+
+ BLI_split_dirfile_basic(value, dir, name);
+ BLI_strncpy(seq->strip->dir, dir, sizeof(seq->strip->dir));
+ BLI_strncpy(seq->strip->stripdata->name, name, sizeof(seq->strip->stripdata->name));
+}
+
+static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value)
+{
+ Sequence *seq= (Sequence*)(ptr->data);
+ char dir[FILE_MAX], name[FILE_MAX];
+
+ BLI_split_dirfile_basic(value, dir, name);
+ BLI_strncpy(seq->strip->dir, dir, sizeof(seq->strip->dir));
+ BLI_strncpy(seq->strip->stripdata->name, name, sizeof(seq->strip->stripdata->name));
+}
+
+static void rna_SequenceElement_filename_set(PointerRNA *ptr, const char *value)
+{
+ StripElem *elem= (StripElem*)(ptr->data);
+ char name[FILE_MAX];
+
+ BLI_split_dirfile_basic(value, NULL, name);
+ BLI_strncpy(elem->name, name, sizeof(elem->name));
+}
+
#else
static void rna_def_strip_element(BlenderRNA *brna)
@@ -245,6 +282,7 @@ static void rna_def_strip_element(BlenderRNA *brna)
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Filename", "");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SequenceElement_filename_set");
}
static void rna_def_strip_crop(BlenderRNA *brna)
@@ -362,9 +400,7 @@ static void rna_def_sequence(BlenderRNA *brna)
{SEQ_META, "META", 0, "Meta", ""},
{SEQ_SCENE, "SCENE", 0, "Scene", ""},
{SEQ_MOVIE, "MOVIE", 0, "Movie", ""},
- {SEQ_RAM_SOUND, "RAM_SOUND", 0, "Ram Sound", ""},
- {SEQ_HD_SOUND, "HD_SOUND", 0, "HD Sound", ""},
- {SEQ_MOVIE_AND_HD_SOUND, "MOVIE_AND_HD_SOUND", 0, "Movie and HD Sound", ""},
+ {SEQ_SOUND, "SOUND", 0, "Sound", ""},
{SEQ_EFFECT, "REPLACE", 0, "Replace", ""},
{SEQ_CROSS, "CROSS", 0, "Cross", ""},
{SEQ_ADD, "ADD", 0, "Add", ""},
@@ -397,6 +433,7 @@ static void rna_def_sequence(BlenderRNA *brna)
srna = RNA_def_struct(brna, "Sequence", NULL);
RNA_def_struct_ui_text(srna, "Sequence", "Sequence strip in the sequence editor.");
RNA_def_struct_refine_func(srna, "rna_Sequence_refine");
+ RNA_def_struct_path_func(srna, "rna_Sequence_path");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_Sequence_name_get", "rna_Sequence_name_length", "rna_Sequence_name_set");
@@ -429,10 +466,12 @@ static void rna_def_sequence(BlenderRNA *brna)
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MUTE);
RNA_def_property_ui_text(prop, "Mute", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "frame_locked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_IPO_FRAME_LOCKED);
RNA_def_property_ui_text(prop, "Frame Locked", "Lock the animation curve to the global frame counter.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_LOCK);
@@ -440,55 +479,65 @@ static void rna_def_sequence(BlenderRNA *brna)
/* strip positioning */
- prop= RNA_def_property(srna, "length", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "length", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "len");
RNA_def_property_range(prop, 1, MAXFRAME);
RNA_def_property_ui_text(prop, "Length", "The length of the contents of this strip before the handles are applied");
RNA_def_property_int_funcs(prop, "rna_SequenceEditor_length_get", "rna_SequenceEditor_length_set",NULL);
-
- prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
+
+ prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "start");
RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_int_funcs(prop, NULL, "rna_SequenceEditor_start_frame_set",NULL); // overlap tests and calc_seq_disp
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "start_offset", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "start_offset", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "startofs");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests
RNA_def_property_ui_text(prop, "Start Offset", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "end_offset", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "end_offset", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "endofs");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests
RNA_def_property_ui_text(prop, "End offset", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "start_still", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "start_still", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "startstill");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests
RNA_def_property_range(prop, 0, MAXFRAME);
RNA_def_property_ui_text(prop, "Start Still", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "end_still", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "end_still", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "endstill");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap tests
RNA_def_property_range(prop, 0, MAXFRAME);
RNA_def_property_ui_text(prop, "End Still", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "channel", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "machine");
+ RNA_def_property_range(prop, 0, MAXSEQ-1);
RNA_def_property_ui_text(prop, "Channel", "Y position of the sequence strip.");
RNA_def_property_int_funcs(prop, NULL, "rna_SequenceEditor_channel_set",NULL); // overlap test
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
/* blending */
prop= RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, blend_mode_items);
RNA_def_property_ui_text(prop, "Blend Mode", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "blend_opacity", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Blend Opacity", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
- /* funcsions */
+ /* functions */
func= RNA_def_function(srna, "getStripElem", "give_stripelem");
RNA_def_function_ui_description(func, "Return the strip element from a given frame or None.");
prop= RNA_def_int(func, "frame", 0, INT_MIN, INT_MAX, "Frame", "The frame to get the strip element from", INT_MIN, INT_MAX);
@@ -496,7 +545,7 @@ static void rna_def_sequence(BlenderRNA *brna)
RNA_def_function_return(func, RNA_def_pointer(func, "elem", "SequenceElement", "", "strip element of the current frame"));
}
-void rna_def_editor(BlenderRNA *brna)
+static void rna_def_editor(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -539,73 +588,71 @@ static void rna_def_filter_video(StructRNA *srna)
prop= RNA_def_property(srna, "premultiply", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MAKE_PREMUL);
RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "flip_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_FLIPX);
RNA_def_property_ui_text(prop, "Flip X", "Flip on the X axis.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "flip_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_FLIPY);
RNA_def_property_ui_text(prop, "Flip Y", "Flip on the Y axis.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "convert_float", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MAKE_FLOAT);
RNA_def_property_ui_text(prop, "Convert Float", "Convert input to float data.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_REVERSE_FRAMES);
RNA_def_property_ui_text(prop, "Flip Time", "Reverse frame order.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "multiply_colors", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "mul");
RNA_def_property_range(prop, 0.0f, 20.0f);
RNA_def_property_ui_text(prop, "Multiply Colors", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "strobe", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 1.0f, 30.0f);
RNA_def_property_ui_text(prop, "Strobe", "Only display every nth frame.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "use_color_balance", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_COLOR_BALANCE);
RNA_def_property_ui_text(prop, "Use Color Balance", "(3-Way color correction) on input.");
RNA_def_property_boolean_funcs(prop, NULL, "rna_SequenceEditor_use_color_balance_set");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "color_balance", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "strip->color_balance");
RNA_def_property_ui_text(prop, "Color Balance", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "use_translation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_TRANSFORM);
RNA_def_property_ui_text(prop, "Use Translation", "Translate image before processing.");
RNA_def_property_boolean_funcs(prop, NULL, "rna_SequenceEditor_use_translation_set");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "transform", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "strip->transform");
RNA_def_property_ui_text(prop, "Transform", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "use_crop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_USE_CROP);
RNA_def_property_ui_text(prop, "Use Crop", "Crop image before processing.");
RNA_def_property_boolean_funcs(prop, NULL, "rna_SequenceEditor_use_crop_set");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "crop", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "strip->crop");
RNA_def_property_ui_text(prop, "Crop", "");
-}
-
-static void rna_def_filter_sound(StructRNA *srna)
-{
- PropertyRNA *prop;
-
- prop= RNA_def_property(srna, "sound_gain", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "level");
- RNA_def_property_range(prop, -96.0f, 6.0f);
- RNA_def_property_ui_text(prop, "Sound Gain", "Sound level in dB (0 = full volume).");
-
- prop= RNA_def_property(srna, "sound_pan", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "pan");
- RNA_def_property_range(prop, -1.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Sound Pan", "Stereo sound balance.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_proxy(StructRNA *srna)
@@ -634,11 +681,13 @@ static void rna_def_input(StructRNA *srna)
RNA_def_property_int_sdna(prop, NULL, "anim_startofs");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap test
RNA_def_property_ui_text(prop, "Animation Start Offset", "Animation start offset (trim start).");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "animation_end_offset", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "anim_endofs");
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // overlap test
RNA_def_property_ui_text(prop, "Animation End Offset", "Animation end offset (trim end).");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_image(BlenderRNA *brna)
@@ -718,6 +767,7 @@ static void rna_def_movie(BlenderRNA *brna)
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "strip->stripdata->name");
RNA_def_property_ui_text(prop, "Filename", "");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MovieSequence_filename_set");
prop= RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "strip->dir");
@@ -738,18 +788,18 @@ static void rna_def_sound(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "Sequence");
prop= RNA_def_property(srna, "sound", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "UnknownType");
+ RNA_def_property_struct_type(prop, "Sound");
RNA_def_property_ui_text(prop, "Sound", "Sound datablock used by this sequence (RAM audio only).");
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "strip->stripdata->name");
RNA_def_property_ui_text(prop, "Filename", "");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoundSequence_filename_set");
prop= RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "strip->dir");
RNA_def_property_ui_text(prop, "Directory", "");
- rna_def_filter_sound(srna);
rna_def_input(srna);
}
@@ -810,21 +860,25 @@ static void rna_def_wipe(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "edgeWidth");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Blur Width", "Width of the blur edge, in percentage relative to the image size.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "angle");
RNA_def_property_range(prop, -90.0f, 90.0f);
RNA_def_property_ui_text(prop, "Angle", "Edge angle.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "direction", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "forward");
RNA_def_property_enum_items(prop, wipe_direction_items);
RNA_def_property_ui_text(prop, "Direction", "Wipe direction.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "transition_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "wipetype");
RNA_def_property_enum_items(prop, wipe_type_items);
RNA_def_property_ui_text(prop, "Transition Type", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_glow(BlenderRNA *brna)
@@ -840,30 +894,36 @@ static void rna_def_glow(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "fMini");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Threshold", "Minimum intensity to trigger a glow");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "clamp", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fClamp");
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Clamp", "rightness limit of intensity.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "boost_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fBoost");
RNA_def_property_range(prop, 0.0f, 10.0f);
RNA_def_property_ui_text(prop, "Boost Factor", "Brightness multiplier.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "blur_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dDist");
RNA_def_property_range(prop, 0.5f, 20.0f);
RNA_def_property_ui_text(prop, "Blur Distance", "Radius of glow effect.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "dQuality");
RNA_def_property_range(prop, 1, 5);
RNA_def_property_ui_text(prop, "Quality", "Accuracy of the blur effect.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "only_boost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bNoComp", 0);
RNA_def_property_ui_text(prop, "Only Boost", "Show the glow buffer only.");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_transform(BlenderRNA *brna)
@@ -892,60 +952,72 @@ static void rna_def_transform(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "ScalexIni");
RNA_def_property_ui_text(prop, "Scale Start X", "");
RNA_def_property_ui_range(prop, 0, 10, 3, 10);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "scale_start_y", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "ScaleyIni");
RNA_def_property_ui_text(prop, "Scale Start Y", "");
RNA_def_property_ui_range(prop, 0, 10, 3, 10);
-
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
+
prop= RNA_def_property(srna, "scale_end_x", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "ScalexFin");
RNA_def_property_ui_text(prop, "Scale End X", "");
RNA_def_property_ui_range(prop, 0, 10, 3, 10);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "scale_end_y", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "ScaleyFin");
RNA_def_property_ui_text(prop, "Scale End Y", "");
RNA_def_property_ui_range(prop, 0, 10, 3, 10);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "translate_start_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xIni");
RNA_def_property_ui_text(prop, "Translate Start X", "");
RNA_def_property_ui_range(prop, -500.0f, 500.0f, 3, 10);
-
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
+
prop= RNA_def_property(srna, "translate_start_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yIni");
RNA_def_property_ui_text(prop, "Translate Start Y", "");
RNA_def_property_ui_range(prop, -500.0f, 500.0f, 3, 10);
-
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
+
prop= RNA_def_property(srna, "translate_end_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xFin");
RNA_def_property_ui_text(prop, "Translate End X", "");
RNA_def_property_ui_range(prop, -500.0f, 500.0f, 3, 10);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "translate_end_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yFin");
RNA_def_property_ui_text(prop, "Translate End Y", "");
RNA_def_property_ui_range(prop, -500.0f, 500.0f, 3, 10);
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "rotation_start", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rotIni");
RNA_def_property_range(prop, 0.0f, 360.0f);
RNA_def_property_ui_text(prop, "Rotation Start", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "rotation_end", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rotFin");
RNA_def_property_range(prop, 0.0f, 360.0f);
RNA_def_property_ui_text(prop, "Rotation End", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "translation_unit", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "percent");
RNA_def_property_enum_items(prop, translation_unit_items);
RNA_def_property_ui_text(prop, "Translation Unit", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, interpolation_items);
RNA_def_property_ui_text(prop, "Interpolation", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_solid_color(BlenderRNA *brna)
@@ -960,6 +1032,7 @@ static void rna_def_solid_color(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "col");
RNA_def_property_ui_text(prop, "Color", "");
+ RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, NULL);
}
static void rna_def_speed_control(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
new file mode 100644
index 00000000000..7bccd685c1d
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -0,0 +1,280 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Daniel Genrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <limits.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#include "BKE_modifier.h"
+#include "BKE_smoke.h"
+
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
+
+#include "WM_types.h"
+
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_particle.h"
+
+#include "ED_object.h"
+
+static void rna_Smoke_update(bContext *C, PointerRNA *ptr)
+{
+ DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+}
+
+static void rna_Smoke_dependency_update(bContext *C, PointerRNA *ptr)
+{
+ rna_Smoke_update(C, ptr);
+ DAG_scene_sort(CTX_data_scene(C));
+}
+
+static void rna_Smoke_reset(bContext *C, PointerRNA *ptr)
+{
+ SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
+
+ smokeModifier_reset(settings->smd);
+
+ rna_Smoke_update(C, ptr);
+}
+
+static void rna_Smoke_reset_dependancy(bContext *C, PointerRNA *ptr)
+{
+ SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
+
+ smokeModifier_reset(settings->smd);
+
+ rna_Smoke_dependency_update(C, ptr);
+}
+
+static char *rna_SmokeDomainSettings_path(PointerRNA *ptr)
+{
+ SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)settings->smd;
+
+ return BLI_sprintfN("modifiers[%s].domain_settings", md->name);
+}
+
+static char *rna_SmokeFlowSettings_path(PointerRNA *ptr)
+{
+ SmokeFlowSettings *settings = (SmokeFlowSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)settings->smd;
+
+ return BLI_sprintfN("modifiers[%s].flow_settings", md->name);
+}
+
+static char *rna_SmokeCollSettings_path(PointerRNA *ptr)
+{
+ SmokeCollSettings *settings = (SmokeCollSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)settings->smd;
+
+ return BLI_sprintfN("modifiers[%s].coll_settings", md->name);
+}
+
+#else
+
+static void rna_def_smoke_domain_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem prop_noise_type_items[] = {
+ {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
+#if FFTW3 == 1
+ {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""},
+#endif
+ /* {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
+ {0, NULL, 0, NULL, NULL}};
+
+ srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings.");
+ RNA_def_struct_sdna(srna, "SmokeDomainSettings");
+ RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path");
+
+ prop= RNA_def_property(srna, "maxres", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "maxres");
+ RNA_def_property_range(prop, 24, 512);
+ RNA_def_property_ui_range(prop, 24, 512, 2, 0);
+ RNA_def_property_ui_text(prop, "Max Res", "Maximal resolution used in the fluid domain.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "amplify", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "amplify");
+ RNA_def_property_range(prop, 1, 10);
+ RNA_def_property_ui_range(prop, 1, 10, 1, 0);
+ RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "highres", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES);
+ RNA_def_property_ui_text(prop, "High res", "Enable high resolution (using amplification).");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "viewhighres", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "viewsettings", MOD_SMOKE_VIEW_SHOWBIG);
+ RNA_def_property_ui_text(prop, "Show High Resolution", "Show high resolution (using amplification).");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
+ prop= RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "noise");
+ RNA_def_property_enum_items(prop, prop_noise_type_items);
+ RNA_def_property_ui_text(prop, "Noise Method", "Noise method which is used for creating the high resolution");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
+ 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_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_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "coll_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "coll_group");
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Collision Group", "Limit collisions to this group.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
+
+ prop= RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "fluid_group");
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
+
+ prop= RNA_def_property(srna, "eff_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "eff_group");
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this group.");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy");
+
+ prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "strength");
+ RNA_def_property_range(prop, 1.0, 10.0);
+ RNA_def_property_ui_range(prop, 1.0, 10.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Strength", "Strength of wavelet noise");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
+
+ prop= RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "diss_speed");
+ RNA_def_property_range(prop, 1.0, 100.0);
+ RNA_def_property_ui_range(prop, 1.0, 1000.0, 1, 0);
+ RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
+ RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "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);
+
+ prop= RNA_def_property(srna, "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);
+
+ prop= RNA_def_property(srna, "point_cache_low", 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", "");
+}
+
+static void rna_def_smoke_flow_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings.");
+ RNA_def_struct_sdna(srna, "SmokeFlowSettings");
+ RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path");
+
+ prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "density");
+ RNA_def_property_range(prop, 0.001, 1);
+ RNA_def_property_ui_range(prop, 0.001, 1.0, 1.0, 4);
+ RNA_def_property_ui_text(prop, "Density", "");
+ RNA_def_property_update(prop, 0, NULL); // NC_OBJECT|ND_MODIFIER
+
+ prop= RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "temp");
+ RNA_def_property_range(prop, -10, 10);
+ RNA_def_property_ui_range(prop, -10, 10, 1, 1);
+ RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambientt temperature.");
+ RNA_def_property_update(prop, 0, NULL);
+
+ prop= RNA_def_property(srna, "psys", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "psys");
+ RNA_def_property_struct_type(prop, "ParticleSystem");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object.");
+ RNA_def_property_update(prop, 0, "rna_Smoke_reset_dependancy");
+
+ prop= RNA_def_property(srna, "outflow", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "type", MOD_SMOKE_FLOW_TYPE_OUTFLOW);
+ RNA_def_property_ui_text(prop, "Outflow", "Deletes smoke from simulation");
+ RNA_def_property_update(prop, 0, NULL);
+}
+
+static void rna_def_smoke_coll_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna = RNA_def_struct(brna, "SmokeCollSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings.");
+ RNA_def_struct_sdna(srna, "SmokeCollSettings");
+ RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path");
+}
+
+void RNA_def_smoke(BlenderRNA *brna)
+{
+ rna_def_smoke_domain_settings(brna);
+ rna_def_smoke_flow_settings(brna);
+ rna_def_smoke_coll_settings(brna);
+}
+
+#endif
+
diff --git a/source/blender/makesrna/intern/rna_sound.c b/source/blender/makesrna/intern/rna_sound.c
index 363a5595b43..38e4d850c68 100644
--- a/source/blender/makesrna/intern/rna_sound.c
+++ b/source/blender/makesrna/intern/rna_sound.c
@@ -34,97 +34,30 @@
#ifdef RNA_RUNTIME
-#else
-
-/* sample and listener are internal .. */
+#include "BKE_sound.h"
+#include "BKE_context.h"
-#if 0
-static void rna_def_sample(BlenderRNA *brna)
+static void rna_Sound_filename_update(bContext *C, PointerRNA *ptr)
{
- StructRNA *srna;
- PropertyRNA *prop;
-
- /* sound types */
- static EnumPropertyItem prop_sample_type_items[] = {
- {SAMPLE_INVALID, "INVALID", 0, "Invalid", ""},
- {SAMPLE_UNKNOWN, "UNKNOWN", 0, "Unknown", ""},
- {SAMPLE_RAW, "RAW", 0, "Raw", ""},
- {SAMPLE_WAV, "WAV", 0, "WAV", "Uncompressed"},
- {SAMPLE_MP2, "MP2", 0, "MP2", "MPEG-1 Audio Layer 2"},
- {SAMPLE_MP3, "MP3", 0, "MP3", "MPEG-1 Audio Layer 3"},
- {SAMPLE_OGG_VORBIS, "OGG_VORBIS", 0, "Ogg Vorbis", ""},
- {SAMPLE_WMA, "WMA", 0, "WMA", "Windows Media Audio"},
- {SAMPLE_ASF, "ASF", 0, "ASF", "Windows Advanced Systems Format"},
- {SAMPLE_AIFF, "AIFF", 0, "AIFF", "Audio Interchange File Format"},
- {0, NULL, 0, NULL, NULL}};
-
- srna= RNA_def_struct(brna, "SoundSample", "ID");
- RNA_def_struct_sdna(srna, "bSample");
- RNA_def_struct_ui_text(srna, "SoundSample", "Sound data loaded from a sound datablock.");
-
- prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_sample_type_items);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Types", "");
-
- prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
- RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Filename", "Full path filename of the sample");
-
- prop= RNA_def_property(srna, "length", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "len");
- RNA_def_property_ui_text(prop, "Length", "The length of sample in seconds");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
- prop= RNA_def_property(srna, "rate", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_ui_text(prop, "Rate", "Sample rate in kHz");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
- prop= RNA_def_property(srna, "bits", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_ui_text(prop, "Bits", "Bit-depth of sample");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
- prop= RNA_def_property(srna, "channels", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_ui_text(prop, "Channels", "Number of channels (mono=1; stereo=2)");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ sound_load(CTX_data_main(C), (bSound*)ptr->data);
}
-static void rna_def_soundlistener(BlenderRNA *brna)
+static int rna_Sound_caching_get(PointerRNA *ptr)
{
+ bSound *sound = (bSound*)(ptr->data);
+ return sound->cache != NULL;
+}
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna= RNA_def_struct(brna, "SoundListener", "ID");
- RNA_def_struct_sdna(srna, "bSoundListener");
- RNA_def_struct_ui_text(srna, "Sound Listener", "Sound listener defining parameters about how sounds are played.");
-
- prop= RNA_def_property(srna, "gain", PROP_FLOAT, PROP_NONE);
- RNA_def_property_ui_text(prop, "Gain", "Overall volume for Game Engine sound.");
- RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 4);
-
- prop= RNA_def_property(srna, "doppler_factor", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "dopplerfactor");
- RNA_def_property_ui_text(prop, "Doppler Factor", "Amount of Doppler effect in Game Engine sound.");
- RNA_def_property_ui_range(prop, 0.0, 10.0, 1, 4);
-
- prop= RNA_def_property(srna, "doppler_velocity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "dopplervelocity");
- RNA_def_property_ui_text(prop, "Doppler Velocity", "The speed of sound in the Game Engine.");
- RNA_def_property_ui_range(prop, 0.0, 10000.0, 0.1, 4);
-
- prop= RNA_def_property(srna, "num_sounds_blender", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "numsoundsblender");
- RNA_def_property_ui_text(prop, "Total Sounds in Blender", "The total number of sounds currently linked and available.");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
- prop= RNA_def_property(srna, "num_sounds_gameengine", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "numsoundsgameengine");
- RNA_def_property_ui_text(prop, "Total Sounds in Game Engine", "The total number of sounds in the Game Engine.");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+static void rna_Sound_caching_set(PointerRNA *ptr, const int value)
+{
+ bSound *sound = (bSound*)(ptr->data);
+ if(value)
+ sound_cache(sound, 0);
+ else
+ sound_delete_cache(sound);
}
-#endif
+
+#else
static void rna_def_sound(BlenderRNA *brna)
{
@@ -138,88 +71,23 @@ static void rna_def_sound(BlenderRNA *brna)
//rna_def_ipo_common(srna);
- /*prop= RNA_def_property(srna, "sample", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "SoundSample");
- RNA_def_property_ui_text(prop, "Sample", "Sound sample.");*/
-
prop= RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Filename", "Sound sample file used by this Sound datablock.");
+ RNA_def_property_update(prop, 0, "rna_Sound_filename_update");
prop= RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "packedfile");
RNA_def_property_ui_text(prop, "Packed File", "");
- /* game engine settings */
- prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_UNSIGNED);
- RNA_def_property_float_sdna(prop, NULL, "volume");
- RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 4);
- RNA_def_property_ui_text(prop, "Volume", "Game engine only: volume for this sound.");
-
- prop= RNA_def_property(srna, "pitch", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "pitch");
- RNA_def_property_ui_range(prop, -12.0, 12.0, 10, 4);
- RNA_def_property_ui_text(prop, "Pitch", "Game engine only: set the pitch of this sound.");
-
- prop= RNA_def_property(srna, "loop", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_LOOP);
- RNA_def_property_ui_text(prop, "Sound Loop", "Game engine only: toggle between looping on/off.");
-
- prop= RNA_def_property(srna, "ping_pong", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_BIDIRECTIONAL_LOOP);
- RNA_def_property_ui_text(prop, "Ping Pong", "Game engine only: Toggle between A->B and A->B->A looping.");
-
- prop= RNA_def_property(srna, "sound_3d", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_3D);
- RNA_def_property_ui_text(prop, "3D Sound", "Game engine only: turns 3D sound on.");
-
- prop= RNA_def_property(srna, "attenuation", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "attenuation");
- RNA_def_property_range(prop, 0.0, 5.0);
- RNA_def_property_ui_text(prop, "Attenuation", "Game engine only: sets the surround scaling factor for 3D sound.");
-
- /* gain */
- prop= RNA_def_property(srna, "min_gain", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "min_gain");
- RNA_def_property_range(prop, 0.0, 1.0);
- RNA_def_property_ui_text(prop, "Min Gain", "Minimal gain which is always guaranteed for this sound.");
-
- prop= RNA_def_property(srna, "max_gain", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "max_gain");
- RNA_def_property_range(prop, 0.0, 1.0);
- RNA_def_property_ui_text(prop, "Max Gain", "Maximal gain which is always guaranteed for this sound.");
-
- prop= RNA_def_property(srna, "reference_distance", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "distance");
- RNA_def_property_ui_text(prop, "Reference Distance", "Reference distance at which the listener will experience gain.");
- RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 4); /* NOT used anywhere */
-
- /* unused
- prop= RNA_def_property(srna, "panning", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "panning");
- RNA_def_property_ui_range(prop, -1.0, 1.0, 10, 4);
- RNA_def_property_ui_text(prop, "Panning", "Pan the sound from left to right"); */
-
- /* unused
- prop= RNA_def_property(srna, "fixed_volume", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_FIXED_VOLUME);
- RNA_def_property_ui_text(prop, "Fixed Volume", "Constraint sound to fixed volume."); */
-
- /* unused
- prop= RNA_def_property(srna, "fixed_panning", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_FIXED_PANNING);
- RNA_def_property_ui_text(prop, "Fixed Panning", "Constraint sound to fixed panning."); */
-
- /* unused
- prop= RNA_def_property(srna, "priority", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_PRIORITY);
- RNA_def_property_ui_text(prop, "Priority", "Make sound higher priority."); */
+ prop= RNA_def_property(srna, "caching", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_Sound_caching_get", "rna_Sound_caching_set");
+ RNA_def_property_ui_text(prop, "Caching", "The sound file is decoded and loaded into RAM.");
+ RNA_def_property_update(prop, 0, "rna_Sound_filename_update");
}
void RNA_def_sound(BlenderRNA *brna)
{
- //rna_def_sample(brna);
- //rna_def_soundlistener(brna);
rna_def_sound(brna);
}
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index d5ac0d6e427..df956670eb3 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -24,16 +24,21 @@
#include <stdlib.h>
+#include "MEM_guardedalloc.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
#include "rna_internal.h"
+#include "DNA_action_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
+#include "WM_api.h"
#include "WM_types.h"
EnumPropertyItem space_type_items[] = {
@@ -41,10 +46,10 @@ EnumPropertyItem space_type_items[] = {
{SPACE_VIEW3D, "VIEW_3D", 0, "3D View", ""},
{SPACE_IPO, "GRAPH_EDITOR", 0, "Graph Editor", ""},
{SPACE_OUTLINER, "OUTLINER", 0, "Outliner", ""},
- {SPACE_BUTS, "BUTTONS_WINDOW", 0, "Buttons Window", ""},
+ {SPACE_BUTS, "PROPERTIES", 0, "Properties", ""},
{SPACE_FILE, "FILE_BROWSER", 0, "File Browser", ""},
{SPACE_IMAGE, "IMAGE_EDITOR", 0, "Image Editor", ""},
- {SPACE_INFO, "USER_PREFERENCES", 0, "User Preferences", ""},
+ {SPACE_INFO, "INFO", 0, "Info", ""},
{SPACE_SEQ, "SEQUENCE_EDITOR", 0, "Sequence Editor", ""},
{SPACE_TEXT, "TEXT_EDITOR", 0, "Text Editor", ""},
//{SPACE_IMASEL, "IMAGE_BROWSER", 0, "Image Browser", ""},
@@ -55,6 +60,8 @@ 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_USERPREF, "USER_PREFERENCES", 0, "User Preferences", ""},
{0, NULL, 0, NULL, NULL}};
#define DC_RGB {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors."}
@@ -72,13 +79,18 @@ static EnumPropertyItem dc_all_items[] = {DC_RGB, DC_RGBA, DC_ALPHA, DC_Z, DC_LC
#ifdef RNA_RUNTIME
+#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "BKE_animsys.h"
#include "BKE_brush.h"
+#include "BKE_colortools.h"
#include "BKE_context.h"
+#include "BKE_paint.h"
#include "ED_image.h"
+#include "ED_screen.h"
#include "IMB_imbuf_types.h"
@@ -89,19 +101,18 @@ static StructRNA* rna_Space_refine(struct PointerRNA *ptr)
switch(space->spacetype) {
case SPACE_VIEW3D:
return &RNA_Space3DView;
- /*case SPACE_IPO:
+ case SPACE_IPO:
return &RNA_SpaceGraphEditor;
- */
case SPACE_OUTLINER:
return &RNA_SpaceOutliner;
case SPACE_BUTS:
- return &RNA_SpaceButtonsWindow;
- /* case SPACE_FILE:
- return &RNA_SpaceFileBrowser;*/
+ return &RNA_SpaceProperties;
+ case SPACE_FILE:
+ return &RNA_SpaceFileBrowser;
case SPACE_IMAGE:
return &RNA_SpaceImageEditor;
- /*case SPACE_INFO:
- return &RNA_SpaceUserPreferences;*/
+ case SPACE_INFO:
+ return &RNA_SpaceInfo;
case SPACE_SEQ:
return &RNA_SpaceSequenceEditor;
case SPACE_TEXT:
@@ -109,19 +120,23 @@ static StructRNA* rna_Space_refine(struct PointerRNA *ptr)
//case SPACE_IMASEL:
// return &RNA_SpaceImageBrowser;
/*case SPACE_SOUND:
- return &RNA_SpaceAudioWindow;
+ return &RNA_SpaceAudioWindow;*/
case SPACE_ACTION:
return &RNA_SpaceDopeSheetEditor;
case SPACE_NLA:
- return &RNA_SpaceNLAEditor;
- case SPACE_SCRIPT:
- return &RNA_SpaceScriptsWindow;
+ return &RNA_SpaceNLA;
+ /*case SPACE_SCRIPT:
+ return &RNA_SpaceScriptsWindow;*/
case SPACE_TIME:
return &RNA_SpaceTimeline;
case SPACE_NODE:
return &RNA_SpaceNodeEditor;
case SPACE_LOGIC:
- return &RNA_SpaceLogicEditor;*/
+ return &RNA_SpaceLogicEditor;
+ case SPACE_CONSOLE:
+ return &RNA_SpaceConsole;
+ case SPACE_USERPREF:
+ return &RNA_SpaceUserPreferences;
default:
return &RNA_Space;
}
@@ -139,7 +154,7 @@ static void rna_SpaceImageEditor_paint_update(bContext *C, PointerRNA *ptr)
Scene *scene= CTX_data_scene(C);
if(scene)
- brush_check_exists(&scene->toolsettings->imapaint.brush);
+ paint_init(&scene->toolsettings->imapaint.paint, PAINT_CURSOR_TEXTURE_PAINT);
}
static int rna_SpaceImageEditor_show_render_get(PointerRNA *ptr)
@@ -173,12 +188,17 @@ static EnumPropertyItem dc_rgb_items[] = {DC_RGB, DC_LCMS, DC_ZERO};
static EnumPropertyItem dc_alpha_items[] = {DC_RGB, DC_RGBA, DC_ALPHA, DC_LCMS, DC_ZERO};
static EnumPropertyItem dc_z_items[] = {DC_RGB, DC_Z, DC_LCMS, DC_ZERO};
-static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(PointerRNA *ptr)
+static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *C, PointerRNA *ptr, int *free)
{
SpaceImage *sima= (SpaceImage*)ptr->data;
ImBuf *ibuf= ED_space_image_buffer(sima);
int zbuf, alpha;
+ if(C==NULL) {
+ /* needed for doc generation */
+ return dc_all_items;
+ }
+
alpha= ibuf && (ibuf->channels == 4);
zbuf= ibuf && (ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels==1));
@@ -192,9 +212,18 @@ static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(PointerRNA *pt
return dc_rgb_items;
}
+static void rna_SpaceImageEditor_curves_update(bContext *C, PointerRNA *ptr)
+{
+ SpaceImage *sima= (SpaceImage*)ptr->data;
+
+ curvemapping_do_ibuf(sima->cumap, ED_space_image_buffer(sima));
+ WM_event_add_notifier(C, NC_IMAGE, sima->image);
+}
+
+
/* Space Text Editor */
-void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, int value)
+static void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, int value)
{
SpaceText *st= (SpaceText*)(ptr->data);
@@ -202,7 +231,7 @@ void rna_SpaceTextEditor_word_wrap_set(PointerRNA *ptr, int value)
st->left= 0;
}
-void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value)
+static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value)
{
SpaceText *st= (SpaceText*)(ptr->data);
@@ -210,9 +239,9 @@ void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value)
st->top= 0;
}
-/* Space Buttons */
+/* Space Properties */
-StructRNA *rna_SpaceButtonsWindow_pin_id_typef(PointerRNA *ptr)
+static StructRNA *rna_SpaceProperties_pin_id_typef(PointerRNA *ptr)
{
SpaceButs *sbuts= (SpaceButs*)(ptr->data);
@@ -222,6 +251,101 @@ StructRNA *rna_SpaceButtonsWindow_pin_id_typef(PointerRNA *ptr)
return &RNA_ID;
}
+static void rna_SpaceProperties_align_set(PointerRNA *ptr, int value)
+{
+ SpaceButs *sbuts= (SpaceButs*)(ptr->data);
+
+ sbuts->align= value;
+ sbuts->re_align= 1;
+}
+
+/* Space Console */
+static void rna_ConsoleLine_line_get(PointerRNA *ptr, char *value)
+{
+ ConsoleLine *ci= (ConsoleLine*)ptr->data;
+ strcpy(value, ci->line);
+}
+
+static int rna_ConsoleLine_line_length(PointerRNA *ptr)
+{
+ ConsoleLine *ci= (ConsoleLine*)ptr->data;
+ return ci->len;
+}
+
+static void rna_ConsoleLine_line_set(PointerRNA *ptr, const char *value)
+{
+ ConsoleLine *ci= (ConsoleLine*)ptr->data;
+ int len= strlen(value);
+
+ if(len < ci->len_alloc) { /* allocated size is enough? */
+ strcpy(ci->line, value);
+ }
+ else { /* allocate a new strnig */
+ MEM_freeN(ci->line);
+ ci->line= BLI_strdup(value);
+ ci->len_alloc= len;
+ }
+ ci->len= len;
+
+ if(ci->cursor > len) /* clamp the cursor */
+ ci->cursor= len;
+}
+
+static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ ConsoleLine *ci= (ConsoleLine*)ptr->data;
+
+ *min= 0;
+ *max= ci->len;
+}
+
+static void rna_View3D_display_background_image_set(PointerRNA *ptr, int value)
+{
+ View3D *vd= (View3D*)ptr->data;
+
+ if(value) vd->flag |= V3D_DISPBGPIC;
+ else vd->flag &= ~V3D_DISPBGPIC;
+
+ if((vd->flag & V3D_DISPBGPIC) && vd->bgpic == NULL) {
+ vd->bgpic= MEM_callocN(sizeof(BGpic), "bgpic");
+ vd->bgpic->size= 5.0;
+ vd->bgpic->blend= 0.5;
+ vd->bgpic->iuser.fie_ima= 2;
+ vd->bgpic->iuser.ok= 1;
+ }
+}
+
+/* Space Time */
+
+static void rna_SpaceTime_redraw_update(bContext *C, PointerRNA *ptr)
+{
+ SpaceTime *st= (SpaceTime*)ptr->data;
+ ED_screen_animation_timer_update(C, st->redraws);
+}
+
+/* Space Dopesheet */
+
+static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr, PointerRNA value)
+{
+ SpaceAction *saction= (SpaceAction*)(ptr->data);
+ saction->action= value.data;
+}
+
+static void rna_SpaceDopeSheetEditor_action_update(bContext *C, PointerRNA *ptr)
+{
+ SpaceAction *saction= (SpaceAction*)(ptr->data);
+ Object *obact= CTX_data_active_object(C);
+
+ /* 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 */
+
+ /* set action */
+ adt->action= saction->action;
+ id_us_plus(&adt->action->id);
+ }
+}
+
#else
static void rna_def_space(BlenderRNA *brna)
@@ -248,8 +372,8 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
static EnumPropertyItem sticky_mode_items[] = {
{SI_STICKY_DISABLE, "DISABLED", ICON_STICKY_UVS_DISABLE, "Disabled", "Sticky vertex selection disabled."},
- {SI_STICKY_LOC, "SHARED_LOCATION", ICON_STICKY_UVS_LOC, "SHARED_LOCATION", "Select UVs that are at the same location and share a mesh vertex."},
- {SI_STICKY_VERTEX, "SHARED_VERTEX", ICON_STICKY_UVS_VERT, "SHARED_VERTEX", "Select UVs that share mesh vertex, irrespective if they are in the same location."},
+ {SI_STICKY_LOC, "SHARED_LOCATION", ICON_STICKY_UVS_LOC, "Shared Location", "Select UVs that are at the same location and share a mesh vertex."},
+ {SI_STICKY_VERTEX, "SHARED_VERTEX", ICON_STICKY_UVS_VERT, "Shared Vertex", "Select UVs that share mesh vertex, irrespective if they are in the same location."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem dt_uv_items[] = {
@@ -280,65 +404,68 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "sticky");
RNA_def_property_enum_items(prop, sticky_mode_items);
RNA_def_property_ui_text(prop, "Sticky Selection Mode", "Automatically select also UVs sharing the same vertex as the ones being selected.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
/* drawing */
prop= RNA_def_property(srna, "edge_draw_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt_uv");
RNA_def_property_enum_items(prop, dt_uv_items);
RNA_def_property_ui_text(prop, "Edge Draw Type", "Draw type for drawing UV edges.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_smooth_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_SMOOTH_UV);
RNA_def_property_ui_text(prop, "Draw Smooth Edges", "Draw UV edges anti-aliased.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_stretch", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_STRETCH);
RNA_def_property_ui_text(prop, "Draw Stretch", "Draw faces colored according to the difference in shape between UVs and their 3D coordinates (blue for low distortion, red for high distortion).");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_stretch_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dt_uvstretch");
RNA_def_property_enum_items(prop, dt_uvstretch_items);
RNA_def_property_ui_text(prop, "Draw Stretch Type", "Type of stretch to draw.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_modified_edges", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWSHADOW);
RNA_def_property_ui_text(prop, "Draw Modified Edges", "Draw edges after modifiers are applied.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_other_objects", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_OTHER);
RNA_def_property_ui_text(prop, "Draw Other Objects", "Draw other selected objects that share the same image.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "normalized_coordinates", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_COORDFLOATS);
RNA_def_property_ui_text(prop, "Normalized Coordinates", "Display UV coordinates from 0.0 to 1.0 rather than in pixels.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
/* todo: move edge and face drawing options here from G.f */
prop= RNA_def_property(srna, "snap_to_pixels", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_PIXELSNAP);
RNA_def_property_ui_text(prop, "Snap to Pixels", "Snap UVs to pixel locations while editing.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "constrain_to_image_bounds", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_CLIP_UV);
RNA_def_property_ui_text(prop, "Constrain to Image Bounds", "Constraint to stay within the image bounds while editing.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "live_unwrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_LIVE_UNWRAP);
RNA_def_property_ui_text(prop, "Live Unwrap", "Continuously unwrap the selected UV island while transforming pinned vertices.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "around");
RNA_def_property_enum_items(prop, pivot_items);
RNA_def_property_ui_text(prop, "Pivot", "Rotation/Scaling Pivot.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
}
static void rna_def_space_outliner(BlenderRNA *brna)
@@ -358,6 +485,7 @@ static void rna_def_space_outliner(BlenderRNA *brna)
{10, "SEQUENCE", 0, "Sequence", ""},
{11, "DATABLOCKS", 0, "Datablocks", ""},
{12, "USER_PREFERENCES", 0, "User Preferences", ""},
+ {13, "KEYMAPS", 0, "Key Maps", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "SpaceOutliner", "Space");
@@ -368,12 +496,12 @@ static void rna_def_space_outliner(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "outlinevis");
RNA_def_property_enum_items(prop, display_mode_items);
RNA_def_property_ui_text(prop, "Display Mode", "Type of information to display");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL);
prop= RNA_def_property(srna, "show_restriction_columns", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SO_HIDE_RESTRICTCOLS);
RNA_def_property_ui_text(prop, "Show Restriction Columns", "Show colum");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_OUTLINER, NULL);
}
@@ -389,30 +517,36 @@ static void rna_def_background_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "ima");
RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space.");
- RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "iuser");
RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xof");
RNA_def_property_ui_text(prop, "X Offset", "Offsets image horizontally from the view center");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yof");
RNA_def_property_ui_text(prop, "Y Offset", "Offsets image vertically from the view center");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Size", "Scaling factor for the background image.");
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);
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_range(prop, 0.0, 1.0);
-
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
static void rna_def_space_3dview(BlenderRNA *brna)
@@ -421,11 +555,11 @@ static void rna_def_space_3dview(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem viewport_shading_items[] = {
- {OB_BOUNDBOX, "BOUNDBOX", 0, "Bounding Box", "Display the object's local bounding boxes only"},
- {OB_WIRE, "WIREFRAME", 0, "Wireframe", "Display the object as wire edges"},
- {OB_SOLID, "SOLID", 0, "Solid", "Display the object solid, lit with default OpenGL lights"},
- {OB_SHADED, "SHADED", 0, "Shaded", "Display the object solid, with preview shading interpolated at vertices"},
- {OB_TEXTURE, "TEXTURED", 0, "Textured", "Display the object solid, with face-assigned textures"},
+ {OB_BOUNDBOX, "BOUNDBOX", ICON_BBOX, "Bounding Box", "Display the object's local bounding boxes only"},
+ {OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"},
+ {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display the object solid, lit with default OpenGL lights"},
+ {OB_SHADED, "SHADED", ICON_SMOOTH, "Shaded", "Display the object solid, with preview shading interpolated at vertices"},
+ {OB_TEXTURE, "TEXTURED", ICON_POTATO, "Textured", "Display the object solid, with face-assigned textures"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem pivot_items[] = {
@@ -451,10 +585,12 @@ static void rna_def_space_3dview(BlenderRNA *brna)
prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "camera");
RNA_def_property_ui_text(prop, "Camera", "Active camera used in this view (when unlocked from the scene's active camera).");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "lock_object", PROP_POINTER, PROP_NONE);
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_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "background_image", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "bgpic");
@@ -464,100 +600,140 @@ static void rna_def_space_3dview(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
RNA_def_property_enum_items(prop, viewport_shading_items);
RNA_def_property_ui_text(prop, "Viewport Shading", "Method to display/shade objects in the 3D View.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "localview", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "localview", 0);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ prop= RNA_def_property(srna, "local_view", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "localvd");
RNA_def_property_ui_text(prop, "Local View", "Display an isolated sub-set of objects, apart from the scene visibility.");
prop= RNA_def_property(srna, "lens", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "lens");
RNA_def_property_ui_text(prop, "Lens", "Lens angle (mm) in perspective view.");
RNA_def_property_range(prop, 1.0f, 250.0f);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "near");
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Clip Start", "3D View near clipping distance.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "clip_end", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "far");
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_NONE);
+ prop= RNA_def_property(srna, "grid_spacing", PROP_FLOAT, PROP_DISTANCE);
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_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.");
RNA_def_property_range(prop, 0, 1024);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "grid_subdivisions", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gridsubdiv");
RNA_def_property_ui_text(prop, "Grid Subdivisions", "The number of subdivisions between grid lines.");
RNA_def_property_range(prop, 1, 1024);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "display_floor", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_FLOOR);
RNA_def_property_ui_text(prop, "Display Grid Floor", "Show the ground plane grid in perspective view.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "display_x_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_X);
RNA_def_property_ui_text(prop, "Display X Axis", "Show the X axis line in perspective view.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "display_y_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Y);
RNA_def_property_ui_text(prop, "Display Y Axis", "Show the Y axis line in perspective view.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "display_z_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gridflag", V3D_SHOW_Z);
RNA_def_property_ui_text(prop, "Display Z Axis", "Show the Z axis line in perspective view.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "outline_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_SELECT_OUTLINE);
RNA_def_property_ui_text(prop, "Outline Selected", "Show an outline highlight around selected objects in non-wireframe views.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "all_object_centers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DRAW_CENTERS);
RNA_def_property_ui_text(prop, "All Object Centers", "Show the object center dot for all (selected and unselected) objects.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "relationship_lines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", V3D_HIDE_HELPLINES);
RNA_def_property_ui_text(prop, "Relationship Lines", "Show dashed lines indicating parent or constraint relationships.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "textured_solid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag2", V3D_SOLID_TEX);
RNA_def_property_ui_text(prop, "Textured Solid", "Display face-assigned textures in solid view");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ prop= RNA_def_property(srna, "display_background_image", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_View3D_display_background_image_set");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DISPBGPIC);
+ RNA_def_property_ui_text(prop, "Display Background Image", "Display a reference image behind objects in the 3D View");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "pivot_point", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "around");
RNA_def_property_enum_items(prop, pivot_items);
RNA_def_property_ui_text(prop, "Pivot Point", "Pivot center for rotation/scaling.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "manipulator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twflag", V3D_USE_MANIPULATOR);
RNA_def_property_ui_text(prop, "Manipulator", "Use a 3D manipulator widget for controlling transforms.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "manipulator_translate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_TRANSLATE);
RNA_def_property_ui_text(prop, "Manipulator Translate", "Use the manipulator for movement transformations.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "manipulator_rotate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_ROTATE);
RNA_def_property_ui_text(prop, "Manipulator Rotate", "Use the manipulator for rotation transformations.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "manipulator_scale", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "twtype", V3D_MANIP_SCALE);
RNA_def_property_ui_text(prop, "Manipulator Scale", "Use the manipulator for scale transformations.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "transform_orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "twmode");
RNA_def_property_enum_items(prop, transform_orientation_items);
RNA_def_property_ui_text(prop, "Transform Orientation", "The alignment of manipulator handles.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_LOCKED);
+ RNA_def_property_ui_text(prop, "Lock", "Lock View Rotation");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ prop= RNA_def_property(srna, "box_preview", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_BOXVIEW);
+ RNA_def_property_ui_text(prop, "Box", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+ prop= RNA_def_property(srna, "box_clip", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_BOXCLIP);
+ RNA_def_property_ui_text(prop, "Clip", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
static void rna_def_space_buttons(BlenderRNA *brna)
@@ -569,43 +745,51 @@ static void rna_def_space_buttons(BlenderRNA *brna)
{BCONTEXT_SCENE, "SCENE", ICON_SCENE, "Scene", "Scene"},
{BCONTEXT_WORLD, "WORLD", ICON_WORLD, "World", "World"},
{BCONTEXT_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Object"},
- {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraint", "Constraint"},
- {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifier", "Modifier"},
+ {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraints", "Constraints"},
+ {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifiers", "Modifiers"},
{BCONTEXT_DATA, "DATA", 0, "Data", "Data"},
{BCONTEXT_BONE, "BONE", ICON_BONE_DATA, "Bone", "Bone"},
+ {BCONTEXT_BONE_CONSTRAINT, "BONE_CONSTRAINT", ICON_CONSTRAINT, "Bone Constraints", "Bone Constraints"},
{BCONTEXT_MATERIAL, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
{BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"},
{BCONTEXT_PARTICLE, "PARTICLE", ICON_PARTICLES, "Particle", "Particle"},
{BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem panel_alignment_items[] = {
- {1, "HORIZONTAL", 0, "Horizontal", ""},
- {2, "VERTICAL", 0, "Vertical", ""},
+ static EnumPropertyItem align_items[] = {
+ {BUT_HORIZONTAL, "HORIZONTAL", 0, "Horizontal", ""},
+ {BUT_VERTICAL, "VERTICAL", 0, "Vertical", ""},
{0, NULL, 0, NULL, NULL}};
- srna= RNA_def_struct(brna, "SpaceButtonsWindow", "Space");
+ srna= RNA_def_struct(brna, "SpaceProperties", "Space");
RNA_def_struct_sdna(srna, "SpaceButs");
- RNA_def_struct_ui_text(srna, "Buttons Space", "Buttons Window space data");
+ RNA_def_struct_ui_text(srna, "Properties Space", "Properties space data");
- prop= RNA_def_property(srna, "buttons_context", PROP_ENUM, PROP_NONE);
+ 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_ui_text(prop, "Buttons Context", "The type of active data to display and edit in the buttons window");
- RNA_def_property_update(prop, NC_WINDOW, 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);
- prop= RNA_def_property(srna, "panel_alignment", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "align", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "align");
- RNA_def_property_enum_items(prop, panel_alignment_items);
- RNA_def_property_ui_text(prop, "Panel Alignment", "Arrangement of the panels within the buttons window");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_enum_items(prop, align_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_SpaceProperties_align_set", NULL);
+ 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, "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.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
/* pinned data */
prop= RNA_def_property(srna, "pin_id", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "pinid");
RNA_def_property_struct_type(prop, "ID");
- RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_SpaceButtonsWindow_pin_id_typef");
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_SpaceProperties_pin_id_typef");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
}
static void rna_def_space_image(BlenderRNA *brna)
@@ -622,38 +806,40 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceImageEditor_image_set", 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_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "iuser");
RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "curves", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "cumap");
RNA_def_property_ui_text(prop, "Curves", "Color curve mapping to use for displaying the image.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_curves_update");
prop= RNA_def_property(srna, "image_pin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "pin", 0);
RNA_def_property_ui_text(prop, "Image Pin", "Display current image regardless of object selection.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
/* image draw */
prop= RNA_def_property(srna, "draw_repeated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAW_TILE);
RNA_def_property_ui_text(prop, "Draw Repeated", "Draw the image repeated outside of the main view.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "draw_channels", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, dc_all_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceImageEditor_draw_channels_itemf");
RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the image to draw.");
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
/* uv */
- prop= RNA_def_property(srna, "uv_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "uv_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "SpaceUVEditor");
RNA_def_property_pointer_funcs(prop, "rna_SpaceImageEditor_uvedit_get", NULL, NULL);
RNA_def_property_ui_text(prop, "UV Editor", "UV editor settings.");
@@ -663,7 +849,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DRAWTOOL);
RNA_def_property_ui_text(prop, "Image Painting", "Enable image painting mode.");
RNA_def_property_ui_icon(prop, ICON_TPAINT_HLT, 0);
- RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_SpaceImageEditor_paint_update");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_paint_update");
/* grease pencil */
prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
@@ -706,11 +892,11 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem display_mode_items[] = {
- {SEQ_DRAW_SEQUENCE, "SEQUENCER", 0, "Sequencer", ""},
- {SEQ_DRAW_IMG_IMBUF, "IMAGE", 0, "Image Preview", ""},
- {SEQ_DRAW_IMG_WAVEFORM, "WAVEFORM", 0, "Luma Waveform", ""},
- {SEQ_DRAW_IMG_VECTORSCOPE, "VECTOR_SCOPE", 0, "Chroma Vectorscope", ""},
- {SEQ_DRAW_IMG_HISTOGRAM, "HISTOGRAM", 0, "Histogram", ""},
+ {SEQ_DRAW_SEQUENCE, "SEQUENCER", ICON_SEQ_SEQUENCER, "Sequencer", ""},
+ {SEQ_DRAW_IMG_IMBUF, "IMAGE", ICON_SEQ_PREVIEW, "Image Preview", ""},
+ {SEQ_DRAW_IMG_WAVEFORM, "WAVEFORM", ICON_SEQ_LUMA_WAVEFORM, "Luma Waveform", ""},
+ {SEQ_DRAW_IMG_VECTORSCOPE, "VECTOR_SCOPE", ICON_SEQ_CHROMA_SCOPE, "Chroma Vectorscope", ""},
+ {SEQ_DRAW_IMG_HISTOGRAM, "HISTOGRAM", ICON_SEQ_HISTOGRAM, "Histogram", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "SpaceSequenceEditor", "Space");
@@ -722,64 +908,69 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "mainb");
RNA_def_property_enum_items(prop, display_mode_items);
RNA_def_property_ui_text(prop, "Display Mode", "The view mode to use for displaying sequencer output.");
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
/* flag's */
prop= RNA_def_property(srna, "draw_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAWFRAMES);
RNA_def_property_ui_text(prop, "Draw Frames", "Draw frames rather then seconds.");
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "transform_markers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_MARKER_TRANS);
RNA_def_property_ui_text(prop, "Transform Markers", "Transform markers as well as strips.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "seperate_color_preview", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAW_COLOR_SEPERATED);
- RNA_def_property_ui_text(prop, "Transform Markers", "Seperate color channels in preview.");
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_ui_text(prop, "Seperate Colors", "Seperate color channels in preview.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "draw_safe_margin", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAW_SAFE_MARGINS);
RNA_def_property_ui_text(prop, "Safe Margin", "Draw title safe margins in preview.");
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_DRAW_GPENCIL);
RNA_def_property_ui_text(prop, "Use Grease Pencil", "Display and edit the grease pencil freehand annotations overlay.");
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
/* grease pencil */
prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "gpd");
RNA_def_property_struct_type(prop, "UnknownType");
RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this space.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "display_channel", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "chanshown");
RNA_def_property_ui_text(prop, "Display Channel", "The channel number shown in the image preview. 0 is the result of all strips combined.");
RNA_def_property_range(prop, 0, 32); // MAXSEQ --- todo, move from BKE_sequence.h
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "draw_overexposed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "zebra");
RNA_def_property_ui_text(prop, "Show Overexposed", "Show overexposed areas with zebra stripes.");
RNA_def_property_range(prop, 0, 110);
- RNA_def_property_update(prop, ND_SEQUENCER|ND_DISPLAY, NULL); // review notifier
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
/* not sure we need rna access to these but adding anyway */
- prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_x", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xof");
RNA_def_property_ui_text(prop, "X Offset", "Offsets image horizontally from the view center");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
- prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "offset_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "yof");
RNA_def_property_ui_text(prop, "Y Offset", "Offsets image horizontally from the view center");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "zoom", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "zoom");
RNA_def_property_ui_text(prop, "Zoom", "Display zoom level");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
}
static void rna_def_space_text(BlenderRNA *brna)
@@ -787,11 +978,6 @@ static void rna_def_space_text(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem font_size_items[] = {
- {12, "SCREEN_12", 0, "Screen 12", ""},
- {15, "SCREEN_15", 0, "Screen 15", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "SpaceTextEditor", "Space");
RNA_def_struct_sdna(srna, "SpaceText");
RNA_def_struct_ui_text(srna, "Space Text Editor", "Text editor space data.");
@@ -801,63 +987,564 @@ static void rna_def_space_text(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Text", "Text displayed and edited in this space.");
RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceTextEditor_text_set", NULL);
- RNA_def_property_update(prop, NC_TEXT|NA_EDITED, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
/* display */
prop= RNA_def_property(srna, "syntax_highlight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "showsyntax", 0);
RNA_def_property_ui_text(prop, "Syntax Highlight", "Syntax highlight for scripting.");
RNA_def_property_ui_icon(prop, ICON_SYNTAX_OFF, 1);
- RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "word_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "wordwrap", 0);
RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceTextEditor_word_wrap_set");
RNA_def_property_ui_text(prop, "Word Wrap", "Wrap words if there is not enough horizontal space.");
RNA_def_property_ui_icon(prop, ICON_WORDWRAP_OFF, 1);
- RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "line_numbers", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "showlinenrs", 0);
RNA_def_property_ui_text(prop, "Line Numbers", "Show line numbers next to the text.");
RNA_def_property_ui_icon(prop, ICON_LINENUMBERS_OFF, 1);
- RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "overwrite", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Overwrite", "Overwrite characters when typing rather than inserting them.");
- RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "live_edit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Live Edit", "Run python while editing.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "tab_width", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tabnumber");
RNA_def_property_range(prop, 2, 8);
RNA_def_property_ui_text(prop, "Tab Width", "Number of spaces to display tabs with.");
- RNA_def_property_update(prop, NC_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
- prop= RNA_def_property(srna, "font_size", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "lheight");
- RNA_def_property_enum_items(prop, font_size_items);
+ prop= RNA_def_property(srna, "font_size", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "lheight");
+ 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_TEXT|ND_DISPLAY, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
/* find */
prop= RNA_def_property(srna, "find_all", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_FIND_ALL);
RNA_def_property_ui_text(prop, "Find All", "Search in all text datablocks, instead of only the active one.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "find_wrap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_FIND_WRAP);
RNA_def_property_ui_text(prop, "Find Wrap", "Search again from the start of the file when reaching the end.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "find_text", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "findstr");
RNA_def_property_ui_text(prop, "Find Text", "Text to search for with the find tool.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
prop= RNA_def_property(srna, "replace_text", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "replacestr");
RNA_def_property_ui_text(prop, "Replace Text", "Text to replace selected text with using the replace tool.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+}
+
+static void rna_def_space_dopesheet(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem mode_items[] = {
+ {SACTCONT_DOPESHEET, "DOPESHEET", 0, "DopeSheet", ""},
+ {SACTCONT_ACTION, "ACTION", 0, "Action Editor", ""},
+ {SACTCONT_SHAPEKEY, "SHAPEKEY", 0, "ShapeKey Editor", ""}, // XXX to be depreceated?
+ {SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+
+ srna= RNA_def_struct(brna, "SpaceDopeSheetEditor", "Space");
+ RNA_def_struct_sdna(srna, "SpaceAction");
+ RNA_def_struct_ui_text(srna, "Space DopeSheet Editor", "DopeSheet space data.");
+
+ /* data */
+ prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceDopeSheetEditor_action_set", NULL);
+ RNA_def_property_ui_text(prop, "Action", "Action displayed and edited in this space.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, "rna_SpaceDopeSheetEditor_action_update");
+
+ /* mode */
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, mode_items);
+ RNA_def_property_ui_text(prop, "Mode", "Editing context being displayed.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
+ /* display */
+ prop= RNA_def_property(srna, "show_seconds", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_DRAWTIME);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now, only set with operator
+ RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
+ prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NODRAWCFRANUM);
+ RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
+ prop= RNA_def_property(srna, "show_sliders", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_SLIDERS);
+ 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);
+
+ /* editing */
+ prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL);
+ RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Show handles of Bezier control points.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
+ // TODO... autosnap, dopesheet?
+}
+
+static void rna_def_space_graph(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem mode_items[] = {
+ {SIPO_MODE_ANIMATION, "FCURVES", 0, "F-Curves", ""},
+ {SIPO_MODE_DRIVERS, "DRIVERS", 0, "Drivers", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+
+ srna= RNA_def_struct(brna, "SpaceGraphEditor", "Space");
+ RNA_def_struct_sdna(srna, "SpaceIpo");
+ RNA_def_struct_ui_text(srna, "Space Graph Editor", "Graph Editor space data.");
+
+ /* mode */
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, mode_items);
+ RNA_def_property_ui_text(prop, "Mode", "Editing context being displayed.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ /* display */
+ prop= RNA_def_property(srna, "show_seconds", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_DRAWTIME);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now, only set with operator
+ RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NODRAWCFRANUM);
+ RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ prop= RNA_def_property(srna, "show_sliders", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_SLIDERS);
+ RNA_def_property_ui_text(prop, "Show Sliders", "Show sliders beside F-Curve channels.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ prop= RNA_def_property(srna, "show_handles", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_NOHANDLES);
+ RNA_def_property_ui_text(prop, "Show Handles", "Show handles of Bezier control points.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ prop= RNA_def_property(srna, "only_selected_curves_handles", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_SELCUVERTSONLY);
+ RNA_def_property_ui_text(prop, "Only Selected Curve Keyframes", "Only keyframes of selected F-Curves are visible and editable.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ /* editing */
+ prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL);
+ RNA_def_property_ui_text(prop, "AutoMerge Keyframes", "Show handles of Bezier control points.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
+ // TODO... autosnap, dopesheet?
+}
+
+static void rna_def_space_nla(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SpaceNLA", "Space");
+ RNA_def_struct_sdna(srna, "SpaceNla");
+ RNA_def_struct_ui_text(srna, "Space Nla Editor", "NLA editor space data.");
+
+ /* display */
+ prop= RNA_def_property(srna, "show_seconds", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SNLA_DRAWTIME);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now, only set with operator
+ RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
+
+ prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NODRAWCFRANUM);
+ RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
+
+ prop= RNA_def_property(srna, "show_strip_curves", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NOSTRIPCURVES);
+ RNA_def_property_ui_text(prop, "Show Control Curves", "Show influence curves on strips.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NLA, NULL);
+
+ /* editing */
+ // TODO... autosnap, dopesheet?
+}
+
+static void rna_def_space_time(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SpaceTimeline", "Space");
+ 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, "play_top_left", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_REGION);
+ RNA_def_property_ui_text(prop, "Top-Left 3D Window", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_all_3d", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_3D_WIN);
+ RNA_def_property_ui_text(prop, "All 3D Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_anim", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_ANIM_WIN);
+ RNA_def_property_ui_text(prop, "Animation Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_buttons", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_BUTS_WIN);
+ RNA_def_property_ui_text(prop, "Properties Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_image", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_IMAGE_WIN);
+ RNA_def_property_ui_text(prop, "Image Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_sequencer", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_SEQ);
+ RNA_def_property_ui_text(prop, "Sequencer Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ prop= RNA_def_property(srna, "play_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_NODES);
+ RNA_def_property_ui_text(prop, "Node Windows", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
+
+ /* Other options */
+
+ prop= RNA_def_property(srna, "continue_physics", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_CONTINUE_PHYSICS);
+ RNA_def_property_ui_text(prop, "Continue Physics", "During playblack, continue physics simulations regardless of the frame number");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
+
+ prop= RNA_def_property(srna, "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 only from active/selected channels.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
+}
+
+static void rna_def_console_line(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ConsoleLine", NULL);
+ RNA_def_struct_ui_text(srna, "Console Input", "Input line for the interactive console.");
+ // XXX using non-inited "prop", uh? RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
+
+ prop= RNA_def_property(srna, "line", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_funcs(prop, "rna_ConsoleLine_line_get", "rna_ConsoleLine_line_length", "rna_ConsoleLine_line_set");
+ RNA_def_property_ui_text(prop, "Line", "Text in the line.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
+
+ prop= RNA_def_property(srna, "current_character", PROP_INT, PROP_NONE); /* copied from text editor */
+ RNA_def_property_int_sdna(prop, NULL, "cursor");
+ 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)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SpaceConsole", "Space");
+ RNA_def_struct_sdna(srna, "SpaceConsole");
+ RNA_def_struct_ui_text(srna, "Space Console", "Interactive python console.");
+
+ /* display */
+ prop= RNA_def_property(srna, "font_size", PROP_INT, PROP_NONE); /* copied from text editor */
+ RNA_def_property_int_sdna(prop, NULL, "lheight");
+ 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);
+
+ /* 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_warn", 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.");
+ RNA_def_struct_name_property(srna, prop);
+
+ prop= RNA_def_property(srna, "history", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "history", NULL);
+ RNA_def_property_struct_type(prop, "ConsoleLine");
+ RNA_def_property_ui_text(prop, "History", "Command history.");
+
+ prop= RNA_def_property(srna, "scrollback", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "scrollback", NULL);
+ RNA_def_property_struct_type(prop, "ConsoleLine");
+ RNA_def_property_ui_text(prop, "Output", "Command output.");
+}
+
+static void rna_def_fileselect_params(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem file_display_items[] = {
+ {FILE_SHORTDISPLAY, "FILE_SHORTDISPLAY", ICON_SHORTDISPLAY, "Short List", "Display files as short list"},
+ {FILE_LONGDISPLAY, "FILE_LONGDISPLAY", ICON_LONGDISPLAY, "Long List", "Display files as a detailed list"},
+ {FILE_IMGDISPLAY, "FILE_IMGDISPLAY", ICON_IMGDISPLAY, "Thumbnails", "Display files as thumbnails"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem file_sort_items[] = {
+ {FILE_SORT_ALPHA, "FILE_SORT_ALPHA", ICON_SORTALPHA, "Sort alphabetically", "Sort the file list alphabetically."},
+ {FILE_SORT_EXTENSION, "FILE_SORT_EXTENSION", ICON_SORTBYEXT, "Sort by extension", "Sort the file list by extension."},
+ {FILE_SORT_TIME, "FILE_SORT_TIME", ICON_SORTTIME, "Sort by time", "Sort files by modification time."},
+ {FILE_SORT_SIZE, "FILE_SORT_SIZE", ICON_SORTSIZE, "Sort by size", "Sort files by size."},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "FileSelectParams", NULL);
+ RNA_def_struct_ui_text(srna, "File Select Parameters", "File Select Parameters.");
+
+ prop= RNA_def_property(srna, "title", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "title");
+ RNA_def_property_ui_text(prop, "Title", "Title for the file browser.");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+ prop= RNA_def_property(srna, "directory", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "dir");
+ RNA_def_property_ui_text(prop, "Directory", "Directory displayed in the file browser.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ prop= RNA_def_property(srna, "file", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "file");
+ RNA_def_property_ui_text(prop, "File Name", "Active file in the file browser.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ prop= RNA_def_property(srna, "display", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "display");
+ RNA_def_property_enum_items(prop, file_display_items);
+ RNA_def_property_ui_text(prop, "Display Mode", "Display mode for the file list");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ prop= RNA_def_property(srna, "do_filter", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_FILTER);
+ RNA_def_property_ui_text(prop, "Filter Files", "Enable filtering of files.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "hide_dot", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_HIDE_DOT);
+ RNA_def_property_ui_text(prop, "Hide Dot Files", "Hide hidden dot files.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST , NULL);
+
+ prop= RNA_def_property(srna, "sort", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "sort");
+ RNA_def_property_enum_items(prop, file_sort_items);
+ RNA_def_property_ui_text(prop, "Sort", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ prop= RNA_def_property(srna, "filter_image", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", IMAGEFILE);
+ RNA_def_property_ui_text(prop, "Filter Images", "Show image files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_IMAGE, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_blender", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", BLENDERFILE);
+ RNA_def_property_ui_text(prop, "Filter Blender", "Show .blend files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_BLEND, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_movie", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", MOVIEFILE);
+ RNA_def_property_ui_text(prop, "Filter Movies", "Show movie files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_MOVIE, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_script", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", PYSCRIPTFILE);
+ RNA_def_property_ui_text(prop, "Filter Script", "Show script files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_SCRIPT, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_font", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", FTFONTFILE);
+ RNA_def_property_ui_text(prop, "Filter Fonts", "Show font files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_FONT, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_sound", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", SOUNDFILE);
+ RNA_def_property_ui_text(prop, "Filter Sound", "Show sound files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_SOUND, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_text", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", TEXTFILE);
+ RNA_def_property_ui_text(prop, "Filter Text", "Show text files.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_BLANK, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+ prop= RNA_def_property(srna, "filter_folder", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filter", FOLDERFILE);
+ RNA_def_property_ui_text(prop, "Filter Folder", "Show folders.");
+ RNA_def_property_ui_icon(prop, ICON_FILE_FOLDER, 0);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
+
+
+}
+
+static void rna_def_space_filebrowser(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SpaceFileBrowser", "Space");
+ RNA_def_struct_sdna(srna, "SpaceFile");
+ RNA_def_struct_ui_text(srna, "Space File Browser", "File browser space data.");
+
+ prop= RNA_def_property(srna, "params", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "params");
+ RNA_def_property_ui_text(prop, "Filebrowser Parameter", "Parameters and Settings for the Filebrowser.");
+}
+
+static void rna_def_space_info(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna= RNA_def_struct(brna, "SpaceInfo", "Space");
+ RNA_def_struct_sdna(srna, "SpaceInfo");
+ RNA_def_struct_ui_text(srna, "Space Info", "Info space data.");
+}
+
+static void rna_def_space_userpref(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna= RNA_def_struct(brna, "SpaceUserPreferences", "Space");
+ RNA_def_struct_sdna(srna, "SpaceUserPref");
+ RNA_def_struct_ui_text(srna, "Space User Preferences", "User preferences space data.");
+}
+
+static void rna_def_space_node(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem tree_type_items[] = {
+ {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes."},
+ {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes."},
+ {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem texture_type_items[] = {
+ {SNODE_TEX_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Edit texture nodes from Object."},
+ {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}};
+
+ 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.");
+
+ prop= RNA_def_property(srna, "tree_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "treetype");
+ RNA_def_property_enum_items(prop, tree_type_items);
+ RNA_def_property_ui_text(prop, "Tree Type", "Node tree type to display and edit.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
+
+ prop= RNA_def_property(srna, "texture_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "texfrom");
+ RNA_def_property_enum_items(prop, texture_type_items);
+ RNA_def_property_ui_text(prop, "Texture Type", "Type of data to take texture from.");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
+
+ prop= RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "ID", "Datablock whose nodes are being edited.");
+
+ prop= RNA_def_property(srna, "id_from", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "from");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "ID From", "Datablock from which the edited datablock is linked.");
+
+ prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Node Tree", "Node tree being displayed and edited.");
+
+ prop= RNA_def_property(srna, "backdrop", PROP_BOOLEAN, PROP_NONE);
+ 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, NULL);
+}
+
+static void rna_def_space_logic(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ srna= RNA_def_struct(brna, "SpaceLogicEditor", "Space");
+ RNA_def_struct_sdna(srna, "SpaceLogic");
+ RNA_def_struct_ui_text(srna, "Space Logic Editor", "Logic editor space data.");
}
void RNA_def_space(BlenderRNA *brna)
@@ -866,10 +1553,22 @@ void RNA_def_space(BlenderRNA *brna)
rna_def_space_image(brna);
rna_def_space_sequencer(brna);
rna_def_space_text(brna);
+ rna_def_fileselect_params(brna);
+ rna_def_space_filebrowser(brna);
rna_def_space_outliner(brna);
rna_def_background_image(brna);
rna_def_space_3dview(brna);
rna_def_space_buttons(brna);
+ rna_def_space_dopesheet(brna);
+ rna_def_space_graph(brna);
+ rna_def_space_nla(brna);
+ rna_def_space_time(brna);
+ rna_def_space_console(brna);
+ rna_def_console_line(brna);
+ rna_def_space_info(brna);
+ rna_def_space_userpref(brna);
+ rna_def_space_node(brna);
+ rna_def_space_logic(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_test.c b/source/blender/makesrna/intern/rna_test.c
new file mode 100644
index 00000000000..988c8f8a539
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_test.c
@@ -0,0 +1,188 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* Defines a structure with properties used for array manipulation tests in BPY. */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#include "rna_internal.h"
+
+#define ARRAY_SIZE 3
+#define DYNAMIC_ARRAY_SIZE 64
+#define MARRAY_DIM [3][4][5]
+#define MARRAY_TOTDIM 3
+#define MARRAY_DIMSIZE 4, 5
+#define MARRAY_SIZE(type) (sizeof(type MARRAY_DIM) / sizeof(type))
+#define DYNAMIC_MARRAY_DIM [3][4][5]
+#define DYNAMIC_MARRAY_SIZE(type) (sizeof(type DYNAMIC_MARRAY_DIM) / sizeof(type))
+
+#ifdef RNA_RUNTIME
+
+#ifdef UNIT_TEST
+
+#define DEF_VARS(type, prefix) \
+ static type prefix ## arr[ARRAY_SIZE]; \
+ static type prefix ## darr[DYNAMIC_ARRAY_SIZE]; \
+ static int prefix ## darr_len= ARRAY_SIZE; \
+ static type prefix ## marr MARRAY_DIM; \
+ static type prefix ## dmarr DYNAMIC_MARRAY_DIM; \
+ static int prefix ## dmarr_len= sizeof(prefix ## dmarr);
+
+#define DEF_GET_SET(type, arr) \
+ void rna_Test_ ## arr ## _get(PointerRNA *ptr, type *values) \
+ { \
+ memcpy(values, arr, sizeof(arr)); \
+ } \
+ \
+ void rna_Test_ ## arr ## _set(PointerRNA *ptr, const type *values) \
+ { \
+ memcpy(arr, values, sizeof(arr)); \
+ }
+
+#define DEF_GET_SET_LEN(arr, max) \
+ static int rna_Test_ ## arr ## _get_length(PointerRNA *ptr) \
+ { \
+ return arr ## _len; \
+ } \
+ \
+ static int rna_Test_ ## arr ## _set_length(PointerRNA *ptr, int length) \
+ { \
+ if (length > max) \
+ return 0; \
+ \
+ arr ## _len= length; \
+ \
+ return 1; \
+ } \
+
+DEF_VARS(float, f)
+DEF_VARS(int, i)
+DEF_VARS(int, b)
+
+DEF_GET_SET(float, farr)
+DEF_GET_SET(int, iarr)
+DEF_GET_SET(int, barr)
+
+DEF_GET_SET(float, fmarr)
+DEF_GET_SET(int, imarr)
+DEF_GET_SET(int, bmarr)
+
+DEF_GET_SET(float, fdarr)
+DEF_GET_SET_LEN(fdarr, DYNAMIC_ARRAY_SIZE)
+DEF_GET_SET(int, idarr)
+DEF_GET_SET_LEN(idarr, DYNAMIC_ARRAY_SIZE)
+DEF_GET_SET(int, bdarr)
+DEF_GET_SET_LEN(bdarr, DYNAMIC_ARRAY_SIZE)
+
+DEF_GET_SET(float, fdmarr)
+DEF_GET_SET_LEN(fdmarr, DYNAMIC_MARRAY_SIZE(float))
+DEF_GET_SET(int, idmarr)
+DEF_GET_SET_LEN(idmarr, DYNAMIC_MARRAY_SIZE(int))
+DEF_GET_SET(int, bdmarr)
+DEF_GET_SET_LEN(bdmarr, DYNAMIC_MARRAY_SIZE(int))
+
+#endif
+
+#else
+
+void RNA_def_test(BlenderRNA *brna)
+{
+#ifdef UNIT_TEST
+ StructRNA *srna;
+ PropertyRNA *prop;
+ unsigned short dimsize[]= {MARRAY_DIMSIZE};
+
+ srna= RNA_def_struct(brna, "Test", NULL);
+ RNA_def_struct_sdna(srna, "Test");
+
+ prop= RNA_def_float_array(srna, "farr", ARRAY_SIZE, NULL, 0.0f, 0.0f, "farr", "float array", 0.0f, 0.0f);
+ RNA_def_property_float_funcs(prop, "rna_Test_farr_get", "rna_Test_farr_set", NULL);
+
+ prop= RNA_def_int_array(srna, "iarr", ARRAY_SIZE, NULL, 0, 0, "iarr", "int array", 0, 0);
+ RNA_def_property_int_funcs(prop, "rna_Test_iarr_get", "rna_Test_iarr_set", NULL);
+
+ prop= RNA_def_boolean_array(srna, "barr", ARRAY_SIZE, NULL, "barr", "boolean array");
+ RNA_def_property_boolean_funcs(prop, "rna_Test_barr_get", "rna_Test_barr_set");
+
+ /* dynamic arrays */
+
+ prop= RNA_def_float_array(srna, "fdarr", DYNAMIC_ARRAY_SIZE, NULL, 0.0f, 0.0f, "fdarr", "dynamic float array", 0.0f, 0.0f);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdarr_get_length", "rna_Test_fdarr_set_length");
+ RNA_def_property_float_funcs(prop, "rna_Test_fdarr_get", "rna_Test_fdarr_set", NULL);
+
+ prop= RNA_def_int_array(srna, "idarr", DYNAMIC_ARRAY_SIZE, NULL, 0, 0, "idarr", "int array", 0, 0);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idarr_get_length", "rna_Test_idarr_set_length");
+ RNA_def_property_int_funcs(prop, "rna_Test_idarr_get", "rna_Test_idarr_set", NULL);
+
+ prop= RNA_def_boolean_array(srna, "bdarr", DYNAMIC_ARRAY_SIZE, NULL, "bdarr", "boolean array");
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdarr_get_length", "rna_Test_bdarr_set_length");
+ RNA_def_property_boolean_funcs(prop, "rna_Test_bdarr_get", "rna_Test_bdarr_set");
+
+ /* multidimensional arrays */
+
+ prop= RNA_def_property(srna, "fmarr", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(float), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_float_funcs(prop, "rna_Test_fmarr_get", "rna_Test_fmarr_set", NULL);
+
+ prop= RNA_def_property(srna, "imarr", PROP_INT, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_int_funcs(prop, "rna_Test_imarr_get", "rna_Test_imarr_set", NULL);
+
+ prop= RNA_def_property(srna, "bmarr", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_boolean_funcs(prop, "rna_Test_bmarr_get", "rna_Test_bmarr_set");
+
+ /* dynamic multidimensional arrays */
+
+ prop= RNA_def_property(srna, "fdmarr", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(float), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdmarr_get_length", "rna_Test_fdmarr_set_length");
+ RNA_def_property_float_funcs(prop, "rna_Test_fdmarr_get", "rna_Test_fdmarr_set", NULL);
+
+ prop= RNA_def_property(srna, "idmarr", PROP_INT, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idmarr_get_length", "rna_Test_idmarr_set_length");
+ RNA_def_property_int_funcs(prop, "rna_Test_idmarr_get", "rna_Test_idmarr_set", NULL);
+
+ prop= RNA_def_property(srna, "bdmarr", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdmarr_get_length", "rna_Test_bdmarr_set_length");
+ RNA_def_property_boolean_funcs(prop, "rna_Test_bdmarr_get", "rna_Test_bdmarr_set");
+
+#endif
+}
+
+#endif /* RNA_RUNTIME */
+
+
diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c
index cd39c317bc5..8c9b2b58887 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -198,7 +198,8 @@ static void rna_def_text(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "TextLine");
RNA_def_property_ui_text(prop, "Lines", "Lines of text.");
- prop= RNA_def_property(srna, "current_line", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "current_line", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "curl");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "TextLine");
@@ -209,7 +210,8 @@ static void rna_def_text(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Current Character", "Index of current character in current line, and also start index of character in selection if one exists.");
- prop= RNA_def_property(srna, "selection_end_line", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "selection_end_line", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "sell");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "TextLine");
@@ -223,6 +225,8 @@ static void rna_def_text(BlenderRNA *brna)
prop= RNA_def_property(srna, "markers", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "TextMarker");
RNA_def_property_ui_text(prop, "Markers", "Text markers highlighting part of the text.");
+
+ RNA_api_text(srna);
}
void RNA_def_text(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_text_api.c b/source/blender/makesrna/intern/rna_text_api.c
new file mode 100644
index 00000000000..b048a6b59d0
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_text_api.c
@@ -0,0 +1,49 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+
+#include "RNA_define.h"
+#include "RNA_types.h"
+
+#ifdef RNA_RUNTIME
+
+#else
+
+void RNA_api_text(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *prop;
+
+ func= RNA_def_function(srna, "clear", "clear_text");
+ RNA_def_function_ui_description(func, "clear the text block.");
+
+ func= RNA_def_function(srna, "write", "write_text");
+ RNA_def_function_ui_description(func, "write text at the cursor location and advance to the end of the text block.");
+ prop= RNA_def_string(func, "text", "Text", 0, "", "New text for this datablock.");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+}
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 2a7f65e2d90..6fb9a9ca57b 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -36,12 +36,26 @@
#include "DNA_material_types.h"
#include "DNA_texture_types.h"
#include "DNA_world_types.h"
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
#include "WM_types.h"
+static EnumPropertyItem texture_filter_items[] = {
+ {TXF_BOX, "BOX", 0, "Box", ""},
+ {TXF_EWA, "EWA", 0, "EWA", ""},
+ {TXF_FELINE, "FELINE", 0, "FELINE", ""},
+ {TXF_AREA, "AREA", 0, "Area", ""},
+ {TXF_SAT, "SAT", 0, "SAT (4x mem)", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
-StructRNA *rna_Texture_refine(struct PointerRNA *ptr)
+#include "BKE_texture.h"
+#include "ED_node.h"
+
+static StructRNA *rna_Texture_refine(struct PointerRNA *ptr)
{
Tex *tex= (Tex*)ptr->data;
@@ -72,11 +86,32 @@ StructRNA *rna_Texture_refine(struct PointerRNA *ptr)
return &RNA_VoronoiTexture;
case TEX_DISTNOISE:
return &RNA_DistortedNoiseTexture;
+ case TEX_POINTDENSITY:
+ return &RNA_PointDensityTexture;
+ case TEX_VOXELDATA:
+ return &RNA_VoxelDataTexture;
default:
return &RNA_Texture;
}
}
+static void rna_Texture_type_set(PointerRNA *ptr, int value)
+{
+ Tex *tex= (Tex*)ptr->data;
+
+ if (value == TEX_VOXELDATA) {
+ if (tex->vd == NULL) {
+ tex->vd = BKE_add_voxeldata();
+ }
+ } else if (value == TEX_POINTDENSITY) {
+ if (tex->pd == NULL) {
+ tex->pd = BKE_add_pointdensity();
+ }
+ }
+
+ tex->type = value;
+}
+
static int rna_TextureSlot_name_length(PointerRNA *ptr)
{
MTex *mtex= ptr->data;
@@ -97,6 +132,130 @@ static void rna_TextureSlot_name_get(PointerRNA *ptr, char *str)
strcpy(str, "");
}
+static int rna_TextureSlot_output_node_get(PointerRNA *ptr)
+{
+ MTex *mtex= ptr->data;
+ Tex *tex= mtex->tex;
+ int cur= mtex->which_output;
+
+ if(tex) {
+ bNodeTree *ntree= tex->nodetree;
+ bNode *node;
+ if(ntree) {
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type == TEX_NODE_OUTPUT) {
+ if(cur == node->custom1)
+ return cur;
+ }
+ }
+ }
+ }
+
+ mtex->which_output= 0;
+ return 0;
+}
+
+
+static EnumPropertyItem *rna_TextureSlot_output_node_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ MTex *mtex= ptr->data;
+ Tex *tex= mtex->tex;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ if(tex && C) { /* Note, tex/mtex/ntree can be invalid of C is NULL, TODO - can this give valid results when C is NULL? */
+ bNodeTree *ntree= tex->nodetree;
+ if(ntree) {
+ EnumPropertyItem tmp= {0, "", 0, "", ""};
+ bNode *node;
+
+ tmp.value = 0;
+ tmp.name = "Not Specified";
+ tmp.identifier = "NOT_SPECIFIED";
+ RNA_enum_item_add(&item, &totitem, &tmp);
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type == TEX_NODE_OUTPUT) {
+ tmp.value= node->custom1;
+ tmp.name= ((TexNodeOutput*)node->storage)->name;
+ tmp.identifier = tmp.name;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+ }
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+
+ *free = 1;
+ return item;
+}
+
+static void rna_Texture_use_color_ramp_set(PointerRNA *ptr, int value)
+{
+ Tex *tex= (Tex*)ptr->data;
+
+ if(value) tex->flag |= TEX_COLORBAND;
+ else tex->flag &= ~TEX_COLORBAND;
+
+ if((tex->flag & TEX_COLORBAND) && tex->coba == NULL)
+ tex->coba= add_colorband(0);
+}
+
+static void rna_Texture_use_nodes_set(PointerRNA *ptr, int v)
+{
+ Tex *tex= (Tex*)ptr->data;
+
+ tex->use_nodes = v;
+ tex->type = 0;
+
+ if(v && tex->nodetree==NULL)
+ ED_node_texture_default(tex);
+}
+
+static void rna_ImageTexture_mipmap_set(PointerRNA *ptr, int value)
+{
+ Tex *tex= (Tex*)ptr->data;
+
+ if(value) tex->imaflag |= TEX_MIPMAP;
+ else tex->imaflag &= ~TEX_MIPMAP;
+
+ if((tex->imaflag & TEX_MIPMAP) && tex->texfilter == TXF_SAT)
+ tex->texfilter = TXF_EWA;
+}
+
+static EnumPropertyItem *rna_ImageTexture_filter_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Tex *tex= (Tex*)ptr->data;
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_BOX);
+ RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_EWA);
+ RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_FELINE);
+ RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_AREA);
+ if(tex->imaflag & TEX_MIPMAP)
+ RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_SAT);
+
+ *free= 1;
+
+ return item;
+}
+
+static float rna_TextureSlot_angle_get(PointerRNA *ptr)
+{
+ MTex *tex= (MTex*)ptr->data;
+ const float conv = 57.295779506;
+ return tex->rot * conv;
+}
+
+static void rna_TextureSlot_angle_set(PointerRNA *ptr, float v)
+{
+ MTex *tex= (MTex*)ptr->data;
+ const float conv = 0.017453293;
+ tex->rot = v * conv;
+}
+
#else
static void rna_def_color_ramp_element(BlenderRNA *brna)
@@ -159,27 +318,27 @@ static void rna_def_texmapping(BlenderRNA *brna)
srna= RNA_def_struct(brna, "TexMapping", NULL);
RNA_def_struct_ui_text(srna, "Texture Mapping", "Mapping settings");
- prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Location", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
+ prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_ui_text(prop, "Rotation", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Scale", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "minimum", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_ui_text(prop, "Minimum", "Minimum value for clipping");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "maximum", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_ui_text(prop, "Maximum", "Maximum value for clipping");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
@@ -215,8 +374,20 @@ 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", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem prop_map_mode_items[] = {
+ {MTEX_MAP_MODE_FIXED, "FIXED", 0, "Fixed", ""},
+ {MTEX_MAP_MODE_TILED, "TILED", 0, "Tiled", ""},
+ {MTEX_MAP_MODE_3D, "3D", 0, "3D", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem output_node_items[] = {
+ {0, "DUMMY", 0, "Dummy", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "TextureSlot", NULL);
RNA_def_struct_sdna(srna, "MTex");
RNA_def_struct_ui_text(srna, "Texture Slot", "Texture slot defining the mapping and influence of a texture.");
@@ -237,13 +408,13 @@ static void rna_def_mtex(BlenderRNA *brna)
RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* mapping */
- prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "ofs");
RNA_def_property_ui_range(prop, -10, 10, 10, 2);
RNA_def_property_ui_text(prop, "Offset", "Fine tunes texture mapping X, Y and Z locations.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_XYZ);
RNA_def_property_ui_range(prop, -100, 100, 10, 2);
RNA_def_property_ui_text(prop, "Size", "Sets scaling for the texture's X, Y and Z sizes.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
@@ -270,34 +441,46 @@ static void rna_def_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Negate", "Inverts the values of the texture to reverse its effect.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "no_rgb", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "rgb_to_intensity", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_RGBTOINT);
- RNA_def_property_ui_text(prop, "No RGB", "Converts texture RGB values to intensity (gray) values.");
+ RNA_def_property_ui_text(prop, "RGB to Intensity", "Converts texture RGB values to intensity (gray) values.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "rot");
+ RNA_def_property_range(prop, 0, 360);
+ RNA_def_property_float_funcs(prop, "rna_TextureSlot_angle_get", "rna_TextureSlot_angle_set", NULL);
+ RNA_def_property_ui_text(prop, "Angle", "Defines brush texture rotation.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "brush_map_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_map_mode_items);
+ RNA_def_property_ui_text(prop, "Mode", "");
+
+ prop= RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "def_var");
- RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Default Value", "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "variable_factor", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "variable_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "varfac");
- RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
RNA_def_property_ui_text(prop, "Variable Factor", "Amount texture affects other values.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_VECTOR);
- RNA_def_property_float_sdna(prop, NULL, "colfac");
- RNA_def_property_range(prop, 0, 1);
- RNA_def_property_ui_text(prop, "Color Factor", "Amount texture affects color values.");
- RNA_def_property_update(prop, NC_TEXTURE, NULL);
-
- prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "norfac");
- RNA_def_property_range(prop, 0, 25);
+ RNA_def_property_ui_range(prop, 0, 5, 10, 3);
RNA_def_property_ui_text(prop, "Normal Factor", "Amount texture affects normal values.");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "output_node", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "which_output");
+ RNA_def_property_enum_items(prop, output_node_items);
+ RNA_def_property_enum_funcs(prop, "rna_TextureSlot_output_node_get", NULL, "rna_TextureSlot_output_node_itemf");
+ RNA_def_property_ui_text(prop, "Output Node", "Which output node to use, for node-based textures.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
}
static void rna_def_filter_size_common(StructRNA *srna)
@@ -652,6 +835,11 @@ static void rna_def_texture_blend(BlenderRNA *brna)
{TEX_RAD, "RADIAL", 0, "Radial", "Creates a radial progression"},
{0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem prop_flip_axis_items[]= {
+ {0, "HORIZONTAL", 0, "Horizontal", "Flips the texture's X and Y axis"},
+ {TEX_FLIPBLEND, "VERTICAL", 0, "Vertical", "Flips the texture's X and Y axis"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "BlendTexture", "Texture");
RNA_def_struct_ui_text(srna, "Blend Texture", "Procedural color blending texture.");
RNA_def_struct_sdna(srna, "Tex");
@@ -662,10 +850,12 @@ static void rna_def_texture_blend(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Progression", "Sets the style of the color blending");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "flip_axis", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_FLIPBLEND);
+ prop= RNA_def_property(srna, "flip_axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, prop_flip_axis_items);
RNA_def_property_ui_text(prop, "Flip Axis", "Flips the texture's X and Y axis");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
}
static void rna_def_texture_stucci(BlenderRNA *brna)
@@ -744,6 +934,7 @@ static void rna_def_texture_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "mipmap", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_MIPMAP);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_ImageTexture_mipmap_set");
RNA_def_property_ui_text(prop, "MIP Map", "Uses auto-generated MIP maps for the image");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
@@ -881,6 +1072,31 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "iuser");
+ RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ /* filtering */
+ prop= RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "texfilter");
+ RNA_def_property_enum_items(prop, texture_filter_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_ImageTexture_filter_itemf");
+ RNA_def_property_ui_text(prop, "Filter", "Texture filter to use for sampling image.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "filter_probes", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "afmax");
+ RNA_def_property_range(prop, 1, 256);
+ RNA_def_property_ui_text(prop, "Filter Probes", "Maximum number of samples. Higher gives less blur at distant/oblique angles, but is also slower.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "filter_eccentricity", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "afmax");
+ RNA_def_property_range(prop, 1, 256);
+ RNA_def_property_ui_text(prop, "Filter Eccentricity", "Maximum eccentricity. Higher gives less blur at distant/oblique angles, but is also slower.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
}
static void rna_def_texture_plugin(BlenderRNA *brna)
@@ -905,6 +1121,11 @@ static void rna_def_texture_environment_map(BlenderRNA *brna)
rna_def_environment_map_common(srna);
+ prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "iuser");
+ RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
prop= RNA_def_property(srna, "environment_map", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "env");
RNA_def_property_struct_type(prop, "EnvironmentMap");
@@ -1020,17 +1241,34 @@ static void rna_def_texture_voronoi(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Voronoi", "Procedural voronoi texture.");
RNA_def_struct_sdna(srna, "Tex");
- prop= RNA_def_property(srna, "feature_weights", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "weight_1", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "vn_w1");
- RNA_def_property_array(prop, 4);
RNA_def_property_range(prop, -2, 2);
- RNA_def_property_ui_text(prop, "Feature Weights", "");
+ RNA_def_property_ui_text(prop, "Weight 1", "Voronoi feature weight 1");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "weight_2", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "vn_w2");
+ RNA_def_property_range(prop, -2, 2);
+ RNA_def_property_ui_text(prop, "Weight 2", "Voronoi feature weight 2");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "weight_3", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "vn_w3");
+ RNA_def_property_range(prop, -2, 2);
+ RNA_def_property_ui_text(prop, "Weight 3", "Voronoi feature weight 3");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "weight_4", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "vn_w4");
+ RNA_def_property_range(prop, -2, 2);
+ RNA_def_property_ui_text(prop, "Weight 4", "Voronoi feature weight 4");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "minkovsky_exponent", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "vn_mexp");
RNA_def_property_range(prop, 0.01, 10);
- RNA_def_property_ui_text(prop, "Minkovsky Exponent", "");
+ RNA_def_property_ui_text(prop, "Minkovsky Exponent", "Minkovsky exponent");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "distance_metric", PROP_ENUM, PROP_NONE);
@@ -1074,7 +1312,7 @@ static void rna_def_texture_distorted_noise(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Distorted Noise", "Procedural distorted noise texture.");
RNA_def_struct_sdna(srna, "Tex");
- prop= RNA_def_property(srna, "distortion_amount", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distortion", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dist_amount");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Distortion Amount", "");
@@ -1088,13 +1326,13 @@ static void rna_def_texture_distorted_noise(BlenderRNA *brna)
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "noise_basis", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "noisebasis");
+ RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
RNA_def_property_enum_items(prop, prop_noise_basis_items);
RNA_def_property_ui_text(prop, "Noise Basis", "Sets the noise basis used for turbulence");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "noise_distortion", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
+ RNA_def_property_enum_sdna(prop, NULL, "noisebasis");
RNA_def_property_enum_items(prop, prop_noise_basis_items);
RNA_def_property_ui_text(prop, "Noise Distortion", "Sets the noise basis for the distortion");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
@@ -1106,6 +1344,252 @@ static void rna_def_texture_distorted_noise(BlenderRNA *brna)
RNA_def_property_update(prop, NC_TEXTURE, NULL);
}
+static void rna_def_texture_pointdensity(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem point_source_items[] = {
+ {TEX_PD_PSYS, "PARTICLE_SYSTEM", 0, "Particle System", "Generate point density from a particle system"},
+ {TEX_PD_OBJECT, "OBJECT", 0, "Object Vertices", "Generate point density from an object's vertices"},
+ //{TEX_PD_FILE, "FILE", 0 , "File", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem particle_cache_items[] = {
+ {TEX_PD_OBJECTLOC, "OBJECT_LOCATION", 0, "Emit Object Location", ""},
+ {TEX_PD_OBJECTSPACE, "OBJECT_SPACE", 0, "Emit Object Space", ""},
+ {TEX_PD_WORLDSPACE, "WORLD_SPACE", 0 , "Global Space", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem vertice_cache_items[] = {
+ {TEX_PD_OBJECTLOC, "OBJECT_LOCATION", 0, "Object Location", ""},
+ {TEX_PD_OBJECTSPACE, "OBJECT_SPACE", 0, "Object Space", ""},
+ {TEX_PD_WORLDSPACE, "WORLD_SPACE", 0 , "Global Space", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem falloff_items[] = {
+ {TEX_PD_FALLOFF_STD, "STANDARD", 0, "Standard", ""},
+ {TEX_PD_FALLOFF_SMOOTH, "SMOOTH", 0, "Smooth", ""},
+ {TEX_PD_FALLOFF_SOFT, "SOFT", 0, "Soft", ""},
+ {TEX_PD_FALLOFF_CONSTANT, "CONSTANT", 0, "Constant", "Density is constant within lookup radius"},
+ {TEX_PD_FALLOFF_ROOT, "ROOT", 0, "Root", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem color_source_items[] = {
+ {TEX_PD_COLOR_CONSTANT, "CONSTANT", 0, "Constant", ""},
+ {TEX_PD_COLOR_PARTAGE, "PARTICLE_AGE", 0, "Particle Age", "Lifetime mapped as 0.0 - 1.0 intensity"},
+ {TEX_PD_COLOR_PARTSPEED, "PARTICLE_SPEED", 0, "Particle Speed", "Particle speed (absolute magnitude of velocity) mapped as 0.0-1.0 intensity"},
+ {TEX_PD_COLOR_PARTVEL, "PARTICLE_VELOCITY", 0, "Particle Velocity", "XYZ velocity mapped to RGB colors"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem turbulence_influence_items[] = {
+ {TEX_PD_NOISE_STATIC, "STATIC", 0, "Static", "Noise patterns will remain unchanged, faster and suitable for stills"},
+ {TEX_PD_NOISE_VEL, "PARTICLE_VELOCITY", 0, "Particle Velocity", "Turbulent noise driven by particle velocity"},
+ {TEX_PD_NOISE_AGE, "PARTICLE_AGE", 0, "Particle Age", "Turbulent noise driven by the particle's age between birth and death"},
+ {TEX_PD_NOISE_TIME, "GLOBAL_TIME", 0, "Global Time", "Turbulent noise driven by the global current frame"},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "PointDensity", NULL);
+ RNA_def_struct_sdna(srna, "PointDensity");
+ RNA_def_struct_ui_text(srna, "PointDensity", "Point density settings.");
+
+ prop= RNA_def_property(srna, "point_source", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "source");
+ RNA_def_property_enum_items(prop, point_source_items);
+ RNA_def_property_ui_text(prop, "Point Source", "Point data to use as renderable point density");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_ui_text(prop, "Object", "Object to take point data from");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "psys");
+ RNA_def_property_ui_text(prop, "Particle System", "Particle System to render as points");
+ RNA_def_property_struct_type(prop, "ParticleSystem");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "particle_cache", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "psys_cache_space");
+ RNA_def_property_enum_items(prop, particle_cache_items);
+ RNA_def_property_ui_text(prop, "Particle Cache", "Co-ordinate system to cache particles in");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "vertices_cache", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "ob_cache_space");
+ RNA_def_property_enum_items(prop, vertice_cache_items);
+ RNA_def_property_ui_text(prop, "Vertices Cache", "Co-ordinate system to cache vertices in");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "radius");
+ RNA_def_property_range(prop, 0.01, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Radius", "Radius from the shaded sample to look for points within");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "falloff_type");
+ RNA_def_property_enum_items(prop, falloff_items);
+ RNA_def_property_ui_text(prop, "Falloff", "Method of attenuating density by distance from the point");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "falloff_softness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "falloff_softness");
+ RNA_def_property_range(prop, 0.01, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Softness", "Softness of the 'soft' falloff option");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "color_source", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "color_source");
+ RNA_def_property_enum_items(prop, color_source_items);
+ RNA_def_property_ui_text(prop, "Color Source", "Data to derive color results from");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "speed_scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "speed_scale");
+ RNA_def_property_range(prop, 0.001, 100.0);
+ RNA_def_property_ui_text(prop, "Scale", "Multipler to bring particle speed within an acceptable range");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "coba");
+ RNA_def_property_struct_type(prop, "ColorRamp");
+ RNA_def_property_ui_text(prop, "Color Ramp", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ /* Turbulence */
+ prop= RNA_def_property(srna, "turbulence", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_PD_TURBULENCE);
+ RNA_def_property_ui_text(prop, "Turbulence", "Add directed noise to the density at render-time");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "turbulence_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "noise_size");
+ RNA_def_property_range(prop, 0.01, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Size", "Scale of the added turbulent noise");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "turbulence_strength", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "noise_fac");
+ RNA_def_property_range(prop, 0.01, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Strength", "");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ 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_ui_text(prop, "Depth", "Level of detail in the added turbulent noise");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "turbulence_influence", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "noise_influence");
+ RNA_def_property_enum_items(prop, turbulence_influence_items);
+ RNA_def_property_ui_text(prop, "Turbulence Influence", "Method for driving added turbulent noise");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "noise_basis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "noise_basis");
+ RNA_def_property_enum_items(prop, prop_noise_basis_items);
+ RNA_def_property_ui_text(prop, "Noise Basis", "Noise formula used for tubulence");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+
+ srna= RNA_def_struct(brna, "PointDensityTexture", "Texture");
+ RNA_def_struct_sdna(srna, "Tex");
+ RNA_def_struct_ui_text(srna, "Point Density", "Settings for the Point Density texture");
+
+ prop= RNA_def_property(srna, "pointdensity", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "pd");
+ RNA_def_property_struct_type(prop, "PointDensity");
+ RNA_def_property_ui_text(prop, "Point Density", "The point density settings associated with this texture");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+}
+
+static void rna_def_texture_voxeldata(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem interpolation_type_items[] = {
+ {TEX_VD_NEARESTNEIGHBOR, "NEREASTNEIGHBOR", 0, "Nearest Neighbor", "No interpolation, fast but blocky and low quality."},
+ {TEX_VD_LINEAR, "TRILINEAR", 0, "Linear", "Good smoothness and speed"},
+ {TEX_VD_QUADRATIC, "QUADRATIC", 0, "Quadratic", "Mid-range quality and speed"},
+ {TEX_VD_TRICUBIC_CATROM, "TRICUBIC_CATROM", 0, "Cubic Catmull-Rom", "High quality interpolation, but slower"},
+ {TEX_VD_TRICUBIC_BSPLINE, "TRICUBIC_BSPLINE", 0, "Cubic B-Spline", "Smoothed high quality interpolation, but slower"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem file_format_items[] = {
+ {TEX_VD_BLENDERVOXEL, "BLENDER_VOXEL", 0, "Blender Voxel", "Default binary voxel file format"},
+ {TEX_VD_RAW_8BIT, "RAW_8BIT", 0, "8 bit RAW", "8 bit greyscale binary data"},
+ //{TEX_VD_RAW_16BIT, "RAW_16BIT", 0, "16 bit RAW", ""},
+ {TEX_VD_IMAGE_SEQUENCE, "IMAGE_SEQUENCE", 0, "Image Sequence", "Generate voxels from a sequence of image slices"},
+ {TEX_VD_SMOKE, "SMOKE", 0, "Smoke", "Render voxels from a Blender smoke simulation"},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "VoxelData", NULL);
+ RNA_def_struct_sdna(srna, "VoxelData");
+ RNA_def_struct_ui_text(srna, "VoxelData", "Voxel data settings.");
+
+ prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "interp_type");
+ RNA_def_property_enum_items(prop, interpolation_type_items);
+ RNA_def_property_ui_text(prop, "Interpolation", "Method to interpolate/smooth values between voxel cells");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "int_multiplier");
+ RNA_def_property_range(prop, 0.01, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Intensity", "Multiplier for intensity values");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "file_format", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "file_format");
+ RNA_def_property_enum_items(prop, file_format_items);
+ RNA_def_property_ui_text(prop, "File Format", "Format of the source data set to render ");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "source_path", PROP_STRING, PROP_FILEPATH);
+ RNA_def_property_string_sdna(prop, NULL, "source_path");
+ RNA_def_property_ui_text(prop, "Source Path", "The external source data file to use");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "resol");
+ RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "still", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_VD_STILL);
+ RNA_def_property_ui_text(prop, "Still Frame Only", "Always render a still frame from the voxel data sequence");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "still_frame_number", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "still_frame");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_ui_text(prop, "Still Frame Number", "The frame number to always use");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "domain_object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_ui_text(prop, "Domain Object", "Object used as the smoke simulation domain");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+
+ srna= RNA_def_struct(brna, "VoxelDataTexture", "Texture");
+ RNA_def_struct_sdna(srna, "Tex");
+ RNA_def_struct_ui_text(srna, "Voxel Data", "Settings for the Voxel Data texture");
+
+ prop= RNA_def_property(srna, "voxeldata", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vd");
+ RNA_def_property_struct_type(prop, "VoxelData");
+ RNA_def_property_ui_text(prop, "Voxel Data", "The voxel data associated with this texture");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+}
+
static void rna_def_texture(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1113,19 +1597,21 @@ static void rna_def_texture(BlenderRNA *brna)
static EnumPropertyItem prop_type_items[] = {
{0, "NONE", 0, "None", ""},
- {TEX_CLOUDS, "CLOUDS", 0, "Clouds", ""},
- {TEX_WOOD, "WOOD", 0, "Wood", ""},
- {TEX_MARBLE, "MARBLE", 0, "Marble", ""},
- {TEX_MAGIC, "MAGIC", 0, "Magic", ""},
- {TEX_BLEND, "BLEND", 0, "Blend", ""},
- {TEX_STUCCI, "STUCCI", 0, "Stucci", ""},
- {TEX_NOISE, "NOISE", 0, "Noise", ""},
- {TEX_IMAGE, "IMAGE", 0, "Image/Movie", ""},
- {TEX_PLUGIN, "PLUGIN", 0, "Plugin", ""},
- {TEX_ENVMAP, "ENVIRONMENT_MAP", 0, "Environment Map", ""},
- {TEX_MUSGRAVE, "MUSGRAVE", 0, "Musgrave", ""},
- {TEX_VORONOI, "VORONOI", 0, "Voronoi", ""},
- {TEX_DISTNOISE, "DISTORTED_NOISE", 0, "Distorted Noise", ""},
+ {TEX_PLUGIN, "PLUGIN", ICON_CONSTRAINT, "Plugin", ""},
+ {TEX_IMAGE, "IMAGE", ICON_RENDER_RESULT, "Image or Movie", ""},
+ {TEX_ENVMAP, "ENVIRONMENT_MAP", ICON_RENDER_RESULT, "Environment Map", ""},
+ {TEX_CLOUDS, "CLOUDS", ICON_TEXTURE, "Clouds", ""},
+ {TEX_WOOD, "WOOD", ICON_TEXTURE, "Wood", ""},
+ {TEX_MARBLE, "MARBLE", ICON_TEXTURE, "Marble", ""},
+ {TEX_MAGIC, "MAGIC", ICON_TEXTURE, "Magic", ""},
+ {TEX_BLEND, "BLEND", ICON_TEXTURE, "Blend", ""},
+ {TEX_STUCCI, "STUCCI", ICON_TEXTURE, "Stucci", ""},
+ {TEX_NOISE, "NOISE", ICON_TEXTURE, "Noise", ""},
+ {TEX_MUSGRAVE, "MUSGRAVE", ICON_TEXTURE, "Musgrave", ""},
+ {TEX_VORONOI, "VORONOI", ICON_TEXTURE, "Voronoi", ""},
+ {TEX_DISTNOISE, "DISTORTED_NOISE", ICON_TEXTURE, "Distorted Noise", ""},
+ {TEX_POINTDENSITY, "POINT_DENSITY", ICON_TEXTURE, "Point Density", ""},
+ {TEX_VOXELDATA, "VOXEL_DATA", ICON_TEXTURE, "Voxel Data", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Texture", "ID");
@@ -1135,9 +1621,18 @@ static void rna_def_texture(BlenderRNA *brna)
RNA_def_struct_refine_func(srna, "rna_Texture_refine");
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ //RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ 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_Texture_type_set", NULL);
RNA_def_property_ui_text(prop, "Type", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_COLORBAND);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Texture_use_color_ramp_set");
+ RNA_def_property_ui_text(prop, "Use Color Ramp", "Toggle color ramp operations.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "coba");
@@ -1156,15 +1651,25 @@ static void rna_def_texture(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Contrast", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
- /* XXX: would be nicer to have this as a color selector?
- but the values can go past [0,1]. */
- prop= RNA_def_property(srna, "rgb_factor", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "rgb_factor", PROP_FLOAT, PROP_RGB);
RNA_def_property_float_sdna(prop, NULL, "rfac");
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0, 2);
RNA_def_property_ui_text(prop, "RGB Factor", "");
RNA_def_property_update(prop, NC_TEXTURE, NULL);
-
+
+ /* nodetree */
+ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
+ RNA_def_property_boolean_funcs(prop, NULL, "rna_Texture_use_nodes_set");
+ RNA_def_property_ui_text(prop, "Use Nodes", "Make this a node-based texture");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
+ RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node-based textures");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
rna_def_animdata_common(srna);
/* specific types */
@@ -1181,6 +1686,8 @@ static void rna_def_texture(BlenderRNA *brna)
rna_def_texture_musgrave(brna);
rna_def_texture_voronoi(brna);
rna_def_texture_distorted_noise(brna);
+ rna_def_texture_pointdensity(brna);
+ rna_def_texture_voxeldata(brna);
/* XXX add more types here .. */
}
diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c
index d42603e1952..5e20fca15f0 100644
--- a/source/blender/makesrna/intern/rna_timeline.c
+++ b/source/blender/makesrna/intern/rna_timeline.c
@@ -49,7 +49,7 @@ static void rna_def_timeline_marker(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "frame", PROP_INT, PROP_NONE);
+ prop= RNA_def_property(srna, "frame", PROP_INT, PROP_TIME);
RNA_def_property_ui_text(prop, "Frame", "The frame on which the timeline marker appears.");
}
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index 825b3711b97..f16180451a7 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -76,22 +76,22 @@ static ARegionType *region_type_find(ReportList *reports, int space_type, int re
static int panel_poll(const bContext *C, PanelType *pt)
{
PointerRNA ptr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
void *ret;
int visible;
- RNA_pointer_create(NULL, pt->py_srna, NULL, &ptr); /* dummy */
+ RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */
func= RNA_struct_find_function(&ptr, "poll");
- list= RNA_parameter_list_create(&ptr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- pt->py_call(&ptr, func, list);
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ pt->ext.call(&ptr, func, &list);
- RNA_parameter_get_lookup(list, "visible", &ret);
+ RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
return visible;
}
@@ -99,33 +99,33 @@ static int panel_poll(const bContext *C, PanelType *pt)
static void panel_draw(const bContext *C, Panel *pnl)
{
PointerRNA ptr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
- RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->py_srna, pnl, &ptr);
+ RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr);
func= RNA_struct_find_function(&ptr, "draw");
- list= RNA_parameter_list_create(&ptr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- pnl->type->py_call(&ptr, func, list);
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ pnl->type->ext.call(&ptr, func, &list);
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
}
static void panel_draw_header(const bContext *C, Panel *pnl)
{
PointerRNA ptr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
- RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->py_srna, pnl, &ptr);
+ RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->ext.srna, pnl, &ptr);
func= RNA_struct_find_function(&ptr, "draw_header");
- list= RNA_parameter_list_create(&ptr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- pnl->type->py_call(&ptr, func, list);
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ pnl->type->ext.call(&ptr, func, &list);
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
}
static void rna_Panel_unregister(const bContext *C, StructRNA *type)
@@ -138,6 +138,8 @@ static void rna_Panel_unregister(const bContext *C, StructRNA *type)
if(!(art=region_type_find(NULL, pt->space_type, pt->region_type)))
return;
+ RNA_struct_free_extension(type, &pt->ext);
+
BLI_freelinkN(&art->paneltypes, pt);
RNA_struct_free(&BLENDER_RNA, type);
@@ -146,7 +148,7 @@ static void rna_Panel_unregister(const bContext *C, StructRNA *type)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, void *data, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
PanelType *pt, dummypt = {0};
@@ -168,8 +170,10 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
/* check if we have registered this panel type before, and remove it */
for(pt=art->paneltypes.first; pt; pt=pt->next) {
if(strcmp(pt->idname, dummypt.idname) == 0) {
- if(pt->py_srna)
- rna_Panel_unregister(C, pt->py_srna);
+ if(pt->ext.srna)
+ rna_Panel_unregister(C, pt->ext.srna);
+ else
+ BLI_freelinkN(&art->paneltypes, pt);
break;
}
}
@@ -178,11 +182,11 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
pt= MEM_callocN(sizeof(PanelType), "python buttons panel");
memcpy(pt, &dummypt, sizeof(dummypt));
- pt->py_srna= RNA_def_struct(&BLENDER_RNA, pt->idname, "Panel");
- pt->py_data= data;
- pt->py_call= call;
- pt->py_free= free;
- RNA_struct_blender_type_set(pt->py_srna, pt);
+ pt->ext.srna= RNA_def_struct(&BLENDER_RNA, pt->idname, "Panel");
+ pt->ext.data= data;
+ pt->ext.call= call;
+ pt->ext.free= free;
+ RNA_struct_blender_type_set(pt->ext.srna, pt);
pt->poll= (have_function[0])? panel_poll: NULL;
pt->draw= (have_function[1])? panel_draw: NULL;
@@ -194,13 +198,13 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
if(C)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
- return pt->py_srna;
+ return pt->ext.srna;
}
-static StructRNA* rna_Panel_refine(struct PointerRNA *ptr)
+static StructRNA* rna_Panel_refine(PointerRNA *ptr)
{
Panel *hdr= (Panel*)ptr->data;
- return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Panel;
+ return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Panel;
}
/* Header */
@@ -208,17 +212,17 @@ static StructRNA* rna_Panel_refine(struct PointerRNA *ptr)
static void header_draw(const bContext *C, Header *hdr)
{
PointerRNA htr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
- RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->py_srna, hdr, &htr);
+ RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->ext.srna, hdr, &htr);
func= RNA_struct_find_function(&htr, "draw");
- list= RNA_parameter_list_create(&htr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- hdr->type->py_call(&htr, func, list);
+ RNA_parameter_list_create(&list, &htr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ hdr->type->ext.call(&htr, func, &list);
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
}
static void rna_Header_unregister(const bContext *C, StructRNA *type)
@@ -231,6 +235,8 @@ static void rna_Header_unregister(const bContext *C, StructRNA *type)
if(!(art=region_type_find(NULL, ht->space_type, RGN_TYPE_HEADER)))
return;
+ RNA_struct_free_extension(type, &ht->ext);
+
BLI_freelinkN(&art->headertypes, ht);
RNA_struct_free(&BLENDER_RNA, type);
@@ -239,7 +245,7 @@ static void rna_Header_unregister(const bContext *C, StructRNA *type)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, void *data, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
HeaderType *ht, dummyht = {0};
@@ -261,8 +267,8 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
/* check if we have registered this header type before, and remove it */
for(ht=art->headertypes.first; ht; ht=ht->next) {
if(strcmp(ht->idname, dummyht.idname) == 0) {
- if(ht->py_srna)
- rna_Header_unregister(C, ht->py_srna);
+ if(ht->ext.srna)
+ rna_Header_unregister(C, ht->ext.srna);
break;
}
}
@@ -271,11 +277,11 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
ht= MEM_callocN(sizeof(HeaderType), "python buttons header");
memcpy(ht, &dummyht, sizeof(dummyht));
- ht->py_srna= RNA_def_struct(&BLENDER_RNA, ht->idname, "Header");
- ht->py_data= data;
- ht->py_call= call;
- ht->py_free= free;
- RNA_struct_blender_type_set(ht->py_srna, ht);
+ ht->ext.srna= RNA_def_struct(&BLENDER_RNA, ht->idname, "Header");
+ ht->ext.data= data;
+ ht->ext.call= call;
+ ht->ext.free= free;
+ RNA_struct_blender_type_set(ht->ext.srna, ht);
ht->draw= (have_function[0])? header_draw: NULL;
@@ -285,13 +291,13 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
if(C)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
- return ht->py_srna;
+ return ht->ext.srna;
}
-static StructRNA* rna_Header_refine(struct PointerRNA *htr)
+static StructRNA* rna_Header_refine(PointerRNA *htr)
{
Header *hdr= (Header*)htr->data;
- return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Header;
+ return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Header;
}
/* Menu */
@@ -299,22 +305,22 @@ static StructRNA* rna_Header_refine(struct PointerRNA *htr)
static int menu_poll(const bContext *C, MenuType *pt)
{
PointerRNA ptr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
void *ret;
int visible;
- RNA_pointer_create(NULL, pt->py_srna, NULL, &ptr); /* dummy */
+ RNA_pointer_create(NULL, pt->ext.srna, NULL, &ptr); /* dummy */
func= RNA_struct_find_function(&ptr, "poll");
- list= RNA_parameter_list_create(&ptr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- pt->py_call(&ptr, func, list);
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ pt->ext.call(&ptr, func, &list);
- RNA_parameter_get_lookup(list, "visible", &ret);
+ RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
return visible;
}
@@ -322,17 +328,17 @@ static int menu_poll(const bContext *C, MenuType *pt)
static void menu_draw(const bContext *C, Menu *hdr)
{
PointerRNA mtr;
- ParameterList *list;
+ ParameterList list;
FunctionRNA *func;
- RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->py_srna, hdr, &mtr);
+ RNA_pointer_create(&CTX_wm_screen(C)->id, hdr->type->ext.srna, hdr, &mtr);
func= RNA_struct_find_function(&mtr, "draw");
- list= RNA_parameter_list_create(&mtr, func);
- RNA_parameter_set_lookup(list, "context", &C);
- hdr->type->py_call(&mtr, func, list);
+ RNA_parameter_list_create(&list, &mtr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ hdr->type->ext.call(&mtr, func, &list);
- RNA_parameter_list_free(list);
+ RNA_parameter_list_free(&list);
}
static void rna_Menu_unregister(const bContext *C, StructRNA *type)
@@ -345,6 +351,8 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type)
if(!(art=region_type_find(NULL, mt->space_type, RGN_TYPE_HEADER)))
return;
+ RNA_struct_free_extension(type, &mt->ext);
+
BLI_freelinkN(&art->menutypes, mt);
RNA_struct_free(&BLENDER_RNA, type);
@@ -353,7 +361,7 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void *data, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
MenuType *mt, dummymt = {0};
@@ -375,8 +383,8 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
/* check if we have registered this menu type before, and remove it */
for(mt=art->menutypes.first; mt; mt=mt->next) {
if(strcmp(mt->idname, dummymt.idname) == 0) {
- if(mt->py_srna)
- rna_Menu_unregister(C, mt->py_srna);
+ if(mt->ext.srna)
+ rna_Menu_unregister(C, mt->ext.srna);
break;
}
}
@@ -385,11 +393,11 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
mt= MEM_callocN(sizeof(MenuType), "python buttons menu");
memcpy(mt, &dummymt, sizeof(dummymt));
- mt->py_srna= RNA_def_struct(&BLENDER_RNA, mt->idname, "Menu");
- mt->py_data= data;
- mt->py_call= call;
- mt->py_free= free;
- RNA_struct_blender_type_set(mt->py_srna, mt);
+ mt->ext.srna= RNA_def_struct(&BLENDER_RNA, mt->idname, "Menu");
+ mt->ext.data= data;
+ mt->ext.call= call;
+ mt->ext.free= free;
+ RNA_struct_blender_type_set(mt->ext.srna, mt);
mt->poll= (have_function[0])? menu_poll: NULL;
mt->draw= (have_function[1])? menu_draw: NULL;
@@ -400,93 +408,109 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
if(C)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
- return mt->py_srna;
+ return mt->ext.srna;
}
-static StructRNA* rna_Menu_refine(struct PointerRNA *mtr)
+static StructRNA* rna_Menu_refine(PointerRNA *mtr)
{
Menu *hdr= (Menu*)mtr->data;
- return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Menu;
+ return (hdr->type && hdr->type->ext.srna)? hdr->type->ext.srna: &RNA_Menu;
}
-static int rna_UILayout_active_get(struct PointerRNA *ptr)
+static int rna_UILayout_active_get(PointerRNA *ptr)
{
return uiLayoutGetActive(ptr->data);
}
-static void rna_UILayout_active_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_active_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetActive(ptr->data, value);
+ uiLayoutSetActive(ptr->data, value);
}
-static void rna_UILayout_op_context_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_op_context_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetOperatorContext(ptr->data, value);
+ uiLayoutSetOperatorContext(ptr->data, value);
}
-static int rna_UILayout_op_context_get(struct PointerRNA *ptr)
+static int rna_UILayout_op_context_get(PointerRNA *ptr)
{
return uiLayoutGetOperatorContext(ptr->data);
}
-static int rna_UILayout_enabled_get(struct PointerRNA *ptr)
+static int rna_UILayout_enabled_get(PointerRNA *ptr)
{
return uiLayoutGetEnabled(ptr->data);
}
-static void rna_UILayout_enabled_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_enabled_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetEnabled(ptr->data, value);
+ uiLayoutSetEnabled(ptr->data, value);
}
-static int rna_UILayout_red_alert_get(struct PointerRNA *ptr)
+#if 0
+static int rna_UILayout_red_alert_get(PointerRNA *ptr)
{
return uiLayoutGetRedAlert(ptr->data);
}
-static void rna_UILayout_red_alert_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_red_alert_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetRedAlert(ptr->data, value);
+ uiLayoutSetRedAlert(ptr->data, value);
}
-static int rna_UILayout_keep_aspect_get(struct PointerRNA *ptr)
+static int rna_UILayout_keep_aspect_get(PointerRNA *ptr)
{
return uiLayoutGetKeepAspect(ptr->data);
}
-static void rna_UILayout_keep_aspect_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_keep_aspect_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetKeepAspect(ptr->data, value);
+ uiLayoutSetKeepAspect(ptr->data, value);
}
+#endif
-static int rna_UILayout_alignment_get(struct PointerRNA *ptr)
+static int rna_UILayout_alignment_get(PointerRNA *ptr)
{
return uiLayoutGetAlignment(ptr->data);
}
-static void rna_UILayout_alignment_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_alignment_set(PointerRNA *ptr, int value)
{
- return uiLayoutSetAlignment(ptr->data, value);
+ uiLayoutSetAlignment(ptr->data, value);
}
-static float rna_UILayout_scale_x_get(struct PointerRNA *ptr)
+static float rna_UILayout_scale_x_get(PointerRNA *ptr)
{
return uiLayoutGetScaleX(ptr->data);
}
-static void rna_UILayout_scale_x_set(struct PointerRNA *ptr, float value)
+static void rna_UILayout_scale_x_set(PointerRNA *ptr, float value)
{
- return uiLayoutSetScaleX(ptr->data, value);
+ uiLayoutSetScaleX(ptr->data, value);
}
-static float rna_UILayout_scale_y_get(struct PointerRNA *ptr)
+static float rna_UILayout_scale_y_get(PointerRNA *ptr)
{
return uiLayoutGetScaleY(ptr->data);
}
-static void rna_UILayout_scale_y_set(struct PointerRNA *ptr, float value)
+static void rna_UILayout_scale_y_set(PointerRNA *ptr, float value)
+{
+ uiLayoutSetScaleY(ptr->data, value);
+}
+
+static PointerRNA rna_UIListItem_layout_get(PointerRNA *ptr)
{
- return uiLayoutSetScaleY(ptr->data, value);
+ uiListItem *item= (uiListItem*)ptr->data;
+ PointerRNA newptr;
+ RNA_pointer_create(NULL, &RNA_UILayout, item->layout, &newptr);
+ return newptr;
+}
+
+static PointerRNA rna_UIListItem_data_get(PointerRNA *ptr)
+{
+ uiListItem *item= (uiListItem*)ptr->data;
+ return item->data;
}
#else // RNA_RUNTIME
@@ -514,6 +538,8 @@ static void rna_def_ui_layout(BlenderRNA *brna)
{WM_OP_EXEC_AREA, "EXEC_AREA", 0, "Exec Area", ""},
{WM_OP_EXEC_SCREEN, "EXEC_SCREEN", 0, "Exec Screen", ""},
{0, NULL, 0, NULL, NULL}};
+
+ /* layout */
srna= RNA_def_struct(brna, "UILayout", NULL);
RNA_def_struct_sdna(srna, "uiLayout");
@@ -529,15 +555,19 @@ static void rna_def_ui_layout(BlenderRNA *brna)
prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
+#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, "alignment", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, alignment_items);
RNA_def_property_enum_funcs(prop, "rna_UILayout_alignment_get", "rna_UILayout_alignment_set", NULL);
+#if 0
prop= RNA_def_property(srna, "keep_aspect", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_UILayout_keep_aspect_get", "rna_UILayout_keep_aspect_set");
+#endif
prop= RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_x_get", "rna_UILayout_scale_x_set", NULL);
@@ -546,6 +576,21 @@ static void rna_def_ui_layout(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
RNA_api_ui_layout(srna);
+
+ /* list item */
+
+ srna= RNA_def_struct(brna, "UIListItem", NULL);
+ RNA_def_struct_ui_text(srna, "UI List Item", "User interface list.");
+
+ prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "UILayout");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_UIListItem_layout_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "AnyType");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_UIListItem_data_get", NULL, NULL);
}
static void rna_def_panel(BlenderRNA *brna)
@@ -581,6 +626,9 @@ static void rna_def_panel(BlenderRNA *brna)
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "UILayout");
+ prop= RNA_def_property(srna, "text", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "drawname");
+
/* registration */
prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
@@ -607,6 +655,10 @@ static void rna_def_panel(BlenderRNA *brna)
prop= RNA_def_property(srna, "default_closed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_DEFAULT_CLOSED);
RNA_def_property_flag(prop, PROP_REGISTER);
+
+ prop= RNA_def_property(srna, "show_header", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", PNL_NO_HEADER);
+ RNA_def_property_flag(prop, PROP_REGISTER);
}
static void rna_def_header(BlenderRNA *brna)
@@ -627,7 +679,10 @@ static void rna_def_header(BlenderRNA *brna)
RNA_def_function_flag(func, FUNC_REGISTER);
RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_define_verify_sdna(0); // not in sdna
+
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "layout");
RNA_def_property_struct_type(prop, "UILayout");
/* registration */
@@ -639,6 +694,8 @@ static void rna_def_header(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
RNA_def_property_enum_items(prop, space_type_items);
RNA_def_property_flag(prop, PROP_REGISTER);
+
+ RNA_define_verify_sdna(1);
}
static void rna_def_menu(BlenderRNA *brna)
@@ -666,7 +723,10 @@ static void rna_def_menu(BlenderRNA *brna)
RNA_def_function_flag(func, FUNC_REGISTER);
RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_define_verify_sdna(0); // not in sdna
+
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "layout");
RNA_def_property_struct_type(prop, "UILayout");
/* registration */
@@ -682,6 +742,8 @@ static void rna_def_menu(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "type->space_type");
RNA_def_property_enum_items(prop, space_type_items);
RNA_def_property_flag(prop, PROP_REGISTER);
+
+ RNA_define_verify_sdna(1);
}
void RNA_def_ui(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index a4aa60775f2..17846651c3b 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -37,6 +37,24 @@
#ifdef RNA_RUNTIME
+static void rna_uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider, int toggle, int icon_only)
+{
+ int flag= 0;
+
+ flag |= (slider)? UI_ITEM_R_SLIDER: 0;
+ flag |= (expand)? UI_ITEM_R_EXPAND: 0;
+ flag |= (toggle)? UI_ITEM_R_TOGGLE: 0;
+ flag |= (icon_only)? UI_ITEM_R_ICON_ONLY: 0;
+
+ uiItemR(layout, name, icon, ptr, propname, flag);
+}
+
+static PointerRNA rna_uiItemO(uiLayout *layout, char *name, int icon, char *opname, int properties)
+{
+ int flag= (properties)? UI_ITEM_O_RETURN_PROPS: 0;
+ return uiItemFullO(layout, name, icon, opname, NULL, uiLayoutGetOperatorContext(layout), flag);
+}
+
#else
#define DEF_ICON(name) {name, #name, 0, #name, ""},
@@ -71,7 +89,7 @@ static void api_ui_item_rna_common(FunctionRNA *func)
PropertyRNA *parm;
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ 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);
}
@@ -86,6 +104,12 @@ void RNA_api_ui_layout(StructRNA *srna)
{'v', "VECTOR", 0, "Vector", ""},
{'c', "COLOR", 0, "Color", ""},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem list_type_items[] = {
+ {0, "DEFAULT", 0, "None", ""},
+ {'c', "COMPACT", 0, "Compact", ""},
+ {'i', "ICONS", 0, "Icons", ""},
+ {0, NULL, 0, NULL, NULL}};
/* simple layout specifiers */
func= RNA_def_function(srna, "row", "uiLayoutRow");
@@ -113,15 +137,16 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "split", "uiLayoutSplit");
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
- RNA_def_float(func, "percentage", 0.5f, 0.0f, 1.0f, "Percentage", "Percentage of width to split at.", 0.0f, 1.0f);
+ RNA_def_float(func, "percentage", 0.0f, 0.0f, 1.0f, "Percentage", "Percentage of width to split at.", 0.0f, 1.0f);
/* items */
- func= RNA_def_function(srna, "itemR", "uiItemR");
+ func= RNA_def_function(srna, "itemR", "rna_uiItemR");
api_ui_item_common(func);
api_ui_item_rna_common(func);
RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
RNA_def_boolean(func, "slider", 0, "", "Use slider widget for numeric values.");
RNA_def_boolean(func, "toggle", 0, "", "Use toggle widget for boolean values.");
+ RNA_def_boolean(func, "icon_only", 0, "", "Draw only icons in buttons, no text.");
func= RNA_def_function(srna, "items_enumR", "uiItemsEnumR");
api_ui_item_rna_common(func);
@@ -130,22 +155,26 @@ void RNA_api_ui_layout(StructRNA *srna)
api_ui_item_common(func);
api_ui_item_rna_common(func);
- /*func= RNA_def_function(srna, "item_enumR", "uiItemEnumR");
+ func= RNA_def_function(srna, "item_enumR", "uiItemEnumR_string");
api_ui_item_common(func);
api_ui_item_rna_common(func);
parm= RNA_def_string(func, "value", "", 0, "", "Enum property value.");
- RNA_def_property_flag(parm, PROP_REQUIRED);*/
+ RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "item_pointerR", "uiItemPointerR");
api_ui_item_common(func);
api_ui_item_rna_common(func);
parm= RNA_def_pointer(func, "search_data", "AnyType", "", "Data from which to take collection to search in.");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- func= RNA_def_function(srna, "itemO", "uiItemO");
+ func= RNA_def_function(srna, "itemO", "rna_uiItemO");
api_ui_item_op_common(func);
+ parm= RNA_def_boolean(func, "properties", 0, "Properties", "Return operator properties to fill in manually.");
+ parm= RNA_def_pointer(func, "return_properties", "OperatorProperties", "", "Operator properties to fill in, return when 'properties' is set to true.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "item_enumO", "uiItemEnumO_string");
api_ui_item_op_common(func);
@@ -214,41 +243,47 @@ void RNA_api_ui_layout(StructRNA *srna)
/* templates */
func= RNA_def_function(srna, "template_header", "uiTemplateHeader");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_boolean(func, "menus", 1, "", "The header has menus, and should show menu expander.");
func= RNA_def_function(srna, "template_ID", "uiTemplateID");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block.");
+ RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block.");
RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block.");
func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
parm= RNA_def_pointer(func, "data", "Modifier", "", "Modifier data.");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "template_constraint", "uiTemplateConstraint");
parm= RNA_def_pointer(func, "data", "Constraint", "", "Constraint data.");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "template_preview", "uiTemplatePreview");
parm= RNA_def_pointer(func, "id", "ID", "", "ID datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "parent", "ID", "", "ID datablock.");
+ RNA_def_pointer(func, "slot", "TextureSlot", "", "Texture slot.");
func= RNA_def_function(srna, "template_curve_mapping", "uiTemplateCurveMapping");
- parm= RNA_def_pointer(func, "curvemap", "CurveMapping", "", "Curve mapping pointer.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ api_ui_item_rna_common(func);
RNA_def_enum(func, "type", curve_type_items, 0, "Type", "Type of curves to display.");
+ RNA_def_boolean(func, "levels", 0, "", "Show black/white levels.");
func= RNA_def_function(srna, "template_color_ramp", "uiTemplateColorRamp");
- parm= RNA_def_pointer(func, "ramp", "ColorRamp", "", "Color ramp pointer.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ 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);
+
+ func= RNA_def_function(srna, "template_triColorSet", "uiTemplateTriColorSet");
+ api_ui_item_rna_common(func);
func= RNA_def_function(srna, "template_image_layers", "uiTemplateImageLayers");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
@@ -257,15 +292,38 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_pointer(func, "image_user", "ImageUser", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
- func= RNA_def_function(srna, "template_list", "uiTemplateList");
+ func= RNA_def_function(srna, "template_image", "uiTemplateImage");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
+ parm= RNA_def_pointer(func, "image_user", "ImageUser", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+ RNA_def_boolean(func, "compact", 0, "", "Use more compact layout.");
+
+ func= RNA_def_function(srna, "template_list", "uiTemplateList");
+ 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);
+ parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "active_data", "AnyType", "", "Data from which to take property for the active element.");
+ 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, "columns", 5, 0, INT_MAX, "", "Number of columns to display.", 0, INT_MAX);
- parm= RNA_def_boolean(func, "compact", 0, "", "Use compact, single row list template.");
+ parm= RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
parm= RNA_def_collection(func, "items", 0, "", "Items visible in the list.");
RNA_def_function_return(func, parm);
+
+ 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");
+
+ func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+ func= RNA_def_function(srna, "view3d_select_faceselmenu", "uiTemplate_view3d_select_faceselmenu");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 609082144e1..e9fcb299c53 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -33,13 +33,21 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
+#include "WM_api.h"
#include "WM_types.h"
#include "BKE_utildefines.h"
+#include "BKE_sound.h"
+
#ifdef RNA_RUNTIME
-static void rna_userdef_lmb_select_set(struct PointerRNA *ptr,int value)
+static void rna_userdef_update(bContext *C, PointerRNA *ptr)
+{
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+}
+
+static void rna_userdef_lmb_select_set(PointerRNA *ptr,int value)
{
UserDef *userdef = (UserDef*)ptr->data;
@@ -51,12 +59,12 @@ static void rna_userdef_lmb_select_set(struct PointerRNA *ptr,int value)
userdef->flag &= ~USER_LMOUSESELECT;
}
-static void rna_userdef_rmb_select_set(struct PointerRNA *ptr,int value)
+static void rna_userdef_rmb_select_set(PointerRNA *ptr,int value)
{
rna_userdef_lmb_select_set(ptr, !value);
}
-static void rna_userdef_emulate_set(struct PointerRNA *ptr,int value)
+static void rna_userdef_emulate_set(PointerRNA *ptr,int value)
{
UserDef *userdef = (UserDef*)ptr->data;
@@ -66,7 +74,7 @@ static void rna_userdef_emulate_set(struct PointerRNA *ptr,int value)
userdef->flag ^= USER_TWOBUTTONMOUSE;
}
-static int rna_userdef_autokeymode_get(struct PointerRNA *ptr)
+static int rna_userdef_autokeymode_get(PointerRNA *ptr)
{
UserDef *userdef = (UserDef*)ptr->data;
short retval = userdef->autokey_mode;
@@ -77,7 +85,7 @@ static int rna_userdef_autokeymode_get(struct PointerRNA *ptr)
return retval;
}
-static void rna_userdef_autokeymode_set(struct PointerRNA *ptr,int value)
+static void rna_userdef_autokeymode_set(PointerRNA *ptr,int value)
{
UserDef *userdef = (UserDef*)ptr->data;
@@ -101,16 +109,6 @@ static PointerRNA rna_UserDef_edit_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesEdit, ptr->data);
}
-static PointerRNA rna_UserDef_autosave_get(PointerRNA *ptr)
-{
- return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesAutosave, ptr->data);
-}
-
-static PointerRNA rna_UserDef_language_get(PointerRNA *ptr)
-{
- return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesLanguage, ptr->data);
-}
-
static PointerRNA rna_UserDef_filepaths_get(PointerRNA *ptr)
{
return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesFilePaths, ptr->data);
@@ -121,6 +119,11 @@ static PointerRNA rna_UserDef_system_get(PointerRNA *ptr)
return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesSystem, ptr->data);
}
+static void rna_UserDef_audio_update(bContext *C, PointerRNA *ptr)
+{
+ sound_init(C);
+}
+
#else
static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
@@ -128,6 +131,11 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem font_kerning_style[] = {
+ {0, "UNFITTED", 0, "Unfitted", "Use scaled but un-grid-fitted kerning distances."},
+ {1, "DEFAULT", 0, "Default", "Use scaled and grid-fitted kerning distances."},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "ThemeFontStyle", NULL);
RNA_def_struct_sdna(srna, "uiFontStyle");
RNA_def_struct_ui_text(srna, "Font Style", "Theme settings for Font.");
@@ -135,42 +143,38 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
prop= RNA_def_property(srna, "points", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 6, 48);
RNA_def_property_ui_text(prop, "Points", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
-
- prop= RNA_def_property(srna, "kerning", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, -5.0, 5.0);
- RNA_def_property_ui_text(prop, "Kerning", "User kerning value in pixels");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "overlap", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "overlap", 1);
- RNA_def_property_ui_text(prop, "Overlap", "Check for overlap characters");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ prop= RNA_def_property(srna, "font_kerning_style", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "kerning");
+ RNA_def_property_enum_items(prop, font_kerning_style);
+ RNA_def_property_ui_text(prop, "Kerning Style", "Which style to use for font kerning.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadow", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 5);
RNA_def_property_ui_text(prop, "Shadow Size", "Shadow size in pixels (0, 3 and 5 supported)");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadx", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -10, 10);
RNA_def_property_ui_text(prop, "Shadow X Offset", "Shadow offset in pixels");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shady", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -10, 10);
RNA_def_property_ui_text(prop, "Shadow Y Offset", "Shadow offset in pixels");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadowalpha", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Shadow Alpha", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadowcolor", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Shadow Brightness", "Shadow color in grey value");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_ui_style(BlenderRNA *brna)
@@ -184,29 +188,37 @@ static void rna_def_userdef_theme_ui_style(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "uiStyle");
RNA_def_struct_ui_text(srna, "Style", "Theme settings for style sets.");
- prop= RNA_def_property(srna, "paneltitle", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "panelzoom", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.5, 2.0);
+ RNA_def_property_ui_text(prop, "Panel Zoom", "Default zoom level for panel areas.");
+
+ prop= RNA_def_property(srna, "paneltitle", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "paneltitle");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Panel Font", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "grouplabel", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "grouplabel", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "grouplabel");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Group Label Font", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "widgetlabel", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "widgetlabel", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "widgetlabel");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Widget Label Font", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "widget", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "widget", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "widget");
RNA_def_property_struct_type(prop, "ThemeFontStyle");
RNA_def_property_ui_text(prop, "Widget Font", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
@@ -222,48 +234,91 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna)
prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Outline", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "inner", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "inner_sel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner Selected", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "item", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Item", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "text_sel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text Selected", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shaded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shaded", 1);
RNA_def_property_ui_text(prop, "Shaded", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadetop", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -100, 100);
RNA_def_property_ui_text(prop, "Shade Top", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "shadedown", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, -100, 100);
RNA_def_property_ui_text(prop, "Shade Down", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+}
+
+static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ srna= RNA_def_struct(brna, "ThemeWidgetStateColors", NULL);
+ 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);
+ 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);
+ 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);
+ 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);
+ 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);
+ 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);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Driven Selected", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "blend", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_ui_text(prop, "Blend", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_ui(BlenderRNA *brna)
@@ -272,99 +327,128 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna)
PropertyRNA *prop;
rna_def_userdef_theme_ui_wcol(brna);
+ rna_def_userdef_theme_ui_wcol_state(brna);
srna= RNA_def_struct(brna, "ThemeUserInterface", NULL);
RNA_def_struct_sdna(srna, "ThemeUI");
RNA_def_struct_ui_text(srna, "Theme User Interface", "Theme settings for user interface elements.");
- prop= RNA_def_property(srna, "wcol_regular", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_regular", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_regular");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Regular Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_tool", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_tool", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_tool");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Tool Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_radio", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_radio", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_radio");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Radio Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_text", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_text", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_text");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Text Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_option", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_option", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_option");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Option Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_toggle", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_toggle", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_toggle");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Toggle Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_num", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_num", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_num");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Number Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_numslider", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_numslider", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_numslider");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Slider Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_box", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_box", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_box");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Box Backdrop Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_menu", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_menu", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_menu");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Menu Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_pulldown", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_pulldown", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_pulldown");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Pulldown Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_menu_back", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_menu_back", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_menu_back");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Menu Backdrop Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_menu_item", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_menu_item", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_menu_item");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Menu Item Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wcol_scroll", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "wcol_scroll", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "wcol_scroll");
RNA_def_property_struct_type(prop, "ThemeWidgetColors");
RNA_def_property_ui_text(prop, "Scroll Widget Colors", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "wcol_list_item", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "wcol_list_item");
+ RNA_def_property_struct_type(prop, "ThemeWidgetColors");
+ RNA_def_property_ui_text(prop, "List Item Colors", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "wcol_state", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "wcol_state");
+ RNA_def_property_struct_type(prop, "ThemeWidgetStateColors");
+ RNA_def_property_ui_text(prop, "State Colors", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "icon_file", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "iconfile");
RNA_def_property_ui_text(prop, "Icon File", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
@@ -375,83 +459,83 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
prop= RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Back", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "title", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Title", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "text_hi", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Text Highlight", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
/* header */
prop= RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "header_text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "header_text_hi", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text Highlight", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ 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);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Button Back", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "button_title", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Button Title", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "button_text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Button Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "button_text_hi", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Button Text Highlight", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
/* list/channels */
- if(ELEM4(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE)) {
+ if(ELEM5(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE, SPACE_FILE)) {
prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "List Back", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "list_title", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "List Title", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "list_text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "List Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "list_text_hi", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "List Text Highlight", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
}
@@ -462,17 +546,17 @@ static void rna_def_userdef_theme_spaces_vertex(StructRNA *srna)
prop= RNA_def_property(srna, "vertex", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "vertex_select", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex Select", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "vertex_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, 10);
RNA_def_property_ui_text(prop, "Vertex Size", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_spaces_edge(StructRNA *srna)
@@ -482,22 +566,22 @@ static void rna_def_userdef_theme_spaces_edge(StructRNA *srna)
prop= RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "edge Select", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Seam", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "edge_sharp", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Sharp", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge UV Face Select", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_spaces_face(StructRNA *srna)
@@ -507,22 +591,22 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna)
prop= RNA_def_property(srna, "face", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face Selected", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Face Dot Selected", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "facedot_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, 10);
RNA_def_property_ui_text(prop, "Face Dot Size", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
@@ -541,51 +625,51 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Panel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Lamp", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "object_selected", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "object_active", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "transform", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Transform", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_edge(srna);
@@ -594,28 +678,28 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Normal", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "bone_solid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Solid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "bone_pose", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Pose", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
@@ -627,31 +711,31 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeGraphEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
- RNA_def_struct_ui_text(srna, "Theme Graph Editor", "Theme settings for the Ipo Editor.");
+ RNA_def_struct_ui_text(srna, "Theme Graph Editor", "Theme settings for the graph editor.");
rna_def_userdef_theme_spaces_main(srna, SPACE_IPO);
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "channels_region", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels Region", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
rna_def_userdef_theme_spaces_vertex(srna);
@@ -659,46 +743,46 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex Select", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "handle_vertex_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 255);
RNA_def_property_ui_text(prop, "Handle Vertex Size", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_file(BlenderRNA *brna)
@@ -718,37 +802,37 @@ static void rna_def_userdef_theme_space_file(BlenderRNA *brna)
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "tiles", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "scrollbar", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "scroll_handle", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active_file", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active_file_text", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "grid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active File Text", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_outliner(BlenderRNA *brna)
@@ -764,19 +848,33 @@ static void rna_def_userdef_theme_space_outliner(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_OUTLINER);
}
-static void rna_def_userdef_theme_space_info(BlenderRNA *brna)
+static void rna_def_userdef_theme_space_userpref(BlenderRNA *brna)
{
StructRNA *srna;
- /* space_info */
+ /* space_userpref */
srna= RNA_def_struct(brna, "ThemeUserPreferences", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
RNA_def_struct_ui_text(srna, "Theme User Preferences", "Theme settings for the User Preferences.");
+ rna_def_userdef_theme_spaces_main(srna, SPACE_USERPREF);
+}
+
+static void rna_def_userdef_theme_space_info(BlenderRNA *brna)
+{
+ StructRNA *srna;
+
+ /* space_info */
+
+ srna= RNA_def_struct(brna, "ThemeInfo", NULL);
+ RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_ui_text(srna, "Theme Info", "Theme settings for Info.");
+
rna_def_userdef_theme_spaces_main(srna, SPACE_INFO);
}
+
static void rna_def_userdef_theme_space_text(BlenderRNA *brna)
{
StructRNA *srna;
@@ -794,55 +892,55 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna)
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "scroll_bar", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "syntaxb");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Builtin", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "syntax_comment", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "syntax_string", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "syntax_numbers", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "syntaxn");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Numbers", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
@@ -862,49 +960,49 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "wire_select", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "node_backdrop", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "in_out_node", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "converter_node", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "operator_node", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "group_node", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "syntaxc");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Group Node", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
@@ -923,7 +1021,7 @@ static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
@@ -934,16 +1032,16 @@ static void rna_def_userdef_theme_space_buts(BlenderRNA *brna)
/* space_buts */
- srna= RNA_def_struct(brna, "ThemeButtonsWindow", NULL);
+ srna= RNA_def_struct(brna, "ThemeProperties", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
- RNA_def_struct_ui_text(srna, "Theme Buttons Window", "Theme settings for the Buttons Window.");
+ RNA_def_struct_ui_text(srna, "Theme Properties", "Theme settings for the Properties.");
rna_def_userdef_theme_spaces_main(srna, SPACE_BUTS);
prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
@@ -962,13 +1060,13 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_sound(BlenderRNA *brna)
@@ -987,19 +1085,19 @@ static void rna_def_userdef_theme_space_sound(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
@@ -1020,7 +1118,7 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)
@@ -1037,79 +1135,79 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "movie_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "image_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "scene_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "audio_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "effect_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "plugin_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "transition_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "meta_strip", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "keyframe", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "draw_action", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "bone_pose");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Draw Action", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
@@ -1128,73 +1226,73 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "value_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
@@ -1213,43 +1311,43 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "bars", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "bars_selected", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "current_frame", PROP_FLOAT, PROP_COLOR);
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
@@ -1265,23 +1363,23 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
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, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "selected", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected", "Color used for selected bones.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active", "Color used for active bones.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "colored_constraints", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TH_WIRECOLOR_CONSTCOLS);
RNA_def_property_ui_text(prop, "Colored Constraints", "Allow the use of colors indicating constraints/keyed status.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_themes(BlenderRNA *brna)
@@ -1297,82 +1395,104 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "Name of the theme.");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "user_interface", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "user_interface", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tui");
RNA_def_property_struct_type(prop, "ThemeUserInterface");
RNA_def_property_ui_text(prop, "User Interface", "");
- prop= RNA_def_property(srna, "view_3d", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "view_3d", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tv3d");
RNA_def_property_struct_type(prop, "ThemeView3D");
RNA_def_property_ui_text(prop, "3D View", "");
- prop= RNA_def_property(srna, "graph_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "graph_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tipo");
RNA_def_property_struct_type(prop, "ThemeGraphEditor");
RNA_def_property_ui_text(prop, "Graph Editor", "");
- prop= RNA_def_property(srna, "file_browser", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "file_browser", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tfile");
RNA_def_property_struct_type(prop, "ThemeFileBrowser");
RNA_def_property_ui_text(prop, "File Browser", "");
- prop= RNA_def_property(srna, "nla_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "nla_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tnla");
RNA_def_property_struct_type(prop, "ThemeNLAEditor");
RNA_def_property_ui_text(prop, "NLA Editor", "");
- prop= RNA_def_property(srna, "dopesheet_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "dopesheet_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tact");
RNA_def_property_struct_type(prop, "ThemeDopeSheet");
RNA_def_property_ui_text(prop, "DopeSheet", "");
- prop= RNA_def_property(srna, "image_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "image_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tima");
RNA_def_property_struct_type(prop, "ThemeImageEditor");
RNA_def_property_ui_text(prop, "Image Editor", "");
- prop= RNA_def_property(srna, "sequence_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "sequence_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tseq");
RNA_def_property_struct_type(prop, "ThemeSequenceEditor");
RNA_def_property_ui_text(prop, "Sequence Editor", "");
- prop= RNA_def_property(srna, "buttons_window", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tbuts");
- RNA_def_property_struct_type(prop, "ThemeButtonsWindow");
- RNA_def_property_ui_text(prop, "Buttons Window", "");
+ RNA_def_property_struct_type(prop, "ThemeProperties");
+ RNA_def_property_ui_text(prop, "Properties", "");
- prop= RNA_def_property(srna, "text_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "text_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "text");
RNA_def_property_struct_type(prop, "ThemeTextEditor");
RNA_def_property_ui_text(prop, "Text Editor", "");
- prop= RNA_def_property(srna, "timeline", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "timeline", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "ttime");
RNA_def_property_struct_type(prop, "ThemeTimeline");
RNA_def_property_ui_text(prop, "Timeline", "");
- prop= RNA_def_property(srna, "node_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "node_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tnode");
RNA_def_property_struct_type(prop, "ThemeNodeEditor");
RNA_def_property_ui_text(prop, "Node Editor", "");
- prop= RNA_def_property(srna, "logic_editor", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "logic_editor", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tlogic");
RNA_def_property_struct_type(prop, "ThemeLogicEditor");
RNA_def_property_ui_text(prop, "Logic Editor", "");
- prop= RNA_def_property(srna, "outliner", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "outliner", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "toops");
RNA_def_property_struct_type(prop, "ThemeOutliner");
RNA_def_property_ui_text(prop, "Outliner", "");
- prop= RNA_def_property(srna, "user_preferences", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "info", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "tinfo");
+ RNA_def_property_struct_type(prop, "ThemeInfo");
+ RNA_def_property_ui_text(prop, "Info", "");
+
+ prop= RNA_def_property(srna, "user_preferences", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "tuserpref");
RNA_def_property_struct_type(prop, "ThemeUserPreferences");
RNA_def_property_ui_text(prop, "User Preferences", "");
- prop= RNA_def_property(srna, "bone_color_sets", PROP_COLLECTION, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "bone_color_sets", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_collection_sdna(prop, NULL, "tarm", "");
RNA_def_property_struct_type(prop, "ThemeBoneColorSet");
RNA_def_property_ui_text(prop, "Bone Color Sets", "");
@@ -1397,6 +1517,7 @@ static void rna_def_userdef_dothemes(BlenderRNA *brna)
rna_def_userdef_theme_space_node(brna);
rna_def_userdef_theme_space_outliner(brna);
rna_def_userdef_theme_space_info(brna);
+ rna_def_userdef_theme_space_userpref(brna);
rna_def_userdef_theme_space_sound(brna);
rna_def_userdef_theme_space_logic(brna);
rna_def_userdef_theme_colorset(brna);
@@ -1416,7 +1537,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
RNA_def_property_ui_text(prop, "Enabled", "Enable this OpenGL light in solid draw mode.");
- prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Direction", "The direction that the OpenGL light is shining.");
@@ -1442,6 +1563,16 @@ static void rna_def_userdef_view(BlenderRNA *brna)
{USER_ZOOM_DOLLY, "DOLLY", 0, "Dolly", "Zooms in and out based on vertical mouse movement."},
{USER_ZOOM_SCALE, "SCALE", 0, "Scale", "Zooms in and out like scaling the view, mouse movements relative to center."},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem select_mouse_items[] = {
+ {USER_LMOUSESELECT, "LEFT", 0, "Left", "Use left Mouse Button for selection."},
+ {0, "RIGHT", 0, "Right", "Use Right Mouse Button for selection."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem middle_mouse_mouse_items[] = {
+ {0, "PAN", 0, "Pan", "Use the middle mouse button for panning the viewport."},
+ {USER_VIEWMOVE, "ROTATE", 0, "Rotate", "Use the middle mouse button for rotation the viewport."},
+ {0, NULL, 0, NULL, NULL}};
static EnumPropertyItem view_rotation_items[] = {
{0, "TURNTABLE", 0, "Turntable", "Use turntable style rotation in the viewport."},
@@ -1464,27 +1595,27 @@ static void rna_def_userdef_view(BlenderRNA *brna)
prop= RNA_def_property(srna, "display_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.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "global_scene", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SCENEGLOBAL);
RNA_def_property_ui_text(prop, "Global Scene", "Forces the current Scene to be displayed in all Screens.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "use_large_cursors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "curssize", 0);
RNA_def_property_ui_text(prop, "Large Cursors", "Use large mouse cursors when available.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "show_view_name", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_VIEWPORTNAME);
RNA_def_property_ui_text(prop, "Show View Name", "Show the name of the view's direction in each 3D View.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "show_playback_fps", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_FPS);
RNA_def_property_ui_text(prop, "Show Playback FPS", "Show the frames per second screen refresh rate, while animation is played back.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
/* menus */
prop= RNA_def_property(srna, "open_mouse_over", PROP_BOOLEAN, PROP_NONE);
@@ -1524,27 +1655,14 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "uiflag", USER_MENUFIXEDORDER);
RNA_def_property_ui_text(prop, "Contents Follow Opening Direction", "Otherwise menus, etc will always be top to bottom, left to right, no matter opening direction.");
- /* snap to grid */
- prop= RNA_def_property(srna, "snap_translate", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOGRABGRID);
- RNA_def_property_ui_text(prop, "Enable Translation Snap", "Snap objects and sub-objects to grid units when moving.");
-
- prop= RNA_def_property(srna, "snap_rotate", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOROTGRID);
- RNA_def_property_ui_text(prop, "Enable Rotation Snap", "Snap objects and sub-objects to grid units when rotating.");
-
- prop= RNA_def_property(srna, "snap_scale", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSIZEGRID);
- RNA_def_property_ui_text(prop, "Enable Scaling Snap", "Snap objects and sub-objects to grid units when scaling.");
+ prop= RNA_def_property(srna, "global_pivot", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_LOCKAROUND);
+ RNA_def_property_ui_text(prop, "Global Pivot", "Lock the same rotation/scaling pivot in all 3D Views.");
prop= RNA_def_property(srna, "auto_depth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_ORBIT_ZBUF);
RNA_def_property_ui_text(prop, "Auto Depth", "Use the depth under the mouse to improve view pan/rotate/zoom functionality.");
- prop= RNA_def_property(srna, "global_pivot", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_LOCKAROUND);
- RNA_def_property_ui_text(prop, "Global Pivot", "Lock the same rotation/scaling pivot in all 3D Views.");
-
/* view zoom */
prop= RNA_def_property(srna, "viewport_zoom_style", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "viewzoom");
@@ -1570,15 +1688,11 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Rotate Around Selection", "Use selection as the orbiting center.");
/* select with */
- prop= RNA_def_property(srna, "left_mouse_button_select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_LMOUSESELECT);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_userdef_lmb_select_set");
- RNA_def_property_ui_text(prop, "Left Mouse Button Select", "Use left Mouse Button for selection.");
- prop= RNA_def_property(srna, "right_mouse_button_select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_LMOUSESELECT);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_userdef_rmb_select_set");
- RNA_def_property_ui_text(prop, "Right Mouse Button Select", "Use Right Mouse Button for selection.");
+ prop= RNA_def_property(srna, "select_mouse", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, select_mouse_items);
+ RNA_def_property_ui_text(prop, "Select Mouse", "The mouse button used for selection.");
prop= RNA_def_property(srna, "emulate_3_button_mouse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TWOBUTTONMOUSE);
@@ -1592,25 +1706,26 @@ static void rna_def_userdef_view(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_mini_axis", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_ROTVIEWICON);
RNA_def_property_ui_text(prop, "Show Mini Axis", "Show a small rotating 3D axis in the bottom left corner of the 3D View.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "mini_axis_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rvisize");
RNA_def_property_range(prop, 10, 64);
RNA_def_property_ui_text(prop, "Mini Axis Size", "The axis icon's size.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "mini_axis_brightness", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rvibright");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Mini Axis Brightness", "The brightness of the icon.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
/* middle mouse button */
- prop= RNA_def_property(srna, "middle_mouse_rotate", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_VIEWMOVE);
- RNA_def_property_ui_text(prop, "Middle Mouse Rotate", "Use the middle mouse button for rotation the viewport.");
-
- prop= RNA_def_property(srna, "middle_mouse_pan", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_VIEWMOVE);
- RNA_def_property_ui_text(prop, "Middle Mouse Pan", "Use the middle mouse button for panning the viewport.");
+
+ prop= RNA_def_property(srna, "middle_mouse", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, middle_mouse_mouse_items);
+ RNA_def_property_ui_text(prop, "Middle Mouse", "Use the middle mouse button to pan or zoom the view.");
prop= RNA_def_property(srna, "wheel_invert_zoom", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_WHEELZOOMDIR);
@@ -1635,16 +1750,19 @@ static void rna_def_userdef_view(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_manipulator", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", 1);
RNA_def_property_ui_text(prop, "Manipulator", "Use 3d transform manipulator.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "manipulator_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tw_size");
RNA_def_property_range(prop, 2, 40);
RNA_def_property_ui_text(prop, "Manipulator Size", "Diameter of widget, in 10 pixel units.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "manipulator_handle_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tw_handlesize");
RNA_def_property_range(prop, 2, 40);
RNA_def_property_ui_text(prop, "Manipulator Handle Size", "Size of widget handles as percentage of widget radius.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "manipulator_hotspot", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tw_hotspot");
@@ -1655,6 +1773,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "obcenter_dia");
RNA_def_property_range(prop, 4, 10);
RNA_def_property_ui_text(prop, "Object Center Size", "Diameter in Pixels for Object/Lamp center display.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "ndof_pan_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ndof_pan");
@@ -1673,8 +1792,8 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
StructRNA *srna;
static EnumPropertyItem auto_key_modes[] = {
- {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add/Replace Keys", ""},
- {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace Keys", ""},
+ {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add/Replace", ""},
+ {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem new_interpolation_types[] = {
@@ -1683,28 +1802,38 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
{BEZT_IPO_BEZ, "BEZIER", 0, "Bezier", ""},
{0, NULL, 0, NULL, NULL}};
+ static const EnumPropertyItem material_link_items[]= {
+ {0, "OBDATA", 0, "ObData", "Toggle whether the material is linked to object data or the object block."},
+ {USER_MAT_ON_OB, "OBJECT", 0, "Object", "Toggle whether the material is linked to object data or the object block."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static const EnumPropertyItem object_align_items[]= {
+ {0, "WORLD", 0, "World", "Align newly added objects facing the 3D View direction"},
+ {USER_ADD_VIEWALIGNED, "VIEW", 0, "View", "Align newly added objects to the world coordinates"},
+ {0, NULL, 0, NULL, NULL}};
+
+
srna= RNA_def_struct(brna, "UserPreferencesEdit", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
RNA_def_struct_ui_text(srna, "Edit Methods", "Settings for interacting with Blender data.");
/* Edit Methods */
- prop= RNA_def_property(srna, "material_linked_object", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_MAT_ON_OB);
- RNA_def_property_ui_text(prop, "Material Linked Object", "Toggle whether the material is linked to object data or the object block.");
-
- prop= RNA_def_property(srna, "material_linked_obdata", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_MAT_ON_OB);
- RNA_def_property_ui_text(prop, "Material Linked ObData", "Toggle whether the material is linked to object data or the object block.");
+
+ prop= RNA_def_property(srna, "material_link", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, material_link_items);
+ RNA_def_property_ui_text(prop, "Material Link To", "Toggle whether the material is linked to object data or the object block");
+
+ prop= RNA_def_property(srna, "object_align", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, object_align_items);
+ RNA_def_property_ui_text(prop, "Align Object To", "Align newly added objects facing the 3D View direction or the world coordinates");
prop= RNA_def_property(srna, "enter_edit_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_ADD_EDITMODE);
RNA_def_property_ui_text(prop, "Enter Edit Mode", "Enter Edit Mode automatically after adding a new object.");
- prop= RNA_def_property(srna, "align_to_view", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_ADD_VIEWALIGNED);
- RNA_def_property_ui_text(prop, "Align To View", "Align newly added objects facing the 3D View direction.");
-
prop= RNA_def_property(srna, "drag_immediately", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_DRAGIMMEDIATE);
RNA_def_property_ui_text(prop, "Drag Immediately", "Moving things with a mouse drag doesn't require a click to confirm (Best for tablet users).");
@@ -1723,6 +1852,19 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_GLOBALUNDO);
RNA_def_property_ui_text(prop, "Global Undo", "Global undo works by keeping a full copy of the file itself in memory, so takes extra memory.");
+ /* snap to grid */
+ prop= RNA_def_property(srna, "snap_translate", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOGRABGRID);
+ RNA_def_property_ui_text(prop, "Enable Translation Snap", "Snap objects and sub-objects to grid units when moving.");
+
+ prop= RNA_def_property(srna, "snap_rotate", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOROTGRID);
+ RNA_def_property_ui_text(prop, "Enable Rotation Snap", "Snap objects and sub-objects to grid units when rotating.");
+
+ prop= RNA_def_property(srna, "snap_scale", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSIZEGRID);
+ RNA_def_property_ui_text(prop, "Enable Scaling Snap", "Snap objects and sub-objects to grid units when scaling.");
+
prop= RNA_def_property(srna, "auto_keying_enable", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON);
RNA_def_property_ui_text(prop, "Auto Keying Enable", "Automatic keyframe insertion for Objects and Bones.");
@@ -1763,11 +1905,9 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSMOOTH);
RNA_def_property_ui_text(prop, "Grease Pencil Smooth Stroke", "Smooth the final stroke.");
-#if 0
prop= RNA_def_property(srna, "grease_pencil_simplify_stroke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSIMPLIFY);
RNA_def_property_ui_text(prop, "Grease Pencil Simplify Stroke", "Simplify the final stroke.");
-#endif
prop= RNA_def_property(srna, "grease_pencil_eraser_radius", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gp_eraser");
@@ -1776,55 +1916,130 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "duplicate_mesh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MESH);
- RNA_def_property_ui_text(prop, "Duplicate Mesh", "Causes mesh data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Mesh", "Causes mesh data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_SURF);
- RNA_def_property_ui_text(prop, "Duplicate Surface", "Causes surface data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Surface", "Causes surface data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_curve", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_CURVE);
- RNA_def_property_ui_text(prop, "Duplicate Curve", "Causes curve data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Curve", "Causes curve data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_text", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_FONT);
- RNA_def_property_ui_text(prop, "Duplicate Text", "Causes text data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Text", "Causes text data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_metaball", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MBALL);
- RNA_def_property_ui_text(prop, "Duplicate Metaball", "Causes metaball data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Metaball", "Causes metaball data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_armature", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_ARM);
- RNA_def_property_ui_text(prop, "Duplicate Armature", "Causes armature data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Armature", "Causes armature data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_lamp", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_LAMP);
- RNA_def_property_ui_text(prop, "Duplicate Lamp", "Causes lamp data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Lamp", "Causes lamp data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_material", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_MAT);
- RNA_def_property_ui_text(prop, "Duplicate Material", "Causes material data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Material", "Causes material data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_TEX);
- RNA_def_property_ui_text(prop, "Duplicate Texture", "Causes texture data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Texture", "Causes texture data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_ipo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_IPO);
- RNA_def_property_ui_text(prop, "Duplicate Ipo", "Causes ipo data to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Ipo", "Causes ipo data to be duplicated with the object.");
prop= RNA_def_property(srna, "duplicate_action", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_ACT);
- RNA_def_property_ui_text(prop, "Duplicate Action", "Causes actions to be duplicated with Shift+D.");
+ RNA_def_property_ui_text(prop, "Duplicate Action", "Causes actions to be duplicated with the object.");
+
+ prop= RNA_def_property(srna, "duplicate_particle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "dupflag", USER_DUP_PSYS);
+ RNA_def_property_ui_text(prop, "Duplicate Particle", "Causes particle systems to be duplicated with the object.");
}
-static void rna_def_userdef_language(BlenderRNA *brna)
+static void rna_def_userdef_system(BlenderRNA *brna)
{
PropertyRNA *prop;
StructRNA *srna;
-
- /* hardcoded here, could become dynamic somehow */
+
+ static EnumPropertyItem gl_texture_clamp_items[] = {
+ {0, "GL_CLAMP_OFF", 0, "Off", ""},
+ {8192, "GL_CLAMP_8192", 0, "8192", ""},
+ {4096, "GL_CLAMP_4096", 0, "4096", ""},
+ {2048, "GL_CLAMP_2048", 0, "2048", ""},
+ {1024, "GL_CLAMP_1024", 0, "1024", ""},
+ {512, "GL_CLAMP_512", 0, "512", ""},
+ {256, "GL_CLAMP_256", 0, "256", ""},
+ {128, "GL_CLAMP_128", 0, "128", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem audio_mixing_samples_items[] = {
+ {256, "AUDIO_SAMPLES_256", 0, "256", "Set audio mixing buffer size to 256 samples"},
+ {512, "AUDIO_SAMPLES_512", 0, "512", "Set audio mixing buffer size to 512 samples"},
+ {1024, "AUDIO_SAMPLES_1024", 0, "1024", "Set audio mixing buffer size to 1024 samples"},
+ {2048, "AUDIO_SAMPLES_2048", 0, "2048", "Set audio mixing buffer size to 2048 samples"},
+ {4096, "AUDIO_SAMPLES_4096", 0, "4096", "Set audio mixing buffer size to 4096 samples"},
+ {8192, "AUDIO_SAMPLES_8192", 0, "8192", "Set audio mixing buffer size to 8192 samples"},
+ {16384, "AUDIO_SAMPLES_16384", 0, "16384", "Set audio mixing buffer size to 16384 samples"},
+ {32768, "AUDIO_SAMPLES_32768", 0, "32768", "Set audio mixing buffer size to 32768 samples"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem audio_device_items[] = {
+ {0, "AUDIO_DEVICE_NULL", 0, "No Audio", "Null device - there will be no audio output."},
+#ifdef WITH_SDL
+ {1, "AUDIO_DEVICE_SDL", 0, "SDL", "SDL device - simple direct media layer, recommended for sequencer usage."},
+#endif
+#ifdef WITH_OPENAL
+ {2, "AUDIO_DEVICE_OPENAL", 0, "OpenAL", "OpenAL device - supports 3D audio, recommended for game engine usage."},
+#endif
+#ifdef WITH_JACK
+ {3, "AUDIO_DEVICE_JACK", 0, "Jack", "Jack device - open source pro audio, recommended for pro audio users."},
+#endif
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem audio_rate_items[] = {
+// {8000, "AUDIO_RATE_8000", 0, "8 kHz", "Set audio sampling rate to 8000 samples per second."},
+// {11025, "AUDIO_RATE_11025", 0, "11.025 kHz", "Set audio sampling rate to 11025 samples per second."},
+// {16000, "AUDIO_RATE_16000", 0, "16 kHz", "Set audio sampling rate to 16000 samples per second."},
+// {22050, "AUDIO_RATE_22050", 0, "22.05 kHz", "Set audio sampling rate to 22050 samples per second."},
+// {32000, "AUDIO_RATE_32000", 0, "32 kHz", "Set audio sampling rate to 32000 samples per second."},
+ {44100, "AUDIO_RATE_44100", 0, "44.1 kHz", "Set audio sampling rate to 44100 samples per second."},
+ {48000, "AUDIO_RATE_48000", 0, "48 kHz", "Set audio sampling rate to 48000 samples per second."},
+// {88200, "AUDIO_RATE_88200", 0, "88.2 kHz", "Set audio sampling rate to 88200 samples per second."},
+ {96000, "AUDIO_RATE_96000", 0, "96 kHz", "Set audio sampling rate to 96000 samples per second."},
+ {192000, "AUDIO_RATE_192000", 0, "192 kHz", "Set audio sampling rate to 192000 samples per second."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem audio_format_items[] = {
+ {0x01, "AUDIO_FORMAT_U8", 0, "8-bit Unsigned", "Set audio sample format to 8 bit unsigned integer."},
+ {0x12, "AUDIO_FORMAT_S16", 0, "16-bit Signed", "Set audio sample format to 16 bit signed integer."},
+ {0x13, "AUDIO_FORMAT_S24", 0, "24-bit Signed", "Set audio sample format to 24 bit signed integer."},
+ {0x14, "AUDIO_FORMAT_S32", 0, "32-bit Signed", "Set audio sample format to 32 bit signed integer."},
+ {0x24, "AUDIO_FORMAT_FLOAT", 0, "32-bit Float", "Set audio sample format to 32 bit float."},
+ {0x28, "AUDIO_FORMAT_DOUBLE", 0, "64-bit Float", "Set audio sample format to 64 bit float."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem audio_channel_items[] = {
+ {1, "AUDIO_CHANNELS_MONO", 0, "Mono", "Set audio channels to mono."},
+ {2, "AUDIO_CHANNELS_STEREO", 0, "Stereo", "Set audio channels to stereo."},
+ {4, "AUDIO_CHANNELS_SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels."},
+ {6, "AUDIO_CHANNELS_SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound."},
+ {8, "AUDIO_CHANNELS_SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem draw_method_items[] = {
+ {USER_DRAW_TRIPLE, "TRIPLE_BUFFER", 0, "Triple Buffer", "Use a third buffer for minimal redraws at the cost of more memory."},
+ {USER_DRAW_OVERLAP, "OVERLAP", 0, "Overlap", "Redraw all overlapping regions, minimal memory usage but more redraws."},
+ {USER_DRAW_FULL, "FULL", 0, "Full", "Do a full redraw each time, slow, only use for reference or when all else fails."},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* hardcoded here, could become dynamic somehow */
static EnumPropertyItem language_items[] = {
{0, "ENGLISH", 0, "English", ""},
{1, "JAPANESE", 0, "Japanese", ""},
@@ -1850,119 +2065,56 @@ static void rna_def_userdef_language(BlenderRNA *brna)
{21, "GREEK", 0, "Greek", ""},
{22, "KOREAN", 0, "Korean", ""},
{0, NULL, 0, NULL, NULL}};
-
- srna= RNA_def_struct(brna, "UserPreferencesLanguage", NULL);
+
+ srna= RNA_def_struct(brna, "UserPreferencesSystem", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
- RNA_def_struct_ui_text(srna, "Language & Font", "User interface translation settings.");
+ RNA_def_struct_ui_text(srna, "System & OpenGL", "Graphics driver and operating system settings.");
+
+ /* Language */
prop= RNA_def_property(srna, "international_fonts", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_DOTRANSLATE);
RNA_def_property_ui_text(prop, "International Fonts", "Use international fonts.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "dpi", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "dpi");
RNA_def_property_range(prop, 48, 128);
RNA_def_property_ui_text(prop, "DPI", "Font size and resolution for display.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "scrollback", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "scrollback");
+ RNA_def_property_range(prop, 32, 32768);
+ RNA_def_property_ui_text(prop, "Scrollback", "Maximum number of lines to store for the console buffer.");
/* Language Selection */
prop= RNA_def_property(srna, "language", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, language_items);
RNA_def_property_ui_text(prop, "Language", "Language use for translation.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "translate_tooltips", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_TOOLTIPS);
RNA_def_property_ui_text(prop, "Translate Tooltips", "Translate Tooltips.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "translate_buttons", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_BUTTONS);
RNA_def_property_ui_text(prop, "Translate Buttons", "Translate button labels.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "translate_toolbox", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_TR_MENUS);
RNA_def_property_ui_text(prop, "Translate Toolbox", "Translate toolbox menu.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
prop= RNA_def_property(srna, "use_textured_fonts", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transopts", USER_USETEXTUREFONT);
RNA_def_property_ui_text(prop, "Textured Fonts", "Use textures for drawing international fonts.");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
-}
-
-static void rna_def_userdef_autosave(BlenderRNA *brna)
-{
- PropertyRNA *prop;
- StructRNA *srna;
-
- /* Autosave */
-
- srna= RNA_def_struct(brna, "UserPreferencesAutosave", NULL);
- RNA_def_struct_sdna(srna, "UserDef");
- RNA_def_struct_nested(brna, srna, "UserPreferences");
- RNA_def_struct_ui_text(srna, "Auto Save", "Automatic backup file settings.");
-
- prop= RNA_def_property(srna, "save_version", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "versions");
- RNA_def_property_range(prop, 0, 32);
- RNA_def_property_ui_text(prop, "Save Versions", "The number of old versions to maintain in the current directory, when manually saving.");
-
- prop= RNA_def_property(srna, "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.");
-
- prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "savetime");
- RNA_def_property_range(prop, 1, 60);
- RNA_def_property_ui_text(prop, "Auto Save Time", "The time (in minutes) to wait between automatic temporary saves.");
-
- prop= RNA_def_property(srna, "recent_files", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 0, 30);
- RNA_def_property_ui_text(prop, "Recent Files", "Maximum number of recently opened files to remember.");
-
- prop= RNA_def_property(srna, "save_preview_images", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SAVE_PREVIEWS);
- RNA_def_property_ui_text(prop, "Save Preview Images", "Enables automatic saving of preview images in the .blend file.");
-}
-
-static void rna_def_userdef_system(BlenderRNA *brna)
-{
- PropertyRNA *prop;
- StructRNA *srna;
-
- static EnumPropertyItem gl_texture_clamp_items[] = {
- {0, "GL_CLAMP_OFF", 0, "GL Texture Clamp Off", ""},
- {8192, "GL_CLAMP_8192", 0, "GL Texture Clamp 8192", ""},
- {4096, "GL_CLAMP_4096", 0, "GL Texture Clamp 4096", ""},
- {2048, "GL_CLAMP_2048", 0, "GL Texture Clamp 2048", ""},
- {1024, "GL_CLAMP_1024", 0, "GL Texture Clamp 1024", ""},
- {512, "GL_CLAMP_512", 0, "GL Texture Clamp 512", ""},
- {256, "GL_CLAMP_256", 0, "GL Texture Clamp 256", ""},
- {128, "GL_CLAMP_128", 0, "GL Texture Clamp 128", ""},
- {0, NULL, 0, NULL, NULL}};
-
- static EnumPropertyItem audio_mixing_samples_items[] = {
- {256, "AUDIO_SAMPLES_256", 0, "256", "Set audio mixing buffer size to 256 samples"},
- {512, "AUDIO_SAMPLES_512", 0, "512", "Set audio mixing buffer size to 512 samples"},
- {1024, "AUDIO_SAMPLES_1024", 0, "1024", "Set audio mixing buffer size to 1024 samples"},
- {2048, "AUDIO_SAMPLES_2048", 0, "2048", "Set audio mixing buffer size to 2048 samples"},
- {0, NULL, 0, NULL, NULL}};
-
- static EnumPropertyItem draw_method_items[] = {
- {USER_DRAW_TRIPLE, "TRIPLE_BUFFER", 0, "Triple Buffer", "Use a third buffer for minimal redraws at the cost of more memory."},
- {USER_DRAW_OVERLAP, "OVERLAP", 0, "Overlap", "Redraw all overlapping regions, minimal memory usage but more redraws."},
- {USER_DRAW_FULL, "FULL", 0, "Full", "Do a full redraw each time, slow, only use for reference or when all else fails."},
- {0, NULL, 0, NULL, NULL}};
-
- srna= RNA_def_struct(brna, "UserPreferencesSystem", NULL);
- RNA_def_struct_sdna(srna, "UserDef");
- RNA_def_struct_nested(brna, srna, "UserPreferences");
- RNA_def_struct_ui_text(srna, "System & OpenGL", "Graphics driver and operating system settings.");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
/* System & OpenGL */
@@ -1975,7 +2127,8 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_CUSTOM_RANGE);
RNA_def_property_ui_text(prop, "Use Weight Color Range", "Enable color range used for weight visualization in weight painting mode.");
- prop= RNA_def_property(srna, "weight_color_range", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "weight_color_range", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "coba_weight");
RNA_def_property_struct_type(prop, "ColorRamp");
RNA_def_property_ui_text(prop, "Weight Color Range", "Color range used for weight visualization in weight painting mode.");
@@ -2011,14 +2164,6 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "gameflags", USER_DISABLE_SOUND);
RNA_def_property_ui_text(prop, "Game Sound", "Enables sounds to be played in games.");
- prop= RNA_def_property(srna, "filter_file_extensions", PROP_BOOLEAN, PROP_NONE);
- 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_dot_files_datablocks", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_DOT);
- RNA_def_property_ui_text(prop, "Hide Dot Files/Datablocks", "Hide files/datablocks that start with a dot(.*)");
-
prop= RNA_def_property(srna, "clip_alpha", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "glalphaclip");
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -2052,6 +2197,31 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "mixbufsize");
RNA_def_property_enum_items(prop, audio_mixing_samples_items);
RNA_def_property_ui_text(prop, "Audio Mixing Buffer", "Sets the number of samples used by the audio mixing buffer.");
+ RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
+
+ prop= RNA_def_property(srna, "audio_device", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "audiodevice");
+ RNA_def_property_enum_items(prop, audio_device_items);
+ RNA_def_property_ui_text(prop, "Audio Device", "Sets the audio output device.");
+ RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
+
+ prop= RNA_def_property(srna, "audio_sample_rate", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "audiorate");
+ RNA_def_property_enum_items(prop, audio_rate_items);
+ RNA_def_property_ui_text(prop, "Audio Sample Rate", "Sets the audio sample rate.");
+ RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
+
+ prop= RNA_def_property(srna, "audio_sample_format", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "audioformat");
+ RNA_def_property_enum_items(prop, audio_format_items);
+ RNA_def_property_ui_text(prop, "Audio Sample Format", "Sets the audio sample format.");
+ RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
+
+ prop= RNA_def_property(srna, "audio_channels", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "audiochannels");
+ RNA_def_property_enum_items(prop, audio_channel_items);
+ RNA_def_property_ui_text(prop, "Audio Channels", "Sets the audio channel count.");
+ RNA_def_property_update(prop, 0, "rna_UserDef_audio_update");
#if 0
prop= RNA_def_property(srna, "verse_master", PROP_STRING, PROP_NONE);
@@ -2073,7 +2243,15 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
RNA_def_struct_ui_text(srna, "File Paths", "Default paths for external files.");
-
+
+ prop= RNA_def_property(srna, "hide_dot_files_datablocks", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_DOT);
+ RNA_def_property_ui_text(prop, "Hide Dot Files/Datablocks", "Hide files/datablocks that start with a dot(.*)");
+
+ prop= RNA_def_property(srna, "filter_file_extensions", PROP_BOOLEAN, PROP_NONE);
+ 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, "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.");
@@ -2082,6 +2260,10 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
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.");
+ prop= RNA_def_property(srna, "load_ui", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_FILENOUI);
+ RNA_def_property_ui_text(prop, "Load UI", "Load user interface setup when loading .blend files.");
+
prop= RNA_def_property(srna, "fonts_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "fontdir");
RNA_def_property_ui_text(prop, "Fonts Directory", "The default directory to search for loading fonts.");
@@ -2113,21 +2295,44 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "temporary_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "tempdir");
RNA_def_property_ui_text(prop, "Temporary Directory", "The directory for storing temporary save files.");
+
+ /* Autosave */
+
+ prop= RNA_def_property(srna, "save_version", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "versions");
+ RNA_def_property_range(prop, 0, 32);
+ RNA_def_property_ui_text(prop, "Save Versions", "The number of old versions to maintain in the current directory, when manually saving.");
+
+ prop= RNA_def_property(srna, "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.");
+
+ prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "savetime");
+ RNA_def_property_range(prop, 1, 60);
+ RNA_def_property_ui_text(prop, "Auto Save Time", "The time (in minutes) to wait between automatic temporary saves.");
+
+ prop= RNA_def_property(srna, "recent_files", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_text(prop, "Recent Files", "Maximum number of recently opened files to remember.");
+
+ prop= RNA_def_property(srna, "save_preview_images", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SAVE_PREVIEWS);
+ RNA_def_property_ui_text(prop, "Save Preview Images", "Enables automatic saving of preview images in the .blend file.");
}
+
void RNA_def_userdef(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem user_pref_sections[] = {
- {0, "VIEW_CONTROLS", 0, "View & Controls", ""},
- {1, "EDIT_METHODS", 0, "Edit Methods", ""},
- {2, "LANGUAGE_COLORS", 0, "Language & Colors", ""},
- {3, "AUTO_SAVE", 0, "Auto Save", ""},
- {4, "SYSTEM_OPENGL", 0, "System & OpenGL", ""},
- {5, "FILE_PATHS", 0, "File Paths", ""},
- {6, "THEMES", 0, "Themes", ""},
+ {0, "VIEW_CONTROLS", 0, "View", ""},
+ {1, "EDIT_METHODS", 0, "Editing", ""},
+ {2, "FILE_PATHS", 0, "File", ""},
+ {3, "SYSTEM_OPENGL", 0, "System", ""},
+// {4, "THEMES", 0, "Themes", ""}, // Leave this out until we figure out a way to manage themes in the prefs.
{0, NULL, 0, NULL, NULL}};
rna_def_userdef_dothemes(brna);
@@ -2153,40 +2358,32 @@ void RNA_def_userdef(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Styles", "");
/* nested structs */
- prop= RNA_def_property(srna, "view", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "view", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesView");
RNA_def_property_pointer_funcs(prop, "rna_UserDef_view_get", NULL, NULL);
RNA_def_property_ui_text(prop, "View & Controls", "Preferences related to viewing data.");
- prop= RNA_def_property(srna, "edit", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "edit", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesEdit");
RNA_def_property_pointer_funcs(prop, "rna_UserDef_edit_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Edit Methods", "Settings for interacting with Blender data.");
- prop= RNA_def_property(srna, "autosave", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_struct_type(prop, "UserPreferencesAutosave");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_autosave_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Auto Save", "Automatic backup file settings.");
-
- prop= RNA_def_property(srna, "language", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_struct_type(prop, "UserPreferencesLanguage");
- RNA_def_property_pointer_funcs(prop, "rna_UserDef_language_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Language & Font", "User interface translation settings.");
-
- prop= RNA_def_property(srna, "filepaths", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "filepaths", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesFilePaths");
RNA_def_property_pointer_funcs(prop, "rna_UserDef_filepaths_get", NULL, NULL);
RNA_def_property_ui_text(prop, "File Paths", "Default paths for external files.");
- prop= RNA_def_property(srna, "system", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "system", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "UserPreferencesSystem");
RNA_def_property_pointer_funcs(prop, "rna_UserDef_system_get", NULL, NULL);
RNA_def_property_ui_text(prop, "System & OpenGL", "Graphics driver and operating system settings.");
rna_def_userdef_view(brna);
rna_def_userdef_edit(brna);
- rna_def_userdef_autosave(brna);
- rna_def_userdef_language(brna);
rna_def_userdef_filepaths(brna);
rna_def_userdef_system(brna);
diff --git a/source/blender/makesrna/intern/rna_vpaint.c b/source/blender/makesrna/intern/rna_vpaint.c
deleted file mode 100644
index a34099dffb7..00000000000
--- a/source/blender/makesrna/intern/rna_vpaint.c
+++ /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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Contributor(s): Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <stdlib.h>
-
-#include "RNA_define.h"
-#include "RNA_types.h"
-
-#include "rna_internal.h"
-
-#include "DNA_scene_types.h"
-
-#ifdef RNA_RUNTIME
-
-#else
-
-void RNA_def_vpaint(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
- static EnumPropertyItem prop_mode_items[] = {
- {0, "MIX", 0, "Mix", "Use mix blending mode while painting."},
- {1, "ADD", 0, "Add", "Use add blending mode while painting."},
- {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting."},
- {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting."},
- {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"},
- {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."},
- {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting."},
- {0, NULL, 0, NULL, NULL}};
-
- srna= RNA_def_struct(brna, "VPaint", NULL);
- RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of the Vpaint tool.");
-
- prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_mode_items);
- RNA_def_property_ui_text(prop, "Brush Mode", "The Mode in which color is painted.");
-
- prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA);
- RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush.");
-
- prop= RNA_def_property(srna, "vertex_dist", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SOFT);
- RNA_def_property_ui_text(prop, "Vertex Dist", "Use distances to vertices (instead of paint entire faces).");
-
- prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS);
- RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting.");
-
- prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY);
- RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse.");
-
- prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.1f, 5.0f);
- RNA_def_property_ui_text(prop, "Gamma", "Vpaint Gamma.");
-
- prop= RNA_def_property(srna, "mul", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.1f, 50.0f);
- RNA_def_property_ui_text(prop, "Mul", "Vpaint Mul.");
-
-}
-
-#endif
-
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 1bfc3b6f8f6..0dd9e3aed42 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -40,8 +40,30 @@ EnumPropertyItem event_value_items[] = {
{KM_RELEASE, "RELEASE", 0, "Release", ""},
{0, NULL, 0, NULL, NULL}};
-/* not returned: CAPSLOCKKEY, UNKNOWNKEY, COMMANDKEY, GRLESSKEY */
+/* not returned: CAPSLOCKKEY, UNKNOWNKEY, GRLESSKEY */
EnumPropertyItem event_type_items[] = {
+
+ {LEFTMOUSE, "LEFTMOUSE", 0, "Left Mouse", ""},
+ {MIDDLEMOUSE, "MIDDLEMOUSE", 0, "Middle Mouse", ""},
+ {RIGHTMOUSE, "RIGHTMOUSE", 0, "Right Mouse", ""},
+ {BUTTON4MOUSE, "BUTTON4MOUSE", 0, "Button4 Mouse", ""},
+ {BUTTON5MOUSE, "BUTTON5MOUSE", 0, "Button5 Mouse", ""},
+ {ACTIONMOUSE, "ACTIONMOUSE", 0, "Action Mouse", ""},
+ {SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""},
+
+ {MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""},
+
+ {WHEELUPMOUSE, "WHEELUPMOUSE", 0, "Wheel Up", ""},
+ {WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, "Wheel Down", ""},
+ {WHEELINMOUSE, "WHEELINMOUSE", 0, "Wheel In", ""},
+ {WHEELOUTMOUSE, "WHEELOUTMOUSE", 0, "Wheel Out", ""},
+
+ {EVT_TWEAK_L, "EVT_TWEAK_L", 0, "Tweak Left", ""},
+ {EVT_TWEAK_M, "EVT_TWEAK_M", 0, "Tweak Middle", ""},
+ {EVT_TWEAK_R, "EVT_TWEAK_R", 0, "Tweak Right", ""},
+ {EVT_TWEAK_A, "EVT_TWEAK_A", 0, "Tweak Action", ""},
+ {EVT_TWEAK_S, "EVT_TWEAK_S", 0, "Tweak Select", ""},
+
{AKEY, "A", 0, "A", ""},
{BKEY, "B", 0, "B", ""},
{CKEY, "C", 0, "C", ""},
@@ -69,23 +91,25 @@ EnumPropertyItem event_type_items[] = {
{YKEY, "Y", 0, "Y", ""},
{ZKEY, "Z", 0, "Z", ""},
- {ZEROKEY, "ZERO", 0, "Zero Key", ""},
- {ONEKEY, "ONE", 0, "One Key", ""},
- {TWOKEY, "TWO", 0, "Two Key", ""},
- {THREEKEY, "THREE", 0, "Three Key", ""},
- {FOURKEY, "FOUR", 0, "Four Key", ""},
- {FIVEKEY, "FIVE", 0, "Five Key", ""},
- {SIXKEY, "SIX", 0, "Six Key", ""},
- {SEVENKEY, "SEVEN", 0, "Seven Key", ""},
- {EIGHTKEY, "EIGHT", 0, "Eight Key", ""},
- {NINEKEY, "NINE", 0, "Nine Key", ""},
+ {ZEROKEY, "ZERO", 0, "0", ""},
+ {ONEKEY, "ONE", 0, "1", ""},
+ {TWOKEY, "TWO", 0, "2", ""},
+ {THREEKEY, "THREE", 0, "3", ""},
+ {FOURKEY, "FOUR", 0, "4", ""},
+ {FIVEKEY, "FIVE", 0, "5", ""},
+ {SIXKEY, "SIX", 0, "6", ""},
+ {SEVENKEY, "SEVEN", 0, "7", ""},
+ {EIGHTKEY, "EIGHT", 0, "8", ""},
+ {NINEKEY, "NINE", 0, "9", ""},
{LEFTCTRLKEY, "LEFT_CTRL", 0, "Left Ctrl", ""},
{LEFTALTKEY, "LEFT_ALT", 0, "Left Alt", ""},
+ {LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Left Shift", ""},
{RIGHTALTKEY, "RIGHT_ALT", 0, "Right Alt", ""},
- {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Rightctrl", ""},
- {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Rightshift", ""},
- {LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Leftshift", ""},
+ {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", ""},
+ {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", ""},
+
+ {COMMANDKEY, "COMMAND", 0, "Command", ""},
{ESCKEY, "ESC", 0, "Esc", ""},
{TABKEY, "TAB", 0, "Tab", ""},
@@ -94,17 +118,17 @@ EnumPropertyItem event_type_items[] = {
{LINEFEEDKEY, "LINE_FEED", 0, "Line Feed", ""},
{BACKSPACEKEY, "BACK_SPACE", 0, "Back Space", ""},
{DELKEY, "DEL", 0, "Delete", ""},
- {SEMICOLONKEY, "SEMI_COLON", 0, "Semicolon", ""},
- {PERIODKEY, "PERIOD", 0, "Period", ""},
- {COMMAKEY, "COMMA", 0, "Comma", ""},
- {QUOTEKEY, "QUOTE", 0, "Quote", ""},
- {ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "Accentgrave", ""},
- {MINUSKEY, "MINUS", 0, "Minus", ""},
- {SLASHKEY, "SLASH", 0, "Slash", ""},
- {BACKSLASHKEY, "BACK_SLASH", 0, "Backslash", ""},
- {EQUALKEY, "EQUAL", 0, "Equal", ""},
- {LEFTBRACKETKEY, "LEFT_BRACKET", 0, "Leftbracket", ""},
- {RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "Rightbracket", ""},
+ {SEMICOLONKEY, "SEMI_COLON", 0, ";", ""},
+ {PERIODKEY, "PERIOD", 0, ".", ""},
+ {COMMAKEY, "COMMA", 0, ",", ""},
+ {QUOTEKEY, "QUOTE", 0, "\"", ""},
+ {ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "`", ""},
+ {MINUSKEY, "MINUS", 0, "-", ""},
+ {SLASHKEY, "SLASH", 0, "/", ""},
+ {BACKSLASHKEY, "BACK_SLASH", 0, "\\", ""},
+ {EQUALKEY, "EQUAL", 0, "=", ""},
+ {LEFTBRACKETKEY, "LEFT_BRACKET", 0, "]", ""},
+ {RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "[", ""},
{LEFTARROWKEY, "LEFT_ARROW", 0, "Left Arrow", ""},
{DOWNARROWKEY, "DOWN_ARROW", 0, "Down Arrow", ""},
{RIGHTARROWKEY, "RIGHT_ARROW", 0, "Right Arrow", ""},
@@ -147,6 +171,8 @@ EnumPropertyItem event_type_items[] = {
#ifdef RNA_RUNTIME
+#include "WM_api.h"
+
#include "BKE_idprop.h"
static wmOperator *rna_OperatorProperties_find_operator(PointerRNA *ptr)
@@ -173,7 +199,7 @@ static StructRNA *rna_OperatorProperties_refine(PointerRNA *ptr)
return ptr->type;
}
-IDProperty *rna_OperatorProperties_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_OperatorProperties_idproperties(PointerRNA *ptr, int create)
{
if(create && !ptr->data) {
IDPropertyTemplate val = {0};
@@ -215,6 +241,28 @@ static int rna_Event_ascii_length(PointerRNA *ptr)
return (event->ascii)? 1 : 0;
}
+static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value)
+{
+ wmWindow *win= (wmWindow*)ptr->data;
+
+ if(value.data == NULL)
+ return;
+
+ /* exception: can't set screens inside of area/region handers */
+ win->newscreen= value.data;
+}
+
+static void rna_Window_screen_update(bContext *C, PointerRNA *ptr)
+{
+ wmWindow *win= (wmWindow*)ptr->data;
+
+ /* exception: can't set screens inside of area/region handers */
+ if(win->newscreen) {
+ WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, win->newscreen);
+ win->newscreen= NULL;
+ }
+}
+
#else
static void rna_def_operator(BlenderRNA *brna)
@@ -232,7 +280,8 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "properties", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "OperatorProperties");
RNA_def_property_ui_text(prop, "Properties", "");
RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL);
@@ -251,7 +300,7 @@ static void rna_def_operator_utils(BlenderRNA *brna)
srna= RNA_def_struct(brna, "OperatorMousePath", "IDPropertyGroup");
RNA_def_struct_ui_text(srna, "Operator Mouse Path", "Mouse path values for operators that record such paths.");
- prop= RNA_def_property(srna, "loc", PROP_FLOAT, PROP_VECTOR);
+ prop= RNA_def_property(srna, "loc", PROP_FLOAT, PROP_XYZ);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Location", "Mouse location.");
@@ -331,22 +380,40 @@ static void rna_def_event(BlenderRNA *brna)
prop= RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shift", 1);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Shift", "True when the shift key is held.");
+ RNA_def_property_ui_text(prop, "Shift", "True when the Shift key is held.");
prop= RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ctrl", 1);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Ctrl", "True when the shift key is held.");
+ RNA_def_property_ui_text(prop, "Ctrl", "True when the Ctrl key is held.");
prop= RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "alt", 1);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Alt", "True when the shift key is held.");
+ RNA_def_property_ui_text(prop, "Alt", "True when the Alt/Option key is held.");
prop= RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "oskey", 1);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "OS Key", "True when the shift key is held.");
+ RNA_def_property_ui_text(prop, "OS Key", "True when the Cmd key is held.");
+}
+
+static void rna_def_window(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "Window", NULL);
+ RNA_def_struct_ui_text(srna, "Window", "Open window.");
+ RNA_def_struct_sdna(srna, "wmWindow");
+
+ prop= RNA_def_property(srna, "screen", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_struct_type(prop, "Screen");
+ RNA_def_property_ui_text(prop, "Screen", "Active screen showing in the window.");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Window_screen_set", NULL);
+ RNA_def_property_update(prop, 0, "rna_Window_screen_update");
}
static void rna_def_windowmanager(BlenderRNA *brna)
@@ -356,12 +423,17 @@ static void rna_def_windowmanager(BlenderRNA *brna)
srna= RNA_def_struct(brna, "WindowManager", "ID");
RNA_def_struct_ui_text(srna, "Window Manager", "Window manager datablock defining open windows and other user interface data.");
+ RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
RNA_def_struct_sdna(srna, "wmWindowManager");
prop= RNA_def_property(srna, "operators", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Operator");
RNA_def_property_ui_text(prop, "Operators", "Operator registry.");
+ prop= RNA_def_property(srna, "windows", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Window");
+ RNA_def_property_ui_text(prop, "Windows", "Open windows.");
+
RNA_api_wm(srna);
}
@@ -371,6 +443,7 @@ void RNA_def_wm(BlenderRNA *brna)
rna_def_operator_utils(brna);
rna_def_operator_filelist_element(brna);
rna_def_event(brna);
+ rna_def_window(brna);
rna_def_windowmanager(brna);
}
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index f5eb81e3cea..c6068d0a650 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -38,6 +38,10 @@
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "BKE_texture.h"
+
static PointerRNA rna_World_ambient_occlusion_get(PointerRNA *ptr)
{
return rna_pointer_inherit_refine(ptr, &RNA_WorldAmbientOcclusion, ptr->id.data);
@@ -56,14 +60,39 @@ static PointerRNA rna_World_mist_get(PointerRNA *ptr)
static void rna_World_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
World *wo= (World*)ptr->data;
- rna_iterator_array_begin(iter, (void*)wo->mtex, sizeof(MTex*), MAX_MTEX, NULL);
+ rna_iterator_array_begin(iter, (void*)wo->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
}
static PointerRNA rna_World_active_texture_get(PointerRNA *ptr)
{
World *wo= (World*)ptr->data;
+ Tex *tex;
- return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, wo->mtex[(int)wo->texact]);
+ tex= (wo->mtex[(int)wo->texact])? wo->mtex[(int)wo->texact]->tex: NULL;
+ return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
+}
+
+static void rna_World_active_texture_set(PointerRNA *ptr, PointerRNA value)
+{
+ World *wo= (World*)ptr->data;
+ int act= wo->texact;
+
+ if(wo->mtex[act] && wo->mtex[act]->tex)
+ id_us_min(&wo->mtex[act]->tex->id);
+
+ if(value.data) {
+ if(!wo->mtex[act]) {
+ wo->mtex[act]= add_mtex();
+ wo->mtex[act]->texco= TEXCO_VIEW;
+ }
+
+ wo->mtex[act]->tex= value.data;
+ id_us_plus(&wo->mtex[act]->tex->id);
+ }
+ else if(wo->mtex[act]) {
+ MEM_freeN(wo->mtex[act]);
+ wo->mtex[act]= NULL;
+ }
}
#else
@@ -87,37 +116,67 @@ static void rna_def_world_mtex(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "World Texture Slot", "Texture slot for textures in a World datablock.");
/* map to */
- prop= RNA_def_property(srna, "map_to_blend", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_BLEND);
- RNA_def_property_ui_text(prop, "Map To Blend", "Affect the color progression of the background.");
+ RNA_def_property_ui_text(prop, "Blend", "Affect the color progression of the background.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_to_horizon", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_HORIZ);
- RNA_def_property_ui_text(prop, "Map To Horizon", "Affect the color of the horizon.");
+ RNA_def_property_ui_text(prop, "Horizon", "Affect the color of the horizon.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_to_zenith_up", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_zenith_up", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENUP);
- RNA_def_property_ui_text(prop, "Map To Zenith Up", "Affect the color of the zenith above.");
+ RNA_def_property_ui_text(prop, "Zenith Up", "Affect the color of the zenith above.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
- prop= RNA_def_property(srna, "map_to_zenith_down", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_zenith_down", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENDOWN);
- RNA_def_property_ui_text(prop, "Map To Zenith Down", "Affect the color of the zenith below.");
+ RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* unused
- prop= RNA_def_property(srna, "map_to_mist", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "map_mist", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_MIST);
- RNA_def_property_ui_text(prop, "Map To Mist", "Causes the texture to affect the intensity of the mist.");*/
+ RNA_def_property_ui_text(prop, "Mist", "Causes the texture to affect the intensity of the mist.");*/
prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, texco_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "object");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "varfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Blend Factor", "Amount texture affects color progression of the background.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "horizon_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Horizon Factor", "Amount texture affects color of the horizon.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "zenith_up_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Zenith Up Factor", "Amount texture affects color of the zenith above.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
+
+ prop= RNA_def_property(srna, "zenith_down_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "colfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Zenith Down Factor", "Amount texture affects color of the zenith below.");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
}
static void rna_def_ambient_occlusion(BlenderRNA *brna)
@@ -157,11 +216,11 @@ static void rna_def_ambient_occlusion(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_AMB_OCC);
RNA_def_property_ui_text(prop, "Enabled", "Use Ambient Occlusion to add light based on distance between elements, creating the illusion of omnipresent light");
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "aodist");
RNA_def_property_ui_text(prop, "Distance", "Length of rays, defines how far away other faces give occlusion effect.");
- prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
+ 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.");
@@ -260,19 +319,21 @@ static void rna_def_world_mist(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Intensity", "Intensity of the mist effect.");
- prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "miststa");
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, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_NONE);
+ 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, NC_OBJECT|ND_DRAW, NULL);
- prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "misthi");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Height", "Control how much mist density decreases with height");
@@ -304,7 +365,7 @@ static void rna_def_world_stars(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars.");
RNA_def_property_update(prop, NC_WORLD, NULL);
- prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "min_distance", 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.");
@@ -334,6 +395,7 @@ void RNA_def_world(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+/*
static EnumPropertyItem physics_engine_items[] = {
{WOPHY_NONE, "NONE", 0, "None", ""},
//{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
@@ -342,13 +404,15 @@ void RNA_def_world(BlenderRNA *brna)
//{WOPHY_ODE, "ODE", 0, "ODE", ""},
{WOPHY_BULLET, "BULLET", 0, "Bullet", ""},
{0, NULL, 0, NULL, NULL}};
+*/
srna= RNA_def_struct(brna, "World", "ID");
RNA_def_struct_ui_text(srna, "World", "World datablock describing the environment and ambient lighting of a scene.");
RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA);
rna_def_animdata_common(srna);
- rna_def_mtex_common(srna, "rna_World_mtex_begin", "rna_World_active_texture_get", "WorldTextureSlot");
+ rna_def_mtex_common(srna, "rna_World_mtex_begin", "rna_World_active_texture_get",
+ "rna_World_active_texture_set", "WorldTextureSlot");
/* colors */
prop= RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR);
@@ -367,6 +431,7 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "ambr");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Ambient Color", "");
+ RNA_def_property_update(prop, NC_WORLD, NULL);
/* exp, range */
prop= RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
@@ -377,7 +442,7 @@ void RNA_def_world(BlenderRNA *brna)
prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "range");
RNA_def_property_range(prop, 0.2, 5.0);
- RNA_def_property_ui_text(prop, "Range", "The color rage that will be mapped to 0-1");
+ RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1.");
/* sky type */
prop= RNA_def_property(srna, "blend_sky", PROP_BOOLEAN, PROP_NONE);
@@ -395,37 +460,25 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle.");
RNA_def_property_update(prop, NC_WORLD, NULL);
- /* physics */
- prop= RNA_def_property(srna, "physics_engine", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "physicsEngine");
- RNA_def_property_enum_items(prop, physics_engine_items);
- RNA_def_property_ui_text(prop, "Physics Engine", "Physics engine used for physics simulation in the game engine.");
-
- prop= RNA_def_property(srna, "physics_gravity", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "gravity");
- RNA_def_property_range(prop, 0.0, 25.0);
- RNA_def_property_ui_text(prop, "Physics Gravity", "Gravitational constant used for physics simulation in the game engine.");
-
/* nested structs */
- prop= RNA_def_property(srna, "ambient_occlusion", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "ambient_occlusion", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldAmbientOcclusion");
RNA_def_property_pointer_funcs(prop, "rna_World_ambient_occlusion_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Ambient Occlusion", "World ambient occlusion settings.");
- prop= RNA_def_property(srna, "mist", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "mist", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldMistSettings");
RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Mist", "World mist settings.");
- prop= RNA_def_property(srna, "stars", PROP_POINTER, PROP_NEVER_NULL);
+ prop= RNA_def_property(srna, "stars", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_struct_type(prop, "WorldStarsSettings");
RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Stars", "World stars settings.");
- prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "scriptlink");
- RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this object.");
-
rna_def_ambient_occlusion(brna);
rna_def_world_mist(brna);
rna_def_world_stars(brna);
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h
index 020bbdebfa2..041bf1c8361 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/CMP_node.h
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -49,6 +49,7 @@ 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;
extern bNodeType cmp_node_curve_rgb;
extern bNodeType cmp_node_mix_rgb;
@@ -88,7 +89,9 @@ extern bNodeType cmp_node_combycca;
extern bNodeType cmp_node_premulkey;
extern bNodeType cmp_node_diff_matte;
-extern bNodeType cmp_node_chroma;
+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;
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index a4d5b0f0ed2..df2567142ca 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -26,33 +26,32 @@
FILE(GLOB SRC intern/*.c intern/CMP_nodes/*.c intern/SHD_nodes/*.c intern/TEX_nodes/*.c)
SET(INC
- . ../../../intern/guardedalloc ../editors/include ../blenlib ../makesdna
- ../render/extern/include ../../../intern/decimation/extern
- ../imbuf ../avi ../../../intern/elbeem/extern
- ../../../intern/iksolver/extern ../blenloader ../quicktime
- ../blenkernel ../../../extern/glew/include ../gpu
- ${SDL_INC}
- ${ZLIB_INC}
+ . ../../../intern/guardedalloc ../editors/include ../blenlib ../makesdna
+ ../render/extern/include ../../../intern/decimation/extern ../makesrna
+ ../imbuf ../avi ../../../intern/elbeem/extern
+ ../../../intern/iksolver/extern ../blenloader
+ ../blenkernel ../../../extern/glew/include ../gpu
+ ${ZLIB_INC}
)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
+ SET(INC ${INC} ../python ${PYTHON_INC})
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
BLENDERLIB(bf_nodes "${SRC}" "${INC}")
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 164e30c7d05..771ce42e1dc 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -8,7 +8,7 @@ texsources = env.Glob('intern/TEX_nodes/*.c')
incs = '. ./intern '
incs += '#/intern/guardedalloc ../editors/include ../blenlib ../makesdna'
-incs += ' ../render/extern/include '
+incs += ' ../render/extern/include ../makesrna '
incs += ' ../imbuf ../avi '
incs += ' ../blenloader'
incs += ' ../blenkernel ../renderconverter '
@@ -38,7 +38,7 @@ if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
incs += ' ' + env['BF_QUICKTIME_INC']
-env.BlenderLib ( libname = 'bf_nodes', sources = sources, includes = Split(incs), defines = defs, libtype=['core'], priority = [190] )
-env.BlenderLib ( libname = 'bf_cmpnodes', sources = cmpsources, includes = Split(incs), defines = defs, libtype=['core'], priority = [175] )
-env.BlenderLib ( libname = 'bf_shdnodes', sources = shdsources, includes = Split(incs), defines = defs, libtype=['core'], priority = [175] )
-env.BlenderLib ( libname = 'bf_texnodes', sources = texsources, includes = Split(incs), defines = defs, libtype=['core'], priority = [175] )
+env.BlenderLib ( libname = 'bf_nodes', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [190,105] )
+env.BlenderLib ( libname = 'bf_cmpnodes', sources = cmpsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] )
+env.BlenderLib ( libname = 'bf_shdnodes', sources = shdsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] )
+env.BlenderLib ( libname = 'bf_texnodes', sources = texsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] )
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
index d0cc4e5b88d..b0a2531ac1f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -180,7 +180,7 @@ static void node_composit_init_channel_matte(bNode *node)
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
- c->t1= 0.0f;
+ c->t1= 1.0f;
c->t2= 0.0f;
c->t3= 0.0f;
c->fsize= 0.0f;
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index 6a40018e659..28b81fe9f47 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -172,9 +172,9 @@ static void node_composit_init_chroma_matte(bNode *node)
c->fstrength= 1.0f;
};
-bNodeType cmp_node_chroma={
+bNodeType cmp_node_chroma_matte={
/* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CHROMA,
+ /* type code */ CMP_NODE_CHROMA_MATTE,
/* name */ "Chroma Key",
/* width+range */ 200, 80, 300,
/* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
new file mode 100644
index 00000000000..470d04d9dcc
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
@@ -0,0 +1,132 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Bob Holcomb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+/* ******************* Color Key ********************************************************** */
+static bNodeSocketType cmp_node_color_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {-1,0,""}
+};
+
+static bNodeSocketType cmp_node_color_out[]={
+ {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ {-1,0,""}
+};
+
+static void do_color_key(bNode *node, float *out, float *in)
+{
+ NodeChroma *c;
+ c=node->storage;
+
+
+ VECCOPY(out, in);
+
+ if(fabs(in[0]-c->key[0]) < c->t1 &&
+ fabs(in[1]-c->key[1]) < c->t2 &&
+ fabs(in[2]-c->key[2]) < c->t3)
+ {
+ out[3]=0.0; /*make transparent*/
+ }
+
+ else { /*pixel is outside key color */
+ out[3]=in[3]; /* make pixel just as transparent as it was before */
+ }
+}
+
+static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ CompBuf *cbuf;
+ CompBuf *colorbuf;
+ NodeChroma *c;
+
+ if(in[0]->hasinput==0) return;
+ if(in[0]->data==NULL) return;
+ if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return;
+
+ cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
+
+ colorbuf= dupalloc_compbuf(cbuf);
+
+ c=node->storage;
+
+ /*convert rgbbuf to hsv*/
+ composit1_pixel_processor(node, colorbuf, cbuf, in[0]->vec, do_rgba_to_hsva, CB_RGBA);
+
+ /*convert key to hsv*/
+ do_rgba_to_hsva(node, c->key, in[1]->vec);
+
+
+ /*per pixel color key*/
+ composit1_pixel_processor(node, colorbuf, colorbuf, in[0]->vec, do_color_key, CB_RGBA);
+
+ /*convert back*/
+ composit1_pixel_processor(node, colorbuf, colorbuf, in[0]->vec, do_hsva_to_rgba, CB_RGBA);
+
+ out[0]->data= colorbuf;
+ if(out[1]->hasoutput)
+ out[1]->data= valbuf_from_rgbabuf(colorbuf, CHAN_A);
+
+ generate_preview(node, colorbuf);
+
+ if(cbuf!=in[0]->data)
+ free_compbuf(cbuf);
+};
+
+static void node_composit_init_color_matte(bNode *node)
+{
+ NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color");
+ node->storage= c;
+ c->t1= 0.01f;
+ c->t2= 0.1f;
+ c->t3= 0.1f;
+ c->fsize= 0.0f;
+ 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
+};
+
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
index ade2111f246..68a1bcd5471 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -31,8 +31,8 @@
/* ******************* channel Difference Matte ********************************* */
static bNodeSocketType cmp_node_diff_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{-1,0,""}
};
@@ -44,157 +44,85 @@ static bNodeSocketType cmp_node_diff_matte_out[]={
/* note, keyvals is passed on from caller as stack array */
/* might have been nicer as temp struct though... */
-static void do_diff_matte(bNode *node, float *colorbuf, float *inbuf, float *keyvals)
+static void do_diff_matte(bNode *node, float *colorbuf, float *imbuf1, float *imbuf2)
{
NodeChroma *c= (NodeChroma *)node->storage;
- float *keymin= keyvals;
- float *keymax= keyvals+3;
- float *key= keyvals+6;
- float tolerance= keyvals[9];
- float distance, alpha;
+ float tolerence=c->t1;
+ float falloff=c->t2;
+ float difference;
+ float alpha;
- /*process the pixel if it is close to the key or already transparent*/
- if(((colorbuf[0]>keymin[0] && colorbuf[0]<keymax[0]) &&
- (colorbuf[1]>keymin[1] && colorbuf[1]<keymax[1]) &&
- (colorbuf[2]>keymin[2] && colorbuf[2]<keymax[2])) || inbuf[3]<1.0f) {
-
- /*true distance from key*/
- distance= sqrt((colorbuf[0]-key[0])*(colorbuf[0]-key[0])+
- (colorbuf[1]-key[1])*(colorbuf[1]-key[1])+
- (colorbuf[2]-key[2])*(colorbuf[2]-key[2]));
-
- /*is it less transparent than the prevous pixel*/
- alpha= distance/tolerance;
- if(alpha > inbuf[3]) alpha= inbuf[3];
- if(alpha > c->fstrength) alpha= 0.0f;
-
- /*clamp*/
- if (alpha>1.0f) alpha=1.0f;
- if (alpha<0.0f) alpha=0.0f;
-
- /*premultiplied picture*/
- colorbuf[3]= alpha;
+ difference=fabs(imbuf2[0]-imbuf1[0])+
+ fabs(imbuf2[1]-imbuf1[1])+
+ fabs(imbuf2[2]-imbuf1[2]);
+
+ /*average together the distances*/
+ difference=difference/3.0;
+
+ VECCOPY(colorbuf, imbuf1);
+
+ /*make 100% transparent*/
+ if(difference < tolerence){
+ colorbuf[3]=0.0;
}
+ /*in the falloff region, make partially transparent */
+ else if(difference < falloff+tolerence){
+ difference=difference-tolerence;
+ alpha=difference/falloff;
+ /*only change if more transparent than before */
+ if(alpha < imbuf1[3]) {
+ colorbuf[3]=alpha;
+ }
+ else { /* leave as before */
+ colorbuf[3]=imbuf1[3];
+ }
+ }
else {
/*foreground object*/
- colorbuf[3]= inbuf[3];
+ colorbuf[3]= imbuf1[3];
}
}
static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
- /*
- Losely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and
- uses a differnt difference function (suggested in forums of vfxtalk.com).
- */
- CompBuf *workbuf;
- CompBuf *inbuf;
+ CompBuf *outbuf;
+ CompBuf *imbuf1;
+ CompBuf *imbuf2;
NodeChroma *c;
- float keyvals[10];
- float *keymin= keyvals;
- float *keymax= keyvals+3;
- float *key= keyvals+6;
- float *tolerance= keyvals+9;
- float t[3];
/*is anything connected?*/
if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return;
/*must have an image imput*/
if(in[0]->data==NULL) return;
+ if(in[1]->data==NULL) return;
- inbuf=typecheck_compbuf(in[0]->data, CB_RGBA);
+ imbuf1=typecheck_compbuf(in[0]->data, CB_RGBA);
+ imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA);
c=node->storage;
- workbuf=dupalloc_compbuf(inbuf);
-
- /*use the input color*/
- key[0]= in[1]->vec[0];
- key[1]= in[1]->vec[1];
- key[2]= in[1]->vec[2];
-
- /*get the tolerances from the UI*/
- t[0]=c->t1;
- t[1]=c->t2;
- t[2]=c->t3;
-
- /*convert to colorspace*/
- switch(node->custom1) {
- case 1: /*RGB*/
- break;
- case 2: /*HSV*/
- /*convert the key (in place)*/
- rgb_to_hsv(key[0], key[1], key[2], &key[0], &key[1], &key[2]);
- composit1_pixel_processor(node, workbuf, inbuf, in[1]->vec, do_rgba_to_hsva, CB_RGBA);
- break;
- case 3: /*YUV*/
- rgb_to_yuv(key[0], key[1], key[2], &key[0], &key[1], &key[2]);
- composit1_pixel_processor(node, workbuf, inbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA);
- break;
- case 4: /*YCC*/
- rgb_to_ycc(key[0], key[1], key[2], &key[0], &key[1], &key[2]);
- composit1_pixel_processor(node, workbuf, inbuf, in[1]->vec, do_rgba_to_ycca, CB_RGBA);
- /*account for ycc is on a 0..255 scale*/
- t[0]= c->t1*255.0;
- t[1]= c->t2*255.0;
- t[2]= c->t3*255.0;
- break;
- default:
- break;
- }
-
- /*find min/max tolerances*/
- keymin[0]= key[0]-t[0];
- keymin[1]= key[1]-t[1];
- keymin[2]= key[2]-t[2];
- keymax[0]= key[0]+t[0];
- keymax[1]= key[1]+t[1];
- keymax[2]= key[2]+t[2];
-
- /*tolerance*/
- *tolerance= sqrt((t[0])*(t[0])+
- (t[1])*(t[1])+
- (t[2])*(t[2]));
+ outbuf=dupalloc_compbuf(imbuf1);
/* note, processor gets a keyvals array passed on as buffer constant */
- composit2_pixel_processor(node, workbuf, workbuf, in[0]->vec, NULL, keyvals, do_diff_matte, CB_RGBA, CB_VAL);
+ composit2_pixel_processor(node, outbuf, imbuf1, in[0]->vec, imbuf2, in[1]->vec, do_diff_matte, CB_RGBA, CB_RGBA);
- /*convert back to RGB colorspace*/
- switch(node->custom1) {
- case 1: /*RGB*/
- composit1_pixel_processor(node, workbuf, workbuf, in[1]->vec, do_copy_rgba, CB_RGBA);
- break;
- case 2: /*HSV*/
- composit1_pixel_processor(node, workbuf, workbuf, in[1]->vec, do_hsva_to_rgba, CB_RGBA);
- break;
- case 3: /*YUV*/
- composit1_pixel_processor(node, workbuf, workbuf, in[1]->vec, do_yuva_to_rgba, CB_RGBA);
- break;
- case 4: /*YCC*/
- composit1_pixel_processor(node, workbuf, workbuf, in[1]->vec, do_ycca_to_rgba, CB_RGBA);
- break;
- default:
- break;
- }
-
- out[0]->data=workbuf;
+ out[0]->data=outbuf;
if(out[1]->hasoutput)
- out[1]->data=valbuf_from_rgbabuf(workbuf, CHAN_A);
- generate_preview(node, workbuf);
+ out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A);
+ generate_preview(node, outbuf);
+
+ if(imbuf1!=in[0]->data)
+ free_compbuf(imbuf1);
- if(inbuf!=in[0]->data)
- free_compbuf(inbuf);
+ if(imbuf2!=in[1]->data)
+ free_compbuf(imbuf2);
}
static void node_composit_init_diff_matte(bNode *node)
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
- c->t1= 0.01f;
- c->t2= 0.01f;
- c->t3= 0.01f;
- c->fsize= 0.0f;
- c->fstrength= 0.0f;
- node->custom1= 1; /* RGB */
+ c->t1= 0.1f;
+ c->t2= 0.1f;
}
bNodeType cmp_node_diff_matte={
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
new file mode 100644
index 00000000000..f24aedd6661
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
@@ -0,0 +1,145 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Bob Holcomb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+/* ******************* channel Distance Matte ********************************* */
+static bNodeSocketType cmp_node_distance_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {-1,0,""}
+};
+
+static bNodeSocketType cmp_node_distance_matte_out[]={
+ {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ {-1,0,""}
+};
+
+/* note, keyvals is passed on from caller as stack array */
+/* might have been nicer as temp struct though... */
+static void do_distance_matte(bNode *node, float *out, float *in)
+{
+ NodeChroma *c= (NodeChroma *)node->storage;
+ float tolerence=c->t1;
+ float falloff=c->t2;
+ float distance;
+ float alpha;
+
+ distance=sqrt((c->key[0]-in[0])*(c->key[0]-in[0]) +
+ (c->key[1]-in[1])*(c->key[1]-in[1]) +
+ (c->key[2]-in[2])*(c->key[2]-in[2]));
+
+ VECCOPY(out, in);
+
+ /*make 100% transparent */
+ if(distance < tolerence) {
+ out[3]=0.0;
+ }
+ /*in the falloff region, make partially transparent */
+ else if(distance < falloff+tolerence){
+ distance=distance-tolerence;
+ alpha=distance/falloff;
+ /*only change if more transparent than before */
+ if(alpha < in[3]) {
+ out[3]=alpha;
+ }
+ else { /* leave as before */
+ out[3]=in[3];
+ }
+ }
+ else {
+ out[3]=in[3];
+ }
+}
+
+static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ /*
+ Losely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and
+ uses a differnt difference function (suggested in forums of vfxtalk.com).
+ */
+ CompBuf *workbuf;
+ CompBuf *inbuf;
+ NodeChroma *c;
+
+ /*is anything connected?*/
+ if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return;
+ /*must have an image imput*/
+ if(in[0]->data==NULL) return;
+
+ inbuf=typecheck_compbuf(in[0]->data, CB_RGBA);
+
+ c=node->storage;
+ workbuf=dupalloc_compbuf(inbuf);
+
+ /*use the input color*/
+ c->key[0]= in[1]->vec[0];
+ c->key[1]= in[1]->vec[1];
+ c->key[2]= in[1]->vec[2];
+
+ /* note, processor gets a keyvals array passed on as buffer constant */
+ composit1_pixel_processor(node, workbuf, workbuf, in[0]->vec, do_distance_matte, CB_RGBA);
+
+
+ out[0]->data=workbuf;
+ if(out[1]->hasoutput)
+ out[1]->data=valbuf_from_rgbabuf(workbuf, CHAN_A);
+ generate_preview(node, workbuf);
+
+ if(inbuf!=in[0]->data)
+ free_compbuf(inbuf);
+}
+
+static void node_composit_init_distance_matte(bNode *node)
+{
+ NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
+ node->storage= c;
+ c->t1= 0.1f;
+ 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
+};
+
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index 396df4ff402..5f444357776 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -65,9 +65,28 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
if(ibuf==NULL)
return NULL;
- if(ibuf->rect_float==NULL)
- IMB_float_from_rect(ibuf);
+ if (rd->color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if (ibuf->profile == IB_PROFILE_NONE) {
+ if (ibuf->rect_float != NULL) {
+ imb_freerectfloatImBuf(ibuf);
+ }
+ ibuf->profile = IB_PROFILE_SRGB;
+ IMB_float_from_rect(ibuf);
+ }
+ } else {
+ if (ibuf->profile == IB_PROFILE_SRGB) {
+ if (ibuf->rect_float != NULL) {
+ imb_freerectfloatImBuf(ibuf);
+ }
+ ibuf->profile = IB_PROFILE_NONE;
+ IMB_float_from_rect(ibuf);
+ }
+ }
+ if (ibuf->rect_float == NULL) {
+ IMB_float_from_rect(ibuf);
+ }
+
type= ibuf->channels;
if(rd->scemode & R_COMP_CROP) {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
new file mode 100644
index 00000000000..6056e9a28f4
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
@@ -0,0 +1,337 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Bob Holcomb.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+
+/* **************** LEVELS ******************** */
+static bNodeSocketType cmp_node_view_levels_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketType cmp_node_view_levels_out[]={
+ {SOCK_VALUE, 0,"Mean",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ {SOCK_VALUE, 0,"Std Dev",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ {-1,0,""}
+};
+
+static void rgb_tobw(float r, float g, float b, float* out)
+{
+ *out= r*0.35f + g*0.45f + b*0.2f;
+}
+
+static void fill_bins(bNode* node, CompBuf* in, int* bins)
+{
+ float value[4];
+ int ivalue;
+ int x,y;
+
+ /*fill bins */
+ for(y=0; y<in->y; y++) {
+ for(x=0; x<in->x; x++) {
+
+ /* get the pixel */
+ qd_getPixel(in, x, y, value);
+
+ if(value[3] > 0.0) { /* don't count transparent pixels */
+ switch(node->custom1) {
+ case 1: { /* all colors */
+ rgb_tobw(value[0],value[1],value[2], &value[0]);
+ value[0]=value[0]*255; /* scale to 0-255 range */
+ ivalue=(int)value[0];
+ break;
+ }
+ case 2: { /* red channel */
+ value[0]=value[0]*255; /* scale to 0-255 range */
+ ivalue=(int)value[0];
+ break;
+ }
+ case 3: { /* green channel */
+ value[1]=value[1]*255; /* scale to 0-255 range */
+ ivalue=(int)value[1];
+ break;
+ }
+ case 4: /*blue channel */
+ {
+ value[2]=value[2]*255; /* scale to 0-255 range */
+ ivalue=(int)value[2];
+ break;
+ }
+ case 5: /* luminence */
+ {
+ rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
+ value[0]=value[0]*255; /* scale to 0-255 range */
+ ivalue=(int)value[0];
+ break;
+ }
+ } /*end switch */
+
+ /*clip*/
+ if(ivalue<0) ivalue=0;
+ if(ivalue>255) ivalue=255;
+
+ /*put in the correct bin*/
+ bins[ivalue]+=1;
+ } /*end if alpha */
+ }
+ }
+}
+
+static float brightness_mean(bNode* node, CompBuf* in)
+{
+ float sum=0.0;
+ int numPixels=0.0;
+ int x,y;
+ float value[4];
+
+ for(x=0; x< in->x; x++) {
+ for(y=0; y < in->y; y++) {
+
+ /* get the pixel */
+ qd_getPixel(in, x, y, value);
+
+ if(value[3] > 0.0) { /* don't count transparent pixels */
+ numPixels++;
+ switch(node->custom1)
+ {
+ case 1:
+ {
+ rgb_tobw(value[0],value[1],value[2], &value[0]);
+ sum+=value[0];
+ break;
+ }
+ case 2:
+ {
+ sum+=value[0];
+ break;
+ }
+ case 3:
+ {
+ sum+=value[1];
+ break;
+ }
+ case 4:
+ {
+ sum+=value[2];
+ break;
+ }
+ case 5:
+ {
+ rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
+ sum+=value[0];
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return sum/numPixels;
+}
+
+static float brightness_standard_deviation(bNode* node, CompBuf* in, float mean)
+{
+ float sum=0.0;
+ int numPixels=0.0;
+ int x,y;
+ float value[4];
+
+ for(x=0; x< in->x; x++) {
+ for(y=0; y < in->y; y++) {
+
+ /* get the pixel */
+ qd_getPixel(in, x, y, value);
+
+ if(value[3] > 0.0) { /* don't count transparent pixels */
+ numPixels++;
+ switch(node->custom1)
+ {
+ case 1:
+ {
+ rgb_tobw(value[0],value[1],value[2], &value[0]);
+ sum+=(value[0]-mean)*(value[0]-mean);
+ break;
+ }
+ case 2:
+ {
+ sum+=value[0];
+ sum+=(value[0]-mean)*(value[0]-mean);
+ break;
+ }
+ case 3:
+ {
+ sum+=value[1];
+ sum+=(value[1]-mean)*(value[1]-mean);
+ break;
+ }
+ case 4:
+ {
+ sum+=value[2];
+ sum+=(value[2]-mean)*(value[2]-mean);
+ break;
+ }
+ case 5:
+ {
+ rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
+ sum+=(value[0]-mean)*(value[0]-mean);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+
+ return sqrt(sum/(float)(numPixels-1));
+}
+
+static void draw_histogram(bNode *node, CompBuf *out, int* bins)
+{
+ int x,y;
+ float color[4];
+ float value;
+ int max;
+
+ /* find max value */
+ max=0;
+ for(x=0; x<256; x++) {
+ if(bins[x]>max) max=bins[x];
+ }
+
+ /*draw histogram in buffer */
+ for(x=0; x<out->x; x++) {
+ for(y=0;y<out->y; y++) {
+
+ /* get normalized value (0..255) */
+ value=((float)bins[x]/(float)max)*255.0;
+
+ if(y < (int)value) { /*if the y value is below the height of the bar for this line then draw with the color */
+ switch (node->custom1) {
+ case 1: { /* draw in black */
+ color[0]=0.0; color[1]=0.0; color[2]=0.0; color[3]=1.0;
+ break;
+ }
+ case 2: { /* draw in red */
+ color[0]=1.0; color[1]=0.0; color[2]=0.0; color[3]=1.0;
+ break;
+ }
+ case 3: { /* draw in green */
+ color[0]=0.0; color[1]=1.0; color[2]=0.0; color[3]=1.0;
+ break;
+ }
+ case 4: { /* draw in blue */
+ color[0]=0.0; color[1]=0.0; color[2]=1.0; color[3]=1.0;
+ break;
+ }
+ case 5: { /* draw in white */
+ color[0]=1.0; color[1]=1.0; color[2]=1.0; color[3]=1.0;
+ break;
+ }
+ }
+ }
+ else{
+ color[0]=0.8; color[1]=0.8; color[2]=0.8; color[3]=1.0;
+ }
+
+ /* set the color */
+ qd_setPixel(out, x, y, color);
+ }
+ }
+}
+
+static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ CompBuf* cbuf;
+ CompBuf* histogram;
+ float mean, std_dev;
+ int bins[256];
+ int x;
+
+ if(in[0]->hasinput==0) return;
+ if(in[0]->data==NULL) return;
+
+ histogram=alloc_compbuf(256, 256, CB_RGBA, 1);
+ cbuf=typecheck_compbuf(in[0]->data, CB_RGBA);
+
+ /*initalize bins*/
+ for(x=0; x<256; x++) {
+ bins[x]=0;
+ }
+
+ /*fill bins */
+ fill_bins(node, in[0]->data, bins);
+
+ /* draw the histogram chart */
+ draw_histogram(node, histogram, bins);
+
+ /* calculate the average brightness and contrast */
+ mean=brightness_mean(node, in[0]->data);
+ std_dev=brightness_standard_deviation(node, in[0]->data, mean);
+
+ /* Printf debuging ;)
+ printf("Mean: %f\n", mean);
+ printf("Std Dev: %f\n", std_dev);
+ */
+
+ if(out[0]->hasoutput)
+ out[0]->vec[0]= mean;
+ if(out[1]->hasoutput)
+ out[1]->vec[0]= std_dev;
+
+ generate_preview(node, histogram);
+
+ if(cbuf!=in[0]->data)
+ free_compbuf(cbuf);
+ free_compbuf(histogram);
+}
+
+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
+
+};
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
index 973d74d71ff..350def76736 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Bob Holcomb .
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -53,7 +53,7 @@ static void do_luma_matte(bNode *node, float *out, float *in)
if(in[0]>c->t1) {
alpha=1.0;
}
- else if(in[1]<c->t2){
+ else if(in[0]<c->t2){
alpha=0.0;
}
else {/*blend */
@@ -99,7 +99,7 @@ static void node_composit_init_luma_matte(bNode *node)
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
- c->t1= 0.0f;
+ c->t1= 1.0f;
c->t2= 0.0f;
};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
index ae3e5875aae..0a46b02e886 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
@@ -65,18 +65,48 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
for(x=0; x<sx; x++, out+=4, uv+=3, uvnext+=3, uvprev+=3) {
if(x>0 && x<sx-1 && y>0 && y<sy-1) {
if(uv[2]!=0.0f) {
+ float uv_l, uv_r;
/* adaptive sampling, red (U) channel */
- dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3]));
- dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3]));
- dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3]));
+ /* prevent alpha zero UVs to be used */
+ uv_l= uv[-1]!=0.0f? fabs(uv[0]-uv[-3]) : 0.0f;
+ uv_r= uv[ 5]!=0.0f? fabs(uv[0]-uv[ 3]) : 0.0f;
+
+ //dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3]));
+ dx= 0.5f*(uv_l + uv_r);
+
+ uv_l= uvprev[-1]!=0.0f? fabs(uv[0]-uvprev[-3]) : 0.0f;
+ uv_r= uvnext[-1]!=0.0f? fabs(uv[0]-uvnext[-3]) : 0.0f;
+
+ //dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3]));
+ dx+= 0.25f*(uv_l + uv_r);
+
+ uv_l= uvprev[ 5]!=0.0f? fabs(uv[0]-uvprev[+3]) : 0.0f;
+ uv_r= uvnext[ 5]!=0.0f? fabs(uv[0]-uvnext[+3]) : 0.0f;
+
+ //dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3]));
+ dx+= 0.25f*(uv_l + uv_r);
/* adaptive sampling, green (V) channel */
- dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1]));
-
- dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3]));
- dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3]));
+
+ uv_l= uv[-row+2]!=0.0f? fabs(uv[1]-uv[-row+1]) : 0.0f;
+ uv_r= uv[ row+2]!=0.0f? fabs(uv[1]-uv[ row+1]) : 0.0f;
+
+ //dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1]));
+ dy= 0.5f*(uv_l + uv_r);
+
+ uv_l= uvprev[-1]!=0.0f? fabs(uv[1]-uvprev[+1-3]) : 0.0f;
+ uv_r= uvnext[-1]!=0.0f? fabs(uv[1]-uvnext[+1-3]) : 0.0f;
+
+ //dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3]));
+ dy+= 0.25f*(uv_l + uv_r);
+
+ uv_l= uvprev[ 5]!=0.0f? fabs(uv[1]-uvprev[+1+3]) : 0.0f;
+ uv_r= uvnext[ 5]!=0.0f? fabs(uv[1]-uvnext[+1+3]) : 0.0f;
+
+ //dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3]));
+ dy+= 0.25f*(uv_l + uv_r);
/* UV to alpha threshold */
alpha= 1.0f - threshold*(dx+dy);
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
index b70b591a588..5e8753570af 100644
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ b/source/blender/nodes/intern/CMP_nodes/Makefile
@@ -38,6 +38,7 @@ 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
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index f9805645115..b396d5549d7 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -1104,9 +1104,23 @@ void qd_getPixel(CompBuf* src, int x, int y, float* col)
{
if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
float* bc = &src->rect[(x + y*src->x)*src->type];
- col[0] = bc[0], col[1] = bc[1], col[2] = bc[2];
+ switch(src->type){
+ /* these fallthrough to get all the channels */
+ case CB_RGBA: col[3]=bc[3];
+ case CB_VEC3: col[2]=bc[2];
+ case CB_VEC2: col[1]=bc[1];
+ case CB_VAL: col[0]=bc[0];
+ }
+ }
+ else {
+ switch(src->type){
+ /* these fallthrough to get all the channels */
+ case CB_RGBA: col[3]=0.0;
+ case CB_VEC3: col[2]=0.0;
+ case CB_VEC2: col[1]=0.0;
+ case CB_VAL: col[0]=0.0;
+ }
}
- else col[0] = col[1] = col[2] = 0.f;
}
// sets pixel (x, y) to color col
@@ -1114,7 +1128,13 @@ void qd_setPixel(CompBuf* src, int x, int y, float* col)
{
if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
float* bc = &src->rect[(x + y*src->x)*src->type];
- bc[0] = col[0], bc[1] = col[1], bc[2] = col[2];
+ switch(src->type){
+ /* these fallthrough to get all the channels */
+ case CB_RGBA: bc[3]=col[3];
+ case CB_VEC3: bc[2]=col[2];
+ case CB_VEC2: bc[1]=col[1];
+ case CB_VAL: bc[0]=col[0];
+ }
}
}
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h
index 19e41f5c118..2a2dc97ed73 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -168,7 +168,7 @@ typedef float fRGB[4];
/* clear color */
#define fRGB_clear(c) { c[0]=c[1]=c[2]=0.f; }
/* copy c2 to c1 */
-#define fRGB_copy(c1, c2) { c1[0]=c2[0]; c1[1]=c2[1]; c1[2]=c2[2]; }
+#define fRGB_copy(c1, c2) { c1[0]=c2[0]; c1[1]=c2[1]; c1[2]=c2[2]; c1[3]=c2[3]; }
/* add c2 to c1 */
#define fRGB_add(c1, c2) { c1[0]+=c2[0]; c1[1]+=c2[1]; c1[2]+=c2[2]; }
/* subtract c2 from c1 */
@@ -186,7 +186,8 @@ typedef float fRGB[4];
/* swap colors c1 & c2 */
#define fRGB_swap(c1, c2) { float _t=c1[0]; c1[0]=c2[0]; c2[0]=_t;\
_t=c1[1]; c1[1]=c2[1]; c2[1]=_t;\
- _t=c1[2]; c1[2]=c2[2]; c2[2]=_t; }
+ _t=c1[2]; c1[2]=c2[2]; c2[2]=_t;\
+ _t=c1[3]; c1[3]=c2[3]; c3[3]=_t;}
void qd_getPixel(CompBuf* src, int x, int y, float* col);
void qd_setPixel(CompBuf* src, int x, int y, float* col);
diff --git a/source/blender/nodes/intern/Makefile b/source/blender/nodes/intern/Makefile
index 04a00c1ac9a..08f4b936c76 100644
--- a/source/blender/nodes/intern/Makefile
+++ b/source/blender/nodes/intern/Makefile
@@ -38,6 +38,7 @@ 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
diff --git a/source/blender/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
index 1369d346fc6..b6b21d5f5f8 100644
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ b/source/blender/nodes/intern/SHD_nodes/Makefile
@@ -40,6 +40,7 @@ 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
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
index fbc56dfcc83..693a20b5b0f 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
@@ -34,9 +34,7 @@
#endif
/* TODO, support python3.x */
-#if PY_VERSION_HEX >= 0x03000000
#define DISABLE_PYTHON 1
-#endif
#include "DNA_text_types.h"
#include "BKE_text.h"
diff --git a/source/blender/nodes/intern/TEX_nodes/Makefile b/source/blender/nodes/intern/TEX_nodes/Makefile
index ac741280478..f42660bd562 100644
--- a/source/blender/nodes/intern/TEX_nodes/Makefile
+++ b/source/blender/nodes/intern/TEX_nodes/Makefile
@@ -41,6 +41,7 @@ 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
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
index 80f232ccd0c..4d714d91130 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
@@ -38,12 +38,14 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
+ TexParams np = *p;
float new_coord[3];
+ np.coord = new_coord;
- tex_input_vec(new_coord, in[1], coord, thread);
- tex_input_rgba(out, in[0], new_coord, thread);
+ tex_input_vec(new_coord, in[1], p, thread);
+ tex_input_rgba(out, in[0], &np, thread);
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
index 80cbd6188ee..f1f3b0919ae 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -57,8 +57,10 @@ static float noise(int n) /* fast integer noise */
return 0.5f * ((float)nn / 1073741824.0f);
}
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
+ float *coord = p->coord;
+
float x = coord[0];
float y = coord[1];
@@ -71,14 +73,14 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
float bricks2[4];
float mortar[4];
- float mortar_thickness = tex_input_value(in[3], coord, thread);
- float bias = tex_input_value(in[4], coord, thread);
- float brick_width = tex_input_value(in[5], coord, thread);
- float row_height = tex_input_value(in[6], coord, thread);
+ float mortar_thickness = tex_input_value(in[3], p, thread);
+ float bias = tex_input_value(in[4], p, thread);
+ float brick_width = tex_input_value(in[5], p, thread);
+ float row_height = tex_input_value(in[6], p, thread);
- tex_input_rgba(bricks1, in[0], coord, thread);
- tex_input_rgba(bricks2, in[1], coord, thread);
- tex_input_rgba(mortar, in[2], coord, thread);
+ tex_input_rgba(bricks1, in[0], p, thread);
+ tex_input_rgba(bricks2, in[1], p, thread);
+ tex_input_rgba(mortar, in[2], p, thread);
rownum = (int)floor(y / row_height);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
index 60357782e25..b889f1e2164 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,12 +40,12 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- float x = coord[0];
- float y = coord[1];
- float z = coord[2];
- float sz = tex_input_value(in[2], coord, thread);
+ float x = p->coord[0];
+ float y = p->coord[1];
+ float z = p->coord[2];
+ float sz = tex_input_value(in[2], p, thread);
/* 0.00001 because of unit sized stuff */
int xi = (int)fabs(floor(0.00001 + x / sz));
@@ -53,9 +53,9 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
int zi = (int)fabs(floor(0.00001 + z / sz));
if( (xi % 2 == yi % 2) == (zi % 2) ) {
- tex_input_rgba(out, in[0], coord, thread);
+ tex_input_rgba(out, in[0], p, thread);
} else {
- tex_input_rgba(out, in[1], coord, thread);
+ tex_input_rgba(out, in[1], p, thread);
}
}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
index 26576befa3e..9fc4b2ff7c2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,11 +40,11 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
int i;
for(i = 0; i < 4; i++)
- out[i] = tex_input_value(in[i], coord, thread);
+ out[i] = tex_input_value(in[i], p, thread);
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
index da487c190af..e5c2b309fb3 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
@@ -33,11 +33,11 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void vectorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void vectorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- out[0] = coord[0];
- out[1] = coord[1];
- out[2] = coord[2];
+ out[0] = p->coord[0];
+ out[1] = p->coord[1];
+ out[2] = p->coord[2];
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
index 7d1366b5b18..61ebcea7360 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -36,14 +36,13 @@ static bNodeSocketType time_outputs[]= {
{ -1, 0, "" }
};
-static void time_colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void time_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
/* stack order output: fac */
float fac= 0.0f;
- // XXX SOLVE! these functions should get the TexCallData pointer
-// if(node->custom1 < node->custom2)
-// fac = (scene->r.cfra - node->custom1)/(float)(node->custom2-node->custom1);
+ if(node->custom1 < node->custom2)
+ fac = (p->cfra - node->custom1)/(float)(node->custom2-node->custom1);
fac = curvemapping_evaluateF(node->storage, 0, fac);
out[0] = CLAMPIS(fac, 0.0f, 1.0f);
@@ -90,10 +89,10 @@ static bNodeSocketType rgb_outputs[]= {
{ -1, 0, "" }
};
-static void rgb_colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void rgb_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float cin[4];
- tex_input_rgba(cin, in[0], coord, thread);
+ tex_input_rgba(cin, in[0], p, thread);
curvemapping_evaluateRGBF(node->storage, out, cin);
out[3] = cin[3];
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
index c08eb12a18f..f7a409f0230 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -41,27 +41,27 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn_r(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn_r(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- tex_input_rgba(out, in[0], coord, thread);
+ tex_input_rgba(out, in[0], p, thread);
*out = out[0];
}
-static void valuefn_g(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn_g(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- tex_input_rgba(out, in[0], coord, thread);
+ tex_input_rgba(out, in[0], p, thread);
*out = out[1];
}
-static void valuefn_b(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn_b(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- tex_input_rgba(out, in[0], coord, thread);
+ tex_input_rgba(out, in[0], p, thread);
*out = out[2];
}
-static void valuefn_a(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn_a(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- tex_input_rgba(out, in[0], coord, thread);
+ tex_input_rgba(out, in[0], p, thread);
*out = out[3];
}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
index d23eb6bc589..4e145e26b72 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
@@ -41,12 +41,12 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float coord1[3], coord2[3];
- tex_input_vec(coord1, in[0], coord, thread);
- tex_input_vec(coord2, in[1], coord, thread);
+ tex_input_vec(coord1, in[0], p, thread);
+ tex_input_vec(coord2, in[1], p, thread);
*out = VecLenf(coord2, coord1);
}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
index bb1a49fb235..192c7a39ee8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
@@ -65,15 +65,15 @@ static void do_hue_sat_fac(bNode *node, float *out, float hue, float sat, float
}
}
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- float hue = tex_input_value(in[0], coord, thread);
- float sat = tex_input_value(in[1], coord, thread);
- float val = tex_input_value(in[2], coord, thread);
- float fac = tex_input_value(in[3], coord, thread);
+ float hue = tex_input_value(in[0], p, thread);
+ float sat = tex_input_value(in[1], p, thread);
+ float val = tex_input_value(in[2], p, thread);
+ float fac = tex_input_value(in[3], p, thread);
float col[4];
- tex_input_rgba(col, in[4], coord, thread);
+ tex_input_rgba(col, in[4], p, thread);
hue += 0.5f; /* [-.5, .5] -> [0, 1] */
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
index b84088da154..0a55af70b52 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -34,10 +34,10 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- float x = coord[0];
- float y = coord[1];
+ float x = p->coord[0];
+ float y = p->coord[1];
Image *ima= (Image *)node->id;
ImageUser *iuser= (ImageUser *)node->storage;
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
index 09716951009..5663f897ff5 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -39,11 +39,11 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float col[4];
- tex_input_rgba(col, in[0], coord, thread);
+ tex_input_rgba(col, in[0], p, thread);
col[0] = 1.0f - col[0];
col[1] = 1.0f - col[1];
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
index bac91fc0901..4ee04140fca 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -42,10 +42,10 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- float in0 = tex_input_value(in[0], coord, thread);
- float in1 = tex_input_value(in[1], coord, thread);
+ float in0 = tex_input_value(in[0], p, thread);
+ float in1 = tex_input_value(in[1], p, thread);
switch(node->custom1){
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
index b1ccb7a3d07..24bdde70127 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -41,13 +41,13 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
- float fac = tex_input_value(in[0], coord, thread);
+ float fac = tex_input_value(in[0], p, thread);
float col1[4], col2[4];
- tex_input_rgba(col1, in[1], coord, thread);
- tex_input_rgba(col2, in[2], coord, thread);
+ tex_input_rgba(col1, in[1], p, thread);
+ tex_input_rgba(col2, in[2], p, thread);
CLAMP(fac, 0.0f, 1.0f);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
index 060ea8d7e67..7ce5ec88c48 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -35,6 +35,48 @@ static bNodeSocketType inputs[]= {
{ -1, 0, "" }
};
+static void osa(
+ void (*input_fn)(float *, bNodeStack *, TexParams *, short),
+ float *out,
+ bNodeStack *in,
+ TexParams *p,
+ short thread
+){
+ if(!p->dxt) {
+ input_fn(out, in, p, thread);
+ } else {
+ float sample[4] = {0};
+ float coord[3];
+ TexParams sp = *p;
+ int i;
+
+ sp.coord = coord;
+ sp.dxt = sp.dyt = 0;
+
+ QUATCOPY(out, sample);
+
+ for(i=0; i<5; i++) {
+ VECCOPY(coord, p->coord);
+
+ if(i < 4)
+ {
+ if(i % 2) VECADD(coord, coord, p->dxt);
+ if(i > 1) VECADD(coord, coord, p->dyt);
+ }
+ else
+ {
+ VECADDFAC(coord, coord, p->dxt, 0.5);
+ VECADDFAC(coord, coord, p->dyt, 0.5);
+ }
+
+ input_fn(sample, in, &sp, thread);
+
+ QUATADDFAC(out, out, sample, 0.2);
+ }
+ }
+}
+
+
/* applies to render pipeline */
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
@@ -49,14 +91,17 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
if(!cdata->do_preview) {
if(cdata->which_output == node->custom1)
{
- tex_input_rgba(&target->tr, in[0], cdata->coord, cdata->thread);
+ TexParams params;
+ params_from_cdata(&params, cdata);
+
+ osa(tex_input_rgba, &target->tr, in[0], &params, cdata->thread);
target->tin = (target->tr + target->tg + target->tb) / 3.0f;
target->talpha = 1.0f;
if(target->nor) {
if(in[1]->hasinput)
- tex_input_vec(target->nor, in[1], cdata->coord, cdata->thread);
+ osa(tex_input_vec, target->nor, in[1], &params, cdata->thread);
else
target->nor = 0;
}
@@ -64,13 +109,85 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
}
}
-static void init(bNode* node)
+static void unique_name(bNode *node)
{
- TexNodeOutput *tno = MEM_callocN(sizeof(TexNodeOutput), "TEX_output");
- strcpy(tno->name, "Default");
- node->storage= tno;
+ TexNodeOutput *tno = (TexNodeOutput *)node->storage;
+ char *new_name = 0;
+ int new_len;
+ int suffix;
+ bNode *i;
+ char *name = tno->name;
+
+ i = node;
+ while(i->prev) i = i->prev;
+ for(; i; i=i->next) {
+ if(
+ i == node ||
+ i->type != TEX_NODE_OUTPUT ||
+ strcmp(name, ((TexNodeOutput*)(i->storage))->name)
+ )
+ continue;
+
+ if(!new_name) {
+ int len = strlen(name);
+ if(len >= 4 && sscanf(name + len - 4, ".%03d", &suffix) == 1) {
+ new_len = len;
+ } else {
+ suffix = 0;
+ new_len = len + 4;
+ if(new_len > 31)
+ new_len = 31;
+ }
+
+ new_name = malloc(new_len + 1);
+ strcpy(new_name, name);
+ name = new_name;
+ }
+ sprintf(new_name + new_len - 4, ".%03d", ++suffix);
+ }
+
+ if(new_name) {
+ strcpy(tno->name, new_name);
+ free(new_name);
+ }
+}
+
+static void assign_index(struct bNode *node)
+{
+ bNode *tnode;
+ int index = 1;
+
+ tnode = node;
+ while(tnode->prev)
+ tnode = tnode->prev;
+
+ check_index:
+ for(; tnode; tnode= tnode->next)
+ if(tnode->type == TEX_NODE_OUTPUT && tnode != node)
+ if(tnode->custom1 == index) {
+ index ++;
+ goto check_index;
+ }
+
+ node->custom1 = index;
}
+static void init(bNode *node)
+{
+ TexNodeOutput *tno = MEM_callocN(sizeof(TexNodeOutput), "TEX_output");
+ node->storage= tno;
+
+ strcpy(tno->name, "Default");
+ unique_name(node);
+ assign_index(node);
+}
+
+static void copy(bNode *orig, bNode *new)
+{
+ node_copy_standard_storage(orig, new);
+ unique_name(new);
+ assign_index(new);
+}
bNodeType tex_node_output= {
/* *next,*prev */ NULL, NULL,
@@ -85,6 +202,6 @@ bNodeType tex_node_output= {
/* butfunc */ NULL,
/* initfunc */ init,
/* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
+ /* copystoragefunc */ copy,
/* id */ NULL
};
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
index ec65cf186a8..ce7324e2085 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -51,7 +51,7 @@ static bNodeSocketType outputs_color_only[]= {
{ SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }
/* Calls multitex and copies the result to the outputs. Called by xxx_exec, which handles inputs. */
-static void do_proc(float *result, float *coord, float *col1, float *col2, char is_normal, Tex *tex, short thread)
+static void do_proc(float *result, TexParams *p, float *col1, float *col2, char is_normal, Tex *tex, short thread)
{
TexResult texres;
int textype;
@@ -62,7 +62,7 @@ static void do_proc(float *result, float *coord, float *col1, float *col2, char
else
texres.nor = NULL;
- textype = multitex_thread(tex, coord, 0, 0, 0, &texres, thread, 0);
+ textype = multitex_thread(tex, p->coord, p->dxt, p->dyt, 0, &texres, thread, 0);
if(is_normal)
return;
@@ -76,11 +76,11 @@ static void do_proc(float *result, float *coord, float *col1, float *col2, char
}
}
-typedef void (*MapFn) (Tex *tex, bNodeStack **in, float *coord, short thread);
+typedef void (*MapFn) (Tex *tex, bNodeStack **in, TexParams *p, short thread);
static void texfn(
float *result,
- float *coord,
+ TexParams *p,
bNode *node,
bNodeStack **in,
char is_normal,
@@ -89,12 +89,12 @@ static void texfn(
{
Tex tex = *((Tex*)(node->storage));
float col1[4], col2[4];
- tex_input_rgba(col1, in[0], coord, thread);
- tex_input_rgba(col2, in[1], coord, thread);
+ tex_input_rgba(col1, in[0], p, thread);
+ tex_input_rgba(col2, in[1], p, thread);
- map_inputs(&tex, in, coord, thread);
+ map_inputs(&tex, in, p, thread);
- do_proc(result, coord, col1, col2, is_normal, &tex, thread);
+ do_proc(result, p, col1, col2, is_normal, &tex, thread);
}
static int count_outputs(bNode *node)
@@ -110,17 +110,17 @@ static int count_outputs(bNode *node)
/* Boilerplate generators */
#define ProcNoInputs(name) \
- static void name##_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread) \
+ static void name##_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) \
{}
#define ProcDef(name) \
- static void name##_colorfn(float *result, float *coord, bNode *node, bNodeStack **in, short thread) \
+ static void name##_colorfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \
{ \
- texfn(result, coord, node, in, 0, &name##_map_inputs, thread); \
+ texfn(result, p, node, in, 0, &name##_map_inputs, thread); \
} \
- static void name##_normalfn(float *result, float *coord, bNode *node, bNodeStack **in, short thread) \
+ static void name##_normalfn(float *result, TexParams *p, bNode *node, bNodeStack **in, short thread) \
{ \
- texfn(result, coord, node, in, 1, &name##_map_inputs, thread); \
+ texfn(result, p, node, in, 1, &name##_map_inputs, thread); \
} \
static void name##_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) \
{ \
@@ -144,15 +144,15 @@ static bNodeSocketType voronoi_inputs[]= {
{ -1, 0, "" }
};
-static void voronoi_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void voronoi_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->vn_w1 = tex_input_value(in[I+0], coord, thread);
- tex->vn_w2 = tex_input_value(in[I+1], coord, thread);
- tex->vn_w3 = tex_input_value(in[I+2], coord, thread);
- tex->vn_w4 = tex_input_value(in[I+3], coord, thread);
+ tex->vn_w1 = tex_input_value(in[I+0], p, thread);
+ tex->vn_w2 = tex_input_value(in[I+1], p, thread);
+ tex->vn_w3 = tex_input_value(in[I+2], p, thread);
+ tex->vn_w4 = tex_input_value(in[I+3], p, thread);
- tex->ns_outscale = tex_input_value(in[I+4], coord, thread);
- tex->noisesize = tex_input_value(in[I+5], coord, thread);
+ tex->ns_outscale = tex_input_value(in[I+4], p, thread);
+ tex->noisesize = tex_input_value(in[I+5], p, thread);
}
ProcDef(voronoi)
@@ -170,9 +170,9 @@ static bNodeSocketType magic_inputs[]= {
{ SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
{ -1, 0, "" }
};
-static void magic_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->turbul = tex_input_value(in[I+0], coord, thread);
+ tex->turbul = tex_input_value(in[I+0], p, thread);
}
ProcDef(magic)
@@ -183,10 +183,10 @@ static bNodeSocketType marble_inputs[]= {
{ SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
{ -1, 0, "" }
};
-static void marble_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->noisesize = tex_input_value(in[I+0], coord, thread);
- tex->turbul = tex_input_value(in[I+1], coord, thread);
+ tex->noisesize = tex_input_value(in[I+0], p, thread);
+ tex->turbul = tex_input_value(in[I+1], p, thread);
}
ProcDef(marble)
@@ -196,9 +196,9 @@ static bNodeSocketType clouds_inputs[]= {
{ SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
{ -1, 0, "" }
};
-static void clouds_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->noisesize = tex_input_value(in[I+0], coord, thread);
+ tex->noisesize = tex_input_value(in[I+0], p, thread);
}
ProcDef(clouds)
@@ -209,10 +209,10 @@ static bNodeSocketType distnoise_inputs[]= {
{ SOCK_VALUE, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f },
{ -1, 0, "" }
};
-static void distnoise_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->noisesize = tex_input_value(in[I+0], coord, thread);
- tex->dist_amount = tex_input_value(in[I+1], coord, thread);
+ tex->noisesize = tex_input_value(in[I+0], p, thread);
+ tex->dist_amount = tex_input_value(in[I+1], p, thread);
}
ProcDef(distnoise)
@@ -223,10 +223,10 @@ static bNodeSocketType wood_inputs[]= {
{ SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
{ -1, 0, "" }
};
-static void wood_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->noisesize = tex_input_value(in[I+0], coord, thread);
- tex->turbul = tex_input_value(in[I+1], coord, thread);
+ tex->noisesize = tex_input_value(in[I+0], p, thread);
+ tex->turbul = tex_input_value(in[I+1], p, thread);
}
ProcDef(wood)
@@ -241,13 +241,13 @@ static bNodeSocketType musgrave_inputs[]= {
{ SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
{ -1, 0, "" }
};
-static void musgrave_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->mg_H = tex_input_value(in[I+0], coord, thread);
- tex->mg_lacunarity = tex_input_value(in[I+1], coord, thread);
- tex->mg_octaves = tex_input_value(in[I+2], coord, thread);
- tex->ns_outscale = tex_input_value(in[I+3], coord, thread);
- tex->noisesize = tex_input_value(in[I+4], coord, thread);
+ tex->mg_H = tex_input_value(in[I+0], p, thread);
+ tex->mg_lacunarity = tex_input_value(in[I+1], p, thread);
+ tex->mg_octaves = tex_input_value(in[I+2], p, thread);
+ tex->ns_outscale = tex_input_value(in[I+3], p, thread);
+ tex->noisesize = tex_input_value(in[I+4], p, thread);
}
ProcDef(musgrave)
@@ -266,10 +266,10 @@ static bNodeSocketType stucci_inputs[]= {
{ SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
{ -1, 0, "" }
};
-static void stucci_map_inputs(Tex *tex, bNodeStack **in, float *coord, short thread)
+static void stucci_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
{
- tex->noisesize = tex_input_value(in[I+0], coord, thread);
- tex->turbul = tex_input_value(in[I+1], coord, thread);
+ tex->noisesize = tex_input_value(in[I+0], p, thread);
+ tex->turbul = tex_input_value(in[I+1], p, thread);
}
ProcDef(stucci)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
index 3a2c2b1def1..bdf5a1ce079 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
@@ -21,13 +21,13 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <math.h>
-#include "MTC_vectorops.h"
+
#include "../TEX_util.h"
static bNodeSocketType inputs[]= {
@@ -42,9 +42,10 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float new_coord[3];
+ float *coord = p->coord;
float ax[4];
float para[3];
@@ -53,30 +54,30 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
float magsq, ndx;
- float a = tex_input_value(in[1], coord, thread);
+ float a = tex_input_value(in[1], p, thread);
float cos_a = cos(a * 2 * M_PI);
float sin_a = sin(a * 2 * M_PI);
// x' = xcosa + n(n.x)(1-cosa)+(x*n)sina
- tex_input_vec(ax, in[2], coord, thread);
+ tex_input_vec(ax, in[2], p, thread);
magsq = ax[0]*ax[0] + ax[1]*ax[1] + ax[2]*ax[2];
if(magsq == 0) magsq = 1;
- ndx = MTC_dot3Float(coord, ax);
+ ndx = Inpf(coord, ax);
para[0] = ax[0] * ndx * (1 - cos_a);
para[1] = ax[1] * ndx * (1 - cos_a);
para[2] = ax[2] * ndx * (1 - cos_a);
- MTC_diff3Float(perp, coord, para);
+ VecSubf(perp, coord, para);
perp[0] = coord[0] * cos_a;
perp[1] = coord[1] * cos_a;
perp[2] = coord[2] * cos_a;
- MTC_cross3Float(cp, ax, coord);
+ Crossf(cp, ax, coord);
cp[0] = cp[0] * sin_a;
cp[1] = cp[1] * sin_a;
@@ -86,7 +87,11 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
new_coord[1] = para[1] + perp[1] + cp[1];
new_coord[2] = para[2] + perp[2] + cp[2];
- tex_input_rgba(out, in[0], new_coord, thread);
+ {
+ TexParams np = *p;
+ np.coord = new_coord;
+ tex_input_rgba(out, in[0], &np, thread);
+ }
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
index 792c3468e9f..3d4415365aa 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,17 +40,19 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float scale[3], new_coord[3];
+ TexParams np = *p;
+ np.coord = new_coord;
- tex_input_vec(scale, in[1], coord, thread);
+ tex_input_vec(scale, in[1], p, thread);
- new_coord[0] = coord[0] * scale[0];
- new_coord[1] = coord[1] * scale[1];
- new_coord[2] = coord[2] * scale[2];
+ new_coord[0] = p->coord[0] * scale[0];
+ new_coord[1] = p->coord[1] * scale[1];
+ new_coord[2] = p->coord[2] * scale[2];
- tex_input_rgba(out, in[0], new_coord, thread);
+ tex_input_rgba(out, in[0], &np, thread);
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
index 30492b84764..0ca80a82271 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,10 +40,11 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
static float red[] = {1,0,0,1};
static float white[] = {1,1,1,1};
+ float *coord = p->coord;
Tex *nodetex = (Tex *)node->id;
@@ -60,8 +61,8 @@ static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, shor
float nor[] = {0,0,0};
float col1[4], col2[4];
- tex_input_rgba(col1, in[0], coord, thread);
- tex_input_rgba(col2, in[1], coord, thread);
+ tex_input_rgba(col1, in[0], p, thread);
+ tex_input_rgba(col2, in[1], p, thread);
texres.nor = nor;
textype = multitex_ext(nodetex, coord, 0, 0, 0, &texres);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
index cadd27612f4..ba3dcfa27a2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -40,17 +40,19 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float offset[3], new_coord[3];
+ TexParams np = *p;
+ np.coord = new_coord;
- tex_input_vec(offset, in[1], coord, thread);
+ tex_input_vec(offset, in[1], p, thread);
- new_coord[0] = coord[0] + offset[0];
- new_coord[1] = coord[1] + offset[1];
- new_coord[2] = coord[2] + offset[2];
+ new_coord[0] = p->coord[0] + offset[0];
+ new_coord[1] = p->coord[1] + offset[1];
+ new_coord[2] = p->coord[2] + offset[2];
- tex_input_rgba(out, in[0], new_coord, thread);
+ tex_input_rgba(out, in[0], &np, thread);
}
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
index 0d24652a8f6..75b88c3a460 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
@@ -39,28 +39,32 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void normalfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void normalfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float new_coord[3];
+ float *coord = p->coord;
- float nabla = tex_input_value(in[1], coord, thread);
+ float nabla = tex_input_value(in[1], p, thread);
float val;
float nor[3];
+
+ TexParams np = *p;
+ np.coord = new_coord;
- val = tex_input_value(in[0], coord, thread);
+ val = tex_input_value(in[0], p, thread);
new_coord[0] = coord[0] + nabla;
new_coord[1] = coord[1];
new_coord[2] = coord[2];
- nor[0] = tex_input_value(in[0], new_coord, thread);
+ nor[0] = tex_input_value(in[0], &np, thread);
new_coord[0] = coord[0];
new_coord[1] = coord[1] + nabla;
- nor[1] = tex_input_value(in[0], new_coord, thread);
+ nor[1] = tex_input_value(in[0], &np, thread);
new_coord[1] = coord[1];
new_coord[2] = coord[2] + nabla;
- nor[2] = tex_input_value(in[0], new_coord, thread);
+ nor[2] = tex_input_value(in[0], &np, thread);
out[0] = val-nor[0];
out[1] = val-nor[1];
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
index 71d9cb07e18..90a444bcff0 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -39,10 +39,10 @@ static bNodeSocketType valtorgb_out[]= {
{ -1, 0, "" }
};
-static void valtorgb_colorfn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void valtorgb_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
if(node->storage) {
- float fac = tex_input_value(in[0], coord, thread);
+ float fac = tex_input_value(in[0], p, thread);
do_colorband(node->storage, fac, out);
}
@@ -87,10 +87,10 @@ static bNodeSocketType rgbtobw_out[]= {
};
-static void rgbtobw_valuefn(float *out, float *coord, bNode *node, bNodeStack **in, short thread)
+static void rgbtobw_valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
{
float cin[4];
- tex_input_rgba(cin, in[0], coord, thread);
+ tex_input_rgba(cin, in[0], p, thread);
*out = cin[0] * 0.35f + cin[1] * 0.45f + cin[2] * 0.2f;
}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
index acdaacf873c..2d29b03b38c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Robin Allen
*
* ***** END GPL LICENSE BLOCK *****
*/
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c
index 867e754f960..2c21627dad9 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/intern/TEX_util.c
@@ -47,17 +47,19 @@
#define PREV_RES 128 /* default preview resolution */
-void tex_call_delegate(TexDelegate *dg, float *out, float *coord, short thread)
+int preview_flag = 0;
+
+void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
{
if(dg->node->need_exec)
- dg->fn(out, coord, dg->node, dg->in, thread);
+ dg->fn(out, params, dg->node, dg->in, thread);
}
-void tex_input(float *out, int sz, bNodeStack *in, float *coord, short thread)
+void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
{
TexDelegate *dg = in->data;
if(dg) {
- tex_call_delegate(dg, in->vec, coord, thread);
+ tex_call_delegate(dg, in->vec, params, thread);
if(in->hasoutput && in->sockettype == SOCK_VALUE)
in->vec[1] = in->vec[2] = in->vec[0];
@@ -65,14 +67,14 @@ void tex_input(float *out, int sz, bNodeStack *in, float *coord, short thread)
memcpy(out, in->vec, sz * sizeof(float));
}
-void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread)
+void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread)
{
- tex_input(out, 3, in, coord, thread);
+ tex_input(out, 3, in, params, thread);
}
-void tex_input_rgba(float *out, bNodeStack *in, float *coord, short thread)
+void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread)
{
- tex_input(out, 4, in, coord, thread);
+ tex_input(out, 4, in, params, thread);
if(in->hasoutput && in->sockettype == SOCK_VALUE)
{
@@ -88,10 +90,10 @@ void tex_input_rgba(float *out, bNodeStack *in, float *coord, short thread)
}
}
-float tex_input_value(bNodeStack *in, float *coord, short thread)
+float tex_input_value(bNodeStack *in, TexParams *params, short thread)
{
float out[4];
- tex_input_vec(out, in, coord, thread);
+ tex_input_vec(out, in, params, thread);
return out[0];
}
@@ -108,12 +110,6 @@ static void init_preview(bNode *node)
if(node->preview==NULL)
node->preview= MEM_callocN(sizeof(bNodePreview), "node preview");
- if(node->preview->rect)
- if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) {
- MEM_freeN(node->preview->rect);
- node->preview->rect= NULL;
- }
-
if(node->preview->rect==NULL) {
node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
node->preview->xsize= xsize;
@@ -121,11 +117,23 @@ static void init_preview(bNode *node)
}
}
+void params_from_cdata(TexParams *out, TexCallData *in)
+{
+ out->coord = in->coord;
+ out->dxt = in->dxt;
+ out->dyt = in->dyt;
+ out->cfra = in->cfra;
+}
+
void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata)
{
int x, y;
float *result;
bNodePreview *preview;
+ float coord[3] = {0, 0, 0};
+ TexParams params;
+ int resolution;
+ int xsize, ysize;
if(!cdata->do_preview)
return;
@@ -136,16 +144,25 @@ void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata)
init_preview(node);
preview = node->preview;
+ xsize = preview->xsize;
+ ysize = preview->ysize;
- for(x=0; x<preview->xsize; x++)
- for(y=0; y<preview->ysize; y++)
+ params.dxt = 0;
+ params.dyt = 0;
+ params.cfra = cdata->cfra;
+ params.coord = coord;
+
+ resolution = (xsize < ysize) ? xsize : ysize;
+
+ for(x=0; x<xsize; x++)
+ for(y=0; y<ysize; y++)
{
- cdata->coord[0] = ((float) x / preview->xsize) * 2 - 1;
- cdata->coord[1] = ((float) y / preview->ysize) * 2 - 1;
+ params.coord[0] = ((float) x / resolution) * 2 - 1;
+ params.coord[1] = ((float) y / resolution) * 2 - 1;
- result = preview->rect + 4 * (preview->xsize*y + x);
+ result = preview->rect + 4 * (xsize*y + x);
- tex_input_rgba(result, ns, cdata->coord, cdata->thread);
+ tex_input_rgba(result, ns, &params, cdata->thread);
}
}
@@ -192,38 +209,41 @@ void ntreeTexCheckCyclics(struct bNodeTree *ntree)
}
}
-void ntreeTexExecTree(bNodeTree *nodes, TexResult *texres, float *coord, char do_preview, short thread, Tex *tex, short which_output, int cfra)
-{
+void ntreeTexExecTree(
+ bNodeTree *nodes,
+ TexResult *texres,
+ float *coord,
+ float *dxt, float *dyt,
+ short thread,
+ Tex *tex,
+ short which_output,
+ int cfra
+){
TexResult dummy_texres;
TexCallData data;
+ /* 0 means don't care, so just use first */
+ if(which_output == 0)
+ which_output = 1;
+
if(!texres) texres = &dummy_texres;
data.coord = coord;
+ data.dxt = dxt;
+ data.dyt = dyt;
data.target = texres;
- data.do_preview = do_preview;
+ data.do_preview = preview_flag;
data.thread = thread;
data.which_output = which_output;
data.cfra= cfra;
+ preview_flag = 0;
+
ntreeExecTree(nodes, &data, thread);
}
-void ntreeTexUpdatePreviews(bNodeTree* nodetree)
+void ntreeTexSetPreviewFlag(int doit)
{
- Tex *tex;
- float coord[] = {0,0,0};
- TexResult dummy_texres;
-
- for(tex= G.main->tex.first; tex; tex= tex->id.next)
- if(tex->nodetree == nodetree) break;
- if(!tex) return;
-
- dummy_texres.nor = 0;
-
- ntreeBeginExecTree(nodetree);
- ntreeTexExecTree(nodetree, &dummy_texres, coord, 1, 0, tex, 0, 0);
- ntreeEndExecTree(nodetree);
-
+ preview_flag = doit;
}
char* ntreeTexOutputMenu(bNodeTree *ntree)
@@ -267,19 +287,3 @@ char* ntreeTexOutputMenu(bNodeTree *ntree)
return str;
}
-void ntreeTexAssignIndex(struct bNodeTree *ntree, struct bNode *node)
-{
- bNode *tnode;
- int index = 0;
-
- check_index:
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next)
- if(tnode->type == TEX_NODE_OUTPUT && tnode != node)
- if(tnode->custom1 == index) {
- index ++;
- goto check_index;
- }
-
- node->custom1 = index;
-}
-
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/intern/TEX_util.h
index e560aa57921..87a9cf288d6 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/intern/TEX_util.h
@@ -71,13 +71,20 @@
typedef struct TexCallData {
TexResult *target;
float *coord;
+ float *dxt, *dyt;
char do_preview;
short thread;
short which_output;
int cfra;
} TexCallData;
-typedef void(*TexFn) (float *out, float *coord, bNode *node, bNodeStack **in, short thread);
+typedef struct TexParams {
+ float *coord;
+ float *dxt, *dyt;
+ int cfra;
+} TexParams;
+
+typedef void(*TexFn) (float *out, TexParams *params, bNode *node, bNodeStack **in, short thread);
typedef struct TexDelegate {
TexFn fn;
@@ -86,16 +93,17 @@ typedef struct TexDelegate {
int type;
} TexDelegate;
-void tex_call_delegate(TexDelegate*, float *out, float *coord, short thread);
+void tex_call_delegate(TexDelegate*, float *out, TexParams *params, short thread);
-void tex_input_rgba(float *out, bNodeStack *in, float *coord, short thread);
-void tex_input_vec(float *out, bNodeStack *in, float *coord, short thread);
-float tex_input_value(bNodeStack *in, float *coord, short thread);
+void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread);
+void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread);
+float tex_input_value(bNodeStack *in, TexParams *params, short thread);
void tex_output(bNode *node, bNodeStack **in, bNodeStack *out, TexFn texfn);
void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata);
-void ntreeTexUpdatePreviews( bNodeTree* nodetree );
-void ntreeTexExecTree(bNodeTree *nodes, TexResult *texres, float *coord, char do_preview, short thread, struct Tex *tex, short which_output, int cfra);
-
+void ntreeTexExecTree(bNodeTree *nodes, TexResult *texres, float *coord, float *dxt, float *dyt, short thread, struct Tex *tex, short which_output, int cfra);
+
+void params_from_cdata(TexParams *out, TexCallData *in);
+
#endif
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index d141a585378..acb45790ed2 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -37,7 +37,6 @@ struct Text; /* defined in DNA_text_types.h */
struct ID; /* DNA_ID.h */
struct Object; /* DNA_object_types.h */
struct ChannelDriver; /* DNA_anim_types.h */
-struct ScriptLink; /* DNA_scriptlink_types.h */
struct ListBase; /* DNA_listBase.h */
struct SpaceText; /* DNA_space_types.h */
struct SpaceScript; /* DNA_space_types.h */
@@ -100,7 +99,7 @@ extern "C" {
/* 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(struct bContext *C, struct SpaceScript * sc); // 2.5 working
+ int BPY_run_script_space_draw(const struct bContext *C, struct SpaceScript * sc); // 2.5 working
void BPY_run_ui_scripts(struct bContext *C, int reload);
// 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
@@ -110,13 +109,7 @@ extern "C" {
int BPY_run_script(struct Script *script);
void BPY_free_compiled_text( struct Text *text );
- void BPY_clear_bad_scriptlinks( struct Text *byebye );
int BPY_has_onload_script( void );
- void BPY_do_all_scripts( short event, short anim );
- int BPY_check_all_scriptlinks( struct Text *text );
- void BPY_do_pyscript( struct ID *id, short event );
- void BPY_free_scriptlink( struct ScriptLink *slink );
- void BPY_copy_scriptlink( struct ScriptLink *scriptlink );
int BPY_is_spacehandler(struct Text *text, char spacetype);
int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa);
@@ -129,7 +122,7 @@ extern "C" {
void BPY_pydriver_update(void);
float BPY_pydriver_eval(struct ChannelDriver *driver);
- int BPY_button_eval(char *expr, double *value);
+ int BPY_button_eval(struct bContext *C, char *expr, double *value);
/* format importer hook */
int BPY_call_importloader( char *name );
@@ -145,8 +138,6 @@ extern "C" {
void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
/* void BPY_Err_Handle(struct Text *text); */
-/* void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */
-/* void BPY_clear_bad_scriptlist(struct ListBase *, struct Text *byebye); */
/* int BPY_spacetext_is_pywin(struct SpaceText *st); */
#ifdef __cplusplus
diff --git a/source/blender/python/CMakeLists.txt b/source/blender/python/CMakeLists.txt
index 7700e6bc2aa..7abec566505 100644
--- a/source/blender/python/CMakeLists.txt
+++ b/source/blender/python/CMakeLists.txt
@@ -27,23 +27,23 @@ FILE(GLOB SRC intern/*.c)
FILE(GLOB GENSRC generic/*.c)
SET(INC
- . ../../../intern/guardedalloc ../blenlib ../makesdna ../makesrna
- ../blenkernel ../editors/include ../windowmanager ${PYTHON_INC}
- ../../../extern/glew/include
+ . ../../../intern/guardedalloc ../blenlib ../makesdna ../makesrna
+ ../blenkernel ../editors/include ../windowmanager ${PYTHON_INC}
+ ../../../extern/glew/include
)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
ADD_DEFINITIONS(-DWITH_CCGSUBSURF)
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index 73dc171fc3e..ca742a3646a 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -10,12 +10,12 @@ incs += ' ' + env['BF_PYTHON_INC']
defs = []
-if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc') and env['BF_DEBUG']:
- defs.append('Py_TRACE_REFS')
+if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']:
+ defs.append('_DEBUG')
-env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core'], priority = [140])
+env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160])
# generic
sources = env.Glob('generic/*.c')
-env.BlenderLib( libname = 'bf_gen_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core'], priority = [361]) # ketsji is 360
+env.BlenderLib( libname = 'bf_gen_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
diff --git a/source/blender/python/epy_doc_gen.py b/source/blender/python/epy_doc_gen.py
index 9f3efc916bf..4ff5c8102e2 100644
--- a/source/blender/python/epy_doc_gen.py
+++ b/source/blender/python/epy_doc_gen.py
@@ -37,6 +37,94 @@ Generate html docs by running...
# if you dont have graphvis installed ommit the --graph arg.
+# GLOBALS['BASEDIR'] = './source/blender/python/doc'
+
+import os
+
+SUBMODULES = {}
+INIT_SUBMODULES = {} # store initialized files
+
+INIT_SUBMODULES_IMPORTS = {} # dont import the same module twice
+
+def append_package(package_path, mod_name):
+
+ init_path = os.path.join(os.path.dirname(package_path), "__init__.py")
+
+ # avoid double ups
+ if mod_name:
+ imports = INIT_SUBMODULES_IMPORTS.setdefault(init_path, [])
+ if mod_name in imports:
+ return
+ imports.append(mod_name)
+
+ try:
+ os.makedirs(os.path.dirname(init_path)) # make the dirs if they are not there
+ except:
+ pass
+
+ # Open the new file for the first time, otherwise keep it open.
+ f = INIT_SUBMODULES.get(init_path)
+ if f == None:
+ f = INIT_SUBMODULES[init_path] = open(init_path, 'w')
+
+ if mod_name:
+ f.write("import %s\n" % mod_name)
+
+ return f
+
+def append_package_recursive(package_path, BASEPATH):
+ '''
+ assume the last item of package_path will be a file (not a dir thats created)
+ '''
+
+ package_path = os.path.splitext(package_path)[0] # incase of .py
+
+ try:
+ os.makedirs(os.path.join(BASEPATH, os.path.dirname(package_path))) # make the dirs if they are not there
+ except:
+ pass
+
+ new_path = BASEPATH
+
+ for mod_name in package_path.split(os.sep):
+ init_path = os.path.join(new_path, "__init__.py")
+ new_path = os.path.join(new_path, mod_name)
+ append_package(init_path, mod_name)
+
+
+def open_submodule(subpath, BASEPATH):
+ '''
+ This is a utility function that lets us quickly add submodules
+ '''
+
+ # create all the package paths leading up to this module
+ append_package_recursive(subpath, BASEPATH)
+
+ module_name = os.path.basename( os.path.splitext(subpath)[0] )
+ mod_path = os.path.join(BASEPATH, subpath)
+
+ # Open the new file for the first time, otherwise keep it open.
+ f = SUBMODULES.get(mod_path)
+ if f == None:
+ f = SUBMODULES[mod_path] = open(mod_path, 'w')
+
+ f = open(mod_path, 'w')
+ return f
+
+def close_all():
+ for files in (INIT_SUBMODULES.values(), SUBMODULES.values()):
+ for f in files:
+ if f.name.endswith('.py'):
+ f_name = f.name
+ f.close()
+
+ f = open(f_name, 'a')
+ f.write("\ndel __package__\n") # annoying, no need do show this
+
+
+ f.close()
+
+
def range_str(val):
if val < -10000000: return '-inf'
if val > 10000000: return 'inf'
@@ -59,6 +147,19 @@ def full_rna_struct_path(rna_struct):
else:
return rna_struct.identifier
+def rna_id_ignore(rna_id):
+ if rna_id == "rna_type":
+ return True
+
+ if "_OT_" in rna_id:
+ return True
+ if "_MT_" in rna_id:
+ return True
+ if "_PT_" in rna_id:
+ return True
+
+ return False
+
def write_func(rna, ident, out, func_type):
# Keyword attributes
kw_args = [] # "foo = 1", "bar=0.5", "spam='ENUM'"
@@ -68,16 +169,17 @@ def write_func(rna, ident, out, func_type):
# Operators and functions work differently
if func_type=='OPERATOR':
- rna_func_name = rna_struct.identifier
- rna_func_desc = rna_struct.description
+ rna_func_name = rna_struct.identifier.split("_OT_")[-1]
+ rna_func_desc = rna_struct.description.strip()
items = rna_struct.properties.items()
else:
rna_func_name = rna.identifier
- rna_func_desc = rna.description
+ rna_func_desc = rna.description.strip()
items = rna.parameters.items()
+
for rna_prop_identifier, rna_prop in items:
- if rna_prop_identifier=='rna_type':
+ if rna_id_ignore(rna_prop_identifier):
continue
# clear vars
@@ -88,13 +190,25 @@ def write_func(rna, ident, out, func_type):
rna_prop_type = rna_prop.type.lower() # enum, float, int, boolean
+ # only for rna functions, operators should not get pointers as args
+ if rna_prop_type=='pointer':
+ rna_prop_type_refine = "L{%s}" % rna_prop.fixed_type.identifier
+ else:
+ rna_prop_type_refine = rna_prop_type
+
+
try: length = rna_prop.array_length
except: length = 0
array_str = get_array_str(length)
- kw_type_str= "@type %s: %s%s" % (rna_prop_identifier, rna_prop_type, array_str)
- kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description)
+ if rna_prop.use_return:
+ kw_type_str= "@rtype: %s%s" % (rna_prop_type_refine, array_str)
+ kw_param_str= "@return: %s" % (rna_prop.description.strip())
+ else:
+ kw_type_str= "@type %s: %s%s" % (rna_prop_identifier, rna_prop_type_refine, array_str)
+ kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description.strip())
+
kw_param_set = False
if func_type=='OPERATOR':
@@ -111,7 +225,7 @@ def write_func(rna, ident, out, func_type):
elif rna_prop_type=='float':
if length==0:
val_str= '%g' % val
- if '.' not in val_str:
+ if '.' not in val_str and '-' not in val_str: # value could be 1e-05
val_str += '.0'
else:
# array
@@ -159,8 +273,11 @@ def write_func(rna, ident, out, func_type):
# stora
else:
# currently functions dont have a default value
- kw_args.append('%s' % (rna_prop_identifier))
-
+ if not rna_prop.use_return:
+ kw_args.append('%s' % (rna_prop_identifier))
+ else:
+ kw_param_set = True
+
# Same for operators and functions
kw_arg_attrs.append(kw_type_str)
@@ -174,15 +291,17 @@ def write_func(rna, ident, out, func_type):
out.write(ident+'\t%s\n' % rna_func_desc)
for desc in kw_arg_attrs:
out.write(ident+'\t%s\n' % desc)
- out.write(ident+'\t@rtype: None\n')
+
+ # out.write(ident+'\t@rtype: None\n') # implicit
out.write(ident+'\t"""\n')
-def rna2epy(target_path):
+def rna2epy(BASEPATH):
# Use for faster lookups
# use rna_struct.identifier as the key for each dict
+ rna_struct_dict = {} # store identifier:rna lookups
rna_full_path_dict = {} # store the result of full_rna_struct_path(rna_struct)
rna_children_dict = {} # store all rna_structs nested from here
rna_references_dict = {} # store a list of rna path strings that reference this type
@@ -199,13 +318,17 @@ def rna2epy(target_path):
if rna_base:
out.write(ident+ 'class %s(%s):\n' % (identifier, rna_base.identifier))
+ rna_base_prop_keys = rna_base.properties.keys() # could be cached
+ rna_base_func_keys = [f.identifier for f in rna_base.functions]
else:
out.write(ident+ 'class %s:\n' % identifier)
+ rna_base_prop_keys = []
+ rna_base_func_keys = []
out.write(ident+ '\t"""\n')
title = 'The %s Object' % rna_struct.name
- description = rna_struct.description
+ description = rna_struct.description.strip()
out.write(ident+ '\t%s\n' % title)
out.write(ident+ '\t%s\n' % ('=' * len(title)))
out.write(ident+ '\t\t%s\n' % description)
@@ -232,13 +355,11 @@ def rna2epy(target_path):
for rna_prop_identifier, rna_prop in rna_struct.properties.items():
- if rna_prop_identifier=='RNA':
- continue
-
- if rna_prop_identifier=='rna_type':
- continue
+ if rna_prop_identifier=='RNA': continue
+ if rna_id_ignore(rna_prop_identifier): continue
+ if rna_prop_identifier in rna_base_prop_keys: continue # does this prop exist in our parent class, if so skip
- rna_desc = rna_prop.description
+ rna_desc = rna_prop.description.strip()
if rna_desc: rna_words.update(rna_desc.split())
if not rna_desc: rna_desc = rna_prop.name
@@ -269,7 +390,8 @@ def rna2epy(target_path):
out.write(ident+ '\t@ivar %s: %s in (%s)\n' % (rna_prop_identifier, rna_desc, ', '.join(rna_prop.items.keys())))
else:
out.write(ident+ '\t@ivar %s: %s in...\n' % (rna_prop_identifier, rna_desc))
- for e in rna_prop.items.keys():
+ for e, e_rna_prop in rna_prop.items.items():
+ #out.write(ident+ '\t\t- %s: %s\n' % (e, e_rna_prop.description)) # XXX - segfaults, FIXME
out.write(ident+ '\t\t- %s\n' % e)
out.write(ident+ '\t@type %s: %s%s%s\n' % (rna_prop_identifier, rna_prop_type, array_str, readonly_str))
@@ -290,7 +412,8 @@ def rna2epy(target_path):
# Write functions
# for rna_func in rna_struct.functions: # Better ignore inherited (line below)
for rna_func in rna_functions_dict[identifier]:
- write_func(rna_func, ident+'\t', out, 'FUNCTION')
+ if rna_func not in rna_base_func_keys:
+ write_func(rna_func, ident+'\t', out, 'FUNCTION')
out.write('\n')
@@ -298,7 +421,10 @@ def rna2epy(target_path):
for child in rna_children_dict[identifier]:
write_struct(child, ident + '\t')
- out = open(target_path, 'w')
+
+
+ # out = open(target_path, 'w')
+ out = open_submodule("types.py", BASEPATH) # bpy.types
def base_id(rna_struct):
try: return rna_struct.base.identifier
@@ -313,24 +439,31 @@ def rna2epy(target_path):
structs = []
for rna_type_name in dir(bpy.types):
rna_type = getattr(bpy.types, rna_type_name)
- if hasattr(rna_type, '__rna__'):
+
+ try: rna_struct = rna_type.__rna__
+ except: rna_struct = None
+
+ if rna_struct:
#if not rna_type_name.startswith('__'):
- rna_struct = rna_type.__rna__
- identifier = rna_struct.identifier
- structs.append( (base_id(rna_struct), identifier, rna_struct) )
-
-
-
- # Store full rna path 'GameObjectSettings' -> 'Object.GameObjectSettings'
- rna_full_path_dict[identifier] = full_rna_struct_path(rna_struct)
-
- # Store a list of functions, remove inherited later
- rna_functions_dict[identifier]= list(rna_struct.functions)
+ identifier = rna_struct.identifier
- # fill in these later
- rna_children_dict[identifier]= []
- rna_references_dict[identifier]= []
+ if not rna_id_ignore(identifier):
+ structs.append( (base_id(rna_struct), identifier, rna_struct) )
+
+ # Simple lookup
+ rna_struct_dict[identifier] = rna_struct
+
+ # Store full rna path 'GameObjectSettings' -> 'Object.GameObjectSettings'
+ rna_full_path_dict[identifier] = full_rna_struct_path(rna_struct)
+
+ # Store a list of functions, remove inherited later
+ rna_functions_dict[identifier]= list(rna_struct.functions)
+
+
+ # fill in these later
+ rna_children_dict[identifier]= []
+ rna_references_dict[identifier]= []
else:
@@ -377,16 +510,21 @@ def rna2epy(target_path):
# precalc vars to avoid a lot of looping
for (rna_base, identifier, rna_struct) in structs:
+ if rna_base:
+ rna_base_prop_keys = rna_struct_dict[rna_base].properties.keys() # could cache
+ rna_base_func_keys = [f.identifier for f in rna_struct_dict[rna_base].functions]
+ else:
+ rna_base_prop_keys = []
+ rna_base_func_keys= []
# rna_struct_path = full_rna_struct_path(rna_struct)
rna_struct_path = rna_full_path_dict[identifier]
for rna_prop_identifier, rna_prop in rna_struct.properties.items():
- if rna_prop_identifier=='RNA':
- continue
- if rna_prop_identifier=='rna_type':
- continue
+ if rna_prop_identifier=='RNA': continue
+ if rna_id_ignore(rna_prop_identifier): continue
+ if rna_prop_identifier in rna_base_prop_keys: continue
try: rna_prop_ptr = rna_prop.fixed_type
except: rna_prop_ptr = None
@@ -395,7 +533,21 @@ def rna2epy(target_path):
if rna_prop_ptr:
rna_references_dict[rna_prop_ptr.identifier].append( "%s.%s" % (rna_struct_path, rna_prop_identifier) )
-
+ for rna_func in rna_struct.functions:
+ for rna_prop_identifier, rna_prop in rna_func.parameters.items():
+
+ if rna_prop_identifier=='RNA': continue
+ if rna_id_ignore(rna_prop_identifier): continue
+ if rna_prop_identifier in rna_base_func_keys: continue
+
+
+ try: rna_prop_ptr = rna_prop.fixed_type
+ except: rna_prop_ptr = None
+
+ # Does this property point to me?
+ if rna_prop_ptr:
+ rna_references_dict[rna_prop_ptr.identifier].append( "%s.%s" % (rna_struct_path, rna_func.identifier) )
+
# Store nested children
nested = rna_struct.nested
@@ -430,6 +582,7 @@ def rna2epy(target_path):
# # We could also just run....
# os.system('epydoc source/blender/python/doc/rna.py -o ./source/blender/python/doc/html -v')
+ target_path = os.path.join(BASEPATH, "dump.py") # XXX - used for other funcs
# Write graphviz
out= open(target_path.replace('.py', '.dot'), 'w')
@@ -500,35 +653,83 @@ def rna2epy(target_path):
out.write('%s\n' % w)
-def op2epy(target_path):
- out = open(target_path, 'w')
+def op2epy(BASEPATH):
+ # out = open(target_path, 'w')
- operators = dir(bpy.ops)
- operators.remove('add')
- operators.remove('remove')
- operators.sort()
+ op_mods = dir(bpy.ops)
+ op_mods.remove('add')
+ op_mods.remove('remove')
- for op in operators:
-
- if op.startswith('__'):
+ for op_mod_name in sorted(op_mods):
+ if op_mod_name.startswith('__'):
continue
- # rna = getattr(bpy.types, op).__rna__
- rna = bpy.ops.__rna__(op)
+ # open the submodule
+ mod_path = os.path.join("ops", op_mod_name + ".py")
+ out = open_submodule(mod_path, BASEPATH)
+
+
+ op_mod = getattr(bpy.ops, op_mod_name)
+ operators = dir(op_mod)
+ for op in sorted(operators):
+ # rna = getattr(bpy.types, op).__rna__
+ rna = getattr(op_mod, op).get_rna()
+ write_func(rna, '', out, 'OPERATOR')
- write_func(rna, '', out, 'OPERATOR')
+ out.write('\n')
+ out.close()
+
+def misc2epy(BASEPATH):
+ '''
+ Hard coded modules, try to avoid adding stuff here
+ '''
- out.write('\n')
- out.close()
+ f = append_package(os.path.join(BASEPATH, ""), ""); # add a slash on the end of the base path
+ f.write('''
+"""
+@type data: L{bpy.types.Main}
+@var data: blender data is accessed from here
+"""
+''')
+
+ f = open_submodule("props.py", BASEPATH)
+ f.write('''
+MAX_INT= 2**31
+MAX_FLOAT= 1e+37
+def BoolProperty(attr, name="", description="", default=False):
+ """
+ return a new bool property
+ """
+def IntProperty(attr, name="", description="", min=-MAX_INT, max=MAX_INT, soft_min=-MAX_INT, soft_max=MAX_INT, default=0):
+ """
+ return a new int property
+ """
+def FloatProperty(attr, name="", description="", min=-MAX_FLOAT, max=MAX_FLOAT, soft_min=-MAX_FLOAT, soft_max=MAX_FLOAT, default=0.0):
+ """
+ return a new float property
+ """
+def StringProperty(attr, name="", description="", maxlen=0, default=""):
+ """
+ return a new string property
+ """
+def EnumProperty(attr, items, name="", description="", default=""):
+ """
+ return a new enum property
+ """
+''')
+
if __name__ == '__main__':
if 'bpy' not in dir():
print("\nError, this script must run from inside blender2.5")
print(script_help_msg)
-
else:
- rna2epy('source/blender/python/doc/rna.py')
- op2epy('source/blender/python/doc/bpyoperator.py')
+ misc2epy('source/blender/python/doc/bpy') # first to write in info in some of the modules.
+ rna2epy('source/blender/python/doc/bpy')
+ op2epy('source/blender/python/doc/bpy')
+
+
+ close_all()
import sys
sys.exit()
diff --git a/source/blender/python/generic/BGL.c b/source/blender/python/generic/BGL.c
index a90fabd3586..767af8e0836 100644
--- a/source/blender/python/generic/BGL.c
+++ b/source/blender/python/generic/BGL.c
@@ -67,7 +67,7 @@ static int Buffer_ass_slice( PyObject * self, int begin, int end,
PyObject * seq );
static PySequenceMethods Buffer_SeqMethods = {
- ( inquiry ) Buffer_len, /*sq_length */
+ ( lenfunc ) Buffer_len, /*sq_length */
( binaryfunc ) 0, /*sq_concat */
( ssizeargfunc ) 0, /*sq_repeat */
( ssizeargfunc ) Buffer_item, /*sq_item */
@@ -83,8 +83,7 @@ static PyObject *Buffer_getattr( PyObject * self, char *name );
static PyObject *Buffer_repr( PyObject * self );
PyTypeObject buffer_Type = {
- PyObject_HEAD_INIT( NULL ) /* required python macro */
- 0, /*ob_size */
+ PyVarObject_HEAD_INIT(NULL, 0)
"buffer", /*tp_name */
sizeof( Buffer ), /*tp_basicsize */
0, /*tp_itemsize */
@@ -1085,7 +1084,6 @@ static struct PyMethodDef BGL_methods[] = {
{NULL, NULL, 0, NULL}
};
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef BGL_module_def = {
PyModuleDef_HEAD_INIT,
"BGL", /* m_name */
@@ -1097,17 +1095,13 @@ static struct PyModuleDef BGL_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
-PyObject *BGL_Init(const char *from)
+
+PyObject *BGL_Init(void)
{
PyObject *mod, *dict, *item;
-#if (PY_VERSION_HEX >= 0x03000000)
mod = PyModule_Create(&BGL_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), BGL_module_def.m_name, mod);
-#else
- mod= Py_InitModule(from, BGL_methods);
-#endif
dict= PyModule_GetDict(mod);
if( PyType_Ready( &buffer_Type) < 0)
diff --git a/source/blender/python/generic/BGL.h b/source/blender/python/generic/BGL.h
index 938c916bcea..91f88549faf 100755..100644
--- a/source/blender/python/generic/BGL.h
+++ b/source/blender/python/generic/BGL.h
@@ -42,9 +42,8 @@
#include <Python.h>
#include <GL/glew.h>
-#include "../intern/bpy_compat.h"
-PyObject *BGL_Init( const char *from );
+PyObject *BGL_Init(void);
/*@ Buffer Object */
/*@ For Python access to OpenGL functions requiring a pointer. */
@@ -305,31 +304,30 @@ typedef struct _Buffer {
#define ret_def_void
#define ret_set_void
-/* would use Py_RETURN_NONE - except for py 2.3 doesnt have it */
-#define ret_ret_void { Py_INCREF(Py_None); return Py_None; }
+#define ret_ret_void return Py_INCREF(Py_None), Py_None
#define ret_def_GLint int ret_int
#define ret_set_GLint ret_int=
-#define ret_ret_GLint return PyLong_FromLong(ret_int);
+#define ret_ret_GLint return PyLong_FromLong(ret_int)
#define ret_def_GLuint unsigned int ret_uint
#define ret_set_GLuint ret_uint=
-#define ret_ret_GLuint return PyLong_FromLong((long) ret_uint);
+#define ret_ret_GLuint return PyLong_FromLong((long) ret_uint)
#define ret_def_GLenum unsigned int ret_uint
#define ret_set_GLenum ret_uint=
-#define ret_ret_GLenum return PyLong_FromLong((long) ret_uint);
+#define ret_ret_GLenum return PyLong_FromLong((long) ret_uint)
#define ret_def_GLboolean unsigned char ret_bool
#define ret_set_GLboolean ret_bool=
-#define ret_ret_GLboolean return PyLong_FromLong((long) ret_bool);
+#define ret_ret_GLboolean return PyLong_FromLong((long) ret_bool)
#define ret_def_GLstring const unsigned char *ret_str;
#define ret_set_GLstring ret_str=
#define ret_ret_GLstring \
if (ret_str) {\
- return PyUnicode_FromString(ret_str);\
+ return PyUnicode_FromString((const char *)ret_str);\
} else {\
PyErr_SetString(PyExc_AttributeError, "could not get opengl string");\
return NULL;\
diff --git a/source/blender/python/generic/Geometry.c b/source/blender/python/generic/Geometry.c
index 8a748241570..f7b7ee866f0 100644
--- a/source/blender/python/generic/Geometry.c
+++ b/source/blender/python/generic/Geometry.c
@@ -78,7 +78,6 @@ struct PyMethodDef M_Geometry_methods[] = {
{NULL, NULL, 0, NULL}
};
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef M_Geometry_module_def = {
PyModuleDef_HEAD_INIT,
"Geometry", /* m_name */
@@ -90,19 +89,14 @@ static struct PyModuleDef M_Geometry_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
/*----------------------------MODULE INIT-------------------------*/
-PyObject *Geometry_Init(const char *from)
+PyObject *Geometry_Init(void)
{
PyObject *submodule;
-#if (PY_VERSION_HEX >= 0x03000000)
submodule = PyModule_Create(&M_Geometry_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), M_Geometry_module_def.m_name, submodule);
-#else
- submodule = Py_InitModule3(from, M_Geometry_methods, M_Geometry_doc);
-#endif
return (submodule);
}
@@ -273,7 +267,7 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
/*X of vert, Y of hoz. no calculation needed */
newvec[0]= a1x;
newvec[1]= b1y;
- return newVectorObject(newvec, 2, Py_NEW);
+ return newVectorObject(newvec, 2, Py_NEW, NULL);
}
yi = (float)(((b1y / fabs(b1x - b2x)) * fabs(b2x - a1x)) + ((b2y / fabs(b1x - b2x)) * fabs(b1x - a1x)));
@@ -285,7 +279,7 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
}
newvec[0]= a1x;
newvec[1]= yi;
- return newVectorObject(newvec, 2, Py_NEW);
+ return newVectorObject(newvec, 2, Py_NEW, NULL);
} else if (fabs(a2y-a1y) < eul) { /* hoz line1 */
if (fabs(b2y-b1y) < eul) { /*hoz line2*/
Py_RETURN_NONE; /*2 hoz lines dont intersect*/
@@ -300,7 +294,7 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
}
newvec[0]= xi;
newvec[1]= a1y;
- return newVectorObject(newvec, 2, Py_NEW);
+ return newVectorObject(newvec, 2, Py_NEW, NULL);
}
b1 = (a2y-a1y)/(a2x-a1x);
@@ -317,7 +311,7 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
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);
+ return newVectorObject(newvec, 2, Py_NEW, NULL);
}
Py_RETURN_NONE;
}
@@ -355,7 +349,7 @@ static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args
lambda = lambda_cp_line_ex(pt_in, l1, l2, pt_out);
ret = PyTuple_New(2);
- PyTuple_SET_ITEM( ret, 0, newVectorObject(pt_out, 3, Py_NEW) );
+ PyTuple_SET_ITEM( ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL) );
PyTuple_SET_ITEM( ret, 1, PyFloat_FromDouble(lambda) );
return ret;
}
@@ -529,13 +523,13 @@ static PyObject *M_Geometry_BezierInterp( PyObject * self, PyObject * args )
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, dims);
+ 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));
+ PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
}
MEM_freeN(coord_array);
return list;
diff --git a/source/blender/python/generic/Geometry.h b/source/blender/python/generic/Geometry.h
index ebfb054c54a..0e46c0d18db 100644
--- a/source/blender/python/generic/Geometry.h
+++ b/source/blender/python/generic/Geometry.h
@@ -34,6 +34,6 @@
#include <Python.h>
#include "Mathutils.h"
-PyObject *Geometry_Init( const char *from );
+PyObject *Geometry_Init(void);
#endif /* EXPP_Geometry_H */
diff --git a/source/blender/python/generic/Makefile b/source/blender/python/generic/Makefile
index 0dbfbd1d102..dc674478dab 100644
--- a/source/blender/python/generic/Makefile
+++ b/source/blender/python/generic/Makefile
@@ -43,7 +43,7 @@ CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
# PreProcessor stuff
CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include $(NAN_SDLCFLAGS)
+CPPFLAGS += $(NAN_SDLCFLAGS)
# modules
CPPFLAGS += -I../../editors/include
diff --git a/source/blender/python/generic/Mathutils.c b/source/blender/python/generic/Mathutils.c
index ec94a48ddbd..431f1987383 100644
--- a/source/blender/python/generic/Mathutils.c
+++ b/source/blender/python/generic/Mathutils.c
@@ -94,7 +94,6 @@ struct PyMethodDef M_Mathutils_methods[] = {
/*----------------------------MODULE INIT-------------------------*/
/* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef M_Mathutils_module_def = {
PyModuleDef_HEAD_INIT,
"Mathutils", /* m_name */
@@ -106,9 +105,8 @@ static struct PyModuleDef M_Mathutils_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
-PyObject *Mathutils_Init(const char *from)
+PyObject *Mathutils_Init(void)
{
PyObject *submodule;
@@ -124,12 +122,8 @@ PyObject *Mathutils_Init(const char *from)
if( PyType_Ready( &quaternion_Type ) < 0 )
return NULL;
-#if (PY_VERSION_HEX >= 0x03000000)
submodule = PyModule_Create(&M_Mathutils_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), M_Mathutils_module_def.m_name, submodule);
-#else
- submodule = Py_InitModule3(from, M_Mathutils_methods, M_Mathutils_doc);
-#endif
/* each type has its own new() function */
PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
@@ -176,7 +170,7 @@ PyObject *quat_rotation(PyObject *arg1, PyObject *arg2)
quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] -
quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] -
quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
- return newVectorObject(rot, 3, Py_NEW);
+ return newVectorObject(rot, 3, Py_NEW, NULL);
}
}else if(VectorObject_Check(arg1)){
vec = (VectorObject*)arg1;
@@ -201,7 +195,7 @@ PyObject *quat_rotation(PyObject *arg1, PyObject *arg2)
quat->quat[3]*quat->quat[3]*vec->vec[2] - 2*quat->quat[0]*quat->quat[2]*vec->vec[0] -
quat->quat[2]*quat->quat[2]*vec->vec[2] + 2*quat->quat[0]*quat->quat[1]*vec->vec[1] -
quat->quat[1]*quat->quat[1]*vec->vec[2] + quat->quat[0]*quat->quat[0]*vec->vec[2];
- return newVectorObject(rot, 3, Py_NEW);
+ return newVectorObject(rot, 3, Py_NEW, NULL);
}
}
@@ -311,7 +305,7 @@ static PyObject *M_Mathutils_MidpointVecs(PyObject * self, PyObject * args)
for(x = 0; x < vec1->size; x++) {
vec[x] = 0.5f * (vec1->vec[x] + vec2->vec[x]);
}
- return newVectorObject(vec, vec1->size, Py_NEW);
+ return newVectorObject(vec, vec1->size, Py_NEW, NULL);
}
//----------------------------------Mathutils.ProjectVecs() -------------
//projects vector 1 onto vector 2
@@ -348,7 +342,7 @@ static PyObject *M_Mathutils_ProjectVecs(PyObject * self, PyObject * args)
for(x = 0; x < size; x++) {
vec[x] = (float)(dot * vec2->vec[x]);
}
- return newVectorObject(vec, size, Py_NEW);
+ return newVectorObject(vec, size, Py_NEW, NULL);
}
//----------------------------------MATRIX FUNCTIONS--------------------
//----------------------------------Mathutils.RotationMatrix() ----------
@@ -359,7 +353,7 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args)
VectorObject *vec = NULL;
char *axis = NULL;
int matSize;
- float angle = 0.0f, norm = 0.0f, cosAngle = 0.0f, sinAngle = 0.0f;
+ float angle = 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};
@@ -443,40 +437,8 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args)
mat[8] = 1.0f;
} else if((strcmp(axis, "r") == 0) || (strcmp(axis, "R") == 0)) {
//arbitrary rotation
- //normalize arbitrary axis
- norm = (float) sqrt(vec->vec[0] * vec->vec[0] +
- vec->vec[1] * vec->vec[1] +
- vec->vec[2] * vec->vec[2]);
- vec->vec[0] /= norm;
- vec->vec[1] /= norm;
- vec->vec[2] /= norm;
-
- if (isnan(vec->vec[0]) || isnan(vec->vec[1]) || isnan(vec->vec[2])) {
- /* zero length vector, return an identity matrix, could also return an error */
- mat[0]= mat[4] = mat[8] = 1.0f;
- } else {
- /* create matrix */
- cosAngle = (float) cos(angle);
- sinAngle = (float) sin(angle);
- mat[0] = ((vec->vec[0] * vec->vec[0]) * (1 - cosAngle)) +
- cosAngle;
- mat[1] = ((vec->vec[0] * vec->vec[1]) * (1 - cosAngle)) +
- (vec->vec[2] * sinAngle);
- mat[2] = ((vec->vec[0] * vec->vec[2]) * (1 - cosAngle)) -
- (vec->vec[1] * sinAngle);
- mat[3] = ((vec->vec[0] * vec->vec[1]) * (1 - cosAngle)) -
- (vec->vec[2] * sinAngle);
- mat[4] = ((vec->vec[1] * vec->vec[1]) * (1 - cosAngle)) +
- cosAngle;
- mat[5] = ((vec->vec[1] * vec->vec[2]) * (1 - cosAngle)) +
- (vec->vec[0] * sinAngle);
- mat[6] = ((vec->vec[0] * vec->vec[2]) * (1 - cosAngle)) +
- (vec->vec[1] * sinAngle);
- mat[7] = ((vec->vec[1] * vec->vec[2]) * (1 - cosAngle)) -
- (vec->vec[0] * sinAngle);
- mat[8] = ((vec->vec[2] * vec->vec[2]) * (1 - cosAngle)) +
- cosAngle;
- }
+ AxisAngleToMat3(vec->vec, angle, (float (*)[3])mat);
+
} else {
PyErr_SetString(PyExc_AttributeError, "Mathutils.RotationMatrix(): unrecognizable axis of rotation type - expected x,y,z or r\n");
return NULL;
@@ -493,7 +455,7 @@ static PyObject *M_Mathutils_RotationMatrix(PyObject * self, PyObject * args)
mat[3] = 0.0f;
}
//pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW);
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
}
//----------------------------------Mathutils.TranslationMatrix() -------
//creates a translation matrix
@@ -520,7 +482,7 @@ static PyObject *M_Mathutils_TranslationMatrix(PyObject * self, VectorObject * v
mat[13] = vec->vec[1];
mat[14] = vec->vec[2];
- return newMatrixObject(mat, 4, 4, Py_NEW);
+ return newMatrixObject(mat, 4, 4, Py_NEW, NULL);
}
//----------------------------------Mathutils.ScaleMatrix() -------------
//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
@@ -598,7 +560,7 @@ static PyObject *M_Mathutils_ScaleMatrix(PyObject * self, PyObject * args)
mat[3] = 0.0f;
}
//pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW);
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
}
//----------------------------------Mathutils.OrthoProjectionMatrix() ---
//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
@@ -701,7 +663,7 @@ static PyObject *M_Mathutils_OrthoProjectionMatrix(PyObject * self, PyObject * a
mat[3] = 0.0f;
}
//pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW);
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
}
//----------------------------------Mathutils.ShearMatrix() -------------
//creates a shear matrix
@@ -768,7 +730,7 @@ static PyObject *M_Mathutils_ShearMatrix(PyObject * self, PyObject * args)
mat[3] = 0.0f;
}
//pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW);
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, NULL);
}
//----------------------------------QUATERNION FUNCTIONS-----------------
@@ -801,7 +763,7 @@ static PyObject *M_Mathutils_DifferenceQuats(PyObject * self, PyObject * args)
tempQuat[x] /= (float)(dot * dot);
}
QuatMul(quat, tempQuat, quatV->quat);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//----------------------------------Mathutils.Slerp() ------------------
//attemps to interpolate 2 quaternions and return the result
@@ -862,7 +824,7 @@ static PyObject *M_Mathutils_Slerp(PyObject * self, PyObject * args)
quat[2] = (float)(quat_u[2] * x + quat_v[2] * y);
quat[3] = (float)(quat_u[3] * x + quat_v[3] * y);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//----------------------------------EULER FUNCTIONS----------------------
//---------------------------------INTERSECTION FUNCTIONS--------------------
@@ -936,7 +898,7 @@ static PyObject *M_Mathutils_Intersect( PyObject * self, PyObject * args )
VecMulf(dir, t);
VecAddf(pvec, orig, dir);
- return newVectorObject(pvec, 3, Py_NEW);
+ return newVectorObject(pvec, 3, Py_NEW, NULL);
}
//----------------------------------Mathutils.LineIntersect() -------------------
/* Line-Line intersection using algorithm from mathworld.wolfram.com */
@@ -950,7 +912,7 @@ static PyObject *M_Mathutils_LineIntersect( PyObject * self, PyObject * args )
PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
return NULL;
}
- if( vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec2->size) {
+ 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;
}
@@ -993,8 +955,8 @@ static PyObject *M_Mathutils_LineIntersect( PyObject * self, PyObject * args )
}
else {
tuple = PyTuple_New( 2 );
- PyTuple_SetItem( tuple, 0, newVectorObject(i1, vec1->size, Py_NEW) );
- PyTuple_SetItem( tuple, 1, newVectorObject(i2, vec1->size, Py_NEW) );
+ PyTuple_SetItem( tuple, 0, newVectorObject(i1, vec1->size, Py_NEW, NULL) );
+ PyTuple_SetItem( tuple, 1, newVectorObject(i2, vec1->size, Py_NEW, NULL) );
return tuple;
}
}
@@ -1055,7 +1017,7 @@ static PyObject *M_Mathutils_QuadNormal( PyObject * self, PyObject * args )
VecAddf(n1, n2, n1);
Normalize(n1);
- return newVectorObject(n1, 3, Py_NEW);
+ return newVectorObject(n1, 3, Py_NEW, NULL);
}
//----------------------------Mathutils.TriangleNormal() -------------------
@@ -1091,7 +1053,7 @@ static PyObject *M_Mathutils_TriangleNormal( PyObject * self, PyObject * args )
Crossf(n, e2, e1);
Normalize(n);
- return newVectorObject(n, 3, Py_NEW);
+ return newVectorObject(n, 3, Py_NEW, NULL);
}
//--------------------------------- AREA FUNCTIONS--------------------
@@ -1244,7 +1206,7 @@ PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void *type )
{
- PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
+ return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
}
void BaseMathObject_dealloc(BaseMathObject * self)
@@ -1254,6 +1216,6 @@ void BaseMathObject_dealloc(BaseMathObject * self)
PyMem_Free(self->data);
Py_XDECREF(self->cb_user);
- PyObject_DEL(self);
+ Py_TYPE(self)->tp_free(self); // PyObject_DEL(self); // breaks subtypes
}
diff --git a/source/blender/python/generic/Mathutils.h b/source/blender/python/generic/Mathutils.h
index 6a4e28d6068..ad67d2e511e 100644
--- a/source/blender/python/generic/Mathutils.h
+++ b/source/blender/python/generic/Mathutils.h
@@ -32,7 +32,6 @@
#define EXPP_Mathutils_H
#include <Python.h>
-#include "../intern/bpy_compat.h"
#include "vector.h"
#include "matrix.h"
#include "quat.h"
@@ -55,10 +54,7 @@ PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * );
PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void * );
void BaseMathObject_dealloc(BaseMathObject * self);
-
-
-
-PyObject *Mathutils_Init( const char * from );
+PyObject *Mathutils_Init(void);
PyObject *quat_rotation(PyObject *arg1, PyObject *arg2);
@@ -85,6 +81,13 @@ int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
#endif
typedef struct Mathutils_Callback Mathutils_Callback;
+
+typedef int (*BaseMathCheckFunc)(PyObject *);
+typedef int (*BaseMathGetFunc)(PyObject *, int, float *);
+typedef int (*BaseMathSetFunc)(PyObject *, int, float *);
+typedef int (*BaseMathGetIndexFunc)(PyObject *, int, float *, int);
+typedef int (*BaseMathSetIndexFunc)(PyObject *, int, float *, int);
+
struct Mathutils_Callback {
int (*check)(PyObject *user); /* checks the user is still valid */
int (*get)(PyObject *user, int subtype, float *from); /* gets the vector from the user */
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index c41ea386c0e..05c846b16f5 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -65,6 +65,11 @@ PyObject *bpy_text_import( char *name, int *found )
Main *maggie= bpy_import_main;
*found= 0;
+
+ if(!maggie) {
+ printf("ERROR: bpy_import_main_set() was not called before running python. this is a bug.\n");
+ return NULL;
+ }
if (namelen>21-3) return NULL; /* we know this cant be importable, the name is too long for blender! */
@@ -106,12 +111,17 @@ PyObject *bpy_text_import( char *name, int *found )
PyObject *bpy_text_reimport( PyObject *module, int *found )
{
Text *text;
- char *txtname;
- char *name;
+ const char *txtname;
+ const char *name;
char *buf = NULL;
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
Main *maggie= bpy_import_main;
+ if(!maggie) {
+ printf("ERROR: bpy_import_main_set() was not called before running python. this is a bug.\n");
+ return NULL;
+ }
+
*found= 0;
/* get name, filename from the module itself */
@@ -156,7 +166,7 @@ PyObject *bpy_text_reimport( PyObject *module, int *found )
}
/* make into a module */
- return PyImport_ExecCodeModule( name, text->compiled );
+ return PyImport_ExecCodeModule( (char *)name, text->compiled );
}
@@ -169,20 +179,12 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k
PyObject *newmodule;
//PyObject_Print(args, stderr, 0);
-#if (PY_VERSION_HEX >= 0x02060000)
int dummy_val; /* what does this do?*/
static 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) )
return NULL;
-#else
- static char *kwlist[] = {"name", "globals", "locals", "fromlist", 0};
-
- if( !PyArg_ParseTupleAndKeywords( args, kw, "s|OOO:bpy_import_meth", kwlist,
- &name, &globals, &locals, &fromlist ) )
- return NULL;
-#endif
/* import existing builtin modules or modules that have been imported alredy */
newmodule = PyImport_ImportModuleEx( name, globals, locals, fromlist );
@@ -263,8 +265,8 @@ static PyObject *blender_reload( PyObject * self, PyObject * args )
return newmodule;
}
-PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} };
-PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", blender_reload, METH_VARARGS, "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_VARARGS, "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 aeeafb7c1c4..4e761fe8da0 100644
--- a/source/blender/python/generic/bpy_internal_import.h
+++ b/source/blender/python/generic/bpy_internal_import.h
@@ -31,8 +31,16 @@
#ifndef EXPP_bpy_import_h
#define EXPP_bpy_import_h
+/* python redefines :/ */
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#endif
+
#include <Python.h>
-#include "../intern/bpy_compat.h"
#include "compile.h" /* for the PyCodeObject */
#include "eval.h" /* for PyEval_EvalCode */
diff --git a/source/blender/python/generic/euler.c b/source/blender/python/generic/euler.c
index 9041eb84a3d..73fcaeb457b 100644
--- a/source/blender/python/generic/euler.c
+++ b/source/blender/python/generic/euler.c
@@ -34,13 +34,6 @@
//-------------------------DOC STRINGS ---------------------------
-static char Euler_Zero_doc[] = "() - set all values in the euler to 0";
-static char Euler_Unique_doc[] ="() - sets the euler rotation a unique shortest arc rotation - tests for gimbal lock";
-static char Euler_ToMatrix_doc[] = "() - returns a rotation matrix representing the euler rotation";
-static char Euler_ToQuat_doc[] = "() - returns a quaternion representing the euler rotation";
-static char Euler_Rotate_doc[] = "() - rotate a euler by certain amount around an axis of rotation";
-static char Euler_copy_doc[] = "() - returns a copy of the euler.";
-static char Euler_MakeCompatible_doc[] = "(euler) - Make this user compatible with another (no axis flipping).";
static PyObject *Euler_Zero( EulerObject * self );
static PyObject *Euler_Unique( EulerObject * self );
@@ -52,22 +45,21 @@ static PyObject *Euler_copy( EulerObject * self, PyObject *args );
//-----------------------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},
- {"toMatrix", (PyCFunction) Euler_ToMatrix, METH_NOARGS, Euler_ToMatrix_doc},
- {"toQuat", (PyCFunction) Euler_ToQuat, METH_NOARGS, Euler_ToQuat_doc},
- {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, Euler_Rotate_doc},
- {"makeCompatible", (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, NULL},
+ {"unique", (PyCFunction) Euler_Unique, METH_NOARGS, NULL},
+ {"toMatrix", (PyCFunction) Euler_ToMatrix, METH_NOARGS, NULL},
+ {"toQuat", (PyCFunction) Euler_ToQuat, METH_NOARGS, NULL},
+ {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, NULL},
+ {"makeCompatible", (PyCFunction) Euler_MakeCompatible, METH_O, NULL},
+ {"__copy__", (PyCFunction) Euler_copy, METH_VARARGS, NULL},
+ {"copy", (PyCFunction) Euler_copy, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
//----------------------------------Mathutils.Euler() -------------------
//makes a new euler for you to play with
-static PyObject *Euler_new(PyObject * self, PyObject * args)
+static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwargs)
{
-
PyObject *listObject = NULL;
int size, i;
float eul[3];
@@ -84,7 +76,7 @@ static PyObject *Euler_new(PyObject * self, PyObject * args)
}
} else if (size == 0) {
//returns a new empty 3d euler
- return newEulerObject(NULL, Py_NEW);
+ return newEulerObject(NULL, Py_NEW, NULL);
} else {
listObject = args;
}
@@ -110,7 +102,7 @@ static PyObject *Euler_new(PyObject * self, PyObject * args)
return NULL;
}
}
- return newEulerObject(eul, Py_NEW);
+ return newEulerObject(eul, Py_NEW, NULL);
}
//-----------------------------METHODS----------------------------
@@ -118,8 +110,11 @@ static PyObject *Euler_new(PyObject * self, PyObject * args)
//return a quaternion representation of the euler
static PyObject *Euler_ToQuat(EulerObject * self)
{
- float eul[3], quat[4];
+ float quat[4];
+#ifdef USE_MATHUTILS_DEG
+ float eul[3];
int x;
+#endif
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -133,37 +128,41 @@ static PyObject *Euler_ToQuat(EulerObject * self)
EulToQuat(self->eul, quat);
#endif
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//----------------------------Euler.toMatrix()---------------------
//return a matrix representation of the euler
static PyObject *Euler_ToMatrix(EulerObject * self)
{
- float eul[3];
float mat[9] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
- int x;
if(!BaseMath_ReadCallback(self))
return NULL;
#ifdef USE_MATHUTILS_DEG
- for(x = 0; x < 3; x++) {
- eul[x] = self->eul[x] * ((float)Py_PI / 180);
+ {
+ float eul[3];
+ int x;
+
+ for(x = 0; x < 3; x++) {
+ eul[x] = self->eul[x] * ((float)Py_PI / 180);
+ }
+ EulToMat3(eul, (float (*)[3]) mat);
}
- EulToMat3(eul, (float (*)[3]) mat);
#else
EulToMat3(self->eul, (float (*)[3]) mat);
#endif
- return newMatrixObject(mat, 3, 3 , Py_NEW);
+ return newMatrixObject(mat, 3, 3 , Py_NEW, NULL);
}
//----------------------------Euler.unique()-----------------------
//sets the x,y,z values to a unique euler rotation
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;
- double pi2 = Py_PI * 2.0f;
- double piO2 = Py_PI / 2.0f;
- double Opi2 = 1.0f / pi2;
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -173,35 +172,39 @@ static PyObject *Euler_Unique(EulerObject * self)
heading = self->eul[0] * (float)Py_PI / 180;
pitch = self->eul[1] * (float)Py_PI / 180;
bank = self->eul[2] * (float)Py_PI / 180;
+#else
+ heading = self->eul[0];
+ pitch = self->eul[1];
+ bank = self->eul[2];
#endif
//wrap heading in +180 / -180
pitch += Py_PI;
- pitch -= floor(pitch * Opi2) * pi2;
+ pitch -= floor(pitch * PI_INV) * PI_2;
pitch -= Py_PI;
- if(pitch < -piO2) {
+ if(pitch < -PI_HALF) {
pitch = -Py_PI - pitch;
heading += Py_PI;
bank += Py_PI;
- } else if(pitch > piO2) {
+ } else if(pitch > PI_HALF) {
pitch = Py_PI - pitch;
heading += Py_PI;
bank += Py_PI;
}
//gimbal lock test
- if(fabs(pitch) > piO2 - 1e-4) {
+ if(fabs(pitch) > PI_HALF - 1e-4) {
heading += bank;
bank = 0.0f;
} else {
bank += Py_PI;
- bank -= (floor(bank * Opi2)) * pi2;
+ bank -= (floor(bank * PI_INV)) * PI_2;
bank -= Py_PI;
}
heading += Py_PI;
- heading -= (floor(heading * Opi2)) * pi2;
+ heading -= (floor(heading * PI_INV)) * PI_2;
heading -= Py_PI;
#ifdef USE_MATHUTILS_DEG
@@ -234,13 +237,12 @@ static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
{
float angle = 0.0f;
char *axis;
- int x;
if(!PyArg_ParseTuple(args, "fs", &angle, &axis)){
PyErr_SetString(PyExc_TypeError, "euler.rotate():expected angle (float) and axis (x,y,z)");
return NULL;
}
- if(!STREQ3(axis,"x","y","z")){
+ if(ELEM3(*axis, 'x', 'y', 'z') && axis[1]=='\0'){
PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected axis to be 'x', 'y' or 'z'");
return NULL;
}
@@ -249,18 +251,25 @@ static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
return NULL;
#ifdef USE_MATHUTILS_DEG
- //covert to radians
- angle *= ((float)Py_PI / 180);
- for(x = 0; x < 3; x++) {
- self->eul[x] *= ((float)Py_PI / 180);
+ {
+ int x;
+
+ //covert to radians
+ angle *= ((float)Py_PI / 180);
+ for(x = 0; x < 3; x++) {
+ self->eul[x] *= ((float)Py_PI / 180);
+ }
}
#endif
euler_rot(self->eul, angle, *axis);
#ifdef USE_MATHUTILS_DEG
- //convert back from radians
- for(x = 0; x < 3; x++) {
- self->eul[x] *= (180 / (float)Py_PI);
+ {
+ int x;
+ //convert back from radians
+ for(x = 0; x < 3; x++) {
+ self->eul[x] *= (180 / (float)Py_PI);
+ }
}
#endif
@@ -271,8 +280,10 @@ static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
static PyObject *Euler_MakeCompatible(EulerObject * self, EulerObject *value)
{
+#ifdef USE_MATHUTILS_DEG
float eul_from_rad[3];
int x;
+#endif
if(!EulerObject_Check(value)) {
PyErr_SetString(PyExc_TypeError, "euler.makeCompatible(euler):expected a single euler argument.");
@@ -311,7 +322,7 @@ static PyObject *Euler_copy(EulerObject * self, PyObject *args)
if(!BaseMath_ReadCallback(self))
return NULL;
- return newEulerObject(self->eul, Py_NEW);
+ return newEulerObject(self->eul, Py_NEW, Py_TYPE(self));
}
//----------------------------print object (internal)--------------
@@ -376,8 +387,7 @@ static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int compar
Py_RETURN_FALSE;
}
}
-//------------------------tp_doc
-static char EulerObject_doc[] = "This is a wrapper for euler objects.";
+
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
@@ -460,7 +470,7 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end,
PyObject *e;
if(!BaseMath_ReadCallback(self))
- return NULL;
+ return -1;
CLAMP(begin, 0, 3);
if (end<0) end= 4+end;
@@ -498,7 +508,7 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end,
}
//-----------------PROTCOL DECLARATIONS--------------------------
static PySequenceMethods Euler_SeqMethods = {
- (inquiry) Euler_len, /* sq_length */
+ (lenfunc) Euler_len, /* sq_length */
(binaryfunc) 0, /* sq_concat */
(ssizeargfunc) 0, /* sq_repeat */
(ssizeargfunc) Euler_item, /* sq_item */
@@ -537,13 +547,7 @@ static PyGetSetDef Euler_getseters[] = {
//------------------PY_OBECT DEFINITION--------------------------
PyTypeObject euler_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"euler", //tp_name
sizeof(EulerObject), //tp_basicsize
0, //tp_itemsize
@@ -562,8 +566,8 @@ PyTypeObject euler_Type = {
0, //tp_getattro
0, //tp_setattro
0, //tp_as_buffer
- Py_TPFLAGS_DEFAULT, //tp_flags
- EulerObject_doc, //tp_doc
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ 0, //tp_doc
0, //tp_traverse
0, //tp_clear
(richcmpfunc)Euler_richcmpr, //tp_richcompare
@@ -596,12 +600,13 @@ PyTypeObject euler_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 *newEulerObject(float *eul, int type)
+PyObject *newEulerObject(float *eul, int type, PyTypeObject *base_type)
{
EulerObject *self;
int x;
- self = PyObject_NEW(EulerObject, &euler_Type);
+ if(base_type) self = (EulerObject *)base_type->tp_alloc(base_type, 0);
+ else self = PyObject_NEW(EulerObject, &euler_Type);
/* init callbacks as NULL */
self->cb_user= NULL;
@@ -628,7 +633,7 @@ PyObject *newEulerObject(float *eul, int type)
PyObject *newEulerObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
{
- EulerObject *self= (EulerObject *)newEulerObject(NULL, Py_NEW);
+ EulerObject *self= (EulerObject *)newEulerObject(NULL, Py_NEW, NULL);
if(self) {
Py_INCREF(cb_user);
self->cb_user= cb_user;
@@ -636,5 +641,5 @@ PyObject *newEulerObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
self->cb_subtype= (unsigned char)cb_subtype;
}
- return self;
+ return (PyObject *)self;
}
diff --git a/source/blender/python/generic/euler.h b/source/blender/python/generic/euler.h
index 0bff6de6964..74d184fef81 100644
--- a/source/blender/python/generic/euler.h
+++ b/source/blender/python/generic/euler.h
@@ -32,11 +32,9 @@
#define EXPP_euler_h
#include <Python.h>
-#include "../intern/bpy_compat.h"
extern PyTypeObject euler_Type;
-
-#define EulerObject_Check(v) (Py_TYPE(v) == &euler_Type)
+#define EulerObject_Check(_v) PyObject_TypeCheck((_v), &euler_Type)
typedef struct {
PyObject_VAR_HEAD
@@ -55,7 +53,7 @@ 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 *newEulerObject( float *eul, int type );
+PyObject *newEulerObject( float *eul, int type, PyTypeObject *base_type);
PyObject *newEulerObject_cb(PyObject *cb_user, int cb_type, int cb_subtype);
#endif /* EXPP_euler_h */
diff --git a/source/blender/python/generic/matrix.c b/source/blender/python/generic/matrix.c
index b546aa1226c..edb6fb7af63 100644
--- a/source/blender/python/generic/matrix.c
+++ b/source/blender/python/generic/matrix.c
@@ -37,14 +37,17 @@ static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject*
/* matrix vector callbacks */
int mathutils_matrix_vector_cb_index= -1;
-static int mathutils_matrix_vector_check(MatrixObject *self)
+static int mathutils_matrix_vector_check(PyObject *self_p)
{
+ MatrixObject *self= (MatrixObject*)self_p;
return BaseMath_ReadCallback(self);
}
-static int mathutils_matrix_vector_get(MatrixObject *self, int subtype, float *vec_from)
+static int mathutils_matrix_vector_get(PyObject *self_p, int subtype, float *vec_from)
{
+ MatrixObject *self= (MatrixObject*)self_p;
int i;
+
if(!BaseMath_ReadCallback(self))
return 0;
@@ -54,9 +57,11 @@ static int mathutils_matrix_vector_get(MatrixObject *self, int subtype, float *v
return 1;
}
-static int mathutils_matrix_vector_set(MatrixObject *self, int subtype, float *vec_to)
+static int mathutils_matrix_vector_set(PyObject *self_p, int subtype, float *vec_to)
{
+ MatrixObject *self= (MatrixObject*)self_p;
int i;
+
if(!BaseMath_ReadCallback(self))
return 0;
@@ -67,8 +72,10 @@ static int mathutils_matrix_vector_set(MatrixObject *self, int subtype, float *v
return 1;
}
-static int mathutils_matrix_vector_get_index(MatrixObject *self, int subtype, float *vec_from, int index)
+static int mathutils_matrix_vector_get_index(PyObject *self_p, int subtype, float *vec_from, int index)
{
+ MatrixObject *self= (MatrixObject*)self_p;
+
if(!BaseMath_ReadCallback(self))
return 0;
@@ -76,8 +83,10 @@ static int mathutils_matrix_vector_get_index(MatrixObject *self, int subtype, fl
return 1;
}
-static int mathutils_matrix_vector_set_index(MatrixObject *self, int subtype, float *vec_to, int index)
+static int mathutils_matrix_vector_set_index(PyObject *self_p, int subtype, float *vec_to, int index)
{
+ MatrixObject *self= (MatrixObject*)self_p;
+
if(!BaseMath_ReadCallback(self))
return 0;
@@ -97,18 +106,6 @@ Mathutils_Callback mathutils_matrix_vector_cb = {
/* matrix vector callbacks, this is so you can do matrix[i][j] = val */
/*-------------------------DOC STRINGS ---------------------------*/
-static char Matrix_Zero_doc[] = "() - set all values in the matrix to 0";
-static char Matrix_Identity_doc[] = "() - set the square matrix to it's identity matrix";
-static char Matrix_Transpose_doc[] = "() - set the matrix to it's transpose";
-static char Matrix_Determinant_doc[] = "() - return the determinant of the matrix";
-static char Matrix_Invert_doc[] = "() - set the matrix to it's inverse if an inverse is possible";
-static char Matrix_TranslationPart_doc[] = "() - return a vector encompassing the translation of the matrix";
-static char Matrix_RotationPart_doc[] = "() - return a vector encompassing the rotation of the matrix";
-static char Matrix_scalePart_doc[] = "() - convert matrix to a 3D vector";
-static char Matrix_Resize4x4_doc[] = "() - resize the matrix to a 4x4 square matrix";
-static char Matrix_toEuler_doc[] = "(eul_compat) - convert matrix to a euler angle rotation, optional euler argument that the new euler will be made compatible with.";
-static char Matrix_toQuat_doc[] = "() - convert matrix to a quaternion rotation";
-static char Matrix_copy_doc[] = "() - return a copy of the matrix";
static PyObject *Matrix_Zero( MatrixObject * self );
static PyObject *Matrix_Identity( MatrixObject * self );
@@ -125,19 +122,19 @@ static PyObject *Matrix_copy( MatrixObject * self );
/*-----------------------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},
- {"translationPart", (PyCFunction) Matrix_TranslationPart, METH_NOARGS, Matrix_TranslationPart_doc},
- {"rotationPart", (PyCFunction) Matrix_RotationPart, METH_NOARGS, Matrix_RotationPart_doc},
- {"scalePart", (PyCFunction) Matrix_scalePart, METH_NOARGS, Matrix_scalePart_doc},
- {"resize4x4", (PyCFunction) Matrix_Resize4x4, METH_NOARGS, Matrix_Resize4x4_doc},
- {"toEuler", (PyCFunction) Matrix_toEuler, METH_VARARGS, Matrix_toEuler_doc},
- {"toQuat", (PyCFunction) Matrix_toQuat, METH_NOARGS, Matrix_toQuat_doc},
- {"copy", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
- {"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
+ {"zero", (PyCFunction) Matrix_Zero, METH_NOARGS, NULL},
+ {"identity", (PyCFunction) Matrix_Identity, METH_NOARGS, NULL},
+ {"transpose", (PyCFunction) Matrix_Transpose, METH_NOARGS, NULL},
+ {"determinant", (PyCFunction) Matrix_Determinant, METH_NOARGS, NULL},
+ {"invert", (PyCFunction) Matrix_Invert, METH_NOARGS, NULL},
+ {"translationPart", (PyCFunction) Matrix_TranslationPart, METH_NOARGS, NULL},
+ {"rotationPart", (PyCFunction) Matrix_RotationPart, METH_NOARGS, NULL},
+ {"scalePart", (PyCFunction) Matrix_scalePart, METH_NOARGS, NULL},
+ {"resize4x4", (PyCFunction) Matrix_Resize4x4, METH_NOARGS, NULL},
+ {"toEuler", (PyCFunction) Matrix_toEuler, METH_VARARGS, NULL},
+ {"toQuat", (PyCFunction) Matrix_toQuat, METH_NOARGS, NULL},
+ {"copy", (PyCFunction) Matrix_copy, METH_NOARGS, NULL},
+ {"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -158,7 +155,7 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
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);
+ return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, NULL);
}else if (argSize == 1){
//copy constructor for matrix objects
argObject = PyTuple_GET_ITEM(args, 0);
@@ -167,11 +164,7 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if(!BaseMath_ReadCallback(mat))
return NULL;
- argSize = mat->rowSize; //rows
- seqSize = mat->colSize; //col
- for(i = 0; i < (seqSize * argSize); i++){
- matrix[i] = mat->contigPtr[i];
- }
+ memcpy(matrix, mat->contigPtr, sizeof(float) * mat->rowSize * mat->colSize);
}
}else{ //2-4 arguments (all seqs? all same size?)
for(i =0; i < argSize; i++){
@@ -216,7 +209,7 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
}
}
- return newMatrixObject(matrix, argSize, seqSize, Py_NEW);
+ return newMatrixObject(matrix, argSize, seqSize, Py_NEW, NULL);
}
/*-----------------------------METHODS----------------------------*/
@@ -239,14 +232,16 @@ static PyObject *Matrix_toQuat(MatrixObject * self)
Mat4ToQuat((float (*)[4])*self->matrix, quat);
}
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
/*---------------------------Matrix.toEuler() --------------------*/
PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args)
{
float eul[3], eul_compatf[3];
EulerObject *eul_compat = NULL;
+#ifdef USE_MATHUTILS_DEG
int x;
+#endif
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -288,7 +283,7 @@ PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args)
eul[x] *= (float) (180 / Py_PI);
}
#endif
- return newEulerObject(eul, Py_NEW);
+ return newEulerObject(eul, Py_NEW, NULL);
}
/*---------------------------Matrix.resize4x4() ------------------*/
PyObject *Matrix_Resize4x4(MatrixObject * self)
@@ -364,7 +359,7 @@ PyObject *Matrix_TranslationPart(MatrixObject * self)
vec[1] = self->matrix[3][1];
vec[2] = self->matrix[3][2];
- return newVectorObject(vec, 3, Py_NEW);
+ return newVectorObject(vec, 3, Py_NEW, NULL);
}
/*---------------------------Matrix.rotationPart() ---------------*/
PyObject *Matrix_RotationPart(MatrixObject * self)
@@ -390,7 +385,7 @@ PyObject *Matrix_RotationPart(MatrixObject * self)
mat[7] = self->matrix[2][1];
mat[8] = self->matrix[2][2];
- return newMatrixObject(mat, 3, 3, Py_NEW);
+ return newMatrixObject(mat, 3, 3, Py_NEW, Py_TYPE(self));
}
/*---------------------------Matrix.scalePart() --------------------*/
PyObject *Matrix_scalePart(MatrixObject * self)
@@ -419,7 +414,7 @@ PyObject *Matrix_scalePart(MatrixObject * self)
scale[0]= tmat[0][0];
scale[1]= tmat[1][1];
scale[2]= tmat[2][2];
- return newVectorObject(scale, 3, Py_NEW);
+ return newVectorObject(scale, 3, Py_NEW, NULL);
}
/*---------------------------Matrix.invert() ---------------------*/
PyObject *Matrix_Invert(MatrixObject * self)
@@ -589,7 +584,7 @@ PyObject *Matrix_copy(MatrixObject * self)
if(!BaseMath_ReadCallback(self))
return NULL;
- return (PyObject*)(MatrixObject*)newMatrixObject((float (*))*self->matrix, self->rowSize, self->colSize, Py_NEW);
+ return (PyObject*)newMatrixObject((float (*))*self->matrix, self->rowSize, self->colSize, Py_NEW, Py_TYPE(self));
}
/*----------------------------print object (internal)-------------*/
@@ -603,18 +598,18 @@ static PyObject *Matrix_repr(MatrixObject * self)
return NULL;
BLI_strncpy(str,"",1024);
- for(x = 0; x < self->rowSize; x++){
+ for(x = 0; x < self->colSize; x++){
sprintf(buffer, "[");
strcat(str,buffer);
- for(y = 0; y < (self->colSize - 1); y++) {
- sprintf(buffer, "%.6f, ", self->matrix[x][y]);
+ for(y = 0; y < (self->rowSize - 1); y++) {
+ sprintf(buffer, "%.6f, ", self->matrix[y][x]);
strcat(str,buffer);
}
- if(x < (self->rowSize-1)){
- sprintf(buffer, "%.6f](matrix [row %d])\n", self->matrix[x][y], x);
+ if(x < (self->colSize-1)){
+ sprintf(buffer, "%.6f](matrix [row %d])\n", self->matrix[y][x], x);
strcat(str,buffer);
}else{
- sprintf(buffer, "%.6f](matrix [row %d])", self->matrix[x][y], x);
+ sprintf(buffer, "%.6f](matrix [row %d])", self->matrix[y][x], x);
strcat(str,buffer);
}
}
@@ -674,8 +669,7 @@ static PyObject* Matrix_richcmpr(PyObject *objectA, PyObject *objectB, int compa
Py_RETURN_FALSE;
}
}
-/*------------------------tp_doc*/
-static char MatrixObject_doc[] = "This is a wrapper for matrix objects.";
+
/*---------------------SEQUENCE PROTOCOLS------------------------
----------------------------len(object)------------------------
sequence length*/
@@ -709,7 +703,7 @@ static int Matrix_ass_item(MatrixObject * self, int i, PyObject * ob)
return -1;
if(i >= self->rowSize || i < 0){
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad row\n");
+ PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad column\n");
return -1;
}
@@ -775,8 +769,7 @@ static PyObject *Matrix_slice(MatrixObject * self, int begin, int end)
}
/*----------------------------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 * seq)
{
int i, x, y, size, sub_size = 0;
float mat[16], f;
@@ -882,7 +875,7 @@ static PyObject *Matrix_add(PyObject * m1, PyObject * m2)
}
}
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW);
+ return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
}
/*------------------------obj - obj------------------------------
subtraction*/
@@ -915,7 +908,7 @@ static PyObject *Matrix_sub(PyObject * m1, PyObject * m2)
}
}
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW);
+ return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
}
/*------------------------obj * obj------------------------------
mulplication*/
@@ -940,21 +933,21 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
}
if(mat1 && mat2) { /*MATRIX * MATRIX*/
- if(mat1->colSize != mat2->rowSize){
+ if(mat1->rowSize != mat2->colSize){
PyErr_SetString(PyExc_AttributeError,"Matrix multiplication: matrix A rowsize must equal matrix B colsize");
return NULL;
}
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat2->colSize; y++) {
- for(z = 0; z < mat1->colSize; z++) {
- dot += (mat1->matrix[x][z] * mat2->matrix[z][y]);
+ 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->rowSize) + y)] = (float)dot;
+ mat[((x * mat1->colSize) + y)] = (float)dot;
dot = 0.0f;
}
}
- return newMatrixObject(mat, mat1->rowSize, mat2->colSize, Py_NEW);
+ return newMatrixObject(mat, mat2->rowSize, mat1->colSize, Py_NEW, NULL);
}
if(mat1==NULL){
@@ -965,7 +958,7 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
mat[((x * mat2->colSize) + y)] = scalar * mat2->matrix[x][y];
}
}
- return newMatrixObject(mat, mat2->rowSize, mat2->colSize, Py_NEW);
+ return newMatrixObject(mat, mat2->rowSize, mat2->colSize, Py_NEW, NULL);
}
PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
@@ -984,7 +977,7 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
mat[((x * mat1->colSize) + y)] = scalar * mat1->matrix[x][y];
}
}
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW);
+ return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
}
}
PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
@@ -1004,7 +997,7 @@ static PyObject* Matrix_inv(MatrixObject *self)
/*-----------------PROTOCOL DECLARATIONS--------------------------*/
static PySequenceMethods Matrix_SeqMethods = {
- (inquiry) Matrix_len, /* sq_length */
+ (lenfunc) Matrix_len, /* sq_length */
(binaryfunc) 0, /* sq_concat */
(ssizeargfunc) 0, /* sq_repeat */
(ssizeargfunc) Matrix_item, /* sq_item */
@@ -1012,30 +1005,116 @@ static PySequenceMethods Matrix_SeqMethods = {
(ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */
(ssizessizeobjargproc) Matrix_ass_slice, /* sq_ass_slice */
};
+
+
+static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (i < 0)
+ i += self->rowSize;
+ 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)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyList_New(0);
+ }
+ else if (step == 1) {
+ return Matrix_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "vector indices must be integers, not %.200s",
+ item->ob_type->tp_name);
+ return NULL;
+ }
+}
+
+static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* value)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0)
+ i += self->rowSize;
+ 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)
+ return -1;
+
+ if (step == 1)
+ return Matrix_ass_slice(self, start, stop, value);
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+ return -1;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "matrix indices must be integers, not %.200s",
+ item->ob_type->tp_name);
+ return -1;
+ }
+}
+
+static PyMappingMethods Matrix_AsMapping = {
+ (lenfunc)Matrix_len,
+ (binaryfunc)Matrix_subscript,
+ (objobjargproc)Matrix_ass_subscript
+};
+
+
static PyNumberMethods Matrix_NumMethods = {
- (binaryfunc) Matrix_add, /* __add__ */
- (binaryfunc) Matrix_sub, /* __sub__ */
- (binaryfunc) Matrix_mul, /* __mul__ */
- (binaryfunc) 0, /* __div__ */
- (binaryfunc) 0, /* __mod__ */
- (binaryfunc) 0, /* __divmod__ */
- (ternaryfunc) 0, /* __pow__ */
- (unaryfunc) 0, /* __neg__ */
- (unaryfunc) 0, /* __pos__ */
- (unaryfunc) 0, /* __abs__ */
- (inquiry) 0, /* __nonzero__ */
- (unaryfunc) Matrix_inv, /* __invert__ */
- (binaryfunc) 0, /* __lshift__ */
- (binaryfunc) 0, /* __rshift__ */
- (binaryfunc) 0, /* __and__ */
- (binaryfunc) 0, /* __xor__ */
- (binaryfunc) 0, /* __or__ */
- /*(coercion)*/ 0, /* __coerce__ */
- (unaryfunc) 0, /* __int__ */
- (unaryfunc) 0, /* __long__ */
- (unaryfunc) 0, /* __float__ */
- (unaryfunc) 0, /* __oct__ */
- (unaryfunc) 0, /* __hex__ */
+ (binaryfunc) Matrix_add, /*nb_add*/
+ (binaryfunc) Matrix_sub, /*nb_subtract*/
+ (binaryfunc) Matrix_mul, /*nb_multiply*/
+ 0, /*nb_remainder*/
+ 0, /*nb_divmod*/
+ 0, /*nb_power*/
+ (unaryfunc) 0, /*nb_negative*/
+ (unaryfunc) 0, /*tp_positive*/
+ (unaryfunc) 0, /*tp_absolute*/
+ (inquiry) 0, /*tp_bool*/
+ (unaryfunc) Matrix_inv, /*nb_invert*/
+ 0, /*nb_lshift*/
+ (binaryfunc)0, /*nb_rshift*/
+ 0, /*nb_and*/
+ 0, /*nb_xor*/
+ 0, /*nb_or*/
+ 0, /*nb_int*/
+ 0, /*nb_reserved*/
+ 0, /*nb_float*/
+ 0, /* nb_inplace_add */
+ 0, /* nb_inplace_subtract */
+ 0, /* nb_inplace_multiply */
+ 0, /* nb_inplace_remainder */
+ 0, /* nb_inplace_power */
+ 0, /* nb_inplace_lshift */
+ 0, /* nb_inplace_rshift */
+ 0, /* nb_inplace_and */
+ 0, /* nb_inplace_xor */
+ 0, /* nb_inplace_or */
+ 0, /* nb_floor_divide */
+ 0, /* nb_true_divide */
+ 0, /* nb_inplace_floor_divide */
+ 0, /* nb_inplace_true_divide */
+ 0, /* nb_index */
};
static PyObject *Matrix_getRowSize( MatrixObject * self, void *type )
@@ -1062,13 +1141,7 @@ static PyGetSetDef Matrix_getseters[] = {
/*------------------PY_OBECT DEFINITION--------------------------*/
PyTypeObject matrix_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"matrix", /*tp_name*/
sizeof(MatrixObject), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -1080,15 +1153,15 @@ PyTypeObject matrix_Type = {
(reprfunc) Matrix_repr, /*tp_repr*/
&Matrix_NumMethods, /*tp_as_number*/
&Matrix_SeqMethods, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
+ &Matrix_AsMapping, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- MatrixObject_doc, /*tp_doc*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ 0, /*tp_doc*/
0, /*tp_traverse*/
0, /*tp_clear*/
(richcmpfunc)Matrix_richcmpr, /*tp_richcompare*/
@@ -1132,7 +1205,7 @@ self->matrix[1][1] = self->contigPtr[4] */
(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)
+PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type)
{
MatrixObject *self;
int x, row, col;
@@ -1143,7 +1216,9 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type)
return NULL;
}
- self = PyObject_NEW(MatrixObject, &matrix_Type);
+ 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;
@@ -1201,7 +1276,7 @@ PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type)
PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb_type, int cb_subtype)
{
- MatrixObject *self= (MatrixObject *)newMatrixObject(NULL, rowSize, colSize, Py_NEW);
+ MatrixObject *self= (MatrixObject *)newMatrixObject(NULL, rowSize, colSize, Py_NEW, NULL);
if(self) {
Py_INCREF(cb_user);
self->cb_user= cb_user;
@@ -1213,9 +1288,9 @@ PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb
//----------------column_vector_multiplication (internal)---------
//COLUMN VECTOR Multiplication (Matrix X Vector)
-// [1][2][3] [a]
-// [4][5][6] * [b]
-// [7][8][9] [c]
+// [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)
{
@@ -1237,14 +1312,15 @@ static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject*
for(x = 0; x < vec->size; x++){
vecCopy[x] = vec->vec[x];
- }
+ }
+ vecNew[3] = 1.0f;
- for(x = 0; x < mat->rowSize; x++) {
- for(y = 0; y < mat->colSize; y++) {
- dot += mat->matrix[x][y] * vecCopy[y];
+ for(x = 0; x < mat->colSize; z++) {
+ 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);
+ return newVectorObject(vecNew, vec->size, Py_NEW, NULL);
}
diff --git a/source/blender/python/generic/matrix.h b/source/blender/python/generic/matrix.h
index 4b073668969..856c711c4ef 100644
--- a/source/blender/python/generic/matrix.h
+++ b/source/blender/python/generic/matrix.h
@@ -33,8 +33,7 @@
#include <Python.h>
extern PyTypeObject matrix_Type;
-
-#define MatrixObject_Check(v) ((v)->ob_type == &matrix_Type)
+#define MatrixObject_Check(_v) PyObject_TypeCheck((_v), &matrix_Type)
typedef float **ptRow;
typedef struct _Matrix { /* keep aligned with BaseMathObject in Mathutils.h */
@@ -58,7 +57,7 @@ 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);
+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);
extern int mathutils_matrix_vector_cb_index;
diff --git a/source/blender/python/generic/quat.c b/source/blender/python/generic/quat.c
index e7413d38ee5..7e12fe7925a 100644
--- a/source/blender/python/generic/quat.c
+++ b/source/blender/python/generic/quat.c
@@ -34,16 +34,6 @@
//-------------------------DOC STRINGS ---------------------------
-static char Quaternion_Identity_doc[] = "() - set the quaternion to it's identity (1, vector)";
-static char Quaternion_Negate_doc[] = "() - set all values in the quaternion to their negative";
-static char Quaternion_Conjugate_doc[] = "() - set the quaternion to it's conjugate";
-static char Quaternion_Inverse_doc[] = "() - set the quaternion to it's inverse";
-static char Quaternion_Normalize_doc[] = "() - normalize the vector portion of the quaternion";
-static char Quaternion_ToEuler_doc[] = "(eul_compat) - return a euler rotation representing the quaternion, optional euler argument that the new euler will be made compatible with.";
-static char Quaternion_ToMatrix_doc[] = "() - return a rotation matrix representing the quaternion";
-static char Quaternion_Cross_doc[] = "(other) - return the cross product between this quaternion and another";
-static char Quaternion_Dot_doc[] = "(other) - return the dot product between this quaternion and another";
-static char Quaternion_copy_doc[] = "() - return a copy of the quat";
static PyObject *Quaternion_Identity( QuaternionObject * self );
static PyObject *Quaternion_Negate( QuaternionObject * self );
@@ -58,17 +48,17 @@ static PyObject *Quaternion_copy( QuaternionObject * self );
//-----------------------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},
- {"toEuler", (PyCFunction) Quaternion_ToEuler, METH_VARARGS, Quaternion_ToEuler_doc},
- {"toMatrix", (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},
- {"__copy__", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
- {"copy", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
+ {"identity", (PyCFunction) Quaternion_Identity, METH_NOARGS, NULL},
+ {"negate", (PyCFunction) Quaternion_Negate, METH_NOARGS, NULL},
+ {"conjugate", (PyCFunction) Quaternion_Conjugate, METH_NOARGS, NULL},
+ {"inverse", (PyCFunction) Quaternion_Inverse, METH_NOARGS, NULL},
+ {"normalize", (PyCFunction) Quaternion_Normalize, METH_NOARGS, NULL},
+ {"toEuler", (PyCFunction) Quaternion_ToEuler, METH_VARARGS, NULL},
+ {"toMatrix", (PyCFunction) Quaternion_ToMatrix, METH_NOARGS, NULL},
+ {"cross", (PyCFunction) Quaternion_Cross, METH_O, NULL},
+ {"dot", (PyCFunction) Quaternion_Dot, METH_O, NULL},
+ {"__copy__", (PyCFunction) Quaternion_copy, METH_NOARGS, NULL},
+ {"copy", (PyCFunction) Quaternion_copy, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -127,7 +117,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
}
}
} else if (size == 0) { //returns a new empty quat
- return newQuaternionObject(NULL, Py_NEW);
+ return newQuaternionObject(NULL, Py_NEW, NULL);
} else {
listObject = args;
}
@@ -167,7 +157,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
AxisAngleToQuat(quat, quat, angle);
#endif
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//-----------------------------METHODS------------------------------
@@ -177,7 +167,6 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
{
float eul[3];
EulerObject *eul_compat = NULL;
- int x;
if(!PyArg_ParseTuple(args, "|O!:toEuler", &euler_Type, &eul_compat))
return NULL;
@@ -186,7 +175,7 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
return NULL;
if(eul_compat) {
- float mat[3][3], eul_compatf[3];
+ float mat[3][3];
if(!BaseMath_ReadCallback(eul_compat))
return NULL;
@@ -194,10 +183,15 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
QuatToMat3(self->quat, mat);
#ifdef USE_MATHUTILS_DEG
- for(x = 0; x < 3; x++) {
- eul_compatf[x] = eul_compat->eul[x] * ((float)Py_PI / 180);
+ {
+ float eul_compatf[3];
+ int x;
+
+ for(x = 0; x < 3; x++) {
+ eul_compatf[x] = eul_compat->eul[x] * ((float)Py_PI / 180);
+ }
+ Mat3ToCompatibleEul(mat, eul, eul_compatf);
}
- Mat3ToCompatibleEul(mat, eul, eul_compatf);
#else
Mat3ToCompatibleEul(mat, eul, eul_compat->eul);
#endif
@@ -207,11 +201,15 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
}
#ifdef USE_MATHUTILS_DEG
- for(x = 0; x < 3; x++) {
- eul[x] *= (180 / (float)Py_PI);
+ {
+ int x;
+
+ for(x = 0; x < 3; x++) {
+ eul[x] *= (180 / (float)Py_PI);
+ }
}
#endif
- return newEulerObject(eul, Py_NEW);
+ return newEulerObject(eul, Py_NEW, NULL);
}
//----------------------------Quaternion.toMatrix()------------------
//return the quat as a matrix
@@ -223,7 +221,7 @@ static PyObject *Quaternion_ToMatrix(QuaternionObject * self)
return NULL;
QuatToMat3(self->quat, (float (*)[3]) mat);
- return newMatrixObject(mat, 3, 3, Py_NEW);
+ return newMatrixObject(mat, 3, 3, Py_NEW, NULL);
}
//----------------------------Quaternion.cross(other)------------------
@@ -241,7 +239,7 @@ static PyObject *Quaternion_Cross(QuaternionObject * self, QuaternionObject * va
return NULL;
QuatMul(quat, self->quat, value->quat);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//----------------------------Quaternion.dot(other)------------------
@@ -331,7 +329,7 @@ static PyObject *Quaternion_copy(QuaternionObject * self)
if(!BaseMath_ReadCallback(self))
return NULL;
- return newQuaternionObject(self->quat, Py_NEW);
+ return newQuaternionObject(self->quat, Py_NEW, Py_TYPE(self));
}
//----------------------------print object (internal)--------------
@@ -394,8 +392,7 @@ static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int c
Py_RETURN_FALSE;
}
}
-//------------------------tp_doc
-static char QuaternionObject_doc[] = "This is a wrapper for quaternion objects.";
+
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
@@ -529,7 +526,7 @@ static PyObject *Quaternion_add(PyObject * q1, PyObject * q2)
return NULL;
QuatAdd(quat, quat1->quat, quat2->quat, 1.0f);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//------------------------obj - obj------------------------------
//subtraction
@@ -554,7 +551,7 @@ static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2)
quat[x] = quat1->quat[x] - quat2->quat[x];
}
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
//------------------------obj * obj------------------------------
//mulplication
@@ -585,7 +582,7 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
if ((scalar == -1.0 && PyErr_Occurred())==0) { /* FLOAT*QUAT */
QUATCOPY(quat, quat2->quat);
QuatMulf(quat, scalar);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: val * quat, val is not an acceptable type");
return NULL;
@@ -604,7 +601,7 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
if ((scalar == -1.0 && PyErr_Occurred())==0) { /* QUAT*FLOAT */
QUATCOPY(quat, quat1->quat);
QuatMulf(quat, scalar);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
}
@@ -614,7 +611,7 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
//-----------------PROTOCOL DECLARATIONS--------------------------
static PySequenceMethods Quaternion_SeqMethods = {
- (inquiry) Quaternion_len, /* sq_length */
+ (lenfunc) Quaternion_len, /* sq_length */
(binaryfunc) 0, /* sq_concat */
(ssizeargfunc) 0, /* sq_repeat */
(ssizeargfunc) Quaternion_item, /* sq_item */
@@ -622,34 +619,44 @@ static PySequenceMethods Quaternion_SeqMethods = {
(ssizeobjargproc) Quaternion_ass_item, /* sq_ass_item */
(ssizessizeobjargproc) Quaternion_ass_slice, /* sq_ass_slice */
};
-static PyNumberMethods Quaternion_NumMethods = {
- (binaryfunc) Quaternion_add, /* __add__ */
- (binaryfunc) Quaternion_sub, /* __sub__ */
- (binaryfunc) Quaternion_mul, /* __mul__ */
- (binaryfunc) 0, /* __div__ */
- (binaryfunc) 0, /* __mod__ */
- (binaryfunc) 0, /* __divmod__ */
- (ternaryfunc) 0, /* __pow__ */
- (unaryfunc) 0, /* __neg__ */
- (unaryfunc) 0, /* __pos__ */
- (unaryfunc) 0, /* __abs__ */
- (inquiry) 0, /* __nonzero__ */
- (unaryfunc) 0, /* __invert__ */
- (binaryfunc) 0, /* __lshift__ */
- (binaryfunc) 0, /* __rshift__ */
- (binaryfunc) 0, /* __and__ */
- (binaryfunc) 0, /* __xor__ */
- (binaryfunc) 0, /* __or__ */
- /*(coercion)*/ 0, /* __coerce__ */
- (unaryfunc) 0, /* __int__ */
- (unaryfunc) 0, /* __long__ */
- (unaryfunc) 0, /* __float__ */
- (unaryfunc) 0, /* __oct__ */
- (unaryfunc) 0, /* __hex__ */
+static PyNumberMethods Quaternion_NumMethods = {
+ (binaryfunc) Quaternion_add, /*nb_add*/
+ (binaryfunc) Quaternion_sub, /*nb_subtract*/
+ (binaryfunc) Quaternion_mul, /*nb_multiply*/
+ 0, /*nb_remainder*/
+ 0, /*nb_divmod*/
+ 0, /*nb_power*/
+ (unaryfunc) 0, /*nb_negative*/
+ (unaryfunc) 0, /*tp_positive*/
+ (unaryfunc) 0, /*tp_absolute*/
+ (inquiry) 0, /*tp_bool*/
+ (unaryfunc) 0, /*nb_invert*/
+ 0, /*nb_lshift*/
+ (binaryfunc)0, /*nb_rshift*/
+ 0, /*nb_and*/
+ 0, /*nb_xor*/
+ 0, /*nb_or*/
+ 0, /*nb_int*/
+ 0, /*nb_reserved*/
+ 0, /*nb_float*/
+ 0, /* nb_inplace_add */
+ 0, /* nb_inplace_subtract */
+ 0, /* nb_inplace_multiply */
+ 0, /* nb_inplace_remainder */
+ 0, /* nb_inplace_power */
+ 0, /* nb_inplace_lshift */
+ 0, /* nb_inplace_rshift */
+ 0, /* nb_inplace_and */
+ 0, /* nb_inplace_xor */
+ 0, /* nb_inplace_or */
+ 0, /* nb_floor_divide */
+ 0, /* nb_true_divide */
+ 0, /* nb_inplace_floor_divide */
+ 0, /* nb_inplace_true_divide */
+ 0, /* nb_index */
};
-
static PyObject *Quaternion_getAxis( QuaternionObject * self, void *type )
{
return Quaternion_item(self, GET_INT_FROM_POINTER(type));
@@ -692,7 +699,7 @@ static PyObject *Quaternion_getAxisVec( QuaternionObject * self, void *type )
EXPP_FloatsAreEqual(vec[2], 0.0f, 10) ){
vec[0] = 1.0f;
}
- return (PyObject *) newVectorObject(vec, 3, Py_NEW);
+ return (PyObject *) newVectorObject(vec, 3, Py_NEW, NULL);
}
@@ -743,13 +750,7 @@ static PyGetSetDef Quaternion_getseters[] = {
//------------------PY_OBECT DEFINITION--------------------------
PyTypeObject quaternion_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"quaternion", //tp_name
sizeof(QuaternionObject), //tp_basicsize
0, //tp_itemsize
@@ -768,8 +769,8 @@ PyTypeObject quaternion_Type = {
0, //tp_getattro
0, //tp_setattro
0, //tp_as_buffer
- Py_TPFLAGS_DEFAULT, //tp_flags
- QuaternionObject_doc, //tp_doc
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ 0, //tp_doc
0, //tp_traverse
0, //tp_clear
(richcmpfunc)Quaternion_richcmpr, //tp_richcompare
@@ -802,11 +803,12 @@ PyTypeObject quaternion_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 *newQuaternionObject(float *quat, int type)
+PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
{
QuaternionObject *self;
- self = PyObject_NEW(QuaternionObject, &quaternion_Type);
+ if(base_type) self = (QuaternionObject *)base_type->tp_alloc(base_type, 0);
+ else self = PyObject_NEW(QuaternionObject, &quaternion_Type);
/* init callbacks as NULL */
self->cb_user= NULL;
@@ -831,7 +833,7 @@ PyObject *newQuaternionObject(float *quat, int type)
PyObject *newQuaternionObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
{
- QuaternionObject *self= (QuaternionObject *)newQuaternionObject(NULL, Py_NEW);
+ QuaternionObject *self= (QuaternionObject *)newQuaternionObject(NULL, Py_NEW, NULL);
if(self) {
Py_INCREF(cb_user);
self->cb_user= cb_user;
diff --git a/source/blender/python/generic/quat.h b/source/blender/python/generic/quat.h
index 2e74b5fa7f9..a1d01b4982d 100644
--- a/source/blender/python/generic/quat.h
+++ b/source/blender/python/generic/quat.h
@@ -32,11 +32,9 @@
#define EXPP_quat_h
#include <Python.h>
-#include "../intern/bpy_compat.h"
extern PyTypeObject quaternion_Type;
-
-#define QuaternionObject_Check(v) (Py_TYPE(v) == &quaternion_Type)
+#define QuaternionObject_Check(_v) PyObject_TypeCheck((_v), &quaternion_Type)
typedef struct { /* keep aligned with BaseMathObject in Mathutils.h */
PyObject_VAR_HEAD
@@ -55,7 +53,7 @@ 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 *newQuaternionObject( float *quat, int type );
+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 */
diff --git a/source/blender/python/generic/vector.c b/source/blender/python/generic/vector.c
index 9ce0a7ca2f9..605f45be128 100644
--- a/source/blender/python/generic/vector.c
+++ b/source/blender/python/generic/vector.c
@@ -41,19 +41,6 @@
static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat); /* utility func */
-/*-------------------------DOC STRINGS ---------------------------*/
-static char Vector_Zero_doc[] = "() - set all values in the vector to 0";
-static char Vector_Normalize_doc[] = "() - normalize the vector";
-static char Vector_Negate_doc[] = "() - changes vector to it's additive inverse";
-static char Vector_Resize2D_doc[] = "() - resize a vector to [x,y]";
-static char Vector_Resize3D_doc[] = "() - resize a vector to [x,y,z]";
-static char Vector_Resize4D_doc[] = "() - resize a vector to [x,y,z,w]";
-static char Vector_ToTrackQuat_doc[] = "(track, up) - extract a quaternion from the vector and the track and up axis";
-static char Vector_Reflect_doc[] = "(mirror) - return a vector reflected on the mirror normal";
-static char Vector_Cross_doc[] = "(other) - return the cross product between this vector and another";
-static char Vector_Dot_doc[] = "(other) - return the dot product between this vector and another";
-static char Vector_copy_doc[] = "() - return a copy of the vector";
-static char Vector_swizzle_doc[] = "Swizzle: Get or set axes in specified order";
/*-----------------------METHOD DEFINITIONS ----------------------*/
static PyObject *Vector_Zero( VectorObject * self );
static PyObject *Vector_Normalize( VectorObject * self );
@@ -68,18 +55,18 @@ static PyObject *Vector_Dot( VectorObject * self, VectorObject * value );
static PyObject *Vector_copy( VectorObject * self );
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},
- {"toTrackQuat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, Vector_ToTrackQuat_doc},
- {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, Vector_Reflect_doc},
- {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Dot_doc},
- {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Cross_doc},
- {"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
- {"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
+ {"zero", (PyCFunction) Vector_Zero, METH_NOARGS, NULL},
+ {"normalize", (PyCFunction) Vector_Normalize, METH_NOARGS, NULL},
+ {"negate", (PyCFunction) Vector_Negate, METH_NOARGS, NULL},
+ {"resize2D", (PyCFunction) Vector_Resize2D, METH_NOARGS, NULL},
+ {"resize3D", (PyCFunction) Vector_Resize3D, METH_NOARGS, NULL},
+ {"resize4D", (PyCFunction) Vector_Resize4D, METH_NOARGS, NULL},
+ {"toTrackQuat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, NULL},
+ {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, NULL},
+ {"cross", ( PyCFunction ) Vector_Cross, METH_O, NULL},
+ {"dot", ( PyCFunction ) Vector_Dot, METH_O, NULL},
+ {"copy", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
+ {"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -104,7 +91,7 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
} else if (size == 0) {
//returns a new empty 3d vector
- return newVectorObject(NULL, 3, Py_NEW);
+ return newVectorObject(NULL, 3, Py_NEW, type);
} else {
listObject = args;
}
@@ -131,7 +118,7 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
vec[i]= f;
Py_DECREF(v);
}
- return newVectorObject(vec, size, Py_NEW);
+ return newVectorObject(vec, size, Py_NEW, type);
}
/*-----------------------------METHODS---------------------------- */
@@ -181,7 +168,7 @@ static PyObject *Vector_Resize2D(VectorObject * self)
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.resize2d(): cannot resize a vector that has an owner");
return NULL;
}
@@ -204,7 +191,7 @@ static PyObject *Vector_Resize3D(VectorObject * self)
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.resize3d(): cannot resize a vector that has an owner");
return NULL;
}
@@ -362,23 +349,17 @@ static PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args )
vectoquat(vec, track, up, quat);
- return newQuaternionObject(quat, Py_NEW);
+ return newQuaternionObject(quat, Py_NEW, NULL);
}
/*----------------------------Vector.reflect(mirror) ----------------------
return a reflected vector on the mirror normal
- ((2 * DotVecs(vec, mirror)) * mirror) - vec
- using arithb.c would be nice here */
+ vec - ((2 * DotVecs(vec, mirror)) * mirror)
+*/
static PyObject *Vector_Reflect( VectorObject * self, VectorObject * value )
{
- float mirror[3];
- float vec[3];
- float reflect[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- float dot2;
-
- /* for normalizing */
- int i;
- float norm = 0.0f;
+ 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" );
@@ -393,28 +374,14 @@ static PyObject *Vector_Reflect( VectorObject * self, VectorObject * value )
if (value->size > 2) mirror[2] = value->vec[2];
else mirror[2] = 0.0;
- /* normalize, whos idea was it not to use arithb.c? :-/ */
- for(i = 0; i < 3; i++) {
- norm += mirror[i] * mirror[i];
- }
- norm = (float) sqrt(norm);
- for(i = 0; i < 3; i++) {
- mirror[i] /= norm;
- }
- /* done */
-
vec[0] = self->vec[0];
vec[1] = self->vec[1];
if (self->size > 2) vec[2] = self->vec[2];
else vec[2] = 0.0;
- dot2 = 2 * vec[0]*mirror[0]+vec[1]*mirror[1]+vec[2]*mirror[2];
+ VecReflect(reflect, vec, mirror);
- reflect[0] = (dot2 * mirror[0]) - vec[0];
- reflect[1] = (dot2 * mirror[1]) - vec[1];
- reflect[2] = (dot2 * mirror[2]) - vec[2];
-
- return newVectorObject(reflect, self->size, Py_NEW);
+ return newVectorObject(reflect, self->size, Py_NEW, NULL);
}
static PyObject *Vector_Cross( VectorObject * self, VectorObject * value )
@@ -434,7 +401,7 @@ static PyObject *Vector_Cross( VectorObject * self, VectorObject * value )
if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
return NULL;
- vecCross = (VectorObject *)newVectorObject(NULL, 3, Py_NEW);
+ vecCross = (VectorObject *)newVectorObject(NULL, 3, Py_NEW, NULL);
Crossf(vecCross->vec, self->vec, value->vec);
return (PyObject *)vecCross;
}
@@ -470,7 +437,7 @@ static PyObject *Vector_copy(VectorObject * self)
if(!BaseMath_ReadCallback(self))
return NULL;
- return newVectorObject(self->vec, self->size, Py_NEW);
+ return newVectorObject(self->vec, self->size, Py_NEW, Py_TYPE(self));
}
/*----------------------------print object (internal)-------------
@@ -647,7 +614,7 @@ static PyObject *Vector_add(PyObject * v1, PyObject * v2)
for(i = 0; i < vec1->size; i++) {
vec[i] = vec1->vec[i] + vec2->vec[i];
}
- return newVectorObject(vec, vec1->size, Py_NEW);
+ return newVectorObject(vec, vec1->size, Py_NEW, NULL);
}
PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation....\n");
@@ -717,7 +684,7 @@ static PyObject *Vector_sub(PyObject * v1, PyObject * v2)
vec[i] = vec1->vec[i] - vec2->vec[i];
}
- return newVectorObject(vec, vec1->size, Py_NEW);
+ return newVectorObject(vec, vec1->size, Py_NEW, NULL);
}
/*------------------------obj -= obj------------------------------
@@ -812,7 +779,7 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
for(i = 0; i < vec1->size; i++) {
vec[i] = vec1->vec[i] * scalar;
}
- return newVectorObject(vec, vec1->size, Py_NEW);
+ return newVectorObject(vec, vec1->size, Py_NEW, NULL);
}
@@ -912,7 +879,7 @@ static PyObject *Vector_div(PyObject * v1, PyObject * v2)
for(i = 0; i < vec1->size; i++) {
vec[i] = vec1->vec[i] / scalar;
}
- return newVectorObject(vec, vec1->size, Py_NEW);
+ return newVectorObject(vec, vec1->size, Py_NEW, NULL);
}
/*------------------------obj /= obj------------------------------
@@ -960,11 +927,9 @@ static PyObject *Vector_neg(VectorObject *self)
vec[i] = -self->vec[i];
}
- return newVectorObject(vec, self->size, Py_NEW);
+ return newVectorObject(vec, self->size, Py_NEW, Py_TYPE(self));
}
-/*------------------------tp_doc*/
-static char VectorObject_doc[] = "This is a wrapper for vector objects.";
/*------------------------vec_magnitude_nosqrt (internal) - for comparing only */
static double vec_magnitude_nosqrt(float *data, int size)
{
@@ -1066,62 +1031,128 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
Py_RETURN_FALSE;
}
}
+
/*-----------------PROTCOL DECLARATIONS--------------------------*/
static PySequenceMethods Vector_SeqMethods = {
- (inquiry) Vector_len, /* sq_length */
+ (lenfunc) Vector_len, /* sq_length */
(binaryfunc) 0, /* sq_concat */
- (ssizeargfunc) 0, /* sq_repeat */
+ (ssizeargfunc) 0, /* sq_repeat */
(ssizeargfunc) Vector_item, /* sq_item */
- (ssizessizeargfunc) Vector_slice, /* sq_slice */
+ NULL, /* py3 deprecated slice func */
(ssizeobjargproc) Vector_ass_item, /* sq_ass_item */
- (ssizessizeobjargproc) Vector_ass_slice, /* sq_ass_slice */
+ NULL, /* py3 deprecated slice assign func */
+};
+
+static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (i < 0)
+ i += self->size;
+ return Vector_item(self, i);
+ } else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyList_New(0);
+ }
+ else if (step == 1) {
+ return Vector_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "vector indices must be integers, not %.200s",
+ item->ob_type->tp_name);
+ return NULL;
+ }
+}
+
+static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* value)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0)
+ i += self->size;
+ return Vector_ass_item(self, i, value);
+ }
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ return -1;
+
+ if (step == 1)
+ return Vector_ass_slice(self, start, stop, value);
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+ return -1;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "vector indices must be integers, not %.200s",
+ item->ob_type->tp_name);
+ return -1;
+ }
+}
+
+static PyMappingMethods Vector_AsMapping = {
+ (lenfunc)Vector_len,
+ (binaryfunc)Vector_subscript,
+ (objobjargproc)Vector_ass_subscript
};
-
+
+
static PyNumberMethods Vector_NumMethods = {
- (binaryfunc) Vector_add, /* __add__ */
- (binaryfunc) Vector_sub, /* __sub__ */
- (binaryfunc) Vector_mul, /* __mul__ */
- (binaryfunc) Vector_div, /* __div__ */
- (binaryfunc) NULL, /* __mod__ */
- (binaryfunc) NULL, /* __divmod__ */
- (ternaryfunc) NULL, /* __pow__ */
- (unaryfunc) Vector_neg, /* __neg__ */
- (unaryfunc) NULL, /* __pos__ */
- (unaryfunc) NULL, /* __abs__ */
- (inquiry) NULL, /* __nonzero__ */
- (unaryfunc) NULL, /* __invert__ */
- (binaryfunc) NULL, /* __lshift__ */
- (binaryfunc) NULL, /* __rshift__ */
- (binaryfunc) NULL, /* __and__ */
- (binaryfunc) NULL, /* __xor__ */
- (binaryfunc) NULL, /* __or__ */
- /*(coercion)*/ NULL, /* __coerce__ */
- (unaryfunc) NULL, /* __int__ */
- (unaryfunc) NULL, /* __long__ */
- (unaryfunc) NULL, /* __float__ */
- (unaryfunc) NULL, /* __oct__ */
- (unaryfunc) NULL, /* __hex__ */
-
- /* Added in release 2.0 */
- (binaryfunc) Vector_iadd, /*__iadd__*/
- (binaryfunc) Vector_isub, /*__isub__*/
- (binaryfunc) Vector_imul, /*__imul__*/
- (binaryfunc) Vector_idiv, /*__idiv__*/
- (binaryfunc) NULL, /*__imod__*/
- (ternaryfunc) NULL, /*__ipow__*/
- (binaryfunc) NULL, /*__ilshift__*/
- (binaryfunc) NULL, /*__irshift__*/
- (binaryfunc) NULL, /*__iand__*/
- (binaryfunc) NULL, /*__ixor__*/
- (binaryfunc) NULL, /*__ior__*/
-
- /* Added in release 2.2 */
- /* The following require the Py_TPFLAGS_HAVE_CLASS flag */
- (binaryfunc) NULL, /*__floordiv__ __rfloordiv__*/
- (binaryfunc) NULL, /*__truediv__ __rfloordiv__*/
- (binaryfunc) NULL, /*__ifloordiv__*/
- (binaryfunc) NULL, /*__itruediv__*/
+ (binaryfunc) Vector_add, /*nb_add*/
+ (binaryfunc) Vector_sub, /*nb_subtract*/
+ (binaryfunc) Vector_mul, /*nb_multiply*/
+ 0, /*nb_remainder*/
+ 0, /*nb_divmod*/
+ 0, /*nb_power*/
+ (unaryfunc) Vector_neg, /*nb_negative*/
+ (unaryfunc) 0, /*tp_positive*/
+ (unaryfunc) 0, /*tp_absolute*/
+ (inquiry) 0, /*tp_bool*/
+ (unaryfunc) 0, /*nb_invert*/
+ 0, /*nb_lshift*/
+ (binaryfunc)0, /*nb_rshift*/
+ 0, /*nb_and*/
+ 0, /*nb_xor*/
+ 0, /*nb_or*/
+ 0, /*nb_int*/
+ 0, /*nb_reserved*/
+ 0, /*nb_float*/
+ Vector_iadd, /* nb_inplace_add */
+ Vector_isub, /* nb_inplace_subtract */
+ Vector_imul, /* nb_inplace_multiply */
+ 0, /* nb_inplace_remainder */
+ 0, /* nb_inplace_power */
+ 0, /* nb_inplace_lshift */
+ 0, /* nb_inplace_rshift */
+ 0, /* nb_inplace_and */
+ 0, /* nb_inplace_xor */
+ 0, /* nb_inplace_or */
+ 0, /* nb_floor_divide */
+ Vector_div, /* nb_true_divide */
+ 0, /* nb_inplace_floor_divide */
+ Vector_idiv, /* nb_inplace_true_divide */
+ 0, /* nb_index */
};
+
/*------------------PY_OBECT DEFINITION--------------------------*/
/*
@@ -1216,7 +1247,7 @@ static PyObject *Vector_getSwizzle(VectorObject * self, void *closure)
/* Unpack the axes from the closure into an array. */
axisA = 0;
- swizzleClosure = (unsigned int) closure;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
while (swizzleClosure & SWIZZLE_VALID_AXIS)
{
axisB = swizzleClosure & SWIZZLE_AXIS;
@@ -1225,7 +1256,7 @@ static PyObject *Vector_getSwizzle(VectorObject * self, void *closure)
axisA++;
}
- return newVectorObject(vec, axisA, Py_NEW);
+ return newVectorObject(vec, axisA, Py_NEW, Py_TYPE(self));
}
/* Set the items of this vector using a swizzle.
@@ -1256,7 +1287,7 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur
/* 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 = (unsigned int) closure;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
while (swizzleClosure & SWIZZLE_VALID_AXIS)
{
axisA = swizzleClosure & SWIZZLE_AXIS;
@@ -1273,7 +1304,7 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur
/* Copy vector contents onto swizzled axes. */
vecVal = (VectorObject*) value;
axisB = 0;
- swizzleClosure = (unsigned int) closure;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
while (swizzleClosure & SWIZZLE_VALID_AXIS && axisB < vecVal->size)
{
axisA = swizzleClosure & SWIZZLE_AXIS;
@@ -1289,7 +1320,7 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur
{
/* Copy list contents onto swizzled axes. */
listLen = PyList_Size(value);
- swizzleClosure = (unsigned int) closure;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
axisB = 0;
while (swizzleClosure & SWIZZLE_VALID_AXIS && axisB < listLen)
{
@@ -1314,7 +1345,7 @@ static int Vector_setSwizzle(VectorObject * self, PyObject * value, void *closur
else if (((scalarVal = (float)PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred())==0)
{
/* Assign the same value to each axis. */
- swizzleClosure = (unsigned int) closure;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
while (swizzleClosure & SWIZZLE_VALID_AXIS)
{
axisA = swizzleClosure & SWIZZLE_AXIS;
@@ -1373,342 +1404,342 @@ static PyGetSetDef Vector_getseters[] = {
NULL},
/* autogenerated swizzle attrs, see python script below */
- {"xx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 36 */
- {"xxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 44 */
- {"xyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 52 */
- {"xzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 60 */
- {"xwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 37 */
- {"yxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 45 */
- {"yyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 53 */
- {"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 61 */
- {"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 38 */
- {"zxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 46 */
- {"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 54 */
- {"zzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 62 */
- {"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 39 */
- {"wxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 47 */
- {"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 55 */
- {"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 63 */
- {"wwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)((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 */
+ {"xx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 36 */
+ {"xxx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2476 */
+ {"xyzy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2988 */
+ {"xyzz", (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)) | ((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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2540 */
+ {"xywy", (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)) | ((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)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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2420 */
+ {"xzyy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2932 */
+ {"xzyz", (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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3572 */
+ {"xzww", (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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2428 */
+ {"xwyy", (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)) | ((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)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)) | ((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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3516 */
+ {"xwzw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4028 */
+ {"xww", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2469 */
+ {"yxzy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2981 */
+ {"yxzz", (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)) | ((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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2533 */
+ {"yxwy", (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)) | ((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)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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4069 */
+ {"yy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 45 */
+ {"yyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2357 */
+ {"yzxy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2869 */
+ {"yzxz", (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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3061 */
+ {"yzwz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3573 */
+ {"yzww", (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)) | ((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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2365 */
+ {"ywxy", (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)) | ((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)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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3901 */
+ {"ywy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3005 */
+ {"ywzz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3517 */
+ {"ywzw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4029 */
+ {"yww", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2406 */
+ {"zxyy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2918 */
+ {"zxyz", (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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3558 */
+ {"zxww", (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)) | ((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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2350 */
+ {"zyxy", (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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2862 */
+ {"zyxz", (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)) | ((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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3054 */
+ {"zywz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3566 */
+ {"zyww", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4078 */
+ {"zz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 54 */
+ {"zzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3390 */
+ {"zwxw", (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)) | ((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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2942 */
+ {"zwyz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3454 */
+ {"zwyw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3966 */
+ {"zwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2407 */
+ {"wxyy", (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)) | ((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)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)) | ((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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3495 */
+ {"wxzw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4007 */
+ {"wxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2351 */
+ {"wyxy", (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)) | ((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)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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3887 */
+ {"wyy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2991 */
+ {"wyzz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3503 */
+ {"wyzw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 4015 */
+ {"wyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)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)) | ((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)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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3383 */
+ {"wzxw", (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)) | ((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)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)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 2935 */
+ {"wzyz", (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)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3447 */
+ {"wzyw", (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)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, /* 3959 */
+ {"wzz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, /* 63 */
+ {"wwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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)Vector_setSwizzle, 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 */
};
@@ -1745,7 +1776,7 @@ items.sort(key = lambda a: a[0].replace('x', '0').replace('y', '1').replace('z',
unique = set()
for key, val in items:
num = eval(val)
- print '\t{"%s", %s(getter)Vector_getSwizzle, (setter)Vector_setSwizzle, Vector_swizzle_doc, (void *)((unsigned int)%s)}, // %s' % (key, (' '*(4-len(key))), axis_dict[key], num)
+ print '\t{"%s", %s(getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(%s)}, // %s' % (key, (' '*(4-len(key))), axis_dict[key], num)
unique.add(num)
if len(unique) != len(items):
@@ -1763,13 +1794,7 @@ if len(unique) != len(items):
*/
PyTypeObject vector_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
/* For printing, in format "<module>.<name>" */
"vector", /* char *tp_name; */
sizeof( VectorObject ), /* int tp_basicsize; */
@@ -1788,7 +1813,7 @@ PyTypeObject vector_Type = {
&Vector_NumMethods, /* PyNumberMethods *tp_as_number; */
&Vector_SeqMethods, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ &Vector_AsMapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
@@ -1802,8 +1827,8 @@ PyTypeObject vector_Type = {
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT,
- VectorObject_doc, /* char *tp_doc; Documentation string */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -1855,10 +1880,13 @@ 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)
+PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type)
{
int i;
- VectorObject *self = PyObject_NEW(VectorObject, &vector_Type);
+ VectorObject *self;
+
+ if(base_type) self = (VectorObject *)base_type->tp_alloc(base_type, 0);
+ else self = PyObject_NEW(VectorObject, &vector_Type);
if(size > 4 || size < 2)
return NULL;
@@ -1894,7 +1922,7 @@ PyObject *newVectorObject(float *vec, int size, int type)
PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_subtype)
{
float dummy[4] = {0.0, 0.0, 0.0, 0.0}; /* dummy init vector, callbacks will be used on access */
- VectorObject *self= (VectorObject *)newVectorObject(dummy, size, Py_NEW);
+ VectorObject *self= (VectorObject *)newVectorObject(dummy, size, Py_NEW, NULL);
if(self) {
Py_INCREF(cb_user);
self->cb_user= cb_user;
@@ -1907,9 +1935,9 @@ PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_su
//-----------------row_vector_multiplication (internal)-----------
//ROW VECTOR Multiplication - Vector X Matrix
-//[x][y][z] * [1][2][3]
-// [4][5][6]
-// [7][8][9]
+//[x][y][z] * [1][4][7]
+// [2][5][8]
+// [3][6][9]
//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat)
{
@@ -1918,7 +1946,7 @@ static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat
int x, y, z = 0, vec_size = vec->size;
if(mat->colSize != vec_size){
- if(mat->rowSize == 4 && vec_size != 3){
+ if(mat->colSize == 4 && vec_size != 3){
PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
return NULL;
}else{
@@ -1932,16 +1960,16 @@ static PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat
for(x = 0; x < vec_size; x++){
vecCopy[x] = vec->vec[x];
}
-
+ vecNew[3] = 1.0f;
//muliplication
- for(x = 0; x < mat->colSize; x++) {
- for(y = 0; y < mat->rowSize; y++) {
- dot += mat->matrix[y][x] * vecCopy[y];
+ for(x = 0; x < mat->rowSize; x++) {
+ for(y = 0; y < mat->colSize; y++) {
+ dot += mat->matrix[x][y] * vecCopy[y];
}
vecNew[z++] = (float)dot;
dot = 0.0f;
}
- return newVectorObject(vecNew, vec_size, Py_NEW);
+ return newVectorObject(vecNew, vec_size, Py_NEW, NULL);
}
/*----------------------------Vector.negate() --------------------
diff --git a/source/blender/python/generic/vector.h b/source/blender/python/generic/vector.h
index f519b2808cb..a13ec0f80f3 100644
--- a/source/blender/python/generic/vector.h
+++ b/source/blender/python/generic/vector.h
@@ -31,11 +31,9 @@
#define EXPP_vector_h
#include <Python.h>
-#include "../intern/bpy_compat.h"
extern PyTypeObject vector_Type;
-
-#define VectorObject_Check(v) (((PyObject *)v)->ob_type == &vector_Type)
+#define VectorObject_Check(_v) PyObject_TypeCheck((_v), &vector_Type)
typedef struct { /* keep aligned with BaseMathObject in Mathutils.h */
PyObject_VAR_HEAD
@@ -50,7 +48,7 @@ typedef struct { /* keep aligned with BaseMathObject in Mathutils.h */
} VectorObject;
/*prototypes*/
-PyObject *newVectorObject(float *vec, int size, int type);
+PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type);
PyObject *newVectorObject_cb(PyObject *user, int size, int callback_type, int subtype);
#endif /* EXPP_vector_h */
diff --git a/source/blender/python/intern/Makefile b/source/blender/python/intern/Makefile
index d210cfaf973..419092cbe21 100644
--- a/source/blender/python/intern/Makefile
+++ b/source/blender/python/intern/Makefile
@@ -43,7 +43,7 @@ CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
# PreProcessor stuff
CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include $(NAN_SDLCFLAGS)
+CPPFLAGS += $(NAN_SDLCFLAGS)
# modules
CPPFLAGS += -I../../editors/include
diff --git a/source/blender/python/intern/bpy_array.c b/source/blender/python/intern/bpy_array.c
new file mode 100644
index 00000000000..f11c95e7ed5
--- /dev/null
+++ b/source/blender/python/intern/bpy_array.c
@@ -0,0 +1,515 @@
+/**
+ *
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "Python.h"
+
+#include "bpy_rna.h"
+
+#include "RNA_access.h"
+
+#include "BLI_string.h"
+
+#include "BKE_global.h"
+
+#include "MEM_guardedalloc.h"
+
+#define MAX_ARRAY_DIMENSION 10
+
+typedef void (*ItemConvertFunc)(PyObject *, char *);
+typedef int (*ItemTypeCheckFunc)(PyObject *);
+typedef void (*RNA_SetArrayFunc)(PointerRNA *, PropertyRNA *, const char *);
+typedef void (*RNA_SetIndexFunc)(PointerRNA *, PropertyRNA *, int index, void *);
+
+/*
+ arr[3][4][5]
+ 0 1 2 <- dimension index
+*/
+
+/*
+ arr[2] = x
+
+ py_to_array_index(arraydim=0, arrayoffset=0, index=2)
+ validate_array(lvalue_dim=0)
+ ... make real index ...
+*/
+
+/* arr[3]=x, self->arraydim is 0, lvalue_dim is 1 */
+/* Ensures that a python sequence has expected number of items/sub-items and items are of desired type. */
+static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[],
+ ItemTypeCheckFunc check_item_type, const char *item_type_str, const char *error_prefix)
+{
+ int i;
+
+ /* not the last dimension */
+ if (dim + 1 < totdim) {
+ /* check that a sequence contains dimsize[dim] items */
+
+ for (i= 0; i < PySequence_Length(seq); 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);
+ ok= 0;
+ }
+ /* arr[3][4][5]
+ dimsize[1]=4
+ dimsize[2]=5
+
+ dim=0 */
+ else if (PySequence_Length(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;
+ }
+ else if (!validate_array_type(item, dim + 1, totdim, dimsize, check_item_type, item_type_str, error_prefix)) {
+ ok= 0;
+ }
+
+ Py_DECREF(item);
+
+ if (!ok)
+ return 0;
+ }
+ }
+ else {
+ /* check that items are of correct type */
+ for (i= 0; i < PySequence_Length(seq); 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);
+ return 0;
+ }
+
+ Py_DECREF(item);
+ }
+ }
+
+ return 1;
+}
+
+/* Returns the number of items in a single- or multi-dimensional sequence. */
+static int count_items(PyObject *seq)
+{
+ int totitem= 0;
+
+ if (PySequence_Check(seq)) {
+ int i;
+ for (i= 0; i < PySequence_Length(seq); i++) {
+ PyObject *item= PySequence_GetItem(seq, i);
+ totitem += count_items(item);
+ Py_DECREF(item);
+ }
+ }
+ else
+ totitem= 1;
+
+ return totitem;
+}
+
+/* Modifies property array length if needed and PROP_DYNAMIC flag is set. */
+static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int *totitem, const char *error_prefix)
+{
+ int dimsize[MAX_ARRAY_DIMENSION];
+ int tot, totdim, len;
+
+ tot= count_items(rvalue);
+ totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ if ((RNA_property_flag(prop) & PROP_DYNAMIC) && lvalue_dim == 0) {
+ if (RNA_property_array_length(ptr, prop) != tot) {
+#if 0
+ /* length is flexible */
+ if (!RNA_property_dynamic_array_set_length(ptr, prop, tot)) {
+ /* BLI_snprintf(error_str, error_str_size, "%s.%s: array length cannot be changed to %d", RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot); */
+ PyErr_Format(PyExc_ValueError, "%s %s.%s: array length cannot be changed to %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot);
+ return 0;
+ }
+#else
+ PyErr_Format(PyExc_ValueError, "%s %s.%s: array length cannot be changed to %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot);
+ return 0;
+#endif
+ }
+
+ len= tot;
+ }
+ else {
+ /* length is a constraint */
+ if (!lvalue_dim) {
+ len= RNA_property_array_length(ptr, prop);
+ }
+ /* array item assignment */
+ else {
+ int i;
+
+ len= 1;
+
+ /* arr[3][4][5]
+
+ arr[2] = x
+ dimsize={4, 5}
+ dimsize[1] = 4
+ dimsize[2] = 5
+ lvalue_dim=0, totdim=3
+
+ arr[2][3] = x
+ lvalue_dim=1
+
+ arr[2][3][4] = x
+ lvalue_dim=2 */
+ for (i= lvalue_dim; i < totdim; i++)
+ len *= dimsize[i];
+ }
+
+ 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);
+ return 0;
+ }
+ }
+
+ *totitem= len;
+
+ return 1;
+}
+
+static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, ItemTypeCheckFunc check_item_type, const char *item_type_str, int *totitem, const char *error_prefix)
+{
+ int dimsize[MAX_ARRAY_DIMENSION];
+ int totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ /* validate type first because length validation may modify property array length */
+
+ if (!validate_array_type(rvalue, lvalue_dim, totdim, dimsize, check_item_type, item_type_str, error_prefix))
+ return 0;
+
+ return validate_array_length(rvalue, ptr, prop, lvalue_dim, totitem, error_prefix);
+}
+
+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);
+
+ for (i= 0; i < PySequence_Length(seq); 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;
+ }
+ }
+
+ Py_DECREF(item);
+ }
+
+ return data;
+}
+
+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 totitem;
+ char *data= NULL;
+
+ totdim= RNA_property_array_dimension(ptr, prop, dim_size);
+
+ if (!validate_array(py, ptr, prop, 0, check_item_type, item_type_str, &totitem, error_prefix)) {
+ return 0;
+ }
+
+ if (totitem) {
+ if (!param_data || RNA_property_flag(prop) & PROP_DYNAMIC)
+ data= MEM_callocN(item_size * totitem, "pyrna primitive type array");
+ else
+ data= param_data;
+
+ copy_values(py, ptr, prop, 0, data, item_size, NULL, convert_item, NULL);
+
+ if (param_data) {
+ if (RNA_property_flag(prop) & PROP_DYNAMIC) {
+ /* not freeing allocated mem, RNA_parameter_list_free will do this */
+ *(char**)param_data= data;
+ }
+ }
+ else {
+ /* NULL can only pass through in case RNA property arraylength is 0 (impossible?) */
+ rna_set_array(ptr, prop, data);
+ MEM_freeN(data);
+ }
+ }
+
+ return 1;
+}
+
+static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int arrayoffset, int index, ItemTypeCheckFunc check_item_type, const char *item_type_str, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index, const char *error_prefix)
+{
+ int totdim, dimsize[MAX_ARRAY_DIMENSION];
+ int totitem, i;
+
+ totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ /* convert index */
+
+ /* arr[3][4][5]
+
+ arr[2] = x
+ lvalue_dim=0, index = 0 + 2 * 4 * 5
+
+ arr[2][3] = x
+ lvalue_dim=1, index = 40 + 3 * 5 */
+
+ lvalue_dim++;
+
+ for (i= lvalue_dim; i < totdim; i++)
+ index *= dimsize[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);
+
+ return 1;
+}
+
+static void py_to_float(PyObject *py, char *data)
+{
+ *(float*)data= (float)PyFloat_AsDouble(py);
+}
+
+static void py_to_int(PyObject *py, char *data)
+{
+ *(int*)data= (int)PyLong_AsSsize_t(py);
+}
+
+static void py_to_bool(PyObject *py, char *data)
+{
+ *(int*)data= (int)PyObject_IsTrue(py);
+}
+
+static int py_float_check(PyObject *py)
+{
+ /* accept both floats and integers */
+ return PyFloat_Check(py) || PyLong_Check(py);
+}
+
+static int py_int_check(PyObject *py)
+{
+ /* accept only integers */
+ return PyLong_Check(py);
+}
+
+static int py_bool_check(PyObject *py)
+{
+ return PyBool_Check(py);
+}
+
+static void float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_float_set_index(ptr, prop, index, *(float*)value);
+}
+
+static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_int_set_index(ptr, prop, index, *(int*)value);
+}
+
+static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_boolean_set_index(ptr, prop, index, *(int*)value);
+}
+
+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, 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, 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, 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");
+ ret= 0;
+ }
+
+ return ret;
+}
+
+int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix)
+{
+ int ret;
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_float_check, "float", py_to_float, float_set_index, error_prefix);
+ break;
+ case PROP_INT:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_int_check, "int", py_to_int, int_set_index, error_prefix);
+ break;
+ case PROP_BOOLEAN:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_bool_check, "boolean", py_to_bool, bool_set_index, error_prefix);
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "not an array type");
+ ret= 0;
+ }
+
+ return ret;
+}
+
+static PyObject *pyrna_array_item(PointerRNA *ptr, PropertyRNA *prop, int index)
+{
+ PyObject *item;
+
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ item= PyFloat_FromDouble(RNA_property_float_get_index(ptr, prop, index));
+ break;
+ case PROP_BOOLEAN:
+ item= PyBool_FromLong(RNA_property_boolean_get_index(ptr, prop, index));
+ break;
+ case PROP_INT:
+ item= PyLong_FromSsize_t(RNA_property_int_get_index(ptr, prop, index));
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "not an array type");
+ item= NULL;
+ }
+
+ return item;
+}
+
+#if 0
+/* XXX this is not used (and never will?) */
+/* Given an array property, creates an N-dimensional tuple of values. */
+static PyObject *pyrna_py_from_array_internal(PointerRNA *ptr, PropertyRNA *prop, int dim, int *index)
+{
+ PyObject *tuple;
+ int i, len;
+ int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+
+ len= RNA_property_multi_array_length(ptr, prop, dim);
+
+ tuple= PyTuple_New(len);
+
+ for (i= 0; i < len; i++) {
+ PyObject *item;
+
+ if (dim + 1 < totdim)
+ item= pyrna_py_from_array_internal(ptr, prop, dim + 1, index);
+ else {
+ item= pyrna_array_item(ptr, prop, *index);
+ *index= *index + 1;
+ }
+
+ if (!item) {
+ Py_DECREF(tuple);
+ return NULL;
+ }
+
+ PyTuple_SetItem(tuple, i, item);
+ }
+
+ return tuple;
+}
+#endif
+
+PyObject *pyrna_py_from_array_index(BPy_PropertyRNA *self, int index)
+{
+ int totdim, i, len;
+ int dimsize[MAX_ARRAY_DIMENSION];
+ BPy_PropertyRNA *ret= NULL;
+
+ /* just in case check */
+ len= RNA_property_multi_array_length(&self->ptr, self->prop, self->arraydim);
+ if (index >= len || index < 0) {
+ /* this shouldn't happen because higher level funcs must check for invalid index */
+ if (G.f & G_DEBUG) printf("pyrna_py_from_array_index: invalid index %d for array with length=%d\n", index, len);
+
+ PyErr_SetString(PyExc_IndexError, "out of range");
+ return NULL;
+ }
+
+ totdim= RNA_property_array_dimension(&self->ptr, self->prop, dimsize);
+
+ if (self->arraydim + 1 < totdim) {
+ ret= (BPy_PropertyRNA*)pyrna_prop_CreatePyObject(&self->ptr, self->prop);
+ ret->arraydim= self->arraydim + 1;
+
+ /* arr[3][4][5]
+
+ x = arr[2]
+ index = 0 + 2 * 4 * 5
+
+ x = arr[2][3]
+ index = offset + 3 * 5 */
+
+ for (i= self->arraydim + 1; i < totdim; i++)
+ index *= dimsize[i];
+
+ ret->arrayoffset= self->arrayoffset + index;
+ }
+ else {
+ index = self->arrayoffset + index;
+ ret= (BPy_PropertyRNA*)pyrna_array_item(&self->ptr, self->prop, index);
+ }
+
+ return (PyObject*)ret;
+}
+
+PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
+{
+ PyObject *ret;
+
+ ret= pyrna_math_object_from_array(ptr, prop);
+
+ /* is this a maths object? */
+ if (ret) return ret;
+
+ return pyrna_prop_CreatePyObject(ptr, prop);
+}
diff --git a/source/blender/python/intern/bpy_compat.h b/source/blender/python/intern/bpy_compat.h
deleted file mode 100644
index 1ad9376c13b..00000000000
--- a/source/blender/python/intern/bpy_compat.h
+++ /dev/null
@@ -1,120 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Contributor(s): Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/* This file is only to contain definitions to functions that enable
- * the python api to compile with different python versions.
- * no utility functions please
- */
-
-#ifndef BPY_COMPAT_H__
-#define BPY_COMPAT_H__
-
-/* if you are NOT using python 3.0 - define these */
-#if PY_VERSION_HEX < 0x03000000
-#define _PyUnicode_AsString PyString_AsString
-
-#undef PyUnicode_Check
-#define PyUnicode_Check PyString_Check
-
-#define PyLong_FromSsize_t PyInt_FromLong
-#define PyLong_AsSsize_t PyInt_AsLong
-
-#undef PyLong_Check
-#define PyLong_Check PyInt_Check
-
-
-#ifdef PyUnicode_FromString
-#undef PyUnicode_FromString
-#endif
-#define PyUnicode_FromString PyString_FromString
-
-#ifdef PyUnicode_FromFormat
-#undef PyUnicode_FromFormat
-#endif
-#define PyUnicode_FromFormat PyString_FromFormat
-
-#endif
-
-#ifndef Py_REFCNT
-#define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
-#endif
-
-#ifndef Py_TYPE
-#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
-#endif
-
-#ifndef Py_TYPE
-#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
-#endif
-
-/* older then python 2.6 - define these */
-// #if (PY_VERSION_HEX < 0x02060000)
-// #endif
-
-/* older then python 2.5 - define these */
-#if (PY_VERSION_HEX < 0x02050000)
-#define Py_ssize_t ssize_t
-typedef Py_ssize_t (*lenfunc)(PyObject *);
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE return Py_BuildValue("O", Py_None)
-#endif
-#ifndef Py_RETURN_FALSE
-#define Py_RETURN_FALSE return PyBool_FromLong(0)
-#endif
-#ifndef Py_RETURN_TRUE
-#define Py_RETURN_TRUE return PyBool_FromLong(1)
-#endif
-#endif
-
-
-#if PY_VERSION_HEX < 0x03000000
-#ifndef ssizeargfunc
-#define ssizeargfunc intargfunc
-#endif
-
-#ifndef ssizessizeargfunc
-#define ssizessizeargfunc intintargfunc
-#endif
-
-#ifndef ssizeobjargproc
-#define ssizeobjargproc intobjargproc
-#endif
-
-#ifndef ssizessizeobjargproc
-#define ssizessizeobjargproc intintobjargproc
-#endif
-#endif
-
-
-
-/* defined in bpy_util.c */
-#if PY_VERSION_HEX < 0x03000000
-PyObject *Py_CmpToRich(int op, int cmp);
-#endif
-
-#ifndef Py_CmpToRich
-PyObject *Py_CmpToRich(int op, int cmp); /* bpy_util.c */
-#endif
-
-#endif /* BPY_COMPAT_H__ */
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 8b5ad36f349..3e28bc7968f 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -1,26 +1,54 @@
-
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Michel Selten, Willian P. Germano, Stephen Swaney,
+ * Chris Keith, Chris Want, Ken Hughes, Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
-#ifndef WIN32
-#include <dirent.h>
-#else
-#include "BLI_winstuff.h"
+
+/* grr, python redefines */
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
#endif
#include <Python.h>
#include "compile.h" /* for the PyCodeObject */
#include "eval.h" /* for PyEval_EvalCode */
-#include "bpy_compat.h"
-
#include "bpy_rna.h"
#include "bpy_operator.h"
#include "bpy_ui.h"
#include "bpy_util.h"
+#ifndef WIN32
+#include <dirent.h>
+#else
+#include "BLI_winstuff.h"
+#endif
+
#include "DNA_anim_types.h"
#include "DNA_space_types.h"
#include "DNA_text_types.h"
@@ -28,6 +56,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_util.h"
+#include "BLI_storage.h"
+#include "BLI_fileops.h"
#include "BLI_string.h"
#include "BKE_context.h"
@@ -37,13 +67,87 @@
#include "BPY_extern.h"
#include "../generic/bpy_internal_import.h" // our own imports
-/* external util modukes */
+/* external util modules */
#include "../generic/Mathutils.h"
#include "../generic/Geometry.h"
#include "../generic/BGL.h"
+/* for internal use, when starting and ending python scripts */
+
+/* incase a python script triggers another python call, stop bpy_context_clear from invalidating */
+static int py_call_level= 0;
+
+
+// only for tests
+#define TIME_PY_RUN
+
+#ifdef TIME_PY_RUN
+#include "PIL_time.h"
+static int bpy_timer_count = 0;
+static double bpy_timer; /* time since python starts */
+static double bpy_timer_run; /* time for each python script run */
+static double bpy_timer_run_tot; /* accumulate python runs */
+#endif
+
+void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
+{
+ py_call_level++;
+
+ if(gilstate)
+ *gilstate = PyGILState_Ensure();
+
+ if(py_call_level==1) {
+
+ BPY_update_modules(); /* can give really bad results if this isnt here */
+
+ if(C) { // XXX - should always be true.
+ BPy_SetContext(C);
+ bpy_import_main_set(CTX_data_main(C));
+ }
+ else {
+ fprintf(stderr, "ERROR: Python context called with a NULL Context. this should not happen!\n");
+ }
+
+#ifdef TIME_PY_RUN
+ if(bpy_timer_count==0) {
+ /* record time from the beginning */
+ bpy_timer= PIL_check_seconds_timer();
+ bpy_timer_run = bpy_timer_run_tot = 0.0;
+ }
+ bpy_timer_run= PIL_check_seconds_timer();
+
+
+ bpy_timer_count++;
+#endif
+ }
+}
+
+void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
+{
+ py_call_level--;
+
+ if(gilstate)
+ PyGILState_Release(*gilstate);
+
+ if(py_call_level < 0) {
+ fprintf(stderr, "ERROR: Python context internal state bug. this should not happen!\n");
+ }
+ else if(py_call_level==0) {
+ // XXX - Calling classes currently wont store the context :\, cant set NULL because of this. but this is very flakey still.
+ //BPy_SetContext(NULL);
+ //bpy_import_main_set(NULL);
+
+#ifdef TIME_PY_RUN
+ bpy_timer_run_tot += PIL_check_seconds_timer() - bpy_timer_run;
+ bpy_timer_count++;
+#endif
+
+ }
+}
+
+
void BPY_free_compiled_text( struct Text *text )
{
if( text->compiled ) {
@@ -65,7 +169,7 @@ static void bpy_init_modules( void )
/* PyModule_AddObject( mod, "doc", BPY_rna_doc() ); */
PyModule_AddObject( mod, "types", BPY_rna_types() );
PyModule_AddObject( mod, "props", BPY_rna_props() );
- PyModule_AddObject( mod, "ops", BPY_operator_module() );
+ PyModule_AddObject( mod, "__ops__", BPY_operator_module() ); /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */
PyModule_AddObject( mod, "ui", BPY_ui_module() ); // XXX very experimental, consider this a test, especially PyCObject is not meant to be permanent
/* add the module so we can import it */
@@ -74,23 +178,22 @@ static void bpy_init_modules( void )
/* stand alone utility modules not related to blender directly */
- Geometry_Init("Geometry");
- Mathutils_Init("Mathutils");
- BGL_Init("BGL");
-}
-
-#if (PY_VERSION_HEX < 0x02050000)
-PyObject *PyImport_ImportModuleLevel(char *name, void *a, void *b, void *c, int d)
-{
- return PyImport_ImportModule(name);
+ Geometry_Init();
+ Mathutils_Init();
+ BGL_Init();
}
-#endif
void BPY_update_modules( void )
{
+#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);
PyModule_AddObject( mod, "data", BPY_rna_module() );
- PyModule_AddObject( mod, "types", BPY_rna_types() );
+ PyModule_AddObject( mod, "types", BPY_rna_types() ); // atm this does not need updating
+#endif
+
+ /* refreshes the main struct */
+ BPY_update_rna_module();
+
}
/*****************************************************************************
@@ -105,9 +208,6 @@ static PyObject *CreateGlobalDictionary( bContext *C )
PyDict_SetItemString( dict, "__name__", item );
Py_DECREF(item);
- // XXX - evil, need to access context
- BPy_SetContext(C);
-
// XXX - put somewhere more logical
{
PyMethodDef *ml;
@@ -132,13 +232,51 @@ static PyObject *CreateGlobalDictionary( bContext *C )
return dict;
}
+/* must be called before Py_Initialize */
+void BPY_start_python_path(void)
+{
+ char *py_path_bundle= BLI_gethome_folder("python", BLI_GETHOME_ALL);
+
+ if(py_path_bundle==NULL)
+ return;
+
+ /* set the environment path */
+ printf("found bundled python: %s\n", py_path_bundle);
+
+#if 0
+ BLI_setenv("PYTHONHOME", py_path_bundle);
+ BLI_setenv("PYTHONPATH", py_path_bundle);
+#endif
+
+ {
+ static wchar_t py_path_bundle_wchar[FILE_MAXDIR];
+
+ mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR);
+ Py_SetPythonHome(py_path_bundle_wchar);
+ }
+}
+
+
void BPY_start_python( int argc, char **argv )
{
PyThreadState *py_tstate = NULL;
+ BPY_start_python_path(); /* allow to use our own included python */
+
Py_Initialize( );
- //PySys_SetArgv( argc_copy, argv_copy );
+ // PySys_SetArgv( argc, argv); // broken in py3, not a huge deal
+ /* sigh, why do python guys not have a char** version anymore? :( */
+ {
+ int i;
+ PyObject *py_argv= PyList_New(argc);
+
+ for (i=0; i<argc; i++)
+ PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
+
+ PySys_SetObject("argv", py_argv);
+ Py_DECREF(py_argv);
+ }
/* Initialize thread support (also acquires lock) */
PyEval_InitThreads();
@@ -154,40 +292,64 @@ void BPY_start_python( int argc, char **argv )
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);
+
+ /* a bit nasty but this prevents help() and input() from locking blender
+ * Ideally we could have some way for the console to replace sys.stdin but
+ * python would lock blender while waiting for a return value, not easy :| */
+ PySys_SetObject("stdin", Py_None);
}
+ pyrna_alloc_types();
+
py_tstate = PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
}
void BPY_end_python( void )
{
+ // fprintf(stderr, "Ending Python!\n");
+
PyGILState_Ensure(); /* finalizing, no need to grab the state */
// free other python data.
- //BPY_rna_free_types();
+ pyrna_free_types();
+
+ /* clear all python data from structs */
Py_Finalize( );
- return;
+#ifdef TIME_PY_RUN
+ // measure time since py started
+ bpy_timer = PIL_check_seconds_timer() - bpy_timer;
+
+ printf("*bpy stats* - ");
+ printf("tot exec: %d, ", bpy_timer_count);
+ printf("tot run: %.4fsec, ", bpy_timer_run_tot);
+ if(bpy_timer_count>0)
+ printf("average run: %.6fsec, ", (bpy_timer_run_tot/bpy_timer_count));
+
+ if(bpy_timer>0.0)
+ printf("tot usage %.4f%%", (bpy_timer_run_tot/bpy_timer)*100.0);
+
+ printf("\n");
+
+ // fprintf(stderr, "Ending Python Done!\n");
+
+#endif
+
}
/* Can run a file or text block */
int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
{
- PyObject *py_dict, *py_result;
+ PyObject *py_dict, *py_result= NULL;
PyGILState_STATE gilstate;
if (fn==NULL && text==NULL) {
return 0;
}
- //BPY_start_python();
-
- gilstate = PyGILState_Ensure();
-
- BPY_update_modules(); /* can give really bad results if this isnt here */
- bpy_import_main_set(CTX_data_main(C));
+ bpy_context_set(C, &gilstate);
py_dict = CreateGlobalDictionary(C);
@@ -202,19 +364,31 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
MEM_freeN( buf );
if( PyErr_Occurred( ) ) {
- BPy_errors_to_report(reports);
BPY_free_compiled_text( text );
- PyGILState_Release(gilstate);
- return 0;
}
}
- py_result = PyEval_EvalCode( text->compiled, py_dict, py_dict );
+ if(text->compiled)
+ py_result = PyEval_EvalCode( text->compiled, py_dict, py_dict );
} else {
- char pystring[512];
- /* TODO - look into a better way to run a file */
- sprintf(pystring, "exec(open(r'%s').read())", fn);
- py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
+#if 0
+ char *pystring;
+ pystring= malloc(strlen(fn) + 32);
+ pystring[0]= '\0';
+ sprintf(pystring, "exec(open(r'%s').read())", fn);
+ py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
+ free(pystring);
+#else
+ FILE *fp= fopen(fn, "r");
+ if(fp) {
+ py_result = PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
+ fclose(fp);
+ }
+ else {
+ PyErr_Format(PyExc_SystemError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno));
+ py_result= NULL;
+ }
+#endif
}
if (!py_result) {
@@ -224,10 +398,9 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
}
Py_DECREF(py_dict);
- PyGILState_Release(gilstate);
- bpy_import_main_set(NULL);
- //BPY_end_python();
+ bpy_context_clear(C, &gilstate);
+
return py_result ? 1:0;
}
@@ -283,9 +456,9 @@ static int bpy_run_script_init(bContext *C, SpaceScript * sc)
return 1;
}
-int BPY_run_script_space_draw(struct bContext *C, SpaceScript * sc)
+int BPY_run_script_space_draw(const struct bContext *C, SpaceScript * sc)
{
- if (bpy_run_script_init(C, sc)) {
+ if (bpy_run_script_init( (bContext *)C, sc)) {
PyGILState_STATE gilstate = PyGILState_Ensure();
PyObject *result = PyObject_CallObject( sc->script->py_draw, NULL );
@@ -373,6 +546,26 @@ int BPY_run_python_script_space(const char *modulename, const char *func)
#include "PIL_time.h"
#endif
+/* for use by BPY_run_ui_scripts only */
+static int bpy_import_module(char *modname, int reload)
+{
+ PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
+ if (mod) {
+ if (reload) {
+ PyObject *mod_orig= mod;
+ mod= PyImport_ReloadModule(mod);
+ Py_DECREF(mod_orig);
+ }
+ }
+
+ if(mod) {
+ Py_DECREF(mod); /* could be NULL from reloading */
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
/* XXX this is temporary, need a proper script registration system for 2.5 */
void BPY_run_ui_scripts(bContext *C, int reload)
{
@@ -384,81 +577,84 @@ void BPY_run_ui_scripts(bContext *C, int reload)
char *file_extension;
char *dirname;
char path[FILE_MAX];
- char *dirs[] = {"io", "ui", NULL};
- int a, filelen; /* filename length */
+ char *dirs[] = {"ui", "io", NULL};
+ int path_flags[] = {BLI_GETHOME_LOCAL|BLI_GETHOME_SYSTEM, BLI_GETHOME_USER}; /* SYSTEM / NON-SYSTEM */
+ int a, err, flag_iter;
PyGILState_STATE gilstate;
- PyObject *mod;
- PyObject *sys_path_orig;
- PyObject *sys_path_new;
+ PyObject *sys_path;
- gilstate = PyGILState_Ensure();
-
- // XXX - evil, need to access context
- BPy_SetContext(C);
- bpy_import_main_set(CTX_data_main(C));
+ bpy_context_set(C, &gilstate);
- for(a=0; dirs[a]; a++) {
- dirname= BLI_gethome_folder(dirs[a]);
+ sys_path= PySys_GetObject("path"); /* borrow */
+ PyList_Insert(sys_path, 0, Py_None); /* place holder, resizes the list */
- if(!dirname)
- continue;
+ /* Scan system scripts first, then local/user */
+ for(flag_iter=0; flag_iter < sizeof(path_flags)/sizeof(int); flag_iter++) {
+
+ for(a=0; dirs[a]; a++) {
+ dirname= BLI_gethome_folder(dirs[a], path_flags[flag_iter]);
- dir = opendir(dirname);
+ if(!dirname)
+ continue;
- if(!dir)
- continue;
+ dir = opendir(dirname);
- /* backup sys.path */
- sys_path_orig= PySys_GetObject("path");
- Py_INCREF(sys_path_orig); /* dont free it */
-
- sys_path_new= PyList_New(1);
- PyList_SET_ITEM(sys_path_new, 0, PyUnicode_FromString(dirname));
- PySys_SetObject("path", sys_path_new);
- Py_DECREF(sys_path_new);
-
- while((de = readdir(dir)) != NULL) {
- /* We could stat the file but easier just to let python
- * import it and complain if theres a problem */
-
- file_extension = strstr(de->d_name, ".py");
+ if(!dir)
+ continue;
- if(file_extension && *(file_extension + 3) == '\0') {
- filelen = strlen(de->d_name);
- BLI_strncpy(path, de->d_name, filelen-2); /* cut off the .py on copy */
+ /* set the first dir in the sys.path for fast importing of modules */
+ PyList_SetItem(sys_path, 0, PyUnicode_FromString(dirname)); /* steals the ref */
- mod= PyImport_ImportModuleLevel(path, NULL, NULL, NULL, 0);
- if (mod) {
- if (reload) {
- PyObject *mod_orig= mod;
- mod= PyImport_ReloadModule(mod);
- Py_DECREF(mod_orig);
+ while((de = readdir(dir)) != NULL) {
+ /* We could stat the file but easier just to let python
+ * import it and complain if theres a problem */
+ err = 0;
+
+ if (de->d_name[0] == '.') {
+ /* do nothing, probably .svn */
+ }
+ else if ((file_extension = strstr(de->d_name, ".py"))) {
+ /* normal py files? */
+ if(file_extension && file_extension[3] == '\0') {
+ de->d_name[(file_extension - de->d_name)] = '\0';
+ err= bpy_import_module(de->d_name, reload);
}
}
-
- if(mod) {
- Py_DECREF(mod); /* could be NULL from reloading */
- } else {
- BPy_errors_to_report(NULL); // TODO - reports
- fprintf(stderr, "unable to import \"%s\" %s/%s\n", path, dirname, de->d_name);
+#ifndef __linux__
+ else if( BLI_join_dirfile(path, dirname, de->d_name), S_ISDIR(BLI_exist(path))) {
+#else
+ else if(de->d_type==DT_DIR) {
+ BLI_join_dirfile(path, dirname, de->d_name);
+#endif
+ /* support packages */
+ BLI_join_dirfile(path, path, "__init__.py");
+
+ if(BLI_exists(path)) {
+ err= bpy_import_module(de->d_name, reload);
+ }
}
+ if(err==-1) {
+ BPy_errors_to_report(NULL);
+ fprintf(stderr, "unable to import %s/%s\n", dirname, de->d_name);
+ }
}
- }
-
- closedir(dir);
- PySys_SetObject("path", sys_path_orig);
- Py_DECREF(sys_path_orig);
+ closedir(dir);
+ }
}
- bpy_import_main_set(NULL);
+ PyList_SetSlice(sys_path, 0, 1, NULL); /* remove the first item */
+
+ bpy_context_clear(C, &gilstate);
- PyGILState_Release(gilstate);
#ifdef TIME_REGISTRATION
printf("script time %f\n", (PIL_check_seconds_timer()-time));
#endif
+
+ /* reset the timer so as not to take loading into the stats */
+ bpy_timer_count = 0;
}
/* ****************************************** */
@@ -656,3 +852,56 @@ float BPY_pydriver_eval (ChannelDriver *driver)
return result;
}
+
+int BPY_button_eval(bContext *C, char *expr, double *value)
+{
+ PyGILState_STATE gilstate;
+ PyObject *dict, *retval;
+ int error_ret = 0;
+
+ if (!value || !expr || expr[0]=='\0') return -1;
+
+ bpy_context_set(C, &gilstate);
+
+ dict= CreateGlobalDictionary(C);
+ retval = PyRun_String(expr, Py_eval_input, dict, dict);
+
+ if (retval == NULL) {
+ error_ret= -1;
+ }
+ else {
+ double val;
+
+ if(PyTuple_Check(retval)) {
+ /* Users my have typed in 10km, 2m
+ * add up all values */
+ int i;
+ val= 0.0;
+
+ for(i=0; i<PyTuple_GET_SIZE(retval); i++) {
+ val+= PyFloat_AsDouble(PyTuple_GET_ITEM(retval, i));
+ }
+ }
+ else {
+ val = PyFloat_AsDouble(retval);
+ }
+ Py_DECREF(retval);
+
+ if(val==-1 && PyErr_Occurred()) {
+ error_ret= -1;
+ }
+ else {
+ *value= val;
+ }
+ }
+
+ if(error_ret) {
+ BPy_errors_to_report(CTX_wm_reports(C));
+ }
+
+ Py_DECREF(dict);
+ bpy_context_clear(C, &gilstate);
+
+ return error_ret;
+}
+
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 004cf2fb7c7..301204d3e2b 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -23,77 +23,87 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/* Note, this module is not to be used directly by the user.
+ * its accessed from blender with bpy.__ops__
+ * */
+
#include "bpy_operator.h"
#include "bpy_operator_wrap.h"
#include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */
-#include "bpy_compat.h"
#include "bpy_util.h"
-//#include "blendef.h"
-#include "BLI_dynstr.h"
-
#include "WM_api.h"
#include "WM_types.h"
#include "MEM_guardedalloc.h"
-//#include "BKE_idprop.h"
#include "BKE_report.h"
+#include "BKE_utildefines.h"
-extern ListBase global_ops; /* evil, temp use */
-static PyObject *pyop_base_dir(PyObject *self);
-static PyObject *pyop_base_rna(PyObject *self, PyObject *pyname);
-static struct PyMethodDef pyop_base_methods[] = {
- {"__dir__", (PyCFunction)pyop_base_dir, METH_NOARGS, ""},
- {"__rna__", (PyCFunction)pyop_base_rna, METH_O, ""},
- {"add", (PyCFunction)PYOP_wrap_add, METH_O, ""},
- {"remove", (PyCFunction)PYOP_wrap_remove, METH_O, ""},
- {NULL, NULL, 0, NULL}
-};
-
-/* 'self' stores the operator string */
-static PyObject *pyop_base_call( PyObject * self, PyObject * args, PyObject * kw)
+static PyObject *pyop_call( PyObject * self, PyObject * args)
{
wmOperatorType *ot;
int error_val = 0;
PointerRNA ptr;
+ char *opname;
+ PyObject *kw= NULL; /* optional args */
+
+ /* note that context is an int, python does the conversion in this case */
+ 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();
- char *opname = _PyUnicode_AsString(self);
-
- if (PyTuple_Size(args)) {
- PyErr_SetString( PyExc_AttributeError, "All operator args must be keywords");
+ if (!PyArg_ParseTuple(args, "s|O!i:bpy.__ops__.call", &opname, &PyDict_Type, &kw, &context))
return NULL;
- }
- ot= WM_operatortype_find(opname);
+ ot= WM_operatortype_find(opname, TRUE);
+
if (ot == NULL) {
- PyErr_Format( PyExc_SystemError, "Operator \"%s\"could not be found", opname);
+ PyErr_Format( PyExc_SystemError, "bpy.__ops__.call: operator \"%s\"could not be found", opname);
return NULL;
}
- if(ot->poll && (ot->poll(C) == 0)) {
- PyErr_SetString( PyExc_SystemError, "Operator poll() function failed, context is incorrect");
+ if(WM_operator_poll((bContext*)C, ot) == FALSE) {
+ PyErr_SetString( PyExc_SystemError, "bpy.__ops__.call: operator poll() function failed, context is incorrect");
return NULL;
}
+
+ /* WM_operator_properties_create(&ptr, opname); */
+ /* Save another lookup */
+ RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- WM_operator_properties_create(&ptr, opname);
-
- error_val= pyrna_pydict_to_props(&ptr, kw, "Converting py args to operator properties: ");
+ if(kw && PyDict_Size(kw))
+ error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
+
if (error_val==0) {
- ReportList reports;
+ ReportList *reports;
- BKE_reports_init(&reports, RPT_STORE);
+ reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
+ BKE_reports_init(reports, RPT_STORE);
- WM_operator_call_py(C, ot, &ptr, &reports);
+ WM_operator_call_py(C, ot, context, &ptr, reports);
- if(BPy_reports_to_error(&reports))
+ if(BPy_reports_to_error(reports))
error_val = -1;
- BKE_reports_clear(&reports);
+ /* operator output is nice to have in the terminal/console too */
+ if(reports->list.first) {
+ char *report_str= BKE_reports_string(reports, 0); /* all reports */
+
+ if(report_str) {
+ PySys_WriteStdout(report_str);
+ MEM_freeN(report_str);
+ }
+ }
+
+ BKE_reports_clear(reports);
+ if ((reports->flag & RPT_FREE) == 0)
+ {
+ MEM_freeN(reports);
+ }
}
WM_operator_properties_free(&ptr);
@@ -118,89 +128,117 @@ static PyObject *pyop_base_call( PyObject * self, PyObject * args, PyObject * k
Py_RETURN_NONE;
}
-static PyMethodDef pyop_base_call_meth[] = {
- {"__op_call__", (PyCFunction)pyop_base_call, METH_VARARGS|METH_KEYWORDS, "generic operator calling function"}
-};
-
-
-//---------------getattr--------------------------------------------
-static PyObject *pyop_base_getattro( BPy_OperatorBase * self, PyObject *pyname )
+static PyObject *pyop_as_string( PyObject * self, PyObject * args)
{
- char *name = _PyUnicode_AsString(pyname);
- PyObject *ret;
wmOperatorType *ot;
-
- if ((ot= WM_operatortype_find(name))) {
- ret = PyCFunction_New( pyop_base_call_meth, pyname); /* set the name string as self, PyCFunction_New incref's self */
+ PointerRNA ptr;
+
+ char *opname;
+ PyObject *kw= NULL; /* optional args */
+ int all_args = 1;
+ int error_val= 0;
+
+ char *buf;
+ PyObject *pybuf;
+
+ bContext *C = BPy_GetContext();
+
+ 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);
+ return NULL;
}
- else if ((ret = PyObject_GenericGetAttr((PyObject *)self, pyname))) {
- /* do nothing, this accounts for methoddef's add and remove */
+
+ /* WM_operator_properties_create(&ptr, opname); */
+ /* Save another lookup */
+ RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
+
+ if(kw && PyDict_Size(kw))
+ error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
+
+ if (error_val==0)
+ buf= WM_operator_pystring(C, ot, &ptr, all_args);
+
+ WM_operator_properties_free(&ptr);
+
+ if (error_val==-1) {
+ return NULL;
+ }
+
+ if(buf) {
+ pybuf= PyUnicode_FromString(buf);
+ MEM_freeN(buf);
}
else {
- PyErr_Format( PyExc_AttributeError, "Operator \"%s\" not found", name);
- ret= NULL;
+ pybuf= PyUnicode_FromString("");
}
- return ret;
+ return pybuf;
}
-static PyObject *pyop_base_dir(PyObject *self)
+static PyObject *pyop_dir(PyObject *self)
{
PyObject *list = PyList_New(0), *name;
wmOperatorType *ot;
- PyMethodDef *meth;
for(ot= WM_operatortype_first(); ot; ot= ot->next) {
name = PyUnicode_FromString(ot->idname);
PyList_Append(list, name);
Py_DECREF(name);
}
-
- for(meth=pyop_base_methods; meth->ml_name; meth++) {
- name = PyUnicode_FromString(meth->ml_name);
- PyList_Append(list, name);
- Py_DECREF(name);
- }
return list;
}
-static PyObject *pyop_base_rna(PyObject *self, PyObject *pyname)
+static PyObject *pyop_getrna(PyObject *self, PyObject *value)
{
- char *name = _PyUnicode_AsString(pyname);
wmOperatorType *ot;
+ PointerRNA ptr;
+ char *opname= _PyUnicode_AsString(value);
+ BPy_StructRNA *pyrna= NULL;
- if ((ot= WM_operatortype_find(name))) {
- BPy_StructRNA *pyrna;
- PointerRNA ptr;
-
- /* XXX POINTER - if this 'ot' is python generated, it could be free'd */
- RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
-
- pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); /* were not really using &ptr, overwite next */
- //pyrna->freeptr= 1;
- return (PyObject *)pyrna;
+ if(opname==NULL) {
+ PyErr_SetString(PyExc_TypeError, "bpy.__ops__.get_rna() expects a string argument");
+ return NULL;
}
- else {
- PyErr_Format(PyExc_AttributeError, "Operator \"%s\" not found", name);
+ ot= WM_operatortype_find(opname, TRUE);
+ if(ot==NULL) {
+ PyErr_Format(PyExc_KeyError, "bpy.__ops__.get_rna(\"%s\") not found", opname);
return NULL;
}
+
+ /* type */
+ //RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr);
+
+ /* XXX - should call WM_operator_properties_free */
+ WM_operator_properties_create(&ptr, ot->idname);
+ pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
+ pyrna->freeptr= TRUE;
+ return (PyObject *)pyrna;
}
-PyTypeObject pyop_base_Type = {NULL};
-
PyObject *BPY_operator_module( void )
{
- pyop_base_Type.tp_name = "OperatorBase";
- pyop_base_Type.tp_basicsize = sizeof( BPy_OperatorBase );
- pyop_base_Type.tp_getattro = ( getattrofunc )pyop_base_getattro;
- pyop_base_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- pyop_base_Type.tp_methods = pyop_base_methods;
-
- if( PyType_Ready( &pyop_base_Type ) < 0 )
- return NULL;
-
- //submodule = Py_InitModule3( "operator", M_rna_methods, "rna module" );
- return (PyObject *)PyObject_NEW( BPy_OperatorBase, &pyop_base_Type );
+ static PyMethodDef pyop_call_meth = {"call", (PyCFunction) pyop_call, METH_VARARGS, NULL};
+ static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL};
+ static PyMethodDef pyop_dir_meth = {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL};
+ static PyMethodDef pyop_getrna_meth = {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL};
+ static PyMethodDef pyop_add_meth = {"add", (PyCFunction) PYOP_wrap_add, METH_O, NULL};
+ static PyMethodDef pyop_remove_meth = {"remove", (PyCFunction) PYOP_wrap_remove, METH_O, NULL};
+
+ PyObject *submodule = PyModule_New("bpy.__ops__");
+ PyDict_SetItemString(PySys_GetObject("modules"), "bpy.__ops__", submodule);
+
+ PyModule_AddObject( submodule, "call", PyCFunction_New(&pyop_call_meth, NULL) );
+ PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) );
+ PyModule_AddObject( submodule, "dir", PyCFunction_New(&pyop_dir_meth, NULL) );
+ PyModule_AddObject( submodule, "get_rna", PyCFunction_New(&pyop_getrna_meth, NULL) );
+ PyModule_AddObject( submodule, "add", PyCFunction_New(&pyop_add_meth, NULL) );
+ PyModule_AddObject( submodule, "remove", PyCFunction_New(&pyop_remove_meth, NULL) );
+
+ return submodule;
}
-
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index b7e3c86dd91..bbf657d8ce0 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -37,15 +37,16 @@
#include "RNA_define.h"
#include "bpy_rna.h"
-#include "bpy_compat.h"
#include "bpy_util.h"
#include "../generic/bpy_internal_import.h" // our own imports
#define PYOP_ATTR_PROP "__props__"
#define PYOP_ATTR_UINAME "__label__"
-#define PYOP_ATTR_IDNAME "__name__" /* use pythons class name */
+#define PYOP_ATTR_IDNAME "__idname__" /* the name given by python */
+#define PYOP_ATTR_IDNAME_BL "__idname_bl__" /* our own name converted into blender syntax, users wont see this */
#define PYOP_ATTR_DESCRIPTION "__doc__" /* use pythons docstring */
+#define PYOP_ATTR_REGISTER "__register__" /* True/False. if this python operator should be registered */
static struct BPY_flag_def pyop_ret_flags[] = {
{"RUNNING_MODAL", OPERATOR_RUNNING_MODAL},
@@ -80,9 +81,9 @@ static struct BPY_flag_def pyop_ret_flags[] = {
extern void BPY_update_modules( void ); //XXX temp solution
-static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *event)
+static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperator *op, wmEvent *event)
{
- PyObject *py_class = op->type->pyop_data;
+ PyObject *py_class = ot->pyop_data;
PyObject *args;
PyObject *ret= NULL, *py_class_instance, *item= NULL;
int ret_flag= (mode==PYOP_POLL ? 0:OPERATOR_CANCELLED);
@@ -91,11 +92,9 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
PointerRNA ptr_event;
PyObject *py_operator;
- PyGILState_STATE gilstate = PyGILState_Ensure();
+ PyGILState_STATE gilstate;
- bpy_import_main_set(CTX_data_main(C));
-
- BPY_update_modules(); // XXX - the RNA pointers can change so update before running, would like a nicer solutuon for this.
+ bpy_context_set(C, &gilstate);
args = PyTuple_New(1);
PyTuple_SET_ITEM(args, 0, PyObject_GetAttrString(py_class, "__rna__")); // need to use an rna instance as the first arg
@@ -106,7 +105,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
/* Assign instance attributes from operator properties */
- {
+ if(op) {
const char *arg_name;
RNA_STRUCT_BEGIN(op->ptr, prop) {
@@ -122,10 +121,12 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
}
/* set operator pointer RNA as instance "__operator__" attribute */
- RNA_pointer_create(NULL, &RNA_Operator, op, &ptr_operator);
- py_operator= pyrna_struct_CreatePyObject(&ptr_operator);
- PyObject_SetAttrString(py_class_instance, "__operator__", py_operator);
- Py_DECREF(py_operator);
+ if(op) {
+ RNA_pointer_create(NULL, &RNA_Operator, op, &ptr_operator);
+ py_operator= pyrna_struct_CreatePyObject(&ptr_operator);
+ PyObject_SetAttrString(py_class_instance, "__operator__", py_operator);
+ Py_DECREF(py_operator);
+ }
RNA_pointer_create(NULL, &RNA_Context, C, &ptr_context);
@@ -149,8 +150,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
else if (mode==PYOP_POLL) {
item= PyObject_GetAttrString(py_class, "poll");
args = PyTuple_New(2);
- //XXX Todo - wrap context in a useful way, None for now.
- PyTuple_SET_ITEM(args, 1, Py_None);
+ PyTuple_SET_ITEM(args, 1, pyrna_struct_CreatePyObject(&ptr_context));
}
PyTuple_SET_ITEM(args, 0, py_class_instance);
@@ -161,21 +161,24 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
}
if (ret == NULL) { /* covers py_class_instance failing too */
- BPy_errors_to_report(op->reports);
+ if(op)
+ BPy_errors_to_report(op->reports);
}
else {
if (mode==PYOP_POLL) {
if (PyBool_Check(ret) == 0) {
PyErr_SetString(PyExc_ValueError, "Python poll function return value ");
- BPy_errors_to_report(op->reports);
+ if(op)
+ BPy_errors_to_report(op->reports);
}
else {
ret_flag= ret==Py_True ? 1:0;
}
} else if (BPY_flag_from_seq(pyop_ret_flags, ret, &ret_flag) == -1) {
- /* the returned value could not be converted into a flag */
- BPy_errors_to_report(op->reports);
+ /* the returned value could not be converted into a flag */
+ if(op)
+ BPy_errors_to_report(op->reports);
ret_flag = OPERATOR_CANCELLED;
}
@@ -190,6 +193,8 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
Py_DECREF(ret);
}
+#if 0 /* only for testing */
+
/* print operator return value */
if (mode != PYOP_POLL) {
char flag_str[100];
@@ -210,33 +215,31 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve
/* get class name */
item= PyObject_GetAttrString(py_class, PYOP_ATTR_IDNAME);
- Py_DECREF(item);
strcpy(class_name, _PyUnicode_AsString(item));
+ Py_DECREF(item);
fprintf(stderr, "%s's %s returned %s\n", class_name, mode == PYOP_EXEC ? "execute" : "invoke", flag_str);
}
+#endif
- PyGILState_Release(gilstate);
- bpy_import_main_set(NULL);
+ bpy_context_clear(C, &gilstate);
return ret_flag;
}
static int PYTHON_OT_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- return PYTHON_OT_generic(PYOP_INVOKE, C, op, event);
+ return PYTHON_OT_generic(PYOP_INVOKE, C, op->type, op, event);
}
-static int PYTHON_OT_exec(bContext *C, wmOperator *op)
+static int PYTHON_OT_execute(bContext *C, wmOperator *op)
{
- return PYTHON_OT_generic(PYOP_EXEC, C, op, NULL);
+ return PYTHON_OT_generic(PYOP_EXEC, C, op->type, op, NULL);
}
-static int PYTHON_OT_poll(bContext *C)
+static int PYTHON_OT_poll(bContext *C, wmOperatorType *ot)
{
- // XXX TODO - no way to get the operator type (and therefor class) from the poll function.
- //return PYTHON_OT_generic(PYOP_POLL, C, NULL, NULL);
- return 1;
+ return PYTHON_OT_generic(PYOP_POLL, C, ot, NULL, NULL);
}
void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
@@ -245,15 +248,14 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
PyObject *props, *item;
/* identifiers */
- item= PyObject_GetAttrString(py_class, PYOP_ATTR_IDNAME);
- Py_DECREF(item);
+ item= PyObject_GetAttrString(py_class, PYOP_ATTR_IDNAME_BL);
ot->idname= _PyUnicode_AsString(item);
-
+ Py_DECREF(item);
item= PyObject_GetAttrString(py_class, PYOP_ATTR_UINAME);
if (item) {
- Py_DECREF(item);
ot->name= _PyUnicode_AsString(item);
+ Py_DECREF(item);
}
else {
ot->name= ot->idname;
@@ -261,32 +263,41 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
}
item= PyObject_GetAttrString(py_class, PYOP_ATTR_DESCRIPTION);
- Py_DECREF(item);
- ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):"";
+ ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):"undocumented python operator";
+ Py_XDECREF(item);
/* api callbacks, detailed checks dont on adding */
if (PyObject_HasAttrString(py_class, "invoke"))
ot->invoke= PYTHON_OT_invoke;
if (PyObject_HasAttrString(py_class, "execute"))
- ot->exec= PYTHON_OT_exec;
+ ot->exec= PYTHON_OT_execute;
if (PyObject_HasAttrString(py_class, "poll"))
- ot->poll= PYTHON_OT_poll;
+ ot->pyop_poll= PYTHON_OT_poll;
ot->pyop_data= userdata;
+ /* flags */
+ item= PyObject_GetAttrString(py_class, PYOP_ATTR_REGISTER);
+ if (item) {
+ ot->flag= PyObject_IsTrue(item)!=0 ? OPTYPE_REGISTER:0;
+ Py_DECREF(item);
+ }
+ else {
+ ot->flag= OPTYPE_REGISTER; /* unspesified, leave on for now to help debug */
+ PyErr_Clear();
+ }
+
props= PyObject_GetAttrString(py_class, PYOP_ATTR_PROP);
if (props) {
PyObject *dummy_args = PyTuple_New(0);
int i;
-
- Py_DECREF(props);
for(i=0; i<PyList_Size(props); i++) {
PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
item = PyList_GET_ITEM(props, i);
- if (PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
+ if (PyArg_ParseTuple(item, "O!O!:PYTHON_OT_wrapper", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
@@ -296,6 +307,8 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
if (py_ret) {
Py_DECREF(py_ret);
} else {
+ fprintf(stderr, "BPy Operator \"%s\" registration error: %s item %d could not run\n", ot->idname, PYOP_ATTR_PROP, i);
+ PyLineSpit();
PyErr_Print();
PyErr_Clear();
}
@@ -310,6 +323,7 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
// expect a tuple with a CObject and a dict
}
Py_DECREF(dummy_args);
+ Py_DECREF(props);
} else {
PyErr_Clear();
}
@@ -324,43 +338,56 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
char *idname= NULL;
+ char idname_bl[OP_MAX_TYPENAME]; /* converted to blender syntax */
int i;
static struct BPY_class_attr_check pyop_class_attr_values[]= {
- {PYOP_ATTR_IDNAME, 's', 0, 0},
- {PYOP_ATTR_UINAME, 's', 0, BPY_CLASS_ATTR_OPTIONAL},
- {PYOP_ATTR_PROP, 'l', 0, BPY_CLASS_ATTR_OPTIONAL},
- {PYOP_ATTR_DESCRIPTION, 's', 0, BPY_CLASS_ATTR_NONE_OK},
- {"execute", 'f', 2, BPY_CLASS_ATTR_OPTIONAL},
- {"invoke", 'f', 3, BPY_CLASS_ATTR_OPTIONAL},
- {"poll", 'f', 2, BPY_CLASS_ATTR_OPTIONAL},
+ {PYOP_ATTR_IDNAME, 's', -1, OP_MAX_TYPENAME-3, 0}, /* -3 because a.b -> A_OT_b */
+ {PYOP_ATTR_UINAME, 's', -1,-1, BPY_CLASS_ATTR_OPTIONAL},
+ {PYOP_ATTR_PROP, 'l', -1,-1, BPY_CLASS_ATTR_OPTIONAL},
+ {PYOP_ATTR_DESCRIPTION, 's', -1,-1, BPY_CLASS_ATTR_NONE_OK},
+ {"execute", 'f', 2, -1, BPY_CLASS_ATTR_OPTIONAL},
+ {"invoke", 'f', 3, -1, BPY_CLASS_ATTR_OPTIONAL},
+ {"poll", 'f', 2, -1, BPY_CLASS_ATTR_OPTIONAL},
{NULL, 0, 0, 0}
};
// in python would be...
//PyObject *optype = PyObject_GetAttrString(PyObject_GetAttrString(PyDict_GetItemString(PyEval_GetGlobals(), "bpy"), "types"), "Operator");
base_class = PyObject_GetAttrStringArgs(PyDict_GetItemString(PyEval_GetGlobals(), "bpy"), 2, "types", "Operator");
- Py_DECREF(base_class);
if(BPY_class_validate("Operator", py_class, base_class, pyop_class_attr_values, NULL) < 0) {
return NULL; /* BPY_class_validate sets the error */
}
+ Py_DECREF(base_class);
/* class name is used for operator ID - this can be changed later if we want */
item= PyObject_GetAttrString(py_class, PYOP_ATTR_IDNAME);
+ idname = _PyUnicode_AsString(item);
+
+
+ /* annoying conversion! */
+ WM_operator_bl_idname(idname_bl, idname);
Py_DECREF(item);
+
+ item= PyUnicode_FromString(idname_bl);
+ PyObject_SetAttrString(py_class, PYOP_ATTR_IDNAME_BL, item);
idname = _PyUnicode_AsString(item);
+ Py_DECREF(item);
+ /* end annoying conversion! */
+
/* remove if it already exists */
- if ((ot=WM_operatortype_find(idname))) {
- Py_XDECREF((PyObject*)ot->pyop_data);
+ if ((ot=WM_operatortype_exists(idname))) {
+ if(ot->pyop_data) {
+ Py_XDECREF((PyObject*)ot->pyop_data);
+ }
WM_operatortype_remove(idname);
}
/* If we have properties set, check its a list of dicts */
item= PyObject_GetAttrString(py_class, PYOP_ATTR_PROP);
if (item) {
- Py_DECREF(item);
for(i=0; i<PyList_Size(item); i++) {
PyObject *py_args = PyList_GET_ITEM(item, i);
PyObject *py_func_ptr, *py_kw; /* place holders */
@@ -370,6 +397,7 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
return NULL;
}
}
+ Py_DECREF(item);
}
else {
PyErr_Clear();
@@ -401,7 +429,7 @@ PyObject *PYOP_wrap_remove(PyObject *self, PyObject *value)
return NULL;
}
- if (!(ot= WM_operatortype_find(idname))) {
+ if (!(ot= WM_operatortype_exists(idname))) {
PyErr_Format( PyExc_AttributeError, "Operator \"%s\" does not exists, cant remove", idname);
return NULL;
}
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 558722cc5e6..1f800be266b 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -23,7 +23,6 @@
*/
#include "bpy_rna.h"
-#include "bpy_compat.h"
#include "bpy_util.h"
//#include "blendef.h"
#include "BLI_dynstr.h"
@@ -35,10 +34,15 @@
#include "RNA_define.h" /* for defining our own rna */
#include "MEM_guardedalloc.h"
+#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
#include "BKE_report.h"
+/* only for keyframing */
+#include "DNA_scene_types.h"
+#include "ED_keyframing.h"
+
#define USE_MATHUTILS
#ifdef USE_MATHUTILS
@@ -89,13 +93,14 @@ static int mathutils_rna_vector_set_index(BPy_PropertyRNA *self, int subtype, fl
}
Mathutils_Callback mathutils_rna_array_cb = {
- mathutils_rna_generic_check,
- mathutils_rna_vector_get,
- mathutils_rna_vector_set,
- mathutils_rna_vector_get_index,
- mathutils_rna_vector_set_index
+ (BaseMathCheckFunc) mathutils_rna_generic_check,
+ (BaseMathGetFunc) mathutils_rna_vector_get,
+ (BaseMathSetFunc) mathutils_rna_vector_set,
+ (BaseMathGetIndexFunc) mathutils_rna_vector_get_index,
+ (BaseMathSetIndexFunc) mathutils_rna_vector_set_index
};
+
/* bpyrna matrix callbacks */
static int mathutils_rna_matrix_cb_index= -1; /* index for our callbacks */
@@ -118,15 +123,81 @@ static int mathutils_rna_matrix_set(BPy_PropertyRNA *self, int subtype, float *m
}
Mathutils_Callback mathutils_rna_matrix_cb = {
- mathutils_rna_generic_check,
- mathutils_rna_matrix_get,
- mathutils_rna_matrix_set,
- NULL,
- NULL
+ (BaseMathCheckFunc) mathutils_rna_generic_check,
+ (BaseMathGetFunc) mathutils_rna_matrix_get,
+ (BaseMathSetFunc) mathutils_rna_matrix_set,
+ (BaseMathGetIndexFunc) NULL,
+ (BaseMathSetIndexFunc) NULL
};
+PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
+{
+ PyObject *ret= NULL;
+
+#ifdef USE_MATHUTILS
+ int type, subtype, totdim;
+ int len;
+
+ len= RNA_property_array_length(ptr, prop);
+ type= RNA_property_type(prop);
+ subtype= RNA_property_subtype(prop);
+ totdim= RNA_property_array_dimension(ptr, prop, NULL);
+
+ if (type != PROP_FLOAT) return NULL;
+
+ if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
+ ret = pyrna_prop_CreatePyObject(ptr, prop);
+
+ switch(RNA_property_subtype(prop)) {
+ case PROP_TRANSLATION:
+ case PROP_DIRECTION:
+ case PROP_VELOCITY:
+ case PROP_ACCELERATION:
+ case PROP_XYZ:
+ if(len>=2 && len <= 4) {
+ PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, FALSE);
+ Py_DECREF(ret); /* the vector owns now */
+ ret= vec_cb; /* return the vector instead */
+ }
+ break;
+ case PROP_MATRIX:
+ if(len==16) {
+ PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
+ Py_DECREF(ret); /* the matrix owns now */
+ ret= mat_cb; /* return the matrix instead */
+ }
+ else if (len==9) {
+ PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
+ Py_DECREF(ret); /* the matrix owns now */
+ ret= mat_cb; /* return the matrix instead */
+ }
+ break;
+ case PROP_EULER:
+ case PROP_QUATERNION:
+ if(len==3) { /* euler */
+ PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+ Py_DECREF(ret); /* the matrix owns now */
+ ret= eul_cb; /* return the matrix instead */
+ }
+ else if (len==4) {
+ PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+ Py_DECREF(ret); /* the matrix owns now */
+ ret= quat_cb; /* return the matrix instead */
+ }
+ break;
+ default:
+ break;
+ }
+ }
+#endif
+
+ return ret;
+}
+
#endif
+static StructRNA *pyrna_struct_as_srna(PyObject *self);
+
static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
{
return (a->ptr.data==b->ptr.data) ? 0 : -1;
@@ -137,25 +208,64 @@ static int pyrna_prop_compare( BPy_PropertyRNA * a, BPy_PropertyRNA * b )
return (a->prop==b->prop && a->ptr.data==b->ptr.data ) ? 0 : -1;
}
-/* For some reason python3 needs these :/ */
-static PyObject *pyrna_struct_richcmp(BPy_StructRNA * a, BPy_StructRNA * b, int op)
+static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
{
- int cmp_result= -1; /* assume false */
- if (BPy_StructRNA_Check(a) && BPy_StructRNA_Check(b)) {
- cmp_result= pyrna_struct_compare(a, b);
+ PyObject *res;
+ int ok= -1; /* zero is true */
+
+ if (BPy_StructRNA_Check(a) && BPy_StructRNA_Check(b))
+ ok= pyrna_struct_compare((BPy_StructRNA *)a, (BPy_StructRNA *)b);
+
+ 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_CmpToRich(op, cmp_result);
+ Py_INCREF(res);
+ return res;
}
-static PyObject *pyrna_prop_richcmp(BPy_PropertyRNA * a, BPy_PropertyRNA * b, int op)
+static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
{
- int cmp_result= -1; /* assume false */
- if (BPy_PropertyRNA_Check(a) && BPy_PropertyRNA_Check(b)) {
- cmp_result= pyrna_prop_compare(a, b);
+ PyObject *res;
+ int ok= -1; /* zero is true */
+
+ if (BPy_PropertyRNA_Check(a) && BPy_PropertyRNA_Check(b))
+ ok= pyrna_prop_compare((BPy_PropertyRNA *)a, (BPy_PropertyRNA *)b);
+
+ 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_CmpToRich(op, cmp_result);
+ Py_INCREF(res);
+ return res;
}
/*----------------------repr--------------------------------------------*/
@@ -165,14 +275,14 @@ static PyObject *pyrna_struct_repr( BPy_StructRNA * self )
char *name;
/* print name if available */
- name= RNA_struct_name_get_alloc(&self->ptr, NULL, 0);
+ name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
if(name) {
- pyob= PyUnicode_FromFormat( "[BPy_StructRNA \"%s\" -> \"%s\"]", RNA_struct_identifier(self->ptr.type), name);
+ pyob= PyUnicode_FromFormat( "[BPy_StructRNA \"%.200s\" -> \"%.200s\"]", RNA_struct_identifier(self->ptr.type), name);
MEM_freeN(name);
return pyob;
}
- return PyUnicode_FromFormat( "[BPy_StructRNA \"%s\"]", RNA_struct_identifier(self->ptr.type));
+ return PyUnicode_FromFormat( "[BPy_StructRNA \"%.200s\"]", RNA_struct_identifier(self->ptr.type));
}
static PyObject *pyrna_prop_repr( BPy_PropertyRNA * self )
@@ -184,16 +294,16 @@ static PyObject *pyrna_prop_repr( BPy_PropertyRNA * self )
/* if a pointer, try to print name of pointer target too */
if(RNA_property_type(self->prop) == PROP_POINTER) {
ptr= RNA_property_pointer_get(&self->ptr, self->prop);
- name= RNA_struct_name_get_alloc(&ptr, NULL, 0);
+ name= RNA_struct_name_get_alloc(&ptr, NULL, FALSE);
if(name) {
- pyob= PyUnicode_FromFormat( "[BPy_PropertyRNA \"%s\" -> \"%s\" -> \"%s\" ]", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
+ pyob= PyUnicode_FromFormat( "[BPy_PropertyRNA \"%.200s\" -> \"%.200s\" -> \"%.200s\" ]", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
MEM_freeN(name);
return pyob;
}
}
- return PyUnicode_FromFormat( "[BPy_PropertyRNA \"%s\" -> \"%s\"]", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
+ return PyUnicode_FromFormat( "[BPy_PropertyRNA \"%.200s\" -> \"%.200s\"]", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
}
static long pyrna_struct_hash( BPy_StructRNA * self )
@@ -204,79 +314,65 @@ static long pyrna_struct_hash( BPy_StructRNA * self )
/* use our own dealloc so we can free a property if we use one */
static void pyrna_struct_dealloc( BPy_StructRNA * self )
{
- /* Note!! for some weired reason calling PyObject_DEL() directly crashes blender! */
if (self->freeptr && self->ptr.data) {
IDP_FreeProperty(self->ptr.data);
MEM_freeN(self->ptr.data);
self->ptr.data= NULL;
}
+ /* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
Py_TYPE(self)->tp_free(self);
return;
}
static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
{
- const EnumPropertyItem *item;
+ EnumPropertyItem *item;
+ char *result;
+ int free= FALSE;
+
+ RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
+ if(item) {
+ result= (char*)BPy_enum_as_string(item);
+ }
+ else {
+ result= "";
+ }
- RNA_property_enum_items(ptr, prop, &item, NULL);
- return (char*)BPy_enum_as_string((EnumPropertyItem*)item);
+ 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);
+
+ if (param==NULL) {
+ 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);
+ return 0;
+ } else {
+ if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
+ 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);
+ return 0;
+ }
+ }
+
+ return 1;
}
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
PyObject *ret;
int type = RNA_property_type(prop);
- int len = RNA_property_array_length(prop);
-
- if (len > 0) {
- /* resolve the array from a new pytype */
- PyObject *ret = pyrna_prop_CreatePyObject(ptr, prop);
-
-#ifdef USE_MATHUTILS
-
- /* return a mathutils vector where possible */
- if(RNA_property_type(prop)==PROP_FLOAT) {
- switch(RNA_property_subtype(prop)) {
- case PROP_VECTOR:
- if(len>=2 && len <= 4) {
- PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, 0);
- Py_DECREF(ret); /* the vector owns now */
- ret= vec_cb; /* return the vector instead */
- }
- break;
- case PROP_MATRIX:
- if(len==16) {
- PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, 0);
- Py_DECREF(ret); /* the matrix owns now */
- ret= mat_cb; /* return the matrix instead */
- }
- else if (len==9) {
- PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, 0);
- Py_DECREF(ret); /* the matrix owns now */
- ret= mat_cb; /* return the matrix instead */
- }
- break;
- case PROP_ROTATION:
- if(len==3) { /* euler */
- PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, 0);
- Py_DECREF(ret); /* the matrix owns now */
- ret= eul_cb; /* return the matrix instead */
- }
- else if (len==4) {
- PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, 0);
- Py_DECREF(ret); /* the matrix owns now */
- ret= quat_cb; /* return the matrix instead */
- }
- break;
- default:
- break;
- }
- }
-#endif
-
- return ret;
+ if (RNA_property_array_check(ptr, prop)) {
+ return pyrna_py_from_array(ptr, prop);
}
/* see if we can coorce into a python type - PropertyType */
@@ -303,11 +399,32 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
const char *identifier;
int val = RNA_property_enum_get(ptr, prop);
- if (RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
+ if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) {
ret = PyUnicode_FromString( identifier );
} else {
- PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
- ret = NULL;
+ EnumPropertyItem *item;
+ int free= FALSE;
+
+ /* don't throw error here, can't trust blender 100% to give the
+ * right values, python code should not generate error for that */
+ RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
+ if(item && item->identifier) {
+ ret = PyUnicode_FromString( item->identifier );
+ }
+ else {
+ /* prefer not fail silently incase of api errors, maybe disable it later */
+ char error_str[128];
+ sprintf(error_str, "RNA Warning: Current value \"%d\" matches no enum", val);
+ PyErr_Warn(PyExc_RuntimeWarning, error_str);
+
+ ret = PyUnicode_FromString( "" );
+ }
+
+ if(free)
+ MEM_freeN(item);
+
+ /*PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
+ ret = NULL;*/
}
break;
@@ -328,7 +445,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
ret = pyrna_prop_CreatePyObject(ptr, prop);
break;
default:
- PyErr_Format(PyExc_AttributeError, "RNA Error: unknown type \"%d\" (pyrna_prop_to_py)", type);
+ PyErr_Format(PyExc_TypeError, "RNA Error: unknown type \"%d\" (pyrna_prop_to_py)", type);
ret = NULL;
break;
}
@@ -336,9 +453,9 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
return ret;
}
-/* This function is only used by operators right now
- * Its used for taking keyword args and filling in property values */
-int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefix)
+/* This function is used by operators and converting dicts into collections.
+ * Its takes keyword args and fills them with property values */
+int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix)
{
int error_val = 0;
int totkw;
@@ -353,25 +470,26 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefi
if (strcmp(arg_name, "rna_type")==0) continue;
if (kw==NULL) {
- PyErr_Format( PyExc_AttributeError, "%s: no keywords, expected \"%s\"", 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;
}
- item= PyDict_GetItemString(kw, arg_name);
+ item= PyDict_GetItemString(kw, arg_name); /* wont set an error */
if (item == NULL) {
- PyErr_Format( PyExc_AttributeError, "%s: keyword \"%s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val = -1; /* pyrna_py_to_prop sets the error */
- break;
- }
-
- if (pyrna_py_to_prop(ptr, prop, NULL, item)) {
- error_val= -1;
- break;
+ if(all_args) {
+ 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, item, error_prefix)) {
+ error_val= -1;
+ break;
+ }
+ totkw--;
}
-
- totkw--;
}
RNA_STRUCT_END;
@@ -385,7 +503,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefi
arg_name= NULL;
}
- PyErr_Format( PyExc_AttributeError, "%s: keyword \"%s\" 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;
}
@@ -397,9 +515,16 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
PyObject *pyrna_func_to_py(BPy_StructRNA *pyrna, FunctionRNA *func)
{
static PyMethodDef func_meth = {"<generic rna function>", (PyCFunction)pyrna_func_call, METH_VARARGS|METH_KEYWORDS, "python rna function"};
- PyObject *self= PyTuple_New(2);
+ PyObject *self;
PyObject *ret;
+
+ if(func==NULL) {
+ 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);
@@ -412,132 +537,37 @@ PyObject *pyrna_func_to_py(BPy_StructRNA *pyrna, FunctionRNA *func)
}
-int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value)
+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);
- int len = RNA_property_array_length(prop);
- if (len > 0) {
- PyObject *item;
- int py_len = -1;
- int i;
-
+
+ if (RNA_property_array_check(ptr, prop)) {
+
+ /* char error_str[512]; */
+ int ok= 1;
#ifdef USE_MATHUTILS
if(MatrixObject_Check(value)) {
MatrixObject *mat = (MatrixObject*)value;
if(!BaseMath_ReadCallback(mat))
return -1;
-
- py_len = mat->rowSize * mat->colSize;
} else /* continue... */
#endif
- if (PySequence_Check(value)) {
- py_len= (int)PySequence_Length(value);
- }
- else {
- PyErr_Format(PyExc_TypeError, "RNA array assignment expected a sequence instead of %s instance.", Py_TYPE(value)->tp_name);
+ if (!PySequence_Check(value)) {
+ PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment expected a sequence instead of %.200s instance.", error_prefix, Py_TYPE(value)->tp_name);
return -1;
}
/* done getting the length */
-
- if (py_len != len) {
- PyErr_Format(PyExc_AttributeError, "python sequence length %d did not match the RNA array length %d.", py_len, len);
- return -1;
- }
-
- /* for arrays we have a limited number of types */
- switch (type) {
- case PROP_BOOLEAN:
- {
- int *param_arr;
- if(data) param_arr= (int*)data;
- else param_arr= MEM_mallocN(sizeof(char) * len, "pyrna bool array");
-
-
- /* collect the variables before assigning, incase one of them is incorrect */
- for (i=0; i<len; i++) {
- item = PySequence_GetItem(value, i);
- param_arr[i] = PyObject_IsTrue( item );
- Py_DECREF(item);
-
- if (param_arr[i] < 0) {
- if(data==NULL)
- MEM_freeN(param_arr);
- PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence is not a boolean");
- return -1;
- }
- }
- if(data==NULL) {
- RNA_property_boolean_set_array(ptr, prop, param_arr);
- MEM_freeN(param_arr);
- }
-
- break;
- }
- case PROP_INT:
- {
- int *param_arr;
- if(data) param_arr= (int*)data;
- else param_arr= MEM_mallocN(sizeof(int) * len, "pyrna int array");
-
-
- /* collect the variables */
- for (i=0; i<len; i++) {
- item = PySequence_GetItem(value, i);
- param_arr[i] = (int)PyLong_AsSsize_t(item); /* deal with any errors later */
- Py_DECREF(item);
- }
-
- if (PyErr_Occurred()) {
- if(data==NULL)
- MEM_freeN(param_arr);
- PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as an int");
- return -1;
- }
- if(data==NULL) {
- RNA_property_int_set_array(ptr, prop, param_arr);
- MEM_freeN(param_arr);
- }
- break;
- }
- case PROP_FLOAT:
- {
- float *param_arr;
- if(data) param_arr = (float*)data;
- else param_arr = MEM_mallocN(sizeof(float) * len, "pyrna float array");
+ ok= pyrna_py_to_array(ptr, prop, data, value, error_prefix);
-
-#ifdef USE_MATHUTILS
- if(MatrixObject_Check(value) && RNA_property_subtype(prop) == PROP_MATRIX) {
- MatrixObject *mat = (MatrixObject*)value;
- memcpy(param_arr, mat->contigPtr, sizeof(float) * len);
- } else /* continue... */
-#endif
- {
- /* collect the variables */
- for (i=0; i<len; i++) {
- item = PySequence_GetItem(value, i);
- param_arr[i] = (float)PyFloat_AsDouble(item); /* deal with any errors later */
- Py_DECREF(item);
- }
- }
-
- if (PyErr_Occurred()) {
- if(data==NULL)
- MEM_freeN(param_arr);
- PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as a float");
- return -1;
- }
- if(data==NULL) {
- RNA_property_float_set_array(ptr, prop, param_arr);
- MEM_freeN(param_arr);
- }
- break;
- }
+ if (!ok) {
+ /* PyErr_Format(PyExc_AttributeError, "%.200s %s", error_prefix, error_str); */
+ return -1;
}
- } else {
+ }
+ else {
/* Normal Property (not an array) */
/* see if we can coorce into a python type - PropertyType */
@@ -547,7 +577,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
int param = PyObject_IsTrue( value );
if( param < 0 ) {
- PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
+ PyErr_Format(PyExc_TypeError, "%.200s expected True/False or 0/1", error_prefix);
return -1;
} else {
if(data) *((int*)data)= param;
@@ -559,7 +589,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
{
int param = PyLong_AsSsize_t(value);
if (PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected an int type");
+ PyErr_Format(PyExc_TypeError, "%.200s expected an int type", error_prefix);
return -1;
} else {
if(data) *((int*)data)= param;
@@ -571,7 +601,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
{
float param = PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected a float type");
+ PyErr_Format(PyExc_TypeError, "%.200s expected a float type", error_prefix);
return -1;
} else {
if(data) *((float*)data)= param;
@@ -584,7 +614,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
char *param = _PyUnicode_AsString(value);
if (param==NULL) {
- PyErr_SetString(PyExc_TypeError, "expected a string type");
+ PyErr_Format(PyExc_TypeError, "%.200s expected a string type", error_prefix);
return -1;
} else {
if(data) *((char**)data)= param;
@@ -594,42 +624,52 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
}
case PROP_ENUM:
{
- char *param = _PyUnicode_AsString(value);
-
- if (param==NULL) {
+ int val, i;
+
+ if (PyUnicode_Check(value)) {
+ if (!pyrna_string_to_enum(value, ptr, prop, &val, error_prefix))
+ return -1;
+ }
+ else if (PyTuple_Check(value)) {
+ /* tuple of enum items, concatenate all values with OR */
+ val= 0;
+ for (i= 0; i < PyTuple_Size(value); i++) {
+ int tmpval;
+
+ /* PyTuple_GET_ITEM returns a borrowed reference */
+ if (!pyrna_string_to_enum(PyTuple_GET_ITEM(value, i), ptr, prop, &tmpval, error_prefix))
+ return -1;
+
+ val |= tmpval;
+ }
+ }
+ else {
char *enum_str= pyrna_enum_as_string(ptr, prop);
- PyErr_Format(PyExc_TypeError, "expected a string enum type in (%s)", enum_str);
+ PyErr_Format(PyExc_TypeError, "%.200s expected a string enum or a tuple of strings in (%.200s)", error_prefix, enum_str);
MEM_freeN(enum_str);
return -1;
- } else {
- int val;
- if (RNA_property_enum_value(ptr, prop, param, &val)) {
- if(data) *((int*)data)= val;
- else RNA_property_enum_set(ptr, prop, val);
- } else {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
- PyErr_Format(PyExc_AttributeError, "enum \"%s\" not found in (%s)", param, enum_str);
- MEM_freeN(enum_str);
- return -1;
- }
}
+
+ if(data) *((int*)data)= val;
+ else RNA_property_enum_set(ptr, prop, val);
break;
}
case PROP_POINTER:
{
StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
+ int flag = RNA_property_flag(prop);
if(!BPy_StructRNA_Check(value) && value != Py_None) {
- PointerRNA tmp;
- RNA_pointer_create(NULL, ptype, NULL, &tmp);
- PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(tmp.type));
+ PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptype));
+ return -1;
+ } else if((flag & PROP_NEVER_NULL) && value == Py_None) {
+ PyErr_Format(PyExc_TypeError, "property can't be assigned a None value");
return -1;
} else {
BPy_StructRNA *param= (BPy_StructRNA*)value;
- int raise_error= 0;
+ int raise_error= FALSE;
if(data) {
- int flag = RNA_property_flag(prop);
if(flag & PROP_RNAPTR) {
if(value == Py_None)
@@ -644,7 +684,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
*((void**)data)= param->ptr.data;
}
else {
- raise_error= 1;
+ raise_error= TRUE;
}
}
else {
@@ -660,7 +700,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
else {
PointerRNA tmp;
RNA_pointer_create(NULL, ptype, NULL, &tmp);
- PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(tmp.type));
+ PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type));
return -1;
}
}
@@ -668,7 +708,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
if(raise_error) {
PointerRNA tmp;
RNA_pointer_create(NULL, ptype, NULL, &tmp);
- PyErr_Format(PyExc_TypeError, "expected a %s type", RNA_struct_identifier(tmp.type));
+ PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type));
return -1;
}
}
@@ -686,7 +726,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
/* convert a sequence of dict's into a collection */
if(!PySequence_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of dicts for an RNA collection");
+ PyErr_Format(PyExc_TypeError, "%.200s expected a sequence of dicts for an RNA collection", error_prefix);
return -1;
}
@@ -694,7 +734,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
for(i=0; i<seq_len; i++) {
item= PySequence_GetItem(value, i);
if(item==NULL || PyDict_Check(item)==0) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of dicts for an RNA collection");
+ PyErr_Format(PyExc_TypeError, "%.200s expected a sequence of dicts for an RNA collection", error_prefix);
Py_XDECREF(item);
return -1;
}
@@ -707,7 +747,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
else
RNA_property_collection_add(ptr, prop, &itemptr);
- if(pyrna_pydict_to_props(&itemptr, item, "Converting a python list to an RNA collection")==-1) {
+ if(pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) {
Py_DECREF(item);
return -1;
}
@@ -717,7 +757,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
break;
}
default:
- PyErr_SetString(PyExc_AttributeError, "unknown property type (pyrna_py_to_prop)");
+ PyErr_Format(PyExc_AttributeError, "%.200s unknown property type (pyrna_py_to_prop)", error_prefix);
return -1;
break;
}
@@ -726,202 +766,337 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v
return 0;
}
-static PyObject * pyrna_prop_to_py_index(PointerRNA *ptr, PropertyRNA *prop, int index)
+static PyObject * pyrna_prop_to_py_index(BPy_PropertyRNA *self, int index)
{
- PyObject *ret;
- int type = RNA_property_type(prop);
-
- /* see if we can coorce into a python type - PropertyType */
- switch (type) {
- case PROP_BOOLEAN:
- ret = PyBool_FromLong( RNA_property_boolean_get_index(ptr, prop, index) );
- break;
- case PROP_INT:
- ret = PyLong_FromSsize_t( (Py_ssize_t)RNA_property_int_get_index(ptr, prop, index) );
- break;
- case PROP_FLOAT:
- ret = PyFloat_FromDouble( RNA_property_float_get_index(ptr, prop, index) );
- break;
- default:
- PyErr_SetString(PyExc_AttributeError, "not an array type");
- ret = NULL;
- break;
- }
-
- return ret;
+ return pyrna_py_from_array_index(self, index);
}
-static int pyrna_py_to_prop_index(PointerRNA *ptr, PropertyRNA *prop, int index, PyObject *value)
+static int pyrna_py_to_prop_index(BPy_PropertyRNA *self, int index, PyObject *value)
{
int ret = 0;
+ int totdim;
+ PointerRNA *ptr= &self->ptr;
+ PropertyRNA *prop= self->prop;
int type = RNA_property_type(prop);
-
- /* see if we can coorce into a python type - PropertyType */
- switch (type) {
- case PROP_BOOLEAN:
- {
- int param = PyObject_IsTrue( value );
-
- if( param < 0 ) {
- PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
- ret = -1;
- } else {
- RNA_property_boolean_set_index(ptr, prop, index, param);
- }
- break;
- }
- case PROP_INT:
- {
- int param = PyLong_AsSsize_t(value);
- if (PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected an int type");
- ret = -1;
- } else {
- RNA_property_int_set_index(ptr, prop, index, param);
+
+ totdim= RNA_property_array_dimension(ptr, prop, NULL);
+
+ if (totdim > 1) {
+ /* char error_str[512]; */
+ if (!pyrna_py_to_array_index(&self->ptr, self->prop, self->arraydim, self->arrayoffset, index, value, "")) {
+ /* PyErr_SetString(PyExc_AttributeError, error_str); */
+ ret= -1;
}
- break;
}
- case PROP_FLOAT:
- {
- float param = PyFloat_AsDouble(value);
- if (PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected a float type");
+ else {
+ /* see if we can coorce into a python type - PropertyType */
+ switch (type) {
+ case PROP_BOOLEAN:
+ {
+ int param = PyObject_IsTrue( value );
+
+ if( param < 0 ) {
+ PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
+ ret = -1;
+ } else {
+ RNA_property_boolean_set_index(ptr, prop, index, param);
+ }
+ break;
+ }
+ case PROP_INT:
+ {
+ int param = PyLong_AsSsize_t(value);
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "expected an int type");
+ ret = -1;
+ } else {
+ RNA_property_int_set_index(ptr, prop, index, param);
+ }
+ break;
+ }
+ case PROP_FLOAT:
+ {
+ float param = PyFloat_AsDouble(value);
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "expected a float type");
+ ret = -1;
+ } else {
+ RNA_property_float_set_index(ptr, prop, index, param);
+ }
+ break;
+ }
+ default:
+ PyErr_SetString(PyExc_AttributeError, "not an array type");
ret = -1;
- } else {
- RNA_property_float_set_index(ptr, prop, index, param);
+ break;
}
- break;
- }
- default:
- PyErr_SetString(PyExc_AttributeError, "not an array type");
- ret = -1;
- break;
}
return ret;
}
//---------------sequence-------------------------------------------
+static int pyrna_prop_array_length(BPy_PropertyRNA *self)
+{
+ if (RNA_property_array_dimension(&self->ptr, self->prop, NULL) > 1)
+ return RNA_property_multi_array_length(&self->ptr, self->prop, self->arraydim);
+ else
+ return RNA_property_array_length(&self->ptr, self->prop);
+}
+
static Py_ssize_t pyrna_prop_len( BPy_PropertyRNA * self )
{
Py_ssize_t len;
if (RNA_property_type(self->prop) == PROP_COLLECTION) {
len = RNA_property_collection_length(&self->ptr, self->prop);
+ } else if (RNA_property_array_check(&self->ptr, self->prop)) {
+ len = pyrna_prop_array_length(self);
} else {
- len = RNA_property_array_length(self->prop);
-
- if (len==0) { /* not an array*/
- PyErr_SetString(PyExc_AttributeError, "len() only available for collection RNA types");
- return -1;
- }
+ PyErr_SetString(PyExc_AttributeError, "len() only available for collection and array RNA types");
+ len = -1; /* error value */
}
return len;
}
-static PyObject *pyrna_prop_subscript( BPy_PropertyRNA * self, PyObject *key )
+/* internal use only */
+static PyObject *prop_subscript_collection_int(BPy_PropertyRNA * self, int keynum)
{
- PyObject *ret;
PointerRNA newptr;
- int keynum = 0;
- char *keyname = NULL;
-
+
+ if(keynum < 0) keynum += RNA_property_collection_length(&self->ptr, self->prop);
+
+ if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr))
+ return pyrna_struct_CreatePyObject(&newptr);
+
+ PyErr_Format(PyExc_IndexError, "index %d out of range", keynum);
+ return NULL;
+}
+
+static PyObject *prop_subscript_array_int(BPy_PropertyRNA * self, int keynum)
+{
+ int len= pyrna_prop_array_length(self);
+
+ if(keynum < 0) keynum += len;
+
+ if(keynum >= 0 && keynum < len)
+ return pyrna_prop_to_py_index(self, keynum);
+
+ PyErr_Format(PyExc_IndexError, "index %d out of range", keynum);
+ return NULL;
+}
+
+static PyObject *prop_subscript_collection_str(BPy_PropertyRNA * self, char *keyname)
+{
+ PointerRNA newptr;
+ if(RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
+ return pyrna_struct_CreatePyObject(&newptr);
+
+ PyErr_Format(PyExc_KeyError, "key \"%.200s\" not found", keyname);
+ return NULL;
+}
+/* static PyObject *prop_subscript_array_str(BPy_PropertyRNA * self, char *keyname) */
+
+static PyObject *prop_subscript_collection_slice(BPy_PropertyRNA * self, int start, int stop)
+{
+ PointerRNA newptr;
+ PyObject *list = PyList_New(stop - start);
+ int count;
+
+ start = MIN2(start,stop); /* values are clamped from */
+
+ for(count = start; count < stop; count++) {
+ if(RNA_property_collection_lookup_int(&self->ptr, self->prop, count - start, &newptr)) {
+ PyList_SetItem(list, count - start, pyrna_struct_CreatePyObject(&newptr));
+ }
+ else {
+ Py_DECREF(list);
+
+ PyErr_SetString(PyExc_RuntimeError, "error getting an rna struct from a collection");
+ return NULL;
+ }
+ }
+
+ return list;
+}
+static PyObject *prop_subscript_array_slice(BPy_PropertyRNA * self, int start, int stop)
+{
+ PyObject *list = PyList_New(stop - start);
+ int count;
+
+ start = MIN2(start,stop); /* values are clamped from PySlice_GetIndicesEx */
+
+ for(count = start; count < stop; count++)
+ PyList_SetItem(list, count - start, pyrna_prop_to_py_index(self, count));
+
+ return list;
+}
+
+static PyObject *prop_subscript_collection(BPy_PropertyRNA * self, PyObject *key)
+{
if (PyUnicode_Check(key)) {
- keyname = _PyUnicode_AsString(key);
- } else if (PyLong_Check(key)) {
- keynum = PyLong_AsSsize_t(key);
- } else {
- PyErr_SetString(PyExc_AttributeError, "invalid key, key must be a string or an int");
+ return prop_subscript_collection_str(self, _PyUnicode_AsString(key));
+ }
+ else if (PyIndex_Check(key)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+
+ return prop_subscript_collection_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;
+
+ if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyList_New(0);
+ }
+ else if (step == 1) {
+ return prop_subscript_collection_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "invalid rna key, key must be a string or an int instead of %.200s instance.", Py_TYPE(key)->tp_name);
return NULL;
}
-
- if (RNA_property_type(self->prop) == PROP_COLLECTION) {
- int ok;
- if (keyname) ok = RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr);
- else ok = RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr);
-
- if (ok) {
- ret = pyrna_struct_CreatePyObject(&newptr);
- } else {
- PyErr_SetString(PyExc_AttributeError, "out of range");
- ret = NULL;
+}
+
+static PyObject *prop_subscript_array(BPy_PropertyRNA * self, PyObject *key)
+{
+ /*if (PyUnicode_Check(key)) {
+ return prop_subscript_array_str(self, _PyUnicode_AsString(key));
+ } else*/
+ if (PyIndex_Check(key)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ return prop_subscript_array_int(self, PyLong_AsSsize_t(key));
+ }
+ else if (PySlice_Check(key)) {
+ Py_ssize_t start, stop, step, slicelength;
+ int len = pyrna_prop_array_length(self);
+
+ if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyList_New(0);
}
-
- } else if (keyname) {
- PyErr_SetString(PyExc_AttributeError, "string keys are only supported for collections");
- ret = NULL;
- } else {
- int len = RNA_property_array_length(self->prop);
-
- if (len==0) { /* not an array*/
- PyErr_Format(PyExc_AttributeError, "not an array or collection %d", keynum);
- ret = NULL;
+ else if (step == 1) {
+ return prop_subscript_array_slice(self, start, stop);
}
-
- if (keynum >= len){
- PyErr_SetString(PyExc_AttributeError, "index out of range");
- ret = NULL;
- } else { /* not an array*/
- ret = pyrna_prop_to_py_index(&self->ptr, self->prop, keynum);
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna");
+ return NULL;
}
}
-
- return ret;
+ else {
+ PyErr_SetString(PyExc_AttributeError, "invalid key, key must be an int");
+ return NULL;
+ }
}
+static PyObject *pyrna_prop_subscript( BPy_PropertyRNA * self, PyObject *key )
+{
+ if (RNA_property_type(self->prop) == PROP_COLLECTION) {
+ return prop_subscript_collection(self, key);
+ } else if (RNA_property_array_check(&self->ptr, self->prop)) {
+ return prop_subscript_array(self, key);
+ }
-static int pyrna_prop_assign_subscript( BPy_PropertyRNA * self, PyObject *key, PyObject *value )
+ PyErr_SetString(PyExc_TypeError, "rna type is not an array or a collection");
+ return NULL;
+}
+
+static int prop_subscript_ass_array_slice(BPy_PropertyRNA * self, int begin, int end, PyObject *value)
{
- int ret = 0;
- int keynum = 0;
- char *keyname = NULL;
+ int count;
+
+ /* values are clamped from */
+ begin = MIN2(begin,end);
+
+ for(count = begin; count < end; count++) {
+ if(pyrna_py_to_prop_index(self, count - begin, value) == -1) {
+ /* TODO - this is wrong since some values have been assigned... will need to fix that */
+ return -1; /* pyrna_struct_CreatePyObject should set the error */
+ }
+ }
+
+ return 0;
+}
+
+static int prop_subscript_ass_array_int(BPy_PropertyRNA * self, int keynum, PyObject *value)
+{
+ int len= pyrna_prop_array_length(self);
+
+ if(keynum < 0) keynum += len;
+
+ if(keynum >= 0 && keynum < len)
+ return pyrna_py_to_prop_index(self, keynum, value);
+
+ PyErr_SetString(PyExc_IndexError, "out of range");
+ return -1;
+}
+
+static int pyrna_prop_ass_subscript( BPy_PropertyRNA * self, PyObject *key, PyObject *value )
+{
+ /* char *keyname = NULL; */ /* not supported yet */
if (!RNA_property_editable(&self->ptr, self->prop)) {
- PyErr_Format( PyExc_AttributeError, "PropertyRNA - attribute \"%s\" from \"%s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format( PyExc_AttributeError, "PropertyRNA - attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) );
return -1;
}
- if (PyUnicode_Check(key)) {
- keyname = _PyUnicode_AsString(key);
- } else if (PyLong_Check(key)) {
- keynum = PyLong_AsSsize_t(key);
- } else {
- PyErr_SetString(PyExc_AttributeError, "PropertyRNA - invalid key, key must be a string or an int");
+ /* maybe one day we can support this... */
+ if (RNA_property_type(self->prop) == PROP_COLLECTION) {
+ PyErr_Format( PyExc_AttributeError, "PropertyRNA - attribute \"%.200s\" from \"%.200s\" is a collection, assignment not supported", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) );
return -1;
}
-
- if (RNA_property_type(self->prop) == PROP_COLLECTION) {
- PyErr_SetString(PyExc_AttributeError, "PropertyRNA - assignment is not supported for collections (yet)");
- ret = -1;
- } else if (keyname) {
- PyErr_SetString(PyExc_AttributeError, "PropertyRNA - string keys are only supported for collections");
- ret = -1;
- } else {
- int len = RNA_property_array_length(self->prop);
-
- if (len==0) { /* not an array*/
- PyErr_Format(PyExc_AttributeError, "PropertyRNA - not an array or collection %d", keynum);
- ret = -1;
+
+ if (PyIndex_Check(key)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+
+ return prop_subscript_ass_array_int(self, i, value);
+ }
+ else if (PySlice_Check(key)) {
+ 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)
+ return -1;
+
+ if (slicelength <= 0) {
+ return 0;
}
-
- if (keynum >= len){
- PyErr_SetString(PyExc_AttributeError, "PropertyRNA - index out of range");
- ret = -1;
- } else {
- ret = pyrna_py_to_prop_index(&self->ptr, self->prop, keynum, value);
+ else if (step == 1) {
+ return prop_subscript_ass_array_slice(self, start, stop, value);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with rna");
+ return -1;
}
}
-
- return ret;
+ else {
+ PyErr_SetString(PyExc_AttributeError, "invalid key, key must be an int");
+ return -1;
+ }
}
-
static PyMappingMethods pyrna_prop_as_mapping = {
( lenfunc ) pyrna_prop_len, /* mp_length */
( binaryfunc ) pyrna_prop_subscript, /* mp_subscript */
- ( objobjargproc ) pyrna_prop_assign_subscript, /* mp_ass_subscript */
+ ( objobjargproc ) pyrna_prop_ass_subscript, /* mp_ass_subscript */
};
static int pyrna_prop_contains(BPy_PropertyRNA * self, PyObject *value)
@@ -957,6 +1132,25 @@ static PySequenceMethods pyrna_prop_as_sequence = {
(objobjproc)pyrna_prop_contains, /* sq_contains */
};
+
+static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA * self, PyObject *args)
+{
+ char *path;
+ int index= 0;
+ float cfra = CTX_data_scene(BPy_GetContext())->r.cfra;
+
+ if(!RNA_struct_is_ID(self->ptr.type)) {
+ PyErr_SetString( PyExc_TypeError, "StructRNA - keyframe_insert only for ID type");
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(args, "s|if:keyframe_insert", &path, &index, &cfra))
+ return NULL;
+
+ return PyBool_FromLong( insert_keyframe((ID *)self->ptr.data, NULL, NULL, path, index, cfra, 0));
+}
+
+
static PyObject *pyrna_struct_dir(BPy_StructRNA * self)
{
PyObject *ret, *dict;
@@ -1098,7 +1292,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA * self, PyObject *pyname )
BLI_freelistN(&newlb);
}
else {
- PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%s\" not found", name);
+ PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%.200s\" not found", name);
ret = NULL;
}
@@ -1116,21 +1310,21 @@ static int pyrna_struct_setattro( BPy_StructRNA * self, PyObject *pyname, PyObje
return 0;
}
else {
- PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%s\" not found", name);
+ PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%.200s\" not found", name);
return -1;
}
}
if (!RNA_property_editable(&self->ptr, prop)) {
- PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%s\" from \"%s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format( PyExc_AttributeError, "StructRNA - Attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
return -1;
}
/* pyrna_py_to_prop sets its own exceptions */
- return pyrna_py_to_prop(&self->ptr, prop, NULL, value);
+ return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "StructRNA - Attribute (setattr):");
}
-PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
{
PyObject *ret;
if (RNA_property_type(self->prop) != PROP_COLLECTION) {
@@ -1162,7 +1356,7 @@ PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
return ret;
}
-PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
{
PyObject *ret;
if (RNA_property_type(self->prop) != PROP_COLLECTION) {
@@ -1203,7 +1397,7 @@ PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
}
-PyObject *pyrna_prop_values(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_values(BPy_PropertyRNA *self)
{
PyObject *ret;
@@ -1225,48 +1419,348 @@ PyObject *pyrna_prop_values(BPy_PropertyRNA *self)
return ret;
}
+static PyObject *pyrna_prop_get(BPy_PropertyRNA *self, PyObject *args)
+{
+ PointerRNA newptr;
+
+ 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);
+
+ Py_INCREF(def);
+ return def;
+}
+
+
+static PyObject *pyrna_prop_add(BPy_PropertyRNA *self, PyObject *args)
+{
+ PointerRNA newptr;
+
+ RNA_property_collection_add(&self->ptr, self->prop, &newptr);
+ if(!newptr.data) {
+ PyErr_SetString( PyExc_TypeError, "add() not supported for this collection");
+ return NULL;
+ }
+ else {
+ return pyrna_struct_CreatePyObject(&newptr);
+ }
+}
+
+static PyObject *pyrna_prop_remove(BPy_PropertyRNA *self, PyObject *args)
+{
+ PyObject *ret;
+ int key= 0;
+
+ if (!PyArg_ParseTuple(args, "i:remove", &key))
+ return NULL;
+
+ if(!RNA_property_collection_remove(&self->ptr, self->prop, key)) {
+ PyErr_SetString( PyExc_TypeError, "remove() not supported for this collection");
+ return NULL;
+ }
+
+ ret = Py_None;
+ Py_INCREF(ret);
+
+ return ret;
+}
+
+static void foreach_attr_type( BPy_PropertyRNA *self, char *attr,
+ /* values to assign */
+ RawPropertyType *raw_type, int *attr_tot, int *attr_signed )
+{
+ PropertyRNA *prop;
+ *raw_type= -1;
+ *attr_tot= 0;
+ *attr_signed= FALSE;
+
+ RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
+ prop = RNA_struct_find_property(&itemptr, attr);
+ *raw_type= RNA_property_raw_type(prop);
+ *attr_tot = RNA_property_array_length(&itemptr, prop);
+ *attr_signed= (RNA_property_subtype(prop)==PROP_UNSIGNED) ? FALSE:TRUE;
+ break;
+ }
+ RNA_PROP_END;
+}
+
+/* pyrna_prop_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)
+{
+#if 0
+ int array_tot;
+ int target_tot;
+#endif
+
+ *size= *raw_type= *attr_tot= *attr_signed= FALSE;
+
+ 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" );
+ return -1;
+ }
+
+ *tot= PySequence_Length(*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);
+ *size= RNA_raw_type_sizeof(*raw_type);
+
+#if 0 // works fine but not strictly needed, we could allow RNA_property_collection_raw_* to do the checks
+ if((*attr_tot) < 1)
+ *attr_tot= 1;
+
+ if (RNA_property_type(self->prop) == PROP_COLLECTION)
+ array_tot = RNA_property_collection_length(&self->ptr, self->prop);
+ else
+ array_tot = RNA_property_array_length(&self->ptr, self->prop);
+
+
+ target_tot= array_tot * (*attr_tot);
+
+ /* 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);
+ return -1;
+ }
+#endif
+ }
+
+ return 0;
+}
+
+static int foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, const char *format)
+{
+ char f = format ? *format:'B'; /* B is assumed when not set */
+
+ switch(raw_type) {
+ case PROP_RAW_CHAR:
+ if (attr_signed) return (f=='b') ? 1:0;
+ else return (f=='B') ? 1:0;
+ case PROP_RAW_SHORT:
+ if (attr_signed) return (f=='h') ? 1:0;
+ else return (f=='H') ? 1:0;
+ case PROP_RAW_INT:
+ if (attr_signed) return (f=='i') ? 1:0;
+ else return (f=='I') ? 1:0;
+ case PROP_RAW_FLOAT:
+ return (f=='f') ? 1:0;
+ case PROP_RAW_DOUBLE:
+ return (f=='d') ? 1:0;
+ }
+
+ return 0;
+}
+
+static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
+{
+ PyObject *item;
+ int i=0, ok, buffer_is_compat;
+ void *array= NULL;
+
+ /* get/set both take the same args currently */
+ char *attr;
+ PyObject *seq;
+ int tot, size, attr_tot, attr_signed;
+ RawPropertyType raw_type;
+
+ if(foreach_parse_args(self, args, &attr, &seq, &tot, &size, &raw_type, &attr_tot, &attr_signed) < 0)
+ return NULL;
+
+ if(tot==0)
+ Py_RETURN_NONE;
+
+
+
+ if(set) { /* get the array from python */
+ buffer_is_compat = FALSE;
+ if(PyObject_CheckBuffer(seq)) {
+ Py_buffer buf;
+ PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
+
+ /* check if the buffer matches */
+
+ buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
+
+ if(buffer_is_compat) {
+ ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ }
+
+ PyBuffer_Release(&buf);
+ }
+
+ /* could not use the buffer, fallback to sequence */
+ if(!buffer_is_compat) {
+ array= PyMem_Malloc(size * tot);
+
+ for( ; i<tot; i++) {
+ item= PySequence_GetItem(seq, i);
+ switch(raw_type) {
+ case PROP_RAW_CHAR:
+ ((char *)array)[i]= (char)PyLong_AsSsize_t(item);
+ break;
+ case PROP_RAW_SHORT:
+ ((short *)array)[i]= (short)PyLong_AsSsize_t(item);
+ break;
+ case PROP_RAW_INT:
+ ((int *)array)[i]= (int)PyLong_AsSsize_t(item);
+ break;
+ case PROP_RAW_FLOAT:
+ ((float *)array)[i]= (float)PyFloat_AsDouble(item);
+ break;
+ case PROP_RAW_DOUBLE:
+ ((double *)array)[i]= (double)PyFloat_AsDouble(item);
+ break;
+ }
+
+ Py_DECREF(item);
+ }
+
+ ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+ }
+ }
+ else {
+ buffer_is_compat = FALSE;
+ if(PyObject_CheckBuffer(seq)) {
+ Py_buffer buf;
+ PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
+
+ /* check if the buffer matches, TODO - signed/unsigned types */
+
+ buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
+
+ if(buffer_is_compat) {
+ ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ }
+
+ PyBuffer_Release(&buf);
+ }
+
+ /* could not use the buffer, fallback to sequence */
+ if(!buffer_is_compat) {
+ array= PyMem_Malloc(size * tot);
+
+ ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+
+ if(!ok) i= tot; /* skip the loop */
+
+ for( ; i<tot; i++) {
+
+ switch(raw_type) {
+ case PROP_RAW_CHAR:
+ item= PyLong_FromSsize_t( (Py_ssize_t) ((char *)array)[i] );
+ break;
+ case PROP_RAW_SHORT:
+ item= PyLong_FromSsize_t( (Py_ssize_t) ((short *)array)[i] );
+ break;
+ case PROP_RAW_INT:
+ item= PyLong_FromSsize_t( (Py_ssize_t) ((int *)array)[i] );
+ break;
+ case PROP_RAW_FLOAT:
+ item= PyFloat_FromDouble( (double) ((float *)array)[i] );
+ break;
+ case PROP_RAW_DOUBLE:
+ item= PyFloat_FromDouble( (double) ((double *)array)[i] );
+ break;
+ }
+
+ PySequence_SetItem(seq, i, item);
+ Py_DECREF(item);
+ }
+ }
+ }
+
+ if(PyErr_Occurred()) {
+ /* Maybe we could make our own error */
+ PyErr_Print();
+ PyErr_SetString(PyExc_SystemError, "could not access the py sequence");
+ return NULL;
+ }
+ if (!ok) {
+ PyErr_SetString(PyExc_SystemError, "internal error setting the array");
+ return NULL;
+ }
+
+ if(array)
+ PyMem_Free(array);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *pyrna_prop_foreach_get(BPy_PropertyRNA *self, PyObject *args)
+{
+ return foreach_getset(self, args, 0);
+}
+
+static PyObject *pyrna_prop_foreach_set(BPy_PropertyRNA *self, PyObject *args)
+{
+ return foreach_getset(self, args, 1);
+}
+
/* A bit of a kludge, make a list out of a collection or array,
* then return the lists iter function, not especially fast but convenient for now */
PyObject *pyrna_prop_iter(BPy_PropertyRNA *self)
{
/* Try get values from a collection */
- PyObject *ret = pyrna_prop_values(self);
+ PyObject *ret;
+ PyObject *iter;
- if (ret==NULL) {
- /* collection did not work, try array */
- int len = RNA_property_array_length(self->prop);
+ if(RNA_property_array_check(&self->ptr, self->prop)) {
+ int len = pyrna_prop_array_length(self);
+ int i;
+ PyErr_Clear();
+ ret = PyList_New(len);
- if (len) {
- int i;
- PyErr_Clear();
- ret = PyList_New(len);
-
- for (i=0; i < len; i++) {
- PyList_SET_ITEM(ret, i, pyrna_prop_to_py_index(&self->ptr, self->prop, i));
- }
+ for (i=0; i < len; i++) {
+ PyList_SET_ITEM(ret, i, pyrna_prop_to_py_index(self, i));
}
}
-
- if (ret) {
- /* we know this is a list so no need to PyIter_Check */
- PyObject *iter = PyObject_GetIter(ret);
- Py_DECREF(ret);
- return iter;
+ else if ((ret = pyrna_prop_values(self))) {
+ /* do nothing */
+ }
+ else {
+ PyErr_SetString( PyExc_TypeError, "this BPy_PropertyRNA object is not iterable" );
+ return NULL;
}
- PyErr_SetString( PyExc_TypeError, "this BPy_PropertyRNA object is not iterable" );
- return NULL;
+
+ /* we know this is a list so no need to PyIter_Check */
+ iter = PyObject_GetIter(ret);
+ Py_DECREF(ret);
+ return iter;
}
static struct PyMethodDef pyrna_struct_methods[] = {
- {"__dir__", (PyCFunction)pyrna_struct_dir, METH_NOARGS, ""},
+
+ /* maybe this become and ID function */
+ {"keyframe_insert", (PyCFunction)pyrna_struct_keyframe_insert, METH_VARARGS, NULL},
+
+ {"__dir__", (PyCFunction)pyrna_struct_dir, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
static struct PyMethodDef pyrna_prop_methods[] = {
- {"keys", (PyCFunction)pyrna_prop_keys, METH_NOARGS, ""},
- {"items", (PyCFunction)pyrna_prop_items, METH_NOARGS, ""},
- {"values", (PyCFunction)pyrna_prop_values, METH_NOARGS, ""},
+ {"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},
+
+ {"add", (PyCFunction)pyrna_prop_add, METH_VARARGS, NULL},
+ {"remove", (PyCFunction)pyrna_prop_remove, METH_VARARGS, NULL},
+
+ /* array accessor function */
+ {"foreach_get", (PyCFunction)pyrna_prop_foreach_get, METH_VARARGS, NULL},
+ {"foreach_set", (PyCFunction)pyrna_prop_foreach_set, METH_VARARGS, NULL},
+
{NULL, NULL, 0, NULL}
};
@@ -1311,14 +1805,17 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
{
PyObject *ret;
int type = RNA_property_type(prop);
- int len = RNA_property_array_length(prop);
int a;
- if(len > 0) {
+ if(RNA_property_array_check(ptr, prop)) {
+ int len = RNA_property_array_length(ptr, prop);
+
/* resolve the array from a new pytype */
ret = PyTuple_New(len);
+ /* kazanbas: TODO make multidim sequences here */
+
switch (type) {
case PROP_BOOLEAN:
for(a=0; a<len; a++)
@@ -1333,7 +1830,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble( ((float*)data)[a] ));
break;
default:
- PyErr_Format(PyExc_AttributeError, "RNA Error: unknown array type \"%d\" (pyrna_param_to_py)", type);
+ PyErr_Format(PyExc_TypeError, "RNA Error: unknown array type \"%d\" (pyrna_param_to_py)", type);
ret = NULL;
break;
}
@@ -1360,11 +1857,17 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
const char *identifier;
int val = *(int*)data;
- if (RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
+ if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) {
ret = PyUnicode_FromString( identifier );
} else {
- PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
- ret = NULL;
+ /* prefer not fail silently incase of api errors, maybe disable it later */
+ char error_str[128];
+ sprintf(error_str, "RNA Warning: Current value \"%d\" matches no enum", val);
+ PyErr_Warn(PyExc_RuntimeWarning, error_str);
+
+ ret = PyUnicode_FromString( "" );
+ /*PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
+ ret = NULL;*/
}
break;
@@ -1380,8 +1883,12 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
newptr= *(PointerRNA*)data;
}
else {
- /* XXX this is missing the ID part! */
- RNA_pointer_create(NULL, type, *(void**)data, &newptr);
+ if(RNA_struct_is_ID(type)) {
+ RNA_id_pointer_create(*(void**)data, &newptr);
+ } else {
+ /* XXX this is missing the ID part! */
+ RNA_pointer_create(NULL, type, *(void**)data, &newptr);
+ }
}
if (newptr.data) {
@@ -1409,7 +1916,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
break;
}
default:
- PyErr_Format(PyExc_AttributeError, "RNA Error: unknown type \"%d\" (pyrna_param_to_py)", type);
+ PyErr_Format(PyExc_TypeError, "RNA Error: unknown type \"%d\" (pyrna_param_to_py)", type);
ret = NULL;
break;
}
@@ -1424,25 +1931,42 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
FunctionRNA *self_func= PyCObject_AsVoidPtr(PyTuple_GET_ITEM(self, 1));
PointerRNA funcptr;
- ParameterList *parms;
+ ParameterList parms;
ParameterIterator iter;
PropertyRNA *pret, *parm;
PyObject *ret, *item;
- int i, tlen, flag, err= 0;
- const char *tid, *fid, *pid;
+ int i, args_len, parms_len, flag, err= 0, kw_tot= 0, kw_arg;
+ const char *parm_id;
void *retdata= NULL;
+ /* Should never happen but it does in rare cases */
+ 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;
+ }
+
/* setup */
RNA_pointer_create(NULL, &RNA_Function, self_func, &funcptr);
pret= RNA_function_return(self_func);
- tlen= PyTuple_GET_SIZE(args);
+ args_len= PyTuple_GET_SIZE(args);
- parms= RNA_parameter_list_create(self_ptr, self_func);
- RNA_parameter_list_begin(parms, &iter);
+ RNA_parameter_list_create(&parms, self_ptr, self_func);
+ RNA_parameter_list_begin(&parms, &iter);
+ parms_len = RNA_parameter_list_size(&parms);
+
+ if(args_len + (kw ? PyDict_Size(kw):0) > parms_len) {
+ PyErr_Format(PyExc_TypeError, "%.200s.%.200s(): takes at most %d arguments, got %d", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), parms_len, args_len);
+ err= -1;
+ }
/* parse function parameters */
- for (i= 0; iter.valid; RNA_parameter_list_next(&iter)) {
+ for (i= 0; iter.valid && err==0; RNA_parameter_list_next(&iter)) {
parm= iter.parm;
if (parm==pret) {
@@ -1450,34 +1974,120 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
continue;
}
- pid= RNA_property_identifier(parm);
+ parm_id= RNA_property_identifier(parm);
flag= RNA_property_flag(parm);
item= NULL;
- if ((i < tlen) && (flag & PROP_REQUIRED)) {
+ if ((i < args_len) && (flag & PROP_REQUIRED)) {
item= PyTuple_GET_ITEM(args, i);
i++;
+
+ kw_arg= FALSE;
+ }
+ else if (kw != NULL) {
+ item= PyDict_GetItemString(kw, parm_id); /* borrow ref */
+ if(item)
+ kw_tot++; /* make sure invalid keywords are not given */
+
+ kw_arg= TRUE;
}
- else if (kw != NULL)
- item= PyDict_GetItemString(kw, pid); /* borrow ref */
if (item==NULL) {
if(flag & PROP_REQUIRED) {
- tid= RNA_struct_identifier(self_ptr->type);
- fid= RNA_function_identifier(self_func);
-
- PyErr_Format(PyExc_AttributeError, "%s.%s(): required parameter \"%s\" not specified", tid, fid, pid);
+ PyErr_Format(PyExc_TypeError, "%.200s.%.200s(): required parameter \"%.200s\" not specified", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), parm_id);
err= -1;
break;
}
- else
+ else /* PyDict_GetItemString wont raise an error */
continue;
}
- err= pyrna_py_to_prop(&funcptr, parm, 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
+ * could also write a function to prepend to error messages */
+ char error_prefix[512];
+ PyErr_Clear(); /* re-raise */
+
+ if(kw_arg==TRUE)
+ snprintf(error_prefix, sizeof(error_prefix), "%s.%s(): error with keyword argument \"%s\" - ", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), parm_id);
+ 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, iter.data, item, error_prefix);
- if(err!=0)
break;
+ }
+ }
+
+
+ /* Check if we gave args that dont exist in the function
+ * printing the error is slow but it should only happen when developing.
+ * the if below is quick, checking if it passed less keyword args then we gave.
+ * (Dont overwrite the error if we have one, otherwise can skip important messages and confuse with args)
+ */
+ if(err == 0 && kw && (PyDict_Size(kw) > kw_tot)) {
+ PyObject *key, *value;
+ Py_ssize_t pos = 0;
+
+ DynStr *bad_args= BLI_dynstr_new();
+ DynStr *good_args= BLI_dynstr_new();
+
+ char *arg_name, *bad_args_str, *good_args_str;
+ int found= FALSE, first= TRUE;
+
+ while (PyDict_Next(kw, &pos, &key, &value)) {
+
+ arg_name= _PyUnicode_AsString(key);
+ found= FALSE;
+
+ if(arg_name==NULL) { /* unlikely the argname is not a string but ignore if it is*/
+ PyErr_Clear();
+ }
+ else {
+ /* Search for arg_name */
+ RNA_parameter_list_begin(&parms, &iter);
+ for(; iter.valid; RNA_parameter_list_next(&iter)) {
+ parm= iter.parm;
+ if (strcmp(arg_name, RNA_property_identifier(parm))==0) {
+ found= TRUE;
+ break;
+ }
+ }
+
+ RNA_parameter_list_end(&iter);
+
+ if(found==FALSE) {
+ BLI_dynstr_appendf(bad_args, first ? "%s" : ", %s", arg_name);
+ first= FALSE;
+ }
+ }
+ }
+
+ /* list good args */
+ first= TRUE;
+
+ RNA_parameter_list_begin(&parms, &iter);
+ for(; iter.valid; RNA_parameter_list_next(&iter)) {
+ parm= iter.parm;
+ BLI_dynstr_appendf(good_args, first ? "%s" : ", %s", RNA_property_identifier(parm));
+ first= FALSE;
+ }
+ RNA_parameter_list_end(&iter);
+
+
+ bad_args_str= BLI_dynstr_get_cstring(bad_args);
+ good_args_str= BLI_dynstr_get_cstring(good_args);
+
+ PyErr_Format(PyExc_TypeError, "%.200s.%.200s(): was called with invalid keyword arguments(s) (%s), expected (%s)", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), bad_args_str, good_args_str);
+
+ BLI_dynstr_free(bad_args);
+ BLI_dynstr_free(good_args);
+ MEM_freeN(bad_args_str);
+ MEM_freeN(good_args_str);
+
+ err= -1;
}
ret= NULL;
@@ -1487,20 +2097,26 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
bContext *C= BPy_GetContext();
BKE_reports_init(&reports, RPT_STORE);
- RNA_function_call(C, &reports, self_ptr, self_func, parms);
+ RNA_function_call(C, &reports, self_ptr, self_func, &parms);
err= (BPy_reports_to_error(&reports))? -1: 0;
BKE_reports_clear(&reports);
/* return value */
- if(err==0)
- if(pret)
+ if(err==0) {
+ if(pret) {
ret= pyrna_param_to_py(&funcptr, pret, retdata);
+
+ /* possible there is an error in conversion */
+ if(ret==NULL)
+ err= -1;
+ }
+ }
}
/* cleanup */
RNA_parameter_list_end(&iter);
- RNA_parameter_list_free(parms);
+ RNA_parameter_list_free(&parms);
if (ret)
return ret;
@@ -1513,13 +2129,7 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw)
/*-----------------------BPy_StructRNA method def------------------------------*/
PyTypeObject pyrna_struct_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"StructRNA", /* tp_name */
sizeof( BPy_StructRNA ), /* tp_basicsize */
0, /* tp_itemsize */
@@ -1598,14 +2208,7 @@ PyTypeObject pyrna_struct_Type = {
/*-----------------------BPy_PropertyRNA method def------------------------------*/
PyTypeObject pyrna_prop_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
-
"PropertyRNA", /* tp_name */
sizeof( BPy_PropertyRNA ), /* tp_basicsize */
0, /* tp_itemsize */
@@ -1688,7 +2291,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
PyObject *item;
Py_INCREF(newclass);
-
+
if (RNA_struct_py_type_get(srna))
PyObSpit("RNA WAS SET - ", RNA_struct_py_type_get(srna));
@@ -1698,80 +2301,140 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
/* Not 100% needed but useful,
* having an instance within a type looks wrong however this instance IS an rna type */
+
+ /* python deals with the curcular ref */
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
item = pyrna_struct_CreatePyObject(&ptr);
+
+ //item = PyCObject_FromVoidPtr(srna, NULL);
PyDict_SetItemString(((PyTypeObject *)newclass)->tp_dict, "__rna__", item);
Py_DECREF(item);
/* done with rna instance */
}
-PyObject* pyrna_struct_Subtype(PointerRNA *ptr)
+/*
+static StructRNA *srna_from_self(PyObject *self);
+PyObject *BPy_GetStructRNA(PyObject *self)
+{
+ StructRNA *srna= pyrna_struct_as_srna(self);
+ PointerRNA ptr;
+ PyObject *ret;
+
+ RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
+ ret= pyrna_struct_CreatePyObject(&ptr);
+
+ if(ret) {
+ return ret;
+ }
+ else {
+ Py_RETURN_NONE;
+ }
+}
+*/
+
+static struct PyMethodDef pyrna_struct_subtype_methods[] = {
+ {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, ""},
+
+// {"__get_rna", (PyCFunction)BPy_GetStructRNA, METH_NOARGS, ""},
+ {NULL, NULL, 0, NULL}
+};
+
+
+PyObject* pyrna_srna_Subtype(StructRNA *srna)
{
PyObject *newclass = NULL;
- PropertyRNA *nameprop;
- if (ptr->type==NULL) {
+ if (srna == NULL) {
newclass= NULL; /* Nothing to do */
- } else if ((newclass= RNA_struct_py_type_get(ptr->data))) {
+ } else if ((newclass= RNA_struct_py_type_get(srna))) {
Py_INCREF(newclass);
- } else if ((nameprop = RNA_struct_name_property(ptr->type))) {
- /* for now, return the base RNA type rather then a real module */
-
- /* Assume RNA_struct_py_type_get(ptr->data) was alredy checked */
-
+ } else {
/* subclass equivelents
- class myClass(myBase):
some='value' # or ...
- - myClass = type(name='myClass', bases=(myBase,), dict={'some':'value'})
+ - myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
*/
- char name[256], *nameptr;
- const char *descr= RNA_struct_ui_description(ptr->type);
- PyObject *args = PyTuple_New(3);
- PyObject *bases = PyTuple_New(1);
- PyObject *dict = PyDict_New();
- PyObject *item;
-
-
- nameptr= RNA_property_string_get_alloc(ptr, nameprop, name, sizeof(name));
-
- // arg 1
- //PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(tp_name));
- PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(nameptr));
-
- // arg 2
- PyTuple_SET_ITEM(bases, 0, (PyObject *)&pyrna_struct_Type);
- Py_INCREF(&pyrna_struct_Type);
+ /* Assume RNA_struct_py_type_get(srna) was alredy checked */
+ StructRNA *base;
+
+ PyObject *py_base= NULL;
- PyTuple_SET_ITEM(args, 1, bases);
+ const char *idname= RNA_struct_identifier(srna);
+ const char *descr= RNA_struct_ui_description(srna);
+
+ if(!descr) descr= "(no docs)";
- // arg 3 - add an instance of the rna
- if(descr) {
- item= PyUnicode_FromString(descr);
- PyDict_SetItemString(dict, "__doc__", item);
- Py_DECREF(item);
+ /* get the base type */
+ base= RNA_struct_base(srna);
+ if(base && base != srna) {
+ /*/printf("debug subtype %s %p\n", RNA_struct_identifier(srna), srna); */
+ py_base= pyrna_srna_Subtype(base);
+ Py_DECREF(py_base); /* srna owns, this is only to pass as an arg */
}
- PyTuple_SET_ITEM(args, 2, dict); // fill with useful subclass things!
+ if(py_base==NULL) {
+ py_base= (PyObject *)&pyrna_struct_Type;
+ }
- if (PyErr_Occurred()) {
+ /* always use O not N when calling, N causes refcount errors */
+ newclass = PyObject_CallFunction( (PyObject*)&PyType_Type, "s(O){ssss}", idname, py_base, "__module__","bpy.types", "__doc__",descr);
+ /* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
+
+ /* PyObSpit("new class ref", newclass); */
+
+ if (newclass) {
+
+ /* srna owns one, and the other is owned by the caller */
+ pyrna_subtype_set_rna(newclass, srna);
+
+ Py_DECREF(newclass); /* let srna own */
+
+
+ /* attach functions into the class
+ * so you can do... bpy.types.Scene.SomeFunction()
+ */
+ {
+ PyMethodDef *ml;
+ for(ml= pyrna_struct_subtype_methods; ml->ml_name; ml++){
+ PyObject_SetAttrString(newclass, ml->ml_name, PyCFunction_New(ml, newclass));
+ }
+ }
+
+ }
+ else {
+ /* this should not happen */
PyErr_Print();
PyErr_Clear();
}
-
- newclass = PyObject_CallObject((PyObject *)&PyType_Type, args);
- Py_DECREF(args);
-
- if (newclass)
- pyrna_subtype_set_rna(newclass, ptr->data);
-
- if (name != nameptr)
- MEM_freeN(nameptr);
}
return newclass;
}
+/* use for subtyping so we know which srna is used for a PointerRNA */
+static StructRNA *srna_from_ptr(PointerRNA *ptr)
+{
+ if(ptr->type == &RNA_Struct) {
+ return ptr->data;
+ }
+ else {
+ return ptr->type;
+ }
+}
+
+/* always returns a new ref, be sure to decref when done */
+PyObject* pyrna_struct_Subtype(PointerRNA *ptr)
+{
+ return pyrna_srna_Subtype(srna_from_ptr(ptr));
+}
+
/*-----------------------CreatePyObject---------------------------------*/
PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
{
@@ -1780,29 +2443,29 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
if (ptr->data==NULL && ptr->type==NULL) { /* Operator RNA has NULL data */
Py_RETURN_NONE;
}
-
- if (ptr->type == &RNA_Struct) { /* always return a python subtype from rna struct types */
+ else {
PyTypeObject *tp = (PyTypeObject *)pyrna_struct_Subtype(ptr);
if (tp) {
pyrna = (BPy_StructRNA *) tp->tp_alloc(tp, 0);
+ Py_DECREF(tp); /* srna owns, cant hold a ref */
}
else {
fprintf(stderr, "Could not make type\n");
pyrna = ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
}
}
- else {
- pyrna = ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
- }
-
+
if( !pyrna ) {
PyErr_SetString( PyExc_MemoryError, "couldn't create BPy_StructRNA object" );
return NULL;
}
pyrna->ptr= *ptr;
- pyrna->freeptr= 0;
+ pyrna->freeptr= FALSE;
+
+ // PyObSpit("NewStructRNA: ", (PyObject *)pyrna);
+
return ( PyObject * ) pyrna;
}
@@ -1819,12 +2482,18 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
pyrna->ptr = *ptr;
pyrna->prop = prop;
+
+ pyrna->arraydim= 0;
+ pyrna->arrayoffset= 0;
return ( PyObject * ) pyrna;
}
+/* bpy.data from python */
+static PointerRNA *rna_module_ptr= NULL;
PyObject *BPY_rna_module( void )
{
+ BPy_StructRNA *pyrna;
PointerRNA ptr;
#ifdef USE_MATHUTILS // register mathutils callbacks, ok to run more then once.
@@ -1844,8 +2513,15 @@ PyObject *BPY_rna_module( void )
/* for now, return the base RNA type rather then a real module */
RNA_main_pointer_create(G.main, &ptr);
+ pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
- return pyrna_struct_CreatePyObject(&ptr);
+ rna_module_ptr= &pyrna->ptr;
+ return (PyObject *)pyrna;
+}
+
+void BPY_update_rna_module(void)
+{
+ RNA_main_pointer_create(G.main, rna_module_ptr);
}
#if 0
@@ -1878,12 +2554,12 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA * self, PyObject *pyna
if (RNA_property_collection_lookup_string(&self->ptr, self->prop, _PyUnicode_AsString(pyname), &newptr)) {
ret= pyrna_struct_Subtype(&newptr);
if (ret==NULL) {
- PyErr_Format(PyExc_SystemError, "bpy.types.%s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
+ PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
}
return ret;
}
else { /* Override the error */
- PyErr_Format(PyExc_AttributeError, "bpy.types.%s not a valid RNA_Struct", _PyUnicode_AsString(pyname));
+ PyErr_Format(PyExc_AttributeError, "bpy.types.%.200s RNA_Struct does not exist", _PyUnicode_AsString(pyname));
return NULL;
}
}
@@ -1891,8 +2567,8 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA * self, PyObject *pyna
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
static struct PyMethodDef pyrna_basetype_methods[] = {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
- {"register", (PyCFunction)pyrna_basetype_register, METH_VARARGS, ""},
- {"unregister", (PyCFunction)pyrna_basetype_unregister, METH_VARARGS, ""},
+ {"register", (PyCFunction)pyrna_basetype_register, METH_O, ""},
+ {"unregister", (PyCFunction)pyrna_basetype_unregister, METH_O, ""},
{NULL, NULL, 0, NULL}
};
@@ -1939,35 +2615,29 @@ PyObject *BPY_rna_types(void)
}
static struct PyMethodDef props_methods[] = {
- {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, ""},
- {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, ""},
{"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS, ""},
{"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, ""},
+ {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, ""},
{NULL, NULL, 0, NULL}
};
-#if PY_VERSION_HEX >= 0x03000000
static struct PyModuleDef props_module = {
PyModuleDef_HEAD_INIT,
- "bpyprops",
+ "bpy.props",
"",
-1,/* multiple "initialization" just copies the module dict. */
props_methods,
NULL, NULL, NULL, NULL
};
-#endif
PyObject *BPY_rna_props( void )
{
- PyObject *submodule, *mod;
-#if PY_VERSION_HEX >= 0x03000000
+ PyObject *submodule;
submodule= PyModule_Create(&props_module);
-#else /* Py2.x */
- submodule= Py_InitModule3( "bpy.props", props_methods, "" );
-#endif
-
- mod = PyModule_New("props");
- PyModule_AddObject( submodule, "props", mod );
/* INCREF since its its assumed that all these functions return the
* module with a new ref like PyDict_New, since they are passed to
@@ -1977,17 +2647,92 @@ PyObject *BPY_rna_props( void )
return submodule;
}
+static StructRNA *pyrna_struct_as_srna(PyObject *self)
+{
+ BPy_StructRNA *py_srna;
+ StructRNA *srna;
+
+ /* ack, PyObject_GetAttrString wont look up this types tp_dict first :/ */
+ if(PyType_Check(self)) {
+ py_srna = (BPy_StructRNA *)PyDict_GetItemString(((PyTypeObject *)self)->tp_dict, "__rna__");
+ Py_XINCREF(py_srna);
+ }
+
+ if(py_srna==NULL)
+ py_srna = (BPy_StructRNA*)PyObject_GetAttrString(self, "__rna__");
+
+ if(py_srna==NULL) {
+ PyErr_SetString(PyExc_SystemError, "internal error, self had no __rna__ attribute, should never happen.");
+ return NULL;
+ }
+
+ if(!BPy_StructRNA_Check(py_srna)) {
+ PyErr_Format(PyExc_SystemError, "internal error, __rna__ was of type %.200s, instead of %.200s instance.", Py_TYPE(py_srna)->tp_name, pyrna_struct_Type.tp_name);
+ Py_DECREF(py_srna);
+ return NULL;
+ }
+
+ if(py_srna->ptr.type != &RNA_Struct) {
+ PyErr_SetString(PyExc_SystemError, "internal error, __rna__ was not a RNA_Struct type of rna struct.");
+ Py_DECREF(py_srna);
+ return NULL;
+ }
+
+ srna= py_srna->ptr.data;
+ Py_DECREF(py_srna);
+
+ return srna;
+}
+
+
/* Orphan functions, not sure where they should go */
+/* get the srna for methods attached to types */
+/* */
+static StructRNA *srna_from_self(PyObject *self)
+{
+ /* 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;
+ }
+ else if (PyCObject_Check(self)) {
+ return PyCObject_AsVoidPtr(self);
+ }
+ 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 */
+
+ return pyrna_struct_as_srna(self);
+}
+
+/* operators use this so it can store the args given but defer running
+ * it until the operator runs where these values are used to setup the
+ * default args for that operator instance */
+static PyObject *bpy_prop_deferred_return(void *func, PyObject *kw)
+{
+ PyObject *ret = PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, PyCObject_FromVoidPtr(func, NULL));
+ PyTuple_SET_ITEM(ret, 1, kw);
+ Py_INCREF(kw);
+ return ret;
+}
/* Function that sets RNA, NOTE - self is NULL when called from python, but being abused from C so we can pass the srna allong
* This isnt incorrect since its a python object - but be careful */
-PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
+
+PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
{
- static char *kwlist[] = {"attr", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
+ static char *kwlist[] = {"attr", "name", "description", "default", NULL};
char *id, *name="", *description="";
- float min=FLT_MIN, max=FLT_MAX, soft_min=FLT_MIN, soft_max=FLT_MAX, def=0.0f;
-
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssfffff:FloatProperty", kwlist, &id, &name, &description, &min, &max, &soft_min, &soft_max, &def))
+ int def=0;
+ PropertyRNA *prop;
+ StructRNA *srna;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssi:BoolProperty", kwlist, &id, &name, &description, &def))
return NULL;
if (PyTuple_Size(args) > 0) {
@@ -1995,16 +2740,17 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- if (self && PyCObject_Check(self)) {
- StructRNA *srna = PyCObject_AsVoidPtr(self);
- RNA_def_float(srna, id, def, min, max, name, description, soft_min, soft_max);
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ prop= RNA_def_boolean(srna, id, def, name, description);
+ RNA_def_property_duplicate_pointers(prop);
Py_RETURN_NONE;
- } else {
- PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, PyCObject_FromVoidPtr((void *)BPy_FloatProperty, NULL));
- PyTuple_SET_ITEM(ret, 1, kw);
- Py_INCREF(kw);
- return ret;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_BoolProperty, kw);
}
}
@@ -2013,7 +2759,9 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
static char *kwlist[] = {"attr", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
char *id, *name="", *description="";
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, def=0;
-
+ PropertyRNA *prop;
+ StructRNA *srna;
+
if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiiiii:IntProperty", kwlist, &id, &name, &description, &min, &max, &soft_min, &soft_max, &def))
return NULL;
@@ -2022,26 +2770,29 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- if (self && PyCObject_Check(self)) {
- StructRNA *srna = PyCObject_AsVoidPtr(self);
- RNA_def_int(srna, id, def, min, max, name, description, soft_min, soft_max);
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ prop= RNA_def_int(srna, id, def, min, max, name, description, soft_min, soft_max);
+ RNA_def_property_duplicate_pointers(prop);
Py_RETURN_NONE;
- } else {
- PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, PyCObject_FromVoidPtr((void *)BPy_IntProperty, NULL));
- PyTuple_SET_ITEM(ret, 1, kw);
- Py_INCREF(kw);
- return ret;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_IntProperty, kw);
}
}
-PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
+PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
{
- static char *kwlist[] = {"attr", "name", "description", "default", NULL};
+ static char *kwlist[] = {"attr", "name", "description", "min", "max", "soft_min", "soft_max", "default", NULL};
char *id, *name="", *description="";
- int def=0;
-
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssi:BoolProperty", kwlist, &id, &name, &description, &def))
+ float min=FLT_MIN, max=FLT_MAX, soft_min=FLT_MIN, soft_max=FLT_MAX, def=0.0f;
+ PropertyRNA *prop;
+ StructRNA *srna;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssfffff:FloatProperty", kwlist, &id, &name, &description, &min, &max, &soft_min, &soft_max, &def))
return NULL;
if (PyTuple_Size(args) > 0) {
@@ -2049,16 +2800,17 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
}
- if (self && PyCObject_Check(self)) {
- StructRNA *srna = PyCObject_AsVoidPtr(self);
- RNA_def_boolean(srna, id, def, name, description);
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ prop= RNA_def_float(srna, id, def, min, max, name, description, soft_min, soft_max);
+ RNA_def_property_duplicate_pointers(prop);
Py_RETURN_NONE;
- } else {
- PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, PyCObject_FromVoidPtr((void *)BPy_BoolProperty, NULL));
- PyTuple_SET_ITEM(ret, 1, kw);
- Py_INCREF(kw);
- return ret;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_FloatProperty, kw);
}
}
@@ -2067,7 +2819,9 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
static char *kwlist[] = {"attr", "name", "description", "maxlen", "default", NULL};
char *id, *name="", *description="", *def="";
int maxlen=0;
-
+ PropertyRNA *prop;
+ StructRNA *srna;
+
if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssis:StringProperty", kwlist, &id, &name, &description, &maxlen, &def))
return NULL;
@@ -2075,20 +2829,239 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
PyErr_SetString(PyExc_ValueError, "all args must be keywors"); // TODO - py3 can enforce this.
return NULL;
}
+
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ prop= RNA_def_string(srna, id, def, maxlen, name, description);
+ RNA_def_property_duplicate_pointers(prop);
+ Py_RETURN_NONE;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_StringProperty, kw);
+ }
+}
+
+static EnumPropertyItem *enum_items_from_py(PyObject *value, const char *def, int *defvalue)
+{
+ EnumPropertyItem *items= NULL;
+ PyObject *item;
+ int seq_len, i, totitem= 0;
+
+ if(!PySequence_Check(value)) {
+ PyErr_SetString(PyExc_TypeError, "expected a sequence of tuples for the enum items");
+ return NULL;
+ }
+
+ 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");
+ 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);
+ return NULL;
+ }
+
+ tmp.value= i;
+ RNA_enum_item_add(&items, &totitem, &tmp);
+
+ if(def[0] && strcmp(def, tmp.identifier) == 0)
+ *defvalue= tmp.value;
+
+ Py_DECREF(item);
+ }
+
+ if(!def[0])
+ *defvalue= 0;
+
+ RNA_enum_item_end(&items, &totitem);
+
+ return items;
+}
+
+PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
+{
+ static char *kwlist[] = {"attr", "items", "name", "description", "default", NULL};
+ char *id, *name="", *description="", *def="";
+ int defvalue=0;
+ PyObject *items= Py_None;
+ EnumPropertyItem *eitems;
+ PropertyRNA *prop;
+ StructRNA *srna;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|sss:EnumProperty", kwlist, &id, &items, &name, &description, &def))
+ return NULL;
+
+ if (PyTuple_Size(args) > 0) {
+ PyErr_SetString(PyExc_ValueError, "all args must be keywors"); // TODO - py3 can enforce this.
+ return NULL;
+ }
- if (self && PyCObject_Check(self)) {
- StructRNA *srna = PyCObject_AsVoidPtr(self);
- RNA_def_string(srna, id, def, maxlen, name, description);
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ eitems= enum_items_from_py(items, def, &defvalue);
+ if(!eitems)
+ return NULL;
+
+ prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+ RNA_def_property_duplicate_pointers(prop);
+ MEM_freeN(eitems);
+
Py_RETURN_NONE;
- } else {
- PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, PyCObject_FromVoidPtr((void *)BPy_StringProperty, NULL));
- PyTuple_SET_ITEM(ret, 1, kw);
- Py_INCREF(kw);
- return ret;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_EnumProperty, kw);
}
}
+static StructRNA *pointer_type_from_py(PyObject *value)
+{
+ StructRNA *srna;
+
+ srna= srna_from_self(value);
+ if(!srna) {
+ PyErr_SetString(PyExc_SystemError, "expected an RNA type derived from IDPropertyGroup");
+ return NULL;
+ }
+
+ if(!RNA_struct_is_a(srna, &RNA_IDPropertyGroup)) {
+ PyErr_SetString(PyExc_SystemError, "expected an RNA type derived from IDPropertyGroup");
+ return NULL;
+ }
+
+ return srna;
+}
+
+PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw)
+{
+ static char *kwlist[] = {"attr", "type", "name", "description", NULL};
+ char *id, *name="", *description="";
+ PropertyRNA *prop;
+ StructRNA *srna, *ptype;
+ PyObject *type= Py_None;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ss:PointerProperty", kwlist, &id, &type, &name, &description))
+ return NULL;
+
+ if (PyTuple_Size(args) > 0) {
+ PyErr_SetString(PyExc_ValueError, "all args must be keywors"); // TODO - py3 can enforce this.
+ return NULL;
+ }
+
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ ptype= pointer_type_from_py(type);
+ if(!ptype)
+ return NULL;
+
+ prop= RNA_def_pointer_runtime(srna, id, ptype, name, description);
+ RNA_def_property_duplicate_pointers(prop);
+ Py_RETURN_NONE;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_PointerProperty, kw);
+ }
+ return NULL;
+}
+
+PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
+{
+ static char *kwlist[] = {"attr", "type", "name", "description", NULL};
+ char *id, *name="", *description="";
+ PropertyRNA *prop;
+ StructRNA *srna, *ptype;
+ PyObject *type= Py_None;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ss:CollectionProperty", kwlist, &id, &type, &name, &description))
+ return NULL;
+
+ if (PyTuple_Size(args) > 0) {
+ PyErr_SetString(PyExc_ValueError, "all args must be keywors"); // TODO - py3 can enforce this.
+ return NULL;
+ }
+
+ srna= srna_from_self(self);
+ if(srna==NULL && PyErr_Occurred()) {
+ return NULL; /* self's type was compatible but error getting the srna */
+ }
+ else if(srna) {
+ ptype= pointer_type_from_py(type);
+ if(!ptype)
+ return NULL;
+
+ prop= RNA_def_collection_runtime(srna, id, ptype, name, description);
+ RNA_def_property_duplicate_pointers(prop);
+ Py_RETURN_NONE;
+ }
+ else { /* operators defer running this function */
+ return bpy_prop_deferred_return((void *)BPy_CollectionProperty, kw);
+ }
+ return NULL;
+}
+
+static int deferred_register_props(PyObject *py_class, StructRNA *srna)
+{
+ PyObject *props, *dummy_args, *item;
+ int i;
+
+ props= PyObject_GetAttrString(py_class, "__props__");
+
+ if(!props) {
+ PyErr_Clear();
+ return 1;
+ }
+
+ dummy_args = PyTuple_New(0);
+
+ for(i=0; i<PyList_Size(props); i++) {
+ PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
+ item = PyList_GET_ITEM(props, i);
+
+ if(PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
+ PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
+ pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
+ py_srna_cobject = PyCObject_FromVoidPtr(srna, NULL);
+
+ py_ret = pyfunc(py_srna_cobject, dummy_args, py_kw);
+ Py_DECREF(py_srna_cobject);
+
+ if(py_ret) {
+ Py_DECREF(py_ret);
+ }
+ else {
+ Py_DECREF(dummy_args);
+ return 0;
+ }
+ }
+ else {
+ PyErr_Clear();
+ PyErr_SetString(PyExc_AttributeError, "expected list of dicts for __props__.");
+ Py_DECREF(dummy_args);
+ return 0;
+ }
+ }
+
+ Py_DECREF(dummy_args);
+ return 1;
+}
+
/*-------------------- Type Registration ------------------------*/
static int rna_function_arg_count(FunctionRNA *func)
@@ -2125,7 +3098,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (base_class) {
if (!PyObject_IsSubclass(py_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_TypeError, "expected %.200s subclass of class \"%.200s\"", class_type, name ? _PyUnicode_AsString(name):"<UNKNOWN>");
Py_XDECREF(name);
return -1;
}
@@ -2148,7 +3121,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 %s class to have an \"%s\" attribute", class_type, RNA_function_identifier(func));
+ PyErr_Format( PyExc_AttributeError, "expected %.200s class to have an \"%.200s\" attribute", class_type, RNA_function_identifier(func));
return -1;
}
@@ -2163,7 +3136,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
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, RNA_function_identifier(func));
+ PyErr_Format( PyExc_TypeError, "expected %.200s class \"%.200s\" attribute to be a function", class_type, RNA_function_identifier(func));
return -1;
}
@@ -2175,7 +3148,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
Py_DECREF(py_arg_count);
if (arg_count != func_arg_count) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" function to have %d args", class_type, RNA_function_identifier(func), func_arg_count);
+ PyErr_Format( PyExc_AttributeError, "expected %.200s class \"%.200s\" function to have %d args", class_type, RNA_function_identifier(func), func_arg_count);
return -1;
}
}
@@ -2201,13 +3174,13 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if(item) {
Py_DECREF(item); /* no need to keep a ref, the class owns it */
- if(pyrna_py_to_prop(dummyptr, prop, NULL, item) != 0)
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0)
return -1;
}
}
if (item==NULL && (flag & PROP_REGISTER_OPTIONAL)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class to have an \"%s\" attribute", class_type, identifier);
+ PyErr_Format( PyExc_AttributeError, "expected %.200s class to have an \"%.200s\" attribute", class_type, identifier);
return -1;
}
@@ -2216,7 +3189,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, item) != 0)
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0)
return -1;
}
}
@@ -2236,9 +3209,10 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
void *retdata= NULL;
int err= 0, i, flag;
- PyGILState_STATE gilstate = PyGILState_Ensure();
+ PyGILState_STATE gilstate;
- BPY_update_modules(); // XXX - the RNA pointers can change so update before running, would like a nicer solution for this.
+ bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
+ bpy_context_set(C, &gilstate);
py_class= RNA_struct_py_type_get(ptr->type);
@@ -2291,76 +3265,126 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
else {
Py_DECREF(py_class_instance);
- PyErr_Format(PyExc_AttributeError, "could not find function %s in %s 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 {
- PyErr_Format(PyExc_AttributeError, "could not create instance of %s to call callback function %s.", 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;
}
if (ret == NULL) { /* covers py_class_instance failing too */
- PyErr_Print(); /* XXX use reporting api? */
err= -1;
}
else {
if(retdata)
- err= pyrna_py_to_prop(&funcptr, pret, retdata, ret);
+ err= pyrna_py_to_prop(&funcptr, pret, retdata, ret, "calling class function:");
Py_DECREF(ret);
}
- PyGILState_Release(gilstate);
+ if(err != 0) {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ bpy_context_clear(C, &gilstate);
return err;
}
static void bpy_class_free(void *pyob_ptr)
{
+ PyObject *self= (PyObject *)pyob_ptr;
+ PyGILState_STATE gilstate;
+
+ gilstate = PyGILState_Ensure();
+
+ PyDict_Clear(((PyTypeObject*)self)->tp_dict);
+
if(G.f&G_DEBUG) {
- if(((PyObject *)pyob_ptr)->ob_refcnt > 1)
- PyObSpit("zombie class - ref should be 1", (PyObject *)pyob_ptr);
+ if(self->ob_refcnt > 1) {
+ PyObSpit("zombie class - ref should be 1", self);
+ }
}
+
Py_DECREF((PyObject *)pyob_ptr);
+
+ PyGILState_Release(gilstate);
}
-PyObject *pyrna_basetype_register(PyObject *self, PyObject *args)
+void pyrna_alloc_types(void)
{
- bContext *C= NULL;
- PyObject *py_class, *item;
- ReportList reports;
- StructRegisterFunc reg;
- BPy_StructRNA *py_srna;
- StructRNA *srna;
+ PyGILState_STATE gilstate;
- if(!PyArg_ParseTuple(args, "O:register", &py_class))
- return NULL;
+ PointerRNA ptr;
+ PropertyRNA *prop;
- if(!PyType_Check(py_class)) {
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no a Type object).");
- return NULL;
+ gilstate = PyGILState_Ensure();
+
+ /* avoid doing this lookup for every getattr */
+ RNA_blender_rna_pointer_create(&ptr);
+ prop = RNA_struct_find_property(&ptr, "structs");
+
+ RNA_PROP_BEGIN(&ptr, itemptr, prop) {
+ Py_DECREF(pyrna_struct_Subtype(&itemptr));
}
+ RNA_PROP_END;
- /* check we got an __rna__ attribute */
- item= PyObject_GetAttrString(py_class, "__rna__");
+ PyGILState_Release(gilstate);
+}
- if(!item || !BPy_StructRNA_Check(item)) {
- Py_XDECREF(item);
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no __rna__ property).");
- return NULL;
+
+void pyrna_free_types(void)
+{
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ /* avoid doing this lookup for every getattr */
+ RNA_blender_rna_pointer_create(&ptr);
+ prop = RNA_struct_find_property(&ptr, "structs");
+
+
+ RNA_PROP_BEGIN(&ptr, itemptr, prop) {
+ StructRNA *srna= srna_from_ptr(&itemptr);
+ void *py_ptr= RNA_struct_py_type_get(srna);
+
+ if(py_ptr) {
+#if 0 // XXX - should be able to do this but makes python crash on exit
+ bpy_class_free(py_ptr);
+#endif
+ RNA_struct_py_type_set(srna, NULL);
+ }
}
+ RNA_PROP_END;
+}
- /* check the __rna__ attribute has the right type */
- Py_DECREF(item);
- py_srna= (BPy_StructRNA*)item;
+/* Note! MemLeak XXX
+ *
+ * There is currently a bug where moving registering a python class does
+ * not properly manage refcounts from the python class, since the srna owns
+ * the python class this should not be so tricky but changing the references as
+ * youd expect when changing ownership crashes blender on exit so I had to comment out
+ * the decref. This is not so bad because the leak only happens when re-registering (hold F8)
+ * - Should still be fixed - Campbell
+ * */
+
+PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
+{
+ bContext *C= NULL;
+ ReportList reports;
+ StructRegisterFunc reg;
+ StructRNA *srna;
+ StructRNA *srna_new;
+ PyObject *item;
+ const char *identifier= "";
- if(py_srna->ptr.type != &RNA_Struct) {
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (not a Struct).");
+ srna= pyrna_struct_as_srna(py_class);
+ if(srna==NULL)
return NULL;
- }
/* check that we have a register callback for this type */
- reg= RNA_struct_register(py_srna->ptr.data);
+ reg= RNA_struct_register(srna);
if(!reg) {
PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no register supported).");
@@ -2370,11 +3394,19 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *args)
/* get the context, so register callback can do necessary refreshes */
C= BPy_GetContext();
- /* call the register callback */
+ /* call the register callback with reports & identifier */
BKE_reports_init(&reports, RPT_STORE);
- srna= reg(C, &reports, py_class, bpy_class_validate, bpy_class_call, bpy_class_free);
- if(!srna) {
+ item= PyObject_GetAttrString(py_class, "__name__");
+
+ if(item) {
+ identifier= _PyUnicode_AsString(item);
+ Py_DECREF(item); /* no need to keep a ref, the class owns it */
+ }
+
+ 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);
return NULL;
@@ -2382,44 +3414,32 @@ PyObject *pyrna_basetype_register(PyObject *self, PyObject *args)
BKE_reports_clear(&reports);
- pyrna_subtype_set_rna(py_class, srna); /* takes a ref to py_class */
+ pyrna_subtype_set_rna(py_class, srna_new); /* takes a ref to py_class */
+
+ /* old srna still references us, keep the check incase registering somehow can free it */
+ if(RNA_struct_py_type_get(srna)) {
+ RNA_struct_py_type_set(srna, NULL);
+ // Py_DECREF(py_class); // shuld be able to do this XXX since the old rna adds a new ref.
+ }
+
+ if(!deferred_register_props(py_class, srna_new))
+ return NULL;
Py_RETURN_NONE;
}
-PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *args)
+PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
{
bContext *C= NULL;
- PyObject *py_class, *item;
- BPy_StructRNA *py_srna;
StructUnregisterFunc unreg;
+ StructRNA *srna;
- if(!PyArg_ParseTuple(args, "O:unregister", &py_class))
- return NULL;
-
- if(!PyType_Check(py_class)) {
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no a Type object).");
- return NULL;
- }
-
- /* check we got an __rna__ attribute */
- item= PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "__rna__"); /* borrow ref */
-
- if(!item || !BPy_StructRNA_Check(item)) {
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no __rna__ property).");
- return NULL;
- }
-
- /* check the __rna__ attribute has the right type */
- py_srna= (BPy_StructRNA*)item;
-
- if(py_srna->ptr.type != &RNA_Struct) {
- PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (not a Struct).");
+ srna= pyrna_struct_as_srna(py_class);
+ if(srna==NULL)
return NULL;
- }
/* check that we have a unregister callback for this type */
- unreg= RNA_struct_unregister(py_srna->ptr.data);
+ unreg= RNA_struct_unregister(srna);
if(!unreg) {
PyErr_SetString(PyExc_AttributeError, "expected a Type subclassed from a registerable rna type (no unregister supported).");
@@ -2428,13 +3448,9 @@ PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *args)
/* get the context, so register callback can do necessary refreshes */
C= BPy_GetContext();
-
/* call unregister */
- unreg(C, py_srna->ptr.data);
-
- /* remove reference to old type */
- Py_DECREF(py_class);
+ unreg(C, srna); /* calls bpy_class_free, this decref's py_class */
Py_RETURN_NONE;
}
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index d2f01b06336..d006b168f45 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -55,12 +55,17 @@ typedef struct {
PyObject_HEAD /* required python macro */
PointerRNA ptr;
PropertyRNA *prop;
+
+ /* Arystan: this is a hack to allow sub-item r/w access like: face.uv[n][m] */
+ int arraydim; /* array dimension, e.g: 0 for face.uv, 2 for face.uv[n][m], etc. */
+ int arrayoffset; /* array first item offset, e.g. if face.uv is [4][2], arrayoffset for face.uv[n] is 2n */
} BPy_PropertyRNA;
/* cheap trick */
#define BPy_BaseTypeRNA BPy_PropertyRNA
PyObject *BPY_rna_module( void );
+void BPY_update_rna_module( void );
/*PyObject *BPY_rna_doc( void );*/
PyObject *BPY_rna_types( void );
PyObject *BPY_rna_props( void );
@@ -69,18 +74,33 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr );
PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop );
/* operators also need this to set args */
-int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value);
-int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefix);
+int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix);
+int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix);
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop);
/* functions for setting up new props - experemental */
-PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw);
PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw);
PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw);
+PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw);
/* function for registering types */
PyObject *pyrna_basetype_register(PyObject *self, PyObject *args);
PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *args);
+/* called before stopping python */
+void pyrna_alloc_types(void);
+void pyrna_free_types(void);
+
+/* primitive type conversion */
+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_py_from_array(PointerRNA *ptr, PropertyRNA *prop);
+PyObject *pyrna_py_from_array_index(BPy_PropertyRNA *self, int index);
+PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop);
+
#endif
diff --git a/source/blender/python/intern/bpy_scriptlink.c b/source/blender/python/intern/bpy_scriptlink.c
deleted file mode 100644
index e790942aeb5..00000000000
--- a/source/blender/python/intern/bpy_scriptlink.c
+++ /dev/null
@@ -1,73 +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_lamp_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_world_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_material_types.h"
-
-#include "BLI_blenlib.h"
-
-#include "BKE_blender.h"
-#include "BKE_global.h"
-#include "BKE_library.h"
-#include "BKE_main.h"
-
-
-/* only copies internal pointers, scriptlink usually is integral part of a struct */
-void BPY_copy_scriptlink( struct ScriptLink *scriptlink )
-{
-
- if( scriptlink->totscript ) {
- scriptlink->scripts = MEM_dupallocN(scriptlink->scripts);
- scriptlink->flag = MEM_dupallocN(scriptlink->flag);
- }
-
- return;
-}
-
-/* not free slink itself */
-void BPY_free_scriptlink( struct ScriptLink *slink )
-{
- if( slink->totscript ) {
- if( slink->flag ) {
- MEM_freeN( slink->flag );
- slink->flag= NULL;
- }
- if( slink->scripts ) {
- MEM_freeN( slink->scripts );
- slink->scripts= NULL;
- }
- }
-
- return;
-}
-
diff --git a/source/blender/python/intern/bpy_ui.c b/source/blender/python/intern/bpy_ui.c
index 088fe436c69..f03a83bee9c 100644
--- a/source/blender/python/intern/bpy_ui.c
+++ b/source/blender/python/intern/bpy_ui.c
@@ -26,7 +26,6 @@
#include "bpy_util.h"
#include "bpy_rna.h" /* for rna buttons */
#include "bpy_operator.h" /* for setting button operator properties */
-#include "bpy_compat.h"
#include "WM_types.h" /* for WM_OP_INVOKE_DEFAULT & friends */
@@ -41,336 +40,12 @@
#include "UI_interface.h"
#include "WM_api.h"
-static PyObject *Method_pupMenuBegin( PyObject * self, PyObject * args )
-{
- PyObject *py_context;
- char *title; int icon;
-
- if( !PyArg_ParseTuple( args, "O!si:pupMenuBegin", &PyCObject_Type, &py_context, &title, &icon))
- return NULL;
-
- return PyCObject_FromVoidPtr( uiPupMenuBegin(PyCObject_AsVoidPtr(py_context), title, icon), NULL );
-}
-
-static PyObject *Method_pupMenuEnd( PyObject * self, PyObject * args )
-{
- PyObject *py_context, *py_head;
-
- if( !PyArg_ParseTuple( args, "O!O!:pupMenuEnd", &PyCObject_Type, &py_context, &PyCObject_Type, &py_head))
- return NULL;
-
- uiPupMenuEnd(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_head));
-
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_defButO( PyObject * self, PyObject * args )
-{
- uiBut *but;
- PyObject *py_block, *py_keywords= NULL;
- char *opname, *butname, *tip;
- int exec, xco, yco, width, height;
-
- if( !PyArg_ParseTuple( args, "O!sisiiiis|O!:defButO", &PyCObject_Type, &py_block, &opname, &exec, &butname, &xco, &yco, &width, &height, &tip, &PyDict_Type, &py_keywords))
- return NULL;
-
- but= uiDefButO(PyCObject_AsVoidPtr(py_block), BUT, opname, exec, butname, xco, yco, width, height, tip);
-
- /* Optional python doctionary used to set python properties, just like how keyword args are used */
- if (py_keywords && PyDict_Size(py_keywords)) {
- if (pyrna_pydict_to_props(uiButGetOperatorPtrRNA(but), py_keywords, "") == -1)
- return NULL;
- }
-
- return PyCObject_FromVoidPtr(but, NULL);
-}
-
-static PyObject *Method_defAutoButR( PyObject * self, PyObject * args )
-{
- PyObject *py_block;
- BPy_StructRNA *py_rna;
- char *propname, *butname;
- int index, xco, yco, width, height;
- PropertyRNA *prop;
-
- if( !PyArg_ParseTuple( args, "O!O!sisiiii:defAutoButR", &PyCObject_Type, &py_block, &pyrna_struct_Type, &py_rna, &propname, &index, &butname, &xco, &yco, &width, &height))
- return NULL;
-
- // XXX This isnt that nice api, but we dont always have the rna property from python since its converted immediately into a PyObject
- prop = RNA_struct_find_property(&py_rna->ptr, propname);
- if (prop==NULL) {
- PyErr_SetString(PyExc_ValueError, "rna property not found");
- return NULL;
- }
-
- return PyCObject_FromVoidPtr( uiDefAutoButR(PyCObject_AsVoidPtr(py_block), &py_rna->ptr, prop, index, butname, 0, xco, yco, width, height), NULL);
-}
-
-
-
-static uiBlock *py_internal_uiBlockCreateFunc(struct bContext *C, struct ARegion *ar, void *arg1)
-{
- PyObject *ret, *args;
-
- args = Py_BuildValue("(NN)", PyCObject_FromVoidPtr(C, NULL), PyCObject_FromVoidPtr(ar, NULL));
- ret = PyObject_CallObject( (PyObject *)arg1, args );
- Py_DECREF(args);
-
- if (ret==NULL) {
- PyErr_Print();
- return NULL;
- }
- if (!PyCObject_Check(ret)) {
- printf("invalid return value, not a PyCObject block\n");
- return NULL;
- }
-
- return (uiBlock *)PyCObject_AsVoidPtr(ret);
-}
-
-static PyObject *Method_pupBlock( PyObject * self, PyObject * args )
-{
- PyObject *py_context, *py_func;
-
- if( !PyArg_ParseTuple( args, "O!O:pupBlock", &PyCObject_Type, &py_context, &py_func) )
- return NULL;
-
- if (!PyCallable_Check(py_func)) {
- PyErr_SetString(PyExc_ValueError, "arg not callable");
- return NULL;
- }
-
- uiPupBlock(PyCObject_AsVoidPtr(py_context), py_internal_uiBlockCreateFunc, (void *)py_func);
- Py_RETURN_NONE;
-}
-
-// XXX missing arg - UI_EMBOSS, do we care?
-// XXX well, right now this only is to distinguish whether we have regular buttons or for pulldowns (ton)
-static PyObject *Method_beginBlock( PyObject * self, PyObject * args )
-{
- PyObject *py_context, *py_ar;
- char *name;
-
- if( !PyArg_ParseTuple( args, "O!O!s:beginBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_ar, &name) )
- return NULL;
-
- return PyCObject_FromVoidPtr(uiBeginBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_ar), name, UI_EMBOSS), NULL);
-}
-
-static PyObject *Method_endBlock( PyObject * self, PyObject * args )
-{
- PyObject *py_context, *py_block;
-
- if( !PyArg_ParseTuple( args, "O!O!:endBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_block) )
- return NULL;
-
- uiEndBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_block));
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_drawBlock( PyObject * self, PyObject * args )
-{
- PyObject *py_context, *py_block;
-
- if( !PyArg_ParseTuple( args, "O!O!:drawBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_block) )
- return NULL;
-
- uiDrawBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_block));
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_popupBoundsBlock( PyObject * self, PyObject * args )
-{
- PyObject *py_block;
- int addval, mx, my;
-
- if( !PyArg_ParseTuple( args, "O!iii:popupBoundsBlock", &PyCObject_Type, &py_block, &addval, &mx, &my) )
- return NULL;
-
- uiPopupBoundsBlock(PyCObject_AsVoidPtr(py_block), addval, mx, my);
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_blockBeginAlign( PyObject * self, PyObject * args )
-{
- PyObject *py_block;
-
- if( !PyArg_ParseTuple( args, "O!:blockBeginAlign", &PyCObject_Type, &py_block) )
- return NULL;
-
- uiBlockBeginAlign(PyCObject_AsVoidPtr(py_block));
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_blockEndAlign( PyObject * self, PyObject * args )
-{
- PyObject *py_block;
-
- if( !PyArg_ParseTuple( args, "O!:blockEndAlign", &PyCObject_Type, &py_block))
- return NULL;
-
- uiBlockEndAlign(PyCObject_AsVoidPtr(py_block));
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_blockSetFlag( PyObject * self, PyObject * args )
-{
- PyObject *py_block;
- int flag; /* Note new py api should not use flags, but for this low level UI api its ok. */
-
- if( !PyArg_ParseTuple( args, "O!i:blockSetFlag", &PyCObject_Type, &py_block, &flag))
- return NULL;
-
- uiBlockSetFlag(PyCObject_AsVoidPtr(py_block), flag);
- Py_RETURN_NONE;
-}
-
-/* similar to Draw.c */
-static PyObject *Method_register( PyObject * self, PyObject * args )
-{
- PyObject *py_sl, *py_draw_func;
- SpaceLink *sl;
- if( !PyArg_ParseTuple( args, "O!O:register", &PyCObject_Type, &py_sl, &py_draw_func) )
- return NULL;
-
- sl = PyCObject_AsVoidPtr(py_sl);
-
- if(sl->spacetype!=SPACE_SCRIPT) { // XXX todo - add a script space when needed
- PyErr_SetString(PyExc_ValueError, "can only register in a script space");
- return NULL;
- }
- else {
- SpaceScript *scpt= (SpaceScript *)sl;
- char *filename = NULL;
-
- if (scpt->script==NULL) {
- scpt->script = MEM_callocN(sizeof(Script), "ScriptRegister");
- }
-
- BPY_getFileAndNum(&filename, NULL);
-
- if (filename) {
- strncpy(scpt->script->scriptname, filename, sizeof(scpt->script->scriptname));
-#if 0
- char *dot;
- dot = strchr(scpt->script->scriptname, '.'); /* remove extension */
- if (dot)
- *dot= '\0';
-#endif
- Py_XINCREF( py_draw_func );
- scpt->script->py_draw= (void *)py_draw_func;
- }
- else {
- return NULL; /* BPY_getFileAndNum sets the error */
- }
-
- if (filename==NULL) {
- return NULL;
- }
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_registerKey( PyObject * self, PyObject * args )
-{
- PyObject *py_context;
- PyObject *py_keywords= NULL;
- char *keymap_name, *operator_name;
- int spaceid, regionid;
- int keyval, evtval, q1, q2;
-
- wmWindowManager *wm;
- ListBase *keymap;
- wmKeymapItem *km;
-
- if( !PyArg_ParseTuple( args, "O!iissiiii|O!:registerKey", &PyCObject_Type, &py_context, &spaceid, &regionid, &keymap_name, &operator_name, &keyval, &evtval, &q1, &q2, &PyDict_Type, &py_keywords) )
- return NULL;
-
- wm= CTX_wm_manager(PyCObject_AsVoidPtr(py_context));
-
- /* keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0); */
- keymap= WM_keymap_listbase(wm, keymap_name, spaceid, regionid);
-
- km= WM_keymap_add_item(keymap, operator_name, keyval, evtval, q1, q2);
-
- /* Optional python doctionary used to set python properties, just like how keyword args are used */
- if (py_keywords && PyDict_Size(py_keywords)) {
- if (pyrna_pydict_to_props(km->ptr, py_keywords, "Registering keybinding") == -1)
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-static PyObject *Method_getRegonPtr( PyObject * self )
-{
- bContext *C= BPy_GetContext();
-
- ARegion *ar = CTX_wm_region(C);
- return PyCObject_FromVoidPtr(ar, NULL);
-}
-
-static PyObject *Method_getAreaPtr( PyObject * self )
-{
- bContext *C= BPy_GetContext();
-
- ScrArea *area = CTX_wm_area(C);
- return PyCObject_FromVoidPtr(area, NULL);
-}
-
-static PyObject *Method_getScreenPtr( PyObject * self )
-{
- bContext *C= BPy_GetContext();
-
- bScreen *screen= CTX_wm_screen(C);
- return PyCObject_FromVoidPtr(screen, NULL);
-}
-
-static PyObject *Method_getSpacePtr( PyObject * self )
-{
- bContext *C= BPy_GetContext();
-
- SpaceLink *sl= CTX_wm_space_data(C);
- return PyCObject_FromVoidPtr(sl, NULL);
-}
-
-static PyObject *Method_getWindowPtr( PyObject * self )
-{
- bContext *C= BPy_GetContext();
-
- wmWindow *window= CTX_wm_window(C);
- return PyCObject_FromVoidPtr(window, NULL);
-}
+/* Dummy Module, may want to include non RNA UI functions here, else it can be removed */
static struct PyMethodDef ui_methods[] = {
- {"pupMenuBegin", (PyCFunction)Method_pupMenuBegin, METH_VARARGS, ""},
- {"pupMenuEnd", (PyCFunction)Method_pupMenuEnd, METH_VARARGS, ""},
- {"defButO", (PyCFunction)Method_defButO, METH_VARARGS, ""},
- {"defAutoButR", (PyCFunction)Method_defAutoButR, METH_VARARGS, ""},
- {"pupBlock", (PyCFunction)Method_pupBlock, METH_VARARGS, ""},
- {"beginBlock", (PyCFunction)Method_beginBlock, METH_VARARGS, ""},
- {"endBlock", (PyCFunction)Method_endBlock, METH_VARARGS, ""},
- {"drawBlock", (PyCFunction)Method_drawBlock, METH_VARARGS, ""},
- {"popupBoundsBlock", (PyCFunction)Method_popupBoundsBlock, METH_VARARGS, ""},
- {"blockBeginAlign", (PyCFunction)Method_blockBeginAlign, METH_VARARGS, ""},
- {"blockEndAlign", (PyCFunction)Method_blockEndAlign, METH_VARARGS, ""},
- {"blockSetFlag", (PyCFunction)Method_blockSetFlag, METH_VARARGS, ""},
-
- {"register", (PyCFunction)Method_register, METH_VARARGS, ""}, // XXX not sure about this - registers current script with the ScriptSpace, like Draw.Register()
- {"registerKey", (PyCFunction)Method_registerKey, METH_VARARGS, ""}, // XXX could have this in another place too
-
-
- {"getRegonPtr", (PyCFunction)Method_getRegonPtr, METH_NOARGS, ""}, // XXX Nasty, we really need to improve dealing with context!
- {"getAreaPtr", (PyCFunction)Method_getAreaPtr, METH_NOARGS, ""},
- {"getScreenPtr", (PyCFunction)Method_getScreenPtr, METH_NOARGS, ""},
- {"getSpacePtr", (PyCFunction)Method_getSpacePtr, METH_NOARGS, ""},
- {"getWindowPtr", (PyCFunction)Method_getWindowPtr, METH_NOARGS, ""},
-
{NULL, NULL, 0, NULL}
};
-#if PY_VERSION_HEX >= 0x03000000
static struct PyModuleDef ui_module = {
PyModuleDef_HEAD_INIT,
"bpy.ui",
@@ -379,184 +54,11 @@ static struct PyModuleDef ui_module = {
ui_methods,
NULL, NULL, NULL, NULL
};
-#endif
PyObject *BPY_ui_module( void )
{
- PyObject *submodule, *mod;
-#if PY_VERSION_HEX >= 0x03000000
+ PyObject *submodule;
submodule= PyModule_Create(&ui_module);
-#else /* Py2.x */
- submodule= Py_InitModule3( "bpy.ui", ui_methods, "" );
-#endif
-
- /* uiBlock->flag (controls) */
- mod = PyModule_New("ui");
- PyModule_AddObject( submodule, "ui", mod );
- PyModule_AddObject( mod, "BLOCK_LOOP", PyLong_FromSsize_t(UI_BLOCK_LOOP) );
- PyModule_AddObject( mod, "BLOCK_RET_1", PyLong_FromSsize_t(UI_BLOCK_RET_1) );
- PyModule_AddObject( mod, "BLOCK_NUMSELECT", PyLong_FromSsize_t(UI_BLOCK_NUMSELECT) );
- PyModule_AddObject( mod, "BLOCK_ENTER_OK", PyLong_FromSsize_t(UI_BLOCK_ENTER_OK) );
- PyModule_AddObject( mod, "BLOCK_NOSHADOW", PyLong_FromSsize_t(UI_BLOCK_NOSHADOW) );
- PyModule_AddObject( mod, "BLOCK_MOVEMOUSE_QUIT", PyLong_FromSsize_t(UI_BLOCK_MOVEMOUSE_QUIT) );
- PyModule_AddObject( mod, "BLOCK_KEEP_OPEN", PyLong_FromSsize_t(UI_BLOCK_KEEP_OPEN) );
- PyModule_AddObject( mod, "BLOCK_POPUP", PyLong_FromSsize_t(UI_BLOCK_POPUP) );
-
- /* for executing operators (XXX move elsewhere) */
- mod = PyModule_New("wmTypes");
- PyModule_AddObject( submodule, "wmTypes", mod );
- PyModule_AddObject( mod, "OP_INVOKE_DEFAULT", PyLong_FromSsize_t(WM_OP_INVOKE_DEFAULT) );
- PyModule_AddObject( mod, "OP_INVOKE_REGION_WIN", PyLong_FromSsize_t(WM_OP_INVOKE_REGION_WIN) );
- PyModule_AddObject( mod, "OP_INVOKE_AREA", PyLong_FromSsize_t(WM_OP_INVOKE_AREA) );
- PyModule_AddObject( mod, "OP_INVOKE_SCREEN", PyLong_FromSsize_t(WM_OP_INVOKE_SCREEN) );
- PyModule_AddObject( mod, "OP_EXEC_DEFAULT", PyLong_FromSsize_t(WM_OP_EXEC_DEFAULT) );
- PyModule_AddObject( mod, "OP_EXEC_REGION_WIN", PyLong_FromSsize_t(WM_OP_EXEC_REGION_WIN) );
- PyModule_AddObject( mod, "OP_EXEC_AREA", PyLong_FromSsize_t(WM_OP_EXEC_AREA) );
- PyModule_AddObject( mod, "OP_EXEC_SCREEN", PyLong_FromSsize_t(WM_OP_EXEC_SCREEN) );
-
- mod = PyModule_New("keyValTypes");
- PyModule_AddObject( submodule, "keyValTypes", mod );
- PyModule_AddObject( mod, "ANY", PyLong_FromSsize_t(KM_ANY) );
- PyModule_AddObject( mod, "NOTHING", PyLong_FromSsize_t(KM_NOTHING) );
- PyModule_AddObject( mod, "PRESS", PyLong_FromSsize_t(KM_PRESS) );
- PyModule_AddObject( mod, "RELEASE", PyLong_FromSsize_t(KM_RELEASE) );
-
- mod = PyModule_New("keyModTypes");
- PyModule_AddObject( submodule, "keyModTypes", mod );
- PyModule_AddObject( mod, "SHIFT", PyLong_FromSsize_t(KM_SHIFT) );
- PyModule_AddObject( mod, "CTRL", PyLong_FromSsize_t(KM_CTRL) );
- PyModule_AddObject( mod, "ALT", PyLong_FromSsize_t(KM_ALT) );
- PyModule_AddObject( mod, "OSKEY", PyLong_FromSsize_t(KM_OSKEY) );
-
- PyModule_AddObject( mod, "SHIFT2", PyLong_FromSsize_t(KM_SHIFT2) );
- PyModule_AddObject( mod, "CTRL2", PyLong_FromSsize_t(KM_CTRL2) );
- PyModule_AddObject( mod, "ALT2", PyLong_FromSsize_t(KM_ALT2) );
- PyModule_AddObject( mod, "OSKEY2", PyLong_FromSsize_t(KM_OSKEY2) );
-
- mod = PyModule_New("keyTypes");
- PyModule_AddObject( submodule, "keyTypes", mod );
- PyModule_AddObject( mod, "A", PyLong_FromSsize_t(AKEY) );
- PyModule_AddObject( mod, "B", PyLong_FromSsize_t(BKEY) );
- PyModule_AddObject( mod, "C", PyLong_FromSsize_t(CKEY) );
- PyModule_AddObject( mod, "D", PyLong_FromSsize_t(DKEY) );
- PyModule_AddObject( mod, "E", PyLong_FromSsize_t(EKEY) );
- PyModule_AddObject( mod, "F", PyLong_FromSsize_t(FKEY) );
- PyModule_AddObject( mod, "G", PyLong_FromSsize_t(GKEY) );
- PyModule_AddObject( mod, "H", PyLong_FromSsize_t(HKEY) );
- PyModule_AddObject( mod, "I", PyLong_FromSsize_t(IKEY) );
- PyModule_AddObject( mod, "J", PyLong_FromSsize_t(JKEY) );
- PyModule_AddObject( mod, "K", PyLong_FromSsize_t(KKEY) );
- PyModule_AddObject( mod, "L", PyLong_FromSsize_t(LKEY) );
- PyModule_AddObject( mod, "M", PyLong_FromSsize_t(MKEY) );
- PyModule_AddObject( mod, "N", PyLong_FromSsize_t(NKEY) );
- PyModule_AddObject( mod, "O", PyLong_FromSsize_t(OKEY) );
- PyModule_AddObject( mod, "P", PyLong_FromSsize_t(PKEY) );
- PyModule_AddObject( mod, "Q", PyLong_FromSsize_t(QKEY) );
- PyModule_AddObject( mod, "R", PyLong_FromSsize_t(RKEY) );
- PyModule_AddObject( mod, "S", PyLong_FromSsize_t(SKEY) );
- PyModule_AddObject( mod, "T", PyLong_FromSsize_t(TKEY) );
- PyModule_AddObject( mod, "U", PyLong_FromSsize_t(UKEY) );
- PyModule_AddObject( mod, "V", PyLong_FromSsize_t(VKEY) );
- PyModule_AddObject( mod, "W", PyLong_FromSsize_t(WKEY) );
- PyModule_AddObject( mod, "X", PyLong_FromSsize_t(XKEY) );
- PyModule_AddObject( mod, "Y", PyLong_FromSsize_t(YKEY) );
- PyModule_AddObject( mod, "Z", PyLong_FromSsize_t(ZKEY) );
- PyModule_AddObject( mod, "ZERO", PyLong_FromSsize_t(ZEROKEY) );
- PyModule_AddObject( mod, "ONE", PyLong_FromSsize_t(ONEKEY) );
- PyModule_AddObject( mod, "TWO", PyLong_FromSsize_t(TWOKEY) );
- PyModule_AddObject( mod, "THREE", PyLong_FromSsize_t(THREEKEY) );
- PyModule_AddObject( mod, "FOUR", PyLong_FromSsize_t(FOURKEY) );
- PyModule_AddObject( mod, "FIVE", PyLong_FromSsize_t(FIVEKEY) );
- PyModule_AddObject( mod, "SIX", PyLong_FromSsize_t(SIXKEY) );
- PyModule_AddObject( mod, "SEVEN", PyLong_FromSsize_t(SEVENKEY) );
- PyModule_AddObject( mod, "EIGHT", PyLong_FromSsize_t(EIGHTKEY) );
- PyModule_AddObject( mod, "NINE", PyLong_FromSsize_t(NINEKEY) );
- PyModule_AddObject( mod, "CAPSLOCK", PyLong_FromSsize_t(CAPSLOCKKEY) );
- PyModule_AddObject( mod, "LEFTCTRL", PyLong_FromSsize_t(LEFTCTRLKEY) );
- PyModule_AddObject( mod, "LEFTALT", PyLong_FromSsize_t(LEFTALTKEY) );
- PyModule_AddObject( mod, "RIGHTALT", PyLong_FromSsize_t(RIGHTALTKEY) );
- PyModule_AddObject( mod, "RIGHTCTRL", PyLong_FromSsize_t(RIGHTCTRLKEY) );
- PyModule_AddObject( mod, "RIGHTSHIFT", PyLong_FromSsize_t(RIGHTSHIFTKEY) );
- PyModule_AddObject( mod, "LEFTSHIFT", PyLong_FromSsize_t(LEFTSHIFTKEY) );
- PyModule_AddObject( mod, "ESC", PyLong_FromSsize_t(ESCKEY) );
- PyModule_AddObject( mod, "TAB", PyLong_FromSsize_t(TABKEY) );
- PyModule_AddObject( mod, "RET", PyLong_FromSsize_t(RETKEY) );
- PyModule_AddObject( mod, "SPACE", PyLong_FromSsize_t(SPACEKEY) );
- PyModule_AddObject( mod, "LINEFEED", PyLong_FromSsize_t(LINEFEEDKEY) );
- PyModule_AddObject( mod, "BACKSPACE", PyLong_FromSsize_t(BACKSPACEKEY) );
- PyModule_AddObject( mod, "DEL", PyLong_FromSsize_t(DELKEY) );
- PyModule_AddObject( mod, "SEMICOLON", PyLong_FromSsize_t(SEMICOLONKEY) );
- PyModule_AddObject( mod, "PERIOD", PyLong_FromSsize_t(PERIODKEY) );
- PyModule_AddObject( mod, "COMMA", PyLong_FromSsize_t(COMMAKEY) );
- PyModule_AddObject( mod, "QUOTE", PyLong_FromSsize_t(QUOTEKEY) );
- PyModule_AddObject( mod, "ACCENTGRAVE", PyLong_FromSsize_t(ACCENTGRAVEKEY) );
- PyModule_AddObject( mod, "MINUS", PyLong_FromSsize_t(MINUSKEY) );
- PyModule_AddObject( mod, "SLASH", PyLong_FromSsize_t(SLASHKEY) );
- PyModule_AddObject( mod, "BACKSLASH", PyLong_FromSsize_t(BACKSLASHKEY) );
- PyModule_AddObject( mod, "EQUAL", PyLong_FromSsize_t(EQUALKEY) );
- PyModule_AddObject( mod, "LEFTBRACKET", PyLong_FromSsize_t(LEFTBRACKETKEY) );
- PyModule_AddObject( mod, "RIGHTBRACKET", PyLong_FromSsize_t(RIGHTBRACKETKEY) );
- PyModule_AddObject( mod, "LEFTARROW", PyLong_FromSsize_t(LEFTARROWKEY) );
- PyModule_AddObject( mod, "DOWNARROW", PyLong_FromSsize_t(DOWNARROWKEY) );
- PyModule_AddObject( mod, "RIGHTARROW", PyLong_FromSsize_t(RIGHTARROWKEY) );
- PyModule_AddObject( mod, "UPARROW", PyLong_FromSsize_t(UPARROWKEY) );
- PyModule_AddObject( mod, "PAD0", PyLong_FromSsize_t(PAD0) );
- PyModule_AddObject( mod, "PAD1", PyLong_FromSsize_t(PAD1) );
- PyModule_AddObject( mod, "PAD2", PyLong_FromSsize_t(PAD2) );
- PyModule_AddObject( mod, "PAD3", PyLong_FromSsize_t(PAD3) );
- PyModule_AddObject( mod, "PAD4", PyLong_FromSsize_t(PAD4) );
- PyModule_AddObject( mod, "PAD5", PyLong_FromSsize_t(PAD5) );
- PyModule_AddObject( mod, "PAD6", PyLong_FromSsize_t(PAD6) );
- PyModule_AddObject( mod, "PAD7", PyLong_FromSsize_t(PAD7) );
- PyModule_AddObject( mod, "PAD8", PyLong_FromSsize_t(PAD8) );
- PyModule_AddObject( mod, "PAD9", PyLong_FromSsize_t(PAD9) );
- PyModule_AddObject( mod, "PADPERIOD", PyLong_FromSsize_t(PADPERIOD) );
- PyModule_AddObject( mod, "PADSLASH", PyLong_FromSsize_t(PADSLASHKEY) );
- PyModule_AddObject( mod, "PADASTER", PyLong_FromSsize_t(PADASTERKEY) );
- PyModule_AddObject( mod, "PADMINUS", PyLong_FromSsize_t(PADMINUS) );
- PyModule_AddObject( mod, "PADENTER", PyLong_FromSsize_t(PADENTER) );
- PyModule_AddObject( mod, "PADPLUS", PyLong_FromSsize_t(PADPLUSKEY) );
- PyModule_AddObject( mod, "F1", PyLong_FromSsize_t(F1KEY) );
- PyModule_AddObject( mod, "F2", PyLong_FromSsize_t(F2KEY) );
- PyModule_AddObject( mod, "F3", PyLong_FromSsize_t(F3KEY) );
- PyModule_AddObject( mod, "F4", PyLong_FromSsize_t(F4KEY) );
- PyModule_AddObject( mod, "F5", PyLong_FromSsize_t(F5KEY) );
- PyModule_AddObject( mod, "F6", PyLong_FromSsize_t(F6KEY) );
- PyModule_AddObject( mod, "F7", PyLong_FromSsize_t(F7KEY) );
- PyModule_AddObject( mod, "F8", PyLong_FromSsize_t(F8KEY) );
- PyModule_AddObject( mod, "F9", PyLong_FromSsize_t(F9KEY) );
- PyModule_AddObject( mod, "F10", PyLong_FromSsize_t(F10KEY) );
- PyModule_AddObject( mod, "F11", PyLong_FromSsize_t(F11KEY) );
- PyModule_AddObject( mod, "F12", PyLong_FromSsize_t(F12KEY) );
- PyModule_AddObject( mod, "PAUSE", PyLong_FromSsize_t(PAUSEKEY) );
- PyModule_AddObject( mod, "INSERT", PyLong_FromSsize_t(INSERTKEY) );
- PyModule_AddObject( mod, "HOME", PyLong_FromSsize_t(HOMEKEY) );
- PyModule_AddObject( mod, "PAGEUP", PyLong_FromSsize_t(PAGEUPKEY) );
- PyModule_AddObject( mod, "PAGEDOWN", PyLong_FromSsize_t(PAGEDOWNKEY) );
- PyModule_AddObject( mod, "END", PyLong_FromSsize_t(ENDKEY) );
- PyModule_AddObject( mod, "UNKNOWN", PyLong_FromSsize_t(UNKNOWNKEY) );
- PyModule_AddObject( mod, "COMMAND", PyLong_FromSsize_t(COMMANDKEY) );
- PyModule_AddObject( mod, "GRLESS", PyLong_FromSsize_t(GRLESSKEY) );
-
- mod = PyModule_New("spaceTypes");
- PyModule_AddObject( submodule, "spaceTypes", mod );
- PyModule_AddObject( mod, "EMPTY", PyLong_FromSsize_t(SPACE_EMPTY) );
- PyModule_AddObject( mod, "VIEW3D", PyLong_FromSsize_t(SPACE_VIEW3D) );
- PyModule_AddObject( mod, "IPO", PyLong_FromSsize_t(SPACE_IPO) );
- PyModule_AddObject( mod, "OUTLINER", PyLong_FromSsize_t(SPACE_OUTLINER) );
- PyModule_AddObject( mod, "BUTS", PyLong_FromSsize_t(SPACE_BUTS) );
- PyModule_AddObject( mod, "FILE", PyLong_FromSsize_t(SPACE_FILE) );
- PyModule_AddObject( mod, "IMAGE", PyLong_FromSsize_t(SPACE_IMAGE) );
- PyModule_AddObject( mod, "INFO", PyLong_FromSsize_t(SPACE_INFO) );
- PyModule_AddObject( mod, "SEQ", PyLong_FromSsize_t(SPACE_SEQ) );
- PyModule_AddObject( mod, "TEXT", PyLong_FromSsize_t(SPACE_TEXT) );
- PyModule_AddObject( mod, "IMASEL", PyLong_FromSsize_t(SPACE_IMASEL) );
- PyModule_AddObject( mod, "SOUND", PyLong_FromSsize_t(SPACE_SOUND) );
- PyModule_AddObject( mod, "ACTION", PyLong_FromSsize_t(SPACE_ACTION) );
- PyModule_AddObject( mod, "NLA", PyLong_FromSsize_t(SPACE_NLA) );
- PyModule_AddObject( mod, "SCRIPT", PyLong_FromSsize_t(SPACE_SCRIPT) );
- PyModule_AddObject( mod, "TIME", PyLong_FromSsize_t(SPACE_TIME) );
- PyModule_AddObject( mod, "NODE", PyLong_FromSsize_t(SPACE_NODE) );
/* INCREF since its its assumed that all these functions return the
* module with a new ref like PyDict_New, since they are passed to
@@ -565,5 +67,3 @@ PyObject *BPY_ui_module( void )
return submodule;
}
-
-
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index bce73b903c0..1766be62c83 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -122,46 +122,6 @@ int BPY_flag_from_seq(BPY_flag_def *flagdef, PyObject *seq, int *flag)
return 0; /* ok */
}
-
-/* Copied from pythons 3's Object.c */
-#ifndef Py_CmpToRich
-PyObject *
-Py_CmpToRich(int op, int cmp)
-{
- PyObject *res;
- int ok;
-
- if (PyErr_Occurred())
- return NULL;
- switch (op) {
- case Py_LT:
- ok = cmp < 0;
- break;
- case Py_LE:
- ok = cmp <= 0;
- break;
- case Py_EQ:
- ok = cmp == 0;
- break;
- case Py_NE:
- ok = cmp != 0;
- break;
- case Py_GT:
- ok = cmp > 0;
- break;
- case Py_GE:
- ok = cmp >= 0;
- break;
- default:
- PyErr_BadArgument();
- return NULL;
- }
- res = ok ? Py_True : Py_False;
- Py_INCREF(res);
- return res;
-}
-#endif
-
/* for debugging */
void PyObSpit(char *name, PyObject *var) {
fprintf(stderr, "<%s> : ", name);
@@ -170,7 +130,7 @@ void PyObSpit(char *name, PyObject *var) {
}
else {
PyObject_Print(var, stderr, 0);
- fprintf(stderr, " ref:%d ", var->ob_refcnt);
+ fprintf(stderr, " ref:%d ", (int)var->ob_refcnt);
fprintf(stderr, " ptr:%p", (void *)var);
fprintf(stderr, " type:");
@@ -304,12 +264,21 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
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);
+ 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);
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);
+ return -1;
+ }
break;
case 'f':
if (PyMethod_Check(item))
@@ -348,8 +317,8 @@ PyObject *BPY_exception_buffer(void)
PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
PyObject *string_io = NULL;
PyObject *string_io_buf = NULL;
- PyObject *string_io_mod;
- PyObject *string_io_getvalue;
+ PyObject *string_io_mod= NULL;
+ PyObject *string_io_getvalue= NULL;
PyObject *error_type, *error_value, *error_traceback;
@@ -364,19 +333,12 @@ PyObject *BPY_exception_buffer(void)
* string_io = StringIO.StringIO()
*/
-#if PY_VERSION_HEX < 0x03000000
- if(! (string_io_mod= PyImport_ImportModule("StringIO")) ) {
-#else
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
-#endif
- return NULL;
+ goto error_cleanup;
} else if (! (string_io = PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
- Py_DECREF(string_io_mod);
- return NULL;
+ goto error_cleanup;
} else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
- Py_DECREF(string_io_mod);
- Py_DECREF(string_io);
- return NULL;
+ goto error_cleanup;
}
Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
@@ -403,6 +365,18 @@ PyObject *BPY_exception_buffer(void)
PyErr_Clear();
return string_io_buf;
+
+
+error_cleanup:
+ /* could not import the module so print the error and close */
+ Py_XDECREF(string_io_mod);
+ Py_XDECREF(string_io);
+
+ PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_Print(); /* print the error */
+ PyErr_Clear();
+
+ return NULL;
}
char *BPy_enum_as_string(EnumPropertyItem *item)
@@ -412,7 +386,8 @@ char *BPy_enum_as_string(EnumPropertyItem *item)
char *cstring;
for (e= item; item->identifier; item++) {
- BLI_dynstr_appendf(dynstr, (e==item)?"'%s'":", '%s'", item->identifier);
+ if(item->identifier[0])
+ BLI_dynstr_appendf(dynstr, (e==item)?"'%s'":", '%s'", item->identifier);
}
cstring = BLI_dynstr_get_cstring(dynstr);
diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h
index 6429af67eb0..83fa7a5b7c4 100644
--- a/source/blender/python/intern/bpy_util.h
+++ b/source/blender/python/intern/bpy_util.h
@@ -27,7 +27,10 @@
#ifndef BPY_UTIL_H
#define BPY_UTIL_H
-#include "bpy_compat.h"
+#if PY_VERSION_HEX < 0x03010000
+#error "Python versions below 3.1 are not supported anymore, you'll need to update your python."
+#endif
+
#include "RNA_types.h" /* for EnumPropertyItem only */
struct EnumPropertyItem;
@@ -59,6 +62,7 @@ typedef struct BPY_class_attr_check {
const char *name; /* name of the class attribute */
char type; /* 's' = string, 'f' = function, 'l' = list, (add as needed) */
int arg_count; /* only for function types, -1 for undefined, includes self arg */
+ int len; /* only for string types currently */
int flag; /* other options */
} BPY_class_attr_check;
@@ -71,7 +75,7 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
char *BPy_enum_as_string(struct EnumPropertyItem *item);
-#define BLANK_PYTHON_TYPE {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+#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);
@@ -81,4 +85,8 @@ int BPy_errors_to_report(struct ReportList *reports);
struct bContext *BPy_GetContext(void);
void BPy_SetContext(struct bContext *C);
+extern void bpy_context_set(struct bContext *C, PyGILState_STATE *gilstate);
+extern void bpy_context_clear(struct bContext *C, PyGILState_STATE *gilstate);
+
+
#endif
diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c
index 8d6b5ad9f19..94bdb6ba6ab 100644
--- a/source/blender/python/intern/stubs.c
+++ b/source/blender/python/intern/stubs.c
@@ -30,9 +30,7 @@
void BPY_post_start_python() {}
//void BPY_run_python_script() {}
//void BPY_start_python() {}
-void BPY_do_all_scripts() {}
void BPY_call_importloader() {}
-void BPY_do_pyscript() {}
void BPY_clear_script() {}
//void BPY_free_compiled_text() {}
void BPY_pyconstraint_eval() {}
diff --git a/source/blender/quicktime/CMakeLists.txt b/source/blender/quicktime/CMakeLists.txt
index 95969878cf1..ac503bb62cb 100644
--- a/source/blender/quicktime/CMakeLists.txt
+++ b/source/blender/quicktime/CMakeLists.txt
@@ -27,18 +27,18 @@
SET(SRC apple/quicktime_import.c apple/quicktime_export.c)
SET(INC
- .
- ../quicktime
- ../makesdna
- ../../../intern/guardedalloc
- ../blenlib
- ../blenkernel
- ../avi
- ../imbuf
- ../imbuf/intern
- ../blenloader
- ../render/extern/include
- ../include
+ .
+ ../quicktime
+ ../makesdna
+ ../../../intern/guardedalloc
+ ../blenlib
+ ../blenkernel
+ ../avi
+ ../imbuf
+ ../imbuf/intern
+ ../blenloader
+ ../render/extern/include
+ ../include
)
SET(INC ${INC} ${QUICKTIME_INC})
diff --git a/source/blender/quicktime/SConscript b/source/blender/quicktime/SConscript
index 5f3995a410a..10e88a8f461 100644
--- a/source/blender/quicktime/SConscript
+++ b/source/blender/quicktime/SConscript
@@ -19,7 +19,7 @@ incs = ['.',
incs.append(env['BF_QUICKTIME_INC'])
-types = ['core']
-priorities = [200]
+types = ['core','player']
+priorities = [200,235]
env.BlenderLib ('bf_quicktime', sources=source_files, includes=incs, defines=['WITH_QUICKTIME'], libtype=types, priority=priorities)
diff --git a/source/blender/readblenfile/CMakeLists.txt b/source/blender/readblenfile/CMakeLists.txt
index dc4a8f5636d..ded4a1e00cf 100644
--- a/source/blender/readblenfile/CMakeLists.txt
+++ b/source/blender/readblenfile/CMakeLists.txt
@@ -27,7 +27,7 @@
FILE(GLOB SRC intern/*.c)
SET(INC
- . ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging
+ . ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging
)
BLENDERLIB(bf_readblenfile "${SRC}" "${INC}")
diff --git a/source/blender/readblenfile/SConscript b/source/blender/readblenfile/SConscript
index 59771aa0829..57ee1866263 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, 220] )
+env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['core','player'], priority = [0,195] )
diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index 40a991ad702..5672b9f4cb2 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -43,6 +43,7 @@
#ifdef WIN32
#include <io.h> // read, open
+#include "BLI_winstuff.h"
#else // ! WIN32
#include <unistd.h> // read
#endif
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 8ba7dc123e7..3284f7ea79a 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -27,22 +27,24 @@
FILE(GLOB SRC intern/source/*.c)
SET(INC
- intern/include ../../../intern/guardedalloc ../blenlib ../makesdna
- extern/include ../blenkernel ../radiosity/extern/include ../imbuf
- ../quicktime ../include ../../kernel/gen_messaging ../blenloader
+ intern/include ../../../intern/guardedalloc ../blenlib ../makesdna
+ extern/include ../blenkernel ../imbuf
+ ../include ../../kernel/gen_messaging ../blenloader
+ ../../../intern/smoke/extern
+ ../makesrna
)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
#TODO
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 173f5db8482..db151775b96 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -4,9 +4,9 @@ Import ('env')
cflags=''
sources = env.Glob('intern/source/*.c')
-incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna'
+incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna'
incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf'
-incs += ' ../include ../blenloader'
+incs += ' ../include ../blenloader ../../../intern/smoke/extern'
defs = []
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 04f7d264229..bf02af6ac36 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -33,12 +33,18 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
+#include "RNA_types.h"
-struct Scene;
-struct RenderData;
+struct bNodeTree;
+struct Image;
struct NodeBlurData;
struct Object;
-struct bNodeTree;
+struct ReportList;
+struct RenderData;
+struct RenderEngine;
+struct RenderEngineType;
+struct RenderResult;
+struct Scene;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is what is exposed of render to outside world */
@@ -64,6 +70,7 @@ typedef struct RenderPass {
char name[16]; /* amount defined in openexr_multi.h */
char chan_id[8]; /* amount defined in openexr_multi.h */
float *rect;
+ int rectx, recty;
} RenderPass;
/* a renderlayer is a full image, but with all passes and samples */
@@ -83,6 +90,7 @@ typedef struct RenderLayer {
float *rectf; /* 4 float, standard rgba buffer (read not above!) */
float *acolrect; /* 4 float, optional transparent buffer, needs storage for display updates */
float *scolrect; /* 4 float, optional strand buffer, needs storage for display updates */
+ int rectx, recty;
ListBase passes;
@@ -128,7 +136,7 @@ typedef struct RenderStats {
int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
- char *infostr, scenename[32];
+ char *infostr, *statstr, scenename[32];
} RenderStats;
@@ -231,5 +239,45 @@ void RE_DataBase_GetView(struct Render *re, float mat[][4]);
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
struct Scene *RE_GetScene(struct Render *re);
+/* External Engine */
+
+#define RE_INTERNAL 1
+#define RE_GAME 2
+
+extern ListBase R_engines;
+
+typedef struct RenderEngineType {
+ struct RenderEngineType *next, *prev;
+
+ /* type info */
+ char idname[32];
+ char name[32];
+ int flag;
+
+ void (*render)(struct RenderEngine *engine, struct Scene *scene);
+
+ /* RNA integration */
+ ExtensionRNA ext;
+} RenderEngineType;
+
+typedef struct RenderEngine {
+ RenderEngineType *type;
+ struct Render *re;
+ 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);
+
+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_engines_init(void);
+void RE_engines_exit(void);
+
#endif /* RE_PIPELINE_H */
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 0ad48fe97a9..435e3ddc07f 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -55,7 +55,6 @@ typedef struct ShadeResult
float refl[3];
float refr[3];
float nor[3];
- float rad[3];
float winspeed[4];
} ShadeResult;
@@ -113,7 +112,7 @@ typedef struct ShadeInput
/* internal face coordinates */
float u, v, dx_u, dx_v, dy_u, dy_v;
- float co[3], view[3];
+ float co[3], view[3], camera_co[3];
/* copy from material, keep synced so we can do memcopy */
/* current size: 23*4 */
@@ -132,7 +131,7 @@ typedef struct ShadeInput
float layerfac;
/* texture coordinates */
- float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4], rad[3];
+ float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4];
float refcol[4], displace[3];
float strandco, tang[3], nmaptang[3], stress, winspeed[4];
float duplilo[3], dupliuv[3];
@@ -161,6 +160,7 @@ typedef struct ShadeInput
int samplenr; /* sample counter, to detect if we should do shadow again */
int depth; /* 1 or larger on raytrace shading */
+ int volume_depth; /* number of intersections through volumes */
/* stored copy of original face normal (facenor)
* before flipping. Used in Front/back output on geometry node */
diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h
new file mode 100644
index 00000000000..93cdef3b14e
--- /dev/null
+++ b/source/blender/render/intern/include/pointdensity.h
@@ -0,0 +1,44 @@
+/*
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef POINTDENSITY_H
+#define POINTDENSITY_H
+
+/**
+ * Make point density kd-trees for all point density textures in the scene
+ */
+
+struct Render;
+struct TexResult;
+
+void make_pointdensities(struct Render *re);
+void free_pointdensities(struct Render *re);
+int pointdensitytex(struct Tex *tex, float *texvec, struct TexResult *texres);
+
+#endif /* POINTDENSITY_H */
+
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index ab3758781ce..e50e498228d 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -201,6 +201,9 @@ struct Render
ListBase customdata_names;
struct Object *excludeob;
+ ListBase render_volumes_inside;
+ ListBase volumes;
+ ListBase volume_precache_parts;
/* arena for allocating data for use during render, for
* example dynamic TFaces to go in the VlakRen structure.
@@ -292,7 +295,9 @@ typedef struct ObjectInstanceRen {
float dupliorco[3], dupliuv[2];
float (*duplitexmat)[4];
-
+
+ struct VolumePrecache *volume_precache;
+
float *vectors;
int totvector;
} ObjectInstanceRen;
@@ -402,6 +407,46 @@ typedef struct StrandRen {
float orco[3];
} StrandRen;
+/* ------------------------------------------------------------------------- */
+
+typedef struct VolumeOb
+{
+ struct VolumeOb *next, *prev;
+ struct Material *ma;
+ struct ObjectRen *obr;
+} VolumeOb;
+
+typedef struct MatInside {
+ struct MatInside *next, *prev;
+ struct Material *ma;
+ struct ObjectInstanceRen *obi;
+} MatInside;
+
+typedef struct VolPrecachePart
+{
+ struct VolPrecachePart *next, *prev;
+ struct RayTree *tree;
+ struct ShadeInput *shi;
+ struct ObjectInstanceRen *obi;
+ int num;
+ int minx, maxx;
+ int miny, maxy;
+ int minz, maxz;
+ int res[3];
+ float bbmin[3];
+ float voxel[3];
+ int working, done;
+} VolPrecachePart;
+
+typedef struct VolumePrecache
+{
+ int res[3];
+ float *data_r;
+ float *data_g;
+ float *data_b;
+} VolumePrecache;
+
+/* ------------------------------------------------------------------------- */
struct LampRen;
struct MTex;
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 54311d2515a..95bccd2be1e 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -33,6 +33,7 @@ struct VlakRen;
struct StrandSegment;
struct StrandPoint;
struct ObjectInstanceRen obi;
+struct Isect;
/* shadeinput.c */
@@ -52,6 +53,7 @@ typedef struct ShadeSample {
/* also the node shader callback */
void shade_material_loop(struct ShadeInput *shi, struct ShadeResult *shr);
+void shade_volume_loop(struct ShadeInput *shi, struct ShadeResult *shr);
void shade_input_set_triangle_i(struct ShadeInput *shi, struct ObjectInstanceRen *obi, struct VlakRen *vlr, short i1, short i2, short i3);
void shade_input_set_triangle(struct ShadeInput *shi, volatile int obi, volatile int facenr, int normal_flip);
@@ -66,6 +68,7 @@ void shade_input_set_strand(struct ShadeInput *shi, struct StrandRen *strand, st
void shade_input_set_strand_texco(struct ShadeInput *shi, struct StrandRen *strand, struct StrandVert *svert, struct StrandPoint *spoint);
void shade_input_do_shade(struct ShadeInput *shi, struct ShadeResult *shr);
+void shade_input_init_material(struct ShadeInput *shi);
void shade_input_initialize(struct ShadeInput *shi, struct RenderPart *pa, struct RenderLayer *rl, int sample);
void shade_sample_initialize(struct ShadeSample *ssamp, struct RenderPart *pa, struct RenderLayer *rl);
@@ -86,7 +89,11 @@ void shade_color(struct ShadeInput *shi, ShadeResult *shr);
void ambient_occlusion_to_diffuse(struct ShadeInput *shi, float *diff);
void ambient_occlusion(struct ShadeInput *shi);
+ListBase *get_lights(struct ShadeInput *shi);
float lamp_get_visibility(struct LampRen *lar, float *co, float *lv, float *dist);
void lamp_get_shadow(struct LampRen *lar, ShadeInput *shi, float inp, float *shadfac, int do_real);
float fresnel_fac(float *view, float *vn, float fresnel, float fac);
+
+/* rayshade.c */
+extern void shade_ray(struct Isect *is, struct ShadeInput *shi, struct ShadeResult *shr);
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index c254b768292..78d6a912af1 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -56,6 +56,7 @@ void do_halo_tex(struct HaloRen *har, float xn, float yn, float *colf);
void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, float *blend, int skyflag, short thread);
void do_material_tex(struct ShadeInput *shi);
void do_lamp_tex(LampRen *la, float *lavec, struct ShadeInput *shi, float *colf, int effect);
+void do_volume_tex(struct ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val);
void init_render_textures(Render *re);
void end_render_textures(void);
diff --git a/source/gameengine/Expressions/KX_Python_static.h b/source/blender/render/intern/include/volume_precache.h
index f4f31f9b058..9d87a219c82 100644
--- a/source/gameengine/Expressions/KX_Python_static.h
+++ b/source/blender/render/intern/include/volume_precache.h
@@ -1,5 +1,4 @@
/**
- * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -22,15 +21,13 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Matt Ebb.
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef KX_PYTHON_H
-#define KX_PYTHON_H
-
-#define USE_DL_EXPORT
-#include "Python.h"
-
-#endif // KX_PYTHON_H
+
+void volume_precache(Render *re);
+void free_volume_precache(Render *re);
+int point_inside_volume_objectinstance(ObjectInstanceRen *obi, float *co);
+#define VOL_MS_TIMESTEP 0.1f \ No newline at end of file
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
new file mode 100644
index 00000000000..026b4840ea3
--- /dev/null
+++ b/source/blender/render/intern/include/volumetric.h
@@ -0,0 +1,47 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+float vol_get_stepsize(struct ShadeInput *shi, int context);
+float vol_get_density(struct ShadeInput *shi, float *co);
+void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co, float stepsize, float density);
+
+void shade_volume_outside(ShadeInput *shi, ShadeResult *shr);
+void shade_volume_inside(ShadeInput *shi, ShadeResult *shr);
+void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct Isect *last_is);
+
+#define STEPSIZE_VIEW 0
+#define STEPSIZE_SHADE 1
+
+#define VOL_IS_BACKFACE 1
+#define VOL_IS_SAMEMATERIAL 2
+
+#define VOL_BOUNDS_DEPTH 0
+#define VOL_BOUNDS_SS 1
+
+#define VOL_SHADE_OUTSIDE 0
+#define VOL_SHADE_INSIDE 1
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
new file mode 100644
index 00000000000..b291bdc096d
--- /dev/null
+++ b/source/blender/render/intern/include/voxeldata.h
@@ -0,0 +1,45 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Raul Fernandez Hernandez (Farsthary), Matt Ebb.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef VOXELDATA_H
+#define VOXELDATA_H
+
+struct Render;
+struct TexResult;
+
+typedef struct VoxelDataHeader
+{
+ int resolX, resolY, resolZ;
+ int frames;
+} VoxelDataHeader;
+
+void make_voxeldata(struct Render *re);
+void free_voxeldata(struct Render *re);
+int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres);
+
+#endif /* VOXELDATA_H */
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
index 22680b26338..c313549f9b9 100644
--- a/source/blender/render/intern/source/Makefile
+++ b/source/blender/render/intern/source/Makefile
@@ -39,10 +39,10 @@ CFLAGS += $(LEVEL_1_C_WARNINGS)
# The external modules follow after. There should be a nicer way to say this.
CPPFLAGS += -I../include
CPPFLAGS += -I../../extern/include
-CPPFLAGS += -I../../../radiosity/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
@@ -50,6 +50,7 @@ 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
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index a00cd2211fc..48a7c003c9f 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -31,7 +31,7 @@
#include <string.h>
#include <limits.h>
-#include "MTC_matrixops.h"
+
#include "MEM_guardedalloc.h"
@@ -100,6 +100,8 @@
#include "envmap.h"
#include "occlusion.h"
+#include "pointdensity.h"
+#include "voxeldata.h"
#include "render_types.h"
#include "rendercore.h"
#include "renderdatabase.h"
@@ -108,6 +110,7 @@
#include "shading.h"
#include "strand.h"
#include "texture.h"
+#include "volume_precache.h"
#include "sss.h"
#include "strand.h"
#include "zbuf.h"
@@ -188,8 +191,8 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
if (re) re->flag |= R_HALO;
else stargrid *= 1.0; /* then it draws fewer */
- if(re) MTC_Mat4Invert(mat, re->viewmat);
- else MTC_Mat4One(mat);
+ if(re) Mat4Invert(mat, re->viewmat);
+ else Mat4One(mat);
/* BOUNDING BOX CALCULATION
* bbox goes from z = loc_near_var | loc_far_var,
@@ -237,7 +240,7 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
done++;
}
else {
- MTC_Mat4MulVecfl(re->viewmat, vec);
+ Mat4MulVecfl(re->viewmat, vec);
/* in vec are global coordinates
* calculate distance to camera
@@ -826,7 +829,7 @@ static void autosmooth(Render *re, ObjectRen *obr, float mat[][4], int degr)
/* rotate vertices and calculate normal of faces */
for(a=0; a<obr->totvert; a++) {
ver= RE_findOrAddVert(obr, a);
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
}
for(a=0; a<obr->totvlak; a++) {
vlr= RE_findOrAddVlak(obr, a);
@@ -895,7 +898,7 @@ static void flag_render_node_material(Render *re, bNodeTree *ntree)
if(GS(node->id->name)==ID_MA) {
Material *ma= (Material *)node->id;
- if(ma->mode & MA_ZTRA)
+ if((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
re->flag |= R_ZTRA;
ma->flag |= MA_IS_USED;
@@ -917,7 +920,8 @@ static Material *give_render_material(Render *re, Object *ob, int nr)
if(re->r.mode & R_SPEED) ma->texco |= NEED_UV;
- if(ma->mode & MA_ZTRA)
+ if(ma->material_type == MA_TYPE_VOLUME) ma->mode |= MA_TRANSP;
+ if((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
re->flag |= R_ZTRA;
/* for light groups */
@@ -1246,6 +1250,19 @@ 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)
+{
+ 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);
+ if(har) har->lay= obr->ob->lay;
+ }
+ else
+ static_particle_strand(re, obr, ma, sd, loc, loc1);
+}
static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, ParticleBillboardData *bb)
{
VlakRen *vlr;
@@ -1263,19 +1280,19 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
VECADD(vlr->v1->co, bb_center, xvec);
VECADD(vlr->v1->co, vlr->v1->co, yvec);
- MTC_Mat4MulVecfl(re->viewmat, vlr->v1->co);
+ Mat4MulVecfl(re->viewmat, vlr->v1->co);
VECSUB(vlr->v2->co, bb_center, xvec);
VECADD(vlr->v2->co, vlr->v2->co, yvec);
- MTC_Mat4MulVecfl(re->viewmat, vlr->v2->co);
+ Mat4MulVecfl(re->viewmat, vlr->v2->co);
VECSUB(vlr->v3->co, bb_center, xvec);
VECSUB(vlr->v3->co, vlr->v3->co, yvec);
- MTC_Mat4MulVecfl(re->viewmat, vlr->v3->co);
+ Mat4MulVecfl(re->viewmat, vlr->v3->co);
VECADD(vlr->v4->co, bb_center, xvec);
VECSUB(vlr->v4->co, vlr->v4->co, yvec);
- MTC_Mat4MulVecfl(re->viewmat, vlr->v4->co);
+ Mat4MulVecfl(re->viewmat, vlr->v4->co);
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
VECCOPY(vlr->v1->n,vlr->n);
@@ -1368,18 +1385,55 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
mtf->uv[3][1] = uvy;
}
}
-static void render_new_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed)
+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)
{
- HaloRen *har=0;
+ float loc[3], loc0[3], loc1[3], vel[3];
+
+ VECCOPY(loc, state->co);
- if(ma->mode&MA_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);
- if(har) har->lay= obr->ob->lay;
+ if(ren_as != PART_DRAW_BB)
+ Mat4MulVecfl(re->viewmat, loc);
+
+ switch(ren_as) {
+ case PART_DRAW_LINE:
+ sd->line = 1;
+ sd->time = 0.0f;
+ sd->size = hasize;
+
+ VECCOPY(vel, state->vel);
+ Mat4Mul3Vecfl(re->viewmat, vel);
+ Normalize(vel);
+
+ if(part->draw & PART_DRAW_VEL_LENGTH)
+ VecMulf(vel, VecLength(state->vel));
+
+ 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);
+
+ break;
+
+ case PART_DRAW_BB:
+
+ VECCOPY(bb->vec, loc);
+ VECCOPY(bb->vel, state->vel);
+
+ particle_billboard(re, obr, ma, bb);
+
+ break;
+
+ default:
+ {
+ HaloRen *har=0;
+
+ har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed);
+
+ if(har) har->lay= obr->ob->lay;
+
+ break;
+ }
}
- else
- static_particle_strand(re, obr, ma, sd, loc, loc1);
}
static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int num, ParticleStrandData *sd)
{
@@ -1420,7 +1474,7 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int
static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset)
{
Object *ob= obr->ob;
- Object *tob=0;
+// Object *tob=0;
Material *ma=0;
ParticleSystemModifierData *psmd;
ParticleSystem *tpsys=0;
@@ -1430,15 +1484,17 @@ 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};
ParticleStrandData sd;
StrandBuffer *strandbuf=0;
StrandVert *svert=0;
StrandBound *sbound= 0;
StrandRen *strand=0;
RNG *rng= 0;
- float loc[3],loc1[3],loc0[3],vel[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],time;
float strandlen=0.0f, curlen=0.0f;
- float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0);
+ float hasize, pa_size, r_tilt, r_length, cfra=bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0);
+ float pa_time, pa_birthtime, pa_dietime;
float random, simplify[2];
int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0;
int totchild=0;
@@ -1462,18 +1518,16 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
return 1;
/* 2. start initialising things */
- if(part->phystype==PART_PHYS_KEYED){
- if(psys->flag & PSYS_FIRST_KEYED)
- psys_count_keyed_targets(ob,psys);
- else
- return 1;
- }
/* last possibility to bail out! */
- psmd= psys_get_modifier(ob,psys);
+ sim.psmd = psmd = psys_get_modifier(ob,psys);
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
+ if(part->phystype==PART_PHYS_KEYED)
+ psys_count_keyed_targets(&sim);
+
+
if(G.rendering == 0) { /* preview render */
totchild = (int)((float)totchild * (float)part->disp / 100.0f);
}
@@ -1555,23 +1609,23 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
calc_ipo(part->ipo, cfra);
execute_ipo((ID *)part, part->ipo);
}
-#endif // XXX old animation system
if(part->flag & PART_GLOB_TIME)
- cfra = bsystem_time(re->scene, 0, (float)re->scene->r.cfra, 0.0);
-
-/* 2.4 setup reactors */
- if(part->type == PART_REACTOR){
- psys_get_reactor_target(ob, psys, &tob, &tpsys);
- if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
- psmd = psys_get_modifier(tob,tpsys);
- tpart = tpsys->part;
- }
- }
+#endif // XXX old animation system
+ cfra = bsystem_time(re->scene, 0, (float)re->scene->r.cfra, 0.0);
+
+///* 2.4 setup reactors */
+// if(part->type == PART_REACTOR){
+// psys_get_reactor_target(ob, psys, &tob, &tpsys);
+// if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
+// psmd = psys_get_modifier(tob,tpsys);
+// tpart = tpsys->part;
+// }
+// }
/* 2.5 setup matrices */
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
Mat3CpyMat4(nmat, ob->imat);
Mat3Transp(nmat);
@@ -1580,7 +1634,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
path_nbr=(int)pow(2.0,(double) part->ren_step);
if(path_nbr) {
- if((ma->material_type != MA_TYPE_HALO) && (ma->mode & MA_WIRE)==0) {
+ if(!ELEM(ma->material_type, MA_TYPE_HALO, MA_TYPE_WIRE)) {
sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
set_object_orco(re, psys, sd.orco);
}
@@ -1644,7 +1698,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
if(path_nbr == 0)
- psys->lattice = psys_get_lattice(re->scene, ob, psys);
+ psys->lattice = psys_get_lattice(&sim);
/* 3. start creating renderable things */
for(a=0,pa=pars; a<totpart+totchild; a++, pa++, seed++) {
@@ -1654,8 +1708,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(pa->flag & PARS_UNEXIST) continue;
pa_time=(cfra-pa->time)/pa->lifetime;
- if((part->flag&PART_ABS_TIME) == 0){
+ 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);
@@ -1666,8 +1722,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
calc_ipo(part->ipo, 100.0f*pa_time);
execute_ipo((ID *)part, part->ipo);
}
-#endif // XXX old animation system
}
+#endif // XXX old animation system
hasize = ma->hasize;
@@ -1690,7 +1746,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
pa_size = pa->size;
- r_tilt = 1.0f + pa->r_ave[0];
+ BLI_srandom(psys->seed+a);
+
+ r_tilt = 2.0f*(BLI_frand() - 0.5f);
+ r_length = BLI_frand();
if(path_nbr) {
cache = psys->pathcache[a];
@@ -1711,10 +1770,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
max_k = (int)cache->steps;
}
- pa_time = psys_get_child_time(psys, cpa, cfra);
+ pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime);
- if((part->flag & PART_ABS_TIME) == 0) {
#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);
@@ -1725,12 +1784,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
calc_ipo(part->ipo, 100.0f * pa_time);
execute_ipo((ID *)part, part->ipo);
}
-#endif // XXX old animation system
}
+#endif // XXX old animation system
pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time);
- r_tilt = 2.0f * cpa->rand[2];
+ r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
+ r_length = PSYS_FRAND(a + 22);
num = cpa->num;
@@ -1847,7 +1907,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
time= curlen/strandlen;
VECCOPY(loc,state.co);
- MTC_Mat4MulVecfl(re->viewmat,loc);
+ Mat4MulVecfl(re->viewmat,loc);
if(strandbuf) {
VECCOPY(svert->co, loc);
@@ -1864,14 +1924,14 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
VECSUB(loc0,loc1,loc);
VECADD(loc0,loc1,loc0);
- render_new_particle(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed);
}
sd.first = 0;
sd.time = time;
if(k)
- render_new_particle(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
VECCOPY(loc1,loc);
}
@@ -1880,61 +1940,55 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
else {
/* render normal particles */
- time=0.0f;
- state.time=cfra;
- if(psys_get_particle_state(re->scene,ob,psys,a,&state,0)==0)
- continue;
-
- if(psys->parent)
- Mat4MulVecfl(psys->parent->obmat, state.co);
-
- VECCOPY(loc,state.co);
- if(part->ren_as!=PART_DRAW_BB)
- MTC_Mat4MulVecfl(re->viewmat,loc);
-
- switch(part->ren_as) {
- case PART_DRAW_LINE:
- sd.line = 1;
- sd.time = 0.0f;
- sd.size = hasize;
+ if(part->trail_count > 1) {
+ float length = part->path_end * (1.0 - part->randlength * r_length);
+ int trail_count = part->trail_count * (1.0 - part->randlength * r_length);
+ float ct = (part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time;
+ float dt = length / (trail_count ? (float)trail_count : 1.0f);
+
+ for(i=0; i < trail_count; i++, ct -= dt) {
+ if(part->draw & PART_ABS_PATH_TIME) {
+ if(ct < pa_birthtime || ct > pa_dietime)
+ continue;
+ }
+ else if(ct < 0.0f || ct > 1.0f)
+ continue;
- VECCOPY(vel,state.vel);
- MTC_Mat4Mul3Vecfl(re->viewmat,vel);
- Normalize(vel);
+ state.time = (part->draw & PART_ABS_PATH_TIME) ? -ct : ct;
+ psys_get_particle_on_path(&sim,a,&state,1);
- if(part->draw & PART_DRAW_VEL_LENGTH)
- VecMulf(vel,VecLength(state.vel));
+ if(psys->parent)
+ Mat4MulVecfl(psys->parent->obmat, state.co);
- VECADDFAC(loc0,loc,vel,-part->draw_line[0]);
- VECADDFAC(loc1,loc,vel,part->draw_line[1]);
+ if(part->ren_as == PART_DRAW_BB) {
+ bb.random = random;
+ bb.size = pa_size;
+ bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
+ bb.time = ct;
+ bb.num = a;
+ }
- render_new_particle(re,obr,psmd->dm,ma,&sd,loc0,loc1,seed);
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
+ }
+ }
+ else {
+ time=0.0f;
+ state.time=cfra;
+ if(psys_get_particle_state(&sim,a,&state,0)==0)
+ continue;
- break;
+ if(psys->parent)
+ Mat4MulVecfl(psys->parent->obmat, state.co);
- case PART_DRAW_BB:
+ if(part->ren_as == PART_DRAW_BB) {
bb.random = random;
bb.size = pa_size;
bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
bb.time = pa_time;
bb.num = a;
- VECCOPY(bb.vec, loc);
- VECCOPY(bb.vel, state.vel);
-
- particle_billboard(re, obr, ma, &bb);
-
- break;
-
- default:
- {
- HaloRen *har=0;
-
- har = RE_inithalo_particle(re, obr, psmd->dm, ma, loc, NULL, sd.orco, sd.uvco, hasize, 0.0, seed);
-
- if(har) har->lay= obr->ob->lay;
-
- break;
}
+
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
}
}
@@ -1995,8 +2049,8 @@ static void make_render_halos(Render *re, ObjectRen *obr, Mesh *me, int totvert,
float vec[3], hasize, mat[4][4], imat[3][3];
int a, ok, seed= ma->seed1;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat3CpyMat4(imat, ob->imat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat3CpyMat4(imat, ob->imat);
re->flag |= R_HALO;
@@ -2007,7 +2061,7 @@ static void make_render_halos(Render *re, ObjectRen *obr, Mesh *me, int totvert,
hasize= ma->hasize;
VECCOPY(vec, mvert->co);
- MTC_Mat4MulVecfl(mat, vec);
+ Mat4MulVecfl(mat, vec);
if(ma->mode & MA_HALOPUNO) {
xn= mvert->no[0];
@@ -2140,7 +2194,7 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
}
if (texco & TEXCO_GLOB) {
VECCOPY(shi->gl, shi->co);
- MTC_Mat4MulVecfl(re->viewinv, shi->gl);
+ Mat4MulVecfl(re->viewinv, shi->gl);
}
if (texco & TEXCO_NORM) {
VECCOPY(shi->orn, shi->vn);
@@ -2198,6 +2252,7 @@ static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float
/* memset above means we dont need this */
/*shi.osatex= 0;*/ /* signal not to use dx[] and dy[] texture AA vectors */
+ shi.obr= obr;
shi.vlr= vlr; /* current render face */
shi.mat= vlr->mat; /* current input material */
shi.thread= 0;
@@ -2280,9 +2335,9 @@ static void init_render_mball(Render *re, ObjectRen *obr)
if (ob!=find_basis_mball(re->scene, ob))
return;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
- MTC_Mat3CpyMat4(imat, ob->imat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
+ Mat3CpyMat4(imat, ob->imat);
ma= give_render_material(re, ob, 1);
@@ -2303,7 +2358,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
/* render normals are inverted */
xn= -nors[0];
@@ -2387,7 +2442,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
if(orco) {
v1->orco= orco; orco+= 3; orcoret++;
}
- MTC_Mat4MulVecfl(mat, v1->co);
+ Mat4MulVecfl(mat, v1->co);
for (v = 1; v < sizev; v++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
@@ -2395,7 +2450,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
if(orco) {
ver->orco= orco; orco+= 3; orcoret++;
}
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
}
/* if V-cyclic, add extra vertices at end of the row */
if (dl->flag & DL_CYCL_U) {
@@ -2537,25 +2592,26 @@ static void init_render_surf(Render *re, ObjectRen *obr)
Curve *cu;
ListBase displist;
DispList *dl;
- Material *matar[32];
+ Material **matar;
float *orco=NULL, *orcobase=NULL, mat[4][4];
- int a, need_orco=0;
+ int a, totmat, need_orco=0;
cu= ob->data;
nu= cu->nurb.first;
if(nu==0) return;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
/* material array */
- memset(matar, 0, 4*32);
- matar[0]= give_render_material(re, ob, 0);
- for(a=0; a<ob->totcol; a++) {
+ totmat= ob->totcol+1;
+ matar= MEM_callocN(sizeof(Material*)*totmat, "init_render_surf matar");
+
+ for(a=0; a<totmat; a++) {
matar[a]= give_render_material(re, ob, a+1);
- if(matar[a] && matar[a]->texco & TEXCO_ORCO) {
+
+ if(matar[a] && matar[a]->texco & TEXCO_ORCO)
need_orco= 1;
- }
}
if(ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1;
@@ -2565,17 +2621,15 @@ static void init_render_surf(Render *re, ObjectRen *obr)
displist.first= displist.last= 0;
makeDispListSurf(re->scene, ob, &displist, 1, 0);
- dl= displist.first;
/* walk along displaylist and create rendervertices/-faces */
- while(dl) {
- /* watch out: u ^= y, v ^= x !! */
- if(dl->type==DL_SURF) {
+ for(dl=displist.first; dl; dl=dl->next) {
+ /* watch out: u ^= y, v ^= x !! */
+ if(dl->type==DL_SURF)
orco+= 3*dl_surf_to_renderdata(obr, dl, matar, orco, mat);
- }
-
- dl= dl->next;
}
+
freedisplist(&displist);
+ MEM_freeN(matar);
}
static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
@@ -2586,11 +2640,11 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
VlakRen *vlr;
DispList *dl;
ListBase olddl={NULL, NULL};
- Material *matar[32];
+ Material **matar;
float len, *data, *fp, *orco=NULL, *orcobase= NULL;
float n[3], mat[4][4];
int nr, startvert, startvlak, a, b;
- int frontside, need_orco=0;
+ int frontside, need_orco=0, totmat;
cu= ob->data;
if(ob->type==OB_FONT && cu->str==NULL) return;
@@ -2607,17 +2661,18 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
dl= cu->disp.first;
if(cu->disp.first==NULL) return;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
/* material array */
- memset(matar, 0, 4*32);
- matar[0]= give_render_material(re, ob, 0);
- for(a=0; a<ob->totcol; a++) {
+ totmat= ob->totcol+1;
+ matar= MEM_callocN(sizeof(Material*)*totmat, "init_render_surf matar");
+
+ for(a=0; a<totmat; a++) {
matar[a]= give_render_material(re, ob, a+1);
- if(matar[a]->texco & TEXCO_ORCO) {
+
+ if(matar[a] && matar[a]->texco & TEXCO_ORCO)
need_orco= 1;
- }
}
if(need_orco) orcobase=orco= get_object_orco(re, ob);
@@ -2649,7 +2704,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
ver->flag = 0;
}
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
if (orco) {
ver->orco = orco;
@@ -2701,7 +2756,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, fp);
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
fp+= 3;
if (orco) {
@@ -2795,6 +2850,8 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
freedisplist(&cu->disp);
SWAP(ListBase, olddl, cu->disp);
}
+
+ MEM_freeN(matar);
}
/* ------------------------------------------------------------------------- */
@@ -2928,6 +2985,53 @@ static void use_mesh_edge_lookup(ObjectRen *obr, DerivedMesh *dm, MEdge *medge,
}
}
+static void free_camera_inside_volumes(Render *re)
+{
+ BLI_freelistN(&re->render_volumes_inside);
+}
+
+static void init_camera_inside_volumes(Render *re)
+{
+ ObjectInstanceRen *obi;
+ VolumeOb *vo;
+ float co[3] = {0.f, 0.f, 0.f};
+
+ for(vo= re->volumes.first; vo; vo= vo->next) {
+ for(obi= re->instancetable.first; obi; obi= obi->next) {
+ if (obi->obr == vo->obr) {
+ if (point_inside_volume_objectinstance(obi, co)) {
+ MatInside *mi;
+
+ mi = MEM_mallocN(sizeof(MatInside), "camera inside material");
+ mi->ma = vo->ma;
+ mi->obi = obi;
+
+ BLI_addtail(&(re->render_volumes_inside), mi);
+ }
+ }
+ }
+ }
+
+ /* debug {
+ MatInside *m;
+ for (m=re->render_volumes_inside.first; m; m=m->next) {
+ printf("matinside: ma: %s \n", m->ma->id.name+2);
+ }
+ }*/
+}
+
+static void add_volume(Render *re, ObjectRen *obr, Material *ma)
+{
+ struct VolumeOb *vo;
+
+ vo = MEM_mallocN(sizeof(VolumeOb), "volume object");
+
+ vo->ma = ma;
+ vo->obr = obr;
+
+ BLI_addtail(&re->volumes, vo);
+}
+
static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
{
Object *ob= obr->ob;
@@ -2949,9 +3053,9 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
me= ob->data;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
- MTC_Mat3CpyMat4(imat, ob->imat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
+ Mat3CpyMat4(imat, ob->imat);
if(me->totvert==0)
return;
@@ -2977,11 +3081,6 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
}
need_nmap_tangent= 1;
}
-
- /* radio faces need autosmooth, to separate shared vertices in corners */
- if(re->r.mode & R_RADIO)
- if(ma->mode & MA_RADIO)
- do_autosmooth= 1;
}
}
@@ -3037,7 +3136,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, mvert->co);
if(do_autosmooth==0) /* autosmooth on original unrotated data to prevent differences between frames */
- MTC_Mat4MulVecfl(mat, ver->co);
+ Mat4MulVecfl(mat, ver->co);
if(orco) {
ver->orco= orco;
@@ -3076,7 +3175,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
}
/* if wire material, and we got edges, don't do the faces */
- if(ma->mode & MA_WIRE) {
+ if(ma->material_type == MA_TYPE_WIRE) {
end= dm->getNumEdges(dm);
if(end) ok= 0;
}
@@ -3161,7 +3260,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
end= dm->getNumEdges(dm);
mvert= dm->getVertArray(dm);
ma= give_render_material(re, ob, 1);
- if(end && (ma->mode & MA_WIRE)) {
+ if(end && (ma->material_type == MA_TYPE_WIRE)) {
MEdge *medge;
struct edgesort *edgetable;
int totedge= 0;
@@ -3258,13 +3357,13 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
shb->soft= lar->soft;
shb->shadhalostep= lar->shadhalostep;
- MTC_Mat4Ortho(mat);
- MTC_Mat4Invert(shb->winmat, mat); /* winmat is temp */
+ Mat4Ortho(mat);
+ Mat4Invert(shb->winmat, mat); /* winmat is temp */
/* matrix: combination of inverse view and lampmat */
/* calculate again: the ortho-render has no correct viewinv */
- MTC_Mat4Invert(viewinv, re->viewmat);
- MTC_Mat4MulMat4(shb->viewmat, viewinv, shb->winmat);
+ Mat4Invert(viewinv, re->viewmat);
+ Mat4MulMat4(shb->viewmat, viewinv, shb->winmat);
/* projection */
shb->d= lar->clipsta;
@@ -3342,11 +3441,11 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
BLI_addtail(&re->lampren, lar);
go->lampren= lar;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
- MTC_Mat3CpyMat4(lar->mat, mat);
- MTC_Mat3CpyMat4(lar->imat, ob->imat);
+ Mat3CpyMat4(lar->mat, mat);
+ Mat3CpyMat4(lar->imat, ob->imat);
lar->bufsize = la->bufsize;
lar->samp = la->samp;
@@ -3502,7 +3601,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->sh_invcampos[0]= -lar->co[0];
lar->sh_invcampos[1]= -lar->co[1];
lar->sh_invcampos[2]= -lar->co[2];
- MTC_Mat3MulVecfl(lar->imat, lar->sh_invcampos);
+ Mat3MulVecfl(lar->imat, lar->sh_invcampos);
/* z factor, for a normalized volume */
angle= saacos(lar->spotsi);
@@ -3751,7 +3850,7 @@ static void set_phong_threshold(ObjectRen *obr)
static void set_fullsample_flag(Render *re, ObjectRen *obr)
{
VlakRen *vlr;
- int a, trace;
+ int a, trace, mode;
if(re->osa==0)
return;
@@ -3760,12 +3859,14 @@ static void set_fullsample_flag(Render *re, ObjectRen *obr)
for(a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
+ mode= vlr->mat->mode;
- if(vlr->mat->mode & MA_FULL_OSA)
+ if(mode & MA_FULL_OSA)
vlr->flag |= R_FULL_OSA;
else if(trace) {
- if(vlr->mat->mode & MA_SHLESS);
- else if(vlr->mat->mode & (MA_RAYTRANSP|MA_RAYMIRROR))
+ 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))
@@ -3786,7 +3887,7 @@ static void split_quads(ObjectRen *obr, int dir)
vlr= RE_findOrAddVlak(obr, a);
/* test if rendering as a quad or triangle, skip wire */
- if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) {
+ if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) {
if(vlr->v4) {
@@ -3836,7 +3937,7 @@ static void check_non_flat_quads(ObjectRen *obr)
vlr= RE_findOrAddVlak(obr, a);
/* test if rendering as a quad or triangle, skip wire */
- if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) {
+ if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) {
/* check if quad is actually triangle */
v1= vlr->v1;
@@ -4124,7 +4225,7 @@ static void set_dupli_tex_mat(Render *re, ObjectInstanceRen *obi, DupliObject *d
obi->duplitexmat= BLI_memarena_alloc(re->memArena, sizeof(float)*4*4);
Mat4Invert(imat, dob->mat);
- MTC_Mat4MulSerie(obi->duplitexmat, re->viewmat, dob->omat, imat, re->viewinv, 0, 0, 0, 0);
+ Mat4MulSerie(obi->duplitexmat, re->viewmat, dob->omat, imat, re->viewinv, 0, 0, 0, 0);
}
}
@@ -4172,7 +4273,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
ObjectRen *obr;
ObjectInstanceRen *obi;
ParticleSystem *psys;
- int show_emitter, allow_render= 1, index, psysindex;
+ int show_emitter, allow_render= 1, index, psysindex, i;
index= (dob)? dob->index: 0;
@@ -4208,6 +4309,12 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
}
else
find_dupli_instances(re, obr);
+
+ for (i=1; i<=ob->totcol; i++) {
+ Material* ma = give_render_material(re, ob, i);
+ if (ma && ma->material_type == MA_TYPE_VOLUME)
+ add_volume(re, obr, ma);
+ }
}
/* and one render object per particle system */
@@ -4248,8 +4355,8 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject
else if(render_object_type(ob->type))
add_render_object(re, ob, par, dob, timeoffset, vectorlay);
else {
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
}
time= PIL_check_seconds_timer();
@@ -4290,6 +4397,8 @@ void RE_Database_Free(Render *re)
curvemapping_free(lar->curfalloff);
}
+ free_volume_precache(re);
+
BLI_freelistN(&re->lampren);
BLI_freelistN(&re->lights);
@@ -4316,6 +4425,11 @@ void RE_Database_Free(Render *re)
end_render_materials();
end_render_textures();
+ free_pointdensities(re);
+ free_voxeldata(re);
+
+ free_camera_inside_volumes(re);
+
if(re->wrld.aosphere) {
MEM_freeN(re->wrld.aosphere);
re->wrld.aosphere= NULL;
@@ -4492,8 +4606,8 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
for(SETLOOPER(re->scene, base)) {
ob= base->object;
/* imat objects has to be done here, since displace can have texture using Object map-input */
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
/* each object should only be rendered once */
ob->flag &= ~OB_DONE;
ob->transflag &= ~OB_RENDER_DUPLI;
@@ -4639,8 +4753,8 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
if(redoimat) {
for(SETLOOPER(re->scene, base)) {
ob= base->object;
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ Mat4Invert(ob->imat, mat);
}
}
@@ -4654,6 +4768,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
extern int slurph_opt; /* key.c */
Scene *sce;
float mat[4][4];
+ float amb[3];
unsigned int lay;
re->scene= scene;
@@ -4700,11 +4815,15 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* still bad... doing all */
init_render_textures(re);
- init_render_materials(re->r.mode, &re->wrld.ambr);
+ if (re->r.color_mgt_flag & R_COLOR_MANAGEMENT) color_manage_linearize(amb, &re->wrld.ambr);
+ else VECCOPY(amb, &re->wrld.ambr);
+ init_render_materials(re->r.mode, amb);
set_node_shader_lamp_loop(shade_material_loop);
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, 0, 0);
+
+ init_camera_inside_volumes(re);
if(!re->test_break(re->tbh)) {
int tothalo;
@@ -4753,6 +4872,13 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* ENVIRONMENT MAPS */
if(!re->test_break(re->tbh))
make_envmaps(re);
+
+ /* point density texture */
+ if(!re->test_break(re->tbh))
+ make_pointdensities(re);
+ /* voxel data texture */
+ if(!re->test_break(re->tbh))
+ make_voxeldata(re);
}
if(!re->test_break(re->tbh))
@@ -4769,6 +4895,11 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
if((re->r.mode & R_SSS) && !re->test_break(re->tbh))
if(re->r.renderer==R_INTERN)
make_sss_tree(re);
+
+ if(!re->test_break(re->tbh))
+ if(re->r.mode & R_RAYTRACE)
+ volume_precache(re);
+
}
if(re->test_break(re->tbh))
@@ -5049,7 +5180,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
return 0;
Mat4CpyMat4(mat, re->viewmat);
- MTC_Mat4Invert(imat, mat);
+ Mat4Invert(imat, mat);
/* set first vertex OK */
if(!fss->meshSurfNormals) return 0;
@@ -5311,6 +5442,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
{
float mat[4][4];
+ float amb[3];
unsigned int lay;
int onlyselected, nolamps;
@@ -5372,9 +5504,13 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
/* still bad... doing all */
init_render_textures(re);
- init_render_materials(re->r.mode, &re->wrld.ambr);
+
+ if (re->r.color_mgt_flag & R_COLOR_MANAGEMENT) color_manage_linearize(amb, &re->wrld.ambr);
+ else VECCOPY(amb, &re->wrld.ambr);
+ init_render_materials(re->r.mode, amb);
+
set_node_shader_lamp_loop(shade_material_loop);
-
+
/* MAKE RENDER DATA */
nolamps= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW);
onlyselected= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index a57e38f47c8..b5774d11799 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -51,7 +51,7 @@
#include "BKE_texture.h"
#include "BKE_utildefines.h"
-#include "MTC_matrixops.h"
+
/* this module */
#include "render_types.h"
@@ -211,9 +211,9 @@ static void envmap_transmatrix(float mat[][4], int part)
eul[2]= -M_PI/2.0;
}
- MTC_Mat4CpyMat4(tmat, mat);
+ Mat4CpyMat4(tmat, mat);
EulToMat4(eul, rotmat);
- MTC_Mat4MulSerie(mat, tmat, rotmat,
+ Mat4MulSerie(mat, tmat, rotmat,
0, 0, 0,
0, 0, 0);
}
@@ -231,12 +231,12 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
int a;
if(mode==0) {
- MTC_Mat4Invert(tmat, mat);
- MTC_Mat3CpyMat4(imat, tmat);
+ Mat4Invert(tmat, mat);
+ Mat3CpyMat4(imat, tmat);
}
else {
- MTC_Mat4CpyMat4(tmat, mat);
- MTC_Mat3CpyMat4(imat, mat);
+ Mat4CpyMat4(tmat, mat);
+ Mat3CpyMat4(imat, mat);
}
for(obi=re->instancetable.first; obi; obi=obi->next) {
@@ -267,7 +267,7 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
if((a & 255)==0) har= obr->bloha[a>>8];
else har++;
- MTC_Mat4MulVecfl(tmat, har->co);
+ Mat4MulVecfl(tmat, har->co);
}
}
@@ -280,22 +280,22 @@ static void env_rotate_scene(Render *re, float mat[][4], int mode)
Mat3CpyMat3(cmat, lar->imat);
Mat3MulMat3(lar->imat, cmat, imat);
- MTC_Mat3MulVecfl(imat, lar->vec);
- MTC_Mat4MulVecfl(tmat, lar->co);
+ Mat3MulVecfl(imat, lar->vec);
+ Mat4MulVecfl(tmat, lar->co);
lar->sh_invcampos[0]= -lar->co[0];
lar->sh_invcampos[1]= -lar->co[1];
lar->sh_invcampos[2]= -lar->co[2];
- MTC_Mat3MulVecfl(lar->imat, lar->sh_invcampos);
+ Mat3MulVecfl(lar->imat, lar->sh_invcampos);
lar->sh_invcampos[2]*= lar->sh_zfac;
if(lar->shb) {
if(mode==1) {
- MTC_Mat4Invert(pmat, mat);
- MTC_Mat4MulMat4(smat, pmat, lar->shb->viewmat);
- MTC_Mat4MulMat4(lar->shb->persmat, smat, lar->shb->winmat);
+ Mat4Invert(pmat, mat);
+ Mat4MulMat4(smat, pmat, lar->shb->viewmat);
+ Mat4MulMat4(lar->shb->persmat, smat, lar->shb->winmat);
}
- else MTC_Mat4MulMat4(lar->shb->persmat, lar->shb->viewmat, lar->shb->winmat);
+ else Mat4MulMat4(lar->shb->persmat, lar->shb->viewmat, lar->shb->winmat);
}
}
@@ -373,8 +373,8 @@ static void env_set_imats(Render *re)
base= re->scene->base.first;
while(base) {
- MTC_Mat4MulMat4(mat, base->object->obmat, re->viewmat);
- MTC_Mat4Invert(base->object->imat, mat);
+ Mat4MulMat4(mat, base->object->obmat, re->viewmat);
+ Mat4Invert(base->object->imat, mat);
base= base->next;
}
@@ -393,18 +393,18 @@ static void render_envmap(Render *re, EnvMap *env)
short part;
/* need a recalc: ortho-render has no correct viewinv */
- MTC_Mat4Invert(oldviewinv, re->viewmat);
+ Mat4Invert(oldviewinv, re->viewmat);
envre= envmap_render_copy(re, env);
/* precalc orthmat for object */
- MTC_Mat4CpyMat4(orthmat, env->object->obmat);
- MTC_Mat4Ortho(orthmat);
+ Mat4CpyMat4(orthmat, env->object->obmat);
+ Mat4Ortho(orthmat);
/* need imat later for texture imat */
- MTC_Mat4MulMat4(mat, orthmat, re->viewmat);
- MTC_Mat4Invert(tmat, mat);
- MTC_Mat3CpyMat4(env->obimat, tmat);
+ Mat4MulMat4(mat, orthmat, re->viewmat);
+ Mat4Invert(tmat, mat);
+ Mat3CpyMat4(env->obimat, tmat);
for(part=0; part<6; part++) {
if(env->type==ENV_PLANE && part!=1)
@@ -412,17 +412,17 @@ static void render_envmap(Render *re, EnvMap *env)
re->display_clear(re->dch, envre->result);
- MTC_Mat4CpyMat4(tmat, orthmat);
+ Mat4CpyMat4(tmat, orthmat);
envmap_transmatrix(tmat, part);
- MTC_Mat4Invert(mat, tmat);
+ Mat4Invert(mat, tmat);
/* mat now is the camera 'viewmat' */
- MTC_Mat4CpyMat4(envre->viewmat, mat);
- MTC_Mat4CpyMat4(envre->viewinv, tmat);
+ Mat4CpyMat4(envre->viewmat, mat);
+ Mat4CpyMat4(envre->viewinv, tmat);
/* we have to correct for the already rotated vertexcoords */
- MTC_Mat4MulMat4(tmat, oldviewinv, envre->viewmat);
- MTC_Mat4Invert(env->imat, tmat);
+ Mat4MulMat4(tmat, oldviewinv, envre->viewmat);
+ Mat4Invert(env->imat, tmat);
env_rotate_scene(envre, tmat, 1);
init_render_world(envre);
@@ -503,13 +503,13 @@ void make_envmaps(Render *re)
float orthmat[4][4], mat[4][4], tmat[4][4];
/* precalc orthmat for object */
- MTC_Mat4CpyMat4(orthmat, env->object->obmat);
- MTC_Mat4Ortho(orthmat);
+ Mat4CpyMat4(orthmat, env->object->obmat);
+ Mat4Ortho(orthmat);
/* need imat later for texture imat */
- MTC_Mat4MulMat4(mat, orthmat, re->viewmat);
- MTC_Mat4Invert(tmat, mat);
- MTC_Mat3CpyMat4(env->obimat, tmat);
+ Mat4MulMat4(mat, orthmat, re->viewmat);
+ Mat4Invert(tmat, mat);
+ Mat3CpyMat4(env->obimat, tmat);
}
else {
@@ -678,20 +678,20 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
/* rotate to envmap space, if object is set */
VECCOPY(vec, texvec);
- if(env->object) MTC_Mat3MulVecfl(env->obimat, vec);
- else MTC_Mat4Mul3Vecfl(R.viewinv, vec);
+ if(env->object) Mat3MulVecfl(env->obimat, vec);
+ else Mat4Mul3Vecfl(R.viewinv, vec);
face= envcube_isect(env, vec, sco);
ibuf= env->cube[face];
if(osatex) {
if(env->object) {
- MTC_Mat3MulVecfl(env->obimat, dxt);
- MTC_Mat3MulVecfl(env->obimat, dyt);
+ Mat3MulVecfl(env->obimat, dxt);
+ Mat3MulVecfl(env->obimat, dyt);
}
else {
- MTC_Mat4Mul3Vecfl(R.viewinv, dxt);
- MTC_Mat4Mul3Vecfl(R.viewinv, dyt);
+ Mat4Mul3Vecfl(R.viewinv, dxt);
+ Mat4Mul3Vecfl(R.viewinv, dyt);
}
set_dxtdyt(dxts, dyts, dxt, dyt, face);
imagewraposa(tex, NULL, ibuf, sco, dxts, dyts, texres);
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index b9a2acb8b1c..01131f09b96 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -48,6 +48,7 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
@@ -416,6 +417,107 @@ static float clipy_rctf(rctf *rf, float y1, float y2)
}
+// used in SAT_get_color_bilerp() below
+static void SAT_getcol(float* col, ImBuf* ibuf, int x, int y)
+{
+ if ((x == (ibuf->x - 1)) && (y == (ibuf->y - 1))) { // avg val pos
+ col[0] = col[1] = col[2] = col[3] = 0.f;
+ return;
+ }
+ ibuf_get_color(col, ibuf, x, y);
+}
+
+// used in boxsampleclip_SAT() below
+static void SAT_get_color_bilerp(float *col, ImBuf *ibuf, float u, float v)
+{
+ float c00[4], c01[4], c10[4], c11[4];
+ const float ufl = floorf(u -= 0.5f), vfl = floorf(v -= 0.5f);
+ const float uf = u - ufl, vf = v - vfl;
+ const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf;
+ int x1 = (int)ufl, y1 = (int)vfl, x2 = x1 + 1, y2 = y1 + 1;
+ x1 = (x1 < 0) ? 0 : (x1 >= ibuf->x ? ibuf->x - 1 : x1);
+ x2 = (x2 < 0) ? 0 : (x2 >= ibuf->x ? ibuf->x - 1 : x2);
+ y1 = (y1 < 0) ? 0 : (y1 >= ibuf->y ? ibuf->y - 1 : y1);
+ y2 = (y2 < 0) ? 0 : (y2 >= ibuf->y ? ibuf->y - 1 : y2);
+ SAT_getcol(c00, ibuf, x1, y1);
+ SAT_getcol(c10, ibuf, x2, y1);
+ SAT_getcol(c01, ibuf, x1, y2);
+ SAT_getcol(c11, ibuf, x2, y2);
+ col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0];
+ col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1];
+ col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2];
+ col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3];
+}
+
+static void boxsampleclip_SAT(ImBuf *ibuf, rctf *rf, TexResult *texres, int intpol)
+{
+ float div, col[4];
+ if (intpol) {
+ div = 1.f/((rf->xmax - rf->xmin + 1.f)*(rf->ymax - rf->ymin + 1.f));
+ SAT_get_color_bilerp(&texres->tr, ibuf, rf->xmax, rf->ymax);
+ if (rf->ymin >= 1.f) {
+ SAT_get_color_bilerp(col, ibuf, rf->xmax, rf->ymin - 1.f);
+ texres->tr -= col[0];
+ texres->tg -= col[1];
+ texres->tb -= col[2];
+ texres->ta -= col[3];
+ }
+ if (rf->xmin >= 1.f) {
+ SAT_get_color_bilerp(col, ibuf, rf->xmin - 1.f, rf->ymax);
+ texres->tr -= col[0];
+ texres->tg -= col[1];
+ texres->tb -= col[2];
+ texres->ta -= col[3];
+ }
+ if (rf->xmin >= 1.f && rf->ymin >= 1.f) {
+ SAT_get_color_bilerp(col, ibuf, rf->xmin - 1.f, rf->ymin - 1.f);
+ texres->tr += col[0];
+ texres->tg += col[1];
+ texres->tb += col[2];
+ texres->ta += col[3];
+ }
+ }
+ else {
+ int startx = (int)floorf(rf->xmin);
+ int endx = (int)floorf(rf->xmax);
+ int starty = (int)floorf(rf->ymin);
+ int endy = (int)floorf(rf->ymax);
+ if (startx < 0) startx = 0;
+ if (starty < 0) starty = 0;
+ if (endx >= ibuf->x) endx = ibuf->x - 1;
+ if (endy >= ibuf->y) endy = ibuf->y - 1;
+ div = 1.f/((endx - startx + 1)*(endy - starty + 1));
+ SAT_getcol(&texres->tr, ibuf, endx, endy);
+ if (starty >= 1) {
+ SAT_getcol(col, ibuf, endx, starty - 1);
+ texres->tr -= col[0];
+ texres->tg -= col[1];
+ texres->tb -= col[2];
+ texres->ta -= col[3];
+ }
+ if (startx >= 1) {
+ SAT_getcol(col, ibuf, startx - 1, endy);
+ texres->tr -= col[0];
+ texres->tg -= col[1];
+ texres->tb -= col[2];
+ texres->ta -= col[3];
+ }
+ if (startx >=1 && starty >= 1) {
+ SAT_getcol(col, ibuf, startx - 1, starty - 1);
+ texres->tr += col[0];
+ texres->tg += col[1];
+ texres->tb += col[2];
+ texres->ta += col[3];
+ }
+ }
+ // avg
+ ibuf_get_color(col, ibuf, ibuf->x - 1, ibuf->y - 1);
+ texres->tr = texres->tr*div + col[0];
+ texres->tg = texres->tg*div + col[1];
+ texres->tb = texres->tb*div + col[2];
+ texres->ta = texres->ta*div + col[3];
+}
+
static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
{
/* sample box, is clipped already, and minx etc. have been set at ibuf size.
@@ -485,6 +587,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
}
}
}
+
if(div!=0.0) {
div= 1.0f/div;
texres->tb*= div;
@@ -498,13 +601,13 @@ 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)
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend, int SAT, int intpol)
{
/* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
- * Enlarge with antialiased edges of pixels.
- * If variable 'imaprepeat' has been set, the
- * clipped-away parts are sampled as well.
- */
+ * Enlarge with antialiased edges of pixels.
+ * If variable 'imaprepeat' has been set, the
+ * clipped-away parts are sampled as well.
+ */
/* note: actually minx etc isnt in the proper range... this due to filter size and offset vectors for bump */
TexResult texr;
rctf *rf, stack[8];
@@ -552,7 +655,10 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
if(count>1) {
tot= texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
while(count--) {
- boxsampleclip(ibuf, rf, &texr);
+ if (SAT)
+ boxsampleclip_SAT(ibuf, rf, &texr, intpol);
+ else
+ boxsampleclip(ibuf, rf, &texr);
opp= square_rctf(rf);
tot+= opp;
@@ -571,7 +677,10 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
}
}
else {
- boxsampleclip(ibuf, rf, texres);
+ if (SAT)
+ boxsampleclip_SAT(ibuf, rf, texres, intpol);
+ else
+ boxsampleclip(ibuf, rf, texres);
}
if(texres->talpha==0) texres->ta= 1.0;
@@ -598,7 +707,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);
+ boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0, 0);
result[0]= texres.tr;
result[1]= texres.tg;
result[2]= texres.tb;
@@ -617,7 +726,7 @@ void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *res
}
memset(&texres, 0, sizeof(texres));
- boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1);
+ boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0, 0);
result[0]= texres.tr;
result[1]= texres.tg;
result[2]= texres.tb;
@@ -625,13 +734,777 @@ void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *res
}
+//-----------------------------------------------------------------------------------------------------------------
+// from here, some functions only used for the new filtering
+
+// this only used here to make it easier to pass extend flags as single int
+enum {TXC_XMIR=1, TXC_YMIR, TXC_REPT, TXC_EXTD};
+
+// similar to ibuf_get_color() but clips/wraps coords according to repeat/extend flags
+// returns true if out of range in clipmode
+static int ibuf_get_color_clip(float *col, ImBuf *ibuf, int x, int y, int extflag)
+{
+ int clip = 0;
+ switch (extflag) {
+ case TXC_XMIR: // y rep
+ x %= 2*ibuf->x;
+ x += x < 0 ? 2*ibuf->x : 0;
+ x = x >= ibuf->x ? 2*ibuf->x - x - 1 : x;
+ y %= ibuf->y;
+ y += y < 0 ? ibuf->y : 0;
+ break;
+ case TXC_YMIR: // x rep
+ x %= ibuf->x;
+ x += x < 0 ? ibuf->x : 0;
+ y %= 2*ibuf->y;
+ y += y < 0 ? 2*ibuf->y : 0;
+ y = y >= ibuf->y ? 2*ibuf->y - y - 1 : y;
+ break;
+ case TXC_EXTD:
+ x = (x < 0) ? 0 : ((x >= ibuf->x) ? (ibuf->x - 1) : x);
+ y = (y < 0) ? 0 : ((y >= ibuf->y) ? (ibuf->y - 1) : y);
+ break;
+ case TXC_REPT:
+ x %= ibuf->x;
+ x += (x < 0) ? ibuf->x : 0;
+ y %= ibuf->y;
+ y += (y < 0) ? ibuf->y : 0;
+ break;
+ default: { // as extend, if clipped, set alpha to 0.0
+ if (x < 0) { x = 0; } // TXF alpha: clip = 1; }
+ if (x >= ibuf->x) { x = ibuf->x - 1; } // TXF alpha: clip = 1; }
+ if (y < 0) { y = 0; } // TXF alpha: clip = 1; }
+ if (y >= ibuf->y) { y = ibuf->y - 1; } // TXF alpha: clip = 1; }
+ }
+ }
+
+ if (ibuf->rect_float) {
+ const float* fp = ibuf->rect_float + (x + y*ibuf->x)*ibuf->channels;
+ if (ibuf->channels == 1)
+ col[0] = col[1] = col[2] = col[3] = *fp;
+ else {
+ col[0] = fp[0];
+ col[1] = fp[1];
+ col[2] = fp[2];
+ col[3] = clip ? 0.f : (ibuf->channels == 4 ? fp[3] : 1.f);
+ }
+ }
+ else {
+ char* rect = (char*)(ibuf->rect + x + y*ibuf->x);
+ col[0] = rect[0]*(1.f/255.f);
+ col[1] = rect[1]*(1.f/255.f);
+ col[2] = rect[2]*(1.f/255.f);
+ col[3] = clip ? 0.f : rect[3]*(1.f/255.f);
+ }
+ return clip;
+}
+
+// as above + bilerp
+static int ibuf_get_color_clip_bilerp(float *col, ImBuf *ibuf, float u, float v, int intpol, int extflag)
+{
+ if (intpol) {
+ float c00[4], c01[4], c10[4], c11[4];
+ const float ufl = floorf(u -= 0.5f), vfl = floorf(v -= 0.5f);
+ const float uf = u - ufl, vf = v - vfl;
+ const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf;
+ const int x1 = (int)ufl, y1 = (int)vfl, x2 = x1 + 1, y2 = y1 + 1;
+ int clip = ibuf_get_color_clip(c00, ibuf, x1, y1, extflag);
+ clip |= ibuf_get_color_clip(c10, ibuf, x2, y1, extflag);
+ clip |= ibuf_get_color_clip(c01, ibuf, x1, y2, extflag);
+ clip |= ibuf_get_color_clip(c11, ibuf, x2, y2, extflag);
+ col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0];
+ col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1];
+ col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2];
+ col[3] = clip ? 0.f : w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3];
+ return clip;
+ }
+ return ibuf_get_color_clip(col, ibuf, (int)u, (int)v, extflag);
+}
+
+// anisotropic filters, data struct used instead of long line of (possibly unused) func args
+typedef struct afdata_t {
+ float *dxt, *dyt;
+ int intpol, extflag;
+ // feline only
+ float majrad, minrad, theta;
+ int iProbes;
+ float dusc, dvsc;
+} afdata_t;
+
+static void area_sample(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD)
+{
+ int xs, ys, clip = 0;
+ float tc[4], xsd, ysd, cw = 0.f;
+ const float ux = ibuf->x*AFD->dxt[0], uy = ibuf->y*AFD->dxt[1];
+ const float vx = ibuf->x*AFD->dyt[0], vy = ibuf->y*AFD->dyt[1];
+ int xsam = (int)(0.5f*sqrtf(ux*ux + uy*uy) + 0.5f);
+ int ysam = (int)(0.5f*sqrtf(vx*vx + vy*vy) + 0.5f);
+ const int minsam = AFD->intpol ? 2 : 4;
+ xsam = xsam < minsam ? minsam : xsam;
+ ysam = ysam < minsam ? minsam : ysam;
+ xsd = 1.f / xsam;
+ ysd = 1.f / ysam;
+ texr->tr = texr->tg = texr->tb = texr->ta = 0.f;
+ for (ys=0; ys<ysam; ++ys) {
+ for (xs=0; xs<xsam; ++xs) {
+ const float su = (xs + ((ys & 1) + 0.5f)*0.5f)*xsd - 0.5f;
+ const float sv = (ys + ((xs & 1) + 0.5f)*0.5f)*ysd - 0.5f;
+ const float pu = fx + su*AFD->dxt[0] + sv*AFD->dyt[0];
+ const float pv = fy + su*AFD->dxt[1] + sv*AFD->dyt[1];
+ const int out = ibuf_get_color_clip_bilerp(tc, ibuf, pu*ibuf->x, pv*ibuf->y, AFD->intpol, AFD->extflag);
+ clip |= out;
+ cw += out ? 0.f : 1.f;
+ texr->tr += tc[0];
+ texr->tg += tc[1];
+ texr->tb += tc[2];
+ texr->ta += texr->talpha ? tc[3] : 0.f;
+ }
+ }
+ xsd *= ysd;
+ texr->tr *= xsd;
+ texr->tg *= xsd;
+ texr->tb *= xsd;
+ // clipping can be ignored if alpha used, texr->ta already includes filtered edge
+ texr->ta = texr->talpha ? texr->ta*xsd : (clip ? cw*xsd : 1.f);
+}
+
+// table of (exp(ar) - exp(a)) / (1 - exp(a)) for r in range [0, 1] and a = -2
+// used instead of actual gaussian, otherwise at high texture magnifications circular artifacts are visible
+#define EWA_MAXIDX 255
+static float EWA_WTS[EWA_MAXIDX + 1] =
+{ 1.f, 0.990965f, 0.982f, 0.973105f, 0.96428f, 0.955524f, 0.946836f, 0.938216f, 0.929664f,
+ 0.921178f, 0.912759f, 0.904405f, 0.896117f, 0.887893f, 0.879734f, 0.871638f, 0.863605f,
+ 0.855636f, 0.847728f, 0.839883f, 0.832098f, 0.824375f, 0.816712f, 0.809108f, 0.801564f,
+ 0.794079f, 0.786653f, 0.779284f, 0.771974f, 0.76472f, 0.757523f, 0.750382f, 0.743297f,
+ 0.736267f, 0.729292f, 0.722372f, 0.715505f, 0.708693f, 0.701933f, 0.695227f, 0.688572f,
+ 0.68197f, 0.67542f, 0.66892f, 0.662471f, 0.656073f, 0.649725f, 0.643426f, 0.637176f,
+ 0.630976f, 0.624824f, 0.618719f, 0.612663f, 0.606654f, 0.600691f, 0.594776f, 0.588906f,
+ 0.583083f, 0.577305f, 0.571572f, 0.565883f, 0.56024f, 0.55464f, 0.549084f, 0.543572f,
+ 0.538102f, 0.532676f, 0.527291f, 0.521949f, 0.516649f, 0.511389f, 0.506171f, 0.500994f,
+ 0.495857f, 0.490761f, 0.485704f, 0.480687f, 0.475709f, 0.470769f, 0.465869f, 0.461006f,
+ 0.456182f, 0.451395f, 0.446646f, 0.441934f, 0.437258f, 0.432619f, 0.428017f, 0.42345f,
+ 0.418919f, 0.414424f, 0.409963f, 0.405538f, 0.401147f, 0.39679f, 0.392467f, 0.388178f,
+ 0.383923f, 0.379701f, 0.375511f, 0.371355f, 0.367231f, 0.363139f, 0.359079f, 0.355051f,
+ 0.351055f, 0.347089f, 0.343155f, 0.339251f, 0.335378f, 0.331535f, 0.327722f, 0.323939f,
+ 0.320186f, 0.316461f, 0.312766f, 0.3091f, 0.305462f, 0.301853f, 0.298272f, 0.294719f,
+ 0.291194f, 0.287696f, 0.284226f, 0.280782f, 0.277366f, 0.273976f, 0.270613f, 0.267276f,
+ 0.263965f, 0.26068f, 0.257421f, 0.254187f, 0.250979f, 0.247795f, 0.244636f, 0.241502f,
+ 0.238393f, 0.235308f, 0.232246f, 0.229209f, 0.226196f, 0.223206f, 0.220239f, 0.217296f,
+ 0.214375f, 0.211478f, 0.208603f, 0.20575f, 0.20292f, 0.200112f, 0.197326f, 0.194562f,
+ 0.191819f, 0.189097f, 0.186397f, 0.183718f, 0.18106f, 0.178423f, 0.175806f, 0.17321f,
+ 0.170634f, 0.168078f, 0.165542f, 0.163026f, 0.16053f, 0.158053f, 0.155595f, 0.153157f,
+ 0.150738f, 0.148337f, 0.145955f, 0.143592f, 0.141248f, 0.138921f, 0.136613f, 0.134323f,
+ 0.132051f, 0.129797f, 0.12756f, 0.125341f, 0.123139f, 0.120954f, 0.118786f, 0.116635f,
+ 0.114501f, 0.112384f, 0.110283f, 0.108199f, 0.106131f, 0.104079f, 0.102043f, 0.100023f,
+ 0.0980186f, 0.09603f, 0.094057f, 0.0920994f, 0.0901571f, 0.08823f, 0.0863179f, 0.0844208f,
+ 0.0825384f, 0.0806708f, 0.0788178f, 0.0769792f, 0.0751551f, 0.0733451f, 0.0715493f, 0.0697676f,
+ 0.0679997f, 0.0662457f, 0.0645054f, 0.0627786f, 0.0610654f, 0.0593655f, 0.0576789f, 0.0560055f,
+ 0.0543452f, 0.0526979f, 0.0510634f, 0.0494416f, 0.0478326f, 0.0462361f, 0.0446521f, 0.0430805f,
+ 0.0415211f, 0.039974f, 0.0384389f, 0.0369158f, 0.0354046f, 0.0339052f, 0.0324175f, 0.0309415f,
+ 0.029477f, 0.0280239f, 0.0265822f, 0.0251517f, 0.0237324f, 0.0223242f, 0.020927f, 0.0195408f,
+ 0.0181653f, 0.0168006f, 0.0154466f, 0.0141031f, 0.0127701f, 0.0114476f, 0.0101354f, 0.00883339f,
+ 0.00754159f, 0.00625989f, 0.00498819f, 0.00372644f, 0.00247454f, 0.00123242f, 0.f
+};
+
+// test if a float value is 'nan'
+// there is a C99 function for this: isnan(), but blender seems to use C90 (according to gcc warns),
+// and may not be supported by other compilers either
+#ifndef ISNAN
+#define ISNAN(x) ((x) != (x))
+#endif
+//static int ISNAN(float x) { return (x != x); }
+
+static void radangle2imp(float a2, float b2, float th, float* A, float* B, float* C, float* F)
+{
+ float ct2 = cosf(th);
+ const float st2 = 1.f - ct2*ct2; // <- sin(th)^2
+ ct2 *= ct2;
+ *A = a2*st2 + b2*ct2;
+ *B = (b2 - a2)*sinf(2.f*th);
+ *C = a2*ct2 + b2*st2;
+ *F = a2*b2;
+}
+
+// all tests here are done to make sure possible overflows are hopefully minimized
+static void imp2radangle(float A, float B, float C, float F, float* a, float* b, float* th, float* ecc)
+{
+ if (F <= 1e-5f) { // use arbitrary major radius, zero minor, infinite eccentricity
+ *a = sqrtf(A > C ? A : C);
+ *b = 0.f;
+ *ecc = 1e10f;
+ *th = 0.5f*(atan2f(B, A - C) + (float)M_PI);
+ }
+ else {
+ const float AmC = A - C, ApC = A + C, F2 = F*2.f;
+ const float r = sqrtf(AmC*AmC + B*B);
+ float d = ApC - r;
+ *a = (d <= 0.f) ? sqrtf(A > C ? A : C) : sqrtf(F2 / d);
+ d = ApC + r;
+ if (d <= 0.f) {
+ *b = 0.f;
+ *ecc = 1e10f;
+ }
+ else {
+ *b = sqrtf(F2 / d);
+ *ecc = *a / *b;
+ }
+ // incr theta by 0.5*pi (angle of major axis)
+ *th = 0.5f*(atan2f(B, AmC) + (float)M_PI);
+ }
+}
+
+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...
+ 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;
+ float B = -2.f*(Ux*Vx + Uy*Vy);
+ float C = Ux*Ux + Uy*Uy;
+ float F = A*C - B*B*0.25f;
+ float a, b, th, ecc, a2, b2, ue, ve, U0, V0, DDQ, U, ac1, ac2, BU, d; // TXF alpha: cw = 0.f;
+ int u, v, u1, u2, v1, v2; // TXF alpha: clip = 0;
+
+ // The so-called 'high' quality ewa method simply adds a constant of 1 to both A & C,
+ // so the ellipse always covers at least some texels. But since the filter is now always larger,
+ // it also means that everywhere else it's also more blurry then ideally should be the case.
+ // So instead here the ellipse radii are modified instead whenever either is too low.
+ // Use a different radius based on interpolation switch, just enough to anti-alias when interpolation is off,
+ // and slightly larger to make result a bit smoother than bilinear interpolation when interpolation is on
+ // (minimum values: const float rmin = intpol ? 1.f : 0.5f;)
+ const float rmin = (AFD->intpol ? 1.5625f : 0.765625f)/ff2;
+ imp2radangle(A, B, C, F, &a, &b, &th, &ecc);
+ if ((b2 = b*b) < rmin) {
+ if ((a2 = a*a) < rmin) {
+ B = 0.f;
+ A = C = rmin;
+ F = A*C;
+ }
+ else {
+ b2 = rmin;
+ radangle2imp(a2, b2, th, &A, &B, &C, &F);
+ }
+ }
+
+ ue = ff*sqrtf(C);
+ ve = ff*sqrtf(A);
+ d = (float)(EWA_MAXIDX + 1) / (F*ff2);
+ A *= d;
+ B *= d;
+ C *= d;
+
+ U0 = fx*ibuf->x;
+ V0 = fy*ibuf->y;
+ u1 = (int)(floorf(U0 - ue));
+ u2 = (int)(ceilf(U0 + ue));
+ v1 = (int)(floorf(V0 - ve));
+ v2 = (int)(ceilf(V0 + ve));
+ U0 -= 0.5f;
+ V0 -= 0.5f;
+ DDQ = 2.f*A;
+ U = u1 - U0;
+ ac1 = A*(2.f*U + 1.f);
+ ac2 = A*U*U;
+ BU = B*U;
+
+ d = texr->tr = texr->tb = texr->tg = texr->ta = 0.f;
+ for (v=v1; v<=v2; ++v) {
+ const float V = v - V0;
+ float DQ = ac1 + B*V;
+ float Q = (C*V + BU)*V + ac2;
+ for (u=u1; u<=u2; ++u) {
+ if (Q < (float)(EWA_MAXIDX + 1)) {
+ float tc[4];
+ const float wt = EWA_WTS[(Q < 0.f) ? 0 : (unsigned int)Q];
+ /*const int out =*/ ibuf_get_color_clip(tc, ibuf, u, v, AFD->extflag);
+ // TXF alpha: clip |= out;
+ // TXF alpha: cw += out ? 0.f : wt;
+ texr->tr += tc[0]*wt;
+ texr->tg += tc[1]*wt;
+ texr->tb += tc[2]*wt;
+ texr->ta += texr->talpha ? tc[3]*wt : 0.f;
+ d += wt;
+ }
+ Q += DQ;
+ DQ += DDQ;
+ }
+ }
+
+ // d should hopefully never be zero anymore
+ d = 1.f/d;
+ texr->tr *= d;
+ texr->tg *= d;
+ texr->tb *= d;
+ // clipping can be ignored if alpha used, texr->ta already includes filtered edge
+ texr->ta = texr->talpha ? texr->ta*d : 1.f; // TXF alpha (clip ? cw*d : 1.f);
+}
+
+static void feline_eval(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD)
+{
+ const int maxn = AFD->iProbes - 1;
+ const float ll = ((AFD->majrad == AFD->minrad) ? 2.f*AFD->majrad : 2.f*(AFD->majrad - AFD->minrad)) / (maxn ? (float)maxn : 1.f);
+ float du = maxn ? cosf(AFD->theta)*ll : 0.f;
+ float dv = maxn ? sinf(AFD->theta)*ll : 0.f;
+ //const float D = -0.5f*(du*du + dv*dv) / (AFD->majrad*AFD->majrad);
+ const float D = (EWA_MAXIDX + 1)*0.25f*(du*du + dv*dv) / (AFD->majrad*AFD->majrad);
+ float d; // TXF alpha: cw = 0.f;
+ int n; // TXF alpha: clip = 0;
+ // have to use same scaling for du/dv here as for Ux/Vx/Uy/Vy (*after* D calc.)
+ du *= AFD->dusc;
+ dv *= AFD->dvsc;
+ d = texr->tr = texr->tb = texr->tg = texr->ta = 0.f;
+ for (n=-maxn; n<=maxn; n+=2) {
+ float tc[4];
+ const float hn = n*0.5f;
+ const float u = fx + hn*du, v = fy + hn*dv;
+ //const float wt = expf(n*n*D);
+ // can use ewa table here too
+ const float wt = EWA_WTS[(int)(n*n*D)];
+ /*const int out =*/ ibuf_get_color_clip_bilerp(tc, ibuf, ibuf->x*u, ibuf->y*v, AFD->intpol, AFD->extflag);
+ // TXF alpha: clip |= out;
+ // TXF alpha: cw += out ? 0.f : wt;
+ texr->tr += tc[0]*wt;
+ texr->tg += tc[1]*wt;
+ texr->tb += tc[2]*wt;
+ texr->ta += texr->talpha ? tc[3]*wt : 0.f;
+ d += wt;
+ }
+
+ d = 1.f/d;
+ texr->tr *= d;
+ texr->tg *= d;
+ texr->tb *= d;
+ // clipping can be ignored if alpha used, texr->ta already includes filtered edge
+ texr->ta = texr->talpha ? texr->ta*d : 1.f; // TXF alpha: (clip ? cw*d : 1.f);
+}
+#undef EWA_MAXIDX
+
+static void alpha_clip_aniso(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, int extflag, TexResult *texres)
+{
+ float alphaclip;
+ rctf rf;
+
+ // TXF apha: we're doing the same alphaclip here as boxsample, but i'm doubting
+ // if this is actually correct for the all the filtering algorithms ..
+
+ if(!(extflag == TXC_REPT || extflag == TXC_EXTD)) {
+ rf.xmin= minx*(ibuf->x);
+ rf.xmax= maxx*(ibuf->x);
+ rf.ymin= miny*(ibuf->y);
+ rf.ymax= maxy*(ibuf->y);
+
+ alphaclip = clipx_rctf(&rf, 0.0, (float)(ibuf->x));
+ alphaclip*= clipy_rctf(&rf, 0.0, (float)(ibuf->y));
+ alphaclip= MAX2(alphaclip, 0.0f);
+
+ if(alphaclip!=1.0) {
+ /* premul it all */
+ texres->tr*= alphaclip;
+ texres->tg*= alphaclip;
+ texres->tb*= alphaclip;
+ texres->ta*= alphaclip;
+ }
+ }
+}
+
+static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, float *dyt, TexResult *texres)
+{
+ TexResult texr;
+ float fx, fy, minx, maxx, miny, maxy;
+ float maxd, val1, val2, val3;
+ int curmap, retval, intpol, extflag = 0;
+ afdata_t AFD;
+
+ void (*filterfunc)(TexResult*, ImBuf*, float, float, afdata_t*);
+ switch (tex->texfilter) {
+ case TXF_EWA:
+ filterfunc = ewa_eval;
+ break;
+ case TXF_FELINE:
+ filterfunc = feline_eval;
+ break;
+ case TXF_AREA:
+ default:
+ filterfunc = area_sample;
+ }
+
+ texres->tin = texres->ta = texres->tr = texres->tg = texres->tb = 0.f;
+
+ // we need to set retval OK, otherwise texture code generates normals itself...
+ retval = texres->nor ? 3 : 1;
+
+ // quick tests
+ if (ibuf==NULL && ima==NULL) return retval;
+
+ if (ima) { // hack for icon render
+ if ((ima->ibufs.first == NULL) && (R.r.scemode & R_NO_IMAGE_LOAD)) return retval;
+ ibuf = BKE_image_get_ibuf(ima, &tex->iuser);
+ }
+
+ 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, 0);
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
+ }
+
+ if ((tex->imaflag & TEX_USEALPHA) && ((tex->imaflag & TEX_CALCALPHA) == 0)) texres->talpha = 1;
+ texr.talpha = texres->talpha;
+
+ if (tex->imaflag & TEX_IMAROT) {
+ fy = texvec[0];
+ fx = texvec[1];
+ }
+ else {
+ fx = texvec[0];
+ fy = texvec[1];
+ }
+
+ if (ibuf->flags & IB_fields) {
+ if (R.r.mode & R_FIELDS) { /* field render */
+ if (R.flag & R_SEC_FIELD) { /* correction for 2nd field */
+ /* fac1= 0.5/( (float)ibuf->y ); */
+ /* fy-= fac1; */
+ }
+ else /* first field */
+ fy += 0.5f/( (float)ibuf->y );
+ }
+ }
+
+ // pixel coordinates
+ minx = MIN3(dxt[0], dyt[0], dxt[0] + dyt[0]);
+ maxx = MAX3(dxt[0], dyt[0], dxt[0] + dyt[0]);
+ miny = MIN3(dxt[1], dyt[1], dxt[1] + dyt[1]);
+ maxy = MAX3(dxt[1], dyt[1], dxt[1] + dyt[1]);
+
+ // tex_sharper has been removed
+ minx = (maxx - minx)*0.5f;
+ miny = (maxy - miny)*0.5f;
+
+ if (tex->imaflag & TEX_FILTER_MIN) {
+ // make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy)
+ const float addval = (0.5f * tex->filtersize) / (float)MIN2(ibuf->x, ibuf->y);
+ if (addval > minx) minx = addval;
+ if (addval > miny) miny = addval;
+ }
+ else if (tex->filtersize != 1.f) {
+ minx *= tex->filtersize;
+ miny *= tex->filtersize;
+ dxt[0] *= tex->filtersize;
+ dxt[1] *= tex->filtersize;
+ dyt[0] *= tex->filtersize;
+ dyt[1] *= tex->filtersize;
+ }
+
+ if (tex->imaflag & TEX_IMAROT) {
+ float t;
+ SWAP(float, minx, miny);
+ // must rotate dxt/dyt 90 deg
+ // yet another blender problem is that swapping X/Y axes (or any tex proj switches) should do something similar,
+ // but it doesn't, it only swaps coords, so filter area will be incorrect in those cases.
+ t = dxt[0];
+ dxt[0] = dxt[1];
+ dxt[1] = -t;
+ t = dyt[0];
+ dyt[0] = dyt[1];
+ dyt[1] = -t;
+ }
+
+ // side faces of unit-cube
+ minx = (minx > 0.25f) ? 0.25f : ((minx < 1e-5f) ? 1e-5 : minx);
+ miny = (miny > 0.25f) ? 0.25f : ((miny < 1e-5f) ? 1e-5 : miny);
+
+ // repeat and clip
+
+ if (tex->extend == TEX_REPEAT) {
+ if ((tex->flag & (TEX_REPEAT_XMIR | TEX_REPEAT_YMIR)) == (TEX_REPEAT_XMIR | TEX_REPEAT_YMIR))
+ extflag = TXC_EXTD;
+ else if (tex->flag & TEX_REPEAT_XMIR)
+ extflag = TXC_XMIR;
+ else if (tex->flag & TEX_REPEAT_YMIR)
+ extflag = TXC_YMIR;
+ else
+ extflag = TXC_REPT;
+ }
+ else if (tex->extend == TEX_EXTEND)
+ extflag = TXC_EXTD;
+
+ if (tex->extend == TEX_CHECKER) {
+ int xs = (int)floorf(fx), ys = (int)floorf(fy);
+ // both checkers available, no boundary exceptions, checkerdist will eat aliasing
+ if ((tex->flag & TEX_CHECKER_ODD) && (tex->flag & TEX_CHECKER_EVEN)) {
+ fx -= xs;
+ fy -= ys;
+ }
+ else {
+ int xs1 = (int)floorf(fx - minx);
+ int ys1 = (int)floorf(fy - miny);
+ int xs2 = (int)floorf(fx + minx);
+ int ys2 = (int)floorf(fy + miny);
+ if ((xs1 != xs2) || (ys1 != ys2)) {
+ if (tex->flag & TEX_CHECKER_ODD) {
+ fx -= ((xs1 + ys) & 1) ? xs2 : xs1;
+ fy -= ((ys1 + xs) & 1) ? ys2 : ys1;
+ }
+ if (tex->flag & TEX_CHECKER_EVEN) {
+ fx -= ((xs1 + ys) & 1) ? xs1 : xs2;
+ fy -= ((ys1 + xs) & 1) ? ys1 : ys2;
+ }
+ }
+ else {
+ if ((tex->flag & TEX_CHECKER_ODD) == 0 && ((xs + ys) & 1) == 0) return retval;
+ if ((tex->flag & TEX_CHECKER_EVEN) == 0 && (xs + ys) & 1) return retval;
+ fx -= xs;
+ fy -= ys;
+ }
+ }
+ // scale around center, (0.5, 0.5)
+ if (tex->checkerdist < 1.f) {
+ const float omcd = 1.f / (1.f - tex->checkerdist);
+ fx = (fx - 0.5f)*omcd + 0.5f;
+ fy = (fy - 0.5f)*omcd + 0.5f;
+ minx *= omcd;
+ miny *= omcd;
+ }
+ }
+
+ if (tex->extend == TEX_CLIPCUBE) {
+ if ((fx + minx) < 0.f || (fy + miny) < 0.f || (fx - minx) > 1.f || (fy - miny) > 1.f || texvec[2] < -1.f || texvec[2] > 1.f) return retval;
+ }
+ else if (tex->extend == TEX_CLIP || tex->extend == TEX_CHECKER) {
+ if ((fx + minx) < 0.f || (fy + miny) < 0.f || (fx - minx) > 1.f || (fy - miny) > 1.f) return retval;
+ }
+ else {
+ if (tex->extend == TEX_EXTEND) {
+ fx = (fx > 1.f) ? 1.f : ((fx < 0.f) ? 0.f : fx);
+ fy = (fy > 1.f) ? 1.f : ((fy < 0.f) ? 0.f : fy);
+ }
+ else {
+ fx -= floorf(fx);
+ fy -= floorf(fy);
+ }
+ }
+
+ intpol = tex->imaflag & TEX_INTERPOL;
+
+ // warning no return!
+ if ((R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields))
+ ibuf->rect += ibuf->x*ibuf->y;
+
+ // struct common data
+ AFD.dxt = dxt;
+ AFD.dyt = dyt;
+ AFD.intpol = intpol;
+ AFD.extflag = extflag;
+
+ // choice:
+ if (tex->imaflag & TEX_MIPMAP) {
+ ImBuf *previbuf, *curibuf;
+ float levf;
+ int maxlev;
+ ImBuf* mipmaps[IB_MIPMAP_LEVELS + 1];
+
+ // modify ellipse minor axis if too eccentric, use for area sampling as well
+ // scaling dxt/dyt as done in pbrt is not the same
+ // (as in ewa_eval(), scale by sqrt(ibuf->x) to maximize precision)
+ const float ff = sqrtf(ibuf->x), q = ibuf->y/ff;
+ const float Ux = dxt[0]*ff, Vx = dxt[1]*q, Uy = dyt[0]*ff, Vy = dyt[1]*q;
+ const float A = Vx*Vx + Vy*Vy;
+ const float B = -2.f*(Ux*Vx + Uy*Vy);
+ const float C = Ux*Ux + Uy*Uy;
+ const float F = A*C - B*B*0.25f;
+ float a, b, th, ecc;
+ imp2radangle(A, B, C, F, &a, &b, &th, &ecc);
+ if (tex->texfilter == TXF_FELINE) {
+ float fProbes;
+ a *= ff;
+ b *= ff;
+ a = MAX2(a, 1.f);
+ b = MAX2(b, 1.f);
+ fProbes = 2.f*(a / b) - 1.f;
+ AFD.iProbes = (int)floorf(fProbes + 0.5f);
+ AFD.iProbes = MIN2(AFD.iProbes, tex->afmax);
+ if (AFD.iProbes < fProbes)
+ b = 2.f*a / (float)(AFD.iProbes + 1);
+ AFD.majrad = a/ff;
+ AFD.minrad = b/ff;
+ AFD.theta = th;
+ AFD.dusc = 1.f/ff;
+ AFD.dvsc = ff / (float)ibuf->y;
+ }
+ else { // EWA & area
+ if (ecc > (float)tex->afmax) b = a / (float)tex->afmax;
+ b *= ff;
+ }
+ maxd = MAX2(b, 1e-8f);
+ levf = ((float)M_LOG2E)*logf(maxd);
+
+ curmap = 0;
+ maxlev = 1;
+ mipmaps[0] = ibuf;
+ while (curmap < IB_MIPMAP_LEVELS) {
+ mipmaps[curmap + 1] = ibuf->mipmap[curmap];
+ if (ibuf->mipmap[curmap]) maxlev++;
+ curmap++;
+ }
+
+ // mipmap level
+ if (levf < 0.f) { // original image only
+ previbuf = curibuf = mipmaps[0];
+ levf = 0.f;
+ }
+ else if (levf >= maxlev - 1) {
+ previbuf = curibuf = mipmaps[maxlev - 1];
+ levf = 0.f;
+ if (tex->texfilter == TXF_FELINE) AFD.iProbes = 1;
+ }
+ else {
+ const int lev = ISNAN(levf) ? 0 : (int)levf;
+ curibuf = mipmaps[lev];
+ previbuf = mipmaps[lev + 1];
+ levf -= floorf(levf);
+ }
+
+ // filter functions take care of interpolation themselves, no need to modify dxt/dyt here
+
+ if (texres->nor && ((tex->imaflag & TEX_NORMALMAP) == 0)) {
+ // color & normal
+ filterfunc(texres, curibuf, fx, fy, &AFD);
+ val1 = texres->tr + texres->tg + texres->tb;
+ filterfunc(&texr, curibuf, fx + dxt[0], fy + dxt[1], &AFD);
+ val2 = texr.tr + texr.tg + texr.tb;
+ filterfunc(&texr, curibuf, fx + dyt[0], fy + dyt[1], &AFD);
+ val3 = texr.tr + texr.tg + texr.tb;
+ // don't switch x or y!
+ texres->nor[0] = val1 - val2;
+ texres->nor[1] = val1 - val3;
+ if (previbuf != curibuf) { // interpolate
+ filterfunc(&texr, previbuf, fx, fy, &AFD);
+ // rgb
+ texres->tr += levf*(texr.tr - texres->tr);
+ texres->tg += levf*(texr.tg - texres->tg);
+ texres->tb += levf*(texr.tb - texres->tb);
+ texres->ta += levf*(texr.ta - texres->ta);
+ // normal
+ val1 += levf*((texr.tr + texr.tg + texr.tb) - val1);
+ filterfunc(&texr, previbuf, fx + dxt[0], fy + dxt[1], &AFD);
+ val2 += levf*((texr.tr + texr.tg + texr.tb) - val2);
+ filterfunc(&texr, previbuf, fx + dyt[0], fy + dyt[1], &AFD);
+ val3 += levf*((texr.tr + texr.tg + texr.tb) - val3);
+ texres->nor[0] = val1 - val2; // vals have been interpolated above!
+ texres->nor[1] = val1 - val3;
+ }
+ }
+ else { // color
+ filterfunc(texres, curibuf, fx, fy, &AFD);
+ if (previbuf != curibuf) { // interpolate
+ filterfunc(&texr, previbuf, fx, fy, &AFD);
+ texres->tr += levf*(texr.tr - texres->tr);
+ texres->tg += levf*(texr.tg - texres->tg);
+ texres->tb += levf*(texr.tb - texres->tb);
+ texres->ta += levf*(texr.ta - texres->ta);
+ }
+
+ alpha_clip_aniso(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, extflag, texres);
+ }
+ }
+ else { // no mipmap
+ // filter functions take care of interpolation themselves, no need to modify dxt/dyt here
+ if (tex->texfilter == TXF_FELINE) {
+ const float ff = sqrtf(ibuf->x), q = ibuf->y/ff;
+ const float Ux = dxt[0]*ff, Vx = dxt[1]*q, Uy = dyt[0]*ff, Vy = dyt[1]*q;
+ const float A = Vx*Vx + Vy*Vy;
+ const float B = -2.f*(Ux*Vx + Uy*Vy);
+ const float C = Ux*Ux + Uy*Uy;
+ const float F = A*C - B*B*0.25f;
+ float a, b, th, ecc, fProbes;
+ imp2radangle(A, B, C, F, &a, &b, &th, &ecc);
+ a *= ff;
+ b *= ff;
+ a = MAX2(a, 1.f);
+ b = MAX2(b, 1.f);
+ fProbes = 2.f*(a / b) - 1.f;
+ // no limit to number of Probes here
+ AFD.iProbes = (int)floorf(fProbes + 0.5f);
+ if (AFD.iProbes < fProbes) b = 2.f*a / (float)(AFD.iProbes + 1);
+ AFD.majrad = a/ff;
+ AFD.minrad = b/ff;
+ AFD.theta = th;
+ AFD.dusc = 1.f/ff;
+ AFD.dvsc = ff / (float)ibuf->y;
+ }
+ if (texres->nor && ((tex->imaflag & TEX_NORMALMAP) == 0)) {
+ // color & normal
+ filterfunc(texres, ibuf, fx, fy, &AFD);
+ val1 = texres->tr + texres->tg + texres->tb;
+ filterfunc(&texr, ibuf, fx + dxt[0], fy + dxt[1], &AFD);
+ val2 = texr.tr + texr.tg + texr.tb;
+ filterfunc(&texr, ibuf, fx + dyt[0], fy + dyt[1], &AFD);
+ val3 = texr.tr + texr.tg + texr.tb;
+ // don't switch x or y!
+ texres->nor[0] = val1 - val2;
+ texres->nor[1] = val1 - val3;
+ }
+ else {
+ filterfunc(texres, ibuf, fx, fy, &AFD);
+ alpha_clip_aniso(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, extflag, texres);
+ }
+ }
+
+ BRICONTRGB;
+
+ if (tex->imaflag & TEX_CALCALPHA)
+ texres->ta = texres->tin = texres->ta * MAX3(texres->tr, texres->tg, texres->tb);
+ else
+ texres->tin = texres->ta;
+ if (tex->flag & TEX_NEGALPHA) texres->ta = 1.f - texres->ta;
+
+ if ((R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields))
+ ibuf->rect -= ibuf->x*ibuf->y;
+
+ if (texres->nor && (tex->imaflag & TEX_NORMALMAP)) { // normal from color
+ texres->nor[0] = 2.f*(texres->tr - 0.5f);
+ texres->nor[1] = 2.f*(0.5f - texres->tg);
+ texres->nor[2] = 2.f*(texres->tb - 0.5f);
+ }
+
+ // de-premul, this is being premulled in shade_input_do_shade()
+ // TXF: this currently does not (yet?) work properly, destroys edge AA in clip/checker mode, so for now commented out
+ // also disabled in imagewraposa() to be able to compare results with blender's default texture filtering
+
+ // brecht: tried to fix this, see "TXF alpha" comments
+
+ if (texres->ta != 1.f && (texres->ta > FLT_EPSILON)) {
+ fx = 1.f/texres->ta;
+ texres->tr *= fx;
+ texres->tg *= fx;
+ texres->tb *= fx;
+ }
+
+ return retval;
+}
-int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, float *dyt, TexResult *texres)
+
+int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, float *DYT, TexResult *texres)
{
TexResult texr;
- float fx, fy, minx, maxx, miny, maxy, dx, dy;
+ float fx, fy, minx, maxx, miny, maxy, dx, dy, dxt[3], dyt[3];
float maxd, pixsize, val1, val2, val3;
- int curmap, retval, imaprepeat, imapextend;
+ int curmap, retval, imaprepeat, imapextend, SAT = (tex->texfilter == TXF_SAT);
+
+ // TXF: since dxt/dyt might be modified here and since they might be needed after imagewraposa() call,
+ // make a local copy here so that original vecs remain untouched
+ VECCOPY(dxt, DXT);
+ VECCOPY(dyt, DYT);
+
+ // anisotropic filtering
+ if (!SAT && (tex->texfilter != TXF_BOX))
+ return imagewraposa_aniso(tex, ima, ibuf, texvec, dxt, dyt, texres);
texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f;
@@ -653,13 +1526,13 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, f
return retval;
/* mipmap test */
- if(tex->imaflag & TEX_MIPMAP) {
+ if (SAT || 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);
+ IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP, SAT);
BLI_unlock_thread(LOCK_IMAGE);
}
@@ -871,11 +1744,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);
+ boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0);
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);
+ boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0, 0);
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);
+ boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0, 0);
val3= texr.tr + texr.tg + texr.tb;
/* don't switch x or y! */
@@ -884,7 +1757,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);
+ boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend, 0, 0);
/* calc rgb */
dx= 2.0f*(pixsize-maxd)/pixsize;
@@ -901,9 +1774,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);
+ boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0, 0);
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);
+ boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0, 0);
val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb);
texres->nor[0]= (val1-val2); /* vals have been interpolated above! */
@@ -926,10 +1799,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);
+ boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend, 0, 0);
if(previbuf!=curibuf) { /* interpolate */
- boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend);
+ boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend, 0, 0);
fx= 2.0f*(pixsize-maxd)/pixsize;
@@ -947,26 +1820,39 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, f
}
}
else {
- if((tex->imaflag & TEX_INTERPOL)) {
+ const int intpol = tex->imaflag & TEX_INTERPOL;
+ if (intpol && !SAT) {
/* sample 1 pixel minimum */
if (minx < 0.5f / ibuf->x) minx = 0.5f / ibuf->x;
if (miny < 0.5f / ibuf->y) miny = 0.5f / ibuf->y;
}
if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==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);
- 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);
- val3= texr.tr + texr.tg + texr.tb;
+ if (SAT) {
+ boxsample(ibuf->mipmap[0], fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 1, intpol);
+ val1 = texres->tr + texres->tg + texres->tb;
+ boxsample(ibuf->mipmap[0], fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 1, intpol);
+ val2 = texr.tr + texr.tg + texr.tb;
+ boxsample(ibuf->mipmap[0], fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 1, intpol);
+ val3 = texr.tr + texr.tg + texr.tb;
+ }
+ else {
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0);
+ 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, 0);
+ 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, 0);
+ val3= texr.tr + texr.tg + texr.tb;
+ }
/* don't switch x or y! */
texres->nor[0]= (val1-val2);
texres->nor[1]= (val1-val3);
}
else {
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
+ if (SAT)
+ boxsample(ibuf->mipmap[0], fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 1, intpol);
+ else
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0, 0);
}
}
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index a0185a64659..d388e81a745 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -41,7 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
-#include "MTC_matrixops.h"
+
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
@@ -453,6 +453,7 @@ void RE_SetCamera(Render *re, Object *camera)
cam= camera->data;
if(cam->type==CAM_ORTHO) re->r.mode |= R_ORTHO;
+ if(cam->flag & CAM_PANORAMA) re->r.mode |= R_PANORAMA;
/* solve this too... all time depending stuff is in convertblender.c?
* Need to update the camera early because it's used for projection matrices
@@ -601,7 +602,7 @@ void initparts(Render *re)
yparts= re->r.yparts;
/* mininum part size, but for exr tile saving it was checked already */
- if(!(re->r.scemode & R_EXR_TILE_FILE)) {
+ if(!(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE))) {
if(re->r.mode & R_PANORAMA) {
if(ceil(re->rectx/(float)xparts) < 8)
xparts= 1 + re->rectx/8;
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 1cbf2523156..a15377a8c6d 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -630,7 +630,7 @@ static OcclusionTree *occ_tree_build(Render *re)
if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
else vlr++;
- if(vlr->mat->mode & MA_TRACEBLE)
+ if((vlr->mat->mode & MA_TRACEBLE) && (vlr->mat->material_type == MA_TYPE_SURFACE))
totface++;
}
}
@@ -663,7 +663,7 @@ static OcclusionTree *occ_tree_build(Render *re)
if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak;
else vlr++;
- if(vlr->mat->mode & MA_TRACEBLE) {
+ if((vlr->mat->mode & MA_TRACEBLE) && (vlr->mat->material_type == MA_TYPE_SURFACE)) {
tree->face[b].obi= c;
tree->face[b].facenr= a;
tree->occlusion[b]= 1.0f;
@@ -754,9 +754,9 @@ static int occ_visible_quad(float *p, float *n, float *v0, float *v1, float *v2,
sd[1]= INPR(n, v1) - c;
sd[2]= INPR(n, v2) - c;
- if(fabs(sd[0]) < epsilon) sd[0] = 0.0f;
- if(fabs(sd[1]) < epsilon) sd[1] = 0.0f;
- if(fabs(sd[2]) < epsilon) sd[2] = 0.0f;
+ if(fabsf(sd[0]) < epsilon) sd[0] = 0.0f;
+ if(fabsf(sd[1]) < epsilon) sd[1] = 0.0f;
+ if(fabsf(sd[2]) < epsilon) sd[2] = 0.0f;
if(sd[0] > 0) {
if(sd[1] > 0) {
@@ -1086,13 +1086,6 @@ static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, floa
#endif
-static float saacosf(float fac)
-{
- if(fac<= -1.0f) return (float)M_PI;
- else if(fac>=1.0f) return 0.0f;
- else return acos(fac); /* acosf(fac) */
-}
-
static void normalizef(float *n)
{
float d;
@@ -1100,7 +1093,7 @@ static void normalizef(float *n)
d= INPR(n, n);
if(d > 1.0e-35F) {
- d= 1.0f/sqrt(d); /* sqrtf(d) */
+ d= 1.0f/sqrtf(d);
n[0] *= d;
n[1] *= d;
@@ -1222,7 +1215,7 @@ static void occ_lookup(OcclusionTree *tree, int thread, OccFace *exclude, float
fac= 1.0f;
/* accumulate occlusion from spherical harmonics */
- invd2 = 1.0f/sqrt(d2);
+ invd2 = 1.0f/sqrtf(d2);
weight= occ_solid_angle(node, v, d2, invd2, n);
weight *= node->occlusion;
@@ -1258,7 +1251,7 @@ static void occ_lookup(OcclusionTree *tree, int thread, OccFace *exclude, float
weight *= tree->occlusion[node->child[b].face];
if(bentn) {
- invd2= 1.0f/sqrt(d2);
+ invd2= 1.0f/sqrtf(d2);
bentn[0] -= weight*invd2*v[0];
bentn[1] -= weight*invd2*v[1];
bentn[2] -= weight*invd2*v[2];
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 5eec13ed7fe..68b6f9e524c 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -36,6 +36,7 @@
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_sequence_types.h"
#include "DNA_userdef_types.h"
#include "BKE_utildefines.h"
@@ -44,8 +45,10 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_object.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
+#include "BKE_sequence.h"
#include "BKE_pointcache.h"
#include "MEM_guardedalloc.h"
@@ -403,7 +406,7 @@ static int passtype_from_name(char *str)
static void render_unique_exr_name(Render *re, char *str, int sample)
{
- char di[FILE_MAX], name[FILE_MAXFILE], fi[FILE_MAXFILE];
+ char di[FILE_MAX], name[FILE_MAXFILE+MAX_ID_NAME+100], fi[FILE_MAXFILE];
BLI_strncpy(di, G.sce, FILE_MAX);
BLI_splitdirstring(di, fi);
@@ -425,6 +428,8 @@ static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channel
BLI_addtail(&rl->passes, rpass);
rpass->passtype= passtype;
rpass->channels= channels;
+ rpass->rectx= rl->rectx;
+ rpass->recty= rl->recty;
if(rr->exrhandle) {
int a;
@@ -527,6 +532,8 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
rl->pass_xor= srl->pass_xor;
rl->light_override= srl->light_override;
rl->mat_override= srl->mat_override;
+ rl->rectx= rectx;
+ rl->recty= recty;
if(rr->exrhandle) {
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
@@ -572,6 +579,9 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
+ rl->rectx= rectx;
+ rl->recty= recty;
+
/* duplicate code... */
if(rr->exrhandle) {
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
@@ -809,7 +819,7 @@ static void ml_addpass_cb(void *base, void *lay, char *str, float *rect, int tot
BLI_addtail(&rl->passes, rpass);
rpass->channels= totchan;
-
+
rpass->passtype= passtype_from_name(str);
if(rpass->passtype==0) printf("unknown pass %s\n", str);
rl->passflag |= rpass->passtype;
@@ -826,11 +836,23 @@ static void ml_addpass_cb(void *base, void *lay, char *str, float *rect, int tot
RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty)
{
RenderResult *rr= MEM_callocN(sizeof(RenderResult), "loaded render result");
+ RenderLayer *rl;
+ RenderPass *rpass;
rr->rectx= rectx;
rr->recty= recty;
IMB_exr_multilayer_convert(exrhandle, rr, ml_addlayer_cb, ml_addpass_cb);
+
+ for(rl=rr->layers.first; rl; rl=rl->next) {
+ rl->rectx= rectx;
+ rl->recty= recty;
+
+ for(rpass=rl->passes.first; rpass; rpass=rpass->next) {
+ rpass->rectx= rectx;
+ rpass->recty= recty;
+ }
+ }
return rr;
}
@@ -846,33 +868,26 @@ static void renderresult_add_names(RenderResult *rr)
strcpy(rpass->name, get_pass_name(rpass->passtype, -1));
}
-
-/* only for temp buffer files, makes exact copy of render result */
-static void read_render_result(Render *re, int sample)
+/* called for reading temp files, and for external engines */
+static int read_render_result_from_file(char *filename, RenderResult *rr)
{
RenderLayer *rl;
RenderPass *rpass;
void *exrhandle= IMB_exr_get_handle();
int rectx, recty;
- char str[FILE_MAX];
-
- RE_FreeRenderResult(re->result);
- re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
- render_unique_exr_name(re, str, sample);
- if(IMB_exr_begin_read(exrhandle, str, &rectx, &recty)==0) {
+ if(IMB_exr_begin_read(exrhandle, filename, &rectx, &recty)==0) {
IMB_exr_close(exrhandle);
- printf("cannot read: %s\n", str);
- return;
+ return 0;
}
- printf("read exr tmp file: %s\n", str);
-
- if(re->result == NULL || rectx!=re->result->rectx || recty!=re->result->recty) {
+ if(rr == NULL || rectx!=rr->rectx || recty!=rr->recty) {
printf("error in reading render result\n");
+ IMB_exr_close(exrhandle);
+ return 0;
}
else {
- for(rl= re->result->layers.first; rl; rl= rl->next) {
+ for(rl= rr->layers.first; rl; rl= rl->next) {
/* combined */
if(rl->rectf) {
@@ -892,10 +907,27 @@ static void read_render_result(Render *re, int sample)
}
IMB_exr_read_channels(exrhandle);
- renderresult_add_names(re->result);
+ renderresult_add_names(rr);
}
IMB_exr_close(exrhandle);
+
+ return 1;
+}
+
+/* only for temp buffer files, makes exact copy of render result */
+static void read_render_result(Render *re, int sample)
+{
+ char str[FILE_MAX];
+
+ RE_FreeRenderResult(re->result);
+ re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
+
+ render_unique_exr_name(re, str, sample);
+ printf("read exr tmp file: %s\n", str);
+
+ if(!read_render_result_from_file(str, re->result))
+ printf("cannot read: %s\n", str);
}
/* *************************************************** */
@@ -1092,14 +1124,14 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy
re->ok= 0;
}
else {
-#ifndef WITH_OPENEXR
+#ifdef WITH_OPENEXR
+ if(re->r.scemode & R_FULL_SAMPLE)
+ re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */
+#else
/* can't do this without openexr support */
- re->r.scemode &= ~R_EXR_TILE_FILE;
+ re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE);
#endif
- if(!(re->r.scemode & R_EXR_TILE_FILE))
- re->r.scemode &= ~R_FULL_SAMPLE; /* clear, so we can use this flag for test both */
-
/* fullsample wants uniform osa levels */
if(source && (re->r.scemode & R_FULL_SAMPLE)) {
/* but, if source has no full sample we disable it */
@@ -1494,12 +1526,12 @@ static void threaded_tile_processor(Render *re)
if(re->result==NULL || !(re->r.scemode & R_PREVIEWBUTS)) {
RE_FreeRenderResult(re->result);
- if(re->sss_points)
+ if(re->sss_points && render_display_draw_enabled(re))
re->result= new_render_result(re, &re->disprect, 0, 0);
else if(re->r.scemode & R_FULL_SAMPLE)
re->result= new_full_sample_buffers_exr(re);
else
- re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & R_EXR_TILE_FILE);
+ re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE));
}
if(re->result==NULL)
@@ -1644,8 +1676,23 @@ void RE_TileProcessor(Render *re, int firsttile, int threaded)
/* ************ This part uses API, for rendering Blender scenes ********** */
+static void external_render_3d(Render *re, RenderEngineType *type);
+
static void do_render_3d(Render *re)
{
+ RenderEngineType *type;
+
+ /* try external */
+ for(type=R_engines.first; type; type=type->next)
+ if(strcmp(type->idname, re->r.engine) == 0)
+ break;
+
+ if(type && type->render) {
+ external_render_3d(re, type);
+ return;
+ }
+
+ /* internal */
// re->cfra= cfra; /* <- unused! */
@@ -1661,7 +1708,6 @@ static void do_render_3d(Render *re)
if(re->flag & R_HALO)
if(!re->test_break(re->tbh))
add_halo_flare(re);
-
/* free all render verts etc */
RE_Database_Free(re);
@@ -2268,6 +2314,63 @@ static void renderresult_stampinfo(Scene *scene)
BKE_stamp_buf(scene, (unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4);
}
+static void do_render_seq(Render * re)
+{
+ static int recurs_depth = 0;
+ struct ImBuf *ibuf;
+ RenderResult *rr = re->result;
+ int cfra = re->r.cfra;
+
+ recurs_depth++;
+
+ ibuf= give_ibuf_seq(re->scene, rr->rectx, rr->recty, cfra, 0, 100.0);
+
+ recurs_depth--;
+
+ if(ibuf) {
+ if(ibuf->rect_float) {
+ if (!rr->rectf)
+ rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf");
+
+ memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
+
+ /* TSK! Since sequence render doesn't free the *rr render result, the old rect32
+ can hang around when sequence render has rendered a 32 bits one before */
+ if(rr->rect32) {
+ MEM_freeN(rr->rect32);
+ rr->rect32= NULL;
+ }
+ }
+ else if(ibuf->rect) {
+ if (!rr->rect32)
+ rr->rect32= MEM_mallocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect");
+
+ memcpy(rr->rect32, ibuf->rect, 4*rr->rectx*rr->recty);
+
+ /* if (ibuf->zbuf) { */
+ /* if (R.rectz) freeN(R.rectz); */
+ /* R.rectz = BLI_dupallocN(ibuf->zbuf); */
+ /* } */
+ }
+
+ if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
+ Editing * ed = re->scene->ed;
+ if (ed) {
+ free_imbuf_seq(&ed->seqbase, TRUE);
+ }
+ }
+ }
+ else {
+ /* render result is delivered empty in most cases, nevertheless we handle all cases */
+ if (rr->rectf)
+ memset(rr->rectf, 0, 4*sizeof(float)*rr->rectx*rr->recty);
+ else if (rr->rect32)
+ memset(rr->rect32, 0, 4*rr->rectx*rr->recty);
+ else
+ rr->rect32= MEM_callocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect");
+ }
+}
+
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* main loop: doing sequence + fields + blur + 3d render + compositing */
@@ -2278,10 +2381,10 @@ static void do_render_all_options(Render *re)
/* ensure no images are in memory from previous animated sequences */
BKE_image_all_free_anim_ibufs(re->r.cfra);
- if(re->r.scemode & R_DOSEQ) {
+ if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) {
/* note: do_render_seq() frees rect32 when sequencer returns float images */
if(!re->test_break(re->tbh))
- ; //XXX do_render_seq(re->result, re->r.cfra);
+ do_render_seq(re);
re->stats_draw(re->sdh, &re->i);
re->display_draw(re->ddh, re->result, NULL);
@@ -2299,7 +2402,7 @@ static void do_render_all_options(Render *re)
re->stats_draw(re->sdh, &re->i);
/* stamp image info here */
- if((re->r.scemode & R_STAMP_INFO) && (re->r.stamp & R_STAMP_DRAW)) {
+ if((re->r.stamp & R_STAMP_ALL) && (re->r.stamp & R_STAMP_DRAW)) {
renderresult_stampinfo(re->scene);
re->display_draw(re->ddh, re->result, NULL);
}
@@ -2327,13 +2430,13 @@ static int is_rendering_allowed(Render *re)
re->error(re->erh, "No border area selected.");
return 0;
}
- if(re->r.scemode & R_EXR_TILE_FILE) {
+ if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
re->error(re->erh, "Border render and Buffer-save not supported yet");
return 0;
}
}
- if(re->r.scemode & R_EXR_TILE_FILE) {
+ if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
char str[FILE_MAX];
render_unique_exr_name(re, str, 0);
@@ -2413,7 +2516,7 @@ static int is_rendering_allowed(Render *re)
return 1;
}
-static void update_physics_cache(Render *re, Scene *scene)
+static void update_physics_cache(Render *re, Scene *scene, int anim_init)
{
PTCacheBaker baker;
@@ -2421,6 +2524,8 @@ static void update_physics_cache(Render *re, Scene *scene)
baker.pid = NULL;
baker.bake = 0;
baker.render = 1;
+ baker.anim_init = 1;
+ baker.quick_step = 1;
baker.break_test = re->test_break;
baker.break_data = re->tbh;
baker.progressbar = NULL;
@@ -2428,7 +2533,7 @@ static void update_physics_cache(Render *re, Scene *scene)
BKE_ptcache_make_cache(&baker);
}
/* evaluating scene options for general Blender render */
-static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
+static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int anim_init)
{
int winx, winy;
rcti disprect;
@@ -2465,8 +2570,15 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
/* check all scenes involved */
tag_scenes_for_render(re);
- /* make sure dynamics are up to date */
- update_physics_cache(re, scene);
+ /*
+ * Disabled completely for now,
+ * can be later set as render profile option
+ * and default for background render.
+ */
+ if(0) {
+ /* make sure dynamics are up to date */
+ update_physics_cache(re, scene, anim_init);
+ }
if(scene->r.scemode & R_SINGLE_LAYER)
push_render_result(re);
@@ -2496,7 +2608,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, int frame)
scene->r.cfra= frame;
- if(render_initialize_from_scene(re, scene, 0)) {
+ if(render_initialize_from_scene(re, scene, 0, 0)) {
do_render_all_options(re);
}
@@ -2540,13 +2652,16 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
int ok;
- /* if not exists, BKE_write_ibuf makes one */
+ /* if not exists, BKE_write_ibuf makes one */
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;
+ /* gamma correct to sRGB color space */
+ if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ ibuf->profile = IB_PROFILE_SRGB;
ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
@@ -2585,7 +2700,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
int nfra;
/* do not fully call for each frame, it initializes & pops output window */
- if(!render_initialize_from_scene(re, scene, 0))
+ if(!render_initialize_from_scene(re, scene, 0, 1))
return;
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
@@ -2594,7 +2709,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
re->result_ok= 0;
if(BKE_imtype_is_movie(scene->r.imtype))
- mh->start_movie(&re->r, re->rectx, re->recty);
+ mh->start_movie(scene, &re->r, re->rectx, re->recty);
if (mh->get_next_frame) {
while (!(G.afbreek == 1)) {
@@ -2616,7 +2731,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
char name[FILE_MAX];
/* only border now, todo: camera lens. (ton) */
- render_initialize_from_scene(re, scene, 1);
+ render_initialize_from_scene(re, scene, 1, 0);
if(nfra!=scene->r.cfra) {
/*
@@ -2741,3 +2856,191 @@ void RE_init_threadcount(Render *re)
re->r.threads = BLI_system_thread_count();
}
}
+
+/************************** External Engines ***************************/
+
+RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h)
+{
+ Render *re= engine->re;
+ RenderResult *result;
+ rcti disprect;
+
+ /* ensure the coordinates are within the right limits */
+ CLAMP(x, 0, re->result->rectx);
+ CLAMP(y, 0, re->result->recty);
+ CLAMP(w, 0, re->result->rectx);
+ CLAMP(h, 0, re->result->recty);
+
+ if(x + w > re->result->rectx)
+ w= re->result->rectx - x;
+ if(y + h > re->result->recty)
+ h= re->result->recty - y;
+
+ /* allocate a render result */
+ disprect.xmin= x;
+ disprect.xmax= x+w;
+ disprect.ymin= y;
+ disprect.ymax= y+h;
+
+ if(0) { // XXX (re->r.scemode & R_FULL_SAMPLE)) {
+ result= new_full_sample_buffers(re, &engine->fullresult, &disprect, 0);
+ }
+ else {
+ result= new_render_result(re, &disprect, 0, RR_USEMEM);
+ BLI_addtail(&engine->fullresult, result);
+ }
+
+ return result;
+}
+
+void RE_engine_update_result(RenderEngine *engine, RenderResult *result)
+{
+ Render *re= engine->re;
+
+ if(result && render_display_draw_enabled(re)) {
+ result->renlay= result->layers.first; // weak
+ re->display_draw(re->ddh, result, NULL);
+ }
+}
+
+void RE_engine_end_result(RenderEngine *engine, RenderResult *result)
+{
+ Render *re= engine->re;
+
+ if(!result)
+ return;
+
+ /* merge */
+ if(re->result->exrhandle) {
+ RenderResult *rr, *rrpart;
+
+ // XXX crashes, exr expects very particular part sizes
+ for(rr= re->result, rrpart= result; rr && rrpart; rr= rr->next, rrpart= rrpart->next)
+ save_render_result_tile(rr, rrpart);
+ }
+ else if(render_display_draw_enabled(re)) {
+ /* on break, don't merge in result for preview renders, looks nicer */
+ if(re->test_break(re->tbh) && (re->r.scemode & R_PREVIEWBUTS));
+ else merge_render_result(re->result, result);
+ }
+
+ /* draw */
+ if(!re->test_break(re->tbh) && render_display_draw_enabled(re)) {
+ result->renlay= result->layers.first; // weak
+ re->display_draw(re->ddh, result, NULL);
+ }
+
+ /* free */
+ free_render_result(&engine->fullresult, result);
+}
+
+int RE_engine_test_break(RenderEngine *engine)
+{
+ Render *re= engine->re;
+
+ return re->test_break(re->tbh);
+}
+
+void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
+{
+ Render *re= engine->re;
+
+ re->i.statstr= stats;
+ re->i.infostr= info;
+ re->stats_draw(re->sdh, &re->i);
+ re->i.infostr= NULL;
+ re->i.statstr= NULL;
+}
+
+/* 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)
+{
+ ImBuf *ibuf = IMB_loadiffname(filename, IB_rect);
+
+ if(ibuf && (ibuf->rect || ibuf->rect_float)) {
+ if (ibuf->x == layer->rectx && ibuf->y == layer->recty) {
+ if(ibuf->rect_float==NULL)
+ IMB_float_from_rect(ibuf);
+
+ memcpy(layer->rectf, ibuf->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
+ } else {
+ if ((ibuf->x >= layer->rectx) && (ibuf->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);
+ if(ibuf_clip) {
+ IMB_rectcpy(ibuf_clip, ibuf, 0,0, 0,0, layer->rectx, layer->recty);
+
+ memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
+ IMB_freeImBuf(ibuf_clip);
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to allocate clip buffer '%s'\n", filename);
+ }
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: incorrect dimensions for partial copy '%s'\n", filename);
+ }
+ }
+
+ IMB_freeImBuf(ibuf);
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
+ }
+}
+
+void RE_result_load_from_file(RenderResult *result, ReportList *reports, 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);
+ return;
+ }
+}
+
+static void external_render_3d(Render *re, RenderEngineType *type)
+{
+ RenderEngine engine;
+
+ if(re->result==NULL || !(re->r.scemode & R_PREVIEWBUTS)) {
+ RE_FreeRenderResult(re->result);
+
+ if(0) // XXX re->r.scemode & R_FULL_SAMPLE)
+ re->result= new_full_sample_buffers_exr(re);
+ else
+ re->result= new_render_result(re, &re->disprect, 0, 0); // XXX re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE));
+ }
+
+ if(re->result==NULL)
+ return;
+
+ /* external */
+ memset(&engine, 0, sizeof(engine));
+ engine.type= type;
+ engine.re= re;
+
+ type->render(&engine, re->scene);
+
+ free_render_result(&engine.fullresult, engine.fullresult.first);
+
+ if(re->result->exrhandle) {
+ RenderResult *rr;
+
+ save_empty_result_tiles(re);
+
+ for(rr= re->result; rr; rr= rr->next) {
+ IMB_exr_close(rr->exrhandle);
+ rr->exrhandle= NULL;
+ }
+
+ free_render_result(&re->fullresult, re->result);
+ re->result= NULL;
+
+ read_render_result(re, 0);
+ }
+}
+
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index af6093ab36c..de3a50acddf 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -32,8 +32,8 @@
/* External modules: */
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-#include "MTC_matrixops.h"
-#include "MTC_vectorops.h"
+
+
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
@@ -43,6 +43,7 @@
#include "DNA_texture_types.h"
#include "DNA_lamp_types.h"
+#include "BKE_colortools.h"
#include "BKE_image.h"
#include "BKE_global.h"
#include "BKE_material.h"
@@ -58,6 +59,7 @@
#include "rendercore.h"
#include "shadbuf.h"
#include "pixelshading.h"
+#include "shading.h"
#include "sunsky.h"
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -153,7 +155,7 @@ static void render_lighting_halo(HaloRen *har, float *colf)
/* rotate view to lampspace */
VECCOPY(lvrot, lv);
- MTC_Mat3MulVecfl(lar->imat, lvrot);
+ Mat3MulVecfl(lar->imat, lvrot);
x= MAX2(fabs(lvrot[0]/lvrot[2]) , fabs(lvrot[1]/lvrot[2]));
/* 1.0/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
@@ -536,16 +538,22 @@ void shadeSkyView(float *colf, float *rco, float *view, float *dxyview, short th
blend= fabs(0.5+ view[1]);
}
- hor[0]= R.wrld.horr; hor[1]= R.wrld.horg; hor[2]= R.wrld.horb;
- zen[0]= R.wrld.zenr; zen[1]= R.wrld.zeng; zen[2]= R.wrld.zenb;
-
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(hor, &R.wrld.horr);
+ color_manage_linearize(zen, &R.wrld.zenr);
+ }
+ else {
+ VECCOPY(hor, &R.wrld.horr);
+ VECCOPY(zen, &R.wrld.zenr);
+ }
+
/* Careful: SKYTEX and SKYBLEND are NOT mutually exclusive! If */
/* SKYBLEND is active, the texture and color blend are added. */
if(R.wrld.skytype & WO_SKYTEX) {
VECCOPY(lo, view);
if(R.wrld.skytype & WO_SKYREAL) {
- MTC_Mat3MulVecfl(R.imat, lo);
+ Mat3MulVecfl(R.imat, lo);
SWAP(float, lo[1], lo[2]);
@@ -587,7 +595,7 @@ void shadeSunView(float *colf, float *view)
VECCOPY(sview, view);
Normalize(sview);
- MTC_Mat3MulVecfl(R.imat, sview);
+ Mat3MulVecfl(R.imat, sview);
if (sview[2] < 0.0)
sview[2] = 0.0;
Normalize(sview);
@@ -625,9 +633,11 @@ void shadeSkyPixel(float *collector, float fx, float fy, short thread)
}
else if((R.wrld.skytype & (WO_SKYBLEND+WO_SKYTEX))==0) {
/* 2. solid color */
- collector[0] = R.wrld.horr;
- collector[1] = R.wrld.horg;
- collector[2] = R.wrld.horb;
+ if(R.r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ color_manage_linearize(collector, &R.wrld.horr);
+ else
+ VECCOPY(collector, &R.wrld.horr);
+
collector[3] = 0.0f;
}
else {
@@ -668,7 +678,7 @@ void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy,
calc_view_vector(view, fx, fy);
Normalize(view);
- /*MTC_Mat3MulVecfl(R.imat, view);*/
+ /*Mat3MulVecfl(R.imat, view);*/
AtmospherePixleShader(sunsky, view, distance, collector);
}
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
new file mode 100644
index 00000000000..b7832e74cd1
--- /dev/null
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -0,0 +1,485 @@
+/*
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributors: Matt Ebb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_kdopbvh.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_global.h"
+#include "BKE_lattice.h"
+#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_particle.h"
+#include "BKE_texture.h"
+
+#include "DNA_texture_types.h"
+#include "DNA_particle_types.h"
+
+#include "render_types.h"
+#include "renderdatabase.h"
+#include "texture.h"
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
+/* only to be used here in this file, it's for speed */
+extern struct Render R;
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+
+static int point_data_used(PointDensity *pd)
+{
+ int pd_bitflag = 0;
+
+ if ((pd->noise_influence == TEX_PD_NOISE_VEL) || (pd->color_source == TEX_PD_COLOR_PARTVEL) || (pd->color_source == TEX_PD_COLOR_PARTSPEED))
+ pd_bitflag |= POINT_DATA_VEL;
+ if ((pd->noise_influence == TEX_PD_NOISE_AGE) || (pd->color_source == TEX_PD_COLOR_PARTAGE))
+ pd_bitflag |= POINT_DATA_LIFE;
+
+ return pd_bitflag;
+}
+
+
+/* additional data stored alongside the point density BVH,
+ * accessible by point index number to retrieve other information
+ * such as particle velocity or lifetime */
+static void alloc_point_data(PointDensity *pd, int total_particles, int point_data_used)
+{
+ int data_size = 0;
+
+ if (point_data_used & POINT_DATA_VEL) {
+ /* store 3 channels of velocity data */
+ data_size += 3;
+ }
+ if (point_data_used & POINT_DATA_LIFE) {
+ /* store 1 channel of lifetime data */
+ data_size += 1;
+ }
+
+ if (data_size)
+ pd->point_data = MEM_mallocN(sizeof(float)*data_size*total_particles, "particle point data");
+}
+
+static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, ParticleSystem *psys)
+{
+ DerivedMesh* dm;
+ ParticleKey state;
+ ParticleSimulationData sim = {re->scene, ob, psys, NULL};
+ ParticleData *pa=NULL;
+ float cfra = bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0);
+ int i, childexists;
+ int total_particles, offset=0;
+ int data_used = point_data_used(pd);
+ float partco[3];
+ float obview[4][4];
+
+
+ /* init everything */
+ if (!psys || !ob || !pd) return;
+
+ Mat4MulMat4(obview, re->viewinv, ob->obmat);
+
+ /* Just to create a valid rendering context for particles */
+ psys_render_set(ob, psys, re->viewmat, re->winmat, re->winx, re->winy, 0);
+
+ dm = mesh_create_derived_render(re->scene, ob,CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+
+ if ( !psys_check_enabled(ob, psys)) {
+ psys_render_restore(ob, psys);
+ return;
+ }
+
+ /* in case ob->imat isn't up-to-date */
+ Mat4Invert(ob->imat, ob->obmat);
+
+ total_particles = psys->totpart+psys->totchild;
+ psys->lattice=psys_get_lattice(&sim);
+
+ pd->point_tree = BLI_bvhtree_new(total_particles, 0.0, 4, 6);
+ alloc_point_data(pd, total_particles, data_used);
+ pd->totpoints = total_particles;
+ if (data_used & POINT_DATA_VEL) offset = pd->totpoints*3;
+
+ if (psys->totchild > 0 && !(psys->part->draw & PART_DRAW_PARENT))
+ childexists = 1;
+
+ for (i=0, pa=psys->particles; i < total_particles; i++, pa++) {
+
+ state.time = cfra;
+ if(psys_get_particle_state(&sim, i, &state, 0)) {
+
+ VECCOPY(partco, state.co);
+
+ if (pd->psys_cache_space == TEX_PD_OBJECTSPACE)
+ Mat4MulVecfl(ob->imat, partco);
+ else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) {
+ float obloc[3];
+ VECCOPY(obloc, ob->loc);
+ VecSubf(partco, partco, obloc);
+ } else {
+ /* TEX_PD_WORLDSPACE */
+ }
+
+ BLI_bvhtree_insert(pd->point_tree, i, partco, 1);
+
+ if (data_used & POINT_DATA_VEL) {
+ pd->point_data[i*3 + 0] = state.vel[0];
+ pd->point_data[i*3 + 1] = state.vel[1];
+ pd->point_data[i*3 + 2] = state.vel[2];
+ }
+ if (data_used & POINT_DATA_LIFE) {
+ float pa_time;
+
+ if (i < psys->totpart) {
+ pa_time = (cfra - pa->time)/pa->lifetime;
+ } else {
+ ChildParticle *cpa= (psys->child + i) - psys->totpart;
+ float pa_birthtime, pa_dietime;
+
+ pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime);
+ }
+
+ pd->point_data[offset + i] = pa_time;
+ }
+ }
+ }
+
+ BLI_bvhtree_balance(pd->point_tree);
+ dm->release(dm);
+
+ if(psys->lattice){
+ end_latt_deform(psys->lattice);
+ psys->lattice=0;
+ }
+
+ psys_render_restore(ob, psys);
+}
+
+
+static void pointdensity_cache_object(Render *re, PointDensity *pd, ObjectRen *obr)
+{
+ int i;
+
+ if (!obr || !pd) return;
+ if(!obr->vertnodes) return;
+
+ /* in case ob->imat isn't up-to-date */
+ Mat4Invert(obr->ob->imat, obr->ob->obmat);
+
+ pd->point_tree = BLI_bvhtree_new(obr->totvert, 0.0, 4, 6);
+ pd->totpoints = obr->totvert;
+
+ for(i=0; i<obr->totvert; i++) {
+ float ver_co[3];
+ VertRen *ver= RE_findOrAddVert(obr, i);
+
+ VECCOPY(ver_co, ver->co);
+ Mat4MulVecfl(re->viewinv, ver_co);
+
+ if (pd->ob_cache_space == TEX_PD_OBJECTSPACE) {
+ Mat4MulVecfl(obr->ob->imat, ver_co);
+ } else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) {
+ VecSubf(ver_co, ver_co, obr->ob->loc);
+ } else {
+ /* TEX_PD_WORLDSPACE */
+ }
+
+ BLI_bvhtree_insert(pd->point_tree, i, ver_co, 1);
+ }
+
+ BLI_bvhtree_balance(pd->point_tree);
+
+}
+static void cache_pointdensity(Render *re, Tex *tex)
+{
+ PointDensity *pd = tex->pd;
+
+ if (pd->point_tree) {
+ BLI_bvhtree_free(pd->point_tree);
+ pd->point_tree = NULL;
+ }
+
+ if (pd->source == TEX_PD_PSYS) {
+ Object *ob = pd->object;
+
+ if (!ob) return;
+ if (!pd->psys) return;
+
+ pointdensity_cache_psys(re, pd, ob, pd->psys);
+ }
+ else if (pd->source == TEX_PD_OBJECT) {
+ Object *ob = pd->object;
+ ObjectRen *obr;
+ int found=0;
+
+ /* find the obren that corresponds to the object */
+ for (obr=re->objecttable.first; obr; obr=obr->next) {
+ if (obr->ob == ob) {
+ found=1;
+ break;
+ }
+ }
+ if (!found) return;
+
+ pointdensity_cache_object(re, pd, obr);
+ }
+}
+
+static void free_pointdensity(Render *re, Tex *tex)
+{
+ PointDensity *pd = tex->pd;
+
+ if (!pd) return;
+
+ if (pd->point_tree) {
+ BLI_bvhtree_free(pd->point_tree);
+ pd->point_tree = NULL;
+ }
+
+ if (pd->point_data) {
+ MEM_freeN(pd->point_data);
+ pd->point_data = NULL;
+ }
+ pd->totpoints = 0;
+}
+
+
+
+void make_pointdensities(Render *re)
+{
+ Tex *tex;
+
+ if(re->scene->r.scemode & R_PREVIEWBUTS)
+ return;
+
+ re->i.infostr= "Caching Point Densities";
+ re->stats_draw(re->sdh, &re->i);
+
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if(tex->id.us && tex->type==TEX_POINTDENSITY) {
+ cache_pointdensity(re, tex);
+ }
+ }
+
+ re->i.infostr= NULL;
+ re->stats_draw(re->sdh, &re->i);
+}
+
+void free_pointdensities(Render *re)
+{
+ Tex *tex;
+
+ if(re->scene->r.scemode & R_PREVIEWBUTS)
+ return;
+
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if(tex->id.us && tex->type==TEX_POINTDENSITY) {
+ free_pointdensity(re, tex);
+ }
+ }
+}
+
+typedef struct PointDensityRangeData
+{
+ float *density;
+ float squared_radius;
+ float *point_data;
+ float *vec;
+ float softness;
+ short falloff_type;
+ short noise_influence;
+ float *age;
+ int point_data_used;
+ int offset;
+} PointDensityRangeData;
+
+void accum_density(void *userdata, int index, float squared_dist)
+{
+ PointDensityRangeData *pdr = (PointDensityRangeData *)userdata;
+ const float dist = (pdr->squared_radius - squared_dist) / pdr->squared_radius * 0.5f;
+ float density = 0.0f;
+
+ if (pdr->falloff_type == TEX_PD_FALLOFF_STD)
+ density = dist;
+ else if (pdr->falloff_type == TEX_PD_FALLOFF_SMOOTH)
+ density = 3.0f*dist*dist - 2.0f*dist*dist*dist;
+ else if (pdr->falloff_type == TEX_PD_FALLOFF_SOFT)
+ density = pow(dist, pdr->softness);
+ else if (pdr->falloff_type == TEX_PD_FALLOFF_CONSTANT)
+ density = pdr->squared_radius;
+ else if (pdr->falloff_type == TEX_PD_FALLOFF_ROOT)
+ density = sqrt(dist);
+
+ if (pdr->point_data_used & POINT_DATA_VEL) {
+ pdr->vec[0] += pdr->point_data[index*3 + 0]; //* density;
+ pdr->vec[1] += pdr->point_data[index*3 + 1]; //* density;
+ pdr->vec[2] += pdr->point_data[index*3 + 2]; //* density;
+ }
+ if (pdr->point_data_used & POINT_DATA_LIFE) {
+ *pdr->age += pdr->point_data[pdr->offset + index]; // * density;
+ }
+
+ *pdr->density += density;
+}
+
+
+static void init_pointdensityrangedata(PointDensity *pd, PointDensityRangeData *pdr, float *density, float *vec, float *age)
+{
+ pdr->squared_radius = pd->radius*pd->radius;
+ pdr->density = density;
+ pdr->point_data = pd->point_data;
+ pdr->falloff_type = pd->falloff_type;
+ pdr->vec = vec;
+ pdr->age = age;
+ pdr->softness = pd->falloff_softness;
+ pdr->noise_influence = pd->noise_influence;
+ pdr->point_data_used = point_data_used(pd);
+ pdr->offset = (pdr->point_data_used & POINT_DATA_VEL)?pd->totpoints*3:0;
+}
+
+
+int pointdensitytex(Tex *tex, float *texvec, TexResult *texres)
+{
+ int retval = TEX_INT;
+ PointDensity *pd = tex->pd;
+ PointDensityRangeData pdr;
+ float density=0.0f, age=0.0f, time=0.0f;
+ float vec[3] = {0.0f, 0.0f, 0.0f}, co[3];
+ float col[4];
+ float turb, noise_fac;
+ int num=0;
+
+ texres->tin = 0.0f;
+
+ if ((!pd) || (!pd->point_tree))
+ return 0;
+
+ init_pointdensityrangedata(pd, &pdr, &density, vec, &age);
+ noise_fac = pd->noise_fac * 0.5f; /* better default */
+
+ VECCOPY(co, texvec);
+
+ if (point_data_used(pd)) {
+ /* does a BVH lookup to find accumulated density and additional point data *
+ * stores particle velocity vector in 'vec', and particle lifetime in 'time' */
+ num = BLI_bvhtree_range_query(pd->point_tree, co, pd->radius, accum_density, &pdr);
+ if (num > 0) {
+ age /= num;
+ VecMulf(vec, 1.0f/num);
+ }
+
+ /* reset */
+ density = vec[0] = vec[1] = vec[2] = 0.0f;
+ }
+
+ if (pd->flag & TEX_PD_TURBULENCE) {
+
+ if (pd->noise_influence == TEX_PD_NOISE_AGE) {
+ turb = BLI_gTurbulence(pd->noise_size, texvec[0]+age, texvec[1]+age, texvec[2]+age, pd->noise_depth, 0, pd->noise_basis);
+ }
+ else if (pd->noise_influence == TEX_PD_NOISE_TIME) {
+ time = R.cfra / (float)R.r.efra;
+ turb = BLI_gTurbulence(pd->noise_size, texvec[0]+time, texvec[1]+time, texvec[2]+time, pd->noise_depth, 0, pd->noise_basis);
+ //turb = BLI_turbulence(pd->noise_size, texvec[0]+time, texvec[1]+time, texvec[2]+time, pd->noise_depth);
+ }
+ else {
+ turb = BLI_gTurbulence(pd->noise_size, texvec[0]+vec[0], texvec[1]+vec[1], texvec[2]+vec[2], pd->noise_depth, 0, pd->noise_basis);
+ }
+
+ turb -= 0.5f; /* re-center 0.0-1.0 range around 0 to prevent offsetting result */
+
+ /* now we have an offset coordinate to use for the density lookup */
+ co[0] = texvec[0] + noise_fac * turb;
+ co[1] = texvec[1] + noise_fac * turb;
+ co[2] = texvec[2] + noise_fac * turb;
+ }
+
+ /* BVH query with the potentially perturbed coordinates */
+ num = BLI_bvhtree_range_query(pd->point_tree, co, pd->radius, accum_density, &pdr);
+ if (num > 0) {
+ age /= num;
+ VecMulf(vec, 1.0f/num);
+ }
+
+ texres->tin = density;
+ BRICONT;
+
+ if (pd->color_source == TEX_PD_COLOR_CONSTANT)
+ return retval;
+
+ retval |= TEX_RGB;
+
+ switch (pd->color_source) {
+ case TEX_PD_COLOR_PARTAGE:
+ if (pd->coba) {
+ if (do_colorband(pd->coba, age, col)) {
+ texres->talpha= 1;
+ VECCOPY(&texres->tr, col);
+ texres->tin *= col[3];
+ texres->ta = texres->tin;
+ }
+ }
+ break;
+ case TEX_PD_COLOR_PARTSPEED:
+ {
+ float speed = VecLength(vec) * pd->speed_scale;
+
+ if (pd->coba) {
+ if (do_colorband(pd->coba, speed, col)) {
+ texres->talpha= 1;
+ VECCOPY(&texres->tr, col);
+ texres->tin *= col[3];
+ texres->ta = texres->tin;
+ }
+ }
+ break;
+ }
+ case TEX_PD_COLOR_PARTVEL:
+ texres->talpha= 1;
+ VecMulf(vec, pd->speed_scale);
+ VECCOPY(&texres->tr, vec);
+ texres->ta = texres->tin;
+ break;
+ case TEX_PD_COLOR_CONSTANT:
+ default:
+ texres->tr = texres->tg = texres->tb = texres->ta = 1.0f;
+ break;
+ }
+ BRICONTRGB;
+
+ return retval;
+
+ /*
+ if (texres->nor!=NULL) {
+ texres->nor[0] = texres->nor[1] = texres->nor[2] = 0.0f;
+ }
+ */
+}
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 33b58cf9751..c1d0c943ca9 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -54,6 +54,7 @@
#include "pixelshading.h"
#include "shading.h"
#include "texture.h"
+#include "volumetric.h"
#include "RE_raytrace.h"
@@ -95,6 +96,17 @@ static int vlr_check_intersect(Isect *is, int ob, RayFace *face)
return (is->lay & obi->lay);
}
+static int vlr_check_intersect_solid(Isect *is, int ob, RayFace *face)
+{
+ VlakRen *vlr = (VlakRen*)face;
+
+ /* solid material types only */
+ if (vlr->mat->material_type == MA_TYPE_SURFACE)
+ return 1;
+ else
+ return 0;
+}
+
static float *vlr_get_transform(void *userdata, int i)
{
ObjectInstanceRen *obi= RAY_OBJECT_GET((Render*)userdata, i);
@@ -133,7 +145,7 @@ void makeraytree(Render *re)
else vlr++;
/* baking selected to active needs non-traceable too */
if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE)) {
- if((vlr->mat->mode & MA_WIRE)==0) {
+ if(vlr->mat->material_type != MA_TYPE_WIRE) {
VECCOPY(co1, vlr->v1->co);
VECCOPY(co2, vlr->v2->co);
VECCOPY(co3, vlr->v3->co);
@@ -194,7 +206,7 @@ void makeraytree(Render *re)
else vlr++;
if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE))
- if((vlr->mat->mode & MA_WIRE)==0)
+ if(vlr->mat->material_type != MA_TYPE_WIRE)
RE_ray_tree_add_face(re->raytree, RAY_OBJECT_SET(re, obi), vlr);
}
}
@@ -205,7 +217,7 @@ void makeraytree(Render *re)
re->stats_draw(re->sdh, &re->i);
}
-static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
+void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
VlakRen *vlr= (VlakRen*)is->face;
ObjectInstanceRen *obi= RAY_OBJECT_GET(&R, is->ob);
@@ -225,8 +237,7 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->obr= obi->obr;
shi->vlr= vlr;
shi->mat= vlr->mat;
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
// Osa structs we leave unchanged now
SWAP(int, osatex, shi->osatex);
@@ -261,8 +272,14 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shade_input_flip_normals(shi);
shade_input_set_shade_texco(shi);
-
- if(is->mode==RE_RAY_SHADOW_TRA) {
+ if (shi->mat->material_type == MA_TYPE_VOLUME) {
+ if(ELEM(is->mode, RE_RAY_SHADOW, RE_RAY_SHADOW_TRA)) {
+ shade_volume_shadow(shi, shr, is);
+ } else {
+ shade_volume_outside(shi, shr);
+ }
+ }
+ else if(is->mode==RE_RAY_SHADOW_TRA) {
/* temp hack to prevent recursion */
if(shi->nodes==0 && shi->mat->nodetree && shi->mat->use_nodes) {
ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
@@ -276,9 +293,20 @@ static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
shi->mat= vlr->mat; /* shi->mat is being set in nodetree */
}
- else
- shade_material_loop(shi, shr);
-
+ else {
+ int tempdepth;
+ /* XXX dodgy business here, set ray depth to -1
+ * to ignore raytrace in shade_material_loop()
+ * this could really use a refactor --Matt */
+ if (shi->volume_depth == 0) {
+ tempdepth = shi->depth;
+ shi->depth = -1;
+ shade_material_loop(shi, shr);
+ shi->depth = tempdepth;
+ } else {
+ shade_material_loop(shi, shr);
+ }
+ }
/* raytrace likes to separate the spec color */
VECSUB(shr->diff, shr->combined, shr->spec);
}
@@ -362,7 +390,7 @@ static float shade_by_transmission(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
float dx, dy, dz, d, p;
- if (0 == (shi->mat->mode & (MA_RAYTRANSP|MA_ZTRA)))
+ if (0 == (shi->mat->mode & MA_TRANSP))
return -1;
if (shi->mat->tx_limit <= 0.0f) {
@@ -469,7 +497,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
if(depth>0) {
- if(shi.mat->mode_l & (MA_RAYTRANSP|MA_ZTRA) && shr.alpha < 1.0f) {
+ if((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f) {
float nf, f, f1, refract[3], tracol[4];
tracol[0]= shi.r;
@@ -477,7 +505,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
tracol[2]= shi.b;
tracol[3]= col[3]; // we pass on and accumulate alpha
- if(shi.mat->mode & MA_RAYTRANSP) {
+ if((shi.mat->mode & MA_TRANSP) && (shi.mat->mode & MA_RAYTRANSP)) {
/* odd depths: use normal facing viewer, otherwise flip */
if(traflag & RAY_TRAFLIP) {
float norm[3];
@@ -1184,7 +1212,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
float diff[3];
int do_tra, do_mir;
- do_tra= ((shi->mat->mode & (MA_RAYTRANSP)) && shr->alpha!=1.0f);
+ 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);
@@ -1239,15 +1267,20 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
}
if(shi->combinedflag & SCE_PASS_REFLECT) {
+ /* values in shr->spec can be greater then 1.0.
+ * In this case the mircol uses a zero blending factor, so ignoring it is ok.
+ * Fixes bug #18837 - when the spec is higher then 1.0,
+ * diff can become a negative color - Campbell */
- f= fr*(1.0f-shr->spec[0]); f1= 1.0f-i;
- diff[0]= f*mircol[0] + f1*diff[0];
+ f1= 1.0f-i;
- f= fg*(1.0f-shr->spec[1]); f1= 1.0f-i;
- diff[1]= f*mircol[1] + f1*diff[1];
+ diff[0] *= f1;
+ diff[1] *= f1;
+ diff[2] *= f1;
- f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
- diff[2]= f*mircol[2] + f1*diff[2];
+ if(shr->spec[0]<1.0f) diff[0] += mircol[0] * (fr*(1.0f-shr->spec[0]));
+ if(shr->spec[1]<1.0f) diff[1] += mircol[1] * (fg*(1.0f-shr->spec[1]));
+ if(shr->spec[2]<1.0f) diff[2] += mircol[2] * (fb*(1.0f-shr->spec[2]));
}
}
}
@@ -1303,11 +1336,15 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
shi.nodes= origshi->nodes;
shade_ray(is, &shi, &shr);
- if (traflag & RAY_TRA)
- 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);
+ if (shi.mat->material_type == MA_TYPE_SURFACE) {
+ if (traflag & RAY_TRA)
+ 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);
+ } else if (shi.mat->material_type == MA_TYPE_VOLUME) {
+ addAlphaLight(is->col, shr.combined, shr.alpha, 1.0f);
+ }
if(depth>0 && is->col[3]>0.0f) {
@@ -1608,7 +1645,7 @@ static void ray_ao_qmc(ShadeInput *shi, float *shadfac)
prev = fac;
- if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ if(RE_ray_tree_intersect_check(R.raytree, &isec, vlr_check_intersect_solid)) {
if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.labda*R.wrld.aodistfac);
else fac+= 1.0f;
}
@@ -1733,7 +1770,7 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
isec.end[2] = shi->co[2] - maxdist*vec[2];
/* do the trace */
- if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ if(RE_ray_tree_intersect_check(R.raytree, &isec, vlr_check_intersect_solid)) {
if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.labda*R.wrld.aodistfac);
else sh+= 1.0f;
}
@@ -1863,7 +1900,8 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
else max_samples = 1;
} else {
if (do_soft) max_samples = lar->ray_totsamp;
- else max_samples = (R.osa > 4)?R.osa:5;
+ else if (shi->depth == 0) max_samples = (R.osa > 4)?R.osa:5;
+ else max_samples = 1;
}
ray_shadow_jittered_coords(shi, max_samples, jitco, &totjitco);
diff --git a/source/blender/render/intern/source/raytrace.c b/source/blender/render/intern/source/raytrace.c
index 09d3711885a..b34fe6a7039 100644
--- a/source/blender/render/intern/source/raytrace.c
+++ b/source/blender/render/intern/source/raytrace.c
@@ -931,7 +931,7 @@ int RE_ray_face_intersection(Isect *is, RayObjectTransformFunc transformfunc, Ra
intersection to be detected in its neighbour face */
if(is->facecontr && is->faceisect); // optimizing, the tests below are not needed
- else if(is->labda< .1) {
+ else if(is->labda< .1 && is->faceorig) {
RayFace *face= is->faceorig;
float *origv1, *origv2, *origv3, *origv4;
short de= 0;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 165cb88de71..5db81288c1e 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -477,7 +477,7 @@ static void add_filt_passes(RenderLayer *rl, int curmask, int rectx, int offset,
col= shr->refr;
break;
case SCE_PASS_RADIO:
- col= shr->rad;
+ col= NULL; // removed shr->rad;
break;
case SCE_PASS_NORMAL:
col= shr->nor;
@@ -569,7 +569,7 @@ static void add_passes(RenderLayer *rl, int offset, ShadeInput *shi, ShadeResult
col= shr->refr;
break;
case SCE_PASS_RADIO:
- col= shr->rad;
+ col= NULL; // removed shr->rad;
break;
case SCE_PASS_NORMAL:
col= shr->nor;
@@ -1515,9 +1515,7 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
shi->mat= mat;
/* init material vars */
- // note, keep this synced with render_types.h
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
/* render */
shade_input_set_shade_texco(shi);
@@ -1950,10 +1948,7 @@ void RE_shade_external(Render *re, ShadeInput *shi, ShadeResult *shr)
if(shi->mat->nodetree && shi->mat->use_nodes)
ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
else {
- /* copy all relevant material vars, note, keep this synced with render_types.h */
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
- shi->har= shi->mat->har;
-
+ shade_input_init_material(shi);
shade_material_loop(shi, shr);
}
}
@@ -2104,9 +2099,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
ShadeResult shr;
VlakRen *vlr= shi->vlr;
- /* init material vars */
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
if(bs->type==RE_BAKE_AO) {
ambient_occlusion(shi);
@@ -2241,7 +2234,7 @@ static int bake_check_intersect(Isect *is, int ob, RayFace *face)
/* no direction checking for now, doesn't always improve the result
* (INPR(shi->facenor, bs->dir) > 0.0f); */
- return (R.objectinstance[ob].obr->ob != bs->actob);
+ return (R.objectinstance[ob & ~RE_RAY_TRANSFORM_OFFS].obr->ob != bs->actob);
}
static int bake_intersect_tree(RayTree* raytree, Isect* isect, float *start, float *dir, float sign, float *hitco, float *dist)
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 71cd678233d..48305d31e10 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -26,7 +26,7 @@
#include <math.h>
#include <string.h>
-#include "MTC_matrixops.h"
+
#include "MEM_guardedalloc.h"
#include "DNA_group_types.h"
@@ -403,7 +403,7 @@ void makeshadowbuf(Render *re, LampRen *lar)
wsize= shb->pixsize*(shb->size/2.0);
i_window(-wsize, wsize, -wsize, wsize, shb->d, shb->clipend, shb->winmat);
- MTC_Mat4MulMat4(shb->persmat, shb->viewmat, shb->winmat);
+ Mat4MulMat4(shb->persmat, shb->viewmat, shb->winmat);
if(ELEM(lar->buftype, LA_SHADBUF_REGULAR, LA_SHADBUF_HALFWAY)) {
/* jitter, weights - not threadsafe! */
@@ -673,7 +673,7 @@ float testshadowbuf(Render *re, ShadBuf *shb, float *rco, float *dxco, float *dy
VECCOPY(co, rco);
co[3]= 1.0f;
- MTC_Mat4MulVec4fl(shb->persmat, co); /* rational hom co */
+ Mat4MulVec4fl(shb->persmat, co); /* rational hom co */
xs1= siz*(1.0f+co[0]/co[3]);
ys1= siz*(1.0f+co[1]/co[3]);
@@ -714,7 +714,7 @@ float testshadowbuf(Render *re, ShadBuf *shb, float *rco, float *dxco, float *dy
co[1]= rco[1]+dxco[1];
co[2]= rco[2]+dxco[2];
co[3]= 1.0;
- MTC_Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
+ Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
dx[0]= xs1- siz*(1.0+co[0]/co[3]);
dx[1]= ys1- siz*(1.0+co[1]/co[3]);
@@ -722,7 +722,7 @@ float testshadowbuf(Render *re, ShadBuf *shb, float *rco, float *dxco, float *dy
co[1]= rco[1]+dyco[1];
co[2]= rco[2]+dyco[2];
co[3]= 1.0;
- MTC_Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
+ Mat4MulVec4fl(shb->persmat,co); /* rational hom co */
dy[0]= xs1- siz*(1.0+co[0]/co[3]);
dy[1]= ys1- siz*(1.0+co[1]/co[3]);
@@ -858,7 +858,7 @@ float shadow_halo(LampRen *lar, float *p1, float *p2)
co[1]= p1[1];
co[2]= p1[2]/lar->sh_zfac;
co[3]= 1.0;
- MTC_Mat4MulVec4fl(shb->winmat, co); /* rational hom co */
+ Mat4MulVec4fl(shb->winmat, co); /* rational hom co */
xf1= siz*(1.0+co[0]/co[3]);
yf1= siz*(1.0+co[1]/co[3]);
zf1= (co[2]/co[3]);
@@ -868,7 +868,7 @@ float shadow_halo(LampRen *lar, float *p1, float *p2)
co[1]= p2[1];
co[2]= p2[2]/lar->sh_zfac;
co[3]= 1.0;
- MTC_Mat4MulVec4fl(shb->winmat, co); /* rational hom co */
+ Mat4MulVec4fl(shb->winmat, co); /* rational hom co */
xf2= siz*(1.0+co[0]/co[3]);
yf2= siz*(1.0+co[1]/co[3]);
zf2= (co[2]/co[3]);
@@ -1557,7 +1557,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
ma= vlr->mat;
ok= 1;
if((ma->mode & MA_SHADBUF)==0) ok= 0;
- if(ma->mode & MA_WIRE) ok= 0;
+ if(ma->material_type == MA_TYPE_WIRE) ok= 0;
zspanstrand.shad_alpha= zspan.shad_alpha= ma->shad_alpha;
}
@@ -1589,7 +1589,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
c4= testclip(hoco[3]);
/* ***** NO WIRE YET */
- if(ma->mode & MA_WIRE) {
+ if(ma->material_type == MA_TYPE_WIRE) {
if(vlr->v4)
zbufclipwire(&zspan, i, a+1, vlr->ec, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4);
else
@@ -1659,7 +1659,7 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
}
/* move 3d vector to lampbuf */
- MTC_Mat4MulVec4fl(shb->persmat, hoco); /* rational hom co */
+ Mat4MulVec4fl(shb->persmat, hoco); /* rational hom co */
/* clip We can test for -1.0/1.0 because of the properties of the
* coordinate transformations. */
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 1cd8ec110f9..7541ce53073 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -29,7 +29,7 @@
#include <math.h>
#include <string.h>
-#include "MTC_matrixops.h"
+
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -39,6 +39,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_material_types.h"
+#include "BKE_colortools.h"
#include "BKE_utildefines.h"
#include "BKE_node.h"
@@ -51,6 +52,7 @@
#include "shading.h"
#include "strand.h"
#include "texture.h"
+#include "volumetric.h"
#include "zbuf.h"
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -84,11 +86,45 @@ extern struct Render R;
*/
+/* initialise material variables in shadeinput,
+ * doing inverse gamma correction where applicable */
+void shade_input_init_material(ShadeInput *shi)
+{
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(&shi->r, &shi->mat->r);
+ color_manage_linearize(&shi->specr, &shi->mat->specr);
+ color_manage_linearize(&shi->mirr, &shi->mat->mirr);
+
+ /* material ambr / ambg / ambb is overwritten from world
+ color_manage_linearize(shi->ambr, shi->mat->ambr);
+ */
+
+ /* note, keep this synced with render_types.h */
+ memcpy(&shi->amb, &shi->mat->amb, 11*sizeof(float));
+ shi->har= shi->mat->har;
+ } else {
+ /* note, keep this synced with render_types.h */
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
+ shi->har= shi->mat->har;
+ }
+
+}
+
+static void shadeinput_colors_linearize(ShadeInput *shi)
+{
+ color_manage_linearize(&shi->r, &shi->r);
+ color_manage_linearize(&shi->specr, &shi->specr);
+ color_manage_linearize(&shi->mirr, &shi->mirr);
+}
/* also used as callback for nodes */
/* delivers a fully filled in ShadeResult, for all passes */
void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
{
+ /* because node materials don't have access to rendering context,
+ * inverse gamma correction must happen here. evil. */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT && shi->nodes == 1)
+ shadeinput_colors_linearize(shi);
shade_lamp_loop(shi, shr); /* clears shr */
@@ -96,9 +132,7 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
ShadeResult shr_t;
float fac= shi->translucency;
- /* gotta copy it again */
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
VECCOPY(shi->vn, shi->vno);
VECMUL(shi->vn, -1.0f);
@@ -123,16 +157,21 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
/* depth >= 1 when ray-shading */
if(shi->depth==0) {
if(R.r.mode & R_RAYTRACE) {
- if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
+ if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
/* ray trace works on combined, but gives pass info */
ray_trace(shi, shr);
}
}
/* disable adding of sky for raytransp */
- if(shi->mat->mode & MA_RAYTRANSP)
+ 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);
+ }
}
@@ -148,17 +187,20 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
}
else {
/* copy all relevant material vars, note, keep this synced with render_types.h */
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
- shade_material_loop(shi, shr);
+ if (shi->mat->material_type == MA_TYPE_VOLUME) {
+ if(R.r.mode & R_RAYTRACE)
+ shade_volume_outside(shi, shr);
+ } else { /* MA_TYPE_SURFACE, MA_TYPE_WIRE */
+ shade_material_loop(shi, shr);
+ }
}
/* copy additional passes */
if(shi->passflag & (SCE_PASS_VECTOR|SCE_PASS_NORMAL|SCE_PASS_RADIO)) {
QUATCOPY(shr->winspeed, shi->winspeed);
VECCOPY(shr->nor, shi->vn);
- VECCOPY(shr->rad, shi->rad);
}
/* MIST */
@@ -178,13 +220,13 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
/* add mist and premul color */
if(shr->alpha!=1.0f || alpha!=1.0f) {
float fac= alpha*(shr->alpha);
-
shr->combined[3]= fac;
- shr->combined[0]*= fac;
- shr->combined[1]*= fac;
- shr->combined[2]*= fac;
+
+ if (shi->mat->material_type!= MA_TYPE_VOLUME)
+ VecMulf(shr->combined, fac);
}
- else shr->combined[3]= 1.0f;
+ else
+ shr->combined[3]= 1.0f;
/* add z */
shr->z= -shi->co[2];
@@ -416,13 +458,13 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
if(texco & TEXCO_GLOB) {
VECCOPY(shi->gl, shi->co);
- MTC_Mat4MulVecfl(R.viewinv, shi->gl);
+ Mat4MulVecfl(R.viewinv, shi->gl);
if(shi->osatex) {
VECCOPY(shi->dxgl, shi->dxco);
- MTC_Mat3MulVecfl(R.imat, shi->dxco);
+ Mat3MulVecfl(R.imat, shi->dxco);
VECCOPY(shi->dygl, shi->dyco);
- MTC_Mat3MulVecfl(R.imat, shi->dyco);
+ Mat3MulVecfl(R.imat, shi->dyco);
}
}
@@ -527,10 +569,6 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
shi->orn[2]= -shi->vn[2];
}
- if(mode & MA_RADIO) {
- /* not supported */
- }
-
if(texco & TEXCO_REFL) {
/* mirror reflection color textures (and envmap) */
calc_R_ref(shi); /* wrong location for normal maps! XXXXXXXXXXXXXX */
@@ -549,8 +587,6 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
}
- shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
-
/* this only avalailable for scanline renders */
if(shi->depth==0) {
if(texco & TEXCO_WINDOW) {
@@ -571,6 +607,13 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
/* not supported */
}
}
+
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
+ color_manage_linearize(shi->vcol, shi->vcol);
+ }
+ }
+
}
/* from scanline pixel coordinates to 3d coordinates, requires set_triangle */
@@ -579,7 +622,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float *
/* returns not normalized, so is in viewplane coords */
calc_view_vector(view, x, y);
- if(shi->mat->mode & MA_WIRE) {
+ if(shi->mat->material_type == MA_TYPE_WIRE) {
/* wire cannot use normal for calculating shi->co, so
* we reconstruct the coordinate less accurate */
if(R.r.mode & R_ORTHO)
@@ -667,6 +710,10 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float *
}
}
+ /* set camera coords - for scanline, it's always 0.0,0.0,0.0 (render is in camera space)
+ * however for raytrace it can be different - the position of the last intersection */
+ shi->camera_co[0] = shi->camera_co[1] = shi->camera_co[2] = 0.0f;
+
/* cannot normalize earlier, code above needs it at viewplane level */
Normalize(view);
}
@@ -974,12 +1021,15 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(texco & TEXCO_GLOB) {
VECCOPY(shi->gl, shi->co);
- MTC_Mat4MulVecfl(R.viewinv, shi->gl);
+ Mat4MulVecfl(R.viewinv, shi->gl);
if(shi->osatex) {
VECCOPY(shi->dxgl, shi->dxco);
- MTC_Mat3MulVecfl(R.imat, shi->dxco);
+ // TXF: bug was here, but probably should be in convertblender.c, R.imat only valid if there is a world
+ //Mat3MulVecfl(R.imat, shi->dxco);
+ Mat4Mul3Vecfl(R.viewinv, shi->dxco);
VECCOPY(shi->dygl, shi->dyco);
- MTC_Mat3MulVecfl(R.imat, shi->dyco);
+ //Mat3MulVecfl(R.imat, shi->dyco);
+ Mat4Mul3Vecfl(R.viewinv, shi->dyco);
}
}
@@ -1082,6 +1132,8 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(tface && tface->tpage)
render_realtime_texture(shi, tface->tpage);
}
+
+
}
shi->dupliuv[0]= -1.0f + 2.0f*obi->dupliuv[0];
@@ -1111,24 +1163,6 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->orn[2]= -shi->vn[2];
}
- if(mode & MA_RADIO) {
- float *r1, *r2, *r3;
-
- r1= RE_vertren_get_rad(obr, v1, 0);
- r2= RE_vertren_get_rad(obr, v2, 0);
- r3= RE_vertren_get_rad(obr, v3, 0);
-
- if(r1 && r2 && r3) {
- shi->rad[0]= (l*r3[0] - u*r1[0] - v*r2[0]);
- shi->rad[1]= (l*r3[1] - u*r1[1] - v*r2[1]);
- shi->rad[2]= (l*r3[2] - u*r1[2] - v*r2[2]);
- }
- else
- shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
- }
- else
- shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
-
if(texco & TEXCO_REFL) {
/* mirror reflection color textures (and envmap) */
calc_R_ref(shi); /* wrong location for normal maps! XXXXXXXXXXXXXX */
@@ -1156,8 +1190,6 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
}
- else
- shi->rad[0]= shi->rad[1]= shi->rad[2]= 0.0f;
/* this only avalailable for scanline renders */
if(shi->depth==0) {
@@ -1240,6 +1272,12 @@ void shade_input_set_shade_texco(ShadeInput *shi)
} /* else {
Note! For raytracing winco is not set, important because thus means all shader input's need to have their variables set to zero else in-initialized values are used
*/
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
+ color_manage_linearize(shi->vcol, shi->vcol);
+ }
+ }
+
}
/* ****************** ShadeSample ************************************** */
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 130cda9f107..5e523199755 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -30,7 +30,7 @@
#include <math.h>
#include <string.h>
-#include "MTC_matrixops.h"
+
#include "BLI_arithb.h"
#include "BKE_colortools.h"
@@ -58,15 +58,17 @@
extern struct Render R;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-static ListBase *get_lights(ShadeInput *shi)
+ListBase *get_lights(ShadeInput *shi)
{
+ if(R.r.scemode & R_PREVIEWBUTS)
+ return &R.lights;
if(shi->light_override)
return &shi->light_override->gobject;
- else if(shi->mat && shi->mat->group)
+ if(shi->mat && shi->mat->group)
return &shi->mat->group->gobject;
- else
- return &R.lights;
+
+ return &R.lights;
}
#if 0
@@ -166,7 +168,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
p1[0]= shi->co[0]-lar->co[0];
p1[1]= shi->co[1]-lar->co[1];
p1[2]= -lar->co[2];
- MTC_Mat3MulVecfl(lar->imat, p1);
+ Mat3MulVecfl(lar->imat, p1);
VECCOPY(npos, p1); // npos is double!
/* pre-scale */
@@ -178,7 +180,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
/* rotate view */
VECCOPY(nray, shi->view);
- MTC_Mat3MulVecd(lar->imat, nray);
+ Mat3MulVecd(lar->imat, nray);
if(R.wrld.mode & WO_MIST) {
/* patchy... */
@@ -1141,7 +1143,7 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
/* rotate view to lampspace */
VECCOPY(lvrot, lv);
- MTC_Mat3MulVecfl(lar->imat, lvrot);
+ Mat3MulVecfl(lar->imat, lvrot);
x= MAX2(fabs(lvrot[0]/lvrot[2]) , fabs(lvrot[1]/lvrot[2]));
/* 1.0f/(sqrt(1+x*x)) is equivalent to cos(atan(x)) */
@@ -1711,7 +1713,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
/* note: shi->mode! */
- if(shi->mode & (MA_ZTRA|MA_RAYTRANSP)) {
+ if(shi->mode & MA_TRANSP) {
if(shi->spectra!=0.0f) {
float t = MAX3(shr->spec[0], shr->spec[1], shr->spec[2]);
t *= shi->spectra;
@@ -1728,11 +1730,12 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shr->combined[1]+= shi->ambg;
shr->combined[2]+= shi->ambb;
+ /* removed
if(shi->combinedflag & SCE_PASS_RADIO) {
shr->combined[0]+= shi->r*shi->amb*shi->rad[0];
shr->combined[1]+= shi->g*shi->amb*shi->rad[1];
shr->combined[2]+= shi->b*shi->amb*shi->rad[2];
- }
+ }*/
/* add AO in combined? */
if(R.wrld.mode & WO_AMB_OCC) {
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 7bb2aef2e6e..29f4d7729fe 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -55,6 +55,7 @@
#include "DNA_material_types.h"
+#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -871,12 +872,17 @@ static void sss_create_tree_mat(Render *re, Material *mat)
re->sss_points= &points;
re->sss_mat= mat;
re->i.partsdone= 0;
- re->result= NULL;
- RE_TileProcessor(re, 0, !(re->r.mode & R_PREVIEWBUTS));
- RE_FreeRenderResult(re->result);
+ if(!(re->r.scemode & R_PREVIEWBUTS))
+ re->result= NULL;
+
+ RE_TileProcessor(re, 0, 1);
+
+ if(!(re->r.scemode & R_PREVIEWBUTS)) {
+ RE_FreeRenderResult(re->result);
+ re->result= rr;
+ }
- re->result= rr;
re->i.partsdone= partsdone;
re->sss_mat= NULL;
re->sss_points= NULL;
@@ -916,7 +922,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
if(!re->test_break(re->tbh)) {
SSSData *sss= MEM_callocN(sizeof(*sss), "SSSData");
float ior= mat->sss_ior, cfac= mat->sss_colfac;
- float *col= mat->sss_col, *radius= mat->sss_radius;
+ float col[3], *radius= mat->sss_radius;
float fw= mat->sss_front, bw= mat->sss_back;
float error = mat->sss_error;
@@ -924,6 +930,9 @@ static void sss_create_tree_mat(Render *re, Material *mat)
if((re->r.scemode & R_PREVIEWBUTS) && error < 0.5f)
error= 0.5f;
+ if (re->r.color_mgt_flag & R_COLOR_MANAGEMENT) color_manage_linearize(col, mat->sss_col);
+ else VECCOPY(col, mat->sss_col);
+
sss->ss[0]= scatter_settings_new(col[0], radius[0], ior, cfac, fw, bw);
sss->ss[1]= scatter_settings_new(col[1], radius[1], ior, cfac, fw, bw);
sss->ss[2]= scatter_settings_new(col[2], radius[2], ior, cfac, fw, bw);
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 3c8c1640b75..d00076a80e8 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -122,14 +122,14 @@ void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint)
spoint->dtstrandco *= 0.5f;
}
else {
- set_four_ipo(t, data, type);
+ key_curve_position_weights(t, data, type);
spoint->co[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
spoint->co[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
spoint->co[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];
spoint->strandco= (1.0f-t)*sseg->v[1]->strandco + t*sseg->v[2]->strandco;
}
- set_afgeleide_four_ipo(t, data, type);
+ key_curve_tangent_weights(t, data, type);
spoint->dtco[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
spoint->dtco[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
spoint->dtco[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];
@@ -234,8 +234,8 @@ void interpolate_shade_result(ShadeResult *shr1, ShadeResult *shr2, float t, Sha
interpolate_vec3(shr1->refl, shr2->refl, t, negt, shr->refl);
if(addpassflag & SCE_PASS_REFRACT)
interpolate_vec3(shr1->refr, shr2->refr, t, negt, shr->refr);
- if(addpassflag & SCE_PASS_RADIO)
- interpolate_vec3(shr1->rad, shr2->rad, t, negt, shr->rad);
+ /* removed if(addpassflag & SCE_PASS_RADIO)
+ interpolate_vec3(shr1->rad, shr2->rad, t, negt, shr->rad);*/
if(addpassflag & SCE_PASS_MIST)
interpolate_vec1(&shr1->mist, &shr2->mist, t, negt, &shr->mist);
}
@@ -281,9 +281,7 @@ void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, Str
shade_input_set_strand_texco(shi, sseg->strand, sseg->v[1], spoint);
/* init material vars */
- // note, keep this synced with render_types.h
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float));
- shi->har= shi->mat->har;
+ shade_input_init_material(shi);
/* shade */
shade_samples_do_AO(ssamp);
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index d9fc075c1c4..f25a167600f 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -30,7 +30,7 @@
#include <string.h>
#include <math.h>
-#include "MTC_matrixops.h"
+
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
@@ -48,6 +48,7 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
+#include "BKE_colortools.h"
#include "BKE_image.h"
#include "BKE_node.h"
#include "BKE_plugin_types.h"
@@ -64,12 +65,16 @@
#include "BKE_ipo.h"
#include "envmap.h"
+#include "pointdensity.h"
+#include "voxeldata.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "rendercore.h"
#include "shading.h"
#include "texture.h"
+#include "renderdatabase.h" /* needed for UV */
+
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
/* only to be used here in this file, it's for speed */
@@ -711,12 +716,12 @@ static float voronoiTex(Tex *tex, float *texvec, TexResult *texres)
/* ------------------------------------------------------------------------- */
-static int evalnodes(Tex *tex, float *texvec, TexResult *texres, short thread, short which_output)
+static int evalnodes(Tex *tex, float *texvec, float *dxt, float *dyt, TexResult *texres, short thread, short which_output)
{
short rv = TEX_INT;
bNodeTree *nodes = tex->nodetree;
- ntreeTexExecTree(nodes, texres, texvec, 0, thread, tex, which_output, R.r.cfra);
+ ntreeTexExecTree(nodes, texres, texvec, dxt, dyt, thread, tex, which_output, R.r.cfra);
if(texres->nor) rv |= TEX_NOR;
rv |= TEX_RGB;
@@ -827,7 +832,7 @@ static int cubemap_glob(float *n, float x, float y, float z, float *adr1, float
else {
VECCOPY(nor, n);
}
- MTC_Mat4Mul3Vecfl(R.viewinv, nor);
+ Mat4Mul3Vecfl(R.viewinv, nor);
x1= fabs(nor[0]);
y1= fabs(nor[1]);
@@ -920,7 +925,7 @@ static int cubemap_ob(Object *ob, float *n, float x, float y, float z, float *ad
if(n==NULL) return 0;
VECCOPY(nor, n);
- if(ob) MTC_Mat4Mul3Vecfl(ob->imat, nor);
+ if(ob) Mat4Mul3Vecfl(ob->imat, nor);
x1= fabs(nor[0]);
y1= fabs(nor[1]);
@@ -983,7 +988,7 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d
if(tex->flag & TEX_REPEAT_XMIR) {
int orig= (int)floor(origf);
- if(orig & 1)
+ if(orig & 1)
fx= 1.0-fx;
}
}
@@ -1076,13 +1081,15 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d
dxt[2]= f1;
dyt[2]= f2;
}
- dxt[0]/= 2.0;
- dxt[1]/= 2.0;
- dxt[2]/= 2.0;
-
- dyt[0]/= 2.0;
- dyt[1]/= 2.0;
- dyt[2]/= 2.0;
+
+ dxt[0] *= 0.5f;
+ dxt[1] *= 0.5f;
+ dxt[2] *= 0.5f;
+
+ dyt[0] *= 0.5f;
+ dyt[1] *= 0.5f;
+ dyt[2] *= 0.5f;
+
}
/* if area, then reacalculate dxt[] and dyt[] */
@@ -1101,13 +1108,16 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d
if(tex->xrepeat>1) {
float origf= fx *= tex->xrepeat;
- if(fx>1.0f) fx -= (int)(fx);
- else if(fx<0.0f) fx+= 1-(int)(fx);
+ // TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call
+ if (tex->texfilter == TXF_BOX) {
+ if(fx>1.0f) fx -= (int)(fx);
+ else if(fx<0.0f) fx+= 1-(int)(fx);
- if(tex->flag & TEX_REPEAT_XMIR) {
- int orig= (int)floor(origf);
- if(orig & 1)
- fx= 1.0f-fx;
+ if(tex->flag & TEX_REPEAT_XMIR) {
+ int orig= (int)floor(origf);
+ if(orig & 1)
+ fx= 1.0f-fx;
+ }
}
max= tex->xrepeat;
@@ -1118,13 +1128,16 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d
if(tex->yrepeat>1) {
float origf= fy *= tex->yrepeat;
- if(fy>1.0f) fy -= (int)(fy);
- else if(fy<0.0f) fy+= 1-(int)(fy);
+ // TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call
+ if (tex->texfilter == TXF_BOX) {
+ if(fy>1.0f) fy -= (int)(fy);
+ else if(fy<0.0f) fy+= 1-(int)(fy);
- if(tex->flag & TEX_REPEAT_YMIR) {
- int orig= (int)floor(origf);
- if(orig & 1)
- fy= 1.0f-fy;
+ if(tex->flag & TEX_REPEAT_YMIR) {
+ int orig= (int)floor(origf);
+ if(orig & 1)
+ fy= 1.0f-fy;
+ }
}
if(max<tex->yrepeat)
@@ -1169,7 +1182,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
texres->talpha= 0; /* is set when image texture returns alpha (considered premul) */
if(tex->use_nodes && tex->nodetree) {
- retval = evalnodes(tex, texvec, texres, thread, which_output);
+ retval = evalnodes(tex, texvec, dxt, dyt, texres, thread, which_output);
}
else
switch(tex->type) {
@@ -1199,7 +1212,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
retval= texnoise(tex, texres);
break;
case TEX_IMAGE:
- if(osatex) retval= imagewraposa(tex, tex->ima, NULL, texvec, dxt, dyt, texres);
+ if(osatex) retval= imagewraposa(tex, tex->ima, NULL, texvec, dxt, dyt, texres);
else retval= imagewrap(tex, tex->ima, NULL, texvec, texres);
tag_image_time(tex->ima); /* tag image as having being used */
break;
@@ -1251,6 +1264,13 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
retval= mg_distNoiseTex(tex, tmpvec, texres);
break;
+ case TEX_POINTDENSITY:
+ retval= pointdensitytex(tex, texvec, texres);
+ break;
+ case TEX_VOXELDATA:
+ retval= voxeldatatex(tex, texvec, texres);
+ break;
+
}
if (tex->flag & TEX_COLORBAND) {
@@ -1261,7 +1281,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
texres->tg= col[1];
texres->tb= col[2];
texres->ta= col[3];
- retval |= 1;
+ retval |= TEX_RGB;
}
}
return retval;
@@ -1435,12 +1455,22 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg
VECCOPY(in, out);
ramp_blend(MA_RAMP_COLOR, in, in+1, in+2, fact, tex);
break;
+ case MTEX_SOFT_LIGHT:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_SOFT, in, in+1, in+2, fact, tex);
+ break;
+ case MTEX_LIN_LIGHT:
+ fact*= facg;
+ VECCOPY(in, out);
+ ramp_blend(MA_RAMP_LINEAR, in, in+1, in+2, fact, tex);
+ break;
}
}
float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip)
{
- float in=0.0, facm, col;
+ float in=0.0, facm, col, scf;
fact*= facg;
facm= 1.0-fact;
@@ -1485,11 +1515,112 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
col= fact*tex;
if(col > out) in= col; else in= out;
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;
+
+ case MTEX_LIN_LIGHT:
+ if (tex > 0.5)
+ in = out + fact*(2*(tex - 0.5));
+ else
+ in = out + fact*(2*tex - 1);
+ break;
}
return in;
}
+static void texco_mapping(ShadeInput* shi, Tex* tex, MTex* mtex, float* co, float* dx, float* dy, float* texvec, float* dxt, float* dyt)
+{
+ // new: first swap coords, then map, then trans/scale
+ if (tex->type == TEX_IMAGE) {
+ // placement
+ texvec[0] = mtex->projx ? co[mtex->projx - 1] : 0.f;
+ texvec[1] = mtex->projy ? co[mtex->projy - 1] : 0.f;
+ texvec[2] = mtex->projz ? co[mtex->projz - 1] : 0.f;
+
+ if (shi->osatex) {
+ if (mtex->projx) {
+ dxt[0] = dx[mtex->projx - 1];
+ dyt[0] = dy[mtex->projx - 1];
+ }
+ else dxt[0] = dyt[0] = 0.f;
+ if (mtex->projy) {
+ dxt[1] = dx[mtex->projy - 1];
+ dyt[1] = dy[mtex->projy - 1];
+ }
+ else dxt[1] = dyt[1] = 0.f;
+ if (mtex->projz) {
+ dxt[2] = dx[mtex->projz - 1];
+ dyt[2] = dy[mtex->projz - 1];
+ }
+ else dxt[2] = dyt[2] = 0.f;
+ }
+ do_2d_mapping(mtex, texvec, shi->vlr, shi->facenor, dxt, dyt);
+
+ // translate and scale
+ texvec[0] = mtex->size[0]*(texvec[0] - 0.5f) + mtex->ofs[0] + 0.5f;
+ texvec[1] = mtex->size[1]*(texvec[1] - 0.5f) + mtex->ofs[1] + 0.5f;
+ if (shi->osatex) {
+ dxt[0] = mtex->size[0]*dxt[0];
+ dxt[1] = mtex->size[1]*dxt[1];
+ dyt[0] = mtex->size[0]*dyt[0];
+ dyt[1] = mtex->size[1]*dyt[1];
+ }
+
+ /* problem: repeat-mirror is not a 'repeat' but 'extend' in imagetexture.c */
+ // TXF: bug was here, only modify texvec when repeat mode set, old code affected other modes too.
+ // New texfilters solve mirroring differently so that it also works correctly when
+ // textures are scaled (sizeXYZ) as well as repeated. See also modification in do_2d_mapping().
+ // (since currently only done in osa mode, results will look incorrect without osa TODO)
+ if (tex->extend == TEX_REPEAT && (tex->flag & TEX_REPEAT_XMIR)) {
+ if (tex->texfilter == TXF_BOX)
+ texvec[0] -= floorf(texvec[0]); // this line equivalent to old code, same below
+ else if (texvec[0] < 0.f || texvec[0] > 1.f) {
+ const float tx = 0.5f*texvec[0];
+ texvec[0] = 2.f*(tx - floorf(tx));
+ if (texvec[0] > 1.f) texvec[0] = 2.f - texvec[0];
+ }
+ }
+ if (tex->extend == TEX_REPEAT && (tex->flag & TEX_REPEAT_YMIR)) {
+ if (tex->texfilter == TXF_BOX)
+ texvec[1] -= floorf(texvec[1]);
+ else if (texvec[1] < 0.f || texvec[1] > 1.f) {
+ const float ty = 0.5f*texvec[1];
+ texvec[1] = 2.f*(ty - floorf(ty));
+ if (texvec[1] > 1.f) texvec[1] = 2.f - texvec[1];
+ }
+ }
+
+ }
+ else { // procedural
+ // placement
+ texvec[0] = mtex->size[0]*(mtex->projx ? (co[mtex->projx - 1] + mtex->ofs[0]) : mtex->ofs[0]);
+ texvec[1] = mtex->size[1]*(mtex->projy ? (co[mtex->projy - 1] + mtex->ofs[1]) : mtex->ofs[1]);
+ texvec[2] = mtex->size[2]*(mtex->projz ? (co[mtex->projz - 1] + mtex->ofs[2]) : mtex->ofs[2]);
+
+ if (shi->osatex) {
+ if (mtex->projx) {
+ dxt[0] = mtex->size[0]*dx[mtex->projx - 1];
+ dyt[0] = mtex->size[0]*dy[mtex->projx - 1];
+ }
+ else dxt[0] = 0.f;
+ if (mtex->projy) {
+ dxt[1] = mtex->size[1]*dx[mtex->projy - 1];
+ dyt[1] = mtex->size[1]*dy[mtex->projy - 1];
+ }
+ else dxt[1] = 0.f;
+ if (mtex->projz) {
+ dxt[2] = mtex->size[2]*dx[mtex->projz - 1];
+ dyt[2] = mtex->size[2]*dy[mtex->projz - 1];
+ }
+ else dxt[2]= 0.f;
+ }
+ }
+}
void do_material_tex(ShadeInput *shi)
{
@@ -1500,10 +1631,12 @@ 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;
if (R.r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
-
+
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
/* separate tex switching */
@@ -1538,13 +1671,13 @@ void do_material_tex(ShadeInput *shi)
VECCOPY(tempvec, shi->co);
if(mtex->texflag & MTEX_OB_DUPLI_ORIG)
if(shi->obi && shi->obi->duplitexmat)
- MTC_Mat4MulVecfl(shi->obi->duplitexmat, tempvec);
- MTC_Mat4MulVecfl(ob->imat, tempvec);
+ Mat4MulVecfl(shi->obi->duplitexmat, tempvec);
+ Mat4MulVecfl(ob->imat, tempvec);
if(shi->osatex) {
VECCOPY(dxt, shi->dxco);
VECCOPY(dyt, shi->dyco);
- MTC_Mat4Mul3Vecfl(ob->imat, dxt);
- MTC_Mat4Mul3Vecfl(ob->imat, dyt);
+ Mat4Mul3Vecfl(ob->imat, dxt);
+ Mat4Mul3Vecfl(ob->imat, dyt);
}
}
else {
@@ -1573,7 +1706,7 @@ void do_material_tex(ShadeInput *shi)
}
else {
ShadeInputUV *suv= &shi->uv[shi->actuv];
- int i;
+ int i = shi->actuv;
if(mtex->uvname[0] != 0) {
for(i = 0; i < shi->totuv; i++) {
@@ -1587,6 +1720,47 @@ void do_material_tex(ShadeInput *shi)
co= suv->uv;
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..
+ if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob) {
+ if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) {
+ 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);
+
+ 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;
+ }
+ }
+ }
}
}
else if(mtex->texco==TEXCO_WINDOW) {
@@ -1612,7 +1786,7 @@ void do_material_tex(ShadeInput *shi)
}
else continue; // can happen when texco defines disappear and it renders old files
- /* de pointer defines if bumping happens */
+ /* the pointer defines if bumping happens */
if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) {
texres.nor= norvec;
norvec[0]= norvec[1]= norvec[2]= 0.0;
@@ -1623,94 +1797,149 @@ void do_material_tex(ShadeInput *shi)
VECADD(tempvec, co, warpvec);
co= tempvec;
}
-
- if(tex->type==TEX_IMAGE) {
- /* new: first swap coords, then map, then trans/scale */
-
- /* placement */
- if(mtex->projx) texvec[0]= co[mtex->projx-1];
- else texvec[0]= 0.0;
- if(mtex->projy) texvec[1]= co[mtex->projy-1];
- else texvec[1]= 0.0;
- if(mtex->projz) texvec[2]= co[mtex->projz-1];
- else texvec[2]= 0.0;
+ 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];
+ VecOrthoBasisf(nn, nu, nv);
+ nunvdone= 1;
+ }
- if(shi->osatex) {
-
- if(mtex->projx) {
- dxt[0]= dx[mtex->projx-1];
- dyt[0]= dy[mtex->projx-1];
- }
- else dxt[0]= dyt[0]= 0.0f;
-
- if(mtex->projy) {
- dxt[1]= dx[mtex->projy-1];
- dyt[1]= dy[mtex->projy-1];
+ if(texres.nor) {
+ 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->maptoneg & MAP_NORM) ? -mtex->norfac : 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 dxt[1]= dyt[1]= 0.0f;
- if(mtex->projz) {
- dxt[2]= dx[mtex->projz-1];
- dyt[2]= dy[mtex->projz-1];
+ 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]);
+ }
}
- else dxt[2]= dyt[2]= 0.0;
- }
-
- do_2d_mapping(mtex, texvec, shi->vlr, shi->facenor, dxt, dyt);
- /* translate and scale */
- texvec[0]= mtex->size[0]*(texvec[0]-0.5) +mtex->ofs[0]+0.5;
- texvec[1]= mtex->size[1]*(texvec[1]-0.5) +mtex->ofs[1]+0.5;
- if(shi->osatex) {
- dxt[0]= mtex->size[0]*dxt[0];
- dxt[1]= mtex->size[1]*dxt[1];
- dyt[0]= mtex->size[0]*dyt[0];
- dyt[1]= mtex->size[1]*dyt[1];
- }
-
- /* problem: repeat-mirror is not a 'repeat' but 'extend' in imagetexture.c */
- if(tex->flag & TEX_REPEAT_XMIR) {
- if(texvec[0]>1.0f) texvec[0] -= (int)(texvec[0]);
- else if(texvec[0]<0.0f) texvec[0]+= 1-(int)(texvec[0]);
- }
- if(tex->flag & TEX_REPEAT_YMIR) {
- if(texvec[1]>1.0f) texvec[1] -= (int)(texvec[1]);
- else if(texvec[1]<0.0f) texvec[1]+= 1-(int)(texvec[1]);
- }
-
- }
- else {
-
- /* placement */
- if(mtex->projx) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
- else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
+ // center, main return value
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+ rgbnor = multitex(tex, texvec, dxt, dyt, shi->osatex, &texres, shi->thread, mtex->which_output);
+ 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-6f) ? 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(tex, texv, dxt, dyt, shi->osatex, &ttexr, shi->thread, mtex->which_output);
+ 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(tex, texv, dxt, dyt, shi->osatex, &ttexr, shi->thread, mtex->which_output);
+ 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]};
- if(mtex->projy) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
- else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
+ idu = (du < 1e-6f) ? bf : (bf/du);
+ idv = (dv < 1e-6f) ? bf : (bf/dv);
- if(mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
- else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
+ if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
+ Mat4Mul3Vecfl(shi->obr->ob->imat, tu);
+ Mat4Mul3Vecfl(shi->obr->ob->imat, tv);
+ Normalize(tu);
+ Normalize(tv);
+ }
+ else if (mtex->texco == TEXCO_GLOB) {
+ Mat4Mul3Vecfl(R.viewinv, tu);
+ Mat4Mul3Vecfl(R.viewinv, tv);
+ }
+ else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
+ Mat4Mul3Vecfl(mtex->object->imat, tu);
+ Mat4Mul3Vecfl(mtex->object->imat, tv);
+ Normalize(tu);
+ Normalize(tv);
+ }
- if(shi->osatex) {
- if(mtex->projx) {
- dxt[0]= mtex->size[0]*dx[mtex->projx-1];
- dyt[0]= mtex->size[0]*dy[mtex->projx-1];
+ // +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(tex, texv, dxt, dyt, shi->osatex, &ttexr, shi->thread, mtex->which_output);
+ 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(tex, texv, dxt, dyt, shi->osatex, &ttexr, shi->thread, mtex->which_output);
+ vd = idv*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
}
- else dxt[0]= 0.0;
- if(mtex->projy) {
- dxt[1]= mtex->size[1]*dx[mtex->projy-1];
- dyt[1]= mtex->size[1]*dy[mtex->projy-1];
- }
- else dxt[1]= 0.0;
- if(mtex->projz) {
- dxt[2]= mtex->size[2]*dx[mtex->projz-1];
- dyt[2]= mtex->size[2]*dy[mtex->projz-1];
- }
- else dxt[2]= 0.0;
+
+ // 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];
+ Crossf(nvec, nu, nv);
+
+ nvec[0] = -nvec[0];
+ nvec[1] = -nvec[1];
+ nvec[2] = -nvec[2];
+ texres.nor = nvec;
+ rgbnor |= TEX_NOR;
+ }
+ else {
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+ rgbnor = multitex(tex, texvec, dxt, dyt, shi->osatex, &texres, shi->thread, mtex->which_output);
}
}
-
- rgbnor= multitex(tex, texvec, dxt, dyt, shi->osatex, &texres, shi->thread, mtex->which_output);
+ else {
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+ rgbnor = multitex(tex, texvec, dxt, dyt, shi->osatex, &texres, shi->thread, mtex->which_output);
+ }
/* texture output */
@@ -1776,7 +2005,7 @@ void do_material_tex(ShadeInput *shi)
if(mtex->texflag & MTEX_VIEWSPACE) {
// rotate to global coords
if(mtex->texco==TEXCO_ORCO || mtex->texco==TEXCO_UV) {
- if(shi->vlr && shi->obr->ob) {
+ if(shi->vlr && shi->obr && shi->obr->ob) {
float len= Normalize(texres.nor);
// can be optimized... (ton)
Mat4Mul3Vecfl(shi->obr->ob->obmat, texres.nor);
@@ -1808,6 +2037,11 @@ void do_material_tex(ShadeInput *shi)
}
else texres.tin= texres.ta;
+ /* inverse gamma correction */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(tcol, tcol);
+ }
+
if(mtex->mapto & MAP_COL) {
texture_rgb_blend(&shi->r, tcol, &shi->r, texres.tin, colfac, mtex->blendtype);
}
@@ -1883,25 +2117,32 @@ void do_material_tex(ShadeInput *shi)
}
}
else {
- float nor[3], dot;
-
- if(shi->mat->mode & MA_TANGENT_V) {
- shi->tang[0]+= Tnor*tex->norfac*texres.nor[0];
- shi->tang[1]+= Tnor*tex->norfac*texres.nor[1];
- shi->tang[2]+= Tnor*tex->norfac*texres.nor[2];
+ if (mtex->texflag & MTEX_NEW_BUMP) {
+ shi->vn[0] = texres.nor[0];
+ shi->vn[1] = texres.nor[1];
+ shi->vn[2] = texres.nor[2];
}
-
- /* prevent bump to become negative normal */
- nor[0]= Tnor*tex->norfac*texres.nor[0];
- nor[1]= Tnor*tex->norfac*texres.nor[1];
- nor[2]= Tnor*tex->norfac*texres.nor[2];
-
- dot= 0.5f + 0.5f*INPR(nor, shi->vn);
-
- shi->vn[0]+= dot*nor[0];
- shi->vn[1]+= dot*nor[1];
- shi->vn[2]+= dot*nor[2];
- }
+ else {
+ float nor[3], dot;
+
+ if(shi->mat->mode & MA_TANGENT_V) {
+ shi->tang[0]+= Tnor*tex->norfac*texres.nor[0];
+ shi->tang[1]+= Tnor*tex->norfac*texres.nor[1];
+ shi->tang[2]+= Tnor*tex->norfac*texres.nor[2];
+ }
+
+ /* prevent bump to become negative normal */
+ nor[0]= Tnor*tex->norfac*texres.nor[0];
+ nor[1]= Tnor*tex->norfac*texres.nor[1];
+ nor[2]= Tnor*tex->norfac*texres.nor[2];
+
+ dot= 0.5f + 0.5f*INPR(nor, shi->vn);
+
+ shi->vn[0]+= dot*nor[0];
+ shi->vn[1]+= dot*nor[1];
+ shi->vn[2]+= dot*nor[2];
+ }
+ }
Normalize(shi->vn);
/* this makes sure the bump is passed on to the next texture */
@@ -2039,6 +2280,187 @@ void do_material_tex(ShadeInput *shi)
}
}
+
+void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val)
+{
+ MTex *mtex;
+ Tex *tex;
+ TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
+ int tex_nr, rgbnor= 0;
+ float co[3], texvec[3];
+ float fact, stencilTin=1.0;
+
+ if (R.r.scemode & R_NO_TEX) return;
+ /* here: test flag if there's a tex (todo) */
+
+ for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
+ /* separate tex switching */
+ if(shi->mat->septex & (1<<tex_nr)) continue;
+
+ if(shi->mat->mtex[tex_nr]) {
+ mtex= shi->mat->mtex[tex_nr];
+ tex= mtex->tex;
+ if(tex==0) continue;
+
+ /* only process if this texture is mapped
+ * to one that we're interested in */
+ if (!(mtex->mapto & mapto_flag)) continue;
+
+ /* 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) {
+ if(shi->obi && shi->obi->duplitexmat)
+ Mat4MulVecfl(shi->obi->duplitexmat, co);
+ }
+ Mat4MulVecfl(ob->imat, co);
+ }
+ }
+ /* not really orco, but 'local' */
+ else if(mtex->texco==TEXCO_ORCO) {
+
+ if(mtex->texflag & MTEX_DUPLI_MAPTO) {
+ VECCOPY(co, shi->duplilo);
+ }
+ else {
+ Object *ob= shi->obi->ob;
+ VECCOPY(co, xyz);
+ Mat4MulVecfl(ob->imat, co);
+ }
+ }
+ else if(mtex->texco==TEXCO_GLOB) {
+ VECCOPY(co, xyz);
+ Mat4MulVecfl(R.viewinv, co);
+ }
+ else continue; // can happen when texco defines disappear and it renders old files
+
+ texres.nor= NULL;
+
+ if(tex->type==TEX_IMAGE) {
+ continue; /* not supported yet */
+ //do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
+ }
+ else {
+ /* placement */
+ if(mtex->projx) texvec[0]= mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
+ else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
+
+ if(mtex->projy) texvec[1]= mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
+ else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
+
+ if(mtex->projz) texvec[2]= mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
+ else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
+ }
+
+ rgbnor= multitex(tex, texvec, NULL, NULL, 0, &texres, 0, mtex->which_output); /* NULL = dxt/dyt, 0 = shi->osatex - not supported */
+
+ /* texture output */
+
+ if( (rgbnor & TEX_RGB) && (mtex->texflag & MTEX_RGBTOINT)) {
+ texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
+ rgbnor-= TEX_RGB;
+ }
+ if(mtex->texflag & MTEX_NEGATIVE) {
+ if(rgbnor & TEX_RGB) {
+ texres.tr= 1.0-texres.tr;
+ texres.tg= 1.0-texres.tg;
+ texres.tb= 1.0-texres.tb;
+ }
+ texres.tin= 1.0-texres.tin;
+ }
+ if(mtex->texflag & MTEX_STENCIL) {
+ if(rgbnor & TEX_RGB) {
+ fact= texres.ta;
+ texres.ta*= stencilTin;
+ stencilTin*= fact;
+ }
+ else {
+ fact= texres.tin;
+ texres.tin*= stencilTin;
+ stencilTin*= fact;
+ }
+ }
+
+
+ if((mapto_flag & (MAP_EMISSION_COL+MAP_ABSORPTION_COL)) && (mtex->mapto & (MAP_EMISSION_COL+MAP_ABSORPTION_COL))) {
+ float tcol[3], colfac;
+
+ /* stencil maps on the texture control slider, not texture intensity value */
+ colfac= mtex->colfac*stencilTin;
+
+ if((rgbnor & TEX_RGB)==0) {
+ tcol[0]= mtex->r;
+ tcol[1]= mtex->g;
+ tcol[2]= mtex->b;
+ } else {
+ tcol[0]=texres.tr;
+ tcol[1]=texres.tg;
+ tcol[2]=texres.tb;
+ if(texres.talpha)
+ texres.tin= texres.ta;
+ }
+
+ /* inverse gamma correction */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(tcol, tcol);
+ }
+
+ /* used for emit */
+ if((mapto_flag & MAP_EMISSION_COL) && (mtex->mapto & MAP_EMISSION_COL)) {
+ texture_rgb_blend(col, tcol, col, texres.tin, colfac, mtex->blendtype);
+ }
+
+ /* MAP_COLMIR is abused for absorption colour at the moment */
+ if((mapto_flag & MAP_ABSORPTION_COL) && (mtex->mapto & MAP_ABSORPTION_COL)) {
+ texture_rgb_blend(col, tcol, col, texres.tin, colfac, mtex->blendtype);
+ }
+ }
+
+ if((mapto_flag & MAP_VARS) && (mtex->mapto & MAP_VARS)) {
+ /* stencil maps on the texture control slider, not texture intensity value */
+ float varfac= mtex->varfac*stencilTin;
+
+ /* convert RGB to intensity if intensity info isn't provided */
+ if (!(rgbnor & TEX_INT)) {
+ if (rgbnor & TEX_RGB) {
+ if(texres.talpha) texres.tin= texres.ta;
+ else texres.tin= (0.35*texres.tr+0.45*texres.tg+0.2*texres.tb);
+ }
+ }
+
+ if((mapto_flag & MAP_EMISSION) && (mtex->mapto & MAP_EMISSION)) {
+ int flip= mtex->maptoneg & MAP_EMISSION;
+
+ *val = texture_value_blend(mtex->def_var, *val, texres.tin, varfac, mtex->blendtype, flip);
+ if(*val<0.0) *val= 0.0;
+ }
+ if((mapto_flag & MAP_DENSITY) && (mtex->mapto & MAP_DENSITY)) {
+ int flip= mtex->maptoneg & MAP_DENSITY;
+
+ *val = texture_value_blend(mtex->def_var, *val, texres.tin, varfac, mtex->blendtype, flip);
+ CLAMP(*val, 0.0, 1.0);
+ }
+ if((mapto_flag & MAP_ABSORPTION) && (mtex->mapto & MAP_ABSORPTION)) {
+ int flip= mtex->maptoneg & MAP_ABSORPTION;
+
+ *val = texture_value_blend(mtex->def_var, *val, texres.tin, varfac, mtex->blendtype, flip);
+ CLAMP(*val, 0.0, 1.0);
+ }
+ if((mapto_flag & MAP_SCATTERING) && (mtex->mapto & MAP_SCATTERING)) {
+ int flip= mtex->maptoneg & MAP_SCATTERING;
+
+ *val = texture_value_blend(mtex->def_var, *val, texres.tin, varfac, mtex->blendtype, flip);
+ CLAMP(*val, 0.0, 1.0);
+ }
+ }
+ }
+ }
+}
+
+
/* ------------------------------------------------------------------------- */
void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
@@ -2127,6 +2549,11 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
}
else texres.tin= texres.ta;
+ /* inverse gamma correction */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(&texres.tr, &texres.tr);
+ }
+
fact= texres.tin*mtex->colfac;
facm= 1.0-fact;
@@ -2235,7 +2662,7 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
case TEXCO_OBJECT:
if(mtex->object) {
VECCOPY(tempvec, lo);
- MTC_Mat4MulVecfl(mtex->object->imat, tempvec);
+ Mat4MulVecfl(mtex->object->imat, tempvec);
co= tempvec;
}
break;
@@ -2243,16 +2670,16 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
case TEXCO_GLOB:
if(rco) {
VECCOPY(tempvec, rco);
- MTC_Mat4MulVecfl(R.viewinv, tempvec);
+ Mat4MulVecfl(R.viewinv, tempvec);
co= tempvec;
}
else
co= lo;
// VECCOPY(shi->dxgl, shi->dxco);
-// MTC_Mat3MulVecfl(R.imat, shi->dxco);
+// Mat3MulVecfl(R.imat, shi->dxco);
// VECCOPY(shi->dygl, shi->dyco);
-// MTC_Mat3MulVecfl(R.imat, shi->dyco);
+// Mat3MulVecfl(R.imat, shi->dyco);
break;
}
@@ -2314,6 +2741,11 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
tcol[0]= texres.tr; tcol[1]= texres.tg; tcol[2]= texres.tb;
+ /* inverse gamma correction */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(tcol, tcol);
+ }
+
if(mtex->mapto & WOMAP_HORIZ) {
texture_rgb_blend(hor, tcol, hor, texres.tin, mtex->colfac, mtex->blendtype);
}
@@ -2352,7 +2784,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3];
- int tex_nr, rgb= 0;
+ int i, tex_nr, rgb= 0;
if (R.r.scemode & R_NO_TEX) return;
tex_nr= 0;
@@ -2374,12 +2806,12 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
dx= dxt;
dy= dyt;
VECCOPY(tempvec, shi->co);
- MTC_Mat4MulVecfl(ob->imat, tempvec);
+ Mat4MulVecfl(ob->imat, tempvec);
if(shi->osatex) {
VECCOPY(dxt, shi->dxco);
VECCOPY(dyt, shi->dyco);
- MTC_Mat4Mul3Vecfl(ob->imat, dxt);
- MTC_Mat4Mul3Vecfl(ob->imat, dyt);
+ Mat4Mul3Vecfl(ob->imat, dxt);
+ Mat4Mul3Vecfl(ob->imat, dyt);
}
}
else {
@@ -2390,12 +2822,12 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
else if(mtex->texco==TEXCO_GLOB) {
co= shi->gl; dx= shi->dxco; dy= shi->dyco;
VECCOPY(shi->gl, shi->co);
- MTC_Mat4MulVecfl(R.viewinv, shi->gl);
+ Mat4MulVecfl(R.viewinv, shi->gl);
}
else if(mtex->texco==TEXCO_VIEW) {
VECCOPY(tempvec, lavec);
- MTC_Mat3MulVecfl(la->imat, tempvec);
+ Mat3MulVecfl(la->imat, tempvec);
if(la->type==LA_SPOT) {
tempvec[0]*= la->spottexfac;
@@ -2408,8 +2840,8 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
VECCOPY(dxt, shi->dxlv);
VECCOPY(dyt, shi->dylv);
/* need some matrix conversion here? la->imat is a [3][3] matrix!!! **/
- MTC_Mat3MulVecfl(la->imat, dxt);
- MTC_Mat3MulVecfl(la->imat, dyt);
+ Mat3MulVecfl(la->imat, dxt);
+ Mat3MulVecfl(la->imat, dyt);
VecMulf(dxt, la->spottexfac);
VecMulf(dyt, la->spottexfac);
@@ -2428,21 +2860,33 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
if(shi->osatex) {
- if(mtex->projx) {
- dxt[0]= mtex->size[0]*dx[mtex->projx-1];
- dyt[0]= mtex->size[0]*dy[mtex->projx-1];
- }
- else dxt[0]= 0.0;
- if(mtex->projy) {
- dxt[1]= mtex->size[1]*dx[mtex->projy-1];
- dyt[1]= mtex->size[1]*dy[mtex->projy-1];
- }
- else dxt[1]= 0.0;
- if(mtex->projx) {
- dxt[2]= mtex->size[2]*dx[mtex->projz-1];
- dyt[2]= mtex->size[2]*dy[mtex->projz-1];
+ if (!dx) {
+ for(i=0;i<2;i++) {
+ dxt[i] = dyt[i] = 0.0;
+ }
+ } else {
+ if(mtex->projx) {
+ dxt[0]= mtex->size[0]*dx[mtex->projx-1];
+ dyt[0]= mtex->size[0]*dy[mtex->projx-1];
+ } else {
+ dxt[0]= 0.0;
+ dyt[0]= 0.0;
+ }
+ if(mtex->projy) {
+ dxt[1]= mtex->size[1]*dx[mtex->projy-1];
+ dyt[1]= mtex->size[1]*dy[mtex->projy-1];
+ } else {
+ dxt[1]= 0.0;
+ dyt[1]= 0.0;
+ }
+ if(mtex->projz) {
+ dxt[2]= mtex->size[2]*dx[mtex->projz-1];
+ dyt[2]= mtex->size[2]*dy[mtex->projz-1];
+ } else {
+ dxt[2]= 0.0;
+ dyt[2]= 0.0;
+ }
}
- else dxt[2]= 0.0;
}
/* texture */
@@ -2496,6 +2940,11 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
}
else texres.tin= texres.ta;
+ /* inverse gamma correction */
+ if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ color_manage_linearize(&texres.tr, &texres.tr);
+ }
+
/* lamp colors were premultiplied with this */
col[0]= texres.tr*la->energy;
col[1]= texres.tg*la->energy;
@@ -2599,7 +3048,7 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
texr.nor= NULL;
- if(shi->osatex) imagewraposa(tex, ima, NULL, texvec, dx, dy, &texr);
+ if(shi->osatex) imagewraposa(tex, ima, NULL, texvec, dx, dy, &texr);
else imagewrap(tex, ima, NULL, texvec, &texr);
shi->vcol[0]*= texr.tr;
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
new file mode 100644
index 00000000000..15d8643fea4
--- /dev/null
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -0,0 +1,746 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_threads.h"
+#include "BLI_voxel.h"
+
+#include "PIL_time.h"
+
+#include "RE_shader_ext.h"
+#include "RE_raytrace.h"
+
+#include "DNA_material_types.h"
+
+#include "render_types.h"
+#include "renderdatabase.h"
+#include "volumetric.h"
+#include "volume_precache.h"
+
+#if defined( _MSC_VER ) && !defined( __cplusplus )
+# define inline __inline
+#endif // defined( _MSC_VER ) && !defined( __cplusplus )
+
+#include "BKE_global.h"
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
+/* only to be used here in this file, it's for speed */
+extern struct Render R;
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* *** utility code to set up an individual raytree for objectinstance, for checking inside/outside *** */
+
+/* Recursive test for intersections, from a point inside the mesh, to outside
+ * Number of intersections (depth) determine if a point is inside or outside the mesh */
+int intersect_outside_volume(RayTree *tree, Isect *isect, float *offset, int limit, int depth)
+{
+ if (limit == 0) return depth;
+
+ if (RE_ray_tree_intersect(tree, isect)) {
+ float hitco[3];
+
+ 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];
+ VecAddf(isect->start, hitco, offset);
+
+ return intersect_outside_volume(tree, isect, offset, limit-1, depth+1);
+ } else {
+ return depth;
+ }
+}
+
+/* Uses ray tracing to check if a point is inside or outside an ObjectInstanceRen */
+int point_inside_obi(RayTree *tree, ObjectInstanceRen *obi, float *co)
+{
+ float maxsize = RE_ray_tree_max_size(tree);
+ Isect isect;
+ float vec[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);
+ isect.end[0] = co[0] + vec[0] * maxsize;
+ isect.end[1] = co[1] + vec[1] * maxsize;
+ isect.end[2] = co[2] + vec[2] * maxsize;
+
+ /* and give it a little offset to prevent self-intersections */
+ VecMulf(vec, 1e-5);
+ VecAddf(isect.start, isect.start, vec);
+
+ isect.mode= RE_RAY_MIRROR;
+ isect.face_last= NULL;
+ isect.lay= -1;
+
+ final_depth = intersect_outside_volume(tree, &isect, vec, limit, depth);
+
+ /* even number of intersections: point is outside
+ * odd number: point is inside */
+ if (final_depth % 2 == 0) return 0;
+ else return 1;
+}
+
+static int inside_check_func(Isect *is, int ob, RayFace *face)
+{
+ return 1;
+}
+static void vlr_face_coords(RayFace *face, float **v1, float **v2, float **v3, float **v4)
+{
+ VlakRen *vlr= (VlakRen*)face;
+
+ *v1 = (vlr->v1)? vlr->v1->co: NULL;
+ *v2 = (vlr->v2)? vlr->v2->co: NULL;
+ *v3 = (vlr->v3)? vlr->v3->co: NULL;
+ *v4 = (vlr->v4)? vlr->v4->co: NULL;
+}
+
+RayTree *create_raytree_obi(ObjectInstanceRen *obi, float *bbmin, float *bbmax)
+{
+ int v;
+ VlakRen *vlr= NULL;
+
+ /* create empty raytree */
+ RayTree *tree = RE_ray_tree_create(64, obi->obr->totvlak, bbmin, bbmax,
+ vlr_face_coords, inside_check_func, NULL, NULL);
+
+ /* fill it with faces */
+ for(v=0; v<obi->obr->totvlak; v++) {
+ if((v & 255)==0)
+ vlr= obi->obr->vlaknodes[v>>8].vlak;
+ else
+ vlr++;
+
+ RE_ray_tree_add_face(tree, 0, vlr);
+ }
+
+ RE_ray_tree_done(tree);
+
+ return tree;
+}
+
+/* *** light cache filtering *** */
+
+static float get_avg_surrounds(float *cache, int *res, int xx, int yy, int zz)
+{
+ int x, y, z, x_, y_, z_;
+ int added=0;
+ float tot=0.0f;
+
+ for (z=-1; z <= 1; z++) {
+ z_ = zz+z;
+ if (z_ >= 0 && z_ <= res[2]-1) {
+
+ for (y=-1; y <= 1; y++) {
+ y_ = yy+y;
+ if (y_ >= 0 && y_ <= res[1]-1) {
+
+ for (x=-1; x <= 1; x++) {
+ x_ = xx+x;
+ if (x_ >= 0 && x_ <= res[0]-1) {
+
+ if (cache[ V_I(x_, y_, z_, res) ] > 0.0f) {
+ tot += cache[ V_I(x_, y_, z_, res) ];
+ added++;
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ tot /= added;
+
+ return ((added>0)?tot:0.0f);
+}
+
+/* function to filter the edges of the light cache, where there was no volume originally.
+ * For each voxel which was originally external to the mesh, it finds the average values of
+ * the surrounding internal voxels and sets the original external voxel to that average amount.
+ * Works almost a bit like a 'dilate' filter */
+static void lightcache_filter(VolumePrecache *vp)
+{
+ int x, y, z;
+
+ for (z=0; z < vp->res[2]; z++) {
+ for (y=0; y < vp->res[1]; y++) {
+ for (x=0; x < vp->res[0]; x++) {
+ /* trigger for outside mesh */
+ if (vp->data_r[ V_I(x, y, z, vp->res) ] < -0.5f)
+ vp->data_r[ V_I(x, y, z, vp->res) ] = get_avg_surrounds(vp->data_r, vp->res, x, y, z);
+ if (vp->data_g[ V_I(x, y, z, vp->res) ] < -0.5f)
+ vp->data_g[ V_I(x, y, z, vp->res) ] = get_avg_surrounds(vp->data_g, vp->res, x, y, z);
+ if (vp->data_b[ V_I(x, y, z, vp->res) ] < -0.5f)
+ vp->data_b[ V_I(x, y, z, vp->res) ] = get_avg_surrounds(vp->data_b, vp->res, x, y, z);
+ }
+ }
+ }
+}
+
+static inline int ms_I(int x, int y, int z, int *n) //has a pad of 1 voxel surrounding the core for boundary simulation
+{
+ return z*(n[1]+2)*(n[0]+2) + y*(n[0]+2) + x;
+}
+
+
+/* *** multiple scattering approximation *** */
+
+/* get the total amount of light energy in the light cache. used to normalise after multiple scattering */
+static float total_ss_energy(VolumePrecache *vp)
+{
+ int x, y, z;
+ int *res = vp->res;
+ float energy=0.f;
+
+ for (z=0; z < res[2]; z++) {
+ for (y=0; y < res[1]; y++) {
+ for (x=0; x < res[0]; x++) {
+ if (vp->data_r[ V_I(x, y, z, res) ] > 0.f) energy += vp->data_r[ V_I(x, y, z, res) ];
+ if (vp->data_g[ V_I(x, y, z, res) ] > 0.f) energy += vp->data_g[ V_I(x, y, z, res) ];
+ if (vp->data_b[ V_I(x, y, z, res) ] > 0.f) energy += vp->data_b[ V_I(x, y, z, res) ];
+ }
+ }
+ }
+
+ return energy;
+}
+
+static float total_ms_energy(float *sr, float *sg, float *sb, int *res)
+{
+ int x, y, z, i;
+ float energy=0.f;
+
+ for (z=1;z<=res[2];z++) {
+ for (y=1;y<=res[1];y++) {
+ for (x=1;x<=res[0];x++) {
+
+ i = ms_I(x,y,z,res);
+ if (sr[i] > 0.f) energy += sr[i];
+ if (sg[i] > 0.f) energy += sg[i];
+ if (sb[i] > 0.f) energy += sb[i];
+ }
+ }
+ }
+
+ return energy;
+}
+
+static void ms_diffuse(int b, float* x0, float* x, float diff, int *n)
+{
+ int i, j, k, l;
+ const float dt = VOL_MS_TIMESTEP;
+ const float a = dt*diff*n[0]*n[1]*n[2];
+
+ for (l=0; l<20; l++)
+ {
+ for (k=1; k<=n[2]; k++)
+ {
+ for (j=1; j<=n[1]; j++)
+ {
+ for (i=1; i<=n[0]; i++)
+ {
+ x[ms_I(i,j,k,n)] = (x0[ms_I(i,j,k,n)] + a*(
+ x[ms_I(i-1,j,k,n)]+x[ms_I(i+1,j,k,n)]+
+ x[ms_I(i,j-1,k,n)]+x[ms_I(i,j+1,k,n)]+
+ x[ms_I(i,j,k-1,n)]+x[ms_I(i,j,k+1,n)]))/(1+6*a);
+ }
+ }
+ }
+ }
+}
+
+void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Material *ma)
+{
+ const float diff = ma->vol.ms_diff * 0.001f; /* compensate for scaling for a nicer UI range */
+ const float simframes = ma->vol.ms_steps;
+ const int shade_type = ma->vol.shade_type;
+ float fac = ma->vol.ms_intensity;
+
+ int x, y, z, m;
+ int *n = vp->res;
+ const int size = (n[0]+2)*(n[1]+2)*(n[2]+2);
+ double time, lasttime= PIL_check_seconds_timer();
+ float total;
+ float c=1.0f;
+ int i;
+ float origf; /* factor for blending in original light cache */
+ float energy_ss, energy_ms;
+
+ float *sr0=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+ float *sr=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+ float *sg0=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+ float *sg=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+ float *sb0=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+ float *sb=(float *)MEM_callocN(size*sizeof(float), "temporary multiple scattering buffer");
+
+ total = (float)(n[0]*n[1]*n[2]*simframes);
+
+ energy_ss = total_ss_energy(vp);
+
+ /* Scattering as diffusion pass */
+ for (m=0; m<simframes; m++)
+ {
+ /* add sources */
+ for (z=1; z<=n[2]; z++)
+ {
+ for (y=1; y<=n[1]; y++)
+ {
+ for (x=1; x<=n[0]; x++)
+ {
+ i = V_I((x-1), (y-1), (z-1), n);
+ time= PIL_check_seconds_timer();
+ c++;
+
+ if (vp->data_r[i] > 0.f)
+ sr[ms_I(x,y,z,n)] += vp->data_r[i];
+ if (vp->data_g[i] > 0.f)
+ sg[ms_I(x,y,z,n)] += vp->data_g[i];
+ if (vp->data_b[i] > 0.f)
+ sb[ms_I(x,y,z,n)] += vp->data_b[i];
+
+ /* Displays progress every second */
+ if(time-lasttime>1.0f) {
+ char str[64];
+ sprintf(str, "Simulating multiple scattering: %d%%", (int)
+ (100.0f * (c / total)));
+ re->i.infostr= str;
+ re->stats_draw(re->sdh, &re->i);
+ re->i.infostr= NULL;
+ lasttime= time;
+ }
+ }
+ }
+ }
+ SWAP(float *, sr, sr0);
+ SWAP(float *, sg, sg0);
+ SWAP(float *, sb, sb0);
+
+ /* main diffusion simulation */
+ ms_diffuse(0, sr0, sr, diff, n);
+ ms_diffuse(0, sg0, sg, diff, n);
+ ms_diffuse(0, sb0, sb, diff, n);
+
+ if (re->test_break(re->tbh)) break;
+ }
+
+ /* normalisation factor to conserve energy */
+ energy_ms = total_ms_energy(sr, sg, sb, n);
+ fac *= (energy_ss / energy_ms);
+
+ /* blend multiple scattering back in the light cache */
+ if (shade_type == MA_VOL_SHADE_SINGLEPLUSMULTIPLE) {
+ /* conserve energy - half single, half multiple */
+ origf = 0.5f;
+ fac *= 0.5f;
+ } else {
+ origf = 0.0f;
+ }
+
+ for (z=1;z<=n[2];z++)
+ {
+ for (y=1;y<=n[1];y++)
+ {
+ for (x=1;x<=n[0];x++)
+ {
+ int index=(x-1)*n[1]*n[2] + (y-1)*n[2] + z-1;
+ vp->data_r[index] = origf * vp->data_r[index] + fac * sr[ms_I(x,y,z,n)];
+ vp->data_g[index] = origf * vp->data_g[index] + fac * sg[ms_I(x,y,z,n)];
+ vp->data_b[index] = origf * vp->data_b[index] + fac * sb[ms_I(x,y,z,n)];
+ }
+ }
+ }
+
+ MEM_freeN(sr0);
+ MEM_freeN(sr);
+ MEM_freeN(sg0);
+ MEM_freeN(sg);
+ MEM_freeN(sb0);
+ MEM_freeN(sb);
+}
+
+
+
+#if 0 // debug stuff
+static void *vol_precache_part_test(void *data)
+{
+ VolPrecachePart *pa = data;
+
+ printf("part number: %d \n", pa->num);
+ printf("done: %d \n", pa->done);
+ printf("x min: %d x max: %d \n", pa->minx, pa->maxx);
+ printf("y min: %d y max: %d \n", pa->miny, pa->maxy);
+ printf("z min: %d z max: %d \n", pa->minz, pa->maxz);
+
+ return NULL;
+}
+#endif
+
+/* Iterate over the 3d voxel grid, and fill the voxels with scattering information
+ *
+ * It's stored in memory as 3 big float grids next to each other, one for each RGB channel.
+ * I'm guessing the memory alignment may work out better this way for the purposes
+ * of doing linear interpolation, but I haven't actually tested this theory! :)
+ */
+static void *vol_precache_part(void *data)
+{
+ VolPrecachePart *pa = (VolPrecachePart *)data;
+ ObjectInstanceRen *obi = pa->obi;
+ RayTree *tree = pa->tree;
+ ShadeInput *shi = pa->shi;
+ float density, scatter_col[3] = {0.f, 0.f, 0.f};
+ float co[3];
+ int x, y, z;
+ const int res[3]= {pa->res[0], pa->res[1], pa->res[2]};
+ const float stepsize = vol_get_stepsize(shi, STEPSIZE_VIEW);
+
+ for (z= pa->minz; z < pa->maxz; z++) {
+ co[2] = pa->bbmin[2] + (pa->voxel[2] * (z + 0.5f));
+
+ for (y= pa->miny; y < pa->maxy; y++) {
+ co[1] = pa->bbmin[1] + (pa->voxel[1] * (y + 0.5f));
+
+ for (x=pa->minx; x < pa->maxx; x++) {
+ co[0] = pa->bbmin[0] + (pa->voxel[0] * (x + 0.5f));
+
+ // don't bother if the point is not inside the volume mesh
+ if (!point_inside_obi(tree, obi, co)) {
+ obi->volume_precache->data_r[ V_I(x, y, z, res) ] = -1.0f;
+ obi->volume_precache->data_g[ V_I(x, y, z, res) ] = -1.0f;
+ obi->volume_precache->data_b[ V_I(x, y, z, res) ] = -1.0f;
+ continue;
+ }
+
+ VecCopyf(shi->view, co);
+ Normalize(shi->view);
+ density = vol_get_density(shi, co);
+ vol_get_scattering(shi, scatter_col, co, stepsize, density);
+
+ obi->volume_precache->data_r[ V_I(x, y, z, res) ] = scatter_col[0];
+ obi->volume_precache->data_g[ V_I(x, y, z, res) ] = scatter_col[1];
+ obi->volume_precache->data_b[ V_I(x, y, z, res) ] = scatter_col[2];
+ }
+ }
+ }
+
+ pa->done = 1;
+
+ return 0;
+}
+
+
+static void precache_setup_shadeinput(Render *re, ObjectInstanceRen *obi, Material *ma, ShadeInput *shi)
+{
+ memset(shi, 0, sizeof(ShadeInput));
+ shi->depth= 1;
+ shi->mask= 1;
+ shi->mat = ma;
+ shi->vlr = NULL;
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
+ shi->har= shi->mat->har;
+ shi->obi= obi;
+ shi->obr= obi->obr;
+ shi->lay = re->scene->lay;
+}
+
+static void precache_init_parts(Render *re, RayTree *tree, ShadeInput *shi, ObjectInstanceRen *obi, int totthread, int *parts)
+{
+ VolumePrecache *vp = obi->volume_precache;
+ int i=0, x, y, z;
+ float voxel[3];
+ int sizex, sizey, sizez;
+ float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1];
+ int *res;
+ int minx, maxx;
+ int miny, maxy;
+ int minz, maxz;
+
+ if (!vp) return;
+
+ BLI_freelistN(&re->volume_precache_parts);
+
+ /* currently we just subdivide the box, number of threads per side */
+ parts[0] = parts[1] = parts[2] = totthread;
+ res = vp->res;
+
+ VecSubf(voxel, bbmax, bbmin);
+
+ voxel[0] /= res[0];
+ voxel[1] /= res[1];
+ voxel[2] /= res[2];
+
+ for (x=0; x < parts[0]; x++) {
+ sizex = ceil(res[0] / (float)parts[0]);
+ minx = x * sizex;
+ maxx = minx + sizex;
+ maxx = (maxx>res[0])?res[0]:maxx;
+
+ for (y=0; y < parts[1]; y++) {
+ sizey = ceil(res[1] / (float)parts[1]);
+ miny = y * sizey;
+ maxy = miny + sizey;
+ maxy = (maxy>res[1])?res[1]:maxy;
+
+ for (z=0; z < parts[2]; z++) {
+ VolPrecachePart *pa= MEM_callocN(sizeof(VolPrecachePart), "new precache part");
+
+ sizez = ceil(res[2] / (float)parts[2]);
+ minz = z * sizez;
+ maxz = minz + sizez;
+ maxz = (maxz>res[2])?res[2]:maxz;
+
+ pa->done = 0;
+ pa->working = 0;
+
+ pa->num = i;
+ pa->tree = tree;
+ pa->shi = shi;
+ pa->obi = obi;
+ VECCOPY(pa->bbmin, bbmin);
+ VECCOPY(pa->voxel, voxel);
+ VECCOPY(pa->res, res);
+
+ pa->minx = minx; pa->maxx = maxx;
+ pa->miny = miny; pa->maxy = maxy;
+ pa->minz = minz; pa->maxz = maxz;
+
+
+ BLI_addtail(&re->volume_precache_parts, pa);
+
+ i++;
+ }
+ }
+ }
+}
+
+static VolPrecachePart *precache_get_new_part(Render *re)
+{
+ VolPrecachePart *pa, *nextpa=NULL;
+
+ for (pa = re->volume_precache_parts.first; pa; pa=pa->next)
+ {
+ if (pa->done==0 && pa->working==0) {
+ nextpa = pa;
+ break;
+ }
+ }
+
+ return nextpa;
+}
+
+static int precache_resolution(VolumePrecache *vp, float *bbmin, float *bbmax, int res)
+{
+ float dim[3], div;
+
+ VecSubf(dim, bbmax, bbmin);
+
+ div = MAX3(dim[0], dim[1], dim[2]);
+ dim[0] /= div;
+ dim[1] /= div;
+ dim[2] /= div;
+
+ vp->res[0] = dim[0] * (float)res;
+ vp->res[1] = dim[1] * (float)res;
+ vp->res[2] = dim[2] * (float)res;
+
+ if ((vp->res[0] < 1) || (vp->res[1] < 1) || (vp->res[2] < 1))
+ return 0;
+
+ return 1;
+}
+
+/* Precache a volume into a 3D voxel grid.
+ * The voxel grid is stored in the ObjectInstanceRen,
+ * in camera space, aligned with the ObjectRen's bounding box.
+ * Resolution is defined by the user.
+ */
+void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Material *ma)
+{
+ VolumePrecache *vp;
+ VolPrecachePart *nextpa, *pa;
+ RayTree *tree;
+ ShadeInput shi;
+ ListBase threads;
+ float *bbmin=obi->obr->boundbox[0], *bbmax=obi->obr->boundbox[1];
+ int parts[3], totparts;
+
+ int caching=1, counter=0;
+ int totthread = re->r.threads;
+
+ double time, lasttime= PIL_check_seconds_timer();
+
+ R = *re;
+
+ /* create a raytree with just the faces of the instanced ObjectRen,
+ * used for checking if the cached point is inside or outside. */
+ tree = create_raytree_obi(obi, bbmin, bbmax);
+ if (!tree) return;
+
+ vp = MEM_callocN(sizeof(VolumePrecache), "volume light cache");
+
+ if (!precache_resolution(vp, bbmin, bbmax, ma->vol.precache_resolution)) {
+ MEM_freeN(vp);
+ vp = NULL;
+ return;
+ }
+
+ vp->data_r = MEM_callocN(sizeof(float)*vp->res[0]*vp->res[1]*vp->res[2], "volume light cache data red channel");
+ vp->data_g = MEM_callocN(sizeof(float)*vp->res[0]*vp->res[1]*vp->res[2], "volume light cache data green channel");
+ vp->data_b = MEM_callocN(sizeof(float)*vp->res[0]*vp->res[1]*vp->res[2], "volume light cache data blue channel");
+ obi->volume_precache = vp;
+
+ /* Need a shadeinput to calculate scattering */
+ precache_setup_shadeinput(re, obi, ma, &shi);
+
+ precache_init_parts(re, tree, &shi, obi, totthread, parts);
+ totparts = parts[0] * parts[1] * parts[2];
+
+ BLI_init_threads(&threads, vol_precache_part, totthread);
+
+ while(caching) {
+
+ if(BLI_available_threads(&threads) && !(re->test_break(re->tbh))) {
+ nextpa = precache_get_new_part(re);
+ if (nextpa) {
+ nextpa->working = 1;
+ BLI_insert_thread(&threads, nextpa);
+ }
+ }
+ else PIL_sleep_ms(50);
+
+ caching=0;
+ counter=0;
+ for(pa= re->volume_precache_parts.first; pa; pa= pa->next) {
+
+ if(pa->done) {
+ counter++;
+ BLI_remove_thread(&threads, pa);
+ } else
+ caching = 1;
+ }
+
+ if (re->test_break(re->tbh) && BLI_available_threads(&threads)==totthread)
+ caching=0;
+
+ time= PIL_check_seconds_timer();
+ if(time-lasttime>1.0f) {
+ char str[64];
+ sprintf(str, "Precaching volume: %d%%", (int)(100.0f * ((float)counter / (float)totparts)));
+ re->i.infostr= str;
+ re->stats_draw(re->sdh, &re->i);
+ re->i.infostr= NULL;
+ lasttime= time;
+ }
+ }
+
+ BLI_end_threads(&threads);
+ BLI_freelistN(&re->volume_precache_parts);
+
+ if(tree) {
+ RE_ray_tree_free(tree);
+ tree= NULL;
+ }
+
+ lightcache_filter(obi->volume_precache);
+
+ if (ELEM(ma->vol.shade_type, MA_VOL_SHADE_MULTIPLE, MA_VOL_SHADE_SINGLEPLUSMULTIPLE))
+ {
+ multiple_scattering_diffusion(re, vp, ma);
+ }
+}
+
+static int using_lightcache(Material *ma)
+{
+ return (((ma->vol.shadeflag & MA_VOL_PRECACHESHADING) && (ma->vol.shade_type == MA_VOL_SHADE_SINGLE))
+ || (ELEM(ma->vol.shade_type, MA_VOL_SHADE_MULTIPLE, MA_VOL_SHADE_SINGLEPLUSMULTIPLE)));
+}
+
+/* loop through all objects (and their associated materials)
+ * marked for pre-caching in convertblender.c, and pre-cache them */
+void volume_precache(Render *re)
+{
+ ObjectInstanceRen *obi;
+ VolumeOb *vo;
+
+ for(vo= re->volumes.first; vo; vo= vo->next) {
+ if (using_lightcache(vo->ma)) {
+ for(obi= re->instancetable.first; obi; obi= obi->next) {
+ if (obi->obr == vo->obr) {
+ vol_precache_objectinstance_threads(re, obi, vo->ma);
+ }
+ }
+ }
+ }
+
+ re->i.infostr= NULL;
+ re->stats_draw(re->sdh, &re->i);
+}
+
+void free_volume_precache(Render *re)
+{
+ ObjectInstanceRen *obi;
+
+ for(obi= re->instancetable.first; obi; obi= obi->next) {
+ if (obi->volume_precache != NULL) {
+ MEM_freeN(obi->volume_precache->data_r);
+ MEM_freeN(obi->volume_precache->data_g);
+ MEM_freeN(obi->volume_precache->data_b);
+ MEM_freeN(obi->volume_precache);
+ obi->volume_precache = NULL;
+ }
+ }
+
+ BLI_freelistN(&re->volumes);
+}
+
+int point_inside_volume_objectinstance(ObjectInstanceRen *obi, float *co)
+{
+ RayTree *tree;
+ int inside=0;
+
+ tree = create_raytree_obi(obi, obi->obr->boundbox[0], obi->obr->boundbox[1]);
+ if (!tree) return 0;
+
+ inside = point_inside_obi(tree, obi, co);
+
+ RE_ray_tree_free(tree);
+ tree= NULL;
+
+ return inside;
+}
+
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
new file mode 100644
index 00000000000..b2692c25b99
--- /dev/null
+++ b/source/blender/render/intern/source/volumetric.c
@@ -0,0 +1,750 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Matt Ebb, Raul Fernandez Hernandez (Farsthary)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+#include "BLI_voxel.h"
+
+#include "RE_shader_ext.h"
+#include "RE_raytrace.h"
+
+#include "DNA_material_types.h"
+#include "DNA_group_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_meta_types.h"
+
+#include "BKE_global.h"
+
+#include "render_types.h"
+#include "pixelshading.h"
+#include "shading.h"
+#include "texture.h"
+#include "volumetric.h"
+#include "volume_precache.h"
+
+#if defined( _MSC_VER ) && !defined( __cplusplus )
+# define inline __inline
+#endif // defined( _MSC_VER ) && !defined( __cplusplus )
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
+/* only to be used here in this file, it's for speed */
+extern struct Render R;
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+/* luminance rec. 709 */
+inline float luminance(float* col)
+{
+ return (0.212671f*col[0] + 0.71516f*col[1] + 0.072169f*col[2]);
+}
+
+/* tracing */
+
+static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco, Isect *isect, int intersect_type)
+{
+ float maxsize = RE_ray_tree_max_size(R.raytree);
+
+ /* 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!
+ VecSubf(bb_dim, shi->obi->obr->boundbox[1], shi->obi->obr->boundbox[2]);
+ Mat3MulVecfl(shi->obi->nmat, bb_dim);
+ maxsize = VecLength(bb_dim);
+ */
+
+ VECCOPY(isect->start, co);
+ isect->end[0] = co[0] + vec[0] * maxsize;
+ isect->end[1] = co[1] + vec[1] * maxsize;
+ isect->end[2] = co[2] + vec[2] * maxsize;
+
+ isect->mode= RE_RAY_MIRROR;
+ isect->oborig= RAY_OBJECT_SET(&R, shi->obi);
+ isect->face_last= NULL;
+ isect->ob_last= 0;
+ isect->lay= -1;
+
+ if (intersect_type == VOL_BOUNDS_DEPTH) isect->faceorig= (RayFace*)shi->vlr;
+ else if (intersect_type == VOL_BOUNDS_SS) isect->faceorig= NULL;
+
+ if(RE_ray_tree_intersect(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];
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
+{
+ ShadeInput shi_new;
+ ShadeResult shr_new;
+
+ memset(&shi_new, 0, sizeof(ShadeInput));
+
+ shi_new.mask= shi->mask;
+ shi_new.osatex= shi->osatex;
+ shi_new.thread= shi->thread;
+ shi_new.depth = shi->depth + 1;
+ shi_new.volume_depth= shi->volume_depth + 1;
+ shi_new.xs= shi->xs;
+ shi_new.ys= shi->ys;
+ shi_new.lay= shi->lay;
+ shi_new.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */
+ shi_new.combinedflag= 0xFFFFFF; /* ray trace does all options */
+ shi_new.light_override= shi->light_override;
+ shi_new.mat_override= shi->mat_override;
+
+ VECCOPY(shi_new.camera_co, is->start);
+
+ memset(&shr_new, 0, sizeof(ShadeResult));
+
+ /* hardcoded limit of 100 for now - prevents problems in weird geometry */
+ if (shi->volume_depth < 100) {
+ shade_ray(is, &shi_new, &shr_new);
+ }
+
+ VecCopyf(col, shr_new.combined);
+ col[3] = shr_new.alpha;
+}
+
+static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *col)
+{
+ Isect isect;
+ float maxsize = RE_ray_tree_max_size(R.raytree);
+
+ VECCOPY(isect.start, co);
+ isect.end[0] = isect.start[0] + shi->view[0] * maxsize;
+ isect.end[1] = isect.start[1] + shi->view[1] * maxsize;
+ isect.end[2] = isect.start[2] + shi->view[2] * maxsize;
+
+ isect.faceorig= (RayFace *)vlr;
+
+ isect.mode= RE_RAY_MIRROR;
+ isect.oborig= RAY_OBJECT_SET(&R, shi->obi);
+ isect.face_last= NULL;
+ isect.ob_last= 0;
+ isect.lay= -1;
+
+ /* check to see if there's anything behind the volume, otherwise shade the sky */
+ if(RE_ray_tree_intersect(R.raytree, &isect)) {
+ shade_intersection(shi, col, &isect);
+ } else {
+ shadeSkyView(col, co, shi->view, NULL, shi->thread);
+ shadeSunView(col, shi->view);
+ }
+}
+
+/* input shader data */
+
+float vol_get_stepsize(struct ShadeInput *shi, int context)
+{
+ if (shi->mat->vol.stepsize_type == MA_VOL_STEP_RANDOMIZED) {
+ /* range between 0.75 and 1.25 */
+ const float rnd = 0.5f * BLI_thread_frand(shi->thread) + 0.75f;
+
+ if (context == STEPSIZE_VIEW)
+ return shi->mat->vol.stepsize * rnd;
+ else if (context == STEPSIZE_SHADE)
+ return shi->mat->vol.shade_stepsize * rnd;
+ }
+ else { // MA_VOL_STEP_CONSTANT
+
+ if (context == STEPSIZE_VIEW)
+ return shi->mat->vol.stepsize;
+ else if (context == STEPSIZE_SHADE)
+ return shi->mat->vol.shade_stepsize;
+ }
+
+ return shi->mat->vol.stepsize;
+}
+
+/* trilinear interpolation */
+static void vol_get_precached_scattering(ShadeInput *shi, float *scatter_col, float *co)
+{
+ VolumePrecache *vp = shi->obi->volume_precache;
+ float bbmin[3], bbmax[3], dim[3];
+ float sample_co[3];
+
+ if (!vp) return;
+
+ /* convert input coords to 0.0, 1.0 */
+ VECCOPY(bbmin, shi->obi->obr->boundbox[0]);
+ VECCOPY(bbmax, shi->obi->obr->boundbox[1]);
+ VecSubf(dim, bbmax, bbmin);
+
+ sample_co[0] = ((co[0] - bbmin[0]) / dim[0]);
+ sample_co[1] = ((co[1] - bbmin[1]) / dim[1]);
+ sample_co[2] = ((co[2] - bbmin[2]) / dim[2]);
+
+ scatter_col[0] = voxel_sample_trilinear(vp->data_r, vp->res, sample_co);
+ scatter_col[1] = voxel_sample_trilinear(vp->data_g, vp->res, sample_co);
+ scatter_col[2] = voxel_sample_trilinear(vp->data_b, vp->res, sample_co);
+}
+
+/* Meta object density, brute force for now
+ * (might be good enough anyway, don't need huge number of metaobs to model volumetric objects */
+static float metadensity(Object* ob, float* co)
+{
+ float mat[4][4], imat[4][4], dens = 0.f;
+ MetaBall* mb = (MetaBall*)ob->data;
+ MetaElem* ml;
+
+ /* transform co to meta-element */
+ float tco[3] = {co[0], co[1], co[2]};
+ Mat4MulMat4(mat, ob->obmat, R.viewmat);
+ Mat4Invert(imat, mat);
+ Mat4MulVecfl(imat, tco);
+
+ for (ml = mb->elems.first; ml; ml=ml->next) {
+ float bmat[3][3], dist2;
+
+ /* element rotation transform */
+ float tp[3] = {ml->x - tco[0], ml->y - tco[1], ml->z - tco[2]};
+ QuatToMat3(ml->quat, bmat);
+ Mat3Transp(bmat); // rot.only, so inverse == transpose
+ Mat3MulVecfl(bmat, tp);
+
+ /* MB_BALL default */
+ switch (ml->type) {
+ case MB_ELIPSOID:
+ tp[0] /= ml->expx, tp[1] /= ml->expy, tp[2] /= ml->expz;
+ break;
+ case MB_CUBE:
+ tp[2] = (tp[2] > ml->expz) ? (tp[2] - ml->expz) : ((tp[2] < -ml->expz) ? (tp[2] + ml->expz) : 0.f);
+ // no break, xy as plane
+ case MB_PLANE:
+ tp[1] = (tp[1] > ml->expy) ? (tp[1] - ml->expy) : ((tp[1] < -ml->expy) ? (tp[1] + ml->expy) : 0.f);
+ // no break, x as tube
+ case MB_TUBE:
+ tp[0] = (tp[0] > ml->expx) ? (tp[0] - ml->expx) : ((tp[0] < -ml->expx) ? (tp[0] + ml->expx) : 0.f);
+ }
+
+ /* ml->rad2 is not set */
+ dist2 = 1.f - ((tp[0]*tp[0] + tp[1]*tp[1] + tp[2]*tp[2]) / (ml->rad*ml->rad));
+ if (dist2 > 0.f)
+ dens += (ml->flag & MB_NEGATIVE) ? -ml->s*dist2*dist2*dist2 : ml->s*dist2*dist2*dist2;
+ }
+
+ dens -= mb->thresh;
+ return (dens < 0.f) ? 0.f : dens;
+}
+
+float vol_get_density(struct ShadeInput *shi, float *co)
+{
+ float density = shi->mat->vol.density;
+ float density_scale = shi->mat->vol.density_scale;
+
+ do_volume_tex(shi, co, MAP_DENSITY, NULL, &density);
+
+ // if meta-object, modulate by metadensity without increasing it
+ if (shi->obi->obr->ob->type == OB_MBALL) {
+ const float md = metadensity(shi->obi->obr->ob, co);
+ if (md < 1.f) density *= md;
+ }
+
+ return density * density_scale;
+}
+
+/* scattering multiplier, values above 1.0 are non-physical,
+ * but can be useful to tweak lighting */
+float vol_get_scattering_fac(ShadeInput *shi, float *co)
+{
+ float scatter = shi->mat->vol.scattering;
+ float col[3] = {0.0, 0.0, 0.0};
+
+ do_volume_tex(shi, co, MAP_SCATTERING, col, &scatter);
+
+ return scatter;
+}
+
+/* compute emission component, amount of radiance to add per segment
+ * can be textured with 'emit' */
+void vol_get_emission(ShadeInput *shi, float *emission_col, float *co, float density)
+{
+ float emission = shi->mat->vol.emission;
+ VECCOPY(emission_col, shi->mat->vol.emission_col);
+
+ do_volume_tex(shi, co, MAP_EMISSION+MAP_EMISSION_COL, emission_col, &emission);
+
+ emission_col[0] = emission_col[0] * emission * density;
+ emission_col[1] = emission_col[1] * emission * density;
+ emission_col[2] = emission_col[2] * emission * density;
+}
+
+void vol_get_absorption(ShadeInput *shi, float *absorb_col, float *co)
+{
+ float absorption = shi->mat->vol.absorption;
+ VECCOPY(absorb_col, shi->mat->vol.absorption_col);
+
+ do_volume_tex(shi, co, MAP_ABSORPTION+MAP_ABSORPTION_COL, absorb_col, &absorption);
+
+ absorb_col[0] = (1.0f - absorb_col[0]) * absorption;
+ absorb_col[1] = (1.0f - absorb_col[1]) * absorption;
+ absorb_col[2] = (1.0f - absorb_col[2]) * absorption;
+}
+
+/* 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, short phasefunc_type, float g, float *w, float *wp)
+{
+ const float costheta = Inpf(w, wp);
+ const float scale = M_PI;
+
+ /*
+ * Scale constant is required, since Blender's shading system doesn't normalise for
+ * energy conservation - eg. scaling by 1/pi for a lambert shader.
+ * This makes volumes darker than other solid objects, for the same lighting intensity.
+ * To correct this, scale up the phase function values
+ * until Blender's shading system supports this better. --matt
+ */
+
+ switch (phasefunc_type) {
+ case MA_VOL_PH_MIEHAZY:
+ return scale * (0.5f + 4.5f * powf(0.5 * (1.f + costheta), 8.f)) / (4.f*M_PI);
+ case MA_VOL_PH_MIEMURKY:
+ return scale * (0.5f + 16.5f * powf(0.5 * (1.f + costheta), 32.f)) / (4.f*M_PI);
+ case MA_VOL_PH_RAYLEIGH:
+ return scale * 3.f/(16.f*M_PI) * (1 + costheta * costheta);
+ case MA_VOL_PH_HG:
+ return scale * (1.f / (4.f * M_PI) * (1.f - g*g) / powf(1.f + g*g - 2.f * g * costheta, 1.5f));
+ case MA_VOL_PH_SCHLICK:
+ {
+ const float k = 1.55f * g - .55f * g * g * g;
+ const float kcostheta = k * costheta;
+ return scale * (1.f / (4.f * M_PI) * (1.f - k*k) / ((1.f - kcostheta) * (1.f - kcostheta)));
+ }
+ case MA_VOL_PH_ISOTROPIC:
+ default:
+ return scale * (1.f / (4.f * M_PI));
+ }
+}
+
+/* Compute transmittance = e^(-attenuation) */
+void vol_get_transmittance_seg(ShadeInput *shi, float *tr, float stepsize, float *co, float density)
+{
+ /* input density = density at co */
+ float tau[3] = {0.f, 0.f, 0.f};
+ float absorb[3];
+ const float scatter_dens = vol_get_scattering_fac(shi, co) * density * stepsize;
+
+ vol_get_absorption(shi, absorb, co);
+
+ /* homogenous volume within the sampled distance */
+ tau[0] += scatter_dens * absorb[0];
+ tau[1] += scatter_dens * absorb[1];
+ tau[2] += scatter_dens * absorb[2];
+
+ tr[0] *= exp(-tau[0]);
+ tr[1] *= exp(-tau[1]);
+ tr[2] *= exp(-tau[2]);
+}
+
+/* Compute transmittance = e^(-attenuation) */
+static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float *endco)
+{
+ float p[3] = {co[0], co[1], co[2]};
+ float step_vec[3] = {endco[0] - co[0], endco[1] - co[1], endco[2] - co[2]};
+ //const float ambtau = -logf(shi->mat->vol.depth_cutoff); // never zero
+ float tau[3] = {0.f, 0.f, 0.f};
+
+ float t0 = 0.f;
+ float t1 = Normalize(step_vec);
+ float pt0 = t0;
+
+ t0 += shi->mat->vol.shade_stepsize * ((shi->mat->vol.stepsize_type == MA_VOL_STEP_CONSTANT) ? 0.5f : BLI_thread_frand(shi->thread));
+ p[0] += t0 * step_vec[0];
+ p[1] += t0 * step_vec[1];
+ p[2] += t0 * step_vec[2];
+ VecMulf(step_vec, shi->mat->vol.shade_stepsize);
+
+ for (; t0 < t1; pt0 = t0, t0 += shi->mat->vol.shade_stepsize) {
+ float absorb[3];
+ const float d = vol_get_density(shi, p);
+ const float stepd = (t0 - pt0) * d;
+ const float scatter_dens = vol_get_scattering_fac(shi, p) * stepd;
+ vol_get_absorption(shi, absorb, p);
+
+ tau[0] += scatter_dens * absorb[0];
+ tau[1] += scatter_dens * absorb[1];
+ tau[2] += scatter_dens * absorb[2];
+
+ //if (luminance(tau) >= ambtau) break;
+ VecAddf(p, p, step_vec);
+ }
+
+ /* return transmittance */
+ tr[0] = expf(-tau[0]);
+ tr[1] = expf(-tau[1]);
+ tr[2] = expf(-tau[2]);
+}
+
+void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, float *lacol)
+{
+ float visifac, lv[3], lampdist;
+ float tr[3]={1.0,1.0,1.0};
+ float hitco[3], *atten_co;
+ float p;
+ float scatter_fac;
+
+ if (lar->mode & LA_LAYER) if((lar->lay & shi->obi->lay)==0) return;
+ if ((lar->lay & shi->lay)==0) return;
+ if (lar->energy == 0.0) return;
+
+ if ((visifac= lamp_get_visibility(lar, co, lv, &lampdist)) == 0.f) return;
+
+ VecCopyf(lacol, &lar->r);
+
+ if(lar->mode & LA_TEXTURE) {
+ shi->osatex= 0;
+ do_lamp_tex(lar, lv, shi, lacol, LA_TEXTURE);
+ }
+
+ VecMulf(lacol, visifac);
+
+ if (ELEM(lar->type, LA_SUN, LA_HEMI))
+ VECCOPY(lv, lar->vec);
+ VecMulf(lv, -1.0f);
+
+ if (shi->mat->vol.shade_type != MA_VOL_SHADE_NONE) {
+ Isect is;
+
+ /* find minimum of volume bounds, or lamp coord */
+ if (vol_get_bounds(shi, co, lv, hitco, &is, VOL_BOUNDS_SS)) {
+ float dist = VecLenf(co, hitco);
+ VlakRen *vlr = (VlakRen *)is.face;
+
+ /* simple internal shadowing */
+ if (vlr->mat->material_type == MA_TYPE_SURFACE) {
+ lacol[0] = lacol[1] = lacol[2] = 0.0f;
+ return;
+ }
+
+ if (ELEM(lar->type, LA_SUN, LA_HEMI))
+ /* infinite lights, can never be inside volume */
+ atten_co = hitco;
+ else if ( lampdist < dist ) {
+ atten_co = lar->co;
+ } else
+ atten_co = hitco;
+
+ vol_get_transmittance(shi, tr, co, atten_co);
+
+ VecMulVecf(lacol, lacol, tr);
+ }
+ else {
+ /* Point is on the outside edge of the volume,
+ * therefore no attenuation, full transmission.
+ * Radiance from lamp remains unchanged */
+ }
+ }
+
+ p = vol_get_phasefunc(shi, shi->mat->vol.phasefunc_type, shi->mat->vol.phasefunc_g, shi->view, lv);
+ VecMulf(lacol, p);
+
+ scatter_fac = vol_get_scattering_fac(shi, co);
+ VecMulf(lacol, scatter_fac);
+}
+
+/* single scattering only for now */
+void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co, float stepsize, float density)
+{
+ ListBase *lights;
+ GroupObject *go;
+ LampRen *lar;
+
+ scatter_col[0] = scatter_col[1] = scatter_col[2] = 0.f;
+
+ lights= get_lights(shi);
+ for(go=lights->first; go; go= go->next)
+ {
+ float lacol[3] = {0.f, 0.f, 0.f};
+ lar= go->lampren;
+
+ if (lar) {
+ vol_shade_one_lamp(shi, co, lar, lacol);
+ VecAddf(scatter_col, scatter_col, lacol);
+ }
+ }
+}
+
+
+/*
+The main volumetric integrator, using an emission/absorption/scattering model.
+
+Incoming radiance =
+
+outgoing radiance from behind surface * beam transmittance/attenuation
++ added radiance from all points along the ray due to participating media
+ --> radiance for each segment =
+ (radiance added by scattering + radiance added by emission) * beam transmittance/attenuation
+*/
+static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float *endco)
+{
+ float tr[3] = {1.0f, 1.0f, 1.0f};
+ float radiance[3] = {0.f, 0.f, 0.f}, d_radiance[3] = {0.f, 0.f, 0.f};
+ float stepsize = vol_get_stepsize(shi, STEPSIZE_VIEW);
+ int nsteps, s;
+ float emit_col[3], scatter_col[3] = {0.0, 0.0, 0.0};
+ float stepvec[3], step_sta[3], step_end[3], step_mid[3];
+ float density;
+ const float depth_cutoff = shi->mat->vol.depth_cutoff;
+
+ /* ray marching */
+ nsteps = (int)((VecLenf(co, endco) / stepsize) + 0.5);
+
+ VecSubf(stepvec, endco, co);
+ VecMulf(stepvec, 1.0f / nsteps);
+ VecCopyf(step_sta, co);
+ VecAddf(step_end, step_sta, stepvec);
+
+ /* get radiance from all points along the ray due to participating media */
+ for (s = 0; s < nsteps; s++) {
+
+ density = vol_get_density(shi, step_sta);
+
+ /* there's only any use in shading here if there's actually some density to shade! */
+ if (density > 0.01f) {
+
+ /* transmittance component (alpha) */
+ vol_get_transmittance_seg(shi, tr, stepsize, co, density);
+
+ step_mid[0] = step_sta[0] + (stepvec[0] * 0.5);
+ step_mid[1] = step_sta[1] + (stepvec[1] * 0.5);
+ step_mid[2] = step_sta[2] + (stepvec[2] * 0.5);
+
+ /* incoming light via emission or scattering (additive) */
+ vol_get_emission(shi, emit_col, step_mid, density);
+
+ if (shi->obi->volume_precache)
+ vol_get_precached_scattering(shi, scatter_col, step_mid);
+ else
+ vol_get_scattering(shi, scatter_col, step_mid, stepsize, density);
+
+ VecMulf(scatter_col, density);
+ VecAddf(d_radiance, emit_col, scatter_col);
+
+ /* Lv += Tr * (Lve() + Ld) */
+ VecMulVecf(d_radiance, tr, d_radiance);
+ VecMulf(d_radiance, stepsize);
+
+ VecAddf(radiance, radiance, d_radiance);
+ }
+
+ VecCopyf(step_sta, step_end);
+ VecAddf(step_end, step_end, stepvec);
+
+ /* luminance rec. 709 */
+ if ((0.2126*tr[0] + 0.7152*tr[1] + 0.0722*tr[2]) < depth_cutoff) break;
+ }
+
+ /* multiply original color (behind volume) with beam transmittance over entire distance */
+ VecMulVecf(col, tr, col);
+ VecAddf(col, col, radiance);
+
+ /* alpha <-- transmission luminance */
+ col[3] = 1.0f -(0.2126*tr[0] + 0.7152*tr[1] + 0.0722*tr[2]);
+}
+
+/* the main entry point for volume shading */
+static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int inside_volume)
+{
+ float hitco[3], col[4] = {0.f,0.f,0.f,0.f};
+ float *startco, *endco;
+ int trace_behind = 1;
+ const int ztransp= ((shi->depth==0) && (shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_ZTRANSP));
+ Isect is;
+
+ /* check for shading an internal face a volume object directly */
+ if (inside_volume == VOL_SHADE_INSIDE)
+ trace_behind = 0;
+ else if (inside_volume == VOL_SHADE_OUTSIDE) {
+ if (shi->flippednor)
+ inside_volume = VOL_SHADE_INSIDE;
+ }
+
+ if (ztransp && inside_volume == VOL_SHADE_INSIDE) {
+ MatInside *mi;
+ int render_this=0;
+
+ /* don't render the backfaces of ztransp volume materials.
+
+ * volume shading renders the internal volume from between the
+ * near view intersection of the solid volume to the
+ * intersection on the other side, as part of the shading of
+ * the front face.
+
+ * Because ztransp renders both front and back faces independently
+ * this will double up, so here we prevent rendering the backface as well,
+ * which would otherwise render the volume in between the camera and the backface
+ * --matt */
+
+ for (mi=R.render_volumes_inside.first; mi; mi=mi->next) {
+ /* weak... */
+ if (mi->ma == shi->mat) render_this=1;
+ }
+ if (!render_this) return;
+ }
+
+
+ if (inside_volume == VOL_SHADE_INSIDE)
+ {
+ startco = shi->camera_co;
+ endco = shi->co;
+
+ if (trace_behind) {
+ if (!ztransp)
+ /* trace behind the volume object */
+ vol_trace_behind(shi, shi->vlr, endco, col);
+ } else {
+ /* we're tracing through the volume between the camera
+ * and a solid surface, so use that pre-shaded radiance */
+ QUATCOPY(col, shr->combined);
+ }
+
+ /* shade volume from 'camera' to 1st hit point */
+ volumeintegrate(shi, col, startco, endco);
+ }
+ /* 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))
+ {
+ VlakRen *vlr = (VlakRen *)is.face;
+
+ startco = shi->co;
+ endco = hitco;
+
+ if (!ztransp) {
+ /* if it's another face in the same material */
+ if (vlr->mat == shi->mat) {
+ /* trace behind the 2nd (raytrace) hit point */
+ vol_trace_behind(shi, (VlakRen *)is.face, endco, col);
+ } else {
+ shade_intersection(shi, col, &is);
+ }
+ }
+
+ /* shade volume from 1st hit point to 2nd hit point */
+ volumeintegrate(shi, col, startco, endco);
+ }
+
+ if (ztransp)
+ col[3] = col[3]>1.f?1.f:col[3];
+ else
+ col[3] = 1.f;
+
+ VecCopyf(shr->combined, col);
+ shr->alpha = col[3];
+
+ VECCOPY(shr->diff, shr->combined);
+}
+
+/* Traces a shadow through the object,
+ * pretty much gets the transmission over a ray path */
+void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct Isect *last_is)
+{
+ float hitco[3];
+ float tr[3] = {1.0,1.0,1.0};
+ Isect is;
+ float *startco, *endco;
+ float density=0.f;
+
+ memset(shr, 0, sizeof(ShadeResult));
+
+ /* if 1st hit normal is facing away from the camera,
+ * then we're inside the volume already. */
+ if (shi->flippednor) {
+ startco = last_is->start;
+ endco = shi->co;
+ }
+ /* 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)) {
+ startco = shi->co;
+ endco = hitco;
+ }
+ else {
+ shr->combined[0] = shr->combined[1] = shr->combined[2] = 0.f;
+ shr->alpha = shr->combined[3] = 1.f;
+ return;
+ }
+
+ density = vol_get_density(shi, startco);
+ vol_get_transmittance(shi, tr, startco, endco);
+
+ VecCopyf(shr->combined, tr);
+ shr->combined[3] = 1.0f -(0.2126*tr[0] + 0.7152*tr[1] + 0.0722*tr[2]);
+ shr->alpha = shr->combined[3];
+}
+
+
+/* delivers a fully filled in ShadeResult, for all passes */
+void shade_volume_outside(ShadeInput *shi, ShadeResult *shr)
+{
+ memset(shr, 0, sizeof(ShadeResult));
+ volume_trace(shi, shr, VOL_SHADE_OUTSIDE);
+}
+
+
+void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
+{
+ MatInside *m;
+ Material *mat_backup;
+ ObjectInstanceRen *obi_backup;
+ float prev_alpha = shr->alpha;
+
+ //if (BLI_countlist(&R.render_volumes_inside) == 0) return;
+
+ /* XXX: extend to multiple volumes perhaps later */
+ mat_backup = shi->mat;
+ obi_backup = shi->obi;
+
+ m = R.render_volumes_inside.first;
+ shi->mat = m->ma;
+ shi->obi = m->obi;
+ shi->obr = m->obi->obr;
+
+ volume_trace(shi, shr, VOL_SHADE_INSIDE);
+ shr->alpha += prev_alpha;
+ CLAMP(shr->alpha, 0.f, 1.f);
+
+ 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
new file mode 100644
index 00000000000..9318d37620c
--- /dev/null
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -0,0 +1,344 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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): Raul Fernandez Hernandez (Farsthary), Matt Ebb.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_voxel.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"
+
+#include "smoke_API.h"
+
+#include "DNA_texture_types.h"
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_smoke_types.h"
+
+
+#include "render_types.h"
+#include "renderdatabase.h"
+#include "texture.h"
+#include "voxeldata.h"
+
+void load_frame_blendervoxel(FILE *fp, float *F, int size, int frame, int offset)
+{
+ fseek(fp,frame*size*sizeof(float)+offset,0);
+ fread(F,sizeof(float),size,fp);
+}
+
+void load_frame_raw8(FILE *fp, float *F, int size, int frame)
+{
+ char *tmp;
+ int i;
+
+ tmp = (char *)MEM_mallocN(sizeof(char)*size, "temporary voxel file reading storage");
+
+ fseek(fp,(frame-1)*size*sizeof(char),0);
+ fread(tmp, sizeof(char), size, fp);
+
+ for (i=0; i<size; i++) {
+ F[i] = (float)tmp[i] / 256.f;
+ }
+ MEM_freeN(tmp);
+}
+
+void load_frame_image_sequence(Render *re, VoxelData *vd, Tex *tex)
+{
+ ImBuf *ibuf;
+ Image *ima = tex->ima;
+ ImageUser *iuser = &tex->iuser;
+ int x=0, y=0, z=0;
+ float *rf;
+
+ if (!ima || !iuser) return;
+
+ ima->source = IMA_SRC_SEQUENCE;
+ iuser->framenr = 1 + iuser->offset;
+
+ /* find the first valid ibuf and use it to initialise the resolution of the data set */
+ /* need to do this in advance so we know how much memory to allocate */
+ ibuf= BKE_image_get_ibuf(ima, iuser);
+ while (!ibuf && (iuser->framenr < iuser->frames)) {
+ iuser->framenr++;
+ ibuf= BKE_image_get_ibuf(ima, iuser);
+ }
+ if (!ibuf) return;
+ if (!ibuf->rect_float) IMB_float_from_rect(ibuf);
+
+ vd->flag |= TEX_VD_STILL;
+ vd->resol[0] = ibuf->x;
+ vd->resol[1] = ibuf->y;
+ vd->resol[2] = iuser->frames;
+ vd->dataset = MEM_mapallocN(sizeof(float)*(vd->resol[0])*(vd->resol[1])*(vd->resol[2]), "voxel dataset");
+
+ for (z=0; z < iuser->frames; z++)
+ {
+ /* get a new ibuf for each frame */
+ if (z > 0) {
+ iuser->framenr++;
+ ibuf= BKE_image_get_ibuf(ima, iuser);
+ if (!ibuf) break;
+ if (!ibuf->rect_float) IMB_float_from_rect(ibuf);
+ }
+ rf = ibuf->rect_float;
+
+ for (y=0; y < ibuf->y; y++)
+ {
+ for (x=0; x < ibuf->x; x++)
+ {
+ /* currently converted to monchrome */
+ vd->dataset[ V_I(x, y, z, vd->resol) ] = (rf[0] + rf[1] + rf[2])*0.333f;
+ rf +=4;
+ }
+ }
+
+ BKE_image_free_anim_ibufs(ima, iuser->framenr);
+ }
+}
+
+void write_voxeldata_header(struct VoxelDataHeader *h, FILE *fp)
+{
+ fwrite(h,sizeof(struct VoxelDataHeader),1,fp);
+}
+
+void read_voxeldata_header(FILE *fp, struct VoxelData *vd)
+{
+ VoxelDataHeader *h=(VoxelDataHeader *)MEM_mallocN(sizeof(VoxelDataHeader), "voxel data header");
+
+ rewind(fp);
+ fread(h,sizeof(VoxelDataHeader),1,fp);
+
+ vd->resol[0]=h->resolX;
+ vd->resol[1]=h->resolY;
+ vd->resol[2]=h->resolZ;
+
+ MEM_freeN(h);
+}
+
+void init_frame_smoke(Render *re, VoxelData *vd, Tex *tex)
+{
+ Object *ob;
+ ModifierData *md;
+
+ vd->dataset = NULL;
+ if (vd->object == NULL) return;
+ ob= vd->object;
+
+ /* draw code for smoke */
+ if( (md = (ModifierData *)modifiers_findByType(ob, eModifierType_Smoke)) )
+ {
+ SmokeModifierData *smd = (SmokeModifierData *)md;
+
+ if(smd->domain && smd->domain->fluid) {
+
+ 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);
+ } else {
+ VECCOPY(vd->resol, smd->domain->res);
+ vd->dataset = smoke_get_density(smd->domain->fluid);
+ }
+ }
+ }
+}
+
+void cache_voxeldata(struct Render *re,Tex *tex)
+{
+ VoxelData *vd = tex->vd;
+ FILE *fp;
+ int size;
+ int curframe;
+
+ if (!vd) return;
+
+ /* image sequence gets special treatment */
+ if (vd->file_format == TEX_VD_IMAGE_SEQUENCE) {
+ load_frame_image_sequence(re, vd, tex);
+ return;
+ } else if (vd->file_format == TEX_VD_SMOKE) {
+ init_frame_smoke(re, vd, tex);
+ return;
+ }
+
+ if (!BLI_exists(vd->source_path)) return;
+ fp = fopen(vd->source_path,"rb");
+ if (!fp) return;
+
+ if (vd->file_format == TEX_VD_BLENDERVOXEL)
+ read_voxeldata_header(fp, vd);
+
+ size = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+ vd->dataset = MEM_mapallocN(sizeof(float)*size, "voxel dataset");
+
+ if (vd->flag & TEX_VD_STILL) curframe = vd->still_frame;
+ else curframe = re->r.cfra;
+
+ switch(vd->file_format) {
+ case TEX_VD_BLENDERVOXEL:
+ load_frame_blendervoxel(fp, vd->dataset, size, curframe-1, sizeof(VoxelDataHeader));
+ break;
+ case TEX_VD_RAW_8BIT:
+ load_frame_raw8(fp, vd->dataset, size, curframe);
+ break;
+ }
+
+ fclose(fp);
+}
+
+void make_voxeldata(struct Render *re)
+{
+ Tex *tex;
+
+ if(re->scene->r.scemode & R_PREVIEWBUTS)
+ return;
+
+ re->i.infostr= "Loading voxel datasets";
+ re->stats_draw(re->sdh, &re->i);
+
+ /* XXX: should be doing only textures used in this render */
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if(tex->id.us && tex->type==TEX_VOXELDATA) {
+ cache_voxeldata(re, tex);
+ }
+ }
+
+ re->i.infostr= NULL;
+ re->stats_draw(re->sdh, &re->i);
+
+}
+
+static void free_voxeldata_one(Render *re, Tex *tex)
+{
+ VoxelData *vd = tex->vd;
+
+ if (vd->dataset) {
+ MEM_freeN(vd->dataset);
+ vd->dataset = NULL;
+ }
+}
+
+
+void free_voxeldata(Render *re)
+{
+ Tex *tex;
+
+ if(re->scene->r.scemode & R_PREVIEWBUTS)
+ return;
+
+ for (tex= G.main->tex.first; tex; tex= tex->id.next) {
+ if(tex->id.us && tex->type==TEX_VOXELDATA) {
+ free_voxeldata_one(re, tex);
+ }
+ }
+}
+
+int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres)
+{
+ int retval = TEX_INT;
+ VoxelData *vd = tex->vd;
+ float co[3], offset[3] = {0.5, 0.5, 0.5};
+
+ if ((!vd) || (vd->dataset==NULL)) {
+ texres->tin = 0.0f;
+ return 0;
+ }
+
+ /* scale lookup from 0.0-1.0 (original location) to -1.0, 1.0, consistent with image texture tex coords */
+ /* in implementation this works backwards, bringing sample locations from -1.0, 1.0
+ * to the range 0.0, 1.0, before looking up in the voxel structure. */
+ VecCopyf(co, texvec);
+ VecMulf(co, 0.5f);
+ VecAddf(co, co, offset);
+
+ /* co is now in the range 0.0, 1.0 */
+ switch (tex->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)) {
+ texres->tin = 0.f;
+ return retval;
+ }
+ break;
+ }
+ case TEX_REPEAT:
+ {
+ co[0] = co[0] - floor(co[0]);
+ co[1] = co[1] - floor(co[1]);
+ co[2] = co[2] - floor(co[2]);
+ break;
+ }
+ case TEX_EXTEND:
+ {
+ CLAMP(co[0], 0.f, 1.f);
+ CLAMP(co[1], 0.f, 1.f);
+ CLAMP(co[2], 0.f, 1.f);
+ break;
+ }
+ }
+
+ switch (vd->interp_type) {
+ case TEX_VD_NEARESTNEIGHBOR:
+ texres->tin = voxel_sample_nearest(vd->dataset, vd->resol, co);
+ break;
+ case TEX_VD_LINEAR:
+ texres->tin = voxel_sample_trilinear(vd->dataset, vd->resol, co);
+ break;
+ case TEX_VD_QUADRATIC:
+ texres->tin = voxel_sample_triquadratic(vd->dataset, vd->resol, co);
+ break;
+ case TEX_VD_TRICUBIC_CATROM:
+ case TEX_VD_TRICUBIC_BSPLINE:
+ texres->tin = voxel_sample_tricubic(vd->dataset, vd->resol, co, (vd->interp_type == TEX_VD_TRICUBIC_BSPLINE));
+ break;
+ }
+
+ texres->tin *= vd->int_multiplier;
+ BRICONT;
+
+ texres->tr = texres->tin;
+ texres->tg = texres->tin;
+ texres->tb = texres->tin;
+ texres->ta = texres->tin;
+ BRICONTRGB;
+
+ return retval;
+}
+
+
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 21c3977fc0b..3b3a8568933 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -42,7 +42,7 @@
#include "BLI_jitter.h"
#include "BLI_threads.h"
-#include "MTC_matrixops.h"
+
#include "MEM_guardedalloc.h"
#include "DNA_lamp_types.h"
@@ -2152,9 +2152,9 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*,
if(obi->lay & lay) {
if(vlr->mat!=ma) {
ma= vlr->mat;
- nofill= ma->mode & (MA_ZTRA|MA_ONLYCAST);
+ nofill= (ma->mode & MA_ONLYCAST) || ((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP));
env= (ma->mode & MA_ENV);
- wire= (ma->mode & MA_WIRE);
+ wire= (ma->material_type == MA_TYPE_WIRE);
for(zsample=0; zsample<samples; zsample++) {
if(ma->mode & MA_ZINV || (zmaskpass && neg_zmask))
@@ -2269,36 +2269,6 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*,
}
}
-typedef struct {
- float *vert;
- float hoco[4];
- int clip;
-} VertBucket;
-
-/* warning, not threaded! */
-static int hashlist_projectvert(float *v1, float winmat[][4], float *hoco)
-{
- static VertBucket bucket[256], *buck;
-
- /* init static bucket */
- if(v1==NULL) {
- memset(bucket, 0, 256*sizeof(VertBucket));
- return 0;
- }
-
- buck= &bucket[ (((intptr_t)v1)/16) & 255 ];
- if(buck->vert==v1) {
- QUATCOPY(hoco, buck->hoco);
- return buck->clip;
- }
-
- projectvert(v1, winmat, hoco);
- buck->clip = testclip(hoco);
- buck->vert= v1;
- QUATCOPY(buck->hoco, hoco);
- return buck->clip;
-}
-
void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int size, float jitx, float jity)
{
ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
@@ -2371,7 +2341,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
c2= zbuf_shadow_project(cache, vlr->v2->index, obwinmat, vlr->v2->co, ho2);
c3= zbuf_shadow_project(cache, vlr->v3->index, obwinmat, vlr->v3->co, ho3);
- if((ma->mode & MA_WIRE) || (vlr->flag & R_STRAND)) {
+ if((ma->material_type == MA_TYPE_WIRE) || (vlr->flag & R_STRAND)) {
if(vlr->v4) {
c4= zbuf_shadow_project(cache, vlr->v4->index, obwinmat, vlr->v4->co, ho4);
zbufclipwire(&zspan, 0, a+1, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
@@ -2601,7 +2571,7 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo
ma= vlr->mat;
nofill= ma->mode & MA_ONLYCAST;
env= (ma->mode & MA_ENV);
- wire= (ma->mode & MA_WIRE);
+ wire= (ma->material_type == MA_TYPE_WIRE);
}
}
else {
@@ -3336,7 +3306,7 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, Re
if(vlr->mat!=ma) {
ma= vlr->mat;
- dofill= (ma->mode & MA_ZTRA) && !(ma->mode & MA_ONLYCAST);
+ dofill= ((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP)) && !(ma->mode & MA_ONLYCAST);
}
if(dofill) {
@@ -3387,7 +3357,7 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, Re
zspan= &zspans[zsample];
zspan->polygon_offset= polygon_offset;
- if(ma->mode & (MA_WIRE)) {
+ if(ma->material_type == MA_TYPE_WIRE) {
if(v4)
zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4);
else
@@ -3510,7 +3480,7 @@ void merge_transp_passes(RenderLayer *rl, ShadeResult *shr)
col= shr->refl;
break;
case SCE_PASS_RADIO:
- col= shr->rad;
+ col= NULL; // removed shr->rad;
break;
case SCE_PASS_REFRACT:
col= shr->refr;
@@ -3612,7 +3582,7 @@ void add_transp_passes(RenderLayer *rl, int offset, ShadeResult *shr, float alph
col= shr->refr;
break;
case SCE_PASS_RADIO:
- col= shr->rad;
+ col= NULL; // removed shr->rad;
break;
case SCE_PASS_NORMAL:
col= shr->nor;
@@ -3847,8 +3817,8 @@ static int addtosamp_shr(ShadeResult *samp_shr, ShadeSample *ssamp, int addpassf
if(addpassflag & SCE_PASS_REFRACT)
addvecmul(samp_shr->refr, shr->refr, fac);
- if(addpassflag & SCE_PASS_RADIO)
- addvecmul(samp_shr->rad, shr->rad, fac);
+ /* removed if(addpassflag & SCE_PASS_RADIO)
+ addvecmul(samp_shr->rad, shr->rad, fac);*/
if(addpassflag & SCE_PASS_MIST)
samp_shr->mist= samp_shr->mist+fac*shr->mist;
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 088bdc99687..cb2fc92a1b6 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -27,52 +27,52 @@
FILE(GLOB SRC intern/*.c)
SET(INC .
- ../editors/include
- ../../../intern/guardedalloc ../../../intern/memutil
- ../blenlib ../makesdna ../makesrna ../blenkernel
- ../include ../imbuf ../render/extern/include
- ../../../intern/bsp/extern ../radiosity/extern/include
- ../../../intern/decimation/extern ../blenloader
- ../../kernel/gen_system ../../../intern/SoundSystem ../readstreamglue
- ../quicktime ../../../intern/elbeem/extern
- ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include
- ../nodes
- ../gpu
- ../blenfont
- ${SDL_INC}
+ ../editors/include
+ ../../../intern/guardedalloc ../../../intern/memutil
+ ../blenlib ../makesdna ../makesrna ../blenkernel
+ ../include ../imbuf ../render/extern/include
+ ../../../intern/bsp/extern
+ ../../../intern/decimation/extern ../blenloader
+ ../../kernel/gen_system ../readstreamglue
+ ../../../intern/elbeem/extern
+ ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include
+ ../nodes
+ ../gpu
+ ../blenfont
+ ${OPENGL_INCLUDE_DIR}
)
IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
+ ADD_DEFINITIONS(-DINTERNATIONAL)
ENDIF(WITH_INTERNATIONAL)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ SET(INC ${INC} ${FFMPEG_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
+ SET(INC ${INC} ../python ${PYTHON_INC})
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
+ SET(INC ${INC} ${PTHREADS_INC})
ENDIF(WIN32)
# TODO buildinfo
IF(BF_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
+ ADD_DEFINITIONS(-DNAN_BUILDINFO)
ENDIF(BF_BUILDINFO)
BLENDERLIB_NOLIST(bf_windowmanager "${SRC}" "${INC}")
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 92b71e9fff0..69c96d0d89d 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -40,6 +40,7 @@ struct wmJob;
struct wmNotifier;
struct rcti;
struct PointerRNA;
+struct EnumPropertyItem;
typedef struct wmJob wmJob;
@@ -50,13 +51,22 @@ void WM_init (struct bContext *C);
void WM_exit (struct bContext *C);
void WM_main (struct bContext *C);
-struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect);
+struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect);
+
+ /* defines for 'type' WM_window_open_temp */
+#define WM_WINDOW_RENDER 0
+#define WM_WINDOW_USERPREFS 1
+#define WM_WINDOW_FILESEL 2
+
+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_write_homefile (struct bContext *C, struct wmOperator *op);
void WM_read_file (struct bContext *C, char *name, struct ReportList *reports);
-void WM_write_file (struct bContext *C, char *target, struct ReportList *reports);
+void WM_write_file (struct bContext *C, char *target, int compress, struct ReportList *reports);
void WM_read_autosavefile(struct bContext *C);
void WM_write_autosave (struct bContext *C);
@@ -65,32 +75,42 @@ void WM_cursor_set (struct wmWindow *win, int curs);
void WM_cursor_modal (struct wmWindow *win, int curs);
void WM_cursor_restore (struct wmWindow *win);
void WM_cursor_wait (int val);
+void WM_cursor_grab (struct wmWindow *win, int val);
void WM_timecursor (struct wmWindow *win, int nr);
void *WM_paint_cursor_activate(struct wmWindowManager *wm, int (*poll)(struct bContext *C), void (*draw)(struct bContext *C, int, int, void *customdata), void *customdata);
void WM_paint_cursor_end(struct wmWindowManager *wm, void *handle);
/* keymap */
-wmKeymapItem *WM_keymap_verify_item(ListBase *lb, char *idname, short type,
+void WM_keymap_init (struct bContext *C);
+wmKeymapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, short type,
short val, int modifier, short keymodifier);
-wmKeymapItem *WM_keymap_add_item(ListBase *lb, char *idname, short type,
+wmKeymapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, short type,
short val, int modifier, short keymodifier);
-void WM_keymap_tweak (ListBase *lb, short type, short val, int modifier, short keymodifier);
-ListBase *WM_keymap_listbase (struct wmWindowManager *wm, const char *nameid,
- int spaceid, int regionid);
+void WM_keymap_tweak (wmKeyMap *keymap, short type, short val, int modifier, short keymodifier);
+wmKeyMap *WM_keymap_find (struct wmWindowManager *wm, const char *nameid,
+ short spaceid, short regionid);
+
+wmKeyMap *WM_modalkeymap_add(struct wmWindowManager *wm, const char *nameid, struct EnumPropertyItem *items);
+wmKeyMap *WM_modalkeymap_get(struct wmWindowManager *wm, const char *nameid);
+void WM_modalkeymap_add_item(wmKeyMap *km, short type, short val, int modifier, short keymodifier, short value);
+void WM_modalkeymap_assign(wmKeyMap *km, const char *opname);
-char *WM_key_event_string(short type);
+int WM_key_event_is_tweak(short type);
+
+const char *WM_key_event_string(short type);
char *WM_key_event_operator_string(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, char *str, int len);
+void WM_key_event_operator_change(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, short key, short modifier);
/* handlers */
-struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap);
+struct wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap);
/* boundbox, optional subwindow boundbox for offset */
-struct wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBase *keymap, rcti *bb, rcti *swinbb);
+struct wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, wmKeyMap *keymap, rcti *bb, rcti *swinbb);
/* priority not implemented, it adds in begin */
-struct wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, ListBase *keymap, int priority);
+struct wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int priority);
-void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap);
+void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap);
struct wmEventHandler *WM_event_add_ui_handler(const struct bContext *C, ListBase *handlers,
int (*func)(struct bContext *C, struct wmEvent *event, void *userdata),
@@ -99,7 +119,7 @@ void WM_event_remove_ui_handler(ListBase *handlers,
int (*func)(struct bContext *C, struct wmEvent *event, void *userdata),
void (*remove)(struct bContext *C, void *userdata), void *userdata);
-struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, ListBase *handlers, struct wmOperator *op);
+struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op);
void WM_event_remove_handlers(struct bContext *C, ListBase *handlers);
void WM_event_add_mousemove(struct bContext *C);
@@ -119,34 +139,43 @@ void WM_event_window_timer_sleep(struct wmWindow *win, struct wmTimer *timer, i
int WM_menu_invoke (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
/* invoke callback, confirm menu + exec */
int WM_operator_confirm (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
- /* invoke callback, file selector "filename" unset + exec */
+ /* invoke callback, file selector "path" unset + exec */
int WM_operator_filesel (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
/* poll callback, context checks */
int WM_operator_winactive (struct bContext *C);
/* invoke callback, exec + redo popup */
-int WM_operator_redo (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+int WM_operator_props_popup (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
int WM_operator_redo_popup (struct bContext *C, struct wmOperator *op);
/* operator api */
void WM_operator_free (struct wmOperator *op);
void WM_operator_stack_clear(struct bContext *C);
-wmOperatorType *WM_operatortype_find(const char *idname);
+wmOperatorType *WM_operatortype_find(const char *idnamem, int quiet);
+wmOperatorType *WM_operatortype_exists(const char *idname);
wmOperatorType *WM_operatortype_first(void);
void WM_operatortype_append (void (*opfunc)(wmOperatorType*));
void WM_operatortype_append_ptr (void (*opfunc)(wmOperatorType*, void *), void *userdata);
int WM_operatortype_remove(const char *idname);
+wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag);
+wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char *idname);
+
+
+int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot);
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_call_py(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *properties, struct ReportList *reports);
+int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports);
void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring);
void WM_operator_properties_free(struct PointerRNA *ptr);
+void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type);
/* operator as a python command (resultuing string must be free'd) */
-char *WM_operator_pystring(struct wmOperator *op);
+char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args);
+void WM_operator_bl_idname(char *to, const char *from);
+void WM_operator_py_idname(char *to, const char *from);
/* default operator callbacks for border/circle/lasso */
int WM_border_select_invoke (struct bContext *C, struct wmOperator *op, struct wmEvent *event);
@@ -217,6 +246,5 @@ void WM_jobs_stop_all(struct wmWindowManager *wm);
char *WM_clipboard_text_get(int selection);
void WM_clipboard_text_set(char *buf, int selection);
-
#endif /* WM_API_H */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 9b987cdfa51..c24cf783063 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -40,8 +40,10 @@ struct wmWindowManager;
/* ************** wmOperatorType ************************ */
/* flag */
-#define OPTYPE_REGISTER 1
-#define OPTYPE_UNDO 2
+#define OPTYPE_REGISTER 1 /* register operators in stack after finishing */
+#define OPTYPE_UNDO 2 /* do undo push after after */
+#define OPTYPE_BLOCKING 4 /* let blender grab all input from the WM (X11) */
+#define OPTYPE_MACRO 8
/* context to call operator in for WM_operator_name_call */
/* rna_ui.c contains EnumPropertyItem's of these, keep in sync */
@@ -128,6 +130,10 @@ typedef struct wmNotifier {
#define NC_BRUSH (11<<24)
#define NC_TEXT (12<<24)
#define NC_WORLD (13<<24)
+#define NC_ANIMATION (14<<24)
+#define NC_SPACE (15<<24)
+#define NC_NODE (15<<24)
+#define NC_GEOM (16<<24)
/* data type, 256 entries is enough, it can overlap */
#define NOTE_DATA 0x00FF0000
@@ -139,8 +145,10 @@ typedef struct wmNotifier {
/* NC_SCREEN screen */
#define ND_SCREENBROWSE (1<<16)
-#define ND_SCREENCAST (2<<16)
-#define ND_ANIMPLAY (3<<16)
+#define ND_SCREENDELETE (2<<16)
+#define ND_SCREENCAST (3<<16)
+#define ND_ANIMPLAY (4<<16)
+#define ND_GPENCIL (5<<16)
/* NC_SCENE Scene */
#define ND_SCENEBROWSE (1<<16)
@@ -155,6 +163,7 @@ typedef struct wmNotifier {
#define ND_RENDER_RESULT (10<<16)
#define ND_COMPO_RESULT (11<<16)
#define ND_KEYINGSET (12<<16)
+#define ND_SCENEDELETE (13<<16)
/* NC_OBJECT Object */
#define ND_TRANSFORM (16<<16)
@@ -162,13 +171,12 @@ typedef struct wmNotifier {
#define ND_POSE (18<<16)
#define ND_BONE_ACTIVE (19<<16)
#define ND_BONE_SELECT (20<<16)
-#define ND_GEOM_SELECT (21<<16)
-#define ND_DRAW (22<<16)
-#define ND_MODIFIER (23<<16)
-#define ND_KEYS (24<<16)
-#define ND_GEOM_DATA (25<<16)
-#define ND_CONSTRAINT (26<<16)
-#define ND_PARTICLE (27<<16)
+#define ND_DRAW (21<<16)
+#define ND_MODIFIER (22<<16) /* modifiers edited */
+#define ND_KEYS (23<<16)
+#define ND_CONSTRAINT (24<<16) /* constraints edited */
+#define ND_PARTICLE_DATA (25<<16) /* particles edited */
+#define ND_PARTICLE_SELECT (26<<16) /* particles selecting change */
/* NC_MATERIAL Material */
#define ND_SHADING (30<<16)
@@ -182,6 +190,39 @@ typedef struct wmNotifier {
/* NC_TEXT Text */
#define ND_CURSOR (50<<16)
#define ND_DISPLAY (51<<16)
+
+ /* NC_ANIMATION Animato */
+#define ND_KEYFRAME_SELECT (70<<16)
+#define ND_KEYFRAME_EDIT (71<<16)
+#define ND_KEYFRAME_PROP (72<<16)
+#define ND_ANIMCHAN_SELECT (73<<16)
+#define ND_ANIMCHAN_EDIT (74<<16)
+#define ND_NLA_SELECT (75<<16)
+#define ND_NLA_EDIT (76<<16)
+#define ND_NLA_ACTCHANGE (77<<16)
+
+ /* NC_GEOM Geometry */
+ /* Mesh, Curve, MetaBall, Armature, .. */
+#define ND_SELECT (80<<16)
+#define ND_DATA (81<<16)
+
+ /* 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)
/* subtype, 256 entries too */
#define NOTE_SUBTYPE 0x0000FF00
@@ -235,12 +276,8 @@ typedef struct wmGesture {
} wmGesture;
/* ************** custom wmEvent data ************** */
-
-#define DEV_STYLUS 1
-#define DEV_ERASER 2
-
typedef struct wmTabletData {
- int Active; /* 0=None, 1=Stylus, 2=Eraser */
+ int Active; /* 0=EVT_TABLET_NONE, 1=EVT_TABLET_STYLUS, 2=EVT_TABLET_ERASER */
float Pressure; /* range 0.0 (not touching) to 1.0 (full pressure) */
float Xtilt; /* range 0.0 (upright) to 1.0 (tilted fully against the tablet surface) */
float Ytilt; /* as above */
@@ -256,10 +293,17 @@ typedef struct wmTimer {
double delta; /* time since previous step in seconds */
double ltime; /* internal, last time timer was activated */
+ double ntime; /* internal, next time we want to activate the timer */
+ double stime; /* internal, when the timer started */
int sleep; /* internal, put timers to sleep when needed */
} wmTimer;
+/* **************** Paint Cursor ******************* */
+
+typedef void (*wmPaintCursorDraw)(struct bContext *C, int, int, void *customdata);
+
+
/* ****************** Messages ********************* */
enum {
diff --git a/source/blender/windowmanager/intern/Makefile b/source/blender/windowmanager/intern/Makefile
index 8f0f47c52d0..f4d65975d43 100644
--- a/source/blender/windowmanager/intern/Makefile
+++ b/source/blender/windowmanager/intern/Makefile
@@ -44,7 +44,7 @@ CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
CPPFLAGS += -I$(NAN_GHOST)/include
CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include $(NAN_SDLCFLAGS)
+CPPFLAGS += $(NAN_SDLCFLAGS)
# modules
CPPFLAGS += -I../../editors/include
@@ -58,7 +58,6 @@ CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../blenloader
CPPFLAGS += -I../../gpu
CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../radiosity/extern/include
CPPFLAGS += -I../../../kernel/gen_system
CPPFLAGS += -I../../blenfont
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 7dec14664ae..4405b52888d 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -69,19 +69,29 @@ void WM_operator_free(wmOperator *op)
MEM_freeN(op->properties);
}
- if(op->reports) {
+ if(op->reports && (op->reports->flag & RPT_FREE)) {
BKE_reports_clear(op->reports);
MEM_freeN(op->reports);
}
+ if(op->macro.first) {
+ wmOperator *opm, *opmnext;
+ for(opm= op->macro.first; opm; opm= opmnext) {
+ opmnext = opm->next;
+ WM_operator_free(opm);
+ }
+ }
+
MEM_freeN(op);
}
/* all operations get registered in the windowmanager here */
/* called on event handling by event_system.c */
-void wm_operator_register(wmWindowManager *wm, wmOperator *op)
+void wm_operator_register(bContext *C, wmOperator *op)
{
+ wmWindowManager *wm= CTX_wm_manager(C);
int tot;
+ char *buf;
BLI_addtail(&wm->operators, op);
tot= BLI_countlist(&wm->operators);
@@ -92,6 +102,15 @@ void wm_operator_register(wmWindowManager *wm, wmOperator *op)
WM_operator_free(opt);
tot--;
}
+
+
+ /* Report the string representation of the operator */
+ buf = WM_operator_pystring(C, op->type, op->ptr, 1);
+ BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf);
+ MEM_freeN(buf);
+
+ /* so the console is redrawn */
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
}
@@ -109,6 +128,18 @@ void WM_operator_stack_clear(bContext *C)
/* ****************************************** */
+void WM_keymap_init(bContext *C)
+{
+ wmWindowManager *wm= CTX_wm_manager(C);
+
+ if(wm && CTX_py_init_get(C) && (wm->initialized & WM_INIT_KEYMAP) == 0) {
+ wm_window_keymap(wm);
+ ED_spacetypes_keymap(wm);
+
+ wm->initialized |= WM_INIT_KEYMAP;
+ }
+}
+
void wm_check(bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -125,13 +156,12 @@ void wm_check(bContext *C)
wm_window_add_ghostwindows(wm);
/* case: fileread */
- if(wm->initialized==0) {
+ if((wm->initialized & WM_INIT_WINDOW) == 0) {
- wm_window_keymap(wm);
- ED_spacetypes_keymap(wm);
+ WM_keymap_init(C);
ED_screens_initialize(wm);
- wm->initialized= 1;
+ wm->initialized |= WM_INIT_WINDOW;
}
}
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index 9b64ad6d38c..56a8d76d8bf 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -104,6 +104,13 @@ void WM_cursor_set(wmWindow *win, int curs)
return;
}
+#ifdef _WIN32
+ /* the default win32 cross cursor is barely visible,
+ * only 1 pixel thick, use another one instead */
+ if(curs==CURSOR_EDIT)
+ curs= BC_CROSSCURSOR;
+#endif
+
GHOST_SetCursorVisibility(win->ghostwin, 1);
win->cursor= curs;
@@ -156,6 +163,12 @@ void WM_cursor_wait(int val)
}
}
+void WM_cursor_grab(wmWindow *win, int val)
+{
+ if(win)
+ GHOST_SetCursorGrab(win->ghostwin, val);
+}
+
/* afer this you can call restore too */
void WM_timecursor(wmWindow *win, int nr)
{
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index ef89b2b35ad..1df567e3c92 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -574,8 +574,8 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
CTX_wm_area_set(C, sa);
CTX_wm_region_set(C, ar);
- wmSubWindowSet(win, ar->swinid);
- ED_region_pixelspace(ar);
+ /* make region ready for draw, scissor, pixelspace */
+ ED_region_set(C, ar);
wm_paintcursor_draw(C, ar);
CTX_wm_region_set(C, NULL);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index ea6a65859e5..af1339323f3 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -49,8 +49,10 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
+#include "BKE_pointcache.h"
#include "ED_fileselect.h"
+#include "ED_info.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_util.h"
@@ -128,7 +130,7 @@ static wmNotifier *wm_notifier_next(wmWindowManager *wm)
void wm_event_do_notifiers(bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
- wmNotifier *note;
+ wmNotifier *note, *next;
wmWindow *win;
if(wm==NULL)
@@ -140,7 +142,9 @@ void wm_event_do_notifiers(bContext *C)
CTX_wm_window_set(C, win);
- for(note= wm->queue.first; note; note= note->next) {
+ for(note= wm->queue.first; note; note= next) {
+ next= note->next;
+
if(note->category==NC_WM) {
if( ELEM(note->data, ND_FILEREAD, ND_FILESAVE)) {
wm->file_saved= 1;
@@ -155,16 +159,28 @@ void wm_event_do_notifiers(bContext *C)
ED_screen_set(C, note->reference); // XXX hrms, think this over!
printf("screen set %p\n", note->reference);
}
+ else if(note->data==ND_SCREENDELETE) {
+ ED_screen_delete(C, note->reference); // XXX hrms, think this over!
+ printf("screen delete %p\n", note->reference);
+ }
}
else if(note->category==NC_SCENE) {
if(note->data==ND_SCENEBROWSE) {
ED_screen_set_scene(C, note->reference); // XXX hrms, think this over!
printf("scene set %p\n", note->reference);
}
+ if(note->data==ND_SCENEDELETE) {
+ ED_screen_delete_scene(C, note->reference); // XXX hrms, think this over!
+ printf("scene delete %p\n", note->reference);
+ }
else if(note->data==ND_FRAME)
do_anim= 1;
}
}
+ if(ELEM4(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_SCENE)) {
+ ED_info_stats_clear(CTX_data_scene(C));
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL);
+ }
}
if(do_anim) {
/* depsgraph gets called, might send more notifiers */
@@ -234,6 +250,8 @@ void wm_event_do_notifiers(bContext *C)
for(base= scene->base.first; base; base= base->next) {
object_handle_update(scene, base->object);
}
+
+ BKE_ptcache_quick_cache_all(scene);
}
}
CTX_wm_window_set(C, NULL);
@@ -241,6 +259,26 @@ void wm_event_do_notifiers(bContext *C)
/* ********************* operators ******************* */
+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);
+
+ if(0==WM_operator_poll(C, ot))
+ return 0;
+ }
+
+ /* python needs operator type, so we added exception for it */
+ if(ot->pyop_poll)
+ return ot->pyop_poll(C, ot);
+ else if(ot->poll)
+ return ot->poll(C);
+
+ return 1;
+}
+
/* if repeat is true, it doesn't register again, nor does it free */
static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
{
@@ -249,7 +287,7 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
if(op==NULL || op->type==NULL)
return retval;
- if(op->type->poll && op->type->poll(C)==0)
+ if(0==WM_operator_poll(C, op->type))
return retval;
if(op->type->exec)
@@ -264,8 +302,8 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
ED_undo_push_op(C, op);
if(repeat==0) {
- if(op->type->flag & OPTYPE_REGISTER)
- wm_operator_register(CTX_wm_manager(C), op);
+ if((op->type->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG))
+ wm_operator_register(C, op);
else
WM_operator_free(op);
}
@@ -310,11 +348,31 @@ static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, P
/* initialize error reports */
if (reports) {
- op->reports= reports; /* must be initialized alredy */
+ op->reports= reports; /* must be initialized already */
}
else {
op->reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
- BKE_reports_init(op->reports, RPT_STORE);
+ BKE_reports_init(op->reports, RPT_STORE|RPT_FREE);
+ }
+
+ /* recursive filling of operator macro list */
+ if(ot->macro.first) {
+ static wmOperator *motherop= NULL;
+ wmOperatorTypeMacro *otmacro;
+
+ /* ensure all ops are in execution order in 1 list */
+ if(motherop==NULL)
+ motherop= op;
+
+ for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) {
+ wmOperatorType *otm= WM_operatortype_find(otmacro->idname, 0);
+ wmOperator *opm= wm_operator_create(wm, otm, otmacro->ptr, NULL);
+
+ BLI_addtail(&motherop->macro, opm);
+ opm->opm= motherop; /* pointer to mom, for modal() */
+ }
+
+ motherop= NULL;
}
return op;
@@ -322,7 +380,7 @@ static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, P
static void wm_operator_print(wmOperator *op)
{
- char *buf = WM_operator_pystring(op);
+ char *buf = WM_operator_pystring(NULL, op->type, op->ptr, 1);
printf("%s\n", buf);
MEM_freeN(buf);
}
@@ -337,13 +395,13 @@ static void wm_region_mouse_co(bContext *C, wmEvent *event)
}
}
-static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties)
+static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports)
{
wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_PASS_THROUGH;
- if(ot->poll==NULL || ot->poll(C)) {
- wmOperator *op= wm_operator_create(wm, ot, properties, NULL);
+ if(WM_operator_poll(C, ot)) {
+ wmOperator *op= wm_operator_create(wm, ot, properties, reports); /* if reports==NULL, theyll be initialized */
if((G.f & G_DEBUG) && event && event->type!=MOUSEMOVE)
printf("handle evt %d win %d op %s\n", event?event->type:0, CTX_wm_screen(C)->subwinactive, ot->idname);
@@ -357,7 +415,9 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P
else
printf("invalid operator call %s\n", ot->idname); /* debug, important to leave a while, should never happen */
- if(!(retval & OPERATOR_RUNNING_MODAL)) {
+ /* Note, if the report is given as an argument then assume the caller will deal with displaying them
+ * currently python only uses this */
+ if(!(retval & OPERATOR_RUNNING_MODAL) && reports==NULL) {
if(op->reports->list.first) /* only show the report if the report list was not given in the function */
uiPupMenuReports(C, op->reports);
@@ -370,23 +430,29 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P
if(ot->flag & OPTYPE_UNDO)
ED_undo_push_op(C, op);
- if(ot->flag & OPTYPE_REGISTER)
- wm_operator_register(wm, op);
+ if((ot->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG))
+ wm_operator_register(C, op);
else
WM_operator_free(op);
}
- else if(!(retval & OPERATOR_RUNNING_MODAL)) {
- WM_operator_free(op);
+ else if(retval & OPERATOR_RUNNING_MODAL) {
+ /* grab cursor during blocking modal ops (X11) */
+ if(ot->flag & OPTYPE_BLOCKING)
+ WM_cursor_grab(CTX_wm_window(C), 1);
}
+ else
+ WM_operator_free(op);
}
return retval;
}
-/* invokes operator in context */
-int WM_operator_name_call(bContext *C, const char *opstring, int context, PointerRNA *properties)
+/* WM_operator_name_call is the main accessor function
+ * 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)
{
- wmOperatorType *ot= WM_operatortype_find(opstring);
wmWindow *window= CTX_wm_window(C);
wmEvent *event;
@@ -414,7 +480,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
CTX_wm_region_set(C, ar1);
}
- retval= wm_operator_invoke(C, ot, event, properties);
+ retval= wm_operator_invoke(C, ot, event, properties, reports);
/* set region back */
CTX_wm_region_set(C, ar);
@@ -429,7 +495,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
ARegion *ar= CTX_wm_region(C);
CTX_wm_region_set(C, NULL);
- retval= wm_operator_invoke(C, ot, event, properties);
+ retval= wm_operator_invoke(C, ot, event, properties, reports);
CTX_wm_region_set(C, ar);
return retval;
@@ -444,7 +510,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
- retval= wm_operator_invoke(C, ot, window->eventstate, properties);
+ retval= wm_operator_invoke(C, ot, event, properties, reports);
CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area);
@@ -453,32 +519,51 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
case WM_OP_EXEC_DEFAULT:
event= NULL; /* pass on without break */
case WM_OP_INVOKE_DEFAULT:
- return wm_operator_invoke(C, ot, event, properties);
+ return wm_operator_invoke(C, ot, event, properties, reports);
}
}
return 0;
}
+
+/* invokes operator in context */
+int WM_operator_name_call(bContext *C, const char *opstring, int context, PointerRNA *properties)
+{
+ wmOperatorType *ot= WM_operatortype_find(opstring, 0);
+ if(ot)
+ return wm_operator_call_internal(C, ot, context, properties, NULL);
+
+ return 0;
+}
+
/* Similar to WM_operator_name_call called with WM_OP_EXEC_DEFAULT context.
- wmOperatorType is used instead of operator name since python alredy has the operator type
- poll() must be called by python before this runs.
- reports can be passed to this function (so python can report them as exceptions)
*/
-int WM_operator_call_py(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
+int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
{
- wmWindowManager *wm= CTX_wm_manager(C);
- wmOperator *op= wm_operator_create(wm, ot, properties, reports);
int retval= OPERATOR_CANCELLED;
-
+
+#if 0
+ wmOperator *op;
+ wmWindowManager *wm= CTX_wm_manager(C);
+ op= wm_operator_create(wm, ot, properties, reports);
+
if (op->type->exec)
retval= op->type->exec(C, op);
else
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);
- if (reports)
- op->reports= NULL; /* dont let the operator free reports passed to this function */
- WM_operator_free(op);
+ /* keep the reports around if needed later */
+ if (retval & OPERATOR_RUNNING_MODAL || ot->flag & OPTYPE_REGISTER)
+ {
+ reports->flag |= RPT_FREE;
+ }
return retval;
}
@@ -506,8 +591,12 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler)
for(sa= screen->areabase.first; sa; sa= sa->next)
if(sa==handler->op_area)
break;
- if(sa==NULL)
- printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname);
+ if(sa==NULL) {
+ /* when changing screen layouts with running modal handlers (like render display), this
+ is not an error to print */
+ if(handler->op==NULL)
+ printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname);
+ }
else {
ARegion *ar;
CTX_wm_area_set(C, sa);
@@ -545,6 +634,7 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
}
WM_operator_free(handler->op);
+ WM_cursor_grab(CTX_wm_window(C), 0);
}
else if(handler->ui_remove) {
ScrArea *area= CTX_wm_area(C);
@@ -614,9 +704,23 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
{
int kmitype= wm_userdef_event_map(kmi->type);
+ if(kmi->inactive) return 0;
+
+ /* exception for middlemouse emulation */
+ if((U.flag & USER_TWOBUTTONMOUSE) && (kmi->type == MIDDLEMOUSE)) {
+ if(winevent->type == LEFTMOUSE && winevent->alt) {
+ wmKeymapItem tmp= *kmi;
+
+ tmp.type= winevent->type;
+ tmp.alt= winevent->alt;
+ if(wm_eventmatch(winevent, &tmp))
+ return 1;
+ }
+ }
+
/* the matching rules */
if(kmitype==KM_TEXTINPUT)
- if(ISKEYBOARD(winevent->type)) return 1;
+ if(ISTEXTINPUT(winevent->type) && winevent->ascii) return 1;
if(kmitype!=KM_ANY)
if(winevent->type!=kmitype) return 0;
@@ -632,8 +736,15 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi)
if(winevent->alt != kmi->alt && !(winevent->alt & kmi->alt)) return 0;
if(kmi->oskey!=KM_ANY)
if(winevent->oskey != kmi->oskey && !(winevent->oskey & kmi->oskey)) return 0;
+
if(kmi->keymodifier)
if(winevent->keymodifier!=kmi->keymodifier) return 0;
+
+ /* key modifiers always check when event has it */
+ /* otherwise regular keypresses with keymodifier still work */
+ if(winevent->keymodifier)
+ if(ISTEXTINPUT(winevent->type))
+ if(winevent->keymodifier!=kmi->keymodifier) return 0;
return 1;
}
@@ -644,6 +755,22 @@ static int wm_event_always_pass(wmEvent *event)
return ELEM5(event->type, TIMER, TIMER0, TIMER1, TIMER2, TIMERJOBS);
}
+/* operator exists */
+static void wm_event_modalkeymap(wmOperator *op, wmEvent *event)
+{
+ if(op->type->modalkeymap) {
+ wmKeymapItem *kmi;
+
+ for(kmi= op->type->modalkeymap->keymap.first; kmi; kmi= kmi->next) {
+ if(wm_eventmatch(event, kmi)) {
+
+ event->type= EVT_MODAL_MAP;
+ event->val= kmi->propvalue;
+ }
+ }
+ }
+}
+
/* Warning: this function removes a modal handler, when finished */
static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHandler *handler, wmEvent *event, PointerRNA *properties)
{
@@ -660,8 +787,9 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
ARegion *region= CTX_wm_region(C);
wm_handler_op_context(C, handler);
-
wm_region_mouse_co(C, event);
+ wm_event_modalkeymap(op, event);
+
retval= ot->modal(C, op, event);
/* putting back screen context, reval can pass trough after modal failures! */
@@ -688,8 +816,8 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
if(ot->flag & OPTYPE_UNDO)
ED_undo_push_op(C, op);
- if(ot->flag & OPTYPE_REGISTER)
- wm_operator_register(CTX_wm_manager(C), op);
+ if((ot->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG))
+ wm_operator_register(C, op);
else
WM_operator_free(op);
handler->op= NULL;
@@ -701,6 +829,8 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
/* remove modal handler, operator itself should have been cancelled and freed */
if(retval & (OPERATOR_CANCELLED|OPERATOR_FINISHED)) {
+ WM_cursor_grab(CTX_wm_window(C), 0);
+
BLI_remlink(handlers, handler);
wm_event_free_handler(handler);
@@ -713,10 +843,10 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
printf("wm_handler_operator_call error\n");
}
else {
- wmOperatorType *ot= WM_operatortype_find(event->keymap_idname);
+ wmOperatorType *ot= WM_operatortype_find(event->keymap_idname, 0);
if(ot)
- retval= wm_operator_invoke(C, ot, event, properties);
+ retval= wm_operator_invoke(C, ot, event, properties, NULL);
}
if(retval & OPERATOR_PASS_THROUGH)
@@ -730,17 +860,20 @@ 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);
- int retval;
+ int retval, always_pass;
/* 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);
if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
+ /* in advance to avoid access to freed event on window close */
+ always_pass= wm_event_always_pass(event);
+
retval= handler->ui_handle(C, event, handler->ui_userdata);
/* putting back screen context */
- if((retval != WM_UI_HANDLER_BREAK) || wm_event_always_pass(event)) {
+ if((retval != WM_UI_HANDLER_BREAK) || always_pass) {
CTX_wm_area_set(C, area);
CTX_wm_region_set(C, region);
CTX_wm_menu_set(C, menu);
@@ -772,10 +905,7 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
switch(event->val) {
case EVT_FILESELECT_OPEN:
case EVT_FILESELECT_FULL_OPEN:
- {
- short flag =0; short display =FILE_SHORTDISPLAY; short filter =0; short sort =FILE_SORTALPHA;
- char *path= RNA_string_get_alloc(handler->op->ptr, "filename", NULL, 0);
-
+ {
if(event->val==EVT_FILESELECT_OPEN)
ED_area_newspace(C, handler->op_area, SPACE_FILE);
else
@@ -784,18 +914,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
/* settings for filebrowser, sfile is not operator owner but sends events */
sfile= (SpaceFile*)CTX_wm_space_data(C);
sfile->op= handler->op;
-
- /* XXX for now take the settings from the existing (previous) filebrowser
- should be stored in settings and passed via the operator */
- if (sfile->params) {
- flag = sfile->params->flag;
- filter = sfile->params->filter;
- display = sfile->params->display;
- sort = sfile->params->sort;
- }
- ED_fileselect_set_params(sfile, handler->op->type->name, path, flag, display, filter, sort);
- MEM_freeN(path);
+ ED_fileselect_set_params(sfile);
action= WM_HANDLER_BREAK;
}
@@ -806,7 +926,7 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
{
/* XXX validate area and region? */
bScreen *screen= CTX_wm_screen(C);
- char *path= RNA_string_get_alloc(handler->op->ptr, "filename", NULL, 0);
+ char *path= RNA_string_get_alloc(handler->op->ptr, "path", NULL, 0);
if(screen != handler->filescreen)
ED_screen_full_prevspace(C);
@@ -857,10 +977,22 @@ static int handler_boundbox_test(wmEventHandler *handler, wmEvent *event)
if(handler->bblocal) {
rcti rect= *handler->bblocal;
BLI_translate_rcti(&rect, handler->bbwin->xmin, handler->bbwin->ymin);
- return BLI_in_rcti(&rect, event->x, event->y);
+
+ if(BLI_in_rcti(&rect, event->x, event->y))
+ return 1;
+ else if(event->type==MOUSEMOVE && BLI_in_rcti(&rect, event->prevx, event->prevy))
+ return 1;
+ else
+ return 0;
+ }
+ else {
+ if(BLI_in_rcti(handler->bbwin, event->x, event->y))
+ return 1;
+ else if(event->type==MOUSEMOVE && BLI_in_rcti(handler->bbwin, event->prevx, event->prevy))
+ return 1;
+ else
+ return 0;
}
- else
- return BLI_in_rcti(handler->bbwin, event->x, event->y);
}
return 1;
}
@@ -869,31 +1001,37 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
{
wmEventHandler *handler, *nexthandler;
int action= WM_HANDLER_CONTINUE;
+ int always_pass;
if(handlers==NULL) return action;
-
+
/* modal handlers can get removed in this loop, we keep the loop this way */
for(handler= handlers->first; handler; handler= nexthandler) {
nexthandler= handler->next;
/* optional boundbox */
if(handler_boundbox_test(handler, event)) {
+ /* in advance to avoid access to freed event on window close */
+ always_pass= wm_event_always_pass(event);
/* modal+blocking handler */
if(handler->flag & WM_HANDLER_BLOCKING)
action= WM_HANDLER_BREAK;
if(handler->keymap) {
+ wmKeyMap *keymap= handler->keymap;
wmKeymapItem *kmi;
- for(kmi= handler->keymap->first; kmi; kmi= kmi->next) {
- if(wm_eventmatch(event, kmi)) {
-
- event->keymap_idname= kmi->idname; /* weak, but allows interactive callback to not use rawkey */
-
- action= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
- if(action==WM_HANDLER_BREAK) /* not wm_event_always_pass(event) here, it denotes removed handler */
- break;
+ if(!keymap->poll || keymap->poll(C)) {
+ for(kmi= keymap->keymap.first; kmi; kmi= kmi->next) {
+ if(wm_eventmatch(event, kmi)) {
+
+ event->keymap_idname= kmi->idname; /* weak, but allows interactive callback to not use rawkey */
+
+ action= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
+ if(action==WM_HANDLER_BREAK) /* not always_pass here, it denotes removed handler */
+ break;
+ }
}
}
}
@@ -909,8 +1047,12 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
action= wm_handler_operator_call(C, handlers, handler, event, NULL);
}
- if(!wm_event_always_pass(event) && action==WM_HANDLER_BREAK)
- break;
+ if(action==WM_HANDLER_BREAK) {
+ if(always_pass)
+ action= WM_HANDLER_CONTINUE;
+ else
+ break;
+ }
}
/* fileread case */
@@ -922,6 +1064,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
static int wm_event_inside_i(wmEvent *event, rcti *rect)
{
+ if(wm_event_always_pass(event))
+ return 1;
if(BLI_in_rcti(rect, event->x, event->y))
return 1;
if(event->type==MOUSEMOVE) {
@@ -1013,7 +1157,7 @@ void wm_event_do_handlers(bContext *C)
while( (event= win->queue.first) ) {
int action;
-
+
CTX_wm_window_set(C, win);
/* we let modal handlers get active area/region, also wm_paintcursor_test needs it */
@@ -1023,61 +1167,73 @@ void wm_event_do_handlers(bContext *C)
/* MVC demands to not draw in event handlers... but we need to leave it for ogl selecting etc */
wm_window_make_drawable(C, win);
- action= wm_handlers_do(C, event, &win->handlers);
+ /* first we do priority handlers, modal + some limited keymaps */
+ action= wm_handlers_do(C, event, &win->modalhandlers);
/* fileread case */
- if(CTX_wm_window(C)==NULL) {
+ if(CTX_wm_window(C)==NULL)
return;
- }
/* builtin tweak, if action is break it removes tweak */
- if(!wm_event_always_pass(event))
- wm_tweakevent_test(C, event, action);
-
- if(wm_event_always_pass(event) || action==WM_HANDLER_CONTINUE) {
+ wm_tweakevent_test(C, event, action);
+
+ if(action==WM_HANDLER_CONTINUE) {
ScrArea *sa;
ARegion *ar;
int doit= 0;
/* XXX to solve, here screen handlers? */
- if(!wm_event_always_pass(event)) {
- if(event->type==MOUSEMOVE) {
- /* state variables in screen, cursors */
- ED_screen_set_subwinactive(win, event);
- /* for regions having custom cursors */
- wm_paintcursor_test(C, event);
- }
+ if(event->type==MOUSEMOVE) {
+ /* state variables in screen, cursors */
+ ED_screen_set_subwinactive(win, event);
+ /* for regions having custom cursors */
+ wm_paintcursor_test(C, event);
}
-
+
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- if(wm_event_always_pass(event) || wm_event_inside_i(event, &sa->totrct)) {
-
+ if(wm_event_inside_i(event, &sa->totrct)) {
CTX_wm_area_set(C, sa);
- CTX_wm_region_set(C, NULL);
- action= wm_handlers_do(C, event, &sa->handlers);
- if(wm_event_always_pass(event) || action==WM_HANDLER_CONTINUE) {
+ if(action==WM_HANDLER_CONTINUE) {
for(ar=sa->regionbase.first; ar; ar= ar->next) {
- if(wm_event_always_pass(event) || wm_event_inside_i(event, &ar->winrct)) {
+ if(wm_event_inside_i(event, &ar->winrct)) {
CTX_wm_region_set(C, ar);
action= wm_handlers_do(C, event, &ar->handlers);
doit |= (BLI_in_rcti(&ar->winrct, event->x, event->y));
- if(!wm_event_always_pass(event)) {
- if(action==WM_HANDLER_BREAK)
- break;
- }
+ if(action==WM_HANDLER_BREAK)
+ break;
}
}
}
+
+ CTX_wm_region_set(C, NULL);
+
+ if(action==WM_HANDLER_CONTINUE)
+ action= wm_handlers_do(C, event, &sa->handlers);
+
+ CTX_wm_area_set(C, NULL);
+
/* NOTE: do not escape on WM_HANDLER_BREAK, mousemove needs handled for previous area */
}
}
+ if(action==WM_HANDLER_CONTINUE) {
+ /* also some non-modal handlers need active area/region */
+ CTX_wm_area_set(C, area_event_inside(C, event->x, event->y));
+ CTX_wm_region_set(C, region_event_inside(C, event->x, event->y));
+
+ action= wm_handlers_do(C, event, &win->handlers);
+
+ /* fileread case */
+ if(CTX_wm_window(C)==NULL)
+ return;
+ }
+
/* XXX hrmf, this gives reliable previous mouse coord for area change, feels bad?
doing it on ghost queue gives errors when mousemoves go over area borders */
- if(doit && win->screen->subwinactive != win->screen->mainwin) {
+ if(doit && win->screen && win->screen->subwinactive != win->screen->mainwin) {
win->eventstate->prevx= event->x;
win->eventstate->prevy= event->y;
}
@@ -1090,7 +1246,7 @@ void wm_event_do_handlers(bContext *C)
}
/* only add mousemove when queue was read entirely */
- if(win->addmousemove) {
+ if(win->addmousemove && win->eventstate) {
wmEvent event= *(win->eventstate);
event.type= MOUSEMOVE;
event.prevx= event.x;
@@ -1121,7 +1277,7 @@ void WM_event_fileselect_event(bContext *C, void *ophandle, int eventval)
}
}
-/* operator is supposed to have a filled "filename" property */
+/* operator is supposed to have a filled "path" property */
/* optional property: filetype (XXX enum?) */
/* Idea is to keep a handler alive on window queue, owning the operator.
@@ -1141,7 +1297,7 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
handler->op_region= CTX_wm_region(C);
handler->filescreen= CTX_wm_screen(C);
- BLI_addhead(&win->handlers, handler);
+ BLI_addhead(&win->modalhandlers, handler);
WM_event_fileselect_event(C, op, full?EVT_FILESELECT_FULL_OPEN:EVT_FILESELECT_OPEN);
}
@@ -1152,22 +1308,38 @@ void WM_event_set_handler_flag(wmEventHandler *handler, int flag)
handler->flag= flag;
}
-wmEventHandler *WM_event_add_modal_handler(bContext *C, ListBase *handlers, wmOperator *op)
+wmEventHandler *WM_event_add_modal_handler(bContext *C, wmOperator *op)
{
wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event modal handler");
- handler->op= op;
+ wmWindow *win= CTX_wm_window(C);
+
+ /* operator was part of macro */
+ if(op->opm) {
+ /* give the mother macro to the handler */
+ handler->op= op->opm;
+ /* mother macro opm becomes the macro element */
+ handler->op->opm= op;
+ }
+ else
+ handler->op= op;
+
handler->op_area= CTX_wm_area(C); /* means frozen screen context for modal handlers! */
handler->op_region= CTX_wm_region(C);
- BLI_addhead(handlers, handler);
+ BLI_addhead(&win->modalhandlers, handler);
return handler;
}
-wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap)
+wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
{
wmEventHandler *handler;
+ if(!keymap) {
+ printf("WM_event_add_keymap_handler called with NULL keymap\n");
+ return NULL;
+ }
+
/* only allow same keymap once */
for(handler= handlers->first; handler; handler= handler->next)
if(handler->keymap==keymap)
@@ -1181,7 +1353,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, ListBase *keymap
}
/* priorities not implemented yet, for time being just insert in begin of list */
-wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, ListBase *keymap, int priority)
+wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int priority)
{
wmEventHandler *handler;
@@ -1194,7 +1366,7 @@ wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, ListBas
return handler;
}
-wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBase *keymap, rcti *bblocal, rcti *bbwin)
+wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, wmKeyMap *keymap, rcti *bblocal, rcti *bbwin)
{
wmEventHandler *handler= WM_event_add_keymap_handler(handlers, keymap);
@@ -1205,7 +1377,7 @@ wmEventHandler *WM_event_add_keymap_handler_bb(ListBase *handlers, ListBase *key
return handler;
}
-void WM_event_remove_keymap_handler(ListBase *handlers, ListBase *keymap)
+void WM_event_remove_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
{
wmEventHandler *handler;
@@ -1358,10 +1530,10 @@ static void update_tablet_data(wmWindow *win, wmEvent *event)
const GHOST_TabletData *td= GHOST_GetTabletData(win->ghostwin);
/* if there's tablet data from an active tablet device then add it */
- if ((td != NULL) && td->Active) {
+ if ((td != NULL) && td->Active != GHOST_kTabletModeNone) {
struct wmTabletData *wmtab= MEM_mallocN(sizeof(wmTabletData), "customdata tablet");
- wmtab->Active = td->Active;
+ wmtab->Active = (int)td->Active;
wmtab->Pressure = td->Pressure;
wmtab->Xtilt = td->Xtilt;
wmtab->Ytilt = td->Ytilt;
@@ -1403,20 +1575,19 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
case GHOST_kEventButtonDown:
case GHOST_kEventButtonUp: {
GHOST_TEventButtonData *bd= customdata;
- event.val= (type==GHOST_kEventButtonDown);
+ event.val= (type==GHOST_kEventButtonDown) ? KM_PRESS:KM_RELEASE; /* Note!, this starts as 0/1 but later is converted to KM_PRESS/KM_RELEASE by tweak */
if (bd->button == GHOST_kButtonMaskLeft)
event.type= LEFTMOUSE;
else if (bd->button == GHOST_kButtonMaskRight)
event.type= RIGHTMOUSE;
+ else if (bd->button == GHOST_kButtonMaskButton4)
+ event.type= BUTTON4MOUSE;
+ else if (bd->button == GHOST_kButtonMaskButton5)
+ event.type= BUTTON5MOUSE;
else
event.type= MIDDLEMOUSE;
- if(event.val)
- event.keymodifier= evt->keymodifier= event.type;
- else
- event.keymodifier= evt->keymodifier= 0;
-
update_tablet_data(win, &event);
wm_event_add(win, &event);
@@ -1428,38 +1599,51 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
GHOST_TEventKeyData *kd= customdata;
event.type= convert_key(kd->key);
event.ascii= kd->ascii;
- event.val= (type==GHOST_kEventKeyDown); /* XXX eventmatch uses defines, bad code... */
+ event.val= (type==GHOST_kEventKeyDown)?KM_PRESS:KM_RELEASE;
/* exclude arrow keys, esc, etc from text input */
- if(type==GHOST_kEventKeyUp || (event.ascii<32 && event.ascii>14))
+ if(type==GHOST_kEventKeyUp || (event.ascii<32 && event.ascii>0))
event.ascii= '\0';
/* modifiers */
if (event.type==LEFTSHIFTKEY || event.type==RIGHTSHIFTKEY) {
- event.shift= evt->shift= event.val;
- if(event.val && (evt->ctrl || evt->alt || evt->oskey))
+ event.shift= evt->shift= (event.val==KM_PRESS);
+ if(event.val==KM_PRESS && (evt->ctrl || evt->alt || evt->oskey))
event.shift= evt->shift = 3; // define?
}
else if (event.type==LEFTCTRLKEY || event.type==RIGHTCTRLKEY) {
- event.ctrl= evt->ctrl= event.val;
- if(event.val && (evt->shift || evt->alt || evt->oskey))
+ event.ctrl= evt->ctrl= (event.val==KM_PRESS);
+ if(event.val==KM_PRESS && (evt->shift || evt->alt || evt->oskey))
event.ctrl= evt->ctrl = 3; // define?
}
else if (event.type==LEFTALTKEY || event.type==RIGHTALTKEY) {
- event.alt= evt->alt= event.val;
- if(event.val && (evt->ctrl || evt->shift || evt->oskey))
+ event.alt= evt->alt= (event.val==KM_PRESS);
+ if(event.val==KM_PRESS && (evt->ctrl || evt->shift || evt->oskey))
event.alt= evt->alt = 3; // define?
}
else if (event.type==COMMANDKEY) {
- event.oskey= evt->oskey= event.val;
- if(event.val && (evt->ctrl || evt->alt || evt->shift))
+ 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?
}
+ else {
+ if(event.val==KM_PRESS && event.keymodifier==0)
+ evt->keymodifier= event.type; /* only set in eventstate, for next event */
+ else if(event.val==KM_RELEASE && event.keymodifier==event.type)
+ event.keymodifier= evt->keymodifier= 0;
+ }
+
+ /* this case happens on some systems that on holding a key pressed,
+ generate press events without release, we still want to keep the
+ modifier in win->eventstate, but for the press event of the same
+ key we don't want the key modifier */
+ if(event.keymodifier == event.type)
+ event.keymodifier= 0;
- /* if test_break set, it catches this. Keep global for now? */
+ /* if test_break set, it catches this. XXX Keep global for now? */
if(event.type==ESCKEY)
G.afbreek= 1;
-
+
wm_event_add(win, &event);
break;
@@ -1492,4 +1676,3 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
break;
}
}
-
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index d13d8ec6ccc..9694a8fa1c6 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -37,8 +37,8 @@
#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
#endif
#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
-#include "BLI_winstuff.h"
#include <process.h> /* getpid */
+#include "BLI_winstuff.h"
#else
#include <unistd.h> /* getpid */
#endif
@@ -68,6 +68,7 @@
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_report.h"
+#include "BKE_sound.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -95,6 +96,7 @@
#include "wm.h"
#include "wm_window.h"
+static void writeBlog(void);
/* To be able to read files without windows closing, opening, moving
we try to prepare for worst case:
@@ -224,7 +226,7 @@ static void wm_init_userdef()
{
UI_init_userdef();
MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
-
+ sound_init();
}
void WM_read_file(bContext *C, char *name, ReportList *reports)
@@ -252,11 +254,13 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
wm_check(C); /* opens window(s), checks keymaps */
// XXX mainwindow_set_filename_to_title(G.main->name);
-// XXX sound_initialize_sounds();
if(retval==2) wm_init_userdef(); // in case a userdef is read from regular .blend
- if (retval!=0) G.relbase_valid = 1;
+ if (retval!=0) {
+ G.relbase_valid = 1;
+ writeBlog();
+ }
// XXX undo_editmode_clear();
BKE_reset_undo();
@@ -277,7 +281,7 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
/* called on startup, (context entirely filled with NULLs) */
-/* or called for 'Erase All' */
+/* or called for 'New File' */
/* op can be NULL */
int WM_read_homefile(bContext *C, wmOperator *op)
{
@@ -294,8 +298,6 @@ int WM_read_homefile(bContext *C, wmOperator *op)
G.relbase_valid = 0;
if (!from_memory) {
BLI_make_file_string(G.sce, tstr, home, ".B25.blend");
- if(!BLI_exists(tstr))
- BLI_make_file_string(G.sce, tstr, home, ".B.blend");
}
strcpy(scestr, G.sce); /* temporary store */
@@ -336,8 +338,8 @@ int WM_read_homefile(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
CTX_wm_window_set(C, NULL); /* exits queues */
-
- return success;
+
+ return OPERATOR_FINISHED;
}
@@ -386,7 +388,7 @@ void WM_read_autosavefile(bContext *C)
void read_Blog(void)
{
- char name[FILE_MAX], filename[FILE_MAX];
+ char name[FILE_MAX];
LinkNode *l, *lines;
struct RecentFile *recent;
char *line;
@@ -418,58 +420,6 @@ void read_Blog(void)
BLI_free_file_lines(lines);
-#ifdef WIN32
- /* Add the drive names to the listing */
- {
- __int64 tmp;
- char folder[MAX_PATH];
- char tmps[4];
- int i;
-
- tmp= GetLogicalDrives();
-
- for (i=2; i < 26; i++) {
- if ((tmp>>i) & 1) {
- tmps[0]='a'+i;
- tmps[1]=':';
- tmps[2]='\\';
- tmps[3]=0;
-
-// XX fsmenu_insert_entry(tmps, 0, 0);
- }
- }
-
- /* Adding Desktop and My Documents */
-// XXX fsmenu_append_separator();
-
- SHGetSpecialFolderPath(0, folder, CSIDL_PERSONAL, 0);
-// XXX fsmenu_insert_entry(folder, 0, 0);
- SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
-// XXX fsmenu_insert_entry(folder, 0, 0);
-
-// XXX fsmenu_append_separator();
- }
-#endif
-
- BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
- lines= BLI_read_file_as_lines(name);
-
- for (l= lines; l; l= l->next) {
- char *line= l->link;
-
- if (!BLI_streq(line, "")) {
-// XXX fsmenu_insert_entry(line, 0, 1);
- }
- }
-
-// XXX fsmenu_append_separator();
-
- /* add last saved file */
- BLI_split_dirfile(G.sce, name, filename); /* G.sce shouldn't be relative */
-
-// XXX fsmenu_insert_entry(name, 0, 0);
-
- BLI_free_file_lines(lines);
}
static void writeBlog(void)
@@ -541,7 +491,7 @@ static void do_history(char *name, ReportList *reports)
BKE_report(reports, RPT_ERROR, "Unable to make version backup");
}
-void WM_write_file(bContext *C, char *target, ReportList *reports)
+void WM_write_file(bContext *C, char *target, int compress, ReportList *reports)
{
Library *li;
int writeflags, len;
@@ -556,8 +506,6 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
}
/* send the OnSave event */
-// XXX if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript(&CTX_data_scene(C)->id, SCRIPT_ONSAVE);
-
for (li= G.main->library.first; li; li= li->id.next) {
if (BLI_streq(li->name, target)) {
BKE_report(reports, RPT_ERROR, "Cannot overwrite used library");
@@ -577,17 +525,18 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
// }
if (G.fileflags & G_AUTOPACK) {
- packAll();
+ packAll(G.main, reports);
}
ED_object_exit_editmode(C, 0);
do_history(di, reports);
- /* we use the UserDef to define compression flag */
- writeflags= G.fileflags & ~G_FILE_COMPRESS;
- if(U.flag & USER_FILECOMPRESS)
- writeflags |= G_FILE_COMPRESS;
+ writeflags= G.fileflags;
+
+ /* set compression flag */
+ if(compress) writeflags |= G_FILE_COMPRESS;
+ else writeflags &= ~G_FILE_COMPRESS;
if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) {
strcpy(G.sce, di);
@@ -595,6 +544,9 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
strcpy(G.main->name, di); /* is guaranteed current file */
G.save_over = 1; /* disable untitled.blend convention */
+
+ if(compress) G.fileflags |= G_FILE_COMPRESS;
+ else G.fileflags &= ~G_FILE_COMPRESS;
writeBlog();
}
@@ -605,11 +557,17 @@ void WM_write_file(bContext *C, char *target, ReportList *reports)
/* operator entry */
int WM_write_homefile(bContext *C, wmOperator *op)
{
+ wmWindow *win= CTX_wm_window(C);
char tstr[FILE_MAXDIR+FILE_MAXFILE];
int write_flags;
+ /* check current window and close it if temp */
+ if(win->screen->full == SCREENTEMP) {
+ wm_window_close(C, win);
+ }
+
BLI_make_file_string("/", tstr, BLI_gethome(), ".B25.blend");
-
+
/* force save as regular blend file */
write_flags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN);
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index c899d1d290e..05471329f32 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -236,7 +236,7 @@ static void wm_gesture_draw_cross(wmWindow *win, wmGesture *gt)
glDisable(GL_LINE_STIPPLE);
}
-/* called in wm_event_system.c */
+/* called in wm_draw.c */
void wm_gesture_draw(wmWindow *win)
{
wmGesture *gt= (wmGesture *)win->gesture.first;
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 0bc35ffa9b2..5c78b32f3f8 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -38,7 +38,6 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_sound_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
@@ -51,6 +50,7 @@
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_mball.h"
+#include "BKE_report.h"
#include "BKE_utildefines.h"
#include "BKE_packedFile.h"
@@ -89,17 +89,19 @@
#include "GPU_extensions.h"
#include "GPU_draw.h"
+#include "BKE_sound.h"
-
-/* XXX */
-static void sound_init_listener(void)
+static void wm_init_reports(bContext *C)
+{
+ BKE_reports_init(CTX_wm_reports(C), RPT_STORE);
+}
+static void wm_free_reports(bContext *C)
{
- G.listener = MEM_callocN(sizeof(bSoundListener), "soundlistener");
- G.listener->gain = 1.0;
- G.listener->dopplerfactor = 1.0;
- G.listener->dopplervelocity = 340.29f;
+ BKE_reports_clear(CTX_wm_reports(C));
}
+
+
/* only called once, for startup */
void WM_init(bContext *C)
{
@@ -124,13 +126,14 @@ void WM_init(bContext *C)
/* get the default database, plus a wm */
WM_read_homefile(C, NULL);
+ wm_init_reports(C); /* reports cant be initialized before the wm */
+
UI_init();
// clear_matcopybuf(); /* XXX */
// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- sound_init_listener();
// init_node_butfuncs();
ED_preview_init_dbase();
@@ -163,12 +166,15 @@ extern wchar_t *copybufinfo;
// XXX copy/paste buffer stuff...
extern void free_anim_copybuf();
+extern void free_posebuf();
/* called in creator.c even... tsk, split this! */
void WM_exit(bContext *C)
{
wmWindow *win;
-
+
+ sound_exit();
+
/* first wrap up running stuff, we assume only the active WM is running */
/* modal handlers are on window level freed, others too? */
/* note; same code copied in wm_files.c */
@@ -180,6 +186,7 @@ void WM_exit(bContext *C)
CTX_wm_window_set(C, win); /* needed by operator close callbacks */
WM_event_remove_handlers(C, &win->handlers);
+ WM_event_remove_handlers(C, &win->modalhandlers);
ED_screen_exit(C, win, win->screen);
}
}
@@ -193,7 +200,6 @@ void WM_exit(bContext *C)
// BIF_GlobalReebFree();
// BIF_freeRetarget();
BIF_freeTemplates(C);
- BIF_freeSketch(C);
free_ttfont(); /* bke_font.h */
@@ -201,21 +207,13 @@ void WM_exit(bContext *C)
BKE_freecubetable();
-// if (G.background == 0)
-// sound_end_all_sounds();
-
-
- /* before free_blender so py's gc happens while library still exists */
- /* needed at least for a rare sigsegv that can happen in pydrivers */
-#ifndef DISABLE_PYTHON
- BPY_end_python();
-#endif
-
fastshade_free_render(); /* shaded view */
ED_preview_free_dbase(); /* frees a Main dbase, before free_blender! */
+ wm_free_reports(C); /* before free_blender! - since the ListBases get freed there */
free_blender(); /* blender.c, does entire library and spacetypes */
// free_matcopybuf();
free_anim_copybuf();
+ free_posebuf();
// free_vertexpaint();
// free_imagepaint();
@@ -224,13 +222,22 @@ void WM_exit(bContext *C)
BLF_exit();
RE_FreeAllRender();
+ RE_engines_exit();
// free_txt_data();
-// sound_exit_audio();
- if(G.listener) MEM_freeN(G.listener);
-
-
+
+#ifndef DISABLE_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 */
+
+ /* 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();
+#endif
+
libtiff_exit();
#ifdef WITH_QUICKTIME
@@ -254,10 +261,14 @@ void WM_exit(bContext *C)
UI_exit();
BKE_userdef_free();
- RNA_exit();
+ RNA_exit(); /* should be after BPY_end_python so struct python slots are cleared */
+ wm_ghost_exit();
+
CTX_free(C);
+ SYS_DeleteSystem(SYS_GetSystem());
+
if(MEM_get_memory_blocks_in_use()!=0) {
printf("Error Totblock: %d\n", MEM_get_memory_blocks_in_use());
MEM_printmemlist();
@@ -274,9 +285,6 @@ void WM_exit(bContext *C)
}
#endif
-
- SYS_DeleteSystem(SYS_GetSystem());
-
exit(G.afbreek==1);
}
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 6dd150a3416..bef3268920d 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -252,29 +252,38 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
}
}
+/* stop job, free data completely */
+static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve)
+{
+ if(steve->running) {
+ /* signal job to end */
+ steve->stop= 1;
+ BLI_end_threads(&steve->threads);
+ }
+
+ if(steve->wt)
+ WM_event_remove_window_timer(steve->win, steve->wt);
+ if(steve->customdata)
+ steve->free(steve->customdata);
+ if(steve->run_customdata)
+ steve->run_free(steve->run_customdata);
+
+ /* remove steve */
+ BLI_remlink(&wm->jobs, steve);
+ MEM_freeN(steve);
+
+}
+
void WM_jobs_stop_all(wmWindowManager *wm)
{
- wmJob *steve= wm->jobs.first;
+ wmJob *steve;
- for(; steve; steve= steve->next) {
- if(steve->running) {
- /* signal job to end */
- steve->stop= 1;
- BLI_end_threads(&steve->threads);
- }
-
- if(steve->wt)
- WM_event_remove_window_timer(steve->win, steve->wt);
- if(steve->customdata)
- steve->free(steve->customdata);
- if(steve->run_customdata)
- steve->run_free(steve->run_customdata);
- }
+ while((steve= wm->jobs.first))
+ wm_jobs_kill_job(wm, steve);
- BLI_freelistN(&wm->jobs);
}
-/* stops job(s) from this owner */
+/* signal job(s) from this owner to stop, timer is required to get handled */
void WM_jobs_stop(wmWindowManager *wm, void *owner)
{
wmJob *steve;
@@ -285,6 +294,19 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner)
steve->stop= 1;
}
+/* kill job entirely, also removes timer itself */
+void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt)
+{
+ wmJob *steve;
+
+ for(steve= wm->jobs.first; steve; steve= steve->next) {
+ if(steve->wt==wt) {
+ wm_jobs_kill_job(wm, steve);
+ return;
+ }
+ }
+}
+
/* hardcoded to event TIMERJOBS */
static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt)
{
@@ -351,6 +373,7 @@ void WM_OT_jobs_timer(wmOperatorType *ot)
/* identifiers */
ot->name= "Jobs timer";
ot->idname= "WM_OT_jobs_timer";
+ ot->description="Jobs timer operator.";
/* api callbacks */
ot->invoke= wm_jobs_timer;
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 85028e3ea1a..7d25fb8172e 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -65,6 +65,8 @@ static void keymap_event_set(wmKeymapItem *kmi, short type, short val, int modif
}
else {
+ kmi->shift= kmi->ctrl= kmi->alt= kmi->oskey= 0;
+
/* defines? */
if(modifier & KM_SHIFT)
kmi->shift= 1;
@@ -94,17 +96,17 @@ static void keymap_properties_set(wmKeymapItem *kmi)
}
/* if item was added, then bail out */
-wmKeymapItem *WM_keymap_verify_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
+wmKeymapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, short type, short val, int modifier, short keymodifier)
{
wmKeymapItem *kmi;
- for(kmi= lb->first; kmi; kmi= kmi->next)
+ for(kmi= keymap->keymap.first; kmi; kmi= kmi->next)
if(strncmp(kmi->idname, idname, OP_MAX_TYPENAME)==0)
break;
if(kmi==NULL) {
kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
- BLI_addtail(lb, kmi);
+ BLI_addtail(&keymap->keymap, kmi);
BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
keymap_event_set(kmi, type, val, modifier, keymodifier);
@@ -114,11 +116,11 @@ wmKeymapItem *WM_keymap_verify_item(ListBase *lb, char *idname, short type, shor
}
/* always add item */
-wmKeymapItem *WM_keymap_add_item(ListBase *lb, char *idname, short type, short val, int modifier, short keymodifier)
+wmKeymapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, short type, short val, int modifier, short keymodifier)
{
wmKeymapItem *kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
- BLI_addtail(lb, kmi);
+ BLI_addtail(&keymap->keymap, kmi);
BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
keymap_event_set(kmi, type, val, modifier, keymodifier);
@@ -132,15 +134,15 @@ wmKeymapItem *WM_keymap_add_item(ListBase *lb, char *idname, short type, short v
space/region ids are same as DNA_space_types.h */
/* gets free'd in wm.c */
-ListBase *WM_keymap_listbase(wmWindowManager *wm, const char *nameid, int spaceid, int regionid)
+wmKeyMap *WM_keymap_find(wmWindowManager *wm, const char *nameid, short spaceid, short regionid)
{
wmKeyMap *km;
for(km= wm->keymaps.first; km; km= km->next)
if(km->spaceid==spaceid && km->regionid==regionid)
if(0==strncmp(nameid, km->nameid, KMAP_MAX_NAME))
- break;
-
+ return km;
+
if(km==NULL) {
km= MEM_callocN(sizeof(struct wmKeyMap), "keymap list");
BLI_strncpy(km->nameid, nameid, KMAP_MAX_NAME);
@@ -149,12 +151,59 @@ ListBase *WM_keymap_listbase(wmWindowManager *wm, const char *nameid, int spacei
BLI_addtail(&wm->keymaps, km);
}
- return &km->keymap;
+ return km;
+}
+
+/* ****************** modal keymaps ************ */
+
+/* modal maps get linked to a running operator, and filter the keys before sending to modal() callback */
+
+wmKeyMap *WM_modalkeymap_add(wmWindowManager *wm, const char *nameid, EnumPropertyItem *items)
+{
+ wmKeyMap *km= WM_keymap_find(wm, nameid, 0, 0);
+ km->is_modal= 1;
+ km->items= items;
+
+ return km;
+}
+
+wmKeyMap *WM_modalkeymap_get(wmWindowManager *wm, const char *nameid)
+{
+ wmKeyMap *km;
+
+ for(km= wm->keymaps.first; km; km= km->next)
+ if(km->is_modal)
+ if(0==strncmp(nameid, km->nameid, KMAP_MAX_NAME))
+ break;
+
+ return km;
}
+
+void WM_modalkeymap_add_item(wmKeyMap *km, short type, short val, int modifier, short keymodifier, short value)
+{
+ wmKeymapItem *kmi= MEM_callocN(sizeof(wmKeymapItem), "keymap entry");
+
+ BLI_addtail(&km->keymap, kmi);
+ kmi->propvalue= value;
+
+ keymap_event_set(kmi, type, val, modifier, keymodifier);
+}
+
+void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
+{
+ wmOperatorType *ot= WM_operatortype_find(opname, 0);
+
+ if(ot)
+ ot->modalkeymap= km;
+ else
+ printf("error: modalkeymap_assign, unknown operator %s\n", opname);
+}
+
+
/* ***************** get string from key events **************** */
-char *WM_key_event_string(short type)
+const char *WM_key_event_string(short type)
{
const char *name= NULL;
if(RNA_enum_name(event_type_items, (int)type, &name))
@@ -179,7 +228,7 @@ static char *wm_keymap_item_to_string(wmKeymapItem *kmi, char *str, int len)
strcat(buf, "Alt ");
if(kmi->oskey)
- strcat(buf, "OS ");
+ strcat(buf, "Cmd ");
strcat(buf, WM_key_event_string(kmi->type));
BLI_strncpy(str, buf, len);
@@ -187,53 +236,101 @@ static char *wm_keymap_item_to_string(wmKeymapItem *kmi, char *str, int len)
return str;
}
-static char *wm_keymap_item_find(ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, char *str, int len)
+static wmKeymapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, int compare_props)
{
wmEventHandler *handler;
+ wmKeyMap *keymap;
wmKeymapItem *kmi;
/* find keymap item in handlers */
- for(handler=handlers->first; handler; handler=handler->next)
- if(handler->keymap)
- for(kmi=handler->keymap->first; kmi; kmi=kmi->next)
- if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0])
- if(kmi->ptr && IDP_EqualsProperties(properties, kmi->ptr->data))
- return wm_keymap_item_to_string(kmi, str, len);
+ for(handler=handlers->first; handler; handler=handler->next) {
+ keymap= handler->keymap;
+
+ if(keymap && (!keymap->poll || keymap->poll((bContext*)C))) {
+ for(kmi=keymap->keymap.first; kmi; kmi=kmi->next) {
+ if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0]) {
+ if(compare_props) {
+ if(kmi->ptr && IDP_EqualsProperties(properties, kmi->ptr->data))
+ return kmi;
+ }
+ else
+ return kmi;
+ }
+ }
+ }
+ }
return NULL;
}
-char *WM_key_event_operator_string(const bContext *C, const char *opname, int opcontext, IDProperty *properties, char *str, int len)
+static wmKeymapItem *wm_keymap_item_find(const bContext *C, const char *opname, int opcontext, IDProperty *properties, int compare_props)
{
- char *found= NULL;
+ wmKeymapItem *found= NULL;
/* look into multiple handler lists to find the item */
if(CTX_wm_window(C))
- if((found= wm_keymap_item_find(&CTX_wm_window(C)->handlers, opname, opcontext, properties, str, len)))
- return found;
-
- if(CTX_wm_area(C))
- if((found= wm_keymap_item_find(&CTX_wm_area(C)->handlers, opname, opcontext, properties, str, len)))
- return found;
-
- if(ELEM(opcontext, WM_OP_EXEC_REGION_WIN, WM_OP_INVOKE_REGION_WIN)) {
- if(CTX_wm_area(C)) {
- ARegion *ar= CTX_wm_area(C)->regionbase.first;
- for(; ar; ar= ar->next)
- if(ar->regiontype==RGN_TYPE_WINDOW)
- break;
-
- if(ar)
- if((found= wm_keymap_item_find(&ar->handlers, opname, opcontext, properties, str, len)))
- return found;
+ found= wm_keymap_item_find_handlers(C, &CTX_wm_window(C)->handlers, opname, opcontext, properties, compare_props);
+
+
+ if(CTX_wm_area(C) && found==NULL)
+ found= wm_keymap_item_find_handlers(C, &CTX_wm_area(C)->handlers, opname, opcontext, properties, compare_props);
+
+ if(found==NULL) {
+ if(ELEM(opcontext, WM_OP_EXEC_REGION_WIN, WM_OP_INVOKE_REGION_WIN)) {
+ if(CTX_wm_area(C)) {
+ ARegion *ar= CTX_wm_area(C)->regionbase.first;
+ for(; ar; ar= ar->next)
+ if(ar->regiontype==RGN_TYPE_WINDOW)
+ break;
+
+ if(ar)
+ found= wm_keymap_item_find_handlers(C, &ar->handlers, opname, opcontext, properties, compare_props);
+ }
+ }
+ else {
+ if(CTX_wm_region(C))
+ found= wm_keymap_item_find_handlers(C, &CTX_wm_region(C)->handlers, opname, opcontext, properties, compare_props);
}
}
- else {
- if(CTX_wm_region(C))
- if((found= wm_keymap_item_find(&CTX_wm_region(C)->handlers, opname, opcontext, properties, str, len)))
- return found;
+
+ return found;
+}
+
+char *WM_key_event_operator_string(const bContext *C, const char *opname, int opcontext, IDProperty *properties, char *str, int len)
+{
+ wmKeymapItem *found= wm_keymap_item_find(C, opname, opcontext, properties, 1);
+
+ if(!found)
+ found= wm_keymap_item_find(C, opname, opcontext, properties, 0);
+
+ if(found) {
+ wm_keymap_item_to_string(found, str, len);
+ return str;
}
return NULL;
}
+/* searches context and changes keymap item, if found */
+void WM_key_event_operator_change(const bContext *C, const char *opname, int opcontext, IDProperty *properties, short key, short modifier)
+{
+ wmKeymapItem *found= wm_keymap_item_find(C, opname, opcontext, properties, 1);
+
+ if(!found)
+ found= wm_keymap_item_find(C, opname, opcontext, properties, 0);
+
+ if(found) {
+ keymap_event_set(found, key, KM_PRESS, modifier, 0);
+ }
+}
+
+/* ********************* */
+
+int WM_key_event_is_tweak(short type)
+{
+ if(type>=EVT_TWEAK_L && type<=EVT_GESTURE)
+ return 1;
+ return 0;
+}
+
+
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 410cd11f1bf..486a887b354 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -30,8 +30,11 @@
#define _USE_MATH_DEFINES
#include <math.h>
#include <string.h>
+#include <ctype.h>
+#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"
@@ -44,12 +47,16 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h" /*for WM_operator_pystring */
+#include "BLO_readfile.h"
+
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_depsgraph.h"
#include "BKE_idprop.h"
#include "BKE_library.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_utildefines.h"
@@ -82,15 +89,40 @@ static ListBase global_ops= {NULL, NULL};
/* ************ operator API, exported ********** */
-wmOperatorType *WM_operatortype_find(const char *idname)
+
+wmOperatorType *WM_operatortype_find(const char *idname, int quiet)
{
wmOperatorType *ot;
- for(ot= global_ops.first; ot; ot= ot->next) {
- if(strncmp(ot->idname, idname, OP_MAX_TYPENAME)==0)
- return ot;
+ char idname_bl[OP_MAX_TYPENAME]; // XXX, needed to support python style names without the _OT_ syntax
+ WM_operator_bl_idname(idname_bl, idname);
+
+ if (idname_bl[0]) {
+ for(ot= global_ops.first; ot; ot= ot->next) {
+ if(strncmp(ot->idname, idname_bl, OP_MAX_TYPENAME)==0)
+ return ot;
+ }
+ }
+
+ if(!quiet)
+ printf("search for unknown operator %s, %s\n", idname_bl, idname);
+
+ return NULL;
+}
+
+wmOperatorType *WM_operatortype_exists(const char *idname)
+{
+ wmOperatorType *ot;
+
+ char idname_bl[OP_MAX_TYPENAME]; // XXX, needed to support python style names without the _OT_ syntax
+ WM_operator_bl_idname(idname_bl, idname);
+
+ if(idname_bl[0]) {
+ for(ot= global_ops.first; ot; ot= ot->next) {
+ if(strncmp(ot->idname, idname_bl, OP_MAX_TYPENAME)==0)
+ return ot;
+ }
}
- printf("search for unknown operator %s\n", idname);
return NULL;
}
@@ -107,7 +139,14 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType*))
ot= MEM_callocN(sizeof(wmOperatorType), "operatortype");
ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
opfunc(ot);
- RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:""); // XXX All ops should have a description but for now allow them not to.
+
+ if(ot->name==NULL) {
+ static char dummy_name[] = "Dummy Name";
+ fprintf(stderr, "ERROR: Operator %s has no name property!\n", ot->idname);
+ ot->name= dummy_name;
+ }
+
+ RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)"); // XXX All ops should have a description but for now allow them not to.
RNA_def_struct_identifier(ot->srna, ot->idname);
BLI_addtail(&global_ops, ot);
}
@@ -119,57 +158,271 @@ void WM_operatortype_append_ptr(void (*opfunc)(wmOperatorType*, void*), void *us
ot= MEM_callocN(sizeof(wmOperatorType), "operatortype");
ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
opfunc(ot, userdata);
- RNA_def_struct_ui_text(ot->srna, ot->name, "DOC_BROKEN"); /* TODO - add a discription to wmOperatorType? */
+ RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)");
RNA_def_struct_identifier(ot->srna, ot->idname);
BLI_addtail(&global_ops, ot);
}
+/* ********************* macro operator ******************** */
+
+/* macro exec only runs exec calls */
+static int wm_macro_exec(bContext *C, wmOperator *op)
+{
+ wmOperator *opm;
+ int retval= OPERATOR_FINISHED;
+
+// printf("macro exec %s\n", op->type->idname);
+
+ for(opm= op->macro.first; opm; opm= opm->next) {
+
+ if(opm->type->exec) {
+// printf("macro exec %s\n", opm->type->idname);
+ retval= opm->type->exec(C, opm);
+
+ if(!(retval & OPERATOR_FINISHED))
+ break;
+ }
+ }
+// if(opm)
+// printf("macro ended not finished\n");
+// else
+// printf("macro end\n");
+
+ return retval;
+}
+
+static int wm_macro_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ wmOperator *opm;
+ int retval= OPERATOR_FINISHED;
+
+// printf("macro invoke %s\n", op->type->idname);
+
+ for(opm= op->macro.first; opm; opm= opm->next) {
+
+ if(opm->type->invoke)
+ retval= opm->type->invoke(C, opm, event);
+ else if(opm->type->exec)
+ retval= opm->type->exec(C, opm);
+
+ if(!(retval & OPERATOR_FINISHED))
+ break;
+ }
+
+// if(opm)
+// printf("macro ended not finished\n");
+// else
+// printf("macro end\n");
+
+
+ return retval;
+}
+
+static int wm_macro_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+// printf("macro modal %s\n", op->type->idname);
+
+ if(op->opm==NULL)
+ printf("macro error, calling NULL modal()\n");
+ else {
+// printf("macro modal %s\n", op->opm->type->idname);
+ return op->opm->type->modal(C, op->opm, event);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+/* Names have to be static for now */
+wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag)
+{
+ wmOperatorType *ot;
+
+ if(WM_operatortype_exists(idname)) {
+ printf("Macro error: operator %s exists\n", idname);
+ return NULL;
+ }
+
+ ot= MEM_callocN(sizeof(wmOperatorType), "operatortype");
+ ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
+
+ ot->idname= idname;
+ ot->name= name;
+ ot->flag= OPTYPE_MACRO|flag;
+
+ ot->exec= wm_macro_exec;
+ ot->invoke= wm_macro_invoke;
+ ot->modal= wm_macro_modal;
+ ot->poll= NULL;
+
+ RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)"); // XXX All ops should have a description but for now allow them not to.
+ RNA_def_struct_identifier(ot->srna, ot->idname);
+
+ BLI_addtail(&global_ops, ot);
+
+ return ot;
+}
+
+wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char *idname)
+{
+ wmOperatorTypeMacro *otmacro= MEM_callocN(sizeof(wmOperatorTypeMacro), "wmOperatorTypeMacro");
+
+ BLI_strncpy(otmacro->idname, idname, OP_MAX_TYPENAME);
+
+ /* do this on first use, since operatordefinitions might have been not done yet */
+// otmacro->ptr= MEM_callocN(sizeof(PointerRNA), "optype macro ItemPtr");
+// WM_operator_properties_create(otmacro->ptr, idname);
+
+ BLI_addtail(&ot->macro, otmacro);
+
+ return otmacro;
+}
+
+static void wm_operatortype_free_macro(wmOperatorType *ot)
+{
+ wmOperatorTypeMacro *otmacro;
+
+ for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) {
+ if(otmacro->ptr) {
+ WM_operator_properties_free(otmacro->ptr);
+ MEM_freeN(otmacro->ptr);
+ }
+ }
+ BLI_freelistN(&ot->macro);
+}
+
+
int WM_operatortype_remove(const char *idname)
{
- wmOperatorType *ot = WM_operatortype_find(idname);
+ wmOperatorType *ot = WM_operatortype_find(idname, 0);
if (ot==NULL)
return 0;
BLI_remlink(&global_ops, ot);
RNA_struct_free(&BLENDER_RNA, ot->srna);
+
+ if(ot->macro.first)
+ wm_operatortype_free_macro(ot);
+
MEM_freeN(ot);
return 1;
}
+/* SOME_OT_op -> some.op */
+void WM_operator_py_idname(char *to, const char *from)
+{
+ char *sep= strstr(from, "_OT_");
+ if(sep) {
+ int i, ofs= (sep-from);
+
+ for(i=0; i<ofs; i++)
+ to[i]= tolower(from[i]);
+
+ to[ofs] = '.';
+ BLI_strncpy(to+(ofs+1), sep+4, OP_MAX_TYPENAME);
+ }
+ else {
+ /* should not happen but support just incase */
+ BLI_strncpy(to, from, OP_MAX_TYPENAME);
+ }
+}
+
+/* some.op -> SOME_OT_op */
+void WM_operator_bl_idname(char *to, const char *from)
+{
+ if (from) {
+ char *sep= strchr(from, '.');
+
+ if(sep) {
+ int i, ofs= (sep-from);
+
+ for(i=0; i<ofs; i++)
+ to[i]= toupper(from[i]);
+
+ BLI_strncpy(to+ofs, "_OT_", OP_MAX_TYPENAME);
+ BLI_strncpy(to+(ofs+4), sep+1, OP_MAX_TYPENAME);
+ }
+ else {
+ /* should not happen but support just incase */
+ BLI_strncpy(to, from, OP_MAX_TYPENAME);
+ }
+ }
+ else
+ to[0]= 0;
+}
+
/* print a string representation of the operator, with the args that it runs
- * so python can run it again */
-char *WM_operator_pystring(wmOperator *op)
+ * so python can run it again,
+ *
+ * When calling from an existing wmOperator do.
+ * WM_operator_pystring(op->type, op->ptr);
+ */
+char *WM_operator_pystring(bContext *C, wmOperatorType *ot, PointerRNA *opptr, int all_args)
{
const char *arg_name= NULL;
+ char idname_py[OP_MAX_TYPENAME];
PropertyRNA *prop, *iterprop;
/* for building the string */
DynStr *dynstr= BLI_dynstr_new();
char *cstring, *buf;
- int first_iter=1;
+ int first_iter=1, ok= 1;
- BLI_dynstr_appendf(dynstr, "%s(", op->idname);
- iterprop= RNA_struct_iterator_property(op->ptr->type);
+ /* only to get the orginal props for comparisons */
+ PointerRNA opptr_default;
+ PropertyRNA *prop_default;
+ char *buf_default;
+ if(!all_args) {
+ WM_operator_properties_create(&opptr_default, ot->idname);
+ }
+
+
+ WM_operator_py_idname(idname_py, ot->idname);
+ BLI_dynstr_appendf(dynstr, "bpy.ops.%s(", idname_py);
- RNA_PROP_BEGIN(op->ptr, propptr, iterprop) {
+ iterprop= RNA_struct_iterator_property(opptr->type);
+
+ RNA_PROP_BEGIN(opptr, propptr, iterprop) {
prop= propptr.data;
arg_name= RNA_property_identifier(prop);
if (strcmp(arg_name, "rna_type")==0) continue;
- buf= RNA_property_as_string(op->ptr, prop);
+ buf= RNA_property_as_string(C, opptr, prop);
- BLI_dynstr_appendf(dynstr, first_iter?"%s=%s":", %s=%s", arg_name, buf);
+ ok= 1;
+
+ if(!all_args) {
+ /* not verbose, so only add in attributes that use non-default values
+ * slow but good for tooltips */
+ prop_default= RNA_struct_find_property(&opptr_default, arg_name);
+
+ if(prop_default) {
+ buf_default= RNA_property_as_string(C, &opptr_default, prop_default);
+
+ if(strcmp(buf, buf_default)==0)
+ ok= 0; /* values match, dont bother printing */
+
+ MEM_freeN(buf_default);
+ }
+
+ }
+ if(ok) {
+ BLI_dynstr_appendf(dynstr, first_iter?"%s=%s":", %s=%s", arg_name, buf);
+ first_iter = 0;
+ }
MEM_freeN(buf);
- first_iter = 0;
+
}
RNA_PROP_END;
+ if(all_args==0)
+ WM_operator_properties_free(&opptr_default);
+
BLI_dynstr_append(dynstr, ")");
cstring = BLI_dynstr_get_cstring(dynstr);
@@ -179,7 +432,7 @@ char *WM_operator_pystring(wmOperator *op)
void WM_operator_properties_create(PointerRNA *ptr, const char *opstring)
{
- wmOperatorType *ot= WM_operatortype_find(opstring);
+ wmOperatorType *ot= WM_operatortype_find(opstring, 0);
if(ot)
RNA_pointer_create(NULL, ot->srna, NULL, ptr);
@@ -200,13 +453,24 @@ void WM_operator_properties_free(PointerRNA *ptr)
/* ************ default op callbacks, exported *********** */
/* invoke callback, uses enum property named "type" */
-/* only weak thing is the fixed property name... */
int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- PropertyRNA *prop= RNA_struct_find_property(op->ptr, "type");
+ PropertyRNA *prop;
uiPopupMenu *pup;
uiLayout *layout;
+ prop= RNA_struct_find_property(op->ptr, "type");
+
+ if(!prop) {
+ RNA_STRUCT_BEGIN(op->ptr, findprop) {
+ if(RNA_property_type(findprop) == PROP_ENUM) {
+ prop= findprop;
+ break;
+ }
+ }
+ RNA_STRUCT_END;
+ }
+
if(prop==NULL) {
printf("WM_menu_invoke: %s has no \"type\" enum property\n", op->type->idname);
}
@@ -216,7 +480,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
else {
pup= uiPupMenuBegin(C, op->type->name, 0);
layout= uiPupMenuLayout(pup);
- uiItemsEnumO(layout, op->type->idname, "type");
+ uiItemsEnumO(layout, op->type->idname, (char*)RNA_property_identifier(prop));
uiPupMenuEnd(C, pup);
}
@@ -237,10 +501,10 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-/* op->invoke, opens fileselect if filename property not set, otherwise executes */
+/* op->invoke, opens fileselect if path property not set, otherwise executes */
int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event)
{
- if (RNA_property_is_set(op->ptr, "filename")) {
+ if (RNA_property_is_set(op->ptr, "path")) {
return WM_operator_call(C, op);
}
else {
@@ -249,6 +513,27 @@ int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event)
}
}
+/* default properties for fileselect */
+void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type)
+{
+ RNA_def_string_file_path(ot->srna, "path", "", FILE_MAX, "FilePath", "Path to file.");
+ RNA_def_string_file_name(ot->srna, "filename", "", FILE_MAX, "FileName", "Name of the file.");
+ RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Directory of the file.");
+
+ RNA_def_boolean(ot->srna, "filter_blender", (filter & BLENDERFILE), "Filter .blend files", "");
+ RNA_def_boolean(ot->srna, "filter_image", (filter & IMAGEFILE), "Filter image files", "");
+ RNA_def_boolean(ot->srna, "filter_movie", (filter & MOVIEFILE), "Filter movie files", "");
+ RNA_def_boolean(ot->srna, "filter_python", (filter & PYSCRIPTFILE), "Filter python files", "");
+ RNA_def_boolean(ot->srna, "filter_font", (filter & FTFONTFILE), "Filter font files", "");
+ RNA_def_boolean(ot->srna, "filter_sound", (filter & SOUNDFILE), "Filter sound files", "");
+ RNA_def_boolean(ot->srna, "filter_text", (filter & TEXTFILE), "Filter text files", "");
+ RNA_def_boolean(ot->srna, "filter_folder", (filter & FOLDERFILE), "Filter folders", "");
+
+ RNA_def_int(ot->srna, "filemode", type, FILE_LOADLIB, FILE_SPECIAL,
+ "File Browser Mode", "The setting for the file browser mode to load a .blend file, a library or a special file.",
+ FILE_LOADLIB, FILE_SPECIAL);
+}
+
/* op->poll */
int WM_operator_winactive(bContext *C)
{
@@ -257,12 +542,12 @@ int WM_operator_winactive(bContext *C)
}
/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
+static void redo_cb(bContext *C, void *arg_op, int event)
{
wmOperator *lastop= arg_op;
if(lastop) {
- ED_undo_pop(C);
+ ED_undo_pop_op(C, lastop);
WM_operator_repeat(C, lastop);
}
}
@@ -279,7 +564,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
block= uiBeginBlock(C, ar, "redo_popup", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
- uiBlockSetFunc(block, redo_cb, arg_op, NULL);
+ uiBlockSetHandleFunc(block, redo_cb, arg_op);
if(!op->properties) {
IDPropertyTemplate val = {0};
@@ -288,7 +573,12 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
- uiDefAutoButsRNA(C, layout, &ptr, 2);
+ uiItemL(layout, op->type->name, 0);
+
+ if(op->type->ui)
+ op->type->ui((bContext*)C, &ptr, layout);
+ else
+ uiDefAutoButsRNA(C, layout, &ptr, 2);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -296,7 +586,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
return block;
}
-int WM_operator_redo(bContext *C, wmOperator *op, wmEvent *event)
+int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *event)
{
int retval= OPERATOR_CANCELLED;
@@ -330,7 +620,12 @@ static uiBlock *wm_block_create_menu(bContext *C, ARegion *ar, void *arg_op)
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
- uiDefAutoButsRNA(C, layout, op->ptr, 2);
+ uiItemL(layout, op->type->name, 0);
+
+ if(op->type->ui)
+ op->type->ui(C, op->ptr, layout);
+ else
+ uiDefAutoButsRNA(C, layout, op->ptr, 2);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -362,6 +657,7 @@ static void WM_OT_debug_menu(wmOperatorType *ot)
{
ot->name= "Debug Menu";
ot->idname= "WM_OT_debug_menu";
+ ot->description= "Open a popup to set the debug level.";
ot->invoke= wm_debug_menu_invoke;
ot->exec= wm_debug_menu_exec;
@@ -386,7 +682,7 @@ static void operator_search_cb(const struct bContext *C, void *arg, char *str, u
for(; ot; ot= ot->next) {
if(BLI_strcasestr(ot->name, str)) {
- if(ot->poll==NULL || ot->poll((bContext *)C)) {
+ if(WM_operator_poll((bContext*)C, ot)) {
char name[256];
int len= strlen(ot->name);
@@ -418,7 +714,7 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *arg_op)
uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_RET_1);
but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 10, 180, 19, "");
- uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb);
+ uiButSetSearchFunc(but, operator_search_cb, NULL, operator_call_cb, NULL);
/* fake button, it holds space for search items */
uiDefBut(block, LABEL, 0, "", 10, 10 - uiSearchBoxhHeight(), 180, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
@@ -450,6 +746,16 @@ static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
+/* op->poll */
+static int wm_search_menu_poll(bContext *C)
+{
+ if(CTX_wm_window(C)==NULL) return 0;
+ if(CTX_wm_area(C) && CTX_wm_area(C)->spacetype==SPACE_CONSOLE) return 0; // XXX - so we can use the shortcut in the console
+ if(CTX_wm_area(C) && CTX_wm_area(C)->spacetype==SPACE_TEXT) return 0; // XXX - so we can use the spacebar in the text editor
+ if(CTX_data_edit_object(C) && CTX_data_edit_object(C)->type==OB_CURVE) return 0; // XXX - so we can use the spacebar for entering text
+ return 1;
+}
+
static void WM_OT_search_menu(wmOperatorType *ot)
{
ot->name= "Search Menu";
@@ -457,7 +763,7 @@ static void WM_OT_search_menu(wmOperatorType *ot)
ot->invoke= wm_search_menu_invoke;
ot->exec= wm_search_menu_exec;
- ot->poll= WM_operator_winactive;
+ ot->poll= wm_search_menu_poll;
}
@@ -467,8 +773,8 @@ static void WM_OT_window_duplicate(wmOperatorType *ot)
{
ot->name= "Duplicate Window";
ot->idname= "WM_OT_window_duplicate";
-
- ot->invoke= WM_operator_confirm;
+ ot->description="Duplicate the current Blender window.";
+
ot->exec= wm_window_duplicate_op;
ot->poll= WM_operator_winactive;
}
@@ -477,7 +783,8 @@ static void WM_OT_save_homefile(wmOperatorType *ot)
{
ot->name= "Save User Settings";
ot->idname= "WM_OT_save_homefile";
-
+ ot->description="Make the current file the default .blend file.";
+
ot->invoke= WM_operator_confirm;
ot->exec= WM_write_homefile;
ot->poll= WM_operator_winactive;
@@ -487,6 +794,7 @@ static void WM_OT_read_homefile(wmOperatorType *ot)
{
ot->name= "Reload Start-Up File";
ot->idname= "WM_OT_read_homefile";
+ ot->description="Open the default file (doesn't save the current file).";
ot->invoke= WM_operator_confirm;
ot->exec= WM_read_homefile;
@@ -500,7 +808,7 @@ static void WM_OT_read_homefile(wmOperatorType *ot)
static int recentfile_exec(bContext *C, wmOperator *op)
{
- int event= RNA_int_get(op->ptr, "nr");
+ int event= RNA_enum_get(op->ptr, "file");
// XXX wm in context is not set correctly after WM_read_file -> crash
// do it before for now, but is this correct with multiple windows?
@@ -511,7 +819,7 @@ static int recentfile_exec(bContext *C, wmOperator *op)
WM_read_file(C, G.sce, op->reports);
}
else {
- struct RecentFile *recent = BLI_findlink(&(G.recent_files), event-2);
+ struct RecentFile *recent = BLI_findlink(&(G.recent_files), event-1);
if(recent) {
WM_event_add_notifier(C, NC_WINDOW, NULL);
WM_read_file(C, recent->filename, op->reports);
@@ -523,59 +831,69 @@ static int recentfile_exec(bContext *C, wmOperator *op)
static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- struct RecentFile *recent;
uiPopupMenu *pup;
uiLayout *layout;
- int i, ofs= 0;
pup= uiPupMenuBegin(C, "Open Recent", 0);
layout= uiPupMenuLayout(pup);
-
- if(G.sce[0]) {
- uiItemIntO(layout, G.sce, 0, op->type->idname, "nr", 1);
- ofs = 1;
- }
-
- for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++)
- if(strcmp(recent->filename, G.sce))
- uiItemIntO(layout, recent->filename, 0, op->type->idname, "nr", i+ofs+1);
-
+ uiItemsEnumO(layout, op->type->idname, "file");
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
+static EnumPropertyItem *open_recentfile_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ EnumPropertyItem tmp = {0, "", 0, "", ""};
+ EnumPropertyItem *item= NULL;
+ struct RecentFile *recent;
+ int totitem= 0, i;
+
+ /* dynamically construct enum */
+ for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++) {
+ tmp.value= i+1;
+ tmp.identifier= recent->filename;
+ tmp.name= BLI_short_filename(recent->filename);
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
static void WM_OT_open_recentfile(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+ static EnumPropertyItem file_items[]= {
+ {0, NULL, 0, NULL, NULL}};
+
ot->name= "Open Recent File";
ot->idname= "WM_OT_open_recentfile";
+ ot->description="Open recent files list.";
ot->invoke= wm_recentfile_invoke;
ot->exec= recentfile_exec;
ot->poll= WM_operator_winactive;
- RNA_def_property(ot->srna, "nr", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_enum(ot->srna, "file", file_items, 1, "File", "");
+ RNA_def_enum_funcs(prop, open_recentfile_itemf);
}
-/* ********* main file *********** */
+/* *************** open file **************** */
-static void untitled(char *name)
+static void open_set_load_ui(wmOperator *op)
{
- if (G.save_over == 0 && strlen(name) < FILE_MAX-16) {
- char *c= BLI_last_slash(name);
-
- if (c)
- strcpy(&c[1], "untitled.blend");
- else
- strcpy(name, "untitled.blend");
- }
+ if(!RNA_property_is_set(op->ptr, "load_ui"))
+ RNA_boolean_set(op->ptr, "load_ui", !(U.flag & USER_FILENOUI));
}
-
static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ RNA_string_set(op->ptr, "path", G.sce);
+ open_set_load_ui(op);
- RNA_string_set(op->ptr, "filename", G.sce);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -583,14 +901,21 @@ static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int wm_open_mainfile_exec(bContext *C, wmOperator *op)
{
- char filename[FILE_MAX];
- RNA_string_get(op->ptr, "filename", filename);
+ char path[FILE_MAX];
+
+ RNA_string_get(op->ptr, "path", path);
+ open_set_load_ui(op);
+
+ if(RNA_boolean_get(op->ptr, "load_ui"))
+ G.fileflags &= ~G_FILE_NO_UI;
+ else
+ G.fileflags |= G_FILE_NO_UI;
// XXX wm in context is not set correctly after WM_read_file -> crash
// do it before for now, but is this correct with multiple windows?
WM_event_add_notifier(C, NC_WINDOW, NULL);
- WM_read_file(C, filename, op->reports);
+ WM_read_file(C, path, op->reports);
return 0;
}
@@ -599,24 +924,244 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
{
ot->name= "Open Blender File";
ot->idname= "WM_OT_open_mainfile";
+ ot->description="Open a Blender file.";
ot->invoke= wm_open_mainfile_invoke;
ot->exec= wm_open_mainfile_exec;
ot->poll= WM_operator_winactive;
- ot->flag= 0;
+ WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER);
+
+ RNA_def_boolean(ot->srna, "load_ui", 1, "Load UI", "Load user interface setup in the .blend file.");
+}
+
+/* **************** link/append *************** */
+
+static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ if(RNA_property_is_set(op->ptr, "path")) {
+ return WM_operator_call(C, op);
+ }
+ else {
+ /* XXX TODO solve where to get last linked library from */
+ RNA_string_set(op->ptr, "path", G.lib);
+ WM_event_add_fileselect(C, op);
+ return OPERATOR_RUNNING_MODAL;
+ }
+}
+
+static short wm_link_append_flag(wmOperator *op)
+{
+ short flag= 0;
+
+ if(RNA_boolean_get(op->ptr, "autoselect")) flag |= FILE_AUTOSELECT;
+ if(RNA_boolean_get(op->ptr, "active_layer")) flag |= FILE_ACTIVELAY;
+ if(RNA_boolean_get(op->ptr, "relative_paths")) flag |= FILE_STRINGCODE;
+ if(RNA_boolean_get(op->ptr, "link")) flag |= FILE_LINK;
+
+ return flag;
+}
+
+static void wm_link_make_library_local(Main *main, const char *libname)
+{
+ Library *lib;
+
+ /* and now find the latest append lib file */
+ for(lib= main->library.first; lib; lib=lib->id.next)
+ if(BLI_streq(libname, lib->filename))
+ break;
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
+ /* make local */
+ if(lib) {
+ all_local(lib, 1);
+ /* important we unset, otherwise these object wont
+ * link into other scenes from this blend file */
+ flag_all_listbases_ids(LIB_APPEND_TAG, 0);
+ }
+}
+
+static int wm_link_append_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Main *mainl= 0;
+ BlendHandle *bh;
+ PropertyRNA *prop;
+ char name[FILE_MAX], dir[FILE_MAX], libname[FILE_MAX], group[GROUP_MAX];
+ int idcode, totfiles=0;
+ short flag;
+
+ name[0] = '\0';
+ RNA_string_get(op->ptr, "filename", name);
+ RNA_string_get(op->ptr, "directory", dir);
+
+ /* test if we have a valid data */
+ if(BLO_is_a_library(dir, libname, group) == 0) {
+ BKE_report(op->reports, RPT_ERROR, "Not a library");
+ return OPERATOR_CANCELLED;
+ }
+ else if(group[0] == 0) {
+ BKE_report(op->reports, RPT_ERROR, "Nothing indicated");
+ return OPERATOR_CANCELLED;
+ }
+ else if(BLI_streq(bmain->name, libname)) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot use current file as library");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* check if something is indicated for append/link */
+ prop = RNA_struct_find_property(op->ptr, "files");
+ if(prop) {
+ totfiles= RNA_property_collection_length(op->ptr, prop);
+ if(totfiles == 0) {
+ if(name[0] == '\0') {
+ BKE_report(op->reports, RPT_ERROR, "Nothing indicated");
+ return OPERATOR_CANCELLED;
+ }
+ }
+ }
+ else if(name[0] == '\0') {
+ BKE_report(op->reports, RPT_ERROR, "Nothing indicated");
+ return OPERATOR_CANCELLED;
+ }
+ /* now we have or selected, or an indicated file */
+ if(RNA_boolean_get(op->ptr, "autoselect"))
+ scene_deselect_all(scene);
+
+ bh = BLO_blendhandle_from_file(libname);
+ idcode = BLO_idcode_from_name(group);
+
+ flag = wm_link_append_flag(op);
+
+ /* tag everything, all untagged data can be made local */
+ if((flag & FILE_LINK)==0)
+ flag_all_listbases_ids(LIB_APPEND_TAG, 1);
+
+ /* here appending/linking starts */
+ mainl = BLO_library_append_begin(C, &bh, libname);
+ if(totfiles == 0) {
+ BLO_library_append_named_part(C, mainl, &bh, name, idcode, flag);
+ }
+ else {
+ RNA_BEGIN(op->ptr, itemptr, "files") {
+ RNA_string_get(&itemptr, "name", name);
+ BLO_library_append_named_part(C, mainl, &bh, name, idcode, flag);
+ }
+ RNA_END;
+ }
+ BLO_library_append_end(C, mainl, &bh, idcode, flag);
+
+ /* mark all library linked objects to be updated */
+ recalc_all_library_objects(bmain);
+
+ /* append, rather than linking */
+ if((flag & FILE_LINK)==0)
+ wm_link_make_library_local(bmain, libname);
+
+ /* recreate dependency graph to include new objects */
+ DAG_scene_sort(scene);
+ DAG_ids_flush_update(0);
+
+ BLO_blendhandle_close(bh);
+
+ /* XXX TODO: align G.lib with other directory storage (like last opened image etc...) */
+ BLI_strncpy(G.lib, dir, FILE_MAX);
+
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static void WM_OT_link_append(wmOperatorType *ot)
+{
+ ot->name= "Link/Append from Library";
+ ot->idname= "WM_OT_link_append";
+ ot->description= "Link or Append from a Library .blend file";
+
+ ot->invoke= wm_link_append_invoke;
+ ot->exec= wm_link_append_exec;
+ ot->poll= WM_operator_winactive;
+
+ WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_LOADLIB);
+
+ RNA_def_boolean(ot->srna, "link", 1, "Link", "Link the objects or datablocks rather than appending.");
+ RNA_def_boolean(ot->srna, "autoselect", 1, "Select", "Select the linked objects.");
+ RNA_def_boolean(ot->srna, "active_layer", 1, "Active Layer", "Put the linked objects on the active layer.");
+ RNA_def_boolean(ot->srna, "relative_paths", 1, "Relative Paths", "Store the library path as a relative path to current .blend file.");
+
+ RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", "");
+}
+
+/* *************** recover last session **************** */
+
+static int wm_recover_last_session_exec(bContext *C, wmOperator *op)
+{
+ char scestr[FILE_MAX], filename[FILE_MAX];
+ int save_over;
+
+ /* back up some values */
+ BLI_strncpy(scestr, G.sce, sizeof(scestr));
+ save_over = G.save_over;
+
+ // XXX wm in context is not set correctly after WM_read_file -> crash
+ // do it before for now, but is this correct with multiple windows?
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
+
+ /* load file */
+ BLI_make_file_string("/", filename, btempdir, "quit.blend");
+ WM_read_file(C, filename, op->reports);
+
+ /* restore */
+ G.save_over = save_over;
+ BLI_strncpy(G.sce, scestr, sizeof(G.sce));
+
+ return 0;
+}
+
+static void WM_OT_recover_last_session(wmOperatorType *ot)
+{
+ ot->name= "Recover Last Session";
+ ot->idname= "WM_OT_recover_last_session";
+ ot->description="Open the last closed file (\"quit.blend\").";
+
+ ot->exec= wm_recover_last_session_exec;
+ ot->poll= WM_operator_winactive;
+}
+
+/* *************** save file as **************** */
+
+static void untitled(char *name)
+{
+ if(G.save_over == 0 && strlen(name) < FILE_MAX-16) {
+ char *c= BLI_last_slash(name);
+
+ if(c)
+ strcpy(&c[1], "untitled.blend");
+ else
+ strcpy(name, "untitled.blend");
+ }
+}
+
+static void save_set_compress(wmOperator *op)
+{
+ if(!RNA_property_is_set(op->ptr, "compress")) {
+ if(G.save_over) /* keep flag for existing file */
+ RNA_boolean_set(op->ptr, "compress", G.fileflags & G_FILE_COMPRESS);
+ else /* use userdef for new file */
+ RNA_boolean_set(op->ptr, "compress", U.flag & USER_FILECOMPRESS);
+ }
}
static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
char name[FILE_MAX];
+
+ save_set_compress(op);
BLI_strncpy(name, G.sce, FILE_MAX);
untitled(name);
- RNA_string_set(op->ptr, "filename", name);
+ RNA_string_set(op->ptr, "path", name);
WM_event_add_fileselect(C, op);
@@ -626,15 +1171,20 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even
/* function used for WM_OT_save_mainfile too */
static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
{
- char filename[FILE_MAX];
+ char path[FILE_MAX];
+ int compress;
+
+ save_set_compress(op);
+ compress= RNA_boolean_get(op->ptr, "compress");
- if(RNA_property_is_set(op->ptr, "filename"))
- RNA_string_get(op->ptr, "filename", filename);
+ if(RNA_property_is_set(op->ptr, "path"))
+ RNA_string_get(op->ptr, "path", path);
else {
- BLI_strncpy(filename, G.sce, FILE_MAX);
- untitled(filename);
+ BLI_strncpy(path, G.sce, FILE_MAX);
+ untitled(path);
}
- WM_write_file(C, filename, op->reports);
+
+ WM_write_file(C, path, compress, op->reports);
WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL);
@@ -645,26 +1195,27 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
{
ot->name= "Save As Blender File";
ot->idname= "WM_OT_save_as_mainfile";
+ ot->description="Save the current file in the desired location.";
ot->invoke= wm_save_as_mainfile_invoke;
ot->exec= wm_save_as_mainfile_exec;
ot->poll= WM_operator_winactive;
- ot->flag= 0;
-
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
-
+ WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER);
+ RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file.");
}
-/* *************** Save file directly ******** */
+/* *************** save file directly ******** */
static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
char name[FILE_MAX];
+
+ save_set_compress(op);
BLI_strncpy(name, G.sce, FILE_MAX);
untitled(name);
- RNA_string_set(op->ptr, "filename", name);
+ RNA_string_set(op->ptr, "path", name);
uiPupMenuSaveOver(C, op, name);
return OPERATOR_RUNNING_MODAL;
@@ -674,15 +1225,14 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
{
ot->name= "Save Blender File";
ot->idname= "WM_OT_save_mainfile";
+ ot->description="Save the current Blender file.";
ot->invoke= wm_save_mainfile_invoke;
ot->exec= wm_save_as_mainfile_exec;
ot->poll= WM_operator_winactive;
- ot->flag= 0;
-
- RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
-
+ WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER);
+ RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file.");
}
@@ -690,12 +1240,12 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot)
{
- ot->name= "Toggle Fullscreen";
- ot->idname= "WM_OT_window_fullscreen_toggle";
+ ot->name= "Toggle Fullscreen";
+ ot->idname= "WM_OT_window_fullscreen_toggle";
+ ot->description="Toggle the current window fullscreen.";
- ot->invoke= WM_operator_confirm;
- ot->exec= wm_window_fullscreen_toggle_op;
- ot->poll= WM_operator_winactive;
+ ot->exec= wm_window_fullscreen_toggle_op;
+ ot->poll= WM_operator_winactive;
}
static int wm_exit_blender_op(bContext *C, wmOperator *op)
@@ -711,6 +1261,7 @@ static void WM_OT_exit_blender(wmOperatorType *ot)
{
ot->name= "Exit Blender";
ot->idname= "WM_OT_exit_blender";
+ ot->description= "Quit Blender.";
ot->invoke= WM_operator_confirm;
ot->exec= wm_exit_blender_op;
@@ -725,7 +1276,7 @@ static void WM_OT_exit_blender(wmOperatorType *ot)
*/
void *WM_paint_cursor_activate(wmWindowManager *wm, int (*poll)(bContext *C),
- void (*draw)(bContext *C, int, int, void *customdata), void *customdata)
+ wmPaintCursorDraw draw, void *customdata)
{
wmPaintCursor *pc= MEM_callocN(sizeof(wmPaintCursor), "paint cursor");
@@ -765,7 +1316,7 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle)
It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type)
*/
-static int border_apply(bContext *C, wmOperator *op, int event_type)
+static int border_apply(bContext *C, wmOperator *op, int event_type, int event_orig)
{
wmGesture *gesture= op->customdata;
rcti *rect= gesture->customdata;
@@ -783,9 +1334,14 @@ static int border_apply(bContext *C, wmOperator *op, int event_type)
RNA_int_set(op->ptr, "ymin", rect->ymin);
RNA_int_set(op->ptr, "xmax", rect->xmax);
RNA_int_set(op->ptr, "ymax", rect->ymax);
- if( RNA_struct_find_property(op->ptr, "event_type") )
- RNA_int_set(op->ptr, "event_type", event_type);
+ /* XXX weak; border should be configured for this without reading event types */
+ if( RNA_struct_find_property(op->ptr, "event_type") ) {
+ if(ELEM4(event_orig, EVT_TWEAK_L, EVT_TWEAK_R, EVT_TWEAK_A, EVT_TWEAK_S))
+ event_type= LEFTMOUSE;
+
+ RNA_int_set(op->ptr, "event_type", event_type);
+ }
op->type->exec(C, op);
return 1;
@@ -806,10 +1362,13 @@ static void wm_gesture_end(bContext *C, wmOperator *op)
int WM_border_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT);
+ if(WM_key_event_is_tweak(event->type))
+ op->customdata= WM_gesture_new(C, event, WM_GESTURE_RECT);
+ else
+ op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
wm_gesture_tag_redraw(C);
@@ -843,14 +1402,14 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(event->val==1) {
+ if(event->val==KM_PRESS) {
if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) {
gesture->mode= 1;
wm_gesture_tag_redraw(C);
}
}
else {
- if(border_apply(C, op, event->type)) {
+ if(border_apply(C, op, event->type, gesture->event_type)) {
wm_gesture_end(C, op);
return OPERATOR_FINISHED;
}
@@ -873,7 +1432,7 @@ int WM_gesture_circle_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= WM_gesture_new(C, event, WM_GESTURE_CIRCLE);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
wm_gesture_tag_redraw(C);
@@ -926,7 +1485,7 @@ int WM_gesture_circle_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(event->val==0) { /* key release */
+ if(event->val==KM_RELEASE) { /* key release */
wm_gesture_end(C, op);
return OPERATOR_FINISHED;
}
@@ -952,6 +1511,7 @@ void WM_OT_circle_gesture(wmOperatorType *ot)
{
ot->name= "Circle Gesture";
ot->idname= "WM_OT_circle_gesture";
+ ot->description="Enter rotate mode with a circular gesture.";
ot->invoke= WM_gesture_circle_invoke;
ot->modal= WM_gesture_circle_modal;
@@ -1008,7 +1568,7 @@ static void tweak_gesture_modal(bContext *C, wmEvent *event)
if(gesture->event_type==event->type) {
WM_gesture_end(C, gesture);
window->tweak= NULL;
-
+
/* when tweak fails we should give the other keymap entries a chance */
event->val= KM_RELEASE;
}
@@ -1026,7 +1586,7 @@ void wm_tweakevent_test(bContext *C, wmEvent *event, int action)
if(win->tweak==NULL) {
if(CTX_wm_region(C)) {
- if(event->val) { // pressed
+ if(event->val==KM_PRESS) { // pressed
if( ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE) )
win->tweak= WM_gesture_new(C, event, WM_GESTURE_TWEAK);
}
@@ -1049,7 +1609,7 @@ int WM_gesture_lasso_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= WM_gesture_new(C, event, WM_GESTURE_LASSO);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
wm_gesture_tag_redraw(C);
@@ -1064,7 +1624,7 @@ int WM_gesture_lines_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= WM_gesture_new(C, event, WM_GESTURE_LINES);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
wm_gesture_tag_redraw(C);
@@ -1126,7 +1686,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(event->val==0) { /* key release */
+ if(event->val==KM_RELEASE) { /* key release */
gesture_lasso_apply(C, op, event->type);
return OPERATOR_FINISHED;
}
@@ -1165,6 +1725,7 @@ void WM_OT_lasso_gesture(wmOperatorType *ot)
ot->name= "Lasso Gesture";
ot->idname= "WM_OT_lasso_gesture";
+ ot->description="Select objects within the lasso as you move the pointer.";
ot->invoke= WM_gesture_lasso_invoke;
ot->modal= WM_gesture_lasso_modal;
@@ -1370,7 +1931,7 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
wm_radial_control_paint, op->customdata);
/* add modal handler */
- WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op);
+ WM_event_add_modal_handler(C, op);
WM_radial_control_modal(C, op, event);
@@ -1418,17 +1979,19 @@ void WM_OT_radial_control_partial(wmOperatorType *ot)
/* uses no type defines, fully local testing function anyway... ;) */
-static int ten_timer_exec(bContext *C, wmOperator *op)
+static int redraw_timer_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
double stime= PIL_check_seconds_timer();
int type = RNA_int_get(op->ptr, "type");
- int a, time;
- char tmpstr[128];
+ int iter = RNA_int_get(op->ptr, "iterations");
+ int a;
+ float time;
+ char *infostr= "";
WM_cursor_wait(1);
-
- for(a=0; a<10; a++) {
+
+ for(a=0; a<iter; a++) {
if (type==0) {
ED_region_do_draw(C, ar);
}
@@ -1444,13 +2007,35 @@ static int ten_timer_exec(bContext *C, wmOperator *op)
wmWindow *win= CTX_wm_window(C);
ScrArea *sa;
+ ScrArea *sa_back= CTX_wm_area(C);
+ ARegion *ar_back= CTX_wm_region(C);
+
+ for(sa= CTX_wm_screen(C)->areabase.first; sa; sa= sa->next) {
+ ARegion *ar_iter;
+ CTX_wm_area_set(C, sa);
+
+ for(ar_iter= sa->regionbase.first; ar_iter; ar_iter= ar_iter->next) {
+ CTX_wm_region_set(C, ar_iter);
+ ED_region_do_draw(C, ar_iter);
+ }
+ }
+
+ CTX_wm_window_set(C, win); /* XXX context manipulation warning! */
+
+ CTX_wm_area_set(C, sa_back);
+ CTX_wm_region_set(C, ar_back);
+ }
+ else if (type==3) {
+ wmWindow *win= CTX_wm_window(C);
+ ScrArea *sa;
+
for(sa= CTX_wm_screen(C)->areabase.first; sa; sa= sa->next)
ED_area_tag_redraw(sa);
wm_draw_update(C);
CTX_wm_window_set(C, win); /* XXX context manipulation warning! */
}
- else if (type==3) {
+ else if (type==4) {
Scene *scene= CTX_data_scene(C);
if(a & 1) scene->r.cfra--;
@@ -1463,39 +2048,43 @@ static int ten_timer_exec(bContext *C, wmOperator *op)
}
}
- time= (int) ((PIL_check_seconds_timer()-stime)*1000);
+ time= ((PIL_check_seconds_timer()-stime)*1000);
- if(type==0) sprintf(tmpstr, "10 x Draw Region: %d ms", time);
- if(type==1) sprintf(tmpstr, "10 x Draw Region and Swap: %d ms", time);
- if(type==2) sprintf(tmpstr, "10 x Draw Window and Swap: %d ms", time);
- if(type==3) sprintf(tmpstr, "Anim Step: %d ms", time);
- if(type==4) sprintf(tmpstr, "10 x Undo/Redo: %d ms", time);
+ if(type==0) infostr= "Draw Region";
+ if(type==1) infostr= "Draw Region and Swap";
+ if(type==2) infostr= "Draw Window";
+ if(type==3) infostr= "Draw Window and Swap";
+ if(type==4) infostr= "Animation Steps";
+ if(type==5) infostr= "Undo/Redo";
WM_cursor_wait(0);
- uiPupMenuNotice(C, tmpstr);
+ BKE_reportf(op->reports, RPT_INFO, "%d x %s: %.2f ms, average: %.4f", iter, infostr, time, time/iter);
return OPERATOR_FINISHED;
}
-static void WM_OT_ten_timer(wmOperatorType *ot)
+static void WM_OT_redraw_timer(wmOperatorType *ot)
{
static EnumPropertyItem prop_type_items[] = {
{0, "DRAW", 0, "Draw Region", ""},
- {1, "DRAWSWAP", 0, "Draw Region + Swap", ""},
- {2, "DRAWWINSWAP", 0, "Draw Window + Swap", ""},
- {3, "ANIMSTEP", 0, "Anim Step", ""},
- {4, "UNDO", 0, "Undo/Redo", ""},
+ {1, "DRAW_SWAP", 0, "Draw Region + Swap", ""},
+ {2, "DRAW_WIN", 0, "Draw Window", ""},
+ {3, "DRAW_WIN_SWAP", 0, "Draw Window + Swap", ""},
+ {4, "ANIM_STEP", 0, "Anim Step", ""},
+ {5, "UNDO", 0, "Undo/Redo", ""},
{0, NULL, 0, NULL, NULL}};
- ot->name= "Ten Timer";
- ot->idname= "WM_OT_ten_timer";
+ ot->name= "Redraw Timer";
+ ot->idname= "WM_OT_redraw_timer";
+ ot->description="Simple redraw timer to test the speed of updating the interface.";
ot->invoke= WM_menu_invoke;
- ot->exec= ten_timer_exec;
+ ot->exec= redraw_timer_exec;
ot->poll= WM_operator_winactive;
RNA_def_enum(ot->srna, "type", prop_type_items, 0, "Type", "");
+ RNA_def_int(ot->srna, "iterations", 10, 1,INT_MAX, "Iterations", "Number of times to redraw", 1,1000);
}
@@ -1506,6 +2095,12 @@ static void WM_OT_ten_timer(wmOperatorType *ot)
/* called on initialize WM_exit() */
void wm_operatortype_free(void)
{
+ wmOperatorType *ot;
+
+ for(ot= global_ops.first; ot; ot= ot->next)
+ if(ot->macro.first)
+ wm_operatortype_free_macro(ot);
+
BLI_freelistN(&global_ops);
}
@@ -1519,10 +2114,12 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_exit_blender);
WM_operatortype_append(WM_OT_open_recentfile);
WM_operatortype_append(WM_OT_open_mainfile);
+ WM_operatortype_append(WM_OT_link_append);
+ WM_operatortype_append(WM_OT_recover_last_session);
WM_operatortype_append(WM_OT_jobs_timer);
WM_operatortype_append(WM_OT_save_as_mainfile);
WM_operatortype_append(WM_OT_save_mainfile);
- WM_operatortype_append(WM_OT_ten_timer);
+ WM_operatortype_append(WM_OT_redraw_timer);
WM_operatortype_append(WM_OT_debug_menu);
WM_operatortype_append(WM_OT_search_menu);
}
@@ -1530,26 +2127,36 @@ void wm_operatortype_init(void)
/* default keymap for windows and screens, only call once per WM */
void wm_window_keymap(wmWindowManager *wm)
{
- ListBase *keymap= WM_keymap_listbase(wm, "Window", 0, 0);
+ wmKeyMap *keymap= WM_keymap_find(wm, "Window", 0, 0);
/* items to make WM work */
WM_keymap_verify_item(keymap, "WM_OT_jobs_timer", TIMERJOBS, KM_ANY, KM_ANY, 0);
/* note, this doesn't replace existing keymap items */
WM_keymap_verify_item(keymap, "WM_OT_window_duplicate", WKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
- WM_keymap_verify_item(keymap, "WM_OT_read_homefile", XKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_open_recentfile", OKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_open_mainfile", F1KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "WM_OT_save_mainfile", WKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_save_as_mainfile", F2KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, 0, 0);
- WM_keymap_verify_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
+ #ifdef __APPLE__
+ WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "WM_OT_open_recentfile", OKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0);
+ 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);
+ #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);
+ WM_keymap_add_item(keymap, "WM_OT_open_recentfile", OKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "WM_OT_link_append", OKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
+ WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+
+ WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
/* debug/testing */
- WM_keymap_verify_item(keymap, "WM_OT_ten_timer", TKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_redraw_timer", TKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
WM_keymap_verify_item(keymap, "WM_OT_debug_menu", DKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
- WM_keymap_verify_item(keymap, "WM_OT_search_menu", FKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_verify_item(keymap, "WM_OT_search_menu", SPACEKEY, KM_PRESS, 0, 0);
}
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 835fdca52fe..dc2aca7b15b 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -523,6 +523,7 @@ int WM_framebuffer_to_index(unsigned int col)
/* ********** END MY WINDOW ************** */
+#if 0 // XXX not used...
#ifdef WIN32
static int is_a_really_crappy_nvidia_card(void) {
static int well_is_it= -1;
@@ -534,4 +535,5 @@ static int is_a_really_crappy_nvidia_card(void) {
return well_is_it;
}
#endif
+#endif // XXX not used...
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 2d320458543..c853afe4507 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -26,6 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -70,7 +71,7 @@ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0;
/* ******** win open & close ************ */
-
+/* XXX this one should correctly check for apple top header... */
static void wm_get_screensize(int *width_r, int *height_r)
{
unsigned int uiwidth;
@@ -81,6 +82,44 @@ static void wm_get_screensize(int *width_r, int *height_r)
*height_r= uiheight;
}
+/* keeps offset and size within monitor bounds */
+/* XXX solve dual screen... */
+static void wm_window_check_position(rcti *rect)
+{
+ int width, height, d;
+
+ wm_get_screensize(&width, &height);
+
+#ifdef __APPLE__
+ height -= 70;
+#endif
+
+ if(rect->xmin < 0) {
+ d= rect->xmin;
+ rect->xmax -= d;
+ rect->xmin -= d;
+ }
+ if(rect->ymin < 0) {
+ d= rect->ymin;
+ rect->ymax -= d;
+ rect->ymin -= d;
+ }
+ if(rect->xmax > width) {
+ d= rect->xmax - width;
+ rect->xmax -= d;
+ rect->xmin -= d;
+ }
+ if(rect->ymax > height) {
+ d= rect->ymax - height;
+ rect->ymax -= d;
+ rect->ymin -= d;
+ }
+
+ if(rect->xmin < 0) rect->xmin= 0;
+ if(rect->ymin < 0) rect->ymin= 0;
+}
+
+
static void wm_ghostwindow_destroy(wmWindow *win)
{
if(win->ghostwin) {
@@ -93,7 +132,7 @@ static void wm_ghostwindow_destroy(wmWindow *win)
ED_screen_exit should have been called */
void wm_window_free(bContext *C, wmWindow *win)
{
- wmTimer *wt;
+ wmTimer *wt, *wtnext;
/* update context */
if(C) {
@@ -107,14 +146,21 @@ void wm_window_free(bContext *C, wmWindow *win)
CTX_wm_window_set(C, NULL);
WM_event_remove_handlers(C, &win->handlers);
+ WM_event_remove_handlers(C, &win->modalhandlers);
+
+ /* end running jobs, a job end also removes its timer */
+ for(wt= win->timers.first; wt; wt= wtnext) {
+ wtnext= wt->next;
+ if(wt->event_type==TIMERJOBS)
+ wm_jobs_timer_ended(wm, wt);
+ }
}
if(win->eventstate) MEM_freeN(win->eventstate);
- for(wt= win->timers.first; wt; wt= wt->next)
- if(wt->customdata)
- MEM_freeN(wt->customdata);
- BLI_freelistN(&win->timers);
+ /* timer removing, need to call this api function */
+ while((wt= win->timers.first))
+ WM_event_remove_window_timer(win, wt);
wm_event_free_all(win);
wm_subwindows_free(win);
@@ -163,7 +209,10 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
win->sizey= winorig->sizey;
/* duplicate assigns to window */
- ED_screen_duplicate(win, winorig->screen);
+ win->screen= ED_screen_duplicate(win, winorig->screen);
+ BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ win->screen->winid= win->winid;
+
win->screen->do_refresh= 1;
win->screen->do_draw= 1;
@@ -174,7 +223,7 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
}
/* this is event from ghost, or exit-blender op */
-static void wm_window_close(bContext *C, wmWindow *win)
+void wm_window_close(bContext *C, wmWindow *win)
{
wmWindowManager *wm= CTX_wm_manager(C);
BLI_remlink(&wm->windows, win);
@@ -183,35 +232,50 @@ static void wm_window_close(bContext *C, wmWindow *win)
ED_screen_exit(C, win, win->screen);
wm_window_free(C, win);
- if(wm->windows.first==NULL)
+ /* check remaining windows */
+ if(wm->windows.first) {
+ for(win= wm->windows.first; win; win= win->next)
+ if(win->screen->full!=SCREENTEMP)
+ break;
+ /* in this case we close all */
+ if(win==NULL)
+ WM_exit(C);
+ }
+ else
WM_exit(C);
}
void wm_window_title(wmWindowManager *wm, wmWindow *win)
{
- /* this is set to 1 if you don't have .B.blend open */
- if(G.save_over) {
- char *str= MEM_mallocN(strlen(G.sce) + 16, "title");
+ /* handle the 'temp' window */
+ if(win->screen && win->screen->full==SCREENTEMP) {
+ GHOST_SetTitle(win->ghostwin, "Blender");
+ }
+ else {
- if(wm->file_saved)
- sprintf(str, "Blender [%s]", G.sce);
+ /* this is set to 1 if you don't have .B.blend open */
+ if(G.save_over) {
+ char *str= MEM_mallocN(strlen(G.sce) + 16, "title");
+
+ if(wm->file_saved)
+ sprintf(str, "Blender [%s]", G.sce);
+ else
+ sprintf(str, "Blender* [%s]", G.sce);
+
+ GHOST_SetTitle(win->ghostwin, str);
+
+ MEM_freeN(str);
+ }
else
- sprintf(str, "Blender* [%s]", G.sce);
-
- GHOST_SetTitle(win->ghostwin, str);
-
- MEM_freeN(str);
- }
- else
- GHOST_SetTitle(win->ghostwin, "Blender");
+ GHOST_SetTitle(win->ghostwin, "Blender");
#ifdef __APPLE__
- if(wm->file_saved)
- GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified);
- else
- GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified);
+ if(wm->file_saved)
+ GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified);
+ else
+ GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified);
#endif
-
+ }
}
/* belongs to below */
@@ -268,7 +332,7 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow
/* called in wm_check, also inits stuff after file read */
void wm_window_add_ghostwindows(wmWindowManager *wm)
{
- ListBase *keymap;
+ wmKeyMap *keymap;
wmWindow *win;
/* no commandline prefsize? then we set this */
@@ -304,11 +368,14 @@ void wm_window_add_ghostwindows(wmWindowManager *wm)
win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
/* add keymap handlers (1 handler for all keys in map!) */
- keymap= WM_keymap_listbase(wm, "Window", 0, 0);
+ keymap= WM_keymap_find(wm, "Window", 0, 0);
WM_event_add_keymap_handler(&win->handlers, keymap);
- keymap= WM_keymap_listbase(wm, "Screen", 0, 0);
+ keymap= WM_keymap_find(wm, "Screen", 0, 0);
WM_event_add_keymap_handler(&win->handlers, keymap);
+
+ keymap= WM_keymap_find(wm, "Screen Editing", 0, 0);
+ WM_event_add_keymap_handler(&win->modalhandlers, keymap);
wm_window_title(wm, win);
}
@@ -334,6 +401,71 @@ wmWindow *WM_window_open(bContext *C, rcti *rect)
return win;
}
+/* uses screen->full 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 */
+
+void WM_window_open_temp(bContext *C, rcti *position, int type)
+{
+ wmWindow *win;
+ ScrArea *sa;
+
+ /* changes rect to fit within desktop */
+ wm_window_check_position(position);
+
+ /* 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)
+ break;
+
+ /* add new window? */
+ if(win==NULL) {
+ win= wm_window_new(C);
+
+ win->posx= position->xmin;
+ win->posy= position->ymin;
+ }
+
+ win->sizex= position->xmax - position->xmin;
+ win->sizey= position->ymax - position->ymin;
+
+ if(win->ghostwin) {
+ wm_window_set_size(win, win->sizex, win->sizey) ;
+ wm_window_raise(win);
+ }
+
+ /* add new screen? */
+ if(win->screen==NULL)
+ win->screen= ED_screen_add(win, CTX_data_scene(C), "temp");
+ win->screen->full = SCREENTEMP;
+
+ /* make window active, and validate/resize */
+ CTX_wm_window_set(C, win);
+ wm_check(C);
+
+ /* ensure it shows the right spacetype editor */
+ sa= win->screen->areabase.first;
+ CTX_wm_area_set(C, sa);
+
+ if(type==WM_WINDOW_RENDER) {
+ ED_area_newspace(C, sa, SPACE_IMAGE);
+ }
+ else {
+ ED_area_newspace(C, sa, SPACE_USERPREF);
+ }
+
+ ED_screen_set(C, win->screen);
+
+ if(sa->spacetype==SPACE_IMAGE)
+ GHOST_SetTitle(win->ghostwin, "Blender Render");
+ else if(ELEM(sa->spacetype, SPACE_OUTLINER, SPACE_USERPREF))
+ GHOST_SetTitle(win->ghostwin, "Blender User Preferences");
+ else if(sa->spacetype==SPACE_FILE)
+ GHOST_SetTitle(win->ghostwin, "Blender File View");
+ else
+ GHOST_SetTitle(win->ghostwin, "Blender");
+}
+
/* ****************** Operators ****************** */
@@ -461,6 +593,8 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
kdata.key= GHOST_kKeyCommand;
wm_event_add_ghostevent(win, GHOST_kEventKeyUp, &kdata);
}
+ /* keymodifier zero, it hangs on hotkeys that open windows otherwise */
+ win->eventstate->keymodifier= 0;
/* entering window, update mouse pos. but no event */
GHOST_GetCursorPosition(g_system, &wx, &wy);
@@ -493,6 +627,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
if(state!=GHOST_kWindowStateMinimized) {
GHOST_RectangleHandle client_rect;
int l, t, r, b, scr_w, scr_h;
+ int sizex, sizey, posx, posy;
client_rect= GHOST_GetClientBounds(win->ghostwin);
GHOST_GetRectangle(client_rect, &l, &t, &r, &b);
@@ -500,37 +635,56 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
GHOST_DisposeRectangle(client_rect);
wm_get_screensize(&scr_w, &scr_h);
- win->sizex= r-l;
- win->sizey= b-t;
- win->posx= l;
- win->posy= scr_h - t - win->sizey;
-
- /* debug prints */
- if(0) {
- state = GHOST_GetWindowState(win->ghostwin);
-
- if(state==GHOST_kWindowStateNormal) {
- if(G.f & G_DEBUG) printf("window state: normal\n");
- }
- else if(state==GHOST_kWindowStateMinimized) {
- if(G.f & G_DEBUG) printf("window state: minimized\n");
+ sizex= r-l;
+ sizey= b-t;
+ posx= l;
+ posy= scr_h - t - win->sizey;
+
+ /*
+ * Ghost sometimes send size or move events when the window hasn't changed.
+ * One case of this is using compiz on linux. To alleviate the problem
+ * we ignore all such event here.
+ *
+ * It might be good to eventually do that at Ghost level, but that is for
+ * another time.
+ */
+ if (win->sizex != sizex ||
+ win->sizey != sizey ||
+ win->posx != posx ||
+ win->posy != posy)
+ {
+ win->sizex= sizex;
+ win->sizey= sizey;
+ win->posx= posx;
+ win->posy= posy;
+
+ /* debug prints */
+ if(0) {
+ state = GHOST_GetWindowState(win->ghostwin);
+
+ if(state==GHOST_kWindowStateNormal) {
+ if(G.f & G_DEBUG) printf("window state: normal\n");
+ }
+ else if(state==GHOST_kWindowStateMinimized) {
+ if(G.f & G_DEBUG) printf("window state: minimized\n");
+ }
+ else if(state==GHOST_kWindowStateMaximized) {
+ if(G.f & G_DEBUG) printf("window state: maximized\n");
+ }
+ else if(state==GHOST_kWindowStateFullScreen) {
+ if(G.f & G_DEBUG) printf("window state: fullscreen\n");
+ }
+
+ if(type!=GHOST_kEventWindowSize) {
+ if(G.f & G_DEBUG) printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey);
+ }
+
}
- else if(state==GHOST_kWindowStateMaximized) {
- if(G.f & G_DEBUG) printf("window state: maximized\n");
- }
- else if(state==GHOST_kWindowStateFullScreen) {
- if(G.f & G_DEBUG) printf("window state: fullscreen\n");
- }
-
- if(type!=GHOST_kEventWindowSize) {
- if(G.f & G_DEBUG) printf("win move event pos %d %d size %d %d\n", win->posx, win->posy, win->sizex, win->sizey);
- }
-
+
+ wm_window_make_drawable(C, win);
+ wm_draw_window_clear(win);
+ WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
-
- wm_window_make_drawable(C, win);
- wm_draw_window_clear(win);
- WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
}
break;
}
@@ -561,12 +715,13 @@ static int wm_window_timer(const bContext *C)
wmTimer *wt;
for(wt= win->timers.first; wt; wt= wt->next) {
if(wt->sleep==0) {
- if(wt->timestep < time - wt->ltime) {
+ if(time > wt->ntime) {
wmEvent event= *(win->eventstate);
wt->delta= time - wt->ltime;
wt->duration += wt->delta;
wt->ltime= time;
+ wt->ntime= wt->stime + wt->timestep*ceil(wt->duration/wt->timestep);
event.type= wt->event_type;
event.custom= EVT_DATA_TIMER;
@@ -632,6 +787,14 @@ void wm_ghost_init(bContext *C)
}
}
+void wm_ghost_exit(void)
+{
+ if(g_system)
+ GHOST_DisposeSystem(g_system);
+
+ g_system= NULL;
+}
+
/* **************** timer ********************** */
/* to (de)activate running timers temporary */
@@ -653,6 +816,8 @@ wmTimer *WM_event_add_window_timer(wmWindow *win, int event_type, double timeste
wt->event_type= event_type;
wt->ltime= PIL_check_seconds_timer();
+ wt->ntime= wt->ltime + timestep;
+ wt->stime= wt->ltime;
wt->timestep= timestep;
BLI_addtail(&win->timers, wt);
@@ -664,10 +829,12 @@ void WM_event_remove_window_timer(wmWindow *win, wmTimer *timer)
{
wmTimer *wt;
+ /* extra security check */
for(wt= win->timers.first; wt; wt= wt->next)
if(wt==timer)
break;
if(wt) {
+
BLI_remlink(&win->timers, wt);
if(wt->customdata)
MEM_freeN(wt->customdata);
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index e91cbe6b204..a7529157072 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -47,7 +47,7 @@ extern void wm_check(bContext *C);
extern void wm_clear_default_size(bContext *C);
/* register to windowmanager for redo or macro */
-void wm_operator_register(wmWindowManager *wm, wmOperator *op);
+void wm_operator_register(bContext *C, wmOperator *op);
extern void wm_report_free(wmReport *report);
@@ -66,7 +66,7 @@ void wm_gesture_tag_redraw(bContext *C);
/* wm_jobs.h */
void WM_OT_jobs_timer(struct wmOperatorType *ot);
-
+void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt);
#endif /* WM_H */
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 9a3bba9af1d..4360e49e371 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -43,7 +43,7 @@ typedef struct wmEventHandler {
int type, flag; /* type default=0, rest is custom */
/* keymap handler */
- ListBase *keymap; /* pointer to builtin/custom keymaps */
+ wmKeyMap *keymap; /* pointer to builtin/custom keymaps */
rcti *bblocal, *bbwin; /* optional local and windowspace bb */
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 39c267b132c..cc6041ce529 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -40,7 +40,7 @@
#define EVT_DATA_GESTURE 2
#define EVT_DATA_TIMER 3
-/* tablet active */
+/* tablet active, matches GHOST_TTabletMode */
#define EVT_TABLET_NONE 0
#define EVT_TABLET_STYLUS 1
#define EVT_TABLET_ERASER 2
@@ -56,6 +56,9 @@
/* only use if you want user option switch possible */
#define ACTIONMOUSE 0x005
#define SELECTMOUSE 0x006
+/* Extra mouse buttons */
+#define BUTTON4MOUSE 0x007
+#define BUTTON5MOUSE 0x008
/* defaults from ghost */
#define WHEELUPMOUSE 0x00a
#define WHEELDOWNMOUSE 0x00b
@@ -191,7 +194,14 @@
/* for event checks */
/* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */
-#define ISKEYBOARD(event) (event >=' ' && event <=255)
+#define ISTEXTINPUT(event) (event >=' ' && event <=255)
+
+ /* test wether the event is a key on the keyboard */
+#define ISKEYBOARD(event) (event >=' ' && event <=320)
+
+/* test whether event type is acceptable as hotkey, excluding modifiers */
+#define ISHOTKEY(event) (ISKEYBOARD(event) && !(event>=LEFTCTRLKEY && event<=ESCKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY))
+
/* **************** BLENDER GESTURE EVENTS ********************* */
@@ -238,7 +248,11 @@
#define EVT_FILESELECT_EXEC 3
#define EVT_FILESELECT_CANCEL 4
+/* event->type */
#define EVT_BUT_OPEN 0x5021
+#define EVT_MODAL_MAP 0x5022
+
+
#endif /* WM_EVENT_TYPES_H */
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index 45fa9bf6cf7..f159f7f098d 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -33,9 +33,11 @@ struct bScreen;
/* *************** internal api ************** */
void wm_ghost_init (bContext *C);
+void wm_ghost_exit(void);
wmWindow *wm_window_new (bContext *C);
void wm_window_free (bContext *C, wmWindow *win);
+void wm_window_close (bContext *C, wmWindow *win);
void wm_window_title (wmWindowManager *wm, wmWindow *win);
void wm_window_add_ghostwindows (wmWindowManager *wm);
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
new file mode 100644
index 00000000000..62064e31d59
--- /dev/null
+++ b/source/blenderplayer/CMakeLists.txt
@@ -0,0 +1,144 @@
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Jacques Beaurain.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+MESSAGE(STATUS "Configuring blenderplayer")
+
+SETUP_LIBDIRS()
+
+IF(WITH_QUICKTIME)
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ENDIF(WITH_QUICKTIME)
+
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ ADD_DEFINITIONS(-DWITH_BINRELOC)
+ INCLUDE_DIRECTORIES(${BINRELOC_INC})
+ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+
+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)
+
+ADD_DEPENDENCIES(blenderplayer makesdna)
+
+FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
+
+SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} gp_common gp_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(UNIX)
+ # Sort libraries
+ SET(BLENDER_SORTED_LIBS
+ gp_ghost
+ gp_common
+ bf_string
+ bf_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_IK
+ bf_moto
+ bf_kernel
+ bf_nodes
+ bf_gpu
+ bf_imbuf
+ bf_avi
+ kx_network
+ bf_ngnetwork
+ bf_loopbacknetwork
+ extern_bullet
+ bf_guardedalloc
+ bf_memutil
+ bf_python
+ bf_gen_python
+ bf_blenlib
+ bf_cineon
+ bf_openexr
+ extern_libopenjpeg
+ bf_dds
+ bf_readblenfile
+ bf_dna
+ bf_videotex
+ bf_blenfont
+ bf_audaspace
+ blenkernel_blc
+ extern_binreloc
+ extern_glew
+ )
+
+ IF(WITH_QUICKTIME)
+ SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} quicktime)
+ ENDIF(WITH_QUICKTIME)
+
+ IF(WITH_CXX_GUARDEDALLOC)
+ SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_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)
diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
new file mode 100644
index 00000000000..502b374a318
--- /dev/null
+++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
@@ -0,0 +1,40 @@
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Jacques Beaurain.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+FILE(GLOB SRC stubs.c)
+
+SET(INC
+ .
+ ..
+ ../../../source/blender/makesdna
+ ../../../source/blender/makesrna
+)
+
+IF(WITH_INTERNATIONAL)
+ ADD_DEFINITIONS(-DWITH_FREETYPE2)
+ENDIF(WITH_INTERNATIONAL)
+
+BLENDERLIB_NOLIST(blenkernel_blc "${SRC}" "${INC}")
diff --git a/source/blenderplayer/bad_level_call_stubs/Makefile b/source/blenderplayer/bad_level_call_stubs/Makefile
new file mode 100644
index 00000000000..1d9f6a27327
--- /dev/null
+++ b/source/blenderplayer/bad_level_call_stubs/Makefile
@@ -0,0 +1,45 @@
+#
+# $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
new file mode 100644
index 00000000000..ab98e984cef
--- /dev/null
+++ b/source/blenderplayer/bad_level_call_stubs/SConscript
@@ -0,0 +1,13 @@
+#!/usr/bin/python
+Import ('env')
+
+sources = 'stubs.c'
+
+incs = '#/source/blender/makesdna'
+incs += ' #/source/blender/makesrna'
+
+defs = ''
+if env['WITH_BF_INTERNATIONAL']:
+ defs += 'WITH_FREETYPE2'
+
+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
new file mode 100644
index 00000000000..4c32f86e501
--- /dev/null
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -0,0 +1,201 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ * BKE_bad_level_calls function stubs
+ */
+
+#include <stdlib.h>
+#include "DNA_listBase.h"
+#include "RNA_types.h"
+
+/*new render funcs */
+float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype) {return NULL;}
+float RE_filter_value(int type, float x) {return 0.0f;}
+struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) {return (struct RenderLayer *)NULL;}
+
+/* zbuf.c stub */
+void antialias_tagbuf(int xsize, int ysize, char *rectmove) {}
+void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect) {}
+
+/* imagetexture.c stub */
+void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) {}
+
+/* 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;}
+
+/* nodes */
+struct RenderResult *RE_GetResult(struct Render *re){return (struct RenderResult *) NULL;}
+struct Render *RE_GetRender(const char *name){return (struct Render *) NULL;}
+
+/* blenkernel */
+char* btempdir(){return NULL;}
+void RE_FreeRenderResult(struct RenderResult *res){}
+char* datatoc_bmonofont_ttf(){return NULL;}
+int datatoc_bmonofont_ttf_size(){return 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;}
+struct Scene *RE_GetScene(struct Render *re){return (struct Scene *) NULL;}
+void RE_Database_Free(struct Render *re){}
+void RE_FreeRender(struct Render *re){}
+void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr){}
+void RE_DataBase_GetView(struct Render *re, float mat[][4]){}
+int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta){return 0;}
+float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip){return 0.0f;}
+void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype){}
+char stipple_quarttone[1]; //GLubyte stipple_quarttone[128]
+double elbeemEstimateMemreq(int res, float sx, float sy, float sz, int refine, char *retstr) {return 0.0f;}
+
+/* rna */
+void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference){}
+void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep){}
+void object_test_constraints (struct Object *owner){}
+void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr){}
+void ED_node_composit_default(struct Scene *sce){}
+
+struct EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, struct EditBone *ebo){return (struct EditBone *) NULL;}
+struct ListBase *get_active_constraints (struct Object *ob){return (struct ListBase *) NULL;}
+int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan){return 0;}
+
+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_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;}
+
+struct PTCacheEdit *PE_get_current(struct Scene *scene, struct Object *ob){return (struct PTCacheEdit *) NULL;}
+
+/* rna editors */
+char *ED_info_stats_string(struct Scene *scene){return NULL;}
+void ED_area_tag_redraw(struct ScrArea *sa){}
+void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op){}
+void ED_node_texture_default(struct Tex *tx){}
+void ED_node_changed_update(struct bContext *C, struct bNode *node);
+int text_file_modified(struct Text *text){return 0;}
+void ED_node_shader_default(struct Material *ma){}
+void ED_screen_animation_timer_update(struct bContext *C, int redraws){}
+int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md){return 0;}
+int ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, int type){return 0;}
+int uiLayoutGetActive(struct uiLayout *layout){return 0;}
+int uiLayoutGetOperatorContext(struct uiLayout *layout){return 0;}
+int uiLayoutGetAlignment(struct uiLayout *layout){return 0;}
+int uiLayoutGetEnabled(struct uiLayout *layout){return 0;}
+float uiLayoutGetScaleX(struct uiLayout *layout){return 0.0f;}
+float uiLayoutGetScaleY(struct uiLayout *layout){return 0.0f;}
+void uiLayoutSetActive(struct uiLayout *layout, int active){}
+void uiLayoutSetOperatorContext(struct uiLayout *layout, int opcontext){}
+void uiLayoutSetEnabled(struct uiLayout *layout, int enabled){}
+void uiLayoutSetAlignment(struct uiLayout *layout, int alignment){}
+void uiLayoutSetScaleX(struct uiLayout *layout, float scale){}
+void uiLayoutSetScaleY(struct uiLayout *layout, float scale){}
+
+void uiItemR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int flag){}
+
+PointerRNA uiItemFullO(struct uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context, int flag){PointerRNA a; return a;}
+struct uiLayout *uiLayoutRow(struct uiLayout *layout, int align){return (struct uiLayout *) NULL;}
+struct uiLayout *uiLayoutColumn(struct uiLayout *layout, int align){return (struct uiLayout *) NULL;}
+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){return (struct uiLayout *) NULL;}
+void uiItemsEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
+void uiItemMenuEnumR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname){}
+void uiItemEnumR_string(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, char *value){}
+void uiItemPointerR(struct uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname){}
+void uiItemsEnumO(struct uiLayout *layout, char *opname, char *propname){}
+void uiItemEnumO_string(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str){}
+void uiItemMenuEnumO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname){}
+void uiItemBooleanO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, int value){}
+void uiItemIntO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, int value){}
+void uiItemFloatO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, float value){}
+void uiItemStringO(struct uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value){}
+void uiItemL(struct uiLayout *layout, char *name, int icon){}
+void uiItemM(struct uiLayout *layout, struct bContext *C, char *name, int icon, char *menuname){}
+void uiItemS(struct uiLayout *layout){}
+void uiLayoutSetContextPointer(struct uiLayout *layout, char *name, struct PointerRNA *ptr){}
+
+/* rna template */
+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 uiTemplateCurveMapping(struct uiLayout *layout, struct CurveMapping *cumap, int type, int compact){}
+void uiTemplateColorRamp(struct uiLayout *layout, struct ColorBand *coba, int expand){}
+void uiTemplateLayers(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
+void uiTemplateTriColorSet(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
+void uiTemplateImageLayers(struct uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser){}
+ListBase uiTemplateList(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activepropname, int rows, int listtype){struct ListBase b = {0,0}; return b;}
+void uiTemplateRunningJobs(struct uiLayout *layout, struct bContext *C){}
+void uiTemplateOperatorSearch(struct uiLayout *layout){}
+void uiTemplateHeader3D(struct uiLayout *layout, struct bContext *C){}
+void uiTemplate_view3d_select_faceselmenu(struct uiLayout *layout, struct bContext *C){}
+void uiTemplateTextureImage(struct uiLayout *layout, struct bContext *C, struct Tex *tex){}
+
+/* rna render */
+struct RenderResult *RE_engine_begin_result(struct RenderEngine *engine, int x, int y, int w, int h){return (struct RenderResult *) NULL;}
+void RE_engine_update_result(struct RenderEngine *engine, struct RenderResult *result){}
+void RE_engine_end_result(struct RenderEngine *engine, struct RenderResult *result){}
+void RE_engine_update_stats(struct RenderEngine *engine, char *stats, char *info){}
+void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, char *filename){}
+void RE_result_load_from_file(struct RenderResult *result, struct ReportList *reports, char *filename){}
+int RE_engine_test_break(struct RenderEngine *engine){return 0;}
+
+/* python */
+struct wmOperatorType *WM_operatortype_find(const char *idname, int quiet){return (struct wmOperatorType *) NULL;}
+struct wmOperatorType *WM_operatortype_first(){return (struct wmOperatorType *) NULL;}
+struct wmOperatorType *WM_operatortype_exists(const char *idname){return (struct wmOperatorType *) NULL;}
+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;}
+void WM_operator_properties_free(struct PointerRNA *ptr){}
+void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring){}
+void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType*, void*), void *userdata){}
+void WM_operator_bl_idname(char *to, const char *from){}
+short insert_keyframe (struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag){return 0;}
+
+/* smoke */
+void lzo1x_1_compress(void) {return;}
+void LzmaCompress(void) { return; }
+void smoke_export(void) {return;}
+void lzo1x_decompress(void) {return;}
+void LzmaUncompress(void) {return;}
+void smoke_init(void) {return;}
+void smoke_turbulence_init(void) {return;}
+void smoke_turbulence_initBlenderRNA(void) {return;}
+void smoke_initBlenderRNA(void) {return;}
+void smoke_free(void) {return;}
+void smoke_turbulence_free(void) {return;}
+void smoke_turbulence_step(void) {return;}
+void smoke_dissolve(void) {return;}
+void smoke_get_density(void) {return;}
+void smoke_get_heat(void) {return;}
+void smoke_get_velocity_x(void) {return;}
+void smoke_get_velocity_y(void) {return;}
+void smoke_get_velocity_z(void) {return;}
+void smoke_get_obstacle(void) {return;}
+void smoke_get_index(void) {return;}
+void smoke_step(void) {return;}
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index ade5a2a64a8..51a52ee6861 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -27,172 +27,313 @@
SETUP_LIBDIRS()
INCLUDE_DIRECTORIES(../../intern/guardedalloc
- ../blender/blenlib
- ../blender/blenkernel
- ../blender/editors/include
- ../blender/makesrna
- ../blender/makesrna/intern
- ../blender/nodes
- ../blender/include
- ../blender/blenloader
- ../blender/imbuf
- ../blender/renderconverter
- ../blender/render/extern/include
- ../blender/makesdna
- ../blender/gpu
- ../blender/windowmanager
- ../kernel/gen_messaging
- ../kernel/gen_system
- ../../extern/glew/include
+ ../blender/blenlib
+ ../blender/blenkernel
+ ../blender/editors/include
+ ../blender/makesrna
+ ../blender/makesrna/intern
+ ../blender/nodes
+ ../blender/include
+ ../blender/blenloader
+ ../blender/imbuf
+ ../blender/renderconverter
+ ../blender/render/extern/include
+ ../blender/makesdna
+ ../blender/gpu
+ ../blender/windowmanager
+ ../kernel/gen_messaging
+ ../kernel/gen_system
+ ../../extern/glew/include
)
IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
+ ADD_DEFINITIONS(-DWITH_QUICKTIME)
ENDIF(WITH_QUICKTIME)
IF(WITH_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
+ ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
IF(WITH_PYTHON)
- INCLUDE_DIRECTORIES(../blender/python)
+ INCLUDE_DIRECTORIES(../blender/python)
ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
+ ADD_DEFINITIONS(-DDISABLE_PYTHON)
ENDIF(WITH_PYTHON)
-IF(LINUX)
- ADD_DEFINITIONS(-DWITH_BINRELOC)
- INCLUDE_DIRECTORIES(${BINRELOC_INC})
-endif(LINUX)
+IF(NOT WITH_SDL)
+ ADD_DEFINITIONS(-DDISABLE_SDL)
+ENDIF(NOT WITH_SDL)
-MESSAGE(STATUS "Configuring blender")
+IF(UNIX AND NOT APPLE)
+ SET(BLENDERPATH ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION})
+ CMAKE_POLICY(SET CMP0005 NEW)
+ # blender_path in creator.c
+ ADD_DEFINITIONS(-DBLENDERPATH="${BLENDERPATH}")
+ENDIF(UNIX AND NOT APPLE)
+
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ ADD_DEFINITIONS(-DWITH_BINRELOC)
+ INCLUDE_DIRECTORIES(${BINRELOC_INC})
+ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+
+# Setup the exe sources and buildinfo
+SET(EXESRC creator.c)
IF(WIN32)
- ADD_EXECUTABLE(blender ${EXETYPE} creator.c ../icons/winblender.rc)
-ELSE(WIN32)
- ADD_EXECUTABLE(blender ${EXETYPE} creator.c)
+ SET(EXESRC ${EXESRC} ../icons/winblender.rc)
ENDIF(WIN32)
+IF(WITH_BUILDINFO)
+ ADD_DEFINITIONS(-DBUILD_DATE="${BUILD_DATE}")
+ ADD_DEFINITIONS(-DBUILD_TIME="${BUILD_TIME}")
+ ADD_DEFINITIONS(-DBUILD_REV="${BUILD_REV}")
+ ADD_DEFINITIONS(-DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}")
+ ADD_DEFINITIONS(-DBUILD_TYPE="${CMAKE_BUILD_TYPE}")
+
+ SET(EXESRC ${EXESRC} buildinfo.c)
+ENDIF(WITH_BUILDINFO)
+
+MESSAGE(STATUS "Configuring blender")
+
+ADD_EXECUTABLE(blender ${EXETYPE} ${EXESRC})
# Post build steps for bundling/packaging.
SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
+IF(WITH_INSTALL)
-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)
+ 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)
-IF(UNIX AND NOT APPLE)
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND rm -Rf ${TARGETDIR}/.blender
- COMMAND mkdir ${TARGETDIR}/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/.blender/
- COMMAND find ${TARGETDIR} -name CVS -prune -exec rm -rf {} "\;"
- )
-ENDIF(UNIX AND NOT APPLE)
+ IF(UNIX AND NOT APPLE)
+
+ # Local installation, "make install" can be done after this optionally
+
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND rm -Rf ${TARGETDIR}/.blender
+ COMMAND mkdir ${TARGETDIR}/.blender/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/.blender/
+ )
+
+ IF(WITH_INTERNATIONAL)
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/.blender/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/.blender/
+ )
+ ENDIF(WITH_INTERNATIONAL)
+
+ IF(WITH_PYTHON)
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMENT "copying blender scripts..."
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/.blender/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/io ${TARGETDIR}/.blender/
+ COMMAND find ${TARGETDIR} -name "*.py?" -prune -exec rm -rf {} "\;"
+ )
+
+ # Copy the systems python into the install directory
+ # Scons copy in tools/Blender.py
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMENT "copying a subset of the systems python..."
+
+ COMMAND mkdir ${TARGETDIR}/.blender/python # PYTHONPATH and PYTHONHOME is set here
+ COMMAND mkdir ${TARGETDIR}/.blender/python/lib/
+ COMMAND cp -R ${PYTHON_LIBPATH}/python${PYTHON_VERSION} ${TARGETDIR}/.blender/python/lib/
+
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/distutils
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/lib2to3
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/idlelib
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/tkinter
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/config
+
+ COMMAND rm -rf ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/site-packages
+ COMMAND mkdir ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
-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 -R ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -R ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -R ${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
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/Resources/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
- COMMAND find ${TARGETDIR}/blender.app -name CVS -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name CVS.sandboxinfo -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
- )
-ENDIF(APPLE)
+ COMMAND rm -f ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION}/lib-dynload/_tkinter.so
+ COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "test" -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/.blender/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
+ )
+
+ ENDIF(WITH_PYTHON)
+
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND find ${TARGETDIR} -name .svn -prune -exec rm -rf {} "\;"
+ )
+
+
+ # Above we bundle a portable distrobution in ./bin
+ # This is an optional "make install" which installs blender on the system.
+ INSTALL(
+ PROGRAMS ${TARGETDIR}/blender
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
+ )
-IF(WIN32)
- FILE(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} WIN_SOURCE_DIR)
-
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND if not exist \"${TARGETDIR}\\.blender\" mkdir \"${TARGETDIR}\\.blender\"
- COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\"
- COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\"
- COMMAND if not exist \"${TARGETDIR}\\.blender\\ui\" mkdir \"${TARGETDIR}\\.blender\\ui\"
- COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\ui\\*.*\" \"${TARGETDIR}\\.blender\\ui\"
- COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\"
- COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python25.zip\" \"${TARGETDIR}\\\"
- )
-
- FILE(TO_NATIVE_PATH "${LIBDIR}" WIN_LIBDIR)
-
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python25.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
- )
-
- IF(WITH_INTERNATIONAL)
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
- )
- ENDIF(WITH_INTERNATIONAL)
-
- IF(WITH_FFMPEG)
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\"
- )
- ENDIF(WITH_FFMPEG)
-ENDIF(WIN32)
+ IF(WITH_GAMEENGINE AND WITH_PLAYER)
+ INSTALL(
+ PROGRAMS ${TARGETDIR}/blenderplayer
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
+ )
+ ENDIF(WITH_GAMEENGINE AND WITH_PLAYER)
+
+ INSTALL(
+ DIRECTORY ${TARGETDIR}/.blender/
+ DESTINATION ${BLENDERPATH}
+ )
+ # 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 -R ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -R ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -R ${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
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ )
+
+ IF(WITH_INTERNATIONAL)
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/Resources/
+ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/
+ )
+ ENDIF(WITH_INTERNATIONAL)
+
+ IF(WITH_PYTHON)
+ ADD_CUSTOM_COMMAND(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/io ${TARGETDIR}/blender.app/Contents/MacOS/.blender/
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/python/
+ COMMAND unzip -q ${LIBDIR}/release/python.zip -d ${TARGETDIR}/blender.app/Contents/MacOS/.blender/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 {} "\;"
+ )
+ ENDIF(APPLE)
+
+ IF(WIN32)
+ FILE(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} WIN_SOURCE_DIR)
+
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND if not exist \"${TARGETDIR}\\.blender\" mkdir \"${TARGETDIR}\\.blender\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\\ui\" mkdir \"${TARGETDIR}\\.blender\\ui\"
+ COMMAND if not exist \"${TARGETDIR}\\.blender\\io\" mkdir \"${TARGETDIR}\\.blender\\io\"
+ COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\ui\\*.*\" \"${TARGETDIR}\\.blender\\ui\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\io\\*.*\" \"${TARGETDIR}\\.blender\\io\"
+ COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\"
+ COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python26.zip\" \"${TARGETDIR}\\\"
+ )
+
+ FILE(TO_NATIVE_PATH "${LIBDIR}" WIN_LIBDIR)
+
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\"
+ )
+
+ IF(WITH_INTERNATIONAL)
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
+ )
+ ENDIF(WITH_INTERNATIONAL)
+
+ IF(WITH_FFMPEG)
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\"
+ )
+ ENDIF(WITH_FFMPEG)
+
+ IF(WITH_SNDFILE)
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\"
+ )
+ ENDIF(WITH_SNDFILE)
+
+ IF(WITH_JACK)
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\"
+ )
+ ENDIF(WITH_JACK)
+
+ IF(WITH_OPENAL)
+ ADD_CUSTOM_COMMAND(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\"
+
+ )
+ ENDIF(WITH_OPENAL)
+
+
+ ENDIF(WIN32)
+ENDIF(WITH_INSTALL)
ADD_DEPENDENCIES(blender makesdna)
@@ -201,97 +342,108 @@ FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_editors blender_render)
IF(WITH_ELBEEM)
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem)
+ SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem)
ENDIF(WITH_ELBEEM)
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
+ SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
IF(UNIX)
- # Sort libraries
- SET(BLENDER_SORTED_LIBS
- bf_windowmanager
- bf_editors
- bf_decimation
- blender_BSP
- bf_ghost
- bf_string
- blender_render
- blender_ONL
- bf_python
- bf_gen_python
- bf_blenkernel
- bf_nodes
- bf_gpu
- bf_blenloader
- bf_blenpluginapi
- bf_imbuf
- bf_blenlib
- bf_avi
- bf_cineon
- bf_openexr
- bf_dds
- bf_readblenfile
- blender_bop
- bf_kernel
- bf_decimation
- bf_elbeem
- bf_IK
- bf_memutil
- bf_guardedalloc
- blender_CTR
- bf_moto
- bf_windowmanager
- bf_editors
- bf_blroutines
- bf_converter
- bf_dummy
- bf_bullet
- bf_common
- bf_ketsji
- bf_logic
- bf_rasterizer
- bf_oglrasterizer
- bf_expressions
- bf_scenegraph
- bf_moto
- bf_blroutines
- kx_network
- bf_kernel
- bf_ngnetwork
- extern_bullet
- bf_loopbacknetwork
- bf_common
- bf_moto
- bf_python
- bf_gen_python
- bf_quicktime
- extern_binreloc
- extern_glew
- extern_libopenjpeg
- bf_videotex
- bf_rna
- bf_dna
- bf_blenfont
- bf_soundsystem
- )
-
- 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})
+ # Sort libraries
+ SET(BLENDER_SORTED_LIBS
+ bf_windowmanager
+ bf_editors
+ bf_decimation
+ blender_BSP
+ bf_ghost
+ bf_string
+ blender_render
+ blender_ONL
+ bf_python
+ bf_gen_python
+ bf_blenkernel
+ bf_nodes
+ bf_gpu
+ bf_blenloader
+ bf_blenpluginapi
+ bf_imbuf
+ bf_blenlib
+ bf_avi
+ bf_cineon
+ bf_openexr
+ bf_dds
+ bf_readblenfile
+ blender_bop
+ bf_kernel
+ bf_decimation
+ bf_elbeem
+ bf_IK
+ bf_memutil
+ bf_guardedalloc
+ blender_CTR
+ bf_moto
+ bf_windowmanager
+ bf_editors
+ bf_blroutines
+ bf_converter
+ bf_dummy
+ bf_bullet
+ bf_smoke
+ bf_minilzo
+ bf_lzma
+ bf_common
+ bf_ketsji
+ bf_logic
+ bf_rasterizer
+ bf_oglrasterizer
+ bf_expressions
+ bf_scenegraph
+ bf_moto
+ bf_blroutines
+ kx_network
+ bf_kernel
+ bf_ngnetwork
+ extern_bullet
+ bf_loopbacknetwork
+ bf_common
+ bf_moto
+ bf_python
+ bf_gen_python
+ extern_binreloc
+ extern_glew
+ extern_libopenjpeg
+ bf_videotex
+ bf_rna
+ bf_dna
+ bf_blenfont
+ bf_audaspace
+ )
+
+ IF(WITH_CXX_GUARDEDALLOC)
+ SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_guardedalloc_cpp)
+ ENDIF(WITH_CXX_GUARDEDALLOC)
+
+ IF(WITH_QUICKTIME)
+ SET(BLENDER_SORTED_LIBS ${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})
+ TARGET_LINK_LIBRARIES(blender ${BLENDER_LINK_LIBS})
ENDIF(UNIX)
SETUP_LIBLINKS(blender)
diff --git a/source/creator/Makefile b/source/creator/Makefile
index fbe5d252a77..592cf913dfa 100644
--- a/source/creator/Makefile
+++ b/source/creator/Makefile
@@ -40,7 +40,6 @@ include nan_compile.mk
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../blender/render/extern/include
-CPPFLAGS += -I../blender/radiosity/extern/include
# two needed for the kernel
CPPFLAGS += -I../blender/imbuf
diff --git a/source/creator/SConscript b/source/creator/SConscript
index 75e7494ebb5..7b3d1493ed2 100644
--- a/source/creator/SConscript
+++ b/source/creator/SConscript
@@ -1,5 +1,6 @@
#!/usr/bin/python
Import ('env')
+import os
sources = 'creator.c'
@@ -32,4 +33,8 @@ if env['WITH_BF_PYTHON']:
else:
defs.append('DISABLE_PYTHON')
+if env['WITH_BF_FHS']: # /usr -> /usr/share/blender/2.5
+ defs.append('BLENDERPATH=\\"' + os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION']) + '\\"')
+
+
env.BlenderLib ( libname = 'bf_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 0 )
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 9bf09a46461..6f64628b467 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -101,6 +101,7 @@
#ifdef BUILD_DATE
extern char * build_date;
extern char * build_time;
+extern char * build_rev;
extern char * build_platform;
extern char * build_type;
#endif
@@ -116,6 +117,14 @@ extern int pluginapi_force_ref(void); /* from blenpluginapi:pluginapi.c */
char bprogname[FILE_MAXDIR+FILE_MAXFILE]; /* from blenpluginapi:pluginapi.c */
char btempdir[FILE_MAXDIR+FILE_MAXFILE];
+/* unix path support.
+ * defined by the compiler. eg "/usr/share/blender/2.5" "/opt/blender/2.5" */
+#ifndef BLENDERPATH
+#define BLENDERPATH ""
+#endif
+
+char blender_path[FILE_MAXDIR+FILE_MAXFILE] = BLENDERPATH;
+
/* Initialise callbacks for the modules that need them */
static void setCallbacks(void);
@@ -177,6 +186,8 @@ static void print_help(void)
printf (" When the filename has no #, The suffix #### is added to the filename\n");
printf (" The frame number will be added at the end of the filename.\n");
printf (" eg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n");
+ printf (" -E <engine>\tSpecify the render engine.\n");
+ printf (" use -E help to list available engines.\n");
printf ("\nFormat options:\n");
printf (" -F <format>\tSet the render format, Valid options are...\n");
printf (" \tTGA IRIS HAMX JPEG MOVIE IRIZ RAWTGA\n");
@@ -201,17 +212,15 @@ static void print_help(void)
printf ("\nGame Engine specific options:\n");
printf (" -g fixedtime\t\tRun on 50 hertz without dropping frames\n");
printf (" -g vertexarrays\tUse Vertex Arrays for rendering (usually faster)\n");
- printf (" -g noaudio\t\tNo audio in Game Engine\n");
printf (" -g nomipmap\t\tNo Texture Mipmapping\n");
printf (" -g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)\n");
printf ("\nMisc options:\n");
printf (" -d\t\tTurn debugging on\n");
- printf (" -noaudio\tDisable audio on systems that support audio\n");
printf (" -nojoystick\tDisable joystick support\n");
printf (" -noglsl\tDisable GLSL shading\n");
printf (" -h\t\tPrint this help text\n");
- printf (" -y\t\tDisable automatic python script execution (scriptlinks, pydrivers, pyconstraints, pynodes)\n");
+ printf (" -y\t\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)\n");
printf (" -P <filename>\tRun the given Python script (filename or Blender Text)\n");
#ifdef WIN32
printf (" -R\t\tRegister .blend extension\n");
@@ -221,6 +230,10 @@ static void print_help(void)
printf (" \t\t passed unchanged. Access via Python's sys.argv\n");
printf ("\nEnvironment Variables:\n");
printf (" $HOME\t\t\tStore files such as .blender/ .B.blend .Bfs .Blog here.\n");
+ printf (" $BLENDERPATH\tSystem directory to use for data files and scripts.\n");
+ printf (" \tFor this build of blender the default BLENDERPATH is...\n");
+ printf (" \t\"%s\"\n", blender_path);
+ printf (" \tseting the $BLENDERPATH will override this\n");
#ifdef WIN32
printf (" $TEMP\t\tStore temporary files here.\n");
#else
@@ -267,13 +280,6 @@ int main(int argc, char **argv)
bContext *C= CTX_create();
int a, i, stax, stay, sizx, sizy /*XXX, scr_init = 0*/;
-#if defined(WIN32) || defined (__linux__)
- int audio = 1;
-#else
- int audio = 0;
-#endif
-
-
#ifdef WITH_BINRELOC
br_init( NULL );
#endif
@@ -312,7 +318,14 @@ int main(int argc, char **argv)
BLI_where_am_i(bprogname, argv[0]);
+ { /* override the hard coded blender path */
+ char *blender_path_env = getenv("BLENDERPATH");
+ if(blender_path_env)
+ BLI_strncpy(blender_path, blender_path_env, sizeof(blender_path));
+ }
+
RNA_init();
+ RE_engines_init();
/* Hack - force inclusion of the plugin api functions,
* see blenpluginapi:pluginapi.c
@@ -461,16 +474,6 @@ int main(int argc, char **argv)
break;
case 'n':
case 'N':
- if (BLI_strcasecmp(argv[a], "-noaudio") == 0|| BLI_strcasecmp(argv[a], "-nosound") == 0) {
- /**
- notify the gameengine that no audio is wanted, even if the user didn't give
- the flag -g noaudio.
- */
-
- SYS_WriteCommandLineInt(syshandle,"noaudio",1);
- audio = 0;
- if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio);
- }
if (BLI_strcasecmp(argv[a], "-nojoystick") == 0) {
/**
don't initialize joysticks if user doesn't want to use joysticks
@@ -489,11 +492,6 @@ int main(int argc, char **argv)
#ifndef DISABLE_PYTHON
BPY_start_python(argc, argv);
#endif
- /**
- * NOTE: sound_init_audio() *must be* after start_python,
- * at least on FreeBSD.
- * added note (ton): i removed it altogether
- */
WM_init(C);
@@ -501,25 +499,11 @@ int main(int argc, char **argv)
BLI_where_is_temp( btempdir, 1 ); /* call after loading the .B.blend so we can read U.tempdir */
#ifndef DISABLE_SDL
-#if (defined(WIN32) || defined(WIN64))
-#if defined(FREE_WINDOWS)
- putenv("SDL_VIDEODRIVER=dummy");
-#else
- _putenv_s("SDL_VIDEODRIVER", "dummy");
-#endif
-#else
-#ifdef __sgi
- putenv("SDL_VIDEODRIVER=dummy");
-#else
- setenv("SDL_VIDEODRIVER", "dummy", 1); /* initializing the video driver can cause crashes on some systems - Campbell */
-#endif
-#endif
+ BLI_setenv("SDL_VIDEODRIVER", "dummy");
#ifdef __linux__
- /* On linux the default SDL driver dma often would not play
- * use alsa if none is set */
- if ( getenv("SDL_AUDIODRIVER") == NULL) {
- setenv("SDL_AUDIODRIVER", "alsa", 1);
- }
+ /* On linux the default SDL driver dma often would not play
+ * use alsa if none is set */
+ setenv("SDL_AUDIODRIVER", "alsa", 0);
#endif
#endif
}
@@ -528,12 +512,6 @@ int main(int argc, char **argv)
BPY_start_python(argc, argv);
#endif
BLI_where_is_temp( btempdir, 0 ); /* call after loading the .B.blend so we can read U.tempdir */
-
- // (ton) Commented out. I have no idea whats thisfor... will mail around!
- // SYS_WriteCommandLineInt(syshandle,"noaudio",1);
- // audio = 0;
- // sound_init_audio();
- // if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio);
}
#ifndef DISABLE_PYTHON
/**
@@ -546,9 +524,14 @@ int main(int argc, char **argv)
*/
BPY_post_start_python();
- BPY_run_ui_scripts(C, 0); /* dont need to reload the first time */
+ if(!G.background)
+ BPY_run_ui_scripts(C, 0); /* dont need to reload the first time */
#endif
+ CTX_py_init_set(C, 1);
+ if(!G.background)
+ WM_keymap_init(C); /* after BPY_run_ui_scripts() */
+
#ifdef WITH_QUICKTIME
quicktime_init();
@@ -637,14 +620,8 @@ int main(int argc, char **argv)
Render *re = RE_NewRender(scene->id.name);
frame = MIN2(MAXFRAME, MAX2(1, frame));
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS)
- BPY_do_all_scripts(SCRIPT_RENDER, 0);
-#endif
+
RE_BlenderAnim(re, scene, frame, frame, scene->frame_step);
-#ifndef DISABLE_PYTHON
- BPY_do_all_scripts(SCRIPT_POSTRENDER, 0);
-#endif
}
} else {
printf("\nError: no blend loaded. cannot use '-f'.\n");
@@ -654,15 +631,7 @@ int main(int argc, char **argv)
if (CTX_data_scene(C)) {
Scene *scene= CTX_data_scene(C);
Render *re= RE_NewRender(scene->id.name);
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS)
- BPY_do_all_scripts(SCRIPT_RENDER, 1);
-#endif
RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step);
-#ifndef DISABLE_PYTHON
- if (G.f & G_DOSCRIPTLINKS)
- BPY_do_all_scripts(SCRIPT_POSTRENDER, 1);
-#endif
} else {
printf("\nError: no blend loaded. cannot use '-a'.\n");
}
@@ -744,6 +713,47 @@ int main(int argc, char **argv)
printf("\nError: you must specify a path after '-o '.\n");
}
break;
+ case 'E':
+ a++;
+ if (a < argc)
+ {
+ if (!strcmp(argv[a],"help"))
+ {
+ RenderEngineType *type = NULL;
+
+ for( type = R_engines.first; type; type = type->next )
+ {
+ printf("\t%s\n", type->idname);
+ }
+ exit(0);
+ }
+ else
+ {
+ if (CTX_data_scene(C)==NULL)
+ {
+ printf("\nError: no blend loaded. order the arguments so '-E ' is after the blend is loaded.\n");
+ }
+ else
+ {
+ Scene *scene= CTX_data_scene(C);
+ RenderData *rd = &scene->r;
+ RenderEngineType *type = NULL;
+
+ for( type = R_engines.first; type; type = type->next )
+ {
+ if (!strcmp(argv[a],type->idname))
+ {
+ BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine));
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ printf("\nEngine not specified.\n");
+ }
+ break;
case 'F':
a++;
if (a < argc){
@@ -830,7 +840,6 @@ int main(int argc, char **argv)
if (G.background) {
int retval = BKE_read_file(C, argv[a], NULL, NULL);
-// XXX sound_initialize_sounds();
/*we successfully loaded a blend file, get sure that
pointcache works */
diff --git a/source/darwin/Makefile b/source/darwin/Makefile
index 35ecc6de8f1..35842b43eae 100644
--- a/source/darwin/Makefile
+++ b/source/darwin/Makefile
@@ -51,8 +51,11 @@ ifeq ($(APPLICATION), blender)
@cp -R $(NANBLENDERHOME)/release/scripts $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/
@echo "---> copying ui scripts"
@cp -R $(NANBLENDERHOME)/release/ui $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/
+ @echo "---> copying python modules"
+ @mkdir $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python
+ @unzip -q $(LCGDIR)/release/python.zip -d $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python/
endif
- @echo "---> removing SNV directories and Mac hidden files from distribution"
+ @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 44678cb73eb..1ede16f017e 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -61,10 +61,17 @@
#include "RAS_ListRasterizer.h"
#include "NG_LoopBackNetworkDeviceInterface.h"
-#include "SND_DeviceManager.h"
#include "SYS_System.h"
+#include "GPU_extensions.h"
+#include "Value.h"
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
/***/
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
@@ -77,21 +84,15 @@
//XXX #include "BIF_scrarea.h"
#include "BKE_main.h"
-//#include "BKE_context.h"
#include "BLI_blenlib.h"
#include "BLO_readfile.h"
#include "DNA_scene_types.h"
/***/
-#include "GPU_extensions.h"
-#include "Value.h"
-
-
+#include "AUD_C-API.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
//XXX #include "BSE_headerbuttons.h"
+#include "BKE_context.h"
#include "../../blender/windowmanager/WM_types.h"
#include "../../blender/windowmanager/wm_window.h"
#include "../../blender/windowmanager/wm_event_system.h"
@@ -118,20 +119,10 @@ static BlendFileData *load_game_data(char *filename)
return bfd;
}
-
-/* screw it, BKE_context.h is complaining! */
-extern "C" struct wmWindow *CTX_wm_window(const bContext *C);
-extern "C" struct ScrArea *CTX_wm_area(const bContext *C);
-extern "C" struct ARegion *CTX_wm_region(const bContext *C);
-extern "C" struct Scene *CTX_data_scene(const bContext *C);
-extern "C" struct Main *CTX_data_main(const bContext *C);
-
-extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_framing)
+extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing)
{
/* context values */
struct wmWindow *win= CTX_wm_window(C);
- struct ScrArea *area= CTX_wm_area(C); // curarea
- struct ARegion *ar= CTX_wm_region(C);
struct Scene *scene= CTX_data_scene(C);
struct Main* maggie1= CTX_data_main(C);
@@ -159,8 +150,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
do
{
- View3D *v3d= (View3D*) area->spacedata.first;
- RegionView3D *rv3d= (RegionView3D*) ar->regiondata;
+ View3D *v3d= CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
// get some preferences
SYS_SystemHandle syshandle = SYS_GetSystem();
@@ -196,19 +187,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
// create a networkdevice
NG_NetworkDeviceInterface* networkdevice = new
NG_LoopBackNetworkDeviceInterface();
-
- //
- SYS_SystemHandle hSystem = SYS_GetSystem();
- bool noaudio = SYS_GetCommandLineInt(hSystem,"noaudio",0);
-
- if (noaudio)/*(noaudio) intrr: disable game engine audio (openal) */
- SND_DeviceManager::SetDeviceType(snd_e_dummydevice);
- // get an audiodevice
- SND_DeviceManager::Subscribe();
- SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
- audiodevice->UseCD();
-
+ //
// create a ketsji/blendersystem (only needed for timing and stuff)
KX_BlenderSystem* kxsystem = new KX_BlenderSystem();
@@ -223,7 +203,6 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
ketsjiengine->SetRenderTools(rendertools);
ketsjiengine->SetRasterizer(rasterizer);
ketsjiengine->SetNetworkDevice(networkdevice);
- ketsjiengine->SetAudioDevice(audiodevice);
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
@@ -239,13 +218,12 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
scene->camera= v3d->camera;
}
-
// 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;
@@ -257,7 +235,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
projmat.setElem(i, projmat_linear[i]);
}
- if(v3d->persp==V3D_CAMOB) {
+ if(rv3d->persp==V3D_CAMOB) {
camzoom = (1.41421 + (rv3d->camzoom / 50.0));
camzoom *= camzoom;
}
@@ -342,16 +320,18 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
ketsjiengine->SetGame2IpoMode(game2ipo,startFrame);
// Quad buffered needs a special window.
- if (blscene->r.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
- rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->r.stereomode);
+ if(blscene->gm.stereoflag == STEREO_ENABLED){
+ if (blscene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
+ rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->gm.stereomode);
+ }
}
if (exitrequested != KX_EXIT_REQUEST_QUIT_GAME)
{
- if (v3d->persp != V3D_CAMOB)
+ if (rv3d->persp != V3D_CAMOB)
{
ketsjiengine->EnableCameraOverride(startscenename);
- ketsjiengine->SetCameraOverrideUseOrtho((v3d->persp == V3D_ORTHO));
+ ketsjiengine->SetCameraOverrideUseOrtho((rv3d->persp == V3D_ORTHO));
ketsjiengine->SetCameraOverrideProjectionMatrix(projmat);
ketsjiengine->SetCameraOverrideViewMatrix(viewmat);
ketsjiengine->SetCameraOverrideClipping(v3d->near, v3d->far);
@@ -372,18 +352,17 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
if(GPU_extensions_minimum_support())
useglslmat = true;
- else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
+ else if(blscene->gm.matmode == GAME_MAT_GLSL)
usemat = false;
- if(usemat && (G.fileflags & G_FILE_GAME_MAT))
+ if(usemat && (blscene->gm.matmode != GAME_MAT_TEXFACE))
sceneconverter->SetMaterials(true);
- if(useglslmat && (G.fileflags & G_FILE_GAME_MAT_GLSL))
+ if(useglslmat && (blscene->gm.matmode == GAME_MAT_GLSL))
sceneconverter->SetGLSLMaterials(true);
KX_Scene* startscene = new KX_Scene(keyboarddevice,
mousedevice,
networkdevice,
- audiodevice,
startscenename,
blscene);
@@ -406,17 +385,20 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
#endif
//initialize Dome Settings
- if(blscene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
- ketsjiengine->InitDome(blscene->r.domeres, blscene->r.domemode, blscene->r.domeangle, blscene->r.domeresbuf, blscene->r.dometilt, blscene->r.dometext);
+ if(blscene->gm.stereoflag == STEREO_DOME)
+ ketsjiengine->InitDome(blscene->gm.dome.res, blscene->gm.dome.mode, blscene->gm.dome.angle, blscene->gm.dome.resbuf, blscene->gm.dome.tilt, blscene->gm.dome.warptext);
+
+ // initialize 3D Audio Settings
+ AUD_set3DSetting(AUD_3DS_SPEED_OF_SOUND, blscene->audio.speed_of_sound);
+ AUD_set3DSetting(AUD_3DS_DOPPLER_FACTOR, blscene->audio.doppler_factor);
+ AUD_set3DSetting(AUD_3DS_DISTANCE_MODEL, blscene->audio.distance_model);
if (sceneconverter)
{
// convert and add scene
sceneconverter->ConvertScene(
- startscenename,
startscene,
dictionaryobject,
- keyboarddevice,
rendertools,
canvas);
ketsjiengine->AddScene(startscene);
@@ -530,8 +512,6 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
// clean up some stuff
- audiodevice->StopCD();
-
if (ketsjiengine)
{
delete ketsjiengine;
@@ -571,8 +551,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
{
delete canvas;
canvas = NULL;
- }
- SND_DeviceManager::Unsubscribe();
+ }
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
@@ -587,7 +566,6 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami
}
extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
- struct ScrArea *area,
struct ARegion *ar,
char* scenename,
struct Main* maggie,
@@ -649,11 +627,6 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
NG_NetworkDeviceInterface* networkdevice = new
NG_LoopBackNetworkDeviceInterface();
- // get an audiodevice
- SND_DeviceManager::Subscribe();
- SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
- audiodevice->UseCD();
-
// create a ketsji/blendersystem (only needed for timing and stuff)
KX_BlenderSystem* kxsystem = new KX_BlenderSystem();
@@ -683,8 +656,10 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
}
// Quad buffered needs a special window.
- if (blscene->r.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
- rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->r.stereomode);
+ if(blscene->gm.stereoflag == STEREO_ENABLED){
+ if (blscene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
+ rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->gm.stereomode);
+ }
if (exitrequested != KX_EXIT_REQUEST_QUIT_GAME)
{
@@ -702,7 +677,6 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
KX_Scene* startscene = new KX_Scene(keyboarddevice,
mousedevice,
networkdevice,
- audiodevice,
startscenename,
blscene);
@@ -725,10 +699,8 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
{
// convert and add scene
sceneconverter->ConvertScene(
- startscenename,
startscene,
dictionaryobject,
- keyboarddevice,
rendertools,
canvas);
ketsjiengine->AddScene(startscene);
@@ -768,7 +740,6 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
// clean up some stuff
- audiodevice->StopCD();
if (ketsjiengine)
{
delete ketsjiengine;
@@ -794,7 +765,16 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
delete mousedevice;
mousedevice = NULL;
}
- SND_DeviceManager::Unsubscribe();
+ if (rasterizer)
+ {
+ delete rasterizer;
+ rasterizer = NULL;
+ }
+ if (rendertools)
+ {
+ delete rendertools;
+ rendertools = NULL;
+ }
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt
index 3b690a21584..ce85c1185b0 100644
--- a/source/gameengine/BlenderRoutines/CMakeLists.txt
+++ b/source/gameengine/BlenderRoutines/CMakeLists.txt
@@ -2,46 +2,44 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/guardedalloc
- ../../../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/blenkernel
- ../../../source/blender/blenfont
- ../../../source/blender/editors/include
- ../../../source/blender/windowmanager
- ../../../source/blender
- ../../../source/blender/include
- ../../../source/blender/makesdna
- ../../../source/gameengine/Rasterizer
- ../../../source/gameengine/GameLogic
- ../../../source/gameengine/Expressions
- ../../../source/gameengine/Network
- ../../../source/gameengine/SceneGraph
- ../../../source/gameengine/Physics/common
- ../../../source/gameengine/Physics/Bullet
- ../../../source/gameengine/Physics/Sumo
- ../../../source/gameengine/Physics/Sumo/Fuzzics/include
- ../../../source/gameengine/Network/LoopBackNetwork
- ../../../intern/SoundSystem
- ../../../source/blender/misc
- ../../../source/blender/blenloader
- ../../../source/blender/gpu
- ../../../extern/bullet2/src
- ../../../extern/solid
- ../../../extern/glew/include
- ${PYTHON_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/guardedalloc
+ ../../../intern/audaspace/intern
+ ../../../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/blenkernel
+ ../../../source/blender/blenfont
+ ../../../source/blender/editors/include
+ ../../../source/blender/windowmanager
+ ../../../source/blender
+ ../../../source/blender/include
+ ../../../source/blender/makesdna
+ ../../../source/blender/makesrna
+ ../../../source/gameengine/Rasterizer
+ ../../../source/gameengine/GameLogic
+ ../../../source/gameengine/Expressions
+ ../../../source/gameengine/Network
+ ../../../source/gameengine/SceneGraph
+ ../../../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
+ ${PYTHON_INC}
)
IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
BLENDERLIB(bf_blroutines "${SRC}" "${INC}")
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index aa83d17a03a..360794ceb33 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -28,11 +28,13 @@
#include "KX_BlenderCanvas.h"
#include "DNA_screen_types.h"
+#include "stdio.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
+
KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, ARegion *ar) :
m_win(win),
m_ar(ar)
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
index fd41fb90f2f..d49c877f610 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
@@ -40,6 +40,10 @@
#include "KX_BlenderGL.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct ARegion;
struct wmWindow;
@@ -166,6 +170,13 @@ private:
struct ARegion* m_ar;
struct wmWindow* m_win;
RAS_Rect m_area_rect;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderCanvas"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // __KX_BLENDERCANVAS
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 5cf696fe146..bb02f3b372e 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -44,6 +44,7 @@ extern "C" {
* This little block needed for linking to Blender...
*/
#ifdef WIN32
+#include <vector>
#include "BLI_winstuff.h"
#endif
@@ -103,6 +104,8 @@ void BL_SwapBuffers(wmWindow *win)
void DisableForText()
{
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* needed for texture fonts otherwise they render as wireframe */
+
if(glIsEnabled(GL_BLEND)) glDisable(GL_BLEND);
if(glIsEnabled(GL_ALPHA_TEST)) glDisable(GL_ALPHA_TEST);
@@ -135,32 +138,25 @@ void DisableForText()
}
}
-void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height)
+void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height)
{
/* gl prepping */
DisableForText();
- //glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
-
- glOrtho(0, width,
- 0, height, 0, 1);
-
+
+ glOrtho(0, width, 0, height, -100, 100);
+
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
/* the actual drawing */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, text);
+ BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
@@ -168,36 +164,29 @@ void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height
glEnable(GL_DEPTH_TEST);
}
-void BL_print_gamedebug_line_padded(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)
{
/* This is a rather important line :( The gl-mode hasn't been left
* behind quite as neatly as we'd have wanted to. I don't know
* what cause it, though :/ .*/
DisableForText();
- //glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
- glOrtho(0, width,
- 0, height, 0, 1);
+ glOrtho(0, width, 0, height, -100, 100);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
/* draw in black first*/
glColor3ub(0, 0, 0);
- BLF_draw_default(xco+1, height-yco-1, 0.0f, text);
+ BLF_draw_default(xco+2, height-yco-2, 0.0f, (char *)text);
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, text);
+ BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index 1e65f29d87c..5c947ff630e 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -47,8 +47,8 @@ void BL_HideMouse();
void BL_NormalMouse();
void BL_WaitMouse();
-void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height);
-void BL_print_gamedebug_line_padded(char* text, int xco, int yco, int width, int height);
+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_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
index 7da4b9efb68..d4dd9af3d4f 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
@@ -36,9 +36,12 @@
#include <map>
#include "wm_event_types.h"
+#include "WM_types.h"
#include "SCA_IInputDevice.h"
-
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
/**
Base Class for Blender specific inputdevices. Blender specific inputdevices are used when the gameengine is running in embedded mode instead of standalone mode.
@@ -221,6 +224,12 @@ public:
// virtual const SCA_InputEvent& GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
virtual bool ConvertBlenderEvent(unsigned short incode,short val)=0;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderInputDevice"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERINPUTDEVICE
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
index 877a0d39acf..58af94854e6 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
@@ -104,7 +104,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v
{
int previousTable = 1-m_currentTable;
- if (val > 0)
+ if (val == KM_PRESS)
{
if (kxevent == KX_ESCKEY && val != 0 && !m_hookesc)
result = true;
@@ -138,7 +138,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v
}
}
- } else
+ } else if (val == KM_RELEASE)
{
// blender eventval == 0
switch (m_eventStatusTables[previousTable][kxevent].m_status)
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
index 5bf37acf236..c801322e787 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
@@ -31,6 +31,10 @@
#include "KX_BlenderInputDevice.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_BlenderKeyboardDevice : public BL_BlenderInputDevice
{
bool m_hookesc;
@@ -43,6 +47,13 @@ public:
virtual bool ConvertBlenderEvent(unsigned short incode,short val);
virtual void NextFrame();
virtual void HookEscape();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderKeyboardDevice"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERKEYBOARDDEVICE
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
index 2f9e956a1d8..92383e4b533 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
@@ -31,6 +31,10 @@
#include "KX_BlenderInputDevice.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_BlenderMouseDevice : public BL_BlenderInputDevice
{
public:
@@ -41,6 +45,13 @@ public:
// virtual const SCA_InputEvent& GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode);
virtual bool ConvertBlenderEvent(unsigned short incode,short val);
virtual void NextFrame();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderMouseDevice"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERMOUSEDEVICE
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
index ffff7185fe4..ee9dae14b9b 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
@@ -261,6 +261,12 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
// couldn't find something to cast the shadow on...
glMultMatrixd(oglmatrix);
}
+ else
+ { // we found the "ground", but the cast matrix doesn't take
+ // scaling in consideration, so we must apply the object scale
+ MT_Vector3 size = gameobj->GetSGNode()->GetLocalScale();
+ glScalef(size[0], size[1], size[2]);
+ }
} else
{
@@ -278,12 +284,10 @@ void KX_BlenderRenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
int width,
int height)
{
- STR_String tmpstr(text);
-
if(mode == RAS_IRenderTools::RAS_TEXT_PADDED)
- BL_print_gamedebug_line_padded(tmpstr.Ptr(), xco, yco, width, height);
+ BL_print_gamedebug_line_padded(text, xco, yco, width, height);
else
- BL_print_gamedebug_line(tmpstr.Ptr(), xco, yco, width, height);
+ BL_print_gamedebug_line(text, xco, yco, width, height);
}
/* Render Text renders text into a (series of) polygon, using a texture font,
@@ -385,4 +389,3 @@ void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas)
{
m_filtermanager.RenderFilters(canvas);
}
-
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
index 60130e6bfc9..70672b8350b 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
@@ -37,6 +37,10 @@
#include "RAS_IRenderTools.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct KX_ClientObjectInfo;
class KX_RayCast;
@@ -95,6 +99,13 @@ public:
virtual void Render2DFilters(RAS_ICanvas* canvas);
virtual void SetClientObject(RAS_IRasterizer *rasty, void* obj);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderRenderTools"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERRENDERTOOLS
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
index d99bb9b14a8..b6b2841e81c 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
@@ -34,6 +34,10 @@
*/
#include "KX_ISystem.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_BlenderSystem : public KX_ISystem
{
double m_starttime;
@@ -42,6 +46,14 @@ public:
KX_BlenderSystem();
virtual ~KX_BlenderSystem() {};
virtual double GetTimeInSeconds();
+
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSystem"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERSYSTEM
diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile
index 549e466c4e0..4a437aff97d 100644
--- a/source/gameengine/BlenderRoutines/Makefile
+++ b/source/gameengine/BlenderRoutines/Makefile
@@ -38,10 +38,9 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_FUZZICS)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/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
@@ -54,6 +53,7 @@ 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
diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript
index c2094a15825..1e8ff3c48e8 100644
--- a/source/gameengine/BlenderRoutines/SConscript
+++ b/source/gameengine/BlenderRoutines/SConscript
@@ -8,15 +8,17 @@ incs = '. #source/kernel/gen_system #intern/string #intern/guardedalloc'
incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer'
incs += ' #source/gameengine/Converter #source/blender/imbuf'
incs += ' #intern/ghost/include'
+incs += ' #intern/audaspace/intern'
incs += ' #intern/moto/include #source/gameengine/Ketsji #source/blender/blenlib'
incs += ' #source/blender/blenkernel #source/blender'
incs += ' #source/blender/blenfont #source/blender/editors/include'
-incs += ' #source/blender/makesdna #source/gameengine/Rasterizer #source/gameengine/GameLogic'
+incs += ' #source/blender/makesdna #source/blender/makesrna'
+incs += ' #source/gameengine/Rasterizer #source/gameengine/GameLogic'
incs += ' #source/gameengine/Expressions #source/gameengine/Network'
incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Bullet'
incs += ' #source/gameengine/Network/LoopBackNetwork'
-incs += ' #intern/SoundSystem #source/blender/misc #source/blender/blenloader'
+incs += ' #source/blender/misc #source/blender/blenloader'
incs += ' #extern/glew/include #source/blender/gpu'
incs += ' #source/blender/windowmanager'
@@ -27,9 +29,4 @@ incs += ' ' + env['BF_PYTHON_INC']
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_OPENGL_INC']
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_bloutines', sources, Split(incs), defs, libtype=['core', 'player'], priority=[300, 45] , cxx_compileflags=cxxflags)
+env.BlenderLib ( 'bf_bloutines', 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 f546a31fb2e..5a1887bd6c3 100644
--- a/source/gameengine/CMakeLists.txt
+++ b/source/gameengine/CMakeLists.txt
@@ -41,5 +41,5 @@ ADD_SUBDIRECTORY(Physics/Bullet)
ADD_SUBDIRECTORY(VideoTexture)
IF(WITH_PLAYER)
- ADD_SUBDIRECTORY(GamePlayer)
+ ADD_SUBDIRECTORY(GamePlayer)
ENDIF(WITH_PLAYER)
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index ce4311f57bf..2f0e3e9fa65 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -436,367 +436,8 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
/* Python functions */
/* ------------------------------------------------------------------------- */
-/* setStart */
-const char BL_ActionActuator::GetAction_doc[] =
-"getAction()\n"
-"\tReturns a string containing the name of the current action.\n";
-
-PyObject* BL_ActionActuator::PyGetAction(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getAction()", "the action property");
-
- if (m_action){
- return PyString_FromString(m_action->id.name+2);
- }
- Py_RETURN_NONE;
-}
-
-/* getProperty */
-const char BL_ActionActuator::GetProperty_doc[] =
-"getProperty()\n"
-"\tReturns the name of the property to be used in FromProp mode.\n";
-
-PyObject* BL_ActionActuator::PyGetProperty(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getProperty()", "the property property");
-
- PyObject *result;
-
- result = Py_BuildValue("s", (const char *)m_propname);
-
- return result;
-}
-
-/* getProperty */
-const char BL_ActionActuator::GetFrameProperty_doc[] =
-"getFrameProperty()\n"
-"\tReturns the name of the property, that is set to the current frame number.\n";
-
-PyObject* BL_ActionActuator::PyGetFrameProperty(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getFrameProperty()", "the frameProperty property");
-
- PyObject *result;
-
- result = Py_BuildValue("s", (const char *)m_framepropname);
-
- return result;
-}
-
-/* getFrame */
-const char BL_ActionActuator::GetFrame_doc[] =
-"getFrame()\n"
-"\tReturns the current frame number.\n";
-
-PyObject* BL_ActionActuator::PyGetFrame(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getFrame()", "the frame property");
-
- PyObject *result;
-
- result = Py_BuildValue("f", m_localtime);
-
- return result;
-}
-
-/* getEnd */
-const char BL_ActionActuator::GetEnd_doc[] =
-"getEnd()\n"
-"\tReturns the last frame of the action.\n";
-
-PyObject* BL_ActionActuator::PyGetEnd(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getEnd()", "the end property");
-
- PyObject *result;
-
- result = Py_BuildValue("f", m_endframe);
-
- return result;
-}
-
-/* getStart */
-const char BL_ActionActuator::GetStart_doc[] =
-"getStart()\n"
-"\tReturns the starting frame of the action.\n";
-
-PyObject* BL_ActionActuator::PyGetStart(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getStart()", "the start property");
-
- PyObject *result;
-
- result = Py_BuildValue("f", m_startframe);
-
- return result;
-}
-
-/* getBlendin */
-const char BL_ActionActuator::GetBlendin_doc[] =
-"getBlendin()\n"
-"\tReturns the number of interpolation animation frames to be\n"
-"\tgenerated when this actuator is triggered.\n";
-
-PyObject* BL_ActionActuator::PyGetBlendin(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getBlendin()", "the blendin property");
-
- PyObject *result;
-
- result = Py_BuildValue("f", m_blendin);
-
- return result;
-}
-
-/* getPriority */
-const char BL_ActionActuator::GetPriority_doc[] =
-"getPriority()\n"
-"\tReturns the priority for this actuator. Actuators with lower\n"
-"\tPriority numbers will override actuators with higher numbers.\n";
-
-PyObject* BL_ActionActuator::PyGetPriority(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getPriority()", "the priority property");
-
- PyObject *result;
-
- result = Py_BuildValue("i", m_priority);
-
- return result;
-}
-
-/* setAction */
-const char BL_ActionActuator::SetAction_doc[] =
-"setAction(action, (reset))\n"
-"\t - action : The name of the action to set as the current action.\n"
-"\t - reset : Optional parameter indicating whether to reset the\n"
-"\t blend timer or not. A value of 1 indicates that the\n"
-"\t timer should be reset. A value of 0 will leave it\n"
-"\t unchanged. If reset is not specified, the timer will"
-"\t be reset.\n";
-
-PyObject* BL_ActionActuator::PySetAction(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setAction()", "the action property");
-
- char *string;
- int reset = 1;
-
- if (PyArg_ParseTuple(args,"s|i:setAction",&string, &reset))
- {
- bAction *action;
-
- action = (bAction*)SCA_ILogicBrick::m_sCurrentLogicManager->GetActionByName(STR_String(string));
-
- if (!action){
- /* NOTE! Throw an exception or something */
- // printf ("setAction failed: Action not found\n", string);
- }
- else{
- m_action=action;
- if (reset)
- m_blendframe = 0;
- }
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setStart */
-const char BL_ActionActuator::SetStart_doc[] =
-"setStart(start)\n"
-"\t - start : Specifies the starting frame of the animation.\n";
-
-PyObject* BL_ActionActuator::PySetStart(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setStart()", "the start property");
-
- float start;
-
- if (PyArg_ParseTuple(args,"f:setStart",&start))
- {
- m_startframe = start;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setEnd */
-const char BL_ActionActuator::SetEnd_doc[] =
-"setEnd(end)\n"
-"\t - end : Specifies the ending frame of the animation.\n";
-
-PyObject* BL_ActionActuator::PySetEnd(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setEnd()", "the end property");
-
- float end;
-
- if (PyArg_ParseTuple(args,"f:setEnd",&end))
- {
- m_endframe = end;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setBlendin */
-const char BL_ActionActuator::SetBlendin_doc[] =
-"setBlendin(blendin)\n"
-"\t - blendin : Specifies the number of frames of animation to generate\n"
-"\t when making transitions between actions.\n";
-
-PyObject* BL_ActionActuator::PySetBlendin(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setBlendin()", "the blendin property");
-
- float blendin;
-
- if (PyArg_ParseTuple(args,"f:setBlendin",&blendin))
- {
- m_blendin = blendin;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setBlendtime */
-const char BL_ActionActuator::SetBlendtime_doc[] =
-"setBlendtime(blendtime)\n"
-"\t - blendtime : Allows the script to directly modify the internal timer\n"
-"\t used when generating transitions between actions. This\n"
-"\t parameter must be in the range from 0.0 to 1.0.\n";
-
-PyObject* BL_ActionActuator::PySetBlendtime(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setBlendtime()", "the blendtime property");
-
- float blendframe;
-
- if (PyArg_ParseTuple(args,"f:setBlendtime",&blendframe))
- {
- m_blendframe = blendframe * m_blendin;
- if (m_blendframe<0)
- m_blendframe = 0;
- if (m_blendframe>m_blendin)
- m_blendframe = m_blendin;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setPriority */
-const char BL_ActionActuator::SetPriority_doc[] =
-"setPriority(priority)\n"
-"\t - priority : Specifies the new priority. Actuators will lower\n"
-"\t priority numbers will override actuators with higher\n"
-"\t numbers.\n";
-
-PyObject* BL_ActionActuator::PySetPriority(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setPriority()", "the priority property");
-
- int priority;
-
- if (PyArg_ParseTuple(args,"i:setPriority",&priority))
- {
- m_priority = priority;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setFrame */
-const char BL_ActionActuator::SetFrame_doc[] =
-"setFrame(frame)\n"
-"\t - frame : Specifies the new current frame for the animation\n";
-
-PyObject* BL_ActionActuator::PySetFrame(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setFrame()", "the frame property");
-
- float frame;
-
- if (PyArg_ParseTuple(args,"f:setFrame",&frame))
- {
- m_localtime = frame;
- if (m_localtime<m_startframe)
- m_localtime=m_startframe;
- else if (m_localtime>m_endframe)
- m_localtime=m_endframe;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setProperty */
-const char BL_ActionActuator::SetProperty_doc[] =
-"setProperty(prop)\n"
-"\t - prop : A string specifying the property name to be used in\n"
-"\t FromProp playback mode.\n";
-
-PyObject* BL_ActionActuator::PySetProperty(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setProperty()", "the property property");
-
- char *string;
-
- if (PyArg_ParseTuple(args,"s:setProperty",&string))
- {
- m_propname = string;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setFrameProperty */
-const char BL_ActionActuator::SetFrameProperty_doc[] =
-"setFrameProperty(prop)\n"
-"\t - prop : A string specifying the property of the frame set up update.\n";
-
-PyObject* BL_ActionActuator::PySetFrameProperty(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setFrameProperty()", "the frameProperty property");
-
- char *string;
-
- if (PyArg_ParseTuple(args,"s:setFrameProperty",&string))
- {
- m_framepropname = string;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
- char *string= PyString_AsString(value);
+ char *string= _PyUnicode_AsString(value);
if (!string) {
PyErr_SetString(PyExc_TypeError, "expected a single string");
@@ -805,6 +446,10 @@ PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
bPoseChannel *pchan;
+ if(m_userpose==NULL && m_pose==NULL) {
+ BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent();
+ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
+ }
// get_pose_channel accounts for NULL pose, run on both incase one exists but
// the channel doesnt
@@ -845,72 +490,6 @@ PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
*/
}
-/* getType */
-const char BL_ActionActuator::GetType_doc[] =
-"getType()\n"
-"\tReturns the operation mode of the actuator.\n";
-PyObject* BL_ActionActuator::PyGetType(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("getType()", "the type property");
-
- return Py_BuildValue("h", m_playtype);
-}
-
-/* setType */
-const char BL_ActionActuator::SetType_doc[] =
-"setType(mode)\n"
-"\t - mode: Play (0), Flipper (2), LoopStop (3), LoopEnd (4) or Property (6)\n"
-"\tSet the operation mode of the actuator.\n";
-PyObject* BL_ActionActuator::PySetType(PyObject* args,
- PyObject* kwds) {
- ShowDeprecationWarning("setType()", "the type property");
-
- short typeArg;
-
- if (!PyArg_ParseTuple(args, "h:setType", &typeArg)) {
- return NULL;
- }
-
- switch (typeArg) {
- case ACT_ACTION_PLAY:
- case ACT_ACTION_FLIPPER:
- case ACT_ACTION_LOOP_STOP:
- case ACT_ACTION_LOOP_END:
- case ACT_ACTION_FROM_PROP:
- m_playtype = typeArg;
- break;
- default:
- printf("Invalid type for action actuator: %d\n", typeArg); /* error */
- }
- Py_RETURN_NONE;
-}
-
-PyObject* BL_ActionActuator::PyGetContinue() {
- ShowDeprecationWarning("getContinue()", "the continue property");
-
- return PyInt_FromLong((long)(m_end_reset==0));
-}
-
-PyObject* BL_ActionActuator::PySetContinue(PyObject* value) {
- ShowDeprecationWarning("setContinue()", "the continue property");
-
- int param = PyObject_IsTrue( value );
-
- if( param == -1 ) {
- PyErr_SetString( PyExc_TypeError, "expected True/False or 0/1" );
- return NULL;
- }
-
- if (param) {
- m_end_reset = 0;
- } else {
- m_end_reset = 1;
- }
- Py_RETURN_NONE;
-}
-
-//<-----Deprecated
-
/* setChannel */
KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
"setChannel(channel, matrix)\n"
@@ -947,17 +526,20 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
mat.setValue((const float *)matrix);
BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent();
- obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
if (!m_userpose) {
- obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
- game_copy_pose(&m_userpose, m_pose);
+ if(!m_pose)
+ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
+ game_copy_pose(&m_userpose, m_pose, 0);
}
- pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there.
+ // pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there.
+ pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there.
- VECCOPY (pchan->loc, matrix[3]);
- Mat4ToSize(matrix, pchan->size);
- Mat4ToQuat(matrix, pchan->quat);
+ if(pchan) {
+ VECCOPY (pchan->loc, matrix[3]);
+ Mat4ToSize(matrix, pchan->size);
+ Mat4ToQuat(matrix, pchan->quat);
+ }
}
else {
MT_Vector3 loc;
@@ -969,18 +551,26 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
// same as above
if (!m_userpose) {
- obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
- game_copy_pose(&m_userpose, m_pose);
+ if(!m_pose)
+ obj->GetPose(&m_pose); /* Get the underlying pose from the armature */
+ game_copy_pose(&m_userpose, m_pose, 0);
}
- pchan= verify_pose_channel(m_userpose, string);
+ // pchan= verify_pose_channel(m_userpose, string);
+ pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there.
// for some reason loc.setValue(pchan->loc) fails
- pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2];
- pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2];
- pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */
+ if(pchan) {
+ pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2];
+ pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2];
+ pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */
+ }
+ }
+
+ if(pchan==NULL) {
+ PyErr_SetString(PyExc_ValueError, "Channel could not be found, use the 'channelNames' attribute to get a list of valid channels");
+ return NULL;
}
- pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE;
Py_RETURN_NONE;
}
@@ -989,63 +579,29 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel,
/* ------------------------------------------------------------------------- */
PyTypeObject BL_ActionActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "BL_ActionActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject BL_ActionActuator::Parents[] = {
- &BL_ActionActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ "BL_ActionActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef BL_ActionActuator::Methods[] = {
- //Deprecated ----->
- {"setAction", (PyCFunction) BL_ActionActuator::sPySetAction, METH_VARARGS, (PY_METHODCHAR)SetAction_doc},
- {"setStart", (PyCFunction) BL_ActionActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
- {"setEnd", (PyCFunction) BL_ActionActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
- {"setBlendin", (PyCFunction) BL_ActionActuator::sPySetBlendin, METH_VARARGS, (PY_METHODCHAR)SetBlendin_doc},
- {"setPriority", (PyCFunction) BL_ActionActuator::sPySetPriority, METH_VARARGS, (PY_METHODCHAR)SetPriority_doc},
- {"setFrame", (PyCFunction) BL_ActionActuator::sPySetFrame, METH_VARARGS, (PY_METHODCHAR)SetFrame_doc},
- {"setProperty", (PyCFunction) BL_ActionActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"setFrameProperty", (PyCFunction) BL_ActionActuator::sPySetFrameProperty, METH_VARARGS, (PY_METHODCHAR)SetFrameProperty_doc},
- {"setBlendtime", (PyCFunction) BL_ActionActuator::sPySetBlendtime, METH_VARARGS, (PY_METHODCHAR)SetBlendtime_doc},
-
- {"getAction", (PyCFunction) BL_ActionActuator::sPyGetAction, METH_VARARGS, (PY_METHODCHAR)GetAction_doc},
- {"getStart", (PyCFunction) BL_ActionActuator::sPyGetStart, METH_VARARGS, (PY_METHODCHAR)GetStart_doc},
- {"getEnd", (PyCFunction) BL_ActionActuator::sPyGetEnd, METH_VARARGS, (PY_METHODCHAR)GetEnd_doc},
- {"getBlendin", (PyCFunction) BL_ActionActuator::sPyGetBlendin, METH_VARARGS, (PY_METHODCHAR)GetBlendin_doc},
- {"getPriority", (PyCFunction) BL_ActionActuator::sPyGetPriority, METH_VARARGS, (PY_METHODCHAR)GetPriority_doc},
- {"getFrame", (PyCFunction) BL_ActionActuator::sPyGetFrame, METH_VARARGS, (PY_METHODCHAR)GetFrame_doc},
- {"getProperty", (PyCFunction) BL_ActionActuator::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
- {"getFrameProperty", (PyCFunction) BL_ActionActuator::sPyGetFrameProperty, METH_VARARGS, (PY_METHODCHAR)GetFrameProperty_doc},
{"getChannel", (PyCFunction) BL_ActionActuator::sPyGetChannel, METH_O},
- {"getType", (PyCFunction) BL_ActionActuator::sPyGetType, METH_VARARGS, (PY_METHODCHAR)GetType_doc},
- {"setType", (PyCFunction) BL_ActionActuator::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
- {"getContinue", (PyCFunction) BL_ActionActuator::sPyGetContinue, METH_NOARGS, 0},
- {"setContinue", (PyCFunction) BL_ActionActuator::sPySetContinue, METH_O, 0},
- //<------
KX_PYMETHODTABLE(BL_ActionActuator, setChannel),
{NULL,NULL} //Sentinel
};
@@ -1055,6 +611,7 @@ PyAttributeDef BL_ActionActuator::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, MAXFRAMEF, BL_ActionActuator, m_endframe),
KX_PYATTRIBUTE_FLOAT_RW("blendIn", 0, MAXFRAMEF, BL_ActionActuator, m_blendin),
KX_PYATTRIBUTE_RW_FUNCTION("action", BL_ActionActuator, pyattr_get_action, pyattr_set_action),
+ KX_PYATTRIBUTE_RO_FUNCTION("channelNames", BL_ActionActuator, pyattr_get_channel_names),
KX_PYATTRIBUTE_SHORT_RW("priority", 0, 100, false, BL_ActionActuator, m_priority),
KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame),
KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname),
@@ -1065,37 +622,24 @@ PyAttributeDef BL_ActionActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* BL_ActionActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* BL_ActionActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int BL_ActionActuator::py_setattro(PyObject *attr, PyObject* value) {
- py_setattro_up(SCA_IActuator);
-}
-
-
PyObject* BL_ActionActuator::pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
- return PyString_FromString(self->GetAction() ? self->GetAction()->id.name+2 : "");
+ return PyUnicode_FromString(self->GetAction() ? self->GetAction()->id.name+2 : "");
}
int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
- if (!PyString_Check(value))
+ if (!PyUnicode_Check(value))
{
PyErr_SetString(PyExc_ValueError, "actuator.action = val: Action Actuator, expected the string name of the action");
return PY_SET_ATTR_FAIL;
}
bAction *action= NULL;
- STR_String val = PyString_AsString(value);
+ STR_String val = _PyUnicode_AsString(value);
if (val != "")
{
@@ -1111,3 +655,23 @@ int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF
return PY_SET_ATTR_SUCCESS;
}
+
+PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v);
+ PyObject *ret= PyList_New(0);
+ PyObject *item;
+
+ bPose *pose= ((BL_ArmatureObject*)self->GetParent())->GetOrigPose();
+
+ if(pose) {
+ bPoseChannel *pchan;
+ for(pchan= (bPoseChannel *)pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) {
+ item= PyUnicode_FromString(pchan->name);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
+ }
+
+ return ret;
+}
diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h
index 422b16bb3ec..2e0e38b4cc3 100644
--- a/source/gameengine/Converter/BL_ActionActuator.h
+++ b/source/gameengine/Converter/BL_ActionActuator.h
@@ -49,9 +49,8 @@ public:
short blendin,
short priority,
short end_reset,
- float stride,
- PyTypeObject* T=&Type)
- : SCA_IActuator(gameobj,T),
+ float stride)
+ : SCA_IActuator(gameobj, KX_ACT_ACTION),
m_lastpos(0, 0, 0),
m_blendframe(0),
@@ -85,41 +84,12 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
- //Deprecated ----->
- KX_PYMETHOD_DOC(BL_ActionActuator,SetAction);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetBlendin);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetPriority);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetStart);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetEnd);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetFrame);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetProperty);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetFrameProperty);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetBlendtime);
-
- KX_PYMETHOD_DOC(BL_ActionActuator,GetAction);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetBlendin);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetPriority);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetStart);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetEnd);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetFrame);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetProperty);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetFrameProperty);
KX_PYMETHOD_O(BL_ActionActuator,GetChannel);
- KX_PYMETHOD_DOC(BL_ActionActuator,GetType);
- KX_PYMETHOD_DOC(BL_ActionActuator,SetType);
- KX_PYMETHOD_NOARGS(BL_ActionActuator,GetContinue);
- KX_PYMETHOD_O(BL_ActionActuator,SetContinue);
- //<-----
-
KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
- virtual PyObject* py_getattro(PyObject* attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject* attr, PyObject* value);
-
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);
-
+ static PyObject* pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
/* attribute check */
static int CheckFrame(void *self, const PyAttributeDef*)
{
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp
new file mode 100644
index 00000000000..741f1cf0553
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp
@@ -0,0 +1,265 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "DNA_action_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_actuator_types.h"
+#include "BKE_constraint.h"
+#include "BLI_arithb.h"
+#include "BL_ArmatureActuator.h"
+#include "BL_ArmatureObject.h"
+
+/**
+ * This class is the conversion of the Pose channel constraint.
+ * It makes a link between the pose constraint and the KX scene.
+ * The main purpose is to give access to the constraint target
+ * to link it to a game object.
+ * It also allows to activate/deactivate constraints during the game.
+ * Later it will also be possible to create constraint on the fly
+ */
+
+BL_ArmatureActuator::BL_ArmatureActuator(SCA_IObject* obj,
+ int type,
+ const char *posechannel,
+ const char *constraintname,
+ KX_GameObject* targetobj,
+ KX_GameObject* subtargetobj,
+ float weight) :
+ SCA_IActuator(obj, KX_ACT_ARMATURE),
+ m_constraint(NULL),
+ m_gametarget(targetobj),
+ m_gamesubtarget(subtargetobj),
+ m_posechannel(posechannel),
+ m_constraintname(constraintname),
+ m_weight(weight),
+ m_type(type)
+{
+ if (m_gametarget)
+ m_gametarget->RegisterActuator(this);
+ if (m_gamesubtarget)
+ m_gamesubtarget->RegisterActuator(this);
+ FindConstraint();
+}
+
+BL_ArmatureActuator::~BL_ArmatureActuator()
+{
+ if (m_gametarget)
+ m_gametarget->UnregisterActuator(this);
+ if (m_gamesubtarget)
+ m_gamesubtarget->UnregisterActuator(this);
+}
+
+void BL_ArmatureActuator::ProcessReplica()
+{
+ // the replica is tracking the same object => register it (this may be changed in Relnk())
+ if (m_gametarget)
+ m_gametarget->RegisterActuator(this);
+ if (m_gamesubtarget)
+ m_gamesubtarget->UnregisterActuator(this);
+ SCA_IActuator::ProcessReplica();
+}
+
+void BL_ArmatureActuator::ReParent(SCA_IObject* parent)
+{
+ SCA_IActuator::ReParent(parent);
+ // must remap the constraint
+ FindConstraint();
+}
+
+bool BL_ArmatureActuator::UnlinkObject(SCA_IObject* clientobj)
+{
+ bool res=false;
+ if (clientobj == m_gametarget)
+ {
+ // this object is being deleted, we cannot continue to track it.
+ m_gametarget = NULL;
+ res = true;
+ }
+ if (clientobj == m_gamesubtarget)
+ {
+ // this object is being deleted, we cannot continue to track it.
+ m_gamesubtarget = NULL;
+ res = true;
+ }
+ return res;
+}
+
+void BL_ArmatureActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
+{
+ void **h_obj = (*obj_map)[m_gametarget];
+ if (h_obj) {
+ if (m_gametarget)
+ m_gametarget->UnregisterActuator(this);
+ m_gametarget = (KX_GameObject*)(*h_obj);
+ m_gametarget->RegisterActuator(this);
+ }
+ h_obj = (*obj_map)[m_gamesubtarget];
+ if (h_obj) {
+ if (m_gamesubtarget)
+ m_gamesubtarget->UnregisterActuator(this);
+ m_gamesubtarget = (KX_GameObject*)(*h_obj);
+ m_gamesubtarget->RegisterActuator(this);
+ }
+}
+
+void BL_ArmatureActuator::FindConstraint()
+{
+ m_constraint = NULL;
+
+ if (m_gameobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE) {
+ BL_ArmatureObject* armobj = (BL_ArmatureObject*)m_gameobj;
+ m_constraint = armobj->GetConstraint(m_posechannel, m_constraintname);
+ }
+}
+
+bool BL_ArmatureActuator::Update(double curtime, bool frame)
+{
+ // the only role of this actuator is to ensure that the armature pose will be evaluated
+ bool result = false;
+ bool bNegativeEvent = IsNegativeEvent();
+ RemoveAllEvents();
+
+ if (!bNegativeEvent) {
+ BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent();
+ switch (m_type) {
+ case ACT_ARM_RUN:
+ result = true;
+ obj->SetActiveAction(NULL, 0, curtime);
+ break;
+ case ACT_ARM_ENABLE:
+ if (m_constraint)
+ m_constraint->ClrConstraintFlag(CONSTRAINT_OFF);
+ break;
+ case ACT_ARM_DISABLE:
+ if (m_constraint)
+ m_constraint->SetConstraintFlag(CONSTRAINT_OFF);
+ break;
+ case ACT_ARM_SETTARGET:
+ if (m_constraint) {
+ m_constraint->SetTarget(m_gametarget);
+ m_constraint->SetSubtarget(m_gamesubtarget);
+ }
+ break;
+ case ACT_ARM_SETWEIGHT:
+ if (m_constraint)
+ m_constraint->SetWeight(m_weight);
+ break;
+ }
+ }
+ return result;
+}
+
+/* ------------------------------------------------------------------------- */
+/* Python Integration Hooks */
+/* ------------------------------------------------------------------------- */
+
+PyTypeObject BL_ArmatureActuator::Type = {
+#if (PY_VERSION_HEX >= 0x02060000)
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
+ /* python 2.5 and below */
+ PyObject_HEAD_INIT( NULL ) /* required py macro */
+ 0, /* ob_size */
+#endif
+ "BL_ArmatureActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+
+PyMethodDef BL_ArmatureActuator::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef BL_ArmatureActuator::Attributes[] = {
+ KX_PYATTRIBUTE_RO_FUNCTION("constraint", BL_ArmatureActuator, pyattr_get_constraint),
+ KX_PYATTRIBUTE_RW_FUNCTION("target", BL_ArmatureActuator, pyattr_get_object, pyattr_set_object),
+ KX_PYATTRIBUTE_RW_FUNCTION("subtarget", BL_ArmatureActuator, pyattr_get_object, pyattr_set_object),
+ KX_PYATTRIBUTE_FLOAT_RW("weight",0.0f,1.0f,BL_ArmatureActuator,m_weight),
+ KX_PYATTRIBUTE_INT_RW("type",0,ACT_ARM_MAXTYPE,false,BL_ArmatureActuator,m_type),
+ { NULL } //Sentinel
+};
+
+PyObject* BL_ArmatureActuator::pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureActuator* actuator = static_cast<BL_ArmatureActuator*>(self);
+ KX_GameObject *target = (!strcmp(attrdef->m_name, "target")) ? actuator->m_gametarget : actuator->m_gamesubtarget;
+ if (!target)
+ Py_RETURN_NONE;
+ else
+ return target->GetProxy();
+}
+
+int BL_ArmatureActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ BL_ArmatureActuator* actuator = static_cast<BL_ArmatureActuator*>(self);
+ KX_GameObject* &target = (!strcmp(attrdef->m_name, "target")) ? actuator->m_gametarget : actuator->m_gamesubtarget;
+ KX_GameObject *gameobj;
+
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: BL_ArmatureActuator"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+
+ if (target != NULL)
+ target->UnregisterActuator(actuator);
+
+ target = gameobj;
+
+ if (target)
+ target->RegisterActuator(actuator);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* BL_ArmatureActuator::pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureActuator* actuator = static_cast<BL_ArmatureActuator*>(self);
+ BL_ArmatureConstraint* constraint = actuator->m_constraint;
+ if (!constraint)
+ Py_RETURN_NONE;
+ else
+ return constraint->GetProxy();
+}
+
+
+
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.h b/source/gameengine/Converter/BL_ArmatureActuator.h
new file mode 100644
index 00000000000..5a7752b8169
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureActuator.h
@@ -0,0 +1,89 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 BL_ARMATUREACTUATOR
+#define BL_ARMATUREACTUATOR
+
+#include "SCA_IActuator.h"
+#include "BL_ArmatureConstraint.h"
+
+/**
+ * This class is the conversion of the Pose channel constraint.
+ * It makes a link between the pose constraint and the KX scene.
+ * The main purpose is to give access to the constraint target
+ * to link it to a game object.
+ * It also allows to activate/deactivate constraints during the game.
+ * Later it will also be possible to create constraint on the fly
+ */
+
+class BL_ArmatureActuator : public SCA_IActuator
+{
+ Py_Header;
+public:
+ BL_ArmatureActuator(SCA_IObject* gameobj,
+ int type,
+ const char *posechannel,
+ const char *constraintname,
+ KX_GameObject* targetobj,
+ KX_GameObject* subtargetobj,
+ float weight);
+
+ virtual ~BL_ArmatureActuator();
+
+ virtual CValue* GetReplica() {
+ BL_ArmatureActuator* replica = new BL_ArmatureActuator(*this);
+ replica->ProcessReplica();
+ return replica;
+ };
+ virtual void ProcessReplica();
+ virtual bool UnlinkObject(SCA_IObject* clientobj);
+ virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
+ virtual bool Update(double curtime, bool frame);
+ virtual void ReParent(SCA_IObject* parent);
+
+ /* 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);
+
+private:
+ // identify the constraint that this actuator controls
+ void FindConstraint();
+
+ BL_ArmatureConstraint* m_constraint;
+ KX_GameObject* m_gametarget;
+ KX_GameObject* m_gamesubtarget;
+ STR_String m_posechannel;
+ STR_String m_constraintname;
+ float m_weight;
+ int m_type;
+};
+
+#endif //BL_ARMATUREACTUATOR
+
+
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp
new file mode 100644
index 00000000000..c0afeb008f6
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp
@@ -0,0 +1,461 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "DNA_armature_types.h"
+#include "BL_ArmatureChannel.h"
+#include "BL_ArmatureObject.h"
+#include "BL_ArmatureConstraint.h"
+#include "BLI_arithb.h"
+#include "BLI_string.h"
+
+PyTypeObject BL_ArmatureChannel::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "BL_ArmatureChannel",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &CValue::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyObject* BL_ArmatureChannel::py_repr(void)
+{
+ return PyUnicode_FromString(m_posechannel->name);
+}
+
+PyObject *BL_ArmatureChannel::GetProxy()
+{
+ return GetProxyPlus_Ext(this, &Type, m_posechannel);
+}
+
+PyObject *BL_ArmatureChannel::NewProxy(bool py_owns)
+{
+ return NewProxyPlus_Ext(this, &Type, m_posechannel, py_owns);
+}
+
+BL_ArmatureChannel::BL_ArmatureChannel(
+ BL_ArmatureObject *armature,
+ bPoseChannel *posechannel)
+ : PyObjectPlus(), m_posechannel(posechannel), m_armature(armature)
+{
+}
+
+BL_ArmatureChannel::~BL_ArmatureChannel()
+{
+}
+
+// PYTHON
+
+PyMethodDef BL_ArmatureChannel::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+// order of definition of attributes, must match Attributes[] array
+#define BCA_BONE 0
+#define BCA_PARENT 1
+
+PyAttributeDef BL_ArmatureChannel::Attributes[] = {
+ // Keep these attributes in order of BCA_ defines!!! used by py_attr_getattr and py_attr_setattr
+ KX_PYATTRIBUTE_RO_FUNCTION("bone",BL_ArmatureChannel,py_attr_getattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("parent",BL_ArmatureChannel,py_attr_getattr),
+
+ { NULL } //Sentinel
+};
+
+/* attributes directly taken from bPoseChannel */
+PyAttributeDef BL_ArmatureChannel::AttributesPtr[] = {
+ KX_PYATTRIBUTE_CHAR_RO("name",bPoseChannel,name),
+ KX_PYATTRIBUTE_FLAG_RO("has_ik",bPoseChannel,flag, POSE_CHAIN),
+ KX_PYATTRIBUTE_FLAG_NEGATIVE_RO("ik_dof_x",bPoseChannel,ikflag, BONE_IK_NO_XDOF),
+ KX_PYATTRIBUTE_FLAG_NEGATIVE_RO("ik_dof_y",bPoseChannel,ikflag, BONE_IK_NO_YDOF),
+ KX_PYATTRIBUTE_FLAG_NEGATIVE_RO("ik_dof_z",bPoseChannel,ikflag, BONE_IK_NO_ZDOF),
+ KX_PYATTRIBUTE_FLAG_RO("ik_limit_x",bPoseChannel,ikflag, BONE_IK_XLIMIT),
+ KX_PYATTRIBUTE_FLAG_RO("ik_limit_y",bPoseChannel,ikflag, BONE_IK_YLIMIT),
+ KX_PYATTRIBUTE_FLAG_RO("ik_limit_z",bPoseChannel,ikflag, BONE_IK_ZLIMIT),
+ KX_PYATTRIBUTE_FLAG_RO("ik_rot_control",bPoseChannel,ikflag, BONE_IK_ROTCTL),
+ KX_PYATTRIBUTE_FLAG_RO("ik_lin_control",bPoseChannel,ikflag, BONE_IK_LINCTL),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RW("location",-FLT_MAX,FLT_MAX,bPoseChannel,loc,3),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RW("scale",-FLT_MAX,FLT_MAX,bPoseChannel,size,3),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation",-1.0f,1.0f,bPoseChannel,quat,4),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RW("euler_rotation",-10.f,10.f,bPoseChannel,eul,3),
+ KX_PYATTRIBUTE_SHORT_RW("rotation_mode",0,PCHAN_ROT_MAX-1,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),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RO("pose_tail",bPoseChannel,pose_tail,3),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_min_x",bPoseChannel,limitmin[0]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_max_x",bPoseChannel,limitmax[0]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_min_y",bPoseChannel,limitmin[1]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_max_y",bPoseChannel,limitmax[1]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_min_z",bPoseChannel,limitmin[2]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_max_z",bPoseChannel,limitmax[2]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_stiffness_x",bPoseChannel,stiffness[0]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_stiffness_y",bPoseChannel,stiffness[1]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_stiffness_z",bPoseChannel,stiffness[2]),
+ KX_PYATTRIBUTE_FLOAT_RO("ik_stretch",bPoseChannel,ikstretch),
+ KX_PYATTRIBUTE_FLOAT_RW("ik_rot_weight",0,1.0f,bPoseChannel,ikrotweight),
+ KX_PYATTRIBUTE_FLOAT_RW("ik_lin_weight",0,1.0f,bPoseChannel,iklinweight),
+ KX_PYATTRIBUTE_RW_FUNCTION("joint_rotation",BL_ArmatureChannel,py_attr_get_joint_rotation,py_attr_set_joint_rotation),
+ { NULL } //Sentinel
+};
+
+PyObject* BL_ArmatureChannel::py_attr_getattr(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureChannel* self= static_cast<BL_ArmatureChannel*>(self_v);
+ bPoseChannel* channel = self->m_posechannel;
+ int attr_order = attrdef-Attributes;
+
+ if (!channel) {
+ PyErr_SetString(PyExc_AttributeError, "channel is NULL");
+ return NULL;
+ }
+
+ switch (attr_order) {
+ case BCA_BONE:
+ // bones are standalone proxy
+ return NewProxyPlus_Ext(NULL,&BL_ArmatureBone::Type,channel->bone,false);
+ case BCA_PARENT:
+ {
+ BL_ArmatureChannel* parent = self->m_armature->GetChannel(channel->parent);
+ if (parent)
+ return parent->GetProxy();
+ else
+ Py_RETURN_NONE;
+ }
+ }
+ PyErr_SetString(PyExc_AttributeError, "channel unknown attribute");
+ return NULL;
+}
+
+int BL_ArmatureChannel::py_attr_setattr(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ BL_ArmatureChannel* self= static_cast<BL_ArmatureChannel*>(self_v);
+ bPoseChannel* channel = self->m_posechannel;
+ int attr_order = attrdef-Attributes;
+
+ int ival;
+ double dval;
+ char* sval;
+ KX_GameObject *oval;
+
+ if (!channel) {
+ PyErr_SetString(PyExc_AttributeError, "channel is NULL");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ switch (attr_order) {
+ default:
+ break;
+ }
+
+ PyErr_SetString(PyExc_AttributeError, "channel unknown attribute");
+ return PY_SET_ATTR_FAIL;
+}
+
+PyObject* BL_ArmatureChannel::py_attr_get_joint_rotation(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureChannel* self= static_cast<BL_ArmatureChannel*>(self_v);
+ bPoseChannel* pchan = self->m_posechannel;
+ // decompose the pose matrix in euler rotation
+ float rest_mat[3][3];
+ float pose_mat[3][3];
+ float joint_mat[3][3];
+ float joints[3];
+ float norm;
+ double sa, ca;
+ // get rotation in armature space
+ Mat3CpyMat4(pose_mat, pchan->pose_mat);
+ Mat3Ortho(pose_mat);
+ if (pchan->parent) {
+ // bone has a parent, compute the rest pose of the bone taking actual pose of parent
+ Mat3IsMat3MulMat4(rest_mat, pchan->bone->bone_mat, pchan->parent->pose_mat);
+ Mat3Ortho(rest_mat);
+ } else {
+ // otherwise, the bone matrix in armature space is the rest pose
+ Mat3CpyMat4(rest_mat, pchan->bone->arm_mat);
+ }
+ // remove the rest pose to get the joint movement
+ Mat3Transp(rest_mat);
+ Mat3MulMat3(joint_mat, rest_mat, pose_mat);
+ joints[0] = joints[1] = joints[2] = 0.f;
+ // returns a 3 element list that gives corresponding joint
+ int flag = 0;
+ if (!(pchan->ikflag & BONE_IK_NO_XDOF))
+ flag |= 1;
+ if (!(pchan->ikflag & BONE_IK_NO_YDOF))
+ flag |= 2;
+ if (!(pchan->ikflag & BONE_IK_NO_ZDOF))
+ flag |= 4;
+ switch (flag) {
+ case 0: // fixed joint
+ break;
+ case 1: // X only
+ Mat3ToEulO(joint_mat, joints, EULER_ORDER_XYZ);
+ joints[1] = joints[2] = 0.f;
+ break;
+ case 2: // Y only
+ Mat3ToEulO(joint_mat, joints, EULER_ORDER_XYZ);
+ joints[0] = joints[2] = 0.f;
+ break;
+ case 3: // X+Y
+ Mat3ToEulO(joint_mat, joints, EULER_ORDER_ZYX);
+ joints[2] = 0.f;
+ break;
+ case 4: // Z only
+ Mat3ToEulO(joint_mat, joints, EULER_ORDER_XYZ);
+ joints[0] = joints[1] = 0.f;
+ break;
+ case 5: // X+Z
+ // decompose this as an equivalent rotation vector in X/Z plane
+ joints[0] = joint_mat[1][2];
+ joints[2] = -joint_mat[1][0];
+ norm = Normalize(joints);
+ if (norm < FLT_EPSILON) {
+ norm = (joint_mat[1][1] < 0.f) ? M_PI : 0.f;
+ } else {
+ norm = acos(joint_mat[1][1]);
+ }
+ VecMulf(joints, norm);
+ break;
+ case 6: // Y+Z
+ Mat3ToEulO(joint_mat, joints, EULER_ORDER_XYZ);
+ joints[0] = 0.f;
+ break;
+ case 7: // X+Y+Z
+ // equivalent axis
+ joints[0] = (joint_mat[1][2]-joint_mat[2][1])*0.5f;
+ joints[1] = (joint_mat[2][0]-joint_mat[0][2])*0.5f;
+ joints[2] = (joint_mat[0][1]-joint_mat[1][0])*0.5f;
+ sa = VecLength(joints);
+ ca = (joint_mat[0][0]+joint_mat[1][1]+joint_mat[1][1]-1.0f)*0.5f;
+ if (sa > FLT_EPSILON) {
+ norm = atan2(sa,ca)/sa;
+ } else {
+ if (ca < 0.0) {
+ norm = M_PI;
+ VecMulf(joints,0.f);
+ if (joint_mat[0][0] > 0.f) {
+ joints[0] = 1.0f;
+ } else if (joint_mat[1][1] > 0.f) {
+ joints[1] = 1.0f;
+ } else {
+ joints[2] = 1.0f;
+ }
+ } else {
+ norm = 0.0;
+ }
+ }
+ VecMulf(joints,norm);
+ break;
+ }
+ return newVectorObject(joints, 3, Py_NEW, NULL);
+}
+
+int BL_ArmatureChannel::py_attr_set_joint_rotation(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ BL_ArmatureChannel* self= static_cast<BL_ArmatureChannel*>(self_v);
+ bPoseChannel* pchan = self->m_posechannel;
+ PyObject *item;
+ float joints[3];
+ float quat[4];
+
+ if (!PySequence_Check(value) || PySequence_Size(value) != 3) {
+ PyErr_SetString(PyExc_AttributeError, "expected a sequence of [3] floats");
+ return PY_SET_ATTR_FAIL;
+ }
+ for (int i=0; i<3; i++) {
+ item = PySequence_GetItem(value, i); /* new ref */
+ joints[i] = PyFloat_AsDouble(item);
+ Py_DECREF(item);
+ if (joints[i] == -1.0f && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "expected a sequence of [3] floats");
+ return PY_SET_ATTR_FAIL;
+ }
+ }
+
+ int flag = 0;
+ if (!(pchan->ikflag & BONE_IK_NO_XDOF))
+ flag |= 1;
+ if (!(pchan->ikflag & BONE_IK_NO_YDOF))
+ flag |= 2;
+ if (!(pchan->ikflag & BONE_IK_NO_ZDOF))
+ flag |= 4;
+ QuatOne(quat);
+ switch (flag) {
+ case 0: // fixed joint
+ break;
+ case 1: // X only
+ joints[1] = joints[2] = 0.f;
+ EulOToQuat(joints, EULER_ORDER_XYZ, quat);
+ break;
+ case 2: // Y only
+ joints[0] = joints[2] = 0.f;
+ EulOToQuat(joints, EULER_ORDER_XYZ, quat);
+ break;
+ case 3: // X+Y
+ joints[2] = 0.f;
+ EulOToQuat(joints, EULER_ORDER_ZYX, quat);
+ break;
+ case 4: // Z only
+ joints[0] = joints[1] = 0.f;
+ EulOToQuat(joints, EULER_ORDER_XYZ, quat);
+ break;
+ case 5: // X+Z
+ // X and Z are components of an equivalent rotation axis
+ joints[1] = 0;
+ VecRotToQuat(joints, VecLength(joints), quat);
+ break;
+ case 6: // Y+Z
+ joints[0] = 0.f;
+ EulOToQuat(joints, EULER_ORDER_XYZ, quat);
+ break;
+ case 7: // X+Y+Z
+ // equivalent axis
+ VecRotToQuat(joints, VecLength(joints), quat);
+ break;
+ }
+ if (pchan->rotmode > 0) {
+ QuatToEulO(quat, joints, pchan->rotmode);
+ VecCopyf(pchan->eul, joints);
+ } else
+ QuatCopy(pchan->quat, quat);
+ return PY_SET_ATTR_SUCCESS;
+}
+
+// *************************
+// BL_ArmatureBone
+//
+// Access to Bone structure
+PyTypeObject BL_ArmatureBone::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "BL_ArmatureBone",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_bone_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &CValue::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+// not used since this class is never instantiated
+PyObject *BL_ArmatureBone::GetProxy()
+{
+ return NULL;
+}
+PyObject *BL_ArmatureBone::NewProxy(bool py_owns)
+{
+ return NULL;
+}
+
+PyObject *BL_ArmatureBone::py_bone_repr(PyObject *self)
+{
+ Bone* bone = static_cast<Bone*>BGE_PROXY_PTR(self);
+ return PyUnicode_FromString(bone->name);
+}
+
+PyMethodDef BL_ArmatureBone::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+/* no attributes on C++ class since it is never instantiated */
+PyAttributeDef BL_ArmatureBone::Attributes[] = {
+ { NULL } //Sentinel
+};
+
+// attributes that work on proxy ptr (points to a Bone structure)
+PyAttributeDef BL_ArmatureBone::AttributesPtr[] = {
+ KX_PYATTRIBUTE_CHAR_RO("name",Bone,name),
+ KX_PYATTRIBUTE_FLAG_RO("connected",Bone,flag, BONE_CONNECTED),
+ KX_PYATTRIBUTE_FLAG_RO("hinge",Bone,flag, BONE_HINGE),
+ KX_PYATTRIBUTE_FLAG_NEGATIVE_RO("inherit_scale",Bone,flag, BONE_NO_SCALE),
+ KX_PYATTRIBUTE_SHORT_RO("bbone_segments",Bone,segments),
+ KX_PYATTRIBUTE_FLOAT_RO("roll",Bone,roll),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RO("head",Bone,head,3),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RO("tail",Bone,tail,3),
+ KX_PYATTRIBUTE_FLOAT_RO("length",Bone,length),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RO("arm_head",Bone,arm_head,3),
+ KX_PYATTRIBUTE_FLOAT_VECTOR_RO("arm_tail",Bone,arm_tail,3),
+ KX_PYATTRIBUTE_FLOAT_MATRIX_RO("arm_mat",Bone,arm_mat,4),
+ KX_PYATTRIBUTE_FLOAT_MATRIX_RO("bone_mat",Bone,bone_mat,4),
+ KX_PYATTRIBUTE_RO_FUNCTION("parent",BL_ArmatureBone,py_bone_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("children",BL_ArmatureBone,py_bone_get_parent),
+ { NULL } //Sentinel
+};
+
+PyObject *BL_ArmatureBone::py_bone_get_parent(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ Bone* bone = reinterpret_cast<Bone*>BGE_PROXY_PTR(self);
+ if (bone->parent) {
+ // create a proxy unconnected to any GE object
+ return NewProxyPlus_Ext(NULL,&Type,bone->parent,false);
+ }
+ Py_RETURN_NONE;
+}
+
+PyObject *BL_ArmatureBone::py_bone_get_children(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ Bone* bone = reinterpret_cast<Bone*>BGE_PROXY_PTR(self);
+ Bone* child;
+ int count = 0;
+ for (child=(Bone*)bone->childbase.first; child; child=(Bone*)child->next)
+ count++;
+
+ PyObject* childrenlist = PyList_New(count);
+
+ for (count = 0, child=(Bone*)bone->childbase.first; child; child=(Bone*)child->next, ++count)
+ PyList_SET_ITEM(childrenlist,count,NewProxyPlus_Ext(NULL,&Type,child,false));
+
+ return childrenlist;
+}
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.h b/source/gameengine/Converter/BL_ArmatureChannel.h
new file mode 100644
index 00000000000..0f0f5a062e0
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureChannel.h
@@ -0,0 +1,91 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 __BL_ARMATURECHANNEL
+#define __BL_ARMATURECHANNEL
+
+#include "DNA_action_types.h"
+#include "GEN_HashedPtr.h"
+#include "GEN_Map.h"
+#include "PyObjectPlus.h"
+
+class SCA_IObject;
+class KX_GameObject;
+class BL_ArmatureObject;
+struct bConstraint;
+struct bPoseChannel;
+struct Object;
+struct bPose;
+
+class BL_ArmatureChannel : public PyObjectPlus
+{
+ // use Py_HeaderPtr since we use generic pointer in proxy
+ Py_HeaderPtr;
+
+private:
+ friend class BL_ArmatureObject;
+ struct bPoseChannel* m_posechannel;
+ BL_ArmatureObject* m_armature;
+
+public:
+ BL_ArmatureChannel(class BL_ArmatureObject *armature,
+ struct bPoseChannel *posechannel);
+ virtual ~BL_ArmatureChannel();
+
+ virtual PyObject* py_repr(void);
+
+ // Python access
+ 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);
+ 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);
+
+};
+
+/* this is a factory class to access bBone data field in the GE.
+ It's not supposed to be instantiated, we only need it for the Attributes and Method array.
+ The actual proxy object will be manually created using NewProxyPtr */
+class BL_ArmatureBone : public PyObjectPlus
+{
+ // use Py_HeaderPtr since we use generic pointer in proxy
+ Py_HeaderPtr;
+private:
+ // make constructor private to make sure no one tries to instantiate this class
+ BL_ArmatureBone() {}
+ virtual ~BL_ArmatureBone() {}
+
+public:
+ 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);
+
+};
+
+
+#endif //__BL_ARMATURECHANNEL
+
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
new file mode 100644
index 00000000000..15e12611483
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
@@ -0,0 +1,447 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 *****
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "DNA_constraint_types.h"
+#include "DNA_action_types.h"
+#include "BL_ArmatureConstraint.h"
+#include "BL_ArmatureObject.h"
+#include "BLI_arithb.h"
+#include "BLI_string.h"
+
+PyTypeObject BL_ArmatureConstraint::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "BL_ArmatureConstraint",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &CValue::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyObject* BL_ArmatureConstraint::py_repr(void)
+{
+ return PyUnicode_FromString(m_name);
+}
+
+BL_ArmatureConstraint::BL_ArmatureConstraint(
+ BL_ArmatureObject *armature,
+ bPoseChannel *posechannel,
+ bConstraint *constraint,
+ KX_GameObject* target,
+ KX_GameObject* subtarget)
+ : PyObjectPlus(), m_armature(armature), m_constraint(constraint), m_posechannel(posechannel)
+{
+ m_target = target;
+ m_blendtarget = (target) ? target->GetBlenderObject() : NULL;
+ m_subtarget = subtarget;
+ m_blendsubtarget = (subtarget) ? subtarget->GetBlenderObject() : NULL;
+ m_pose = m_subpose = NULL;
+ if (m_blendtarget) {
+ Mat4CpyMat4(m_blendmat, m_blendtarget->obmat);
+ if (m_blendtarget->type == OB_ARMATURE)
+ m_pose = m_blendtarget->pose;
+ }
+ if (m_blendsubtarget) {
+ Mat4CpyMat4(m_blendsubmat, m_blendsubtarget->obmat);
+ if (m_blendsubtarget->type == OB_ARMATURE)
+ m_subpose = m_blendsubtarget->pose;
+ }
+ if (m_target)
+ m_target->RegisterObject(m_armature);
+ if (m_subtarget)
+ m_subtarget->RegisterObject(m_armature);
+ BLI_snprintf(m_name, sizeof(m_name), "%s:%s", m_posechannel->name, m_constraint->name);
+}
+
+BL_ArmatureConstraint::~BL_ArmatureConstraint()
+{
+ if (m_target)
+ m_target->UnregisterObject(m_armature);
+ if (m_subtarget)
+ m_subtarget->UnregisterObject(m_armature);
+}
+
+BL_ArmatureConstraint* BL_ArmatureConstraint::GetReplica() const
+{
+ BL_ArmatureConstraint* replica = new BL_ArmatureConstraint(*this);
+ replica->ProcessReplica();
+ return replica;
+}
+
+void BL_ArmatureConstraint::ReParent(BL_ArmatureObject* armature)
+{
+ m_armature = armature;
+ if (m_target)
+ m_target->RegisterObject(armature);
+ if (m_subtarget)
+ m_subtarget->RegisterObject(armature);
+ // find the corresponding constraint in the new armature object
+ if (m_constraint) {
+ bPose* newpose = armature->GetOrigPose();
+ char* constraint = m_constraint->name;
+ char* posechannel = m_posechannel->name;
+ bPoseChannel* pchan;
+ bConstraint* pcon;
+ m_constraint = NULL;
+ m_posechannel = NULL;
+ // and locate the constraint
+ for (pchan = (bPoseChannel*)newpose->chanbase.first; pchan; pchan=(bPoseChannel*)pchan->next) {
+ if (!strcmp(pchan->name, posechannel)) {
+ // now locate the constraint
+ for (pcon = (bConstraint*)pchan->constraints.first; pcon; pcon=(bConstraint*)pcon->next) {
+ if (!strcmp(pcon->name, constraint)) {
+ m_constraint = pcon;
+ m_posechannel = pchan;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+void BL_ArmatureConstraint::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
+{
+ void **h_obj = (*obj_map)[m_target];
+ if (h_obj) {
+ m_target->UnregisterObject(m_armature);
+ m_target = (KX_GameObject*)(*h_obj);
+ m_target->RegisterObject(m_armature);
+ }
+ h_obj = (*obj_map)[m_subtarget];
+ if (h_obj) {
+ m_subtarget->UnregisterObject(m_armature);
+ m_subtarget = (KX_GameObject*)(*h_obj);
+ m_subtarget->RegisterObject(m_armature);
+ }
+}
+
+bool BL_ArmatureConstraint::UnlinkObject(SCA_IObject* clientobj)
+{
+ bool res=false;
+ if (clientobj == m_target) {
+ m_target = NULL;
+ res = true;
+ }
+ if (clientobj == m_subtarget) {
+ m_subtarget = NULL;
+ res = true;
+ }
+ return res;
+}
+
+void BL_ArmatureConstraint::UpdateTarget()
+{
+ if (m_constraint && !(m_constraint->flag&CONSTRAINT_OFF) && (!m_blendtarget || m_target)) {
+ if (m_blendtarget) {
+ // external target, must be updated
+ m_target->UpdateBlenderObjectMatrix(m_blendtarget);
+ if (m_pose && m_target->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
+ // update the pose in case a bone is specified in the constraint target
+ m_blendtarget->pose = ((BL_ArmatureObject*)m_target)->GetOrigPose();
+ }
+ if (m_blendsubtarget && m_subtarget) {
+ m_subtarget->UpdateBlenderObjectMatrix(m_blendsubtarget);
+ if (m_subpose && m_subtarget->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
+ m_blendsubtarget->pose = ((BL_ArmatureObject*)m_target)->GetOrigPose();
+ }
+ }
+}
+
+void BL_ArmatureConstraint::RestoreTarget()
+{
+ if (m_constraint && !(m_constraint->flag&CONSTRAINT_OFF) && (!m_blendtarget || m_target)) {
+ if (m_blendtarget) {
+ Mat4CpyMat4(m_blendtarget->obmat, m_blendmat);
+ if (m_pose)
+ m_blendtarget->pose = m_pose;
+ }
+ if (m_blendsubtarget && m_subtarget) {
+ Mat4CpyMat4(m_blendsubtarget->obmat, m_blendsubmat);
+ if (m_subpose)
+ m_blendsubtarget->pose = m_subpose;
+ }
+ }
+}
+
+bool BL_ArmatureConstraint::Match(const char* posechannel, const char* constraint)
+{
+ return (!strcmp(m_posechannel->name, posechannel) && !strcmp(m_constraint->name, constraint));
+}
+
+void BL_ArmatureConstraint::SetTarget(KX_GameObject* target)
+{
+ if (m_blendtarget) {
+ if (target != m_target) {
+ m_target->UnregisterObject(m_armature);
+ m_target = target;
+ if (m_target)
+ m_target->RegisterObject(m_armature);
+ }
+ }
+
+}
+
+void BL_ArmatureConstraint::SetSubtarget(KX_GameObject* subtarget)
+{
+ if (m_blendsubtarget) {
+ if (subtarget != m_subtarget) {
+ m_subtarget->UnregisterObject(m_armature);
+ m_subtarget = subtarget;
+ if (m_subtarget)
+ m_subtarget->RegisterObject(m_armature);
+ }
+ }
+
+}
+
+// PYTHON
+
+PyMethodDef BL_ArmatureConstraint::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+// order of definition of attributes, must match Attributes[] array
+#define BCA_TYPE 0
+#define BCA_NAME 1
+#define BCA_ENFORCE 2
+#define BCA_HEADTAIL 3
+#define BCA_LINERROR 4
+#define BCA_ROTERROR 5
+#define BCA_TARGET 6
+#define BCA_SUBTARGET 7
+#define BCA_ACTIVE 8
+#define BCA_IKWEIGHT 9
+#define BCA_IKTYPE 10
+#define BCA_IKFLAG 11
+#define BCA_IKDIST 12
+#define BCA_IKMODE 13
+
+PyAttributeDef BL_ArmatureConstraint::Attributes[] = {
+ // Keep these attributes in order of BCA_ defines!!! used by py_attr_getattr and py_attr_setattr
+ KX_PYATTRIBUTE_RO_FUNCTION("type",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("name",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("enforce",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("headtail",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("lin_error",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("rot_error",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("target",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("subtarget",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("active",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("ik_weight",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("ik_type",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RO_FUNCTION("ik_flag",BL_ArmatureConstraint,py_attr_getattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("ik_dist",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+ KX_PYATTRIBUTE_RW_FUNCTION("ik_mode",BL_ArmatureConstraint,py_attr_getattr,py_attr_setattr),
+
+ { NULL } //Sentinel
+};
+
+
+PyObject* BL_ArmatureConstraint::py_attr_getattr(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureConstraint* self= static_cast<BL_ArmatureConstraint*>(self_v);
+ bConstraint* constraint = self->m_constraint;
+ bKinematicConstraint* ikconstraint = (constraint && constraint->type == CONSTRAINT_TYPE_KINEMATIC) ? (bKinematicConstraint*)constraint->data : NULL;
+ int attr_order = attrdef-Attributes;
+
+ if (!constraint) {
+ PyErr_SetString(PyExc_AttributeError, "constraint is NULL");
+ return NULL;
+ }
+
+ switch (attr_order) {
+ case BCA_TYPE:
+ return PyLong_FromLong(constraint->type);
+ case BCA_NAME:
+ return PyUnicode_FromString(constraint->name);
+ case BCA_ENFORCE:
+ return PyFloat_FromDouble(constraint->enforce);
+ case BCA_HEADTAIL:
+ return PyFloat_FromDouble(constraint->headtail);
+ case BCA_LINERROR:
+ return PyFloat_FromDouble(constraint->lin_error);
+ case BCA_ROTERROR:
+ return PyFloat_FromDouble(constraint->rot_error);
+ case BCA_TARGET:
+ if (!self->m_target)
+ Py_RETURN_NONE;
+ else
+ return self->m_target->GetProxy();
+ case BCA_SUBTARGET:
+ if (!self->m_subtarget)
+ Py_RETURN_NONE;
+ else
+ return self->m_subtarget->GetProxy();
+ case BCA_ACTIVE:
+ return PyBool_FromLong(constraint->flag & CONSTRAINT_OFF);
+ case BCA_IKWEIGHT:
+ case BCA_IKTYPE:
+ case BCA_IKFLAG:
+ case BCA_IKDIST:
+ case BCA_IKMODE:
+ if (!ikconstraint) {
+ PyErr_SetString(PyExc_AttributeError, "constraint is not of IK type");
+ return NULL;
+ }
+ switch (attr_order) {
+ case BCA_IKWEIGHT:
+ return PyFloat_FromDouble((ikconstraint)?ikconstraint->weight:0.0);
+ case BCA_IKTYPE:
+ return PyLong_FromLong(ikconstraint->type);
+ case BCA_IKFLAG:
+ return PyLong_FromLong(ikconstraint->flag);
+ case BCA_IKDIST:
+ return PyFloat_FromDouble(ikconstraint->dist);
+ case BCA_IKMODE:
+ return PyLong_FromLong(ikconstraint->mode);
+ }
+ // should not come here
+ break;
+ }
+ PyErr_SetString(PyExc_AttributeError, "constraint unknown attribute");
+ return NULL;
+}
+
+int BL_ArmatureConstraint::py_attr_setattr(void *self_v, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ BL_ArmatureConstraint* self= static_cast<BL_ArmatureConstraint*>(self_v);
+ bConstraint* constraint = self->m_constraint;
+ bKinematicConstraint* ikconstraint = (constraint && constraint->type == CONSTRAINT_TYPE_KINEMATIC) ? (bKinematicConstraint*)constraint->data : NULL;
+ int attr_order = attrdef-Attributes;
+ int ival;
+ double dval;
+ char* sval;
+ KX_GameObject *oval;
+
+ if (!constraint) {
+ PyErr_SetString(PyExc_AttributeError, "constraint is NULL");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ switch (attr_order) {
+ case BCA_ENFORCE:
+ dval = PyFloat_AsDouble(value);
+ if (dval < 0.0f || dval > 1.0f) { /* also accounts for non float */
+ PyErr_SetString(PyExc_AttributeError, "constraint.enforce = float: BL_ArmatureConstraint, expected a float between 0 and 1");
+ return PY_SET_ATTR_FAIL;
+ }
+ constraint->enforce = dval;
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_HEADTAIL:
+ dval = PyFloat_AsDouble(value);
+ if (dval < 0.0f || dval > 1.0f) { /* also accounts for non float */
+ PyErr_SetString(PyExc_AttributeError, "constraint.headtail = float: BL_ArmatureConstraint, expected a float between 0 and 1");
+ return PY_SET_ATTR_FAIL;
+ }
+ constraint->headtail = dval;
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_TARGET:
+ if (!ConvertPythonToGameObject(value, &oval, true, "constraint.target = value: BL_ArmatureConstraint"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+ self->SetTarget(oval);
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_SUBTARGET:
+ if (!ConvertPythonToGameObject(value, &oval, true, "constraint.subtarget = value: BL_ArmatureConstraint"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+ self->SetSubtarget(oval);
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_ACTIVE:
+ ival = PyObject_IsTrue( value );
+ if (ival == -1) {
+ PyErr_SetString(PyExc_AttributeError, "constraint.active = bool: BL_ArmatureConstraint, expected True or False");
+ return PY_SET_ATTR_FAIL;
+ }
+ self->m_constraint->flag = (self->m_constraint->flag & ~CONSTRAINT_OFF) | ((ival)?0:CONSTRAINT_OFF);
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_IKWEIGHT:
+ case BCA_IKDIST:
+ case BCA_IKMODE:
+ if (!ikconstraint) {
+ PyErr_SetString(PyExc_AttributeError, "constraint is not of IK type");
+ return PY_SET_ATTR_FAIL;
+ }
+ switch (attr_order) {
+ case BCA_IKWEIGHT:
+ dval = PyFloat_AsDouble(value);
+ if (dval < 0.0f || dval > 1.0f) { /* also accounts for non float */
+ PyErr_SetString(PyExc_AttributeError, "constraint.weight = float: BL_ArmatureConstraint, expected a float between 0 and 1");
+ return PY_SET_ATTR_FAIL;
+ }
+ ikconstraint->weight = dval;
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_IKDIST:
+ dval = PyFloat_AsDouble(value);
+ if (dval < 0.0f) { /* also accounts for non float */
+ PyErr_SetString(PyExc_AttributeError, "constraint.ik_dist = float: BL_ArmatureConstraint, expected a positive float");
+ return PY_SET_ATTR_FAIL;
+ }
+ ikconstraint->dist = dval;
+ return PY_SET_ATTR_SUCCESS;
+
+ case BCA_IKMODE:
+ ival = PyLong_AsLong(value);
+ if (ival < 0) {
+ PyErr_SetString(PyExc_AttributeError, "constraint.ik_mode = integer: BL_ArmatureConstraint, expected a positive integer");
+ return PY_SET_ATTR_FAIL;
+ }
+ ikconstraint->mode = ival;
+ return PY_SET_ATTR_SUCCESS;
+ }
+ // should not come here
+ break;
+
+ }
+
+ PyErr_SetString(PyExc_AttributeError, "constraint unknown attribute");
+ return PY_SET_ATTR_FAIL;
+}
+
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.h b/source/gameengine/Converter/BL_ArmatureConstraint.h
new file mode 100644
index 00000000000..f10849ea05b
--- /dev/null
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.h
@@ -0,0 +1,117 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 __BL_ARMATURECONSTRAINT
+#define __BL_ARMATURECONSTRAINT
+
+#include "DNA_constraint_types.h"
+#include "GEN_HashedPtr.h"
+#include "GEN_Map.h"
+#include "PyObjectPlus.h"
+
+class SCA_IObject;
+class KX_GameObject;
+class BL_ArmatureObject;
+struct bConstraint;
+struct bPoseChannel;
+struct Object;
+struct bPose;
+
+/**
+ * SG_DList : element of controlled constraint list
+ * head = BL_ArmatureObject::m_controlledConstraints
+ * SG_QList : not used
+ */
+class BL_ArmatureConstraint : public PyObjectPlus
+{
+ Py_Header;
+
+private:
+ struct bConstraint* m_constraint;
+ struct bPoseChannel* m_posechannel;
+ class BL_ArmatureObject* m_armature;
+ char m_name[64];
+ KX_GameObject* m_target;
+ KX_GameObject* m_subtarget;
+ struct Object* m_blendtarget;
+ struct Object* m_blendsubtarget;
+ float m_blendmat[4][4];
+ float m_blendsubmat[4][4];
+ struct bPose* m_pose;
+ struct bPose* m_subpose;
+
+public:
+ BL_ArmatureConstraint(class BL_ArmatureObject *armature,
+ struct bPoseChannel *posechannel,
+ struct bConstraint *constraint,
+ KX_GameObject* target,
+ KX_GameObject* subtarget);
+ virtual ~BL_ArmatureConstraint();
+
+
+ virtual PyObject* py_repr(void);
+
+ BL_ArmatureConstraint* GetReplica() const;
+ void ReParent(BL_ArmatureObject* armature);
+ void Relink(GEN_Map<GEN_HashedPtr, void*> *map);
+ bool UnlinkObject(SCA_IObject* clientobj);
+
+ void UpdateTarget();
+ void RestoreTarget();
+
+ bool Match(const char* posechannel, const char* constraint);
+ const char* GetName() { return m_name; }
+
+ void SetConstraintFlag(int flag)
+ {
+ if (m_constraint)
+ m_constraint->flag |= flag;
+ }
+ void ClrConstraintFlag(int flag)
+ {
+ if (m_constraint)
+ m_constraint->flag &= ~flag;
+ }
+ void SetWeight(float weight)
+ {
+ if (m_constraint && m_constraint->type == CONSTRAINT_TYPE_KINEMATIC && m_constraint->data) {
+ bKinematicConstraint* con = (bKinematicConstraint*)m_constraint->data;
+ con->weight = weight;
+ }
+ }
+ void SetTarget(KX_GameObject* target);
+ void SetSubtarget(KX_GameObject* subtarget);
+
+ // Python access
+ 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 //__BL_ARMATURECONSTRAINT
+
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index f8a9b1b637f..d5660d9ef84 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -29,9 +29,15 @@
#include "BL_ArmatureObject.h"
#include "BL_ActionActuator.h"
+#include "KX_BlenderSceneConverter.h"
#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
+#include "BLI_arithb.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"
#include "MEM_guardedalloc.h"
@@ -39,6 +45,11 @@
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_nla_types.h"
+#include "DNA_constraint_types.h"
+#include "KX_PythonSeq.h"
+#include "KX_PythonInit.h"
+#include "KX_KetsjiEngine.h"
#include "MT_Matrix4x4.h"
@@ -46,6 +57,153 @@
#include <config.h>
#endif
+/**
+ * Move here pose function for game engine so that we can mix with GE objects
+ * Principle is as follow:
+ * Use Blender structures so that where_is_pose can be used unchanged
+ * Copy the constraint so that they can be enabled/disabled/added/removed at runtime
+ * Don't copy the constraints for the pose used by the Action actuator, it does not need them.
+ * Scan the constraint structures so that the KX equivalent of target objects are identified and
+ * stored in separate list.
+ * When it is about to evaluate the pose, set the KX object position in the obmat of the corresponding
+ * Blender objects and restore after the evaluation.
+ */
+void game_copy_pose(bPose **dst, bPose *src, int copy_constraint)
+{
+ bPose *out;
+ bPoseChannel *pchan, *outpchan;
+ GHash *ghash;
+
+ /* the game engine copies the current armature pose and then swaps
+ * the object pose pointer. this makes it possible to change poses
+ * without affecting the original blender data. */
+
+ if (!src) {
+ *dst=NULL;
+ return;
+ }
+ else if (*dst==src) {
+ printf("copy_pose source and target are the same\n");
+ *dst=NULL;
+ return;
+ }
+
+ out= (bPose*)MEM_dupallocN(src);
+ out->agroups.first= out->agroups.last= NULL;
+ out->ikdata = NULL;
+ out->ikparam = MEM_dupallocN(out->ikparam);
+ out->flag |= POSE_GAME_ENGINE;
+ BLI_duplicatelist(&out->chanbase, &src->chanbase);
+
+ /* remap pointers */
+ ghash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+
+ pchan= (bPoseChannel*)src->chanbase.first;
+ outpchan= (bPoseChannel*)out->chanbase.first;
+ for (; pchan; pchan=pchan->next, outpchan=outpchan->next)
+ BLI_ghash_insert(ghash, pchan, outpchan);
+
+ for (pchan=(bPoseChannel*)out->chanbase.first; pchan; pchan=(bPoseChannel*)pchan->next) {
+ pchan->parent= (bPoseChannel*)BLI_ghash_lookup(ghash, pchan->parent);
+ pchan->child= (bPoseChannel*)BLI_ghash_lookup(ghash, pchan->child);
+ pchan->path= NULL;
+
+ if (copy_constraint) {
+ ListBase listb;
+ // copy all constraint for backward compatibility
+ copy_constraints(&listb, &pchan->constraints); // copy_constraints NULLs listb
+ pchan->constraints= listb;
+ } else {
+ pchan->constraints.first = NULL;
+ pchan->constraints.last = NULL;
+ }
+ }
+
+ BLI_ghash_free(ghash, NULL, NULL);
+
+ *dst=out;
+}
+
+
+
+/* Only allowed for Poses with identical channels */
+void game_blend_poses(bPose *dst, bPose *src, float srcweight/*, short mode*/)
+{
+ short mode= ACTSTRIPMODE_BLEND;
+
+ bPoseChannel *dchan;
+ const bPoseChannel *schan;
+ bConstraint *dcon, *scon;
+ float dstweight;
+ int i;
+
+ switch (mode){
+ case ACTSTRIPMODE_BLEND:
+ dstweight = 1.0F - srcweight;
+ break;
+ case ACTSTRIPMODE_ADD:
+ dstweight = 1.0F;
+ break;
+ default :
+ dstweight = 1.0F;
+ }
+
+ schan= (bPoseChannel*)src->chanbase.first;
+ for (dchan = (bPoseChannel*)dst->chanbase.first; dchan; dchan=(bPoseChannel*)dchan->next, schan= (bPoseChannel*)schan->next){
+ // always blend on all channels since we don't know which one has been set
+ /* quat interpolation done separate */
+ if (schan->rotmode == PCHAN_ROT_QUAT) {
+ float dquat[4], squat[4];
+
+ QUATCOPY(dquat, dchan->quat);
+ QUATCOPY(squat, schan->quat);
+ if (mode==ACTSTRIPMODE_BLEND)
+ QuatInterpol(dchan->quat, dquat, squat, srcweight);
+ else {
+ QuatMulFac(squat, srcweight);
+ QuatMul(dchan->quat, dquat, squat);
+ }
+
+ NormalQuat(dchan->quat);
+ }
+
+ for (i=0; i<3; i++) {
+ /* blending for loc and scale are pretty self-explanatory... */
+ dchan->loc[i] = (dchan->loc[i]*dstweight) + (schan->loc[i]*srcweight);
+ dchan->size[i] = 1.0f + ((dchan->size[i]-1.0f)*dstweight) + ((schan->size[i]-1.0f)*srcweight);
+
+ /* euler-rotation interpolation done here instead... */
+ // FIXME: are these results decent?
+ if (schan->rotmode)
+ dchan->eul[i] = (dchan->eul[i]*dstweight) + (schan->eul[i]*srcweight);
+ }
+ for(dcon= (bConstraint*)dchan->constraints.first, scon= (bConstraint*)schan->constraints.first; dcon && scon; dcon= (bConstraint*)dcon->next, scon= (bConstraint*)scon->next) {
+ /* no 'add' option for constraint blending */
+ dcon->enforce= dcon->enforce*(1.0f-srcweight) + scon->enforce*srcweight;
+ }
+ }
+
+ /* this pose is now in src time */
+ dst->ctime= src->ctime;
+}
+
+void game_free_pose(bPose *pose)
+{
+ if (pose) {
+ /* free pose-channels and constraints */
+ free_pose_channels(pose);
+
+ /* free IK solver state */
+ BIK_clear_data(pose);
+
+ /* free IK solver param */
+ if (pose->ikparam)
+ MEM_freeN(pose->ikparam);
+
+ MEM_freeN(pose);
+ }
+}
+
BL_ArmatureObject::BL_ArmatureObject(
void* sgReplicationInfo,
SG_Callbacks callbacks,
@@ -53,12 +211,17 @@ BL_ArmatureObject::BL_ArmatureObject(
Scene *scene)
: KX_GameObject(sgReplicationInfo,callbacks),
+ m_controlledConstraints(),
+ m_poseChannels(),
m_objArma(armature),
- m_scene(scene), // maybe remove later. needed for where_is_pose
m_framePose(NULL),
+ m_scene(scene), // maybe remove later. needed for where_is_pose
m_lastframe(0.0),
+ m_timestep(0.040),
m_activeAct(NULL),
m_activePriority(999),
+ m_constraintNumber(0),
+ m_channelNumber(0),
m_lastapplyframe(0.0)
{
m_armature = (bArmature *)armature->data;
@@ -67,7 +230,177 @@ BL_ArmatureObject::BL_ArmatureObject(
* the original pose before calling into blender functions, to deal with
* replica's or other objects using the same blender object */
m_pose = NULL;
- game_copy_pose(&m_pose, m_objArma->pose);
+ game_copy_pose(&m_pose, m_objArma->pose, 1);
+ // store the original armature object matrix
+ memcpy(m_obmat, m_objArma->obmat, sizeof(m_obmat));
+}
+
+BL_ArmatureObject::~BL_ArmatureObject()
+{
+ BL_ArmatureConstraint* constraint;
+ while ((constraint = m_controlledConstraints.Remove()) != NULL) {
+ delete constraint;
+ }
+ BL_ArmatureChannel* channel;
+ while ((channel = static_cast<BL_ArmatureChannel*>(m_poseChannels.Remove())) != NULL) {
+ delete channel;
+ }
+ if (m_pose)
+ game_free_pose(m_pose);
+ if (m_framePose)
+ game_free_pose(m_framePose);
+}
+
+
+void BL_ArmatureObject::LoadConstraints(KX_BlenderSceneConverter* converter)
+{
+ // first delete any existing constraint (should not have any)
+ while (!m_controlledConstraints.Empty()) {
+ BL_ArmatureConstraint* constraint = m_controlledConstraints.Remove();
+ delete constraint;
+ }
+ m_constraintNumber = 0;
+
+ // list all the constraint and convert them to BL_ArmatureConstraint
+ // get the persistent pose structure
+ bPoseChannel* pchan;
+ bConstraint* pcon;
+ bConstraintTypeInfo* cti;
+ Object* blendtarget;
+ KX_GameObject* gametarget;
+ KX_GameObject* gamesubtarget;
+
+ // and locate the constraint
+ for (pchan = (bPoseChannel*)m_pose->chanbase.first; pchan; pchan=(bPoseChannel*)pchan->next) {
+ for (pcon = (bConstraint*)pchan->constraints.first; pcon; pcon=(bConstraint*)pcon->next) {
+ if (pcon->flag & CONSTRAINT_DISABLE)
+ continue;
+ // which constraint should we support?
+ switch (pcon->type) {
+ case CONSTRAINT_TYPE_TRACKTO:
+ case CONSTRAINT_TYPE_KINEMATIC:
+ case CONSTRAINT_TYPE_ROTLIKE:
+ case CONSTRAINT_TYPE_LOCLIKE:
+ case CONSTRAINT_TYPE_MINMAX:
+ case CONSTRAINT_TYPE_SIZELIKE:
+ case CONSTRAINT_TYPE_LOCKTRACK:
+ case CONSTRAINT_TYPE_STRETCHTO:
+ case CONSTRAINT_TYPE_CLAMPTO:
+ case CONSTRAINT_TYPE_TRANSFORM:
+ case CONSTRAINT_TYPE_DISTLIMIT:
+ cti = constraint_get_typeinfo(pcon);
+ gametarget = gamesubtarget = NULL;
+ if (cti && cti->get_constraint_targets) {
+ ListBase listb = { NULL, NULL };
+ cti->get_constraint_targets(pcon, &listb);
+ if (listb.first) {
+ bConstraintTarget* target = (bConstraintTarget*)listb.first;
+ if (target->tar && target->tar != m_objArma) {
+ // only remember external objects, self target is handled automatically
+ blendtarget = target->tar;
+ gametarget = converter->FindGameObject(blendtarget);
+ }
+ if (target->next != NULL) {
+ // secondary target
+ target = (bConstraintTarget*)target->next;
+ if (target->tar && target->tar != m_objArma) {
+ // only track external object
+ blendtarget = target->tar;
+ gamesubtarget = converter->FindGameObject(blendtarget);
+ }
+ }
+ }
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(pcon, &listb, 1);
+ }
+ BL_ArmatureConstraint* constraint = new BL_ArmatureConstraint(this, pchan, pcon, gametarget, gamesubtarget);
+ m_controlledConstraints.AddBack(constraint);
+ m_constraintNumber++;
+ }
+ }
+ }
+}
+
+BL_ArmatureConstraint* BL_ArmatureObject::GetConstraint(const char* posechannel, const char* constraintname)
+{
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ BL_ArmatureConstraint* constraint = *cit;
+ if (constraint->Match(posechannel, constraintname))
+ return constraint;
+ }
+ return NULL;
+}
+
+BL_ArmatureConstraint* BL_ArmatureObject::GetConstraint(const char* posechannelconstraint)
+{
+ // performance: use hash string instead of plain string compare
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ BL_ArmatureConstraint* constraint = *cit;
+ if (!strcmp(constraint->GetName(), posechannelconstraint))
+ return constraint;
+ }
+ return NULL;
+}
+
+BL_ArmatureConstraint* BL_ArmatureObject::GetConstraint(int index)
+{
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end() && index; ++cit, --index);
+ return (cit.end()) ? NULL : *cit;
+}
+
+/* this function is called to populate the m_poseChannels list */
+void BL_ArmatureObject::LoadChannels()
+{
+ if (m_poseChannels.Empty()) {
+ bPoseChannel* pchan;
+ BL_ArmatureChannel* proxy;
+
+ m_channelNumber = 0;
+ for (pchan = (bPoseChannel*)m_pose->chanbase.first; pchan; pchan=(bPoseChannel*)pchan->next) {
+ proxy = new BL_ArmatureChannel(this, pchan);
+ m_poseChannels.AddBack(proxy);
+ m_channelNumber++;
+ }
+ }
+}
+
+BL_ArmatureChannel* BL_ArmatureObject::GetChannel(bPoseChannel* pchan)
+{
+ LoadChannels();
+ SG_DList::iterator<BL_ArmatureChannel> cit(m_poseChannels);
+ for (cit.begin(); !cit.end(); ++cit)
+ {
+ BL_ArmatureChannel* channel = *cit;
+ if (channel->m_posechannel == pchan)
+ return channel;
+ }
+ return NULL;
+}
+
+BL_ArmatureChannel* BL_ArmatureObject::GetChannel(const char* str)
+{
+ LoadChannels();
+ SG_DList::iterator<BL_ArmatureChannel> cit(m_poseChannels);
+ for (cit.begin(); !cit.end(); ++cit)
+ {
+ BL_ArmatureChannel* channel = *cit;
+ if (!strcmp(channel->m_posechannel->name, str))
+ return channel;
+ }
+ return NULL;
+}
+
+BL_ArmatureChannel* BL_ArmatureObject::GetChannel(int index)
+{
+ LoadChannels();
+ if (index < 0 || index >= m_channelNumber)
+ return NULL;
+ SG_DList::iterator<BL_ArmatureChannel> cit(m_poseChannels);
+ for (cit.begin(); !cit.end() && index; ++cit, --index);
+ return (cit.end()) ? NULL : *cit;
}
CValue* BL_ArmatureObject::GetReplica()
@@ -83,22 +416,61 @@ void BL_ArmatureObject::ProcessReplica()
KX_GameObject::ProcessReplica();
m_pose = NULL;
- game_copy_pose(&m_pose, pose);
+ m_framePose = NULL;
+ game_copy_pose(&m_pose, pose, 1);
}
-BL_ArmatureObject::~BL_ArmatureObject()
+void BL_ArmatureObject::ReParentLogic()
{
- if (m_pose)
- game_free_pose(m_pose);
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ (*cit)->ReParent(this);
+ }
+ KX_GameObject::ReParentLogic();
+}
+
+void BL_ArmatureObject::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
+{
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ (*cit)->Relink(obj_map);
+ }
+ KX_GameObject::Relink(obj_map);
+}
+
+bool BL_ArmatureObject::UnlinkObject(SCA_IObject* clientobj)
+{
+ // clientobj is being deleted, make sure we don't hold any reference to it
+ bool res = false;
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ res |= (*cit)->UnlinkObject(clientobj);
+ }
+ return res;
}
void BL_ArmatureObject::ApplyPose()
{
m_armpose = m_objArma->pose;
m_objArma->pose = m_pose;
+ // in the GE, we use ctime to store the timestep
+ m_pose->ctime = (float)m_timestep;
//m_scene->r.cfra++;
if(m_lastapplyframe != m_lastframe) {
+ // update the constraint if any, first put them all off so that only the active ones will be updated
+ SG_DList::iterator<BL_ArmatureConstraint> cit(m_controlledConstraints);
+ for (cit.begin(); !cit.end(); ++cit) {
+ (*cit)->UpdateTarget();
+ }
+ // update ourself
+ UpdateBlenderObjectMatrix(m_objArma);
where_is_pose(m_scene, m_objArma); // XXX
+ // restore ourself
+ memcpy(m_objArma->obmat, m_obmat, sizeof(m_obmat));
+ // restore active targets
+ for (cit.begin(); !cit.end(); ++cit) {
+ (*cit)->RestoreTarget();
+ }
m_lastapplyframe = m_lastframe;
}
}
@@ -119,30 +491,37 @@ bool BL_ArmatureObject::SetActiveAction(BL_ActionActuator *act, short priority,
{
if (curtime != m_lastframe){
m_activePriority = 9999;
+ // compute the timestep for the underlying IK algorithm
+ m_timestep = curtime-m_lastframe;
m_lastframe= curtime;
m_activeAct = NULL;
// remember the pose at the start of the frame
- m_framePose = m_pose;
+ GetPose(&m_framePose);
}
- if (priority<=m_activePriority)
+ if (act)
{
- if (priority<m_activePriority)
- // this action overwrites the previous ones, start from initial pose to cancel their effects
- m_pose = m_framePose;
- if (m_activeAct && (m_activeAct!=act))
- m_activeAct->SetBlendTime(0.0); /* Reset the blend timer */
- m_activeAct = act;
- m_activePriority = priority;
- m_lastframe = curtime;
-
- return true;
- }
- else{
- act->SetBlendTime(0.0);
- return false;
+ if (priority<=m_activePriority)
+ {
+ if (priority<m_activePriority) {
+ // this action overwrites the previous ones, start from initial pose to cancel their effects
+ SetPose(m_framePose);
+ if (m_activeAct && (m_activeAct!=act))
+ /* Reset the blend timer since this new action cancels the old one */
+ m_activeAct->SetBlendTime(0.0);
+ }
+ m_activeAct = act;
+ m_activePriority = priority;
+ m_lastframe = curtime;
+
+ return true;
+ }
+ else{
+ act->SetBlendTime(0.0);
+ return false;
+ }
}
-
+ return false;
}
BL_ActionActuator * BL_ArmatureObject::GetActiveAction()
@@ -161,7 +540,7 @@ void BL_ArmatureObject::GetPose(bPose **pose)
a crash and memory leakage when
&BL_ActionActuator::m_pose is freed
*/
- game_copy_pose(pose, m_pose);
+ game_copy_pose(pose, m_pose, 0);
}
else {
if (*pose == m_pose)
@@ -178,7 +557,7 @@ void BL_ArmatureObject::GetMRDPose(bPose **pose)
/* Otherwise, copy the armature's pose channels into the caller-supplied pose */
if (!*pose)
- game_copy_pose(pose, m_pose);
+ game_copy_pose(pose, m_pose, 0);
else
extract_pose_from_pose(*pose, m_pose);
}
@@ -210,3 +589,68 @@ float BL_ArmatureObject::GetBoneLength(Bone* bone) const
{
return (float)(MT_Point3(bone->head) - MT_Point3(bone->tail)).length();
}
+
+// PYTHON
+
+PyTypeObject BL_ArmatureObject::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "BL_ArmatureObject",
+ 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 BL_ArmatureObject::Methods[] = {
+
+ KX_PYMETHODTABLE_NOARGS(BL_ArmatureObject, update),
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef BL_ArmatureObject::Attributes[] = {
+
+ KX_PYATTRIBUTE_RO_FUNCTION("constraints", BL_ArmatureObject, pyattr_get_constraints),
+ KX_PYATTRIBUTE_RO_FUNCTION("channels", BL_ArmatureObject, pyattr_get_channels),
+ {NULL} //Sentinel
+};
+
+PyObject* BL_ArmatureObject::pyattr_get_constraints(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ return KX_PythonSeq_CreatePyObject((static_cast<BL_ArmatureObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_CONSTRAINTS);
+}
+
+PyObject* BL_ArmatureObject::pyattr_get_channels(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ BL_ArmatureObject* self = static_cast<BL_ArmatureObject*>(self_v);
+ self->LoadChannels(); // make sure we have the channels
+ return KX_PythonSeq_CreatePyObject((static_cast<BL_ArmatureObject*>(self_v))->m_proxy, KX_PYGENSEQ_OB_TYPE_CHANNELS);
+}
+
+KX_PYMETHODDEF_DOC_NOARGS(BL_ArmatureObject, update,
+ "update()\n"
+ "Make sure that the armature will be updated on next graphic frame.\n"
+ "This is automatically done if a KX_ArmatureActuator with mode run is active\n"
+ "or if an action is playing. This function is usefull in other cases.\n")
+{
+ SetActiveAction(NULL, 0, KX_GetActiveEngine()->GetFrameTime());
+ Py_RETURN_NONE;
+}
diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h
index e1e176840a6..3e917e08001 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.h
+++ b/source/gameengine/Converter/BL_ArmatureObject.h
@@ -31,21 +31,34 @@
#define BL_ARMATUREOBJECT
#include "KX_GameObject.h"
+#include "BL_ArmatureConstraint.h"
+#include "BL_ArmatureChannel.h"
#include "SG_IObject.h"
+#include <vector>
+#include <algorithm>
struct bArmature;
struct Bone;
+struct bConstraint;
class BL_ActionActuator;
+class BL_ArmatureActuator;
class MT_Matrix4x4;
struct Object;
+class KX_BlenderSceneConverter;
class BL_ArmatureObject : public KX_GameObject
{
+ Py_Header;
public:
+
double GetLastFrame ();
short GetActivePriority();
virtual void ProcessReplica();
+ virtual void ReParentLogic();
+ virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
+ virtual bool UnlinkObject(SCA_IObject* clientobj);
+
class BL_ActionActuator * GetActiveAction();
BL_ArmatureObject(
@@ -60,6 +73,7 @@ public:
void GetMRDPose(struct bPose **pose);
void GetPose(struct bPose **pose);
void SetPose (struct bPose *pose);
+ struct bPose *GetOrigPose() {return m_pose;} // never edit this, only for accessing names
void ApplyPose();
void RestorePose();
@@ -72,6 +86,19 @@ public:
Object* GetArmatureObject() {return m_objArma;}
+ // for constraint python API
+ void LoadConstraints(KX_BlenderSceneConverter* converter);
+ size_t GetConstraintNumber() const { return m_constraintNumber; }
+ BL_ArmatureConstraint* GetConstraint(const char* posechannel, const char* constraint);
+ BL_ArmatureConstraint* GetConstraint(const char* posechannelconstraint);
+ BL_ArmatureConstraint* GetConstraint(int index);
+ // for pose channel python API
+ void LoadChannels();
+ size_t GetChannelNumber() const { return m_constraintNumber; }
+ BL_ArmatureChannel* GetChannel(bPoseChannel* channel);
+ BL_ArmatureChannel* GetChannel(const char* channel);
+ BL_ArmatureChannel* GetChannel(int index);
+
/// Retrieve the pose matrix for the specified bone.
/// Returns true on success.
bool GetBoneMatrix(Bone* bone, MT_Matrix4x4& matrix);
@@ -80,7 +107,17 @@ public:
float GetBoneLength(Bone* bone) const;
virtual int GetGameObjectType() { return OBJ_ARMATURE; }
+
+ // 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);
+
protected:
+ /* list element: BL_ArmatureConstraint. Use SG_DListHead to have automatic list replication */
+ SG_DListHead<BL_ArmatureConstraint> m_controlledConstraints;
+ /* list element: BL_ArmatureChannel. Use SG_DList to avoid list replication */
+ SG_DList m_poseChannels;
Object *m_objArma;
struct bArmature *m_armature;
struct bPose *m_pose;
@@ -88,11 +125,30 @@ protected:
struct bPose *m_framePose;
struct Scene *m_scene; // need for where_is_pose
double m_lastframe;
+ double m_timestep; // delta since last pose evaluation.
class BL_ActionActuator *m_activeAct;
short m_activePriority;
+ size_t m_constraintNumber;
+ size_t m_channelNumber;
+ // store the original armature object matrix
+ float m_obmat[4][4];
double m_lastapplyframe;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ArmatureObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
+/* Pose function specific to the game engine */
+void game_blend_poses(struct bPose *dst, struct bPose *src, float srcweight/*, short mode*/); /* was blend_poses */
+//void extract_pose_from_pose(struct bPose *pose, const struct bPose *src);
+void game_copy_pose(struct bPose **dst, struct bPose *src, int copy_con);
+void game_free_pose(struct bPose *pose);
+
+
#endif
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 177f261e40b..8feae48f12e 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -101,9 +101,6 @@
#include "KX_KetsjiEngine.h"
#include "KX_BlenderSceneConverter.h"
-#include"SND_Scene.h"
-#include "SND_SoundListener.h"
-
/* This little block needed for linking to Blender... */
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -323,9 +320,7 @@ bool ConvertMaterial(
MTFace* tface,
const char *tfaceName,
MFace* mface,
- MCol* mmcol,
- int lightlayer,
- Object* blenderobj,
+ MCol* mmcol,
MTF_localLayer *layers,
bool glslmat)
{
@@ -559,7 +554,7 @@ bool ConvertMaterial(
material->ref = mat->ref;
material->amb = mat->amb;
- material->ras_mode |= (mat->mode & MA_WIRE)? WIRE: 0;
+ material->ras_mode |= (mat->material_type == MA_TYPE_WIRE)? WIRE: 0;
}
else {
int valid = 0;
@@ -628,7 +623,7 @@ bool ConvertMaterial(
}
// with ztransp enabled, enforce alpha blending mode
- if(validmat && (mat->mode & MA_ZTRA) && (material->transp == TF_SOLID))
+ if(validmat && (mat->mode & MA_TRANSP) && (mat->mode & MA_ZTRANSP) && (material->transp == TF_SOLID))
material->transp = TF_ALPHA;
// always zsort alpha + add
@@ -721,12 +716,12 @@ bool ConvertMaterial(
return true;
}
-
-RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* rendertools, KX_Scene* scene, KX_BlenderSceneConverter *converter)
+/* blenderobj can be NULL, make sure its checked for */
+RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene, KX_BlenderSceneConverter *converter)
{
RAS_MeshObject *meshobj;
bool skinMesh = false;
- int lightlayer = blenderobj->lay;
+ int lightlayer = blenderobj ? blenderobj->lay:(1<<20)-1; // all layers if no object.
if ((meshobj = converter->FindGameMesh(mesh/*, ob->lay*/)) != NULL)
return meshobj;
@@ -749,13 +744,13 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
}
// Determine if we need to make a skinned mesh
- if (mesh->dvert || mesh->key || ((blenderobj->gameflag & OB_SOFT_BODY) != 0) || BL_ModifierDeformer::HasCompatibleDeformer(blenderobj))
+ if (blenderobj && (mesh->dvert || mesh->key || ((blenderobj->gameflag & OB_SOFT_BODY) != 0) || BL_ModifierDeformer::HasCompatibleDeformer(blenderobj)))
{
- meshobj = new BL_SkinMeshObject(mesh, lightlayer);
+ meshobj = new BL_SkinMeshObject(mesh);
skinMesh = true;
}
else
- meshobj = new RAS_MeshObject(mesh, lightlayer);
+ meshobj = new RAS_MeshObject(mesh);
// Extract avaiable layers
MTF_localLayer *layers = new MTF_localLayer[MAX_MTFACE];
@@ -844,9 +839,8 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
tan3 = tangent[f*4 + 3];
}
- /* get material */
- ma = give_current_material(blenderobj, mface->mat_nr+1);
-
+ ma = give_current_material(blenderobj, mface->mat_nr+1);
+
{
bool visible = true;
bool twoside = false;
@@ -860,7 +854,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
if (!bl_mat)
bl_mat = new BL_Material();
ConvertMaterial(bl_mat, ma, tface, tfaceName, mface, mcol,
- lightlayer, blenderobj, layers, converter->GetGLSLMaterials());
+ layers, converter->GetGLSLMaterials());
visible = ((bl_mat->ras_mode & POLY_VIS)!=0);
collider = ((bl_mat->ras_mode & COLLIDER)!=0);
@@ -883,7 +877,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
if (kx_blmat == NULL)
kx_blmat = new KX_BlenderMaterial();
- kx_blmat->Initialize(scene, bl_mat, skinMesh, lightlayer);
+ kx_blmat->Initialize(scene, bl_mat, skinMesh);
polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat);
}
else {
@@ -1039,7 +1033,10 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
layer.face++;
}
}
- meshobj->m_sharedvertex_map.clear();
+ // keep meshobj->m_sharedvertex_map for reinstance phys mesh.
+ // 2.49a and before it did: meshobj->m_sharedvertex_map.clear();
+ // but this didnt save much ram. - Campbell
+ meshobj->EndConversion();
// pre calculate texture generation
for(list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial();
@@ -1064,8 +1061,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
-static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blenderobject,
- KX_Scene *kxscene)
+static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blenderobject)
{
PHY_MaterialProps *materialProps = new PHY_MaterialProps;
@@ -1098,8 +1094,7 @@ static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blender
return materialProps;
}
-static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blenderobject,
- KX_Scene *kxscene)
+static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blenderobject)
{
PHY_ShapeProps *shapeProps = new PHY_ShapeProps;
@@ -1382,7 +1377,9 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
bool isCompoundChild = false;
bool hasCompoundChildren = !parent && (blenderobject->gameflag & OB_CHILD);
- if (parent/* && (parent->gameflag & OB_DYNAMIC)*/) {
+ /* When the parent is not OB_DYNAMIC and has no OB_COLLISION then it gets no bullet controller
+ * and cant be apart of the parents compound shape */
+ if (parent && (parent->gameflag & (OB_DYNAMIC | OB_COLLISION))) {
if ((parent->gameflag & OB_CHILD) != 0 && (blenderobject->gameflag & OB_CHILD))
{
@@ -1394,12 +1391,11 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
PHY_ShapeProps* shapeprops =
- CreateShapePropsFromBlenderObject(blenderobject,
- kxscene);
+ CreateShapePropsFromBlenderObject(blenderobject);
PHY_MaterialProps* smmaterial =
- CreateMaterialFromBlenderObject(blenderobject, kxscene);
+ CreateMaterialFromBlenderObject(blenderobject);
KX_ObjectProperties objprop;
objprop.m_lockXaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_X_AXIS) !=0;
@@ -1683,8 +1679,7 @@ static KX_GameObject *gameobject_from_blenderobject(
Object *ob,
KX_Scene *kxscene,
RAS_IRenderTools *rendertools,
- KX_BlenderSceneConverter *converter,
- Scene *blenderscene)
+ KX_BlenderSceneConverter *converter)
{
KX_GameObject *gameobj = NULL;
@@ -1718,7 +1713,7 @@ static KX_GameObject *gameobject_from_blenderobject(
Mesh* mesh = static_cast<Mesh*>(ob->data);
float center[3], extents[3];
float radius = my_boundbox_mesh((Mesh*) ob->data, center, extents);
- RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter);
+ RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,kxscene,converter);
// needed for python scripting
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
@@ -1744,7 +1739,7 @@ static KX_GameObject *gameobject_from_blenderobject(
if (bHasModifier) {
BL_ModifierDeformer *dcont = new BL_ModifierDeformer((BL_DeformableGameObject *)gameobj,
- blenderscene, ob, (BL_SkinMeshObject *)meshobj);
+ kxscene->GetBlenderScene(), ob, (BL_SkinMeshObject *)meshobj);
((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
if (bHasShapeKey && bHasArmature)
dcont->LoadShapeDrivers(ob->parent);
@@ -1783,7 +1778,7 @@ static KX_GameObject *gameobject_from_blenderobject(
kxscene,
KX_Scene::m_callbacks,
ob,
- blenderscene // handle
+ kxscene->GetBlenderScene() // handle
);
/* Get the current pose from the armature object and apply it as the rest pose */
break;
@@ -1798,7 +1793,6 @@ static KX_GameObject *gameobject_from_blenderobject(
}
if (gameobj)
{
- gameobj->SetPhysicsEnvironment(kxscene->GetPhysicsEnvironment());
gameobj->SetLayer(ob->lay);
gameobj->SetBlenderObject(ob);
/* set the visibility state based on the objects render option in the outliner */
@@ -1834,7 +1828,8 @@ ListBase *get_active_constraints2(Object *ob)
if (!ob)
return NULL;
- if (ob->flag & OB_POSEMODE) {
+ // XXX - shouldnt we care about the pose data and not the mode???
+ if (ob->mode & OB_MODE_POSE) {
bPoseChannel *pchan;
pchan = get_active_posechannel2(ob);
@@ -1897,12 +1892,10 @@ KX_GameObject* getGameOb(STR_String busc,CListValue* sumolist){
// convert blender objects into ketsji gameobjects
void BL_ConvertBlenderObjects(struct Main* maggie,
- const STR_String& scenename,
KX_Scene* kxscene,
KX_KetsjiEngine* ketsjiEngine,
e_PhysicsEngine physics_engine,
PyObject* pythondictionary,
- SCA_IInputDevice* keydev,
RAS_IRenderTools* rendertools,
RAS_ICanvas* canvas,
KX_BlenderSceneConverter* converter,
@@ -1910,7 +1903,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
)
{
- Scene *blenderscene = converter->GetBlenderSceneForName(scenename);
+ Scene *blenderscene = kxscene->GetBlenderScene();
// for SETLOOPER
Scene *sce;
Base *base;
@@ -1931,39 +1924,35 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
aspect_width = canvas->GetWidth();
aspect_height = canvas->GetHeight();
} else {
- if (blenderscene->framing.type == SCE_GAMEFRAMING_BARS) {
+ if (blenderscene->gm.framing.type == SCE_GAMEFRAMING_BARS) {
frame_type = RAS_FrameSettings::e_frame_bars;
- } else if (blenderscene->framing.type == SCE_GAMEFRAMING_EXTEND) {
+ } else if (blenderscene->gm.framing.type == SCE_GAMEFRAMING_EXTEND) {
frame_type = RAS_FrameSettings::e_frame_extend;
} else {
frame_type = RAS_FrameSettings::e_frame_scale;
}
- aspect_width = blenderscene->r.xsch;
- aspect_height = blenderscene->r.ysch;
+ aspect_width = blenderscene->gm.xsch;
+ aspect_height = blenderscene->gm.ysch;
}
RAS_FrameSettings frame_settings(
frame_type,
- blenderscene->framing.col[0],
- blenderscene->framing.col[1],
- blenderscene->framing.col[2],
+ blenderscene->gm.framing.col[0],
+ blenderscene->gm.framing.col[1],
+ blenderscene->gm.framing.col[2],
aspect_width,
aspect_height
);
kxscene->SetFramingType(frame_settings);
- kxscene->SetGravity(MT_Vector3(0,0,(blenderscene->world != NULL) ? -blenderscene->world->gravity : -9.8));
+ kxscene->SetGravity(MT_Vector3(0,0, -blenderscene->gm.gravity));
/* set activity culling parameters */
- if (blenderscene->world) {
- kxscene->SetActivityCulling( (blenderscene->world->mode & WO_ACTIVITY_CULLING) != 0);
- kxscene->SetActivityCullingRadius(blenderscene->world->activityBoxRadius);
- kxscene->SetDbvtCulling((blenderscene->world->mode & WO_DBVT_CULLING) != 0);
- } else {
- kxscene->SetActivityCulling(false);
- kxscene->SetDbvtCulling(false);
- }
+ kxscene->SetActivityCulling( (blenderscene->gm.mode & WO_ACTIVITY_CULLING) != 0);
+ kxscene->SetActivityCullingRadius(blenderscene->gm.activityBoxRadius);
+ kxscene->SetDbvtCulling((blenderscene->gm.mode & WO_DBVT_CULLING) != 0);
+
// no occlusion culling by default
kxscene->SetDbvtOcclusionRes(0);
@@ -2006,8 +1995,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
base->object,
kxscene,
rendertools,
- converter,
- blenderscene);
+ converter);
bool isInActiveLayer = (blenderobject->lay & activeLayerBitInfo) !=0;
bool addobj=true;
@@ -2196,8 +2184,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
blenderobject,
kxscene,
rendertools,
- converter,
- blenderscene);
+ converter);
// this code is copied from above except that
// object from groups are never in active layer
@@ -2419,8 +2406,11 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
obj->Release();
}
childrenlist->Release();
+
// now destroy recursively
+ converter->UnregisterGameObject(childobj); // removing objects during conversion make sure this runs too
kxscene->RemoveObject(childobj);
+
continue;
}
@@ -2497,10 +2487,10 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
}
}
if (occlusion)
- kxscene->SetDbvtOcclusionRes(blenderscene->world->occlusionRes);
+ kxscene->SetDbvtOcclusionRes(blenderscene->gm.occlusionRes);
}
if (blenderscene->world)
- kxscene->GetPhysicsEnvironment()->setNumTimeSubSteps(blenderscene->world->physubstep);
+ kxscene->GetPhysicsEnvironment()->setNumTimeSubSteps(blenderscene->gm.physubstep);
// now that the scenegraph is complete, let's instantiate the deformers.
// We need that to create reusable derived mesh and physic shapes
@@ -2511,13 +2501,21 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
gameobj->GetDeformer()->UpdateBuckets();
}
+ // Set up armature constraints
+ for (i=0;i<sumolist->GetCount();++i)
+ {
+ KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
+ if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
+ ((BL_ArmatureObject*)gameobj)->LoadConstraints(converter);
+ }
+
bool processCompoundChildren = false;
// create physics information
for (i=0;i<sumolist->GetCount();i++)
{
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
- struct Object* blenderobject = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobject = gameobj->GetBlenderObject();
int nummeshes = gameobj->GetMeshCount();
RAS_MeshObject* meshobj = 0;
if (nummeshes > 0)
@@ -2533,7 +2531,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
for (i=0;i<sumolist->GetCount();i++)
{
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
- struct Object* blenderobject = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobject = gameobj->GetBlenderObject();
int nummeshes = gameobj->GetMeshCount();
RAS_MeshObject* meshobj = 0;
if (nummeshes > 0)
@@ -2561,7 +2559,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
for (i=0;i<sumolist->GetCount();i++)
{
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
- struct Object* blenderobject = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobject = gameobj->GetBlenderObject();
ListBase *conlist;
bConstraint *curcon;
conlist = get_active_constraints2(blenderobject);
@@ -2629,23 +2627,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
}
}
- sumolist->Release();
-
- // convert global sound stuff
-
- /* XXX, glob is the very very wrong place for this
- * to be, re-enable once the listener has been moved into
- * the scene. */
-#if 1
- SND_Scene* soundscene = kxscene->GetSoundScene();
- SND_SoundListener* listener = soundscene->GetListener();
- if (listener && G.listener)
- {
- listener->SetDopplerFactor(G.listener->dopplerfactor);
- listener->SetDopplerVelocity(G.listener->dopplervelocity);
- listener->SetGain(G.listener->gain);
- }
-#endif
+ sumolist->Release();
// convert world
KX_WorldInfo* worldinfo = new BlenderWorldInfo(blenderscene->world);
@@ -2658,7 +2640,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
for (i=0;i<logicbrick_conversionlist->GetCount();i++)
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
- struct Object* blenderobj = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobj = gameobj->GetBlenderObject();
int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
BL_ConvertActuators(maggie->name, blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,layerMask,isInActiveLayer,rendertools,converter);
@@ -2666,7 +2648,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
- struct Object* blenderobj = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobj = gameobj->GetBlenderObject();
int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
BL_ConvertControllers(blenderobj,gameobj,logicmgr,pythondictionary,layerMask,isInActiveLayer,converter);
@@ -2674,10 +2656,10 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
- struct Object* blenderobj = converter->FindBlenderObject(gameobj);
+ struct Object* blenderobj = gameobj->GetBlenderObject();
int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
- BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,keydev,layerMask,isInActiveLayer,canvas,converter);
+ BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,layerMask,isInActiveLayer,canvas,converter);
// set the init state to all objects
gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state);
}
@@ -2715,4 +2697,3 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
RAS_BucketManager *bucketmanager = kxscene->GetBucketManager();
bucketmanager->OptimizeBuckets(distance);
}
-
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h
index 48f08fb357b..b8f9d1ec4e6 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.h
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.h
@@ -34,15 +34,13 @@
#include "KX_Python.h"
#include "KX_PhysicsEngineEnums.h"
-class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class RAS_IRenderTools* rendertools,class KX_Scene* scene, class KX_BlenderSceneConverter *converter);
+class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter);
void BL_ConvertBlenderObjects(struct Main* maggie,
- const STR_String& scenename,
class KX_Scene* kxscene,
class KX_KetsjiEngine* ketsjiEngine,
e_PhysicsEngine physics_engine,
PyObject* pythondictionary,
- class SCA_IInputDevice* keydev,
class RAS_IRenderTools* rendertools,
class RAS_ICanvas* canvas,
class KX_BlenderSceneConverter* sceneconverter,
diff --git a/source/gameengine/Converter/BL_DeformableGameObject.h b/source/gameengine/Converter/BL_DeformableGameObject.h
index b20b8e81b37..ed329e7953d 100644
--- a/source/gameengine/Converter/BL_DeformableGameObject.h
+++ b/source/gameengine/Converter/BL_DeformableGameObject.h
@@ -45,7 +45,6 @@ struct Key;
class BL_DeformableGameObject : public KX_GameObject
{
public:
-
CValue* GetReplica();
double GetLastFrame ()
@@ -100,6 +99,12 @@ protected:
Object* m_blendobj;
short m_activePriority;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DeformableGameObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h
index 99ae5f9dea0..1749d438d21 100644
--- a/source/gameengine/Converter/BL_MeshDeformer.h
+++ b/source/gameengine/Converter/BL_MeshDeformer.h
@@ -68,6 +68,8 @@ public:
virtual RAS_Deformer* GetReplica(){return NULL;};
virtual void ProcessReplica();
struct Mesh* GetMesh() { return m_bmesh; };
+ virtual class RAS_MeshObject* GetRasMesh() { return (RAS_MeshObject*)m_pMeshObject; };
+ virtual float (* GetTransVerts(int *tot))[3] { *tot= m_tvtot; return m_transverts; }
// virtual void InitDeform(double time){};
protected:
@@ -83,6 +85,13 @@ protected:
int m_tvtot;
BL_DeformableGameObject* m_gameobj;
double m_lastDeformUpdate;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_MeshDeformer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BL_ModifierDeformer.h b/source/gameengine/Converter/BL_ModifierDeformer.h
index b09cc2087ca..5cc84c7d1e4 100644
--- a/source/gameengine/Converter/BL_ModifierDeformer.h
+++ b/source/gameengine/Converter/BL_ModifierDeformer.h
@@ -101,6 +101,12 @@ protected:
Scene *m_scene;
DerivedMesh *m_dm;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ModifierDeformer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index 7aa8714de3a..81ce9ff6154 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -40,6 +40,7 @@
#include "STR_HashedString.h"
#include "DNA_nla_types.h"
#include "DNA_action_types.h"
+#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
#include "BKE_action.h"
#include "DNA_armature_types.h"
@@ -51,6 +52,10 @@
#include "FloatValue.h"
#include "PyObjectPlus.h"
+extern "C" {
+ #include "BKE_animsys.h"
+}
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -370,8 +375,11 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
m_blendstart = curtime;
}
// only interested in shape channel
- // XXX extract_ipochannels_from_action(&tchanbase, &key->id, m_action, "Shape", m_localtime);
-
+
+ // in 2.4x was // extract_ipochannels_from_action(&tchanbase, &key->id, m_action, "Shape", m_localtime);
+ BKE_animsys_evaluate_animdata(&key->id, key->adt, m_localtime, ADT_RECALC_ANIM);
+
+ // XXX - in 2.5 theres no way to do this. possibly not that important to support - Campbell
if (0) { // XXX !execute_ipochannels(&tchanbase)) {
// no update, this is possible if action does not match the keys, stop the action
keepgoing = false;
@@ -411,58 +419,29 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject BL_ShapeActionActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "BL_ShapeActionActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
+ "BL_ShapeActionActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyParentObject BL_ShapeActionActuator::Parents[] = {
- &BL_ShapeActionActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
-};
PyMethodDef BL_ShapeActionActuator::Methods[] = {
- {"setAction", (PyCFunction) BL_ShapeActionActuator::sPySetAction, METH_VARARGS, (PY_METHODCHAR)SetAction_doc},
- {"setStart", (PyCFunction) BL_ShapeActionActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
- {"setEnd", (PyCFunction) BL_ShapeActionActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
- {"setBlendin", (PyCFunction) BL_ShapeActionActuator::sPySetBlendin, METH_VARARGS, (PY_METHODCHAR)SetBlendin_doc},
- {"setPriority", (PyCFunction) BL_ShapeActionActuator::sPySetPriority, METH_VARARGS, (PY_METHODCHAR)SetPriority_doc},
- {"setFrame", (PyCFunction) BL_ShapeActionActuator::sPySetFrame, METH_VARARGS, (PY_METHODCHAR)SetFrame_doc},
- {"setProperty", (PyCFunction) BL_ShapeActionActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"setFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPySetFrameProperty, METH_VARARGS, (PY_METHODCHAR)SetFrameProperty_doc},
- {"setBlendtime", (PyCFunction) BL_ShapeActionActuator::sPySetBlendtime, METH_VARARGS, (PY_METHODCHAR)SetBlendtime_doc},
-
- {"getAction", (PyCFunction) BL_ShapeActionActuator::sPyGetAction, METH_NOARGS, (PY_METHODCHAR)GetAction_doc},
- {"getStart", (PyCFunction) BL_ShapeActionActuator::sPyGetStart, METH_NOARGS, (PY_METHODCHAR)GetStart_doc},
- {"getEnd", (PyCFunction) BL_ShapeActionActuator::sPyGetEnd, METH_NOARGS, (PY_METHODCHAR)GetEnd_doc},
- {"getBlendin", (PyCFunction) BL_ShapeActionActuator::sPyGetBlendin, METH_NOARGS, (PY_METHODCHAR)GetBlendin_doc},
- {"getPriority", (PyCFunction) BL_ShapeActionActuator::sPyGetPriority, METH_NOARGS, (PY_METHODCHAR)GetPriority_doc},
- {"getFrame", (PyCFunction) BL_ShapeActionActuator::sPyGetFrame, METH_NOARGS, (PY_METHODCHAR)GetFrame_doc},
- {"getProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
- {"getFrameProperty", (PyCFunction) BL_ShapeActionActuator::sPyGetFrameProperty, METH_NOARGS, (PY_METHODCHAR)GetFrameProperty_doc},
- {"getType", (PyCFunction) BL_ShapeActionActuator::sPyGetType, METH_NOARGS, (PY_METHODCHAR)GetType_doc},
- {"setType", (PyCFunction) BL_ShapeActionActuator::sPySetType, METH_NOARGS, (PY_METHODCHAR)SetType_doc},
{NULL,NULL} //Sentinel
};
@@ -480,401 +459,24 @@ PyAttributeDef BL_ShapeActionActuator::Attributes[] = {
{ NULL } //Sentinel
};
-
-PyObject* BL_ShapeActionActuator::py_getattro(PyObject* attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* BL_ShapeActionActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int BL_ShapeActionActuator::py_setattro(PyObject *attr, PyObject* value) {
- py_setattro_up(SCA_IActuator);
-}
-
-/* setStart */
-const char BL_ShapeActionActuator::GetAction_doc[] =
-"getAction()\n"
-"\tReturns a string containing the name of the current action.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetAction() {
- ShowDeprecationWarning("getAction()", "the action property");
- if (m_action){
- return PyString_FromString(m_action->id.name+2);
- }
- Py_RETURN_NONE;
-}
-
-/* getProperty */
-const char BL_ShapeActionActuator::GetProperty_doc[] =
-"getProperty()\n"
-"\tReturns the name of the property to be used in FromProp mode.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetProperty() {
- ShowDeprecationWarning("getProperty()", "the property property");
- PyObject *result;
-
- result = Py_BuildValue("s", (const char *)m_propname);
-
- return result;
-}
-
-/* getFrame */
-const char BL_ShapeActionActuator::GetFrame_doc[] =
-"getFrame()\n"
-"\tReturns the current frame number.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetFrame() {
- ShowDeprecationWarning("getFrame()", "the frame property");
- PyObject *result;
-
- result = Py_BuildValue("f", m_localtime);
-
- return result;
-}
-
-/* getEnd */
-const char BL_ShapeActionActuator::GetEnd_doc[] =
-"getEnd()\n"
-"\tReturns the last frame of the action.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetEnd() {
- ShowDeprecationWarning("getEnd()", "the end property");
- PyObject *result;
-
- result = Py_BuildValue("f", m_endframe);
-
- return result;
-}
-
-/* getStart */
-const char BL_ShapeActionActuator::GetStart_doc[] =
-"getStart()\n"
-"\tReturns the starting frame of the action.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetStart() {
- ShowDeprecationWarning("getStart()", "the start property");
- PyObject *result;
-
- result = Py_BuildValue("f", m_startframe);
-
- return result;
-}
-
-/* getBlendin */
-const char BL_ShapeActionActuator::GetBlendin_doc[] =
-"getBlendin()\n"
-"\tReturns the number of interpolation animation frames to be\n"
-"\tgenerated when this actuator is triggered.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetBlendin() {
- ShowDeprecationWarning("getBlendin()", "the blendin property");
- PyObject *result;
-
- result = Py_BuildValue("f", m_blendin);
-
- return result;
-}
-
-/* getPriority */
-const char BL_ShapeActionActuator::GetPriority_doc[] =
-"getPriority()\n"
-"\tReturns the priority for this actuator. Actuators with lower\n"
-"\tPriority numbers will override actuators with higher numbers.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetPriority() {
- ShowDeprecationWarning("getPriority()", "the priority property");
- PyObject *result;
-
- result = Py_BuildValue("i", m_priority);
-
- return result;
-}
-
-/* setAction */
-const char BL_ShapeActionActuator::SetAction_doc[] =
-"setAction(action, (reset))\n"
-"\t - action : The name of the action to set as the current action.\n"
-"\t Should be an action with Shape channels.\n"
-"\t - reset : Optional parameter indicating whether to reset the\n"
-"\t blend timer or not. A value of 1 indicates that the\n"
-"\t timer should be reset. A value of 0 will leave it\n"
-"\t unchanged. If reset is not specified, the timer will"
-"\t be reset.\n";
-
-PyObject* BL_ShapeActionActuator::PySetAction(PyObject* args) {
- ShowDeprecationWarning("setAction()", "the action property");
- char *string;
- int reset = 1;
-
- if (PyArg_ParseTuple(args,"s|i:setAction",&string, &reset))
- {
- bAction *action;
-
- action = (bAction*)SCA_ILogicBrick::m_sCurrentLogicManager->GetActionByName(STR_String(string));
-
- if (!action){
- /* NOTE! Throw an exception or something */
- // printf ("setAction failed: Action not found\n", string);
- }
- else{
- m_action=action;
- if (reset)
- m_blendframe = 0.f;
- }
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setStart */
-const char BL_ShapeActionActuator::SetStart_doc[] =
-"setStart(start)\n"
-"\t - start : Specifies the starting frame of the animation.\n";
-
-PyObject* BL_ShapeActionActuator::PySetStart(PyObject* args) {
- ShowDeprecationWarning("setStart()", "the start property");
- float start;
-
- if (PyArg_ParseTuple(args,"f:setStart",&start))
- {
- m_startframe = start;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setEnd */
-const char BL_ShapeActionActuator::SetEnd_doc[] =
-"setEnd(end)\n"
-"\t - end : Specifies the ending frame of the animation.\n";
-
-PyObject* BL_ShapeActionActuator::PySetEnd(PyObject* args) {
- ShowDeprecationWarning("setEnd()", "the end property");
- float end;
-
- if (PyArg_ParseTuple(args,"f:setEnd",&end))
- {
- m_endframe = end;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setBlendin */
-const char BL_ShapeActionActuator::SetBlendin_doc[] =
-"setBlendin(blendin)\n"
-"\t - blendin : Specifies the number of frames of animation to generate\n"
-"\t when making transitions between actions.\n";
-
-PyObject* BL_ShapeActionActuator::PySetBlendin(PyObject* args) {
- ShowDeprecationWarning("setBlendin()", "the blendin property");
- float blendin;
-
- if (PyArg_ParseTuple(args,"f:setBlendin",&blendin))
- {
- m_blendin = blendin;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setBlendtime */
-const char BL_ShapeActionActuator::SetBlendtime_doc[] =
-"setBlendtime(blendtime)\n"
-"\t - blendtime : Allows the script to directly modify the internal timer\n"
-"\t used when generating transitions between actions. This\n"
-"\t parameter must be in the range from 0.0 to 1.0.\n";
-
-PyObject* BL_ShapeActionActuator::PySetBlendtime(PyObject* args) {
- ShowDeprecationWarning("setBlendtime()", "the blendTime property");
- float blendframe;
-
- if (PyArg_ParseTuple(args,"f:setBlendtime",&blendframe))
- {
- m_blendframe = blendframe * m_blendin;
- if (m_blendframe<0.f)
- m_blendframe = 0.f;
- if (m_blendframe>m_blendin)
- m_blendframe = m_blendin;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setPriority */
-const char BL_ShapeActionActuator::SetPriority_doc[] =
-"setPriority(priority)\n"
-"\t - priority : Specifies the new priority. Actuators will lower\n"
-"\t priority numbers will override actuators with higher\n"
-"\t numbers.\n";
-
-PyObject* BL_ShapeActionActuator::PySetPriority(PyObject* args) {
- ShowDeprecationWarning("setPriority()", "the priority property");
- int priority;
-
- if (PyArg_ParseTuple(args,"i:setPriority",&priority))
- {
- m_priority = priority;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* getProperty */
-const char BL_ShapeActionActuator::GetFrameProperty_doc[] =
-"getFrameProperty()\n"
-"\tReturns the name of the property, that is set to the current frame number.\n";
-
-PyObject* BL_ShapeActionActuator::PyGetFrameProperty() {
- ShowDeprecationWarning("getFrameProperty()", "the frameProperty property");
- PyObject *result;
-
- result = Py_BuildValue("s", (const char *)m_framepropname);
-
- return result;
-}
-
-
-/* setFrame */
-const char BL_ShapeActionActuator::SetFrame_doc[] =
-"setFrame(frame)\n"
-"\t - frame : Specifies the new current frame for the animation\n";
-
-PyObject* BL_ShapeActionActuator::PySetFrame(PyObject* args) {
- ShowDeprecationWarning("setFrame()", "the frame property");
- float frame;
-
- if (PyArg_ParseTuple(args,"f:setFrame",&frame))
- {
- m_localtime = frame;
- if (m_localtime<m_startframe)
- m_localtime=m_startframe;
- else if (m_localtime>m_endframe)
- m_localtime=m_endframe;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setProperty */
-const char BL_ShapeActionActuator::SetProperty_doc[] =
-"setProperty(prop)\n"
-"\t - prop : A string specifying the property name to be used in\n"
-"\t FromProp playback mode.\n";
-
-PyObject* BL_ShapeActionActuator::PySetProperty(PyObject* args) {
- ShowDeprecationWarning("setProperty()", "the property property");
- char *string;
-
- if (PyArg_ParseTuple(args,"s:setProperty",&string))
- {
- m_propname = string;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* setFrameProperty */
-const char BL_ShapeActionActuator::SetFrameProperty_doc[] =
-"setFrameProperty(prop)\n"
-"\t - prop : A string specifying the property of the frame set up update.\n";
-
-PyObject* BL_ShapeActionActuator::PySetFrameProperty(PyObject* args) {
- ShowDeprecationWarning("setFrameProperty()", "the frameProperty property");
- char *string;
-
- if (PyArg_ParseTuple(args,"s:setFrameProperty",&string))
- {
- m_framepropname = string;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-/* getType */
-const char BL_ShapeActionActuator::GetType_doc[] =
-"getType()\n"
-"\tReturns the operation mode of the actuator.\n";
-PyObject* BL_ShapeActionActuator::PyGetType() {
- ShowDeprecationWarning("getType()", "the type property");
- return Py_BuildValue("h", m_playtype);
-}
-
-/* setType */
-const char BL_ShapeActionActuator::SetType_doc[] =
-"setType(mode)\n"
-"\t - mode: Play (0), Flipper (2), LoopStop (3), LoopEnd (4) or Property (6)\n"
-"\tSet the operation mode of the actuator.\n";
-PyObject* BL_ShapeActionActuator::PySetType(PyObject* args) {
- ShowDeprecationWarning("setType()", "the type property");
- short typeArg;
-
- if (!PyArg_ParseTuple(args, "h:setType", &typeArg)) {
- return NULL;
- }
-
- switch (typeArg) {
- case ACT_ACTION_PLAY:
- case ACT_ACTION_FLIPPER:
- case ACT_ACTION_LOOP_STOP:
- case ACT_ACTION_LOOP_END:
- case ACT_ACTION_FROM_PROP:
- m_playtype = typeArg;
- break;
- default:
- printf("Invalid type for action actuator: %d\n", typeArg); /* error */
- }
-
- Py_RETURN_NONE;
-}
-
PyObject* BL_ShapeActionActuator::pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
BL_ShapeActionActuator* self= static_cast<BL_ShapeActionActuator*>(self_v);
- return PyString_FromString(self->GetAction() ? self->GetAction()->id.name+2 : "");
+ return PyUnicode_FromString(self->GetAction() ? self->GetAction()->id.name+2 : "");
}
int BL_ShapeActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
BL_ShapeActionActuator* self= static_cast<BL_ShapeActionActuator*>(self_v);
/* exact copy of BL_ActionActuator's function from here down */
- if (!PyString_Check(value))
+ if (!PyUnicode_Check(value))
{
PyErr_SetString(PyExc_ValueError, "actuator.action = val: Shape Action Actuator, expected the string name of the action");
return PY_SET_ATTR_FAIL;
}
bAction *action= NULL;
- STR_String val = PyString_AsString(value);
+ STR_String val = _PyUnicode_AsString(value);
if (val != "")
{
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.h b/source/gameengine/Converter/BL_ShapeActionActuator.h
index d268eef6d23..80157630e27 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.h
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.h
@@ -50,9 +50,8 @@ public:
short playtype,
short blendin,
short priority,
- float stride,
- PyTypeObject* T=&Type)
- : SCA_IActuator(gameobj,T),
+ float stride)
+ : SCA_IActuator(gameobj, KX_ACT_SHAPEACTION),
m_lastpos(0, 0, 0),
m_blendframe(0),
@@ -83,33 +82,6 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetAction);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetBlendin);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetPriority);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetStart);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetEnd);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetFrame);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetProperty);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetFrameProperty);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetBlendtime);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetChannel);
-
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetAction);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetBlendin);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetPriority);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetStart);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetEnd);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetFrame);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetProperty);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetFrameProperty);
-// KX_PYMETHOD(BL_ActionActuator,GetChannel);
- KX_PYMETHOD_DOC_NOARGS(BL_ShapeActionActuator,GetType);
- KX_PYMETHOD_DOC_VARARGS(BL_ShapeActionActuator,SetType);
-
- virtual PyObject* py_getattro(PyObject* attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject* attr, PyObject* value);
-
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);
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index d39917b0e5c..20ca7f07f2b 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -109,8 +109,8 @@ bool BL_ShapeDeformer::ExecuteShapeDrivers(void)
{
if (!m_shapeDrivers.empty() && PoseUpdated()) {
vector<IpoCurve*>::iterator it;
- void *poin;
- int type;
+// void *poin;
+// int type;
// the shape drivers use the bone matrix as input. Must
// update the matrix now
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.h b/source/gameengine/Converter/BL_ShapeDeformer.h
index 949e5e1e3ad..ca3770d4006 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.h
+++ b/source/gameengine/Converter/BL_ShapeDeformer.h
@@ -83,6 +83,12 @@ protected:
vector<IpoCurve*> m_shapeDrivers;
double m_lastShapeUpdate;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ShapeDeformer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h
index 7c43246a9d7..b83895d5609 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.h
+++ b/source/gameengine/Converter/BL_SkinDeformer.h
@@ -105,6 +105,12 @@ protected:
bool m_poseApplied;
bool m_recalcNormal;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_SkinDeformer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BL_SkinMeshObject.cpp b/source/gameengine/Converter/BL_SkinMeshObject.cpp
index 0a18296f261..4eb01df410b 100644
--- a/source/gameengine/Converter/BL_SkinMeshObject.cpp
+++ b/source/gameengine/Converter/BL_SkinMeshObject.cpp
@@ -46,8 +46,8 @@
#include "BL_SkinMeshObject.h"
#include "BL_DeformableGameObject.h"
-BL_SkinMeshObject::BL_SkinMeshObject(Mesh* mesh, int lightlayer)
- : RAS_MeshObject (mesh, lightlayer)
+BL_SkinMeshObject::BL_SkinMeshObject(Mesh* mesh)
+ : RAS_MeshObject (mesh)
{
m_bDeformed = true;
diff --git a/source/gameengine/Converter/BL_SkinMeshObject.h b/source/gameengine/Converter/BL_SkinMeshObject.h
index 8544a2b958c..838c6c3cb95 100644
--- a/source/gameengine/Converter/BL_SkinMeshObject.h
+++ b/source/gameengine/Converter/BL_SkinMeshObject.h
@@ -46,7 +46,7 @@ protected:
vector<int> m_cacheWeightIndex;
public:
- BL_SkinMeshObject(Mesh* mesh, int lightlayer);
+ BL_SkinMeshObject(Mesh* mesh);
~BL_SkinMeshObject();
void UpdateBuckets(void* clientobj, double* oglmatrix,
@@ -54,6 +54,13 @@ public:
// for shape keys,
void CheckWeightCache(struct Object* obj);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_SkinMeshObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Converter/BlenderWorldInfo.h b/source/gameengine/Converter/BlenderWorldInfo.h
index fd6bb0212b7..7ccb96e4683 100644
--- a/source/gameengine/Converter/BlenderWorldInfo.h
+++ b/source/gameengine/Converter/BlenderWorldInfo.h
@@ -94,6 +94,13 @@ public:
setMistColorBlue(
float d
);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BlenderWorldInfo"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__BLENDERWORLDINFO_H
diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 031c2234ea8..d617934ec01 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -27,48 +27,41 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/guardedalloc
- ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
- ../../../intern/SoundSystem
- ../../../intern/SoundSystem/include
- ../../../intern/SoundSystem/openal
- ../../../intern/SoundSystem/dummy
- ../../../intern/SoundSystem/intern
- ../../../source/gameengine/Converter
- ../../../source/gameengine/BlenderRoutines
- ../../../source/blender/imbuf
- ../../../intern/moto/include
- ../../../source/gameengine/Ketsji
- ../../../source/gameengine/Ketsji/KXNetwork
- ../../../source/blender/blenlib
- ../../../source/blender/blenkernel
- ../../../source/blender/windowmanager
- ../../../source/blender
- ../../../source/blender/include
- ../../../source/blender/makesdna
- ../../../source/blender/makesrna
- ../../../source/gameengine/Rasterizer
- ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
- ../../../source/gameengine/GameLogic
- ../../../source/gameengine/Expressions
- ../../../source/gameengine/Network
- ../../../source/gameengine/SceneGraph
- ../../../source/gameengine/Physics/common
- ../../../source/gameengine/Physics/Bullet
- ../../../source/gameengine/Physics/BlOde
- ../../../source/gameengine/Physics/Dummy
- ../../../source/gameengine/Physics/Sumo
- ../../../source/gameengine/Physics/Sumo/Fuzzics/include
- ../../../source/gameengine/Network/LoopBackNetwork
- ../../../source/blender/misc
- ../../../source/blender/blenloader
- ../../../source/blender/gpu
- ../../../extern/bullet2/src
- ../../../extern/solid
- ${PYTHON_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/guardedalloc
+ ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../intern/audaspace/intern
+ ../../../source/gameengine/Converter
+ ../../../source/gameengine/BlenderRoutines
+ ../../../source/blender/imbuf
+ ../../../intern/moto/include
+ ../../../source/gameengine/Ketsji
+ ../../../source/gameengine/Ketsji/KXNetwork
+ ../../../source/blender/blenlib
+ ../../../source/blender/blenkernel
+ ../../../source/blender/windowmanager
+ ../../../source/blender
+ ../../../source/blender/include
+ ../../../source/blender/makesdna
+ ../../../source/blender/makesrna
+ ../../../source/gameengine/Rasterizer
+ ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../source/gameengine/GameLogic
+ ../../../source/gameengine/Expressions
+ ../../../source/gameengine/Network
+ ../../../source/gameengine/SceneGraph
+ ../../../source/gameengine/Physics/common
+ ../../../source/gameengine/Physics/Bullet
+ ../../../source/gameengine/Physics/Dummy
+ ../../../source/gameengine/Network/LoopBackNetwork
+ ../../../source/blender/misc
+ ../../../source/blender/blenloader
+ ../../../source/blender/gpu
+ ../../../source/blender/ikplugin
+ ../../../extern/bullet2/src
+ ${PYTHON_INC}
)
BLENDERLIB(bf_converter "${SRC}" "${INC}")
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
index c3264a2bc37..24910422176 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
@@ -62,7 +62,7 @@ BL_InterpolatorList::~BL_InterpolatorList() {
}
}
-KX_IScalarInterpolator *BL_InterpolatorList::GetScalarInterpolator(char *rna_path, int array_index) {
+KX_IScalarInterpolator *BL_InterpolatorList::GetScalarInterpolator(const char *rna_path, int array_index) {
for(BL_InterpolatorList::iterator i = begin(); (i != end()) ; i++ )
{
FCurve *fcu= (static_cast<BL_ScalarInterpolator *>(*i))->GetFCurve();
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
index 396a7d197df..e7fbb8083e4 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
@@ -49,6 +49,13 @@ public:
private:
struct FCurve *m_fcu;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ScalarInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -57,7 +64,14 @@ public:
BL_InterpolatorList(struct AnimData *adt);
~BL_InterpolatorList();
- KX_IScalarInterpolator *GetScalarInterpolator(char *rna_path, int array_index);
+ KX_IScalarInterpolator *GetScalarInterpolator(const char *rna_path, int array_index);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_InterpolatorList"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_SCALARINTERPOLATOR_H
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 9e0a710f44f..151564391f3 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -242,15 +242,13 @@ struct BlenderDebugDraw : public btIDebugDraw
#endif
-void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename,
- class KX_Scene* destinationscene,
+void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
PyObject* dictobj,
- class SCA_IInputDevice* keyinputdev,
class RAS_IRenderTools* rendertools,
class RAS_ICanvas* canvas)
{
//find out which physics engine
- Scene *blenderscene = GetBlenderSceneForName(scenename);
+ Scene *blenderscene = destinationscene->GetBlenderScene();
e_PhysicsEngine physics_engine = UseBullet;
bool useDbvtCulling = false;
@@ -262,38 +260,34 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename,
if (blenderscene)
{
- if (blenderscene->world)
+ switch (blenderscene->gm.physicsEngine)
{
- switch (blenderscene->world->physicsEngine)
+ case WOPHY_BULLET:
{
- case WOPHY_BULLET:
- {
- physics_engine = UseBullet;
- useDbvtCulling = (blenderscene->world->mode & WO_DBVT_CULLING) != 0;
- break;
- }
-
- case WOPHY_ODE:
- {
- physics_engine = UseODE;
- break;
- }
- case WOPHY_DYNAMO:
- {
- physics_engine = UseDynamo;
- break;
- }
- case WOPHY_SUMO:
- {
- physics_engine = UseSumo;
- break;
- }
- case WOPHY_NONE:
- {
- physics_engine = UseNone;
- }
+ physics_engine = UseBullet;
+ useDbvtCulling = (blenderscene->gm.mode & WO_DBVT_CULLING) != 0;
+ break;
+ }
+
+ case WOPHY_ODE:
+ {
+ physics_engine = UseODE;
+ break;
+ }
+ case WOPHY_DYNAMO:
+ {
+ physics_engine = UseDynamo;
+ break;
+ }
+ case WOPHY_SUMO:
+ {
+ physics_engine = UseSumo;
+ break;
+ }
+ case WOPHY_NONE:
+ {
+ physics_engine = UseNone;
}
-
}
}
@@ -331,12 +325,10 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename,
}
BL_ConvertBlenderObjects(m_maggie,
- scenename,
destinationscene,
m_ketsjiEngine,
physics_engine,
dictobj,
- keyinputdev,
rendertools,
canvas,
this,
@@ -353,10 +345,6 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename,
//This cache mecanism is buggy so I leave it disable and the memory leak
//that would result from this is fixed in RemoveScene()
m_map_mesh_to_gamemesh.clear();
- //Don't clear this lookup, it is needed for the baking physics into ipo animation
- //To avoid it's infinite grows, object will be unregister when they are deleted
- //see KX_Scene::NewRemoveObject
- //m_map_gameobject_to_blender.clear();
}
// This function removes all entities stored in the converter for that scene
@@ -470,27 +458,28 @@ void KX_BlenderSceneConverter::RegisterGameObject(
KX_GameObject *gameobject,
struct Object *for_blenderobject)
{
- m_map_gameobject_to_blender.insert(CHashedPtr(gameobject),for_blenderobject);
+ /* only maintained while converting, freed during game runtime */
m_map_blender_to_gameobject.insert(CHashedPtr(for_blenderobject),gameobject);
}
+/* only need to run this during conversion since
+ * m_map_blender_to_gameobject is freed after conversion */
void KX_BlenderSceneConverter::UnregisterGameObject(
KX_GameObject *gameobject)
{
- CHashedPtr gptr(gameobject);
- struct Object **bobp= m_map_gameobject_to_blender[gptr];
+ struct Object *bobp= gameobject->GetBlenderObject();
if (bobp) {
- CHashedPtr bptr(*bobp);
+ CHashedPtr bptr(bobp);
KX_GameObject **gobp= m_map_blender_to_gameobject[bptr];
if (gobp && *gobp == gameobject)
+ {
// also maintain m_map_blender_to_gameobject if the gameobject
// being removed is matching the blender object
m_map_blender_to_gameobject.remove(bptr);
- m_map_gameobject_to_blender.remove(gptr);
+ }
}
}
-
KX_GameObject *KX_BlenderSceneConverter::FindGameObject(
struct Object *for_blenderobject)
{
@@ -499,18 +488,6 @@ KX_GameObject *KX_BlenderSceneConverter::FindGameObject(
return obp?*obp:NULL;
}
-
-
-struct Object *KX_BlenderSceneConverter::FindBlenderObject(
- KX_GameObject *for_gameobject)
-{
- struct Object **obp= m_map_gameobject_to_blender[CHashedPtr(for_gameobject)];
-
- return obp?*obp:NULL;
-}
-
-
-
void KX_BlenderSceneConverter::RegisterGameMesh(
RAS_MeshObject *gamemesh,
struct Mesh *for_blendermesh)
@@ -697,7 +674,7 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
{
//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
- Object* blenderObject = FindBlenderObject(gameObj);
+ Object* blenderObject = gameObj->GetBlenderObject();
if (blenderObject)
{
//erase existing ipo's
@@ -761,7 +738,7 @@ void KX_BlenderSceneConverter::resetNoneDynamicObjectToIpo(){
for (int ix=0;ix<parentList->GetCount();ix++){
KX_GameObject* gameobj = (KX_GameObject*)parentList->GetValue(ix);
if (!gameobj->IsDynamic()){
- Object* blenderobject = FindBlenderObject(gameobj);
+ Object* blenderobject = gameobj->GetBlenderObject();
if (!blenderobject)
continue;
if (blenderobject->type==OB_ARMATURE)
@@ -815,9 +792,10 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
{
//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
- Object* blenderObject = FindBlenderObject(gameObj);
+ Object* blenderObject = gameObj->GetBlenderObject();
if (blenderObject && blenderObject->ipo)
{
+#if 0
const MT_Point3& position = gameObj->NodeGetWorldPosition();
//const MT_Vector3& scale = gameObj->NodeGetWorldScaling();
const MT_Matrix3x3& orn = gameObj->NodeGetWorldOrientation();
@@ -827,7 +805,6 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
float tmat[3][3];
// XXX animato
-#if 0
Ipo* ipo = blenderObject->ipo;
//create the curves, if not existing, set linear if new
@@ -916,7 +893,7 @@ void KX_BlenderSceneConverter::TestHandlesPhysicsObjectToAnimationIpo()
{
//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
- Object* blenderObject = FindBlenderObject(gameObj);
+ Object* blenderObject = gameObj->GetBlenderObject();
if (blenderObject && blenderObject->ipo)
{
// XXX animato
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h
index b65f49c2b59..bb87a21a683 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.h
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h
@@ -56,14 +56,10 @@ class KX_BlenderSceneConverter : public KX_ISceneConverter
// Should also have a list of collision shapes.
// For the time being this is held in KX_Scene::m_shapes
- GEN_Map<CHashedPtr,struct Object*> m_map_gameobject_to_blender;
- GEN_Map<CHashedPtr,KX_GameObject*> m_map_blender_to_gameobject;
-
- GEN_Map<CHashedPtr,RAS_MeshObject*> m_map_mesh_to_gamemesh;
-// GEN_Map<CHashedPtr,DT_ShapeHandle> m_map_gamemesh_to_sumoshape;
-
- GEN_Map<CHashedPtr,SCA_IActuator*> m_map_blender_to_gameactuator;
- GEN_Map<CHashedPtr,SCA_IController*> m_map_blender_to_gamecontroller;
+ GEN_Map<CHashedPtr,KX_GameObject*> m_map_blender_to_gameobject; /* cleared after conversion */
+ GEN_Map<CHashedPtr,RAS_MeshObject*> m_map_mesh_to_gamemesh; /* cleared after conversion */
+ GEN_Map<CHashedPtr,SCA_IActuator*> m_map_blender_to_gameactuator; /* cleared after conversion */
+ GEN_Map<CHashedPtr,SCA_IController*>m_map_blender_to_gamecontroller; /* cleared after conversion */
GEN_Map<CHashedPtr,BL_InterpolatorList*> m_map_blender_to_gameAdtList;
@@ -92,10 +88,8 @@ public:
* dictobj: python dictionary (for pythoncontrollers)
*/
virtual void ConvertScene(
- const STR_String& scenename,
class KX_Scene* destinationscene,
PyObject* dictobj,
- class SCA_IInputDevice* keyinputdev,
class RAS_IRenderTools* rendertools,
class RAS_ICanvas* canvas
);
@@ -109,14 +103,10 @@ public:
void RegisterGameObject(KX_GameObject *gameobject, struct Object *for_blenderobject);
void UnregisterGameObject(KX_GameObject *gameobject);
KX_GameObject *FindGameObject(struct Object *for_blenderobject);
- struct Object *FindBlenderObject(KX_GameObject *for_gameobject);
void RegisterGameMesh(RAS_MeshObject *gamemesh, struct Mesh *for_blendermesh);
RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh/*, unsigned int onlayer*/);
-// void RegisterSumoShape(DT_ShapeHandle shape, RAS_MeshObject *for_gamemesh);
-// DT_ShapeHandle FindSumoShape(RAS_MeshObject *for_gamemesh);
-
void RegisterPolyMaterial(RAS_IPolyMaterial *polymat);
void RegisterBlenderMaterial(BL_Material *mat);
@@ -150,6 +140,15 @@ public:
virtual bool GetGLSLMaterials();
struct Scene* GetBlenderSceneForName(const STR_String& name);
+
+ struct Main* GetMain() { return m_maggie; };
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSceneConverter"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_BLENDERSCENECONVERTER_H
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index ea812a71fdd..1cb16acf148 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -38,7 +38,7 @@
#include "KX_BlenderSceneConverter.h"
#include "KX_ConvertActuators.h"
-#include "SND_Scene.h"
+#include "AUD_C-API.h"
// Actuators
//SCA logiclibrary native logicbricks
#include "SCA_PropertyActuator.h"
@@ -50,7 +50,6 @@
#include "KX_SceneActuator.h"
#include "KX_IpoActuator.h"
#include "KX_SoundActuator.h"
-#include "KX_CDActuator.h"
#include "KX_ObjectActuator.h"
#include "KX_TrackToActuator.h"
#include "KX_ConstraintActuator.h"
@@ -89,6 +88,7 @@
#include "DNA_packedFile_types.h"
#include "BL_ActionActuator.h"
#include "BL_ShapeActionActuator.h"
+#include "BL_ArmatureActuator.h"
/* end of blender include block */
#include "BL_BlenderDataConversion.h"
@@ -347,8 +347,7 @@ void BL_ConvertActuators(char* maggiename,
{
bSoundActuator* soundact = (bSoundActuator*) bact->data;
/* get type, and possibly a start and end frame */
- short startFrame = soundact->sta, stopFrame = soundact->end;
- KX_SoundActuator::KX_SOUNDACT_TYPE
+ KX_SoundActuator::KX_SOUNDACT_TYPE
soundActuatorType = KX_SoundActuator::KX_SOUNDACT_NODEF;
switch(soundact->type) {
@@ -378,173 +377,38 @@ void BL_ConvertActuators(char* maggiename,
if (soundActuatorType != KX_SoundActuator::KX_SOUNDACT_NODEF)
{
- SND_Scene* soundscene = scene->GetSoundScene();
- STR_String samplename = "";
- bool sampleisloaded = false;
-
- if (soundact->sound) {
- /* Need to convert the samplename into absolute path
- * before checking if its loaded */
- char fullpath[FILE_MAX];
-
- /* dont modify soundact->sound->name, only change a copy */
- BLI_strncpy(fullpath, soundact->sound->name, sizeof(fullpath));
- BLI_convertstringcode(fullpath, maggiename);
- samplename = fullpath;
-
- /* let's see if the sample was already loaded */
- if (soundscene->IsSampleLoaded(samplename))
- {
- sampleisloaded = true;
- }
- else {
- /* if not, make it so */
- PackedFile* pf = soundact->sound->newpackedfile;
-
- /* but we need a packed file then */
- if (pf)
- {
- if (soundscene->LoadSample(samplename, pf->data, pf->size) > -1)
- sampleisloaded = true;
- }
- /* or else load it from disk */
- else
- {
- if (soundscene->LoadSample(samplename, NULL, 0) > -1) {
- sampleisloaded = true;
- }
- else {
- std::cout << "WARNING: Sound actuator \"" << bact->name <<
- "\" from object \"" << blenderobject->id.name+2 <<
- "\" failed to load sample." << std::endl;
- }
- }
- }
- } else {
+ bSound* sound = soundact->sound;
+ bool is3d = soundact->flag & ACT_SND_3D_SOUND ? true : false;
+ AUD_Sound* snd_sound = NULL;
+ KX_3DSoundSettings settings;
+ settings.cone_inner_angle = soundact->sound3D.cone_inner_angle;
+ settings.cone_outer_angle = soundact->sound3D.cone_outer_angle;
+ settings.cone_outer_gain = soundact->sound3D.cone_outer_gain;
+ settings.max_distance = soundact->sound3D.max_distance;
+ settings.max_gain = soundact->sound3D.max_gain;
+ settings.min_gain = soundact->sound3D.min_gain;
+ settings.reference_distance = soundact->sound3D.reference_distance;
+ settings.rolloff_factor = soundact->sound3D.rolloff_factor;
+
+ if(!sound)
+ {
std::cout << "WARNING: Sound actuator \"" << bact->name <<
"\" from object \"" << blenderobject->id.name+2 <<
"\" has no sound datablock." << std::endl;
}
-
- /* Note, allowing actuators for sounds that are not there was added since 2.47
- * This is because python may expect the actuator and raise an exception if it dosnt find it
- * better just to add a dummy sound actuator. */
- SND_SoundObject* sndobj = NULL;
- if (sampleisloaded)
- {
- /* setup the SND_SoundObject */
- sndobj = new SND_SoundObject();
- sndobj->SetSampleName(samplename.Ptr());
- sndobj->SetObjectName(bact->name);
- if (soundact->sound) {
- sndobj->SetRollOffFactor(soundact->sound->attenuation);
- sndobj->SetGain(soundact->sound->volume);
- sndobj->SetPitch(exp((soundact->sound->pitch / 12.0) * log(2.0)));
- // sndobj->SetLoopStart(soundact->sound->loopstart);
- // sndobj->SetLoopStart(soundact->sound->loopend);
- if (soundact->sound->flags & SOUND_FLAGS_LOOP)
- {
- if (soundact->sound->flags & SOUND_FLAGS_BIDIRECTIONAL_LOOP)
- sndobj->SetLoopMode(SND_LOOP_BIDIRECTIONAL);
- else
- sndobj->SetLoopMode(SND_LOOP_NORMAL);
- }
- else {
- sndobj->SetLoopMode(SND_LOOP_OFF);
- }
-
- if (soundact->sound->flags & SOUND_FLAGS_PRIORITY)
- sndobj->SetHighPriority(true);
- else
- sndobj->SetHighPriority(false);
-
- if (soundact->sound->flags & SOUND_FLAGS_3D)
- sndobj->Set3D(true);
- else
- sndobj->Set3D(false);
- }
- else {
- /* dummy values for a NULL sound
- * see editsound.c - defaults are unlikely to change soon */
- sndobj->SetRollOffFactor(1.0);
- sndobj->SetGain(1.0);
- sndobj->SetPitch(1.0);
- sndobj->SetLoopMode(SND_LOOP_OFF);
- sndobj->SetHighPriority(false);
- sndobj->Set3D(false);
- }
- }
- KX_SoundActuator* tmpsoundact =
- new KX_SoundActuator(gameobj,
- sndobj,
- scene->GetSoundScene(), // needed for replication!
- soundActuatorType,
- startFrame,
- stopFrame);
-
+ else
+ snd_sound = sound->cache ? sound->cache : sound->handle;
+ KX_SoundActuator* tmpsoundact =
+ new KX_SoundActuator(gameobj,
+ snd_sound,
+ soundact->volume,
+ exp((soundact->pitch / 12.0) * log(2.0)),
+ is3d,
+ settings,
+ soundActuatorType);
+
tmpsoundact->SetName(bact->name);
baseact = tmpsoundact;
- if (sndobj)
- soundscene->AddObject(sndobj);
- }
- break;
- }
- case ACT_CD:
- {
- bCDActuator* cdact = (bCDActuator*) bact->data;
- /* get type, and possibly a start and end frame */
- short startFrame = cdact->sta, stopFrame = cdact->end;
- KX_CDActuator::KX_CDACT_TYPE
- cdActuatorType = KX_CDActuator::KX_CDACT_NODEF;
-
- switch(cdact->type)
- {
- case ACT_CD_PLAY_ALL:
- cdActuatorType = KX_CDActuator::KX_CDACT_PLAY_ALL;
- break;
- case ACT_CD_PLAY_TRACK:
- cdActuatorType = KX_CDActuator::KX_CDACT_PLAY_TRACK;
- break;
- case ACT_CD_LOOP_TRACK:
- cdActuatorType = KX_CDActuator::KX_CDACT_LOOP_TRACK;
- break;
- case ACT_CD_VOLUME:
- cdActuatorType = KX_CDActuator::KX_CDACT_VOLUME;
- break;
- case ACT_CD_STOP:
- cdActuatorType = KX_CDActuator::KX_CDACT_STOP;
- break;
- case ACT_CD_PAUSE:
- cdActuatorType = KX_CDActuator::KX_CDACT_PAUSE;
- break;
- case ACT_CD_RESUME:
- cdActuatorType = KX_CDActuator::KX_CDACT_RESUME;
- break;
-
- default:
- /* This is an error!!! */
- cdActuatorType = KX_CDActuator::KX_CDACT_NODEF;
- }
-
- if (cdActuatorType != KX_CDActuator::KX_CDACT_NODEF)
- {
- SND_CDObject* pCD = SND_CDObject::Instance();
-
- if (pCD)
- {
- pCD->SetGain(cdact->volume);
-
- KX_CDActuator* tmpcdact =
- new KX_CDActuator(gameobj,
- scene->GetSoundScene(), // needed for replication!
- cdActuatorType,
- cdact->track,
- startFrame,
- stopFrame);
-
- tmpcdact->SetName(bact->name);
- baseact = tmpcdact;
- }
}
break;
}
@@ -629,7 +493,6 @@ void BL_ConvertActuators(char* maggiename,
tmpmesh = BL_ConvertMesh(
editobact->me,
blenderobject,
- rendertools,
scene,
converter
);
@@ -638,7 +501,10 @@ void BL_ConvertActuators(char* maggiename,
= new KX_SCA_ReplaceMeshActuator(
gameobj,
tmpmesh,
- scene
+ scene,
+ (editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX)==0,
+ (editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS)!=0
+
);
baseact = tmpreplaceact;
@@ -1156,6 +1022,15 @@ void BL_ConvertActuators(char* maggiename,
break;
}
+ case ACT_ARMATURE:
+ {
+ bArmatureActuator* armAct = (bArmatureActuator*) bact->data;
+ KX_GameObject *tmpgob = converter->FindGameObject(armAct->target);
+ KX_GameObject *subgob = converter->FindGameObject(armAct->subtarget);
+ BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(gameobj, armAct->type, armAct->posechannel, armAct->constraint, tmpgob, subgob, armAct->weight);
+ baseact = tmparmact;
+ break;
+ }
default:
; /* generate some error */
}
diff --git a/source/gameengine/Converter/KX_ConvertProperties.cpp b/source/gameengine/Converter/KX_ConvertProperties.cpp
index 5e8d6f3cbf0..1c22d2a0600 100644
--- a/source/gameengine/Converter/KX_ConvertProperties.cpp
+++ b/source/gameengine/Converter/KX_ConvertProperties.cpp
@@ -32,26 +32,26 @@
#include <config.h>
#endif
-/* This little block needed for linking to Blender... */
-#ifdef WIN32
-#include "BLI_winstuff.h"
-#endif
#include "DNA_object_types.h"
#include "DNA_property_types.h"
/* end of blender include block */
+
#include "Value.h"
#include "VectorValue.h"
#include "BoolValue.h"
#include "StringValue.h"
#include "FloatValue.h"
#include "KX_GameObject.h"
-//#include "ListValue.h"
#include "IntValue.h"
#include "SCA_TimeEventManager.h"
#include "SCA_IScene.h"
+/* This little block needed for linking to Blender... */
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
void BL_ConvertProperties(Object* object,KX_GameObject* gameobj,SCA_TimeEventManager* timemgr,SCA_IScene* scene, bool isInActiveLayer)
{
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index 0b395cfd402..99a2ec3ca64 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -28,6 +28,7 @@
* Conversion of Blender data blocks to KX sensor system
*/
+
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -63,6 +64,7 @@ probably misplaced */
#include "KX_NearSensor.h"
#include "KX_RadarSensor.h"
#include "KX_MouseFocusSensor.h"
+#include "KX_ArmatureSensor.h"
#include "SCA_JoystickSensor.h"
#include "KX_NetworkMessageSensor.h"
#include "SCA_ActuatorSensor.h"
@@ -94,7 +96,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
SCA_LogicManager* logicmgr,
KX_Scene* kxscene,
KX_KetsjiEngine* kxengine,
- SCA_IInputDevice* keydev,
int activeLayerBitInfo,
bool isInActiveLayer,
RAS_ICanvas* canvas,
@@ -302,7 +303,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
case SENS_ALWAYS:
{
- SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::ALWAYS_EVENTMGR);
+ SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
if (eventmgr)
{
gamesensor = new SCA_AlwaysSensor(eventmgr, gameobj);
@@ -314,7 +315,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
case SENS_DELAY:
{
// we can reuse the Always event manager for the delay sensor
- SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::ALWAYS_EVENTMGR);
+ SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
if (eventmgr)
{
bDelaySensor* delaysensor = (bDelaySensor*)sens->data;
@@ -444,9 +445,8 @@ void BL_ConvertSensors(struct Object* blenderobject,
blendernearsensor->dist,
blendernearsensor->resetdist,
bFindMaterial,
- nearpropertyname,kxscene,
- physCtrl
- );
+ nearpropertyname,
+ physCtrl);
}
break;
@@ -537,6 +537,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
starty,
keytype,
trackfocus,
+ (bmouse->flag & SENS_MOUSE_FOCUS_PULSE) ? true:false,
kxscene,
kxengine,
gameobj);
@@ -550,7 +551,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
{
bPropertySensor* blenderpropsensor = (bPropertySensor*) sens->data;
SCA_EventManager* eventmgr
- = logicmgr->FindEventManager(SCA_EventManager::PROPERTY_EVENTMGR);
+ = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
if (eventmgr)
{
STR_String propname=blenderpropsensor->name;
@@ -601,6 +602,21 @@ void BL_ConvertSensors(struct Object* blenderobject,
break;
}
+ case SENS_ARMATURE:
+ {
+ bArmatureSensor* blenderarmsensor = (bArmatureSensor*) sens->data;
+ // we will reuse the property event manager, there is nothing special with this sensor
+ SCA_EventManager* eventmgr
+ = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
+ if (eventmgr)
+ {
+ STR_String bonename=blenderarmsensor->posechannel;
+ STR_String constraintname=blenderarmsensor->constraint;
+ gamesensor = new KX_ArmatureSensor(eventmgr,gameobj,bonename,constraintname, blenderarmsensor->type, blenderarmsensor->value);
+ }
+ break;
+ }
+
case SENS_RADAR:
{
@@ -648,8 +664,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
smallmargin,
largemargin,
bFindMaterial,
- radarpropertyname,
- kxscene);
+ radarpropertyname);
}
@@ -660,7 +675,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
bRaySensor* blenderraysensor = (bRaySensor*) sens->data;
//blenderradarsensor->angle;
- SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::RAY_EVENTMGR);
+ SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
if (eventmgr)
{
bool bFindMaterial = (blenderraysensor->mode & SENS_COLLISION_MATERIAL);
@@ -692,7 +707,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
// some files didn't write randomsensor, avoid crash now for NULL ptr's
if (blenderrndsensor)
{
- SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::RANDOM_EVENTMGR);
+ SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::BASIC_EVENTMGR);
if (eventmgr)
{
int randomSeed = blenderrndsensor->seed;
diff --git a/source/gameengine/Converter/KX_ConvertSensors.h b/source/gameengine/Converter/KX_ConvertSensors.h
index 9162a866768..630323f30b4 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.h
+++ b/source/gameengine/Converter/KX_ConvertSensors.h
@@ -34,7 +34,6 @@ void BL_ConvertSensors(struct Object* blenderobject,
class SCA_LogicManager* logicmgr,
class KX_Scene* kxscene,
class KX_KetsjiEngine* kxengine,
- class SCA_IInputDevice* keydev,
int activeLayerBitInfo,
bool isInActiveLayer,
class RAS_ICanvas* canvas,
diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp
index d3a2e1a9ba4..848fcfcdaa0 100644
--- a/source/gameengine/Converter/KX_IpoConvert.cpp
+++ b/source/gameengine/Converter/KX_IpoConvert.cpp
@@ -175,7 +175,7 @@ void BL_ConvertIpos(struct Object* blenderobject,KX_GameObject* gameobj,KX_Blend
KX_ObColorIpoSGController* ipocontr_obcol=NULL;
for(int i=0; i<4; i++) {
- if (interp = adtList->GetScalarInterpolator("color", i)) {
+ if ((interp = adtList->GetScalarInterpolator("color", i))) {
if (!ipocontr_obcol) {
ipocontr_obcol = new KX_ObColorIpoSGController();
gameobj->GetSGNode()->AddSGController(ipocontr_obcol);
diff --git a/source/gameengine/Converter/Makefile b/source/gameengine/Converter/Makefile
index ed95aa968c7..d41cc705087 100644
--- a/source/gameengine/Converter/Makefile
+++ b/source/gameengine/Converter/Makefile
@@ -37,10 +37,10 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include
+CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_BULLET2)/include
+CPPFLAGS += -I$(NAN_AUDASPACE)/include
CPPFLAGS += -I../../blender
# these two needed because of blenkernel
@@ -53,6 +53,7 @@ CPPFLAGS += -I../../blender/blenlib
CPPFLAGS += -I../../blender/blenkernel
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
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index 05ea01c902a..5f6e9df521b 100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
@@ -6,8 +6,7 @@ defs = []
incs = '. #source/kernel/gen_system #intern/string #intern/guardedalloc'
incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer'
-incs += ' #intern/SoundSystem #intern/SoundSystem/include #intern/SoundSystem/openal'
-incs += ' #intern/SoundSystem/dummy #intern/SoundSystem/intern #source/gameengine/Converter'
+incs += ' #intern/audaspace/intern #source/gameengine/Converter'
incs += ' #source/gameengine/BlenderRoutines #source/blender/imbuf'
incs += ' #intern/moto/include #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork'
incs += ' #source/blender/blenlib #source/blender/blenkernel #source/blender'
@@ -20,8 +19,9 @@ incs += ' #source/gameengine/Network/LoopBackNetwork'
incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu'
incs += ' #source/blender/windowmanager'
incs += ' #source/blender/makesrna'
+incs += ' #source/blender/ikplugin'
incs += ' ' + env['BF_PYTHON_INC']
incs += ' ' + env['BF_BULLET_INC']
-env.BlenderLib ( 'bf_converter', sources, Split(incs), defs, libtype=['core','player'], priority=[305,50] )
+env.BlenderLib ( 'bf_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 d90da8b3a92..6779c2ea780 100644
--- a/source/gameengine/Expressions/BoolValue.cpp
+++ b/source/gameengine/Expressions/BoolValue.cpp
@@ -29,7 +29,6 @@
const STR_String CBoolValue::sTrueString = "TRUE";
const STR_String CBoolValue::sFalseString = "FALSE";
-
CBoolValue::CBoolValue()
/*
pre: false
@@ -210,5 +209,5 @@ CValue* CBoolValue::GetReplica()
PyObject* CBoolValue::ConvertValueToPython()
{
- return PyInt_FromLong(m_bool != 0);
+ return PyBool_FromLong(m_bool != 0);
}
diff --git a/source/gameengine/Expressions/BoolValue.h b/source/gameengine/Expressions/BoolValue.h
index 726619e7193..4d0103ec1dd 100644
--- a/source/gameengine/Expressions/BoolValue.h
+++ b/source/gameengine/Expressions/BoolValue.h
@@ -49,6 +49,13 @@ public:
private:
bool m_bool;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CBoolValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _BOOLVALUE_H
diff --git a/source/gameengine/Expressions/CMakeLists.txt b/source/gameengine/Expressions/CMakeLists.txt
index dffd13f64ff..ec3738d1fe8 100644
--- a/source/gameengine/Expressions/CMakeLists.txt
+++ b/source/gameengine/Expressions/CMakeLists.txt
@@ -27,13 +27,14 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/moto/include
- ../../../source/gameengine/SceneGraph
- ../../../source/blender/blenloader
- ${PYTHON_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/guardedalloc
+ ../../../intern/moto/include
+ ../../../source/gameengine/SceneGraph
+ ../../../source/blender/blenloader
+ ${PYTHON_INC}
)
BLENDERLIB(bf_expressions "${SRC}" "${INC}")
diff --git a/source/gameengine/Expressions/ConstExpr.h b/source/gameengine/Expressions/ConstExpr.h
index b117140fe70..f48b8d34355 100644
--- a/source/gameengine/Expressions/ConstExpr.h
+++ b/source/gameengine/Expressions/ConstExpr.h
@@ -41,6 +41,13 @@ public:
private:
CValue* m_value;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CConstExpr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined(AFX_CONSTEXPR_H__061ECFC3_BE87_11D1_A51C_00A02472FC58__INCLUDED_)
diff --git a/source/gameengine/Expressions/EmptyValue.h b/source/gameengine/Expressions/EmptyValue.h
index fb6b4a477a6..01029d1655d 100644
--- a/source/gameengine/Expressions/EmptyValue.h
+++ b/source/gameengine/Expressions/EmptyValue.h
@@ -34,6 +34,13 @@ public:
CValue * Calc(VALUE_OPERATOR op, CValue *val);
CValue * CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
virtual CValue* GetReplica();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CEmptyValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _EMPTYVALUE_H
diff --git a/source/gameengine/Expressions/ErrorValue.h b/source/gameengine/Expressions/ErrorValue.h
index b4b758feea7..2f65850c4f1 100644
--- a/source/gameengine/Expressions/ErrorValue.h
+++ b/source/gameengine/Expressions/ErrorValue.h
@@ -33,6 +33,13 @@ public:
private:
STR_String m_strErrorText;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CErrorValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _ERRORVALUE_H
diff --git a/source/gameengine/Expressions/Expression.h b/source/gameengine/Expressions/Expression.h
index 400a2b7c789..bd346fd0552 100644
--- a/source/gameengine/Expressions/Expression.h
+++ b/source/gameengine/Expressions/Expression.h
@@ -63,6 +63,12 @@ class CBrokenLinkInfo
CExpression* m_pExpr;
bool m_bRestored;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CBrokenLinkInfo"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -126,6 +132,13 @@ public:
protected:
int m_refcount;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CExpression"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _EXPRESSION_H
diff --git a/source/gameengine/Expressions/FloatValue.h b/source/gameengine/Expressions/FloatValue.h
index fb75b7c702b..442f0eb6cf8 100644
--- a/source/gameengine/Expressions/FloatValue.h
+++ b/source/gameengine/Expressions/FloatValue.h
@@ -42,6 +42,12 @@ protected:
float m_float;
STR_String* m_pstrRep;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CFloatValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _FLOATVALUE_H
diff --git a/source/gameengine/Expressions/IdentifierExpr.h b/source/gameengine/Expressions/IdentifierExpr.h
index b307228c8b9..7c14329f755 100644
--- a/source/gameengine/Expressions/IdentifierExpr.h
+++ b/source/gameengine/Expressions/IdentifierExpr.h
@@ -46,6 +46,13 @@ public:
virtual CExpression* CheckLink(std::vector<CBrokenLinkInfo*>& brokenlinks);
virtual void ClearModified();
virtual void BroadcastOperators(VALUE_OPERATOR op);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIdentifierExpr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__IDENTIFIER_EXPR
diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h
index 9ab13dca413..f06718c851f 100644
--- a/source/gameengine/Expressions/IfExpr.h
+++ b/source/gameengine/Expressions/IfExpr.h
@@ -44,6 +44,13 @@ public:
virtual CExpression* CheckLink(std::vector<CBrokenLinkInfo*>& brokenlinks);
virtual void ClearModified();
virtual void BroadcastOperators(VALUE_OPERATOR op);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIfExpr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined(AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_)
diff --git a/source/gameengine/Expressions/InputParser.h b/source/gameengine/Expressions/InputParser.h
index 810bdc244a8..0d7eab27aeb 100644
--- a/source/gameengine/Expressions/InputParser.h
+++ b/source/gameengine/Expressions/InputParser.h
@@ -102,7 +102,13 @@ private:
int Priority(int optor);
CExpression *Ex(int i);
CExpression *Expr();
-
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CParser"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Expressions/IntValue.cpp b/source/gameengine/Expressions/IntValue.cpp
index 227518e9439..b782de4bef6 100644
--- a/source/gameengine/Expressions/IntValue.cpp
+++ b/source/gameengine/Expressions/IntValue.cpp
@@ -330,7 +330,7 @@ void CIntValue::SetValue(CValue* newval)
PyObject* CIntValue::ConvertValueToPython()
{
if((m_int > INT_MIN) && (m_int < INT_MAX))
- return PyInt_FromLong(m_int);
+ return PyLong_FromSsize_t(m_int);
else
return PyLong_FromLongLong(m_int);
}
diff --git a/source/gameengine/Expressions/IntValue.h b/source/gameengine/Expressions/IntValue.h
index 06bf1755749..0513026c4cf 100644
--- a/source/gameengine/Expressions/IntValue.h
+++ b/source/gameengine/Expressions/IntValue.h
@@ -56,6 +56,12 @@ private:
cInt m_int;
STR_String* m_pstrRep;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CIntValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _INTVALUE_H
diff --git a/source/gameengine/Expressions/KX_HashedPtr.h b/source/gameengine/Expressions/KX_HashedPtr.h
index b11efb99d68..0b54436147b 100644
--- a/source/gameengine/Expressions/KX_HashedPtr.h
+++ b/source/gameengine/Expressions/KX_HashedPtr.h
@@ -29,6 +29,10 @@
#ifndef __KX_HASHEDPTR
#define __KX_HASHEDPTR
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
unsigned int KX_Hash(void * inDWord);
class CHashedPtr
@@ -44,6 +48,13 @@ public:
{
return rhs.m_valptr == lhs.m_valptr;
}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CHashedPtr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_HASHEDPTR
diff --git a/source/gameengine/Expressions/KX_Python.h b/source/gameengine/Expressions/KX_Python.h
index 61f7ef05042..f41accec730 100644
--- a/source/gameengine/Expressions/KX_Python.h
+++ b/source/gameengine/Expressions/KX_Python.h
@@ -30,6 +30,17 @@
#define KX_PYTHON_H
//#define USE_DL_EXPORT
+
+/* python redefines, quiet the compiler */
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#endif
+
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+
#include "Python.h"
#define USE_MATHUTILS // Blender 2.5x api will use mathutils, for a while we might want to test without it
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index 59344ddb7b7..002674450d1 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -76,9 +76,9 @@ PyObject* listvalue_mapping_subscript(PyObject* self, PyObject* pyindex)
return NULL;
}
- if (PyString_Check(pyindex))
+ if (PyUnicode_Check(pyindex))
{
- CValue *item = ((CListValue*) list)->FindValue(PyString_AsString(pyindex));
+ CValue *item = ((CListValue*) list)->FindValue(_PyUnicode_AsString(pyindex));
if (item) {
PyObject* pyobj = item->ConvertValueToPython();
if(pyobj)
@@ -87,14 +87,14 @@ PyObject* listvalue_mapping_subscript(PyObject* self, PyObject* pyindex)
return item->GetProxy();
}
}
- else if (PyInt_Check(pyindex))
+ else if (PyLong_Check(pyindex))
{
- int index = PyInt_AsLong(pyindex);
+ int index = PyLong_AsSsize_t(pyindex);
return listvalue_buffer_item(self, index); /* wont add a ref */
}
PyObject *pyindex_str = PyObject_Repr(pyindex); /* new ref */
- PyErr_Format(PyExc_KeyError, "CList[key]: '%s' key not in list", PyString_AsString(pyindex_str));
+ PyErr_Format(PyExc_KeyError, "CList[key]: '%s' key not in list", _PyUnicode_AsString(pyindex_str));
Py_DECREF(pyindex_str);
return NULL;
}
@@ -220,12 +220,12 @@ static int listvalue_buffer_contains(PyObject *self_v, PyObject *value)
return -1;
}
- if (PyString_Check(value)) {
- if (self->FindValue((const char *)PyString_AsString(value))) {
+ if (PyUnicode_Check(value)) {
+ if (self->FindValue((const char *)_PyUnicode_AsString(value))) {
return 1;
}
}
- else if (BGE_PROXY_CHECK_TYPE(value)) { /* not dict like at all but this worked before __contains__ was used */
+ else if (PyObject_TypeCheck(value, &CValue::Type)) { /* not dict like at all but this worked before __contains__ was used */
CValue *item= static_cast<CValue *>(BGE_PROXY_REF(value));
for (int i=0; i < self->GetCount(); i++)
if (self->GetValue(i) == item) // Com
@@ -242,15 +242,10 @@ static PySequenceMethods listvalue_as_sequence = {
listvalue_buffer_concat, /*sq_concat*/
NULL, /*sq_repeat*/
listvalue_buffer_item, /*sq_item*/
-#if (PY_VERSION_HEX >= 0x03000000) // TODO, slicing in py3?
- NULL,
- NULL,
- NULL,
-#else
- listvalue_buffer_slice, /*sq_slice*/
+// TODO, slicing in py3
+ NULL, // listvalue_buffer_slice, /*sq_slice*/
NULL, /*sq_ass_item*/
NULL, /*sq_ass_slice*/
-#endif
(objobjproc)listvalue_buffer_contains, /* sq_contains */
};
@@ -266,13 +261,7 @@ static PyMappingMethods instance_as_mapping = {
PyTypeObject CListValue::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"CListValue", /*tp_name*/
sizeof(PyObjectPlus_Proxy), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -289,25 +278,19 @@ PyTypeObject CListValue::Type = {
0, /*tp_hash*/
0, /*tp_call */
0,
- py_base_getattro,
- py_base_setattro,
+ NULL,
+ NULL,
0,
- Py_TPFLAGS_DEFAULT,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject CListValue::Parents[] = {
- &CListValue::Type,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
-
PyMethodDef CListValue::Methods[] = {
/* List style access */
{"append", (PyCFunction)CListValue::sPyappend,METH_O},
@@ -317,7 +300,6 @@ PyMethodDef CListValue::Methods[] = {
/* Dict style access */
{"get", (PyCFunction)CListValue::sPyget,METH_VARARGS},
- {"has_key", (PyCFunction)CListValue::sPyhas_key,METH_O},
/* Own cvalue funcs */
{"from_id", (PyCFunction)CListValue::sPyfrom_id,METH_O},
@@ -329,21 +311,12 @@ PyAttributeDef CListValue::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* CListValue::py_getattro(PyObject* attr) {
- py_getattro_up(CValue);
-}
-
-PyObject* CListValue::py_getattro_dict() {
- py_getattro_dict_up(CValue);
-}
-
-
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
-CListValue::CListValue(PyTypeObject *T )
-: CPropValue(T)
+CListValue::CListValue()
+: CPropValue()
{
m_bReleaseContents=true;
}
@@ -559,7 +532,7 @@ PyObject* CListValue::Pyindex(PyObject *value)
CValue* elem = GetValue(i);
if (checkobj==elem || CheckEqual(checkobj,elem))
{
- result = PyInt_FromLong(i);
+ result = PyLong_FromSsize_t(i);
break;
}
}
@@ -582,7 +555,7 @@ PyObject* CListValue::Pycount(PyObject* value)
if (checkobj==NULL) { /* in this case just return that there are no items in the list */
PyErr_Clear();
- return PyInt_FromLong(0);
+ return PyLong_FromSsize_t(0);
}
int numelem = GetCount();
@@ -596,7 +569,7 @@ PyObject* CListValue::Pycount(PyObject* value)
}
checkobj->Release();
- return PyInt_FromLong(numfound);
+ return PyLong_FromSsize_t(numfound);
}
/* Matches python dict.get(key, [default]) */
@@ -620,14 +593,6 @@ PyObject* CListValue::Pyget(PyObject *args)
return def;
}
-/* Matches python dict.has_key() */
-PyObject* CListValue::Pyhas_key(PyObject* value)
-{
- if (PyString_Check(value) && FindValue((const char *)PyString_AsString(value)))
- Py_RETURN_TRUE;
-
- Py_RETURN_FALSE;
-}
PyObject* CListValue::Pyfrom_id(PyObject* value)
{
diff --git a/source/gameengine/Expressions/ListValue.h b/source/gameengine/Expressions/ListValue.h
index 68e900e25e0..2dc458e0148 100644
--- a/source/gameengine/Expressions/ListValue.h
+++ b/source/gameengine/Expressions/ListValue.h
@@ -24,7 +24,7 @@ class CListValue : public CPropValue
//PLUGIN_DECLARE_SERIAL (CListValue,CValue)
public:
- CListValue(PyTypeObject *T = &Type);
+ CListValue();
virtual ~CListValue();
void AddConfigurationData(CValue* menuvalue);
@@ -60,8 +60,6 @@ public:
bool CheckEqual(CValue* first,CValue* second);
- virtual PyObject* py_getattro(PyObject* attr);
- virtual PyObject* py_getattro_dict();
virtual PyObject* py_repr(void) {
PyObject *py_proxy= this->GetProxy();
PyObject *py_list= PySequence_List(py_proxy);
@@ -76,7 +74,6 @@ public:
KX_PYMETHOD_O(CListValue,index);
KX_PYMETHOD_O(CListValue,count);
KX_PYMETHOD_VARARGS(CListValue,get);
- KX_PYMETHOD_O(CListValue,has_key);
KX_PYMETHOD_O(CListValue,from_id);
diff --git a/source/gameengine/Expressions/Operator1Expr.h b/source/gameengine/Expressions/Operator1Expr.h
index 4a1deb0eca3..c2bc68076a0 100644
--- a/source/gameengine/Expressions/Operator1Expr.h
+++ b/source/gameengine/Expressions/Operator1Expr.h
@@ -46,6 +46,13 @@ public:
private:
VALUE_OPERATOR m_op;
CExpression * m_lhs;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator1Expr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined(AFX_OPERATOR1EXPR_H__A1653901_BF41_11D1_A51C_00A02472FC58__INCLUDED_)
diff --git a/source/gameengine/Expressions/Operator2Expr.h b/source/gameengine/Expressions/Operator2Expr.h
index 4064890bbae..bb26b7c03be 100644
--- a/source/gameengine/Expressions/Operator2Expr.h
+++ b/source/gameengine/Expressions/Operator2Expr.h
@@ -52,7 +52,13 @@ protected:
private:
VALUE_OPERATOR m_op;
-
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:COperator2Expr"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _OPERATOR2EXPR_H
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp
index 2d4cc612aef..7adbf5ac651 100644
--- a/source/gameengine/Expressions/PyObjectPlus.cpp
+++ b/source/gameengine/Expressions/PyObjectPlus.cpp
@@ -51,19 +51,14 @@
#include "PyObjectPlus.h"
#include "STR_String.h"
#include "MT_Vector3.h"
+#include "MEM_guardedalloc.h"
/*------------------------------
* PyObjectPlus Type -- Every class, even the abstract one should have a Type
------------------------------*/
PyTypeObject PyObjectPlus::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"PyObjectPlus", /*tp_name*/
sizeof(PyObjectPlus_Proxy), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -74,168 +69,177 @@ PyTypeObject PyObjectPlus::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ NULL // no subtype
};
PyObjectPlus::~PyObjectPlus()
{
if(m_proxy) {
- Py_DECREF(m_proxy); /* Remove own reference, python may still have 1 */
BGE_PROXY_REF(m_proxy)= NULL;
+ Py_DECREF(m_proxy); /* Remove own reference, python may still have 1 */
}
// assert(ob_refcnt==0);
}
-void PyObjectPlus::py_base_dealloc(PyObject *self) // python wrapper
+
+PyObject *PyObjectPlus::py_base_repr(PyObject *self) // This should be the entry in Type.
{
PyObjectPlus *self_plus= BGE_PROXY_REF(self);
- if(self_plus) {
- if(BGE_PROXY_PYOWNS(self)) { /* Does python own this?, then delete it */
- self_plus->m_proxy = NULL; /* Need this to stop ~PyObjectPlus from decrefing m_proxy otherwise its decref'd twice and py-debug crashes */
- delete self_plus;
+ if(self_plus==NULL) {
+ PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+ return NULL;
+ }
+ return self_plus->py_repr();
+}
+
+
+PyObject * PyObjectPlus::py_base_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyTypeObject *base_type;
+ PyObjectPlus_Proxy *base = NULL;
+
+ if (!PyArg_ParseTuple(args, "O:Base PyObjectPlus", &base))
+ return NULL;
+
+ /* the 'base' PyObject may be subclassed (multiple times even)
+ * we need to find the first C++ defined class to check 'type'
+ * is a subclass of the base arguments type.
+ *
+ * This way we can share one tp_new function for every PyObjectPlus
+ *
+ * eg.
+ *
+ * # CustomOb is called 'type' in this C code
+ * class CustomOb(GameTypes.KX_GameObject):
+ * pass
+ *
+ * # this calls py_base_new(...), the type of 'CustomOb' is checked to be a subclass of the 'cont.owner' type
+ * ob = CustomOb(cont.owner)
+ *
+ * */
+ base_type= Py_TYPE(base);
+ while(base_type && !BGE_PROXY_CHECK_TYPE(base_type))
+ base_type= base_type->tp_base;
+
+ if(base_type==NULL || !BGE_PROXY_CHECK_TYPE(base_type)) {
+ PyErr_SetString(PyExc_TypeError, "can't subclass from a blender game type because the argument given is not a game class or subclass");
+ return NULL;
+ }
+
+ /* use base_type rather then Py_TYPE(base) because we could alredy be subtyped */
+ if(!PyType_IsSubtype(type, base_type)) {
+ PyErr_Format(PyExc_TypeError, "can't subclass blender game type <%s> from <%s> because it is not a subclass", base_type->tp_name, type->tp_name);
+ return NULL;
+ }
+
+ /* invalidate the existing base and return a new subclassed one,
+ * this is a bit dodgy in that it also attaches its self to the existing object
+ * which is not really 'correct' python OO but for our use its OK. */
+
+ PyObjectPlus_Proxy *ret = (PyObjectPlus_Proxy *) type->tp_alloc(type, 0); /* starts with 1 ref, used for the return ref' */
+ ret->ref= base->ref;
+ ret->ptr= base->ptr;
+ ret->py_owns= base->py_owns;
+ ret->py_ref = base->py_ref;
+
+ if (ret->py_ref) {
+ base->ref= NULL; /* invalidate! disallow further access */
+ base->ptr = NULL;
+ if (ret->ref)
+ ret->ref->m_proxy= NULL;
+ /* 'base' may be free'd after this func finished but not necessarily
+ * there is no reference to the BGE data now so it will throw an error on access */
+ Py_DECREF(base);
+ if (ret->ref) {
+ ret->ref->m_proxy= (PyObject *)ret; /* no need to add a ref because one is added when creating. */
+ Py_INCREF(ret); /* we return a new ref but m_proxy holds a ref so we need to add one */
}
-
- BGE_PROXY_REF(self)= NULL; // not really needed
+ } else {
+ // generic structures don't hold a reference to this proxy, so don't increment ref count
+ if (ret->py_owns)
+ // but if the proxy owns the structure, there can be only one owner
+ base->ptr= NULL;
}
+
+ return (PyObject *)ret;
+}
+
+void PyObjectPlus::py_base_dealloc(PyObject *self) // python wrapper
+{
+ if (BGE_PROXY_PYREF(self)) {
+ PyObjectPlus *self_plus= BGE_PROXY_REF(self);
+ if(self_plus) {
+ if(BGE_PROXY_PYOWNS(self)) { /* Does python own this?, then delete it */
+ self_plus->m_proxy = NULL; /* Need this to stop ~PyObjectPlus from decrefing m_proxy otherwise its decref'd twice and py-debug crashes */
+ delete self_plus;
+ }
+ BGE_PROXY_REF(self)= NULL; // not really needed
+ }
+ // the generic pointer is not deleted directly, only through self_plus
+ BGE_PROXY_PTR(self)= NULL; // not really needed
+ } else {
+ void *ptr= BGE_PROXY_PTR(self);
+ if(ptr) {
+ if(BGE_PROXY_PYOWNS(self)) { /* Does python own this?, then delete it */
+ // generic structure owned by python MUST be created though MEM_alloc
+ MEM_freeN(ptr);
+ }
+ BGE_PROXY_PTR(self)= NULL; // not really needed
+ }
+ }
+#if 0
+ /* is ok normally but not for subtyping, use tp_free instead. */
PyObject_DEL( self );
+#else
+ Py_TYPE(self)->tp_free(self);
+#endif
};
-PyObjectPlus::PyObjectPlus(PyTypeObject *T) : SG_QList() // constructor
+PyObjectPlus::PyObjectPlus() : SG_QList() // constructor
{
- MT_assert(T != NULL);
m_proxy= NULL;
};
-
+
/*------------------------------
* PyObjectPlus Methods -- Every class, even the abstract one should have a Methods
------------------------------*/
PyMethodDef PyObjectPlus::Methods[] = {
- {"isA", (PyCFunction) sPyisA, METH_O},
{NULL, NULL} /* Sentinel */
};
+#define attr_invalid (&(PyObjectPlus::Attributes[0]))
PyAttributeDef PyObjectPlus::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("invalid", PyObjectPlus, pyattr_get_invalid),
{NULL} //Sentinel
};
-PyObject* PyObjectPlus::pyattr_get_invalid(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- Py_RETURN_FALSE;
-}
-
-/*------------------------------
- * PyObjectPlus Parents -- Every class, even the abstract one should have parents
-------------------------------*/
-PyParentObject PyObjectPlus::Parents[] = {&PyObjectPlus::Type, NULL};
-
-/*------------------------------
- * PyObjectPlus attributes -- attributes
-------------------------------*/
-/* This should be the entry in Type since it takes the C++ class from PyObjectPlus_Proxy */
-PyObject *PyObjectPlus::py_base_getattro(PyObject * self, PyObject *attr)
+PyObject* PyObjectPlus::pyattr_get_invalid(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- PyObjectPlus *self_plus= BGE_PROXY_REF(self);
- if(self_plus==NULL) {
- if(!strcmp("invalid", PyString_AsString(attr))) {
- Py_RETURN_TRUE;
- }
- PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
- return NULL;
- }
-
- PyObject *ret= self_plus->py_getattro(attr);
-
- /* Attribute not found, was this a __dict__ lookup?, otherwise set an error if none is set */
- if(ret==NULL) {
- char *attr_str= PyString_AsString(attr);
-
- if (strcmp(attr_str, "__dict__")==0)
- {
- /* the error string will probably not
- * be set but just incase clear it */
- PyErr_Clear();
- ret= self_plus->py_getattro_dict();
- }
- else if (!PyErr_Occurred()) {
- /* We looked for an attribute but it wasnt found
- * since py_getattro didnt set the error, set it here */
- PyErr_Format(PyExc_AttributeError, "'%s' object has no attribute '%s'", self->ob_type->tp_name, attr_str);
- }
- }
- return ret;
+ return PyBool_FromLong(self_v ? 1:0);
}
-/* This should be the entry in Type since it takes the C++ class from PyObjectPlus_Proxy */
-int PyObjectPlus::py_base_setattro(PyObject *self, PyObject *attr, PyObject *value)
+/* note, this is called as a python 'getset, where the PyAttributeDef is the closure */
+PyObject *PyObjectPlus::py_get_attrdef(PyObject *self_py, const PyAttributeDef *attrdef)
{
- PyObjectPlus *self_plus= BGE_PROXY_REF(self);
- if(self_plus==NULL) {
- PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
- return -1;
- }
-
- if (value==NULL)
- return self_plus->py_delattro(attr);
-
- return self_plus->py_setattro(attr, value);
-}
+ PyObjectPlus *ref= (BGE_PROXY_REF(self_py));
+ char* ptr = (attrdef->m_usePtr) ? (char*)BGE_PROXY_PTR(self_py) : (char*)ref;
+ if(ptr == NULL || (BGE_PROXY_PYREF(self_py) && (ref==NULL || !ref->py_is_valid()))) {
+ if(attrdef == attr_invalid)
+ Py_RETURN_TRUE; // dont bother running the function
-PyObject *PyObjectPlus::py_base_repr(PyObject *self) // This should be the entry in Type.
-{
-
- PyObjectPlus *self_plus= BGE_PROXY_REF(self);
- if(self_plus==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
return NULL;
}
-
- return self_plus->py_repr();
-}
-
-PyObject *PyObjectPlus::py_getattro(PyObject* attr)
-{
- PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
- if (descr == NULL) {
- return NULL; /* py_base_getattro sets the error, this way we can avoid setting the error at many levels */
- } else {
- /* Copied from py_getattro_up */
- if (PyCObject_Check(descr)) {
- return py_get_attrdef((void *)this, (const PyAttributeDef*)PyCObject_AsVoidPtr(descr));
- } else if (descr->ob_type->tp_descr_get) {
- return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, this->m_proxy);
- } else {
- return NULL;
- }
- /* end py_getattro_up copy */
- }
-}
-
-PyObject* PyObjectPlus::py_getattro_dict() {
- return py_getattr_dict(NULL, Type.tp_dict);
-}
-
-int PyObjectPlus::py_delattro(PyObject* attr)
-{
- PyErr_SetString(PyExc_AttributeError, "attribute cant be deleted");
- return 1;
-}
-int PyObjectPlus::py_setattro(PyObject *attr, PyObject* value)
-{
- PyErr_SetString(PyExc_AttributeError, "attribute cant be set");
- return PY_SET_ATTR_MISSING;
-}
-
-PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef)
-{
if (attrdef->m_type == KX_PYATTRIBUTE_TYPE_DUMMY)
{
// fake attribute, ignore
@@ -246,9 +250,9 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
// the attribute has no field correspondance, handover processing to function.
if (attrdef->m_getFunction == NULL)
return NULL;
- return (*attrdef->m_getFunction)(self, attrdef);
+ return (*attrdef->m_getFunction)(ref, attrdef);
}
- char *ptr = reinterpret_cast<char*>(self)+attrdef->m_offset;
+ ptr += attrdef->m_offset;
if (attrdef->m_length > 1)
{
PyObject* resultlist = PyList_New(attrdef->m_length);
@@ -259,14 +263,14 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
{
bool *val = reinterpret_cast<bool*>(ptr);
ptr += sizeof(bool);
- PyList_SET_ITEM(resultlist,i,PyInt_FromLong(*val));
+ PyList_SET_ITEM(resultlist,i,PyLong_FromSsize_t(*val));
break;
}
case KX_PYATTRIBUTE_TYPE_SHORT:
{
short int *val = reinterpret_cast<short int*>(ptr);
ptr += sizeof(short int);
- PyList_SET_ITEM(resultlist,i,PyInt_FromLong(*val));
+ PyList_SET_ITEM(resultlist,i,PyLong_FromSsize_t(*val));
break;
}
case KX_PYATTRIBUTE_TYPE_ENUM:
@@ -281,7 +285,7 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
{
int *val = reinterpret_cast<int*>(ptr);
ptr += sizeof(int);
- PyList_SET_ITEM(resultlist,i,PyInt_FromLong(*val));
+ PyList_SET_ITEM(resultlist,i,PyLong_FromSsize_t(*val));
break;
}
case KX_PYATTRIBUTE_TYPE_FLOAT:
@@ -302,15 +306,44 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
else
{
switch (attrdef->m_type) {
+ case KX_PYATTRIBUTE_TYPE_FLAG:
+ {
+ bool bval;
+ switch (attrdef->m_size) {
+ case 1:
+ {
+ unsigned char *val = reinterpret_cast<unsigned char*>(ptr);
+ bval = (*val & attrdef->m_imin);
+ break;
+ }
+ case 2:
+ {
+ unsigned short *val = reinterpret_cast<unsigned short*>(ptr);
+ bval = (*val & attrdef->m_imin);
+ break;
+ }
+ case 4:
+ {
+ unsigned int *val = reinterpret_cast<unsigned int*>(ptr);
+ bval = (*val & attrdef->m_imin);
+ break;
+ }
+ default:
+ return NULL;
+ }
+ if (attrdef->m_imax)
+ bval = !bval;
+ return PyLong_FromSsize_t(bval);
+ }
case KX_PYATTRIBUTE_TYPE_BOOL:
{
bool *val = reinterpret_cast<bool*>(ptr);
- return PyInt_FromLong(*val);
+ return PyLong_FromSsize_t(*val);
}
case KX_PYATTRIBUTE_TYPE_SHORT:
{
short int *val = reinterpret_cast<short int*>(ptr);
- return PyInt_FromLong(*val);
+ return PyLong_FromSsize_t(*val);
}
case KX_PYATTRIBUTE_TYPE_ENUM:
// enum are like int, just make sure the field size is the same
@@ -322,19 +355,61 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
case KX_PYATTRIBUTE_TYPE_INT:
{
int *val = reinterpret_cast<int*>(ptr);
- return PyInt_FromLong(*val);
+ return PyLong_FromSsize_t(*val);
}
case KX_PYATTRIBUTE_TYPE_FLOAT:
{
float *val = reinterpret_cast<float*>(ptr);
- return PyFloat_FromDouble(*val);
+ if (attrdef->m_imin == 0) {
+ if (attrdef->m_imax == 0) {
+ return PyFloat_FromDouble(*val);
+ } else {
+ // vector, verify size
+ if (attrdef->m_size != attrdef->m_imax*sizeof(float))
+ {
+ return NULL;
+ }
+#ifdef USE_MATHUTILS
+ return newVectorObject(val, attrdef->m_imax, Py_NEW, NULL);
+#else
+ PyObject* resultlist = PyList_New(attrdef->m_imax);
+ for (unsigned int i=0; i<attrdef->m_imax; i++)
+ {
+ PyList_SET_ITEM(resultlist,i,PyFloat_FromDouble(val[i]));
+ }
+ return resultlist;
+#endif
+ }
+ } else {
+ // matrix case
+ if (attrdef->m_size != attrdef->m_imax*attrdef->m_imin*sizeof(float))
+ {
+ return NULL;
+ }
+#ifdef USE_MATHUTILS
+ return newMatrixObject(val, attrdef->m_imin, attrdef->m_imax, Py_WRAP, NULL);
+#else
+ PyObject* rowlist = PyList_New(attrdef->m_imin);
+ for (unsigned int i=0; i<attrdef->m_imin; i++)
+ {
+ PyObject* collist = PyList_New(attrdef->m_imax);
+ for (unsigned int j=0; j<attrdef->m_imax; j++)
+ {
+ PyList_SET_ITEM(collist,j,PyFloat_FromDouble(val[j]));
+ }
+ PyList_SET_ITEM(rowlist,i,collist);
+ val += attrdef->m_imax;
+ }
+ return rowlist;
+#endif
+ }
}
case KX_PYATTRIBUTE_TYPE_VECTOR:
{
MT_Vector3 *val = reinterpret_cast<MT_Vector3*>(ptr);
#ifdef USE_MATHUTILS
float fval[3]= {(*val)[0], (*val)[1], (*val)[2]};
- return newVectorObject(fval, 3, Py_NEW);
+ return newVectorObject(fval, 3, Py_NEW, NULL);
#else
PyObject* resultlist = PyList_New(3);
for (unsigned int i=0; i<3; i++)
@@ -347,7 +422,11 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
case KX_PYATTRIBUTE_TYPE_STRING:
{
STR_String *val = reinterpret_cast<STR_String*>(ptr);
- return PyString_FromString(*val);
+ return PyUnicode_FromString(*val);
+ }
+ case KX_PYATTRIBUTE_TYPE_CHAR:
+ {
+ return PyUnicode_FromString(ptr);
}
default:
return NULL;
@@ -355,13 +434,48 @@ PyObject *PyObjectPlus::py_get_attrdef(void *self, const PyAttributeDef *attrdef
}
}
-int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyObject *value)
+
+static bool py_check_attr_float(float *var, PyObject *value, const PyAttributeDef *attrdef)
+{
+ double val = PyFloat_AsDouble(value);
+ if (val == -1.0 && PyErr_Occurred())
+ {
+ PyErr_Format(PyExc_TypeError, "expected float value for attribute \"%s\"", attrdef->m_name);
+ return false;
+ }
+ if (attrdef->m_clamp)
+ {
+ if (val < attrdef->m_fmin)
+ val = attrdef->m_fmin;
+ else if (val > attrdef->m_fmax)
+ val = attrdef->m_fmax;
+ }
+ else if (val < attrdef->m_fmin || val > attrdef->m_fmax)
+ {
+ PyErr_Format(PyExc_ValueError, "value out of range for attribute \"%s\"", attrdef->m_name);
+ return false;
+ }
+ *var = (float)val;
+ return true;
+}
+
+/* note, this is called as a python getset */
+int PyObjectPlus::py_set_attrdef(PyObject *self_py, PyObject *value, const PyAttributeDef *attrdef)
{
+ PyObjectPlus *ref= (BGE_PROXY_REF(self_py));
+ char* ptr = (attrdef->m_usePtr) ? (char*)BGE_PROXY_PTR(self_py) : (char*)ref;
+ if(ref==NULL || !ref->py_is_valid() || ptr==NULL) {
+ PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
+ return PY_SET_ATTR_FAIL;
+ }
+
void *undoBuffer = NULL;
void *sourceBuffer = NULL;
size_t bufferSize = 0;
+ PyObject *item = NULL; // to store object that must be dereferenced in case of error
+ PyObject *list = NULL; // to store object that must be dereferenced in case of error
- char *ptr = reinterpret_cast<char*>(self)+attrdef->m_offset;
+ ptr += attrdef->m_offset;
if (attrdef->m_length > 1)
{
if (!PySequence_Check(value))
@@ -382,7 +496,7 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
PyErr_Format(PyExc_AttributeError, "function attribute without function for attribute \"%s\", report to blender.org", attrdef->m_name);
return PY_SET_ATTR_FAIL;
}
- return (*attrdef->m_setFunction)(self, attrdef, value);
+ return (*attrdef->m_setFunction)(ref, attrdef, value);
case KX_PYATTRIBUTE_TYPE_BOOL:
bufferSize = sizeof(bool);
break;
@@ -411,19 +525,16 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
}
for (int i=0; i<attrdef->m_length; i++)
{
- PyObject *item = PySequence_GetItem(value, i); /* new ref */
- // we can decrement the reference immediately, the reference count
- // is at least 1 because the item is part of an array
- Py_DECREF(item);
+ item = PySequence_GetItem(value, i); /* new ref */
switch (attrdef->m_type)
{
case KX_PYATTRIBUTE_TYPE_BOOL:
{
bool *var = reinterpret_cast<bool*>(ptr);
ptr += sizeof(bool);
- if (PyInt_Check(item))
+ if (PyLong_Check(item))
{
- *var = (PyInt_AsLong(item) != 0);
+ *var = (PyLong_AsSsize_t(item) != 0);
}
else if (PyBool_Check(item))
{
@@ -440,9 +551,9 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
{
short int *var = reinterpret_cast<short int*>(ptr);
ptr += sizeof(short int);
- if (PyInt_Check(item))
+ if (PyLong_Check(item))
{
- long val = PyInt_AsLong(item);
+ long val = PyLong_AsSsize_t(item);
if (attrdef->m_clamp)
{
if (val < attrdef->m_imin)
@@ -476,9 +587,9 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
{
int *var = reinterpret_cast<int*>(ptr);
ptr += sizeof(int);
- if (PyInt_Check(item))
+ if (PyLong_Check(item))
{
- long val = PyInt_AsLong(item);
+ long val = PyLong_AsSsize_t(item);
if (attrdef->m_clamp)
{
if (val < attrdef->m_imin)
@@ -530,11 +641,14 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
PyErr_Format(PyExc_AttributeError, "type check error for attribute \"%s\", report to blender.org", attrdef->m_name);
goto UNDO_AND_ERROR;
}
+ // finished using item, release
+ Py_DECREF(item);
+ item = NULL;
}
// no error, call check function if any
if (attrdef->m_checkFunction != NULL)
{
- if ((*attrdef->m_checkFunction)(self, attrdef) != 0)
+ if ((*attrdef->m_checkFunction)(ref, attrdef) != 0)
{
// if the checing function didnt set an error then set a generic one here so we dont set an error with no exception
if (PyErr_Occurred()==0)
@@ -547,6 +661,8 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
memcpy(sourceBuffer, undoBuffer, bufferSize);
free(undoBuffer);
}
+ if (item)
+ Py_DECREF(item);
return PY_SET_ATTR_FAIL;
}
}
@@ -563,7 +679,7 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
PyErr_Format(PyExc_AttributeError, "function attribute without function \"%s\", report to blender.org", attrdef->m_name);
return PY_SET_ATTR_FAIL;
}
- return (*attrdef->m_setFunction)(self, attrdef, value);
+ return (*attrdef->m_setFunction)(ref, attrdef, value);
}
if (attrdef->m_checkFunction != NULL || attrdef->m_type == KX_PYATTRIBUTE_TYPE_VECTOR)
{
@@ -578,11 +694,19 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
bufferSize = sizeof(short);
break;
case KX_PYATTRIBUTE_TYPE_ENUM:
+ case KX_PYATTRIBUTE_TYPE_FLAG:
+ case KX_PYATTRIBUTE_TYPE_CHAR:
+ bufferSize = attrdef->m_size;
+ break;
case KX_PYATTRIBUTE_TYPE_INT:
bufferSize = sizeof(int);
break;
case KX_PYATTRIBUTE_TYPE_FLOAT:
bufferSize = sizeof(float);
+ if (attrdef->m_imax)
+ bufferSize *= attrdef->m_imax;
+ if (attrdef->m_imin)
+ bufferSize *= attrdef->m_imin;
break;
case KX_PYATTRIBUTE_TYPE_STRING:
sourceBuffer = reinterpret_cast<STR_String*>(ptr)->Ptr();
@@ -611,9 +735,9 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
case KX_PYATTRIBUTE_TYPE_BOOL:
{
bool *var = reinterpret_cast<bool*>(ptr);
- if (PyInt_Check(value))
+ if (PyLong_Check(value))
{
- *var = (PyInt_AsLong(value) != 0);
+ *var = (PyLong_AsSsize_t(value) != 0);
}
else if (PyBool_Check(value))
{
@@ -626,12 +750,55 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
}
break;
}
+ case KX_PYATTRIBUTE_TYPE_FLAG:
+ {
+ bool bval;
+ if (PyLong_Check(value))
+ {
+ bval = (PyLong_AsSsize_t(value) != 0);
+ }
+ else if (PyBool_Check(value))
+ {
+ bval = (value == Py_True);
+ }
+ else
+ {
+ PyErr_Format(PyExc_TypeError, "expected an integer or a bool for attribute \"%s\"", attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ if (attrdef->m_imax)
+ bval = !bval;
+ switch (attrdef->m_size) {
+ case 1:
+ {
+ unsigned char *val = reinterpret_cast<unsigned char*>(ptr);
+ *val = (*val & ~attrdef->m_imin) | ((bval)?attrdef->m_imin:0);
+ break;
+ }
+ case 2:
+ {
+ unsigned short *val = reinterpret_cast<unsigned short*>(ptr);
+ *val = (*val & ~attrdef->m_imin) | ((bval)?attrdef->m_imin:0);
+ break;
+ }
+ case 4:
+ {
+ unsigned int *val = reinterpret_cast<unsigned int*>(ptr);
+ *val = (*val & ~attrdef->m_imin) | ((bval)?attrdef->m_imin:0);
+ break;
+ }
+ default:
+ PyErr_Format(PyExc_TypeError, "internal error: unsupported flag field \"%s\"", attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ break;
+ }
case KX_PYATTRIBUTE_TYPE_SHORT:
{
short int *var = reinterpret_cast<short int*>(ptr);
- if (PyInt_Check(value))
+ if (PyLong_Check(value))
{
- long val = PyInt_AsLong(value);
+ long val = PyLong_AsSsize_t(value);
if (attrdef->m_clamp)
{
if (val < attrdef->m_imin)
@@ -664,9 +831,9 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
case KX_PYATTRIBUTE_TYPE_INT:
{
int *var = reinterpret_cast<int*>(ptr);
- if (PyInt_Check(value))
+ if (PyLong_Check(value))
{
- long val = PyInt_AsLong(value);
+ long val = PyLong_AsSsize_t(value);
if (attrdef->m_clamp)
{
if (val < attrdef->m_imin)
@@ -691,25 +858,71 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
case KX_PYATTRIBUTE_TYPE_FLOAT:
{
float *var = reinterpret_cast<float*>(ptr);
- double val = PyFloat_AsDouble(value);
- if (val == -1.0 && PyErr_Occurred())
+ if (attrdef->m_imin != 0)
{
- PyErr_Format(PyExc_TypeError, "expected a float for attribute \"%s\"", attrdef->m_name);
- goto FREE_AND_ERROR;
- }
- else if (attrdef->m_clamp)
+ if (attrdef->m_size != attrdef->m_imin*attrdef->m_imax*sizeof(float))
+ {
+ PyErr_Format(PyExc_TypeError, "internal error: incorrect field size for attribute \"%s\"", attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ if (!PySequence_Check(value) || PySequence_Size(value) != attrdef->m_imin)
+ {
+ PyErr_Format(PyExc_TypeError, "expected a sequence of [%d][%d] floats for attribute \"%s\"", attrdef->m_imin, attrdef->m_imax, attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ for (int i=0; i<attrdef->m_imin; i++)
+ {
+ PyObject *list = PySequence_GetItem(value, i); /* new ref */
+ if (!PySequence_Check(list) || PySequence_Size(list) != attrdef->m_imax)
+ {
+ PyErr_Format(PyExc_TypeError, "expected a sequence of [%d][%d] floats for attribute \"%s\"", attrdef->m_imin, attrdef->m_imax, attrdef->m_name);
+ goto RESTORE_AND_ERROR;
+ }
+ for (int j=0; j<attrdef->m_imax; j++)
+ {
+ item = PySequence_GetItem(list, j); /* new ref */
+ if (!py_check_attr_float(var, item, attrdef))
+ {
+ PyErr_Format(PyExc_TypeError, "expected a sequence of [%d][%d] floats for attribute \"%s\"", attrdef->m_imin, attrdef->m_imax, attrdef->m_name);
+ goto RESTORE_AND_ERROR;
+ }
+ Py_DECREF(item);
+ item = NULL;
+ ++var;
+ }
+ Py_DECREF(list);
+ list = NULL;
+ }
+ }
+ else if (attrdef->m_imax != 0)
{
- if (val < attrdef->m_fmin)
- val = attrdef->m_fmin;
- else if (val > attrdef->m_fmax)
- val = attrdef->m_fmax;
- }
- else if (val < attrdef->m_fmin || val > attrdef->m_fmax)
+ if (attrdef->m_size != attrdef->m_imax*sizeof(float))
+ {
+ PyErr_Format(PyExc_TypeError, "internal error: incorrect field size for attribute \"%s\"", attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ if (!PySequence_Check(value) || PySequence_Size(value) != attrdef->m_imax)
+ {
+ PyErr_Format(PyExc_TypeError, "expected a sequence of [%d] floats for attribute \"%s\"", attrdef->m_imax, attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ for (int i=0; i<attrdef->m_imax; i++)
+ {
+ item = PySequence_GetItem(value, i); /* new ref */
+ if (!py_check_attr_float(var, item, attrdef))
+ {
+ goto RESTORE_AND_ERROR;
+ }
+ Py_DECREF(item);
+ item = NULL;
+ ++var;
+ }
+ }
+ else
{
- PyErr_Format(PyExc_ValueError, "value out of range for attribute \"%s\"", attrdef->m_name);
- goto FREE_AND_ERROR;
+ if (!py_check_attr_float(var, value, attrdef))
+ goto FREE_AND_ERROR;
}
- *var = (float)val;
break;
}
case KX_PYATTRIBUTE_TYPE_VECTOR:
@@ -717,16 +930,15 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
if (!PySequence_Check(value) || PySequence_Size(value) != 3)
{
PyErr_Format(PyExc_TypeError, "expected a sequence of 3 floats for attribute \"%s\"", attrdef->m_name);
- return PY_SET_ATTR_FAIL;
+ goto FREE_AND_ERROR;
}
MT_Vector3 *var = reinterpret_cast<MT_Vector3*>(ptr);
for (int i=0; i<3; i++)
{
- PyObject *item = PySequence_GetItem(value, i); /* new ref */
- // we can decrement the reference immediately, the reference count
- // is at least 1 because the item is part of an array
- Py_DECREF(item);
+ item = PySequence_GetItem(value, i); /* new ref */
double val = PyFloat_AsDouble(item);
+ Py_DECREF(item);
+ item = NULL;
if (val == -1.0 && PyErr_Occurred())
{
PyErr_Format(PyExc_TypeError, "expected a sequence of 3 floats for attribute \"%s\"", attrdef->m_name);
@@ -748,21 +960,38 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
}
break;
}
+ case KX_PYATTRIBUTE_TYPE_CHAR:
+ {
+ if (PyUnicode_Check(value))
+ {
+ Py_ssize_t val_len;
+ char *val = _PyUnicode_AsStringAndSize(value, &val_len);
+ strncpy(ptr, val, attrdef->m_size);
+ ptr[attrdef->m_size-1] = 0;
+ }
+ else
+ {
+ PyErr_Format(PyExc_TypeError, "expected a string for attribute \"%s\"", attrdef->m_name);
+ goto FREE_AND_ERROR;
+ }
+ break;
+ }
case KX_PYATTRIBUTE_TYPE_STRING:
{
STR_String *var = reinterpret_cast<STR_String*>(ptr);
- if (PyString_Check(value))
+ if (PyUnicode_Check(value))
{
- char *val = PyString_AsString(value);
+ Py_ssize_t val_len;
+ char *val = _PyUnicode_AsStringAndSize(value, &val_len);
if (attrdef->m_clamp)
{
- if (strlen(val) < attrdef->m_imin)
+ if (val_len < attrdef->m_imin)
{
// can't increase the length of the string
PyErr_Format(PyExc_ValueError, "string length too short for attribute \"%s\"", attrdef->m_name);
goto FREE_AND_ERROR;
}
- else if (strlen(val) > attrdef->m_imax)
+ else if (val_len > attrdef->m_imax)
{
// trim the string
char c = val[attrdef->m_imax];
@@ -771,7 +1000,7 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
val[attrdef->m_imax] = c;
break;
}
- } else if (strlen(val) < attrdef->m_imin || strlen(val) > attrdef->m_imax)
+ } else if (val_len < attrdef->m_imin || val_len > attrdef->m_imax)
{
PyErr_Format(PyExc_ValueError, "string length out of range for attribute \"%s\"", attrdef->m_name);
goto FREE_AND_ERROR;
@@ -794,7 +1023,7 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
// check if post processing is needed
if (attrdef->m_checkFunction != NULL)
{
- if ((*attrdef->m_checkFunction)(self, attrdef) != 0)
+ if ((*attrdef->m_checkFunction)(ref, attrdef) != 0)
{
// restore value
RESTORE_AND_ERROR:
@@ -815,6 +1044,10 @@ int PyObjectPlus::py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyOb
FREE_AND_ERROR:
if (undoBuffer)
free(undoBuffer);
+ if (list)
+ Py_DECREF(list);
+ if (item)
+ Py_DECREF(item);
return 1;
}
}
@@ -834,48 +1067,6 @@ PyObject *PyObjectPlus::py_repr(void)
return NULL;
}
-/*------------------------------
- * PyObjectPlus isA -- the isA functions
-------------------------------*/
-bool PyObjectPlus::isA(PyTypeObject *T) // if called with a Type, use "typename"
-{
- int i;
- PyParentObject P;
- PyParentObject *Ps = GetParents();
-
- for (P = Ps[i=0]; P != NULL; P = Ps[i++])
- if (P==T)
- return true;
-
- return false;
-}
-
-
-bool PyObjectPlus::isA(const char *mytypename) // check typename of each parent
-{
- int i;
- PyParentObject P;
- PyParentObject *Ps = GetParents();
-
- for (P = Ps[i=0]; P != NULL; P = Ps[i++])
- if (strcmp(P->tp_name, mytypename)==0)
- return true;
-
- return false;
-}
-
-PyObject *PyObjectPlus::PyisA(PyObject *value) // Python wrapper for isA
-{
- if (PyType_Check(value)) {
- return PyBool_FromLong(isA((PyTypeObject *)value));
- } else if (PyString_Check(value)) {
- return PyBool_FromLong(isA(PyString_AsString(value)));
- }
- PyErr_SetString(PyExc_TypeError, "object.isA(value): expected a type or a string");
- return NULL;
-}
-
-
void PyObjectPlus::ProcessReplica()
{
/* Clear the proxy, will be created again if needed with GetProxy()
@@ -900,44 +1091,35 @@ void PyObjectPlus::InvalidateProxy() // check typename of each parent
}
}
-/* Utility function called by the macro py_getattro_up()
- * for getting ob.__dict__() values from our PyObject
- * this is used by python for doing dir() on an object, so its good
- * if we return a list of attributes and methods.
- *
- * Other then making dir() useful the value returned from __dict__() is not useful
- * since every value is a Py_None
- * */
-PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict)
-{
- if(pydict==NULL) { /* incase calling __dict__ on the parent of this object raised an error */
- PyErr_Clear();
- pydict = PyDict_New();
- }
-
- PyDict_Update(pydict, tp_dict);
- return pydict;
-}
-
-
-
-PyObject *PyObjectPlus::GetProxy_Ext(PyObjectPlus *self, PyTypeObject *tp)
+PyObject *PyObjectPlus::GetProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, void *ptr)
{
if (self->m_proxy==NULL)
{
self->m_proxy = reinterpret_cast<PyObject *>PyObject_NEW( PyObjectPlus_Proxy, tp);
BGE_PROXY_PYOWNS(self->m_proxy) = false;
+ BGE_PROXY_PYREF(self->m_proxy) = true;
}
//PyObject_Print(self->m_proxy, stdout, 0);
//printf("ref %d\n", self->m_proxy->ob_refcnt);
BGE_PROXY_REF(self->m_proxy) = self; /* Its possible this was set to NULL, so set it back here */
+ BGE_PROXY_PTR(self->m_proxy) = ptr;
Py_INCREF(self->m_proxy); /* we own one, thos ones fore the return */
return self->m_proxy;
}
-PyObject *PyObjectPlus::NewProxy_Ext(PyObjectPlus *self, PyTypeObject *tp, bool py_owns)
+PyObject *PyObjectPlus::NewProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, void *ptr, bool py_owns)
{
+ if (!self)
+ {
+ // in case of proxy without reference to game object
+ PyObject* proxy = reinterpret_cast<PyObject *>PyObject_NEW( PyObjectPlus_Proxy, tp);
+ BGE_PROXY_PYREF(proxy) = false;
+ BGE_PROXY_PYOWNS(proxy) = py_owns;
+ BGE_PROXY_REF(proxy) = NULL;
+ BGE_PROXY_PTR(proxy) = ptr;
+ return proxy;
+ }
if (self->m_proxy)
{
if(py_owns)
@@ -953,7 +1135,7 @@ PyObject *PyObjectPlus::NewProxy_Ext(PyObjectPlus *self, PyTypeObject *tp, bool
}
- GetProxy_Ext(self, tp);
+ GetProxyPlus_Ext(self, tp, ptr);
if(py_owns) {
BGE_PROXY_PYOWNS(self->m_proxy) = py_owns;
Py_DECREF(self->m_proxy); /* could avoid thrashing here but for now its ok */
@@ -971,45 +1153,47 @@ void PyObjectPlus::SetDeprecationWarnings(bool ignoreDeprecationWarnings)
m_ignore_deprecation_warnings = ignoreDeprecationWarnings;
}
-void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
+void PyDebugLine()
{
- {
- printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
-
- // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
-
- PyObject *getframe, *frame;
- PyObject *f_lineno, *f_code, *co_filename;
-
- getframe = PySys_GetObject((char *)"_getframe"); // borrowed
- if (getframe) {
- frame = PyObject_CallObject(getframe, NULL);
- if (frame) {
- f_lineno= PyObject_GetAttrString(frame, "f_lineno");
- f_code= PyObject_GetAttrString(frame, "f_code");
- if (f_lineno && f_code) {
- co_filename= PyObject_GetAttrString(f_code, "co_filename");
- if (co_filename) {
-
- printf("\t%s:%d\n", PyString_AsString(co_filename), (int)PyInt_AsLong(f_lineno));
-
- Py_DECREF(f_lineno);
- Py_DECREF(f_code);
- Py_DECREF(co_filename);
- Py_DECREF(frame);
- return;
- }
+ // import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
+
+ PyObject *getframe, *frame;
+ PyObject *f_lineno, *f_code, *co_filename;
+
+ getframe = PySys_GetObject((char *)"_getframe"); // borrowed
+ if (getframe) {
+ frame = PyObject_CallObject(getframe, NULL);
+ if (frame) {
+ f_lineno= PyObject_GetAttrString(frame, "f_lineno");
+ f_code= PyObject_GetAttrString(frame, "f_code");
+ if (f_lineno && f_code) {
+ co_filename= PyObject_GetAttrString(f_code, "co_filename");
+ if (co_filename) {
+
+ printf("\t%s:%d\n", _PyUnicode_AsString(co_filename), (int)PyLong_AsSsize_t(f_lineno));
+
+ Py_DECREF(f_lineno);
+ Py_DECREF(f_code);
+ Py_DECREF(co_filename);
+ Py_DECREF(frame);
+ return;
}
-
- Py_XDECREF(f_lineno);
- Py_XDECREF(f_code);
- Py_DECREF(frame);
}
+ Py_XDECREF(f_lineno);
+ Py_XDECREF(f_code);
+ Py_DECREF(frame);
}
- PyErr_Clear();
- printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
+
}
+ PyErr_Clear();
+ printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n");
+}
+
+void PyObjectPlus::ShowDeprecationWarning_func(const char* old_way,const char* new_way)
+{
+ printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way);
+ PyDebugLine();
}
void PyObjectPlus::ClearDeprecationWarning()
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 3b5eebe9893..237f01f5a3a 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -51,54 +51,6 @@ extern "C" {
}
#endif
-#if PY_VERSION_HEX > 0x03000000
-#define PyString_FromString PyUnicode_FromString
-#define PyString_FromFormat PyUnicode_FromFormat
-#define PyString_Check PyUnicode_Check
-#define PyString_Size PyUnicode_GetSize
-
-#define PyInt_FromLong PyLong_FromSsize_t
-#define PyInt_AsLong PyLong_AsSsize_t
-#define PyString_AsString _PyUnicode_AsString
-#define PyInt_Check PyLong_Check
-#define PyInt_AS_LONG PyLong_AsLong // TODO - check this one
-#endif
-
-
-
-/*
- Py_RETURN_NONE
- Python 2.4 macro.
- defined here until we switch to 2.4
- also in api2_2x/gen_utils.h
-*/
-#ifndef Py_RETURN_NONE
-#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
-#endif
-#ifndef Py_RETURN_FALSE
-#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
-#endif
-#ifndef Py_RETURN_TRUE
-#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
-#endif
-
-/* for pre Py 2.5 */
-#if PY_VERSION_HEX < 0x02050000
-typedef int Py_ssize_t;
-typedef Py_ssize_t (*lenfunc)(PyObject *);
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#define PY_METHODCHAR char *
-#else
-/* Py 2.5 and later */
-#define intargfunc ssizeargfunc
-#define intintargfunc ssizessizeargfunc
-#define PY_METHODCHAR const char *
-#endif
-
-#include "descrobject.h"
-
-
static inline void Py_Fatal(const char *M) {
fprintf(stderr, "%s\n", M);
exit(-1);
@@ -134,61 +86,71 @@ typedef struct {
-typedef struct {
+typedef struct PyObjectPlus_Proxy {
PyObject_HEAD /* required python macro */
- class PyObjectPlus *ref;
- bool py_owns;
+ class PyObjectPlus *ref; // pointer to GE object, it holds a reference to this proxy
+ void *ptr; // optional pointer to generic structure, the structure holds no reference to this proxy
+ bool py_owns; // true if the object pointed by ref should be deleted when the proxy is deleted
+ bool py_ref; // true if proxy is connected to a GE object (ref is used)
} PyObjectPlus_Proxy;
#define BGE_PROXY_ERROR_MSG "Blender Game Engine data has been freed, cannot use this python variable"
#define BGE_PROXY_REF(_self) (((PyObjectPlus_Proxy *)_self)->ref)
+#define BGE_PROXY_PTR(_self) (((PyObjectPlus_Proxy *)_self)->ptr)
#define BGE_PROXY_PYOWNS(_self) (((PyObjectPlus_Proxy *)_self)->py_owns)
+#define BGE_PROXY_PYREF(_self) (((PyObjectPlus_Proxy *)_self)->py_ref)
/* Note, sometimes we dont care what BGE type this is as long as its a proxy */
-#define BGE_PROXY_CHECK_TYPE(_self) ((_self)->ob_type->tp_dealloc == PyObjectPlus::py_base_dealloc)
+#define BGE_PROXY_CHECK_TYPE(_type) ((_type)->tp_dealloc == PyObjectPlus::py_base_dealloc)
+
+/* Opposite of BGE_PROXY_REF */
+#define BGE_PROXY_FROM_REF(_self) (((PyObjectPlus *)_self)->GetProxy())
- // This must be the first line of each
- // PyC++ class
-#define Py_Header \
+// This must be the first line of each
+// PyC++ class
+// AttributesPtr correspond to attributes of proxy generic pointer
+// each PyC++ class must be registered in KX_PythonInitTypes.cpp
+#define __Py_Header \
public: \
static PyTypeObject Type; \
static PyMethodDef Methods[]; \
static PyAttributeDef Attributes[]; \
- static PyParentObject Parents[]; \
virtual PyTypeObject *GetType(void) {return &Type;}; \
- virtual PyParentObject *GetParents(void) {return Parents;} \
- virtual PyObject *GetProxy() {return GetProxy_Ext(this, &Type);}; \
- virtual PyObject *NewProxy(bool py_owns) {return NewProxy_Ext(this, &Type, py_owns);}; \
-
+ virtual PyObject *GetProxy() {return GetProxyPlus_Ext(this, &Type, NULL);}; \
+ virtual PyObject *NewProxy(bool py_owns) {return NewProxyPlus_Ext(this, &Type, NULL, py_owns);}; \
+// leave above line empty (macro)!
+// use this macro for class that use generic pointer in proxy
+// GetProxy() and NewProxy() must be defined to set the correct pointer in the proxy
+#define __Py_HeaderPtr \
+ public: \
+ static PyTypeObject Type; \
+ static PyMethodDef Methods[]; \
+ static PyAttributeDef Attributes[]; \
+ static PyAttributeDef AttributesPtr[]; \
+ virtual PyTypeObject *GetType(void) {return &Type;}; \
+ virtual PyObject *GetProxy(); \
+ virtual PyObject *NewProxy(bool py_owns); \
+// leave above line empty (macro)!
+#ifdef WITH_CXX_GUARDEDALLOC
+#define Py_Header __Py_Header \
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \
+ void operator delete( void *mem ) { MEM_freeN(mem); } \
- // This defines the py_getattro_up macro
- // which allows attribute and method calls
- // to be properly passed up the hierarchy.
- //
- // Note, PyDict_GetItem() WONT set an exception!
- // let the py_base_getattro function do this.
+#else
+#define Py_Header __Py_Header
+#endif
-#define py_getattro_up(Parent) \
- \
- PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
- \
- if(descr) { \
- if (PyCObject_Check(descr)) { \
- return py_get_attrdef((void *)this, (const PyAttributeDef*)PyCObject_AsVoidPtr(descr)); \
- } else if (descr->ob_type->tp_descr_get) { \
- return PyCFunction_New(((PyMethodDescrObject *)descr)->d_method, this->m_proxy); \
- } else { \
- return NULL; \
- } \
- } else { \
- return Parent::py_getattro(attr); \
- }
+#ifdef WITH_CXX_GUARDEDALLOC
+#define Py_HeaderPtr __Py_HeaderPtr \
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, Type.tp_name); } \
+ void operator delete( void *mem ) { MEM_freeN(mem); } \
-#define py_getattro_dict_up(Parent) \
- return py_getattr_dict(Parent::py_getattro_dict(), Type.tp_dict);
+#else
+#define Py_HeaderPtr __Py_HeaderPtr
+#endif
/*
* nonzero values are an error for setattr
@@ -201,29 +163,6 @@ typedef struct {
#define PY_SET_ATTR_MISSING -1
#define PY_SET_ATTR_SUCCESS 0
-#define py_setattro_up(Parent) \
- PyObject *descr = PyDict_GetItem(Type.tp_dict, attr); \
- \
- if(descr) { \
- if (PyCObject_Check(descr)) { \
- const PyAttributeDef* attrdef= reinterpret_cast<const PyAttributeDef *>(PyCObject_AsVoidPtr(descr)); \
- if (attrdef->m_access == KX_PYATTRIBUTE_RO) { \
- PyErr_Format(PyExc_AttributeError, "\"%s\" is read only", PyString_AsString(attr)); \
- return PY_SET_ATTR_FAIL; \
- } \
- else { \
- return py_set_attrdef((void *)this, attrdef, value); \
- } \
- } else { \
- PyErr_Format(PyExc_AttributeError, "\"%s\" cannot be set", PyString_AsString(attr)); \
- return PY_SET_ATTR_FAIL; \
- } \
- } else { \
- PyErr_Clear(); \
- return Parent::py_setattro(attr, value); \
- }
-
-
/**
* These macros are helpfull when embedding Python routines. The second
* macro is one that also requires a documentation string
@@ -294,13 +233,13 @@ typedef struct {
* Method table macro (with doc)
*/
#define KX_PYMETHODTABLE(class_name, method_name) \
- {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, (PY_METHODCHAR)class_name::method_name##_doc}
+ {#method_name , (PyCFunction) class_name::sPy##method_name, METH_VARARGS, (const char *)class_name::method_name##_doc}
#define KX_PYMETHODTABLE_O(class_name, method_name) \
- {#method_name , (PyCFunction) class_name::sPy##method_name, METH_O, (PY_METHODCHAR)class_name::method_name##_doc}
+ {#method_name , (PyCFunction) class_name::sPy##method_name, METH_O, (const char *)class_name::method_name##_doc}
#define KX_PYMETHODTABLE_NOARGS(class_name, method_name) \
- {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, (PY_METHODCHAR)class_name::method_name##_doc}
+ {#method_name , (PyCFunction) class_name::sPy##method_name, METH_NOARGS, (const char *)class_name::method_name##_doc}
/**
* Function implementation macro
@@ -334,6 +273,8 @@ enum KX_PYATTRIBUTE_TYPE {
KX_PYATTRIBUTE_TYPE_DUMMY,
KX_PYATTRIBUTE_TYPE_FUNCTION,
KX_PYATTRIBUTE_TYPE_VECTOR,
+ KX_PYATTRIBUTE_TYPE_FLAG,
+ KX_PYATTRIBUTE_TYPE_CHAR,
};
enum KX_PYATTRIBUTE_ACCESS {
@@ -350,11 +291,14 @@ typedef struct KX_PYATTRIBUTE_DEF {
const char *m_name; // name of the python attribute
KX_PYATTRIBUTE_TYPE m_type; // type of value
KX_PYATTRIBUTE_ACCESS m_access; // read/write access or read-only
- int m_imin; // minimum value in case of integer attributes (for string: minimum string length)
- int m_imax; // maximum value in case of integer attributes (for string: maximum string length)
+ int m_imin; // minimum value in case of integer attributes
+ // (for string: minimum string length, for flag: mask value, for float: matrix row size)
+ int m_imax; // maximum value in case of integer attributes
+ // (for string: maximum string length, for flag: 1 if flag is negative, float: vector/matrix col size)
float m_fmin; // minimum value in case of float attributes
float m_fmax; // maximum value in case of float attributes
bool m_clamp; // enforce min/max value by clamping
+ bool m_usePtr; // the attribute uses the proxy generic pointer, set at runtime
size_t m_offset; // position of field in structure
size_t m_size; // size of field for runtime verification (enum only)
size_t m_length; // length of array, 1=simple attribute
@@ -372,104 +316,146 @@ typedef struct KX_PYATTRIBUTE_DEF {
float *m_floatPtr;
STR_String *m_stringPtr;
MT_Vector3 *m_vectorPtr;
+ char *m_charPtr;
} m_typeCheck;
} PyAttributeDef;
#define KX_PYATTRIBUTE_DUMMY(name) \
- { name, KX_PYATTRIBUTE_TYPE_DUMMY, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_DUMMY, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, 0, 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_BOOL_RW(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_BOOL_RW_CHECK(name,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RW, 0, 1, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_BOOL_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RO, 0, 1, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_BOOL, KX_PYATTRIBUTE_RO, 0, 1, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {&((object *)0)->field, NULL, NULL, NULL, NULL, NULL, NULL} }
+
+/* attribute points to a single bit of an integer field, attribute=true if bit is set */
+#define KX_PYATTRIBUTE_FLAG_RW(name,object,field,bit) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RW, bit, 0, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLAG_RW_CHECK(name,object,field,bit,function) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RW, bit, 0, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLAG_RO(name,object,field,bit) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RO, bit, 0, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
+
+/* attribute points to a single bit of an integer field, attribute=true if bit is set*/
+#define KX_PYATTRIBUTE_FLAG_NEGATIVE_RW(name,object,field,bit) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RW, bit, 1, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLAG_NEGATIVE_RW_CHECK(name,object,field,bit,function) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RW, bit, 1, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLAG_NEGATIVE_RO(name,object,field,bit) \
+ { name, KX_PYATTRIBUTE_TYPE_FLAG, KX_PYATTRIBUTE_RO, bit, 1, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
// enum field cannot be mapped to pointer (because we would need a pointer for each enum)
// use field size to verify mapping at runtime only, assuming enum size is equal to int size.
#define KX_PYATTRIBUTE_ENUM_RW(name,min,max,clamp,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_ENUM_RW_CHECK(name,min,max,clamp,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_ENUM_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_ENUM, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_RW(name,min,max,clamp,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_RW_CHECK(name,min,max,clamp,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_ARRAY_RW(name,min,max,clamp,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_ARRAY_RO(name,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, ((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
// SHORT_LIST
#define KX_PYATTRIBUTE_SHORT_LIST_RW(name,min,max,clamp,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_SHORT_LIST_RO(name,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_SHORT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, &((object *)0)->field, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_RW(name,min,max,clamp,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_RW_CHECK(name,min,max,clamp,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_ARRAY_RW(name,min,max,clamp,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_ARRAY_RW_CHECK(name,min,max,clamp,object,field,length,function) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_ARRAY_RO(name,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, ((object *)0)->field, NULL, NULL, NULL, NULL} }
// INT_LIST
#define KX_PYATTRIBUTE_INT_LIST_RW(name,min,max,clamp,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_LIST_RW_CHECK(name,min,max,clamp,object,field,length,function) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_INT_LIST_RO(name,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_INT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, &((object *)0)->field, NULL, NULL, NULL, NULL} }
// always clamp for float
#define KX_PYATTRIBUTE_FLOAT_RW(name,min,max,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_FLOAT_RW_CHECK(name,min,max,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_FLOAT_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, &((object *)0)->field, NULL, NULL, NULL} }
+// field must be float[n], returns a sequence
#define KX_PYATTRIBUTE_FLOAT_ARRAY_RW(name,min,max,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_FLOAT_ARRAY_RW_CHECK(name,min,max,object,field,length,function) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, length, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_FLOAT_ARRAY_RO(name,object,field,length) \
- { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL} }
-
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, length, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+// field must be float[n], returns a vector
+#define KX_PYATTRIBUTE_FLOAT_VECTOR_RW(name,min,max,object,field,length) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, length, min, max, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLOAT_VECTOR_RW_CHECK(name,min,max,object,field,length,function) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, 0, length, min, max, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLOAT_VECTOR_RO(name,object,field,length) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, 0, length, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field, NULL, NULL, NULL} }
+// field must be float[n][n], returns a matrix
+#define KX_PYATTRIBUTE_FLOAT_MATRIX_RW(name,min,max,object,field,length) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, length, length, min, max, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field[0], NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLOAT_MATRIX_RW_CHECK(name,min,max,object,field,length,function) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RW, length, length, min, max, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field[0], NULL, NULL, NULL} }
+#define KX_PYATTRIBUTE_FLOAT_MATRIX_RO(name,object,field,length) \
+ { name, KX_PYATTRIBUTE_TYPE_FLOAT, KX_PYATTRIBUTE_RO, length, length, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, ((object *)0)->field[0], NULL, NULL, NULL} }
+
+// only for STR_String member
#define KX_PYATTRIBUTE_STRING_RW(name,min,max,clamp,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
#define KX_PYATTRIBUTE_STRING_RW_CHECK(name,min,max,clamp,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RW, min, max, 0.f, 0.f, clamp, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
#define KX_PYATTRIBUTE_STRING_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_STRING, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, &((object *)0)->field, NULL, NULL} }
+
+// only for char [] array
+#define KX_PYATTRIBUTE_CHAR_RW(name,object,field) \
+ { name, KX_PYATTRIBUTE_TYPE_CHAR, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, ((object *)0)->field} }
+#define KX_PYATTRIBUTE_CHAR_RW_CHECK(name,object,field,function) \
+ { name, KX_PYATTRIBUTE_TYPE_CHAR, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, true, false, offsetof(object,field), sizeof(((object *)0)->field), 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, ((object *)0)->field} }
+#define KX_PYATTRIBUTE_CHAR_RO(name,object,field) \
+ { name, KX_PYATTRIBUTE_TYPE_CHAR, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), sizeof(((object *)0)->field), 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, NULL, ((object *)0)->field} }
+// for MT_Vector3 member
#define KX_PYATTRIBUTE_VECTOR_RW(name,min,max,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
+ { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, 1, NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
#define KX_PYATTRIBUTE_VECTOR_RW_CHECK(name,min,max,clamp,object,field,function) \
- { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
+ { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RW, 0, 0, min, max, true, false, offsetof(object,field), 0, 1, &object::function, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
#define KX_PYATTRIBUTE_VECTOR_RO(name,object,field) \
- { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field} }
+ { name, KX_PYATTRIBUTE_TYPE_VECTOR, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, offsetof(object,field), 0, 1 , NULL, NULL, NULL, {NULL, NULL, NULL, NULL, NULL, &((object *)0)->field, NULL} }
#define KX_PYATTRIBUTE_RW_FUNCTION(name,object,getfunction,setfunction) \
- { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0.f, false, false, 0, 0, 1, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_RO_FUNCTION(name,object,getfunction) \
- { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, 0, 0, 1, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0.f, false, false, 0, 0, 1, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_ARRAY_RW_FUNCTION(name,object,length,getfunction,setfunction) \
- { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RW, 0, 0, 0.f, 0,f, false, false, 0, 0, length, NULL, &object::setfunction, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
#define KX_PYATTRIBUTE_ARRAY_RO_FUNCTION(name,object,length,getfunction) \
- { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0,f, false, 0, 0, length, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL} }
+ { name, KX_PYATTRIBUTE_TYPE_FUNCTION, KX_PYATTRIBUTE_RO, 0, 0, 0.f, 0,f, false, false, 0, 0, length, NULL, NULL, &object::getfunction, {NULL, NULL, NULL, NULL, NULL, NULL, NULL} }
/*------------------------------
@@ -493,7 +479,7 @@ class PyObjectPlus : public SG_QList
Py_Header; // Always start with Py_Header
public:
- PyObjectPlus(PyTypeObject *T);
+ PyObjectPlus();
PyObject *m_proxy; /* actually a PyObjectPlus_Proxy */
@@ -501,37 +487,33 @@ public:
/* These static functions are referenced by ALL PyObjectPlus_Proxy types
* they take the C++ reference from the PyObjectPlus_Proxy and call
- * its own virtual py_getattro, py_setattro etc. functions.
+ * its own virtual py_repr, py_base_dealloc ,etc. functions.
*/
+
+ static PyObject* py_base_new(PyTypeObject *type, PyObject *args, PyObject *kwds); /* allows subclassing */
static void py_base_dealloc(PyObject *self);
- static PyObject* py_base_getattro(PyObject * self, PyObject *attr);
- static int py_base_setattro(PyObject *self, PyObject *attr, PyObject *value);
static PyObject* py_base_repr(PyObject *self);
/* These are all virtual python methods that are defined in each class
* Our own fake subclassing calls these on each class, then calls the parent */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_delattro(PyObject *attr);
- virtual int py_setattro(PyObject *attr, PyObject *value);
virtual PyObject* py_repr(void);
+ /* subclass may overwrite this function to implement more sophisticated method of validating a proxy */
+ virtual bool py_is_valid(void) { return true; }
- static PyObject* py_get_attrdef(void *self, const PyAttributeDef *attrdef);
- static int py_set_attrdef(void *self, const PyAttributeDef *attrdef, PyObject *value);
-
- /* isA() methods, shonky replacement for pythons issubclass()
- * which we cant use because we have our own subclass system */
- bool isA(PyTypeObject *T);
- bool isA(const char *mytypename);
-
- KX_PYMETHOD_O(PyObjectPlus,isA);
+ static PyObject* py_get_attrdef(PyObject *self_py, const PyAttributeDef *attrdef);
+ static int py_set_attrdef(PyObject *self_py, PyObject *value, const PyAttributeDef *attrdef);
/* Kindof dumb, always returns True, the false case is checked for, before this function gets accessed */
static PyObject* pyattr_get_invalid(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-
- static PyObject *GetProxy_Ext(PyObjectPlus *self, PyTypeObject *tp);
- static PyObject *NewProxy_Ext(PyObjectPlus *self, PyTypeObject *tp, bool py_owns);
-
+
+ static PyObject *GetProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, void *ptr);
+ /* self=NULL => proxy to generic pointer detached from GE object
+ if py_owns is true, the memory pointed by ptr will be deleted automatially with MEM_freeN
+ self!=NULL=> proxy attached to GE object, ptr is optional and point to a struct from which attributes can be defined
+ if py_owns is true, the object will be deleted automatically, ptr will NOT be deleted
+ (assume object destructor takes care of it) */
+ static PyObject *NewProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, void *ptr, bool py_owns);
+
void InvalidateProxy();
/**
diff --git a/source/gameengine/Expressions/SConscript b/source/gameengine/Expressions/SConscript
index 07cab62c020..26cafb004b2 100644
--- a/source/gameengine/Expressions/SConscript
+++ b/source/gameengine/Expressions/SConscript
@@ -3,12 +3,7 @@ Import ('env')
sources = env.Glob('*.cpp')
-incs ='. #source/kernel/gen_system #intern/string #intern/moto/include #source/gameengine/SceneGraph #source/blender/blenloader'
+incs ='. #source/kernel/gen_system #intern/guardedalloc #intern/string #intern/moto/include #source/gameengine/SceneGraph #source/blender/blenloader'
incs += ' ' + env['BF_PYTHON_INC']
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_expressions', sources, Split(incs), [], libtype=['core','player'], priority = [360,120], cxx_compileflags=cxxflags)
+env.BlenderLib ( 'bf_expressions', sources, Split(incs), [], 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 52f8a580f4d..069eb8d9c24 100644
--- a/source/gameengine/Expressions/StringValue.h
+++ b/source/gameengine/Expressions/StringValue.h
@@ -40,12 +40,19 @@ public:
virtual void SetValue(CValue* newval) { m_strString = newval->GetText(); SetModified(true); };
virtual CValue* GetReplica();
virtual PyObject* ConvertValueToPython() {
- return PyString_FromString(m_strString.Ptr());
+ return PyUnicode_FromString(m_strString.Ptr());
}
private:
// data member
STR_String m_strString;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CStringValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index 61dabff510b..130317d77e2 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -36,13 +36,7 @@ double CValue::m_sZeroVec[3] = {0.0,0.0,0.0};
#ifndef NO_EXP_PYTHON_EMBEDDING
PyTypeObject CValue::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"CValue",
sizeof(PyObjectPlus_Proxy),
0,
@@ -54,29 +48,23 @@ PyTypeObject CValue::Type = {
py_base_repr,
0,
0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject CValue::Parents[] = {
- &CValue::Type,
- NULL
+ NULL,
+ NULL,
+ 0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &PyObjectPlus::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef CValue::Methods[] = {
- { "getName", (PyCFunction) CValue::sPyGetName, METH_NOARGS},
{NULL,NULL} //Sentinel
};
-PyObject* CValue::PyGetName()
-{
- ShowDeprecationWarning("getName()", "the name property");
-
- return PyString_FromString(this->GetName());
-}
-
/*#define CVALUE_DEBUG*/
#ifdef CVALUE_DEBUG
int gRefCount;
@@ -100,8 +88,8 @@ std::vector<SmartCValueRef> gRefList;
//int gRefCountValue;
#endif
-CValue::CValue(PyTypeObject *T)
- : PyObjectPlus(T),
+CValue::CValue()
+ : PyObjectPlus(),
#else
CValue::CValue()
:
@@ -541,45 +529,14 @@ CValue* CValue::FindIdentifier(const STR_String& identifiername)
#ifndef NO_EXP_PYTHON_EMBEDDING
-
-static PyMethodDef CValueMethods[] =
-{
- //{ "new", CValue::PyMake , METH_VARARGS},
- { NULL,NULL} // Sentinel
-};
-
PyAttributeDef CValue::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", CValue, pyattr_get_name),
{ NULL } //Sentinel
};
-
-PyObject* CValue::py_getattro(PyObject *attr)
-{
- char *attr_str= PyString_AsString(attr);
- CValue* resultattr = GetProperty(attr_str);
- if (resultattr)
- {
- /* only show the wanting here because python inspects for __class__ and KX_MeshProxy uses CValues name attr */
- ShowDeprecationWarning("val = ob.attr", "val = ob['attr']");
-
- PyObject* pyconvert = resultattr->ConvertValueToPython();
-
- if (pyconvert)
- return pyconvert;
- else
- return resultattr->GetProxy();
- }
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* CValue::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
PyObject * CValue::pyattr_get_name(void * self_v, const KX_PYATTRIBUTE_DEF * attrdef) {
CValue * self = static_cast<CValue *> (self_v);
- return PyString_FromString(self->GetName());
+ return PyUnicode_FromString(self->GetName());
}
CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix)
@@ -623,30 +580,17 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix)
{
vallie = new CFloatValue( (float)PyFloat_AsDouble(pyobj) );
} else
- if (PyInt_Check(pyobj))
- {
- vallie = new CIntValue( (cInt)PyInt_AS_LONG(pyobj) );
- } else
if (PyLong_Check(pyobj))
{
vallie = new CIntValue( (cInt)PyLong_AsLongLong(pyobj) );
} else
- if (PyString_Check(pyobj))
+ if (PyUnicode_Check(pyobj))
{
- vallie = new CStringValue(PyString_AsString(pyobj),"");
+ vallie = new CStringValue(_PyUnicode_AsString(pyobj),"");
} else
- if (BGE_PROXY_CHECK_TYPE(pyobj)) /* Note, dont let these get assigned to GameObject props, must check elsewhere */
+ if (PyObject_TypeCheck(pyobj, &CValue::Type)) /* Note, dont let these get assigned to GameObject props, must check elsewhere */
{
- if (BGE_PROXY_REF(pyobj) && (BGE_PROXY_REF(pyobj))->isA(&CValue::Type))
- {
- vallie = (static_cast<CValue *>(BGE_PROXY_REF(pyobj)))->AddRef();
- } else {
-
- if(BGE_PROXY_REF(pyobj)) /* this is not a CValue */
- PyErr_Format(PyExc_TypeError, "%sgame engine python type cannot be used as a property", error_prefix);
- else /* PyObjectPlus_Proxy has been removed, cant use */
- PyErr_Format(PyExc_SystemError, "%s"BGE_PROXY_ERROR_MSG, error_prefix);
- }
+ vallie = (static_cast<CValue *>(BGE_PROXY_REF(pyobj)))->AddRef();
} else
{
/* return an error value from the caller */
@@ -656,57 +600,6 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix)
}
-int CValue::py_delattro(PyObject *attr)
-{
- ShowDeprecationWarning("del ob.attr", "del ob['attr']");
-
- char *attr_str= PyString_AsString(attr);
- if (RemoveProperty(attr_str))
- return 0;
-
- PyErr_Format(PyExc_AttributeError, "attribute \"%s\" dosnt exist", attr_str);
- return PY_SET_ATTR_MISSING;
-}
-
-int CValue::py_setattro(PyObject *attr, PyObject* pyobj)
-{
- ShowDeprecationWarning("ob.attr = val", "ob['attr'] = val");
-
- char *attr_str= PyString_AsString(attr);
- CValue* oldprop = GetProperty(attr_str);
- CValue* vallie;
-
- /* Dissallow python to assign GameObjects, Scenes etc as values */
- if ((BGE_PROXY_CHECK_TYPE(pyobj)==0) && (vallie = ConvertPythonToValue(pyobj, "cvalue.attr = value: ")))
- {
- if (oldprop)
- oldprop->SetValue(vallie);
- else
- SetProperty(attr_str, vallie);
-
- vallie->Release();
- }
- else {
- // ConvertPythonToValue sets the error message
- // must return missing so KX_GameObect knows this
- // attribute was not a function or bult in attribute,
- //
- // CValue attributes override internal attributes
- // so if it exists as a CValue attribute already,
- // assume your trying to set it to a differnt CValue attribute
- // otherwise return PY_SET_ATTR_MISSING so children
- // classes know they can set it without conflict
-
- if (GetProperty(attr_str))
- return PY_SET_ATTR_COERCE_FAIL; /* failed to set an existing attribute */
- else
- return PY_SET_ATTR_MISSING; /* allow the KX_GameObject dict to set */
- }
-
- //PyObjectPlus::py_setattro(attr,value);
- return PY_SET_ATTR_SUCCESS;
-};
-
PyObject* CValue::ConvertKeysToPython( void )
{
PyObject *pylist = PyList_New( 0 );
@@ -717,7 +610,7 @@ PyObject* CValue::ConvertKeysToPython( void )
std::map<STR_String,CValue*>::iterator it;
for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++)
{
- pystr = PyString_FromString( (*it).first );
+ pystr = PyUnicode_FromString( (*it).first );
PyList_Append(pylist, pystr);
Py_DECREF( pystr );
}
diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h
index 29ef19b46c9..7d4adcdb64f 100644
--- a/source/gameengine/Expressions/Value.h
+++ b/source/gameengine/Expressions/Value.h
@@ -42,6 +42,10 @@
#include <map> // array functionality for the propertylist
#include "STR_String.h" // STR_String class
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
#ifndef GEN_NO_ASSERT
#undef assert
#define assert(exp) ((void)NULL)
@@ -173,6 +177,13 @@ public:
virtual ~CAction(){
};
virtual void Execute() const =0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CAction"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
//
@@ -215,32 +226,22 @@ public:
// Construction / Destruction
#ifndef NO_EXP_PYTHON_EMBEDDING
- CValue(PyTypeObject *T = &Type);
+ CValue();
//static PyObject* PyMake(PyObject*,PyObject*);
virtual PyObject *py_repr(void)
{
- return PyString_FromString((const char*)GetText());
+ return PyUnicode_FromString((const char*)GetText());
}
-
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
virtual PyObject* ConvertValueToPython() {
return NULL;
}
virtual CValue* ConvertPythonToValue(PyObject* pyobj, const char *error_prefix);
-
-
- virtual int py_delattro(PyObject *attr);
- virtual int py_setattro(PyObject *attr, PyObject* value);
static PyObject * pyattr_get_name(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
virtual PyObject* ConvertKeysToPython( void );
-
- KX_PYMETHOD_NOARGS(CValue,GetName);
#else
CValue();
@@ -415,10 +416,9 @@ public: \
class CPropValue : public CValue
{
public:
-
#ifndef NO_EXP_PYTHON_EMBEDDING
- CPropValue(PyTypeObject* T=&Type) :
- CValue(T),
+ CPropValue() :
+ CValue(),
#else
CPropValue() :
#endif //NO_EXP_PYTHON_EMBEDDING
@@ -444,6 +444,13 @@ public:
protected:
STR_String m_strNewName; // Identification
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CPropValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _VALUEBASECLASS_H
diff --git a/source/gameengine/Expressions/VectorValue.h b/source/gameengine/Expressions/VectorValue.h
index 19c7dd30076..49fb1e7ea08 100644
--- a/source/gameengine/Expressions/VectorValue.h
+++ b/source/gameengine/Expressions/VectorValue.h
@@ -79,6 +79,13 @@ public:
protected:
double m_vec[3];
double m_transformedvec[3];
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CVectorValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _VECTORVALUE_H
diff --git a/source/gameengine/Expressions/VoidValue.h b/source/gameengine/Expressions/VoidValue.h
index 10a6ff9ad3d..50ec4ff1ee7 100644
--- a/source/gameengine/Expressions/VoidValue.h
+++ b/source/gameengine/Expressions/VoidValue.h
@@ -59,6 +59,13 @@ public:
/// Data members
bool m_bDeleteOnDestruct;
void* m_pAnything;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CVoidValue"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // !defined _VOIDVALUE_H
diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt
index 7e2bc85bd1f..601585f79d6 100644
--- a/source/gameengine/GameLogic/CMakeLists.txt
+++ b/source/gameengine/GameLogic/CMakeLists.txt
@@ -27,16 +27,21 @@
FILE(GLOB SRC *.cpp Joystick/*.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../source/gameengine/Expressions
- ../../../source/gameengine/SceneGraph
- ../../../intern/moto/include
- ../../../source/gameengine/Rasterizer
- ${PYTHON_INC}
- ${SDL_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../source/gameengine/Expressions
+ ../../../source/gameengine/SceneGraph
+ ../../../intern/moto/include
+ ../../../source/gameengine/Rasterizer
+ ${PYTHON_INC}
)
+IF(WITH_SDL)
+ SET(INC ${INC} ${SDL_INCLUDE_DIR})
+ELSE(WITH_SDL)
+ ADD_DEFINITIONS(-DDISABLE_SDL)
+ENDIF(WITH_SDL)
+
BLENDERLIB(bf_logic "${SRC}" "${INC}")
#env.BlenderLib ( 'bf_logic', sources, Split(incs), [], libtype=['game','player'], priority=[30, 110] )
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
index caed85b9938..9b04e263350 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
@@ -42,9 +42,8 @@ SCA_2DFilterActuator::SCA_2DFilterActuator(
float float_arg,
int int_arg,
RAS_IRasterizer* rasterizer,
- RAS_IRenderTools* rendertools,
- PyTypeObject* T)
- : SCA_IActuator(gameobj, T),
+ RAS_IRenderTools* rendertools)
+ : SCA_IActuator(gameobj, KX_ACT_2DFILTER),
m_type(type),
m_disableMotionBlur(flag),
m_float_arg(float_arg),
@@ -108,39 +107,27 @@ void SCA_2DFilterActuator::SetShaderText(const char *text)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_2DFilterActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "SCA_2DFilterActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-PyParentObject SCA_2DFilterActuator::Parents[] = {
- &SCA_2DFilterActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ "SCA_2DFilterActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
PyMethodDef SCA_2DFilterActuator::Methods[] = {
/* add python functions to deal with m_msg... */
{NULL,NULL}
@@ -154,18 +141,3 @@ PyAttributeDef SCA_2DFilterActuator::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("value", 0.0, 100.0, SCA_2DFilterActuator, m_float_arg),
{ NULL } //Sentinel
};
-
-PyObject* SCA_2DFilterActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* SCA_2DFilterActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int SCA_2DFilterActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
index 13b9997a010..c357c4f3e37 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
@@ -56,23 +56,12 @@ public:
float float_arg,
int int_arg,
RAS_IRasterizer* rasterizer,
- RAS_IRenderTools* rendertools,
- PyTypeObject* T=&Type
- );
+ RAS_IRenderTools* rendertools);
void SetShaderText(const char *text);
virtual ~SCA_2DFilterActuator();
virtual bool Update();
virtual CValue* GetReplica();
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_ANDController.cpp b/source/gameengine/GameLogic/SCA_ANDController.cpp
index 87f7c612e7c..ac9e238bd64 100644
--- a/source/gameengine/GameLogic/SCA_ANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_ANDController.cpp
@@ -42,10 +42,9 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_ANDController::SCA_ANDController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_ANDController::SCA_ANDController(SCA_IObject* gameobj)
:
- SCA_IController(gameobj,T)
+ SCA_IController(gameobj)
{
}
@@ -100,13 +99,7 @@ CValue* SCA_ANDController::GetReplica()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_ANDController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_ANDController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -116,19 +109,15 @@ PyTypeObject SCA_ANDController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_ANDController::Parents[] = {
- &SCA_ANDController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_ANDController::Methods[] = {
@@ -139,12 +128,4 @@ PyAttributeDef SCA_ANDController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_ANDController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_ANDController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ANDController.h b/source/gameengine/GameLogic/SCA_ANDController.h
index 9a359d57cb4..cb16d7fca01 100644
--- a/source/gameengine/GameLogic/SCA_ANDController.h
+++ b/source/gameengine/GameLogic/SCA_ANDController.h
@@ -39,18 +39,10 @@ class SCA_ANDController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_ANDController(SCA_IObject* gameobj,PyTypeObject* T=&Type);
+ SCA_ANDController(SCA_IObject* gameobj);
virtual ~SCA_ANDController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_ANDCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
index a7d61627c23..f3884c87a75 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
+++ b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
@@ -45,6 +45,13 @@ public:
virtual void NextFrame();
virtual void UpdateFrame();
//SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ActuatorEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_ACTUATOREVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
index 4dad65c5a25..428362a0a24 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
@@ -40,9 +40,8 @@
SCA_ActuatorSensor::SCA_ActuatorSensor(SCA_EventManager* eventmgr,
SCA_IObject* gameobj,
- const STR_String& actname,
- PyTypeObject* T )
- : SCA_ISensor(gameobj,eventmgr,T),
+ const STR_String& actname)
+ : SCA_ISensor(gameobj,eventmgr),
m_checkactname(actname)
{
m_actuator = GetParent()->FindActuator(m_checkactname);
@@ -122,13 +121,7 @@ void SCA_ActuatorSensor::Update()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_ActuatorSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_ActuatorSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -138,26 +131,18 @@ PyTypeObject SCA_ActuatorSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_ActuatorSensor::Parents[] = {
- &SCA_ActuatorSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_ActuatorSensor::Methods[] = {
- //Deprecated functions ------>
- {"getActuator", (PyCFunction) SCA_ActuatorSensor::sPyGetActuator, METH_NOARGS, (PY_METHODCHAR)GetActuator_doc},
- {"setActuator", (PyCFunction) SCA_ActuatorSensor::sPySetActuator, METH_VARARGS, (PY_METHODCHAR)SetActuator_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -166,18 +151,6 @@ PyAttributeDef SCA_ActuatorSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_ActuatorSensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_ActuatorSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_ActuatorSensor::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_ISensor);
-}
-
int SCA_ActuatorSensor::CheckActuator(void *self, const PyAttributeDef*)
{
SCA_ActuatorSensor* sensor = reinterpret_cast<SCA_ActuatorSensor*>(self);
@@ -190,41 +163,4 @@ int SCA_ActuatorSensor::CheckActuator(void *self, const PyAttributeDef*)
return 1;
}
-/* 3. getActuator */
-const char SCA_ActuatorSensor::GetActuator_doc[] =
-"getActuator()\n"
-"\tReturn the Actuator with which the sensor operates.\n";
-PyObject* SCA_ActuatorSensor::PyGetActuator()
-{
- ShowDeprecationWarning("getActuator()", "the actuator property");
- return PyString_FromString(m_checkactname);
-}
-
-/* 4. setActuator */
-const char SCA_ActuatorSensor::SetActuator_doc[] =
-"setActuator(name)\n"
-"\t- name: string\n"
-"\tSets the Actuator with which to operate. If there is no Actuator\n"
-"\tof this name, the call is ignored.\n";
-PyObject* SCA_ActuatorSensor::PySetActuator(PyObject* args)
-{
- ShowDeprecationWarning("setActuator()", "the actuator property");
- /* We should query whether the name exists. Or should we create a prop */
- /* on the fly? */
- char *actNameArg = NULL;
-
- if (!PyArg_ParseTuple(args, "s:setActuator", &actNameArg)) {
- return NULL;
- }
-
- SCA_IActuator* act = GetParent()->FindActuator(STR_String(actNameArg));
- if (act) {
- m_checkactname = actNameArg;
- m_actuator = act;
- } else {
- ; /* error: bad actuator name */
- }
- Py_RETURN_NONE;
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.h b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
index 6655e08dc70..1a095148500 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.h
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
@@ -46,8 +46,7 @@ class SCA_ActuatorSensor : public SCA_ISensor
public:
SCA_ActuatorSensor(class SCA_EventManager* eventmgr,
SCA_IObject* gameobj,
- const STR_String& actname,
- PyTypeObject* T=&Type );
+ const STR_String& actname);
virtual ~SCA_ActuatorSensor();
virtual CValue* GetReplica();
@@ -60,15 +59,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- /* 3. setProperty */
- KX_PYMETHOD_DOC_VARARGS(SCA_ActuatorSensor,SetActuator);
- /* 4. getProperty */
- KX_PYMETHOD_DOC_NOARGS(SCA_ActuatorSensor,GetActuator);
static int CheckActuator(void *self, const PyAttributeDef*);
};
diff --git a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
index a619eecddd4..9540e3b71f6 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
+++ b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
@@ -41,6 +41,11 @@ public:
virtual void NextFrame();
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_AlwaysEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_ALWAYSEVENTMGR
diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
index ff02680f191..35b035f6466 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
@@ -48,9 +48,8 @@
/* ------------------------------------------------------------------------- */
SCA_AlwaysSensor::SCA_AlwaysSensor(class SCA_EventManager* eventmgr,
- SCA_IObject* gameobj,
- PyTypeObject* T)
- : SCA_ISensor(gameobj,eventmgr, T)
+ SCA_IObject* gameobj)
+ : SCA_ISensor(gameobj,eventmgr)
{
//SetDrawColor(255,0,0);
Init();
@@ -105,13 +104,7 @@ bool SCA_AlwaysSensor::Evaluate()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_AlwaysSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_AlwaysSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -121,19 +114,15 @@ PyTypeObject SCA_AlwaysSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_AlwaysSensor::Parents[] = {
- &SCA_AlwaysSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_AlwaysSensor::Methods[] = {
@@ -144,12 +133,4 @@ PyAttributeDef SCA_AlwaysSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_AlwaysSensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_AlwaysSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.h b/source/gameengine/GameLogic/SCA_AlwaysSensor.h
index 0f85a641ef1..d58e05564d1 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysSensor.h
+++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.h
@@ -39,22 +39,12 @@ class SCA_AlwaysSensor : public SCA_ISensor
bool m_alwaysresult;
public:
SCA_AlwaysSensor(class SCA_EventManager* eventmgr,
- SCA_IObject* gameobj,
- PyTypeObject* T =&Type);
+ SCA_IObject* gameobj);
virtual ~SCA_AlwaysSensor();
virtual CValue* GetReplica();
virtual bool Evaluate();
virtual bool IsPositiveTrigger();
virtual void Init();
-
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_ALWAYSSENSOR
diff --git a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
new file mode 100644
index 00000000000..24cae439fb7
--- /dev/null
+++ b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
@@ -0,0 +1,62 @@
+/**
+ * Manager for 'always' events. Since always sensors can operate in pulse
+ * mode, they need to be activated.
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "SCA_BasicEventManager.h"
+#include "SCA_LogicManager.h"
+#include <vector>
+#include "SCA_ISensor.h"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+using namespace std;
+
+SCA_BasicEventManager::SCA_BasicEventManager(class SCA_LogicManager* logicmgr)
+ : SCA_EventManager(BASIC_EVENTMGR),
+ m_logicmgr(logicmgr)
+{
+}
+
+SCA_BasicEventManager::~SCA_BasicEventManager()
+{
+}
+
+void SCA_BasicEventManager::NextFrame()
+{
+ SG_DList::iterator<SCA_ISensor> it(m_sensors);
+ for (it.begin();!it.end();++it)
+ {
+ (*it)->Activate(m_logicmgr);
+ }
+}
+
diff --git a/source/blender/blenlib/MTC_vectorops.h b/source/gameengine/GameLogic/SCA_BasicEventManager.h
index 4fec93b37b9..1aae5f9be5c 100644
--- a/source/blender/blenlib/MTC_vectorops.h
+++ b/source/gameengine/GameLogic/SCA_BasicEventManager.h
@@ -1,5 +1,5 @@
-/*
- * vectorops.h
+/**
+ * Manager for sensor that only need to call Update
*
* $Id$
*
@@ -29,30 +29,31 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef VECTOROPS_H
-#define VECTOROPS_H
+#ifndef __SCA_BASICEVENTMGR
+#define __SCA_BASICEVENTMGR
-/* ------------------------------------------------------------------------- */
+#include "SCA_EventManager.h"
+#include <vector>
-void MTC_diff3Int(int v1[3], int v2[3], int v3[3]);
-void MTC_cross3Int(int v1[3], int v2[3], int v3[3]);
-int MTC_dot3Int(int v1[3], int v2[3]);
+using namespace std;
-void MTC_diff3Float(float v1[3], float v2[3], float v3[3]);
-void MTC_cross3Float(float v1[3], float v2[3], float v3[3]);
-float MTC_dot3Float(float v1[3], float v2[3]);
-void MTC_cp3Float(float v1[3], float v2[3]);
-/**
- * Copy vector with a minus sign (so a = -b)
- */
-void MTC_cp3FloatInv(float v1[3], float v2[3]);
+class SCA_BasicEventManager : public SCA_EventManager
+{
+ class SCA_LogicManager* m_logicmgr;
+
+public:
+ SCA_BasicEventManager(class SCA_LogicManager* logicmgr);
+ ~SCA_BasicEventManager();
+
+ virtual void NextFrame();
-void MTC_swapInt(int *i1, int *i2);
-void MTC_diff3DFF(double v1[3], float v2[3], float v3[3]);
-void MTC_cross3Double(double v1[3], double v2[3], double v3[3]);
-float MTC_normalize3DF(float n[3]);
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_BasicEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+};
-/* ------------------------------------------------------------------------- */
-#endif /* VECTOROPS_H */
+#endif //__SCA_BASICEVENTMGR
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.cpp b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
index dcdae0b4e75..0f67ddd56a5 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
@@ -51,9 +51,8 @@ SCA_DelaySensor::SCA_DelaySensor(class SCA_EventManager* eventmgr,
SCA_IObject* gameobj,
int delay,
int duration,
- bool repeat,
- PyTypeObject* T)
- : SCA_ISensor(gameobj,eventmgr, T),
+ bool repeat)
+ : SCA_ISensor(gameobj,eventmgr),
m_repeat(repeat),
m_delay(delay),
m_duration(duration)
@@ -131,13 +130,7 @@ bool SCA_DelaySensor::Evaluate()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_DelaySensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_DelaySensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -147,32 +140,18 @@ PyTypeObject SCA_DelaySensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_DelaySensor::Parents[] = {
- &SCA_DelaySensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_DelaySensor::Methods[] = {
- //Deprecated functions ------>
- /* setProperty */
- {"setDelay", (PyCFunction) SCA_DelaySensor::sPySetDelay, METH_VARARGS, (PY_METHODCHAR)SetDelay_doc},
- {"setDuration", (PyCFunction) SCA_DelaySensor::sPySetDuration, METH_VARARGS, (PY_METHODCHAR)SetDuration_doc},
- {"setRepeat", (PyCFunction) SCA_DelaySensor::sPySetRepeat, METH_VARARGS, (PY_METHODCHAR)SetRepeat_doc},
- /* getProperty */
- {"getDelay", (PyCFunction) SCA_DelaySensor::sPyGetDelay, METH_NOARGS, (PY_METHODCHAR)GetDelay_doc},
- {"getDuration", (PyCFunction) SCA_DelaySensor::sPyGetDuration, METH_NOARGS, (PY_METHODCHAR)GetDuration_doc},
- {"getRepeat", (PyCFunction) SCA_DelaySensor::sPyGetRepeat, METH_NOARGS, (PY_METHODCHAR)GetRepeat_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -183,104 +162,4 @@ PyAttributeDef SCA_DelaySensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_DelaySensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_DelaySensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_DelaySensor::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_ISensor);
-}
-
-
-const char SCA_DelaySensor::SetDelay_doc[] =
-"setDelay(delay)\n"
-"\t- delay: length of the initial OFF period as number of frame\n"
-"\t 0 for immediate trigger\n"
-"\tSet the initial delay before the positive trigger\n";
-PyObject* SCA_DelaySensor::PySetDelay(PyObject* args)
-{
- ShowDeprecationWarning("setDelay()", "the delay property");
- int delay;
-
- if(!PyArg_ParseTuple(args, "i:setDelay", &delay)) {
- return NULL;
- }
- if (delay < 0) {
- PyErr_SetString(PyExc_ValueError, "Delay cannot be negative");
- return NULL;
- }
- m_delay = delay;
- Py_RETURN_NONE;
-}
-
-const char SCA_DelaySensor::SetDuration_doc[] =
-"setDuration(duration)\n"
-"\t- duration: length of the ON period in number of frame after the initial off period\n"
-"\t 0 for no ON period\n"
-"\tSet the duration of the ON pulse after initial delay.\n"
-"\tIf > 0, a negative trigger is fired at the end of the ON pulse.\n";
-PyObject* SCA_DelaySensor::PySetDuration(PyObject* args)
-{
- ShowDeprecationWarning("setDuration()", "the duration property");
- int duration;
-
- if(!PyArg_ParseTuple(args, "i:setDuration", &duration)) {
- return NULL;
- }
- if (duration < 0) {
- PyErr_SetString(PyExc_ValueError, "Duration cannot be negative");
- return NULL;
- }
- m_duration = duration;
- Py_RETURN_NONE;
-}
-
-const char SCA_DelaySensor::SetRepeat_doc[] =
-"setRepeat(repeat)\n"
-"\t- repeat: 1 if the initial OFF-ON cycle should be repeated indefinately\n"
-"\t 0 if the initial OFF-ON cycle should run only once\n"
-"\tSet the sensor repeat mode\n";
-PyObject* SCA_DelaySensor::PySetRepeat(PyObject* args)
-{
- ShowDeprecationWarning("setRepeat()", "the repeat property");
- int repeat;
-
- if(!PyArg_ParseTuple(args, "i:setRepeat", &repeat)) {
- return NULL;
- }
- m_repeat = (repeat != 0);
- Py_RETURN_NONE;
-}
-
-const char SCA_DelaySensor::GetDelay_doc[] =
-"getDelay()\n"
-"\tReturn the delay parameter value\n";
-PyObject* SCA_DelaySensor::PyGetDelay()
-{
- ShowDeprecationWarning("getDelay()", "the delay property");
- return PyInt_FromLong(m_delay);
-}
-
-const char SCA_DelaySensor::GetDuration_doc[] =
-"getDuration()\n"
-"\tReturn the duration parameter value\n";
-PyObject* SCA_DelaySensor::PyGetDuration()
-{
- ShowDeprecationWarning("getDuration()", "the duration property");
- return PyInt_FromLong(m_duration);
-}
-
-const char SCA_DelaySensor::GetRepeat_doc[] =
-"getRepeat()\n"
-"\tReturn the repeat parameter value\n";
-PyObject* SCA_DelaySensor::PyGetRepeat()
-{
- ShowDeprecationWarning("getRepeat()", "the repeat property");
- return BoolToPyArg(m_repeat);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.h b/source/gameengine/GameLogic/SCA_DelaySensor.h
index 5ccb33f8a16..187a9179b5d 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.h
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.h
@@ -47,8 +47,7 @@ public:
SCA_IObject* gameobj,
int delay,
int duration,
- bool repeat,
- PyTypeObject* T =&Type);
+ bool repeat);
virtual ~SCA_DelaySensor();
virtual CValue* GetReplica();
virtual bool Evaluate();
@@ -59,19 +58,7 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
- /* setProperty */
- KX_PYMETHOD_DOC_VARARGS(SCA_DelaySensor,SetDelay);
- KX_PYMETHOD_DOC_VARARGS(SCA_DelaySensor,SetDuration);
- KX_PYMETHOD_DOC_VARARGS(SCA_DelaySensor,SetRepeat);
- /* getProperty */
- KX_PYMETHOD_DOC_NOARGS(SCA_DelaySensor,GetDelay);
- KX_PYMETHOD_DOC_NOARGS(SCA_DelaySensor,GetDuration);
- KX_PYMETHOD_DOC_NOARGS(SCA_DelaySensor,GetRepeat);
};
diff --git a/source/gameengine/GameLogic/SCA_EventManager.h b/source/gameengine/GameLogic/SCA_EventManager.h
index 5ff55849bfe..f77b115ee03 100644
--- a/source/gameengine/GameLogic/SCA_EventManager.h
+++ b/source/gameengine/GameLogic/SCA_EventManager.h
@@ -52,10 +52,10 @@ public:
TIME_EVENTMGR,
RANDOM_EVENTMGR,
RAY_EVENTMGR,
- RADAR_EVENTMGR,
NETWORK_EVENTMGR,
JOY_EVENTMGR,
- ACTUATOR_EVENTMGR
+ ACTUATOR_EVENTMGR,
+ BASIC_EVENTMGR
};
SCA_EventManager(EVENT_MANAGER_TYPE mgrtype);
@@ -71,6 +71,13 @@ public:
protected:
EVENT_MANAGER_TYPE m_mgrtype;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_EventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.cpp b/source/gameengine/GameLogic/SCA_ExpressionController.cpp
index 8e044b89c71..60969300474 100644
--- a/source/gameengine/GameLogic/SCA_ExpressionController.cpp
+++ b/source/gameengine/GameLogic/SCA_ExpressionController.cpp
@@ -46,9 +46,8 @@
/* ------------------------------------------------------------------------- */
SCA_ExpressionController::SCA_ExpressionController(SCA_IObject* gameobj,
- const STR_String& exprtext,
- PyTypeObject* T)
- :SCA_IController(gameobj,T),
+ const STR_String& exprtext)
+ :SCA_IController(gameobj),
m_exprText(exprtext),
m_exprCache(NULL)
{
diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.h b/source/gameengine/GameLogic/SCA_ExpressionController.h
index 6a34d7b2dff..4c1dfcb95a2 100644
--- a/source/gameengine/GameLogic/SCA_ExpressionController.h
+++ b/source/gameengine/GameLogic/SCA_ExpressionController.h
@@ -42,8 +42,7 @@ class SCA_ExpressionController : public SCA_IController
public:
SCA_ExpressionController(SCA_IObject* gameobj,
- const STR_String& exprtext,
- PyTypeObject* T=&Type );
+ const STR_String& exprtext);
virtual ~SCA_ExpressionController();
virtual CValue* GetReplica();
@@ -55,13 +54,12 @@ public:
*/
virtual void Delete();
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
-// virtual PyObject* py_getattro(PyObject *attr);
-// virtual PyObject* py_getattro_dict();
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_ExpressionController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_EXPRESSIONCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_IActuator.cpp b/source/gameengine/GameLogic/SCA_IActuator.cpp
index be7c2651686..0338213b3cf 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_IActuator.cpp
@@ -34,9 +34,9 @@
using namespace std;
-SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj,
- PyTypeObject* T) :
- SCA_ILogicBrick(gameobj,T),
+SCA_IActuator::SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type) :
+ SCA_ILogicBrick(gameobj),
+ m_type(type),
m_links(0),
m_posevent(false),
m_negevent(false)
diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h
index 27afcbc386b..2f1c04192ab 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.h
+++ b/source/gameengine/GameLogic/SCA_IActuator.h
@@ -41,6 +41,7 @@ class SCA_IActuator : public SCA_ILogicBrick
{
friend class SCA_LogicManager;
protected:
+ int m_type;
int m_links; // number of active links to controllers
// when 0, the actuator is automatically stopped
//std::vector<CValue*> m_events;
@@ -60,9 +61,33 @@ public:
/**
* This class also inherits the default copy constructors
*/
-
- SCA_IActuator(SCA_IObject* gameobj,
- PyTypeObject* T =&Type);
+ enum KX_ACTUATOR_TYPE {
+ KX_ACT_OBJECT,
+ KX_ACT_IPO,
+ KX_ACT_CAMERA,
+ KX_ACT_SOUND,
+ KX_ACT_PROPERTY,
+ KX_ACT_ADD_OBJECT,
+ KX_ACT_END_OBJECT,
+ KX_ACT_DYNAMIC,
+ KX_ACT_REPLACE_MESH,
+ KX_ACT_TRACKTO,
+ KX_ACT_CONSTRAINT,
+ KX_ACT_SCENE,
+ KX_ACT_RANDOM,
+ KX_ACT_MESSAGE,
+ KX_ACT_ACTION,
+ KX_ACT_CD,
+ KX_ACT_GAME,
+ KX_ACT_VISIBILITY,
+ KX_ACT_2DFILTER,
+ KX_ACT_PARENT,
+ KX_ACT_SHAPEACTION,
+ KX_ACT_STATE,
+ KX_ACT_ARMATURE,
+ };
+
+ SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type);
/**
* UnlinkObject(...)
@@ -128,6 +153,13 @@ public:
void IncLink() { m_links++; }
void DecLink();
bool IsNoLink() const { return !m_links; }
+ bool IsType(KX_ACTUATOR_TYPE type) { return m_type == type; }
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IActuator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_IACTUATOR
diff --git a/source/gameengine/GameLogic/SCA_IController.cpp b/source/gameengine/GameLogic/SCA_IController.cpp
index f2c3c83a2d9..7cfd2adc1d0 100644
--- a/source/gameengine/GameLogic/SCA_IController.cpp
+++ b/source/gameengine/GameLogic/SCA_IController.cpp
@@ -37,10 +37,9 @@
#include <config.h>
#endif
-SCA_IController::SCA_IController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_IController::SCA_IController(SCA_IObject* gameobj)
:
- SCA_ILogicBrick(gameobj,T),
+ SCA_ILogicBrick(gameobj),
m_statemask(0),
m_justActivated(false)
{
@@ -200,43 +199,28 @@ void SCA_IController::ApplyState(unsigned int state)
/* Python api */
PyTypeObject SCA_IController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "SCA_IController",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_IController::Parents[] = {
- &SCA_IController::Type,
- &CValue::Type,
- NULL
+ "SCA_IController",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_ILogicBrick::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_IController::Methods[] = {
- //Deprecated functions ------>
- {"getSensor", (PyCFunction) SCA_IController::sPyGetSensor, METH_O},
- {"getActuator", (PyCFunction) SCA_IController::sPyGetActuator, METH_O},
- {"getSensors", (PyCFunction) SCA_IController::sPyGetSensors, METH_NOARGS},
- {"getActuators", (PyCFunction) SCA_IController::sPyGetActuators, METH_NOARGS},
- {"getState", (PyCFunction) SCA_IController::sPyGetState, METH_NOARGS},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -248,105 +232,10 @@ PyAttributeDef SCA_IController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_IController::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ILogicBrick);
-}
-
-PyObject* SCA_IController::py_getattro_dict() {
- py_getattro_dict_up(SCA_ILogicBrick);
-}
-
-int SCA_IController::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ILogicBrick);
-}
-
-
-
-PyObject* SCA_IController::PyGetActuators()
-{
- ShowDeprecationWarning("getActuators()", "the actuators property");
-
- PyObject* resultlist = PyList_New(m_linkedactuators.size());
- for (unsigned int index=0;index<m_linkedactuators.size();index++)
- {
- PyList_SET_ITEM(resultlist,index, m_linkedactuators[index]->GetProxy());
- }
-
- return resultlist;
-}
-
-PyObject* SCA_IController::PyGetSensor(PyObject* value)
-{
- ShowDeprecationWarning("getSensor(string)", "the sensors[string] property");
-
- char *scriptArg = PyString_AsString(value);
- if (scriptArg==NULL) {
- PyErr_SetString(PyExc_TypeError, "controller.getSensor(string): Python Controller, expected a string (sensor name)");
- return NULL;
- }
-
- for (unsigned int index=0;index<m_linkedsensors.size();index++)
- {
- SCA_ISensor* sensor = m_linkedsensors[index];
- STR_String& realname = sensor->GetName();
- if (realname == scriptArg)
- {
- return sensor->GetProxy();
- }
- }
-
- PyErr_Format(PyExc_AttributeError, "controller.getSensor(string): Python Controller, unable to find requested sensor \"%s\"", scriptArg);
- return NULL;
-}
-
-PyObject* SCA_IController::PyGetActuator(PyObject* value)
-{
- ShowDeprecationWarning("getActuator(string)", "the actuators[string] property");
-
- char *scriptArg = PyString_AsString(value);
- if (scriptArg==NULL) {
- PyErr_SetString(PyExc_TypeError, "controller.getActuator(string): Python Controller, expected a string (actuator name)");
- return NULL;
- }
-
- for (unsigned int index=0;index<m_linkedactuators.size();index++)
- {
- SCA_IActuator* actua = m_linkedactuators[index];
- if (actua->GetName() == scriptArg)
- {
- return actua->GetProxy();
- }
- }
-
- PyErr_Format(PyExc_AttributeError, "controller.getActuator(string): Python Controller, unable to find requested actuator \"%s\"", scriptArg);
- return NULL;
-}
-
-PyObject* SCA_IController::PyGetSensors()
-{
- ShowDeprecationWarning("getSensors()", "the sensors property");
-
- PyObject* resultlist = PyList_New(m_linkedsensors.size());
- for (unsigned int index=0;index<m_linkedsensors.size();index++)
- {
- PyList_SET_ITEM(resultlist,index, m_linkedsensors[index]->GetProxy());
- }
-
- return resultlist;
-}
-
-PyObject* SCA_IController::PyGetState()
-{
- ShowDeprecationWarning("getState()", "the state property");
- return PyInt_FromLong(m_statemask);
-}
-
PyObject* SCA_IController::pyattr_get_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_IController* self= static_cast<SCA_IController*>(self_v);
- return PyInt_FromLong(self->m_statemask);
+ return PyLong_FromSsize_t(self->m_statemask);
}
PyObject* SCA_IController::pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
diff --git a/source/gameengine/GameLogic/SCA_IController.h b/source/gameengine/GameLogic/SCA_IController.h
index a52c57ab3ed..202921c6986 100644
--- a/source/gameengine/GameLogic/SCA_IController.h
+++ b/source/gameengine/GameLogic/SCA_IController.h
@@ -47,7 +47,7 @@ protected:
bool m_justActivated;
bool m_bookmark;
public:
- SCA_IController(SCA_IObject* gameobj,PyTypeObject* T);
+ SCA_IController(SCA_IObject* gameobj);
virtual ~SCA_IController();
virtual void Trigger(class SCA_LogicManager* logicmgr)=0;
void LinkToSensor(SCA_ISensor* sensor);
@@ -97,16 +97,6 @@ public:
}
}
}
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- KX_PYMETHOD_NOARGS(SCA_IController,GetSensors);
- KX_PYMETHOD_NOARGS(SCA_IController,GetActuators);
- KX_PYMETHOD_O(SCA_IController,GetSensor);
- KX_PYMETHOD_O(SCA_IController,GetActuator);
- KX_PYMETHOD_NOARGS(SCA_IController,GetState);
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);
diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.h b/source/gameengine/GameLogic/SCA_IInputDevice.h
index a0d77ed3c03..228d7684b0f 100644
--- a/source/gameengine/GameLogic/SCA_IInputDevice.h
+++ b/source/gameengine/GameLogic/SCA_IInputDevice.h
@@ -33,6 +33,10 @@
#ifndef KX_INPUTDEVICE_H
#define KX_INPUTDEVICE_H
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class SCA_InputEvent
{
@@ -302,6 +306,12 @@ public:
*/
virtual void NextFrame();
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_InputEvent"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //KX_INPUTDEVICE_H
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
index 2dc80f54568..f679d0ee487 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
@@ -35,10 +35,9 @@
SCA_LogicManager* SCA_ILogicBrick::m_sCurrentLogicManager = NULL;
-SCA_ILogicBrick::SCA_ILogicBrick(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_ILogicBrick::SCA_ILogicBrick(SCA_IObject* gameobj)
:
- CValue(T),
+ CValue(),
m_gameobj(gameobj),
m_Execute_Priority(0),
m_Execute_Ueber_Priority(0),
@@ -178,13 +177,7 @@ CValue* SCA_ILogicBrick::GetEvent()
/* python stuff */
PyTypeObject SCA_ILogicBrick::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_ILogicBrick",
sizeof(PyObjectPlus_Proxy),
0,
@@ -194,29 +187,18 @@ PyTypeObject SCA_ILogicBrick::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject SCA_ILogicBrick::Parents[] = {
- &SCA_ILogicBrick::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef SCA_ILogicBrick::Methods[] = {
- // --> Deprecated
- {"getOwner", (PyCFunction) SCA_ILogicBrick::sPyGetOwner, METH_NOARGS},
- {"getExecutePriority", (PyCFunction) SCA_ILogicBrick::sPyGetExecutePriority, METH_NOARGS},
- {"setExecutePriority", (PyCFunction) SCA_ILogicBrick::sPySetExecutePriority, METH_VARARGS},
- // <-- Deprecated
{NULL,NULL} //Sentinel
};
@@ -245,61 +227,6 @@ int SCA_ILogicBrick::CheckProperty(void *self, const PyAttributeDef *attrdef)
return 0;
}
-PyObject* SCA_ILogicBrick::py_getattro(PyObject *attr)
-{
- py_getattro_up(CValue);
-}
-
-PyObject* SCA_ILogicBrick::py_getattro_dict() {
- py_getattro_dict_up(CValue);
-}
-
-int SCA_ILogicBrick::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(CValue);
-}
-
-
-PyObject* SCA_ILogicBrick::PyGetOwner()
-{
- ShowDeprecationWarning("getOwner()", "the owner property");
-
- CValue* parent = GetParent();
- if (parent)
- {
- return parent->GetProxy();
- }
-
- printf("ERROR: Python scriptblock without owner\n");
- Py_RETURN_NONE; //Int_FromLong(IsPositiveTrigger());
-}
-
-
-
-PyObject* SCA_ILogicBrick::PySetExecutePriority(PyObject* args)
-{
- ShowDeprecationWarning("setExecutePriority()", "the executePriority property");
-
- int priority=0;
-
- if (!PyArg_ParseTuple(args, "i:setExecutePriority", &priority)) {
- return NULL;
- }
-
- m_Execute_Priority = priority;
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* SCA_ILogicBrick::PyGetExecutePriority()
-{
- ShowDeprecationWarning("getExecutePriority()", "the executePriority property");
- return PyInt_FromLong(m_Execute_Priority);
-}
-
-
/*Attribute functions */
PyObject* SCA_ILogicBrick::pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
@@ -326,5 +253,5 @@ bool SCA_ILogicBrick::PyArgToBool(int boolArg)
PyObject* SCA_ILogicBrick::BoolToPyArg(bool boolarg)
{
- return PyInt_FromLong(boolarg? KX_TRUE: KX_FALSE);
+ return PyLong_FromSsize_t(boolarg? KX_TRUE: KX_FALSE);
}
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.h b/source/gameengine/GameLogic/SCA_ILogicBrick.h
index 779e5397a6a..ac533335f0b 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.h
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.h
@@ -53,7 +53,7 @@ protected:
CValue* GetEvent();
public:
- SCA_ILogicBrick(SCA_IObject* gameobj,PyTypeObject* T );
+ SCA_ILogicBrick(SCA_IObject* gameobj);
virtual ~SCA_ILogicBrick();
void SetExecutePriority(int execute_Priority);
@@ -121,19 +121,11 @@ public:
}
virtual bool LessComparedTo(SCA_ILogicBrick* other);
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
static class SCA_LogicManager* m_sCurrentLogicManager;
// python methods
-
- KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetOwner);
- KX_PYMETHOD_VARARGS(SCA_ILogicBrick,SetExecutePriority);
- KX_PYMETHOD_NOARGS(SCA_ILogicBrick,GetExecutePriority);
static PyObject* pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/GameLogic/SCA_IObject.cpp b/source/gameengine/GameLogic/SCA_IObject.cpp
index 9876f2512c0..fbf66b64d08 100644
--- a/source/gameengine/GameLogic/SCA_IObject.cpp
+++ b/source/gameengine/GameLogic/SCA_IObject.cpp
@@ -26,6 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
#include <iostream>
+#include <algorithm>
#include "SCA_IObject.h"
#include "SCA_ISensor.h"
@@ -41,8 +42,11 @@
MT_Point3 SCA_IObject::m_sDummy=MT_Point3(0,0,0);
SG_QList SCA_IObject::m_activeBookmarkedControllers;
-SCA_IObject::SCA_IObject(PyTypeObject* T): CValue(T), m_initState(0), m_state(0), m_firstState(NULL)
-
+SCA_IObject::SCA_IObject():
+ CValue(),
+ m_initState(0),
+ m_state(0),
+ m_firstState(NULL)
{
m_suspended = false;
}
@@ -73,6 +77,12 @@ SCA_IObject::~SCA_IObject()
(*ita)->Delete();
}
+ SCA_ObjectList::iterator ito;
+ for (ito = m_registeredObjects.begin(); !(ito==m_registeredObjects.end()); ++ito)
+ {
+ (*ito)->UnlinkObject(this);
+ }
+
//T_InterpolatorList::iterator i;
//for (i = m_interpolators.begin(); !(i == m_interpolators.end()); ++i) {
// delete *i;
@@ -120,6 +130,26 @@ void SCA_IObject::UnregisterActuator(SCA_IActuator* act)
}
}
+void SCA_IObject::RegisterObject(SCA_IObject* obj)
+{
+ // one object may be registered multiple times via constraint target
+ // store multiple reference, this will serve as registration counter
+ m_registeredObjects.push_back(obj);
+}
+
+void SCA_IObject::UnregisterObject(SCA_IObject* obj)
+{
+ SCA_ObjectList::iterator ito;
+ for (ito = m_registeredObjects.begin(); ito != m_registeredObjects.end(); ++ito)
+ {
+ if ((*ito) == obj) {
+ (*ito) = m_registeredObjects.back();
+ m_registeredObjects.pop_back();
+ break;
+ }
+ }
+}
+
void SCA_IObject::ReParentLogic()
{
SCA_ActuatorList& oldactuators = GetActuators();
@@ -162,7 +192,7 @@ void SCA_IObject::ReParentLogic()
// a new object cannot be client of any actuator
m_registeredActuators.clear();
-
+ m_registeredObjects.clear();
}
@@ -218,51 +248,6 @@ SCA_IActuator* SCA_IObject::FindActuator(const STR_String& actuatorname)
}
-
-#if 0
-const MT_Point3& SCA_IObject::ConvertPythonPylist(PyObject* pylist)
-{
- bool error = false;
- m_sDummy = MT_Vector3(0,0,0);
- if (pylist->ob_type == &CListValue::Type)
- {
- CListValue* listval = (CListValue*) pylist;
- int numelem = listval->GetCount();
- if ( numelem <= 3)
- {
- int index;
- for (index = 0;index<numelem;index++)
- {
- m_sDummy[index] = listval->GetValue(index)->GetNumber();
- }
- } else
- {
- error = true;
- }
-
- } else
- {
-
- // assert the list is long enough...
- int numitems = PyList_Size(pylist);
- if (numitems <= 3)
- {
- int index;
- for (index=0;index<numitems;index++)
- {
- m_sDummy[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index));
- }
- }
- else
- {
- error = true;
- }
-
- }
- return m_sDummy;
-}
-#endif
-
void SCA_IObject::Suspend()
{
if ((!m_ignore_activity_culling)
@@ -330,13 +315,7 @@ void SCA_IObject::SetState(unsigned int state)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_IObject::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_IObject",
sizeof(PyObjectPlus_Proxy),
0,
@@ -346,23 +325,17 @@ PyTypeObject SCA_IObject::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject SCA_IObject::Parents[] = {
- &SCA_IObject::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef SCA_IObject::Methods[] = {
//{"setOrientation", (PyCFunction) SCA_IObject::sPySetOrientation, METH_VARARGS},
//{"getOrientation", (PyCFunction) SCA_IObject::sPyGetOrientation, METH_VARARGS},
@@ -372,12 +345,3 @@ PyMethodDef SCA_IObject::Methods[] = {
PyAttributeDef SCA_IObject::Attributes[] = {
{ NULL } //Sentinel
};
-
-
-PyObject* SCA_IObject::py_getattro(PyObject *attr) {
- py_getattro_up(CValue);
-}
-
-PyObject* SCA_IObject::py_getattro_dict() {
- py_getattro_dict_up(CValue);
-}
diff --git a/source/gameengine/GameLogic/SCA_IObject.h b/source/gameengine/GameLogic/SCA_IObject.h
index eae427741ca..64ea0a76af1 100644
--- a/source/gameengine/GameLogic/SCA_IObject.h
+++ b/source/gameengine/GameLogic/SCA_IObject.h
@@ -36,6 +36,7 @@
#include "Value.h"
#include <vector>
+class SCA_IObject;
class SCA_ISensor;
class SCA_IController;
class SCA_IActuator;
@@ -45,6 +46,7 @@ template<class T> T PyVecTo(PyObject*);
typedef std::vector<SCA_ISensor *> SCA_SensorList;
typedef std::vector<SCA_IController *> SCA_ControllerList;
typedef std::vector<SCA_IActuator *> SCA_ActuatorList;
+typedef std::vector<SCA_IObject *> SCA_ObjectList;
class SCA_IObject : public CValue
{
@@ -59,6 +61,7 @@ protected:
SCA_ControllerList m_controllers;
SCA_ActuatorList m_actuators;
SCA_ActuatorList m_registeredActuators; // actuators that use a pointer to this object
+ SCA_ObjectList m_registeredObjects; // objects that hold reference to this object
// SG_Dlist: element of objects with active actuators
// Head: SCA_LogicManager::m_activeActuators
@@ -105,7 +108,7 @@ protected:
public:
- SCA_IObject(PyTypeObject* T=&Type);
+ SCA_IObject();
virtual ~SCA_IObject();
SCA_ControllerList& GetControllers()
@@ -143,13 +146,22 @@ public:
void RegisterActuator(SCA_IActuator* act);
void UnregisterActuator(SCA_IActuator* act);
+ void RegisterObject(SCA_IObject* objs);
+ void UnregisterObject(SCA_IObject* objs);
+ /**
+ * UnlinkObject(...)
+ * this object is informed that one of the object to which it holds a reference is deleted
+ * returns true if there was indeed a reference.
+ */
+ virtual bool UnlinkObject(SCA_IObject* clientobj) { return false; }
+
SCA_ISensor* FindSensor(const STR_String& sensorname);
SCA_IActuator* FindActuator(const STR_String& actuatorname);
SCA_IController* FindController(const STR_String& controllername);
void SetCurrentTime(float currentTime) {}
- void ReParentLogic();
+ virtual void ReParentLogic();
/**
* Set whether or not to ignore activity culling requests
@@ -199,15 +211,12 @@ public:
unsigned int GetState(void) { return m_state; }
// const class MT_Point3& ConvertPythonPylist(PyObject* pylist);
-
- // here come the python forwarded methods
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
virtual int GetGameObjectType() {return -1;}
typedef enum ObjectTypes {
OBJ_ARMATURE=0,
+ OBJ_CAMERA=1,
}ObjectTypes;
};
diff --git a/source/gameengine/GameLogic/SCA_IScene.h b/source/gameengine/GameLogic/SCA_IScene.h
index b641efc6ee1..ced9ca94cec 100644
--- a/source/gameengine/GameLogic/SCA_IScene.h
+++ b/source/gameengine/GameLogic/SCA_IScene.h
@@ -33,6 +33,10 @@
#include "STR_String.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct SCA_DebugProp
{
class CValue* m_obj;
@@ -55,11 +59,18 @@ public:
//virtual void DelayedReleaseObject(class CValue* gameobj)=0;
virtual void ReplaceMesh(class CValue* gameobj,
- void* meshobj)=0;
+ void* meshobj, bool use_gfx, bool use_phys)=0;
std::vector<SCA_DebugProp*>& GetDebugProperties();
void AddDebugProperty(class CValue* debugprop,
const STR_String &name);
void RemoveAllDebugProperties();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_IScene"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_ISCENE_H
diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp
index 2783bf14600..497a5d1095a 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -50,9 +50,8 @@ void SCA_ISensor::ReParent(SCA_IObject* parent)
SCA_ISensor::SCA_ISensor(SCA_IObject* gameobj,
- class SCA_EventManager* eventmgr,
- PyTypeObject* T ) :
- SCA_ILogicBrick(gameobj,T)
+ class SCA_EventManager* eventmgr) :
+ SCA_ILogicBrick(gameobj)
{
m_links = 0;
m_suspended = false;
@@ -293,171 +292,6 @@ void SCA_ISensor::Activate(class SCA_LogicManager* logicmgr)
/* Python Functions */
/* ----------------------------------------------- */
-//Deprecated Functions ------>
-const char SCA_ISensor::IsPositive_doc[] =
-"isPositive()\n"
-"\tReturns whether the sensor is in an active state.\n";
-PyObject* SCA_ISensor::PyIsPositive()
-{
- ShowDeprecationWarning("isPositive()", "the read-only positive property");
- int retval = GetState();
- return PyInt_FromLong(retval);
-}
-
-const char SCA_ISensor::IsTriggered_doc[] =
-"isTriggered()\n"
-"\tReturns whether the sensor has triggered the current controller.\n";
-PyObject* SCA_ISensor::PyIsTriggered()
-{
- ShowDeprecationWarning("isTriggered()", "the read-only triggered property");
- // check with the current controller
- int retval = 0;
- if (SCA_PythonController::m_sCurrentController)
- retval = SCA_PythonController::m_sCurrentController->IsTriggered(this);
- return PyInt_FromLong(retval);
-}
-
-/**
- * getUsePulseMode: getter for the pulse mode (KX_TRUE = on)
- */
-const char SCA_ISensor::GetUsePosPulseMode_doc[] =
-"getUsePosPulseMode()\n"
-"\tReturns whether positive pulse mode is active.\n";
-PyObject* SCA_ISensor::PyGetUsePosPulseMode()
-{
- ShowDeprecationWarning("getUsePosPulseMode()", "the usePosPulseMode property");
- return BoolToPyArg(m_pos_pulsemode);
-}
-
-/**
- * setUsePulseMode: setter for the pulse mode (KX_TRUE = on)
- */
-const char SCA_ISensor::SetUsePosPulseMode_doc[] =
-"setUsePosPulseMode(pulse?)\n"
-"\t - pulse? : Pulse when a positive event occurs?\n"
-"\t (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to do pulsing when positive pulses occur.\n";
-PyObject* SCA_ISensor::PySetUsePosPulseMode(PyObject* args)
-{
- ShowDeprecationWarning("setUsePosPulseMode()", "the usePosPulseMode property");
- int pyarg = 0;
- if(!PyArg_ParseTuple(args, "i:setUsePosPulseMode", &pyarg)) { return NULL; }
- m_pos_pulsemode = PyArgToBool(pyarg);
- Py_RETURN_NONE;
-}
-
-/**
- * getFrequency: getter for the pulse mode interval
- */
-const char SCA_ISensor::GetFrequency_doc[] =
-"getFrequency()\n"
-"\tReturns the frequency of the updates in pulse mode.\n" ;
-PyObject* SCA_ISensor::PyGetFrequency()
-{
- ShowDeprecationWarning("getFrequency()", "the frequency property");
- return PyInt_FromLong(m_pulse_frequency);
-}
-
-/**
- * setFrequency: setter for the pulse mode (KX_TRUE = on)
- */
-const char SCA_ISensor::SetFrequency_doc[] =
-"setFrequency(pulse_frequency)\n"
-"\t- pulse_frequency: The frequency of the updates in pulse mode (integer)"
-"\tSet the frequency of the updates in pulse mode.\n"
-"\tIf the frequency is negative, it is set to 0.\n" ;
-PyObject* SCA_ISensor::PySetFrequency(PyObject* args)
-{
- ShowDeprecationWarning("setFrequency()", "the frequency property");
- int pulse_frequencyArg = 0;
-
- if(!PyArg_ParseTuple(args, "i:setFrequency", &pulse_frequencyArg)) {
- return NULL;
- }
-
- /* We can do three things here: clip, ignore and raise an exception. */
- /* Exceptions don't work yet, ignoring is not desirable now... */
- if (pulse_frequencyArg < 0) {
- pulse_frequencyArg = 0;
- };
- m_pulse_frequency = pulse_frequencyArg;
-
- Py_RETURN_NONE;
-}
-
-
-const char SCA_ISensor::GetInvert_doc[] =
-"getInvert()\n"
-"\tReturns whether or not pulses from this sensor are inverted.\n" ;
-PyObject* SCA_ISensor::PyGetInvert()
-{
- ShowDeprecationWarning("getInvert()", "the invert property");
- return BoolToPyArg(m_invert);
-}
-
-const char SCA_ISensor::SetInvert_doc[] =
-"setInvert(invert?)\n"
-"\t- invert?: Invert the event-values? (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to invert pulses.\n";
-PyObject* SCA_ISensor::PySetInvert(PyObject* args)
-{
- ShowDeprecationWarning("setInvert()", "the invert property");
- int pyarg = 0;
- if(!PyArg_ParseTuple(args, "i:setInvert", &pyarg)) { return NULL; }
- m_invert = PyArgToBool(pyarg);
- Py_RETURN_NONE;
-}
-
-const char SCA_ISensor::GetLevel_doc[] =
-"getLevel()\n"
-"\tReturns whether this sensor is a level detector or a edge detector.\n"
-"\tIt makes a difference only in case of logic state transition (state actuator).\n"
-"\tA level detector will immediately generate a pulse, negative or positive\n"
-"\tdepending on the sensor condition, as soon as the state is activated.\n"
-"\tA edge detector will wait for a state change before generating a pulse.\n";
-PyObject* SCA_ISensor::PyGetLevel()
-{
- ShowDeprecationWarning("getLevel()", "the level property");
- return BoolToPyArg(m_level);
-}
-
-const char SCA_ISensor::SetLevel_doc[] =
-"setLevel(level?)\n"
-"\t- level?: Detect level instead of edge? (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to detect level or edge transition when entering a state.\n";
-PyObject* SCA_ISensor::PySetLevel(PyObject* args)
-{
- ShowDeprecationWarning("setLevel()", "the level property");
- int pyarg = 0;
- if(!PyArg_ParseTuple(args, "i:setLevel", &pyarg)) { return NULL; }
- m_level = PyArgToBool(pyarg);
- Py_RETURN_NONE;
-}
-
-const char SCA_ISensor::GetUseNegPulseMode_doc[] =
-"getUseNegPulseMode()\n"
-"\tReturns whether negative pulse mode is active.\n";
-PyObject* SCA_ISensor::PyGetUseNegPulseMode()
-{
- ShowDeprecationWarning("getUseNegPulseMode()", "the useNegPulseMode property");
- return BoolToPyArg(m_neg_pulsemode);
-}
-
-const char SCA_ISensor::SetUseNegPulseMode_doc[] =
-"setUseNegPulseMode(pulse?)\n"
-"\t - pulse? : Pulse when a negative event occurs?\n"
-"\t (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to do pulsing when negative pulses occur.\n";
-PyObject* SCA_ISensor::PySetUseNegPulseMode(PyObject* args)
-{
- ShowDeprecationWarning("setUseNegPulseMode()", "the useNegPulseMode property");
- int pyarg = 0;
- if(!PyArg_ParseTuple(args, "i:setUseNegPulseMode", &pyarg)) { return NULL; }
- m_neg_pulsemode = PyArgToBool(pyarg);
- Py_RETURN_NONE;
-}
-//<------Deprecated
-
KX_PYMETHODDEF_DOC_NOARGS(SCA_ISensor, reset,
"reset()\n"
"\tReset sensor internal state, effect depends on the type of sensor and settings.\n"
@@ -473,13 +307,7 @@ KX_PYMETHODDEF_DOC_NOARGS(SCA_ISensor, reset,
/* ----------------------------------------------- */
PyTypeObject SCA_ISensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_ISensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -489,46 +317,18 @@ PyTypeObject SCA_ISensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_ISensor::Parents[] = {
- &SCA_ISensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
+
PyMethodDef SCA_ISensor::Methods[] = {
- //Deprecated functions ----->
- {"isPositive", (PyCFunction) SCA_ISensor::sPyIsPositive,
- METH_NOARGS, (PY_METHODCHAR)IsPositive_doc},
- {"isTriggered", (PyCFunction) SCA_ISensor::sPyIsTriggered,
- METH_VARARGS, (PY_METHODCHAR)IsTriggered_doc},
- {"getUsePosPulseMode", (PyCFunction) SCA_ISensor::sPyGetUsePosPulseMode,
- METH_NOARGS, (PY_METHODCHAR)GetUsePosPulseMode_doc},
- {"setUsePosPulseMode", (PyCFunction) SCA_ISensor::sPySetUsePosPulseMode,
- METH_VARARGS, (PY_METHODCHAR)SetUsePosPulseMode_doc},
- {"getFrequency", (PyCFunction) SCA_ISensor::sPyGetFrequency,
- METH_NOARGS, (PY_METHODCHAR)GetFrequency_doc},
- {"setFrequency", (PyCFunction) SCA_ISensor::sPySetFrequency,
- METH_VARARGS, (PY_METHODCHAR)SetFrequency_doc},
- {"getUseNegPulseMode", (PyCFunction) SCA_ISensor::sPyGetUseNegPulseMode,
- METH_NOARGS, (PY_METHODCHAR)GetUseNegPulseMode_doc},
- {"setUseNegPulseMode", (PyCFunction) SCA_ISensor::sPySetUseNegPulseMode,
- METH_VARARGS, (PY_METHODCHAR)SetUseNegPulseMode_doc},
- {"getInvert", (PyCFunction) SCA_ISensor::sPyGetInvert,
- METH_NOARGS, (PY_METHODCHAR)GetInvert_doc},
- {"setInvert", (PyCFunction) SCA_ISensor::sPySetInvert,
- METH_VARARGS, (PY_METHODCHAR)SetInvert_doc},
- {"getLevel", (PyCFunction) SCA_ISensor::sPyGetLevel,
- METH_NOARGS, (PY_METHODCHAR)GetLevel_doc},
- {"setLevel", (PyCFunction) SCA_ISensor::sPySetLevel,
- METH_VARARGS, (PY_METHODCHAR)SetLevel_doc},
- //<----- Deprecated
KX_PYMETHODTABLE_NOARGS(SCA_ISensor, reset),
{NULL,NULL} //Sentinel
};
@@ -548,19 +348,6 @@ PyAttributeDef SCA_ISensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_ISensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ILogicBrick);
-}
-
-PyObject* SCA_ISensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ILogicBrick);
-}
-
-int SCA_ISensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ILogicBrick);
-}
PyObject* SCA_ISensor::pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
@@ -568,13 +355,13 @@ PyObject* SCA_ISensor::pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_D
int retval = 0;
if (SCA_PythonController::m_sCurrentController)
retval = SCA_PythonController::m_sCurrentController->IsTriggered(self);
- return PyInt_FromLong(retval);
+ return PyLong_FromSsize_t(retval);
}
PyObject* SCA_ISensor::pyattr_get_positive(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_ISensor* self= static_cast<SCA_ISensor*>(self_v);
- return PyInt_FromLong(self->GetState());
+ return PyLong_FromSsize_t(self->GetState());
}
int SCA_ISensor::pyattr_check_level(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
diff --git a/source/gameengine/GameLogic/SCA_ISensor.h b/source/gameengine/GameLogic/SCA_ISensor.h
index 9bbd6ed41e4..742b05bd88b 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.h
+++ b/source/gameengine/GameLogic/SCA_ISensor.h
@@ -101,8 +101,7 @@ public:
};
SCA_ISensor(SCA_IObject* gameobj,
- class SCA_EventManager* eventmgr,
- PyTypeObject* T );;
+ class SCA_EventManager* eventmgr);;
~SCA_ISensor();
virtual void ReParent(SCA_IObject* parent);
@@ -173,25 +172,6 @@ public:
{ return !m_links; }
/* Python functions: */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- //Deprecated functions ----->
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsPositive);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,IsTriggered);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUsePosPulseMode);
- KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetUsePosPulseMode);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetFrequency);
- KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetFrequency);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetUseNegPulseMode);
- KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetUseNegPulseMode);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetInvert);
- KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetInvert);
- KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,GetLevel);
- KX_PYMETHOD_DOC_VARARGS(SCA_ISensor,SetLevel);
- //<------
KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,reset);
static PyObject* pyattr_get_triggered(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.h b/source/gameengine/GameLogic/SCA_JoystickManager.h
index d3a7ac95bea..be55e95b033 100644
--- a/source/gameengine/GameLogic/SCA_JoystickManager.h
+++ b/source/gameengine/GameLogic/SCA_JoystickManager.h
@@ -47,6 +47,12 @@ public:
virtual void NextFrame(double curtime,double deltatime);
SCA_Joystick* GetJoystickDevice(short int joyindex);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_JoystickManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
index 336529667d7..4936b380352 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -46,10 +46,8 @@ SCA_JoystickSensor::SCA_JoystickSensor(class SCA_JoystickManager* eventmgr,
short int joymode,
int axis, int axisf,int prec,
int button,
- int hat, int hatf, bool allevents,
- PyTypeObject* T )
- :SCA_ISensor(gameobj,eventmgr,T),
- m_pJoystickMgr(eventmgr),
+ int hat, int hatf, bool allevents)
+ :SCA_ISensor(gameobj,eventmgr),
m_axis(axis),
m_axisf(axisf),
m_button(button),
@@ -104,7 +102,7 @@ bool SCA_JoystickSensor::IsPositiveTrigger()
bool SCA_JoystickSensor::Evaluate()
{
- SCA_Joystick *js = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
+ SCA_Joystick *js = ((SCA_JoystickManager *)m_eventmgr)->GetJoystickDevice(m_joyindex);
bool result = false;
bool reset = m_reset && m_level;
@@ -253,60 +251,30 @@ bool SCA_JoystickSensor::isValid(SCA_JoystickSensor::KX_JOYSENSORMODE m)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_JoystickSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "SCA_JoystickSensor",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
+ "SCA_JoystickSensor",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_ISensor::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-PyParentObject SCA_JoystickSensor::Parents[] = {
- &SCA_JoystickSensor::Type,
- &SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
-};
-
-
PyMethodDef SCA_JoystickSensor::Methods[] = {
- //Deprecated functions ------>
- {"getIndex", (PyCFunction) SCA_JoystickSensor::sPyGetIndex, METH_NOARGS, (PY_METHODCHAR)GetIndex_doc},
- {"setIndex", (PyCFunction) SCA_JoystickSensor::sPySetIndex, METH_O, (PY_METHODCHAR)SetIndex_doc},
- {"getAxis", (PyCFunction) SCA_JoystickSensor::sPyGetAxis, METH_NOARGS, (PY_METHODCHAR)GetAxis_doc},
- {"setAxis", (PyCFunction) SCA_JoystickSensor::sPySetAxis, METH_VARARGS, (PY_METHODCHAR)SetAxis_doc},
- {"getAxisValue", (PyCFunction) SCA_JoystickSensor::sPyGetAxisValue, METH_NOARGS, (PY_METHODCHAR)GetAxisValue_doc},
- {"getThreshold", (PyCFunction) SCA_JoystickSensor::sPyGetThreshold, METH_NOARGS, (PY_METHODCHAR)GetThreshold_doc},
- {"setThreshold", (PyCFunction) SCA_JoystickSensor::sPySetThreshold, METH_VARARGS, (PY_METHODCHAR)SetThreshold_doc},
- {"getButton", (PyCFunction) SCA_JoystickSensor::sPyGetButton, METH_NOARGS, (PY_METHODCHAR)GetButton_doc},
- {"setButton", (PyCFunction) SCA_JoystickSensor::sPySetButton, METH_O, (PY_METHODCHAR)SetButton_doc},
- {"getHat", (PyCFunction) SCA_JoystickSensor::sPyGetHat, METH_NOARGS, (PY_METHODCHAR)GetHat_doc},
- {"setHat", (PyCFunction) SCA_JoystickSensor::sPySetHat, METH_VARARGS, (PY_METHODCHAR)SetHat_doc},
- {"getNumAxes", (PyCFunction) SCA_JoystickSensor::sPyNumberOfAxes, METH_NOARGS, (PY_METHODCHAR)NumberOfAxes_doc},
- {"getNumButtons",(PyCFunction) SCA_JoystickSensor::sPyNumberOfButtons,METH_NOARGS, (PY_METHODCHAR)NumberOfButtons_doc},
- {"getNumHats", (PyCFunction) SCA_JoystickSensor::sPyNumberOfHats, METH_NOARGS, (PY_METHODCHAR)NumberOfHats_doc},
- {"isConnected", (PyCFunction) SCA_JoystickSensor::sPyConnected, METH_NOARGS, (PY_METHODCHAR)Connected_doc},
- {"getButtonValue",(PyCFunction) SCA_JoystickSensor::sPyGetButtonValue, METH_NOARGS,(PY_METHODCHAR)GetButtonValue_doc},
- //<----- Deprecated
- {"getButtonActiveList",(PyCFunction) SCA_JoystickSensor::sPyGetButtonActiveList, METH_NOARGS,(PY_METHODCHAR)GetButtonActiveList_doc},
- {"getButtonStatus",(PyCFunction) SCA_JoystickSensor::sPyGetButtonStatus, METH_VARARGS,(PY_METHODCHAR)GetButtonStatus_doc},
+ {"getButtonActiveList",(PyCFunction) SCA_JoystickSensor::sPyGetButtonActiveList, METH_NOARGS,(const char *)GetButtonActiveList_doc},
+ {"getButtonStatus",(PyCFunction) SCA_JoystickSensor::sPyGetButtonStatus, METH_VARARGS,(const char *)GetButtonStatus_doc},
{NULL,NULL} //Sentinel
};
@@ -328,158 +296,12 @@ PyAttributeDef SCA_JoystickSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_JoystickSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_JoystickSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_JoystickSensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ISensor);
-}
-
-
-/* get index ---------------------------------------------------------- */
-const char SCA_JoystickSensor::GetIndex_doc[] =
-"getIndex\n"
-"\tReturns the joystick index to use.\n";
-PyObject* SCA_JoystickSensor::PyGetIndex( ) {
- ShowDeprecationWarning("getIndex()", "the index property");
- return PyInt_FromLong(m_joyindex);
-}
-
-
-/* set index ---------------------------------------------------------- */
-const char SCA_JoystickSensor::SetIndex_doc[] =
-"setIndex\n"
-"\tSets the joystick index to use.\n";
-PyObject* SCA_JoystickSensor::PySetIndex( PyObject* value ) {
- ShowDeprecationWarning("setIndex()", "the index property");
- int index = PyInt_AsLong( value ); /* -1 on error, will raise an error in this case */
- if (index < 0 || index >= JOYINDEX_MAX) {
- PyErr_SetString(PyExc_ValueError, "joystick index out of range or not an int");
- return NULL;
- }
-
- m_joyindex = index;
- Py_RETURN_NONE;
-}
-
-/* get axis ---------------------------------------------------------- */
-const char SCA_JoystickSensor::GetAxis_doc[] =
-"getAxis\n"
-"\tReturns the current axis this sensor reacts to.\n";
-PyObject* SCA_JoystickSensor::PyGetAxis( ) {
- ShowDeprecationWarning("getAxis()", "the axis property");
- return Py_BuildValue("[ii]",m_axis, m_axisf);
-}
-
-
-/* set axis ---------------------------------------------------------- */
-const char SCA_JoystickSensor::SetAxis_doc[] =
-"setAxis\n"
-"\tSets the current axis this sensor reacts to.\n";
-PyObject* SCA_JoystickSensor::PySetAxis( PyObject* args ) {
- ShowDeprecationWarning("setAxis()", "the axis property");
-
- int axis,axisflag;
- if(!PyArg_ParseTuple(args, "ii:setAxis", &axis, &axisflag)){
- return NULL;
- }
- m_axis = axis;
- m_axisf = axisflag;
-
- CheckAxis((void *)this, NULL); /* clamp values */
- Py_RETURN_NONE;
-}
-
-
-/* get axis value ----------------------------------------------------- */
-const char SCA_JoystickSensor::GetAxisValue_doc[] =
-"getAxisValue\n"
-"\tReturns a list of the values for the current state of each axis.\n";
-PyObject* SCA_JoystickSensor::PyGetAxisValue( ) {
- ShowDeprecationWarning("getAxisValue()", "the axisPosition property");
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
-
- int axis_index= joy->GetNumberOfAxes();
- PyObject *list= PyList_New(axis_index);
-
- while(axis_index--) {
- PyList_SET_ITEM(list, axis_index, PyInt_FromLong(joy->GetAxisPosition(axis_index)));
- }
-
- return list;
-}
-
-
-/* get threshold ----------------------------------------------------- */
-const char SCA_JoystickSensor::GetThreshold_doc[] =
-"getThreshold\n"
-"\tReturns the threshold of the axis.\n";
-PyObject* SCA_JoystickSensor::PyGetThreshold( ) {
- ShowDeprecationWarning("getThreshold()", "the threshold property");
- return PyInt_FromLong(m_precision);
-}
-
-
-/* set threshold ----------------------------------------------------- */
-const char SCA_JoystickSensor::SetThreshold_doc[] =
-"setThreshold\n"
-"\tSets the threshold of the axis.\n";
-PyObject* SCA_JoystickSensor::PySetThreshold( PyObject* args ) {
- ShowDeprecationWarning("setThreshold()", "the threshold property");
- int thresh;
- if(!PyArg_ParseTuple(args, "i:setThreshold", &thresh)){
- return NULL;
- }
- m_precision = thresh;
- Py_RETURN_NONE;
-}
-
-/* get button -------------------------------------------------------- */
-const char SCA_JoystickSensor::GetButton_doc[] =
-"getButton\n"
-"\tReturns the current button this sensor is checking.\n";
-PyObject* SCA_JoystickSensor::PyGetButton( ) {
- ShowDeprecationWarning("getButton()", "the button property");
- return PyInt_FromLong(m_button);
-}
-
-/* set button -------------------------------------------------------- */
-const char SCA_JoystickSensor::SetButton_doc[] =
-"setButton\n"
-"\tSets the button the sensor reacts to.\n";
-PyObject* SCA_JoystickSensor::PySetButton( PyObject* value ) {
- ShowDeprecationWarning("setButton()", "the button property");
- int button = PyInt_AsLong(value);
- if(button==-1 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_ValueError, "expected an int");
- return NULL;
- }
- m_button = button;
- Py_RETURN_NONE;
-}
-
-/* get button value -------------------------------------------------- */
-const char SCA_JoystickSensor::GetButtonValue_doc[] =
-"getButtonValue\n"
-"\tReturns a list containing the indicies of the current pressed state of each button.\n";
-PyObject* SCA_JoystickSensor::PyGetButtonValue( ) {
- ShowDeprecationWarning("getButtonValue()", "getButtonActiveList");
- return PyGetButtonActiveList( );
-}
-
/* get button active list -------------------------------------------------- */
const char SCA_JoystickSensor::GetButtonActiveList_doc[] =
"getButtonActiveList\n"
"\tReturns a list containing the indicies of the button currently pressed.\n";
PyObject* SCA_JoystickSensor::PyGetButtonActiveList( ) {
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)m_eventmgr)->GetJoystickDevice(m_joyindex);
PyObject *ls = PyList_New(0);
PyObject *value;
int i;
@@ -487,7 +309,7 @@ PyObject* SCA_JoystickSensor::PyGetButtonActiveList( ) {
if(joy) {
for (i=0; i < joy->GetNumberOfButtons(); i++) {
if (joy->aButtonPressIsPositive(i)) {
- value = PyInt_FromLong(i);
+ value = PyLong_FromSsize_t(i);
PyList_Append(ls, value);
Py_DECREF(value);
}
@@ -501,7 +323,7 @@ const char SCA_JoystickSensor::GetButtonStatus_doc[] =
"getButtonStatus(buttonIndex)\n"
"\tReturns a bool of the current pressed state of the specified button.\n";
PyObject* SCA_JoystickSensor::PyGetButtonStatus( PyObject* args ) {
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)m_eventmgr)->GetJoystickDevice(m_joyindex);
int index;
if(!PyArg_ParseTuple(args, "i:getButtonStatus", &index)){
@@ -513,85 +335,16 @@ PyObject* SCA_JoystickSensor::PyGetButtonStatus( PyObject* args ) {
return PyBool_FromLong(0);
}
-/* get hat ----------------------------------------------------------- */
-const char SCA_JoystickSensor::GetHat_doc[] =
-"getHat\n"
-"\tReturns the current direction of the hat.\n";
-PyObject* SCA_JoystickSensor::PyGetHat( ) {
- ShowDeprecationWarning("getHat()", "the hat property");
- return Py_BuildValue("[ii]",m_hat, m_hatf);
-}
-
-
-/* set hat ----------------------------------------------------------- */
-const char SCA_JoystickSensor::SetHat_doc[] =
-"setHat\n"
-"\tSets the hat the sensor reacts to.\n";
-PyObject* SCA_JoystickSensor::PySetHat( PyObject* args ) {
- ShowDeprecationWarning("setHat()", "the hat property");
- int hat,hatflag;
- if(!PyArg_ParseTuple(args, "ii:setHat", &hat, &hatflag)){
- return NULL;
- }
- m_hat = hat;
- m_hatf = hatflag;
-
- CheckHat((void *)this, NULL); /* clamp values */
- Py_RETURN_NONE;
-}
-
-
-/* get # of ----------------------------------------------------- */
-const char SCA_JoystickSensor::NumberOfAxes_doc[] =
-"getNumAxes\n"
-"\tReturns the number of axes .\n";
-PyObject* SCA_JoystickSensor::PyNumberOfAxes( ) {
- ShowDeprecationWarning("getNumAxes()", "the numAxis property");
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
- // when the joystick is null their is 0 exis still. dumb but scripters should use isConnected()
- return PyInt_FromLong( joy ? joy->GetNumberOfAxes() : 0 );
-}
-
-
-const char SCA_JoystickSensor::NumberOfButtons_doc[] =
-"getNumButtons\n"
-"\tReturns the number of buttons .\n";
-PyObject* SCA_JoystickSensor::PyNumberOfButtons( ) {
- ShowDeprecationWarning("getNumButtons()", "the numButtons property");
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
- return PyInt_FromLong( joy ? joy->GetNumberOfButtons() : 0 );
-}
-
-
-const char SCA_JoystickSensor::NumberOfHats_doc[] =
-"getNumHats\n"
-"\tReturns the number of hats .\n";
-PyObject* SCA_JoystickSensor::PyNumberOfHats( ) {
- ShowDeprecationWarning("getNumHats()", "the numHats property");
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
- return PyInt_FromLong( joy ? joy->GetNumberOfHats() : 0 );
-}
-
-const char SCA_JoystickSensor::Connected_doc[] =
-"getConnected\n"
-"\tReturns True if a joystick is connected at this joysticks index.\n";
-PyObject* SCA_JoystickSensor::PyConnected( ) {
- ShowDeprecationWarning("getConnected()", "the connected property");
- SCA_Joystick *joy = m_pJoystickMgr->GetJoystickDevice(m_joyindex);
- return PyBool_FromLong( joy ? joy->Connected() : 0 );
-}
-
-
PyObject* SCA_JoystickSensor::pyattr_get_axis_values(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
int axis_index= joy->GetNumberOfAxes();
PyObject *list= PyList_New(axis_index);
while(axis_index--) {
- PyList_SET_ITEM(list, axis_index, PyInt_FromLong(joy->GetAxisPosition(axis_index)));
+ PyList_SET_ITEM(list, axis_index, PyLong_FromSsize_t(joy->GetAxisPosition(axis_index)));
}
return list;
@@ -600,26 +353,26 @@ PyObject* SCA_JoystickSensor::pyattr_get_axis_values(void *self_v, const KX_PYAT
PyObject* SCA_JoystickSensor::pyattr_get_axis_single(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
if(self->m_joymode != KX_JOYSENSORMODE_AXIS_SINGLE) {
PyErr_SetString(PyExc_TypeError, "val = sensor.axisSingle: Joystick Sensor, not 'Single Axis' type");
return NULL;
}
- return PyInt_FromLong(joy->GetAxisPosition(self->m_axis-1));
+ return PyLong_FromSsize_t(joy->GetAxisPosition(self->m_axis-1));
}
PyObject* SCA_JoystickSensor::pyattr_get_hat_values(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
int hat_index= joy->GetNumberOfHats();
PyObject *list= PyList_New(hat_index);
while(hat_index--) {
- PyList_SET_ITEM(list, hat_index, PyInt_FromLong(joy->GetHat(hat_index)));
+ PyList_SET_ITEM(list, hat_index, PyLong_FromSsize_t(joy->GetHat(hat_index)));
}
return list;
@@ -628,35 +381,35 @@ PyObject* SCA_JoystickSensor::pyattr_get_hat_values(void *self_v, const KX_PYATT
PyObject* SCA_JoystickSensor::pyattr_get_hat_single(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
- return PyInt_FromLong(joy->GetHat(self->m_hat-1));
+ return PyLong_FromSsize_t(joy->GetHat(self->m_hat-1));
}
PyObject* SCA_JoystickSensor::pyattr_get_num_axis(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
- return PyInt_FromLong( joy ? joy->GetNumberOfAxes() : 0 );
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
+ return PyLong_FromSsize_t( joy ? joy->GetNumberOfAxes() : 0 );
}
PyObject* SCA_JoystickSensor::pyattr_get_num_buttons(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
- return PyInt_FromLong( joy ? joy->GetNumberOfButtons() : 0 );
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
+ return PyLong_FromSsize_t( joy ? joy->GetNumberOfButtons() : 0 );
}
PyObject* SCA_JoystickSensor::pyattr_get_num_hats(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
- return PyInt_FromLong( joy ? joy->GetNumberOfHats() : 0 );
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
+ return PyLong_FromSsize_t( joy ? joy->GetNumberOfHats() : 0 );
}
PyObject* SCA_JoystickSensor::pyattr_get_connected(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_JoystickSensor* self= static_cast<SCA_JoystickSensor*>(self_v);
- SCA_Joystick *joy = self->m_pJoystickMgr->GetJoystickDevice(self->m_joyindex);
+ SCA_Joystick *joy = ((SCA_JoystickManager *)self->m_eventmgr)->GetJoystickDevice(self->m_joyindex);
return PyBool_FromLong( joy ? joy->Connected() : 0 );
}
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.h b/source/gameengine/GameLogic/SCA_JoystickSensor.h
index e6a1d2eef32..b793c591ac1 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.h
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.h
@@ -35,7 +35,6 @@
class SCA_JoystickSensor :public SCA_ISensor
{
Py_Header;
- class SCA_JoystickManager* m_pJoystickMgr;
/**
* Axis 1-JOYAXIS_MAX, MUST be followed by m_axisf
@@ -106,8 +105,7 @@ public:
short int joymode,
int axis, int axisf,int prec,
int button,
- int hat, int hatf, bool allevents,
- PyTypeObject* T=&Type );
+ int hat, int hatf, bool allevents);
virtual ~SCA_JoystickSensor();
virtual CValue* GetReplica();
@@ -123,33 +121,9 @@ public:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
/* Joystick Index */
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetIndex);
- KX_PYMETHOD_DOC_O(SCA_JoystickSensor,SetIndex);
- /* Axes*/
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetAxis);
- KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetAxis);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetAxisValue);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetThreshold);
- KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetThreshold);
- /* Buttons */
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetButton);
- KX_PYMETHOD_DOC_O(SCA_JoystickSensor,SetButton);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetButtonValue);
KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetButtonActiveList);
KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,GetButtonStatus);
- /* Hats */
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,GetHat);
- KX_PYMETHOD_DOC_VARARGS(SCA_JoystickSensor,SetHat);
- /* number of */
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,NumberOfAxes);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,NumberOfButtons);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,NumberOfHats);
- KX_PYMETHOD_DOC_NOARGS(SCA_JoystickSensor,Connected);
static PyObject* pyattr_get_axis_values(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_axis_single(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/GameLogic/SCA_KeyboardManager.h b/source/gameengine/GameLogic/SCA_KeyboardManager.h
index 8f3cc0ab715..c5553a74aef 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardManager.h
+++ b/source/gameengine/GameLogic/SCA_KeyboardManager.h
@@ -56,6 +56,13 @@ public:
virtual void NextFrame();
SCA_IInputDevice* GetInputDevice();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_KeyboardManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_KEYBOARDMANAGER
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
index f8ee8ed8b41..d2e3871fec2 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
@@ -48,10 +48,8 @@ SCA_KeyboardSensor::SCA_KeyboardSensor(SCA_KeyboardManager* keybdmgr,
bool bAllKeys,
const STR_String& targetProp,
const STR_String& toggleProp,
- SCA_IObject* gameobj,
- PyTypeObject* T )
- :SCA_ISensor(gameobj,keybdmgr,T),
- m_pKeyboardMgr(keybdmgr),
+ SCA_IObject* gameobj)
+ :SCA_ISensor(gameobj,keybdmgr),
m_hotkey(hotkey),
m_qual(qual),
m_qual2(qual2),
@@ -126,7 +124,7 @@ bool SCA_KeyboardSensor::Evaluate()
bool qual_change = false;
short int m_val_orig = m_val;
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
+ SCA_IInputDevice* inputdev = ((SCA_KeyboardManager *)m_eventmgr)->GetInputDevice();
// cerr << "SCA_KeyboardSensor::Eval event, sensing for "<< m_hotkey << " at device " << inputdev << "\n";
/* See if we need to do logging: togPropState exists and is
@@ -361,7 +359,7 @@ void SCA_KeyboardSensor::AddToTargetProp(int keyIndex)
*/
bool SCA_KeyboardSensor::IsShifted(void)
{
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
+ SCA_IInputDevice* inputdev = ((SCA_KeyboardManager *)m_eventmgr)->GetInputDevice();
if ( (inputdev->GetEventValue(SCA_IInputDevice::KX_RIGHTSHIFTKEY).m_status
== SCA_InputEvent::KX_ACTIVE)
@@ -380,7 +378,7 @@ bool SCA_KeyboardSensor::IsShifted(void)
void SCA_KeyboardSensor::LogKeystrokes(void)
{
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
+ SCA_IInputDevice* inputdev = ((SCA_KeyboardManager *)m_eventmgr)->GetInputDevice();
int num = inputdev->GetNumActiveEvents();
/* weird loop, this one... */
@@ -410,194 +408,16 @@ void SCA_KeyboardSensor::LogKeystrokes(void)
/* Python Functions */
/* ------------------------------------------------------------------------- */
-//Deprecated ----->
-/** 1. GetKey : check which key this sensor looks at */
-const char SCA_KeyboardSensor::GetKey_doc[] =
-"getKey()\n"
-"\tReturn the code of the key this sensor is listening to.\n" ;
-PyObject* SCA_KeyboardSensor::PyGetKey()
-{
- ShowDeprecationWarning("getKey()", "the key property");
- return PyInt_FromLong(m_hotkey);
-}
-
-/** 2. SetKey: change the key to look at */
-const char SCA_KeyboardSensor::SetKey_doc[] =
-"setKey(keycode)\n"
-"\t- keycode: any code from GameKeys\n"
-"\tSet the key this sensor should listen to.\n" ;
-PyObject* SCA_KeyboardSensor::PySetKey(PyObject* args)
-{
- ShowDeprecationWarning("setKey()", "the key property");
- int keyCode;
-
- if(!PyArg_ParseTuple(args, "i:setKey", &keyCode)) {
- return NULL;
- }
-
- /* Since we have symbolic constants for this in Python, we don't guard */
- /* anything. It's up to the user to provide a sensible number. */
- m_hotkey = keyCode;
-
- Py_RETURN_NONE;
-}
-
-/** 3. GetHold1 : set the first bucky bit */
-const char SCA_KeyboardSensor::GetHold1_doc[] =
-"getHold1()\n"
-"\tReturn the code of the first key modifier to the key this \n"
-"\tsensor is listening to.\n" ;
-PyObject* SCA_KeyboardSensor::PyGetHold1()
-{
- ShowDeprecationWarning("getHold1()", "the hold1 property");
- return PyInt_FromLong(m_qual);
-}
-
-/** 4. SetHold1: change the first bucky bit */
-const char SCA_KeyboardSensor::SetHold1_doc[] =
-"setHold1(keycode)\n"
-"\t- keycode: any code from GameKeys\n"
-"\tSet the first modifier to the key this sensor should listen to.\n" ;
-PyObject* SCA_KeyboardSensor::PySetHold1(PyObject* args)
-{
- ShowDeprecationWarning("setHold1()", "the hold1 property");
- int keyCode;
-
- if(!PyArg_ParseTuple(args, "i:setHold1", &keyCode)) {
- return NULL;
- }
-
- /* Since we have symbolic constants for this in Python, we don't guard */
- /* anything. It's up to the user to provide a sensible number. */
- m_qual = keyCode;
-
- Py_RETURN_NONE;
-}
-
-/** 5. GetHold2 : get the second bucky bit */
-const char SCA_KeyboardSensor::GetHold2_doc[] =
-"getHold2()\n"
-"\tReturn the code of the second key modifier to the key this \n"
-"\tsensor is listening to.\n" ;
-PyObject* SCA_KeyboardSensor::PyGetHold2()
-{
- ShowDeprecationWarning("getHold2()", "the hold2 property");
- return PyInt_FromLong(m_qual2);
-}
-
-/** 6. SetHold2: change the second bucky bit */
-const char SCA_KeyboardSensor::SetHold2_doc[] =
-"setHold2(keycode)\n"
-"\t- keycode: any code from GameKeys\n"
-"\tSet the first modifier to the key this sensor should listen to.\n" ;
-PyObject* SCA_KeyboardSensor::PySetHold2(PyObject* args)
-{
- ShowDeprecationWarning("setHold2()", "the hold2 property");
- int keyCode;
-
- if(!PyArg_ParseTuple(args, "i:setHold2", &keyCode)) {
- return NULL;
- }
-
- /* Since we have symbolic constants for this in Python, we don't guard */
- /* anything. It's up to the user to provide a sensible number. */
- m_qual2 = keyCode;
-
- Py_RETURN_NONE;
-}
-
-
-const char SCA_KeyboardSensor::GetPressedKeys_doc[] =
-"getPressedKeys()\n"
-"\tGet a list of pressed keys that have either been pressed, or just released this frame.\n" ;
-
-PyObject* SCA_KeyboardSensor::PyGetPressedKeys()
-{
- ShowDeprecationWarning("getPressedKeys()", "events");
-
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
-
- int num = inputdev->GetNumJustEvents();
- PyObject* resultlist = PyList_New(num);
-
- if (num > 0)
- {
-
- int index = 0;
-
- for (int i=SCA_IInputDevice::KX_BEGINKEY ; i<= SCA_IInputDevice::KX_ENDKEY;i++)
- {
- const SCA_InputEvent & inevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) i);
- if ((inevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED)
- || (inevent.m_status == SCA_InputEvent::KX_JUSTRELEASED))
- {
- PyObject* keypair = PyList_New(2);
- PyList_SET_ITEM(keypair,0,PyInt_FromLong(i));
- PyList_SET_ITEM(keypair,1,PyInt_FromLong(inevent.m_status));
- PyList_SET_ITEM(resultlist,index,keypair);
- index++;
-
- if (index >= num) /* should not happen */
- break;
- }
- }
- }
-
- return resultlist;
-}
-
-
-
-const char SCA_KeyboardSensor::GetCurrentlyPressedKeys_doc[] =
-"getCurrentlyPressedKeys()\n"
-"\tGet a list of keys that are currently pressed.\n" ;
-
-PyObject* SCA_KeyboardSensor::PyGetCurrentlyPressedKeys()
-{
- ShowDeprecationWarning("getCurrentlyPressedKeys()", "events");
-
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
-
- int num = inputdev->GetNumActiveEvents();
- PyObject* resultlist = PyList_New(num);
-
- if (num > 0)
- {
- int index = 0;
-
- for (int i=SCA_IInputDevice::KX_BEGINKEY ; i<= SCA_IInputDevice::KX_ENDKEY;i++)
- {
- const SCA_InputEvent & inevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) i);
- if ( (inevent.m_status == SCA_InputEvent::KX_ACTIVE)
- || (inevent.m_status == SCA_InputEvent::KX_JUSTACTIVATED))
- {
- PyObject* keypair = PyList_New(2);
- PyList_SET_ITEM(keypair,0,PyInt_FromLong(i));
- PyList_SET_ITEM(keypair,1,PyInt_FromLong(inevent.m_status));
- PyList_SET_ITEM(resultlist,index,keypair);
- index++;
-
- if (index >= num) /* should never happen */
- break;
- }
- }
- }
-
- return resultlist;
-}
-
-//<---- Deprecated
-
KX_PYMETHODDEF_DOC_O(SCA_KeyboardSensor, getKeyStatus,
"getKeyStatus(keycode)\n"
"\tGet the given key's status (KX_NO_INPUTSTATUS, KX_JUSTACTIVATED, KX_ACTIVE or KX_JUSTRELEASED).\n")
{
- if (!PyInt_Check(value)) {
+ if (!PyLong_Check(value)) {
PyErr_SetString(PyExc_ValueError, "sensor.getKeyStatus(int): Keyboard Sensor, expected an int");
return NULL;
}
- int keycode = PyInt_AsLong(value);
+ int keycode = PyLong_AsSsize_t(value);
if ((keycode < SCA_IInputDevice::KX_BEGINKEY)
|| (keycode > SCA_IInputDevice::KX_ENDKEY)){
@@ -605,9 +425,9 @@ KX_PYMETHODDEF_DOC_O(SCA_KeyboardSensor, getKeyStatus,
return NULL;
}
- SCA_IInputDevice* inputdev = m_pKeyboardMgr->GetInputDevice();
+ SCA_IInputDevice* inputdev = ((SCA_KeyboardManager *)m_eventmgr)->GetInputDevice();
const SCA_InputEvent & inevent = inputdev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) keycode);
- return PyInt_FromLong(inevent.m_status);
+ return PyLong_FromSsize_t(inevent.m_status);
}
/* ------------------------------------------------------------------------- */
@@ -615,13 +435,7 @@ KX_PYMETHODDEF_DOC_O(SCA_KeyboardSensor, getKeyStatus,
/* ------------------------------------------------------------------------- */
PyTypeObject SCA_KeyboardSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_KeyboardSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -631,32 +445,18 @@ PyTypeObject SCA_KeyboardSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_KeyboardSensor::Parents[] = {
- &SCA_KeyboardSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_KeyboardSensor::Methods[] = {
- //Deprecated functions ------>
- {"getKey", (PyCFunction) SCA_KeyboardSensor::sPyGetKey, METH_NOARGS, (PY_METHODCHAR)GetKey_doc},
- {"setKey", (PyCFunction) SCA_KeyboardSensor::sPySetKey, METH_VARARGS, (PY_METHODCHAR)SetKey_doc},
- {"getHold1", (PyCFunction) SCA_KeyboardSensor::sPyGetHold1, METH_NOARGS, (PY_METHODCHAR)GetHold1_doc},
- {"setHold1", (PyCFunction) SCA_KeyboardSensor::sPySetHold1, METH_VARARGS, (PY_METHODCHAR)SetHold1_doc},
- {"getHold2", (PyCFunction) SCA_KeyboardSensor::sPyGetHold2, METH_NOARGS, (PY_METHODCHAR)GetHold2_doc},
- {"setHold2", (PyCFunction) SCA_KeyboardSensor::sPySetHold2, METH_VARARGS, (PY_METHODCHAR)SetHold2_doc},
- {"getPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetPressedKeys, METH_NOARGS, (PY_METHODCHAR)GetPressedKeys_doc},
- {"getCurrentlyPressedKeys", (PyCFunction) SCA_KeyboardSensor::sPyGetCurrentlyPressedKeys, METH_NOARGS, (PY_METHODCHAR)GetCurrentlyPressedKeys_doc},
- //<----- Deprecated
KX_PYMETHODTABLE_O(SCA_KeyboardSensor, getKeyStatus),
{NULL,NULL} //Sentinel
};
@@ -672,26 +472,12 @@ PyAttributeDef SCA_KeyboardSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_KeyboardSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_KeyboardSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_KeyboardSensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ISensor);
-}
-
PyObject* SCA_KeyboardSensor::pyattr_get_events(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_KeyboardSensor* self= static_cast<SCA_KeyboardSensor*>(self_v);
- SCA_IInputDevice* inputdev = self->m_pKeyboardMgr->GetInputDevice();
+ SCA_IInputDevice* inputdev = ((SCA_KeyboardManager *)self->m_eventmgr)->GetInputDevice();
PyObject* resultlist = PyList_New(0);
@@ -701,8 +487,8 @@ PyObject* SCA_KeyboardSensor::pyattr_get_events(void *self_v, const KX_PYATTRIBU
if (inevent.m_status != SCA_InputEvent::KX_NO_INPUTSTATUS)
{
PyObject* keypair = PyList_New(2);
- PyList_SET_ITEM(keypair,0,PyInt_FromLong(i));
- PyList_SET_ITEM(keypair,1,PyInt_FromLong(inevent.m_status));
+ PyList_SET_ITEM(keypair,0,PyLong_FromSsize_t(i));
+ PyList_SET_ITEM(keypair,1,PyLong_FromSsize_t(inevent.m_status));
PyList_Append(resultlist,keypair);
}
}
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.h b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
index 033225cd9be..d7e0f301a9d 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.h
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
@@ -43,8 +43,6 @@
class SCA_KeyboardSensor : public SCA_ISensor
{
Py_Header;
- class SCA_KeyboardManager* m_pKeyboardMgr;
-
/**
* the key this sensor is sensing for
@@ -94,8 +92,7 @@ public:
bool bAllKeys,
const STR_String& targetProp,
const STR_String& toggleProp,
- SCA_IObject* gameobj,
- PyTypeObject* T=&Type );
+ SCA_IObject* gameobj);
virtual ~SCA_KeyboardSensor();
virtual CValue* GetReplica();
virtual void Init();
@@ -110,29 +107,6 @@ public:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- //Deprecated functions ----->
- /** 1. GetKey : check which key this sensor looks at */
- KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,GetKey);
- /** 2. SetKey: change the key to look at */
- KX_PYMETHOD_DOC_VARARGS(SCA_KeyboardSensor,SetKey);
- /** 3. GetHold1 : set the first bucky bit */
- KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,GetHold1);
- /** 4. SetHold1: change the first bucky bit */
- KX_PYMETHOD_DOC_VARARGS(SCA_KeyboardSensor,SetHold1);
- /** 5. GetHold2 : set the second bucky bit */
- KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,GetHold2);
- /** 6. SetHold2: change the second bucky bit */
- KX_PYMETHOD_DOC_VARARGS(SCA_KeyboardSensor,SetHold2);
- /** 9. GetPressedKeys: */
- KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,GetPressedKeys);
- /** 9. GetCurrrentlyPressedKeys: */
- KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,GetCurrentlyPressedKeys);
- // <------
-
// KeyEvents:
KX_PYMETHOD_DOC_NOARGS(SCA_KeyboardSensor,getEventList);
// KeyStatus:
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp
index 83271288154..b782c6dfb93 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.cpp
+++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp
@@ -307,6 +307,7 @@ void SCA_LogicManager::AddTriggeredController(SCA_IController* controller, SCA_I
controller->Activate(m_triggeredControllerSet);
// so that the controller knows which sensor has activited it
// only needed for python controller
+ // Note that this is safe even if the controller is subclassed.
if (controller->GetType() == &SCA_PythonController::Type)
{
SCA_PythonController* pythonController = (SCA_PythonController*)controller;
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h
index 53e75e1eaee..402090357cb 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.h
+++ b/source/gameengine/GameLogic/SCA_LogicManager.h
@@ -137,6 +137,13 @@ public:
void RegisterGameObj(void* blendobj, CValue* gameobj);
void UnregisterGameObj(void* blendobj, CValue* gameobj);
CValue* FindGameObjByBlendObj(void* blendobj);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_LogicManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_LOGICMANAGER
diff --git a/source/gameengine/GameLogic/SCA_MouseManager.h b/source/gameengine/GameLogic/SCA_MouseManager.h
index efa4c639ce7..ef1533c636b 100644
--- a/source/gameengine/GameLogic/SCA_MouseManager.h
+++ b/source/gameengine/GameLogic/SCA_MouseManager.h
@@ -63,6 +63,13 @@ public:
bool IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode);
virtual void NextFrame();
SCA_IInputDevice* GetInputDevice();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_MouseManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_MOUSEMANAGER
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.cpp b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
index c5e1c3c0441..9d32682eaa9 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
@@ -49,10 +49,8 @@
SCA_MouseSensor::SCA_MouseSensor(SCA_MouseManager* eventmgr,
int startx,int starty,
short int mousemode,
- SCA_IObject* gameobj,
- PyTypeObject* T)
- : SCA_ISensor(gameobj,eventmgr, T),
- m_pMouseMgr(eventmgr),
+ SCA_IObject* gameobj)
+ : SCA_ISensor(gameobj,eventmgr),
m_x(startx),
m_y(starty)
{
@@ -148,7 +146,7 @@ bool SCA_MouseSensor::Evaluate()
{
bool result = false;
bool reset = m_reset && m_level;
- SCA_IInputDevice* mousedev = m_pMouseMgr->GetInputDevice();
+ SCA_IInputDevice* mousedev = ((SCA_MouseManager *)m_eventmgr)->GetInputDevice();
m_reset = false;
switch (m_mousemode) {
@@ -245,37 +243,13 @@ bool SCA_MouseSensor::isValid(SCA_MouseSensor::KX_MOUSESENSORMODE m)
/* Python functions */
/* ------------------------------------------------------------------------- */
-//Deprecated functions ------>
-/* get x position ---------------------------------------------------------- */
-const char SCA_MouseSensor::GetXPosition_doc[] =
-"getXPosition\n"
-"\tReturns the x-coordinate of the mouse sensor, in frame coordinates.\n"
-"\tThe lower-left corner is the origin. The coordinate is given in\n"
-"\tpixels\n";
-PyObject* SCA_MouseSensor::PyGetXPosition() {
- ShowDeprecationWarning("getXPosition()", "the position property");
- return PyInt_FromLong(m_x);
-}
-
-/* get y position ---------------------------------------------------------- */
-const char SCA_MouseSensor::GetYPosition_doc[] =
-"getYPosition\n"
-"\tReturns the y-coordinate of the mouse sensor, in frame coordinates.\n"
-"\tThe lower-left corner is the origin. The coordinate is given in\n"
-"\tpixels\n";
-PyObject* SCA_MouseSensor::PyGetYPosition() {
- ShowDeprecationWarning("getYPosition()", "the position property");
- return PyInt_FromLong(m_y);
-}
-//<----- Deprecated
-
KX_PYMETHODDEF_DOC_O(SCA_MouseSensor, getButtonStatus,
"getButtonStatus(button)\n"
"\tGet the given button's status (KX_INPUT_NONE, KX_INPUT_NONE, KX_INPUT_JUST_ACTIVATED, KX_INPUT_ACTIVE, KX_INPUT_JUST_RELEASED).\n")
{
- if (PyInt_Check(value))
+ if (PyLong_Check(value))
{
- int button = PyInt_AsLong(value);
+ int button = PyLong_AsSsize_t(value);
if ((button < SCA_IInputDevice::KX_LEFTMOUSE)
|| (button > SCA_IInputDevice::KX_RIGHTMOUSE)){
@@ -283,9 +257,9 @@ KX_PYMETHODDEF_DOC_O(SCA_MouseSensor, getButtonStatus,
return NULL;
}
- SCA_IInputDevice* mousedev = m_pMouseMgr->GetInputDevice();
+ SCA_IInputDevice* mousedev = ((SCA_MouseManager *)m_eventmgr)->GetInputDevice();
const SCA_InputEvent& event = mousedev->GetEventValue((SCA_IInputDevice::KX_EnumInputs) button);
- return PyInt_FromLong(event.m_status);
+ return PyLong_FromSsize_t(event.m_status);
}
Py_RETURN_NONE;
@@ -296,13 +270,7 @@ KX_PYMETHODDEF_DOC_O(SCA_MouseSensor, getButtonStatus,
/* ------------------------------------------------------------------------- */
PyTypeObject SCA_MouseSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_MouseSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -312,26 +280,18 @@ PyTypeObject SCA_MouseSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_MouseSensor::Parents[] = {
- &SCA_MouseSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_MouseSensor::Methods[] = {
- //Deprecated functions ------>
- {"getXPosition", (PyCFunction) SCA_MouseSensor::sPyGetXPosition, METH_VARARGS, (PY_METHODCHAR)GetXPosition_doc},
- {"getYPosition", (PyCFunction) SCA_MouseSensor::sPyGetYPosition, METH_VARARGS, (PY_METHODCHAR)GetYPosition_doc},
- //<----- Deprecated
KX_PYMETHODTABLE_O(SCA_MouseSensor, getButtonStatus),
{NULL,NULL} //Sentinel
};
@@ -342,18 +302,4 @@ PyAttributeDef SCA_MouseSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_MouseSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_MouseSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_MouseSensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ISensor);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.h b/source/gameengine/GameLogic/SCA_MouseSensor.h
index 6d6302b514a..a679e605428 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.h
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.h
@@ -39,7 +39,6 @@
class SCA_MouseSensor : public SCA_ISensor
{
Py_Header;
- class SCA_MouseManager* m_pMouseMgr;
/**
* Use SCA_IInputDevice values to encode the mouse mode for now.
@@ -92,8 +91,7 @@ class SCA_MouseSensor : public SCA_ISensor
SCA_MouseSensor(class SCA_MouseManager* keybdmgr,
int startx,int starty,
short int mousemode,
- SCA_IObject* gameobj,
- PyTypeObject* T=&Type );
+ SCA_IObject* gameobj);
virtual ~SCA_MouseSensor();
virtual CValue* GetReplica();
@@ -108,17 +106,6 @@ class SCA_MouseSensor : public SCA_ISensor
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- //Deprecated functions ----->
- /* read x-coordinate */
- KX_PYMETHOD_DOC_NOARGS(SCA_MouseSensor,GetXPosition);
- /* read y-coordinate */
- KX_PYMETHOD_DOC_NOARGS(SCA_MouseSensor,GetYPosition);
- //<----- deprecated
// get button status
KX_PYMETHOD_DOC_O(SCA_MouseSensor,getButtonStatus);
diff --git a/source/gameengine/GameLogic/SCA_NANDController.cpp b/source/gameengine/GameLogic/SCA_NANDController.cpp
index d27aea5e6f7..c971c06fadd 100644
--- a/source/gameengine/GameLogic/SCA_NANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_NANDController.cpp
@@ -42,10 +42,9 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_NANDController::SCA_NANDController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_NANDController::SCA_NANDController(SCA_IObject* gameobj)
:
- SCA_IController(gameobj,T)
+ SCA_IController(gameobj)
{
}
@@ -100,13 +99,7 @@ CValue* SCA_NANDController::GetReplica()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_NANDController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_NANDController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -116,19 +109,15 @@ PyTypeObject SCA_NANDController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_NANDController::Parents[] = {
- &SCA_NANDController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_NANDController::Methods[] = {
@@ -139,12 +128,4 @@ PyAttributeDef SCA_NANDController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_NANDController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_NANDController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_NANDController.h b/source/gameengine/GameLogic/SCA_NANDController.h
index 0ae0ff19745..36a145e5f2b 100644
--- a/source/gameengine/GameLogic/SCA_NANDController.h
+++ b/source/gameengine/GameLogic/SCA_NANDController.h
@@ -39,7 +39,7 @@ class SCA_NANDController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_NANDController(SCA_IObject* gameobj,PyTypeObject* T=&Type);
+ SCA_NANDController(SCA_IObject* gameobj);
virtual ~SCA_NANDController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
@@ -47,10 +47,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_NANDCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_NORController.cpp b/source/gameengine/GameLogic/SCA_NORController.cpp
index 6c9141636b2..7a8b09e4bec 100644
--- a/source/gameengine/GameLogic/SCA_NORController.cpp
+++ b/source/gameengine/GameLogic/SCA_NORController.cpp
@@ -42,10 +42,9 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_NORController::SCA_NORController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_NORController::SCA_NORController(SCA_IObject* gameobj)
:
- SCA_IController(gameobj,T)
+ SCA_IController(gameobj)
{
}
@@ -100,13 +99,7 @@ CValue* SCA_NORController::GetReplica()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_NORController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_NORController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -116,19 +109,15 @@ PyTypeObject SCA_NORController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_NORController::Parents[] = {
- &SCA_NORController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_NORController::Methods[] = {
@@ -139,12 +128,4 @@ PyAttributeDef SCA_NORController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_NORController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_NORController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_NORController.h b/source/gameengine/GameLogic/SCA_NORController.h
index 06cbb70a489..b96232375d6 100644
--- a/source/gameengine/GameLogic/SCA_NORController.h
+++ b/source/gameengine/GameLogic/SCA_NORController.h
@@ -39,18 +39,10 @@ class SCA_NORController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_NORController(SCA_IObject* gameobj,PyTypeObject* T=&Type);
+ SCA_NORController(SCA_IObject* gameobj);
virtual ~SCA_NORController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_NORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_ORController.cpp b/source/gameengine/GameLogic/SCA_ORController.cpp
index 42c0a67d657..12e2f610986 100644
--- a/source/gameengine/GameLogic/SCA_ORController.cpp
+++ b/source/gameengine/GameLogic/SCA_ORController.cpp
@@ -42,9 +42,8 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_ORController::SCA_ORController(SCA_IObject* gameobj,
- PyTypeObject* T)
- :SCA_IController(gameobj, T)
+SCA_ORController::SCA_ORController(SCA_IObject* gameobj)
+ :SCA_IController(gameobj)
{
}
@@ -94,13 +93,7 @@ void SCA_ORController::Trigger(SCA_LogicManager* logicmgr)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_ORController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_ORController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -110,19 +103,15 @@ PyTypeObject SCA_ORController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_ORController::Parents[] = {
- &SCA_ORController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_ORController::Methods[] = {
@@ -133,13 +122,4 @@ PyAttributeDef SCA_ORController::Attributes[] = {
{ NULL } //Sentinel
};
-
-PyObject* SCA_ORController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_ORController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ORController.h b/source/gameengine/GameLogic/SCA_ORController.h
index 66f772c739e..09d31a85190 100644
--- a/source/gameengine/GameLogic/SCA_ORController.h
+++ b/source/gameengine/GameLogic/SCA_ORController.h
@@ -39,18 +39,11 @@ class SCA_ORController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_ORController(SCA_IObject* gameobj, PyTypeObject* T=&Type);
+ SCA_ORController(SCA_IObject* gameobj);
virtual ~SCA_ORController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
};
#endif //__KX_ORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
index 4faa4b55d4a..2a3e600a653 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
@@ -42,8 +42,8 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_PropertyActuator::SCA_PropertyActuator(SCA_IObject* gameobj,SCA_IObject* sourceObj,const STR_String& propname,const STR_String& expr,int acttype,PyTypeObject* T )
- : SCA_IActuator(gameobj,T),
+SCA_PropertyActuator::SCA_PropertyActuator(SCA_IObject* gameobj,SCA_IObject* sourceObj,const STR_String& propname,const STR_String& expr,int acttype)
+ : SCA_IActuator(gameobj, KX_ACT_PROPERTY),
m_type(acttype),
m_propname(propname),
m_exprtxt(expr),
@@ -228,13 +228,7 @@ void SCA_PropertyActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_PropertyActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_PropertyActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -244,28 +238,18 @@ PyTypeObject SCA_PropertyActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_PropertyActuator::Parents[] = {
- &SCA_PropertyActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_PropertyActuator::Methods[] = {
- //Deprecated functions ------>
- {"setProperty", (PyCFunction) SCA_PropertyActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"getProperty", (PyCFunction) SCA_PropertyActuator::sPyGetProperty, METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
- {"setValue", (PyCFunction) SCA_PropertyActuator::sPySetValue, METH_VARARGS, (PY_METHODCHAR)SetValue_doc},
- {"getValue", (PyCFunction) SCA_PropertyActuator::sPyGetValue, METH_VARARGS, (PY_METHODCHAR)GetValue_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -276,83 +260,4 @@ PyAttributeDef SCA_PropertyActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_PropertyActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* SCA_PropertyActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int SCA_PropertyActuator::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_IActuator);
-}
-
-/* 1. setProperty */
-const char SCA_PropertyActuator::SetProperty_doc[] =
-"setProperty(name)\n"
-"\t- name: string\n"
-"\tSet the property on which to operate. If there is no property\n"
-"\tof this name, the call is ignored.\n";
-PyObject* SCA_PropertyActuator::PySetProperty(PyObject* args, PyObject* kwds)
-{
- ShowDeprecationWarning("setProperty()", "the 'propName' property");
- /* Check whether the name exists first ! */
- char *nameArg;
- if (!PyArg_ParseTuple(args, "s:setProperty", &nameArg)) {
- return NULL;
- }
-
- CValue* prop = GetParent()->FindIdentifier(nameArg);
-
- if (!prop->IsError()) {
- m_propname = nameArg;
- } else {
- ; /* not found ... */
- }
- prop->Release();
-
- Py_RETURN_NONE;
-}
-
-/* 2. getProperty */
-const char SCA_PropertyActuator::GetProperty_doc[] =
-"getProperty(name)\n"
-"\tReturn the property on which the actuator operates.\n";
-PyObject* SCA_PropertyActuator::PyGetProperty(PyObject* args, PyObject* kwds)
-{
- ShowDeprecationWarning("getProperty()", "the 'propName' property");
- return PyString_FromString(m_propname);
-}
-
-/* 3. setValue */
-const char SCA_PropertyActuator::SetValue_doc[] =
-"setValue(value)\n"
-"\t- value: string\n"
-"\tSet the value with which the actuator operates. If the value\n"
-"\tis not compatible with the type of the property, the subsequent\n"
-"\t action is ignored.\n";
-PyObject* SCA_PropertyActuator::PySetValue(PyObject* args, PyObject* kwds)
-{
- ShowDeprecationWarning("setValue()", "the value property");
- char *valArg;
- if(!PyArg_ParseTuple(args, "s:setValue", &valArg)) {
- return NULL;
- }
-
- if (valArg) m_exprtxt = valArg;
-
- Py_RETURN_NONE;
-}
-
-/* 4. getValue */
-const char SCA_PropertyActuator::GetValue_doc[] =
-"getValue()\n"
-"\tReturns the value with which the actuator operates.\n";
-PyObject* SCA_PropertyActuator::PyGetValue(PyObject* args, PyObject* kwds)
-{
- ShowDeprecationWarning("getValue()", "the value property");
- return PyString_FromString(m_exprtxt);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.h b/source/gameengine/GameLogic/SCA_PropertyActuator.h
index a8df08dfc6e..833547a5cd3 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.h
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.h
@@ -64,9 +64,7 @@ public:
SCA_IObject* sourceObj,
const STR_String& propname,
const STR_String& expr,
- int acttype,
- PyTypeObject* T=&Type
- );
+ int acttype);
~SCA_PropertyActuator();
@@ -85,18 +83,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // python wrapped methods
- KX_PYMETHOD_DOC(SCA_PropertyActuator,SetProperty);
- KX_PYMETHOD_DOC(SCA_PropertyActuator,GetProperty);
- KX_PYMETHOD_DOC(SCA_PropertyActuator,SetValue);
- KX_PYMETHOD_DOC(SCA_PropertyActuator,GetValue);
-
- /* 5. - ... setObject, getObject, setProp2, getProp2, setMode, getMode*/
};
diff --git a/source/gameengine/GameLogic/SCA_PropertyEventManager.h b/source/gameengine/GameLogic/SCA_PropertyEventManager.h
index f166065b198..a9692377df8 100644
--- a/source/gameengine/GameLogic/SCA_PropertyEventManager.h
+++ b/source/gameengine/GameLogic/SCA_PropertyEventManager.h
@@ -44,6 +44,13 @@ public:
virtual ~SCA_PropertyEventManager();
virtual void NextFrame();
//SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_PropertyEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_PROPERTYEVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
index 3b343af3cba..9c09c8410fb 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
@@ -48,9 +48,8 @@ SCA_PropertySensor::SCA_PropertySensor(SCA_EventManager* eventmgr,
const STR_String& propname,
const STR_String& propval,
const STR_String& propmaxval,
- KX_PROPSENSOR_TYPE checktype,
- PyTypeObject* T )
- : SCA_ISensor(gameobj,eventmgr,T),
+ KX_PROPSENSOR_TYPE checktype)
+ : SCA_ISensor(gameobj,eventmgr),
m_checktype(checktype),
m_checkpropval(propval),
m_checkpropmaxval(propmaxval),
@@ -303,13 +302,7 @@ int SCA_PropertySensor::validValueForProperty(void *self, const PyAttributeDef*)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_PropertySensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_PropertySensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -319,30 +312,18 @@ PyTypeObject SCA_PropertySensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_PropertySensor::Parents[] = {
- &SCA_PropertySensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_PropertySensor::Methods[] = {
- //Deprecated functions ------>
- {"getType", (PyCFunction) SCA_PropertySensor::sPyGetType, METH_NOARGS, (PY_METHODCHAR)GetType_doc},
- {"setType", (PyCFunction) SCA_PropertySensor::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
- {"getProperty", (PyCFunction) SCA_PropertySensor::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
- {"setProperty", (PyCFunction) SCA_PropertySensor::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"getValue", (PyCFunction) SCA_PropertySensor::sPyGetValue, METH_NOARGS, (PY_METHODCHAR)GetValue_doc},
- {"setValue", (PyCFunction) SCA_PropertySensor::sPySetValue, METH_VARARGS, (PY_METHODCHAR)SetValue_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -353,124 +334,4 @@ PyAttributeDef SCA_PropertySensor::Attributes[] = {
{ NULL } //Sentinel
};
-
-PyObject* SCA_PropertySensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_PropertySensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_PropertySensor::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_ISensor);
-}
-
-/* 1. getType */
-const char SCA_PropertySensor::GetType_doc[] =
-"getType()\n"
-"\tReturns the type of check this sensor performs.\n";
-PyObject* SCA_PropertySensor::PyGetType()
-{
- ShowDeprecationWarning("getType()", "the mode property");
- return PyInt_FromLong(m_checktype);
-}
-
-/* 2. setType */
-const char SCA_PropertySensor::SetType_doc[] =
-"setType(type)\n"
-"\t- type: KX_PROPSENSOR_EQUAL, KX_PROPSENSOR_NOTEQUAL,\n"
-"\t KX_PROPSENSOR_INTERVAL, KX_PROPSENSOR_CHANGED,\n"
-"\t or KX_PROPSENSOR_EXPRESSION.\n"
-"\tSet the type of check to perform.\n";
-PyObject* SCA_PropertySensor::PySetType(PyObject* args)
-{
- ShowDeprecationWarning("setType()", "the mode property");
- int typeArg;
-
- if (!PyArg_ParseTuple(args, "i:setType", &typeArg)) {
- return NULL;
- }
-
- if ( (typeArg > KX_PROPSENSOR_NODEF)
- && (typeArg < KX_PROPSENSOR_MAX) ) {
- m_checktype = typeArg;
- }
-
- Py_RETURN_NONE;
-}
-
-/* 3. getProperty */
-const char SCA_PropertySensor::GetProperty_doc[] =
-"getProperty()\n"
-"\tReturn the property with which the sensor operates.\n";
-PyObject* SCA_PropertySensor::PyGetProperty()
-{
- ShowDeprecationWarning("getProperty()", "the 'propName' property");
- return PyString_FromString(m_checkpropname);
-}
-
-/* 4. setProperty */
-const char SCA_PropertySensor::SetProperty_doc[] =
-"setProperty(name)\n"
-"\t- name: string\n"
-"\tSets the property with which to operate. If there is no property\n"
-"\tof this name, the call is ignored.\n";
-PyObject* SCA_PropertySensor::PySetProperty(PyObject* args)
-{
- ShowDeprecationWarning("setProperty()", "the 'propName' property");
- /* We should query whether the name exists. Or should we create a prop */
- /* on the fly? */
- char *propNameArg = NULL;
-
- if (!PyArg_ParseTuple(args, "s:setProperty", &propNameArg)) {
- return NULL;
- }
-
- CValue *prop = FindIdentifier(STR_String(propNameArg));
- if (!prop->IsError()) {
- m_checkpropname = propNameArg;
- } else {
- ; /* error: bad property name */
- }
- prop->Release();
- Py_RETURN_NONE;
-}
-
-/* 5. getValue */
-const char SCA_PropertySensor::GetValue_doc[] =
-"getValue()\n"
-"\tReturns the value with which the sensor operates.\n";
-PyObject* SCA_PropertySensor::PyGetValue()
-{
- ShowDeprecationWarning("getValue()", "the value property");
- return PyString_FromString(m_checkpropval);
-}
-
-/* 6. setValue */
-const char SCA_PropertySensor::SetValue_doc[] =
-"setValue(value)\n"
-"\t- value: string\n"
-"\tSet the value with which the sensor operates. If the value\n"
-"\tis not compatible with the type of the property, the subsequent\n"
-"\t action is ignored.\n";
-PyObject* SCA_PropertySensor::PySetValue(PyObject* args)
-{
- ShowDeprecationWarning("setValue()", "the value property");
- /* Here, we need to check whether the value is 'valid' for this property.*/
- /* We know that the property exists, or is NULL. */
- char *propValArg = NULL;
-
- if(!PyArg_ParseTuple(args, "s:setValue", &propValArg)) {
- return NULL;
- }
- STR_String oldval = m_checkpropval;
- m_checkpropval = propValArg;
- if (validValueForProperty(m_proxy, NULL)) {
- m_checkpropval = oldval;
- return NULL;
- }
- Py_RETURN_NONE;
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.h b/source/gameengine/GameLogic/SCA_PropertySensor.h
index 538ecd65949..a5bbfc8438b 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.h
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.h
@@ -67,8 +67,7 @@ public:
const STR_String& propname,
const STR_String& propval,
const STR_String& propmaxval,
- KX_PROPSENSOR_TYPE checktype,
- PyTypeObject* T=&Type );
+ KX_PROPSENSOR_TYPE checktype);
/**
* For property sensor, it is used to release the pre-calculated expression
@@ -89,22 +88,6 @@ public:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- /* 1. getType */
- KX_PYMETHOD_DOC_NOARGS(SCA_PropertySensor,GetType);
- /* 2. setType */
- KX_PYMETHOD_DOC_VARARGS(SCA_PropertySensor,SetType);
- /* 3. setProperty */
- KX_PYMETHOD_DOC_VARARGS(SCA_PropertySensor,SetProperty);
- /* 4. getProperty */
- KX_PYMETHOD_DOC_NOARGS(SCA_PropertySensor,GetProperty);
- /* 5. getValue */
- KX_PYMETHOD_DOC_NOARGS(SCA_PropertySensor,GetValue);
- /* 6. setValue */
- KX_PYMETHOD_DOC_VARARGS(SCA_PropertySensor,SetValue);
/**
* Test whether this is a sensible value (type check)
*/
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 80e4f54c9c5..ecaa8c508db 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -47,10 +47,8 @@
SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL;
-SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj,
- int mode,
- PyTypeObject* T)
- : SCA_IController(gameobj, T),
+SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj, int mode)
+ : SCA_IController(gameobj),
m_bytecode(NULL),
m_function(NULL),
m_function_argc(0),
@@ -150,7 +148,7 @@ void SCA_PythonController::SetDictionary(PyObject* pythondictionary)
/* Without __file__ set the sys.argv[0] is used for the filename
* which ends up with lines from the blender binary being printed in the console */
- PyDict_SetItemString(m_pythondictionary, "__file__", PyString_FromString(m_scriptName.Ptr()));
+ PyDict_SetItemString(m_pythondictionary, "__file__", PyUnicode_FromString(m_scriptName.Ptr()));
}
@@ -180,16 +178,16 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
std::vector<SCA_IActuator*> lacts = m_sCurrentController->GetLinkedActuators();
std::vector<SCA_IActuator*>::iterator it;
- if (PyString_Check(value)) {
+ if (PyUnicode_Check(value)) {
/* get the actuator from the name */
- char *name= PyString_AsString(value);
+ char *name= _PyUnicode_AsString(value);
for(it = lacts.begin(); it!= lacts.end(); ++it) {
if( name == (*it)->GetName() ) {
return *it;
}
}
}
- else if (BGE_PROXY_CHECK_TYPE(value)) {
+ else if (PyObject_TypeCheck(value, &SCA_IActuator::Type)) {
PyObjectPlus *value_plus= BGE_PROXY_REF(value);
for(it = lacts.begin(); it!= lacts.end(); ++it) {
if( static_cast<SCA_IActuator*>(value_plus) == (*it) ) {
@@ -200,72 +198,39 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
/* set the exception */
PyObject *value_str = PyObject_Repr(value); /* new ref */
- PyErr_Format(PyExc_ValueError, "'%s' not in this python controllers actuator list", PyString_AsString(value_str));
+ PyErr_Format(PyExc_ValueError, "'%s' not in this python controllers actuator list", _PyUnicode_AsString(value_str));
Py_DECREF(value_str);
return false;
}
-/* warning, self is not the SCA_PythonController, its a PyObjectPlus_Proxy */
-PyObject* SCA_PythonController::sPyAddActiveActuator(PyObject* self, PyObject* args)
-{
- ShowDeprecationWarning("GameLogic.addActiveActuator(act, bool)", "controller.activate(act) or controller.deactivate(act)");
-
- PyObject* ob1;
- int activate;
- if (!PyArg_ParseTuple(args, "Oi:addActiveActuator", &ob1,&activate))
- return NULL;
-
- SCA_IActuator* actu = LinkedActuatorFromPy(ob1);
- if(actu==NULL)
- return NULL;
-
- bool boolval = (activate!=0);
- m_sCurrentLogicManager->AddActiveActuator((SCA_IActuator*)actu,boolval);
- Py_RETURN_NONE;
-}
-
const char* SCA_PythonController::sPyGetCurrentController__doc__ = "getCurrentController()";
-const char* SCA_PythonController::sPyAddActiveActuator__doc__= "addActiveActuator(actuator,bool)";
PyTypeObject SCA_PythonController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "SCA_PythonController",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_PythonController::Parents[] = {
- &SCA_PythonController::Type,
+ "SCA_PythonController",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
+
PyMethodDef SCA_PythonController::Methods[] = {
{"activate", (PyCFunction) SCA_PythonController::sPyActivate, METH_O},
{"deactivate", (PyCFunction) SCA_PythonController::sPyDeActivate, METH_O},
-
- //Deprecated functions ------>
- {"setScript", (PyCFunction) SCA_PythonController::sPySetScript, METH_O},
- {"getScript", (PyCFunction) SCA_PythonController::sPyGetScript, METH_NOARGS},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -490,22 +455,6 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
m_sCurrentController = NULL;
}
-
-
-PyObject* SCA_PythonController::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_PythonController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
-int SCA_PythonController::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IController);
-}
-
PyObject* SCA_PythonController::PyActivate(PyObject *value)
{
if(m_sCurrentController != this) {
@@ -536,44 +485,22 @@ PyObject* SCA_PythonController::PyDeActivate(PyObject *value)
Py_RETURN_NONE;
}
-/* 1. getScript */
-PyObject* SCA_PythonController::PyGetScript()
-{
- ShowDeprecationWarning("getScript()", "the script property");
- return PyString_FromString(m_scriptText);
-}
-
-/* 2. setScript */
-PyObject* SCA_PythonController::PySetScript(PyObject* value)
-{
- char *scriptArg = PyString_AsString(value);
-
- ShowDeprecationWarning("setScript()", "the script property");
-
- if (scriptArg==NULL) {
- PyErr_SetString(PyExc_TypeError, "expected a string (script name)");
- return NULL;
- }
-
- /* set scripttext sets m_bModified to true,
- so next time the script is needed, a reparse into byte code is done */
-
- this->SetScriptText(scriptArg);
-
- Py_RETURN_NONE;
-}
-
PyObject* SCA_PythonController::pyattr_get_script(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
+ //SCA_PythonController* self= static_cast<SCA_PythonController*>(static_cast<SCA_IController*>(static_cast<SCA_ILogicBrick*>(static_cast<CValue*>(static_cast<PyObjectPlus*>(self_v)))));
+ // static_cast<void *>(dynamic_cast<Derived *>(obj)) - static_cast<void *>(obj)
+
SCA_PythonController* self= static_cast<SCA_PythonController*>(self_v);
- return PyString_FromString(self->m_scriptText);
+ return PyUnicode_FromString(self->m_scriptText);
}
+
+
int SCA_PythonController::pyattr_set_script(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
SCA_PythonController* self= static_cast<SCA_PythonController*>(self_v);
- char *scriptArg = PyString_AsString(value);
+ char *scriptArg = _PyUnicode_AsString(value);
if (scriptArg==NULL) {
PyErr_SetString(PyExc_TypeError, "controller.script = string: Python Controller, expected a string script text");
diff --git a/source/gameengine/GameLogic/SCA_PythonController.h b/source/gameengine/GameLogic/SCA_PythonController.h
index 0c2af79c3a3..9311b3f355e 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.h
+++ b/source/gameengine/GameLogic/SCA_PythonController.h
@@ -72,7 +72,7 @@ class SCA_PythonController : public SCA_IController
//virtual CValue* AddRef();
//virtual int Release(); // Release a reference to this value (when reference count reaches 0, the value is removed from the heap)
- SCA_PythonController(SCA_IObject* gameobj, int mode, PyTypeObject* T = &Type);
+ SCA_PythonController(SCA_IObject* gameobj, int mode);
virtual ~SCA_PythonController();
virtual CValue* GetReplica();
@@ -96,10 +96,6 @@ class SCA_PythonController : public SCA_IController
static PyObject* sPyAddActiveActuator(PyObject* self,
PyObject* args);
static SCA_IActuator* LinkedActuatorFromPy(PyObject *value);
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
KX_PYMETHOD_O(SCA_PythonController,Activate);
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index a722590dd10..8f9482b7826 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -50,9 +50,8 @@ SCA_RandomActuator::SCA_RandomActuator(SCA_IObject *gameobj,
SCA_RandomActuator::KX_RANDOMACT_MODE mode,
float para1,
float para2,
- const STR_String &propName,
- PyTypeObject* T)
- : SCA_IActuator(gameobj, T),
+ const STR_String &propName)
+ : SCA_IActuator(gameobj, KX_ACT_RANDOM),
m_propname(propName),
m_parameter1(para1),
m_parameter2(para2),
@@ -316,13 +315,7 @@ void SCA_RandomActuator::enforceConstraints() {
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_RandomActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_RandomActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -332,31 +325,18 @@ PyTypeObject SCA_RandomActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_RandomActuator::Parents[] = {
- &SCA_RandomActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_RandomActuator::Methods[] = {
- //Deprecated functions ------>
- {"setSeed", (PyCFunction) SCA_RandomActuator::sPySetSeed, METH_VARARGS, (PY_METHODCHAR)SetSeed_doc},
- {"getSeed", (PyCFunction) SCA_RandomActuator::sPyGetSeed, METH_NOARGS, (PY_METHODCHAR)GetSeed_doc},
- {"getPara1", (PyCFunction) SCA_RandomActuator::sPyGetPara1, METH_NOARGS, (PY_METHODCHAR)GetPara1_doc},
- {"getPara2", (PyCFunction) SCA_RandomActuator::sPyGetPara2, METH_NOARGS, (PY_METHODCHAR)GetPara2_doc},
- {"getDistribution", (PyCFunction) SCA_RandomActuator::sPyGetDistribution, METH_NOARGS, (PY_METHODCHAR)GetDistribution_doc},
- {"setProperty", (PyCFunction) SCA_RandomActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"getProperty", (PyCFunction) SCA_RandomActuator::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
- //<----- Deprecated
KX_PYMETHODTABLE(SCA_RandomActuator, setBoolConst),
KX_PYMETHODTABLE_NOARGS(SCA_RandomActuator, setBoolUniform),
KX_PYMETHODTABLE(SCA_RandomActuator, setBoolBernouilli),
@@ -384,14 +364,14 @@ PyAttributeDef SCA_RandomActuator::Attributes[] = {
PyObject* SCA_RandomActuator::pyattr_get_seed(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_RandomActuator* act = static_cast<SCA_RandomActuator*>(self);
- return PyInt_FromLong(act->m_base->GetSeed());
+ return PyLong_FromSsize_t(act->m_base->GetSeed());
}
int SCA_RandomActuator::pyattr_set_seed(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
SCA_RandomActuator* act = static_cast<SCA_RandomActuator*>(self);
- if (PyInt_Check(value)) {
- int ival = PyInt_AsLong(value);
+ if (PyLong_Check(value)) {
+ int ival = PyLong_AsSsize_t(value);
act->m_base->SetSeed(ival);
return PY_SET_ATTR_SUCCESS;
} else {
@@ -400,117 +380,6 @@ int SCA_RandomActuator::pyattr_set_seed(void *self, const struct KX_PYATTRIBUTE_
}
}
-PyObject* SCA_RandomActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* SCA_RandomActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int SCA_RandomActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-/* 1. setSeed */
-const char SCA_RandomActuator::SetSeed_doc[] =
-"setSeed(seed)\n"
-"\t- seed: integer\n"
-"\tSet the initial seed of the generator. Equal seeds produce\n"
-"\tequal series. If the seed is 0, the generator will produce\n"
-"\tthe same value on every call.\n";
-PyObject* SCA_RandomActuator::PySetSeed(PyObject* args) {
- ShowDeprecationWarning("setSeed()", "the seed property");
- long seedArg;
- if(!PyArg_ParseTuple(args, "i:setSeed", &seedArg)) {
- return NULL;
- }
-
- m_base->SetSeed(seedArg);
-
- Py_RETURN_NONE;
-}
-/* 2. getSeed */
-const char SCA_RandomActuator::GetSeed_doc[] =
-"getSeed()\n"
-"\tReturns the initial seed of the generator. Equal seeds produce\n"
-"\tequal series.\n";
-PyObject* SCA_RandomActuator::PyGetSeed()
-{
- ShowDeprecationWarning("getSeed()", "the seed property");
- return PyInt_FromLong(m_base->GetSeed());
-}
-
-/* 4. getPara1 */
-const char SCA_RandomActuator::GetPara1_doc[] =
-"getPara1()\n"
-"\tReturns the first parameter of the active distribution. Refer\n"
-"\tto the documentation of the generator types for the meaning\n"
-"\tof this value.";
-PyObject* SCA_RandomActuator::PyGetPara1()
-{
- ShowDeprecationWarning("getPara1()", "the para1 property");
- return PyFloat_FromDouble(m_parameter1);
-}
-
-/* 6. getPara2 */
-const char SCA_RandomActuator::GetPara2_doc[] =
-"getPara2()\n"
-"\tReturns the first parameter of the active distribution. Refer\n"
-"\tto the documentation of the generator types for the meaning\n"
-"\tof this value.";
-PyObject* SCA_RandomActuator::PyGetPara2()
-{
- ShowDeprecationWarning("getPara2()", "the para2 property");
- return PyFloat_FromDouble(m_parameter2);
-}
-
-/* 8. getDistribution */
-const char SCA_RandomActuator::GetDistribution_doc[] =
-"getDistribution()\n"
-"\tReturns the type of the active distribution.\n";
-PyObject* SCA_RandomActuator::PyGetDistribution()
-{
- ShowDeprecationWarning("getDistribution()", "the distribution property");
- return PyInt_FromLong(m_distribution);
-}
-
-/* 9. setProperty */
-const char SCA_RandomActuator::SetProperty_doc[] =
-"setProperty(name)\n"
-"\t- name: string\n"
-"\tSet the property to which the random value is assigned. If the \n"
-"\tgenerator and property types do not match, the assignment is ignored.\n";
-PyObject* SCA_RandomActuator::PySetProperty(PyObject* args) {
- ShowDeprecationWarning("setProperty()", "the 'propName' property");
- char *nameArg;
- if (!PyArg_ParseTuple(args, "s:setProperty", &nameArg)) {
- return NULL;
- }
-
- CValue* prop = GetParent()->FindIdentifier(nameArg);
-
- if (!prop->IsError()) {
- m_propname = nameArg;
- } else {
- ; /* not found ... */
- }
- prop->Release();
-
- Py_RETURN_NONE;
-}
-/* 10. getProperty */
-const char SCA_RandomActuator::GetProperty_doc[] =
-"getProperty(name)\n"
-"\tReturn the property to which the random value is assigned. If the \n"
-"\tgenerator and property types do not match, the assignment is ignored.\n";
-PyObject* SCA_RandomActuator::PyGetProperty()
-{
- ShowDeprecationWarning("getProperty()", "the 'propName' property");
- return PyString_FromString(m_propname);
-}
-
/* 11. setBoolConst */
KX_PYMETHODDEF_DOC_VARARGS(SCA_RandomActuator, setBoolConst,
"setBoolConst(value)\n"
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.h b/source/gameengine/GameLogic/SCA_RandomActuator.h
index 59863589b60..f84c44b43c9 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.h
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.h
@@ -85,8 +85,7 @@ class SCA_RandomActuator : public SCA_IActuator
KX_RANDOMACT_MODE mode,
float para1,
float para2,
- const STR_String &propName,
- PyTypeObject* T=&Type);
+ const STR_String &propName);
virtual ~SCA_RandomActuator();
virtual bool Update();
@@ -97,23 +96,9 @@ class SCA_RandomActuator : public SCA_IActuator
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
static PyObject* pyattr_get_seed(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_seed(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- // Deprecated methods ----->
- KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator,SetSeed);
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator,GetSeed);
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator,GetPara1);
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator,GetPara2);
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator,GetDistribution);
- KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator,SetProperty);
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator,GetProperty);
- // <-----
-
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setBoolConst);
KX_PYMETHOD_DOC_NOARGS(SCA_RandomActuator, setBoolUniform);
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setBoolBernouilli);
diff --git a/source/gameengine/GameLogic/SCA_RandomEventManager.h b/source/gameengine/GameLogic/SCA_RandomEventManager.h
index 79138c23c62..c8b511b87b7 100644
--- a/source/gameengine/GameLogic/SCA_RandomEventManager.h
+++ b/source/gameengine/GameLogic/SCA_RandomEventManager.h
@@ -45,6 +45,13 @@ public:
SCA_RandomEventManager(class SCA_LogicManager* logicmgr);
virtual void NextFrame();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_RANDOMEVENTMGR
diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
index 842a0331752..f986fadeaf0 100644
--- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
+++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
@@ -34,6 +34,10 @@
#ifndef __KX_RANDOMNUMBERGENERATOR
#define __KX_RANDOMNUMBERGENERATOR
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class SCA_RandomNumberGenerator {
/* reference counted for memleak */
@@ -69,6 +73,13 @@ class SCA_RandomNumberGenerator {
if (--m_refcount == 0)
delete this;
}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_RandomNumberGenerator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif /* __KX_RANDOMNUMBERGENERATOR */
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.cpp b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
index d5cbeef01ae..890875e61c6 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
@@ -46,9 +46,8 @@
SCA_RandomSensor::SCA_RandomSensor(SCA_EventManager* eventmgr,
SCA_IObject* gameobj,
- int startseed,
- PyTypeObject* T)
- : SCA_ISensor(gameobj,eventmgr, T)
+ int startseed)
+ : SCA_ISensor(gameobj,eventmgr)
{
m_basegenerator = new SCA_RandomNumberGenerator(startseed);
Init();
@@ -131,13 +130,7 @@ bool SCA_RandomSensor::Evaluate()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_RandomSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_RandomSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -147,27 +140,18 @@ PyTypeObject SCA_RandomSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_RandomSensor::Parents[] = {
- &SCA_RandomSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_RandomSensor::Methods[] = {
- //Deprecated functions ----->
- {"setSeed", (PyCFunction) SCA_RandomSensor::sPySetSeed, METH_VARARGS, (PY_METHODCHAR)SetSeed_doc},
- {"getSeed", (PyCFunction) SCA_RandomSensor::sPyGetSeed, METH_NOARGS, (PY_METHODCHAR)GetSeed_doc},
- {"getLastDraw", (PyCFunction) SCA_RandomSensor::sPyGetLastDraw, METH_NOARGS, (PY_METHODCHAR)GetLastDraw_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -177,72 +161,20 @@ PyAttributeDef SCA_RandomSensor::Attributes[] = {
{NULL} //Sentinel
};
-PyObject* SCA_RandomSensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* SCA_RandomSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int SCA_RandomSensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ISensor);
-}
-
-/* 1. setSeed */
-const char SCA_RandomSensor::SetSeed_doc[] =
-"setSeed(seed)\n"
-"\t- seed: integer\n"
-"\tSet the initial seed of the generator. Equal seeds produce\n"
-"\tequal series. If the seed is 0, the generator will produce\n"
-"\tthe same value on every call.\n";
-PyObject* SCA_RandomSensor::PySetSeed(PyObject* args) {
- ShowDeprecationWarning("setSeed()", "the seed property");
- long seedArg;
- if(!PyArg_ParseTuple(args, "i:setSeed", &seedArg)) {
- return NULL;
- }
-
- m_basegenerator->SetSeed(seedArg);
-
- Py_RETURN_NONE;
-}
-
-/* 2. getSeed */
-const char SCA_RandomSensor::GetSeed_doc[] =
-"getSeed()\n"
-"\tReturns the initial seed of the generator. Equal seeds produce\n"
-"\tequal series.\n";
-PyObject* SCA_RandomSensor::PyGetSeed() {
- ShowDeprecationWarning("getSeed()", "the seed property");
- return PyInt_FromLong(m_basegenerator->GetSeed());
-}
-
-/* 3. getLastDraw */
-const char SCA_RandomSensor::GetLastDraw_doc[] =
-"getLastDraw()\n"
-"\tReturn the last value that was drawn.\n";
-PyObject* SCA_RandomSensor::PyGetLastDraw() {
- ShowDeprecationWarning("getLastDraw()", "the lastDraw property");
- return PyInt_FromLong(m_lastdraw);
-}
-
-
PyObject* SCA_RandomSensor::pyattr_get_seed(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
SCA_RandomSensor* self= static_cast<SCA_RandomSensor*>(self_v);
- return PyInt_FromLong(self->m_basegenerator->GetSeed());
+ return PyLong_FromSsize_t(self->m_basegenerator->GetSeed());
}
int SCA_RandomSensor::pyattr_set_seed(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
SCA_RandomSensor* self= static_cast<SCA_RandomSensor*>(self_v);
- if (!PyInt_Check(value)) {
+ if (!PyLong_Check(value)) {
PyErr_SetString(PyExc_TypeError, "sensor.seed = int: Random Sensor, expected an integer");
return PY_SET_ATTR_FAIL;
}
- self->m_basegenerator->SetSeed(PyInt_AsLong(value));
+ self->m_basegenerator->SetSeed(PyLong_AsSsize_t(value));
return PY_SET_ATTR_SUCCESS;
}
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.h b/source/gameengine/GameLogic/SCA_RandomSensor.h
index b2bf2440966..f93cf57370e 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.h
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.h
@@ -48,8 +48,7 @@ class SCA_RandomSensor : public SCA_ISensor
public:
SCA_RandomSensor(class SCA_EventManager* rndmgr,
SCA_IObject* gameobj,
- int startseed,
- PyTypeObject* T=&Type);
+ int startseed);
virtual ~SCA_RandomSensor();
virtual CValue* GetReplica();
virtual void ProcessReplica();
@@ -60,17 +59,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- /* 1. setSeed */
- KX_PYMETHOD_DOC_VARARGS(SCA_RandomSensor,SetSeed);
- /* 2. getSeed */
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomSensor,GetSeed);
- /* 3. getLastDraw */
- KX_PYMETHOD_DOC_NOARGS(SCA_RandomSensor,GetLastDraw);
static PyObject* pyattr_get_seed(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_seed(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
diff --git a/source/gameengine/GameLogic/SCA_TimeEventManager.h b/source/gameengine/GameLogic/SCA_TimeEventManager.h
index bd57e12eb44..089f21e603b 100644
--- a/source/gameengine/GameLogic/SCA_TimeEventManager.h
+++ b/source/gameengine/GameLogic/SCA_TimeEventManager.h
@@ -48,6 +48,13 @@ public:
virtual void RemoveSensor(class SCA_ISensor* sensor);
void AddTimeProperty(CValue* timeval);
void RemoveTimeProperty(CValue* timeval);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_TimeEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_TIMEEVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_XNORController.cpp b/source/gameengine/GameLogic/SCA_XNORController.cpp
index aee8e26c21a..17350feb98b 100644
--- a/source/gameengine/GameLogic/SCA_XNORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XNORController.cpp
@@ -42,10 +42,9 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_XNORController::SCA_XNORController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_XNORController::SCA_XNORController(SCA_IObject* gameobj)
:
- SCA_IController(gameobj,T)
+ SCA_IController(gameobj)
{
}
@@ -104,13 +103,7 @@ CValue* SCA_XNORController::GetReplica()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_XNORController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_XNORController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -120,19 +113,15 @@ PyTypeObject SCA_XNORController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_XNORController::Parents[] = {
- &SCA_XNORController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_XNORController::Methods[] = {
@@ -143,12 +132,4 @@ PyAttributeDef SCA_XNORController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_XNORController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_XNORController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_XNORController.h b/source/gameengine/GameLogic/SCA_XNORController.h
index 4aad5763cb0..18e77fae665 100644
--- a/source/gameengine/GameLogic/SCA_XNORController.h
+++ b/source/gameengine/GameLogic/SCA_XNORController.h
@@ -39,7 +39,7 @@ class SCA_XNORController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_XNORController(SCA_IObject* gameobj,PyTypeObject* T=&Type);
+ SCA_XNORController(SCA_IObject* gameobj);
virtual ~SCA_XNORController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
@@ -48,9 +48,6 @@ public:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_XNORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_XORController.cpp b/source/gameengine/GameLogic/SCA_XORController.cpp
index 5afb3a750f5..a6a7cc25897 100644
--- a/source/gameengine/GameLogic/SCA_XORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XORController.cpp
@@ -42,10 +42,9 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
-SCA_XORController::SCA_XORController(SCA_IObject* gameobj,
- PyTypeObject* T)
+SCA_XORController::SCA_XORController(SCA_IObject* gameobj)
:
- SCA_IController(gameobj,T)
+ SCA_IController(gameobj)
{
}
@@ -104,13 +103,7 @@ CValue* SCA_XORController::GetReplica()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject SCA_XORController::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"SCA_XORController",
sizeof(PyObjectPlus_Proxy),
0,
@@ -120,19 +113,15 @@ PyTypeObject SCA_XORController::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject SCA_XORController::Parents[] = {
- &SCA_XORController::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IController::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef SCA_XORController::Methods[] = {
@@ -143,12 +132,4 @@ PyAttributeDef SCA_XORController::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* SCA_XORController::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IController);
-}
-
-PyObject* SCA_XORController::py_getattro_dict() {
- py_getattro_dict_up(SCA_IController);
-}
-
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_XORController.h b/source/gameengine/GameLogic/SCA_XORController.h
index feb9f2ed07c..2607a533661 100644
--- a/source/gameengine/GameLogic/SCA_XORController.h
+++ b/source/gameengine/GameLogic/SCA_XORController.h
@@ -39,18 +39,10 @@ class SCA_XORController : public SCA_IController
Py_Header;
//virtual void Trigger(class SCA_LogicManager* logicmgr);
public:
- SCA_XORController(SCA_IObject* gameobj,PyTypeObject* T=&Type);
+ SCA_XORController(SCA_IObject* gameobj);
virtual ~SCA_XORController();
virtual CValue* GetReplica();
virtual void Trigger(SCA_LogicManager* logicmgr);
-
- /* --------------------------------------------------------------------- */
- /* Python interface ---------------------------------------------------- */
- /* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
};
#endif //__KX_XORCONTROLLER
diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript
index 91843eef586..1530c71c7f3 100644
--- a/source/gameengine/GameLogic/SConscript
+++ b/source/gameengine/GameLogic/SConscript
@@ -10,16 +10,15 @@ incs += ' #/source/gameengine/Rasterizer #/source/gameengine/SceneGraph'
incs += ' ' + env['BF_PYTHON_INC']
-defs = ''
+defs = []
if env['WITH_BF_SDL']:
incs += ' ' + env['BF_SDL_INC']
else:
- defs += ' DISABLE_SDL'
+ defs.append('DISABLE_SDL')
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ if env['BF_DEBUG']:
+ defs.append('_DEBUG')
-env.BlenderLib ( 'bf_logic', sources, Split(incs), Split(defs), libtype=['core','player'], priority=[330, 100], cxx_compileflags=cxxflags )
+env.BlenderLib ( 'bf_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 134f8fce3b2..7b4fa4892df 100644
--- a/source/gameengine/GamePlayer/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/CMakeLists.txt
@@ -28,5 +28,5 @@ ADD_SUBDIRECTORY(common)
ADD_SUBDIRECTORY(ghost)
IF(WITH_WEBPLUGIN)
- ADD_SUBDIRECTORY(xembed)
+ ADD_SUBDIRECTORY(xembed)
ENDIF(WITH_WEBPLUGIN)
diff --git a/source/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt
index ce1cd217f60..c865cf5ce25 100644
--- a/source/gameengine/GamePlayer/common/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/common/CMakeLists.txt
@@ -25,54 +25,50 @@
# ***** 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
+ 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
- .
- ../../../../intern/string
- ../../../../intern/ghost
- ../../../../intern/guardedalloc
- ../../../../intern/moto/include
- ../../../../intern/SoundSystem
- ../../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
- ../../../../source/kernel/gen_system
- ../../../../source/kernel/gen_messaging
- ../../../../source/gameengine/Converter
- ../../../../source/blender/imbuf
- ../../../../source/gameengine/Ketsji
- ../../../../source/blender/blenlib
- ../../../../source/blender/blenkernel
- ../../../../source/blender
- ../../../../source/blender/include
- ../../../../source/blender/makesdna
- ../../../../source/gameengine/Rasterizer
- ../../../../source/gameengine/GameLogic
- ../../../../source/gameengine/Expressions
- ../../../../source/gameengine/Network
- ../../../../source/gameengine/SceneGraph
- ../../../../source/gameengine/Physics/common
- ../../../../source/gameengine/Physics/Sumo
- ../../../../source/gameengine/Physics/Sumo/Fuzzics/include
- ../../../../source/gameengine/Network/LoopBackNetwork
- ../../../../source/gameengine/GamePlayer/ghost
- ../../../../source/blender/misc
- ../../../../source/blender/blenloader
- ../../../../source/blender/gpu
- ../../../../extern/glew/include
- ${PYTHON_INC}
- ${SOLID_INC}
- ${PNG_INC}
- ${ZLIB_INC}
+ .
+ ../../../../intern/string
+ ../../../../intern/ghost
+ ../../../../intern/guardedalloc
+ ../../../../intern/moto/include
+ ../../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../../source/kernel/gen_system
+ ../../../../source/kernel/gen_messaging
+ ../../../../source/gameengine/Converter
+ ../../../../source/blender/imbuf
+ ../../../../source/gameengine/Ketsji
+ ../../../../source/blender/blenlib
+ ../../../../source/blender/blenkernel
+ ../../../../source/blender
+ ../../../../source/blender/include
+ ../../../../source/blender/makesdna
+ ../../../../source/gameengine/Rasterizer
+ ../../../../source/gameengine/GameLogic
+ ../../../../source/gameengine/Expressions
+ ../../../../source/gameengine/Network
+ ../../../../source/gameengine/SceneGraph
+ ../../../../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}
)
BLENDERLIB_NOLIST(gp_common "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/common/GPC_Engine.cpp b/source/gameengine/GamePlayer/common/GPC_Engine.cpp
index a46f30c1209..85a362d042a 100644
--- a/source/gameengine/GamePlayer/common/GPC_Engine.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_Engine.cpp
@@ -58,7 +58,6 @@
#include "NG_LoopBackNetworkDeviceInterface.h"
#include "RAS_IRenderTools.h"
-#include "SND_DeviceManager.h"
#include "GPC_Engine.h"
#include "GPC_KeyboardDevice.h"
@@ -75,8 +74,7 @@ GPC_Engine::GPC_Engine(char *customLoadingAnimationURL,
m_system(NULL), m_keyboarddev(NULL),
m_mousedev(NULL), m_canvas(NULL), m_rendertools(NULL),
m_portal(NULL), m_sceneconverter(NULL), m_networkdev(NULL),
- m_audiodevice(NULL), m_curarea(NULL),
- m_customLoadingAnimationURL(NULL),
+ m_curarea(NULL), m_customLoadingAnimationURL(NULL),
m_foregroundColor(foregroundColor), m_backgroundColor(backgroundColor),
m_frameRate(frameRate),
m_BlenderLogo(0), m_Blender3DLogo(0)/*, m_NaNLogo(0)*/
@@ -201,7 +199,6 @@ bool GPC_Engine::StartKetsji(void)
m_keyboarddev,
m_mousedev,
m_networkdev,
- m_audiodevice,
m_system);
m_system->SetMainLoop(m_portal->m_ketsjieng);
@@ -337,12 +334,6 @@ void GPC_Engine::Exit()
m_networkdev = 0;
}
- if (m_audiodevice)
- {
- SND_DeviceManager::Unsubscribe();
- m_audiodevice = 0;
- }
-
m_initialized = false;
}
diff --git a/source/gameengine/GamePlayer/common/GPC_Engine.h b/source/gameengine/GamePlayer/common/GPC_Engine.h
index b7121599c6e..42234bcbcd6 100644
--- a/source/gameengine/GamePlayer/common/GPC_Engine.h
+++ b/source/gameengine/GamePlayer/common/GPC_Engine.h
@@ -40,7 +40,6 @@ class RAS_IRenderTools;
class KetsjiPortal;
class KX_ISceneConverter;
class NG_LoopBackNetworkDeviceInterface;
-class SND_IAudioDevice;
class GPC_RawImage;
@@ -77,8 +76,6 @@ public:
KX_ISceneConverter* m_sceneconverter;
/** Network interface. */
NG_LoopBackNetworkDeviceInterface* m_networkdev;
- /** Audiodevice interface */
- SND_IAudioDevice* m_audiodevice;
struct ScrArea *m_curarea; // for future use, not used yet
diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile
index 4a952856739..e1b07a226f6 100644
--- a/source/gameengine/GamePlayer/common/Makefile
+++ b/source/gameengine/GamePlayer/common/Makefile
@@ -47,14 +47,13 @@ CPPFLAGS += -I../../../blender/gpu
CPPFLAGS += -I../../../kernel/gen_system
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_FUZZICS)/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$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I../../../gameengine/Converter
CPPFLAGS += -I../../../gameengine/Expressions
CPPFLAGS += -I../../../gameengine/GameLogic
diff --git a/source/gameengine/GamePlayer/common/SConscript b/source/gameengine/GamePlayer/common/SConscript
index f899385c841..dd5a48c2b55 100644
--- a/source/gameengine/GamePlayer/common/SConscript
+++ b/source/gameengine/GamePlayer/common/SConscript
@@ -19,7 +19,6 @@ incs = ['.',
'#intern/ghost',
'#intern/guardedalloc',
'#intern/moto/include',
- '#intern/SoundSystem',
'#source/gameengine/Rasterizer/RAS_OpenGLRasterizer',
'#source/kernel/gen_system',
'#source/kernel/gen_messaging',
@@ -63,9 +62,4 @@ incs += Split(env['BF_PYTHON_INC'])
incs += Split(env['BF_PNG_INC'])
incs += Split(env['BF_ZLIB_INC'])
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib (libname='gp_common', sources=source_files, includes=incs, defines = [], libtype='player', priority=5, cxx_compileflags=cxxflags)
+env.BlenderLib (libname='gp_common', sources=source_files, includes=incs, defines = [], libtype=['player'], priority=[5], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile
index 08c52ddc904..c86f61b45d8 100644
--- a/source/gameengine/GamePlayer/common/unix/Makefile
+++ b/source/gameengine/GamePlayer/common/unix/Makefile
@@ -56,8 +56,6 @@ CPPFLAGS += -I../../../../gameengine/Rasterizer
CPPFLAGS += -I../../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
CPPFLAGS += -I../../../../gameengine/SceneGraph
-CPPFLAGS += -I$(NAN_FUZZICS)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_MOTO)/include
# Blender stuff
diff --git a/source/gameengine/GamePlayer/common/windows/Makefile b/source/gameengine/GamePlayer/common/windows/Makefile
index b622ee974c8..3f1deb05f3a 100644
--- a/source/gameengine/GamePlayer/common/windows/Makefile
+++ b/source/gameengine/GamePlayer/common/windows/Makefile
@@ -48,7 +48,6 @@ CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/include
CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_GLEW)/include
# Blender stuff
diff --git a/source/gameengine/GamePlayer/ghost/CMakeLists.txt b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
index 0d4abf1e1fe..d50784cb967 100644
--- a/source/gameengine/GamePlayer/ghost/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
@@ -25,53 +25,49 @@
# ***** END GPL LICENSE BLOCK *****
SET(SRC
- GPG_Application.cpp
- GPG_Canvas.cpp
- GPG_ghost.cpp
- GPG_KeyboardDevice.cpp
- GPG_System.cpp
+ GPG_Application.cpp
+ GPG_Canvas.cpp
+ GPG_ghost.cpp
+ GPG_KeyboardDevice.cpp
+ GPG_System.cpp
)
SET(INC
- .
- ../../../../intern/string
- ../../../../intern/ghost
- ../../../../intern/guardedalloc
- ../../../../intern/moto/include
- ../../../../intern/SoundSystem
- ../../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
- ../../../../source/kernel/gen_system
- ../../../../source/kernel/gen_messaging
- ../../../../source/gameengine/Converter
- ../../../../source/blender/imbuf
- ../../../../source/gameengine/Ketsji
- ../../../../source/blender/blenlib
- ../../../../source/blender/blenkernel
- ../../../../source/blender/readblenfile
- ../../../../source/blender
- ../../../../source/blender/include
- ../../../../source/blender/makesdna
- ../../../../source/blender/makesrna
- ../../../../source/gameengine/Rasterizer
- ../../../../source/gameengine/GameLogic
- ../../../../source/gameengine/Expressions
- ../../../../source/gameengine/Network
- ../../../../source/gameengine/SceneGraph
- ../../../../source/gameengine/Physics/common
- ../../../../source/gameengine/Physics/Sumo
- ../../../../source/gameengine/Physics/Sumo/Fuzzics/include
- ../../../../source/gameengine/Network/LoopBackNetwork
- ../../../../source/gameengine/GamePlayer/common
- ../../../../source/blender/misc
- ../../../../source/blender/blenloader
- ../../../../source/blender/gpu
- ../../../../extern/solid
- ../../../../extern/glew/include
- ${PYTHON_INC}
+ .
+ ../../../../intern/string
+ ../../../../intern/ghost
+ ../../../../intern/guardedalloc
+ ../../../../intern/moto/include
+ ../../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../../source/kernel/gen_system
+ ../../../../source/kernel/gen_messaging
+ ../../../../source/gameengine/Converter
+ ../../../../source/blender/imbuf
+ ../../../../source/gameengine/Ketsji
+ ../../../../source/blender/blenlib
+ ../../../../source/blender/blenkernel
+ ../../../../source/blender/readblenfile
+ ../../../../source/blender
+ ../../../../source/blender/include
+ ../../../../source/blender/makesdna
+ ../../../../source/blender/makesrna
+ ../../../../source/gameengine/Rasterizer
+ ../../../../source/gameengine/GameLogic
+ ../../../../source/gameengine/Expressions
+ ../../../../source/gameengine/Network
+ ../../../../source/gameengine/SceneGraph
+ ../../../../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}
)
IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
BLENDERLIB_NOLIST(gp_ghost "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index e5932180fe1..8ec41968042 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -57,6 +57,7 @@ extern "C"
#include "BLO_readfile.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_sound.h"
#include "IMB_imbuf.h"
#include "DNA_scene_types.h"
#ifdef __cplusplus
@@ -84,7 +85,6 @@ extern "C"
#include "KX_BlenderSceneConverter.h"
#include "NG_LoopBackNetworkDeviceInterface.h"
-#include "SND_DeviceManager.h"
#include "GPC_MouseDevice.h"
#include "GPC_RenderTools.h"
@@ -125,8 +125,7 @@ GPG_Application::GPG_Application(GHOST_ISystem* system)
m_rendertools(0),
m_rasterizer(0),
m_sceneconverter(0),
- m_networkdevice(0),
- m_audiodevice(0),
+ m_networkdevice(0),
m_blendermat(0),
m_blenderglslmat(0),
m_pyGlobalDictString(0),
@@ -524,16 +523,17 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
// SYS_WriteCommandLineInt(syshandle, "fixedtime", 0);
// SYS_WriteCommandLineInt(syshandle, "vertexarrays",1);
+ GameData *gm= &m_startScene->gm;
bool properties = (SYS_GetCommandLineInt(syshandle, "show_properties", 0) != 0);
bool profile = (SYS_GetCommandLineInt(syshandle, "show_profile", 0) != 0);
- bool fixedFr = (G.fileflags & G_FILE_ENABLE_ALL_FRAMES);
+ bool fixedFr = (gm->flag & GAME_ENABLE_ALL_FRAMES);
- bool showPhysics = (G.fileflags & G_FILE_SHOW_PHYSICS);
+ bool showPhysics = (gm->flag & GAME_SHOW_PHYSICS);
SYS_WriteCommandLineInt(syshandle, "show_physics", showPhysics);
bool fixed_framerate= (SYS_GetCommandLineInt(syshandle, "fixed_framerate", fixedFr) != 0);
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
- bool useLists = (SYS_GetCommandLineInt(syshandle, "displaylists", G.fileflags & G_FILE_DISPLAY_LISTS) != 0);
+ bool useLists = (SYS_GetCommandLineInt(syshandle, "displaylists", gm->flag & GAME_DISPLAY_LISTS) != 0);
bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 1) != 0);
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
@@ -541,7 +541,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
if(GPU_extensions_minimum_support())
m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
- else if(G.fileflags & G_FILE_GAME_MAT_GLSL)
+ else if(gm->matmode == GAME_MAT_GLSL)
m_blendermat = false;
// create the canvas, rasterizer and rendertools
@@ -583,13 +583,8 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
if (!m_networkdevice)
goto initFailed;
- // get an audiodevice
- SND_DeviceManager::Subscribe();
- m_audiodevice = SND_DeviceManager::Instance();
- if (!m_audiodevice)
- goto initFailed;
- m_audiodevice->UseCD();
-
+ sound_init();
+
// create a ketsjisystem (only needed for timing and stuff)
m_kxsystem = new GPG_System (m_system);
if (!m_kxsystem)
@@ -606,7 +601,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetRenderTools(m_rendertools);
m_ketsjiengine->SetRasterizer(m_rasterizer);
m_ketsjiengine->SetNetworkDevice(m_networkdevice);
- m_ketsjiengine->SetAudioDevice(m_audiodevice);
+
m_ketsjiengine->SetTimingDisplay(frameRate, false, false);
CValue::SetDeprecationWarnings(nodepwarnings);
@@ -619,8 +614,8 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
return m_engineInitialized;
initFailed:
+ sound_exit();
delete m_kxsystem;
- delete m_audiodevice;
delete m_networkdevice;
delete m_mouse;
delete m_keyboard;
@@ -633,7 +628,6 @@ initFailed:
m_keyboard = NULL;
m_mouse = NULL;
m_networkdevice = NULL;
- m_audiodevice = NULL;
m_kxsystem = NULL;
return false;
}
@@ -671,15 +665,14 @@ bool GPG_Application::startEngine(void)
// if (always_use_expand_framing)
// sceneconverter->SetAlwaysUseExpandFraming(true);
- if(m_blendermat && (G.fileflags & G_FILE_GAME_MAT))
+ if(m_blendermat && (m_startScene->gm.matmode != GAME_MAT_TEXFACE))
m_sceneconverter->SetMaterials(true);
- if(m_blenderglslmat && (G.fileflags & G_FILE_GAME_MAT_GLSL))
+ if(m_blenderglslmat && (m_startScene->gm.matmode == GAME_MAT_GLSL))
m_sceneconverter->SetGLSLMaterials(true);
KX_Scene* startscene = new KX_Scene(m_keyboard,
m_mouse,
m_networkdevice,
- m_audiodevice,
startscenename,
m_startScene);
@@ -700,18 +693,16 @@ bool GPG_Application::startEngine(void)
#endif
//initialize Dome Settings
- if(m_startScene->r.stereomode == RAS_IRasterizer::RAS_STEREO_DOME)
- m_ketsjiengine->InitDome(m_startScene->r.domeres, m_startScene->r.domemode, m_startScene->r.domeangle, m_startScene->r.domeresbuf, m_startScene->r.dometilt, m_startScene->r.dometext);
+ 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);
// 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);
m_sceneconverter->ConvertScene(
- startscenename,
startscene,
dictionaryobject,
- m_keyboard,
m_rendertools,
m_canvas);
m_ketsjiengine->AddScene(startscene);
@@ -771,6 +762,7 @@ void GPG_Application::stopEngine()
void GPG_Application::exitEngine()
{
+ sound_exit();
if (m_ketsjiengine)
{
stopEngine();
@@ -782,11 +774,6 @@ void GPG_Application::exitEngine()
delete m_kxsystem;
m_kxsystem = 0;
}
- if (m_audiodevice)
- {
- SND_DeviceManager::Unsubscribe();
- m_audiodevice = 0;
- }
if (m_networkdevice)
{
delete m_networkdevice;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h
index 845686f5770..73430213078 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h
@@ -38,7 +38,6 @@
class KX_KetsjiEngine;
class KX_ISceneConverter;
class NG_LoopBackNetworkDeviceInterface;
-class SND_IAudioDevice;
class RAS_IRasterizer;
class GHOST_IEvent;
class GHOST_ISystem;
@@ -142,8 +141,6 @@ protected:
KX_ISceneConverter* m_sceneconverter;
/** Network interface. */
NG_LoopBackNetworkDeviceInterface* m_networkdevice;
- /** Sound device. */
- SND_IAudioDevice* m_audiodevice;
bool m_blendermat;
bool m_blenderglslmat;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 2433c587179..fb2e1c72a85 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -61,12 +61,16 @@ extern "C"
#include "BKE_report.h"
#include "BLI_blenlib.h"
#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
#include "BLO_readfile.h"
#include "BLO_readblenfile.h"
#include "IMB_imbuf.h"
int GHOST_HACK_getFirstFile(char buf[]);
+extern char bprogname[]; /* holds a copy of argv[0], from creator.c */
+extern char btempdir[]; /* use this to store a valid temp directory */
+
#ifdef __cplusplus
}
#endif // __cplusplus
@@ -387,6 +391,13 @@ int main(int argc, char** argv)
}
}
#endif
+ // XXX add the ability to change this values to the command line parsing.
+ U.mixbufsize = 2048;
+ U.audiodevice = 2;
+ U.audiorate = 44100;
+ U.audioformat = 0x24;
+ U.audiochannels = 2;
+
for (i = 1; (i < argc) && !error
#ifdef WIN32
&& scr_saver_mode == SCREEN_SAVER_MODE_NONE
diff --git a/source/gameengine/GamePlayer/ghost/Makefile b/source/gameengine/GamePlayer/ghost/Makefile
index 49ad9457ee3..a7fcf46b695 100644
--- a/source/gameengine/GamePlayer/ghost/Makefile
+++ b/source/gameengine/GamePlayer/ghost/Makefile
@@ -39,7 +39,6 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I../../GamePlayer/common
diff --git a/source/gameengine/GamePlayer/ghost/SConscript b/source/gameengine/GamePlayer/ghost/SConscript
index 19234cb663c..fdd7792b72a 100644
--- a/source/gameengine/GamePlayer/ghost/SConscript
+++ b/source/gameengine/GamePlayer/ghost/SConscript
@@ -13,7 +13,6 @@ incs = ['.',
'#intern/ghost',
'#intern/guardedalloc',
'#intern/moto/include',
- '#intern/SoundSystem',
'#source/gameengine/Rasterizer/RAS_OpenGLRasterizer',
'#source/kernel/gen_system',
'#source/kernel/gen_messaging',
@@ -43,13 +42,8 @@ incs = ['.',
incs += Split(env['BF_PYTHON_INC'])
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-defs = ''
+defs = []
if env['WITH_BF_FFMPEG']:
- defs += ' WITH_FFMPEG'
+ defs.append('WITH_FFMPEG')
-env.BlenderLib (libname='gp_ghost', sources=source_files, includes = incs, defines = Split(defs), libtype='player',priority=5, cxx_compileflags=cxxflags)
+env.BlenderLib (libname='gp_ghost', sources=source_files, includes = incs, defines = defs, libtype=['player'],priority=[0], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.cpp b/source/gameengine/Ketsji/BL_BlenderShader.cpp
index a0a61d01bb2..109a693ec6d 100644
--- a/source/gameengine/Ketsji/BL_BlenderShader.cpp
+++ b/source/gameengine/Ketsji/BL_BlenderShader.cpp
@@ -44,7 +44,7 @@ void BL_BlenderShader::SetProg(bool enable, double time)
{
if(VerifyShader()) {
if(enable)
- GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time);
+ GPU_material_bind(mGPUMat, mLightLayer, mBlenderScene->lay, time, 1);
else
GPU_material_unbind(mGPUMat);
}
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.h b/source/gameengine/Ketsji/BL_BlenderShader.h
index 9af53bfc863..073ce8f1ca5 100644
--- a/source/gameengine/Ketsji/BL_BlenderShader.h
+++ b/source/gameengine/Ketsji/BL_BlenderShader.h
@@ -57,6 +57,13 @@ public:
int GetBlendMode();
bool Equals(BL_BlenderShader *blshader);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderShader"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif//__BL_GPUSHADER_H__
diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h
index 4f572f95891..6b53e7fa8b1 100644
--- a/source/gameengine/Ketsji/BL_Material.h
+++ b/source/gameengine/Ketsji/BL_Material.h
@@ -4,6 +4,10 @@
#include "STR_String.h"
#include "MT_Point2.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
// --
struct MTex;
struct Material;
@@ -98,6 +102,13 @@ public:
void SetSharedMaterial(bool v);
bool IsShared();
void SetUsers(int num);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Material"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
// BL_Material::IdMode
diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp
index c5c517c8a65..f548bcdaae1 100644
--- a/source/gameengine/Ketsji/BL_Shader.cpp
+++ b/source/gameengine/Ketsji/BL_Shader.cpp
@@ -113,8 +113,8 @@ bool BL_Shader::Ok()const
return (mShader !=0 && mOk && mUse);
}
-BL_Shader::BL_Shader(PyTypeObject *T)
-: PyObjectPlus(T),
+BL_Shader::BL_Shader()
+: PyObjectPlus(),
mShader(0),
mPass(1),
mOk(0),
@@ -728,17 +728,6 @@ void BL_Shader::SetUniform(int uniform, const int* val, int len)
}
}
-
-PyObject* BL_Shader::py_getattro(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* BL_Shader::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-
PyMethodDef BL_Shader::Methods[] =
{
// creation
@@ -776,37 +765,27 @@ PyAttributeDef BL_Shader::Attributes[] = {
};
PyTypeObject BL_Shader::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "BL_Shader",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-PyParentObject BL_Shader::Parents[] = {
- &BL_Shader::Type,
+ "BL_Shader",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
KX_PYMETHODDEF_DOC( BL_Shader, setSource," setSource(vertexProgram, fragmentProgram)" )
{
if(mShader !=0 && mOk )
@@ -848,17 +827,17 @@ KX_PYMETHODDEF_DOC( BL_Shader, delSource, "delSource( )" )
KX_PYMETHODDEF_DOC( BL_Shader, isValid, "isValid()" )
{
- return PyInt_FromLong( ( mShader !=0 && mOk ) );
+ return PyLong_FromSsize_t( ( mShader !=0 && mOk ) );
}
KX_PYMETHODDEF_DOC( BL_Shader, getVertexProg ,"getVertexProg( )" )
{
- return PyString_FromString(vertProg?vertProg:"");
+ return PyUnicode_FromString(vertProg?vertProg:"");
}
KX_PYMETHODDEF_DOC( BL_Shader, getFragmentProg ,"getFragmentProg( )" )
{
- return PyString_FromString(fragProg?fragProg:"");
+ return PyUnicode_FromString(fragProg?fragProg:"");
}
KX_PYMETHODDEF_DOC( BL_Shader, validate, "validate()")
@@ -1223,7 +1202,7 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformiv, "setUniformiv( uniform_name, (list2
for(unsigned int i=0; (i<list_size && i<4); i++)
{
PyObject *item = PySequence_GetItem(listPtr, i);
- array_data[i] = PyInt_AsLong(item);
+ array_data[i] = PyLong_AsSsize_t(item);
Py_DECREF(item);
}
diff --git a/source/gameengine/Ketsji/BL_Shader.h b/source/gameengine/Ketsji/BL_Shader.h
index 7db40e778ae..b2610d7762a 100644
--- a/source/gameengine/Ketsji/BL_Shader.h
+++ b/source/gameengine/Ketsji/BL_Shader.h
@@ -25,6 +25,12 @@ public:
{
}
int mLoc; // Sampler location
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Sampler"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/**
@@ -65,6 +71,13 @@ public:
int GetLocation() { return mLoc; }
void* getData() { return mData; }
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Uniform"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/**
@@ -83,6 +96,13 @@ public:
int mType;
int mLoc;
unsigned int mFlag;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_DefUniform"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/**
@@ -120,7 +140,7 @@ private:
void ClearUniforms();
public:
- BL_Shader(PyTypeObject *T=&Type);
+ BL_Shader();
virtual ~BL_Shader();
// Unused for now tangent is set as
@@ -202,9 +222,7 @@ public:
void SetUniform(int uniform, const int val);
// Python interface
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual PyObject* py_repr(void) { return PyString_FromFormat("BL_Shader\n\tvertex shader:%s\n\n\tfragment shader%s\n\n", vertProg, fragProg); }
+ virtual PyObject* py_repr(void) { return PyUnicode_FromFormat("BL_Shader\n\tvertex shader:%s\n\n\tfragment shader%s\n\n", vertProg, fragProg); }
// -----------------------------------
KX_PYMETHOD_DOC( BL_Shader, setSource );
diff --git a/source/gameengine/Ketsji/BL_Texture.h b/source/gameengine/Ketsji/BL_Texture.h
index 830ffceb0f7..2dfd9c542d3 100644
--- a/source/gameengine/Ketsji/BL_Texture.h
+++ b/source/gameengine/Ketsji/BL_Texture.h
@@ -67,6 +67,12 @@ public:
return tmp;
}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Texture"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif//__BL_TEXTURE_H__
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index ee1ff2c6502..01d369bc7a9 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -26,59 +26,47 @@
FILE(GLOB SRC *.cpp)
-#XXX disabled for 2.5 because of missing python
-#SET(SRC
-# ${SRC}
-# ../../../source/blender/python/api2_2x/Mathutils.c
-# ../../../source/blender/python/api2_2x/Geometry.c
-# ../../../source/blender/python/api2_2x/constant.c
-# ../../../source/blender/python/api2_2x/euler.c
-# ../../../source/blender/python/api2_2x/matrix.c
-# ../../../source/blender/python/api2_2x/quat.c
-# ../../../source/blender/python/api2_2x/vector.c
-# ../../../source/blender/python/api2_2x/bpy_internal_import.c
-# ../../../source/blender/python/api2_2x/BGL.c
-#)
-
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/guardedalloc
- ../../../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/blenkernel
- ../../../source/blender/python
- ../../../source/blender/python/generic
- ../../../source/blender
- ../../../source/blender/include
- ../../../source/blender/makesdna
- ../../../source/gameengine/Rasterizer
- ../../../source/gameengine/GameLogic
- ../../../source/gameengine/Expressions
- ../../../source/gameengine/Ketsji/KXNetwork
- ../../../source/gameengine/Network
- ../../../source/gameengine/SceneGraph
- ../../../source/gameengine/Physics/common
- ../../../source/gameengine/Physics/Bullet
- ../../../source/gameengine/Physics/Sumo
- ../../../source/gameengine/Physics/Sumo/Fuzzics/include
- ../../../source/gameengine/Network/LoopBackNetwork
- ../../../intern/SoundSystem
- ../../../source/blender/misc
- ../../../source/blender/blenloader
- ../../../source/blender/gpu
- ../../../extern/bullet2/src
- ../../../extern/solid
- ../../../extern/glew/include
- ${PYTHON_INC}
- ${SDL_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/guardedalloc
+ ../../../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/blenkernel
+ ../../../source/blender/python
+ ../../../source/blender/python/generic
+ ../../../source/blender
+ ../../../source/blender/include
+ ../../../source/blender/makesdna
+ ../../../source/gameengine/Rasterizer
+ ../../../source/gameengine/GameLogic
+ ../../../source/gameengine/Expressions
+ ../../../source/gameengine/Ketsji/KXNetwork
+ ../../../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
+ ${PYTHON_INC}
)
+IF(WITH_SDL)
+ SET(INC ${INC} ${SDL_INCLUDE_DIR})
+ELSE(WITH_SDL)
+ ADD_DEFINITIONS(-DDISABLE_SDL)
+ENDIF(WITH_SDL)
+
BLENDERLIB(bf_ketsji "${SRC}" "${INC}")
#env.BlenderLib ( 'bf_ketsji', sources, Split(incs), [], libtype=['game','player'], priority=[25, 72], compileflags = cflags )
diff --git a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
index d9a9fc54f4b..b89b0dcff9f 100644
--- a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
+++ b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
@@ -27,16 +27,16 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../../source/kernel/gen_system
- ../../../../intern/string
- ../../../../intern/moto/include
- ../../../../source/gameengine/Ketsji
- ../../../../source/gameengine/GameLogic
- ../../../../source/gameengine/Expressions
- ../../../../source/gameengine/SceneGraph
- ../../../../source/gameengine/Network
- ${PYTHON_INC}
+ .
+ ../../../../source/kernel/gen_system
+ ../../../../intern/string
+ ../../../../intern/moto/include
+ ../../../../source/gameengine/Ketsji
+ ../../../../source/gameengine/GameLogic
+ ../../../../source/gameengine/Expressions
+ ../../../../source/gameengine/SceneGraph
+ ../../../../source/gameengine/Network
+ ${PYTHON_INC}
)
BLENDERLIB(kx_network "${SRC}" "${INC}")
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
index 63773352d96..1cfab87d78b 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
@@ -41,9 +41,8 @@ KX_NetworkMessageActuator::KX_NetworkMessageActuator(
const STR_String &toPropName,
const STR_String &subject,
int bodyType,
- const STR_String &body,
- PyTypeObject* T) :
- SCA_IActuator(gameobj,T),
+ const STR_String &body) :
+ SCA_IActuator(gameobj, KX_ACT_MESSAGE),
m_networkscene(networkscene),
m_toPropName(toPropName),
m_subject(subject),
@@ -102,13 +101,7 @@ CValue* KX_NetworkMessageActuator::GetReplica()
/* Integration hooks -------------------------------------------------- */
PyTypeObject KX_NetworkMessageActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_NetworkMessageActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -118,32 +111,18 @@ PyTypeObject KX_NetworkMessageActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_NetworkMessageActuator::Parents[] = {
- &KX_NetworkMessageActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_NetworkMessageActuator::Methods[] = {
- // Deprecated ----->
- {"setToPropName", (PyCFunction)
- KX_NetworkMessageActuator::sPySetToPropName, METH_VARARGS},
- {"setSubject", (PyCFunction)
- KX_NetworkMessageActuator::sPySetSubject, METH_VARARGS},
- {"setBodyType", (PyCFunction)
- KX_NetworkMessageActuator::sPySetBodyType, METH_VARARGS},
- {"setBody", (PyCFunction)
- KX_NetworkMessageActuator::sPySetBody, METH_VARARGS},
- // <-----
{NULL,NULL} // Sentinel
};
@@ -151,93 +130,6 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = {
KX_PYATTRIBUTE_STRING_RW("propName", 0, 100, false, KX_NetworkMessageActuator, m_toPropName),
KX_PYATTRIBUTE_STRING_RW("subject", 0, 100, false, KX_NetworkMessageActuator, m_subject),
KX_PYATTRIBUTE_BOOL_RW("usePropBody", KX_NetworkMessageActuator, m_bPropBody),
- KX_PYATTRIBUTE_STRING_RW("body", 0, 100, false, KX_NetworkMessageActuator, m_body),
+ KX_PYATTRIBUTE_STRING_RW("body", 0, 16384, false, KX_NetworkMessageActuator, m_body),
{ NULL } //Sentinel
};
-
-PyObject* KX_NetworkMessageActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_NetworkMessageActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_NetworkMessageActuator::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_IActuator);
-}
-
-// Deprecated ----->
-// 1. SetToPropName
-PyObject* KX_NetworkMessageActuator::PySetToPropName(
- PyObject* args,
- PyObject* kwds)
-{
- ShowDeprecationWarning("setToProp()", "the propName property");
- char* ToPropName;
-
- if (PyArg_ParseTuple(args, "s:setToPropName", &ToPropName)) {
- m_toPropName = ToPropName;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-// 2. SetSubject
-PyObject* KX_NetworkMessageActuator::PySetSubject(
- PyObject* args,
- PyObject* kwds)
-{
- ShowDeprecationWarning("setSubject()", "the subject property");
- char* Subject;
-
- if (PyArg_ParseTuple(args, "s:setSubject", &Subject)) {
- m_subject = Subject;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-// 3. SetBodyType
-PyObject* KX_NetworkMessageActuator::PySetBodyType(
- PyObject* args,
- PyObject* kwds)
-{
- ShowDeprecationWarning("setBodyType()", "the usePropBody property");
- int BodyType;
-
- if (PyArg_ParseTuple(args, "i:setBodyType", &BodyType)) {
- m_bPropBody = (BodyType != 0);
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-// 4. SetBody
-PyObject* KX_NetworkMessageActuator::PySetBody(
- PyObject* args,
- PyObject* kwds)
-{
- ShowDeprecationWarning("setBody()", "the body property");
- char* Body;
-
- if (PyArg_ParseTuple(args, "s:setBody", &Body)) {
- m_body = Body;
- }
- else {
- return NULL;
- }
-
- Py_RETURN_NONE;
-}
-
-// <----- Deprecated \ No newline at end of file
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
index cf92fd46fe0..fa7a674c250 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
@@ -50,8 +50,7 @@ public:
const STR_String &toPropName,
const STR_String &subject,
int bodyType,
- const STR_String &body,
- PyTypeObject* T=&Type);
+ const STR_String &body);
virtual ~KX_NetworkMessageActuator();
virtual bool Update();
@@ -61,17 +60,6 @@ public:
/* Python interface ------------------------------------------- */
/* ------------------------------------------------------------ */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // Deprecated ----->
- KX_PYMETHOD(KX_NetworkMessageActuator, SetToPropName);
- KX_PYMETHOD(KX_NetworkMessageActuator, SetSubject);
- KX_PYMETHOD(KX_NetworkMessageActuator, SetBodyType);
- KX_PYMETHOD(KX_NetworkMessageActuator, SetBody);
- // <-----
-
};
#endif //__KX_NETWORKMESSAGEACTUATOR_H
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
index 8ddcd87b66f..392e9dd9d1b 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
@@ -50,11 +50,9 @@ KX_NetworkMessageSensor::KX_NetworkMessageSensor(
class KX_NetworkEventManager* eventmgr, // our eventmanager
class NG_NetworkScene *NetworkScene, // our scene
SCA_IObject* gameobj, // the sensor controlling object
- const STR_String &subject,
- PyTypeObject* T
+ const STR_String &subject
) :
- SCA_ISensor(gameobj,eventmgr,T),
- m_Networkeventmgr(eventmgr),
+ SCA_ISensor(gameobj,eventmgr),
m_NetworkScene(NetworkScene),
m_subject(subject),
m_frame_message_count (0),
@@ -166,13 +164,7 @@ bool KX_NetworkMessageSensor::IsPositiveTrigger()
/* Integration hooks --------------------------------------------------- */
PyTypeObject KX_NetworkMessageSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_NetworkMessageSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -182,39 +174,18 @@ PyTypeObject KX_NetworkMessageSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_NetworkMessageSensor::Parents[] = {
- &KX_NetworkMessageSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_NetworkMessageSensor::Methods[] = {
- // Deprecated ----->
- {"setSubjectFilterText", (PyCFunction)
- KX_NetworkMessageSensor::sPySetSubjectFilterText, METH_O,
- (PY_METHODCHAR)SetSubjectFilterText_doc},
- {"getFrameMessageCount", (PyCFunction)
- KX_NetworkMessageSensor::sPyGetFrameMessageCount, METH_NOARGS,
- (PY_METHODCHAR)GetFrameMessageCount_doc},
- {"getBodies", (PyCFunction)
- KX_NetworkMessageSensor::sPyGetBodies, METH_NOARGS,
- (PY_METHODCHAR)GetBodies_doc},
- {"getSubject", (PyCFunction)
- KX_NetworkMessageSensor::sPyGetSubject, METH_NOARGS,
- (PY_METHODCHAR)GetSubject_doc},
- {"getSubjects", (PyCFunction)
- KX_NetworkMessageSensor::sPyGetSubjects, METH_NOARGS,
- (PY_METHODCHAR)GetSubjects_doc},
- // <-----
{NULL,NULL} //Sentinel
};
@@ -226,18 +197,6 @@ PyAttributeDef KX_NetworkMessageSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_NetworkMessageSensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* KX_NetworkMessageSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int KX_NetworkMessageSensor::py_setattro(PyObject *attr, PyObject *value) {
- return SCA_ISensor::py_setattro(attr, value);
-}
-
PyObject* KX_NetworkMessageSensor::pyattr_get_bodies(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_NetworkMessageSensor *self = static_cast<KX_NetworkMessageSensor*>(self_v);
@@ -257,75 +216,3 @@ PyObject* KX_NetworkMessageSensor::pyattr_get_subjects(void *self_v, const KX_PY
return (new CListValue())->NewProxy(true);
}
}
-
-// Deprecated ----->
-// 1. Set the message subject that this sensor listens for
-const char KX_NetworkMessageSensor::SetSubjectFilterText_doc[] =
-"\tsetSubjectFilterText(value)\n"
-"\tChange the message subject text that this sensor is listening to.\n";
-
-PyObject* KX_NetworkMessageSensor::PySetSubjectFilterText(PyObject* value)
-{
- ShowDeprecationWarning("setSubjectFilterText()", "subject");
- char* Subject = PyString_AsString(value);
- if (Subject==NULL) {
- PyErr_SetString(PyExc_TypeError, "sensor.tsetSubjectFilterText(string): KX_NetworkMessageSensor, expected a string message");
- return NULL;
- }
-
- m_subject = Subject;
- Py_RETURN_NONE;
-}
-
-// 2. Get the number of messages received since the last frame
-const char KX_NetworkMessageSensor::GetFrameMessageCount_doc[] =
-"\tgetFrameMessageCount()\n"
-"\tGet the number of messages received since the last frame.\n";
-
-PyObject* KX_NetworkMessageSensor::PyGetFrameMessageCount()
-{
- ShowDeprecationWarning("getFrameMessageCount()", "frameMessageCount");
- return PyInt_FromLong(long(m_frame_message_count));
-}
-
-// 3. Get the message bodies
-const char KX_NetworkMessageSensor::GetBodies_doc[] =
-"\tgetBodies()\n"
-"\tGet the list of message bodies.\n";
-
-PyObject* KX_NetworkMessageSensor::PyGetBodies()
-{
- ShowDeprecationWarning("getBodies()", "bodies");
- if (m_BodyList) {
- return m_BodyList->GetProxy();
- } else {
- return (new CListValue())->NewProxy(true);
- }
-}
-
-// 4. Get the message subject: field of the message sensor
-const char KX_NetworkMessageSensor::GetSubject_doc[] =
-"\tgetSubject()\n"
-"\tGet the subject: field of the message sensor.\n";
-
-PyObject* KX_NetworkMessageSensor::PyGetSubject()
-{
- ShowDeprecationWarning("getSubject()", "subject");
- return PyString_FromString(m_subject ? m_subject : "");
-}
-
-// 5. Get the message subjects
-const char KX_NetworkMessageSensor::GetSubjects_doc[] =
-"\tgetSubjects()\n"
-"\tGet list of message subjects.\n";
-
-PyObject* KX_NetworkMessageSensor::PyGetSubjects()
-{
- ShowDeprecationWarning("getSubjects()", "subjects");
- if (m_SubjectList) {
- return m_SubjectList->GetProxy();
- } else {
- return (new CListValue())->NewProxy(true);
- }
-}
-// <----- Deprecated \ No newline at end of file
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
index 53183f33826..d8a0651d2f1 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
@@ -39,7 +39,6 @@ class KX_NetworkMessageSensor : public SCA_ISensor
{
// note: Py_Header MUST BE the first listed here
Py_Header;
- KX_NetworkEventManager *m_Networkeventmgr;
NG_NetworkScene *m_NetworkScene;
// The subject we filter on.
@@ -57,8 +56,7 @@ public:
KX_NetworkEventManager* eventmgr, // our eventmanager
NG_NetworkScene *NetworkScene, // our scene
SCA_IObject* gameobj, // the sensor controlling object
- const STR_String &subject,
- PyTypeObject* T=&Type
+ const STR_String &subject
);
virtual ~KX_NetworkMessageSensor();
@@ -72,18 +70,6 @@ public:
/* Python interface -------------------------------------------- */
/* ------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // Deprecated ----->
- KX_PYMETHOD_DOC_O(KX_NetworkMessageSensor, SetSubjectFilterText);
- KX_PYMETHOD_DOC_NOARGS(KX_NetworkMessageSensor, GetFrameMessageCount);
- KX_PYMETHOD_DOC_NOARGS(KX_NetworkMessageSensor, GetBodies);
- KX_PYMETHOD_DOC_NOARGS(KX_NetworkMessageSensor, GetSubject);
- KX_PYMETHOD_DOC_NOARGS(KX_NetworkMessageSensor, GetSubjects);
- // <-----
-
/* attributes */
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);
diff --git a/source/gameengine/Ketsji/KXNetwork/SConscript b/source/gameengine/Ketsji/KXNetwork/SConscript
index f350b2ce25a..8f88511acca 100644
--- a/source/gameengine/Ketsji/KXNetwork/SConscript
+++ b/source/gameengine/Ketsji/KXNetwork/SConscript
@@ -9,10 +9,4 @@ incs += ' #source/gameengine/Network #source/gameengine/SceneGraph'
incs += ' ' + env['BF_PYTHON_INC']
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-
-env.BlenderLib ( 'kx_network', Split(sources), Split(incs), defines=[],libtype=['core', 'player'], priority=[400, 145], cxx_compileflags=cxxflags )
+env.BlenderLib ( 'bf_network', Split(sources), Split(incs), defines=[],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
new file mode 100644
index 00000000000..1b759bda28e
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
@@ -0,0 +1,205 @@
+/**
+ * Armature sensor
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 "DNA_action_types.h"
+#include "DNA_constraint_types.h"
+#include "BKE_constraint.h"
+#include "DNA_sensor_types.h"
+
+#include "BL_ArmatureObject.h"
+#include "KX_ArmatureSensor.h"
+#include "SCA_EventManager.h"
+#include "SCA_LogicManager.h"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+KX_ArmatureSensor::KX_ArmatureSensor(class SCA_EventManager* eventmgr,
+ SCA_IObject* gameobj,
+ const char *posechannel,
+ const char *constraintname,
+ int type,
+ float value)
+ : SCA_ISensor(gameobj,eventmgr),
+ m_constraint(NULL),
+ m_posechannel(posechannel),
+ m_constraintname(constraintname),
+ m_type(type),
+ m_value(value)
+{
+ FindConstraint();
+}
+
+void KX_ArmatureSensor::Init()
+{
+ m_lastresult = m_invert?true:false;
+ m_result = false;
+ m_reset = true;
+}
+
+void KX_ArmatureSensor::FindConstraint()
+{
+ m_constraint = NULL;
+
+ if (m_gameobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE) {
+ BL_ArmatureObject* armobj = (BL_ArmatureObject*)m_gameobj;
+ // get the persistent pose structure
+ bPose* pose = armobj->GetOrigPose();
+ bPoseChannel* pchan;
+ bConstraint* pcon;
+ // and locate the constraint
+ for (pchan = (bPoseChannel*)pose->chanbase.first; pchan; pchan=(bPoseChannel*)pchan->next) {
+ if (!strcmp(pchan->name, m_posechannel)) {
+ // now locate the constraint
+ for (pcon = (bConstraint*)pchan->constraints.first; pcon; pcon=(bConstraint*)pcon->next) {
+ if (!strcmp(pcon->name, m_constraintname)) {
+ if (pcon->flag & CONSTRAINT_DISABLE)
+ /* this constraint is not valid, can't use it */
+ break;
+ m_constraint = pcon;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+
+CValue* KX_ArmatureSensor::GetReplica()
+{
+ KX_ArmatureSensor* replica = new KX_ArmatureSensor(*this);
+ // m_range_expr must be recalculated on replica!
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_ArmatureSensor::ReParent(SCA_IObject* parent)
+{
+ SCA_ISensor::ReParent(parent);
+ // must remap the constraint
+ FindConstraint();
+}
+
+bool KX_ArmatureSensor::IsPositiveTrigger()
+{
+ return (m_invert) ? !m_result : m_result;
+}
+
+
+KX_ArmatureSensor::~KX_ArmatureSensor()
+{
+}
+
+bool KX_ArmatureSensor::Evaluate()
+{
+ bool reset = m_reset && m_level;
+
+ m_reset = false;
+ if (!m_constraint)
+ return false;
+ switch (m_type) {
+ case SENS_ARM_STATE_CHANGED:
+ m_result = !(m_constraint->flag & CONSTRAINT_OFF);
+ break;
+ case SENS_ARM_LIN_ERROR_BELOW:
+ m_result = (m_constraint->lin_error < m_value);
+ break;
+ case SENS_ARM_LIN_ERROR_ABOVE:
+ m_result = (m_constraint->lin_error > m_value);
+ break;
+ case SENS_ARM_ROT_ERROR_BELOW:
+ m_result = (m_constraint->rot_error < m_value);
+ break;
+ case SENS_ARM_ROT_ERROR_ABOVE:
+ m_result = (m_constraint->rot_error > m_value);
+ break;
+ }
+ if (m_lastresult!=m_result)
+ {
+ m_lastresult = m_result;
+ return true;
+ }
+ return (reset) ? true : false;
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* Python functions */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+PyTypeObject KX_ArmatureSensor::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_ArmatureSensor",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_ISensor::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef KX_ArmatureSensor::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef KX_ArmatureSensor::Attributes[] = {
+ KX_PYATTRIBUTE_RO_FUNCTION("constraint", KX_ArmatureSensor, pyattr_get_constraint),
+ KX_PYATTRIBUTE_FLOAT_RW("value",-FLT_MAX,FLT_MAX,KX_ArmatureSensor,m_value),
+ KX_PYATTRIBUTE_INT_RW("type",0,SENS_ARM_MAXTYPE,false,KX_ArmatureSensor,m_type),
+ { NULL } //Sentinel
+};
+
+PyObject* KX_ArmatureSensor::pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_ArmatureSensor* sensor = static_cast<KX_ArmatureSensor*>(self);
+ if (sensor->m_gameobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE) {
+ BL_ArmatureObject* armobj = (BL_ArmatureObject*)sensor->m_gameobj;
+ BL_ArmatureConstraint* constraint = armobj->GetConstraint(sensor->m_posechannel, sensor->m_constraintname);
+ if (constraint)
+ return constraint->GetProxy();
+ }
+ Py_RETURN_NONE;
+}
diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.h b/source/gameengine/Ketsji/KX_ArmatureSensor.h
new file mode 100644
index 00000000000..2af002afff9
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.h
@@ -0,0 +1,85 @@
+/**
+ * Property sensor
+ *
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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_ARMATURESENSOR
+#define __KX_ARMATURESENSOR
+
+struct bConstraint;
+
+#include "SCA_ISensor.h"
+#include "DNA_sensor_types.h"
+
+class KX_ArmatureSensor : public SCA_ISensor
+{
+ Py_Header;
+ //class CExpression* m_rightexpr;
+
+protected:
+
+public:
+ KX_ArmatureSensor(class SCA_EventManager* eventmgr,
+ SCA_IObject* gameobj,
+ const char *posechannel,
+ const char *constraintname,
+ int type,
+ float value);
+
+ /**
+ * For property sensor, it is used to release the pre-calculated expression
+ * so that self references are removed before the sensor itself is released
+ */
+ virtual ~KX_ArmatureSensor();
+ virtual CValue* GetReplica();
+ virtual void ReParent(SCA_IObject* parent);
+ virtual void Init();
+ virtual bool Evaluate();
+ virtual bool IsPositiveTrigger();
+
+ // identify the constraint that this actuator controls
+ void FindConstraint();
+
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+ static PyObject* pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+
+private:
+ struct bConstraint* m_constraint;
+ STR_String m_posechannel;
+ STR_String m_constraintname;
+ int m_type;
+ float m_value;
+ bool m_result;
+ bool m_lastresult;
+};
+
+#endif
+
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index 30057fc039d..be3d4906761 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -42,10 +42,8 @@ BL_BlenderShader *KX_BlenderMaterial::mLastBlenderShader = NULL;
//static PyObject *gTextureDict = 0;
-KX_BlenderMaterial::KX_BlenderMaterial(
- PyTypeObject *T
- )
-: PyObjectPlus(T),
+KX_BlenderMaterial::KX_BlenderMaterial()
+: PyObjectPlus(),
RAS_IPolyMaterial(),
mMaterial(NULL),
mShader(0),
@@ -61,8 +59,7 @@ KX_BlenderMaterial::KX_BlenderMaterial(
void KX_BlenderMaterial::Initialize(
KX_Scene *scene,
BL_Material *data,
- bool skin,
- int lightlayer)
+ bool skin)
{
RAS_IPolyMaterial::Initialize(
data->texname[0],
@@ -74,8 +71,7 @@ void KX_BlenderMaterial::Initialize(
data->mode,
data->transp,
((data->ras_mode &ALPHA)!=0),
- ((data->ras_mode &ZSORT)!=0),
- lightlayer
+ ((data->ras_mode &ZSORT)!=0)
);
mMaterial = data;
mShader = 0;
@@ -239,7 +235,7 @@ void KX_BlenderMaterial::OnExit()
}
if( mMaterial->tface )
- GPU_set_tpage(mMaterial->tface);
+ GPU_set_tpage(mMaterial->tface, 1);
}
@@ -778,6 +774,7 @@ void KX_BlenderMaterial::UpdateIPO(
mMaterial->hard = (float)(hard);
mMaterial->emit = (float)(emit);
mMaterial->spec_f = (float)(spec);
+ mMaterial->ref = (float)(ref);
}
@@ -797,52 +794,27 @@ PyAttributeDef KX_BlenderMaterial::Attributes[] = {
};
PyTypeObject KX_BlenderMaterial::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_BlenderMaterial",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-PyParentObject KX_BlenderMaterial::Parents[] = {
- &KX_BlenderMaterial::Type,
+ "KX_BlenderMaterial",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-PyObject* KX_BlenderMaterial::py_getattro(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* KX_BlenderMaterial::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-int KX_BlenderMaterial::py_setattro(PyObject *attr, PyObject *pyvalue)
-{
- return PyObjectPlus::py_setattro(attr, pyvalue);
-}
-
-
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getShader , "getShader()")
{
if( !GLEW_ARB_fragment_shader) {
@@ -912,7 +884,7 @@ void KX_BlenderMaterial::SetBlenderGLSLShader(int layer)
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getMaterialIndex, "getMaterialIndex()")
{
- return PyInt_FromLong( GetMaterialIndex() );
+ return PyLong_FromSsize_t( GetMaterialIndex() );
}
KX_PYMETHODDEF_DOC( KX_BlenderMaterial, getTexture, "getTexture( index )" )
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index b29f2df98db..cdbdc4bd429 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -15,6 +15,10 @@
#include "MT_Vector3.h"
#include "MT_Vector4.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct MTFace;
class KX_Scene;
@@ -23,14 +27,11 @@ class KX_BlenderMaterial : public PyObjectPlus, public RAS_IPolyMaterial
Py_Header;
public:
// --------------------------------
- KX_BlenderMaterial(
- PyTypeObject* T=&Type
- );
+ KX_BlenderMaterial();
void Initialize(
class KX_Scene* scene,
BL_Material* mat,
- bool skin,
- int lightlayer
+ bool skin
);
virtual ~KX_BlenderMaterial();
@@ -83,10 +84,7 @@ public:
);
// --------------------------------
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
- virtual PyObject* py_repr(void) { return PyString_FromString(mMaterial->matname.ReadPtr()); }
+ virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
KX_PYMETHOD_DOC( KX_BlenderMaterial, getShader );
KX_PYMETHOD_DOC( KX_BlenderMaterial, getMaterialIndex );
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index 748b0667061..db1595db36f 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -402,6 +402,8 @@ void KX_BulletPhysicsController::RestoreDynamics()
btRigidBody *body = GetRigidBody();
if (body && m_suspended)
{
+ // before make sure any position change that was done in this logic frame are accounted for
+ SetTransform();
GetPhysicsEnvironment()->updateCcdPhysicsController(this,
m_savedMass,
m_savedCollisionFlags,
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
index 755b1cbd780..7fc799abb7e 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
@@ -18,7 +18,6 @@ private:
btCollisionShape* m_bulletChildShape;
public:
-
KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna, bool sensor, bool compound);
virtual ~KX_BulletPhysicsController ();
@@ -81,6 +80,12 @@ public:
// intentionally empty
};
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BulletPhysicsController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //KX_BULLET2PHYSICS_CONTROLLER
diff --git a/source/gameengine/Ketsji/KX_CDActuator.cpp b/source/gameengine/Ketsji/KX_CDActuator.cpp
deleted file mode 100644
index 8511526fd5f..00000000000
--- a/source/gameengine/Ketsji/KX_CDActuator.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-/**
- * KX_CDActuator.cpp
- *
- * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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_CDActuator.h"
-#include "SND_CDObject.h"
-#include "KX_GameObject.h"
-#include "SND_Scene.h" // needed for replication
-#include <iostream>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* Native functions */
-/* ------------------------------------------------------------------------- */
-KX_CDActuator::KX_CDActuator(SCA_IObject* gameobject,
- SND_Scene* soundscene,
- KX_CDACT_TYPE type,
- int track,
- short start,
- short end,
- PyTypeObject* T)
- : SCA_IActuator(gameobject,T)
-{
- m_soundscene = soundscene;
- m_type = type;
- m_track = track;
- m_lastEvent = true;
- m_isplaying = false;
- m_startFrame = start;
- m_endFrame = end;
- m_gain = SND_CDObject::Instance()->GetGain();
-}
-
-
-
-KX_CDActuator::~KX_CDActuator()
-{
-}
-
-
-/* hmmm, do we want this? */
-CValue* KX_CDActuator::GetReplica()
-{
- KX_CDActuator* replica = new KX_CDActuator(*this);
- replica->ProcessReplica();
- return replica;
-};
-
-
-
-bool KX_CDActuator::Update()
-{
- bool result = false;
- bool bNegativeEvent = IsNegativeEvent();
-
- RemoveAllEvents();
-
- if (!bNegativeEvent)
- {
- switch (m_type)
- {
- case KX_CDACT_PLAY_ALL:
- {
- SND_CDObject::Instance()->SetPlaymode(SND_CD_ALL);
- SND_CDObject::Instance()->SetTrack(1);
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- //result = true;
- break;
- }
- case KX_CDACT_PLAY_TRACK:
- {
- SND_CDObject::Instance()->SetPlaymode(SND_CD_TRACK);
- SND_CDObject::Instance()->SetTrack(m_track);
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- //result = true;
- break;
- }
- case KX_CDACT_LOOP_TRACK:
- {
- SND_CDObject::Instance()->SetPlaymode(SND_CD_ALL);
- SND_CDObject::Instance()->SetTrack(m_track);
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- //result = true;
- break;
- }
- case KX_CDACT_STOP:
- {
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_STOP);
- break;
- }
- case KX_CDACT_PAUSE:
- {
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PAUSE);
- //result = true;
- break;
- }
- case KX_CDACT_RESUME:
- {
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_RESUME);
- //result = true;
- break;
- }
- case KX_CDACT_VOLUME:
- {
- SND_CDObject::Instance()->SetGain(m_gain);
- //result = true;
- break;
- }
- default:
- // implement me !!
- break;
- }
- }
- return result;
-}
-
-
-
-/* ------------------------------------------------------------------------- */
-/* Python functions */
-/* ------------------------------------------------------------------------- */
-
-
-
-/* Integration hooks ------------------------------------------------------- */
-PyTypeObject KX_CDActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
- PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_SoundActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject KX_CDActuator::Parents[] = {
- &KX_CDActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
-};
-
-
-
-PyMethodDef KX_CDActuator::Methods[] = {
- // Deprecated ----->
- {"setGain",(PyCFunction) KX_CDActuator::sPySetGain,METH_VARARGS,NULL},
- {"getGain",(PyCFunction) KX_CDActuator::sPyGetGain,METH_VARARGS,NULL},
- // <-----
- KX_PYMETHODTABLE_NOARGS(KX_CDActuator, startCD),
- KX_PYMETHODTABLE_NOARGS(KX_CDActuator, pauseCD),
- KX_PYMETHODTABLE_NOARGS(KX_CDActuator, resumeCD),
- KX_PYMETHODTABLE_NOARGS(KX_CDActuator, stopCD),
- KX_PYMETHODTABLE_NOARGS(KX_CDActuator, playAll),
- KX_PYMETHODTABLE_O(KX_CDActuator, playTrack),
- {NULL,NULL,NULL,NULL} //Sentinel
-};
-
-PyAttributeDef KX_CDActuator::Attributes[] = {
- KX_PYATTRIBUTE_FLOAT_RW_CHECK("volume", 0.0, 1.0, KX_CDActuator, m_gain,pyattr_setGain),
- KX_PYATTRIBUTE_INT_RW("track", 1, 99, false, KX_CDActuator, m_track),
- { NULL } //Sentinel
-};
-
-int KX_CDActuator::pyattr_setGain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_CDActuator* act = static_cast<KX_CDActuator*>(self);
- SND_CDObject::Instance()->SetGain(act->m_gain);
- return PY_SET_ATTR_SUCCESS;
-}
-
-PyObject* KX_CDActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_CDActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_CDActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_CDActuator, startCD,
-"startCD()\n"
-"\tStarts the CD playing.\n")
-{
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- Py_RETURN_NONE;
-}
-
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_CDActuator, pauseCD,
-"pauseCD()\n"
-"\tPauses the CD playing.\n")
-{
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PAUSE);
- Py_RETURN_NONE;
-}
-
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_CDActuator, resumeCD,
-"resumeCD()\n"
-"\tResumes the CD playing.\n")
-{
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_RESUME);
- Py_RETURN_NONE;
-}
-
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_CDActuator, stopCD,
-"stopCD()\n"
-"\tStops the CD playing.\n")
-{
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_STOP);
- Py_RETURN_NONE;
-}
-
-
-KX_PYMETHODDEF_DOC_O(KX_CDActuator, playTrack,
-"playTrack(trackNumber)\n"
-"\tPlays the track selected.\n")
-{
- if (PyInt_Check(value)) {
- int track = PyInt_AsLong(value);
- SND_CDObject::Instance()->SetPlaymode(SND_CD_TRACK);
- SND_CDObject::Instance()->SetTrack(track);
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- }
- Py_RETURN_NONE;
-}
-
-
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_CDActuator, playAll,
-"playAll()\n"
-"\tPlays the CD from the beginning.\n")
-{
- SND_CDObject::Instance()->SetPlaymode(SND_CD_ALL);
- SND_CDObject::Instance()->SetTrack(1);
- SND_CDObject::Instance()->SetPlaystate(SND_MUST_PLAY);
- Py_RETURN_NONE;
-}
-
-// Deprecated ----->
-PyObject* KX_CDActuator::PySetGain(PyObject* args)
-{
- float gain = 1.0;
- ShowDeprecationWarning("setGain()", "the volume property");
- if (!PyArg_ParseTuple(args, "f:setGain", &gain))
- return NULL;
-
- SND_CDObject::Instance()->SetGain(gain);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_CDActuator::PyGetGain(PyObject* args)
-{
- float gain = SND_CDObject::Instance()->GetGain();
- ShowDeprecationWarning("getGain()", "the volume property");
- PyObject* result = PyFloat_FromDouble(gain);
-
- return result;
-}
-// <-----
diff --git a/source/gameengine/Ketsji/KX_CDActuator.h b/source/gameengine/Ketsji/KX_CDActuator.h
deleted file mode 100644
index 2fd05ab72e5..00000000000
--- a/source/gameengine/Ketsji/KX_CDActuator.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * KX_CDActuator.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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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_CDACTUATOR
-#define __KX_CDACTUATOR
-
-#include "SCA_IActuator.h"
-#include "SND_CDObject.h"
-
-class KX_CDActuator : public SCA_IActuator
-{
- Py_Header;
- bool m_lastEvent;
- bool m_isplaying;
- /* just some handles to the audio-data... */
- class SND_Scene* m_soundscene;
- int m_track;
- float m_gain;
- short m_startFrame;
- short m_endFrame;
-
-public:
- enum KX_CDACT_TYPE
- {
- KX_CDACT_NODEF = 0,
- KX_CDACT_PLAY_ALL,
- KX_CDACT_PLAY_TRACK,
- KX_CDACT_LOOP_TRACK,
- KX_CDACT_VOLUME,
- KX_CDACT_STOP,
- KX_CDACT_PAUSE,
- KX_CDACT_RESUME,
- KX_SOUNDACT_MAX
- };
-
- KX_CDACT_TYPE m_type;
-
- KX_CDActuator(SCA_IObject* gameobject,
- SND_Scene* soundscene,
- KX_CDACT_TYPE type,
- int track,
- short start,
- short end,
- PyTypeObject* T=&Type);
-
- ~KX_CDActuator();
-
- virtual bool Update();
-
- CValue* GetReplica();
-
- /* -------------------------------------------------------------------- */
- /* Python interface --------------------------------------------------- */
- /* -------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // Deprecated ----->
- KX_PYMETHOD_VARARGS(KX_CDActuator,SetGain);
- KX_PYMETHOD_VARARGS(KX_CDActuator,GetGain);
- // <-----
-
- KX_PYMETHOD_DOC_NOARGS(KX_CDActuator, startCD);
- KX_PYMETHOD_DOC_NOARGS(KX_CDActuator, pauseCD);
- KX_PYMETHOD_DOC_NOARGS(KX_CDActuator, resumeCD);
- KX_PYMETHOD_DOC_NOARGS(KX_CDActuator, stopCD);
- KX_PYMETHOD_DOC_NOARGS(KX_CDActuator, playAll);
- KX_PYMETHOD_DOC_O(KX_CDActuator, playTrack);
-
- static int pyattr_setGain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-
-
-};
-
-#endif //__KX_CDACTUATOR
-
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 40f6c99c03c..0832809772d 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -42,10 +42,9 @@ KX_Camera::KX_Camera(void* sgReplicationInfo,
SG_Callbacks callbacks,
const RAS_CameraData& camdata,
bool frustum_culling,
- bool delete_node,
- PyTypeObject *T)
+ bool delete_node)
:
- KX_GameObject(sgReplicationInfo,callbacks,T),
+ KX_GameObject(sgReplicationInfo,callbacks),
m_camdata(camdata),
m_dirty(true),
m_normalized(false),
@@ -497,12 +496,6 @@ PyMethodDef KX_Camera::Methods[] = {
KX_PYMETHODTABLE_O(KX_Camera, getScreenPosition),
KX_PYMETHODTABLE(KX_Camera, getScreenVect),
KX_PYMETHODTABLE(KX_Camera, getScreenRay),
-
- // DEPRECATED
- KX_PYMETHODTABLE_O(KX_Camera, enableViewport),
- KX_PYMETHODTABLE_NOARGS(KX_Camera, getProjectionMatrix),
- KX_PYMETHODTABLE_O(KX_Camera, setProjectionMatrix),
-
{NULL,NULL} //Sentinel
};
@@ -531,61 +524,33 @@ PyAttributeDef KX_Camera::Attributes[] = {
};
PyTypeObject KX_Camera::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_Camera",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,
- &KX_GameObject::Sequence,
- &KX_GameObject::Mapping,
- 0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,
- Py_TPFLAGS_DEFAULT,
- 0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-
-
-
-PyParentObject KX_Camera::Parents[] = {
- &KX_Camera::Type,
+ "KX_Camera",
+ 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,
- &SCA_IObject::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyObject* KX_Camera::py_getattro(PyObject *attr)
-{
- py_getattro_up(KX_GameObject);
-}
-
-PyObject* KX_Camera::py_getattro_dict() {
- py_getattro_dict_up(KX_GameObject);
-}
-
-int KX_Camera::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(KX_GameObject);
-}
-
KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, sphereInsideFrustum,
"sphereInsideFrustum(center, radius) -> Integer\n"
"\treturns INSIDE, OUTSIDE or INTERSECT if the given sphere is\n"
@@ -611,7 +576,7 @@ KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, sphereInsideFrustum,
MT_Point3 center;
if (PyVecTo(pycenter, center))
{
- return PyInt_FromLong(SphereInsideFrustum(center, radius)); /* new ref */
+ return PyLong_FromSsize_t(SphereInsideFrustum(center, radius)); /* new ref */
}
}
@@ -662,7 +627,7 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, boxInsideFrustum,
return NULL;
}
- return PyInt_FromLong(BoxInsideFrustum(box)); /* new ref */
+ return PyLong_FromSsize_t(BoxInsideFrustum(box)); /* new ref */
}
KX_PYMETHODDEF_DOC_O(KX_Camera, pointInsideFrustum,
@@ -684,7 +649,7 @@ KX_PYMETHODDEF_DOC_O(KX_Camera, pointInsideFrustum,
MT_Point3 point;
if (PyVecTo(value, point))
{
- return PyInt_FromLong(PointInsideFrustum(point)); /* new ref */
+ return PyLong_FromSsize_t(PointInsideFrustum(point)); /* new ref */
}
PyErr_SetString(PyExc_TypeError, "camera.pointInsideFrustum(point): KX_Camera, expected point argument.");
@@ -709,92 +674,6 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, getWorldToCamera,
return PyObjectFrom(GetWorldToCamera()); /* new ref */
}
-KX_PYMETHODDEF_DOC_NOARGS(KX_Camera, getProjectionMatrix,
-"getProjectionMatrix() -> Matrix4x4\n"
-"\treturns this camera's projection matrix, as a list of four lists of four values.\n\n"
-"\tie: [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]])\n"
-)
-{
- ShowDeprecationWarning("getProjectionMatrix()", "the projection_matrix property");
- return PyObjectFrom(GetProjectionMatrix()); /* new ref */
-}
-
-KX_PYMETHODDEF_DOC_O(KX_Camera, setProjectionMatrix,
-"setProjectionMatrix(MT_Matrix4x4 m) -> None\n"
-"\tSets this camera's projection matrix\n"
-"\n"
-"\tExample:\n"
-"\timport GameLogic\n"
-"\t# Set a perspective projection matrix\n"
-"\tdef Perspective(left, right, bottom, top, near, far):\n"
-"\t\tm = MT_Matrix4x4()\n"
-"\t\tm[0][0] = m[0][2] = right - left\n"
-"\t\tm[1][1] = m[1][2] = top - bottom\n"
-"\t\tm[2][2] = m[2][3] = -far - near\n"
-"\t\tm[3][2] = -1\n"
-"\t\tm[3][3] = 0\n"
-"\t\treturn m\n"
-"\n"
-"\t# Set an orthographic projection matrix\n"
-"\tdef Orthographic(left, right, bottom, top, near, far):\n"
-"\t\tm = MT_Matrix4x4()\n"
-"\t\tm[0][0] = right - left\n"
-"\t\tm[0][3] = -right - left\n"
-"\t\tm[1][1] = top - bottom\n"
-"\t\tm[1][3] = -top - bottom\n"
-"\t\tm[2][2] = far - near\n"
-"\t\tm[2][3] = -far - near\n"
-"\t\tm[3][3] = 1\n"
-"\t\treturn m\n"
-"\n"
-"\t# Set an isometric projection matrix\n"
-"\tdef Isometric(left, right, bottom, top, near, far):\n"
-"\t\tm = MT_Matrix4x4()\n"
-"\t\tm[0][0] = m[0][2] = m[1][1] = 0.8660254037844386\n"
-"\t\tm[1][0] = 0.25\n"
-"\t\tm[1][2] = -0.25\n"
-"\t\tm[3][3] = 1\n"
-"\t\treturn m\n"
-"\n"
-"\t"
-"\tco = GameLogic.getCurrentController()\n"
-"\tcam = co.getOwner()\n"
-"\tcam.setProjectionMatrix(Perspective(-1.0, 1.0, -1.0, 1.0, 0.1, 1))\n")
-{
- ShowDeprecationWarning("setProjectionMatrix(mat)", "the projection_matrix property");
-
- MT_Matrix4x4 mat;
- if (!PyMatTo(value, mat))
- {
- PyErr_SetString(PyExc_TypeError, "camera.setProjectionMatrix(matrix): KX_Camera, expected 4x4 list as matrix argument.");
- return NULL;
- }
-
- SetProjectionMatrix(mat);
- Py_RETURN_NONE;
-}
-
-KX_PYMETHODDEF_DOC_O(KX_Camera, enableViewport,
-"enableViewport(viewport)\n"
-"Sets this camera's viewport status\n"
-)
-{
- ShowDeprecationWarning("enableViewport(bool)", "the useViewport property");
-
- int viewport = PyObject_IsTrue(value);
- if (viewport == -1) {
- PyErr_SetString(PyExc_ValueError, "camera.enableViewport(bool): KX_Camera, expected True/False or 0/1");
- return NULL;
- }
-
- if(viewport)
- EnableViewport(true);
- else
- EnableViewport(false);
-
- Py_RETURN_NONE;
-}
-
KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, setViewport,
"setViewport(left, bottom, right, top)\n"
"Sets this camera's viewport\n")
@@ -952,11 +831,11 @@ PyObject* KX_Camera::pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBU
PyObject* KX_Camera::pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{ return PyInt_FromLong(INSIDE); }
+{ return PyLong_FromSsize_t(INSIDE); }
PyObject* KX_Camera::pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{ return PyInt_FromLong(OUTSIDE); }
+{ return PyLong_FromSsize_t(OUTSIDE); }
PyObject* KX_Camera::pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{ return PyInt_FromLong(INTERSECT); }
+{ return PyLong_FromSsize_t(INTERSECT); }
bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix)
@@ -978,14 +857,14 @@ bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok
}
}
- if (PyString_Check(value)) {
- STR_String value_str = PyString_AsString(value);
+ if (PyUnicode_Check(value)) {
+ STR_String value_str = _PyUnicode_AsString(value);
*object = KX_GetActiveScene()->FindCamera(value_str);
if (*object) {
return true;
} else {
- PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_Camera in this scene", error_prefix, PyString_AsString(value));
+ PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_Camera in this scene", error_prefix, _PyUnicode_AsString(value));
return false;
}
}
@@ -1142,7 +1021,7 @@ KX_PYMETHODDEF_DOC_VARARGS(KX_Camera, getScreenRay,
PyTuple_SET_ITEM(argValue, 0, PyObjectFrom(vect));
PyTuple_SET_ITEM(argValue, 1, PyFloat_FromDouble(dist));
if (propName)
- PyTuple_SET_ITEM(argValue, 2, PyString_FromString(propName));
+ PyTuple_SET_ITEM(argValue, 2, PyUnicode_FromString(propName));
PyObject* ret= this->PyrayCastTo(argValue,NULL);
Py_DECREF(argValue);
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index aef21cd91e4..bf7a39d93c8 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -143,7 +143,7 @@ public:
enum { INSIDE, INTERSECT, OUTSIDE } ;
- KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, bool delete_node = false, PyTypeObject *T = &Type);
+ KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, bool delete_node = false);
virtual ~KX_Camera();
/**
@@ -265,6 +265,7 @@ public:
*/
int GetViewportTop() const;
+ virtual int GetGameObjectType() { return OBJ_CAMERA; }
KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
@@ -272,20 +273,13 @@ public:
KX_PYMETHOD_DOC_NOARGS(KX_Camera, getCameraToWorld);
KX_PYMETHOD_DOC_NOARGS(KX_Camera, getWorldToCamera);
- KX_PYMETHOD_DOC_NOARGS(KX_Camera, getProjectionMatrix);
- KX_PYMETHOD_DOC_O(KX_Camera, setProjectionMatrix);
- KX_PYMETHOD_DOC_O(KX_Camera, enableViewport);
KX_PYMETHOD_DOC_VARARGS(KX_Camera, setViewport);
KX_PYMETHOD_DOC_NOARGS(KX_Camera, setOnTop);
KX_PYMETHOD_DOC_O(KX_Camera, getScreenPosition);
KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenVect);
KX_PYMETHOD_DOC_VARARGS(KX_Camera, getScreenRay);
-
- virtual PyObject* py_getattro(PyObject *attr); /* lens, near, far, projection_matrix */
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
static PyObject* pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp
index f8557dac2c4..99618fab8e3 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.cpp
+++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp
@@ -38,9 +38,6 @@
#include "PyObjectPlus.h"
-STR_String KX_CameraActuator::X_AXIS_STRING = "x";
-STR_String KX_CameraActuator::Y_AXIS_STRING = "y";
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -56,10 +53,9 @@ KX_CameraActuator::KX_CameraActuator(
float hght,
float minhght,
float maxhght,
- bool xytog,
- PyTypeObject* T
+ bool xytog
):
- SCA_IActuator(gameobj, T),
+ SCA_IActuator(gameobj, KX_ACT_CAMERA),
m_ob (obj),
m_height (hght),
m_minHeight (minhght),
@@ -354,28 +350,13 @@ CValue *KX_CameraActuator::findObject(char *obName)
return NULL;
}
-bool KX_CameraActuator::string2axischoice(const char *axisString)
-{
- bool res = true;
-
- res = !(axisString == Y_AXIS_STRING);
-
- return res;
-}
-
/* ------------------------------------------------------------------------- */
/* Python functions */
/* ------------------------------------------------------------------------- */
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_CameraActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_CameraActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -385,33 +366,18 @@ PyTypeObject KX_CameraActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_CameraActuator::Parents[] = {
- &KX_CameraActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_CameraActuator::Methods[] = {
- // ---> deprecated (all)
- {"setObject",(PyCFunction) KX_CameraActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
- {"getObject",(PyCFunction) KX_CameraActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
- {"setMin" ,(PyCFunction) KX_CameraActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetMin_doc},
- {"getMin" ,(PyCFunction) KX_CameraActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetMin_doc},
- {"setMax" ,(PyCFunction) KX_CameraActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetMax_doc},
- {"getMax" ,(PyCFunction) KX_CameraActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetMax_doc},
- {"setHeight",(PyCFunction) KX_CameraActuator::sPySetHeight, METH_VARARGS, (PY_METHODCHAR)SetHeight_doc},
- {"getHeight",(PyCFunction) KX_CameraActuator::sPyGetHeight, METH_NOARGS, (PY_METHODCHAR)GetHeight_doc},
- {"setXY" ,(PyCFunction) KX_CameraActuator::sPySetXY, METH_VARARGS, (PY_METHODCHAR)SetXY_doc},
- {"getXY" ,(PyCFunction) KX_CameraActuator::sPyGetXY, METH_NOARGS, (PY_METHODCHAR)GetXY_doc},
{NULL,NULL,NULL,NULL} //Sentinel
};
@@ -424,164 +390,6 @@ PyAttributeDef KX_CameraActuator::Attributes[] = {
{NULL}
};
-PyObject* KX_CameraActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_CameraActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_CameraActuator::py_setattro(PyObject *attr, PyObject* value) {
- py_setattro_up(SCA_IActuator);
-}
-
-/* get obj ---------------------------------------------------------- */
-const char KX_CameraActuator::GetObject_doc[] =
-"getObject(name_only = 1)\n"
-"name_only - optional arg, when true will return the KX_GameObject rather then its name\n"
-"\tReturns the object this sensor reacts to.\n";
-PyObject* KX_CameraActuator::PyGetObject(PyObject* args)
-{
- int ret_name_only = 1;
-
- ShowDeprecationWarning("getObject()", "the object property");
-
- if (!PyArg_ParseTuple(args, "|i:getObject", &ret_name_only))
- return NULL;
-
- if (!m_ob)
- Py_RETURN_NONE;
-
- if (ret_name_only)
- return PyString_FromString(m_ob->GetName().ReadPtr());
- else
- return m_ob->GetProxy();
-}
-/* set obj ---------------------------------------------------------- */
-const char KX_CameraActuator::SetObject_doc[] =
-"setObject(object)\n"
-"\t- object: KX_GameObject, string or None\n"
-"\tSets the object this sensor reacts to.\n";
-PyObject* KX_CameraActuator::PySetObject(PyObject* value)
-{
- KX_GameObject *gameobj;
-
- ShowDeprecationWarning("setObject()", "the object property");
-
- if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_CameraActuator"))
- return NULL; // ConvertPythonToGameObject sets the error
-
- if (m_ob != NULL)
- m_ob->UnregisterActuator(this);
-
- m_ob = (SCA_IObject*)gameobj;
- if (m_ob)
- m_ob->RegisterActuator(this);
-
- Py_RETURN_NONE;
-}
-
-/* get min ---------------------------------------------------------- */
-const char KX_CameraActuator::GetMin_doc[] =
-"getMin\n"
-"\tReturns the minimum value set in the Min: field.\n";
-PyObject* KX_CameraActuator::PyGetMin()
-{
- ShowDeprecationWarning("getMin()", "the min property");
- return PyFloat_FromDouble(m_minHeight);
-}
-/* set min ---------------------------------------------------------- */
-const char KX_CameraActuator::SetMin_doc[] =
-"setMin\n"
-"\tSets the minimum value.\n";
-PyObject* KX_CameraActuator::PySetMin(PyObject* args)
-{
- ShowDeprecationWarning("setMin()", "the min property");
- float min;
- if(PyArg_ParseTuple(args,"f:setMin", &min))
- {
- m_minHeight = min;
- Py_RETURN_NONE;
- }
- return NULL;
-}
-/* get min ---------------------------------------------------------- */
-const char KX_CameraActuator::GetMax_doc[] =
-"getMax\n"
-"\tReturns the maximum value set in the Max: field.\n";
-PyObject* KX_CameraActuator::PyGetMax()
-{
- ShowDeprecationWarning("getMax()", "the max property");
- return PyFloat_FromDouble(m_maxHeight);
-}
-/* set min ---------------------------------------------------------- */
-const char KX_CameraActuator::SetMax_doc[] =
-"setMax\n"
-"\tSets the maximum value.\n";
-PyObject* KX_CameraActuator::PySetMax(PyObject* args)
-{
- ShowDeprecationWarning("getMax()", "the max property");
- float max;
- if(PyArg_ParseTuple(args,"f:setMax", &max))
- {
- m_maxHeight = max;
- Py_RETURN_NONE;
- }
- return NULL;
-}
-/* get height ---------------------------------------------------------- */
-const char KX_CameraActuator::GetHeight_doc[] =
-"getHeight\n"
-"\tReturns the height value set in the height: field.\n";
-PyObject* KX_CameraActuator::PyGetHeight()
-{
- ShowDeprecationWarning("getHeight()", "the height property");
- return PyFloat_FromDouble(m_height);
-}
-/* set height ---------------------------------------------------------- */
-const char KX_CameraActuator::SetHeight_doc[] =
-"setHeight\n"
-"\tSets the height value.\n";
-PyObject* KX_CameraActuator::PySetHeight(PyObject* args)
-{
- ShowDeprecationWarning("getHeight()", "the height property");
- float height;
- if(PyArg_ParseTuple(args,"f:setHeight", &height))
- {
- m_height = height;
- Py_RETURN_NONE;
- }
- return NULL;
-}
-/* set XY ---------------------------------------------------------- */
-const char KX_CameraActuator::SetXY_doc[] =
-"setXY\n"
-"\tSets axis the camera tries to get behind.\n"
-"\t1=x, 0=y\n";
-PyObject* KX_CameraActuator::PySetXY(PyObject* args)
-{
- ShowDeprecationWarning("setXY()", "the useXY property");
- int value;
- if(PyArg_ParseTuple(args,"i:setXY", &value))
- {
- m_x = value != 0;
- Py_RETURN_NONE;
- }
- return NULL;
-}
-
-/* get XY -------------------------------------------------------------*/
-const char KX_CameraActuator::GetXY_doc[] =
-"getXY\n"
-"\tGets the axis the camera tries to get behind.\n"
-"\tTrue = X, False = Y\n";
-PyObject* KX_CameraActuator::PyGetXY()
-{
- ShowDeprecationWarning("getXY()", "the xy property");
- return PyInt_FromLong(m_x);
-}
-
PyObject* KX_CameraActuator::pyattr_get_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_CameraActuator* self= static_cast<KX_CameraActuator*>(self_v);
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.h b/source/gameengine/Ketsji/KX_CameraActuator.h
index efa4e2f38d7..e047e3724ea 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.h
+++ b/source/gameengine/Ketsji/KX_CameraActuator.h
@@ -91,9 +91,7 @@ private :
float hght,
float minhght,
float maxhght,
- bool xytog,
- PyTypeObject* T=&Type
-
+ bool xytog
);
@@ -120,23 +118,7 @@ private :
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
/* set object to look at */
- KX_PYMETHOD_DOC_O(KX_CameraActuator,SetObject);
- /* get current object */
- KX_PYMETHOD_DOC_VARARGS(KX_CameraActuator,GetObject);
- KX_PYMETHOD_DOC_VARARGS(KX_CameraActuator,SetMin);
- KX_PYMETHOD_DOC_NOARGS(KX_CameraActuator,GetMin);
- KX_PYMETHOD_DOC_VARARGS(KX_CameraActuator,SetMax);
- KX_PYMETHOD_DOC_NOARGS(KX_CameraActuator,GetMax);
- KX_PYMETHOD_DOC_VARARGS(KX_CameraActuator,SetHeight);
- KX_PYMETHOD_DOC_NOARGS(KX_CameraActuator,GetHeight);
- KX_PYMETHOD_DOC_VARARGS(KX_CameraActuator,SetXY);
- KX_PYMETHOD_DOC_NOARGS(KX_CameraActuator,GetXY);
-
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);
diff --git a/source/gameengine/Ketsji/KX_CameraIpoSGController.h b/source/gameengine/Ketsji/KX_CameraIpoSGController.h
index 33245e79c23..85d93962a14 100644
--- a/source/gameengine/Ketsji/KX_CameraIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_CameraIpoSGController.h
@@ -84,6 +84,13 @@ public:
m_modify_clipstart = modify;
}
void AddInterpolator(KX_IInterpolator* interp);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_CameraIpoSGController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // KX_CAMERAIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_ClientObjectInfo.h b/source/gameengine/Ketsji/KX_ClientObjectInfo.h
index 1898dc71ef8..74647dd47fd 100644
--- a/source/gameengine/Ketsji/KX_ClientObjectInfo.h
+++ b/source/gameengine/Ketsji/KX_ClientObjectInfo.h
@@ -74,6 +74,13 @@ public:
bool isActor() { return m_type <= ACTOR; }
bool isSensor() { return m_type >= SENSOR && m_type <= OBACTORSENSOR; }
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ClientObjectInfo"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_CLIENTOBJECT_INFO_H
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
index bd03dea486b..ea0b9f4f1e2 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
@@ -36,6 +36,7 @@
#include "MT_Matrix3x3.h"
#include "KX_GameObject.h"
#include "KX_RayCast.h"
+#include "KX_PythonInit.h" // KX_GetActiveScene
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -54,9 +55,8 @@ KX_ConstraintActuator::KX_ConstraintActuator(SCA_IObject *gameobj,
int locrotxyz,
int time,
int option,
- char *property,
- PyTypeObject* T) :
- SCA_IActuator(gameobj, T),
+ char *property) :
+ SCA_IActuator(gameobj, KX_ACT_CONSTRAINT),
m_refDirVector(refDir),
m_currentTime(0)
{
@@ -328,7 +328,7 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame)
}
{
MT_Point3 topoint = position + (m_maximumBound) * direction;
- PHY_IPhysicsEnvironment* pe = obj->GetPhysicsEnvironment();
+ PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment();
KX_IPhysicsController *spc = obj->GetPhysicsController();
if (!pe) {
@@ -441,7 +441,7 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame)
}
normal.normalize();
{
- PHY_IPhysicsEnvironment* pe = obj->GetPhysicsEnvironment();
+ PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment();
KX_IPhysicsController *spc = obj->GetPhysicsController();
if (!pe) {
@@ -565,13 +565,7 @@ bool KX_ConstraintActuator::IsValidMode(KX_ConstraintActuator::KX_CONSTRAINTTYPE
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_ConstraintActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_ConstraintActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -581,46 +575,18 @@ PyTypeObject KX_ConstraintActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_ConstraintActuator::Parents[] = {
- &KX_ConstraintActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_ConstraintActuator::Methods[] = {
- // Deprecated -->
- {"setDamp", (PyCFunction) KX_ConstraintActuator::sPySetDamp, METH_VARARGS, (PY_METHODCHAR)SetDamp_doc},
- {"getDamp", (PyCFunction) KX_ConstraintActuator::sPyGetDamp, METH_NOARGS, (PY_METHODCHAR)GetDamp_doc},
- {"setRotDamp", (PyCFunction) KX_ConstraintActuator::sPySetRotDamp, METH_VARARGS, (PY_METHODCHAR)SetRotDamp_doc},
- {"getRotDamp", (PyCFunction) KX_ConstraintActuator::sPyGetRotDamp, METH_NOARGS, (PY_METHODCHAR)GetRotDamp_doc},
- {"setDirection", (PyCFunction) KX_ConstraintActuator::sPySetDirection, METH_VARARGS, (PY_METHODCHAR)SetDirection_doc},
- {"getDirection", (PyCFunction) KX_ConstraintActuator::sPyGetDirection, METH_NOARGS, (PY_METHODCHAR)GetDirection_doc},
- {"setOption", (PyCFunction) KX_ConstraintActuator::sPySetOption, METH_VARARGS, (PY_METHODCHAR)SetOption_doc},
- {"getOption", (PyCFunction) KX_ConstraintActuator::sPyGetOption, METH_NOARGS, (PY_METHODCHAR)GetOption_doc},
- {"setTime", (PyCFunction) KX_ConstraintActuator::sPySetTime, METH_VARARGS, (PY_METHODCHAR)SetTime_doc},
- {"getTime", (PyCFunction) KX_ConstraintActuator::sPyGetTime, METH_NOARGS, (PY_METHODCHAR)GetTime_doc},
- {"setProperty", (PyCFunction) KX_ConstraintActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"getProperty", (PyCFunction) KX_ConstraintActuator::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
- {"setMin", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetMin_doc},
- {"getMin", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetMin_doc},
- {"setDistance", (PyCFunction) KX_ConstraintActuator::sPySetMin, METH_VARARGS, (PY_METHODCHAR)SetDistance_doc},
- {"getDistance", (PyCFunction) KX_ConstraintActuator::sPyGetMin, METH_NOARGS, (PY_METHODCHAR)GetDistance_doc},
- {"setMax", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetMax_doc},
- {"getMax", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetMax_doc},
- {"setRayLength", (PyCFunction) KX_ConstraintActuator::sPySetMax, METH_VARARGS, (PY_METHODCHAR)SetRayLength_doc},
- {"getRayLength", (PyCFunction) KX_ConstraintActuator::sPyGetMax, METH_NOARGS, (PY_METHODCHAR)GetRayLength_doc},
- {"setLimit", (PyCFunction) KX_ConstraintActuator::sPySetLimit, METH_VARARGS, (PY_METHODCHAR)SetLimit_doc},
- {"getLimit", (PyCFunction) KX_ConstraintActuator::sPyGetLimit, METH_NOARGS, (PY_METHODCHAR)GetLimit_doc},
- // <--
{NULL,NULL} //Sentinel
};
@@ -639,21 +605,6 @@ PyAttributeDef KX_ConstraintActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_ConstraintActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_ConstraintActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_ConstraintActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
int KX_ConstraintActuator::pyattr_check_direction(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_ConstraintActuator* act = static_cast<KX_ConstraintActuator*>(self);
@@ -667,318 +618,4 @@ int KX_ConstraintActuator::pyattr_check_direction(void *self, const struct KX_PY
return 0;
}
-/* 2. setDamp */
-const char KX_ConstraintActuator::SetDamp_doc[] =
-"setDamp(duration)\n"
-"\t- duration: integer\n"
-"\tSets the time constant of the orientation and distance constraint.\n"
-"\tIf the duration is negative, it is set to 0.\n";
-PyObject* KX_ConstraintActuator::PySetDamp(PyObject* args) {
- ShowDeprecationWarning("setDamp()", "the damp property");
- int dampArg;
- if(!PyArg_ParseTuple(args, "i:setDamp", &dampArg)) {
- return NULL;
- }
-
- m_posDampTime = dampArg;
- if (m_posDampTime < 0) m_posDampTime = 0;
-
- Py_RETURN_NONE;
-}
-/* 3. getDamp */
-const char KX_ConstraintActuator::GetDamp_doc[] =
-"getDamp()\n"
-"\tReturns the damping parameter.\n";
-PyObject* KX_ConstraintActuator::PyGetDamp(){
- ShowDeprecationWarning("getDamp()", "the damp property");
- return PyInt_FromLong(m_posDampTime);
-}
-
-/* 2. setRotDamp */
-const char KX_ConstraintActuator::SetRotDamp_doc[] =
-"setRotDamp(duration)\n"
-"\t- duration: integer\n"
-"\tSets the time constant of the orientation constraint.\n"
-"\tIf the duration is negative, it is set to 0.\n";
-PyObject* KX_ConstraintActuator::PySetRotDamp(PyObject* args) {
- ShowDeprecationWarning("setRotDamp()", "the rotDamp property");
- int dampArg;
- if(!PyArg_ParseTuple(args, "i:setRotDamp", &dampArg)) {
- return NULL;
- }
-
- m_rotDampTime = dampArg;
- if (m_rotDampTime < 0) m_rotDampTime = 0;
-
- Py_RETURN_NONE;
-}
-/* 3. getRotDamp */
-const char KX_ConstraintActuator::GetRotDamp_doc[] =
-"getRotDamp()\n"
-"\tReturns the damping time for application of the constraint.\n";
-PyObject* KX_ConstraintActuator::PyGetRotDamp(){
- ShowDeprecationWarning("getRotDamp()", "the rotDamp property");
- return PyInt_FromLong(m_rotDampTime);
-}
-
-/* 2. setDirection */
-const char KX_ConstraintActuator::SetDirection_doc[] =
-"setDirection(vector)\n"
-"\t- vector: 3-tuple\n"
-"\tSets the reference direction in world coordinate for the orientation constraint.\n";
-PyObject* KX_ConstraintActuator::PySetDirection(PyObject* args) {
- ShowDeprecationWarning("setDirection()", "the direction property");
- float x, y, z;
- MT_Scalar len;
- MT_Vector3 dir;
-
- if(!PyArg_ParseTuple(args, "(fff):setDirection", &x, &y, &z)) {
- return NULL;
- }
- dir[0] = x;
- dir[1] = y;
- dir[2] = z;
- len = dir.length();
- if (MT_fuzzyZero(len)) {
- std::cout << "Invalid direction" << std::endl;
- return NULL;
- }
- m_refDirVector = dir/len;
- m_refDirection[0] = x/len;
- m_refDirection[1] = y/len;
- m_refDirection[2] = z/len;
-
- Py_RETURN_NONE;
-}
-/* 3. getDirection */
-const char KX_ConstraintActuator::GetDirection_doc[] =
-"getDirection()\n"
-"\tReturns the reference direction of the orientation constraint as a 3-tuple.\n";
-PyObject* KX_ConstraintActuator::PyGetDirection(){
- ShowDeprecationWarning("getDirection()", "the direction property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_refDirection[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_refDirection[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_refDirection[2]));
- return retVal;
-}
-
-/* 2. setOption */
-const char KX_ConstraintActuator::SetOption_doc[] =
-"setOption(option)\n"
-"\t- option: integer\n"
-"\tSets several options of the distance constraint.\n"
-"\tBinary combination of the following values:\n"
-"\t\t 64 : Activate alignment to surface\n"
-"\t\t128 : Detect material rather than property\n"
-"\t\t256 : No deactivation if ray does not hit target\n"
-"\t\t512 : Activate distance control\n";
-PyObject* KX_ConstraintActuator::PySetOption(PyObject* args) {
- ShowDeprecationWarning("setOption()", "the option property");
- int option;
- if(!PyArg_ParseTuple(args, "i:setOption", &option)) {
- return NULL;
- }
-
- m_option = option;
-
- Py_RETURN_NONE;
-}
-/* 3. getOption */
-const char KX_ConstraintActuator::GetOption_doc[] =
-"getOption()\n"
-"\tReturns the option parameter.\n";
-PyObject* KX_ConstraintActuator::PyGetOption(){
- ShowDeprecationWarning("getOption()", "the option property");
- return PyInt_FromLong(m_option);
-}
-
-/* 2. setTime */
-const char KX_ConstraintActuator::SetTime_doc[] =
-"setTime(duration)\n"
-"\t- duration: integer\n"
-"\tSets the activation time of the actuator.\n"
-"\tThe actuator disables itself after this many frame.\n"
-"\tIf set to 0 or negative, the actuator is not limited in time.\n";
-PyObject* KX_ConstraintActuator::PySetTime(PyObject* args) {
- ShowDeprecationWarning("setTime()", "the time property");
- int t;
- if(!PyArg_ParseTuple(args, "i:setTime", &t)) {
- return NULL;
- }
-
- if (t < 0)
- t = 0;
- m_activeTime = t;
-
- Py_RETURN_NONE;
-}
-/* 3. getTime */
-const char KX_ConstraintActuator::GetTime_doc[] =
-"getTime()\n"
-"\tReturns the time parameter.\n";
-PyObject* KX_ConstraintActuator::PyGetTime(){
- ShowDeprecationWarning("getTime()", "the time property");
- return PyInt_FromLong(m_activeTime);
-}
-
-/* 2. setProperty */
-const char KX_ConstraintActuator::SetProperty_doc[] =
-"setProperty(property)\n"
-"\t- property: string\n"
-"\tSets the name of the property or material for the ray detection of the distance constraint.\n"
-"\tIf empty, the ray will detect any collisioning object.\n";
-PyObject* KX_ConstraintActuator::PySetProperty(PyObject* args) {
- ShowDeprecationWarning("setProperty()", "the 'property' property");
- char *property;
- if (!PyArg_ParseTuple(args, "s:setProperty", &property)) {
- return NULL;
- }
- if (property == NULL) {
- m_property = "";
- } else {
- m_property = property;
- }
-
- Py_RETURN_NONE;
-}
-/* 3. getProperty */
-const char KX_ConstraintActuator::GetProperty_doc[] =
-"getProperty()\n"
-"\tReturns the property parameter.\n";
-PyObject* KX_ConstraintActuator::PyGetProperty(){
- ShowDeprecationWarning("getProperty()", "the 'property' property");
- return PyString_FromString(m_property.Ptr());
-}
-
-/* 4. setDistance */
-const char KX_ConstraintActuator::SetDistance_doc[] =
-"setDistance(distance)\n"
-"\t- distance: float\n"
-"\tSets the target distance in distance constraint\n";
-/* 4. setMin */
-const char KX_ConstraintActuator::SetMin_doc[] =
-"setMin(lower_bound)\n"
-"\t- lower_bound: float\n"
-"\tSets the lower value of the interval to which the value\n"
-"\tis clipped.\n";
-PyObject* KX_ConstraintActuator::PySetMin(PyObject* args) {
- ShowDeprecationWarning("setMin() or setDistance()", "the min or distance property");
- float minArg;
- if(!PyArg_ParseTuple(args, "f:setMin", &minArg)) {
- return NULL;
- }
-
- switch (m_locrot) {
- default:
- m_minimumBound = minArg;
- break;
- case KX_ACT_CONSTRAINT_ROTX:
- case KX_ACT_CONSTRAINT_ROTY:
- case KX_ACT_CONSTRAINT_ROTZ:
- m_minimumBound = MT_radians(minArg);
- break;
- }
-
- Py_RETURN_NONE;
-}
-/* 5. getDistance */
-const char KX_ConstraintActuator::GetDistance_doc[] =
-"getDistance()\n"
-"\tReturns the distance parameter \n";
-/* 5. getMin */
-const char KX_ConstraintActuator::GetMin_doc[] =
-"getMin()\n"
-"\tReturns the lower value of the interval to which the value\n"
-"\tis clipped.\n";
-PyObject* KX_ConstraintActuator::PyGetMin() {
- ShowDeprecationWarning("getMin() or getDistance()", "the min or distance property");
- return PyFloat_FromDouble(m_minimumBound);
-}
-
-/* 6. setRayLength */
-const char KX_ConstraintActuator::SetRayLength_doc[] =
-"setRayLength(length)\n"
-"\t- length: float\n"
-"\tSets the maximum ray length of the distance constraint\n";
-/* 6. setMax */
-const char KX_ConstraintActuator::SetMax_doc[] =
-"setMax(upper_bound)\n"
-"\t- upper_bound: float\n"
-"\tSets the upper value of the interval to which the value\n"
-"\tis clipped.\n";
-PyObject* KX_ConstraintActuator::PySetMax(PyObject* args){
- ShowDeprecationWarning("setMax() or setRayLength()", "the max or rayLength property");
- float maxArg;
- if(!PyArg_ParseTuple(args, "f:setMax", &maxArg)) {
- return NULL;
- }
-
- switch (m_locrot) {
- default:
- m_maximumBound = maxArg;
- break;
- case KX_ACT_CONSTRAINT_ROTX:
- case KX_ACT_CONSTRAINT_ROTY:
- case KX_ACT_CONSTRAINT_ROTZ:
- m_maximumBound = MT_radians(maxArg);
- break;
- }
-
- Py_RETURN_NONE;
-}
-/* 7. getRayLength */
-const char KX_ConstraintActuator::GetRayLength_doc[] =
-"getRayLength()\n"
-"\tReturns the length of the ray\n";
-/* 7. getMax */
-const char KX_ConstraintActuator::GetMax_doc[] =
-"getMax()\n"
-"\tReturns the upper value of the interval to which the value\n"
-"\tis clipped.\n";
-PyObject* KX_ConstraintActuator::PyGetMax() {
- ShowDeprecationWarning("getMax() or getRayLength()", "the max or rayLength property");
- return PyFloat_FromDouble(m_maximumBound);
-}
-
-
-/* This setter/getter probably for the constraint type */
-/* 8. setLimit */
-const char KX_ConstraintActuator::SetLimit_doc[] =
-"setLimit(type)\n"
-"\t- type: integer\n"
-"\t 1 : LocX\n"
-"\t 2 : LocY\n"
-"\t 3 : LocZ\n"
-"\t 7 : Distance along +X axis\n"
-"\t 8 : Distance along +Y axis\n"
-"\t 9 : Distance along +Z axis\n"
-"\t 10 : Distance along -X axis\n"
-"\t 11 : Distance along -Y axis\n"
-"\t 12 : Distance along -Z axis\n"
-"\t 13 : Align X axis\n"
-"\t 14 : Align Y axis\n"
-"\t 15 : Align Z axis\n"
-"\tSets the type of constraint.\n";
-PyObject* KX_ConstraintActuator::PySetLimit(PyObject* args) {
- ShowDeprecationWarning("setLimit()", "the limit property");
- int locrotArg;
- if(!PyArg_ParseTuple(args, "i:setLimit", &locrotArg)) {
- return NULL;
- }
-
- if (IsValidMode((KX_CONSTRAINTTYPE)locrotArg)) m_locrot = locrotArg;
-
- Py_RETURN_NONE;
-}
-/* 9. getLimit */
-const char KX_ConstraintActuator::GetLimit_doc[] =
-"getLimit()\n"
-"\tReturns the type of constraint.\n";
-PyObject* KX_ConstraintActuator::PyGetLimit() {
- ShowDeprecationWarning("setLimit()", "the limit property");
- return PyInt_FromLong(m_locrot);
-}
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.h b/source/gameengine/Ketsji/KX_ConstraintActuator.h
index 40607b44947..9b6ed59e75c 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.h
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.h
@@ -126,8 +126,7 @@ protected:
int locrot,
int time,
int option,
- char *property,
- PyTypeObject* T=&Type);
+ char *property);
virtual ~KX_ConstraintActuator();
virtual CValue* GetReplica() {
KX_ConstraintActuator* replica = new KX_ConstraintActuator(*this);
@@ -141,35 +140,9 @@ protected:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
static int pyattr_check_direction(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_check_min(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetDamp);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetDamp);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetRotDamp);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetRotDamp);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetDirection);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetDirection);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetOption);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetOption);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetTime);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetTime);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetProperty);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetProperty);
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetMin);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetMin);
- static const char SetDistance_doc[];
- static const char GetDistance_doc[];
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetMax);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetMax);
- static const char SetRayLength_doc[];
- static const char GetRayLength_doc[];
- KX_PYMETHOD_DOC_VARARGS(KX_ConstraintActuator,SetLimit);
- KX_PYMETHOD_DOC_NOARGS(KX_ConstraintActuator,GetLimit);
};
#endif //__KX_CONSTRAINTACTUATOR
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
index c5cf67af67d..54e083b48f0 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
@@ -38,8 +38,8 @@
KX_ConstraintWrapper::KX_ConstraintWrapper(
PHY_ConstraintType ctype,
int constraintId,
- PHY_IPhysicsEnvironment* physenv,PyTypeObject *T) :
- PyObjectPlus(T),
+ PHY_IPhysicsEnvironment* physenv) :
+ PyObjectPlus(),
m_constraintId(constraintId),
m_constraintType(ctype),
m_physenv(physenv)
@@ -51,7 +51,7 @@ KX_ConstraintWrapper::~KX_ConstraintWrapper()
PyObject* KX_ConstraintWrapper::PyGetConstraintId()
{
- return PyInt_FromLong(m_constraintId);
+ return PyLong_FromSsize_t(m_constraintId);
}
@@ -83,53 +83,27 @@ PyObject* KX_ConstraintWrapper::PySetParam(PyObject* args, PyObject* kwds)
//python specific stuff
PyTypeObject KX_ConstraintWrapper::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_ConstraintWrapper",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_ConstraintWrapper::Parents[] = {
- &KX_ConstraintWrapper::Type,
- NULL
+ "KX_ConstraintWrapper",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &PyObjectPlus::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-//here you can search for existing data members (like mass,friction etc.)
-PyObject* KX_ConstraintWrapper::py_getattro(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* KX_ConstraintWrapper::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-int KX_ConstraintWrapper::py_setattro(PyObject *attr,PyObject* value)
-{
- py_setattro_up(PyObjectPlus);
-};
-
-
-
-
-
PyMethodDef KX_ConstraintWrapper::Methods[] = {
{"getConstraintId",(PyCFunction) KX_ConstraintWrapper::sPyGetConstraintId, METH_NOARGS},
{"setParam",(PyCFunction) KX_ConstraintWrapper::sPySetParam, METH_VARARGS},
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.h b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
index 03813e0f167..74670944415 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.h
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
@@ -35,11 +35,8 @@
class KX_ConstraintWrapper : public PyObjectPlus
{
Py_Header;
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
public:
- KX_ConstraintWrapper(PHY_ConstraintType ctype,int constraintId,class PHY_IPhysicsEnvironment* physenv,PyTypeObject *T = &Type);
+ KX_ConstraintWrapper(PHY_ConstraintType ctype,int constraintId,class PHY_IPhysicsEnvironment* physenv);
virtual ~KX_ConstraintWrapper ();
int getConstraintId() { return m_constraintId;};
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
index 9d3b9cdaf74..147bd238009 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
@@ -164,7 +164,7 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
struct KX_ObjectProperties* objprop);
void KX_ClearBulletSharedShapes();
-//bool KX_ReInstanceShapeFromMesh(RAS_MeshObject* meshobj);
+bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *from_gameobj, RAS_MeshObject* from_meshobj);
#endif
#endif //KX_CONVERTPHYSICSOBJECTS
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index 64b5760de28..04e82d21cf4 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -628,5 +628,44 @@ void KX_ClearBulletSharedShapes()
{
}
-#endif
+/* Refresh the physics object from either an object or a mesh.
+ * gameobj must be valid
+ * from_gameobj and from_meshobj can be NULL
+ *
+ * when setting the mesh, the following vars get priority
+ * 1) from_meshobj - creates the phys mesh from RAS_MeshObject
+ * 2) from_gameobj - creates the phys mesh from the DerivedMesh where possible, else the RAS_MeshObject
+ * 3) gameobj - update the phys mesh from DerivedMesh or RAS_MeshObject
+ *
+ * Most of the logic behind this is in shapeInfo->UpdateMesh(...)
+ */
+bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *from_gameobj, RAS_MeshObject* from_meshobj)
+{
+ KX_BulletPhysicsController *spc= static_cast<KX_BulletPhysicsController*>((gameobj->GetPhysicsController()));
+ CcdShapeConstructionInfo *shapeInfo;
+
+ /* if this is the child of a compound shape this can happen
+ * dont support compound shapes for now */
+ if(spc==NULL)
+ return false;
+
+ shapeInfo = spc->GetShapeInfo();
+
+ if(shapeInfo->m_shapeType != PHY_SHAPE_MESH || spc->GetSoftBody())
+ return false;
+
+ spc->DeleteControllerShape();
+
+ if(from_gameobj==NULL && from_meshobj==NULL)
+ from_gameobj= gameobj;
+
+ /* updates the arrays used for making the new bullet mesh */
+ shapeInfo->UpdateMesh(from_gameobj, from_meshobj);
+ /* create the new bullet mesh */
+ btCollisionShape* bm= shapeInfo->CreateBulletShape(spc->getConstructionInfo().m_margin);
+
+ spc->ReplaceControllerShape(bm);
+ return true;
+}
+#endif
diff --git a/source/gameengine/Ketsji/KX_Dome.h b/source/gameengine/Ketsji/KX_Dome.h
index 20b60ef0173..9ff33fe2852 100644
--- a/source/gameengine/Ketsji/KX_Dome.h
+++ b/source/gameengine/Ketsji/KX_Dome.h
@@ -18,7 +18,7 @@ http://www.gnu.org/copyleft/lesser.txt.
Contributor(s): Dalai Felinto
This source uses some of the ideas and code 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.
-----------------------------------------------------------------------------
*/
@@ -78,7 +78,7 @@ public:
bool fboSupported;
//openGL names:
- GLuint domefacesId[7]; // ID of the images -- room for 7 images, using only 4 for 180º x 360º dome, 6 for panoramic and +1 for warp mesh
+ GLuint domefacesId[7]; // ID of the images -- room for 7 images, using only 4 for 180� x 360� dome, 6 for panoramic and +1 for warp mesh
GLuint dlistId; // ID of the Display Lists of the images (used as an offset)
typedef struct {
@@ -184,6 +184,13 @@ protected:
RAS_IRenderTools* m_rendertools;
/// engine
KX_KetsjiEngine* m_engine;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_Dome"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_EmptyObject.h b/source/gameengine/Ketsji/KX_EmptyObject.h
index 62aa7fcd017..fa405e20076 100644
--- a/source/gameengine/Ketsji/KX_EmptyObject.h
+++ b/source/gameengine/Ketsji/KX_EmptyObject.h
@@ -37,7 +37,13 @@ public:
KX_GameObject(sgReplicationInfo,callbacks)
{};
virtual ~KX_EmptyObject();
-
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_EmptyObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_EMPTYOBJECT
diff --git a/source/gameengine/Ketsji/KX_GameActuator.cpp b/source/gameengine/Ketsji/KX_GameActuator.cpp
index 28bf12f5e87..71980a3347e 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.cpp
+++ b/source/gameengine/Ketsji/KX_GameActuator.cpp
@@ -49,9 +49,8 @@ KX_GameActuator::KX_GameActuator(SCA_IObject *gameobj,
const STR_String& filename,
const STR_String& loadinganimationname,
KX_Scene* scene,
- KX_KetsjiEngine* ketsjiengine,
- PyTypeObject* T)
- : SCA_IActuator(gameobj, T)
+ KX_KetsjiEngine* ketsjiengine)
+ : SCA_IActuator(gameobj, KX_ACT_GAME)
{
m_mode = mode;
m_filename = filename;
@@ -208,48 +207,29 @@ bool KX_GameActuator::Update()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_GameActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_GameActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject KX_GameActuator::Parents[] =
-{
- &KX_GameActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ "KX_GameActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef KX_GameActuator::Methods[] =
{
- // Deprecated ----->
- {"getFile", (PyCFunction) KX_GameActuator::sPyGetFile, METH_VARARGS, (PY_METHODCHAR)GetFile_doc},
- {"setFile", (PyCFunction) KX_GameActuator::sPySetFile, METH_VARARGS, (PY_METHODCHAR)SetFile_doc},
- // <-----
{NULL,NULL} //Sentinel
};
@@ -258,51 +238,3 @@ PyAttributeDef KX_GameActuator::Attributes[] = {
KX_PYATTRIBUTE_INT_RW("mode", KX_GAME_NODEF+1, KX_GAME_MAX-1, true, KX_GameActuator, m_mode),
{ NULL } //Sentinel
};
-
-PyObject* KX_GameActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_GameActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_GameActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
-// Deprecated ----->
-/* getFile */
-const char KX_GameActuator::GetFile_doc[] =
-"getFile()\n"
-"get the name of the file to start.\n";
-PyObject* KX_GameActuator::PyGetFile(PyObject* args, PyObject* kwds)
-{
- ShowDeprecationWarning("getFile()", "the fileName property");
- return PyString_FromString(m_filename);
-}
-
-/* setFile */
-const char KX_GameActuator::SetFile_doc[] =
-"setFile(name)\n"
-"set the name of the file to start.\n";
-PyObject* KX_GameActuator::PySetFile(PyObject* args, PyObject* kwds)
-{
- char* new_file;
-
- ShowDeprecationWarning("setFile()", "the fileName property");
-
- if (!PyArg_ParseTuple(args, "s:setFile", &new_file))
- {
- return NULL;
- }
-
- m_filename = STR_String(new_file);
-
- Py_RETURN_NONE;
-
-}
-// <-----
diff --git a/source/gameengine/Ketsji/KX_GameActuator.h b/source/gameengine/Ketsji/KX_GameActuator.h
index b2b1d6ec2b9..37d09a5a9fb 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.h
+++ b/source/gameengine/Ketsji/KX_GameActuator.h
@@ -65,8 +65,7 @@ protected:
const STR_String& filename,
const STR_String& loadinganimationname,
KX_Scene* scene,
- KX_KetsjiEngine* ketsjiEngine,
- PyTypeObject* T=&Type);
+ KX_KetsjiEngine* ketsjiEngine);
virtual ~KX_GameActuator();
virtual CValue* GetReplica();
@@ -76,15 +75,6 @@ protected:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // Deprecated functions ----->
- KX_PYMETHOD_DOC(KX_GameActuator,GetFile);
- KX_PYMETHOD_DOC(KX_GameActuator,SetFile);
- // <-----
}; /* end of class KX_GameActuator */
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 577f767b475..a02fd9cec1b 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -46,6 +46,7 @@ typedef unsigned long uint_ptr;
#define KX_INERTIA_INFINITE 10000
+#include "BLI_arithb.h"
#include "RAS_IPolygonMaterial.h"
#include "KX_BlenderMaterial.h"
#include "KX_GameObject.h"
@@ -66,6 +67,7 @@ typedef unsigned long uint_ptr;
#include "KX_PythonInit.h"
#include "KX_PyMath.h"
#include "KX_PythonSeq.h"
+#include "KX_ConvertPhysicsObject.h"
#include "SCA_IActuator.h"
#include "SCA_ISensor.h"
#include "SCA_IController.h"
@@ -86,10 +88,8 @@ static MT_Matrix3x3 dummy_orientation = MT_Matrix3x3( 1.0, 0.0, 0.0,
KX_GameObject::KX_GameObject(
void* sgReplicationInfo,
- SG_Callbacks callbacks,
- PyTypeObject* T
-) :
- SCA_IObject(T),
+ SG_Callbacks callbacks)
+ : SCA_IObject(),
m_bDyna(false),
m_layer(0),
m_pBlenderObject(NULL),
@@ -102,7 +102,6 @@ KX_GameObject::KX_GameObject(
m_bOccluder(false),
m_pPhysicsController1(NULL),
m_pGraphicController(NULL),
- m_pPhysicsEnvironment(NULL),
m_xray(false),
m_pHitObject(NULL),
m_isDeformable(false),
@@ -456,6 +455,22 @@ double* KX_GameObject::GetOpenGLMatrix()
return fl;
}
+void KX_GameObject::UpdateBlenderObjectMatrix(Object* blendobj)
+{
+ if (!blendobj)
+ blendobj = m_pBlenderObject;
+ if (blendobj) {
+ const MT_Matrix3x3& rot = NodeGetWorldOrientation();
+ const MT_Vector3& scale = NodeGetWorldScaling();
+ const MT_Vector3& pos = NodeGetWorldPosition();
+ rot.getValue(blendobj->obmat[0]);
+ pos.getValue(blendobj->obmat[3]);
+ VecMulf(blendobj->obmat[0], scale[0]);
+ VecMulf(blendobj->obmat[1], scale[1]);
+ VecMulf(blendobj->obmat[2], scale[2]);
+ }
+}
+
void KX_GameObject::AddMeshUser()
{
for (size_t i=0;i<m_meshes.size();i++)
@@ -466,7 +481,7 @@ void KX_GameObject::AddMeshUser()
double* fl = GetOpenGLMatrixPtr()->getPointer();
SG_QList::iterator<RAS_MeshSlot> mit(m_meshSlots);
- RAS_MeshSlot* ms;
+// RAS_MeshSlot* ms;
for(mit.begin(); !mit.end(); ++mit)
{
(*mit)->m_OpenGLMatrix = fl;
@@ -1385,12 +1400,13 @@ PyMethodDef KX_GameObject::Methods[] = {
{"setVisible",(PyCFunction) KX_GameObject::sPySetVisible, METH_VARARGS},
{"setOcclusion",(PyCFunction) KX_GameObject::sPySetOcclusion, METH_VARARGS},
{"removeParent", (PyCFunction)KX_GameObject::sPyRemoveParent,METH_NOARGS},
- {"getChildren", (PyCFunction)KX_GameObject::sPyGetChildren,METH_NOARGS},
- {"getChildrenRecursive", (PyCFunction)KX_GameObject::sPyGetChildrenRecursive,METH_NOARGS},
+
+
{"getPhysicsId", (PyCFunction)KX_GameObject::sPyGetPhysicsId,METH_NOARGS},
{"getPropertyNames", (PyCFunction)KX_GameObject::sPyGetPropertyNames,METH_NOARGS},
- {"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_O},
+ {"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_VARARGS},
{"endObject",(PyCFunction) KX_GameObject::sPyEndObject, METH_NOARGS},
+ {"reinstancePhysicsMesh", (PyCFunction)KX_GameObject::sPyReinstancePhysicsMesh,METH_VARARGS},
KX_PYMETHODTABLE(KX_GameObject, rayCastTo),
KX_PYMETHODTABLE(KX_GameObject, rayCast),
@@ -1399,21 +1415,8 @@ PyMethodDef KX_GameObject::Methods[] = {
KX_PYMETHODTABLE(KX_GameObject, sendMessage),
// dict style access for props
- {"has_key",(PyCFunction) KX_GameObject::sPyhas_key, METH_O},
{"get",(PyCFunction) KX_GameObject::sPyget, METH_VARARGS},
- // deprecated
- {"getPosition", (PyCFunction) KX_GameObject::sPyGetPosition, METH_NOARGS},
- {"setPosition", (PyCFunction) KX_GameObject::sPySetPosition, METH_O},
- {"setWorldPosition", (PyCFunction) KX_GameObject::sPySetWorldPosition, METH_O},
- {"getOrientation", (PyCFunction) KX_GameObject::sPyGetOrientation, METH_NOARGS},
- {"setOrientation", (PyCFunction) KX_GameObject::sPySetOrientation, METH_O},
- {"getState",(PyCFunction) KX_GameObject::sPyGetState, METH_NOARGS},
- {"setState",(PyCFunction) KX_GameObject::sPySetState, METH_O},
- {"getParent", (PyCFunction)KX_GameObject::sPyGetParent,METH_NOARGS},
- {"getVisible",(PyCFunction) KX_GameObject::sPyGetVisible, METH_NOARGS},
- {"getMass", (PyCFunction) KX_GameObject::sPyGetMass, METH_NOARGS},
- {"getMesh", (PyCFunction)KX_GameObject::sPyGetMesh,METH_VARARGS},
{NULL,NULL} //Sentinel
};
@@ -1466,15 +1469,21 @@ bool KX_GameObject::ConvertPythonVectorArgs(PyObject* args,
}
*/
-PyObject* KX_GameObject::PyReplaceMesh(PyObject* value)
+PyObject* KX_GameObject::PyReplaceMesh(PyObject* args)
{
KX_Scene *scene = KX_GetActiveScene();
- RAS_MeshObject* new_mesh;
+
+ PyObject *value;
+ int use_gfx= 1, use_phys= 0;
+ RAS_MeshObject *new_mesh;
+
+ if (!PyArg_ParseTuple(args,"O|ii:replaceMesh", &value, &use_gfx, &use_phys))
+ return NULL;
if (!ConvertPythonToMesh(value, &new_mesh, false, "gameOb.replaceMesh(value): KX_GameObject"))
return NULL;
- scene->ReplaceMesh(this, new_mesh);
+ scene->ReplaceMesh(this, new_mesh, (bool)use_gfx, (bool)use_phys);
Py_RETURN_NONE;
}
@@ -1488,17 +1497,32 @@ PyObject* KX_GameObject::PyEndObject()
}
-
-PyObject* KX_GameObject::PyGetPosition()
+PyObject* KX_GameObject::PyReinstancePhysicsMesh(PyObject* args)
{
- ShowDeprecationWarning("getPosition()", "the position property");
- return PyObjectFrom(NodeGetWorldPosition());
+ KX_GameObject *gameobj= NULL;
+ RAS_MeshObject *mesh= NULL;
+
+ PyObject *gameobj_py= NULL;
+ PyObject *mesh_py= NULL;
+
+ if ( !PyArg_ParseTuple(args,"|OO:reinstancePhysicsMesh",&gameobj_py, &mesh_py) ||
+ (gameobj_py && !ConvertPythonToGameObject(gameobj_py, &gameobj, true, "gameOb.reinstancePhysicsMesh(obj, mesh): KX_GameObject")) ||
+ (mesh_py && !ConvertPythonToMesh(mesh_py, &mesh, true, "gameOb.reinstancePhysicsMesh(obj, mesh): KX_GameObject"))
+ ) {
+ return NULL;
+ }
+
+ /* gameobj and mesh can be NULL */
+ if(KX_ReInstanceBulletShapeFromMesh(this, gameobj, mesh))
+ Py_RETURN_TRUE;
+
+ Py_RETURN_FALSE;
}
static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
- const char *attr_str= PyString_AsString(item);
+ const char *attr_str= _PyUnicode_AsString(item);
CValue* resultattr;
PyObject* pyconvert;
@@ -1532,7 +1556,7 @@ static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
- const char *attr_str= PyString_AsString(key);
+ const char *attr_str= _PyUnicode_AsString(key);
if(attr_str==NULL)
PyErr_Clear();
@@ -1564,7 +1588,7 @@ static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
int set= 0;
/* as CValue */
- if(attr_str && BGE_PROXY_CHECK_TYPE(val)==0) /* dont allow GameObjects for eg to be assigned to CValue props */
+ if(attr_str && PyObject_TypeCheck(val, &PyObjectPlus::Type)==0) /* dont allow GameObjects for eg to be assigned to CValue props */
{
CValue* vallie = self->ConvertPythonToValue(val, ""); /* error unused */
@@ -1626,7 +1650,7 @@ static int Seq_Contains(PyObject *self_v, PyObject *value)
return -1;
}
- if(PyString_Check(value) && self->GetProperty(PyString_AsString(value)))
+ if(PyUnicode_Check(value) && self->GetProperty(_PyUnicode_AsString(value)))
return 1;
if (self->m_attr_dict && PyDict_GetItem(self->m_attr_dict, value))
@@ -1654,50 +1678,37 @@ PySequenceMethods KX_GameObject::Sequence = {
};
PyTypeObject KX_GameObject::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_GameObject",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,
- &Sequence,
- &Mapping,
- 0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,
- Py_TPFLAGS_DEFAULT,
- 0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-
-
-
-PyParentObject KX_GameObject::Parents[] = {
- &KX_GameObject::Type,
- &SCA_IObject::Type,
- &CValue::Type,
- NULL
+ "KX_GameObject",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,
+ &Sequence,
+ &Mapping,
+ 0,0,0,
+ NULL,
+ NULL,
+ 0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IObject::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
PyObject* KX_GameObject::pyattr_get_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
- return PyString_FromString(self->GetName().ReadPtr());
+ return PyUnicode_FromString(self->GetName().ReadPtr());
}
PyObject* KX_GameObject::pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
@@ -1803,10 +1814,10 @@ int KX_GameObject::pyattr_set_visible(void *self_v, const KX_PYATTRIBUTE_DEF *at
PyObject* KX_GameObject::pyattr_get_worldPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
#ifdef USE_MATHUTILS
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_POS_GLOBAL);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_POS_GLOBAL);
#else
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
return PyObjectFrom(self->NodeGetWorldPosition());
#endif
}
@@ -1825,10 +1836,10 @@ int KX_GameObject::pyattr_set_worldPosition(void *self_v, const KX_PYATTRIBUTE_D
PyObject* KX_GameObject::pyattr_get_localPosition(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
#ifdef USE_MATHUTILS
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_POS_LOCAL);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_POS_LOCAL);
#else
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
return PyObjectFrom(self->NodeGetLocalPosition());
#endif
}
@@ -1847,10 +1858,10 @@ int KX_GameObject::pyattr_set_localPosition(void *self_v, const KX_PYATTRIBUTE_D
PyObject* KX_GameObject::pyattr_get_localInertia(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
#ifdef USE_MATHUTILS
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_INERTIA_LOCAL);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_INERTIA_LOCAL);
#else
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
if (self->GetPhysicsController())
return PyObjectFrom(self->GetPhysicsController()->GetLocalInertia());
return Py_BuildValue("fff", 0.0f, 0.0f, 0.0f);
@@ -1860,7 +1871,7 @@ PyObject* KX_GameObject::pyattr_get_localInertia(void *self_v, const KX_PYATTRIB
PyObject* KX_GameObject::pyattr_get_worldOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
#ifdef USE_MATHUTILS
- return newMatrixObject_cb((PyObject *)self_v, 3, 3, mathutils_kxgameob_matrix_cb_index, MATHUTILS_MAT_CB_ORI_GLOBAL);
+ return newMatrixObject_cb(BGE_PROXY_FROM_REF(self_v), 3, 3, mathutils_kxgameob_matrix_cb_index, MATHUTILS_MAT_CB_ORI_GLOBAL);
#else
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
return PyObjectFrom(self->NodeGetWorldOrientation());
@@ -1885,7 +1896,7 @@ int KX_GameObject::pyattr_set_worldOrientation(void *self_v, const KX_PYATTRIBUT
PyObject* KX_GameObject::pyattr_get_localOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
#ifdef USE_MATHUTILS
- return newMatrixObject_cb((PyObject *)self_v, 3, 3, mathutils_kxgameob_matrix_cb_index, MATHUTILS_MAT_CB_ORI_LOCAL);
+ return newMatrixObject_cb(BGE_PROXY_FROM_REF(self_v), 3, 3, mathutils_kxgameob_matrix_cb_index, MATHUTILS_MAT_CB_ORI_LOCAL);
#else
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
return PyObjectFrom(self->NodeGetLocalOrientation());
@@ -1908,21 +1919,21 @@ int KX_GameObject::pyattr_set_localOrientation(void *self_v, const KX_PYATTRIBUT
PyObject* KX_GameObject::pyattr_get_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
#ifdef USE_MATHUTILS
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_SCALE_GLOBAL);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_SCALE_GLOBAL);
#else
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
return PyObjectFrom(self->NodeGetWorldScaling());
#endif
}
PyObject* KX_GameObject::pyattr_get_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
#ifdef USE_MATHUTILS
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_SCALE_LOCAL);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxgameob_vector_cb_index, MATHUTILS_VEC_CB_SCALE_LOCAL);
#else
- return PyObjectFrom(self->NodeGetLocalScale());
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
+ return PyObjectFrom(self->NodeGetLocalScaling());
#endif
}
@@ -1970,13 +1981,13 @@ PyObject* KX_GameObject::pyattr_get_state(void *self_v, const KX_PYATTRIBUTE_DEF
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
int state = 0;
state |= self->GetState();
- return PyInt_FromLong(state);
+ return PyLong_FromSsize_t(state);
}
int KX_GameObject::pyattr_set_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
- int state_i = PyInt_AsLong(value);
+ int state_i = PyLong_AsSsize_t(value);
unsigned int state = 0;
if (state_i == -1 && PyErr_Occurred()) {
@@ -2047,128 +2058,6 @@ PyObject* KX_GameObject::pyattr_get_attrDict(void *self_v, const KX_PYATTRIBUTE_
return self->m_attr_dict;
}
-/* We need these because the macros have a return in them */
-PyObject* KX_GameObject::py_getattro__internal(PyObject *attr)
-{
- py_getattro_up(SCA_IObject);
-}
-
-int KX_GameObject::py_setattro__internal(PyObject *attr, PyObject *value) // py_setattro method
-{
- py_setattro_up(SCA_IObject);
-}
-
-
-PyObject* KX_GameObject::py_getattro(PyObject *attr)
-{
- PyObject *object= py_getattro__internal(attr);
-
- if (object==NULL && m_attr_dict)
- {
- /* backup the exception incase the attr doesnt exist in the dict either */
- PyObject *err_type, *err_value, *err_tb;
- PyErr_Fetch(&err_type, &err_value, &err_tb);
-
- object= PyDict_GetItem(m_attr_dict, attr);
- if (object) {
- Py_INCREF(object);
-
- PyErr_Clear();
- Py_XDECREF( err_type );
- Py_XDECREF( err_value );
- Py_XDECREF( err_tb );
- }
- else {
- PyErr_Restore(err_type, err_value, err_tb); /* use the error from the parent function */
- }
- }
- return object;
-}
-
-PyObject* KX_GameObject::py_getattro_dict() {
- //py_getattro_dict_up(SCA_IObject);
- PyObject *dict= py_getattr_dict(SCA_IObject::py_getattro_dict(), Type.tp_dict);
- if(dict==NULL)
- return NULL;
-
- /* normally just return this but KX_GameObject has some more items */
-
-
- /* Not super fast getting as a list then making into dict keys but its only for dir() */
- PyObject *list= ConvertKeysToPython();
- if(list)
- {
- int i;
- for(i=0; i<PyList_Size(list); i++)
- PyDict_SetItem(dict, PyList_GET_ITEM(list, i), Py_None);
- }
- else
- PyErr_Clear();
-
- Py_DECREF(list);
-
- /* Add m_attr_dict if we have it */
- if(m_attr_dict)
- PyDict_Update(dict, m_attr_dict);
-
- return dict;
-}
-
-int KX_GameObject::py_setattro(PyObject *attr, PyObject *value) // py_setattro method
-{
- int ret= py_setattro__internal(attr, value);
-
- if (ret==PY_SET_ATTR_SUCCESS) {
- /* remove attribute in our own dict to avoid double ups */
- /* NOTE: Annoying that we also do this for setting builtin attributes like mass and visibility :/ */
- if (m_attr_dict) {
- if (PyDict_DelItem(m_attr_dict, attr) != 0)
- PyErr_Clear();
- }
- }
-
- if (ret==PY_SET_ATTR_COERCE_FAIL) {
- /* CValue attribute exists, remove CValue and add PyDict value */
- RemoveProperty(PyString_AsString(attr));
- ret= PY_SET_ATTR_MISSING;
- }
-
- if (ret==PY_SET_ATTR_MISSING) {
- /* Lazy initialization */
- if (m_attr_dict==NULL)
- m_attr_dict = PyDict_New();
-
- if (PyDict_SetItem(m_attr_dict, attr, value)==0) {
- PyErr_Clear();
- ret= PY_SET_ATTR_SUCCESS;
- }
- else {
- PyErr_Format(PyExc_AttributeError, "gameOb.myAttr = value: KX_GameObject, failed assigning value to internal dictionary");
- ret= PY_SET_ATTR_FAIL;
- }
- }
-
- return ret;
-}
-
-
-int KX_GameObject::py_delattro(PyObject *attr)
-{
- ShowDeprecationWarning("del ob.attr", "del ob['attr'] for user defined properties");
-
- char *attr_str= PyString_AsString(attr);
-
- if (RemoveProperty(attr_str)) // XXX - should call CValues instead but its only 2 lines here
- return PY_SET_ATTR_SUCCESS;
-
- if (m_attr_dict && (PyDict_DelItem(m_attr_dict, attr) == 0))
- return PY_SET_ATTR_SUCCESS;
-
- PyErr_Format(PyExc_AttributeError, "del gameOb.myAttr: KX_GameObject, attribute \"%s\" dosnt exist", attr_str);
- return PY_SET_ATTR_MISSING;
-}
-
-
PyObject* KX_GameObject::PyApplyForce(PyObject* args)
{
int local = 0;
@@ -2309,41 +2198,6 @@ PyObject* KX_GameObject::PySetOcclusion(PyObject* args)
Py_RETURN_NONE;
}
-PyObject* KX_GameObject::PyGetVisible()
-{
- ShowDeprecationWarning("getVisible()", "the visible property");
- return PyInt_FromLong(m_bVisible);
-}
-
-PyObject* KX_GameObject::PyGetState()
-{
- ShowDeprecationWarning("getState()", "the state property");
- int state = 0;
- state |= GetState();
- return PyInt_FromLong(state);
-}
-
-PyObject* KX_GameObject::PySetState(PyObject* value)
-{
- ShowDeprecationWarning("setState()", "the state property");
- int state_i = PyInt_AsLong(value);
- unsigned int state = 0;
-
- if (state_i == -1 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected an int bit field");
- return NULL;
- }
-
- state |= state_i;
- if ((state & ((1<<30)-1)) == 0) {
- PyErr_SetString(PyExc_AttributeError, "The state bitfield was not between 0 and 30 (1<<0 and 1<<29)");
- return NULL;
- }
- SetState(state);
-
- Py_RETURN_NONE;
-}
-
PyObject* KX_GameObject::PyGetVelocity(PyObject* args)
{
// only can get the velocity if we have a physics object connected to us...
@@ -2362,14 +2216,6 @@ PyObject* KX_GameObject::PyGetVelocity(PyObject* args)
}
}
-
-
-PyObject* KX_GameObject::PyGetMass()
-{
- ShowDeprecationWarning("getMass()", "the mass property");
- return PyFloat_FromDouble((GetPhysicsController() != NULL) ? GetPhysicsController()->GetMass() : 0.0f);
-}
-
PyObject* KX_GameObject::PyGetReactionForce()
{
// only can get the velocity if we have a physics object connected to us...
@@ -2406,18 +2252,6 @@ PyObject* KX_GameObject::PyDisableRigidBody()
}
-
-PyObject* KX_GameObject::PyGetParent()
-{
- ShowDeprecationWarning("getParent()", "the parent property");
- KX_GameObject* parent = this->GetParent();
- if (parent) {
- parent->Release(); /* self->GetParent() AddRef's */
- return parent->GetProxy();
- }
- Py_RETURN_NONE;
-}
-
PyObject* KX_GameObject::PySetParent(PyObject* args)
{
KX_Scene *scene = KX_GetActiveScene();
@@ -2443,41 +2277,6 @@ PyObject* KX_GameObject::PyRemoveParent()
Py_RETURN_NONE;
}
-PyObject* KX_GameObject::PyGetChildren()
-{
- ShowDeprecationWarning("getChildren()", "the children property");
-
- return GetChildren()->NewProxy(true);
-}
-
-PyObject* KX_GameObject::PyGetChildrenRecursive()
-{
- ShowDeprecationWarning("getChildrenRecursive()", "the childrenRecursive property");
-
- return GetChildrenRecursive()->NewProxy(true);
-}
-
-PyObject* KX_GameObject::PyGetMesh(PyObject* args)
-{
- ShowDeprecationWarning("getMesh()", "the meshes property (now a list of meshes)");
-
- int mesh = 0;
-
- if (!PyArg_ParseTuple(args, "|i:getMesh", &mesh))
- return NULL; // python sets a simple error
-
- if (((unsigned int)mesh < m_meshes.size()) && mesh >= 0)
- {
- KX_MeshProxy* meshproxy = new KX_MeshProxy(m_meshes[mesh]);
- return meshproxy->NewProxy(true); // XXX Todo Python own.
- }
-
- Py_RETURN_NONE;
-}
-
-
-
-
PyObject* KX_GameObject::PySetCollisionMargin(PyObject* value)
{
@@ -2541,29 +2340,6 @@ PyObject* KX_GameObject::PyRestoreDynamics()
}
-
-PyObject* KX_GameObject::PyGetOrientation() //keywords
-{
- ShowDeprecationWarning("getOrientation()", "the orientation property");
- return PyObjectFrom(NodeGetWorldOrientation());
-}
-
-
-
-PyObject* KX_GameObject::PySetOrientation(PyObject* value)
-{
- ShowDeprecationWarning("setOrientation()", "the orientation property");
- MT_Matrix3x3 rot;
-
- /* if value is not a sequence PyOrientationTo makes an error */
- if (!PyOrientationTo(value, rot, "gameOb.setOrientation(sequence): KX_GameObject, "))
- return NULL;
-
- NodeSetLocalOrientation(rot);
- NodeUpdateGS(0.f);
- Py_RETURN_NONE;
-}
-
PyObject* KX_GameObject::PyAlignAxisToVect(PyObject* args)
{
PyObject* pyvect;
@@ -2596,33 +2372,6 @@ PyObject* KX_GameObject::PyGetAxisVect(PyObject* value)
return NULL;
}
-PyObject* KX_GameObject::PySetPosition(PyObject* value)
-{
- ShowDeprecationWarning("setPosition()", "the localPosition property");
- MT_Point3 pos;
- if (PyVecTo(value, pos))
- {
- NodeSetLocalPosition(pos);
- NodeUpdateGS(0.f);
- Py_RETURN_NONE;
- }
-
- return NULL;
-}
-
-PyObject* KX_GameObject::PySetWorldPosition(PyObject* value)
-{
- ShowDeprecationWarning("setWorldPosition()", "the worldPosition property");
- MT_Point3 pos;
- if (PyVecTo(value, pos))
- {
- NodeSetWorldPosition(pos);
- NodeUpdateGS(0.f);
- Py_RETURN_NONE;
- }
-
- return NULL;
-}
PyObject* KX_GameObject::PyGetPhysicsId()
{
@@ -2632,7 +2381,7 @@ PyObject* KX_GameObject::PyGetPhysicsId()
{
physid= (uint_ptr)ctrl->GetUserData();
}
- return PyInt_FromLong((long)physid);
+ return PyLong_FromSsize_t((long)physid);
}
PyObject* KX_GameObject::PyGetPropertyNames()
@@ -2788,14 +2537,11 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo,
}
}
MT_Point3 fromPoint = NodeGetWorldPosition();
+
if (dist != 0.0f)
- {
- MT_Vector3 toDir = toPoint-fromPoint;
- toDir.normalize();
- toPoint = fromPoint + (dist) * toDir;
- }
-
- PHY_IPhysicsEnvironment* pe = GetPhysicsEnvironment();
+ toPoint = fromPoint + dist * (toPoint-fromPoint).safe_normalized();
+
+ PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment();
KX_IPhysicsController *spc = GetPhysicsController();
KX_GameObject *parent = GetParent();
if (!spc && parent)
@@ -2922,7 +2668,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCast,
return none_tuple_3();
}
- PHY_IPhysicsEnvironment* pe = GetPhysicsEnvironment();
+ PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment();
KX_IPhysicsController *spc = GetPhysicsController();
KX_GameObject *parent = GetParent();
if (!spc && parent)
@@ -2987,7 +2733,7 @@ KX_PYMETHODDEF_DOC_VARARGS(KX_GameObject, sendMessage,
char* to = (char *)"";
const STR_String& from = GetName();
- if (!PyArg_ParseTuple(args, "s|sss:sendMessage", &subject, &body, &to))
+ if (!PyArg_ParseTuple(args, "s|ss:sendMessage", &subject, &body, &to))
return NULL;
scene->GetNetworkScene()->SendMessage(to, from, subject, body);
@@ -3008,8 +2754,8 @@ PyObject* KX_GameObject::Pyget(PyObject *args)
return NULL;
- if(PyString_Check(key)) {
- CValue *item = GetProperty(PyString_AsString(key));
+ if(PyUnicode_Check(key)) {
+ CValue *item = GetProperty(_PyUnicode_AsString(key));
if (item) {
ret = item->ConvertValueToPython();
if(ret)
@@ -3028,14 +2774,6 @@ PyObject* KX_GameObject::Pyget(PyObject *args)
return def;
}
-/* Matches python dict.has_key() */
-PyObject* KX_GameObject::Pyhas_key(PyObject* value)
-{
- // the ONLY error case is invalid data, this is checked by the macro'd static function
- // that calls this one. but make sure Seq_Contains doesnt add extra errors later on.
- return PyBool_FromLong(Seq_Contains((PyObject *)this, value));
-}
-
/* ---------------------------------------------------------------------
* Some stuff taken from the header
* --------------------------------------------------------------------- */
@@ -3078,13 +2816,13 @@ bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py
}
}
- if (PyString_Check(value)) {
- *object = (KX_GameObject*)SCA_ILogicBrick::m_sCurrentLogicManager->GetGameObjectByName(STR_String( PyString_AsString(value) ));
+ if (PyUnicode_Check(value)) {
+ *object = (KX_GameObject*)SCA_ILogicBrick::m_sCurrentLogicManager->GetGameObjectByName(STR_String( _PyUnicode_AsString(value) ));
if (*object) {
return true;
} else {
- PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_GameObject in this scene", error_prefix, PyString_AsString(value));
+ PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_GameObject in this scene", error_prefix, _PyUnicode_AsString(value));
return false;
}
}
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 59285714950..4c4eed9ca71 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -98,8 +98,6 @@ protected:
KX_IPhysicsController* m_pPhysicsController1;
PHY_IGraphicController* m_pGraphicController;
- // used for ray casting
- PHY_IPhysicsEnvironment* m_pPhysicsEnvironment;
STR_String m_testPropName;
bool m_xray;
KX_GameObject* m_pHitObject;
@@ -160,6 +158,15 @@ public:
return &m_OpenGL_4x4Matrix;
};
+ /**
+ * Update the blender object obmat field from the object world position
+ * if blendobj is NULL, update the object pointed by m_pBlenderObject
+ * The user must take action to restore the matrix before leaving the GE.
+ * Used in Armature evaluation
+ */
+ void
+ UpdateBlenderObjectMatrix(Object* blendobj=NULL);
+
/**
* Get a pointer to the game object that is the parent of
* this object. Or NULL if there is no parent. The returned
@@ -189,8 +196,7 @@ public:
KX_GameObject(
void* sgReplicationInfo,
- SG_Callbacks callbacks,
- PyTypeObject* T=&Type
+ SG_Callbacks callbacks
);
virtual
@@ -338,20 +344,6 @@ public:
bool ang_vel_local
);
-
- /**
- * @return a pointer to the physics environment in use during the game, for rayCasting
- */
- PHY_IPhysicsEnvironment* GetPhysicsEnvironment()
- {
- return m_pPhysicsEnvironment;
- }
-
- void SetPhysicsEnvironment(PHY_IPhysicsEnvironment* physicsEnvironment)
- {
- m_pPhysicsEnvironment = physicsEnvironment;
- }
-
/**
* @return a pointer to the physics controller owned by this class.
*/
@@ -808,25 +800,11 @@ public:
/**
* @section Python interface functions.
*/
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value); // py_setattro method
- virtual int py_delattro(PyObject *attr);
virtual PyObject* py_repr(void)
{
- return PyString_FromString(GetName().ReadPtr());
+ return PyUnicode_FromString(GetName().ReadPtr());
}
-
-
- /* quite annoying that we need these but the bloody
- * py_getattro_up and py_setattro_up macro's have a returns in them! */
- PyObject* py_getattro__internal(PyObject *attr);
- int py_setattro__internal(PyObject *attr, PyObject *value); // py_setattro method
-
-
- KX_PYMETHOD_NOARGS(KX_GameObject,GetPosition);
- KX_PYMETHOD_O(KX_GameObject,SetPosition);
+
KX_PYMETHOD_O(KX_GameObject,SetWorldPosition);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyForce);
KX_PYMETHOD_VARARGS(KX_GameObject, ApplyTorque);
@@ -837,10 +815,10 @@ public:
KX_PYMETHOD_VARARGS(KX_GameObject,GetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,SetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_GameObject,GetVelocity);
- KX_PYMETHOD_NOARGS(KX_GameObject,GetMass);
+
KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce);
- KX_PYMETHOD_NOARGS(KX_GameObject,GetOrientation);
- KX_PYMETHOD_O(KX_GameObject,SetOrientation);
+
+
KX_PYMETHOD_NOARGS(KX_GameObject,GetVisible);
KX_PYMETHOD_VARARGS(KX_GameObject,SetVisible);
KX_PYMETHOD_VARARGS(KX_GameObject,SetOcclusion);
@@ -857,22 +835,22 @@ public:
KX_PYMETHOD_NOARGS(KX_GameObject,GetParent);
KX_PYMETHOD_VARARGS(KX_GameObject,SetParent);
KX_PYMETHOD_NOARGS(KX_GameObject,RemoveParent);
- KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren);
+ KX_PYMETHOD_NOARGS(KX_GameObject,GetChildren);
KX_PYMETHOD_NOARGS(KX_GameObject,GetChildrenRecursive);
KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId);
KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
- KX_PYMETHOD_O(KX_GameObject,ReplaceMesh);
+ KX_PYMETHOD_VARARGS(KX_GameObject,ReplaceMesh);
KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
KX_PYMETHOD_DOC(KX_GameObject,rayCastTo);
KX_PYMETHOD_DOC(KX_GameObject,rayCast);
KX_PYMETHOD_DOC_O(KX_GameObject,getDistanceTo);
KX_PYMETHOD_DOC_O(KX_GameObject,getVectTo);
KX_PYMETHOD_DOC_VARARGS(KX_GameObject, sendMessage);
+ KX_PYMETHOD_VARARGS(KX_GameObject, ReinstancePhysicsMesh);
/* Dict access */
KX_PYMETHOD_VARARGS(KX_GameObject,get);
- KX_PYMETHOD_O(KX_GameObject,has_key);
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_IInterpolator.h b/source/gameengine/Ketsji/KX_IInterpolator.h
index 8c899a4db0b..52b9b3be5af 100644
--- a/source/gameengine/Ketsji/KX_IInterpolator.h
+++ b/source/gameengine/Ketsji/KX_IInterpolator.h
@@ -31,11 +31,22 @@
#include <vector>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_IInterpolator {
public:
virtual ~KX_IInterpolator() {}
virtual void Execute(float currentTime) const = 0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
typedef std::vector<KX_IInterpolator *> T_InterpolatorList;
diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.h b/source/gameengine/Ketsji/KX_IPO_SGController.h
index 031b74294ce..68a74c3a364 100644
--- a/source/gameengine/Ketsji/KX_IPO_SGController.h
+++ b/source/gameengine/Ketsji/KX_IPO_SGController.h
@@ -116,6 +116,12 @@ public:
m_ipotime = time;
m_modified = true;
}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IpoSGController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__IPO_SGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h
index 81c01045071..f9dcf81bca5 100644
--- a/source/gameengine/Ketsji/KX_IPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_IPhysicsController.h
@@ -126,6 +126,13 @@ public:
// call from scene graph to update
virtual bool Update(double time)=0;
void* GetUserData() { return m_userdata;}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IPhysicsController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_IPHYSICSCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_IScalarInterpolator.h b/source/gameengine/Ketsji/KX_IScalarInterpolator.h
index 6ba685885e9..ec6183b88a1 100644
--- a/source/gameengine/Ketsji/KX_IScalarInterpolator.h
+++ b/source/gameengine/Ketsji/KX_IScalarInterpolator.h
@@ -29,11 +29,22 @@
#ifndef KX_ISCALARINTERPOLATOR_H
#define KX_ISCALARINTERPOLATOR_H
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_IScalarInterpolator {
public:
virtual ~KX_IScalarInterpolator() {}
virtual float GetValue(float currentTime) const = 0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_IScalarInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_ISceneConverter.h b/source/gameengine/Ketsji/KX_ISceneConverter.h
index 3709fa8c784..f098b0bebf5 100644
--- a/source/gameengine/Ketsji/KX_ISceneConverter.h
+++ b/source/gameengine/Ketsji/KX_ISceneConverter.h
@@ -32,6 +32,10 @@
#include "STR_String.h"
#include "KX_Python.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct Scene;
class KX_ISceneConverter
@@ -47,10 +51,9 @@ public:
destinationscene: pass an empty scene, everything goes into this
dictobj: python dictionary (for pythoncontrollers)
*/
- virtual void ConvertScene(const STR_String& scenename,
+ virtual void ConvertScene(
class KX_Scene* destinationscene,
PyObject* dictobj,
- class SCA_IInputDevice* keyinputdev,
class RAS_IRenderTools* rendertools,
class RAS_ICanvas* canvas)=0;
@@ -81,6 +84,13 @@ public:
virtual bool GetGLSLMaterials()=0;
virtual struct Scene* GetBlenderSceneForName(const STR_String& name)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISceneConverter"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_ISCENECONVERTER_H
diff --git a/source/gameengine/Ketsji/KX_ISystem.h b/source/gameengine/Ketsji/KX_ISystem.h
index 204e116e822..deee91f62e8 100644
--- a/source/gameengine/Ketsji/KX_ISystem.h
+++ b/source/gameengine/Ketsji/KX_ISystem.h
@@ -37,6 +37,10 @@ using namespace std;
#include "STR_String.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/**
* System Abstraction, needed only for getting some timing stuff from the host.
*/
@@ -47,6 +51,13 @@ public:
virtual ~KX_ISystem() {};
virtual double GetTimeInSeconds()=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ISystem"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index 3ec0598ac03..d7f800fe5bd 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -49,13 +49,13 @@
/* Type strings */
/* ------------------------------------------------------------------------- */
-STR_String KX_IpoActuator::S_KX_ACT_IPO_PLAY_STRING = "Play";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_PINGPONG_STRING = "PingPong";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_FLIPPER_STRING = "Flipper";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_LOOPSTOP_STRING = "LoopStop";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_LOOPEND_STRING = "LoopEnd";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_KEY2KEY_STRING = "Key2key";
-STR_String KX_IpoActuator::S_KX_ACT_IPO_FROM_PROP_STRING = "FromProp";
+const char *KX_IpoActuator::S_KX_ACT_IPO_PLAY_STRING = "Play";
+const char *KX_IpoActuator::S_KX_ACT_IPO_PINGPONG_STRING = "PingPong";
+const char *KX_IpoActuator::S_KX_ACT_IPO_FLIPPER_STRING = "Flipper";
+const char *KX_IpoActuator::S_KX_ACT_IPO_LOOPSTOP_STRING = "LoopStop";
+const char *KX_IpoActuator::S_KX_ACT_IPO_LOOPEND_STRING = "LoopEnd";
+const char *KX_IpoActuator::S_KX_ACT_IPO_KEY2KEY_STRING = "Key2key";
+const char *KX_IpoActuator::S_KX_ACT_IPO_FROM_PROP_STRING = "FromProp";
/* ------------------------------------------------------------------------- */
/* Native functions */
@@ -70,9 +70,8 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
int acttype,
bool ipo_as_force,
bool ipo_add,
- bool ipo_local,
- PyTypeObject* T)
- : SCA_IActuator(gameobj,T),
+ bool ipo_local)
+ : SCA_IActuator(gameobj, KX_ACT_IPO),
m_bNegativeEvent(false),
m_startframe (starttime),
m_endframe(endtime),
@@ -386,19 +385,19 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
int KX_IpoActuator::string2mode(char* modename) {
IpoActType res = KX_ACT_IPO_NODEF;
- if (modename == S_KX_ACT_IPO_PLAY_STRING) {
+ if (strcmp(modename, S_KX_ACT_IPO_PLAY_STRING)==0) {
res = KX_ACT_IPO_PLAY;
- } else if (modename == S_KX_ACT_IPO_PINGPONG_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_PINGPONG_STRING)==0) {
res = KX_ACT_IPO_PINGPONG;
- } else if (modename == S_KX_ACT_IPO_FLIPPER_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_FLIPPER_STRING)==0) {
res = KX_ACT_IPO_FLIPPER;
- } else if (modename == S_KX_ACT_IPO_LOOPSTOP_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_LOOPSTOP_STRING)==0) {
res = KX_ACT_IPO_LOOPSTOP;
- } else if (modename == S_KX_ACT_IPO_LOOPEND_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_LOOPEND_STRING)==0) {
res = KX_ACT_IPO_LOOPEND;
- } else if (modename == S_KX_ACT_IPO_KEY2KEY_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_KEY2KEY_STRING)==0) {
res = KX_ACT_IPO_KEY2KEY;
- } else if (modename == S_KX_ACT_IPO_FROM_PROP_STRING) {
+ } else if (strcmp(modename, S_KX_ACT_IPO_FROM_PROP_STRING)==0) {
res = KX_ACT_IPO_FROM_PROP;
}
@@ -413,13 +412,7 @@ int KX_IpoActuator::string2mode(char* modename) {
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_IpoActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_IpoActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -429,37 +422,18 @@ PyTypeObject KX_IpoActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_IpoActuator::Parents[] = {
- &KX_IpoActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_IpoActuator::Methods[] = {
- // deprecated
- {"set", (PyCFunction) KX_IpoActuator::sPySet, METH_VARARGS, (PY_METHODCHAR)Set_doc},
- {"setProperty", (PyCFunction) KX_IpoActuator::sPySetProperty, METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
- {"setStart", (PyCFunction) KX_IpoActuator::sPySetStart, METH_VARARGS, (PY_METHODCHAR)SetStart_doc},
- {"getStart", (PyCFunction) KX_IpoActuator::sPyGetStart, METH_NOARGS, (PY_METHODCHAR)GetStart_doc},
- {"setEnd", (PyCFunction) KX_IpoActuator::sPySetEnd, METH_VARARGS, (PY_METHODCHAR)SetEnd_doc},
- {"getEnd", (PyCFunction) KX_IpoActuator::sPyGetEnd, METH_NOARGS, (PY_METHODCHAR)GetEnd_doc},
- {"setIpoAsForce", (PyCFunction) KX_IpoActuator::sPySetIpoAsForce, METH_VARARGS, (PY_METHODCHAR)SetIpoAsForce_doc},
- {"getIpoAsForce", (PyCFunction) KX_IpoActuator::sPyGetIpoAsForce, METH_NOARGS, (PY_METHODCHAR)GetIpoAsForce_doc},
- {"setIpoAdd", (PyCFunction) KX_IpoActuator::sPySetIpoAdd, METH_VARARGS, (PY_METHODCHAR)SetIpoAdd_doc},
- {"getIpoAdd", (PyCFunction) KX_IpoActuator::sPyGetIpoAdd, METH_NOARGS, (PY_METHODCHAR)GetIpoAdd_doc},
- {"setForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPySetForceIpoActsLocal, METH_VARARGS, (PY_METHODCHAR)SetForceIpoActsLocal_doc},
- {"getForceIpoActsLocal", (PyCFunction) KX_IpoActuator::sPyGetForceIpoActsLocal, METH_NOARGS, (PY_METHODCHAR)GetForceIpoActsLocal_doc},
- {"setType", (PyCFunction) KX_IpoActuator::sPySetType, METH_VARARGS, (PY_METHODCHAR)SetType_doc},
- {"getType", (PyCFunction) KX_IpoActuator::sPyGetType, METH_NOARGS, (PY_METHODCHAR)GetType_doc},
{NULL,NULL} //Sentinel
};
@@ -477,249 +451,4 @@ PyAttributeDef KX_IpoActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_IpoActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_IpoActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_IpoActuator::py_setattro(PyObject *attr, PyObject *value) // py_setattro method
-{
- py_setattro_up(SCA_IActuator);
-}
-
-/* set --------------------------------------------------------------------- */
-const char KX_IpoActuator::Set_doc[] =
-"set(type, startframe, endframe, mode?)\n"
-"\t - type: Play, PingPong, Flipper, LoopStop, LoopEnd or FromProp (string)\n"
-"\t - startframe: first frame to use (int)\n"
-"\t - endframe : last frame to use (int)\n"
-"\t - mode? : special mode (0=normal, 1=interpret location as force, 2=additive)"
-"\tSet the properties of the actuator.\n";
-PyObject* KX_IpoActuator::PySet(PyObject* args) {
-
- ShowDeprecationWarning("set()", "a range properties");
-
- /* sets modes PLAY, PINGPONG, FLIPPER, LOOPSTOP, LOOPEND */
- /* arg 1 = mode string, arg 2 = startframe, arg3 = stopframe, */
- /* arg4 = force toggle */
- char* mode;
- int forceToggle;
- int modenum;
- int startFrame, stopFrame;
- if(!PyArg_ParseTuple(args, "siii:set", &mode, &startFrame,
- &stopFrame, &forceToggle)) {
- return NULL;
- }
- modenum = string2mode(mode);
-
- switch (modenum) {
- case KX_ACT_IPO_PLAY:
- case KX_ACT_IPO_PINGPONG:
- case KX_ACT_IPO_FLIPPER:
- case KX_ACT_IPO_LOOPSTOP:
- case KX_ACT_IPO_LOOPEND:
- m_type = modenum;
- m_startframe = startFrame;
- m_endframe = stopFrame;
- m_ipo_as_force = forceToggle == 1;
- m_ipo_add = forceToggle == 2;
- break;
- default:
- ; /* error */
- }
-
- Py_RETURN_NONE;
-}
-
-/* set property ----------------------------------------------------------- */
-const char KX_IpoActuator::SetProperty_doc[] =
-"setProperty(propname)\n"
-"\t - propname: name of the property (string)\n"
-"\tSet the property to be used in FromProp mode.\n";
-PyObject* KX_IpoActuator::PySetProperty(PyObject* args) {
-
- ShowDeprecationWarning("setProperty()", "the propName property");
-
- /* mode is implicit here, but not supported yet... */
- /* args: property */
- char *propertyName;
- if(!PyArg_ParseTuple(args, "s:setProperty", &propertyName)) {
- return NULL;
- }
-
- m_propname = propertyName;
-
- Py_RETURN_NONE;
-}
-
-/* 4. setStart: */
-const char KX_IpoActuator::SetStart_doc[] =
-"setStart(frame)\n"
-"\t - frame: first frame to use (int)\n"
-"\tSet the frame from which the ipo starts playing.\n";
-PyObject* KX_IpoActuator::PySetStart(PyObject* args) {
-
- ShowDeprecationWarning("setStart()", "the frameStart property");
-
- float startArg;
- if(!PyArg_ParseTuple(args, "f:setStart", &startArg)) {
- return NULL;
- }
-
- m_startframe = startArg;
-
- Py_RETURN_NONE;
-}
-/* 5. getStart: */
-const char KX_IpoActuator::GetStart_doc[] =
-"getStart()\n"
-"\tReturns the frame from which the ipo starts playing.\n";
-PyObject* KX_IpoActuator::PyGetStart() {
- ShowDeprecationWarning("getStart()", "the frameStart property");
- return PyFloat_FromDouble(m_startframe);
-}
-
-/* 6. setEnd: */
-const char KX_IpoActuator::SetEnd_doc[] =
-"setEnd(frame)\n"
-"\t - frame: last frame to use (int)\n"
-"\tSet the frame at which the ipo stops playing.\n";
-PyObject* KX_IpoActuator::PySetEnd(PyObject* args) {
- ShowDeprecationWarning("setEnd()", "the frameEnd property");
- float endArg;
- if(!PyArg_ParseTuple(args, "f:setEnd", &endArg)) {
- return NULL;
- }
-
- m_endframe = endArg;
-
- Py_RETURN_NONE;
-}
-/* 7. getEnd: */
-const char KX_IpoActuator::GetEnd_doc[] =
-"getEnd()\n"
-"\tReturns the frame at which the ipo stops playing.\n";
-PyObject* KX_IpoActuator::PyGetEnd() {
- ShowDeprecationWarning("getEnd()", "the frameEnd property");
- return PyFloat_FromDouble(m_endframe);
-}
-
-/* 6. setIpoAsForce: */
-const char KX_IpoActuator::SetIpoAsForce_doc[] =
-"setIpoAsForce(force?)\n"
-"\t - force? : interpret this ipo as a force? (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to interpret the ipo as a force rather than a displacement.\n";
-PyObject* KX_IpoActuator::PySetIpoAsForce(PyObject* args) {
- ShowDeprecationWarning("setIpoAsForce()", "the useIpoAsForce property");
- int boolArg;
-
- if (!PyArg_ParseTuple(args, "i:setIpoAsForce", &boolArg)) {
- return NULL;
- }
-
- m_ipo_as_force = PyArgToBool(boolArg);
- if (m_ipo_as_force)
- m_ipo_add = false;
-
- Py_RETURN_NONE;
-}
-/* 7. getIpoAsForce: */
-const char KX_IpoActuator::GetIpoAsForce_doc[] =
-"getIpoAsForce()\n"
-"\tReturns whether to interpret the ipo as a force rather than a displacement.\n";
-PyObject* KX_IpoActuator::PyGetIpoAsForce() {
- ShowDeprecationWarning("getIpoAsForce()", "the useIpoAsForce property");
- return BoolToPyArg(m_ipo_as_force);
-}
-
-/* 6. setIpoAsForce: */
-const char KX_IpoActuator::SetIpoAdd_doc[] =
-"setIpoAdd(add?)\n"
-"\t - add? : add flag (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to interpret the ipo as additive rather than absolute.\n";
-PyObject* KX_IpoActuator::PySetIpoAdd(PyObject* args) {
- ShowDeprecationWarning("setIpoAdd()", "the useIpoAdd property");
- int boolArg;
-
- if (!PyArg_ParseTuple(args, "i:setIpoAdd", &boolArg)) {
- return NULL;
- }
-
- m_ipo_add = PyArgToBool(boolArg);
- if (m_ipo_add)
- m_ipo_as_force = false;
-
- Py_RETURN_NONE;
-}
-/* 7. getIpoAsForce: */
-const char KX_IpoActuator::GetIpoAdd_doc[] =
-"getIpoAsAdd()\n"
-"\tReturns whether to interpret the ipo as additive rather than absolute.\n";
-PyObject* KX_IpoActuator::PyGetIpoAdd() {
- ShowDeprecationWarning("getIpoAdd()", "the useIpoAdd property");
- return BoolToPyArg(m_ipo_add);
-}
-
-/* 8. setType: */
-const char KX_IpoActuator::SetType_doc[] =
-"setType(mode)\n"
-"\t - mode: Play, PingPong, Flipper, LoopStop, LoopEnd or FromProp (string)\n"
-"\tSet the operation mode of the actuator.\n";
-PyObject* KX_IpoActuator::PySetType(PyObject* args) {
- ShowDeprecationWarning("setType()", "the mode property");
- int typeArg;
-
- if (!PyArg_ParseTuple(args, "i:setType", &typeArg)) {
- return NULL;
- }
-
- if ( (typeArg > KX_ACT_IPO_NODEF)
- && (typeArg < KX_ACT_IPO_MAX) ) {
- m_type = typeArg;
- }
-
- Py_RETURN_NONE;
-}
-/* 9. getType: */
-const char KX_IpoActuator::GetType_doc[] =
-"getType()\n"
-"\tReturns the operation mode of the actuator.\n";
-PyObject* KX_IpoActuator::PyGetType() {
- ShowDeprecationWarning("getType()", "the mode property");
- return PyInt_FromLong(m_type);
-}
-
-/* 10. setForceIpoActsLocal: */
-const char KX_IpoActuator::SetForceIpoActsLocal_doc[] =
-"setForceIpoActsLocal(local?)\n"
-"\t - local? : Apply the ipo-as-force in the object's local\n"
-"\t coordinates? (KX_TRUE, KX_FALSE)\n"
-"\tSet whether to apply the force in the object's local\n"
-"\tcoordinates rather than the world global coordinates.\n";
-PyObject* KX_IpoActuator::PySetForceIpoActsLocal(PyObject* args) {
- ShowDeprecationWarning("setForceIpoActsLocal()", "the useIpoLocal property");
- int boolArg;
-
- if (!PyArg_ParseTuple(args, "i:setForceIpoActsLocal", &boolArg)) {
- return NULL;
- }
-
- m_ipo_local = PyArgToBool(boolArg);
-
- Py_RETURN_NONE;
-}
-/* 11. getForceIpoActsLocal: */
-const char KX_IpoActuator::GetForceIpoActsLocal_doc[] =
-"getForceIpoActsLocal()\n"
-"\tReturn whether to apply the force in the object's local\n"
-"\tcoordinates rather than the world global coordinates.\n";
-PyObject* KX_IpoActuator::PyGetForceIpoActsLocal() {
- ShowDeprecationWarning("getForceIpoActsLocal()", "the useIpoLocal property");
- return BoolToPyArg(m_ipo_local);
-}
-
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h
index 9ea597def1e..72fe812f98e 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.h
+++ b/source/gameengine/Ketsji/KX_IpoActuator.h
@@ -100,13 +100,13 @@ public:
KX_ACT_IPO_MAX
};
- static STR_String S_KX_ACT_IPO_PLAY_STRING;
- static STR_String S_KX_ACT_IPO_PINGPONG_STRING;
- static STR_String S_KX_ACT_IPO_FLIPPER_STRING;
- static STR_String S_KX_ACT_IPO_LOOPSTOP_STRING;
- static STR_String S_KX_ACT_IPO_LOOPEND_STRING;
- static STR_String S_KX_ACT_IPO_KEY2KEY_STRING;
- static STR_String S_KX_ACT_IPO_FROM_PROP_STRING;
+ 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;
+ static const char *S_KX_ACT_IPO_LOOPSTOP_STRING;
+ static const char *S_KX_ACT_IPO_LOOPEND_STRING;
+ static const char *S_KX_ACT_IPO_KEY2KEY_STRING;
+ static const char *S_KX_ACT_IPO_FROM_PROP_STRING;
int string2mode(char* modename);
@@ -121,8 +121,7 @@ public:
int acttype,
bool ipo_as_force,
bool ipo_add,
- bool ipo_local,
- PyTypeObject* T=&Type);
+ bool ipo_local);
virtual ~KX_IpoActuator() {};
virtual CValue* GetReplica() {
@@ -138,27 +137,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- //KX_PYMETHOD_DOC
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,Set);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetProperty);
-/* KX_PYMETHOD_DOC(KX_IpoActuator,SetKey2Key); */
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetStart);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetStart);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetEnd);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetEnd);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetIpoAsForce);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetIpoAsForce);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetIpoAdd);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetIpoAdd);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetType);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetType);
- KX_PYMETHOD_DOC_VARARGS(KX_IpoActuator,SetForceIpoActsLocal);
- KX_PYMETHOD_DOC_NOARGS(KX_IpoActuator,GetForceIpoActsLocal);
};
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 1a417110c08..e95676ff9d2 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -61,8 +61,7 @@
#include "KX_PyConstraintBinding.h"
#include "PHY_IPhysicsEnvironment.h"
-#include "SND_Scene.h"
-#include "SND_IAudioDevice.h"
+#include "AUD_C-API.h"
#include "NG_NetworkScene.h"
#include "NG_NetworkDeviceInterface.h"
@@ -113,7 +112,6 @@ KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
m_rendertools(NULL),
m_sceneconverter(NULL),
m_networkdevice(NULL),
- m_audiodevice(NULL),
m_pythondictionary(NULL),
m_keyboarddevice(NULL),
m_mousedevice(NULL),
@@ -211,15 +209,6 @@ void KX_KetsjiEngine::SetNetworkDevice(NG_NetworkDeviceInterface* networkdevice)
}
-
-void KX_KetsjiEngine::SetAudioDevice(SND_IAudioDevice* audiodevice)
-{
- MT_assert(audiodevice);
- m_audiodevice = audiodevice;
-}
-
-
-
void KX_KetsjiEngine::SetCanvas(RAS_ICanvas* canvas)
{
MT_assert(canvas);
@@ -393,12 +382,12 @@ void KX_KetsjiEngine::StartEngine(bool clearIpo)
m_firstframe = true;
m_bInitialized = true;
// there is always one scene enabled at startup
- World* world = m_scenes[0]->GetBlenderScene()->world;
- if (world)
+ Scene* scene = m_scenes[0]->GetBlenderScene();
+ if (scene)
{
- m_ticrate = world->ticrate;
- m_maxLogicFrame = world->maxlogicstep;
- m_maxPhysicsFrame = world->maxphystep;
+ m_ticrate = scene->gm.ticrate ? scene->gm.ticrate : DEFAULT_LOGIC_TIC_RATE;
+ m_maxLogicFrame = scene->gm.maxlogicstep ? scene->gm.maxlogicstep : 5;
+ m_maxPhysicsFrame = scene->gm.maxphystep ? scene->gm.maxlogicstep : 5;
}
else
{
@@ -690,10 +679,7 @@ else
if (m_networkdevice)
m_networkdevice->NextFrame();
-
- if (m_audiodevice)
- m_audiodevice->NextFrame();
-
+
// scene management
ProcessScheduledScenes();
@@ -970,13 +956,40 @@ void KX_KetsjiEngine::DoSound(KX_Scene* scene)
MT_Vector3 listenervelocity = cam->GetLinearVelocity();
MT_Matrix3x3 listenerorientation = cam->NodeGetWorldOrientation();
- SND_Scene* soundscene = scene->GetSoundScene();
- soundscene->SetListenerTransform(
- listenerposition,
- listenervelocity,
- listenerorientation);
+ {
+ AUD_3DData data;
+ float f;
+
+ listenerorientation.getValue3x3(data.orientation);
+ listenerposition.getValue(data.position);
+ listenervelocity.getValue(data.velocity);
- soundscene->Proceed();
+ f = data.position[1];
+ data.position[1] = data.position[2];
+ data.position[2] = -f;
+
+ f = data.velocity[1];
+ data.velocity[1] = data.velocity[2];
+ data.velocity[2] = -f;
+
+ f = data.orientation[1];
+ data.orientation[1] = data.orientation[2];
+ data.orientation[2] = -f;
+
+ f = data.orientation[3];
+ data.orientation[3] = -data.orientation[6];
+ data.orientation[6] = f;
+
+ f = data.orientation[4];
+ data.orientation[4] = -data.orientation[8];
+ data.orientation[8] = -f;
+
+ f = data.orientation[5];
+ data.orientation[5] = data.orientation[7];
+ data.orientation[7] = f;
+
+ AUD_updateListener(&data);
+ }
}
@@ -1595,14 +1608,11 @@ KX_Scene* KX_KetsjiEngine::CreateScene(const STR_String& scenename)
KX_Scene* tmpscene = new KX_Scene(m_keyboarddevice,
m_mousedevice,
m_networkdevice,
- m_audiodevice,
scenename,
scene);
- m_sceneconverter->ConvertScene(scenename,
- tmpscene,
+ m_sceneconverter->ConvertScene(tmpscene,
m_pythondictionary,
- m_keyboarddevice,
m_rendertools,
m_canvas);
@@ -1773,6 +1783,11 @@ double KX_KetsjiEngine::GetClockTime(void) const
return m_clockTime;
}
+double KX_KetsjiEngine::GetFrameTime(void) const
+{
+ return m_frameTime;
+}
+
double KX_KetsjiEngine::GetRealTime(void) const
{
return m_kxsystem->GetTimeInSeconds();
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index abba23ca376..373e8bf218c 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -70,7 +70,6 @@ private:
class RAS_IRenderTools* m_rendertools;
class KX_ISceneConverter* m_sceneconverter;
class NG_NetworkDeviceInterface* m_networkdevice;
- class SND_IAudioDevice* m_audiodevice;
PyObject* m_pythondictionary;
class SCA_IInputDevice* m_keyboarddevice;
class SCA_IInputDevice* m_mousedevice;
@@ -191,7 +190,6 @@ private:
void DoSound(KX_Scene* scene);
public:
-
KX_KetsjiEngine(class KX_ISystem* system);
virtual ~KX_KetsjiEngine();
@@ -200,7 +198,6 @@ public:
void SetKeyboardDevice(SCA_IInputDevice* keyboarddevice);
void SetMouseDevice(SCA_IInputDevice* mousedevice);
void SetNetworkDevice(NG_NetworkDeviceInterface* networkdevice);
- void SetAudioDevice(SND_IAudioDevice* audiodevice);
void SetCanvas(RAS_ICanvas* canvas);
void SetRenderTools(RAS_IRenderTools* rendertools);
void SetRasterizer(RAS_IRasterizer* rasterizer);
@@ -272,6 +269,10 @@ public:
* Returns current render frame clock time
*/
double GetClockTime(void) const;
+ /**
+ * Returns current logic frame clock time
+ */
+ double GetFrameTime(void) const;
double GetRealTime(void) const;
/**
@@ -398,6 +399,13 @@ protected:
bool BeginFrame();
void ClearFrame();
void EndFrame();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_KetsjiEngine"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_KETSJI_ENGINE
diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp
index ae9e097a96e..85c495bc2bd 100644
--- a/source/gameengine/Ketsji/KX_Light.cpp
+++ b/source/gameengine/Ketsji/KX_Light.cpp
@@ -51,12 +51,9 @@
KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
class RAS_IRenderTools* rendertools,
const RAS_LightObject& lightobj,
- bool glsl,
- PyTypeObject* T
- )
- :
- KX_GameObject(sgReplicationInfo,callbacks,T),
- m_rendertools(rendertools)
+ bool glsl)
+ : KX_GameObject(sgReplicationInfo,callbacks),
+ m_rendertools(rendertools)
{
m_lightobj = lightobj;
m_lightobj.m_scene = sgReplicationInfo;
@@ -271,46 +268,32 @@ void KX_LightObject::UnbindShadowBuffer(RAS_IRasterizer *ras)
/* Python Integration Hooks */
/* ------------------------------------------------------------------------- */
-PyObject* KX_LightObject::py_getattro_dict() {
- py_getattro_dict_up(KX_GameObject);
-}
-
-
PyTypeObject KX_LightObject::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_LightObject",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,
- &KX_GameObject::Sequence,
- &KX_GameObject::Mapping,
- 0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,
- Py_TPFLAGS_DEFAULT,
- 0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_LightObject::Parents[] = {
- &KX_LightObject::Type,
+ "KX_LightObject",
+ 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,
- &SCA_IObject::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_LightObject::Methods[] = {
@@ -362,11 +345,11 @@ PyObject* KX_LightObject::pyattr_get_typeconst(void *self_v, const KX_PYATTRIBUT
const char* type = attrdef->m_name;
if(strcmp(type, "SPOT")) {
- retvalue = PyInt_FromLong(RAS_LightObject::LIGHT_SPOT);
+ retvalue = PyLong_FromSsize_t(RAS_LightObject::LIGHT_SPOT);
} else if (strcmp(type, "SUN")) {
- retvalue = PyInt_FromLong(RAS_LightObject::LIGHT_SUN);
+ retvalue = PyLong_FromSsize_t(RAS_LightObject::LIGHT_SUN);
} else if (strcmp(type, "NORMAL")) {
- retvalue = PyInt_FromLong(RAS_LightObject::LIGHT_NORMAL);
+ retvalue = PyLong_FromSsize_t(RAS_LightObject::LIGHT_NORMAL);
}
return retvalue;
@@ -375,13 +358,13 @@ PyObject* KX_LightObject::pyattr_get_typeconst(void *self_v, const KX_PYATTRIBUT
PyObject* KX_LightObject::pyattr_get_type(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_LightObject* self = static_cast<KX_LightObject*>(self_v);
- return PyInt_FromLong(self->m_lightobj.m_type);
+ return PyLong_FromSsize_t(self->m_lightobj.m_type);
}
int KX_LightObject::pyattr_set_type(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value)
{
KX_LightObject* self = static_cast<KX_LightObject*>(self_v);
- int val = PyInt_AsLong(value);
+ int val = PyLong_AsSsize_t(value);
if((val==-1 && PyErr_Occurred()) || val<0 || val>2) {
PyErr_SetString(PyExc_ValueError, "light.type= val: KX_LightObject, expected an int between 0 and 2");
return PY_SET_ATTR_FAIL;
@@ -401,14 +384,3 @@ int KX_LightObject::pyattr_set_type(void* self_v, const KX_PYATTRIBUTE_DEF *attr
return PY_SET_ATTR_SUCCESS;
}
-
-
-PyObject* KX_LightObject::py_getattro(PyObject *attr)
-{
- py_getattro_up(KX_GameObject);
-}
-
-int KX_LightObject::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(KX_GameObject);
-}
diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h
index 358c705080a..0b7ccbe81ab 100644
--- a/source/gameengine/Ketsji/KX_Light.h
+++ b/source/gameengine/Ketsji/KX_Light.h
@@ -49,7 +49,7 @@ protected:
Scene* m_blenderscene;
public:
- KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,class RAS_IRenderTools* rendertools,const struct RAS_LightObject& lightobj, bool glsl, PyTypeObject *T = &Type);
+ KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,class RAS_IRenderTools* rendertools,const struct RAS_LightObject& lightobj, bool glsl);
virtual ~KX_LightObject();
virtual CValue* GetReplica();
RAS_LightObject* GetLightData() { return &m_lightobj;}
@@ -64,10 +64,6 @@ public:
void BindShadowBuffer(class RAS_IRasterizer *ras, class KX_Camera *cam, class MT_Transform& camtrans);
void UnbindShadowBuffer(class RAS_IRasterizer *ras);
void Update();
-
- virtual PyObject* py_getattro(PyObject *attr); /* lens, near, far, projection_matrix */
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
/* attributes */
static PyObject* pyattr_get_color(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_LightIpoSGController.h b/source/gameengine/Ketsji/KX_LightIpoSGController.h
index 98870cf5b3f..811dba5dba8 100644
--- a/source/gameengine/Ketsji/KX_LightIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_LightIpoSGController.h
@@ -92,6 +92,13 @@ public:
};
void AddInterpolator(KX_IInterpolator* interp);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_LightIpoSGController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // KX_LIGHTIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_MaterialIpoController.h b/source/gameengine/Ketsji/KX_MaterialIpoController.h
index 4d2e258bf94..906c12426eb 100644
--- a/source/gameengine/Ketsji/KX_MaterialIpoController.h
+++ b/source/gameengine/Ketsji/KX_MaterialIpoController.h
@@ -50,6 +50,13 @@ public:
void AddInterpolator(KX_IInterpolator* interp);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MaterialIpoController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp
index 11effa1ca98..744fdb75796 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.cpp
+++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp
@@ -46,13 +46,7 @@
#include "PyObjectPlus.h"
PyTypeObject KX_MeshProxy::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_MeshProxy",
sizeof(PyObjectPlus_Proxy),
0,
@@ -62,34 +56,24 @@ PyTypeObject KX_MeshProxy::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_MeshProxy::Parents[] = {
- &KX_MeshProxy::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- &PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_MeshProxy::Methods[] = {
-// Deprecated ----->
-{"getNumMaterials", (PyCFunction)KX_MeshProxy::sPyGetNumMaterials,METH_VARARGS},
-{"getNumPolygons", (PyCFunction)KX_MeshProxy::sPyGetNumPolygons,METH_NOARGS},
-// <-----
-
{"getMaterialName", (PyCFunction)KX_MeshProxy::sPyGetMaterialName,METH_VARARGS},
{"getTextureName", (PyCFunction)KX_MeshProxy::sPyGetTextureName,METH_VARARGS},
{"getVertexArrayLength", (PyCFunction)KX_MeshProxy::sPyGetVertexArrayLength,METH_VARARGS},
{"getVertex", (PyCFunction)KX_MeshProxy::sPyGetVertex,METH_VARARGS},
{"getPolygon", (PyCFunction)KX_MeshProxy::sPyGetPolygon,METH_VARARGS},
-KX_PYMETHODTABLE(KX_MeshProxy, reinstancePhysicsMesh),
//{"getIndexArrayLength", (PyCFunction)KX_MeshProxy::sPyGetIndexArrayLength,METH_VARARGS},
-
{NULL,NULL} //Sentinel
};
@@ -106,24 +90,8 @@ void KX_MeshProxy::SetMeshModified(bool v)
m_meshobj->SetMeshModified(v);
}
-
-PyObject* KX_MeshProxy::py_getattro(PyObject *attr)
-{
- py_getattro_up(CValue);
-}
-
-PyObject* KX_MeshProxy::py_getattro_dict() {
- py_getattro_dict_up(CValue);
-}
-
-int KX_MeshProxy::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(CValue);
-}
-
-
KX_MeshProxy::KX_MeshProxy(RAS_MeshObject* mesh)
- : CValue(&Type), m_meshobj(mesh)
+ : CValue(), m_meshobj(mesh)
{
}
@@ -145,20 +113,6 @@ CValue* KX_MeshProxy::GetReplica() { return NULL;}
// stuff for python integration
-
-PyObject* KX_MeshProxy::PyGetNumMaterials(PyObject* args, PyObject* kwds)
-{
- int num = m_meshobj->NumMaterials();
- ShowDeprecationWarning("getNumMaterials()", "the numMaterials property");
- return PyInt_FromLong(num);
-}
-
-PyObject* KX_MeshProxy::PyGetNumPolygons()
-{
- int num = m_meshobj->NumPolygons();
- ShowDeprecationWarning("getNumPolygons()", "the numPolygons property");
- return PyInt_FromLong(num);
-}
PyObject* KX_MeshProxy::PyGetMaterialName(PyObject* args, PyObject* kwds)
{
@@ -173,7 +127,7 @@ PyObject* KX_MeshProxy::PyGetMaterialName(PyObject* args, PyObject* kwds)
return NULL;
}
- return PyString_FromString(matname.Ptr());
+ return PyUnicode_FromString(matname.Ptr());
}
@@ -191,7 +145,7 @@ PyObject* KX_MeshProxy::PyGetTextureName(PyObject* args, PyObject* kwds)
return NULL;
}
- return PyString_FromString(matname.Ptr());
+ return PyUnicode_FromString(matname.Ptr());
}
@@ -214,7 +168,7 @@ PyObject* KX_MeshProxy::PyGetVertexArrayLength(PyObject* args, PyObject* kwds)
length = m_meshobj->NumVertices(mat);
}
- return PyInt_FromLong(length);
+ return PyLong_FromSsize_t(length);
}
@@ -262,17 +216,6 @@ PyObject* KX_MeshProxy::PyGetPolygon(PyObject* args, PyObject* kwds)
return polyob;
}
-KX_PYMETHODDEF_DOC(KX_MeshProxy, reinstancePhysicsMesh,
-"Reinstance the physics mesh.")
-{
-#if 0
- //this needs to be reviewed, it is dependend on Sumo/Solid. Who is using this ?
- if(KX_ReInstanceShapeFromMesh(m_meshobj))
- Py_RETURN_TRUE;
-#endif
- Py_RETURN_FALSE;
-}
-
PyObject* KX_MeshProxy::pyattr_get_materials(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_MeshProxy* self= static_cast<KX_MeshProxy*>(self_v);
@@ -304,12 +247,12 @@ PyObject* KX_MeshProxy::pyattr_get_materials(void *self_v, const KX_PYATTRIBUTE_
PyObject * KX_MeshProxy::pyattr_get_numMaterials(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef) {
KX_MeshProxy * self = static_cast<KX_MeshProxy *> (selfv);
- return PyInt_FromLong(self->m_meshobj->NumMaterials());
+ return PyLong_FromSsize_t(self->m_meshobj->NumMaterials());
}
PyObject * KX_MeshProxy::pyattr_get_numPolygons(void * selfv, const KX_PYATTRIBUTE_DEF * attrdef) {
KX_MeshProxy * self = static_cast<KX_MeshProxy *> (selfv);
- return PyInt_FromLong(self->m_meshobj->NumPolygons());
+ return PyLong_FromSsize_t(self->m_meshobj->NumPolygons());
}
/* a close copy of ConvertPythonToGameObject but for meshes */
@@ -332,13 +275,13 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none
}
}
- if (PyString_Check(value)) {
- *object = (RAS_MeshObject*)SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String( PyString_AsString(value) ));
+ if (PyUnicode_Check(value)) {
+ *object = (RAS_MeshObject*)SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String( _PyUnicode_AsString(value) ));
if (*object) {
return true;
} else {
- PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_MeshProxy in this scene", error_prefix, PyString_AsString(value));
+ PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_MeshProxy in this scene", error_prefix, _PyUnicode_AsString(value));
return false;
}
}
@@ -347,7 +290,7 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none
KX_MeshProxy *kx_mesh = static_cast<KX_MeshProxy*>BGE_PROXY_REF(value);
/* sets the error */
- if (*object==NULL) {
+ if (kx_mesh==NULL) {
PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix);
return false;
}
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.h b/source/gameengine/Ketsji/KX_MeshProxy.h
index bfdd4be4118..55684aa5ee9 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.h
+++ b/source/gameengine/Ketsji/KX_MeshProxy.h
@@ -56,9 +56,6 @@ public:
virtual CValue* GetReplica();
// stuff for python integration
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
KX_PYMETHOD(KX_MeshProxy,GetNumMaterials); // Deprecated
KX_PYMETHOD(KX_MeshProxy,GetMaterialName);
@@ -69,7 +66,6 @@ public:
KX_PYMETHOD(KX_MeshProxy,GetVertexArrayLength);
KX_PYMETHOD(KX_MeshProxy,GetVertex);
KX_PYMETHOD(KX_MeshProxy,GetPolygon);
- KX_PYMETHOD_DOC(KX_MeshProxy, reinstancePhysicsMesh);
static PyObject* pyattr_get_materials(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject * pyattr_get_numMaterials(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
diff --git a/source/gameengine/Ketsji/KX_MotionState.h b/source/gameengine/Ketsji/KX_MotionState.h
index 0e43e88fbeb..63c265aa8a7 100644
--- a/source/gameengine/Ketsji/KX_MotionState.h
+++ b/source/gameengine/Ketsji/KX_MotionState.h
@@ -31,6 +31,10 @@
#include "PHY_IMotionState.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class KX_MotionState : public PHY_IMotionState
{
class SG_Spatial* m_node;
@@ -48,6 +52,12 @@ public:
virtual void setWorldOrientation(const float* ori);
virtual void calculateWorldTransformations();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_MotionState"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_MOTIONSTATE
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
index fde10a493db..8abc4f6b897 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
@@ -61,12 +61,13 @@ KX_MouseFocusSensor::KX_MouseFocusSensor(SCA_MouseManager* eventmgr,
int starty,
short int mousemode,
int focusmode,
+ bool bTouchPulse,
KX_Scene* kxscene,
KX_KetsjiEngine *kxengine,
- SCA_IObject* gameobj,
- PyTypeObject* T)
- : SCA_MouseSensor(eventmgr, startx, starty, mousemode, gameobj, T),
+ SCA_IObject* gameobj)
+ : SCA_MouseSensor(eventmgr, startx, starty, mousemode, gameobj),
m_focusmode(focusmode),
+ m_bTouchPulse(bTouchPulse),
m_kxscene(kxscene),
m_kxengine(kxengine)
{
@@ -78,6 +79,7 @@ void KX_MouseFocusSensor::Init()
m_mouse_over_in_previous_frame = (m_invert)?true:false;
m_positive_event = false;
m_hitObject = 0;
+ m_hitObject_Last = NULL;
m_reset = true;
m_hitPosition.setValue(0,0,0);
@@ -108,7 +110,10 @@ bool KX_MouseFocusSensor::Evaluate()
m_positive_event = true;
if (!m_mouse_over_in_previous_frame) {
result = true;
- }
+ }
+ else if(m_bTouchPulse && (m_hitObject != m_hitObject_Last)) {
+ result = true;
+ }
}
if (reset) {
// force an event
@@ -124,7 +129,8 @@ bool KX_MouseFocusSensor::Evaluate()
}
m_mouse_over_in_previous_frame = obHasFocus;
-
+ m_hitObject_Last = (void *)m_hitObject;
+
return result;
}
@@ -340,13 +346,7 @@ const MT_Vector3& KX_MouseFocusSensor::HitNormal() const
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_MouseFocusSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_MouseFocusSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -356,30 +356,18 @@ PyTypeObject KX_MouseFocusSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_MouseFocusSensor::Parents[] = {
- &KX_MouseFocusSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_MouseSensor::Type,
- &SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_MouseFocusSensor::Methods[] = {
- {"getRayTarget", (PyCFunction) KX_MouseFocusSensor::sPyGetRayTarget, METH_NOARGS, (PY_METHODCHAR)GetRayTarget_doc},
- {"getRaySource", (PyCFunction) KX_MouseFocusSensor::sPyGetRaySource, METH_NOARGS, (PY_METHODCHAR)GetRaySource_doc},
- {"getHitObject",(PyCFunction) KX_MouseFocusSensor::sPyGetHitObject,METH_NOARGS, (PY_METHODCHAR)GetHitObject_doc},
- {"getHitPosition",(PyCFunction) KX_MouseFocusSensor::sPyGetHitPosition,METH_NOARGS, (PY_METHODCHAR)GetHitPosition_doc},
- {"getHitNormal",(PyCFunction) KX_MouseFocusSensor::sPyGetHitNormal,METH_NOARGS, (PY_METHODCHAR)GetHitNormal_doc},
- {"getRayDirection",(PyCFunction) KX_MouseFocusSensor::sPyGetRayDirection,METH_NOARGS, (PY_METHODCHAR)GetRayDirection_doc},
-
{NULL,NULL} //Sentinel
};
@@ -390,90 +378,10 @@ PyAttributeDef KX_MouseFocusSensor::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("hitObject", KX_MouseFocusSensor, pyattr_get_hit_object),
KX_PYATTRIBUTE_RO_FUNCTION("hitPosition", KX_MouseFocusSensor, pyattr_get_hit_position),
KX_PYATTRIBUTE_RO_FUNCTION("hitNormal", KX_MouseFocusSensor, pyattr_get_hit_normal),
+ KX_PYATTRIBUTE_BOOL_RW("usePulseFocus", KX_MouseFocusSensor,m_bTouchPulse),
{ NULL } //Sentinel
};
-PyObject* KX_MouseFocusSensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_MouseSensor);
-}
-
-PyObject* KX_MouseFocusSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_MouseSensor);
-}
-
-
-const char KX_MouseFocusSensor::GetHitObject_doc[] =
-"getHitObject()\n"
-"\tReturns the object that was hit by this ray.\n";
-PyObject* KX_MouseFocusSensor::PyGetHitObject()
-{
- ShowDeprecationWarning("GetHitObject()", "the hitObject property");
-
- if (m_hitObject)
- return m_hitObject->GetProxy();
-
- Py_RETURN_NONE;
-}
-
-
-const char KX_MouseFocusSensor::GetHitPosition_doc[] =
-"getHitPosition()\n"
-"\tReturns the position (in worldcoordinates) where the object was hit by this ray.\n";
-PyObject* KX_MouseFocusSensor::PyGetHitPosition()
-{
- ShowDeprecationWarning("getHitPosition()", "the hitPosition property");
-
- return PyObjectFrom(m_hitPosition);
-}
-
-const char KX_MouseFocusSensor::GetRayDirection_doc[] =
-"getRayDirection()\n"
-"\tReturns the direction from the ray (in worldcoordinates) .\n";
-PyObject* KX_MouseFocusSensor::PyGetRayDirection()
-{
- ShowDeprecationWarning("getRayDirection()", "the rayDirection property");
-
- MT_Vector3 dir = m_prevTargetPoint - m_prevSourcePoint;
- if(MT_fuzzyZero(dir)) dir.setValue(0,0,0);
- else dir.normalize();
- return PyObjectFrom(dir);
-}
-
-const char KX_MouseFocusSensor::GetHitNormal_doc[] =
-"getHitNormal()\n"
-"\tReturns the normal (in worldcoordinates) at the point of collision where the object was hit by this ray.\n";
-PyObject* KX_MouseFocusSensor::PyGetHitNormal()
-{
- ShowDeprecationWarning("getHitNormal()", "the hitNormal property");
-
- return PyObjectFrom(m_hitNormal);
-}
-
-
-/* getRayTarget */
-const char KX_MouseFocusSensor::GetRayTarget_doc[] =
-"getRayTarget()\n"
-"\tReturns the target of the ray that seeks the focus object,\n"
-"\tin worldcoordinates.";
-PyObject* KX_MouseFocusSensor::PyGetRayTarget()
-{
- ShowDeprecationWarning("getRayTarget()", "the rayTarget property");
-
- return PyObjectFrom(m_prevTargetPoint);
-}
-
-/* getRayTarget */
-const char KX_MouseFocusSensor::GetRaySource_doc[] =
-"getRaySource()\n"
-"\tReturns the source of the ray that seeks the focus object,\n"
-"\tin worldcoordinates.";
-PyObject* KX_MouseFocusSensor::PyGetRaySource()
-{
- ShowDeprecationWarning("getRaySource()", "the raySource property");
-
- return PyObjectFrom(m_prevSourcePoint);
-}
-
/* Attributes */
PyObject* KX_MouseFocusSensor::pyattr_get_ray_source(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.h b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
index 29d674eb305..7b53557467f 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.h
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
@@ -49,15 +49,15 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
public:
- KX_MouseFocusSensor(class SCA_MouseManager* keybdmgr,
+ KX_MouseFocusSensor(class SCA_MouseManager* eventmgr,
int startx,
int starty,
short int mousemode,
int focusmode,
+ bool bTouchPulse,
KX_Scene* kxscene,
KX_KetsjiEngine* kxengine,
- SCA_IObject* gameobj,
- PyTypeObject* T=&Type );
+ SCA_IObject* gameobj);
virtual ~KX_MouseFocusSensor() { ; };
virtual CValue* GetReplica() {
@@ -89,16 +89,6 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
-
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetRayTarget);
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetRaySource);
-
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetHitObject);
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetHitPosition);
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetHitNormal);
- KX_PYMETHOD_DOC_NOARGS(KX_MouseFocusSensor,GetRayDirection);
/* attributes */
static PyObject* pyattr_get_ray_source(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
@@ -110,6 +100,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
/* --------------------------------------------------------------------- */
SCA_IObject* m_hitObject;
+ void* m_hitObject_Last; /* only use for comparison, never access */
private:
/**
@@ -123,6 +114,11 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
bool m_mouse_over_in_previous_frame;
/**
+ * Flags whether changes in hit object should trigger a pulse
+ */
+ bool m_bTouchPulse;
+
+ /**
* Flags whether the previous test evaluated positive.
*/
bool m_positive_event;
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp
index 44842b7f5b3..c6a6304cb2c 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.cpp
+++ b/source/gameengine/Ketsji/KX_NearSensor.cpp
@@ -47,16 +47,12 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
float resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
- class KX_Scene* scene,
- PHY_IPhysicsController* ctrl,
- PyTypeObject* T)
+ PHY_IPhysicsController* ctrl)
:KX_TouchSensor(eventmgr,
gameobj,
bFindMaterial,
false,
- touchedpropname,
- /* scene, */
- T),
+ touchedpropname),
m_Margin(margin),
m_ResetMargin(resetmargin)
@@ -146,6 +142,22 @@ KX_NearSensor::~KX_NearSensor()
delete m_client_info;
}
+void KX_NearSensor::SetPhysCtrlRadius()
+{
+ if (m_bTriggered)
+ {
+ if (m_physCtrl)
+ {
+ m_physCtrl->SetRadius(m_ResetMargin);
+ }
+ } else
+ {
+ if (m_physCtrl)
+ {
+ m_physCtrl->SetRadius(m_Margin);
+ }
+ }
+}
bool KX_NearSensor::Evaluate()
{
@@ -155,20 +167,9 @@ bool KX_NearSensor::Evaluate()
if (m_bTriggered != m_bLastTriggered)
{
m_bLastTriggered = m_bTriggered;
- if (m_bTriggered)
- {
- if (m_physCtrl)
- {
- m_physCtrl->SetRadius(m_ResetMargin);
- }
- } else
- {
- if (m_physCtrl)
- {
- m_physCtrl->SetRadius(m_Margin);
- }
-
- }
+
+ SetPhysCtrlRadius();
+
result = true;
}
@@ -256,13 +257,7 @@ bool KX_NearSensor::NewHandleCollision(void* obj1,void* obj2,const PHY_CollData
/* ------------------------------------------------------------------------- */
PyTypeObject KX_NearSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_NearSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -272,26 +267,17 @@ PyTypeObject KX_NearSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject KX_NearSensor::Parents[] = {
- &KX_NearSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&KX_TouchSensor::Type,
- &SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef KX_NearSensor::Methods[] = {
//No methods
{NULL,NULL} //Sentinel
@@ -302,18 +288,3 @@ PyAttributeDef KX_NearSensor::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW_CHECK("resetDistance", 0, 100, KX_NearSensor, m_ResetMargin, CheckResetDistance),
{NULL} //Sentinel
};
-
-
-PyObject* KX_NearSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(KX_TouchSensor);
-}
-
-PyObject* KX_NearSensor::py_getattro_dict() {
- py_getattro_dict_up(KX_TouchSensor);
-}
-
-int KX_NearSensor::py_setattro(PyObject*attr, PyObject* value)
-{
- py_setattro_up(KX_TouchSensor);
-}
diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h
index 63099e181a0..4f0247d209d 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.h
+++ b/source/gameengine/Ketsji/KX_NearSensor.h
@@ -44,7 +44,7 @@ class KX_NearSensor : public KX_TouchSensor
protected:
float m_Margin;
float m_ResetMargin;
- KX_Scene* m_scene;
+
KX_ClientObjectInfo* m_client_info;
public:
KX_NearSensor(class SCA_EventManager* eventmgr,
@@ -53,9 +53,7 @@ public:
float resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
- class KX_Scene* scene,
- PHY_IPhysicsController* ctrl,
- PyTypeObject* T=&Type);
+ PHY_IPhysicsController* ctrl);
/*
public:
KX_NearSensor(class SCA_EventManager* eventmgr,
@@ -64,13 +62,13 @@ public:
double resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
- class KX_Scene* scene,
- PyTypeObject* T=&Type);
+ class KX_Scene* scene);
*/
virtual ~KX_NearSensor();
virtual void SynchronizeTransform();
virtual CValue* GetReplica();
virtual void ProcessReplica();
+ virtual void SetPhysCtrlRadius();
virtual bool Evaluate();
virtual void ReParent(SCA_IObject* parent);
@@ -83,9 +81,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
//No methods
@@ -97,6 +92,8 @@ public:
if (sensor->m_Margin > sensor->m_ResetMargin)
sensor->m_ResetMargin = sensor->m_Margin;
+ sensor->SetPhysCtrlRadius();
+
return 0;
}
diff --git a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
index 6d63dd77683..a32d027be9c 100644
--- a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
@@ -67,6 +67,13 @@ public:
void AddInterpolator(KX_IInterpolator* interp);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ObColorIpoSGController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // KX_OBCOLORIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 62e61667c56..924e4a47008 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -53,10 +53,9 @@ KX_ObjectActuator(
const MT_Vector3& linV,
const MT_Vector3& angV,
const short damping,
- const KX_LocalFlags& flag,
- PyTypeObject* T
+ const KX_LocalFlags& flag
) :
- SCA_IActuator(gameobj,T),
+ SCA_IActuator(gameobj, KX_ACT_OBJECT),
m_force(force),
m_torque(torque),
m_dloc(dloc),
@@ -326,13 +325,7 @@ bool KX_ObjectActuator::isValid(KX_ObjectActuator::KX_OBJECT_ACT_VEC_TYPE type)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_ObjectActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_ObjectActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -342,48 +335,18 @@ PyTypeObject KX_ObjectActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_ObjectActuator::Parents[] = {
- &KX_ObjectActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_ObjectActuator::Methods[] = {
- // Deprecated ----->
- {"getForce", (PyCFunction) KX_ObjectActuator::sPyGetForce, METH_NOARGS},
- {"setForce", (PyCFunction) KX_ObjectActuator::sPySetForce, METH_VARARGS},
- {"getTorque", (PyCFunction) KX_ObjectActuator::sPyGetTorque, METH_NOARGS},
- {"setTorque", (PyCFunction) KX_ObjectActuator::sPySetTorque, METH_VARARGS},
- {"getDLoc", (PyCFunction) KX_ObjectActuator::sPyGetDLoc, METH_NOARGS},
- {"setDLoc", (PyCFunction) KX_ObjectActuator::sPySetDLoc, METH_VARARGS},
- {"getDRot", (PyCFunction) KX_ObjectActuator::sPyGetDRot, METH_NOARGS},
- {"setDRot", (PyCFunction) KX_ObjectActuator::sPySetDRot, METH_VARARGS},
- {"getLinearVelocity", (PyCFunction) KX_ObjectActuator::sPyGetLinearVelocity, METH_NOARGS},
- {"setLinearVelocity", (PyCFunction) KX_ObjectActuator::sPySetLinearVelocity, METH_VARARGS},
- {"getAngularVelocity", (PyCFunction) KX_ObjectActuator::sPyGetAngularVelocity, METH_NOARGS},
- {"setAngularVelocity", (PyCFunction) KX_ObjectActuator::sPySetAngularVelocity, METH_VARARGS},
- {"setDamping", (PyCFunction) KX_ObjectActuator::sPySetDamping, METH_VARARGS},
- {"getDamping", (PyCFunction) KX_ObjectActuator::sPyGetDamping, METH_NOARGS},
- {"setForceLimitX", (PyCFunction) KX_ObjectActuator::sPySetForceLimitX, METH_VARARGS},
- {"getForceLimitX", (PyCFunction) KX_ObjectActuator::sPyGetForceLimitX, METH_NOARGS},
- {"setForceLimitY", (PyCFunction) KX_ObjectActuator::sPySetForceLimitY, METH_VARARGS},
- {"getForceLimitY", (PyCFunction) KX_ObjectActuator::sPyGetForceLimitY, METH_NOARGS},
- {"setForceLimitZ", (PyCFunction) KX_ObjectActuator::sPySetForceLimitZ, METH_VARARGS},
- {"getForceLimitZ", (PyCFunction) KX_ObjectActuator::sPyGetForceLimitZ, METH_NOARGS},
- {"setPID", (PyCFunction) KX_ObjectActuator::sPyGetPID, METH_NOARGS},
- {"getPID", (PyCFunction) KX_ObjectActuator::sPySetPID, METH_VARARGS},
-
- // <----- Deprecated
-
{NULL,NULL} //Sentinel
};
@@ -414,20 +377,6 @@ PyAttributeDef KX_ObjectActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_ObjectActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-
-PyObject* KX_ObjectActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_ObjectActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
/* Attribute get/set functions */
#ifdef USE_MATHUTILS
@@ -518,7 +467,7 @@ Mathutils_Callback mathutils_obactu_vector_cb = {
PyObject* KX_ObjectActuator::pyattr_get_linV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxobactu_vector_cb_index, MATHUTILS_VEC_CB_LINV);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxobactu_vector_cb_index, MATHUTILS_VEC_CB_LINV);
}
int KX_ObjectActuator::pyattr_set_linV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
@@ -532,7 +481,7 @@ int KX_ObjectActuator::pyattr_set_linV(void *self_v, const KX_PYATTRIBUTE_DEF *a
PyObject* KX_ObjectActuator::pyattr_get_angV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
- return newVectorObject_cb((PyObject *)self_v, 3, mathutils_kxobactu_vector_cb_index, MATHUTILS_VEC_CB_ANGV);
+ return newVectorObject_cb(BGE_PROXY_FROM_REF(self_v), 3, mathutils_kxobactu_vector_cb_index, MATHUTILS_VEC_CB_ANGV);
}
int KX_ObjectActuator::pyattr_set_angV(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
@@ -574,7 +523,7 @@ int KX_ObjectActuator::pyattr_set_forceLimitX(void *self_v, const KX_PYATTRIBUTE
{
self->m_drot[0] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
self->m_dloc[0] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
- self->m_bitLocalFlag.Torque = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+ self->m_bitLocalFlag.Torque = (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2)) != 0);
if (!PyErr_Occurred())
{
@@ -610,7 +559,7 @@ int KX_ObjectActuator::pyattr_set_forceLimitY(void *self_v, const KX_PYATTRIBUTE
{
self->m_drot[1] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
self->m_dloc[1] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
- self->m_bitLocalFlag.DLoc = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+ self->m_bitLocalFlag.DLoc = (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2)) != 0);
if (!PyErr_Occurred())
{
@@ -646,7 +595,7 @@ int KX_ObjectActuator::pyattr_set_forceLimitZ(void *self_v, const KX_PYATTRIBUTE
{
self->m_drot[2] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
self->m_dloc[2] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
- self->m_bitLocalFlag.DRot = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+ self->m_bitLocalFlag.DRot = (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2)) != 0);
if (!PyErr_Occurred())
{
@@ -692,305 +641,4 @@ int KX_ObjectActuator::pyattr_set_reference(void *self, const struct KX_PYATTRIB
return PY_SET_ATTR_SUCCESS;
}
-
-/* 1. set ------------------------------------------------------------------ */
-/* Removed! */
-
-/* 2. getForce */
-PyObject* KX_ObjectActuator::PyGetForce()
-{
- ShowDeprecationWarning("getForce()", "the force and the useLocalForce properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_force[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_force[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_force[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.Force));
-
- return retVal;
-}
-/* 3. setForce */
-PyObject* KX_ObjectActuator::PySetForce(PyObject* args)
-{
- ShowDeprecationWarning("setForce()", "the force and the useLocalForce properties");
- float vecArg[3];
- int bToggle = 0;
- if (!PyArg_ParseTuple(args, "fffi:setForce", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_force.setValue(vecArg);
- m_bitLocalFlag.Force = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-/* 4. getTorque */
-PyObject* KX_ObjectActuator::PyGetTorque()
-{
- ShowDeprecationWarning("getTorque()", "the torque and the useLocalTorque properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_torque[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_torque[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_torque[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.Torque));
-
- return retVal;
-}
-/* 5. setTorque */
-PyObject* KX_ObjectActuator::PySetTorque(PyObject* args)
-{
- ShowDeprecationWarning("setTorque()", "the torque and the useLocalTorque properties");
- float vecArg[3];
- int bToggle = 0;
- if (!PyArg_ParseTuple(args, "fffi:setTorque", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_torque.setValue(vecArg);
- m_bitLocalFlag.Torque = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-/* 6. getDLoc */
-PyObject* KX_ObjectActuator::PyGetDLoc()
-{
- ShowDeprecationWarning("getDLoc()", "the dLoc and the useLocalDLoc properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_dloc[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_dloc[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_dloc[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.DLoc));
-
- return retVal;
-}
-/* 7. setDLoc */
-PyObject* KX_ObjectActuator::PySetDLoc(PyObject* args)
-{
- ShowDeprecationWarning("setDLoc()", "the dLoc and the useLocalDLoc properties");
- float vecArg[3];
- int bToggle = 0;
- if(!PyArg_ParseTuple(args, "fffi:setDLoc", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_dloc.setValue(vecArg);
- m_bitLocalFlag.DLoc = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-/* 8. getDRot */
-PyObject* KX_ObjectActuator::PyGetDRot()
-{
- ShowDeprecationWarning("getDRot()", "the dRot and the useLocalDRot properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_drot[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_drot[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_drot[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.DRot));
-
- return retVal;
-}
-/* 9. setDRot */
-PyObject* KX_ObjectActuator::PySetDRot(PyObject* args)
-{
- ShowDeprecationWarning("setDRot()", "the dRot and the useLocalDRot properties");
- float vecArg[3];
- int bToggle = 0;
- if (!PyArg_ParseTuple(args, "fffi:setDRot", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_drot.setValue(vecArg);
- m_bitLocalFlag.DRot = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-/* 10. getLinearVelocity */
-PyObject* KX_ObjectActuator::PyGetLinearVelocity() {
- ShowDeprecationWarning("getLinearVelocity()", "the linV and the useLocalLinV properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.LinearVelocity));
-
- return retVal;
-}
-
-/* 11. setLinearVelocity */
-PyObject* KX_ObjectActuator::PySetLinearVelocity(PyObject* args) {
- ShowDeprecationWarning("setLinearVelocity()", "the linV and the useLocalLinV properties");
- float vecArg[3];
- int bToggle = 0;
- if (!PyArg_ParseTuple(args, "fffi:setLinearVelocity", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_linear_velocity.setValue(vecArg);
- m_bitLocalFlag.LinearVelocity = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-
-/* 12. getAngularVelocity */
-PyObject* KX_ObjectActuator::PyGetAngularVelocity() {
- ShowDeprecationWarning("getAngularVelocity()", "the angV and the useLocalAngV properties");
- PyObject *retVal = PyList_New(4);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_angular_velocity[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_angular_velocity[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_angular_velocity[2]));
- PyList_SET_ITEM(retVal, 3, BoolToPyArg(m_bitLocalFlag.AngularVelocity));
-
- return retVal;
-}
-/* 13. setAngularVelocity */
-PyObject* KX_ObjectActuator::PySetAngularVelocity(PyObject* args) {
- ShowDeprecationWarning("setAngularVelocity()", "the angV and the useLocalAngV properties");
- float vecArg[3];
- int bToggle = 0;
- if (!PyArg_ParseTuple(args, "fffi:setAngularVelocity", &vecArg[0], &vecArg[1],
- &vecArg[2], &bToggle)) {
- return NULL;
- }
- m_angular_velocity.setValue(vecArg);
- m_bitLocalFlag.AngularVelocity = PyArgToBool(bToggle);
- UpdateFuzzyFlags();
- Py_RETURN_NONE;
-}
-
-/* 13. setDamping */
-PyObject* KX_ObjectActuator::PySetDamping(PyObject* args) {
- ShowDeprecationWarning("setDamping()", "the damping property");
- int damping = 0;
- if (!PyArg_ParseTuple(args, "i:setDamping", &damping) || damping < 0 || damping > 1000) {
- return NULL;
- }
- m_damping = damping;
- Py_RETURN_NONE;
-}
-
-/* 13. getVelocityDamping */
-PyObject* KX_ObjectActuator::PyGetDamping() {
- ShowDeprecationWarning("getDamping()", "the damping property");
- return Py_BuildValue("i",m_damping);
-}
-/* 6. getForceLimitX */
-PyObject* KX_ObjectActuator::PyGetForceLimitX()
-{
- ShowDeprecationWarning("getForceLimitX()", "the forceLimitX property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_drot[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_dloc[0]));
- PyList_SET_ITEM(retVal, 2, BoolToPyArg(m_bitLocalFlag.Torque));
-
- return retVal;
-}
-/* 7. setForceLimitX */
-PyObject* KX_ObjectActuator::PySetForceLimitX(PyObject* args)
-{
- ShowDeprecationWarning("setForceLimitX()", "the forceLimitX property");
- float vecArg[2];
- int bToggle = 0;
- if(!PyArg_ParseTuple(args, "ffi:setForceLimitX", &vecArg[0], &vecArg[1], &bToggle)) {
- return NULL;
- }
- m_drot[0] = vecArg[0];
- m_dloc[0] = vecArg[1];
- m_bitLocalFlag.Torque = PyArgToBool(bToggle);
- Py_RETURN_NONE;
-}
-
-/* 6. getForceLimitY */
-PyObject* KX_ObjectActuator::PyGetForceLimitY()
-{
- ShowDeprecationWarning("getForceLimitY()", "the forceLimitY property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_drot[1]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_dloc[1]));
- PyList_SET_ITEM(retVal, 2, BoolToPyArg(m_bitLocalFlag.DLoc));
-
- return retVal;
-}
-/* 7. setForceLimitY */
-PyObject* KX_ObjectActuator::PySetForceLimitY(PyObject* args)
-{
- ShowDeprecationWarning("setForceLimitY()", "the forceLimitY property");
- float vecArg[2];
- int bToggle = 0;
- if(!PyArg_ParseTuple(args, "ffi:setForceLimitY", &vecArg[0], &vecArg[1], &bToggle)) {
- return NULL;
- }
- m_drot[1] = vecArg[0];
- m_dloc[1] = vecArg[1];
- m_bitLocalFlag.DLoc = PyArgToBool(bToggle);
- Py_RETURN_NONE;
-}
-
-/* 6. getForceLimitZ */
-PyObject* KX_ObjectActuator::PyGetForceLimitZ()
-{
- ShowDeprecationWarning("getForceLimitZ()", "the forceLimitZ property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_drot[2]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_dloc[2]));
- PyList_SET_ITEM(retVal, 2, BoolToPyArg(m_bitLocalFlag.DRot));
-
- return retVal;
-}
-/* 7. setForceLimitZ */
-PyObject* KX_ObjectActuator::PySetForceLimitZ(PyObject* args)
-{
- ShowDeprecationWarning("setForceLimitZ()", "the forceLimitZ property");
- float vecArg[2];
- int bToggle = 0;
- if(!PyArg_ParseTuple(args, "ffi:setForceLimitZ", &vecArg[0], &vecArg[1], &bToggle)) {
- return NULL;
- }
- m_drot[2] = vecArg[0];
- m_dloc[2] = vecArg[1];
- m_bitLocalFlag.DRot = PyArgToBool(bToggle);
- Py_RETURN_NONE;
-}
-
-/* 4. getPID */
-PyObject* KX_ObjectActuator::PyGetPID()
-{
- ShowDeprecationWarning("getPID()", "the pid property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_pid[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_pid[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_pid[2]));
-
- return retVal;
-}
-/* 5. setPID */
-PyObject* KX_ObjectActuator::PySetPID(PyObject* args)
-{
- ShowDeprecationWarning("setPID()", "the pid property");
- float vecArg[3];
- if (!PyArg_ParseTuple(args, "fff:setPID", &vecArg[0], &vecArg[1], &vecArg[2])) {
- return NULL;
- }
- m_pid.setValue(vecArg);
- Py_RETURN_NONE;
-}
-
-
-
-
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.h b/source/gameengine/Ketsji/KX_ObjectActuator.h
index 6ca442b2ec2..7a8c7de16b1 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.h
@@ -135,8 +135,7 @@ public:
const MT_Vector3& linV,
const MT_Vector3& angV,
const short damping,
- const KX_LocalFlags& flag,
- PyTypeObject* T=&Type
+ const KX_LocalFlags& flag
);
~KX_ObjectActuator();
CValue* GetReplica();
@@ -163,33 +162,6 @@ public:
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetForce);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetForce);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetTorque);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetTorque);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetDLoc);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetDLoc);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetDRot);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetDRot);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetLinearVelocity);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetLinearVelocity);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetAngularVelocity);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetAngularVelocity);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetDamping);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetDamping);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetForceLimitX);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetForceLimitX);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetForceLimitY);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetForceLimitY);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetForceLimitZ);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetForceLimitZ);
- KX_PYMETHOD_NOARGS(KX_ObjectActuator,GetPID);
- KX_PYMETHOD_VARARGS(KX_ObjectActuator,SetPID);
/* Attributes */
static PyObject* pyattr_get_forceLimitX(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.h b/source/gameengine/Ketsji/KX_OrientationInterpolator.h
index 2bd9f69d824..d8ecc74277c 100644
--- a/source/gameengine/Ketsji/KX_OrientationInterpolator.h
+++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.h
@@ -50,6 +50,13 @@ public:
private:
MT_Matrix3x3& m_target;
KX_IScalarInterpolator *m_ipos[3];
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+private:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_OrientationInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.cpp b/source/gameengine/Ketsji/KX_ParentActuator.cpp
index cd2ed456c48..a4a6b67ad10 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ParentActuator.cpp
@@ -50,9 +50,8 @@ KX_ParentActuator::KX_ParentActuator(SCA_IObject *gameobj,
int mode,
bool addToCompound,
bool ghost,
- SCA_IObject *ob,
- PyTypeObject* T)
- : SCA_IActuator(gameobj, T),
+ SCA_IObject *ob)
+ : SCA_IActuator(gameobj, KX_ACT_PARENT),
m_mode(mode),
m_addToCompound(addToCompound),
m_ghost(ghost),
@@ -141,13 +140,7 @@ bool KX_ParentActuator::Update()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_ParentActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_ParentActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -157,26 +150,18 @@ PyTypeObject KX_ParentActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_ParentActuator::Parents[] = {
- &KX_ParentActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_ParentActuator::Methods[] = {
- // Deprecated ----->
- {"setObject", (PyCFunction) KX_ParentActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
- {"getObject", (PyCFunction) KX_ParentActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
- // <-----
{NULL,NULL} //Sentinel
};
@@ -216,67 +201,4 @@ int KX_ParentActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUTE
return PY_SET_ATTR_SUCCESS;
}
-
-PyObject* KX_ParentActuator::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_ParentActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_ParentActuator::py_setattro(PyObject *attr, PyObject* value) {
- py_setattro_up(SCA_IActuator);
-}
-
-/* Deprecated -----> */
-/* 1. setObject */
-const char KX_ParentActuator::SetObject_doc[] =
-"setObject(object)\n"
-"\t- object: KX_GameObject, string or None\n"
-"\tSet the object to set as parent.\n";
-PyObject* KX_ParentActuator::PySetObject(PyObject* value) {
- KX_GameObject *gameobj;
-
- ShowDeprecationWarning("setObject()", "the object property");
-
- if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_ParentActuator"))
- return NULL; // ConvertPythonToGameObject sets the error
-
- if (m_ob != NULL)
- m_ob->UnregisterActuator(this);
-
- m_ob = (SCA_IObject*)gameobj;
- if (m_ob)
- m_ob->RegisterActuator(this);
-
- Py_RETURN_NONE;
-}
-
-/* 2. getObject */
-
-/* get obj ---------------------------------------------------------- */
-const char KX_ParentActuator::GetObject_doc[] =
-"getObject(name_only = 1)\n"
-"name_only - optional arg, when true will return the KX_GameObject rather then its name\n"
-"\tReturns the object that is set to.\n";
-PyObject* KX_ParentActuator::PyGetObject(PyObject* args)
-{
- int ret_name_only = 1;
-
- ShowDeprecationWarning("getObject()", "the object property");
-
- if (!PyArg_ParseTuple(args, "|i:getObject", &ret_name_only))
- return NULL;
-
- if (!m_ob)
- Py_RETURN_NONE;
-
- if (ret_name_only)
- return PyString_FromString(m_ob->GetName().ReadPtr());
- else
- return m_ob->GetProxy();
-}
-/* <----- */
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.h b/source/gameengine/Ketsji/KX_ParentActuator.h
index 148375e994c..f750affc8a1 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.h
+++ b/source/gameengine/Ketsji/KX_ParentActuator.h
@@ -68,8 +68,7 @@ class KX_ParentActuator : public SCA_IActuator
int mode,
bool addToCompound,
bool ghost,
- SCA_IObject *ob,
- PyTypeObject* T=&Type);
+ SCA_IObject *ob);
virtual ~KX_ParentActuator();
virtual bool Update();
@@ -82,18 +81,9 @@ class KX_ParentActuator : public SCA_IActuator
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
/* These are used to get and set m_ob */
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);
-
- // Deprecated ----->
- KX_PYMETHOD_DOC_O(KX_ParentActuator,SetObject);
- KX_PYMETHOD_DOC_VARARGS(KX_ParentActuator,GetObject);
- // <-----
}; /* 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 c968e50957e..edb19002671 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
@@ -39,8 +39,8 @@
KX_PhysicsObjectWrapper::KX_PhysicsObjectWrapper(
PHY_IPhysicsController* ctrl,
- PHY_IPhysicsEnvironment* physenv,PyTypeObject *T) :
- PyObjectPlus(T),
+ PHY_IPhysicsEnvironment* physenv) :
+ PyObjectPlus(),
m_ctrl(ctrl),
m_physenv(physenv)
{
@@ -113,62 +113,27 @@ PyAttributeDef KX_PhysicsObjectWrapper::Attributes[] = {
//python specific stuff
PyTypeObject KX_PhysicsObjectWrapper::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_PhysicsObjectWrapper",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_PhysicsObjectWrapper::Parents[] = {
- &KX_PhysicsObjectWrapper::Type,
- NULL
+ "KX_PhysicsObjectWrapper",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &PyObjectPlus::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyObject* KX_PhysicsObjectWrapper::py_getattro(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* KX_PhysicsObjectWrapper::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-int KX_PhysicsObjectWrapper::py_setattro(PyObject *attr,PyObject *pyobj)
-{
- int result = 1;
-
- if (PyInt_Check(pyobj))
- {
- result = 0;
- }
- if (PyString_Check(pyobj))
- {
- result = 0;
- }
- if (result)
- result = PyObjectPlus::py_setattro(attr,pyobj);
-
- return result;
-};
-
-
PyMethodDef KX_PhysicsObjectWrapper::Methods[] = {
{"setPosition",(PyCFunction) KX_PhysicsObjectWrapper::sPySetPosition, METH_VARARGS},
{"setLinearVelocity",(PyCFunction) KX_PhysicsObjectWrapper::sPySetLinearVelocity, METH_VARARGS},
diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
index 1b59686babc..fa6fd1d1f2a 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
@@ -35,12 +35,8 @@
class KX_PhysicsObjectWrapper : public PyObjectPlus
{
Py_Header;
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
public:
- KX_PhysicsObjectWrapper(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsEnvironment* physenv,PyTypeObject *T = &Type);
+ KX_PhysicsObjectWrapper(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsEnvironment* physenv);
virtual ~KX_PhysicsObjectWrapper();
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetPosition);
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.cpp b/source/gameengine/Ketsji/KX_PolyProxy.cpp
index b56b5500c39..af8e0510a11 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.cpp
+++ b/source/gameengine/Ketsji/KX_PolyProxy.cpp
@@ -39,13 +39,7 @@
#include "KX_PyMath.h"
PyTypeObject KX_PolyProxy::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_PolyProxy",
sizeof(PyObjectPlus_Proxy),
0,
@@ -55,18 +49,15 @@ PyTypeObject KX_PolyProxy::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_PolyProxy::Parents[] = {
- &KX_PolyProxy::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- &PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_PolyProxy::Methods[] = {
@@ -98,16 +89,17 @@ PyAttributeDef KX_PolyProxy::Attributes[] = {
{ NULL } //Sentinel
};
+#if 0
PyObject* KX_PolyProxy::py_getattro(PyObject *attr)
{
- char *attr_str= PyString_AsString(attr);
+ char *attr_str= _PyUnicode_AsString(attr);
if (!strcmp(attr_str, "matname"))
{
- return PyString_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
+ return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
}
if (!strcmp(attr_str, "texture"))
{
- return PyString_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
+ return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
}
if (!strcmp(attr_str, "material"))
{
@@ -136,38 +128,35 @@ PyObject* KX_PolyProxy::py_getattro(PyObject *attr)
// found it
break;
}
- return PyInt_FromLong(matid);
+ return PyLong_FromSsize_t(matid);
}
if (!strcmp(attr_str, "v1"))
{
- return PyInt_FromLong(m_polygon->GetVertexOffset(0));
+ return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 0));
}
if (!strcmp(attr_str, "v2"))
{
- return PyInt_FromLong(m_polygon->GetVertexOffset(1));
+ return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 1));
}
if (!strcmp(attr_str, "v3"))
{
- return PyInt_FromLong(m_polygon->GetVertexOffset(2));
+ return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, 2));
}
if (!strcmp(attr_str, "v4"))
{
- return PyInt_FromLong(((m_polygon->VertexCount()>3)?m_polygon->GetVertexOffset(3):0));
+ return PyLong_FromSsize_t(((m_polygon->VertexCount()>3)?m_polygon->GetVertexOffsetAbs(m_mesh, 3):0));
}
if (!strcmp(attr_str, "visible"))
{
- return PyInt_FromLong(m_polygon->IsVisible());
+ return PyLong_FromSsize_t(m_polygon->IsVisible());
}
if (!strcmp(attr_str, "collide"))
{
- return PyInt_FromLong(m_polygon->IsCollider());
+ return PyLong_FromSsize_t(m_polygon->IsCollider());
}
- py_getattro_up(CValue);
-}
-
-PyObject* KX_PolyProxy::py_getattro_dict() {
- py_getattro_dict_up(CValue);
+ // py_getattro_up(CValue); // XXX -- todo, make all these attributes
}
+#endif
KX_PolyProxy::KX_PolyProxy(const RAS_MeshObject*mesh, RAS_Polygon* polygon)
: m_polygon(polygon),
@@ -204,37 +193,37 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialIndex,
// found it
break;
}
- return PyInt_FromLong(matid);
+ return PyLong_FromSsize_t(matid);
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getNumVertex,
"getNumVertex() : returns the number of vertex of the polygon, 3 or 4\n")
{
- return PyInt_FromLong(m_polygon->VertexCount());
+ return PyLong_FromSsize_t(m_polygon->VertexCount());
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isVisible,
"isVisible() : returns whether the polygon is visible or not\n")
{
- return PyInt_FromLong(m_polygon->IsVisible());
+ return PyLong_FromSsize_t(m_polygon->IsVisible());
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, isCollider,
"isCollider() : returns whether the polygon is receives collision or not\n")
{
- return PyInt_FromLong(m_polygon->IsCollider());
+ return PyLong_FromSsize_t(m_polygon->IsCollider());
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterialName,
"getMaterialName() : returns the polygon material name, \"NoMaterial\" if no material\n")
{
- return PyString_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
+ return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetMaterialName());
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getTextureName,
"getTexturelName() : returns the polygon texture name, \"NULL\" if no texture\n")
{
- return PyString_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
+ return PyUnicode_FromString(m_polygon->GetMaterial()->GetPolyMaterial()->GetTextureName());
}
KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex,
@@ -255,9 +244,9 @@ KX_PYMETHODDEF_DOC(KX_PolyProxy, getVertexIndex,
}
if (index < m_polygon->VertexCount())
{
- return PyInt_FromLong(m_polygon->GetVertexOffset(index));
+ return PyLong_FromSsize_t(m_polygon->GetVertexOffsetAbs(m_mesh, index));
}
- return PyInt_FromLong(0);
+ return PyLong_FromSsize_t(0);
}
KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMesh,
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.h b/source/gameengine/Ketsji/KX_PolyProxy.h
index d8fd36fec6c..e619617d312 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.h
+++ b/source/gameengine/Ketsji/KX_PolyProxy.h
@@ -52,8 +52,6 @@ public:
// stuff for python integration
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
KX_PYMETHOD_DOC_NOARGS(KX_PolyProxy,getMaterialIndex)
KX_PYMETHOD_DOC_NOARGS(KX_PolyProxy,getNumVertex)
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index 506c167a905..5b4322ae4cd 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -51,8 +51,8 @@
#include "KX_PyMath.h"
-KX_PolygonMaterial::KX_PolygonMaterial(PyTypeObject *T)
- : PyObjectPlus(T),
+KX_PolygonMaterial::KX_PolygonMaterial()
+ : PyObjectPlus(),
RAS_IPolyMaterial(),
m_tface(NULL),
@@ -88,8 +88,7 @@ void KX_PolygonMaterial::Initialize(
mode,
transp,
alpha,
- zsort,
- lightlayer);
+ zsort);
m_tface = tface;
m_mcol = mcol;
m_material = ma;
@@ -115,7 +114,7 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI
PyObject *ret = PyObject_CallMethod(m_pymaterial, "activate", "(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy);
if (ret)
{
- bool value = PyInt_AsLong(ret);
+ bool value = PyLong_AsSsize_t(ret);
Py_DECREF(ret);
dopass = value;
}
@@ -149,7 +148,7 @@ void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& c
if (GetCachingInfo() != cachingInfo)
{
if (!cachingInfo)
- GPU_set_tpage(NULL);
+ GPU_set_tpage(NULL, 0);
cachingInfo = GetCachingInfo();
@@ -157,10 +156,10 @@ void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& c
{
Image *ima = (Image*)m_tface->tpage;
GPU_update_image_time(ima, rasty->GetTime());
- GPU_set_tpage(m_tface);
+ GPU_set_tpage(m_tface, 1);
}
else
- GPU_set_tpage(NULL);
+ GPU_set_tpage(NULL, 0);
if(m_drawingmode & RAS_IRasterizer::KX_TWOSIDE)
rasty->SetCullFace(false);
@@ -239,49 +238,27 @@ PyAttributeDef KX_PolygonMaterial::Attributes[] = {
};
PyTypeObject KX_PolygonMaterial::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_PolygonMaterial",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_PolygonMaterial::Parents[] = {
- &KX_PolygonMaterial::Type,
+ "KX_PolygonMaterial",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyObject* KX_PolygonMaterial::py_getattro(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* KX_PolygonMaterial::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-int KX_PolygonMaterial::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(PyObjectPlus);
-}
-
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setCustomMaterial, "setCustomMaterial(material)")
{
PyObject *material;
@@ -320,7 +297,7 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
if (PyArg_ParseTuple(args, "O!:setTexture", &PyCObject_Type, &pytface))
{
MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
- GPU_set_tpage(tface);
+ GPU_set_tpage(tface, 1);
Py_RETURN_NONE;
}
@@ -347,13 +324,13 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, activate, "activate(rasty, cachingInfo)")
PyObject* KX_PolygonMaterial::pyattr_get_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
- return PyString_FromString(self->m_texturename.ReadPtr());
+ return PyUnicode_FromString(self->m_texturename.ReadPtr());
}
PyObject* KX_PolygonMaterial::pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
- return PyString_FromString(self->m_materialname.ReadPtr());
+ return PyUnicode_FromString(self->m_materialname.ReadPtr());
}
/* this does not seem useful */
@@ -370,7 +347,7 @@ PyObject* KX_PolygonMaterial::pyattr_get_gl_texture(void *self_v, const KX_PYATT
if (self->m_tface && self->m_tface->tpage)
bindcode= self->m_tface->tpage->bindcode;
- return PyInt_FromLong(bindcode);
+ return PyLong_FromSsize_t(bindcode);
}
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.h b/source/gameengine/Ketsji/KX_PolygonMaterial.h
index 89ecb026da9..dc42bd2f81b 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.h
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.h
@@ -35,6 +35,10 @@
#include "RAS_IRasterizer.h"
#include "DNA_ID.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct MTFace;
struct Material;
struct MTex;
@@ -57,7 +61,8 @@ private:
mutable int m_pass;
public:
- KX_PolygonMaterial(PyTypeObject *T = &Type);
+
+ KX_PolygonMaterial();
void Initialize(const STR_String &texname,
Material* ma,
int materialindex,
@@ -116,10 +121,7 @@ public:
KX_PYMETHOD_DOC(KX_PolygonMaterial, setCustomMaterial);
KX_PYMETHOD_DOC(KX_PolygonMaterial, loadProgram);
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
- virtual PyObject* py_repr(void) { return PyString_FromString(m_material ? ((ID *)m_material)->name+2 : ""); }
+ virtual PyObject* py_repr(void) { return PyUnicode_FromString(m_material ? ((ID *)m_material)->name+2 : ""); }
static PyObject* pyattr_get_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_material(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_PositionInterpolator.h b/source/gameengine/Ketsji/KX_PositionInterpolator.h
index bff0b4201c2..f6c6fa98a0e 100644
--- a/source/gameengine/Ketsji/KX_PositionInterpolator.h
+++ b/source/gameengine/Ketsji/KX_PositionInterpolator.h
@@ -50,6 +50,13 @@ public:
private:
MT_Point3& m_target;
KX_IScalarInterpolator *m_ipos[3];
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+private:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_PositionInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index 4ec901a2f5e..04cec3c9106 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
@@ -542,62 +542,60 @@ static PyObject* gPyRemoveConstraint(PyObject* self,
static struct PyMethodDef physicsconstraints_methods[] = {
{"setGravity",(PyCFunction) gPySetGravity,
- METH_VARARGS, (PY_METHODCHAR)gPySetGravity__doc__},
+ METH_VARARGS, (const char *)gPySetGravity__doc__},
{"setDebugMode",(PyCFunction) gPySetDebugMode,
- METH_VARARGS, (PY_METHODCHAR)gPySetDebugMode__doc__},
+ METH_VARARGS, (const char *)gPySetDebugMode__doc__},
/// settings that influence quality of the rigidbody dynamics
{"setNumIterations",(PyCFunction) gPySetNumIterations,
- METH_VARARGS, (PY_METHODCHAR)gPySetNumIterations__doc__},
+ METH_VARARGS, (const char *)gPySetNumIterations__doc__},
{"setNumTimeSubSteps",(PyCFunction) gPySetNumTimeSubSteps,
- METH_VARARGS, (PY_METHODCHAR)gPySetNumTimeSubSteps__doc__},
+ METH_VARARGS, (const char *)gPySetNumTimeSubSteps__doc__},
{"setDeactivationTime",(PyCFunction) gPySetDeactivationTime,
- METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationTime__doc__},
+ METH_VARARGS, (const char *)gPySetDeactivationTime__doc__},
{"setDeactivationLinearTreshold",(PyCFunction) gPySetDeactivationLinearTreshold,
- METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationLinearTreshold__doc__},
+ METH_VARARGS, (const char *)gPySetDeactivationLinearTreshold__doc__},
{"setDeactivationAngularTreshold",(PyCFunction) gPySetDeactivationAngularTreshold,
- METH_VARARGS, (PY_METHODCHAR)gPySetDeactivationAngularTreshold__doc__},
+ METH_VARARGS, (const char *)gPySetDeactivationAngularTreshold__doc__},
{"setContactBreakingTreshold",(PyCFunction) gPySetContactBreakingTreshold,
- METH_VARARGS, (PY_METHODCHAR)gPySetContactBreakingTreshold__doc__},
+ METH_VARARGS, (const char *)gPySetContactBreakingTreshold__doc__},
{"setCcdMode",(PyCFunction) gPySetCcdMode,
- METH_VARARGS, (PY_METHODCHAR)gPySetCcdMode__doc__},
+ METH_VARARGS, (const char *)gPySetCcdMode__doc__},
{"setSorConstant",(PyCFunction) gPySetSorConstant,
- METH_VARARGS, (PY_METHODCHAR)gPySetSorConstant__doc__},
+ METH_VARARGS, (const char *)gPySetSorConstant__doc__},
{"setSolverTau",(PyCFunction) gPySetSolverTau,
- METH_VARARGS, (PY_METHODCHAR)gPySetSolverTau__doc__},
+ METH_VARARGS, (const char *)gPySetSolverTau__doc__},
{"setSolverDamping",(PyCFunction) gPySetSolverDamping,
- METH_VARARGS, (PY_METHODCHAR)gPySetSolverDamping__doc__},
+ METH_VARARGS, (const char *)gPySetSolverDamping__doc__},
{"setLinearAirDamping",(PyCFunction) gPySetLinearAirDamping,
- METH_VARARGS, (PY_METHODCHAR)gPySetLinearAirDamping__doc__},
+ METH_VARARGS, (const char *)gPySetLinearAirDamping__doc__},
{"setUseEpa",(PyCFunction) gPySetUseEpa,
- METH_VARARGS, (PY_METHODCHAR)gPySetUseEpa__doc__},
+ METH_VARARGS, (const char *)gPySetUseEpa__doc__},
{"setSolverType",(PyCFunction) gPySetSolverType,
- METH_VARARGS, (PY_METHODCHAR)gPySetSolverType__doc__},
+ METH_VARARGS, (const char *)gPySetSolverType__doc__},
{"createConstraint",(PyCFunction) gPyCreateConstraint,
- METH_VARARGS, (PY_METHODCHAR)gPyCreateConstraint__doc__},
+ METH_VARARGS, (const char *)gPyCreateConstraint__doc__},
{"getVehicleConstraint",(PyCFunction) gPyGetVehicleConstraint,
- METH_VARARGS, (PY_METHODCHAR)gPyGetVehicleConstraint__doc__},
+ METH_VARARGS, (const char *)gPyGetVehicleConstraint__doc__},
{"removeConstraint",(PyCFunction) gPyRemoveConstraint,
- METH_VARARGS, (PY_METHODCHAR)gPyRemoveConstraint__doc__},
+ METH_VARARGS, (const char *)gPyRemoveConstraint__doc__},
{"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse,
- METH_VARARGS, (PY_METHODCHAR)gPyGetAppliedImpulse__doc__},
+ METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__},
//sentinel
{ NULL, (PyCFunction) NULL, 0, NULL }
};
-
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef PhysicsConstraints_module_def = {
{}, /* m_base */
"PhysicsConstraints", /* m_name */
@@ -609,7 +607,6 @@ static struct PyModuleDef PhysicsConstraints_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
PyObject* initPythonConstraintBinding()
{
@@ -627,20 +624,14 @@ PyObject* initPythonConstraintBinding()
}
else {
PyErr_Clear();
-
-#if (PY_VERSION_HEX >= 0x03000000)
+
m = PyModule_Create(&PhysicsConstraints_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), PhysicsConstraints_module_def.m_name, m);
-#else
- m = Py_InitModule4("PhysicsConstraints", physicsconstraints_methods,
- PhysicsConstraints_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
-#endif
}
// Add some symbolic constants to the module
d = PyModule_GetDict(m);
- ErrorObject = PyString_FromString("PhysicsConstraints.error");
+ ErrorObject = PyUnicode_FromString("PhysicsConstraints.error");
PyDict_SetItemString(d, "error", ErrorObject);
Py_DECREF(ErrorObject);
diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp
index 76cfb0e572d..a41dab194dd 100644
--- a/source/gameengine/Ketsji/KX_PyMath.cpp
+++ b/source/gameengine/Ketsji/KX_PyMath.cpp
@@ -99,7 +99,7 @@ PyObject* PyObjectFrom(const MT_Matrix4x4 &mat)
#ifdef USE_MATHUTILS
float fmat[16];
mat.getValue(fmat);
- return newMatrixObject(fmat, 4, 4, Py_NEW);
+ return newMatrixObject(fmat, 4, 4, Py_NEW, NULL);
#else
PyObject *list = PyList_New(4);
PyObject *sublist;
@@ -123,7 +123,7 @@ PyObject* PyObjectFrom(const MT_Matrix3x3 &mat)
#ifdef USE_MATHUTILS
float fmat[9];
mat.getValue3x3(fmat);
- return newMatrixObject(fmat, 3, 3, Py_NEW);
+ return newMatrixObject(fmat, 3, 3, Py_NEW, NULL);
#else
PyObject *list = PyList_New(3);
PyObject *sublist;
@@ -146,7 +146,7 @@ PyObject* PyObjectFrom(const MT_Quaternion &qrot)
{
/* NOTE, were re-ordering here for Mathutils compat */
float fvec[4]= {qrot[3], qrot[0], qrot[1], qrot[2]};
- return newQuaternionObject(fvec, Py_WRAP);
+ return newQuaternionObject(fvec, Py_NEW, NULL);
}
#endif
@@ -154,7 +154,7 @@ PyObject* PyObjectFrom(const MT_Tuple4 &vec)
{
#ifdef USE_MATHUTILS
float fvec[4]= {vec[0], vec[1], vec[2], vec[3]};
- return newVectorObject(fvec, 4, Py_WRAP);
+ return newVectorObject(fvec, 4, Py_NEW, NULL);
#else
PyObject *list = PyList_New(4);
PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
@@ -169,7 +169,7 @@ PyObject* PyObjectFrom(const MT_Tuple3 &vec)
{
#ifdef USE_MATHUTILS
float fvec[3]= {vec[0], vec[1], vec[2]};
- return newVectorObject(fvec, 3, Py_WRAP);
+ return newVectorObject(fvec, 3, Py_NEW, NULL);
#else
PyObject *list = PyList_New(3);
PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
@@ -183,7 +183,7 @@ PyObject* PyObjectFrom(const MT_Tuple2 &vec)
{
#ifdef USE_MATHUTILS
float fvec[2]= {vec[0], vec[1]};
- return newVectorObject(fvec, 2, Py_WRAP);
+ return newVectorObject(fvec, 2, Py_NEW, NULL);
#else
PyObject *list = PyList_New(2);
PyList_SET_ITEM(list, 0, PyFloat_FromDouble(vec[0]));
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index f37925bb0ab..1ce8bcafbb6 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -31,12 +31,6 @@
#ifndef __KX_PYMATH_H__
#define __KX_PYMATH_H__
-#ifdef USE_MATHUTILS
-extern "C" {
-#include "../../blender/python/generic/Mathutils.h" /* so we can have mathutils callbacks */
-}
-#endif
-
#include "MT_Point2.h"
#include "MT_Point3.h"
#include "MT_Vector2.h"
@@ -48,6 +42,12 @@ extern "C" {
#include "KX_Python.h"
#include "PyObjectPlus.h"
+#ifdef USE_MATHUTILS
+extern "C" {
+#include "../../blender/python/generic/Mathutils.h" /* so we can have mathutils callbacks */
+}
+#endif
+
inline unsigned int Size(const MT_Matrix4x4&) { return 4; }
inline unsigned int Size(const MT_Matrix3x3&) { return 3; }
inline unsigned int Size(const MT_Tuple2&) { return 2; }
@@ -109,30 +109,33 @@ bool PyVecTo(PyObject* pyval, T& vec)
if(VectorObject_Check(pyval)) {
VectorObject *pyvec= (VectorObject *)pyval;
+ BaseMath_ReadCallback(pyvec);
if (pyvec->size != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", pyvec->size, Size(vec));
return false;
}
- vec.getValue((float *) pyvec->vec);
+ vec.setValue((float *) pyvec->vec);
return true;
}
else if(QuaternionObject_Check(pyval)) {
QuaternionObject *pyquat= (QuaternionObject *)pyval;
+ BaseMath_ReadCallback(pyquat);
if (4 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 4, Size(vec));
return false;
}
/* xyzw -> wxyz reordering is done by PyQuatTo */
- vec.getValue((float *) pyquat->quat);
+ vec.setValue((float *) pyquat->quat);
return true;
}
else if(EulerObject_Check(pyval)) {
EulerObject *pyeul= (EulerObject *)pyval;
+ BaseMath_ReadCallback(pyeul);
if (3 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 3, Size(vec));
return false;
}
- vec.getValue((float *) pyeul->eul);
+ vec.setValue((float *) pyeul->eul);
return true;
} else
#endif
@@ -154,7 +157,7 @@ bool PyVecTo(PyObject* pyval, T& vec)
return true;
}
- else if (BGE_PROXY_CHECK_TYPE(pyval))
+ else if (PyObject_TypeCheck(pyval, (PyTypeObject *)&PyObjectPlus::Type))
{ /* note, include this check because PySequence_Check does too much introspection
* on the PyObject (like getting its __class__, on a BGE type this means searching up
* the parent list each time only to discover its not a sequence.
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 736460d33db..bef00fb7a06 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -32,11 +32,6 @@
// directory header for py function getBlendFileList
#include <stdlib.h>
-#ifndef WIN32
- #include <dirent.h>
-#else
- #include "BLI_winstuff.h"
-#endif
#ifdef WIN32
#pragma warning (disable : 4786)
@@ -56,6 +51,7 @@ extern "C" {
#include "KX_KetsjiEngine.h"
#include "KX_RadarSensor.h"
#include "KX_RaySensor.h"
+#include "KX_ArmatureSensor.h"
#include "KX_SceneActuator.h"
#include "KX_GameActuator.h"
#include "KX_ParentActuator.h"
@@ -70,6 +66,7 @@ extern "C" {
#include "KX_SoundActuator.h"
#include "KX_StateActuator.h"
#include "BL_ActionActuator.h"
+#include "BL_ArmatureObject.h"
#include "RAS_IRasterizer.h"
#include "RAS_ICanvas.h"
#include "RAS_BucketManager.h"
@@ -79,9 +76,6 @@ extern "C" {
#include "ListValue.h"
#include "InputParser.h"
#include "KX_Scene.h"
-#include "SND_DeviceManager.h"
-
-#include "NG_NetworkScene.h" //Needed for sendMessage()
#include "BL_Shader.h"
@@ -93,6 +87,7 @@ extern "C" {
/* we only need this to get a list of libraries from the main struct */
#include "DNA_ID.h"
+#include "DNA_scene_types.h"
#include "marshal.h" /* python header for loading/saving dicts */
@@ -111,6 +106,13 @@ extern "C" {
#include "BLI_blenlib.h"
#include "GPU_material.h"
+#ifndef WIN32
+ #include <dirent.h>
+#else
+ #include "BLI_winstuff.h"
+#endif
+#include "NG_NetworkScene.h" //Needed for sendMessage()
+
static void setSandbox(TPythonSecurityLevel level);
// 'local' copy of canvas ptr, for window height/width python scripts
@@ -130,10 +132,10 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
}
/* Macro for building the keyboard translation */
-//#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyInt_FromLong(SCA_IInputDevice::KX_##name))
-#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyInt_FromLong(name)); Py_DECREF(item)
+//#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, PyLong_FromSsize_t(SCA_IInputDevice::KX_##name))
+#define KX_MACRO_addToDict(dict, name) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name)); Py_DECREF(item)
/* For the defines for types from logic bricks, we do stuff explicitly... */
-#define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyInt_FromLong(name2)); Py_DECREF(item)
+#define KX_MACRO_addTypesToDict(dict, name, name2) PyDict_SetItemString(dict, #name, item=PyLong_FromSsize_t(name2)); Py_DECREF(item)
// temporarily python stuff, will be put in another place later !
@@ -142,7 +144,7 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
// List of methods defined in the module
static PyObject* ErrorObject;
-STR_String gPyGetRandomFloat_doc="getRandomFloat returns a random floating point value in the range [0..1)";
+static const char *gPyGetRandomFloat_doc="getRandomFloat returns a random floating point value in the range [0..1]";
static PyObject* gPyGetRandomFloat(PyObject*)
{
@@ -181,7 +183,7 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_convertstringcode(expanded, gp_GamePythonPath);
- return PyString_FromString(expanded);
+ return PyUnicode_FromString(expanded);
}
static char gPySendMessage_doc[] =
@@ -207,74 +209,24 @@ static PyObject* gPySendMessage(PyObject*, PyObject* args)
Py_RETURN_NONE;
}
-static bool usedsp = false;
-
// this gets a pointer to an array filled with floats
static PyObject* gPyGetSpectrum(PyObject*)
{
- SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
-
PyObject* resultlist = PyList_New(512);
- if (audiodevice)
- {
- if (!usedsp)
- {
- audiodevice->StartUsingDSP();
- usedsp = true;
- }
-
- float* spectrum = audiodevice->GetSpectrum();
-
- for (int index = 0; index < 512; index++)
- {
- PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(spectrum[index]));
- }
- }
- else {
- for (int index = 0; index < 512; index++)
- {
- PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(0.0));
- }
- }
+ for (int index = 0; index < 512; index++)
+ {
+ PyList_SET_ITEM(resultlist, index, PyFloat_FromDouble(0.0));
+ }
return resultlist;
}
-#if 0 // unused
-static PyObject* gPyStartDSP(PyObject*, PyObject* args)
-{
- SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
-
- if (!audiodevice) {
- PyErr_SetString(PyExc_RuntimeError, "no audio device available");
- return NULL;
- }
-
- if (!usedsp) {
- audiodevice->StartUsingDSP();
- usedsp = true;
- }
-
- Py_RETURN_NONE;
-}
-#endif
-
-
static PyObject* gPyStopDSP(PyObject*, PyObject* args)
{
- SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
-
- if (!audiodevice) {
- PyErr_SetString(PyExc_RuntimeError, "no audio device available");
- return NULL;
- }
-
- if (usedsp) {
- audiodevice->StopUsingDSP();
- usedsp = true;
- }
+ PyErr_SetString(PyExc_RuntimeError, "no audio device available");
+ return NULL;
Py_RETURN_NONE;
}
@@ -306,7 +258,7 @@ static PyObject* gPySetMaxLogicFrame(PyObject*, PyObject* args)
static PyObject* gPyGetMaxLogicFrame(PyObject*)
{
- return PyInt_FromLong(KX_KetsjiEngine::GetMaxLogicFrame());
+ return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxLogicFrame());
}
static PyObject* gPySetMaxPhysicsFrame(PyObject*, PyObject* args)
@@ -321,7 +273,7 @@ static PyObject* gPySetMaxPhysicsFrame(PyObject*, PyObject* args)
static PyObject* gPyGetMaxPhysicsFrame(PyObject*)
{
- return PyInt_FromLong(KX_KetsjiEngine::GetMaxPhysicsFrame());
+ return PyLong_FromSsize_t(KX_KetsjiEngine::GetMaxPhysicsFrame());
}
static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
@@ -386,7 +338,7 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
while ((dirp = readdir(dp)) != NULL) {
if (BLI_testextensie(dirp->d_name, ".blend")) {
- value = PyString_FromString(dirp->d_name);
+ value = PyUnicode_FromString(dirp->d_name);
PyList_Append(list, value);
Py_DECREF(value);
}
@@ -396,7 +348,7 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
return list;
}
-static STR_String gPyGetCurrentScene_doc =
+static const char *gPyGetCurrentScene_doc =
"getCurrentScene()\n"
"Gets a reference to the current scene.\n";
static PyObject* gPyGetCurrentScene(PyObject* self)
@@ -404,7 +356,7 @@ static PyObject* gPyGetCurrentScene(PyObject* self)
return gp_KetsjiScene->GetProxy();
}
-static STR_String gPyGetSceneList_doc =
+static const char *gPyGetSceneList_doc =
"getSceneList()\n"
"Return a list of converted scenes.\n";
static PyObject* gPyGetSceneList(PyObject* self)
@@ -498,74 +450,45 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
}
-static PyObject *gEvalExpression(PyObject*, PyObject* value)
-{
- char* txt= PyString_AsString(value);
-
- if (txt==NULL) {
- PyErr_SetString(PyExc_TypeError, "Expression.calc(text): expects a single string argument");
- return NULL;
- }
-
- CParser parser;
- CExpression* expr = parser.ProcessText(txt);
- CValue* val = expr->Calculate();
- expr->Release();
-
- if (val) {
- PyObject* pyobj = val->ConvertValueToPython();
- if (pyobj)
- return pyobj;
- else
- return val->GetProxy();
- }
-
- Py_RETURN_NONE;
-}
-
-
static struct PyMethodDef game_methods[] = {
- {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (PY_METHODCHAR)gPyExpandPath_doc},
- {"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (PY_METHODCHAR)gPySendMessage_doc},
+ {"expandPath", (PyCFunction)gPyExpandPath, METH_VARARGS, (const char *)gPyExpandPath_doc},
+ {"sendMessage", (PyCFunction)gPySendMessage, METH_VARARGS, (const char *)gPySendMessage_doc},
{"getCurrentController",
(PyCFunction) SCA_PythonController::sPyGetCurrentController,
- METH_NOARGS, (PY_METHODCHAR)SCA_PythonController::sPyGetCurrentController__doc__},
+ METH_NOARGS, SCA_PythonController::sPyGetCurrentController__doc__},
{"getCurrentScene", (PyCFunction) gPyGetCurrentScene,
- METH_NOARGS, (PY_METHODCHAR)gPyGetCurrentScene_doc.Ptr()},
+ METH_NOARGS, gPyGetCurrentScene_doc},
{"getSceneList", (PyCFunction) gPyGetSceneList,
- METH_NOARGS, (PY_METHODCHAR)gPyGetSceneList_doc.Ptr()},
- {"addActiveActuator",(PyCFunction) SCA_PythonController::sPyAddActiveActuator,
- METH_VARARGS, (PY_METHODCHAR)SCA_PythonController::sPyAddActiveActuator__doc__},
+ METH_NOARGS, (const char *)gPyGetSceneList_doc},
{"getRandomFloat",(PyCFunction) gPyGetRandomFloat,
- METH_NOARGS, (PY_METHODCHAR)gPyGetRandomFloat_doc.Ptr()},
- {"setGravity",(PyCFunction) gPySetGravity, METH_O, (PY_METHODCHAR)"set Gravitation"},
- {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (PY_METHODCHAR)"get audio spectrum"},
- {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (PY_METHODCHAR)"stop using the audio dsp (for performance reasons)"},
- {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (PY_METHODCHAR)"Gets the max number of logic frame per render frame"},
- {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (PY_METHODCHAR)"Sets the max number of logic frame per render frame"},
- {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (PY_METHODCHAR)"Gets the max number of physics frame per render frame"},
- {"setMaxPhysicsFrame", (PyCFunction) gPySetMaxPhysicsFrame, METH_VARARGS, (PY_METHODCHAR)"Sets the max number of physics farme per render frame"},
- {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (PY_METHODCHAR)"Gets the logic tic rate"},
- {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (PY_METHODCHAR)"Sets the logic tic rate"},
- {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (PY_METHODCHAR)"Gets the physics tic rate"},
- {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (PY_METHODCHAR)"Sets the physics tic rate"},
- {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (PY_METHODCHAR)"Gets the estimated average frame rate"},
- {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (PY_METHODCHAR)"Gets a list of blend files in the same directory as the current blend file"},
- {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (PY_METHODCHAR)"Prints GL Extension Info"},
- {"EvalExpression", (PyCFunction)gEvalExpression, METH_O, (PY_METHODCHAR)"Evaluate a string as a game logic expression"},
+ METH_NOARGS, (const char *)gPyGetRandomFloat_doc},
+ {"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"},
+ {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"},
+ {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (const char *)"stop using the audio dsp (for performance reasons)"},
+ {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"},
+ {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"},
+ {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"},
+ {"setMaxPhysicsFrame", (PyCFunction) gPySetMaxPhysicsFrame, METH_VARARGS, (const char *)"Sets the max number of physics farme per render frame"},
+ {"getLogicTicRate", (PyCFunction) gPyGetLogicTicRate, METH_NOARGS, (const char *)"Gets the logic tic rate"},
+ {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
+ {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
+ {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
+ {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
+ {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
+ {"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
{NULL, (PyCFunction) NULL, 0, NULL }
};
static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
{
- return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetHeight() : 0));
+ return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetHeight() : 0));
}
static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
{
- return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetWidth() : 0));
+ return PyLong_FromSsize_t((gp_Canvas ? gp_Canvas->GetWidth() : 0));
}
@@ -818,17 +741,17 @@ static PyObject* gPyDisableMotionBlur(PyObject*)
int getGLSLSettingFlag(char *setting)
{
if(strcmp(setting, "lights") == 0)
- return G_FILE_GLSL_NO_LIGHTS;
+ return GAME_GLSL_NO_LIGHTS;
else if(strcmp(setting, "shaders") == 0)
- return G_FILE_GLSL_NO_SHADERS;
+ return GAME_GLSL_NO_SHADERS;
else if(strcmp(setting, "shadows") == 0)
- return G_FILE_GLSL_NO_SHADOWS;
+ return GAME_GLSL_NO_SHADOWS;
else if(strcmp(setting, "ramps") == 0)
- return G_FILE_GLSL_NO_RAMPS;
+ return GAME_GLSL_NO_RAMPS;
else if(strcmp(setting, "nodes") == 0)
- return G_FILE_GLSL_NO_NODES;
+ return GAME_GLSL_NO_NODES;
else if(strcmp(setting, "extra_textures") == 0)
- return G_FILE_GLSL_NO_EXTRA_TEX;
+ return GAME_GLSL_NO_EXTRA_TEX;
else
return -1;
}
@@ -837,8 +760,9 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
PyObject* args,
PyObject*)
{
+ GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
char *setting;
- int enable, flag, fileflags;
+ int enable, flag, sceneflag;
if (!PyArg_ParseTuple(args,"si:setGLSLMaterialSetting",&setting,&enable))
return NULL;
@@ -850,15 +774,15 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
return NULL;
}
- fileflags = G.fileflags;
+ sceneflag= gm->flag;
if (enable)
- G.fileflags &= ~flag;
+ gm->flag &= ~flag;
else
- G.fileflags |= flag;
+ gm->flag |= flag;
/* display lists and GLSL materials need to be remade */
- if(G.fileflags != fileflags) {
+ if(sceneflag != gm->flag) {
GPU_materials_free();
if(gp_KetsjiEngine) {
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
@@ -879,6 +803,7 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
PyObject* args,
PyObject*)
{
+ GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
char *setting;
int enabled = 0, flag;
@@ -892,8 +817,8 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
return NULL;
}
- enabled = ((G.fileflags & flag) != 0);
- return PyInt_FromLong(enabled);
+ enabled = ((gm->flag & flag) != 0);
+ return PyLong_FromSsize_t(enabled);
}
#define KX_TEXFACE_MATERIAL 0
@@ -904,40 +829,39 @@ static PyObject* gPySetMaterialType(PyObject*,
PyObject* args,
PyObject*)
{
- int flag, type;
+ GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
+ int type;
if (!PyArg_ParseTuple(args,"i:setMaterialType",&type))
return NULL;
if(type == KX_BLENDER_GLSL_MATERIAL)
- flag = G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL;
+ gm->matmode= GAME_MAT_GLSL;
else if(type == KX_BLENDER_MULTITEX_MATERIAL)
- flag = G_FILE_GAME_MAT;
+ gm->matmode= GAME_MAT_MULTITEX;
else if(type == KX_TEXFACE_MATERIAL)
- flag = 0;
+ gm->matmode= GAME_MAT_TEXFACE;
else {
PyErr_SetString(PyExc_ValueError, "Rasterizer.setMaterialType(int): material type is not known");
return NULL;
}
- G.fileflags &= ~(G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
- G.fileflags |= flag;
-
Py_RETURN_NONE;
}
static PyObject* gPyGetMaterialType(PyObject*)
{
+ GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
int flag;
- if(G.fileflags & G_FILE_GAME_MAT_GLSL)
+ if(gm->matmode == GAME_MAT_GLSL)
flag = KX_BLENDER_GLSL_MATERIAL;
- else if(G.fileflags & G_FILE_GAME_MAT)
+ else if(gm->matmode == GAME_MAT_MULTITEX)
flag = KX_BLENDER_MULTITEX_MATERIAL;
else
flag = KX_TEXFACE_MATERIAL;
- return PyInt_FromLong(flag);
+ return PyLong_FromSsize_t(flag);
}
static PyObject* gPyDrawLine(PyObject*, PyObject* args)
@@ -1019,7 +943,6 @@ static char Rasterizer_module_documentation[] =
"This is the Python API for the game engine of Rasterizer"
;
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef GameLogic_module_def = {
{}, /* m_base */
"GameLogic", /* m_name */
@@ -1031,7 +954,6 @@ static struct PyModuleDef GameLogic_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack to get gravity hook
{
@@ -1055,16 +977,9 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
}
else {
PyErr_Clear();
-
// Create the module and add the functions
-#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&GameLogic_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), GameLogic_module_def.m_name, m);
-#else
- m = Py_InitModule4("GameLogic", game_methods,
- GameLogic_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
-#endif
}
// Add some symbolic constants to the module
@@ -1075,7 +990,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
- ErrorObject = PyString_FromString("GameLogic.error");
+ ErrorObject = PyUnicode_FromString("GameLogic.error");
PyDict_SetItemString(d, "error", ErrorObject);
Py_DECREF(ErrorObject);
@@ -1305,6 +1220,53 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, KX_PARENT_SET, KX_ParentActuator::KX_PARENT_SET);
KX_MACRO_addTypesToDict(d, KX_PARENT_REMOVE, KX_ParentActuator::KX_PARENT_REMOVE);
+ /* BL_ArmatureConstraint type */
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_TRACKTO);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_KINEMATIC);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_ROTLIKE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_LOCLIKE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_MINMAX);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_SIZELIKE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_LOCKTRACK);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_STRETCHTO);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_CLAMPTO);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_TRANSFORM);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_TYPE_DISTLIMIT, CONSTRAINT_TYPE_DISTLIMIT);
+ /* BL_ArmatureConstraint ik_type */
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_COPYPOSE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_DISTANCE, CONSTRAINT_IK_DISTANCE);
+ /* BL_ArmatureConstraint ik_mode */
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_INSIDE, LIMITDIST_INSIDE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_OUTSIDE, LIMITDIST_OUTSIDE);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_MODE_ONSURFACE, LIMITDIST_ONSURFACE);
+ /* BL_ArmatureConstraint ik_flag */
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_TIP, CONSTRAINT_IK_TIP);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_ROT);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_STRETCH);
+ KX_MACRO_addTypesToDict(d, CONSTRAINT_IK_FLAG_POS, CONSTRAINT_IK_POS);
+ /* KX_ArmatureSensor type */
+ KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_STATE_CHANGED, SENS_ARM_STATE_CHANGED);
+ KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_BELOW, SENS_ARM_LIN_ERROR_BELOW);
+ KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_LIN_ERROR_ABOVE, SENS_ARM_LIN_ERROR_ABOVE);
+ KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_BELOW, SENS_ARM_ROT_ERROR_BELOW);
+ KX_MACRO_addTypesToDict(d, KX_ARMSENSOR_ROT_ERROR_ABOVE, SENS_ARM_ROT_ERROR_ABOVE);
+
+ /* BL_ArmatureActuator type */
+ KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_RUN, ACT_ARM_RUN);
+ KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_ENABLE, ACT_ARM_ENABLE);
+ KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_DISABLE, ACT_ARM_DISABLE);
+ KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETTARGET, ACT_ARM_SETTARGET);
+ KX_MACRO_addTypesToDict(d, KX_ACT_ARMATURE_SETWEIGHT, ACT_ARM_SETWEIGHT);
+
+ /* BL_Armature Channel rotation_mode */
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_QUAT, PCHAN_ROT_QUAT);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_XYZ, PCHAN_ROT_XYZ);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_XZY, PCHAN_ROT_XZY);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_YXZ, PCHAN_ROT_YXZ);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_YZX, PCHAN_ROT_YZX);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_ZXY, PCHAN_ROT_ZXY);
+ KX_MACRO_addTypesToDict(d, PCHAN_ROT_ZYX, PCHAN_ROT_ZYX);
+
// Check for errors
if (PyErr_Occurred())
{
@@ -1346,23 +1308,16 @@ PyObject *KXpy_import(PyObject *self, PyObject *args)
PyObject *locals = NULL;
PyObject *fromlist = NULL;
PyObject *l, *m, *n;
-
-#if (PY_VERSION_HEX >= 0x02060000)
- int dummy_val; /* what does this do?*/
+ int level; /* not used yet */
if (!PyArg_ParseTuple(args, "s|OOOi:m_import",
- &name, &globals, &locals, &fromlist, &dummy_val))
- return NULL;
-#else
- if (!PyArg_ParseTuple(args, "s|OOO:m_import",
- &name, &globals, &locals, &fromlist))
+ &name, &globals, &locals, &fromlist, &level))
return NULL;
-#endif
/* check for builtin modules */
m = PyImport_AddModule("sys");
l = PyObject_GetAttrString(m, "builtin_module_names");
- n = PyString_FromString(name);
+ n = PyUnicode_FromString(name);
if (PySequence_Contains(l, n)) {
return PyImport_ImportModuleEx(name, globals, locals, fromlist);
@@ -1538,7 +1493,7 @@ static void initPySysObjects__append(PyObject *sys_path, char *filename)
BLI_split_dirfile_basic(filename, expanded, NULL); /* get the dir part of filename only */
BLI_convertstringcode(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= PyString_FromString(expanded);
+ item= PyUnicode_FromString(expanded);
// printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
@@ -1614,7 +1569,7 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
*/
static bool first_time = true;
-#if (PY_VERSION_HEX < 0x03000000)
+#if 0 // TODO - py3
STR_String pname = progname;
Py_SetProgramName(pname.Ptr());
#endif
@@ -1622,11 +1577,18 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
Py_FrozenFlag=1;
Py_Initialize();
-#if (PY_VERSION_HEX < 0x03000000)
- if(argv && first_time) /* browser plugins dont currently set this */
- PySys_SetArgv(argc, argv);
-#endif
- //importBlenderModules()
+ if(argv && first_time) { /* browser plugins dont currently set this */
+ // Until python support ascii again, we use our own.
+ // PySys_SetArgv(argc, argv);
+ int i;
+ PyObject *py_argv= PyList_New(argc);
+
+ for (i=0; i<argc; i++)
+ PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
+
+ PySys_SetObject("argv", py_argv);
+ Py_DECREF(py_argv);
+ }
setSandbox(level);
initPyTypes();
@@ -1660,7 +1622,7 @@ void exitGamePlayerPythonScripting()
*/
PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie)
{
-#if (PY_VERSION_HEX < 0x03000000)
+#if 0 // XXX TODO Py3
STR_String pname = progname;
Py_SetProgramName(pname.Ptr());
#endif
@@ -1688,7 +1650,6 @@ void exitGamePythonScripting()
}
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef Rasterizer_module_def = {
{}, /* m_base */
"Rasterizer", /* m_name */
@@ -1700,7 +1661,6 @@ static struct PyModuleDef Rasterizer_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
{
@@ -1723,19 +1683,13 @@ PyObject* initRasterizer(RAS_IRasterizer* rasty,RAS_ICanvas* canvas)
PyErr_Clear();
// Create the module and add the functions
-#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&Rasterizer_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), Rasterizer_module_def.m_name, m);
-#else
- m = Py_InitModule4("Rasterizer", rasterizer_methods,
- Rasterizer_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
-#endif
}
// Add some symbolic constants to the module
d = PyModule_GetDict(m);
- ErrorObject = PyString_FromString("Rasterizer.error");
+ ErrorObject = PyUnicode_FromString("Rasterizer.error");
PyDict_SetItemString(d, "error", ErrorObject);
Py_DECREF(ErrorObject);
@@ -1781,12 +1735,7 @@ static PyObject* gPyEventToString(PyObject*, PyObject* value)
dict = PyModule_GetDict(mod);
while (PyDict_Next(dict, &pos, &key, &val)) {
-#if (PY_VERSION_HEX >= 0x03000000)
if (PyObject_RichCompareBool(value, val, Py_EQ)) {
-#else
- if (PyObject_Compare(value, val)==0) {
-#endif
-
ret = key;
break;
}
@@ -1813,22 +1762,20 @@ static PyObject* gPyEventToCharacter(PyObject*, PyObject* args)
if(IsPrintable(event)) {
char ch[2] = {'\0', '\0'};
ch[0] = ToCharacter(event, (bool)shift);
- return PyString_FromString(ch);
+ return PyUnicode_FromString(ch);
}
else {
- return PyString_FromString("");
+ return PyUnicode_FromString("");
}
}
static struct PyMethodDef gamekeys_methods[] = {
- {"EventToCharacter", (PyCFunction)gPyEventToCharacter, METH_VARARGS, (PY_METHODCHAR)gPyEventToCharacter_doc},
- {"EventToString", (PyCFunction)gPyEventToString, METH_O, (PY_METHODCHAR)gPyEventToString_doc},
+ {"EventToCharacter", (PyCFunction)gPyEventToCharacter, METH_VARARGS, (const char *)gPyEventToCharacter_doc},
+ {"EventToString", (PyCFunction)gPyEventToString, METH_O, (const char *)gPyEventToString_doc},
{ NULL, (PyCFunction) NULL, 0, NULL }
};
-
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef GameKeys_module_def = {
{}, /* m_base */
"GameKeys", /* m_name */
@@ -1840,7 +1787,6 @@ static struct PyModuleDef GameKeys_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
PyObject* initGameKeys()
{
@@ -1858,14 +1804,8 @@ PyObject* initGameKeys()
PyErr_Clear();
// Create the module and add the functions
-#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&GameKeys_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), GameKeys_module_def.m_name, m);
-#else
- m = Py_InitModule4("GameKeys", gamekeys_methods,
- GameKeys_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
-#endif
}
// Add some symbolic constants to the module
@@ -1997,17 +1937,17 @@ PyObject* initGameKeys()
PyObject* initMathutils()
{
- return Mathutils_Init("Mathutils"); // Use as a top level module in BGE
+ return Mathutils_Init();
}
PyObject* initGeometry()
{
- return Geometry_Init("Geometry"); // Use as a top level module in BGE
+ return Geometry_Init();
}
PyObject* initBGL()
{
- return BGL_Init("BGL"); // Use as a top level module in BGE
+ return BGL_Init();
}
void KX_SetActiveScene(class KX_Scene* scene)
@@ -2043,13 +1983,8 @@ int saveGamePythonConfig( char **marshal_buffer)
// PyObject_Print(pyGlobalDictMarshal, stderr, 0);
char *marshal_cstring;
-#if PY_VERSION_HEX < 0x03000000
- marshal_cstring = PyString_AsString(pyGlobalDictMarshal);
- marshal_length= PyString_Size(pyGlobalDictMarshal);
-#else // py3 uses byte arrays
- marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal);
+ marshal_cstring = PyBytes_AsString(pyGlobalDictMarshal); // py3 uses byte arrays
marshal_length= PyBytes_Size(pyGlobalDictMarshal);
-#endif
*marshal_buffer = new char[marshal_length + 1];
memcpy(*marshal_buffer, marshal_cstring, marshal_length);
Py_DECREF(pyGlobalDictMarshal);
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index d5d0fe3123c..c2c33918172 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -35,8 +35,11 @@
/* Only for Class::Parents */
#include "BL_BlenderShader.h"
#include "BL_ShapeActionActuator.h"
+#include "BL_ArmatureActuator.h"
+#include "BL_ArmatureConstraint.h"
+#include "BL_ArmatureObject.h"
+#include "BL_ArmatureChannel.h"
#include "KX_BlenderMaterial.h"
-#include "KX_CDActuator.h"
#include "KX_CameraActuator.h"
#include "KX_ConstraintActuator.h"
#include "KX_ConstraintWrapper.h"
@@ -87,69 +90,69 @@
#include "SCA_RandomActuator.h"
#include "SCA_IController.h"
-
-void initPyObjectPlusType(PyTypeObject **parents)
+static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
{
- int i;
-
- for (i=0; parents[i]; i++) {
- if(PyType_Ready(parents[i]) < 0) {
- /* This is very very unlikely */
- printf("Error, pytype could not initialize, Blender may crash \"%s\"\n", parents[i]->tp_name);
- return;
- }
+ attr_getset->name= (char *)attr->m_name;
+ attr_getset->doc= NULL;
-#if 0
- PyObject_Print(reinterpret_cast<PyObject *>parents[i], stderr, 0);
- fprintf(stderr, "\n");
- PyObject_Print(parents[i]->tp_dict, stderr, 0);
- fprintf(stderr, "\n\n");
-#endif
-
- }
+ attr_getset->get= reinterpret_cast<getter>(PyObjectPlus::py_get_attrdef);
- PyObject *dict= NULL;
+ if(attr->m_access==KX_PYATTRIBUTE_RO)
+ attr_getset->set= NULL;
+ else
+ attr_getset->set= reinterpret_cast<setter>(PyObjectPlus::py_set_attrdef);
- while(i) {
- i--;
-
- if (dict) {
- PyDict_Update(parents[i]->tp_dict, dict);
- }
- dict= parents[i]->tp_dict;
-
-#if 1
- PyObject_Print(reinterpret_cast<PyObject *>(parents[i]), stderr, 0);
- fprintf(stderr, "\n");
- PyObject_Print(parents[i]->tp_dict, stderr, 0);
- fprintf(stderr, "\n\n");
-#endif
-
- }
+ attr_getset->closure= reinterpret_cast<void *>(attr);
}
-
-
-
-static void PyType_Ready_ADD(PyObject *dict, PyTypeObject *tp, PyAttributeDef *attributes)
+static void PyType_Ready_ADD(PyObject *dict, PyTypeObject *tp, PyAttributeDef *attributes, PyAttributeDef *attributesPtr, int init_getset)
{
PyAttributeDef *attr;
- PyObject *item;
-
- PyType_Ready(tp);
- PyDict_SetItemString(dict, tp->tp_name, reinterpret_cast<PyObject *>(tp));
-
- /* store attr defs in the tp_dict for to avoid string lookups */
- for(attr= attributes; attr->m_name; attr++) {
- item= PyCObject_FromVoidPtr(attr, NULL);
- PyDict_SetItemString(tp->tp_dict, attr->m_name, item);
- Py_DECREF(item);
+
+ if(init_getset) {
+ /* we need to do this for all types before calling PyType_Ready
+ * since they will call the parents PyType_Ready and those might not have initialized vars yet */
+
+ //if(tp->tp_base==NULL)
+ // printf("Debug: No Parents - '%s'\n" , tp->tp_name);
+
+ if(tp->tp_getset==NULL && ((attributes && attributes->m_name) || (attributesPtr && attributesPtr->m_name))) {
+ PyGetSetDef *attr_getset;
+ int attr_tot= 0;
+
+ if (attributes) {
+ for(attr= attributes; attr->m_name; attr++, attr_tot++)
+ attr->m_usePtr = false;
+ }
+ if (attributesPtr) {
+ for(attr= attributesPtr; attr->m_name; attr++, attr_tot++)
+ attr->m_usePtr = true;
+ }
+
+ tp->tp_getset = attr_getset = reinterpret_cast<PyGetSetDef *>(PyMem_Malloc((attr_tot+1) * sizeof(PyGetSetDef))); // XXX - Todo, free
+
+ if (attributes) {
+ for(attr= attributes; attr->m_name; attr++, attr_getset++) {
+ PyType_Attr_Set(attr_getset, attr);
+ }
+ }
+ if (attributesPtr) {
+ for(attr= attributesPtr; attr->m_name; attr++, attr_getset++) {
+ PyType_Attr_Set(attr_getset, attr);
+ }
+ }
+ memset(attr_getset, 0, sizeof(PyGetSetDef));
+ }
+ } else {
+ PyType_Ready(tp);
+ PyDict_SetItemString(dict, tp->tp_name, reinterpret_cast<PyObject *>(tp));
}
}
-#define PyType_Ready_Attr(d, n) PyType_Ready_ADD(d, &n::Type, n::Attributes)
+#define PyType_Ready_Attr(d, n, i) PyType_Ready_ADD(d, &n::Type, n::Attributes, NULL, i)
+#define PyType_Ready_AttrPtr(d, n, i) PyType_Ready_ADD(d, &n::Type, n::Attributes, n::AttributesPtr, i)
void initPyTypes(void)
{
@@ -165,70 +168,78 @@ void initPyTypes(void)
PyDict_SetItemString(PySys_GetObject((char *)"modules"), (char *)"GameTypes", mod);
Py_DECREF(mod);
- PyType_Ready_Attr(dict, BL_ActionActuator);
- PyType_Ready_Attr(dict, BL_Shader);
- PyType_Ready_Attr(dict, BL_ShapeActionActuator);
- PyType_Ready_Attr(dict, CListValue);
- PyType_Ready_Attr(dict, CValue);
- PyType_Ready_Attr(dict, KX_BlenderMaterial);
- PyType_Ready_Attr(dict, KX_CDActuator);
- PyType_Ready_Attr(dict, KX_Camera);
- PyType_Ready_Attr(dict, KX_CameraActuator);
- PyType_Ready_Attr(dict, KX_ConstraintActuator);
- PyType_Ready_Attr(dict, KX_ConstraintWrapper);
- PyType_Ready_Attr(dict, KX_GameActuator);
- PyType_Ready_Attr(dict, KX_GameObject);
- PyType_Ready_Attr(dict, KX_IpoActuator);
- PyType_Ready_Attr(dict, KX_LightObject);
- PyType_Ready_Attr(dict, KX_MeshProxy);
- PyType_Ready_Attr(dict, KX_MouseFocusSensor);
- PyType_Ready_Attr(dict, KX_NearSensor);
- PyType_Ready_Attr(dict, KX_NetworkMessageActuator);
- PyType_Ready_Attr(dict, KX_NetworkMessageSensor);
- PyType_Ready_Attr(dict, KX_ObjectActuator);
- PyType_Ready_Attr(dict, KX_ParentActuator);
- PyType_Ready_Attr(dict, KX_PhysicsObjectWrapper);
- PyType_Ready_Attr(dict, KX_PolyProxy);
- PyType_Ready_Attr(dict, KX_PolygonMaterial);
- PyType_Ready_Attr(dict, KX_RadarSensor);
- PyType_Ready_Attr(dict, KX_RaySensor);
- PyType_Ready_Attr(dict, KX_SCA_AddObjectActuator);
- PyType_Ready_Attr(dict, KX_SCA_DynamicActuator);
- PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator);
- PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator);
- PyType_Ready_Attr(dict, KX_Scene);
- PyType_Ready_Attr(dict, KX_SceneActuator);
- PyType_Ready_Attr(dict, KX_SoundActuator);
- PyType_Ready_Attr(dict, KX_StateActuator);
- PyType_Ready_Attr(dict, KX_TouchSensor);
- PyType_Ready_Attr(dict, KX_TrackToActuator);
- PyType_Ready_Attr(dict, KX_VehicleWrapper);
- PyType_Ready_Attr(dict, KX_VertexProxy);
- PyType_Ready_Attr(dict, KX_VisibilityActuator);
- PyType_Ready_Attr(dict, PyObjectPlus);
- PyType_Ready_Attr(dict, SCA_2DFilterActuator);
- PyType_Ready_Attr(dict, SCA_ANDController);
- PyType_Ready_Attr(dict, SCA_ActuatorSensor);
- PyType_Ready_Attr(dict, SCA_AlwaysSensor);
- PyType_Ready_Attr(dict, SCA_DelaySensor);
- PyType_Ready_Attr(dict, SCA_ILogicBrick);
- PyType_Ready_Attr(dict, SCA_IObject);
- PyType_Ready_Attr(dict, SCA_ISensor);
- PyType_Ready_Attr(dict, SCA_JoystickSensor);
- PyType_Ready_Attr(dict, SCA_KeyboardSensor);
- PyType_Ready_Attr(dict, SCA_MouseSensor);
- PyType_Ready_Attr(dict, SCA_NANDController);
- PyType_Ready_Attr(dict, SCA_NORController);
- PyType_Ready_Attr(dict, SCA_ORController);
- PyType_Ready_Attr(dict, SCA_PropertyActuator);
- PyType_Ready_Attr(dict, SCA_PropertySensor);
- PyType_Ready_Attr(dict, SCA_PythonController);
- PyType_Ready_Attr(dict, SCA_RandomActuator);
- PyType_Ready_Attr(dict, SCA_RandomSensor);
- PyType_Ready_Attr(dict, SCA_XNORController);
- PyType_Ready_Attr(dict, SCA_XORController);
- PyType_Ready_Attr(dict, SCA_IController);
+ for(int init_getset= 1; init_getset > -1; init_getset--) { /* run twice, once to init the getsets another to run PyType_Ready */
+ PyType_Ready_Attr(dict, BL_ActionActuator, init_getset);
+ PyType_Ready_Attr(dict, BL_Shader, init_getset);
+ PyType_Ready_Attr(dict, BL_ShapeActionActuator, init_getset);
+ PyType_Ready_Attr(dict, BL_ArmatureObject, init_getset);
+ PyType_Ready_Attr(dict, BL_ArmatureActuator, init_getset);
+ PyType_Ready_Attr(dict, BL_ArmatureConstraint, init_getset);
+ PyType_Ready_AttrPtr(dict, BL_ArmatureBone, init_getset);
+ PyType_Ready_AttrPtr(dict, BL_ArmatureChannel, init_getset);
+ PyType_Ready_Attr(dict, CListValue, init_getset);
+ PyType_Ready_Attr(dict, CValue, init_getset);
+ PyType_Ready_Attr(dict, KX_BlenderMaterial, init_getset);
+ PyType_Ready_Attr(dict, KX_Camera, init_getset);
+ PyType_Ready_Attr(dict, KX_CameraActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_ConstraintActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_ConstraintWrapper, init_getset);
+ PyType_Ready_Attr(dict, KX_GameActuator, init_getset);
+ 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_MeshProxy, init_getset);
+ PyType_Ready_Attr(dict, KX_MouseFocusSensor, init_getset);
+ PyType_Ready_Attr(dict, KX_NearSensor, init_getset);
+ PyType_Ready_Attr(dict, KX_NetworkMessageActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_NetworkMessageSensor, init_getset);
+ PyType_Ready_Attr(dict, KX_ObjectActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_ParentActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_PhysicsObjectWrapper, init_getset);
+ PyType_Ready_Attr(dict, KX_PolyProxy, init_getset);
+ PyType_Ready_Attr(dict, KX_PolygonMaterial, init_getset);
+ PyType_Ready_Attr(dict, KX_RadarSensor, init_getset);
+ PyType_Ready_Attr(dict, KX_RaySensor, init_getset);
+ PyType_Ready_Attr(dict, KX_SCA_AddObjectActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SCA_DynamicActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_Scene, init_getset);
+ PyType_Ready_Attr(dict, KX_SceneActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SoundActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_StateActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_TouchSensor, init_getset);
+ PyType_Ready_Attr(dict, KX_TrackToActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_VehicleWrapper, init_getset);
+ PyType_Ready_Attr(dict, KX_VertexProxy, init_getset);
+ PyType_Ready_Attr(dict, KX_VisibilityActuator, init_getset);
+ PyType_Ready_Attr(dict, PyObjectPlus, init_getset);
+ PyType_Ready_Attr(dict, SCA_2DFilterActuator, init_getset);
+ PyType_Ready_Attr(dict, SCA_ANDController, init_getset);
+ PyType_Ready_Attr(dict, SCA_ActuatorSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_AlwaysSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_DelaySensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_ILogicBrick, init_getset);
+ PyType_Ready_Attr(dict, SCA_IObject, init_getset);
+ PyType_Ready_Attr(dict, SCA_ISensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_JoystickSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_KeyboardSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_MouseSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_NANDController, init_getset);
+ PyType_Ready_Attr(dict, SCA_NORController, init_getset);
+ PyType_Ready_Attr(dict, SCA_ORController, init_getset);
+ PyType_Ready_Attr(dict, SCA_PropertyActuator, init_getset);
+ PyType_Ready_Attr(dict, SCA_PropertySensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_PythonController, init_getset);
+ PyType_Ready_Attr(dict, SCA_RandomActuator, init_getset);
+ PyType_Ready_Attr(dict, SCA_RandomSensor, init_getset);
+ PyType_Ready_Attr(dict, SCA_XNORController, init_getset);
+ PyType_Ready_Attr(dict, SCA_XORController, init_getset);
+ PyType_Ready_Attr(dict, SCA_IController, init_getset);
+ }
+
+
/* Normal python type */
PyType_Ready(&KX_PythonSeq_Type);
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
index 524d957a80c..f7ad7acb252 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -31,6 +31,7 @@
#include "KX_PythonSeq.h"
#include "KX_GameObject.h"
+#include "BL_ArmatureObject.h"
#include "SCA_ISensor.h"
#include "SCA_IController.h"
#include "SCA_IActuator.h"
@@ -72,6 +73,10 @@ static Py_ssize_t KX_PythonSeq_len( PyObject * self )
return ((KX_GameObject *)self_plus)->GetControllers().size();
case KX_PYGENSEQ_OB_TYPE_ACTUATORS:
return ((KX_GameObject *)self_plus)->GetActuators().size();
+ case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
+ return ((BL_ArmatureObject *)self_plus)->GetConstraintNumber();
+ case KX_PYGENSEQ_OB_TYPE_CHANNELS:
+ return ((BL_ArmatureObject *)self_plus)->GetChannelNumber();
default:
/* Should never happen */
PyErr_SetString(PyExc_SystemError, "invalid type, internal error");
@@ -139,6 +144,29 @@ static PyObject *KX_PythonSeq_getIndex(PyObject* self, int index)
}
return linkedactuators[index]->GetProxy();
}
+ case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
+ {
+ int nb_constraint = ((BL_ArmatureObject *)self_plus)->GetConstraintNumber();
+ if(index<0)
+ index += nb_constraint;
+ if(index<0 || index>= nb_constraint) {
+ PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
+ return NULL;
+ }
+ return ((BL_ArmatureObject *)self_plus)->GetConstraint(index)->GetProxy();
+ }
+ case KX_PYGENSEQ_OB_TYPE_CHANNELS:
+ {
+ int nb_channel = ((BL_ArmatureObject *)self_plus)->GetChannelNumber();
+ if(index<0)
+ index += nb_channel;
+ if(index<0 || index>= nb_channel) {
+ PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
+ return NULL;
+ }
+ return ((BL_ArmatureObject *)self_plus)->GetChannel(index)->GetProxy();
+ }
+
}
PyErr_SetString(PyExc_SystemError, "invalid sequence type, this is a bug");
@@ -206,6 +234,14 @@ static PyObjectPlus * KX_PythonSeq_subscript__internal(PyObject *self, char *key
}
break;
}
+ case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
+ {
+ return ((BL_ArmatureObject*)self_plus)->GetConstraint(key);
+ }
+ case KX_PYGENSEQ_OB_TYPE_CHANNELS:
+ {
+ return ((BL_ArmatureObject*)self_plus)->GetChannel(key);
+ }
}
return NULL;
@@ -221,11 +257,11 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
return NULL;
}
- if (PyInt_Check(key)) {
- return KX_PythonSeq_getIndex(self, PyInt_AS_LONG( key ));
+ if (PyLong_Check(key)) {
+ return KX_PythonSeq_getIndex(self, PyLong_AsSsize_t( key ));
}
- else if ( PyString_Check(key) ) {
- char *name = PyString_AsString(key);
+ else if ( PyUnicode_Check(key) ) {
+ char *name = _PyUnicode_AsString(key);
PyObjectPlus *ret = KX_PythonSeq_subscript__internal(self, name);
if(ret) {
@@ -250,12 +286,12 @@ static int KX_PythonSeq_contains(PyObject *self, PyObject *key)
PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: "BGE_PROXY_ERROR_MSG);
return -1;
}
- if(!PyString_Check(key)) {
+ if(!PyUnicode_Check(key)) {
PyErr_SetString(PyExc_SystemError, "key in seq, KX_PythonSeq: key must be a string");
return -1;
}
- if(KX_PythonSeq_subscript__internal(self, PyString_AsString(key)))
+ if(KX_PythonSeq_subscript__internal(self, _PyUnicode_AsString(key)))
return 1;
return 0;
@@ -340,11 +376,42 @@ static PyObject *KX_PythonSeq_nextIter(KX_PythonSeq *self)
}
-static int KX_PythonSeq_compare( KX_PythonSeq * a, KX_PythonSeq * b ) /* TODO - python3.x wants richcmp */
+static int KX_PythonSeq_compare( KX_PythonSeq * a, KX_PythonSeq * b )
{
return ( a->type == b->type && a->base == b->base) ? 0 : -1;
}
+static PyObject *KX_PythonSeq_richcmp(PyObject *a, PyObject *b, int op)
+{
+ PyObject *res;
+ int ok= -1; /* zero is true */
+
+ if(BPy_KX_PythonSeq_Check(a) && BPy_KX_PythonSeq_Check(b))
+ ok= KX_PythonSeq_compare((KX_PythonSeq *)a, (KX_PythonSeq *)b);
+
+ 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;
+ }
+
+ Py_INCREF(res);
+ return res;
+}
+
+
/*
* repr function
* convert to a list and get its string value
@@ -362,13 +429,7 @@ static PyObject *KX_PythonSeq_repr( KX_PythonSeq * self )
/* Python KX_PythonSeq_Type structure definition: */
/*****************************************************************************/
PyTypeObject KX_PythonSeq_Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
/* For printing, in format "<module>.<name>" */
"KX_PythonSeq", /* char *tp_name; */
sizeof( KX_PythonSeq ), /* int tp_basicsize; */
@@ -380,11 +441,7 @@ PyTypeObject KX_PythonSeq_Type = {
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
-#if PY_VERSION_HEX >= 0x03000000 // TODO - richcmp
- NULL,
-#else
- ( cmpfunc ) KX_PythonSeq_compare, /* cmpfunc tp_compare; */
-#endif
+ NULL, /* cmpfunc tp_compare; */
( reprfunc ) KX_PythonSeq_repr, /* reprfunc tp_repr; */
/* Method suites for standard classes */
@@ -410,14 +467,14 @@ PyTypeObject KX_PythonSeq_Type = {
NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
- NULL, /* traverseproc tp_traverse; */
+ NULL, /* traverseproc tp_traverse; */
/* delete references to contained objects */
NULL, /* inquiry tp_clear; */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
- NULL, /* richcmpfunc tp_richcompare; */
+ (richcmpfunc)KX_PythonSeq_richcmp, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
0, /* long tp_weaklistoffset; */
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h
index 15a016224a9..34243aa9b9c 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.h
+++ b/source/gameengine/Ketsji/KX_PythonSeq.h
@@ -39,7 +39,9 @@ enum KX_PYGENSEQ_TYPE {
KX_PYGENSEQ_CONT_TYPE_ACTUATORS,
KX_PYGENSEQ_OB_TYPE_SENSORS,
KX_PYGENSEQ_OB_TYPE_CONTROLLERS,
- KX_PYGENSEQ_OB_TYPE_ACTUATORS
+ KX_PYGENSEQ_OB_TYPE_ACTUATORS,
+ KX_PYGENSEQ_OB_TYPE_CONSTRAINTS,
+ KX_PYGENSEQ_OB_TYPE_CHANNELS,
};
/* The Main PyType Object defined in Main.c */
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp
index 064dc9126ac..eb127be8044 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.cpp
+++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp
@@ -48,9 +48,7 @@ KX_RadarSensor::KX_RadarSensor(SCA_EventManager* eventmgr,
double margin,
double resetmargin,
bool bFindMaterial,
- const STR_String& touchedpropname,
- class KX_Scene* kxscene,
- PyTypeObject* T)
+ const STR_String& touchedpropname)
: KX_NearSensor(
eventmgr,
@@ -60,9 +58,8 @@ KX_RadarSensor::KX_RadarSensor(SCA_EventManager* eventmgr,
resetmargin,
bFindMaterial,
touchedpropname,
- kxscene,
- physCtrl,
- T),
+ physCtrl),
+
m_coneradius(coneradius),
m_coneheight(coneheight),
m_axis(axis)
@@ -179,63 +176,13 @@ void KX_RadarSensor::SynchronizeTransform()
/* Python Functions */
/* ------------------------------------------------------------------------- */
-//Deprecated ----->
-/* getConeOrigin */
-const char KX_RadarSensor::GetConeOrigin_doc[] =
-"getConeOrigin()\n"
-"\tReturns the origin of the cone with which to test. The origin\n"
-"\tis in the middle of the cone.";
-PyObject* KX_RadarSensor::PyGetConeOrigin() {
- ShowDeprecationWarning("getConeOrigin()", "the coneOrigin property");
-
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_cone_origin[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_cone_origin[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_cone_origin[2]));
-
- return retVal;
-}
-
-/* getConeOrigin */
-const char KX_RadarSensor::GetConeTarget_doc[] =
-"getConeTarget()\n"
-"\tReturns the center of the bottom face of the cone with which to test.\n";
-PyObject* KX_RadarSensor::PyGetConeTarget() {
- ShowDeprecationWarning("getConeTarget()", "the coneTarget property");
-
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_cone_target[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_cone_target[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_cone_target[2]));
-
- return retVal;
-}
-
-/* getConeHeight */
-const char KX_RadarSensor::GetConeHeight_doc[] =
-"getConeHeight()\n"
-"\tReturns the height of the cone with which to test.\n";
-PyObject* KX_RadarSensor::PyGetConeHeight() {
-
- ShowDeprecationWarning("getConeHeight()", "the distance property");
-
- return PyFloat_FromDouble(m_coneheight);
-}
-//<----- Deprecated
+/* none */
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
/* ------------------------------------------------------------------------- */
PyTypeObject KX_RadarSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_RadarSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -245,32 +192,18 @@ PyTypeObject KX_RadarSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_RadarSensor::Parents[] = {
- &KX_RadarSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&KX_NearSensor::Type,
- &KX_TouchSensor::Type,
- &SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_RadarSensor::Methods[] = {
- //Deprecated ----->
- {"getConeOrigin", (PyCFunction) KX_RadarSensor::sPyGetConeOrigin,
- METH_VARARGS, (PY_METHODCHAR)GetConeOrigin_doc},
- {"getConeTarget", (PyCFunction) KX_RadarSensor::sPyGetConeTarget,
- METH_VARARGS, (PY_METHODCHAR)GetConeTarget_doc},
- {"getConeHeight", (PyCFunction) KX_RadarSensor::sPyGetConeHeight,
- METH_VARARGS, (PY_METHODCHAR)GetConeHeight_doc},
- //<-----
{NULL} //Sentinel
};
@@ -283,16 +216,3 @@ PyAttributeDef KX_RadarSensor::Attributes[] = {
{NULL} //Sentinel
};
-PyObject* KX_RadarSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(KX_NearSensor);
-}
-
-PyObject* KX_RadarSensor::py_getattro_dict() {
- py_getattro_dict_up(KX_NearSensor);
-}
-
-int KX_RadarSensor::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(KX_NearSensor);
-}
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.h b/source/gameengine/Ketsji/KX_RadarSensor.h
index 2e5a0e68bed..487e9f1aaa7 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.h
+++ b/source/gameengine/Ketsji/KX_RadarSensor.h
@@ -69,9 +69,7 @@ public:
double margin,
double resetmargin,
bool bFindMaterial,
- const STR_String& touchedpropname,
- class KX_Scene* kxscene,
- PyTypeObject* T = &Type);
+ const STR_String& touchedpropname);
KX_RadarSensor();
virtual ~KX_RadarSensor();
virtual void SynchronizeTransform();
@@ -89,16 +87,9 @@ public:
KX_RADAR_AXIS_NEG_Z
};
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
+ /* python */
virtual sensortype GetSensorType() { return ST_RADAR; }
- //Deprecated ----->
- KX_PYMETHOD_DOC_NOARGS(KX_RadarSensor,GetConeOrigin);
- KX_PYMETHOD_DOC_NOARGS(KX_RadarSensor,GetConeTarget);
- KX_PYMETHOD_DOC_NOARGS(KX_RadarSensor,GetConeHeight);
- //<-----
};
#endif //__KX_RADAR_SENSOR_H
diff --git a/source/gameengine/Ketsji/KX_RayCast.h b/source/gameengine/Ketsji/KX_RayCast.h
index c3084c997a1..cdafc894f6c 100644
--- a/source/gameengine/Ketsji/KX_RayCast.h
+++ b/source/gameengine/Ketsji/KX_RayCast.h
@@ -89,6 +89,12 @@ public:
const MT_Point3& topoint,
KX_RayCast& callback);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
template<class T> class KX_RayCast::Callback : public KX_RayCast
@@ -121,7 +127,13 @@ public:
}
return self->NeedRayCast(info);
}
-
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast::Callback"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
diff --git a/source/gameengine/Ketsji/KX_RayEventManager.h b/source/gameengine/Ketsji/KX_RayEventManager.h
index b816d4d5250..27c9be14d1f 100644
--- a/source/gameengine/Ketsji/KX_RayEventManager.h
+++ b/source/gameengine/Ketsji/KX_RayEventManager.h
@@ -45,6 +45,13 @@ public:
m_logicmgr(logicmgr)
{}
virtual void NextFrame();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_RAYEVENTMGR
diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp
index 78a61e9d95e..1f36945ccaa 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.cpp
+++ b/source/gameengine/Ketsji/KX_RaySensor.cpp
@@ -55,9 +55,8 @@ KX_RaySensor::KX_RaySensor(class SCA_EventManager* eventmgr,
bool bXRay,
double distance,
int axis,
- KX_Scene* ketsjiScene,
- PyTypeObject* T)
- : SCA_ISensor(gameobj,eventmgr, T),
+ KX_Scene* ketsjiScene)
+ : SCA_ISensor(gameobj,eventmgr),
m_propertyname(propname),
m_bFindMaterial(bFindMaterial),
m_bXRay(bXRay),
@@ -320,13 +319,7 @@ bool KX_RaySensor::Evaluate()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_RaySensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_RaySensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -336,29 +329,19 @@ PyTypeObject KX_RaySensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-
-};
-
-PyParentObject KX_RaySensor::Parents[] = {
- &KX_RaySensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
+
};
PyMethodDef KX_RaySensor::Methods[] = {
- // Deprecated ----->
- {"getHitObject",(PyCFunction) KX_RaySensor::sPyGetHitObject,METH_NOARGS, (PY_METHODCHAR)GetHitObject_doc},
- {"getHitPosition",(PyCFunction) KX_RaySensor::sPyGetHitPosition,METH_NOARGS, (PY_METHODCHAR)GetHitPosition_doc},
- {"getHitNormal",(PyCFunction) KX_RaySensor::sPyGetHitNormal,METH_NOARGS, (PY_METHODCHAR)GetHitNormal_doc},
- {"getRayDirection",(PyCFunction) KX_RaySensor::sPyGetRayDirection,METH_NOARGS, (PY_METHODCHAR)GetRayDirection_doc},
- // <-----
{NULL,NULL} //Sentinel
};
@@ -383,82 +366,3 @@ PyObject* KX_RaySensor::pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_
Py_RETURN_NONE;
}
-
-// Deprecated ----->
-const char KX_RaySensor::GetHitObject_doc[] =
-"getHitObject()\n"
-"\tReturns the name of the object that was hit by this ray.\n";
-PyObject* KX_RaySensor::PyGetHitObject()
-{
- ShowDeprecationWarning("getHitObject()", "the hitObject property");
- if (m_hitObject)
- {
- return m_hitObject->GetProxy();
- }
- Py_RETURN_NONE;
-}
-
-
-const char KX_RaySensor::GetHitPosition_doc[] =
-"getHitPosition()\n"
-"\tReturns the position (in worldcoordinates) where the object was hit by this ray.\n";
-PyObject* KX_RaySensor::PyGetHitPosition()
-{
- ShowDeprecationWarning("getHitPosition()", "the hitPosition property");
-
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_hitPosition[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_hitPosition[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_hitPosition[2]));
-
- return retVal;
-}
-
-const char KX_RaySensor::GetRayDirection_doc[] =
-"getRayDirection()\n"
-"\tReturns the direction from the ray (in worldcoordinates) .\n";
-PyObject* KX_RaySensor::PyGetRayDirection()
-{
- ShowDeprecationWarning("getRayDirection()", "the rayDirection property");
-
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_rayDirection[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_rayDirection[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_rayDirection[2]));
-
- return retVal;
-}
-
-const char KX_RaySensor::GetHitNormal_doc[] =
-"getHitNormal()\n"
-"\tReturns the normal (in worldcoordinates) of the object at the location where the object was hit by this ray.\n";
-PyObject* KX_RaySensor::PyGetHitNormal()
-{
- ShowDeprecationWarning("getHitNormal()", "the hitNormal property");
-
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_hitNormal[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_hitNormal[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_hitNormal[2]));
-
- return retVal;
-}
-
-
-
-PyObject* KX_RaySensor::py_getattro(PyObject *attr) {
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* KX_RaySensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int KX_RaySensor::py_setattro(PyObject *attr, PyObject *value) {
- py_setattro_up(SCA_ISensor);
-}
-
-// <----- Deprecated
diff --git a/source/gameengine/Ketsji/KX_RaySensor.h b/source/gameengine/Ketsji/KX_RaySensor.h
index 9efb046742f..d3e92a14214 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.h
+++ b/source/gameengine/Ketsji/KX_RaySensor.h
@@ -62,8 +62,7 @@ public:
bool bXRay,
double distance,
int axis,
- class KX_Scene* ketsjiScene,
- PyTypeObject* T = &Type);
+ class KX_Scene* ketsjiScene);
virtual ~KX_RaySensor();
virtual CValue* GetReplica();
@@ -84,18 +83,7 @@ public:
KX_RAY_AXIS_NEG_Y,
KX_RAY_AXIS_NEG_Z
};
-
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
- // Deprecated ----->
- KX_PYMETHOD_DOC_NOARGS(KX_RaySensor,GetHitObject);
- KX_PYMETHOD_DOC_NOARGS(KX_RaySensor,GetHitPosition);
- KX_PYMETHOD_DOC_NOARGS(KX_RaySensor,GetHitNormal);
- KX_PYMETHOD_DOC_NOARGS(KX_RaySensor,GetRayDirection);
- // <-----
/* Attributes */
static PyObject* pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
index 75435b97797..c1e74070d72 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
@@ -55,10 +55,9 @@ KX_SCA_AddObjectActuator::KX_SCA_AddObjectActuator(SCA_IObject *gameobj,
const float *linvel,
bool linv_local,
const float *angvel,
- bool angv_local,
- PyTypeObject* T)
+ bool angv_local)
:
- SCA_IActuator(gameobj, T),
+ SCA_IActuator(gameobj, KX_ACT_ADD_OBJECT),
m_OriginalObject(original),
m_scene(scene),
@@ -171,13 +170,7 @@ void KX_SCA_AddObjectActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_SCA_AddObjectActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_SCA_AddObjectActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -187,33 +180,19 @@ PyTypeObject KX_SCA_AddObjectActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_SCA_AddObjectActuator::Parents[] = {
- &KX_SCA_AddObjectActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
+
PyMethodDef KX_SCA_AddObjectActuator::Methods[] = {
- // ---> deprecated
- {"setTime", (PyCFunction) KX_SCA_AddObjectActuator::sPySetTime, METH_O, (PY_METHODCHAR)SetTime_doc},
- {"getTime", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetTime, METH_NOARGS, (PY_METHODCHAR)GetTime_doc},
- {"getLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLinearVelocity, METH_NOARGS, (PY_METHODCHAR)GetLinearVelocity_doc},
- {"setLinearVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetLinearVelocity, METH_VARARGS, (PY_METHODCHAR)SetLinearVelocity_doc},
- {"getAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetAngularVelocity, METH_NOARGS, (PY_METHODCHAR)GetAngularVelocity_doc},
- {"setAngularVelocity", (PyCFunction) KX_SCA_AddObjectActuator::sPySetAngularVelocity, METH_VARARGS, (PY_METHODCHAR)SetAngularVelocity_doc},
- {"getLastCreatedObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetLastCreatedObject, METH_NOARGS,"getLastCreatedObject() : get the object handle to the last created object\n"},
{"instantAddObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyInstantAddObject, METH_NOARGS,"instantAddObject() : immediately add object without delay\n"},
- {"setObject", (PyCFunction) KX_SCA_AddObjectActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
- {"getObject", (PyCFunction) KX_SCA_AddObjectActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
-
{NULL,NULL} //Sentinel
};
@@ -264,196 +243,6 @@ PyObject* KX_SCA_AddObjectActuator::pyattr_get_objectLastCreated(void *self, con
}
-PyObject* KX_SCA_AddObjectActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SCA_AddObjectActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_SCA_AddObjectActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-/* 1. setObject */
-const char KX_SCA_AddObjectActuator::SetObject_doc[] =
-"setObject(object)\n"
-"\t- object: KX_GameObject, string or None\n"
-"\tSets the object that will be added. There has to be an object\n"
-"\tof this name. If not, this function does nothing.\n";
-PyObject* KX_SCA_AddObjectActuator::PySetObject(PyObject* value)
-{
- KX_GameObject *gameobj;
-
- ShowDeprecationWarning("setObject()", "the object property");
-
- if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_SCA_AddObjectActuator"))
- return NULL; // ConvertPythonToGameObject sets the error
-
- if (m_OriginalObject != NULL)
- m_OriginalObject->UnregisterActuator(this);
-
- m_OriginalObject = (SCA_IObject*)gameobj;
- if (m_OriginalObject)
- m_OriginalObject->RegisterActuator(this);
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 2. setTime */
-const char KX_SCA_AddObjectActuator::SetTime_doc[] =
-"setTime(duration)\n"
-"\t- duration: integer\n"
-"\tSets the lifetime of the object that will be added, in frames. \n"
-"\tIf the duration is negative, it is set to 0.\n";
-
-
-PyObject* KX_SCA_AddObjectActuator::PySetTime(PyObject* value)
-{
- ShowDeprecationWarning("setTime()", "the time property");
- int deltatime = PyInt_AsLong(value);
- if (deltatime==-1 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "expected an int");
- return NULL;
- }
-
- m_timeProp = deltatime;
- if (m_timeProp < 0) m_timeProp = 0;
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 3. getTime */
-const char KX_SCA_AddObjectActuator::GetTime_doc[] =
-"getTime()\n"
-"\tReturns the lifetime of the object that will be added.\n";
-
-
-PyObject* KX_SCA_AddObjectActuator::PyGetTime()
-{
- ShowDeprecationWarning("getTime()", "the time property");
- return PyInt_FromLong(m_timeProp);
-}
-
-
-/* 4. getObject */
-const char KX_SCA_AddObjectActuator::GetObject_doc[] =
-"getObject(name_only = 1)\n"
-"name_only - optional arg, when true will return the KX_GameObject rather then its name\n"
-"\tReturns the name of the object that will be added.\n";
-PyObject* KX_SCA_AddObjectActuator::PyGetObject(PyObject* args)
-{
- int ret_name_only = 1;
-
- ShowDeprecationWarning("getObject()", "the object property");
-
- if (!PyArg_ParseTuple(args, "|i:getObject", &ret_name_only))
- return NULL;
-
- if (!m_OriginalObject)
- Py_RETURN_NONE;
-
- if (ret_name_only)
- return PyString_FromString(m_OriginalObject->GetName().ReadPtr());
- else
- return m_OriginalObject->GetProxy();
-}
-
-
-
-/* 5. getLinearVelocity */
-const char KX_SCA_AddObjectActuator::GetLinearVelocity_doc[] =
-"GetLinearVelocity()\n"
-"\tReturns the linear velocity that will be assigned to \n"
-"\tthe created object.\n";
-
-PyObject* KX_SCA_AddObjectActuator::PyGetLinearVelocity()
-{
- ShowDeprecationWarning("getLinearVelocity()", "the linearVelocity property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_linear_velocity[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_linear_velocity[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_linear_velocity[2]));
-
- return retVal;
-}
-
-
-
-/* 6. setLinearVelocity */
-const char KX_SCA_AddObjectActuator::SetLinearVelocity_doc[] =
-"setLinearVelocity(vx, vy, vz)\n"
-"\t- vx: float\n"
-"\t- vy: float\n"
-"\t- vz: float\n"
-"\t- local: bool\n"
-"\tAssign this velocity to the created object. \n";
-
-PyObject* KX_SCA_AddObjectActuator::PySetLinearVelocity(PyObject* args)
-{
- ShowDeprecationWarning("setLinearVelocity()", "the linearVelocity property");
-
- float vecArg[3];
- if (!PyArg_ParseTuple(args, "fff:setLinearVelocity", &vecArg[0], &vecArg[1], &vecArg[2]))
- return NULL;
-
- m_linear_velocity[0] = vecArg[0];
- m_linear_velocity[1] = vecArg[1];
- m_linear_velocity[2] = vecArg[2];
- Py_RETURN_NONE;
-}
-
-/* 7. getAngularVelocity */
-const char KX_SCA_AddObjectActuator::GetAngularVelocity_doc[] =
-"GetAngularVelocity()\n"
-"\tReturns the angular velocity that will be assigned to \n"
-"\tthe created object.\n";
-
-PyObject* KX_SCA_AddObjectActuator::PyGetAngularVelocity()
-{
- ShowDeprecationWarning("getAngularVelocity()", "the angularVelocity property");
- PyObject *retVal = PyList_New(3);
-
- PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_angular_velocity[0]));
- PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(m_angular_velocity[1]));
- PyList_SET_ITEM(retVal, 2, PyFloat_FromDouble(m_angular_velocity[2]));
-
- return retVal;
-}
-
-
-
-/* 8. setAngularVelocity */
-const char KX_SCA_AddObjectActuator::SetAngularVelocity_doc[] =
-"setAngularVelocity(vx, vy, vz)\n"
-"\t- vx: float\n"
-"\t- vy: float\n"
-"\t- vz: float\n"
-"\t- local: bool\n"
-"\tAssign this angular velocity to the created object. \n";
-
-PyObject* KX_SCA_AddObjectActuator::PySetAngularVelocity(PyObject* args)
-{
- ShowDeprecationWarning("setAngularVelocity()", "the angularVelocity property");
-
- float vecArg[3];
- if (!PyArg_ParseTuple(args, "fff:setAngularVelocity", &vecArg[0], &vecArg[1], &vecArg[2]))
- return NULL;
-
- m_angular_velocity[0] = vecArg[0];
- m_angular_velocity[1] = vecArg[1];
- m_angular_velocity[2] = vecArg[2];
- Py_RETURN_NONE;
-}
-
void KX_SCA_AddObjectActuator::InstantAddObject()
{
if (m_OriginalObject)
@@ -495,26 +284,3 @@ PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject()
Py_RETURN_NONE;
}
-
-
-
-/* 7. GetLastCreatedObject */
-const char KX_SCA_AddObjectActuator::GetLastCreatedObject_doc[] =
-"getLastCreatedObject()\n"
-"\tReturn the last created object. \n";
-
-
-PyObject* KX_SCA_AddObjectActuator::PyGetLastCreatedObject()
-{
- ShowDeprecationWarning("getLastCreatedObject()", "the objectLastCreated property");
- SCA_IObject* result = this->GetLastCreatedObject();
-
- // if result->GetSGNode() is NULL
- // it means the object has ended, The BGE python api crashes in many places if the object is returned.
- if (result && (static_cast<KX_GameObject *>(result))->GetSGNode())
- {
- return result->GetProxy();
- }
- // don't return NULL to python anymore, it gives trouble in the scripts
- Py_RETURN_NONE;
-}
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
index 6746b7d1bc6..7137ba5209e 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
@@ -88,8 +88,7 @@ public:
const float *linvel,
bool linv_local,
const float *angvel,
- bool angv_local,
- PyTypeObject* T=&Type
+ bool angv_local
);
~KX_SCA_AddObjectActuator(void);
@@ -110,35 +109,12 @@ public:
virtual bool
Update();
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
SCA_IObject*
GetLastCreatedObject(
) const ;
void InstantAddObject();
- /* 1. setObject */
- KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetObject);
- /* 2. setTime */
- KX_PYMETHOD_DOC_O(KX_SCA_AddObjectActuator,SetTime);
- /* 3. getTime */
- KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetTime);
- /* 4. getObject */
- KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,GetObject);
- /* 5. getLinearVelocity */
- KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetLinearVelocity);
- /* 6. setLinearVelocity */
- KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,SetLinearVelocity);
- /* 7. getAngularVelocity */
- KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetAngularVelocity);
- /* 8. setAngularVelocity */
- KX_PYMETHOD_DOC_VARARGS(KX_SCA_AddObjectActuator,SetAngularVelocity);
- /* 9. getLastCreatedObject */
- KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,GetLastCreatedObject);
- /* 10. instantAddObject*/
KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,InstantAddObject);
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
index a50764a54e6..73c85ad07b3 100644
--- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
@@ -47,16 +47,8 @@
/* Integration hooks ------------------------------------------------------- */
- PyTypeObject
-
-KX_SCA_DynamicActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
+PyTypeObject KX_SCA_DynamicActuator::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_SCA_DynamicActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -66,26 +58,18 @@ KX_SCA_DynamicActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_SCA_DynamicActuator::Parents[] = {
- &KX_SCA_DynamicActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
PyMethodDef KX_SCA_DynamicActuator::Methods[] = {
- // ---> deprecated
- KX_PYMETHODTABLE(KX_SCA_DynamicActuator, setOperation),
- KX_PYMETHODTABLE(KX_SCA_DynamicActuator, getOperation),
{NULL,NULL} //Sentinel
};
@@ -95,67 +79,15 @@ PyAttributeDef KX_SCA_DynamicActuator::Attributes[] = {
{ NULL } //Sentinel
};
-
-PyObject* KX_SCA_DynamicActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SCA_DynamicActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_SCA_DynamicActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
-/* 1. setOperation */
-KX_PYMETHODDEF_DOC(KX_SCA_DynamicActuator, setOperation,
-"setOperation(operation?)\n"
-"\t - operation? : type of dynamic operation\n"
-"\t 0 = restore dynamics\n"
-"\t 1 = disable dynamics\n"
-"\t 2 = enable rigid body\n"
-"\t 3 = disable rigid body\n"
-"Change the dynamic status of the parent object.\n")
-{
- ShowDeprecationWarning("setOperation()", "the mode property");
- int dyn_operation;
-
- if (!PyArg_ParseTuple(args, "i:setOperation", &dyn_operation))
- {
- return NULL;
- }
- if (dyn_operation <0 || dyn_operation>3) {
- PyErr_SetString(PyExc_IndexError, "Dynamic Actuator's setOperation() range must be between 0 and 3");
- return NULL;
- }
- m_dyn_operation= dyn_operation;
- Py_RETURN_NONE;
-}
-
-KX_PYMETHODDEF_DOC(KX_SCA_DynamicActuator, getOperation,
-"getOperation() -> integer\n"
-"Returns the operation type of this actuator.\n"
-)
-{
- ShowDeprecationWarning("getOperation()", "the mode property");
- return PyInt_FromLong((long)m_dyn_operation);
-}
-
-
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
KX_SCA_DynamicActuator::KX_SCA_DynamicActuator(SCA_IObject *gameobj,
short dyn_operation,
- float setmass,
- PyTypeObject* T) :
+ float setmass) :
- SCA_IActuator(gameobj, T),
+ SCA_IActuator(gameobj, KX_ACT_DYNAMIC),
m_dyn_operation(dyn_operation),
m_setmass(setmass)
{
diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
index 4add707f8cd..58b28654eca 100644
--- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
@@ -50,8 +50,7 @@ class KX_SCA_DynamicActuator : public SCA_IActuator
KX_SCA_DynamicActuator(
SCA_IObject* gameobj,
short dyn_operation,
- float setmass,
- PyTypeObject* T=&Type
+ float setmass
);
~KX_SCA_DynamicActuator(
@@ -72,16 +71,6 @@ class KX_SCA_DynamicActuator : public SCA_IActuator
KX_DYN_DISABLE_RIGID_BODY,
KX_DYN_SET_MASS,
};
-
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- /* 1. setOperation */
- KX_PYMETHOD_DOC(KX_SCA_DynamicActuator,setOperation);
- KX_PYMETHOD_DOC(KX_SCA_DynamicActuator,getOperation);
-
};
#endif
diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
index 728254e7f48..e7dc71d9b27 100644
--- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
@@ -43,9 +43,8 @@
#endif
KX_SCA_EndObjectActuator::KX_SCA_EndObjectActuator(SCA_IObject *gameobj,
- SCA_IScene* scene,
- PyTypeObject* T):
- SCA_IActuator(gameobj, T),
+ SCA_IScene* scene):
+ SCA_IActuator(gameobj, KX_ACT_END_OBJECT),
m_scene(scene)
{
// intentionally empty
@@ -92,13 +91,7 @@ CValue* KX_SCA_EndObjectActuator::GetReplica()
/* ------------------------------------------------------------------------- */
PyTypeObject KX_SCA_EndObjectActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_SCA_EndObjectActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -108,24 +101,17 @@ PyTypeObject KX_SCA_EndObjectActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-PyParentObject KX_SCA_EndObjectActuator::Parents[] = {
- &KX_SCA_EndObjectActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef KX_SCA_EndObjectActuator::Methods[] = {
{NULL,NULL} //Sentinel
};
@@ -134,13 +120,4 @@ PyAttributeDef KX_SCA_EndObjectActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_SCA_EndObjectActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SCA_EndObjectActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
index 70d72f1f8da..782a24b1ef1 100644
--- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
@@ -47,8 +47,7 @@ class KX_SCA_EndObjectActuator : public SCA_IActuator
public:
KX_SCA_EndObjectActuator(
SCA_IObject* gameobj,
- SCA_IScene* scene,
- PyTypeObject* T=&Type
+ SCA_IScene* scene
);
~KX_SCA_EndObjectActuator();
@@ -63,9 +62,6 @@ class KX_SCA_EndObjectActuator : public SCA_IActuator
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
}; /* end of class KX_EditObjectActuator : public SCA_PropertyActuator */
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
index 00842d7012a..e118972edc8 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
@@ -50,16 +50,8 @@
/* Integration hooks ------------------------------------------------------- */
- PyTypeObject
-
-KX_SCA_ReplaceMeshActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
+PyTypeObject KX_SCA_ReplaceMeshActuator::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_SCA_ReplaceMeshActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -69,50 +61,29 @@ KX_SCA_ReplaceMeshActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_SCA_ReplaceMeshActuator::Parents[] = {
- &KX_SCA_ReplaceMeshActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = {
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, instantReplaceMesh),
- // Deprecated ----->
- {"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_O, (PY_METHODCHAR)SetMesh_doc},
- KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, getMesh),
{NULL,NULL} //Sentinel
};
PyAttributeDef KX_SCA_ReplaceMeshActuator::Attributes[] = {
KX_PYATTRIBUTE_RW_FUNCTION("mesh", KX_SCA_ReplaceMeshActuator, pyattr_get_mesh, pyattr_set_mesh),
+ KX_PYATTRIBUTE_BOOL_RW ("useDisplayMesh", KX_SCA_ReplaceMeshActuator, m_use_gfx),
+ KX_PYATTRIBUTE_BOOL_RW ("usePhysicsMesh", KX_SCA_ReplaceMeshActuator, m_use_phys),
{ NULL } //Sentinel
};
-PyObject* KX_SCA_ReplaceMeshActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SCA_ReplaceMeshActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_SCA_ReplaceMeshActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
PyObject* KX_SCA_ReplaceMeshActuator::pyattr_get_mesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_SCA_ReplaceMeshActuator* actuator = static_cast<KX_SCA_ReplaceMeshActuator*>(self);
@@ -134,37 +105,6 @@ int KX_SCA_ReplaceMeshActuator::pyattr_set_mesh(void *self, const struct KX_PYAT
return PY_SET_ATTR_SUCCESS;
}
-/* 1. setMesh */
-const char KX_SCA_ReplaceMeshActuator::SetMesh_doc[] =
- "setMesh(name)\n"
- "\t- name: string or None\n"
- "\tSet the mesh that will be substituted for the current one.\n";
-
-PyObject* KX_SCA_ReplaceMeshActuator::PySetMesh(PyObject* value)
-{
- ShowDeprecationWarning("setMesh()", "the mesh property");
- RAS_MeshObject* new_mesh;
-
- if (!ConvertPythonToMesh(value, &new_mesh, true, "actuator.mesh = value: KX_SCA_ReplaceMeshActuator"))
- return NULL;
-
- m_mesh = new_mesh;
- Py_RETURN_NONE;
-}
-
-KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh,
-"getMesh() -> string\n"
-"Returns the name of the mesh to be substituted.\n"
-)
-{
- ShowDeprecationWarning("getMesh()", "the mesh property");
- if (!m_mesh)
- Py_RETURN_NONE;
-
- return PyString_FromString(const_cast<char *>(m_mesh->GetName().ReadPtr()));
-}
-
-
KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
"instantReplaceMesh() : immediately replace mesh without delay\n")
{
@@ -179,11 +119,14 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
KX_SCA_ReplaceMeshActuator::KX_SCA_ReplaceMeshActuator(SCA_IObject *gameobj,
class RAS_MeshObject *mesh,
SCA_IScene* scene,
- PyTypeObject* T) :
+ bool use_gfx,
+ bool use_phys) :
- SCA_IActuator(gameobj, T),
+ SCA_IActuator(gameobj, KX_ACT_REPLACE_MESH),
m_mesh(mesh),
- m_scene(scene)
+ m_scene(scene),
+ m_use_gfx(use_gfx),
+ m_use_phys(use_phys)
{
} /* End of constructor */
@@ -205,7 +148,8 @@ bool KX_SCA_ReplaceMeshActuator::Update()
if (bNegativeEvent)
return false; // do nothing on negative events
- if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh);
+ if (m_mesh || m_use_phys) /* NULL mesh is ok if were updating physics */
+ m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys);
return false;
}
@@ -227,7 +171,7 @@ CValue* KX_SCA_ReplaceMeshActuator::GetReplica()
void KX_SCA_ReplaceMeshActuator::InstantReplaceMesh()
{
- if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh);
+ if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys);
}
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
index 0e7f7852701..e5482c29aa7 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
@@ -50,13 +50,16 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
// mesh reference (mesh to replace)
RAS_MeshObject* m_mesh;
SCA_IScene* m_scene;
+ bool m_use_gfx;
+ bool m_use_phys;
public:
KX_SCA_ReplaceMeshActuator(
SCA_IObject* gameobj,
RAS_MeshObject *mesh,
SCA_IScene* scene,
- PyTypeObject* T=&Type
+ bool use_gfx,
+ bool use_phys
);
~KX_SCA_ReplaceMeshActuator(
@@ -71,16 +74,13 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
void InstantReplaceMesh();
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
static PyObject* pyattr_get_mesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_mesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- /* 1. setMesh */
- KX_PYMETHOD_DOC_O(KX_SCA_ReplaceMeshActuator,SetMesh);
- KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,getMesh);
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh);
};
diff --git a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
index c9baf228855..dd4419543a2 100644
--- a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
+++ b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
@@ -59,7 +59,6 @@ class KX_BoneParentRelation : public SG_ParentRelation
{
public :
-
/**
* Allocate and construct a new KX_SG_BoneParentRelation
* on the heap.
@@ -101,6 +100,12 @@ private :
KX_BoneParentRelation(Bone* bone
);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BoneParentRelation"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
index d8fb9211f21..c1640f3e0a0 100644
--- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
+++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
@@ -53,7 +53,6 @@ class KX_NormalParentRelation : public SG_ParentRelation
{
public :
-
/**
* Allocate and construct a new KX_NormalParentRelation
* on the heap.
@@ -91,6 +90,12 @@ private :
KX_NormalParentRelation(
);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_NormalParentRelation"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -142,6 +147,12 @@ private :
KX_VertexParentRelation(
);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_VertexParentRelation"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -219,6 +230,12 @@ private :
bool m_initialized;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_SlowParentRelation"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_ScalarInterpolator.h b/source/gameengine/Ketsji/KX_ScalarInterpolator.h
index 8835c98c184..ca011ab5db0 100644
--- a/source/gameengine/Ketsji/KX_ScalarInterpolator.h
+++ b/source/gameengine/Ketsji/KX_ScalarInterpolator.h
@@ -55,6 +55,13 @@ public:
private:
MT_Scalar* m_target;
KX_IScalarInterpolator *m_ipo;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalarInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_ScalingInterpolator.h b/source/gameengine/Ketsji/KX_ScalingInterpolator.h
index a7b5d7e559a..460563d4135 100644
--- a/source/gameengine/Ketsji/KX_ScalingInterpolator.h
+++ b/source/gameengine/Ketsji/KX_ScalingInterpolator.h
@@ -50,6 +50,13 @@ public:
private:
MT_Vector3& m_target;
KX_IScalarInterpolator *m_ipos[3];
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_ScalingInterpolator"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index c0d8a7090c4..140be3fb3db 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -34,21 +34,21 @@
#include "KX_Scene.h"
#include "MT_assert.h"
-#include "SND_Scene.h"
#include "KX_KetsjiEngine.h"
#include "KX_BlenderMaterial.h"
#include "RAS_IPolygonMaterial.h"
#include "ListValue.h"
#include "SCA_LogicManager.h"
#include "SCA_TimeEventManager.h"
-#include "SCA_AlwaysEventManager.h"
-#include "SCA_RandomEventManager.h"
-#include "KX_RayEventManager.h"
+//#include "SCA_AlwaysEventManager.h"
+//#include "SCA_RandomEventManager.h"
+//#include "KX_RayEventManager.h"
#include "KX_TouchEventManager.h"
#include "SCA_KeyboardManager.h"
#include "SCA_MouseManager.h"
-#include "SCA_PropertyEventManager.h"
+//#include "SCA_PropertyEventManager.h"
#include "SCA_ActuatorEventManager.h"
+#include "SCA_BasicEventManager.h"
#include "KX_Camera.h"
#include "SCA_JoystickManager.h"
@@ -135,16 +135,14 @@ extern bool gUseVisibilityTemp;
KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
class NG_NetworkDeviceInterface *ndi,
- class SND_IAudioDevice* adi,
const STR_String& sceneName,
Scene *scene):
- PyObjectPlus(&KX_Scene::Type),
+ PyObjectPlus(),
m_keyboardmgr(NULL),
m_mousemgr(NULL),
m_sceneConverter(NULL),
m_physicsEnvironment(0),
m_sceneName(sceneName),
- m_adi(adi),
m_networkDeviceInterface(ndi),
m_active_camera(NULL),
m_ueberExecutionPriority(0),
@@ -171,25 +169,27 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_keyboardmgr = new SCA_KeyboardManager(m_logicmgr,keyboarddevice);
m_mousemgr = new SCA_MouseManager(m_logicmgr,mousedevice);
- SCA_AlwaysEventManager* alwaysmgr = new SCA_AlwaysEventManager(m_logicmgr);
- SCA_PropertyEventManager* propmgr = new SCA_PropertyEventManager(m_logicmgr);
+ //SCA_AlwaysEventManager* alwaysmgr = new SCA_AlwaysEventManager(m_logicmgr);
+ //SCA_PropertyEventManager* propmgr = new SCA_PropertyEventManager(m_logicmgr);
SCA_ActuatorEventManager* actmgr = new SCA_ActuatorEventManager(m_logicmgr);
- SCA_RandomEventManager* rndmgr = new SCA_RandomEventManager(m_logicmgr);
- KX_RayEventManager* raymgr = new KX_RayEventManager(m_logicmgr);
+ //SCA_RandomEventManager* rndmgr = new SCA_RandomEventManager(m_logicmgr);
+ SCA_BasicEventManager* basicmgr = new SCA_BasicEventManager(m_logicmgr);
+ //KX_RayEventManager* raymgr = new KX_RayEventManager(m_logicmgr);
KX_NetworkEventManager* netmgr = new KX_NetworkEventManager(m_logicmgr, ndi);
- m_logicmgr->RegisterEventManager(alwaysmgr);
- m_logicmgr->RegisterEventManager(propmgr);
+ //m_logicmgr->RegisterEventManager(alwaysmgr);
+ //m_logicmgr->RegisterEventManager(propmgr);
m_logicmgr->RegisterEventManager(actmgr);
m_logicmgr->RegisterEventManager(m_keyboardmgr);
m_logicmgr->RegisterEventManager(m_mousemgr);
m_logicmgr->RegisterEventManager(m_timemgr);
- m_logicmgr->RegisterEventManager(rndmgr);
- m_logicmgr->RegisterEventManager(raymgr);
+ //m_logicmgr->RegisterEventManager(rndmgr);
+ //m_logicmgr->RegisterEventManager(raymgr);
m_logicmgr->RegisterEventManager(netmgr);
+ m_logicmgr->RegisterEventManager(basicmgr);
SYS_SystemHandle hSystem = SYS_GetSystem();
@@ -200,7 +200,6 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_logicmgr->RegisterEventManager(joymgr);
}
- m_soundScene = new SND_Scene(adi);
MT_assert (m_networkDeviceInterface != NULL);
m_networkScene = new NG_NetworkScene(m_networkDeviceInterface);
@@ -250,9 +249,6 @@ KX_Scene::~KX_Scene()
if (m_physicsEnvironment)
delete m_physicsEnvironment;
- if (m_soundScene)
- delete m_soundScene;
-
if (m_networkScene)
delete m_networkScene;
@@ -364,12 +360,6 @@ class KX_WorldInfo* KX_Scene::GetWorldInfo()
}
-
-SND_Scene* KX_Scene::GetSoundScene()
-{
- return m_soundScene;
-}
-
const STR_String& KX_Scene::GetName()
{
return m_sceneName;
@@ -1008,8 +998,12 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj)
// in case this is a camera
m_cameras.remove((KX_Camera*)newobj);
+ /* currently does nothing, keep incase we need to Unregister something */
+#if 0
if (m_sceneConverter)
m_sceneConverter->UnregisterGameObject(newobj);
+#endif
+
// return value will be 0 if the object is actually deleted (all reference gone)
return ret;
@@ -1017,17 +1011,18 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj)
-void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj)
+void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool use_phys)
{
KX_GameObject* gameobj = static_cast<KX_GameObject*>(obj);
RAS_MeshObject* mesh = static_cast<RAS_MeshObject*>(meshobj);
- if(!gameobj || !mesh)
- {
- std::cout << "warning: invalid object, mesh will not be replaced" << std::endl;
+ if(!gameobj) {
+ std::cout << "KX_Scene::ReplaceMesh Warning: invalid object, doing nothing" << std::endl;
return;
}
+ if(use_gfx && mesh != NULL)
+ {
gameobj->RemoveMeshes();
gameobj->AddMesh(mesh);
@@ -1156,6 +1151,11 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj)
}
gameobj->AddMeshUser();
+ }
+
+ if(use_phys) { /* update the new assigned mesh with the physics mesh */
+ KX_ReInstanceBulletShapeFromMesh(gameobj, NULL, use_gfx?NULL:mesh);
+ }
}
KX_Camera* KX_Scene::FindCamera(KX_Camera* cam)
@@ -1573,11 +1573,6 @@ void KX_Scene::SetGravity(const MT_Vector3& gravity)
GetPhysicsEnvironment()->setGravity(gravity[0],gravity[1],gravity[2]);
}
-void KX_Scene::SetNodeTree(SG_Tree* root)
-{
- m_objecttree = root;
-}
-
void KX_Scene::SetSceneConverter(class KX_BlenderSceneConverter* sceneConverter)
{
m_sceneConverter = sceneConverter;
@@ -1613,48 +1608,147 @@ double KX_Scene::getSuspendedDelta()
//Python
PyTypeObject KX_Scene::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_Scene",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_Scene::Parents[] = {
- &KX_Scene::Type,
- &CValue::Type,
- NULL
+ "KX_Scene",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,
+ &Sequence,
+ &Mapping,
+ 0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &CValue::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_Scene::Methods[] = {
- KX_PYMETHODTABLE_NOARGS(KX_Scene, getLightList),
- KX_PYMETHODTABLE_NOARGS(KX_Scene, getObjectList),
- KX_PYMETHODTABLE_NOARGS(KX_Scene, getName),
KX_PYMETHODTABLE(KX_Scene, addObject),
+ /* dict style access */
+ KX_PYMETHODTABLE(KX_Scene, get),
+
{NULL,NULL} //Sentinel
};
+static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
+{
+ KX_Scene* self= static_cast<KX_Scene*>BGE_PROXY_REF(self_v);
+ const char *attr_str= _PyUnicode_AsString(item);
+ PyObject* pyconvert;
+
+ if (self==NULL) {
+ PyErr_SetString(PyExc_SystemError, "val = scene[key]: KX_Scene, "BGE_PROXY_ERROR_MSG);
+ return NULL;
+ }
+
+ if (self->m_attr_dict && (pyconvert=PyDict_GetItem(self->m_attr_dict, item))) {
+
+ if (attr_str)
+ PyErr_Clear();
+ Py_INCREF(pyconvert);
+ return pyconvert;
+ }
+ else {
+ if(attr_str) PyErr_Format(PyExc_KeyError, "value = scene[key]: KX_Scene, key \"%s\" does not exist", attr_str);
+ else PyErr_SetString(PyExc_KeyError, "value = scene[key]: KX_Scene, key does not exist");
+ return NULL;
+ }
+
+}
+
+static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
+{
+ KX_Scene* self= static_cast<KX_Scene*>BGE_PROXY_REF(self_v);
+ const char *attr_str= _PyUnicode_AsString(key);
+ if(attr_str==NULL)
+ PyErr_Clear();
+
+ if (self==NULL) {
+ PyErr_SetString(PyExc_SystemError, "scene[key] = value: KX_Scene, "BGE_PROXY_ERROR_MSG);
+ return -1;
+ }
+
+ if (val==NULL) { /* del ob["key"] */
+ int del= 0;
+
+ if(self->m_attr_dict)
+ del |= (PyDict_DelItem(self->m_attr_dict, key)==0) ? 1:0;
+
+ if (del==0) {
+ if(attr_str) PyErr_Format(PyExc_KeyError, "scene[key] = value: KX_Scene, key \"%s\" could not be set", attr_str);
+ else PyErr_SetString(PyExc_KeyError, "del scene[key]: KX_Scene, key could not be deleted");
+ return -1;
+ }
+ else if (self->m_attr_dict) {
+ PyErr_Clear(); /* PyDict_DelItem sets an error when it fails */
+ }
+ }
+ else { /* ob["key"] = value */
+ int set = 0;
+
+ if (self->m_attr_dict==NULL) /* lazy init */
+ self->m_attr_dict= PyDict_New();
+
+
+ if(PyDict_SetItem(self->m_attr_dict, key, val)==0)
+ set= 1;
+ else
+ PyErr_SetString(PyExc_KeyError, "scene[key] = value: KX_Scene, key not be added to internal dictionary");
+
+ if(set==0)
+ return -1; /* pythons error value */
+
+ }
+
+ return 0; /* success */
+}
+
+static int Seq_Contains(PyObject *self_v, PyObject *value)
+{
+ KX_Scene* self= static_cast<KX_Scene*>BGE_PROXY_REF(self_v);
+
+ if (self==NULL) {
+ PyErr_SetString(PyExc_SystemError, "val in scene: KX_Scene, "BGE_PROXY_ERROR_MSG);
+ return -1;
+ }
+
+ if (self->m_attr_dict && PyDict_GetItem(self->m_attr_dict, value))
+ return 1;
+
+ return 0;
+}
+
+PyMappingMethods KX_Scene::Mapping = {
+ (lenfunc)NULL , /*inquiry mp_length */
+ (binaryfunc)Map_GetItem, /*binaryfunc mp_subscript */
+ (objobjargproc)Map_SetItem, /*objobjargproc mp_ass_subscript */
+};
+
+PySequenceMethods KX_Scene::Sequence = {
+ NULL, /* Cant set the len otherwise it can evaluate as false */
+ NULL, /* sq_concat */
+ NULL, /* sq_repeat */
+ NULL, /* sq_item */
+ NULL, /* sq_slice */
+ NULL, /* sq_ass_item */
+ NULL, /* sq_ass_slice */
+ (objobjproc)Seq_Contains, /* sq_contains */
+};
PyObject* KX_Scene::pyattr_get_name(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_Scene* self= static_cast<KX_Scene*>(self_v);
- return PyString_FromString(self->GetName().ReadPtr());
+ return PyUnicode_FromString(self->GetName().ReadPtr());
}
PyObject* KX_Scene::pyattr_get_objects(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
@@ -1730,99 +1824,6 @@ PyAttributeDef KX_Scene::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_Scene::py_getattro__internal(PyObject *attr)
-{
- py_getattro_up(PyObjectPlus);
-}
-
-int KX_Scene::py_setattro__internal(PyObject *attr, PyObject *value)
-{
- py_setattro_up(PyObjectPlus);
-}
-
-PyObject* KX_Scene::py_getattro(PyObject *attr)
-{
- PyObject *object = py_getattro__internal(attr);
-
- if (object==NULL)
- {
- PyErr_Clear();
- object = PyDict_GetItem(m_attr_dict, attr);
- if(object) {
- Py_INCREF(object);
- }
- else {
- PyErr_Format(PyExc_AttributeError, "value = scene.myAttr: KX_Scene, attribute \"%s\" not found", PyString_AsString(attr));
- }
- }
-
- return object;
-}
-
-PyObject* KX_Scene::py_getattro_dict() {
- //py_getattro_dict_up(PyObjectPlus);
-
- PyObject *dict= py_getattr_dict(PyObjectPlus::py_getattro_dict(), Type.tp_dict);
- if(dict==NULL)
- return NULL;
-
- /* normally just return this but KX_Scene has some more items */
-
- PyDict_Update(dict, m_attr_dict);
- return dict;
-}
-
-int KX_Scene::py_setattro(PyObject *attr, PyObject *value)
-{
- int ret= py_setattro__internal(attr, value);
-
- if (ret==PY_SET_ATTR_MISSING) {
- if (PyDict_SetItem(m_attr_dict, attr, value)==0) {
- PyErr_Clear();
- ret= PY_SET_ATTR_SUCCESS;
- }
- else {
- PyErr_SetString(PyExc_AttributeError, "scene.UserAttr = value: KX_Scenes, failed assigning value to internal dictionary");
- ret= PY_SET_ATTR_FAIL;
- }
- }
-
- return ret;
-}
-
-int KX_Scene::py_delattro(PyObject *attr)
-{
- PyDict_DelItem(m_attr_dict, attr);
- return 0;
-}
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getLightList,
-"getLightList() -> list [KX_Light]\n"
-"Returns a list of all lights in the scene.\n"
-)
-{
- ShowDeprecationWarning("getLightList()", "the lights property");
- return m_lightlist->GetProxy();
-}
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getObjectList,
-"getObjectList() -> list [KX_GameObject]\n"
-"Returns a list of all game objects in the scene.\n"
-)
-{
- ShowDeprecationWarning("getObjectList()", "the objects property");
- return m_objectlist->GetProxy();
-}
-
-KX_PYMETHODDEF_DOC_NOARGS(KX_Scene, getName,
-"getName() -> string\n"
-"Returns the name of the scene.\n"
-)
-{
- ShowDeprecationWarning("getName()", "the name property");
- return PyString_FromString(GetName());
-}
-
KX_PYMETHODDEF_DOC(KX_Scene, addObject,
"addObject(object, other, time=0)\n"
"Returns the added object.\n")
@@ -1847,3 +1848,22 @@ KX_PYMETHODDEF_DOC(KX_Scene, addObject,
replica->Release();
return replica->GetProxy();
}
+
+/* Matches python dict.get(key, [default]) */
+KX_PYMETHODDEF_DOC(KX_Scene, get, "")
+{
+ PyObject *key;
+ PyObject* def = Py_None;
+ PyObject* ret;
+
+ if (!PyArg_ParseTuple(args, "O|O:get", &key, &def))
+ return NULL;
+
+ if (m_attr_dict && (ret=PyDict_GetItem(m_attr_dict, key))) {
+ Py_INCREF(ret);
+ return ret;
+ }
+
+ Py_INCREF(def);
+ return def;
+}
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index 79d3f7fd828..3e0dc303d72 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -63,8 +63,6 @@ class SCA_TimeEventManager;
class SCA_MouseManager;
class SCA_ISystem;
class SCA_IInputDevice;
-class SND_Scene;
-class SND_IAudioDevice;
class NG_NetworkDeviceInterface;
class NG_NetworkScene;
class SG_IObject;
@@ -92,6 +90,7 @@ struct KX_ClientObjectInfo;
class KX_Scene : public PyObjectPlus, public SCA_IScene
{
Py_Header;
+ PyObject* m_attr_dict;
struct CullingInfo {
int m_layer;
@@ -119,10 +118,6 @@ protected:
// the Qlist is for objects that needs to be rescheduled
// for updates after udpate is over (slow parent, bone parent)
- /**
- * The tree of objects in the scene.
- */
- SG_Tree* m_objecttree;
/**
* The set of cameras for this scene
@@ -164,14 +159,7 @@ protected:
* @section Different scenes, linked to ketsji scene
*/
-
/**
- * Sound scenes
- */
- SND_Scene* m_soundScene;
- SND_IAudioDevice* m_adi;
-
- /**
* Network scene.
*/
NG_NetworkDeviceInterface* m_networkDeviceInterface;
@@ -275,19 +263,13 @@ protected:
double m_suspendedtime;
double m_suspendeddelta;
-
- /**
- * This stores anything from python
- */
- PyObject* m_attr_dict;
struct Scene* m_blenderScene;
-public:
+public:
KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
class NG_NetworkDeviceInterface* ndi,
- class SND_IAudioDevice* adi,
const STR_String& scenename,
struct Scene* scene);
@@ -323,7 +305,7 @@ public:
int NewRemoveObject(CValue* gameobj);
void ReplaceMesh(CValue* gameobj,
- void* meshobj);
+ void* meshob, bool use_gfx, bool use_phys);
/**
* @section Logic stuff
* Initiate an update of the logic system.
@@ -484,7 +466,6 @@ public:
void CalculateVisibleMeshes(RAS_IRasterizer* rasty, KX_Camera *cam, int layer=0);
void UpdateMeshTransformations();
KX_Camera* GetpCamera();
- SND_Scene* GetSoundScene();
NG_NetworkDeviceInterface* GetNetworkDeviceInterface();
NG_NetworkScene* GetNetworkScene();
@@ -536,23 +517,12 @@ public:
*/
void SetNodeTree(SG_Tree* root);
- KX_PYMETHOD_DOC_NOARGS(KX_Scene, getLightList);
- KX_PYMETHOD_DOC_NOARGS(KX_Scene, getObjectList);
- KX_PYMETHOD_DOC_NOARGS(KX_Scene, getName);
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+
KX_PYMETHOD_DOC(KX_Scene, addObject);
-/*
- KX_PYMETHOD_DOC(KX_Scene, getActiveCamera);
- KX_PYMETHOD_DOC(KX_Scene, getActiveCamera);
- KX_PYMETHOD_DOC(KX_Scene, findCamera);
-
- KX_PYMETHOD_DOC(KX_Scene, getGravity);
-
- KX_PYMETHOD_DOC(KX_Scene, setActivityCulling);
- KX_PYMETHOD_DOC(KX_Scene, setActivityCullingRadius);
-
- KX_PYMETHOD_DOC(KX_Scene, setSceneViewport);
- KX_PYMETHOD_DOC(KX_Scene, setSceneViewport);
- */
+ KX_PYMETHOD_DOC(KX_Scene, get);
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
@@ -563,16 +533,12 @@ public:
static PyObject* pyattr_get_active_camera(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_active_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- virtual PyObject* py_getattro(PyObject *attr); /* name, active_camera, gravity, suspended, viewport, framing, activity_culling, activity_culling_radius */
- virtual PyObject* py_getattro_dict();
+ virtual PyObject* py_repr(void) { return PyUnicode_FromString(GetName().ReadPtr()); }
- virtual int py_setattro(PyObject *attr, PyObject *value);
- virtual int py_delattro(PyObject *attr);
- virtual PyObject* py_repr(void) { return PyString_FromString(GetName().ReadPtr()); }
+ /* getitem/setitem */
+ static PyMappingMethods Mapping;
+ static PySequenceMethods Sequence;
- PyObject* py_getattro__internal(PyObject *attr);
- int py_setattro__internal(PyObject *attr, PyObject *pyvalue);
-
/**
* Sets the time the scene was suspended
*/
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp
index 1b790ec9824..c7721c480e0 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp
@@ -49,9 +49,8 @@ KX_SceneActuator::KX_SceneActuator(SCA_IObject *gameobj,
KX_Scene *scene,
KX_KetsjiEngine* ketsjiEngine,
const STR_String& nextSceneName,
- KX_Camera* camera,
- PyTypeObject* T)
- : SCA_IActuator(gameobj, T)
+ KX_Camera* camera)
+ : SCA_IActuator(gameobj, KX_ACT_SCENE)
{
m_mode = mode;
m_scene = scene;
@@ -134,7 +133,7 @@ bool KX_SceneActuator::Update()
{
// if no camera is set and the parent object is a camera, use it as the camera
SCA_IObject* parent = GetParent();
- if (parent->isA(&KX_Camera::Type))
+ if (parent->GetGameObjectType()==SCA_IObject::OBJ_CAMERA)
{
m_scene->SetActiveCamera((KX_Camera*)parent);
}
@@ -223,52 +222,29 @@ KX_Scene* KX_SceneActuator::FindScene(char * sceneName)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_SceneActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_SceneActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
+ "KX_SceneActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
-PyParentObject KX_SceneActuator::Parents[] =
-{
- &KX_SceneActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
-};
-
-
-
PyMethodDef KX_SceneActuator::Methods[] =
{
- //Deprecated functions ------>
- {"setUseRestart", (PyCFunction) KX_SceneActuator::sPySetUseRestart, METH_VARARGS, (PY_METHODCHAR)SetUseRestart_doc},
- {"setScene", (PyCFunction) KX_SceneActuator::sPySetScene, METH_VARARGS, (PY_METHODCHAR)SetScene_doc},
- {"setCamera", (PyCFunction) KX_SceneActuator::sPySetCamera, METH_O, (PY_METHODCHAR)SetCamera_doc},
- {"getUseRestart", (PyCFunction) KX_SceneActuator::sPyGetUseRestart, METH_NOARGS, (PY_METHODCHAR)GetUseRestart_doc},
- {"getScene", (PyCFunction) KX_SceneActuator::sPyGetScene, METH_NOARGS, (PY_METHODCHAR)GetScene_doc},
- {"getCamera", (PyCFunction) KX_SceneActuator::sPyGetCamera, METH_NOARGS, (PY_METHODCHAR)GetCamera_doc},
- //<----- Deprecated
{NULL,NULL} //Sentinel
};
@@ -280,20 +256,6 @@ PyAttributeDef KX_SceneActuator::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_SceneActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SceneActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_SceneActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
PyObject* KX_SceneActuator::pyattr_get_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self);
@@ -325,117 +287,4 @@ int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_
return PY_SET_ATTR_SUCCESS;
}
-
-/* 2. setUseRestart--------------------------------------------------------- */
-const char KX_SceneActuator::SetUseRestart_doc[] =
-"setUseRestart(flag)\n"
-"\t- flag: 0 or 1.\n"
-"\tSet flag to 1 to restart the scene.\n" ;
-PyObject* KX_SceneActuator::PySetUseRestart(PyObject* args)
-{
- ShowDeprecationWarning("setUseRestart()", "the useRestart property");
- int boolArg;
-
- if (!PyArg_ParseTuple(args, "i:setUseRestart", &boolArg))
- {
- return NULL;
- }
-
- m_restart = boolArg != 0;
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 3. getUseRestart: */
-const char KX_SceneActuator::GetUseRestart_doc[] =
-"getUseRestart()\n"
-"\tReturn whether the scene will be restarted.\n" ;
-PyObject* KX_SceneActuator::PyGetUseRestart()
-{
- ShowDeprecationWarning("getUseRestart()", "the useRestart property");
- return PyInt_FromLong(!(m_restart == 0));
-}
-
-
-
-/* 4. set scene------------------------------------------------------------- */
-const char KX_SceneActuator::SetScene_doc[] =
-"setScene(scene)\n"
-"\t- scene: string\n"
-"\tSet the name of scene the actuator will switch to.\n" ;
-PyObject* KX_SceneActuator::PySetScene(PyObject* args)
-{
- ShowDeprecationWarning("setScene()", "the scene property");
- /* one argument: a scene, ignore the rest */
- char *scene_name;
-
- if(!PyArg_ParseTuple(args, "s:setScene", &scene_name))
- {
- return NULL;
- }
-
- /* Scene switch is done by name. */
- m_nextSceneName = scene_name;
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 5. getScene: */
-const char KX_SceneActuator::GetScene_doc[] =
-"getScene()\n"
-"\tReturn the name of the scene the actuator wants to switch to.\n" ;
-PyObject* KX_SceneActuator::PyGetScene()
-{
- ShowDeprecationWarning("getScene()", "the scene property");
- return PyString_FromString(m_nextSceneName);
-}
-
-
-
-/* 6. set camera------------------------------------------------------------ */
-const char KX_SceneActuator::SetCamera_doc[] =
-"setCamera(camera)\n"
-"\t- camera: string\n"
-"\tSet the camera to switch to.\n" ;
-PyObject* KX_SceneActuator::PySetCamera(PyObject* value)
-{
- ShowDeprecationWarning("setCamera()", "the camera property");
- KX_Camera *camOb;
-
- if (!ConvertPythonToCamera(value, &camOb, true, "actu.setCamera(value): KX_SceneActuator"))
- return NULL;
-
- if (m_camera)
- m_camera->UnregisterActuator(this);
-
- if(camOb==NULL) {
- m_camera= NULL;
- }
- else {
- m_camera = camOb;
- m_camera->RegisterActuator(this);
- }
- Py_RETURN_NONE;
-}
-
-
-
-/* 7. getCamera: */
-const char KX_SceneActuator::GetCamera_doc[] =
-"getCamera()\n"
-"\tReturn the name of the camera to switch to.\n" ;
-PyObject* KX_SceneActuator::PyGetCamera()
-{
- ShowDeprecationWarning("getCamera()", "the camera property");
- if (m_camera) {
- return PyString_FromString(m_camera->GetName());
- }
- else {
- Py_RETURN_NONE;
- }
-}
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.h b/source/gameengine/Ketsji/KX_SceneActuator.h
index 2412dd02590..e979a8ce559 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.h
+++ b/source/gameengine/Ketsji/KX_SceneActuator.h
@@ -77,8 +77,7 @@ class KX_SceneActuator : public SCA_IActuator
KX_Scene* scene,
KX_KetsjiEngine* ketsjiEngine,
const STR_String& nextSceneName,
- KX_Camera* camera,
- PyTypeObject* T=&Type);
+ KX_Camera* camera);
virtual ~KX_SceneActuator();
virtual CValue* GetReplica();
@@ -91,26 +90,6 @@ class KX_SceneActuator : public SCA_IActuator
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
-
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- /* 1. set */
- /* Removed */
-
- /* 2. setUseRestart: */
- KX_PYMETHOD_DOC_VARARGS(KX_SceneActuator,SetUseRestart);
- /* 3. getUseRestart: */
- KX_PYMETHOD_DOC_NOARGS(KX_SceneActuator,GetUseRestart);
- /* 4. setScene: */
- KX_PYMETHOD_DOC_VARARGS(KX_SceneActuator,SetScene);
- /* 5. getScene: */
- KX_PYMETHOD_DOC_NOARGS(KX_SceneActuator,GetScene);
- /* 6. setCamera: */
- KX_PYMETHOD_DOC_O(KX_SceneActuator,SetCamera);
- /* 7. getCamera: */
- KX_PYMETHOD_DOC_NOARGS(KX_SceneActuator,GetCamera);
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);
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index c13271f66a5..9d261137497 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -31,10 +31,7 @@
*/
#include "KX_SoundActuator.h"
-#include "SND_SoundObject.h"
#include "KX_GameObject.h"
-#include "SND_SoundObject.h"
-#include "SND_Scene.h" // needed for replication
#include "KX_PyMath.h" // needed for PyObjectFrom()
#include <iostream>
@@ -46,38 +43,94 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
KX_SoundActuator::KX_SoundActuator(SCA_IObject* gameobj,
- SND_SoundObject* sndobj,
- SND_Scene* sndscene,
- KX_SOUNDACT_TYPE type,
- short start,
- short end,
- PyTypeObject* T)
- : SCA_IActuator(gameobj,T)
-{
- m_soundObject = sndobj;
- m_soundScene = sndscene;
+ AUD_Sound* sound,
+ float volume,
+ float pitch,
+ bool is3d,
+ KX_3DSoundSettings settings,
+ KX_SOUNDACT_TYPE type)//,
+ : SCA_IActuator(gameobj, KX_ACT_SOUND)
+{
+ m_sound = sound;
+ m_volume = volume;
+ m_pitch = pitch;
+ m_is3d = is3d;
+ m_3d = settings;
+ m_handle = NULL;
m_type = type;
- m_lastEvent = true;
m_isplaying = false;
- m_startFrame = start;
- m_endFrame = end;
- m_pino = false;
-
-
}
KX_SoundActuator::~KX_SoundActuator()
{
- if (m_soundObject)
- {
- m_soundScene->RemoveActiveObject(m_soundObject);
- m_soundScene->DeleteObject(m_soundObject);
- }
+ if(m_handle)
+ AUD_stop(m_handle);
}
+void KX_SoundActuator::play()
+{
+ if(m_handle)
+ AUD_stop(m_handle);
+
+ if(!m_sound)
+ return;
+
+ // this is the sound that will be played and not deleted afterwards
+ AUD_Sound* sound = m_sound;
+ // this sounds are for temporary stacked sounds, will be deleted if not NULL
+ AUD_Sound* sound2 = NULL;
+ AUD_Sound* sound3 = NULL;
+
+ switch (m_type)
+ {
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL:
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
+ // create a ping pong sound on sound2 stacked on the orignal sound
+ sound2 = AUD_pingpongSound(sound);
+ // create a loop sound on sound3 stacked on the pingpong sound and let that one play (save it to sound)
+ sound = sound3 = AUD_loopSound(sound2);
+ break;
+ case KX_SOUNDACT_LOOPEND:
+ case KX_SOUNDACT_LOOPSTOP:
+ // create a loop sound on sound2 stacked on the pingpong sound and let that one play (save it to sound)
+ sound = sound2 = AUD_loopSound(sound);
+ break;
+ case KX_SOUNDACT_PLAYSTOP:
+ case KX_SOUNDACT_PLAYEND:
+ default:
+ break;
+ }
+ if(m_is3d)
+ {
+ // sound shall be played 3D
+ m_handle = AUD_play3D(sound, 0);
+
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_GAIN, m_3d.max_gain);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_MIN_GAIN, m_3d.min_gain);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_REFERENCE_DISTANCE, m_3d.reference_distance);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_DISTANCE, m_3d.max_distance);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_ROLLOFF_FACTOR, m_3d.rolloff_factor);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_INNER_ANGLE, m_3d.cone_inner_angle);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_ANGLE, m_3d.cone_outer_angle);
+ AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_GAIN, m_3d.cone_outer_gain);
+ }
+ else
+ m_handle = AUD_play(sound, 0);
+
+ AUD_setSoundPitch(m_handle, m_pitch);
+ AUD_setSoundVolume(m_handle, m_volume);
+ m_isplaying = true;
+
+ // now we unload the pingpong and loop sounds, as we don't need them anymore
+ // the started sound will continue playing like it was created, don't worry!
+ if(sound3)
+ AUD_unload(sound3);
+ if(sound2)
+ AUD_unload(sound2);
+}
CValue* KX_SoundActuator::GetReplica()
{
@@ -89,13 +142,8 @@ CValue* KX_SoundActuator::GetReplica()
void KX_SoundActuator::ProcessReplica()
{
SCA_IActuator::ProcessReplica();
- if (m_soundObject)
- {
- SND_SoundObject* soundobj = new SND_SoundObject(*m_soundObject);
- setSoundObject(soundobj);
- m_soundScene->AddObject(soundobj);
- }
-}
+ m_handle = 0;
+}
bool KX_SoundActuator::Update(double curtime, bool frame)
{
@@ -105,25 +153,20 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
// do nothing on negative events, otherwise sounds are played twice!
bool bNegativeEvent = IsNegativeEvent();
-
+ bool bPositiveEvent = m_posevent;
+
RemoveAllEvents();
- if (!m_soundObject)
+ if(!m_sound)
return false;
// actual audio device playing state
- bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
-
- if (m_pino)
- {
- bNegativeEvent = true;
- m_pino = false;
- }
+ bool isplaying = AUD_getStatus(m_handle) == AUD_STATUS_PLAYING;
if (bNegativeEvent)
- {
+ {
// here must be a check if it is still playing
- if (m_isplaying && isplaying)
+ if (m_isplaying && isplaying)
{
switch (m_type)
{
@@ -131,19 +174,20 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
case KX_SOUNDACT_LOOPSTOP:
case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
{
- m_soundScene->RemoveActiveObject(m_soundObject);
+ // stop immediately
+ AUD_stop(m_handle);
break;
}
case KX_SOUNDACT_PLAYEND:
{
- m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ // do nothing, sound will stop anyway when it's finished
break;
}
case KX_SOUNDACT_LOOPEND:
case KX_SOUNDACT_LOOPBIDIRECTIONAL:
{
- m_soundObject->SetLoopMode(SND_LOOP_OFF);
- m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ // stop the looping so that the sound stops when it finished
+ AUD_stopLoop(m_handle);
break;
}
default:
@@ -154,53 +198,61 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
// remember that we tried to stop the actuator
m_isplaying = false;
}
- else
- {
+
+#if 1
+ // Warning: when de-activating the actuator, after a single negative event this runs again with...
+ // m_posevent==false && m_posevent==false, in this case IsNegativeEvent() returns false
+ // and assumes this is a positive event.
+ // check that we actually have a positive event so as not to play sounds when being disabled.
+ else if(bPositiveEvent) { // <- added since 2.49
+#else
+ else { // <- works in most cases except a loop-end sound will never stop unless
+ // the negative pulse is done continuesly
+#endif
if (!m_isplaying)
- {
- switch (m_type)
- {
- case KX_SOUNDACT_LOOPBIDIRECTIONAL:
- case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
- {
- m_soundObject->SetLoopMode(SND_LOOP_BIDIRECTIONAL);
- m_soundScene->AddActiveObject(m_soundObject, curtime);
- m_isplaying = true;
- result = true;
- break;
- }
- case KX_SOUNDACT_LOOPEND:
- case KX_SOUNDACT_LOOPSTOP:
- {
- m_soundObject->SetLoopMode(SND_LOOP_NORMAL);
- m_soundScene->AddActiveObject(m_soundObject, curtime);
- m_isplaying = true;
- result = true;
- break;
- }
- case KX_SOUNDACT_PLAYSTOP:
- case KX_SOUNDACT_PLAYEND:
- {
- m_soundObject->SetLoopMode(SND_LOOP_OFF);
- m_soundScene->AddActiveObject(m_soundObject, curtime);
- m_isplaying = true;
- result = true;
- break;
- }
- default:
- // implement me !!
- break;
- }
- }
+ play();
}
// verify that the sound is still playing
- isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
+ isplaying = AUD_getStatus(m_handle) == AUD_STATUS_PLAYING ? true : false;
if (isplaying)
{
- m_soundObject->SetPosition(((KX_GameObject*)this->GetParent())->NodeGetWorldPosition());
- m_soundObject->SetVelocity(((KX_GameObject*)this->GetParent())->GetLinearVelocity());
- m_soundObject->SetOrientation(((KX_GameObject*)this->GetParent())->NodeGetWorldOrientation());
+ if(m_is3d)
+ {
+ AUD_3DData data;
+ float f;
+ ((KX_GameObject*)this->GetParent())->NodeGetWorldPosition().getValue(data.position);
+ ((KX_GameObject*)this->GetParent())->GetLinearVelocity().getValue(data.velocity);
+ ((KX_GameObject*)this->GetParent())->NodeGetWorldOrientation().getValue3x3(data.orientation);
+
+ /*
+ * The 3D data from blender has to be transformed for OpenAL:
+ * - In blender z is up and y is forwards
+ * - In OpenAL y is up and z is backwards
+ * We have to do that for all 5 vectors.
+ */
+ f = data.position[1];
+ data.position[1] = data.position[2];
+ data.position[2] = -f;
+
+ f = data.velocity[1];
+ data.velocity[1] = data.velocity[2];
+ data.velocity[2] = -f;
+
+ f = data.orientation[1];
+ data.orientation[1] = data.orientation[2];
+ data.orientation[2] = -f;
+
+ f = data.orientation[4];
+ data.orientation[4] = data.orientation[5];
+ data.orientation[5] = -f;
+
+ f = data.orientation[7];
+ data.orientation[7] = data.orientation[8];
+ data.orientation[8] = -f;
+
+ AUD_update3DSource(m_handle, &data);
+ }
result = true;
}
else
@@ -208,23 +260,11 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
m_isplaying = false;
result = false;
}
- /*
- if (result && (m_soundObject->IsLifeSpanOver(curtime)) && ((m_type == KX_SOUNDACT_PLAYEND) || (m_type == KX_SOUNDACT_PLAYSTOP)))
- {
- m_pino = true;
- }
- */
return result;
}
-void KX_SoundActuator::setSoundObject(class SND_SoundObject* soundobject)
-{
- m_soundObject = soundobject;
-}
-
-
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -234,60 +274,28 @@ void KX_SoundActuator::setSoundObject(class SND_SoundObject* soundobject)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_SoundActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_SoundActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
+ "KX_SoundActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
-PyParentObject KX_SoundActuator::Parents[] = {
- &KX_SoundActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
-};
-
-
-
PyMethodDef KX_SoundActuator::Methods[] = {
- // Deprecated ----->
- {"setFilename", (PyCFunction) KX_SoundActuator::sPySetFilename, METH_VARARGS,NULL},
- {"getFilename", (PyCFunction) KX_SoundActuator::sPyGetFilename, METH_NOARGS,NULL},
- {"setGain",(PyCFunction) KX_SoundActuator::sPySetGain,METH_VARARGS,NULL},
- {"getGain",(PyCFunction) KX_SoundActuator::sPyGetGain,METH_NOARGS,NULL},
- {"setPitch",(PyCFunction) KX_SoundActuator::sPySetPitch,METH_VARARGS,NULL},
- {"getPitch",(PyCFunction) KX_SoundActuator::sPyGetPitch,METH_NOARGS,NULL},
- {"setRollOffFactor",(PyCFunction) KX_SoundActuator::sPySetRollOffFactor,METH_VARARGS,NULL},
- {"getRollOffFactor",(PyCFunction) KX_SoundActuator::sPyGetRollOffFactor,METH_NOARGS,NULL},
- {"setLooping",(PyCFunction) KX_SoundActuator::sPySetLooping,METH_VARARGS,NULL},
- {"getLooping",(PyCFunction) KX_SoundActuator::sPyGetLooping,METH_NOARGS,NULL},
- {"setPosition",(PyCFunction) KX_SoundActuator::sPySetPosition,METH_VARARGS,NULL},
- {"setVelocity",(PyCFunction) KX_SoundActuator::sPySetVelocity,METH_VARARGS,NULL},
- {"setOrientation",(PyCFunction) KX_SoundActuator::sPySetOrientation,METH_VARARGS,NULL},
- {"setType",(PyCFunction) KX_SoundActuator::sPySetType,METH_VARARGS,NULL},
- {"getType",(PyCFunction) KX_SoundActuator::sPyGetType,METH_NOARGS,NULL},
- // <-----
-
KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, startSound),
KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, pauseSound),
KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, stopSound),
@@ -295,183 +303,91 @@ PyMethodDef KX_SoundActuator::Methods[] = {
};
PyAttributeDef KX_SoundActuator::Attributes[] = {
- KX_PYATTRIBUTE_RW_FUNCTION("fileName", KX_SoundActuator, pyattr_get_filename, pyattr_set_filename),
KX_PYATTRIBUTE_RW_FUNCTION("volume", KX_SoundActuator, pyattr_get_gain, pyattr_set_gain),
KX_PYATTRIBUTE_RW_FUNCTION("pitch", KX_SoundActuator, pyattr_get_pitch, pyattr_set_pitch),
KX_PYATTRIBUTE_RW_FUNCTION("rollOffFactor", KX_SoundActuator, pyattr_get_rollOffFactor, pyattr_set_rollOffFactor),
- KX_PYATTRIBUTE_RW_FUNCTION("looping", KX_SoundActuator, pyattr_get_looping, pyattr_set_looping),
- KX_PYATTRIBUTE_RW_FUNCTION("position", KX_SoundActuator, pyattr_get_position, pyattr_set_position),
- KX_PYATTRIBUTE_RW_FUNCTION("velocity", KX_SoundActuator, pyattr_get_velocity, pyattr_set_velocity),
- KX_PYATTRIBUTE_RW_FUNCTION("orientation", KX_SoundActuator, pyattr_get_orientation, pyattr_set_orientation),
KX_PYATTRIBUTE_ENUM_RW("mode",KX_SoundActuator::KX_SOUNDACT_NODEF+1,KX_SoundActuator::KX_SOUNDACT_MAX-1,false,KX_SoundActuator,m_type),
{ NULL } //Sentinel
};
/* Methods ----------------------------------------------------------------- */
-KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, startSound,
+KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, startSound,
"startSound()\n"
"\tStarts the sound.\n")
{
- if (m_soundObject)
- // This has no effect if the actuator is not active.
- // To start the sound you must activate the actuator.
- // This function is to restart the sound.
- m_soundObject->StartSound();
+ switch(AUD_getStatus(m_handle))
+ {
+ case AUD_STATUS_PLAYING:
+ break;
+ case AUD_STATUS_PAUSED:
+ AUD_resume(m_handle);
+ break;
+ default:
+ play();
+ }
Py_RETURN_NONE;
-}
+}
KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, pauseSound,
"pauseSound()\n"
"\tPauses the sound.\n")
{
- if (m_soundObject)
- // unfortunately, openal does not implement pause correctly, it is equivalent to a stop
- m_soundObject->PauseSound();
+ AUD_pause(m_handle);
Py_RETURN_NONE;
-}
+}
KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, stopSound,
"stopSound()\n"
"\tStops the sound.\n")
{
- if (m_soundObject)
- m_soundObject->StopSound();
+ AUD_stop(m_handle);
Py_RETURN_NONE;
}
/* Atribute setting and getting -------------------------------------------- */
-PyObject* KX_SoundActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SoundActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_SoundActuator::py_setattro(PyObject *attr, PyObject* value) {
- py_setattro_up(SCA_IActuator);
-}
-
-PyObject* KX_SoundActuator::pyattr_get_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- if (!actuator->m_soundObject)
- {
- return PyString_FromString("");
- }
- STR_String objectname = actuator->m_soundObject->GetObjectName();
- char* name = objectname.Ptr();
-
- if (!name) {
- PyErr_SetString(PyExc_RuntimeError, "value = actuator.fileName: KX_SoundActuator, unable to get sound fileName");
- return NULL;
- } else
- return PyString_FromString(name);
-}
PyObject* KX_SoundActuator::pyattr_get_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- float gain = (actuator->m_soundObject) ? actuator->m_soundObject->GetGain() : 1.0f;
+ float gain = actuator->m_volume;
PyObject* result = PyFloat_FromDouble(gain);
-
+
return result;
}
PyObject* KX_SoundActuator::pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- float pitch = (actuator->m_soundObject) ? actuator->m_soundObject->GetPitch() : 1.0;
+ float pitch = actuator->m_pitch;
+
PyObject* result = PyFloat_FromDouble(pitch);
-
+
return result;
}
PyObject* KX_SoundActuator::pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
{
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- float rollofffactor = (actuator->m_soundObject) ? actuator->m_soundObject->GetRollOffFactor() : 1.0;
+ float rollofffactor = actuator->m_3d.rolloff_factor;
PyObject* result = PyFloat_FromDouble(rollofffactor);
-
- return result;
-}
-
-PyObject* KX_SoundActuator::pyattr_get_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- int looping = (actuator->m_soundObject) ? actuator->m_soundObject->GetLoopMode() : (int)SND_LOOP_OFF;
- PyObject* result = PyInt_FromLong(looping);
-
- return result;
-}
-
-PyObject* KX_SoundActuator::pyattr_get_position(void * self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- MT_Vector3 pos(0.0, 0.0, 0.0);
-
- if (actuator->m_soundObject)
- pos = actuator->m_soundObject->GetPosition();
-
- PyObject * result = PyObjectFrom(pos);
- return result;
-}
-
-PyObject* KX_SoundActuator::pyattr_get_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- MT_Vector3 vel;
-
- if (actuator->m_soundObject)
- vel = actuator->m_soundObject->GetVelocity();
-
- PyObject * result = PyObjectFrom(vel);
- return result;
-}
-PyObject* KX_SoundActuator::pyattr_get_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- MT_Matrix3x3 ori;
-
- if (actuator->m_soundObject)
- ori = actuator->m_soundObject->GetOrientation();
-
- PyObject * result = PyObjectFrom(ori);
return result;
}
-int KX_SoundActuator::pyattr_set_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- char *soundName = NULL;
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator*> (self);
- // void *soundPointer = NULL; /*unused*/
-
- if (!PyArg_Parse(value, "s", &soundName))
- return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject) {
- actuator->m_soundObject->SetObjectName(soundName);
- }
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-
int KX_SoundActuator::pyattr_set_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
float gain = 1.0;
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
if (!PyArg_Parse(value, "f", &gain))
return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetGain(gain);
-
+
+ actuator->m_volume = gain;
+ if(actuator->m_handle)
+ AUD_setSoundVolume(actuator->m_handle, gain);
+
return PY_SET_ATTR_SUCCESS;
-}
+}
int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
@@ -479,12 +395,13 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D
KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
if (!PyArg_Parse(value, "f", &pitch))
return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetPitch(pitch);
-
+
+ actuator->m_pitch = pitch;
+ if(actuator->m_handle)
+ AUD_setSoundPitch(actuator->m_handle, pitch);
+
return PY_SET_ATTR_SUCCESS;
-}
+}
int KX_SoundActuator::pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
{
@@ -492,292 +409,10 @@ int KX_SoundActuator::pyattr_set_rollOffFactor(void *self, const struct KX_PYATT
float rollofffactor = 1.0;
if (!PyArg_Parse(value, "f", &rollofffactor))
return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetRollOffFactor(rollofffactor);
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-int KX_SoundActuator::pyattr_set_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
- int looping = 1;
- if (!PyArg_Parse(value, "i", &looping))
- return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetLoopMode(looping);
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-int KX_SoundActuator::pyattr_set_position(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- float pos[3];
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
+ actuator->m_3d.rolloff_factor = rollofffactor;
+ if(actuator->m_handle)
+ AUD_set3DSourceSetting(actuator->m_handle, AUD_3DSS_ROLLOFF_FACTOR, rollofffactor);
- if (!PyArg_ParseTuple(value, "fff", &pos[0], &pos[1], &pos[2]))
- return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetPosition(MT_Vector3(pos));
-
return PY_SET_ATTR_SUCCESS;
-}
-
-int KX_SoundActuator::pyattr_set_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- float vel[3];
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
-
-
- if (!PyArg_ParseTuple(value, "fff", &vel[0], &vel[1], &vel[2]))
- return PY_SET_ATTR_FAIL;
-
- if (actuator->m_soundObject)
- actuator->m_soundObject->SetVelocity(MT_Vector3(vel));
-
- return PY_SET_ATTR_SUCCESS;
-
-}
-
-int KX_SoundActuator::pyattr_set_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
-
- MT_Matrix3x3 rot;
- KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self);
-
- /* if value is not a sequence PyOrientationTo makes an error */
- if (!PyOrientationTo(value, rot, "actuator.orientation = value: KX_SoundActuator"))
- return PY_SET_ATTR_FAIL;
-
- /* Since not having m_soundObject didn't do anything in the old version,
- * it probably should be kept that way */
- if (!actuator->m_soundObject)
- return PY_SET_ATTR_SUCCESS;
-
- actuator->m_soundObject->SetOrientation(rot);
- return PY_SET_ATTR_SUCCESS;
-}
-
-// Deprecated ----->
-PyObject* KX_SoundActuator::PySetFilename(PyObject* args)
-{
- char *soundName = NULL;
- ShowDeprecationWarning("setFilename()", "the fileName property");
- // void *soundPointer = NULL; /*unused*/
-
- if (!PyArg_ParseTuple(args, "s", &soundName))
- return NULL;
-
- Py_RETURN_NONE;
-}
-
-PyObject* KX_SoundActuator::PyGetFilename()
-{
- ShowDeprecationWarning("getFilename()", "the fileName property");
- if (!m_soundObject)
- {
- return PyString_FromString("");
- }
- STR_String objectname = m_soundObject->GetObjectName();
- char* name = objectname.Ptr();
-
- if (!name) {
- PyErr_SetString(PyExc_RuntimeError, "Unable to get sound fileName");
- return NULL;
- } else
- return PyString_FromString(name);
-}
-
-PyObject* KX_SoundActuator::PySetGain(PyObject* args)
-{
- ShowDeprecationWarning("setGain()", "the volume property");
- float gain = 1.0;
- if (!PyArg_ParseTuple(args, "f:setGain", &gain))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetGain(gain);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PyGetGain()
-{
- ShowDeprecationWarning("getGain()", "the volume property");
- float gain = (m_soundObject) ? m_soundObject->GetGain() : 1.0f;
- PyObject* result = PyFloat_FromDouble(gain);
-
- return result;
-}
-
-
-
-PyObject* KX_SoundActuator::PySetPitch(PyObject* args)
-{
- ShowDeprecationWarning("setPitch()", "the pitch property");
- float pitch = 1.0;
- if (!PyArg_ParseTuple(args, "f:setPitch", &pitch))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetPitch(pitch);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PyGetPitch()
-{
- ShowDeprecationWarning("getPitch()", "the pitch property");
- float pitch = (m_soundObject) ? m_soundObject->GetPitch() : 1.0;
- PyObject* result = PyFloat_FromDouble(pitch);
-
- return result;
-}
-
-
-
-PyObject* KX_SoundActuator::PySetRollOffFactor(PyObject* args)
-{
- ShowDeprecationWarning("setRollOffFactor()", "the rollOffFactor property");
- float rollofffactor = 1.0;
- if (!PyArg_ParseTuple(args, "f:setRollOffFactor", &rollofffactor))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetRollOffFactor(rollofffactor);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PyGetRollOffFactor()
-{
- ShowDeprecationWarning("getRollOffFactor()", "the rollOffFactor property");
- float rollofffactor = (m_soundObject) ? m_soundObject->GetRollOffFactor() : 1.0;
- PyObject* result = PyFloat_FromDouble(rollofffactor);
-
- return result;
-}
-
-
-
-PyObject* KX_SoundActuator::PySetLooping(PyObject* args)
-{
- ShowDeprecationWarning("setLooping()", "the looping property");
- bool looping = 1;
- if (!PyArg_ParseTuple(args, "i:setLooping", &looping))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetLoopMode(looping);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PyGetLooping()
-{
- ShowDeprecationWarning("getLooping()", "the looping property");
- int looping = (m_soundObject) ? m_soundObject->GetLoopMode() : (int)SND_LOOP_OFF;
- PyObject* result = PyInt_FromLong(looping);
-
- return result;
}
-
-
-
-PyObject* KX_SoundActuator::PySetPosition(PyObject* args)
-{
- MT_Point3 pos;
- ShowDeprecationWarning("setPosition()", "the position property");
- pos[0] = 0.0;
- pos[1] = 0.0;
- pos[2] = 0.0;
-
- if (!PyArg_ParseTuple(args, "fff:setPosition", &pos[0], &pos[1], &pos[2]))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetPosition(pos);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PySetVelocity(PyObject* args)
-{
- MT_Vector3 vel;
- ShowDeprecationWarning("setVelocity()", "the velocity property");
- vel[0] = 0.0;
- vel[1] = 0.0;
- vel[2] = 0.0;
-
- if (!PyArg_ParseTuple(args, "fff:setVelocity", &vel[0], &vel[1], &vel[2]))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetVelocity(vel);
-
- Py_RETURN_NONE;
-}
-
-
-
-PyObject* KX_SoundActuator::PySetOrientation(PyObject* args)
-{
- MT_Matrix3x3 ori;
- ShowDeprecationWarning("setOrientation()", "the orientation property");
- ori[0][0] = 1.0;
- ori[0][1] = 0.0;
- ori[0][2] = 0.0;
- ori[1][0] = 0.0;
- ori[1][1] = 1.0;
- ori[1][2] = 0.0;
- ori[2][0] = 0.0;
- ori[2][1] = 0.0;
- ori[2][2] = 1.0;
-
- if (!PyArg_ParseTuple(args, "fffffffff:setOrientation", &ori[0][0], &ori[0][1], &ori[0][2], &ori[1][0], &ori[1][1], &ori[1][2], &ori[2][0], &ori[2][1], &ori[2][2]))
- return NULL;
-
- if (m_soundObject)
- m_soundObject->SetOrientation(ori);
-
- Py_RETURN_NONE;
-}
-
-PyObject* KX_SoundActuator::PySetType(PyObject* args)
-{
- int typeArg;
- ShowDeprecationWarning("setType()", "the mode property");
-
- if (!PyArg_ParseTuple(args, "i:setType", &typeArg)) {
- return NULL;
- }
-
- if ( (typeArg > KX_SOUNDACT_NODEF)
- && (typeArg < KX_SOUNDACT_MAX) ) {
- m_type = (KX_SOUNDACT_TYPE) typeArg;
- }
-
- Py_RETURN_NONE;
-}
-
-PyObject* KX_SoundActuator::PyGetType()
-{
- ShowDeprecationWarning("getType()", "the mode property");
- return PyInt_FromLong(m_type);
-}
-// <-----
-
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h
index a7491355667..43198f1a253 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.h
+++ b/source/gameengine/Ketsji/KX_SoundActuator.h
@@ -34,17 +34,34 @@
#include "SCA_IActuator.h"
+#include "AUD_C-API.h"
+#include "BKE_sound.h"
+
+typedef struct KX_3DSoundSettings
+{
+ float min_gain;
+ float max_gain;
+ float reference_distance;
+ float max_distance;
+ float rolloff_factor;
+ float cone_inner_angle;
+ float cone_outer_angle;
+ float cone_outer_gain;
+} KX_3DSoundSettings;
+
class KX_SoundActuator : public SCA_IActuator
{
- Py_Header;
- bool m_lastEvent;
- bool m_isplaying;
- /* just some handles to the audio-data... */
- class SND_SoundObject* m_soundObject;
- class SND_Scene* m_soundScene;
- short m_startFrame;
- short m_endFrame;
- bool m_pino;
+ Py_Header;
+ bool m_isplaying;
+ AUD_Sound* m_sound;
+ float m_volume;
+ float m_pitch;
+ bool m_is3d;
+ KX_3DSoundSettings m_3d;
+ AUD_Handle* m_handle;
+
+ void play();
+
public:
enum KX_SOUNDACT_TYPE
@@ -62,16 +79,15 @@ public:
KX_SOUNDACT_TYPE m_type;
KX_SoundActuator(SCA_IObject* gameobj,
- class SND_SoundObject* sndobj,
- class SND_Scene* sndscene,
- KX_SOUNDACT_TYPE type,
- short start,
- short end,
- PyTypeObject* T=&Type);
+ AUD_Sound* sound,
+ float volume,
+ float pitch,
+ bool is3d,
+ KX_3DSoundSettings settings,
+ KX_SOUNDACT_TYPE type);
~KX_SoundActuator();
- void setSoundObject(class SND_SoundObject* soundobject);
virtual bool Update(double curtime, bool frame);
CValue* GetReplica();
@@ -81,52 +97,19 @@ public:
/* Python interface --------------------------------------------------- */
/* -------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
-
KX_PYMETHOD_DOC_NOARGS(KX_SoundActuator, startSound);
KX_PYMETHOD_DOC_NOARGS(KX_SoundActuator, pauseSound);
KX_PYMETHOD_DOC_NOARGS(KX_SoundActuator, stopSound);
- static int pyattr_set_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static int pyattr_set_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static int pyattr_set_position(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static int pyattr_set_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static int pyattr_set_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static int pyattr_set_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
- static PyObject* pyattr_get_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- static PyObject* pyattr_get_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- static PyObject* pyattr_get_position(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- static PyObject* pyattr_get_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
- static PyObject* pyattr_get_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-
- // Deprecated ----->
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetFilename);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetFilename);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetGain);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetGain);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetPitch);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetPitch);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetRollOffFactor);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetRollOffFactor);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetLooping);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetLooping);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetPosition);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetVelocity);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetOrientation);
- KX_PYMETHOD_VARARGS(KX_SoundActuator,SetType);
- KX_PYMETHOD_NOARGS(KX_SoundActuator,GetType);
- // <-----
-
};
#endif //__KX_SOUNDACTUATOR
diff --git a/source/gameengine/Ketsji/KX_StateActuator.cpp b/source/gameengine/Ketsji/KX_StateActuator.cpp
index f6979eee0f4..60812220953 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.cpp
+++ b/source/gameengine/Ketsji/KX_StateActuator.cpp
@@ -38,10 +38,9 @@
KX_StateActuator::KX_StateActuator(
SCA_IObject* gameobj,
int operation,
- unsigned int mask,
- PyTypeObject* T
+ unsigned int mask
)
- : SCA_IActuator(gameobj,T),
+ : SCA_IActuator(gameobj, KX_ACT_STATE),
m_operation(operation),
m_mask(mask)
{
@@ -138,13 +137,7 @@ void KX_StateActuator::Activate(SG_DList& head)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_StateActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_StateActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -154,30 +147,18 @@ PyTypeObject KX_StateActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject
-KX_StateActuator::Parents[] = {
- &KX_StateActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyMethodDef
-KX_StateActuator::Methods[] = {
- // deprecated -->
- {"setOperation", (PyCFunction) KX_StateActuator::sPySetOperation,
- METH_VARARGS, (PY_METHODCHAR)SetOperation_doc},
- {"setMask", (PyCFunction) KX_StateActuator::sPySetMask,
- METH_VARARGS, (PY_METHODCHAR)SetMask_doc},
- // <--
+PyMethodDef KX_StateActuator::Methods[] = {
{NULL,NULL} //Sentinel
};
@@ -186,66 +167,3 @@ PyAttributeDef KX_StateActuator::Attributes[] = {
KX_PYATTRIBUTE_INT_RW("mask",0,0x3FFFFFFF,false,KX_StateActuator,m_mask),
{ NULL } //Sentinel
};
-
-PyObject* KX_StateActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_StateActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_StateActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
-/* set operation ---------------------------------------------------------- */
-const char
-KX_StateActuator::SetOperation_doc[] =
-"setOperation(op)\n"
-"\t - op : bit operation (0=Copy, 1=Set, 2=Clear, 3=Negate)"
-"\tSet the type of bit operation to be applied on object state mask.\n"
-"\tUse setMask() to specify the bits that will be modified.\n";
-PyObject*
-
-KX_StateActuator::PySetOperation(PyObject* args) {
- ShowDeprecationWarning("setOperation()", "the operation property");
- int oper;
-
- if(!PyArg_ParseTuple(args, "i:setOperation", &oper)) {
- return NULL;
- }
-
- m_operation = oper;
-
- Py_RETURN_NONE;
-}
-
-/* set mask ---------------------------------------------------------- */
-const char
-KX_StateActuator::SetMask_doc[] =
-"setMask(mask)\n"
-"\t - mask : bits that will be modified"
-"\tSet the value that defines the bits that will be modified by the operation.\n"
-"\tThe bits that are 1 in the value will be updated in the object state,\n"
-"\tthe bits that are 0 are will be left unmodified expect for the Copy operation\n"
-"\twhich copies the value to the object state.\n";
-PyObject*
-
-KX_StateActuator::PySetMask(PyObject* args) {
- ShowDeprecationWarning("setMask()", "the mask property");
- int mask;
-
- if(!PyArg_ParseTuple(args, "i:setMask", &mask)) {
- return NULL;
- }
-
- m_mask = mask;
-
- Py_RETURN_NONE;
-}
-
-
diff --git a/source/gameengine/Ketsji/KX_StateActuator.h b/source/gameengine/Ketsji/KX_StateActuator.h
index a4191a4c5fd..4cf84f74287 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.h
+++ b/source/gameengine/Ketsji/KX_StateActuator.h
@@ -66,9 +66,8 @@ class KX_StateActuator : public SCA_IActuator
KX_StateActuator(
SCA_IObject* gameobj,
int operation,
- unsigned int mask,
- PyTypeObject* T=&Type
- );
+ unsigned int mask
+ );
virtual
~KX_StateActuator(
@@ -90,12 +89,6 @@ class KX_StateActuator : public SCA_IActuator
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
- //KX_PYMETHOD_DOC
- KX_PYMETHOD_DOC_VARARGS(KX_StateActuator,SetOperation);
- KX_PYMETHOD_DOC_VARARGS(KX_StateActuator,SetMask);
};
#endif
diff --git a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
index 0cc34b53736..fe15967f93c 100644
--- a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
+++ b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
@@ -125,6 +125,12 @@ protected:
/** Maximum number of measurements. */
unsigned int m_maxNumMeasurements;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeCategoryLogger"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // __KX_TIME_CATEGORY_LOGGER_H
diff --git a/source/gameengine/Ketsji/KX_TimeLogger.h b/source/gameengine/Ketsji/KX_TimeLogger.h
index 0962f02a877..2e73abc75b5 100644
--- a/source/gameengine/Ketsji/KX_TimeLogger.h
+++ b/source/gameengine/Ketsji/KX_TimeLogger.h
@@ -36,6 +36,10 @@
#include <deque>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/**
* Stores and manages time measurements.
*/
@@ -98,6 +102,13 @@ protected:
/** State of logging. */
bool m_logging;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TimeLogger"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // __KX_TIME_LOGGER_H
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.h b/source/gameengine/Ketsji/KX_TouchEventManager.h
index cc77bccfc31..6da37d615a4 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.h
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.h
@@ -76,6 +76,12 @@ public:
SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
PHY_IPhysicsEnvironment *GetPhysicsEnvironment() { return m_physEnv; }
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_TouchEventManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_TOUCHEVENTMANAGER
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index c06acd4a873..cde67787e2f 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -97,12 +97,11 @@ bool KX_TouchSensor::Evaluate()
return result;
}
-KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,bool bFindMaterial,bool bTouchPulse,const STR_String& touchedpropname,PyTypeObject* T)
-:SCA_ISensor(gameobj,eventmgr,T),
+KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,bool bFindMaterial,bool bTouchPulse,const STR_String& touchedpropname)
+:SCA_ISensor(gameobj,eventmgr),
m_touchedpropname(touchedpropname),
m_bFindMaterial(bFindMaterial),
-m_bTouchPulse(bTouchPulse),
-m_eventmgr(eventmgr)
+m_bTouchPulse(bTouchPulse)
/*m_sumoObj(sumoObj),*/
{
// KX_TouchEventManager* touchmgr = (KX_TouchEventManager*) eventmgr;
@@ -294,13 +293,7 @@ bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_Coll
/* ------------------------------------------------------------------------- */
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_TouchSensor::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_TouchSensor",
sizeof(PyObjectPlus_Proxy),
0,
@@ -310,32 +303,18 @@ PyTypeObject KX_TouchSensor::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_TouchSensor::Parents[] = {
- &KX_TouchSensor::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_ISensor::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_TouchSensor::Methods[] = {
- //Deprecated ----->
- {"setProperty",
- (PyCFunction) KX_TouchSensor::sPySetProperty, METH_O, (PY_METHODCHAR)SetProperty_doc},
- {"getProperty",
- (PyCFunction) KX_TouchSensor::sPyGetProperty, METH_NOARGS, (PY_METHODCHAR)GetProperty_doc},
- {"getHitObject",
- (PyCFunction) KX_TouchSensor::sPyGetHitObject, METH_NOARGS, (PY_METHODCHAR)GetHitObject_doc},
- {"getHitObjectList",
- (PyCFunction) KX_TouchSensor::sPyGetHitObjectList, METH_NOARGS, (PY_METHODCHAR)GetHitObjectList_doc},
- //<-----
{NULL,NULL} //Sentinel
};
@@ -348,117 +327,8 @@ PyAttributeDef KX_TouchSensor::Attributes[] = {
{ NULL } //Sentinel
};
-PyObject* KX_TouchSensor::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_ISensor);
-}
-
-PyObject* KX_TouchSensor::py_getattro_dict() {
- py_getattro_dict_up(SCA_ISensor);
-}
-
-int KX_TouchSensor::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_ISensor);
-}
-
/* Python API */
-/* 1. setProperty */
-const char KX_TouchSensor::SetProperty_doc[] =
-"setProperty(name)\n"
-"\t- name: string\n"
-"\tSet the property or material to collide with. Use\n"
-"\tsetTouchMaterial() to switch between properties and\n"
-"\tmaterials.";
-PyObject* KX_TouchSensor::PySetProperty(PyObject* value)
-{
- ShowDeprecationWarning("setProperty()", "the propName property");
- char *nameArg= PyString_AsString(value);
- if (nameArg==NULL) {
- PyErr_SetString(PyExc_ValueError, "expected a ");
- return NULL;
- }
-
- m_touchedpropname = nameArg;
- Py_RETURN_NONE;
-}
-/* 2. getProperty */
-const char KX_TouchSensor::GetProperty_doc[] =
-"getProperty(name)\n"
-"\tReturns the property or material to collide with. Use\n"
-"\tgetTouchMaterial() to find out whether this sensor\n"
-"\tlooks for properties or materials.";
-PyObject* KX_TouchSensor::PyGetProperty() {
- ShowDeprecationWarning("getProperty()", "the propName property");
-
- return PyString_FromString(m_touchedpropname);
-}
-
-const char KX_TouchSensor::GetHitObject_doc[] =
-"getHitObject()\n"
-;
-PyObject* KX_TouchSensor::PyGetHitObject()
-{
- ShowDeprecationWarning("getHitObject()", "the hitObject property");
- /* to do: do Py_IncRef if the object is already known in Python */
- /* otherwise, this leaks memory */
- if (m_hitObject)
- {
- return m_hitObject->GetProxy();
- }
- Py_RETURN_NONE;
-}
-
-const char KX_TouchSensor::GetHitObjectList_doc[] =
-"getHitObjectList()\n"
-"\tReturn a list of the objects this object collided with,\n"
-"\tbut only those matching the property/material condition.\n";
-PyObject* KX_TouchSensor::PyGetHitObjectList()
-{
- ShowDeprecationWarning("getHitObjectList()", "the hitObjectList property");
- /* to do: do Py_IncRef if the object is already known in Python */
- /* otherwise, this leaks memory */ /* Edit, this seems ok and not to leak memory - Campbell */
- return m_colliders->GetProxy();
-}
-
-/*getTouchMaterial and setTouchMaterial were never added to the api,
-they can probably be removed with out anyone noticing*/
-
-/* 5. getTouchMaterial */
-const char KX_TouchSensor::GetTouchMaterial_doc[] =
-"getTouchMaterial()\n"
-"\tReturns KX_TRUE if this sensor looks for a specific material,\n"
-"\tKX_FALSE if it looks for a specific property.\n" ;
-PyObject* KX_TouchSensor::PyGetTouchMaterial()
-{
- ShowDeprecationWarning("getTouchMaterial()", "the useMaterial property");
- return PyInt_FromLong(m_bFindMaterial);
-}
-
-/* 6. setTouchMaterial */
-#if 0
-const char KX_TouchSensor::SetTouchMaterial_doc[] =
-"setTouchMaterial(flag)\n"
-"\t- flag: KX_TRUE or KX_FALSE.\n"
-"\tSet flag to KX_TRUE to switch on positive pulse mode,\n"
-"\tKX_FALSE to switch off positive pulse mode.\n" ;
-PyObject* KX_TouchSensor::PySetTouchMaterial(PyObject *value)
-{
- ShowDeprecationWarning("setTouchMaterial()", "the useMaterial property");
- int pulseArg = PyInt_AsLong(value);
-
- if(pulseArg ==-1 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_ValueError, "expected a bool");
- return NULL;
- }
-
- m_bFindMaterial = pulseArg != 0;
-
- Py_RETURN_NONE;
-}
-#endif
-
PyObject* KX_TouchSensor::pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_TouchSensor* self= static_cast<KX_TouchSensor*>(self_v);
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.h b/source/gameengine/Ketsji/KX_TouchSensor.h
index 476c63e89db..ad1830e05c9 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.h
+++ b/source/gameengine/Ketsji/KX_TouchSensor.h
@@ -58,7 +58,6 @@ protected:
STR_String m_touchedpropname;
bool m_bFindMaterial;
bool m_bTouchPulse; /* changes in the colliding objects trigger pulses */
- class SCA_EventManager* m_eventmgr;
class PHY_IPhysicsController* m_physCtrl;
@@ -79,8 +78,7 @@ public:
class KX_GameObject* gameobj,
bool bFindMaterial,
bool bTouchPulse,
- const STR_String& touchedpropname,
- PyTypeObject* T=&Type) ;
+ const STR_String& touchedpropname) ;
virtual ~KX_TouchSensor();
virtual CValue* GetReplica();
@@ -122,27 +120,6 @@ public:
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- //Deprecated ----->
- /* 1. setProperty */
- KX_PYMETHOD_DOC_O(KX_TouchSensor,SetProperty);
- /* 2. getProperty */
- KX_PYMETHOD_DOC_NOARGS(KX_TouchSensor,GetProperty);
- /* 3. getHitObject */
- KX_PYMETHOD_DOC_NOARGS(KX_TouchSensor,GetHitObject);
- /* 4. getHitObject */
- KX_PYMETHOD_DOC_NOARGS(KX_TouchSensor,GetHitObjectList);
- /* 5. getTouchMaterial */
- KX_PYMETHOD_DOC_NOARGS(KX_TouchSensor,GetTouchMaterial);
-#if 0
- /* 6. setTouchMaterial */
- KX_PYMETHOD_DOC_O(KX_TouchSensor,SetTouchMaterial);
-#endif
- //<-----
-
static PyObject* pyattr_get_object_hit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_object_hit_list(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
index 5a50d0fb944..ace1cf8a6f4 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
@@ -59,10 +59,8 @@ KX_TrackToActuator::KX_TrackToActuator(SCA_IObject *gameobj,
int time,
bool allow3D,
int trackflag,
- int upflag,
- PyTypeObject* T)
- :
- SCA_IActuator(gameobj, T)
+ int upflag)
+ : SCA_IActuator(gameobj, KX_ACT_TRACKTO)
{
m_time = time;
m_allow3D = allow3D;
@@ -74,7 +72,6 @@ KX_TrackToActuator::KX_TrackToActuator(SCA_IObject *gameobj,
if (m_object)
m_object->RegisterActuator(this);
- if (gameobj->isA(&KX_GameObject::Type))
{
// if the object is vertex parented, don't check parent orientation as the link is broken
if (!((KX_GameObject*)gameobj)->IsVertexParent()){
@@ -434,13 +431,7 @@ bool KX_TrackToActuator::Update(double curtime, bool frame)
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_TrackToActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_TrackToActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -450,34 +441,18 @@ PyTypeObject KX_TrackToActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-
-
-PyParentObject KX_TrackToActuator::Parents[] = {
- &KX_TrackToActuator::Type,
- &SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
};
-
-
PyMethodDef KX_TrackToActuator::Methods[] = {
- // ---> deprecated
- {"setTime", (PyCFunction) KX_TrackToActuator::sPySetTime, METH_VARARGS, (PY_METHODCHAR)SetTime_doc},
- {"getTime", (PyCFunction) KX_TrackToActuator::sPyGetTime, METH_NOARGS, (PY_METHODCHAR)GetTime_doc},
- {"setUse3D", (PyCFunction) KX_TrackToActuator::sPySetUse3D, METH_VARARGS, (PY_METHODCHAR)SetUse3D_doc},
- {"getUse3D", (PyCFunction) KX_TrackToActuator::sPyGetUse3D, METH_NOARGS, (PY_METHODCHAR)GetUse3D_doc},
- {"setObject", (PyCFunction) KX_TrackToActuator::sPySetObject, METH_O, (PY_METHODCHAR)SetObject_doc},
- {"getObject", (PyCFunction) KX_TrackToActuator::sPyGetObject, METH_VARARGS, (PY_METHODCHAR)GetObject_doc},
-
{NULL,NULL} //Sentinel
};
@@ -517,137 +492,4 @@ int KX_TrackToActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUT
return PY_SET_ATTR_SUCCESS;
}
-
-PyObject* KX_TrackToActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_TrackToActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_TrackToActuator::py_setattro(PyObject *attr, PyObject* value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-/* 1. setObject */
-const char KX_TrackToActuator::SetObject_doc[] =
-"setObject(object)\n"
-"\t- object: KX_GameObject, string or None\n"
-"\tSet the object to track with the parent of this actuator.\n";
-PyObject* KX_TrackToActuator::PySetObject(PyObject* value)
-{
- KX_GameObject *gameobj;
-
- ShowDeprecationWarning("setObject()", "the object property");
-
- if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.setObject(value): KX_TrackToActuator"))
- return NULL; // ConvertPythonToGameObject sets the error
-
- if (m_object != NULL)
- m_object->UnregisterActuator(this);
-
- m_object = (SCA_IObject*)gameobj;
- if (m_object)
- m_object->RegisterActuator(this);
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 2. getObject */
-const char KX_TrackToActuator::GetObject_doc[] =
-"getObject(name_only = 1)\n"
-"name_only - optional arg, when true will return the KX_GameObject rather then its name\n"
-"\tReturns the object to track with the parent of this actuator\n";
-PyObject* KX_TrackToActuator::PyGetObject(PyObject* args)
-{
- int ret_name_only = 1;
-
- ShowDeprecationWarning("getObject()", "the object property");
-
- if (!PyArg_ParseTuple(args, "|i:getObject", &ret_name_only))
- return NULL;
-
- if (!m_object)
- Py_RETURN_NONE;
-
- if (ret_name_only)
- return PyString_FromString(m_object->GetName());
- else
- return m_object->GetProxy();
-}
-
-
-
-/* 3. setTime */
-const char KX_TrackToActuator::SetTime_doc[] =
-"setTime(time)\n"
-"\t- time: integer\n"
-"\tSet the time in frames with which to delay the tracking motion.\n";
-PyObject* KX_TrackToActuator::PySetTime(PyObject* args)
-{
- ShowDeprecationWarning("setTime()", "the timer property");
- int timeArg;
-
- if (!PyArg_ParseTuple(args, "i:setTime", &timeArg))
- {
- return NULL;
- }
-
- m_time= timeArg;
-
- Py_RETURN_NONE;
-}
-
-
-
-/* 4.getTime */
-const char KX_TrackToActuator::GetTime_doc[] =
-"getTime()\n"
-"\t- time: integer\n"
-"\tReturn the time in frames with which the tracking motion is delayed.\n";
-PyObject* KX_TrackToActuator::PyGetTime()
-{
- ShowDeprecationWarning("getTime()", "the timer property");
- return PyInt_FromLong(m_time);
-}
-
-
-
-/* 5. getUse3D */
-const char KX_TrackToActuator::GetUse3D_doc[] =
-"getUse3D()\n"
-"\tReturns 1 if the motion is allowed to extend in the z-direction.\n";
-PyObject* KX_TrackToActuator::PyGetUse3D()
-{
- ShowDeprecationWarning("setTime()", "the use3D property");
- return PyInt_FromLong(!(m_allow3D == 0));
-}
-
-
-
-/* 6. setUse3D */
-const char KX_TrackToActuator::SetUse3D_doc[] =
-"setUse3D(value)\n"
-"\t- value: 0 or 1\n"
-"\tSet to 1 to allow the tracking motion to extend in the z-direction,\n"
-"\tset to 0 to lock the tracking motion to the x-y plane.\n";
-PyObject* KX_TrackToActuator::PySetUse3D(PyObject* args)
-{
- ShowDeprecationWarning("setTime()", "the use3D property");
- int boolArg;
-
- if (!PyArg_ParseTuple(args, "i:setUse3D", &boolArg)) {
- return NULL;
- }
-
- m_allow3D = !(boolArg == 0);
-
- Py_RETURN_NONE;
-}
-
/* eof */
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.h b/source/gameengine/Ketsji/KX_TrackToActuator.h
index c4cc2b1f062..bbfc1d17576 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.h
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.h
@@ -56,7 +56,7 @@ class KX_TrackToActuator : public SCA_IActuator
public:
KX_TrackToActuator(SCA_IObject* gameobj, SCA_IObject *ob, int time,
- bool threedee,int trackflag,int upflag, PyTypeObject* T=&Type);
+ bool threedee,int trackflag,int upflag);
virtual ~KX_TrackToActuator();
virtual CValue* GetReplica() {
KX_TrackToActuator* replica = new KX_TrackToActuator(*this);
@@ -70,26 +70,10 @@ class KX_TrackToActuator : public SCA_IActuator
virtual bool Update(double curtime, bool frame);
/* Python part */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject* value);
/* These are used to get and set m_ob */
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);
-
- /* 1. setObject */
- KX_PYMETHOD_DOC_O(KX_TrackToActuator,SetObject);
- /* 2. getObject */
- KX_PYMETHOD_DOC_VARARGS(KX_TrackToActuator,GetObject);
- /* 3. setTime */
- KX_PYMETHOD_DOC_VARARGS(KX_TrackToActuator,SetTime);
- /* 4. getTime */
- KX_PYMETHOD_DOC_NOARGS(KX_TrackToActuator,GetTime);
- /* 5. getUse3D */
- KX_PYMETHOD_DOC_NOARGS(KX_TrackToActuator,GetUse3D);
- /* 6. setUse3D */
- KX_PYMETHOD_DOC_VARARGS(KX_TrackToActuator,SetUse3D);
}; /* 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 8146d04a878..1f46cbf53be 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
@@ -16,8 +16,8 @@
KX_VehicleWrapper::KX_VehicleWrapper(
PHY_IVehicle* vehicle,
- PHY_IPhysicsEnvironment* physenv,PyTypeObject *T) :
- PyObjectPlus(T),
+ PHY_IPhysicsEnvironment* physenv) :
+ PyObjectPlus(),
m_vehicle(vehicle),
m_physenv(physenv)
{
@@ -127,13 +127,13 @@ PyObject* KX_VehicleWrapper::PyGetWheelOrientationQuaternion(PyObject* args)
PyObject* KX_VehicleWrapper::PyGetNumWheels(PyObject* args)
{
- return PyInt_FromLong(m_vehicle->GetNumWheels());
+ return PyLong_FromSsize_t(m_vehicle->GetNumWheels());
}
PyObject* KX_VehicleWrapper::PyGetConstraintId(PyObject* args)
{
- return PyInt_FromLong(m_vehicle->GetUserConstraintId());
+ return PyLong_FromSsize_t(m_vehicle->GetUserConstraintId());
}
@@ -264,7 +264,7 @@ PyObject* KX_VehicleWrapper::PySetSteeringValue(PyObject* args)
PyObject* KX_VehicleWrapper::PyGetConstraintType(PyObject* args)
{
- return PyInt_FromLong(m_vehicle->GetUserConstraintType());
+ return PyLong_FromSsize_t(m_vehicle->GetUserConstraintType());
}
@@ -273,51 +273,27 @@ PyObject* KX_VehicleWrapper::PyGetConstraintType(PyObject* args)
//python specific stuff
PyTypeObject KX_VehicleWrapper::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
- "KX_VehicleWrapper",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
- 0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_VehicleWrapper::Parents[] = {
- &KX_VehicleWrapper::Type,
+ "KX_VehicleWrapper",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&PyObjectPlus::Type,
- NULL
-};
-
-PyObject* KX_VehicleWrapper::py_getattro(PyObject *attr)
-{
- //here you can search for existing data members (like mass,friction etc.)
- py_getattro_up(PyObjectPlus);
-}
-
-PyObject* KX_VehicleWrapper::py_getattro_dict() {
- py_getattro_dict_up(PyObjectPlus);
-}
-
-int KX_VehicleWrapper::py_setattro(PyObject *attr,PyObject* value)
-{
- py_setattro_up(PyObjectPlus);
+ 0,0,0,0,0,0,
+ py_base_new
};
-
PyMethodDef KX_VehicleWrapper::Methods[] = {
{"addWheel",(PyCFunction) KX_VehicleWrapper::sPyAddWheel, METH_VARARGS},
{"getNumWheels",(PyCFunction) KX_VehicleWrapper::sPyGetNumWheels, METH_VARARGS},
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.h b/source/gameengine/Ketsji/KX_VehicleWrapper.h
index c2b5e3d9251..d7f2da5cd7c 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.h
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.h
@@ -12,14 +12,11 @@ class PHY_IMotionState;
class KX_VehicleWrapper : public PyObjectPlus
{
Py_Header;
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
std::vector<PHY_IMotionState*> m_motionStates;
public:
- KX_VehicleWrapper(PHY_IVehicle* vehicle,class PHY_IPhysicsEnvironment* physenv,PyTypeObject *T = &Type);
+ KX_VehicleWrapper(PHY_IVehicle* vehicle,class PHY_IPhysicsEnvironment* physenv);
virtual ~KX_VehicleWrapper ();
int getConstraintId();
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.cpp b/source/gameengine/Ketsji/KX_VertexProxy.cpp
index 4b0ad083473..6a47dec181b 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.cpp
+++ b/source/gameengine/Ketsji/KX_VertexProxy.cpp
@@ -37,13 +37,7 @@
#include "KX_PyMath.h"
PyTypeObject KX_VertexProxy::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_VertexProxy",
sizeof(PyObjectPlus_Proxy),
0,
@@ -53,18 +47,15 @@ PyTypeObject KX_VertexProxy::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-};
-
-PyParentObject KX_VertexProxy::Parents[] = {
- &KX_VertexProxy::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&CValue::Type,
- &PyObjectPlus::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
PyMethodDef KX_VertexProxy::Methods[] = {
@@ -85,37 +76,38 @@ PyMethodDef KX_VertexProxy::Methods[] = {
PyAttributeDef KX_VertexProxy::Attributes[] = {
//KX_PYATTRIBUTE_TODO("DummyProps"),
-
+
KX_PYATTRIBUTE_DUMMY("x"),
KX_PYATTRIBUTE_DUMMY("y"),
KX_PYATTRIBUTE_DUMMY("z"),
-
+
KX_PYATTRIBUTE_DUMMY("r"),
KX_PYATTRIBUTE_DUMMY("g"),
KX_PYATTRIBUTE_DUMMY("b"),
KX_PYATTRIBUTE_DUMMY("a"),
-
+
KX_PYATTRIBUTE_DUMMY("u"),
KX_PYATTRIBUTE_DUMMY("v"),
-
+
KX_PYATTRIBUTE_DUMMY("u2"),
KX_PYATTRIBUTE_DUMMY("v2"),
-
+
KX_PYATTRIBUTE_DUMMY("XYZ"),
KX_PYATTRIBUTE_DUMMY("UV"),
-
+
KX_PYATTRIBUTE_DUMMY("color"),
KX_PYATTRIBUTE_DUMMY("colour"),
-
+
KX_PYATTRIBUTE_DUMMY("normal"),
-
+
{ NULL } //Sentinel
};
+#if 0
PyObject*
KX_VertexProxy::py_getattro(PyObject *attr)
{
- char *attr_str= PyString_AsString(attr);
+ char *attr_str= _PyUnicode_AsString(attr);
if (attr_str[1]=='\0') { // Group single letters
// pos
if (attr_str[0]=='x')
@@ -141,8 +133,8 @@ KX_VertexProxy::py_getattro(PyObject *attr)
if (attr_str[0]=='v')
return PyFloat_FromDouble(m_vertex->getUV1()[1]);
}
-
-
+
+
if (!strcmp(attr_str, "XYZ"))
return PyObjectFrom(MT_Vector3(m_vertex->getXYZ()));
@@ -156,22 +148,21 @@ KX_VertexProxy::py_getattro(PyObject *attr)
color /= 255.0;
return PyObjectFrom(color);
}
-
+
if (!strcmp(attr_str, "normal"))
{
return PyObjectFrom(MT_Vector3(m_vertex->getNormal()));
}
-
+
py_getattro_up(CValue);
}
+#endif
-PyObject* KX_VertexProxy::py_getattro_dict() {
- py_getattro_dict_up(CValue);
-}
+#if 0
int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
{
- char *attr_str= PyString_AsString(attr);
+ char *attr_str= _PyUnicode_AsString(attr);
if (PySequence_Check(pyvalue))
{
if (!strcmp(attr_str, "XYZ"))
@@ -185,7 +176,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
}
return PY_SET_ATTR_FAIL;
}
-
+
if (!strcmp(attr_str, "UV"))
{
MT_Point2 vec;
@@ -197,7 +188,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
}
return PY_SET_ATTR_FAIL;
}
-
+
if (!strcmp(attr_str, "color") || !strcmp(attr_str, "colour"))
{
MT_Vector4 vec;
@@ -209,7 +200,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
}
return PY_SET_ATTR_FAIL;
}
-
+
if (!strcmp(attr_str, "normal"))
{
MT_Vector3 vec;
@@ -222,7 +213,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
return PY_SET_ATTR_FAIL;
}
}
-
+
if (PyFloat_Check(pyvalue))
{
float val = PyFloat_AsDouble(pyvalue);
@@ -235,7 +226,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
-
+
if (!strcmp(attr_str, "y"))
{
pos.y() = val;
@@ -243,7 +234,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
-
+
if (!strcmp(attr_str, "z"))
{
pos.z() = val;
@@ -251,7 +242,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
-
+
// uv
MT_Point2 uv = m_vertex->getUV1();
if (!strcmp(attr_str, "u"))
@@ -287,7 +278,7 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
m_mesh->SetMeshModified(true);
return PY_SET_ATTR_SUCCESS;
}
-
+
// col
unsigned int icol = *((const unsigned int *)m_vertex->getRGBA());
unsigned char *cp = (unsigned char*) &icol;
@@ -321,9 +312,10 @@ int KX_VertexProxy::py_setattro(PyObject *attr, PyObject *pyvalue)
return PY_SET_ATTR_SUCCESS;
}
}
-
+
return CValue::py_setattro(attr, pyvalue);
}
+#endif
KX_VertexProxy::KX_VertexProxy(KX_MeshProxy*mesh, RAS_TexVert* vertex)
: m_vertex(vertex),
@@ -339,7 +331,7 @@ KX_VertexProxy::~KX_VertexProxy()
// stuff for cvalue related things
CValue* KX_VertexProxy::Calc(VALUE_OPERATOR, CValue *) { return NULL;}
-CValue* KX_VertexProxy::CalcFinal(VALUE_DATA_TYPE, VALUE_OPERATOR, CValue *) { return NULL;}
+CValue* KX_VertexProxy::CalcFinal(VALUE_DATA_TYPE, VALUE_OPERATOR, CValue *) { return NULL;}
STR_String sVertexName="vertex";
const STR_String & KX_VertexProxy::GetText() {return sVertexName;};
double KX_VertexProxy::GetNumber() { return -1;}
@@ -348,7 +340,7 @@ void KX_VertexProxy::SetName(const char *) { };
CValue* KX_VertexProxy::GetReplica() { return NULL;}
// stuff for python integration
-
+
PyObject* KX_VertexProxy::PyGetXYZ()
{
return PyObjectFrom(MT_Point3(m_vertex->getXYZ()));
@@ -359,7 +351,7 @@ PyObject* KX_VertexProxy::PySetXYZ(PyObject* value)
MT_Point3 vec;
if (!PyVecTo(value, vec))
return NULL;
-
+
m_vertex->SetXYZ(vec);
m_mesh->SetMeshModified(true);
Py_RETURN_NONE;
@@ -375,7 +367,7 @@ PyObject* KX_VertexProxy::PySetNormal(PyObject* value)
MT_Vector3 vec;
if (!PyVecTo(value, vec))
return NULL;
-
+
m_vertex->SetNormal(vec);
m_mesh->SetMeshModified(true);
Py_RETURN_NONE;
@@ -385,18 +377,18 @@ PyObject* KX_VertexProxy::PySetNormal(PyObject* value)
PyObject* KX_VertexProxy::PyGetRGBA()
{
int *rgba = (int *) m_vertex->getRGBA();
- return PyInt_FromLong(*rgba);
+ return PyLong_FromSsize_t(*rgba);
}
PyObject* KX_VertexProxy::PySetRGBA(PyObject* value)
{
- if PyInt_Check(value) {
- int rgba = PyInt_AsLong(value);
+ if PyLong_Check(value) {
+ int rgba = PyLong_AsSsize_t(value);
m_vertex->SetRGBA(rgba);
m_mesh->SetMeshModified(true);
Py_RETURN_NONE;
}
- else {
+ else {
MT_Vector4 vec;
if (PyVecTo(value, vec))
{
@@ -405,7 +397,7 @@ PyObject* KX_VertexProxy::PySetRGBA(PyObject* value)
Py_RETURN_NONE;
}
}
-
+
PyErr_SetString(PyExc_TypeError, "vert.setRGBA(value): KX_VertexProxy, expected a 4D vector or an int");
return NULL;
}
@@ -421,7 +413,7 @@ PyObject* KX_VertexProxy::PySetUV(PyObject* value)
MT_Point2 vec;
if (!PyVecTo(value, vec))
return NULL;
-
+
m_vertex->SetUV(vec);
m_mesh->SetMeshModified(true);
Py_RETURN_NONE;
@@ -436,14 +428,14 @@ PyObject* KX_VertexProxy::PySetUV2(PyObject* args)
{
MT_Point2 vec;
unsigned int unit= RAS_TexVert::SECOND_UV;
-
+
PyObject* list= NULL;
if(!PyArg_ParseTuple(args, "O|i:setUV2", &list, &unit))
return NULL;
-
+
if (!PyVecTo(list, vec))
return NULL;
-
+
m_vertex->SetFlag((m_vertex->getFlag()|RAS_TexVert::SECOND_UV));
m_vertex->SetUnit(unit);
m_vertex->SetUV2(vec);
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.h b/source/gameengine/Ketsji/KX_VertexProxy.h
index 42db5fbc322..13c57e9f556 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.h
+++ b/source/gameengine/Ketsji/KX_VertexProxy.h
@@ -53,9 +53,6 @@ public:
// stuff for python integration
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
KX_PYMETHOD_NOARGS(KX_VertexProxy,GetXYZ);
KX_PYMETHOD_O(KX_VertexProxy,SetXYZ);
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
index d848065ad73..5b0f6e6e9f2 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
@@ -39,10 +39,9 @@ KX_VisibilityActuator::KX_VisibilityActuator(
SCA_IObject* gameobj,
bool visible,
bool occlusion,
- bool recursive,
- PyTypeObject* T
+ bool recursive
)
- : SCA_IActuator(gameobj,T),
+ : SCA_IActuator(gameobj, KX_ACT_VISIBILITY),
m_visible(visible),
m_occlusion(occlusion),
m_recursive(recursive)
@@ -92,13 +91,7 @@ KX_VisibilityActuator::Update()
/* Integration hooks ------------------------------------------------------- */
PyTypeObject KX_VisibilityActuator::Type = {
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /* ob_size */
-#endif
"KX_VisibilityActuator",
sizeof(PyObjectPlus_Proxy),
0,
@@ -108,29 +101,18 @@ PyTypeObject KX_VisibilityActuator::Type = {
0,
0,
py_base_repr,
- 0,0,0,0,0,0,
- py_base_getattro,
- py_base_setattro,
0,0,0,0,0,0,0,0,0,
- Methods
-
-};
-
-PyParentObject
-KX_VisibilityActuator::Parents[] = {
- &KX_VisibilityActuator::Type,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
&SCA_IActuator::Type,
- &SCA_ILogicBrick::Type,
- &CValue::Type,
- NULL
+ 0,0,0,0,0,0,
+ py_base_new
};
-PyMethodDef
-KX_VisibilityActuator::Methods[] = {
- // Deprecated ----->
- {"set", (PyCFunction) KX_VisibilityActuator::sPySetVisible, METH_VARARGS,
- (PY_METHODCHAR) SetVisible_doc},
- // <-----
+PyMethodDef KX_VisibilityActuator::Methods[] = {
{NULL,NULL} //Sentinel
};
@@ -140,41 +122,3 @@ PyAttributeDef KX_VisibilityActuator::Attributes[] = {
KX_PYATTRIBUTE_BOOL_RW("useRecursion", KX_VisibilityActuator, m_recursive),
{ NULL } //Sentinel
};
-
-PyObject* KX_VisibilityActuator::py_getattro(PyObject *attr)
-{
- py_getattro_up(SCA_IActuator);
-}
-
-PyObject* KX_VisibilityActuator::py_getattro_dict() {
- py_getattro_dict_up(SCA_IActuator);
-}
-
-int KX_VisibilityActuator::py_setattro(PyObject *attr, PyObject *value)
-{
- py_setattro_up(SCA_IActuator);
-}
-
-
-/* set visibility ---------------------------------------------------------- */
-const char
-KX_VisibilityActuator::SetVisible_doc[] =
-"setVisible(visible?)\n"
-"\t - visible? : Make the object visible? (KX_TRUE, KX_FALSE)"
-"\tSet the properties of the actuator.\n";
-PyObject*
-
-KX_VisibilityActuator::PySetVisible(PyObject* args) {
- int vis;
- ShowDeprecationWarning("SetVisible()", "the visible property");
-
- if(!PyArg_ParseTuple(args, "i:setVisible", &vis)) {
- return NULL;
- }
-
- m_visible = PyArgToBool(vis);
-
- Py_RETURN_NONE;
-}
-
-
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.h b/source/gameengine/Ketsji/KX_VisibilityActuator.h
index 45aba50f645..e75551644a4 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.h
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.h
@@ -48,9 +48,7 @@ class KX_VisibilityActuator : public SCA_IActuator
SCA_IObject* gameobj,
bool visible,
bool occlusion,
- bool recursive,
- PyTypeObject* T=&Type
- );
+ bool recursive);
virtual
~KX_VisibilityActuator(
@@ -69,15 +67,6 @@ class KX_VisibilityActuator : public SCA_IActuator
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
- virtual PyObject* py_getattro(PyObject *attr);
- virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *value);
-
- // Deprecated ----->
- KX_PYMETHOD_DOC_VARARGS(KX_VisibilityActuator,SetVisible);
- // <-----
-
-
};
#endif
diff --git a/source/gameengine/Ketsji/KX_WorldInfo.h b/source/gameengine/Ketsji/KX_WorldInfo.h
index fe4e0c51b24..2c2346ca38e 100644
--- a/source/gameengine/Ketsji/KX_WorldInfo.h
+++ b/source/gameengine/Ketsji/KX_WorldInfo.h
@@ -31,6 +31,10 @@
#include "MT_Scalar.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class MT_CmMatrix4x4;
class KX_WorldInfo
@@ -59,6 +63,13 @@ public:
virtual void setMistColorRed(float)=0;
virtual void setMistColorGreen(float)=0;
virtual void setMistColorBlue(float)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldInfo"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_WORLDINFO_H
diff --git a/source/gameengine/Ketsji/KX_WorldIpoController.h b/source/gameengine/Ketsji/KX_WorldIpoController.h
index d90c03d09ee..8622d80a35f 100644
--- a/source/gameengine/Ketsji/KX_WorldIpoController.h
+++ b/source/gameengine/Ketsji/KX_WorldIpoController.h
@@ -90,6 +90,13 @@ public:
};
void AddInterpolator(KX_IInterpolator* interp);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_WorldIpoController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // KX_LIGHTIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile
index 8e91eb6ff9a..0e9e657cc16 100644
--- a/source/gameengine/Ketsji/Makefile
+++ b/source/gameengine/Ketsji/Makefile
@@ -43,10 +43,10 @@ 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_SOUNDSYSTEM)/include
-CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_SOLID)/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
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index b09267b79ff..5f38020780b 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -4,14 +4,13 @@ import sys
Import ('env')
sources = env.Glob('*.cpp')
-defs = ''
+defs = []
incs = '. #source/blender/python/generic' # Only for Mathutils! and bpy_internal_import.h, be very careful
incs += ' #source/kernel/gen_system #intern/string #intern/guardedalloc'
incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer'
-incs += ' #intern/SoundSystem #intern/SoundSystem/include #intern/SoundSystem/openal'
-incs += ' #intern/SoundSystem/dummy #intern/SoundSystem/intern #source/gameengine/Converter'
+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/blender/blenkernel #source/blender #source/blender/editors/include'
@@ -28,11 +27,10 @@ incs += ' ' + env['BF_OPENGL_INC']
if env['WITH_BF_SDL']:
incs += ' ' + env['BF_SDL_INC']
else:
- defs += ' DISABLE_SDL'
+ defs.append('DISABLE_SDL')
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ if env['BF_DEBUG']:
+ defs.append('_DEBUG') # for Python
-env.BlenderLib ( 'bf_ketsji', sources, Split(incs), Split(defs), libtype=['core','player'], priority=[320, 60], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_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
index 51bc0f7d39f..bcb4b9098e7 100644
--- a/source/gameengine/Makefile
+++ b/source/gameengine/Makefile
@@ -38,7 +38,7 @@ DIRS += Expressions GameLogic Ketsji Rasterizer SceneGraph
DIRS += Network Physics VideoTexture
ifeq ($(WITH_BF_BLENDERGAMEENGINE),true)
- DIRS += GamePlayer
+# DIRS += GamePlayer
endif
include nan_subdirs.mk
diff --git a/source/gameengine/Network/CMakeLists.txt b/source/gameengine/Network/CMakeLists.txt
index 933f0550d0b..1e467a7d08d 100644
--- a/source/gameengine/Network/CMakeLists.txt
+++ b/source/gameengine/Network/CMakeLists.txt
@@ -27,10 +27,10 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/moto/include
+ .
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/moto/include
)
BLENDERLIB(bf_ngnetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
index 0b958920dc5..18e3d8ef496 100644
--- a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
+++ b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
@@ -27,10 +27,10 @@
SET(SRC NG_LoopBackNetworkDeviceInterface.cpp)
SET(INC
- .
- ../../../../source/kernel/gen_system
- ../../../../intern/string
- ../../../../source/gameengine/Network
+ .
+ ../../../../source/kernel/gen_system
+ ../../../../intern/string
+ ../../../../source/gameengine/Network
)
BLENDERLIB(bf_loopbacknetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/SConscript b/source/gameengine/Network/LoopBackNetwork/SConscript
index be6545b4fd6..dd23e1327eb 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, 155] )
+env.BlenderLib ( 'bf_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['core','player'], priority=[400,135] )
diff --git a/source/gameengine/Network/NG_NetworkDeviceInterface.h b/source/gameengine/Network/NG_NetworkDeviceInterface.h
index 4a47774a762..2a2a909a04d 100644
--- a/source/gameengine/Network/NG_NetworkDeviceInterface.h
+++ b/source/gameengine/Network/NG_NetworkDeviceInterface.h
@@ -76,6 +76,13 @@ public:
*/
virtual STR_String GetNetworkVersion(void)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkDeviceInterface"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //NG_NETWORKDEVICEINTERFACE_H
diff --git a/source/gameengine/Network/NG_NetworkMessage.h b/source/gameengine/Network/NG_NetworkMessage.h
index 687c8120eca..a2f76dc1fae 100644
--- a/source/gameengine/Network/NG_NetworkMessage.h
+++ b/source/gameengine/Network/NG_NetworkMessage.h
@@ -32,6 +32,10 @@
#include "STR_HashedString.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class NG_NetworkMessage
{
static int s_nextID;
@@ -122,6 +126,13 @@ public:
int GetMessageID() {
return m_uniqueMessageID;
}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkMessage"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //NG_NETWORKMESSAGE_H
diff --git a/source/gameengine/Network/NG_NetworkObject.h b/source/gameengine/Network/NG_NetworkObject.h
index c01d76a47fc..4bf636bf011 100644
--- a/source/gameengine/Network/NG_NetworkObject.h
+++ b/source/gameengine/Network/NG_NetworkObject.h
@@ -32,6 +32,10 @@
#include "STR_String.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class NG_NetworkObject
{
STR_String m_name;
@@ -39,6 +43,13 @@ public:
NG_NetworkObject();
~NG_NetworkObject();
const STR_String& GetName();
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //NG_NETWORKOBJECT_H
diff --git a/source/gameengine/Network/NG_NetworkScene.h b/source/gameengine/Network/NG_NetworkScene.h
index fc6367c3526..d5d6e8e0534 100644
--- a/source/gameengine/Network/NG_NetworkScene.h
+++ b/source/gameengine/Network/NG_NetworkScene.h
@@ -34,6 +34,10 @@
#include "STR_HashedString.h"
#include <vector>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
//MSVC defines SendMessage as a win api function, even though we aren't using it
#ifdef SendMessage
#undef SendMessage
@@ -52,7 +56,7 @@ class NG_NetworkScene
TMessageMap m_messagesBySenderName;
TMessageMap m_messagesBySubject;
-public:
+public:
NG_NetworkScene(NG_NetworkDeviceInterface *nic);
~NG_NetworkScene();
@@ -100,6 +104,13 @@ protected:
* @param map Message map with messages.
*/
void ClearMessageMap(TMessageMap& map);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:NG_NetworkScene"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__NG_NETWORKSCENE_H
diff --git a/source/gameengine/Network/SConscript b/source/gameengine/Network/SConscript
index 804851973af..3883dc71c9c 100644
--- a/source/gameengine/Network/SConscript
+++ b/source/gameengine/Network/SConscript
@@ -5,4 +5,4 @@ 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, 150] )
+env.BlenderLib ( 'bf_ngnetwork', sources, Split(incs), [], libtype=['core','player'], priority=[400,130] )
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index 02f2aa635af..da885122a4f 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -27,24 +27,23 @@
SET(SRC CcdPhysicsEnvironment.cpp CcdPhysicsController.cpp CcdGraphicController.cpp)
SET(INC
- .
- ../common
- ../../../../extern/bullet2/src
- ../../../../extern/glew/include
- ../../../../intern/moto/include
- ../../../../intern/guardedalloc
- ../../../kernel/gen_system
- ../../../../intern/string
- ../../../../intern/SoundSystem
- ../../Rasterizer
- ../../Ketsji
- ../../Expressions
- ../../GameLogic
- ../../SceneGraph
- ../../../../source/blender/makesdna
- ../../../../source/blender/blenlib
- ../../../../source/blender/blenkernel
- ${PYTHON_INC}
+ .
+ ../common
+ ../../../../extern/bullet2/src
+ ../../../../extern/glew/include
+ ../../../../intern/moto/include
+ ../../../../intern/guardedalloc
+ ../../../kernel/gen_system
+ ../../../../intern/string
+ ../../Rasterizer
+ ../../Ketsji
+ ../../Expressions
+ ../../GameLogic
+ ../../SceneGraph
+ ../../../../source/blender/makesdna
+ ../../../../source/blender/blenlib
+ ../../../../source/blender/blenkernel
+ ${PYTHON_INC}
)
BLENDERLIB(bf_bullet "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.h b/source/gameengine/Physics/Bullet/CcdGraphicController.h
index b0626f902c2..99885eb99ee 100644
--- a/source/gameengine/Physics/Bullet/CcdGraphicController.h
+++ b/source/gameengine/Physics/Bullet/CcdGraphicController.h
@@ -75,6 +75,12 @@ private:
btBroadphaseProxy* m_handle;
void* m_newClientInfo;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdGraphicController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //BULLET2_PHYSICSCONTROLLER_H
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 3c41a856660..df8dc3560ac 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -22,6 +22,8 @@ subject to the following restrictions:
#include "PHY_IMotionState.h"
#include "CcdPhysicsEnvironment.h"
#include "RAS_MeshObject.h"
+#include "KX_GameObject.h"
+
#include "BulletSoftBody/btSoftBody.h"
#include "BulletSoftBody//btSoftBodyInternals.h"
#include "BulletSoftBody/btSoftBodyHelpers.h"
@@ -529,7 +531,7 @@ void CcdPhysicsController::CreateRigidbody()
}
-static void DeleteBulletShape(btCollisionShape* shape)
+static void DeleteBulletShape(btCollisionShape* shape, bool free)
{
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
@@ -539,21 +541,13 @@ static void DeleteBulletShape(btCollisionShape* shape)
if (meshInterface)
delete meshInterface;
}
- delete shape;
+ if(free) {
+ delete shape;
+ }
}
-CcdPhysicsController::~CcdPhysicsController()
+bool CcdPhysicsController::DeleteControllerShape( )
{
- //will be reference counted, due to sharing
- if (m_cci.m_physicsEnv)
- m_cci.m_physicsEnv->removeCcdPhysicsController(this);
-
- if (m_MotionState)
- delete m_MotionState;
- if (m_bulletMotionState)
- delete m_bulletMotionState;
- delete m_object;
-
if (m_collisionShape)
{
// collision shape is always unique to the controller, can delete it here
@@ -565,11 +559,64 @@ CcdPhysicsController::~CcdPhysicsController()
for (int i=numChild-1 ; i >= 0; i--)
{
btCollisionShape* childShape = compoundShape->getChildShape(i);
- DeleteBulletShape(childShape);
+ DeleteBulletShape(childShape, true);
}
}
- DeleteBulletShape(m_collisionShape);
+ DeleteBulletShape(m_collisionShape, true);
+
+ return true;
}
+
+ return false;
+}
+
+bool CcdPhysicsController::ReplaceControllerShape(btCollisionShape *newShape)
+{
+
+ /* Note, deleting the previous collision shape must be done alredy */
+ /* if (m_collisionShape) DeleteControllerShape(); */
+
+ m_object->setCollisionShape(newShape);
+ m_collisionShape= newShape;
+ m_cci.m_collisionShape= newShape;
+
+
+ /* Copied from CcdPhysicsEnvironment::addCcdPhysicsController() */
+
+ /* without this, an object can rest on the old physics mesh
+ * and not move to account for the physics mesh, even with 'nosleep' */
+ btSoftRigidDynamicsWorld* dw= GetPhysicsEnvironment()->getDynamicsWorld();
+ btCollisionObjectArray &obarr= dw->getCollisionObjectArray();
+ btCollisionObject *ob;
+ btBroadphaseProxy* proxy;
+
+ for(int i= 0; i < obarr.size(); i++) {
+ ob= obarr[i];
+ if (ob->getCollisionShape() == newShape); {
+ proxy = obarr[i]->getBroadphaseHandle();
+
+ if(proxy)
+ dw->getPairCache()->cleanProxyFromPairs(proxy,dw->getDispatcher());
+ }
+ }
+
+ return true;
+}
+
+CcdPhysicsController::~CcdPhysicsController()
+{
+ //will be reference counted, due to sharing
+ if (m_cci.m_physicsEnv)
+ m_cci.m_physicsEnv->removeCcdPhysicsController(this);
+
+ if (m_MotionState)
+ delete m_MotionState;
+ if (m_bulletMotionState)
+ delete m_bulletMotionState;
+ delete m_object;
+
+ DeleteControllerShape();
+
if (m_shapeInfo)
{
m_shapeInfo->Release();
@@ -1026,7 +1073,7 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
const btVector3& angFac = body->getAngularFactor();
- btVector3 tmpFac(0,0,1);
+ btVector3 tmpFac(1,1,1);
body->setAngularFactor(tmpFac);
body->applyTorque(torque);
body->setAngularFactor(angFac);
@@ -1264,7 +1311,7 @@ PHY_IPhysicsController* CcdPhysicsController::GetReplica()
if (m_shapeInfo)
{
// This situation does not normally happen
- cinfo.m_collisionShape = m_shapeInfo->CreateBulletShape(0.01);
+ cinfo.m_collisionShape = m_shapeInfo->CreateBulletShape(m_cci.m_margin);
}
else if (m_collisionShape)
{
@@ -1621,6 +1668,309 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm,
return true;
}
+#include <cstdio>
+
+/* Updates the arrays used by CreateBulletShape(),
+ * take care that recalcLocalAabb() runs after CreateBulletShape is called.
+ * */
+bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RAS_MeshObject* meshobj)
+{
+ int numpolys;
+ int numverts;
+
+ unsigned int tot_bt_tris= 0;
+ unsigned int tot_bt_verts= 0;
+
+ int i, j;
+ int v_orig;
+
+ /* Use for looping over verts in a face as a try or 2 tris */
+ const int quad_verts[7]= {0,1,2, 0,2,3, -1};
+ const int tri_verts[4]= {0,1,2, -1};
+ const int *fv_pt;
+
+ if(gameobj==NULL && meshobj==NULL)
+ return false;
+
+ if(m_shapeType != PHY_SHAPE_MESH)
+ return false;
+
+ RAS_Deformer *deformer= gameobj ? gameobj->GetDeformer():NULL;
+
+ /* get the mesh from the object if not defined */
+ if(meshobj==NULL) {
+
+ /* modifier mesh */
+ if(deformer && deformer->GetFinalMesh())
+ meshobj= deformer->GetRasMesh();
+
+ /* game object first mesh */
+ if(meshobj==NULL) {
+ if(gameobj->GetMeshCount() > 0) {
+ meshobj= gameobj->GetMesh(0);
+ }
+ }
+ }
+
+ if(deformer && deformer->GetFinalMesh() && 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);
+ numverts = dm->getNumVerts(dm);
+ int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX);
+
+ MFace *mf;
+ MVert *mv;
+
+ int flen;
+
+ if(CustomData_has_layer(&dm->faceData, CD_MTFACE))
+ {
+ MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE);
+ MTFace *tf;
+
+ vector<bool> vert_tag_array(numverts, false);
+ vector<int> vert_remap_array(numverts, 0);
+
+ for(mf= mface, tf= tface, i=0; i < numpolys; mf++, tf++, i++) {
+ if(tf->mode & TF_DYNAMIC)
+ {
+ if(mf->v4) {
+ tot_bt_tris+= 2;
+ flen= 4;
+ } else {
+ tot_bt_tris++;
+ flen= 3;
+ }
+
+ for(j=0; j<flen; j++)
+ {
+ v_orig = (*(&mf->v1 + j));
+
+ if(vert_tag_array[v_orig]==false)
+ {
+ vert_tag_array[v_orig]= true;
+ vert_remap_array[v_orig]= tot_bt_verts;
+ tot_bt_verts++;
+ }
+ }
+ }
+ }
+
+ m_vertexArray.resize(tot_bt_verts*3);
+ btScalar *bt= &m_vertexArray[0];
+
+ m_triFaceArray.resize(tot_bt_tris*3);
+ int *tri_pt= &m_triFaceArray[0];
+
+ m_polygonIndexArray.resize(tot_bt_tris);
+ int *poly_index_pt= &m_polygonIndexArray[0];
+
+
+ for(mf= mface, tf= tface, i=0; i < numpolys; mf++, tf++, i++)
+ {
+ if(tf->mode & TF_DYNAMIC)
+ {
+ if(mf->v4) {
+ fv_pt= quad_verts;
+ *poly_index_pt++ = *poly_index_pt++ = index[i];
+ flen= 4;
+ } else {
+ fv_pt= tri_verts;
+ *poly_index_pt++ = index[i];
+ flen= 3;
+ }
+
+ for(; *fv_pt > -1; fv_pt++)
+ {
+ v_orig = (*(&mf->v1 + (*fv_pt)));
+
+ if(vert_tag_array[v_orig])
+ {
+ mv= mvert + v_orig;
+ *bt++ = mv->co[0];
+ *bt++ = mv->co[1];
+ *bt++ = mv->co[2];
+
+ vert_tag_array[v_orig]= false;
+ }
+ *tri_pt++ = vert_remap_array[v_orig];
+ }
+ }
+ }
+ }
+ else {
+ /* no need for a vertex mapping. simple/fast */
+
+ tot_bt_verts= numverts;
+
+ for(mf= mface, i=0; i < numpolys; mf++, i++) {
+ tot_bt_tris += (mf->v4 ? 2:1);
+ }
+
+ m_vertexArray.resize(tot_bt_verts*3);
+ btScalar *bt= &m_vertexArray[0];
+
+ m_triFaceArray.resize(tot_bt_tris*3);
+ int *tri_pt= &m_triFaceArray[0];
+
+ m_polygonIndexArray.resize(tot_bt_tris);
+ int *poly_index_pt= &m_polygonIndexArray[0];
+
+ for(mv= mvert, i=0; i < numverts; mv++, i++) {
+ *bt++ = mv->co[0]; *bt++ = mv->co[1]; *bt++ = mv->co[2];
+ }
+
+ for(mf= mface, i=0; i < numpolys; mf++, i++) {
+ if(mf->v4) {
+ fv_pt= quad_verts;
+ *poly_index_pt++ = *poly_index_pt++ = index[i];
+ }
+ else {
+ fv_pt= tri_verts;
+ *poly_index_pt++ = index[i];
+ }
+
+ for(; *fv_pt > -1; fv_pt++)
+ *tri_pt++ = (*(&mf->v1 + (*fv_pt)));
+ }
+ }
+ }
+ else { /*
+ * RAS Mesh Update
+ *
+ * */
+
+ /* Note!, gameobj can be NULL here */
+
+ /* transverts are only used for deformed RAS_Meshes, the RAS_TexVert data
+ * is too hard to get at, see below for details */
+ float (*transverts)[3]= NULL;
+ int transverts_tot= 0; /* with deformed meshes - should always be greater then the max orginal index, or we get crashes */
+
+ if(deformer) {
+ /* map locations from the deformed array
+ *
+ * Could call deformer->Update(); but rely on redraw updating.
+ * */
+ transverts= deformer->GetTransVerts(&transverts_tot);
+ }
+
+ // Tag verts we're using
+ numpolys= meshobj->NumPolygons();
+ numverts= meshobj->m_sharedvertex_map.size();
+ const float *xyz;
+
+
+ vector<bool> vert_tag_array(numverts, false);
+ vector<int> vert_remap_array(numverts, 0);
+
+ for(int p=0; p<numpolys; p++)
+ {
+ RAS_Polygon* poly= meshobj->GetPolygon(p);
+ if (poly->IsCollider())
+ {
+ for(i=0; i < poly->VertexCount(); i++)
+ {
+ v_orig= poly->GetVertex(i)->getOrigIndex();
+ if(vert_tag_array[v_orig]==false)
+ {
+ vert_tag_array[v_orig]= true;
+ vert_remap_array[v_orig]= tot_bt_verts;
+ tot_bt_verts++;
+ }
+ }
+ tot_bt_tris += (poly->VertexCount()==4 ? 2:1);
+ }
+ }
+
+ m_vertexArray.resize(tot_bt_verts*3);
+ btScalar *bt= &m_vertexArray[0];
+
+ m_triFaceArray.resize(tot_bt_tris*3);
+ int *tri_pt= &m_triFaceArray[0];
+
+ /* cant be used for anything useful in this case, since we dont rely on the original mesh
+ * will just be an array like pythons range(tot_bt_tris) */
+ m_polygonIndexArray.resize(tot_bt_tris);
+
+
+ for(int p=0; p<numpolys; p++)
+ {
+ RAS_Polygon* poly= meshobj->GetPolygon(p);
+
+ if (poly->IsCollider())
+ {
+ /* quad or tri loop */
+ fv_pt= (poly->VertexCount()==3 ? tri_verts:quad_verts);
+
+ for(; *fv_pt > -1; fv_pt++)
+ {
+ v_orig= poly->GetVertex(*fv_pt)->getOrigIndex();
+
+ if(vert_tag_array[v_orig])
+ {
+ if(transverts) {
+ /* deformed mesh, using RAS_TexVert locations would be too troublesome
+ * because they are use the gameob as a hash in the material slot */
+ *bt++ = transverts[v_orig][0];
+ *bt++ = transverts[v_orig][1];
+ *bt++ = transverts[v_orig][2];
+ }
+ else {
+ /* static mesh python may have modified */
+ xyz= meshobj->GetVertexLocation( v_orig );
+ *bt++ = xyz[0];
+ *bt++ = xyz[1];
+ *bt++ = xyz[2];
+ }
+
+ vert_tag_array[v_orig]= false;
+ }
+
+ *tri_pt++ = vert_remap_array[v_orig];
+ }
+ }
+
+ m_polygonIndexArray[p]= p; /* dumb counting */
+ }
+ }
+
+#if 0
+ /* needs #include <cstdio> */
+ printf("# vert count %d\n", m_vertexArray.size());
+ for(int i=0; i<m_vertexArray.size(); i+=3) {
+ printf("v %.6f %.6f %.6f\n", m_vertexArray[i], m_vertexArray[i+1], m_vertexArray[i+2]);
+ }
+
+ printf("# face count %d\n", m_triFaceArray.size());
+ for(int i=0; i<m_triFaceArray.size(); i+=3) {
+ printf("f %d %d %d\n", m_triFaceArray[i]+1, m_triFaceArray[i+1]+1, m_triFaceArray[i+2]+1);
+ }
+#endif
+
+ /* force recreation of the m_unscaledShape.
+ * If this has multiple users we cant delete */
+ if(m_unscaledShape) {
+ // dont free now so it can re-allocate under the same location and not break pointers.
+ // DeleteBulletShape(m_unscaledShape);
+ m_forceReInstance= true;
+ }
+
+ m_meshObject= meshobj;
+
+ return true;
+}
+
+
+
bool CcdShapeConstructionInfo::SetProxy(CcdShapeConstructionInfo* shapeInfo)
{
if (shapeInfo == NULL)
@@ -1696,7 +2046,7 @@ btCollisionShape* CcdShapeConstructionInfo::CreateBulletShape(btScalar margin)
} else
{
- if (!m_unscaledShape)
+ if (!m_unscaledShape || m_forceReInstance)
{
btTriangleIndexVertexArray* indexVertexArrays = 0;
@@ -1731,7 +2081,18 @@ btCollisionShape* CcdShapeConstructionInfo::CreateBulletShape(btScalar margin)
}
// this shape will be shared and not deleted until shapeInfo is deleted
- m_unscaledShape = new btBvhTriangleMeshShape( indexVertexArrays, true );
+
+ // for UpdateMesh, reuse the last memory location so instancing wont crash.
+ if(m_unscaledShape) {
+ DeleteBulletShape(m_unscaledShape, false);
+ m_unscaledShape->~btBvhTriangleMeshShape();
+
+ m_unscaledShape = new(m_unscaledShape) btBvhTriangleMeshShape( indexVertexArrays, true );
+ } else {
+ m_unscaledShape = new btBvhTriangleMeshShape( indexVertexArrays, true );
+ }
+
+ m_forceReInstance= false;
m_unscaledShape->recalcLocalAabb();
}
collisionShape = new btScaledBvhTriangleMeshShape(m_unscaledShape, btVector3(1.0f,1.0f,1.0f));
@@ -1776,7 +2137,7 @@ CcdShapeConstructionInfo::~CcdShapeConstructionInfo()
m_shapeArray.clear();
if (m_unscaledShape)
{
- DeleteBulletShape(m_unscaledShape);
+ DeleteBulletShape(m_unscaledShape, true);
}
m_vertexArray.clear();
if (m_shapeType == PHY_SHAPE_MESH && m_meshObject != NULL)
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index d73759bac76..69b16ca35bd 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -58,8 +58,6 @@ class btCollisionShape;
class CcdShapeConstructionInfo
{
public:
-
-
static CcdShapeConstructionInfo* FindMesh(class RAS_MeshObject* mesh, struct DerivedMesh* dm, bool polytope, bool gimpact);
CcdShapeConstructionInfo() :
@@ -146,6 +144,9 @@ public:
return m_meshObject;
}
+ bool UpdateMesh(class KX_GameObject* gameobj, class RAS_MeshObject* mesh);
+
+
bool SetProxy(CcdShapeConstructionInfo* shapeInfo);
CcdShapeConstructionInfo* GetProxy(void)
{
@@ -185,8 +186,16 @@ protected:
// the actual shape is of type btScaledBvhTriangleMeshShape
std::vector<CcdShapeConstructionInfo*> m_shapeArray; // for compound shapes
bool m_useGimpact; //use gimpact for concave dynamic/moving collision detection
+ bool m_forceReInstance; //use gimpact for concave dynamic/moving collision detection
float m_weldingThreshold1; //welding closeby vertices together can improve softbody stability etc.
CcdShapeConstructionInfo* m_shapeProxy; // only used for PHY_SHAPE_PROXY, pointer to actual shape info
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdShapeConstructionInfo"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
struct CcdConstructionInfo
@@ -381,6 +390,9 @@ protected:
CcdPhysicsController (const CcdConstructionInfo& ci);
+ bool DeleteControllerShape();
+ bool ReplaceControllerShape(btCollisionShape *newShape);
+
virtual ~CcdPhysicsController();
CcdConstructionInfo& getConstructionInfo()
@@ -552,7 +564,11 @@ protected:
}
-
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -580,7 +596,13 @@ class DefaultMotionState : public PHY_IMotionState
btTransform m_worldTransform;
btVector3 m_localScaling;
-
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:DefaultMotionState"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index bc7ccacc39b..bf28802870a 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -327,7 +327,6 @@ CcdPhysicsEnvironment::CcdPhysicsEnvironment(bool useDbvtCulling,btDispatcher* d
:m_cullingCache(NULL),
m_cullingTree(NULL),
m_numIterations(10),
-m_scalingPropagated(false),
m_numTimeSubSteps(1),
m_ccdMode(0),
m_solverType(-1),
@@ -336,7 +335,8 @@ m_enableSatCollisionDetection(false),
m_solver(NULL),
m_ownPairCache(NULL),
m_filterCallback(NULL),
-m_ownDispatcher(NULL)
+m_ownDispatcher(NULL),
+m_scalingPropagated(false)
{
for (int i=0;i<PHY_NUM_RESPONSE;i++)
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index bc5491e00cc..e087eac32c5 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -275,7 +275,11 @@ protected:
bool m_scalingPropagated;
-
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:CcdPhysicsEnvironment"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //CCDPHYSICSENVIRONMENT
diff --git a/source/gameengine/Physics/Bullet/Makefile b/source/gameengine/Physics/Bullet/Makefile
index 19b17de275a..433d1df3d2f 100644
--- a/source/gameengine/Physics/Bullet/Makefile
+++ b/source/gameengine/Physics/Bullet/Makefile
@@ -41,7 +41,6 @@ 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$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I../../../kernel/gen_system
CPPFLAGS += -I../../Physics/common
CPPFLAGS += -I../../Physics/Dummy
diff --git a/source/gameengine/Physics/Bullet/SConscript b/source/gameengine/Physics/Bullet/SConscript
index ed53e8112cd..49f2af1b001 100644
--- a/source/gameengine/Physics/Bullet/SConscript
+++ b/source/gameengine/Physics/Bullet/SConscript
@@ -16,15 +16,9 @@ incs += ' #source/gameengine/SceneGraph'
incs += ' #source/blender/makesdna'
incs += ' #source/blender/blenkernel'
incs += ' #source/blender/blenlib'
-incs += ' #intern/SoundSystem'
incs += ' #intern/guardedalloc'
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_PYTHON_INC']
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_bullet', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,80], cxx_compileflags=cxxflags )
+env.BlenderLib ( 'bf_bullet', Split(sources), Split(incs), [], 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 4bd29e7779b..d613bf8fd14 100644
--- a/source/gameengine/Physics/Dummy/CMakeLists.txt
+++ b/source/gameengine/Physics/Dummy/CMakeLists.txt
@@ -27,8 +27,8 @@
SET(SRC DummyPhysicsEnvironment.cpp)
SET(INC
- .
- ../common
+ .
+ ../common
)
BLENDERLIB(bf_dummy "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
index 8dbd137f9de..28440ebdad4 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
@@ -93,6 +93,12 @@ public:
return 0.f;
}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:DummyPhysicsEnvironment"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //_DUMMYPHYSICSENVIRONMENT
diff --git a/source/gameengine/Physics/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile
index c016a0bebcb..0e36266ae09 100644
--- a/source/gameengine/Physics/Dummy/Makefile
+++ b/source/gameengine/Physics/Dummy/Makefile
@@ -39,7 +39,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include
+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 93d6ac36446..dc76e8046a0 100644
--- a/source/gameengine/Physics/Dummy/SConscript
+++ b/source/gameengine/Physics/Dummy/SConscript
@@ -5,4 +5,4 @@ sources = 'DummyPhysicsEnvironment.cpp'
incs = '. ../common'
-env.BlenderLib ( 'bf_dummy', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,95] )
+env.BlenderLib ( 'bf_dummy', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,60] )
diff --git a/source/gameengine/Physics/common/CMakeLists.txt b/source/gameengine/Physics/common/CMakeLists.txt
index 41b2687fe38..a34bd19d400 100644
--- a/source/gameengine/Physics/common/CMakeLists.txt
+++ b/source/gameengine/Physics/common/CMakeLists.txt
@@ -27,9 +27,9 @@
SET(SRC PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp PHY_IGraphicController.cpp PHY_IPhysicsEnvironment.cpp PHY_IVehicle.cpp)
SET(INC
- .
- ../Dummy
- ../../../intern/moto/include
+ .
+ ../Dummy
+ ../../../intern/moto/include
)
BLENDERLIB(bf_common "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile
index f2dd0134b71..f87da383520 100644
--- a/source/gameengine/Physics/common/Makefile
+++ b/source/gameengine/Physics/common/Makefile
@@ -37,10 +37,9 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include
+CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I../../blender
# these two needed because of blenkernel
CPPFLAGS += -I../../blender/makesdna
diff --git a/source/gameengine/Physics/common/PHY_IController.h b/source/gameengine/Physics/common/PHY_IController.h
index 45e93f9d24e..a053a9679b8 100644
--- a/source/gameengine/Physics/common/PHY_IController.h
+++ b/source/gameengine/Physics/common/PHY_IController.h
@@ -31,7 +31,9 @@
#include "PHY_DynamicTypes.h"
-
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
/**
PHY_IController is the abstract simplified Interface to objects
@@ -41,12 +43,17 @@
class PHY_IController
{
public:
-
virtual ~PHY_IController();
// clientinfo for raycasts for example
virtual void* getNewClientInfo()=0;
virtual void setNewClientInfo(void* clientinfo)=0;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //PHY_ICONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.h b/source/gameengine/Physics/common/PHY_IGraphicController.h
index 470d42cb84a..aae971ff42a 100644
--- a/source/gameengine/Physics/common/PHY_IGraphicController.h
+++ b/source/gameengine/Physics/common/PHY_IGraphicController.h
@@ -39,9 +39,7 @@
*/
class PHY_IGraphicController : public PHY_IController
{
-
public:
-
virtual ~PHY_IGraphicController();
/**
SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding')
@@ -53,6 +51,11 @@ class PHY_IGraphicController : public PHY_IController
virtual PHY_IGraphicController* GetReplica(class PHY_IMotionState* motionstate) {return 0;}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //PHY_IGRAPHICCONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IMotionState.h b/source/gameengine/Physics/common/PHY_IMotionState.h
index f7bcbd4f2d0..c3d01c010ff 100644
--- a/source/gameengine/Physics/common/PHY_IMotionState.h
+++ b/source/gameengine/Physics/common/PHY_IMotionState.h
@@ -29,6 +29,10 @@
#ifndef PHY__MOTIONSTATE_H
#define PHY__MOTIONSTATE_H
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/**
PHY_IMotionState is the Interface to explicitly synchronize the world transformation.
Default implementations for mayor graphics libraries like OpenGL and DirectX can be provided.
@@ -36,8 +40,7 @@
class PHY_IMotionState
{
- public:
-
+ public:
virtual ~PHY_IMotionState();
virtual void getWorldPosition(float& posX,float& posY,float& posZ)=0;
@@ -52,6 +55,13 @@ class PHY_IMotionState
virtual void calculateWorldTransformations()=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IMotionState"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //PHY__MOTIONSTATE_H
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h
index d7b8cb0b54f..664e5fddd83 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsController.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h
@@ -41,7 +41,6 @@ class PHY_IPhysicsController : public PHY_IController
{
public:
-
virtual ~PHY_IPhysicsController();
/**
SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding')
@@ -99,6 +98,11 @@ class PHY_IPhysicsController : public PHY_IController
PHY__Vector3 GetWorldPosition(PHY__Vector3& localpos);
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsController"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //PHY_IPHYSICSCONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
index c76e9d175ce..291dac298dc 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
@@ -32,6 +32,11 @@
#include <vector>
#include "PHY_DynamicTypes.h"
+
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class PHY_IVehicle;
class RAS_MeshObject;
class PHY_IPhysicsController;
@@ -76,6 +81,12 @@ public:
m_faceNormal(faceNormal)
{
}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IRayCastFilterCallback"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/**
@@ -160,6 +171,13 @@ class PHY_IPhysicsEnvironment
virtual void setConstraintParam(int constraintId,int param,float value,float value1) = 0;
virtual float getConstraintParam(int constraintId,int param) = 0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IPhysicsEnvironment"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //_IPHYSICSENVIRONMENT
diff --git a/source/gameengine/Physics/common/PHY_IVehicle.h b/source/gameengine/Physics/common/PHY_IVehicle.h
index 498df0dd840..261bae480f5 100644
--- a/source/gameengine/Physics/common/PHY_IVehicle.h
+++ b/source/gameengine/Physics/common/PHY_IVehicle.h
@@ -6,10 +6,13 @@
class PHY_IMotionState;
#include "PHY_DynamicTypes.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class PHY_IVehicle
{
public:
-
virtual ~PHY_IVehicle();
virtual void AddWheel(
@@ -52,6 +55,12 @@ public:
virtual void SetCoordinateSystem(int rightIndex,int upIndex,int forwardIndex) =0;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IVehicle"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //PHY_IVEHICLE_H
diff --git a/source/gameengine/Physics/common/SConscript b/source/gameengine/Physics/common/SConscript
index 2713143f50d..719c028ee8f 100644
--- a/source/gameengine/Physics/common/SConscript
+++ b/source/gameengine/Physics/common/SConscript
@@ -5,9 +5,4 @@ sources = 'PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp P
incs = '. ../Dummy #intern/moto/include'
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_common', Split(sources), Split(incs), [], libtype=['core','player'], priority=[360, 90], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_physics_common', Split(sources), Split(incs), [], libtype=['core','player'], priority=[360,55], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/PyDoc/API_intro.py b/source/gameengine/PyDoc/API_intro.py
index 578b56eb2b0..0a687088627 100644
--- a/source/gameengine/PyDoc/API_intro.py
+++ b/source/gameengine/PyDoc/API_intro.py
@@ -24,7 +24,7 @@ The Blender Game Engine Python API Reference
Additional Modules:
-------------------
- These modules have no GameEngine spesific functionality but are useful in many cases.
+ These modules have no GameEngine specific functionality but are useful in many cases.
- L{Mathutils}
- L{Geometry}
diff --git a/source/gameengine/PyDoc/GameLogic.py b/source/gameengine/PyDoc/GameLogic.py
index 46f00fa7ea6..d22b1690e74 100644
--- a/source/gameengine/PyDoc/GameLogic.py
+++ b/source/gameengine/PyDoc/GameLogic.py
@@ -52,7 +52,6 @@ Documentation for the GameLogic Module.
- L{ActionActuator<GameTypes.BL_ActionActuator>}
- L{AddObjectActuator<GameTypes.KX_SCA_AddObjectActuator>}
- L{CameraActuator<GameTypes.KX_CameraActuator>}
- - L{CDActuator<GameTypes.KX_CDActuator>}
- L{ConstraintActuator<GameTypes.KX_ConstraintActuator>}
- L{DynamicActuator<GameTypes.KX_SCA_DynamicActuator>}
- L{EndObjectActuator<GameTypes.KX_SCA_EndObjectActuator>}
@@ -448,14 +447,6 @@ def setPhysicsTicRate(ticrate):
@type ticrate: float
"""
-def EvalExpression(text):
- """
- Evaluate the string as an expression, similar to the expression controller logic brick.
- @param text: The expression to evaluate.
- @type text: string
- @return: The result of the expression. The type depends on the expression.
- """
-
#{ Utility functions
def getAverageFrameRate():
"""
diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py
index 63dd1a7fabf..60511f41c2b 100644
--- a/source/gameengine/PyDoc/GameTypes.py
+++ b/source/gameengine/PyDoc/GameTypes.py
@@ -4,15 +4,17 @@ Documentation for the GameTypes Module.
@group Base: PyObjectPlus, CValue, CPropValue, SCA_ILogicBrick, SCA_IObject, SCA_ISensor, SCA_IController, SCA_IActuator
-@group Object: KX_GameObject, KX_LightObject, KX_Camera
+@group Object: KX_GameObject, KX_LightObject, KX_Camera, BL_ArmatureObject
+
+@group Animation: BL_ArmatureConstraint
@group Mesh: KX_MeshProxy, KX_PolyProxy, KX_VertexProxy
@group Shading: KX_PolygonMaterial, KX_BlenderMaterial, BL_Shader
-@group Sensors: SCA_ActuatorSensor, SCA_AlwaysSensor, SCA_DelaySensor, SCA_JoystickSensor, SCA_KeyboardSensor, KX_MouseFocusSensor, SCA_MouseSensor, KX_NearSensor, KX_NetworkMessageSensor, SCA_PropertySensor, KX_RadarSensor, SCA_RandomSensor, KX_RaySensor, KX_TouchSensor
+@group Sensors: SCA_ActuatorSensor, SCA_AlwaysSensor, SCA_DelaySensor, SCA_JoystickSensor, SCA_KeyboardSensor, KX_MouseFocusSensor, SCA_MouseSensor, KX_NearSensor, KX_NetworkMessageSensor, SCA_PropertySensor, KX_RadarSensor, SCA_RandomSensor, KX_RaySensor, KX_TouchSensor, KX_ArmatureSensor
-@group Actuators: SCA_2DFilterActuator, BL_ActionActuator, KX_SCA_AddObjectActuator, KX_CameraActuator, KX_CDActuator, KX_ConstraintActuator, KX_SCA_DynamicActuator, KX_SCA_EndObjectActuator, KX_GameActuator, KX_IpoActuator, KX_NetworkMessageActuator, KX_ObjectActuator, KX_ParentActuator, SCA_PropertyActuator, SCA_RandomActuator, KX_SCA_ReplaceMeshActuator, KX_SceneActuator, BL_ShapeActionActuator, KX_SoundActuator, KX_StateActuator, KX_TrackToActuator, KX_VisibilityActuator
+@group Actuators: SCA_2DFilterActuator, BL_ActionActuator, BL_ArmatureActuator, KX_SCA_AddObjectActuator, KX_CameraActuator, KX_ConstraintActuator, KX_SCA_DynamicActuator, KX_SCA_EndObjectActuator, KX_GameActuator, KX_IpoActuator, KX_NetworkMessageActuator, KX_ObjectActuator, KX_ParentActuator, SCA_PropertyActuator, SCA_RandomActuator, KX_SCA_ReplaceMeshActuator, KX_SceneActuator, BL_ShapeActionActuator, KX_SoundActuator, KX_StateActuator, KX_TrackToActuator, KX_VisibilityActuator
@group Controllers: SCA_ANDController, SCA_NANDController, SCA_NORController, SCA_ORController, SCA_PythonController, SCA_XNORController, SCA_XORController
"""
@@ -310,6 +312,8 @@ class BL_ActionActuator(SCA_IActuator):
@ivar action: The name of the action to set as the current action.
@type action: string
+ @ivar channelNames: A list of channel names that may be used with L{setChannel} and L{getChannel}
+ @type channelNames: list of strings
@ivar frameStart: Specifies the starting frame of the animation.
@type frameStart: float
@ivar frameEnd: Specifies the ending frame of the animation.
@@ -340,7 +344,8 @@ class BL_ActionActuator(SCA_IActuator):
"""
Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported.
- @param channel: A string specifying the name of the bone channel, created if missing.
+ @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.
+ @param channel: A string specifying the name of the bone channel, error raised if not in L{channelNames}.
@type channel: string
@param matrix: A 4x4 matrix specifying the overriding transformation
as an offset from the bone's rest position.
@@ -349,7 +354,7 @@ class BL_ActionActuator(SCA_IActuator):
def getChannel(channel):
"""
- @param channel: A string specifying the name of the bone channel. error raised if missing.
+ @param channel: A string specifying the name of the bone channel. error raised if not in L{channelNames}.
@type channel: string
@rtype: tuple
@return: (loc, size, quat)
@@ -1020,12 +1025,6 @@ class CListValue(CPropValue):
Return the value matching key, or the default value if its not found.
@return: The key value or a default.
"""
- def has_key(key):
- """
- Return True if the key is found.
- @rtype: boolean
- @return: The key value or a default.
- """
def from_id(id):
"""
This is a funtion especially for the game engine to return a value with a spesific id.
@@ -1103,59 +1102,6 @@ class KX_BlenderMaterial(PyObjectPlus): # , RAS_IPolyMaterial)
@return: the material's index
"""
-class KX_CDActuator(SCA_IActuator):
- """
- CD Controller actuator.
- @ivar volume: controls the volume to set the CD to. 0.0 = silent, 1.0 = max volume.
- @type volume: float
- @ivar track: the track selected to be played
- @type track: integer
- @ivar gain: the gain (volume) of the CD between 0.0 and 1.0.
- @type gain: float
- """
- def startCD():
- """
- Starts the CD playing.
- """
- def stopCD():
- """
- Stops the CD playing.
- """
- def pauseCD():
- """
- Pauses the CD.
- """
- def resumeCD():
- """
- Resumes the CD after a pause.
- """
- def playAll():
- """
- Plays the CD from the beginning.
- """
- def playTrack(trackNumber):
- """
- Plays the track selected.
- """
-#{ Deprecated
- def setGain(gain):
- """
- Sets the gain (volume) of the CD.
-
- @deprecated: Use the L{volume} property.
- @type gain: float
- @param gain: the gain to set the CD to. 0.0 = silent, 1.0 = max volume.
- """
- def getGain():
- """
- Gets the current gain (volume) of the CD.
-
- @deprecated: Use the L{volume} property.
- @rtype: float
- @return: Between 0.0 (silent) and 1.0 (max volume)
- """
-#}
-
class KX_CameraActuator(SCA_IActuator):
"""
Applies changes to a camera.
@@ -1632,17 +1578,21 @@ class KX_GameObject(SCA_IObject):
@ivar childrenRecursive: all children of this object including childrens children, (read-only).
@type childrenRecursive: L{CListValue} of L{KX_GameObject}'s
@group Deprecated: getPosition, setPosition, setWorldPosition, getOrientation, setOrientation, getState, setState, getParent, getVisible, getMass, getMesh, getChildren, getChildrenRecursive
- @group Property Access: get, has_key, attrDict, getPropertyNames
+ @group Property Access: get, attrDict, getPropertyNames
"""
def endObject():
"""
Delete this object, can be used inpace of the EndObject Actuator.
The actual removal of the object from the scene is delayed.
"""
- def replaceMesh(mesh):
+ def replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False):
"""
Replace the mesh of this object with a new mesh. This works the same was as the actuator.
@type mesh: L{KX_MeshProxy} or mesh name
+ @type useDisplayMesh: bool
+ @param useDisplayMesh: when enabled the display mesh will be replaced (optional argument).
+ @type usePhysicsMesh: bool
+ @param usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument).
"""
def getVisible():
"""
@@ -2075,15 +2025,29 @@ class KX_GameObject(SCA_IObject):
@param to: The name of the object to send the message to (optional)
@type to: string
"""
- def get(key, default=None):
+ def reinstancePhysicsMesh(gameObject, meshObject):
"""
- Return the value matching key, or the default value if its not found.
- @return: The key value or a default.
+ 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.
+
+ @param gameObject: optional argument, set the physics shape from this gameObjets mesh.
+ @type gameObject: string, L{KX_GameObject} or None
+ @param meshObject: optional argument, set the physics shape from this mesh.
+ @type meshObject: string, L{KX_MeshProxy} or None
+
+ @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.
+ @rtype: boolean
+ @return: True if reinstance succeeded, False if it failed.
"""
- def has_key(key):
+
+ def get(key, default=None):
"""
- Return True if the key is found.
- @rtype: boolean
+ Return the value matching key, or the default value if its not found.
@return: The key value or a default.
"""
@@ -2384,18 +2348,6 @@ class KX_MeshProxy(SCA_IObject):
@rtype: L{KX_PolyProxy}
@return: a polygon object.
"""
- def reinstancePhysicsMesh():
- """
- Updates the physics system with the changed mesh.
-
- A mesh must have only one material with collision flags,
- and have all collision primitives in one vertex array (ie. < 65535 verts) and
- be either a polytope or polyheder mesh. If you don't get a warning in the
- console when the collision type is polytope, the mesh is suitable for reinstance.
- @bug: This currently does not work.
- @rtype: boolean
- @return: True if reinstance succeeded, False if it failed.
- """
class SCA_MouseSensor(SCA_ISensor):
"""
@@ -2457,6 +2409,8 @@ class KX_MouseFocusSensor(SCA_MouseSensor):
@type hitPosition: list (vector of 3 floats)
@ivar hitNormal: the worldspace normal from the face at point of intersection.
@type hitNormal: list (normalized vector of 3 floats)
+ @ivar 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 usePulseFocus: bool
"""
#{ Deprecated
def getHitNormal():
@@ -2518,7 +2472,7 @@ class KX_TouchSensor(SCA_ISensor):
@ivar useMaterial: Determines if the sensor is looking for a property or material.
KX_True = Find material; KX_False = Find property
@type useMaterial: boolean
- @ivar usePulseCollision: The last collided object.
+ @ivar usePulseCollision: When enabled, changes to the set of colliding objects generate a pulse.
@type usePulseCollision: bool
@ivar hitObject: The last collided object. (read-only)
@type hitObject: L{KX_GameObject} or None
@@ -3780,6 +3734,11 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
@ivar mesh: L{KX_MeshProxy} or the name of the mesh that will replace the current one
Set to None to disable actuator
@type mesh: L{KX_MeshProxy} or None if no mesh is set
+
+ @ivar useDisplayMesh: when true the displayed mesh is replaced.
+ @type useDisplayMesh: boolean
+ @ivar usePhysicsMesh: when true the physics mesh is replaced.
+ @type usePhysicsMesh: boolean
"""
def setMesh(name):
"""
@@ -3899,6 +3858,12 @@ class KX_Scene(PyObjectPlus):
@rtype: L{KX_GameObject}
"""
+
+ def 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):
"""
@@ -5723,6 +5688,332 @@ class KX_Camera(KX_GameObject):
@return: the first object hit or None if no object or object does not match prop
"""
+class BL_ArmatureObject(KX_GameObject):
+ """
+ An armature object.
+
+ @ivar 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 constraints: list of L{BL_ArmatureConstraint}
+ @ivar channels: The list of armature channels.
+ Elements of the list can be accessed by index or name the bone.
+ @type channels: list of L{BL_ArmatureChannel}
+ """
+
+ def 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.
+
+ @group Constants: KX_ACT_ARMATURE_RUN, KX_ACT_ARMATURE_ENABLE, KX_ACT_ARMATURE_DISABLE, KX_ACT_ARMATURE_SETTARGET, KX_ACT_ARMATURE_SETWEIGHT
+ @ivar KX_ACT_ARMATURE_RUN: see type
+ @ivar KX_ACT_ARMATURE_ENABLE: see type
+ @ivar KX_ACT_ARMATURE_DISABLE: see type
+ @ivar KX_ACT_ARMATURE_SETTARGET: see type
+ @ivar KX_ACT_ARMATURE_SETWEIGHT: see type
+ @ivar type: The type of action that the actuator executes when it is active.
+
+ KX_ACT_ARMATURE_RUN(0): 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
+
+ KX_ACT_ARMATURE_ENABLE(1): enable the constraint.
+
+ KX_ACT_ARMATURE_DISABLE(2): disable the constraint (runtime constraint values are not updated).
+
+ KX_ACT_ARMATURE_SETTARGET(3): change target and subtarget of constraint
+
+ KX_ACT_ARMATURE_SETWEIGHT(4): change weight of (only for IK constraint)
+ @type type: integer
+ @ivar constraint: The constraint object this actuator is controlling.
+ @type constraint: L{BL_ArmatureConstraint}
+ @ivar target: The object that this actuator will set as primary target to the constraint it controls
+ @type target: L{KX_GameObject}
+ @ivar subtarget: The object that this actuator will set as secondary target to the constraint it controls.
+ Currently, the only secondary target is the pole target for IK constraint.
+ @type subtarget: L{KX_GameObject}
+ @ivar weight: The weight this actuator will set on the constraint it controls.
+ Currently only the IK constraint has a weight. It must be a value between 0 and 1.
+ A weight of 0 disables a constraint while still updating constraint runtime values (see L{BL_ArmatureConstraint})
+ @type weight: float
+ """
+
+class KX_ArmatureSensor(SCA_ISensor):
+ """
+ Armature sensor detect conditions on armatures.
+
+ @group Constants: KX_ARMSENSOR_STATE_CHANGED, KX_ARMSENSOR_LIN_ERROR_BELOW, KX_ARMSENSOR_LIN_ERROR_ABOVE, KX_ARMSENSOR_ROT_ERROR_BELOW, KX_ARMSENSOR_ROT_ERROR_ABOVE
+ @ivar KX_ARMSENSOR_STATE_CHANGED: see type
+ @ivar KX_ARMSENSOR_LIN_ERROR_BELOW: see type
+ @ivar KX_ARMSENSOR_LIN_ERROR_ABOVE: see type
+ @ivar KX_ARMSENSOR_ROT_ERROR_BELOW: see type
+ @ivar KX_ARMSENSOR_ROT_ERROR_ABOVE: see type
+ @ivar type: The type of measurement that the sensor make when it is active.
+
+ KX_ARMSENSOR_STATE_CHANGED(0): detect that the constraint is changing state (active/inactive)
+
+ KX_ARMSENSOR_LIN_ERROR_BELOW(1): detect that the constraint linear error is above a threshold
+
+ KX_ARMSENSOR_LIN_ERROR_ABOVE(2): detect that the constraint linear error is below a threshold
+
+ KX_ARMSENSOR_ROT_ERROR_BELOW(3): detect that the constraint rotation error is above a threshold
+
+ KX_ARMSENSOR_ROT_ERROR_ABOVE(4): detect that the constraint rotation error is below a threshold
+ @type type: integer
+ @ivar constraint: The constraint object this sensor is watching.
+ @type constraint: L{BL_ArmatureConstraint}
+ @ivar 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 value: float
+ """
+
+class BL_ArmatureConstraint(PyObjectPlus):
+ """
+ Proxy to Armature Constraint. Allows to change constraint on the fly.
+ Obtained through L{BL_ArmatureObject}.constraints.
+ Note: not all armature constraints are supported in the GE.
+
+ @group Constants: CONSTRAINT_TYPE_TRACKTO, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_ROTLIKE, CONSTRAINT_TYPE_LOCLIKE, CONSTRAINT_TYPE_MINMAX, CONSTRAINT_TYPE_SIZELIKE, CONSTRAINT_TYPE_LOCKTRACK, CONSTRAINT_TYPE_STRETCHTO, CONSTRAINT_TYPE_CLAMPTO, CONSTRAINT_TYPE_TRANSFORM, CONSTRAINT_TYPE_DISTLIMIT,CONSTRAINT_IK_COPYPOSE, CONSTRAINT_IK_DISTANCE,CONSTRAINT_IK_MODE_INSIDE, CONSTRAINT_IK_MODE_OUTSIDE,CONSTRAINT_IK_MODE_ONSURFACE,CONSTRAINT_IK_FLAG_TIP,CONSTRAINT_IK_FLAG_ROT, CONSTRAINT_IK_FLAG_STRETCH, CONSTRAINT_IK_FLAG_POS
+ @ivar CONSTRAINT_TYPE_TRACKTO: see type
+ @ivar CONSTRAINT_TYPE_KINEMATIC: see type
+ @ivar CONSTRAINT_TYPE_ROTLIKE: see type
+ @ivar CONSTRAINT_TYPE_LOCLIKE: see type
+ @ivar CONSTRAINT_TYPE_MINMAX: see type
+ @ivar CONSTRAINT_TYPE_SIZELIKE: see type
+ @ivar CONSTRAINT_TYPE_LOCKTRACK: see type
+ @ivar CONSTRAINT_TYPE_STRETCHTO: see type
+ @ivar CONSTRAINT_TYPE_CLAMPTO: see type
+ @ivar CONSTRAINT_TYPE_TRANSFORM: see type
+ @ivar CONSTRAINT_TYPE_DISTLIMIT: see type
+ @ivar CONSTRAINT_IK_COPYPOSE: see ik_type
+ @ivar CONSTRAINT_IK_DISTANCE: see ik_type
+ @ivar CONSTRAINT_IK_MODE_INSIDE: see ik_mode
+ @ivar CONSTRAINT_IK_MODE_OUTSIDE: see ik_mode
+ @ivar CONSTRAINT_IK_MODE_ONSURFACE: see ik_mode
+ @ivar CONSTRAINT_IK_FLAG_TIP: see ik_flag
+ @ivar CONSTRAINT_IK_FLAG_ROT: see ik_flag
+ @ivar CONSTRAINT_IK_FLAG_STRETCH: see ik_flag
+ @ivar CONSTRAINT_IK_FLAG_POS: see ik_flag
+ @ivar type: Type of constraint, read-only
+ @type type: integer, one of CONSTRAINT_TYPE_ constant
+ @ivar name: Name of constraint constructed as <bone_name>:<constraint_name>
+ This name is also the key subscript on L{BL_ArmatureObject}.constraints list
+ @type name: string
+ @ivar enforce: fraction of constraint effect that is enforced. Between 0 and 1.
+ @type enforce: float
+ @ivar headtail: position of target between head and tail of the target bone: 0=head, 1=tail
+ Only used if the target is a bone (i.e target object is an armature)
+ @type headtail: float
+ @ivar lin_error: runtime linear error (in Blender unit) 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 lin_error: float
+ @ivar rot_error: runtime rotation error (in radiant) 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.
+ It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint.
+ @type rot_error: float
+ @ivar target: Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint.
+ @type target: L{KX_GameObject}
+ @ivar subtarget: Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint.
+ Currently this is only used for pole target on IK constraint.
+ @type subtarget: L{KX_GameObject}
+ @ivar active: True if the constraint is active.
+ Note: an inactive constraint does not update lin_error and rot_error.
+ @type active: boolean
+ @ivar ik_weight: Weight of the IK constraint between 0 and 1.
+ Only defined for IK constraint.
+ @type ik_weight: float
+ @ivar ik_type: Type of IK constraint, read-only
+
+ CONSTRAINT_IK_COPYPOSE(0): constraint is trying to match the position and eventually the rotation of the target.
+
+ CONSTRAINT_IK_DISTANCE(1): constraint is maintaining a certain distance to target subject to ik_mode
+ @type ik_type: integer
+ @ivar ik_flag: Combination of IK constraint option flags, read-only
+
+ CONSTRAINT_IK_FLAG_TIP(1) : set when the constraint operates on the head of the bone and not the tail
+
+ CONSTRAINT_IK_FLAG_ROT(2) : set when the constraint tries to match the orientation of the target
+
+ CONSTRAINT_IK_FLAG_STRETCH(16) : set when the armature is allowed to stretch (only the bones with stretch factor > 0.0)
+
+ CONSTRAINT_IK_FLAG_POS(32) : set when the constraint tries to match the position of the target
+ @type ik_flag: integer
+ @ivar ik_dist: Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE
+ @type ik_dist: float
+ @ivar ik_mode: Additional mode for IK constraint. Currently only used for Distance constraint:
+
+ CONSTRAINT_IK_MODE_INSIDE(0) : the constraint tries to keep the bone within ik_dist of target
+
+ CONSTRAINT_IK_MODE_OUTSIDE(1) : the constraint tries to keep the bone outside ik_dist of the target
+
+ CONSTRAINT_IK_MODE_ONSURFACE(2) : the constraint tries to keep the bone exactly at ik_dist of the target
+ @type ik_mode: 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.
+
+ @group Constants: PCHAN_ROT_QUAT, PCHAN_ROT_XYZ, PCHAN_ROT_XZY, PCHAN_ROT_YXZ, PCHAN_ROT_YZX, PCHAN_ROT_ZXY, PCHAN_ROT_ZYX
+ @ivar PCHAN_ROT_QUAT: see rotation_mode
+ @ivar PCHAN_ROT_XYZ: see rotation_mode
+ @ivar PCHAN_ROT_XZY: see rotation_mode
+ @ivar PCHAN_ROT_YXZ: see rotation_mode
+ @ivar PCHAN_ROT_YZX: see rotation_mode
+ @ivar PCHAN_ROT_ZXY: see rotation_mode
+ @ivar PCHAN_ROT_ZYX: see rotation_mode
+ @ivar name: channel name (=bone name), read-only.
+ @type name: string
+ @ivar bone: return the bone object corresponding to this pose channel, read-only.
+ @type bone: L{BL_ArmatureBone}
+ @ivar parent: return the parent channel object, None if root channel, read-only.
+ @type parent: L{BL_ArmatureChannel}
+ @ivar 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 has_ik: boolean
+ @ivar ik_dof_x: true if the bone is free to rotation in the X axis, read-only.
+ @type ik_dof_x: boolean
+ @ivar ik_dof_y: true if the bone is free to rotation in the Y axis, read-only.
+ @type ik_dof_y: boolean
+ @ivar ik_dof_z: true if the bone is free to rotation in the Z axis, read-only.
+ @type ik_dof_z: boolean
+ @ivar ik_limit_x: true if a limit is imposed on X rotation, read-only.
+ @type ik_limit_x: boolean
+ @ivar ik_limit_y: true if a limit is imposed on Y rotation, read-only.
+ @type ik_limit_y: boolean
+ @ivar ik_limit_z: true if a limit is imposed on Z rotation, read-only.
+ @type ik_limit_z: boolean
+ @ivar ik_rot_control: true if channel rotation should applied as IK constraint, read-only.
+ @type ik_rot_control: boolean
+ @ivar ik_lin_control: true if channel size should applied as IK constraint, read-only.
+ @type ik_lin_control: boolean
+ @ivar location: displacement of the bone head in armature local space, read-write.
+ 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.
+ Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update})
+ @type location: vector [X,Y,Z]
+ @ivar scale: scale of the bone relative to its parent, read-write.
+ An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
+ Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update})
+ @type scale: vector [sizeX, sizeY, sizeZ]
+ @ivar rotation: rotation of the bone relative to its parent expressed as a quaternion, read-write.
+ 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.
+ Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update})
+ @type rotation: vector [qr, qi, qj, qk]
+ @ivar euler_rotation: rotation of the bone relative to its parent expressed as a set of euler angles, read-write.
+ 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.
+ Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see L{BL_ArmatureObject.update})
+ @type euler_rotation: vector [X, Y, Z]
+ @ivar rotation_mode: method of updating the bone rotation, read-write.
+ 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
+ @type rotation_mode: integer
+ @ivar 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 channel_matrix: matrix [4][4]
+ @ivar pose_matrix: pose matrix in armature space, read-only,
+ This field is updated after the graphic render, it represents the current pose.
+ @type pose_matrix: matrix [4][4]
+ @ivar pose_head: position of bone head in armature space, read-only.
+ @type pose_head: vector [x, y, z]
+ @ivar pose_tail: position of bone tail in armature space, read-only.
+ @type pose_tail: vector [x, y, z]
+ @ivar ik_min_x: minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only.
+ @type ik_min_x: float
+ @ivar ik_max_x: maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only.
+ @type ik_max_x: float
+ @ivar ik_min_y: minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only.
+ @type ik_min_y: float
+ @ivar ik_max_y: maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only.
+ @type ik_max_y: float
+ @ivar ik_min_z: minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only.
+ @type ik_min_z: float
+ @ivar ik_max_z: maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only.
+ @type ik_max_z: float
+ @ivar ik_stiffness_x: bone rotation stiffness in X axis, read-only
+ @type ik_stiffness_x: float between 0 and 1
+ @ivar ik_stiffness_y: bone rotation stiffness in Y axis, read-only
+ @type ik_stiffness_y: float between 0 and 1
+ @ivar ik_stiffness_z: bone rotation stiffness in Z axis, read-only
+ @type ik_stiffness_z: float between 0 and 1
+ @ivar ik_stretch: ratio of scale change that is allowed, 0=bone can't change size, read-only.
+ @type ik_stretch: float
+ @ivar ik_rot_weight: weight of rotation constraint when ik_rot_control is set, read-write.
+ @type ik_rot_weight: float between 0 and 1
+ @ivar ik_lin_weight: weight of size constraint when ik_lin_control is set, read-write.
+ @type ik_lin_weight: float between 0 and 1
+ @ivar 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_ 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.
+
+ Notes:
+ - The bone must be part of an IK chain if you want to set the ik_dof_ 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.
+ - [0,0,0] always corresponds to the rest pose.
+ - You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see L{BL_ArmatureObject.update}).
+ - You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute.
+ @type joint_rotation: vector [x, y, z]
+ """
+
+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.
+
+ @ivar name: bone name
+ @type name: string
+ @ivar connected: true when the bone head is struck to the parent's tail
+ @type connected: boolean
+ @ivar hinge: true when bone doesn't inherit rotation or scale from parent bone
+ @type hinge: boolean
+ @ivar inherit_scale: true when bone inherits scaling from parent bone
+ @type inherit_scale: boolean
+ @ivar bbone_segments: number of B-bone segments
+ @type bbone_segments: integer
+ @ivar roll: bone rotation around head-tail axis
+ @type roll: float
+ @ivar head: location of head end of the bone in parent bone space
+ @type head: vector [x, y, z]
+ @ivar tail: location of head end of the bone in parent bone space
+ @type tail: vector [x, y, z]
+ @ivar length: bone length
+ @type length: float
+ @ivar arm_head: location of head end of the bone in armature space
+ @type arm_head: vector [x, y, z]
+ @ivar arm_tail: location of tail end of the bone in armature space
+ @type arm_tail: vector [x, y, z]
+ @ivar arm_mat: matrix of the bone head in armature space
+ This matrix has no scale part.
+ @type arm_mat: matrix [4][4]
+ @ivar bone_mat: rotation matrix of the bone in parent bone space.
+ @type bone_mat: matrix [3][3]
+ @ivar parent: parent bone, or None for root bone
+ @type parent: L{BL_ArmatureBone}
+ @ivar children: list of bone's children
+ @type children: list of L{BL_ArmatureBone}
+ """
# Util func to extract all attrs
"""
import types
@@ -5770,7 +6061,7 @@ for name, val in locals().items():
# Store the mappings to new attributes in a list (because there
# could be collisions).
- if not depAttrs.has_key(attrName):
+ if attrName not in depAttrs:
depAttrs[attrName] = {}
mapping = depAttrs[attrName]
@@ -5795,7 +6086,7 @@ for name, val in locals().items():
# Another mapping, from a conversion tuple to lists of class
# names.
conversion = (func, newAttrName)
- if not mapping.has_key(conversion):
+ if conversion not in mapping:
mapping[conversion] = []
mapping[conversion].append(name)
break
diff --git a/source/gameengine/PyDoc/SConscript b/source/gameengine/PyDoc/SConscript
index ed9712ba273..dabe004ae6a 100644
--- a/source/gameengine/PyDoc/SConscript
+++ b/source/gameengine/PyDoc/SConscript
@@ -1,6 +1,11 @@
#!/usr/bin/python
Import ('env')
+import os
+if env['WITH_BF_FHS']:
+ BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
+else:
+ BLENDERPATH = env['BF_INSTALLDIR']
from optparse import OptionParser
import epydoc
@@ -14,7 +19,7 @@ optvalues["quiet"] = 0
optvalues["include_source_code"] = 0
optvalues["inheritance"] = "included"
optvalues["show_private"] = 0
-optvalues["target"] = env["BF_DOCDIR"]+"/BGE_API/"
+optvalues["target"] = os.path.join(BLENDERPATH, 'doc')
optvalues["url"] = "http://www.blender.org"
optvalues["top"] = "Game Engine API"
optvalues["name"] = "Blender"
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index 143209f5a54..51d1f5001dd 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -27,15 +27,15 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/kernel/gen_system
- ../../../source/blender/makesdna
- ../../../source/gameengine/SceneGraph
- ../../../intern/string
- ../../../intern/moto/include
- ../../../extern/glew/include
- ../Expressions
- ${PYTHON_INC}
+ .
+ ../../../source/kernel/gen_system
+ ../../../source/blender/makesdna
+ ../../../source/gameengine/SceneGraph
+ ../../../intern/string
+ ../../../intern/moto/include
+ ../../../extern/glew/include
+ ../Expressions
+ ${PYTHON_INC}
)
BLENDERLIB(bf_rasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.h b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
index 6a420a974d4..99d4ea595ab 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.h
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
@@ -30,6 +30,10 @@
#define MAX_RENDER_PASS 100
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_2DFilterManager
{
private:
@@ -97,5 +101,12 @@ public:
void RenderFilters(RAS_ICanvas* canvas);
void EnableFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFILTER_MODE mode, int pass, STR_String& text);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_2DFilterManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp
index 200b1c6c89f..8b3c4990a7a 100644
--- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp
@@ -126,10 +126,7 @@ void RAS_BucketManager::OrderBuckets(const MT_Transform& cameratrans, BucketList
RAS_MaterialBucket* bucket = *bit;
RAS_MeshSlot* ms;
// remove the mesh slot form the list, it culls them automatically for next frame
- for(ms = bucket->GetNextActiveMeshSlot();
- ms!= NULL;
- ms = bucket->GetNextActiveMeshSlot())
- {
+ while((ms = bucket->GetNextActiveMeshSlot())) {
slots[i++].set(ms, bucket, pnorm);
}
}
@@ -179,9 +176,7 @@ void RAS_BucketManager::RenderSolidBuckets(
RAS_MaterialBucket* bucket = *bit;
RAS_MeshSlot* ms;
// remove the mesh slot form the list, it culls them automatically for next frame
- for(ms = bucket->GetNextActiveMeshSlot();
- ms!= NULL;
- ms = bucket->GetNextActiveMeshSlot())
+ while((ms = bucket->GetNextActiveMeshSlot()))
{
rendertools->SetClientObject(rasty, ms->m_clientObj);
while (bucket->ActivateMaterial(cameratrans, rasty, rendertools))
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.h b/source/gameengine/Rasterizer/RAS_BucketManager.h
index 2b81ddd3c82..dcac41ab6e9 100644
--- a/source/gameengine/Rasterizer/RAS_BucketManager.h
+++ b/source/gameengine/Rasterizer/RAS_BucketManager.h
@@ -67,6 +67,12 @@ private:
RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools);
void RenderAlphaBuckets(const MT_Transform& cameratrans,
RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_BucketManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_BUCKETMANAGER
diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h
index fe9b1540af8..6f4cd425c6c 100644
--- a/source/gameengine/Rasterizer/RAS_Deformer.h
+++ b/source/gameengine/Rasterizer/RAS_Deformer.h
@@ -37,7 +37,12 @@
#include <stdlib.h>
#include "GEN_Map.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
struct DerivedMesh;
+class RAS_MeshObject;
class RAS_Deformer
{
@@ -71,10 +76,22 @@ public:
{
return NULL;
}
+ virtual class RAS_MeshObject* GetRasMesh()
+ {
+ /* m_pMesh does not seem to be being used?? */
+ return NULL;
+ }
+ virtual float (* GetTransVerts(int *tot))[3] { *tot= 0; return NULL; }
protected:
class RAS_MeshObject *m_pMesh;
bool m_bDynamic;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Deformer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h
index 4398e2d00c3..3ae794c430a 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.h
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.h
@@ -29,6 +29,10 @@
#ifndef RAS_FRAMINGMANAGER_H
#define RAS_FRAMINGMANAGER_H
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_Rect;
/**
@@ -55,7 +59,6 @@ class RAS_Rect;
class RAS_FrameSettings
{
public :
-
/**
* enum defining the policy to use
* in each axis.
@@ -154,6 +157,13 @@ private :
float m_bar_b;
unsigned int m_design_aspect_width;
unsigned int m_design_aspect_height;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FrameSettings"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
struct RAS_FrameFrustum
@@ -274,6 +284,13 @@ private :
RAS_FramingManager(
const RAS_FramingManager &
);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FramingManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Rasterizer/RAS_ICanvas.h b/source/gameengine/Rasterizer/RAS_ICanvas.h
index f3f817a943d..dae4fb3f4d2 100644
--- a/source/gameengine/Rasterizer/RAS_ICanvas.h
+++ b/source/gameengine/Rasterizer/RAS_ICanvas.h
@@ -33,6 +33,10 @@
* 2D rendering device context. The connection from 3d rendercontext to 2d surface.
*/
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_Rect;
@@ -173,6 +177,13 @@ public:
MakeScreenShot(
const char* filename
)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ICanvas"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_ICANVAS
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
index 6af00d63c2d..033daabc48f 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
@@ -46,8 +46,7 @@ void RAS_IPolyMaterial::Initialize(
int mode,
int transp,
bool alpha,
- bool zsort,
- int lightlayer)
+ bool zsort)
{
m_texturename = texname;
m_materialname = matname;
@@ -59,7 +58,6 @@ void RAS_IPolyMaterial::Initialize(
m_transp = transp;
m_alpha = alpha;
m_zsort = zsort;
- //m_lightlayer = lightlayer;
m_polymatid = m_newpolymatid++;
m_flag = 0;
m_multimode = 0;
@@ -72,7 +70,6 @@ void RAS_IPolyMaterial::Initialize(
RAS_IPolyMaterial::RAS_IPolyMaterial()
: m_texturename("__Dummy_Texture_Name__"),
m_materialname("__Dummy_Material_Name__"),
- m_materialindex(0),
m_tile(0),
m_tilexrep(0),
m_tileyrep(0),
@@ -80,7 +77,7 @@ RAS_IPolyMaterial::RAS_IPolyMaterial()
m_transp(0),
m_alpha(false),
m_zsort(false),
- //m_lightlayer(0),
+ m_materialindex(0),
m_polymatid(0),
m_flag(0),
m_multimode(0)
@@ -100,11 +97,9 @@ RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname,
int mode,
int transp,
bool alpha,
- bool zsort,
- int lightlayer)
+ bool zsort)
: m_texturename(texname),
m_materialname(matname),
- m_materialindex(materialindex),
m_tile(tile),
m_tilexrep(tilexrep),
m_tileyrep(tileyrep),
@@ -112,7 +107,7 @@ RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname,
m_transp(transp),
m_alpha(alpha),
m_zsort(zsort),
- //m_lightlayer(lightlayer),
+ m_materialindex(materialindex),
m_polymatid(m_newpolymatid++),
m_flag(0),
m_multimode(0)
@@ -172,11 +167,6 @@ bool RAS_IPolyMaterial::Less(const RAS_IPolyMaterial& rhs) const
return m_polymatid < rhs.m_polymatid;
}
-//int RAS_IPolyMaterial::GetLightLayer() const
-//{
-// return m_lightlayer;
-//}
-
bool RAS_IPolyMaterial::IsAlpha() const
{
return m_alpha || m_zsort;
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
index e19db35ccb5..af909dfa731 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
@@ -38,6 +38,10 @@
#include "MT_Vector3.h"
#include "STR_HashedString.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_IRasterizer;
struct MTFace;
struct Material;
@@ -73,7 +77,6 @@ protected:
int m_transp;
bool m_alpha;
bool m_zsort;
- //int m_lightlayer;
int m_materialindex;
unsigned int m_polymatid;
@@ -83,7 +86,6 @@ protected:
unsigned int m_flag;//MaterialProps
int m_multimode; // sum of values
public:
-
MT_Vector3 m_diffuse;
float m_shininess;
MT_Vector3 m_specular;
@@ -110,8 +112,7 @@ public:
int mode,
int transp,
bool alpha,
- bool zsort,
- int lightlayer);
+ bool zsort);
void Initialize(const STR_String& texname,
const STR_String& matname,
int materialindex,
@@ -121,8 +122,7 @@ public:
int mode,
int transp,
bool alpha,
- bool zsort,
- int lightlayer);
+ bool zsort);
virtual ~RAS_IPolyMaterial() {};
/**
@@ -168,6 +168,13 @@ public:
* PreCalculate texture gen
*/
virtual void OnConstruction(int layer){}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IPolyMaterial"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
inline bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index dc8c3c1ebf8..05406413941 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -43,6 +43,10 @@
#include <vector>
using namespace std;
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_ICanvas;
class RAS_IPolyMaterial;
@@ -57,7 +61,6 @@ typedef vector< KX_IndexArray* > vecIndexArrays;
class RAS_IRasterizer
{
public:
-
RAS_IRasterizer(RAS_ICanvas* canv){};
virtual ~RAS_IRasterizer(){};
/**
@@ -407,6 +410,13 @@ public:
virtual void SetBlendingMode(int blendmode)=0;
virtual void SetFrontFace(bool ccw)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRasterizer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_IRASTERIZER
diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h
index 52f6397cf6c..5d52ddc9688 100644
--- a/source/gameengine/Rasterizer/RAS_IRenderTools.h
+++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h
@@ -36,6 +36,10 @@
#include <vector>
#include <algorithm>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class RAS_IPolyMaterial;
struct RAS_LightObject;
@@ -180,6 +184,13 @@ public:
virtual
void
Render2DFilters(RAS_ICanvas* canvas)=0;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IRenderTools"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_IRENDERTOOLS
diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
index 8db75b8b735..dc9abbfbddf 100644
--- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h
+++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
@@ -79,8 +79,11 @@ class RAS_DisplayArray
public:
vector<RAS_TexVert> m_vertex;
vector<unsigned short> m_index;
+ /* LINE currently isnt used */
enum { LINE = 2, TRIANGLE = 3, QUAD = 4 } m_type;
//RAS_MeshSlot *m_origSlot;
+
+ /* Number of RAS_MeshSlot using this array */
int m_users;
enum { BUCKET_MAX_INDEX = 65535 };
@@ -169,6 +172,13 @@ public:
bool IsCulled() { return m_bCulled; }
#endif
void SetCulled(bool culled) { m_bCulled = culled; }
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshSlot"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/* Used by RAS_MeshObject, to point to it's slots in a bucket */
@@ -179,6 +189,13 @@ public:
RAS_MeshSlot *m_baseslot;
class RAS_MaterialBucket *m_bucket;
GEN_Map<GEN_HashedPtr,RAS_MeshSlot*> m_slots;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshMaterial"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
/* Contains a list of display arrays with the same material,
@@ -232,6 +249,12 @@ private:
RAS_IPolyMaterial* m_material;
SG_DList m_activeMeshSlotsHead; // only those which must be rendered
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MaterialBucket"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_MATERIAL_BUCKET
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
index 1dfcb0c512d..0995d5acdd5 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
@@ -90,9 +90,8 @@ struct RAS_MeshObject::fronttoback
STR_String RAS_MeshObject::s_emptyname = "";
-RAS_MeshObject::RAS_MeshObject(Mesh* mesh, int lightlayer)
- : //m_lightlayer(lightlayer),
- m_bModified(true),
+RAS_MeshObject::RAS_MeshObject(Mesh* mesh)
+ : m_bModified(true),
m_bMeshModified(true),
m_mesh(mesh),
m_bDeformed(false)
@@ -382,6 +381,13 @@ RAS_TexVert* RAS_MeshObject::GetVertex(unsigned int matid,
return NULL;
}
+const float* RAS_MeshObject::GetVertexLocation(unsigned int orig_index)
+{
+ vector<SharedVertex>& sharedmap = m_sharedvertex_map[orig_index];
+ vector<SharedVertex>::iterator it= sharedmap.begin();
+ return it->m_darray->m_vertex[it->m_offset].getXYZ();
+}
+
void RAS_MeshObject::AddMeshUser(void *clientobj, SG_QList *head, RAS_Deformer* deformer)
{
list<RAS_MeshMaterial>::iterator it;
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h
index e763d6e7c7f..1738423c4f3 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.h
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.h
@@ -55,7 +55,6 @@ class RAS_MeshObject
{
private:
unsigned int m_debugcolor;
- //int m_lightlayer;
bool m_bModified;
bool m_bMeshModified;
@@ -77,7 +76,7 @@ protected:
public:
// for now, meshes need to be in a certain layer (to avoid sorting on lights in realtime)
- RAS_MeshObject(Mesh* mesh, int lightlayer);
+ RAS_MeshObject(Mesh* mesh);
virtual ~RAS_MeshObject();
@@ -126,6 +125,7 @@ public:
/* vertex and polygon acces */
int NumVertices(RAS_IPolyMaterial* mat);
RAS_TexVert* GetVertex(unsigned int matid, unsigned int index);
+ const float* GetVertexLocation(unsigned int orig_index);
int NumPolygons();
RAS_Polygon* GetPolygon(int num) const;
@@ -141,6 +141,13 @@ public:
bool culled);
void RemoveFromBuckets(void *clientobj);
+ void EndConversion() {
+#if 0
+ m_sharedvertex_map.clear(); // SharedVertex
+ vector<vector<SharedVertex> > shared_null(0);
+ shared_null.swap( m_sharedvertex_map ); /* really free the memory */
+#endif
+ }
/* colors */
void DebugColor(unsigned int abgr);
@@ -166,6 +173,13 @@ public:
};
vector<vector<SharedVertex> > m_sharedvertex_map;
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_MeshObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_MESHOBJECT
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index fe3d0f6aeea..f2b97bedb2f 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -27,18 +27,18 @@
FILE(GLOB SRC *.cpp)
SET(INC
- ../../../../source/kernel/gen_system
- ../../../../intern/string
- ../../../../intern/moto/include
- ../../../../source/gameengine/Rasterizer
- ../../../../source/gameengine/Ketsji
- ../../../../source/gameengine/SceneGraph
- ../../../../extern/glew/include
- ../../../../source/blender/gpu
- ../../../../source/blender/makesdna
- ../../../../source/blender/blenkernel
- ../../../../source/blender/blenlib
- ../../../../source/blender/blenloader
+ ../../../../source/kernel/gen_system
+ ../../../../intern/string
+ ../../../../intern/moto/include
+ ../../../../source/gameengine/Rasterizer
+ ../../../../source/gameengine/Ketsji
+ ../../../../source/gameengine/SceneGraph
+ ../../../../extern/glew/include
+ ../../../../source/blender/gpu
+ ../../../../source/blender/makesdna
+ ../../../../source/blender/blenkernel
+ ../../../../source/blender/blenlib
+ ../../../../source/blender/blenloader
)
BLENDERLIB(bf_oglrasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
index fe358808e4a..cff48081f02 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
@@ -66,6 +66,13 @@ public:
virtual void SetDrawingMode(int drawingmode);
virtual bool QueryLists(){return true;}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_ListRasterizer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 83ba2778ad6..d16348defb2 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -451,10 +451,10 @@ RAS_IRasterizer::StereoMode RAS_OpenGLRasterizer::GetStereoMode()
bool RAS_OpenGLRasterizer::Stereo()
{
- if(m_stereomode == RAS_STEREO_NOSTEREO || m_stereomode == RAS_STEREO_DOME)
- return false;
- else
+ if(m_stereomode > RAS_STEREO_NOSTEREO) // > 0
return true;
+ else
+ return false;
}
bool RAS_OpenGLRasterizer::InterlacedStereo()
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index e3422394e9e..db0f97bf46f 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -289,6 +289,13 @@ public:
virtual void SetBlendingMode(int blendmode);
virtual void SetFrontFace(bool ccw);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_OpenGLRasterizer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_OPENGLRASTERIZER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
index 766bbfbed0e..6112c1a4d98 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
@@ -58,6 +58,12 @@ private:
//virtual bool QueryArrays(){return true;}
//virtual bool QueryLists(){return m_Lock;}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_VAOpenGLRasterizer"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__KX_VERTEXARRAYOPENGLRASTERIZER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
index 3d605ce12b8..fb4c685f8d3 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
@@ -8,9 +8,4 @@ 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'
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_oglrasterizer', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350, 115], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_oglrasterizer', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,75], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Rasterizer/RAS_Polygon.cpp b/source/gameengine/Rasterizer/RAS_Polygon.cpp
index eacc1285166..87c5118c5fb 100644
--- a/source/gameengine/Rasterizer/RAS_Polygon.cpp
+++ b/source/gameengine/Rasterizer/RAS_Polygon.cpp
@@ -31,6 +31,7 @@
#endif
#include "RAS_Polygon.h"
+#include "RAS_MeshObject.h" /* only for GetVertexOffsetAbs */
RAS_Polygon::RAS_Polygon(RAS_MaterialBucket* bucket, RAS_DisplayArray *darray, int numvert)
{
@@ -63,6 +64,20 @@ int RAS_Polygon::GetVertexOffset(int i)
return m_offset[i];
}
+int RAS_Polygon::GetVertexOffsetAbs(RAS_MeshObject *mesh, int i)
+{
+ /* hack that only works because there can only ever be 2 different
+ * GetDisplayArray's per mesh. if this uses a different display array to the first
+ * then its incices are offset.
+ * if support for edges is added back this would need to be changed. */
+ RAS_DisplayArray* darray= mesh->GetPolygon(0)->GetDisplayArray();
+
+ if(m_darray != darray)
+ return m_offset[i] + darray->m_vertex.size();
+
+ return m_offset[i];
+}
+
/*
int RAS_Polygon::GetEdgeCode()
{
diff --git a/source/gameengine/Rasterizer/RAS_Polygon.h b/source/gameengine/Rasterizer/RAS_Polygon.h
index 41eaa6bdd4a..bd8cfe0be28 100644
--- a/source/gameengine/Rasterizer/RAS_Polygon.h
+++ b/source/gameengine/Rasterizer/RAS_Polygon.h
@@ -35,6 +35,10 @@
#include <vector>
using namespace std;
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/* polygon flags */
class RAS_Polygon
@@ -68,6 +72,7 @@ public:
void SetVertexOffset(int i, unsigned short offset);
int GetVertexOffset(int i);
+ int GetVertexOffsetAbs(RAS_MeshObject *mesh, int i); /* accounts for quad and tri arrays, slower, for python */
// each bit is for a visible edge, starting with bit 1 for the first edge, bit 2 for second etc.
// - Not used yet!
@@ -85,6 +90,12 @@ public:
RAS_MaterialBucket* GetMaterial();
RAS_DisplayArray* GetDisplayArray();
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Polygon"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/Rasterizer/RAS_Rect.h b/source/gameengine/Rasterizer/RAS_Rect.h
index 4cd0c636cfd..ca7435673c9 100644
--- a/source/gameengine/Rasterizer/RAS_Rect.h
+++ b/source/gameengine/Rasterizer/RAS_Rect.h
@@ -30,6 +30,10 @@
#ifndef _RAS_RECT
#define _RAS_RECT
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/**
* @section interface class.
* RAS_Rect just encodes a simple rectangle.
@@ -89,6 +93,12 @@ public:
{
m_y2 = y2;
}
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_Rect"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif // _RAS_RECT
diff --git a/source/gameengine/Rasterizer/RAS_TexVert.h b/source/gameengine/Rasterizer/RAS_TexVert.h
index 811867f3579..b93078f4712 100644
--- a/source/gameengine/Rasterizer/RAS_TexVert.h
+++ b/source/gameengine/Rasterizer/RAS_TexVert.h
@@ -34,6 +34,10 @@
#include "MT_Point2.h"
#include "MT_Transform.h"
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
static MT_Point3 g_pt3;
static MT_Point2 g_pt2;
@@ -134,6 +138,12 @@ public:
// compare two vertices, to test if they can be shared, used for
// splitting up based on uv's, colors, etc
bool closeTo(const RAS_TexVert* other);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_TexVert"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__RAS_TEXVERT
diff --git a/source/gameengine/Rasterizer/SConscript b/source/gameengine/Rasterizer/SConscript
index 018f2ab4d20..dbec2d92e31 100644
--- a/source/gameengine/Rasterizer/SConscript
+++ b/source/gameengine/Rasterizer/SConscript
@@ -7,9 +7,4 @@ sources = env.Glob('*.cpp')
incs = '. #source/kernel/gen_system #intern/string #intern/moto/include #source/gameengine/BlenderRoutines #extern/glew/include #source/gameengine/Expressions #source/gameengine/SceneGraph #source/blender/blenkernel #source/blender/makesdna'
incs += ' ' + env['BF_PYTHON_INC']
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_rasterizer', sources, Split(incs), [], libtype=['core','player'], priority=[350,115], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_rasterizer', sources, Split(incs), [], libtype=['core','player'], priority=[350,70], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/SceneGraph/CMakeLists.txt b/source/gameengine/SceneGraph/CMakeLists.txt
index 0409b8c0ac4..2ac52be938e 100644
--- a/source/gameengine/SceneGraph/CMakeLists.txt
+++ b/source/gameengine/SceneGraph/CMakeLists.txt
@@ -27,8 +27,8 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../intern/moto/include
+ .
+ ../../../intern/moto/include
)
BLENDERLIB(bf_scenegraph "${SRC}" "${INC}")
diff --git a/source/gameengine/SceneGraph/SConscript b/source/gameengine/SceneGraph/SConscript
index 0692b170a61..2a33cd67b5e 100644
--- a/source/gameengine/SceneGraph/SConscript
+++ b/source/gameengine/SceneGraph/SConscript
@@ -6,9 +6,4 @@ sources = env.Glob('*.cpp')
incs = '. #intern/moto/include'
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
-
-env.BlenderLib ( 'bf_scenegraph', sources, Split(incs), [], libtype=['core','player'], priority=[325,125], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_scenegraph', sources, Split(incs), [], libtype=['core','player'], priority=[325,85], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/SceneGraph/SG_BBox.h b/source/gameengine/SceneGraph/SG_BBox.h
index c39ad268e25..8dbb9869dae 100644
--- a/source/gameengine/SceneGraph/SG_BBox.h
+++ b/source/gameengine/SceneGraph/SG_BBox.h
@@ -38,6 +38,10 @@
#include <vector>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
class SG_Node;
/**
@@ -128,6 +132,12 @@ public:
friend class SG_Tree;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_BBox"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif /* __SG_BBOX_H__ */
diff --git a/source/gameengine/SceneGraph/SG_Controller.h b/source/gameengine/SceneGraph/SG_Controller.h
index c32885b915f..db9d7bdb464 100644
--- a/source/gameengine/SceneGraph/SG_Controller.h
+++ b/source/gameengine/SceneGraph/SG_Controller.h
@@ -40,6 +40,12 @@
class SG_Controller
{
public:
+
+#ifdef WITH_CXX_GUARDEDALLOC
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "SG_Controller"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+
SG_Controller(
) :
m_pObject(NULL) {
diff --git a/source/gameengine/SceneGraph/SG_DList.h b/source/gameengine/SceneGraph/SG_DList.h
index 7bef13cc9e3..97951792ab5 100644
--- a/source/gameengine/SceneGraph/SG_DList.h
+++ b/source/gameengine/SceneGraph/SG_DList.h
@@ -31,6 +31,10 @@
#include <stdlib.h>
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
/**
* Double circular linked list
*/
@@ -85,6 +89,46 @@ public:
}
};
+ template<typename T> class const_iterator
+ {
+ private:
+ const SG_DList& m_head;
+ const T* m_current;
+ public:
+ typedef const_iterator<T> _myT;
+ const_iterator(const SG_DList& head) : m_head(head), m_current(NULL) {}
+ ~const_iterator() {}
+
+ void begin()
+ {
+ m_current = (const T*)m_head.Peek();
+ }
+ void back()
+ {
+ m_current = (const T*)m_head.Back();
+ }
+ bool end()
+ {
+ return (m_current == (const T*)m_head.Self());
+ }
+ const T* operator*()
+ {
+ return m_current;
+ }
+ _myT& operator++()
+ {
+ // no check of NULL! make sure you don't try to increment beyond end
+ m_current = (const T*)m_current->Peek();
+ return *this;
+ }
+ _myT& operator--()
+ {
+ // no check of NULL! make sure you don't try to increment beyond end
+ m_current = (const T*)m_current->Back();
+ return *this;
+ }
+ };
+
SG_DList()
{
m_flink = m_blink = this;
@@ -155,6 +199,52 @@ public:
{
return this;
}
+ inline const SG_DList *Peek() const // Look at front without removing
+ {
+ return (const SG_DList*)m_flink;
+ }
+ inline const SG_DList *Back() const // Look at front without removing
+ {
+ return (const SG_DList*)m_blink;
+ }
+ inline const SG_DList *Self() const
+ {
+ return this;
+ }
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_DList"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+};
+
+/**
+ * SG_DListHead : Template class that implements copy constructor to duplicate list automatically
+ * The elements of the list must have themselves a copy constructor.
+ */
+template<typename T> class SG_DListHead : public SG_DList
+{
+public:
+ typedef SG_DListHead<T> _myT;
+ SG_DListHead() : SG_DList() {}
+ SG_DListHead(const _myT& other) : SG_DList()
+ {
+ // copy the list, assuming objects of type T
+ const_iterator<T> eit(other);
+ T* elem;
+ for (eit.begin(); !eit.end(); ++eit) {
+ elem = (*eit)->GetReplica();
+ AddBack(elem);
+ }
+ }
+ virtual ~SG_DListHead() {}
+ T* Remove()
+ {
+ return static_cast<T*>(SG_DList::Remove());
+ }
+
};
#endif //__SG_DLIST
diff --git a/source/gameengine/SceneGraph/SG_IObject.h b/source/gameengine/SceneGraph/SG_IObject.h
index 8f448a0e890..23e6c1e9c99 100644
--- a/source/gameengine/SceneGraph/SG_IObject.h
+++ b/source/gameengine/SceneGraph/SG_IObject.h
@@ -160,8 +160,6 @@ private :
SGControllerList m_SGcontrollers;
public:
-
-
virtual ~SG_IObject();
@@ -338,6 +336,11 @@ protected :
);
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_IObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__SG_IOBJECT
diff --git a/source/gameengine/SceneGraph/SG_Node.h b/source/gameengine/SceneGraph/SG_Node.h
index 7c6ef92f670..4281bcd11f6 100644
--- a/source/gameengine/SceneGraph/SG_Node.h
+++ b/source/gameengine/SceneGraph/SG_Node.h
@@ -40,7 +40,6 @@ typedef std::vector<SG_Node*> NodeList;
class SG_Node : public SG_Spatial
{
public:
-
SG_Node(
void* clientobj,
void* clientinfo,
@@ -260,6 +259,12 @@ private:
*/
SG_Node* m_SGparent;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Node"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__SG_NODE_H
diff --git a/source/gameengine/SceneGraph/SG_ParentRelation.h b/source/gameengine/SceneGraph/SG_ParentRelation.h
index 8f45df09b27..a6a43c19115 100644
--- a/source/gameengine/SceneGraph/SG_ParentRelation.h
+++ b/source/gameengine/SceneGraph/SG_ParentRelation.h
@@ -55,7 +55,6 @@ class SG_Spatial;
class SG_ParentRelation {
public :
-
/**
* Update the childs local and global coordinates
* based upon the parents global coordinates.
@@ -128,6 +127,13 @@ protected :
SG_ParentRelation(
const SG_ParentRelation &
);
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_ParentRelation"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif
diff --git a/source/gameengine/SceneGraph/SG_QList.h b/source/gameengine/SceneGraph/SG_QList.h
index d8afc33ea4f..6399111d80b 100644
--- a/source/gameengine/SceneGraph/SG_QList.h
+++ b/source/gameengine/SceneGraph/SG_QList.h
@@ -151,6 +151,13 @@ public:
{
return m_bqlink;
}
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_QList"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__SG_QLIST
diff --git a/source/gameengine/SceneGraph/SG_Spatial.h b/source/gameengine/SceneGraph/SG_Spatial.h
index 6e274487c9d..a818c8c81f7 100644
--- a/source/gameengine/SceneGraph/SG_Spatial.h
+++ b/source/gameengine/SceneGraph/SG_Spatial.h
@@ -66,7 +66,6 @@ protected:
bool m_ogldirty; // true if the openGL matrix for this object must be recomputed
public:
-
inline void ClearModified()
{
m_modified = false;
@@ -284,6 +283,12 @@ protected:
bool& parentUpdated
);
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Spatial"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif //__SG_SPATIAL_H
diff --git a/source/gameengine/SceneGraph/SG_Tree.h b/source/gameengine/SceneGraph/SG_Tree.h
index 4741af83aae..6ca3307920e 100644
--- a/source/gameengine/SceneGraph/SG_Tree.h
+++ b/source/gameengine/SceneGraph/SG_Tree.h
@@ -111,6 +111,13 @@ public:
}
};
+
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_Tree"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
@@ -148,6 +155,12 @@ public:
SG_Tree* MakeTree();
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_TreeFactory"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
};
#endif /* __SG_BBOX_H__ */
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index 9d1bb89d2ca..935c5a2c292 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -27,35 +27,34 @@
FILE(GLOB SRC *.cpp)
SET(INC
- .
- ../../../source/gameengine/Ketsji
- ../../../source/gameengine/Expressions
- ../../../source/gameengine/GameLogic
- ../../../source/gameengine/SceneGraph
- ../../../source/gameengine/Rasterizer
- ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
- ../../../source/gameengine/BlenderRoutines
- ../../../source/blender/include
- ../../../source/blender/blenlib
- ../../../source/blender/blenkernel
- ../../../source/blender/makesdna
- ../../../source/blender/editors/include
- ../../../source/blender/imbuf
- ../../../source/blender/python
- ../../../source/blender/gpu
- ../../../source/kernel/gen_system
- ../../../intern/string
- ../../../intern/moto/include
- ../../../intern/guardedalloc
- ../../../intern/SoundSystem
- ../../../extern/glew/include
- ${PYTHON_INC}
+ .
+ ../../../source/gameengine/Ketsji
+ ../../../source/gameengine/Expressions
+ ../../../source/gameengine/GameLogic
+ ../../../source/gameengine/SceneGraph
+ ../../../source/gameengine/Rasterizer
+ ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../source/gameengine/BlenderRoutines
+ ../../../source/blender/include
+ ../../../source/blender/blenlib
+ ../../../source/blender/blenkernel
+ ../../../source/blender/makesdna
+ ../../../source/blender/editors/include
+ ../../../source/blender/imbuf
+ ../../../source/blender/python
+ ../../../source/blender/gpu
+ ../../../source/kernel/gen_system
+ ../../../intern/string
+ ../../../intern/moto/include
+ ../../../intern/guardedalloc
+ ../../../extern/glew/include
+ ${PYTHON_INC}
)
IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
- ADD_DEFINITIONS(-D__STDC_CONSTANT_MACROS)
+ SET(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
+ ADD_DEFINITIONS(-DWITH_FFMPEG)
+ ADD_DEFINITIONS(-D__STDC_CONSTANT_MACROS)
ENDIF(WITH_FFMPEG)
BLENDERLIB(bf_videotex "${SRC}" "${INC}")
diff --git a/source/gameengine/VideoTexture/Exception.cpp b/source/gameengine/VideoTexture/Exception.cpp
index 8704d49f2a7..35d335b5981 100644
--- a/source/gameengine/VideoTexture/Exception.cpp
+++ b/source/gameengine/VideoTexture/Exception.cpp
@@ -21,7 +21,7 @@ http://www.gnu.org/copyleft/lesser.txt.
*/
-#include <strstream>
+#include <sstream>
#include <fstream>
#include <PyObjectPlus.h>
@@ -170,11 +170,11 @@ void Exception::setXptDesc (void)
// length of result code
const size_t rsltSize = 11;
// delimit description
- const char delimRslt[] = ": ";
+ //const char delimRslt[] = ": ";
// set text of description
char rsltTxt[rsltSize];
- std::ostrstream os(rsltTxt, rsltSize);
- os << std::hex << m_hRslt << delimRslt << '\0';
+ std::ostringstream os;
+ os << std::hex << m_hRslt << ": " << '\0';
// copy result to description
m_desc.insert(0, rsltTxt);
// copy exception description to last exception string
diff --git a/source/gameengine/VideoTexture/FilterBlueScreen.cpp b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
index 6b23105a278..2a624b2ccaa 100644
--- a/source/gameengine/VideoTexture/FilterBlueScreen.cpp
+++ b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
@@ -81,17 +81,17 @@ static int setColor (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 3
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2)))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2)))
{
PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 3 ints");
return -1;
}
// set color
- getFilter(self)->setColor((unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
- (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))),
- (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))));
+ getFilter(self)->setColor((unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
+ (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1))),
+ (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2))));
// success
return 0;
}
@@ -108,15 +108,15 @@ static int setLimits (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1)))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 2 ints");
return -1;
}
// set limits
- getFilter(self)->setLimits((unsigned short)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
- (unsigned short)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))));
+ getFilter(self)->setLimits((unsigned short)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
+ (unsigned short)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1))));
// success
return 0;
}
@@ -135,13 +135,7 @@ static PyGetSetDef filterBSGetSets[] =
// define python type
PyTypeObject FilterBlueScreenType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterBlueScreen", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/FilterColor.cpp b/source/gameengine/VideoTexture/FilterColor.cpp
index 5ff1f7f11ce..e5d479747c4 100644
--- a/source/gameengine/VideoTexture/FilterColor.cpp
+++ b/source/gameengine/VideoTexture/FilterColor.cpp
@@ -41,13 +41,7 @@ static PyGetSetDef filterGrayGetSets[] =
// define python type
PyTypeObject FilterGrayType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterGray", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -147,10 +141,10 @@ static int setMatrix (PyFilter * self, PyObject * value, void * closure)
for (int c = 0; valid && c < 5; ++c)
{
// item must be int
- valid = PyInt_Check(PySequence_Fast_GET_ITEM(row, c));
+ valid = PyLong_Check(PySequence_Fast_GET_ITEM(row, c));
// if it is valid, save it in matrix
if (valid)
- mat[r][c] = short(PyInt_AsLong(PySequence_Fast_GET_ITEM(row, c)));
+ mat[r][c] = short(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(row, c)));
}
}
// if parameter is not valid, report error
@@ -178,13 +172,7 @@ static PyGetSetDef filterColorGetSets[] =
// define python type
PyTypeObject FilterColorType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterColor", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -286,10 +274,10 @@ static int setLevels (PyFilter * self, PyObject * value, void * closure)
for (int c = 0; valid && c < 2; ++c)
{
// item must be int
- valid = PyInt_Check(PySequence_Fast_GET_ITEM(row, c));
+ valid = PyLong_Check(PySequence_Fast_GET_ITEM(row, c));
// if it is valid, save it in matrix
if (valid)
- lev[r][c] = (unsigned short)(PyInt_AsLong(PySequence_Fast_GET_ITEM(row, c)));
+ lev[r][c] = (unsigned short)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(row, c)));
}
}
// if parameter is not valid, report error
@@ -317,13 +305,7 @@ static PyGetSetDef filterLevelGetSets[] =
// define python type
PyTypeObject FilterLevelType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterLevel", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/FilterNormal.cpp b/source/gameengine/VideoTexture/FilterNormal.cpp
index 9a2b1e90d5a..d755e6294c9 100644
--- a/source/gameengine/VideoTexture/FilterNormal.cpp
+++ b/source/gameengine/VideoTexture/FilterNormal.cpp
@@ -72,13 +72,13 @@ static PyObject * getColor (PyFilter * self, void * closure)
static int setColor (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PyInt_Check(value))
+ if (value == NULL || !PyLong_Check(value))
{
PyErr_SetString(PyExc_TypeError, "filt.colorIdx = int: VideoTexture.FilterNormal, expected the value must be a int");
return -1;
}
// set color index
- getFilter(self)->setColor((unsigned short)(PyInt_AsLong(value)));
+ getFilter(self)->setColor((unsigned short)(PyLong_AsSsize_t(value)));
// success
return 0;
}
@@ -124,13 +124,7 @@ static PyGetSetDef filterNormalGetSets[] =
// define python type
PyTypeObject FilterNormalType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterNormal", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/FilterSource.cpp b/source/gameengine/VideoTexture/FilterSource.cpp
index 4c75e14bbac..4b67785edb3 100644
--- a/source/gameengine/VideoTexture/FilterSource.cpp
+++ b/source/gameengine/VideoTexture/FilterSource.cpp
@@ -36,13 +36,7 @@ http://www.gnu.org/copyleft/lesser.txt.
// define python type
PyTypeObject FilterRGB24Type =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterRGB24", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -87,13 +81,7 @@ PyTypeObject FilterRGB24Type =
// define python type
PyTypeObject FilterRGBA32Type =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterRGBA32", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -138,13 +126,7 @@ PyTypeObject FilterRGBA32Type =
// define python type
PyTypeObject FilterBGR24Type =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.FilterBGR24", /*tp_name*/
sizeof(PyFilter), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp
index 5e2841271a6..0740afed2c6 100644
--- a/source/gameengine/VideoTexture/ImageBase.cpp
+++ b/source/gameengine/VideoTexture/ImageBase.cpp
@@ -219,15 +219,17 @@ bool ImageBase::checkSourceSizes (void)
// get size of current source
short * curSize = (*it)->getSize();
// if size is available and is not empty
- if (curSize[0] != 0 && curSize[1] != 0)
+ if (curSize[0] != 0 && curSize[1] != 0) {
// if reference size is not set
- if (refSize == NULL)
+ if (refSize == NULL) {
// set current size as reference
refSize = curSize;
// otherwise check with current size
- else if (curSize[0] != refSize[0] || curSize[1] != refSize[1])
+ } else if (curSize[0] != refSize[0] || curSize[1] != refSize[1]) {
// if they don't match, report it
return false;
+ }
+ }
}
// all sizes match
return true;
diff --git a/source/gameengine/VideoTexture/ImageBuff.cpp b/source/gameengine/VideoTexture/ImageBuff.cpp
index c7185660e83..9cd661a2422 100644
--- a/source/gameengine/VideoTexture/ImageBuff.cpp
+++ b/source/gameengine/VideoTexture/ImageBuff.cpp
@@ -122,13 +122,7 @@ static PyGetSetDef imageBuffGetSets[] =
// define python type
PyTypeObject ImageBuffType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageBuff", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/ImageMix.cpp b/source/gameengine/VideoTexture/ImageMix.cpp
index 067143e57bb..2560467c3db 100644
--- a/source/gameengine/VideoTexture/ImageMix.cpp
+++ b/source/gameengine/VideoTexture/ImageMix.cpp
@@ -166,13 +166,7 @@ static PyGetSetDef imageMixGetSets[] =
// define python type
PyTypeObject ImageMixType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageMix", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index c4fb1fefd9c..6e70bfb14a0 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -331,19 +331,19 @@ static int setBackground (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 2))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(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))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 3)))
{
PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 4 integer between 0 and 255");
return -1;
}
// set background color
- getImageRender(self)->setBackground((unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
- (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1))),
- (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2))),
- (unsigned char)(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 3))));
+ getImageRender(self)->setBackground((unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
+ (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1))),
+ (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 2))),
+ (unsigned char)(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 3))));
// success
return 0;
}
@@ -376,13 +376,7 @@ static PyGetSetDef imageRenderGetSets[] =
// define python type
PyTypeObject ImageRenderType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageRender", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -715,13 +709,7 @@ ImageRender::ImageRender (KX_Scene * scene, KX_GameObject * observer, KX_GameObj
// define python type
PyTypeObject ImageMirrorType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageMirror", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/ImageViewport.cpp b/source/gameengine/VideoTexture/ImageViewport.cpp
index d2c23e758f6..691a983970a 100644
--- a/source/gameengine/VideoTexture/ImageViewport.cpp
+++ b/source/gameengine/VideoTexture/ImageViewport.cpp
@@ -218,16 +218,16 @@ static int ImageViewport_setPosition (PyImage * self, PyObject * value, void * c
{
// check validity of parameter
if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1)))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 2 ints");
return -1;
}
// set position
GLint pos [] = {
- GLint(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
- GLint(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1)))
+ GLint(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
+ GLint(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1)))
};
getImageViewport(self)->setPosition(pos);
// success
@@ -246,16 +246,16 @@ int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closu
{
// check validity of parameter
if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 0))
- || !PyInt_Check(PySequence_Fast_GET_ITEM(value, 1)))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
+ || !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
PyErr_SetString(PyExc_TypeError, "The value must be a sequence of 2 ints");
return -1;
}
// set capture size
short size [] = {
- short(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 0))),
- short(PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 1)))
+ short(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 0))),
+ short(PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, 1)))
};
getImageViewport(self)->setCaptureSize(size);
// success
@@ -289,13 +289,7 @@ static PyGetSetDef imageViewportGetSets[] =
// define python type
PyTypeObject ImageViewportType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageViewport", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/Makefile b/source/gameengine/VideoTexture/Makefile
index 8677ed5c177..90457df720f 100644
--- a/source/gameengine/VideoTexture/Makefile
+++ b/source/gameengine/VideoTexture/Makefile
@@ -42,7 +42,6 @@ CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
CPPFLAGS += -I../../blender/python
CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
diff --git a/source/gameengine/VideoTexture/SConscript b/source/gameengine/VideoTexture/SConscript
index 920da8ffb2e..119bd1c9954 100644
--- a/source/gameengine/VideoTexture/SConscript
+++ b/source/gameengine/VideoTexture/SConscript
@@ -12,22 +12,18 @@ incs += ' #source/gameengine/BlenderRoutines'
incs += ' #source/blender/editors/include #source/blender/blenlib #source/blender/blenkernel'
incs += ' #source/blender/makesdna #source/blender/imbuf #source/blender/python'
incs += ' #source/blender/gpu #source/kernel/gen_system #intern/string #intern/moto/include'
-incs += ' #intern/guardedalloc #intern/SoundSystem'
-incs += ' #extern/glew/include'
-
-defs = ''
-cxxflags = []
-if env['OURPLATFORM']=='win32-vc':
- cxxflags.append ('/GR')
- cxxflags.append ('/O2')
+incs += ' #intern/guardedalloc #extern/glew/include'
+defs = []
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ if env['BF_DEBUG']:
+ defs.append('_DEBUG')
incs += ' ' + env['BF_PYTHON_INC']
#incs += ' ' + env['BF_OPENGL_INC']
if env['WITH_BF_FFMPEG']:
- defs += ' WITH_FFMPEG'
+ defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC'] + ' ' + env['BF_PTHREADS_INC']
- defs += ' __STDC_CONSTANT_MACROS'
-env.BlenderLib ( 'bf_videotex', sources, Split(incs), Split(defs), libtype=['core','player'], priority=[300, 72], cxx_compileflags = cxxflags )
+env.BlenderLib ( 'bf_videotex', sources, Split(incs), defs, libtype=['core','player'], priority=[300,205], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/VideoTexture/Texture.cpp b/source/gameengine/VideoTexture/Texture.cpp
index f4105652f80..04b39f0b05c 100644
--- a/source/gameengine/VideoTexture/Texture.cpp
+++ b/source/gameengine/VideoTexture/Texture.cpp
@@ -434,13 +434,7 @@ static PyGetSetDef textureGetSets[] =
// class Texture declaration
PyTypeObject TextureType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.Texture", /*tp_name*/
sizeof(Texture), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/VideoBase.cpp b/source/gameengine/VideoTexture/VideoBase.cpp
index 5d449a158d8..5de7a9e80a9 100644
--- a/source/gameengine/VideoTexture/VideoBase.cpp
+++ b/source/gameengine/VideoTexture/VideoBase.cpp
@@ -167,13 +167,13 @@ PyObject * Video_getRepeat (PyImage * self, void * closure)
int Video_setRepeat (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PyInt_Check(value))
+ if (value == NULL || !PyLong_Check(value))
{
PyErr_SetString(PyExc_TypeError, "The value must be an int");
return -1;
}
// set repeat
- getVideo(self)->setRepeat(int(PyInt_AsLong(value)));
+ getVideo(self)->setRepeat(int(PyLong_AsSsize_t(value)));
// success
return 0;
}
diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.cpp b/source/gameengine/VideoTexture/VideoFFmpeg.cpp
index 1a5481488c0..f21555a95c9 100644
--- a/source/gameengine/VideoTexture/VideoFFmpeg.cpp
+++ b/source/gameengine/VideoTexture/VideoFFmpeg.cpp
@@ -1095,13 +1095,13 @@ PyObject * VideoFFmpeg_getPreseek (PyImage *self, void * closure)
int VideoFFmpeg_setPreseek (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PyInt_Check(value))
+ if (value == NULL || !PyLong_Check(value))
{
PyErr_SetString(PyExc_TypeError, "The value must be an integer");
return -1;
}
// set preseek
- getFFmpeg(self)->setPreseek(PyInt_AsLong(value));
+ getFFmpeg(self)->setPreseek(PyLong_AsSsize_t(value));
// success
return 0;
}
@@ -1160,13 +1160,7 @@ static PyGetSetDef videoGetSets[] =
// python type declaration
PyTypeObject VideoFFmpegType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.VideoFFmpeg", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
@@ -1284,13 +1278,7 @@ static PyGetSetDef imageGetSets[] =
// python type declaration
PyTypeObject ImageFFmpegType =
{
-#if (PY_VERSION_HEX >= 0x02060000)
PyVarObject_HEAD_INIT(NULL, 0)
-#else
- /* python 2.5 and below */
- PyObject_HEAD_INIT( NULL ) /* required py macro */
- 0, /*ob_size*/
-#endif
"VideoTexture.ImageFFmpeg", /*tp_name*/
sizeof(PyImage), /*tp_basicsize*/
0, /*tp_itemsize*/
diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp
index dad52a426b6..998d63506b0 100644
--- a/source/gameengine/VideoTexture/blendVideoTex.cpp
+++ b/source/gameengine/VideoTexture/blendVideoTex.cpp
@@ -67,7 +67,7 @@ static PyObject * getMaterialID (PyObject *self, PyObject *args)
// get last error description
static PyObject * getLastError (PyObject *self, PyObject *args)
{
- return PyString_FromString(Exception::m_lastError.c_str());
+ return PyUnicode_FromString(Exception::m_lastError.c_str());
}
// set log file
@@ -159,8 +159,6 @@ static void registerAllTypes(void)
pyFilterTypes.add(&FilterBGR24Type, "FilterBGR24");
}
-
-#if (PY_VERSION_HEX >= 0x03000000)
static struct PyModuleDef VideoTexture_module_def = {
{}, /* m_base */
"VideoTexture", /* m_name */
@@ -172,7 +170,6 @@ static struct PyModuleDef VideoTexture_module_def = {
0, /* m_clear */
0, /* m_free */
};
-#endif
PyObject* initVideoTexture(void)
{
@@ -202,14 +199,8 @@ PyObject* initVideoTexture(void)
else {
PyErr_Clear();
-#if (PY_VERSION_HEX >= 0x03000000)
m = PyModule_Create(&VideoTexture_module_def);
PyDict_SetItemString(PySys_GetObject("modules"), VideoTexture_module_def.m_name, m);
-#else
- m = Py_InitModule4("VideoTexture", moduleMethods,
- "Module that allows to play video files on textures in GameBlender.",
- (PyObject*)NULL,PYTHON_API_VERSION);
-#endif
}
if (m == NULL)
diff --git a/source/icons/SConscript b/source/icons/SConscript
index 1471a06c09d..c929729f05b 100644
--- a/source/icons/SConscript
+++ b/source/icons/SConscript
@@ -3,4 +3,4 @@ Import ('env')
source = 'winblender.rcscons'
-env.BlenderRes('winresource', source, ['core', 'player'], priority=[95 , 100]) \ No newline at end of file
+env.BlenderRes('winresource', source, ['core'], priority=[95])
diff --git a/source/kernel/CMakeLists.txt b/source/kernel/CMakeLists.txt
index ac759393326..3aea2b9bcb0 100644
--- a/source/kernel/CMakeLists.txt
+++ b/source/kernel/CMakeLists.txt
@@ -27,11 +27,11 @@
SET(INC gen_messaging gen_system ../../intern/string ../../intern/moto/include ../../source/blender/blenloader )
FILE(GLOB 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/intern/messaging.c
+ gen_system/GEN_HashedPtr.cpp
+ gen_system/GEN_Matrix4x4.cpp
+ gen_system/SYS_SingletonSystem.cpp
+ gen_system/SYS_System.cpp
)
BLENDERLIB(bf_kernel "${SRC}" "${INC}")
diff --git a/source/kernel/SConscript b/source/kernel/SConscript
index 908e059ceab..3110f46cfad 100644
--- a/source/kernel/SConscript
+++ b/source/kernel/SConscript
@@ -7,4 +7,4 @@ 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, 150] )
+env.BlenderLib ( 'bf_kernel', Split(sources), Split(incs), [], libtype = ['core','player'], priority = [400,100] )
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.cpp b/source/kernel/gen_system/SYS_SingletonSystem.cpp
index 47e35cf84d8..43d70a94ae1 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.cpp
+++ b/source/kernel/gen_system/SYS_SingletonSystem.cpp
@@ -95,6 +95,6 @@ void SYS_SingletonSystem::SYS_WriteCommandLineString(const char *paramname, cons
m_string_commandlineparms.insert(paramname, value);
}
-SYS_SingletonSystem::SYS_SingletonSystem() : m_soundfilecache(NULL)
+SYS_SingletonSystem::SYS_SingletonSystem()
{
}
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.h b/source/kernel/gen_system/SYS_SingletonSystem.h
index 175656ac4ed..b72070c4e23 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.h
+++ b/source/kernel/gen_system/SYS_SingletonSystem.h
@@ -56,7 +56,6 @@ private:
GEN_Map<STR_HashedString,int> m_int_commandlineparms;
GEN_Map<STR_HashedString,float> m_float_commandlineparms;
GEN_Map<STR_HashedString,STR_String> m_string_commandlineparms;
- void* m_soundfilecache;
};
#endif //__SINGLETONSYSTEM_H
diff --git a/source/nan_compile.mk b/source/nan_compile.mk
index bc264fe5c1d..8d4da1e2790 100644
--- a/source/nan_compile.mk
+++ b/source/nan_compile.mk
@@ -39,11 +39,9 @@ CPPFLAGS ?= $(NAN_CPPFLAGS)
# Uncomment next lines to enable integrated game engine
ifneq ($(NAN_NO_KETSJI), true)
CFLAGS += -DGAMEBLENDER=1
- CFLAGS += -DUSE_SUMO_SOLID
- CCFLAGS += -DUSE_SUMO_SOLID
ifeq ($(NAN_USE_BULLET), true)
- CFLAGS += -DUSE_BULLET -DWITH_BULLET
- CCFLAGS += -DUSE_BULLET -DWITH_BULLET
+ CFLAGS += -DUSE_BULLET
+ CCFLAGS += -DUSE_BULLET
endif
else
CPPFLAGS += -DNO_KETSJI
@@ -64,27 +62,27 @@ ifdef NAN_DEBUG
CCFLAGS += $(NAN_DEBUG)
endif
-REL_CFLAGS += -DNDEBUG
-REL_CCFLAGS += -DNDEBUG
-DBG_CFLAGS += -g
-DBG_CCFLAGS += -g
+REL_CFLAGS += -DNDEBUG
+REL_CCFLAGS += -DNDEBUG
+DBG_CFLAGS += -g
+DBG_CCFLAGS += -g
# OS dependent parts ---------------------------------------------------
ifeq ($(OS),darwin)
- CC = gcc
- CCC = g++
- ifeq ($(CPU),powerpc)
- CFLAGS += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- else
- CFLAGS += -pipe -fPIC -ffast-math -march=pentium-m -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- endif
-# REL_CFLAGS += -O
-# REL_CCFLAGS += -O2
- CPPFLAGS += -D_THREAD_SAFE
- NAN_DEPEND = true
+ CC ?= gcc
+ CCC ?= g++
+ ifeq ($(CPU),powerpc)
+ CFLAGS += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ else
+ CFLAGS += -pipe -fPIC -ffast-math -march=pentium-m -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ endif
+# REL_CFLAGS += -O
+# REL_CCFLAGS += -O2
+ CPPFLAGS += -D_THREAD_SAFE
+ NAN_DEPEND = true
OPENGL_HEADERS = /System/Library/Frameworks/OpenGL.framework
AR = ar
ARFLAGS = ruv
@@ -93,28 +91,28 @@ ifeq ($(OS),darwin)
endif
ifeq ($(OS),freebsd)
- CC = gcc
- CCC = g++
+ CC ?= gcc
+ CCC ?= g++
JAVAC = javac
JAVAH = javah
- CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- REL_CFLAGS += -O2
- REL_CCFLAGS += -O2
- CPPFLAGS += -D_THREAD_SAFE
- NAN_DEPEND = true
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ REL_CFLAGS += -O2
+ REL_CCFLAGS += -O2
+ CPPFLAGS += -D_THREAD_SAFE
+ NAN_DEPEND = true
OPENGL_HEADERS = /usr/X11R6/include
JAVA_HEADERS = /usr/local/jdk1.3.1/include
JAVA_SYSTEM_HEADERS = /usr/local/jdk1.3.1/include/freebsd
- AR = ar
+ AR = ar
ARFLAGS = ruv
ARFLAGSQUIET = ru
endif
ifeq ($(OS),irix)
ifeq ($(IRIX_USE_GCC),true)
- CC = gcc
- CCC = g++
+ CC ?= gcc
+ CCC ?= g++
CFLAGS += -fPIC -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
CCFLAGS += -fPIC -fpermissive -funsigned-char -fno-strict-aliasing -mabi=n32 -mips4
REL_CFLAGS += -O2
@@ -123,16 +121,16 @@ ifeq ($(OS),irix)
DBG_CFLAGS += -g3 -gdwarf-2 -ggdb
DBG_CCFLAGS += -g3 -gdwarf-2 -ggdb
else
- CC = cc
- CCC = CC
- CFLAGS += -n32 -mips3 -Xcpluscomm
- CCFLAGS += -n32 -mips3 -Xcpluscomm -LANG:std
+ CC ?= cc
+ CCC ?= CC
+ CFLAGS += -n32 -mips3 -Xcpluscomm
+ CCFLAGS += -n32 -mips3 -Xcpluscomm -LANG:std
ifdef MIPS73_ISOHEADERS
- CCFLAGS += -LANG:libc_in_namespace_std=off -I$(MIPS73_ISOHEADERS)
+ CCFLAGS += -LANG:libc_in_namespace_std=off -I$(MIPS73_ISOHEADERS)
else
- CCFLAGS += -LANG:libc_in_namespace_std=off
+ CCFLAGS += -LANG:libc_in_namespace_std=off
endif
- REL_CFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
+ REL_CFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
REL_CCFLAGS += -n32 -mips3 -O2 -OPT:Olimit=0
endif
OPENGL_HEADERS = /usr/include
@@ -143,14 +141,14 @@ ifeq ($(OS),irix)
endif
ifeq ($(OS),linux)
- CC = gcc
- CCC = g++
-# CFLAGS += -pipe
- CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
-# CCFLAGS += -pipe
- REL_CFLAGS += -O2
- REL_CCFLAGS += -O2
+ CC ?= gcc
+ CCC ?= g++
+# CFLAGS += -pipe
+# CCFLAGS += -pipe
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ REL_CFLAGS += -O2
+ REL_CCFLAGS += -O2
NAN_DEPEND = true
ifeq ($(CPU),alpha)
CFLAGS += -mieee
@@ -162,11 +160,11 @@ ifeq ($(OS),linux)
endif
ifeq ($(OS),openbsd)
- CC = gcc
- CCC = g++
- CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- REL_CFLAGS += -O2
+ CC ?= gcc
+ CCC ?= g++
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ REL_CFLAGS += -O2
REL_CCFLAGS += -O2
NAN_DEPEND = true
CPPFLAGS += -D__FreeBSD__
@@ -179,30 +177,30 @@ endif
ifeq ($(OS),solaris)
# Adding gcc flag to $CC is not good, however if its not there makesdna wont build - Campbell
ifeq (x86_64, $(findstring x86_64, $(CPU)))
- CC = gcc -m64
- CCC = g++ -m64
+ CC ?= gcc -m64
+ CCC ?= g++ -m64
else
- CC = gcc
- CCC = g++
- #CC = cc
- #CCC = CC
+ CC ?= gcc
+ CCC ?= g++
+ #CC ?= cc
+ #CCC ?= CC
endif
JAVAC = javac
JAVAH = javah
- CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
- CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
-# CFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -KPIC -DPIC -xchar=unsigned"
-# CCFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -xlibmopt -features=tmplife -norunpath -KPIC -DPIC -xchar=unsigned"
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+# CFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -KPIC -DPIC -xchar=unsigned"
+# CCFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -xlibmopt -features=tmplife -norunpath -KPIC -DPIC -xchar=unsigned"
# Note, you might still want to compile a 32 bit binary if you have a 64bit system. if so remove the following lines
# ifeq ($(findstring 64,$(CPU)), 64)
-# CFLAGS += -m64
-# CCFLAGS += -m64
+# CFLAGS += -m64
+# CCFLAGS += -m64
# endif
- REL_CFLAGS += -O2
- REL_CCFLAGS += -O2
+ REL_CFLAGS += -O2
+ REL_CCFLAGS += -O2
NAN_DEPEND = true
# ifeq ($(CPU),sparc)
@@ -213,7 +211,7 @@ ifeq ($(OS),solaris)
JAVA_SYSTEM_HEADERS = /usr/java/include/solaris
else
# OPENGL_HEADERS = /usr/X11/include/mesa
- OPENGL_HEADERS = /usr/X11/include/
+ OPENGL_HEADERS = /usr/X11/include/
endif
AR = ar
ARFLAGS = ruv
@@ -222,8 +220,8 @@ endif
ifeq ($(OS),windows)
ifeq ($(FREE_WINDOWS),true)
- CC = gcc
- CCC = g++
+ CC ?= gcc
+ CCC ?= g++
CFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
CCFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
CPPFLAGS += -DFREE_WINDOWS
@@ -235,16 +233,16 @@ ifeq ($(OS),windows)
AR = ar
ARFLAGS = ruv
ARFLAGSQUIET = ru
- WINRC = $(wildcard *.rc)
+ WINRC = $(wildcard *.rc)
RANLIB = ranlib
else
- CC = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
- CCC = $(SRCHOME)/tools/cygwin/cl_wrapper.pl
+ CC ?= $(SRCHOME)/tools/cygwin/cl_wrapper.pl
+ CCC ?= $(SRCHOME)/tools/cygwin/cl_wrapper.pl
JAVAC = $(SRCHOME)/tools/cygwin/java_wrapper.pl -c
JAVAH = $(SRCHOME)/tools/cygwin/java_wrapper.pl -h
- REL_CFLAGS += /O2
+ REL_CFLAGS += /O2
REL_CCFLAGS += /O2 -GX
- DBG_CFLAGS += /Fd$(DIR)/debug/
+ DBG_CFLAGS += /Fd$(DIR)/debug/
DBG_CCFLAGS += /Fd$(DIR)/debug/
CFLAGS += /MT
CCFLAGS += /MT
diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk
index 91f90525c1e..6d4a7139d5b 100644
--- a/source/nan_definitions.mk
+++ b/source/nan_definitions.mk
@@ -81,24 +81,15 @@ ifndef CONFIG_GUESS
endif
export NAN_MOTO ?= $(LCGDIR)/moto
-ifeq ($(FREE_WINDOWS), true)
- export NAN_SOLID ?= $(LCGDIR)/gcc/solid
- export NAN_QHULL ?= $(LCGDIR)/gcc/qhull
-else
- export NAN_SOLID ?= $(LCGDIR)/solid
- export NAN_QHULL ?= $(LCGDIR)/qhull
-endif
export BF_PROFILE ?= false
export NAN_USE_BULLET ?= true
export NAN_BULLET2 ?= $(LCGDIR)/bullet2
- export NAN_FUZZICS ?= $(SRCHOME)/gameengine/Physics/Sumo/Fuzzics
- export NAN_BLENKEY ?= $(LCGDIR)/blenkey
export NAN_DECIMATION ?= $(LCGDIR)/decimation
export NAN_GUARDEDALLOC ?= $(LCGDIR)/guardedalloc
export NAN_IKSOLVER ?= $(LCGDIR)/iksolver
export NAN_BSP ?= $(LCGDIR)/bsp
export NAN_BOOLOP ?= $(LCGDIR)/boolop
- export NAN_SOUNDSYSTEM ?= $(LCGDIR)/SoundSystem
+ export NAN_AUDASPACE ?= $(LCGDIR)/audaspace
export NAN_STRING ?= $(LCGDIR)/string
export NAN_MEMUTIL ?= $(LCGDIR)/memutil
export NAN_CONTAINER ?= $(LCGDIR)/container
@@ -107,6 +98,7 @@ endif
export NAN_TEST_VERBOSITY ?= 1
export NAN_OPENNL ?= $(LCGDIR)/opennl
export NAN_ELBEEM ?= $(LCGDIR)/elbeem
+ export NAN_SMOKE ?= $(LCGDIR)/smoke
export NAN_SUPERLU ?= $(LCGDIR)/superlu
export NAN_GLEW ?= $(LCGDIR)/glew
ifeq ($(FREE_WINDOWS), true)
@@ -121,39 +113,69 @@ endif
export WITH_OPENEXR ?= true
export WITH_DDS ?= true
export WITH_OPENJPEG ?= true
+ export WITH_LZO ?= true
+ export WITH_LZMA ?= true
+ export NAN_LZO ?= $(LCGDIR)/lzo
+ export NAN_LZMA ?= $(LCGDIR)/lzma
+ export WITH_OPENAL ?= false
+ export WITH_JACK ?= false
+ export WITH_SNDFILE ?= false
+
+ ifeq ($(WITH_OPENAL), true)
+ export NAN_OPENAL ?= /usr
+ endif
+ ifeq ($(WITH_JACK), true)
+ export NAN_JACK ?= /usr
+ export NAN_JACKCFLAGS ?= -I$(NAN_JACK)/include/jack
+ export NAN_JACKLIBS ?= $(NAN_JACK)/lib/libjack.a
+ endif
+
+ ifeq ($(WITH_SNDFILE),true)
+ export NAN_SNDFILE ?= /usr
+ export NAN_SNDFILECFLAGS ?= -I$(NAN_SNDFILE)/include
+ export NAN_SNDFILELIBS ?= $(NAN_SNDFILE)/lib/libsndfile.a $(NAN_SNDFILE)/lib/libFLAC.a $(NAN_SNDFILE)/lib/libogg.a
+ endif
ifeq ($(NAN_USE_FFMPEG_CONFIG), true)
- export NAN_FFMPEG ?= $(shell ffmpeg-config --prefix)
- export NAN_FFMPEGLIBS ?= $(shell ffmpeg-config --libs avformat avcodec)
- export NAN_FFMPEGCFLAGS ?= $(shell ffmpeg-config --cflags)
+ export NAN_FFMPEG = $(shell pkg-config --variable=prefix libavcodec) # Assume they are all in the same prefix
+ export NAN_FFMPEGLIBS = $(shell pkg-config --libs libavcodec libavdevice libavformat libswscale libavutil)
+ export NAN_FFMPEGCFLAGS = $(shell pkg-config --cflags libavcodec libavdevice libavformat libswscale libavutil)
endif
+ # Compare recreated .mo files with committed ones
+ export BF_VERIFY_MO_FILES ?= true
+
# Platform Dependent settings go below:
ifeq ($(OS),darwin)
export ID = $(shell whoami)
export HOST = $(shell hostname -s)
- export PY_FRAMEWORK ?= 1
+ export NAN_PYTHON_VERSION = 3.1
- ifdef PY_FRAMEWORK
- export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.3
- export NAN_PYTHON_VERSION ?= 2.3
- export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
- export NAN_PYTHON_LIB ?= -framework Python
+ ifeq ($(NAN_PYTHON_VERSION),3.1)
+ export PY_FRAMEWORK ?= 0
+ export NAN_PYTHON ?= $(LCGDIR)/python
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/libpython$(NAN_PYTHON_VERSION).a
else
- export NAN_PYTHON ?= /sw
- export NAN_PYTHON_VERSION ?= 2.3
- export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
- export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+ export PY_FRAMEWORK ?= 1
+ ifdef PY_FRAMEWORK
+ export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.5
+ export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= -framework Python
+ else
+ export NAN_PYTHON ?= /sw
+ export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
+ export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+ endif
endif
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= $(LCGDIR)/tiff
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_ZLIB ?= $(LCGDIR)/zlib
@@ -170,20 +192,14 @@ endif
export NAN_OPENEXR ?= $(LCGDIR)/openexr
export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
- ifeq ($(CPU),powerpc)
- export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a
- else
- export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
- endif
-
- # export NAN_NO_KETSJI=true
+ export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
+
+ export NAN_NO_KETSJI=false
ifeq ($(CPU), i386)
- export NAN_NO_OPENAL=true
+ export WITH_OPENAL=false
endif
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -200,6 +216,9 @@ endif
# enable l10n
export INTERNATIONAL ?= true
+ export NAN_SAMPLERATE ?= $(LCGDIR)/samplerate
+ export NAN_SAMPLERATE_LIBS ?= $(NAN_SAMPLERATE)/lib/libsamplerate.a
+
else
ifeq ($(OS),freebsd)
@@ -208,14 +227,13 @@ endif
export FREEDESKTOP ?= true
export NAN_PYTHON ?= /usr/local
- export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= /usr/local
export NAN_JPEG ?= /usr/local
export NAN_PNG ?= /usr/local
export NAN_TIFF ?= /usr/local
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_ZLIB ?= /usr
@@ -226,8 +244,6 @@ endif
export NAN_SDLLIBS ?= $(shell sdl-config --libs)
export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags)
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -248,7 +264,7 @@ endif
export HOST = $(shell /usr/bsd/hostname -s)
#export NAN_NO_KETSJI=true
export NAN_JUST_BLENDERDYNAMIC=true
- export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_VERSION ?= 3.1
ifeq ($(IRIX_USE_GCC), true)
export NAN_PYTHON ?= $(LCGDIR)/python_gcc
else
@@ -260,7 +276,6 @@ endif
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= $(LCGDIR)/tiff
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_ZLIB ?= $(LCGDIR)/zlib
@@ -284,8 +299,6 @@ endif
export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -299,6 +312,9 @@ endif
# enable l10n
export INTERNATIONAL ?= true
+ # Different endianess will make it fail, rely on other plataforms for checks
+ export BF_VERIFY_MO_FILES = false
+
else
ifeq ($(OS),linux)
@@ -307,14 +323,14 @@ endif
export FREEDESKTOP ?= true
export NAN_PYTHON ?= /usr
- export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
- export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
+ # Next line if for static python, nan_link.mk uses -lpython$(NAN_PYTHON_VERSION)
+ #export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= /usr
export NAN_JPEG ?= /usr
export NAN_PNG ?= /usr
export NAN_TIFF ?= /usr
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr
export NAN_ZLIB ?= /usr
@@ -324,12 +340,7 @@ endif
export NAN_SDL ?= $(shell sdl-config --prefix)
export NAN_SDLLIBS ?= $(shell sdl-config --libs)
export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags)
-
-ifneq ($(NAN_USE_FFMPEG_CONFIG), true)
- export NAN_FFMPEG ?= /usr
- export NAN_FFMPEGLIBS ?= -L$(NAN_FFMPEG)/lib -lavformat -lavcodec -lavutil -lswscale -lavdevice -ldts -lz
- export NAN_FFMPEGCFLAGS ?= -I$(NAN_FFMPEG)/include
-endif
+ export NAN_SAMPLERATE ?= /usr
ifeq ($(WITH_OPENEXR), true)
export NAN_OPENEXR ?= $(shell pkg-config --variable=prefix OpenEXR )
@@ -338,7 +349,7 @@ endif
endif
# Uncomment the following line to use Mozilla inplace of netscape
- export CPPFLAGS += -DMOZ_NOT_NET
+
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= /usr/include/mozilla
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -367,14 +378,13 @@ endif
export FREEDESKTOP ?= true
export NAN_PYTHON ?= $(LCGDIR)/python
- export NAN_PYTHON_VERSION ?= 2.3
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= $(LCGDIR)/tiff
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_ZLIB ?= $(LCGDIR)/zlib
@@ -385,8 +395,6 @@ endif
export NAN_SDLLIBS ?= $(shell sdl-config --libs)
export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags)
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -406,14 +414,13 @@ endif
export ID = $(shell /usr/ucb/whoami)
export HOST = $(shell hostname)
export NAN_PYTHON ?= $(LCGDIR)/python
- export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= /usr
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?=
export NAN_MESA ?= /usr/X11
export NAN_ZLIB ?= $(LCGDIR)/zlib
@@ -430,8 +437,6 @@ endif
export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a -lrt
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -451,7 +456,7 @@ endif
export ID = $(LOGNAME)
export NAN_PYTHON ?= $(LCGDIR)/python
export NAN_ICONV ?= $(LCGDIR)/iconv
- export NAN_PYTHON_VERSION ?= 2.5
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_OPENAL ?= $(LCGDIR)/openal
export NAN_JPEG ?= $(LCGDIR)/jpeg
export NAN_PNG ?= $(LCGDIR)/png
@@ -466,7 +471,6 @@ endif
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/lib25_vs2005/libpython25.a
export NAN_FREETYPE ?= $(LCGDIR)/gcc/freetype
- export NAN_ODE ?= $(LCGDIR)/gcc/ode
export NAN_SDL ?= $(LCGDIR)/gcc/sdl
export NAN_OPENEXR ?= $(LCGDIR)/gcc/openexr
export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
@@ -477,7 +481,6 @@ endif
export NAN_PYTHON_BINARY ?= python
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python23.lib
export NAN_FREETYPE ?= $(LCGDIR)/freetype
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_SDL ?= $(LCGDIR)/sdl
export NAN_OPENEXR ?= $(LCGDIR)/openexr
export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/IlmImf -I$(NAN_OPENEXR)/include/Imath -I$(NAN_OPENEXR)/include/Iex
@@ -486,8 +489,7 @@ endif
export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include
export NAN_WINTAB ?= $(LCGDIR)/wintab
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
+
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -507,7 +509,7 @@ endif
else # Platform not listed above
export NAN_PYTHON ?= $(LCGDIR)/python
- export NAN_PYTHON_VERSION ?= 2.3
+ export NAN_PYTHON_VERSION ?= 3.1
export NAN_PYTHON_BINARY ?= python
export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a
@@ -516,7 +518,6 @@ endif
export NAN_PNG ?= $(LCGDIR)/png
export NAN_TIFF ?= $(LCGDIR)/tiff
export NAN_SDL ?= $(LCGDIR)/sdl
- export NAN_ODE ?= $(LCGDIR)/ode
export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay
export NAN_MESA ?= /usr/src/Mesa-3.1
export NAN_ZLIB ?= $(LCGDIR)/zlib
@@ -527,8 +528,6 @@ endif
export NAN_SDLLIBS ?= $(shell sdl-config --libs)
export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags)
- # Uncomment the following line to use Mozilla inplace of netscape
- # CPPFLAGS +=-DMOZ_NOT_NET
# Location of MOZILLA/Netscape header files...
export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include
export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/
@@ -555,5 +554,4 @@ endif # CONFIG_GUESS
# Don't want to build the gameengine?
ifeq ($(NAN_NO_KETSJI), true)
export NAN_JUST_BLENDERDYNAMIC=true
- export NAN_NO_OPENAL=true
endif
diff --git a/source/nan_link.mk b/source/nan_link.mk
index 63c9a578498..52e5c5de9ed 100644
--- a/source/nan_link.mk
+++ b/source/nan_link.mk
@@ -36,7 +36,7 @@ ifdef NAN_DEBUG
LDFLAGS += $(NAN_DEBUG)
endif
-DBG_LDFLAGS += -g
+DBG_LDFLAGS += -g
ifneq (x$(DEBUG_DIR), x)
LDFLAGS+=$(DBG_LDFLAGS)
@@ -97,7 +97,7 @@ ifeq ($(OS),linux)
COMMENT = "MESA 3.1"
LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXmu -lXext -lX11 -lXi
LLIBS += -lutil -lc -lm -ldl -lpthread
-# LLIBS += -L$(NAN_ODE)/lib -lode
+ LLIBS += -L$(NAN_PYTHON)/lib -Wl,-rpath -Wl,$(NAN_PYTHON)/lib -lpython$(NAN_PYTHON_VERSION)
LOPTS = -export-dynamic
DADD = -lGL -lGLU
SADD = $(NAN_MESA)/lib/libGL.a $(NAN_MESA)/lib/libGLU.a
@@ -126,28 +126,28 @@ endif
ifeq ($(OS),windows)
EXT = .exe
- SOEXT = .dll
- ifeq ($(FREE_WINDOWS),true)
- MINGWLIB = /usr/lib/w32api
- LDFLAGS += -mwindows -mno-cygwin -mconsole
- DADD += -L/usr/lib/w32api -lnetapi32 -lopengl32 -lglu32 -lshfolder
- DADD += -L/usr/lib/w32api -lwinmm -lwsock32
+ SOEXT = .dll
+ ifeq ($(FREE_WINDOWS),true)
+ MINGWLIB = /usr/lib/w32api
+ LDFLAGS += -mwindows -mno-cygwin -mconsole
+ DADD += -L/usr/lib/w32api -lnetapi32 -lopengl32 -lglu32 -lshfolder
+ DADD += -L/usr/lib/w32api -lwinmm -lwsock32
else
- DADD = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
- DADD += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
- DADD += vfw32.lib winmm.lib opengl32.lib glu32.lib largeint.lib dxguid.lib
- DADD += libcmt.lib
- LOPTS = /link
- LOPTS += /NODEFAULTLIB:"libc"
- LOPTS += /NODEFAULTLIB:"libcd"
- LOPTS += /NODEFAULTLIB:"libcp"
- LOPTS += /NODEFAULTLIB:"libcpd"
- LOPTS += /NODEFAULTLIB:"python20"
- LOPTS += /NODEFAULTLIB:"msvcrt"
- LOPTS += /SUBSYSTEM:CONSOLE
- LDFLAGS += /MT
- DYNLDFLAGS = /LD
- endif
+ DADD = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
+ DADD += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
+ DADD += vfw32.lib winmm.lib opengl32.lib glu32.lib largeint.lib dxguid.lib
+ DADD += libcmt.lib
+ LOPTS = /link
+ LOPTS += /NODEFAULTLIB:"libc"
+ LOPTS += /NODEFAULTLIB:"libcd"
+ LOPTS += /NODEFAULTLIB:"libcp"
+ LOPTS += /NODEFAULTLIB:"libcpd"
+ LOPTS += /NODEFAULTLIB:"python20"
+ LOPTS += /NODEFAULTLIB:"msvcrt"
+ LOPTS += /SUBSYSTEM:CONSOLE
+ LDFLAGS += /MT
+ DYNLDFLAGS = /LD
+ endif
endif
ifneq ($(OS), irix)
diff --git a/source/nan_warn.mk b/source/nan_warn.mk
index 5841cdf5908..0dd4e0b8147 100644
--- a/source/nan_warn.mk
+++ b/source/nan_warn.mk
@@ -34,34 +34,33 @@
#
# Force the correct redefinition
-LEVEL_1_C_WARNINGS = -FIX_NAN_WARN
-LEVEL_1_CPP_WARNINGS = -FIX_NAN_WARN
-LEVEL_2_C_WARNINGS = -FIX_NAN_WARN
-LEVEL_2_CPP_WARNINGS = -FIX_NAN_WARN
-FIX_STUBS_WARNINGS = -FIX_NAN_WARN
+LEVEL_1_C_WARNINGS = -FIX_NAN_WARN1A
+LEVEL_1_CPP_WARNINGS = -FIX_NAN_WARN1B
+LEVEL_2_C_WARNINGS = -FIX_NAN_WARN2A
+LEVEL_2_CPP_WARNINGS = -FIX_NAN_WARN2B
+FIX_STUBS_WARNINGS = -FIX_NAN_WARN3
########################################################################
# Level 1: basic C warnings.
-ifeq ($(CC),gcc)
+ifeq (gcc, $(findstring gcc,$(CC)))
LEVEL_1_C_WARNINGS = -Wall
LEVEL_1_C_WARNINGS += -Wno-char-subscripts
else
- ifeq ($(CC),cc)
+ ifeq (cc, $(findstring cc,$(CC)))
ifeq ($(OS),irix)
# MIPSpro Compilers
#
# Irix warning info
#
- # 1001 # the source file does not end w/ a newline
- # 1110 # unreachable statement
- # 1201 # trailing comma in enums is nonstandard
- # 1209 # constant controlling expressions
- # 1355 # extra semicolon is ignored
- # 1424 # unreferenced template paramaters
- # 1681 # virtual function override
- # 3201 # unreferenced formal paramaters
+ # 1001 # the source file does not end w/ a newline
+ # 1110 # unreachable statement
+ # 1201 # trailing comma in enums is nonstandard
+ # 1209 # constant controlling expressions
+ # 1355 # extra semicolon is ignored
+ # 1424 # unreferenced template paramaters
+ # 1681 # virtual function override
+ # 3201 # unreferenced formal paramaters
#
-
LEVEL_1_C_WARNINGS = -fullwarn -woff 1001,1110,1201,1209,1355,1424,1681,3201
endif
endif
@@ -72,14 +71,14 @@ else
endif
# Level 1: basic CPP warnings.
-ifeq ($(CCC),g++)
+ifeq (g++, $(findstring g++,$(CCC)))
LEVEL_1_CPP_WARNINGS = -Wall
LEVEL_1_CPP_WARNINGS += -Wno-reorder
else
- ifeq ($(CCC),CC)
+ ifeq (CC, $(findstring CC,$(CCC)))
ifeq ($(OS),irix)
# MIPSpro Compilers
- # see warning descriptions above
+ # see warning descriptions above
LEVEL_1_CPP_WARNINGS = -woff 1001,1110,1201,1209,1355,1424,1681,3201
endif
endif
@@ -92,7 +91,7 @@ endif
########################################################################
# Level 2: paranoia level C warnings.
# DO NOT REUSE LEVEL_1_ DEFINES.
-ifeq ($(CC),gcc)
+ifeq (gcc, $(findstring gcc,$(CC)))
LEVEL_2_C_WARNINGS = -Wall
LEVEL_2_C_WARNINGS += -W
# deliberately enable char-subscript warnings
@@ -108,10 +107,10 @@ ifeq ($(CC),gcc)
LEVEL_2_C_WARNINGS += -Wnested-externs
LEVEL_2_C_WARNINGS += -Wredundant-decls
else
- ifeq ($(CC),cc)
+ ifeq (cc, $(findstring cc,$(CC)))
ifeq ($(OS),irix)
# MIPSpro Compilers
- # see warning descriptions above
+ # see warning descriptions above
LEVEL_2_C_WARNINGS = -fullwarn -woff 1001,1209,1424,3201
endif
ifeq ($(OS),solaris)
@@ -127,7 +126,7 @@ endif
# Level 2: paranoia level CPP warnings.
# DO NOT REUSE LEVEL_1_ DEFINES.
-ifeq ($(CCC),g++)
+ifeq (g++, $(findstring g++,$(CCC)))
LEVEL_2_CPP_WARNINGS = -Wall
LEVEL_2_CPP_WARNINGS += -W
# deliberately enable char-subscript warnings
@@ -145,10 +144,10 @@ ifeq ($(CCC),g++)
LEVEL_2_CPP_WARNINGS += -Wsign-promo
LEVEL_2_CPP_WARNINGS += -Wsynth
else
- ifeq ($(CCC),CC)
+ ifeq (CC, $(findstring CC,$(CCC)))
ifeq ($(OS),irix)
# MIPSpro Compilers
- # see warning descriptions above
+ # see warning descriptions above
LEVEL_2_CPP_WARNINGS = -fullwarn -woff 1209,1424,3201
endif
endif
@@ -160,7 +159,7 @@ endif
########################################################################
# stubs warning fix
-ifeq ($(CC),gcc)
+ifeq (gcc, $(findstring gcc,$(CC)))
FIX_STUBS_WARNINGS = -Wno-unused
else
FIX_STUBS_WARNINGS =